]> git.zerfleddert.de Git - micropolis/commitdiff
Import Micropolis from http://www.donhopkins.com/home/micropolis/
authorMichael Gernoth <michael@gernoth.net>
Sun, 13 Jan 2008 02:06:11 +0000 (03:06 +0100)
committerMichael Gernoth <michael@gernoth.net>
Sun, 13 Jan 2008 02:06:11 +0000 (03:06 +0100)
956 files changed:
COPYING [new file with mode: 0644]
Micropolis [new file with mode: 0755]
Micropolis.png [new file with mode: 0644]
README [new file with mode: 0644]
__init__.py [new file with mode: 0644]
activity/activity-micropolis.svg [new file with mode: 0644]
activity/activity.info [new file with mode: 0644]
cities/about.cty [new file with mode: 0644]
cities/badnews.cty [new file with mode: 0644]
cities/bluebird.cty [new file with mode: 0644]
cities/bruce.cty [new file with mode: 0644]
cities/deadwood.cty [new file with mode: 0644]
cities/finnigan.cty [new file with mode: 0644]
cities/freds.cty [new file with mode: 0644]
cities/haight.cty [new file with mode: 0644]
cities/happisle.cty [new file with mode: 0644]
cities/joffburg.cty [new file with mode: 0644]
cities/kamakura.cty [new file with mode: 0644]
cities/kobe.cty [new file with mode: 0644]
cities/kowloon.cty [new file with mode: 0644]
cities/kyoto.cty [new file with mode: 0644]
cities/linecity.cty [new file with mode: 0644]
cities/med_isle.cty [new file with mode: 0644]
cities/ndulls.cty [new file with mode: 0644]
cities/neatmap.cty [new file with mode: 0644]
cities/radial.cty [new file with mode: 0644]
cities/senri.cty [new file with mode: 0644]
cities/southpac.cty [new file with mode: 0644]
cities/splats.cty [new file with mode: 0644]
cities/wetcity.cty [new file with mode: 0644]
cities/yokohama.cty [new file with mode: 0644]
images/airport.xpm [new file with mode: 0644]
images/background-micropolis.xpm [new file with mode: 0644]
images/button1hilite.xpm [new file with mode: 0644]
images/button2hilite.xpm [new file with mode: 0644]
images/button3hilite.xpm [new file with mode: 0644]
images/button4hilite.xpm [new file with mode: 0644]
images/checkbox1checked.xpm [new file with mode: 0644]
images/checkbox1hilite.xpm [new file with mode: 0644]
images/checkbox1hilitechecked.xpm [new file with mode: 0644]
images/checkbox2checked.xpm [new file with mode: 0644]
images/checkbox2hilite.xpm [new file with mode: 0644]
images/checkbox2hilitechecked.xpm [new file with mode: 0644]
images/checkbox3checked.xpm [new file with mode: 0644]
images/checkbox3hilite.xpm [new file with mode: 0644]
images/checkbox3hilitechecked.xpm [new file with mode: 0644]
images/coal.xpm [new file with mode: 0644]
images/com.xpm [new file with mode: 0644]
images/demandg.xpm [new file with mode: 0644]
images/fire.xpm [new file with mode: 0644]
images/gr10.xpm [new file with mode: 0644]
images/gr10hi.xpm [new file with mode: 0644]
images/gr120.xpm [new file with mode: 0644]
images/gr120hi.xpm [new file with mode: 0644]
images/grcom.xpm [new file with mode: 0644]
images/grcomhi.xpm [new file with mode: 0644]
images/grcrim.xpm [new file with mode: 0644]
images/grcrimhi.xpm [new file with mode: 0644]
images/grind.xpm [new file with mode: 0644]
images/grindhi.xpm [new file with mode: 0644]
images/grmony.xpm [new file with mode: 0644]
images/grmonyhi.xpm [new file with mode: 0644]
images/grpoll.xpm [new file with mode: 0644]
images/grpollhi.xpm [new file with mode: 0644]
images/grres.xpm [new file with mode: 0644]
images/grreshi.xpm [new file with mode: 0644]
images/icairp.xpm [new file with mode: 0644]
images/icairphi.xpm [new file with mode: 0644]
images/icchlk.xpm [new file with mode: 0644]
images/icchlkhi.xpm [new file with mode: 0644]
images/iccoal.xpm [new file with mode: 0644]
images/iccoalhi.xpm [new file with mode: 0644]
images/iccom.xpm [new file with mode: 0644]
images/iccomhi.xpm [new file with mode: 0644]
images/icdozr.xpm [new file with mode: 0644]
images/icdozrhi.xpm [new file with mode: 0644]
images/icersr.xpm [new file with mode: 0644]
images/icersrhi.xpm [new file with mode: 0644]
images/icfire.xpm [new file with mode: 0644]
images/icfirehi.xpm [new file with mode: 0644]
images/icind.xpm [new file with mode: 0644]
images/icindhi.xpm [new file with mode: 0644]
images/icnuc.xpm [new file with mode: 0644]
images/icnuchi.xpm [new file with mode: 0644]
images/icpark.xpm [new file with mode: 0644]
images/icparkhi.xpm [new file with mode: 0644]
images/icpol.xpm [new file with mode: 0644]
images/icpolhi.xpm [new file with mode: 0644]
images/icqry.xpm [new file with mode: 0644]
images/icqryhi.xpm [new file with mode: 0644]
images/icrail.xpm [new file with mode: 0644]
images/icrailhi.xpm [new file with mode: 0644]
images/icres.xpm [new file with mode: 0644]
images/icreshi.xpm [new file with mode: 0644]
images/icroad.xpm [new file with mode: 0644]
images/icroadhi.xpm [new file with mode: 0644]
images/icseap.xpm [new file with mode: 0644]
images/icseaphi.xpm [new file with mode: 0644]
images/icstad.xpm [new file with mode: 0644]
images/icstadhi.xpm [new file with mode: 0644]
images/icwire.xpm [new file with mode: 0644]
images/icwirehi.xpm [new file with mode: 0644]
images/ind.xpm [new file with mode: 0644]
images/key.xpm [new file with mode: 0644]
images/key2city.xpm [new file with mode: 0644]
images/leftdisabled.xpm [new file with mode: 0644]
images/lefthilite.xpm [new file with mode: 0644]
images/legendmm.xpm [new file with mode: 0644]
images/legendn.xpm [new file with mode: 0644]
images/legendpm.xpm [new file with mode: 0644]
images/maphilite.xpm [new file with mode: 0644]
images/micropolisg.xpm [new file with mode: 0644]
images/micropolism.xpm [new file with mode: 0644]
images/micropoliss.xpm [new file with mode: 0644]
images/nuclear.xpm [new file with mode: 0644]
images/obj1-0.xpm [new file with mode: 0644]
images/obj1-1.xpm [new file with mode: 0644]
images/obj1-2.xpm [new file with mode: 0644]
images/obj1-3.xpm [new file with mode: 0644]
images/obj1-4.xpm [new file with mode: 0644]
images/obj2-0.xpm [new file with mode: 0644]
images/obj2-1.xpm [new file with mode: 0644]
images/obj2-2.xpm [new file with mode: 0644]
images/obj2-3.xpm [new file with mode: 0644]
images/obj2-4.xpm [new file with mode: 0644]
images/obj2-5.xpm [new file with mode: 0644]
images/obj2-6.xpm [new file with mode: 0644]
images/obj2-7.xpm [new file with mode: 0644]
images/obj3-0.xpm [new file with mode: 0644]
images/obj3-1.xpm [new file with mode: 0644]
images/obj3-10.xpm [new file with mode: 0644]
images/obj3-2.xpm [new file with mode: 0644]
images/obj3-3.xpm [new file with mode: 0644]
images/obj3-4.xpm [new file with mode: 0644]
images/obj3-5.xpm [new file with mode: 0644]
images/obj3-6.xpm [new file with mode: 0644]
images/obj3-7.xpm [new file with mode: 0644]
images/obj3-8.xpm [new file with mode: 0644]
images/obj3-9.xpm [new file with mode: 0644]
images/obj4-0.xpm [new file with mode: 0644]
images/obj4-1.xpm [new file with mode: 0644]
images/obj4-2.xpm [new file with mode: 0644]
images/obj4-3.xpm [new file with mode: 0644]
images/obj4-4.xpm [new file with mode: 0644]
images/obj4-5.xpm [new file with mode: 0644]
images/obj4-6.xpm [new file with mode: 0644]
images/obj4-7.xpm [new file with mode: 0644]
images/obj5-0.xpm [new file with mode: 0644]
images/obj5-1.xpm [new file with mode: 0644]
images/obj5-10.xpm [new file with mode: 0644]
images/obj5-11.xpm [new file with mode: 0644]
images/obj5-12.xpm [new file with mode: 0644]
images/obj5-13.xpm [new file with mode: 0644]
images/obj5-14.xpm [new file with mode: 0644]
images/obj5-15.xpm [new file with mode: 0644]
images/obj5-2.xpm [new file with mode: 0644]
images/obj5-3.xpm [new file with mode: 0644]
images/obj5-4.xpm [new file with mode: 0644]
images/obj5-5.xpm [new file with mode: 0644]
images/obj5-6.xpm [new file with mode: 0644]
images/obj5-7.xpm [new file with mode: 0644]
images/obj5-8.xpm [new file with mode: 0644]
images/obj5-9.xpm [new file with mode: 0644]
images/obj6-0.xpm [new file with mode: 0644]
images/obj6-1.xpm [new file with mode: 0644]
images/obj6-2.xpm [new file with mode: 0644]
images/obj7-0.xpm [new file with mode: 0644]
images/obj7-1.xpm [new file with mode: 0644]
images/obj7-2.xpm [new file with mode: 0644]
images/obj7-3.xpm [new file with mode: 0644]
images/obj7-4.xpm [new file with mode: 0644]
images/obj7-5.xpm [new file with mode: 0644]
images/obj8-0.xpm [new file with mode: 0644]
images/obj8-1.xpm [new file with mode: 0644]
images/obj8-2.xpm [new file with mode: 0644]
images/obj8-3.xpm [new file with mode: 0644]
images/playhilite.xpm [new file with mode: 0644]
images/police.xpm [new file with mode: 0644]
images/res.xpm [new file with mode: 0644]
images/rightdisabled.xpm [new file with mode: 0644]
images/righthilite.xpm [new file with mode: 0644]
images/scbern.xpm [new file with mode: 0644]
images/scbernhi.xpm [new file with mode: 0644]
images/scbos.xpm [new file with mode: 0644]
images/scboshi.xpm [new file with mode: 0644]
images/scdet.xpm [new file with mode: 0644]
images/scdethi.xpm [new file with mode: 0644]
images/scdull.xpm [new file with mode: 0644]
images/scdullhi.xpm [new file with mode: 0644]
images/scenario1hilite.xpm [new file with mode: 0644]
images/scenario2hilite.xpm [new file with mode: 0644]
images/scenario3hilite.xpm [new file with mode: 0644]
images/scenario4hilite.xpm [new file with mode: 0644]
images/scenario5hilite.xpm [new file with mode: 0644]
images/scenario6hilite.xpm [new file with mode: 0644]
images/scenario7hilite.xpm [new file with mode: 0644]
images/scenario8hilite.xpm [new file with mode: 0644]
images/scham.xpm [new file with mode: 0644]
images/schamhi.xpm [new file with mode: 0644]
images/sclcty.xpm [new file with mode: 0644]
images/sclctyhi.xpm [new file with mode: 0644]
images/scncty.xpm [new file with mode: 0644]
images/scnctyhi.xpm [new file with mode: 0644]
images/scrio.xpm [new file with mode: 0644]
images/scriohi.xpm [new file with mode: 0644]
images/scsfo.xpm [new file with mode: 0644]
images/scsfohi.xpm [new file with mode: 0644]
images/sctkyo.xpm [new file with mode: 0644]
images/sctkyohi.xpm [new file with mode: 0644]
images/seaport.xpm [new file with mode: 0644]
images/spacer.xpm [new file with mode: 0644]
images/stadium.xpm [new file with mode: 0644]
images/tiles-0.xpm [new file with mode: 0644]
images/tiles-1.xpm [new file with mode: 0644]
images/tiles-10.xpm [new file with mode: 0644]
images/tiles-100.xpm [new file with mode: 0644]
images/tiles-101.xpm [new file with mode: 0644]
images/tiles-102.xpm [new file with mode: 0644]
images/tiles-103.xpm [new file with mode: 0644]
images/tiles-104.xpm [new file with mode: 0644]
images/tiles-105.xpm [new file with mode: 0644]
images/tiles-106.xpm [new file with mode: 0644]
images/tiles-107.xpm [new file with mode: 0644]
images/tiles-108.xpm [new file with mode: 0644]
images/tiles-109.xpm [new file with mode: 0644]
images/tiles-11.xpm [new file with mode: 0644]
images/tiles-110.xpm [new file with mode: 0644]
images/tiles-111.xpm [new file with mode: 0644]
images/tiles-112.xpm [new file with mode: 0644]
images/tiles-113.xpm [new file with mode: 0644]
images/tiles-114.xpm [new file with mode: 0644]
images/tiles-115.xpm [new file with mode: 0644]
images/tiles-116.xpm [new file with mode: 0644]
images/tiles-117.xpm [new file with mode: 0644]
images/tiles-118.xpm [new file with mode: 0644]
images/tiles-119.xpm [new file with mode: 0644]
images/tiles-12.xpm [new file with mode: 0644]
images/tiles-120.xpm [new file with mode: 0644]
images/tiles-121.xpm [new file with mode: 0644]
images/tiles-122.xpm [new file with mode: 0644]
images/tiles-123.xpm [new file with mode: 0644]
images/tiles-124.xpm [new file with mode: 0644]
images/tiles-125.xpm [new file with mode: 0644]
images/tiles-126.xpm [new file with mode: 0644]
images/tiles-127.xpm [new file with mode: 0644]
images/tiles-128.xpm [new file with mode: 0644]
images/tiles-129.xpm [new file with mode: 0644]
images/tiles-13.xpm [new file with mode: 0644]
images/tiles-130.xpm [new file with mode: 0644]
images/tiles-131.xpm [new file with mode: 0644]
images/tiles-132.xpm [new file with mode: 0644]
images/tiles-133.xpm [new file with mode: 0644]
images/tiles-134.xpm [new file with mode: 0644]
images/tiles-135.xpm [new file with mode: 0644]
images/tiles-136.xpm [new file with mode: 0644]
images/tiles-137.xpm [new file with mode: 0644]
images/tiles-138.xpm [new file with mode: 0644]
images/tiles-139.xpm [new file with mode: 0644]
images/tiles-14.xpm [new file with mode: 0644]
images/tiles-140.xpm [new file with mode: 0644]
images/tiles-141.xpm [new file with mode: 0644]
images/tiles-142.xpm [new file with mode: 0644]
images/tiles-143.xpm [new file with mode: 0644]
images/tiles-144.xpm [new file with mode: 0644]
images/tiles-145.xpm [new file with mode: 0644]
images/tiles-146.xpm [new file with mode: 0644]
images/tiles-147.xpm [new file with mode: 0644]
images/tiles-148.xpm [new file with mode: 0644]
images/tiles-149.xpm [new file with mode: 0644]
images/tiles-15.xpm [new file with mode: 0644]
images/tiles-150.xpm [new file with mode: 0644]
images/tiles-151.xpm [new file with mode: 0644]
images/tiles-152.xpm [new file with mode: 0644]
images/tiles-153.xpm [new file with mode: 0644]
images/tiles-154.xpm [new file with mode: 0644]
images/tiles-155.xpm [new file with mode: 0644]
images/tiles-156.xpm [new file with mode: 0644]
images/tiles-16.xpm [new file with mode: 0644]
images/tiles-17.xpm [new file with mode: 0644]
images/tiles-18.xpm [new file with mode: 0644]
images/tiles-19.xpm [new file with mode: 0644]
images/tiles-2.xpm [new file with mode: 0644]
images/tiles-20.xpm [new file with mode: 0644]
images/tiles-21.xpm [new file with mode: 0644]
images/tiles-22.xpm [new file with mode: 0644]
images/tiles-23.xpm [new file with mode: 0644]
images/tiles-24.xpm [new file with mode: 0644]
images/tiles-25.xpm [new file with mode: 0644]
images/tiles-26.xpm [new file with mode: 0644]
images/tiles-27.xpm [new file with mode: 0644]
images/tiles-28.xpm [new file with mode: 0644]
images/tiles-29.xpm [new file with mode: 0644]
images/tiles-3.xpm [new file with mode: 0644]
images/tiles-30.xpm [new file with mode: 0644]
images/tiles-31.xpm [new file with mode: 0644]
images/tiles-32.xpm [new file with mode: 0644]
images/tiles-33.xpm [new file with mode: 0644]
images/tiles-34.xpm [new file with mode: 0644]
images/tiles-35.xpm [new file with mode: 0644]
images/tiles-36.xpm [new file with mode: 0644]
images/tiles-37.xpm [new file with mode: 0644]
images/tiles-38.xpm [new file with mode: 0644]
images/tiles-39.xpm [new file with mode: 0644]
images/tiles-4.xpm [new file with mode: 0644]
images/tiles-40.xpm [new file with mode: 0644]
images/tiles-41.xpm [new file with mode: 0644]
images/tiles-42.xpm [new file with mode: 0644]
images/tiles-43.xpm [new file with mode: 0644]
images/tiles-44.xpm [new file with mode: 0644]
images/tiles-45.xpm [new file with mode: 0644]
images/tiles-46.xpm [new file with mode: 0644]
images/tiles-47.xpm [new file with mode: 0644]
images/tiles-48.xpm [new file with mode: 0644]
images/tiles-49.xpm [new file with mode: 0644]
images/tiles-5.xpm [new file with mode: 0644]
images/tiles-50.xpm [new file with mode: 0644]
images/tiles-51.xpm [new file with mode: 0644]
images/tiles-52.xpm [new file with mode: 0644]
images/tiles-53.xpm [new file with mode: 0644]
images/tiles-54.xpm [new file with mode: 0644]
images/tiles-55.xpm [new file with mode: 0644]
images/tiles-56.xpm [new file with mode: 0644]
images/tiles-57.xpm [new file with mode: 0644]
images/tiles-58.xpm [new file with mode: 0644]
images/tiles-59.xpm [new file with mode: 0644]
images/tiles-6.xpm [new file with mode: 0644]
images/tiles-60.xpm [new file with mode: 0644]
images/tiles-61.xpm [new file with mode: 0644]
images/tiles-62.xpm [new file with mode: 0644]
images/tiles-63.xpm [new file with mode: 0644]
images/tiles-64.xpm [new file with mode: 0644]
images/tiles-65.xpm [new file with mode: 0644]
images/tiles-66.xpm [new file with mode: 0644]
images/tiles-67.xpm [new file with mode: 0644]
images/tiles-68.xpm [new file with mode: 0644]
images/tiles-69.xpm [new file with mode: 0644]
images/tiles-7.xpm [new file with mode: 0644]
images/tiles-70.xpm [new file with mode: 0644]
images/tiles-71.xpm [new file with mode: 0644]
images/tiles-72.xpm [new file with mode: 0644]
images/tiles-73.xpm [new file with mode: 0644]
images/tiles-74.xpm [new file with mode: 0644]
images/tiles-75.xpm [new file with mode: 0644]
images/tiles-76.xpm [new file with mode: 0644]
images/tiles-77.xpm [new file with mode: 0644]
images/tiles-78.xpm [new file with mode: 0644]
images/tiles-79.xpm [new file with mode: 0644]
images/tiles-8.xpm [new file with mode: 0644]
images/tiles-80.xpm [new file with mode: 0644]
images/tiles-81.xpm [new file with mode: 0644]
images/tiles-82.xpm [new file with mode: 0644]
images/tiles-83.xpm [new file with mode: 0644]
images/tiles-84.xpm [new file with mode: 0644]
images/tiles-85.xpm [new file with mode: 0644]
images/tiles-86.xpm [new file with mode: 0644]
images/tiles-87.xpm [new file with mode: 0644]
images/tiles-88.xpm [new file with mode: 0644]
images/tiles-89.xpm [new file with mode: 0644]
images/tiles-9.xpm [new file with mode: 0644]
images/tiles-90.xpm [new file with mode: 0644]
images/tiles-91.xpm [new file with mode: 0644]
images/tiles-92.xpm [new file with mode: 0644]
images/tiles-93.xpm [new file with mode: 0644]
images/tiles-94.xpm [new file with mode: 0644]
images/tiles-95.xpm [new file with mode: 0644]
images/tiles-96.xpm [new file with mode: 0644]
images/tiles-97.xpm [new file with mode: 0644]
images/tiles-98.xpm [new file with mode: 0644]
images/tiles-99.xpm [new file with mode: 0644]
images/tiles.xpm [new file with mode: 0644]
images/tilesbw.xpm [new file with mode: 0644]
images/tilessm.xpm [new file with mode: 0644]
manual/Ask.html [new file with mode: 0644]
manual/Budget.Cancel.html [new file with mode: 0644]
manual/Budget.Collected.html [new file with mode: 0644]
manual/Budget.Continue.html [new file with mode: 0644]
manual/Budget.Police.html [new file with mode: 0644]
manual/Budget.Previous.html [new file with mode: 0644]
manual/Budget.Road.html [new file with mode: 0644]
manual/Budget.html [new file with mode: 0644]
manual/Disaster.No.html [new file with mode: 0644]
manual/Disaster.Yes.html [new file with mode: 0644]
manual/Editor.BuildPie.html [new file with mode: 0644]
manual/Editor.Options.html [new file with mode: 0644]
manual/Editor.ToolChalk.html [new file with mode: 0644]
manual/Editor.ToolInd.html [new file with mode: 0644]
manual/Editor.ToolName.html [new file with mode: 0644]
manual/Editor.ToolNuclear.html [new file with mode: 0644]
manual/Editor.ToolPie.html [new file with mode: 0644]
manual/Editor.ToolQuery.html [new file with mode: 0644]
manual/Editor.ToolRail.html [new file with mode: 0644]
manual/Editor.ToolRes.html [new file with mode: 0644]
manual/Editor.ToolSeaport.html [new file with mode: 0644]
manual/Editor.ToolStadium.html [new file with mode: 0644]
manual/Editor.ToolWire.html [new file with mode: 0644]
manual/Editor.View.html [new file with mode: 0644]
manual/Editor.html [new file with mode: 0644]
manual/Evaluation.Dismiss.html [new file with mode: 0644]
manual/Evaluation.GoodJob.html [new file with mode: 0644]
manual/Evaluation.Statistics.html [new file with mode: 0644]
manual/Evaluation.html [new file with mode: 0644]
manual/File.Cancel.html [new file with mode: 0644]
manual/File.Directory.html [new file with mode: 0644]
manual/File.OK.html [new file with mode: 0644]
manual/File.html [new file with mode: 0644]
manual/Frob.Dismiss.html [new file with mode: 0644]
manual/Frob.html [new file with mode: 0644]
manual/Graph.120Years.html [new file with mode: 0644]
manual/Graph.Com.html [new file with mode: 0644]
manual/Graph.Dismiss.html [new file with mode: 0644]
manual/Graph.Money.html [new file with mode: 0644]
manual/Graph.Pollution.html [new file with mode: 0644]
manual/Graph.html [new file with mode: 0644]
manual/Head.Demand.html [new file with mode: 0644]
manual/Head.Entry.html [new file with mode: 0644]
manual/Head.Funds.html [new file with mode: 0644]
manual/Head.OptionsMenu.html [new file with mode: 0644]
manual/Head.Scrollbar.html [new file with mode: 0644]
manual/Head.TimeMenu.html [new file with mode: 0644]
manual/Head.WindowsMenu.html [new file with mode: 0644]
manual/Head.html [new file with mode: 0644]
manual/Help.Dismiss.html [new file with mode: 0644]
manual/Help.Scrollbar.html [new file with mode: 0644]
manual/Help.html [new file with mode: 0644]
manual/Map.Zones.html [new file with mode: 0644]
manual/Map.html [new file with mode: 0644]
manual/Notice.Text.html [new file with mode: 0644]
manual/Notice.View.html [new file with mode: 0644]
manual/Notice.html [new file with mode: 0644]
manual/Plan.Goto.html [new file with mode: 0644]
manual/Plan.Support.html [new file with mode: 0644]
manual/Plan.Veto.html [new file with mode: 0644]
manual/Player.Display.html [new file with mode: 0644]
manual/Player.html [new file with mode: 0644]
manual/Quit.AllQuit.html [new file with mode: 0644]
manual/Quit.IQuit.html [new file with mode: 0644]
manual/Quit.IResign.html [new file with mode: 0644]
manual/Quit.No.html [new file with mode: 0644]
manual/README [new file with mode: 0644]
manual/Scenario.Bern.html [new file with mode: 0644]
manual/Scenario.Detroit.html [new file with mode: 0644]
manual/Scenario.LoadCity.html [new file with mode: 0644]
manual/Scenario.Name.html [new file with mode: 0644]
manual/Scenario.Rio.html [new file with mode: 0644]
manual/Scenario.SanFran.html [new file with mode: 0644]
manual/Scenario.Use.html [new file with mode: 0644]
manual/Scenario.html [new file with mode: 0644]
manual/SelectCity.No.html [new file with mode: 0644]
manual/SelectCity.Yes.html [new file with mode: 0644]
manual/Window.html [new file with mode: 0644]
manual/bibliography.html [new file with mode: 0644]
manual/credits.html [new file with mode: 0644]
manual/history.html [new file with mode: 0644]
manual/index.html [new file with mode: 0644]
manual/inside.html [new file with mode: 0644]
manual/intro.html [new file with mode: 0644]
manual/reference.html [new file with mode: 0644]
manual/tutorial.html [new file with mode: 0644]
micropolisactivity.py [new file with mode: 0644]
res/buildidx.tcl [new file with mode: 0644]
res/button.tcl [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSans-Bold.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSans-BoldOblique.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSans-ExtraLight.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSans-Oblique.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSans.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSansCondensed-Bold.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSansCondensed-BoldOblique.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSansCondensed-Oblique.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSansCondensed.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSansMono-Bold.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSansMono-BoldOblique.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSansMono-Oblique.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSansMono.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSerif-Bold.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSerif-BoldOblique.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSerif-Oblique.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSerif.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSerifCondensed-Bold.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSerifCondensed-BoldOblique.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSerifCondensed-Oblique.ttf [new file with mode: 0644]
res/dejavu-lgc/DejaVuLGCSerifCondensed.ttf [new file with mode: 0644]
res/dejavu-lgc/fonts.alias [new file with mode: 0644]
res/dejavu-lgc/fonts.dir [new file with mode: 0644]
res/dejavu-lgc/fonts.scale [new file with mode: 0644]
res/entry.tcl [new file with mode: 0644]
res/help.tcl [new file with mode: 0644]
res/hexa.112 [new file with mode: 0644]
res/hexa.232 [new file with mode: 0644]
res/hexa.384 [new file with mode: 0644]
res/hexa.385 [new file with mode: 0644]
res/hexa.386 [new file with mode: 0644]
res/hexa.387 [new file with mode: 0644]
res/hexa.388 [new file with mode: 0644]
res/hexa.456 [new file with mode: 0644]
res/hexa.544 [new file with mode: 0644]
res/hexa.563 [new file with mode: 0644]
res/hexa.999 [new file with mode: 0644]
res/init.tcl [new file with mode: 0644]
res/listbox.tcl [new file with mode: 0644]
res/menu.tcl [new file with mode: 0644]
res/micropolis.tcl [new file with mode: 0644]
res/mkindex.tcl [new file with mode: 0644]
res/parray.tcl [new file with mode: 0644]
res/snro.111 [new file with mode: 0644]
res/snro.222 [new file with mode: 0644]
res/snro.333 [new file with mode: 0644]
res/snro.444 [new file with mode: 0644]
res/snro.555 [new file with mode: 0644]
res/snro.666 [new file with mode: 0644]
res/snro.777 [new file with mode: 0644]
res/snro.888 [new file with mode: 0644]
res/sound.tcl [new file with mode: 0644]
res/sounds/a.wav [new file with mode: 0755]
res/sounds/aaah.wav [new file with mode: 0755]
res/sounds/airport.wav [new file with mode: 0755]
res/sounds/beep.wav [new file with mode: 0755]
res/sounds/boing.wav [new file with mode: 0755]
res/sounds/bop.wav [new file with mode: 0755]
res/sounds/build.wav [new file with mode: 0755]
res/sounds/bulldozer.wav [new file with mode: 0755]
res/sounds/chalk.wav [new file with mode: 0755]
res/sounds/coal.wav [new file with mode: 0755]
res/sounds/com.wav [new file with mode: 0755]
res/sounds/computer.wav [new file with mode: 0755]
res/sounds/cuckoo.wav [new file with mode: 0755]
res/sounds/e.wav [new file with mode: 0755]
res/sounds/eraser.wav [new file with mode: 0755]
res/sounds/explosion-hi.wav [new file with mode: 0755]
res/sounds/explosion-high.wav [new file with mode: 0755]
res/sounds/explosion-low.wav [new file with mode: 0755]
res/sounds/fire.wav [new file with mode: 0755]
res/sounds/heavytraffic.wav [new file with mode: 0755]
res/sounds/honkhonk-hi.wav [new file with mode: 0755]
res/sounds/honkhonk-high.wav [new file with mode: 0755]
res/sounds/honkhonk-low.wav [new file with mode: 0755]
res/sounds/honkhonk-med.wav [new file with mode: 0755]
res/sounds/ignition.wav [new file with mode: 0755]
res/sounds/ind.wav [new file with mode: 0755]
res/sounds/monster.wav [new file with mode: 0755]
res/sounds/nuclear.wav [new file with mode: 0755]
res/sounds/o.wav [new file with mode: 0755]
res/sounds/oop.wav [new file with mode: 0755]
res/sounds/park.wav [new file with mode: 0755]
res/sounds/police.wav [new file with mode: 0755]
res/sounds/quack.wav [new file with mode: 0755]
res/sounds/quackquack.wav [new file with mode: 0755]
res/sounds/query.wav [new file with mode: 0755]
res/sounds/rail.wav [new file with mode: 0755]
res/sounds/res.wav [new file with mode: 0755]
res/sounds/road.wav [new file with mode: 0755]
res/sounds/rumble.wav [new file with mode: 0755]
res/sounds/seaport.wav [new file with mode: 0755]
res/sounds/siren.wav [new file with mode: 0755]
res/sounds/skid.wav [new file with mode: 0755]
res/sounds/sorry.wav [new file with mode: 0755]
res/sounds/stadium.wav [new file with mode: 0755]
res/sounds/uhuh.wav [new file with mode: 0755]
res/sounds/whip.wav [new file with mode: 0755]
res/sounds/wire.wav [new file with mode: 0755]
res/sounds/woosh.wav [new file with mode: 0755]
res/sounds/zone.wav [new file with mode: 0755]
res/stri.202 [new file with mode: 0644]
res/stri.219 [new file with mode: 0644]
res/stri.301 [new file with mode: 0644]
res/stri.356 [new file with mode: 0644]
res/tcl.tdx [new file with mode: 0644]
res/tcl.tlb [new file with mode: 0644]
res/tclindex [new file with mode: 0644]
res/tclinit.tcl [new file with mode: 0644]
res/text.tcl [new file with mode: 0644]
res/tk.tcl [new file with mode: 0644]
res/tk.tdx [new file with mode: 0644]
res/tk.tlb [new file with mode: 0644]
res/tkerror.tcl [new file with mode: 0644]
res/wask.tcl [new file with mode: 0644]
res/wbudget.tcl [new file with mode: 0644]
res/weditor.tcl [new file with mode: 0644]
res/weval.tcl [new file with mode: 0644]
res/wfile.tcl [new file with mode: 0644]
res/wfrob.tcl [new file with mode: 0644]
res/wgraph.tcl [new file with mode: 0644]
res/whead.tcl [new file with mode: 0644]
res/whelp.tcl [new file with mode: 0644]
res/wish.tcl [new file with mode: 0644]
res/wishx.tcl [new file with mode: 0644]
res/wmap.tcl [new file with mode: 0644]
res/wnotice.tcl [new file with mode: 0644]
res/wplayer.tcl [new file with mode: 0644]
res/wscen.tcl [new file with mode: 0644]
res/wscen_old.tcl [new file with mode: 0644]
res/wscen_older.tcl [new file with mode: 0644]
res/wsplash.tcl [new file with mode: 0644]
src/ASSETS.txt [new file with mode: 0644]
src/PLAN.txt [new file with mode: 0644]
src/ROADMAP.txt [new file with mode: 0644]
src/makefile [new file with mode: 0644]
src/notes/BUGS [new file with mode: 0644]
src/notes/Beyond-Intelligent-Machines [new file with mode: 0644]
src/notes/Changes [new file with mode: 0644]
src/notes/DONE [new file with mode: 0644]
src/notes/DocTCL [new file with mode: 0644]
src/notes/Dynamic.tcl [new file with mode: 0644]
src/notes/FirstRelease [new file with mode: 0644]
src/notes/InterCHI-Interactive-Experience-Proposal [new file with mode: 0644]
src/notes/MULTI [new file with mode: 0644]
src/notes/Micropolis-Indigo.gif [new file with mode: 0644]
src/notes/Micropolis-NCD.gif [new file with mode: 0644]
src/notes/Micropolis-Sun.gif [new file with mode: 0644]
src/notes/MultiPlayerIdeas.txt [new file with mode: 0644]
src/notes/NCDAudio [new file with mode: 0644]
src/notes/OLPC-notes.txt [new file with mode: 0644]
src/notes/Performance [new file with mode: 0644]
src/notes/Publicity [new file with mode: 0644]
src/notes/Questions [new file with mode: 0644]
src/notes/Release [new file with mode: 0644]
src/notes/SharedData [new file with mode: 0644]
src/notes/Strategy [new file with mode: 0644]
src/notes/TODO [new file with mode: 0644]
src/notes/TkVersion [new file with mode: 0644]
src/notes/bugs.txt [new file with mode: 0644]
src/notes/outline [new file with mode: 0644]
src/notes/sim.gif [new file with mode: 0644]
src/notes/to.ouster [new file with mode: 0644]
src/sim/g_ani.c [new file with mode: 0644]
src/sim/g_bigmap.c [new file with mode: 0644]
src/sim/g_cam.c [new file with mode: 0644]
src/sim/g_map.c [new file with mode: 0644]
src/sim/g_setup.c [new file with mode: 0644]
src/sim/g_smmaps.c [new file with mode: 0644]
src/sim/headers/animtab.h [new file with mode: 0644]
src/sim/headers/cam.h [new file with mode: 0644]
src/sim/headers/mac.h [new file with mode: 0644]
src/sim/headers/macros.h [new file with mode: 0644]
src/sim/headers/sim.h [new file with mode: 0644]
src/sim/headers/view.h [new file with mode: 0644]
src/sim/makefile [new file with mode: 0644]
src/sim/rand.c [new file with mode: 0644]
src/sim/random.c [new file with mode: 0644]
src/sim/s_alloc.c [new file with mode: 0644]
src/sim/s_disast.c [new file with mode: 0644]
src/sim/s_eval.c [new file with mode: 0644]
src/sim/s_fileio.c [new file with mode: 0644]
src/sim/s_gen.c [new file with mode: 0644]
src/sim/s_init.c [new file with mode: 0644]
src/sim/s_msg.c [new file with mode: 0644]
src/sim/s_power.c [new file with mode: 0644]
src/sim/s_scan.c [new file with mode: 0644]
src/sim/s_sim.c [new file with mode: 0644]
src/sim/s_traf.c [new file with mode: 0644]
src/sim/s_zone.c [new file with mode: 0644]
src/sim/sim.c [new file with mode: 0644]
src/sim/terrain/mapgener.c [new file with mode: 0644]
src/sim/terrain/messages [new file with mode: 0644]
src/sim/terrain/terra.c [new file with mode: 0644]
src/sim/terrain/terragen.c [new file with mode: 0644]
src/sim/w_budget.c [new file with mode: 0644]
src/sim/w_cam.c [new file with mode: 0644]
src/sim/w_con.c [new file with mode: 0644]
src/sim/w_date.c [new file with mode: 0644]
src/sim/w_editor.c [new file with mode: 0644]
src/sim/w_eval.c [new file with mode: 0644]
src/sim/w_graph.c [new file with mode: 0644]
src/sim/w_inter.c [new file with mode: 0644]
src/sim/w_keys.c [new file with mode: 0644]
src/sim/w_map.c [new file with mode: 0644]
src/sim/w_net.c [new file with mode: 0644]
src/sim/w_piem.c [new file with mode: 0644]
src/sim/w_print.c [new file with mode: 0644]
src/sim/w_resrc.c [new file with mode: 0644]
src/sim/w_sim.c [new file with mode: 0644]
src/sim/w_sound.c [new file with mode: 0644]
src/sim/w_sprite.c [new file with mode: 0644]
src/sim/w_stubs.c [new file with mode: 0644]
src/sim/w_tk.c [new file with mode: 0644]
src/sim/w_tool.c [new file with mode: 0644]
src/sim/w_update.c [new file with mode: 0644]
src/sim/w_util.c [new file with mode: 0644]
src/sim/w_x.c [new file with mode: 0644]
src/tcl/compat/README [new file with mode: 0644]
src/tcl/compat/dirent.h [new file with mode: 0644]
src/tcl/compat/dirent2.h [new file with mode: 0644]
src/tcl/compat/limits.h [new file with mode: 0644]
src/tcl/compat/opendir.c [new file with mode: 0644]
src/tcl/compat/stdlib.h [new file with mode: 0644]
src/tcl/compat/strerror.c [new file with mode: 0644]
src/tcl/compat/string.h [new file with mode: 0644]
src/tcl/compat/strstr.c [new file with mode: 0644]
src/tcl/compat/strtod.c [new file with mode: 0644]
src/tcl/compat/strtol.c [new file with mode: 0644]
src/tcl/compat/strtoul.c [new file with mode: 0644]
src/tcl/compat/testpid.c [new file with mode: 0644]
src/tcl/compat/teststrtoul.c [new file with mode: 0644]
src/tcl/compat/testuid.c [new file with mode: 0644]
src/tcl/compat/testwait.c [new file with mode: 0644]
src/tcl/config [new file with mode: 0755]
src/tcl/library/init.tcl [new file with mode: 0644]
src/tcl/library/mkindex.tcl [new file with mode: 0644]
src/tcl/library/parray.tcl [new file with mode: 0644]
src/tcl/library/tclindex [new file with mode: 0644]
src/tcl/makefile [new file with mode: 0644]
src/tcl/panic.c [new file with mode: 0644]
src/tcl/porting.txt [new file with mode: 0644]
src/tcl/readme.txt [new file with mode: 0644]
src/tcl/regexp.c [new file with mode: 0644]
src/tcl/regexp.h [new file with mode: 0644]
src/tcl/tcl.h [new file with mode: 0644]
src/tcl/tclassem.c [new file with mode: 0644]
src/tcl/tclbasic.c [new file with mode: 0644]
src/tcl/tclckall.c [new file with mode: 0644]
src/tcl/tclcmdah.c [new file with mode: 0644]
src/tcl/tclcmdil.c [new file with mode: 0644]
src/tcl/tclcmdmz.c [new file with mode: 0644]
src/tcl/tclenv.c [new file with mode: 0644]
src/tcl/tclexpr.c [new file with mode: 0644]
src/tcl/tclget.c [new file with mode: 0644]
src/tcl/tclglob.c [new file with mode: 0644]
src/tcl/tclhash.c [new file with mode: 0644]
src/tcl/tclhash.h [new file with mode: 0644]
src/tcl/tclhist.c [new file with mode: 0644]
src/tcl/tclint.h [new file with mode: 0644]
src/tcl/tclparse.c [new file with mode: 0644]
src/tcl/tclproc.c [new file with mode: 0644]
src/tcl/tcltest.c [new file with mode: 0644]
src/tcl/tclunix.h [new file with mode: 0644]
src/tcl/tclunxaz.c [new file with mode: 0644]
src/tcl/tclunxst.c [new file with mode: 0644]
src/tcl/tclunxut.c [new file with mode: 0644]
src/tcl/tclutil.c [new file with mode: 0644]
src/tcl/tclvar.c [new file with mode: 0644]
src/tclx/config.mk [new file with mode: 0644]
src/tclx/config/aux [new file with mode: 0644]
src/tclx/config/bsd [new file with mode: 0644]
src/tclx/config/bsd-4.3 [new file with mode: 0644]
src/tclx/config/dos [new file with mode: 0644]
src/tclx/config/hpux [new file with mode: 0644]
src/tclx/config/linux [new file with mode: 0644]
src/tclx/config/osf1 [new file with mode: 0644]
src/tclx/config/rs6000 [new file with mode: 0644]
src/tclx/config/scoodt1.1 [new file with mode: 0644]
src/tclx/config/scoodt2.0 [new file with mode: 0644]
src/tclx/config/sgi [new file with mode: 0644]
src/tclx/config/solaris2 [new file with mode: 0644]
src/tclx/config/sunos4.0 [new file with mode: 0644]
src/tclx/config/sunos4.1 [new file with mode: 0644]
src/tclx/config/sysv.3.2.0 [new file with mode: 0644]
src/tclx/config/ultrix [new file with mode: 0644]
src/tclx/config/ultrix4.2 [new file with mode: 0644]
src/tclx/config/xenix [new file with mode: 0644]
src/tclx/makefile [new file with mode: 0644]
src/tclx/ossupp/fcntl.c [new file with mode: 0644]
src/tclx/ossupp/ids.c [new file with mode: 0644]
src/tclx/ossupp/makefile [new file with mode: 0644]
src/tclx/ossupp/makefile.dvx [new file with mode: 0644]
src/tclx/ossupp/sigs.c [new file with mode: 0644]
src/tclx/ossupp/strftime.c [new file with mode: 0644]
src/tclx/ossupp/times.c [new file with mode: 0644]
src/tclx/readme [new file with mode: 0644]
src/tclx/src/main.c [new file with mode: 0644]
src/tclx/src/mainplus.cc [new file with mode: 0644]
src/tclx/src/makefile [new file with mode: 0644]
src/tclx/src/patchlvl.h [new file with mode: 0644]
src/tclx/src/tclplus.cc [new file with mode: 0644]
src/tclx/src/tclplus.h [new file with mode: 0644]
src/tclx/src/tclxbsrc.c [new file with mode: 0644]
src/tclx/src/tclxcclk.c [new file with mode: 0644]
src/tclx/src/tclxchmd.c [new file with mode: 0644]
src/tclx/src/tclxclck.c [new file with mode: 0644]
src/tclx/src/tclxclp.c [new file with mode: 0644]
src/tclx/src/tclxcret.c [new file with mode: 0644]
src/tclx/src/tclxdebg.c [new file with mode: 0644]
src/tclx/src/tclxdup.c [new file with mode: 0644]
src/tclx/src/tclxfcmd.c [new file with mode: 0644]
src/tclx/src/tclxfctl.c [new file with mode: 0644]
src/tclx/src/tclxfmat.c [new file with mode: 0644]
src/tclx/src/tclxfsca.c [new file with mode: 0644]
src/tclx/src/tclxgdat.y [new file with mode: 0644]
src/tclx/src/tclxgenl.c [new file with mode: 0644]
src/tclx/src/tclxhndl.c [new file with mode: 0644]
src/tclx/src/tclxid.c [new file with mode: 0644]
src/tclx/src/tclxint.h [new file with mode: 0644]
src/tclx/src/tclxklst.c [new file with mode: 0644]
src/tclx/src/tclxlib.c [new file with mode: 0644]
src/tclx/src/tclxlist.c [new file with mode: 0644]
src/tclx/src/tclxmath.c [new file with mode: 0644]
src/tclx/src/tclxmerr.c [new file with mode: 0644]
src/tclx/src/tclxmsgc.c [new file with mode: 0644]
src/tclx/src/tclxproc.c [new file with mode: 0644]
src/tclx/src/tclxprof.c [new file with mode: 0644]
src/tclx/src/tclxrexp.c [new file with mode: 0644]
src/tclx/src/tclxsel.c [new file with mode: 0644]
src/tclx/src/tclxsig.c [new file with mode: 0644]
src/tclx/src/tclxstr.c [new file with mode: 0644]
src/tclx/src/tclxstup.c [new file with mode: 0644]
src/tclx/src/tclxtend.h [new file with mode: 0644]
src/tclx/src/tclxunix.c [new file with mode: 0644]
src/tclx/src/tclxutil.c [new file with mode: 0644]
src/tclx/tcllib/8queens.tcl [new file with mode: 0644]
src/tclx/tcllib/buildhelp.tcl [new file with mode: 0644]
src/tclx/tcllib/buildidx.tcl [new file with mode: 0644]
src/tclx/tcllib/tclinit.tcl [new file with mode: 0644]
src/tclx/tclsrc/array.tcl [new file with mode: 0644]
src/tclx/tclsrc/assign.tcl [new file with mode: 0644]
src/tclx/tclsrc/compat.tcl [new file with mode: 0644]
src/tclx/tclsrc/convlib.tcl [new file with mode: 0644]
src/tclx/tclsrc/edprocs.tcl [new file with mode: 0644]
src/tclx/tclsrc/forfile.tcl [new file with mode: 0644]
src/tclx/tclsrc/forrec.tcl [new file with mode: 0644]
src/tclx/tclsrc/globrec.tcl [new file with mode: 0644]
src/tclx/tclsrc/help.tcl [new file with mode: 0644]
src/tclx/tclsrc/install.tcl [new file with mode: 0644]
src/tclx/tclsrc/makefile [new file with mode: 0644]
src/tclx/tclsrc/packages.tcl [new file with mode: 0644]
src/tclx/tclsrc/profrep.tcl [new file with mode: 0644]
src/tclx/tclsrc/pushd.tcl [new file with mode: 0644]
src/tclx/tclsrc/setfuncs.tcl [new file with mode: 0644]
src/tclx/tclsrc/showproc.tcl [new file with mode: 0644]
src/tclx/tclsrc/strfile.tcl [new file with mode: 0644]
src/tclx/tksrc/makefile [new file with mode: 0644]
src/tclx/tkucbsrc/main.dif [new file with mode: 0644]
src/tclx/tkucbsrc/main.sed [new file with mode: 0644]
src/tclx/tkucbsrc/makefile [new file with mode: 0644]
src/tclx/tkucbsrc/tkevent.dif [new file with mode: 0644]
src/tclx/tkucbsrc/tkevent.sed [new file with mode: 0644]
src/tclx/tkucbsrc/wishx.sed [new file with mode: 0644]
src/tclx/ucbsrc/makefile [new file with mode: 0644]
src/tclx/ucbsrc/tclbasic.dif [new file with mode: 0644]
src/tclx/ucbsrc/tclbasic.sed [new file with mode: 0644]
src/tclx/ucbsrc/tclexpr.dif [new file with mode: 0644]
src/tclx/ucbsrc/tclexpr.sed [new file with mode: 0644]
src/tk/bitmaps/gray25 [new file with mode: 0644]
src/tk/bitmaps/gray50 [new file with mode: 0644]
src/tk/default.h [new file with mode: 0644]
src/tk/ks_names.h [new file with mode: 0644]
src/tk/library/button.tcl [new file with mode: 0644]
src/tk/library/demos/README [new file with mode: 0644]
src/tk/library/demos/bitmaps/face [new file with mode: 0644]
src/tk/library/demos/bitmaps/flagdown [new file with mode: 0644]
src/tk/library/demos/bitmaps/flagup [new file with mode: 0644]
src/tk/library/demos/bitmaps/grey.25 [new file with mode: 0644]
src/tk/library/demos/bitmaps/grey.5 [new file with mode: 0644]
src/tk/library/demos/bitmaps/letters [new file with mode: 0644]
src/tk/library/demos/bitmaps/noletters [new file with mode: 0644]
src/tk/library/demos/bitmaps/pattern [new file with mode: 0644]
src/tk/library/demos/browse [new file with mode: 0755]
src/tk/library/demos/color [new file with mode: 0755]
src/tk/library/demos/dialog [new file with mode: 0755]
src/tk/library/demos/hello [new file with mode: 0755]
src/tk/library/demos/ixset [new file with mode: 0755]
src/tk/library/demos/mkArrow.tcl [new file with mode: 0644]
src/tk/library/demos/mkBasic.tcl [new file with mode: 0644]
src/tk/library/demos/mkButton.tcl [new file with mode: 0644]
src/tk/library/demos/mkCanvText.tcl [new file with mode: 0644]
src/tk/library/demos/mkCheck.tcl [new file with mode: 0644]
src/tk/library/demos/mkDialog.tcl [new file with mode: 0644]
src/tk/library/demos/mkEntry.tcl [new file with mode: 0644]
src/tk/library/demos/mkEntry2.tcl [new file with mode: 0644]
src/tk/library/demos/mkHScale.tcl [new file with mode: 0644]
src/tk/library/demos/mkIcon.tcl [new file with mode: 0644]
src/tk/library/demos/mkItems.tcl [new file with mode: 0644]
src/tk/library/demos/mkLabel.tcl [new file with mode: 0644]
src/tk/library/demos/mkListbox.tcl [new file with mode: 0644]
src/tk/library/demos/mkListbox2.tcl [new file with mode: 0644]
src/tk/library/demos/mkListbox3.tcl [new file with mode: 0644]
src/tk/library/demos/mkPlot.tcl [new file with mode: 0644]
src/tk/library/demos/mkPuzzle.tcl [new file with mode: 0644]
src/tk/library/demos/mkRadio.tcl [new file with mode: 0644]
src/tk/library/demos/mkRuler.tcl [new file with mode: 0644]
src/tk/library/demos/mkScroll.tcl [new file with mode: 0644]
src/tk/library/demos/mkStyles.tcl [new file with mode: 0644]
src/tk/library/demos/mkTear.tcl [new file with mode: 0644]
src/tk/library/demos/mkTextBind.tcl [new file with mode: 0644]
src/tk/library/demos/mkVScale.tcl [new file with mode: 0644]
src/tk/library/demos/rolodex [new file with mode: 0755]
src/tk/library/demos/showVars.tcl [new file with mode: 0644]
src/tk/library/demos/size [new file with mode: 0755]
src/tk/library/demos/tclIndex [new file with mode: 0644]
src/tk/library/demos/timer [new file with mode: 0755]
src/tk/library/demos/tkSquare.c [new file with mode: 0644]
src/tk/library/demos/widget [new file with mode: 0755]
src/tk/library/entry.tcl [new file with mode: 0644]
src/tk/library/listbox.tcl [new file with mode: 0644]
src/tk/library/menu.tcl [new file with mode: 0644]
src/tk/library/tclindex [new file with mode: 0644]
src/tk/library/text.tcl [new file with mode: 0644]
src/tk/library/tk.tcl [new file with mode: 0644]
src/tk/library/tkerror.tcl [new file with mode: 0644]
src/tk/library/wish.tcl [new file with mode: 0644]
src/tk/main.c [new file with mode: 0644]
src/tk/makefile [new file with mode: 0644]
src/tk/makefile.dvx [new file with mode: 0644]
src/tk/makefile.hpux [new file with mode: 0644]
src/tk/makefile.linux [new file with mode: 0644]
src/tk/makefile.osf [new file with mode: 0644]
src/tk/makefile.sgi [new file with mode: 0644]
src/tk/makefile.sol [new file with mode: 0644]
src/tk/makefile.sun [new file with mode: 0644]
src/tk/readme [new file with mode: 0644]
src/tk/tk.h [new file with mode: 0644]
src/tk/tk3d.c [new file with mode: 0644]
src/tk/tkargv.c [new file with mode: 0644]
src/tk/tkatom.c [new file with mode: 0644]
src/tk/tkbind.c [new file with mode: 0644]
src/tk/tkbitmap.c [new file with mode: 0644]
src/tk/tkbutton.c [new file with mode: 0644]
src/tk/tkcanvas.c [new file with mode: 0644]
src/tk/tkcanvas.h [new file with mode: 0644]
src/tk/tkcmds.c [new file with mode: 0644]
src/tk/tkcolor.c [new file with mode: 0644]
src/tk/tkconfig.c [new file with mode: 0644]
src/tk/tkconfig.h [new file with mode: 0644]
src/tk/tkcursor.c [new file with mode: 0644]
src/tk/tkcvarc.c [new file with mode: 0644]
src/tk/tkcvbmap.c [new file with mode: 0644]
src/tk/tkcvline.c [new file with mode: 0644]
src/tk/tkcvpoly.c [new file with mode: 0644]
src/tk/tkcvtext.c [new file with mode: 0644]
src/tk/tkcvwind.c [new file with mode: 0644]
src/tk/tkentry.c [new file with mode: 0644]
src/tk/tkerror.c [new file with mode: 0644]
src/tk/tkevent.c [new file with mode: 0644]
src/tk/tkfont.c [new file with mode: 0644]
src/tk/tkframe.c [new file with mode: 0644]
src/tk/tkgc.c [new file with mode: 0644]
src/tk/tkgeo.c [new file with mode: 0644]
src/tk/tkget.c [new file with mode: 0644]
src/tk/tkgrab.c [new file with mode: 0644]
src/tk/tkint.h [new file with mode: 0644]
src/tk/tklist.c [new file with mode: 0644]
src/tk/tkmenu.c [new file with mode: 0644]
src/tk/tkmnbut.c [new file with mode: 0644]
src/tk/tkmsg.c [new file with mode: 0644]
src/tk/tkoption.c [new file with mode: 0644]
src/tk/tkpack.c [new file with mode: 0644]
src/tk/tkpixmap.c [new file with mode: 0644]
src/tk/tkplace.c [new file with mode: 0644]
src/tk/tkpresrv.c [new file with mode: 0644]
src/tk/tkrawtcp.c [new file with mode: 0644]
src/tk/tkrectov.c [new file with mode: 0644]
src/tk/tkscale.c [new file with mode: 0644]
src/tk/tkscrbar.c [new file with mode: 0644]
src/tk/tkselect.c [new file with mode: 0644]
src/tk/tksend.c [new file with mode: 0644]
src/tk/tkshare.c [new file with mode: 0644]
src/tk/tktcp.c [new file with mode: 0644]
src/tk/tktcp.h [new file with mode: 0644]
src/tk/tktext.c [new file with mode: 0644]
src/tk/tktext.h [new file with mode: 0644]
src/tk/tktrig.c [new file with mode: 0644]
src/tk/tktxbtre.c [new file with mode: 0644]
src/tk/tktxdisp.c [new file with mode: 0644]
src/tk/tktxidx.c [new file with mode: 0644]
src/tk/tktxtag.c [new file with mode: 0644]
src/tk/tkwindow.c [new file with mode: 0644]
src/tk/tkwm.c [new file with mode: 0644]
src/tk/tkwm.h [new file with mode: 0644]

diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/Micropolis b/Micropolis
new file mode 100755 (executable)
index 0000000..ed118a9
--- /dev/null
@@ -0,0 +1,64 @@
+#!/bin/bash
+export SIMHOME=`pwd`
+echo "Starting Micropolis in $SIMHOME ... "
+res/sim $*
+
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
diff --git a/Micropolis.png b/Micropolis.png
new file mode 100644 (file)
index 0000000..e959dc9
Binary files /dev/null and b/Micropolis.png differ
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..ba9736f
--- /dev/null
+++ b/README
@@ -0,0 +1,134 @@
+========================================================================
+
+Linux Micropolis for X11.
+
+========================================================================
+
+Micropolis designed and implemented by Will Wright, 
+Copyright (C) 2002 by Electronic Arts.
+Unix porting, optimization and TCL/Tk user interface design 
+by Don Hopkins (dhopkins@DonHopkins.com, http://www.DonHopkins.com),
+developed for DUX Software under license from Maxis.
+Ported to OLPC Fedora Linux by Don Hopkins.
+
+========================================================================
+
+This README file contains several copyright notices.  Keep reading.
+
+========================================================================
+
+See the file "COPYING" for the full text of the GNU General Public License.
+
+The following copyright notice applies to the original source code
+of Micropolis (in src/sim/) as well as to the X11 Tk port of Micropolis
+(in res/*.tcl), and to all of the non-text files in this source code
+release, including:
+
+    cities/*           All loadable city images
+    images/*           All graphical images
+    activity/activity-micropolis.svg   Icon for Micropolis in Sugar
+    res/hexa.*         Map Graphics
+    res/snro.*         Scenarios
+    res/sounds/*       Sounds played by the game
+    res/stri.*         Text strings displayed by the game
+
+Micropolis, Unix Version.  This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+  http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <http://www.gnu.org/licenses/>.
+
+            ADDITIONAL TERMS per GNU GPL Section 7
+
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+
+This disclaimer supplements the one included in the General Public
+License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.
+
+========================================================================
+
+Some parts of this software distribution were written and copyrighted
+by other people.  We gratefully acknowledge the authors and thank them
+for their generosity in sharing their software with us and the world.
+Such software includes:
+
+       res/dejavu-lgc/         Font for use in Sugar Micropolis
+               
+http://dejavu.sourceforge.net
+Fonts are (c) Bitstream (see below). DejaVu changes are in public
+domain. Glyphs imported from Arev fonts are (c) Tavmjung Bah.
+
+       src/sim/rand.c          Random Number Generator
+       src/sim/random.c        Random Number Generator
+
+       src/tcl/                Tool Control Language
+       src/tk/                 Tk X11 Window System toolkit
+       res/tclinit.tcl         from TCL
+       res/tkerror.tcl         from TK
+
+Copyright 1988-1992 Regents of the University of California
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appears in all copies.  The University of California
+makes no representations about the suitability of this
+software for any purpose.  It is provided "as is" without
+express or implied warranty.
+
+       src/tclx/               Extended TCL
+
+Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted, provided
+that the above copyright notice appear in all copies.  Karl Lehenbauer and
+Mark Diekhans make no representations about the suitability of this
+software for any purpose.  It is provided "as is" without express or
+implied warranty.
+
diff --git a/__init__.py b/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/activity/activity-micropolis.svg b/activity/activity-micropolis.svg
new file mode 100644 (file)
index 0000000..22b06c7
--- /dev/null
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   enable-background="new 0 0 55 55"
+   height="55px"
+   version="1.1"
+   viewBox="0 0 55 55"
+   width="55px"
+   x="0px"
+   xml:space="preserve"
+   y="0px"
+   id="svg2172"
+   sodipodi:version="0.32"
+   inkscape:version="0.45.1"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docbase="/d1/gnu/olpc"
+   sodipodi:docname="activity-micropolis2.svg"><metadata
+     id="metadata2190"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+     id="defs2188" /><sodipodi:namedview
+     inkscape:window-height="627"
+     inkscape:window-width="1227"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     guidetolerance="10.0"
+     gridtolerance="10.0"
+     objecttolerance="10.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     inkscape:zoom="7.4"
+     inkscape:cx="30.202703"
+     inkscape:cy="25.885243"
+     inkscape:window-x="0"
+     inkscape:window-y="520"
+     inkscape:current-layer="svg2172" /><g
+     display="block"
+     id="activity-micropolis">
+       <g
+   display="inline"
+   id="g2175">
+               
+               
+               <path
+   transform="translate(8.7837833,-0.1351351)"
+   style="fill:#ffffff;stroke:#010101;stroke-width:3.5"
+   d="M 26.883676,22.084 L 18.883676,36.185811 L 10.883676,22.084 L 10.883676,51 L 26.883676,51 L 26.883676,22.084 z "
+   id="polygon2181"
+   sodipodi:nodetypes="cccccc" />
+               
+               <polygon
+   points="52.625,20 43.875,12.084 43.875,51 52.625,51 52.625,20 "
+   id="polygon2185"
+   transform="matrix(-0.9385702,0,0,1.1643121,93.536013,-8.4935442)"
+   style="fill:#ffffff;stroke:#010101;stroke-width:3.5" />
+       <polygon
+   style="fill:#ffffff;stroke:#010101;stroke-width:3.5"
+   transform="matrix(0.9740285,0,0,1.1643121,-39.692821,-8.4935442)"
+   id="polygon2270"
+   points="52.625,20 43.875,12.084 43.875,51 52.625,51 52.625,20 " /></g>
+</g></svg>
\ No newline at end of file
diff --git a/activity/activity.info b/activity/activity.info
new file mode 100644 (file)
index 0000000..efc3d93
--- /dev/null
@@ -0,0 +1,7 @@
+[Activity]
+name = Micropolis
+activity_version = 7
+icon = activity-micropolis
+service_name = org.laptop.Micropolis
+class = micropolisactivity.MicropolisActivity
+show_launcher = yes
diff --git a/cities/about.cty b/cities/about.cty
new file mode 100644 (file)
index 0000000..24139a0
Binary files /dev/null and b/cities/about.cty differ
diff --git a/cities/badnews.cty b/cities/badnews.cty
new file mode 100644 (file)
index 0000000..3e901c7
Binary files /dev/null and b/cities/badnews.cty differ
diff --git a/cities/bluebird.cty b/cities/bluebird.cty
new file mode 100644 (file)
index 0000000..877ad49
Binary files /dev/null and b/cities/bluebird.cty differ
diff --git a/cities/bruce.cty b/cities/bruce.cty
new file mode 100644 (file)
index 0000000..b38fddd
Binary files /dev/null and b/cities/bruce.cty differ
diff --git a/cities/deadwood.cty b/cities/deadwood.cty
new file mode 100644 (file)
index 0000000..7a5a161
Binary files /dev/null and b/cities/deadwood.cty differ
diff --git a/cities/finnigan.cty b/cities/finnigan.cty
new file mode 100644 (file)
index 0000000..80f58d3
Binary files /dev/null and b/cities/finnigan.cty differ
diff --git a/cities/freds.cty b/cities/freds.cty
new file mode 100644 (file)
index 0000000..84cc7fa
Binary files /dev/null and b/cities/freds.cty differ
diff --git a/cities/haight.cty b/cities/haight.cty
new file mode 100644 (file)
index 0000000..e70f985
Binary files /dev/null and b/cities/haight.cty differ
diff --git a/cities/happisle.cty b/cities/happisle.cty
new file mode 100644 (file)
index 0000000..786d028
Binary files /dev/null and b/cities/happisle.cty differ
diff --git a/cities/joffburg.cty b/cities/joffburg.cty
new file mode 100644 (file)
index 0000000..df93e0d
Binary files /dev/null and b/cities/joffburg.cty differ
diff --git a/cities/kamakura.cty b/cities/kamakura.cty
new file mode 100644 (file)
index 0000000..b91944c
Binary files /dev/null and b/cities/kamakura.cty differ
diff --git a/cities/kobe.cty b/cities/kobe.cty
new file mode 100644 (file)
index 0000000..911765e
Binary files /dev/null and b/cities/kobe.cty differ
diff --git a/cities/kowloon.cty b/cities/kowloon.cty
new file mode 100644 (file)
index 0000000..52e8ab7
Binary files /dev/null and b/cities/kowloon.cty differ
diff --git a/cities/kyoto.cty b/cities/kyoto.cty
new file mode 100644 (file)
index 0000000..817a78b
Binary files /dev/null and b/cities/kyoto.cty differ
diff --git a/cities/linecity.cty b/cities/linecity.cty
new file mode 100644 (file)
index 0000000..b178ba1
Binary files /dev/null and b/cities/linecity.cty differ
diff --git a/cities/med_isle.cty b/cities/med_isle.cty
new file mode 100644 (file)
index 0000000..9db3fad
Binary files /dev/null and b/cities/med_isle.cty differ
diff --git a/cities/ndulls.cty b/cities/ndulls.cty
new file mode 100644 (file)
index 0000000..104279e
Binary files /dev/null and b/cities/ndulls.cty differ
diff --git a/cities/neatmap.cty b/cities/neatmap.cty
new file mode 100644 (file)
index 0000000..1ed2243
Binary files /dev/null and b/cities/neatmap.cty differ
diff --git a/cities/radial.cty b/cities/radial.cty
new file mode 100644 (file)
index 0000000..0a180eb
Binary files /dev/null and b/cities/radial.cty differ
diff --git a/cities/senri.cty b/cities/senri.cty
new file mode 100644 (file)
index 0000000..827ca84
Binary files /dev/null and b/cities/senri.cty differ
diff --git a/cities/southpac.cty b/cities/southpac.cty
new file mode 100644 (file)
index 0000000..daffddc
Binary files /dev/null and b/cities/southpac.cty differ
diff --git a/cities/splats.cty b/cities/splats.cty
new file mode 100644 (file)
index 0000000..8088000
Binary files /dev/null and b/cities/splats.cty differ
diff --git a/cities/wetcity.cty b/cities/wetcity.cty
new file mode 100644 (file)
index 0000000..9168fcc
Binary files /dev/null and b/cities/wetcity.cty differ
diff --git a/cities/yokohama.cty b/cities/yokohama.cty
new file mode 100644 (file)
index 0000000..8d1de6a
Binary files /dev/null and b/cities/yokohama.cty differ
diff --git a/images/airport.xpm b/images/airport.xpm
new file mode 100644 (file)
index 0000000..55edc28
--- /dev/null
@@ -0,0 +1,116 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"96 96 13 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #0000E6",
+"c c #3F3F3F",
+"d c #007F00",
+"e c #6666E6",
+"f c #FF0000",
+"g c #997E4C",
+"h c #FFFFFF",
+"i c #FFFF00 m #000000",
+"j c #CC7E66",
+"k c #FF7B00",
+"l c #BFBFBF",
+/* pixels */
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"ijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfjfjfjfjfjfjfjjjjjjjjjjjji",
+"ijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcccccccccccccjjjjjjjjjjjji",
+"ijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjclclclclclclcjjjjjjjjjjjji",
+"ijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj```jjjjjjjjjjjjjjjjaaaaaaaaaclclclclclclcjjjjjjjjjjjji",
+"ijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcj`ccjjjjjjjjjjjjjjgjaaaaaaaaaacccccccccccccejjjjjjjjjgji",
+"ijjjjjgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjcj`jjjjjjjjjjjjjjjjjjaaaaaalaaaaccccaaacaccccjjjjjjjjjjjji",
+"ijaaaaaaaaaaaaaaaaaaaaaaaajjjjjjjjjjjcj`jljjjjjjjjjjjjjjjjaaaalaaaaaaaccccacacaccccjjjjjjjjjjjji",
+"ijjjjjjjjjjjjjjjjjjjjjjjgajjjjjjjjjjcj``jjjjjjjjjjjjjjjjjaaaaaaaaaaaaaccccaaacaccccjjjjjjjjjjjji",
+"ijjjjjjjjjjjjjjjjjjjjjjjjajjjjjjjjjjjj``jjjjjjjjjjjjjjjjaaaalaaaajjjjjccccacacaacccjjjjjjjjjjjji",
+"ijjjjjjjjjjjjjjjjjjjjjjjjajjjjjjjjjjjj`jjjjjjjjjjjjjjjjjaaaaaaaajjjjjjccccaaacaccccjjjjjjjjjjjji",
+"ijjjjejjjjjjjejjjjjjjejjjjjjejjjjjjejjjjjjejjjjjjejjjjjeaaaaaaaaejjjjecccccccccccccejjjjjejjjjji",
+"ifccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccfi",
+"ijcllccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllcji",
+"ifcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclcccccccccccccccccfi",
+"ijcllccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclccccccccaaacccllcji",
+"ifcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclccccccccaccaaccccfi",
+"ijcllcacaaaccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccacccccllcji",
+"ifccccacacacccllllcccllllcccllllcccllllcccllllcccllllcccllllcccllllcccllllccccllllccccccccccccfi",
+"ijcllcaaaaaccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaacacllcji",
+"ifcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccacacaccccfi",
+"ijcllccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclccccccccacaaacllcji",
+"ifcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclcccccccccccccccccfi",
+"ijcllccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclccccccccccccccllcji",
+"ifcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclcccccccccccccccccfi",
+"ijjjjeaaaaaaaaejjjjjjejjjjjjejjajjjejjjjjjejjjjjjejjjjjeaaaaaaaaejjjjecccccccccccccejjjjjejjjjji",
+"ijjjjjaaaaaaaajjjjjjjjjjjjjjjjjajjjjjjjjjjjjjjjjjjjjjjjjaaaaaaaajjjjjjcccccccccccccjjjjjjjjjjjji",
+"ijjjjjaaalaaaajjjjjjjjjjjjjjjjjajjjjjjjjjjjjjjjjjjjjjjjjaaalaaaajjjjjjcccccccccccccjjjjjjjjjjjji",
+"ijjjjjaaaaaaaajjjjjjjjjjjjjjjjjajjjjjjjjjjjjjjgjjjjjjjjjaaaaaaaajjjjjjcccccclccccccjjjjjaaajjjji",
+"ijjjjjaaaaaaaajjjjjjjjjjjjjjjjjajjjjjjjjjjjjjjjjjjjjjjjjaaaaaaaajjjjjjcccccclccccccjjjjjjjajjjji",
+"ijjjjjaaalaaaajjjjjjjjjjjjjjjjjaaaaaaaaaaaaaajjjjjjjjjjjaaalaaaajjjjjjcccccclccccccjjjlccjajjjji",
+"ijjjjjaaaaaaaajjjjjjjjjjjjjjjjjajjjjjjjjjjjjajjjjjjjjjjjaaaaaaaajjjjjjcccccclccccccjjjlccjajjjji",
+"ijjjjjaaaaaaaaaaaaaaaaaaaaaaaaaajjjjjjjjjjjjajjjjjjjjjjjaaaaaaaajjjjjecccccccccccccejjlaajajjjji",
+"ijjjjjaaalaaaajjjjjjjjjjjjjjjjjjjjjjjjjjjjjjajjjjjjjjjjjaaaaaaaajjjjjjcccccccccccccjjjjjjjajjjji",
+"ijjjjjaaaaaaaajjjjjjjjjjjjjjjjjjjjjjjjjjjjjjajjllllllllllllllaaajjjjjjcccccccccccccjjjjjjjajjjji",
+"ijjjjaaaaaaaaaajjjjjjjjjjjjjjjjjjjjjjjjjjjjjajjllllllllllllllaaajjjjjjcccccclccccccjjjjjjjajjjji",
+"ijjjaaaaalaaaaaaahhhhhaaaaaaaaaaaaaaaaaaaaaaaa`llllllllllclllaaajjjjjjcccccclccccccjjjjjjjajjjji",
+"ijjjaaaaaaaaaaaaaahhhaaaaaaaaaaaaaaaaahaaaaaaa`llllllllllllllaaajjjjjjcccccclccccccjjjjjjgajjjji",
+"ijjjaaaaaaalaaaaaaahaaaaaaaaaaaaaaahaahaaaaaa``llllllflllllllaaajjjjjjcccccclccccccjjjjjjjajjjji",
+"ijjjaaaaaaaaaaaaaalhaaaaaaaaaaaaaaahhhhhaaaaa``lllllcllllllllaaajjjjjecccccccccccccejjjjjjajjjji",
+"ijjjaaaaaaaaaaaaaahhaaaaaaaaaaaaaaaaaclaaaaac``llllclllllllllaaajjjjjjcccccccccccccjjjjjjjajjjji",
+"ijjjaaaaaaaaahhhghlhhhghhaaalaaaalaaaahaaaaca``lllllallllflllaaajjjjjjcccccccccccccjjjjjjjajjjji",
+"ijjjaaaaaaaaaalhghlhhhglaaaaaaaaaaaaaaaaaacac`cllllllallcllllaaajjjjjjcccccclccccccjjjjjjjajjjji",
+"ijjjaaaaaaaaaaaalhlhhlaallllllllllllllllacacac`llllllllllalllaaajjjjjjcccccclccccccjjjjjjjajjjji",
+"ijjjaaaaaaaaaalllllllllclfllllllllllllllcacac``llllllllllllllaaajjjjjjcccccclccccccjjjjjjjajjjji",
+"ijjjlllllllllclflllllllclllhallhallhalllacaca``llllllllllclllaaajjjjjjcccccclccccccjjjjjjjajjjji",
+"ijjclflllllllclllhalhalclllhallhallhalllcacac``llllllllllllllaaajjjjjecccccccccccccejjjjjjajjjji",
+"ijcclllhalhalclllhalhalcllllllllllllllllacaca``llllllllllllllaaagjjjjjcccccccccccccjjjjjjjajjjji",
+"ijcclllhalhalclllllllllcllllllllllllllllcacac```````c``````aaaaajjjjjjcccccccccccccjjjjjjjajjjji",
+"ijcclllllllllclllllllllcllllllllllllllllacaca``````c`````aaaaaaajjjjjjcccccclccccccjjjjjjjajjjji",
+"ijcclllllllllclllllllllcllllllllllllllllcacaccccccccccccaaaaaaaajjjjjjcccccclccccccjjjjjjjajjjji",
+"ijcclllllllllclllllllllclllhallhallhalllacaccccccccccccaaalaaaaajjjjjjcccccclccccccjjjjjjjajjjji",
+"ijcclllllllllclllhalhalclllhallhallhalllcaccccccccccccaaaaaaaaaajjjjjjcccccclccccccjjjaaaaajjjji",
+"ijcclllhalhalclllhalhalclfllllllllllllllacccccccccccccccaaaaaaaajjjjjecccccccccccccejjajjjjjjjji",
+"ijcclllhalhalclflllllllcllllllllllllllllccccccccccccccccaaaaaaaajjjjjjcccccccccccccjjjajjjjjjjji",
+"ijcclflllllllclllllllllcbbbbbbbbbbbbbbbllaaaaaaaaaaaccccaalaaaaajjjjjjcccccccccccccjjjajjjjjjjji",
+"ijcclllllllllcbbbbbbbbbbbbbbbbbbbbbbbbelllaaaaaaaaaaccccaaaaaaaajjjjjjcccccclccccccjjjajjjjjjjji",
+"ijcbbbbbbbbbbbbbbb```bbbb``bbbb```bbbeelllhaaaaaaaaaccccaaaaaaaajjjjjjcccccclccccccjjjajaaajjjji",
+"ijcbbbbbbcccbbbbbbcccbbbbccbbbbcccbbeeelllaaaaaaccaaccccaaaaaaaajjjjjjcccccclccccccjjjajcccjjjji",
+"ijjgggggccccggggg`cccggg`ccggg`ccc``ebelllllaaaaaaaaccccaalaaaaajjjjjecccccclccccccejjajjjjjjjji",
+"ijjjjjaaaaaaaacccccccccccccccccccc``eeellllllaaaaaaaccccaaaaaaaajjjjjjcccccccccccccjjjajjjjjjjji",
+"ijjjjac`aaaagggaaaaaaaaaacc```cccccc`eellllllaaaaaaaccaaaaaaaaaajjjjjjcccccccccccccjjjajaaajjjji",
+"ijjjac```aaagggaaaaaaaaaaaa```aaaaaa`belllhhllllhhllccaaaaaaaaaajjjjjjcccccccccccccjjjajcccjjjji",
+"ijj`a```aaaaaaaaaaaaaaaaaaaaaaaaaa``eeelllaallllaallccahaalaaaaajjjjjjcccccclccccccjjjajjjjjjjji",
+"ijclaa`aaaaaaaaaaaaaaaaaaaaaaaaaaag`ebelllllllllllllcclhaaaaaaaajjjjjjcccccclccccccjjjajjjjjjjji",
+"ijccaaaaaaaacccccccccccccaaaaaaaaag`eeelllllllllllllcchhaaaaaaaajjjjjjcccccclccccccjjjajaaajjjji",
+"ijccaaaaaaacccaccaccacccccaaaaaaaag`eeelllllllllllllcchhaaaahaaajjjjjecccccclccccccejjajcccjjjji",
+"ijclaaaaaaccccccccccccccaccaaaaaaa``eeelllhhllllhhllcahhaaahhaaajjjjjjcccccccccccccjjjajjjjjjjji",
+"ijccaaaaaacggggggggggggccccaaaaaaaaa`belllaallllaallaahhhhhhhaaajjjjjjcccccccccccccjjjajjjjjjjji",
+"ijccaaaaaacgggggggggggggcccaeeaaaaaa`eelllllllllllllaahhhhhahaaajjjjjjcccccccccccccjjjajjjjjjjji",
+"ijclaaaaaacccccccccjjjjjcacaeeaaaaaaeeelflllllllllflcahhaaaaaaaajjjjjjcccccclccccccjjjajjjjjjjji",
+"ijccaaaddacccccccccjjjjgcccaeeaaaa``eeelllllllllllllcchhaaaaaaaajjjjjjcccccclccccccjjjajjjjjjjji",
+"ijccaaaddacccccccccjjjjjcccaaaaaaag`eecccccccccccccccchhaaaaaaaaajjjjecccccclccccccejjajjjjjjjji",
+"ijclaaaddacccccccccjjjjjcacaaaaaaag`eblaaaaaaaaaaaaccalhaalaaaaaaaaaaacccccclccccccjjjajjjjjjjji",
+"ijccaaaaaacccccccccjjjjgcccaaaaaaag`eelllhhllllhhllcaaahaaaaaaaaaaaaaacccccccccccccaaaajjjjjjjji",
+"ijccaaaaaacccccccccjjjjjcccaaaaddag`eelllaallllaallcaaaaaaaaaaaaaaaaaacccccccccccccjjjjjjjjjjjji",
+"ijccaaaaaacccccccccjjjjjcacaaaaddag`belllllllllllllcaaaaaaaaalaalaalaacccccccccccccjjjjjjjjjjjji",
+"ijccaaaaaacccccccccjjjjgcccaaaaddag`eelllllllllllllcaaaaaaaaaaaaaaaaaacccccclccccccjjjjjjjjjjjji",
+"ijclaaaaaacccccccccjjjjjcccaaaaaaa``eelllhhllllhhllcaaaaaalaaaaaaaaaaacccccclccccccjjjjjjjjjjjji",
+"ijccaaaaaac```````jjjjjjcacaaaaaaaaa`elllaallllaallcaaaaaaaaaaaaaaaaaacccccclccccccjjjjjjjjjjjji",
+"ijccaaaaaac``````jjjjjjjcccaaaaaaaaa`elflllllllllflcaaaaaaaaaaaaajjjjecccccclccccccejjjjjjjjjjji",
+"ijclaaaaaaacjjjjjjjjjjjcccaaaaaaaa``eelllllllllllllcaaaaaalaaaaajjjjjjcccccccccccccjjjjjjjjjjjji",
+"ijccaaaaaaaacccccccccccccaaaaaaaaag`ecccccccccccccccaaaaaaaaaaaajjjjjjcccccccccccccjjjjjjjjjjjji",
+"ijccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag`elaaaaaaaaaaaaccaaaaaaaaaaaajjjjjjcccccccccccccjjjjjjjjjjjji",
+"ijclaaaaaaaaaaaaaaagggaaaaaaaaaaaag`elllllllllllllcaaaaaaaaaaaaajjjjjjcccaaacaaacccjjjjjgjjjjjji",
+"ijccaaaaaaaaaaaaaaagggaaaaaaaaaaaa``elllhhllllhhllcaaaaaaaaaaaaajjjjjjcccccacacccccjjjjjjjjjjjji",
+"ijcccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`lllaallllaallcaaaaaaaaaaaaajjjjjjccccaacaaacccjjjjjjjjjjjji",
+"ijccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`lflllllllllflcaaaaaaaaaaaaajjjjjecccccacacacccejjjjjjjjjjji",
+"ijjccclccclcclccclccclcclcaaaaaaaa``elllllllllllllgjjjjjjjjjjjjjjjjjjjcccaaacaaacccjjjjjjjjjjjji",
+"ijjjcccccccccccccccccccccccaakkaaag`eccccccccccccggjjjjjjjjjjjgjjjjjjjcccccccccccccjjjjjjjjjjjji",
+"ijjjjgggggggggggggggggggcccaakkaaaj`ccccccccccccgggjjjjjjjjjjjjjjjgjjjclclclclclclcjjjjjjjjjjjji",
+"ijjjjjjggggggggggggggggggccaakkaaajjjggggggggggggggjjjjjjjjjjjjjjjjjjjclclclclclclcjjjjjjjjjjjji",
+"ijjgjjjjjjjjjjjjjjjjjjjjcc`aaaaaaajjjjgggggggggggggjjjjjjjjjjjjjjjjjjjcccccccccccccjjjjjjjjjjjji",
+"ijjjjjjjjjjjjjjjjjjjjjjjcc`aaaaaajjjjjjjjjjjjjjjjjjjjjgjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjji",
+"ijjjjjjjjjjjjjjjjjjjjjjjccaaaaaaajjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfjfjfjfjfjfjfjjjjjjjjjjjji",
+"iiiiiiiiiiiiiiiiiiiiiiiiicaaaaaaiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"
+};
diff --git a/images/background-micropolis.xpm b/images/background-micropolis.xpm
new file mode 100644 (file)
index 0000000..a61194d
--- /dev/null
@@ -0,0 +1,1162 @@
+/* XPM */
+static char *background_micropolis[] = {
+/* columns rows colors chars-per-pixel */
+"1200 900 256 2",
+"   c #0D1928",
+".  c #0F2B0D",
+"X  c #133510",
+"o  c #142637",
+"O  c #252918",
+"+  c #2D312E",
+"@  c #383938",
+"#  c #080F14",
+"$  c #142A47",
+"%  c #1B3657",
+"&  c #193349",
+"*  c #1D3C65",
+"=  c #183971",
+"-  c #2A374E",
+";  c #223D67",
+":  c #223E68",
+">  c #2C3770",
+",  c #1B1956",
+"<  c #1D5918",
+"1  c #194715",
+"2  c #087609",
+"3  c #205C1A",
+"4  c #2E502C",
+"5  c #374438",
+"6  c #24651D",
+"7  c #2D692B",
+"8  c #2A7723",
+"9  c #1E4329",
+"0  c #1C426A",
+"q  c #1C4873",
+"w  c #2F484F",
+"e  c #254567",
+"r  c #22416B",
+"t  c #26486A",
+"y  c #254673",
+"u  c #2E5676",
+"i  c #37676D",
+"p  c #4F362E",
+"a  c #463A37",
+"s  c #632F24",
+"d  c #483B45",
+"f  c #523666",
+"g  c #524B33",
+"h  c #474438",
+"j  c #5F6B2E",
+"k  c #6D4D35",
+"l  c #4F524C",
+"z  c #504C4A",
+"x  c #596358",
+"c  c #4E6773",
+"v  c #6D544E",
+"b  c #726752",
+"n  c #5F626D",
+"m  c #155286",
+"M  c #195586",
+"N  c #1A5588",
+"B  c #1E5889",
+"V  c #1C5886",
+"C  c #235A8A",
+"Z  c #2A5C8C",
+"A  c #275884",
+"S  c #385986",
+"D  c #2D608C",
+"F  c #296387",
+"G  c #2A6592",
+"H  c #32628E",
+"J  c #38648E",
+"K  c #386685",
+"L  c #346490",
+"P  c #3A6690",
+"I  c #3C6891",
+"U  c #356995",
+"Y  c #377296",
+"T  c #2E73A7",
+"R  c #1877BC",
+"E  c #1279C3",
+"W  c #403AB0",
+"Q  c #455687",
+"!  c #445689",
+"~  c #43598B",
+"^  c #415985",
+"/  c #495590",
+"(  c #425E90",
+")  c #426B93",
+"_  c #496D94",
+"`  c #467597",
+"'  c #506D8F",
+"]  c #4C6E8F",
+"[  c #4C77A3",
+"{  c #667492",
+"}  c #6B61A4",
+"|  c #5152AD",
+" . c #5D63EC",
+".. c #5B63F2",
+"X. c #6365E6",
+"o. c #6466E9",
+"O. c #6768F1",
+"+. c #6862D3",
+"@. c #2C3498",
+"#. c #36972C",
+"$. c #308727",
+"%. c #3DAA32",
+"&. c #3AA530",
+"*. c #39A12F",
+"=. c #178E11",
+"-. c #00DB00",
+";. c #0BDB05",
+":. c #17D80A",
+">. c #00E300",
+",. c #05E801",
+"<. c #2ECD15",
+"1. c #2DD41F",
+"2. c #5E912F",
+"3. c #42AD38",
+"4. c #51B52C",
+"5. c #6FAD34",
+"6. c #54B54A",
+"7. c #63BB5A",
+"8. c #63A261",
+"9. c #4DC526",
+"0. c #75C36D",
+"q. c #39985A",
+"w. c #1B85B9",
+"e. c #3484B5",
+"r. c #1986C6",
+"t. c #1D88C7",
+"y. c #1282C4",
+"u. c #238BC9",
+"i. c #2A8EC9",
+"p. c #2489C5",
+"a. c #2D90CB",
+"s. c #2792C7",
+"d. c #318DCA",
+"f. c #3394CC",
+"g. c #3896CD",
+"h. c #3B99CE",
+"j. c #3795CA",
+"k. c #3595D0",
+"l. c #3C99D0",
+"z. c #3798D2",
+"x. c #30A1DC",
+"c. c #51839C",
+"v. c #4E8699",
+"b. c #4C87AE",
+"n. c #5792AF",
+"m. c #6E92B0",
+"M. c #718EA1",
+"N. c #6499A8",
+"B. c #79BBB6",
+"V. c #6AA9AD",
+"C. c #62AA98",
+"Z. c #4898CA",
+"A. c #429CD1",
+"S. c #489ED3",
+"D. c #499CD7",
+"F. c #5599C6",
+"G. c #46A1D4",
+"H. c #4BA1D4",
+"J. c #4CA9D4",
+"K. c #56A6CE",
+"L. c #52A5D6",
+"P. c #54A6D8",
+"I. c #55A8D5",
+"U. c #55A8D8",
+"Y. c #59A6D5",
+"T. c #5BAAD8",
+"R. c #59AAD6",
+"E. c #5AB4D7",
+"W. c #4BA7CE",
+"Q. c #679AC3",
+"!. c #65AAD5",
+"~. c #62ADDB",
+"^. c #69AEDD",
+"/. c #65B0DB",
+"(. c #6AB2DC",
+"). c #64BBDA",
+"_. c #70B5DE",
+"`. c #72B8DE",
+"'. c #79B7DB",
+"]. c #6BA8CC",
+"[. c #65B0E2",
+"{. c #6AB4E0",
+"}. c #72B5E0",
+"|. c #74B8E1",
+" X c #78B6E3",
+".X c #7ABBE2",
+"XX c #62AEE1",
+"oX c #659FEC",
+"OX c #76C5A1",
+"+X c #70C7DB",
+"@X c #76CEEA",
+"#X c #79CAE0",
+"$X c #7CD2E0",
+"%X c #70CCF1",
+"&X c #5EC0D8",
+"*X c #935D35",
+"=X c #B1452A",
+"-X c #90574F",
+";X c #8F6853",
+":X c #A86F5F",
+">X c #CF7A58",
+",X c #CD7C62",
+"<X c #C67966",
+"1X c #DA7768",
+"2X c #D37B64",
+"3X c #C87973",
+"4X c #E4736C",
+"5X c #E37A50",
+"6X c #9B709B",
+"7X c #856BC8",
+"8X c #C37784",
+"9X c #8A9E3A",
+"0X c #949848",
+"qX c #8BA343",
+"wX c #B08C54",
+"eX c #9C9870",
+"rX c #82C97B",
+"tX c #C8835B",
+"yX c #D08267",
+"uX c #E48B5D",
+"iX c #D8B939",
+"pX c #8596AC",
+"aX c #93A8B7",
+"sX c #969798",
+"dX c #81BDE3",
+"fX c #9AB8E3",
+"gX c #A9B7C7",
+"hX c #8CAED3",
+"jX c #91CF8C",
+"kX c #ABD7A8",
+"lX c #A0D5AB",
+"zX c #83C0E5",
+"xX c #8AC4E6",
+"cX c #8CC5E8",
+"vX c #87C9E7",
+"bX c #84D5E2",
+"nX c #90C6E8",
+"mX c #93C9E9",
+"MX c #98CAE8",
+"NX c #93D9EA",
+"BX c #A3C9E5",
+"VX c #ADD9EE",
+"CX c #A9D3EB",
+"ZX c #AED5F0",
+"AX c #AED8F0",
+"SX c #A4DBF4",
+"DX c #B1D6F2",
+"FX c #B0D8F1",
+"GX c #B9DDF3",
+"HX c #B1D4E9",
+"JX c #9ACFD9",
+"KX c #C8968E",
+"LX c #FBFCFC",
+"PX c #E7F5F7",
+"IX c #CEE2E7",
+"UX c #C1E4BD",
+/* pixels */
+"_ _ ` _ _ ` _ ` _ _ _ ` ' ` ' _ ' _ ` _ _ ` ` _ ' ' _ _ ' ` _ ' [ ' _ ' [ ` ' ` ` _ ' _ ` _ _ ' ` _ [ ' _ ` _ _ ` _ [ _ I _ _ ` _ K _ ` ' ) ) _ _ ` ) ) ) ) ) P ) I P I ) P P P J J J K D P U H Z H Z Z Z H D D D H D Z D Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z A D C D Z Z C D Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z D Z C Z D Z Z Z C F Z Z C Z Z F Z C C Z B Z B C C B B B C V D B B B N B N C N B B N N B C N B N B m C N m N B N A N N N M C m m M V V V m M N C u m N G E e.k.i.i.a.a.s.i.i.i.i.i.a.a.a.a.a.a.a.a.a.a.a.a.x.a.a.a.a.u.a.i.i.f.i.k.f.g.g.g.g.g.g.h.h.h.h.h.A.Z.h.A.S.A.A.G.A.G.A.G.G.S.H.S.S.H.H.H.H.H.K.H.H.L.L.G.L.H.H.U.K.S.L.L.L.L.L.Y.I.L.U.U.P.U.U.L.Y.U.L.Y.Y.T.T.T.T.~.~.~././././././.(./.(././././././.(.~.[.T.(.~.(.(.^.(.`.`.^._._.|.|. X_.(.|.|.}.|.|._._.|._._._._._. X_._._.}.}.}.}.|.'.|.|..X|.|.|.|.|.|. X X|.'.|. X|..X.X X|.|.|.|._._._.|.(.`.`.(.|.(._.{._._.(.(.(.(.(.^.(.(.~.(.(.(.~.(.~.~./.(.~.^.(.[./.[./.~.{.[.^.~.(.~.~.~.~.~.T.T.I.~.~.~.I.I.Y.P.P.P.L.L.D.H.U.L.S.L.L.L.G.L.G.D.G.L.D.H.H.H.H.H.H.H.H.A.S.A.S.S.S.S.S.S.G.G.H.G.H.H.H.S.H.H.D.U.L.L.L.L.L.Y.U.U.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.~.~././././.^.(._.|.`._.|..X.X.X.X.X.X.X.X.X.X.XzX.X.XzX.X.XzXzXdXdXzX'..XzX.XzXzXzXzXzXcXdXvXdXdXdX XdX X.XdX.X.X'.xX.X'..X.X.X.X`.'..X|.|._._.|._._._._._.^.(.(.(.(.(./././././././.[./.^.!./././.~.~.~.~.R.~.T.~.~.T.~./.~.~.~.{.!.^.^./.^.(./.(./.(.(.(.(.(.(._._.|.^.|.|.|..X.X.X.X.X.XzXzX.XzXzXzXdXcXzXzXdXcXdXnXvXdXdXcXdXdXcXdXzXzXdXzXzXzXdXdXdXdXzXcXdXcXcXcXcXxXcXzXcXzXvXmXxXxXxXxXxXxXxXvXdXcXcXcXnXnXxXnXcXfXJXzXnXcXcXcXnXnXdXnXcXdXxXxXxXxXxXxXxXxXxXxXxXdXdXcXvXzXzXzXdXxXdXdXdXzX.XxX.X.X.X'.|.|.|.|.|._.^.`.^.(.(.(./././.T./.T.T.T.T.T.T.I.U.U.P.P.L.L.U.L.S.H.G.A.G.A.A.A.Z.h.A.A.A.A.A.h.A.h.A.h.h.h.h.g.j.k.j.a.a.g.a.f.a.f.a.a.a.f.f.f.a.z.g.z.a.z.k.a.g.g.g.z.h.h.g.f.z.j.j.k.h.h.f.f.g.j.f.g.f.g.f.h.h.f.h.k.g.g.k.g.f.f.h.f.f.a.f.a.a.f.a.a.a.a.a.a.a.i.i.u.s.i.u.u.u.t.u.i.i.i.i.u.i.i.i.i.i.d.i.i.z.d.k.d.g.a.a.a.a.f.a.a.f.f.f.k.f.g.g.h.h.h.h.A.h.h.D.z.A.A.h.A.A.A.h.G.G.G.G.G.S.H.H.S.H.H.S.U.L.H.U.L.Z.U.L.S.U.L.H.H.F.K.A.H.U.L.H.L.H.H.H.L.H.L.H.L.S.L.L.S.L.L.L.L.L.L.S.U.L.S.L.L.L.S.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.Z.H.H.H.H.H.H.A.H.H.H.H.U.P.P.L.L.L.L.P.P.P.D.U.P.U.P.T.P.T.U.P.U.T.T.U.T.I.I.U.U.L.L.L.U.L.L.L.L.U.L.U.L.Y.Y.I.U.T.T.T.U.T.T.~.T.~.~.~.~.(.~.^./.^.(./.(._.(.|.(.(.^._.|._.|._.|.|.|.|..X.X.X.X.X.XdX.X.X.X.X|..X|.'.'.|.|._.|.|.`.|.|.`..X`.'. X|.'.|.|.|.|._._.|._._.(.(.(.(.(.(.(.^.(.",
+"_ _ _ _ _ ) ` _ _ _ _ _ _ ` _ _ ` _ ` ' _ _ _ ` ' ` ' _ _ ' _ _ _ _ ` ' ' ' [ ' [ ' [ ' ` ' ' [ _ _ ` _ _ _ _ _ _ _ _ _ ' ) ' ` ` _ _ _ _ ) _ _ _ I I ' ) ) ) ) ) I ) I P P P P L J J G H H H H L H H H Z H D D Z D H Z F Z Z Z Z Z Z Z C Z Z Z Z C Z Z Z Z Z D Z C D Z Z D F Z D Z Z Z Z Z Z Z H Z D F D Z Z Z F Z C F Z G Z Z D C C Z C Z Z C C C V Z B C C B C V C C N N B B V C V B M C N N M C N B B N N C N C N N M M N N M M V A N M B N M N N N B m m C e.i.k.d.f.i.s.a.i.i.i.i.i.a.a.a.a.a.a.a.a.a.a.a.a.a.a.k.a.a.a.a.i.i.i.z.f.f.f.g.g.g.g.k.z.h.h.h.h.h.h.A.h.A.A.S.A.G.A.H.H.H.S.G.H.S.H.H.H.H.H.D.H.H.H.I.L.G.L.H.S.H.H.H.H.L.L.L.I.L.L.U.L.P.P.L.L.L.U.P.Y.Y.T.T.~.T.T.~.T.~./.(./.(./.(./.(././././././.~.~.~.~.~.E.{.^.(.(.^.`._.`.{._. X_.|._.|._.|.|.[.|.|.[.|._._._._._. X_._._.}.}.}.|.|.|.|..X.X|..X|.'..X|.|..X|.|..X'.|.|.|.|.|._.|.(.|.|.{.|.(.^.`.|.|._._.{.(._.(.(.(.(.(.^.(.(.(.(././.(.(.~././.^.~.(././.(.~.(.~.E.^.(.~.~././.~.~.~.~.~.T.I.T.I.~.P.Y.P.P.P.L.L.L.L.S.F.L.G.H.L.G.G.P.G.P.H.D.S.U.H.H.H.H.G.G.S.S.S.S.S.S.S.S.S.S.S.S.H.H.H.H.H.H.L.P.L.S.L.L.L.L.T.U.U.T.T.T.~.T.T.[.T.T.T.U.P.[.T.T.T.~.~.~.(.~././.(.(.(._._.|.'.|.|..X.X.X.X.X.X.X.X'..XzXxX.XzXzXdX@X@XzXdXdX.XzXzXzX.XzXzXzXdXdXdXdXdXdXcX.X.XdX%XvX'.zX@XzXzX.X.X.X.X.X|.|.|.|.|._._._._.{._._._._.(.(.(.(.[.(././.(./.(./././././.~.~.R.!.R.~.T././.R.~.~.T.~.~./.^.E.^.(.^.(.(.^.(./.(.(.(.(.(.(.(.^.|._.|.|.|.|.|..X.X X.X.XzX'..XzXdX#XdXdXzXzXvXdXnXdXdXnXcXcXcXdXmXdXzXzXvXdXzXzXxXdXdXmXdXzXcXdXxXcXdXJXfXnXnXcXxXcXcXcXcXvXxXxXxXxXcXcXcXmXxXxXcXnXxXnXcXnXxXmXcXmXnXcXmXmXnXnXxXxXxXxXxXxXcXcXdXcXxXcXcXcXzXzXzXzXdXdXdXdX.X.XzX.XzX.X.X.X.X|.|._.|.{._.`.(.(./.(.^./././.~.~.~.T.~.T.T.I.Y.U.P.P.L.L.S.L.H.H.A.A.A.G.A.G.A.A.A.A.h.A.A.A.h.A.h.h.h.h.h.l.f.z.j.z.z.g.g.f.z.a.z.a.g.f.f.f.g.a.a.g.k.g.g.g.g.g.g.z.x.h.g.g.h.a.a.h.f.f.k.g.f.f.g.g.f.f.j.g.f.h.f.h.g.g.h.g.k.j.s.f.f.f.a.f.a.a.a.a.a.a.a.a.i.i.i.s.u.i.i.u.u.f.i.i.i.i.i.i.i.i.i.a.i.i.i.i.i.i.a.i.a.a.a.a.a.a.f.a.f.f.k.k.g.g.g.k.l.l.z.l.z.h.l.h.l.A.A.A.A.G.A.A.G.G.G.G.S.H.S.S.H.H.H.L.L.S.U.S.L.L.S.U.U.S.L.S.D.H.H.H.H.S.L.G.S.L.L.L.L.L.L.H.U.S.L.L.U.S.L.L.L.L.S.L.L.S.U.L.U.S.H.H.H.H.H.S.H.H.S.H.H.H.H.H.H.H.H.H.H.H.Z.H.H.H.H.H.H.H.U.S.l.L.L.L.L.P.P.P.P.P.P.P.P.P.P.T.T.U.T.P.T.T.U.T.I.U.Y.I.I.I.U.I.L.U.L.L.L.L.U.U.U.U.T.U.T.T.T.T.T.T.T.~.~.~.~.~./.~././././.(./.(.(.(.(.|.[.^.{._.|.|._.|.|..X.X.X.X'..X.X.X.X'..X.X.X|..X`.'.|.|.|.|.|.|.|.`.|.`..X.X|. X|.|.'.|.|.|.|._.|._._.(.(.(.(.(.`.(.{.",
+"` _ _ ` _ [ _ _ _ _ _ _ _ _ ` _ ' ) _ ) _ _ _ _ _ _ ' ` _ _ _ _ ' _ _ ' ' ' _ ' ' _ _ ' _ ' _ _ _ ' _ _ ` _ _ _ ' _ _ _ ) ' ) ` _ ' ) ' _ _ ) _ _ ) ) ) I ) ) ) I I I I P P P P L J H J P P H H H H Z H Z Z Z Z Z Z Z D F D D Z D Z Z D Z Z Z Z D Z D D Z Z Z Z D D Z Z Z D A Z D Z Z D D F Z Z H F Z G Z Z F D F Z Z Z F Z C Z D Z Z C Z Z C C V Z C B Z B C B B B C B B N B B N V M C B B N C B C C C B B B B N N B B N N N B M N M N N N N N M N m A m m N T u.g.i.a.a.f.i.i.a.i.a.i.i.i.a.a.a.a.a.a.a.a.a.a.u.a.a.u.a.a.u.a.i.f.i.f.f.f.k.g.k.h.k.h.h.h.h.h.A.h.A.A.A.A.A.H.H.A.Z.A.A.S.S.S.H.Z.H.S.S.H.H.S.H.H.H.H.S.H.H.L.H.H.L.H.L.L.H.L.L.L.L.Y.P.P.U.U.U.Y.U.P.T.P.T.T.T.~.~.~.(.!././././.(././././././.(.!./.~./.~.~.!.(././.(.(.(.(.{.|.|._.|.|.`.`.|._.|._.|._.|._._._._._._._. X_.}._.}.}._.|.|.|.|.|. X.X|..X.X|..X.X|..X.X|..X X'.'.|.`.|._.`.(.^.|.(.`.(.^.^.`.|.`.^.|.{.^.^.(.(.(.(./.(.~.~.(././.T.(./.^././.^.^././.(.(.~.^././.!.^./.~.T.~.T.~.~.~.T.T.~.Y.P.P.P.L.L.L.L.S.D.L.L.A.D.L.G.L.D.D.L.G.S.L.U.L.H.H.K.H.G.S.S.S.S.S.S.S.S.S.G.S.S.S.G.H.G.H.H.H.L.S.L.L.Y.L.U.T.U.T.T.T.T.T.T.T.T.T.T.T.T.P.T.T.T.~.~.~.T.~././.(.(.(.(._._.^.|.|.'..X.X.X.X.X.X.XdX.X.X'..XzX.XzX.XdXdXzX.X'.zXzX.XzX.XzX.X.XzXcXdXdXdXcXvXdX.XdX.X.XdXzX.X'.xX.X.X.X.X.X X.X'.|._._.|.|.|._.}._._._._.^.^.(.(.^./././././.!./././.^.^././.~.(.~.~./.~.!./.~.~./.~./.~./.^.~.(.(.(.[.(.(.(./.(.(.(.(.(._._._._.|.|.|.|.|..X.X.X.X.X.XzXzX.XzX.X.XmXzXzXnXvXvXdXcXcXdXdXcXdXdXdXzXzXzXzXnXnXdXdXdXzXnXdXxXxXcXxXdXmXcXnXnXnXdXnXcXcXdXJXxXxXxXcXcXcXcXcXxXnXnXnXvXcXnXnXnXnXmXnXcXmXnXcXcXcXcXxXxXxXxXxXcXcXcXxXxXxXxXdXcXzXzXzXzXzXzXdXzXzX.X.X.X@X.X.X.X|.|.|.|.}.}.^.(.(.(.(.(././.~.T.~.~.I.T.T.I.I.U.U.Y.L.P.L.L.U.H.H.S.S.A.A.A.A.G.A.A.A.A.A.A.h.A.h.A.j.h.h.h.l.h.z.g.z.g.a.f.f.a.d.a.a.g.a.f.f.g.f.f.g.a.z.a.g.g.k.h.g.z.h.l.j.z.k.j.f.f.g.g.g.j.f.f.g.g.g.g.g.f.h.h.z.g.k.k.g.j.k.j.f.z.a.f.z.a.f.a.a.a.a.a.a.a.i.a.i.i.i.i.i.u.s.i.i.i.i.i.i.i.i.a.a.a.d.i.i.d.i.a.a.a.a.a.a.a.a.f.a.f.a.k.k.g.g.k.h.l.l.z.g.l.g.l.z.A.h.A.A.A.A.A.G.A.S.G.G.H.H.H.H.H.H.L.H.L.L.L.L.L.S.S.L.S.Z.D.U.H.H.H.L.H.L.L.S.L.L.L.H.L.L.L.L.S.U.L.L.L.L.L.L.L.L.L.L.L.L.U.D.L.L.S.D.H.H.S.H.H.H.U.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.S.L.S.L.L.L.L.L.P.D.P.P.P.P.P.L.P.T.U.T.U.U.U.P.T.Y.T.T.T.I.Y.U.U.U.U.U.U.L.Y.I.U.T.P.P.Y.U.T.I.Y.T.T.T.T.T.T.T.T.~.~././././././.(./.(.(.(.).(.(.(.^.|._.(._._.|.|. X X.X.X@X X.X.X.X'..X.X.X.X.X.X.X|.|.|. X'.|.|.|.`.'. X|.'.|..X'.|.|.|.|.|.|.{._._._.^.(.(.(.(.(.(.",
+"_ _ _ _ _ _ _ _ _ _ _ _ _ ' _ ` ` _ _ ' ` ' ` _ _ _ _ _ ' [ ' ` ` _ ' [ ` _ ' [ [ ' _ [ ' [ ' ` ' [ ' _ _ _ _ _ ' [ _ _ ) ` ) ' ` _ _ ) _ _ ` _ _ _ ) _ ) _ ) Y ) I I P P P P P J U S J H H H H H H D H H H H H H D D D Z Z Z D C D C Z Z Z Z Z C Z Z Z D Z Z Z Z Z Z Z Z Z Z Z Z Z D Z Z Z Z F Z Z Z Z H Z Z Z C H Z D F Z D Z Z C F D F C Z F C Z B Z B B C C C B B C N V B C V N V N B V C M N N V N B N B N N N N N N N N V M M M M M N N N N C B m m m T T i.i.i.a.a.i.d.i.i.a.i.i.i.a.a.a.a.a.a.a.a.a.u.a.k.u.a.a.u.a.a.a.i.i.f.f.f.k.f.z.k.k.k.h.h.l.h.h.z.A.A.h.h.h.A.A.A.A.G.H.H.G.G.S.H.H.H.H.H.H.H.H.H.H.H.H.L.H.H.L.H.H.L.L.L.L.L.L.U.U.J.K.P.L.L.L.U.L.U.P.T.T.T.T.T.T.T.R.T./././.(.(.(./.(./.(./.[.~.(././.^.~.^././././.[.^.(.`.|._.|._.'._.`.`.{.|.|.|.|.|.`.|._._._. X_._._._._._._.}.|._.`._. X.X.X|. X.X|..X X|..X.X X.X|..X|.|.|._._._.`.`.(.(.(.(.{.|.(._.{.(.|.(.(.|.^.(.(.(././.(.~.(.(././.(.~./.~.~.(./.[././.~.~.~././.~.~.~./.T./.T.~.T.T.T.T.T.T.Y.Y.P.P.L.L.L.S.L.L.L.P.A.A.H.L.G.P.A.L.G.S.S.H.D.H.G.Z.S.S.S.S.S.S.S.S.h.S.S.S.G.H.D.H.H.H.H.H.L.L.S.L.P.L.U.Y.Y.U.U.T.U.T.T.T.T.T.T.T.T.T.P.T.[.T.~.R.R.~.~././.~.(.(.(._.(._._.|.|. X.X.X.X.X.X.XzX.X.XcX.X'.xX.XzX.X.X.XxX.XzX'.dXzXzXzXzXzXzXdXdXvXdXdXdX XdXdXdXdXdXxX.X.X.XzX.X.X.X.X.X|. X'.|.|._.}._.|.}.|.|._.|.|.(.(.(./.(.(.(.(.(./.(./././.~.(./././.~././.~.~.!.~.~././.~././.^.^.(.(.(.(.(.^.(.(.(.(.(.`.(._.^.|.{._.|.`.'..X.X.X.X.X.XdX.X.XzX'.vXzXdX.XzXdXdXvXmXdXnXdXcXdXnX XnXcXzXzXzXdXdXnXcXnXvXcXnXxXxXxXxXnXdXcXdXcXnXdXcXcXcXdXxXxXxXxXxXcXcXcXcXMXxXnXnXMXxXnXnXnXnXnXmXnXnXnXcXdXmXcXxXcXcXcXcXnXdXcXcXcXxXxXxXzXzXzXzXzXzXdXzX.XzX.XzX.X.X.X.X'.|.{.|._.|.[.^.(.(.(.(.(./.(./.~.~.~.Y.~.~.T.T.T.T.L.L.L.L.L.D.H.H.S.S.H.h.G.G.A.A.G.Z.A.A.A.A.h.A.h.h.h.h.h.h.z.l.j.a.g.a.d.a.a.g.g.g.f.g.z.a.a.g.a.z.g.g.g.g.g.k.h.h.h.z.k.g.h.g.h.z.g.g.f.g.f.g.g.g.g.g.g.g.h.z.z.a.g.f.g.g.h.f.z.f.f.k.a.s.a.a.k.a.a.a.a.a.a.a.a.i.i.u.i.i.s.s.i.s.a.i.i.i.a.i.s.a.k.i.a.a.i.a.d.d.a.a.f.a.f.a.f.k.f.k.k.k.k.k.h.f.k.l.g.z.g.z.z.D.h.A.h.A.A.A.A.A.Z.H.A.A.G.H.H.H.H.H.H.H.H.H.L.S.L.L.L.L.U.L.U.S.K.L.L.H.U.D.L.L.L.L.L.L.L.L.L.L.L.L.L.L.U.U.L.Y.P.P.U.L.L.S.L.L.L.S.L.L.H.H.H.H.H.L.S.H.H.H.H.S.H.H.H.H.S.H.H.H.H.A.H.H.S.S.L.L.L.L.L.P.L.L.P.P.L.L.P.U.P.P.T.P.U.Y.Y.T.T.Y.T.Y.T.T.Y.T.U.T.U.U.U.T.K.U.P.P.P.Y.T.I.U.T.T.Y.T.T.T.T.~./.~./././././././.(./.(./.(.(.(.(.(.(.(.^._._._._._.|.|..X'.'. XdX.XdX'..X.X.X.X.X.X.X.X.X|..X.X X.X.X.X|.|.|..X|. X|..X X|.|.|._._.|._._.|.(.`.(.(.(.|.(.",
+"_ _ _ _ ` _ [ _ ) ' _ _ ` ) ` ' _ _ ` ` ' [ _ _ ' [ _ ' ` _ _ ' ' _ [ ' [ ' ` ' ` ' ' _ _ ` [ ' ` _ ' _ _ ` _ ' ` _ _ ` ` _ _ _ ` _ ) ' _ ) _ _ ) _ ) _ ) ) ) ) I I I I ) P P P P P J J L H P H H H H H H Z Z Z D Z D Z Z D Z D Z Z Z Z Z Z Z Z D D D Z Z Z L Z Z Z Z H H H Z Z Z Z H D Z Z Z Z Z Z Z D H Z Z D Z Z F D G Z Z D D C Z Z C u Z Z Z B B Z V B C B C B C N C B B C C M N C M V M C C M N C M B M B M N N N N V V N M N M M N N N N N N B B M M G R a.a.k.a.a.a.i.k.a.a.a.a.i.a.a.a.a.a.a.i.i.k.a.a.a.i.i.a.a.a.a.a.a.i.z.k.f.f.g.g.h.g.k.g.h.h.k.h.A.j.A.A.h.A.A.A.A.A.A.H.G.A.H.H.H.H.H.H.Y.A.S.H.H.H.H.H.H.H.L.L.H.H.L.H.L.L.U.S.L.L.P.L.P.L.L.U.U.U.L.L.U.T.T.U.T.~.T.~.~.~./.(.(./././.(./.(.^.(.(.~.(././.!./././.(./.(.(.(.(.`.^.`.|._.|.`.`.`.`.`.|.|.|.|.`._._._._._._._._._._._._. X_.|.`. X X X X.X.X|..X.X|..X X|..X.X|.|.|.|.|.|._.^.^.(.(.(.(.(.`.(.(._.^.(.(.(.(.(.(./././.^./././.~.~.^.~.~.~.~.(././././././.~././.~.~.!.R./.Y.T./.~.T.T.T.T.T.T.U.T.P.P.U.P.D.P.P.D.L.S.H.H.S.H.H.S.H.H.G.L.S.L.L.H.H.H.H.S.S.H.A.S.A.S.A.S.S.S.S.A.H.S.H.H.H.H.L.S.L.L.L.U.U.U.T.T.T.U.T.T.T.T.T.T.P.T.Y.T.T.T.[.Y./.U.~.!.~././.(.(.^.(._._._.|.|.|.|..X.X.X.X.X.X@X X.X.X.XdXdXzXzX.X.XzX.XdX.XdXdXdXzXzX'.xXxXdXdXfXdXdX#XzX.XdX.XzXdX.X.XxX.X.X X.X.X.X.X|.|.|..X|.|.|.|.|.|.|._.|._.(.[.(.(.(.(./.(.(.{././.^.~.(.(./.(.(./././././.T./.~./././././.(.(.(.(.(.(.(.(.~._._.(.`.`._._._._.|.|.|.|..X X.X.X.X.X.X.XzXzX.X'.zXzXzXzXxXcX.XdXdXcXnXdXvXdXdXdXdXdXcXcXzXcXzXxXxXxXcXcXcXxXcXxXxXxXcXcXdXcXcXxXxXxXdXmXcXcXcXcXcXmXcXcXcXnXnXnXnXnXnXnXnXnXnXnXmXnXcXcXcXcXcXcXcXcXcXcXcXcXcXcXxXcXxXvXvXdXcXzXzXzXdXxXdXzXzX.XdXdX'.xX.X.X'..X|._.`.(.(.(.(.^.(.(.(././.!.~.~.~.~.~.T.T.T.I.I.I.U.L.L.H.L.H.H.H.G.A.G.A.A.G.A.A.A.A.A.A.G.A.h.h.A.l.l.h.l.l.l.j.f.f.j.a.f.f.f.f.k.z.a.a.g.i.z.f.d.f.f.f.g.g.g.k.h.l.k.l.z.g.j.j.g.f.z.k.h.f.f.f.g.g.g.f.g.f.h.f.h.g.g.g.g.g.j.g.f.f.f.j.j.i.z.a.f.a.i.a.a.a.a.i.a.i.i.i.i.i.i.a.a.a.i.i.a.a.a.a.a.a.d.a.a.i.d.d.a.a.a.f.f.f.f.f.f.f.k.g.g.g.g.f.h.g.l.l.k.A.g.l.z.A.h.A.h.h.G.h.G.A.G.S.G.W.H.G.H.G.H.H.H.H.K.S.L.L.S.K.S.H.L.L.H.H.L.L.L.H.L.L.J.L.U.L.L.L.L.L.L.P.L.U.U.L.U.L.T.P.P.L.L.L.L.L.L.H.L.H.L.H.H.H.H.S.U.S.H.H.D.H.H.L.L.G.H.H.H.H.H.S.S.L.D.U.S.L.L.U.P.P.L.L.U.P.P.L.P.P.P.P.T.T.T.P.P.P.T.T.T.T.T.T.T.T.U.T.U.T.T.P.Y.U.Y.T.U.T.U.U.T.U.T.T.T.T.T.T.T.T.R.~.~.~.~./././.!.(.^.(.{.`.(.(.(.(.(.(.`.^._.|.|.|.|. X|..X.X.X@XdX.X.XdX.X.X.X.X'..X.X.X.X.X X.X X'. X.X.X|..X|.'.|..X|.|.|.|.}.}.}._.|._.`.(.^.(.`.(.`.",
+"` _ _ _ _ _ _ _ ` ` ` _ ` _ ` ) ' ` ' ) I _ _ _ _ ' ' _ _ _ _ _ [ _ ' _ ' _ ' ` _ ' ` ' ' ' _ ` [ ' [ ' _ ' [ _ _ ` ' ' ' ' ` _ ` _ _ ` _ _ _ ) [ ) _ ) ) I ) P ) ) I ( P I P P J P J J L H H H P H H H H H H H D D F D H D F Z Z D D Z Z D Z D Z Z D Z Z Z Z F D H Z Z F Z Z H Z H Z Z Z Z H H Z G F H D Z D H Z Z H H Z D D Z Z F D C F Z Z A Z Z Z B B Z C C C C C C V C B N N M V N M M C N M C B M V N C V M V B V N N N N M N M M M N V N N V m B M V T a.i.a.i.a.a.a.i.i.a.i.a.a.a.a.a.a.a.a.a.a.i.i.a.a.i.a.a.i.a.a.u.a.i.k.i.z.f.f.f.g.g.g.k.h.h.h.h.h.g.G.g.j.A.A.h.H.h.J.H.A.S.S.A.H.A.H.H.H.H.S.A.H.H.H.H.H.H.H.H.L.H.H.L.L.H.L.S.K.L.L.L.U.L.U.L.L.L.L.Y.U.U.U.U.T.Y.T.T.~.!././.^.(.(.(.(.(.(.(.!.[.(.(.(././././.~.[./.^.(.(.(.(.`.|.{.|.|._.|.`.|.`.|.`.|._.`.`. X_._._._._._._._._._._. X_.|.'.|. X X@X.X.X.X.X X|..X|..X X|. X X|.|.{.}.}.|.(.{.(.(.(.(.(.(.(.|.(.(.(.(.E.(.(.(./.(.^./././.~.~.~.~.~././././././.[./././.~.~.~.~.(.Y.T././.T.T.~.T.T.T.T.T.U.Y.P.P.P.P.U.S.P.L.A.H.D.U.S.D.D.D.S.S.S.D.L.S.S.H.S.U.S.K.H.A.H.S.H.S.S.S.A.S.S.H.H.S.H.H.S.L.H.L.L.U.P.L.L.T.Y.T.U.T.U.T.T.U.T.Y.T.T.Y.T.T.T.T.~./.~.~.~./././.(.^.|.(.(._._._.|.|.|.|..X.X|..X.X.X.XdX.XdX'.dX.XzXzXzX.XzXdXdXvXdXzXdXzXzX.X.X%XdXcXdXdXmX.XzXzXdX.XdX.XzX.X.X.X@X.X|.|..X'..X|. X X|.|.|.|.|.|.|._.|.}.|.(.(.(.(.(.(.(.(.(.^.(.(.(.(.).(./.^./.(./.(.!.(./././././././.(.(.(._.(.(.[._._.(._.`.(._._.|. X|.|.|.|. X X.X.X X@XzX.XzX.XxXxX'.zX.XzX.X.X.XmXcXdXcXcXdXcXcXcXcXnXdXxXcXzXzXxXxXcXxXcXcXcXxXxXxXxXcXcXfXcXcXxXnXnXmXcXcXnXcXcXcXcXcXcXnXnXnXnXnXnXnXnXnXnXcXmXnXnXMXcXmXcXcXnXcXcXcXcXcXcXcXcXcXcXxXcXcXxXcXdXzXcXdXcXdXdX.X.X'.dX@X'..X.X X X|._.`.`.`.`.(.`.(.(.(./././.~.~.T.T.~.T.T.T.Y.U.L.U.U.L.L.L.L.H.H.H.G.A.G.A.A.A.G.A.j.W.A.A.G.A.A.h.A.l.l.l.l.k.j.k.g.f.g.f.k.f.f.k.a.z.f.f.i.g.g.a.z.f.g.a.g.g.k.h.k.l.k.l.h.x.z.g.g.g.f.h.f.h.g.f.h.g.g.g.h.k.f.h.g.g.k.h.g.g.g.a.f.x.a.f.f.a.f.f.a.k.a.k.a.a.a.i.i.i.a.i.i.a.a.a.a.a.f.f.d.a.a.a.a.i.d.a.a.a.i.a.f.a.f.a.a.f.i.j.j.z.a.g.g.g.h.h.A.l.k.z.z.g.k.l.h.h.z.A.h.h.G.h.A.A.A.S.S.S.G.G.H.H.H.H.H.H.H.H.L.L.L.L.L.H.L.L.L.L.L.H.L.L.L.L.L.L.Y.L.U.U.L.U.U.U.L.U.T.U.T.U.P.P.U.L.L.U.L.L.L.L.L.H.U.S.S.L.H.H.L.S.H.H.H.H.H.H.K.H.H.S.H.Z.H.L.S.L.L.L.L.L.A.L.P.P.L.L.D.P.L.P.P.T.P.T.T.U.P.T.P.T.Y.T.T.T.Y.T.T.T.T.T.T.T.T.U.T.Y.T.U.T.Y.Y.U.T.T.T.T.T.T.T.^.T.^.~.~.~./.(.^./././././.(.(.(.(.(./.(.(.(._._.^.|._.|.|..X.X.X.X.X.XdX.X.X.X.XdXdX@X.XdX.X.X.X.X.X.X.X.X.X X.X X|.|. X|. X|.|.}.}.}.}._.|.{.{.`.|.(.(.(.(.",
+"_ _ ` _ ` _ _ _ ' _ ` _ ` _ ' ) ' ) ' ` _ ` ` _ _ _ ' ` ' _ _ ' _ _ ' ` ' ` ` ' [ ' ' [ ` ' [ ' ' ' _ _ [ _ _ _ _ _ _ _ _ _ ' ' ` ' _ _ ` _ _ _ I ) ) ) ) ) ) ) I ) ) P ) P P P J J J J P L J H H H H H H L D Z D Z H D H Z Z Z D Z Z D D Z Z Z Z Z H Z H Z Z D H Z D D Z H H D H D H Z Z L H Z Z Z Z D Z D Y Z D H D Z Z Z Z Z Z Z Z Z F C A Z B Z B Z Z Z V B B C B B B B C N V C C V C M C M N C M C N C M M A M N N A N N N M N M V M N V N N m V V m B T a.i.a.i.d.i.a.i.i.a.d.a.a.a.a.a.a.a.a.a.a.i.i.i.u.a.i.i.a.a.a.a.a.a.a.i.k.f.f.a.z.f.f.g.g.h.h.h.h.A.A.A.A.A.A.A.A.h.A.A.H.S.S.H.A.H.S.H.H.H.H.H.H.S.H.H.H.A.K.L.H.S.L.L.H.L.L.L.L.L.L.U.L.L.L.U.L.L.U.U.U.U.U.U.T.Y.~.Y.~.~./.^./.(.(.(.(.(.!.(.(.^.^.(./././.(.~.(./.^.(.(.(.{.^.^.`.`._.|.|.|.`.|.`.|..X|.|.|.`._.|._._._._._._.[._._._._. X|.`. X X X X.X.X.X X.X.X.X X|. X|.'.|.|._._.}.{._.(.(.(.(.(.(.(.(.(.(.(.(.(.(.{.(.(./.E.(.~.[.E.^.^.^.~.~./././.~././././././.~.[.T.~.(.R.(.T./.T.~.~.T.T.T.T.T.L.T.P.P.P.P.P.H.L.A.D.H.H.H.S.A.D.H.D.H.H.H.S.L.L.S.S.U.H.H.A.H.A.H.S.H.A.S.S.S.S.S.H.A.H.S.H.H.H.L.L.L.L.U.L.Y.L.Y.U.T.U.T.T.T.T.T.T.T.~.P.P.T.T.T./.R.~.~.~.~././.^.(.(.(._._._.|.|._.|.|..X.X.X|.|..X.X.X.X.X.X.XzXzX'..XzX.XzXzXdXdXzXzXdXdXmX.XdXvXzXzXzXdXzX.XzXzX@XdXzX'.zXxX.XdX.X.X.X.X.X.X.X.X|..X|.|.|.|.|.|._._.`.|.^.(.(.{.(.(.(.(.(.(.[.(.(.(.{.(.(.(.(.(.(.^./././.(././.(.(.(.(.(.(.(.(._.(._._._._.`.`.`._.`.`.|.'.|.|..X.X.XdX.XdX.XzX.XxX'.zXzX.XzXzXzXxXxXzXdXcXdXcXdXdXcXmXdXcXdXcXzXxXxXxXxXcXcXcXcXcXcXxXxXxXcXcXcXcXcXcXcXnXcXmXmXcXcXcXcXcXcXnXnXnXnXnXmXMXmXmXnXMXnXMXcXnXcXMXnXnXcXcXnXnXnXnXnXcXcXcXxXxXxXxXcXxXxXxXdXcXdXcXdX@XzX.XdX.X.X.X.X.X X|.|._.(.^.`.(.(.(.(.(.(./.(.~.~.~.~.~.~.T.T.T.T.I.T.I.L.U.L.L.L.H.H.G.G.A.A.G.G.A.A.S.G.h.G.A.h.A.A.A.A.h.l.l.h.h.h.f.g.j.a.g.f.k.f.f.z.g.z.f.a.g.f.g.f.a.z.g.f.h.h.k.h.k.l.z.h.z.z.g.g.g.j.f.h.f.z.f.f.g.f.z.k.z.h.f.g.g.g.g.k.g.g.g.f.f.f.f.f.i.s.s.z.a.a.a.s.a.z.s.i.a.a.i.a.a.i.a.a.a.a.i.a.a.a.a.a.a.z.d.k.i.f.i.a.a.a.g.g.a.f.f.a.f.g.g.g.h.g.j.d.z.g.g.g.g.l.k.h.h.h.A.G.g.h.G.A.A.A.A.A.S.S.G.H.H.H.S.H.H.H.H.U.S.U.S.Z.H.H.L.H.L.L.L.L.H.L.L.L.U.L.U.U.L.U.L.L.P.T.K.U.T.T.U.Y.P.P.L.L.L.L.L.L.L.H.L.S.U.U.L.U.S.U.S.K.S.L.L.H.H.L.H.U.S.K.L.L.L.L.A.L.L.S.U.L.L.P.P.L.U.L.P.L.P.P.P.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.U.T.U.Y.T.U.U.U.T.T.T.T.T.T.T.T.T.~.~.~.~./.~./.(.(.(.(.(.(.(.(.(.(.(.(.(.(.|.[._.|.|.|.|. X.X.X.X.X.X.X.X.X.X.X.XdXdX.X.X.XdX.X@X.X.X.X.X.X.X.X|. X.X'.|.'.|.|.|.}.|.}.|.}._.|.(._.|._.(.(.",
+"_ _ ) _ _ _ ` _ _ _ _ ' _ _ ) ' ` _ ) ` ) ' ' _ ' ` ` ' [ ' ' ` ' _ _ ' [ ' _ [ ' ` ' ' ' [ ' ' ' [ ' ` ' ' ' ` _ ' _ ` ' ' _ ` _ ) ' _ ` ) ) _ ' P ' I _ I ) ) I I P P P P ) P P J J P J P H H H H H H H Z L L D H Z Z D H Z Z Z D Z Z Z D Z H Z Z D D D Z H D Z H H Z H A H D Z D Z H Z L Z H L Z H D Z Z Z H Z H H Z H D D D D D Z D D Z Z Z F Z Z C Z V Z F C C Z B B C C C C C M C C V M C M N M N N N M V M M V N N V N M V M M M M C M V m V M m V D t.u.i.i.i.d.i.a.a.a.a.a.d.a.d.a.a.a.a.a.i.i.k.i.a.a.a.a.a.a.a.a.a.a.a.a.a.f.f.f.f.f.g.g.g.g.h.h.h.A.h.A.A.A.A.A.A.A.A.A.A.Z.G.A.A.H.S.S.H.H.H.H.H.H.S.S.H.G.H.H.L.L.H.H.H.L.L.H.U.S.U.L.L.L.U.L.L.U.L.L.L.L.U.U.T.U.T.T.R.~./.~.[.(.(.(.(.^.[.(.(.(.(././.(.(.(./.[./.[.^.(.(.!.(._.(.`.(.|._._.(.|.`.|.|.|.|.`.|.`._. X_.'._._._.`._._._._._._. X`.'..X.X X.X.X.X|.|..X|..X|.'.`.|.|._._.|.}.[.(.^.(.(.(.(.|.^.|.(.(.^.(.(.^.^.(.(.(.(.[.^././.~.^.~.!.~./.~./.~.~.~./././././.~.~.T.T.T.T./.T.T.T.T.T.T.Y.T.T.I.R.P.P.P.P.P.P.L.L.L.S.H.S.S.K.A.H.S.H.H.H.H.H.H.S.L.U.S.H.H.H.K.H.H.A.G.S.S.S.S.S.G.G.H.D.H.G.G.G.L.L.L.L.U.Y.U.Y.T.U.T.U.T.U.Y.T.Y.P.P.P.T.T.T.T.R.~.~./.~./.!.(./.).{.(.(._._.|._.|. X|.|.|..X.X'..X.X.X.XdX.X.X.XzX.XzX'.zX#XdXzXdXzXzXzXdXcXxXdXvXzXnXdXzX.XzXzXzXdXdXzXzX@X.XdX.X.X.X.X.X|..X.X.X.X.X X|.|.|.`.`.|.|.}.^.^.(.(.^.(.[.(.(.^.(.(.^.{.(.^.{./.|.(././.^.(.(.(./.(./.(.(.(.^.(.(._.(._.|._._._.|.'.(. X_._. X'. X X@X.X.X.XdXdX.XzX.X.X.X.X@X.XzXzXzXzX.XzXzXvXdXcXdXvXfXdXdXcXdXxXzXxXxXxXxXcXcXcXcXmXxXcXxXxXxXcXzXmXdXcXcXnXcXdXmXcXmXdXmXcXmXnXnXcXnXnXmXmXnXmXmXMXmXMXnXnXnXnXnXnXcXcXnXnXcXcXmXvXcXcXxXxXxXcXdXcXdXxXxXxXxXdXdXdXdXxXxXdXdXzX.X.X.X.X|._.|.`.`.(.(.(.(.(.(.^.~.[.(./.~.~.~.T.~.~.T.T.I.T.T.U.L.L.L.L.H.H.A.G.A.G.A.A.G.S.z.G.Z.h.A.G.A.A.A.A.A.l.h.z.l.g.k.f.g.g.z.k.f.z.f.j.a.f.a.g.a.a.z.g.z.f.f.h.f.a.h.k.h.k.h.h.h.l.f.g.g.f.j.f.g.g.g.g.f.h.k.k.h.f.h.g.k.g.g.g.g.g.g.f.j.f.f.f.f.f.f.a.a.i.k.i.a.a.i.a.a.i.a.i.a.i.k.a.a.a.i.a.a.d.a.a.a.z.E i.a.z.i.a.a.g.a.k.g.f.f.f.g.g.g.g.g.g.g.g.z.z.g.z.k.A.g.h.h.A.h.h.A.G.h.A.A.G.A.H.S.S.S.G.G.H.H.H.H.H.L.H.S.K.U.D.U.L.S.L.L.L.L.L.L.L.L.L.U.U.U.L.U.U.Y.U.U.L.U.U.Y.I.T.U.P.Y.P.L.L.L.L.L.L.L.L.L.S.U.L.S.L.L.U.Z.U.S.L.H.L.H.H.S.U.H.H.L.L.L.S.L.S.L.L.L.L.P.U.L.D.L.P.U.P.P.P.T.T.U.P.T.P.P.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.Y.U.T.Y.T.U.T.Y.U.T.T.T.T.T.~.T.~.T.~.~.~././././.(././.(.(.(.(.(.(.^.`.(.|.(._.|.|.|..X|..X.X'..XdX.X.X.X.X.XdX.XdXdXdXdX.X.XdX.XzX.X.X.X|..X.X|.|.|. X|.|.|.|.}.}.|.}.}.`.|.|.|.|.^.{.(.",
+"' ` ) _ _ _ ' ` _ _ _ ` ) _ _ _ ` ' ) ' ) ` ' _ ` _ ' [ _ _ ' [ ' ' ` _ ' _ ' ` _ ' ' [ _ ' [ [ [ _ _ ' ' [ _ _ ` ' _ _ ` ` _ ' _ ' _ ' I _ _ ) ) _ ) _ ) ) ) P ) ) I P I I I I P P P L H P H H H H U H H H H D D H Z Z Z H Z J Z Z H H Z Z D Z Z Z H Z H Z L Z H H H H Z H Z H Z H H H H H Z Z Z H H D H Z H H H Z Z Z L Z H H H Z Z D Z Z Z Z Z F Z Z C C B F Z B Z C Z V V C Z V A V N N M M M C M M M M A M N V N N N V N N N N N N m N M M B V m M V E p.i.i.i.i.i.f.i.i.a.a.a.a.z.i.a.a.i.a.a.a.a.a.i.a.i.i.i.a.a.a.a.a.a.a.a.a.a.i.k.f.f.k.g.g.z.h.h.h.A.A.A.A.h.A.A.A.A.A.A.A.h.A.G.Z.H.H.A.S.H.H.S.G.H.H.H.H.H.H.S.U.L.L.H.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.Y.P.P.T.T.T.T.~.~.~.~./.(./.(.(.(.!.(.(.(.(.(.(.(.(.(.(.(./.(./.(.(._._.)._._._.|._._.|.|.|.|.|.|.|. X{.|.|. X|.{._.{.|.(.(.[.{.|.|.|.|. X.X|..X.X.X@X X X.X|..X.X|.|.|.|. X_.`.(.`.(.(.(.{.(.(.(.[.(.(.(.(.(.(.E.^././././.^.E./.(.~.~.^.~.~.~.~.~.~.~.~.~.~.~.(.~.~.~.~.T.~.~.T.T.~.T.T.~.T.T.T.P.T.P.P.P.P.Y.L.L.L.S.A.H.H.H.H.S.A.L.S.H.A.H.S.H.H.H.H.H.H.K.H.H.G.H.A.G.S.H.G.S.S.S.G.S.S.H.H.H.H.H.H.L.L.S.U.P.U.U.Y.U.Y.T.U.T.L.T.P.T.P.P.~.P.P.~.~.T.~.~.~.T.(.^.(.(.(.(.(.^.|.|._.|._.[.|.|. X|._.|..X|. X.X.X.XdX.XdX.XzXzX.X.XdX.XzX.XzXzX.XvXzXdXnXdXzXzXzXzXzXzXzXzXzXzXxXdXdX.X'.@X'.dX X.XdX.X.X.X.X.X.X|.|.}. X|.}.}.}._.{.(.^.(.(.(.^.(.(.`.^.(.^.`.(.(.(.^.^.(.{.(.(.(.(.(.(.(.(.(.(.(.(.`._._._._.|.}._.|.|.|. X X'..X X.X.X'..XzXzXzX.XzXzXzX.X.XzXzX.X XzXzXzXcXzXzXzX XdXcXdXcXdXcXcX%XcXcXcXvXcXcXcXnXxXnXnXxXcXxXJXcXcXcXcXcXnXnXnXmXcXmXnXnXmXvXmXmXcXfXmXmXmXmXmXmXMXmXmXmXmXmXmXcXmXcXmXnXnXnXnXnXcXnXcXcXcXnXdXcXxXxXcXxXxXxXzXxXdXdXdXxXdXzX@X.X@X.X.X'.|._.}._.(._.(.(.(.(.(.(.T.^./././.~.~.~.T.T.T.~.T.Y.T.U.Y.I.L.L.S.L.H.S.G.A.S.S.A.H.S.S.S.A.A.S.h.S.A.A.l.G.g.h.h.h.h.h.z.z.j.g.f.f.f.f.j.a.f.f.f.f.f.g.a.j.j.f.g.g.g.g.h.h.h.h.j.h.j.g.z.g.g.z.k.h.f.g.f.f.h.g.g.g.k.f.g.g.g.g.a.z.k.g.f.k.f.a.z.g.i.a.k.a.k.a.a.a.a.i.k.f.i.i.k.a.a.i.i.a.i.i.z.a.a.a.a.a.a.i.k.d.i.k.g.g.a.g.f.g.g.d.g.k.k.g.h.g.z.A.d.l.k.g.g.Z.k.h.h.h.h.A.A.z.G.A.A.D.g.A.A.A.Z.G.G.G.A.H.H.H.G.H.L.L.G.L.H.L.L.P.D.L.L.L.P.P.P.L.L.U.U.P.Y.P.P.Y.L.Y.Y.T.I.P.Y.L.Y.U.Y.L.L.L.L.L.L.L.L.P.L.P.L.L.L.L.L.L.S.S.S.S.L.L.S.L.L.L.L.L.D.L.S.U.L.U.A.L.P.D.P.P.P.L.P.U.L.U.U.U.T.U.T.P.T.U.T.T.T.T.T.~.T.T.T.T.T.T.T.Y.oXT.T.P.T.T.T.T.U.P.T.T.T.T.U.T.~.~.T.[.T.T./.T.(././.(././.(.(.(.(.(.(.(.(.(.|.(.|.`.|.|..X.X.X.X.X.X.X'..X.XzX.XdX.X.X.X.X.X.X@XdX.X.XdX.X.X|..X.X|.'.|.|.|.}.}.}.|.|.|.{. X{.}.}.{._.^.|.^.",
+"I I _ ` _ _ ) _ ` ` ` ` _ _ _ ` ) ' _ ` ) ' ` _ ' ' _ ' [ _ _ ' _ _ ' [ [ ' [ ' ' [ ` ' [ ' ' ' _ ` ' [ ' ' _ [ _ _ ' _ ' ' ' ` ` _ _ ` _ _ ` ` _ _ ) ) _ ) ) ) ) I ) I I I I J P P P L P H H P J J H H H H H H H D J Z L Z Z Z H H Z Z Z Z Z D Z H Z H H Z G Z H Z Z H H Z L H H Z L Z Z H H H H H D S Z H H D H D H H H Z Z Z D Z D Z Z F C Z Z C Z C D Z Z Z C Z Z C V Z B C V V V V N C C M M M C M N M M M N N M V N B N N V N B N V N C M B m m V B T u.i.i.i.i.i.i.i.i.a.a.a.k.i.z.a.a.z.z.a.a.a.a.i.i.i.a.u.i.a.a.a.a.i.i.a.a.k.i.g.f.k.g.k.k.l.h.h.A.h.h.A.A.A.A.A.A.A.A.A.A.H.A.A.H.A.S.H.H.H.H.S.H.H.S.H.H.H.S.U.H.S.L.H.L.S.L.S.U.S.L.L.U.Y.U.L.Y.L.L.L.K.Y.P.T.Y.T.T.T.~.T.~.~././.(.^./.(.(.(./.(.(.(.(.].!.(.].(.(.(.(.(.(.(./._._._._._.|.|._.|.|.|.|.|.|.|. X|. X{.|. X_._._.`.(.|._.|.|.|. X.X X.X.X|. X|. X X.X|.|.|.|.|._.{._._.(.`.(.(.(.(.(.(.(.(.(./.(.(.(.(.[.(.^.^.(.!./.(.!./.~.[.~.E.!.~.~.~./.~.~.~.~.(.~.~.~.~.~.~.~.~.T.~.~.T.T.U.T.T.U.T.Y.P.P.P.U.L.L.U.L.L.L.L.H.H.H.H.H.H.A.G.G.G.H.S.H.H.H.H.H.H.H.H.H.S.H.H.G.H.S.G.S.S.S.G.H.S.H.S.H.H.H.H.H.L.L.L.Y.L.U.Y.T.U.U.T.T.T.Y.P.T.P.P.T.T.T.~.P.T.~.~.~.(./.(.).(.(._.(.(.^._.`.|.|.|.|.|.|.|.|.|..X.X.X.X.X.X@X.X.X@XzXzX.XdXdXdX.XxXzXzXzXzXzXcXdXzXzXzXzXzXzXzXzXzXzXzXdX.XdXdXdXzX.X@X'..X'..X.XzX'..X X|.|.|.|. X|.}._._._.(.`.(.(.[.`.(.(.(.(.`.(.^.(.(.(.{.|.{.{.(.^.(.(.(.(.(.(.^.^.`.(.`.(._._._.|._.|.|.|.|.|.'. XdX XdX.X@X'..XzXzXzXzXzXdXzXzXxXxXzXzXdXzXzXdXzXzXzXcXcXcXcXcXcXdXvXdXcXcXdXxXfXcXcXcXnXnXzXxXmXdXxXcXcXcXcXnXnXnXnXmXcXmXnXcXmXmXmXcXmXcXmXmXmXmXmXMXMXmXmXmXmXnXmXnXnXnXcXnXnXnXnXnXcXnXcXcXcXnXdXcXxXxXcXxXxXxXzXxXdXnXdXxXdXzX'..X'..X.X X|.}.}._.(.(.(.(.(.(.(.(.(.(.~./././.~.~.[.T.~.T.T.T.T.I.Y.I.L.L.H.H.G.H.H.S.S.S.S.A.A.S.G.G.G.A.G.A.S.G.h.l.h.h.h.h.h.h.g.z.g.h.a.h.f.f.g.f.f.f.f.f.f.j.g.g.f.g.f.g.g.g.k.j.z.h.h.h.g.g.g.k.k.j.h.k.f.j.h.h.f.g.k.g.h.z.f.g.g.g.g.g.k.a.z.a.a.g.a.a.g.a.a.a.a.a.a.k.a.i.k.i.k.i.k.i.f.a.z.a.z.a.a.a.a.a.a.z.a.i.k.k.i.k.a.a.g.f.g.g.f.z.g.h.h.z.h.g.d.k.z.k.k.g.g.g.g.g.G.h.z.h.z.A.h.l.A.A.D.A.A.A.D.A.G.Z.G.A.H.H.G.H.H.H.H.H.L.L.L.L.L.L.P.P.P.P.U.U.Y.P.Y.T.P.T.P.U.Y.U.U.U.U.U.Y.L.L.L.L.Y.L.L.L.L.L.L.L.L.L.L.P.D.L.L.L.U.D.L.L.L.L.S.L.D.D.A.L.L.L.L.S.L.S.P.U.P.P.L.P.P.P.P.L.U.Y.U.T.U.U.T.U.T.T.T.T.T.T.~.T.T.~.T.T.T.T.P.T.Y.T.T.P.T.T.T.T.U.T.P.P.P.T.T.T.T.T.T.~.T.[././.~.~.(.(././.(./.(.(.(.{.^.`.|.^.{.|._._.|.'..X.X.X.X.X.X.X.X.X@X.X.XdX.XdXdX.XxX.X.X.X.X.X.X.X.X.X.X.X X X|.|._.}.|.}.|. X|. X|. X|.}.}._.`.^.|.",
+") _ _ ) _ _ _ ) ' _ [ ' _ _ _ _ ' I _ _ ` _ ` _ _ _ _ _ ' _ _ _ _ ' _ ' _ _ ' _ [ ` _ ' ` _ ' [ ' [ _ ' ` _ _ ' ' _ ' _ _ ' _ ` ) _ _ ` _ _ _ ) ) _ ) _ ) I ) ) P ) ) I I I I ( P P P P J J U H H L H H H D H H F H H J Z H H D H Z Z Z H Z H Z H Z Z H H H L L H H G H L H H Z Z H H H H Z H S H Z H H L H H D J H Z H Z L Z J H Z D D Z Z Z Z C Z C Z C F A C C Z B Z V C C C C V C C C N V V C M N C M N M N V A m M V m V m N N V N N N N N B B M V T R p.i.a.i.a.i.i.i.i.i.k.i.z.a.z.a.f.i.a.a.a.a.a.i.a.i.a.a.a.a.a.a.i.a.a.a.a.a.k.a.g.z.k.g.h.k.h.h.h.A.A.h.h.G.A.A.A.A.A.A.A.A.S.S.A.H.H.G.H.H.H.H.H.H.S.H.H.H.L.S.H.H.H.L.S.L.L.D.U.L.L.D.L.L.L.L.L.L.L.U.U.U.P.P.T.T.T.T.T.T.!.~.(.~././.(.(.(.(.(././.(./.(.(.(.(.(.^.(.(.^.(.(._._._._._.|.{.|._.|. X X|.|.|.|.[.|.|.|.|. X_.|.}.}.|._.|._._.|.|..X|.|..X.X.X.X'._.'..X X X|.|.|.|.{.`.|.(.|.(.(.(.(.(.(.(.(.!.(.^.^.^.(.(.E.(.(./././././.~.~./.~.(.~.~./.!.T.~.~.~.T.T.~.~.E.~.~.~.T.~.T.T.~.T.[.T.T.U.T.Y.P.Y.L.U.L.L.L.L.L.Y.S.H.H.H.H.K.A.S.G.G.H.G.S.H.H.H.D.H.H.H.H.H.H.H.H.S.H.H.S.S.S.G.S.G.H.H.Z.H.H.H.H.L.L.L.L.K.L.Y.U.Y.I.U.T.I.T.P.P.P.T.P.P.T.T.T.T.T.~.~./.~./././.(.(._.(.{.`._.{.|.|._.|.|.|.|.|.|..X|..X.X.X.X.X.XzX.X'.zXzXdXdXdXdXdX.X.XzXzXzXzXzXzXzXcXcXzXzXzXzXzXzXzXzXdXdXdXdXdX.X'.zX XdX.X.X.X.X.X|.|.|.|.|.|.|.}.}.{._._.|.^.(._.{.{.(.^.^.^.|.`.^.(./.^.|.^._.(.|.(.(.(.).(.(.^.`._._.|._. X_.|._.|.|.|.'..X.X.X.X.X@X.X.X'.zXzX'.zXzXzXzXzXzX.XzXzX.XzXzXzXzXxXdXzXzXvX.X XvXcXdXvXcXxXxXxXxXcXcXnXdXcXcXxXJXnXxXnXxXcXJXzXcXnXnXnXMXmXmXmXmXmXmXmXcXmXcXmXmXmXmXNXmXMXMXMXmXmXMXMXmXnXcXmXcXnXnXnXnXcXmXnXnXcXcXcXJXxXxXxXxXxXxXxXzXzXdXzXzXdXdXdXzX.X.X|..X.X|.}.}._._.(._.(.(.(.{.(./.(.^./././.~.~.T.T.T.T.T.T.T.T.U.L.L.S.L.H.H.H.H.S.S.S.S.S.S.S.S.G.A.S.G.A.A.A.A.A.h.h.l.l.h.h.h.g.h.z.g.g.g.g.g.f.f.x.a.f.z.f.f.g.g.j.g.f.f.k.h.k.h.f.x.j.f.k.g.g.g.h.z.k.h.f.z.a.h.f.h.g.h.f.h.h.h.z.k.k.k.g.f.g.f.k.a.a.a.k.i.k.f.a.a.a.a.i.i.f.d.k.f.f.i.z.z.i.d.z.i.z.i.z.a.k.d.k.i.d.d.z.g.g.a.g.a.h.k.g.g.k.k.k.h.g.z.k.k.k.g.g.h.g.l.g.z.h.h.A.h.G.x.A.Z.A.A.A.A.A.A.A.A.G.G.A.H.G.G.H.G.H.L.L.H.L.H.L.L.L.P.L.U.P.P.T.U.P.P.P.P.P.Y.U.P.L.U.U.T.L.U.T.L.L.U.K.J.L.L.L.L.L.L.L.L.L.L.P.P.L.L.L.L.S.L.L.L.S.L.L.L.L.L.L.L.S.L.D.L.L.L.P.P.L.P.P.P.L.P.U.L.U.U.T.U.T.T.T.T.T.T.T.~.T.T.T.~.T.T.T.~.T.~.Y.Y.T.T.T.P.T.P.T.T.T.U.T.T.T.T.T.~.~.T.~.~././.(.~.(././.(.(.(.(.(.[._.^.(.(._._.|.|._.|..X.X|..X.X.X'..X.X.XcXdX.XzX.X.XdX.X.X.XzX.XdX.X.X.X.X.X.X.X|.|.'.'.|.}.|. X|. X|.|.|.}.}. X{.^._.{.^.",
+") _ _ _ _ ` _ _ _ _ _ _ ` _ _ ` [ _ _ _ ' _ ' ' ' _ _ _ ' _ _ ' _ _ ' [ ' ' [ [ ' ' ' [ ' [ ' ' ' ' ' [ ' _ _ ` [ _ _ _ ' ` _ _ ' ` ) _ ` _ ) _ _ I ) _ ) ) I ) ) ) I I I I I I I P P P J P P J P H J L P H H Z L J Z Z H Z H H Z G L Z G Z Z H Z Z Z G H Z Z L Z H H H H H H H L H J Z L L Z H L H H D H H H L Z J H Z L Z L Z Z D H H Z Z D F D Z Z Z Z Z Z Z Z C Z B Z V C V C C C N N C N N C N C M M C N M M V V m m A m V V N N N N N N N V N V m T e.s.p.i.i.i.i.f.i.k.f.z.i.k.k.i.i.z.i.a.a.a.d.i.a.a.a.a.a.a.i.a.a.u.i.i.a.a.a.i.g.a.g.k.g.g.f.h.h.A.g.h.A.A.h.A.A.A.h.h.A.A.G.A.S.A.S.A.L.H.H.H.S.H.H.H.H.H.H.S.U.S.U.L.H.L.F.Z.U.S.U.H.U.S.L.L.L.L.L.L.L.L.U.P.T.T.T.T.~.[.T.~.~.[.~./././././.(.(./.(.(.).(.(.(.(.{.`.(.(.(.(._._._.{.|._.|._.|.|._.|._.|.|.|. X|.|.{.|.|.[.|.[.}.}.|._.|._.|.'. X|..X.X X X|. X X X|. X|.|.|.|.{._.`.(.(.(.(.(.(.(.XX(.[.(././.(./.(.~.[.[./././.^.(.~././.^.~.~./.T././.~./.~.~.~.~.T.(.T.E.{.T.T.~.~.T.~.~.Y.T.T.T.T.U.U.P.Y.P.L.L.L.L.L.P.S.L.L.H.H.A.K.G.G.H.A.D.S.H.S.H.H.L.H.L.H.H.H.H.H.H.H.H.S.G.S.S.S.S.S.S.G.G.G.H.S.L.H.S.S.L.L.L.U.U.U.U.I.U.T.U.U.P.P.P.P.~.P.T.T.T.T.~.~.~.~././.(./.(.(.(.(.(.(.`.`._.|._.|.|.|.|.|. X|..X.X.X.X.X.X.X.X.XzX'..X.XdXdX.X.X.XzXzXzXzXzXzXzXvXzXzXzXzXzXzXzXzXzXdXdXxX.XdX.XdXzX.X.X@X.X.X.X.X|..X.X'.|..X'.|.}.}.|.|.|.(.|.(.(.(.(._.|.^.`.(.(.`.|.`.(.`._._.{._.(._._.`.(.(.^._._._._.(.`.|.|.|.|.|.|..X.X.X.X.X.XzXdX.XxX.XzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXdXmX.XmXcXdXdXcXxXxXxXxXcXcXnXnXnXmXnXnXxXnXxXxXcXcXxXcXnXzXJXxXcXmXmXmXmXmXmXmXmXMXmXmXmXmXMXMXNXMXMXmXMXnXmXmXnXmXnXmXmXmXnXnXmXcXcXnXnXnXcXcXJXdXxXxXxXxXzXzXzXzXzXzXxXdXdX'..X.X.X.X X|.}.}._.(.(.(.(.(.(.(.(.(.(.^.[././.~.T.^.~.~.T.~.T.T.T.U.T.L.L.L.H.L.H.G.G.S.G.S.S.S.A.H.A.S.A.h.S.h.A.A.A.A.h.h.h.l.h.h.h.h.h.h.h.g.g.g.g.g.g.a.f.f.f.g.j.f.g.g.f.g.f.j.k.h.k.h.f.h.j.z.z.g.h.g.k.z.k.h.f.h.g.g.k.k.h.g.k.f.k.k.f.f.f.f.a.k.a.a.a.a.a.a.i.z.k.z.a.a.d.f.i.f.a.z.f.f.i.i.z.i.z.i.f.i.a.a.a.d.i.k.k.k.a.a.z.z.g.g.k.k.k.h.h.h.k.k.g.g.k.l.l.k.g.h.h.h.g.G.z.h.z.h.h.A.A.z.A.g.g.A.A.A.A.A.A.A.H.Z.A.G.H.G.L.H.L.H.L.L.L.L.P.L.L.U.P.T.U.Y.P.P.T.Y.T.P.Y.U.U.U.U.L.L.T.R.L.U.U.U.L.L.L.L.L.L.L.P.L.D.P.P.A.L.L.L.L.U.L.L.L.L.L.U.S.U.D.L.L.L.L.L.D.L.L.P.P.L.P.L.P.P.L.L.U.U.P.T.U.U.T.T.T.T.T.T.~./.~.~.T.~.~.T.T.T.T.Y.oXT.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.~.T.[.~.(././././././.`.(.^.{.^._.|.^.(._.|.|.|.|..X.X'..XxX.X.X.X.X.XzXdXdXdXdXdX.XdX.XdX.X.X.XdX.XdX.X.X.X.X|..X X|.}.|.}.|.{.|. X X X}. X}.`.`.`.|.",
+"_ ) _ [ _ _ _ _ _ _ _ _ _ _ ` _ _ ' _ _ _ _ _ [ [ _ ' _ [ ' _ ` ' ` [ ' _ _ _ ' _ [ ' ' [ ' ` _ [ _ _ [ ' ` _ ' ` ) ) _ ` [ _ _ ` ' _ _ ` _ ) _ ) _ ) _ ) _ ) ) I ) I I I I P I I L I P P L P J H U L D H H H H Z J Z H H H Z Z D D D Z D Z H H L Z L L L Z L L H D Z L H J H H H H H L S L L H H H H H H H H Z D L H Z H H H Z Z H Z Z D Z Z Z Z Z Z F Z Z Z C Z V Z C Z V C C C C C V V V M A N N M A N M M M M M M N M M N N N N V V N B N N m B B B e.i.i.d.i.a.d.s.i.a.i.f.i.i.k.k.k.i.f.k.a.d.a.a.a.d.a.a.E a.a.i.i.i.a.i.i.a.a.a.a.f.f.g.g.g.g.g.f.h.G.G.S.h.A.A.A.A.A.A.A.A.A.A.G.A.S.S.A.G.L.S.H.H.H.H.L.S.S.S.L.L.L.S.L.L.S.S.S.L.S.H.S.L.L.L.L.L.L.L.Y.U.U.T.T.T.T.T.T.T.~.~.~.~.!.(.(./.[./.(./.(.(.(.(.(.!.(.(.(.(.^.`.^.^.^.}._.{._.|.|._.}.}. X|.|.|.|.|. X[.|.|.|.|.{.|.|.{._.|._._.|.|.|.|. X.X.X`.'.|..X.X|.{.`. X|.|. X_._.(.`.`.^.(.(.(.^.(.(./.~.(.(.[./.^./.^././.~.^./././.~.!./.~.~./.~.~./.E.~.~.T././.~.T.T.~.T.~.T.~.T.[.T.T.T.Y.T.U.T.L.U.T.U.U.P.Y.L.L.S.U.L.L.L.S.H.H.H.H.D.H.H.H.H.H.G.H.H.H.H.H.H.H.H.H.H.H.L.G.H.H.H.Z.H.S.S.G.G.S.H.H.S.H.H.H.S.L.H.L.L.S.L.U.U.Y.U.T.P.P.T.T.P.Y.P.T.T.T.~.~.~.~.~./.(.(.(.^.(.(.(.`.^.|.(.(.|.}._._.|.|.|. X|..X X X X.X.X|..X'.zX'..X#X'.dXzX.XzX.X.XzXzXzXzXzXcXzXvXzXdXxXzXzXzXzXdXxXdXdXzXdXzXzXzX.XxX'..X.X.X.X.X'.`. X|. X X|.|.|.|._.|._._._._._._.(._._.|.`._.|.[.}.`.`._._.}.}.}.[.(._._._.^.`._._._. X_.|.|.|. X.X.X.X.X@X.X.X'..XdX'.@XzXzXzXzXzXzXzXxXxXzXxXzXcXzXzXzXzXxXdXdXzXdXcXdXmXmXdXcXcXxXxXxXcXcXcXnXcXvXmXnXnXnXcXnXnXxXnXnXnXnXMXnXnXmXMXmXMXmXmXmXmXmXmXmXmXMXMXMXMXmXMXmXMXmXmXmXnXmXnXmXmXnXmXnXnXcXnXcXnXnXcXcXcXcXxXxXxXxXxXzXzXzXzXzXzXzX.XdXdX.X.X.X X|.|.}.}.(._.(.(.(.^.(.(.{.(.(./././.~.~.^.~.~.T.T.T.T.T.T.U.U.Y.U.S.L.L.L.H.H.H.S.S.G.S.S.A.S.S.S.A.A.A.A.A.A.A.A.A.A.l.h.h.g.h.h.h.h.h.g.g.g.j.j.j.j.f.f.j.g.g.f.f.g.f.k.h.k.k.j.h.k.g.g.z.g.h.z.h.k.z.z.h.h.k.l.l.k.h.h.f.k.k.k.f.f.f.f.a.f.i.a.a.a.g.a.f.f.a.f.f.a.f.d.f.f.f.f.f.f.k.z.k.i.z.i.z.i.i.a.a.a.d.k.k.k.k.h.g.g.g.g.g.h.h.h.k.h.k.g.g.g.g.l.k.h.k.g.h.h.l.h.h.z.A.l.A.h.A.g.A.A.h.D.g.A.A.h.A.A.A.A.G.G.G.H.H.L.G.L.L.H.L.P.L.L.P.P.T.P.P.P.U.U.T.T.P.P.U.L.T.L.Y.U.I.I.L.I.U.U.U.L.L.Y.U.U.L.L.L.L.L.L.P.P.P.U.L.L.L.L.U.S.U.L.L.L.L.L.L.L.L.D.L.L.A.L.L.L.P.L.U.L.L.L.L.U.L.U.U.T.U.T.U.T.T.T.~.T.[.~.T.T./.T.~.T.T.T.T.P.P.T.T.T.T.T.P.T.T.T.T.U.T.T.T.T.~.T.~.~.T.~.~.~.~././.(././.(.^.^.(.(.`.`._._.|.|._. X|. X.X.X.X.X.X.X.X.X.X.X.XdXfXdXdX.X.XdXdX.XdX.X.X.XdX.X.X X'.dX.X.X X'. X|.}. X|.}. X{.}.}.}.{.}.}.|.^.",
+") _ P ' I [ ` _ _ _ [ _ _ _ _ _ ` ' ` _ _ ' _ _ ' ` ' _ ' _ ' _ _ _ ' _ ' ' [ ' _ ' [ ' ' ` ' [ _ ' _ ' _ _ _ ` ' ' ` ` _ _ _ _ _ _ _ _ ) _ _ ) _ ) ) ) ) ) P ) ) I ) I I I I I I ( I I L I P P L J L J L L H H L H J H Z H Z H D D H D H D H L Z L H H L Z Z L H H U H H L L H H L L H L L J H L H H H H S H L L D H H Z H H H Z L Z H D D D D Z Z D C Z Z Z Z Z F C Z Z C C C C V V A V C C N M A N N M A M A C C M N V V M V V N V m N N N N N B m T p.i.p.i.i.i.i.d.f.d.k.i.z.z.a.k.k.z.i.z.a.z.a.a.a.a.a.a.z.a.a.i.i.i.a.i.i.f.a.a.a.a.f.f.k.g.g.k.h.h.g.l.A.h.g.A.A.A.A.J.A.A.A.A.S.A.S.S.H.H.H.H.H.D.L.G.D.L.L.L.L.S.L.U.L.L.L.L.L.L.S.L.U.S.L.H.U.S.L.L.L.L.L.T.U.T.T.T.[.~.T.~.~.~.~./.!././.(.(.^.(.(.(.(.(.(.(.(.(.(._._._.{.}.[.}.}._._.|.|.}.}.}.|.|.|.|.|.|. X X[.|. X|.|.|._.{.|.|.|.|.`.|.|._.|.|..X|.|.|.|.|.|.|.|.}.|.{._._.`.(.^.^.^.^.(.{.(.[.E.(./.~.~.^.~./././.(./.!././.(.~.~./././.T./.~.~.^./.~./.E.T.~.T.~.~.~.~.T.T.T.T.~.T.[.T.T.T.T.T.I.T.Y.L.P.P.L.L.L.L.S.L.U.S.H.H.S.A.H.G.H.H.G.G.H.H.H.H.H.L.L.S.L.H.G.L.H.G.H.H.H.D.S.H.H.S.H.S.H.H.H.H.H.H.S.L.L.L.L.U.L.U.U.L.U.U.T.P.T.P.Y.P.~.T.T.T.~.T.~.~.~./././.(.(.(.(.(.^.`.^.`.^.[.}._.|.|.|.|.|.|.|. X@X.X.X.X.X.X.X.X.X'.zX@XzX.X'.zX.XzX.XzXdXzXzXzXzXzXdXcXdXzXzXzXzXdXdXxXdXcX.XzXzXzXzX.XxXdX@X.X.X.X X@X|..X|.'.|.|.|.|.|.|.|.|._.|.(._.|.`.|.[.{._._.|.}.`.(.(._.}.}.}.}._._.`.^._.(._._._._.|.|.|.'.|..X.X.X XdXdXdXxXdX.XdXdXzXzXzXzXzXxXxXxXzXxXzXxXzXzXcXzXzXdXcXxXdXdX%XdX%XdXmXvXcXcXxXcXcXcXcXcXmXnXnXxXnXnXnXvXxXnXxXnXnXnXnXnXvXmXMXdXMXmXmXmXmXmXmXmXMXMXMXMXMXMXMXmXMXmXmXmXmXmXnXmXcXmXnXnXnXmXnXnXnXnXnXcXmXcXxXvXxXxXzXxXzXzXzXdXzXzX.X.XdX X.X'.'.}.}.}.}.|.(.(._.(._.^.^./.(.(.(././.(.~.~.~.~.~.~.~.~.T.T.T.Y.L.U.L.L.S.G.L.H.S.H.H.S.G.H.S.S.S.S.A.A.A.A.G.A.h.h.j.h.A.l.h.A.A.h.h.h.h.g.g.h.f.f.a.f.j.g.g.f.g.g.g.g.g.k.j.j.f.f.g.g.k.a.h.z.h.h.h.h.h.h.f.h.f.h.k.h.k.l.f.k.z.f.f.k.a.i.g.z.i.a.a.a.a.f.s.f.g.f.f.f.k.f.f.f.f.f.k.k.d.k.k.z.i.i.z.f.k.a.z.a.x.k.d.a.z.a.h.g.z.g.g.k.h.h.h.l.h.g.g.z.g.l.h.k.h.l.h.l.l.A.z.A.z.l.l.h.l.h.h.h.h.d.D.A.g.A.A.A.A.A.A.A.G.G.H.S.L.H.L.L.L.L.L.L.L.P.U.T.T.Y.T.Y.T.P.T.T.U.T.L.U.L.U.L.L.L.K.L.L.L.L.K.L.L.L.U.U.L.L.Y.P.P.P.L.L.L.L.U.L.U.P.P.Y.L.L.L.P.L.L.U.U.L.L.L.L.L.P.L.A.U.L.L.U.L.U.Y.L.U.U.U.U.T.T.T.T.T.T.~.~.~.~.~.~./.~.~.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.~.T.T.~.~.~.~.(.[././.(./.(.(.(.^.(._.(.|._.|._.|._.|..X|..X.X.X.X.X.X.X.X.X.X X|.dX.X.X XdX.X.X.X.XdX.X.X X'.@X.X.X.X.X'. X X X|. X|.|.|.|.|.}.|.|.}.}.(.(.",
+"_ ) ) _ _ _ ` _ _ _ ` _ _ ` _ ` _ _ _ _ _ _ ' ` ' _ [ ' _ _ ' _ _ _ _ _ ` _ [ _ ' ' [ _ [ _ ' ' ' ' ' [ ' ` ' _ ) _ _ _ _ _ _ _ _ _ _ _ _ _ ) ` _ ) _ ) ) ) P ) ) I ) ( I I I I I J ( I I P P P P P P H H H Z J H H H D H H H H D D D Z D G H Z D H H H L L G Z H U H Z H H G H H L H J L H H H H H H L H H D L D J H H H H Z H Z H H D D D D D D C D Z Z Z Z Z C Z F C B C C Z C V C C C V V V N m C M N M M M M M A M V N N B N N N N m B N N m B m G i.p.i.i.i.i.i.i.i.i.i.j.i.k.k.k.i.z.i.i.d.a.a.a.a.a.a.i.a.d.a.a.z.E i.a.i.i.f.a.f.f.f.f.f.g.g.g.h.h.A.g.h.S.A.A.h.A.A.A.A.A.A.G.G.H.S.H.h.G.H.G.H.A.H.H.S.L.S.L.A.L.L.S.L.S.U.S.L.L.A.D.L.S.L.L.U.L.L.L.T.U.P.I.T.T.~.~.T.T.~.T.T.~.^./.!.~./.E.E.^.(.(.(.(.(.(.(.(.`.(.}.[._._._.}.}.}.{.}.{._.}.}._.}.|.|.|.|.|. X|. X{.|. X|.|.|.|.|.|. X X|.'.|.|. X|.|.|._.{.|.|.|.|.|._. X_.`.|.(.(.(.(.`./.(.^./.~.(.~.(./.~.^./././././././././.(./.^./.[.~.~./.^././.~.(.T.T.^.~.~.~.~.T.~.[.T.T.T.T.T.T.T.U.T.Y.Y.U.I.T.P.U.L.L.P.L.L.L.L.S.S.H.H.Y.A.G.H.H.H.S.S.G.G.L.G.L.G.S.L.H.L.H.L.L.L.L.H.H.H.H.S.G.G.S.G.S.H.H.H.H.H.L.L.H.H.L.L.L.L.U.U.L.U.P.T.P.T.P.~.T.Y.Y.~.T.[.~./.~.^./.(.(.(.(.(.(.`.^.|.|.(._.|._._.|.}.'.|.|.|.|.|. X X.X.X.X.X.X.X.X.X.X.X'.zX.XzX'.dXzXzXzXzXzXzXzXzXxXdXcXzXzXzXdXnX@XxXxXxXzXzXzXzX.X'..XdXdX.X.X.X|..X.X|.|.|.|.|.|.|._._._._._.|.|._.`.(.|.^.{.}.}._.}._.|._.}.}._.|._.`._._._._._._. X_.'..X X|..X.X.X.XdXdXdX'.dX@XdXxXzXzXxXzXzXzXxXzXxXzXxXxXxX.XzXzXzXcXdXdXdXcXfXdXcXdXdXnXcXcXxXxXcXcXnXnXcXdXxXmXvXnXnXnXnXnXnXxXcXnXnXnXMXnXmXdXmXmXmXmXmXmXmXmXmXMXMXMXNXMXCXMXMXmXmXmXmXmXmXmXnXmXnXnXnXnXcXMXnXnXcXnXnXcXcXcXcXvXxXxXzXzXzXzXdXzXdX.X@X'..X.X X X}.}.}.}.{.(.(.(.(.^.(.^.{.(.(./././.~./.~./.T.~.~.T.~.T.T.T.Y.U.L.L.L.L.L.G.H.H.H.H.H.G.H.S.S.A.A.S.S.S.H.g.G.A.A.A.A.h.A.h.A.l.G.G.g.j.j.h.h.k.z.g.f.f.f.g.g.k.f.z.g.g.f.k.k.f.l.k.k.h.g.g.j.h.h.k.z.k.h.h.h.z.k.h.k.h.l.f.f.a.f.f.f.f.z.f.i.f.a.g.a.a.g.i.x.a.f.f.f.f.f.k.k.f.k.k.k.k.k.f.k.d.a.i.a.a.a.a.a.d.d.k.k.k.g.h.a.z.h.k.h.h.g.h.l.k.g.g.k.l.k.l.h.h.g.A.l.h.A.z.A.z.l.l.l.h.h.l.h.h.l.l.k.D.g.A.A.A.A.h.A.G.K.H.H.H.H.L.H.L.L.L.L.P.P.Y.U.T.U.T.T.Y.Y.Y.Y.U.L.U.U.U.K.L.L.K.L.L.L.L.L.L.L.L.L.L.L.L.A.P.P.P.L.P.P.P.L.L.L.L.P.L.P.P.L.U.P.L.L.L.P.L.L.L.L.L.P.L.L.L.L.L.L.U.U.Y.U.Y.U.Y.U.T.T.T.~.~.~.T.~.T.T.~.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.T.~.~.~.~.~.~./.(././.(.(.`.(.`.`._._._.(.{.[. X|.|.|..X.X|..X.X.X.X.X.X.X X.X%XdXdXdX.XzX.X.X.X.XdX'.@XdX'..XdX.X XdX.X.X X X@X}. X X{. X}.}.}.|.^.(.(._.",
+") I ' I _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ [ ' _ ' [ ` ' _ _ ' [ _ _ ' ' ` _ _ ' _ [ ' ' ` ' _ [ ' ` _ _ ' _ _ ` _ ' _ _ _ _ _ ' _ ` _ _ _ ) _ _ _ I _ ) _ ) ) ) ) ) ) I I ) I I I L ) I S P P P P P L P H L L L H J H H H Z Z H H L D D H Z H D H H Z H H L L L ( H H L L H L L L L H H H L H H H H J H H L J H D J D H L H Z H H L Z L H Z D D D D D Z H Z D Z Z Z Z Z Z F C C C C C C V V C V V V A M C N A M A M M N N N N C N N N N N N N B B N m G E i.p.d.s.i.i.i.d.s.f.j.i.i.z.i.z.z.i.z.k.z.z.d.x.a.a.a.a.a.a.a.a.a.a.i.a.f.i.i.a.a.i.a.k.k.f.h.k.h.f.h.G.A.h.A.A.A.A.A.h.G.A.W.h.A.A.A.A.H.G.G.H.H.H.H.H.H.S.L.L.L.L.L.U.L.S.S.U.U.Z.L.L.H.L.U.A.D.L.L.P.Y.U.Y.T.U.P.T.T.T.T.T.~.[.~./.~.~.[.^.{.{.(.(.{.]./.(.^.^.).(.(.}._.}._.}._.}.}.}.|.}.}.}._.}.}.|.|. X[.|.{.|.|. X|.|.|.|.|.|.|.|.|. X X|.`.|._.@X_.@X|.|.|.|..X|. X_._. X(.(._.^.(.^.^.(.(.(.^.^.^./.~.~.(././././.~.^./././.(./.!.^./.~./.^.~.~.~.~.^.T.~.~.P.T.~.~.~.T.T.T.T.T.~.T.T.T.T.T.U.Y.T.T.Y.U.U.L.L.L.S.L.S.L.S.S.L.H.H.H.H.S.G.H.H.H.H.G.H.H.L.G.L.H.L.D.D.L.L.G.L.L.L.H.H.S.S.H.H.S.S.S.H.H.S.H.H.H.L.S.L.S.U.L.U.L.L.U.L.P.P.P.T.P.P.T.T.T.T.~.~.~.~.^.E./.(.(.(.(.(.(.^.|.(.`.(.^._._._._.|.|.|.|.|.|..X|..X.X|..X.X`..X.X.X.X.X.XzX.XzXzXzXzXzXzXzXzXzXzXzXxXcXdXzXcXzXxXxXdXxX.XcXzXzX.XzXzX'..X.XdX.X.X.X|.|.|. X|.'.|.|.'.|.|.|.|._.|._.{._._._.`._.|.^.}.}. X|.|._.}.}.|._.`.`._._._._. X|.`. X|. X.X.X.X.X'..XdX.XdXdXdXdXdXxXzXzXxXzXxXxXvXzXxXxXxXxXxXcXcXzXcXzXnXdXdXdXdXvXdXcXdXnXdXmXcXcXcXcXcXnXnXJXJXxXxXmXxXmXdXxXJXnXnXnXnXnXnXmXmXmXmXmXmXmXmXmXmXMXMXMXMXMXmXMXMXmXMXnXmXmXmXnXmXmXnXnXNXcXnXnXnXvXfXnXmXnXnXcXcXcXxXxXxXxXzXzXzXzXdX.XzXzX.X.X X.X|.|.}.}.}.}._.^.(.(.(.{.(.|.^././././././.~./.^.~.T.T.~.T.~.T.U.T.U.T.U.L.L.L.L.H.H.H.S.G.Z.H.H.H.G.S.S.S.G.A.H.G.A.A.A.A.A.A.A.l.A.h.g.h.A.l.l.k.h.g.g.g.g.g.g.g.g.g.f.g.g.j.l.k.z.j.k.f.h.j.g.h.z.j.h.k.l.h.h.h.l.h.h.h.h.z.f.f.f.a.k.a.f.i.i.k.i.a.a.a.s.f.g.a.f.f.k.a.z.k.k.k.k.d.k.k.k.f.f.k.f.a.k.k.a.a.z.a.z.k.k.k.k.h.z.h.h.k.h.h.h.l.z.l.l.z.d.l.l.k.l.h.h.h.g.A.A.z.A.z.A.A.l.l.l.h.h.h.h.l.l.l.l.A.h.A.A.A.Z.J.A.G.H.H.H.L.L.L.L.L.L.U.U.P.U.T.T.T.Y.T.U.T.Y.Y.U.Y.L.L.U.L.U.Y.L.L.L.L.U.U.L.L.L.U.L.L.U.P.U.P.L.P.P.H.U.U.L.U.L.L.U.P.L.U.U.P.P.L.L.L.P.P.L.L.L.L.L.L.L.L.L.U.U.L.L.L.L.U.U.T.P.T.T.T.T.T.~.~.~.~./.T./.T.~.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.(.(.~.(.(./././.^.(.(.`._._.|.`._.|.|.|.|..X|.'..XdX.X.X.X.X.X.XzX.X XdX.XzX.X.X@X.XzXzX.X.X.X.XzXdXdX.X@X.X.X.X|.|. X}.|.|.|.}. X}.}.{.|.(.(.[.",
+"_ ) _ ) _ _ _ ) _ I [ _ _ _ _ _ _ _ ) _ _ ` ' ' _ _ _ _ _ _ _ _ Y ' [ _ ` _ ' _ ' [ ' _ _ ' ` ' _ ' _ _ _ _ ` _ ` _ _ _ _ _ ' ) _ _ _ ) _ _ _ _ _ ) ` ) ) ) _ ) ) ) P ) I I _ ) I I I ) I I I P J P P H J J L L J H H H H H H H H Z H H Z H H H L L Z L L L S L L H L H H L H J L H H J L P L H J H J H J Z L H H L H L D H D J D H H D H Z D J Z D D D Z D Z D Z D C Z C Z C F C C B C C B B C C N V N N M M N A M M M C N M M N N M A m N N C m B T u.u.i.i.i.i.i.i.i.f.i.d.i.f.f.f.k.k.d.z.d.a.d.d.x.a.a.a.a.a.a.a.a.u.a.a.i.a.a.i.a.f.a.f.f.j.f.k.h.h.z.h.h.h.h.A.A.A.A.A.A.A.G.A.G.A.H.h.J.S.S.H.A.H.H.H.G.H.H.P.S.P.H.D.U.L.L.G.G.L.U.D.L.L.L.S.P.L.L.U.L.U.U.T.T.T.T.T.T.T.~.T.~.~.~./.!.[././.^.!.^.(.(.(.(.(.^.(.`.(.`.}.}.}.}.}.}.}.}.[.}.}.}.}.}.}.}. X X}.}. X}.}.}.|.|.|._. X|. X'.|. X|.|.|.|. X|.'.|.|.|.|. X_.|._._._._._._.(._.).(.(.(././.~.^./.~./././.~.~.^.^.(.~.^.(.~.~././.T.(./.~.!.(.(.~.R.~.~.~.!.~.~.R.~.~.~.T.T.T.T.XXU.U.E.T.T.U.Y.T.Y.Y.I.Y.L.Y.L.L.L.L.S.L.L.H.L.H.H.H.H.S.H.H.H.H.S.S.H.H.H.H.H.H.U.S.L.S.L.S.L.S.U.L.U.G.G.H.A.S.S.A.L.S.H.A.H.S.U.L.L.H.L.L.L.U.U.L.L.L.Y.U.U.T.T.T.T.~.T.~.~.~.~.~.(.~.(.{.(.(.|.^.(.(.(.(.|.}.}._._._.}.}. X|._. X_.|. X.X'.|..X.X'..X.X.X.XdXdX.XzX X.XzXzXvX.XxXzXzXzXzXzXxXdXxXzXcXxXxXxXxXxXcXzXzXdXdXdXzX.X.XzX@X.X.X'.'.|.'.|.|.|. X.X|..X|.|.|.|._._._._._._._._.}.|.}.}.|.|.|.|.|.|.|. X|.|.`.|._.|. X.X X'..X.X.X.X'.zX.XzXzXzXdXzXzXzXcXcXzXcXxXxXxXxXcXxXcXcXxXxXzXvXzXzXzXzXdXdXdXzXcXzXxXxXxXxXxXxXnXcXcXcXnXnXzXnXmXnXJXzXnXcXnXnXnXnXnXnXmXnXmXmXmXmXmXmXnXnXmXmXmXmXmXMXmXmXMXMXmXmXmXmXmXmXmXcXmXmXnXnXnXnXcXcXnXcXnXnXvXnXcXnXcXnXdXdXdXdXdXcX@XdXdXdX.X.X.X@X_. X}._.}._.(.`.(.`.(.(.(.`.(.(./././.!./.!./.~.~.~.~.Y.R.~.I.U.U.T.T.U.U.H.L.L.D.S.L.D.H.H.H.H.H.S.S.S.S.H.G.A.H.G.G.A.A.A.A.A.h.h.h.A.A.h.l.l.h.h.h.f.h.f.z.g.g.g.g.z.k.h.k.h.k.h.k.g.g.k.k.l.h.k.h.l.l.l.h.h.h.h.h.g.h.k.k.k.z.a.f.f.a.k.z.k.i.i.k.a.a.a.a.a.f.f.f.f.k.g.a.g.j.f.f.z.g.a.g.g.g.f.a.a.g.k.f.d.d.f.f.f.f.f.k.k.k.l.h.h.z.h.k.l.l.l.k.k.l.l.h.h.l.l.h.h.h.h.g.A.A.h.A.l.h.h.A.k.k.k.g.g.g.A.h.h.g.A.h.A.A.G.H.G.H.H.L.H.L.L.L.K.L.L.U.Y.T.T.P.T.P.T.T.T.L.I.P.P.P.Y.Y.U.Y.L.P.L.L.L.L.S.L.L.S.L.L.L.L.L.L.L.U.U.I.L.L.L.Y.L.U.L.L.P.L.U.U.U.P.Y.U.L.L.Y.L.L.S.L.S.L.P.L.L.L.P.P.Y.U.T.T.T.^.Y.~.T.~.T.XX).XX~.T.~.~.~.~.T.T.Y.P.Y.!.Y.Y.T.Y.T.T.T.T.(.T.T.T.T.T.T.~.T.T.~.T././././.(.{.(.(.(.(.(.(._._.}.}._.|.|.|.|.|.|.|.|..X.X|..X.X|..X.X.XcX.X.X.X X.XdXdX.X.XzX.X.X.XdXdX.XdXdX.X'.dX.X.X.X|.|._.|. X{.|._._.`.(.`.(.",
+"` ) ) _ I ` _ _ _ _ _ _ _ I _ _ _ _ _ ` ' _ _ ` [ _ ' [ ' _ ` _ ' I _ ' _ _ _ ` _ ` ' ` ' [ _ _ _ [ _ _ _ _ ` ' _ ) _ _ ) _ _ _ _ _ _ _ _ _ _ _ _ ) _ _ ) _ ) ) _ ( ) ) ) ) P I ) J ) J ) I P P P P ) P P J J L L J L H H L H H H H H H H H L H L L L L L Z H H H H J H J L J H L L L L H J L L J L J H J L P L L H H J H L D H J Z H D H H D H D D D D H D D D Z Z D Z D Z C C Z C C C C C C B M C V V C V M A M M N M m C C N C N N N N N N N m N G u.s.i.i.i.d.d.i.f.f.k.i.i.f.d.f.z.k.k.d.i.d.d.a.d.k.a.a.a.a.a.i.a.a.i.a.a.k.a.a.a.a.f.a.g.k.j.h.k.k.h.h.h.h.A.h.h.A.A.A.A.A.A.G.h.A.A.A.A.Z.S.H.G.H.G.H.H.H.H.G.L.U.H.P.H.l.D.L.H.D.H.L.G.S.U.U.A.L.L.L.T.U.T.T.T.T.T.T.T.~.T.~.T.R.~./.T././././.^./.(.(.^.{.(.(.(.{._.(.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.{.}.}.}.}.{.}.}.}.}.}.|.}._..X|. X`.|. X X|.`. X_._.|._.}.|._.|._.|.|._._.{.`.(.^.(.(.(.(./.(.)./././.~./.~.~./.~.T.~.T.E.~././././././././.~.~.~./.!.T.~.~.T.~.~.~.~.~.R.T.~.~.T.U.XXT.U.P.T.T.U.I.I.I.Y.I.L.L.L.L.L.L.L.H.H.H.H.K.H.H.H.H.H.S.S.S.H.K.A.H.H.H.H.U.S.K.U.H.U.H.K.L.L.S.H.H.S.H.H.U.D.D.S.H.H.D.H.P.Z.S.L.H.D.L.L.L.L.L.Y.U.Y.U.Y.U.T.T.T.T.~.~.T.~.~./.~.!.^./.(./.{.(.).|.(.(.|.}._.}._._.}.}.}._.|.|.|.|.|.|.|.|.|.|..X|..X X@XdX.XzX.X.XzX.XzXzXzXzXzXzXzXzXzXxXdXdXnXdXxXxXxXxXxXcXdXzXxXdXdXzXdXdX.XdX.X|.|.|. X X.X.X.X.X X|..X|.|.|.|._.|.|._._._._._.'.|.}.|.|.|.|.|.|.|. X_.|.|.|.|.|.|..X.X'..X.X.X.XzX.XzXzX.X@XdXzXzXdXzXzXcXxXcXcXdXdXxXcXcXxXxXxXxXcXcXcXxXxXcXxXdXcXcXdXzXxXxXxXxXJXxXvXcXcXvXnXnXcXcXxXnXnXxXnXcXnXnXnXnXnXnXcXmXnXnXmXmXmXmXJXmXMXmXmXmXmXmXmXmXNXmXmXmXmXmXmXnXmXmXmXnXnXnXnXnXnXcXcXnXnXnXnXnXcXcXcXxXdXmXdXmXdXdXzX.XdX X.X.X|.|._.}. X_._.}.`.`.(.^.`.(.^.(.(.(./.(./.(././.~././.T./.T./.~.~.T.T.U.T.U.T.U.P.L.L.L.L.U.H.H.H.S.H.S.S.S.S.D.H.H.S.A.G.G.A.A.G.A.A.A.A.h.A.h.l.h.h.h.h.h.z.h.g.z.g.z.g.a.g.g.k.h.k.h.g.g.g.g.l.l.h.h.l.k.k.l.A.k.h.l.g.h.h.k.k.g.z.g.f.a.f.s.i.a.z.a.a.a.a.z.a.k.f.f.f.z.g.f.g.g.g.f.g.a.f.z.g.a.a.f.z.z.a.a.f.f.f.f.k.g.k.g.l.l.l.k.h.h.h.h.z.l.g.g.l.l.d.l.h.l.l.h.h.h.h.h.h.Z.h.A.h.l.h.h.g.l.A.g.k.A.k.k.h.g.A.A.A.A.A.A.G.H.H.H.H.L.H.L.L.L.L.L.L.U.P.P.Y.T.T.T.T.Y.I.I.P.P.P.P.I.L.U.L.L.K.L.L.L.L.L.L.L.L.L.L.L.L.L.L.U.L.U.L.L.U.U.U.P.U.P.P.L.P.U.U.P.T.U.U.L.U.L.L.P.P.P.L.L.U.Y.L.P.P.Y.T.Y.U.T.T.T.T.~.T.T.T.T.~.~.~.~.~.T.T.~.~.P.^.P.P.T.Y.Y.~.~.T.T.T.Y.T.T.T.~.T.T.T.T.~.T././././.(./.(./.(._.(.(.`._.[.}.}.|.|.|.|. X|.|. X|. X.X|. X.X.X.X.X.X X X XvXdXdX.XdX'.zX.XxX'.xX XdXdX.XxX'..X.X X.X|. X|.|.|. X`.`._._.(.(.(.(.",
+") ) _ ) _ ) ) ` _ _ ) _ [ _ I _ _ _ _ _ ` _ ' _ _ _ ` ) ` _ _ _ _ _ _ ` _ _ _ _ _ ' ` _ ` _ _ ' ` _ [ _ _ _ _ _ ) _ _ ` _ _ _ _ ) _ _ ) _ _ ) _ _ _ ) ) _ ) ) ) I ) _ ) I _ I ) ) I ) I ( I ) P P J J P P J H J H H H H H H L H H H H H H L H H L Z H L L H H H J H H J H H H J L L J L J L J J L J J L P Z L Z L H H H H J H H J H H H H H D D D H H D H A Z D D Z C D C Z F C C C C C C C C B C V C V V V V V M V A M A M C N N N C N C M M N m N T i.i.i.i.i.i.i.d.i.i.i.d.k.d.f.k.i.d.f.z.k.d.d.d.z.k.a.a.a.a.i.a.i.a.a.a.a.a.a.i.k.a.a.f.a.k.f.k.j.h.k.h.h.A.h.h.A.h.A.h.A.A.G.G.A.A.A.A.h.G.h.H.H.G.H.H.A.G.G.H.L.D.H.P.H.U.G.L.G.S.Z.L.L.L.S.H.L.L.L.U.Y.T.T.T.T.T.T.T.~.~.T.T.~./.T.~./.^.~.^./.(.(.(.(.^.(.^.(._.`._. X}._.}.}.}. X[.}.}.}.}.}._._.|._.{.}. X}.}.}. X_.}.}.|.|.|.|._.|.|.|. X|._.|.|.`.}.}.}.}.{._.}.|.{.{.`.(.`.(.`.(.(.(./.(.(.!././.~././.T./.~.~.~.^.~.~./.T./.~.~.E.~././.).~.(.~.R./.T./.!.~.~.~.R.~.~.~.~.T.T.T.T.T.T.T.T.P.Y.P.U.T.L.L.U.K.L.L.K.H.L.H.L.H.A.H.G.H.H.H.S.H.S.L.H.S.H.H.H.H.H.H.S.H.U.S.S.L.H.H.H.H.H.L.H.S.H.H.S.S.H.H.H.H.H.H.S.L.S.L.L.L.L.L.K.L.L.L.U.L.P.P.U.U.T.T.T.~.~.T./.~././././.(.(.(.[.(.(.(.(.(._.}._._._._.}.}.}.|. X|.|.|.|.|..X|.|.|..X'.'..XdX.X@XxX.XzXzXzXzXzXzXzXzXzXzXzXdXxXxXxXxXcXxXzXxXdXzXzXcXzXzXdXdXzX.X'.dX.X.X.X'..X|. X.X X.X.X.X X.X|.|.|._.|._.}.}.}.}. X_._._.|.|.|. X|.|.|.|. X X|.'.|.'..X.X.X.X.XdX@XdXdX'.zX.XzXzXzXzXzXzXzXzXxXxXxXxXcXxXcXcXcXcXxXxXxXxXxXdXcXdXzXxXxX@XxXdXdXcXdXcXxXcXdXcXJXdXnXxXJXzXnXxXvXnXmXvXmXxXnXmXcXnXnXnXnXnXJXnXmXmXmXmXmXmXmXNXmXmXmXmXmXMXmXmXmXMXmXmXnXmXmXcXnXmXnXnXnXnXJXxXcXcXnXxXnXvXcXcXnXdXnXdXcXdXcXzX.XzXdX.X.X.X|.|.|.}.}.}._._._._.`.^.^.(.^.(./.(.(././.(./././.~./.~.~.R.T.~.T.U.U.T.T.U.U.L.P.L.P.L.S.S.H.H.H.S.H.H.G.S.S.L.H.A.H.G.H.A.S.S.A.A.A.A.A.A.g.Z.l.l.z.h.h.j.l.h.z.h.z.z.l.g.g.z.h.k.k.f.z.z.g.h.l.h.h.z.h.h.h.h.g.g.l.l.l.l.z.g.k.g.g.a.f.f.f.f.g.a.i.k.z.a.a.f.z.a.z.f.f.k.f.g.g.g.k.k.z.a.z.z.f.f.g.f.g.i.a.g.d.f.f.k.f.k.f.g.l.k.h.l.h.l.h.h.g.z.g.h.h.k.l.l.l.h.l.h.h.l.h.A.h.A.A.h.S.l.h.h.l.k.g.h.g.g.A.D.h.h.h.h.A.A.A.G.G.G.H.H.H.H.L.H.L.U.Y.K.Y.U.U.T.T.P.T.P.U.T.I.U.P.P.P.P.U.U.L.U.L.U.U.L.L.L.L.L.L.K.L.L.L.L.Y.L.U.L.L.U.L.Y.L.U.U.P.P.P.U.U.U.U.P.P.P.P.L.L.L.U.L.S.P.P.L.P.P.U.U.U.T.T.Y.U.T.T.~.~.T.~.T.E.~.T.~.~.~.T.~.T.T.T.Y.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.(.~././.~.^./.^.^.(.(.(.^.|.{._.}.}.[. X[. X|.|. X X|.|..X X.X'..X@XdXdX.XxX.X.X%X X.XdX.X.X.X.X.X.X.X.X.X.X.XdX.X.X.X|. X'.'.|.|._._.|._._.`.^.^.(.",
+"_ ) ) _ ) _ ) _ ) _ _ _ _ _ _ _ I [ _ _ ' _ _ ` _ _ _ [ _ _ ` _ _ _ ) ' ` _ _ ` _ _ _ ' ` _ _ _ _ ` ' _ ' ` _ _ _ _ _ _ _ _ _ ` _ _ _ _ _ ) _ _ _ ) _ _ _ ) ) ` ) ) I I ) _ ) I J ) I I P ) ) J J ) J J L P L H P H P H H H H H H L H H L D L L L L L H L L L L L J L L J J L L P J L L J J J L P H P L P L P J H L P H H H H H H H H Z H H H H D D H D D H D D Z D D D C D Z C F C C C C C C B V V V V V V V V V N M M m M M N N N M M M N B N m T T i.i.i.i.p.i.i.i.d.i.f.z.i.i.i.f.i.k.d.i.i.i.x.a.a.a.a.k.a.a.k.a.a.a.a.a.a.a.f.i.a.a.f.f.k.j.j.k.k.k.h.h.h.h.h.h.Z.h.h.A.G.G.A.A.A.A.A.A.A.h.H.H.H.H.A.S.H.H.H.H.H.A.P.G.G.G.L.G.H.L.S.L.S.H.L.L.L.L.L.U.Y.T.T.T.T.T.~.T.[.~.~.~.~.E././././.^.E.(.^.(./.(.(.(.(.(.(.{._.(. X[.}.}.}.}. X}.^._.}.}.|.|.{.|.}.}.}.^.}.}.}._.}.}._.|.}.|. X_._.|._.|.}.|._.|._.}._._.`.`._._._.`.(.`.(.`.(.^.(./.(./././.!./.~././.T./.~.~.~.~.T.~.~.T.~.~.^.~.~./.!.~.T.~.T.~./.!.~.~./.Y.~.~.~.T.~.T.~.~.T.XXT.T.T.U.T.U.Y.I.L.U.U.U.L.Y.L.L.H.L.L.H.L.K.L.G.S.H.H.H.H.H.S.H.H.H.H.H.H.S.H.H.H.S.H.H.H.H.H.L.L.H.H.S.U.L.H.L.L.H.S.H.H.H.H.L.L.S.H.L.H.H.L.S.S.L.L.L.L.U.P.U.T.T.T.T.T.~.~.~././.[./.(./.(.^.(.|.(.(.(.(._._._._._._.}._. X|._.|.|.|.'. X.X.X.X.X|. X'..X.X.X.X.X.X.XzXzXzXzXzXzXzXzXzXzXxXdXdXdXnXzXcXxXzXcXcXzXzXzXzXxXdXzX.XdXdX.X.X.X.X.X.X.X.X.X'.'..X.X|. X'.|.|.|.|. X}.}.}._. X'._.|. X'.|.|..X.X|.'. X.X|..X.X.X'..X.X.XdX.XdXdX.X.XzXzXzXzXzXzXcXcXdXxXcXcXcXcXcXcXcXcXcXxXxXxX@XxXxXxXxXxXxXzXxXnXnXdXxXxXxXcXcXnXnXnXnXxXnXxXnXnXnXnXmXxXmXnXnXnXnXnXnXnXnXnXnXnXnXvXmXmXmXmXmXmXmXMXmXmXmXmXmXmXmXmXmXmXmXnXJXcXmXmXnXzXnXnXnXxXnXcXcXnXnXxXxXcXcXnXcXnXdXdXdXzX.XzX.X.X.X.X.X.X X}.|.}.}.}.}.^._.(.`.`.(.(.(.(.(.(.(.)./././././.~.~.~.~.~.T.T.XXE.U.T.T.U.T.U.L.L.P.U.L.U.S.L.U.H.H.G.G.H.D.H.H.G.H.S.A.S.S.A.G.A.A.A.h.A.j.l.l.h.l.h.x.h.h.h.h.h.l.h.z.h.h.k.h.h.h.g.A.g.h.l.l.h.l.h.l.l.l.g.A.g.A.g.z.z.h.g.g.a.z.i.f.f.f.a.g.k.i.a.a.f.a.a.s.f.a.f.f.f.g.g.k.h.g.f.k.f.a.i.f.f.f.a.a.g.f.f.f.f.f.f.g.g.g.k.l.l.l.l.h.h.h.A.g.h.h.h.l.h.l.h.h.h.h.l.l.S.z.A.h.h.A.z.h.h.h.l.g.z.z.g.z.k.k.h.h.h.A.g.A.A.A.S.S.A.H.H.K.H.L.L.L.L.U.U.U.Y.T.T.T.T.T.Y.U.T.Y.P.Y.P.P.U.P.P.P.L.L.L.L.L.L.S.L.S.L.L.L.L.L.L.L.U.U.T.L.L.K.U.L.P.P.P.P.P.P.U.Y.T.P.P.U.P.U.L.U.P.P.Y.U.P.Y.P.L.U.U.T.T.T.T.^.P.T.T.P.^.T.[.~.~.~.T.~.~.~.T.T.~.T.T.Y.~.T.~.T.T.T.~.T.T.~.T.!.T.~.~.~.~.T./.~.~././././.^.(.(.).(._.^._.|._.}.}.|. X|.|.|.|.|.|.|.|.|..X.X.X.X X.X.X.X.XzX.XdXdX.XzXzX.XxX'.xX.X.XdX.XdX.X.X.X.X|..X X|.|.|.{.|._._._._._.(.`.(.",
+") _ ) ) _ _ ) _ ) _ _ _ ( _ _ _ _ _ _ [ ` _ _ ` _ _ _ _ _ ` _ _ _ _ _ _ _ _ _ _ ` _ _ _ _ _ ` ` ` _ ` _ _ _ _ ` _ ) ` _ _ _ _ _ ` _ ) _ ' _ ` _ ` _ _ ) _ ` ) ) ) ) _ _ ) _ ) ) _ ) ) ) ) ) ) P P ) P ) I P P P U P H J L L L J L L L L H H H H L L L H L L L L J H H J J L L J L L P J J P J J L L L P H J L J L L J H J P J H H H H J H H H H K L H D H D H H D D Z Z D Z Z Z Z C C Z Z C Z C V C C V V V V V V V V V M M m B V C N N N N B M N G t.i.i.s.a.i.d.i.i.d.i.i.g.i.g.z.d.i.k.i.f.z.k.d.k.a.a.k.a.a.i.d.a.d.a.a.a.a.a.a.a.a.g.d.i.f.f.f.f.g.g.g.g.h.G.h.A.A.h.A.A.A.A.A.A.A.A.g.A.A.A.A.S.S.H.H.H.S.H.D.H.H.H.H.H.H.H.H.H.H.H.H.H.L.G.U.L.L.H.U.T.T.T.T.T.T.T.T.~.T.~.T.T.(.~././.(.^.^.(.(.E.(.(./.^.^.^._._._._.(._._. X|. X|.}.}. X_._.|.|.@X_._._.^.}.}._._._.{.{.{._._.}.}._.|.}.}.}.}.}.}.}._.|._.|._._.`._._.{.`.{.(.(._.^././.(.!.(./.(.~./././.E.T.~.~.~.T.^.~.T.~.~.T.~.E.~.~./.~.T./.~.~.~.~.~.~./.~.~.!./.T.T.T.~.T.~.T.T.T.T.P.T.T.Y.U.U.L.Y.L.U.L.L.L.L.H.L.L.L.H.H.H.H.H.H.S.H.H.H.h.H.H.H.A.H.H.H.S.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.A.D.H.H.S.L.S.L.S.H.L.H.H.L.G.L.L.L.S.L.U.L.L.U.U.U.T.T.T.T.~.~./././.~.^.(././.^.^.(.^.(.`.(._.^._._._._._._._.|.}.}.}.`. X'. X|.|..X.X.X.X.X.XxX.X.XxX.X.XdXdXzXzXzXzXzXzXdXzXzXzXzXdXzXzXzXzXzXxXzXzXdXdXdXdX'.dX'..X.X.X'..X|..X.X.XdX.X.X.X.X|..X|. X|.|.}.}.}.}.}._.|._.|.|.'. X|.|.'..X X.X.X.X|..X.X'.dX@X.XdX.XdXdXdXdXxXdXdXdXzXzXcXxXvXxXxXcXcXcXcXmXcXcXcXxXnXxXxXxXxXxXxXxXxXvXxXxXcXxXxXxXxXxXJXcXnXnXcXnXxXnXxXxXxXvXzXnXcXmXvXmXnXnXnXnXnXnXnXnXnXnXnXmXmXmXnXMXMXmXmXnXmXnXnXmXmXmXmXmXmXmXmXnXmXmXmXcXnXcXcXnXMXcXcXcXnXnXxXxXnXcXcXnXdXcXdXdXdXdX XdX.X.X.X X|.|.|.}.}.}._._.`._._.^.`.`.^.(.(.(.(.(.(.(./.!./.(.~.~.~.T.~.T.Y.XXT.U.U.U.T.U.U.P.P.P.L.L.U.S.H.H.D.H.H.H.L.G.H.H.H.H.G.G.A.S.G.A.A.A.A.A.A.A.h.A.A.l.h.h.l.l.h.h.l.z.k.h.h.k.h.h.h.k.g.g.g.h.h.h.l.l.h.l.h.h.A.h.h.A.h.z.g.h.g.g.g.a.f.f.f.f.g.a.f.f.a.f.a.f.g.d.g.a.f.f.k.k.g.g.a.z.k.k.f.f.z.a.f.f.f.k.g.a.f.k.f.k.g.g.f.f.l.h.z.h.h.h.h.h.l.h.h.h.h.h.h.l.h.h.h.g.h.h.A.h.z.A.A.h.h.h.h.l.h.z.z.h.h.f.h.h.h.h.h.h.h.h.S.H.S.S.S.H.H.H.L.L.L.L.P.L.L.P.T.L.P.T.T.P.U.U.U.P.P.Y.P.P.P.P.P.P.L.Y.U.L.S.L.L.S.L.L.L.L.L.L.L.L.L.Y.U.U.U.U.U.U.I.I.U.I.Y.T.Y.T.T.P.T.U.P.P.P.U.P.P.P.P.P.T.P.T.T.T.T.T.T.T.~.T.~.T.~.T.T.~.~.~.~.~.~.~.~.T.T.T.~.T.T.T.~.T.T.~.T.~.~.~.T.!.Y.T.~.~.T.~.~.~.~./.(.~.~.~.^.^.(.(.(.^._.|.|._.|.|._._._. X|.|._.|.|.'.|..X.X.X.X'..XdXdX.XdX.XdXdXxX'.zX'..XxX'..X.X.X@X X.X.X.X.X.X|..X|.|.|.|.|._._._._.(.(.(.(.",
+") ) _ ' ) _ ` ) _ _ ) _ ) [ U _ [ _ I _ _ _ _ _ _ _ _ _ _ _ _ ) _ ` _ _ ) ) _ _ _ _ _ _ _ _ ` _ _ _ _ _ _ _ _ _ _ _ _ ` ` _ _ _ _ _ _ _ ) ) _ ) _ _ _ ) _ ) _ ) ) _ ) ` _ _ ) ) _ ) ) ) ) ) ( ) I P ) P I I P P P P J P J L L L L L H H H L H L Z L L L L L S L L L L L L L L L L J J L J P L P J J J H P J J L L J L H H H H H H H H H L L H H H H H H Z H H Z H D D D Z Z Z C C Z Z C C Z C C C B C V C V V V V V M V N C N C V N N N M V N C m E s.a.p.i.i.i.i.f.i.i.f.i.i.g.i.i.i.k.d.i.i.a.i.a.a.a.a.a.k.d.k.i.x.i.k.a.k.a.a.a.a.a.i.i.k.f.f.j.f.g.g.g.h.g.h.h.h.A.h.A.Z.h.h.A.A.A.A.A.A.H.G.A.S.S.A.S.G.A.D.H.D.H.H.S.G.H.G.G.S.G.H.H.H.H.U.H.U.L.U.U.P.P.T.~.T.T.E.T.~.~.~.^.~.~.~./.~././.(./.(.^.^.(.(.`._.(._.(._._._. X}.}.}._.[. X X|.}.|.}.{.{._._.}.}.}.}.{.}.}._._._.}._.}.}.}.}.}.}.}.}.}.}._._.(.|.{._._._._._.(.`.(.`.`._.{././././././.~.~././.~.!.T.~.T.[.~.~.~.~.T.Y.~.~.Y.I.~.T./.~.T.T./.~.T.~./.~.~.~.~.T.~.~.~.~.T.T.T.T.T.T.U.T.P.P.P.U.L.L.L.U.S.L.L.L.L.H.L.L.H.H.S.H.H.H.H.H.H.H.H.H.H.H.H.S.H.H.A.H.H.H.H.H.H.H.H.H.H.H.H.H.S.U.S.L.H.U.H.L.S.H.H.H.H.H.H.L.H.L.G.S.S.L.L.L.L.L.P.Y.I.T.T.T.~.~.~./././.~.(.]././.(./.(.(.(.^.(._._._._._.{.}._.|._. X}.}.`. X'.|..X.X|.'.|..X.X.X.X.X.X.XzXdXdXdX.XzX.XxXzXzXvX.XzXzXdXxXxXcXzXdXxXzXzXzXdX@XdXxXzX@XdX.X.X.X.X.X.X.X.X.X.XdX.X.X.X.X.X|.|.|._.|.}.|.}. X|.|.|.|.|.|.|.'.|..X|..X|..X.X.X.X.XdXdXdX.XdXdXdX@XdXdXdXxXdXnXzXzXzXxXxXxXxXxXnXnXcXzXcXcXcXxXxXxXxXxXxXcXxXxXxXxXxXxXxXcXxXxXxXxXdXcXcXnXxXcXnXxXnXnXxXnXJXxXnXnXxXnXnXnXnXnXnXnXcXnXxXnXnXMXvXmXMXmXmXmXmXcXmXmXmXmXmXmXmXvXmXmXvXmXcXcXcXmXJXnXnXnXxXcXcXcXxXnXxXxXdXcXdXdXcXxXdXdX'..X.X@X.X.X.X.X|.|.|.}.}.}._.}._._.`.^.(.(.(.(.(.(.(.(.(.(.(.(./././.~.~.~.~.T.T.T.T.T.T.T.P.U.U.Y.P.T.U.L.L.S.S.L.H.D.H.H.S.L.H.H.H.H.G.K.S.H.G.S.W.A.A.A.A.A.A.h.A.h.h.l.A.l.h.h.l.l.h.h.h.h.h.h.h.h.g.g.h.A.h.A.D.l.A.h.A.h.g.z.h.h.z.g.z.g.g.g.g.j.f.f.k.f.z.g.g.a.f.s.i.g.i.d.a.g.f.z.k.h.g.g.g.h.k.f.f.f.i.g.k.f.a.f.a.z.f.k.k.f.f.f.g.g.k.z.h.k.h.h.h.h.h.l.h.h.h.h.l.l.h.h.l.G.A.h.A.A.A.A.A.h.h.h.l.l.h.z.z.A.k.k.z.h.h.h.l.l.h.A.h.S.A.G.G.H.G.L.S.H.U.A.P.P.L.P.L.U.P.P.P.P.U.T.U.Y.P.P.T.P.Y.P.Y.P.U.Y.L.L.L.L.L.S.S.L.S.L.L.L.L.L.U.U.Y.U.Y.U.U.P.U.U.Y.I.Y.P.T.U.T.P.T.U.T.P.P.U.T.P.T.P.Y.Y.T.T.T.T.T.T.T.T.T.T.~.~.T.~.T.~.~.T.T.~.T.T.T.T.~.T.T.~.T.~.T.~.T.~.~.T.I.T.T.T.T.~.T.~.~.~.~.~././././.(.~./.^.(.(.|.^.(._._.[.|._.|.|.|.|.|. X|. X|.|.|. X.X X.X.X X X.XdXdXdXdX%X.X.X'.zX.X.X.X'..X.XdX X.X.X.X.X.X X.X X'.|.|._._._._._.|.(.(.(.",
+"_ ) ) ) ) _ ) _ _ ) _ _ _ _ _ _ I _ _ _ ` ) _ _ _ _ _ _ _ ` _ _ ` _ ) _ _ ` ) _ _ _ _ _ ) ` ) ' _ _ _ _ _ _ ) ` _ _ _ _ ] ` ) _ _ _ _ _ _ _ ) _ ) _ I _ _ _ ] ) _ ) ) ) _ I ) ) ) ) ) ) ) I ) ) I ) I P I P I H P P P J J L J J L H H L J H J L L L S L L H L L H H P L L P L P P L P P P L P J P P L P J L J P J J J L L L J J L L H H H H H H H H H H H S Z H Z H D D H Z D Z Z C C C C C B Z C C C C C V C V V V C M N C B N M V N B B B N B G T i.d.d.i.a.i.i.d.k.d.k.i.i.z.i.i.d.i.f.i.f.i.a.a.a.a.a.a.d.k.d.k.x.d.z.a.a.a.k.i.i.i.k.i.d.z.f.f.h.f.j.g.h.h.h.l.h.A.h.A.h.A.A.A.h.G.h.A.A.h.z.S.S.S.S.S.G.S.S.A.H.S.D.D.S.A.S.S.G.D.H.H.H.L.H.U.L.L.U.T.T.T.T.T.T.~.~.T.T.~.~.T./.~././././.(./.(.^.^.(.(._.(.(._.(._._._._._.(.}.}.|.(.{.}.|.}.}.}.'._.}.}._. X X^.}._.}._.{._.{.{.}.}.}._._.}._._.}.{._._._.^._.{.(._.(.(.`.^.(./._.(.^./.(./.T.).).T.~.~.~.~.~.[.~.~.^.~.T.~.[.T.T.T.~.T.~.Y.T.R.~./.T.T.T.~.~.T.~.~./.T.~.~.~.~.T.T.T.T.T.T.T.T.T.U.T.L.L.L.Y.U.L.L.U.Y.L.L.K.J.L.L.H.H.H.H.S.U.H.H.H.H.H.H.H.H.G.H.H.H.H.H.H.H.K.S.H.H.H.H.H.H.H.L.H.L.L.S.L.H.S.L.S.H.U.H.D.H.H.H.H.H.L.L.L.L.L.P.P.P.I.Y.Y.Y.T.T.~.U.!./././././././.~.(.(.(.`._.(._._.{._._.}.}.|.|._.|.}. X|.`.}. X|..X X.X'..X.X@XzX'..X.X.XzXdXdX.X.XxX.X.X.XzXdXzXzXdXcXzXdXcXdXzXzXzXzXzXzXdXzX.XzXdX'..X.XdX.X'..X.X.X.X.X.X.X.X.X.X.X'.'.|.'._._.}.|.|.|.|.|.'.|. X|. X.X X|..X.X.X.X.XdXdXdXdXdXdXxXzXzXzXzXdXxXxXdXzXzXxXxXxXxXnXxXnXnXxXJXmXcXxXxXxXxXcXcXdXcXxXxXxXxXxXxXxXxXxXxXnXcXxXnXnXxXcXxXnXvXnXnXxXnXxXnXcXnXnXnXnXnXnXnXnXnXnXnXxXnXnXnXMXmXMXnXmXmXmXmXnXnXnXnXnXnXmXnXnXnXnXnXcXcXcXmXnXxXxXnXcXcXxXcXxXxXxXxXcXdXxXdXdX@XdXdXcX.X.X.X.X.X|. X X|.}.}._.}._._._._.(.(.(.(.(.(.(._.~.(.(.(.(.^./.~./.~./.~.T.~.~.T.Y.T.T.T.U.T.T.U.U.P.L.L.L.L.Y.L.H.A.Y.S.U.D.L.S.H.H.H.H.H.H.H.A.Z.G.A.H.A.h.A.A.A.A.l.l.l.A.A.l.l.l.h.S.h.h.h.h.h.h.h.h.h.l.z.h.z.A.l.l.h.A.D.l.h.h.l.g.z.h.z.g.a.g.z.h.k.k.k.a.g.g.f.f.a.a.a.f.g.a.f.k.k.g.g.z.k.k.k.f.f.f.g.a.f.k.f.k.f.i.f.k.f.k.g.g.g.g.k.k.k.h.h.h.g.g.l.l.l.z.l.h.l.l.h.h.A.h.h.A.A.A.A.A.A.h.S.l.h.h.l.l.z.l.h.h.h.h.z.h.l.l.h.A.A.A.S.G.S.H.H.H.H.L.L.L.U.L.P.Y.L.L.P.L.P.P.P.T.Y.U.P.T.P.T.P.Y.P.P.U.L.L.L.L.S.P.L.L.L.I.L.L.L.L.U.L.U.L.Y.U.I.Y.Y.T.U.U.T.Y.U.U.T.T.U.U.T.P.P.U.U.P.T.T.T.Y.T.T.T.T.T.T.T.~.T.T.~.~.~.T.~.T.~.~.T.T.R.T.T.~.~.T.~.~.T.~.Y.~.~.Y.T.T.~.T.T.T.T.T./.~.~.~./.^.~.~././.~.(./././.(.(.(.(.(._._.|. X{. X|.|. X_.|._.`.|.|.'. X.X.X.X.X X XdXdXdXdX.XdX.X.X'.zX.XzXxX.X.X.X.X.X.X.X.X|. X.X|.|.'.|._._._._._.|.(.(.(.^.",
+") _ ) _ ) ) _ I _ ) _ ) _ _ _ U _ _ ) _ _ _ _ _ _ _ _ [ _ _ _ _ ) _ ) _ _ _ ) ) [ _ _ _ _ _ _ ` _ _ ` _ ` ) _ _ ) _ _ _ _ _ _ _ _ ) _ _ _ ) _ ' ` _ _ _ _ ) ) ] _ _ _ ) _ ) _ _ ) ) _ ) ) ) I ) ) ( I I ) P P I P L P J L J J L L L L L H L L L L L L L L L J L P J P H J J L L J J J L P H P L L P J P J P J L L L L J L L J H J H L J L H H H H H H H H H H H H H G Z D Z F Z Z Z Z F C C Z Z C C C C C C C V A M M N C M C B N V B N N B N C G w.i.w.i.i.a.e.i.f.i.i.d.i.d.i.d.k.i.f.i.i.i.i.a.i.a.a.a.k.d.k.z.a.k.a.a.a.z.a.a.f.i.k.i.g.i.k.a.z.g.g.g.k.h.h.l.h.h.h.h.A.A.A.g.h.h.A.G.h.A.A.G.A.A.h.S.S.A.G.S.S.S.S.H.G.G.G.G.S.G.G.G.H.G.H.U.U.H.U.L.U.T.T.T.T.T.~././.T.~././.!.~./././././.(.(.(.^.(.(.(.`.(.(._.(.(._.{._._.}.{. X{.}.}.}.}.}.}._._._._.}.^.}.}.^._.{.^._._._.}._.}._._.{.}._.|._._._._._.(.{._.(.(.(.`.^.(.(.(./././._.~.^.~.~./.~.~.~.~.T.~.T.T.~.E.T.~.~.~.U.~.Y.T.T.Y./.T.~.~.I.~.Y.!.~.~.~.~.~./.~.~.~.~.~.T.T.T.Y.T.T.T.T.T.U.U.P.Y.L.L.L.U.L.L.H.L.L.L.L.H.L.L.L.H.U.U.H.H.H.H.H.L.S.H.H.H.H.H.H.S.H.H.H.Z.S.S.H.H.S.H.H.H.H.L.H.H.L.A.L.L.U.S.S.H.H.H.H.H.H.H.H.L.S.L.S.S.U.P.P.I.I.Y.T.~.K.~.~.~.~./././././././././.(.^.(._._._._._._.}.}._._.|.[.|.}._.|. X|.|.|. X'..X.X'. X.X.XzXzX.XzXdXdXzX.X.X.XxXxXzX'.zXzXcXdXxXdXdXxXzXzXzXzXzXzX.XzXzX.XdX.X.X.X.X.X@X.X.X.X.X.X.X.X.X.X X X X X_.|.{.}.}._.|.|.|._.|. X X X.X|..X.X.X'. X@XdXdXcXdXdXdX@XdXzXzXzXzXzXdXdXcXxXxXxXxXxXnXxXxXvXnXnXxXcXcXxXxXxXxXxXxXJXxXxXxXxXxXxXxXcXcXxXxXdXJXnXxXnXnXxXnXxXnXxXnXmXxXxXnXxXvXxXmXnXnXnXnXcXnXnXnXnXnXnXnXmXvXcXmXmXcXcXmXnXnXnXcXnXnXnXnXcXnXnXnXcXmXcXcXnXxXnXxXvXcXxXvXxXcXcXdXdXcXdXdXdXdX.XdXdX'..X.X.X.X|..X|. X}._.}.}.}._._._.`.`.(.(.(.(.(.(.(.(.(.(.(.^./.(././.~.T.~.T.~.T.T.T.T.T.T.T.T.Y.P.Y.L.L.L.L.L.S.U.U.H.U.S.L.L.L.L.S.H.H.H.H.G.H.G.G.G.A.H.A.h.A.A.A.A.G.h.A.l.h.A.l.g.z.h.h.z.S.z.D.h.h.A.A.D.g.D.D.A.D.h.A.g.h.h.h.h.h.g.g.h.g.g.g.f.j.k.h.k.k.k.a.a.g.s.g.a.a.a.f.a.g.k.g.g.g.g.k.z.f.a.j.i.f.a.z.z.f.k.k.k.g.k.f.g.f.g.g.z.h.k.k.h.h.g.A.h.h.l.l.A.l.A.A.h.h.h.A.h.A.h.A.A.h.A.h.z.h.h.h.h.g.z.l.g.h.z.j.l.h.l.l.h.h.A.g.S.S.S.G.H.H.H.H.S.U.S.L.L.L.L.U.L.L.P.P.P.P.U.T.P.T.T.T.T.P.T.P.P.U.L.P.P.L.L.L.L.S.L.L.L.L.L.U.U.Y.Y.U.U.Y.U.U.T.U.I.T.U.U.T.U.T.T.T.T.T.T.T.U.T.T.T.Y.T.T.T.T.T.T.~.T.T.~.[.T.~.~.I.~.T.~.T.T.~.(.T.T.I.T.~.~.T.~.T.~.Y.T.T.~.~.I.T.T.T./.T.T.T.~.~./././.[././.(././././.(.(.{.(.(.{.|.{.|.|.|.{. X|._. X_.`.|.|.|.|.|.'..X.XdXdXdX%X.XdXdXdXxX.X.XzXzX.X'.zX.X.X.X.X.X.X.X.X.X|..X X X|. X X_._._._.|.^.`.^.",
+") _ ) ) ) _ ) ) ) _ ) _ _ ) _ _ I _ _ ) _ _ I _ ) ` _ _ _ _ _ _ ` ' ) ` ' ` ) ` _ _ _ _ _ _ _ _ _ _ _ _ ` _ ) _ _ ` ] ) _ ) _ _ _ _ ` ) ] _ ) ) ) _ _ _ _ _ _ _ _ ` _ ` _ ) ) ) _ ) ) I ) ) _ I ) ) ) P I ) J J ) ) J I P P P P P L L J J L L H J L H J L L L P J H L J J L J L P J L P J P J P J P P L P P P L P J J H L J L P H L H H L L J H H J H H H H H H H D K Z H H Z D Z Z Z Z C Z Z C C C C C C C B C B B C N N C N N N C C M N B B B E u.d.p.i.d.d.d.d.i.d.a.i.a.g.a.s.i.i.i.i.i.i.i.i.i.i.a.a.i.i.k.a.a.f.f.d.i.i.k.d.f.d.k.f.k.k.k.k.d.k.g.g.k.h.h.h.l.l.G.g.h.l.G.g.h.G.A.g.A.z.S.z.A.l.A.S.D.A.S.D.S.S.G.G.G.l.G.h.G.D.H.L.A.L.L.L.L.L.T.P.T.Y.T.T.T.E.T.T.~.~.T.~.~.(.~.(././.(.(./.(.(.(./.(.`.(.(._._.~._.^._. X}.}.}. X}.}. X}.}.}._.}._._. X}.}._.{._.^._.}.(.|.(.}._._.{._._._.{._.(._.(.(.(.(.(.(.(.(.(.(.(./.(.^././././.(./.E.~.~.~.T.~.~.~.~.~.~.~.T.~.~.T.~.T.^.L.Y.^.T.~.T.P.T.P.T.T.T.~.~.!./.~./.!.[.~.~.~.Y.T.T.T.T.T.T.T.I.Y.Y.U.Y.L.L.L.L.L.L.L.L.L.H.L.Y.L.L.K.L.U.S.U.H.H.L.S.L.H.H.H.H.H.H.H.H.G.G.H.H.H.A.H.G.D.H.H.H.H.S.L.H.H.L.L.L.L.S.Z.H.S.H.H.H.H.S.H.U.S.H.L.L.L.L.U.T.Y.U.T.T.T.~.~.~.~.~.~.(.~././.!./.~.(.`.^.`.(.|._.^.|.^.`.`./._.|._.}.}.}. X X|.|.|..X.X.X.X.X.X X.X.XxX'.@X.XxX.XzXzXzX.XzXzXzXzXzXzXcXdXdXdX@XdX.XdXdXdXdXbXdXdXdX'.zX.XdX.XzX'.'.cX.X.X.X.X.X.X.X.X X|.{.|.|.}.}.}.}._.|.|.|.|..X.X.X.X'..X.X'.dX'.dXdXzXzXzXzXzXzXzXzXzXxXcXxXxXxXxXxXcXxXnXvXxXxXnXxXcXnXcXcXcXcXxXxXxXcXxXxXxXxXvXvXxXxXdXcXcXcXcXcXcXcXcXcXnXnXcXcXcXnXxXnXxXcXcXcXcXcXxXnXnXxXvXnXvXxXcXcXcXcXnXnXnXnXnXxXnXnXnXnXcXmXnXcXcXcXcXcXnXnXcXcXcXcXnXxXvXvXcXxXxXdXxXdXcXcXdXzXzX@XdXzX.XdX.X.X.X@X|..X.X X|.|._._.|.{._.}.|._.(.(.(.(.(.(.(.(.(.^.(.^.(.(.(.(.~.(.^.~.~.~.T.~.~.T.T.T.T.T.T.T.T.U.U.L.U.L.L.L.L.S.L.S.S.L.L.S.S.U.S.L.S.H.H.H.H.H.H.A.H.A.J.A.A.A.A.A.A.g.A.A.h.A.h.A.h.h.A.h.A.A.A.A.h.H.z.A.A.A.A.z.A.h.A.h.h.h.h.h.h.f.h.g.j.j.h.k.k.k.g.g.k.a.f.a.a.f.f.a.a.k.z.a.k.f.g.k.k.a.g.a.g.i.a.f.f.f.g.a.j.g.k.k.g.g.f.h.f.g.g.k.k.h.h.h.h.h.h.l.A.h.h.A.h.D.h.z.h.A.h.A.A.A.A.g.Z.h.h.h.z.h.h.l.l.l.h.a.l.h.l.l.h.h.l.A.h.G.A.A.G.H.H.H.H.U.L.H.H.U.H.L.L.L.L.U.Y.U.U.P.Y.T.~.P.^.U.Y.Y.P.T.Y.L.U.L.L.P.L.L.L.L.U.L.L.S.U.U.L.U.U.U.P.Y.U.P.U.T.U.U.P.U.T.T.T.P.T.P.T.P.T.T.P.P.T.T.T.T.[.T.T.[.T.T.T.~.~.~.~.T.T.~.T.~.T.T.~.I.T.Y.~.I.~.T.I.~.T.~.~.U.~.T.I.~.~.T.~.T.~.~.~./.~././.(././././././.(.(.(.(.^.(.|._.(.`.`.|.|.|.|.|._.|._.|.|._.|.'. X.X.X|..X@XdX.X%XdXdX.X.X'.xX.XzX.X.X.X.X.X.X.X.X.X.X.X|.|.|.|.|._._.|.|.}.}._.(.|.`.`.",
+"_ I ) _ _ ) _ _ ) ) ) _ ) _ _ _ _ _ _ _ _ _ _ _ _ _ _ ) ) ) _ _ ` I _ _ J _ ' ) _ ) ) _ _ ` ` _ _ ` _ _ _ _ _ _ _ _ _ _ _ ` _ ] _ _ ) ] _ ) _ ` ` _ _ _ _ _ _ _ _ ) _ ' _ _ _ _ _ _ ] ` _ ) ) ) ) ) ) ) ) ) ) I J J J I P P P P P L L L H L L H H J J J L J L L J J J J L J L P H P P P P P P P P P J L P L P P P L P L J L J H L L J L L L H H H H L L H H H D H H Z D Z Z D D D D Z Z Z Z C Z Z Z Z C C B Z B B B B B B N N B V V C N N N B C e.u.d.p.d.i.p.d.i.z.i.i.d.a.a.a.d.d.d.a.i.i.i.s.i.i.i.a.a.f.i.i.a.k.f.k.d.k.k.i.f.i.i.z.k.d.k.z.f.k.k.g.k.g.h.k.h.h.l.l.g.h.g.g.g.G.A.A.h.A.A.A.A.S.A.S.A.A.S.A.A.H.S.S.D.D.D.G.G.S.H.G.D.A.Z.L.D.L.U.P.T.P.P.T.T.T.XXT.~.T.XXXX/.~.~.[.^.E.(./.].(.(./.!.(.(.(.(._._._._._._.}.^._.}.[.}.}.}.[.}.}.}.^.^._.^._.}.{._.{.{._.}.^.{._.(._._.^._.(.^._._.^.(.(._.(.(.(.(.(.(.(.(.(.(.~.(././././.T././.~.^.[.~.E.~.~.~.T.T.T.~.~.T.T.~.Y.T.Y.T.T.T.T.T.T.^.^.^.T.T.~.T.T./.T././.T.~.~.T.~.T.~.T.T.T.T.I.T.U.I.U.I.Y.Y.L.Y.Y.L.Y.L.L.L.Y.L.L.L.L.L.U.S.L.S.L.L.H.H.L.G.H.G.D.H.H.F.H.G.G.H.D.H.H.H.G.H.H.H.H.H.H.H.L.U.A.L.D.L.L.D.H.H.H.H.H.S.H.H.S.L.S.H.L.L.L.L.U.U.U.T.T.T.~.T.~.!.~.(././.^.!././.(./.^.(.^.`._._._.|.|.|._._.{.|.|._. X}.}.}.|.|.|..X|..X.X|.@XdXdX.X.XdXdX X.X.X.X.XzX.X'.zXzXzXzXzXdXxXxXdXdXdXdX@XdXdXdXdXdXdXdXdXzXdX@X'..XdX@X.X.XzX.X.X.X.X.X.X X|. X_._.|.}.}.}.|.|.|.|.|.|. X.X.X.X.X'..X.X.XdXzXzXzXzXzXzXcXzXcXxXzXcXxXxXxXxXcXcXcXnXxXdXJXnXxXnXxXcXcXcXmXnXxXxXxXxXcXxXcXcXxXxXxXcXcXcXcXcXcXnXcXcXcXcXcXcXnXcXnXcXxXxXcXcXcXxXxXnXxXcXcXnXnXxXxXcXnXcXcXnXcXcXcXnXnXnXnXcXnXcXcXdXnXcXxXcXcXcXcXcXcXcXcXnXcXxXxXvXxXxXxXcXdXzXzXzXzXdXdXdX'.'.@X.X.XdX X.X.X|..X|.|.|.|._.|.}._._.{._.^.(.(.(.(.(.(.(.`.(.(.(.(././.(./.!.~.~.T.~.T.T.T.T.T.T.Y.T.T.T.U.U.L.L.L.L.L.L.L.L.L.Y.L.L.U.L.L.S.U.S.H.H.H.H.H.S.S.S.G.H.A.A.A.A.A.S.G.A.h.A.A.A.A.h.A.h.A.A.h.h.A.A.A.h.h.A.A.A.A.A.A.h.A.A.h.h.h.h.h.f.z.z.f.l.k.h.k.g.z.a.a.f.f.f.a.a.f.a.k.f.f.f.f.g.z.g.z.f.g.i.d.f.a.f.f.f.j.g.g.g.g.g.f.g.g.f.g.z.h.g.z.h.h.h.g.h.l.l.A.A.h.l.l.A.A.h.l.A.h.h.A.h.A.h.h.h.g.A.h.z.l.l.z.h.h.h.x.l.l.l.l.l.h.h.A.A.G.A.G.H.H.h.K.H.U.D.S.L.L.H.L.L.P.L.L.P.P.U.T.P.T.U.T.T.T.Y.Y.U.U.Y.L.L.L.L.S.L.L.S.L.L.L.L.L.P.U.L.U.L.U.Y.Y.L.T.U.Y.T.U.T.P.P.T.T.T.T.T.T.T.T.T.T.T.T.T.P.T.T.T.P.^.T.~.T.~.T.~.~.T.~.T.T.~.I.~.~.~.I.~.T.T.~.~.~.T.~.~.~.~.T.T.T.T.~.T.T.~././././././././././././.(.(.(.(.^.|.(.|.|.`.`.`.|.|.|.|.|._.|._._.|.|.|. X X.X.X.X.XdX.XdXdXfX XzX.X.XzX.XzX.XzX.X.X.X.X|..X|.|.|.|.|.|._.|.|.|.}.}.}.[._._.(.(.",
+"_ ) ) ) ) ) ) ) ( _ _ ) _ _ ) ) I _ ) _ _ ) _ ) Y ' ` ) _ ) _ _ ) ' ) I ) I ) ) ) _ ) _ ) _ _ _ _ _ _ _ ] _ _ _ _ _ ` ) _ ` ) ) ) ) ) _ _ _ ) _ _ ) _ _ ` ) _ _ _ _ _ _ _ _ _ _ _ ) ) _ ) _ ) ) ) ) ) ) J ) ) J J ) ) I P P J I P L P L L L L L L L H J L J L U L L P L L J J P J P P L L P P P P P I P P L P L L P L P P H L P J L L L L J L L J L H H H J H H H H H H H H D H Z Z Z Z Z Z Z C C F C C C F C C B B B B N B C B C N m N N B B B R p.p.p.i.i.a.e.i.i.f.g.d.d.i.i.i.i.d.i.d.i.i.e.i.i.i.i.a.a.a.z.a.a.k.k.f.f.k.k.f.d.f.f.f.f.k.i.f.k.z.g.k.h.k.h.h.g.h.h.h.l.l.l.g.h.A.h.h.A.A.h.G.A.G.l.A.S.S.A.S.A.S.D.A.D.S.S.G.S.S.G.L.L.L.H.L.L.L.P.T.T.T.P.T.T.XXT.T.XXXXXXT.~.!.~.(./.(./.(.(./.(.(.(./.(.(._.(._.{.}.{._._._.}.}.}.}.}.}.}.{.}.}. X{.{.}.}.}.{.}.{.}.{.^.(._.(.(.{._.^._._.(.^._.(.(.(.^.(.(.!.).(.~.(./.^.~./././.~././.~.~.~.~.T.^.T.^.~.~.~.~.!.T.Y.~.T.T.~.T.T.T.T.T.Y.T.T.T.U.XXT.XX!.~.~.T.T./.~./.^.T.[.T.~.T.T.T.T.T.T.I.T.Y.Y.I.U.U.L.L.L.Y.L.L.L.L.L.U.L.Y.L.L.L.K.U.L.L.H.L.H.L.H.H.H.H.H.H.H.H.H.H.G.H.G.G.G.H.D.H.H.H.H.H.H.L.L.L.L.S.L.S.L.L.H.H.H.H.H.H.H.U.S.L.S.G.L.L.U.L.L.T.T.T.~.~.T.~.~.~././.^.~.(.!.(./.(.`.^.`.(._.|.^._.|._.{.|._._.|._.}.}.}.}. X|.|..X X.X X.X.X.X.X.X.X'..X.X.X.X.XzXzXdXzXdX.XxXzXzXxXdXdX@XdXdXdXzXdXdXdXdX.XdXzXzX.XzX'..XdX X.X.X.X.X.X.X.X.X.X.X|.|.|._._._. X|.}.|.|. X|..X'..X.X.X.XdXxX'.zXdX@XzXzXzXvXzXcXdXcXcXzXcXcXxXxXxXcXcXcXcXnXxXcXnXdXnXxXnXcXcXcXcXxXnXxXnXcXcXxXcXcXxXxXxXdXcXcXcXcXcXnXnXcXcXxXxXcXcXcXcXJXxXcXcXcXxXcXzXxXcXxXcXxXxXxXxXxXxXcXcXcXcXcXcXxXxXnXxXnXcXdXcXnXcXxXxXcXnXcXJXxXcXdXcXcXcXxXxXcXzXzXzXdXxXxXdXdXdX.XdXdX X.X.X.X.X'.'..X.X|.|.|.|._.|._.|.|._.|.}.^.`.(.^.(.(.(.(.(.(.(.(.(.[.(./././.^.~.T.~.T.~.T.T.T.T.~.T.T.T.U.T.U.L.U.L.P.P.L.P.U.L.U.L.U.U.L.L.U.S.U.S.S.H.H.H.H.H.H.A.H.S.H.h.G.g.S.A.A.A.A.h.h.A.h.h.h.A.A.g.h.A.A.A.A.A.A.A.h.A.A.A.A.h.h.h.l.h.h.g.h.j.g.g.k.z.z.h.g.a.g.j.a.a.a.a.f.a.z.f.f.z.f.k.g.a.z.a.f.f.f.g.a.f.f.f.z.a.a.g.g.g.g.g.f.g.g.g.k.k.z.l.h.h.z.g.z.l.l.A.A.A.h.A.Z.h.A.h.A.A.A.A.A.h.S.g.S.z.l.l.h.h.h.h.h.z.h.h.h.l.h.z.A.h.A.G.A.A.A.h.G.H.H.H.H.G.H.H.G.S.L.L.L.L.L.P.U.U.T.U.P.~.P.~.T.T.T.T.L.U.Y.L.L.L.P.L.S.S.L.U.L.U.L.L.U.L.L.U.U.L.Y.L.Y.P.T.U.T.T.T.Y.U.T.T.Y.T.T.T.T.T.T.T.~.P.T.T.[.T.T.T.~.T.~.~.Y.~.~.T.~.~.T.~.T.!.I.T.I.~.~.Y.~.~.~.~.T.~.Y.T.T.~.~.T.~.~.T.(.~.!././././.(././.(./.(./.(.(.(.(.^.^.|.(._._.`.|. X}. X}._._.|.|._.|.|.|.|. X X.X.X.X.XdX.XzX.XxXdX'.#X.X.X.X X@X.X'..X'. X'.|.|.|.|.|.|._.|.|.|.}.}.}.}.^.^.(.`.",
+") ) ) _ ) ) ) ) _ _ U _ ) _ ) _ ) ) ` ) ) _ ) _ _ ( _ ) ) ) _ ' ` ) ) ' ` ' ` ) _ ` _ _ _ _ _ _ ) ` ) _ _ ` ` _ ] _ _ ] _ _ _ _ _ ] ` _ _ _ ' _ _ _ _ _ _ _ ' [ _ _ ] ` ` ' ` _ _ _ _ _ _ _ _ ) ) ) ) ) ) ) ) ) I I ) J ) I P J L P P P P L P L J J J L J J J J J J P L J J L P J L P P P P L P P P P P L P P P P P P L P P L L J L J J L J J L H H L L J J J H H H Z H D Z H Z D D D D Z Z Z Z D Z Z C Z C C C C C C C F B B B C N C C N C B G d.d.d.d.i.a.i.j.d.i.d.i.s.d.i.a.d.i.i.i.i.i.i.i.i.f.i.f.i.k.i.k.d.k.k.f.f.f.d.f.f.d.f.f.f.f.k.k.f.g.d.g.g.z.h.g.h.h.h.h.h.l.h.l.g.h.h.A.h.G.A.A.z.S.A.A.S.D.A.S.S.S.A.A.S.A.S.S.S.G.H.S.A.L.L.L.P.U.P.T.P.P.~.~.~.T.[.T.T.T.E.T.~.~.~.[.~.^././././.(./././.(.(._.(._.(._.}.}.^.}.[.}.}.[.}.}._.[.}._.{._.}._.}.^.^._.^.{.^.{._.(.(.(.(.^.^.^.[.^.(.^.{.(.^./.~.!.(.(.!.(././.!.~.^.E./././.T.~.~.T.~.~.[.T.~.T.T.T.Y.T.T.Y.T.T.T.T.Y.T.T.Y.Y.P.P.T.T.P.T.Y.~.^.~.T.~.!././.~.T.~.~.Y.[.T.T.T.T.T.L.U.I.T.I.L.U.U.L.L.L.L.L.L.L.L.U.L.J.Y.S.Y.L.L.R.S.L.L.H.K.H.G.L.H.H.H.H.H.H.H.H.H.H.G.G.H.H.H.H.H.H.H.H.H.S.A.P.D.L.L.L.L.L.H.H.H.H.H.H.L.H.L.L.H.L.L.L.L.U.T.T.T.T.T.T.T.~.~.~./././.~.(.~./././.(.(.^.(.(.(.(.^.|.^.(.(.(._.^._._.}.}.}. X|. X|.|.|.|..X|..X.XdX'.dX.X.X X.X.X.X.X'.zX.X.X.X'.zXzXdXdXdXzXdXdXdXdXdXdXdX XdXdX@XzXzX.XzXzXdXdX.XzX'..X.X.X.X.X X X|.|.|.|.|.|._._. X|.|.|.|..X'..X.X.X'.dX.XzX@XdXdXcXdXzXzXzXxXxXcXzXcXcXcXcXcXxXcXcXcXcXxXnXcXnXcXJXnXxXcXmXcXcXxXnXnXnXcXcXcXcXcXxXxXxXcXcXcXcXcXcXcXcXcXxXxXxXnXxXxXxXxXxXcXcXxXxXcXzXdXcXdXcXzXxXxXxXxXdXzXzXxXxXxXxXxXxXcXcXcXcXcXcXcXnXnXxXdXnXdXdXxXxXcXnXdXzXxXzXdXzXzXzXxXdXdXdXdXdXdXdX@X.X.X.X'..X.X X X|..X|.|.|.|._.|._._._.[.`.|.^.|.^.|.(.(.(.(.(.].{.(.(.(././././.~.~.~.~.T.~.T.~.T.~.T.T.T.T.U.T.U.U.U.P.L.L.L.L.L.L.U.L.U.L.L.L.L.L.U.H.H.H.H.L.A.H.G.H.H.A.H.A.S.A.A.A.A.A.A.A.h.A.G.A.A.A.A.A.A.A.A.h.A.A.A.A.A.A.A.A.A.l.h.l.h.h.h.h.g.l.g.j.f.j.f.g.g.f.f.k.f.a.k.a.f.a.f.f.a.f.f.z.g.a.z.f.f.a.a.j.f.g.a.z.j.g.g.g.g.f.g.g.g.k.z.g.z.g.g.h.h.h.A.h.h.l.l.h.A.h.h.h.A.A.A.h.A.g.h.A.G.h.h.l.l.l.l.h.h.h.h.j.h.h.h.l.l.l.l.h.A.A.h.A.A.A.J.A.H.G.G.A.H.H.S.H.L.H.H.L.L.L.U.U.T.U.T.T.P.~.P.T.T.Y.P.Y.U.L.U.L.P.P.S.L.L.L.Z.S.S.L.L.L.L.U.L.L.L.U.U.U.P.U.Y.P.T.T.T.T.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.~.~.T.~.~.T.T.~.T.~.L.~.~.~.I.~.I.T.T.Y.T.~.T.T.~.T.T.T.~.~.~.~.(.~./.(./.(.^./.(././.).(.(.(.(.(.(.(.`.^.`._.|._._.}.}.}.}.|._. X_.|.|.|.'. X X@X.X.X.XdX XzX.X.X.XxXxX.XdXzX.XfX.X.X.X.X X|.'.`.`.|.|._.|.|.|._.|.}.}.}.}.|.`.`.^.",
+"I _ ) _ ) ) ) ) ) _ ) _ ) _ _ I _ ) _ ) ) _ ) _ ) ) ) ) _ ) ) ) I ' ' ) ) ) ' ) ` _ _ _ ) ) _ _ ` _ ) _ _ _ _ ) _ _ _ _ _ ) _ _ _ _ _ _ _ _ _ ] ` _ _ ' _ _ _ _ ` _ _ ' _ _ _ ` _ ` _ _ _ _ _ ) ) ] ) ) ) ) ) ) ) ) J ) J ) K ) I P I P L J L P L J P L J L I J L J L J L P P P J P P P P L J I L P L I P P P P P P L P P P L P L P P P L L P L J J L J L J L L K H H H L D D D D D D Z Z Z Z Z Z F Z C C Z C C C C B B B B B B N B N B B B B E e.d.d.w.d.d.i.d.j.d.i.i.i.i.i.s.s.d.i.i.i.i.d.i.i.i.i.d.f.i.k.i.f.k.d.g.f.f.f.f.f.f.k.f.k.f.f.k.f.k.k.g.g.d.l.h.z.l.h.l.h.z.g.g.h.h.A.h.A.z.l.A.S.G.A.S.S.A.D.l.A.A.D.A.A.S.G.A.S.H.H.L.H.L.P.L.L.P.P.T.P.T.~.P.T.XXXXXXU.T.T.T.~.T./.[.E./.~.~.~././.~././././.(._._.{.^.^.}.{._.{.}.[._._._._.}.}._.^.|._.{._.(.(.^._.XX^.^._.^././.(.^.(.^.^.(.(.(.(.~.~.^././.~./.E.~.~.!.~././.~./.~.T.~.~.~.T.T.^.T.T.T.T.^.T.T.T.T.T.T.Y.T.P.T.T.T.T.P.P.T.[.Y.U.T.T.~.T.~.!.T./.~./.T.~.~.T.~.T.~.T.R.T.T.Y.T.U.Y.U.Y.Y.Y.L.Y.L.K.L.Y.L.I.L.K.K.L.L.U.U.U.L.L.L.L.L.H.L.L.H.H.L.H.H.H.H.H.H.L.G.H.H.L.H.S.H.H.H.L.H.H.L.G.L.H.L.S.L.S.H.S.S.L.H.L.S.D.L.D.S.L.L.L.L.L.U.U.T.T.T.T.T.T.~.!.~.~.~.(.~.).(././.(.^.(.(.(._.(.(.`.(.(.|.(.(._._.|._.|._._._.|.|.|..X X.X.X.X.X.XdX X.X.X@XdX.X.X@X.XdX.XdXdX.XxX.X.XxXzXzXzXzXdX.X.XdXzXzX XzXzXzX.XzXzXzXzX.XzX.XzX.X.X.X.X.X X X|.|.|.|.|.|.|.`.|.`.|. X@X.X|..X.X'.@X'.dXdXdXzXdXdXnXdXcXxXxXxXxXxXxXcXcXcXcXcXcXcXcXxXcXnXnXcXcXcXnXnXnXcXnXnXnXxXnXnXnXcXcXnXnXxXxXcXnXxXxXnXcXcXcXcXcXcXvXxXxXxXxXxXxXcXcXcXxXcXxXzXcXxXcXdXxXzXxXxXxXzXcXzXcXzXcXxXxXxXcXxXxXcXxXxXcXxXvXxXxXcXcXdXnXxXdXnXdXdXxXcXdXvXdXdXdXdXdXdXdXdXdXdX.X.X.X.X.X.X.X X.X X|.`.|.|.|..X|._.|._._._._.|.{.^.|.^.|.^.`.^.^.^.(.^././.(.(.(.[.~.~.~.~.T.T.[.~.T.~.T.T.T.T.T.U.U.U.U.U.L.L.U.U.L.U.U.U.L.L.L.S.S.L.L.H.H.H.H.H.H.H.S.h.S.S.S.A.S.h.S.A.A.A.A.A.A.h.A.A.A.A.A.A.A.h.S.A.A.A.A.A.A.A.A.A.A.A.h.l.l.l.l.g.g.g.g.f.g.g.g.f.f.g.f.f.f.a.a.z.a.a.f.f.f.f.f.f.f.f.z.a.d.g.a.a.a.f.f.z.g.g.g.k.h.k.j.h.k.k.h.k.l.l.z.h.h.h.h.h.k.l.h.l.h.D.z.h.A.g.S.A.j.Z.j.A.h.h.G.g.h.h.l.l.h.l.l.h.h.h.h.h.l.g.G.A.h.A.A.A.A.A.A.S.A.S.G.S.S.S.H.H.H.H.H.L.K.L.U.U.U.T.U.T.T.T.T.T.T.Y.T.U.P.L.U.L.P.L.L.S.L.S.L.H.H.L.L.L.L.L.U.L.L.U.U.U.P.Y.Y.P.Y.T.Y.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.[.~.T.~.U.~.~.T.~.T.~.T.T.~.L.R.I.~.T.T.~.Y.T.T.~.T.~.T.T.!.~./.~.~.)././.(././.(.(.(./.(./.(.(.`.(.(.^.|.(.^.`.|._.|.|.}.}.}.}._.|.|.|.|.|.|. X X.X.X.XzX.XdX.XdX.X.X.X.XdXdXdX.XdXdX.X.X@X.X X|.|.|.`._.|._.|._.{._.|.|.|._.}._.^.|.(.",
+") ) ) ` ` ) [ P _ U I _ U _ U [ ) _ ) ) _ ) ) _ _ ) ) ) ) ) ) ) ) ) I ` _ ) _ ) ` ) ) _ ` ` _ _ ' ) _ _ _ _ _ _ ` _ _ ) _ ` ] _ _ _ ] ) _ _ _ ) _ ' _ _ ` _ _ ' ' _ _ ` _ _ _ _ _ ) _ _ _ _ _ _ _ ) ) _ ) ) ) ) ) ) ) I I J I I P I J P P P P U J J J L J L L L L L J J L P J L P P L P P I L I P I J I L P P L P P P P H P L P P L L P P J P P L P L J J L J L L H H L H L D H D D H Z D D D Z Z C D Z Z C C B C Z Z B C C B B Z N C B G B T T p.p.d.d.e.d.i.d.i.d.d.d.i.d.s.d.d.a.i.i.i.f.i.f.f.i.i.i.i.d.g.f.f.d.k.f.f.f.k.f.d.k.f.k.k.g.f.k.f.k.k.k.z.g.g.z.g.h.g.h.h.h.h.h.h.h.h.A.h.A.A.A.h.A.A.A.S.l.A.A.A.D.A.S.S.A.D.A.S.A.L.S.H.L.D.P.U.P.T.P.P.T.P.T.T.P.U.T.T.XX~.T.T.~.E.T.^.~./.!.~./.E././.^./.^.(.^.^.(._.^._.^.^._._.}.}._._._.^.^.}.{.{.(.(.(.(.{.(.(.^.^.^.^.^./.(.^.(.(.~.{.^.~.(././.~.~.~.~.~./.~.!.~.~.)./.~./.E./.~.~.T.~.T.T.T.~.T.Y.T.P.T.T.T.T.Y.I.T.U.T.T.P.Y.P.Y.Y.P.T.T.Y.Y.T.T.T.T.T./.~.T.~./.~.T./.T.E.T.~.~.R.U.T.T.T.T.T.U.L.P.L.Y.L.L.L.L.L.L.I.U.Y.L.T.L.U.L.L.L.U.L.H.L.H.H.G.H.H.H.H.H.H.H.H.H.H.H.H.H.S.L.S.H.H.H.H.H.H.L.G.L.S.L.S.H.H.L.S.S.H.S.S.L.A.U.L.S.L.U.U.U.U.U.L.T.~.T.(.T.~.(.(.!./.~.(.(.(././.(./.(.`.(.).(.(.(.(.(.(./.|._._.|.{._._.|.`. X`.|. X.X|.|..X X'.'.@X'.'.'.'..X.X'..XzXdXdXxX.X.XxX.XzXzXzXcXdXzXxXdXdXdXzXzXzXxXzXzXzX.XzXzX.X'.zX'..X@X.X.X.X.X.X X|.|.|.|..X X|.'. X X'.'.'..X.X.XxXdXdXdXdX@XzXxXdXdXdXdXxXcXxXxXcXcXcXxXcXcXcXdXcXcXxXcXxXcXcXcXnXcXnXmXcXcXnXMXnXnXnXnXmXnXnXnXxXnXcXcXnXnXcXcXcXcXcXcXvXcXxXxXxXxXxXxXcXxXcXxXvXcXzXzXdXdXcXdXzXzXzXzXzXvXzXcXcXzXxXxXxXdXzXxXvXcXzXvXxXxXxXcXcXdXdXcXdXcXxXxXzXdXcXzX.XdX@XzXdXdXdX.XzX'..X.X.X.X X|. X X.X X.X|.|.|.|.|.|.|._.|._._.(._._.)._.(.^.{.{.(.^.(.(./.(./.(.~.[.~.~.[.~.~./.[.T.T.T.~.~.T.T.T.T.T.T.T.U.I.L.U.Y.L.U.I.L.U.U.L.U.U.L.L.L.S.H.H.H.H.S.H.H.S.H.S.S.S.S.A.S.H.A.A.l.S.A.A.A.A.A.A.A.A.A.A.S.h.A.A.A.A.A.H.A.D.A.S.h.h.l.l.l.h.g.g.g.g.g.g.a.g.g.g.f.f.a.f.a.f.a.a.a.a.a.f.j.f.f.g.k.a.z.g.z.a.z.g.f.z.a.g.g.g.k.j.k.k.f.h.k.h.l.l.h.l.h.h.h.h.h.h.l.l.l.l.l.l.h.A.A.A.h.A.G.g.h.A.h.G.h.h.l.l.l.l.z.h.h.h.h.h.A.l.h.h.A.A.g.A.A.A.A.h.A.A.S.H.S.S.S.S.S.H.H.H.H.L.L.U.U.T.U.Y.T.T.P.~.T.Y.T.Y.P.U.Y.L.L.P.P.L.U.L.L.L.L.L.L.H.L.L.L.L.U.U.L.L.L.P.P.P.T.T.T.U.Y.T.T.Y.Y.T.T.Y.T.T.T.T.T.T.T.T.T.~.T.T.T.~.~.Y.~.~.U.~.T.~.T.~.~.T.T.~.~.Y.~.U.Y.~.T.~.T.T.T.~./.Y.~.Y.(.~././.(./.(.(././.(.(.(.(.(.(.^.{.(.`.{.`.`.|._.|.|._.}.}.}._.|.|._.|.|. X|. X.X|..X.X@X.X.X.X XdXxX.XdX'..XdX.X.X.X.X XdX.X X|.|.|._.}._._._.|.|._.|.|.|.|.}._.`.{._.",
+") ) ) P P ) ) ` ) ) ) U ) _ U ) ) ) _ _ ) _ I ) ) _ ) ) ) ) ) ) _ ) P ) ) ) ) _ _ _ _ ) ' ) _ _ ` _ _ ` _ _ ) ] _ _ _ _ ] _ _ ` _ ` _ _ _ _ _ _ _ _ _ _ ' _ _ _ [ _ ` _ _ ' _ [ _ _ ` _ _ _ ) _ _ ] I ) ) I ) ( I I ) I ) I ) I P P P I P L P P L L P P P L L L P L L P P J P J P L L P J P I J P P P J P P P P P L P P P P P P P P P P P P I L L P L J L J J L L J L H H H L L H H H D H Z Z Z G Z Z Z C D B G C C C B G B B F C C C B N C T T p.d.p.d.i.i.e.i.d.e.i.i.d.s.i.d.a.a.d.i.d.i.i.i.i.f.f.i.i.f.i.k.f.d.f.f.f.f.k.k.g.f.g.k.k.g.f.k.k.k.h.g.z.g.h.d.l.z.h.z.k.h.z.h.h.h.h.h.A.A.l.A.G.G.A.G.A.S.A.A.A.S.l.A.A.A.A.G.H.H.D.H.H.H.L.L.P.P.P.U.XXT.T.~.T.XXT.XXT.XXU.XX~.T.T.~.T.~.~.^.~.~.~.^.~././.(.^.(.(._._.^.{.}.^._.^.}.^.}.}.^.(.}._.[.{.(.(.^.(.{.^.^.(.^.(._.(.(.(./.~.~.^.E.~.~.~.~.~./.~.~././.~./.~.T./.T.~.T.!.!.T.~.T.~.~.~.T.T.P.~.P.T.T.T.T.T.U.T.U.T.T.Y.U.Y.Y.U.L.Y.Y.T.Y.T.Y.T.T.!.~.T./.T.T.~.!.T.T.T.(.T.[.T.~.R.T.T.U.T.T.P.P.P.P.P.L.Y.L.L.Y.Y.Y.L.R.L.Y.R.U.U.U.L.U.K.U.L.L.L.L.L.L.H.L.L.H.S.H.H.H.H.H.G.L.L.L.L.L.L.L.Z.H.S.A.H.H.U.U.H.S.L.L.S.D.L.U.L.P.Y.Z.[ [ ' / / ~ I ~ ~ / / / / ~ / / / / Q / / / ~ ~ / ^ / / ~ / / / ~ ~ / / ~ ~ / ~ ~ ) / / / / / / / / ~ ~ / ~ / / / ~ ~ ~ / / ~ / ~ / / ~ / Q / / / / ' ~ ~ ~ ~ ~ / / ' / / ~ / ~ / ~ ~ ~ ~ / ~ ~ ~ ~ / ~ / / ~ / / ~ / / / / ~ / ~ / / ~ Q ! / ~ / ! ~ / / ~ Q Q / / ' / ~ / Q ~ / ) / ! / / / ~ ~ / ' ~ ~ / ' ~ ~ ' / ~ ~ / ~ ! / ~ / ~ ~ ~ / / / / / ~ ~ ~ / / ~ / ~ ~ ~ / / ~ / / / ~ / / ~ / ~ ! / / ~ / / / / / ~ ~ / ~ ~ / / / / ~ / / / ~ ~ ~ / ~ / / / ~ ~ / ~ ~ ~ / ~ ~ ~ ~ ~ ~ ) ~ ~ / ~ ~ ~ ~ ~ ~ P ~ ~ / P ~ ~ ~ ~ ! ~ ~ ~ ! ~ / / ~ ~ / ~ ~ S ~ P ! ~ ~ ~ S ~ S ~ J ~ ~ S ~ / ~ P ~ ~ ~ P ~ P / ~ S ~ ~ ~ / S ! ~ ~ ~ ~ ~ / S ~ ~ ~ ~ ! ! ~ ~ ~ ~ ! ~ ~ ~ ~ ~ ! ~ ~ ~ ~ ~ ! / ! ~ ~ ~ / ~ ~ ~ ~ ~ ^ ~ ' ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ S ~ ~ ^ ! ) ) [ [ Z.Z.A.A.A.A.l.A.g.g.g.g.g.g.g.k.z.k.f.f.a.a.f.f.f.k.f.f.i.a.g.a.g.z.g.g.k.g.g.a.f.g.a.k.g.j.k.j.k.h.h.k.h.k.l.k.l.l.h.l.h.A.h.h.h.h.l.l.l.l.Z.A.g.h.A.j.h.A.A.Z.h.h.A.l.l.l.h.h.z.l.l.h.l.l.h.A.g.A.A.g.G.A.A.A.A.A.z.A.h.A.A.A.S.S.G.H.G.L.L.L.L.Y.L.T.U.T.P.Y.P.U.T.T.Y.U.T.L.L.L.L.P.L.L.L.L.L.S.L.S.L.H.U.L.L.L.K.H.K.U.U.P.P.Y.U.U.T.T.T.P.P.T.T.T.Y.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.[.~.T.U.~.U.~.~.T.T.~.T.~.U.Y.Y.U.Y.Y.~.I.~.~.T./.~.R.R././././.(.(./.(.^.^.(.(.(.(.!.(.(.(.(.(.|.^.`.`.^.`.^._.|.|.{.|.}._._.|.{.|.|. X_.|.|.|.|..X.XdX.X.XdXdX X.X.X.XdX X.X.X.X.X.X X.X X'.|.|.`._.}._.`._._.}.|.}.|._._._.|._.{._.",
+") ) ) ) ) ) ) ) ) ) ) _ ) _ _ ) ) _ ) ) ) ) ) _ ) ) I ) ) ) ' ) _ ) ' ) _ _ _ ) ) _ _ _ _ _ _ ) _ _ _ _ ) ` _ ` _ _ ` _ ) ) ] _ _ ] _ _ _ _ _ ' _ _ _ ` [ _ ' ` _ ' _ _ ] _ _ _ ' ` ] _ _ _ _ ` ) _ _ ) _ _ _ ) _ ) ) ) ) I ) P ) P ( I I P I P I I P P P P P L P P P L J P P L P P P P P I J J U J P I P P P P P P P P L L P P L P L P P L L J I P L J L L J J L L J H L H L H H Z H H D H H Z Z Z Z Z D C D C Z C Z F C C C C B B C B B C R d.e.d.e.p.i.d.a.a.a.i.j.d.d.d.d.d.d.d.a.i.f.f.i.d.i.i.f.f.i.f.k.d.f.f.f.f.f.f.k.k.g.g.g.g.f.g.h.k.g.k.h.g.g.g.z.A.z.g.z.h.h.k.A.h.h.h.A.A.h.l.A.S.h.S.h.G.S.l.A.A.A.A.S.A.A.D.H.D.S.H.L.L.L.L.L.L.L.U.T.U.T.P.T.~.T.XXP.XXT.U.XXE.T.T.~.~.~.!.E.~.~.~.~.~.~.E././.!.^.(.{.^._.^.^.{.}.[._.{.{.^._.[.[.^.{.(.(.(.^.^.^.^._.^.~._.^.(./.(.(.(.!.~.~.~.~.~.~.~.~.~.E.~.~.T.~.~.~.~.~.~.~./.T./.T.~.T.T.T.U.Y.Y.~.Y.P.T.Y.Y.T.P.T.U.Y.U.Y.U.T.U.U.U.Y.U.U.Y.P.T.T.T.T.T.~.T.~.~.T.!.T./.T.T.T.~.T.U.T.Y.T.T.U.P.T.Y.P.Y.Y.Y.Y.L.K.L.Y.Y.L.R.R.L.L.T.U.U.U.U.Y.L.L.L.S.H.A.L.L.L.H.K.H.H.S.L.H.L.H.L.G.S.L.L.S.H.L.H.K.H.S.H.H.S.H.H.S.S.L.L.F.Z.P _ / / / ! / ! ! ~ ~ / ~ ~ S ~ ~ ~ ~ S ~ ~ ~ ~ ^ ~ ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ! ! P S ~ / ~ ~ ~ ~ ! ~ ~ ~ ~ ~ ~ ~ / ~ _ ~ ~ ~ ~ ~ ~ ~ ~ S ~ ~ ~ ~ ~ ~ ~ S ~ ~ ~ ~ / ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! P ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ~ ~ ~ ~ ~ ~ ! ! Q ~ ~ ~ ~ ~ / ~ ~ ~ ~ S ~ ! ! ~ ~ ~ ~ ! ~ ~ ~ ^ ~ S ~ ~ ~ Q ~ ~ ~ Q ~ ~ ~ ~ ~ ! S ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ~ ~ ~ ~ S ~ ! ~ ~ ~ ! ! ~ ~ ~ S ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ S ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ S / ~ / ~ / ^ ~ ~ ~ Q ! ! ! S ! ! ~ S ~ ~ ~ Q ~ ~ ~ S ~ ~ ~ ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ~ ~ / ~ / ~ ~ / ~ ~ / ~ / ~ ~ ~ / ! ! ! ~ ~ / ! ! ! ~ ~ ~ ~ ~ ~ ~ ~ / ! ~ ~ ! ~ / ! ! / ~ ~ ~ ~ ~ ~ S ~ ~ ~ ~ ~ ~ ^ ~ ~ ! ~ ~ ~ ~ ^ ~ ~ ! S ^ S ~ ^ S ! ~ ~ ^ ~ ^ S ^ S ~ ~ ^ ~ ~ ~ ~ S ~ ~ ^ ~ ~ ~ ^ ^ ! ~ / P ! ! ) [ Z.D.g.G.h.g.g.g.g.g.z.g.z.a.f.f.g.f.a.f.a.i.f.f.k.f.i.g.a.a.k.k.k.k.k.g.z.f.z.j.k.k.g.k.h.k.k.h.k.h.l.k.l.f.h.z.h.h.h.h.h.h.l.l.l.l.z.h.Z.h.h.Z.G.j.h.h.g.h.h.h.l.l.l.l.h.h.l.l.h.l.A.h.G.g.A.A.A.A.A.A.A.A.h.A.S.h.A.z.S.S.G.G.G.G.L.L.L.L.I.L.Y.U.T.Y.T.T.T.T.Y.Y.U.U.U.U.L.U.L.Y.L.S.U.S.L.U.S.L.S.L.H.L.L.L.Y.L.P.P.P.P.Y.T.T.T.T.^.T.~.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.!.~.T.Y.!.K.~.~.T.T.~.T.~.~.T.T.~.Y.~.~.Y.T.Y.~.I.T./.R.~.R./././././././.(.(.~.(./.(.(.(.(.(.(.(.(./.|.`.|.`.|.^.|._.|.[._._._._.|._._.|.|.|.|.|. X.X.X.X.X.XdX.X.XzX.XzX.X@X.X.X.X.X.X.X X X.X|.|.|._._._._.|.[.}.}.}.}.|._.|.|.{._.|.|.",
+") ) _ ) ) ) _ ) ) ) ) _ ) _ _ ) ) I ) ) I ) ) ) P ) L ) ) I ) P ) ) ) ) ) Y _ _ ) _ _ _ _ ) _ _ ) _ _ _ _ _ ) [ ) _ _ ) _ _ ) ' ` _ _ _ _ _ _ _ _ _ _ _ ' _ ` _ _ _ _ _ _ _ ` [ _ _ _ _ ` _ _ _ _ _ ' ) ) ) ) _ ] ) ) ) ) ) ) ) ) P ) I ) P P ) L I I L P P P L P P P P J P P J P P P P P J I J P I L I J P P P L P P P L P P P P P L P L P P P P L P U P P L L L L L L L L H H H H H H H D Z Z H Z Z Z Z Z Z Z C C C Z C C C C N T G B C Z R p.d.i.i.e.d.e.d.d.d.d.j.a.d.a.f.d.i.k.f.f.f.i.f.a.a.i.f.f.f.f.k.i.z.g.f.f.k.g.k.k.z.g.g.g.g.g.g.g.g.g.g.h.h.z.h.h.k.h.h.h.h.h.h.h.A.g.A.A.h.A.S.l.A.S.A.A.A.A.A.A.A.A.A.A.A.A.H.A.H.J.H.L.L.J.U.U.P.U.U.U.P.T.T.T.T.XXT.T.T.T.~.~.!.P.T.P.T.~.T.~./.T./.T././.~.~.~.~.~.(.(.(.(.{.{._.(._.(.(._.(.(./.(.(./.^.(./.~.^.^.(.(.^.(.(./.^./.^./.~.~.~.~.~.~.^.~./.~.~.~.T.E.T./.T.T.~.~.T.~.~.~.~.T.T.T.T.Y.P.P.Y.!.T.T.P.T.P.^.P.Y.U.P.Y.P.P.P.Y.U.L.Y.Y.Y.Y.T.P.T.T.T.T.T.~.~.~.T.~.T.~.~.~.T.T.T.T.T.T.U.T.T.T.U.L.T.U.P.T.Y.T.Y.L.L.Y.I.Y.U.L.U.Y.P.U.Y.L.U.L.S.S.L.L.H.L.L.H.U.H.U.H.D.U.L.L.L.L.S.K.U.H.L.H.H.H.H.H.H.H.D.L.D.L.S.L.A.[ / ) / / Q Q Q ^ ^ ~ ! ! S ! ! ! ~ ~ ! ! ! ! Q ! ~ ! ! ! ! S S ! ! ~ ! ! ~ S ! S ! ! S ! ! / u / ! S / S ~ ~ ! S ! ! ! ~ ! ! ~ ~ ! ! Q S ! ! ! ! ! ! ! ! S ! ! ^ Q Q Q ! ~ S S ! ! ~ ! ! ~ ~ S Q Q ! ! ! ! S ! ! ! ! S ! ! ! ! ! ! ! S ! ! ! ! ! S ! ! ! ! ! S ! ~ ~ ! ! ! ! ! ! ! ! ! Q ~ Q Q Q Q Q ! Q Q ! Q ! Q Q Q ! Q Q Q ! Q ! ~ ~ / S / S ! ! S ! ! ~ / S ! ! ! S ! ! ! ! ! ! S / ! ! S ! ! ! ! ! S ! ! ! ~ ! ! ! S ~ ! ! ! ! S ! ! ~ ! ! S ! ! ! ! ! S / ! ! ! ! S ^ ! ! Q ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! / ! ! ! ! ! ~ S S ! ! ! ! ! ~ ! ! S ! ! ! ! ! ! S ~ ! ! ! ! / ! ! ! S ! ! ! S ! ! ! ! ! S ! ! S S / ! S ! ! / ~ ! / ! ! Q ! ! ! ! ! ! ! ! / ! ! ! ~ ! ! ! ! ! ! ! / ! ! ! / ! ~ / / ~ ! / ! ! ! ! ! ! ! ! ! ! ! ! / ! ! / c ^ ^ ! ~ ! ! Q ~ ` Z.S.D.g.A.g.g.g.g.k.g.k.k.k.g.d.k.f.d.f.f.f.f.k.f.k.f.k.k.k.z.d.d.l.d.g.g.g.g.f.g.g.g.g.g.g.h.k.h.l.k.h.h.l.h.h.h.h.h.l.l.l.l.h.h.h.h.h.h.k.A.h.h.l.l.A.l.l.l.z.l.A.h.S.l.g.G.g.G.A.A.A.A.A.A.h.A.h.A.A.l.D.z.l.l.D.A.A.S.S.G.H.H.S.U.L.L.P.P.P.U.P.P.Y.U.T.T.T.U.U.P.P.P.P.L.L.L.L.L.L.L.G.H.L.L.H.K.H.U.L.L.L.L.L.L.L.I.L.T.U.T.~.Y.~.T.~.~.~.Y.T.Y.Y.~.T.T.Y.Y.T.T.T.T.T.T.T.~.T.L.T.~.T.T.~.~.T.T.~.T.T.XXU.U.T.T.T.T.~.T.~.~.~.~.^.(.(./.(./.(.^./.)./.(.(.{.(.(.(.`.`.`.(.`._._._._._._._._._._._.}.|._.|._.|.|.|.'..X.X.X.X.X.X.X.XdXdX'..X.X.X.X.X|..X.X|. X X X|. X}.}.}.|.(.^._.`.{.`._.}.}. X}.}.}._._.",
+") ) P ) ) ) P ) ) ) P ) ) ) I ) ) ) ) ) ) ) ) ) ) ) _ ) ) ) ) ) ) ) ) ) ) ` ) ) _ _ ) ) _ _ _ ` _ ` _ ) _ ` _ _ _ _ _ ` _ _ _ _ _ _ ` _ _ _ _ ' ` _ ` ' _ _ ' _ _ _ ` ' ' ` _ ' _ ' ` _ _ _ _ _ _ _ ) ) _ _ ) ) ) ) ) ) ) ) ) ) ( ) I I P ) P P I P P I P P P I P P P P P P P P L P J P P P P P P P I L P P P P P P P P P L I P L I P P P P P P P P P P L J P J P J L L P L J L H H H H H D H H D D D D Z G Z Z Z G Z C C C G B B B B C C L T d.e.e.i.d.a.d.d.d.a.j.f.f.a.g.a.a.f.i.f.i.f.k.f.a.f.f.i.k.k.d.f.k.d.z.k.g.z.f.k.g.g.k.g.z.g.h.h.h.A.g.h.h.h.g.h.h.z.h.h.h.h.h.h.h.h.g.g.A.l.A.A.A.A.h.A.A.A.A.A.A.A.A.S.S.S.G.S.S.D.H.H.L.L.U.H.H.T.U.U.P.T.P.T.T.T.~.T.T.~.T.XXP.P.T.L.!.T.T.XXT.~.~.T.~.R./.~.^.~./.~.(.(.^.^.E.{.^.(.^.(./.(.(.(.(./././.(.~./.[.(.{.^.(.^.^.(.{.~.(./.~.~.~.T.~.T.T.~.T.~.Y.~.T.^.~./.T.T.~.T.XXT.~.~.T.T.T.T.T.T.Y.T.Y.U.Y.Y.T.T.T.P.P.L.P.P.P.Y.P.Y.L.U.U.U.U.U.U.U.P.T.T.~.T.~.T.~.T.~.Y./.~.Y.T.~.T.~.T.~.T.T.T.T.T.T.U.T.T.L.P.T.P.Y.Y.Y.L.T.I.U.I.Y.T.L.U.U.U.U.L.U.L.L.S.L.H.H.A.L.L.H.K.S.U.Z.L.S.H.S.H.U.S.S.H.L.S.H.L.H.H.H.A.L.S.L.L.Y.[ / ~ / / [ m.Q.hXhXBXFXCXHXBXHXCXCXCXCXCXCXCXCXCXCXCXCXCXCXBXCXZXCXCXBXCXCXCXCXZXHXHXZXCXZXHXCXHXZXZXZXZXCXZXBXZXZXCXCXZXSXCXCXZXCXZXBXZXZXCXCXCXCXCXBXCXZXZXCXZXCXBXZXZXSXHXDXZXCXCXBXCXCXCXCXZXCXBXCXHXCXZXHXHXCXZXZXZXCXBXCXZXZXCXCXCXZXAXSXCXCXZXBXCXCXCXCXBXZXCXCXCXBXCXCXCXZXCXCXCXCXZXCXZXCXCXHXBXZXZXBXZXZXBXZXZXCXBXZXZXCXZXCXCXCXBXZXZXCXBXHXZXZXCXBXZXZXBXCXZXZXCXZXCXBXCXZXZXBXBXCXZXZXBXZXHXCXZXZXZXBXBXZXZXCXZXBXCXCXZXCXZXBXZXBXHXZXZXZXCXBXCXCXCXZXBXZXCXCXCXAXZXCXCXBXAXCXBXZXCXZXCXFXZXBXZXBXZXZXZXCXCXCXZXBXZXCXHXZXZXCXBXZXZXCXBXZXZXSXCXSXCXZXCXCXZXSXZXZXCXZXCXBXCXCXCXZXZXCXCXCXCXZXBXZXBXZXCXZXHXCXZXBXBXZXZXCXBXCXSXZXCXBXZXZXZXCXBXZXCXHXCXZXHXCXCXCXZXCXZXCXHXCXCXZXZXHXCXCXZXZXCXCXZXZXCXCXZXCXCXBXZXZXBXZXCXZXZXBXZXCXZXBXZXZXZXBXZXZXBXZXBXfXhXm.} ' / ~ Q [ F.U.D.D.g.g.d.D.h.l.h.k.g.g.f.g.f.f.f.f.f.f.f.f.k.g.k.k.l.g.l.z.g.z.g.g.k.g.g.g.f.g.g.k.f.h.h.h.k.l.h.h.l.l.l.h.h.h.h.l.h.l.h.h.l.h.h.h.g.k.D.A.A.A.h.l.z.z.D.l.h.h.z.l.h.l.g.l.A.h.h.A.h.A.h.h.D.A.h.l.A.h.l.h.A.A.A.S.S.S.S.H.S.L.L.P.L.U.Y.P.P.P.Y.T.U.Y.P.Y.U.P.L.P.L.L.P.L.L.L.U.G.L.D.G.H.S.H.H.H.L.S.H.L.I.L.U.I.R.U.U.U.I.~.T.~.I.I.~.~.~.~.U.U.T.Y.~.~.T.T.T.T.T.~.T.T.T.~.R.~.~.T.T.T.T.~.T.T.T.T.E.U.Y.T.T.~.T.~.~.~.~.~.(.~./.(.(.(.{.(.^.{.^././.(.(.(.(.(.(.`.`.`._._. X_._._._.}._._.|._._._._.|.|.|.|.|.|.|..X|..XdX.X.X'. X@X.X.X.X|..X'..X.X.X|. X|.|.}.}.}.}.|._.|.^.`.|._.|.}.}.}.}.}.}.}._.",
+") ) I ) ) ) I ) ) ) ) I P ) P ) ) ) ) ) ) I ) ) ) ) I ) ) P ) ) P ) ) ) ) ) ) ) _ ) ) _ ) _ _ _ _ _ ) _ _ _ _ _ ) _ _ ` _ ) _ _ _ _ _ ` ' _ _ _ _ _ _ _ _ ' _ ` _ _ ' _ ` ` _ _ ` _ _ _ _ _ _ _ _ _ _ ) ) _ _ ) ] ) ) ] ) ) ) ) ) ) I ) ( I ) P I I P P I P P P P P L P P P P P P P P P P P I P P I P P P P P P P J P Y P P P P P P P P P P P P L P P P L P P J P L L P P P L H H H H H L D H D H D Z Z Z Z D Z G Z G C Z C C Z Z C C C G T e.p.i.i.i.d.d.f.d.g.h.f.j.g.a.g.g.f.f.f.d.f.f.f.a.d.i.f.k.f.f.f.g.f.z.k.g.k.g.k.z.h.l.k.g.z.g.g.h.g.h.h.h.h.l.l.h.h.z.h.h.l.l.l.h.l.h.A.h.A.G.A.A.h.A.A.h.S.D.A.h.S.A.A.A.S.A.S.A.H.S.H.H.L.H.L.T.U.H.T.XXU.T.T.^.T.T.Y.T.T.~.Y.Y.^.T.P.T.~.T.T.T.Y.T.~.~.T.T.T.).~.T././.(././.^./.(.^.^.^.(.^././.(./././.^./.(.^./.(.(.^./.~.{.^./.(.~.T.(.T.~.XXT.Y.T.T.Y.~.^.T.^.T.T.T.T.~.T.~.T.T.~.T.T.~.XXT.T.T.T.U.T.P.P.T.P.T.T.T.Y.P.Y.L.L.Y.L.P.L.L.P.U.L.U.P.Y.U.P.T.T.^.~.T.T.T.T./.~.~.(.Y.).T.T.T.T.T.T.U.T.T.T.U.L.U.P.T.P.T.P.L.Y.L.I.I.T.T.U.U.T.Y.U.U.P.L.L.L.L.U.L.S.L.L.P.L.S.S.S.S.L.L.H.F.L.H.U.L.S.H.L.F.S.H.G.H.G.D.L.D.U.L.F./ ! ~ / { } aXhXMXZXZXDXDXDXZXZXZXZXAXDXAXHXFXZXHXFXFXFXAXAXZXDXZXFXFXZXZXFXFXFXAXAXDXDXHXZXZXDXDXDXFXZXFXFXDXDXDXDXZXZXZXFXFXZXZXFXZXZXAXZXZXZXDXFXZXZXZXGXZXDXDXFXZXZXAXAXZXZXZXFXZXZXZXHXFXFXAXFXFXZXFXFXZXZXHXZXZXZXZXZXZXZXDXDXDXZXZXZXDXDXAXDXFXZXZXFXFXFXZXZXFXFXFXFXDXDXZXZXZXZXZXZXFXVXVXVXZXZXSXDXZXZXFXZXZXVXFXVXZXVXFXFXCXZXFXFXZXZXFXZXZXZXDXZXZXDXDXDXZXZXFXFXZXZXZXDXFXDXGXDXDXDXZXDXDXZXZXZXFXAXDXDXDXZXZXDXDXDXFXDXFXFXZXFXDXZXZXDXFXDXDXDXZXDXDXDXZXAXZXZXAXAXHXAXZXHXFXAXVXZXZXZXZXHXAXAXFXHXVXHXZXZXVXVXVXVXVXVXCXZXVXVXZXHXVXFXZXZXFXZXZXZXZXZXZXFXDXFXZXDXDXDXZXDXZXZXZXDXDXAXZXZXZXZXDXDXZXZXDXDXDXDXZXDXDXDXZXFXDXDXAXFXFXFXZXCXZXAXVXVXDXZXAXAXAXAXDXZXZXZXZXZXZXZXAXAXAXFXZXZXZXDXZXZXFXAXZXZXAXAXZXZXAXVXZXAXFXAXZXZXVXVXFXVXZXVXZXZXCXZXDXZXZXZXfXhX].m._ / / S _ Z.P.D.A.h.l.h.l.k.k.h.g.f.k.k.k.f.k.f.f.f.f.f.f.g.k.k.g.g.g.z.d.d.k.z.g.g.f.g.g.j.f.f.h.f.h.k.l.l.h.l.l.l.h.z.A.h.A.l.l.h.l.z.h.h.h.h.h.A.A.h.l.D.l.l.h.h.l.l.h.h.h.l.h.h.l.l.h.A.h.h.S.h.A.h.A.A.z.S.h.g.z.h.h.A.A.A.S.S.H.H.L.L.L.U.U.L.L.U.P.U.U.U.U.U.Y.P.U.U.U.L.P.P.P.L.U.L.L.L.L.H.L.G.K.H.U.H.H.L.H.L.L.L.L.I.K.L.U.U.T.T.~.I.~.I.~.T.Y.Y.Y.~.T.~.T.T.T.XXT.~.~.T.~.T.T.~.~.T.T.~.~.~.T.T.T.T.T.T.T.T.I.T.T.~.~.T.~.~.~.~./.(.(./.(.(.(.{.(.^.^.^./.^.(.(.(.(._.|._._.}.}.|._._._.{._._.`.^._._.`.{._.|._.|._. X.X.X.X.X.X.X.X X.X.X.X.X`.'..X.X|..X.X.X|.|.|.}.}.}.}._.}.`.}.|._._.|. X}.}.}. X}.}._.",
+") P ) ) ) P ) ) P ) ) ) I ) ) ) ) ) I ) ) ) P ) ) I ) ) ) ) I ) ) ) P ) ) ) ) ) ) _ ) _ ) _ ) ) _ _ ) _ ) _ _ _ _ _ _ ) _ ` _ _ _ _ ] _ _ _ _ ` _ _ [ ' _ ' [ ' ] ` _ [ ' ' _ ` _ _ _ _ _ _ _ _ _ ) ) ] _ ) ) _ ) ) ) ) ] ( ) I ) I ) ) I I P P P I I I L I I L P P P P P P P P P P P P P I P I P P P P P P P I P P J P P P P P P P P P I L P P P P P P J J P P J L J J L L L L J L L H H H L D D D H D Z G Z D Z Z Z Z Z G Z C Z C B G B T e.d.d.d.j.f.d.j.g.f.a.g.a.z.g.f.f.a.f.f.f.f.d.f.f.f.k.f.f.d.f.f.f.g.g.f.k.z.k.z.h.g.g.z.l.l.h.h.h.h.l.h.h.h.A.l.g.h.h.g.h.l.A.g.h.h.A.h.h.A.h.h.l.A.z.A.A.A.A.A.A.A.A.A.A.A.G.S.H.L.H.H.L.H.U.H.G.P.T.U.P.T.Y.T.P.T.P.~.T.T.T.T.T.T.T.T.T.P.P.P.T.T.T.~.T.[.T./.T.T./.~./.T./././././.^./.(.^././././././././.^.^.(.(././.^.^.{.^.~.~.~./.(.~.T./.~.~.~.T.~.T.~.Y.T.T.T.T.~.T.T.~.T.T.T.T.T.T.T.T.T.Y.T.T.T.Y.Y.T.Y.Y.T.P.T.Y.P.P.Y.P.L.Y.L.L.L.Y.Y.L.L.U.Y.T.T.T.T.~.T.~.T./.Y.!./.T.T.Y.~.~.Y.~.U.T.T.T.T.U.U.U.XXP.T.T.U.T.P.Y.Y.T.L.T.L.I.T.T.L.P.U.L.T.U.U.L.L.P.L.L.L.L.L.L.S.S.U.L.H.L.L.L.L.S.L.U.S.L.H.S.L.L.G.L.L.L.L.L.P.n.) S ! / b.m.hXfXBXHXZXZXDXZXDXDXZXZXZXFXFXDXFXZXZXZXFXFXFXZXZXDXDXFXFXFXZXZXZXAXAXFXFXZXCXDXZXZXCXDXDXFXFXAXAXZXZXZXZXZXZXFXAXZXZXFXFXZXZXFXZXFXZXDXZXZXZXFXZXDXDXDXDXDXZXDXDXZXZXZXAXFXFXZXFXAXFXFXFXZXFXZXFXFXZXZXZXFXFXFXFXZXFXDXFXZXZXZXZXFXDXDXAXZXZXDXDXFXFXFXDXAXDXFXFXZXFXDXZXZXDXDXZXDXZXZXZXDXZXDXDXDXZXDXDXDXZXDXFXZXZXDXDXZXZXZXVXFXZXFXZXZXDXFXAXDXDXFXDXDXDXFXFXFXFXZXZXFXFXDXSXDXDXDXDXFXZXZXDXFXFXFXFXDXDXDXFXZXZXZXZXDXDXZXAXZXZXZXZXFXFXGXSXZXFXFXFXZXZXZXZXAXAXFXFXDXZXFXFXVXZXZXZXAXAXAXFXZXZXZXZXVXFXFXFXZXZXZXFXZXZXFXFXZXFXFXFXFXZXDXZXDXDXZXZXZXZXFXAXZXDXZXDXDXDXDXDXFXAXGXFXZXDXDXDXDXDXDXDXZXDXDXFXZXDXDXDXDXDXZXZXFXAXDXAXZXZXZXZXZXZXZXZXAXAXAXFXCXDXZXZXZXZXZXZXAXAXAXAXZXZXZXZXZXZXFXZXZXZXZXZXZXSXZXAXZXZXVXFXZXZXZXZXZXZXAXAXFXZXZXDXSXDXAXFXVXMXfXaXm.' ^ / ! _ D.P.D.A.A.h.l.l.h.k.g.g.g.g.g.k.k.k.f.g.g.f.g.g.g.g.g.h.z.g.l.l.k.k.g.g.g.d.g.f.g.f.f.h.z.z.z.l.h.z.l.l.h.A.z.A.h.l.l.l.l.l.h.h.h.h.h.h.h.A.h.z.A.l.l.l.l.h.h.h.h.h.h.h.l.l.A.h.A.A.j.A.h.A.h.h.A.h.l.D.h.A.A.z.A.A.A.A.H.S.S.L.S.U.L.L.U.L.T.P.P.P.T.U.U.U.P.L.U.L.P.P.P.L.D.L.L.L.L.L.H.L.H.H.S.H.L.L.L.L.L.L.L.I.L.I.U.U.T.T.T.I.~.~.T.T.T.T.~.I.~.Y.T.T.U.J.T.T.T.T.T.~.~.T.~.~.T.~.T.T.~.~.T.~.T.T.T.T.T.T.T.T.~.~.!.~.(.(.~.(./.(.(.(./.(./.^.{.).(.(.(.(.(.`._._._.|.}._.|. X|.|.}._._.{.|._.^.`.|.|.|.|.|.|.|.|..X|. X.X.X X.X'..X.X.X.X|..X|..X|. X.X'. X|.}.}.}.}._.{._.`.^.|.(.|.}.}.}.}.}.}.}._.",
+"I I ) I I ) I ) ) ) I ) I ) I ) ) ) ) H ) ) ) ) ) ) ) ) I ) ) ) ) ) ) ) Y ) ) ) _ ) _ ) _ ) ) _ ) _ [ ) _ ) _ ` ` _ _ _ _ _ ` _ _ _ _ _ [ _ _ _ _ _ ' ` _ ` ` _ ` ' _ ` _ [ ' _ _ ) _ ` _ ' ' _ _ _ _ ) _ ) ) ) ) ) ) ) _ ) ) ) ) ) I ) I I ) ) P P I P P P P P P P P P I P P P P J I P P I P I P P P I P P P P P P P I P P I I P P P P I L P P ) P P P P P P I P P P L P J L L L J L H L H L D H H D H D Z D Z Z Z Z G C Z Z Z B C Z G C T j.j.j.j.d.j.d.d.h.f.f.g.h.f.z.g.f.a.f.f.f.f.f.d.g.d.f.f.f.f.f.g.f.g.z.z.g.g.z.g.h.g.z.g.l.l.h.g.A.g.A.A.g.A.z.l.h.h.k.A.A.l.g.z.l.h.z.A.h.A.l.A.A.A.A.A.A.A.A.G.A.G.S.S.A.S.A.A.H.A.H.H.H.H.H.L.P.L.L.P.T.T.T.T.U.P.~.Y.Y.T.P.T.T.T.~.P.P.P.T.T.T.T.Y.T.^.T.~.T.T.~.R./.E.^.~.^././././././././././.~.~.~.^.^.~.{.^.~.^.^.^.^.~.(.[.(.~.~.~.T.(.T.T.T.~.T.T.T.T.T.^.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.Y.T.Y.U.T.Y.P.U.U.P.P.L.P.P.P.L.Y.L.L.Y.L.L.Y.L.Y.Y.T.T.T.~.T.T.T.T./.~.T.T.Y.~.(.T.T.T.T.Y.T.T.T.P.U.U.Y.Y.T.Y.Y.Y.U.L.L.T.L.Y.T.Y.T.P.P.U.U.L.P.P.U.U.P.L.L.L.S.L.L.L.L.F.S.L.L.L.H.S.L.L.H.L.L.S.L.S.L.D.G.U.D.L.Z.T / ~ ( / { m.fXBXSXFXCXFXAXFXAXVXDXDXFXFXFXAXAXAXFXVXAXAXAXVXAXAXAXAXFXFXFXVXFXAXAXAXFXAXFXAXAXAXZXFXAXVXAXAXAXAXZXFXFXAXAXAXAXAXZXFXFXFXAXAXAXAXSXFXVXZXVXHXVXAXZXHXFXFXAXAXDXAXFXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXVXFXAXAXVXVXVXAXAXAXFXFXDXSXZXFXAXGXSXAXAXFXAXAXZXAXAXAXAXAXAXHXFXVXZXFXZXZXZXFXFXFXZXAXZXAXFXFXDXZXFXFXAXFXFXFXZXZXFXDXZXVXVXFXFXFXFXVXVXAXZXVXZXZXFXFXAXAXAXSXFXFXFXAXAXAXAXAXAXFXFXFXFXZXSXDXAXAXAXAXAXAXAXFXFXSXFXFXAXAXAXAXZXZXAXAXAXAXAXAXAXAXAXAXFXAXAXAXFXAXAXAXFXAXAXFXFXFXAXZXFXFXAXAXZXAXZXAXFXZXGXZXZXZXFXZXZXFXFXFXFXFXZXZXFXFXFXAXZXZXFXFXAXAXAXAXVXAXAXAXAXAXDXAXAXAXHXAXAXAXFXAXZXZXFXAXAXVXVXVXVXAXAXAXZXAXAXAXAXAXAXFXAXAXDXAXZXZXZXZXVXZXFXVXFXFXAXFXFXFXVXFXAXFXAXAXAXAXAXAXZXZXFXZXVXFXFXFXZXFXFXAXFXFXAXAXFXFXFXAXFXZXVXFXVXZXZXZXAXAXAXAXHXAXFXMXhX} ] ~ / / _ Z.S.D.A.g.l.h.h.z.h.k.g.g.g.g.g.g.f.g.g.j.f.j.k.h.k.h.g.g.g.g.f.g.g.g.f.f.f.g.f.j.f.j.g.z.h.z.h.h.h.h.z.A.A.h.A.A.l.l.l.h.l.h.h.l.l.l.A.z.A.A.h.l.l.h.l.h.h.h.h.h.h.h.l.h.A.h.A.l.G.G.j.S.S.z.h.h.h.A.H.l.A.A.A.A.A.S.G.S.H.H.S.L.L.P.L.Y.P.U.P.P.U.U.P.U.L.P.P.L.P.P.D.L.L.L.L.P.H.L.H.H.H.H.H.K.L.H.H.K.L.L.L.L.L.L.U.I.I.I.T.T.T.~.T.~.~.T.~.I./.T.T.P.XXT.U.T.T.~.~.T.~.T.T.~.T.~.~.T.~.~.T.~.T.T.T.T.T.T.~.~.~.~./.~.~.(.(./.(././.(.(././.(.(.{.{./.(.(.^.|.|.}.}.}.|.|.{._._._.(.`.|.^.`.|.^.|.|.`.{._.|.}.|.|..X.X.X.X.X|..X|..X|.|..X|.'. X X'..X|..X|.|.|.}.}.}._._.`._.|._._.|.}.}.}.}._.{.|.|.",
+") ) I ) ) ) ) I I ) ) I ) I ) I P I ) ) P ) I ) ) ) ) I ) ) ) ) ) P ) I _ ) I ) ) ` ) ) ) ) _ _ _ ) ) _ _ _ I _ ) _ _ ) _ _ _ _ _ _ _ _ ' _ _ ` _ _ _ ' _ _ _ _ _ _ _ _ _ _ _ ] ` _ ` _ _ ) ` _ _ ) ) _ ) ) ] ) ] ) ) ) ) ) ) ) I ) I I ) I P I I I I P P P I I P P P P I P P P P I J P P P P P P P P P P P P P P I P P P P P P P P I P P I P P P P P P P P J P U P U J L L P L J L J L H L H H L H H D D H G H Z Z Z Z Z Z G C G G G B U d.d.f.d.j.h.d.g.g.g.g.g.f.f.f.a.g.f.g.z.f.f.f.z.k.f.k.k.f.f.f.k.g.g.g.z.d.g.g.h.z.z.g.A.l.g.l.A.A.g.g.h.g.A.g.l.h.h.Z.A.l.l.g.A.A.Z.A.A.z.A.h.l.l.A.z.A.A.A.A.A.A.S.A.S.S.H.A.H.A.H.H.H.H.H.L.H.P.P.P.L.T.T.P.P.T.T.T.T.T.T.T.T.T.T.Y.P.T.~.T.T.T.P.T.P.XXT.P.T.T.T.XXT.R.T.~.T./.~.~././././.T././.T.^.^.~.[.~./.~.~.^.T.~././.~.^.~./.~./.T.~.T.T.~.~.T.~.T.T.~.~.T.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.Y.T.T.T.Y.T.P.U.P.Y.T.U.L.P.Y.L.L.P.P.L.P.P.U.Y.L.L.L.Y.T.T.R.Y.~.~.T.!.T.Y./.T.T.T.Y.T.T.P.Y.U.U.T.T.T.U.U.P.P.Y.T.U.Y.T.T.T.U.T.U.U.P.T.P.T.U.U.Y.L.L.Y.L.P.P.L.L.L.L.L.L.L.L.L.L.H.L.L.L.H.L.L.H.S.L.L.L.L.H.L.L.U.Z.[ / J ~ ~ ` Q.hXBXFXZXGXZXFXFXFXZXFXDXDXFXFXFXFXFXFXDXFXFXFXAXFXFXZXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXZXFXAXFXFXZXZXFXFXFXFXAXAXZXZXFXAXFXFXAXAXZXZXZXFXFXFXFXFXZXDXFXZXFXFXDXAXFXFXFXDXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXZXAXAXAXFXFXFXDXFXFXFXAXAXFXFXFXFXZXAXDXAXFXFXFXFXFXGXFXFXZXFXFXFXFXFXFXFXFXFXFXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXFXFXFXFXFXZXZXFXFXDXAXAXGXZXAXFXZXSXAXFXDXFXFXZXFXFXFXZXZXFXFXDXAXGXAXAXFXDXZXFXFXFXFXFXFXFXZXFXZXDXAXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXZXFXFXFXFXAXFXFXAXFXFXFXFXFXZXZXDXFXGXFXFXFXFXFXDXFXFXFXFXDXFXAXZXZXFXZXFXFXAXFXFXFXAXFXDXAXFXFXFXFXFXFXFXFXFXFXFXDXFXFXAXAXFXZXAXFXFXFXDXFXDXDXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXZXFXFXZXFXFXFXFXFXFXFXFXZXFXDXZXAXAXFXFXFXFXZXFXZXGXFXFXFXFXZXFXFXFXFXFXFXFXZXZXFXFXDXAXFXFXZXAXZXZXVXhXm.c./ / S [ F.P.A.A.h.h.h.h.k.h.k.h.g.g.g.g.g.g.g.g.g.g.k.h.g.k.g.g.z.g.g.f.f.g.g.f.h.z.g.g.h.f.h.h.h.k.h.h.h.A.l.A.h.A.A.h.l.l.l.l.h.h.h.l.h.A.A.A.h.A.l.l.l.h.l.z.l.h.h.k.k.h.h.l.h.h.l.l.j.g.g.k.h.h.h.A.h.h.g.A.A.h.z.A.h.S.A.S.H.S.D.L.S.L.L.L.P.U.U.U.L.P.L.P.P.P.L.L.P.P.L.L.L.L.H.H.H.L.L.H.K.S.H.H.H.L.H.L.H.L.L.L.L.I.L.R.I.T.I.T.T.~.~.T.~.I.T.~.T.T.T.P.U.T.T.T.T.T.T.~.T.~.~.~.~.T.T.~.T.T.~.T.~.T.T.T.T.~.T.~.~.~././.~.[.(.(.(././././.^.(.(.{.(.(.(.^.(.^.^._.}.}.}._.|._.|._.`.`.`.(._.|.(.(./.).^._.|.}.}.|.|.|.|.|.|.|.|.|.|.|.|.`.|.|.|.|.@X|.'. X|.'.|._.}.}.}._.`.|.{.|.|._._.}.}.}.}.|.|._._.",
+"I ) ( ) ( I ) ) I I P ) I I P ) I ) I ) ) ) ) P _ U ) ) _ ) ) ) ) U ) ) ) ) ) ) I _ ) _ _ ) ) ) ` _ ) _ _ ` _ ) _ _ _ ` _ _ _ _ ` _ ' ` _ _ _ ' _ _ _ _ _ _ _ _ _ ' ` _ _ ` ` _ _ _ _ _ _ _ _ _ _ _ _ _ _ ) ) _ ) _ ) ) ] I ) ) ) P ) P ) I I I P I P I ) P I P I P P I P P P P I P I P P I I I P P P P P P P P P P P P P L P P P P P P P I I I P P P P P P I P P P P P P P P P P J L L H L L H Z L D G L Z D Z Z Z Z G L Z Z G G C G G T j.d.d.g.j.j.j.g.d.g.g.f.g.g.g.g.f.g.g.f.g.g.f.f.h.k.f.k.k.k.f.g.f.z.g.g.h.g.g.h.g.h.g.h.l.g.g.g.A.l.A.A.A.h.A.A.A.z.h.g.A.A.A.l.l.h.h.z.A.A.A.A.A.A.A.A.h.A.l.S.A.A.A.A.H.A.D.A.H.H.H.H.H.H.H.H.L.P.L.L.L.L.U.P.U.U.XXP.Y.~.T.T.P.P.T.P.U.T.P.P.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T./.T./.T.T././././.~.E.~.~.~.~.^.~.^.^.~.~.~.~.~.~.T./.T./.T.T.~.T.P.T.T.U.T.T.Y.T.T.T.T.T.T.T.Y.T.T.Y.T.T.P.T.P.T.U.Y.I.Y.P.P.T.P.Y.U.T.L.P.P.L.P.L.Y.Y.H.Y.H.Y.P.L.L.L.Y.Y.L.T.E.!.T.T.~.T.T.T.T.T.Y./.T.T.T.P.T.U.T.U.T.P.T.T.U.P.P.L.L.U.Y.P.T.T.Y.P.U.P.U.P.P.U.U.P.U.U.U.L.U.L.P.L.P.U.L.L.L.L.L.S.L.L.L.L.S.L.U.H.L.S.L.L.S.L.L.L.L.D.[ J S S / } m.fXBXAXVXZXFXZXFXFXFXFXFXZXDXFXFXFXFXFXFXFXGXZXZXZXFXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXDXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXDXAXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXZXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXAXAXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXGXFXDXFXFXFXFXFXFXFXZXFXFXFXAXDXSXZXFXFXZXFXFXFXFXFXFXFXFXDXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXZXZXFXGXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXDXZXZXFXZXCXBXhX} _ / ! ~ [ F.S.S.A.h.h.l.h.h.h.h.g.h.g.g.g.g.h.g.g.h.k.k.g.h.g.g.g.g.f.g.f.g.g.g.f.a.h.f.f.h.a.j.k.k.h.f.h.l.l.h.A.z.h.A.l.A.l.l.h.h.l.l.l.l.l.H.A.g.A.l.h.h.h.h.z.z.h.k.h.l.l.l.h.h.l.l.l.h.g.h.h.h.h.h.A.h.h.l.h.A.h.A.h.h.H.S.S.H.S.L.L.L.L.L.U.P.U.L.L.U.P.P.P.L.L.L.D.P.L.L.L.L.L.H.H.H.H.H.H.H.L.S.L.H.L.H.L.L.L.L.L.L.I.Y.U.U.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.~.T.(.~.~.~.T.T.T.~.T.~.~.T.~.T.~.~.T.T.T.!.~.~.~././././.(.^././.(./.(.(.(./.(.{./.(.`.^.|._.}._.}.}.|._.|._.|.(._.(.{.(.(.^.(.(.(.|._._.}.}.|.|.|.|.|.|.|.|.|._.|.}.`.`._.|.|.|.|.|.|. X|.|.|.}.}. X X|.`.`.`.`.|.|.}.}.|.}.|._.|._.",
+"I ) I U I I I I I I I I I I / P S I I I ) Y ) ) ) ) ) ) ( ) ) ) ) _ ) P ) ) ) ) ) ) _ I _ I _ ) ) _ ) ) ) _ _ _ ) _ _ _ _ _ ) _ _ _ _ _ _ _ _ _ _ ' _ ` _ _ ] _ _ ` ' _ _ _ _ _ _ ` _ _ _ _ _ _ _ ) _ _ ) ] ) ) ) I ] ) ) ) ( ) ) ) ) ) I ) I I ( I I I P P P I P P P I P P P I I P P I I P P P I P P P I P I P P P P P P I P P P P P I P P P P ) P P I I P I P P P P P P P P L P L J L J L J L J L L L L D L L L G Z Z G Z Z Z Z G C G T d.j.j.f.f.j.g.j.g.j.g.g.g.f.f.g.f.g.g.f.g.g.g.g.z.g.f.k.f.k.f.f.g.z.h.h.g.h.g.g.g.h.g.g.l.g.l.l.l.A.l.A.l.l.l.l.h.l.l.A.k.h.l.A.l.A.l.A.A.A.z.A.A.A.A.A.A.A.S.A.A.G.A.H.S.S.G.H.S.H.H.H.H.H.L.H.L.L.L.U.P.T.P.U.U.P.T.Y.T.Y.T.P.^.Y.T.U.~.P.P.P.T.P.P.P.T.T.T.T.T.P.~.T.T.T.~.~.T.~.~./.T./././.T.R.~.T.^.~.~.~.~.~.[.XX^.E.~.^./.~.~.~.~.~.T.T.T.T.T.T.P.T.~.T.Y.T.T.T.T.T.T.T.T.T.T.P.T.T.T.T.T.T.U.Y.U.Y.U.P.Y.P.P.U.U.L.L.Y.P.Y.H.P.L.L.Y.L.Y.H.Y.L.Y.L.L.Y.T.Y.U.R.T.T.T.~.~.T.T.T.Y.U.T.P.T.T.T.U.E.U.U.T.U.XXL.T.P.T.L.U.U.U.Y.U.P.U.U.Y.U.Y.Y.U.T.Y.P.T.U.P.U.U.P.P.L.L.L.S.L.L.H.L.L.H.L.L.L.L.S.L.L.L.L.L.L.L.L.L.U.P.[ / / ' [ m.hXBXFXVXVXVXFXFXFXFXFXFXFXZXZXDXFXFXFXFXFXZXFXDXAXFXDXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXFXFXFXDXFXFXFXFXAXFXFXFXAXDXAXDXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXDXDXFXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXDXFXFXFXFXFXFXFXZXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXAXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXDXZXZXFXZXVXSXBXhX} ' ! S ! [ Z.S.z.S.l.h.h.h.h.g.g.z.h.h.g.h.h.h.a.k.h.h.h.z.g.z.g.g.g.g.f.f.g.f.h.k.f.h.f.f.f.j.h.k.h.h.h.l.l.A.g.Z.g.A.l.l.h.l.h.l.l.l.l.l.l.h.h.D.l.l.h.h.k.g.z.z.h.h.k.l.k.k.l.l.l.A.l.h.h.h.h.h.h.z.A.H.A.l.h.A.D.A.S.S.S.S.S.H.L.S.S.S.L.U.L.P.P.U.U.L.P.U.P.P.L.L.L.P.L.L.L.H.L.H.L.L.H.L.L.D.Z.K.H.L.H.L.H.H.L.L.L.L.L.U.U.U.T.T.T.T.~.T.T.~.T.~.T.T.T./.T.T.T.(.T.T.(.T.~.T.T.~.~.~.T.~.~.~.T.~.~.T.T.~.~.T.T.!.~.~./././././.^.(././././././.(.(.(.{.(.(.(.(.[._.}.}.}._.|._.(.`.|._._.(._.|.^.{.(.|.(.^._.[.}._._.`.|.|.|..X|.|.|.|.}.`.`.`.|.|.|.|.|.'.|..X|.|.|.}.}.`.`.|.|.|.`.`.`.|.}.}.}.|.|.|.|.",
+") I I I I ) I I P P ) P ) P ) P ) P I I I ) I ) ) ) ) ) ) ) ) ) ) ) ) ) I _ I _ _ ) ) I ) ) _ ) ) ) ) ) _ ) ) _ _ _ ) _ _ ) _ ` _ _ _ _ _ _ _ ` _ _ _ _ _ _ [ ) _ _ _ ` _ _ _ ` ) _ _ _ _ ' ) _ _ ) _ ) ] _ ) _ _ ) ) ) ] ) ) ) ) ) I ) I I I I I P P I P I L I P P P P P P P I P I I I P I P I I P P P P P P J I P P I P J L I P P P P I P P I P P P I I I I P P P P U P P P P P P P L L P L L L J L L D H H D L Z L G Z Z L Z G C G T R d.g.g.d.g.g.g.j.g.g.g.g.z.g.g.z.g.g.g.f.g.z.g.g.z.k.f.g.g.g.z.z.l.z.z.g.h.l.h.z.g.h.l.l.z.g.l.h.l.g.A.A.z.l.A.l.l.A.z.l.A.g.A.g.A.A.A.l.A.A.A.l.l.A.A.A.A.A.A.A.D.S.l.G.A.S.S.S.H.G.S.L.D.H.H.T.H.U.L.L.L.P.L.XXP.U.P.P.U.T.Y.T.Y.T.U.P.U.Y.L.T.Y.~.L.Y.T.P.T.P.Y.T.P.T.T.T.T.T.T.T.~.R./.~.R.~.Y.~.T.^.T.P.~.~.~.~.~.!.~.~.~.~.~.~.T.T.~.T.T.T.T.P.T.T.T.P.T.T.T.U.T.Y.T.Y.R.T.T.P.Y.T.T.P.T.P.T.Y.Y.U.P.U.P.P.T.U.P.L.U.L.U.L.Y.H.L.L.H.P.L.L.L.Y.F.L.L.L.L.L.T.T.P.T.T.T.T.T.T.P.T.T.T.U.P.P.T.P.P.T.P.U.U.T.P.T.T.T.Y.T.P.Y.U.Y.Y.L.T.U.L.P.Y.U.U.Y.U.T.U.T.U.Y.I.U.U.L.L.L.L.U.L.L.H.L.L.L.L.H.L.L.L.D.L.L.S.Y.L.L.P.U.Y.H.] / / ' } hXBXVXZXCXVXAXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXZXAXZXFXZXZXCXBXhXm.' ~ / S [ Y.A.g.A.Z.g.h.g.A.l.h.h.z.l.A.h.h.l.h.l.h.h.z.k.h.f.g.g.g.f.g.f.g.k.k.h.k.k.j.j.x.g.a.g.z.h.h.h.z.A.h.A.h.A.h.h.h.h.h.h.l.l.h.h.A.l.l.l.l.g.g.g.h.h.h.z.z.h.z.k.l.h.h.k.h.l.l.l.h.h.z.h.h.h.A.A.A.Z.h.h.A.A.A.A.h.F.A.H.H.H.H.L.L.U.L.L.U.L.L.U.G.L.L.L.P.L.L.L.L.L.L.H.L.P.L.G.D.H.D.H.P.L.H.L.L.L.L.L.H.L.L.L.L.U.U.U.T.T.T.~.T.~.~.~.T.~.~.T.~.XXU.XXT.T.[.(.T.~.~.T.[.~.~.T.[.T.~.T.~.~.T.~.~.~.~.~.!.~.~././.)././././.(./.!./.(.(.(.^.(.(.(.(.`.(.`.`.`.(.^._._.`._._.`._.(._._.(.(.(._.(.(.`.^.(.`._.(.|.|._. X|.|.|.|.}.}._._.(.|.|.|.|.'. X|.}.|.|.|.}.}._.|._. X|.|.|.|._._.|.|.|.|.|.|.",
+"I I _ L I I I I P ) P I I I P P P ) P ) I ) ) P ) ) P ) ) ) _ I ) ) I ) ) ) ) U ) ) ) _ _ I ) _ ) _ _ ) _ _ _ _ ) _ _ _ _ _ _ _ ' _ _ _ _ _ ] _ _ ` _ _ _ ) _ _ _ _ _ _ ) [ _ _ _ _ _ ` _ _ _ ) _ _ ) ) ) ) ) ) ) I ) ) ) ) I ) ) P ) I I ) I I P I ) P P P I ( ( P P P I I I P P P P I I P P P I P P P P I P P P P L P P I I P P P I I P I P I P P I P P P P P I P P ( P P J U L L P P P L L L L L L L L H J H Z L L Z L L G Z G G U T g.g.d.Z.g.j.g.g.g.g.g.g.h.f.f.g.g.g.z.g.g.g.f.z.g.z.g.g.k.g.g.g.g.g.g.g.h.l.g.g.g.g.z.g.g.g.z.h.l.h.g.A.h.A.l.l.l.l.l.l.A.g.A.g.A.l.A.l.A.A.A.h.A.A.A.l.A.h.A.A.A.l.S.H.S.G.S.G.H.A.H.H.H.H.H.H.H.P.P.H.L.P.P.P.P.P.U.U.Y.Y.Y.P.P.Y.T.Y.U.T.L.~.U.L.L.I.L.P.U.P.L.T.P.P.Y.T.P.T.T.T.T.T.~.T.T.T.T.~.~.~.T.T.T.^.T.~.~.~.!.~.~.~.~.T.~.~.~.T.~.T.T.T.T.Y.P.T.T.T.T.U.Y.U.T.Y.U.R.T.T.Y.U.T.U.Y.U.T.P.P.U.U.P.U.P.P.P.U.L.Y.U.L.L.L.L.L.Y.L.Y.L.L.P.L.D.L.L.L.P.L.T.H.P.T.T.R.Y.Y.Y.T.Y.T.Y.L.T.T.T.P.Y.U.Y.U.Y.T.U.U.T.T.P.T.P.T.U.T.T.U.U.T.Y.Y.Y.U.P.P.P.U.U.P.U.U.T.I.L.U.U.L.L.U.L.L.L.L.L.L.L.L.L.L.L.L.U.U.L.L.S.L.Y.L.U.P.Z./ / / { ].fXHXVXZXVXVXZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXZXFXFXAXZXZXZXBXfXm.[ / ~ / / T.A.A.h.A.A.h.A.A.S.h.S.S.l.h.S.h.G.l.h.l.h.h.h.h.g.g.f.g.g.g.g.g.h.f.k.h.h.k.k.j.g.z.g.h.h.l.h.l.h.A.h.A.h.A.l.h.z.z.h.h.A.l.A.h.l.l.l.h.h.z.h.g.h.z.z.j.h.h.l.k.h.h.l.l.l.l.h.h.l.l.A.h.A.g.A.h.h.A.A.A.A.A.A.H.H.H.H.H.H.L.H.L.U.L.L.L.G.L.L.U.L.P.L.L.L.H.L.L.H.L.H.L.H.P.L.L.P.H.D.H.H.L.H.H.H.L.L.H.L.L.L.L.L.U.U.U.T.T.T.T.~.T.~.T.~.T.(.T.~.T.E.T.T./.T.~.T.~.~.T.~.~./.T.~.T.~.T.~.~.XX~.~.~././././././.(./.!./././.(.(.(././././.(.(.^.(.(.^.`.(.`.`.`._._.(.`.|.(._._.(._.(.(.(.(.(._.^.^.^.`.^.`.`.(.|._._. X|.}.}.}.`.|.|.|.|.|.|.|.}.}. X}.}. X X}._. X|.|.|.|.|.|.|.|.'.'.|..X|.'.",
+"I I L ( I I I I P P P P P P P P I P I P I P ) ) ) L ) ) ) ) ) ) ) ) ) ) I ) I ) ) ) ) ) ) _ _ I ) _ ) [ ) _ ) _ _ _ _ _ ) _ _ ) ` _ _ _ ' _ _ ` ` _ _ ) _ ` _ ` ` _ ` _ _ _ ) _ ] _ _ _ ) _ _ _ _ _ _ _ ) ) ) ) ) ] ) ) ) I ) ) ) P ) ( ( I P ) I I ) P P P I P I P P ) P P I I P P P ( I P I P P P P P I P P P P P P P P P P J P P P P P I P P P I I P P I P I P P P I U P P U P P L P L L L P L J L L L H H H L L L Z G L Z G G Z U T Z.d.g.d.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.l.g.g.z.l.g.z.g.l.z.z.g.h.g.g.h.g.g.z.g.l.g.h.g.A.z.A.h.l.A.l.l.A.l.l.A.A.A.A.l.A.l.D.A.A.A.A.l.A.l.h.A.h.l.D.l.l.H.S.S.A.S.G.A.H.H.H.H.L.L.H.L.H.L.D.L.L.L.L.P.P.P.P.P.Y.U.T.Y.U.P.L.L.P.L.J.U.U.P.P.Y.P.U.P.P.P.P.Y.P.T.P.T.T.T.T.T.T.T./.T.R.T.~.^.T.^.T.T.T.~.T.~.T.T.T.~.[.~.T.T.T.R.T.T.Y.Y.T.T.T.U.Y.T.P.P.T.Y.U.U.T.T.T.T.U.U.P.T.P.U.U.U.U.P.U.L.U.P.P.P.L.L.Y.L.L.L.L.L.H.L.L.L.L.L.P.L.Y.H.Y.L.U.U.L.T.T.R.U.T.T.P.T.Y.T.T.T.T.P.T.U.P.Y.U.Y.T.U.T.Y.T.P.P.~.!.L.T.P.T.P.L.Y.Y.L.P.T.P.U.U.U.Y.T.U.T.I.U.T.L.T.L.U.L.L.L.U.L.L.L.L.L.L.U.L.L.P.S.L.S.L.L.L.L.P.P.Z.Q / ` m.hXMXFXZXVXVXFXAXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXAXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXZXFXFXFXZXDXGXZXMXhX{ _ ~ ! / T.h.A.g.A.h.A.A.A.D.h.h.h.A.A.A.h.g.A.l.l.h.h.h.k.g.g.g.g.j.k.g.g.g.h.h.j.k.k.k.z.g.g.g.h.h.l.l.l.Z.A.A.h.A.h.l.l.h.h.l.l.l.l.D.A.z.h.l.l.h.h.h.h.z.h.j.x.h.x.j.h.h.h.l.l.l.l.l.l.l.l.h.l.A.A.A.A.G.A.A.A.A.G.A.A.S.S.G.H.H.L.L.L.P.L.L.L.U.L.P.L.L.L.D.L.L.L.L.L.L.L.L.L.L.D.L.L.L.S.L.S.H.H.H.H.L.L.L.L.L.L.L.L.I.I.I.I.T.T.~.T.~.~.~.~.~.T.~.Y.~.~.~.T.(.~.T.~.~.~.~.~.~.~.~.~.~.~.~.T.~.T.{.E.~././././././././.(.(.!.(./.(./././.(./.(.!./.(.(.(.(.(.(.(.(.`.^._._.^.(.`.`.(.(.(.(.(.(.(.(./.(.(.(.(.(.(.^.`.(._.`.`.}.}.}.}.^.|.`.|.|._.|._. X}.}.}.}.}. X}.|.|.|.|.|.`.|.|. X|.|. X X|. X X",
+"I I P J J J I J P ) P / I P P ( P ) I I I ) I I I ) I ) ) ) ) ) ) I I ` ) ) ) ) ) ) ) ) ) _ U _ ( ) I _ ) ) ) _ I ` _ ) _ _ _ _ _ _ _ ` ` _ _ _ _ _ _ _ _ _ _ ) _ _ _ _ _ _ _ _ _ _ _ _ ` _ ] _ _ _ ) ) _ ) ) ] ) ) ) ) ) ) ) ) ) ) I I I I I I I I P P I P I P I I P P P P ( P I I I P P I P P I P P I P P P P P P J J U I P J P P P I J I I ( ( I P I P P I P I I I U P P P P L P P P L I P L L L L L L L L L Z L G G L G L Z G G T T d.g.g.g.g.d.j.g.g.g.g.g.g.g.g.g.g.g.z.h.z.h.z.h.g.g.g.g.g.h.g.l.l.g.g.z.g.h.h.g.g.h.g.z.l.h.h.k.l.l.l.A.A.A.l.A.l.S.l.A.A.A.g.g.A.l.A.A.l.l.A.l.A.l.l.A.A.A.A.A.G.A.S.A.G.A.G.S.S.H.H.H.H.H.H.H.L.H.L.L.L.L.P.L.P.L.P.P.Y.P.U.L.H.L.L.Y.Y.U.U.L.U.T.L.L.P.L.U.L.L.P.P.U.P.P.U.Y.Y.Y.T.P.T.T.T.R.T.T.P.P.P.P.T.T.~.~.T.T.T.[.T.T.T.T.T.T.T.U.R.Y.T.Y.T.P.P.T.Y.P.Y.U.Y.P.U.T.U.U.U.U.P.T.P.P.U.U.U.U.L.Y.U.P.H.L.P.H.H.L.L.L.L.L.L.L.L.Y.L.L.H.L.K.D.L.L.Y.H.L.P.L.U.H.T.T.I.U.P.T.P.T.P.L.Y.U.U.U.Y.U.U.U.U.U.Y.P.U.Y.P.Y.T.P.Y.P.U.Y.U.T.T.P.Y.U.P.Y.P.U.T.U.U.U.U.I.T.T.U.L.U.U.T.T.L.I.U.L.L.L.L.L.L.P.P.P.L.L.L.L.L.L.L.P.Y.e./ S m.hXBXCXVXAXFXFXFXFXAXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXAXFXFXFXFXGXHXFXGXBXfX].} / ! ~ T.A.A.S.A.J.A.A.h.A.A.A.A.z.A.z.A.A.h.l.l.h.h.h.h.g.g.g.f.g.g.g.g.z.h.a.k.j.f.j.f.z.h.g.z.h.l.l.G.A.j.h.A.h.l.l.l.h.h.h.h.l.l.z.h.A.h.l.l.h.h.h.h.h.h.h.h.h.h.g.h.h.z.l.l.h.l.l.l.l.l.l.A.g.A.A.A.A.A.A.A.A.A.A.H.H.G.L.A.H.H.L.H.D.L.L.L.P.L.D.L.A.L.L.L.U.L.L.L.L.L.L.L.L.P.G.L.L.L.L.L.L.L.H.L.L.H.S.L.S.L.L.L.L.L.I.I.T.T.T.~.~.T.T.~.~.~.~.R.U.~.~.[./.T.(.~.~.~./.~.~.[.~.~.~.~.~.~.~.{.T.XX~./././././.^.(././././.(././././././././.(.(.(.(.(.(.(.(.^.`.^.`.(.(.|.(.(._.(._.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.`.`.(.(.}.}.}.}.|.^.|./._._.|._.}._.}. X}.}. X|.|.|.|.|.|.|.|.|. X|..X.X|..X'..X",
+"I I P P ( I I P P J ) P P P P P P ) ) P I P P ) I I ) I ) ) I ) ) _ ) ) ) ) I _ ) ) ) ) ) _ _ ) _ _ ) ) _ _ ) _ ) _ _ _ ) _ _ _ _ _ ` _ _ _ _ _ ) ` ` _ _ _ ) _ _ _ _ _ _ ` _ ` _ _ ) ] _ _ _ ) _ _ _ ) ) ) ] ) ) ) ) ) ) I ) ) ) I ) I I I I I P I I I I P I I I P P P P P P P I L I I P P I P I P P P P P P P P P P P J P J P P P P P P ) P P P I I I I I I I ( U P P P P I U I I L P I L L P I L L L L L H H L L L L L G L G G L Y d.d.Z.d.j.g.g.j.g.g.g.h.g.z.g.g.h.z.g.l.g.h.z.l.g.l.l.g.l.l.g.g.h.A.g.h.l.h.z.l.h.l.l.l.k.g.l.z.A.z.l.l.l.l.A.l.A.G.z.l.A.l.l.l.l.A.A.g.l.A.l.l.A.A.h.A.h.h.h.h.A.h.A.A.S.A.S.S.G.H.G.G.H.L.H.H.L.H.H.H.H.P.H.P.P.L.P.T.H.L.H.P.L.U.L.L.U.U.P.H.U.P.L.P.H.P.L.U.L.P.H.L.P.P.L.P.Y.P.T.T.U.T.T.U.U.P.P.P.P.P.T.T.U.T.T.T.T.T.T.T.^.T.T.T.T.Y.Y.Y.U.T.T.P.P.P.P.Y.L.U.U.Y.L.U.Y.Y.T.U.T.U.Y.P.U.Y.L.L.L.L.L.P.P.H.L.L.L.L.L.L.L.L.H.L.L.L.H.D.L.P.L.L.D.L.H.H.H.L.L.H.U.P.T.L.L.U.Y.U.U.U.Y.U.U.U.I.U.U.P.P.P.P.P.U.L.Y.T.T.Y.P.U.P.Y.Y.U.T.U.P.L.P.U.P.P.P.P.L.P.T.T.U.U.U.T.L.U.L.L.U.T.Y.U.U.U.P.U.L.U.U.U.L.L.L.L.L.L.L.L.H.U.I.T / ~ aXhXBXVXFXZXAXZXZXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXFXFXFXVXZXFXFXCXFXCXCXdX} _ ! ! F.A.A.A.G.A.G.S.S.S.A.A.A.A.l.A.A.l.j.A.h.h.h.h.g.g.g.g.g.g.g.z.z.k.k.j.k.g.h.g.g.h.h.z.g.h.l.l.l.A.h.A.z.A.h.l.l.h.h.h.l.h.h.A.l.l.h.g.l.h.l.h.h.h.h.h.h.h.h.h.g.h.l.S.z.A.h.h.h.A.z.h.A.z.A.A.A.A.A.A.A.A.A.H.A.H.H.G.G.H.H.H.L.L.L.L.L.L.P.L.U.P.P.L.P.L.P.L.L.L.L.L.L.L.L.G.L.L.L.H.L.H.S.H.H.L.S.L.D.L.L.L.S.G.L.U.I.U.~.T.~.T.~.~.~.~.T.~.~.T.~.~.~.~.~./.~.~.~.[.(.~./.~./.T.~./.~.~./.~./././.(.^././.(./.(.(.!././.!././.(.T.(./.(././././.(.(.(.(.(._.(.(.(.|.{.(._.(._.(.(.(.(.(.(.(.^.(.(.(./.(.(.(.(.`.(.|.`.(.`.|._._.^._._.|._.|.|._._._._.}.}.|.|.|.`.|.|.|.|.|.|..X|..X.X|..X'..X",
+"I ( P P S I I I P ) P P P ) P U P P P P P ) P ) I ( I ) P I ) ) ) I ) _ ) I ) ) _ I ) ) _ I ) _ I _ I _ ) _ ) _ _ ) _ _ ` ) ) _ _ ) _ _ ) _ ) _ _ _ _ _ _ _ ` _ ) _ _ ) _ _ _ _ _ _ ) ` _ ) ` _ _ ) _ ) ) ) ) I ) ) ) ) ) ) ) ) ) ) P ) ) I P ) ) L P P P P I U P P I I P I I P I ) L P I P P P P P P P P P P P P L P P P P P P I P P P P P P P P P P P P ( I I I P P P P P P P L P P I L P I L L P L L L U L L L L L L L L L L G U T j.g.g.j.j.g.j.g.g.g.g.h.g.h.h.z.g.h.h.h.g.h.h.l.g.g.l.g.z.g.z.g.A.g.l.h.l.h.h.g.g.l.g.l.g.l.g.g.g.l.l.l.l.l.l.A.l.l.l.l.l.l.A.A.l.l.A.D.A.l.l.l.A.A.l.z.h.A.A.A.h.S.A.A.S.A.A.S.A.S.S.H.S.D.H.H.H.P.H.L.L.P.H.H.P.P.H.L.P.H.U.U.L.L.L.L.H.H.U.H.P.L.P.H.P.H.L.L.U.L.P.H.L.P.U.P.U.P.Y.Y.Y.U.U.U.U.P.U.Y.U.U.P.P.T.T.T.P.T.T.T.T.T.T.T.Y.Y.T.Y.T.T.P.T.Y.U.P.Y.L.U.U.Y.U.U.Y.P.L.U.Y.Y.P.U.Y.P.U.L.P.L.L.L.H.P.P.H.H.D.L.U.L.L.Y.H.L.H.L.H.L.Y.L.L.H.H.L.L.H.L.L.H.P.L.H.L.L.L.L.U.Y.U.L.U.L.Y.T.Y.Y.T.L.L.U.L.P.L.L.T.L.P.T.P.T.Y.U.U.Y.T.P.T.T.U.U.Y.T.P.T.T.U.P.U.T.U.T.T.L.T.T.T.T.T.T.Y.Y.U.P.U.L.L.U.Y.L.L.L.P.L.L.L.Y.K.L.U._ / ! hXBXCXZXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXZXVXVXVXDXCXBXm.' ! ! Q.A.A.A.A.G.G.G.S.S.H.S.S.S.A.A.A.G.A.h.A.h.h.h.h.h.g.g.h.g.h.g.k.h.g.h.f.g.a.j.g.g.g.h.h.h.l.l.l.h.A.h.A.h.h.h.l.h.h.h.l.l.l.l.h.h.l.l.l.h.l.l.l.h.h.h.h.h.h.z.G.l.l.l.h.h.h.A.h.A.h.A.A.A.A.A.Z.G.A.A.A.A.Z.H.H.H.H.H.L.H.L.S.H.H.L.L.S.L.U.G.L.P.L.L.P.P.L.U.L.P.P.L.L.P.P.P.P.L.L.L.L.S.U.D.H.L.L.L.L.L.L.L.L.L.L.U.I.T.T.T.T.~.~.T.T.T.~.~.T.~.~.~.~.^.~./.~.~.~.~.~./.~.~.~././.~./.~././././.(.(.E././.(.(.(./.(.(./.(.(./././././././.(.(.(.^./.(.(.(.(.(._.(.(.(.|.(._._.(._.(.(./.(.(.)./././.~.(.(.(.(.(.(.^.(.(.{.^.^._._._.`._._.{.{._._. X_.}.}.}.}. X'.|. X|..X|..X|..X.X'..X.X.X.X",
+"P P P P P P P P P P P P P P P / ) P P ) P ) P ) I I I I ) I ) ) ) ) I Y ) ) ) ) I _ ) ) ) ) ) I ) ) ) _ ) ) _ ) ) _ _ _ ) _ _ ) ` ) _ _ _ ) ` _ _ _ ` _ [ ) _ _ _ ) _ _ _ ) ` ) ) _ _ _ _ _ _ ) ) ] _ ) ) ( ] ) ) ) ( ) ) ) ( P P ) ) I P ) P ( I I I I P P I P P I J I P P P I P P P I I ( I P P P I P L P I P J P L P L P P P P I P P P P P P I P P I I I I P P I P P P I P P P P P P P P P L L L L L L P L L L G G L L G G G U U T Z.j.g.d.g.g.g.g.g.g.g.g.g.g.g.g.h.h.h.g.g.h.h.h.h.g.g.h.h.g.h.l.g.l.h.l.l.h.h.z.g.h.g.g.z.g.g.A.l.g.A.l.l.l.A.l.A.l.l.l.l.l.l.A.A.l.l.A.l.A.A.z.z.A.h.l.A.A.l.A.A.l.A.A.l.A.S.G.A.S.G.D.G.H.H.H.H.H.D.G.L.H.P.H.L.H.P.L.H.L.H.H.L.L.H.H.L.H.P.L.H.H.H.L.U.H.P.H.U.L.D.L.L.P.D.P.P.L.L.L.U.L.P.U.Y.L.P.L.L.U.U.L.T.T.T.T.T.Y.T.Y.T.T.T.T.T.Y.U.I.T.P.T.U.P.Y.U.U.L.Y.L.Y.U.L.L.L.U.U.U.L.P.U.U.U.L.L.L.L.L.L.H.L.H.L.L.L.H.H.L.H.L.L.L.D.L.H.L.L.D.L.L.D.H.L.L.L.L.P.H.L.L.L.L.U.L.U.L.L.P.L.L.U.Y.U.L.L.Y.L.L.U.L.L.Y.U.T.P.P.T.P.Y.P.P.P.T.U.L.T.Y.Y.L.P.H.T.P.T.U.T.T.T.L.T.T.T.T.T.P.T.T.U.P.T.U.U.U.U.P.Y.L.P.L.L.P.L.U.L.U.U._ ~ ~ fXHXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXDXFXBXm.' Q ! n.A.S.S.A.A.S.S.S.G.S.S.S.S.A.G.A.h.A.A.A.g.g.h.h.h.g.h.g.g.h.z.g.z.g.g.g.g.g.k.k.k.g.z.h.l.h.z.J.A.h.A.h.h.h.l.l.l.g.h.h.h.h.h.h.l.l.l.h.h.l.h.l.h.A.z.h.A.h.z.l.S.l.l.h.l.A.z.A.A.A.h.A.A.A.A.A.A.A.A.W.S.L.G.G.H.H.G.H.H.H.H.H.L.D.L.P.D.U.D.L.L.U.P.L.L.P.L.L.L.P.L.P.P.P.L.L.L.L.L.H.L.L.L.L.S.L.L.L.L.U.L.L.U.L.H.U.U.U.T.~.T.~.~.~./.T.T.XX/.~.~.~.T./.~././.~.(./.~./.~././././.~././././././.(././.(.(.(./.(././././././.(.(./.)././.(././.(./.(.^.{.(._.|.^.^.`.^.^.(.(.(.].(.(.(./.(././././.(.^.(.(.(.(.^.`.[.{.`.{.|._.{._.^._._.`._.}.}.}.}.}. X|.}.|..X|.|.'.'.|. X.X.X.X|..X X.X.X",
+"P P P P P L P P P P P P P ) P P J ) P ) P ) P ) I I I I ) ) I ) ) ) ) ) ) I ) I ) I ) ) ) ) I _ ) ) _ I _ ) _ ) _ ) _ Y _ _ ) _ _ ) ` ) [ _ ) _ ) _ ) _ ) _ ) _ _ _ _ ) ) _ ) _ ) ` _ ] _ _ _ ) ) ) ) ) ) ) I ) _ ) ) ) I ) ) ) P ) I I ) I I I I P P P P I P ( P P P J I P P P P I P P P P P P I P P L P P P L P L P P P P J P P P P P P P P P ) P I I P P P I I P I I P P P I P P P P L L P U P P L L P L U L L L L L L L L L L T T d.g.d.Z.g.g.g.g.g.g.g.g.h.z.g.h.h.z.g.g.h.g.g.h.g.l.l.l.l.A.h.l.l.h.h.l.l.l.l.l.l.g.z.g.g.z.g.g.g.g.h.l.l.l.l.l.l.l.l.z.A.l.A.l.l.A.A.A.l.l.A.h.A.A.z.A.z.A.l.A.z.A.A.A.G.A.A.A.A.A.S.G.H.G.H.H.G.H.L.D.H.D.P.L.L.H.D.L.H.H.H.L.H.H.L.H.U.H.H.L.H.L.L.D.P.L.L.L.L.H.P.Y.H.H.L.L.P.L.L.L.U.U.L.U.L.P.L.Y.L.U.U.Y.L.T.P.Y.T.P.T.T.T.T.T.Y.U.I.T.P.U.P.P.P.Y.U.Y.Y.L.U.L.L.L.Y.Y.L.U.U.L.U.P.U.L.L.U.L.L.L.H.L.L.H.L.H.H.H.D.L.H.H.L.H.L.L.L.D.L.F.L.P.H.L.H.H.P.H.H.G.L.L.H.L.L.D.L.L.L.P.L.Y.L.L.L.L.L.U.L.Y.P.L.L.U.L.P.L.P.T.Y.T.U.P.P.T.U.Y.P.T.U.L.P.U.J.T.L.T.T.L.U.U.T.T.T.T.T.T.T.P.T.T.P.P.U.U.U.U.P.P.P.L.L.L.L.P.L.U.Y.L./ ~ ! BXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXFXDXZXFXBXQ.} / ~ b.S.z.S.S.S.S.S.S.S.S.G.S.S.S.A.A.G.A.A.A.G.h.h.h.h.h.h.g.h.g.h.h.h.h.g.a.g.g.k.k.h.g.z.g.l.l.g.l.h.A.h.A.l.l.l.h.l.h.l.h.h.A.h.h.h.l.l.l.l.l.h.h.h.h.A.h.h.A.h.l.h.A.A.z.l.S.S.A.A.A.A.A.A.h.A.A.A.A.G.h.G.G.H.G.L.H.L.H.L.H.H.K.L.L.G.L.D.U.P.L.P.L.P.L.P.P.P.U.P.L.P.L.L.L.L.U.L.L.L.L.U.S.S.L.A.L.S.L.L.Z.L.L.H.T.U.T.T.T.T.T.T.T.T.~.T.[.T.E.R.~.~.~./.^.[././.{./././.~././././.~././././././././.(././.(.!.(.(./.(./././././././.]././.!./.(./.^./.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./././././.[./.~.(.~.(.^.(.(.^.(.^.{.{._.^.|._._._._._.`.}.}.}.}.|.}.|._.'.|..X X.X|..X|.'..X.X.X.X@XdX.X",
+"P P P P P P P L P K J P P P P P I I I I P ) I I I I I ) ( ) I ) I ) ) ) ) ) ) ) ) ) ) ) ) ) I ) ) _ _ I _ ) ) _ _ ) ) _ ) ) _ ) [ I _ ) _ _ ) _ ) ` _ _ ) _ ) _ _ ) ) ` ) _ ) ` _ _ ) ` [ _ ) ` _ ) ) ) ( ) ) _ ( ) ) I ) ) ) ) I I ) I P I I P I P I P P P P P P P I P P P P I P P I I ) P P P P I P P P L P P P L P L P P L P P P P P P P I P P P I P P I P I P P P P I P P P P P P P P P L P L I L I L U P U L L H L U G L U U T d.d.j.j.d.g.g.j.g.g.g.g.g.g.z.h.h.h.l.l.h.h.h.h.h.h.h.h.A.h.l.l.l.l.h.A.h.h.h.h.h.h.h.z.h.h.f.h.z.l.h.l.l.l.l.l.A.A.l.G.l.z.g.A.x.A.G.h.G.h.h.h.h.h.h.h.h.h.l.l.A.A.A.h.G.h.A.A.A.A.G.A.G.A.G.G.S.H.S.H.H.H.S.L.S.H.H.H.H.H.H.H.H.L.H.H.H.L.L.S.L.L.S.L.L.H.U.S.L.H.H.H.U.L.L.L.H.L.H.U.L.L.L.L.P.L.L.L.L.L.L.L.U.U.U.U.L.Y.P.T.Y.Y.U.U.T.P.P.P.U.Y.L.Y.P.U.U.L.L.P.L.P.L.P.L.L.P.U.L.L.Y.L.U.L.U.L.L.L.L.H.L.L.L.H.L.H.L.P.L.H.H.L.L.S.L.L.L.H.L.H.H.D.H.L.P.L.H.H.L.H.L.L.L.G.P.H.H.L.L.H.H.T.H.T.H.U.L.T.H.H.U.T.H.T.U.Y.P.Y.L.T.Y.U.Y.T.U.T.P.L.I.U.T.U.T.L.T.T.T.[.L.T.U.T.T.T.T.P.T.P.T.T.T.P.T.P.P.P.T.P.P.P.P.P.P.P.U.U.P.P.! ~ ! ZXHXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXAXZXZXZXZXBXQ.} ! Q b.D.A.G.G.A.S.G.G.S.H.A.H.G.S.D.D.A.A.A.A.h.h.A.h.A.h.h.h.k.h.l.k.l.k.g.g.g.g.f.f.k.h.k.z.h.h.l.l.A.h.l.h.h.h.h.g.h.h.z.h.h.h.h.z.l.l.l.l.l.h.l.h.l.l.l.l.g.z.h.A.h.A.h.A.h.A.A.A.A.A.A.S.A.A.A.A.A.G.A.h.A.G.H.H.A.L.S.L.S.U.L.L.H.L.L.H.L.L.L.U.L.U.L.U.L.L.U.Y.P.P.P.L.L.L.L.L.D.U.P.P.L.D.S.L.P.D.L.L.L.L.L.L.L.P.P.U.Y.T.U.T.T.T.T.~.T.(.~.~.~.(.XXE.~.{.~././././.~././.~.[.!././././././././.(.(.(./.(./.{.(.(.(.^./.^./././.(.^./.^.{./././.E.~./././.(.(.(.(.(.(./.(.^.).^.(.!.(././././.~.~./.(./.).~.]./././.(.(.(.(.(.`.(.{.{.`.(.{.`.^.^.|.`._.|.|.|.|.|..X|..X'.`..X.X.X.X.XzX'..X.X",
+"P P P P J P P J P L L P P P I I J I I I P P I I ) I P I ) P ) I ) ) ) I ) I ) ) P ) ) ) ) _ I _ ) ) ) ) _ I _ ) ) ) _ _ _ _ _ ) _ _ _ _ ) I _ ) _ ) _ ) _ ) ) ` ) ) _ ) ) _ _ ) ) _ ) _ ) _ _ _ ) _ _ ) ) ) ) I ) ) ) ) ) J ) I ) I I ) ) I I I I P I P P I P P P I P P ( I P P I P P P P P P P P P P L P P L P P J P P P P P I P P I P P P I P I P P I I I I I I I I P P I I P Y L P P P P P P I L P J P U L L L U U L L L G U T T d.Z.j.j.g.g.g.g.g.g.g.g.h.g.h.h.l.h.l.h.l.h.A.h.h.h.h.A.h.A.A.l.A.A.A.h.A.h.G.h.h.h.h.z.h.h.h.h.h.l.l.l.l.h.l.l.l.z.l.l.l.l.G.h.G.h.A.h.h.h.A.G.h.G.A.A.A.A.A.A.l.A.A.A.A.A.G.A.h.G.H.A.A.H.S.S.G.S.H.H.H.A.H.S.H.S.H.H.H.H.H.H.H.H.H.L.H.D.H.H.H.H.L.S.H.H.L.H.L.H.H.L.H.S.S.L.H.L.L.D.D.L.P.H.H.L.D.P.H.D.U.J.K.L.L.L.U.L.Y.P.P.U.T.P.U.Y.P.P.L.T.Y.L.U.P.U.Y.P.L.L.Y.L.Y.L.P.L.L.L.U.L.L.L.H.L.J.H.H.L.H.H.H.H.H.H.H.H.H.H.S.L.L.L.L.S.H.L.H.H.H.L.L.H.H.D.H.L.H.H.L.H.H.L.L.H.L.H.P.H.P.H.P.U.H.L.H.L.H.L.L.L.L.U.Y.Y.H.T.L.L.Y.U.Y.U.P.L.L.T.T.U.U.L.T.T.T.U.T.T.P.P.T.T.T.T.T.T.[.T.T.T.U.T.T.T.P.P.P.P.P.Y.P.P.T.P.T.Y.L.P.P./ ~ S ZXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXGXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXVXGXFXDXCXBXm.{ ~ S b.F.S.A.S.S.S.S.H.S.D.D.H.H.S.D.D.H.A.g.H.A.A.A.h.z.h.h.k.h.h.l.h.h.k.g.z.k.g.g.g.j.k.h.h.h.h.l.l.g.A.l.l.h.z.J.z.h.z.h.h.A.h.h.h.k.l.l.k.l.l.l.l.l.l.l.l.G.z.A.h.h.h.A.h.A.A.A.h.A.A.S.h.G.A.A.A.A.A.G.Z.H.H.H.H.L.S.U.S.U.S.L.S.L.S.H.L.L.L.L.Y.U.U.L.L.Y.L.L.L.L.A.L.L.L.S.L.L.U.P.P.H.L.U.U.S.P.L.A.L.L.L.L.L.L.U.T.P.U.U.U.T.~.T.~.T.R./.~.T.XX).~.T.~.~.~./.~.[././.~./.(././././.(./.(.^./.(.(.(.^.(.(.(.^.(.(.(./.(./././././.(.^.(./././.(./.(.(./././.(.(.(.(.(.(.^.^.(.(.(././././././.(.~.~./././.~.(././.(.(.(.(.(.(.(./.`.(.(.(.|.`.|.`.|._.|.|.|.|.|..X|..X.X.X.X.X'..X.X.X'..XzXzX",
+"P L P P L P L J L P P L P P P P P P I I ) P P I P ) I ) ) ) ) P ) ) ) ) ) ) ) ) _ I I ) ) I ) ) ) ) ) ) U _ ) ) _ _ I ) ) ) U _ _ I _ ) ) _ ) _ ) ) ) _ _ _ _ ) _ ) ) _ ) ) _ ) _ ) ) ) ) ) _ ) ) _ I ) ) ) I ) ) ) I I J ) ) J I I I I I I I P I I P P P P L P P P P P P P P P P P I P I I P P I P P P P P P P U J L P P J P J P L P P P P P L I P I J P P I P J P P I P P I P L I P K U P P U L P P U P L L L L P U L U ( U G T [ d.Z.g.Z.d.g.g.f.g.g.g.g.h.h.h.h.z.h.l.l.z.h.h.A.h.G.A.A.h.A.A.l.A.h.A.A.A.A.A.h.h.h.h.h.z.h.h.A.A.x.l.h.l.z.l.A.A.l.G.l.A.h.h.h.A.l.A.h.h.G.A.G.h.h.A.A.A.A.l.A.A.A.S.A.h.G.A.A.G.A.A.H.H.G.S.S.H.G.H.S.G.G.S.H.S.H.S.H.H.H.L.H.H.H.H.H.H.H.H.H.S.H.H.S.H.L.H.L.S.D.H.H.H.D.D.L.L.H.L.L.K.S.H.P.H.P.D.P.P.H.H.L.L.H.L.L.U.U.U.L.P.Y.L.P.L.P.L.U.L.Y.L.L.U.U.U.L.Y.L.L.L.P.L.U.P.L.U.U.L.L.L.L.U.L.L.L.L.H.L.H.H.L.H.H.H.H.H.H.H.H.H.S.S.H.J.H.H.H.H.H.S.H.H.H.H.H.D.H.H.H.H.G.H.H.L.H.H.H.L.P.H.L.H.L.H.L.L.H.L.H.L.J.L.L.L.U.P.Y.U.U.L.T.P.U.P.T.P.P.T.T.Y.T.U.T.U.T.T.T.T.P.P.T.T.T.T.T.XX[.T.T.P.T.P.P.T.Y.P.P.P.P.P.T.P.P.P.T.P./ Q / CXFXDXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXAXDXDXSXFXFXFXFXAXAXFXZXDXDXHXQ.[ ~ ~ c.A.S.S.S.S.G.G.G.S.G.G.S.H.G.A.H.S.S.A.g.A.A.A.g.l.l.h.h.k.l.g.k.k.h.g.d.f.f.f.g.h.k.f.h.h.h.l.l.h.A.l.h.l.h.z.A.G.h.h.g.x.h.h.z.h.k.k.h.z.h.h.l.z.D.l.l.A.h.z.A.l.A.A.A.A.A.A.A.S.H.A.A.A.S.A.A.A.H.G.A.A.H.K.H.H.H.S.L.L.S.A.D.H.H.H.L.L.S.L.K.U.Y.L.T.L.U.L.L.L.P.L.P.L.L.L.L.U.U.D.P.L.S.S.L.U.S.L.L.L.L.L.L.L.U.P.P.U.U.T.T.T.T.T.T.~.~.~.~.~.~.~.~.[.~./././.(././././.[././.(.(./.(./.(./.(.(.(.(.(.(.(././.(.(./.!./././.(.{.[.[.(.(.[./.!./.(./././.(.(.(.(.(./.(.(.(.^./.)./.!.(././././.~.~.(.~./.(./././././.(.(.(.(.`.(.|.^.|.(.|.^.`.`._.|._.|.|.'.|..X|..X.X.X.X.X.X.X.X.XxX.XdXdX",
+"P L P P L P K J P J J P P P P P P P I P P I ( I P ) P I ) S ) ) ) I ) I ) I I ) _ I I ) ) ) I ) ) ) ) ) _ _ I _ ) ) _ _ ) ) [ ) _ _ ) _ ` ) _ I _ [ ) ) ) ) ) _ _ ) ) _ _ _ ) _ ` _ _ ) ) _ ) ) ) _ ) ) ) ) ) ) ) ) ) ) ) I ) ) I I ) I P I I I P P P P P P I I P P I P P P I I P P P P P P P P P P P P P P L P L I P J L P L I J P P L P P P I J P I K P P P I I I I P ) P Y P I I I I P P P P P P P J P L I P P L U L G U U U Y T d.j.g.j.g.g.g.Z.g.g.h.g.h.z.g.h.l.l.l.l.z.h.G.h.A.h.G.A.A.A.G.G.A.S.A.h.G.h.h.A.G.h.A.A.x.h.h.A.h.h.z.h.A.l.z.l.l.A.h.A.h.A.A.A.G.h.l.W.G.h.A.h.G.G.h.G.A.A.G.G.G.A.A.G.A.A.G.A.Z.G.G.S.A.G.S.G.S.S.S.S.Z.G.D.H.H.S.H.S.S.H.D.H.H.H.H.D.L.H.S.H.L.S.H.L.H.H.D.H.P.S.H.H.H.S.H.H.S.H.D.D.S.H.H.H.H.H.H.H.D.L.L.H.L.L.L.H.L.L.L.U.L.P.L.Y.L.U.L.U.U.L.P.U.L.Y.U.Y.L.U.L.U.L.L.L.P.L.L.L.L.L.U.L.H.L.L.H.H.H.H.H.H.H.H.H.H.H.H.H.L.S.H.S.L.S.H.H.D.H.H.L.D.H.D.L.H.D.L.H.H.H.H.H.H.H.G.L.L.H.H.H.H.L.L.L.H.H.L.L.H.L.L.Y.H.P.P.Y.L.L.L.T.Y.P.P.P.P.P.U.U.Y.U.Y.P.T.U.T.T.P.T.P.T.[.T.U.T.T.T.U.T.T.T.T.T.T.T.P.P.P.XXP.P.T.P.P.Y.T.P.T.S Q S CXFXZXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXDXDXDXGXFXFXFXFXZXVXAXZXDXDXfXpX} S / [ A.D.S.S.G.D.G.S.S.S.H.G.H.H.H.G.S.S.S.G.G.A.A.S.A.h.h.z.l.l.z.g.k.k.g.g.g.g.g.g.k.h.k.h.k.h.h.l.h.h.h.l.h.h.h.j.h.h.h.G.h.h.h.z.l.k.l.k.h.h.l.h.z.l.l.l.A.z.h.z.l.h.j.A.A.A.A.A.G.z.H.A.A.S.S.S.G.A.A.G.G.A.H.H.H.H.S.L.L.L.S.D.G.Y.L.L.L.L.L.U.U.L.U.L.U.Y.L.L.L.L.L.U.D.L.L.L.L.L.U.H.U.S.L.G.L.L.L.L.P.L.P.P.P.U.P.Y.T.T.U.T.T.~.T.T.R.R.T.~.~.~.~.~.~.~./././.~./.{.^./.[././.(.(.(.^.(.(.`.(.(.(.(.(.(.(.!.(./.(.(.(.(.(.(.E.(.~.(.~.~.^.~.!.(./././.(.)./.(.^.^.(././.^././././.(./.!./.~.~.~.!.R./.~.~./.(./././.!.(.(.(.{.(.(.|.(.`.^.|.(.{.|._.|.|.|.|.|..X.X.X|..X.X.X.X.X.X.XdX@XzX'.",
+"L P L L P J J J J J J J L P P P I P I I I I ) P ) P ) I ) I ) ) H ) J ) ) P P I I I ) ) ) ) ( _ I ) ) ) ) _ _ ) ) _ _ I _ _ _ ) _ _ _ ) ) _ ) _ _ ) ) ) ) _ _ ) I ) _ I _ _ I ) I _ ) ) ) _ ) _ _ ) ) I ) ) ) I ) I ) J ) ) I I I ) P ( I I I I I P I P P L P ( P P I P P P P P I I J P I J I I P P P P P P L I J U J L L L J P P P L P P P P I P I P I I I I I I I I I I I I I I Y I I I J I I U P I P I U I U P U U U U U U U T Z.j.g.g.j.g.g.g.g.g.h.g.g.z.h.z.l.l.l.A.h.G.G.h.h.A.G.G.G.A.A.G.A.A.G.A.G.A.A.h.G.G.h.A.h.h.G.h.h.h.h.h.h.h.h.A.l.G.l.h.G.A.h.G.G.h.G.h.G.G.G.A.h.G.G.G.A.A.A.G.G.G.G.A.W.G.A.A.A.S.S.H.A.H.H.H.S.G.H.G.H.S.S.H.S.S.S.G.S.G.H.S.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.S.H.D.H.S.H.G.H.S.H.H.A.H.G.S.H.H.H.G.H.H.H.H.J.L.D.L.H.L.S.L.L.H.U.L.L.P.L.P.L.L.L.L.L.U.L.Y.L.L.P.L.H.Y.L.P.L.L.L.H.L.L.L.L.L.H.L.H.G.H.H.H.D.H.H.H.S.H.H.S.H.S.H.G.H.S.H.H.H.D.H.H.S.H.H.H.A.J.G.S.H.S.G.D.S.H.H.H.D.G.H.H.H.H.L.H.H.H.H.L.L.D.L.L.L.L.H.U.L.L.Y.L.L.Y.U.!.Y.T.T.T.T.T.T.Y.T.T.P.T.T.T.T.T.P.[.P.U.T.T.XXU.T.T.T.T.P.T.T.P.P.Y.P.Y.T.P.T.T.T.U.U.T./ S ~ CXFXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXSXZXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXSXDXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXAXFXFXFXFXAXAXDXDXSXZXBXQ.[ Q ~ [ G.G.H.H.S.S.D.S.S.G.G.H.S.H.G.H.H.G.A.H.G.G.A.h.A.l.l.l.h.h.z.g.f.g.f.g.g.g.g.g.j.f.l.k.h.h.h.h.h.A.h.A.h.z.j.G.h.h.h.x.h.h.h.z.h.z.h.h.k.z.l.l.h.h.l.l.l.l.z.h.A.l.A.A.A.A.A.A.H.S.A.H.S.l.S.A.A.S.S.S.H.H.H.Z.S.H.P.A.S.U.G.S.S.H.L.I.L.U.U.L.L.U.U.L.U.L.L.L.L.L.L.L.L.L.S.L.S.L.A.P.U.H.H.L.L.L.L.L.L.L.U.P.U.U.U.T.U.T.T.T.T.T.T.T.~.T.~.~.T.~.~.~.~.(./././././.(././.(.(.(.(.(._.(.{.(._.{.(._.(.`.^.(.(.(.(.(.(.(./.(.(.(.[.(./.(././././.).!./.(./.(.(.^.(.^.(./.(././././././.~././.~.~.~.~.~.(././.T.^.^./.^.(./.(.(.`.^.(.(.^.`.(._._._._._.|.|.|.|.|..X|..X.X.X.X.X.X'.zX.X.XdXdXzX",
+"L J U S J J P L J L J P P P J P P P I P P ( L P I I I I I ) P ) ) ) ) ) ) ) ) / I ) ) I I ) ) ) ) ) _ I ) I ) ) I _ U [ ) ) ) ( _ I ) _ ) ) ) I ) ) ) ) ) ) ) ) _ ) ) ) ) ) ) ) _ I ) ) _ ) ) ) ) ) ) ) ) ) ) I ) I ) ) ) I ) I I I I I I I P I P P P P P P P P P P P P P P P P J I J ) J J I J P P P P P P P P I P P I P I I P L P I P I P I I I I I ) I I I ` ) I Y I I I ) Y I I I I Y I I Y P P U I P L I U U I P U ( U L T T d.d.j.j.j.g.g.g.g.h.h.g.h.h.h.h.h.l.l.h.h.h.G.G.G.G.G.A.G.G.W.G.G.W.G.W.G.G.A.G.G.h.h.A.A.A.h.h.G.G.h.G.z.G.h.l.A.h.G.z.G.A.G.A.l.G.G.G.G.h.W.W.W.A.G.G.A.W.G.G.G.S.G.W.A.S.G.G.G.G.G.H.G.G.A.A.H.S.S.G.H.A.H.S.S.S.S.G.S.A.H.S.D.S.H.H.H.H.H.H.H.S.H.H.H.H.H.H.G.D.G.S.G.S.S.S.S.S.S.H.S.H.H.D.G.S.D.D.S.H.S.H.H.H.H.H.L.L.J.H.L.H.H.L.L.L.L.L.L.L.L.L.K.L.L.L.Y.Y.P.L.L.L.P.L.L.L.L.L.L.S.L.H.L.H.H.H.H.H.H.H.H.G.H.S.H.H.G.H.H.H.S.A.H.S.S.A.H.S.H.D.S.H.H.S.S.H.H.H.G.H.S.H.H.G.S.G.D.P.H.H.H.H.H.H.H.L.D.L.L.U.H.U.L.K.Y.L.Y.Y.L.U.U.L.P.Y.T.U.U.P.T.P.T.P.T.T.U.T.P.T.T.[.T.T.T.U.T.T.T.T.T.T.T.T.T.P.P.Y.P.T.T.T.T.P.P.T.T.T.U.~ / S ZXDXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXHXFXFXBXm.} Q ^ ` D.A.H.D.G.S.H.A.G.S.H.H.H.H.H.H.S.Z.G.G.A.A.A.A.h.A.l.l.z.h.g.g.g.g.g.g.f.g.f.g.k.l.k.h.h.h.l.h.h.h.h.g.h.A.x.A.h.h.h.h.h.h.j.h.z.h.h.k.h.l.l.l.h.h.l.h.z.A.A.A.l.A.A.A.H.A.A.G.A.A.S.S.S.S.S.S.S.S.S.S.S.A.H.G.D.H.D.L.H.H.H.H.H.H.H.H.S.H.L.L.Y.L.U.L.P.L.L.P.S.L.L.L.L.L.L.L.L.L.L.P.H.D.K.G.L.S.F.L.L.P.U.P.U.T.U.U.T.T.T.T.T.~.T.(.T.~.T.T.~.T.~.~.~.~.[.~./././.(./.(.(./._.(.(.(.(.(.^.^.^._.(._.(.(.(.(.(.(.!.(.^.(.(.!././././.~.[././.(./.~./.~././.^./.^./.~.(././.(././././././.~./.~.~.~.~.~.~./.(./././.[.(.(.(.(.(.(.`.(.^.`.{.{._.|.|._.|.|.|.|.|..X|..X|..X.X.X.X.X.XzXdX@X.X.X",
+"L H H P J P L Z J P J P P P P ) P L P I / I P I I I ( I ) P ) ) S ) J ) I ) ) P ) ) I I ) ) ) P I ) ) ) ) ) ) I _ I I ) _ I _ ) ) _ ) ) ) ) ) ) ) ) ) ) ) ) ) _ ) ) _ U ) ) ) ) ) _ ) _ ) ) ) _ ) ) ) I I ) I ) J ) I ) ) J I J ) I I I I P I P P P P I P I P P P P P P P P P P I J J I I J I I P P P P L P L P P J I L I P P J I I U ) I I I I I I I I I ` I Y I ` I ` I ) ) I ) I I ) I I I I I U ) I I I U I P U I U U I U T T Z.j.g.g.g.g.g.g.Z.g.g.h.h.h.l.h.h.A.h.G.h.A.A.A.G.G.W.S.W.J.J.W.J.J.H.G.J.J.G.W.G.G.G.h.G.G.G.G.h.h.A.h.x.h.G.A.A.z.h.G.h.G.G.A.W.A.W.G.G.G.W.W.G.W.W.J.J.W.W.J.J.G.H.G.J.G.G.G.G.H.H.H.G.J.S.W.G.H.H.A.H.H.S.G.H.G.H.S.A.H.A.H.H.S.S.D.H.H.H.H.H.H.H.H.H.H.A.S.G.S.A.A.S.S.G.S.G.G.A.A.H.G.S.S.D.S.G.S.H.S.D.H.A.H.H.H.L.H.H.H.L.H.L.L.H.L.H.L.L.L.H.L.H.L.L.H.L.L.H.P.P.P.L.L.L.L.L.L.L.L.H.H.H.H.H.H.H.G.H.H.S.H.D.H.A.H.S.H.H.H.S.S.A.S.S.G.S.S.S.D.S.D.A.S.A.A.G.A.D.S.G.A.D.G.H.G.H.G.D.H.H.H.H.L.H.H.L.D.L.S.H.D.U.H.H.L.L.L.L.Y.L.U.T.Y.P.U.U.T.P.P.Y.T.T.P.T.Y.T.Y.U.P.P.T.P.T.U.T.U.T.T.T.T.P.T.T.P.Y.P.T.P.T.T.T.T.T.T.T.U.S ! ! BXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXAXZXAXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXBXpX{ S ~ [ G.D.A.D.S.H.G.H.H.H.H.H.H.H.G.H.H.H.H.A.J.G.A.A.D.l.h.h.g.g.g.z.g.g.g.g.g.f.g.g.a.z.j.z.h.h.h.h.h.G.g.G.z.A.h.h.h.h.h.h.h.j.j.z.k.h.k.h.h.h.z.h.l.l.h.l.z.h.A.z.h.A.A.A.A.A.A.A.S.S.S.S.S.S.S.S.S.S.G.A.H.A.H.A.H.A.S.L.A.L.H.H.H.H.H.L.L.L.H.L.L.U.L.U.L.L.S.L.L.S.G.L.L.L.L.S.L.L.D.L.H.L.S.L.L.L.L.L.L.P.P.P.U.Y.T.Y.T.T.Y.T.T.T.~.~.~.~.~.~.~.~.~.~.[./././././././././.(.(.(.(.(.(.(.(.(.|.`.^.(._._.(.(.(.(.(.(.(.!.(.(.(.(././././././.[./././.^.(.(.(./././.[.^././././.(.~.(.T.(.T.~.~.R.~.~.~.~.~.~.~.~./.[.^.(.(.(.(.(.(.`.{.|._.|.`.|.{._.|._.}.|.|.|..X.X.X.X.X.X.X.X.X.XzXzX.XdXdX",
+"J J P H H H K U J J J P P J P P P P P P I I ) P I I I ) L ) ) L ) ) ) J P I I ) P P P ) P ) ) ) _ I ) ) ) I ) ) _ ) _ I _ _ I _ ) ) ) ) _ ) _ ) I _ ) ) ) ) ) ( _ _ ) ) ) ) ) ) ) ) ) I ) ) ) ) _ _ ) ) I ) ) I ) ) ) I ) ) I ) I I I I I I I I ( I I P P P P P I P P P P P P P I J I J I I I K P P I P I I I I U I L I I I I J I I I I I I I ) Y ` I ` I I I ` I ` I ` ` ` Y ` ` Y ` Y ` I I Y I U Y I Y ) I U U I U I U U ( T e.j.j.j.g.d.h.g.l.g.z.h.h.h.h.h.A.h.G.A.A.G.G.G.G.G.J.W.J.J.J.J.J.J.J.J.J.J.H.J.G.W.W.G.W.G.G.h.h.W.A.A.A.A.h.h.A.A.A.A.G.A.G.A.G.G.G.A.G.W.W.G.J.G.W.W.J.J.J.W.J.I.J.J.G.J.W.H.J.W.J.J.H.H.J.H.S.H.H.H.S.H.S.H.G.A.A.H.H.S.S.H.S.S.H.H.H.H.H.H.H.S.H.A.H.H.A.W.S.S.S.G.S.S.G.S.G.A.S.G.A.G.A.G.G.A.S.S.G.G.S.S.G.H.A.H.H.H.L.H.S.H.H.L.D.P.H.L.D.L.L.L.L.L.D.K.U.U.H.L.H.H.Y.H.L.L.L.L.H.H.L.S.H.S.H.H.H.H.Z.G.D.G.H.H.S.G.H.S.G.H.A.S.H.S.A.A.A.G.A.H.A.A.A.D.H.H.D.S.A.A.S.S.G.A.G.A.S.A.G.D.H.S.G.S.L.H.H.H.L.H.K.L.L.H.H.Y.K.H.L.Y.L.L.U.Y.U.T.P.U.T.P.T.P.T.U.T.T.T.U.T.T.Y.Y.T.T.P.T.T.T.T.T.T.T.T.P.P.T.T.T.T.T.T.T.T.T.T.T.T.T./ ! ! ZXZXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXZXBXm.[ ~ ^ [ S.H.L.S.S.S.S.D.H.H.H.H.L.H.H.H.H.H.H.H.S.A.G.A.h.h.h.h.h.z.z.h.g.g.f.g.f.g.g.f.j.h.k.f.h.h.h.l.h.z.g.z.A.h.h.z.h.h.h.h.h.f.h.h.k.h.h.k.h.h.l.l.l.A.l.l.l.A.h.h.A.A.A.A.A.A.H.S.A.A.S.S.S.S.S.G.S.S.A.J.H.H.A.H.S.D.S.S.D.S.H.S.H.H.H.H.H.H.L.L.L.S.L.D.L.L.P.L.U.L.L.L.S.L.L.L.L.L.L.S.S.S.L.L.L.L.L.L.L.P.L.P.U.T.T.Y.Y.Y.T.T.~.T.T.~.~.T.T.~.~.T.~.~.~.~././.(./.^./.{.(./.{.(.(.(.^.|.(.(.{.`.(._._._._._.(.!.(.(.(.(.(.!.(.[./.(././././.^././././.(.~.(.(././.E.(././././././.~.[.(.~.~.~./.T.~.~.~.~.~.~.~./.E.T.(.(.(.(.(.{.(.(.|.^.^.|._.|.|._.|.|._.|.|.|.|..X.X.X.X.X.X.X.X.X'..X.X'.",
+"K L P P H P H J J J J P P P P P P P P I J I ) P I I P ) ) P P ) I ) P I I ) P ( P ) P ) P ) ) ) ) ) ) ) ) ) ) ) U _ _ I ) U [ ) _ ) ) _ I ) ) ) ) ) ) ) ) I ) I ) P ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) J ) ) J ) ) J ) ) P ) I I ) P I I I I I P P P P I J I J P P P P I P L I P J P I I I I I Y I P I I I Y I I I I I I Y I I J I I I I I I I Y ) Y ` I ` ` ) ` I ` ` ` ` ` ` ` ` ` ` ` Y ` Y ` ) U ) ` Y Y I Y I I I I U Y T ) T Z.j.j.j.h.h.g.g.h.h.h.A.h.h.h.G.h.G.x.W.G.h.G.J.J.J.J.J.I.J.I.J.E.J.E.U.J.J.J.I.J.J.J.G.J.A.J.A.h.G.A.G.h.G.G.G.A.A.A.A.A.J.G.G.W.W.G.J.J.J.J.J.W.W.I.I.E.J.J.E.E.J.J.J.J.J.J.J.J.J.J.J.H.H.G.J.H.H.H.S.H.H.H.H.S.H.H.S.H.A.A.H.H.S.H.H.H.H.H.H.H.H.H.H.H.G.S.S.S.S.S.H.H.G.A.G.S.S.A.G.G.S.S.A.G.A.A.A.S.S.W.G.S.S.W.A.G.A.H.H.H.H.H.L.H.H.H.H.L.H.L.L.L.D.L.L.H.L.H.L.L.L.H.P.L.S.L.S.L.S.L.H.S.S.H.H.H.G.S.H.Z.S.H.h.A.S.S.S.A.S.A.A.A.G.S.h.A.D.A.A.A.D.D.A.A.A.A.A.S.D.A.A.S.A.l.G.G.G.G.A.S.S.G.H.H.H.H.H.D.L.H.P.L.H.U.H.S.L.L.K.L.U.L.U.P.Y.P.P.Y.P.P.Y.L.T.U.R.U.T.U.L.P.T.P.T.T.P.T.T.P.U.T.T.T.T.Y.P.T.U.T.T.T.T.T.T.U.U.T.T./ ~ S ZXDXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXZXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXAXBXm.} ^ ! [ H.S.S.H.S.H.H.H.H.H.H.S.L.H.L.L.H.H.H.H.G.G.H.A.h.A.A.g.h.k.z.g.g.g.k.g.g.f.g.j.g.g.h.h.l.l.l.l.h.z.z.H.l.h.z.l.l.l.h.z.k.k.l.z.h.k.h.l.z.h.h.h.l.h.A.l.g.A.G.h.A.A.A.A.G.G.A.A.A.G.A.S.S.G.S.D.S.G.S.S.S.S.G.S.S.S.S.H.G.H.H.H.H.H.S.L.L.G.L.G.H.L.L.S.H.L.L.H.L.L.L.S.L.S.L.L.L.L.A.L.S.L.L.S.S.U.L.L.L.U.U.U.T.U.T.U.T.T.Y.T.T./.T.T./.~.~.~././.~.!.~.~./././.(.(.(.(.(.(.{.(.(.{.(._.(.(.(.`.`.`.(.{._._.(.(.`.^.(.(.(.(./.(.(./././.(.~.(././.!./.(./.~.T././.~.(././.~.~./.~./.~.~.~.~.~.T.~.[.T.~.[.~.[./.~./././.(.^.(.(.|.{.{.|._._.|._.|.|._. X|._.'.|.|.|..X.X X.X|..X X.X.X'.dXdXdX",
+"U H H H L H P P J L J J P J P Y P ) / I I P P P I I ( P ) I I I I I ) I I I I I I ) ) I ) ) P ) I ) I ) ) ) ) ) ) I L ) ) I ) ( I _ ) ) _ ) ) ) ( ) I ) ) ) ) ) ) ) ( ) I ) ) ) _ ) ) ) P ) ) ) ) ) ) ) I ) ) J ) J ) I K ) I J P ) P ) P P I P P I P I J I I P P P P P J I I I I I Y I I I I I I I I I I I I I I I I I Y I I ` I ` Y ` I ` ` _ ` _ ` ) ` ` ` ` ` ` ` ` ` ` ` ` ` Y ` ` Y ` Y ` ` Y ` ` ` ` ) Y [ U Y Y I Y [ T e.j.j.h.h.h.Z.j.h.h.h.h.h.h.h.h.h.G.h.G.W.W.W.J.J.J.I.I.J.E.E.E.E.I.E.R.E.E.E.I.E.J.J.J.J.J.J.G.W.G.A.G.A.A.h.A.G.G.A.G.G.G.G.J.J.J.J.J.J.J.J.E.E.W.E.J.J.E.I.E.J.U.E.E.E.E.U.U.J.L.J.J.T.I.J.L.J.H.H.J.J.H.H.S.H.A.G.H.S.H.H.H.S.H.H.A.S.S.S.S.H.H.H.H.S.H.G.S.S.G.S.G.G.G.H.G.G.G.G.S.S.G.A.G.G.G.A.H.S.G.G.S.A.A.A.H.H.H.H.S.H.H.H.A.S.S.H.A.G.H.L.S.L.S.H.L.L.L.H.L.L.L.U.H.L.L.L.L.L.S.H.H.H.H.H.A.H.S.S.G.A.S.S.S.A.A.H.S.A.S.A.S.A.A.A.A.A.A.A.A.A.A.A.A.S.A.A.A.A.A.l.l.A.A.D.A.S.A.H.A.G.S.G.S.H.S.H.H.H.H.L.H.H.P.H.L.L.S.L.L.L.U.U.U.Y.L.P.Y.P.Y.P.P.U.U.I.H.T.H.T.U.P.P.P.P.P.T.T.P.U.T.T.T.T.T.T.P.U.T.T.T.T.T.T.T.T.T.U.T.~ / S ZXDXDXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXDXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXVXHXQ.[ / ^ ` H.H.H.H.H.D.H.S.H.S.U.S.H.S.A.L.H.L.H.H.H.G.A.A.h.A.A.h.h.l.g.g.h.g.g.g.z.f.g.f.g.g.k.f.h.h.l.l.h.l.z.l.l.h.z.l.h.h.h.z.h.l.h.z.z.z.l.k.l.l.h.h.l.l.l.l.h.A.h.h.Z.j.A.G.A.A.A.G.S.G.D.S.G.G.G.D.S.S.H.G.G.S.H.h.S.A.S.S.H.S.H.S.H.H.H.H.G.L.L.H.H.S.L.L.L.H.L.L.D.L.L.H.L.L.L.L.L.L.U.L.L.L.L.S.S.S.L.L.U.L.U.U.U.T.T.T.T.Y.T.T.~.T.T./.T.~.~.~.R.Y.~.~.~./././.(.(./.(./.(.{.(.(.{.(.(.(.(.(.|.(.(._._._._._._._.^.(.^.(.(.(.(.(.(.(./././.(.~././.~./.^.~.^./././.!.E.~././.~./././.~.~.~.~.~.~.~.~.~.~.T.!.T././././.(./.(.(.`.{._._.^.|.(.`.|.|._.|.|.|.'._.|.'..X X|..X|..X.X.X.X.X.X.X XdX",
+"H H H H P K K I J H P P P P P P P P P P I I I ) I I P I P P I I I I I I I I I I I I ) ) I I I ) ) ) P ) ) ) ) P I ) ) ) ) ) ) ) _ I ) I I ) ) ) ) I I ) I ) I ) ) ) ) ) ) ) ) ) I ) ) ) ) ( I ) J ) ) ) ) I I ) I ) I ) ) ) I ) ) P I I I I P I P P P J I J P P P P P I I I P I I I J I I I I Y I I Y I I I I Y I I I I ` I ` Y Y ` ) ) ` ` ` ` ` ` ` ` ` b.` ` ` ` v.` Y ` v.v.` ` v.` ` ` v.Y ` ` ` Y ` Y Y ` U ) Y I Y Y T b.h.h.h.h.h.h.h.h.h.h.h.h.G.h.h.G.G.G.G.G.J.J.J.J.W.I.W.E.E.E.E.E.E.E.E.E.E.E.E.I.E.E.J.J.J.J.J.J.H.G.G.G.W.A.G.G.G.G.G.G.H.J.J.J.J.J.E.J.I.J.E.I.E.E.E.E.E.E.E.E.E.E.E.E.E.I.E.U.I.I.U.J.J.J.L.I.J.J.J.J.H.H.G.H.H.H.W.A.H.H.H.A.H.S.H.H.S.S.S.H.H.H.G.S.G.H.S.H.G.H.G.H.H.G.H.H.G.H.A.W.S.W.G.H.A.A.H.G.W.A.S.G.A.G.G.A.A.S.A.J.S.H.S.S.A.G.G.W.S.L.S.S.H.L.S.J.H.L.D.H.L.D.J.L.L.S.L.H.L.H.Z.J.H.H.A.S.S.A.S.G.H.G.G.A.S.S.S.A.S.A.A.G.A.h.A.h.l.A.D.A.A.A.A.g.A.A.A.A.A.A.A.D.A.l.A.A.A.A.A.A.S.S.S.G.H.S.S.H.H.H.H.H.H.L.H.L.L.L.L.L.L.U.U.L.L.P.L.L.P.U.P.P.U.L.U.I.U.U.T.P.P.P.P.Y.P.T.P.T.T.T.L.Y.U.Y.U.T.T.U.T.T.T.T.T.T.T.T.Y.T./ S S BXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXAXDXDXBXm.{ ! Q ` H.H.H.H.L.S.S.S.S.H.S.L.S.U.L.D.H.L.H.H.G.A.A.A.A.h.h.h.h.l.h.g.h.z.k.g.g.f.k.k.k.h.h.k.l.h.h.z.l.S.l.l.l.l.h.l.h.h.h.h.g.z.h.g.h.h.h.h.h.z.A.h.l.h.h.h.h.l.h.A.h.G.h.A.G.A.G.G.D.H.H.A.H.S.H.D.S.S.S.S.S.S.S.H.S.S.S.S.S.H.H.H.H.H.H.H.H.H.H.H.H.Y.H.S.S.S.L.H.H.H.L.L.L.U.S.L.L.L.L.S.S.L.S.L.Y.L.L.L.L.U.P.Y.U.T.T.T.T.T.Y.T.T.~.T.~.~.T.~.~.~.T.(./.(.~./././.(.(.(.(./.^.(.(.{.|.^.(.(.|.(._._._._._._._._.`.`.`.^.(.(.(./.(././././././.[././.(./.^./.~.~.~.~.[.^.(.~.^.~.~.~.T.~.T.~.~.~.~.T.~.~.T.T.~.~.~././.(.(.(.(.(.^._.^._._.`.`.|.{._._.|.|.|.|.|. X'.|..X X.X.X.X.X.X.X.X.X.XzX@X",
+"K L J J H U L L J J J P P P P J P P P P P I P I I I ) P P ) P I I ) I I I I I I P ( P P ) I ) ) P ) ) ) P ) ) P I ) ) ) ) _ ) I ) I ) ) ) I ) I ) I ) ) P ) I ) ) ) ) P I ) ) P J ) ) ) ) ) I ) ) ) I I J ) I I ) I P P I I J I I I P I I P I I I P J I I P P P I P I P I I I ) I J ` I I I ` I I ` ) Y I ` I I ) ` Y ` I I ` ` ` ) ` ` ` ` ` ` ` ` ` v.` v.c.v.b.v.v.v.v.v.b.v.v.b.v.v.b.Y v.v.` v.[ ` ` ` ` ` [ Y [ U [ Y [ d.e.h.h.h.h.h.h.h.h.G.A.h.x.G.A.A.G.G.W.W.J.J.J.E.E.E.E.E.E.E.).E.E.E.).E.).E.).E.E.J.E.E.I.I.L.J.J.J.W.J.G.W.G.G.A.W.G.G.J.J.J.J.J.J.E.E.E.E.E.E.E.E.E.).E.E.).E.E.E.E.E.E.E.E.E.E.E.E.E.U.E.I.J.I.J.I.J.J.H.H.J.J.G.G.H.H.H.H.H.Z.H.H.A.S.J.H.H.G.H.H.H.H.H.H.J.G.G.H.H.H.J.G.H.W.W.S.W.S.G.W.H.W.W.S.G.A.S.G.A.A.G.A.A.G.H.A.A.S.A.S.H.G.A.A.G.H.S.H.S.H.H.S.H.H.H.L.H.L.H.L.H.L.H.L.H.S.L.H.H.H.S.H.A.S.A.A.A.A.A.S.A.S.A.A.A.A.S.A.A.A.A.A.A.A.A.l.g.A.l.A.A.l.A.l.l.A.A.A.A.l.G.l.G.A.G.A.A.A.G.A.S.S.H.H.H.L.H.L.H.H.H.L.H.L.H.H.L.L.H.L.L.L.P.L.P.U.P.P.L.U.L.I.L.U.U.L.U.T.P.T.T.T.P.T.U.Y.Y.U.U.P.P.T.U.U.T.U.U.T.U.U.T.T.T.T.T.S / / ZXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXCXHXQ.[ Q ^ [ H.H.H.H.S.S.L.L.H.H.H.S.D.L.D.A.H.H.H.H.H.H.G.G.A.A.A.A.h.z.z.z.g.h.a.g.g.f.g.f.g.k.k.h.g.l.l.l.h.z.l.l.h.A.D.g.h.h.l.k.k.l.l.h.h.h.h.l.l.A.g.A.h.h.h.A.A.A.A.h.A.h.A.A.A.A.G.A.D.H.H.G.H.D.A.G.S.H.G.S.S.S.S.A.A.S.S.S.S.H.S.H.H.H.H.H.H.G.H.H.H.h.U.S.S.L.L.H.D.L.H.L.L.S.L.L.S.L.L.L.L.L.L.L.L.L.L.L.L.U.P.Y.T.U.T.T.T.Y.T.~.T.T.~.T.~.~.~.~././.~.~.~.^././.(./.(.(.{.^.(.{.(.(.(.(.(.(._._.|._._._._._._._.(.(.`.(.(.(.(.(./.(.^././././././././././.~.~.~.~.~.~.T.~.T.~.~.T.T.~.~.~.~.~.T.T.T.T.~.~.[.~.~./.~././.!.(.(.(.`.(.{._.^.`._.^._.|._.|.|.'.'.|.|. X.X|.|.|. X.X.X.X.X.X.X.X.X.X",
+"H L J J H H H H P L P P P P P I P / U ) P ) ) I I I I I P / P I ) P P ) I P ) P ) P ) P I I ) ) ) I ) ) ) I ) ) ) I ) ) ) I ) I ) ) I ) ) I ) ) ) I ) I I I I ) I I I ) ) ) I I ) ) ) ) ) ) I I ) ) J ) I I I ) ) I ) I J I I I I I I I I P I I P I P P I P P I P I I Y ) I ) I ` I I Y ] I ` I ` ` Y ` ) ` ` ` ` ` Y ` ` ) Y ` ` ` ` ` c.` ` c.c.v.c.c.c.b.v.c.c.c.v.v.n.v.v.v.c.c.v.v.b.v.v.v.v.v.` ` v.` ` ` ` Y Y ` Y Y [ g.j.h.h.h.h.h.h.h.h.h.G.h.h.G.A.G.J.J.J.J.J.J.U.E.E.E.).E.E.).).).).).).).&X).).).E.E.E.E.E.E.I.J.I.J.J.J.H.J.J.J.W.W.W.J.W.E.J.I.R.E.E.E.E.).).E.&X&X&XE.).).&X&X).).).E.).).E.E.E.E.E.E.E.E.T.U.U.J.U.J.L.J.L.H.H.J.S.H.H.H.H.A.G.G.H.H.H.H.H.H.H.H.J.D.H.H.H.H.H.J.H.L.H.J.J.J.J.J.I.J.J.J.J.A.J.W.W.H.A.H.A.S.G.G.A.G.A.A.A.H.A.H.G.G.h.A.G.A.A.H.G.S.S.H.H.G.D.H.H.L.L.L.H.L.H.L.H.H.H.H.H.A.H.A.S.S.G.S.A.S.A.S.A.A.A.S.A.S.h.A.l.D.A.h.S.h.g.A.A.A.g.A.A.A.A.A.l.l.A.g.l.g.z.A.A.h.A.A.A.h.A.G.A.G.A.G.S.S.D.G.G.H.H.H.H.H.H.L.L.U.H.L.H.U.L.P.L.L.L.L.L.L.U.K.L.L.L.L.T.U.P.P.P.P.P.P.U.P.L.U.L.P.L.U.U.U.U.T.T.U.T.P.T.U.T.U.Y.Y./ / / ZXDXGXVXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXZXBXm.} ! ~ [ L.L.D.U.L.L.L.S.S.S.S.S.Y.L.L.L.H.H.H.H.S.S.H.A.A.A.l.A.h.l.z.g.h.k.f.f.h.f.h.z.h.h.k.k.h.h.l.l.h.z.h.z.l.l.l.l.h.h.h.h.A.k.g.A.h.l.l.h.A.A.l.h.G.l.l.S.h.h.A.h.A.g.h.W.A.A.G.G.A.H.H.H.J.D.D.D.S.L.A.H.H.S.S.A.S.S.S.S.S.L.H.H.G.H.H.H.H.H.H.A.H.H.H.H.L.L.H.L.S.D.S.L.L.L.L.S.L.L.S.L.L.L.L.L.L.L.L.L.L.Y.U.P.U.T.T.T.T.Y.~.T.T.T.~.~.T.~.~.~.~.~.~././././././.(.(.(.(.{.^.(.(.(.(.(.{.^.(.|.`.(._._._._._._.`.`.^.`.^.^.(.(.(./.(.T.{.(.{./././.^.~.~.~.~.~.[.T.~.~.T.~.T.~.~.T.~.~.T./.T./.~.T.~.T.T.~.~.(./././.(.(./.(.^.{.`.^._._.(.|.[._.}. X}.|.|.'.|..X X|..X|. X.X.X|..X@X.X X.X.XdX",
+"L L H J H J L I J P J P P J P P P P P P P P P L I I I I ) P I I P I P P I P ) P P I I ) P ) I P ) P I I I ) ) I I ) I I ) P ) ) ) ) ) I I ) I I I I I ) I ) I P I I P P P I ) ) I ) J I J ) ) I J ) ) J I I I I J I J ) I I I I I P I P I P P P P I P P I P P I P I I ) I ) Y ) I ` ` ` ` ` I ` I ` ` ` ` Y ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` c.c.c.c.` c.v.c.c.n.c.n.c.n.v.N.c.N.v.n.c.v.b.v.v.v.v.b.v.v.b.` v.b.Y [ v.[ Y [ Y [ j.h.h.Z.h.h.h.h.h.h.G.h.G.G.A.W.W.J.J.J.J.E.E.E.E.E.).).).+X).+X+X+X+X+X+X+X&X&X).).).).E.E.E.E.E.J.E.J.J.J.J.J.J.J.J.J.J.I.W.E.E.E.E.E.).&X&X).&X&X&X+X+X+X+X+X&X+X&X+X&X&X&X&X).{.).E.E.E.E.E.E.E.J.U.U.U.J.L.J.J.H.H.L.H.H.H.H.H.J.S.S.H.G.D.J.J.H.H.H.H.J.H.J.J.H.J.J.J.K.J.J.J.K.J.J.I.G.J.J.H.J.H.J.G.H.G.J.G.G.A.G.A.W.A.J.A.A.A.A.A.A.h.W.H.A.A.A.G.S.S.S.H.H.H.H.H.H.H.H.L.H.H.H.D.H.H.S.H.H.A.S.A.A.G.A.A.A.G.A.A.D.A.A.S.A.h.l.l.A.A.h.A.g.A.l.A.l.l.g.l.l.l.A.A.A.A.g.l.A.A.A.A.A.A.A.A.G.A.A.G.A.S.G.D.G.S.H.H.H.H.H.H.H.L.H.L.L.H.L.H.P.L.P.L.L.L.L.L.U.J.U.U.T.U.L.L.P.P.P.P.P.U.U.U.U.K.L.L.Y.L.U.U.L.U.U.Y.P.T.T.T.T.Y.P.S ! S BXZXZXVXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXHXHXQ.[ ! ~ [ S.H.L.L.L.A.S.L.L.U.L.S.L.A.A.L.L.H.H.H.S.S.A.G.A.A.l.A.g.z.l.g.g.a.h.f.f.h.f.h.h.k.l.k.h.h.l.h.h.S.g.A.l.l.l.l.h.h.h.h.g.l.h.g.l.h.h.A.A.l.A.A.h.l.h.z.A.h.h.A.A.A.A.A.A.G.h.A.G.G.H.S.A.D.G.P.S.S.D.D.S.G.S.S.H.H.S.H.L.h.H.H.H.H.G.H.G.H.H.L.H.H.H.H.H.H.H.H.U.Z.L.L.S.L.L.L.S.L.Y.L.L.L.L.U.U.L.L.U.L.U.U.U.T.T.T.T.T.T.T.T.T.~.~.T.~.~.T.~././.!././././.(./.(.(.{.(./.(.{./.(.(.(.^.|.^._.(._._._.|._._._.|.(._._.(.`.`.(.{.(./.(.^.~./.(././.~.~.~.!.~.T.~.~.~.~.T.~.~.~.T.T.T.~./.T.~.T.T.~.T.[.~.~.T.^.~.~././.(.(.(.(.(.(.(.|.{._.|.}.}.}.}.}.|..X|..X|.|. X|..X|..X|..X.X X.X.XdX.X.X",
+"H G J H H Y H P J J H P P P P P P P P P ) P I ) P ) L ( ) P P P ) P P P ) P P P P ) P P ) P ) ) I ) ) ( I I I ) I ) I I I ) ) ) ) I ) I ) I ) I I I ) I I I I ) I ) ) ) ) I P P J I J ) ) J ) ) ) J ) J ) I ) I I I I J J I I I P I I I P P P P P I ) P I I I I I I ) I I I Y ) ` ` Y ` ` Y ` ` ` ` ` ` ` ` ` ` ` ` v.` v.[ v.[ ` c.c.v.c.c.c.c.n.c.c.c.N.v.N.v.N.v.N.N.N.v.N.n.N.N.v.n.N.v.n.v.v.v.v.b.b.v.v.v.v.` ` ` v.Y e.Z.h.W.h.h.W.G.h.W.W.x.G.G.G.G.J.J.J.J.E.U.E.E.E.&X).&X&X+X+X+X#X+X+X+X+X+X+X+X+X+X+X).).E.).E.E.E.E.J.E.I.L.W.J.J.E.J.E.J.E.E.E.E.E.).).).&X&X+X).+X+X+X+X+X+X$X+X+X+X+X+X+X+X{.&X+X).).).E.).E.E.E.T.E.I.U.I.I.J.J.J.L.J.J.D.H.G.H.S.J.H.H.L.D.H.H.H.L.H.L.L.J.J.L.J.L.J.I.J.I.I.U.I.J.I.I.J.I.J.J.J.J.J.W.J.H.Z.G.G.A.A.A.G.h.G.G.A.A.A.A.A.A.A.A.A.G.A.S.Z.J.H.H.G.H.H.H.H.H.K.G.H.H.Z.S.H.H.H.H.A.Z.h.A.A.A.A.A.A.A.A.A.l.A.A.l.A.l.l.A.A.A.l.l.A.l.l.g.A.l.A.h.l.l.l.g.g.A.h.l.l.l.z.h.S.A.h.A.l.A.A.S.S.S.S.S.S.H.H.H.G.H.H.H.H.L.H.H.L.L.J.H.P.H.H.L.L.U.L.L.L.L.H.U.L.G.U.P.L.L.P.P.P.L.P.L.L.L.L.U.L.L.Y.L.U.L.L.P.P.T.U.Y.P.~.~./ / S CXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBXm.} Q ! ` U.U.P.D.L.L.S.L.U.L.L.L.L.L.L.L.S.H.H.H.H.S.A.A.A.A.g.h.l.l.z.k.g.h.f.j.k.f.l.h.h.z.k.l.h.h.l.l.h.z.h.h.l.l.h.l.h.h.g.l.l.h.l.l.l.l.g.S.h.A.g.h.G.g.S.A.A.A.h.h.A.h.A.A.A.A.A.A.D.G.D.G.P.D.H.D.H.D.H.H.H.G.G.A.A.H.G.S.H.S.S.H.G.H.H.A.A.H.H.S.G.G.H.H.H.H.D.H.S.L.L.L.U.A.L.D.S.L.L.L.L.L.U.L.L.L.U.L.U.T.U.I.L.Y.T.T.T.T.T.~.T.T.~.T.~.~.~.~.~.~./././.^./.(.(.(.(././.(./.(.^./.(.(.(.(.(.`._._._._. X_.|._._._._._.`.(.(.^.^.(.(.(.^./.(././.!./.~.~.R.~.~.T.~.T.T.~.~.T.T.T.~.T.T.T.T././.T.~.~.~.~.[.[././././././.(.(.(.(._.^.|.}._.}.}. X}. X|.|.|.'. X'.|. X'.'.|.|. X.X.X.X.X.XdX.XdX",
+"J K H J H K P J P P P P Y P P P P P ) P ) P L ) P I I I P P ) ) P P ) P J P P ) I P ) ) I P I I P I I P ( I I I ) I ( I I I ) I ) I P ) I ) ) I ) I ) I I I I ) I I I I I I I ( ) I I ) J ) J I I ) J ) I I K ) J I I I I I I I I I P P I P P I I P I I I I I ) ) I ` I ` ` ` ` ` ` ` ` ` v.` v.v.` v.` c.v.b.` v.` ` v.` c.v.` c.c.` n.n.c.n.c.c.N.n.N.n.N.N.N.N.N.N.N.N.N.N.N.N.N.N.C.N.N.N.n.N.n.N.v.v.v.b.b.v.b.b.c.T b.b.Z.h.W.A.G.h.h.A.A.h.h.W.G.G.J.J.J.J.E.E.E.).&X).).+X+X+X$XB.lXjXjXrXrXOX0.C.OXOX+X+X+X+X+X).).).E.E.I.E.E.I.E.E.J.I.J.E.E.E.E.E.).).&X).+X+X+X#X#X$XB.$XB.$XB.B.+X+X@X+X#X#X+X#X#X+X&X).+X).{.).E.E.E.E.U.E.E.I.L.U.L.K.J.H.J.S.G.H.L.L.S.J.H.H.H.K.J.J.L.J.L.L.I.L.I.I.E.I.E.E.U.R.E.E.I.E.I.I.E.L.I.I.J.J.L.J.J.A.W.A.W.G.W.H.l.A.A.A.G.A.Z.A.A.A.A.h.A.A.G.S.H.G.G.G.H.G.H.H.S.H.S.H.H.S.L.A.A.A.H.H.H.A.S.G.A.A.A.A.A.A.A.h.l.A.h.A.l.l.l.l.l.k.A.l.l.A.l.g.A.g.z.A.g.l.h.l.l.h.l.l.l.h.h.h.A.l.G.l.D.A.A.G.S.A.S.A.G.S.G.H.H.D.L.H.L.H.L.D.P.L.P.Y.P.L.L.L.U.H.L.U.U.P.U.U.L.P.L.P.P.H.L.L.L.L.U.L.L.L.K.L.U.Y.U.U.Y.L.P.U.U.U.Y.P.Y.S / ! ZXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXVXDXZXBXm.[ ^ ! ` L.A.L.L.L.L.L.L.S.L.S.U.L.D.D.L.H.H.H.A.S.S.A.H.A.A.A.h.l.l.g.g.j.g.k.g.g.h.h.k.l.l.h.z.l.l.h.h.h.h.h.A.l.l.l.l.h.l.A.g.l.l.h.h.h.h.g.h.A.h.A.g.A.A.g.A.h.A.A.Z.A.A.A.A.G.A.G.A.D.D.G.D.H.D.D.L.G.A.L.G.G.H.G.H.A.H.S.S.S.S.H.H.H.H.H.H.H.A.S.G.H.G.H.H.H.H.H.S.F.L.S.L.L.L.L.L.L.L.L.L.L.L.L.L.U.U.U.Y.U.I.Y.I.I.T.T.T.T.T.T.~.T./.T.~.~.T.~.~.~./././././.(././.{./.(.^./.(.).(.(.(.(.(.(.(.`._._._._._._. X_._.|.|.^._.^.(.{.(.(.(.(.(././././././.~.~.~.T.~.T.~.T.^.T.T.T.T.T.T.T.~.T.T.T.T.T.T.[.T.~.~.~.~./.~./.(.(.(.(.(.(.(.(.^._._.}.|.|.}.|.}.|. X|.|.|..X|..X|..X|. X'..X.X.X.X'..X.X",
+"J H H J J J H L P P J J J J L P P P I P P ( I P I P P ) P I P ) I P I P P I P I P P ) P I ) ( ) ) J I ) P I I I ) I ) ) ) ) P ) P ) ) P ) P ) P I I I I I I P I I I P I J ) J I ) J J ) ) I I ) ) I I I P I I I I I I I P I I I I J P P I P I I I I I I I ) ) ) I ) ` ` ` ` ` ` ` ` b.c.v.b.v.v.v.c.v.v.v.v.v.v.v.v.v.v.c.v.v.n.v.n.v.n.N.v.v.n.n.N.N.n.n.N.N.N.V.V.V.V.V.V.V.V.V.V.N.V.V.N.n.C.N.n.n.n.n.n.v.v.v.v.e.v.v.n.Z.Z.Z.A.A.G.h.W.A.G.G.A.W.G.J.J.J.J.E.E.E.).).&X+X+X$XlXkXkXjXkXjXjXrXrXrX0.0.7.6.6.7.&X+X+X+X+X&X&X).).E.E.E.R.R.E.E.R.E.E.E.&X).).+X+XlXB.lXjXjXjXjXrXjXjXrXrXrXrX0.0.0.OXOXOXOX+X+X$X+X+X&X&X&X).).E.E.XXE.U.R.U.U.J.I.J.L.L.H.K.J.H.L.H.H.J.J.J.I.J.J.J.I.J.U.E.T.U.U.E.T.E.E.E.E.T.E.E.E.R./.E.U.E.I.I.I.J.G.G.W.G.J.G.A.W.G.G.A.G.l.G.A.J.h.h.A.A.G.G.h.H.A.A.L.H.S.S.H.H.H.H.H.H.H.J.S.S.G.A.H.A.A.A.W.G.A.A.A.A.A.A.h.h.h.S.l.A.l.z.A.l.l.A.z.l.l.l.l.l.g.l.g.A.l.g.g.g.g.g.h.h.h.h.h.A.g.A.A.g.A.A.A.A.Z.D.G.S.S.A.A.H.S.H.H.H.H.H.L.H.H.H.U.L.J.L.L.L.L.L.L.J.L.L.L.U.U.L.L.H.L.U.L.L.L.L.U.L.L.L.L.U.L.L.L.U.L.L.I.U.L.T.Y.P.U.T.S / / CXFXFXAXFXFXFXFXFXAXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXGXSXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXSXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXDXAXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXGXZXDXDXBXpX[ ~ ~ ` L.P.L.L.H.P.D.U.L.L.L.S.H.L.L.H.L.G.H.A.S.G.A.S.A.A.S.h.h.h.z.k.g.f.g.z.k.h.k.h.h.h.l.h.l.h.h.h.h.h.z.G.l.h.l.l.z.h.h.h.h.z.A.h.A.h.A.h.A.A.g.A.g.A.j.A.j.h.G.A.h.A.A.A.h.A.A.A.S.S.H.S.H.H.L.G.H.G.H.H.H.H.H.G.S.S.S.S.S.G.S.H.S.S.S.H.S.S.A.G.H.D.H.H.G.H.H.S.L.H.H.L.S.L.L.L.D.P.P.P.L.P.P.P.L.P.P.P.U.P.P.P.T.T.Y.T.T.T.T.T.~.~.~.~./.~.~./././././.[./.(.(.(.(.(.{.{.(.(.^./.(.(.^._.(.(._._._._._.}.}.}.|.|._.|._.|.(.(.(.(.(.(.(./.(.(./.(./.T./.T.~.~.~.T.T.T.~.T.T.T.~.~.Y.~.T.~.T.T.T.~.~.~.T.^.~.(./.~.(.E.(.^.(.(.(.(.(.`.(.}._.}.}.}.}.}.|.|.|.|.|. X|.|._.|.|.|. X|..X X|..X.X'..X",
+"J H J J L J J J P L K Y P P I I P I I I P I I I I I J ) ) P I J I I I I P I ) P P P P P I J ) J I ) I ) P ) ) I I P P P P P I ) ) I ) I P ) P ) I ) I I ) I I P P I P P I I I I ) J P P P I P P I I P I P P P P K I I P I P K I I I P P P P P Y I I I I ) Y Y ) ` I ` ` ` ` ` v.` v.v.c.v.c.c.v.c.v.b.v.v.b.n.v.c.b.v.v.c.n.v.v.v.v.N.v.n.N.N.n.N.N.N.V.V.V.V.V.V.V.V.C.V.V.V.V.V.V.V.V.V.V.V.V.C.V.n.C.n.n.N.n.v.n.v.v.b.e.n.W.G.G.W.A.G.A.A.W.G.W.W.J.J.J.E.E.E.E.E.).&X+XbXJXUXkXkXjXjXjXjXrXrXrX0.0.7.7.7.6.3.%.q.B.+X&X&X+X&XE.).E.).E.E.E.E.E.E.).E.&X+XJXkXkXkXkXjXjXjXjXjXjX0.rXjX0.rX0.0.0.0.0.0.7.7.7.7.OX&X%X@X+X&X+X).).).E.E.E.E.T.E.U.J.L.J.H.J.H.H.J.G.H.L.L.L.J.J.I.U.U.U.E.I.U.E.E.E.(.E.E.E.(.(.E.).).E.E.E.E.E.E.E.U.E.I.J.E.J.J.G.J.J.A.A.G.A.G.G.h.l.h.A.G.A.l.A.h.G.H.H.H.H.S.J.A.L.S.H.H.G.H.H.G.S.H.H.A.A.H.A.S.A.A.A.Z.A.A.S.h.h.A.A.h.l.l.A.l.l.l.A.l.g.g.l.l.A.g.l.g.A.z.g.g.A.g.g.g.g.g.g.h.Z.g.g.A.A.D.g.D.A.A.A.l.A.A.G.S.H.S.S.G.H.H.H.J.H.H.U.H.L.L.L.U.L.L.L.L.H.K.L.L.L.L.L.U.L.Y.L.P.L.L.H.L.H.L.H.L.L.L.L.L.U.L.L.Y.K.U.U.U.P.U.Y.T.! / S CXGXFXFXFXFXFXFXFXDXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXZXDXDXBXQ.{ ~ ~ [ L.H.L.L.L.P.P.L.L.L.L.L.H.L.H.H.A.G.S.H.S.H.S.z.A.S.z.A.h.h.h.k.g.j.g.d.k.k.z.k.h.h.h.h.l.l.h.h.h.h.h.g.l.l.l.h.h.h.h.h.l.S.h.h.A.h.h.A.A.h.S.A.G.A.A.A.Z.A.h.A.A.A.A.A.A.A.h.W.S.S.H.H.H.H.H.H.S.L.G.L.H.G.S.S.G.S.S.D.S.S.A.H.L.S.S.S.S.S.H.D.G.D.H.G.H.H.H.H.H.H.L.L.L.L.S.L.L.L.P.L.L.L.P.P.P.P.P.H.P.T.P.T.T.P.U.T.T.T.T.T.~.T.~.T.T./.~././.~.^./.(././.(././.^././.(.(.^.(.(.(.`.{.(.(._.{.^.}.}.}.}.}.|.|.|._._.`.(.`.(.(.{.(./.(.(././.E.(./.Y.(.~.~.T.~.~.T.T.T.T.T.T.I.~.Y.~.T.T.~.~.~.T.^.~.~.~././.(.~.^.[.(.(.(.^.(.(.^.`.}.}.}.}. X}.|.'.|.|.|.`.|.|.{. X|.|..X|.'..X.X.X.X.XdX X",
+"K J H L L H H I J P P P P I J I J P J I ) P P I I P P P ) P P P I I I I ) P P P P ) ) P P I J ) P ) P ) I P P ) I ) P P ) ( P J P I P ) I ) ) I ) J I I I P I ) I I I I I I P I P I P ) ) J ) P I I I I I P I I P P P P P I I P J I P I I P I I I Y I I ) Y ` ) ` ` ` ` v.` v.c.c.c.c.c.c.c.v.v.c.n.v.n.c.n.v.v.c.n.v.N.N.c.n.v.N.N.N.N.N.C.N.V.C.V.V.V.V.V.V.B.V.V.B.aXB.B.OXOXB.V.OXOXV.V.V.K.V.V.V.V.n.C.N.N.n.N.v.n.e.n.W.W.W.W.W.G.W.W.G.G.J.J.J.J.J.E.E.E.E.).&X+X+XlXUXkXkXkXkXkXjXjXrXrX0.0.0.0.0.7.6.6.3.%.%.*.C.+X@X).+X).).).).).E.).E.).).).&XJXUXUXUXkXkXkXjXrXjXjX0.jX0.0.0.0.rX0.0.0.0.0.0.7.7.7.6.6.6.7.OX+X+X+X&X+X+X).E.E.E.E.I.E.L.I.I.J.L.J.H.U.L.J.L.I.U.I.U.I.I.I.U.E.E.R.E.E.E.E.{.).).).).).).).).).).).E.E.E.E.E.E.U.J.L.J.J.J.G.A.G.G.A.G.l.A.A.l.G.h.A.A.A.A.A.G.J.G.H.G.J.H.H.H.H.L.H.G.H.S.S.H.H.G.G.G.H.H.A.A.A.A.A.h.S.A.A.h.h.A.h.h.h.h.h.l.l.h.A.l.l.l.A.g.l.z.d.g.g.Z.g.d.g.g.g.g.g.k.l.g.A.A.k.A.l.l.A.A.A.A.S.A.G.A.S.A.H.G.S.J.H.S.H.L.H.H.H.U.H.H.P.H.D.L.K.L.H.L.L.J.U.L.P.L.L.L.L.L.L.L.L.G.L.D.H.D.U.U.U.U.U.L.L.L.U.I.T.U.T.U.S / ! CXZXZXFXFXFXFXFXFXAXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXDXFXFXFXFXFXFXDXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXZXBXQ.[ / ~ ` U.U.D.L.L.L.L.L.D.L.L.L.L.L.H.H.H.H.A.H.S.S.S.G.A.A.z.h.h.h.k.z.f.g.g.g.k.h.h.h.h.h.h.h.h.z.h.h.h.h.g.h.h.l.h.h.l.l.l.h.h.h.l.l.h.h.A.h.h.A.A.j.A.A.A.j.A.A.A.A.A.h.A.A.H.h.A.J.A.G.H.G.H.H.H.L.L.G.L.G.L.H.D.H.S.A.G.D.G.G.H.D.S.S.S.S.A.S.H.D.H.H.G.G.H.G.H.H.L.H.L.L.L.S.L.L.L.P.P.P.L.L.L.P.P.U.P.P.P.P.P.T.P.T.P.U.P.T.T.^.~.~.T.~./.~.~./.~./.~././.(./.(.(.(./.(.(./.(./.(.(.(.(.^.(.(._.}._.}.}.}.}._. X|.|._.|.|.^.(._.(.(.^.(././././.~.~.~.~.T./.T.~.T.T.~.T.T.K.T.T.~.T.T.T.T.T.T.T.T.~.~.~.~.~.~./.(.(./.(.^.^.(.`.(.(.(.`.}._.}.|.}.}.}.}.|._.|._.|. X|.|.|.|. X'.|..X|..X.X.XdX.X",
+"Z H H H L H J H I K J L P J P I J P ) I P P ) I P ) ) P J P ) P I ) P I P P P ) P P I P P P ) I P P P P ) P ) S P P ) P I I P ) I I I I I P P I I I P I J ) J P I P P P J I I J I J ) J P I I I I I I I I I I I I I I ) P I I I I P I I P I I I I I ) ) ` ) ` ` ` ` ` v.` b.c.c.c.c.v.c.n.N.n.n.N.N.N.v.N.N.N.n.N.N.n.n.N.N.n.n.N.N.n.N.V.N.V.V.V.V.V.B.B.OXlXjXjXjXjXjXrXrXjXrXjX0.0.0.0.0.0.0.OXC.V.V.V.V.V.F.N.n.n.n.n.n.W.W.J.W.J.W.W.G.G.J.J.J.J.J.E.E.E.E.).&X+X#XUXUXUXkXkXkXjXjXrXrXrXrX0.0.7.7.7.6.7.6.6.%.%.*.$.6.+X+X+X+X'.).).).).).).).).).&XlXkXUXUXkXkXjXjXOXjX0.jX0.0.0.0.0.0.0.7.0.0.7.7.7.7.7.7.6.6.3.3.6.C.#X+X+X).&X).).E.E.E.I.E.I.I.J.I.J.I.H.L.L.J.J.J.I.I.U.I.E.U.E.E.).E.(.).).).).).).).+X{.+X).).).).).).).E.E.E.E.U.E.J.I.J.G.J.G.J.G.G.G.A.G.A.h.G.h.G.A.A.J.A.H.Z.H.G.S.H.L.H.H.J.G.H.H.S.G.G.H.H.G.A.G.A.A.A.A.A.G.A.h.h.l.A.A.h.A.h.A.h.l.h.h.l.g.g.l.l.g.l.i.A.l.g.g.g.g.g.g.g.g.a.k.z.k.l.j.l.A.k.A.l.l.l.A.A.A.A.A.D.A.G.S.S.D.H.H.H.H.L.L.H.H.L.K.H.L.L.L.L.H.L.L.L.K.L.L.U.P.L.L.U.U.D.L.L.L.L.L.L.T.P.P.P.L.U.L.Y.L.T.U.U.U.T.U.T.S / S CXZXZXAXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXAXDXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBXpX' Q ~ ` P.U.L.L.L.L.D.P.L.L.L.G.L.L.L.H.H.H.H.H.G.S.S.S.A.A.S.l.l.h.l.h.g.g.g.g.g.k.g.g.h.l.h.h.h.z.h.k.h.h.h.h.h.l.l.h.l.h.h.h.h.A.z.S.h.A.A.A.A.A.A.A.A.A.z.S.A.A.A.A.A.G.G.A.A.A.A.G.H.D.H.H.H.H.H.H.G.G.L.L.H.H.H.D.S.H.G.G.S.G.D.H.S.S.H.D.P.D.D.G.D.D.A.H.H.H.H.H.H.L.H.S.H.L.L.P.L.P.L.P.P.L.P.L.P.U.S.U.P.P.P.P.P.T.T.U.Y.T.T.P.~.T.~.~.~.~./.~.~.~./.~./././.(.(./.(./.(.(.[.(.(.(.(.(.(.(.(._.}._.}.}.}.}.|.|.|._._.|._.).(.`.{.(.(././.(.[./.~.~./.(.R.R.!.T.~.T.K.T.T.~.T.~.T.T.T.T.T.~.T.T.~.T.T.~.~.~./././././.(.^.(.(.(.(.[._.(._._.{._.}.}.}. X|.|.|._._.|.|.|.|. X.X|. X|..X.X.X.X.X.X",
+"H H H J L H H P I J H P J Y P P P ) I P I I I I ) P ) P P ! P P I I I P I P J J / I I I P P I P P ) P P P P I P P I I ) I I I J I I ) I I I P ) ) I I I I ) I J P I P P P P P P P P P I I I I I I I I I I I I I I I I I I I Y P I I I J I ) I I I ) ) ` Y ` ` ` ` ` v.c.c.n.v.c.N.b.n.N.n.N.N.n.n.N.n.N.n.N.n.N.N.C.n.N.n.V.n.C.N.N.V.V.V.V.V.V.B.OXlXjXlXjXjXkXlXjXjXjXjXrXrXrX0.rX0.0.0.7.0.7.6.7.7.7.V.V.V.V.V.n.n.n.C.K.K.E.I.I.J.J.J.J.J.I.J.I.E.I.E.E.).).+X&X+XUXUXUXUXlXkXjXrX0.0.0.0.7.7.7.7.6.6.6.6.6.3.3.%.#.#.$.q.&X+X+X+X+X+X).).+X+X).&X+X+XJXUXUXUXkXjXjXrX0.0.0.0.0.0.0.7.0.7.0.7.7.7.7.7.7.7.7.7.6.6.%.3.3.%.q.B.%X&X&X).E.E.).E.I.E.U.J.I.I.J.I.I.J.L.I.I.E.I.E.I.E.E.E.(.E.).).).{.).&X+X+X+X+X+X+X+X+X&X+X+X+X{.).).).E.E.E.I.I.E.J.J.J.J.G.G.G.A.G.h.G.h.h.W.G.A.G.A.S.W.J.W.S.L.H.J.L.J.H.L.H.H.J.H.J.S.S.S.G.A.A.G.A.G.G.A.A.A.A.h.Z.h.h.A.h.h.z.g.h.h.h.g.l.g.g.Z.k.g.g.d.g.g.g.d.E l.z.z.g.k.z.k.h.h.l.A.g.k.A.l.A.A.l.A.A.A.A.S.A.G.H.H.H.L.S.H.J.D.L.P.H.L.H.H.L.L.H.L.H.L.L.L.L.U.U.L.U.Y.L.L.L.H.L.L.L.L.U.L.U.P.P.U.L.L.U.U.Y.U.U.P.P.P.P.~ ~ ~ CXDXDXAXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXBXm.[ ~ ^ [ D.P.P.H.L.P.L.L.L.L.L.D.L.L.A.H.H.G.G.S.S.H.S.S.S.z.h.h.l.l.h.h.g.g.g.g.k.h.k.g.l.h.h.l.l.z.h.h.z.h.h.z.h.z.h.h.h.l.l.l.l.S.A.z.h.A.A.A.A.h.A.A.A.A.G.A.A.h.A.h.A.A.A.G.G.H.S.S.A.G.H.H.H.H.G.L.L.L.L.G.L.G.G.P.H.D.G.H.H.S.H.H.S.G.A.H.D.H.D.S.H.H.H.H.H.H.H.L.Z.L.L.S.L.D.U.L.P.P.P.P.U.L.L.L.P.L.P.P.L.U.P.T.Y.T.U.T.T.Y.T.T.T.~.T.T.~.~.T././.~./.~././.^./.)./.(.{.(.(.(.(.^.).{._.(.(.(.(.^.|._.(.|.|._._.}.}.}.}.|.(.^.(.(.(.(.[.^./././.(.~./.~.T.~.T.T.T.~.T.K.~.T.T.T.(.T.I.T.T.T.~.~.T.T.T.~.T././././.(.(./.{.{.(.(.(.(.`.(.`._._.|.}.|.}.|.|.}.}.}.|.|._. X|.|. X|.|..X.X.X.X.X'..X",
+"P H H H K U U H G K J J H P L P P J I P I I I I J P P P P P P I U / I I P I I ) I P I P P I P I P P ) I P ) I P I I P P I I J ) I I P I I I ) I J I I I I J I U P J P P P P I P I I I I ) P I ) I ` I I ) Y I I ) I I I Y I I I I I I J I Y ) I ) Y ` Y ` ` v.` v.v.c.c.v.v.N.v.N.N.v.C.N.V.N.C.N.C.N.V.V.C.V.V.N.V.N.V.V.V.V.V.V.V.V.V.V.OXlXlXlXlXkXlXkXjXjXjXjXjXrXrXrXjXrXrX0.rXrX0.0.0.7.7.7.6.6.6.6.6.C.V.V.V.V.C.F.K.K.E.W.K.E.W.W.I.J.W.J.E.E.E.E.E.).&X+X+XUXUXUXlXkXlXjXOX0.0.7.6.6.6.6.9.3.6.3.6.3.6.3.3.%.&.#.$.$.#.+X#X+X+X+X+X+X&X).+X+X+X&XlXkXkXkXkXjXOX0.0.7.7.7.6.6.6.6.7.6.6.6.7.6.7.6.7.7.6.6.6.6.6.3.3.%.%.%.q.+X+X+X+X{.).E.E.E.U.E.I.J.I.J.L.I.I.I.I.J.I.U.E.E.E.E.E.).{.+X).&X#X+X+X+X#X#X+XB.+X$X+X+X+X+X+X+X).).E.).E.E.E.E.J.J.J.J.G.G.G.W.h.G.G.G.G.A.G.h.G.G.G.J.H.H.J.J.J.L.L.J.J.J.L.L.H.H.H.H.L.W.S.S.A.A.A.G.h.A.A.h.h.A.h.A.z.h.g.l.Z.h.z.h.h.g.g.g.k.l.l.z.g.z.z.d.g.A.l.z.g.g.g.k.k.l.g.h.g.A.g.z.g.z.l.l.A.A.A.A.A.A.G.A.G.H.H.D.J.H.D.L.J.H.H.L.L.P.H.L.L.H.L.K.H.H.L.L.H.U.L.L.L.L.L.L.L.L.T.H.H.H.T.H.U.U.U.P.U.U.L.U.U.U.U.P.T.~ ~ ! CXDXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXFXFXFXFXFXFXSXGXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXAXFXFXFXFXZXZXFXFXZXZXHXQ.} / ! ` P.P.U.U.P.L.L.P.L.L.L.L.H.L.S.H.S.G.H.H.S.G.S.S.S.H.H.h.h.h.h.h.g.g.f.g.g.g.g.g.z.k.k.l.h.l.z.g.l.z.h.f.f.h.z.h.h.h.z.l.l.l.h.A.h.A.h.A.A.h.A.A.A.A.A.A.J.A.G.A.G.A.G.G.A.A.S.G.H.S.D.H.L.G.L.G.G.H.G.L.G.L.G.H.H.H.H.H.H.H.S.S.G.G.G.G.S.L.S.D.D.H.H.H.H.L.H.H.U.L.L.L.L.L.L.L.P.P.P.P.L.L.L.L.S.P.U.L.U.U.P.U.Y.U.T.T.T.T.Y.^.T.[.~.[.~./.~.~./.~.~.~./././././.(.(./.(.(.(.(.(.(.(.(.(.`.(.`.|._._.|._.|.|.{.}.}.}.}.(.(.(.(.{.(.(.^.~.[.^.{.(.~./.~.~.~.(.T.T.T./.T.K.T.T.T.R.T.T.~.T.T.T.T.~.~.~.~.T./.~././.(./.(.[.).^.(.(._.^._._._._._.}.}.|.}.}.}.}.}._._.|.{.|.'.|. X|..X|..X.X.XdX.X",
+"H H H H H J H H H H H J J L P H P P S I P S P P P P ) P P P I J J P P P P ) P P P I I P ) P P P P P J P J ) P P P P ~ I I J I I I I ) P I I P P I I I I J I I J P I P P P J P I I I ) I I ) ` I I I I J I ` ) ) ) I I ) ) I I I I I Y ` I ) Y ) I ` ` ` ` ` ` c.c.c.c.n.v.n.n.N.N.N.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.B.lXkXkXkXkXkXkXjXjXjXjXjXjXrXrXrXrX0.0.0.0.0.0.0.0.0.0.7.7.7.6.6.6.3.3.%.q.C.V.V.F.K.V.E.E.E.E.E.J.E.I.E.K.E.E.E.E.&X).).+X+XUXUXUXUXkXjXjX0.7.7.6.6.%.3.9.9.%.%.%.%.6.%.%.3.3.%.#.#.$.$.8 q.+X#X#X#X+X+X+X#X+X+X+X@X$XlXkXkXrX0.0.7.6.9.6.6.3.%.6.%.3.4.%.9.6.3.3.6.6.6.6.6.6.6.6.3.%.%.&.#.#.*.&X+X+X&X&X).E.E.E.E.E.J.U.J.I.J.I.U.R.T.T.E.T.E.(.E.+X&X+X+X+X#X#X$XlXlXlXjXjXrXrX0.0.0.OXOX&X+X+X).+X).E.E.E.E.J.I.I.J.J.J.G.W.G.W.h.G.G.W.G.W.G.H.J.I.W.J.J.J.L.U.I.J.U.L.L.J.K.I.J.J.H.Z.G.H.G.J.A.A.A.G.A.A.A.A.h.h.A.g.h.h.g.l.h.z.h.g.g.g.k.z.d.d.g.f.g.d.g.g.g.g.g.g.h.g.z.g.g.z.l.k.l.g.A.l.l.l.A.A.h.A.A.A.G.H.H.H.H.H.S.L.L.H.H.P.H.L.L.H.L.D.L.U.L.L.J.U.U.L.T.U.L.L.L.U.L.L.U.P.L.H.P.G.U.T.U.U.U.Y.L.Y.L.P.Y.U.U.P.P./ ! S CXAXDXAXAXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXAXDXFXFXFXFXDXZXHXDXDXBXBXm.{ Q ^ [ P.P.P.P.L.P.P.P.L.U.A.U.H.L.H.H.S.H.Z.H.H.S.H.A.S.S.A.A.A.h.h.h.h.h.g.g.z.g.g.k.g.z.l.z.k.h.h.k.j.j.z.h.h.z.z.x.h.l.h.l.l.h.A.h.A.A.j.A.A.A.A.A.H.A.A.A.h.A.A.A.A.G.A.Z.G.G.H.H.G.S.G.H.D.D.L.H.H.H.L.G.L.G.L.P.H.H.H.H.H.H.H.Z.D.D.D.D.G.G.H.L.G.H.H.H.G.G.H.L.D.U.L.L.L.L.L.U.P.P.L.Y.L.L.L.L.U.U.P.U.U.U.P.T.I.T.T.U.T.T.P.T.T.T.T.~.~.~.~.~.!.~.~./././././.(.(./.(.(.(.^.^.{.(.^.(.^.(.(.(.`.|.}.[.|._._._.|._.[.^.(._.(.(.`.{.(./.).(././.~.~./.~.~.~.~.T.T.T.R.R.T.T.T.T.T.(.T.T.~.T.~.T.~.T.~.T.~.~.~.~././.^.^.^.(.(.(.(.`.`._.|._.|.|._.|.}.}.}.}.}.}.|._.|.|.|..X.X_.|. X.X.X.X.X.X X",
+"H H U H H H H H H J H J J J L P J P ) P P ) I I P P J P I I P I ) P ) ) P J I P U P I P P P P I ) P P ) P P I P P ) P J I ) I I P ) I P I I P P J I I I P J I I I I P I P ) I I I I I ` Y I I ` I ` ` ` ` I Y ` Y ] ` Y ` I ` I ` Y I I ) ) Y ` ` ` ` ` ` c.c.c.n.c.c.n.N.N.N.N.V.V.V.V.V.V.V.lXlXOXjXjXjXjX0.7.6.6.%.C.V.V.B.V.B.lXUXlXkXkXkXkXjXjXjXjXjXjX0.0.0.0.0.0.7.0.0.7.7.0.7.7.7.7.7.7.7.6.6.6.3.3.%.*.*.C.B.V.V.E.B.&XE.E.E.E.E.E.E.E.E.E.E.).).+X+X+XJXUXUXUXkXjXrX0.7.6.6.3.%.3.%.%.%.%.%.%.%.%.%.%.%.3.%.&.#.#.$.8 8 q.$X#X#X#X+X$X+X#X#X#X#XlXjXjXjXrX0.7.6.9.%.%.%.%.%.%.%.%.%.%.3.%.%.3.%.3.%.3.%.6.%.6.6.%.%.%.&.#.$.#.V.+X+X&X).).).XXE.U.U.E.U.E.I.E.E.R.E.E.E.).).).[.+X+X+X+X+XJXlXkXkXjXjXjXjXrXrX0.0.7.7.7.6.7.OX+X+X+X+X&X&XE.E.E.E.J.J.J.J.W.G.G.W.G.A.G.G.W.W.J.J.J.J.I.L.J.J.E.I.R.L.L.J.J.J.H.J.J.W.J.J.H.G.A.J.A.G.A.A.h.h.A.A.z.h.g.A.h.A.h.h.l.l.l.g.l.Z.d.z.h.k.h.f.g.g.g.g.g.g.g.g.g.g.g.h.g.z.k.k.k.l.k.l.l.l.h.A.A.A.A.A.A.A.S.S.H.H.S.H.H.K.L.L.H.L.L.H.P.H.S.L.L.L.L.L.L.U.H.U.L.K.U.L.L.U.P.P.U.U.U.L.U.U.T.Y.P.U.U.L.P.P.U.T.P.P.~ ! ! CXDXZXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXSXFXFXFXFXFXFXAXDXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXDXDXDXDXDXZXHXQ.[ Q ^ [ L.P.P.P.L.P.L.U.L.L.L.L.L.L.H.H.H.G.G.G.S.G.G.A.S.A.A.A.z.S.h.h.h.h.h.h.h.h.h.l.l.l.h.g.l.z.k.k.x.j.j.f.h.f.h.j.h.h.S.h.l.h.z.H.A.A.S.A.A.A.A.S.A.A.H.A.S.G.G.A.A.A.H.A.A.Z.H.A.S.S.G.H.H.H.H.G.H.H.G.L.G.P.G.D.L.H.H.H.H.H.S.G.G.H.A.L.S.S.H.H.G.H.H.L.L.L.D.L.S.L.L.L.L.L.L.U.A.P.U.L.L.L.L.U.L.L.D.L.U.U.U.U.T.U.T.T.T.T.T.T.T.T.~.~.~.T.~.T.~.~.~.~./.~.!.~./././././.(./.^.[.(.^.`.`.{.(.(.^.(._.|._._._._._._.|.^.(.(.(.(.^.(.(./.(./.{.(.(.[.(.~.~.~.T.~.T.~.T.R.T.I.(.T.T.T.T.~.T.T.Y.~.T./.~.~.T.~.~.~./././.~.^.(.^.(.{.^.(.`.^._._._.}._._._._._._.}._._.|._.|..X.X|.'..X|..X.X.X.X@X",
+"H H H H H H H H H H L L H P L L P P P P P P P P ) P I P I ) P P I P I I J I I I J I I P I I I J J P P J ) P P P ) I P P I I Y J P P ) P P P I P P P ) P K I I I I I I I I J I ) ) Y I ` I I ) ` ` ` ` ` Y ` ` ` I ` ` Y I ` Y I I ) I ` ` I ` ` ` ` ` ` v.c.c.v.N.v.N.N.N.N.V.V.V.V.V.OXlXlXkXjXjXjXjXjXrXrX7.6.%.%.&.8.B.B.B.lXkXUXUXkXkXkXjXjXjXjXjX0.0.0.0.0.0.7.7.7.7.6.6.7.7.6.6.6.6.6.6.6.6.6.6.6.4.3.%.*.#.#.q.].).+X).).!.).E.E.E.E.E.E.E.).&X&X&X+X$XbXUXUXkXkXjXjX0.7.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.$.8 8 C.$X$X$X$X+X+X$X$X$X@XlXjXjXjXrX0.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.6.%.6.%.%.%.*.#.#.$.$.C.%X&X).).).).E.U.E.E.E.E.I.E.E.T.E.E.{.).).{.+X+X#X+XJXkXkXkXkXkXjXrXjXrX0.rX0.0.0.7.6.6.6.3.3.C.%X&X&X&X&XE.E.E.U.E.J.J.J.J.W.W.W.G.W.J.J.J.W.E.W.E.I.I.I.E.K.E.E.E.L.J.I.J.I.J.J.J.J.H.H.H.G.G.G.S.G.h.A.h.A.h.h.h.A.h.h.h.h.z.h.h.h.k.h.h.h.h.j.j.g.g.k.f.g.f.f.f.k.k.z.g.l.g.g.g.g.g.A.d.h.A.h.h.l.l.A.A.A.h.H.H.H.H.H.D.H.D.D.L.L.H.L.H.H.L.L.H.L.L.L.L.L.L.L.L.U.P.P.P.L.L.L.P.L.P.P.G.U.U.L.L.T.T.U.L.L.Y.L.P.T.U.U.L.! ! ~ CXFXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXAXZXZXBXm.} ~ ~ ` L.L.U.U.U.P.U.L.L.L.L.L.L.L.H.H.H.H.H.Z.G.G.G.A.S.G.A.A.h.A.A.A.h.A.h.h.h.l.l.l.l.k.l.k.x.j.h.h.k.k.j.k.k.h.j.h.h.h.h.S.h.A.A.A.A.A.A.A.A.A.G.A.F.A.S.S.H.Z.G.Z.G.H.A.S.S.S.S.S.S.G.S.S.G.D.H.D.H.H.H.H.H.H.L.H.L.G.G.H.G.G.H.H.S.H.H.H.H.H.H.S.S.L.L.L.L.L.L.L.L.L.L.L.L.K.P.Y.L.L.P.L.L.D.U.S.L.L.L.L.Y.P.P.P.T.T.Y.T.T.T.T.T.T.~.T.~.T.~.~./.~./.~./.~./././.~.^././.(././.(.(././.(.(.`.|.(._.|._.|.^.|.{.|.{.(.(.`.^.(.(.(.^.(.(.^.^.(.(./././.R.).T.~.~.T.(.K.T.~.T.T.~.T.T.~.T.T.~.T.T.T./.T./.~.T.).!.~.(.~.(.(.(.(.(.(.(.(.^._.|._._.|.^.|._._.^.^.`.(.`.(.|.|.|..X|.'.|..X.X X.X'..X.X",
+"Z H H H F J J G J H H L H J K P P P P P P P P P P J I P P P P P I I I P P J P P I J J I I J I I J I P P P P P P P P P ) I I ~ I P I ) P ) P P ) I P P I I I I I I Y I I I Y ` I Y ] ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` Y ` Y ` I Y ` ` Y ` ` ` b.v.v.c.n.N.N.N.N.N.V.V.V.lXkXlXkXkXjXjXkXjXjXjXrXrXrX7.3.*.*.#.8.B.B.B.lXkXkXkXUXkXkXjXrX0.0.0.0.7.7.6.7.6.6.6.4.%.6.6.%.3.%.3.6.3.6.6.6.6.3.6.6.3.3.%.*.*.$.$.#.B.&X).+X).).).).!.E.E.).E.+X&X+X+X+X$XUXUXUXkXkXjX0.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.*.$.8 8 6 6 +X$X$X$X$X$X+X$X$X$XlXjXjXrXrX0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.$.8 C.+X+X).).).).).E.E.E.U.T.E.E.E.~.).&X{.+X+X{.+X+XlXkXUXkXkXkXjXjXjXjX0.0.0.0.0.7.7.7.6.6.3.%.&.6.&X+X&X&X).).E.E.E.E.J.J.W.J.J.G.J.W.J.J.J.J.I.E.J.E.E.E.E.E.E.K.E.E.I.I.E.W.J.I.J.I.W.J.W.S.G.W.G.A.G.G.A.A.h.h.A.h.h.h.h.h.A.h.z.l.l.h.l.h.f.h.j.g.g.g.f.f.j.f.f.g.f.f.h.a.g.g.h.g.g.g.l.h.g.z.h.l.A.l.A.A.S.A.H.D.H.H.H.L.L.L.H.L.P.L.L.P.L.H.P.L.L.H.P.H.P.L.L.H.H.L.P.L.P.P.L.P.P.U.U.L.U.L.I.L.U.U.U.U.U.K.P.U.L.Y.L.~ ~ S CXZXAXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXAXDXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXSXGXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXAXDXFXFXFXFXFXAXFXAXHXDXMXm.[ ~ ^ [ L.P.T.P.U.P.L.L.L.L.L.L.L.H.L.S.H.H.G.H.H.G.A.H.S.S.G.h.A.A.h.h.h.h.h.h.h.l.l.l.k.h.k.h.j.j.f.h.h.h.k.h.j.f.j.g.h.h.l.h.A.l.A.A.A.A.g.G.A.h.A.A.A.S.A.S.A.h.S.S.A.A.S.A.S.S.S.S.S.G.A.H.A.D.D.L.H.H.H.H.H.H.L.H.L.H.L.H.H.H.A.H.S.G.G.H.H.H.L.H.H.S.S.U.L.S.L.L.L.L.L.L.P.P.P.P.P.P.L.L.L.L.L.L.S.L.L.L.U.P.Y.Y.I.I.T.T.T.T.T.T.T.T.T.T.~.T.~.T./.T./.~./.~./.~.(.~././././././.(.(.(.(.(.(.`.(._.^.(.|.(._.(.^.(.(.(.(.(.(.(.(.(./.(.[.^.^./././.(./.T.T.~.T.~./.T.~.T.~.T.T.~.~.T.~.T.~.T.~.T.T.~.~.~.~.~.~.~.~.(././.(.(.(.(.(.^.|.`._.|._.|._.|.|._.`.`._.`./.`.|._.|.|..X|.|.|..X|..X.X.X.X",
+"G L H H G J H H H H L L L J L L P L P ) P P P P ! P I I ) P P P I J I P P P P P I J I P K P I L P I P J P P I P I P P P I J I I ) P P ) I I I Y I I I I I I I ) ) I I I I ` ) ) ` ] Y ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ] Y Y ` Y ` ` ` ` v.v.v.v.n.v.n.N.N.V.V.V.V.lXlXkXkXkXkXlXjXjXjXjXjXjXOXrX0.7.3.#.$.$.q.B.+XB.lXkXkXkXkXkXrXrX0.7.7.6.6.6.6.3.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.3.3.3.3.3.3.%.&.*.#.$.$.#.dX+X+X+X).).).).).).).&X+X&X+X+X$XlXUXUXUXjXjX0.7.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.#.#.$.8 8 3 q.$XbX$XbX$X$X$X$X$X$XjXjXrXrX0.9.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.3.%.%.%.&.*.#.#.$.8 8 E.+X&X&X).).XXXXE.E.E.E.E.E.).).).&X&X&X+X#X$XUXUXUXkXkXkXjXrXrXrX0.0.0.0.7.0.7.7.6.6.6.3.&.*.*.#.C.+X%X&X).).E.E.E.I.J.J.J.W.J.J.W.J.W.K.E.E.E.E.W.E.E.E.!.E.E.E.E.E.E.I.I.I.I.K.J.L.J.J.W.Z.W.A.A.W.h.A.h.G.h.A.h.h.h.h.h.h.h.h.l.h.h.h.h.h.x.h.g.f.g.g.f.f.f.f.f.g.f.f.l.f.s.z.h.g.z.l.h.h.A.h.A.h.A.A.A.G.A.G.G.D.H.H.H.L.L.L.H.H.H.P.D.P.P.L.L.H.H.L.L.L.U.L.H.L.H.L.P.L.P.P.U.L.L.U.I.L.L.I.U.L.L.U.L.L.U.Y.U.P.U.U.! Q ! CXFXDXAXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXDXAXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXDXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXDXBXQ.{ ~ ~ [ P.P.T.P.U.P.P.P.L.L.L.L.L.L.L.H.Z.H.H.H.H.S.H.H.S.A.G.A.A.z.A.A.A.h.h.k.h.h.l.z.h.k.h.z.g.f.h.z.k.k.j.f.f.h.g.g.h.h.z.h.g.A.A.A.A.A.A.A.A.A.H.A.S.S.A.A.G.S.H.A.H.A.Z.H.S.S.S.S.S.S.H.G.G.P.G.H.H.H.H.S.H.L.S.K.G.L.G.H.G.G.H.S.H.H.H.D.H.H.H.L.U.L.L.S.L.A.L.S.L.L.L.U.P.P.P.Y.L.K.P.L.L.L.L.Z.H.U.D.U.P.P.P.P.U.T.I.T.T.T.Y.T.T.T.Y.T.T.T.~.~.T./.~.~.~./.(.~.~.(.~././././.(.(./.[.(.(.(.(._.|.^.(.(.(.{.(.(.(.(.(.(.(.(.(.(./.(.(.^.E.(././.~.~./.T.~.T.~.T.R.~.T.~.T.T.~.~.T.~.~.T.T.~.T.~.T.~.T.~.~.~.~.~./.(./.(./.(.(.(.(.(.^.|.(._.`.^.[._._.`.`.`.^.`./.|.|._.`.`.'.'.|..X|..X.X.X'..X",
+"J H H H L Z H H J H H P L J L P P P L P L P P U I I I P P P ) P I P I P J P P ) I I P P P P J I P P P P P P P P J P P P I I I I I I I I I ) P I I I I I ) Y I ) Y I _ Y I ` ` Y ` ` ` ` v.` ` v.c.` c.v.v.v.c.` v.v.` v.` ` ` ` ` ` ` ` ` ` ` v.` b.c.c.v.n.N.N.N.N.V.V.B.lXUXlXkXkXjXlXjXjXjXrXjX0.0.0.0.7.3.*.$.$.8 $.B.B.B.jXlXlXkXjXrXrX7.7.6.6.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.3.3.3.3.3.&.*.$.$.$.8 q.+X+X).+X+X).+X).).).).+X+X+X$XbXUXUXkXkXjX0.7.6.%.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.8 7 6 6 V.$X$XbX$X$X$X$X$XlXjXjXrX0.0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.3.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.#.$.8 8 8 ).+X+X).+XE.).).).E.(.).).).(.).+X+X+X$XJXUXUXUXkXkXlXjXrXrX0.0.7.7.6.6.6.6.6.6.6.6.3.3.%.*.#.#.$.C.+X&X).&X&XE.E.E.E.E.E.J.E.J.W.E.E.E.J.E.E.E.).E.).E.).E.E.).E.E.E.E.E.E.E.R.I.I.I.L.J.J.G.G.G.A.G.G.h.h.G.h.G.h.G.G.G.h.G.h.A.l.A.h.z.h.h.z.l.g.g.g.h.z.f.f.z.f.f.h.f.l.A.h.h.f.g.A.g.A.h.h.A.h.A.A.S.A.A.A.H.G.H.A.H.H.H.H.L.L.P.G.P.H.L.L.H.L.L.L.L.P.H.U.L.U.L.L.P.P.P.H.G.U.P.L.U.J.I.U.P.L.U.L.L.L.L.S.P.L.L.L.~ Q ! CXAXAXAXFXAXDXAXDXFXFXFXFXFXFXAXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXAXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXDXFXFXGXSXDXDXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXDXZXBXpX} S ~ [ P.U.P.P.P.P.P.P.Y.U.L.L.L.S.H.H.H.H.H.H.S.S.S.A.S.G.A.A.A.A.A.A.h.A.A.h.h.h.h.k.f.z.j.a.k.j.k.j.f.h.g.k.k.k.g.g.h.h.z.h.g.g.A.A.l.A.A.A.A.A.A.A.S.A.S.S.A.S.A.H.H.H.A.H.S.S.S.S.H.S.S.G.A.L.D.D.H.H.L.H.H.H.U.S.H.H.H.H.G.H.H.H.H.H.H.H.H.H.H.S.L.L.L.L.L.L.L.L.L.L.U.L.P.Y.P.P.P.P.P.P.L.L.L.L.S.L.L.L.P.P.U.Y.U.I.U.T.T.T.Y.T.U.T.T.T.T.T.T.T.T.T.~./.Y.~.~.~.~.~./.!././././././././.(.(.(.^.{.^.|.^.(.).^.`.(.(.(.(.(.^.(.(.(.(.(.E.[././././.(.R.(.~.~.~.T.~.R.~.T./.T.(.T.~.~.T.~.~.T.~.T.~.~.T.~.~.~.~.~.~.~.^.).(.(.(.`.`.(.^.|.^.{.{.|.{._.(.{.^._.^.^.|.^.|._.|.|.|.|.|.|..X|..X.X'..X",
+"H H G H H G H H D H H J J H H L L P P P P P P / P ) P ) P P P P I J I P Y P I I J J I J I L P J P P P J P P J P P P P I I I I I I ) ) I I ) I ) I ` I ` I I I Y ] ` ) ` ` ` ` ` ` ` ` ` ` c.c.c.v.v.c.v.c.c.v.b.b.v.` b.v.b.` ` ` v.` ` ` v.c.` v.c.v.v.N.N.n.V.V.V.OXlXUXUXkXkXkXkXjXjXjXrX0.0.0.7.7.7.7.6.%.#.8 8 6 8 OXB.B.OXjXjXjXrXrX0.9.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.$.8 8 C.+X+X+X+X+X+X).&X+X+X+X#X#X$XlXUXUXkXjXrX0.6.9.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.8 6 3 7 $X$X$X$X$X$X$X$X$XrXrXjXrX7.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.8 8 6 q.#X+X+X+X{.E.).(.).).).).).).+X+X+X$XlXUXUXUXkXkXjXjX0.0.0.7.6.6.6.3.6.%.6.6.9.6.6.3.6.%.&.*.$.$.$.C.&X+X&X).).).E.E.E.I.E.J.E.E.E.K.E.E.&X&X&X).E.).).&X).).).).).).).).R.E.E.E.I.I.I.J.J.J.J.W.h.G.h.A.A.A.h.h.h.W.h.G.h.h.h.A.h.l.h.h.h.G.z.A.z.g.g.l.l.h.h.g.g.f.h.h.z.s.A.k.h.A.g.z.h.h.h.Z.h.A.A.A.G.A.H.A.S.H.H.H.H.L.L.H.P.L.H.L.P.D.L.D.H.L.L.H.L.P.L.H.L.L.U.H.U.P.P.T.P.L.L.U.L.U.U.P.L.U.L.L.S.L.L.L.L.L.L.~ ! ! CXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXFXBXQ.{ ! Q [ T.T.T.P.P.U.T.U.U.L.L.L.L.L.S.U.H.H.H.G.H.H.A.H.S.S.A.l.h.A.A.A.h.A.A.h.l.l.z.h.h.k.k.h.g.g.g.g.g.h.j.k.g.a.h.g.h.h.h.h.G.g.G.A.A.A.A.A.A.A.A.A.l.A.S.S.G.S.H.A.A.H.S.S.S.A.S.G.D.S.S.H.H.S.H.H.S.H.L.H.U.S.L.L.H.H.H.H.L.H.H.H.P.S.H.H.H.S.L.S.S.L.H.L.L.L.L.L.Y.L.L.Y.U.U.P.P.P.U.L.L.L.L.L.L.U.L.L.S.U.L.U.Y.P.P.U.P.T.T.U.T.T.U.U.T.T.T.T.T.T.T.T./.~.T./.~.~.T.~.~.~./.~.~././././././.(.^.(.(.(.(.^.(.(.^.(.(.(.(.(.(.(.).(./././.^.~.~.~.(.~.T.~.~.~.~.T.~.T.T.~.~.~.~.~.T.~.T.T.~.T.~.T.T.~.~.~.T.(.~.~./././.(.(.(.(.(.(.(.(.(.(.(.|.(.|._.|.(._.{.|.(.(.|._.|._.`.|.|.|..X|..X X.X.X X",
+"H H K H H K H U H H H H H J P H P H L L P L P P P J P P P ) / J J P J Y J J J J J I J I P P P I P P P P P P P P I I P I I I I I I ) ) Y I I I I I I ) Y I ` I ` ` Y ` ` ` ` ` v.c.c.c.c.c.c.c.v.v.n.c.n.n.c.v.v.v.c.c.c.c.c.` v.v.Y v.` v.[ v.c.n.c.n.v.n.N.N.V.V.B.UXUXUXkXkXlXjXjXjX0.0.0.7.7.7.7.6.6.4.3.#.$.8 6 6 6 C.B.hXOXrXrXrXOX0.7.6.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.3.%.%.&.&.#.#.$.8 7 6 V.$X+X+X+X+X+X+X+X#X+X+X$XlXUXUXlXkXrX0.7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.8 6 3 6 C.$X$X$X$X$XbX$XlXjXjXrX0.0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.#.$.8 8 4 C.+X+X&X+X&X+X).).).).).).+X+X+X+X$XUXUXUXkXkXjXOX0.7.7.9.3.9.3.%.%.%.%.%.%.%.%.3.%.%.%.&.*.#.$.8 8 C.+X+X&X&X&XE.E.E.E.E.E.E.E.E.&XE.&X+X&X+X+X&X{.&X{.+X+X&X).+X).).E.).E.!.E.E.E.I.J.I.J.W.G.G.W.G.G.A.h.G.G.h.G.h.h.A.G.G.A.G.h.G.G.h.h.G.h.z.l.h.l.h.h.z.z.l.z.h.f.h.h.h.h.h.h.g.g.A.h.A.A.l.A.h.A.A.S.A.D.G.H.D.H.H.G.H.H.L.L.L.L.H.D.L.L.L.H.L.L.L.H.L.L.U.L.L.P.P.P.P.P.L.U.L.H.U.H.U.L.L.U.S.L.L.L.L.L.H.L.L.P / ! BXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXDXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXDXZXBXm.[ Q Q [ T.T.Y.T.T.T.T.P.Y.U.Y.L.P.P.L.S.L.H.H.H.H.H.A.H.S.S.G.S.A.A.A.A.h.h.A.A.A.l.h.h.f.j.j.f.f.f.g.a.g.k.k.h.z.h.h.h.h.h.h.h.g.A.A.A.A.A.A.A.A.A.A.A.D.A.S.A.A.G.A.H.H.A.G.S.S.S.S.H.H.G.D.G.L.S.D.L.L.S.H.L.H.H.H.H.H.H.H.A.A.H.H.G.S.U.H.H.L.S.L.L.U.L.L.L.L.L.L.L.L.R.L.U.U.L.Y.L.L.L.U.L.L.L.S.L.S.U.L.L.L.L.L.L.P.P.P.T.Y.T.U.Y.T.U.T.T.T.T.T.T.T.~.T.T.~.T.T.~.~.~.~.~.~./.~.!././.~.~./.(.^./.E.(.(.(.(.(.(.~./.(.(.(.~.^.(././.^././.~.~.~.~.T.T.T.T.T.~.T.~.T.~.T.T.R.~.~.R.~.~.~.~.~.~.T.~.T.~.T.~.~.~././././.(.(.(.(.(.(.^._.(.(.(.(.^._.^.(./.(.^.(.(.(.(.(.`.(.|.`.|.|.|..X.X X.X.X.X@X",
+"H H F L H H H H H H P Y P H H J J J L P P P P P P P P P P ) U P P P J I J L I J J U I J L P J K P P P J P J P P P I I ) I ) I I I ) I ) ` Y ) ) ` I ` ` ` ` Y ` ` ` ` ` ` c.` c.c.c.v.c.v.v.n.c.N.v.n.v.v.N.N.v.N.v.c.c.c.c.c.c.v.v.v.` b.v.c.c.c.v.N.N.N.N.V.V.B.UXUXkXkXkXkXjXjX0.0.7.7.6.6.6.3.3.3.3.%.&.#.8 8 3 6 3 C.OXB.B.rXrX0.0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.*.#.$.8 6 6 q.#X#X#X+X#X+X+X#X#X#X$X$XUXUXkXkXjXrX0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.$.7 6 3 7 $X$XbX$XbX$X$XbXjXjXrXrX0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.*.#.$.8 6 6 7 +X+X+X&X+X&X).+X+X).).+X+X`.$X$XUXUXUXkXkXjXrX0.6.6.3.6.%.%.%.%.%.%.%.%.%.%.&.%.3.%.%.&.*.#.$.$.8 8 B.+X+X+X).).).E.&XE.E.E.E.+XkXkXlXOXOX$X&X+X+X&X+X+X+X+X+X+X).).).).).).E.E.E.J.J.J.J.G.G.G.G.A.A.A.W.A.h.G.G.h.W.A.h.G.G.h.G.W.h.G.A.A.G.G.A.g.A.h.h.l.l.G.z.h.h.A.h.h.z.g.h.A.h.h.h.h.A.A.A.S.A.H.A.G.A.H.H.G.G.H.L.G.H.L.L.L.P.G.L.L.L.H.L.H.L.H.H.L.L.L.L.S.P.H.H.P.L.L.L.L.U.H.U.U.L.S.L.U.S.L.S.L.H.L.L.L.! ! ! ZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXAXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXZXCXDXHXm.} S ! [ T.T.T.Y.P.T.T.P.U.U.U.P.L.L.L.S.H.H.H.H.H.S.G.G.H.A.S.S.H.A.A.A.D.h.A.h.A.h.h.h.z.j.f.f.g.f.g.g.l.k.k.l.h.z.h.h.h.h.h.A.g.A.A.Z.h.A.h.A.A.l.z.H.S.A.S.S.Z.H.A.G.H.A.H.S.S.S.S.S.S.A.H.D.A.P.D.D.H.H.G.H.H.H.K.H.h.H.S.K.G.G.G.G.S.S.H.S.L.S.L.L.L.L.L.L.L.L.L.U.L.L.Y.U.U.U.U.K.L.L.L.L.L.L.L.L.S.L.L.L.L.L.Y.T.P.P.P.Y.T.Y.Y.P.U.T.U.T.T.T.T.T.T.T.T.T.T.~.T.~.T.T.~.~.~.~.~.~.~.R.~.~././.[.^.[.(.(.^.[.(.^././.(././.]./.(./././.^.~.~.~.!.!.~.T.T.~.~.I.~.T.~.T.T.~.T.R.T.~.~.T.~.~.T.~.~.T.~.~.~.T.~.~.~.~././.(.(.(.(.`.(._.(._.(.(.(.(.(.(.(.{.(.(.(.|./.(.|.^.|.^.|.|.|.|. X|..X'. X X@X",
+"H H H L H H H H L H H H H H I J J P S L P P P L P ) P ) P P U I P P P J I J J J I J I I P I I I P P P I P P I I I I I Y ) I ` I ) _ ` ) ` I ` ` ` ` ` ` ` ` ` v.` v.` v.c.c.c.n.c.c.N.v.n.n.N.N.v.N.N.N.N.N.v.N.n.N.v.n.c.c.n.c.c.c.b.v.v.c.b.v.n.N.N.N.V.V.V.lXUXUXUXUXkXkXjX0.0.7.7.6.3.3.3.3.%.3.%.%.%.&.#.$.6 6 3 < 8.B.B.B.0.0.0.0.7.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.3.&.&.#.$.$.8 3 < C.$X$X$X#X#X$X+X$X$XbXbXUXkXkXkXrX0.6.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.#.$.8 6 3 < OXbX$XbX$X$X$XbXjXjXjXrX0.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.*.$.$.8 6 4 q.$X+X+X+X+X+X+X).+X#X+X#X$X$XUXUXUXUXkXjXrX7.6.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.#.#.$.8 8 7 +X+X+X&X+X+X&X).E.&X&X&X+XUXUXlXjXrXrX0.0.OXOX+X$X+X+X+X+X+X+X&X+X).).E.E.E.E.E.J.J.W.W.W.W.A.G.W.A.G.G.h.W.A.G.W.G.G.W.W.G.G.W.G.G.A.G.G.h.W.l.A.h.A.h.l.h.h.A.h.h.h.h.A.A.h.A.A.S.h.h.A.A.A.H.l.H.H.H.S.H.H.G.D.D.P.D.H.D.H.L.L.P.G.L.H.L.L.L.H.P.H.H.L.L.H.H.L.P.P.L.U.L.L.H.U.L.H.L.L.D.S.L.L.U.S.A.L.H.H.! ! / ZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXDXDXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXAXDXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXDXBXm.[ ~ ! [ T.~.~.T.T.T.T.P.Y.U.Y.L.P.P.L.U.L.H.H.G.H.H.H.G.H.S.S.S.S.A.H.A.h.S.A.h.A.h.h.h.z.j.z.j.j.z.g.k.k.f.j.k.f.z.h.h.h.h.h.h.A.A.h.j.A.A.A.h.G.A.H.A.Z.A.A.S.G.A.H.G.h.H.A.H.G.S.G.S.S.H.G.H.H.G.D.A.H.H.H.H.H.H.Z.H.H.H.A.K.G.G.H.L.S.S.H.S.L.U.L.A.L.L.U.L.U.U.U.U.R.L.R.U.Y.L.L.Y.Y.L.L.L.L.S.S.L.L.L.L.S.U.L.U.P.P.Y.U.U.U.T.P.T.T.T.U.T.T.L.T.T.T.T.T.T.T.T.T.T.T.(.R.~.~.Y.!.!.~.~.!./.!./.~.~.~.^./.^./.^.~.~./././././././././.^.~.~.!.~.~.T.T.~.T.T.~.~.~.T.T.~.~.T.~.~.T.T.T.~.T.T.~.T.T.T.~.~.~.~.~.(./././././.(.(.(.(.(.(._._.(.(.{.).(./.|./.|.(.{.^.|.(.(.(.^.`._._.|.|.|.'.|.'. X'..X",
+"H H H H H H P H H J H J H H H H L L H H J P P P P H P P P P P P J I I U P J J I I I I I I J I I K ] I I ] I I ) _ Y ) _ ` ] ] ` ` ` ` ` ` ` ` ` ` ` [ ` c.` v.c.v.v.b.v.v.v.N.c.N.N.n.v.N.N.N.N.n.N.N.N.N.N.N.N.n.N.n.N.n.c.N.c.v.n.v.v.n.v.n.N.N.n.n.V.V.V.lXUXUXUXkXkXlXrX0.7.7.6.3.3.3.3.%.%.%.%.%.%.%.%.#.$.8 6 < 6 q.B.B.B.jX0.0.0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.#.$.8 6 6 7 $X$X$X$X#X$X$X$XNX$XUXlXUXkXjX0.7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.8 6 6 1 q.vX@XbX$XbX$X$XjXjXjX0.0.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.8 6 3 4 #X#X#X+X+X+X+X@X+X@X+X$X$XJXUXUXkXkXjXrX0.7.3.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.*.#.$.8 6 6 v.$X+X+X+X&X&X&X&X+X&X+XlXkXUXkXkXrXrX0.7.7.0.7.7.OXOXOX+X@X&X#X&X+X&X&X).E.R.J.J.J.J.J.J.G.W.G.A.G.G.G.G.G.G.G.J.W.G.J.G.J.G.J.J.W.G.W.G.G.G.W.G.A.A.G.A.G.h.h.A.h.A.h.A.A.h.A.A.A.A.A.A.A.A.G.A.A.A.A.S.A.A.A.H.S.H.S.L.H.L.D.L.L.L.L.H.L.L.L.H.H.H.L.L.H.L.L.L.H.L.L.P.H.L.L.U.H.L.D.L.H.S.H.H.S.L.U.L.L.S./ S / CXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXSXFXFXFXFXFXFXFXFXFXSXDXDXFXFXFXFXFXFXFXFXFXFXGXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXVXZXAXBXQ.} Q Q [ T.~.T.~.T.T.T.T.U.P.P.P.L.L.L.H.S.H.H.H.H.A.D.H.H.G.G.H.A.A.S.A.l.H.z.A.h.A.h.h.h.z.z.k.k.h.k.k.k.h.k.k.h.l.k.l.h.A.h.h.A.D.A.D.g.A.A.A.A.A.A.A.A.A.A.h.A.A.G.G.H.l.S.S.S.G.S.S.D.H.G.L.U.S.S.H.H.H.H.U.A.S.H.H.H.H.H.H.H.H.H.S.G.H.H.L.L.H.L.L.L.L.L.L.U.Y.Y.T.T.U.Y.L.U.Y.L.U.L.U.L.S.S.U.U.S.L.L.S.U.L.S.Y.T.T.U.Y.I.Y.U.I.T.T.T.T.U.U.T.I.U.U.T.U.U.T.T.T.U.T.T.(.R.~.T.T.~.T.~.~.~.~.~.~.(.~.~.~.~.~.^.~./.~./././.~./././././././.~.T.~.~.T.T.T.(.T.T.T.~.T.T.[.T.~.T.~.T.~.~.T.T.T.T.T.T.R.~.~.~.~.~.~./.(./.(.(.(.^.(.(.(.(.(.(.{.(.^.(.(.(.(.^.(.[.|.^.(.(.(.`.^.(._.(.|.|.|..X X.X.X.X",
+"H H H H H H D H H H H H H H H H L L H J J J P J P J P P P P P P I J I I P P J I I J J I I I I I I I I ) Y I I I ) ) ) ` ` ` ` ` ` ` ` ` ` c.` [ c.c.` c.c.` c.v.c.c.c.c.v.v.n.v.v.N.N.N.N.V.N.N.V.V.V.V.V.V.V.V.V.N.C.8.6.q.c.N.N.v.n.N.v.N.v.n.N.V.V.V.V.OXUXUXkXkXkXjX0.0.7.6.3.3.3.%.3.%.%.%.%.%.%.%.%.%.#.$.8 < 6 < 7 B.aXB.OX0.0.0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.%.&.#.$.8 6 3 < C.$X$XbX$XbX$X$X$X$XUXkXlXkXjX0.7.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.$.6 3 < 1 +X$X$X$X$X$XlXjXjXjX0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.3.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.8 8 3 < q.$X+X+X$X+X+X#X+X$X$X$XbXUXUXUXkXjXrX0.9.3.3.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.#.$.$.6 6 6 B.$X+X+X+X+X+X+X&X&X+XbXUXkXkXkXjXrX0.0.7.7.0.7.7.7.7.7.0.0.OXB.+X+X+X).).E.E.E.E.J.J.J.W.G.W.G.A.G.A.W.G.W.J.J.J.J.J.J.J.J.J.I.J.W.J.J.W.W.W.A.W.A.h.h.G.h.A.Z.A.h.h.A.A.A.A.h.A.A.A.A.A.Z.S.H.A.W.G.H.H.D.H.H.H.S.S.S.L.H.H.H.L.H.L.H.L.H.L.H.L.S.L.H.L.H.S.L.L.H.L.P.H.L.L.G.U.L.U.L.L.U.H.S.L.L.L.S.U.H.S / / ZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXAXFXFXFXFXFXFXFXGXAXDXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXVXBXpX[ Q Q [ ~.T.~.T.T.T.T.T.Y.P.P.P.L.L.L.S.H.L.L.H.H.H.L.D.H.H.l.S.D.A.A.S.G.Z.H.g.h.h.h.h.h.h.g.k.k.g.k.k.f.j.h.g.h.l.l.l.h.z.D.g.A.g.h.A.A.g.g.A.A.A.A.A.G.A.G.Z.A.G.A.G.S.S.S.S.A.S.S.S.S.D.A.D.A.A.J.S.H.S.S.G.H.H.H.H.H.H.H.A.H.H.G.S.G.L.H.H.H.L.L.U.L.L.L.L.L.L.P.P.U.T.U.U.L.L.U.L.L.Y.L.L.U.S.L.U.S.L.L.L.U.L.P.P.U.I.I.I.I.Y.U.T.T.T.T.U.T.U.U.T.T.U.U.T.T.U.T.U.T.T.Y./.T.~.T.!.T.!.~.~.~.~.~.~.~.~.(.~./.~.~./.~./.~././././.~./././.~.~.T.~.T.T.T.T.T.T.[.T.~.~.T.T.T.T.~.T.~.T.T.T.~.T.T.[.T.~.~.R.~.~./././././.(.(.(.(.(.(._.(.(._.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.|._.|.|.|.`.|.|.'..X.X",
+"D H H H H P J H H H H H H J H H J H H H H J H J U H L P P J P P P P J I P P P U I K I I I I I I I I I I I ] I ` ) ` ] ` ` ` ` ` ` c.c.{ c.c.c.c.c.c.c.c.c.c.v.v.n.c.c.N.n.n.n.N.N.N.N.V.V.V.V.V.V.V.V.OXV.B.B.jXjX0.7.6.*.q.n.N.N.v.n.v.N.N.n.N.N.V.V.V.B.UXUXUXUXkXjXOX0.6.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.*.#.8 6 3 3 6 B.B.+XOX0.0.0.0.7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.8 6 3 1 7 $X$X$X$X$XbX$X$XlXUXkXkXjX0.0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 6 < 1 C.$XbX$XbX$XbXjXjXjX0.0.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.*.#.8 6 3 < 4 $X$X$X+X+X#X#X#X$X$X$XUXUXUXkXkX0.0.7.9.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.#.$.$.8 6 < q.+X+X+X+X+X+X+X+X+X$XbXkXUXkXjXjX0.7.7.0.7.7.7.0.7.0.7.7.0.7.7.6.7.7.C.V.E.J.J.E.E.J.J.J.J.G.W.W.W.J.G.J.W.W.J.J.W.J.J.I.I.J.W.I.R.J.J.J.J.G.G.J.G.W.G.W.h.A.W.h.A.G.A.h.h.G.A.A.A.G.G.S.A.A.A.G.A.A.S.S.S.A.H.S.H.L.S.H.S.H.S.H.L.H.L.L.H.L.H.G.H.S.L.H.D.H.L.H.H.L.A.L.L.S.L.H.L.S.U.H.H.H.H.L.G.S.L.D.U./ ! / CXZXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXDXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXVXBXQ.{ Q Q [ T.[.T.~.~.T.T.T.Y.P.P.P.L.L.L.L.S.L.H.L.H.H.D.P.G.S.S.S.G.A.G.A.A.G.g.A.A.z.h.g.z.h.h.h.g.g.l.a.l.x.j.h.l.h.g.h.h.D.A.A.z.A.h.h.h.h.A.A.A.A.A.A.G.A.G.A.A.G.G.G.S.S.S.S.S.S.S.S.S.S.H.G.S.S.H.H.H.H.H.H.H.H.H.H.S.H.H.K.H.H.H.H.H.H.G.L.L.L.H.A.L.L.L.U.U.T.P.T.T.U.Y.U.U.L.Y.L.L.L.L.L.L.S.S.H.L.L.L.L.L.L.T.U.I.T.T.U.I.T.U.U.T.T.I.T.T.U.U.T.U.T.Y.T.U.Y.U.T.T.T.Y.R.~.T.T.~.~.~.~.~.~.~.!.~.T.~.~.~.T./.T.T.T.(.~.~.~.~.(.~.~.!.~.~.T.~.T.~.T.T.T.T.~.~.~.~.T.~.~.T.~.T.~.T.T.T.~.~.XXE.E.Y.T./.R.~.~./.~./././././.(.(.(.(._.(.(.(.(.(.(.[.`.(.(.(.~.[.(.(.^.(.(.(.(.|.|.|.`.`.|.|.|. X.X.X",
+"J H H H H D H H H H H Z H H H H H H L H J J J J H J L J P U P P P P P J P P P P I P ) J I K ) I I I I I ) Y Y ] ) ` ` ` ` ` c.[ ` c.[ c.c.c.c.c.c.c.c.N.c.n.n.v.N.v.N.n.N.n.C.N.V.V.V.V.V.V.V.B.B.OXlXkXlXjXjXjXOX0.6.%.$.$.N.N.V.C.N.N.N.N.N.N.V.V.V.B.lXUXUXUXkXjXrX7.6.6.%.%.3.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 6 3 6 C.B.lXOXrX0.0.0.7.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.%.&.#.$.8 6 < 1 B.$XbX$XbX$X$X$XlXkXkXlXjX0.7.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.8 6 < 1 7 $X$X$X$XbXJXjXjXjX0.0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.#.$.8 3 1 1 V.$X$X$X$X$X$X$X$X$XlXUXUXkXjXjX0.7.6.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.8 6 6 < &X$X$X$X+X$X+X+X+X+XlXkXlXkXlXrX0.7.7.7.7.7.7.7.7.7.7.7.7.0.6.6.3.&.$.$.$.C.E.J.J.E.J.J.G.W.J.G.G.W.I.J.J.J.I.E.E.E.I.E.E.I.E.E.R.I.E.E.I.I.J.J.J.W.W.W.A.G.G.S.A.W.G.W.A.G.A.Z.G.W.A.S.G.S.G.A.Z.G.G.S.S.H.H.G.H.S.H.S.H.H.H.H.D.H.L.H.H.S.G.L.G.H.S.J.D.H.H.L.H.D.P.L.H.L.L.H.D.L.D.H.H.H.H.G.G.H.H.D.K.S ! / CXZXCXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXBXm.[ Q Q [ ~.~.~.T.T.T.T.T.T.Y.U.U.L.L.L.L.L.L.G.L.G.H.H.D.H.G.G.S.H.H.G.G.H.A.A.A.h.S.h.S.h.h.h.h.g.z.z.z.k.l.g.h.z.h.l.l.A.h.h.h.A.h.D.g.A.A.Z.h.Z.A.A.A.A.G.A.A.G.A.A.A.S.S.S.G.S.S.S.S.S.S.S.S.D.P.H.H.H.H.H.H.G.H.F.H.H.H.H.H.H.h.Y.S.H.S.L.G.H.L.L.L.L.L.L.L.U.U.U.T.U.T.T.L.U.U.P.L.U.U.L.L.L.U.L.L.L.L.L.L.U.U.U.U.R.T.L.I.I.U.T.T.U.T.T.U.Y.U.T.U.U.Y.Y.L.Y.U.I.T.T.T.T.T.Y.T.Y.T.T.T.Y.T.~.~.T.~.~.~.T.~.~.~./.~.T.T.~.T.~./.T.~.~.~.~.~.~.~.~.~.~.T.T.~.T.T.~.~.~.~.T.~.~.T.T.~.~.~.~.T.XXU.{././.T.~.~.~./././././././.(.(.(.(.(.(.(.(.(.(.(.(.^.(.(.(.`.(.^.{.|.(.(.(.|.(._.^.|.`.|.`._..X.X.X",
+"H H H H H H H H H H H D F H H H H L L H P H H H U K L P P L P P J I J J I J J I I P I I P I I I ` I Y _ ) ` ` ` ` ` ` ` ` [ c.c.c.c.c.c.c.c.N.c.N.N.c.c.N.c.N.N.N.v.N.N.N.V.V.V.V.V.V.V.B.lXjXlXjXkXjXjXlXlXjXjX0.7.3.#.8 6 N.V.n.N.N.N.N.N.V.V.V.B.V.lXUXUXkXkXrXrX7.7.4.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.6 3 3 6 C.B.B.aX0.0.rX0.0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.8 6 3 1 q.$XbX$XbX$XbX$XkXkXkXjXOX0.6.3.3.%.1.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.$.8 3 1 1 $X$X$X$X$XJXjXjXjX0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.8 6 < 1 q.$X$X$X$X$X$XbX$XbXUXkXUXkXjX0.0.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.%.#.$.$.8 6 < i $X$X$X$X$X+X+X$X$XlXkXkXjXrX0.0.6.6.6.7.6.7.7.7.7.7.7.7.7.6.3.#.#.$.8 < n.&XE.J.E.J.J.J.J.J.J.J.J.E.J.J.J.E.E.E.E.E.E.E.E.).E.E.E.E.E.E.E.K.J.W.J.E.W.W.W.H.W.H.A.G.S.A.G.G.S.S.G.G.A.H.G.G.S.G.A.G.S.S.Z.J.H.A.A.H.H.H.D.J.S.H.H.J.S.L.S.H.H.S.S.D.S.L.H.D.D.L.G.H.L.D.H.H.H.H.A.L.D.G.S.L.L.L.L.H.L.G.~ / ! HXAXAXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXAXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXSXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXDXDXAXDXFXFXFXFXFXFXDXAXFXFXFXDXDXDXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXDXHXQ.{ ! ! [ ~.~.T.~.~.T.T.T.T.T.U.L.L.L.L.L.L.L.H.L.L.D.L.G.H.S.H.H.S.S.G.S.S.A.A.A.A.h.h.A.z.A.S.g.g.k.g.g.g.z.h.h.g.h.h.G.z.A.h.A.A.S.S.l.A.A.h.h.j.A.G.A.A.A.G.H.A.S.S.S.S.S.S.S.G.S.A.S.G.A.D.S.H.S.K.G.H.H.H.H.H.S.H.H.H.H.H.H.H.H.H.H.S.H.H.H.H.H.H.L.L.L.L.L.L.L.Y.T.T.U.U.Y.L.T.L.L.U.U.L.L.L.L.L.U.L.L.L.L.L.L.T.L.T.U.U.Y.U.T.T.U.T.T.U.T.I.U.I.I.L.L.Y.U.P.P.U.T.T.I.T.T.T.T.T.T.~.T.~.~.T.~.~.~.~.~.~.~.~.~.T.~.T.(.~.T./.~.~.~.~.!.~.T./.T.T.T.T.~.T.~.~.~.~.~.T./.~.~.~.T.~.~.~.~.~.~.~.~./.Y.T.~.~.~.~.(.T./././././.(.^.^.(./.(.(.(.(.(.(.(.(._.[.(.^.(.(.{.(.(.(.^.^._.{.|.`.{.|.|.|.|..X.X",
+"H D H H H H F H Z H H H H H H H H H H L H H J H H J J P P P P J I J I Y Y I I I I P I I I I ) I I I Y ` ) ` ) ` ` ` c.` c.c.c.c.M.c.c.N.c.v.N.c.c.N.N.N.v.N.N.N.N.N.N.N.V.V.V.B.B.OXlXlXlXjXjXlXkXjXkXjXjXjXjXjX0.6.*.$.6 < C.V.V.V.V.V.V.V.V.V.V.V.].UXUXUXkXjXrX0.7.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 6 3 < 8.B.B.B.0.0.0.0.0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.$.$.6 3 1 4 $X$XbXbX$X$XbXUXkXkXrXrX7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.$.6 4 < < C.$X$X$X$XbXjXjXjX0.0.7.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.#.$.6 < 1 9 $X$X$X$X$X$XbXbXJXUXUXkXjXjX0.6.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.$.8 < < < &X$X$X$X$X$X$X+X$XlXkXjXjXrX0.6.6.3.6.6.6.6.6.6.7.7.7.7.7.3.3.#.8 6 < 9 &XE.E.E.E.E.J.J.J.J.J.J.J.J.I.E.E.E.E.&X).E.E.).).).).).E.E.).E.E.I.E.E.J.J.J.W.J.S.G.J.W.A.G.W.G.H.G.G.J.Z.L.H.H.H.A.G.G.H.S.J.G.A.G.H.H.G.G.G.H.H.G.H.K.A.L.S.H.H.S.H.L.H.H.S.H.G.G.L.L.S.H.H.H.H.H.G.L.D.H.S.S.D.D.H.S.L.G.L.~ ~ / CXAXAXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXDXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXAXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXAXDXFXFXFXFXFXFXFXFXFXFXGXSXDXAXFXFXFXFXFXFXAXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXfXpX[ / ^ [ T.~.~.T.T.T.T.T.T.U.P.L.L.L.L.L.L.L.L.H.L.H.G.L.L.H.H.H.G.H.S.S.G.A.A.A.A.h.A.h.A.h.h.A.h.g.h.h.h.l.l.h.h.h.g.g.S.h.S.z.A.h.z.h.h.h.A.h.h.A.A.A.G.A.h.A.S.S.h.h.A.S.S.S.S.S.S.S.G.G.G.S.G.S.A.A.G.Z.H.A.S.H.H.H.H.H.S.H.H.H.H.H.L.S.U.L.S.Y.S.L.L.G.L.L.U.U.P.P.T.U.T.U.Y.U.U.U.U.L.P.L.L.P.L.P.L.L.U.Y.L.U.U.U.U.U.T.L.U.U.U.T.T.T.T.U.Y.I.Y.I.U.U.U.L.L.U.U.L.T.I.P.T.T.Y.T.T.T.T.T.~.~.~.~.T.~.~.T.~.T.~.~.~./.T.T.~.T.~.T.~.T.~.~.~.~.T.~.T.T.T.~.T.~.~.~.~./.~.~.T.~.~.T.T.~.~.~.T.~.T.T././.~.(.~./.~.(.!././././././.(.(./.(.(.(.(./.(.(.{.(._.(.(.(.`.^.(.(.(.`.(.`.(.`.`.^.|.|.|..X|..X",
+"H D F H H H H H H Z H D H H H H H H H H L L H L J D L P P I P P I I J J J L K I ) I I I I I I P ` I ) ] ` _ ` ` ` [ c.c.c.c.c.N.c.v.n.M.n.N.N.N.N.N.N.N.N.V.V.V.V.V.V.V.V.aXlXlXkXkXkXjXlXjXjXlXkXjXjXjXrXjX0.0.7.3.#.8 6 1 C.V.V.V.V.V.V.V.V.B.B.B.lXUXUXkXkXjXrX7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 6 3 3 q.hXB.B.0.0.rX0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.8 6 < 1 1 ].$X$X$XbXbXlXkXkXjXjX0.0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.8 3 1 1 q.bXbX$X$X+XjXrXjX0.0.7.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.1.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.8 6 < 1 1 V.$X$X$X$X$X$XbXUXkXkXlXjX0.0.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.8 6 < 1 v.$X$X$X$X+X$X$X$XlXjXjXrXrX0.6.3.%.%.3.%.6.6.6.6.6.6.6.6.%.#.$.7 < X 7 &XE.E.J.E.I.J.J.E.J.J.E.W.E.E.E.E.E.+X&X).).).).).).).).).).).).E.E.E.E.E.J.I.E.J.J.J.J.S.H.S.W.J.H.J.G.H.H.J.A.L.Z.S.S.A.S.H.H.H.J.H.H.H.G.H.G.H.H.H.H.H.H.H.H.H.H.S.H.D.L.D.H.H.H.G.G.G.H.H.H.H.G.L.D.S.U.S.S.S.J.S.L.L.L.D.L.P ! ! CXVXFXFXFXFXFXFXFXFXFXFXFXDXAXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXDXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXDXAXFXFXFXFXFXFXFXFXFXFXFXAXAXDXFXFXFXFXDXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXVXDXHXBXQ.{ Q ^ [ T.~.~.T.T.T.T.T.T.T.U.L.L.L.L.L.D.L.L.L.L.L.G.H.L.L.S.H.L.H.H.S.G.Z.A.A.A.A.h.G.A.j.A.h.A.h.h.h.z.h.h.h.h.h.h.A.h.A.g.A.g.A.h.h.h.A.A.A.h.A.A.A.A.A.A.A.A.A.A.A.S.z.G.A.S.S.S.S.G.A.G.G.S.S.S.G.H.H.H.H.S.H.H.H.H.H.H.H.H.H.H.H.H.H.H.S.L.Z.L.H.L.L.U.L.L.P.U.P.U.Y.U.U.U.U.T.P.P.P.P.P.L.L.L.U.P.P.P.P.Y.P.L.Y.T.T.U.T.T.U.U.T.T.T.U.T.I.T.U.T.U.U.L.Y.Y.U.L.T.U.U.U.L.P.T.P.T.T.T.T.T.~.T.~.T.~.T.T.~.T.~.~.T.R.~.R.R.~.T.T.~.~.~.T.T.T.~.T.T.~.T.~.~.~.~.~.~./.~.~.~.~.T.~.!.~.~.(.~.~.T./.R.T./.T./.!./././.[.^./.(./.(.(./././.(./.(.(.(.^.(.(.(.(.(.(.[.^.|.(.(.(.(.`._.(.`.|._.|.|.|.|.|.",
+"H H H H H F H H H D K H H F H F H H Z H H H H H P P L P J K J P J I I Y I I I I I I I ) ` I I ` I I ` ` ` ` ` ` c.[ c.c.c.c.M.c.N.n.N.N.N.N.N.N.N.N.V.V.N.V.V.V.V.V.lXlXkXUXkXkXkXjXkXjXjXjXjXjXrXrXrXrXrX0.0.0.3.*.$.6 < X x V.B.V.V.V.V.B.V.V.B.B.UXUXkXkXjX0.7.9.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 6 < 3 8 B.B.B.OX0.0.0.0.7.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.1.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.8 3 < 1 8.bX$XbX$X$XkXkXkXkXrX0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 < < 7 #X$X$X$XlXjXjXjX0.0.6.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.=.8 < 1 1 v.$X$X$X$X$X$XJXUXUXkXjXjX0.6.%.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.$.6 < 1 8 $X$X$X$X$X$X$X$XjXlXjXjX0.7.9.%.%.%.%.%.%.%.%.%.%.6.3.3.*.$.6 < 1 . F E.&XE.E.E.J.E.J.J.J.E.J.E.E.K.+XlXlXB.$X+X+X+X).+X+X+X).).+X).).).).).E.E.E.I.E.E.W.L.J.L.J.J.J.H.J.H.I.G.J.J.I.J.H.J.S.J.H.S.H.H.H.H.H.H.J.H.H.G.H.H.G.W.S.H.H.H.H.H.H.H.A.A.D.H.H.S.L.G.H.H.G.A.S.D.L.S.S.S.S.D.L.S.S.S.L.H.H.~ / ! ZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXAXGXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXAXFXFXZXZXBXm.[ Q ^ [ T.~.T.~.~.T.~.T.U.U.U.L.L.L.L.S.H.L.L.H.H.L.U.D.L.L.L.L.H.H.H.S.G.G.Z.A.A.A.A.z.S.A.A.g.h.A.A.h.k.h.g.z.A.g.S.h.h.g.S.g.G.g.h.l.h.h.A.h.A.h.A.A.A.A.A.G.A.A.A.A.A.S.A.S.S.S.S.A.H.G.G.l.G.A.S.G.Z.G.H.S.H.S.S.H.H.H.H.H.H.H.S.U.H.S.U.U.S.H.H.H.S.L.L.L.U.P.P.P.Y.Y.T.U.T.T.P.Y.Y.P.P.P.P.L.U.L.P.P.L.U.U.P.L.Y.U.T.U.U.U.T.T.U.T.T.T.U.T.I.U.U.U.U.U.L.U.L.U.L.L.I.U.U.P.T.T.P.~.T.T.~.T.~.T.~.~.T.~.T.T.T.T.~.~.~.~.~.T.~.~.T.~.T.~.T.T.T.T.~.T.~.T.~.~./.~.~./.~.~.~.~.!.~.~.~.~.~.~.~.(.(.~./.!./.(.(././././.(.[.E./.(.~./.(././.(./.(.(.(.XX(.(.^.{.^.`.!.(.(.(.(.(.(._._.`.{._.|.|.|.'..X",
+"D F D Z H H H H H H G F D H H H H H H H H H L L F P P L L I I L P Y I I I I I I I I I I I ) I ) ` ` ` ` ` ` c.` ` c.c.c.N.N.N.N.N.N.N.N.N.V.V.V.V.V.V.M.V.OXC.V.V.B.lXkXkXUXUXkXkXjXjXjXjXrXrXrX0.0.0.0.7.7.6.6.%.$.8 6 1 X x B.B.V.V.B.V.V.B.B.OXlXUXUXkXjXOX0.6.6.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.8 6 < 3 7 B.B.lXOXrXOX0.0.0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.8 4 1 1 7 $XbX$X$XbXkXkXjXjXjX0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.$.6 < 1 < +X$X$X$X$XjXjXjX0.0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.=.8 < 1 1 i $X$X$X$X$X$XUXUXkXkXjX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.6 < 1 1 ).$X$X$X$X$X$XbXkXkXjXjX0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.&.$.8 3 1 . X v.+XE.E.E.E.J.J.E.J.J.E.E.E.E.E.JXkXkXjXrXOXOXB.@X+X+X+X+X+X+X+X+X&X).).).).E.E.E.K.E.W.E.I.I.J.L.I.I.J.I.J.I.J.J.J.J.J.J.H.J.H.J.U.H.H.J.J.H.L.H.H.J.A.H.G.S.J.H.A.G.H.H.A.H.A.H.H.H.A.H.D.H.G.G.A.G.G.S.S.H.S.H.H.H.S.H.H.H.H.H.! ! / BXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXDXAXGXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXAXDXAXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXZXZXBXQ.} Q Q [ T.~.T.T.Y.~.T.T.T.T.I.L.I.H.Y.H.P.U.L.L.D.L.L.L.L.L.L.L.A.D.G.H.A.S.S.A.A.A.H.A.A.A.A.A.A.A.A.g.D.g.g.A.A.h.S.A.h.h.h.l.h.l.l.l.h.h.G.A.D.h.A.A.A.A.A.A.Z.A.A.A.A.A.A.H.G.S.S.S.G.h.H.G.A.G.G.A.S.S.S.S.S.S.S.S.H.H.H.H.H.H.H.H.H.H.L.H.H.D.H.L.S.L.L.L.L.P.U.L.Y.U.U.Y.U.U.T.U.Y.U.U.U.L.U.U.U.P.P.P.P.L.P.Y.P.T.Y.T.T.P.T.T.T.U.I.U.T.U.T.U.T.L.L.L.U.L.U.L.P.Y.L.P.L.U.U.U.U.T.Y.T.~.T.T.T.~.T.~.T.T.T.~.T.T.T.~.~.T.T.T.T.T.[.T.T.~.T.T.T.~.~.~.U.E.[.~.~.(./.~.~.~.~.~.~.!.~.!.~.~./.~.~.~././.E.{.[.(.~.^./././.(././.(./.(./.(././.^./.^.(.(.(.(.(.(.(.[.(.{.(.(.{.^.(.`._.|.|.|.|.|.|.|.",
+"D H H H H F H H H H J J H H F J H D J F L L L L L H L Y L I I I I ) ) I I I I ) I I ` I ` I _ ` ` ) ` ` ` ` c.c.c.c.N.c.c.N.N.M.N.V.V.V.V.V.V.V.V.B.jXOX0.7.0.C.B.B.lXkXkXkXkXkXkXjXrXrXrX0.0.0.7.7.7.6.6.6.6.%.*.$.8 < 1 X 4 B.B.B.B.B.B.B.B.B.OXUXUXlXkXjX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 6 3 6 B.B.OXOX0.0.0.0.7.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.8 6 < 3 7 $XbX$X$XbXkXkXkXjX0.7.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 < < < OX$X$XbXbXjXjXjX0.0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.8 3 1 1 7 $X$X$X$X$XNXkXkXkXkXjX0.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 3 < 1 q.$X$X$X+X+X$XlXkXjXjX0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.#.$.6 1 X . X &X).&XE.E.E.J.E.J.E.E.E.E.E.).).kXUXkXkXjX0.7.7.6.0.OX+X%X#X#X+X+X+X+X+X&X&X].E.).E.E.K.E.E.J.E.I.J.I.U.J.J.I.I.J.L.L.I.J.L.J.L.I.J.H.J.J.J.J.H.J.H.H.H.H.S.G.Z.H.H.H.h.H.H.H.H.H.H.H.Z.H.S.G.S.S.H.H.H.Z.S.G.G.A.H.A.G.H.S.S.H.L.~ ! ! CXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXDXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXDXSXAXDXFXFXFXFXFXFXFXFXFXFXGXAXDXDXAXDXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXVXBXpX` Q n [ ~.~.~.T.T.T.T.T.U.Y.L.K.I.L.K.K.D.S.L.S.L.L.L.L.G.L.L.L.P.L.H.D.G.G.S.S.A.H.S.A.A.G.A.A.A.h.A.A.g.D.g.A.h.A.g.h.h.h.h.l.l.l.l.l.h.h.h.g.h.l.h.A.A.l.A.A.A.A.A.A.A.A.h.A.A.A.S.S.G.G.A.A.A.A.A.G.A.S.S.S.S.S.S.S.H.H.H.Z.H.H.H.H.H.H.H.H.H.H.H.H.P.L.S.L.L.L.L.Y.U.L.U.T.Y.Y.Y.U.U.U.L.U.L.L.U.U.P.P.P.P.U.L.Y.T.T.P.U.T.T.T.U.T.U.T.U.U.T.L.U.U.U.T.U.L.L.L.U.U.U.L.L.L.U.U.Y.Y.I.Y.T.T.T.T.T.T.T.~.T.~.T.T.~.T.T.~.T.~.T.T.T.T.U.T.T.T.T.~.T.T.T.~.XXXXT.~.~.T.~.~.!.~.~.!.~.~.~.[.!././././.[./.(.^.T.^.^.[.(./././.(.(.)./.(./.(././././.(.(.(.(.[.(./.(.(.(./.(./.(.(.(.(._.(.|._._.|.|.|._.",
+"Z K D H H H H F H H D H H H G H H F L H H L L U I I U K I I Y ) ) ) I _ K I I K Y _ Y ] I ` ] ` ` ` ) ` c.[ [ v.c.N.v.N.N.N.N.V.V.V.V.B.V.B.aXlXlXjXrX0.7.7.6.OXB.B.B.kXkXkXkXjXrXrX0.7.7.7.6.6.6.6.3.%.%.%.%.%.*.$.8 < < X 1 B.+XB.B.B.B.B.B.B.lXUXUXkXjXjX0.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.8 6 3 4 6 C.B.B.B.0.0.0.0.7.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.#.8 6 < < 3 B.$X$XbXlXkXjXjXrX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.8 8 < 1 < q.$X$X$X$XjXjXjXrX0.7.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.8 6 1 1 1 $X$X$X$X$XlXkXkXkXrX0.7.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.8 6 1 1 i $X$X$X$X+X$X$XjXjXjXjX0.6.3.%.%.%.%.%.%.%.%.%.%.&.&.#.$.3 1 . . 4 &X&X).&XE.&XE.J.E.E.J.E.E.&X).&XUXUXUXkXjX0.0.7.7.6.7.6.7.OXOX+X+X$X+X+X`.&X+XE.&XE.E.E.R.E.E.W.R.I.I.E.I.J.I.I.I.I.J.I.J.J.I.U.J.J.J.J.J.L.L.H.H.W.H.H.J.W.S.A.H.A.H.H.S.S.S.S.G.S.H.G.S.S.S.S.G.H.H.G.G.S.S.H.G.H.S.S.S.S.S.S.S.~ / / HXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXDXFXFXDXDXGXAXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXDXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXDXAXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXVXBXQ.[ ! S [ ~.T.~.T.T.T.T.T.T.U.U.Y.L.L.D.U.U.L.H.L.L.L.L.L.U.L.D.L.S.L.L.L.H.H.G.G.G.S.S.A.G.A.h.A.h.A.A.A.A.h.S.z.A.j.A.h.h.h.l.l.l.l.l.l.A.l.h.A.D.h.l.h.h.A.h.A.h.A.A.A.A.A.A.h.A.A.A.S.h.S.A.A.A.A.G.A.A.H.S.S.S.S.A.H.H.S.S.H.H.H.S.H.H.H.S.H.H.H.H.H.S.L.P.L.S.P.U.L.L.Y.U.L.I.Y.U.U.U.L.L.U.Y.I.U.U.L.U.P.U.U.T.U.T.T.T.T.U.P.T.P.Y.T.U.T.U.U.T.T.L.U.U.L.L.L.L.L.L.L.L.P.L.P.L.L.U.I.T.T.T.U.~.T.T.T.T.T.T.~.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.~.T.T.~.~.T.~.~.~.(.(.(.~./.~.!.~.~.~.~.~.~./.~.~.~./.!.~.(./.(./.(.~./././././.~.^././.{.^././.(.(.(.(.(./.^.(./.(.(.^.(.(.(.(.(.^.(.(._.|.|._._.|.|._.",
+"H H H H H D H H H H L F H L J L K L G K H U K I U I U ` ) Y I ` Y I ` Y v.Y ` Y ` ` I ` ) ` ` ` ` ` ` ` ` c.c.c.c.c.N.N.N.N.V.V.V.aXaXjXlXlXkXjXkXjX0.7.4.3.&.8.B.B.OXjXjXjXjXjXrX0.7.6.6.6.3.4.3.%.%.%.%.%.%.%.&.$.8 3 1 1 . B.B.B.B.B.B.B.lXB.kXUXkXkXjX0.7.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.$.$.6 6 3 < C.B.B.B.0.0.0.0.0.7.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.3.#.#.8 6 3 3 6 C.$XbX$XlXkXkXjXOX0.7.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.6 3 < < q.$X$X$XbXjXrXjX0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 7 < 1 < +X$XbX$X$XkXUXkXkXrX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.8 6 < 1 1 $X$X$X$X$X$XlXjXlXjX0.0.7.3.%.%.%.%.%.%.%.%.%.%.%.*.$.8 < 1 . . i ).).&XE.&XE.E.E.E.E.E.E.&X&X&X+XUXkXkXkXrX0.0.7.7.7.7.7.7.6.7.7.0.OXB.#X+X+X&X+X&X).).).E.E.E.E.E.E.E.I.E.I.E.E.I.I.E.I.E.E.I.J.E.I.U.J.I.J.J.J.U.K.J.G.H.G.G.G.A.J.A.J.G.S.S.S.H.H.h.G.S.S.S.S.S.A.l.H.A.G.S.A.A.A.S.S.S.S.S.S.D.P ! ! ZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXAXFXFXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFXBXm.} ~ ~ ` T.~.T.T.T.T.T.T.T.T.U.U.L.U.L.L.L.L.S.L.L.L.L.L.U.U.L.L.L.D.L.G.H.H.H.G.A.H.S.S.A.A.J.A.A.A.A.A.h.A.h.A.S.j.A.A.A.A.l.h.h.l.l.g.h.h.g.k.l.l.A.z.A.A.h.A.h.Z.A.h.A.A.A.A.A.A.A.A.J.h.A.A.A.A.A.A.A.A.A.S.A.S.H.A.A.S.H.H.H.G.H.H.H.S.H.H.H.H.H.H.L.L.S.L.L.L.L.L.L.L.L.L.L.L.Y.U.Y.L.U.U.L.I.U.U.Y.Y.U.U.L.L.T.U.T.T.U.T.T.P.P.U.U.U.U.U.U.U.U.K.L.Y.L.L.L.L.L.L.S.L.S.L.L.L.P.P.I.I.T.T.T.U.~.~.~.T.~.~.T.~.~.T.~.T.T.T.T.T.T.U.U.T.T.T.~.T.~.U.~.~.~.~.T.~.~.T.~.~.~.[./.~.!.~.~.~.~.~.!.~.~././.~./.(.(./.~.(.!.(./.(.{.^.^./.(./.(.(.(./.(.(.[.^.(.!./.(./.(./.(./.(.(.(._.(.|.{.^.{.|._.|.|.",
+"H H H D K H H D J F H J L L L L L L U H J I I I K ` Y ] I Y ] Y ` Y ` Y ) ` Y ` ` _ ` ` ` ` ` ` ` [ c.[ c.c.M.c.c.N.N.N.V.V.B.lXjXkXkXkXkXkXjXkXjXjX0.6.4.3.#.q.B.B.B.OX0.rXrX0.0.7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 1 X X M.B.B.B.B.B.B.B.B.kXUXkXjXOX0.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.$.6 3 3 6 q.B.B.B.OX0.0.0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.8 7 < 6 6 C.+X$XbXlXjXjXjXjX0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.8 < < < 7 bXbX$X$XrXjXrXOX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 < < < B.$X$X$XNXkXkXkXjXrX7.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 < 1 X V.$X$X$X$X$XlXlXjXjXjX0.6.%.%.%.%.%.%.%.%.%.%.%.%.*.$.6 < X . . v.&X&X&X).E.E.E.E.E.E.E.&X).&X+XbXkXkXkXkXjX0.7.7.7.7.7.7.7.7.7.7.7.6.7.7.0.OX&X&X&X).E.).).~.E.E.E.E.E.E.E.E.T.E.I.I.E.R.E.I.E.E.J.I.E.J.I.J.J.J.I.G.J.J.J.G.G.H.J.G.J.J.G.S.S.Z.H.A.G.G.S.A.H.H.A.H.H.H.A.G.A.H.H.l.G.A.W.D.S.S.S.S / ! BXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXDXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXAXFXFXFXFXAXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXZXDXZXZXQ.{ ! ~ [ T.~.T.T.T.T.T.T.U.T.U.I.P.L.L.L.D.L.A.U.L.L.L.P.L.L.L.L.L.H.L.S.G.H.H.H.H.h.S.S.G.A.S.S.A.l.A.A.A.A.g.A.A.A.A.h.A.l.h.h.h.h.h.A.h.h.h.h.h.A.h.D.h.A.A.h.A.A.h.A.A.h.A.A.A.A.A.A.A.A.A.A.A.A.A.h.A.S.A.A.H.A.H.H.S.S.S.S.G.G.S.G.H.H.S.H.S.H.H.D.L.L.L.S.L.L.L.U.L.L.L.U.I.U.U.Y.L.Y.L.U.P.P.U.U.L.U.L.Y.U.U.T.T.T.U.T.U.U.U.L.Y.L.U.Y.I.U.U.U.U.L.Y.L.L.L.S.L.S.L.L.S.L.L.L.L.U.U.T.U.T.T.T.T.T.T.~.T.T.T.~.~.T.T.T.T.T.T.U.T.Y.U.T.T.T.T.[.T.[.~.T./.T.~.~.~.~././.~.!./.~.~.~.~.~.~./.E.^.[././././.(.(.[././.~././././.(.(.^.(.(.[.^.^.(.^.^.(./././.(./.(.(./././.(.(.{.(.(.^.|.`.^._.|.|.|.",
+"H D H H Z H H H K G H L L G J L U J K Y Y I Y I Y I Y Y ` ` ` ` ` Y ` ` Y ` ` ` Y ` ` ` ` ` ` ` [ ` c.c.c.c.c.n.N.N.N.B.lXlXkXkXkXkXjXkXjXjXjXjXjX0.7.%.$.$.8 #.B.B.B.OX0.0.0.0.7.6.3.3.%.%.%.%.%.%.%.%.%.%.%.&.&.#.$.6 < X X C.B.B.B.B.B.B.+XlXUXkXjXjX0.7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 6 3 3 q.hXB.B.0.0.0.0.0.7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.=.6 3 6 6 q.$X$XbXlXlXjXjX0.0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.<.%.%.%.%.%.%.%.%.%.%.#.$.8 6 < < 3 $X$X$X$XjXjXrX0.0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.$.$.6 < < < V.$XbX$XkXkXjXkXjXrX7.6.%.%.%.%.%.%.%.%.<.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.$.6 < 1 X C.@X$X$X$X$XlXlXjXjX0.0.6.%.%.%.%.%.%.%.%.%.%.%.&.*.$.6 < X . . E.+X&XE.&XE.E.E.E.E.&XE.[.).&X+XlXlXkXkXjXrX0.7.7.6.6.7.6.7.7.7.6.7.6.7.7.6.6.3.6.C.B.+X).{.).).).).E.).).E.E.).E.).E.E.E.).E.E.E.E.E.E.E.I.E.E.I.J.I.J.H.J.W.G.J.G.G.G.A.A.G.S.G.A.G.A.A.A.A.A.A.G.A.A.G.A.h.J.A.A.A.A.A.A.S.S.S.S.P ! / ZXAXFXZXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXSXGXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXZXZXZXBXpX[ ~ ~ [ ~.T.~.Y.T.T.T.P.T.U.U.I.P.L.L.L.L.L.L.L.L.L.L.P.L.L.L.U.L.S.L.L.L.G.H.H.H.K.S.G.G.H.S.S.S.S.A.A.A.A.A.A.A.A.A.A.z.A.g.D.S.l.h.g.h.h.z.z.h.h.z.D.A.h.h.D.A.h.l.D.A.H.h.h.A.A.A.A.A.A.A.A.A.A.A.J.A.A.A.A.A.A.h.H.S.S.S.S.G.S.S.H.H.S.H.A.H.H.H.H.S.L.P.S.S.L.L.L.Y.L.L.Y.L.I.L.U.U.L.U.L.P.L.P.U.U.L.L.U.L.L.P.T.T.T.Y.U.T.U.U.U.U.L.L.L.L.K.Y.L.L.L.L.L.L.L.L.S.S.L.S.L.L.L.L.U.U.U.U.U.U.T.T.T.T.T.^.T.T.T.Y.T.Y.T.T.Y.T.U.U.P.T.U.U.T.T.T.T.T.~./.T./.~.~.{.T.~././.~./.~./.[./.!./.~.^./.^.~././././.~.(././.^././.(.(.(.(.(.(.(.(./.{.E./.^.(./././.~.^././.(././.(./.(.(.(.(.(.(.`._.`.{.`.",
+"F H F S H H Z H L L F L Y H H L L J U I I Y Y I I Y Y ` ` ` ` ` ` v.` Y v.` ` ` ` ` ` ` ` ` ` ` v.c.c.c.c.c.N.N.N.N.UXUXkXUXUXkXkXjXjXjXjXrXrXrX0.0.4.*.$.8 6 6 B.B.OXB.0.7.7.0.7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.8 6 3 1 X c B.+XB.B.B.B.B.kXkXkXjXjX0.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.8 6 3 3 7 B.lXB.OX0.0.0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 6 6 q.bX$X$XOXjXjXjXrX0.9.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 < 3 6 B.@X$X$XjXjXrXrX0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.8 6 3 < 6 C.$X$X$XlXkXlXjXjX0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.#.$.6 3 1 X q.$X$X$X$X$XlXjXlXjX0.0.6.%.%.%.%.%.%.%.%.%.%.&.&.#.$.< 1 . . 1 +X+X%X&X&XE.E.&XE.&XE.).&X).+X+XlXkXkXjXrX0.7.6.6.6.6.6.6.6.6.7.7.6.7.7.6.6.6.&.*.$.$.8 q. X&X`.).+X).)./.).E.).E.+X).E.E.E.E.).E.E.).E.E.E.E.I.E.I.I.J.I.J.K.W.W.H.S.W.G.Z.G.A.A.H.A.G.G.G.H.A.A.l.A.H.A.A.A.A.A.A.A.A.A.A.A.A.z.S.S / ~ ZXVXVXZXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXDXFXFXFXFXFXFXAXDXDXAXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXZXZXBXm.{ Q ^ [ T.~.T.T.T.T.T.U.T.U.U.L.P.P.L.L.L.U.L.S.L.L.P.L.L.P.U.S.L.L.L.S.L.L.L.H.H.H.H.S.H.H.S.S.S.S.S.A.A.A.A.A.A.A.A.A.A.A.h.z.z.D.g.g.h.z.h.h.h.h.l.h.h.A.A.h.h.h.l.g.h.A.A.A.Z.h.A.A.A.A.h.A.h.A.A.A.A.A.A.S.A.H.S.S.A.A.S.A.S.S.S.S.D.G.H.H.S.H.S.S.L.S.L.L.L.L.L.L.L.L.L.L.L.U.U.U.U.U.L.U.L.P.L.U.L.U.L.U.Y.Y.T.P.T.T.T.T.Y.U.U.L.Y.L.L.L.U.U.L.L.L.L.A.S.L.L.F.H.S.S.L.L.L.L.L.P.U.U.U.U.U.T.T.T.T.~.T.T.~.T.T.T.T.T.T.T.U.U.U.U.U.U.U.T.T.T.T.~.~.T.T.~.~.~.T.~.~./.~.[.~.~.~.!././././././././././.(./.[.(.^./././.[.(.(.(.(.(.(././.(./.(././.!./.(././././.~./././.(./.(.(.(.(.(.(.|.{._.|._.",
+"D H H H H H H F L L L J H H L K Y Y J Y Y I ` ` Y v.v.Y v.` v.v.` v.v.v.` v.v.` v.` v.` c.` c.c.[ c.c.c.c.N.c.N.N.V.UXUXUXkXkXkXjXjXjXrXrXrXrX0.0.6.3.$.8 6 6 3 C.&XlXB.0.7.0.7.0.6.6.3.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.8 3 1 X q.B.OXB.B.B.B.lXkXkXkXjXrX0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 3 6 7 B.B.B.OX0.0.0.0.0.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 6 6 q.zXbX$XjXjXrXrX0.0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.8 6 3 3 6 V.$X$XbXjXrXjXrX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.%.%.%.%.%.%.%.%.%.%.%.%.&.$.$.6 6 6 6 8.@XbX$XkXjXlXjX0.0.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.3.#.$.6 3 1 1 q.$X$X$X$X$XkXkXjXrX0.7.6.%.%.%.%.%.%.%.%.%.%.%.&.#.8 < 1 . . i +X+X&X&XE.&XE.E.E.&X[.&X&X).&X$XkXkXkXjXOX0.6.9.%.%.6.3.6.6.6.6.6.7.6.6.7.6.%.*.$.$.6 3 q.+X+X+X).).).).+X).).).).).).).).).).).).).E.E.E.E.E.E.E.E.J.E.I.L.J.J.G.H.J.G.G.G.G.A.J.h.A.G.A.A.G.h.A.G.A.A.A.G.A.G.A.A.A.A.h.h.A.A.A.A.~ ! ! CXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXGXAXFXFXFXFXFXFXDXAXDXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXZXBXm.[ ! ^ [ ~.T.~.~.Y.T.T.T.T.U.T.U.P.L.L.L.U.P.P.P.L.L.L.U.L.U.U.L.L.L.L.U.L.H.L.L.L.H.H.S.S.H.A.K.S.S.S.S.A.A.A.A.A.A.A.A.h.A.h.S.h.h.g.g.h.z.k.h.z.h.z.h.g.h.g.h.h.D.g.A.h.h.h.h.j.A.A.A.h.A.A.A.g.A.j.A.A.A.A.A.S.A.A.A.S.S.S.S.A.S.S.S.H.S.S.H.A.H.S.L.L.L.P.S.L.L.S.L.L.L.L.L.L.L.L.L.U.P.U.L.L.L.U.U.L.Y.U.U.P.P.T.T.T.Y.T.U.T.L.T.L.U.L.U.L.L.L.L.L.L.L.L.L.L.S.L.S.L.U.D.L.S.L.L.L.P.P.U.U.U.U.T.~.T.T.[.~.~.T.T.T.T.T.T.T.T.U.U.U.T.T.U.U.T.T.T.T.T.~.~.T.~.~.~.^././.~.!.^.~.~.[././.!././.(././././././././.(././././.(.(.(.(.(.(.(./.(.^././.[./.~.~./././.~././././././.(.^.(.(.(.(.{.`.`.{.{.",
+"H H H H H F H K P F F H Y F U I ^ Y I Y ` Y ` Y v.` v.v.v.b.v.v.v.v.v.b.n.v.v.v.v.v.c.c.c.c.c.c.c.c.c.c.N.N.N.N.N.B.UXkXUXkXkXjXrXrX0.0.0.7.7.7.6.3.*.$.8 6 < < 8.'.B.OXOX7.7.0.7.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.$.6 < 1 1 4 B.B.B.B.B.B.OXkXkXkXjX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 6 3 3 B.B.B.OX0.0.0.0.7.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.$.8 6 8 6 $.bX$XbXrXjXrXrX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.&.%.*.&.&.&.&.%.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.8 6 < 6 3 C.$X$X$XjXrXrXrX0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.#.#.&.#.#.*.*.*.&.%.%.%.%.%.%.%.%.%.%.&.$.$.8 6 6 6 C.$XbXlXkXjXjXjXrX0.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 < 1 1 7 @X$X$X$X$XkXjXjXjXrX7.6.%.%.%.%.%.%.%.%.%.%.%.*.$.6 < 1 . . v.&X+X&X&X&X).E.E.E.&X).).).+X+X+XkXkXkXjX0.0.9.3.%.%.3.3.6.3.6.6.3.6.6.6.6.3.%.#.8 6 < 1 C.#X+X+X+X+X&X+X+X&X+X+X+X&X+X&X+X+X+X&X+X+X&X&XE.).E.E.E.E.E.E.E.E.J.J.J.J.J.A.J.A.G.G.A.A.A.A.h.H.A.G.A.A.A.A.A.A.A.G.h.A.A.A.h.A.A.A.A.A.^ ~ ~ ZXVXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXDXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXAXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXAXFXFXZXZXBXm.} ~ ^ [ (.~.T.T.T.T.T.T.T.T.U.T.U.U.T.U.T.P.P.U.L.L.Y.U.P.L.L.U.L.U.L.U.K.H.L.L.S.L.H.H.H.H.H.H.S.H.S.S.G.A.A.A.A.G.A.A.A.h.z.A.h.h.h.h.D.g.g.g.g.g.g.h.l.l.h.A.l.h.h.h.A.h.A.g.A.A.A.Z.h.A.h.A.e.W.A.h.A.h.A.A.A.A.G.G.A.A.A.Z.H.A.H.A.D.D.H.H.G.S.H.L.S.L.H.L.L.G.L.L.L.L.L.L.L.P.P.P.P.P.L.L.L.L.L.U.L.U.U.T.U.T.T.I.T.T.T.P.U.U.U.P.L.L.L.L.U.L.S.H.L.L.L.S.H.H.H.H.S.S.S.U.S.S.L.L.L.L.U.P.P.P.U.T.T.T.T.[.T.T.T.[.U.T.T.P.T.U.U.U.P.P.Y.P.Y.T.T.T.T.T.T.~.~.~.~.~.~.~./.~./.].!./.[.~.!./.[.(.(./.(./.(./.(././.(.(.!.(.`.^.(.`.^.(.(.(.(.(.E./.~./.~.~.~.~.~./.~.^././.(./.[.[.(.(.(.(._._._.|._.",
+"H H H H H H H G L L I I K I K Y Y H ` Y ` ` Y ` b.` ` b.v.v.v.n.b.v.v.v.v.v.v.b.v.c.c.v.c.c.c.c.N.c.c.N.c.N.N.N.V.aXkXUXkXkXjXjXrX0.7.7.6.6.3.3.3.%.#.$.6 6 < < q.B.aXB.OX0.0.0.7.7.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 < 1 1 9 B.B.B.B.B.B.lXkXkXjXjX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.8 6 < 3 3 C.B.B.B.0.0.OX0.0.7.4.3.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.&.*.*.*.&.&.&.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 8 6 6 $.$XbXOXjXrXrXrX0.7.6.%.%.%.%.%.%.%.%.%.%.%.&.*.*.*.#.#.#.#.#.*.*.&.&.%.%.%.%.%.%.%.%.%.%.%.%.&.$.$.6 6 < 6 8.$X$X$XrXjXrXrX0.7.6.%.%.%.%.%.%.%.%.%.%.%.&.#.*.#.#.#.$.$.$.#.#.#.*.&.&.%.%.%.%.%.%.%.%.&.#.$.6 6 8 8 7.$X$XOXjXjXjXrX0.9.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.6 3 1 1 1 $X$X$X$XbXkXjXjXrXrX7.6.%.%.%.%.%.%.%.%.%.%.%.#.$.6 < X . X V.+X&X+X&XE.&XE.E.E.).).).&X+X+X$XkXjXjXrX0.7.6.%.%.%.%.%.%.%.3.3.3.6.6.3.3.&.#.8 6 1 X 1 #X+X#X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X@X&X+X&X+X@X&X).+X).E.E.E.E.J.J.J.J.J.J.W.A.W.h.G.W.A.G.A.H.l.A.A.A.A.h.A.A.A.h.h.A.h.A.h.A.A.A.A.A.A.~ S ^ CXVXAXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXDXSXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXZXDXBXm.[ ~ Q ` Y.!.T.T.T.T.T.T.I.T.U.T.U.U.P.P.P.P.P.P.Y.L.L.L.L.Y.U.Y.L.U.L.L.L.L.L.L.L.L.H.F.H.H.H.H.H.H.G.A.A.A.G.G.A.A.G.A.h.A.A.A.h.h.h.h.z.h.g.g.g.z.g.z.l.z.h.h.A.A.h.h.h.A.h.A.A.h.A.g.h.Z.A.A.h.G.A.h.A.A.A.A.H.A.A.A.S.S.S.A.A.H.A.S.S.S.G.S.H.H.H.H.L.L.L.L.L.L.P.L.L.L.L.L.L.L.P.P.P.L.P.L.L.P.L.U.Y.L.U.P.T.U.I.Y.U.P.P.P.U.U.L.L.L.L.L.L.L.L.L.K.H.H.L.H.H.H.H.H.S.L.U.S.H.U.L.H.L.L.L.U.P.P.T.T.T.T.T.T.T.T.T.T.T.T.P.U.U.U.U.U.Y.P.P.Y.T.T.T.T.~.[.T.~./.T.~.~.~.~.~././.)././././././.(././.!.(./.(./././.(./.(.(.(.(.(.(.(.(.[.(.(.[.^.[./.~.~.^./.^.^.~.~.(./.(.(.~.^.(.^.!.(.(.(.(._._._._.",
+"H H H F H H H H L L Y G G Y I Y U ` Y Y ` Y ` v.v.v.v.b.N.v.n.v.v.b.n.N.v.n.v.n.n.c.n.c.c.N.n.M.n.c.c.N.N.N.N.V.V.jXkXkXkXkXjX0.7.6.9.3.3.3.3.%.3.%.&.$.8 3 < 1 7 hXB.B.B.0.7.7.0.7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 1 X X B.B.B.B.B.B.lXkXkXjXrX0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.*.*.$.8 3 < 4 < 8.B.B.B.0.rXrX0.7.7.3.3.%.%.%.%.%.%.%.%.%.%.%.&.%.*.#.#.#.#.#.#.*.*.%.&.%.%.%.%.%.%.%.%.%.%.%.&.$.8 6 8 8 8 $X$XbXrXrXrXrX0.7.3.%.%.%.%.%.%.%.%.%.%.*.*.#.$.$.$.$.$.$.$.#.*.#.*.&.%.%.%.%.%.%.%.%.%.%.%.&.#.8 6 < 3 3 C.+X$X$XrXrXrXrX0.7.3.%.%.%.%.%.%.%.%.%.%.&.&.#.#.$.$.$.8 8 $.$.$.#.*.*.%.%.%.%.%.%.%.%.%.*.$.$.8 6 8 8 C.$X$XjXjXjXjXjX0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 3 1 1 1 $X$X$X$XbXkXjXjXrX0.7.9.%.%.%.%.%.%.%.%.%.%.%.*.$.3 1 . . 1 @X@X&X&X&X&XE.&XE.&XE.E.&X&X+X@XlXkXkXjXjX0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.3.&.#.$.7 < X . i $X$X$X#X#X#X$X+X$X$X+X$X+XlXlXB.B.OXOXB.B.+X@X&X+X+X+X).&X).E.E.E.E.I.J.I.J.G.J.G.J.W.A.G.G.A.G.h.A.h.G.A.A.A.A.A.A.h.A.h.A.A.A.A.l.h.A.A.A.~ ~ ! ZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXDXDXBXQ.{ ! ! [ Y.(.T.T.T.T.T.T.T.T.U.U.T.U.P.P.P.P.P.P.L.L.U.U.L.U.L.U.L.L.L.U.L.L.L.L.L.S.H.H.H.S.L.H.H.A.H.D.G.G.G.A.G.H.h.S.S.A.l.l.A.h.h.h.g.d.g.k.g.D.z.h.z.l.h.h.g.l.G.g.h.z.A.h.A.G.A.A.A.A.h.h.h.A.h.Z.A.G.h.W.h.A.S.A.A.S.A.S.S.S.H.G.S.S.S.S.H.H.S.L.S.G.H.L.G.U.L.L.L.L.L.L.L.L.G.P.P.L.L.L.L.L.L.L.L.U.L.P.L.U.T.L.U.T.U.U.P.P.L.L.L.L.L.L.L.S.L.H.L.H.H.H.H.S.H.H.S.H.H.H.H.S.H.K.L.L.L.U.P.T.T.U.T.T.T.T.T.T.T.T.U.T.T.U.U.U.U.U.P.P.Y.U.P.T.T.T.T.~.~.~.~.~.~./.~.~.~.~./.!./././././././.(.(.(.[.(.(.(.^.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^./././.(.~.~./.^.~.~.[././.~./.[.~.(.(.!.(.(._._._._._.",
+"F H H H H H H H L L H J I I Y I ] Y ` ` v.v.v.v.v.v.n.v.v.n.N.n.N.C.N.N.n.N.C.n.N.c.N.v.c.c.c.n.c.N.N.N.N.N.V.V.V.lXkXkXjXjXrX7.6.3.3.3.%.%.%.%.%.%.*.$.8 6 < 1 6 B.B.B.B.0.0.0.7.7.7.6.6.%.%.%.%.%.%.%.%.%.%.%.%.*.#.8 6 1 1 X V.B.B.B.B.B.kXkXjXjX0.0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.#.$.$.6 < 1 1 9 q.B.B.lXOX0.0.0.0.7.6.%.%.%.%.%.%.%.%.%.%.&.*.*.#.#.$.$.$.$.$.$.#.#.*.%.%.%.%.%.%.%.%.%.%.%.%.#.#.$.6 6 8 $.B.$XB.rXrXOX0.0.6.6.%.%.%.%.%.%.%.%.%.&.#.#.$.$.8 8 8 6 8 $.$.#.#.*.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.6 6 6 < q.$X$XbXrXrXrXrX0.7.3.%.%.%.%.%.%.%.%.%.%.&.*.#.$.8 8 6 6 7 6 8 $.$.#.*.%.%.%.%.%.%.%.%.%.&.#.8 6 8 8 8 7.$XbXrXjXrX0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 < < 1 1 $X$X$X$XlXjXkXjXrX0.7.9.%.%.%.%.%.%.%.%.%.%.%.#.8 < 1 . . w $X+X+X&X&X&X).E.E.E.&X&X+X&X+X+XlXkXjXlX0.0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.6 < X X . C.$X$X$X$X$X$X$X$X$XbXlXlXjXjXjXjX0.jX0.0.0.7.0.OXOX&X+X).+X+X&X&XE.&XE.E.E.J.W.W.W.G.G.W.G.h.A.l.G.l.A.h.A.l.h.A.h.A.h.A.h.h.h.h.h.h.h.A.g.S./ ! ! BXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXVXFXZXDXDXBXpX[ / ^ [ ~.T.~.T.~.T.T.T.T.I.T.U.U.T.T.T.T.T.T.P.U.U.Y.U.U.L.U.U.K.L.L.L.L.U.L.L.L.L.L.D.H.H.G.H.H.H.H.A.A.A.H.Z.G.A.S.A.S.A.H.l.A.l.h.h.z.l.g.g.g.g.g.g.j.l.h.g.G.l.l.l.D.h.h.A.j.j.S.g.A.A.A.h.A.A.A.A.g.g.A.g.J.A.h.G.S.S.S.S.S.S.S.S.S.H.S.G.S.H.S.L.L.L.H.L.L.P.G.L.L.L.L.L.L.L.L.L.L.L.L.P.L.L.L.L.L.U.U.L.U.U.Y.L.L.U.U.U.U.U.L.L.L.L.L.L.L.L.L.H.Z.L.H.H.H.H.G.G.L.H.S.H.H.H.L.H.S.L.L.L.P.P.T.T.U.T.T.T.T.T.T.T.T.U.U.U.U.U.U.U.P.P.L.P.T.P.T.T.T.T.~.T.T./.T.~.~.(.(.~./.!.(./././.(.(.(.[.^./.[.(.(.(.(.(.(.(.(.(.(.^.|.(.(.(.(.(.(.(.^./././.E././.~.~.^.~.^.(./.[./.^.[.E.(.(.(.(.(.(.[.(.{.",
+"H H H H H H F Y H H L J I K Y Y Y v.` v.v.v.n.v.n.v.n.N.n.C.N.V.C.V.N.N.N.C.8.Q.N.N.N.N.N.N.N.n.N.N.N.N.m.V.V.V.].lXkXjXjXrX0.6.3.%.%.%.%.%.%.%.%.%.&.$.8 6 3 < < aXB.B.aXOX0.0.0.7.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.8 6 < 1 X N.B.B.B.B.B.kXjXkXrX0.0.9.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.*.*.#.$.$.$.8 7 < 1 X 1 1 7 B.B.B.0.0.0.0.0.7.6.3.%.%.%.%.%.%.%.%.%.&.*.#.#.$.8 8 8 8 8 $.$.#.*.%.%.%.%.%.3.%.%.%.%.%.%.&.$.8 8 8 6 8 &X$X$XrXrXrX0.0.6.3.%.%.%.%.%.%.%.%.%.#.$.$.8 8 4 < < < 6 6 $.$.#.*.&.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 3 3 3 7 @X@XbXrXrXrX0.0.7.6.%.%.%.%.%.%.%.%.%.%.*.#.$.$.6 3 < 1 3 < 6 8 $.#.*.&.%.%.3.%.%.%.%.%.*.$.8 8 8 8 8 C.$XbXrXrXrXrX0.0.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.$.8 < 1 1 < B.$X$X$XlXjXkXjXrX0.7.3.%.%.%.%.%.%.%.%.%.%.*.$.8 < 1 . . i $X+X&X&X).&XE.&XE.E.&X&X&X&X#X$XlXjXkXjXrX7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.8 3 1 X . X $X$X$X$X$X$X$X$XlXkXkXkXkXkXjXjXrXrXrX0.0.0.0.7.7.7.6.0.V.%X&X&X+X&X&XE.E.E.J.J.J.G.W.G.G.G.h.G.J.h.A.h.A.A.A.z.A.l.l.h.h.h.h.h.h.h.h.D.h.A.A.~ ! ~ ZXVXAXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXGXSXDXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXDXAXFXFXFXFXFXAXFXAXZXZXBXQ.[ ! S { T.~.T.T.~.T.T.T.T.T.P.T.T.T.U.T.T.T.T.T.P.T.P.L.U.L.U.U.K.L.L.L.L.P.L.L.L.S.L.S.H.L.G.H.H.G.H.D.S.S.S.S.S.S.A.S.S.A.z.h.A.h.h.h.D.z.g.z.f.z.g.z.l.l.l.l.h.h.l.l.A.h.h.A.A.g.G.h.h.A.A.Z.h.j.A.A.A.A.A.A.A.A.W.A.S.S.S.H.A.S.S.S.G.G.D.H.H.H.H.H.G.L.L.L.D.P.P.L.L.P.L.L.L.U.P.H.S.U.L.L.L.H.L.U.L.L.L.L.U.L.Y.U.L.Y.U.U.U.P.L.L.H.L.L.L.L.H.L.L.H.U.H.D.H.H.H.H.H.H.H.H.H.H.L.L.L.L.L.U.L.U.T.I.T.U.P.T.T.U.T.T.T.U.T.Y.U.P.P.P.Y.P.P.P.Y.P.T.T.T.^.^.T.~./.~.~.~.~./.T.~./././././.(./.(.(.(.(.(.[.(.(.(.(.{.(.|.(.(.(.].(.(.(.(.(.(.~./.^.~.[.[.^.~.(.~.^.~.{.~.(.(.~.(.(./.(.(.(.(.(.^.(.(._.",
+"H H H H H H L L L K Y Y Y ) Y I ` Y Y v.b.v.v.v.n.N.n.C.N.N.V.V.V.V.OXOXrX0.6.8.V.N.N.N.N.N.N.N.N.M.N.N.V.V.V.B.B.lXjXkXjXrX0.6.3.%.%.%.%.%.%.%.%.%.&.$.8 6 3 1 1 C.B.B.B.OX7.7.0.0.7.6.6.%.%.%.%.%.%.%.%.%.%.%.%.&.#.8 6 < 1 1 8.B.B.B.B.jXkXkXjXjX0.7.6.3.%.%.%.%.%.%.%.%.3.%.%.%.%.%.%.%.%.%.*.*.*.$.$.$.8 6 < < 1 X X X X 7 B.B.B.OX0.rX0.0.7.6.3.%.%.%.%.%.%.%.%.%.&.*.#.$.8 8 6 3 6 6 8 8 $.#.*.%.%.%.%.%.%.%.%.%.%.%.#.$.8 6 8 8 2 B.$XOXrXrX0.0.0.6.3.%.%.%.%.%.%.%.&.*.#.$.8 6 < 1 X 1 1 < 3 8 8 #.*.&.%.3.3.%.%.%.%.%.%.%.%.%.#.$.8 6 3 6 q.$X$X$XrXrXrXrX0.7.3.3.%.%.%.%.%.%.%.%.%.*.$.$.8 < 1 X X X 1 < 6 8 $.#.&.%.3.3.3.3.%.%.%.%.$.=.8 8 8 8 C.$XOXrXrXrX0.0.7.6.%.%.%.%.%.%.%.%.%.%.&.&.&.&.&.&.*.*.*.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.8 6 < < 1 C.$X$X$X$XjXlXjXrX0.6.3.%.%.%.%.%.%.%.%.%.&.#.$.8 < X . . V.+X+X&X).&XE.).E.).).).&X).+X#X$XlXkXkXjX0.0.6.3.%.%.%.%.%.%.%.%.%.%.%.&.*.$.8 < 1 X . i bXbX$X$XbX$XbXkXUXUXkXkXjXjXjXOXrXrX0.0.0.7.7.7.7.7.6.6.3.6.C.+X&X&X&X&XE.E.J.E.J.J.W.W.G.G.A.h.A.A.h.h.h.h.h.A.l.l.h.h.h.h.h.h.h.h.h.k.A.h.h.P ~ ! BXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXGXAXDXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXDXZXBXm.{ ~ ! [ ~.T.~.T.~.T.T.T.P.T.T.T.T.T.T.T.T.T.T.T.T.P.T.L.Y.L.L.U.L.L.U.L.L.U.L.L.L.L.L.L.H.H.H.H.H.G.A.D.S.S.S.H.S.S.S.S.H.A.S.A.h.A.A.h.d.l.A.g.k.l.z.g.l.l.h.l.A.l.l.A.h.z.S.h.Z.j.h.A.A.A.A.A.A.Z.A.A.G.g.A.A.A.A.A.A.A.A.S.Z.S.S.S.S.A.G.G.H.H.H.H.D.H.G.G.L.D.H.H.P.D.L.P.L.H.H.U.D.U.S.D.U.L.L.L.S.L.L.L.L.L.U.L.L.L.L.U.L.U.L.L.L.L.L.L.G.L.L.L.H.P.D.H.H.H.H.L.H.H.H.H.H.H.H.H.H.H.L.H.L.L.I.L.Y.P.P.T.T.U.T.U.T.U.T.U.L.U.P.P.P.L.U.P.Y.I.Y.U.U.T.T.T.~.~.T.~.~././././././././.(./.(.(.(.(.(.^.(.^.^.^.`.(.(.(.(.(.(.(.^.(.(.(.(.(.(.(./.~.~.(.T.~././.~.~.E.(.(.~././.~.[./././.(.(.(.(.(.^.(.",
+"H H H H H L F U U J K I Y Y ` Y Y ` v.v.v.v.v.n.C.N.C.F.V.V.V.OXlXlXjXjXrX7.6.*.8.V.V.m.V.N.N.N.m.V.V.m.V.V.B.V.B.jXlXjXjXrX7.6.3.%.%.%.%.%.%.%.%.%.&.#.$.6 3 < 1 q.B.B.B.B.7.0.0.0.7.6.3.3.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 < 1 X 8.].bXB.B.B.lXjXjXjX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.&.*.#.$.8 6 < < < 1 1 X . . . X 9 B.B.B.OX0.0.0.0.0.6.3.%.%.%.%.%.%.%.%.%.*.#.$.8 6 3 < < < < 6 8 $.#.*.%.3.3.3.3.%.%.%.%.%.%.&.$.=.8 6 8 8 OXbXOX0.0.0.rX0.6.3.%.%.%.%.%.%.%.*.#.$.8 6 1 X . X . . 1 < 6 8 #.#.&.3.3.%.3.%.%.%.%.%.%.%.&.#.$.8 < 3 3 q.$X$X$X0.rXrXrX0.7.6.%.%.%.%.%.%.%.%.%.&.#.$.8 3 1 X i B.+XV.C.8 8 #.*.%.6.3.%.3.3.%.%.%.&.$.8 8 8 8 $.OXbXjX0.0.OX0.0.6.%.%.%.%.%.%.%.%.%.%.%.&.&.#.#.$.$.#.#.#.#.*.*.&.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 3 1 < < &X$X$X$XjXjXjXjXrX7.6.3.%.%.%.%.%.%.%.%.%.&.#.$.< 1 . . . #X+X+X+X).).&XE.E.E.&X&X).).+X+XbXlXlXjXjXrX7.6.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 < X X . C.$X$XbX$X@XJXUXUXkXkXkXjXjXrXrX0.0.0.0.0.0.0.7.7.7.7.6.6.6.3.3.3.7.&X&X&XE.E.E.J.J.J.W.G.G.W.A.A.A.h.G.A.h.h.h.h.h.h.h.h.h.j.h.h.h.h.h.g.A.z.A.S ! ! ZXVXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXAXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXGXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXDXDXDXFXFXFXFXFXAXFXZXDXZXBXpX[ / S [ ~.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.~.T.T.T.~.P.T.U.U.L.L.I.U.U.L.Y.L.L.L.L.L.U.L.S.G.G.H.H.D.H.A.L.A.L.G.Z.G.G.H.A.A.G.S.h.A.A.z.A.k.l.g.z.l.l.k.z.z.z.l.l.A.l.g.G.A.A.g.A.Z.G.A.A.A.h.A.h.A.A.A.A.A.A.A.A.A.A.A.A.A.S.S.S.S.S.S.S.H.H.D.H.H.H.H.A.H.H.L.G.P.L.G.P.U.U.P.L.L.L.U.D.L.L.H.L.L.H.L.L.S.L.L.L.Y.L.L.L.L.L.L.U.U.L.L.L.L.L.L.L.L.S.L.L.L.H.H.H.H.D.L.G.H.H.H.S.H.H.H.U.H.H.L.L.I.L.L.L.P.U.Y.U.T.U.T.T.U.Y.U.Y.P.L.L.P.U.U.L.U.L.T.T.T.T.T.~.T.T.T./.~./.~./.(././.(.(./.^.(.(.(.(.(.(.(.(.(.`.^.(.(.(.(.(.].(.{.(.(.(.(.(.(.(.^./././.^.~.^.~.~.~.^.~.(.[.^././.^./.(././././.(.(.(.^.",
+"H H D H H H L J L Y Y I I Y ` ` v.e.v.v.n.n.n.N.n.V.V.V.B.lXlXlXlXjXlXjX0.7.3.3.$.C.V.V.V.V.V.V.V.V.V.V.V.B.B.B.B.lXlXjXjXrX0.4.%.%.%.%.%.%.%.%.%.%.&.#.$.8 3 1 1 q.B.B.B.B.OX0.0.7.7.7.6.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.8 < 1 1 7 B.OXB.B.OXkXjXjXrX0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.#.$.$.6 6 < 1 X X . . . . . . X 1 B.OXaXB.0.rXrX0.7.6.6.%.%.%.%.%.%.%.%.%.*.#.$.6 < < 4 i c 7 < 8 8 #.*.%.3.3.3.3.%.%.%.%.%.%.&.$.8 6 8 6 8 OX$XOX0.0.0.0.0.6.6.%.%.%.%.%.%.&.*.$.8 6 1 . . . 7 V.$X$X+X8.$.$.*.&.%.6.6.3.3.%.%.%.%.%.%.*.#.$.6 6 3 6 7 $X$X$XOXrXrX0.0.7.3.3.%.%.%.%.%.%.%.%.*.#.$.6 < 1 . q.$X$X$X$X$XC.*.%.%.9.6.6.6.3.%.%.%.&.$.$.8 8 $.$.B.bX0.0.0.0.0.7.7.%.%.%.%.&.%.%.%.%.%.&.#.$.$.$.$.8 8 $.$.#.#.*.&.&.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 3 < 1 < OX$X$X@XjXjXjXjX0.0.6.3.%.%.%.%.%.%.%.%.%.&.#.$.< 1 . . 4 $X+X+X&X&XE.E.&XE.&X).E.+X+X+X#XlXlXkXjXrX0.7.9.%.%.%.%.%.%.%.%.%.%.%.%.&.#.8 6 1 X X X #X$X$X$X$XlXUXUXUXkXkXjXjXrXrX0.0.0.7.7.7.7.6.7.7.6.7.6.6.6.6.3.3.%.%.C.&XE.&XE.E.J.W.J.W.W.A.A.G.G.h.h.h.g.h.h.g.h.g.h.h.h.h.h.j.h.z.h.h.k.D.A.S ! / CXVXZXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXDXDXDXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXDXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXDXDXFXFXFXFXGXSXDXAXFXFXFXFXFXAXFXAXDXDXBXQ.' ! c [ ~.~./.T.T.T.T.T.P.T.T.P.[.T.T.T.T.T.~.T.~.Y.U.U.L.U.Y.L.L.L.L.L.A.L.U.L.L.S.L.U.L.U.H.H.H.H.H.H.H.G.G.G.H.A.H.H.G.S.S.S.h.A.A.h.D.l.g.D.k.l.h.h.h.l.l.l.l.l.g.G.h.h.S.g.j.j.A.A.h.h.Z.A.A.A.A.G.A.A.A.h.A.A.A.h.S.A.h.S.S.S.S.S.D.G.D.D.L.S.G.H.H.H.H.H.G.L.L.D.U.H.L.L.L.L.L.L.S.L.L.H.L.L.H.L.L.L.L.U.U.L.L.L.L.L.L.L.L.L.L.L.H.H.L.A.U.S.L.U.S.L.U.H.H.H.G.G.H.H.H.H.H.S.K.S.L.H.L.L.L.L.K.Y.U.L.U.Y.U.T.U.U.T.U.Y.T.L.P.P.P.L.L.T.U.I.Y.T.T.T.T.T.^.~.~.T./././.!./././.(.(.(.(.(.^.`.(.(.(.^.(.].`.(.(.(.(.(.(.^.^.`.(.(.(.(./.(.(././././.~.^.~.!.^./././.[.E.^.^././././.(./.!./././././.",
+"L H H L H F L L I I ) I I Y ` v.` v.v.b.n.C.N.N.V.OXjXkXkXkXkXkXlXjXjXjX0.7.3.*.$.$.V.B.V.V.V.V.V.V.V.V.B.B.OXB.lXkXkXjXjXrX7.6.%.%.%.%.%.%.%.%.%.%.&.*.$.8 6 < 1 7 B.B.B.B.OX7.0.0.0.7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.*.$.6 3 < 1 7 aXB.B.B.lXlXjXjX0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.#.$.$.6 < 1 X . . . . . X X 4 < X 1 OXB.B.lX0.0.0.0.0.6.6.%.%.%.%.%.%.%.%.%.*.$.$.6 < 1 4 B.B.B.OX8.$.#.&.3.3.3.6.%.%.%.%.%.%.%.#.$.8 6 6 8 6 B.$XOX0.0.0.0.7.6.3.%.%.%.%.%.%.*.#.$.6 < X . X i $XbX$X$X$X$X&X*.%.1.6.3.6.3.3.%.%.%.%.%.%.%.#.$.8 < 3 3 q.$X$X$XOXrXrX0.0.0.3.3.%.%.%.%.%.%.%.%.&.#.8 6 1 X . q.vXbXbXbX$XbX0.%.6.6.6.6.6.3.%.%.%.&.$.=.8 8 8 $.+XbX0.0.0.0.0.7.6.%.%.%.%.%.%.%.%.*.#.#.$.8 8 8 3 7 6 8 8 $.#.*.&.&.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 3 1 1 < V.$XbX$XjXjXjXjXrX7.6.%.%.%.%.%.%.%.%.%.%.*.$.8 < X . . i $X&X+X).).E.E.E.E.).&X&X&X&X+X+XlXkXkXjXOX0.6.6.%.%.%.%.%.3.%.%.%.%.%.&.*.$.8 < 1 X 1 i $X$X$X$XlXkXUXUXkXkXrXOXrX0.7.7.7.6.6.7.6.6.6.6.6.6.6.6.6.6.6.6.%.%.*.#.#.C.&XJ.&XJ.J.J.W.G.W.x.h.h.G.s.z.h.h.h.k.k.z.h.g.z.g.g.h.z.z.z.h.h.h.h./ S / ZXZXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXZXVXBXm.} ^ ^ [ T.~.~.T.T.T.Y.T.~.P.Y.T.~.T.~.T.T.T.~.T.T.T.T.U.L.U.U.L.U.P.L.L.U.U.P.S.L.L.S.S.U.S.U.S.H.U.S.H.G.K.Z.H.G.A.G.A.S.S.S.S.A.z.h.A.g.l.A.z.h.h.h.h.h.h.z.h.h.G.h.z.S.A.A.g.g.G.A.j.G.j.G.A.A.A.A.A.J.A.A.A.A.A.h.A.A.A.S.h.J.H.S.G.H.S.H.L.D.S.H.H.H.H.H.H.H.D.L.G.H.T.H.L.L.L.G.H.H.H.L.L.L.L.H.L.H.L.L.L.L.L.S.U.L.S.L.L.L.L.L.S.L.L.L.L.S.L.A.L.L.H.H.S.H.H.L.H.L.F.S.L.L.S.Y.L.S.H.S.L.H.L.L.L.L.P.L.U.U.Y.U.U.L.U.L.U.P.P.Y.Y.U.U.T.U.I.T.I.U.T.~.T.~.~.~.~././././.(.(.(.(.(.(.(.(.(.(.(.^.(.(._._.^.(.(.(.(.(.(.(.(.(.`.(.(.(.(.(.(.(.!././././.~./.~.~.~./././././.(.~.(.~./././././.[.(.^.",
+"H L H J J I L I K Y Y I Y ` Y ` v.v.b.v.v.N.V.lXkXkXkXkXjXkXjXkXjXjXjX0.0.6.%.#.$.$.8 B.B.B.B.aXB.B.B.B.B.aXaX'.B.jXkXjXjX0.7.3.%.%.%.%.%.%.%.%.%.%.&.*.$.8 3 < 1 1 B.B.B.B.B.0.0.0.7.7.7.3.3.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 < 1 1 B.B.B.B.OXjXjXjX0.0.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.$.6 < 1 . . . . + c C.B.B.+XaXB.V.OXB.B.+X0.0.rX0.0.7.6.%.%.%.%.%.%.%.%.%.%.$.8 < 1 X 4 B.OX$XB.B.8.#.%.3.6.6.6.3.3.3.%.%.%.%.#.$.8 6 6 6 6 $X$XOX7.0.0.0.0.6.3.%.%.%.%.%.&.*.$.$.< 1 . . w $X$X$X$XbX$X$X$XB.3.6.6.6.6.6.3.3.%.%.%.%.%.%.#.$.6 6 3 3 3 $X$X$XrXrXrXrX0.7.6.3.%.%.%.%.%.%.%.%.&.#.8 6 1 X . v.bXbXbXbXbXbX$X7.6.6.7.7.6.3.3.%.%.#.$.8 8 8 8 8 $X$X0.0.0.0.0.7.3.%.%.%.%.%.%.&.*.*.#.$.8 6 < 1 1 < < < 6 $.$.#.&.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.6 3 < < < V.$X$X$XjXjXjXjX0.7.6.%.%.%.%.%.%.%.%.%.&.*.$.6 < X . X C.$X+X&X&XE.&X&XE.E.E.).E.+X+X+X$XlXkXkXjXrX0.6.3.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 < 1 X 1 C.$X$X$X$XkXUXkXkXkXjXrX0.7.6.6.6.3.3.3.3.6.%.%.6.6.3.3.6.6.6.3.%.6.&.#.#.$.8 q.V.J.&XJ.J.W.G.W.h.G.h.G.h.h.h.h.g.k.h.f.k.g.d.g.g.k.k.z.k.h.h.l.l.S / / CXCXZXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXFXHXQ.[ ! ^ [ /.^.~.~.T.T.T.T.Y.~.T.Y.Y.T.~.T.~.T.T.T.T.T.Y.U.U.P.U.U.P.L.P.L.P.D.P.P.L.L.L.L.S.U.L.U.D.A.H.H.H.A.H.H.G.K.G.G.G.G.S.A.H.A.S.h.g.D.h.g.h.h.l.h.h.h.h.h.g.g.h.h.z.A.h.A.A.A.g.A.g.A.j.A.A.A.A.A.A.h.A.A.G.A.A.A.S.S.S.S.h.H.h.H.S.G.S.S.H.H.H.H.G.H.G.D.G.P.G.L.U.L.H.T.L.L.L.G.H.H.H.G.H.H.L.H.L.H.U.S.S.U.S.L.L.H.L.L.U.A.L.L.L.L.L.S.L.L.D.L.H.H.H.H.H.H.H.H.S.U.L.H.L.H.A.F.L.L.L.L.L.L.L.H.L.P.L.U.U.U.P.Y.U.L.U.U.U.P.L.Y.U.U.I.I.U.I.T.T.T.T.T.T.~.~.~./././.^.E./.(.(.(.^.(.(.(.^.(.`.(.(.(.(.(.(.(.(.(.(.(.(.(.(.!.(.(._.(.^.[.^.^././.~./.~.~.~.~.(./././.!./.^.~./.(./.!././.(.E.(.~.",
+"D J H H L L H J L I Y Y Y ` v.` v.b.v.N.B.kXUXkXkXkXkXkXjXkXrXjXrXrX0.0.6.6.%.#.$.$.8 $.B.B.B.B.B.B.B.B.B.B.lXB.lXlXkXjXrX0.7.3.%.%.%.%.%.%.%.%.%.%.%.&.#.8 6 < 1 1 C.B.B.B.+X0.0.7.7.7.6.6.3.3.%.%.%.%.%.%.%.%.%.%.*.$.8 6 < 1 < B.B.B.B.OXjXjXjX0.0.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.$.6 < X . . . 9 C.B.B.B.B.B.B.B.B.B.B.B.B.B.OX0.rXrX0.6.4.3.%.%.%.%.%.%.%.%.*.$.8 < 1 X 4 B.B.B.B.B.+X7.3.6.6.6.6.6.3.3.%.%.%.%.#.$.6 6 6 6 2 $X$XOX7.0.0.0.0.6.%.%.%.%.%.%.&.*.$.6 < X . . V.$X$X$XbX$X$X$X$X$X7.6.6.7.6.6.6.3.%.%.%.%.%.%.*.$.6 3 3 3 8 $X$X$X0.rXrXrX0.7.3.3.%.%.%.%.%.%.%.%.&.#.8 3 1 . . V.$XbXbXbXbXbX$XOX7.0.7.7.6.6.3.%.%.#.$.8 8 8 8 $.NXlX0.0.0.0.7.7.6.%.%.%.%.%.%.&.*.#.$.8 3 < X X X X 1 4 7 8 $.#.&.&.%.6.%.%.%.%.%.%.%.%.%.%.*.$.8 < 1 < < +X$X$XbXjXjXjXrX0.7.3.%.%.%.%.%.%.%.%.%.&.#.$.6 1 X . X +X+X+X+X).&XE.&XE.E.E.).+X&X$X+X$XlXkXjXjXrX7.9.%.%.%.%.%.%.%.%.%.%.%.%.*.#.8 6 < 1 X < $X$X$X$XlXUXkXkXkXjXrX0.6.9.3.3.3.%.%.%.%.%.%.%.%.%.%.%.6.%.%.3.6.%.&.#.$.8 6 2 < W.W.J.J.W.W.G.W.G.h.h.j.l.f.g.a.j.f.k.f.g.f.f.g.k.g.z.k.h.g.l.h./ S / HXAXAXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXAXDXHXBXm.[ ! Q [ /.~.~.T.!.T.T.T.T.Y.~.T.~.Y.T.T.~.T.~.T.T.T.T.U.L.Y.U.L.P.L.U.L.P.S.P.L.L.L.L.L.L.S.S.L.S.L.S.L.H.H.A.A.A.G.K.A.G.G.S.S.A.A.A.A.g.D.g.D.l.l.l.l.z.h.h.h.h.G.g.G.j.S.A.A.A.h.A.z.G.g.Z.h.A.g.A.A.A.h.A.A.A.A.A.A.A.S.S.A.H.A.H.H.H.G.H.H.H.H.H.D.H.D.H.H.P.D.L.L.H.P.T.H.L.H.H.G.H.G.H.H.H.H.H.H.H.U.L.U.L.K.U.S.L.L.L.H.S.H.H.S.S.U.L.L.U.H.L.S.H.H.H.H.L.H.H.H.S.L.H.L.H.L.H.F.S.L.L.H.H.L.L.H.L.L.U.U.L.U.Y.L.U.L.U.U.U.U.T.U.T.U.T.U.T.T.T.T.T.T.~.~.~.~.~.~././.~.(./.(.(.(.(./.[.`.(.`.(.`._.(.(.(.(.`.`.^.`.^.(.(.(.(.(.(.(.[.(.(.^.(./././././.~.(.~.[.^././././././.~.~./.~./.~././.[.^.",
+"L Y L H J L Y I L U Y ` ` Y v.v.b.b.jXUXUXkXUXkXkXkXjXkXrXrXOX0.0.0.7.6.6.3.%.#.$.$.8 8 q.aXB.B.B.B.aXB.B.B.B.B.jXlXkXjXrX0.7.3.3.%.%.%.%.%.%.%.%.%.%.&.#.8 6 < 1 1 C.B.B.B.lXC.0.0.0.7.7.6.3.%.%.%.%.%.%.%.%.%.%.%.*.#.8 6 < 1 < C.B.B.B.jXjXjXjX0.0.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.$.8 < 1 . . . i B.B.B.B.B.B.B.B.B.B.B.B.B.B.aXOXrX0.rX0.7.6.3.%.%.%.%.%.%.%.%.*.$.8 < 1 X 1 ].B.B.B.aXB.B.6.6.7.7.6.6.3.%.%.%.%.%.*.$.6 6 < < 7 $X@XOX0.0.0.0.0.6.3.%.%.%.%.%.*.#.$.6 1 X . 9 $X$XbX$XbX$X$X$X$X$XOX6.7.7.7.7.6.3.3.%.%.%.%.%.#.$.6 3 3 3 2 $X$X$XOXrXrXrX0.7.6.%.%.%.%.%.%.%.%.%.*.$.8 < 1 . . V.bXbXbXbXNXbX$X$X0.0.0.0.7.6.3.%.&.#.8 8 8 8 8 q.bXOX7.7.0.0.0.7.%.%.%.%.%.%.%.*.#.$.8 3 1 X . . X 7 i q.7 8 $.#.&.%.3.%.6.%.%.%.%.%.%.%.%.3.#.$.8 < < < < $X$X$XlXjXjXjXrXrX7.6.%.%.%.%.%.%.%.%.%.&.#.8 6 1 . X 9 #X#X+X&X).).).E.).&X&X&X&X+X&X+X$XkXlXkXrXrX7.6.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 3 1 1 1 6.$X$X$XlXkXkXkXkXjXrX7.6.6.6.%.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.6.%.%.&.#.8 6 < 1 1 W.&XE.J.W.x.G.h.x.h.h.z.f.f.g.g.f.j.j.z.d.g.g.k.g.k.k.k.z.z.g.z.S / S CXAXAXDXAXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBXHXQ.{ ~ Q c.T.~.T.~.~.T.T.T.Y.T.Y.T.T.T.T.~.T.T.T.T.T.T.U.T.Y.U.P.U.P.P.L.L.L.L.P.L.U.L.L.L.L.L.L.S.L.S.L.S.H.H.H.J.H.K.G.G.Z.H.S.S.S.h.A.h.A.g.h.h.h.h.l.l.A.z.A.h.h.z.h.z.A.g.A.h.l.A.l.A.A.A.h.A.A.A.A.A.A.H.A.A.A.A.A.A.S.A.A.S.A.H.S.G.G.H.H.H.H.H.H.D.H.G.D.P.G.H.H.G.P.T.G.P.L.L.L.D.H.D.D.H.H.H.H.L.S.H.S.H.S.H.H.S.H.L.H.H.L.F.S.L.L.S.S.L.U.D.H.F.H.G.L.L.L.G.L.G.F.H.H.L.L.L.H.L.L.H.L.L.L.L.H.S.D.L.L.L.L.L.L.L.K.U.U.I.T.T.U.T.U.T.U.U.T.T.Y.T.T.T.T.~.~.~./.^./.!.^.[.(.(./././.(.^.(.(.^.(.!.(.(.^.`.(.(.(.(.`.^.(._.(.(.].(.^.{.(.(.(././././.~./.~./.~.~.(./././././.~.~.(././.~././././.^.",
+"H P H H L I U U P Y I ` Y ` c.v.v.v.jXkXkXUXUXkXkXjXjXjX0.0.0.7.6.7.6.3.%.%.&.*.#.$.$.8 8 8.+XaXB.hXOXB.B.B.B.OXlXlXjXjXrX0.6.3.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 3 1 1 q.OXB.B.B.OX0.0.7.7.7.6.3.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 < 1 3 C.B.B.lXOXjXjXjXjX0.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.8 6 1 . . . c B.B.B.B.B.B.B.B.B.B.V.B.B.B.B.B.OX0.rXrX0.7.6.3.%.%.%.%.%.%.%.%.*.$.8 < 1 . . B.B.B.+XOXB.B.0.7.7.7.7.6.6.%.%.%.%.&.#.$.7 < < < 7 @X$X+X7.0.0.0.7.7.3.%.%.%.%.%.*.#.8 < 1 . . q.vX@X$X$X$XbX$XbXbX$X$X0.7.0.0.7.6.3.%.%.%.%.%.&.#.$.6 3 < < 7 bX$X$X0.rXrXrX0.0.6.%.%.%.%.%.%.%.%.%.*.$.6 < 1 . . V.bXbXbXbXbXbXbXbXrXrXOX0.0.6.3.3.*.#.8 8 8 8 8 q.$XOX0.0.0.0.7.7.6.%.%.%.%.%.%.&.#.8 6 1 X . X w +XbXbX$X$XOX$.#.&.3.3.6.3.6.3.%.%.%.%.%.%.%.#.$.8 < 1 < 1 $X$XbXbXrXjXjXrX0.7.4.%.%.%.%.%.%.%.%.%.*.#.8 < 1 . . i +X+X+X&X&X).E.E.&X).).&X+X+X+X$X$XkXkXjXrX0.7.6.3.%.%.%.%.%.%.%.%.%.%.&.#.$.6 < 1 1 1 C.$X$X$XjXkXkXkXjXrX0.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.6.%.&.#.$.6 < 1 X 9 J.&XJ.J.J.G.W.G.h.h.h.h.a.z.z.a.k.z.f.f.k.k.g.k.k.k.k.k.g.d.g.g.! ! ! CXVXAXDXDXFXFXGXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBXm.} ^ ! [ ~.~.T.~.!.T.~.T.Y.T.Y.T.T.T.T.T.T.T.~.T.T.T.U.T.P.U.Y.U.P.P.P.L.P.L.U.L.P.P.L.Y.L.L.L.L.S.L.H.U.H.S.H.H.H.A.H.H.H.S.H.S.S.A.A.h.h.A.A.h.l.A.h.h.l.A.z.z.h.h.l.l.g.A.A.h.h.A.l.l.g.A.A.h.A.A.A.A.A.G.A.A.A.A.G.A.A.A.S.G.H.H.A.H.H.H.H.H.H.H.G.H.H.H.H.P.H.H.H.L.U.G.L.L.L.G.P.D.H.H.H.H.H.H.S.L.L.L.G.G.S.S.H.H.H.H.H.H.H.H.L.G.H.H.H.H.D.S.H.S.H.H.H.L.H.L.S.H.S.H.S.U.L.S.L.S.L.Z.L.L.H.L.L.K.U.U.L.L.P.L.L.L.L.U.U.P.U.T.U.T.T.T.U.T.T.T.T.T.~.T.~.~.~.~.~.~./.~././.[./.(.!./.(.(.(.(.(.(.(.(.(.(.`.(._.(._._.(.(.(.(.(.(.(.(.T._.(.(.(.(.~.~.~././.~.~.^.~./././.~.~.^./.!./.^.~.(./././.^.",
+"P H H J L L J K K ] Y I ` ` ` b.n.v.N.lXkXjXkXkXjXrX0.0.0.6.6.6.3.3.3.3.%.%.&.*.*.$.$.$.8 8 0.B.B.B.lX+XaX+XlXaXlXlXlXjXrX7.6.3.%.%.%.%.%.%.%.%.%.%.%.&.#.$.8 3 1 1 w aXB.aXB.B.0.0.0.0.7.7.6.%.%.%.%.%.%.%.%.%.%.%.&.#.8 8 3 < 3 q.B.B.B.OXrXjX0.0.0.6.%.%.%.%.%.%.%.3.%.%.%.%.%.%.&.#.$.8 1 X . . 7 OXB.B.B.B.V.V.V.V.V.V.B.V.V.B.B.B.jXjXrX0.0.7.6.6.%.%.%.%.%.%.%.%.*.$.8 < 1 X . B.B.B.B.B.B.B.OX0.0.0.7.7.6.3.%.%.%.&.$.8 3 < 1 1 q.@X$XB.0.0.0.0.0.7.3.%.%.%.%.%.*.$.8 < X . . V.bXbXbX$X$X$X$XbX$X$XbXOX0.0.7.7.7.6.%.%.%.%.%.%.#.$.6 3 < < 7 $X$X$XOXrXrXrX0.7.6.3.%.%.%.%.%.%.%.%.*.$.8 < 1 . . +XbXbXbXbXNXbXbXbXjXjXrX0.7.6.3.3.*.$.$.6 6 8 8 0.bXOX0.7.7.0.7.6.%.%.%.%.%.%.&.*.$.6 < X . . 4 bX$XbXbXbXbXbX+X%.%.6.6.6.6.4.3.%.%.%.%.%.%.%.#.8 6 < < 1 < bXbX$XOXjXjXrXrX0.7.%.%.%.%.%.%.%.%.%.%.*.$.6 1 1 . . v.$X+X+X).).E.).).E.E.).).).&X+X+XJXkXjXkXrX0.6.3.%.%.%.3.%.%.%.%.%.%.%.*.#.8 7 < 1 1 < $X$X@XjXlXkXkXjXrX0.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 < 1 X . v.E.&XJ.J.x.W.h.h.h.h.x.h.g.g.a.f.f.k.f.f.f.f.f.d.k.k.k.k.g.z.g.g.~ ! ! CXVXVXZXVXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXSXGXDXAXFXFXFXFXDXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXDXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXZXDXHXQ.[ ! ^ ` T.~.~.T.T.T.T.T.T.Y.~.T.Y.~.T.T.T.T.T.T.T.T.T.U.P.T.Y.U.P.P.P.U.L.L.L.L.U.Y.L.L.L.L.S.L.A.L.S.S.H.L.H.H.G.K.H.H.S.H.H.S.S.S.S.S.A.A.h.A.A.h.h.A.l.A.z.G.h.h.l.l.h.h.h.l.l.h.G.h.A.h.h.A.A.A.A.A.A.A.A.h.A.A.A.G.H.S.S.A.H.H.H.H.H.H.H.H.D.H.H.H.H.H.D.H.D.L.P.L.P.P.P.H.H.P.P.A.H.H.S.S.S.H.H.D.H.H.H.F.H.S.S.H.H.H.H.H.S.H.H.L.H.H.L.S.A.U.H.H.S.H.H.H.H.H.H.L.H.L.Y.S.S.U.S.K.U.H.H.H.H.L.U.S.S.S.S.L.L.P.L.L.U.P.P.U.U.Y.U.T.T.T.T.T.T.T.T.~.T.T.T.T.T.~.~.~./././././.^./././././.(.(.^.`.~.{.(.(.(.(._._.(.(._.(.^.`.^.(.(.[.(.{.(.(.~.(.(./././.~.~./.~.~./.~.[.!.~.[.~././.~.~.~././././.",
+"U H P H H H K Y U I I Y Y b.v.v.v.n.C.OXrXjXrXjXOX0.0.6.6.6.6.3.%.3.3.%.%.%.%.&.*.#.#.$.$.8 8 V.lXB.OX+XB.B.B.$XkXkXjXjXOX7.6.3.%.%.%.%.%.%.%.%.%.%.%.&.&.$.8 3 1 1 9 B.B.B.B.B.OX0.0.0.7.7.6.3.%.%.%.%.%.%.%.%.%.%.&.#.$.7 3 < 3 i B.B.B.OXjX0.0.0.0.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 3 1 . . o B.B.B.B.aXV.V.V.V.V.V.V.V.V.B.B.B.B.].rX0.rX0.7.6.6.%.%.%.%.%.%.%.%.&.#.8 < 1 X . C.B.B.B.B.B.B.aX0.rX0.0.7.6.6.%.%.%.*.$.8 < 1 1 1 q.$X$XOX0.0.0.0.0.6.3.%.%.%.%.%.*.$.6 < X . . $X@XbX$X$XbX$X$X$X$XbXbXOX0.0.0.0.7.6.%.%.%.%.&.3.#.$.6 3 < < i bX$X$XOXjXrXrX0.7.3.3.%.%.%.%.%.%.%.%.%.$.6 < X . X bXbXbXbXbXbXbXNXbXjXjXrXrX0.7.3.&.*.$.8 8 8 6 7 B.bX0.7.0.0.0.7.6.9.%.%.%.%.%.*.#.8 6 X . . X bXbXbXbXbXbXbXbX$XOX6.6.6.7.6.6.3.3.%.%.%.%.%.&.#.$.6 < 1 1 7 bX$X$XlXjXjXjXrX0.6.3.%.%.%.%.%.%.%.%.*.#.$.6 < . . . B.+X+X+X).).&X).&X).).&X).&X+X+X$XlXkXkXjXrX0.6.3.%.%.%.%.%.%.%.%.%.%.%.*.$.8 < < 1 1 q.$X$X$XjXkXkXkXjX0.7.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.6 < X . . W.&XJ.J.J.W.W.x.W.G.j.j.s.g.i.i.k.i.f.f.f.f.k.f.f.k.a.k.k.k.f.g.g.~ ~ ~ CXVXFXFXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXDXAXDXAXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXAXFXAXZXZXBXm.{ ! S [ T.~.T.~.T.T.T.T.T.T.T.T.~.T.~.T.T.~.T.T.T.T.T.U.U.U.Y.U.U.P.T.P.L.L.U.U.L.L.L.L.L.U.L.L.U.S.L.L.L.H.H.H.H.H.H.H.H.H.S.S.S.H.S.h.A.A.A.A.A.h.A.h.z.z.S.l.G.l.h.l.h.A.h.l.l.h.S.A.h.j.h.A.Z.A.h.A.G.A.A.A.G.A.A.H.G.A.G.G.H.S.H.H.H.H.H.G.H.H.H.H.H.H.H.H.L.G.G.L.G.P.G.P.G.P.D.J.H.H.G.G.H.H.H.H.G.G.G.G.S.H.H.H.K.A.H.H.H.H.S.U.H.L.U.H.H.S.H.H.H.H.H.H.L.H.H.H.L.A.U.Z.K.U.L.S.D.H.U.S.H.L.H.U.L.L.L.L.L.L.P.L.L.U.U.P.T.U.U.T.T.T.T.T.T.T.~.T.~.T.~.~.~.!.~.~./.[.~./.!././././.!./.(./.(.(.(.(.(.(.`.(.(.`.(.(.(.^.(.(.(.(.!.XX(.(.(.(.~.(.~.~././.(.~.~.~.~.!./.~.~.~.~./.^./.(./.(././././.",
+"H P P P J P K I J Y Y ] Y v.` c.c.v.C.OXrXrXrX0.0.7.7.9.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.$.$.8 $.C.'.lXB.B.lXB.jXkXkXkXjX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.3.&.$.8 6 < 1 1 OXB.B.OXB.OX0.0.7.7.7.6.3.%.%.%.%.%.%.%.%.%.%.%.#.$.8 3 < 6 7 lXB.].OXjX0.jX0.0.7.%.%.%.%.%.%.%.%.%.%.%.1.%.*.#.$.6 1 X . . 8.B.B.B.B.V.V.V.V.N.V.N.V.m.V.V.V.B.B.B.jXjX0.0.0.7.3.%.%.%.%.%.%.%.%.&.$.8 6 1 1 . C.B.B.B.aXB.+X+X0.jX0.0.0.6.3.%.%.&.*.$.6 < 1 1 1 V.$X$X$X0.0.0.0.0.7.3.%.%.%.%.%.#.$.6 < X . 9 $XbX$X$XbX$XbX$XbX$XbXbXB.OX0.0.0.7.6.3.3.%.%.%.3.#.8 6 < < 1 q.$X$X$XOX0.rXrX0.0.6.3.%.%.%.%.%.%.%.%.&.$.6 < 1 . . bXbXbXbXNXbXNXbXNXjXjXjXrX0.7.3.*.#.$.6 6 6 6 6 $XbXOX7.0.7.0.0.6.%.%.%.%.%.%.#.$.6 < X . . C.bXbXbXNXbXbXbXbXbXbX6.7.7.7.7.6.3.3.%.%.%.%.%.&.#.8 6 1 1 < q.@X$X$XOXjXjXrXrX0.6.%.%.%.%.%.%.%.%.%.*.#.$.6 1 X . 9 $X+X&X+X).&X).E.E.E.).E.).+X+X$X$XkXjXkXjXrX0.6.3.%.%.%.%.%.%.%.%.%.%.%.#.$.6 < 1 1 < V.$X$XlXjXjXkXrX0.0.7.3.%.%.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.$.8 < 1 . . 9 &XE.&X&XJ.W.G.G.h.f.j.h.j.z.i.k.k.i.f.k.i.f.i.f.i.k.a.a.a.f.g.g.g.~ ~ ~ CXVXFXZXFXZXFXDXDXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXDXAXFXFXFXFXFXFXFXFXFXFXAXDXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXAXDXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXZXFXBXm.} J ! [ ~.T.~.T.~.T.T.T.T.~.~.T.T.T.~.T.T.T.T.T.T.T.U.T.T.T.U.T.T.U.U.P.Y.P.L.U.U.U.L.U.Y.L.L.L.L.L.L.L.L.L.H.H.H.H.S.A.H.S.H.G.G.A.A.A.A.A.h.g.A.A.D.h.H.h.h.l.l.l.A.h.h.l.l.h.l.l.z.z.A.A.G.j.j.A.A.A.A.A.A.A.A.A.H.h.H.H.G.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.G.L.L.L.P.L.D.P.D.P.G.G.H.A.H.D.S.S.S.S.G.G.S.S.A.H.A.H.H.h.H.H.H.H.H.H.H.H.H.S.U.U.H.S.G.H.H.G.G.L.H.L.H.Y.S.L.S.H.S.U.H.H.S.Y.K.h.H.S.S.S.L.S.S.L.L.L.L.L.U.U.U.T.U.T.T.T.T.T.T.T.T.T.~.~.T.~.~.~./.^.^././././././.(./.(.(./.[.(.(.(.(.(.(.^._.(.(.`.!.(.`.(.(.(.`.(.(.(.(.(.(.(././././.~.~.~.~.~.~.~.~./.~.~.~.(.^.~.~./././.!././.",
+"J K J J H I L I I I ` Y ] Y ` b.v.N.n.C.0.7.0.7.7.6.6.3.%.%.%.%.%.%.%.%.%.%.%.%.&.&.*.#.#.$.$.=.8 OXlXB.B.B.B.lXkXkXjXjX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 < 1 1 C.aXB.B.B.B.7.0.0.7.7.6.3.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 < < 3 B.B.B.OXrXrX0.0.0.7.6.&.%.%.%.%.%.%.%.%.%.%.%.&.$.$.6 1 . . + B.aXB.B.V.V.N.V.n.N.N.N.V.N.V.V.V.B.B.].jXrXrX0.0.7.6.3.%.%.%.%.%.%.%.*.#.8 6 1 X . C.+XB.B.B.B.B.+XjXrXrXrX0.7.9.%.%.&.#.8 6 1 1 . X +X$X$XB.0.0.0.0.7.7.3.%.%.%.%.%.#.8 6 < 1 . w $X$X$X$X$XbX$X$XbX$XbX$X$XrXrXrX0.7.6.4.%.%.%.%.%.#.8 6 < < 1 7 bX$X$X0.jXrXrX0.7.6.%.%.%.%.%.%.%.%.%.*.$.6 < X . X vXbXNXbXbXbXbXNXNXjXkXjXrXrX7.3.3.#.8 6 6 3 3 8 SXNX0.0.7.0.0.0.4.%.%.%.%.&.&.#.8 6 1 . . X bXbXbXbXbXNXbXbXbXNXNX0.7.7.0.7.7.4.3.%.%.%.%.%.&.#.8 3 < < 9 q.$X$X$XjXjXjXjX0.7.6.3.%.%.%.%.%.%.%.%.%.#.8 < 1 . . w $X+X&X&X).).E.E.E.E.).).).+X+X@X$XjXkXjXrXrX0.6.9.%.%.%.%.%.%.%.%.%.%.&.#.=.6 1 1 1 6 $X$X$XjXjXjXjXjX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.8 < X . . i &X&XE.J.J.W.h.h.x.h.j.j.f.s.f.a.k.a.z.a.f.z.i.k.k.d.k.k.k.f.f.f.g.! / S HXFXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXAXFXFXFXFXFXFXFXFXDXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXHXHXQ.} ! c [ T.T.T.~.T.T.T.~.T.T.T./.T.T.~.~.~.T.T.T.T.T.T.T.T.T.T.T.T.U.U.P.T.P.P.Y.P.Y.U.Y.P.L.P.L.L.L.L.P.H.H.L.H.H.H.H.G.H.H.G.G.S.S.S.S.A.A.A.h.A.h.A.A.j.A.g.A.h.G.A.h.h.A.h.h.h.h.A.h.A.g.A.h.Z.A.A.A.A.A.A.A.G.A.S.H.G.G.S.H.H.G.H.H.G.L.L.H.H.H.H.H.L.H.H.H.L.L.G.L.L.L.L.G.S.D.H.S.S.H.S.S.H.H.S.H.S.S.S.S.J.h.A.h.L.A.G.H.S.H.H.H.H.H.H.H.H.H.A.H.H.H.H.H.H.H.H.H.L.H.H.G.L.G.G.L.H.H.H.H.H.H.H.H.L.L.L.L.S.L.L.U.L.P.P.U.U.P.T.T.T.T.T.T.T.T.T.~.~.[.!.T.~.~.~.~.^.!.[././././././././.(.(.(.(.(.(.(.(.].`.^.(.(.{.(.{.`.^.(.(.(.(.{.(.[.(././././.~./.~.R.~.T.~.~.~.~.~.~./././././.~.~./.~.~.~.",
+"J I P H L L L I I I Y ` Y v.v.c.v.v.N.N.C.6.7.7.7.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.&.*.*.#.#.$.$.8 q.B.B.B.hX+XlXkXkXjXrX0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.$.6 < 1 X q.OXB.B.B.B.0.0.0.0.7.7.6.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 < 3 3 B.B.B.B.rXrXjX0.0.7.%.%.%.%.%.%.%.%.%.%.%.%.%.&.$.8 < 1 . . q.].B.B.V.V.V.N.V.N.N.N.C.n.N.N.V.V.V.B.B.jXrXrX0.0.7.3.3.%.%.%.%.%.%.%.&.$.$.6 < X . q.lXB.B.B.B.lX+XjXkXrXrXrX7.9.%.%.&.#.8 3 1 . . < $X$X$X$X0.0.OX0.0.7.6.%.%.%.%.*.#.$.6 1 X X w bX$XbXbX$X$X$X$X$XbX$XbX$XrXjXrX0.0.7.3.%.%.%.%.%.#.8 3 < 1 < i bX$X$XjX0.rXOX0.7.6.%.%.%.%.%.%.%.%.*.#.8 6 < X . 7 bXbXbXNXbXNXbXbXJXkXjXjXjX0.6.3.*.$.8 6 3 < < q.bXNX7.0.0.0.0.7.6.%.%.%.%.%.*.$.8 < X . . c NXNXbXbXbXbXbXbXbXbXbXOX0.0.0.7.7.6.3.%.%.%.%.%.&.$.8 3 < 1 3 q.$X$X$XjXjXrXjXrX0.6.3.%.%.%.%.%.%.%.%.&.=.8 < X . X v.$X&X+X&X&X).E.).).).).&X&X+X+X+XbXkXkXkXrXrX7.9.%.%.%.%.%.%.%.%.%.%.%.*.$.8 3 1 1 1 q.$X$X$XrXjXjXjXrX0.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 1 . . . V.&XE.E.J.J.W.x.W.s.j.h.s.j.f.z.a.k.a.a.f.a.i.z.a.a.a.a.a.k.d.f.f.f.S S / CXVXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXGXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBXpX[ ~ S [ ~.~.~.T.~.T.~.T.T.~.T.T.~.~.~.~.T.T.~.~.T.T.T.T.T.T.T.T.U.U.P.P.T.T.P.P.Y.L.U.L.L.P.L.L.L.L.L.P.L.H.G.L.G.G.H.H.H.G.H.H.S.S.S.z.A.G.A.A.A.A.A.A.A.A.A.A.h.A.g.A.Z.h.A.Z.A.Z.h.A.A.A.A.A.g.A.h.Z.A.A.A.A.A.A.H.A.A.G.H.H.H.L.H.L.L.G.L.D.H.P.L.G.H.L.H.L.L.L.L.L.H.L.G.L.L.L.G.D.H.S.H.H.H.A.H.h.A.G.A.A.G.A.A.H.h.H.A.H.G.S.H.H.H.H.H.H.H.H.H.H.H.A.H.H.H.H.H.H.G.G.L.L.G.L.H.H.S.H.H.H.H.H.H.H.S.L.L.S.L.L.H.U.L.L.P.P.L.P.Y.T.T.T.T.T.T.T.~.T.~.T.~.~.~.!.~.[./.[.~././.(./././.(./.(.^.(.!.(.(.(.(.(.(.`.(.(.(.(.{.[.{.(.(.(.`.[.(.(.(.!./.!.~./.~.~.~.(./.T.~.~.~.[.~.~./.~./././.~.~./.~.(.",
+"I J J P P K I I Y J Y ` ` ` v.v.n.v.V.N.F.7.6.7.7.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.*.#.#.$.$.#.3.B.B.lXaXlXkXkXjXrX0.7.9.3.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.8 < 1 X i B.lXB.B.B.OX0.0.0.7.7.4.3.%.%.%.%.%.%.%.%.%.%.*.#.8 6 < < 3 C.B.B.B.0.rX0.0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 1 X . . C.B.B.B.V.V.C.N.n.v.N.N.n.N.N.N.N.V.V.B.B.OXrXrXrX0.7.6.3.%.%.%.%.%.%.%.&.#.$.6 < X X x B.B.B.B.lXB.+XlXjXjXrX0.7.3.%.%.#.$.8 1 1 . . i $X$X$X$X0.rXrX0.0.6.9.%.%.%.%.%.#.$.6 1 X . ] bXbXbX$X#X$X$X$X$XbX$X$XbXjXrXrXrX0.7.6.%.%.%.%.&.#.8 6 < 1 1 q.$X$X$XrXrXrXrX0.0.6.%.%.%.%.%.%.%.%.&.#.$.6 < X X w bXbXbXbXNXbXNXNXlXkXkXjXrX0.6.3.#.$.6 3 < < < C.NXbX7.7.0.0.0.7.6.3.%.%.%.&.*.$.8 < X . . B.$XbXbXbXbXJXbXNXNXbXbXbX0.rX0.0.7.6.3.%.%.%.%.%.*.$.8 3 1 1 < C.$X$X$XjXrXjXrX0.7.3.%.%.%.%.%.%.%.%.&.*.$.6 1 X . . V.+X+X+X&X&X&XE.E.E.&X).&X+X&X+X#XbXlXjXkXrX0.7.3.%.%.%.%.%.%.%.%.%.%.&.#.$.6 1 1 1 1 OX$X$X$XjXjXjXjXrX7.9.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.8 < 1 . . 1 &X&X&XJ.E.W.W.W.W.h.x.h.s.j.f.a.a.a.a.f.a.a.a.a.i.z.a.a.a.a.f.f.f.k./ S ! ZXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXGXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXBXQ.{ Q ^ c.~.~.~.T.T.~./.T.~.T.~./.~.~.T.~.~.~.Y.~.~.T.(.T.T.T.T.L.U.T.T.U.T.P.U.U.U.U.U.L.P.L.P.L.L.S.L.S.L.L.L.L.G.L.H.S.H.H.H.S.S.S.H.A.A.A.S.S.A.A.A.A.h.Z.h.A.h.h.A.h.j.h.A.h.h.A.h.A.Z.h.Z.h.A.h.A.A.A.A.h.A.A.H.G.H.K.H.H.H.L.H.L.L.G.P.L.L.L.G.L.L.H.L.L.L.L.G.L.L.H.H.P.D.G.H.G.L.H.H.S.H.H.A.H.S.G.A.A.A.A.A.A.A.A.H.A.H.S.G.H.H.S.S.H.H.D.H.S.S.A.H.H.H.G.H.H.S.L.G.U.G.H.L.H.H.H.H.H.H.H.H.H.H.H.S.S.U.S.U.A.L.L.L.L.L.U.U.U.T.T.T.T.T.^.T.T.~.[.T.T.~.~.~.~./././././././././.(.!././.^.^.].`.(.(.(.(.(.(.(.(.(.(.{.(.(.(.[.(.^.(.(./.^./.(./.~./.~.~.T.~.~./.T.~.~.~./.~./.~././.~.(.T.~.T.T.",
+"J J I J P L K I Y K ] Y Y v.` v.v.N.n.C.V.C.7.6.6.7.6.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.*.#.$.#.2.%.7.B.B.B.lXkXkXjX0.7.9.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.8 < < 1 4 B.B.B.B.B.OX0.0.7.0.7.6.6.%.%.%.%.%.%.%.%.%.%.&.#.8 6 6 3 3 C.V.B.B.jX0.0.0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 1 X . + B.B.B.V.V.V.n.N.N.n.n.v.N.v.n.N.N.V.V.V.B.OXrXrXrX0.7.6.3.%.%.%.%.%.%.%.&.#.$.6 < 1 X i B.B.B.B.B.B.+XlXkXjXrXrX7.6.%.%.#.$.6 1 . . . C.$X$X$X$X0.0.rXrX0.7.6.%.%.%.%.&.#.8 6 1 X . q.bX$X$X$X$X$X$X$X$X$X$XbX$XlXOXrXrX0.7.6.%.%.%.%.%.#.8 6 < 1 1 8.$X$XbXOXrXrXrX0.7.6.%.%.%.%.%.%.%.%.%.#.$.6 < X . 7 bXNXbXNXbXbXNXbXUXkXkXjXrX0.6.&.#.8 6 1 1 1 1 bXNXNX0.0.0.0.0.7.6.%.%.%.%.&.#.$.6 1 X . X NXbXbXNXbXbXbXbXbXbXbXNXNXrXrXrXrX7.6.6.%.%.%.%.%.*.$.8 < < 1 1 OX$X$X$XjXrXjXjX0.7.6.%.%.%.%.%.%.%.%.*.#.$.6 1 X . . $X+X+X&X&X).E.E.).E.E.E.&X&X+X+X+XlXkXkXrXrX0.6.6.%.%.%.%.%.%.%.%.%.%.&.#.8 3 1 1 X < $X$X$XjXjXjXjXrX0.7.6.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.6 < X . . i &X&X&X&XJ.J.W.h.x.s.s.j.h.s.s.a.a.a.a.a.a.a.a.a.a.a.k.a.k.a.i.f.f.k.P / ! BXHXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXSXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXZXZXZXBXm.[ ! ^ [ ~.(.~.~.~./.T.~./././.T.~./.~./.~.~./.~.~.T.T.T.T.T.T.T.T.T.T.T.T.Y.Y.P.P.L.U.U.P.U.L.P.L.P.L.L.L.L.H.H.L.H.L.U.H.H.H.G.G.H.S.G.A.H.h.g.H.h.A.A.A.A.A.A.h.A.h.A.h.A.j.A.h.A.A.g.A.h.A.A.h.A.A.A.A.A.A.S.G.A.H.H.A.H.U.L.L.L.L.L.H.L.L.L.L.L.L.H.L.L.L.L.P.H.L.L.L.L.A.H.H.G.H.H.L.S.S.H.H.H.H.h.A.G.Z.A.A.A.A.A.A.A.A.H.S.S.S.G.H.H.S.S.H.S.S.S.S.H.G.A.H.H.L.H.L.H.H.H.G.G.H.H.H.H.H.H.H.S.H.H.H.H.H.S.L.S.L.L.L.L.L.P.L.L.T.U.T.T.T.T.T.T.~.T.~.[.T.~.~.~.~.~.[././././.[.(./././.(./.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^././.(.(.(././././.~.~.~.T.T.T.~.T.T.~.!.~.~./.~.~.~.T.~.~.~.~.",
+"P P P P L P J I P ) I Y ` ` v.v.v.n.n.n.V.V.7.7.7.6.6.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.&.%.*.*.#.#.*.%.6.0.OXB.kXjXjXjX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.8 6 1 1 X B.B.B.B.&XB.0.0.0.0.7.6.6.%.%.%.%.%.%.%.%.%.%.&.#.8 6 3 < < 8.B.B.B.OX0.0.0.0.7.6.3.%.%.%.%.%.%.%.%.%.%.&.#.$.< 1 X X 7 B.B.V.V.V.V.N.n.v.n.c.c.v.v.C.n.N.N.V.V.B.OXrXrX0.0.7.7.3.3.%.%.%.%.%.%.&.#.$.6 < 1 X 7 B.B.lXB.&XB.+XkXkXjXrXrX7.6.%.#.#.8 < X . . X $X$X$X$X$XOXrXrXrX0.7.6.%.%.%.%.&.#.8 6 < X . q.vX$X$XbX$X@X$X$X$X$X$XbXbXjXjXjXrX0.7.3.3.%.%.%.&.$.8 < < < 1 q.@X$X$XOXrXrXrXrX0.6.%.%.%.%.%.%.%.%.&.#.8 6 < X X l bXbXNXbXbXbXNXNXUXlXlXjX0.0.3.&.$.8 < 1 1 1 7 NXNXNX0.0.0.rX0.7.3.3.%.%.%.&.#.8 6 1 . . i bXNXbXbXJXbXbXbXNX$XNXbXbXrXjXrXrX7.7.3.%.%.%.%.%.#.$.6 < 1 < 1 #X$X$X$XrXjXrXrX0.7.3.3.%.%.%.%.%.%.%.*.#.8 3 1 X . w @X+X+X&X).E.&XE.E.E.E.&X&X&X+X$X$XlXkXkXjXOX7.6.3.3.%.%.%.%.%.%.%.%.&.&.$.6 < 1 X 1 c $X$X$XOXjXrXjXrX0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.8 6 1 . . 1 C.&X&XJ.J.W.J.W.j.h.W.h.g.a.a.a.i.a.a.a.a.a.k.a.a.a.a.a.a.z.a.i.d.k.f.~ ! S ZXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXGXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXAXFXDXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXDXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXAXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXZXFXZXZXBXm.[ Q ^ [ ~.~.~.~.~.~.P.^./.~./.!.~.~./.T.~.~.~.~./.T.T./.T.T.T.T.T.T.T.T.P.U.U.L.U.U.Y.L.P.P.L.P.L.L.L.S.H.H.H.L.H.H.S.H.L.H.H.H.S.H.S.S.S.A.S.Z.A.H.h.A.A.A.A.A.Z.h.h.A.A.A.A.h.g.G.j.A.A.h.Z.A.h.h.A.z.A.A.A.A.A.A.H.H.L.G.L.L.L.L.I.L.L.L.U.L.L.L.P.H.L.L.L.L.L.L.L.L.L.H.H.H.H.G.D.H.S.S.H.H.H.G.S.H.Z.G.A.A.A.j.l.A.A.S.G.S.S.S.S.S.H.S.S.H.S.G.H.S.A.G.H.S.H.H.H.H.G.G.L.H.L.H.H.H.H.H.G.H.H.S.H.G.S.H.U.S.U.L.G.L.L.L.L.P.U.L.Y.T.T.T.T.T.T.~.T.T.Y.~.T.[.~.!.~.~.[.^./././.(./././.!.(./.(.(.(.(.(.(.(.(.(.(.`.].(.(.{.(.(.(.(.(.(.(./.(./.(.(.!.~.(.~.~.~.T.~.T.~.T.~.T.~.~.~.~.~.T.~.~.~.T.T.~.",
+"I I I P Y P I I P Y Y ] Y ` ` Y v.b.C.N.C.V.C.6.6.7.7.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.*.%.6.6.0.OXlXjXjXjX0.0.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.8 6 < 1 1 C.B.B.B.lXB.0.0.0.0.7.6.6.%.%.%.%.%.%.%.%.%.%.%.*.$.8 3 < 1 q.aXB.B.OX0.0.0.0.7.6.9.3.%.%.%.%.%.%.%.%.%.&.#.8 6 X X . c B.B.V.V.V.n.C.v.N.N.c.n.v.n.c.n.N.N.V.V.B.aXjXrXrX0.7.7.3.3.%.%.%.%.%.%.%.#.$.6 4 1 1 w B.B.+XB.B.$XJXkXkXjXrX0.6.3.&.#.$.6 < X . . i $X$X$X$X$XOXrXrX0.0.7.6.3.%.%.%.%.#.8 6 1 X . c $X$X$X#X#X$X+X+X$X$X$XbX$XlXjXjXrX0.7.6.%.%.%.%.&.#.8 < 1 1 1 C.$X$X$XOXjXrXrX0.7.6.%.%.%.%.%.%.%.%.&.#.$.6 < < X q.NXbXNXNXNXNXbXUXUXkXjXrX0.7.3.#.$.6 1 X X X 8.NXNXNX0.0.rX0.0.7.6.3.%.%.%.*.#.8 3 1 . . q.bXJXbXNXNXbXbXNX$XNXbXbXNXrXrXjXrX0.6.3.%.%.%.%.%.#.$.6 1 1 1 3 $X$X@XlXjXjXjXrX0.7.3.%.%.%.%.%.%.%.%.*.$.8 < X . . q.+X+X+X+X&XE.E.&XE.E.&X&X&X&X+X+X$XkXkXjXjX0.0.6.%.%.%.%.%.%.%.%.%.%.&.#.$.6 < X X 1 C.$X$X$XrXjXjXrXrX7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.8 3 1 . . 9 &X&X&X&XJ.W.x.W.h.h.s.j.a.z.a.a.u.a.z.a.a.a.s.a.a.a.a.a.a.a.a.d.i.f.f.~ ! / ZXCXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXGXSXDXAXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXZXZXHXQ.} ! ^ [ (.~.(.~.~./.^.[.~./././.~./.~././.~.(.~.~.~./.T.T.~.~.T.T.T.T.U.T.U.U.U.Y.P.L.L.P.P.P.P.L.P.P.L.L.L.L.L.L.H.H.L.H.H.H.H.H.S.D.H.S.S.S.S.A.A.A.A.A.A.A.A.W.h.A.h.A.h.h.A.A.j.A.A.A.A.A.A.D.z.A.A.A.A.A.G.A.G.H.H.L.L.U.U.U.U.U.U.P.U.L.L.P.L.L.P.P.L.U.U.P.P.L.L.H.L.H.H.H.G.D.H.H.L.H.H.G.H.A.S.A.h.A.A.A.A.G.l.A.A.h.h.A.S.S.S.H.S.H.H.H.S.A.G.S.S.S.S.A.H.H.H.H.L.H.H.H.H.H.H.H.H.G.Z.H.H.Z.H.S.H.D.A.L.S.L.L.L.L.L.L.L.U.P.U.P.T.T.T.T.T.T.T.T.T.~.T.~.T.~.~.!.^././././././.(././.(.~.(.(.(.(.^.`.(.(.(.(.(.{.(.(.(.(.(./././././.(././././.~.(.R.~.~.~.T.~.T.~.T.~.T.~.!.~.~.T.~.T.T.~.T.T.",
+"I P P J P P J I I I ` ` v.Y v.v.v.n.v.C.C.V.B.7.7.6.7.6.6.3.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.&.%.%.%.%.6.6.7.0.0.jX0.0.0.7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.$.6 < 1 X 8.B.B.'.B.B.OX0.0.7.7.7.6.%.%.%.%.%.%.%.%.%.%.%.#.$.8 3 < < 7 +XB.B.OX0.0.0.0.7.6.6.%.%.%.%.%.%.%.%.%.%.&.#.8 6 1 X X c B.B.V.V.n.N.v.n.v.c.v.c.c.c.v.N.n.C.V.V.V.B.rXrXrX0.0.6.3.3.&.%.%.%.%.%.&.*.$.8 3 < 1 7 bXOXB.B.B.+XlXUXkXjXrX0.6.3.#.#.8 6 X . . . C.$X$X$X$X$XjXrXrXrX0.7.6.%.%.%.%.*.$.$.6 < X . q.bX$X$X$X+X+X$X#X#X$X$X$X$XlXjXjXrX0.7.6.%.%.%.%.&.$.8 < 1 1 1 V.$XbXbXOX0.rXrXrX7.6.%.%.%.%.%.%.%.%.&.#.$.8 6 < 1 v.bXJXbXbXNXNXNXUXUXkXjXjX0.6.&.#.8 < 1 X . X bXNXNXNX0.rX0.jX0.7.3.%.%.%.%.*.$.8 < 1 . . V.NXbXNXbXbXbXbXNXNX$XbXNXNXjXjXjXrX0.7.3.%.%.%.%.*.#.8 < 1 1 1 i $XbX$XOXrXjXjXrX0.6.3.%.%.%.%.%.%.%.%.#.$.8 < X . . N.@X&X&X&X).E.E.E.E.E.&X&X&X&X+X$X$XkXjXkXrX0.7.9.3.%.%.%.%.%.%.%.%.%.&.#.8 3 1 X X 1 $X$X$XNXrXjXrXrXrX7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 < X . . i &X&X&X&XW.W.W.W.x.f.f.f.s.i.a.a.a.a.t.i.a.a.i.a.a.a.a.a.z.z.i.a.a.i.a.~ ! ! AXVXAXFXZXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXAXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXDXFXFXFXFXFXFXFXFXAXDXFXGXFXFXFXFXFXFXFXFXDXAXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXZXDXDXDXBXM.[ / Q ` /./.(.~./.~./.E./././././.(.(.(.(./.^.~./.~.~.!.~.T.~.T.T.T.T.T.T.T.L.Y.Y.P.U.Y.P.P.P.P.U.L.P.U.L.S.L.H.L.L.H.H.H.H.H.H.H.S.G.H.H.S.A.H.H.A.A.G.G.A.A.h.h.A.h.A.A.h.A.A.j.G.A.A.A.g.A.A.k.D.A.D.Z.h.W.A.h.G.K.H.L.U.U.U.U.U.U.U.U.P.P.P.P.L.U.P.U.U.U.U.U.L.L.L.L.H.G.H.H.H.L.H.H.H.H.H.H.H.H.A.A.A.A.A.h.A.A.G.A.A.S.S.A.S.S.S.G.G.S.S.S.S.A.A.A.h.S.S.H.G.H.H.L.H.L.G.H.H.S.H.G.H.G.K.H.H.G.H.S.U.S.L.A.S.L.L.L.L.L.L.P.L.U.Y.P.T.T.T.T.T.T.T.Y.~.~.T.~.T.~.^././.(./.(./././.(./.(./.(.(.(.(.(.(.`.^.^.`.(.(.(.(.(.(./.(.(./.(./././.^.[././.~.~.~.~.T.~.~.T.T.~.T.~.T.~.T.~.~.~.~.T.T.T.T.T.",
+"J I P P P K Y I U I L Y Y ` ` ` v.v.n.n.V.V.V.C.6.7.6.6.6.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.3.6.7.7.0.0.0.0.7.6.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.8 < < 1 i B.aXOXOXaXOX0.0.0.0.7.6.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 < < < B.B.B.jX0.0.0.0.0.6.%.%.%.%.%.%.%.%.%.%.%.&.#.8 < 1 X . 8.B.B.V.V.N.N.n.v.v.b.v.n.c.v.v.n.n.n.V.V.V.B.rXrXrX0.0.7.6.3.&.%.%.%.%.%.&.*.$.8 8 7 3 7 B.B.B.B.lX+XUXkXkXrXrX0.6.&.#.$.8 1 X . X 3 $X$X$X$X$X$XOXrXrX0.0.7.7.9.%.%.%.%.#.$.6 1 1 X ] bX$X$X$X$X$X+X#X$X$X$X$X$XlXjXjXjX0.7.6.%.%.%.&.&.$.6 1 1 X 1 V.@X$X$XjXjXrXrXrX7.6.%.%.%.%.%.%.%.%.*.#.$.8 6 3 3 C.bXbXNXNXbX$XUXkXUXkXjX0.7.3.*.$.8 1 X . . x bXNXbXlX0.rXjX0.0.7.3.%.%.%.&.*.$.6 < X . . xXbXNXNXbXNXbXbXbXbXbXNXbXlXkXjXjXrX0.7.3.%.%.%.%.*.$.8 < 1 1 1 8.$X$X$XjXjXjXjXrX7.6.3.%.%.%.%.%.%.%.%.#.$.3 1 X . . +X+X+X+X).E.&XE.E.E.E.E.&X&X+X+X$XOXkXkXjXjX0.7.6.%.%.%.%.%.%.%.%.%.&.*.$.8 < X . X i $X$X$XlXrXrXjXrXrX7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 1 . . . W.&X&X&XW.W.W.x.x.h.f.f.f.a.a.a.a.a.i.a.i.i.a.i.i.a.a.i.a.i.a.a.a.a.a.a.~ ! ! CXHXFXFXFXFXFXFXFXFXFXFXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXDXDXDXSXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXGXZXZXHXBXQ.{ / S [ ~.~.~.~./././.(././././././././.(.^././.~./.~.~.T.~.T.~.~.T.T.T.T.T.P.P.L.U.U.P.P.P.P.P.L.L.P.U.L.L.L.L.L.H.L.H.H.L.H.S.H.H.H.G.A.G.G.H.H.A.A.G.A.G.A.A.A.A.A.A.A.A.j.Z.Z.A.A.A.A.A.A.A.Z.A.k.D.Z.h.A.A.W.H.A.K.L.U.U.U.T.U.U.U.U.U.P.P.U.P.T.T.U.U.U.U.U.U.L.L.L.G.L.H.H.H.H.S.H.A.L.L.H.H.A.S.G.A.g.h.h.h.h.h.A.A.A.h.S.A.S.G.H.H.S.S.G.S.A.A.A.A.S.S.G.H.H.H.G.S.H.H.H.H.H.H.H.G.G.G.H.G.S.S.S.S.S.L.D.U.H.L.S.L.L.L.L.L.U.P.T.P.T.T.T.T.T.T.T.Y.Y.~.~.[.~.^.[./.{.(.(./.(./././.(.(.(.(.^.^.(.(.(.(.(.(.(.(.(._.(./.(././.(.^./.^.[.^.^.E./.~.T.~.T.~.T.T.T.T.T.~.T.~.~.T.~.~.T.T.T.~.T.~.T.",
+"P P P P P P P I I I P ) ` Y ` v.v.v.n.N.V.V.V.OX7.6.7.6.7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.6.%.6.6.7.7.0.6.6.6.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.8 3 1 1 7 hXB.B.B.B.B.0.0.0.7.7.7.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 < < < B.B.B.lX0.0.0.0.7.7.3.%.%.%.%.%.%.%.%.%.%.*.#.8 3 1 X . C.B.V.V.N.N.v.v.n.v.v.` c.c.c.n.c.N.N.N.V.V.B.jXOXrX0.0.7.6.3.%.%.%.%.%.%.%.*.#.$.8 8 6 6 B.B.B.B.B.UXUXkXjXjX0.7.3.#.$.8 < X . . X v.$X$X$X$X$X$XbXrXrXrX0.7.6.3.%.%.%.%.#.8 8 1 1 . q.$XbX#X$X#X$X+X$X$X$X$X$XbXOXjXjXrX0.0.9.%.%.%.%.*.$.6 < 1 1 1 $XbXbX$XOXrXrXrX0.7.6.%.%.%.%.%.%.%.%.&.#.#.8 8 8 7 OXbXNXNXbXlXkXUXkXkXjXrX0.6.%.#.8 3 1 . . X OXNXNXNXlXrXrXjXrX0.7.3.3.%.%.&.*.$.6 1 X . 1 NXJXbXNXbXbXbXbXbXNXbXbXNXlXlXjXjXrX0.7.4.%.%.%.%.*.$.6 < 1 1 1 C.$X$X$XjXjXjXjX0.0.6.%.%.%.%.%.%.%.%.&.#.$.< 1 . . 9 +X+X+X&X&XE.E.E.J.&XE.E.&X&X&X+X$XlXlXlXjXrX0.7.3.3.%.%.%.%.%.%.%.%.&.#.$.6 < . . . C.bX$X$XlXOXrXrXrX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.8 < 1 . . X &X&X&X&X&Xx.W.W.s.W.s.s.k.i.s.i.i.i.i.i.i.i.i.i.i.i.i.i.z.s.i.i.a.a.a.i.I ! ! ZXAXAXAXAXGXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXAXGXSXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXVXFXFXZXZXBXm.} ~ Z [ ~.~./.~././.(.(.(.(.(./.(.(.(.!.(.^./.[./.E.~.~.~.~.Y.~.~.U.I.~.P.T.P.T.T.T.P.T.U.Y.Y.P.P.P.P.T.L.U.U.L.L.L.L.S.H.L.H.L.S.H.H.H.H.Z.G.A.H.H.A.S.G.G.S.h.S.A.h.h.A.j.A.h.Z.A.A.Z.G.D.A.D.x.A.J.G.Z.z.x.l.D.D.U.G.L.U.J.U.U.U.U.XXJ.U.U.U.U.XXoXT.T.z.T.T.U.U.L.U.L.G.L.D.H.H.H.H.S.K.S.H.H.S.H.A.A.A.A.h.A.h.A.A.A.z.A.A.H.G.A.G.S.S.S.S.S.S.S.S.A.A.A.A.S.H.H.H.L.G.L.G.D.L.L.D.H.H.H.H.S.S.H.H.S.H.H.H.S.U.Z.L.P.L.L.L.L.L.L.U.L.L.P.U.Y.Y.T.T.T.T.T.T.~.~.~.~.!.^.^./.(.(.(.(.(.[.!.(.(.(._.[._.(.(.(.(.(.(.^.(./.(.(.(.!.(././.(././././.~.~.~./.T./.~.T.~./.T.T.T.~.T.~.T.~.T.T.T.~.T.T.T.U.",
+") P ) P ) P _ P I Y Y ) Y ` ` v.v.b.v.n.n.V.V.V.C.6.7.7.6.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.6.6.6.6.6.6.6.3.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 3 1 1 X B.B.B.B.lXB.OX0.0.0.7.7.6.%.%.%.%.%.%.%.%.%.%.*.#.8 6 3 < 1 C.B.B.+X0.0.0.0.7.7.3.3.%.%.%.%.%.%.%.%.%.*.#.8 3 1 X . v.B.B.V.V.N.N.n.c.c.c.v.b.c.` v.n.v.n.N.V.V.V.jXrXrX0.0.7.6.3.%.%.%.%.%.%.%.&.#.$.$.$.8 $.B.B.B.B.lXkXkXkXjXrX7.6.%.#.$.6 1 . . . 9 $X$X$X$X$X$X$X$XrXrX0.0.7.7.6.%.%.%.%.#.$.8 < 1 X i vX$X$X#X$X+X+X$X$X$X$XbX$XlXlXjXjXrX7.6.6.%.%.&.#.$.6 1 1 X < $X$X$X$XjXjXjXrXrX7.6.4.%.%.%.%.%.%.%.&.#.#.$.$.$.$.OXbXbXbXlXkXUXkXkXjXrX0.7.3.&.$.6 < . . . < JXNXNXNXNXrXrXrX0.0.7.3.%.%.%.%.#.$.6 < X . 7 bXNXNXbXbXJXbXbXbXbXbXNXbXbXjXjXjXrXrX7.3.%.%.%.%.#.=.6 1 X 1 1 &X$X+X$XrXjXjXjX0.7.6.%.%.%.%.%.%.%.%.&.$.8 < 1 . X i @X+X&X+X).E.E.E.E.E.E.E.E.&X&X+X$XlXlXjXjXjX0.6.3.%.%.%.%.%.%.%.%.%.*.#.8 6 1 . . X $X$X$X$XB.0.jXrXrXrX7.3.%.%.%.%.1.3.%.%.%.%.%.%.%.%.%.%.%.%.&.&.&.&.*.$.6 < 1 . . i &X&X&XW.W.W.s.W.x.s.s.W.s.i.i.a.i.s.a.i.i.i.i.i.u.i.a.i.i.a.i.a.a.a.a.i./ / / BXAXFXAXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXDXDXFXAXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXVXZXZXBXm.[ ~ n [ /.^.~././.^.~.(.(.(.(.^.(.(.(.(.(.(./.(.[.!./.~.~.~.~.~.T.~.~.T.T.T.T.T.T.P.T.P.T.T.P.T.T.P.P.P.U.U.L.L.L.L.L.L.L.L.L.H.H.H.H.H.H.H.H.S.S.A.S.S.G.H.S.S.G.A.S.Z.A.G.D.A.z.Z..XIXPXPXIXPXPXIXGXPXIXPXPXPXPXPXIXPXPXIXPXPXIXPXGXPXPXPXPXIXGXPXGXPXIXPXIXmXK.Z.L.L.L.L.L.G.G.H.H.L.L.U.H.S.H.S.h.S.h.A.h.A.h.A.h.h.A.A.A.A.A.A.A.A.S.S.S.S.S.S.A.S.A.A.A.H.H.A.G.H.G.L.D.H.H.D.D.H.H.H.H.H.L.G.H.H.H.H.D.H.D.H.H.H.H.S.U.S.L.L.L.L.U.U.T.Y.T.U.P.T.T.T.T.~.~.~./.(./././.(.(./.(.[.(.^.`.^.(.[.{.(.(._._.(.(.(.(._.(.(.(./.(././.(././.[./././.~.~.~.T./.T.~.T.T.T.T.~.T.T.T.~.~.T.~.T.T.T.T.T.T.T.",
+"P ) P P I P / I I I ) ) I ` ` ` e.v.v.n.C.n.V.V.&X7.6.7.7.6.6.9.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.3.%.3.6.%.%.6.3.6.%.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.$.8 6 < 1 X C.B.OXB.B.B.OX0.0.0.7.7.6.6.%.%.%.%.%.%.%.%.%.*.#.$.6 < < 1 8.B.B.B.OX7.0.0.7.7.6.3.%.%.%.%.%.%.%.%.%.*.#.8 6 < X . N.B.B.V.N.N.N.N.v.n.c.` ` c.c.c.c.n.N.n.N.V.B.OXrXrX0.0.7.6.3.%.%.%.%.%.%.%.&.#.$.$.$.$.#.OX].OXlXlXkXkXjXjX0.7.3.*.$.6 1 X . . . C.$X$X$X$X$X$X$X$XrXrXrX0.0.7.3.%.%.%.%.#.$.8 1 1 X 4 bX$X$X$X#X$X$X$X$X$XbX$XbXlXjXjXjX0.0.6.&.%.%.&.#.8 6 1 X X 7 bX$XbX$XOXrXjXjXrX7.6.3.%.%.%.%.%.%.%.%.&.#.#.#.#.#.6.7.7.0.jXkXjXkXjXrXrX7.6.&.#.8 3 1 . . . C.NXNXNXNXNXrXjXrXrX0.7.6.%.%.%.%.#.8 6 < X . 7 NXNXNXNXbXbXbXbXbXbXbXNXbXlXkXkXjXrX0.6.3.3.%.%.&.#.8 6 1 1 X 1 $X$X$X$XrXjXjXjX0.7.3.%.%.%.%.%.%.%.&.#.$.7 < 1 . . v.+X+X&X&X&XE.E.E.E.&XE.E.&X+X+X+X$XkXkXkXjXjX7.6.3.%.%.%.%.%.%.%.%.%.#.$.6 < X . . i bX$XbX$XbXrXrXrX0.0.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.%.%.&.*.*.*.*.#.8 6 1 . . X C.&X&XW.W.x.W.x.W.s.W.s.s.a.s.i.u.i.u.u.i.i.i.u.i.i.u.i.a.i.i.z.i.a.a.i.a.! ! ! ZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXDXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXZXZXZXZXQ.{ ! S [ ~.~.!.~.!././.(././.(.(.(.^.(.(.(.(.(./.[./././.~.~.~.~.T.~.T.~.T.T.T.T.T.T.T.P.T.T.U.T.P.P.P.P.L.Y.L.L.L.L.L.L.L.L.H.L.H.H.H.H.H.H.H.A.H.S.S.S.z.S.A.S.h.S.A.A.h.J.Z.z.z.JXIXPXPXGXPXGXPXGXPXPXPXGXGXPXIXPXPXGXIXPXGXPXGXPXPXPXPXGXGXPXPXGXPXPXPXGXIXGXnXY.P.L.L.L.G.L.L.H.H.L.J.S.H.H.S.S.Z.A.W.j.h.A.A.h.A.h.h.A.A.A.A.G.A.G.S.S.S.S.S.S.G.A.G.A.h.H.A.H.L.A.G.S.L.G.D.P.L.L.H.D.H.H.A.H.H.H.H.S.H.H.H.H.L.H.H.U.S.U.L.L.L.L.L.L.L.U.U.P.P.Y.T.T.T.~.T./.~.~.[././././.(./.(.(.^.].(.[.(.|.(.(.(.(.(.(.(.(.(./.(././././.(.).^.!././.~.~./.T.T./.T.T.~.T.T.T.T.T.[.T.~.T.T.T.~.T.T.T.T.U.I.T.",
+"P P I P U I U P I I ) Y ` ` Y ` ` v.v.C.n.n.V.V.V.0.6.7.7.6.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.3.3.%.6.%.3.3.%.%.%.%.%.%.%.%.%.%.%.%.<.%.%.%.%.%.%.&.#.8 6 < 1 X C.B.+XB.B.aXOX0.0.0.0.7.6.6.%.%.%.%.%.%.%.%.%.*.#.$.6 3 4 9 q.B.B.B.OX0.0.0.0.7.7.3.%.%.%.%.%.%.%.%.%.*.#.$.6 < X . 8.].V.V.V.C.v.v.v.c.v.c.v.c.c.v.n.v.n.V.V.V.B.B.rXjXrX0.0.6.3.%.%.%.%.%.%.%.&.*.#.#.#.*.&.6.0.0.jXjXjXjXjX0.7.3.%.$.8 3 1 . . X 4 $X$XbX$X$X$X$X$X$XrX0.0.0.0.6.6.%.%.%.%.*.$.8 3 9 X 7 bXbXbXbX$X$X$X$X$X$XbXbXbXjXlXjXjX0.7.3.%.%.%.&.#.8 6 1 X 1 w $XbXbXbXjXjXrXrXrX7.6.%.%.%.%.%.%.%.%.%.&.*.*.#.&.&.3.6.0.0.OXjXjXjXrX0.0.6.3.#.$.6 < . . . 1 NXVXNXNXNXVXrXjXrXrX0.7.3.%.%.%.&.#.$.6 1 X . c NXbXNXNXbXNXbXNXbXbXNX$XbXlXkXjXjXrX0.6.3.%.%.%.*.#.8 < 1 . 1 i $X$X$XbXjXjXjXjX0.7.6.%.%.%.%.%.%.%.%.#.$.6 < X . . B.#X+X&X+XE.&XE.E.J.E.E.&XE.&X&X+X$XkXjXkXjX0.0.9.3.%.%.%.%.%.%.%.%.%.#.$.6 1 X . . C.$XbX$XbXbX0.rXrX0.0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.*.*.#.#.#.$.$.8 6 < X . . 9 &XJ.&X&XJ.W.W.W.s.h.s.x.s.a.s.t.i.u.i.u.u.u.f.u.u.i.i.u.i.i.a.t.i.a.a.a.i.S ! / CXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXAXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXFXFXFXFXDXAXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXZXBXpX[ / ! [ ~.~.~.~./.(./.(.(.(.(./.(.{.(.(.(.(.(./.^.^././.~.(.~.~.~.T.~.T.~.T.T.Y.T.T.T.T.T.T.Y.Y.T.P.T.P.L.U.U.U.U.L.Y.L.L.L.L.H.S.H.S.H.G.Z.H.H.A.S.G.S.H.S.S.S.A.A.S.A.S.h.G.f.H.GXPXPXPXPXGXPXGXPXIXIXGXPXPXGXPXGXGXPXPXGXPXGXPXGXPXIXPXGXPXIXGXPXIXIXIXIXGXDXBX].L.U.L.L.L.G.L.H.L.H.H.H.H.H.S.h.S.h.G.h.h.h.Z.A.h.G.A.A.h.A.A.A.A.A.A.S.S.S.S.S.G.z.A.G.A.A.H.A.G.S.D.H.D.H.H.D.A.D.H.H.L.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.U.S.S.L.L.L.L.L.Y.L.P.P.P.P.T.T.~.T./.T.~.~.~.~./.(././.(./.(.{.{.(.(.(.(.(.(.(.(.(.(.`.].(././.(./././././.^.^.~.E./.~.~.~./.T.T./.~.T.T.T.T.T.T.T.T.T.~.~.T.T.T.T.T.T.T.I.",
+"P P P I I I ) P I I I Y ` Y ` ` ` v.v.b.n.C.V.V.V.OX6.7.6.7.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.8 < 1 1 i B.lX+XlXB.B.0.0.0.7.7.6.6.%.%.%.%.%.%.%.%.%.%.*.$.6 3 1 4 7 +XaXB.B.7.0.7.0.7.6.3.3.%.%.%.%.%.%.%.%.&.#.$.6 3 X X q.B.B.V.V.N.N.v.b.c.c.c.c.` c.c.c.v.N.N.N.V.V.jXrX0.rX0.0.7.3.%.%.%.%.%.%.%.%.*.*.%.&.%.%.6.7.0.0.jXjXrX0.7.6.3.#.$.6 X . . . X ).$X$X$X$X$X$X$X$X$XjX0.OX0.0.7.6.%.%.%.%.*.#.8 6 1 X X bXbX$XbX$X$X$X$X$X$XbXbXbXkXkXjXjX0.7.3.%.%.%.*.$.8 3 X X . q.vX@X$XbXjXOXjXrX0.7.6.%.%.%.%.%.%.%.%.%.&.&.*.&.%.%.6.6.0.0.rXrXrXOX0.0.6.9.*.$.8 < X . . . C.NXSXNXNXVXNXrXjXrX0.0.7.3.3.%.%.%.#.8 6 1 X . q.NXNXNXbXbXbXbXbXbXbXNXNXNXlXkXjXjXrX0.6.3.%.%.&.*.$.8 < X X X C.$X$X$XOXjXjXjXrX0.7.3.%.%.%.%.%.%.%.&.#.8 6 1 . . 1 $X+X&X&XE.E.E.J.E.E.E.E.&X&X+X&X+XbXkXjXjXjX0.7.3.3.%.%.%.%.%.%.%.%.%.#.$.6 1 . . X $X$X$X$XbXbX0.rX0.0.0.7.3.%.%.%.%.%.%.%.%.%.%.%.%.&.&.*.#.$.$.$.8 8 8 6 < 1 . . . i &X&XJ.W.x.W.x.s.W.W.s.j.s.s.s.t.u.u.u.i.u.u.u.u.u.u.i.i.i.u.i.i.i.a.a.a.a.~ / / CXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXAXGXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXAXBXm.[ Q ^ [ !.~.T.~.~.^.^./._.(.(.(.(.[.`.^.(.(.(.(.(./././.~.~.~.~.T.~.T.~.~.T.T.T.T.T.T.~.T.T.U.Y.T.U.T.U.Y.I.T.L.P.U.L.U.P.L.P.P.L.H.H.H.H.S.H.H.G.S.G.S.z.S.S.A.A.S.S.S.z.D.Z.A.G.PXGXPXPXGXPXIXGXIXPXIXIXIXIXGXGXIXPXIXGXIXPXIXGXIXIXGXIXGXPXGXPXGXIXIXPXIXDXMXaXm.Y.P.L.L.L.G.H.H.L.H.H.H.H.H.G.A.h.G.h.h.G.j.h.Z.h.h.A.A.A.A.A.h.A.A.S.A.A.A.S.A.H.h.A.A.G.S.H.S.H.S.S.D.G.D.D.D.D.L.H.H.H.H.S.L.H.H.H.H.H.G.H.H.H.S.H.H.G.L.H.L.H.H.L.L.U.L.L.U.U.U.I.T.T.T.~.~.T./.!./././.(./.(./.[.(.^.(.[.(.(._.(.(.(.`.).(.(.(.(././././.!.!./././.~.~.~.~.~.T.T.~.T.~.T.T.T.~.T.~.T.T.T.~.~.T.T.T.U.T.L.T.I.T.",
+"P P I P P P P P I J I I I ) Y ` Y v.v.b.v.n.N.V.V.B.C.7.7.6.7.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.8 6 1 X 7 B.B.B.B.B.B.OX0.0.0.0.7.6.3.%.%.%.%.%.%.%.%.&.*.$.8 3 < 1 7 B.OXB.B.0.7.0.0.7.7.6.3.%.%.%.%.%.%.%.%.&.#.$.6 3 1 X i B.B.V.V.n.N.N.v.n.c.` c.c.c.c.n.n.v.N.V.V.B.].rXjX0.0.0.6.3.%.%.%.%.%.%.%.%.&.&.%.%.%.6.6.0.0.0.0.0.0.7.6.3.#.$.6 4 X . . . C.bX$XbXbX$X$X$X$X$X$XOXrX0.0.7.7.6.3.%.%.%.*.$.8 6 < 1 X ].$XbX$XbX$X$X$X$XbX$X$XbXjXkXjXrX0.7.6.%.%.%.*.$.7 3 X . . C.bXbXbXbXjXjXjXjX0.7.3.3.%.%.%.%.%.%.%.%.%.%.%.%.3.3.6.6.7.0.0.0.7.7.7.9.%.%.#.8 < 1 X . . 7 JXNXNXJXNXNXNXrXrXjXrX0.7.3.%.%.%.&.#.8 6 1 X . 8.mXNXbXNXbXNXbXbXNXbXbXbXbXkXkXlXjXrX7.6.%.%.%.&.#.$.3 1 X . X C.$X$X$XlXjXjXjXrX0.6.4.%.%.%.%.%.%.%.&.#.8 < 1 . . i +X+X&X+XE.&XE.&XJ.E.E.E.E.E.&X+X+XlXkXkXlXrX0.7.3.%.%.%.%.%.%.%.%.%.&.$.8 < X . . i bXbXbXbX$XbX0.0.rX0.7.7.6.3.%.%.%.%.%.%.%.%.%.%.&.&.#.#.$.8 8 6 6 6 < 1 1 X . . . Z.&X&XJ.W.W.W.W.x.W.s.s.s.s.s.s.u.u.u.u.u.u.i.u.u.u.u.u.u.i.u.i.i.i.i.u.a.a./ S ! CXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXZXAXAXBXm.{ ^ ^ [ R.~.~.~.~.T./.^.[.(.[.(.(.(.^.(.(.(.(.(.)./././.(.~.(.~.~.~.~.~.~.~.~.~.T.T.T.T.~.T.T.T.T.U.T.U.Y.I.I.T.P.P.P.P.P.P.P.S.L.H.H.H.H.H.H.S.S.S.S.S.G.H.S.S.S.S.S.S.G.Z.L.D.G.IXPXGXIXGXSXAXSXZXSXDXIXSXGXDXGXGXSXSXGXZXSXGXIXSXFXSXGXGXSXFXCXGXAXGXSXSXMXhXM.M.T.P.L.L.L.L.L.L.H.H.H.H.A.A.A.A.A.h.A.h.h.l.A.h.h.Z.A.A.A.A.A.A.A.A.A.A.A.F.Z.A.H.A.A.G.A.S.l.H.A.S.S.A.D.D.G.L.G.L.L.H.H.H.H.H.H.S.L.K.H.H.H.H.H.H.G.H.G.H.L.H.H.S.L.L.L.L.L.U.T.U.I.R.T.T.T.~./.~.~.!./.~./.(./.(.(.(.(.[.|.^.(.[.(.`.(.(.(.(./.(.(./.(./.!.(.(././.~./.!./.T.~.T.T.~.~.T.~.T.T.T.T.T.~.T.T.T.T.~.T.T.T.Y.T.T.I.T.",
+"~ P I P P P P P P Y P I I ` I ` ` v.v.v.c.n.N.n.V.V.OX6.7.7.6.6.6.3.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.$.8 6 1 1 X aXB.B.B.B.aXOX0.0.0.7.7.6.9.%.%.%.%.%.%.%.%.%.*.$.8 7 1 1 < B.B.B.B.OX7.0.7.7.7.6.3.%.%.%.%.%.%.%.%.&.#.$.7 3 1 X 4 B.B.V.V.N.N.N.c.c.c.c.` c.c.c.c.n.N.N.N.V.B.B.OXrXrX0.0.7.6.%.%.%.%.%.%.%.%.%.&.%.%.%.6.6.7.7.0.7.0.7.6.3.%.#.$.6 1 . . . v.$X$X$X$X$X$X$XbX$XbX$XB.rX0.0.0.7.6.3.3.%.%.*.#.$.6 3 1 X N.$XbXbX$X$XbXbXbX$XbX$XJXkXkXjXjX0.7.%.%.%.%.#.$.6 1 X . . +XbXbXbX$XjXjXjXrX0.0.6.%.%.%.%.%.%.%.%.%.%.%.%.%.3.6.6.6.6.7.7.7.6.6.3.&.%.#.8 6 9 . . . X B.NXVXNXNXVXNXNXjXjXrXrX0.7.3.3.%.%.&.#.8 6 < 1 . q.NXNXNXNXNXNXbXNXNXNXbX$XbXkXkXjXjX0.7.6.%.%.%.*.#.8 < 1 . . 9 @X@X$X$XlXjXjXjXOX0.7.3.%.%.%.%.%.%.%.&.$.8 < X . . v.+X+X+X&X&XE.E.E.E.E.&X&X&X&X+X&X$XlXlXlXjXjX0.6.3.%.%.%.%.%.%.%.%.&.#.$.6 1 X . . C.bX$XbX$X$XbXOX0.0.0.0.6.6.%.%.%.%.%.%.%.%.%.%.%.&.#.$.$.8 6 < < 1 1 1 X X . . . X &X&XJ.&Xx.W.s.s.s.s.x.j.s.s.i.s.u.s.E u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.i.i.i.a./ ! ! CXAXDXAXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXZXAXAXBXm.[ / Q ` T.~.~.~.~.[.~.{.(.(.(.(.{._.(.[.(.(.(.(.^./././.).~.~.~.~.~.~.~.~./.~.T.T.T.~.~.T.Y.T.T.T.U.T.T.T.Y.T.I.U.U.U.U.P.L.L.L.L.P.H.L.H.H.H.H.S.G.S.S.S.S.G.S.S.S.z.G.G.A.A.A.x.GXGXGXGXGXDXDXDXDXAXAXAXAXDXDXAXDXZXAXSXDXAXAXFXDXFXDXFXFXFXAXSXAXFXFXVXJXhXpXM.c U.U.U.L.L.L.L.H.H.S.H.H.A.A.h.A.h.A.A.l.l.h.h.h.A.A.h.A.A.h.A.A.A.A.A.A.A.A.G.G.S.Z.A.G.G.S.H.A.H.A.S.S.D.G.L.L.G.z.H.H.H.S.L.H.H.K.H.L.L.H.H.H.H.H.S.H.G.G.H.L.L.H.S.L.L.P.P.L.L.U.U.T.T.T./.T.~./.~.~./.(./.(.^.(.(./.].(.^.(.(.(.(.(.(.!.(./.!.(.(./.(./././.!./.~.~.~.~.T.T.T.~.T.~.T.~.~.T.T.T.T.~.Y.Y.T.T.T.T.~.Y.Y.Y.R.Y.R.T.",
+"P ) P I ) P ) P I I P I I Y I Y ` ` Y b.c.N.N.C.V.V.B.7.6.7.7.6.6.3.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.$.8 7 < 1 X V.B.B.B.lX&XOX0.0.0.0.7.6.%.%.%.%.%.%.%.%.%.%.*.#.8 3 < 1 1 V.B.B.B.V.7.7.0.7.7.6.3.%.%.%.%.%.%.%.%.3.*.$.8 6 < X 9 B.B.V.V.N.N.c.n.c.c.c.c.c.[ c.n.c.N.N.N.V.V.B.jXrX0.0.0.6.6.%.%.%.%.%.%.%.%.%.%.%.%.3.%.6.6.7.6.6.6.6.9.%.*.$.8 6 1 . O q.bX$X$X$XbX$XbX$X$X$XbXbXbXrX0.0.0.0.7.3.3.%.%.&.#.$.8 3 < X q.bX$X$XbX$XbX$X$XbX$XbXlXkXjXlX0.0.6.3.%.&.*.#.$.6 1 X . X bXbXbX$X$XlXjXrXrX0.7.6.3.%.%.%.%.%.%.%.%.%.%.%.%.3.3.6.4.6.6.6.3.6.3.%.*.#.$.8 1 X . . . 8.NXNXNXNXVXNXNXNXjXjXrXrX0.7.6.%.%.%.&.#.$.6 < X . { NXNXNXbXNXNXbXNXbXbXNXNXlXkXlXlXjX0.7.3.%.%.&.*.$.8 < 1 . . q.$X$X@X$XlXjXjXjX0.0.6.9.%.%.%.%.%.%.&.#.$.6 < . . . V.+X+X&X&X&XE.E.E.E.E.J.J.&X&X&X%X+XlXlXjXjX0.0.6.%.%.%.%.%.%.%.%.%.&.#.8 < 1 . . X bX$X$X$XbX$X$XOX0.0.7.7.7.6.3.%.%.%.%.%.%.%.%.%.&.#.#.$.6 < 1 X . X X X . . . . . i E.J.J.W.W.x.x.W.W.s.s.s.s.s.u.t.t.u.i.u.u.u.u.t.u.u.u.u.u.u.u.u.i.i.u.u.i.i.S / S CXFXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXBXm.} / ^ [ ~.T.~.T.(.^.^.(.!.(.(.(.(.[.{.].].~.(.(.(.(.].(.T.(.!.)./.~./.~.~./.~.^.~.[.~.T.T.^.T.U.T.Y.T.Y.T.U.I.T.T.T.U.P.P.L.P.P.L.S.H.H.H.H.H.G.H.S.S.S.S.S.S.S.A.G.H.G.S.G.A.J.G.IXGXGXGXGXZXGXSXDXDXDXZXDXDXDXZXAXAXDXDXDXSXFXFXDXDXDXFXAXAXAXZXAXVXVXVXHXhXpX{ c U.U.P.U.U.L.L.L.H.G.G.h.A.A.h.h.A.h.h.h.g.G.A.h.h.h.A.A.A.A.A.A.A.A.H.A.Z.H.Z.A.S.A.G.A.A.S.A.H.A.A.D.l.D.G.G.D.D.P.F.S.L.K.H.L.L.H.L.H.L.H.H.H.S.A.H.H.H.H.H.H.H.H.L.L.D.L.U.L.U.U.U.T.T.~.T.~.T.!.~.~./././././.(.^.{.{.[.(.(._._.(.(.(.(.!.(.(.)./.(./.(.(././././.~.~.T.~.(.[.T.~.T.~.T.T.T.T.~.T.T.Y.T.T.T.~.T.U.~.U.~.T.T.Y.T.",
+"I I J I P P P P J L I I K I I I ` Y Y ` v.n.C.n.V.V.OXC.7.6.6.7.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 < 1 X C.B.OXbXB.B.B.0.0.7.0.7.6.6.3.%.%.%.%.%.%.%.&.*.#.8 6 3 1 1 C.B.B.B.B.7.7.0.7.7.6.3.%.%.%.%.%.%.%.%.%.*.$.8 6 < 1 X V.V.B.V.V.N.n.n.c.c.c.c.c.c.c.n.v.N.N.V.V.V.V.jXjXrX0.0.7.6.3.3.&.&.%.%.%.%.%.%.%.%.%.6.3.6.6.3.6.3.3.3.%.#.$.8 3 1 1 v.$X$X$X$XbX$X$X$X$X#X$X$X$XbXOX0.0.0.7.7.4.3.%.%.%.*.$.8 6 < 1 7 @XbXbXbXbXbX$X$X$X$X$XkXkXlXjXrX0.7.9.%.%.&.#.8 < 1 . . 4 bXNX@X$XbXlXjXjXrX0.0.9.%.%.%.%.%.%.%.%.%.%.%.%.%.%.3.3.3.3.3.3.3.%.&.#.$.$.6 1 X X . . w NXNXNXNXNXUXUXNXNXjXjXOXrX0.7.6.9.%.%.%.#.$.6 < 1 . q.NXNXNXNXNXbXNXNXbXNXbXbXlXkXkXlXrX0.7.3.3.%.&.#.$.6 1 X . . N.$X$X$X$XjXjXjXrXOX7.9.3.%.%.%.%.%.&.*.#.8 6 1 . . 1 $X@X%X&X).E.&XJ.E.E.E.E.E.).&X&XOX$XkXkXkXjX0.0.6.%.%.%.%.%.%.%.%.&.*.$.8 < X . . 7 $X$XbX$X$X$X$X$X7.0.7.7.7.6.6.%.%.%.%.%.%.%.%.%.*.#.$.8 2 1 X . X 1 i q.7 1 . . 1 C.&XW.W.W.W.h.x.z.x.a.a.s.i.u.t.i.p.p.u.u.t.u.u.u.u.u.u.t.u.u.u.u.i.u.u.i.u.i.~ S / CXZXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXZXBXQ.} Q ~ [ T.~.~.T.!./././.^./.{.(.(.^.^.(.~.(.(.(.(.~./././.(.!./././././.~./.~.~.~.~.T.~.~.T.T.T.T.T.U.T.T.T.T.U.Y.U.U.U.U.U.L.L.L.L.S.P.U.S.S.S.S.S.S.S.H.S.S.H.G.H.S.S.Z.S.A.G.A.GXIXGXGXGXAXAXFXAXFXAXFXFXFXFXAXAXAXFXAXFXFXAXAXFXAXAXAXAXAXAXFXAXAXFXAXBXaXM.{ c K.Y.L.I.U.L.L.L.H.S.A.A.g.A.h.D.A.h.h.D.g.l.g.z.h.h.S.z.A.A.A.h.A.S.G.A.A.A.A.G.G.A.A.G.A.G.A.A.S.A.A.S.H.A.H.L.H.Z.H.H.L.H.G.L.L.G.L.L.H.G.H.L.G.L.H.A.L.A.D.L.S.L.H.L.L.L.L.L.L.L.Y.T.T.T.T.~.~.T.(.~.~./././.(.(.(./.(.(.(.(.(.[.(.(.^.(.(.(.(./.(.(./.^.^./././.~.~.~.~.~.T.T.~.~.T.T.~.T.T.T.T.T.~.T.T.T.T.T.T.T.T.P.T.P.T.T.T.",
+"P P I I P P J J I J U J Y I I ` ` ` v.v.v.v.b.n.N.V.V.B.7.7.7.7.6.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.6 3 1 1 c B.lXB.B.aXaXjX0.0.0.7.7.6.3.%.%.%.%.%.%.%.%.*.#.$.6 4 1 1 8.B.B.B.B.OX7.7.7.7.7.6.3.%.%.%.%.%.%.%.%.&.#.$.8 3 1 1 C.B.B.V.V.N.N.c.N.n.c.c.n.c.c.c.N.v.N.C.V.V.B.OX0.rX0.0.7.6.3.3.&.3.%.%.%.%.%.%.%.%.%.%.%.%.3.%.%.%.%.%.&.*.$.8 3 1 w @X$X$X$XbX$X$X#X#X$X$X#X$X$X$XjX0.0.0.7.7.6.3.%.%.%.&.$.$.8 < 1 X #X$X$XbX$X$XbXbX$X$XbXUXkXjXjX0.7.9.3.%.%.*.$.8 < X . . q.vXbXbX$XNXOXjXjXrX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.&.#.$.$.6 < X . . . X JXVXNXVXNXNXNXNXNXNXlXrXrXrX0.7.9.3.%.%.&.#.$.6 < 1 X ] NXJXNXNXlXNXNXNXNXlXNXNXUXkXlXjXrX7.6.3.3.%.*.#.8 < 1 X . . $X$X$X$X$XrXkXjXjX0.7.6.3.%.%.%.%.%.%.*.#.$.< 1 . . w +X+X+X&X&X&XE.&XJ.&XW.E.E.&X&X&X$X$XkXkXjXrX0.7.3.%.%.%.%.%.%.%.%.%.#.$.6 1 X . . C.bX$X$XbX$X$X$X$XOX7.7.7.7.6.3.%.3.%.%.%.%.%.%.&.*.$.8 6 1 X . X q.+X&X$X+X&Xi . 1 &XW.W.W.h.x.j.j.a.s.s.s.t.s.s.t.t.s.t.t.t.u.u.t.t.t.t.t.u.t.u.u.u.u.u.i.u.i.i.~ / S ZXZXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXSXGXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXMXm.[ Q ! ` T.T.~.~.~./././.(.(.(.(.{.^./.(.(.(._.(.(.{.(././././././.~.~././.~.~.~.~.~.~.T.T.T.~.T.T.~.~.K.T.T.T.T.U.T.U.T.U.P.L.L.L.L.S.L.L.H.L.S.S.L.S.S.S.S.D.A.G.G.G.S.G.S.G.G.S.IXIXGXGXFXFXFXFXFXAXAXFXAXAXAXDXDXAXZXAXAXZXFXFXAXAXFXFXFXAXAXFXFXFXFXGXBXaXM.' c Y.Y.L.I.L.U.L.G.A.G.A.A.h.h.g.g.h.g.A.g.j.A.D.A.S.A.z.H.A.A.A.A.A.A.h.A.Z.G.A.H.S.G.H.Z.H.Z.L.A.A.A.H.Z.A.H.H.A.G.H.L.L.G.H.U.U.K.G.L.U.L.U.G.S.G.G.A.H.D.U.H.S.G.G.H.L.H.L.L.L.K.R.I.I.T.T.T.~.T.~.T.~./././.(.(./.(././.(.(.(.(.(.(.(.(.(.(.(./.(./.(././././././.~.(.~.T.~.~.T.~.T.T.~.Y.T.~.T.T.Y.T.Y.T.T.T.T.T.T.T.P.P.T.T.T.T.",
+"I P P ~ J P P J J J K I I I I ) Y ` ` v.v.v.v.N.n.V.V.B.C.7.7.6.7.6.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.#.$.8 3 1 1 7 B.B.B.B.B.B.OX0.0.0.7.7.6.3.3.%.%.%.%.%.%.%.&.#.$.8 < 1 X q.].B.B.B.OX7.7.7.7.7.6.6.%.%.%.%.%.%.%.%.&.#.$.8 6 < 1 x B.V.V.V.N.N.n.v.v.c.c.c.c.N.c.N.N.N.N.V.B.B.B.jX0.rX0.7.7.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.8 6 1 1 C.$XbXbX$X$X$X$X$X#X#X$X$X$XbX+X0.0.0.7.7.6.6.%.%.%.&.#.$.8 < < 1 C.$X$X$X$XbX$XbX$X$XlXUXkXjXjX0.7.6.%.%.&.#.$.6 1 X . . V.bXbXbXbXbXjXjXjXrX0.7.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.%.&.*.*.#.#.$.8 3 1 X . . X X hXNXNXNXNXNXNXSXVXNXNXbXrXrXrX0.7.6.3.%.%.%.*.$.6 < < X 7 VXNXNXNXNXNXNXNXNXbXbXlXUXkXkXjX0.7.6.3.%.&.*.#.6 < X . . 7 $X$X$X$X+XjXjXkXrX0.7.3.3.%.%.%.%.%.%.*.#.6 < 1 . . i +X+X).).E.E.E.E.E.J.E.&XE.&X+X&X$X$XkXkXjXrX0.7.6.%.%.%.%.%.%.%.%.*.#.8 6 1 . . 1 bXbXbX$X$X$X$X$X$XOX6.7.7.6.6.6.%.3.%.%.%.%.%.%.&.#.$.8 1 X . . v.%X+X&X$X@X&X&Xj.q.x.&Xx.x.W.h.x.s.s.s.s.i.s.t.u.i.t.u.t.u.t.u.t.t.t.t.t.t.u.t.u.u.u.u.u.i.u.u.i./ S ! ZXZXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXAXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXHXQ.{ ! ~ [ /.T.T./.~.~./././.(.(.).(.(.(./._.(.(.(.(.(.^.^.!./././././.~.[.~./.~.~.~.~.~.T.T.~.T.T.T.~.T.T.Y.Y.L.R.T.U.U.U.L.P.L.L.L.L.U.L.S.L.H.H.S.D.H.S.A.H.H.D.H.A.G.S.H.A.G.A.G.GXGXGXGXGXFXDXAXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXCXhXM.n c I.I.L.I.U.I.L.H.S.z.S.z.h.h.h.f.z.A.h.g.A.h.h.S.S.A.h.A.A.A.G.g.h.H.g.G.G.A.A.G.A.S.G.l.G.g.H.S.A.H.A.G.H.G.D.U.H.H.H.H.L.U.L.L.H.H.L.G.H.H.L.S.D.P.H.H.L.Z.D.P.L.L.H.H.L.H.L.L.L.L.U.U.U.T.T.~.T.~.(.!././././.(././.(.^.(.(.{.^.^.(._.(./.(.[./.^./.(.^.^./././.~.~.~.~.~.T.~.~.T.~.T.T.~.T.~.T.T.~.Y.T.T.T.T.T.T.T.P.U.T.T.T.U.T.",
+"P P P J J ` I J P J I I K I P Y ) Y Y v.T v.v.N.n.N.V.V.B.7.7.7.7.7.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.=.< 1 1 1 aX+XB.B.B.lX+X0.0.0.0.7.7.3.3.%.%.%.%.%.%.%.&.#.$.8 3 < X 7 B.B.B.B.&X0.7.7.7.7.6.3.%.%.%.%.%.%.%.%.%.&.$.8 6 < 1 3 B.B.B.V.V.N.N.N.N.N.v.N.n.c.N.n.N.N.N.V.V.B.B.rXjXrX0.7.7.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.$.8 < 1 9 $X$XbX$X$X$X$X+X#X$X+X$X$X$XbX0.0.7.0.7.6.4.%.%.%.&.*.$.$.6 < 1 i $XbX$XbX$XbX$X$X@XUXkXkXkXrX0.6.3.%.%.*.#.$.6 1 . . . bXbXbXbXbX$XjXjXrXrXrX0.6.6.%.%.%.%.%.%.%.%.%.%.%.&.%.&.&.*.#.#.$.$.8 6 < 1 X . . . X B.NXNXNXNXNXNXNXNXNXNXNXlXrXrXrX0.7.6.6.%.%.&.*.$.8 6 1 X 4 NXNXNXNXNXNXNXNXbXNXNXUXkXkXlXjX0.7.3.%.%.&.#.$.6 1 X . . N.$X$X$X$X$XkXkXjXrX0.7.6.%.%.%.%.%.%.%.*.$.6 < X . . V.+X+X+XE.&X&XE.E.E.E.E.E.).&X&X@X$XkXkXjXkXrX0.6.%.%.%.%.%.%.%.%.%.*.$.8 < X . . i $X$XbXbX$X$X$X$X$X@X7.6.6.6.6.6.6.3.%.%.%.%.%.%.&.#.8 6 1 . . i $X+X+X@X+X+X&X&X&XJ.J.W.W.W.s.h.z.s.f.s.s.s.t.s.t.u.t.t.u.t.u.t.t.t.u.t.t.t.t.u.t.u.u.u.u.u.u.i.u./ / S BXZXAXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXZXDXDXBXpX} S ~ [ T.T.~.T.~.~././././.(./.(.(.(.).[.(.(.^.(.(.^./././.(./.~.~.~.~.~.~.!.T.T.T.~.T.T.~.T.~.~.T.T.T.~.~.R.T.L.U.U.I.P.L.L.L.L.L.L.S.L.L.H.H.L.A.D.D.S.H.H.H.A.K.S.A.S.A.G.H.G.GXGXPXIXFXDXFXFXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXaXM.{ c I.H.I.L.L.G.H.G.A.S.h.h.h.z.g.D.h.h.h.A.A.h.z.g.Z.A.H.A.A.A.A.A.G.A.A.S.H.z.H.Z.H.A.D.F.H.G.A.z.H.G.H.G.G.Z.e.b.e.Z.S.G.H.S.H.H.K.K.S.L.U.G.L.S.L.P.S.L.L.S.D.A.L.S.H.S.H.L.L.L.U.U.U.T.U.T.T.T.T.~.T.!./././././.(.(.(./.(.(.(.(.{.(.(.(.(.(.(.(.(./.!.^.!.E.[././.~.~.~.~.~.T.T.~.T.T.T.T.T.T.T.T.T.Y.Y.T.T.T.T.U.Y.T.T.U.T.U.T.T.",
+"P P ) P P P I P K J I I J U K ` ) Y ` ` v.` b.v.N.C.V.V.B.0.7.6.6.6.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.$.8 6 < 1 X C.B.B.B.B.B.B.OX0.0.0.7.7.6.3.%.%.%.%.%.%.%.%.*.$.8 3 1 1 1 B.B.aXB.B.OX6.7.7.6.6.6.3.%.%.%.%.%.%.%.&.&.#.$.8 3 < < C.B.B.V.V.V.N.N.N.v.n.c.c.n.N.n.N.N.V.V.V.B.B.rXrXrX0.7.7.3.3.%.%.%.%.%.%.%.%.%.%.&.%.&.%.%.%.%.%.%.%.&.*.#.$.8 6 < 1 8.@X$X$X$X$X@X$X#X$X+X$X$X$XbXOX7.0.0.7.6.6.3.%.%.&.*.#.$.6 6 < < +X$X$X$XbX$X$XbXbXUXkXkXjXOX7.6.%.%.%.*.$.8 < 1 . . 4 bXbX$XNX$XbXOXjXrXrX0.7.6.%.%.%.%.%.%.%.%.%.&.&.&.&.#.#.#.$.$.8 8 6 3 < 1 . . . . O ].NXNXbXJXNXNXNXNXNXJXNXVXlXrXrX0.0.0.6.6.%.%.%.*.$.8 7 < X X NXNXNXNXNXNXbXNXNXbXbXUXlXkXlXOX7.6.6.%.&.&.$.8 < 1 . . X bX$X$X$X$XOXjXkXrXrX0.7.3.%.%.%.%.%.%.&.#.$.6 1 X . . $X+X&X&X&X&X&XE.E.E.J.&X&X&X&X+X$X$XlXkXjXjXrX0.6.%.%.%.%.%.%.%.%.*.#.$.6 < . . . N.$X$X$X$X$X$X$X$X$X$XOX6.6.6.6.6.6.%.%.%.%.%.%.%.*.$.8 < 1 . . ).$X$X&X$X$X&X&XE.J.&Xx.W.x.x.W.s.s.s.u.s.u.s.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.u.u.u.t.u.u.i.u.i./ / S CXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXAXGXSXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXZXBXm.{ ~ ^ ` T.T.~.~.~.~./././.(./.(.^.(./.(.(.|.(.{.(.[.[.(.(././.[.!.~.~.~.~.T.T.~.~.~.T.T.~.I.~.T.T.~.~.T.T.T.T.U.U.U.L.I.L.L.L.L.A.L.D.L.S.L.S.S.H.U.H.S.H.G.G.G.G.G.H.H.A.A.l.S.D.PXAXGXGXGXVXVXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXCXaXM.c.x I.T.L.L.L.H.H.H.h.h.l.z.k.h.l.l.h.h.h.h.h.A.Z.Z 0 ; 0 0 y r r ; r r A.A.S.l.A.u q > 0 y G S.A.H.H.A.Z.e.A r y > ; y D b.L.L.U = : : F I.S.U.L.Z ; * q G G.D.G.U.S.G.H.H.H.L.D.L.L.Y.U.U.U.Y.T.Y.~.T.Y.~.~.~./././././.(.(.(.[.(.(.^.(.(.(.(.(./.(././.!./././.~.~.~.~.~.~.~.~.~.~.T.~.~.T.T.T.T.~.T.T.Y.T.~.T.T.U.T.P.P.T.Y.T.T.P.U.",
+"P P P J I J P P I L J L J J Y I U ` ` Y Y v.v.b.v.n.V.V.V.B.7.7.7.7.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.8 8 < 1 X v.B.aXB.lX].lXOX0.0.7.7.7.6.3.3.%.%.%.%.%.%.%.*.$.8 3 1 1 X B.B.B.B.B.OX7.7.7.7.6.6.3.3.3.%.%.%.%.%.%.&.#.$.$.6 < < i B.B.B.V.V.N.N.N.N.N.N.N.N.c.n.N.N.V.V.B.B.B.jXjXrX0.7.7.3.3.%.%.%.%.%.%.%.%.&.&.&.&.&.*.&.&.%.%.%.%.%.&.#.#.$.8 6 < 3 +X$X$X$X$X$X#X#X+X$X#X$X$XbXOX0.7.0.7.7.6.3.%.%.%.*.#.$.$.8 6 < C.$X$X$XbXbX$XbXkXUXkXjXjX0.7.6.%.%.%.#.$.8 1 X . . v.bXbXbX$XbXbXlXjXrXOX0.0.6.%.%.%.%.%.%.%.%.%.&.*.#.#.$.$.$.8 8 6 < 1 1 X . . . . 9 B.NXNXNXNXvXNXNXJXNXbXNXNXNXJXrXrXOX0.7.6.6.%.%.%.&.#.$.6 3 1 1 hXNXNXNXCXJXNXNXNXbXUXUXlXlXjX0.7.9.3.%.&.#.$.6 1 . . . i $X$X$X$X$XlXkXjXjXrX0.6.3.%.%.%.%.%.%.&.#.8 < 1 . . 9 $X@X+X+X+X&X&X&XE.&X&X&X&X&X&X+X&X$XlXkXjXjXrX0.3.3.%.%.%.%.%.%.%.&.#.8 3 1 . . X $X$X$X+X$X+X$X$X$X$X$X$X7.6.6.6.6.6.6.%.%.%.%.%.%.#.$.8 < 1 . 9 $X+X$X+X&X&X&X&X&XJ.W.W.W.s.s.s.s.x.s.s.u.u.r.t.u.t.p.t.t.u.t.u.u.t.t.t.t.E t.t.t.u.u.t.u.u.u.u.u.u.P ! / ZXVXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXSXGXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXMXm.[ ~ Q [ T.~.T.~.~.~.~./.!././.(.(.!.].(.(.[.(.(.(.(.(.(./.^./.!.~.~.~.~.T.~.~.T.T.T.~.T.T.~.U.~.~.~.T.I.T.T.T.T.T.U.I.L.L.L.L.S.L.L.L.H.L.S.S.L.H.S.S.A.H.H.G.H.A.L.G.S.H.A.H.D.D.DXIXGXGXGXHXFXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBXhXM.{ c U.U.L.L.L.L.H.H.A.A.h.h.h.h.l.l.h.l.h.A.A.h.Z.Z 0 e e 0 * r r r e r A.D.D.D.e.0 * e e : y Z.G.S.G.H.b.q * r r q r ; = q A.U.F.y > > 0 b.U.I.[ y ; t y n.G.G.S.S.L.G.H.H.H.H.U.L.L.L.U.I.U.T.U.T.T.T./.~.~./././.(.(.(.[./.^._.(.(.{.(.(.(.(.(.(.(.(./././.!.~././.~.~.~.~.~.~.~.T.~.T.T.~.~.T.T.T.T.T.T.Y.P.U.T.T.L.P.P.T.U.T.Y.P.T.",
+"J P P ) I P P J I K J J P I I I I I U Y ` v.v.v.C.n.N.V.V.B.0.7.7.7.7.6.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.8 < < 1 c B.lXB.B.B.B.B.0.0.0.0.7.6.3.%.%.%.%.%.%.%.%.*.$.$.6 < 1 X C.B.B.B.B.B.0.7.6.7.6.6.6.3.%.%.%.%.%.%.%.&.#.#.$.8 6 < 3 B.B.B.B.V.V.N.N.N.c.N.n.N.N.N.V.V.V.V.B.B.B.OXrXrX0.0.7.4.3.%.%.%.%.%.%.%.&.*.*.*.*.*.*.*.&.%.%.%.%.%.%.*.#.$.$.8 3 < q.bX$X$X$X#X$X+X$X$X#X#X$X$XbX7.7.0.7.7.6.3.%.%.%.&.*.#.$.$.6 6 8 $X$X$X$XbXbXbXUXkXkXkXrX0.6.3.%.%.%.#.$.6 1 . . X B.bX$XbXNXbXbXlXjXjXrX0.0.6.%.%.%.%.%.%.%.%.&.&.#.#.$.8 6 6 < < 1 1 X . . . . . w JXbXvXNXvXJXbXmXNXNXbXNXNXNXNXNXrXrX0.0.0.7.%.%.%.%.*.#.$.8 6 < 1 8.NXNXNXNXNXNXNXNXbXUXUXUXjXrX0.6.%.%.%.&.#.$.6 1 . . . V.bXbX$X$X$XlXkXjXjXrX0.6.3.%.%.%.%.%.%.&.$.8 < 1 . . q.$X$X&X&X&X&X&XE.E.E.&X&X&X&X+X&X$X$XlXjXkXjXrX7.6.%.%.%.%.%.%.%.&.*.$.8 < X . . i $X$X$X$X+X+X$X+X+X+X$X$X&X3.6.6.6.6.6.%.3.%.%.%.%.*.$.8 < 1 . 4 +X$X$X+X&X&X&X&XJ.J.W.s.W.s.h.s.s.s.s.t.s.t.t.t.u.t.t.t.t.t.u.t.t.t.t.t.t.r.t.t.t.t.t.u.u.u.u.u.a.i./ ! / BXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXAXDXDXFXFXFXFXFXFXAXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXDXAXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXBXpX} S Q [ ~.T.~.~.~.~.~.(././.(./.(._.(.(.(.(.^.(.(.(.(././.~./.~.~.R.T.~.~.~.~.T.~.T.T.T.~.I.T.T.T.~.I.~.T.T.T.I.U.T.L.I.S.L.L.L.L.L.H.L.S.U.H.H.H.H.G.H.H.H.H.H.H.Y.h.G.S.A.D.G.D.GXGXGXGXFXFXAXAXAXFXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBXaXM.b c Y.U.L.L.A.U.H.A.A.g.h.h.z.z.k.h.h.h.g.A.h.f.Z.C ; = > e r r y r ; r A.S.A.S.G e r r 0 : 0 e.A.G.H.G.B * > 0 [ e.A * > q L L.G.e.q ; 0 V F.S.N * * y e.T.T.D.H.H.D.H.H.H.H.L.S.U.P.L.L.U.U.Y.U.T.T.T.T./.~.~.~.~./././.(.^.^.(.(.).{.(.(.(.(.(./.(.(.(././././.~.~./.~.~.~.~.T.~.T.~.~.T.Y.T.T.~.~.T.T.T.T.Y.Y.U.T.L.L.I.L.T.Y.P.T.P.",
+"P P P P I P P I J J J L J J K I I Y ) ` Y Y v.v.e.v.n.V.V.B.C.7.7.7.7.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.%.%.%.&.%.&.%.&.%.%.%.&.#.$.8 < 1 1 4 B.+XB.B.B.B.B.0.0.0.0.7.6.3.4.%.%.%.%.%.%.%.&.#.8 6 1 1 X C.B.B.B.B.B.B.6.7.6.6.6.6.6.3.3.%.%.%.%.%.%.*.#.$.$.6 6 < q.aXB.B.V.V.V.N.N.N.C.n.N.N.N.N.V.V.V.V.B.B.OXrXrXrX0.7.6.3.%.%.%.%.%.%.%.&.*.*.*.*.#.*.*.*.%.%.%.%.%.%.&.*.#.$.8 8 3 6 V.bX$X$X$X$X#X+X+X$X$X$X$X$XOX7.7.7.7.6.6.3.%.%.%.*.#.$.$.$.8 $.8.$X$XbX$XbXUXUXkXlXjX0.7.6.3.%.%.%.#.8 < 1 . . 9 bXbXNXbXbXbXbXbXjXjXrX0.0.6.%.%.%.%.%.%.%.&.&.*.$.$.8 6 < 1 1 X X . . . . . 9 V.NXNXvXbXvXbXvXxXbXbXJXNXJXNXJXNXVXjX0.0.0.7.7.6.%.%.%.&.*.$.8 8 < < q.NXNXJXNXNXNXNXbXUXUXkXkXjX0.7.6.6.&.&.*.$.6 < X . . 4 $X$X$X$X$XbXkXjXkXjXrX7.6.%.%.%.%.%.%.%.&.$.6 < 1 . . v.$X$X$X+X&X&X&X&XE.&XE.&X&X&X&X+X$X$XlXkXkXrX0.6.6.%.%.%.%.%.%.%.%.*.$.8 1 X . . C.@X$X$X$X+X+X+X+X+X$X$X$X$X0.3.6.3.6.6.3.6.%.%.%.%.*.$.6 < 1 . 4 $X$X$X&X&X&XJ.&XJ.J.W.W.x.x.s.j.s.s.s.t.t.s.t.t.u.r.t.t.u.t.t.u.t.t.t.t.r.t.t.t.t.t.t.u.u.i.u.u.u.u.S / ! ZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXAXDXFXFXFXFXFXFXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXAXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXBXm.[ ~ ! [ T.~.~.T.~.~.(.~.!././.(./.!.(.(./.|.(.(.(././.(./.[.~.~.~.!.~.T.T.T.T.~.T.T.~.T.I.~.T.~.T.T.~.I.T.T.T.T.U.U.L.L.H.L.L.L.G.L.L.G.U.H.S.H.L.H.H.S.A.G.H.H.G.G.H.H.H.A.G.D.z.FXPXGXGXGXFXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBXaXm.{ c H.H.L.H.H.H.A.A.A.h.z.h.h.h.h.l.h.h.h.A.D.z.Z.A > : q T A.A.z.A.A.A.A.D.S.Z.A * > u 0 e > U H.L.F.G.; > ; q Z.G.b.Z S ` T L.L.U.U ; ; r [ Y * e y Z L.J.L.D.L.D.G.G.H.H.H.S.L.S.S.L.L.U.U.L.Y.T.Y.T.T.~.~.~.~.!.(./.(.^./.(.(.(.(.(.(.(.(.(.(.(./.(././././.~././.~./.~.~.~.~.~.~.~.T.~.~.~.T.T.T.T.~.T.T.T.T.U.U.L.Y.L.Y.U.P.P.P.T.",
+"P P P P P P P P J J L J H L Y H H I I Y Y ` v.v.b.v.N.C.V.V.B.7.7.7.7.7.6.3.%.%.%.%.%.%.%.%.%.%.<.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.&.&.&.&.&.&.&.%.3.#.$.8 6 1 1 1 aXB.B.JXB.B.lXOX0.0.0.7.6.6.%.%.%.%.%.%.%.%.&.#.$.6 < 1 X c B.B.B.$XOXB.0.6.6.6.6.6.%.9.%.%.%.%.%.%.%.%.*.#.$.8 6 6 4 C.B.B.B.V.V.V.V.N.V.n.V.N.N.V.V.V.V.B.B.B.OXjXjXrX0.7.6.%.%.%.%.%.%.%.&.*.*.*.#.#.#.$.*.*.&.%.%.%.%.%.%.&.#.#.$.8 6 6 7 bXbX$X$X$X@X#X#X+X$X$X$X$XB.7.7.7.7.6.6.3.%.%.%.&.&.#.#.$.$.#.#.OX$X$XNXlXUXkXkXjXrX0.6.6.%.%.%.*.$.8 1 X . . i bXbXbXNXbX$X$XbXjXjXrXrX0.6.3.3.%.%.%.%.%.&.*.#.$.8 6 1 1 X . . X . . . 4 C.bXbXvXvXbXnXbXxXvXbXxXvXxXbXmXNXNXNXNXlX0.0.0.0.7.6.%.%.%.%.&.#.$.8 6 6 < bXNXNXNXNXNXNXUXUXkXkXjXrX0.7.6.%.&.*.#.8 6 1 . . . C.bXbX$X$XbX$XkXjXjXrXrX7.7.9.%.%.%.%.%.%.#.$.6 < X . . &X$X&X&X&X+X+X&XE.&X).).&X&X&X%X+X$XOXkXlXjXrX0.7.3.%.%.%.%.%.%.%.&.#.$.3 1 . . . +X$X+X+X+X+X+X+X+X+X+X+X@X$X$X6.6.6.6.6.3.3.3.%.%.%.*.$.8 < 1 X w +X@X+X+X&X&X&XW.x.W.s.W.W.s.x.s.s.t.u.s.t.t.t.w.u.t.t.t.t.u.u.t.t.u.r.t.r.r.t.t.u.t.t.u.u.t.u.u.u.i.! ! / CXVXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXZXVXBXm.} ^ ~ ` T.~.~.~./.^.(.~././././.(.(.(.(.!.(.(.`.^./.^.!.^.~.(.~.~.~.T.~.~.T.T.~.~.T.T.T.T.T.T.T.Y.I.T.~.U.T.T.T.T.L.L.L.L.L.L.L.L.G.G.L.H.Z.H.H.U.D.H.H.Z.H.S.H.H.H.H.H.H.G.S.A.z.IXPXGXGXDXDXDXAXAXDXDXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXBXhXM.n c I.H.H.H.H.H.A.A.h.h.h.h.h.h.h.h.l.h.h.h.k.h.g.Z ; r y J U T Y T T [ G.A.G.b.q 0 = T H ; e : Z.U.U.S.u : * > A U T F.H.G.H.H.U.K.F.y e * y > 0 : q L.L.L.H.L.H.S.S.S.S.S.L.S.L.L.P.P.Y.P.Y.L.L.T.T.Y.T.T.~.~././././././.(.).(.[.|.(.(._._.(.(.[.(.(.(./././././.~./.~./.~./.~.~.~.~.~.~.~.~.T.T.~.T.T.T.P.T.P.U.U.U.P.Y.P.P.P.T.T.P.",
+"P P J P P U J P P P J J I L H I K Y ` K ` Y ` ` v.v.N.N.V.V.V.OX6.7.7.6.6.6.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.*.*.*.#.&.&.&.%.&.%.*.#.8 6 < 1 X C.B.B.B.B.B.B.OX7.0.0.0.7.6.3.%.%.%.%.%.%.%.&.#.$.6 < 1 X 7 B.B.B.B.B.B.OX6.6.6.6.6.6.3.3.%.%.%.%.%.%.%.&.#.#.$.$.8 6 q.B.B.B.B.V.V.V.V.V.N.V.V.V.V.V.V.V.B.aXB.OXjX0.0.0.0.6.%.%.%.%.%.%.%.%.*.#.#.#.$.$.q.#.#.&.%.%.%.%.%.%.&.*.#.$.$.8 6 3 8.$X$X$X$X$X+X#X#X@X$X@X$X$X0.7.7.7.7.6.6.3.%.%.&.&.#.#.#.#.#.%.6.OXOXlXkXkXkXjXjX0.7.6.3.%.%.&.#.8 < 1 . . . B.bXbXbX$XbXNX$XlXjXjXrX0.0.6.3.%.%.%.%.%.%.&.#.$.8 6 1 X . . . . X w 8.hXNX$XvXbXvXvX$XvX#X#XzXvX$XvXbXxXbXMXJXNXNXlX0.0.0.0.7.6.%.%.%.%.&.#.$.$.8 6 8 0.NXNXNXNXNX$XUXUXUXkXjX0.0.6.3.%.&.*.$.8 1 . . . o $XbX$X$X$X$X$XlXkXkXjXrX7.9.%.%.%.%.%.%.&.#.8 6 1 . . 9 $X$X$X$X&X+X&X&X&X&X+X&X).&X+X+X+X$XlXkXlXjXrX0.6.3.%.%.%.%.%.%.%.&.$.8 < X . . 4 $X$X$X+X+X+X+X@X{.+X+X+X+X$X$XC.3.6.6.6.6.6.6.3.%.%.&.$.7 < 1 1 . $X$X+X&X&X&X&XW.&Xx.W.s.s.s.s.s.s.s.t.t.t.t.t.t.t.t.t.t.t.p.t.u.t.u.r.t.r.t.E t.t.t.t.t.t.u.u.i.u.u.S ! ! ZXVXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXAXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXFXHXQ.[ S ^ ` ~.~.T.~./.~.~././.!./.^.(.(.(.(.(.(.[.(.(./.[././.~.~.~.~.~.~.~.~.~.~.T.T.T.~.T.T.~.T.T.~./.T.~.P.T.T.T.U.Y.U.L.L.H.D.L.L.L.L.G.H.H.H.H.U.H.H.H.H.H.H.h.S.G.A.H.l.A.S.A.D.GXSXGXGXDXAXDXAXAXDXAXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXHXhXm.{ c H.G.H.S.A.A.A.A.A.h.h.h.h.h.A.l.l.l.h.A.h.A.h.Z r 0 0 q ; e e 0 y Y l.D.G.G r y q b.T * r : T S.S.S.T 0 : e ; r = y C [ L.H.A.H.L.e.; e = e : = b.L.G.L.H.L.D.U.S.L.S.S.S.P.S.L.S.L.U.P.P.U.T.T.T.Y.T.~.T.~.R././.(././.^.^.(.(.^.(.(.(.[.(.(.(.(.(.(./.(././.!./.~.~./././.~.~.~.~.~.~.~.T.T.~.T.T.T.T.T.T.T.L.U.L.P.P.P.T.P.P.P.T.",
+"P P P P P P ) P P L P L J L U U U U L Y Y ` ` v.v.v.n.C.V.V.B.B.7.7.7.7.6.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.*.#.#.#.#.#.&.&.&.%.3.&.#.$.8 3 1 X 8.].B.B.B.B.B.OX0.0.0.7.7.6.6.%.%.%.%.%.%.%.%.*.$.8 6 1 1 4 B.B.B.B.B.B.B.0.6.6.6.6.6.3.%.%.%.%.%.%.%.%.&.*.#.#.$.8 8 6 8.&XB.B.B.B.V.V.V.V.V.V.V.V.B.V.B.B.B.B.lXOXjX0.0.0.6.6.%.%.%.%.%.%.&.*.#.#.$.$.$.C.#.#.*.&.%.%.6.%.%.%.&.*.#.$.8 7 6 3 +XbX$X$X#X$X#X+X+X$X$X$X$XOX7.7.7.7.6.6.3.3.%.%.&.&.&.&.#.%.3.6.7.0.jXjXjXjXjX0.7.7.6.3.%.%.#.$.8 < X . . 4 $XbXbXbXbXbX$XbXlXjXjXrXrX7.6.3.%.%.%.%.%.%.&.#.$.8 < 1 . v.V.V.NXbXbXbXbXbXbXzXvXbX#XzX.X#X#X+XzXzXvXbXbXvXbXNXMXNXNX0.0.0.7.7.6.3.3.%.%.&.#.#.$.$.$.$.*.bXNXJXbXNXUXUXUXkXjXOX0.6.6.%.&.*.#.$.6 1 . . . 8.$X$X$XbX$X$XbXjXjXjXrX0.7.6.%.%.%.%.%.%.&.#.8 < 9 . . i $X$X$X&X$X$X&X&X&X&X+X&X&X+X+X+X$X$XkXkXjXjXrX7.6.%.%.%.%.%.%.%.&.#.$.6 < X . . v.$X$X+X+X+X&X+X+X&X+X+X+X+X$X$X$X7.6.6.6.6.6.3.%.%.%.*.$.8 3 1 X . &X+X&X&X&X&Xx.W.W.W.x.s.s.W.j.s.w.s.u.t.s.r.t.t.t.t.t.t.t.t.t.t.u.t.t.t.r.t.t.t.t.t.u.t.u.u.u.u.u.u./ / / BXVXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXAXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXHXBXm.} S S [ ~.~././.~././.~.(./.(.~.(././.{.(./.(././.(././.~./.~.~.~.~.~.T.~.T.~.T.~.T.T.T.T.T.~.T.Y.Y.~.T.T.T.U.T.P.Y.U.L.L.L.L.L.P.P.A.P.H.K.L.H.H.H.H.H.H.H.H.H.S.S.A.H.A.G.A.A.G.IXGXGXGXGXDXDXAXAXDXZXFXFXFXFXAXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXHXaXM.{ c H.Z.H.h.A.A.A.h.h.h.h.h.A.h.l.l.h.h.h.A.h.G.G.A > r e : e : t > = T D.D.Z.V r > q J.Z.q q 0 K H.U.S.Y.T q y 0 * e * * y [ U.A.T.H.L.L 0 y : 0 Z U.L.L.L.L.H.L.H.L.L.L.L.S.L.L.L.P.L.P.P.U.U.T.U.T.L.T.T.~.~.~.~.~.(.^././.(.(.(.(.(.(.|.(.(.(.{.!.{.(.(.^./.(.~.^././././.~.~.~.~.~.~.~.[.~.~.~.T.T.Y.T.P.P.P.U.U.L.P.Y.P.P.T.T.P.P.",
+"J P P P P P J P J P L H J D J L J I I U ` Y Y Y v.b.v.N.n.V.V.B.0.7.7.7.6.6.6.6.%.3.%.%.%.%.&.&.%.%.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.#.#.$.$.#.#.*.*.&.%.%.&.#.$.6 3 1 X q.aXB.+XlXB.+XaX0.0.0.0.0.6.6.%.%.%.%.%.%.%.%.*.$.8 < < X 1 B.B.B.B.B.B.B.B.6.3.3.6.3.6.6.3.%.%.%.%.%.%.&.&.*.#.#.$.$.8 $.8.B.B.B.B.B.V.V.V.V.V.V.B.V.V.B.B.B.B.OXrX0.0.0.0.6.6.3.%.%.%.%.%.%.#.#.$.$.$.8 8.8.#.*.&.%.%.6.3.%.%.&.&.#.#.$.8 6 6 7 $X$X$X#X+X+X#X$X+X$X$X$XOX7.7.6.7.6.3.3.3.%.%.%.%.&.&.&.3.6.6.0.0.rXrXrXrX0.7.6.9.%.%.%.%.#.$.6 1 X . . v.bXbXNXbX$XNXbXbXlXjXjXrX0.0.6.3.%.%.%.%.%.%.*.$.8 6 1 . . NXbXbXbXJXbXNXvXbXzXbXdX#XvX.X#X#X#XdXdXzX'.dXxXnXbXmXNXNXNXOX0.0.0.7.7.6.3.%.%.&.*.#.#.#.$.$.%.6.lXNXJXlXlXlXlXjXrX0.0.9.%.%.&.*.$.6 < X . . X +X$X$XbXbX$X$XlXkXkXjXjX0.7.3.%.%.%.%.%.%.*.#.8 < 1 . . q.$X$X$X$X$X&X&X$X+X&X+X&X+X&X+X+X$X$XkXjXkXrX0.0.6.%.%.%.%.%.%.%.&.#.$.3 1 . . . $X$X+X+X+X+X+X&X+X&X&X&X+X+X+X$X$XOX6.6.7.6.6.6.6.3.%.&.#.8 6 1 1 . V.+X&X&X&XJ.&XW.W.s.s.W.s.s.s.s.s.s.u.t.s.t.t.t.t.t.t.t.t.s.u.t.t.t.t.t.t.r.t.t.t.t.E i.u.t.u.u.u.i.S ! ! ZXVXFXZXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXSXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXDXBXHXQ.[ ! ! _ [.T.T.~.~.~.~./.T././.(./.(./.(.(.(./.(././././.~.~.~.~.~.T.T.~.~.~.T.~.T.T.[.T.T.T.~.T.Y.~.Y.U.T.T.T.U.T.T.P.P.U.L.L.L.L.P.P.l.L.H.S.H.S.H.H.H.G.G.A.H.H.S.H.H.A.S.A.A.z.SXPXGXGXAXDXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXJXaXM.' x G.H.H.H.A.A.j.A.A.h.G.h.h.A.A.l.h.h.k.Z.g.A.j.A e r = H T T T U T e.A.H.b.y = t t T Y B r y : F.U.S.H.H.Y.T U y y > r : q H.L.U.U.L.F.r r r e F.L.L.L.L.H.L.H.L.G.L.S.U.L.L.L.L.L.P.K.P.L.U.I.T.T.T.T.T.~.T.~.~.~./.[./.(././.(.^.(._.^.^.!.(.(.(.(./.(./.(.E.^.^./././././.~.(.~.~.~.~.T.T.T.T.T.T.T.T.T.P.L.L.U.U.P.P.T.T.P.P.P.T.",
+"J J J P L P H P H P P P H L H I H Y J U Y Y ` ` Y b.v.n.n.V.V.V.B.7.7.7.7.6.6.3.3.%.%.%.%.%.%.&.&.%.&.%.&.&.&.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.$.$.$.8 $.$.#.&.&.%.3.%.*.$.8 6 1 1 4 B.B.lXB.B.aXOXOX0.0.7.7.6.6.3.%.%.%.%.%.%.%.*.$.8 < < 1 . V.B.B.B.B.B.B.B.C.3.6.3.6.3.6.%.%.3.%.%.%.%.%.%.%.&.#.#.$.$.$.$.C.B.B.B.B.B.B.B.V.B.V.B.V.B.OXB.aXB.B.OXrXrX0.0.7.6.%.%.%.%.%.%.%.*.$.$.$.8 8 8.+X#.#.&.%.6.%.3.%.%.%.&.*.#.$.8 6 6 3 V.$X$X#X+X+X+X+X+X$X$X$X$X7.7.7.6.7.6.3.3.3.%.%.%.%.%.3.3.6.6.7.0.0.0.0.0.7.6.6.3.%.%.&.*.$.8 < 1 . . 1 $XbXbXbXbXbXbXNX$XlXjXjXrXrX7.6.9.%.%.%.%.%.%.*.$.8 3 1 . . bXNXbXbXbXbX#XvX#X#X#X#X+X#X`.|..X#X.X#X`.#XdX#XxXvXJXNXNXNXjX0.0.7.7.7.9.3.%.%.%.&.&.#.*.*.#.%.3.7.0.jXkXlXlXjXjX0.7.6.9.%.%.*.$.8 3 1 . . . q.nX$XbX$XbX$X$XlXlXlXjXrX0.6.%.%.%.%.%.%.%.*.#.8 < 1 X . V.$X$X$X$X$X&X@X+X+X&X+X&X+X+X@X+X$X$XkXkXjXOX0.7.3.%.%.%.%.%.%.%.*.$.8 < X . . w $X@X+X+X).).+X&X&X&X+X+X&X$X&X$X$X$X0.7.7.7.7.6.6.3.%.%.#.8 6 1 1 X C.+X+X&X&X&XJ.W.x.W.z.h.s.f.s.u.u.u.t.s.t.t.t.w.i.t.t.r.t.t.u.t.t.t.t.t.t.t.t.t.t.u.t.t.t.u.u.u.u.u./ ~ ~ ZXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXDXFXFXFXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXGXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXGXSXDXAXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXAXDXAXFXFXFXFXFXFXFXFXFXFXAXFXZXZXDXBXQ.} ( ! [ ~.~.~.~.~.~./.~././.(./.(.^./.(.(././././././././.~.~./.~.~.T.~.~.~.~.Y.~.T.T.~.T.T.~.T.T.T.Y.Y.T.T.T.T.T.T.P.P.L.L.L.L.L.L.D.H.L.H.H.H.H.H.H.H.H.H.G.S.H.A.S.A.A.A.A.A.A.IXGXGXGXGXVXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBXaXM.{ n D.G.A.A.A.A.A.A.h.A.g.A.g.A.A.h.h.A.h.D.l.A.g.D ; r = b.D.D.H.A.S.A.G.G.G = 0 e > ; y : : e ; T U.Z.b.T T b.L.P.b.u 0 > y f.A.Y.U.U.U.r = e : U.D.G.L.L.L.L.L.L.L.G.S.L.L.S.L.L.U.L.P.P.P.Y.T.U.T.T.T.T.T.[.T.~.~././././.(.(./.{.^.^.`.(.(.(.(._.[.(.(.^./.(./.(././.!.(./.(.(.~.~./.~.~.~.R.~.L.T.U.Y.U.Y.P.U.U.U.P.P.P.P.P.U.U.T.",
+"P P P J P P P P J J J H J U L H H L U L K U ` Y v.v.c.N.N.V.V.B.B.7.7.7.7.7.6.6.3.3.%.&.&.%.#.&.#.#.#.#.&.&.&.%.%.%.%.%.%.%.%.%.%.%.&.&.#.$.$.$.8 7 q.#.#.#.&.3.3.4.*.$.8 6 < 1 1 aXB.B.B.B.B.B.OX0.0.0.0.7.6.3.3.%.%.%.%.%.%.&.#.$.6 < 1 X C.B.B.B.B.B.B.B.B.3.3.3.3.q.6.%.3.%.%.%.%.%.%.%.%.%.#.*.#.#.#.$.$.8.OXB.B.B.B.B.B.B.B.&XOX7.OXB.OXB.B.jXrXrX0.0.7.4.3.%.%.%.%.%.&.*.$.$.8 8 8 7 $Xq.*.&.%.3.6.6.6.%.%.&.*.*.#.$.8 6 2 i $X$X#X#X#X#X+X@X+X+X#X$XB.6.6.7.6.6.6.3.3.%.%.&.%.%.3.3.3.6.6.7.7.7.7.6.6.3.3.3.%.%.*.#.$.8 1 . . . i bXbXbXbXbXbXbXbXbXbXjXjXrXrX7.6.3.%.%.%.%.%.%.*.$.6 < X . . bXbXbXbXbXbXvX#X#X#X'.'.'.|.+X)..X).'..X+X+XzXzXzXzXbXvXbXNXlX7.0.0.7.7.6.3.3.%.%.%.&.&.*.&.%.%.6.7.0.rXjXjXjXjX0.0.6.6.9.%.&.#.$.6 1 X . . 9 bXvXbXbXbX$X$XbXlXjXjXjX0.0.7.%.%.%.%.%.%.%.*.$.8 6 < 1 1 @X&X$X$X$X$X$X+X+X+X$X+X+X+X+X+X$X@XlXkXlXjXjX0.7.3.%.%.%.%.%.%.%.#.$.8 < X . . 8.$X#X+X+X&X+X).).+X&X&X+X+X&X$X$X$X$X$X7.0.7.7.7.6.3.%.%.$.$.6 < 1 X i +X&X&X&XJ.J.W.W.x.z.s.x.s.a.s.s.u.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.u.t.t.u.t.t.u.u.u.S / ~ CXVXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXFXSXGXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXDXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXDXSXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXBXpX[ ~ S ` [.T.~././.!./.~././.(.(.(././.(.(.^././.(.!.~././.~./.~.~.~.[.T.~.~.~.~.T.~.~.T.T.~.T.T.~.~.~.U.T.T.T.T.P.U.P.P.P.L.L.U.L.L.L.L.H.L.L.H.H.S.H.S.G.G.S.S.A.J.S.Z.A.G.h.A.G.GXPXGXGXDXDXAXFXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXBXaXM.c c l.G.S.A.A.A.h.A.j.Z.g.A.G.g.A.h.A.h.h.h.A.z.g.A ; ; 0 e.l.A.D.S.Z.H.G.D.A : 0 e r ; : * > r ; C H.e.; y > Z H.S.L.A r ; q b.H.T.S.L.L.r r ; ; P.L.L.L.G.L.L.L.L.L.L.L.L.L.L.L.L.L.L.P.P.P.P.U.U.T.T.T.T.T.~.~.~.~.~./././.(.(.(./.(.^.!.[.^.[._.(.(.(.(.(.!./.(././.(.).~././.~./.!.[.~.~.~.~.R.Y.T.U.U.P.U.Y.Y.Y.L.T.P.T.P.P.Y.P.U.",
+"J P J P J J P L P P J J H J H H H K Y K K P Y Y v.Y v.v.n.N.V.V.V.OX7.7.7.7.6.6.3.3.%.%.#.&.#.#.#.#.#.#.#.&.&.&.%.%.%.%.%.%.%.%.%.%.&.#.$.$.8 6 6 6 8.8.#.#.%.3.6.3.*.#.$.6 < 1 X N.aXB.bXOXB.'.B.0.0.0.0.7.6.6.%.%.%.%.%.%.%.&.#.$.6 < 1 X c B.$XOXB.B.B.B.B.OX3.3.3.3.%.6.%.3.%.%.%.%.%.%.%.%.&.*.#.#.#.*.*.&.3.0.B.B.B.B.B.B.B.0.6.3.0.B.B.B.V.jXrXrXrX0.7.6.3.%.%.%.%.%.%.*.$.8 8 6 7 q.@XB.#.&.%.6.6.6.6.%.%.%.%.*.#.$.8 8 6 3 C.$X$X+X@X+X+X#X+X$X$X$X@X7.6.6.7.6.6.3.3.3.%.%.%.%.3.3.3.6.6.6.9.6.6.6.3.3.3.3.%.&.&.$.8 < 1 . . X OX$XbXbXbXbXNXbX$XbXlXkXjXrXrX0.6.3.%.%.%.%.%.%.*.$.6 < X . 9 bXNXbXbXbX#X#X#X+X#X).#X+X|.|.`.`.|.|._..X#X'.#XzX#XvXmXbXNXNX0.0.7.7.7.6.6.%.%.%.%.&.%.&.%.%.6.6.7.0.0.0.0.0.0.7.6.6.3.3.&.#.$.8 6 1 . . . N.bXbXbXbX$XbXbX$XlXlXlXjXrX0.6.%.%.%.%.%.%.%.*.$.$.6 < < 7 @X$X$X$X$X$X$X$X+X$X$X+X+X@X+X$X$X$XlXkXkXjXrX0.6.3.3.%.%.%.%.%.%.#.$.6 1 . . . &X$X+X+X+X+X).&X).&X&X&X+X+X+X$X+X$X$X$XOX0.0.0.7.7.3.%.*.#.$.6 1 X . Y &X&X&XE.J.J.x.W.x.h.s.s.f.a.u.u.s.t.s.t.s.t.t.p.t.t.t.t.t.t.t.u.t.t.t.r.t.t.t.u.t.t.t.t.u.u.t.t.u./ ~ / CXVXAXGXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXDXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXGXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXDXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBXm.{ ! ! [ ~.[.~././.~.[.^././././.(.(.(./.^.!.~.[.~.~./.~./.~.~./.~.~.~.[.~.!.(.~.~.T.~.T.~.~.T.~.P.~.P.T.T.T.T.P.T.U.U.L.L.P.L.L.D.L.L.L.H.L.L.H.H.H.S.H.H.A.S.S.A.A.G.Z.A.H.A.A.G.GXIXGXIXFXSXDXFXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXgXJXM.{ c A.G.H.H.S.A.A.A.A.A.G.A.A.A.A.A.A.A.h.z.h.D.z.Z e r : y y : r 0 e 0 e.b.r e 0 0 Z Z C Z y e 0 y F.S.r t : y U n.T r r ; u L.U.L.T.L.U.* y r = P.L.D.L.L.H.L.G.P.G.L.D.L.L.L.L.L.P.P.P.P.Y.Y.U.T.T.T.T.T.T.T.T.T.~.~././././.(.(./.(.(.(.~._._.(._.(.(.(./.(.(./.(./.(./.!.(./.(./.E.~.~.~.~.T.T.T.T.U.U.L.T.U.Y.U.U.P.P.P.T.Y.U.Y.T.",
+"J L J P J P L L P J J J H H P H F K L J Y Y Y ` ` v.c.v.n.N.N.V.V.B.7.7.7.7.6.6.3.3.%.%.&.#.#.#.$.$.$.#.#.#.#.&.%.%.%.%.%.%.%.%.%.%.&.#.$.8 6 3 < < V.C.#.%.%.6.6.6.3.#.$.6 < 1 X q.OX+XB.lXB.B.aX0.0.0.0.7.6.6.3.%.%.%.%.%.%.&.$.$.6 < 1 1 i B.B.B.B.B.B.B.B.B.7.3.%.3.%.3.%.%.3.%.%.%.%.%.%.%.%.&.%.&.&.&.&.&.3.6.7.0.0.OXOX0.7.6.%.*.8.B.B.B.B.OXrXrX0.0.7.6.3.%.%.%.%.%.%.*.#.=.8 6 6 7 $X$Xq.&.%.6.6.6.3.%.%.%.%.*.*.#.$.8 6 < 7 $X#X+X+X+X+X+X+X+X+X$X@XOX6.6.6.6.6.3.3.3.%.%.%.3.%.3.3.3.%.%.%.6.3.3.3.%.%.%.%.&.#.$.6 1 X . . 7 bXbXbXbXbX$XbXbX$X$XlXjXjXjXrX0.7.4.%.%.%.%.%.%.#.$.6 1 X X 4 bXbXbX$XzX#X#X#X|.|.+X_.(.)._.).)._.|.(.#X`.'.#X#XxX$XvXJXNXNXOX7.0.7.7.6.6.%.%.%.%.%.%.%.%.3.3.6.7.7.0.0.7.0.7.6.6.3.%.%.*.$.$.6 1 . . . 4 bXbXbXbX$XbXbX$XbXkXkXjXjX0.0.6.%.%.%.%.%.%.%.*.#.$.8 6 < C.@X$X$X$X$X$X$X@X$X+X$X$X+X$X@X+X$X$XkXjXkXjXrX0.6.3.%.%.%.%.%.%.&.#.8 < 1 . . 9 $X$X+X+X+X).&X&X).+X&X&X&X+X&X+X$X$X$X@XlX0.OX0.0.6.6.%.*.#.8 6 < X . 7 &X&X&X&XJ.W.W.h.h.h.s.f.f.a.u.i.t.i.t.i.t.u.i.t.t.p.t.t.t.t.t.t.t.t.t.t.t.t.u.E t.u.t.u.t.t.t.u.u.S ~ ~ CXVXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXGXFXFXFXFXFXFXFXFXFXVXFXAXZXZXBXm.[ ! ! _ ~.~.~././.^.~.[.E.(.(./././.(././././.~.(.~.~.~./././.~.~.~.~.~.(.T.~.~.~.T.T.(.T.T.T.T.I.T.Y.~.T.T.T.T.T.U.U.U.U.D.P.P.P.U.L.G.H.H.K.H.S.H.H.H.l.H.A.A.A.G.A.A.A.l.A.A.l.IXIXGXGXFXGXAXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXAXHXaXM.n c A.H.h.A.A.G.A.A.A.A.A.A.G.j.A.h.A.j.z.A.z.D.A.Z : r 0 0 r 0 0 e > 0 b.T ; e 0 J A.L.G.Y.Z e r ; U H.` = : t y = r r 0 q b.J.U.T.L.T.U.0 * e * P.L.U.L.G.P.D.U.P.G.L.L.L.L.L.L.L.P.P.Y.P.U.Y.T.U.T.T.T.T.(.U.~.~.~.~./././.(./.{.(./.^.~.(.[._.(.^.{.(.).(././.(.(.(././.^.)./.~.(.~.~.~.T.~.T.T.T.T.Y.U.U.U.T.P.U.Y.T.P.T.P.U.T.U.U.",
+"J J P J P P J P P H L H H H H H L H U H Y K I Y ` Y v.v.v.C.N.V.V.B.C.7.7.7.6.7.6.%.%.%.*.#.$.$.8 $.8 $.$.#.#.*.&.3.&.&.%.%.%.%.%.%.&.$.8 6 < 1 1 7 B.OX#.%.3.6.6.6.3.*.$.7 6 1 1 7 hXB.B.B.B.lXB.OX0.0.0.7.7.6.3.%.%.%.%.%.%.%.#.$.8 < 1 1 4 B.B.B.B.B.B.B.B.B.B.6.&.&.%.%.3.%.3.%.%.%.%.%.%.%.%.%.%.%.%.%.3.3.6.6.7.7.0.jX0.7.6.3.$.$.C.B.B.aXB.B.0.jX0.0.0.6.%.%.%.%.%.%.%.*.$.8 6 6 6 6 $X$XC.%.3.6.6.6.6.%.%.%.%.%.&.#.$.8 8 6 3 q.@X#X+X+X+X#X+X+X#X+X$X$X6.6.6.6.6.3.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.$.8 < X . . . V.$X$X$X$XbX$X$XbX$XNXlXjXjXrX0.7.6.3.%.%.%.%.%.&.#.$.6 < X X 7 bXbXvX#X#X+X`.`.+X).{.(.(.`.).(.(.(.).'.`._.|.#X.X.XvXvXvXmXNX#X7.7.7.7.6.6.3.3.%.%.%.%.%.3.%.6.6.6.6.7.6.6.6.6.6.%.%.%.&.#.$.8 1 X . . . B.bXbXbXbX$XbXbX$X$XkXjXjXjX0.7.6.%.%.%.%.%.%.%.*.#.$.$.$.8 V.$X$X$X+X@X$X$X$X$X@X$X@X%X+X$X$X+X$XkXkXjXjXrX7.6.3.%.%.%.%.%.&.*.$.8 < X . . q.#X$X+X+X&X+X).).&X).).+X&X+X+X$X$X$X$X$X$XjXrX0.0.0.9.%.&.#.8 7 1 X . w &X&X&X&Xx.J.W.x.h.h.s.s.s.a.s.u.t.t.u.s.u.t.u.u.t.u.t.u.t.t.u.t.u.u.E u.E i.u.t.t.u.u.u.t.u.u.u.u.S / / CXVXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXAXDXAXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXDXAXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXDXZXDXHXBXpX[ / / U [././.~.(.~.(.(.(.~.^./.(./././././.~.~.~.~.~./.~./.~./.^.(.~.~.~.~.T.~.~.~.~.~.T.~.T.T.T.T.T.T.T.P.T.T.U.P.P.P.U.L.L.L.U.L.L.L.S.S.H.G.H.H.G.S.A.A.G.A.A.A.G.A.S.z.D.G.D.GXIXSXGXFXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBXhXM.{ c Z.Z.S.S.S.S.S.S.S.A.A.A.A.A.A.A.A.A.S.A.A.A.Z.Z q y : r e e : : r r b.M * = y Y Y.G.H.U.[ 0 ; q B F.Y.T V q = = ; = Z Z.P.P.P.P.U.Y.].q q = q F.L.L.L.L.H.U.S.L.L.S.L.L.L.L.L.Y.Y.Y.T.P.T.P.U.T.U.T.T.T.T.T.Y.(.T.~././././././.(.^.(.(.(./.^.(.(.(.(.(.(./.(././.(.(.(./.(././.~.~.~.~.~.!.T.T.T.U.U.P.P.T.U.T.T.U.U.U.T.U.T.U.T.U.",
+"L L H L H H P H H P P H H U H H H H F U F U Y Y ` ` v.v.n.N.N.V.V.B.OX7.7.7.7.6.6.3.%.&.#.#.$.$.7 8.8 8 8 $.#.*.&.&.%.%.%.%.%.%.%.&.&.$.8 < 1 1 X 8.B.B.q.%.6.6.7.7.4.%.$.8 6 1 X 9 B.B.+XlXB.B.B.OX0.0.0.7.7.6.3.3.%.%.%.%.%.%.&.$.8 < 1 X X B.].B.B.B.B.B.B.B.B.V.%.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.3.3.6.6.6.7.0.0.0.0.6.3.$.8 6 C.B.B.B.B.OXjX0.rX0.7.7.3.%.%.%.%.%.%.*.$.8 8 6 < < $X$X$X%.%.3.6.7.6.3.3.3.%.%.&.*.#.8 8 6 < 4 +X#X+X+X&X+X{.+X+X@X+X#XB.6.3.6.6.6.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.3 1 . . . 7 $X$X$X$X$X#X#X#XbX$X$XbXrXjXjXrX0.6.3.%.%.%.%.%.%.#.8 6 1 X . l bXbX@X#X#X#X+X+X`.).(./.)././.).(.(.(.).`.|.+X`.#X#XvXbXzXbXbXNX0.7.7.7.7.6.6.3.%.%.%.%.%.%.6.%.%.3.6.6.6.3.6.3.3.%.%.&.#.$.8 < X . . . c $X$XbXbXbXbXbX$X$XlXkXkXjXrXrX7.3.%.%.%.%.%.%.%.&.#.#.#.#.$.#.*.6.7.0.C.OXOXOX0.C.7.0.0.0.OX$X$X$XjXkXjXjX0.7.9.%.%.%.%.%.%.&.#.$.6 1 X . . V.#X@X+X+X&X&XE.).&X).).E.+X&X$X&X$X$X+X$X$XkXjXjX0.0.6.3.&.#.8 3 1 X . 4 &X&X&XJ.J.J.x.h.h.z.z.f.s.a.u.u.u.u.u.t.u.r.i.t.u.t.t.u.t.t.t.E u.t.d.t.t.u.t.t.t.i.E t.u.u.t.t.p./ S ! CXVXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXAXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXGXDXBXm.} S ~ [ /./././.~.(./.T.(.(././././././././.~.~.~.~.~./.~./.~./.!.~.~.~.~.~.~.~.~.~.T.~.~.T.~.Y.T.T.T.T.T.T.T.T.U.P.Y.P.L.L.Y.L.L.L.U.S.L.L.H.H.H.H.H.S.G.A.A.G.h.G.A.H.A.A.G.H.D.GXGXPXGXGXFXDXAXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBXaXM.c c H.H.S.S.S.S.S.A.S.A.A.A.A.A.A.A.A.A.Z.S.G.z.A.Z.A.Z.A.A.h.A.S.A.S.A.H.Z.Z.L.G.H.G.G.G.H.S.G.L.H.S.Y.U.U.Z.F.b.b.n.L.H.^.Y.L.P.P.P.P.L.P.F.!.H.L.H.U.L.G.U.S.U.L.L.L.L.U.L.L.L.K.P.L.T.U.T.Y.T.U.Y.U.T.T.T.~.Y.T.~.~././.!./.(././.(.^.^.(.(.{.(.(.(.(.(.(./.(./././.(./././././././.~.~.T.Y.T.T.T.I.P.P.P.P.U.U.T.U.T.Y.U.U.U.T.T.T.",
+"P H J J H P H P U J H P L Z H H H L K J I Y J I ` Y v.c.v.n.N.N.V.V.B.0.6.7.7.7.6.3.%.&.#.$.$.8 6 q.OX8 8 $.$.#.*.&.%.%.3.%.%.%.%.&.#.$.6 < 1 X X C.B.B.0.3.6.7.7.7.3.&.#.8 6 < 1 X B.lXB.B.$XB.lXB.0.0.0.7.7.6.6.3.3.%.%.%.%.%.*.$.8 6 < 1 . B.B.B.B.B.B.B.B.B.B.B.0.#.&.&.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.3.3.6.6.6.7.7.0.0.7.3.3.8 6 < 8.B.B.B.B.B.0.jXrX0.0.6.6.%.%.%.%.%.%.*.#.8 6 < < 1 +X$X$X7.%.6.6.7.6.6.3.3.%.%.&.*.#.$.6 6 < 1 q.@X+X).+X+X+X{.&X{.#X#X+X7.6.3.3.3.6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.$.8 < X . . . ].$X$X#X#X#X#X#X#XbX$X$XJXjXjXrX0.0.6.3.%.%.%.%.%.&.$.$.3 1 X . q.vXvX#X#X+X+X`.`.)._./././.).~.).(.E./.(.|.|.|._..X.XvXvXbXvXNXbXjX7.6.6.6.6.3.3.3.%.%.%.%.%.%.%.%.3.3.3.%.%.%.%.%.%.&.#.#.$.< 1 . . . 9 $XbXbXbX$X$X$XbX$XbXbXkXjXjXjX0.7.3.%.%.%.%.%.%.%.&.*.*.#.*.#.#.%.6.6.7.0.0.0.0.7.6.6.3.3.6.OX$X+XlXkXlXjXrX0.6.6.%.%.%.%.%.%.&.#.8 3 1 . X 9 @X$X+X+X+X+X+X&X).{.{.+X&X+X$X&X+X$X$X$X$XOXkXjXjX0.7.6.1.&.$.8 < 1 X . i +X&XE.J.J.W.s.h.x.f.s.s.f.k.u.i.u.i.u.u.i.i.i.r.t.u.t.t.t.t.u.t.u.u.t.t.u.t.u.t.t.t.u.u.t.t.u.t.u.! / ! CXVXZXZXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXZXSXBXQ.[ ^ / ` /./.~./.(.T.~.(.~.~././././.~././.~./.!./.~./././.~././.~.~.~.~.~.~.~.~.XXU.~.[.~.T.~.T.~.T.T.T.T.T.P.T.P.P.P.P.L.U.L.U.L.Y.L.L.L.H.L.H.S.G.G.S.A.G.G.A.A.G.A.A.H.A.G.z.D.IXGXGXIXFXHXFXAXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXCXHXaXM.{ c A.G.S.S.S.S.S.S.S.S.A.A.l.A.A.A.A.A.h.A.A.A.A.A.G.z.H.A.h.A.H.H.H.H.A.S.L.H.L.S.G.U.L.S.L.U.H.L.L.H.S.U.G.L.U.L.L.P.Y.L.P.P.P.P.P.P.L.P.L.L.L.S.P.U.L.L.U.U.L.L.L.U.L.L.Y.L.L.L.U.U.T.L.L.I.Y.U.U.T.T.T.T.T.~.T.~.T.~.~././././.~.(.(.~.(.(.(././.(.[./.(.(./././.(./././././././.~.~.~.~.T.T.T.T.T.T.U.Y.T.U.Y.T.T.U.U.T.T.T.T.T.T.",
+"H P H P U H P L H J H H L H H G H D H H Y J L Y Y Y ` v.v.v.N.N.V.V.B.C.7.7.7.6.7.6.6.%.*.$.$.8 6 6 B.V.7 $.$.$.#.&.&.%.%.%.%.%.%.&.#.8 < 1 X . o +XB.B.C.6.6.7.7.7.6.3.#.$.6 < 1 1 v.B.B.OXaXB.].OXOX0.0.0.0.7.3.3.%.%.%.%.%.%.#.#.$.6 1 1 . C.B.B.B.B.V.B.V.B.V.B.+X8.#.&.*.*.%.%.%.%.%.%.%.%.%.%.%.%.3.3.3.3.3.6.7.7.7.7.3.*.8 6 < X C.B.B.B.B.B.jX0.0.0.0.7.6.%.%.%.%.%.%.*.$.8 6 < < 1 V.$X$X+X%.6.6.6.6.6.3.%.%.%.&.*.$.$.6 < 1 X X n.{.+X{.+X&X+X+X+X+X#X$X&X3.3.3.3.3.3.6.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.$.8 < X . . X c bX$X#X#X+X#X#X+X#X#X$X@XlXjXjXrX0.0.7.3.%.%.%.%.%.&.$.8 6 1 X . ' bX#X#X+X|.).`.).(.)./.).~.~.~.!.T.~./.)._.`.`.).|.`.#X#XzXbXvXNXbX7.6.6.6.6.6.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.#.#.8 6 1 . . . . V.bXbXbXbX$X$X$X$X$X$XlXkXkXjXrX0.6.6.%.%.%.%.%.%.%.%.&.&.*.&.%.%.3.6.7.0.0.0.0.0.6.%.*.#.#.%.+X$X$XOXkXjXjXOX0.6.3.%.%.%.%.%.%.*.$.8 1 X . . i @X$X+X+X&X&X&X).&X&X&X&X&X+X&X+X$X$X$X$X$XlXkXkXjX0.7.6.%.%.$.8 < X X X i &XE.E.J.J.W.W.W.h.k.f.a.f.u.i.a.s.u.u.u.u.r.u.t.u.t.t.u.t.t.u.t.t.t.u.u.t.u.i.E u.t.u.t.t.u.u.u.u.S S / CXFXZXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXAXGXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXDXDXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXAXFXFXFXFXFXFXAXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXZXFXZXBXm.{ Q S ` /./.T./.~.T.(.[.(.[././.~./.~.~.~.~./.~.~././.~.~././.~.^.~.[.~.XX~.E.XXT.XXT.[.T.~.~.T.T.T.T.T.P.T.T.P.T.P.Y.P.L.U.L.U.L.S.S.L.D.U.S.H.H.H.A.S.H.H.A.H.H.A.A.S.A.H.z.D.D.GXIXGXGXFXDXZXAXAXFXZXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXHXhXM.n c G.A.A.H.A.S.S.A.A.S.A.H.A.H.A.A.h.A.H.A.H.S.D.Z.S.S.A.H.A.G.h.H.A.H.H.H.H.S.D.L.S.H.G.U.S.Z.H.H.H.G.Z.P.U.L.L.L.P.U.D.L.P.P.P.P.P.L.U.P.P.P.P.P.P.L.L.L.S.U.L.L.L.L.L.L.U.L.Y.L.U.Y.I.I.T.I.L.T.U.U.T.T.T.T.T.~.T.~.Y.~.T./././.(.(.(.(.(.(.(.(./.^./.^./././.(./.(./././././././.~.T.~.T.T.T.T.T.T.U.L.T.Y.T.U.T.T.T.U.T.U.U.U.U.U.",
+"H P P H J H P P H Y P H H H H H H H H L L H Y U Y ` ` v.v.c.N.N.N.V.V.B.7.7.7.7.7.6.6.%.*.$.$.8 6 3 C.B.B.$.8 $.#.#.*.3.*.3.%.%.&.*.$.8 < X . . i B.B.B.B.6.7.0.7.7.6.3.#.$.8 3 1 X q.aXB.B.B.B.B.B.OX0.0.0.7.7.6.3.%.%.%.%.%.%.&.#.8 6 < 1 . 8.B.B.B.V.V.V.V.V.V.V.B.B.8.*.#.*.&.&.&.%.%.%.%.%.%.%.%.%.%.%.3.3.3.6.6.6.6.6.&.$.8 3 X X C.B.B.B.B.B.jXrX0.0.0.7.3.%.%.%.%.%.%.*.#.8 6 < 1 1 V.$X$X$XC.3.6.6.6.6.3.3.%.%.#.#.$.8 < 1 1 . . 9 {.+X).).).&X).+X{.+X+X@XC.1.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.#.8 6 1 . . . X '.$X#X#X+X#X+X+X#X#X#X#X#XB.jXjXrX0.7.3.%.&.&.&.*.*.*.$.8 < 1 . . q.#X#X#X|.).(.).(.).)./.~.E./.T.~.~.~.~./.(.E._._.#X`.#X.X#XxXzXbXJXOX6.6.6.6.6.3.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.&.&.#.$.$.6 < . . . O q.bXbX$X$X$X#X#X$X#X$XbXlXlXlXjXrX0.7.%.%.%.%.%.%.%.%.%.&.&.%.%.%.3.6.6.7.7.0.0.0.6.9.#.$.$.$.6.$X$X$XlXjXkXrXrX0.6.3.%.%.%.%.%.%.#.$.6 1 . . . V.$X+X+X+X&X+X&X+X&X&X&X+X&X+X+X$X$X+X$X$X$XUXlXlXjX0.7.6.%.#.$.6 1 X . . n.&X&XJ.J.J.x.W.s.W.s.j.s.f.i.a.u.t.f.u.t.p.t.i.r.i.t.u.t.u.t.t.u.t.u.t.t.u.r.u.u.u.u.t.t.u.u.u.u.u./ ! ! BXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXAXFXFXFXFXFXFXAXGXFXFXFXFXFXFXAXDXFXFXFXFXFXFXAXDXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXZXZXZXMXm.} S ! ` ~././.~.^.~.(./.(.~./.~.~.~.~.!.T./.!./.~./././././././.~.~.~.~.U.XXE.T.~.~.~.T.~.~.T.~.T.T.T.T.U.Y.T.U.Y.L.T.L.L.L.U.L.L.L.L.H.H.L.H.H.H.H.G.H.G.A.A.Z.G.S.S.S.Z.S.S.S.G.IXIXGXGXGXVXAXFXVXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBXhXM.8.c G.G.H.A.S.S.S.S.S.S.G.h.H.A.A.A.A.A.A.G.A.A.A.A.G.A.H.A.G.S.S.S.S.A.G.H.H.H.S.A.H.G.L.H.G.L.H.H.H.D.L.D.L.L.L.L.L.P.U.U.L.L.P.P.P.P.L.P.U.U.U.L.L.L.L.L.L.L.U.P.P.L.U.L.U.U.P.P.U.Y.U.U.T.U.L.P.T.U.T.T.T.T.~.T.~.~.R.T.T.(.{.T.~.E.(.~.(.~.(.~././././././././.(.!.).T.]./.~.~.~.~.T.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.",
+"H H H U U H L L H H H H H H H H H H L H L H K Y Y Y Y v.v.n.v.n.N.V.V.B.OX7.7.7.7.6.3.%.*.$.$.6 3 < x B.aXaXq.$.$.#.#.#.&.&.3.&.&.#.$.6 1 X . X 8.B.B.B.+X7.7.7.0.7.7.6.*.$.8 3 1 1 4 B.hXB.B.B.B.B.OX0.0.0.0.7.6.3.3.%.%.%.%.%.&.#.$.6 < 9 X i B.B.V.V.B.V.V.V.V.B.V.B.V.6.#.#.#.*.*.*.&.%.&.%.%.%.%.%.%.%.%.%.%.3.3.3.3.3.#.$.6 1 X X C.B.B.B.B.B.OX0.rX0.7.7.6.%.&.&.*.*.*.*.$.8 3 1 1 X C.@X$X$XOX3.6.6.6.6.6.%.%.*.#.$.8 7 1 X . . . . v.).).).).).).).).#X+X+X+X6.%.&.%.&.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.8 6 1 . . . . C.#X#X+X#X#X).#X+X`.+X+X#X#XlX0.rX0.7.4.&.#.#.$.#.#.#.$.$.6 1 X . . n.#X+X+X#X).(.).).~.~.T.~./.E./.T.T.T./.E.(.)._.|.(.#X.XzX#XvXbXvXbXbX6.3.6.6.3.3.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.6 < X . . . w bX$X#X$X$X#X#X#X+X$X#X$XlXkXjXjXrX7.6.3.%.%.%.%.%.%.%.%.%.%.%.3.3.6.6.6.7.7.0.7.7.%.*.8 8 6 8 OX$X$X$XlXjXjXrX0.7.6.3.%.%.%.%.%.%.$.8 6 1 . . X $X+X#X+X+X).).&X&X&X&X+X&X+X+X+X$X$X@X$X$XlXUXkXjXrX0.6.3.&.#.8 < 1 . . . V.&X&X&XJ.W.W.x.W.x.h.s.j.s.i.u.a.u.i.t.p.u.s.t.u.t.p.t.t.t.u.u.t.u.E u.u.t.t.u.u.E u.u.u.t.u.t.u.u.P / ! ZXVXVXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXDXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXDXAXFXFXFXFXFXFXDXAXFXFXFXFXAXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXZXFXFXHXQ.[ ! ! ` ~.~.~.~.~.(.~.(.~.(.~././.~.~.T.!.!./././.~./.R./.~.~./.(.~.~.!.XXXXT.T.~.~.(.T.T.[.~.T.T.T.T.T.T.T.P.U.T.Y.U.U.I.L.L.L.L.H.L.L.H.H.H.D.H.H.G.S.G.G.S.H.S.A.S.S.H.S.S.S.G.GXGXGXGXFXGXFXFXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBXaXM.{ x A.G.A.J.S.S.A.S.S.S.A.G.A.H.S.A.G.S.h.A.G.A.D.S.A.A.Z.S.A.A.A.A.S.H.H.S.S.H.J.D.H.H.U.A.L.L.U.S.L.U.L.L.L.L.L.L.P.Y.L.Y.L.L.U.U.D.U.L.L.L.U.U.L.L.U.L.L.U.L.U.L.U.P.L.L.L.U.P.P.U.P.Y.L.L.U.L.T.U.U.T.T.T.T.T.T.T.T.E.~.T.T.T.~.~.(./.(./.(.^./././././././././././.(.~./.~.~.~.~.~.T.T.T.T.~.T.Y.T.T.T.T.T.T.T.T.T.T.Y.Y.Y.U.T.P.T.",
+"H H L H H H L H H H H H H H H H H H L L L F H K ^ I ` ` v.v.c.N.N.N.V.V.V.7.7.7.7.6.6.3.*.#.$.6 6 < 3 +XB.B.B.q.$.#.#.3.*.3.&.%.&.#.$.< 1 . . 1 B.B.B.B.B.C.0.0.0.7.7.3.%.$.8 3 < 1 . B.B.B.B.OXB.B.B.0.0.0.0.7.7.3.3.%.%.%.%.%.%.#.$.6 < 1 X 4 V.B.V.V.V.V.V.V.V.V.V.V.B.V.q.#.#.#.#.#.*.&.&.%.&.%.%.%.%.%.%.%.%.%.%.%.%.*.#.8 3 1 X . 8.B.+XB.B.B.OX0.0.7.7.3.&.$.#.$.#.$.$.$.8 < < 1 X X q.$X$X$X$X7.3.6.6.6.6.%.*.#.$.8 3 1 X . . . X w E.&X).).).).).).).).+X+X+X&X%.&.*.*.&.%.%.%.&.&.%.&.%.%.%.&.&.&.#.$.8 6 1 X . . . i #X#X#X+X).+X).`.+X).#X+X+X+XB.0.7.7.3.&.$.$.8 $.8 $.$.8 7 1 X X . . N.@X#X#X)._.).~.E.).T.E.R.T.Y.Y.E.T.R./.~.^./.{.(.|.(.`..X#XxX#XbXJXNXOX3.3.3.3.3.3.%.%.%.%.%.%.%.%.%.%.%.%.&.*.#.$.8 8 1 X . . . + #XbX#X#X#X#X+X#X#X+X#X$X$XkXlXjXrXrX7.6.%.%.%.%.%.%.%.&.%.%.%.%.3.3.3.6.6.6.6.6.6.%.*.$.6 3 3 8 @X$X$X$XjXjXjXjX0.7.9.3.%.%.%.%.%.*.$.8 < X . . i $X@X+X+X&X&X+X+X{.OXlX+X&X+X+X+X$X$X$X$XlXUXUXkXjX0.0.6.%.*.$.8 < X . X 9 &X&X&XJ.E.W.W.x.W.j.h.j.j.s.s.s.i.u.t.u.i.u.t.u.u.t.u.t.s.t.E a.u.u.a.u.u.u.u.t.u.u.t.u.u.u.u.u.u.u.! ! ! CXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXAXDXFXFXFXFXGXDXDXDXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXZXZXDXDXBXm.{ ! ~ ` ~.~.~././.~.~.~.~.~./.~.~.T.~.~.(.T.~./.~.~././././.(./.T.~.!.~.~.~./.~.^.~.[.~.[.T.T.T.~.T.T.Y.U.T.U.T.T.L.P.Y.L.U.L.L.L.S.L.H.H.H.S.H.H.H.S.S.H.H.H.H.S.H.S.S.A.G.S.S.G.IXGXGXGXGXAXAXFXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXVXBXaXM.{ c Z.G.S.H.S.S.A.S.S.S.H.A.H.A.S.S.S.S.H.S.A.A.G.G.Z.H.S.S.S.S.H.S.S.S.S.H.A.G.H.S.G.S.U.H.H.H.P.L.S.U.H.S.L.U.L.U.L.U.P.L.L.L.U.D.P.L.P.L.U.U.L.P.P.P.L.L.L.U.U.U.L.L.P.P.T.P.P.P.P.P.U.U.U.L.L.Y.U.U.U.T.T.T.T.~.T.T.T.T.^.T.~.~.T.)./.(.~.~././.[././.~././././.!./.(.~.~.~.~.~.~.I.T.T.T.T.T.T.!.Y.T.T.T.T.T.[.T.T.T.~.~.Y.^.P.T.T.",
+"H H H H H H H H H J H H H H H H H F F H J U Y I Y Y ` ` ` c.n.c.N.N.V.V.V.0.7.7.7.7.6.3.%.#.$.8 6 < 1 8.B.B.OX+Xq.$.#.#.#.&.&.&.*.$.8 < X . . w B.B.B.B.OXB.7.0.0.0.7.6.%.#.$.6 < 1 X C.B.B.lX+XB.B.B.OX0.0.0.7.7.6.3.%.%.%.%.%.&.*.$.8 3 1 1 9 V.V.V.V.V.n.N.N.F.V.V.V.V.V.V.*.$.$.$.#.#.#.#.&.&.&.&.%.%.%.%.%.%.%.%.&.%.*.$.8 3 1 X . v.B.B.B.B.B.OX0.7.6.%.%.#.$.8 $.8 8 8 8 6 < 1 . . X c $X$X$X$XB.3.6.6.6.3.%.#.$.6 < 1 . . . . X v.&X).).E.).E.E.E.).).).).&X+X$XV.#.#.#.#.#.#.#.*.*.*.*.%.%.*.*.#.$.$.8 6 1 X . . . 9 +X#X+X#X+X).`.+X).).).).|.).+XOX0.6.%.&.$.$.6 6 6 6 6 6 6 < 1 X . . . N.#X).)._.).).~.~.~.T.Y.R.T.U.U.U.T.Y.T./.~./.E.(.).|.`.`.#X.X#X#XvXNX@X6.3.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.*.#.$.$.6 1 X X . . X V.bX#X#X#X+X+X+X+X+X+X+X+X$XkXjXjXOX0.7.3.%.&.&.&.&.&.&.*.&.%.%.%.%.3.3.3.%.6.6.3.&.#.$.< 1 X 1 q.$X@X$XOXjXjXjXjX0.0.9.3.%.%.%.%.%.#.$.8 1 X . . C.$X+X+X+X).%X&X&X&XJXUXkXlXlX+X$XB.$XlXlXUXlXlXjXrX0.7.3.%.$.8 < X . .   q.&X&X&XJ.J.x.W.j.j.j.x.s.j.s.a.a.s.i.i.s.u.u.u.t.t.s.t.u.t.u.u.u.t.t.u.u.u.i.u.u.u.t.u.u.u.u.u.u.u.u.S S / CXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXAXDXAXDXAXDXFXFXFXFXFXFXDXAXFXFXFXFXSXDXAXDXFXFXFXFXGXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXSXZXZXDXDXBXpX[ / Q T ~.[.^./.~.(.(.~.~.~.~.~.[.~.(.T.R.~.~.~.~.~.~./.~.!.T.~.(.~.~.~.T.T.~.~.T.^.T.~.T.~.~.~.T.T.T.P.T.Y.T.U.T.T.T.L.U.L.L.L.L.L.L.H.H.H.H.H.H.H.S.G.Z.G.G.G.G.Z.S.S.H.G.S.S.G.GXIXIXGXFXFXFXAXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXVXBXhXM.n c S.G.S.S.S.S.S.S.S.H.A.H.G.H.S.S.S.S.F.H.K.G.G.G.G.G.S.A.S.H.G.A.A.G.A.H.S.H.G.S.L.U.D.S.U.H.S.L.L.U.U.L.U.L.K.L.L.S.P.P.L.L.S.P.P.F.S.L.H.L.U.P.P.P.U.U.L.U.U.L.U.U.P.P.P.Y.P.P.U.Y.P.U.U.U.T.P.U.U.Y.T.T.T.T.T.~.T.~.(.T.T.T.~.~.XXT.(.~.(././.~././.^./././.(././.~.~.~.~.~.~.~.I.T.~.T.T.T.T.T.T.T.T.T.T.~.T.T.T.~.T.T.T.P.T.T.T.",
+"H H H H H H H K H H H Z L J H H U J F L L L L G K Y ` ` ` v.c.v.v.N.N.V.V.OX7.7.7.6.6.6.3.&.$.8 6 3 1 i B.B.B.B.B.6.$.#.#.*.*.*.*.$.6 1 X . X v.B.B.B.B.B.OX0.0.0.7.7.7.3.#.$.6 3 1 . 8.B.B.B.B.B.B.B.B.0.0.0.7.6.6.%.&.&.&.*.*.*.#.$.6 < 1 X . V.V.V.N.C.n.N.N.N.C.V.V.V.V.V.V.q.$.$.$.$.2.$.#.#.*.*.*.3.#.3.3.%.%.&.%.&.#.$.6 1 1 . . v.B.aXB.B.B.B.7.4.3.3.$.8 6 6 6 6 6 6 < < 1 . . . . v.$X$X$X$X$X7.%.6.9.%.#.$.8 3 1 . . . . 9 V.).&X).).E.E.E.E.E.E.).).).).).#X+XC.#.#.$.$.#.$.$.#.$.#.$.#.$.$.8 8 6 < 1 X . . . X +X#X+X+X`.+X).).)./.).(._.).+X+XOX3.%.#.$.8 < < < < < < 1 1 1 X . . . . V.|.`.).).)././.E.T.E.T.Y.U.I.U.Y.U.U.Y.R.E.^.~./.(.).`.|.`.#X#X#XxXvXbXhX%.&.*.*.*.*.*.*.*.&.&.&.&.&.*.#.#.$.$.8 3 1 X . . . o B.$X$X#X#X#X{.+X+X#X+X+X%X+X$XrXjX0.0.6.%.*.$.#.#.#.#.#.#.#.#.#.*.#.*.&.&.%.%.&.%.*.#.8 6 1 1 . X &X$X+X$XOXjXjXjXjX0.6.3.%.%.%.%.%.&.#.$.6 1 . . . $X$X+X+X&X+X&X+X).).JXkXkXkXkXjXjXjXkXkXkXkXkXjXjX0.7.6.3.#.$.6 1 X . . X &X).E.E.J.J.J.W.W.x.h.h.z.z.a.a.a.i.s.i.i.t.i.u.u.u.t.i.u.t.s.u.u.u.u.u.u.u.E u.t.u.i.u.u.u.u.u.u.i.u./ S / CXZXZXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXGXSXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXDXSXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXDXAXDXAXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXDXZXBXm.} ! ! ` ~././.^.~.~.~.~.~.~.~.~.!.T.~.~.(.R././.~.(.~././.(.(.~.~.~.).XX~.~.~.~.T.T.(.T.~.T.~.T.T.T.T.T.Y.Y.T.T.P.T.P.P.P.P.P.U.L.L.L.S.H.H.H.G.H.G.S.G.S.S.S.H.S.H.S.H.G.S.G.G.H.DXIXGXGXGXFXFXFXVXAXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXBXaXM.n c H.H.G.A.G.A.A.G.G.A.H.S.G.H.S.H.S.H.G.H.H.S.H.H.H.S.S.S.H.S.S.S.S.A.A.H.H.A.H.H.H.H.H.H.L.L.L.S.L.L.U.L.L.L.S.L.H.L.U.D.U.L.L.S.L.L.L.L.L.Y.P.P.U.U.Y.U.U.P.L.L.U.P.P.P.P.P.T.P.U.P.T.P.U.U.T.U.U.T.T.T.T.T.T.T.T.~.P.~.T.~.~.~.~.~.~.~./.[.~.~./.^.~.~./.(./.T.(.~.~.~.~.T.~.T.T.~.T.~.T.T.K.T.~.T.T.T.T.T.T.T.~.T.T.^.~.T.T.T.~.T.",
+"J D D H H H H H D H H H H F H H H H D H J F L K Y I Y Y ` v.v.b.n.N.N.V.V.B.7.7.7.7.7.6.3.%.$.$.6 < < < B.B.B.B.B.hXq.#.#.#.*.#.#.$.6 1 . . . OXB.B.B.B.B.B.C.0.0.0.7.7.3.#.$.8 < 1 X i B.B.B.B.B.B.B.B.7.7.7.7.3.%.#.#.$.#.$.$.$.8 6 < < X . . v.V.N.N.n.N.N.N.n.n.N.N.n.V.V.V.B.q.8 $.$.$.$.$.$.$.#.$.#.#.#.3.&.#.#.#.#.$.8 < 1 X . . C.OXV.B.V.B.V.3.3.#.$.8 6 < 1 1 < 1 1 1 1 X . . . . 4 $X$X$X$X$X+X6.3.%.&.#.8 < X . . . . i &X&X).).E.E.E.E.T.E.E.E.E.E.).).+X).+X#XC.$.$.$.$.$.8 $.$.8 $.8 8 6 6 < < 1 . . . . X V.#X+X+X+X).`.(.).).).).).).).&X&XC.&.#.$.8 < < 1 X 1 1 1 1 1 X . . X . . #X+X+X(./.).E.T.T.T.U.R.U.I.U.U.U.U.T.T.R.T.~.~.T.).(.`.)..X`..X#X#XbXvXbXC.*.*.#.#.#.#.#.#.#.#.#.#.#.$.$.$.8 6 < 1 X . . . X B.#X#X#X#X).+X+X+X).).+X).`.+XOXrX0.7.6.%.#.$.$.8 $.8 8 $.$.$.$.$.$.$.$.$.$.$.#.$.$.$.8 6 1 X . . 7 +X$X$X$XOXjXjXrX0.7.6.%.*.&.&.%.&.*.$.6 < 1 . X 7 +X+X+X&X+X).&X&X&X&XlXUXUXkXjXjXjXrXjXjXkXjXjXrX0.7.6.3.&.$.8 < X . . . i ).&X).E.E.J.W.x.A.A.h.f.f.f.f.a.i.i.a.i.t.i.t.t.u.u.t.r.u.t.t.u.u.u.t.u.u.u.u.u.u.u.E u.u.u.u.u.u.u.i.S ! / CXZXZXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXAXDXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXAXFXFXFXFXFXFXFXFXFXFXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXDXGXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXCXDXBXm.[ ~ ~ ` /./.~.~.^.E.(.(.~.^.~.~.~.~.~.T.T.~.T.T.~.~.~./.~.~.T.~.~.XXU.~.~.T.~.T.~.~.E.T.~.~.~.T.T.T.T.T.Y.T.T.U.T.P.T.P.P.P.L.L.S.L.L.F.H.G.H.H.G.G.S.G.H.H.S.H.H.G.H.H.S.S.H.H.H.IXGXGXGXGXHXVXFXFXZXZXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXVXZXaXM.{ c A.S.H.G.H.S.H.G.G.G.S.S.S.S.G.D.G.G.G.H.H.H.H.H.H.H.H.S.S.H.S.S.S.S.H.A.H.G.H.H.D.H.H.H.H.Y.H.L.L.L.U.S.U.S.L.L.S.L.U.S.U.L.L.U.L.L.L.U.L.L.L.U.L.U.Y.U.T.U.Y.U.P.U.P.P.T.P.P.T.T.U.U.Y.P.T.U.U.T.T.T.T.T.T.(.T.~.T.^.T.~.T.~.~.~.T.~.~./.~.~.~.~.~.~./.~.~.~.(.~.~.~.~.T.~.~.T.T.~.T.K.T.R.~.T.T.T.~.T.T.~.~.~.T.T.^.T.T.T.~.T.~.~.",
+"F H H H H H H H L H H H H H H Z H D D H L H L Y L I ) ` ` v.` v.v.C.N.N.V.V.OX6.7.7.7.6.6.%.#.$.8 6 1 1 8.lXB.B.B.B.B.q.$.#.#.#.$.$.< 1 . . w B.&XB.B.B.B.B.OX7.7.7.6.6.3.$.8 6 < X X X B.B.V.B.B.V.B.B.0.6.3.3.%.#.$.8 8 8 8 8 8 7 3 1 X . . . q.V.C.n.N.N.N.v.N.v.N.C.N.N.V.V.V.V.C.$.8 8 8 $.$.$.$.$.$.$.$.$.$.$.$.$.$.6 3 1 X . . . q.V.B.B.B.V.V.6.$.$.8 3 < 1 1 1 X 1 1 X . . . . . . 4 $X$X$X$X$X$XC.%.&.#.8 3 1 . . . X v.).+X).E.).E.E.E.E.E.U.E.U.E.E.).).).).&X+X+XC.$.8 8 8 8 6 8 8 6 6 < < < X X . . . . 4 ].#X+X+X).`.).).)./.E.E.).E./.).).&XC.#.8 6 < 1 1 X X . X X X . .   X X . . {.{.(.).)./.E.E.E.T.R.R.U.R.U.L.L.U.I.Y.I.Y.R.~./.E.E.{._.|.#X)..X.XdX#XbXbX8.#.$.$.$.$.$.$.$.$.$.8 8 8 8 3 < 1 X . . . . X V.@X#X#X).+X`.+X).).)._.).).+X&XOX0.6.%.*.#.$.6 6 6 8 6 8 6 8 8 8 8 8 8 8 8 8 8 8 8 8 8 6 1 X . . . v.$X+X+X$X0.rXrX0.7.3.%.#.#.#.#.#.#.#.8 6 1 . . . v.+X+X+X+X).&X&X+X+X+XlXUXkXkXkXjXrXrXjXrXrXrXrX0.7.6.3.&.#.8 3 1 . . . X ).+X&XE.J.J.J.G.h.h.h.h.z.f.a.k.f.i.i.i.u.u.u.i.u.p.u.a.u.u.u.u.E i.u.u.E u.u.u.u.u.u.p.u.u.u.u.u.i.i.i.S / / CXAXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXDXFXFXFXFXFXFXFXFXFXFXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXAXDXDXBXQ.[ ~ ~ ` ~.~./.~.~./.~.~./.~.~.~.T.~.T.^.~.T.~.T.R.~.~.T./.~.{.~.~.T.~.~.T.~.T.~.T.~.T.[.~.T.~.T.T.T.T.T.T.T.T.U.L.Y.L.Y.U.U.L.L.L.H.H.L.H.G.H.H.G.H.H.A.S.S.H.S.S.S.G.H.S.S.S.G.U.GXGXPXGXFXAXAXVXAXZXGXFXHXAXAXFXHXHXVXFXFXFXFXVXVXFXAXZXHXVXVXFXFXHXAXSXBXhXM.' x S.Z.A.A.S.S.G.A.Z.G.G.G.S.H.S.G.H.H.H.H.H.H.U.S.L.S.H.H.H.H.G.S.H.A.S.S.S.G.G.H.H.H.K.H.H.H.L.L.H.L.H.U.L.L.L.S.L.L.L.L.L.L.L.L.L.L.L.U.U.L.P.P.P.T.U.U.T.P.T.P.Y.U.T.P.T.T.T.T.T.U.U.T.U.T.T.T.T.T.T.T.T.T.T.T.T.[.E.[.U.XX~.T.~.~.~.~.[.T.~.~.~.~.!.~.~./.~.~.~.~.~.~.~.~.T.~.T.T.T.T.I.Y.T.T.T.T.~.T.T.T.T.(.~.T.T.T.~.~.T.~.T.T.",
+"H Z H D H H H H H H H H H H H H H H H H H L H F U I Y Y ` Y v.v.v.b.n.N.C.V.V.7.7.7.7.6.6.3.&.$.8 6 < 1 i B.B.B.B.B.B.OXC.$.#.$.$.6 < 1 . . i B.V.OXB.B.B.B.B.7.7.6.3.&.#.$.6 3 1 X . . N.B.B.].V.B.B.V.0.6.3.&.#.$.8 6 6 3 6 3 < < < X X . . . i n.N.N.n.v.n.N.v.n.n.v.v.N.N.n.V.N.V.C.q.6 6 8 6 8 8 8 8 8 8 8 8 8 8 6 6 < 1 X . . . . c V.V.V.V.V.V.6.$.6 3 < 1 . . . . . . . . . . . . . w +X+X+X$X@X+X+X3.#.$.8 1 . . . 9 V.+X+X&XE.E.E.E.E.I.U.E.U.J.E.U.E.E.~.E.).&X+X+X+XV.q.8 6 6 6 < 3 < 1 < 1 X . . . . . w +X+X|.+X).).).)./.E.).E./.E./.).E.).).).V.V.N.V.W.n.V.N.C.N.V.C.v.i q.c i c i +X).)./.E.~.T.R.R.Y.U.U.L.H.L.L.K.Y.I.I.L.Y.R.T.T.~.(.(.).(.`.`.#X#X+X#XbXbX$X8.$.$.$.8 8 8 8 8 8 6 6 6 < 1 1 . . . . X 4 ].#X#X#X#X`.+X).).).).).E.).).{.).OX6.9.*.$.8 6 < < < < < < < < 3 < < 6 < 6 6 6 6 6 8 6 < < 1 X . . 1 &X$X$X$XB.0.0.7.6.3.#.$.$.$.$.$.$.$.8 6 < X . . . &X+X+X&X&X+X&X).&X).&XlXkXkXkXkXjXrX0.0.0.0.0.7.6.6.3.*.$.8 3 1 . . . X v.&X&X&XJ.E.J.W.G.W.h.h.z.z.f.l.s.a.a.i.i.i.u.u.i.p.u.t.u.t.t.u.t.u.t.u.u.u.u.u.u.u.t.u.p.u.u.i.u.i.i.p.i.! S / CXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXDXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXCXHXpX} ^ ^ ` ~.~.T.~.~.~.~.~.~.~.~.~./.~.T.T.T.~.T.~.~.~.(./.R.~.~.T.~.~.~.T.~.T.~.T.~.T.~.P.T.~.Y.T.~.T.T.T.T.T.T.U.Y.U.L.L.L.L.D.Y.L.L.L.H.S.G.G.G.G.H.A.H.A.S.H.A.H.H.A.A.G.S.G.A.G.GXSXGXGXFXVXCXFXAXFXZXFXVXFXFXAXFXZXVXAXFXAXAXFXFXFXFXVXVXFXHXFXFXAXAXZXJXaXM.c n S.S.A.A.S.S.G.G.H.R.S.G.H.H.H.H.H.H.H.H.H.H.H.S.L.U.H.S.H.H.H.H.H.H.S.S.G.S.H.H.H.H.H.H.H.L.L.S.L.L.U.S.S.L.L.L.L.S.L.L.L.L.L.L.L.L.L.U.Y.L.P.P.T.T.T.U.U.T.T.T.P.Y.P.T.T.P.T.P.U.T.Y.T.T.T.L.T.T.T.T.T.T.T.~.T.~.T.R.T.XXT.T.~.T.~.~.T.T.~.~.~.~.~.R.~.~.~.T.~.~.~.T.~.T.T.~.K.T.T.~.T.~.Y.T.~.T.~.T.T.~.R.R./.T.~.~.~.T.~.~.T.T.~.",
+"H H H H H H H H D H H H H H G J L H G H H L H L L K I I ` ` v.` v.v.N.N.N.V.V.C.7.7.7.6.6.3.*.$.8 6 < 1 1 B.B.B.B.B.B.B.B.8.#.$.$.6 < X . . C.B.V.B.V.B.B.B.V.7.6.3.#.#.$.8 3 1 X . . . 8.V.V.V.V.V.B.V.C.4.*.$.8 8 3 < < < 1 1 1 1 X X . . . . 4 N.n.N.c.n.c.c.c.v.c.v.n.C.n.n.C.N.V.V.V.8.7 7 6 6 6 6 6 6 6 6 6 4 3 3 1 1 X . . . . . i V.V.V.V.V.V.C.q.q.v.v.8.v.v.v.v.v.C.C.V.&X+X+X+X).).+X+X&X#X+X+X+XC.#.8 < 1 . . w ).&X&X).).E.E.E.E.J.J.E.I.J.I.E.E.I.R.).E.E.&X&X+X{.+X#X8.7 < < < 1 1 1 X X . . . . 9 v.#X#X+X+X{.).).).E./.E.E.E.E.E.E.T.E.(.).).).+X|.#X`.+X#X+X#X#X#X#X#X`.#X+X#X+X&X{.).).E.~.E.T.T.U.I.U.R.U.K.U.U.L.K.K.L.R.Y.R.R.T.~.E.^.(.).).`.|.#X#X'.#X$XvX#XC.$.8 8 7 7 < < 3 < 1 1 1 X . . . . . c $X$X#X+X#X)._.).)././.).E./.{.&X).).7.%.#.$.6 6 < 1 1 1 1 1 1 1 1 1 < 1 < 1 < 1 1 1 < 1 < 1 X X . . . w $X+X$X+XOX7.6.3.%.#.$.8 6 8 6 8 8 6 6 < X . . . 9 +X+X+X&X&X&X).&X&X&X+XlXkXkXkXjXrX0.7.7.7.7.6.6.3.&.#.$.8 < 1 . . . . i +X&XE.E.E.J.J.W.G.W.W.j.h.f.f.z.f.f.a.a.s.i.i.t.t.u.u.u.u.u.t.u.u.u.t.u.i.t.u.u.t.u.u.u.u.u.i.u.u.u.i.i.a./ S ! BXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXAXFXFXFXFXBXQ.{ ~ S [ ~.~.T.~.XXE.~.~.~.~.T.~.T.~.T.T.T.T.T.T.T.(.~.~./.~.~.~.T.~.T.T.T.~.~.T.T.T.~.T.T.~.Y.Y.T.T.T.T.T.T.T.T.U.U.L.Y.U.L.L.L.L.L.H.H.H.Z.Z.G.G.Z.A.A.H.S.H.G.A.H.S.H.H.G.A.H.D.GXGXGXGXHXVXCXHXZXGXGXFXVXVXZXDXDXFXZXVXZXVXVXFXCXZXAXHXVXGXHXVXHXZXDXgXJXm.M.c - Z.S.S.A.H.H.G.G.G.G.L.A.S.H.H.S.H.S.H.H.S.L.S.S.L.S.H.H.S.H.H.H.A.H.S.S.G.S.H.S.H.S.H.S.H.H.L.L.H.L.L.L.L.L.S.L.L.L.L.L.S.Y.L.L.L.L.L.Y.L.Y.P.T.T.T.T.T.T.T.P.T.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.~.~.T.~.T.XXXX~.T.~.T.T.T.~.T.T.~.T.T.T.~.~.~.~.~.~.~.K.~.~.~.~.T.T.~.K.T.T.T.T.T.U.T.T.T.T.T.T.~.~.~.~.~.~.Y.~.T.~.T.",
+"H F H H H H H F H H H D H H F J D H K H H H H L U Y Y Y Y ` ` v.b.v.v.n.N.n.V.C.6.7.6.6.3.&.#.$.8 < 1 1 . C.B.B.B.B.B.B.B.B.C.$.8 6 < . . 3 V.V.V.C.V.V.B.V.B.C.3.*.#.$.6 6 1 X X . . . i V.V.V.V.V.V.V.V.3.$.$.8 3 1 1 X X X X X X X . . . . . 9 n.n.c.v.b.c.v.c.v.n.b.v.n.N.v.N.N.n.V.V.V.V.q.6 6 6 3 3 < < 1 < 1 1 X X X . . . . X c V.V.V.N.V.N.N.N.V.N.V.N.N.V.C.N.C.V.N.V.V.B.&X+X+X+X+X+X@X&X&X+X).+X+Xq.6 < X . i &X).).).E.E.E.E.T.U.E.J.J.I.J.J.J.I.I.U.T.E.E.{.).).+X+X+X{.+XC.i 1 1 X X . . . X w N.#X#X).+X+X).).).).E.T.E.~.E.T.R.T.E.~.E.E.E.E.{.).).).#X+X+X#X+X).#X|.+X#X#X).|.{.{.(.(.E.T.E.E.E.R.I.U.U.I.L.U.L.L.L.L.U.L.L.Y.U.R.T.E.T././.{._.{.{.).'.+X#X.X#X#X#XV.8 6 < 3 < < 1 1 1 X X . . . . w V.@X#X+X`.+X).).).).E.E.E.E.E.E.U.).E.).q.#.8 6 < 1 1 . X 1 . X X 1 X X X X X 1 1 9 1 1 1 1 1 1 . . . . X q.+X+X+X+XC.3.%.&.$.8 6 < < < 6 3 6 < 1 1 . . . . v.+X&X&X).+X).).).E.&X&XlXjXjXrXrXrX6.6.6.3.3.3.3.*.$.$.8 < 1 . . . . 9 ).).&XE.E.E.J.W.W.J.x.h.h.j.h.f.f.a.a.a.a.f.i.i.i.i.u.u.u.i.u.u.t.u.u.u.u.E u.t.u.u.u.u.u.u.u.u.i.i.i.i.a.a./ / / CXVXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXAXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXSXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXZXZXBXm.[ ~ ~ ` T.~.T.~.U.XXT.~.~.~.~.~.T.T.T.~.T.T.T.~.T.T.~.~.R.~.~.T.~.T.T.T.T.T.T.~.T.~.~.T.T.~.T.~.T.T.T.T.T.T.Y.U.P.P.L.Y.L.S.S.L.H.S.H.H.H.H.G.H.G.H.H.A.S.A.Z.S.A.S.S.H.A.H.A.A.G.GXGXFXCXHXJXgXfXJXBXJXBXJXBXfXgXHXJXfXJXBXJXCXBXJXgXBXfXBXfXJXgXnXfXfXJXaX{ x c z S.S.H.S.S.A.H.F.G.G.G.G.H.L.H.S.U.D.H.L.L.H.L.L.L.L.L.H.L.H.H.H.H.S.G.S.G.D.H.H.H.H.H.H.H.H.K.H.L.H.L.S.H.S.L.L.L.H.L.L.U.D.L.L.L.U.L.L.I.I.P.P.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.~.~.T.T./.~.T.[.E.~.~.T.T.T.~.T.T.~.T.T.~.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.~.T.~.T.T.~.T.T.T.~.T.T.~.R.T.~./.~.~.~.~.T.T.~.",
+"D D D D D Z F H D D D Z D H H H H H G H H H H L F J P I ) ` Y v.v.b.v.N.N.C.N.V.7.6.3.3.*.#.$.8 < 1 1 X . l B.B.B.B.B.B.V.V.V.8.8 3 1 . . w n.V.V.W.V.n.V.V.C.C.&.#.$.6 3 1 X X . . . . 9 V.V.N.V.N.V.V.V.q.$.8 < 1 X X . . . . . . X 9 9 4 9 w w N.v.c.v.v.v.v.c.b.c.c.v.v.v.v.N.n.N.N.m.V.V.V.N.8.7 < 9 1 1 1 1 X X X . . . . X i N.V.V.N.N.N.N.N.N.N.C.n.N.N.N.N.C.N.N.N.N.V.V.K.).).).).&X).&X&X&X&X).).).K.6 9 1 v.&X&XE.).E.E.E.E.U.U.J.J.J.L.J.L.J.H.U.I.U.E.E.E.E.E.).).).).+X+X&X+X@XV.n.N.n.V.V.#X#X`.#X+X+X`.)./.).).E./.T.E.T.T.R.E.U.E.T.E.E.(./.{./.).+X).{.#X{.+X+X#X+X+X).).{.).+XXXE.E.E./.R.I.Y.I.I.I.J.U.L.L.L.L.L.L.L.L.L.Y.I.U.T.R.~.E.~.^.(.).).(._.+X`.#X#X#XvX#X@XC.7 3 1 9 1 X X . . . X i V.#X#X#X+X+X`.+X)./.).E.E.E.U.E.R.E.E.E.E.E.{.&X&X).&X+XW.n.n.C.V.v.q.] q.] i w w 7 7 X X X . X X . . . . . . W.+X+X&X+Xq.3.#.$.8 6 < 1 1 1 1 1 1 1 1 . . . . . E.&X&X&X&XXX&X&X).).&X&XjXjX0.0.7.9.3.*.*.#.#.$.$.8 6 < < X . . . . 9 ).+X).E.&X&XJ.J.J.J.x.W.h.x.h.f.h.j.f.g.a.a.a.i.u.i.i.i.u.i.u.u.u.u.t.u.u.u.u.u.t.u.u.u.u.u.u.u.i.i.u.a.i.a.a.P / / ZXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXAXDXDXFXFXFXFXFXFXDXAXDXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXZXHXm.} S ~ [ /.T.~.~.~.~.T.~.~.T.~.T.T.~.~.T.~.~.~.T./.T.~.T.~.~.~.T.~.T.T.T.T.T.T.T.T.T.T.~.~.T.~.T.~.Y.T.T.T.T.U.Y.P.U.P.L.L.L.L.L.H.L.S.H.H.G.G.H.G.H.A.S.S.A.A.S.S.A.S.S.H.A.A.H.A.CXBXJXaXpXpXM.pXM.m.pXM.m.M.M.m.M.M.M.M.pXM.pXM.m.M.m.V.aXM.m.M.M.M.M.M.{ l w z t A.S.A.S.H.H.H.H.K.A.H.L.L.H.H.U.L.S.K.L.H.L.L.S.I.S.L.L.H.H.H.H.H.S.S.S.S.H.G.H.H.H.K.H.H.K.S.L.H.H.L.H.F.L.L.L.L.S.L.S.L.L.L.L.L.L.U.U.I.U.P.T.T.P.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.~.T.~.T.~.T.~.~.~.~.~.~.~.T.T./.~.T.~.T.T.T.T.T.~.T.T.~.T.~.~.T.~.~.~.T.T.T.T.T.K.T.K.T.T.T.T.T.~.T.T.~.~.~.~.~./.~.~.~.~.T.~.~.",
+"H H H F F D D D F H K H H H H H F L K H H H H L I K Y I Y Y ` ` ` v.v.v.v.N.N.N.C.3.%.#.$.$.8 < 1 1 X X . X B.V.V.V.V.V.V.V.F.V.q.3 < X . v.V.C.N.C.V.n.C.n.V.V.#.$.6 3 1 1 . . . . . . . V.n.C.n.N.V.n.N.v.q.x q.c v.] 8.v.C.V.V.V.V.N.V.n.C.n.N.n.c.c.v.b.` [ ` v.` v.c.v.n.v.c.v.n.n.V.n.N.V.N.V.V.C.q.i 7 X X . . . 9 9 u 8.V.V.N.N.C.N.N.n.C.N.v.n.N.n.N.n.N.n.N.n.N.n.N.n.n.].E.E.).E.E.E.&X&X&X&X).).).).q.9 n.&X&XE.E.E.E.E.E.U.E.J.J.U.J.J.J.H.J.J.J.J.J.J.R.T.E.E.E.E.(.).).&X&X+X+X+X+X+X+X+X).#X+X+X+X).).).).)./.E.).T.E.R.E.R.U.E.U.R.R.T.R.E.E.E.).(.{.).).).{.).{.|.).|.).|.).).{.).).E.~.T.E.Y.T.I.I.U.U.L.H.L.L.L.L.S.L.L.L.L.I.U.U.Y.R.T.~.E.(./.(.(.).`.`.).+X|.#X#X#X#X#XB.N.q.i 4 w c q.N.$X#X#X#X+X|.#X).).).).).E.R.E.I.E.E.U.U.U.U.E.E.E.E.E.).).&X&X&X+X&X&X+X+X+X+X+X+X+X+X@X+X+X+X+X&X&XC.n.n.C.v.i v.+X&X&X+X&X3.$.8 6 3 < 1 X 1 X 1 X 1 X . . . . . 9 &X{.).E.E.&XE.E.E.E.).+X0.0.0.7.4.3.$.$.$.8 $.8 6 6 < 1 X . . . . 4 +X&X).).&XE.J.J.J.J.h.G.h.h.h.h.f.z.a.a.a.d.a.a.i.i.u.i.u.i.u.u.u.u.t.u.u.E u.t.u.u.t.u.i.i.u.u.i.u.i.i.a.a.a.a./ S / BXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXAXDXFXFXFXFXFXFXAXDXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXAXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXZXDXBXm.[ ~ S ` T.~.~.T.T.~.~.~.T.~.~.T.~.T.~.T.T.T.T.T.T.~.T.~.T.T.~.~.T.T.~.T.T.~.T.T.~.~.~.T.T.~.T.T.T.T.T.T.T.U.P.P.P.P.P.L.L.S.S.L.S.L.H.H.H.H.G.H.A.H.A.A.A.A.A.A.A.A.A.A.H.A.A.z.A.hXhXsXM.{ c c n c c c n b c c n c c n c c c n n c n c c n n n c c c c x w z w w K G.G.S.G.h.H.H.H.H.H.L.G.L.L.H.S.S.D.H.H.L.L.L.L.L.L.L.H.L.H.H.H.H.H.S.G.H.S.H.H.H.H.H.H.H.L.L.H.L.F.L.L.L.L.S.L.L.L.L.L.L.L.L.L.L.L.U.Y.U.U.P.T.P.T.P.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.~.~.~.T.T.~.T.T.T.~.T.~.T.~.~.~.~.~.~.~.~.~.T.XXT.T.T.T.T.T.T.T.~.T.T.~.T.T.T.~.K.~.T.T.~.T.T.T.~.T.T.T.T.T.T.T.~.T.T.~.~.~.~.~././.~.(.~.~.~.~.",
+"H Z H D D Z H Z D H H D H Z H H H H Z Z H H J D L L P I U ` Y ` ` v.v.v.c.n.n.C.N.3.#.#.$.8 < < X X . . . . q.V.V.V.V.V.N.N.C.n.N.q.3 1 X N.N.v.C.N.N.N.N.C.n.N.q.8 7 7 7 w i i w q.q.' ] N.n.N.n.N.v.N.N.C.N.V.N.C.N.V.N.V.N.V.N.N.C.n.N.N.v.N.c.v.c.c.v.` v.` ` v.` v.v.` v.v.c.c.n.c.N.N.N.n.C.N.N.V.V.V.V.V.V.V.V.V.V.V.V.N.N.N.N.N.N.n.v.n.c.N.n.n.c.N.N.v.n.N.c.v.N.n.N.n.n.K.E.E.E.E.E.E.E.E.E.E.E.E.E.E.K.W.E.E.E.E.E.E.I.E.E.I.L.J.J.J.J.W.J.G.J.J.J.H.J.I.I.I.E.E.E.E.E.).(.{.).).).#X).+X).#X).#X).).).)./.).)./.E.E.E.R.R.U.U.E.U.U.U.U.I.E.T.E./.[.).E.).(.).)._.).).)._.).(.(.(.(.(.E.~.E.E.R.I.U.U.U.L.L.J.L.H.L.L.S.L.L.L.L.H.L.L.L.P.P.R.T.T.T.E.T.(.E./.).(.+X_.+X#X`.#X#X`.#X#X#X#X#X#X#X#X#X#X#X).|.+X).).).(.E./.E.E.I.I.I.I.J.L.W.I.E.I.E.E.E.&X&XE.&XE.&XE.&X&X&X&X&X+X+X+X+X+X&X+X+X&X+X).+X&X+X).&X&X&X+X&X).&X&X&X&X&X&X&X).C.n.n.C.i i v.7 w w 7 X . . i &XE.J.&XE.&XE.E.&X&X&X&X7.7.6.&.#.$.8 8 6 6 < 3 < 1 X . . . . . i +X+X&X&X).E.I.E.W.W.J.G.W.j.h.f.h.j.z.h.f.a.z.d.a.a.u.u.i.u.u.u.u.u.E a.u.u.u.t.u.t.u.u.E u.i.u.i.i.i.a.a.a.a.k.i.! ! ! CXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXDXAXDXFXFXFXFXFXFXFXFXFXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXAXAXBXQ.} ! ! ` T.T.T.T.~.T.~.T.T.T.[.T.T.T.T.T.T.T.T.T.T.[.P.T.[.T.~.T.T.~.T.T.T.T.T.T.T.~.T.T.~.~.T.T.T.T.Y.T.Y.Y.Y.U.P.P.L.L.H.U.H.S.L.L.D.L.S.S.A.G.W.A.A.G.G.h.A.A.A.G.A.G.A.S.W.A.A.].n.n c l w w l w w z w t w z w z w w z t w f w w l w z e h u h w w l u w z u K e.U.H.G.A.A.H.H.H.H.L.D.U.H.U.U.L.L.L.S.L.L.L.S.P.L.L.L.L.H.L.H.L.S.D.G.S.H.H.H.D.G.L.L.S.L.L.S.U.L.L.H.L.S.L.S.L.L.L.L.L.L.L.L.L.Y.L.U.U.U.T.U.T.Y.T.T.U.T.~.U.T.T.T.~.T.T.~.~.T.~.~.T.~.XX{.U.T.T.~.T.~.T.T.~.T.U.XXE.~.~.~.~.T.XXU.T.T.Y.Y.T.T.T.T.T.I.~.T.T.T.T.(.K./.T.T.T.T.T.U.U.E.T.T.T.~.T.T.T.T.~.~.~.~.~././././././.~.~.~.",
+"D H H D D D Z F S H D H H H H H H H H J H H H H L L H K Y I Y ` ` v.` v.v.n.n.N.N.q.#.$.8 < < X X . . . . . w m.V.N.N.N.n.N.N.N.n.m.7 1 w N.C.n.v.n.n.v.n.n.n.C.N.N.N.n.N.N.C.v.N.m.N.N.N.N.N.v.N.N.N.v.n.n.N.N.N.n.n.N.C.N.n.N.N.N.n.N.n.v.n.v.b.v.c.` ` ` ` ` ` ` Y ` Y v.` v.v.c.c.c.v.N.v.N.N.N.N.N.V.V.N.V.V.V.V.N.N.N.N.N.N.N.N.v.N.c.N.v.c.v.c.c.c.v.n.c.c.c.c.n.v.v.v.n.F.E.E.W.E.E.J.E.I.E.I.E.E.I.E.E.E.E.E.E.E.J.E.I.J.I.J.L.J.J.J.H.H.G.G.W.S.S.H.J.G.J.J.I.U.I.E.R.E.E.E.).).).).).)._.).).).).).(.)._.)././.E.T.T.R.E.E.U.Y.I.U.U.J.I.I.U.T.E.E.T./././.).E.(.(.)././.).).E.)./.E./.E.T.E.R.I.U.I.U.L.J.L.L.K.H.L.L.L.H.L.D.H.L.L.L.L.U.U.R.R.R.R.T.T.E.(./.).).(.).(.).{.).#X).+X(.#X#X+X#X`.+X`.).#X+X)./.)./.).E.E.R.T.I.I.I.J.J.J.J.J.J.J.L.W.J.J.J.J.J.E.E.E.E.&XE.{.&X&X).&X&X&X&X&X&X&X&X).&X&X&X).E.).E.&X&XE.E.E.E.&XE.&X).&X&X&X&X&X&X&X&X&X&X&X&X&X&X&XE.E.E.E.&X&XE.J.E.E.J.E.E.OX7.3.*.#.$.8 6 < < < 1 1 X X . . . . + C.&X&X).&XE.E.W.E.J.W.G.G.h.x.h.l.h.j.f.s.f.f.a.k.a.a.d.a.d.a.i.i.u.i.i.u.i.u.E u.u.u.u.u.u.i.u.u.i.u.i.i.a.a.a.d.i.f.S ! / CXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXDXAXDXAXFXFXFXFXFXFXFXFXFXDXDXDXFXAXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXBXpX[ ^ ~ ` ^.T.T.~.T.~.T.~.~.T.T.T.T.T.[.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.P.~.T.T.~.T.T.T.~.T.T.T.T.T.T.T.T.Y.Y.!.L.U.P.L.L.P.U.D.Y.L.D.A.L.A.L.S.H.G.h.A.G.A.G.G.G.A.A.A.A.A.G.Z.S.A.H.Z.b.' w w l w w l z w w z z w z w w z w z z w w l l w w z w z w z z w d - w Y f.k.G.G.G.H.H.H.S.H.L.H.L.D.U.D.P.A.L.D.L.L.S.L.U.Y.S.L.L.U.S.L.G.H.H.L.H.G.S.H.H.D.L.G.L.L.Z.S.U.D.L.P.S.L.L.L.L.L.L.L.L.L.L.U.L.L.L.L.L.U.U.U.U.T.T.T.T.~.T.T.~.T.~.T.~.~.~.T.T.~.~.T.T.~.T.~.E.XX~.T.~.~.T.~.~.~.XX~.~.~.~.~.~.~.E.XX~.T.T.T.T.T.Y.T.~.T.T.T.T.~.T.T./.Y.T.T.T.T.~.XXXXU.T.U.T.T.T.T.~.T.T.~.~.~.~.!./././././.~.~.!.",
+"D D D D Z H P Z J Z Z H H H H H Z H H H H Z H H L L Y Y I I ` I ` Y v.v.v.v.n.N.v.M.$.8 6 < 1 . . O . . . . 4 V.C.n.N.N.N.n.N.n.c.n.c.i i n.v.b.b.v.n.v.v.v.N.n.n.N.n.n.n.v.N.c.n.n.c.v.v.n.v.n.v.c.n.c.v.v.N.v.N.N.n.v.N.n.v.N.n.v.N.N.n.c.v.v.v.v.` v.v.Y ` ` ` Y ` ` ` ` ` ` ` ` b.c.c.c.N.v.N.n.n.N.N.N.N.N.N.N.N.N.N.N.n.N.C.n.v.n.n.c.c.c.c.v.c.c.c.c.v.c.c.v.c.v.c.c.b.c.F.W.W.E.J.I.J.J.J.E.E.I.I.E.E.E.E.E.E.I.I.J.I.I.J.E.J.H.J.H.J.W.G.G.G.G.G.S.W.H.J.J.L.L.J.I.I.U.E.R.E.E.E.(.).(.).{.(.).).).).E.(.).E.E.E.~.E.T.E.I.E.I.U.I.U.J.I.U.I.I.T.U.~.E.E.~././.E.(.(.)./.)./.)././.).E.T.E.E.U.R.U.U.I.I.L.K.H.L.H.L.L.H.L.L.S.L.H.J.L.L.L.L.L.I.I.Y.Y.U.T.T.T.T././.).E.(.(.).{.).`.).|.+X).#X+X+X).+X{.).).E.(.).E.R.E.E.U.E.L.J.J.J.J.J.J.J.J.J.W.J.J.J.J.J.J.E.E.E.J.E.E.E.&XE.&X&X&X&X&XE.E.E.E.E.E.&X&XE.E.E.E.E.E.E.E.E.&X&XJ.&XE.E.&X&X&X&X&X&X&X&X&X&X&X&XE.&XE.E.J.E.E.J.J.E.J.E.E.E.&XC.3.*.$.8 8 3 1 1 1 1 X X . . . . X c +X&X&X&X).E.E.E.J.J.J.J.G.G.G.A.A.h.h.j.z.f.f.s.a.a.a.a.i.i.i.i.i.a.i.u.u.u.u.u.u.u.u.t.u.u.u.u.u.i.i.u.i.i.i.a.a.a.k.i./ / ! DXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXAXFXAXZXZXBXQ.} Q ~ [ T.~.T.~.~.T.~.T.[.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.[.T./.~.T.~.~.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.Y.T.Y.T.U.U.P.L.U.P.S.Y.L.D.L.L.L.F.L.H.H.G.H.A.A.A.l.G.W.A.A.A.W.h.A.A.S.A.z.G.G.F.A.A.H.H.D.D.D.S.H.A.l.L.H.H.S.S.H.A.L.D.D.J.D.L.S.U.U.H.D.A.L.L.S.D.Z.J.A.G.A.G.G.G.H.H.H.H.H.L.L.L.L.L.L.L.A.H.L.L.L.L.L.L.S.U.S.U.L.H.L.H.L.S.S.H.H.H.H.H.H.L.S.L.L.L.S.U.L.S.P.U.L.U.L.U.L.L.L.L.L.L.K.R.R.L.U.U.U.U.U.T.T.T.~.T.~.T.T.~.~.~.~.T.~.~.~.T.~.~.~.~.T.T.T.~.~.~.T.~.T.~.T.~.~.~.~.~.~.~.~.T.T.~.T.~.T.Y.Y.T.T.T.T.T.T.T.L.T.T.T.~.T.T.T.~.T.~.~.T.T.T.T.~.T.~.T.T.~.~.T.T.~./././././.~./.~.~.~.",
+"D D D D H Z H Z Z J Z L H H Z H H H H Z L Z H H D L H H I Y I Y ` Y Y ` v.c.v.c.N.n.q.7 8 i l i ] q.` N.N.N.N.n.n.N.v.n.v.v.v.v.n.c.c.c.v.v.v.v.v.v.v.b.v.n.v.v.v.v.v.v.v.v.n.v.c.c.n.v.n.v.v.v.b.c.v.v.b.v.n.v.v.v.v.n.c.N.v.n.v.n.v.v.c.c.c.v.` v.` ` ` ` ` ` ) ` ` ` ` ` ` ` ` v.v.` c.v.v.n.c.N.c.N.n.n.v.N.N.v.N.n.n.N.c.N.c.n.v.v.c.c.c.c.c.b.v.c.v.b.` v.v.b.` b.c.c.b.b.n.W.W.W.J.E.J.J.J.W.J.W.I.J.I.L.E.W.J.I.J.E.L.J.J.J.J.J.H.H.S.W.G.S.Z.G.G.G.S.G.H.H.J.J.J.J.I.I.U.E.R.E.T.E.E.E.E.E.(.E./.).(.(.).T.T./.~.T.E.T.U.U.I.I.U.U.U.I.I.U.I.I.U.T.T.E.T.E.E././.~.E.E.E./.E./.T.E.R.R.T.T.R.R.U.U.L.L.L.L.H.L.L.L.L.H.K.L.S.L.H.L.H.K.L.L.J.L.L.L.L.L.U.R.T.R.T.E.R./.(.).E.).)._.).).).{.).).)./.).(.).).E.(.E.E.R.E.I.I.I.J.J.J.W.W.J.G.G.G.G.G.G.J.J.J.J.W.J.U.J.J.J.E.J.E.E.J.J.E.E.E.E.E.E.E.E.E.E.E.E.&XE.E.E.J.E.E.J.E.J.J.E.J.E.E.J.E.J.&XJ.&XE.E.E.&XJ.E.J.J.J.J.E.J.J.E.J.J.J.E.J.&XE.E.q.$.8 6 < < 1 X X . . . . . 9 q.&X+X).).+XE.E.E.E.W.J.J.W.G.G.G.h.h.l.z.z.z.f.z.a.f.d.a.a.a.a.i.i.a.a.u.i.i.u.u.u.u.u.u.u.u.t.u.u.u.u.u.u.i.i.i.i.a.i.z.i.k.S ! / BXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXAXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXGXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXAXFXVXBXm.[ S Q ` ~.T.~.T.T.~.T.~.T.T.T.T.T.T.T.T.T.T.[.T.T.T.T.[.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.Y.P.P.P.U.S.U.A.Z.D.P.A.S.L.H.H.H.A.H.H.G.A.A.h.h.A.A.G.A.A.A.Z.A.A.G.z.h.G.A.G.A.A.D.D.S.S.D.H.H.S.H.H.L.H.S.L.G.L.G.G.G.D.D.L.S.H.L.L.S.H.A.P.Z.K.S.H.G.A.G.H.H.H.H.H.H.L.L.U.S.L.L.L.P.P.L.F.S.L.L.S.L.L.L.L.L.S.L.G.D.L.H.H.H.H.H.L.H.H.S.L.S.L.L.L.L.P.P.A.U.L.L.L.U.L.L.K.U.L.L.L.L.Y.U.U.R.U.T.T.T.T.Y.~.T.~.~.T.~.~.~.~.~.~.~.T.~.~.T.~.~.~.~.T.~.~.~.~.~.T.T.~.T.~.~.~.U.~.T.~.T.~.T.T.T.T.T.T.I.!.T.~.T.T.~.T.~.T.T.T.~.T.T.~.T.T.T.~.T.~.~.T.T.~.~.T.~.~.~.^./.~.~./.~.[./.~./.~.",
+"D D D Z Z D D Z H H Z Z H H H H H H D H H H H Z F G H L K U U Y Y ` ` v.` v.v.v.v.n.n.N.c.N.N.N.N.N.N.N.n.N.c.N.n.v.c.N.c.v.c.v.v.c.` b.v.v.v.` Y v.c.c.v.b.v.v.v.v.v.v.v.v.b.v.c.v.c.v.v.c.v.v.v.v.v.v.v.b.c.v.v.v.v.v.b.v.c.c.c.c.c.n.c.c.c.` ` ` ` ` ` ` ` _ ` ) ` ` I ` ` ` ` ` ` ` c.b.v.v.c.c.c.N.c.N.N.c.v.N.N.c.n.c.c.c.c.c.c.c.` c.` c.` v.` ` ` ` v.` [ ` ` c.` b.b.b.W.W.J.G.J.J.G.W.J.W.J.G.J.J.J.J.W.J.J.I.H.J.J.H.J.J.H.H.S.H.S.A.G.Z.G.A.W.A.S.G.S.J.H.H.I.H.I.J.I.I.U.U.R.E.E.E.E.~.E./.E.E./.E.E.E.E.T.R.T.R.E.Y.I.I.I.U.U.L.U.I.I.U.I.Y.R.T.R.T.E.R./.E.~./.E.E.E.~.T.E.E.R.T.T.E.T.U.U.I.I.L.K.L.H.H.J.L.S.L.S.D.L.H.L.S.H.F.S.L.L.L.L.L.L.K.U.U.I.U.U.E.R.E.E.~.E.E.E.E.(.E.E.).(.(.)././.E./.).E.U.E.I.R.I.J.J.W.J.S.S.A.W.G.G.h.W.A.W.h.W.W.G.W.W.J.W.W.W.J.J.W.J.J.E.J.E.J.J.E.E.E.J.E.E.J.E.J.J.E.J.W.E.W.J.J.J.J.J.J.&XJ.J.J.J.J.E.J.E.J.&XJ.J.&XJ.J.J.J.J.J.J.J.J.J.J.J.J.J.E.E.E.E.&XW.v.q.i 7 w 4 w 4 i v.!.%X).&X+X&XE.).E.E.E.J.J.J.J.W.G.l.G.A.h.h.z.z.h.z.z.a.a.x.a.a.a.a.a.a.a.u.a.i.u.i.u.u.u.p.t.p.u.u.u.u.u.u.u.i.u.i.i.a.a.a.k.z.a.P ! ! CXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXAXFXFXZXDXBXpX{ ! ! [ ~.~.T.T.T.~.T.~.T.T.T.T.T.T.T.T.T.U.T.T.T.T.T.T.T.T.T.[.~.T.~.T.T.T.T.T.T.T.T.T.Y.T.T.U.T.T.T.T.T.T.U.U.P.L.D.P.D.H.U.L.L.L.S.S.H.H.H.G.A.A.A.S.A.A.A.G.W.A.A.A.G.A.Z.H.G.G.z.A.A.S.S.A.S.G.G.G.H.S.S.S.S.H.L.S.S.L.S.H.S.P.D.D.U.L.S.S.L.L.U.S.T.S.H.G.L.L.D.G.D.S.D.A.H.S.L.L.L.L.A.L.L.L.S.L.A.L.D.L.S.Y.L.U.L.U.L.A.S.L.S.A.L.S.U.S.L.D.L.L.L.Z.U.L.U.L.L.S.L.P.L.P.L.Y.P.U.U.Y.U.L.L.L.I.U.U.U.U.U.U.[.T.~.~.~./.T./.T.~.~.~.~.~.~.~.T.~.~.~.~.T.T.~.~.T.~.~.~.T.~.T.~.T.^.~.~.~.T.T.T.T.T.T.T.I.Y.Y.Y.T.T.T.T.T.~.T.T.R.R.T.~.T.T.~.T.R.~.U.~.~.~.P.T.~.T.T.~.T.~.~.~.~././.~.~./.~.~.~.~.",
+"Z D D Z H Z D D L Z Z H Z H D D H Z H H D Z H H D H H L K Y I P I ` Y ` Y ` ` v.v.v.c.N.N.c.n.N.n.N.v.c.n.v.v.b.v.v.c.c.v.b.c.v.v.` v.v.v.b.Y v.v.v.Y v.v.` v.v.v.v.` b.b.` v.` v.` b.v.v.` ` v.` b.` b.` ` v.v.b.v.b.c.c.v.c.c.c.c.c.c.v.` c.` ` ` ` ` ` I ` Y Y ) I ` ` I I ` _ ` ` ` ` v.` ` c.c.c.c.c.c.c.v.c.v.c.c.c.c.c.c.` c.c.v.` ` b.` ` ` [ ` ` ` ` ` ` ` ` ` ` Y v.b.Z.A.A.W.G.W.W.W.W.W.J.G.H.J.J.H.W.K.J.J.J.J.J.H.H.H.H.H.W.A.G.S.S.G.W.A.A.A.W.G.G.H.H.J.J.J.J.L.I.I.I.E.U.U.R.U.E.T.T.E.~.E.E.T.~.T.T.E.E.Y.Y.Y.Y.U.I.U.U.L.L.L.L.J.U.I.I.I.R.T.T.T.R.E.T.~.T.Y.T.T.T.~.T.R.R.I.U.U.U.U.U.U.U.J.L.J.L.L.L.L.L.H.S.L.H.H.H.S.L.S.S.L.H.H.H.L.H.L.J.J.I.U.I.I.I.R.T.T.E.T.E.~./.E.T.E.E.E.E.E.).E.R.E.E.I.I.I.H.J.H.H.G.J.G.W.W.G.A.h.W.G.A.A.G.G.A.x.G.G.W.x.G.W.J.J.W.W.W.W.J.W.E.J.W.J.J.J.J.W.J.W.E.J.J.J.J.J.W.J.J.W.J.J.W.W.J.x.&XJ.J.J.J.J.W.W.J.J.W.J.W.W.J.J.x.J.J.J.G.W.J.J.J.J.W.E.E.E.E.E.&X&X&X&X&X&X&X&X&X&X).).E.[.E.E.E.E.J.J.J.W.G.G.G.A.h.z.l.l.z.h.f.z.f.f.f.f.a.a.a.d.a.a.a.u.a.i.i.i.i.u.i.u.p.u.u.u.u.u.u.u.u.i.u.i.i.i.a.a.a.a.a.a.~ ! / HXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXAXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXAXFXAXFXZXBXQ.[ ! / ` T.~.~.~.~.T.~.T.T.T.U.XXT.T.T.T.T.U.U.[.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.Y.U.Y.Y.T.T.T.U.T.T.T.T.U.T.U.L.L.P.S.P.H.A.L.L.S.L.L.H.H.S.A.H.G.A.A.A.G.G.h.A.A.A.A.z.G.A.A.G.G.A.G.S.H.A.D.S.Z.A.A.G.D.G.D.A.H.G.G.H.H.H.H.L.A.G.H.D.H.H.U.S.L.L.H.H.P.S.S.H.A.H.G.H.S.D.U.L.L.L.S.L.L.P.L.L.L.L.L.P.L.L.L.L.L.L.A.L.D.P.U.L.H.U.L.S.L.S.L.F.L.S.L.L.L.L.L.L.L.L.L.L.D.U.L.L.P.P.P.U.L.L.U.I.I.U.U.U.U.U.~.T.T.T.T.~.T.T.T./.T.T./.~.~.(.~.~.~.~.~.T.~./.[.T.~.~.T.~.T.~.T.T.R.^.~.~.T.~.T.~.T.~.~.~.I.~.Y.Y.T.Y.~.~.T.T.T.T.T.~.~.~.T.~.T.T.~.R.~.T.~.U.U.T.~.~.~.~.~.[.T.~.~././.~././.~.~.^.~.~.",
+"D D Z Z Z D Z D Z H Z L G D D D Z D H Z Z H Z D D D L L G K K Y Y I ` Y ` b.v.v.c.b.v.c.c.c.n.c.v.v.c.n.c.v.v.c.b.` ` v.v.` v.` ` ` v.` ` v.` ` ` ` ` v.Y ` v.` v.v.` v.v.` v.v.` ` v.` v.` ` b.v.` ` ` ` v.v.` v.` v.v.` ` v.b.` b.` ` c.` ` ` ` ` ` I I I Y ] ` I ` I I ` Y ` ` ` ` ` ` ` ` c.c.` c.c.c.c.c.c.c.c.c.c.c.c.[ c.c.c.` b.` ` ` ` ` ` ` ` ) ` ` ` ` ` ` ` Y ` [ b.h.W.G.W.A.W.A.G.G.A.G.H.W.G.G.J.H.G.W.G.W.G.G.G.W.G.G.G.G.G.S.G.G.A.G.l.A.G.G.S.S.S.H.H.H.H.H.L.H.L.U.L.E.U.I.I.T.R.E.E.T.E.T.E.T.T.R.R.T.E.I.U.U.I.U.U.U.U.L.Y.U.U.U.I.I.T.U.R.T.~./.U.R.R.R.E.R.E.R.T.T.T.T.U.U.U.U.L.U.H.L.L.L.L.H.J.H.H.L.H.H.H.H.H.S.L.H.H.S.H.H.H.J.H.H.J.L.H.L.U.J.U.I.U.T.U.R.E.E.R.T.E.E.E.E.E.T.I.E.I.R.J.E.I.J.J.J.J.H.G.G.A.A.G.A.A.h.G.G.h.h.G.h.h.W.G.h.W.G.G.W.G.x.W.G.x.x.W.W.G.W.W.W.x.W.J.W.W.W.W.G.W.J.J.G.G.G.J.G.J.J.W.J.W.W.W.W.W.W.W.x.J.W.G.W.W.x.W.W.W.x.J.W.W.W.W.W.W.J.W.J.J.W.E.J.E.E.E.E.E.E.&X&X&X&X).&X).&XE.E.).E.E.E.J.J.J.W.W.J.W.G.G.G.A.l.h.h.z.f.f.f.z.g.a.a.a.a.a.a.a.a.a.a.i.i.i.a.a.u.u.u.u.u.u.u.u.u.u.u.u.i.u.i.i.i.a.i.a.a.a.~ ! Q CXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXSXDXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXFXMXm.[ ! ! _ ~.T.~.~.T.~.~.T.T.T.T.U.T.T.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.T.U.T.T.Y.T.T.T.T.T.T.U.Y.U.P.P.L.L.L.L.L.P.L.L.L.S.U.H.H.H.S.A.A.A.A.A.A.A.G.A.h.A.A.h.S.A.A.A.A.D.z.j.g.j.Z.A.A.A.A.l.A.D.G.G.G.H.S.G.H.D.G.G.H.H.H.S.H.H.H.L.S.L.S.U.L.S.D.S.G.F.H.H.L.A.S.S.D.L.S.L.L.P.P.L.L.S.L.L.L.L.L.L.L.U.S.L.U.L.D.L.L.L.S.L.P.U.L.L.L.L.L.L.L.L.L.L.L.L.L.U.P.L.L.P.P.P.P.Y.T.T.Y.T.U.U.U.U.T.T.T.T.~.~.~.~.T.~.^./.T./.T././.~.~.~.~.~.~.~.~.T.T.XX~.~.~.~.~.T.~.T.~.~.T.~.~.T.~.T.T.T.T.~.I.T.~.Y.~.T.~.T.~.XXE.T.~./.R.T.~.T.~.~.~.T.R.~.T.~.~.~.T.T.~.~.T.~.~.~.~./.~././.~././.~.~.(.",
+"Z D Z Z D Z D Z Z Z H Z H D Z Z D D D D H D D Z D H F H L L U L I I Y I ` Y ` ` ` v.v.` v.c.v.c.n.c.c.c.b.c.v.c.v.v.` b.` ` ` Y ` ` ` Y ` ` Y ` ` Y ` Y ` ` ` ` Y ` ` Y ` ` Y ` ` ` ` ` Y ` ` ` ` ` ` Y ` ` ` ` Y v.` ` ` v.` ` v.` ` ` ` ` ` ` ] ` Y ` I ` ) I ) I I I I I ) ) ` I ` ` ` ` ` ` [ ` ` ` c.[ c.v.c.` c.[ c.c.v.` ` ` ` ` ` c.` ` Y ` ` ) ` ` Y ` Y ` ) Y ` ` T b.e.J.A.A.A.A.A.G.A.W.A.G.A.W.S.S.G.W.H.G.W.S.S.G.H.Z.G.G.G.A.A.A.A.G.A.G.A.A.A.G.S.S.A.G.H.H.J.H.J.H.J.J.J.I.I.I.U.T.U.U.T.R.R.R.T.T.R.R.Y.R.U.R.I.U.U.U.Y.U.U.U.I.U.Y.U.T.U.T.R.R.R.R.R.R.T.T.T.R.U.T.I.U.U.Y.U.U.U.U.L.L.L.L.H.L.H.L.H.H.L.S.L.H.S.L.H.H.H.S.K.S.H.H.S.H.L.H.H.H.L.L.H.L.L.J.L.U.L.I.U.U.U.U.U.I.I.U.I.U.I.I.I.U.I.G.J.J.G.H.G.H.G.G.A.A.A.h.A.A.h.h.h.G.h.h.A.h.h.h.h.h.x.A.x.G.h.G.W.W.G.x.W.W.x.W.G.G.W.x.G.x.G.G.W.G.x.W.W.J.x.G.h.x.W.x.h.x.J.J.W.x.W.x.J.W.W.x.W.x.W.x.W.J.x.G.G.G.G.x.W.G.W.W.W.W.J.J.J.J.E.E.E.E.E.E.&XE.E.E.E.E.E.E.E.E.E.J.E.W.J.G.G.A.x.l.l.l.z.h.h.j.j.f.f.z.a.z.a.a.a.z.a.a.a.a.z.i.a.a.a.i.u.u.u.u.u.u.u.u.u.u.u.u.i.u.i.i.a.a.a.f.a.a.k./ ! Q ZXVXFXFXFXFXFXFXFXDXFXFXFXFXFXAXDXAXDXDXDXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXBXm.} ! S [ T.[.T.T.~.T.T.~.T.T.T.XXT.T.U.T.T.T.T.T.T.T.[.P.T.T.T.T.T.T.T.T.U.T.U.T.T.L.U.T.P.T.T.I.T.L.U.U.T.U.P.P.L.L.L.D.D.L.L.D.S.U.S.H.S.U.S.H.H.G.A.A.A.A.A.g.A.A.A.h.z.G.S.A.z.A.A.H.A.A.H.A.A.A.G.A.D.A.S.G.H.H.D.S.S.S.G.D.H.D.L.G.L.H.H.L.L.L.U.S.L.D.U.L.S.G.G.G.D.A.L.D.P.U.U.U.L.L.L.P.F.L.L.L.L.L.P.A.S.L.L.L.L.S.L.L.L.L.L.L.L.A.L.L.U.S.S.L.L.L.L.S.L.L.L.L.P.P.P.Y.P.T.T.T.T.T.U.T.T.Y.Y.U.T.T.T.T.T.T.T.~.!.T.!.^././././.~./././.~.~.~.~.T.~.E.XXXX~.~.T.~.~.~.T.~.T.T.~.T.~.T.T.T.T.~.T.U.~.T.Y.~.T.T.T.T.T.T.XXT.~.T.T.~.T.~.T.~.T.(.R.~.~.~.T.~.~.~.~.~.~.~.~.~.~./.~.~./.[./.~.(.(.~.",
+"Z Z Z Z Z F Z G Z Z D D Z D D D Z D Z H D D Z Z D A Z H H J L U L Y I I ` I ` ` ` v.` v.` b.` v.v.v.` b.v.v.` [ v.` ` ` ` ` ` ` Y ` ` Y Y ` I ` Y ` Y ` ` Y ] ` ` ` ` ` ` ` Y ` Y ` ` ` ` ` ` ` ] ` Y ` Y ` ` ` ` ` ` ` ` ` ` ` ` ` ` ) ` ` ` Y _ ` I I ) I I ` I ` I I I ) I ) I ) ` ) ` ` ` ` ` ` ` ` ` v.` ` c.` ` ` v.` ` ` ` ` ` ` ` _ ) ` ` ` ) ` I Y ` ) ) Y ` [ ) ) [ j.Z.A.A.A.A.A.l.A.A.G.h.G.A.A.W.G.W.G.W.H.G.G.W.G.G.A.G.S.G.A.G.A.A.S.A.A.A.S.A.A.A.S.G.S.S.S.W.W.H.H.J.H.L.L.L.U.U.U.U.T.R.R.R.R.T.E.R.U.R.R.R.T.U.T.I.T.Y.L.T.U.U.L.U.U.U.I.U.T.T.T.T.U.T.U.R.I.U.T.I.I.P.U.P.L.L.I.U.L.L.L.L.J.K.H.L.J.S.H.H.H.S.L.H.H.J.S.H.S.H.H.H.H.S.W.H.H.H.H.H.H.L.H.H.L.L.G.U.L.U.U.U.I.U.J.I.U.U.J.L.J.J.J.W.G.G.G.G.D.G.A.A.A.h.A.A.A.A.h.A.l.l.l.l.h.l.l.z.l.A.h.G.h.A.x.G.G.A.h.h.G.h.G.x.W.h.W.G.G.h.W.x.A.W.h.x.A.x.W.A.x.h.W.A.A.W.x.W.x.h.h.W.x.x.W.h.W.x.h.x.W.W.x.h.W.x.G.G.G.x.G.W.G.G.W.J.W.J.J.E.J.E.E.E.E.E.E.E.E.E.E.E.E.J.J.J.J.W.x.W.W.G.G.h.z.l.h.z.h.f.f.f.j.f.f.f.f.a.k.a.a.k.a.a.u.i.a.i.a.a.i.i.i.u.u.u.i.u.u.u.u.u.u.a.a.i.a.a.a.a.a.a.a.P / / ZXAXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXDXDXAXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXGXSXDXFXFXFXFXFXFXFXFXFXFXAXDXGXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXZXFXBXQ.} ~ Q ` ~.~.~.~.T.T.T.T.T.T.T.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.Y.Y.U.T.T.U.U.P.T.Y.Y.P.Y.Y.P.P.U.L.L.P.L.D.U.S.L.L.L.L.Z.Z.H.H.S.S.S.S.S.A.A.A.A.h.A.A.A.A.A.A.A.A.H.A.A.A.A.h.A.h.A.h.A.h.A.l.G.G.S.G.G.S.S.S.H.H.G.L.L.D.H.H.H.L.H.L.L.L.L.H.L.U.S.L.H.H.S.H.H.L.L.L.L.L.L.U.U.P.P.L.L.D.U.L.L.U.L.L.L.L.H.L.S.H.S.U.L.L.Y.L.L.L.L.U.L.L.L.L.P.L.L.L.L.L.U.U.L.R.L.U.T.T.T.T.T.Y.T.T.Y.Y.Y.T.T.T.~.T.~.T.~.~.~.~.~.~.~./.~.(.T./.~.(.~./.~.~.~.~.~.~.~.~.~.T.!.~.T.~.T.T.~.~.T.T.T.T.T.~.P.~.~.~.Y.~.I.T.T.~.~.T.~.T.~.T.(.T.~.~.~.T.~.T.~.~.~.T.~.~.~.T.~.~.~.!.~.~.~././.~./././.(././.~.",
+"Z D D Z Z Z Z Z Z Z D D D D D D D D D D Z D D F D D H G H H H U K Y P Y I Y Y ` Y ` ` ` v.` v.v.` v.v.` ` v.` ` Y ` ` Y Y ` Y ` ` Y Y ) ` I ` Y I I Y I ) Y Y Y Y Y I Y I ` Y ` ` Y ` Y I Y Y I ) Y ` I ` ) Y ] Y I ` Y ) ` Y ` ` ` ` ` I ` I ` ` I ` I ) ) I I I I I I I I I I I I I ) I ` ] I ) ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` Y ) I ` Y ) I I _ Y I I ) I ) ) I U [ U T b.h.h.h.l.l.l.A.A.A.h.A.W.A.G.A.A.A.G.h.Z.G.S.A.G.A.A.A.S.A.Z.G.A.A.A.S.A.A.S.G.A.A.S.A.S.G.A.S.H.G.H.H.J.J.L.J.L.J.U.U.U.U.U.U.T.T.T.T.T.R.U.U.U.I.I.U.I.U.R.U.Y.Y.Y.Y.U.R.T.T.R.T.T.T.T.Y.U.R.I.U.U.I.U.L.L.U.L.L.J.L.H.H.L.H.L.L.S.H.L.H.L.H.H.L.S.S.H.S.S.H.H.S.S.H.S.S.H.G.G.H.H.H.J.H.H.H.J.H.J.H.J.J.H.U.G.L.J.J.H.L.J.H.J.S.H.G.S.A.G.A.A.l.A.l.h.h.A.h.h.A.h.l.l.z.h.z.z.g.h.h.h.z.h.h.h.h.h.f.h.h.h.A.h.h.W.h.j.A.h.h.G.h.h.h.G.h.h.h.A.h.h.h.h.x.h.h.h.h.W.h.W.h.W.h.j.h.h.h.h.h.h.W.h.h.h.h.h.h.h.h.G.W.G.W.h.G.W.W.J.E.W.W.E.E.J.J.E.E.E.I.J.J.E.W.J.J.J.W.G.G.W.h.A.h.h.h.h.l.z.f.f.s.z.f.f.f.f.f.a.k.a.a.a.a.a.a.k.i.a.a.a.a.u.i.i.i.u.i.u.u.u.u.a.a.u.u.i.i.a.i.a.a.a.a.a./ S / BXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXDXAXAXDXFXFXFXFXSXGXDXAXFXFXFXFXFXFXFXFXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXDXSXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXDXDXAXDXDXAXDXDXFXFXFXFXFXFXAXFXFXFXGXSXSXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXZXVXBXpX[ Q Q [ ~.T.T.~.T.~.~.T.T.T.T.T.^.T.U.T.T.T.T.T.T.T.T.T.T.T.T.P.T.T.T.P.Y.Y.U.T.L.U.Y.T.P.T.Y.P.P.P.P.L.L.U.U.L.L.L.L.S.L.S.S.L.P.H.U.S.H.H.H.H.S.S.A.A.A.A.A.A.Z.A.A.A.h.A.A.h.A.A.Z.h.A.h.h.Z.Z.A.A.A.S.h.G.S.S.S.S.S.S.S.H.H.D.H.H.H.S.H.L.L.L.H.L.S.L.L.S.L.H.H.H.S.U.H.L.A.S.L.L.L.P.A.P.P.L.U.Y.U.L.L.S.L.L.S.L.L.L.L.U.L.L.L.L.L.S.L.L.L.L.L.L.L.U.U.P.P.P.L.U.U.L.R.Y.U.U.I.T.T.T.T.T.T.T.!.Y.Y.T.T.T.T.~.T.~.~.Y.~.~././.!.)./.T.(.~.~.~./.~.^.~.~./.~.~.~.U.XXT.(.~.T.T.T.T.~.T.Y.~.T.Y.~.Y.~.U.T.Y.Y.~.T.~.T.T.T.~.T.T.~.~.T.~.~.T.XX~.~.~.~.~.Y.~.T.T.~.~.~.~.!.T.~.~.~.~./././././././././.",
+"Z Z Z Z Z Z Z Z Z F D D D D D D Z D F D Z D Z Z D Z Z F F H H K L U P Y I I Y ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` Y ` ` ` ` ` I Y ` Y ) ) Y I Y P Y Y I I I Y I I I K ` Y ` I Y I I Y I Y ` ) ) ) ) ` I ) Y Y ] Y Y ` I ) ` Y ) ` ) ` ) Y ) I ` ` ) ` ) I I I P I I ) I I ) I I ) P I _ ` ) I ` Y ) ) ` ) ` _ ` ` ` ` ) ` ` ` ` ` ) _ ) ) ` ) ` ) I I _ I ) I ) I I I Y I I U U [ j.h.h.A.h.l.A.l.A.A.A.A.A.A.A.A.A.A.A.G.A.S.A.S.Z.H.A.S.A.A.A.A.S.A.S.A.A.A.A.A.A.A.G.S.A.G.G.S.S.H.H.H.H.H.L.H.L.L.L.T.U.U.U.U.T.T.T.T.U.Y.T.T.U.U.Y.T.T.U.T.T.U.U.P.T.T.T.T.Y.R.Y.T.I.R.Y.I.L.U.U.L.L.I.Y.L.L.P.L.U.L.L.L.L.H.L.L.H.H.L.H.D.L.H.S.H.H.S.H.S.H.S.W.S.S.S.J.Z.G.H.H.S.H.A.Z.J.S.H.J.H.H.H.J.H.G.J.H.G.H.H.H.H.H.G.A.H.G.G.l.G.A.l.l.l.A.z.h.A.g.h.h.h.h.h.h.f.h.h.z.g.h.g.z.j.z.h.h.h.h.h.h.h.g.g.x.h.h.h.h.G.h.h.h.h.x.j.z.A.h.h.h.h.h.G.h.h.G.x.h.h.h.h.W.h.j.h.j.h.h.h.h.x.h.h.h.h.h.h.W.h.A.h.h.G.x.W.G.G.G.J.G.W.W.W.J.J.J.J.J.J.J.J.J.J.W.J.J.G.G.W.W.h.A.h.h.h.h.z.h.z.z.h.h.j.f.f.a.g.f.f.k.a.a.a.a.a.a.u.a.a.a.i.u.a.a.u.i.i.u.i.u.a.u.u.u.i.a.a.a.a.a.a.a.a.a.a.! ! ! ZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXDXAXDXDXFXFXFXAXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXAXFXZXZXVXBXQ.' ! ! [ ~.~.~.T.~.~.T.T.T.T.Y.T.P.Y.T.T.T.T.T.Y.T.U.Y.T.T.T.T.U.Y.T.T.Y.U.L.U.Y.U.Y.L.L.P.P.P.P.P.P.Y.U.L.L.L.U.Y.L.L.H.L.L.S.L.L.H.L.S.H.H.H.D.S.G.H.z.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.h.Z.A.A.A.A.A.A.l.A.A.S.A.S.S.S.H.H.H.D.L.G.H.H.L.H.L.L.L.L.L.L.L.L.S.U.S.L.L.S.L.L.L.L.L.L.L.L.P.P.P.P.D.U.L.L.L.U.L.U.D.P.L.L.U.L.U.S.L.L.U.L.U.Y.U.Y.U.U.P.P.U.U.U.U.U.U.L.L.U.U.U.U.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T./.T.~.~.~.~././.~.(.~.(.(.~././.~.^.~.{.~.~.~./.(.XXU.T.T.^.T.~.T.T.T.T.T.~.Y.~.T.~.P.T.T.~.I.I.T.I.Y.T.~.T.~.T.T.~.T.T.~.E.T.~.~.~.T.~.~.~.~.~.T.T.~.~.~.~.!.~.~.~././.~././././.(.~.",
+"Z Z Z Z Z Z Z Z Z Z D D D D Z D D A D D D A Z Z F Z Z H H F G H L L L L Y I I Y Y Y U ` ` Y ` ` ` ` Y ` Y ` ) ` I ` Y I I I I I I I I ) I I I I I J K Y I Y I J K Y K Y I I I Y ` P I I I Y I I I Y I I I I I I Y I I Y ) I Y I Y ) ) ) ` I I I I J I ` I ` I ) I I I I I I I ) I Y I I ) I I ` I ] Y ) ` ) ) ) ) ` ` ) ) ) ) ` ` ) I ` I I ) I I Y I I I P Y I ) U I I I Y d.j.h.h.z.Z.l.l.A.l.h.A.h.A.A.A.A.A.A.A.A.A.A.A.A.A.S.A.A.S.A.S.A.A.A.A.A.A.h.S.Z.A.Z.A.A.S.Z.A.G.G.S.H.H.H.H.H.L.L.L.L.H.U.T.T.T.P.U.U.U.T.T.T.U.T.Y.T.T.T.T.T.T.T.T.T.U.T.T.T.T.T.T.I.U.Y.U.R.Y.U.U.L.U.L.L.L.L.H.L.H.L.H.L.S.L.H.L.D.L.H.L.S.H.D.S.S.S.H.H.H.S.H.S.S.S.S.S.H.H.H.S.G.H.H.H.Z.H.H.S.S.H.G.H.H.H.H.G.S.G.S.G.A.G.A.A.G.l.G.l.g.z.A.A.l.h.h.h.z.A.h.x.A.h.z.z.z.h.f.k.g.g.z.h.z.j.s.h.j.h.s.z.h.g.g.h.h.j.h.x.h.h.h.h.h.h.h.f.z.f.h.j.j.s.j.h.j.z.z.x.s.h.h.s.j.j.x.j.x.h.z.h.h.h.h.h.h.x.j.h.h.z.A.h.h.h.G.G.h.G.G.h.G.G.G.W.J.W.J.J.J.J.J.J.G.W.W.G.W.x.G.G.h.G.G.z.G.h.z.h.f.f.f.z.j.f.f.g.a.f.f.a.a.k.a.a.a.a.a.i.a.i.a.a.a.i.i.i.i.i.u.u.i.a.i.i.i.a.a.a.a.a.a.a.a.a.a.S ! / CXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXAXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXVXBXm.} Q Q [ T.~.~.T.T.T.T.T.T.T.T.Y.U.P.T.T.T.T.T.U.T.Y.P.Y.U.U.T.T.P.T.P.P.Y.Y.U.L.U.L.L.L.S.P.L.K.P.P.L.L.L.U.L.L.L.L.L.S.L.L.L.L.D.U.D.K.U.S.H.A.S.S.A.A.A.h.A.A.A.A.A.A.A.A.A.A.h.h.A.h.h.A.A.h.A.A.h.A.A.A.S.A.A.G.S.S.D.S.H.A.H.H.H.H.H.H.H.H.L.H.L.H.L.L.L.L.U.S.L.L.L.D.L.L.L.L.S.L.L.L.D.P.P.P.L.P.L.S.L.S.U.A.L.L.S.L.L.L.L.L.L.U.U.U.U.L.P.T.U.Y.U.T.U.T.P.Y.Y.L.U.T.U.T.U.U.T.T.T.~.~.T.T.~.T.T.T.T.~.~./.T./.T.~.~././.!./.~.(.(.~.~.(.~.(.~.~.[.~./.~.T.T.E.XXT.T.T.~.T.T.~.T.Y.~.T.T.Y.T.T.~.T.I.Y.~.Y.~.T.~.T.T.~.T.~.T.~.~.T.~.XXXX(.T.~.~.~.T.T.~.~.~.~.(.~.!.~.~.!.~.~.~.~././././.!.(.~.",
+"Z Z D Z Z Z Z Z Z Z D Z D Z D Z D D Z D Z Z Z Z Z Z Z H H H D H L L Y H J Y Y I ) ` I ` ` Y ` ` ` ` ) Y ] ` ` I Y I Y ) I I J I I Y Y J J I K H I I U K Y J U Y I I Y K I U I I I I I I I I I I J I I I J Y I I I I I I U I I ) ) ) ) I ) I ) I I I ) P ) I P I I I ) I P P ) P I I I ) I I ) ) ] I I ` ` ) ) ) ` _ ` I _ ) ) ) I ` I I I ) I ) I ) I I I I I P I U I I ) Y T Z.h.h.h.h.l.A.l.A.A.A.h.A.A.A.A.A.A.A.A.A.A.S.S.A.A.S.A.Z.A.Z.A.A.A.A.A.A.A.A.l.A.A.A.G.A.Z.A.G.S.G.G.H.H.H.H.L.L.L.L.L.U.U.U.U.T.Y.T.R.T.R.T.R.T.Y.Y.T.T.R.T.T.Y.T.T.T.T.T.T.T.~.T.T.T.P.T.U.Y.U.L.U.L.K.L.H.L.H.L.L.L.H.H.H.H.L.L.H.H.H.H.H.H.H.H.H.J.Z.Z.H.S.S.S.H.S.G.Z.G.Z.S.G.G.G.S.S.H.H.A.S.G.S.S.S.G.S.S.A.S.A.S.S.A.A.D.f.Z.h.l.A.g.l.l.z.l.h.g.h.z.h.z.g.z.g.z.z.z.f.h.l.g.f.f.z.f.z.f.f.h.f.f.f.g.g.f.j.j.z.h.h.h.z.f.h.j.f.h.z.h.f.z.j.s.h.h.f.f.f.f.h.f.z.k.h.j.h.h.z.f.z.f.h.z.z.z.x.j.s.A.z.l.h.h.G.h.A.h.A.G.h.G.G.W.h.W.G.W.W.G.J.J.G.W.G.G.W.G.G.G.G.W.h.h.h.h.z.h.z.s.h.f.g.h.a.g.d.g.f.f.a.g.a.a.a.a.a.a.a.a.a.a.i.i.i.i.i.i.i.u.u.i.i.i.i.i.i.a.a.a.a.a.a.a.a.a.a.a.~ S / ZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXSXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXAXDXAXDXAXGXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBXpX[ Q / ` ~.T.~.T.[.T.T.T.T.T.[.U.T.U.T.T.T.T.T.T.P.Y.P.U.P.P.P.Y.T.P.T.P.U.L.Y.U.Y.L.U.D.P.L.L.L.L.D.U.L.L.L.D.L.L.S.U.L.L.L.H.S.L.L.S.L.H.H.H.G.S.h.H.z.A.h.A.A.A.g.A.A.A.A.A.h.A.A.A.A.Z.A.A.A.A.A.A.A.A.A.S.A.A.G.S.G.G.H.H.G.H.H.H.H.H.L.L.L.S.L.L.L.H.L.L.A.L.S.L.L.S.L.S.L.L.L.L.L.L.D.P.P.L.L.P.L.L.L.L.L.L.U.L.L.U.L.L.L.U.L.L.U.U.U.T.P.Y.T.T.T.T.T.P.T.T.T.P.P.Y.P.T.Y.T.T.T.T.~.U.~.T.~.~.T.T.~.T.~.~.~.~.~./.T.~.~.(././.(.~.XX(.~.(./././.(././././.~.~.T.~.T.T.~.T.~.T.T.T.T.~.T.Y.Y.T.T.T.~.~.I.T.~.Y.I.~.~.T.~.T.~.T.Y.~.T.T.(.E.E.~.~.~.~.T.T.(.~.).T.E.~.!.~.~.~./.!.~././././.(.(.~.(.",
+"Z Z G B Z Z C Z Z Z Z D G C Z D D D Z Z Z Z Z C Z C H Z Z H H D L H H K L J J J P U I Y ) ) ) ) Y I ) Y I Y I Y I I P I I I Y I I J I U U J Y J L L L L Y L I J J U L L P L I H Y I J Y I I Y K Y I Y K I I U P J J P Y P P I I I I I ) ) I I I ) I P ) ) I ) P I I I I ) J P ) J ] K I I ) I I I ) ) ) I P ` ) I I ) I ) ) I ) I I I I ) I I P I I I I P P I I I I I I U T [ d.h.g.g.h.A.g.l.l.h.l.h.A.h.h.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.S.A.A.A.A.A.G.A.A.A.A.A.A.G.S.A.S.S.G.H.H.H.H.L.L.U.U.U.U.T.Y.P.Y.Y.T.T.R.T.T.T.T.R.T.~.T.Y.~.Y.T.T.T.~.T.~.T.T.T.Y.P.T.Y.P.U.Y.F.U.L.U.L.L.L.L.H.H.L.L.L.L.L.H.H.L.H.D.H.S.H.H.A.H.A.H.H.S.S.W.S.H.S.S.J.S.G.G.S.Z.G.S.Z.S.A.S.G.A.S.S.A.A.A.A.A.A.A.A.A.A.f.S.G.h.h.z.g.z.g.l.h.g.z.h.g.h.g.z.z.g.g.g.f.h.z.a.a.g.k.g.f.f.f.f.s.h.f.f.g.f.f.g.z.j.f.z.z.f.l.z.f.j.h.f.s.z.k.g.s.z.f.f.z.z.f.f.f.z.f.s.x.s.h.s.f.f.z.j.s.h.s.f.h.j.z.h.h.f.h.f.x.h.h.s.G.h.G.h.h.h.h.G.W.x.G.W.G.G.G.W.G.A.h.A.G.h.h.A.h.h.h.h.z.j.z.h.f.f.f.f.g.g.a.a.g.a.a.g.z.a.k.a.a.a.a.a.i.i.a.i.i.a.a.a.i.i.a.a.i.i.i.a.a.a.a.a.a.a.d.a.a.a.a.a./ ~ / ZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXGXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXSXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXVXFXDXBXQ.[ Q Q [ ~.~.T.^.T.T.T.T.T.T.Y.Y.T.T.T.T.T.U.T.P.Y.P.Y.P.P.Y.P.P.P.P.P.P.L.U.U.U.L.U.U.P.U.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.H.L.L.L.L.L.L.H.L.S.G.S.G.H.A.A.A.A.A.A.g.Z.A.A.A.A.A.Z.A.h.Z.h.A.A.A.h.A.h.h.A.A.A.S.l.S.S.S.D.G.A.D.H.H.H.H.H.L.H.L.L.L.L.S.L.L.L.L.L.L.L.S.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.S.L.L.H.L.L.S.L.S.S.L.L.L.L.Y.L.U.U.T.P.T.T.T.T.T.T.T.T.P.T.P.T.P.Y.U.U.T.I.T.T.T.U.~.T.~.T.T.T.~.T.~.~.T.~.~.~.R.~.~.~././.!.~./.(.~././.^.[.~.^./.^./.!.~.~.~.~.~.T.T.~.T.~.T.T.T.Y.T.T.Y.~.~.T.~.U.T.K.Y.Y.~.I.~.T.T.T.~.~.(.T.{.T.~.~.XX).T.T.~.~.~.T.~.XXT.[.~.~.~.!.~.~.~.~./.~././.~.(.(.(.",
+"Z Z B Z B Z Z C Z F Z Z D H Z Z Z Z Z Z Z Z Z Z C C Z Z Z H D D D D L H H G J Y P L J I I Y Y I ` I I ) I Y I P I K L Y I P U J J J J L J L U H L L L J H H H J Y L L U Y K J I H H P L P J K U J I I U P I P I P I K J P P I I I I I I I I I ) I I ) P J ) P P ) J J I P I ) J ) ) P ) ) I ] I ) I ) I ) I I ) ) ) I ) I ) ) ) I I I ) I P I I I P I I I P P P I I I I [ T Z.d.g.g.l.h.g.A.A.g.h.A.h.A.h.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.h.A.A.D.A.A.A.A.G.S.S.S.S.G.W.H.H.H.L.L.L.L.U.U.P.Y.T.T.R.R.T.T.T.T.T.T.T./.~.T.T.T.Y.~.~.T.~.Y.T.T.T.T.T.T.T.T.P.T.U.P.U.U.U.L.Y.L.L.L.L.H.H.H.L.H.H.H.H.H.L.S.H.H.H.A.H.H.S.H.H.H.G.H.A.H.H.S.A.S.S.G.A.G.Z.A.S.A.A.S.A.A.l.S.A.A.A.h.A.A.A.l.A.h.A.z.z.h.h.g.g.d.g.g.g.z.g.g.k.z.h.z.g.g.g.g.a.z.g.g.z.f.g.a.f.f.f.f.s.z.f.f.f.f.f.f.z.f.h.f.f.f.z.f.h.z.s.z.G.f.f.f.f.s.f.f.a.a.f.f.f.k.f.k.z.s.j.f.f.f.f.z.l.f.j.h.f.z.j.j.z.h.h.k.h.j.h.h.h.h.h.h.h.G.h.G.h.G.G.h.G.W.A.A.G.G.G.G.h.A.h.h.G.h.x.h.j.z.j.z.g.f.z.d.g.j.g.g.g.g.a.g.a.a.a.a.z.a.a.a.u.i.i.i.a.a.a.a.d.i.a.a.i.a.a.a.i.a.a.i.d.a.a.d.a.a.a.a.! ! ! BXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXBXm.} ~ Q [ ~.T.~.~.~.P.Y.!.T.P.Y.T.T.T.T.T.P.T.P.T.P.P.P.P.P.P.P.P.P.Y.P.P.Y.L.Y.L.U.U.L.L.U.S.S.L.L.L.L.L.L.L.S.L.U.A.G.L.L.L.L.H.A.U.L.S.H.H.G.G.S.S.A.G.A.A.A.A.A.A.G.A.g.h.A.A.j.h.A.A.A.h.h.A.h.A.A.W.A.A.G.A.S.S.A.S.S.S.G.D.H.H.H.G.S.H.L.S.L.S.G.L.G.L.L.L.U.L.L.L.L.L.G.L.S.L.L.P.L.L.L.P.L.L.L.L.L.A.U.L.L.L.L.L.L.L.L.L.L.L.U.T.T.T.T.T.T.Y.U.Y.T.T.T.Y.P.T.T.P.T.U.U.U.I.I.L.Y.~.Y.T.T.T.T.T.~.T.T.~.T.~.T.~.~.R.T.Y.(.~.~././.~.~././.E.^./.{.~./././.~.T.~.~.!.T.T.~.~.T.~.T.Y.T.Y.T.Y.T.T.~.U.L.~.~.L.Y.R.Y.T.T.T.~.T.~.~.~.[.XX~.~.~.~.~.~.~.T.~.~.T.(.~.~.~.~./.~./.!.~././././././.(.(.(.",
+"F Z D D D Z F Z Z Z D C B Z Z Z Z Z Z Z Z F A C Z Z A Z F Z Z F D L F L H K H U U K Y I I P ) I I J I Y I I I K I Y P P L L J U J U L L J J L L L L L F H H H J H L J J J H J H J J L L P J J J J U L L L P P J J L I J P I P P I P I I I I I I I I P I I P P ) I ) I I ) ) J ) J I I ) P I I I P ) I ) ) I ) I I I ) I P ) P I I I I I I I I I P I P I P I I I U I I I [ T j.g.g.A.l.g.g.A.g.g.A.h.A.h.A.A.A.h.S.h.A.A.A.A.A.A.A.A.A.A.S.G.A.A.A.A.A.A.A.A.A.A.A.A.S.A.A.G.A.G.S.G.Z.H.H.L.J.L.L.L.U.P.T.U.T.T.T.R.T.~.~.~.~.T.T.T./.T./.!.T.~.Y.~.T.~.~.T.~.T.R.~.T.T.T.T.P.T.T.U.L.U.L.L.L.L.H.Y.L.S.L.L.H.L.H.H.H.H.H.S.H.G.S.H.H.A.H.H.H.A.H.H.A.H.H.A.G.A.S.G.A.G.A.A.D.h.A.A.S.A.l.A.A.A.l.A.l.A.A.A.h.h.h.h.g.h.g.l.g.g.g.g.g.g.l.g.z.a.z.f.z.g.z.f.g.a.f.f.f.k.s.f.j.f.h.z.f.f.f.f.f.z.s.j.f.h.f.l.g.h.f.f.h.f.f.f.f.k.k.f.f.f.f.s.f.f.f.s.f.f.f.f.h.s.z.f.s.f.f.f.z.s.f.f.f.f.f.k.f.f.h.h.j.h.z.s.h.l.h.h.h.h.h.h.h.G.l.h.l.l.z.h.z.h.h.h.G.z.h.h.A.j.z.f.z.j.f.g.a.g.f.a.a.g.a.f.a.a.a.z.a.a.a.a.u.z.u.i.i.i.u.i.a.a.d.i.a.a.a.a.a.a.i.a.a.a.a.a.a.i.a.a.i.d.S ! / ZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXBXm.[ ! Q ` T.~.~.T.Y.~.P.[.T.[.T.T.T.T.T.T.T.T.P.P.P.P.P.Y.P.P.P.P.P.P.P.P.U.L.L.L.L.L.L.L.L.L.L.L.L.L.A.L.L.L.L.L.L.L.G.L.L.H.L.H.F.L.L.S.L.H.G.G.S.S.H.g.A.A.A.A.A.A.h.h.Z.j.A.A.A.A.A.h.A.Z.A.h.Z.h.A.h.A.l.A.A.A.S.A.S.S.S.S.D.H.H.S.L.L.S.L.L.L.L.L.L.L.L.L.L.A.L.H.H.L.L.L.L.U.L.L.A.L.U.P.L.L.L.L.L.L.U.L.L.L.L.L.H.L.L.L.L.L.L.U.U.Y.U.T.Y.Y.T.P.T.T.T.T.T.Y.T.T.T.U.T.U.Y.Y.R.R.Y.~.U.T.T.~.~.T.T.~.T.~./.T.~.~.~.~./.R./.~./.!.^./././.(.(.(././.!././././.(.~.~.~.T.~.T.~.T.T.T.~.T.T.T.T.T.T.T.~.Y.Y.R.~.Y.T.!.T.~.~.T.~.~.~.T.U.~.~.~.T.(.T.~.~.~.(.~.~.~.~.T.[.!.~.~.~.~.[./.~.~./.[.(./.(.(.",
+"Z Z Z Z Z Z Z Z Z Z Z Z Z C Z C Z Z Z Z C D Z C Z A F Z C Z D D F Z H D Z H H L L L L P P L I P I I U P I L J J P J L J L P L L J I J H H H J H H H H H H K H H H K H D L H L J J L L J J J L J P J L J J P J I J I J J P P J P J ) J I J ) ) ) ( P P ) I I I ) J ) P I I ) J ) P ) I J P P P ) P P ) P ) ) ) J I I ) ) I I P I I I P ) I I I P ) I P P P P ( I I I ) I T d.Z.g.A.g.g.g.A.g.g.A.h.A.A.l.A.A.A.D.g.A.A.A.D.D.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.S.G.G.S.S.H.H.S.S.L.L.P.P.P.P.P.T.T.Y.T.T.~.T.T.~.~.T.T.~.~.~.~.~.~.~.~.K.!./.~.T.~.~.~.T.~.T.T.T.L.T.T.P.P.Y.Y.L.L.L.L.H.L.S.L.H.H.H.H.H.D.H.D.D.L.S.S.H.S.S.H.S.H.H.H.G.S.H.H.H.A.G.W.A.A.S.A.A.A.A.A.A.A.A.A.z.A.A.z.g.g.A.k.R D.l.k.g.g.k.g.g.k.k.f.g.g.h.k.z.g.l.z.g.f.k.g.g.g.f.f.f.a.g.f.f.g.g.g.d.k.f.d.g.i.k.z.d.g.k.z.d.g.z.z.g.k.k.k.g.f.k.f.f.a.f.i.a.a.a.a.a.a.f.a.g.a.a.k.a.f.a.f.f.k.f.f.k.f.f.g.f.l.j.z.f.f.f.f.G.l.h.h.f.h.l.z.h.A.A.A.h.h.A.l.l.l.h.h.z.j.l.l.j.x.j.h.h.f.z.d.z.g.k.k.k.g.d.k.f.f.f.k.f.d.i.k.i.z.i.i.i.i.i.i.i.a.a.a.i.a.a.a.a.a.a.a.a.k.i.i.d.i.a.a.a.a.a./ ! ! BXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXZXZXBXQ.} ~ Q [ !.~.T.~.T.T.T.T.~.Y.Y.Y.T.T.T.T.T.P.P.P.P.P.U.P.L.L.L.L.L.Y.U.U.L.L.U.L.L.L.L.L.L.L.L.U.S.L.L.L.G.L.H.L.U.L.L.L.S.U.H.L.H.L.Y.S.H.S.L.S.S.S.S.A.S.A.z.A.A.A.j.j.l.A.h.S.A.h.A.l.A.l.h.h.S.g.h.A.A.A.A.A.A.A.G.A.A.G.H.A.S.S.H.H.G.H.H.H.S.L.L.H.L.L.L.S.L.L.L.L.P.U.L.L.G.L.L.L.L.L.L.L.U.L.K.Y.L.D.U.K.L.L.L.L.L.L.L.L.Y.U.L.Y.U.T.U.I.T.T.T.T.T.T.T.T.T.P.T.T.T.U.U.Y.Y.Y.Y.Y.T.T.T.T.T.~.~.T.~.~.~.~.T.^.~.~.~.~.~.~.~.~.~.~.[.~.[.!.~.~.^.~.(.~./.~./.~.~.~.T.~.T.~.T.T.~.T.Y.T.T.P.T.T.[.P.U.XXT.T.T.T.T.T.T.T.T.T.T.~.~.~.).~.~.~.~.~.~.~.!.~.~./.!.~./.~.~.^.~.~.~./././.!./.^.(.(.(.(.{.",
+"Z Z C Z A D B C A C Z D Z Z Z Z B Z C F Z Z C Z D B C Z Z Z Z Z F G D D D H F J L H L L J L L J L I L L I J L L P L L J L J J J H H H H H H H H H H H Z H Z H H D H H H H J H H H J J L L J L J J L Y H P P J P L L J J P L P I I J I I P I J J I ) P P P ) I I I I ) P P I I I ) P ) ) ) ) ) ) ) ) ) I ) P ) ) I I I I ) I ) I P ) I I I P I I L I P ) I I P I I U ) U [ T d.g.g.g.A.g.g.l.A.g.h.h.A.l.A.g.g.A.D.A.A.A.k.Z.A.A.A.A.A.A.A.A.A.A.A.A.A.A.l.A.A.A.A.S.S.A.H.A.S.G.H.H.S.K.L.L.L.L.L.Y.Y.P.T.T.T.~.Y.^.~.T.^.~.T.~.~.~.~.~.~.).Y.!.~.~.T./.~.^.~.~.!.Y.T.T.~.T.T.T.Y.P.Y.P.L.L.L.H.L.L.L.L.H.L.H.L.H.H.L.Z.H.S.H.S.G.H.H.S.A.G.A.H.G.Z.G.S.S.A.A.H.G.A.A.S.A.A.A.A.A.A.A.A.l.A.g.A.z.A.A.g.k.k.l.k.g.f.g.g.k.k.g.g.g.f.k.f.f.l.k.d.f.f.i.z.k.f.g.g.a.f.j.a.f.f.f.f.f.f.g.h.d.k.d.f.g.g.d.g.g.g.l.g.g.h.z.g.h.f.f.d.f.f.f.k.g.g.g.a.i.g.a.a.a.a.a.g.a.f.k.a.k.f.f.f.f.f.f.k.g.g.a.z.f.h.f.f.z.z.z.h.h.h.z.h.h.h.h.g.l.h.l.h.l.l.l.l.h.j.A.h.h.h.h.j.s.l.a.h.k.g.d.g.k.d.k.f.k.d.d.f.f.d.k.i.k.d.a.i.i.k.i.i.a.a.a.a.a.k.a.a.k.a.a.k.i.i.i.a.a.a.i.a.a.a.a.d.P ! ! ZXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXDXDXGXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXAXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXBXm.[ ~ / ` T.~.~.T.~.T.T.T.T.P.T.T.T.T.T.T.P.P.P.P.P.U.L.U.L.L.L.L.L.K.L.L.L.U.L.L.K.L.L.L.L.L.L.D.L.L.P.S.L.S.L.H.S.L.S.U.L.S.L.H.L.H.H.L.H.H.L.S.D.S.S.S.A.A.A.A.G.g.A.Z.A.l.A.h.h.A.z.A.A.A.l.A.j.A.A.A.A.A.A.G.A.G.A.A.J.h.A.H.H.S.H.S.H.H.H.H.S.L.H.L.H.H.L.U.H.L.H.K.L.G.L.L.U.L.L.L.K.L.L.L.L.L.L.L.L.L.L.L.J.K.L.L.L.L.L.L.L.U.Y.U.T.U.U.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.U.T.P.Y.T.Y.T.T.T.T.T.~.T.~.T.~.~.T.~.T.~.~.~.~.!.~.~.~./.~.~.~.~./.~.[./.^.~./.(./.!.~.~.~.~.T./.T.T.~.T.~.P.[.Y.[.T.!.T.T.U.XXT.T.T.T.T.T.T.T.~.~.~.T.~.T.~.~.E.(./.~./.~.~.~.~.~.~./././.~.~./././././.!././.(./.(.(.`.^.",
+"Z Z Z Z C Z C Z B D Z B Z C F Z Z Z Z Z Z Z F B Z C C Z D Z F Z Z Z Z D D D D D F H L J J J L L L P J J L L J J Z P P J P L J H J J L H J H L H H H H D H Z K H H H H H H J Z L L H L L L J L P J J J J L P L P P P I L P P P I I I P ) ) P I I P I I ) ) P P ( I P I I J ) I ) P ) ( P I P ) ) ) ) ( I P ) J ) I ) I ) I ) I P I I I I P P I I I I ( P I I I P I U I U U Z.Z.g.g.l.A.g.A.g.g.l.l.l.l.A.l.A.l.z.k.A.A.A.A.l.A.l.G.A.l.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.S.A.S.S.Z.H.H.H.S.H.L.L.L.P.P.P.Y.P.Y.T.^.T.T.T.T.T./.~.~.~.~.(.~.~.~.~.~././.Y./.~.~.T.XXT./.~.Y.T.T.R.Y.T.P.P.Y.L.L.U.P.L.L.L.S.L.S.L.S.H.H.H.H.S.H.S.S.H.H.G.A.H.S.A.A.S.S.A.H.A.S.S.S.S.S.A.A.S.A.A.A.A.A.A.l.A.l.l.l.k.k.k.l.A.g.g.g.g.k.f.k.d.f.f.f.f.f.z.f.l.d.k.k.z.g.f.f.k.g.a.g.f.g.a.g.f.g.f.j.k.f.d.d.k.f.g.g.g.g.l.g.g.z.k.g.h.g.z.g.g.g.k.h.f.f.f.a.a.a.g.a.a.f.a.g.a.a.f.f.a.a.f.f.a.f.f.a.f.k.f.g.k.a.z.f.f.h.f.f.f.h.g.g.h.k.f.z.z.h.z.h.z.h.h.h.h.f.z.h.f.z.z.h.j.h.l.f.f.h.h.k.d.g.g.d.f.f.f.f.f.f.f.f.k.f.f.f.k.i.a.k.a.i.k.u.a.a.a.a.k.a.a.a.i.i.a.a.k.i.d.a.E D.a.a.a.a.a.z./ / / ZXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXAXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXDXAXDXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXBXpX{ ! ! [ ~.~.T.~.T.T.~.T.T.T.T.T.T.P.T.P.P.T.P.P.L.U.L.L.L.Y.P.L.U.U.L.K.L.L.Y.U.L.U.L.L.L.L.L.L.S.P.S.P.S.L.S.L.U.L.L.L.L.Z.L.H.U.S.Z.U.H.L.L.H.S.H.D.D.S.A.H.h.A.A.A.h.A.A.h.h.l.l.l.l.h.l.h.h.A.g.A.h.A.A.A.A.A.A.A.A.A.A.h.A.S.S.S.S.H.H.H.H.H.H.H.L.U.H.H.H.L.L.L.L.L.L.L.L.L.L.L.L.L.L.U.L.L.U.L.L.U.L.L.L.L.L.U.L.D.L.L.L.U.P.P.P.U.T.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.U.T.P.U.Y.T.T.T.T.T.~.T.T.T.T.~.[.~.~.[.T.!.~.~.~.!.~.~.~././.~.~./././.~./.!.~.~.~.~.T.~.T.T.~.~.T.T.T.~.T.T.T.P.T.P.T.T.T.T.T.T.T.T.T.T.T.~.~.T.~.~.~.~.(.~.[.(././.~.~.~.~.~./.~.~.~./.~.(.~.~././././.(.(./.(.(.(.(.(.",
+"D B C C Z Z Z D B D Z C Z Z Z C B C Z C C Z A Z C Z Z Z Z Z Z Z Z Z D D D D D D H D L D D J J J P L J L L L L H L L H H L L H L H H H H H H H H H H H H H H H H H H H H L L H H L L J J J J P J H H Y U L J I L L L P J P P P P J I P I P I I I P I P ) P I ) P P ) ) P P I ) J ) ) P ) ) P P I P P P I ) ) P ) ) I I I ) I I ) I I I I ) ) P I I I I P I P P I I I I I T d.g.l.l.l.g.l.k.A.A.l.A.l.l.l.A.l.A.A.Z.A.z.A.A.A.D.A.l.D.A.A.S.A.A.A.A.A.h.A.A.A.A.A.A.S.A.A.S.G.S.G.S.H.H.H.H.L.L.L.Y.P.P.T.~.T.T.T.T.^.^.~.T.!./././.~.~./.!././.~./.!.~./.~.~.~.~.~.~.~.T.~.T.~.Y.T.T.P.T.L.P.Y.L.L.L.L.L.L.S.S.L.L.H.H.H.H.S.H.H.H.A.H.H.S.G.H.H.S.S.A.A.S.H.H.A.h.S.A.S.A.A.A.A.A.A.l.A.A.A.l.g.Z.A.k.l.g.k.g.g.g.g.d.f.g.g.d.k.d.k.f.g.k.k.k.g.s.f.z.f.f.a.g.a.f.a.g.a.f.a.g.f.z.k.d.g.h.z.g.k.g.h.g.g.l.g.k.A.g.h.g.g.g.g.k.g.f.g.z.k.a.g.a.a.a.a.a.a.a.f.a.a.s.a.f.z.k.a.a.g.f.f.k.f.f.g.k.f.f.f.f.a.f.f.a.g.h.f.h.z.f.h.h.g.h.h.h.f.z.h.f.h.h.h.f.h.k.k.f.f.k.k.g.k.g.k.g.z.f.f.f.f.k.d.k.d.d.k.d.k.k.i.a.a.a.i.k.i.a.a.k.a.a.a.k.a.a.k.a.k.a.z.a.z.i.d.a.d.a.a.a.i.S ! ! BXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXGXDXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXDXBXQ.[ ! ! [ ~.T.~.T.~.~.T.~.T.T.T.T.T.T.P.P.P.P.P.P.L.L.L.U.L.U.L.P.L.L.L.L.L.L.K.J.L.L.L.K.L.H.D.L.U.S.L.S.L.L.S.L.S.L.Z.S.L.L.L.F.S.U.H.D.L.G.H.H.S.H.A.H.S.H.A.A.A.h.A.A.h.k.h.h.l.l.l.l.l.l.h.h.Z.A.A.A.A.h.A.g.A.h.A.A.A.A.S.A.h.S.h.S.H.A.H.H.H.H.H.H.S.H.S.H.S.L.H.H.S.L.L.L.G.L.L.L.L.L.L.L.U.L.L.L.L.U.L.L.K.Y.L.L.U.U.L.L.L.P.Y.P.U.U.T.T.T.T.T.T.T.T.T.T.T.T.U.T.T.U.T.U.T.T.P.T.T.T.~.T.~.T.~.T.~.~.~.~.~.~.~.~.~.~.~.~.!.~.~.~.~./././.~./.~.(././.T.~.R.~.~.T.T.~.T.T.T.T.Y.~.T.T.T.[.T.[.T.P.T.T.T.T.T.T.T.T.T.T.T.T.~.~.~.T.T.~.~.~.~././.~.~.!./././.!.(./.~.~.^.(././.^.(././.(.(.(.(.(.(.",
+"C B Z Z C Z B C Z A Z C C Z Z Z D C A C Z C Z C D B C Z F Z Z Z Z F D Z D D Z Z H D H D H H H J L L Z J J H J L H H J L H J H H H H H H J L H H H Z H Z H H H H J H H H H J H L H J H P H P L J J J U J L J P P I P L P P P I I I I I J I ( I ) I I I ) I P ) I ) I I I I ) ( J I P ) P ) P P ) ) P ) ) ) P ) P I ) I I P ) ) P P I I I I P I I P ) P I I I ( U I I I ) [ d.g.l.l.l.l.l.g.l.l.l.l.l.A.A.g.A.k.Z.g.A.g.A.A.l.A.A.A.A.A.A.A.A.G.A.A.A.A.A.A.A.A.S.A.A.S.S.H.A.H.H.H.H.H.H.L.L.L.L.T.P.P.T.T.T.~.T.T.~.T.~./././././.~././.^.E./././.E.(././.~.~.(.~.~.~.T.T.T.T.T.T.P.Y.U.U.L.U.U.L.L.L.L.H.H.H.H.H.L.D.H.H.H.H.H.H.S.H.H.H.G.H.Z.W.A.S.H.A.A.S.A.A.S.A.A.h.A.A.A.A.l.l.l.l.A.z.A.g.g.g.g.g.g.D.d.z.i.g.f.f.f.f.d.f.g.f.f.g.k.f.k.f.f.f.h.g.f.g.f.f.f.f.f.j.g.a.g.d.g.k.k.g.g.g.g.l.g.l.l.l.l.l.l.g.A.g.g.h.g.z.l.g.f.g.g.a.g.z.a.f.a.a.a.f.a.f.a.a.f.a.a.z.a.f.f.f.k.k.k.f.f.a.g.f.f.a.k.f.k.a.f.f.h.z.f.g.g.g.g.f.h.f.h.f.h.f.h.f.h.f.h.z.f.f.g.g.f.g.g.g.d.g.f.f.f.f.f.k.f.f.f.f.f.i.d.f.f.d.f.k.i.a.z.i.d.a.k.k.i.k.i.a.k.a.a.a.i.a.a.a.a.i.i.i.a.a.a.S / / CXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXFXGXDXDXAXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXHXVXBXm.{ ~ Q ` ~.~.~.~.T.T.~.T.T.T.T.T.Y.Y.U.Y.L.U.U.L.Y.Y.L.U.P.P.P.P.P.P.P.P.L.L.L.L.U.L.L.L.L.L.P.L.L.L.U.S.S.Z.L.H.H.L.L.L.L.L.H.H.U.S.L.L.L.D.L.S.S.H.H.A.S.Z.h.S.h.A.g.h.h.h.l.h.h.h.h.l.h.h.l.S.g.h.h.A.A.h.G.l.l.G.h.A.h.A.h.G.S.A.A.A.G.S.S.S.G.G.H.H.H.H.S.U.L.S.L.L.L.G.L.L.L.L.L.L.R.I.L.I.U.U.L.L.U.U.L.L.Y.L.L.L.L.U.Y.U.P.P.P.Y.P.T.P.T.T.~.T.T.T.T.T.U.T.U.T.T.Y.P.P.Y.U.P.P.T.T.T.T.~.~.T.T.~.~.T.[.T.[.~.~.~.~.~.~././.T.~.(.~.~.~.~./.~.~.~.~.~.~.~.~.T.T.T.T.T.T.T.~.T.~.Y.T.T.[.T.T.T.T.P.T.T.T.T.T.T.T.T.T.T.XX).T.~.~.~.T.!.~./././././.!.~.[./.~././.(.^.~.(.~.^.(.(.E.(.(.^.(./.(.(.(.",
+"C Z C Z Z C C Z C F C Z Z B C Z Z C Z Z Z Z Z C Z Z D F C Z F Z Z F Z C Z D Z G Z D H H H H H H L L P H J H L L L L H H L H H L J H H H Z L Z H H H Z H H Z Z H H Z J H J Z K H H H H H L L P H J U J J P U P L P L I L P P P P I I I I I I J I I I P P I P P I P I I I I I P ) ) I P ) ) ) ) I ) ) J ) P ) ) ) ) I I ) I I ) P ( I I I I J I P I P P I I I U I I I U ` d.Z.g.g.k.l.k.l.A.g.l.g.l.l.g.g.l.z.D.l.A.l.D.A.A.A.A.A.A.A.A.A.G.A.l.A.A.A.A.A.A.A.A.l.G.A.A.A.A.S.S.H.H.H.H.H.H.L.L.U.P.T.T.T.T.~.~.~.~.~.~.)././.~././.(./.~.(././././.~.~./.(./.E./.~.~.~.~.~.T.T.!.Y.T.P.T.U.U.L.L.L.H.L.D.L.L.L.S.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.S.S.A.S.S.A.A.A.A.S.D.Z.S.A.A.A.A.A.A.l.l.A.z.A.g.l.A.g.k.k.k.l.f.g.k.f.f.k.k.f.k.d.z.d.z.z.k.g.f.f.f.f.f.f.d.g.f.f.j.g.a.g.g.g.g.g.g.k.z.l.z.l.z.l.l.z.l.A.l.h.g.A.g.h.h.g.A.j.f.a.g.g.a.a.a.a.k.f.a.a.a.a.a.f.a.a.a.f.f.f.f.k.k.f.g.z.a.g.a.f.a.f.f.f.a.g.g.f.k.z.f.g.g.g.g.f.z.f.g.z.h.g.f.f.z.f.f.f.f.f.f.z.f.g.k.k.k.g.g.f.f.f.d.f.f.d.k.f.f.k.k.f.a.k.d.k.z.d.i.d.z.a.k.k.k.k.z.k.a.k.i.a.a.a.a.a.a.a.i.a.i.a.a./ ! ! CXZXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXAXFXFXFXFXFXFXFXFXFXDXFXFXFXFXSXGXDXAXSXDXDXDXFXAXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXAXDXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXZXZXBXm.[ ~ Q [ T.T.~.T.~.T.~.T.T.T.T.T.L.L.U.L.L.U.L.J.L.L.L.U.P.P.P.P.P.P.P.U.L.L.U.L.L.Y.L.L.L.U.L.P.L.S.L.U.U.D.L.D.L.H.S.U.F.S.U.L.L.Z.U.S.L.S.D.S.H.G.H.S.S.G.H.S.A.l.Z.A.h.h.l.h.h.h.z.z.h.h.h.z.Z.A.A.A.A.A.l.l.l.h.A.l.h.A.l.h.Z.A.j.A.h.S.A.S.S.H.H.G.H.H.H.H.S.U.H.L.L.L.L.L.H.L.L.L.K.H.L.L.Y.U.U.L.U.L.L.U.U.L.L.L.P.L.U.P.P.Y.P.P.T.T.T.T.T.T.T.T.T.T.U.T.T.U.U.Y.T.Y.P.P.U.P.P.P.T.Y.T.T.T.T.~.T.T.~.T.~.T.~.~.~.~.~.~.!.~.~.~.~.~.~.~.[.~.~.~.~.T.~.T.T.T.[.T.T.T.T.T.T.Y.I.T.I.T.T.P.T.T.P.[.T.T.T.T.T.T.T.~.T.~.T.T.T.~.~.[.T.~.~.~.~././.~././.~.~././.~.(.T.E./.[.(./.^.(.(.(.(.(.(.(.(.(.(.",
+"Z C C Z Z C C Z Z A Z A C Z C Z C Z C C C Z A Z Z C Z C C D Z C C Z Z D D D Z F F Z H D Z H H H H L H H J H H H H H J H H L D H H H L H H H Z H Z D H H Z H H D H H Z H H H H H H J L H H P J L J L L L L P P L P J P P P P P P J I I I I P I I I I P P I I I I P I P I I I ) I I ) I I P I I I P ( I I P P P ) I I I ) I I P I I I P P P ) I P P I U I P P P I I I Y T [ j.Z.g.g.l.l.g.g.l.l.l.l.l.l.A.l.A.A.A.g.A.g.A.A.A.A.A.A.A.A.A.l.A.A.A.A.A.A.A.A.A.S.A.S.S.S.S.G.G.S.H.H.H.L.L.L.L.U.T.T.Y.T.T.T.~.~.T.~.~././.!.(./.(./.(./.^.[.~././.(.(.^.(.!.(.(.(././.!./.~.(.T.T.P.T.T.Y.Y.U.T.U.L.L.L.L.D.L.L.L.H.H.H.L.H.H.H.H.H.H.H.H.H.H.S.S.H.H.H.S.S.S.A.A.A.A.A.A.Z.A.A.A.A.l.l.A.l.A.z.A.l.l.z.g.z.g.z.z.h.k.k.f.g.d.k.k.f.k.f.k.g.f.f.g.g.g.g.a.g.f.f.g.f.f.g.g.g.h.g.g.g.z.h.h.z.h.h.l.z.A.l.A.l.l.A.l.l.l.l.z.h.h.h.z.g.g.z.z.f.f.a.g.f.a.f.f.a.f.f.a.k.f.a.f.f.f.f.f.f.f.z.f.g.g.g.g.k.a.a.a.g.g.a.k.g.g.g.j.h.z.g.z.f.l.k.k.z.f.f.z.z.f.f.f.f.f.f.f.g.k.g.k.g.z.g.k.k.f.k.g.k.f.k.k.z.d.k.k.f.f.f.f.i.i.d.z.k.d.k.k.i.f.f.f.k.k.k.d.a.a.z.k.a.a.a.a.a.i.a.a.P ! ! CXFXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXDXAXFXFXFXFXDXDXAXDXFXFXAXDXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXAXAXFXFXDXZXBXQ.} ~ Q [ ~.~.~.~.T.T.T.T.T.T.T.P.P.P.U.U.Y.U.Y.K.Y.L.U.U.T.P.T.T.P.P.Y.U.Y.K.L.Y.U.U.R.Y.L.L.L.L.H.K.L.D.S.S.L.L.Z.H.U.H.L.S.L.H.L.H.S.H.H.S.S.S.H.H.H.H.G.S.S.S.A.A.z.h.l.l.h.h.l.l.h.h.l.h.h.S.A.h.A.A.h.A.h.A.z.h.h.l.h.h.h.A.h.h.A.j.A.S.A.A.S.S.S.S.H.H.H.H.H.L.H.L.U.S.L.L.L.L.L.L.L.L.I.Y.U.L.L.U.U.U.L.L.L.L.L.U.L.P.P.P.P.P.Y.P.P.P.P.T.T.T.T.T.U.T.U.U.U.T.U.U.U.P.U.U.P.P.T.P.Y.T.T.T.T.~.T.~.~.~.~.~.~.~.~.~.~.~.~.~./.~.(.~.~.[.~.T.T.~.~.~.~.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.P.T.!.T.T.T.T.T.T.T.T.T.~.T.T.T.T.T.XX~.~.~.~.~.~.~.(./././.(././././././.[.~./.(.(./.^.(.(.`.(.(.(./.`.(.(.(.",
+"C C C C C C C C C C Z C Z C Z Z Z C C F C Z C Z Z Z C D F Z C D F Z Z Z D Z Z Z Z H D H H H H H L H S H H H H H L L L H H H L H H D H H H H H H K D H Z H H Z H H Z L F Z H H H H L L L H L P H I L L I L L P P L P P P P P P P I I I J I I I P P P P ) P I I I P ) J ) I J ) I I I I I ( ) ) I I P ) I I ) ) P ( ) P I I ) ) I I I I ( P P P ) ) I P I I ( P P I U ) T d.g.g.z.l.g.l.l.k.l.l.g.g.l.l.l.A.g.k.l.l.l.A.A.g.A.l.A.A.A.A.A.A.G.D.l.l.A.A.A.A.A.A.S.A.G.A.H.Z.H.H.H.H.H.L.H.L.U.U.P.P.T.T.T.T.~.~.~.~.~.(././.(.(.(././.^.~.`.^./.(.^.(.(.(.(.(.(.(.(.(.(./.^.~.^.T.T.T.T.~.T.P.U.U.Y.L.L.L.U.L.L.D.L.L.H.H.L.H.H.H.H.H.H.H.H.G.H.S.H.Z.G.A.S.S.A.D.G.A.S.l.A.A.h.A.A.A.l.A.A.l.h.l.l.l.l.l.l.g.z.l.g.f.k.k.g.k.g.d.k.g.z.h.f.z.f.g.g.g.g.j.f.g.g.g.g.h.g.a.g.f.g.g.g.g.g.g.g.h.h.h.h.l.l.l.l.A.g.l.A.l.l.g.z.A.z.l.l.l.g.g.k.k.z.a.a.a.a.a.f.f.a.g.f.a.f.a.f.f.f.f.f.g.f.f.g.a.a.g.f.f.k.f.f.g.g.j.z.g.a.z.z.g.g.g.h.f.z.f.f.f.f.f.z.f.f.f.g.f.f.f.d.k.g.k.k.k.k.k.f.g.k.f.g.k.f.f.k.z.a.k.k.f.f.f.z.k.k.i.i.z.i.k.f.k.f.f.a.k.d.d.d.a.a.i.a.a.a.a.i.a.a.a./ ! S CXFXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXGXFXFXFXFXFXFXFXAXDXFXFXFXFXDXDXDXAXFXAXDXAXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXGXAXFXFXZXDXDXBXpX[ S Q c.~.T.~.~.~.~.T.~.T.T.T.Y.P.Y.U.L.U.L.L.U.L.U.U.L.P.P.P.Y.P.P.P.P.L.U.L.Y.L.L.U.U.L.U.L.L.L.L.D.L.L.L.L.F.H.H.D.Y.L.S.H.L.H.S.F.K.H.H.S.S.H.H.H.H.S.G.S.z.A.A.A.A.l.l.l.l.h.h.z.l.h.h.h.z.h.A.g.A.h.l.l.l.h.h.h.h.h.l.h.h.h.Z.h.A.h.z.A.A.S.S.S.S.H.H.H.H.H.U.S.H.L.L.L.G.H.L.L.L.U.L.I.I.L.U.Y.L.P.L.U.L.L.Y.K.L.L.U.P.P.P.P.Y.P.U.U.T.T.T.T.P.T.U.T.U.Y.U.U.U.U.P.P.T.P.P.P.P.T.T.Y.T.T.T.T.~.T.[.T.T.~.~.~.[.[././.!.~./.!.T.~.~.T.~.T.~.T.~.T.T.T.T.[.T.T.T.T.T.~.T.Y.T.T.I.Y.T.P.T.T.T.T.~.T.T.T.T.T.~.T.T.~.T.T.T.~.~.^.T.~.T.~.~.~./././.~./.[.(./.^./././.(./.^.{.(.(.(.(.`._.`.|.(.(.`.`.",
+"C C C Z C F C C G Z C C C Z Z C Z C C Z C Z Z Z Z Z Z Z Z Z D C F Z Z Z D Z Z Z Z D D H F H D H H H H Z L L H L H H H D L H H H H H H H H D H D D H D D D H H Z H D Z H H H H H H H J Z H P J L H H P J P L J L P P P L P J I P J I I I I I I I P I I I ( I I P ) P P ) P ) I P ( I ) P I P ) I I I I ) ) P ) I I I I ) ) P I P P I I I I L I I P I L I I P I I I U U [ Z.d.Z.g.h.h.h.l.g.l.g.l.l.k.l.l.g.l.A.A.A.l.l.l.A.Z.A.D.A.A.A.A.A.A.A.A.A.A.G.A.A.A.A.G.A.A.S.S.S.S.H.H.H.H.L.L.L.L.P.Y.T.T.T.T.~.~.T.^././.^.(.^.(.(.(._.(.(.(._.(.(./._.(._.(.(.(._.^././.(.~.!.~./././.~.T.Y.T.Y.U.R.P.P.L.P.L.P.L.H.L.H.H.H.L.H.H.P.J.H.S.H.D.L.S.H.H.S.G.S.S.S.S.A.A.S.A.A.A.D.A.G.h.h.A.h.l.A.h.A.l.l.A.l.l.g.g.l.d.l.z.z.l.k.g.z.k.z.k.g.g.g.g.j.a.f.f.h.g.g.g.g.f.f.g.l.g.g.z.g.g.g.A.h.l.h.A.z.l.l.A.g.A.A.l.l.A.g.h.h.h.h.A.z.G.g.g.l.f.g.f.g.z.k.k.a.f.a.k.f.a.f.f.a.a.z.f.k.g.f.a.g.g.z.g.a.f.f.f.f.f.h.f.f.g.g.g.z.g.g.g.g.z.k.k.f.f.k.f.f.g.f.f.f.g.f.f.f.g.z.k.k.g.f.f.z.d.g.k.k.k.k.k.k.k.k.g.g.f.f.f.f.k.k.k.k.d.k.f.k.f.k.k.d.k.z.d.k.a.a.i.a.i.a.i.a.i.a.a.a.S ! S CXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXGXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXAXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXGXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXFXVXBXm.[ Q ^ [ ~.~.T.~.T.~.T.T.T.T.T.Y.U.U.U.U.L.U.L.Y.L.U.T.L.Y.U.T.T.P.Y.U.P.Y.L.L.U.U.U.U.P.U.L.L.L.L.L.L.L.H.L.H.L.Z.L.L.L.H.H.H.H.H.H.L.K.H.H.G.A.H.H.H.S.H.G.A.G.A.A.A.h.l.l.h.z.D.Z.g.g.g.h.h.l.z.h.g.h.d.D.g.k.g.k.g.z.h.h.l.l.l.l.l.l.A.g.A.A.F.S.A.D.S.G.G.G.L.L.L.K.L.L.P.L.P.L.L.L.L.I.L.Y.L.U.U.U.U.L.Y.L.L.L.L.L.U.P.U.P.P.P.P.K.T.Y.U.U.T.U.Y.T.T.U.U.U.U.L.U.U.P.P.P.P.L.P.U.U.Y.U.T.Y.Y.T.T.~.T.~.T.^.~.~.~.~././.~.~.~.~.T.~.~./.T.T.T.T.T.[.T.T.T.U.U.T.T.T.T.T.T.U.Y.P.T.Y.P.T.T.T.T.T.T.T.T.T.T.T.E.~.T.T.T.~.T.T.T.~.~.T.!.~.~.~././.(./.(././.(.[.(./.(./.(.(.(.(.`.`.(.{._.|._._.(.(.(.",
+"C C C C C C C Z C C C D C C Z C C C Z C Z B D C Z C C Z Z Z C Z Z Z F C Z Z Z H H Z Z Z H D H H H Z H L Z L H H H H Z L H D H H H H H H D H Z H H D D Z D F D H Z H Z H Z F H H H H H H H J L H L P L L J L I L J P P P P J I I I I J I J I I J I P L I I P I I P P P P P ) I ) P I ) P I ) ( I I I ) ( ) J P ) I ) I P J ) I I I P P P P I I I I P I I I U I P I P I d.j.g.j.g.h.g.h.g.A.g.l.g.l.l.l.z.D.l.k.z.l.l.l.A.l.A.A.z.A.A.A.A.A.A.A.A.A.A.A.A.H.A.A.A.Z.G.G.S.G.S.H.H.L.S.L.L.L.L.U.T.T.T.T.T.~.~.~.E.~.~.^.^.(.(./.(.^.(.(.(.(.(.(.(.(._._.(._._.^.{.(.(.(.(./.T.~.~.T.Y.~.E.T.T.T.T.P.P.Y.L.P.L.P.L.L.L.P.H.H.L.L.D.H.H.L.H.S.H.L.S.S.H.D.S.S.H.A.S.A.A.A.A.A.A.A.A.A.A.A.h.l.h.A.z.A.g.l.l.g.l.l.g.l.l.g.l.d.g.d.k.f.g.g.g.g.g.h.g.h.h.h.g.g.g.g.g.h.j.h.f.h.g.g.l.l.h.h.h.h.h.h.A.l.A.g.A.D.A.A.z.l.z.l.D.l.A.l.l.g.g.z.g.g.h.f.a.f.f.a.a.f.f.a.f.f.f.z.f.k.a.f.f.f.g.g.f.f.a.f.j.f.z.f.f.f.k.g.z.g.g.g.g.g.g.g.g.f.f.z.z.f.a.f.f.g.a.f.s.a.a.a.k.a.j.k.k.k.f.f.f.f.f.k.k.h.k.z.k.k.f.g.f.f.f.k.d.d.i.k.f.k.f.f.f.f.k.f.f.k.i.d.i.z.i.a.a.a.i.a.i.a.a.a.a./ ! ! CXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXDXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXDXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXHXQ.} ! ^ [ ~.~.~.T.~.T.T.~.T.T.T.I.U.L.U.L.L.L.L.L.L.T.U.T.U.T.Y.U.U.U.P.P.U.U.U.U.L.U.P.U.U.L.L.L.L.L.A.L.H.H.H.S.S.S.S.L.H.L.H.L.H.H.H.H.H.H.G.H.H.H.H.S.H.H.H.A.Z.A.A.A.A.l.h.k.z.k.k.z.g.d.h.h.h.h.h.f.z.g.g.g.g.g.k.g.h.h.l.j.h.h.l.l.z.D.A.A.A.S.D.D.A.H.H.L.G.H.H.U.L.S.A.P.L.L.L.L.L.U.I.U.U.L.L.U.U.L.K.L.U.U.L.Y.P.P.L.U.P.Y.P.P.P.T.T.U.Y.U.P.Y.U.Y.L.T.U.U.L.U.P.P.Y.P.U.L.U.Y.Y.U.T.Y.Y.~.~.Y.T.~.T././.~./.~.T./.~.~./.~./.~.~.T.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.T.Y.P.T.T.T.P.~.T.T.[.T.R.XXT.T.T.~.T.~.T.~.~.T.T.~.!.~.~.~.~./././.(.[.(.(.(.!.[.(.(.(.(.(.(.(.(.(.|._.^.(._._.|.(.",
+"C C C A Z C C C Z B C C Z C C C Z C C Z Z Z Z Z Z Z G Z D C D Z C F C Z F Z F Z D F Z D Z Z H Z Z Z H H Z H H H L H D H H H H Z H H Z Z H H H D D H D Z S Z D D H D F H H H Z H D D J S H H H J H P J L L L I P L P P L P P P P J I I I I I I I I I I I P I I I P P ) P P P P ) P P P ) P P P ) ) J I I I ) I I I I P I P I P P P I P P I P I I I L I L I P P I I I Y T j.g.h.g.g.l.l.g.l.k.l.g.g.l.A.g.k.g.g.Z.l.l.Z.l.A.z.A.z.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.S.G.G.S.G.H.H.H.H.L.L.L.L.L.Y.U.P.T.T.~.~.~.~.~.~.(.(.(.{.(.(.{.(.(.{.(.^./.^.].(._._.(._.(.`._.XX(.(.(.(.(.~.!.E./.~.~.Y.~.T.T.R.T.T.U.P.Y.L.L.L.L.H.L.L.H.L.H.H.H.L.S.L.L.Z.J.H.H.H.H.H.S.G.S.A.A.A.A.A.G.l.A.l.A.A.A.A.l.A.h.A.A.g.A.z.A.A.g.l.l.g.k.g.z.g.g.z.h.g.g.g.g.l.j.g.h.f.f.h.h.g.h.g.h.h.z.g.h.h.h.h.h.g.h.g.h.g.l.l.A.A.A.A.z.A.A.A.A.A.l.l.A.l.l.l.l.z.l.g.g.g.a.z.f.k.f.f.k.g.f.a.k.f.f.f.s.a.h.a.f.f.f.f.z.f.g.z.j.f.f.h.k.h.f.j.z.h.z.g.g.g.g.g.h.f.f.f.f.f.f.a.a.g.i.z.a.f.a.z.g.a.a.g.k.f.f.k.f.z.f.z.k.g.k.g.k.k.k.k.g.f.f.f.f.k.f.f.k.f.f.f.f.k.f.k.f.f.k.f.a.f.a.a.a.a.i.a.a.i.a.a./ ! ! CXFXFXZXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXZXZXHXBXm.[ ! ~ [ T.~.T.~.T.T.T.T.T.T.U.Y.U.Y.L.L.L.Y.L.L.U.U.U.U.T.U.U.T.U.T.T.U.U.U.U.U.L.T.U.U.Y.L.L.L.H.L.L.H.H.G.S.L.S.S.S.L.L.L.H.H.U.H.H.H.S.H.H.H.H.S.H.U.G.G.H.A.g.A.A.A.z.A.h.h.g.g.g.z.D.A.k.D.h.h.A.D.h.z.h.D.g.g.g.z.z.z.j.z.k.l.l.h.z.h.h.h.z.l.D.A.H.S.H.H.S.S.U.D.L.L.L.L.L.L.U.P.L.Y.U.Y.U.U.U.U.U.L.L.U.L.L.L.L.P.P.Y.P.P.P.Y.P.T.P.T.P.Y.U.U.L.T.Y.U.L.U.L.L.L.U.L.L.Y.L.U.P.L.U.P.T.T.T.T.T.T.T.~./.T.~.~.~./.~.~.~.(.~.~./.T.~.~.T.T.T.T.T.T.T.U.T.U.T.T.T.T.T.T.T.Y.T.T.T.P.P.T.T.T.T.P.~.P.T.U.U.T.T.T.T.~.T.T.T.~.T.~.T.~.~.Y.~.!.~./.(././.[.(./././.(.(.(.(.(.(.(.(._._._._.^._.|.}.|._.",
+"C C C C C C Z C C C Z F B Z D C Z Z Z Z C Z Z Z Z Z B C C D C F Z F Z Z C D C Z Z Z Z D D Z Z Z H H Z H Z H H Z G D H D H H D H Z H H H F Z H D H Z H Z D Z H H Z D Z D H Z H D Z H D H H H H H L H H L J L L L P P P P L P I J J I J I I J I P P P I I P I P I P P ) P P ( P P P ) ) P ) ) P I J ) J ) I I I I ) I I I J ) I P I I P P P P P I P ) P I P P I P P ) T Z.j.h.h.h.l.l.g.l.l.g.l.l.g.g.g.z.Z.g.l.z.l.l.A.z.z.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.H.G.Z.G.S.Z.G.H.H.K.S.D.L.L.L.L.U.U.Y.T.T.T.~.~.~././.^.^.(.{.(.~.`.`.(.(.(.^.|./.(.(._.(.`.(._.^._.^.~.(.(.~./.^.~./.~./.T.~.~.~.~.Y.T.P.P.U.U.L.Y.L.L.L.P.H.P.H.P.K.L.H.L.S.L.L.S.L.H.H.H.H.D.S.H.A.G.G.D.A.D.A.A.S.l.A.A.A.A.A.A.A.z.l.l.A.l.g.A.g.g.l.l.l.l.g.g.g.g.k.h.f.g.g.g.f.g.h.z.h.h.g.g.h.g.g.h.h.h.h.z.h.l.A.g.A.A.A.z.l.g.g.D.k.D.g.A.A.A.l.A.g.l.l.l.l.l.z.z.l.f.g.g.k.k.f.f.k.f.a.f.g.a.f.k.f.z.g.f.j.g.f.g.z.a.g.a.g.f.f.f.f.k.f.f.f.a.z.g.a.k.z.g.g.f.f.f.f.z.f.f.f.a.a.z.a.f.f.g.s.a.g.k.i.f.f.k.f.k.d.k.k.h.g.g.k.f.g.g.k.f.f.f.f.k.i.f.f.f.k.k.k.k.f.k.a.k.k.f.f.f.a.k.a.a.a.a.a.i.a.a.g.~ S ! CXFXDXAXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXHXQ.{ ~ Q [ T.~.T.T.^.~.T.T.T.U.T.U.U.S.U.L.L.L.L.L.L.U.Y.T.U.T.U.T.T.T.T.T.T.T.T.I.T.L.U.I.U.L.L.L.L.L.H.H.H.H.S.S.U.S.L.S.L.H.L.L.L.H.S.K.U.S.U.S.H.U.U.S.G.G.A.G.A.A.A.h.A.h.h.z.h.k.Z.D.g.g.z.g.h.h.g.j.h.h.g.g.g.g.g.z.j.g.j.h.h.h.h.h.A.z.D.A.A.A.S.S.G.H.L.G.G.H.H.D.S.L.L.U.U.P.P.P.L.U.L.L.K.L.L.U.U.U.Y.U.L.R.U.U.P.P.P.P.P.U.Y.Y.P.T.P.Y.U.U.U.U.U.L.L.U.L.L.L.L.L.U.L.L.L.L.P.P.T.T.U.T.T.T.T.~.~.T.~./.~.~.~.~.~./.~.T.~.~.~.(.T.T.~.T.T.T.T.T.U.T.P.P.U.U.T.P.T.~.T.T.T.Y.T.T.[.P.T.T.T.T.Y.~.T.XX/.T.~.~.T.T.~.T.~.T.~.T.~.T.~.~.~.~.~.!./.~.(.^.^.(./././.(.(.(.(.(._.(._.(.|.^.|._.[.}._._.",
+"C A C C B C C D C C D C C Z C D C C Z Z Z C Z C C Z Z Z Z A G Z Z C F Z C Z C Z D Z Z F F Z D Z D Z D D H Z L Z D H Z H H H J F H Z H H L H H D H A H H H H D H H H F H Z D H H Z H D H H K H H L L L L L L L L J L P L P P P P J I I J J I J I I P P ( P P I P I I P I P P ) J I I ) I P ) ) I ) J P ) P ) I I J ( P I P I I I I P I P P P P U I P I I I I P I I U [ d.g.Z.z.g.g.l.h.g.A.z.g.g.A.g.Z.z.l.l.g.A.z.g.A.A.A.A.A.A.A.h.A.A.A.A.A.A.A.S.A.A.A.A.H.G.S.S.H.H.H.S.H.H.L.L.L.L.U.U.T.T.T.T.T.~.~.~./.~.^.^.(.^._._._.^.`._.^.`.^.(._.^._._.`.(._._.{._.(.^.(.(././././.~.~.~.~.T.~.T.T.T.~.Y.U.L.Y.U.U.L.L.L.L.L.H.L.L.H.L.L.L.L.H.L.H.H.H.L.H.H.H.S.S.A.S.S.A.A.S.S.l.D.A.S.l.G.A.A.h.A.A.A.A.l.l.l.A.g.A.A.g.h.g.h.g.h.g.z.j.g.g.Z.g.h.l.h.j.h.l.Z.z.h.h.h.l.l.l.h.h.g.A.Z.h.A.g.h.l.A.A.l.l.g.l.z.D.A.l.A.A.A.A.l.A.h.h.z.h.h.f.g.f.k.k.k.k.z.j.g.a.l.f.z.f.z.a.g.f.f.g.k.a.f.f.k.z.z.f.f.f.a.a.z.g.h.z.g.g.z.f.f.k.g.f.f.f.f.a.x.a.a.z.k.i.z.i.z.f.f.g.a.g.f.f.k.f.k.k.k.h.g.z.g.k.g.k.f.d.f.k.f.f.f.f.k.k.k.k.k.f.f.k.f.f.k.f.k.f.i.k.a.a.a.a.a.i.a.i.i.a.~ ~ S CXAXDXAXFXAXAXDXAXFXFXFXFXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXZXZXZXMXQ.} u / c.T.T.U.T.T.E.T.T.T.U.T.L.L.L.U.L.K.L.L.L.K.Y.T.U.T.T.T.T.T.T.T.T.T.T.T.U.U.Y.L.U.L.L.L.L.L.S.U.S.S.S.H.H.S.H.S.L.L.L.H.L.S.H.L.L.Z.U.L.U.L.H.S.G.K.H.G.A.A.A.A.z.h.h.G.g.l.z.z.l.z.k.z.k.f.k.k.z.k.z.k.k.k.k.k.k.k.i.k.f.k.h.h.h.z.z.A.h.h.h.z.A.A.S.L.A.H.U.S.U.S.L.L.L.U.P.P.P.U.U.U.L.L.K.L.L.U.Y.L.U.P.Y.L.P.P.P.P.P.Y.Y.P.T.U.L.T.U.U.T.U.L.L.L.L.L.L.L.L.L.L.L.L.L.L.Y.P.P.U.Y.U.T.T.T.T.T.T.T.~.~.T.~.~.T.T./.~.T.~.~.~.T.T.T.T.T.T.T.U.U.T.U.Y.P.Y.T.P.T.T.T.T.T.T.Y.T.T.P.P.T.[.P.T.T.P.T.T.T.~.T.T.T.~.~.T.~.~.T.~.T.~.T.T.~.~.~.~.~.^.~.[.(.(.(./.(.(.^.(.(.(.[.(._._.`.^._.|._.|._.|.",
+"C C C C C C C C D C C C C Z Z B Z Z B Z Z Z Z Z Z Z Z C Z C Z F D C C Z F Z F Z D Z Z Z Z Z F Z D H D Z Z H L Z H D D L H H Z H D D H Z Z H D D H D D D D D Z H D Z D D H H D Z H S D D H D H H H L H L L J P L L J P P P P P J I J J I I J J I U P P P I I P P I P P P I I P ) P I P P I P P P P ) ) P P I I I I I P I ) P P P P P P I P P P I I I L I P P I U I U T Z.g.g.z.Z.g.g.g.z.l.g.z.l.z.k.l.z.l.g.Z.z.l.A.g.g.A.g.A.A.A.G.A.A.A.A.A.A.A.A.A.G.G.A.A.H.H.S.H.D.H.H.H.H.H.L.L.L.U.U.T.T.T.T.~.~./.~./.^.^._.{._.{._._.(.[.(.^.^.(.(.(.}.`._._._._._._.}.(.`.(.^./.!./.~.~.~.^.~.~.~.~.T.T.~.U.Y.Y.U.U.L.Y.L.L.L.L.L.Y.H.L.L.L.L.S.L.L.L.L.H.H.H.D.S.H.H.H.A.S.S.S.S.S.S.S.G.A.S.S.A.A.S.D.A.A.A.A.A.l.A.l.l.l.g.g.A.l.h.h.g.g.g.h.h.h.g.l.g.A.h.Z.l.l.l.G.l.h.A.h.l.g.A.A.g.l.l.l.A.l.A.l.A.A.h.A.Z.A.g.A.l.h.A.l.l.l.h.h.z.g.g.h.f.g.f.g.f.g.f.a.g.g.z.f.f.f.f.g.f.f.f.z.f.g.z.g.z.a.z.z.f.f.z.g.z.j.g.a.z.f.z.f.f.z.f.f.f.f.f.f.f.a.a.i.k.i.k.k.k.i.a.f.a.a.s.f.i.f.f.k.k.k.k.g.k.k.k.k.g.k.g.k.f.f.f.f.f.k.f.k.f.f.k.f.f.k.k.f.k.a.k.f.i.k.i.d.a.a.a.a.i.a.a./ ! ! ZXAXDXAXFXDXDXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXFXFXFXFXFXFXFXFXFXFXZXZXCXpX} / / c.T.~.XXT.T.T.T.T.T.U.L.U.L.Y.L.L.L.L.U.L.L.U.U.U.T.T.T.T.P.^.T.T.Y.T.T.T.I.L.L.K.L.K.U.L.S.L.H.H.H.H.S.H.H.H.U.S.Z.S.L.L.L.L.L.H.L.H.D.H.H.L.L.S.A.H.A.G.A.l.A.A.h.h.Z.A.l.z.z.z.z.z.z.k.z.z.k.k.g.g.k.k.z.z.k.z.z.z.z.k.k.h.z.k.z.z.h.h.A.z.H.G.H.D.G.A.S.L.L.Z.D.L.L.L.L.U.P.P.L.U.L.U.U.U.R.Y.L.L.Y.L.U.L.U.L.P.Y.P.T.P.P.P.P.U.U.L.U.L.L.U.U.U.U.L.L.L.L.L.L.L.L.L.P.L.L.L.U.U.U.T.U.U.T.T.T.T.~.T.~.T.~.~.~.~.~.~.~.~.T.~.T.T.~.T.T.T.U.T.U.U.U.P.P.P.P.T.P.T.T.P.U.U.~.Y.P.P.T.T.T.T.T.~.~.T.P.T.T.T.~.T.T.T.~.T.T.~.T.~.T.~.~.~.~.~.~.~.(.(.(.~././.(.(.(.(.^.(.(.(._._.(.(.`.|._._._.^.|.",
+"C C B C C C C F Z B C Z Z C Z Z Z Z F Z F C Z Z Z C C Z C Z C C F C C Z C Z Z F Z C Z Z Z Z C Z Z Z Z Z Z Z Z G D D D D D Z Z D D G H H Z H D D H D H Z Z H Z D Z Z Z D H Z F H Z H D H H H H H J J L H J L L J L L L P I J J J I J J I J I I J I P P P P P P I P P P I P J P ) P P P I ) I I ) ) I P I I ) P I I I P I P I P P P P P P P P P I L ) P I I P P P I ) T g.g.Z.z.g.l.l.g.l.g.g.l.k.g.l.k.l.l.l.g.l.l.l.z.A.l.A.g.A.A.l.l.A.A.A.A.A.G.A.S.A.S.G.A.S.S.H.H.H.H.H.H.K.L.H.L.L.U.L.U.P.T.XXT./.~.~.^.^.(.{.^.{.{._.(._._._.(._.(.|.|._.}.}._._._.{._._._.(.(.(.(.(.!./.~.^.~.~.~.~.T.T.T.~.Y.T.U.U.U.L.L.L.L.L.L.P.H.L.L.L.H.L.U.L.U.L.L.L.H.J.H.L.H.D.H.G.S.S.S.H.D.G.G.H.S.S.G.D.G.S.A.A.A.A.A.A.A.A.A.A.l.A.h.l.g.h.g.h.z.Z.h.h.h.h.A.h.h.h.z.l.l.A.h.h.A.h.A.h.l.h.g.h.l.g.h.A.h.l.g.A.A.A.A.A.l.l.A.h.g.A.l.h.A.z.g.h.g.g.g.g.g.k.g.f.g.f.k.k.g.g.f.f.g.f.f.g.g.a.g.f.a.g.f.f.a.z.a.z.k.f.f.f.a.z.f.z.f.k.z.j.j.f.f.f.g.k.a.f.j.a.a.a.a.f.i.k.a.f.f.a.f.s.k.k.f.f.k.g.k.k.k.k.z.d.k.h.k.k.k.k.f.f.f.g.k.k.f.f.g.f.f.f.f.k.k.f.k.f.f.d.a.d.a.a.a.i.a.a.a.a.S / ! SXAXDXAXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXAXDXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXDXAXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXAXFXFXFXFXFXFXFXFXZXZXZXBXm.[ / / [ T.T.T.T.T.T.T.T.U.T.U.L.U.P.L.L.L.L.L.L.L.L.Y.T.U.T.T.T.T.T.T.T.T.T.T.U.T.U.L.U.U.L.L.S.L.L.S.H.D.F.H.H.H.H.S.U.H.L.H.L.L.L.L.L.L.L.L.H.L.L.K.K.H.H.H.G.h.S.A.z.h.S.G.g.h.j.f.G.z.x.a.k.a.z.a.k.k.z.k.d.z.k.z.z.k.k.x.f.z.z.f.k.z.z.z.z.A.A.A.l.A.G.L.H.h.L.L.H.U.H.L.U.P.L.P.L.U.L.U.U.L.L.L.L.Y.L.L.L.L.P.P.P.Y.P.P.P.Y.P.P.Y.L.U.U.U.L.T.I.L.Y.L.L.L.L.L.L.L.L.U.L.L.P.P.P.U.U.U.T.T.T.T.T.T.T.T.T.T.~.~.T.~.T./.~.~.~.~.T.~.T.T.T.U.T.U.U.U.P.P.P.P.P.L.T.T.U.T.T.T.T.~.P.~.T.T.T.T.T.T.~.T.Y.~.~.T.T.~.~.T.~.T.T.~.T.T.T.T.(.T.(.T.T.~.~./././.(.(././.(.(.^.^.(._.|._.|._.`.`.^._._.|.`.`.",
+"C A C C C C C C C C Z C Z Z Z C Z C D Z Z Z V Z C Z Z C Z Z C D Z Z F A Z C Z F C F Z C C Z Z Z Z Z Z Z Z H Z Z Z Z H H D H H H Z H Z H Z H Z Z Z D Z S D D H Z H F H D Z Z H H Z D D H Z H H H Z H H L L L L J J J L J L L P I J J J I J I J I P P ( P P I P I P I I P P ) P P I ) P ) P I I P P I ) I I I P I I P P I P P P P P P P P P P I P P P P P P I P I I T Z.d.g.l.z.h.l.l.l.g.l.l.l.l.g.k.A.g.g.l.l.l.l.l.A.g.A.z.A.A.A.A.A.A.A.A.A.A.A.A.G.A.S.A.G.H.H.A.H.H.H.H.L.J.H.L.L.L.U.Y.T.T.T.T.T.E././././._.(._.^._.{._._.{.(.(._.(._._.|.}.}.}._._.|._.{.|._.(.(.(./././._.~.~.~.~.T.T.T.T.T.Y.T.Y.U.Y.Y.Y.L.Y.L.L.P.P.F.L.Y.P.H.H.L.H.L.L.D.L.L.L.H.H.S.H.H.H.H.H.S.S.H.S.H.G.D.S.G.G.A.D.A.A.D.D.l.A.D.A.A.A.g.A.g.l.l.Z.k.h.h.A.g.h.A.A.j.h.A.h.l.A.l.S.h.S.h.l.A.z.A.l.l.A.A.A.h.A.l.A.A.l.A.g.l.g.A.h.A.l.h.h.l.g.l.A.h.g.h.g.z.f.f.h.h.g.g.g.g.k.g.h.g.g.g.g.f.j.g.a.g.g.d.f.g.g.a.g.g.f.f.g.f.f.g.f.f.f.f.k.k.z.z.f.f.z.a.g.a.a.z.k.a.a.z.i.i.f.i.a.f.a.g.i.i.f.k.d.k.k.k.k.k.k.z.k.k.k.k.k.k.k.d.g.f.z.f.f.g.f.k.f.k.f.f.k.z.i.k.k.z.d.a.a.a.a.a.a.a.a.a.! / S ZXAXAXAXFXFXFXFXFXAXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXSXGXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXAXDXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXDXDXFXFXFXFXFXFXAXFXVXZXZXBXm.{ S S ` T.T.XXU.T.T.T.T.U.U.P.P.U.U.U.L.L.U.U.L.R.K.U.U.Y.U.T.T.T.T.~.T.Y.T.Y.T.I.U.U.L.Y.L.L.L.L.S.D.H.H.H.H.H.L.S.L.S.D.L.L.H.L.H.L.L.L.H.L.L.L.H.H.H.G.H.H.A.S.A.A.A.A.D.l.l.l.G.'.IXIXPXPXPXPXIXPXIXPXPXPXIXGXPXPXIXPXIXPXPXIXPXIXPXPXPXIXPXPXIXPXPXIXPXSXxXU.Z.L.G.L.L.L.L.P.P.L.P.U.U.K.L.U.L.L.L.L.L.U.L.U.P.P.P.T.P.Y.P.P.P.P.P.Y.L.L.L.U.L.L.L.U.K.Y.L.L.L.L.L.L.L.U.S.L.P.L.P.L.P.U.T.T.U.U.U.T.T.T.~.T.~.~.T.T.T.T.T.T.T.~.T.T.T.T.T.T.U.U.U.P.P.P.Y.P.T.P.T.T.T.T.T.P.P.Y.Y.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.~.T.T.T.~.T.(.T.~.T.T.~.!.~.~././.~./.(.(.(.(.|.(.(.(.^._._._.`.(.`.|._.`.(.{.",
+"C C C C C C D C Z B C Z Z Z Z C Z Z A B F Z C Z Z Z C Z Z C Z Z C Z Z Z C Z F Z Z C F Z Z C B Z F D C D Z Z Z F D Z D D F H G Z D D D D D D Z D Z D Z H D Z D Z Z D Z Z H H D Z Z H S D D H H D K L H H J J L J L L L L P L P J P P P P P P P P P P P P P P P J I P P P P I J P ~ P P P I P I ) J ) J ) I I I I I P P P P P P I P L L P P P P I L I U U P I U P I [ [ j.k.Z.l.l.l.l.l.g.l.g.h.g.D.k.g.Z.g.A.g.A.g.l.A.l.g.A.A.A.A.A.A.A.A.A.h.A.S.S.S.S.S.A.H.H.H.H.H.H.L.H.L.H.H.L.L.L.Y.P.P.T.T.~.T././././.(.(.(.{.(._.{.^.^.[._.|.(.{.|.(.|.`.`.`.`.`._.{.(._.}.{.^.^.(.~.~./.~.^.~.~.~.~.T.~.T.T.T.Y.U.Y.Y.L.U.L.U.L.L.U.U.U.H.L.U.U.S.L.L.L.L.H.L.L.K.K.L.L.H.L.D.L.H.H.H.S.H.S.H.H.S.H.S.H.G.S.A.Z.A.h.A.A.A.h.A.h.A.A.g.A.h.z.Z.g.A.A.h.g.A.A.h.G.h.G.h.A.h.A.h.S.l.h.A.l.A.g.A.z.D.D.g.l.l.A.g.l.l.g.l.l.l.l.l.l.h.h.g.g.g.g.g.z.g.g.g.z.g.a.h.g.z.g.l.k.g.l.k.k.g.d.k.f.f.f.f.f.g.k.k.k.d.k.g.f.g.f.a.k.g.z.g.g.z.f.g.a.g.g.a.j.g.s.j.f.a.s.a.z.a.a.a.a.a.a.a.f.a.k.z.z.g.f.g.z.f.g.g.f.k.g.k.g.g.g.j.k.k.k.h.f.g.j.f.f.g.f.f.k.f.f.k.d.f.i.i.a.a.a.a.a.a.d.a./ / ~ DXZXFXZXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXAXDXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXZXDXZXBXQ.{ ~ ~ [ T.T.T.T.T.T.T.T.I.Y.L.L.U.L.L.I.L.L.D.P.P.P.P.T.P.T.T.T.T.oXY.Y.T.T.T.T.P.L.L.P.L.L.L.S.L.G.D.A.H.H.G.H.L.D.U.L.H.L.L.L.L.L.L.L.L.H.L.H.L.L.H.H.H.H.H.h.A.A.A.A.Z.h.A.A.h.hXPXPXPXPXPXGXPXPXGXPXPXPXGXIXPXGXPXPXGXPXIXGXPXPXGXPXGXPXGXPXGXPXPXGXPXPXGXIXnXY.D.K.L.L.S.L.P.L.P.L.L.L.L.L.L.Y.I.L.U.L.K.P.P.P.P.P.Y.T.T.P.P.P.P.Y.Y.P.U.Y.L.U.P.P.P.Y.P.P.L.L.L.L.L.L.L.P.L.U.L.L.L.U.U.U.U.U.T.T.T.T.T.T.T.T.~.T.~.T.T.T.T.T.T.T.T.Y.Y.T.T.U.T.P.K.P.L.U.L.T.Y.Y.U.Y.Y.T.T.U.T.Y.T.T.~.T.T.T.!.T.Y.T.T.T.U.~.Y.Y.I.Y.~.~.Y.T.~.T.T.T.~.~.T.~.~.^.T.~.[./.(./.(.(.(.(.(.`.`.`.(.`.|._.|.{.|.^.|.[.",
+"C C C C C C C C C C C Z B D Z Z C Z Z Z C Z Z D C A C Z Z Z A Z Z C C Z C A C C V Z C C F F Z F C Z D C Z Z D Z Z D G Z Z Z H Z D D D Z D D D Z Z Z D D F Z D Z Z H Z H F Z Z Z D D D D H D H D H D L Z H H H L J L L J L P P L P P L P L P P P P P P P J P P I P P P P P J ) P P J ) P ) I I P ) J ) P I I I J P P I I P P I J I P P P P P P L I P L ( P P I I U T d.g.g.l.g.g.l.l.l.l.l.l.l.l.k.l.k.z.g.g.l.l.g.A.g.A.A.A.g.A.A.h.h.A.A.A.S.G.A.S.A.S.A.G.S.S.S.H.H.H.H.H.H.L.L.L.Y.L.U.Y.I.T.T.T.~.~.~.^.(./.(.{._.(.{._.(.(._._.^.{.(.^.|._.{.{.(.`.`.(._._._._._._.(.^.^.(./././.~.~.~.~.R.Y.T.R.Y.Y.U.U.U.L.Y.Y.U.F.L.U.L.U.H.U.L.L.U.K.L.L.L.L.L.S.L.J.L.L.L.H.L.L.H.L.L.H.K.H.L.D.J.H.H.H.H.S.S.K.G.G.G.l.G.A.H.A.h.A.A.g.A.h.h.h.g.h.A.A.h.A.A.z.A.g.A.A.D.h.G.l.A.l.z.A.l.g.g.l.g.g.z.l.l.l.l.l.A.l.l.l.l.h.h.l.l.h.l.g.h.g.g.g.g.f.h.g.z.g.z.z.z.l.l.g.g.k.k.g.g.k.k.k.f.f.f.g.f.g.d.f.f.f.g.z.i.f.f.a.g.i.k.a.g.g.a.z.k.a.g.g.f.f.g.a.f.f.f.a.a.a.a.a.a.f.a.f.a.k.a.a.g.g.a.a.g.f.z.g.g.d.g.g.a.j.f.h.j.k.j.f.g.f.h.g.f.f.f.k.f.f.f.f.d.k.i.a.a.a.d.a.a.a.a./ S S CXZXFXAXDXAXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXZXZXBXpX[ ~ S { T.T.T.T.T.T.U.T.U.I.T.U.U.U.U.I.U.Y.P.P.P.P.P.P.T.T.T.T.T.T.T.!.T.T.T.T.Y.U.L.P.S.L.L.L.S.L.L.L.H.H.H.H.A.U.H.H.H.L.L.U.L.L.L.L.L.L.L.L.L.H.H.H.H.H.H.A.G.A.h.A.A.h.h.z.h.IXPXPXGXPXGXPXPXGXPXIXGXPXPXGXGXPXIXPXPXGXPXGXGXPXIXGXPXGXPXGXIXPXGXPXGXIXAXVXBX].L.D.A.L.L.L.L.L.L.L.L.L.L.L.H.K.L.L.U.U.P.P.U.Y.P.P.T.P.T.P.P.P.P.P.P.P.L.L.L.P.P.P.P.P.L.L.L.L.L.K.L.L.L.L.P.P.L.L.Y.L.U.T.T.T.U.T.I.T.T.T.~.Y.~.T.T.T.~.T.T.T.^.T.~.T.T.T.U.Y.U.P.P.L.Y.U.U.U.L.T.U.U.U.T.I.I.T.T.Y.Y.T.T.T.T.T.T.T.T.T.T.Y.~.Y.~.~.~.T.Y.I.~.~.T.[.~.~.T.~.~.~.~./.~./.^./.(.(.(.(.`.(._.(.`.`.'.|.|.}.}._._.|._.",
+"C C A C C C C C D C F C C Z B D C Z Z Z Z D C B Z C Z A B Z Z Z C C Z Z C Z Z C Z C Z F C C Z Z Z Z Z F Z D Z F Z D D D Z F D Z D D D Z H D Z D D Z F Z Z D Z F Z Z H F Z D H H Z F Z H F D K D H D H H H L H L L H L L J J L P L P L P P S ( P P J P P U L P P P P P P I ) P P P I P ) P ) P P I I ) P I P I I I P P P I P J I P P P P P P I L P P P P P U I P Y [ Z.g.A.g.l.A.g.l.l.l.h.l.g.h.l.k.l.l.g.A.g.g.l.l.l.l.g.A.A.A.A.A.A.S.A.A.H.S.G.Z.A.G.S.H.S.S.H.H.H.H.H.H.L.L.L.L.L.L.U.Y.Y.T.T.~.~.T.E.^.^.(.(.(.~.(.(.(._._.{.|._._.(._.`.|._._.(.|._.`.(.`.(._._.(.(.(.^./.(.^.T./.~.~.~.~./.T.Y.U.T.Y.Y.P.Y.U.L.U.H.L.L.U.L.L.L.L.L.L.U.Y.L.I.L.L.L.H.L.L.L.L.L.L.H.P.H.L.L.H.S.H.H.J.J.S.H.G.G.A.G.z.Z.G.A.G.A.h.A.h.A.j.A.h.h.g.h.A.g.h.h.A.g.A.A.G.A.G.h.S.A.h.A.h.h.A.A.g.g.A.A.g.Z.A.g.l.A.l.A.g.l.l.l.h.h.h.h.g.z.g.g.z.z.g.g.g.f.g.k.h.h.k.D.d.g.z.g.k.k.k.k.d.g.g.g.f.k.k.f.f.k.k.a.k.f.d.k.i.g.k.a.d.i.i.g.i.a.f.g.g.z.f.i.f.i.a.f.a.f.a.a.a.z.a.a.z.a.a.a.a.f.f.k.g.g.g.h.h.g.k.g.g.k.g.g.g.g.a.f.j.f.k.k.f.h.f.z.f.f.k.f.k.f.k.i.k.d.a.a.i.a.a.a.a.f.a./ ! S ZXZXFXSXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXZXZXBXm.} ~ ~ [ T.T.T.T.T.T.T.Y.T.T.U.T.T.L.U.U.U.P.P.P.P.T.U.T.P.T.T.T.T.T.!.Y.T.T.T.T.P.P.L.P.L.L.L.L.L.L.S.L.S.H.L.H.L.S.U.S.L.L.L.S.L.L.A.P.L.H.L.H.L.L.S.H.H.Z.S.A.G.A.h.A.A.A.A.A.x.PXGXPXPXGXIXPXGXGXIXIXIXIXGXIXIXGXAXPXGXIXGXPXIXIXIXPXIXPXPXIXGXIXIXIXIXIXAXBXhXpXL.D.S.L.L.L.L.L.Y.L.Y.U.U.U.P.I.L.L.P.P.P.P.P.P.U.T.T.U.P.T.P.P.P.T.U.P.U.Y.L.Y.U.L.U.U.U.L.L.L.L.L.L.L.L.L.L.P.L.L.U.U.U.L.U.U.P.Y.I.T.T.T.P.Y.T.T.T.T.T.~./.T.T.T.Y.T.P.T.Y.P.U.L.P.P.L.U.U.U.L.T.P.P.L.Y.I.I.U.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.~.~.U.Y.~.Y.~.~.T.T.~.T.T.~.T.~.~.T.~.~././././.(.(.(.`._._._._._.(. X_.|._.|.|.|.|.|.",
+"F A C C B Z C C C C C Z Z C Z C Z D B Z Z Z Z Z Z Z C Z Z A Z Z Z C Z A C C Z F C Z C Z Z Z C Z C C C Z B Z Z D Z F Z Z H D Z Z Z D D D Z Z D C D Z Z Z D Z D Z D Z D Z H Z Z Z D Z H Z D D Z H Z H H Z Z H H H D L L J L J P L P L L P P L U P P P P L P P P P P P P P J J ( P I P P ) P P ) P ) J P P ) J I I P I I P P P U P P P P P L P P I P P P P P P U I T d.d.A.g.l.l.l.l.A.l.l.l.l.z.l.l.l.l.l.g.A.A.l.l.A.A.l.A.l.A.A.h.A.A.A.A.A.A.A.A.S.G.G.S.H.S.H.H.H.H.H.L.H.H.L.L.L.L.U.U.Y.T.T.T.T.~.~./.^.E.^.(.(.(._._.^.{._._._._.{.{.`.(.^.|._.`.(.(._._._.(._.{.^.(.(.~.(.(.!././.~.~.T.T.R.U.T.R.Y.P.P.U.T.U.U.L.Y.L.Y.L.Y.L.L.U.U.L.L.L.U.L.L.L.L.L.L.L.P.H.H.L.P.L.L.L.L.L.L.L.H.L.H.L.S.S.H.G.H.G.G.A.G.A.A.A.A.A.A.A.g.Z.g.Z.h.A.Z.A.h.A.H.A.g.G.S.h.h.A.h.Z.A.A.Z.A.A.l.A.D.g.l.l.l.g.l.l.l.l.l.l.l.Z.z.h.h.h.z.k.g.f.g.g.f.g.g.g.f.k.z.h.h.l.z.l.l.A.k.l.k.g.g.g.g.f.k.f.f.f.f.f.g.g.g.k.i.i.g.i.i.a.f.g.g.g.g.i.g.a.g.i.a.f.s.g.a.f.f.s.f.a.a.a.a.a.a.a.f.f.f.f.f.k.k.a.k.g.a.z.k.f.g.k.z.g.g.g.g.k.k.h.k.h.h.k.h.f.g.k.f.k.d.f.d.k.a.a.a.a.a.i.a.a.a.i.a.S ! ! CXZXDXDXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXZXZXCXm.[ ~ ! c.T.T.T.T.T.T.T.T.T.U.T.U.T.U.I.U.U.P.T.P.P.P.U.T.P.T.P.T.T.T.oXT.T.T.T.Y.Y.P.L.L.L.L.S.L.L.S.L.S.L.L.H.L.L.S.L.L.S.U.L.L.L.P.L.L.L.L.L.L.L.H.K.A.H.H.S.H.A.H.A.A.A.h.h.h.G.GXGXIXIXGXSXFXVXIXVXFXFXGXSXIXGXGXFXGXIXSXSXGXAXVXVXGXAXAXSXGXVXVXAXGXFXVXBXhXM.M.F.L.U.L.L.L.L.L.U.L.U.L.L.L.Y.L.T.U.Y.P.Y.P.U.T.U.U.U.T.P.P.T.Y.T.P.Y.L.U.U.U.L.L.U.U.L.Y.L.L.I.L.L.L.L.U.P.L.P.L.U.U.L.U.U.U.T.P.T.T.I.T.T.T.T.T.T.~.T.T.T./.T.~.T.~.T.T.T.T.P.T.L.P.P.Y.U.L.L.L.L.L.U.U.U.U.U.I.T.Y.~.T.~.T.~.~.T.~.~.!.T.T.U.Y.~.~.I.~.I.I.Y.~.~.~.T.T.~.T.~.~.T.~.!./././.(.(._.(._._._.|._._.`.|. X_._.|._.|._.",
+"C C C C F C C C Z C C Z C C Z Z C Z Z C C Z Z C Z C B D C F Z C Z C Z Z Z C Z C Z C A C C F Z C F C Z Z C Z Z F D C F Z F H Z Z Z Z D Z D D D Z Z D Z F Z Z Z Z H Z Z Z C Z Z D F Z H H Z Z D H F H H D H H H H H H L L L L L J P L L P P L P L L P J P P P J P P P P P J I J P I J ( P I P I I J I ) J J I J I P J I P I P L P P P P P L I P P P I I P P I P U [ T A.A.l.l.l.l.l.l.A.g.l.l.l.h.l.l.g.l.l.A.l.l.h.A.A.h.A.A.A.A.A.A.A.h.A.S.A.S.G.A.Z.J.A.H.H.H.S.H.H.H.H.L.H.L.L.L.L.L.I.Y.T.T.T.T.T.~./././.~.(./.(.(.~._.(.^.(._._.`._._._._.`._.^.`.`.(.`.(.{.(.(.(.(.(.(.~././.~.!.!.T.~.~.T.R.P.Y.P.P.P.Y.P.Y.L.Y.F.P.U.P.P.L.U.L.H.L.L.L.L.U.L.U.L.L.L.L.P.D.L.L.L.L.L.L.L.L.L.L.L.H.S.S.K.H.S.G.A.S.H.H.A.h.A.A.A.A.j.A.g.A.g.A.g.A.A.A.h.A.h.S.h.A.A.A.A.A.A.A.l.A.l.l.g.Z.A.g.g.g.l.g.l.l.g.g.l.A.l.l.l.l.g.h.k.f.h.f.g.k.g.g.g.k.z.k.z.h.k.h.h.h.h.l.k.h.h.z.g.g.d.z.k.k.k.g.k.d.k.z.i.g.k.k.i.d.a.k.a.a.a.z.a.i.g.i.a.a.g.a.a.k.a.a.a.g.f.a.f.a.a.a.a.a.a.a.f.f.f.f.k.k.g.g.d.g.g.z.g.f.g.g.g.g.g.g.g.k.k.k.h.h.z.a.g.f.f.k.k.f.i.k.i.a.a.a.a.a.a.a.a.a.a.a./ / S ZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXDXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXDXDXAXDXFXFXFXFXFXFXAXFXDXDXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXAXFXFXBXm.[ ! ^ [ T.T.T.T.T.T.T.T.T.T.T.U.T.U.I.I.T.Y.U.U.T.U.U.U.T.T.P.T.T.T.T.T.T.T.T.T.P.P.P.P.L.L.L.S.L.H.L.L.L.L.L.S.L.L.L.L.L.D.U.G.L.L.L.S.L.L.L.L.S.L.U.H.H.H.S.S.A.H.H.A.h.A.A.k.x.GXIXGXIXFXFXAXAXFXDXZXFXFXDXAXDXFXAXFXAXDXZXAXAXDXDXDXFXFXFXFXFXFXFXFXAXBXgXm.M.n L.H.S.L.L.P.L.L.U.L.P.P.Y.Y.P.P.U.U.P.Y.L.P.Y.T.U.T.T.T.P.U.T.T.T.U.T.T.P.L.U.U.U.L.L.L.L.L.R.K.L.I.P.P.L.P.L.Y.L.U.L.L.U.U.U.U.U.P.U.T.T.T.T.T.T.T.U.~.I.T.T.~.T.~.T.T.T.Y.T.P.P.Y.Y.U.U.L.R.L.L.L.L.Y.U.U.U.U.T.Y.T.~.T.T.T.T.~.T.T.T.T.T.~.~.U.T.T.T.T.T.~.T.T.T.T.~.T.T.T.~.T.~.~.~././.(.(.^.(.(.^.|.[._.}.}.}.`.`._.`.|.|.|.|.",
+"C C C B C C C C B C C C Z C C B Z A D Z Z Z Z Z Z C Z Z C Z A C C Z C A Z Z C Z Z Z D F D Z A Z Z D Z C F Z A C Z F Z Z Z Z Z Z F Z D Z Z Z Z Z D D Z C D Z Z Z D A D Z H Z A Z Z F Z Z H F H Z D H H F D H H Z H H H H H L J L L L L S L L L P J L J J P L J P P P P P P P ) P J ) P P J ) P P J ) I J I P I I I I P P I P I J P L L P L I P L L L I L P L P U T Z.g.l.g.A.l.l.z.l.g.A.l.l.Z.h.l.l.l.l.g.l.l.g.A.h.h.A.g.A.A.g.A.A.A.S.S.S.G.A.A.H.G.S.S.H.S.H.L.H.S.L.H.L.L.L.L.L.L.L.U.Y.T.R.T.~.~.T.~././.~.(.(.(.(.^.~._.{./.^.^.|.{._.(.^._.(.{.(.(.(.(.(.(.(.(./.(.~.(.(.~.~.~.T.T.~.T.T.T.R.Y.P.Y.T.U.P.Y.L.Y.Y.U.U.U.L.L.L.L.L.Y.L.L.L.P.J.Y.L.L.L.L.L.P.P.P.L.L.U.L.L.L.L.L.H.Y.S.L.L.G.H.A.G.H.h.A.A.A.A.A.A.A.A.A.h.S.j.Z.g.A.A.h.g.A.A.A.A.G.A.A.A.A.h.G.z.h.A.h.A.A.g.g.A.D.l.l.l.l.l.A.l.l.g.h.h.l.k.l.f.k.g.f.f.k.k.f.k.g.k.k.k.g.h.h.z.h.k.g.z.h.h.h.h.g.g.g.g.k.k.g.k.k.z.i.a.z.i.i.k.i.k.f.i.a.a.a.i.i.z.i.g.z.a.a.z.f.a.z.f.a.d.a.f.a.f.a.k.k.a.f.f.a.z.f.f.g.k.k.k.g.z.a.f.f.f.f.g.d.g.g.g.g.h.h.h.k.h.l.z.g.k.f.f.i.a.g.d.k.a.a.i.a.i.a.a.a.a.a.a.P / ! BXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXAXAXDXDXFXFXFXFXFXFXDXFXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXCXm.} / S [ U.Y.T.Y.T.T.T.T.Y.T.T.T.U.T.U.T.U.Y.Y.U.T.P.T.T.T.T.P.T.T.T.T.T.Y.T.T.P.Y.P.P.P.U.L.L.U.H.L.L.L.L.L.L.L.S.L.S.L.L.L.L.L.L.L.L.U.L.S.H.L.U.L.H.H.H.H.A.H.A.A.A.A.A.A.A.z.g.IXGXIXGXFXAXDXAXFXFXAXFXAXDXDXSXFXAXAXFXDXZXSXFXFXAXAXAXAXVXFXVXFXAXFXAXBXhXm.v.c S.L.L.L.L.S.S.L.L.P.P.L.L.L.P.P.P.U.U.Y.U.T.T.T.T.T.U.P.P.T.P.T.T.T.P.T.T.T.L.L.U.L.U.L.L.L.L.U.L.Y.P.P.U.U.L.L.L.Y.P.P.U.L.U.U.T.L.T.U.T.T.T.T.T.T.~.I.~.~.T.~.~.T.T.Y.T.T.T.L.P.P.U.U.L.Y.L.L.L.Y.Y.L.U.L.U.Y.L.Y.Y.T.T.T.~.T.P.T.T.T.P.Y.T.Y.Y.~.~.T.T.T.Y.T.T.T.T.T.T.~.T.T.~.~.~.~.~./././.(.`.(.}._.}._.|.}. X`.`.|.|.|.|.|.|.",
+"Z C C C C C C B C B C C C F F C Z Z V Z Z Z Z C Z C Z C Z C Z Z Z A Z Z Z A A C C Z Z C Z C Z C C Z C Z Z C Z Z Z Z Z Z Z Z F D Z Z D C F Z D Z D D Z Z Z Z Z Z Z Z H C F Z H Z Z Z Z Z D Z F H Z D D H H D H K H H H H L L H H L L P S P L P L J J P J L J P L P J J J J I I P I I J ) I J I P I J ) J P I J I J I P P P P L P L P P P L P J U P P L L L P I ) [ d.g.A.g.g.g.A.A.l.l.A.l.l.g.Z.l.A.g.l.A.l.l.A.l.h.Z.h.A.A.A.A.A.A.A.Z.A.S.S.S.H.G.S.S.H.H.H.H.S.H.L.H.L.H.H.L.L.U.U.T.U.T.Y.T.Y.R.T././.E.~.^././.(.~.(.(.(.(._.^.{._._._.(.`._._.^.(.(./.(.(.(.(././././.^.~.~././.~.~.T.T.T.T.Y.U.U.Y.U.U.Y.L.L.L.L.L.Y.P.L.L.L.Y.P.L.P.L.L.L.L.L.U.L.L.L.L.L.L.L.L.L.L.D.L.H.L.L.L.L.S.H.S.H.S.S.S.A.J.A.A.G.G.A.A.A.j.A.j.g.A.j.h.A.g.A.h.A.h.h.A.A.A.l.A.A.h.g.z.h.l.Z.h.h.g.h.h.z.k.k.A.g.g.l.l.g.l.l.h.l.l.h.h.h.g.z.k.f.f.f.f.f.k.f.k.z.a.l.g.h.l.l.h.h.h.h.h.g.h.g.g.k.k.k.f.f.i.k.a.i.k.i.f.k.a.a.k.z.f.z.i.i.z.a.a.a.g.a.i.a.x.k.a.g.a.g.f.f.f.a.a.a.f.f.f.f.f.f.x.k.g.k.k.k.k.d.g.f.f.g.g.g.g.g.g.g.h.h.h.h.h.z.h.g.f.f.f.k.f.k.k.i.a.a.a.i.a.i.a.a.a.i.i./ ! ! ZXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXAXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXGXFXFXFXFXFXFXFXFXFXFXDXDXGXSXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXDXAXSXDXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXSXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXZXDXBXQ.[ / ~ c.T.T.Y.T.T.T.T.T.Y.T.T.T.T.T.I.I.U.T.I.U.T.T.T.P.T.T.T.P.P.T.T.P.T.T.P.T.Y.P.L.L.P.P.L.L.L.G.L.L.S.L.L.S.U.S.L.L.L.L.L.U.U.U.L.U.L.L.L.L.L.S.H.H.H.A.H.S.G.G.A.A.G.g.k.l.x.PXIXGXGXGXFXZXAXAXZXFXFXSXDXSXDXZXZXDXFXFXDXAXDXDXZXSXAXAXFXAXVXFXAXAXFXBXaXM.8.c S.L.D.H.S.P.L.L.S.P.L.P.P.P.P.P.T.U.Y.T.T.T.U.T.Y.T.Y.T.T.T.T.T.T.T.T.Y.T.P.U.Y.L.T.L.L.L.L.L.U.L.U.U.U.U.L.L.L.U.L.L.L.U.L.H.U.P.P.U.U.U.T.T.I.I.T.~.I.I.~.T.~.~.T.~.T.T.Y.T.U.U.L.U.U.P.L.L.L.L.L.L.L.L.Y.U.T.T.T.T.T.T.T.T.T.^.T.T.T.T.~.T.~.Y.Y.Y.T.T.T.T.T.T.T.~.T.~.T.~.T.~.T.~.~./././.(./.(.|._.|.}.}.|.}.|.`.`.|._.|.@X|.|.",
+"C C C Z C C C u C C C C C C A C C Z F Z Z C Z Z C Z Z A A Z C Z Z F C Z C Z Z D C F C C D Z D C Z F F Z C Z F Z Z A Z A Z D Z Z D F Z Z Z Z Z C Z C G Z Z Z Z Z Z D Z Z Z Z Z Z H Z F H Z F Z A D D D D Z H D H Z H H H H L H J L L L L L L S P L L L L J L J P J P J P P P P J P P P J J I P P J I I I I P I J I I P P U I L P P L P L L P L P P P P P P L U T T j.Z.g.A.g.Z.g.l.g.A.g.l.l.g.g.Z.g.A.g.g.A.A.l.h.A.l.A.l.l.A.A.h.G.A.A.S.A.A.H.S.S.S.S.H.S.H.S.S.L.D.H.L.H.L.L.L.L.U.U.Y.I.T.Y.Y./.T.~.Y.T.~.~.(./.^.^.(.(.^.(.^.(.(.^._.{.`.^._.{.^.(.`.^.(.~.(.(.~././.!.~.^.~.~.~.T.T.T.T.T.U.U.U.Y.U.Y.U.L.K.Y.Y.L.U.L.H.Y.U.L.L.L.P.Y.Y.L.H.U.H.L.L.L.L.L.L.L.L.L.L.L.U.L.L.L.L.L.L.L.H.L.S.S.S.S.G.A.H.A.A.j.A.A.S.A.h.A.A.A.h.A.g.A.A.A.A.A.A.A.g.h.G.A.A.A.A.A.A.h.z.A.g.A.h.z.A.d.k.z.A.g.g.g.h.h.g.z.z.l.h.z.k.f.k.k.f.f.k.f.k.k.f.k.h.z.l.z.z.h.l.z.l.l.h.h.h.h.g.g.k.k.k.f.f.k.a.a.f.i.f.i.i.z.a.a.i.i.i.i.g.a.i.g.a.a.a.f.a.a.a.f.a.g.f.a.a.a.z.a.f.a.a.a.f.f.i.z.k.g.k.k.k.g.h.a.j.i.j.f.g.g.g.g.h.g.h.h.f.h.h.h.g.k.z.f.f.d.i.k.a.a.a.a.a.a.a.a.a.a.f.i.S / S CXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXDXFXFXFXFXFXFXAXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXDXAXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXZXFXDXZXZXZXBXpX{ ! ~ [ Y.U.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.U.T.T.T.P.T.T.T.T.T.T.Y.T.P.T.P.Y.Y.P.P.U.Y.U.U.P.U.A.L.L.L.G.S.L.L.L.L.L.L.L.L.L.D.P.U.S.P.P.L.L.L.S.L.U.D.H.H.H.S.A.A.A.A.A.h.A.z.z.a.GXIXGXGXGXFXFXFXFXAXAXDXDXDXZXDXAXZXZXAXAXAXDXAXZXZXDXHXFXFXFXFXFXFXFXGXMXaXM.{ n S.S.S.H.U.S.L.S.L.P.P.L.U.P.T.Y.T.P.Y.T.Y.T.T.T.T.T.U.T.U.T.T.T.T.T.T.T.P.T.Y.L.L.T.L.U.L.Y.L.U.L.I.L.U.L.U.P.L.U.L.L.L.U.Y.P.P.P.P.U.I.U.I.I.T.T.Y.Y.Y.~.I.T.T.~.~.~.T.T.Y.Y.Y.U.Y.L.U.Y.L.L.L.U.U.U.L.U.L.U.U.T.T.!.T.T.T.T.~.P.T.~.Y.T.~.~.Y.I.~.T.T.T.I.T.T.T.T.T.T.T.T.T.~.~.Y.~.!./.^.(.(./.(._.(._.}.}.}.}.}.`.|.|.|.'.|.|.|.",
+"D C F B C C C C C C C C Z D C Z C Z C Z B D F C Z D F B Z C Z C C Z Z C Z Z A Z C Z Z C C C Z A Z Z Z F C Z Z Z F C Z Z F F Z Z Z Z Z Z Z Z Z Z Z Z F Z Z F Z Z Z Z Z Z Z Z Z Z Z F D Z Z Z F K F Z H D L Z Z D H H Z L L L H H H L L L L L L L L L J L L J L L J L J P P P P J P P P P P P P I J ) I I J I J I J P P P P P L P L P P P L P P L L P P L P L U T Z.j.A.g.Z.l.Z.h.l.A.Z.A.g.l.A.A.A.A.A.g.A.l.l.A.A.h.A.A.A.A.A.A.A.A.S.A.G.Z.H.A.S.A.S.S.H.Z.H.H.H.S.L.H.L.H.L.L.L.Y.L.L.P.Y.T.T.Y.R.T.T.~.~.~.!.!./.T.(.(./.E.(.(.^.(.`.{._.`.~._.(./.^.^.(.(.^.(.(.(././.~.~.~.~.~.T.~.~.T.T.T.P.Y.Y.P.U.Y.P.P.P.P.L.L.L.L.Y.L.L.U.L.Y.D.U.L.L.L.L.L.L.H.K.H.L.L.F.L.Y.D.L.Z.Y.L.S.L.H.S.H.S.S.L.S.S.A.Z.A.G.A.A.A.A.A.A.h.h.A.g.A.h.A.A.h.h.A.h.A.A.h.A.A.A.h.k.S.h.H.z.h.h.g.z.D.k.l.k.l.A.k.g.g.k.g.d.D.g.g.g.z.h.k.k.f.f.f.f.k.f.i.z.k.g.g.k.h.k.h.k.l.h.h.h.A.h.h.h.k.g.g.g.k.d.k.i.z.i.k.k.a.k.a.k.a.k.a.i.a.i.a.a.a.a.z.a.a.k.a.a.g.f.f.g.f.g.i.a.g.a.k.f.z.a.f.f.a.g.k.h.k.k.k.z.a.g.f.f.f.f.f.g.j.g.l.g.h.l.z.h.f.h.h.k.k.g.d.a.i.f.i.a.a.i.a.i.i.i.k.a.i.i.f./ / S CXSXDXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXDXAXFXFXFXFXFXFXFXFXFXDXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXZXBXm.} ! ! [ T.U.T.T.T.T.Y.T.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.Y.Y.T.P.T.T.P.T.Y.T.P.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.P.L.L.L.L.S.U.F.L.L.Z.L.H.G.G.S.H.A.h.A.h.A.g.h.z.IXGXGXGXGXDXDXFXAXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXBXJXM.{ x Z.G.L.H.U.S.H.L.H.U.U.P.P.P.P.U.U.T.T.Y.T.T.L.U.R.U.U.T.U.T.T.T.U.~.T.T.U.T.Y.Y.Y.H.U.T.L.L.U.U.U.U.T.U.T.U.G.U.[.L.U.U.L.U.Y.U.P.P.U.U.I.I.T.T.L.T.U.T.U.P.T.T.T.~.[.P.T.T.~.U.U.T.L.Y.H.I.I.L.U.L.L.Y.T.L.T.~.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.T.Y.Y.T.T.T.T.~.T.T.T.~.T.~.~.E././././.(.(.|.(.(.|._.}.}.}.}.}.}. X X|..X.X.X",
+"C C C C C C C C A C C Z C B C Z C Z Z Z C Z Z C C C A Z B Z C Z Z A C Z C Z D C Z Z A Z Z Z Z Z Z A Z A Z F C D Z Z F Z C Z C Z C D F C Z Z C G C Z C Z Z F A Z S C Z A Z Z Z F Z A Z F Z D Z Z H Z A Z Z Z K H H Z H H H H H H H H L S L L L L L P H J L L J J J P L P P P J P P P P P P P P I I J J I I I I J P P J I L P I P P P L P P L L P P U L P P P [ T [ j.g.g.g.g.l.l.l.l.h.h.l.A.l.l.g.g.A.g.A.l.l.A.A.A.l.A.Z.A.A.A.A.A.A.H.A.G.A.S.S.H.S.H.H.L.H.H.L.H.H.L.H.L.H.L.L.L.L.Y.U.Y.T.T.~.T.T.~.R.~.~.T.)./././.(.(.{.(.(.(.(.(.^.(.~.`.^.(.~.~.(.~.(.~.^./.T./.~./.~.~.~.T.T.~.P.T.Y.Y.P.L.P.Y.P.P.L.L.P.L.P.L.L.P.L.P.L.U.L.U.L.U.L.L.Y.L.L.L.L.L.L.L.L.D.L.L.L.L.D.P.U.H.K.H.U.H.L.S.H.S.S.S.F.A.A.A.A.A.A.h.A.A.A.j.h.A.A.h.A.A.G.h.A.A.A.A.l.A.A.A.h.z.h.z.h.z.h.h.l.l.g.z.g.k.k.k.g.g.g.g.k.g.z.k.k.z.z.k.g.g.f.f.f.f.f.k.g.g.g.g.k.k.l.k.l.h.h.h.h.h.l.l.h.h.g.g.k.g.f.f.k.i.a.a.i.a.a.i.a.i.a.a.a.a.z.a.a.a.a.a.a.a.a.a.f.i.f.f.f.g.a.f.g.a.k.i.a.z.i.f.f.z.f.k.k.k.h.f.f.f.f.f.f.f.f.g.g.g.h.f.j.g.h.h.h.h.h.h.k.k.a.g.g.z.k.i.a.a.a.i.i.i.i.i.a.a.i.i.S ! / ZXZXZXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXZXZXBXm.[ ! ! M.T.Y.P.T.T.Y.P.[.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.Y.P.P.P.P.P.P.P.U.U.L.L.L.L.L.L.L.L.L.L.L.L.L.L.U.L.P.L.H.U.U.L.L.L.L.L.L.A.L.L.H.H.S.S.S.S.S.A.G.h.G.l.G.GXGXGXGXGXDXAXAXAXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXMXaXM.' c G.H.S.H.H.H.H.L.L.S.L.P.L.L.U.U.P.P.P.T.T.T.R.].!.!.T.].K.T.U.T.Y.Y.!.T.I.I.U.U.L.T.P.S.U.T.U.U.U.U.Y.S.Y.L.U.T.F.U.F.L.U.H.Y.U.P.A.L.U.I.Y.L.I.U.U.P.].T.].T.[.T.~.~.Y.~.T.U.T.P.U.L.L.I.K.K.I.L.L.H.K.Y.U.Y.L.U.P.T.T.T.T.T.T.T.T.T.T.T.P.T.T.P.P.T.Y.Y.U.T.Y.T.T.T.T.T.~.T.~.~.~.~././.(.(.^.{.(._._.{._.}.}.}.|.}.}.|. X|. X.X|.",
+"Z C Z C C A Z V C F C C B Z C C A Z Z C Z Z C Z Z Z C Z D C Z C Z A Z C Z C Z D Z Z Z Z Z Z Z C Z C C Z Z Z Z A C Z Z A Z C Z F C C Z F C Z Z C Z Z Z A Z Z Z Z A Z Z Z Z A F A F Z Z Z D Z A D Z D D Z Z H Z J Z H S H Z H H H H H H L L L L L L L L H P J J J L P J P J J P P P P P P ) J P J P I P P I J P P Y P P P P P L L P P I L L P P J L P P L L L T [ d.j.Z.Z.g.g.l.A.A.l.A.l.l.l.Z.g.A.A.A.A.A.A.A.g.A.A.A.A.A.A.A.A.A.A.A.A.H.H.H.S.H.S.H.H.H.H.H.H.L.S.L.S.K.H.H.L.L.L.U.U.U.Y.Y.T.R.Y.T.T.~.T.T.~.!.~.~.(.^.(.^.~.(.(.(.(.(.~.(.~.(./.`.[./.^.~.(./.(././.^.~.~.~.T.T.~.Y.T.Y.T.Y.P.Y.P.L.P.Y.P.P.Y.P.L.Y.L.P.L.L.U.U.L.U.L.L.L.L.U.S.Y.H.H.L.H.H.P.L.L.L.F.L.P.L.S.L.K.H.S.L.S.H.S.S.S.S.A.H.A.A.h.A.j.A.h.h.W.A.A.h.A.A.h.A.h.A.h.A.A.A.l.A.A.A.A.h.l.l.l.h.h.g.z.k.k.Z.A.A.d.z.z.g.g.z.g.l.h.D.h.k.k.k.f.k.k.f.f.f.f.f.k.k.g.g.h.k.h.h.k.g.h.h.h.h.h.h.h.k.g.g.f.k.f.f.i.z.a.a.i.i.a.k.a.a.a.a.a.f.i.i.a.a.a.a.a.g.a.a.f.a.a.f.f.a.f.f.a.g.k.f.i.f.k.k.a.g.g.f.k.k.z.f.a.g.k.k.f.l.k.g.g.g.g.h.h.h.h.h.g.k.f.g.k.z.k.k.a.f.i.f.a.a.a.a.i.a.i.i.a.i.k.i./ ! S ZXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXGXFXFXFXFXAXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXAXFXDXAXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXFXFXDXDXGXSXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXAXZXDXHXQ.{ ! ! c.T.T.T.T.T.T.Y.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.Y.T.P.Y.P.Y.P.P.T.Y.P.P.U.L.L.L.L.L.L.L.L.S.L.L.K.L.L.L.L.P.L.P.L.L.L.L.L.L.L.S.L.L.D.L.H.H.H.S.G.S.A.Z.A.A.A.g.z.IXFXPXGXGXDXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXCXaXM.n c G.G.S.S.H.L.H.H.S.L.P.U.P.L.L.U.U.U.P.T.P.T.Y.H q = = q I ~.(.].U q : * > J !.!.Z ; : ; : y : : : : y !.L.Z = > t q t : y G b.Y.L.T.L.` y 0 y ` U.I.Z y = q b.T.T.T.n.q : y Z F.P.L y > y y U K.G.L.P 0 y 0 ; Z ].[.T.Y.T.T.T.T.T.T.T.T.oXP.T.T.T.T.U.U.T.Y.Y.T.T.T.T.Y.Y.T.~.T.[.~.!.[.[.(.(.(.(.(.(._._.}.}.}.}._. X}.|.|.|..X|..X",
+"C Z C F C C C C C C C C C C Z C Z C Z D C Z Z C Z C Z Z C Z D B C Z C Z C D C B Z D C Z Z C Z D Z Z Z Z Z Z C Z C A F C Z Z Z C F C u C F C u F Z A Z Z C Z C Z F Z Z Z Z Z Z Z Z Z A Z Z F Z Z H Z Z Z Z H Z H H Z Z H H H H H H H H L L H H H L H L L J L J H P L P L P P P J P P P P J P I P P P P P L I J P L L I L J P P P L L L U P P L L L P L L ( U U T g.Z.g.g.l.Z.g.A.g.g.Z.A.l.A.A.A.g.Z.A.A.A.g.A.l.l.l.l.A.A.A.A.A.S.A.S.S.S.A.A.H.H.S.A.H.H.H.H.H.S.L.S.L.L.H.L.L.L.L.U.L.U.Y.Y.T.Y.R.R.Y.!.~.~.^.T.T.!.T.(.^.(.~.(.(./.(.(.(.(.^.^.^.(.(.~.E.^.E./.T./.R.~.T.~.E.T.~.T.Y.T.Y.U.I.U.P.U.L.L.L.P.L.H.P.P.L.L.L.L.P.H.L.K.U.L.L.Y.L.L.L.S.L.L.S.L.H.S.S.S.H.D.H.S.D.H.H.H.H.S.H.S.H.H.S.S.S.S.A.A.A.A.A.A.A.A.h.j.G.Z.h.h.h.h.A.h.Z.A.A.A.z.A.h.z.h.h.h.l.l.h.h.h.h.k.A.z.k.k.g.z.k.z.g.g.g.g.z.l.g.k.l.l.k.g.k.f.f.f.f.f.f.g.f.f.g.g.k.z.d.z.l.g.z.l.l.l.l.z.g.g.f.f.f.f.d.k.z.a.a.a.a.a.a.a.a.a.a.z.i.i.f.i.a.a.a.a.a.a.a.a.z.k.f.g.a.f.g.a.g.k.a.g.f.g.a.f.f.j.h.k.k.j.f.z.a.k.k.a.z.k.k.g.f.h.k.h.k.a.l.g.g.g.g.k.k.k.a.f.i.k.i.k.a.a.a.i.i.k.i.a.i.k.i.S / / CXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXDXAXDXAXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXCXBXpX[ / ! [ T.U.T.P.T.T.P.!.T.~.T.T.T.~.T.~.T.T./.T.~.T.T.T.T.T.T.T.T.T.Y.T.P.P.P.T.T.Y.P.P.Y.U.Y.L.L.L.K.L.U.U.L.L.L.L.L.L.P.P.P.L.U.U.L.L.L.P.L.L.L.D.L.S.H.H.H.H.G.S.S.A.g.H.h.h.x.GXIXGXGXFXDXFXAXAXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBXaXM.{ c G.G.S.S.H.G.H.H.L.L.L.A.L.L.U.L.P.U.T.P.U.T.E.Z ; e : 0 A L.T.K.A : 0 e > Z T.T.A e 0 q 0 * y r y * : T.U.Z r r : * 0 0 q 0 q U F.T.L.T 0 ; = [ T.I.S e 0 q n.U.T.[.b.= : y A !.^.Z y = : : u K.U.L.u 0 = r : Z U.L.Y.P.U.T.T.T.T.T.T.T.D.hXT.T.T.T.T.T.T.Y.U.T.Y.U.T.Y.T.T.Y.~.!.~.~.~././.(.^.(.[._._.^.}.}.}.}.|.|.}.}.}.|.|..X.X",
+"Z D C C Z C Z C C C C C C C Z Z Z C Z B Z C A C C Z C Z D Z B Z Z Z Z Z Z B C F B D F D Z C Z Z Z F Z Z Z Z C C C Z Z A C C F A Z C F Z F Z F Z Z C C Z Z A C C Z Z A Z Z F F Z Z Z Z Z Z Z Z F Z A D D D Z D Z H Z H Z H Z L Z H H H L H H L H H H J H L L L J P L L J J J P P P P P P P P K Y P J I P I P P P P L P P P J P P I L P P P P L P J P P L L U T e.d.Z.g.Z.Z.l.A.Z.Z.h.l.l.A.l.Z.l.A.A.A.l.A.A.l.A.A.A.A.Z.A.A.A.A.A.A.S.S.S.H.A.S.S.W.H.H.H.S.H.H.H.L.L.S.H.L.H.L.L.H.Y.L.Y.U.U.P.Y.R.T.T.T.~.T.~.E.!.T./.~.~././.(.!.(.(./././.(.^./.~./.^.~.(.~./.T.T.~.T.~.T.T.T.Y.T.U.U.T.Y.Y.U.L.L.L.U.U.U.P.U.P.L.U.U.Y.U.L.U.U.Y.H.L.U.L.L.S.L.S.Y.L.H.H.S.D.L.H.H.H.H.H.H.L.S.H.H.G.S.S.S.S.S.S.S.S.A.A.z.A.A.A.A.A.h.h.j.h.A.h.A.G.A.A.A.A.z.A.A.A.z.l.h.h.h.l.h.h.h.h.h.l.k.l.k.l.k.k.k.l.l.k.g.g.h.z.g.g.g.g.f.f.g.d.k.f.f.f.f.f.f.g.g.g.g.g.g.A.d.l.k.h.l.h.h.k.k.g.g.f.f.k.i.d.z.a.a.k.a.a.a.a.a.a.a.k.a.k.i.a.a.i.i.a.i.a.a.a.a.g.f.a.i.g.a.f.f.f.k.a.g.f.g.f.j.x.a.j.z.z.f.g.k.k.k.z.k.k.h.g.g.g.g.g.g.g.g.g.g.g.g.k.k.k.f.a.a.k.a.i.i.d.k.i.i.f.i.a.z.a.k./ / S ZXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXDXDXSXGXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXDXFXAXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXAXBXQ.' / ! m.U.T.T.T.T.^.P.T.~.T.T.~.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.T.P.T.P.P.T.P.T.L.L.L.U.L.U.U.L.P.L.L.U.L.U.U.U.K.L.U.L.L.L.U.L.L.L.L.L.L.U.H.G.H.S.H.G.S.S.S.A.H.A.A.A.IXGXGXGXGXAXAXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXVXBXaXM.{ n G.Z.S.S.G.H.H.H.L.L.D.L.L.L.L.L.U.U.P.T.T.P.Y.A r ; ; : q F.T.F.q : ; e e Z T.Y.Z ; e e e ; : * r > q Y.L.Z 0 e y 0 ; r : > * 0 b.L.T.T 0 r 0 T Y.U.S 0 r r Z.~.T.T.n.r ; ; Z T.U.Z 0 0 r r 0 A.H.L.: y : e ; S Y.U.Y.T.U.Y.U.T.U.T.P.T.T.T.T.T.T.T.T.T.Y.P.T.U.Y.Y.T.Y.T.Y.~.~.~.~.^././.(.[.(.(.(.(._._._._._._. X[.|.}. X|. X|. X",
+"Z B Z Z C Z C Z C B Z C C D Z C Z C A F C Z Z D Z A B Z D B D Z Z Z C Z Z D Z Z Z Z B Z Z Z Z Z Z Z Z Z Z Z F Z Z F C Z Z C F Z C Z A C C C C C F F C C Z F Z F A Z Z Z Z A C Z Z C Z F Z Z Z D Z Z F Z Z Z D Z Z H Z Z S Z Z L H H H S J H H J H J J H H J H J L P L L J J J J P P H P P P P J I P P L J P P P P P P P P P U P L L P P L P L P J U P P I I Y b.Z.g.g.g.g.l.l.g.A.l.l.A.A.h.A.A.A.g.A.A.Z.A.A.A.A.l.A.A.A.A.A.A.S.S.A.H.S.S.S.G.S.S.H.S.H.H.H.H.L.S.H.L.S.H.L.L.L.L.P.H.L.P.Y.Y.R.R.Y.T.T.T.~.T.T.T.~.T./.~././.~.(./.(./.(.T././.(.~.E.~.T.~.T.T././.T.~.T.T.T.~.T.T.Y.U.U.L.L.Y.U.L.L.H.L.H.L.P.L.L.U.L.L.L.L.H.U.H.L.L.H.L.U.L.L.U.S.S.L.H.L.H.H.H.H.H.H.S.H.S.G.H.A.H.G.S.S.S.A.S.S.S.A.A.A.A.A.A.A.A.A.A.A.h.h.A.A.A.g.A.h.h.A.l.A.A.A.l.l.h.h.h.k.l.l.l.h.k.z.g.A.l.k.Z.k.k.d.A.g.g.g.g.g.g.g.g.f.f.f.f.f.f.f.k.k.f.g.f.g.g.g.g.g.k.g.l.l.l.l.h.z.h.k.k.k.k.f.z.i.i.i.a.a.i.a.a.a.a.a.a.a.i.i.i.i.i.i.i.i.i.a.d.g.a.g.a.a.g.g.a.g.f.a.f.f.a.z.z.a.f.j.j.f.f.f.a.a.k.k.k.k.k.z.h.k.g.g.g.g.g.g.g.g.g.g.z.f.k.k.k.f.z.z.i.a.a.k.k.i.f.i.k.i.a.i.a.a./ S ! CXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXAXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXAXDXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXZXZXBXm.} ! ! [ Y.U.Y.T.T.T.Y.^.T./.T.!.T.T.~.~.~.~.~.~.~.T.~.T.T.T.T.T.T.T.Y.T.T.P.T.T.T.P.P.T.I.L.U.U.L.L.L.L.P.L.L.P.U.L.L.U.U.R.L.L.L.I.L.L.L.L.U.L.D.U.D.H.H.H.H.H.H.A.S.S.A.G.A.h.l.GXIXGXGXFXGXFXAXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXVXCXaXM.c c S.H.G.S.S.S.S.G.L.S.L.L.L.L.L.L.P.P.P.T.T.T.!.A r e t ; ; b.P.[ 0 > y * r Z T.T.H r = q b.T.~.(.T.U.].P.Y.Z 0 e : b.K.Z.G : * 0 u L.T.[ ; : ; [ U.T.Z : e > b.[.T.[.Z.; > e S ~.T.K r > y e ; b.U.[ r y r : ; Z U.U.P.P.T.U.T.U.T.U.T.T.T.T.T.T.T.T.T.P.T.T.Y.T.U.T.T.T.T.~.T.~.~.~.^./.~.(.(.(.`.^.(._._._._._._._.|._.}.}.|. X.X|.",
+"Z C C C C C Z C F C Z C C C C Z Z Z Z Z Z A Z B A Z D C Z Z Z D Z Z Z Z Z Z Z Z Z Z Z Z Z D Z Z Z F Z Z C Z C Z A D Z C Z C C Z C Z Z C C Z C A A Z Z A C Z F C C Z C F Z Z C Z A Z C F A Z F Z Z Z H Z Z D Z H H Z Z H H Z L L H L H H H H J H H H H H J H H J S P J J L P J P P J P P P P I I J I I P P P P P P P P P L P P L P L P L U P P L P P P P L ) [ d.j.Z.Z.g.A.g.Z.g.A.g.A.A.Z.h.l.A.A.A.A.A.A.A.A.A.A.l.A.S.A.A.D.A.S.A.A.A.A.H.Z.H.A.H.H.Z.H.H.S.H.S.H.L.K.K.H.L.H.L.L.P.Y.Y.Y.L.U.L.Y.Y.U.T.Y.Y.T.T.T./.~.~.~.~.~./.T./././.!.^.(./.^.~.~.~.~.^.~.T.T.E.T.T.R.T.I.Y.U.U.Y.U.L.U.L.L.Y.L.L.H.T.H.U.H.P.U.H.L.P.L.H.Y.H.L.H.F.H.U.H.L.U.S.S.A.J.H.H.S.L.H.H.S.H.D.S.H.S.H.A.G.S.S.H.S.S.S.A.A.A.A.A.A.A.l.h.A.h.j.W.h.h.h.A.h.h.h.A.A.A.A.l.h.h.l.h.k.z.l.l.l.l.l.z.g.g.k.A.k.k.l.l.k.k.k.k.f.g.g.g.g.f.g.f.f.f.k.k.g.f.f.k.g.g.g.f.g.g.g.k.k.l.k.k.l.l.k.k.k.g.k.d.i.d.i.d.k.k.k.a.a.a.a.i.a.a.a.a.i.a.a.s.a.i.i.i.a.a.a.i.i.a.a.z.a.f.g.f.k.k.k.k.z.f.k.f.k.z.f.j.f.f.f.x.k.k.k.l.k.h.k.k.g.f.k.g.g.f.g.a.g.a.g.g.k.k.k.z.i.a.i.i.i.f.i.z.i.k.f.f.z.a.k.k.P / ! CXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXDXDXDXAXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXAXFXFXDXDXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXBXm.[ / ! c.T.T.T.T.T.T.P.~.(.Y.~.T.~.~.R.~.T.~.~.T.T.~.T.~.T.T.T.T.T.T.T.P.T.T.Y.Y.T.T.T.P.Y.T.L.U.Y.L.U.L.L.L.P.P.L.L.U.L.L.U.L.L.U.L.U.U.L.U.L.L.U.K.Z.H.H.H.S.H.H.H.S.S.A.H.z.A.l.GXIXDXGXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXAXCXhXM.{ c A.H.G.G.h.S.S.S.H.H.L.L.S.L.L.L.U.Y.P.P.U.T.Y.Z 0 r L = = U U.U : q _ 0 e Z Y.T.J e : q Y [ T T T ` b.L.T.Z ; ; y b.P.P.].q r : q F.U.[ : 0 q ` I.!.F 0 q t b.T.T.~.n.* ; r Z Y.I.S 0 0 H t > U ~.H = y S = ; Z L.T.U.L.T.U.U.T.U.T.T.T.T.T.T.Y.Y.T.T.T.Y.Y.P.U.^.P.T.T.T.~.~.~.~./.~./.^.(.(.(.(.^.`.^.`._.|.|._._._._.|.|.|.|..X.X",
+"Z Z C Z C Z C C Z C C C Z D B Z Z C Z D B Z Z C Z C Z Z Z C Z B C Z B D C Z Z C Z Z Z Z Z D D Z Z A Z Z Z Z Z C D Z Z C Z C Z C C Z C Z F A F Z C C C F C Z Z A Z C Z C C Z A D Z Z C A F Z Z A F Z D Z Z Z Z Z Z Z Z Z H Z H H H H Z H H L Z J H J H H H H J J L L L L L P J J P L J P P L L J I J P I L P P L L P P L P P P P P L L P P L P P L U P P U U T b.j.j.g.g.Z.Z.l.l.h.Z.A.l.A.l.Z.A.A.A.A.A.A.A.Z.A.A.S.A.A.D.l.Z.A.A.S.S.G.H.Z.S.A.H.H.G.H.H.H.H.J.S.L.S.S.L.L.L.L.L.Y.L.L.P.L.Y.U.Y.U.U.Y.P.U.T.Y.T.T.T.~.T./.T.T.~./././././.T.~././.T.~.~.T.~.T.!.R.T.T.T.T.T.T.I.I.U.U.L.U.L.L.L.H.H.L.L.H.L.L.L.P.U.H.L.H.L.L.L.L.H.L.H.H.Y.S.S.S.Y.S.K.H.Z.G.S.S.G.Z.L.S.S.A.A.H.A.S.S.S.S.S.S.h.S.A.H.A.H.A.A.Z.G.G.h.W.A.A.A.h.h.h.A.Z.h.h.h.A.l.A.l.l.l.h.z.l.l.z.l.l.l.k.g.g.l.k.g.A.k.l.k.k.A.g.g.g.g.g.g.g.g.f.g.k.f.f.k.f.k.k.k.g.z.d.g.g.k.z.g.A.g.A.z.k.k.k.k.g.f.g.k.i.z.i.i.i.i.i.a.a.a.a.a.i.k.a.a.a.a.u.z.i.i.i.a.i.a.g.a.a.a.a.g.f.f.f.f.k.k.k.z.k.f.f.k.j.f.f.f.f.f.f.h.k.h.k.g.h.k.h.g.g.k.g.f.g.g.j.g.j.f.f.z.f.f.i.f.z.f.z.a.k.i.i.i.k.i.i.i.a.a.a./ / S CXAXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXDXDXAXDXSXGXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXGXBXQ.{ / ! [ U.T.T.T.T.T.T.T.T.T.T.T.~.T.~.~.[.~.T.~.~.T.Y.~.~.T.T.T.P.T.T.P.T.T.T.T.T.P.T.T.P.T.Y.U.U.Y.P.U.P.P.L.P.U.L.L.I.L.K.U.L.L.L.U.K.U.U.S.L.L.S.L.L.H.H.S.H.S.H.H.H.A.A.H.h.G.IXPXSXIXFXFXSXAXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXVXCXaXM.n c A.A.A.G.H.G.H.H.H.L.S.L.U.L.L.L.L.A.P.U.T.T.!.H r 0 [ y * C ].u > y T 0 r S Y.~.A : = : 0 > y e r y T L.T.A r 0 = Z.P.J.U.Z * e = Z.L.U y : : T L.U.Z > : > b.T.T.T.F.0 e r Z T.!.A r q ` : ; V K.u 0 r [ q : Z T.U.U.U.U.U.T.U.T.U.T.T.T.T.Y.T.P.Y.T.T.P.P.^.Y.T.P.T.T.T.T.~.T.~././././.(.(.(.(.|._._.(.`.(._._._._._._.|.|. X|.'.",
+"Z Z Z C Z Z C C D B D C Z B C Z Z C Z Z C Z C Z B D Z D Z Z Z Z Z Z Z Z Z L G Z Z L Z Z Z Z L L Z Z Z Z Z Z C C D Z Z C Z Z C C A Z Z Z C Z A C Z C C Z C Z Z Z Z C Z C Z C Z Z Z Z Z A Z A Z C Z Z Z Z A Z Z G D Z D Z Z H H D H H H H D H H H H J H H J H H J J L L J L P L P J P P L P P P P J L I U J J P L I P P L P P L P P P L L L P P L ( L P L U U [ z.Z.g.j.Z.g.l.l.Z.h.l.Z.A.Z.A.h.A.A.Z.A.A.A.Z.A.A.l.A.A.A.A.A.A.A.S.A.A.S.S.S.S.H.S.S.G.S.W.Z.H.Z.Z.L.S.L.S.L.H.H.L.Y.L.L.L.Y.L.U.U.Y.L.Y.P.L.P.P.P.T.T.T.T.~.T.~./.~.~.~.T././.^.~.~.~.~.^.T.T.Y.T.T.T.T.Y.T.Y.T.P.Y.P.L.U.L.Y.L.L.L.H.K.L.H.U.H.L.L.L.L.H.L.L.L.L.H.H.L.U.H.H.L.L.H.H.H.S.K.H.H.S.S.S.S.J.A.A.Z.G.A.G.A.A.J.S.A.G.A.G.A.A.A.A.A.A.h.A.A.A.A.h.h.h.A.h.A.A.h.h.D.g.h.l.l.l.l.l.l.l.l.A.l.l.z.j.h.z.z.g.h.g.z.g.z.A.d.k.l.k.k.g.g.f.g.f.j.j.f.j.j.j.h.k.h.f.k.h.f.l.g.g.l.A.g.g.z.h.f.g.j.g.a.s.j.a.k.k.a.a.a.a.a.a.k.i.i.a.a.a.a.a.a.a.a.a.a.a.a.i.i.i.a.a.a.a.z.a.k.k.a.f.f.f.f.f.g.g.g.g.d.d.z.d.g.g.g.k.k.g.z.g.g.f.f.g.g.f.z.k.k.f.f.f.f.f.k.f.f.d.k.a.f.g.i.k.d.f.k.d.k.d.k.z.i.a.g./ ! S CXZXFXAXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXSXDXDXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXVXZXBXQ.} / Q { T.U.T.T.T.T.T.!./.!.~.~.~.!.~.~.~.~.~.T.~.T.~.T.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.U.U.T.U.T.T.I.U.U.P.P.L.L.L.L.L.P.L.L.U.P.L.P.L.U.L.L.L.L.L.U.S.L.H.H.H.H.H.S.S.S.D.D.l.G.x.IXPXGXGXFXFXAXAXAXFXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBXhXM.{ c Z.A.S.S.S.S.S.S.A.H.L.S.S.L.H.L.L.L.P.T.S.P.Y.S 0 t [ D q : b.r ; P [ = r A ^.T.Z e : : r = y : : 0 T T.P.Z e ; > n.L.T.G.G y 0 y b.S.[ 0 : r [ U.P.S : t ; b.L.T.Y.b.= : e S T.T.S * y ` P 0 q b.y 0 H [ 0 : D !.S.P.P.P.Y.T.U.T.T.T.T.T.P.P.P.P.T.U.T.U.U.T.T.T.T.Y.T.T.~.~.~.~.(./.(./.(./.(.(.(.(._._.|.|._.(.`.[.{.|.|.|.|..X|.",
+"Z Z Z Z C Z C Z D B C Z Z D D B Z Z F B Z Z Z C Z Z Z B C Z D B Z Z Z Z Z Z C Z Z Z Z Z L Z Z Z Z D D Z Z Z Z Z Z Z C Z C Z Z Z C Z C C C C Z Z Z Z Z C Z A C Z Z A Z Z Z D Z C A Z C Z Z Z Z Z Z C D C D Z F Z D Z Z D D Z D H H D H F K H D H H H H H H H H H L L H L P P J H L P P J L J J P I P I J I L P P L P P P L L P L L I P P L P L P U L L P P T d.A.j.g.Z.g.g.Z.h.Z.l.A.l.A.A.A.l.A.A.l.A.A.A.D.A.A.A.A.D.S.S.S.Z.A.A.S.S.S.S.S.H.A.G.Z.S.S.S.J.H.H.H.L.S.H.L.H.L.L.L.L.L.L.L.L.L.U.L.L.U.Y.Y.P.P.Y.P.Y.T.T.~.Y.T.T.T.^.~.~.~.~.~.~.~./.~.T.T.T.T.T.T.T.T.P.T.T.P.P.P.P.P.L.L.H.L.S.L.H.L.H.H.J.L.L.L.U.S.U.S.L.H.H.H.L.L.L.H.H.H.D.D.H.H.H.S.A.A.H.S.S.S.S.A.A.H.A.A.A.A.G.G.A.A.H.A.A.h.W.G.A.A.A.A.A.A.A.G.h.h.A.h.h.A.h.h.A.A.h.h.h.h.l.l.l.l.l.l.l.l.h.l.h.h.g.h.h.z.h.k.A.z.g.g.g.l.k.g.k.g.g.g.f.f.d.a.j.f.a.f.a.h.f.h.f.h.f.k.k.k.g.z.l.g.l.h.h.g.z.g.g.g.f.k.a.a.a.z.a.a.a.a.f.i.f.a.a.a.a.k.i.a.z.i.a.a.u.i.f.f.i.a.a.z.a.k.k.k.k.f.k.k.k.f.g.f.f.g.g.g.d.f.f.g.k.k.k.k.z.f.h.h.g.g.f.f.j.k.f.k.f.f.f.k.f.i.k.f.f.f.d.k.i.d.f.i.k.i.d.f.f.i.g.a.a.S ! / CXFXFXAXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXDXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBXpX[ Q ~ b.U.T.U.T.T.T.T.T.T./.T./.~.~.~.~.~.~.!.~.T.T.T.[.T.~.T.T.T.T.~.T.T.T.T.T.T.T.U.T.T.U.T.U.I.T.U.L.P.P.L.P.L.Y.P.L.L.U.L.P.L.U.L.U.U.L.L.L.S.S.S.L.H.H.H.S.H.S.G.S.G.D.l.D.D.GXHXDXGXGXFXDXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBXaXM.' c Z.h.S.S.h.S.S.H.H.H.S.L.S.L.H.L.L.L.S.U.T.U.T.Z : 0 Y T = y F r t T T * : Z T.Y.S e t = ) [ [ T T [ b.P.T.Z r ; q e.T.H.T.L * * * Z.U.[ 0 0 0 T U.U.A 0 : : Z.[.U.Y.Z.> r 0 D T.U.S : : U [ r * A : r [ T 0 ; J P.P.P.Y.P.P.U.T.U.T.T.T.T.T.P.T.T.P.T.U.U.T.L.T.Y.T.T.T.T.~.~.~./.(././.(.(.(.(.^.(.`.^.`.(.(.(.|.`.|.{.|._._.|.|.|.",
+"Z Z Z Z D B Z Z C Z D B C Z Z Z B Z Z Z D B Z Z B D F Z Z Z Z Z Z Z Z L Z Z Z Z Z Z Z Z Z Z Z Z D Z D Z Z C Z C Z Z C C Z C C Z C Z C Z Z Z C C Z Z A C Z Z Z Z Z Z Z A C Z A C C Z C Z Z A A Z D Z F Z D Z Z Z Z D Z Z Z D H H Z H H H Z H D J H H H H H J J H J H L L Z P L J P L J P J J P L P L P L P L L L P P L P P P P P J J L L L P P L L P L L T [ Z.Z.g.Z.Z.g.Z.Z.h.A.Z.l.Z.h.A.h.A.A.A.A.A.A.A.A.A.A.S.Z.S.A.Z.D.A.A.S.S.A.S.A.S.A.A.S.G.S.S.S.H.H.H.H.L.H.H.H.S.L.L.L.L.U.L.L.L.L.L.L.U.U.L.Y.P.L.P.P.P.T.P.U.T.Y.T.T.T.~.~.~.~.T.T.~.~.T.T.~.T.T.T.~.T.U.T.U.P.L.P.P.P.L.L.H.L.L.L.H.L.H.L.H.H.L.L.H.L.H.L.L.L.H.L.L.L.H.H.D.S.H.G.H.G.G.G.H.J.H.H.H.S.Z.H.A.G.A.A.A.A.A.A.S.A.A.A.A.G.A.h.A.A.A.A.A.A.A.A.Z.A.G.h.G.h.h.h.z.h.h.h.l.l.l.l.l.l.l.l.h.h.z.h.z.x.j.g.h.k.g.l.z.g.D.g.Z.g.k.z.g.k.g.d.g.f.g.f.g.g.g.j.g.h.f.h.f.h.a.l.A.d.g.g.g.l.k.g.j.f.h.h.g.g.j.g.k.a.a.a.a.a.a.a.a.d.d.a.a.a.d.a.i.z.E i.a.a.a.u.a.i.a.a.a.i.z.a.k.k.a.k.k.f.k.k.j.g.z.g.g.f.z.k.g.k.k.k.k.k.k.g.h.f.h.f.g.f.f.f.f.k.f.k.f.f.k.k.k.f.f.f.d.f.k.f.f.f.d.k.k.k.f.f.a.z.k.a./ S ! ZXZXZXAXFXFXFXFXFXFXFXFXFXDXAXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXAXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXAXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXAXFXZXFXVXBXQ.} ! ^ c.T.U.T.T.T.T.~.T.~.~./.!.~.(.~./.~./.~.~.~.(.T.~.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.U.U.T.U.T.U.U.T.U.P.P.P.L.S.P.P.P.S.L.L.L.L.U.L.U.U.L.L.S.U.S.H.H.S.H.S.G.S.S.H.S.l.G.D.D.D.GXPXSXIXFXHXFXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXCXaXM.n c h.A.l.S.S.S.A.H.S.H.S.S.D.L.U.S.L.L.T.L.L.U.T.A : > [ Z.: t e > : Z.[ r * F T.Y.Z 0 : q b.Y.T.J.U.U.U.P.Y.A r y q b.T.T.F.> e 0 > Z.L.T r e = T T.U.Z y > 0 b.U.T.[.b.r : 0 D [.Y.S : * T S.0 r y 0 = F.[ r ; L L.P.P.Y.Y.P.T.U.P.Y.P.P.P.T.U.T.P.T.T.U.U.T.T.T.T.T.T.T.~.T.~././.(.(.(.(.(.(.^.`._._._.`.`.`.|.`.^.`.^._.|.|.|.'.|.",
+"G B D D Z Z Z C Z C Z Z Z Z C Z D D Z Z Z Z Z Z D C D Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z G Z Z Z L Z D Z Z Z H Z Z G C Z Z Z Z C D C Z C Z A A C Z C A C Z C Z Z Z A C Z Z C Z Z Z Z Z C F Z C C Z Z Z C C Z Z Z F D D Z Z H H D Z D H H D H S H H D D H H H H H H L H H H J J J L J L J J P J L I J J J P J J I P P L L J P L P J L L P L P P P L L L L U P T T [ d.Z.g.g.Z.g.h.h.l.l.A.l.A.A.h.A.Z.A.A.A.Z.A.A.Z.D.A.A.A.A.l.A.A.S.A.A.S.A.H.S.A.S.S.S.G.G.H.A.H.H.H.H.H.K.L.S.L.H.L.S.H.L.L.K.L.L.L.U.U.H.L.L.P.L.T.P.P.L.Y.Y.Y.T.T.~.T.~.~.~.~.~.~.T.~.T.T.T.T.Y.T.T.T.T.T.P.U.L.L.Y.L.L.H.L.L.H.L.H.H.H.H.L.H.D.H.H.H.S.S.L.H.L.H.S.S.S.H.J.G.L.H.J.A.H.A.A.A.A.A.S.D.h.A.A.A.A.A.A.l.A.A.A.A.A.G.A.A.W.A.l.A.A.A.A.A.A.A.A.j.h.h.h.A.h.D.h.A.A.l.l.A.l.g.l.g.l.h.h.h.h.z.h.j.z.h.l.g.z.d.Z.k.k.d.l.Z.d.g.g.g.g.f.g.f.f.g.a.g.g.h.f.h.k.h.f.h.f.k.k.k.A.A.g.g.l.h.h.g.g.g.g.g.g.k.k.k.a.k.a.f.a.a.i.a.a.a.d.d.a.E z.z.k.i.i.i.a.a.a.a.a.a.z.i.z.a.k.k.a.a.f.f.k.k.d.k.f.f.g.f.k.f.g.k.k.k.g.k.g.k.h.k.f.g.f.j.g.k.f.k.f.k.f.d.k.f.f.f.d.f.f.f.f.f.f.k.f.k.k.f.f.a.g.k.k./ / S ZXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXDXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXAXZXAXBXm.[ / S m.T.T.T.Y.T.~.~.~.~./././.~./.~.~./.~.~.^.~.~.~.~.~.T.~.~.~.~.T.T.T.T.T.T.T.T.T.T.T.U.T.U.T.U.U.U.P.P.P.U.P.L.P.P.P.P.P.P.L.P.P.P.L.L.L.L.S.L.U.H.H.H.H.G.H.S.S.G.G.G.D.D.x.IXIXGXGXFXDXAXFXAXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXUXhXM.{ c h.A.l.l.S.S.S.S.S.H.H.H.P.A.U.H.L.L.L.H.L.U.U.Z 0 y [ T.y * : y t P.` : y G Y.!.Z : = q n.~.L.XXXXG.P.U.Y.Z r = = b.L.Z.Y * * * S K.U.[ r : r ` U.T.T r : 0 J U.U.T.G * r : ` I.R.Z y : [ ~.y y > r y !.T 0 ; L U.P.P.P.P.P.U.T.U.U.T.P.P.T.T.U.T.U.U.T.U.U.T.T.T.T.T.~.~.~.~.~./.~./.^.(.(.(.`.(.(.(._.`.^.|.(.|.^.|.`.|._.|._.|._.",
+"Z D Z Z Z Z C Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z D Z Z Z Z Z Z Z Z Z L Z G Z Z Z Z Z D Z Z D Z D Z C Z Z Z C Z Z C Z Z C C C C C C C C Z Z Z C Z A Z Z Z Z Z Z Z C Z Z C C Z C C Z C Z F Z Z C Z F Z D Z D F Z H Z H H H H H H H D H L H L H L H H H J H H H J J H J J H P L P L P J J J L J J L I L P L L L P L L L P L L P L P P U L P P G U d.Z.g.g.Z.g.g.g.A.A.h.Z.A.A.A.l.A.A.A.l.l.S.l.A.A.A.A.A.A.A.S.D.A.A.A.A.S.A.A.S.S.S.A.A.H.G.Z.G.Z.S.G.H.H.H.H.H.H.H.L.L.H.L.L.H.L.L.L.H.Y.L.L.L.Y.L.P.L.H.I.P.U.Y.Y.P.T.T.~.~.T.~.~.T.T.~.T.T.T.T.T.P.Y.L.T.T.P.P.P.P.L.L.L.D.H.H.H.L.H.H.J.H.H.H.H.L.H.H.H.L.S.D.L.H.A.L.S.H.D.S.H.H.A.K.A.A.A.W.A.G.H.A.S.A.A.A.A.h.A.A.Z.A.A.A.A.A.Z.A.A.A.A.A.A.A.A.A.A.A.h.Z.j.A.A.A.h.A.h.S.A.h.z.h.z.h.l.l.l.l.l.h.h.h.h.h.z.j.k.h.g.g.g.g.k.k.k.h.h.f.k.g.g.f.g.g.f.f.g.g.k.g.f.f.h.g.h.k.z.g.k.l.k.g.g.k.g.g.h.g.h.h.g.g.g.a.k.a.g.i.a.f.a.a.d.a.a.a.d.a.d.a.a.a.u.a.i.i.i.E a.a.a.a.a.a.i.k.k.k.k.a.a.k.k.f.k.f.k.f.k.f.k.f.f.d.z.k.g.k.g.k.f.g.g.g.f.j.j.f.k.f.k.k.f.k.f.f.k.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.z.a.g.g.~ / ! CXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXAXDXSXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXDXAXDXAXFXFXFXFXFXFXFXFXFXAXFXAXZXDXBXpX' ~ ~ c.T.T.T.T.!.~.~.~./.!./.!././.^./.~./.~.~.~.!.~.~./.T.T./.~.T.T.~.T.T.T.T.T.T.U.T.T.U.T.U.U.Y.U.U.Y.U.U.U.Y.P.P.P.L.L.L.P.L.P.Y.L.U.A.L.L.U.H.H.H.G.H.S.S.S.S.G.A.z.G.S.A.D.IXGXGXGXFXFXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXBXhXM.8.c h.A.A.A.A.A.A.h.A.A.A.D.G.H.H.H.L.S.P.U.P.P.Y.F e 0 [ H.Z r 0 0 G U.[ ; : A Y.~.H e y ; ; : 0 * r : = Z.P.A : y > r q r : e r q e.L.H.T r : : T L.U.F.: y * : y A y 0 e * q F.U.~.A : y [ U.J : y e P Y.Y 0 e A L.K.P.P.P.P.P.P.P.Y.T.P.P.T.U.U.T.U.U.U.T.U.T.T.~.T.T.T.R.~.~./././.).^.^.(.(._._._.`.`.^.|.{.|.^.`.`.`.^._._.|.|.`.",
+"D Z F D Z Z Z Z C Z C Z Z Z Z Z Z Z D D D Z G Z Z Z Z D Z D Z D Z G Z Z Z L Z Z Z Z Z Z Z Z L Z Z H G D D D D Z Z Z Z Z C Z Z C C C Z C Z Z Z Z Z C Z C C Z Z Z Z Z Z A C Z Z C Z F A Z A Z Z Z C B D A Z G Z C Z H D Z Z Z H H D L Z H H J H H J Z D H J H H J J J L J J L J J P L J P P J P L L J P U P P J P J P P J L P J J P L P L L J P J P L P U [ b.Z.j.Z.g.Z.g.Z.Z.g.Z.l.h.Z.l.h.Z.l.A.A.A.Z.A.A.A.A.A.Z.D.A.A.Z.A.A.A.A.A.A.S.A.A.A.G.A.S.A.G.H.S.H.H.H.H.H.L.L.L.H.L.H.H.L.D.L.H.H.L.L.L.L.L.L.U.L.L.L.U.U.U.U.U.Y.U.T.P.T.T.T.T.~.~.T.T.Y.T.T.Y.P.P.L.I.L.L.L.L.L.L.H.L.L.H.L.H.L.S.H.S.H.H.H.H.S.H.H.H.H.H.H.L.H.J.H.L.H.S.H.H.H.D.H.H.H.S.G.A.A.A.A.A.A.A.h.A.Z.h.h.h.j.A.A.A.A.A.A.A.A.A.h.A.A.A.A.h.h.A.h.A.W.h.A.h.g.G.h.z.h.z.H.z.A.A.l.l.l.A.l.l.h.h.x.l.l.z.z.h.z.g.g.g.D.z.g.k.h.g.g.g.g.g.g.g.g.g.g.g.k.k.h.g.g.h.z.k.f.g.z.k.l.l.g.z.A.z.h.k.h.h.z.g.g.g.k.a.k.g.f.i.a.a.a.a.a.a.a.a.z.z.a.a.a.a.i.i.a.z.a.a.a.a.a.a.z.i.k.a.k.a.k.a.i.f.f.f.f.f.f.f.f.k.g.f.k.g.k.k.k.g.z.g.g.f.f.g.g.f.f.k.f.f.k.k.f.g.k.f.f.f.f.d.f.f.f.f.f.f.f.f.k.f.g.k.g.a.~ ~ S HXDXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXDXAXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXAXFXFXFXFXFXAXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXGXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXDXAXDXFXFXFXFXFXFXFXFXFXAXFXFXZXZXBXm.} S S m.T.T.T.~.T.!.~././././././././././.(././.~.~.~.~.~./.T.T.T.~.T.T.T.T.T.T.T.T.T.U.T.U.U.T.T.Y.T.U.P.Y.P.U.L.U.P.P.L.L.L.P.P.L.L.L.L.L.L.L.S.L.G.H.H.S.S.S.A.h.G.G.G.S.H.l.G.GXIXGXGXGXVXFXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBXaXM.{ c g.A.h.A.A.A.A.A.A.H.S.S.S.G.S.L.H.L.D.S.D.U.I.Z ; e [ U.[ = : % b.T.T ; e H Y.U.A e : ; ; ; e e r : ; b.L.C t * ; e ; > : : * U L.L.L.` y : t ` U.U.^.T = y e : y : e ; 0 b.I.U.Y.H e 0 T T.T r e : T U.[ > e Z I.Y.P.P.P.P.P.T.U.U.P.P.T.P.U.T.U.U.T.U.U.T.T.T.T.T./.T./.~.~././.(.(.(.(.(.(.(._._._.|.`.{.|._.|.`.^.`.|._._._.`.`.",
+"D D D Z Z Z F Z Z Z Z F Z Z Z Z D Z Z D D D Z Z Z D F Z D Z Z D Z Z G Z Z Z Z G Z Z Z L Z L Z Z Z Z H D D Z H D Z Z Z Z Z Z Z Z Z Z Z C C Z C C C C Z Z Z Z Z Z Z C Z Z Z Z C Z C C C Z Z C C Z Z C Z D C Z Z Z Z Z H Z Z H Z Z Z Z Z H H H H H H H Z H H H L L L L L L J L H L H J L L J P J J I J L J L L J L L P L L P L P P L J L L L L P L L L L U [ b.g.Z.g.Z.g.Z.g.Z.Z.l.A.A.l.l.A.h.Z.A.A.A.A.A.A.A.Z.A.A.A.A.A.A.g.Z.A.A.A.A.A.A.A.A.S.A.G.A.S.G.H.H.H.H.H.H.H.H.H.H.H.H.H.S.H.H.H.S.L.D.H.U.S.S.L.L.L.L.L.U.L.I.L.L.U.P.T.T.T.T.~.T.T.T.T.T.T.T.P.P.T.L.U.U.L.L.P.P.H.L.P.H.H.J.H.H.S.H.H.S.H.H.S.S.L.H.S.S.H.H.L.L.A.D.H.H.H.H.H.S.S.H.Z.W.A.A.G.A.A.A.H.A.A.A.h.h.h.A.h.j.S.h.h.A.A.A.A.h.A.h.A.A.h.h.A.Z.h.A.A.h.Z.g.A.A.g.A.h.h.D.z.h.A.z.A.l.l.h.l.l.h.h.j.a.l.j.h.g.z.k.g.z.g.g.g.h.h.k.k.g.g.g.k.g.g.g.f.g.k.g.h.f.g.h.h.h.h.f.z.k.A.d.A.D.Z.k.h.g.z.k.z.g.z.f.z.a.a.g.f.f.k.a.a.i.a.a.a.a.a.E u.a.u.a.i.i.a.a.a.a.a.a.a.z.f.k.k.z.a.k.a.k.k.k.f.f.f.d.d.f.k.k.z.f.f.g.k.g.k.k.f.g.g.g.f.f.g.f.k.k.f.f.f.k.d.k.d.f.f.f.k.i.f.k.f.f.f.f.k.g.k.k.g.g.g.g.S / ! CXDXDXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXGXSXFXFXFXFXFXFXFXFXFXFXFXAXFXAXZXFXBXQ.{ Q ! [ T.~.T.[.~.~./././././././.^././././././.^.~.~.~.~./.T.~.~.T.~.T.T.~.T.T.T.T.T.U.I.T.U.U.I.T.U.U.T.P.L.L.L.P.P.S.L.L.L.L.L.P.L.L.L.L.S.L.G.H.D.S.G.S.G.A.A.S.h.G.S.A.A.z.S.IXHXPXGXGXFXGXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXBXaXM.{ c g.g.g.A.A.A.A.h.A.H.A.A.S.S.H.S.H.H.U.H.S.U.Z.Z r 0 T T.n.= q y b.T.T y ; Z Y.T.J * = y 0 0 r * : : > n.D.Z * q r * y = q H b.L.U.H.L.T q 0 > T L.P.U.Y.b.y q q : q ; A [ T.I.U.T.Z * = T [.b.t > 0 F.P.T y : H L.T.P.P.T.P.P.P.P.U.L.U.P.T.U.T.T.U.T.U.T.T.T.T.T.T.R.~.~.~.~.!././.(.(.^.(.|._.`.`._.|.|._.|._.|._._.`.^.|._.|._.|.",
+"D D D Z Z F Z Z F Z Z Z Z Z Z D Z D Z D D D Z D Z Z Z D Z D H Z L L Z Z Z Z Z Z L Z L Z Z Z L Z D H Z D D Z Z D Z Z Z Z Z Z C Z Z Z A Z C Z C C C Z Z C C Z A Z G Z Z Z Z C Z C H Z C C C Z Z C C Z C C F G Z D Z F D Z H Z H F Z L L L Z H J Z J L J H H H L L H H J H L L J J H J L J J L J L L J P L J P L L P H P L L J L L P J L L L L J L P L U U e.d.Z.g.g.Z.h.Z.g.h.A.l.Z.h.Z.A.l.A.A.A.A.Z.A.Z.A.A.l.A.A.A.A.A.A.A.A.A.h.A.A.A.A.S.A.A.S.A.S.H.H.A.A.H.D.H.S.L.H.L.H.L.H.L.H.H.S.H.L.H.S.L.S.L.L.H.L.S.L.L.L.H.L.Y.L.Y.P.U.T.T.T.T.T.T.P.T.T.P.T.P.P.P.P.L.L.L.L.L.H.L.H.H.D.L.H.S.H.H.A.H.S.S.H.G.S.S.J.Z.H.H.S.S.A.H.S.S.S.S.A.A.S.H.A.H.h.G.A.A.G.A.A.S.A.h.h.S.S.h.h.h.A.h.A.Z.A.A.A.A.A.A.A.h.A.Z.A.h.A.A.h.A.h.A.H.h.h.A.h.A.A.h.g.A.z.h.h.z.A.A.l.l.h.h.g.h.z.z.z.h.g.l.g.g.z.g.j.h.f.h.g.g.g.g.g.g.k.g.g.g.g.g.f.h.a.g.x.k.h.h.k.k.d.A.z.d.k.k.g.h.l.k.g.g.a.z.g.z.z.a.f.k.a.a.d.a.a.d.d.d.i.i.a.u.a.u.a.i.a.a.a.a.a.a.a.i.i.z.a.a.a.a.a.a.i.a.f.f.f.f.f.f.f.d.d.g.f.f.k.k.k.k.f.g.f.g.g.j.g.g.f.k.f.k.f.f.f.f.d.f.d.f.f.f.f.f.f.f.k.g.f.g.g.g.z.g.g.h./ S ! ZXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBXpX[ / ~ [ T.~.~.~.~.~./.(./././././././.(./././././.~./.~.~.~./.T.~.~.~.~.~.~.T.T.T.T.U.T.U.U.U.T.T.U.T.T.T.T.T.Y.P.P.P.P.L.L.P.U.D.L.L.L.L.L.L.L.L.L.G.H.G.A.H.A.S.A.G.G.S.A.S.S.x.GXIXGXGXFXVXAXAXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBXhXM.{ l Z.g.A.A.z.A.A.A.A.z.S.A.S.S.S.S.S.H.S.L.L.U.P.K.K.L.U.L.U.Y.Y.U.U.U.T.].U.U.T.L.L.I.U.T.T.U.L.U.Y.L.L.L.XXD.I.H.L.I.L.U.L.L.S.L.L.L.H.!.L.U.U.T.U.P.U.H.T.Y.F.b.b.b.F.Y.I.U.Y.T.T.K.U.T.T.T.P.~.T.U.T.T.U.U.!.U.U.L.T.P.P.P.P.P.P.U.P.U.U.U.U.U.U.P.T.U.T.T.T.T.T.~.Y.~.~.~././././././.^.(.(.|.(.`._.|._.|._._._.|._.|.^.`._._.|.|.",
+"D D D D D D D D D D A D D Z Z D D Z F F D D Z Z D D D D D D D Z Z G L Z Z Z D Z Z Z L L Z Z Z G Z D Z Z Z Z H G Z Z Z D Z Z Z Z D F Z Z C Z D Z C Z D B Z C Z B C Z C Z Z Z Z Z Z Z C C Z Z Z C D F Z A Z F C Z D D Z D Z H D D L Z H J G H H F K H H H H L H L H H H L L H J P P H P J J J L J J L J J J L J J L P L P L H L L P L L L L L J L L L U T Z.g.Z.A.Z.g.Z.g.h.l.Z.l.l.l.A.l.g.Z.A.l.A.A.A.A.Z.A.z.A.A.A.A.l.A.l.A.A.A.l.A.A.G.A.A.A.l.l.G.G.A.H.H.H.H.H.H.H.H.H.H.L.H.H.S.H.S.H.H.S.H.H.H.H.S.H.H.L.H.H.L.L.L.L.L.L.Y.I.Y.Y.U.T.U.P.P.T.T.U.T.L.L.H.U.H.L.L.L.D.L.L.K.H.J.H.H.H.S.H.A.H.H.H.G.S.H.S.Z.A.H.H.G.S.G.W.H.G.G.A.S.A.S.A.A.G.A.Z.A.G.A.W.A.A.h.A.l.A.h.h.h.G.l.l.h.A.h.A.A.A.h.A.h.A.A.h.h.Z.A.h.A.h.A.A.j.A.A.h.h.A.A.h.h.z.z.h.G.h.G.h.h.h.h.l.l.l.h.z.k.h.g.g.z.z.l.g.h.z.z.z.h.h.z.h.h.h.h.k.h.h.k.g.h.h.k.h.h.k.h.k.k.k.h.h.k.z.k.d.h.h.z.g.g.g.g.z.g.f.f.f.f.f.j.a.f.a.a.a.a.a.f.a.a.a.a.a.a.i.i.i.i.a.i.a.k.a.z.i.a.g.a.f.g.s.f.f.f.d.d.k.f.f.f.f.f.k.k.k.k.k.k.g.j.z.f.g.g.g.g.g.g.z.g.k.g.k.g.k.f.f.f.i.f.f.f.d.f.f.f.f.k.k.h.g.h.h.z.h.~ / ~ CXDXZXZXAXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXZXSXBXQ.} Q Q [ !.R.~.~././.(././.(.(.[.(.(.(.(.{././././.~.~.~./././.~.T.T.T.~.T.~.T.~.T.T.T.U.T.U.U.T.T.U.T.T.P.P.P.P.P.K.L.U.L.H.L.L.P.S.P.L.L.H.P.G.H.G.H.D.G.A.A.A.A.A.S.A.A.A.A.h.A.GXIXGXGXZXZXFXVXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXCXVXhXM.{ x h.h.h.A.A.h.A.A.g.A.A.A.h.J.h.H.H.A.S.H.H.H.L.H.U.L.U.L.U.U.L.Y.P.U.U.P.L.U.U.U.U.U.L.P.P.P.P.U.L.L.L.L.P.P.P.U.L.L.H.L.H.A.U.L.L.L.U.P.P.P.L.P.P.P.U.L.L.P.P.P.P.P.P.P.U.U.L.T.T.Y.T.T.T.U.U.T.T.U.U.T.U.T.U.T.U.U.U.Y.P.P.L.K.L.U.P.P.Y.U.U.U.P.T.U.T.T.T.T.T.T.T././.~.~.~././././.(.(.(.(.`.`.{._.|.|._.}.}.}.}.|.}.}.}.}.}.(._.",
+"D D D D D D A H D Z D D F D D Z D D D D D D Z H L D D D D D D D Z Z Z Z L Z Z D Z L Z Z Z G Z Z Z Z H Z Z Z Z Z Z Z Z Z Z Z Z Z C Z C Z Z C C Z Z Z C Z C Z D Z Z C Z Z Z C C Z Z C C Z Z C Z C C C Z Z Z Z Z Z D D D D D Z H D H H D D H H H H H L H H H J H H P J H L J H J H J J H J H J J L J L J U L J U L P P L J P P P P L L J J L L L L L L U T [ l.Z.g.g.Z.g.Z.Z.A.l.l.S.l.Z.g.A.A.A.g.l.A.g.A.A.l.D.A.Z.l.A.A.A.A.l.l.h.Z.A.A.l.A.S.A.D.G.S.G.H.G.H.H.H.H.H.S.L.S.H.S.H.S.S.S.H.S.H.H.A.S.H.H.D.L.H.H.L.L.L.H.H.L.Y.Y.U.Y.I.U.T.U.U.Y.T.U.T.U.U.T.L.T.L.L.L.L.H.K.L.H.H.H.D.S.H.S.A.G.H.A.G.A.H.A.S.G.A.J.H.A.H.Z.S.S.S.Z.G.A.A.S.A.A.G.S.A.A.h.W.A.A.S.A.A.A.A.A.h.h.h.h.h.h.A.z.A.A.h.A.A.A.A.h.h.h.h.A.h.A.h.h.Z.h.A.A.A.A.h.l.l.A.l.A.z.A.z.h.l.h.h.A.h.l.h.l.h.h.h.h.g.g.g.h.l.l.h.h.h.h.h.h.h.h.h.h.l.k.k.h.g.g.k.k.h.k.h.h.h.z.h.h.h.k.k.d.A.D.h.k.g.z.g.g.g.h.g.g.g.f.f.f.f.f.f.a.f.k.a.a.a.a.a.a.a.a.a.i.u.a.i.a.i.a.i.a.i.i.g.a.s.g.a.a.f.s.i.i.d.f.d.f.f.f.k.k.d.k.g.g.k.k.j.a.f.g.k.k.g.a.g.a.k.k.k.k.g.d.f.f.f.k.f.f.f.k.f.z.f.g.h.k.g.g.h.h.g.A.~ ~ S CXGXDXAXZXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXAXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXZXDXDXBXpX[ Q S M.~.~.~.~./.(./.(.(.(.(.(./.^.^.^./.(.(.(./././././././.T.~./.~.~.~.R.T.T.T.T.T.T.U.U.T.U.T.T.T.T.T.T.Y.P.P.L.P.L.L.F.S.L.L.P.L.L.D.P.L.G.H.G.H.G.G.G.z.G.h.A.A.H.A.A.A.A.A.IXGXGXGXSXDXFXAXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXaXM.{ c h.h.A.h.h.A.g.A.Z.A.A.A.A.A.H.S.S.H.S.L.H.L.H.L.H.L.K.L.L.L.U.U.T.U.U.U.L.L.L.U.L.L.L.L.P.P.L.L.L.U.P.L.L.U.P.A.L.U.H.L.L.L.L.L.L.L.L.L.L.P.L.U.P.P.L.U.U.U.L.L.P.P.U.P.U.L.L.U.U.P.T.T.T.U.T.T.U.T.Y.U.T.U.U.U.I.I.Y.Y.P.P.U.Y.L.U.P.P.U.Y.Y.Y.Y.U.T.U.T.T.T.Y.T.~.T./.~./././.(./.^./.(.(.(.(.`.|.|._.|.|.|.}.}.}.}.}.}.|.}.}.|._.",
+"D D D D Z Z Z Z D D D D D D D D H H G H L D L D H D H D D D D D L Z L Z Z Z D D Z Z Z Z Z L Z L G Z G Z L Z Z Z Z Z Z D Z Z Z Z Z B D D Z Z Z Z Z Z Z Z Z Z C D G Z Z Z Z F Z Z C Z C Z C C C C Z Z C Z Z Z A D Z H D D H H H Z H Z L H H H L F H H H H H H H L H J H L L H L P H L P P J J J L J J J U J L L J L L P L L J H H L P J L J L H L L L P T Z.g.g.Z.Z.g.l.g.A.l.l.h.Z.g.Z.A.A.A.A.Z.g.Z.A.A.A.l.A.A.A.A.A.g.A.A.l.l.h.A.A.h.S.l.l.l.A.H.A.G.Z.H.H.S.H.H.H.H.S.S.H.S.H.H.H.G.S.H.A.A.H.A.H.G.L.S.S.H.S.L.H.L.L.L.H.L.U.L.L.Y.U.L.U.U.L.L.T.U.H.L.P.H.L.H.H.H.H.L.Z.J.H.S.J.H.H.S.S.A.S.A.A.A.G.A.A.D.Z.A.S.S.G.G.A.S.H.A.A.A.A.A.G.A.G.A.A.A.A.A.Z.A.A.h.A.h.A.l.A.h.h.A.h.A.g.A.h.A.A.A.A.g.A.h.A.h.h.W.h.h.A.A.A.Z.A.A.A.h.h.A.z.h.h.G.z.h.x.h.z.h.G.g.h.g.l.h.h.h.h.h.g.h.g.h.h.h.h.h.h.h.l.l.l.h.l.h.h.h.k.h.h.h.h.h.h.k.z.h.h.h.g.h.h.z.k.D.k.k.z.z.g.h.g.g.z.g.g.g.g.f.k.f.f.a.a.z.a.a.f.a.a.a.z.a.a.u.a.u.a.a.a.i.a.a.f.a.k.a.s.a.a.s.s.g.a.f.k.i.k.f.f.f.f.j.k.f.k.k.f.k.f.f.f.f.f.f.z.j.g.z.g.k.k.g.k.g.f.d.k.f.f.f.k.k.k.f.f.h.g.g.h.k.k.h.h.h.h.h.S ! ! ZXZXDXAXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXZXZXBXQ.{ / Q [ ~./././././.^.(.(.(.(.(.(.(.[.^.(.(././././././././././././.~.~.~.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.P.P.L.L.L.L.U.U.L.L.S.S.L.L.L.L.D.H.D.H.A.G.G.S.A.A.A.A.A.A.A.A.H.x.PXPXAXPXCXHXZXAXVXZXAXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXDXFXFXFXFXFXFXFXFXVXBXaXM.c c h.A.h.h.h.h.h.A.A.A.A.A.A.A.h.h.H.H.S.G.A.P.H.H.D.L.L.L.L.U.L.U.L.L.U.L.L.L.L.L.L.L.L.L.L.L.U.L.L.U.L.L.L.L.L.L.L.A.L.H.L.H.L.L.L.L.L.L.U.L.U.L.U.P.U.L.P.L.L.U.U.U.K.L.Y.K.U.U.P.T.U.T.I.T.T.T.T.I.U.T.Y.T.T.U.Y.T.U.Y.P.Y.U.U.Y.L.P.L.L.U.U.U.U.T.T.U.T.T.T.~.Y.~.T.~.~.~.~.~.~./.(.(.^.(.(.`.^.|._.{._.'.}.}.}.}.}.}.}.}.}.}.}.|.",
+"D D Z D D L Z Z D D D D D D D D Z Z H H Z L H H H H H D H H Z D Z Z Z Z D D D D Z U Z Z Z Z Z Z G Z Z H Z Z H Z Z F Z Z Z Z Z Z Z Z Z C Z C D B Z Z C Z Z Z D Z Z C Z Z Z Z C Z Z Z C Z Z C Z C Z C A Z F Z Z Z Z Z H Z Z J Z H H H L H H H H H H H H H P H Z J H H L K L J L J J J H P J J U P L J J J J L I J J H H P L H P J J J L J L L H L L L U [ d.Z.g.Z.g.Z.A.Z.g.Z.l.Z.l.l.A.g.Z.g.A.A.A.A.g.A.g.A.l.A.g.l.D.A.z.Z.A.A.A.h.A.A.l.A.G.G.G.A.A.A.G.S.H.H.H.H.H.L.L.L.H.H.H.S.A.H.A.H.A.G.H.A.H.Z.H.S.H.H.H.H.H.L.L.H.Y.L.U.U.L.U.K.J.U.Y.L.U.L.L.P.L.U.H.H.L.L.H.S.H.H.H.H.H.H.Z.A.S.A.H.A.A.S.h.S.l.A.S.A.G.A.G.A.G.h.S.S.h.S.H.S.A.S.g.A.A.G.A.A.A.h.A.h.A.h.A.z.Z.l.l.h.h.A.h.A.h.A.h.g.A.A.A.h.A.A.h.A.j.A.h.A.h.A.h.A.A.A.h.A.h.A.h.h.z.g.A.j.h.G.h.l.l.l.h.h.h.h.h.h.h.h.h.l.h.h.h.k.h.h.h.l.l.l.h.l.l.l.h.h.h.h.k.h.h.h.h.h.h.h.l.l.h.h.z.A.k.k.Z.g.g.z.g.g.D.g.g.g.g.g.g.z.k.f.k.z.i.a.k.f.f.a.a.a.a.z.a.a.a.a.a.a.a.a.a.a.k.a.k.f.g.f.s.f.d.i.g.k.i.f.f.f.k.f.f.k.k.f.f.f.d.f.f.f.f.f.k.a.z.a.a.k.k.g.k.k.k.k.z.f.k.f.f.k.k.k.k.h.f.h.g.h.h.h.h.A.A.A.A./ / S CXZXFXVXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXBXm.[ / ! c./././.(.(./.(.(.(.(.(.(./.^.{.).(.(.^././././.(././.~.~.~.[.~.~.^.~.T.T.T.~.T.T.T.T.T.T.T.T.T.T.Y.T.P.T.P.K.L.L.L.D.L.L.L.L.L.P.L.G.H.D.H.G.H.L.A.S.S.A.A.A.A.A.A.A.A.g.z.GXIXFXGXDXDXAXGXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXCXCXhXM.n n h.h.h.A.A.A.A.j.A.A.A.A.A.G.S.H.H.A.S.G.H.D.H.H.H.L.S.H.L.L.U.L.L.L.L.L.L.L.L.U.L.S.S.L.L.P.L.P.L.L.P.L.D.L.L.L.L.L.L.L.L.L.H.S.L.L.L.L.L.L.L.L.L.P.P.L.L.P.L.L.A.L.P.L.L.L.U.U.P.T.U.T.U.T.U.U.T.U.U.Y.U.Y.Y.U.I.I.U.Y.P.Y.L.U.L.U.U.U.L.U.L.U.Y.U.U.T.T.T.T.T.T.T.~.T.~.~.~.~.^.^.~.(.(.(.^.`.`.(.|.|.|._. X}.}. X}.}.}.}.}.}.}.^.",
+"G H D H D Z F L H H H H D H D D H H Z H L Z D H H H D H D D G D Z H Z D D D D D L Z G L Z Z Z Z H H Z Z Z H Z Z D Z D Z Z D D D C D Z Z B Z F C Z Z Z C Z D D D Z Z Z Z Z Z Z C Z Z C C C C C Z C F C Z Z Z Z Z Z H F Z H K Z L H J H H H H Z Z H H H H J H H J H H L H H H I H H P H I L L J L J L J L L J L J P L P L L H P J L L L H L L L L L L Y d.Z.Z.g.Z.A.Z.g.A.Z.A.Z.l.Z.g.l.l.A.A.A.l.A.g.A.g.A.g.A.g.A.l.A.A.z.l.A.l.A.A.h.A.A.A.A.D.A.A.A.G.S.S.H.H.H.H.H.H.Z.H.H.H.Z.H.A.A.H.S.S.A.A.S.A.S.H.G.Z.S.H.L.H.H.H.L.L.L.U.U.L.H.K.L.L.L.U.L.U.L.L.L.H.L.L.D.J.H.H.J.S.H.H.H.S.G.H.A.S.A.A.A.A.A.A.S.A.A.A.A.A.A.h.G.A.G.S.A.G.h.Z.A.h.S.A.A.A.A.A.A.h.A.A.A.h.h.h.h.h.h.h.l.h.h.h.A.h.A.l.G.g.G.h.A.h.W.h.h.G.j.h.h.A.Z.A.A.h.h.h.A.A.h.G.h.h.J.G.h.z.G.h.h.h.h.h.A.z.l.h.l.l.l.h.l.h.h.h.h.h.l.h.l.l.D.l.l.l.l.h.l.l.l.l.l.h.h.l.h.h.l.l.l.g.g.A.k.k.k.z.A.g.k.z.g.g.g.g.g.g.g.f.g.f.z.a.f.a.a.i.k.a.a.z.a.z.a.a.a.a.a.a.a.a.s.a.a.f.f.s.g.s.g.g.i.g.f.f.d.f.f.f.f.f.z.f.k.f.f.a.f.f.f.f.f.g.a.g.a.z.g.g.g.k.h.k.k.f.k.k.k.f.k.h.f.z.k.f.h.k.l.h.h.h.h.l.A.h.A./ ~ ! CXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXZXMXaX} Q Q c././././.(.^.^.{.^.(.(.[.(.^.(.(.E.^.(.(.(.(././././././././.~.~.T.~.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.Y.T.P.P.P.L.L.L.L.L.L.S.L.L.S.D.G.H.H.H.H.S.H.S.S.A.A.A.A.h.S.z.A.A.A.l.GXIXGXGXGXAXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXVXVXCXBXaXM.{ c g.h.g.g.h.h.A.A.A.A.A.A.A.A.A.S.A.A.S.S.S.H.H.H.A.U.L.L.L.L.S.U.U.L.L.S.U.L.L.L.L.L.L.L.U.L.Y.U.L.P.S.L.D.L.S.L.L.L.L.S.U.S.L.H.L.L.L.L.L.L.U.U.L.L.L.L.L.L.L.L.U.P.S.L.P.L.L.U.U.P.U.U.U.U.U.U.U.U.L.U.U.L.U.P.U.U.Y.U.T.U.U.U.L.U.Y.L.L.U.L.Y.U.U.U.T.T.T.T.T.~.T.T.~.T././.~.^.~.(.(.(.(.|.(.`.|.}.}.}.}.}.}. X|.|._.|.|.|.|._._.",
+"H H H D H D H H D H F H H H H H H Z H H H H H H H H H H H D D D H Z Z D D D D D Z Z Z Z Z H L Z Z Z G Z Z G Z Z Z D Z Z F D Z Z D D Z B Z Z Z Z Z Z D Z Z D D D G Z Z Z Z Z Z Z F B C Z C Z Z C C C Z C Z Z Z D H D D H J Z L Z K H J H H H J J F H H H H H H H P H H I J H H I K J J L J J L J P J J J J L P L H P J H P F L H L L L L L L H H H J T b.b.A.Z.A.g.Z.Z.h.Z.l.h.h.l.Z.Z.A.l.g.Z.g.Z.A.A.g.l.Z.A.g.l.l.k.A.Z.l.A.z.z.A.A.A.h.A.A.l.S.G.A.H.G.G.S.S.H.S.H.H.L.H.H.H.G.S.G.A.A.A.A.G.S.A.A.H.A.H.G.G.S.D.D.L.H.L.L.L.H.L.H.U.L.H.L.L.L.H.L.L.U.H.H.L.H.J.D.L.H.D.H.S.H.H.H.S.A.G.A.A.A.A.A.l.A.l.D.A.A.A.A.A.A.h.l.H.h.G.A.S.G.h.A.S.A.A.A.W.A.h.Z.A.Z.g.h.h.A.h.l.A.l.l.h.A.A.h.Z.h.l.l.g.l.z.l.h.h.A.h.j.G.A.A.h.A.A.j.A.h.A.h.h.h.z.h.h.z.h.h.G.j.h.Z.h.A.A.A.h.l.l.l.l.h.h.g.l.h.z.h.h.l.l.l.h.z.A.A.l.h.l.A.g.A.l.l.h.h.h.l.h.h.z.l.A.z.k.k.k.k.k.g.g.l.g.k.g.g.g.f.g.g.f.g.h.f.k.k.z.z.f.f.z.k.a.k.a.a.a.a.a.a.a.a.a.z.z.f.a.f.a.a.g.a.a.i.s.a.i.f.f.f.f.f.k.f.f.k.f.f.k.f.f.f.f.f.a.g.f.g.a.i.k.a.k.k.k.g.g.f.f.f.f.f.k.h.h.f.k.h.l.h.l.l.h.z.A.h.A.A.H / ! CXDXAXAXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXSXGXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXVXZXZXBXm.[ Q Q [ /./././././.(.(.(.(.(.(.(.(.(.(.^.{.{.~./.(.(.(./././././.~./.~./.~.~./.~.~.T.T.T.[.T.T.T.T.T.T.Y.T.P.P.P.P.U.P.L.L.L.U.L.L.S.S.G.L.H.A.G.H.S.L.S.S.S.S.A.A.S.A.A.A.A.A.l.IXGXGXGXAXZXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXGXVXCXaXM.c c g.h.h.S.h.Z.j.A.A.A.h.h.A.A.A.h.H.G.S.S.S.G.H.H.H.H.H.H.L.S.S.L.S.U.L.L.S.L.U.S.L.L.S.L.D.L.L.L.P.L.U.L.L.L.L.L.S.L.L.L.L.L.L.L.L.H.L.L.L.G.L.H.L.P.L.P.L.L.L.L.L.L.P.P.P.P.U.U.U.L.K.L.U.U.U.I.U.I.U.L.U.U.P.U.U.U.T.U.Y.P.Y.L.Y.U.U.U.Y.U.L.U.I.I.U.T.T.T.T.T.T.T.T.~.~.~.~./.[.E.(.(.(.(.(.^.^.`.}.}.}.}.|.}. X|.|.|.|._.|._.|._.",
+"Z H D H H H H H H H H H H H D H H H H H H H H H H H H H Z H D D L D Z L Z Z D U Z G G Z G Z G Z Z H Z Z Z Z D D G Z Z G D Z H D D C Z D Z Z Z F Z Z D Z Z Z Z G Z Z Z Z Z Z D B C Z Z C Z Z C D Z C Z Z Z Z F Z D D D D D H H H Z L H H J J L G H J H H J J H J H L L L H I H L U L P H L P J L L L J P L P P H H L J L P J J L L H L H L J H H H H [ e.g.Z.Z.g.Z.h.Z.g.z.h.Z.h.Z.A.h.l.Z.g.A.l.k.A.g.A.l.g.A.l.l.z.l.A.z.k.l.A.A.A.A.G.S.A.A.A.A.A.G.A.Z.G.S.W.H.S.S.H.H.S.H.S.G.S.H.S.A.A.S.A.A.S.A.A.A.A.S.A.H.H.H.H.H.L.L.L.L.L.H.L.D.L.H.L.H.H.H.H.H.U.L.H.L.H.H.D.H.G.H.H.G.A.Z.G.A.H.A.A.A.A.A.A.A.h.l.A.h.A.A.A.A.W.h.h.S.G.S.h.A.G.S.G.A.A.A.A.h.A.h.G.h.A.A.h.h.h.l.l.h.h.h.l.g.Z.j.h.l.l.h.g.A.h.A.j.j.A.A.Z.A.h.A.h.A.A.A.h.h.A.h.h.z.h.h.h.z.A.j.z.A.h.A.h.A.h.l.l.h.z.l.l.A.h.h.h.k.l.h.l.l.l.l.l.h.A.h.A.A.A.l.l.l.g.l.g.l.l.z.h.g.k.g.g.l.A.k.A.k.g.g.z.g.g.g.D.h.h.g.f.z.j.f.f.f.z.a.k.k.a.k.k.a.z.a.z.k.a.k.a.a.a.a.z.a.a.a.f.a.i.s.s.i.f.d.k.k.i.f.f.k.k.k.g.k.f.f.f.k.a.f.f.i.a.g.i.a.g.d.d.k.g.k.k.g.k.k.k.k.g.g.g.h.k.h.h.h.h.l.l.A.l.A.D.A.h.A.A.S ! ! CXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXSXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXDXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXBXm.[ Q Q m././.!.(.(.(.(.(.(.(.(.{.(.(.(.{.(.^.^.^.(././.(.(.(.^.(././.~./.~.~.T./.T.~.T.T.[.T.T.T.T.T.T.T.T.Y.P.T.P.P.P.U.L.L.L.S.L.L.L.L.H.H.H.D.H.H.H.D.G.G.S.S.G.S.A.z.A.S.z.D.x.PXIXGXAXSXFXFXFXAXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXVXBXhXM.n n h.z.S.z.h.A.h.A.h.Z.A.A.A.G.A.A.A.A.S.S.S.S.G.H.H.H.H.H.H.H.S.S.L.S.H.H.S.L.S.U.G.G.L.L.S.L.S.L.L.P.L.L.L.L.L.L.L.L.L.L.L.L.H.L.L.L.L.U.L.L.L.S.L.L.L.L.L.L.L.L.L.L.L.L.P.P.U.L.I.L.L.L.U.L.U.U.U.U.L.I.U.L.U.L.P.T.T.U.U.T.Y.U.U.L.L.L.U.U.U.L.T.T.T.U.T.T.T.T.T.T.T.~.~.~.T.~./.(./.(.(.(.(.(.|.`.}.}. X|.|.}.|. X|.|.`.|.|.`._.`.",
+"H H H H F J H H H H H H H H H H H L H H H L U H H H H H H H D H Z H Z P L L D D P Z Z L Z Z Z Z Z Z Z H D Z D D D Z D D D Z D D D F C F F Z Z Z F Z Z Z Z D F Z Z Z G Z Z D Z Z Z Z C C Z C Z C Z D C Z Z Z Z Z D Z D D H H H H Z J H H H F H L H J H J H H H H P L L L L L P P L P J P J L P L P J P J L J J J J P J L J L L P H L H L L H H H H L T [ Z.Z.l.Z.Z.A.l.Z.A.h.l.h.h.h.h.Z.A.g.A.A.g.A.A.g.g.A.g.A.g.Z.l.g.A.A.l.Z.A.l.A.h.A.l.A.A.A.h.A.S.S.G.S.S.H.F.H.H.H.H.H.H.H.A.A.A.S.G.A.l.A.A.S.G.H.A.A.G.Z.S.D.Z.L.H.H.H.H.H.L.H.H.H.L.H.J.H.K.H.H.H.H.H.H.H.G.H.G.H.H.S.A.G.G.S.A.A.A.A.A.A.l.A.l.A.A.l.A.A.h.A.h.A.h.A.h.h.h.S.A.h.A.j.A.A.h.h.A.A.h.h.l.h.h.h.A.h.h.h.h.h.h.h.g.h.A.h.l.l.l.G.h.h.h.h.h.G.h.j.A.h.A.h.Z.h.A.A.A.h.A.h.G.h.h.G.z.h.h.h.h.A.h.A.A.A.G.l.G.l.l.G.h.h.A.h.l.l.h.l.l.l.l.l.l.A.D.z.A.h.A.l.l.G.g.G.l.l.h.h.k.l.g.g.k.g.k.g.g.g.z.g.g.g.g.z.j.g.g.g.f.j.f.f.f.z.f.f.k.k.a.k.k.a.a.k.a.k.a.a.a.a.a.a.a.f.f.d.g.f.a.g.g.i.k.i.f.k.f.k.f.f.g.f.f.f.f.f.g.z.f.f.f.f.a.k.f.k.k.k.g.d.a.f.d.k.g.g.f.g.f.k.f.h.h.k.h.h.h.l.l.A.h.A.A.A.h.h./ / ! CXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXZXFXBXm.} Q ^ [ !./././.(.(.(._.{.{.(._.(.{.(.(.(.{.^./.(./.(.(.(.(.^.(.~.[././.~.~./.~.T.~.[.T.T.T.T.T.T.T.T.T.T.P.T.P.P.P.P.P.U.L.L.U.S.L.Z.S.H.G.H.H.H.H.D.G.G.G.G.S.S.G.S.S.A.A.D.z.k.GXIXGXPXFXAXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXSXCXaXM.{ c S.l.g.A.A.j.A.h.A.h.A.A.A.A.A.A.G.A.S.S.G.S.S.S.S.H.H.H.H.H.S.L.S.H.G.H.S.L.H.H.S.U.L.L.L.Z.H.L.S.U.U.U.L.G.S.L.L.L.S.L.L.L.L.L.L.H.D.L.G.L.L.L.L.L.L.L.L.L.L.S.L.L.L.P.P.P.U.U.U.U.U.U.U.U.L.K.U.U.Y.P.U.L.L.Y.P.P.P.P.T.P.L.L.U.U.L.L.L.U.U.Y.T.U.U.T.T.T.T.T.T.Y.~.T.T./././././.(.(.^.{.|.(.`.(.}.}.}.|.}.}. X}.|.|.'.|.`.|.|.`.",
+"H H H H L H H P L H Z L P H H J L H H D L J H L H H H F A H H F Z L H Z J P Z H D D H D D D D Z D Z D D G C Z G Z Z D G Z D D Z Z Z Z H Z Z Z Z Z Z D Z Z Z L G Z Z L C Z Z C Z C F Z Z Z C C Z F Z Z D Z Z Z Z D H H F H H H H H H H L H H H D Z L Z L L L L L H H J H J H P P P J P P P P J L P J L P L P J P L J J P H L L H L L L H L H L L L L [ Z.g.Z.Z.Z.A.A.Z.h.A.Z.g.h.l.A.Z.l.l.l.h.g.A.g.A.g.h.l.g.A.g.A.g.A.A.g.l.h.l.A.h.S.A.A.A.A.A.A.A.H.A.H.S.H.H.H.H.H.H.H.H.H.S.G.Z.G.G.G.S.A.G.Z.G.A.A.A.A.Z.G.G.W.S.H.H.K.H.H.U.H.I.H.H.U.H.H.H.H.H.H.J.H.H.H.H.H.H.J.S.S.H.A.H.A.G.S.A.l.G.l.l.l.l.h.A.h.l.A.A.A.h.h.A.A.h.g.Z.A.S.A.A.h.A.D.A.A.h.h.A.l.g.l.h.h.h.l.g.h.h.h.h.h.z.h.l.l.l.h.l.l.l.l.l.l.l.A.A.A.A.A.A.A.A.h.A.Z.A.h.h.h.h.h.h.h.G.l.A.l.l.l.A.A.A.A.h.A.A.A.A.A.j.A.h.h.h.l.l.h.h.A.h.h.h.h.Z.h.h.A.A.h.Z.D.h.h.h.l.l.g.z.h.g.j.g.g.g.k.h.g.g.k.g.g.z.k.g.k.k.k.k.g.g.f.g.d.k.f.f.k.k.f.f.d.f.i.f.i.k.i.d.a.a.x.a.a.d.d.x.d.d.a.k.d.d.z.d.k.d.k.k.k.k.d.k.f.f.f.f.f.f.f.f.f.d.g.a.a.d.f.f.z.a.f.f.f.f.a.g.l.f.f.h.j.h.h.h.h.l.l.A.A.h.Z.j.A.A.z.S.~ ! ! CXZXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXAXAXDXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXAXFXFXZXZXMXQ.} Q ^ [ (.(././.(.(.(.(.`.(.(.(.(.`.(.(.(.(.(./.(.(.{.[.^.(.(.[.(./././././.~.~.!.~.T.!.T.~.T.T./.T.T.T.P.T.U.T.U.T.Y.U.P.P.L.L.U.H.H.G.G.D.G.H.G.G.G.G.H.H.H.H.S.S.S.A.G.h.G.Z.A.SXPXIXGXGXDXZXFXFXZXDXZXZXHXFXVXVXAXFXVXHXZXVXVXZXHXFXVXVXFXFXVXVXCXHXSXJXhXsXc x k.A.h.A.A.A.z.h.A.h.g.A.h.A.A.A.H.G.H.G.S.S.H.A.G.H.G.H.H.H.S.S.A.S.D.H.H.S.L.S.H.H.S.H.G.L.H.L.L.K.G.D.L.G.L.L.H.L.L.L.H.L.H.L.H.S.L.L.L.L.U.L.L.L.L.L.L.U.L.L.U.L.L.L.L.P.P.P.L.P.P.U.U.L.L.U.L.L.L.Y.U.L.L.L.U.Y.P.P.P.P.P.P.U.L.U.L.P.P.U.T.T.U.T.T.Y.T.T.Y.T.T.R.~.!.~.!./././.(./.|.(.{._.|._.[.|._.'.|. X|.|.|.|.|.|.|.|._.`.",
+"H H H P H H H H H H L H H H H H L J J L L J Z J H J H H J H H H L Z Z H L Z Z H Z S Z D D Z Z D Z D Z Z Z Z Z Z Z G D D Z Z Z D G Z Z Z H Z Z L Z Z Z D Z G Z Z Z L Z L C G Z Z Z Z Z C Z Z Z D Z Z C Z Z Z Z Z D Z H H F Z H Z H D L L H H J H S J J J L H L L H H H J H P J U P P P L J J P P P J P L J J L J L J J H P H L H L L L H H L L Z Z T T T [ Z.g.S.Z.g.A.h.h.A.h.Z.l.g.g.g.Z.l.g.Z.g.A.g.l.l.g.g.g.g.k.g.g.g.A.l.A.l.A.l.A.A.A.A.A.A.G.A.A.G.G.Z.S.S.A.H.W.S.H.S.S.G.A.A.A.G.h.A.G.A.h.A.G.S.G.S.S.A.S.S.S.W.H.L.H.G.H.H.S.H.H.J.G.H.G.W.H.H.H.H.H.J.S.H.H.D.S.H.S.S.A.H.A.H.l.A.A.A.G.z.l.A.l.A.A.l.G.h.A.A.h.A.h.G.g.S.h.A.S.A.A.A.h.A.A.A.g.A.z.h.h.h.h.Z.z.h.k.h.k.h.l.l.l.h.l.l.l.h.l.l.h.l.A.h.h.z.A.h.A.A.A.A.A.h.A.A.A.h.Z.h.h.h.h.l.A.h.A.z.A.A.h.A.G.A.A.A.A.A.A.A.A.A.h.l.h.h.h.h.A.h.h.A.A.A.A.A.A.A.h.g.z.S.h.h.h.z.h.h.h.k.g.g.g.k.g.g.k.k.k.g.d.k.k.k.k.k.k.k.d.g.k.k.f.f.f.f.f.f.f.d.f.f.f.k.a.a.a.d.a.i.d.a.a.d.i.i.d.a.a.d.x.d.a.k.k.a.k.k.k.k.a.i.f.d.f.f.j.k.k.a.f.f.a.g.g.a.d.f.f.f.g.f.g.g.g.k.h.f.f.a.g.l.h.h.l.l.h.A.A.h.A.A.A.A.A.! ! ! CXZXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXDXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXAXFXAXZXDXBXm.{ / ^ c.(.!.(.(.(.(.(.(._.(.`.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(././.(././.~.(.~.~.~.!.~.~.T././.T.T.T.T.T.T.T.U.U.T.T.U.U.P.U.U.L.L.H.H.H.A.D.G.H.L.D.L.H.H.H.H.H.G.S.S.S.H.A.A.G.Z.GXGXFXGXHXAXAXAXFXCXHXFXFXVXFXCXHXAXAXFXFXZXHXZXVXFXFXVXZXVXZXZXVXCXHXZXBXpXM.{ c z.A.h.z.h.l.h.A.h.h.D.h.A.A.A.A.S.D.A.S.S.S.G.H.G.G.H.H.S.S.S.A.H.H.S.H.H.H.H.H.H.H.L.D.L.L.L.L.H.U.L.L.L.L.D.L.L.L.L.H.L.L.L.L.H.K.L.L.L.H.S.L.L.L.K.Y.L.U.U.L.L.L.L.L.L.L.P.P.U.P.P.T.L.U.U.L.L.U.L.K.L.U.U.L.U.L.P.U.P.P.P.P.L.U.L.P.L.P.U.U.U.T.T.T.T.T.T.T.!.T.R.~.~.~./././.(./.(.^.(._.^.`._.|._.|._.}. X|.|.|.|..X|.|.|.|._.",
+"H H H H U P P H L J H U H H J K L L J L Z J Z H L H U H H H H H L Z Z L Z H L Z H D D D D D Z Z D Z Z Z Z Z Z Z Z D D Z D D Z G D D D D Z G Z Z L Z D G Z Z Z Z L Z Z Z Z Z Z Z C Z Z C Z Z Z B C Z Z Z Z Z Z H H Z Z G H H H H L H H L P P H P P L L Z H J L L J H J J L L H L P L P P P L P P P P J J L J P L L J L J L L J Z L L L P L L L L H T Z.b.Z.d.Z.Z.A.Z.l.Z.h.Z.h.A.l.Z.h.h.h.l.h.A.g.g.g.g.g.k.g.g.l.g.z.l.g.A.g.l.A.z.A.l.h.A.A.l.h.G.A.H.A.Z.H.A.H.A.H.S.S.A.Z.G.A.S.G.A.A.h.S.A.A.A.A.A.A.A.A.G.S.G.S.W.H.H.H.H.G.G.L.S.G.S.S.S.S.H.A.H.H.H.W.S.H.H.S.A.S.D.S.S.A.S.A.S.A.A.A.h.l.l.l.A.h.A.g.A.z.z.A.l.h.A.l.G.h.A.S.A.h.A.l.G.h.h.D.z.g.h.g.A.h.l.l.h.h.h.h.k.l.l.k.h.h.h.h.h.h.h.h.l.h.h.G.l.A.A.A.A.A.A.A.A.A.h.A.G.h.h.A.h.A.h.h.h.h.h.h.h.A.A.A.A.A.A.A.G.A.A.A.A.A.A.h.h.l.l.h.h.h.A.h.A.A.A.A.A.A.A.A.A.A.A.h.h.l.z.g.l.h.g.g.g.g.g.g.g.d.g.k.g.d.k.d.g.k.k.k.k.z.f.k.f.f.f.f.f.f.f.k.i.f.k.i.k.k.a.a.a.a.d.a.a.z.a.a.d.a.a.k.a.a.d.x.d.a.k.k.k.k.k.k.a.k.f.g.f.f.f.f.f.g.f.d.g.a.f.a.g.f.f.z.d.f.f.g.d.k.g.f.h.l.h.h.h.z.h.h.A.h.A.A.A.A.h.A.A.S / / ZXVXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXGXSXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXDXFXDXDXFXFXFXFXFXFXFXFXFXFXAXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXDXCXHXQ.[ ! ~ [ /./.(.(.(.`.(.(.(.(.(.`.(.(.(.^.(.(.(.{.(.(.(.(.(.(.(.(././././.[.~.~.!.!.~.~.!./.T./.T.~.T.T.T.T.P.T.U.U.T.T.U.P.P.U.L.L.H.H.H.G.G.D.S.D.G.H.H.H.H.H.G.S.S.S.S.A.H.A.G.G.GXGXGXGXHXFXDXVXCXHXHXZXZXAXAXHXHXVXHXFXZXZXHXHXCXFXAXHXHXZXCXFXCXCXHXgXfXm.M.c w a.G.h.h.h.l.h.h.A.h.A.A.h.A.A.h.S.A.S.S.H.A.A.S.H.A.A.H.S.S.A.S.H.A.S.S.S.H.H.H.S.H.D.S.H.G.H.L.H.H.G.L.G.L.L.H.L.H.L.L.L.L.S.L.H.L.L.L.L.L.L.L.L.L.L.L.U.L.U.A.L.L.L.L.L.L.U.L.U.P.U.L.U.L.L.U.U.P.U.L.L.L.L.I.L.Y.U.P.U.U.P.L.L.L.L.L.P.L.L.P.T.T.T.T.T.T.T.T.T.T.T.!.~.~././././.(.(.(._.^._._._.|.(.|.|.|.|.|.|.'.|.`.'.|.`.`.'.",
+"L L H P H H H H L L H H P H G J L L Z L L J L H L H H H H H H H H L L Z J H H H Z D D D D D D Z Z D Z D Z Z Z Z D D D Z D D Z Z Z D D D Z Z Z Z Z Z Z Z Z Z H H Z G Z Z Z Z Z C Z Z Z Z C Z Z Z Z D H Z Z H Z Z D H H H H H H H L H H P H H H P L H J L L L L L J J J P P P P J P J P P P J P P L P L L P J P L J J L P J P H J L L L Z H Z L Z H T b.Z.b.Z.j.Z.S.h.Z.z.A.l.l.h.g.A.h.g.h.g.g.g.A.g.g.g.g.A.h.g.g.g.g.g.g.d.h.h.h.h.l.l.h.A.A.A.A.A.A.h.S.G.G.A.H.S.S.A.W.G.G.Z.S.A.G.A.S.G.A.A.A.A.A.A.A.H.A.A.A.A.A.S.H.H.H.H.I.G.H.G.G.S.W.S.J.W.S.S.H.H.G.G.S.H.H.H.S.A.S.S.H.h.S.S.A.A.h.A.A.l.l.h.A.z.A.g.A.h.A.l.A.l.A.l.j.S.h.A.G.h.l.S.D.A.h.h.k.l.h.g.z.h.g.z.g.k.h.k.k.k.h.h.k.h.h.h.h.h.h.l.h.h.g.l.A.h.h.A.A.A.A.A.A.A.A.h.A.A.A.h.h.A.h.A.h.A.A.h.A.A.h.G.h.G.A.A.g.G.S.A.A.h.A.A.l.h.h.h.A.A.A.h.A.A.A.A.Z.h.h.A.D.h.A.A.h.g.z.l.h.g.g.g.g.a.z.a.k.d.d.d.z.d.d.g.d.k.k.z.k.k.f.k.f.k.f.f.f.f.f.f.f.d.i.d.i.k.a.a.a.a.a.a.a.a.x.i.a.a.z.a.z.d.d.d.d.d.d.k.d.k.k.a.k.d.i.f.f.i.i.k.f.f.a.g.a.g.d.g.f.f.f.a.f.f.g.g.f.g.h.k.z.l.l.h.l.h.h.h.A.h.A.A.A.A.A.A.! ! ! ZXCXZXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXFXFXFXFXGXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXVXFXZXDXDXBXpX} S ~ [ /.(./.(.(.(.(.(._.(.(.(.`.(.(.(.^.(.(.(.(.^.(.(.(.^.(./.(.(././.~.~.!.[.~.~.~.T.T./.T.~.T.~.T.T.Y.T.T.T.T.U.U.U.P.P.L.L.L.S.S.H.D.G.S.D.H.G.H.D.H.S.S.G.D.G.S.S.A.A.A.z.l.AXGXGXHXBXJXHXJXBXfXJXJXgXJXBXJXBXfXfXBXJXfXJXfXBXJXBXJXfXBXfXBXHXfXJXhXaX{ c x w g.f.h.h.h.h.h.h.h.h.h.h.A.A.A.z.A.A.A.A.A.S.h.S.A.G.S.S.A.A.A.A.h.A.z.S.S.G.G.H.H.H.H.H.H.H.H.H.H.H.L.G.L.G.H.L.L.L.L.H.L.H.L.H.L.H.L.L.S.H.L.L.L.L.U.L.L.L.L.L.L.L.U.S.L.L.U.L.P.P.U.U.U.L.Y.L.L.Y.P.U.Y.L.L.L.L.U.P.U.U.U.U.Y.L.L.L.L.L.P.P.U.Y.Y.T.U.T.T.T.T.T.T.T.~.~.~./././.(./.(.(.^.{._.(._._.{.{._.|.|.|.|.|.|._.@X|.@X`.`.",
+"H L L L H U P P L L H L H H G J L L H Z H L H J H J L H H H H H H H L Z Z L Z L H D Z D D Z D Z D B Z Z Z Z Z Z L Z Z Z D Z G Z Z Z G Z D Z Z Z Z D Z G H Z Z H G Z Z Z Z Z C H Z Z Z Z Z Z Z Z Z Z F Z D Z D F D L Z H H H H H H H P L P H H H L H L H L L J L P H P P J P J P L P P P P P P P P P U P P P P J P H J J H J J H L L L L G L H H H [ Z.Z.[ d.e.g.Z.g.d.b.l.g.h.h.A.z.h.Z.g.g.g.h.d.d.l.k.g.g.g.z.k.k.k.g.f.z.g.h.A.h.l.h.A.A.h.l.h.h.H.A.A.S.A.H.G.A.Z.G.A.A.Z.W.G.A.A.S.G.D.l.A.A.A.A.A.A.A.A.A.A.G.H.A.A.H.H.G.L.G.A.G.G.G.G.H.S.A.L.G.G.G.S.S.G.G.D.A.S.A.D.A.Z.A.A.A.D.z.A.k.G.l.l.A.A.z.h.A.g.z.h.G.A.l.A.A.G.S.h.A.l.A.l.h.g.h.g.h.g.h.h.h.f.h.z.f.h.h.k.k.h.h.h.h.g.h.h.g.z.f.h.l.z.h.g.g.h.A.A.A.h.A.A.A.A.A.A.A.G.h.z.n.J.h.A.h.h.A.h.G.A.A.A.A.A.A.A.G.A.A.H.A.A.A.A.A.l.l.A.l.A.h.A.A.A.A.A.A.A.A.A.A.z.A.h.h.h.h.z.h.h.h.k.k.z.k.k.g.z.z.k.z.d.d.k.f.k.k.k.a.k.k.k.k.z.f.f.f.f.f.f.f.z.i.a.g.g.k.i.a.i.a.a.a.a.a.a.a.a.a.k.a.k.a.d.z.z.i.k.i.d.k.k.f.f.f.f.f.f.k.i.f.g.f.f.i.g.g.a.a.a.f.f.f.g.g.a.a.g.f.z.g.h.g.h.h.h.l.l.h.h.A.A.A.A.A.A.A.~ ~ ! BXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXAXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXGXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXAXFXFXFXFXFXAXFXAXZXZXBXm.{ ! ^ [ /./.(.(.(.(.(.(.^.|.(./.(.(.`.(.(.^.(./.(.(.(.(.(.(.(./.^./././.~././.~.~.~.~.~.~.~./.~.~.~.~.T.T.T.P.T.T.T.T.T.P.U.U.L.L.H.H.G.S.D.H.H.H.G.H.A.S.S.L.A.H.A.G.S.H.z.A.A.G.CXBXaXaXm.M.V.pXm.M.m.M.pXpXM.M.pXpXM.M.m.M.pXM.pXM.pXpXM.pXpXM.m.M.M.M.c c - z t j.z.h.h.h.l.h.h.h.l.A.h.A.A.h.A.A.A.A.S.A.A.A.A.A.H.h.A.A.A.l.A.A.A.S.h.S.S.S.S.G.G.H.H.H.H.H.H.H.H.H.H.H.S.L.L.L.L.Y.H.L.L.S.U.K.H.Z.U.L.L.L.L.L.L.L.L.L.P.L.K.L.L.S.Y.L.U.L.L.L.L.U.U.U.P.Y.P.U.L.U.L.L.U.L.L.U.L.L.U.L.L.L.L.L.L.L.L.L.L.U.L.U.Y.U.U.T.T.T.T.T.T.~.T.(.T././././.(./.(.(.(._._._._._._.|.}.|.}.}.|.|.|.|.@X|.|.|.",
+"P H J J J J J H J L J H J H H J L J L J H L L H H H H H H J H Z L L Z L L Z L Z Z S D D D D Z D F G Z Z Z Z Z Z Z Z Z Z Z D Z Z D Z Z Z Z D Z Z D Z H Z G Z Z G H Z Z Z C G C Z Z Z Z Z Z Z D D D Z Z Z Z H D H H F H H H H H H H J H H H J P H P J L P J J P P P P P I P P L P P P P P U P P ( P L P P P L P L P L H J J J P L L L Z J J D L H G b.b.d.Z.Z.Z.Z.Z.Z.j.Z.Z.Z.Z.j.h.k.g.j.g.j.j.h.l.g.g.k.g.g.g.d.g.d.g.k.f.f.g.g.g.g.h.h.h.h.h.l.h.A.A.A.A.A.S.A.A.G.G.G.S.A.G.h.A.A.G.A.z.A.G.A.h.G.A.W.S.W.G.Z.A.A.A.H.H.A.J.S.A.J.S.H.S.A.S.G.G.H.G.G.A.S.G.W.S.A.S.D.A.S.S.A.A.A.A.A.A.A.A.A.z.l.l.l.l.h.h.A.A.A.A.h.A.l.l.A.h.h.A.h.l.A.A.h.g.g.h.g.l.g.z.h.h.h.h.g.k.k.h.f.k.h.f.k.h.h.g.g.h.l.h.h.l.h.G.l.A.A.h.A.A.A.A.A.A.A.A.A.A.h.z.A.A.h.A.h.h.A.A.A.A.A.A.h.A.A.A.A.S.h.h.S.A.A.A.h.S.z.l.A.h.h.A.A.A.h.A.A.A.A.A.h.h.A.h.h.h.h.f.l.k.h.h.k.f.f.f.f.i.d.i.i.d.k.d.i.d.k.a.k.k.k.d.z.f.f.f.f.f.d.k.i.f.a.a.i.i.i.a.a.d.a.d.a.a.a.a.a.a.k.a.a.d.x.a.k.i.k.i.f.i.z.k.i.d.f.i.d.i.f.f.f.f.f.a.g.a.a.d.g.z.f.g.a.a.z.z.g.g.f.g.g.g.g.g.h.h.l.l.l.j.A.A.A.Z.A.A.l.~ ~ / CXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXAXFXFXFXFXGXFXFXFXFXAXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXAXDXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXZXSXMXm.[ Q ^ c./././././.(.(.(.`./.|.{.(.`.(.(.(.(.|.|.|.|.(.(.(.(.(.(././././././.~.~.~.~.~.~.~.~.~./.~.T.~.~.^.P.T.T.T.T.U.U.P.Y.L.L.L.L.G.L.H.H.S.G.G.H.H.H.S.D.H.H.H.D.H.D.H.G.G.G.Z.JXaXpXM.n c n c n c c c c c c c c c c n b c c c c c c c c c c c n c _ x w z h t c j.z.d.k.h.l.h.h.l.l.A.h.A.h.A.g.A.A.h.S.A.A.A.A.A.A.S.h.A.A.A.G.A.J.S.G.S.A.S.S.S.H.H.G.H.D.H.H.h.H.H.H.H.H.S.L.L.H.H.H.L.H.U.H.S.H.S.L.L.L.L.L.U.L.P.P.L.L.L.L.L.L.H.L.L.L.I.L.I.U.U.U.P.U.L.T.P.U.L.Y.U.L.L.I.Y.L.U.U.L.L.L.L.L.L.L.L.P.P.U.Y.Y.L.U.T.T.T.Y.T.T.~.~.~.(./././././.(.(.(.(.(.(._._._._._.|.}.}.}.}.|.|.|.|.`..X|.|.",
+"J H J L J J H J H H J H H J F J L L L Z H J H H H H H H H Z L D L Z S Z H L Z H L D D D D F Z Z Z G Z Z Z Z Z D H Z Z Z D H H Z Z Z D D Z G Z G Z Z G Z Z H Z Z Z Z Z Z Z Z Z Z Z Z Z Z D Z D D Z D D D Z Z H H H Z H H H H P H H J J J H J L L J J J J J P J J P P J K P J P P P P P P P P L P P L ) P P P L P P L L J J P L L J L L H L H Z P U [ d.b.b.b.d.d.e.Z.Z.d.j.Z.j.j.d.b.e.j.d.j.j.d.d.g.g.g.f.d.f.d.d.k.d.k.k.f.g.g.g.g.h.z.g.g.g.l.h.l.z.h.A.A.A.S.A.A.G.Z.S.A.A.A.G.A.G.A.A.l.A.A.G.S.G.A.A.G.S.G.H.Z.S.S.S.S.A.S.S.A.H.S.S.G.S.A.H.H.S.Z.S.W.S.A.S.S.S.A.A.A.l.A.A.A.A.A.A.g.A.k.l.l.z.l.A.g.g.A.z.A.h.A.h.A.A.h.A.A.A.h.h.A.h.A.h.h.z.h.g.g.g.g.f.h.h.k.k.h.f.g.h.k.k.h.j.h.k.g.j.h.h.l.l.l.l.g.A.h.h.A.A.A.A.A.A.A.A.A.A.A.A.h.A.h.A.A.h.h.W.j.A.A.J.A.A.W.G.A.h.S.A.A.A.A.A.h.A.h.A.z.A.A.A.G.A.A.A.h.A.A.A.A.A.h.D.h.h.h.h.k.g.g.k.k.a.f.f.f.i.z.z.i.i.z.z.i.a.d.d.a.d.d.z.d.f.f.f.f.f.f.d.f.a.a.i.g.a.a.a.a.a.i.a.a.a.a.a.a.a.a.k.k.a.k.d.d.a.z.k.i.i.z.i.d.d.f.d.d.a.k.f.f.a.k.g.f.a.g.g.a.k.k.f.f.a.g.f.g.g.g.j.j.x.j.h.h.h.h.h.A.h.A.A.A.A.A.A.A.J ! ! CXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXDXFXFXDXAXDXAXAXDXSXDXFXFXFXFXDXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXAXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXFXFXBXpX} ~ S [ /./.(.(.(.(.(.(.^.(.(.|.^.`.(.`.|./.{.(.|./.(._._.(.(.(.(././.^.!.(.~.~.~./.!.[.~./.~./.[.T.~.~.~.T.~.T.T.Y.Y.P.Y.P.L.L.L.G.L.H.L.G.H.G.H.G.H.H.G.A.H.H.H.D.S.G.H.A.G.Z.A.].n.c.c f w n l w w l z - c z z w c z w l z t w l z w z w h w l w - z w w h u i Z.x.k.k.k.h.k.g.g.h.l.h.A.h.A.Z.h.A.A.A.A.h.A.A.A.A.A.A.A.A.A.A.A.A.A.S.A.A.S.S.S.S.G.S.S.A.S.S.H.H.H.S.S.H.H.S.L.S.L.H.K.H.H.Z.D.K.H.U.S.U.L.L.L.U.U.P.P.P.P.L.L.L.G.H.L.L.L.U.L.U.L.U.U.Y.U.U.T.L.T.L.U.U.L.L.L.K.J.L.L.L.G.L.L.H.L.L.P.P.P.L.L.U.L.Y.T.T.T.T.T.T.T.R././.!.!././.(.(.(.(.(.{.`._._._.|._._._.|.|.|.|.|.|.'.`.'.|.|.",
+"P P P P P J P J I J J J J J J H L J J J L H H H H H H H H H H H L Z L Z H Z H Z Z Z D Z Z Z D Z D D Z Z Z Z G B C G G D Z Z Z Z Z Z Z D Z Z D D D Z Z Z Z Z Z Z Z H Z G C Z Z Z F H A C D Z D A D Z D D Z H Z H Z Z H H H H H H L J J J P J H J J J J J P P J J P P I J H J P Y P P I U P P P P P P L P P J P P J P J J J J Z J H L H L Z L D U T Z.Z.Z.j.Z.Z.b.b.d.Z.e.Z.j.e.Z.d.Z.j.d.d.d.d.i.d.d.d.d.d.f.i.d.d.d.d.d.f.i.f.k.i.g.f.f.g.g.h.h.h.h.A.A.z.A.A.h.H.A.A.A.A.A.A.G.A.A.l.A.S.A.l.A.A.A.A.A.S.A.G.S.G.G.A.H.A.S.S.A.A.W.A.S.G.l.A.W.S.A.A.G.A.A.S.G.A.A.A.S.A.A.A.A.A.A.A.A.A.z.A.g.l.l.l.h.z.g.A.z.z.l.A.h.A.l.h.A.l.h.A.h.A.h.h.h.h.h.h.g.g.g.g.k.z.f.k.f.j.k.k.j.k.k.k.j.k.f.h.h.h.h.h.l.l.l.G.g.h.A.A.h.A.A.A.A.A.A.h.h.A.h.h.A.h.h.A.h.A.A.A.G.A.G.h.A.A.A.A.A.J.A.A.A.A.g.A.A.A.A.A.h.h.A.A.h.A.A.h.W.A.A.h.A.g.A.z.z.h.h.k.h.g.g.g.f.k.f.j.f.i.i.i.f.i.a.a.i.k.d.d.k.a.k.d.x.f.f.f.f.i.d.d.f.a.k.z.a.a.a.a.a.a.a.a.i.d.a.a.a.a.a.a.a.k.a.k.a.k.i.z.a.a.i.i.k.k.d.d.i.k.a.f.k.z.z.f.f.g.f.a.i.k.g.a.f.z.i.g.g.f.k.a.h.f.j.h.h.h.h.h.l.A.h.A.j.A.A.A.A.~ / ! ZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXFXFXBXm.[ ~ ! ] (.!./././.!.(.`.(.(.|.^.`.^.`.^.(.|.(.|.^.|.(._.[._.(././././.~.~.~.!./.~.^.~.~.~./.~.~.^.^.~.~.~.T.~.T.~.T.Y.Y.P.U.L.L.L.G.L.U.G.G.D.H.G.H.G.H.H.H.H.H.H.H.S.S.H.G.Z.D.k.A.n.c w z w w l w h w w z - w - z - w w u w w l - w z - n w z t z z w z u w ` e.z.g.j.k.h.l.k.h.g.l.l.A.h.h.A.h.A.A.A.A.A.A.A.A.A.A.A.A.A.h.A.A.A.A.A.A.h.G.A.A.S.S.A.S.S.S.S.H.H.h.H.H.S.S.S.H.H.H.H.S.U.H.H.S.L.H.H.L.L.L.L.L.L.U.L.P.P.L.U.L.L.L.L.L.L.S.L.U.U.L.U.T.U.U.Y.P.P.P.P.L.L.K.L.U.L.L.L.L.L.L.L.L.L.L.L.P.P.L.U.U.U.U.L.I.U.U.T.T.T.T.T.R.T.!././././././.(.(.(._._._._._.|.|._._._.|._.|.|.|.|.|.|.|.|.",
+"I P P P P J J P J J J J J L J H L L H L H H L L H H H H H Z Z L Z L Z L L Z L Z H Z Z Z H A D D Z Z H Z Z H Z Z Z Z L Z Z Z Z Z Z Z Z D D Z H D D D Z Z G C C Z Z Z Z Z Z Z Z D D D D D Z D Z D D D H D D H D H L Z H H H H H H P J P P H J P J U H H J J P P P P I I I U P I P P I P P P P P J P P L P P P P P P L P L L P J J L L L H L L H Z T b.Z.b.Z.Z.b.d.g.b.j.d.Z.e.j.Z.d.e.d.e.d.d.j.e.d.d.d.i.d.s.e.a.i.i.i.i.i.d.s.i.f.d.k.d.k.k.k.g.z.g.z.z.A.h.A.A.j.A.A.A.A.S.A.A.h.A.A.G.A.A.D.D.A.A.S.S.A.S.S.S.A.H.A.G.S.G.A.S.G.A.G.A.G.S.A.G.A.A.A.G.A.A.G.W.A.A.A.h.A.A.A.S.A.A.l.l.A.A.z.Z.l.l.A.g.l.l.h.l.z.A.l.l.A.l.D.z.l.S.A.l.l.l.l.l.h.z.g.g.f.h.g.k.k.k.f.k.g.k.k.k.k.g.k.g.g.a.g.g.z.h.h.l.l.l.A.h.A.h.h.G.A.G.A.A.A.A.A.A.Z.h.A.h.h.A.A.A.A.A.A.A.A.A.G.A.A.l.A.z.H.G.h.A.A.A.z.h.l.l.A.A.h.h.h.S.A.A.A.A.A.A.A.h.A.h.A.k.h.h.k.g.z.g.a.f.f.a.f.s.k.i.a.a.a.a.a.a.a.a.a.a.a.z.a.a.z.a.a.z.z.i.z.i.a.a.a.a.a.a.a.a.a.u.k.k.i.a.a.a.k.a.a.a.a.a.a.a.i.k.i.f.a.k.i.i.k.z.i.i.k.f.f.k.d.a.f.a.f.a.g.a.g.a.f.a.g.g.f.f.h.f.f.k.z.f.g.g.h.h.h.h.z.h.A.A.A.A.A.A./ ! / CXAXAXZXFXGXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXVXZXZXBXm.[ / S [ ~.~.[.E.^./.!.^.(._.(._._.`.(.`.`.`.(._.^.|._._.(.(.(./.(.^./././././.~.!.(.~./.~.~././.E.[.^.~.T.!.~.T.T.T.Y.I.U.U.L.L.L.L.S.S.L.G.G.L.D.L.G.D.D.H.H.G.G.D.G.H.G.G.A.A.A.A.A.A.A.A.A.A.A.A.h.A.A.l.A.l.l.l.h.z.D.g.k.k.d.d.k.d.i.i.k.z.k.k.f.k.g.g.g.g.g.g.g.g.h.k.h.h.g.Z.k.g.D.A.A.A.A.A.A.A.A.A.h.h.h.A.h.A.S.g.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.h.W.H.A.H.H.A.S.H.S.S.H.H.H.H.H.H.H.L.H.H.L.H.L.U.L.U.L.L.P.L.P.U.L.U.L.L.L.L.L.D.U.U.L.L.K.U.L.U.Y.T.U.U.L.U.Y.U.L.L.L.L.L.L.L.K.L.L.L.L.L.L.L.L.L.L.L.P.L.P.T.U.T.U.T.T.T.~./.~.~./././././.(.!.(.(.(.`.|._.}.}.}.}.|.{.|.|.`.`.|.|.|..X.X.X",
+"I I I I J P J P J J H J P K H J J Z L J H H H H H H G H H L H H L Z L Z L S Z Z Z Z Z Z D D D D Z G Z Z Z Z D G G Z Z Z Z Z Z L Z Z D D Z D Z Z D Z Z G Z D D Z Z Z Z Z Z Z Z Z C D B D Z D D D D D D D H D D H H Z U H I H H U J P H P J P P P P J I I P P I J J P I P I P P P P I P P P U U U U P L P L I Z P P L L L U L L H G L D H H D H U b.Z.Z.Z.Z.Z.j.Z.d.Z.b.Z.Z.g.j.j.d.Z.j.g.e.d.j.d.d.d.i.i.d.d.a.i.i.a.a.s.d.d.i.a.i.a.i.k.z.k.a.z.h.z.g.z.g.z.z.A.A.h.l.h.h.A.A.G.A.A.A.g.A.z.A.z.A.A.A.S.S.A.S.S.H.A.H.A.S.S.A.A.A.W.A.A.A.G.S.G.W.A.H.A.A.W.h.A.A.A.A.A.G.h.h.S.A.z.A.A.z.A.Z.d.A.l.l.l.g.A.A.l.A.l.A.h.l.l.l.l.S.l.l.l.l.l.h.A.g.g.h.g.g.f.f.k.k.f.f.k.g.g.g.k.k.k.k.g.g.z.h.g.l.l.h.h.l.h.h.h.h.A.G.g.A.h.A.A.A.A.A.h.h.h.A.h.A.A.h.j.A.A.h.A.A.A.A.A.G.A.A.H.h.S.S.A.A.h.A.A.h.A.h.A.A.A.A.G.A.h.A.A.A.A.A.h.A.h.h.h.h.h.h.g.k.f.z.f.g.a.a.f.k.i.z.a.a.d.a.z.a.a.a.a.d.a.a.a.a.z.a.a.a.i.k.k.a.k.a.a.a.a.a.a.i.k.i.u.a.u.a.a.a.a.a.k.k.k.a.k.k.i.k.i.a.a.i.k.i.i.i.z.i.f.a.k.f.g.f.f.f.f.g.f.g.a.f.f.a.k.k.f.f.f.z.f.g.g.g.f.h.h.h.h.h.h.A.A.G.A.A.h.S S / CXAXAXAXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXHXQ.{ ! ! [ ^.~.^.(.^./.(.{.(.(.(.(.(.{.^.^.(.(.(.|._.(.^.|.`.(./.(.!.~./.^./.~.~././.~.~././.~././.(.~.~.T.^.~.~.T.~.T.Y.T.U.Y.U.L.L.L.U.S.L.L.L.G.H.D.H.D.G.H.G.A.S.G.D.A.G.A.G.A.A.A.h.h.A.h.A.A.A.A.h.A.l.A.h.l.l.l.g.l.g.A.g.k.k.i.k.d.f.i.i.z.f.f.k.k.g.k.g.g.g.k.g.l.k.h.g.z.k.k.k.l.g.z.l.g.g.A.h.A.A.A.Z.A.A.h.A.h.g.A.l.A.h.A.A.h.A.A.G.A.G.A.G.A.G.A.A.A.S.A.A.S.H.S.S.G.H.S.H.H.H.H.H.H.H.K.H.L.L.S.L.S.L.L.P.L.L.U.L.L.U.L.U.S.K.L.K.S.L.L.U.U.Y.T.U.U.U.U.Y.T.I.I.U.Y.Y.L.L.L.L.S.L.L.L.K.L.L.U.U.P.P.P.L.Y.U.I.Y.Y.T.T.T.T.T.~.~.~./././././.(.(.(.^.(.(._._.}.}.|._.|.|.|.|.`.|.|.|.'.|.|..X",
+"I J P U P P P P P P J P L P J J J L H H H H H H H H Z L H Z H H Z S Z L L Z L Z D D L Z Z D H Z L H C Z Z Z D Z Z Z Z Z Z Z Z Z Z Z D F D Z Z D D G D C D Z D Z Z Z Z Z D Z G Z Z D G Z D Z D D D D D D D H H H H H H H H H H P J P H P H P P P I J P P J L P I I I P J P P P P P I I S S ) I S I L J P P P P P L P P J J H J J U L L P L H D U j.Z.Z.Z.d.b.b.d.d.b.f.j.Z.e.j.j.d.d.Z.d.d.j.d.d.d.d.e.i.i.s.s.i.i.e.i.s.s.s.s.a.f.d.f.i.f.z.a.A.g.g.z.z.h.h.g.h.z.A.A.l.A.h.A.l.A.h.A.G.z.D.l.A.G.A.A.A.A.W.G.A.S.A.H.H.G.S.S.A.A.A.G.A.A.W.A.A.A.A.A.A.A.G.A.Z.A.A.A.l.h.A.A.G.A.A.A.A.l.A.A.d.z.g.l.g.z.h.h.Z.l.z.l.A.A.l.S.l.z.A.h.l.h.l.z.h.h.g.h.f.j.f.g.k.f.k.k.f.k.k.k.k.k.k.g.g.k.g.a.l.g.g.h.h.l.l.S.z.h.A.h.A.A.A.A.A.h.A.h.Z.h.A.h.h.h.A.A.A.A.A.A.A.A.A.S.G.A.A.A.A.A.G.A.A.A.A.h.A.A.A.A.A.g.A.A.A.A.G.A.A.A.A.A.A.h.A.k.h.h.h.k.k.f.z.z.a.f.f.a.a.a.a.i.d.a.a.a.a.a.a.a.a.a.a.a.a.a.k.z.a.a.a.i.i.a.a.a.a.a.a.a.a.a.u.a.a.a.a.a.a.a.d.a.a.a.a.k.a.f.i.i.a.i.a.a.a.i.k.i.k.i.k.i.f.g.f.f.f.g.g.a.g.j.a.g.a.z.g.a.f.f.f.z.h.g.g.g.g.z.j.h.l.h.g.A.h.A.A.D.D./ Q ! ZXVXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXDXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXDXFXFXFXFXFXFXFXFXFXFXDXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXSXFXFXFXFXDXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXCXDXBXm.[ Q Q ` ~.~./././.(.(.(.(.(.(.(.|.(.`.^._.(.(.^.(.(._.(.^.(.(./.^././.~.~.^./.~././.~.^././././.[.(././.~.~.~.~.~.T.T.T.T.U.L.L.L.L.L.U.S.A.P.H.H.G.A.D.D.H.D.D.D.G.G.H.G.G.A.A.A.A.h.A.A.A.A.h.h.A.h.Z.A.h.g.h.l.l.z.h.g.g.l.k.f.f.i.i.f.f.f.d.f.f.k.k.k.h.g.k.g.k.k.k.g.g.g.g.k.D.l.d.h.l.g.D.A.A.A.A.A.A.A.h.A.G.g.A.G.g.z.g.A.A.h.A.A.H.g.A.A.A.A.A.A.A.A.A.H.S.J.S.S.S.G.S.A.H.H.H.H.H.H.H.H.L.G.K.L.L.L.L.S.U.L.U.U.U.L.L.U.L.H.U.L.L.L.L.L.Y.I.L.U.U.Y.U.U.U.U.T.U.U.U.L.U.L.U.L.L.L.L.L.L.U.L.L.L.P.U.P.P.P.U.U.T.T.T.T.T.T.~.~.T.~.~.~././.^.(.(.(.(.(.(._._._._.|.|._.|._.|.|.|.|..X.X|..X|..X",
+"P ) I S J P P H P L P L L L H J J H L H L H H H L L Z L H H H H ( L L Z Z Z Z Z D P Z Z D Z Z Z Z Z G Z H Z Z D H Z Z Z Z Z Z Z Z Z D Z Z G D Z Z C Z Z Z Z D B Z Z Z Z D Z Z Z C Z D H Z D D D D Z D H H H D H D H P H H J P H J J P P P P P L P P P P I P I P K I I I P ! P ) P P I I P I I P P J P P P P J P J L H J L H H L S K H F S H H U Z.e.j.Z.Z.Z.Z.Z.j.Z.d.Z.d.Z.j.j.b.j.d.d.j.d.j.d.d.d.i.i.d.d.d.d.d.d.i.d.i.e.a.a.f.u.i.f.a.a.f.f.f.g.g.l.z.h.j.h.h.h.z.l.h.h.Z.l.A.h.A.h.A.l.D.A.A.A.A.A.A.S.H.A.H.A.H.A.S.G.A.A.Z.A.A.G.A.A.h.A.A.A.G.h.W.A.A.A.A.A.A.A.G.l.h.h.h.l.l.l.A.z.A.l.h.l.l.l.h.z.k.h.A.l.l.l.l.S.l.A.h.h.h.l.h.h.g.z.g.g.g.z.f.f.f.f.k.f.g.k.k.k.k.k.k.k.k.g.g.z.l.h.z.h.h.h.h.l.h.h.A.h.W.g.A.A.A.A.A.A.h.h.A.h.h.Z.h.A.g.A.A.A.A.A.G.H.h.A.G.A.A.G.A.A.A.A.A.h.A.A.A.h.g.A.A.A.G.A.A.G.A.A.h.A.h.h.A.h.h.h.h.k.g.h.z.z.a.f.a.a.f.a.a.a.a.a.u.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.z.a.a.a.a.a.a.a.a.a.i.a.a.u.a.a.a.a.a.a.a.k.a.a.a.d.i.k.a.a.k.a.a.a.f.a.i.k.f.f.k.f.a.g.k.f.k.a.f.a.f.f.d.g.a.g.g.f.f.f.f.f.g.k.g.h.h.h.h.l.h.G.A.A.A.A.h.g.~ ! S CXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXDXZXHXQ.{ Q ! [ ~.~./././././.(.(.|.{.(.^.(.`.(.(.(._.`.(.(.^.(.(.(.(./././.~./.~.~.T.[.~././.~././././././.(./.^./.~.~.T.~.~.T.U.T.T.L.L.U.L.S.L.L.P.D.D.H.H.G.A.H.G.G.D.H.S.S.G.A.G.l.A.A.A.A.h.A.h.A.A.h.h.G.l.A.D.l.l.h.h.h.g.g.g.k.f.f.f.k.k.f.f.f.f.k.f.f.d.h.g.g.g.k.l.k.z.l.g.z.z.d.A.D.h.g.g.k.A.l.l.A.A.j.h.A.j.l.h.h.g.g.A.S.h.A.A.h.z.A.A.h.h.A.A.A.A.G.A.G.A.A.h.H.S.S.H.S.H.H.H.H.H.H.H.S.S.L.H.H.L.S.P.S.L.L.L.L.U.L.U.L.L.L.Y.L.L.L.L.L.L.L.K.U.U.U.U.U.U.Y.I.U.U.U.U.U.U.L.U.U.K.L.L.U.L.U.Y.U.U.P.P.P.Y.U.T.U.T.T.T.T.T.T.T.~.~.~.~./././././.(.(.(.^.(._._._._._._.{.|.|.|.|.|.|..X|..X'..X.X",
+"I P ) P P P P P J P P L P H J H P H P L H H H H L Z L Z Z H H H Z G Z P Z L U Z D D Z H Z D D Z Z L Z Z D D D Z Z D Z Z Z Z Z Z Z Z Z Z Z G Z Z Z D Z Z Z Z C D Z Z Z Z Z Z Z Z D G Z D D D Z D D H H H H H H H U H H J J J J Y P P J J J P P P P P U P P P ( P I P I I I U J P I I I P P I ( U P L J L P S J J J L H J H H H H J Z G H J P P T b.Z.Z.Z.Z.Z.Z.Z.j.Z.Z.d.Z.e.b.g.f.g.e.g.g.d.d.d.d.s.s.d.i.d.s.d.d.s.s.p.i.i.i.i.p.a.a.a.a.i.k.z.h.a.h.f.g.z.g.l.z.h.h.h.h.h.l.l.A.h.A.l.A.z.l.A.h.A.A.W.W.Z.A.A.G.G.G.Z.A.A.G.A.A.A.A.A.A.A.A.A.A.A.l.A.G.h.A.A.l.D.h.A.A.A.A.A.A.l.h.h.h.l.l.l.z.A.h.h.A.h.z.A.A.l.l.l.h.h.h.A.h.A.z.h.z.h.g.z.g.f.g.g.d.f.f.k.f.f.f.z.f.k.z.h.g.z.g.k.k.g.h.k.l.z.l.h.l.h.h.z.g.G.A.A.A.G.A.A.A.A.h.A.h.h.A.h.h.A.A.A.A.A.A.A.G.g.A.G.h.H.A.A.A.A.A.A.A.A.h.A.A.A.H.g.A.A.G.A.A.A.A.A.A.z.l.A.l.l.l.h.k.k.g.g.z.a.f.a.a.a.a.a.a.a.i.i.i.a.a.i.E z.a.a.a.i.a.a.a.a.a.a.a.z.i.a.z.f.a.a.i.a.a.i.u.a.a.a.u.a.a.a.k.a.a.a.a.a.a.a.k.i.a.a.a.z.a.a.f.i.z.a.a.k.f.f.g.a.k.z.g.a.g.a.f.a.g.a.g.a.k.f.k.d.a.g.g.g.k.g.h.h.h.h.h.h.A.h.A.A.g.A.~ / ! CXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXAXGXSXDXDXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXAXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXZXBXm.} Q ^ [ ~.~.~.(./././.(.(.(.(.(.(.`.^.(.{.(.(.^.(.(.(.^.(.(.E.[.~.~.(./.^.~.~.~./.!.~.^././././.(./.!./././.~.~.[.~.T.T.T.T.U.U.U.U.P.L.L.D.S.L.H.L.S.S.D.G.H.G.S.D.G.S.A.G.G.A.A.A.A.h.A.h.h.A.h.A.h.h.l.g.A.k.h.h.h.h.g.g.g.f.k.f.f.f.f.f.f.f.f.k.f.g.h.h.f.z.g.l.k.z.g.g.k.k.g.g.k.k.h.h.h.h.h.A.l.h.A.A.g.A.A.h.h.h.l.l.z.A.j.G.h.A.Z.A.A.A.A.A.A.Z.A.A.A.A.A.A.G.A.G.S.G.G.D.S.S.H.H.H.H.H.S.K.H.L.L.S.L.L.L.L.L.U.L.U.L.I.L.U.L.L.L.P.L.L.L.L.J.K.L.Y.U.U.U.L.L.L.L.U.U.Y.L.L.U.L.U.U.U.U.U.Y.U.U.R.L.U.U.L.P.T.T.T.T.T.T.T.T.~.~.T.~.T.^./././.(.(.(.`.`.(._._.(.^.|._._.|.|. X|..X.X|..X.X|..X.X",
+"I I P I P P P P J P K P L J H U H H H H H H D H Z Z L L P H Z Z L Z Z L H Z S Z D D Z H D D D D G Z Z G Z Z D D Z D Z Z Z Z C Z Z Z Z Z Z Z Z Z Z B Z Z Z Z D Z Z Z Z Z G Z Z Z Z Z Z Z D D G D H D H Z H H H H H H J H J J J K J J L P P P P P P P P P P I P J I Y P I I ) ) I P U P I I P I L P U L P H J J U L L J H P H L G U L H H Z D G [ Z.Z.Z.Z.Z.Z.Z.d.Z.d.j.g.g.Z.j.j.j.j.j.j.j.d.j.d.j.d.d.d.d.d.d.i.d.i.d.s.s.i.s.i.d.s.d.a.i.k.a.i.a.z.a.z.g.a.g.g.z.h.j.z.h.h.l.l.A.l.l.A.A.D.D.A.A.A.A.h.h.G.A.H.G.Z.G.G.G.Z.A.G.A.S.S.A.G.A.J.h.A.G.A.G.h.G.A.A.l.h.S.A.A.A.A.h.l.G.A.A.l.h.l.A.z.g.h.h.g.z.j.h.h.z.l.A.l.A.G.A.l.h.l.h.z.j.g.h.f.k.f.f.g.f.f.d.f.f.f.j.k.k.g.k.g.g.k.k.g.k.h.g.h.l.h.h.l.h.h.S.A.h.h.A.j.A.A.A.A.h.A.h.h.h.Z.A.h.A.h.A.S.h.S.A.G.J.z.G.G.A.A.A.A.A.A.A.G.j.g.J.g.A.A.H.A.A.A.A.A.A.A.A.G.G.l.A.l.l.h.l.h.k.j.g.f.f.a.f.k.a.a.a.a.a.k.i.i.a.i.a.a.a.a.a.i.a.a.i.a.a.a.a.a.a.a.a.i.i.k.a.i.a.i.a.a.a.a.i.a.a.a.a.a.a.a.a.a.a.a.a.f.i.a.i.a.i.a.a.k.i.a.k.f.k.f.f.f.g.a.f.a.g.g.d.g.a.a.g.g.z.a.g.a.k.k.g.g.g.g.g.h.h.h.l.h.Z.h.A.A.A.H.z.~ ~ ~ CXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXDXAXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXDXHXHXQ.[ ! ^ [ ~.T.~.~././.^./.(.(.(.(.).{.(.(.(.(.[.`._.(.(.(.(.(.^.^.(.~.~.~.!.~./.~.~.(.[.~.~./.(.^./.(.(./.(./.~.~.~.T.~.T.T.T.Y.T.T.P.L.P.P.P.U.P.S.S.H.L.H.H.H.G.H.H.S.S.G.A.A.A.A.A.A.h.h.h.h.Z.h.A.A.A.D.A.A.z.h.g.h.z.g.g.g.g.a.f.f.f.k.f.f.f.f.f.f.g.k.h.h.f.g.k.Z.d.k.D.A.g.g.z.A.z.A.h.z.h.h.l.l.A.h.h.A.z.g.g.h.h.l.l.h.l.A.h.h.A.h.h.h.h.h.A.A.j.A.A.A.G.A.H.A.H.S.S.S.G.H.H.H.H.H.H.H.H.H.G.H.H.S.L.S.L.L.L.L.L.L.U.I.L.R.K.U.U.U.U.P.K.U.L.U.Y.U.L.Y.L.Y.L.Y.K.U.L.L.U.U.U.U.L.L.U.I.T.Y.U.U.U.I.T.U.U.P.P.T.U.T.T.T.T.~.~.T.T.^.~.~.E././.(./.(.^.^.(.(._._._.^.|.|.|.}._.|.|..X|. X.X.X.X.X.X",
+") I ) P I I U I P P P L L J P H U P P H H Z H Z Z P S Z Z H H H Z Z Z Z Z Z Z Z D D D D D D Z D L P L Z Z G Z Z D Z Z Z Z Z Z D Z Z Z Z D Z Z Z Z C Z B D D Z D D Z Z Z Z Z Z Z Z Z Z G Z D D D H H H H H H D H H P H J J P P P P P P P P I P P P P P _ I I _ ) ~ K _ _ { M.c.m.M.m.pXpXaXpXhXaXpXgXaXpXpXhXQ.aXpXpXaXpXpXm.M.M.m.} M.[ ` ) _ [ Z.F.Z.Z.Z.d.Z.Z.Z.h.Z.Z.j.b.k.h.j.j.d.d.d.d.g.d.d.e.i.i.d.s.d.j.d.d.a.i.s.i.i.s.i.i.i.d.a.i.a.a.a.f.l.a.a.g.g.g.g.g.g.g.z.h.h.l.l.z.D.l.A.l.A.A.h.A.h.A.A.S.Z.A.S.S.S.h.Z.A.G.A.G.A.G.A.G.A.G.G.A.l.l.A.A.A.A.A.A.A.h.h.A.A.A.A.A.h.A.g.A.h.h.l.Z.k.z.z.j.h.A.z.l.A.l.l.l.G.h.l.l.h.l.z.f.h.k.j.z.k.k.k.k.f.k.k.k.f.j.f.z.a.k.k.z.z.g.k.z.g.g.h.l.k.h.h.l.A.l.l.h.A.h.h.Z.A.h.A.h.A.h.A.A.A.h.h.A.h.A.A.h.S.h.A.g.G.h.H.G.G.A.G.A.A.A.A.h.A.g.A.G.h.H.g.A.G.G.A.A.A.A.A.h.h.A.l.A.l.l.f.g.h.f.a.a.g.g.i.i.i.a.a.a.a.a.i.a.a.i.i.a.i.E a.a.a.i.i.a.a.a.a.i.a.i.i.i.a.a.a.f.i.i.i.a.i.u.z.a.a.a.a.a.a.a.a.a.a.a.d.i.k.i.i.a.i.a.k.i.k.i.a.a.a.k.f.a.g.a.g.f.f.f.f.i.g.f.d.a.g.f.a.g.a.f.f.g.g.h.g.g.h.h.h.h.h.h.A.A.A.h.S./ / S CXVXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXSXFXFXDXAXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXGXSXFXFXFXFXFXFXFXFXGXDXDXDXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXVXBXm.} Q Q [ ~.T.T.~.T.~././.(.!.(.(./.(.(.(.(.^.[.(.(.(.(.(.(.(.^././.~.~.~.~.~.!./.~./.~.~.~./.^./.(./.(./././././.~.~.~.T.T.T.T.T.U.U.L.L.P.P.L.A.L.S.H.H.G.D.H.S.H.H.H.S.G.A.A.G.A.l.A.A.A.A.h.h.A.h.h.A.A.A.h.l.h.h.h.z.g.g.g.f.k.f.k.k.f.k.k.f.g.g.g.f.h.f.f.f.g.g.k.k.g.A.k.g.z.k.k.d.g.l.h.h.l.l.l.l.S.g.S.k.h.h.l.l.l.l.h.h.g.A.h.h.h.h.A.A.h.A.A.A.A.A.A.A.A.A.A.G.S.S.S.S.H.H.Z.H.H.H.H.H.G.H.H.H.D.L.L.L.L.L.L.L.L.U.U.L.R.L.L.U.L.Y.U.L.L.L.L.L.L.L.U.L.U.L.L.U.L.R.L.U.Y.Y.U.Y.T.L.T.L.T.U.T.T.T.I.U.T.Y.T.U.T.T.T.T.~.T.~.T.~.T.~./.(./.(.(./.^.^.[.}._._._._.`.`._._. X|.|.|.|.'..X.X X.X.X.X",
+") I P I I I I J P L J J J J H P H P H H P H L L P Z L L Z H Z H L L Z L Z Z ( Z Z Z D Z D D H Z G Z Z Z D Z G Z Z Z Z D Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z D B Z Z C D D Z Z Z Z Z Z Z Z Z Z D D D D H D H H H H H K H P H P P H P P J P P P P H U P P I I _ ' ` m.m.aXaXgXaXaXhXaXpXgXpXpXaXpXaXM.pXpXm.pXpXaXpXpXpXpXpXm.pXaXpXpXpXpXm.pXpXm.pXpX].m.Q.n.F.Z.Z.Z.d.b.h.j.j.Z.d.g.j.g.d.Z.j.j.d.j.d.f.a.j.d.f.d.d.i.a.a.a.i.i.i.i.i.i.i.a.a.a.a.g.a.f.a.a.a.l.a.a.z.d.g.g.g.g.h.h.h.A.l.l.A.l.A.z.z.A.A.h.A.G.h.G.G.A.Z.S.G.G.G.G.Z.A.G.l.S.G.h.A.A.W.G.A.G.A.A.h.H.A.A.S.A.h.A.h.A.h.A.A.h.h.z.h.h.g.z.g.A.z.h.h.z.h.l.A.l.h.h.z.J.l.A.l.z.h.g.z.h.g.d.k.k.g.f.f.k.d.f.z.k.g.z.k.k.g.k.g.k.g.g.z.g.l.l.l.h.l.l.l.A.h.h.h.h.h.h.A.A.Z.h.A.A.h.A.A.h.A.A.h.A.S.h.H.A.S.A.S.S.h.S.G.A.G.l.A.A.A.A.A.A.A.A.h.A.A.A.A.A.A.z.H.S.S.h.A.A.z.l.g.g.g.a.j.g.g.a.a.z.a.a.a.a.a.a.a.z.i.a.i.i.i.i.z.z.i.a.i.i.a.a.a.a.i.k.f.i.z.a.d.i.i.d.d.f.i.a.a.i.a.a.a.a.a.a.a.a.a.a.a.i.i.i.i.k.a.z.a.a.k.i.z.f.z.a.k.k.g.a.g.i.f.g.a.f.f.f.f.f.g.a.f.f.f.g.z.g.k.g.z.h.g.G.h.h.h.A.A.A.A.A.h.S.S ~ / CXHXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXGXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXZXBXm.[ Q Q ` T.~.T.~.(.!././.(././.(./.(.(.(.(.(.(.(.(./.^./.{./.^./.~.~./.~.~.~.~.~.~././.~.^././.(./.(./.(./././.(.^.~.T.~.T.T.T.T.U.Y.P.L.L.P.U.L.L.U.L.S.L.A.H.G.G.D.S.G.A.G.A.A.A.A.A.g.A.h.A.A.h.Z.G.j.l.l.A.h.h.k.h.f.g.g.k.f.g.k.k.k.f.k.f.f.f.f.k.k.f.h.f.h.g.g.k.l.g.k.l.g.g.A.g.A.z.k.k.h.l.l.l.l.A.h.l.h.h.g.z.l.g.l.h.h.h.g.A.h.j.A.l.h.A.h.A.h.A.A.h.A.A.A.A.A.S.S.S.S.S.S.H.H.H.H.G.H.H.H.H.H.L.U.H.H.L.L.L.K.U.L.K.U.I.L.R.L.U.L.Y.K.L.U.L.L.L.U.L.L.L.L.L.L.L.R.R.Y.Y.Y.Y.L.T.T.R.Y.U.T.U.T.T.T.T.I.T.U.T.U.T.T.T.T.~.T.T.T.~.^./././././.(.`.^.(.(._._._._.(.`.|._.|.|.|.|.'.|.|..X.X.X.X.X",
+"P ) I I P P ) P P P P Z I P P S H H H H H H H Z H D D H Z L Z Z H Z H L L L Z Z H H Z J Z H H Z Z L Z Z Z D Z Z Z Z Z Z Z Z B D Z C Z Z B D Z B F B D Z C Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z F D H H I H H P P H H J I J ) L ) ) J K P P I [ } m.aXgXgXgXaXpXgXaXaXpXpXM.aXm.M.M.pXm.pXm.M.m.m.m.pX{ m.M.M.m.M.{ M.m.c.M.pXm.M.m.M.M.pX} pXm.M.M.pXpXpXpXm.Q.L.F.b.Z.g.d.g.A.j.d.j.d.j.d.d.j.j.f.f.d.f.a.d.a.i.a.i.d.i.s.p.a.i.i.i.f.i.i.i.f.a.f.d.a.j.a.a.f.z.f.k.z.g.A.g.g.A.l.l.A.h.A.g.G.h.A.A.h.S.A.h.S.G.Z.A.Z.W.G.A.A.h.S.G.A.W.l.h.S.A.h.h.A.h.h.S.l.A.l.S.A.G.A.A.h.A.l.l.l.z.h.g.z.A.j.h.z.h.A.z.z.z.z.A.h.l.h.l.A.l.Z.z.h.k.g.h.j.f.k.k.g.f.f.k.k.a.a.f.f.a.g.g.g.g.z.j.g.k.z.z.l.l.h.l.l.g.z.l.h.A.h.h.A.l.A.h.l.A.l.A.A.l.A.A.l.A.A.h.A.A.A.A.A.A.A.G.A.G.A.g.G.G.A.A.A.A.S.h.A.A.A.G.A.S.A.A.A.A.A.A.A.A.A.A.h.l.l.k.h.k.k.f.f.f.k.i.d.a.a.a.a.a.a.i.u.a.i.i.i.u.i.a.a.a.i.i.a.a.a.a.a.a.k.a.a.a.a.a.a.a.a.a.i.i.a.a.a.a.a.a.a.a.a.a.a.a.E k.k.i.i.a.i.a.a.a.a.a.z.k.z.a.z.a.z.d.a.d.g.i.z.i.k.k.i.a.k.s.f.a.f.f.j.f.f.h.k.f.h.h.h.h.G.h.h.A.h.h.A.A.A.~ ! ^ CXVXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXDXDXHXQ.[ ~ ~ ] T.T.T.~.~.~././././././.[./.(./.(./.(.(.(.(.(.(././././.~.~.~.~.~.~.~./.(.~././././.(./.(.(.(.!././.(.~./.~.~.T.~.Y.T.T.Y.T.U.L.L.Y.L.P.P.L.L.L.S.H.S.S.S.S.G.S.H.A.A.h.A.A.A.h.h.A.A.A.A.h.A.g.A.l.l.l.h.k.h.k.k.h.g.g.f.g.k.k.g.k.f.g.d.z.d.k.z.k.g.k.g.g.g.z.d.D.g.f.z.g.k.S.l.z.f.l.f.h.l.l.g.l.l.h.h.h.h.g.h.h.h.h.h.h.h.h.h.l.h.l.l.D.g.A.A.A.g.A.A.G.A.g.A.S.A.S.S.S.S.S.G.S.G.D.D.G.H.H.L.L.D.L.H.L.U.L.L.L.U.U.U.U.L.U.L.U.Y.U.U.L.Y.L.L.L.L.L.L.U.L.U.P.P.P.T.T.U.P.P.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.~.T.~.~.~.!.(.T././.(.(.(.(.(.{.(.(.(._.(._._._._._.|.|.|.|.'..X|.|..X.X.X",
+") ) I I ) P P P ) P P P P L P P P H P Z H H H H H H H D H H H H Z H Z S Z S Z L Z S Z Z H Z H H Z Z Z L D D Z D Z Z D Z Z Z C D Z Z F Z Z Z Z Z Z Z B Z Z Z Z Z Z Z Z Z Z Z Z Z L H Z H F Z L H H D H P Z Z J Z D P ) D H I U I J S ) ' M.aXgXgXgXhXgXaXpXaXaXaXpXpXm.m.pXpXM.M.m.M.M.{ { { { { ' { { } { { { { { { { { { { { ' { M.{ M.M.M.{ M.pXM.{ pXM.M.M.pXM.m.m.m.F.F.d.k.g.j.d.j.j.d.d.g.a.f.a.d.a.i.a.d.i.a.i.i.p.d.a.i.k.i.i.i.f.i.a.a.f.a.k.a.a.j.h.a.d.d.k.k.d.g.l.A.h.A.h.l.A.h.h.l.A.h.h.A.A.h.G.h.A.A.G.S.h.A.A.S.A.S.A.A.S.S.G.Z.A.G.J.z.W.h.S.h.l.l.S.A.h.A.h.A.z.A.A.h.A.A.h.A.z.h.h.z.g.h.l.l.A.h.l.h.l.A.l.h.l.h.h.h.h.z.g.g.g.g.z.d.f.k.k.d.z.f.f.f.h.f.g.f.j.a.z.z.j.g.h.h.l.l.l.l.G.z.G.g.h.A.z.A.A.h.h.A.h.A.h.l.D.h.h.A.h.A.A.A.h.A.A.H.A.g.A.H.G.G.H.A.G.S.A.A.A.l.S.G.A.S.A.G.A.S.W.g.A.A.A.A.A.A.h.A.l.h.h.k.h.f.f.f.i.i.k.a.a.a.a.a.a.a.a.z.i.i.i.i.i.i.a.i.i.i.a.a.u.a.a.a.a.a.a.a.u.a.i.a.a.i.a.i.i.a.i.a.x.a.a.a.a.a.a.a.a.a.d.d.i.i.a.a.a.a.z.a.a.a.i.i.a.a.a.a.a.g.g.s.z.i.z.i.a.d.z.a.k.f.f.f.f.f.g.g.k.h.h.g.h.h.h.g.h.A.A.h.A.A.h.A.~ Q ! CXAXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXDXDXDXBXpX} ~ ~ [ T.~.T.~.~.~./././././.(.^./.[.(.(./.(.(.^.[./.(./.(././.~.^.~.!.~.~.~./.~./././.(./././.(.!.(.(.(.(.~.(./.~.~.~.T.~.T.T.T.T.U.T.L.L.L.U.P.L.L.S.H.D.H.H.G.S.S.S.A.H.H.A.A.A.A.A.A.A.h.g.h.A.h.A.h.l.l.l.h.h.g.h.h.k.g.g.f.f.k.k.f.f.g.f.k.d.g.k.k.k.k.g.g.g.z.g.z.h.g.k.g.z.z.g.z.h.h.a.l.z.l.z.h.h.l.h.h.g.h.g.g.h.h.g.h.h.h.h.h.h.h.l.h.z.D.h.g.A.A.A.A.A.l.H.S.S.S.S.A.S.A.S.A.S.S.G.H.H.L.D.D.H.A.L.L.L.L.L.L.L.L.L.U.U.P.Y.Y.U.Y.U.L.U.L.U.U.L.L.U.L.L.L.L.P.P.P.P.P.U.P.P.T.T.T.T.T.(.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.~.~.(./.(.~.(.(.(.(.(.(.(._._._._._._._.|._.|.'.|.|. X.X.X.X.X",
+") I ) P P P ) P P P P P P L P L P H H H H Z H D H H Z Z H Z Z H Z Z Z Z Z L Z Z S Z Z Z H Z H Z H Z Z Z D D Z D Z Z Z Z B Z D D Z Z Z D B Z C C B Z D Z Z Z C Z G V Z Z Z Z D Z Z Z H Z P Z Z H Z Y H D I I K H P H U P J ) S ' ' aXhXgXgXgXsXsXhXpXpXpXm.pXpXM.} { { ' ' ' ' ' / / ~ c S u S u u u u S u S u S H J S S u ^ / ! c ! ' ' ' ' { ' { { { M.{ M.M.M.sXM.pXM.pXm.m.n.F.Z.d.d.d.g.j.d.d.f.a.j.i.d.i.i.d.i.i.i.i.i.i.i.i.i.i.f.i.i.k.a.a.a.i.a.a.a.j.a.i.f.f.k.g.g.g.h.h.h.A.g.z.h.A.l.h.A.G.A.h.S.G.h.G.Z.A.h.S.H.A.G.A.S.G.Z.A.S.S.G.A.h.h.A.h.A.G.A.A.G.A.h.A.h.A.l.h.A.A.h.h.h.l.h.h.h.j.A.z.h.h.A.h.h.h.h.l.l.l.l.h.l.h.g.g.g.g.g.g.g.k.g.f.f.f.f.f.f.f.z.f.f.f.j.a.h.g.z.h.h.h.l.l.l.z.h.A.h.z.h.z.l.h.g.l.l.h.h.l.l.A.l.z.h.A.l.A.h.z.A.h.A.A.A.A.A.H.g.z.h.g.H.A.G.S.A.A.G.S.A.A.A.G.A.A.A.S.A.A.A.A.A.A.A.A.h.h.h.h.k.k.k.f.k.i.k.a.a.a.a.a.a.a.a.i.i.i.i.u.i.u.u.i.i.i.i.a.a.a.a.a.a.a.a.a.i.a.i.a.a.i.a.a.i.a.a.i.a.E d.d.a.a.a.a.a.a.a.a.a.a.a.a.i.a.a.a.a.a.a.k.i.a.k.a.z.i.z.a.a.a.z.k.i.z.z.a.i.a.k.f.f.f.f.f.k.h.h.k.h.h.h.h.l.h.A.h.A.A.A.A.A.S ! ! ZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXZXZXBXm.{ S Q [ T.T.~.~.~.(./././././.^./././.(.(.(./.(.(.(././././././.~.~.~.~.~.~.~./.~.~././.!././.(.(.(.(.(.(.(.(.(././.~.~.~.T.~.~.T.T.T.U.Y.U.P.P.L.L.S.L.L.H.H.H.S.H.S.S.G.S.A.A.A.A.A.A.A.A.A.A.A.A.A.A.D.g.l.l.h.z.h.h.k.k.k.g.g.k.g.f.f.z.k.g.z.f.g.k.k.k.g.k.g.g.k.l.g.g.g.D.z.g.g.z.h.f.h.h.l.x.z.k.h.h.l.z.h.z.z.g.h.l.z.z.h.h.z.z.z.h.h.h.h.h.D.A.j.S.h.A.H.A.A.G.S.S.S.h.S.S.S.l.S.S.S.S.H.G.H.A.L.S.U.S.H.L.S.L.L.L.U.U.U.U.U.Y.Y.U.U.Y.U.L.L.L.U.P.U.L.L.T.L.U.T.T.P.T.T.T.P.[.T.T.T.T.T.T.T.T.T.~.T.~.T.T.T.T.T.~.T.~.T.~.~.T.~./././.~.(.(.(.(.(.(.(.(.(.(.(.(._._._.|._.|.|.|.|..X|..X.X.X.X",
+") ) ) ) ) P P P P J P L P L L P H J H H H H H H H H L H H L Z D Z J J Z Z Z Z Z Z L H Z Z H H Z H L H Z D D D Z Z Z Z Z G Z Z Z Z C Z B D Z Z Z C C Z Z C Z F F Z Z Z Z Z Z G B L Z Z Z H Z D H H Z H H Z H H J P Z P ) ] M.hXgXgXgXgXgXaXhXaXpXpXpX{ M.{ { / ' ! / S n u u u y y u y y > y y r y q y = r y y r : : ; : r y y y y y u y y u S ~ S ! ' ) ) { { { { { { M.7X{ M.M.sXm.m.Z.g.f.f.d.a.j.d.i.i.f.i.i.s.i.i.i.p.i.s.i.d.i.i.i.d.i.i.d.a.a.a.a.a.d.a.a.i.f.d.d.g.g.g.k.z.h.z.h.A.h.z.l.h.h.A.h.S.A.h.A.h.G.G.A.S.A.h.S.G.A.S.G.G.A.A.h.h.S.A.G.S.S.h.h.l.A.S.S.h.G.l.h.A.h.h.g.A.h.l.l.A.k.A.h.h.A.h.h.h.h.A.A.A.h.h.A.g.h.g.h.g.g.g.g.g.g.g.f.k.f.f.f.a.f.f.f.j.j.g.f.f.g.l.z.h.h.l.l.l.l.l.l.h.l.A.z.G.g.h.G.l.l.l.l.l.h.h.h.h.h.h.l.h.A.h.A.A.A.A.A.A.A.A.A.S.S.H.S.A.A.A.A.A.z.l.G.A.A.G.A.A.A.A.A.h.A.A.A.h.A.A.h.A.h.h.k.k.f.f.i.i.a.a.a.a.a.a.a.a.i.i.i.i.i.a.u.a.u.i.i.i.a.a.a.a.a.a.z.a.k.a.a.a.a.a.i.a.i.a.a.a.a.a.a.x.i.a.d.a.a.a.d.a.a.a.a.a.i.a.i.a.a.a.a.a.a.i.z.i.i.a.i.i.a.a.a.a.a.i.z.a.a.a.k.a.a.a.f.h.f.h.h.k.h.h.h.h.h.h.l.h.h.A.h.A.A.A.A.S ! / CXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXAXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXZXBXm.` ~ Q ` ~.~.T.~.T.~.~.~.~././.~./.(.[./././.(.(./.(./.(././././././.~.~.[.!.~././././././.(.(./.(.(.(.(./.(.(./././.~.!.T.~.T.T.T.T.U.T.L.U.U.S.P.S.L.L.H.H.H.S.H.H.H.H.G.S.H.H.A.A.S.A.A.A.A.A.A.h.g.A.l.A.l.l.h.k.h.k.k.h.h.k.g.k.f.k.d.k.g.d.f.g.g.k.k.k.g.k.g.g.g.g.D.g.g.g.g.g.z.g.k.h.f.g.g.g.l.h.k.h.k.h.h.h.g.g.h.a.h.l.k.k.h.k.h.k.h.z.h.h.g.h.h.h.g.A.z.A.A.S.S.A.S.S.A.S.A.S.G.S.D.H.D.A.S.S.S.S.S.L.H.L.L.L.H.L.L.L.L.P.U.U.P.P.U.U.U.U.T.U.T.Y.L.P.L.L.T.U.P.T.P.T.T.P.T.T.T.T.T.[.T.T.T.T.T.T.T.T.T.~.~.~.~.T.~.T.~.T.~.~././.~./.(.(.~.(.^.~.[.(.(.(.(._.(._._._._.|._.|.|.|.|.|.'.|.|..X",
+") ) ) I ) P P ) P P P P P P S J H L H H H H H H Z H L Z D H H H L H Z H L Z Z Z Z Z Z S H H H L H H Z Z D Z Z D Z Z Z D D Z D Z Z Z C Z Z D Z Z D Z C Z Z Z Z Z Z Z Z Z Z Z Z D Z Z H D H D H Z H D P P Z U J H J _ M.gXgXgXgXgXgXaXaXaXpXM.M.M.' ' ' c S u u y : y y r r y r r ; y e y r y 0 r e y y y : t e y r r y r r t y : : y y r y r t t : y y u S S ~ ' ( ' { { { M.{ M.' { pXpXm.F.Z.Z.a.j.d.z.d.i.i.i.i.i.s.i.i.i.i.i.i.a.i.i.i.f.i.a.g.i.d.d.s.a.d.a.f.i.k.k.z.g.f.h.h.g.h.g.z.z.l.l.h.A.l.A.l.G.h.H.S.H.S.A.A.S.A.h.S.A.G.A.S.A.H.A.G.S.h.S.h.G.A.h.J.S.l.G.S.l.l.G.h.l.A.l.h.l.A.A.h.h.l.l.A.l.h.h.z.G.h.A.h.l.h.h.l.g.A.h.A.z.k.d.g.g.g.f.f.f.f.f.z.f.f.f.f.j.a.g.h.h.h.l.l.l.l.h.l.G.h.l.A.z.A.h.g.A.l.l.G.h.l.l.h.h.h.h.l.l.l.l.h.D.A.l.A.A.A.A.h.A.A.A.S.A.S.h.A.G.A.A.A.A.l.A.A.A.A.A.A.H.A.A.A.A.A.A.h.h.A.h.h.h.h.h.g.z.z.d.k.i.a.a.a.a.a.a.a.a.i.i.i.u.u.u.i.i.i.i.i.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.i.i.a.a.i.a.a.a.a.a.a.a.a.a.a.u.a.a.i.a.a.a.a.a.a.a.a.a.a.a.a.z.a.a.a.d.a.a.a.f.f.f.k.a.z.a.g.j.h.f.k.h.h.h.h.h.h.l.l.l.A.A.A.A.A.g./ ! ~ CXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXFXBXm.[ ^ ^ [ ~.T.[.T.~.~.~./.(.~.(.~././.^.E.(./.(.^.(.^./.(./.~./.~./././.~.~.~.^././.(././.(.(.(.(.(.(.(.(.(.(.(.(.(.!./.~.T.T.~.~.T.T.T.T.P.P.P.P.P.L.U.P.H.H.S.H.H.H.H.S.S.G.S.S.A.A.A.A.A.A.G.A.A.h.A.A.l.z.l.l.l.h.k.h.k.g.g.g.g.g.f.d.d.z.d.g.f.g.z.g.k.k.g.k.k.k.z.g.k.g.g.g.l.g.g.g.h.z.k.k.h.k.h.h.k.k.g.k.g.g.g.g.f.h.h.h.k.h.f.z.g.z.g.h.h.h.h.h.l.l.h.A.A.A.A.A.S.S.S.A.A.S.S.S.G.G.S.D.S.S.S.G.S.S.H.H.H.H.H.U.L.U.L.L.L.L.U.U.L.U.L.U.U.I.U.U.U.T.U.L.U.Y.Y.U.T.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.T.~.T.~.T.T.~.T.~.T.~././.~.~.^.^././././.(.(.(.(.(.(._._._._._.|._._.|.|. X|.|. X X.X",
+") ) ) I ) I ) P P ) P P P L J J J L L K H H H H H H Z L H H H Z H Z H H S Z J L Z L H L S Z Z Z Z Z H Z D D Z Z Z Z Z Z Z Z Z Z Z C Z Z Z B Z C Z C Z Z B Z C Z Z Z Z Z Z Z Z D Z Z Z G Z H Z H H H Z L P S I { aXgXgXgXgXaXaXaXpXM.} { ' ( c u c u y r > = y t t e : r r : r t ; : r r r y t y y : e : : r : y y y r t y y y y y t r q y 0 y t > e * y : t y y u S S S / ' ' { _ M.{ { { M.{ M.n.b.d.i.i.d.i.i.i.i.u.i.i.a.i.i.a.a.i.i.i.i.a.i.i.a.i.a.i.i.a.a.f.d.f.f.d.f.f.h.z.g.g.A.l.h.l.l.h.h.A.l.A.h.A.A.A.A.A.A.A.G.S.G.A.S.A.S.S.G.A.A.h.A.A.S.Z.A.S.h.l.A.l.h.h.S.S.A.A.l.l.l.g.G.l.l.h.A.l.h.S.h.h.G.h.l.l.l.h.h.h.h.k.k.d.A.d.k.A.A.k.k.g.g.f.k.f.f.z.f.f.f.f.g.h.g.h.f.l.l.l.l.z.h.l.l.z.g.G.l.l.l.h.g.G.l.g.g.l.l.h.z.h.h.l.h.l.h.h.g.h.l.h.A.A.A.G.l.A.A.A.A.A.G.A.A.A.H.S.S.S.S.A.G.H.h.S.A.h.G.A.h.A.A.A.A.A.h.h.h.k.k.f.f.f.i.k.a.k.a.a.a.a.a.i.a.i.i.i.u.u.u.u.i.a.i.a.a.a.a.a.k.k.a.a.k.a.a.z.a.a.a.i.a.u.a.a.a.a.a.u.i.a.i.a.a.a.a.a.z.a.a.a.a.a.a.i.i.a.i.a.i.a.i.a.a.a.a.f.i.a.a.a.a.i.z.s.f.s.k.s.a.z.s.f.g.k.h.h.h.h.h.h.h.z.l.h.A.h.A.A.A.A.A.~ / / ZXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXZXBXQ.} S Q ` T./.~.~.~.~.~.~.~.[.~.~././.^.{./.(././.(.^.!./././.~./././.~.~.~.^.~./././././././.(./.(.{.(.^.(.(.(.^.(.^./.^.^.~.T.T.T.T.T.U.P.P.L.P.L.Y.S.D.L.H.H.H.H.H.H.S.H.S.S.S.A.A.H.A.A.A.A.A.H.A.A.A.D.g.h.l.h.h.h.h.h.g.h.g.g.g.f.k.g.g.z.k.k.f.f.z.k.g.k.k.k.g.l.g.g.k.f.D.l.k.g.g.f.h.h.k.h.h.f.f.k.h.g.g.g.k.g.g.h.h.a.g.g.k.k.h.k.g.h.h.h.h.h.h.h.l.h.A.z.A.G.l.A.Z.S.S.S.S.S.S.G.S.S.S.S.S.G.G.S.H.S.A.H.H.H.H.S.S.D.L.L.L.L.L.U.L.U.U.U.T.U.U.T.U.T.U.U.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.~.T.~.~.~.T.~.T.~.~.T.~.T.~.(.~./././.!./.!././.^.~.(.XX(.{.(.(.(.(._.^.|._.|._.|._.|.|..X|. X",
+") ) P ) I ) I ) ) J P P U P J J L L H H H H H H H H H J L D H D Z H Z H Z L Z Z Z Z Z Z Z J Z L Z L Z H Z Z D L B G Z Z Z B Z Z Z F Z D C Z Z Z C Z Z D D C Z Z Z Z G C D Z C Z Z D D D H Z Z L Z L P J ) m.hXgXgXgXaXaXaXpXM.} { ' ' ^ S y e y > ; = * r r r r : y y r y r t : : y r r y r t 0 t : y y r = t : : r r : r r e r y * 0 r r r y r y y r t t q y r r > : y u u c / ' ' { { { M.{ M.M.b.n.D.d.d.i.d.s.u.a.s.i.i.i.a.a.i.d.i.i.i.a.a.a.a.i.d.i.i.f.d.i.f.i.k.k.k.k.l.g.g.g.g.g.h.h.A.A.A.h.l.h.S.S.A.A.S.A.A.S.A.A.A.S.S.A.J.S.A.A.H.G.h.G.G.h.S.h.S.S.h.A.S.h.S.l.A.l.z.A.l.A.h.h.h.A.H.h.S.z.h.A.l.A.l.l.l.A.h.l.h.l.Z.d.A.z.A.d.z.h.k.h.g.g.f.f.f.k.a.f.f.z.a.f.g.z.l.k.h.l.l.l.A.l.z.h.G.g.h.h.l.h.z.l.l.h.h.l.h.h.z.h.l.l.l.h.h.A.g.h.h.A.l.D.A.A.A.A.A.A.A.h.G.S.A.A.H.S.S.S.D.H.S.S.S.S.A.S.Z.A.A.A.A.A.h.A.h.h.A.k.g.g.f.f.f.i.a.a.f.a.a.a.a.i.i.i.u.i.u.i.i.i.i.i.a.a.a.f.i.k.k.k.k.a.a.a.a.a.i.a.a.a.a.a.a.a.a.i.a.a.a.a.a.a.a.a.d.a.a.a.k.a.a.a.u.a.i.a.a.u.a.i.i.a.i.a.a.i.i.f.a.a.a.a.d.f.f.g.s.a.g.g.a.f.g.k.h.k.h.h.l.h.l.h.l.l.z.A.h.h.A.A.A./ ! ! BXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXBXm.[ ^ ! ` /.~.~.~.~.(.T.~.~.~.~.(.~.(.^.[.(./.(.(./././././.!././.^.~.^.~.(./././././.(./././././.(.(.(.(.(.(.(.(.(.(.E.^.!.^.T.~.T.T.T.U.P.P.L.Y.P.D.L.Z.L.H.H.G.H.H.H.S.H.H.S.Z.A.H.A.H.A.A.W.h.A.A.A.A.h.l.A.l.h.A.h.h.A.g.g.g.h.k.h.k.g.g.g.k.k.g.g.g.h.h.g.Z.g.g.d.g.h.g.k.g.h.h.g.f.g.g.g.g.g.g.h.z.k.z.g.g.g.g.g.g.z.k.g.g.g.g.k.h.g.k.k.k.z.g.g.g.h.l.l.h.A.A.A.A.H.l.A.S.S.S.G.A.S.G.G.H.S.S.S.S.S.S.S.H.H.H.H.S.S.Y.U.L.L.L.L.P.U.U.L.U.U.I.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.T.T.T.T.T.~.U.T.T.T.T.T.~.~.~.~.~.~.~.~./.~././././.!./././.(.(.(.(.|.(.(.(.(._.[._.|._.{.|.|.|.|.|.'.'.",
+") _ ) ) ) P I P P P P J J P J J L H J J H H G Z H Z Z L Z H H D H H H Z Z L P J Z L Z Z Z H Z J Z Z L Z Z D Z Z Z D Z Z H G B Z Z Z Z B Z Z Z C Z C Z B Z Z Z Z Z Z F Z Z C G Z D D D D Z H Z Z Z D J m.gXgXgXgXaXaXpXM.M.{ ' Q u u e : ; * : : * ; ; : r r r t r y : : r r r y : r r t r r r y : y : : y y : y y r r y r r y r t r y r r y 0 e 0 r r t : > r e t y : : ; ; > y u u / P ' ' { { { { { { [ b.d.d.i.i.t.a.i.i.a.i.i.a.i.i.u.i.a.a.a.a.i.i.d.i.i.d.f.i.f.i.d.d.f.d.g.g.z.l.h.z.g.h.h.h.A.l.h.h.z.A.A.A.A.A.W.A.A.S.Z.A.A.A.S.A.A.H.Z.G.S.j.G.h.J.h.A.S.h.A.A.h.G.l.G.A.l.J.h.A.G.A.A.h.l.l.H.A.h.A.h.A.l.l.h.h.h.h.l.g.A.g.z.k.A.k.k.h.k.g.d.j.f.f.f.f.f.f.f.f.g.f.z.h.h.h.l.h.A.l.h.l.l.z.h.h.l.l.g.G.z.h.h.h.h.h.h.h.h.h.h.h.h.h.h.D.l.D.h.A.l.A.h.A.A.A.S.A.A.S.A.G.A.H.S.S.S.G.A.G.H.A.S.S.S.A.A.A.A.A.A.A.A.h.h.h.g.g.g.k.k.i.z.a.k.i.a.a.a.a.i.i.i.i.u.i.u.t.i.i.i.i.d.i.i.i.k.a.a.a.a.k.k.a.z.a.a.a.a.u.a.a.d.i.a.i.i.a.i.a.d.a.a.a.a.a.a.a.a.a.a.a.a.a.u.i.i.i.i.i.i.a.i.a.i.i.a.a.a.a.a.a.s.a.a.g.s.a.s.g.k.a.j.k.f.h.h.h.l.l.l.l.l.A.h.G.A.A.A.h.~ ! ! ZXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXDXDXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXDXAXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXBXpX} S ! [ ~.~.~.~.T.~./.~.~.~.~.~.~.~.(.^./.(./.!./././././././.~.(.~./.~.~./././././././.!././.(._.].(.(.{.(.(.(.(.(.(.~./.!.~.~.~.T.P.P.L.L.L.L.U.U.P.S.H.L.K.Z.H.H.H.A.A.H.G.G.H.H.A.H.A.A.H.g.A.A.A.h.A.h.A.h.l.l.A.h.A.h.A.z.A.h.h.h.g.g.g.D.h.h.A.h.D.k.h.g.z.Z.z.g.g.z.g.g.h.k.h.h.g.z.f.k.g.g.f.k.h.k.g.g.a.h.g.g.f.z.g.g.k.g.h.k.g.z.g.h.z.l.g.g.h.h.l.l.A.l.A.A.A.Z.A.S.S.D.G.G.G.G.S.S.S.S.S.F.S.S.S.H.A.H.H.H.U.S.S.S.L.L.L.L.L.U.U.U.L.T.T.U.Y.Y.Y.T.T.T.Y.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.U.T.~.~.T.~.T.T.~.~.~.~.~.~.~././.!./././.(.(.(.(.(.(.XX{._.(._.(.|.(._.(._.|._.|.|.|.|.|.",
+") ) ) ) ) I I I P P P P P P P P H P H H H U H H H H H Z L H H L H H P Z L L Z H Z H H Z H H H Z L Z D D Z G Z Z Z Z D Z D D Z Z Z Z F G C Z Z Z Z C Z D D B Z Z Z B D D C Z D D D Z D C Z J J Z _ pXgXgXgXgXaXaXm.} { ' n S u y r r r y * y : y r r y * r y r : y : : r r r r y t r y r r y r r r y r r r r y r r r r t y y r r r t r y r r r r r r t r r r y t y r r y r r r y y y y u u S / ' ' ' { { { c.c.[ i.i.i.i.i.i.i.a.a.i.i.i.i.u.i.a.i.i.i.k.i.i.a.d.i.f.f.i.a.k.f.k.z.j.k.z.f.f.h.z.h.h.A.h.h.G.h.G.h.S.A.A.S.A.S.G.J.h.A.S.A.J.A.A.S.A.G.h.A.S.A.A.A.S.A.A.G.h.l.H.A.h.A.Z.h.h.A.h.A.A.A.A.A.g.A.Z.G.h.h.h.h.h.l.A.g.g.g.g.z.k.z.A.h.h.k.k.a.f.f.f.f.f.f.k.k.k.k.k.g.l.h.l.l.h.l.l.l.l.l.l.A.l.z.l.h.h.h.h.h.j.h.x.a.g.g.h.h.h.h.h.l.l.h.j.h.A.A.A.A.A.A.h.A.A.A.J.D.S.S.S.S.G.A.H.D.S.G.S.G.G.S.A.A.A.A.A.A.A.h.Z.h.h.h.l.k.k.k.f.z.i.a.a.a.a.a.a.i.i.u.a.s.u.i.i.a.i.i.i.a.z.i.z.f.k.k.k.k.f.d.d.u.a.a.a.a.a.a.a.a.a.a.a.d.i.d.i.a.a.a.a.a.a.a.a.a.a.a.E z.a.a.a.i.i.a.i.a.i.i.i.a.i.a.a.a.a.a.a.s.f.z.i.a.a.a.g.a.z.g.g.g.g.h.l.h.h.h.A.h.A.A.A.A.A.A.j.~ S / ZXZXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXSXDXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXBXQ.} ~ S [ ~.~./.~.~.~.~.T.!.~.~.~.~.!.(.^.(.(././.(./././.^.~.~./.~./.~./.~.~./.^.^./.~./././././.(.(.^.(.(.(.(.(.(.(.(./././.~.~.T.U.U.U.U.U.L.Y.U.U.L.L.L.L.H.H.D.D.H.H.H.Z.S.H.Z.H.H.h.S.S.S.S.A.A.S.A.A.A.A.z.A.h.h.A.A.A.z.A.A.A.g.h.A.z.A.g.A.h.A.h.l.h.h.h.l.l.h.h.g.g.g.g.g.g.g.k.g.g.g.g.g.f.k.k.z.f.f.f.j.a.j.k.g.f.f.g.g.f.g.g.g.f.g.g.g.g.f.g.z.z.h.l.l.l.h.A.A.A.A.S.A.H.G.G.A.G.G.A.H.A.S.S.A.S.A.A.A.H.S.S.S.L.L.G.L.L.H.L.K.L.L.L.R.L.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.~.~.~.E.[.T.~.~.~.[.~.!.~././.~././././.(.(.(.(.(.(._.(._.(._._._._._._._. X X.X|.",
+") P ) I P ) I ( ) P P S P P P P P K H P H H H H H H H H H Z Z Z H Z Z Z L Z Z H H H D H L Z Z L H Z D D Z Z D Z Z Z C Z Z C Z Z Z D C Z Z C C Z Z Z Z B Z Z Z Z Z Z Z Z G Z Z Z H B G G Z S ~ M.fXgXgXgXaXaXM.{ { ' u u > * e ; r r r r * * * 0 r r r y r r r y t : y r t r r : r r r r r r t y r t r y t t r r t t r r r r t r r y r r y r r y r r q y y r : r r r r r r t r r r r t t t y u u ~ ' ' { { { { { { e.i.a.i.f.i.i.d.a.a.i.i.k.a.u.i.i.i.i.i.i.a.a.i.i.f.i.k.i.f.i.g.f.k.k.h.z.h.z.h.h.h.A.h.h.h.G.h.A.A.S.A.A.A.J.A.S.A.A.A.A.A.A.A.A.G.A.S.j.G.S.A.A.S.A.Z.h.l.A.h.A.h.W.h.A.A.G.A.h.A.S.A.A.A.A.S.h.A.A.A.h.h.h.D.k.A.k.l.l.z.g.h.h.h.f.z.f.f.z.f.f.f.k.k.k.k.k.z.h.h.l.l.l.l.l.A.l.l.G.h.l.l.l.h.h.h.h.z.l.j.j.g.g.g.g.z.l.h.h.l.l.h.G.A.A.j.A.g.J.A.G.A.A.H.h.A.G.S.S.G.H.G.G.G.S.S.G.S.S.G.S.A.A.A.A.A.A.A.h.h.D.h.k.h.k.z.k.k.k.a.a.a.a.i.i.i.i.s.a.u.s.i.s.a.i.i.a.i.i.k.d.k.k.i.k.f.k.d.d.a.a.a.a.a.a.a.a.a.a.a.d.d.i.i.d.u.a.a.a.a.a.a.a.a.a.z.a.z.i.i.a.a.i.i.i.i.i.i.i.i.a.a.u.a.a.a.a.a.f.i.i.g.g.g.i.f.f.g.g.g.g.l.l.A.h.A.h.A.h.h.A.h.A.A.A./ ! ! ZXZXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXZXFXBXm.[ ~ ! _ /./.~.~.~.^.T.~.~.~.~.!.~.(.^.^./.(./././.~././.^.~./.~.!.~./././.^./././.(././././.(.(.^.(.`.(.(.(.(.(.(.(.(./././.~.T.~.T.T.U.D.P.P.D.S.L.L.U.H.H.L.L.U.H.H.D.H.H.H.H.H.G.H.H.S.D.G.A.S.A.A.h.A.H.A.A.S.S.S.S.l.D.A.Z.A.A.A.S.A.A.A.A.A.A.h.A.D.A.A.h.l.A.l.h.h.g.g.g.g.k.f.g.g.z.g.g.g.g.f.f.z.a.f.f.z.f.k.k.f.g.g.g.j.f.g.f.g.j.g.d.g.g.g.g.k.h.g.l.l.l.A.z.A.A.h.S.S.A.S.S.H.A.A.H.A.H.S.A.H.A.S.S.H.H.G.S.D.L.L.H.L.L.L.L.L.L.L.Y.I.Y.U.T.T.T.T.T.T.^.T.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.T.T.~.~.T.).~.(.T.^./.^.~.~.~./.[./.^./.(.(.(.(.(.(.(.(.(._.(._._._._._._._.|._.|.|.",
+") ) ) ) ) ) P I P P P ) P P L P J L J J L H H H H H H H H H H Z H H Z L G Z S Z S H H Z Z Z H Z Z Z D D Z Z D D Z Z Z Z Z Z Z G Z C Z Z Z Z Z Z Z B Z Z Z C D F F Z G Z C Z D Z Z Z Z S L M.gXgXgXgXaXpXM.{ ' Q u u > : y ; > r r r r : t : : y y * t 0 r r : r r r r r r r r y e y y r t r r r r y r r y : r y y r r y y r y : r r y r r y r t t r r r r r r r r y r r y t r r r q r r e e e e u u Q / ' ' { ' { { ` e.a.a.i.s.a.a.a.a.i.i.a.i.d.u.i.i.a.d.a.i.k.d.i.z.i.f.i.z.f.f.a.z.f.z.h.h.h.h.h.h.h.G.A.h.A.h.J.A.J.A.A.G.A.A.S.A.A.A.S.Z.A.S.Z.A.A.A.A.A.S.A.G.A.G.h.A.A.h.A.Z.h.A.h.A.h.h.G.h.S.A.Z.h.A.h.A.h.z.l.l.l.h.l.l.z.l.k.g.g.l.z.h.f.h.l.f.k.j.k.a.f.k.h.k.h.k.z.l.h.h.h.h.l.G.l.A.l.h.l.l.h.h.h.h.h.z.h.h.h.f.g.g.g.g.g.z.g.h.h.l.h.h.A.h.A.A.A.A.A.A.h.S.S.H.D.D.A.H.H.G.H.H.S.S.G.G.H.D.S.S.W.A.A.A.A.A.A.A.A.h.h.k.k.k.k.k.a.a.k.i.a.i.a.i.s.a.u.u.a.u.u.i.i.i.i.d.a.i.z.k.d.k.a.f.f.d.d.k.a.a.a.a.a.a.a.a.a.a.a.a.i.a.a.a.a.a.a.a.a.a.a.i.a.a.a.d.a.a.a.i.i.i.i.i.a.a.u.i.i.a.a.a.u.k.a.i.a.a.a.a.f.a.a.g.f.k.f.g.g.h.h.l.h.A.h.A.A.h.A.h.A.A.A.A.S / / AXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXDXFXBXpX{ ! ! [ [.!./.~.~./.T.~.~.~.~.~.~.~././.^./././././.~./.(.~.~./.(.~.~.^./.~.~./.~.(./././.(.(./.(.(.(.(.`.(.(.`.(.(./././.~.T.~.T.U.U.U.P.P.P.L.Y.L.L.S.L.L.H.H.H.K.A.D.H.H.H.H.H.G.H.G.H.D.D.D.S.S.S.S.A.S.S.S.S.S.H.A.D.S.S.H.S.S.S.S.S.A.A.S.A.A.A.A.S.A.D.z.A.l.h.h.D.g.g.g.k.d.g.g.g.f.g.g.f.f.g.a.f.f.f.f.z.f.f.f.g.f.g.f.f.g.g.g.f.z.f.g.g.g.g.g.k.h.l.l.l.A.h.S.A.h.S.S.A.A.S.A.A.A.A.H.A.A.H.S.A.A.H.S.H.A.H.H.H.H.H.H.H.L.H.L.L.L.L.U.L.U.T.U.~.T.T.~.T.~.T.T.T.T.T.T.~.Y.P.T.T.T.T.~.T.~.T.T.T.T.T.~.T.T.T.~.T.~.~.XX~./.(./.~.~.[./././.~./.!.^.(.(.(.(.(.(.(.(._.(._.^._._._._._._._. X|.|.",
+") P ) I ) P ) P P ) P P P P P P L J H J H J L J H H H H P Z H H H H Z S L ( Z Z Z Z Z L Z L Z Z Z H D D Z D H Z Z Z F D Z D C B Z D B Z Z Z C Z F D Z Z Z Z Z Z D Z B Z D Z Z D D Z K { hXBXgXgXaXpXM.{ ' n u y > ; : y y ; y r 0 r r : 0 y r r y t r r r r y 0 r r y r r t r : y r r r r r r r e r r : y r r r * y r r r r r r t : : r r t r r r r r r r r r r r r r r * r r r r r r r > t y r e e u u u ~ ' ' ' ' { ' [ e.i.k.i.i.a.a.i.i.i.i.k.d.i.u.k.d.a.a.f.i.i.i.a.i.f.i.a.a.g.g.f.z.g.f.g.z.h.j.h.h.h.h.h.G.h.S.h.A.A.S.H.A.A.A.H.A.A.L.A.H.A.G.h.Z.A.W.A.A.A.A.A.A.A.A.G.h.Z.A.A.A.W.h.Z.h.A.A.h.h.A.A.h.h.A.h.A.l.l.h.g.l.g.l.l.l.A.k.g.z.h.h.z.h.l.k.z.g.g.g.k.k.k.h.g.h.h.h.h.h.l.l.h.l.l.A.l.l.h.h.z.h.h.j.k.k.f.j.k.g.g.g.g.h.z.g.h.g.g.A.h.A.j.Z.A.A.A.A.S.S.H.h.H.H.H.G.G.H.D.D.H.H.D.H.D.G.H.S.h.G.G.A.A.G.j.W.A.h.A.h.h.k.h.d.k.z.a.a.a.a.a.i.a.s.a.u.s.i.i.s.i.i.i.a.a.k.k.f.f.f.f.k.f.f.k.a.z.a.z.k.a.a.i.x.d.a.a.a.a.a.a.a.a.a.i.a.a.a.a.a.a.a.E z.i.i.i.i.a.a.i.i.i.i.a.a.i.i.a.a.a.u.a.i.a.a.a.a.a.f.a.f.f.f.g.g.g.g.h.l.h.h.A.h.Z.h.h.Z.A.h.A.A.S ! ! CXVXFXZXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBXQ.[ ! ~ ` ^././.~.~.~.~.~.~.~.T.~.~.^.E./.!././././.~./.~.~.~././.~./.[.~./.(.~.^././././.~./.(./.(.(.(.(.(.).(.(.(.(././.~.~.~.T.T.T.U.T.P.P.L.P.L.L.L.L.L.H.L.L.H.G.L.L.H.H.L.H.H.H.S.H.A.H.H.H.S.S.S.S.S.S.G.H.H.H.D.S.D.H.H.H.H.G.S.S.H.S.H.S.Z.S.S.S.S.D.A.D.A.D.h.h.f.g.g.g.k.g.k.g.g.f.g.f.f.f.f.f.f.f.f.f.f.f.f.f.f.g.g.g.f.k.g.f.f.g.g.g.g.f.g.g.h.k.l.l.h.A.A.z.g.Z.h.A.A.A.A.A.A.A.A.A.A.A.A.A.A.H.A.S.S.H.S.H.H.H.H.L.L.L.H.L.L.L.L.L.I.I.I.T.T.T.T.~.T.T.~.T.T.[.^.P.T.T.~.T.I.~.I.T.T.T.T.T.T.~.T.T.T.~.T.~.~.~.Y.~.T.T././.~.~.~./.~././././././././.(.(.(.(.(.(._._._._._.|._.|._.|._.|.|.",
+") ) I ) ) P P P I J I P P P P P H P P P H J H H L L H H Z L L H H H H H Z Z Z L Z J Z S Z Z D L Z Z H Z D Z G Z Z D Z Z Z Z Z Z Z C D C Z B Z Z Z Z Z Z Z Z Z Z D Z B G Z Z G Z Q _ pXgXgXgXhXpXpX{ ' u u y y : r 0 * r * = e ; r 0 : 0 r r e r * e r y e r r t r r y r r r y : r r r r r r r r r r r r r y : r r r r r r t y r y : r : 0 e r r y r r r r r r r * y r r y y r r r r r r r r y = e e y y y u u Q ~ ' ' ' ' ' [ f.g.i.d.i.i.a.i.d.i.u.i.i.u.a.a.a.i.a.a.i.f.f.i.a.g.a.a.f.g.z.g.h.z.g.g.h.h.h.h.A.h.A.A.A.S.J.h.S.A.S.S.G.H.h.A.S.A.H.A.A.A.A.A.A.A.S.A.A.A.A.h.h.A.j.A.A.j.A.A.S.h.A.h.A.h.A.h.A.h.A.A.h.h.h.h.h.z.h.h.h.S.g.A.g.g.h.l.z.h.g.g.f.z.h.h.k.k.g.g.h.g.h.h.h.A.l.l.h.l.l.z.h.l.h.j.h.h.h.h.j.z.k.j.f.g.a.z.g.h.k.h.k.h.h.h.l.A.A.A.A.A.g.A.A.S.S.S.S.H.H.G.H.G.H.P.P.S.S.S.L.D.H.A.D.A.A.H.A.G.G.A.A.A.A.z.h.z.z.k.k.k.a.a.a.a.i.a.i.i.i.a.i.i.i.i.i.i.i.i.a.d.d.d.k.f.k.f.f.d.z.k.a.d.a.a.d.a.a.a.z.a.z.u.d.i.a.d.d.a.a.a.a.d.d.d.a.a.i.i.a.i.i.a.i.a.i.a.a.s.a.z.i.i.i.a.a.a.a.a.a.i.a.a.a.a.f.f.f.g.f.g.g.h.h.h.h.G.A.A.A.A.A.A.A.A.A.A.A.^ S ~ CXVXAXGXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXAXFXFXFXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXBXm.[ / S ` /././.!.~.~.~.~.T.~.T.~.~.~.^.^.~.~.~./.~.~.~.(.~.~.~.~.~.~./.~.(.^.(././.[.~.[./.^.(.(.^.(.(.(.(.(.(.`.(.(././.!.~.T.T.T.T.U.U.S.U.P.L.L.L.L.L.L.L.S.U.L.L.S.S.H.H.L.S.H.H.H.H.A.H.H.H.H.H.H.G.L.H.H.H.L.L.L.L.D.L.S.U.S.S.L.S.S.S.S.L.H.G.G.D.G.D.S.G.S.A.A.A.A.g.g.g.k.g.g.d.g.g.j.f.a.a.i.f.f.k.f.f.k.f.f.f.z.f.z.f.f.k.k.k.f.f.g.g.g.g.g.k.k.h.h.h.l.l.G.A.h.A.h.A.A.A.A.A.A.A.A.h.A.A.H.A.A.H.H.A.S.G.S.H.H.H.H.S.H.S.U.L.L.L.U.L.U.U.T.P.T.~.T.T.~.T.~.~.T.~.T.T.~.T.~.T.I.T.~.T.~.T.T.~.T.T.T.T.T./.T.T.~.T.T.~.~.~.(./.~.~./.~./.~.^.~./././.(.[.^.^.(.(.(._.(._._._.|._._._. X_.|.`.|.",
+"I ) ) P ) P ) J I I I I P P P P I I L P L J H H L L L L L L Z H Z H Z L L Z Z Z Z Z Z Z H Z H Z Z H Z L D D Z Z Z Z Z Z Z Z Z Z Z C Z Z Z Z F Z D Z Z Z Z Z Z Z Z C G Z F G B Z m.gXHXgXsXaXM.{ Q f u u r ; : y r r r r ; r r r r r r r r r 0 r r r r * r r y * r r r r y r r : r r y r r r y r r r r y r : r t r r t r y * r r r r r y r r r r r t r r : y r y y 0 t r * r r r r r y = r r : ; > : : : r y y u c S n ' ' ' ' ' T d.k.i.a.a.a.u.i.k.i.a.a.a.a.a.a.a.i.f.i.a.k.i.a.i.f.f.j.a.g.g.g.g.h.g.h.h.h.h.A.h.A.A.A.A.H.A.S.S.G.Z.S.S.H.A.A.A.A.G.A.A.A.A.A.A.A.S.h.A.S.S.G.h.h.A.G.S.j.h.h.h.h.h.D.l.A.A.A.A.z.h.h.h.h.h.g.z.h.g.k.g.g.g.z.a.h.z.g.g.h.j.k.f.h.h.h.k.g.k.g.g.h.h.l.l.h.z.l.l.l.l.l.l.z.f.z.a.j.x.j.k.a.f.g.z.g.k.g.h.k.h.h.h.g.G.A.A.g.G.h.A.A.G.S.S.S.S.D.D.D.D.D.D.D.l.L.D.H.D.A.U.H.H.H.G.A.H.G.A.G.G.A.A.A.z.h.k.k.z.k.i.i.z.a.a.i.i.a.a.u.i.i.i.a.a.i.i.a.a.i.k.f.f.f.f.k.k.a.k.k.k.k.k.k.k.z.a.a.a.d.a.a.a.a.a.a.i.a.a.a.i.z.E a.a.a.d.i.i.i.i.i.i.i.a.i.a.a.a.t.i.a.a.a.a.a.a.a.i.a.i.a.a.a.a.a.f.f.g.g.g.g.h.h.h.g.A.A.h.h.A.A.h.A.A.A.A./ ^ / BXVXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXDXDXFXAXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXDXFXFXFXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXAXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXSXFXFXFXFXFXDXAXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXDXBXm.} S / ` {./././././.~.~.~.~.~.(.~.!.~.~./.~.^.~./.~.~.T.~.~.~.~.(.^.~.~.~.~.~./././.(.!.(.^.(.(.(.(._.(._.(.(.^.(.(.(./.^.~.~.!.T.T.P.U.P.P.P.S.S.L.L.L.L.L.L.L.U.S.L.L.L.L.H.L.S.L.G.H.H.H.H.H.H.U.A.H.H.H.L.H.L.L.L.L.Y.L.U.U.L.U.L.L.L.L.L.S.S.H.H.H.H.G.G.A.S.A.S.h.h.A.z.g.g.g.k.k.f.z.f.f.k.z.z.f.f.a.k.s.a.f.z.k.a.f.a.f.f.k.k.k.g.g.g.f.k.g.h.k.h.h.h.h.h.D.l.l.A.A.A.A.A.A.A.A.h.A.A.A.A.A.A.A.H.A.G.G.G.H.H.H.H.H.H.U.A.U.L.L.L.L.L.U.P.U.T.T.T.T.~.T.T.T.~.T.[.T.~.!.T.~.~.~.~.T.~.T.T.~.T.K.K.~.T.~.T.T.T.~.T.~.~.~.~.~././.[./././././.~.~././././.(.(.(.{._._.(.|._._.(.`._._._._.|._.`.|.",
+") I ) I ) I J I I I ( P U P P P I K P P I J J U H J J J Z L Z L S Z L S Z Z L Z Z H H Z Z Z H H G Z H Z Z D Z Z Z Z G B D F G B D Z Z F Z Z Z Z Z Z Z Z Z A Z Z Z Z G C D S ) aXgXgXgXaXaX} ' c S y : : e ; 0 y r r r r r r r r r r r r r r r r r r r r y : * y r q r r r r r t r r r r r r y : t * r r r y r r r r y r r r r y r y r t y r r y r r r r y * t * r : r r r r e 0 r r r r = r r r r r : : r r e y > u u / ' ' ! ' _ ` S.z.a.a.i.i.k.i.k.i.a.a.a.a.i.a.a.i.a.a.i.d.i.g.f.g.g.a.g.a.h.g.g.g.h.h.h.h.A.h.A.A.A.J.A.A.H.S.H.H.A.H.H.S.A.H.A.H.A.A.A.A.A.A.G.h.h.A.A.h.Z.h.h.S.A.j.h.Z.j.W.A.A.l.A.A.h.A.h.A.h.z.h.h.z.A.k.k.D.k.g.z.g.z.g.k.k.g.g.h.h.h.k.h.k.z.h.h.h.z.g.h.h.z.h.l.l.l.l.l.l.l.z.l.k.g.h.j.z.f.h.z.f.g.a.a.k.k.k.h.k.h.h.h.h.A.h.A.A.H.A.A.A.S.S.G.G.L.D.D.U.L.D.G.D.D.H.D.L.S.H.H.S.H.G.A.G.A.G.A.G.D.A.A.h.l.l.k.k.i.k.z.i.a.i.i.i.i.i.i.i.i.i.i.a.i.f.k.i.f.f.f.f.k.d.f.k.k.k.k.k.k.k.d.d.a.a.a.z.d.a.d.d.i.a.i.i.i.a.a.i.z.x.a.a.a.a.a.a.a.a.a.a.a.i.a.i.a.a.a.a.a.a.a.a.a.a.i.a.a.i.a.a.a.a.a.a.f.a.g.a.z.g.h.h.A.h.h.A.A.g.A.A.h.A.A.A.~ S / VXVXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXGXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXFXFXFXFXFXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXDXDXBXm.[ ^ ~ ` /./././././.~.T.~.~.~.T.~.~.~.~././.~.~.~.~.~.~.~.~.^.~.~.!.~.~.!.^./././.^.^./.(.~.(.(.`.^.(._._.(.(.`.(.^.^./.^.~.T.T.T.T.P.P.P.L.U.L.U.L.S.U.L.L.L.L.U.L.H.L.H.L.L.S.L.H.S.H.D.H.L.S.H.S.H.L.L.L.L.I.U.L.L.U.I.U.P.P.L.L.L.L.U.S.L.S.H.H.G.H.D.H.G.G.S.S.A.A.A.g.g.g.g.f.k.d.k.k.a.f.k.a.f.a.f.f.f.a.a.a.f.a.g.f.f.f.a.g.z.f.f.g.f.g.g.g.k.h.h.z.h.h.h.h.g.A.h.h.A.A.A.j.g.Z.A.h.h.h.A.A.A.A.S.S.A.S.A.S.H.Z.S.H.S.H.L.S.S.L.L.U.L.P.P.P.T.P.T.T.T.T.T.~.T.~.~.~.[.~.[.~.~.T.~.~.T.~.~.T.T.~.T.T.T.K.T.T.T.T./.T.R.~.~.~./.~././.~.(././.(.T./././././.(.{.(._._._._.|._._.|._._._._._. X`._.",
+"P ) P ) ) P ) I I I P P P P P P J P P P L J H P H H H D L P Z L Z L Z Z L P Z Z Z H Z H H S S Z Z Z Z H Z Z G G Z Z Z Z Z Z Z C C G Z Z Z Z Z Z Z F Z Z Z Z Z Z S Z C H H [ gXgXgXaXpXM.' ' S y : : e : e r = r ; r e = r ; 0 r 0 r r 0 r r r r r r r r r r r r r t r y r r r r t r r y r r * y y r t r r y r r y r r r r r r r r r r r r r r t r r y r : y 0 y * y r r r r r r r r ; ; r r r r 0 0 r r ; : : : : y y u u c ! c ! ! L E a.u.u.d.i.u.k.i.a.a.a.a.a.i.a.a.a.a.a.a.a.a.f.a.d.g.j.h.a.g.g.z.A.h.h.h.A.A.A.A.A.A.A.A.A.S.S.G.H.A.A.A.J.g.J.A.W.A.A.A.A.h.A.A.l.z.S.h.A.j.A.A.h.A.h.Z.h.h.h.h.h.h.h.A.h.h.h.z.A.A.z.A.z.g.g.g.g.g.g.g.g.k.g.h.g.z.f.g.h.h.z.k.k.h.h.k.z.l.h.h.l.l.l.l.l.l.h.l.l.l.k.l.f.j.a.j.f.f.f.f.a.g.z.g.k.k.k.k.h.h.h.h.h.A.h.g.A.A.A.A.S.A.H.G.z.D.L.l.G.D.G.L.P.D.S.G.S.H.H.A.J.A.H.H.H.G.G.A.A.A.A.A.l.l.k.k.k.z.a.a.a.a.a.i.a.i.i.i.i.a.a.a.i.f.i.i.f.k.f.d.k.k.f.k.k.k.k.k.d.k.z.x.a.a.a.a.d.x.a.k.z.E a.a.a.a.i.a.E a.a.a.a.a.d.i.a.u.a.a.i.i.i.a.i.a.a.a.a.a.a.i.a.a.a.a.a.a.a.a.a.a.a.a.f.f.g.g.g.g.g.z.g.A.h.A.A.j.A.A.A.A.A.A.~ ~ ~ CXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXFXAXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXDXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXGXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXDXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXBXQ.{ Q ~ ` (./././.(.[.~.(.~.T.~.T.~.~.!.~.~.~.~.~.~.~.T.!.~.~.~.!.~.!.~.~.[.~./././.[././.(.~./.^.^.`.(._.(._.(.^.(.(.(././.~.~.T.T.P.P.P.P.L.L.L.D.L.L.L.L.L.L.L.S.L.L.L.L.L.L.L.L.L.L.S.H.H.H.L.S.U.L.L.L.L.L.I.U.U.T.T.T.T.P.U.L.U.L.U.L.L.L.L.S.H.H.H.H.D.D.G.S.D.A.D.A.h.g.g.g.z.k.k.f.f.k.f.f.f.f.f.a.f.a.f.f.f.f.f.f.f.f.f.f.f.z.a.g.g.g.k.f.g.k.k.h.l.h.l.h.A.A.z.D.S.g.A.A.A.G.j.h.A.A.A.A.A.H.A.S.S.H.H.H.H.H.H.H.H.L.S.L.L.L.L.L.L.L.P.P.P.P.T.T.T.T.T.T.~.~.~.~.~.~.~.!.!.[.~.~.~.~.~.T.~.T.~.T.~.T.T.T.T./.T.T./.~.R.~.~.~./././././././././.~././.(.[.(.(.(._._.^._._._.(.`._._._._._.|.`.`.",
+") ) ) ) S P I I ) P P I J P I I P P P P P J J S P P H H H U Z Z P Z L L Z H Z Z L H Z Z Z G Z Z Z Z D Z D Z Z D D Z D Z D Z Z Z Z Z D D Z Z Z Z G Z A L Z H Z Z Z Z Z A m.gXgXgXaXM.{ ' u u y : y : r r r r : r r r r r r e r r r r r 0 r r r r e 0 r r r r r r r r r r r r r r e * t y t 0 y r r r r t y r r r r r r * y r r y * * t r r r r * t y r y r q e r r r r r r r r r r r r r r * r e q r 0 y : r r r r r y r y u u / ~ { c K T d.a.a.a.a.k.i.d.i.z.u.i.a.a.i.a.s.i.a.a.a.a.g.g.a.g.g.a.g.g.h.l.h.h.h.A.A.A.A.l.A.S.Z.A.H.S.H.Z.A.H.A.A.A.G.A.A.A.A.A.h.S.h.A.A.h.D.A.l.D.A.h.D.A.z.h.h.h.h.g.l.l.A.A.h.l.l.h.A.h.h.l.l.l.z.z.z.f.j.f.g.g.g.a.g.g.g.z.g.f.h.z.h.k.h.g.g.h.g.h.h.l.h.l.h.h.h.h.h.k.g.g.j.a.f.z.f.z.a.g.z.i.a.g.z.g.g.g.h.h.h.l.A.h.A.A.A.A.A.H.S.S.S.S.S.G.H.G.G.H.H.S.Z.D.H.U.S.H.H.H.S.H.H.H.S.H.S.S.z.A.j.A.g.h.g.g.k.a.g.a.a.a.i.a.a.i.a.a.a.a.a.a.z.i.a.z.a.k.i.z.a.z.a.d.f.z.g.z.z.g.a.g.a.a.z.a.f.a.a.a.a.i.i.i.a.a.a.a.i.a.z.a.i.a.a.a.a.i.a.i.i.a.a.i.a.a.a.a.i.i.f.i.i.f.a.d.i.a.a.i.a.a.k.a.k.k.k.d.k.g.k.h.l.h.A.l.A.A.G.G.D.S.D.A.~ ! / BXVXZXDXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXSXZXZXMXm.} ~ ! ` [.(.(.(./././.~.~.~.~.T.~.~.~.T./.~.~.~.~.~.~.~.~.~.~.~.~.~.(.~.~./././././././.~.(.(.(.{.(.|.^.|.(.(.|.(.(.(.(././.^.T.T.T.U.U.L.L.L.L.L.L.P.P.L.L.L.L.L.F.L.L.L.L.P.L.L.L.D.H.L.S.L.L.L.L.L.S.U.P.P.P.T.U.T.L.P.T.T.P.P.P.P.P.L.P.L.L.D.L.D.D.H.H.S.S.S.H.S.A.A.h.h.k.z.f.f.f.f.f.f.f.f.f.f.f.f.f.i.f.d.f.f.i.k.f.f.f.f.f.k.g.k.k.g.k.g.g.l.k.g.g.Z.k.h.A.A.D.A.A.A.Z.g.h.A.A.A.A.A.A.A.A.G.A.A.S.G.S.G.G.G.S.H.H.L.S.L.L.L.L.K.L.L.U.U.U.U.L.T.Y.T.~.~.~.~.~.~.~.~././.~.~./.~.~.~.~.T.~.T.T.T.T.T.T.T.T.T.~.T.~.~.~.~.(./././././././././././././.(.~.(.(.[.{.(.|._.(.|.`._._._.(._._.|._.}.",
+"_ J J ) ) ) ) I P P ) I P ) P P P ) J P P J J L H U P H H H D H S Z L Z H Z Z L Z Z Z Z Z Z Z H Z Z D Z Z Z D Z Z D Z D D D F Z Z Z Z D Z Z H D D D Z Z H C D D Z Z J aXgXgXaXpX{ { n u y y : e r : r r r r r r r r r r r r : : r r r r r r r r r r r r r r r r r r r r 0 y r r 0 y y * r r * y y r r r * y r r r r t y r r r r t y * y r y r y y * r r r r r r r r r r r r r r r r r r r r r r r r t * r r r r ; 0 0 r > u u ^ u Q Q S L L T z.u.a.a.a.i.i.u.d.a.i.i.a.a.a.i.i.a.a.a.a.a.a.a.g.g.g.j.h.g.h.h.A.l.g.g.A.A.A.A.A.S.S.D.A.G.H.S.H.H.A.G.A.A.A.G.j.A.h.S.h.h.g.g.l.Z.g.h.g.g.Z.h.h.h.h.h.l.z.h.h.h.l.l.l.l.h.h.h.l.l.l.h.h.j.h.f.g.a.g.j.g.g.g.g.g.h.g.z.g.h.k.h.h.j.h.h.h.h.h.h.h.h.h.h.h.l.h.g.g.f.f.k.f.g.g.g.a.i.z.g.z.a.z.g.k.h.g.l.l.l.A.A.A.A.A.A.A.A.S.H.S.H.S.D.H.H.H.H.H.L.L.U.S.H.H.H.H.S.Z.H.H.S.H.S.S.A.A.A.A.h.h.j.j.k.z.a.a.a.a.a.a.i.a.a.i.a.a.a.a.a.a.a.z.x.i.k.k.k.k.g.g.a.f.a.z.g.a.g.a.f.a.a.a.a.a.a.a.i.a.i.a.a.a.a.i.a.a.a.a.a.a.a.u.a.i.i.u.i.i.i.i.a.a.a.a.z.a.i.z.a.i.a.i.a.i.i.a.a.a.a.a.d.k.k.k.g.k.a.D.A.l.l.G.h.A.h.A.D.H.H.S.~ / S ZXVXAXDXZXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXAXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXSXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXZXZXBXQ.[ ~ S ` (.(.(.(.(././.~.~.~.[.T.T.~.~.T.T.~.~.~.~.T.T.[.~.~.~.~.~.~.~.[./.~.~./././././.(.(.(.^.(.(.(.(.|./.(.(.(./././.(.T.^.T.T.T.U.U.U.U.L.L.L.Y.P.S.L.L.U.L.L.L.L.L.L.L.P.A.D.U.D.L.S.L.L.S.S.L.L.L.P.P.P.P.T.T.Y.^.~.Y.T.P.T.P.P.P.P.L.P.P.L.L.H.P.S.H.A.H.H.S.S.S.A.A.A.k.g.g.f.f.f.f.f.i.f.f.i.f.f.f.k.i.f.f.d.f.k.k.f.f.f.f.f.k.g.k.k.g.g.g.g.z.g.g.g.l.l.l.h.A.l.A.h.A.A.A.A.A.A.A.A.A.G.A.h.G.G.S.G.G.D.G.S.D.H.H.H.H.H.L.L.L.U.L.U.U.U.U.U.U.Y.Y.T.T.T.~.~.~.~.~././.~./.(.!./.~.~.~.~.T./.T.~.T.T.~.~.T.~.T.~.T.R.(.~.~./././.(././.(././.(.(./.^.).(.(.|.(.(.(.(.(.(.(.|.^._._._._.}._.}._.",
+") ) ) ) I I I I P ) ) L P P P P I P P J L J J L H H P H H H H H Z Z J Z Z Z Z Z Z Z Z H Z H Z Z H D D D Z D Z D A H D Z D Z Z Z Z H D Z D D D Z D Z Z Z Z Z G Z S ( gXgXgXaXpXM.' S > : r r ; ; r r r r r r r r r r r r r r r y r r r r r r r r r r r r y * r r r r r r : r r r r r r r r r r r * y : r y 0 r y r r * y r 0 y r r 0 y r y * * r * r r r r r r r e 0 r r r r r r r r r r r r r r r r r e r r r r r ; r 0 ; : y t t S u Q / > G e.x.a.u.u.z.u.i.d.a.a.a.a.a.i.i.i.s.a.a.a.a.z.a.g.a.g.g.g.h.h.h.h.l.A.h.A.S.A.A.A.A.A.S.H.S.S.S.A.A.G.S.Z.G.S.A.A.h.A.g.J.h.D.D.h.A.h.h.D.A.h.h.h.g.h.g.g.h.h.h.z.h.h.z.h.h.h.h.h.l.l.h.f.j.k.k.h.g.g.g.g.g.f.g.g.g.g.a.h.g.h.g.g.h.h.h.l.g.z.l.z.h.k.h.h.l.h.k.g.j.k.f.f.z.a.a.a.z.a.g.a.g.g.k.g.j.g.h.h.H.A.A.h.A.h.A.H.S.S.A.H.S.H.L.D.H.H.H.L.L.S.U.S.H.H.H.H.H.H.H.Z.H.H.S.S.H.A.A.A.h.h.g.g.z.f.a.a.a.a.a.a.a.a.a.a.a.a.f.a.z.z.i.i.k.f.k.k.k.k.k.k.z.k.k.g.f.f.a.d.f.a.a.a.a.a.a.a.f.i.i.f.a.u.a.a.i.i.a.a.a.a.a.a.a.i.u.a.a.i.i.a.i.a.i.a.a.a.z.d.a.a.a.d.i.a.a.i.a.a.a.k.d.d.k.k.k.h.l.l.h.l.A.A.G.A.A.A.l.S.S.S.P ! / BXVXVXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXAXDXGXSXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXGXDXAXDXDXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXDXFXAXZXDXZXBXpX} Q Q ` (.(.(.[././././.~.~.~.T.T.~.~.T.[.T.~.~.T.T.~.T.T.T.~.XX~.~.T.(././.~././././.(.(.(.(.(.(.^.(.|.(.`.(.(.(.(./././.E.~.T.T.T.T.U.P.P.L.L.P.L.L.P.L.L.L.L.L.L.L.L.L.L.L.L.U.S.H.U.U.H.L.L.U.L.L.L.P.P.P.T.T.Y.Y.Y.T.T.T.T.T.P.P.P.P.L.U.U.L.A.P.A.G.H.H.H.G.A.H.g.S.h.h.h.k.f.f.d.f.f.d.f.f.f.f.f.k.i.k.f.d.f.i.f.k.z.f.d.f.k.z.g.k.g.k.g.g.g.g.g.g.g.g.A.h.h.A.h.g.A.A.A.A.A.A.A.A.A.A.A.h.A.G.A.S.S.G.G.H.H.D.A.G.H.H.H.S.L.H.L.L.L.L.I.U.U.U.T.Y.T.Y.~.T.~.~.~.(.~.(.~././.T.~.~./.~.T.~.~.T.~.~.T.~.T.T.~.T.~.~.T.~.T.T.(.T./././././.~.(.~./././.!.(.(.(.(.(.|.(.|.(.(.(.^.(._._._._._.}.}._.",
+") L ) H ) ) I I ) P P P ) J P P J J I J P L L J K H H Z H H H D Z L Z Z Z Z S H H Z H Z Z H G G H Z Z Z D Z D D D D D D D D Z Z Z G Z Z Z D Z D D Z J Z G G H A / gXgXgXaXpX{ / u u = y r r ; : r r r r r r r r r r r r r r : 0 r r r r r r r r r r r r r : r r r r r r e q r r r r r r r r r r t 0 q r : t r * q 0 y r r r r r r r r r * y t r r r r r r r r r r r r r r r r r r r 0 e r r r r r r r r r r r r r r r r y ; e e y : u n c u u Z t.a.a.i.u.a.i.i.i.i.i.a.i.i.s.i.i.i.a.a.a.a.g.a.g.z.g.g.k.k.z.h.l.l.l.A.h.A.A.A.S.S.S.S.S.H.H.Z.A.H.A.S.A.A.g.S.A.A.h.g.A.h.h.A.z.A.A.h.g.l.h.h.k.S.g.g.z.g.h.h.k.h.h.k.h.h.h.h.h.g.g.h.g.h.g.f.g.a.g.z.f.g.g.a.z.g.g.z.g.g.k.g.f.h.k.g.g.g.z.g.h.h.h.k.k.k.k.k.f.f.f.f.a.d.g.g.a.z.k.k.g.z.h.h.A.G.h.h.z.h.A.A.A.S.A.A.A.H.H.S.S.S.S.L.H.S.D.L.L.L.S.S.U.S.H.H.H.H.H.H.A.H.S.S.A.A.A.A.h.g.h.h.k.k.f.f.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.z.i.k.z.i.k.h.k.k.z.g.k.k.k.z.f.g.f.a.k.f.f.a.a.a.i.i.i.d.a.a.a.a.i.a.a.a.a.a.u.a.u.a.a.a.a.i.i.i.i.i.a.a.a.a.i.a.a.a.a.d.i.i.a.a.a.a.a.a.k.k.k.x.k.k.l.l.h.h.h.h.h.A.A.G.S.S.S.S.S ! ! CXVXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXGXFXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXAXDXDXBXQ.[ ! ! ` (.(.(.(.(./.~.~.~.~.R.~.~.T.~.T.T.~.T.~.~.~.T.[.(.XXE.U.T.~.~.~.~./././././.(.(.(.(.(.(.(.`.(.(._.(.(.(./././././.T.T.~.T.T.T.T.P.P.P.P.L.L.P.P.L.U.L.L.S.L.L.L.L.L.L.L.L.U.S.L.H.S.L.D.L.L.L.L.P.P.P.Y.T.Y.XX[.~.T.T.~.T.T.Y.P.L.P.U.U.L.L.L.D.H.H.H.H.H.H.G.H.A.A.h.k.g.f.f.f.d.f.d.d.d.j.f.f.f.f.k.d.k.f.f.f.d.i.f.f.f.d.f.g.g.k.k.g.g.k.g.g.z.z.h.g.h.D.h.g.h.A.A.A.A.h.h.A.l.h.A.A.A.A.A.G.S.H.A.G.D.D.H.A.H.H.H.H.L.S.L.S.H.L.L.L.L.Y.Y.U.T.Y.T.T.~.T.~.~.~.~.~./.~.~./.^.(.T.(.~.T.~./.T.~.~.T.~.~.T.~.~.~.~.~.~.~.~././.!./././.(.~.(./.^./.(./.(.(.(.(.^.(.^.(./.|.(.(._._._._.}.{._._.",
+") ) ) ) I ) I I P ) P ) I P P P P P P P P H Z H H H H H H H F H H H Z H H S Z Z Z H Z Z Z Z H Z D D D H C Z D D Z H D Z D D Z Z H Z Z Z Z Z D Z Z Z Z L Z Z A ` gXgXgXaXm.' Q u : e r q r : : e r r r r r r r r r r r r e r r r r r r : * y e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r e 0 r r r r r r r r : r r r r r r r r r r r r r r r r r r r : 0 r r : 0 : r 0 r r r > u t u u c > u Z e.i.a.i.a.s.i.i.u.s.u.i.i.i.i.i.i.a.i.a.a.a.z.a.z.g.g.g.g.h.z.z.h.h.l.h.A.A.A.S.S.S.S.S.S.S.A.A.S.H.S.A.A.A.A.h.A.h.D.h.h.h.h.h.z.g.A.h.l.h.h.h.g.h.g.g.g.g.g.k.h.g.g.h.h.g.k.g.h.h.g.k.k.k.j.z.j.k.a.f.k.k.a.a.g.k.g.g.g.g.g.g.g.k.h.z.h.g.g.h.g.g.g.g.g.g.g.f.f.f.f.f.f.a.f.f.f.f.k.g.g.g.h.A.h.h.A.j.Z.A.G.S.A.S.A.S.G.G.S.S.S.H.L.H.H.L.L.L.F.S.L.U.H.H.H.S.S.H.H.H.G.H.S.A.A.A.A.G.l.G.g.k.k.g.f.j.i.z.i.a.a.a.a.a.a.a.f.z.i.d.a.f.f.k.k.k.k.k.k.k.k.h.k.g.a.g.a.g.a.f.a.d.a.a.a.f.d.f.i.a.a.a.u.i.i.i.a.a.a.u.a.a.u.a.u.i.u.i.i.i.a.a.i.a.a.a.a.a.i.i.a.a.d.a.i.a.a.a.a.k.d.g.g.h.z.h.z.h.l.A.A.A.A.A.A.A.S.S.S.~ ~ / CXVXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXAXFXSXMXpX[ Q S ` (.(.(.(.^.~././.~.~.~.~.T.T.~.T.~.~.~.T.T./.T.^.T.~.~.T.~.~.~.(./.!./././.(.(.(.(.(.(.^._.(.`.(.(.(.(.(././.!././.~.~.~.T.T.T.T.T.T.U.P.L.L.U.L.L.U.L.L.L.L.L.S.L.L.L.L.L.S.Y.S.oXA.D.U.x.U.U.z.P.P.J.J.E.XXoXT.T.(.P.oXT.T.T.U.oXH.U.G.U.z.U.G.H.H.G.D.L.D.S.S.D.g.A.h.f.f.f.i.d.i.g.g.f.i.f.f.k.g.f.f.i.k.f.f.f.f.d.f.f.f.k.f.k.k.k.k.g.g.k.g.g.g.g.l.l.D.l.D.A.A.A.A.A.h.A.A.A.h.H.A.h.z.H.S.S.S.S.S.A.S.S.K.A.H.H.H.S.H.H.H.L.L.L.L.I.U.U.U.T.Y.T.T.~.~.~.~.~.~.~.~.~.~././.~.(.T.~.T.~.~.~.T.~.~.T.~.~.~.T.~.~.~./.~.(.E.~.(.[.~./.(.T.(.(.(././.(.(.(.(./.(.(.^.(.(.^.(.(._.(._._._._._.|.",
+") ) P S I I P I P ) P P I I I I P P H P H H J J H P H H H H H H H Z Z Z D Z Z D Z Z Z Z Z H Z Z D D Z A H Z D D H Z D D D D H D H Z H H D D Z D H H D Z G Z _ gXgXaXpX{ ' n u y ; : r r : 0 : y r * t r r r r r r r q r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r e r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r y r r r * y r : r r r r = t y y y u n y y Z E i.i.i.i.i.i.s.i.i.u.s.u.u.a.i.i.a.a.a.a.f.g.g.a.z.g.g.k.k.z.h.h.l.A.h.A.A.A.h.S.A.S.S.S.H.A.D.A.A.S.A.A.h.A.A.A.h.h.A.D.h.l.D.l.l.l.h.h.k.g.h.z.g.g.g.g.g.g.g.k.g.k.k.f.g.g.g.z.g.k.h.a.z.a.z.a.g.f.a.f.k.g.a.f.f.g.g.g.g.g.k.g.h.g.k.g.k.g.g.g.g.f.g.f.g.j.a.f.f.f.f.g.a.a.f.h.g.g.g.g.G.h.A.A.A.h.A.A.A.G.G.A.A.A.G.S.S.S.S.H.S.L.H.L.S.H.L.H.U.S.H.S.H.L.S.H.H.G.H.S.S.H.H.A.A.g.g.g.g.h.k.g.f.z.a.g.i.a.g.k.a.k.a.a.a.k.k.i.f.d.f.f.k.k.l.l.k.h.k.k.k.k.g.a.f.a.a.a.f.a.d.a.a.i.i.i.d.a.a.a.a.a.a.a.i.a.a.a.a.u.a.i.i.i.i.i.i.i.i.i.a.a.a.d.a.a.a.i.a.a.a.a.a.a.a.z.a.d.k.g.g.l.g.d.D.h.h.A.h.A.A.A.A.S.S.G.G.S ! ! CXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXGXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXAXZXFXBXm.} ~ ~ ` _.(.(.(.(.[./.~.~.~.T.T.~.T.~.T.T.~.T.~.~.T./.T.(.T.~.T.~.T.T.[./././.(.(.(.(.(.(.^.(.`.(._.^.`._.(.(.(./.(.(././.^.T.~.~.T.T.T.T.T.U.P.U.U.L.L.L.L.L.U.U.S.L.L.D.L.L.L.L.h.[.IXPXGXPXIXPXIXPXPXIXPXPXPXPXIXPXIXIXPXIXPXIXPXPXPXIXPXIXPXPXPXPXPXPXIXIXdXz.D.S.S.A.S.h.h.f.f.k.i.j.f.a.f.k.f.f.f.f.k.f.f.f.f.f.i.d.f.f.f.f.f.f.g.k.k.g.g.g.g.z.z.k.A.g.l.h.g.l.g.A.j.A.S.Z.h.S.A.h.A.A.A.H.H.z.z.A.S.S.S.S.G.H.S.H.H.H.H.L.H.H.H.H.H.L.L.L.U.T.T.T.T.T.~.~.T.~.~.~.~.~.~.~.~.[.~.(.~.T.~.~.~.T.~.T.~.~.T.~.~.~.~./././.T.~.~.^.^.T.(.^./.(.(.(.(.(.(.(.(.(./.(.(./.(./.(.(.|.(.|.(._._._._._. X_.",
+"P ) P ) ) P ) ) P ) ) P I I I I P J P J ( L L J J H H H H H H H H H H Z D Z Z H Z L Z U Z Z Z Z A D Z H F D D D Z H L D H F Z D Z D H Z F Z S Z D Z Z H A c hXgXaXaXM._ S > ; r : : : r r * r r r r r r r r r r r r r r r r r r r e r r r r 0 r r r r r q r r r r r r r r r r r r r 0 r : r r r e 0 r r y : r r r r r r r r r 0 r r r e r r r r r r r r * r r r r r r r r r r r r r r r r r r r r r 0 : r r r r y : r r * r 0 r > r e y > y u u u ; N w.i.a.i.i.i.u.u.i.s.i.i.i.i.i.i.i.a.a.a.g.a.g.g.a.g.g.k.h.k.h.h.h.A.A.z.A.A.S.F.S.S.S.A.S.S.A.A.A.A.A.A.A.h.A.h.h.D.z.A.A.l.l.l.l.h.h.z.g.g.a.g.g.a.g.g.g.g.d.z.g.g.g.g.g.g.g.g.z.z.g.h.z.z.a.z.a.f.f.k.f.f.d.f.f.a.g.f.g.z.g.h.k.k.g.g.g.g.g.g.g.g.g.g.a.z.k.k.j.f.f.f.a.z.k.g.h.h.h.g.h.A.h.A.g.G.h.A.A.h.G.g.S.H.S.G.H.S.S.L.S.L.S.S.L.L.L.S.U.H.H.H.H.A.H.H.H.G.G.S.S.S.A.h.A.H.l.h.h.k.k.h.f.g.f.z.a.k.a.a.a.a.a.a.k.d.i.f.f.f.f.k.f.k.k.l.k.k.k.k.k.f.f.i.g.g.a.a.a.a.z.a.a.i.d.i.f.a.a.i.a.a.i.a.a.a.a.a.a.a.u.a.i.i.i.i.i.u.d.i.a.a.d.d.a.a.a.a.a.i.i.a.a.a.a.z.a.k.l.z.g.g.g.h.z.h.h.A.A.A.A.S.G.S.G.G.H.~ ! Q CXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXFXHXpX[ Q S [ (.(.`.(.(./.~.~.~.T.T.~.T.~.~.T.T.T.~.T.T.T.T.~.T.~.~.~.~.~.T.T.!././././.(.(.(.(.`.(.`.(.`.`.(.(._.(.^.(././././.~.!.T.T.~.T.T.T.T.T.U.U.L.L.U.L.L.L.Y.L.U.S.L.J.P.H.L.L.(.GXPXPXPXPXPXPXIXGXPXPXPXPXGXPXGXPXPXPXPXPXIXPXPXGXPXPXGXGXPXGXPXPXGXGXPXGXGXT.S.S.S.A.A.h.k.a.k.k.i.a.a.a.g.a.g.k.k.k.f.f.f.d.d.f.f.k.i.d.k.f.f.g.f.k.k.g.k.g.z.g.h.l.k.A.l.l.g.A.D.A.Z.A.A.A.A.h.A.A.A.A.A.A.A.G.G.G.A.H.S.S.S.H.S.H.H.H.H.S.H.H.H.L.H.D.L.L.T.U.T.T.T.~.T.T.(.~.~.~.T.T.~.~.~.~.T.T.~.T.E.XX[.~.T.~.~.~.~.~.~.~.(./././././.~././.~.[.(.~.(.(.(.(.(.(././././.(./.{.^./.(.(.(.(./.[.(._._._._. X_.",
+") P ) ) P ) P P P ) P I I P U I J J P J L H L J H H H H H H H Z L J Z H Z H Z D Z Z Z Z G Z L Z D D D Z Z D D D Z Z Z D S Z S D Z H Z Z Z L H Z D D Z Z S hXgXaXaX{ _ c t > r q y : : : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r * t y r * y r r r r r r * r r r r r r r r r y * r r r r r r r r r r r r y r r r r r r 0 e r r r : r r r r r r r r r r r r r r r 0 t * r r r y r r : ; ; y e y u r e > N u.i.t.u.u.u.i.s.u.i.i.i.i.i.a.a.a.a.a.a.g.a.a.g.a.z.k.h.h.h.h.h.h.A.A.A.A.A.S.S.A.S.A.S.A.A.A.A.A.h.h.A.A.h.h.D.d.A.A.h.l.h.l.h.k.h.k.g.g.g.f.g.d.j.g.g.g.g.g.g.g.g.g.g.g.g.k.g.g.k.z.k.f.g.a.a.k.s.a.f.f.f.f.f.f.z.g.g.g.g.k.k.h.k.g.g.g.g.a.f.k.k.z.a.k.k.f.k.f.f.f.x.f.k.h.a.h.h.l.h.A.h.A.A.A.A.A.A.H.G.H.A.A.S.S.H.L.S.S.S.L.L.L.S.S.H.L.S.U.H.H.H.H.H.H.A.G.H.S.h.A.S.H.A.h.h.h.h.k.h.f.j.k.k.j.g.a.z.z.f.z.a.z.s.f.k.f.k.k.f.z.k.k.k.k.h.k.k.g.z.f.f.g.a.d.a.g.f.a.a.a.a.i.i.i.d.u.a.a.a.a.a.i.a.u.a.a.u.u.a.i.u.u.i.u.i.a.i.i.i.a.a.a.a.a.a.i.a.a.a.a.a.a.z.a.z.z.k.k.g.g.k.g.D.h.h.g.j.A.A.A.A.H.H.H.H.! ! ! CXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXAXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXAXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXFXMXm.' Q / U (.(.^.^.^././.~.~.~.~.T.~.T.~.T.T.~.T.~.T.~.T.[.T.~.~.~.~.~.~.(././.!./.(.^.`.(.(.^.`.(.(.`.(.(.(.(.(.(.(././.!.T.~.~.T.~.T.~.T.T.T.U.Y.Y.Y.U.U.L.L.S.S.S.H.L.L.L.L.L.L.L.PXPXIXPXPXGXGXPXIXPXGXIXIXGXPXGXPXGXIXPXGXGXPXGXGXPXGXPXGXPXIXPXGXIXIXPXGXGXAXBX_.S.S.A.g.z.k.g.g.k.i.f.f.g.i.f.f.f.k.f.k.f.f.k.f.d.d.d.k.f.f.f.f.d.g.k.z.g.h.g.h.z.h.l.l.g.l.l.A.l.A.A.j.j.A.S.h.S.A.A.A.A.A.A.A.A.A.h.H.A.G.S.G.H.H.A.H.A.L.G.H.H.S.H.H.H.L.L.U.T.U.T.T.T.~.~.T.~.~.T.[.[.T.~.T.~.~./.T.(.XXXXU.~.T.~.T.!.Y.~.~.~.~.~./././.~./././.(.T.(.(.(.(.(.(.`.^.(.(.(.^.(.(.(./.(.(.(./.{./.(.(._.(._._._.|.",
+"I P ) ) P ) P ) ) I I I I I P P P L P H H P H H H H H J F H H H H Z H H Z Z D D D D D D D Z D D D A D D D Z D D H D Z D H Z F H H D H H H Z H Z Z L Z S m.gXaXaXM.' u u > r r 0 r r r r r r r r r r r r r r r r r * r r 0 r r r r r : r r r r r r r 0 r r * y r r r r r r r r r r r r r r r r r r r r r r r r r r y r r r r r : r r r e r r r r e r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r y ; u y y t ; Z y.s.t.u.i.u.u.u.a.a.i.i.a.a.i.a.a.a.a.a.f.f.f.z.g.g.g.g.l.h.h.D.g.h.S.A.A.A.A.S.A.S.H.h.G.A.A.A.h.l.h.l.h.l.l.A.h.h.h.l.l.h.h.z.h.g.g.a.z.g.g.k.a.a.z.g.g.f.g.g.g.g.z.g.g.g.g.g.a.j.g.g.f.f.i.a.a.k.a.a.f.a.a.f.g.a.g.g.g.g.g.g.g.g.g.z.f.g.f.z.g.f.g.g.f.g.k.j.f.k.k.h.l.z.h.g.A.h.A.h.h.A.A.A.A.A.G.H.A.A.H.A.H.H.H.S.L.G.L.S.H.H.H.U.H.K.K.S.S.U.D.H.H.H.H.H.G.H.S.A.G.A.A.A.Z.h.h.h.h.h.h.z.g.g.h.g.g.g.g.f.f.f.f.z.f.f.f.g.g.f.g.g.h.a.h.f.h.k.a.k.k.k.z.f.f.a.g.a.a.a.a.k.i.i.k.i.i.a.z.a.a.a.a.a.i.s.i.i.i.u.i.u.u.i.u.i.u.a.a.a.a.a.a.a.a.a.a.i.f.f.i.i.f.d.g.k.g.k.k.g.g.h.h.h.g.A.A.h.A.H.S.S.H.H.H.~ S ! ZXVXVXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXGXSXDXAXDXDXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXDXAXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXAXBXm.{ ! ! [ (.(.(./././././.~.T.T.~.T.T./.T.T.T.T.T.T.~.~.T.~.T.~.~.~.~.~./.!./.(.(.(.(.(.^.`.`.(.`._._._.|.^.`.(./.~.^.(.~./.!.~.~.T.T.T.~.T.T.T.P.P.P.L.L.L.L.L.L.S.H.H.H.L.L.L.S.U.IXPXPXGXPXGXGXPXAXIXPXSXPXGXIXIXGXPXGXGXIXIXGXPXIXGXPXIXGXPXIXPXAXPXAXIXIXFXgXaXsXA.A.A.A.k.z.k.f.f.k.f.i.k.k.f.f.k.k.f.f.f.f.f.f.f.d.k.k.d.f.f.d.z.g.z.h.h.g.g.A.h.h.h.h.h.h.h.l.A.z.A.A.h.A.A.A.A.h.S.A.S.A.A.A.G.A.G.A.A.S.S.S.H.G.H.H.H.G.H.S.H.S.H.L.L.L.L.Y.T.Y.T.~.T.~.T.~.~.~.~.T.~.T.XXU.XX[./.T./.T.~.~.T.T.~.~.~.T.~.~.~.~././.~.~./././././././.(.(.(.^.{.`.[.(.(.(._.[./.(./.(.(.(.~.`.(.(.^.^.(._._._.'.",
+") ) ) P ) I ) P L ( P I ( P P P J J Y P H H J U H H G H H F H H H H H D Z H Z H D Z D D A D D A Z D D D A D D D D D H S Z H L Z D H Z Z Z H F Z Z D Z [ gXaXaX{ ' n : : : = ; e r r r r r r r r r r r r r r e q : y r r r r r : r * y r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r : * r r r r r r r r r q r r r r r r r r r e r r r r r r r r e r r r r r r r r r r r r r r r r r r r 0 e r r r r r r r r r r y y u y t * 0 T u.u.u.u.u.i.u.u.u.i.i.a.i.a.i.a.a.a.f.f.f.f.a.f.g.g.g.g.h.l.h.A.A.h.A.A.A.A.A.H.S.S.A.A.A.A.A.A.A.h.l.h.l.l.l.h.h.h.l.l.h.g.d.z.g.k.f.z.a.g.a.k.g.z.f.f.g.g.g.g.z.a.g.k.g.g.g.g.g.a.f.f.a.g.z.a.a.a.a.a.g.g.f.a.g.a.i.g.k.k.a.z.g.a.a.z.a.z.g.f.j.g.g.g.g.f.f.f.k.g.k.h.h.h.g.j.A.h.A.A.A.A.A.l.G.A.A.H.H.A.H.H.H.H.H.H.H.L.H.H.A.K.D.U.S.S.L.F.H.Z.H.H.H.H.H.S.A.A.S.A.A.A.A.h.h.h.h.h.h.h.h.h.h.h.g.k.g.g.g.k.f.f.f.g.j.g.g.g.g.g.g.g.h.f.f.f.k.f.i.f.f.i.d.g.d.d.a.z.a.a.i.i.k.i.i.k.i.i.a.a.a.a.a.i.i.u.u.u.i.u.u.u.u.u.u.i.i.a.a.a.a.a.a.a.a.a.i.i.i.k.d.d.f.f.k.k.h.h.h.h.h.h.A.A.A.A.A.A.S.S.S.H.H.H.~ ^ ! BXVXAXZXFXFXFXFXFXFXFXFXFXGXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXAXDXFXFXFXFXDXDXDXAXDXSXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXAXHXQ.[ ~ ! ` `.{.(.(././.~.T.[.~.~.T.~.T.T.T.~.T.[.T.~.T.T.~.(.~.~./.~./.~././././.(.(.(.(.`.^.(.^.`.(._.(.(.(.(.(.(.(.[.E.~././.~.~.~.T.T.T.T.T.T.T.T.U.L.L.L.L.H.L.L.S.L.H.D.S.H.D.D.IXGXIXPXSXIXSXGXGXAXAXGXGXGXGXGXSXAXGXAXFXGXDXSXGXSXSXGXGXSXAXGXSXGXFXSXAXBXhXm.c.G.H.h.k.g.j.i.z.f.i.i.z.k.f.f.f.k.f.f.f.f.f.f.f.g.f.f.f.f.f.z.k.f.g.a.g.z.g.g.g.h.h.A.A.A.A.l.A.h.A.A.A.A.A.g.A.A.S.A.S.g.G.G.A.A.G.A.A.G.S.S.G.S.G.H.H.G.G.D.S.L.S.H.L.L.L.L.I.T.T.~.T.~.T.~.~.T.~.T./.T./.XXU.U.E.T./.~.~.T.~.~.~.T.T.~.~.~.~.~.[.T././.^./././././.(./.(.(.(.`.{.^.(.(.(.[.!.(.(.(.(.(.(.(.(.^.(.~.^.(.(._._._._.",
+") ) ) S I I I I ) P ) P P P P P P H J H P H H D D H H H H H D H H Z L Z D D D Z Z D Z Z H D D D Z D D A Z D D Z Z H Z H L Z H Z Z H D H H Z Z H D Z _ gXaXgXM.{ u y r r r r r r : 0 r r r r e r e r r r r r r r r r r r r r r r r r r r r r * r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r > t : : : y w.u.u.u.u.s.a.u.t.i.i.i.i.a.a.a.a.z.f.f.f.a.g.j.g.g.z.l.h.h.A.h.A.D.A.A.h.A.D.h.z.D.A.A.A.A.A.h.h.h.h.h.l.h.h.h.h.A.l.l.l.k.g.f.d.k.a.z.f.k.f.a.g.a.f.a.f.f.a.g.z.g.g.g.g.g.a.g.j.f.f.f.g.a.a.f.a.a.a.f.a.a.f.z.g.g.k.g.a.k.f.f.f.g.f.f.f.f.f.g.g.g.g.k.h.z.h.k.l.l.h.h.l.h.g.G.g.A.h.A.h.G.H.A.H.A.S.S.H.H.S.H.H.H.L.H.L.L.G.Y.H.I.H.H.L.H.H.L.H.H.H.H.G.H.H.A.A.H.S.A.A.h.j.A.A.h.h.h.h.l.h.l.h.h.h.h.k.h.g.g.f.k.g.g.f.f.g.g.g.g.g.g.g.g.z.a.f.f.k.a.f.f.a.g.z.a.a.a.a.a.i.k.i.z.k.i.a.z.a.a.a.a.i.i.i.i.i.u.i.u.u.u.u.i.a.u.i.a.f.a.i.i.a.a.a.a.i.z.i.i.k.k.k.k.k.g.k.h.h.h.h.h.A.h.A.A.G.S.A.G.H.H.H.H.! ! ! ZXVXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXAXFXFXFXFXFXFXAXDXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXDXBXm.} S ! ` ^.{.(./.^./././.T.~.T.~.~.T.T.~.~.T.T.T.~.T.~.T.T.E.!.^.~.^./././././.(.(.(.^.`.^.`.(.(._.(.`.(.^.(.(./.(./.~.(.~./.T.T.~.T.T.~.T.T.P.P.L.U.L.L.L.L.S.L.H.H.G.H.S.H.L.H.A.IXGXIXGXDXAXDXFXAXDXFXAXSXAXAXSXAXAXAXFXDXDXDXDXDXDXDXFXFXZXFXDXAXDXGXSXBXhXpXM.8.h.h.g.k.f.i.z.i.a.a.i.k.i.k.k.a.f.f.f.f.f.f.d.k.g.f.f.f.f.f.f.f.f.g.z.g.g.g.g.h.g.g.A.z.A.A.A.A.A.A.A.A.A.A.A.H.A.A.S.S.H.G.A.A.A.G.A.A.S.S.S.S.H.S.A.H.H.H.H.H.S.S.S.S.L.L.U.Y.Y.T.Y.T.~.~.~.~.~.T.~.~./.T.~.XXT.~.~.~.T.~.~.T.~.T.~.T.~.T.~.[.~.~.[./././././././././.{.[.(./.(.(.`.^.(.{.(.~.(.(.(.(.(.(.(.(.`.~.(.^.(.(.(.{._._.",
+"I ) P ) P I I I I I ) P P P J P L H J U H H J H H H H H H F H H H Z H L D D D Z D Z F D D D D D D D D D Z D D H H D H D Z H H L Z H H Z Z H H Z Z Z pXaXaXM.[ f u y > y r y r : : y r r r r q r * r r r r r r r r r r r r r e r r r r r r r y : r r r r r r r : r r r r r r r e r r r 0 e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r : 0 r r q r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r t : e : % % m u.u.t.s.u.u.i.i.u.s.i.a.a.i.a.a.a.f.f.f.f.f.a.g.g.g.g.z.l.h.z.A.h.h.A.h.A.A.h.A.A.h.A.A.z.h.A.h.h.k.h.h.h.h.h.h.h.k.k.k.k.g.z.f.f.g.a.f.a.f.f.a.g.z.a.g.a.g.a.a.f.k.z.a.a.k.z.s.f.g.f.f.a.f.g.a.k.k.a.a.a.a.a.i.k.g.k.k.g.f.f.f.f.a.z.f.f.g.a.g.g.h.k.k.h.h.h.l.l.l.h.l.l.A.j.G.g.A.A.A.A.A.A.Z.A.S.H.A.H.H.H.S.U.H.H.H.H.G.L.H.H.Z.L.H.L.L.H.L.S.L.H.G.H.F.S.H.S.A.A.H.A.A.A.S.A.h.A.z.S.h.A.A.h.h.h.h.g.k.g.g.g.f.g.g.g.g.k.f.g.g.g.g.g.h.f.z.f.g.g.f.f.f.a.i.f.k.k.a.k.i.z.i.i.i.f.i.i.a.a.i.a.a.i.i.u.i.u.u.i.u.i.u.a.u.i.i.i.i.i.k.k.a.a.a.a.i.i.k.i.f.f.f.k.g.g.z.h.g.j.S.h.A.A.A.A.A.S.G.H.H.H.H.H./ ! ! ZXAXFXAXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXDXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXSXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXCXHXQ.[ ! ! ` {.(.(.(././././.~.~.~.T.~.~.~.T.T.T.~.~.T.[.T.~.XXT.~.~.~.~./././.!.(.(.(.(.(.(.(.(.^.|._.(.^.(.(.(.(.(./.^.(./.!./.~.~.T.~.T.T.T.T.P.P.L.L.L.L.L.H.H.L.L.H.G.D.S.S.H.H.x.PXGXGXGXDXDXDXFXVXAXDXZXZXAXAXAXDXFXFXDXDXSXZXDXDXSXZXFXFXDXFXAXAXAXAXCXHXhXM.{ c h.h.g.f.f.d.i.a.a.a.i.f.i.i.f.f.f.f.f.f.f.d.f.f.f.g.k.f.k.f.g.f.g.g.h.l.g.h.h.A.A.A.h.A.A.h.A.A.A.A.A.A.h.A.A.A.A.S.A.S.A.h.H.l.S.S.G.G.S.D.S.G.S.H.H.H.H.H.H.H.D.L.L.S.L.L.U.U.U.T.~.T.T.T.~.Y.T.~.T.~.T.~.~.T.~.~.~.T.~.~.~.~.~.~.~.~.T.~.~.~.~.[././././././.(.^.(./.^.(.(.(.(.(.(.^.(.(.^.`.(./.(.^.(.(.(.^.^.[.(.(.(.(.(.(.(.(.",
+") L I P ) P I I I I ) P P P J P P L J L H H H H H H H H H H H H H Z J Z D D Z Z A D D D H Z Z D D D D Z D D H D F L Z J L Z H Z L Z H H D H Z H P [ gXaXpX{ ' J y y ; r : : : : : r r r : r r r t y r r r r r r r r r r r r r r r r r r r e * y r r r r r r e 0 r r e r r r 0 e r r r r r r r * r r r r r r r r r r r r e 0 r r r r r r r r r r r r r r : * r r r r r r r r r r r r r r r r r r r r r r r r r e r r 0 r r r r r ; r r ; r r r r : e r : ; % * T t.t.u.s.p.u.i.u.s.i.s.a.a.a.f.a.i.j.a.g.f.f.g.g.h.z.h.l.l.l.A.h.S.h.A.g.S.g.A.h.A.A.h.A.h.h.h.h.l.z.h.h.h.k.h.h.f.k.z.z.f.k.f.d.f.a.f.f.f.g.g.a.g.a.g.d.a.g.f.z.k.g.g.a.z.a.g.f.f.i.z.i.g.a.a.a.a.a.f.a.k.g.i.a.f.f.f.k.f.f.f.k.f.f.f.k.a.g.g.g.g.g.h.g.h.h.h.h.k.h.h.S.g.A.A.A.A.S.A.A.A.H.H.H.S.H.H.H.H.H.U.H.H.L.L.U.I.H.R.H.S.L.F.S.H.H.L.H.L.G.L.G.S.G.S.H.S.A.A.A.A.h.A.A.H.A.l.A.A.z.z.A.S.A.h.h.k.k.k.h.g.g.g.g.g.g.g.f.z.g.g.k.g.a.g.a.k.g.a.g.f.f.f.f.a.z.a.k.a.a.k.i.i.z.i.a.a.a.i.a.i.i.i.u.i.u.u.u.u.i.i.u.u.i.i.i.f.i.a.a.f.i.i.k.d.a.a.k.f.f.g.g.z.d.k.h.A.h.A.A.A.A.G.A.H.A.H.G.H.H.H.H.~ ! ~ ZXAXAXAXFXFXFXFXDXFXFXFXFXAXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXGXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXAXDXAXFXAXZXZXBXm.} ^ ! [ (.(.(.(.(././.!././.~.T.~.T.~.T.T.T.~.~.~.~.~.~.~.~.!.^././././.(././.(.(.(.^.(.(.|.(._.{.^.^.^.(.(.(././.(././.~.~.~.T.~.T.T.~.T.U.U.P.U.L.L.L.L.L.S.L.H.H.H.H.F.G.S.S.H.IXIXGXGXDXAXAXAXDXAXDXDXDXAXDXFXFXFXFXAXDXFXFXDXDXDXAXFXFXFXFXDXZXZXFXAXHXhXM.{ c h.k.a.g.i.a.i.i.a.a.f.i.k.i.i.z.a.f.f.f.f.f.f.f.k.f.f.g.g.g.g.g.g.f.h.h.g.g.h.h.A.g.A.A.A.A.A.A.l.A.A.A.A.A.A.J.S.A.H.A.A.S.A.A.S.A.S.S.A.S.S.H.S.S.D.G.G.H.H.H.H.H.S.L.L.L.L.U.U.T.Y.T.T.~.~.T.^.T.~.~.U.E.T.T.~.T.~.T.XXU.E.XX~.T.~.T.[.T.~.[.~.~./.~././.(.(.(.(.(.(.(.[.[.(.(.(.{.(.(.^.(.(.(.(.[.(.[.`.^.(.[._.(.(.(.(.(._.(._.",
+"I ) I P P I I I ) L P P P P P J L L J L J H P D H H H H H Z H F H Z Z H D D D D D Z D A D H D D D D Z Z D D D Z Z Z H H J Z H H H H Z H H H H H ^ pXpXaX{ { u > ; ; r ; * y * e r r r r : y r r r * r r r r r r r r 0 e r r r r r r r r r r t 0 r r r r r r r r r r 0 r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r 0 e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r 0 r 0 r r r r r e y r 0 ; % % q p.t.t.t.u.u.i.i.u.i.i.a.a.a.a.f.a.a.f.h.k.z.g.k.g.g.h.l.G.l.A.h.A.h.A.A.h.h.h.A.g.A.h.h.l.h.h.h.l.z.h.k.g.g.k.k.k.f.k.f.f.k.i.k.a.k.a.a.a.a.a.a.a.g.a.g.z.d.f.f.g.g.g.g.a.g.a.g.a.g.i.z.a.a.f.a.f.a.a.a.i.k.i.k.f.f.f.k.f.i.f.d.f.f.k.f.l.g.g.g.g.h.h.h.h.h.l.h.l.A.g.G.A.g.A.A.A.A.H.A.S.h.A.S.H.S.H.S.H.H.S.H.L.L.S.S.H.L.K.H.U.S.H.L.H.L.H.L.G.L.S.H.H.S.G.S.A.H.H.A.H.h.h.A.A.A.G.l.A.A.A.A.A.z.h.A.D.h.z.z.h.h.g.k.g.g.h.z.z.z.k.g.g.g.z.k.a.k.a.k.f.f.f.f.a.a.a.k.k.k.i.f.k.i.z.i.a.a.a.i.i.i.u.i.u.i.i.u.u.u.u.u.u.i.a.a.i.k.k.i.i.k.i.i.a.k.i.f.f.f.f.k.z.l.g.h.h.A.A.A.A.A.z.H.S.H.H.H.G.H.L.L.S / / BXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXDXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXHXHXQ.[ ! ~ ` (.(.(././././././.T./.~.T.~.T.~.~.T.~.T.~.~.~.~.^.~.~.~.!././././.(.(.(.(.`.`.(./.(.(.{.{.(.{.(./.(.(.(.(./././.^.(.~.~.~.T.T.T.T.T.U.U.U.H.L.S.L.L.L.S.H.H.H.H.H.G.G.S.S.GXGXIXGXGXDXAXAXAXDXAXDXAXAXAXFXFXFXFXDXAXDXFXDXAXFXFXFXFXFXFXFXVXFXVXHXBXaXM.n c g.j.g.i.s.a.i.f.a.a.i.z.k.k.k.a.j.f.f.a.f.f.f.k.k.g.g.f.g.g.g.g.k.h.h.h.h.G.h.A.h.A.A.A.g.A.A.A.A.A.G.A.A.A.A.A.S.S.G.A.S.S.D.F.S.S.S.G.H.S.G.H.H.H.H.D.L.H.S.H.H.L.L.L.U.L.I.I.U.U.I.T.T.T.T.T.T./.~.~.XXXX~.XX~.T.~.~.~.~.T.T.~.T.T.[.~.~.~.~.~.~.~./.~././.(.(.(.(.(.(.(.(.(.(./.[.^.{.].(.(.(.^.~.(.(.(.^.`.(.(.(.(.(.(.[.(.(.(.",
+"I I I I ) I I P L P P P P P P J J J J H J H H H F H H H H H H H H H H D D D D Z Z D Z D F D D D F D D D Z D D D L Z Z H L H H H H H H H H D H D { hXaXM.{ Q u > e r r r * t r r r r r 0 : 0 r r r r r r r r r r r r r r r r r r q e r r * r r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r e r r r r r r e 0 r r r : r r r r r r e r r r : r r r r r r r r r r r r r 0 r r r * > r * * * % % T R t.r.i.p.u.i.i.i.a.i.a.a.a.a.i.g.a.f.k.g.g.h.l.l.h.h.g.A.h.A.A.S.j.h.h.h.h.z.h.h.h.h.h.z.h.h.z.h.k.h.f.g.k.g.f.f.f.f.z.i.f.f.a.a.a.f.a.f.g.g.i.d.f.f.g.a.f.g.d.k.k.z.z.a.d.a.g.f.i.i.g.g.a.f.a.a.a.a.k.i.a.d.d.f.k.i.k.i.f.f.a.f.a.z.g.g.g.g.g.g.h.h.l.l.h.h.l.z.h.g.h.A.A.S.A.A.A.A.S.H.H.H.H.S.H.H.H.H.S.S.D.U.U.L.K.L.J.S.H.L.L.F.K.S.H.H.H.H.H.H.A.H.H.G.H.A.A.A.A.A.J.A.G.S.S.G.H.A.S.A.A.A.D.A.A.h.S.g.h.h.h.g.h.g.g.h.h.l.z.g.g.z.k.k.k.g.z.k.f.f.z.a.k.k.d.d.k.d.f.f.k.i.k.f.a.a.a.a.i.a.i.u.u.u.u.u.i.u.u.i.u.i.a.i.a.a.i.k.a.k.f.k.i.k.k.k.f.g.f.g.g.k.g.h.A.Z.g.A.A.G.h.S.G.H.H.A.A.L.H.H.! ! ! ZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXDXFXFXFXDXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXGXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXDXAXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXVXBXm.} S Q [ (.(.[././.~././.~.~.~.~.~.T.~.~.~.~.T.~.~.~.~.~./.~./.~.(.!.~.(.(./.(.(.^.(.(.(.(.{.(.(.^.(.{.(.^.^.(.(.(./.^./././.~.~.~.~.T.T.T.P.P.P.U.L.L.L.L.S.L.S.H.H.G.L.L.S.G.S.D.GXIXGXGXDXGXAXAXAXAXDXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXGXZXFXVXVXCXaXM.{ c j.g.i.f.i.a.i.a.a.a.i.i.z.a.a.k.k.a.f.f.i.k.k.f.g.g.g.g.k.g.g.k.h.h.h.h.h.A.h.A.g.A.A.S.S.h.A.G.S.z.A.A.W.A.S.S.S.H.A.S.S.S.S.S.S.S.G.D.G.S.H.H.H.H.G.H.P.D.L.G.L.L.L.L.L.L.U.L.I.U.T.T.T.T.T.^.T.[.[.~.~.~.~.~.~.~.T.~.~.T.T.T.(.~.~.~.~.T.~.~.~.~.~./.~././.(.(./.(.(.(.^.(./.(././.(.{.(.(.(.^.{.`.(.{.(.(.(.[._.`.(.[.(._.(.{.(.",
+"I ) I I P ( P I P P P P P P J L H J J H H H H H H H H H H F H H Z H H Z H D D D D D F D D Z D D Z D D D D D F D Z L L S H Z H H H H H H H H H H pXpXm.{ ' u : : * r r = y 0 r e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r q r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r r q r r r r r r r r r r : r r ; 0 ; r r r r r r 0 > r * : % & m d.u.r.u.p.a.r.u.u.i.i.i.i.a.f.g.a.g.f.k.g.g.g.h.a.h.l.h.h.D.z.h.h.h.h.k.h.z.h.g.h.h.g.h.h.h.z.z.f.g.k.f.f.g.z.i.f.f.k.k.k.i.i.f.a.a.a.a.a.a.i.z.g.a.z.z.a.f.a.k.d.k.a.g.g.z.g.f.f.g.i.a.a.a.a.a.a.z.a.a.a.a.i.d.i.d.k.d.k.d.f.f.f.f.g.g.z.g.g.h.g.h.h.l.l.l.h.A.A.A.A.A.A.A.A.A.G.A.J.H.A.A.H.H.A.H.H.D.Z.K.L.H.K.H.H.S.U.S.P.L.H.S.L.S.L.L.L.H.H.H.H.K.S.H.A.A.H.H.A.A.A.h.A.A.A.S.S.G.H.S.S.A.S.A.A.A.A.h.A.h.h.h.h.g.h.h.g.h.h.g.g.k.g.k.k.g.g.g.g.g.j.f.g.k.d.k.k.k.a.f.f.i.k.i.k.a.a.a.i.i.i.i.s.i.u.i.i.u.i.i.u.i.i.a.a.i.i.k.f.i.i.i.k.i.i.z.i.f.f.f.f.g.f.g.h.h.A.A.h.G.A.S.S.S.G.H.H.G.D.H.H.! ! ! ZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXAXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXSXGXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXDXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXZXBXm.[ Q ! _ (.^./././.(.~.~.~.~.~.~.~.~.~.T.T.~.~.T.T.!.~.~.~./.~./././.^.(./.(.(.(.(.(.(.(.(.(.(.(.(.(.(.[.(.~.(.(./.(././././.~.~.T.T.T.T.T.P.P.L.P.L.L.L.L.L.L.L.H.H.D.G.S.H.G.D.S.GXPXSXGXGXDXAXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXVXVXVXHXhXM.c c d.s.s.i.a.a.i.a.a.a.i.k.i.i.z.s.i.a.f.d.k.f.f.k.f.g.f.z.g.g.h.h.h.h.h.h.h.h.A.A.A.A.A.A.H.A.A.A.G.D.A.G.g.G.S.S.H.A.H.H.H.S.S.S.l.H.S.G.G.G.H.G.H.H.H.H.U.A.G.L.L.L.U.U.U.L.U.I.I.I.Y.T.T.T.T.T.~.~.T.[.~.~.~.~.~.~.~.T.T.~.(.~.T.~.~.~.~.~.~.~.~.(.~.~.~./.(././.(.(.(.(.^./.(.(./.[.(.^.^.(.(./.(.^.(.^.(.{.^._.(.^.(.`.(.(.(.^.(.",
+"I I I I I I I I L P J J P P H P H H L H P H H Z H H F H H H H F H Z L H Z H D F D Z D A Z D D D H S J Z D H Z H Z D H Z H H H H H L Z P H G Z ' pXpXM.{ S y r r r r r r r r t r r r r * t 0 r r : r : t 0 r e > * > e e y 0 e > * y r 0 r r * r : r ; r r : 0 r : e ; ; ; y r ; r r 0 r r : : 0 ; q e * 0 y 0 : y : : y 0 0 : > q r : : r 0 : : : ; y ; e > ; ; ; e q * = > e * r 0 r r r y 0 r e r : y : : t * r r r r e r r r r r r r r r 0 r e 0 r r 0 * % % % E w.t.s.u.i.t.i.u.a.a.a.i.a.a.d.z.a.k.k.k.f.l.a.x.z.l.h.h.h.h.h.h.h.h.k.h.k.h.g.g.g.g.k.h.g.g.k.g.g.g.z.a.g.a.g.a.a.g.a.z.a.a.a.d.a.a.a.a.k.a.a.k.a.k.i.k.g.g.f.k.k.k.k.z.k.d.d.z.a.x.z.a.z.a.a.a.i.i.a.i.a.a.i.k.k.a.z.i.a.z.z.k.k.z.k.z.h.f.l.h.h.l.l.l.h.A.A.A.A.h.A.h.H.A.A.S.S.S.H.G.H.G.H.H.H.H.L.S.U.L.S.L.L.L.L.F.L.L.K.H.H.H.H.H.G.H.L.H.G.H.H.H.S.H.H.H.H.A.H.A.H.A.A.S.S.A.S.S.D.S.S.S.S.l.A.S.A.A.A.h.h.h.h.h.h.h.l.h.h.h.z.k.h.j.f.j.f.g.j.f.f.f.f.f.f.z.g.a.a.g.f.k.z.i.d.i.i.s.a.i.a.i.i.i.u.i.i.u.i.i.i.a.i.a.k.i.a.a.a.z.i.z.d.k.k.k.f.k.k.g.g.g.g.h.g.A.A.A.H.D.A.D.S.S.H.D.G.S.H.S./ / ! ZXZXZXFXGXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXAXDXAXFXFXFXFXFXFXFXVXFXFXZXZXCXpX[ ! S ` (.(./././././.~.~.!.~././.~.~.~.~.T.~.~.~.T.~.~././././././.(.^.(.(.(.(.(.(.(.(.(.(.(.(.(.^.(.[.(.(.!.(.(.(./.[.(.~.~.T.~.T.T.U.U.U.P.L.L.P.L.A.L.L.D.L.D.H.H.G.D.G.H.H.z.PXIXGXGXFXFXFXAXAXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBXhXM.{ c a.i.i.i.i.f.i.k.k.i.k.d.d.f.d.k.k.f.k.d.k.k.j.C > * : e.h.h.z.e.* r r Z j.Z.h.S.z.y ; r 0 ; U S.A.G.z.F.Z r 0 e 0 0 r * > A e.F.A.H.S ; * t 0 y 0 e S [ L.S.L.L.U.U.L.U.L.P.P.L.U.P.U.T.T.T.T.T.~.T.~.T.~.[.[.T.~.~.T.[.~.T.~.~.~.~.[.T.~.~.~.~.XXXX~.!./.E.[.^./.(.(.`.^.(./.(././.[./.(.(.(./.(.(.(._.(.(.(.(.(.^.!._.[._.(.(.|.[.",
+"I I I P P I P P P J I I J J J H H H L L H H H H H H H H H H H H H H Z Z Z Z Z D D Z Z H H Z D D H Z Z Z S Z Z Z Z Z H H F H H Z Z L H L H L Z M.pXpX{ ' u y : : r r r r r r r : r r r e : y r r r r : * r r * e r e e > = r 0 r y * r e r r r r > r y ; r r r : q : y q = q * y * ; r ; : e * e e ; ; e ; ; : e r : * r 0 : 0 > : e ' { ' ! > : y : y e : : e : ; e ; * e ; r e r r r * y ; ; ; r r : * y y 0 * r r r r 0 r r r r r r r r r r r r r ; r ; ; % % $ m w.s.u.u.t.u.u.u.u.i.i.a.a.f.a.i.z.f.f.k.k.k.g.h.j.k.h.h.f.h.l.h.k.z.h.f.h.k.h.g.g.f.k.f.j.g.k.g.f.g.g.a.a.z.a.a.a.a.a.a.a.a.a.d.k.a.a.k.a.a.a.a.k.i.a.g.a.a.i.a.d.k.a.a.k.k.z.d.a.d.a.a.k.a.s.z.z.a.a.z.a.a.i.k.i.i.z.a.a.k.a.k.k.k.k.z.h.h.l.l.l.l.l.A.A.z.A.A.A.A.A.A.A.A.G.S.S.A.G.S.G.G.H.H.H.H.Z.L.S.L.L.L.L.S.S.L.L.S.H.H.H.H.K.H.G.K.G.H.H.H.D.H.H.S.A.G.A.H.H.G.A.A.S.S.S.S.G.G.G.H.S.S.S.S.S.z.A.A.g.A.l.A.h.h.h.h.S.l.h.h.z.k.g.g.h.g.k.k.h.k.g.g.g.g.g.f.g.g.z.a.f.k.i.i.i.k.i.f.a.a.i.i.i.u.i.u.s.i.a.i.i.i.a.a.a.a.z.a.a.a.z.i.k.k.k.k.f.h.z.g.g.g.g.g.A.A.A.A.S.G.D.D.S.D.L.H.H.G.H.L.S ! ! ZXFXZXZXFXZXFXFXZXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXAXGXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXDXDXAXDXFXDXFXFXFXFXFXFXFXZXZXZXBXQ.} S / [ (.(././././.~./.~.~.T.~.T././.T.~./.T.~.~.T.T.~./.~././.(.(.E.{.!.(.(.(.(.(.(.(.(.(.{.{.(.(.(.{.[.(.(././.(.^./.(.T.~.~.~.T.T.T.T.U.L.L.L.L.L.L.L.S.L.G.H.H.D.G.Z.G.H.G.x.GXGXGXGXGXHXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBXaXM.n c j.p.i.a.i.i.i.a.i.i.d.k.i.f.k.k.i.f.f.k.d.d.j.C : : : e.g.k.l.T r * r Z h.A.h.A.e.r ; * e y q A.G.F.G.A.S = r r y > r : : y q e.H.A.Z = r e > = ; y q q D S.U.H.L.L.L.L.L.P.P.L.U.U.P.P.T.T.T.~.T.~.~.~.~.[.~.~.~.~.~.T.~.~.T.T.~.[.[.~.~.T.~.~.XXU.~./.~.(.^.(.(.(.(.^.`.(.[.(.(.(././././.(.(.(.(._.[.(.`.(.(.(.|._.(.(.(.(.^.(.^.",
+") P P ) K ) P I P P J J J H H J H L J H H U H H H H L H H F H Z H H Z H H H D D Z Z D Z A Z Z L Z L Z Z H H H Z D D H H H H H H H U L H Z H Z m.pX{ { Q y ; e : r r r r r r r r r r r r r r r r = r e * r 0 r [ LXLXLXgXe ; r : : t : ; : r : : y r = y t : r e e * 0 > ; ; : * ; ; y ; : 0 : ; * ; LXLXLXpX0 e 0 : : t : : * t pXPXLXLXLXLXPXpXy t : ' LXLXLX] : = e - M.gXr 0 r ; : e ; r e y 0 r 0 r * y r : r r r r r r r r e r r r 0 r r r r r r r r ; % % $ = u.u.t.i.t.u.u.u.u.i.a.i.a.a.a.g.f.k.k.f.f.f.j.f.j.f.f.h.z.h.z.g.f.f.f.k.z.k.f.j.z.h.j.k.g.g.f.g.z.f.a.g.k.i.g.a.a.a.g.a.a.a.a.a.a.a.a.a.a.a.i.z.i.k.i.k.f.k.i.k.a.a.k.a.a.d.a.a.a.a.a.a.a.a.a.z.s.a.a.i.a.a.i.i.f.i.i.a.k.k.k.k.k.k.k.h.h.h.h.h.h.A.A.A.A.A.A.A.A.S.H.H.S.S.S.H.H.H.H.H.L.G.D.H.U.S.S.L.H.L.S.L.S.L.D.U.D.H.U.S.H.H.H.H.K.H.L.H.H.H.H.H.H.H.H.H.A.H.A.H.H.H.H.H.H.H.H.G.H.G.G.H.G.D.H.A.l.A.A.A.A.h.h.h.h.z.h.l.l.h.g.z.z.h.h.j.h.a.k.g.f.g.g.g.z.j.k.k.z.k.f.i.f.i.a.a.i.i.a.a.a.s.i.i.i.u.i.i.i.i.a.a.a.a.z.i.a.a.z.i.k.k.f.f.k.k.k.k.h.k.g.g.h.A.A.A.l.A.A.S.A.L.S.P.H.H.H.H.H.H.S / / CXVXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXDXDXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXDXDXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXAXFXFXFXFXFXFXFXZXZXFXBXm.[ Q ! _ (.(.(./././.^.E.~.~.~.~./.T.~.T.~.T.T./.~.~.~.~././.~././.~.~.(.(.(.(.(.`.(.(.(.[.(.|.^.(.(.(.).(.[.`.(.(./././.^./.~.~.T.T.T.U.U.U.U.P.L.U.L.L.L.H.L.D.H.H.H.L.S.U.D.D.D.PXSXGXPXCXFXVXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXJXhXM.c c s.s.i.i.k.i.k.a.k.a.f.i.f.f.i.k.f.f.f.g.d.z.j.C t = e T g.z.z.e.y r : Z g.A.l.g.U r y ; : : r T H.L.G.h.Z r e : q = q q : r 0 A K.H.Z r e : q q y : ; ; q b.S.L.L.L.L.U.P.L.P.L.L.U.P.P.T.T.T.T.T.~.~.T.T.T.~.~.~.[.~.T.~.T.~.~.~.~.T.~.[.~.(.T.E./.T././.(./.(.(.^.(.(.(.(.(.(./.(./././.(.(.(.(.(./.^.(.!.(.`.(.(.(.[._.[.(.[.{.(.",
+"I I P P I P J P I H J J I H L J L H H H Z H H H H H H H H H H H H H H Z Z Z D D Z D F D D Z Z F H Z Z Z L Z Z H D D D H H H H D D D L H H H ~ pXM.M.' u y y e > r r r r r r r r r r r r r r r r y r : : r 0 0 { LXLXPXIX; ; : * > * = t : ; ; ; 0 0 r y * y 0 e : e 0 * e ; e e = y e r 0 y = > r e LXLXLXpX= * * r : : : : n IXLXLXLXLXLXLXLXLXgX% : { LXLXLX{ * y ' IXLXBX; 0 0 0 > : * r ; ; r r 0 : * * r : r r r r r r r r 0 r r r e r r r 0 ; * r r ; ; % % $ T t.t.u.u.u.u.u.u.t.u.i.i.a.a.i.a.k.a.a.a.g.g.a.f.z.j.f.h.a.k.k.g.h.f.k.f.f.h.f.a.f.f.h.g.f.g.g.g.f.k.i.g.i.a.a.a.g.a.a.a.a.a.a.i.a.a.a.a.a.i.d.i.i.k.i.i.k.k.i.a.k.a.a.a.k.a.a.a.a.z.d.a.a.a.f.a.z.a.f.a.a.f.i.i.a.a.k.k.a.f.k.k.k.h.g.k.D.A.h.A.A.A.A.A.G.G.A.G.G.A.H.S.H.H.S.H.H.H.H.H.H.H.H.H.H.S.L.L.L.L.L.L.L.U.H.Z.U.H.H.H.D.S.H.H.H.G.H.L.H.H.H.H.H.H.S.H.H.H.H.D.G.H.H.S.H.S.H.H.H.G.H.G.D.A.H.G.A.A.A.A.A.S.z.l.S.l.l.l.z.h.g.z.h.h.z.h.h.h.k.h.k.g.g.h.a.j.k.a.k.k.z.z.i.f.k.f.f.a.a.a.a.a.a.a.a.i.i.i.a.i.i.i.z.i.i.z.z.i.z.d.k.f.f.k.f.k.l.d.h.h.h.g.A.A.h.S.A.S.G.S.D.D.A.H.D.H.L.S.H.! ! ! CXZXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXDXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXAXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXDXZXVXBXm.} S ! [ (.(.(././.^.^././././././././.T.T.~.T.T.~.T.T.(./.~././.(.(.(.{.(.(.(.(.(.].(.(.(.(.(.(.(._.^./.(.!.^.(./.(././.~./.~.T.~.T.T.T.U.U.L.L.L.L.L.L.L.S.L.L.D.H.H.H.H.S.D.D.z.DXPXGXGXSXFXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXaXpX{ c a.s.a.i.i.i.a.f.i.f.z.k.d.f.f.f.f.k.k.z.f.k.j.C : r y T Z.h.G.T q r : A A.A.l.Z.A r : A = r r U S.S.S.S.A > ; ; b.F.F.e.: e 0 > H.L.Z : ; ; [ Y.Z.G ; y ; Z U.G.L.L.L.L.L.P.P.L.U.U.P.T.T.P.T.T.T.T.T.~.~.T.~.~.~.~.~.~.~.~.~.~.~./././.T./.~.~.~.T././././.^.^.(.`.`.^.(.(.[.(.(.(.(.(././.~.(.^./.(./.(.(.(.^.^.`.(._.(.(.(.(.^.{.",
+"I I I J P P P P J P P L J L H H H K H L H H H H H H H P H H H H H H H H D D D D D A A D Z D F D Z H Z Z Z Z S Z D D H H H H H H H L L L Y P ' m.M.{ / u e r r r r r r r r r r r r r e r r r r e r 0 : * e y e ' LXLXLXIX* > % * 0 r ; t y : ; ; e ; ; > * q * y = ; r e y * * = y ; : = * t * * > ; LXLXLXpX; % r ; t * e e IXLXLXLXPXIXIXPXLXLXLXpX$ u pXpXpXu - > gXLXLXUX> % * * : t : : e > : ; ; ; y : 0 : r r r r : r r r r r r r r r r r r ; = ; r ; % % $ o G r.t.u.u.u.u.u.u.s.i.i.s.i.a.i.a.a.a.a.f.a.f.f.f.f.g.f.f.z.a.g.f.z.k.k.k.z.f.f.z.f.f.h.f.g.k.k.g.f.f.i.d.k.a.a.g.a.a.a.a.a.a.a.d.a.a.a.a.a.a.a.a.a.a.z.z.i.i.i.i.a.a.d.a.a.a.d.a.x.a.a.z.z.z.i.i.z.z.a.a.a.a.k.i.i.f.i.f.f.g.k.k.k.h.h.A.h.A.A.A.A.S.A.S.S.A.A.H.H.G.H.S.S.H.H.S.H.H.H.H.G.H.H.L.G.L.H.L.L.L.L.L.L.S.H.H.U.L.Z.P.L.L.S.L.S.L.G.H.G.L.G.L.H.H.H.H.H.G.H.H.G.S.H.S.S.H.H.H.G.H.H.H.S.H.S.S.A.A.z.h.h.h.h.h.z.l.h.l.h.h.h.z.h.h.h.h.h.g.g.z.h.g.g.g.g.g.k.k.g.f.f.f.f.k.f.i.i.a.a.a.a.a.a.a.a.a.i.a.a.a.a.k.a.i.a.a.a.i.k.i.f.f.k.g.g.g.k.z.h.l.h.l.A.A.S.S.S.S.G.G.D.S.H.S.S.G.H.H.H.S Q ! HXVXFXFXFXFXFXFXFXFXFXFXFXDXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXZXZXAXBXm.{ / ! _ (.(.(.(./.(.(.(.!.~.).~././.T.T.T.~.T./.~.~.~././.~./.{./.(.(.(.(.(.(.(.(.{.^.(._.^._.^.(.|./.|.(.(.(./.(.(./././.~.!.~./.T.T.U.P.L.L.L.L.P.L.L.H.L.S.S.H.H.D.L.U.H.G.S.D.IXIXIXGXVXZXAXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXVXBXhXM.8.n s.s.i.a.a.a.d.i.k.f.k.f.f.f.d.k.k.f.a.j.k.k.a.C * ; r U T U T Z 0 y ; Z g.A.A.e.y r q U J r e q Z.G.G.G.C : 0 q e.U.S.h.y * r y U.H.Z : : y e.L.H.Z.q ; ; 0 F.D.H.U.L.U.U.P.L.L.K.U.P.P.T.T.T.Y.T.~.~.~.~.T.~.~.~.~.~.~.~./.~./.~.~.~.(.~.~.~.T.~.(././././.(.(.(.(._._._.(._.(.(.(.(./.(./././.^./././.(.(.(.[.`.(.(.(.[._.(.(.(.].",
+"I J I I J P P P P L J J L L H L H L H H H H H H H H F G H H H H D H Z H D D D D Z H D D D D D D Z Z Z H H Z H H D D Z H D H H H Z U Z L Z Z { pXM.{ Q : r 0 r r r r r r r r r r r r r r r r r r r r e r = : : { LXLXLXgX- % % * % * ; ; : * ' pXpXpX' t ; > = 0 ; t { hXpXpXM.x ; r ; * = c aXpXm.; LXLXLXpX% % % % : r % { LXLXLXPXf > o n PXLXLXIX% e ' { { > % ' IXLXLXIX' c t { { ' u : : > ' { { ~ ; y r e e 0 r r r r r r r r r r r r : r 0 : y ; r ; ; % $ $ q r.u.t.u.t.u.t.u.u.u.u.i.i.i.i.i.a.i.a.a.a.f.a.f.a.a.g.f.a.f.a.g.a.f.f.f.k.k.f.f.g.j.f.h.f.k.k.f.f.f.k.f.i.a.f.a.a.f.a.a.a.a.a.a.u.i.a.a.d.a.a.a.a.i.i.a.a.d.z.a.a.a.a.a.a.a.a.d.d.a.a.a.a.i.i.z.a.i.f.a.f.i.i.z.k.f.k.f.f.g.g.k.h.h.h.g.D.A.h.h.A.h.A.S.S.S.H.H.G.H.H.H.H.H.H.H.S.H.H.H.L.H.H.H.H.H.L.L.S.F.L.S.H.K.H.F.L.L.L.D.U.F.L.L.L.L.H.H.H.H.H.H.H.L.H.H.L.G.L.H.H.H.H.H.H.H.H.H.H.H.H.H.H.G.S.S.A.G.H.A.A.S.z.H.A.l.A.h.h.h.h.h.h.h.l.h.h.h.h.g.h.g.g.g.g.j.k.j.a.f.f.f.f.i.f.k.i.i.k.k.a.a.a.a.a.a.a.a.a.a.a.a.a.k.f.z.a.z.d.z.f.i.f.g.k.h.k.h.l.A.h.A.A.A.S.S.S.A.G.H.S.S.H.H.S.H.H.A.L.) Q ! ZXVXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXFXVXFXHXQ.[ ~ ! [ _.(.(._.(./.(././.(.~.~./.T.~./.T.~.~.T.~.~.T.~./././.~.(.(.(.{.(.(.].`.(.(.^.(.(.{.^.`.(.|.(.(.(.^.(.(././././.^.~.~.~.T.T.T.U.U.Y.U.L.L.P.P.L.L.L.L.L.L.S.L.H.S.H.H.H.D.GXGXGXGXGXHXZXFXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXBXaXpX{ c a.s.i.a.a.a.f.i.g.f.f.k.k.f.g.f.f.k.z.g.g.g.j.Z y ; 0 y = * : : * : > A h.A.h.Y ; r q b.T * r r T A.G.H.Z : 0 0 U T ) u r : r D L.Y.Z : e = b.L.S.U.A y ; 0 n.G.D.U.L.Y.L.P.L.L.U.U.Y.T.Y.T.T.T.T.T.~.T.T.[.~.~.T.[.~././.~././././.[.T.(.~.(././././.(.^.(.(.(.(._._._._._.(.(.(.(.(.(./.(.(./.^././.(././.(.(.^.(.(.^.(.(.(.(.(.(.",
+") P P I J P P J P H J H L L L Z H H P H H H H H H H H H H H H H H H L H D D D D D D D D D D Z D Z J Z S L D H Z H Z L H H D H H Z J Z L S J [ { { ' c y r r r r r r r r r r r r r r r r 0 r r * 0 ; : y : : w ' LXLXLXIX& % % % * * e : u HXLXLXLXLXLXgXc > r : sXPXLXLXLXLXLXLXaX; ; * M.LXLXLXLXIXLXLXLXpX$ - % % * : ; aXLXLXLXaX% $ $ $ { c - o % c LXLXLX' $ LXLXLXLXLXLXIX% PXLXLXIX% ; ; LXLXLXpXe > * e r r r r r r r r r r r r r r r r r ; ; q e ; ; % $ $ * t.t.u.t.u.t.u.s.u.u.u.i.u.u.i.i.i.i.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.k.k.k.k.f.f.j.j.f.f.a.f.k.k.f.f.k.z.i.k.f.a.a.a.a.a.a.a.a.a.i.i.i.i.i.i.a.a.a.a.k.k.i.a.k.i.a.z.a.i.i.a.i.i.d.i.a.a.a.a.z.i.i.a.z.a.z.s.f.f.k.d.k.f.f.f.g.g.k.h.z.A.A.A.A.H.A.A.S.G.S.G.S.H.H.H.H.H.H.S.H.H.H.H.H.H.H.H.H.U.S.L.L.U.L.L.S.L.L.S.L.H.S.L.S.L.A.L.A.P.S.L.S.H.H.K.L.K.H.S.L.L.L.L.G.G.H.H.L.H.H.H.L.H.S.L.H.H.H.H.S.S.S.A.S.A.A.A.H.A.A.A.G.g.h.l.l.l.h.l.h.l.l.h.h.h.l.l.g.h.k.f.k.k.k.f.f.j.f.f.i.k.f.f.k.k.a.a.a.i.a.a.z.i.s.a.i.z.k.i.z.i.f.i.i.z.f.k.k.f.g.z.h.z.h.h.h.A.A.A.S.S.S.H.G.S.S.H.G.D.S.S.S.S.G.G.! ! ! BXVXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXZXZXZXZXZXBXm.[ ^ Q ` (.(.(.(.(.(.(.(./././.(.~.~.T.~.~.T.~.T.T.~.T././././.(.(.(.(.(.(._.`.(.{.(.(.(.(._.`.^.^.^.|.(.[.|.^.(.(.(././.~.~.~.~.T.T.T.U.P.P.P.P.P.L.L.L.L.L.L.L.H.S.D.U.S.H.H.H.G.IXPXGXGXDXDXFXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXBXaXM.{ c w.s.i.f.a.k.i.k.f.f.k.f.k.k.g.k.k.g.k.g.a.z.j.C ; r : = : : : r 0 e e A g.A.j.u e ; r S.Z.y e 0 L H.S.S.A r r : y : r 0 : y C S.P.D.S r r : b.T.L.U.Z : ; ; b.U.L.L.L.A.S.L.U.L.L.R.U.T.T.Y.T.~.Y.~.~.T.T.~.~.~.[././././.~./.~.~.^.~.~.(.~././././.(.^.(.(.(.(._.(.(._._._.(.(._.(.(.(.(./././././././.(.(.^./._.!.(.(._.(.(.^.(.(.",
+"J P P P J Y K U K L P H H H L L H H H H H H H U L H H L F H F H H L Z Z D D D D D D D D D D D D Z Z H H Z D Z Z L Z H H H H F H S L J Z P J c.{ ' ' u r : : r = r r r r r r r r r r r r r r r r ; y : : r ; & { LXLXLXgX$ $ $ * r : : : IXLXLXLXLXLXLXLXIXe : u LXLXLXLXLXLXLXLXLXc * c LXLXLXLXLXLXLXLXLXM.& , % % ; * ; gXLXLXLXn $ $ $ o o o $ & , n LXLXLXc % LXLXLXLXLXLXgXo sXLXLXLXu ; ' LXLXPXc % ; ; : r r r r r r r r r r r r r r r r r r r ; ; e ; % $ o $ u.t.u.u.t.u.t.t.u.u.t.p.u.u.u.i.i.i.a.a.a.s.a.a.a.k.f.i.a.g.g.a.a.a.k.a.f.j.j.f.f.j.f.f.g.g.f.f.f.i.i.k.i.a.a.a.a.a.i.a.a.i.i.i.i.i.i.u.d.a.a.a.a.i.a.z.a.i.f.i.i.i.a.a.i.i.i.a.a.a.a.a.a.i.z.z.i.z.a.z.a.i.f.k.f.f.f.f.f.g.k.h.h.h.h.A.g.z.A.H.A.S.G.S.G.H.S.H.H.G.H.L.L.H.L.H.H.H.H.S.H.H.H.H.H.H.A.S.L.L.H.H.L.H.L.S.L.L.L.P.L.L.D.L.L.H.K.L.H.H.L.H.L.A.L.L.H.L.L.L.G.L.H.H.L.H.L.L.L.H.H.H.H.H.H.S.S.S.A.A.S.S.A.A.A.h.A.A.h.l.l.l.h.l.l.A.h.h.h.l.l.h.h.g.h.g.j.k.z.f.g.k.i.f.k.i.f.a.a.k.a.a.z.k.a.a.a.i.z.a.a.a.k.i.i.k.z.i.i.g.g.z.g.g.k.h.h.h.h.h.A.G.l.S.H.H.S.S.G.D.S.G.A.S.S.A.S.H.S.~ ~ / ZXVXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXSXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXHXDXZXZXZXHXQ.} Q Q [ (.(.(.(.(.(.(.(.(.).(.~.(.~.~.T.T.~.T.~.~.T.~.~./././.~.~.(.(.~.(.(.(.(.{._.(._.|.^._.`.`.`.(.^.(./.(.(.^.~.(.[./.~.~.~.T.T.T.T.Y.U.U.U.P.P.L.L.L.H.L.H.H.L.L.S.U.G.H.G.G.GXFXIXGXGXFXAXAXFXFXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBXhXM.{ f j.s.k.i.a.a.i.f.f.f.g.g.z.f.f.g.g.g.k.g.g.g.j.C y r ; u Z A Z A 0 > r A g.A.A.* r y q T T t : : : F.H.S.S y 0 : : e 0 y > T L.P.P.T.Z r r q j.L.S.U.Z r : = Z.L.H.L.L.L.L.L.L.L.L.L.U.U.Y.T.U.Y.Y.T.T.~.T.~.~.~.~.~.~.~./././.~./.~.~.~.~.[.T./././.!.(.(.(.^.{.(.^._._._.(.(.(.(.(.(.(./.(././././././././.^.^.(.[.(.(._.[.(.(.(.(.",
+"P P P P P J P J H L J J J L L H D H H H H H H H H L H H H H H H L Z D H D D Z Z D D D Z D D D D Z H Z Z Z L Z L H D H H H D H H H H Z H P J { { ' ' t : r r r r r : r r r r r r : r r r r : r r : r e y y = t ' LXLXLXgX  $ $ & % - > M.LXLXLXM.; M.LXLXLXpX- { IXPXLX{ % c LXLXPXpX% aXLXLXLX{ % gXLXLXLXM.$ $ % % ; * ; IXLXLXLX' o o o $ $ $ o $ $ ' LXLXLXn , c IXLXLXIXc c o f PXLXLXpXo aXLXPXgX- ; ; ; ; e 0 r r r r r r r r r r r r : r r 0 ; 0 r y ; % $ o   t.r.E t.s.u.u.u.u.t.u.u.u.u.u.u.u.i.i.a.i.i.i.i.i.i.i.a.i.i.i.a.a.a.f.a.f.g.f.a.z.a.g.a.g.f.f.k.a.i.z.a.g.f.a.a.i.a.i.i.i.i.a.i.u.i.i.u.i.a.i.a.a.i.a.a.a.k.i.a.a.z.i.a.a.a.u.a.i.i.a.a.a.a.z.i.k.f.i.k.f.f.f.f.k.k.g.g.h.k.h.h.A.A.A.A.A.H.A.H.S.G.S.G.H.S.H.S.L.L.L.S.L.L.H.L.S.L.S.H.H.H.H.H.H.H.H.S.U.H.H.H.H.L.L.L.L.L.L.L.P.L.L.P.L.L.L.L.S.L.S.L.L.U.L.S.L.S.L.L.L.L.F.A.D.L.S.L.S.H.H.H.H.H.L.D.S.G.S.S.S.G.h.A.A.A.A.A.A.Z.j.A.A.A.h.A.A.l.A.h.l.h.h.h.h.j.z.g.g.f.f.k.k.f.f.f.f.k.f.f.f.g.a.s.j.a.k.k.k.f.a.k.k.f.f.i.a.g.f.d.a.j.z.h.h.h.h.G.j.A.A.G.J.h.S.H.H.S.H.D.G.S.S.S.A.S.S.S.A.S ! / CXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXGXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXDXDXAXDXAXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXDXAXDXAXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXAXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXZXBXm.} ~ ! [ (.(.(._.(.(.(.(.(.(././././.~.~.T.~.T.~.~.T.T.[.!././././.(./.(.(.(.^.^._.^.|.^._._._._._._.`.(.(.|.(././.(./././.~.~.R.T.T.T.I.T.U.U.U.P.P.L.L.L.L.L.L.L.S.L.H.L.S.H.F.G.GXIXGXGXGXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXgXhXM.{ c j.f.k.a.a.g.f.f.f.l.k.h.k.k.h.k.g.g.a.j.h.g.h.Z e 0 > e.g.h.h.e.t e r A D.g.P e 0 > y ; : r e ; 0 T A.L.S ; * e e.b.* q e r e.L.U.G.S * : * F.U.U.L.r e e 0 F.H.L.S.S.U.L.U.L.L.L.Y.U.U.T.U.P.T.T.T.T.[.~.~.~.~.(.~./.!.~.~.^./.~.~.^.T.(.(././.(.(.(.(.(./.(.(.(.^.(.(._._.^.(.(.^.(.(.(.^././././.[.(././.(./.[.!.(.(.(.(.(.(.(._.",
+"P ) P P P P P J J H L Z L L H L H H H H H H H H H H H F H H H H L J L Z D D G D D D D D D D D D Z Z H Z Z H Z Z H H H F H H H H L H D J Z K ] { ' ! u t : r r r r r r r r e r r 0 r r r r r r r r y r = : * e { LXLXLXIXo $ , - * ; % gXLXLXIX$ $ - IXLXLXgX; & % - f { pXIXLXLXLXsX- gXLXLXIX- & - LXLXLXsX$ o $ % % ; - BXLXLXLXc , $ o $ - - $ % , c LXLXLXc & - gXLXLXgX  $ $ o gXLXLXaX- IXLXLX{ % % ; % % % e 0 r 0 r r 0 r r r r r r r r r ; r r ; ; ; % $ o o r.t.i.t.t.t.t.t.u.u.t.t.u.u.u.u.u.u.i.u.i.i.i.i.i.i.i.i.i.i.a.a.a.a.a.a.f.a.g.g.f.f.f.g.a.f.a.k.k.z.a.a.i.a.a.a.a.i.i.a.i.i.d.i.i.i.i.i.i.i.i.i.i.a.z.a.a.a.a.a.a.i.i.a.a.a.i.i.i.i.a.i.a.a.a.a.k.d.k.f.f.f.f.f.k.k.k.g.h.h.h.l.h.h.A.A.A.h.H.S.H.G.H.S.H.S.L.L.S.A.L.A.L.L.H.H.L.H.H.H.H.S.H.H.H.H.S.K.H.L.H.H.H.L.H.H.L.L.L.S.S.S.L.S.S.L.S.L.L.L.U.S.L.L.L.L.L.U.L.S.L.L.L.P.L.L.L.S.D.H.S.H.H.S.A.S.D.G.G.S.S.S.z.A.A.A.A.h.A.A.A.A.A.A.A.h.A.h.A.l.l.l.h.l.l.h.h.h.h.h.z.h.f.g.f.f.g.f.g.f.g.f.g.a.f.f.k.i.f.f.f.g.a.k.k.a.g.i.f.f.g.a.g.j.h.h.A.j.A.Z.A.A.A.H.H.G.H.D.G.S.G.S.S.S.S.S.S.S.D./ ! ! HXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXAXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXDXSXDXAXAXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXGXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXZXZXZXMXm.[ ~ Q ` _._.(.^.|.(.(._.(.(.(././.~.~.~.~.T.~.T.T.~.~.~.~./.[././.(.(.(._.(.|.(.(.|._.`._._._.(._._.`.^.(.(.(.(.(.(./.(.!./.~.~.T.T.T.T.U.T.U.T.P.P.U.L.L.L.K.L.L.S.L.F.L.H.H.S.G.IXIXGXGXAXFXVXAXAXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXCXaXM.n c j.f.a.g.f.g.f.f.f.z.k.z.k.h.g.g.g.g.g.j.S.g.h.V * 0 q e.h.h.S.T 0 0 q Z D.F.V = : y * 0 q r ; y ; A L.A.Z y 0 r b.U.Y = : y y F.L.U.C q y y [ Y.S.U r e = C L.H.G.T.L.L.L.S.L.L.L.L.T.Y.T.T.T.T.T.T.T.T.T./.~.~.~.~./.~.~.~./.~.^.~./.(.(.~./././././.^.(./.(.(.`.`.(._._.(._.(.`.^.(.(.^./././././.(./.(././.(.^.`.].(.(.(.(.(.(.(.",
+"S I P P J P H J J H L J L L L L H H H H H H H H F H L J L Z H H H H H Z D Z D L D Z D D D D D D S Z L L Z J J Z H F F H D H H H L Z G H H H ' ' ' Q u : r r r r r r r r r r r r r r r r r r r r = r e : q r : ' LXLXLXgXo $ $ w * ; > IXLXLXIX- & $ gXLXLXIX$ % pXIXLXLXLXIXLXLXLXsX$ IXLXLXIXo % o LXLXLXM.o $ % & % * > pXLXLXLXsXo $ o o IXPXgX{ % ' LXLXLX/ , o UXLXLXIXo o o $ n LXLXPXn LXLXPX- $ $ % % ; * 0 0 ; r r r ; r r r r r r r r r 0 r r ; ; ; % $ $ o u.t.u.t.u.t.t.t.t.t.t.t.t.u.u.t.u.u.u.u.u.u.u.u.u.i.i.u.i.u.a.a.a.a.a.a.f.a.a.g.k.f.f.f.z.f.i.a.g.i.g.g.i.a.a.i.i.i.i.i.a.i.u.i.i.u.i.u.i.i.i.i.a.a.a.a.z.k.a.a.a.a.a.i.i.a.i.u.a.i.i.a.a.a.a.a.k.i.k.f.f.k.z.k.k.z.h.k.k.h.h.l.l.A.z.A.z.S.S.H.H.H.H.G.H.Z.S.U.U.L.S.P.P.H.L.S.L.H.H.D.F.H.H.S.H.H.H.K.H.H.H.H.H.K.L.L.H.S.L.L.L.P.L.S.L.L.L.S.L.L.L.S.P.L.L.L.L.L.L.U.P.L.P.P.P.L.L.A.L.U.S.U.S.G.L.H.H.H.H.G.S.S.G.S.S.h.A.A.J.A.A.A.A.G.A.G.h.A.h.j.A.l.l.l.l.l.h.h.h.l.z.h.k.k.g.k.k.k.f.g.a.f.z.a.j.f.i.k.f.k.k.a.z.k.f.a.f.g.g.g.a.h.z.h.h.A.g.h.A.A.A.G.S.H.A.h.H.A.G.D.H.G.S.S.S.S.G.S.A.! ! ! ZXVXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXAXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXDXDXGXAXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXSXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXDXZXZXQ.{ / S [ (.(.^.`.(.(.(.(.(.(.!.(.~.~.~.~.~.T.T.~.~.~.T.T.~.~.~././.(./.(.^.(._.(.^.|._._._._.(.`._.|.^._.(.(.^.(.(./.(./.!.~.R.~.~.T.T.T.U.T.Y.U.P.Y.P.P.L.L.L.S.L.L.L.S.L.L.S.H.D.GXGXGXGXGXFXDXAXAXAXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBXhXM.{ n j.f.z.f.z.a.k.f.k.l.g.h.g.g.g.k.h.k.a.j.k.k.g.A > e 0 b.l.A.h.e.r > = C Z.e.q 0 0 q S C C A y : y 0 Z.S.A r = * Z.S.H.u y : y U R.U.Z : ; ; y = y e y > q [ U.U.U.H.L.L.L.L.L.L.U.L.I.U.T.U.T.T.T.~.T.T.^.T.~.T.~.~.~.~.~.~.~.~./.^./.^.(.T./././././.(.(.{.(.^.^.`._._._.(.(.(.(.(.(.(.(././././.(././././.[.(.^.(.(.(.`.(.(.(.(.`.",
+"P I P P P P H J J L L H Z J Z J H H F J J G H D L H G J H F H H Z H H H D D D D Z D D Z D D D D H H H Z H Z J Z H H H H F H H H H L D H D K ' ' ' Q u ; * r r : r r r r r r r r r r r r r r r r r 0 : r = r r { LXLXLXIXn n f c { ' % aXLXLXIX% $ $ IXLXLXsXo pXLXLXLX{ - - LXLXPX6Xo gXLXLXIX& $ - LXLXPX6Xo $ $ % % : ; { LXLXLXLX- o o M.LXLXLXIX% n LXLXLXc $   IXLXLXgXo   $ $ $ PXLXLXHXLXLXaXo $ $ $ $ ; * ; r 0 r r r r r r r r r r r r r r r ; ; ; ; % $ $   u.t.u.t.t.t.t.t.t.t.t.t.t.r.u.u.t.u.u.u.u.u.u.u.u.u.u.i.u.i.i.i.i.a.a.a.a.z.i.i.i.a.z.a.a.k.z.a.z.a.a.i.a.a.a.i.i.i.i.i.s.i.i.i.k.u.i.u.u.i.i.i.i.a.a.a.a.i.z.z.i.z.a.a.i.a.a.a.a.i.d.a.i.a.a.a.a.f.k.a.k.f.i.k.k.k.k.h.h.h.z.A.A.A.A.A.S.G.H.H.H.L.G.L.H.U.D.L.S.S.L.D.P.L.L.H.H.H.H.H.H.S.H.H.H.H.H.S.U.H.H.H.K.H.S.L.L.L.L.L.S.L.L.L.L.L.S.L.P.P.P.P.L.L.L.L.L.D.P.L.P.P.L.L.P.L.U.P.L.L.L.L.U.L.H.U.S.H.H.G.G.S.S.S.S.G.A.G.A.G.A.H.h.A.A.A.G.A.g.S.h.G.l.l.A.l.h.z.l.h.h.h.h.h.k.h.k.g.g.g.g.a.g.f.f.x.f.k.k.k.g.z.a.k.f.g.f.a.z.g.g.h.g.h.h.h.Z.A.A.G.A.A.A.S.H.G.H.H.H.D.H.S.S.S.S.S.S.S.D.~ ! / BXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXBXpX[ / ! [ `.(.(.`.`.(.(.(.(.(.(./.!.~.~.~.~.T.~.T.~.T.~.[.~./././././.(.(.(.(.(._.(.(.`.^.{.(.(.|.(.(.(._.(.(.(.(.^././././.~.~.~.T.~.T.T.T.U.T.T.P.P.P.P.U.U.Y.S.L.L.L.L.L.H.H.H.D.IXSXPXGXFXGXAXFXAXZXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBXaXpXc c h.g.z.f.g.z.z.f.h.h.g.g.z.g.g.g.g.g.S.j.k.D.Z.A > ; 0 e.A.Z.A.e.0 e q Z l.Y ; r r G A.H.H.F.G 0 0 : T I.S * r r b.H.H.[ y : : 0 n.T.H r r ; * y * * : q G T.U.H.L.H.L.D.L.L.L.U.U.U.U.T.T.Y.T.T.T.T.~.~.Y./.~.T.[.~.!.~.~.~././.(.E./.~.(.(./.(.^.{.(.(.^./.(.(.(.(.(._.(.(._.(.(.(.(.(.(././././././.(.{.^.(.(.(.(.(.(.^.^.(.{.(.(.",
+"P P U P P J J J J L H Z H H H H H F H L H H G K H H H H H H H F Z S H J D D D Z Z L Z Z D D D D L L Z Z S Z H Z D H H H H H H H H H G Z H H ' ' Q c S ; ; ; 0 * r r r r r e r r r r r r r r r r q r y ; r r e ' LXLXLXLXLXLXLXLXLXLX- M.LXLXLXsXb aXLXPXLX{ o UXPXLXIXb n gXLXLXLXM.  { LXLXLXsXf UXLXLXLXsX# $ $ % % % ; ; IXLXLXLXLXgXIXLXLXLXLX{ % } LXLXLXc $ $ IXPXLXIXf c o $ $ pXLXLXLXLXLXn $ $ $ $ % ; * e ; e 0 r r r r r r r r r r r r r r r r > 0 % % o   r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.u.u.u.u.t.u.u.u.u.i.u.u.u.i.a.a.i.i.a.a.a.k.z.a.k.a.i.k.i.a.a.g.i.a.i.i.i.i.i.i.i.i.u.i.u.E u.u.u.i.i.i.i.i.a.a.a.i.i.i.z.i.a.i.a.z.a.a.a.a.i.i.i.a.a.a.a.k.i.k.f.z.f.k.g.g.g.g.h.k.h.A.h.D.A.A.S.H.S.H.H.H.L.H.L.L.P.D.D.L.L.S.P.L.H.H.H.G.H.H.G.H.H.H.H.H.H.H.H.S.H.H.U.S.H.H.L.L.L.L.L.L.L.L.L.L.Y.L.U.L.L.P.P.P.L.U.L.L.U.L.L.U.P.P.P.P.U.L.P.L.L.L.L.L.L.L.S.U.H.H.H.H.D.H.D.H.A.G.G.S.S.S.G.G.h.A.A.A.A.A.h.A.A.A.A.h.A.A.h.A.z.h.A.h.h.a.f.h.g.f.z.g.g.f.g.j.g.g.a.z.k.z.g.k.a.f.f.f.j.k.g.z.h.h.l.l.j.G.G.h.G.A.A.S.S.S.G.Z.S.H.S.H.H.S.A.S.S.A.S.S.~ S / ZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXDXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXZXAXBXm.{ ~ / ` (._.^.|.`.^.(.^.(.[.(.(.[./.~.~.~.~.T.~.~.~.~.~.~.~.~././.(.(./.(.(.(._._._.(._.`.^.(.(.^.`.(.^.(.(.(.^.^.!./.!./././.R./.~.~.T.T.T.T.T.T.U.T.P.L.U.L.P.L.S.L.L.U.H.D.H.U.GXPXSXGXGXSXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXFXFXFXVXBXaXm.c.x h.g.j.l.k.h.h.l.z.f.z.g.z.z.g.g.g.g.a.j.h.A.j.Z 0 q t T z.h.A.e.q y q u Z.A : e : [ S.L.L.U.T y = > C F.Z = q * b.T.L.J.C > * * P U.C r r r * * 0 u U b.T.T.L.P.U.P.L.L.L.L.P.U.U.T.U.T.T.T.T.T.~.T.~.~.~.T.~.~.T.~.T./.~.~././././.^./.(././.(././.(./.(.(.{.`.(.`.(.(.{.^.{._.[.(.{.(././.(./././.~.(.(.(.(.(.(.`.^.(.(.^.(.(.(.(.",
+"J L L J J J H G J H H J H P H H H H J G H D H H H H D H G H H H H D H Z D D D Z Z Z Z D D D D D Z Z P Z L H J L H H H D H D H H H J D L H H ^ ' c S y 0 = y r r q e r r r 0 r r e r r r r r r r = r ; r y = : { LXLXLXLXLXLXLXLXLXPX% ; aXLXLXLXLXLXLXLXaXo o aXLXLXLXLXLXLXPXLXPXsXo + IXLXLXLXLXLXPXLXLXsX  $ $ % ; ; ; ; % IXLXLXLXLXLXLXLXPXgX- % c LXLXLXc o o pXLXLXLXPXsX$ o % - LXLXLXLXHXo o $ $ % % ; * 0 0 ; r r r r r r r r r r r r ; r r 0 ; r % & $     E t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.u.t.t.u.t.u.u.u.i.i.i.i.i.a.a.a.a.a.i.a.i.a.i.f.a.a.a.a.a.i.i.i.i.i.i.i.i.u.i.u.u.i.i.i.u.u.i.i.i.i.a.a.a.z.z.z.i.f.a.a.a.i.a.a.a.a.a.a.a.i.i.a.a.a.i.k.f.f.f.k.f.g.g.g.k.h.A.h.A.A.A.S.A.G.H.H.H.L.G.H.S.L.H.L.L.H.S.P.A.L.G.K.K.A.H.A.K.H.S.H.H.H.H.K.H.L.H.h.K.H.H.L.L.H.S.L.L.L.P.S.P.P.L.L.L.Y.L.U.L.L.L.L.Y.L.P.U.P.L.P.P.P.P.U.U.P.P.L.L.L.U.L.L.L.S.L.H.G.H.H.H.D.A.H.H.G.H.H.H.Z.G.A.J.G.G.S.h.A.A.G.S.S.h.A.H.A.A.A.l.l.S.D.G.h.h.g.g.g.g.g.g.g.g.z.g.z.g.k.a.g.g.f.f.z.k.a.k.k.z.g.l.l.A.j.Z.A.A.S.G.G.S.S.S.K.G.S.S.H.A.S.S.S.A.A.G.A.G.~ ! ! ZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXAXFXGXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXMXm.[ ~ Q [ (.`.|.(.^.^.(.`.(.(.(.(./././.!.~.~.~.!.!.~.~.~.~././././././.(.(.(.(.(.(._._.(.(.`.(.(.`.(.(.^.!.(.(.(./.(./././.~./.~.~.~.T.T.T.T.T.Y.U.T.Y.P.U.L.L.P.L.U.L.L.U.G.H.H.D.IXGXGXGXGXAXFXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXVXVXCXhXM.' c h.h.h.g.l.l.h.h.h.z.l.g.g.g.g.h.h.g.D.h.h.h.h.j.Z.J.h.H.G.D.A.A.Z.H.A.H.G.l.S.A.A.G.H.H.S.U.S.S.U.D.A.G.K.L.U.L.I.H.XXP.P.F.Y.L.P.U.T.T.Y.T.P.Y.T.T.L.U.U.A.L.L.L.U.L.U.U.P.L.L.U.U.T.T.T.T.T.T.T.~.~.T.~.[.T.[.T.~.~.~.~.~.!.!.(./.(././././.(.(./.(.(.(.(.^.^.(.`._.(.(.(.^.(.^.{.^.(.(.(.(./.[.(.(.^.(.(.(.(.(.(.`.(.`.^.{.(.(.(.",
+"P P K P L L L J J H Z Y P H H H H H J F H H H H D D D H D H Z D H Z D D Z D D H Z H L Z D D H Z L Z D H L D Z H Z H H H H H H H D Z H L H H ! S c n > q : r r r r r r r r r r r r r r r q r r r ; r ; r y r : ' LXLXLXLXLXLXLXLXLXLX& - - M.PXLXLXLXPX6Xo o , - IXLXLXLXPXn sXLXLXHXo o c IXLXLXLX6XHXPXLXM.$ o $ % % : % ; % e aXPXLXLXLXLXPXsX$ % $ ' LXLXLXc o o w IXLXLXLXIX$ $ $ % aXLXLXLXM.  o $ $ , % * 0 ; r 0 r r r r r r r 0 r r r r r 0 r r ; ; % % o   o r.t.t.y.r.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.u.u.t.u.u.p.u.u.a.i.i.i.a.a.a.i.a.a.a.a.a.a.z.a.a.a.i.i.i.i.i.i.u.u.i.u.i.u.i.u.u.u.i.i.i.i.i.a.a.a.a.i.z.i.i.i.i.a.z.a.a.a.a.a.a.a.i.i.a.a.i.i.i.k.f.f.g.g.g.g.g.h.h.A.A.A.A.S.S.S.H.G.H.S.H.L.L.H.H.D.L.P.D.L.S.D.P.H.H.A.K.S.S.L.S.H.H.H.K.H.H.K.S.H.H.H.H.L.H.L.L.L.L.L.L.P.P.P.P.L.Y.U.U.U.L.U.K.U.U.L.U.U.T.Y.P.P.P.P.P.U.U.U.P.U.L.U.L.L.L.L.L.L.H.H.D.H.H.H.G.H.H.Z.G.H.H.H.H.H.G.G.Z.G.A.A.G.A.G.H.S.G.A.A.A.G.l.S.h.l.l.h.h.h.h.g.g.g.h.g.g.g.g.g.g.g.g.a.g.z.f.f.j.g.z.l.l.h.h.l.S.A.A.A.A.A.G.G.G.S.A.G.G.S.H.H.H.S.A.A.A.A.G.A.A.~ ~ Q CXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXZXVXZXm.[ / Q ` (.(./.(.(.`.(.(.(.(.^.(.(././.[.~.~.!.~.~.~.!.~./.~.~././.(./.(._.(.(.(.(._.(._.(.(.(.(.^.(.`.^.(.~.(.(./.(./././././.~.~.~.T.T.T.T.T.T.T.U.P.P.Y.L.K.Y.L.L.S.L.L.D.P.D.D.GXGXGXIXFXAXFXAXAXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXVXBXaXM.n c h.z.l.h.l.h.l.l.h.h.h.h.h.h.h.h.j.g.h.z.l.g.h.h.A.h.A.z.D.S.h.G.h.J.A.A.H.D.S.H.H.H.A.S.U.H.H.U.L.U.U.L.U.T.U.L.I.U.P.Y.T.L.U.~.T.T.Y.T.T.Y.U.P.P.P.T.D.T.U.L.U.P.L.P.T.P.P.P.Y.U.T.T.T.T.T.T.T.T.T.~.T.~.T.U.E.~.T./.T.~./.~.(.!.(.(./.(.(.(.(./.(.(.(.(.(.`.(.(.(.(.(._.(.(.(.(.(.[.(././././.(./.(.(.(.(.(._._._._.^.(.(.^.(.(.(.",
+"J J P H P P L H H H L H H H D H H H F H H Z H H D D D D D D D D Z H Z Z D D Z D D Z Z Z Z H Z Z H H H H Z L D H H H H H K F Z H H L H P H Z ! c S u q > r r : r r r r r r r r r r r r r r r r r r r ; r * e ; ; % % $ $ o o o $ o $ % $ % o , c c c o $ o $ $ o , t c u o - o o     $   o o f c & o o o $ o o $ $ % ; ; : ; * % - o f c x f o $ $ $ $ - $ $ o $ $ , $ $ f n n o $ $ , % gXLXLXLX- o o o & % % ; ; r r : r r r r r r r r r r r r ; r r r r ; * & &   $ r.t.t.t.t.r.r.t.r.t.t.t.r.y.t.r.r.t.r.t.t.r.t.r.r.t.t.t.i.u.u.p.i.u.i.i.i.i.a.i.a.a.i.a.a.a.a.i.i.a.i.i.i.i.i.u.i.i.u.u.u.u.i.u.u.u.u.i.i.i.i.i.a.a.i.z.a.a.i.k.d.z.z.i.k.a.a.a.a.a.a.i.a.i.a.a.a.k.f.i.k.f.g.f.g.f.z.A.h.h.A.A.A.S.S.S.H.H.H.L.L.H.H.H.L.D.L.P.A.L.L.L.S.H.G.K.S.G.G.A.S.H.H.H.A.H.H.H.U.S.U.S.K.H.L.L.H.L.L.L.L.L.P.L.U.L.L.U.L.U.L.U.U.Y.L.P.Y.L.P.P.T.T.T.T.P.Y.U.L.U.L.L.L.L.L.L.L.L.L.L.L.L.S.H.H.H.H.H.H.H.H.H.H.H.K.A.G.H.K.A.G.A.A.A.A.A.H.G.A.H.A.A.S.A.l.G.A.A.h.h.h.g.h.g.h.z.h.h.g.g.a.g.j.g.f.f.g.z.g.g.l.l.h.h.A.z.A.A.A.G.A.A.A.S.S.S.G.A.S.S.S.A.S.S.A.A.A.A.A.G./ Q ! ZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXGXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXVXBXm.} Q ~ [ (.(.^.{.(.{.(.(.(._.(.(.(././.~.~.~.~.~.~.~.~.~./.~././././.(./._.(.(._.(._.(._.(.(.(.(._.(.[.{.(.(.!.(.(././.(./.(./.~.~.T.~.T.T.T.T.P.T.U.P.P.U.U.L.L.L.L.L.L.L.S.G.A.L.SXPXIXGXFXDXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXVXgXJXM.{ c h.l.h.h.l.l.l.l.l.h.h.h.h.h.h.h.h.h.D.a.l.G.G.h.A.A.h.H.S.Z.G.G.g.G.S.L.A.L.S.L.H.L.U.H.S.H.S.Y.S.L.L.L.U.U.S.U.U.U.U.U.L.U.U.T.U.T.T.U.~.U.U.T.Y.^.P.T.Y.Y.Y.L.P.P.T.P.Y.P.U.T.T.T.T.T.T.T.T.T././.T./.~.~.XXXXU.XXT.T.~.!.~./.^.(.(.^.{.(.(./.{.(.(.(.(.(.^.(.`.^.(.(.(.(.(.(.(.[.(./.(././.(.(.{.(.(.(.^._.(._._.(._.(.(.(._._.^.",
+"J J J J L L J J F H H H H H H H H H F H H H D H D D D D D D D D D D D D D H D D D D Z Z S D Z D D D D D H H F H H H H H H H H H H Z L G D H S u u u u y r r r * r r r r r 0 r r r r r r r r r r r r r r r r r r * % % $ o o o o $ o $ $ $ * $ $ $ $ $ o $ $ $ $ $ $ $ & $ o o o o o o o $ $ o $ $ $ o $ $   $ $ & % ; * ; ; ; % % $ $ $ $ o o $ $ $ o $ $ $ $ $ & $ & & & $ $ $ , gXUXIXLXLXLXaX    , o & % ; % : r r r r r r r r r r r r r r r 0 r r 0 * ; % $ $   = r.t.t.t.y.t.t.t.t.t.r.t.r.r.r.r.r.r.r.r.t.r.t.r.t.t.t.t.w.p.p.u.u.u.u.i.i.i.t.i.i.i.i.i.i.a.u.a.a.i.i.u.a.u.a.u.i.i.s.u.u.u.u.s.s.s.i.i.s.i.i.a.a.a.a.a.a.a.a.z.a.k.a.a.f.a.f.s.z.k.i.i.i.i.a.a.f.a.f.f.g.g.k.h.z.h.l.A.h.h.A.S.A.S.S.H.H.S.L.S.U.L.L.S.L.L.S.L.S.S.H.H.U.H.H.H.H.H.H.H.A.H.H.H.H.L.S.L.D.U.U.H.L.L.L.L.U.L.R.K.L.U.L.I.U.T.T.U.L.U.U.I.Y.U.T.I.T.Y.U.T.U.Y.Y.Y.Y.T.U.U.U.L.U.U.Y.U.L.L.L.S.L.L.L.L.L.S.H.S.U.H.S.H.H.S.L.S.D.H.H.H.H.S.S.H.H.H.A.H.S.S.S.S.S.S.h.A.h.A.h.A.h.h.A.h.h.l.l.z.z.z.j.k.k.k.k.k.g.g.g.k.h.h.A.A.h.A.A.D.A.S.A.Z.S.A.A.S.S.G.S.S.S.H.A.S.S.A.Z.G.z.A.A.I ! ! ZXAXAXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXDXAXGXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXGXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXBXQ.} Q ! [ (.(.`.(.(.(.|.^.(.(.(.(.(.~.(.^.~.~.~././.~.~././.!./././.(./.(.^.(.(.`.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./././.(./././././.^.T.T.T.T.T.T.T.T.T.P.T.U.L.U.L.L.L.L.L.H.H.S.S.S.DXIXGXGXGXFXAXAXAXDXDXAXDXAXDXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBXhXM.M.x z.z.h.h.h.l.l.l.l.z.h.h.A.S.h.l.g.A.g.A.h.h.A.A.A.h.A.A.h.H.A.S.S.S.S.S.D.H.S.U.S.H.L.L.L.G.L.L.L.L.L.L.L.U.L.U.Y.Y.P.Y.P.T.T.T.T.T.T.T.T.T.I.U.T.Y.T.U.Y.Y.Y.Y.T.P.P.P.T.T.P.T.T.T.P.T.T.T.[.~.T.~.T.~.~.[.T.~.~.T.~.~.~.T./.!./.(.[.(.[.{.(.(.(.(._._.{._.`.^.`.^._.(.(.(.(.(.(.~././././.^././.(._.(._.(.(.(.(._._.(.[.^.(.(.(.!.",
+"J J L J L H J J H K U H Z H J F Z H H H F H H D D D D D D D D D D A F D A D D D D H H Z H D Z D D H Z H D H H H H H H H H H H H H H H L H Z S u y S r : r 0 r r r r r r r e r r r r r r r r r r r r r r r r r 0 ; % % $ $ $ o $ $ $ $ $ $ $ $ % $ $ o $ $ $ $ $ % $ & o $ $ $ $ , o $ $ $ $ $ & $ $ $ $ $ $ o & & % ; ; : = r * % - $ $ o $ $ o $ $ $ & % % & $ $ o & , & & $ $   pXLXLXLXLXPX- o o o $ % % ; ; r r r r r r r r r r r r r r r r e 0 r r ; ; & $     m r.t.t.r.t.t.t.t.t.r.t.r.y.r.r.r.r.r.r.r.t.t.r.r.r.r.t.t.t.r.u.u.u.u.u.u.i.u.i.i.i.i.s.i.u.a.a.a.i.a.i.i.i.a.i.i.u.u.i.u.u.u.u.u.i.p.t.i.u.i.i.a.a.a.a.a.a.a.a.a.a.a.z.f.a.a.a.a.i.i.i.d.i.i.a.a.a.f.f.f.a.k.k.j.z.l.h.h.g.A.A.A.A.S.S.H.H.L.S.L.H.S.S.L.S.L.L.L.S.L.S.H.S.H.H.A.H.A.H.H.H.H.S.H.S.S.S.S.L.A.L.H.L.L.L.U.L.L.L.U.L.K.U.U.U.I.U.U.T.U.I.T.U.U.I.T.I.U.T.U.T.T.T.T.T.T.U.U.T.Y.Y.L.L.L.U.Y.L.L.L.L.S.S.S.L.L.U.S.U.H.H.H.H.L.L.L.H.H.H.S.D.S.H.A.S.H.H.H.H.S.S.S.H.A.H.S.A.A.A.A.A.A.h.h.l.l.k.h.f.h.k.k.h.k.g.k.g.g.k.h.h.h.A.A.A.l.A.A.A.H.A.S.S.S.S.S.S.G.H.S.G.D.S.A.S.A.H.h.A.A.~ ~ / CXZXAXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXDXAXFXFXFXFXDXDXDXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXDXDXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXDXSXAXDXFXDXAXDXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXZXVXBXpX[ Q / ` (.`.^.(.`.(.(.^.|./.(./.^.(.~.^./././.~.~./././././.!.(.(././.(.(.(.(.`.(.(._.(._.(._.(._.(.(.(.(.(./././././././././.T.T.~.T.T.T.T.T.Y.U.T.P.Y.L.U.S.U.L.L.L.L.L.L.L.L.L.IXPXGXGXFXAXAXAXFXAXDXDXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBXaXM.c n f.g.h.h.h.h.l.A.l.l.h.l.h.h.A.l.z.A.A.A.A.g.A.A.A.A.S.H.A.A.S.S.S.A.H.H.H.H.L.S.U.D.L.G.L.L.L.L.L.L.L.U.L.U.U.P.P.P.Y.P.T.P.P.T.T.T.T.I.U.I.I.T.U.U.T.I.P.U.T.P.T.T.T.T.Y.T.T.T.T.T.T.~.T.T.~.~.~.~.~.~.~.T.~.T.T.T.~.~.~.~./././.).(.^._.(._._._.`._._._._.(.`.^._.(.(.(.(.(.^.(.{.(.(.(.(./.(.(./.(.(.(.(._.(.(.(.(._.(.{.`.!.(.(.",
+"J J J J J H H Z H H H H H H Z H H H H H D H D H D D D D D D D D D A D Z Z D D D H D Z D D Z H Z D D D D H H H H F H H H H H H D H L H H H H S y y u u e r r r 0 r r r r r r r r r r r r r r r r r r r r r r r 0 * % % & $ $ $ $ $ $ $ $ $ - % % $ , & $ $ $ $ % & % % & $ $ $ $ $ $ $ $ % % & % $ $ $ o $ $ $ % % % ; * r r : % > % $ $ $ & $ $ $ & , % % & % % % % % % % % % $ - ' gXHXBXsXz $ o $ $ $ % % * ; r r r r r r r r r r r r r r r r r 0 0 ; * % $ o     E w.t.t.y.t.t.t.t.y.t.r.t.r.r.r.r.r.r.r.t.r.r.r.r.t.t.r.t.r.t.t.r.u.t.u.u.i.u.i.u.i.u.i.s.i.u.u.u.a.i.i.i.i.i.i.u.i.s.u.u.u.u.u.i.i.i.i.i.i.i.i.a.i.a.a.a.a.a.a.a.f.a.a.z.a.z.a.a.z.i.d.i.i.a.i.a.a.a.f.f.z.j.k.h.l.h.h.h.A.A.A.A.S.H.H.S.H.S.S.U.S.S.U.H.H.A.S.H.S.H.H.H.L.H.H.H.S.S.A.H.H.S.H.H.H.S.L.H.D.L.D.U.L.L.L.L.L.U.U.U.U.L.I.T.U.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.U.U.U.T.U.U.U.L.U.U.L.L.L.L.U.L.L.L.L.L.S.S.U.L.H.L.L.L.D.H.L.L.H.H.H.A.D.H.H.H.H.H.H.H.H.H.H.H.H.A.A.A.H.A.h.A.A.S.h.l.l.h.h.h.h.k.h.k.k.k.k.z.k.h.h.h.h.h.A.A.A.S.A.A.G.S.A.S.S.S.S.G.G.S.S.S.S.S.S.S.S.h.h.H.S./ Q Q CXFXFXAXDXDXAXDXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXDXAXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXVXFXVXBXQ.[ ! Q [ (.(.`.(.^.^.(.`.(.(./.(.(.~.(././.~./././././././.(.(./.(./.(./.].(.(.(.(.^.(.(.(._.(.(.{.(.(././././././.~./.~.~.~./.~.^.R.T.T.T.T.Y.U.T.U.P.P.U.U.P.P.U.U.L.L.L.G.L.H.D.IXAXGXGXFXFXVXAXAXAXAXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXBXhXM.{ c h.A.h.A.A.A.h.h.A.h.l.l.g.A.A.A.A.A.A.A.A.A.A.A.A.A.h.H.A.S.S.S.S.H.H.H.L.S.L.S.L.L.G.L.L.L.L.L.L.U.L.L.L.U.Y.P.U.U.Y.U.Y.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.Y.T.Y.T.T.T.T.T.T.T.T.~.~.T.T.~.~.T.T.~.T.~.~.T.~.(.[.~.T.^./.T.~.(./././.(.(.^.(.(.(._._.^.^.|._._.`._._._._.(.(.(.(.`.(.(.(./.(./.(.(./.{.(.(.(.(._.(.(.(.(.(.{.(.`.^.!.(.",
+"Z K G J H J H J H H H H Z H L Z Z H D D H S H D D D D D D D D D D Z D Z D D D D Z D D D D H Z H D D D Z H D H D H D H H H H H L L L H H H H S y u > y r r r * r e r r r r r r r r r r r * : r r r r r r r r r ; r * % - $ & $ % % $ % % % % % % % % % & % % % % : * % % % % - $ % % % % % % % % % % % & % , % % * % ; 0 r r : ; ; ; ; % % $ % % & % ; % % ; % % % % % ; % * % % % - - % - & o $ o o $ $ % * ; 0 r r r r r r r r r r r r r r 0 : r r ; r * % $ o   $ w.r.r.y.r.t.y.t.t.t.r.r.r.r.r.r.r.r.r.r.r.t.r.r.r.r.r.r.t.t.i.u.t.u.u.u.u.u.u.u.i.u.i.a.t.a.i.a.u.u.u.u.u.i.i.u.i.u.u.i.i.i.i.u.i.u.s.p.u.t.i.i.i.a.a.i.a.a.k.a.a.z.a.f.a.a.i.a.a.i.i.k.i.i.a.a.f.a.g.a.f.f.g.z.A.h.h.h.A.A.A.A.A.A.S.S.H.H.S.L.S.U.S.S.H.H.P.D.D.L.H.H.D.A.H.F.H.D.H.K.H.H.H.S.H.S.L.A.U.U.S.L.L.L.L.L.L.U.U.T.U.T.T.U.U.T.T.T.T.T.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.U.Y.Y.Y.U.T.L.T.P.U.U.S.L.L.L.L.L.U.L.H.L.L.P.A.S.H.S.L.H.H.L.G.H.H.H.H.S.L.H.H.H.H.S.A.H.H.H.A.H.A.A.h.h.S.h.l.l.h.k.h.h.k.h.k.h.h.k.A.h.h.h.A.A.A.A.A.A.A.A.A.S.S.S.S.S.H.D.G.S.G.S.S.S.S.S.S.S.H.z.h.~ Q S BXAXFXAXAXAXDXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXDXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXVXBXm.} Q c [ (.`.^.(.(.`.(.(.{.(.(.(.^.{.E./.^.(./././././.(.^.^.(./.(.(.(.^.|.(.(.(.(.`.`.^.(.(.(.(.(.(.^.(.(././.[./././.~.T.~.T./.T.T.T.T.T.T.P.P.P.P.Y.P.T.L.P.P.P.U.L.L.L.G.H.L.G.GXGXIXIXGXHXFXAXAXAXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXHXaXM.n c A.l.S.z.h.h.S.z.A.h.l.h.h.j.h.A.A.A.A.A.A.A.G.A.S.S.A.S.A.H.A.H.S.H.H.H.S.L.L.Y.L.L.L.L.L.L.L.L.L.L.P.L.U.U.U.P.U.Y.Y.T.T.~.T.T.T.T.T.T.T.I.T.T.T.U.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.!.~.Y.~.~.~.T.~.~.T.~.!.~./.~.(.~./.!./.(.(.(.(.(.(._._._.(._._._._._.[._._._.(.`.^.^.(.(.(.{.(./.(.(.(.|.(.(.(.(.(.[._.(.(.(.^.(.^.^.(.(.",
+"P L L L L H H H H H H H H H Z D H D D D D D D G D D D H D D D D D D F Z L Z D D D D Z D D Z D F D D H D D H H F H H H H J H H J H J L L H J K u > ; e e r r r r 0 r r r r q e r r r r r r e 0 r r r 0 r r r r 0 ; ; % * % % % % % % % % ; % * * * % % % % % ; ; * % t % % % : % % % % * ; % * * ; % * % % % % ; % : y : r r r r ; ; ; % % % % % ; % % ; * ; % ; > % ; ; % * % % % % % , % % % $ $ $ $ % % ; r : r r r r r r r : r r r r r r r r r r r r % % o   # 0 t.t.y.t.t.r.t.t.t.r.t.t.r.r.r.r.r.r.r.t.r.t.r.r.r.r.t.t.t.p.t.t.t.u.u.u.t.u.u.u.u.u.u.i.u.u.a.u.u.a.i.u.i.u.u.s.u.i.u.i.s.u.s.i.i.u.p.s.i.i.a.i.i.i.a.d.i.a.z.i.i.i.a.a.k.a.a.a.z.i.a.a.i.k.a.g.a.a.f.f.f.g.z.j.h.l.g.A.A.h.A.h.A.A.H.G.H.H.S.S.H.L.S.L.H.S.H.H.H.H.H.H.H.H.H.H.S.H.H.H.H.H.A.U.S.H.H.H.S.H.L.H.L.L.L.L.U.L.U.U.U.U.U.I.I.I.T.T.T.T.~.T.~.T.~.T.~.T.T.T.T.T.Y.T.T.~.T.T.T.T.T.T.Y.U.P.P.P.U.P.U.P.P.U.L.L.L.U.U.L.L.L.L.D.L.L.L.L.S.L.H.H.G.U.S.H.S.H.H.H.H.H.H.H.H.H.h.H.A.G.S.A.h.A.h.A.g.l.l.A.k.z.h.h.h.h.h.h.h.l.A.A.h.A.S.S.A.A.A.S.S.S.S.S.S.A.G.A.H.S.S.S.S.S.S.S.z.H.A.A.A.~ ! ~ CXAXDXAXDXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXDXDXDXAXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXDXBXQ.[ / ! ` `.(._.(.`.(.(.`.(.(.(.(.~.^./././.(././.(././.(./.(.(.(.(.(./.(.(.(.(.(.(.^.(.(.(.(.{.^.(.(.(././././././.~.~.~.T.T.~.T.T.T.U.U.U.T.P.P.Y.Y.P.P.U.U.L.U.L.U.L.L.P.G.L.L.G.PXSXIXGXHXFXDXFXAXAXAXAXFXFXAXAXAXAXAXFXFXFXFXAXAXAXFXVXZXAXFXAXVXAXFXVXCXaXM.v.c l.G.Z.h.A.h.z.A.h.h.h.S.A.A.A.h.A.A.l.A.A.A.S.S.S.S.G.S.S.G.S.H.S.S.S.L.S.L.U.L.L.L.L.L.U.P.U.L.L.U.U.L.P.P.P.P.P.T.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.U.T.P.T.T.T.T.T.T.~.T.T.~.T.T.T.T.T.~.~.~.~./.~.~.~.^.~.E.~.~./.~.(.~././.(.(.(.(.(.`._._.|.|._.}.}.}._._._.(.(._.(._.(.(.(.(.(.(.(.(.|.(.}.(.(.(.(.{._.^.(.(.(.(.(.(./.(.",
+"H P L L H L H H H H D D H D G D Z D D D D D D D F D D D D D D A Z D F Z Z H D H D D D D D D Z Z D D D D H H H H H H H H H H L L H J L J F J P A ; ; : ; r r r r r r r r r r r r r r r r r r r r r r r ; r r r r 0 ; r ; ; ; ; : ; ; ; * * : : * ; ; ; * ; ; ; ; * * : = : * ; % * > * ; ; : ; * ; * ; % > * ; e : * * r r r r r ; ; ; ; 0 % ; ; ; ; ; ; ; 0 r r ; ; ; ; ; 0 e ; > * % * % $ $ $ $ $ % % ; ; : : r r r r r r r r r r r r r r r r r r r ; - $       w.r.r.t.y.r.t.t.t.r.t.r.r.r.r.r.r.r.r.r.r.r.r.r.r.t.r.t.t.t.t.t.u.u.t.u.t.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.i.u.i.u.i.i.s.s.i.u.i.i.i.p.i.i.s.p.i.i.i.i.a.s.a.f.a.a.i.a.g.a.a.a.a.a.a.a.a.a.a.i.k.a.a.i.z.a.k.g.g.z.l.h.z.h.A.h.A.Z.g.A.A.A.H.H.A.S.L.H.H.H.H.H.H.H.H.H.H.U.S.H.H.H.H.H.H.H.H.H.S.S.S.L.S.H.H.L.S.S.L.L.L.L.U.P.Y.T.T.T.T.T.I.~.T.T.~.Y.~.T.~.T.~.~.T.~.T.~.T.T.~.~.T.T.Y.T.T.T.T.T.U.U.T.T.P.P.P.P.L.L.L.L.L.L.Y.L.L.L.L.P.P.U.P.L.S.L.L.L.S.L.L.H.H.K.H.H.H.H.H.H.H.H.H.H.H.H.H.G.A.S.A.A.A.A.A.A.h.h.h.h.h.h.h.h.A.A.h.D.l.z.A.A.g.A.A.S.S.S.S.S.S.S.G.H.H.G.H.G.S.S.S.S.S.S.S.A.A.A.A./ ~ S CXAXDXAXAXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXSXGXFXFXFXFXFXFXFXFXFXFXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXDXBXpX{ Q ! [ _.`._._.(.^.(.(.(.(.[.(.~.!.[./././.(././.(.(./.!.(.(.!./.(./.(._.(.(.(.(.`.(.(.(.(.(.(.(.(./.^././.^.E.~.~.T.~.T.~.T.T.T.T.U.T.U.Y.T.P.P.P.P.P.P.L.U.L.U.U.L.L.P.L.D.P.U.DXGXGXDXSXFXVXAXAXAXFXDXAXAXAXAXDXAXAXVXAXVXAXDXAXAXAXFXFXZXFXZXZXVXVXVXBXaXM.n c h.W.A.G.h.h.A.h.A.A.A.A.A.A.A.A.A.A.H.A.A.H.A.S.A.S.H.A.S.S.H.H.H.H.U.S.L.L.S.P.P.P.L.L.U.L.L.I.U.L.P.U.P.P.P.Y.T.P.Y.T.T.T.T.T.T.T.Y.~.~.Y.T.T.T.T.T.T.T.T.P.~.T.T.T.!.T.T.~.~.T.~.~.~.T.!.~.~.~.~.~././.!.~.~.[./.~.~././.!.(./.(.~.(.^.(.(.^._._._._.}.{.}.}.}._._._._._._.(.(.(.^.(.(.(.(.(.(.^.].(.(.(.(.(.(.].(.(.(.(./.(././.",
+"H P H H H J D L H D H H D D H D D D G F D D D D Z D H D D Z D Z F Z D D H Z Z A D D D D H Z H F D D D D D H H H H H H H J J H L L L S P H H J H e * : ; r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r ; e r : r 0 ; ; ; : y : 0 0 r ; * * ; : ; ; r : : : * : 0 : * = ; y : : r : e ; ; ; ; ; ; ; 0 y r r r r r r r r ; = 0 ; ; 0 e ; ; = r r r r : : * ; r ; ; ; : e % e % % % $ $ % % % ; ; * ; r r r r r r r r r r r r r r r r r ; ; * % $     0 y.y.t.t.t.t.t.y.t.t.r.r.t.r.t.r.r.r.r.r.r.r.w.r.r.r.t.t.t.p.t.t.u.t.u.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.i.u.s.u.s.u.u.i.i.i.i.i.i.i.i.i.i.i.a.i.d.a.i.a.i.i.z.i.a.a.i.f.a.a.a.a.a.a.a.i.i.i.a.a.z.i.g.g.z.z.z.h.h.l.A.h.A.l.A.h.A.A.A.H.H.H.H.A.H.H.H.H.H.H.H.H.L.H.H.H.H.H.H.S.H.S.H.H.H.S.S.S.S.S.S.H.U.L.L.L.L.L.P.P.T.T.T.T.T.T.T.T.T.~.T.~.T.~.~.~.T.T.T./.T.~.~.T.~.T.~.T.T.T.T.T.T.T.T.T.Y.I.T.T.Y.U.U.Y.P.P.L.L.U.U.P.P.U.L.P.P.P.P.L.L.L.S.S.U.L.L.U.U.S.S.L.H.K.L.L.L.U.S.H.H.H.H.S.S.H.A.A.A.A.l.A.A.h.A.h.h.h.h.A.h.A.g.g.h.A.A.A.S.A.S.A.S.S.S.G.S.S.S.S.S.H.A.S.S.S.S.S.S.S.A.A.A.A.A./ ! ! CXAXDXAXFXFXFXFXFXFXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXDXAXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXZXBXQ.[ ! ! [ (.|.|.(.`.(.(.(.(.(.[.(.{./././.(.(.^./.{./.(.(._.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.[./.^.~.^.~.~.T.T.[.T.T.T.T.T.U.T.Y.P.T.T.P.P.Y.L.L.Y.L.Y.L.L.L.L.U.H.D.P.D.D.IXPXSXPXCXFXFXAXAXFXHXAXDXAXDXDXAXDXAXFXFXFXFXFXDXDXFXVXZXZXVXZXAXHXGXVXBXhXM.{ c h.h.A.h.A.A.A.g.A.g.A.A.A.A.H.H.H.H.A.J.h.G.S.S.S.S.S.G.G.S.A.H.G.H.S.Z.S.L.S.P.L.U.L.P.L.U.L.U.L.I.P.P.P.T.T.T.T.T.T.Y.P.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.T.Y.T.T.T.[.T.T.T.[.~.T.T.~.~.~.~.~.~.~./.~.[.!.^.(././.(./././.~.(.(./././.^./.{._._.}._._.}.}._._._._._._._._._._.`.(.(.(.(.(.|.(.(.(._.(.^.(.(.(.(.(.(.!.(././.(.^./.",
+"H H H H H H L Z H H L D D H D D D D D Z D D D D Z Z Z Z D A D D D Z D Z Z Z Z D Z F D D Z H Z D Z D D Z H H D H H H H H H H L L L H P P H H H P S * ; : * y t ; r r r r r r r r r r r r r r r r r 0 r 0 r r r ; r r r : r r 0 0 ; > : r : r ; : r r r r : : ; = r : 0 0 0 t q e ; ; : : r : e : r ; r 0 : : ; e t * r r * : r 0 * r r : ; r r r ; ; r : r 0 r r : : : = 0 ; 0 : ; * : * * % % - % > ; ; ; * ; = r r r r r y * r r r r r r r r r r 0 * % $ o     G y.y.t.t.r.t.t.r.t.r.t.r.r.t.r.r.r.r.r.r.r.r.r.r.r.r.r.t.t.t.u.u.t.t.u.u.t.u.u.u.u.r.u.u.u.u.u.i.u.u.u.u.u.u.i.i.i.i.i.s.i.s.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.f.a.i.k.i.k.i.a.a.a.a.a.a.s.a.i.a.a.a.a.g.a.j.j.z.l.l.l.l.z.A.l.h.A.A.h.H.A.S.A.H.H.D.H.H.H.H.H.S.S.A.S.H.G.L.H.H.H.H.H.H.H.H.H.H.L.S.L.S.H.H.L.S.L.L.L.L.T.P.T.P.T.T.~.T.~.T.T.~.~.Y.~.T.~.~.~.~./.T.~.~.T.~.T.~.T.T.!.Y.T.I.T.T.T.T.T.T.T.Y.L.L.U.U.U.P.U.T.U.U.U.Y.L.U.L.L.L.L.U.L.L.U.U.D.L.P.L.S.U.L.H.L.H.H.U.S.S.U.H.H.H.H.H.H.H.S.A.J.A.A.A.h.A.h.A.h.D.h.g.A.h.D.A.A.A.A.A.A.A.h.S.S.S.G.S.S.H.G.S.H.H.H.G.S.S.S.S.S.S.S.h.S.A.A.~ ! S CXAXDXAXFXFXFXFXFXFXFXAXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXDXAXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXGXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXZXZXBXm.{ ! ^ c.|.|.(.|.`.(.(.^.(.(.(.(.(.^.^././././.(.^.(./.(.(.(.(.(.(.(.(._.(.(.(.(.^.`.(.(.(.(.(.(.(.E.^.^./.~.~.~.~.T.T.T.T.T.T.T.Y.U.U.P.Y.P.Y.T.L.Y.U.U.U.U.U.L.U.U.L.L.L.L.P.D.x.GXGXGXGXHXFXDXFXAXZXZXAXAXAXAXAXAXAXAXAXVXVXFXVXAXAXAXAXFXAXFXFXFXVXVXVXBXaXM.n c A.A.h.A.A.A.h.A.A.H.h.H.A.A.H.A.A.H.H.G.G.G.S.S.S.S.S.S.S.H.G.H.H.H.L.S.L.L.L.U.D.L.L.L.P.U.U.I.U.L.P.P.T.P.T.P.Y.T.Y.T.~.T.T.T.T.T.T.Y.~.P.~.T.T.U.T.T.T.T.P.~.T.T.T.T.T.~.~.T.~.~.T.~.~.~././.^.^.~.~.~.(.~.~./././././.(.(.^././.(.(./.(.^._.}.[. X}._.}.|._._._._._.(._.(.`.^.(.(.(.{.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./.^././.!./.",
+"K H H H Z H H H D H Z H D H Z D D Z D Z D Z Z D H Z G Z Z Z D B Z Z Z Z Z Z H Z Z H H L Z Z H Z D F S Z H H H H H J H J H J J H L L P H U L L L K 0 % : * * r ; r r r : : 0 : r r r r r r r r r r r r r r r r r r r r r r r r e r r : r r r r r r r 0 r r r r r r r r r r r * y e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r * y ; ; * * % 0 * * * : r r 0 r r r r r r r r r 0 r r r r ; r r = 0 & $ o     $ y.t.t.t.t.t.t.t.t.r.t.r.t.t.t.r.t.t.t.t.y.t.t.r.t.t.t.u.u.t.i.u.u.u.u.t.r.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.i.i.i.i.i.i.i.a.i.a.i.a.a.i.a.i.s.i.i.a.a.s.a.i.i.a.a.f.a.z.s.a.f.a.a.a.a.a.a.a.g.k.a.g.k.g.k.h.h.h.l.l.S.z.H.A.A.A.A.j.A.S.S.A.G.G.S.H.H.S.S.H.D.D.G.H.H.H.L.H.H.H.H.H.H.L.S.L.H.L.S.S.S.A.H.S.U.L.T.T.T.T.T.T.T.~.~.T.~.I.~.~.!.~.~.~./.!.~./.~.T.~.~.T.~.~.T.T.~.T.T.U.U.I.T.T.T.T.T.T.T.T.U.U.U.U.U.T.U.U.U.U.T.U.U.P.U.P.P.L.L.L.L.S.P.S.L.U.U.S.U.S.L.L.L.S.L.S.Y.U.S.U.H.H.H.A.H.A.A.S.A.A.h.S.g.A.j.A.A.A.A.h.h.A.A.A.A.A.G.A.G.J.G.G.G.H.H.H.G.A.A.H.S.A.S.S.S.S.A.S.A.A.A.A.P / ! CXAXFXZXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXZXDXDXBXQ.} ! ! [ |.}.}.}.}.}.(.`.(.(.(.(.~.(.(./.(.~.~.(.(.(.(.(.(.(.(.(.(.(.(.(._.(.(.(.(._.(.(.(./.(.^.[./.!./.~.~.~.T.~.T.T.T.T.T.T.U.T.U.Y.U.P.U.P.P.P.Y.L.I.U.L.U.U.L.L.L.H.D.A.P.H.G.GXGXIXGXAXAXAXGXFXFXHXZXZXHXHXAXZXDXFXFXFXHXCXHXZXCXDXHXHXCXCXZXZXGXVXHXJXpXM.c x A.A.A.G.A.A.A.H.A.G.A.A.G.A.A.G.H.G.G.H.G.S.S.S.S.S.S.S.H.H.H.H.H.L.L.L.L.L.L.L.L.L.I.U.L.L.U.U.Y.T.T.Y.Y.T.T.T.I.T.~.Y.T.T.T.T.T.T.~.~.T.T.T.T.T.T.T.T.T.T.T.T.(.T.T.T./.T.~.~.!.~.!.~./././././.^.!.(.(./.(././.^.(.(.(.(.(.(.(././.(.E.{.^._._._._._.{.|._.}._._._._._._._._._.(._._._._._.^.(.(.}.(.(.(.!.`.^./.(.[.(./././.[.(.",
+"H H H H H H H H H H H Z H Z D D Z D Z D F Z Z D Z Z H Z Z Z Z G Z Z L Z Z Z Z H H Z Z H G Z Z G Z Z Z L Z H H H H H H Z H H J J P J L P L L L L H S * % % * = ; r r r r * y r r r r r r r r r r r r r r 0 r r r r r : r r r r r e r r r r r r r r r e r r r r r r r r r r r : r 0 r r r r r r 0 r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r 0 e r r r r r r r r r r t ; ; ; : ; r % 0 * r 0 r r r r r r 0 e r r r r r 0 r ; r r ; r 0 * % $       w.t.t.t.t.r.t.t.t.t.t.t.t.t.r.t.r.t.t.t.r.t.r.r.r.t.t.t.t.t.u.t.u.u.i.E u.u.r.u.u.t.u.u.u.u.u.u.t.u.u.u.u.u.i.i.u.i.i.i.i.i.i.i.i.a.a.i.a.i.i.a.a.a.i.a.i.a.i.a.a.i.x.a.a.i.i.a.a.a.a.a.a.a.a.a.a.a.f.f.i.g.g.z.g.z.A.h.l.l.h.l.l.g.A.A.A.A.H.A.S.H.G.S.G.S.S.G.G.H.H.D.H.H.H.H.S.H.H.H.H.L.H.H.Y.H.S.L.L.L.L.U.L.L.L.U.P.L.T.T.T.T.T.T.~.~.T.~.~.~.~.~.~.~.~.~.~.~.~.~.~.T.~.T.T.~.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.U.~.T.T.T.E.U.U.U.P.T.T.U.P.U.P.U.U.L.P.P.P.S.L.S.L.D.S.L.L.U.L.U.L.S.L.S.S.L.L.H.H.H.H.G.A.H.G.A.A.h.A.A.A.A.h.A.h.A.A.j.A.A.A.A.A.A.A.h.H.h.A.S.A.H.Z.G.A.H.S.S.S.S.S.S.S.A.S.A.A.A./ ! ! BXAXFXFXZXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXZXZXBXpX[ Q ^ [ |. X}.}.[.}.^.`.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(._.(.(.(.(._.(.(.(.(.(.(.(.(././././././.~.(.T.~.T.T.~.P.T.T.T.U.U.U.P.P.P.P.U.U.Y.P.L.U.U.L.L.U.K.Y.L.L.P.L.G.H.J.DXHXHXVXBXfXBXgXBXfXJXBXJXBXHXfXfXJXgXBXJXHXBXJXfXgXBXBXJXfXJXJXBXfXgXhXsX[ c t w z.A.A.A.A.A.A.h.A.A.A.G.A.G.H.A.H.H.H.G.H.G.H.S.D.H.S.H.H.G.H.S.H.H.S.L.L.P.L.P.T.L.I.Y.U.U.I.L.I.I.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.!.T.~.T.~.T.~.T.U.[.T.T.T.T.T.T.T././.T.!.!.~.~.~././././.^././.(.(./.(././.(.[.(.(.(.(.(.(././.(.^.(.(.(.(.|.|.(.|._.|._.[.}._.}.`.|._._._._._._.(._.(.`.^.|.(.^._.^.(.(.(.(.(.(./././././.[.~.(.",
+"D H H H H H Z Z Z H Z J D D D D Z Z Z D Z D Z D D Z D Z D D Z Z G Z Z L L Z Z G Z D D Z D D D Z Z H D D L H H H H H H Y H J J J L L L L P L P L H P > % : % ; * e r r r t ; r r r r r r e r r r r r r r r r r r r r 0 r r r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r : 0 r e r r r r e r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r r ; r ; r : r : r r r r r r : = r r r r r r r r r r r r r r r r r % % $ o   # q t.t.t.t.t.t.t.t.t.t.t.t.u.t.t.t.t.t.t.t.t.t.t.t.t.t.p.t.u.u.u.u.t.u.E t.u.t.u.u.u.s.u.u.u.p.p.u.u.u.u.u.u.i.u.u.i.i.i.i.i.d.a.a.i.i.f.a.i.i.i.a.i.a.i.a.a.a.a.a.a.f.a.a.a.a.a.a.a.f.a.a.f.a.a.a.a.a.a.a.a.k.k.g.h.h.h.h.h.h.l.l.l.A.A.A.A.A.A.A.A.G.A.S.h.G.S.A.G.S.S.H.S.H.H.H.H.H.H.H.H.H.S.H.L.H.L.S.L.L.L.L.L.L.U.L.P.Y.U.T.T.T.~.~.~.~.T.~.~.T.[.~.~.~./.~./.~.~.~.T.~.~.T./.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.P.T.T.T.T.P.P.P.U.L.Y.L.P.L.P.P.Y.L.L.L.U.L.L.S.L.S.L.L.L.L.L.L.U.S.H.Z.A.H.A.A.H.A.h.S.H.A.A.A.A.A.A.h.h.A.A.A.A.G.A.G.A.A.A.G.S.S.S.S.H.H.H.A.S.J.S.S.A.S.S.S.A.A.A.A.S / S CXFXFXFXAXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXAXAXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXZXZXZXBXm.{ Q ^ [ |.}.}.|.`.`.^.(.(.(.(.(.(.(.(.(./././.(.(.(.^.(.(.(.(._.(.(._.(.(.(./.(.(.(.(./.(.(././././.~.T.T.~.T.T.~.Y.T.P.T.T.T.T.P.U.U.L.P.P.P.Y.U.U.U.U.L.L.L.L.H.L.L.L.H.Z.L.G.G.CXBXJXaXm.M.M.m.M.M.pXM.M.M.m.M.pXpXM.M.m.M.pXM.M.M.M.m.pXM.pXM.M.M.M.M.b c w w z A.G.W.A.G.A.A.A.h.J.S.S.G.H.H.H.H.H.H.H.H.G.A.H.G.S.H.G.H.H.H.H.H.S.L.P.P.P.L.L.L.U.U.U.Y.T.T.I.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.~.T.T.T.~.T.T.T.~.XXT.T.^.P.T.E.~.T.T.~.~.~.~.(./././././.(.(./.(./.(.(.(.(._.(.(.(.(.(._.(.(.(.(.(.(.(.(.(.(.^.^._.^.|.|._.|.}.}.}.`.{. X_._._._.|.{._._._.|.^.|._._.!.(.(.(.(.(.(././././././././.",
+"Z H H H Z D H H H Z L Z D D D Z Z Z Z Z Z Z Z Z F Z Z D D Z G Z Z Z Z G Z Z Z Z Z D D Z Z D D D Z H Z Z Z H H Z Z P H P H H J J P L J P P J L P P L F * % - % ; 0 r : r * 0 r ; r r : r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r : : y r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r : e r r r r r * r r r r r r r r r r ; r r y r r 0 * % &       $ s.r.t.t.t.t.t.r.t.t.t.t.t.t.u.u.t.t.t.t.t.t.t.t.t.t.t.p.u.t.u.t.u.t.u.i.u.u.u.t.u.u.t.u.t.u.t.u.t.u.u.u.u.u.u.i.i.u.i.i.i.i.a.i.i.i.i.a.a.i.a.i.i.i.i.i.a.i.a.a.k.a.a.a.f.a.a.a.g.a.a.a.a.g.a.a.a.a.a.z.z.j.g.k.g.h.h.h.h.l.l.l.l.l.h.h.g.G.h.A.A.h.A.A.S.S.A.A.A.A.S.S.S.H.H.H.H.G.H.H.H.H.H.H.L.H.L.H.L.L.L.L.K.L.P.P.P.P.U.T.T.T.~.T.~.T.~.~.~.~.~.!.~.~.!./.~.[.~.~.~.~.~.~.T.T.~.~.~.T.~.T.T.T.T.~.T.T.T.Y.T.T.T.~.T.~.~.T.XXU.T.T.T.T.T.T.P.T.Y.U.P.L.U.L.P.P.U.L.U.U.S.L.L.L.S.L.L.L.L.L.L.S.H.H.H.H.H.H.H.S.H.A.S.A.A.A.A.A.A.h.A.h.A.A.A.A.A.A.A.A.G.G.A.A.S.S.S.S.G.A.A.H.S.h.S.S.S.S.S.h.S.A.A.A./ ! ! CXZXFXFXZXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXSXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXFXZXHXZXMXm.[ Q ~ c.|.}.}._._.^.^.^.(.(.(./././.)./.(.(.(./.{./.(.(.(.(._.(._._._._._.^.|.(.(.(.(.(./.(././.~.~.~.~.~.T.T.~.T.~.T.T.T.T.U.T.P.T.T.U.Y.P.P.P.L.L.U.L.L.L.L.L.L.L.G.H.H.L.H.G.Z.JXhXm.M.{ c n n c c c n c c c n c c ' c n c c n { c c n n c c n c c c n w w w l f G.A.G.A.Z.G.H.H.Z.A.S.H.A.H.H.S.H.H.H.S.H.H.H.H.H.H.H.H.S.H.H.H.U.L.Y.L.P.L.Y.L.P.Y.T.U.I.T.I.T.T.T.T.Y.T.T.T.T.Y.~.~.Y.T.~.~.T.~.T.~.T.T.~.~.~.XXU.~.~.P.^.XXT.~.~.(.~.~.~.(./././.^.(.^.(.(.(.(.(._._.(.(.(.(.(.{.(.(.(.(.(.(.(.(.(.(.^.(.(.^._._.|.[._.|.}.}.}.}.`._.|. X}.|._.`.|._._._.(.`.(.|._._.(.(.(.(./.^.[././.(./.(././.",
+"Z H H Z H Z H P Z F D D Z Z Z Z D Z Z D F D Z Z Z Z D Z Z Z Z Z L Z Z Z G Z Z Z Z D Z H D Z G Z D D H H Z H Z H H P H H H L L P P H J J P H J P P L L u % % % % % ; r ; y = y : r r r r r r r r r r ; e 0 r r r r r r r r r r r r r r r r r r r r r r r r r e 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r e 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r : r r r ; r r 0 r * % % % o       T t.t.t.t.t.t.u.t.t.t.t.t.t.t.t.u.t.u.p.t.t.u.t.t.u.t.t.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.u.u.u.u.i.i.i.u.i.d.i.i.a.i.a.a.a.i.a.a.a.a.i.a.a.i.a.a.a.a.a.i.a.a.k.a.a.a.a.a.f.a.a.a.a.a.z.k.z.i.f.f.a.f.g.h.h.h.h.h.l.l.h.l.h.l.l.l.A.j.S.A.A.h.S.S.H.A.A.A.z.A.A.S.S.G.G.G.S.H.S.H.L.G.H.L.H.L.L.L.L.L.Y.U.T.P.T.U.U.U.Y.~.T./././.!././.!.~.~.~./.~./././.~.~.~.~.R.~.~.~.T.~.T.T.~.T.T.~.~.Y.T.T.Y.T.T.T.T.T.~.T.~.T.T.T.T.T.T.T.T.T.T.T.U.U.Y.U.U.U.U.U.L.Y.Y.L.P.L.L.S.L.L.S.L.S.L.L.S.L.S.L.H.H.H.H.H.S.S.A.S.S.A.A.A.A.A.A.A.h.A.A.A.Z.G.A.A.A.A.G.A.S.S.S.S.S.S.S.S.H.S.S.S.S.S.A.S.A.A.H.g.~ ~ ! CXZXFXAXAXFXFXAXGXGXDXDXAXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXDXDXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXDXDXBXQ.} Q ~ [ }.}.}._.`.`.`.(.(.(.(.(.(.(.(.(.(.(.(.(./.(././.(.(.(._._._._._.(.(.|.(.(.(.^.(././././.^.~.T.T.T.T.T.T.T.T.~.Y.T.T.T.P.P.P.T.P.U.Y.L.L.L.L.U.L.L.L.L.L.U.D.L.U.P.D.S.S.L.].M.c x x l w z t z e w w z u w z w w w l w z w w z w d w z & - - w z w z z t Y n.A.G.G.G.Z.G.A.H.G.h.S.S.H.H.H.H.H.H.H.H.H.H.H.H.H.H.G.G.G.S.S.H.L.L.U.U.U.U.T.P.T.P.T.P.T.T.Y.T.T.T.T.T.T.T.~.Y.~.I.T.T.I.~.T.T.T.~.T.~.T.~.~.~.T.~.~.T.~.~.~.~.~.~.[./.~./.(.^.^.(.(.(.(.(.(.(.`.`._._._._.|.^.(.(.{.(.{.^.(.(.(.^.`.(.`.(.(.^.(.`.^.`._._.|.}.|.'. X}. X}. X}.|.}._.|._._.|.(.^.|._.(.(.`.^.(.(./.^./.[.(./.(.^./.",
+"H J Z H Z G Z Z Z D D D H Z Z Z D Z Z C Z B Z Z Z Z Z C Z Z Z Z Z Z Z L Z Z Z Z D Z H Z Z D Z Z D D D Z H H H H H H H P H J L P J J P P P J P J U L L S q $ & % * ; ; e ; : y * r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r r r r r r r r r r r y r r r r r q r r r r r : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r 0 r : 0 r : r r ; r r r r r * y r r ; r r r r = % $ o   #   B u.E t.t.t.u.t.t.t.u.t.u.u.t.u.u.t.u.t.t.u.s.t.s.u.u.r.u.u.u.u.u.r.u.u.u.t.u.u.u.u.E i.u.t.u.t.u.t.u.u.u.u.u.u.i.u.i.i.i.i.i.i.a.i.i.a.i.a.a.i.a.a.i.a.i.i.a.a.a.a.i.z.a.a.a.a.a.a.k.f.a.f.f.a.f.a.a.a.a.f.f.g.g.g.g.h.g.z.h.h.h.h.h.h.h.h.l.h.A.A.j.A.A.A.A.h.h.A.h.A.h.A.G.S.G.G.G.S.H.H.H.H.H.H.L.H.L.L.S.L.L.U.Y.U.U.T.U.T.T.T.T.T.~.T.T./././././.!.[.~.!././.~.!.~.~.~./.~./.~.T.T.~.~.T.~.T.T.~.T.~.~.T.T.~.T.~.~.~.T.~.T.~.T.~.~.~.T.~.T.T.T.T.T.T.T.Y.T.T.I.U.U.L.U.U.L.L.S.L.L.L.L.L.U.L.L.L.K.H.H.L.L.H.H.H.H.S.S.S.S.S.S.A.h.A.A.A.A.A.A.A.A.A.A.G.A.A.A.G.A.S.Z.A.A.Z.S.S.S.S.S.S.S.H.Z.G.S.A.S.A.~ Q ! CXZXFXAXFXFXZXDXAXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXSXDXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXSXGXAXDXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXDXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXZXDXDXBXpX[ / Q [  X}.}._.(.(.(.^.(.(.(.(.(.(.(.(.(.~.(.(.(./.(.(.(.(._.(._._._._.^.{.^.|.|.(.(.(././././.~.~.~.T.T.T.T.T.T.T.T.T.T.P.T.T.P.T.P.P.L.Y.L.L.Y.L.L.L.U.U.U.L.L.H.F.S.D.L.L.H.S.S.b.' w w w w w z w z l w w h z w w l t - z w z w w n w z w n z u z w z w w ` Z.G.G.z.G.G.G.G.G.A.Z.G.H.S.G.H.H.H.H.H.H.H.H.H.S.H.H.H.L.G.H.H.H.D.L.U.L.L.U.P.P.P.P.T.T.T.T.T.T.~.T.~.~.T.T.~.U.~.~.Y.~.I.~.~.T.~.T.T.T.T.~.T.T.~.~.T.~.^./.~.~.~.~.~.T.^././.(.(./.(.(.(._.(.`.`.`.(._._._._.(.|._.(.(.(.`.(._.(.(.|.^.(.^.(.`.(.(.^._._.|._.}.}._.|.}.}.}.}.|. X}.|.`.|._.|.`._.`._._.`.(.^.(.(.(./.[./././././.(.^.",
+"L D Z H D D D D D D D Z D C Z H D B Z Z C Z C Z B Z Z Z Z Z Z Z Z Z Z Z Z Z H G Z G Z Z Z D Z H D D D H H H H H Z P H U H U H J J P P P J P P H P P L L I ; % & % % * ; r r : r r r r r r r r r r r r r r r r r r r r r r e 0 r 0 e r r r r r r r r r r r r r r r r r 0 r r : * r r r r r e r r r r r r 0 r r r r : r r r r r r r e r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r = = r r r r r r r r r r r r r r ; r r ; ; % $ $       * t.t.u.t.u.t.t.t.u.t.t.t.u.t.t.u.u.t.u.u.t.u.t.u.t.u.p.p.u.u.u.t.p.u.u.u.i.u.u.u.u.u.u.u.t.u.u.u.u.t.u.t.r.u.u.i.u.i.i.u.i.i.i.d.i.a.k.i.a.i.i.a.a.a.a.a.a.i.a.a.i.z.i.g.a.a.a.a.a.a.a.f.z.a.a.a.k.a.f.a.g.a.f.f.f.g.g.h.z.h.h.h.l.z.h.h.h.h.h.l.h.h.A.h.A.z.S.h.A.h.j.h.A.A.S.A.A.S.S.S.H.H.H.L.L.H.L.H.L.L.U.U.U.U.T.U.T.U.T.U.T.Y.T.~.~././.~././././.^.^././././.~./.(.~.~.~.~.~.R.(.~.T.~.T.T.T.~.T.~.T.~.T.~.T.~.~.~.T.T./.~.~.~.R.T.T.~.T.~.T.T.T.T.T.Y.U.T.U.Y.T.P.Y.L.U.Y.L.P.D.L.L.L.L.U.L.Y.L.L.H.L.H.L.L.H.S.H.H.H.H.H.S.S.S.A.A.A.A.A.G.A.G.A.A.A.A.Z.G.G.A.H.H.Z.h.S.S.S.A.S.S.S.S.S.A.H.A.A.S.h.A./ ~ ~ CXZXFXZXFXZXFXFXDXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXAXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXZXDXDXCXBXQ.{ Q ^ c.|._.|._.`.^.^.(.(.`.`.(.^.(.^.(.{.[.~.{.^.(.(.{.(.(.(._._._._._.(.`._.(.(.(.(.(././.!.~.~.T.~.P.T.T.T.T.T.T.T.T.T.T.T.P.T.T.P.T.U.Y.U.Y.L.L.L.Y.L.U.L.L.S.L.L.S.G.H.H.H.S.L.L.H.Y.H.G.A.A.S.S.S.S.S.D.S.A.A.A.H.S.S.S.L.D.L.D.D.L.L.L.H.K.S.L.S.U.S.H.P.G.S.F.L.G.G.G.G.H.H.G.H.G.H.H.H.H.S.H.H.H.H.H.H.H.H.H.H.H.L.L.L.S.U.L.L.L.Y.P.P.U.U.T.T.Y.Y.T.T.~.~.~.T.T.~.~.~.T.~.T.~.I.~.T.~.~.T.T.T.~.T.T.~.~.~.(.~./././.T.~.~.~.(././././.(.(.(.^._._.|._._.|.`.(._._._._.{.`.|.^.|.^.^.(.(.(.`.{._.(.(.(.(.^.(.(.{.}._.}.}.}._._.|.|.@X}.|.|. X|.|.|.|._._._._._._.`.^.^.(.(.(./.(./.(.(.[./././.",
+"D D H Z D D D Z D D Z D D Z F Z Z C Z C D Z Z Z D Z Z C C D Z Z Z Z Z Z Z H Z Z Z Z Z G Z Z H Z D Z H H D H U H H H H P P H P J H P P P P P P J P P L L P S % $ $ % % * : * r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r : r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r * r : r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 y t r : r r r q r r r r r r r r ; r 0 * % & $       % r.t.u.t.t.t.u.t.u.t.t.u.t.u.s.u.u.u.u.u.u.i.u.u.u.u.s.u.u.u.u.p.u.u.i.u.u.u.u.u.u.u.i.E t.u.u.t.u.u.u.u.p.u.u.u.u.u.i.i.a.i.i.i.a.i.i.i.i.a.a.a.a.a.a.a.a.a.a.a.a.i.a.a.i.z.a.k.a.a.z.a.k.a.a.a.z.i.f.f.k.f.g.f.g.j.g.h.j.l.g.z.g.z.z.h.l.h.h.h.h.h.g.j.Z.A.h.h.S.h.A.A.A.A.A.A.S.A.S.S.G.H.H.H.H.L.G.L.L.L.L.P.P.U.U.U.T.U.T.T.T.T.T.~.T.T./.~.~././././.!./././././.^././.~.(.~.~.~.~.T.T.~.T.~.T.~.T.T.~.T.T.~.T.~.~.T.~.T./.T.~././.~.^.^.~.~.T.~.T.T.T.T.T.T.T.T.T.T.Y.P.L.U.P.L.P.P.F.L.L.L.U.L.L.L.L.L.L.L.L.L.L.L.H.H.H.H.S.S.S.S.W.G.A.A.A.A.G.h.W.A.A.A.h.A.G.A.h.Z.G.S.A.S.S.S.h.S.A.S.A.H.A.A.Z.h.S.A.~ ~ S ZXZXFXAXFXFXDXDXAXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXGXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXDXZXZXDXHXm.[ Q Q [ _.|._._._.`.`.^.`.`.^.(.`.(.(.(.^.(.(.(.^.^.^.E.(.(._.(._._._._.{.{.|.{.|.^.(././././.!.~.~.T.T.T.T.T.T.T.T.T.T.T.T.P.T.T.P.T.Y.Y.P.U.L.U.U.J.K.L.L.S.L.L.L.S.S.L.H.D.H.S.H.H.G.Y.S.H.H.S.S.S.S.Z.D.S.S.A.H.H.H.H.F.S.S.U.L.L.S.L.L.S.L.L.L.L.U.S.T.H.D.L.G.D.A.H.Z.H.G.H.H.H.H.K.A.H.H.H.A.H.H.H.H.H.H.S.H.L.H.L.U.S.L.S.L.L.P.L.U.Y.P.U.T.T.P.T.T.^.T.~.T.T.~.~.~.T.~.~.T.~.I.Y.~.Y.~.T.P.~.~.T.T.~.T.~.~.~.~././././.(.~.~.~./.(.(.^.(.(.(.[.}.|._.|._._. X|.|.|.|._._.`._.(._.`.(.|.`.(.(.|.(.|.(.(.(.`.(.(._.^._.}.}.}.|._.`.|.|.|..X.X|.|.|.|.|.|._._._._._.^.^.`.(.(.(././.(.[./.(./.[.~.",
+"G D D D G D D D Z G Z D D Z Z Z Z Z Z Z D C Z C Z Z C C Z Z Z Z C Z C Z Z Z Z Z D D D H D Z Z G Z Z H H H H H H P H Y J H P J H P P L P J P J J P H P J D I S % $ $ % % ; : ; ; : r r r r r r r r r r r r r : r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r 0 r r r r r r r e r r r r r r r e r r r r r r r r r r r * r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r 0 : r 0 r r r r : y y : : r y 0 * % $ o       $ y.u.r.a.r.u.u.u.u.t.u.s.t.u.t.u.p.t.u.u.u.u.p.i.u.p.u.p.i.t.p.p.i.u.u.u.s.i.u.u.u.u.u.u.t.u.u.t.u.t.u.t.u.E i.u.u.u.i.i.i.i.i.i.i.i.d.d.i.i.a.a.a.a.a.a.a.a.j.d.d.a.a.f.i.a.z.i.s.f.a.f.f.f.s.a.a.a.f.a.a.f.f.f.z.j.j.f.f.z.g.h.l.l.k.k.h.h.h.h.l.l.h.l.h.l.l.l.l.l.h.A.A.h.A.A.A.A.A.A.A.S.H.A.H.H.L.L.H.L.L.L.U.L.P.P.T.T.T.T.T.T.~.T.~.~.!.~.~././.(.^././.(././.^./.~././.~./.~.!.~.!.R.T.T.~.T.T.T.~.T.T.T.T.~.~.~.~.~.T.~.~.(.~.~.[.~.~.~.~.~.~.~.Y.~.R.~.R.T.T.T.T.T.U.T.Y.U.U.U.L.L.I.L.L.L.U.U.Y.P.U.L.L.L.L.L.L.L.P.L.L.S.S.S.H.A.G.G.G.A.G.G.A.h.A.S.Z.j.A.G.A.S.G.h.G.A.G.A.A.A.S.H.z.h.A.A.A.A.A.A.A.z.S ! ! CXAXFXAXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXDXAXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXSXDXDXAXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXDXAXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXVXZXZXBXm.} ~ ! [ '..X|.|.|._.|._.|.^.`.^.).{.`.(.(.{.(.(.(.(.(.(.(.(.(.(._.(.`.{.`.(.|.(.(.(.(.(.(.~.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.P.T.P.P.Y.U.U.P.P.P.L.L.L.L.L.L.L.L.S.S.H.L.L.G.H.H.H.H.G.H.H.H.G.S.A.H.S.G.A.S.S.S.S.S.S.U.H.H.H.S.U.U.L.L.L.L.L.L.L.L.L.L.L.L.D.Y.L.D.H.S.L.S.S.K.U.S.L.Y.L.S.S.U.L.S.S.L.H.H.K.L.L.L.L.H.L.L.A.L.L.U.P.P.P.P.P.T.T.T.T.T.T.[.~.~.T.~.~.T.~.[.T.~.U.T.T.~.T.T.T.XX~.T.T.~.~.~.[.T.(.(././.!./././.(.~.(.(.(.(.`.^.`.|.|._._.|.|.'.'.|.|.|._.|._.|._._.(.(.`._.(.|.{.^.{.(.{.(.^.(.|.(.`.`.|._._._.|. X'. X|..X|. X.X'.|.|.|.|._._._._._.(.`.(.(.(.(./.(./.(././././.~.",
+"D D Z G Z D Z Z D D Z Z Z Z Z Z G B C Z C Z C D Z C Z Z Z C C Z Z Z Z D Z Z Z G D Z Z Z Z D D Z Z H H Z H H H H H H H J H J J J H P P P J P P P H P P P P J J Z % $ $ & - % ; * r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r t * : : r r r r r r r r r r r r r r r e r y r r r r r r r r r r r r r r q e r r r r r r r r r r r r r r r r r r r r r r r r : = r r ; y r * : % % $         $ T i.r.u.r.u.t.t.u.t.u.u.r.t.u.u.u.u.p.p.u.u.u.u.u.u.u.u.u.u.u.u.u.t.u.u.u.p.p.u.u.u.u.u.t.u.u.u.u.t.u.t.u.u.t.u.u.u.i.u.i.i.i.i.i.d.z.i.z.z.a.a.a.a.a.a.z.a.a.i.d.a.g.f.a.a.i.g.a.g.a.f.s.f.a.z.a.k.k.a.k.k.f.f.g.f.f.f.g.h.f.f.h.k.z.h.h.h.h.h.h.h.h.h.h.h.h.l.l.l.l.A.g.h.A.A.A.A.A.A.A.S.S.H.H.H.H.H.S.L.L.U.U.L.Y.Y.P.Y.T.T.T.T.T.T.~.T.!.~././././././.(.(.(.(.(.(.~././././.~././.~.~.~.[.~.T.T.~.~.T.~.~.~.T.~.~.T.T.~.~.~.~.~.~.[.~.~.(.~./.~.~.~.~.~.~.R.T.T.T.T.T.T.T.T.T.U.U.U.L.Y.L.U.U.U.L.U.P.P.L.U.U.U.U.L.U.L.P.S.S.L.S.L.H.H.G.G.G.Z.A.G.A.J.S.A.S.A.A.A.h.G.A.S.A.A.A.A.A.G.S.A.A.A.A.A.A.A.A.h.A.S./ ! ! SXFXFXAXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXAXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXDXDXAXDXAXDXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXDXMXm.[ Q _ { |.|.|.|._.|.|.|._._.`.|.|._.{.^.(.(.(.(.(.(.^.(.`./.(.(.(.`.`.{.|.^.(.(.(.^./.(.~./.~.T.T.~.~.T.T.T.T.T.T.T.T.T.T.P.T.T.T.T.P.T.U.U.P.P.P.L.U.L.L.L.S.L.L.L.L.L.L.H.L.L.L.L.H.H.G.H.G.A.G.S.H.S.H.H.H.S.S.S.S.S.L.S.H.H.H.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.A.L.A.P.H.U.S.L.U.S.L.U.G.H.H.L.H.D.L.S.H.H.H.H.S.S.S.L.L.L.L.L.P.U.Y.U.P.P.P.T.T.P.T.T.T.T.T.T.T.~.[.T.T.~.~.T.~.~.~.~.T.~.~.T.XXE.T.T.T.~.T.~.~.(.(.T././././././.~./.(.(.(.(.(.|.|.(._.|.|.|.|. X X|..X|. X|._.|.|._._.|.`.^._.^.(.|.{.(.(._.^.^.`.^.`.(._.|.|. X|.|.|..X'.|. X|.|.|.|.|.|.|.`.|._._.(.(./.(./.(.(./././.[././././.(.",
+"H H Z D Z G Z Z D D D Z Z Z D Z Z Z C Z C Z Z C C Z C D B Z Z C C Z Z Z Z Z Z Z Z Z Z Z D Z G D D Z D H Z H G H H P P H L P J J P J P H J J P P J P H P J H H H K % o $ $ % ; ; ; r r 0 0 ; r r r r r r r r 0 r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r r r r 0 y 0 y r r r 0 r r r r r r r r 0 r r r r : r r r r r r r r r r r r r r r r r e r r : r r r r r r r r r r r r r r r r r r r : r : : ; : ; : % ; $ o   #   = p.p.p.u.r.t.u.u.u.u.u.u.u.u.u.u.u.p.u.u.t.u.u.u.u.p.i.u.u.u.p.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.u.u.u.u.u.i.u.i.i.i.a.a.d.i.z.i.a.a.a.a.a.z.i.k.i.a.g.f.a.a.a.z.z.i.a.k.a.j.a.k.a.a.f.a.f.f.f.f.k.g.j.g.f.g.f.f.k.h.h.k.l.h.h.h.h.h.h.h.h.h.h.h.h.l.l.l.A.h.A.A.h.A.A.A.A.A.S.S.S.A.G.H.S.H.L.L.L.L.U.L.U.P.P.T.Y.T.T.T.T.T.~.~.~././././.(.(.^.(.(.(.(.^.(.^.[.E./././.~./.~.~.~.T.~.T.~.T.~.~.T.(.T.~.T./.E.[.U.~.~.T.~./.(.(.[.~./.^.~.~.~.~.~.~.T.~.T.T.T.T.T.T.T.T.U.T.U.I.I.T.U.U.U.U.U.L.P.U.L.Y.L.Y.L.L.L.L.L.L.D.L.H.H.H.G.Z.G.G.H.A.G.h.H.S.H.A.A.A.A.G.A.A.A.G.G.A.A.G.z.A.A.A.A.A.A.h.g.A.A.h.~ / ! BXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXDXAXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXDXAXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXGXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXSXDXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXDXAXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXDXBXQ.{ / Q [ .X X'.|.|.{._.|.|.|.|.[.`.`._.|.(.(.|.(.(._._.(.(.(.(.|.(.|.(.{._._.^.^.(.(./.(././.(.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.P.T.T.P.T.P.U.U.L.U.L.L.L.L.L.L.L.L.L.L.L.S.S.L.L.G.L.H.S.H.H.H.G.K.L.A.H.H.S.S.H.H.S.H.H.H.S.S.H.S.S.S.S.L.L.U.P.U.L.U.L.L.P.L.L.L.L.L.S.L.U.S.Z.L.S.U.L.S.L.H.L.S.U.S.S.L.H.H.H.L.D.U.L.L.L.L.U.L.U.U.U.L.P.P.T.P.T.T.T.T.~.T.^.P.[.T.~.~.^.~.~.~.T.~.T.~.~.T.~.T.U.T.~.T.~.~.~.~././.T././././.!./.(./././.(.(.(.^.|.|._._.|.|.|.|..X|..X|.|.|._.|._. X}.^._.[.}._.|.^.^._.(._.(.[.|._.}.`._._._.|.|.|._..X|.|..X.X|..X.X|.|.|.|._._.`.`.(._.`.(.(./././././.(./././.~.T.",
+"Z Z Z D Z Z H H D Z Z Z Z Z D D Z H Z C Z Z C Z C C Z B C C Z Z Z C C C Z Z Z Z Z Z Z Z Z D Z Z D D L Z L H L H H H U P H J J P L P P P J Y K P J J J H P J J J P u : o $ $ % $ % * ; ; r ; 0 r r r r r 0 r ; r r r r r r r r r r r : r r r r r e q r r r r r r r r r r r r r r r r r : : r r r r r r r r r : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r q r r r r r r e r r r r r r r r r : q r * 0 ; : % % & o         * w.i.t.u.u.u.u.t.u.u.t.u.t.t.u.t.u.u.u.t.u.u.u.u.u.u.t.u.u.u.u.i.t.u.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.u.u.u.u.u.u.u.u.u.i.u.i.i.i.i.a.a.a.i.a.i.a.a.a.z.a.i.i.z.z.g.a.g.d.z.i.i.i.g.i.i.g.a.a.k.a.f.a.f.k.f.f.f.a.a.a.j.g.g.g.f.h.f.h.h.l.z.h.h.h.h.z.h.h.l.l.l.l.l.l.l.h.A.A.h.A.j.A.A.A.A.S.S.A.S.H.H.H.L.S.H.K.Y.Y.L.U.P.Y.T.T.T.T.~.~.[.!.~.~././.(.(.(.(.(.(.(.(.(.(.(.(.(.[././././.~./.~./.T.[.~.~.T.~.~.T.T.~.~.~.U.(.U.T.~.~.~.~.~.~.~.~.(././.^.~./.~.~.~.~.T.~.T.T.~.T.T.Y.T.U.U.U.T.T.U.U.T.U.U.L.P.P.L.U.U.U.K.L.Y.U.P.L.U.P.L.D.H.H.G.H.G.H.A.H.H.A.h.H.A.A.H.A.H.A.S.A.A.A.A.A.A.h.G.A.G.A.A.S.j.A.h.A.A.h.~ ~ ! SXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXAXDXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXGXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXAXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXSXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXDXBXpX[ / S [ @X X.X X.X|._.|.|._._._.^.|.^.(.(.^.(.(.(.(.(.(.(.(.(.^.(.`.{.(.(.`.(.|.(.(././.(.!.!.T.T.T.T.T.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.U.U.L.L.L.L.L.L.S.L.L.L.L.L.L.L.H.L.H.L.L.L.H.H.H.H.S.H.S.S.G.S.S.H.S.H.H.H.L.U.L.U.L.U.L.L.Y.U.P.U.P.P.P.U.U.P.L.U.L.P.L.L.L.H.H.L.S.L.L.L.L.L.I.L.L.L.L.P.S.H.H.L.L.L.L.S.L.L.L.U.P.L.Y.L.U.P.T.P.T.T.T.T.T.T.T.T.T.T.~.T.T.~.~.T.(.~.~.~.~.~.T.~.T.T.~.~.T.~.T.~.~.T./././.(./././././.(.(.(.(./.(.(.(.{._.|.|.|..X|..X.X|.|.|.|.@X|._. X}.|._.|.}.(._.|.|.{._._._.}.}.}.}.(.|.|._.|.|.'._.|.|.|.|.|.|.|._.|.|.|._._._.(.(.(.(.(.(./././././././.T./././.~.",
+"Z L Z Z Z H Z Z G Z C Z Z Z Z F Z Z Z Z Z B D C D C Z D Z Z Z C C Z Z C C Z Z Z Z Z Z Z Z D Z D D Z L Z Z Z H L H P H H J J J P P K L P P P I H J J P L H U P Z H P H 0 $ $ $ $ % % * : : r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r * r r r r r r r r : r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r * 0 r r r r r r r r r r r r r r r r r r r 0 r : : r r r r r r r r r 0 ; ; * % $ o         B p.i.t.i.u.u.u.t.p.p.u.u.t.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.t.p.t.u.u.t.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.t.p.u.u.u.u.u.i.i.u.i.a.i.d.d.a.a.a.z.a.f.i.i.f.z.f.k.k.a.f.f.g.a.k.f.a.s.j.a.f.a.s.g.s.a.a.z.k.k.z.k.a.j.f.f.f.g.g.j.f.f.z.z.l.h.h.h.l.h.h.h.d.h.h.h.g.l.l.l.l.A.l.z.A.A.A.A.A.A.A.H.S.S.H.S.H.S.L.L.L.L.L.P.Y.Y.U.T.T.~.T.~.R.~.~.^.!.(.(.(.^.(.(.(.(.(.(.(.(.(.(.(.(././././.~.~.^.!.~.T.~.~.T.~.~.~.[.~.~.T.[.T.~.XXT.~.~./.~./.~./.!.^.(.~.(.~.~.~.~.T.T.~.T.T.T.T.T.T.T.T.T.U.T.T.T.T.U.U.T.U.U.U.T.U.T.U.L.T.L.L.P.L.P.P.L.L.P.A.U.H.H.H.G.S.H.H.H.H.h.S.A.G.A.A.W.A.A.h.A.A.A.A.A.H.A.H.A.A.A.z.A.A.A.g./ / ! CXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXAXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXAXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXVXFXFXZXZXBXQ.{ Q / [ dX.X.X.X|.'.|.|.|.|.|.|.|._._._._.(.(.(.(.(._.(.(.(.(.(.[.|.(.(./.|.(.(.(././.(.[.T.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.P.P.U.L.L.L.L.L.L.U.P.A.U.L.U.L.L.L.L.L.H.L.H.H.H.H.H.D.H.G.H.H.K.H.S.H.H.H.S.S.L.L.L.U.P.L.U.P.P.P.P.U.U.P.P.P.P.U.P.P.P.L.L.U.S.L.H.H.L.L.L.U.L.L.L.D.U.L.L.U.L.L.S.L.L.P.L.L.L.L.Y.P.U.Y.U.P.P.T.T.T.T.T.P.[.~.~.T.~.T.T.!.~.~.~.T.~.~.T.~.T.(.~.~.~.~.T.~.T.(.~.~./.^.^./././.!./././.(.(.(.(.(.(.|.|.(._.|.|.|.|.|. X|..X|.|.|.|.|.|.|.|.|.|._._._.[._.|.|.^.|.|.(._.}.}._.|.|.|.|. X'.|.|.|. X_.'._._.`.|.|.|._._._.`.^.(.(.(././././.~.~./.~.~./.~.~.~.",
+"G Z G Z Z Z Z H D Z Z G Z G Z Z Z C Z Z C Z A C Z Z C C C C C Z B Z C C Z C Z Z Z Z Z Z D Z D Z D Z J H L H L H H J H P H J P P P J P P J K J P I L P L H H H H P H Z P 0 $ o o $ % % % : : 0 e r r 0 ; r 0 ; 0 r r r r r r r r r r r r r r r r r e r r e 0 r r r 0 r r r r r : y 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r t e r r e 0 r r r r r r r r r r r r r r r r r r r 0 r r r r r r : ; : ; - $ $   #   # $ T i.i.u.a.p.u.u.t.u.u.u.u.u.u.u.u.t.t.u.u.p.t.u.u.u.t.t.u.u.t.u.u.u.u.u.p.u.p.t.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.t.u.u.t.u.u.u.u.u.u.i.i.a.i.i.a.a.a.i.i.a.i.k.f.k.k.k.f.k.g.j.k.a.i.a.k.f.f.a.f.a.j.a.a.k.a.a.f.a.f.a.z.z.f.f.f.g.j.g.g.g.h.k.k.l.h.h.h.l.A.h.h.D.A.h.A.l.z.l.h.z.l.A.A.A.A.A.A.A.A.A.S.S.H.H.S.U.L.L.L.L.P.U.P.Y.Y.Y.T.Y.T.T.~.~.^.~./.(.(.(.(.{.(.(.(.(.(.(.(.(.{.(.(.(.(.(.(./.[.~.^.~.~.[.~.~.~.~.~.~.~.T.T.[.T.~.~.~.~.~.~.^.~./././.^.~.~.(.~.~.(.~.~.~.~.T.T.~.T.~.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.U.U.U.U.U.U.U.U.T.P.P.P.D.L.L.L.L.L.H.S.H.R.h.H.A.S.H.H.A.A.A.G.A.A.A.A.h.A.A.A.A.A.S.A.A.A.h.A.z.h.h.h.h.S ! ! CXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXDXSXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXDXFXFXFXFXDXAXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXSXBXm.[ / ~ c.@X.XdX.X.X.X X.X|. X_.|._._._._._._._._._._._._.`.^.|.(.^.(.(.|.|.(.(.(./.(././.(./.~.~.(.T.T.T.T.Y.Y.Y.T.T.T.T.T.T.T.T.T.P.T.U.T.P.P.P.L.L.L.L.L.L.U.D.L.Y.L.L.U.L.L.L.L.H.H.H.H.H.H.H.H.D.H.H.A.H.A.K.H.L.H.L.L.L.L.L.P.L.L.U.U.U.P.T.T.T.T.P.U.P.U.U.P.P.L.L.L.L.L.L.L.L.L.L.L.L.U.U.P.P.L.P.L.L.U.L.L.L.P.P.U.Y.U.L.Y.U.U.Y.T.P.T.T.T.T.T.[.T.T.T.T.T.~.~.~.~.T.~.~.T.~.T.~.~.~.T.~.T.~.~.~.~.~.~.~.E.[.~././.(./././.(./.(.`.(.(.(./._.|._._._.|.|.|.|.'.|..X|. X|.'. X|.'.|.|.|.|._.|._.(.|._._._.{.|.}.}.|.|.|.|.'.|.|. X|. X|.|.|.`.|.|.|._.(.`._.(.`.(.(.(.(./././.(././.~./.~.T./.T.T.",
+"Z G Z H Z Z D Z Z Z D C Z Z Z Z C Z Z Z C Z Z C C C Z C C C F C D C C Z Z C C Z Z Z D D D D Z D D D H D Z H H U H H U H P J J J P P P P I L P P I L P P P J U H F P U L P u $ o $ $ $ $ % % * ; r r r r e r r r r r r r r r r r e r r r r r r r r r r r r r r r r e r r r r r r : r r r r r r r r r r r r r r r r r r r r r 0 e r r r r r r r r y * r r r r r r r r r r r r r r r r r r r r r r r r r r r r * r ; * % , $ o         * w.i.a.i.i.u.a.i.i.i.p.u.p.u.E u.t.t.u.u.u.u.t.t.u.u.u.u.u.t.u.u.u.u.u.p.t.u.t.t.p.u.t.u.u.t.u.u.u.u.u.u.t.u.u.u.t.u.t.u.u.u.u.u.i.u.a.i.a.a.a.a.a.k.i.k.a.z.i.i.f.f.f.f.f.g.j.z.a.g.a.f.f.a.a.a.a.a.f.g.s.s.k.a.f.f.f.f.f.j.j.f.g.f.f.g.h.f.g.k.l.h.h.h.h.g.A.h.A.h.D.D.z.h.h.l.H.A.A.l.h.A.A.h.A.S.S.A.H.H.H.H.U.L.L.L.L.P.P.P.P.Y.T.T.~.~.T.~.~./././.{.(.(.(.(.(.(._._.`._.(.^.^.(.^.(.(.(.(./.E.(.T.XX~.~.~.T.~.T./.T.~.~.~.~.~.T.[.T.T.~.~.T.Y.XX/./.E.{.^.~.(.~./.~.~.~.~.~.~.~.T.T.~.T.T.T.T.[.T.T.T.T.T.T.T.T.T.T.T.U.T.U.U.T.Y.U.T.U.U.L.L.L.L.L.L.S.L.H.H.H.H.H.H.h.A.G.G.A.G.A.h.A.A.A.h.A.A.A.A.h.A.z.h.A.l.D.h.h.l.h./ ! S ZXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXAXDXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXDXFXFXFXFXFXFXFXGXAXDXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXGXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXVXFXAXFXFXBXpX{ / ! [ dX.XdX.X.XdX.X'..X.X.X|.|._._._._.|._._._.(.(._.(.(.(.(.`.^.(.(.^.(.(././././././.~.~.~.T.T.T.~.T.Y.T.~.~.T.Y.Y.T.T.T.T.T.U.U.T.T.P.U.P.P.P.P.L.L.L.L.P.L.L.L.Y.L.L.L.L.L.L.H.H.H.H.S.H.S.L.P.A.H.L.L.L.L.H.L.L.L.L.P.P.L.L.Y.U.U.T.P.P.T.U.T.P.U.T.T.U.P.P.P.L.L.L.L.L.L.L.L.L.P.L.L.P.Y.P.L.L.U.L.U.U.U.L.L.P.U.U.U.L.L.T.Y.Y.P.T.T.T.[.Y.T.!.T.T.[.~.~.~.T.T.~.~.T./.T.XX~.T.T.~.~.T.~.~.~.T.T.~.~.~.~././.~././././.{.^.^.(.(.(.|.(._._.`.(._.|.|.|.|..X X X.X|. X.X.X.X.X X|.'.|._.|._._._._.|._.|._._. X X}.|.|..X'. X.X|.|.}._.|._.|._._.|.{._.^._.(.(.^.(.(.(././././././.T.T./.T.~.!.~.",
+"Z Z Z Z L G Z Z Z Z Z Z Z Z Z Z Z Z B Z Z A Z C F C B C C Z C C Z C Z C C Z C Z Z Z Z Z Z D D Z D D Z H L H H H J H H J H J J J P L P H J P L P L H P H L P H J U H K ~ Z H F w   o o $ $ % % : 0 ; 0 ; q 0 r r r r e r r r r r 0 r r r r r r r r r r r r r r r r r r r r r q e : r r r r r r r r e r r q r r r r r r r r r r r e 0 r r r r r r * y r r r r r r r r r r r r r r r r r r r r r r r r r r r : 0 * ; % $ $           m a.i.i.i.i.i.i.u.i.u.i.i.u.u.u.i.u.u.u.u.u.t.u.t.u.u.u.t.u.u.t.u.t.u.t.u.t.u.t.u.t.t.u.u.t.u.p.p.u.u.u.u.u.p.u.u.u.u.u.u.u.t.u.u.u.u.u.u.i.a.a.a.d.a.a.a.i.i.i.f.f.f.z.f.f.f.a.f.g.z.f.g.f.f.f.j.f.g.s.s.f.k.z.a.f.f.z.a.k.s.j.f.f.f.g.g.f.f.f.g.z.l.h.h.h.h.A.g.A.h.h.g.h.h.D.h.l.l.h.A.A.A.A.A.A.A.A.S.H.H.H.H.S.L.D.L.L.P.P.P.Y.P.T.T.T.T.~.~.~.!.~././.^.(.(.^.(.(.|.^.`.`.(.(.|.|.{.|.(.(.(.(./.~.(.(.).XX~.~./.~.T.~.[.~.~.~.T.~.~.~.~.T.[.~.~.^.E.(.~.(.(./.(.(.~./.!.~.~.T.~.~.T.T.~.T.~.~.T.T.T.T.~.~.T./.T.T.T.T.T.T.T.U.T.T.T.U.T.U.Y.U.U.U.U.L.U.L.U.U.A.H.H.H.H.W.A.S.A.G.A.A.A.A.A.A.A.A.A.A.j.A.A.A.D.h.h.A.l.h.h.h.h.S / / SXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXDXDXDXSXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXDXSXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXZXZXZXBXm.[ / Q [ dXdXdXdX.X.X.X@X.X.X.X X|.'.|._.(.(._._._._._._.|.(.(.`.{.^._.(.(.(.(./.(./.[./.~.~.~.~.T.[.T.R.T.T.T.T.T.T.~.Y.T.T.T.T.U.T.U.U.P.P.U.U.U.L.L.P.L.L.L.U.U.U.U.L.L.L.L.L.H.L.L.K.H.H.H.H.S.L.D.U.H.U.H.L.L.L.L.L.L.L.P.U.T.Y.P.P.U.T.T.U.T.T.T.T.Y.P.U.U.P.P.U.P.Y.U.L.L.U.S.U.U.L.U.L.P.L.L.L.Y.L.U.L.L.U.U.Y.P.U.T.T.U.Y.U.T.T.P.[.T.T.Y.Y.T.T.T.T.T.~.T.~.~.~.~.T.T.XXT.E.XX~.~.~.~.~.T.~.~.~.~.~.~.~.~.~.~./.!./.(./.(.(.(.(.^.`.(.^._._._._.`._.|.|.|.|.|.|.|..X|..X|.|..X.X|.|.|.|._._._.(._._._._.|.|. X}.|.|.|..X|.|.'.|.|. X|._.|._.`.|.{.(.^.`.(.(.(.(.(.(./././././././.~./.T.~.T.T.T.",
+"H Z Z Z Z D D H Z Z C Z Z Z Z Z Z Z B D Z B C C C B C C C C C C C C C Z C Z C C Z Z Z Z Z Z Z D Z D D H H H H H H L H L P P P J P J P P J P J H J L J J H J H J J L J J Z P H J u %   o $ $ $ % % % ; ; ; ; ; : ; : : ; y ; e ; r r r r r r e e r r r e 0 r r r r r r r r r r r r r r r r r r q r r r e 0 r r r r r r r r r r r r r r r r r r r r r r : y y : r r y ; ; r r r r ; ; ; r ; 0 r r r r = e * * % * $ $           $ p.p.i.i.i.i.a.i.i.i.a.i.i.i.u.p.u.u.u.u.u.u.t.u.t.t.u.u.u.t.u.t.u.u.t.u.u.t.u.u.u.u.t.u.t.u.t.u.t.u.t.u.u.t.u.u.p.u.p.u.u.p.t.p.u.u.u.u.i.i.i.i.d.a.a.a.d.d.f.k.z.f.f.f.g.g.f.g.f.f.g.f.g.z.a.g.f.f.s.j.f.f.f.a.f.g.a.a.k.f.f.z.f.f.z.a.g.k.g.f.g.g.g.h.h.h.h.h.h.l.l.l.l.A.D.g.h.A.G.j.A.A.A.h.W.A.A.S.S.S.W.H.H.H.L.L.L.L.L.P.P.P.U.U.T.T.T.T.T.~.~.~.~.^.(.^.^.(.`.(.(.(.`.^.{._._.[._.`.^._.(.(.^.^./.^.^.(.~.~.~.~.~.R./.T.~.~.~.T.E.XXXX~.T./.~.~.!.E.[.^.(./.(./././././.~.~.~.~.~.Y.~.!.~.~.T.~.~.T.~.T.~.~.~.T.T.I.T.U.T.T.T.T.T.T.~.Y.T.T.T.T.P.P.T.P.L.L.L.L.S.S.H.S.S.S.H.A.A.A.A.A.h.A.h.A.A.A.A.h.A.A.A.h.D.A.z.z.h.h.g.g.~ ~ ~ CXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXZXVXBXm.[ Q ! M.dXxXdXzX@XdXdX.X.XdX.X.X|.|.|.|.`.`.`.(.|.|.(.|.[.`.(.^._.(.(.(.(.(./.(././.!././././././.~.~.!.T.~.T.~.T.T.T.T.T.T.T.P.T.T.P.T.T.U.T.T.P.P.P.T.P.P.P.U.U.U.P.P.L.L.L.L.L.L.D.H.H.S.U.S.L.L.S.U.L.L.L.L.L.L.L.U.U.P.U.U.Y.U.T.U.Y.Y.T.T.T.T.T.T.T.T.P.T.T.P.P.T.L.P.U.U.U.P.U.P.I.I.U.U.P.P.P.P.L.L.P.P.U.T.U.T.T.U.T.U.T.U.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.~.~.~.~.T.~.~.T./.T.~.~.~.~.~.T.~.~.~.~.T.~.~.!./.(.[.^.(.(.(.(.(.(.(.(.(.`.`.|.`._.`.|.{.|.|.|.|.|.|.|.|..X.X.X.X.X X.X|.|.|._._.|.|._.|.|.|._.|. X.X X X|..X X|.|. X|.}.}.}.{._._.(.^.(.(.(.^.(.(././././.!.(.~.~.(./.~.~.~.R.~.T.T.",
+"Z H Z Z C G Z G Z Z C Z D Z Z Z Z Z Z Z Z C Z C C D C Z F C C A C C Z C D C Z Z A Z B Z F Z Z H D D D H F H H H L L L L L J K Y J J Y I P P J J J H J J I H L H F J L J F H J H J S * $   o o $ % % % ; ; ; ; ; y 0 y = ; r = r r r r = r r : = : r r r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r q e r r r r r r r r r r r r r r : * r r ; r ; y r r r r r r r 0 r r r r * r r ; * = $ o o         o C i.p.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.u.u.u.u.u.u.t.u.u.u.u.t.u.t.u.t.t.t.u.t.t.u.t.t.t.t.u.t.u.t.i.t.u.u.u.u.u.u.u.u.u.p.u.p.p.u.u.u.u.u.u.u.u.i.i.i.a.a.a.a.d.i.d.d.f.f.f.f.k.f.g.g.k.g.g.g.a.z.g.a.f.f.a.f.a.f.a.g.g.a.a.g.a.z.f.f.a.f.f.z.f.k.f.k.g.f.g.g.h.f.h.h.l.k.l.l.l.l.h.h.A.j.A.A.A.h.A.A.A.A.S.S.G.S.G.H.H.L.L.L.L.L.L.P.D.U.U.T.T.T.T.T.T.T.~.(.~.(./.(.{.(.[.^.^.`.^.`._._._._._.(.`._.^.`.{.E./.~./././././.~.~./.R.~.XX~.T.~./.U.XX~.~.~.~.~./.(.^.(./.(././././././././.~.~.!.~.~.~.~.~.T.~.!.~.~.~.~.T.~.~.~.T.~.~.T.T.Y.~.T.T.T.~.~.T.T.T.P.P.T.P.L.L.L.L.L.L.U.H.H.S.Z.S.G.A.A.h.A.A.A.A.h.A.h.A.A.h.h.h.l.l.h.h.h.h.z.h.~ ~ ~ CXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXFXFXHXQ.{ Q S [ fXdXzXzXzXzXdXdXdX.X.X.X.X|.|.|.|.{._.|._.|._.|._.^.`.|.|.(.(.(.(.(.^.(./.(.(././.!././.~.~.~.!.~.T.~.T.~.~.Y.T.P.U.P.T.T.P.T.T.Y.U.T.U.P.T.P.T.P.P.P.U.P.P.P.P.U.U.L.L.L.L.L.H.D.L.L.L.H.S.Y.D.L.L.U.L.L.L.U.P.P.U.U.U.T.U.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.P.P.U.U.P.P.P.P.U.Y.Y.P.U.Y.P.P.P.Y.L.P.P.P.P.U.U.T.U.T.U.T.U.T.T.T.T.T.T.T.P.[.T.T.T.T.~.~.~.T.~.~.T.~.~.T.T.[.~.T.~.~.~.~.~.~.~.~.~.(.~.~.~.~.(.E.^.~.^.(.^.^.`.`.(.`.`.(.{._.(.`._._.|.|. X|. X X|.'.|. X|..X.X.X|..X|.|.|.{._._.|._.|.|.|.|. X X X|. X.X|.|.|.|.|.|.}.}.|.^._.(.`.(.`.(.(.(./.(./././.(./.(.~.!.~.~.T.T.~.T.T.~.",
+"L Z Z G D Z Z Z Z Z Z H B Z Z Z Z Z C Z D C Z C C B C C C C C C Z C C B B F C Z Z Z D Z Z Z D D D D H H H H G H L H L K L I K I P P P P P L J J J L L H J J L L J J H J L J J J L Z P S % o o   o $ $ % % = ; ; 0 : ; ; r r 0 r y : : : : * r r r r r r r * r r y r r r r r r r r r r r r r r r r r * r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r y 0 r r r r * ; % ; ; % $ $   $         m y.a.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.e.u.i.u.i.u.t.u.u.u.u.u.u.u.u.u.t.u.t.t.t.u.t.u.t.t.u.t.t.t.u.t.p.t.u.u.u.u.u.u.u.p.t.p.t.u.u.u.u.u.u.i.u.i.i.u.d.a.a.a.a.i.k.f.k.f.f.f.k.g.g.g.k.g.f.g.f.a.g.f.g.a.f.f.f.z.f.a.f.j.f.g.d.f.f.a.z.z.d.a.f.f.k.k.k.f.g.g.g.h.h.k.h.l.l.h.h.l.z.D.A.A.h.j.A.A.A.A.H.A.S.S.G.G.S.H.H.H.H.L.L.L.H.U.L.U.L.U.U.T.T.Y.T.~.~.~.~././.^.(.(.(.`.(.(.(.|.(._._._._._._._._.(.`.^.(./.(.!.[.!./.~./.~.~./.~.XXU.~.~.T.~.~.~.~././.~././.^.^.(.(./.(././././././.[.~.!./.~.~.T./.(.~.~.~.~.!./.T.~.T.~.~.~.T.T.~.~.T.T.~.~.~.T.~.~.T.T.U.T.U.U.U.L.L.L.L.U.H.H.A.H.H.G.A.A.A.A.A.h.A.A.A.h.A.l.l.h.S.l.l.l.l.h.z.h.h./ ~ ! CXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXDXHXBXm.[ ~ ! m.zXdXzXzXzXzXzXdXxX.X.X.X.X.X.X|.|.|._.|._.{.|.|._.^.(.`.(.|._.(.)././.(.(././.^././.~./.~.!.~.~.~.T.~.T.T.T.T.T.T.T.P.T.T.T.T.T.T.T.U.T.T.P.T.P.Y.P.U.U.Y.P.U.P.U.U.L.U.L.L.L.L.L.L.S.L.Y.Y.U.U.L.Y.U.U.U.U.U.U.U.U.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.P.P.P.U.U.U.U.U.U.L.U.P.P.P.P.Y.Y.P.P.L.P.U.P.P.P.U.T.U.U.Y.U.T.I.T.T.T.T.T.T.P.T.T.T.T.~.T.T.~.T.T.~.T.~.~.T.T.T.XXXX~.~.~.~.~.~.~.~.~.~.~.(.~.(.(.!././.(.(.(.{.(._._._.|.`._.|.|.|.`.`.|.|.|.'.'.|.|. X.X.X.X.X|..X.X.X.X|.|.|.|.|.|.{.|.|.|.|.|..X.X.X X|.|.|._.|. X|.|.|._._.{.(.(.(.(.(.(.(./.(./././.!.~.(./.~.~.~.T.[.~.~.T.Y.",
+"H Z Z Z D Z Z Z Z Z G C G Z Z Z B Z Z C Z C C C C D C C C C Z B C C C D C C Z D Z Z D Z Z Z D D D H Z H H H H P H H P H L H J L P J P J I H P J J J P J J P L P G K J Z L J H J U L L D P y $ o   o o $ & $ ; % ; ; ; ; r 0 r r q ; q r r r r r r r r r r r r r * r r r r r r r r r e r r r r r r r y r r r r r r r r r r r r r r r * y : 0 r r r r r r r r r r r 0 r ; = r y = y r r 0 ; 0 * * % % & o       #     * T x.i.i.i.i.i.i.i.i.i.i.a.i.i.i.i.i.i.i.i.i.i.i.u.u.u.u.t.t.u.t.t.t.u.t.u.t.u.t.u.t.t.t.u.t.t.t.u.t.t.s.t.t.t.u.u.u.u.t.u.t.p.u.u.t.u.p.u.u.u.u.i.u.i.a.i.a.a.a.a.k.i.k.d.k.f.f.k.g.g.g.h.g.g.g.g.z.f.f.a.f.f.a.f.a.k.k.f.f.f.a.f.a.a.g.a.a.g.a.f.f.f.f.k.f.g.f.z.f.f.h.k.l.l.h.h.l.A.z.h.A.A.A.A.A.A.A.A.S.A.Z.G.S.S.H.H.H.L.S.L.L.L.L.U.Y.L.U.U.T.T.T.~.T.~.~.~./.!.(./.(.(.^.(.(.(.(.(._._._._._._.`.(.(.(.(.(.(././.(./././././.~.~.~.E.XX~.~.~.~.~.[.~.(././.(././.(.(.(.^.(.(.(././././.~./.~./././.!./.!.(./.~.~.~.E./.(.~.~.~.~.~.~.T.~.~.~.T.~.~.~.[.T.~.T.T.T.T.U.U.U.U.U.U.S.D.H.H.H.A.A.S.h.A.h.A.A.h.A.A.h.h.S.A.h.A.l.h.z.l.h.h.h.k.P ! ! CXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXBXHXQ.} ! ! [ cXcXzXcXxX.XdXzXzX.XzX.X.X.X.X.X X|.'._.|._.|.|.|._.`.`._._._.(.^.(.(.(.(./.(./././.~.!./.~./.~.~.~.Y.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.P.P.T.Y.T.T.T.Y.T.U.T.U.U.U.U.U.L.L.P.P.L.L.U.S.S.U.L.U.L.U.U.Y.T.U.Y.T.U.T.T.T.T.T.T.T.~.T.~.T.T.~.T.(.T.T.T.T.P.U.U.Y.P.Y.P.P.U.U.P.P.T.P.P.P.P.P.U.U.T.U.T.T.T.U.T.U.U.Y.I.U.T.T.T.T.T.T.T.T.T.T.T.T.!.[.T.T.T.~.~.~.T.~.T.E.XXT.~.~.T.{.~./.~./.(.~.~.~./././.(.(.(.(.^.(.|._.|._._._.|._.|.|.|.|.`.|.|.|..X|..X|.|..X|.|. X.X X|.'.|.|.|. X|.|.|.|.|.|. X|.|..X.X.X|..X X|.|.|. X|._._._._._.^.(.(.(.(.(.(.(./.(.!././.~.~.~.~.~.T.[.T.T.T.T.T.",
+"Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z F Z Z Z Z C B Z C C A C C C C C C Z C Z C Z Z B Z Z Z Z D D D D D D H D H H H H L L J H L P H J P P J I J J P P P P L L H J J J J G J J J H P L S P J L Z ) S u $ o   o o & $ % % % * * y = * y ; : r r r r 0 * r r r r r r r r r r r r e r r r * e 0 r : r r r r r r r r r r r r r r r r r r r r r e * y : y r r r r r r r e q 0 ; r 0 ; r ; ; 0 r = r = % % % & $             $ G i.a.a.a.i.a.i.i.i.i.i.i.a.u.i.i.i.i.i.i.i.i.i.i.i.i.u.u.u.u.u.u.u.u.r.u.t.t.t.t.t.u.t.t.t.t.p.r.t.t.p.t.p.r.u.t.t.u.u.t.u.u.u.u.p.t.u.u.u.u.u.i.u.i.i.i.i.i.a.a.a.a.d.z.k.k.z.f.f.h.z.k.f.k.g.g.g.g.g.a.a.g.f.f.f.f.f.f.f.f.f.i.f.a.f.a.a.a.a.a.g.f.f.a.k.z.f.k.f.f.z.f.l.f.h.h.h.z.h.h.h.z.h.A.A.A.A.h.S.A.A.A.A.S.S.S.H.S.H.H.A.S.L.L.L.L.U.U.Y.U.T.T.T.T.T.~.~././././.^.(.(.(.(.(._.(._.(._.(._._._._.`.`.(.(.(.(./.^././././././.~.~.(.[.E.~.~.~.~.~.T.[.E.(./././.(.{.(.(.(.(.(.(.(././.^./././.(./.!././././.~./.~./.^.~.!./.E.~.T./.~.~.~.~.~.~.~./.~.~.~.~.Y.T.T.T.Y.U.L.U.L.U.L.L.H.H.H.A.A.A.S.A.A.A.A.h.A.h.h.h.z.g.h.h.h.l.z.h.h.h.h.k.! / S CXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXSXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXDXBXm.} ^ ! c.cXzXxXzXxXzXdXzXzX.XdX'..X.X.X.X X X|.|.|.|.|.|.|.|._._._._._.(.(._.(.(.(.(.(.^.(./.~./.~./.~.~.!.~.T.~.~.T.T.T.T.T.T.T.U.T.T.T.T.T.T.T.T.T.T.P.T.P.T.T.T.T.T.T.U.U.P.P.U.U.U.P.P.P.L.L.L.L.L.U.L.P.U.U.T.U.T.T.T.T.T.[.T.T.~.T.~.T.T.~.~.T.~.T.T.T.T.T.T.T.T.T.P.T.T.T.P.P.P.T.P.T.P.T.T.T.Y.P.Y.T.T.T.U.T.T.T.T.U.T.U.U.U.T.T.U.T.T.T.T.T.T.T.T.T.T.~.~.~.T.~.~.T.~.T.~.~.~.~.~.(././.~././././.[.~.^././.(.(.(.(.^.(.|.|.|._._.|.|._.|.|..X|.'.|. X|. X.X.X|.|..X.X|..X X.X X X|.|.|. X|.|.|.|.|..X|.|. X.X X.X X|..X X|.|.|. X|._.|.|.^.(.|.(.(.(.(.(.(.(.(././.(./.(.~.~.~.~.T.~.~.~.T.T.T.",
+"Z Z Z L Z Z Z H Z Z Z Z Z Z Z Z D Z C Z C Z C Z C C C C C F Z C C C C Z B Z Z Z Z Z Z G D D Z H H D H Z H H H H H L H H H P J P J P P J J Y J P J P P J J H J L J J J J H J J L P P U L L L J P P y $ o     o o % $ $ % % : : * ; ; : r r r r r r r r r r r r r r r r r 0 r : r y r r r r r r r r r r r r r r r r * r r r r r r r r 0 t 0 t * r r r r r r r r r r r r r r ; ; : ; ; ; % % $ $ $             % T k.u.k.a.i.i.a.u.d.d.i.i.s.i.u.i.i.i.i.i.i.i.i.i.i.i.i.u.u.u.u.u.u.t.r.u.u.t.t.t.p.t.t.t.u.t.u.t.u.t.u.t.t.t.t.t.t.u.u.t.u.u.u.t.u.u.u.u.u.p.u.u.u.u.u.i.i.i.i.a.a.a.a.z.z.a.k.z.f.z.h.h.h.k.h.z.g.g.g.g.g.g.j.f.f.f.f.f.k.a.f.f.f.f.g.a.a.a.a.a.a.a.f.a.f.f.f.f.f.f.f.z.f.h.z.h.k.k.h.h.h.A.h.H.H.A.A.A.A.S.H.A.H.S.S.S.G.S.H.H.H.H.L.L.L.L.Y.U.Y.U.Y.Y.T.T.~.T.~.R.~.~././.(././.^.(.(.(.(.(._._._._._._.`._.^.^.(.(.(.(.(.(.(.(.(././.~.~.[.~.XXT.~.~.~.~.~.[.^.(./.(.^.(.|.(.(.(.`.(.(.(.(./././.^././././.(.(././././.~./.~.(.^.!.~.~.~././.~.T.~.~.~./.~./.~.~.~.~.~.~.T.T.T.T.T.U.U.L.L.L.H.H.h.H.A.H.A.A.A.A.A.A.h.A.h.A.g.A.h.h.l.l.h.h.h.k.k.k./ ! ! CXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXSXGXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXDXHXQ.[ ! ! [ vXzXxXcXzXzXzXzXzXzXdXdXzX.X.X.X.X.X.X.X X.X|.|.|._._.|._._.|.(.(.(.(.(.^.(.^.)./.!./.~.~.~./.~.T.T.~.T.T.Y.T.~.Y.T.T.Y.T.T.T.T.~.T.T.T.T.T.P.T.T.T.U.T.T.T.U.U.T.T.T.U.U.U.P.P.P.U.P.U.U.L.L.L.U.U.L.Y.T.T.Y.T.T.T.T.T.~.T.T.~.T.~.~.T.T.T.~.~.T.T.T.~.T.T.T.T.T.T.T.T.T.P.T.P.T.P.T.T.P.T.P.P.T.P.T.P.T.U.U.Y.P.Y.U.Y.T.I.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.~.~.~.XXXXT.~.~.T.~.~.E.T./.^.~./.~.(.(.~.^.[./.(./.(.(.{.(.(.`.{._._.|.|.|.|.|. X X|..X.X|..X.X|.|.|.|.|. X|.|..X.X'..X.X.X X|..X|.|.|.|..X.X.X|.|..X|..X.X|.|.|.|. X X|.|._.|._.`.^.(.`.(.(.(.(.(./././././.T.^.~.~.~.~.~.T.T.T.T.T.",
+"Z C Z Z Z Z Z Z Z C Z Z Z Z Z D C Z C D C Z C C C C C A C Z C C Z F C C D C Z Z Z D D D D D D L D D H H H H U H H H P J L J P P P P L P I K J P L I K I J J J J J J L L P H H L Z J L L P J Z U H I S y $       o o $ $ $ % % % ; ; : 0 r r r t r r r r r r r r r r r r r r r r r r r r r r r e * y 0 r r r r r : y r r r r r r : y : y e * r r r * r r r r r r r r r e r ; : : % & & $ o               * T f.i.i.z.u.a.k.i.a.i.s.i.i.i.i.i.i.u.i.i.i.i.i.i.i.p.u.i.u.i.i.u.u.i.u.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.u.t.u.p.t.t.t.t.u.u.t.u.u.u.p.u.p.u.p.p.u.u.u.u.i.u.u.a.i.i.a.z.a.i.z.k.k.z.h.k.h.f.h.k.k.h.z.h.g.g.g.j.h.f.f.k.k.f.k.f.f.f.f.f.f.a.g.g.i.a.a.k.a.a.f.f.a.f.f.f.k.k.f.h.k.k.k.h.l.l.l.S.S.z.A.A.h.A.S.A.S.S.A.S.S.S.H.L.H.H.H.H.H.L.L.L.L.U.U.T.T.T.T.T.T.~.T.~.~.!.!./././.^.^.(.(.(.(.(._._._._._._.^.`.`.^.`.(.~.(.(.(.(.(.^.!.(././.~.~.T.XX~.T.T./.~.(.~.^./.^.(.(.(.{.(.(.(.(.(.(.(.(././.(./././.(.^./.(././.(.~.(.(.~./.~.~.~.~.~.T.~.~.~./././.~.~.!.~./.~.~.~.T.~.T.T.T.Y.Y.L.L.L.H.H.H.H.A.S.h.h.A.A.A.h.h.h.h.h.h.l.l.h.l.l.h.z.k.k.k.k.S / ! ZXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXZXBXm.} / ^ M.cXxXxXcXxXzXzXzXcXzXzX@XzX'..X.X.X.X.X.X.X.X|.|.|.|.|._.|._._._._.(.(.^././././././.!././.~.^.~.T.~.T.T.T.~.T.T.T.Y.T.T.T.~.T.T.T.Y.P.T.T.T.Y.T.P.T.T.T.Y.Y.U.Y.P.T.T.T.T.T.P.P.Y.L.Y.U.L.Y.L.U.L.U.T.T.T.T.T.T.T.T.T.~.~.T.~.T.~.T.~.T.~.[.T.~.T.T.T.~.^.T.[.T.~.T.T.T.Y.T.P.T.T.T.T.T.T.P.T.T.T.Y.T.P.T.U.P.T.P.P.P.Y.U.U.U.T.T.T.U.T.T.T.T.T.T.T.T.~.T.T.~.T.XXXXT./.T.T.~.~.~.~.~.~././.~./.(.~.(.E.(./.^.(.(.(.`.|.^.`._.|.|.|.|.|.'..X X|. X'. X.X X.X|.|.|..X|..X.X X.X.X X X.X|.'.|..X'..X|..X|..X.X.X X.X|..X X|.|.|.|._.|.|.|.{.{.{.|.(.(.(.(.(.(.(.(.(././.!.!.~.~.!.~.T.T.~.T.T.R.~.",
+"Z U Z Z Z Z Z Z Z Z Z Z G C Z Z Z Z Z B Z C C C C C C C C C C C C B D Z C Z Z Z Z Z D D D D D D H D H D H H D H H P H U L P P J J L P P J P P P P J J P P J L J J L J L L L P P P L J J L P P L P L L L U S %           o $ $ $ % % % % 0 r 0 * r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r * y : 0 : : r r r r r r r r r r r r r 0 ; = % % % $ $ $ o               0 w.p.i.i.d.i.s.a.a.i.i.a.i.i.i.i.i.i.i.u.i.i.i.i.p.i.i.i.i.u.i.i.u.u.u.i.t.u.u.u.t.t.t.t.t.r.t.y.t.r.t.t.t.p.t.t.p.t.t.t.p.t.u.t.u.u.t.t.u.t.u.t.u.u.r.u.u.u.u.u.i.i.i.a.a.a.a.z.k.k.k.k.k.k.h.z.z.h.h.h.h.g.g.h.g.g.g.g.j.a.z.k.f.f.f.k.f.f.f.i.g.i.a.a.z.a.a.a.k.a.k.k.f.f.f.f.k.k.g.g.g.h.h.z.l.l.h.A.g.A.A.G.S.S.A.A.S.A.A.A.H.A.h.H.S.H.H.L.S.L.U.P.U.Y.U.T.T.T.Y.~.T.~.T.T./././././.^.{.(.!.^.(.(.^._.[._.|._.`.(.(.^.`.(.(.(.(.(.(.(.^././././.~.E.[.XX~.~./.T.~.~.~.^.(.(./.^.{.(.(.`.(.(.(.(./.(.(.(././.(.^.^.(._.(.(.(.(././.~.~.(.(.~.~.^.~./.!.~.^.~./.~.~./.~./.~./.~.T.~.T.T.U.T.U.U.L.L.L.H.H.H.G.H.A.A.S.A.h.h.A.h.Z.h.A.l.l.G.g.l.h.l.l.k.h.k.z./ ! S CXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXDXSXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXZXBXm.[ Q ^ c.cXcXxX.XxXxXzXcXzXzXzXzXdX.XzX.X.X.X.X.X.X|..X X|.|.|._.|._._._.(.(._.^././././.!./.!./.~./.~.~.~.~.T.~.Y.~.T.T.~.T.T.T.T.T.T.T.P.^.T.U.T.T.U.T.T.T.U.T.P.U.Y.T.Y.T.T.T.U.P.T.T.T.Y.L.U.R.L.U.U.T.Y.T.T.T.T.T.[.T.T.T.~.T.~.T.~.T.~.T.T.[.T.~.~.~.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.T.~.T.Y.T.U.T.T.P.L.Y.P.P.P.T.Y.T.T.T.T.T.T.T.T.T.~.T.Y.T.~.T.T.!.E.U.T.T.~.~.~.~.~.(.(.~./.~././.~.(.~.(./.(.(.(.|.^.|.(.|.|.|.|.|.|.'. X.X|..X.X X.X.X|..X|.|.|.|.|.'..X.X|.|. X'..X|..X.X.X|..X.X.X.X.X.X.X X X|..X|..X|.|. X|.|._.|.|._.`._.|.|.(.`.(.(.(./.(./.(.^./.~.~.~.~.~.[.T.T.T.T.Y.~.",
+"B Z Z Z D C Z Z Z Z Z Z Z Z Z Z C D C C C Z Z C B C C C Z C C F A Z C C A Z Z A Z Z Z Z Z H Z D D H H H H H L L F J J J L H J I L P P L J J J J L P P J J J J J P L H L J J K U H L J J J J J J P J J K U J F H r $         o % o $ $ $ $ * * % = 0 : : * : : q r q r r r ; ; e = r r r : y r * r y : ; : r : y 0 0 q r = e : : > y y y ; r ; ; > e * 0 0 * 0 : = % % & $ $ o o         #     - R i.z.i.a.a.i.d.a.i.a.a.a.a.a.i.i.d.i.u.p.i.i.i.a.i.i.a.i.i.i.i.s.p.i.u.i.u.u.u.t.u.t.u.p.t.r.r.r.r.t.r.t.p.t.t.u.u.u.u.u.t.t.t.t.t.p.t.t.t.u.t.u.u.r.u.u.t.u.u.u.u.u.i.i.i.i.a.a.k.z.f.k.k.h.k.l.k.A.g.z.l.l.g.l.h.l.h.g.g.g.g.f.g.g.f.d.f.f.f.k.z.k.d.d.k.d.f.a.a.a.a.f.a.k.f.k.f.g.g.f.z.g.g.h.h.h.g.l.l.A.A.A.h.A.J.A.W.h.S.h.S.H.G.H.S.H.H.S.H.U.S.U.U.U.U.Y.T.T.U.~.Y.T.~.~.T.~.[.~.~.^./.~.^.(.(.(.(.(._.(.(.|./.[._._._.(._.(._.(.(._.^.(.(.(.[.(.~.!.~.!.~.~.~.~.~.~.~.^.(.(.(.(.^.(.(.'.(.(.(.(.(.(.!./.(./.(.[.^.(.[.(.(.(.^.(.(.(.!.^.^.^.{././././.~.~.~././.~./.~./.~.~././.T.T.~.T.T.T.T.P.Y.L.L.L.L.H.S.A.G.A.A.A.h.A.h.l.h.h.h.l.h.h.h.l.l.h.h.k.k.g.g.~ / S ZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXDXDXAXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXBXpX{ Q / [ xXxXcXcXcXcXcXzXdXvXzXzXzX.XdX.X.XdX.XdX@X'.'. X'.|.`.`.^.|.`.|.|.(.).^./.[././.~././.(./.~.~.~.~.~.T.T.T.T.T.T.T.T.T.[.T.T.T.T.~.T.T.T.T.T.T.T.T.U.T.U.T.U.T.T.T.T.T.T.T.T.T.T.U.T.T.U.P.T.Y.P.Y.Y.T.~.T.!.T.T.T.[.~.T.~.T.~.~.T.~.(.T.[.~.~.T./.T.~.~.T.T.~.T.~.T.T.T.T.T.T.P.T.T.T.T.T.~.T.T.T.T.T.T.T.L.P.U.U.U.Y.U.T.T.T.U.T.T.T.T.P.T.T.T.T.P.T.T.[.P.Y.T.T.T.T.T.T.~.T./.!./.^.~.~./././././.~.!./.(.(.`.^.|._._._.|.|.|.|..X.X X.X.X.X X.X X|..X X|..X X X|.|.'.|..X.X.X X.X X.X.X.X.X.X.X.X.X.X.X'. X.X'.|..X|. X.X.X|.|.|.|.|.|.}.}.}.}.}.`.^.^.(.^./.(.(.~.(.[.!.(.^.T.~.T.T.T.T.T.T.",
+"G Z Z Z Z Z Z D Z Z Z Z Z F B Z Z B Z Z Z C C C C C C C C C C B Z C Z Z Z Z H Z H Z Z Z Z L H L H H H H H H H H L H J H L P P J I J J P P L P J P K P P L J K L K L L P K L L H P H L J J L L J J H J H J J H H H P u %           o o $ o $ $ $ $ % % r % : ; ; * * : = > y y ; r r 0 r * : : : = : 0 r y : r * r r : y r : 0 t 0 q = * * * 0 0 * * = * % r % $ $ $ $                 # $ B w.u.E a.a.u.a.i.k.i.a.i.a.a.a.a.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.a.i.i.i.i.u.i.u.i.s.u.u.t.p.t.t.r.t.t.r.t.t.t.t.u.t.t.t.t.t.u.t.p.t.u.t.t.u.u.t.u.t.u.u.u.u.i.u.u.u.i.u.i.i.i.a.a.a.a.k.f.k.k.h.g.k.k.k.z.g.h.z.h.h.h.f.h.g.z.f.f.g.g.f.g.f.f.f.k.i.a.f.f.i.d.f.d.k.a.z.g.a.f.a.k.f.z.g.g.g.g.g.g.h.h.l.l.l.l.A.H.A.A.S.h.S.Z.S.H.H.A.Z.H.A.H.H.H.U.H.L.L.L.L.L.U.T.T.T.T.T.Y.~.T.T.~.~.~.~.^./././.(.(.(.(.(.(.(.(._.^.|.}._._.(.(._._.(._.(.`.(.{.(.(.(.^.^././.~.~./.!.~.~.~.^.!.(.~.(.(.(.`.(./.`.(.(.(.(./.(.(.(.(.(.|.(.(.(.(.(.(.(./.(./././.T.^.E././.[./.~./.~./.(./.!././././.~.~.~.~.R.T.~.T.T.T.P.L.L.L.S.H.G.S.A.H.A.h.Z.h.h.h.h.h.h.l.h.h.h.l.h.l.z.h.g.g.g./ / S ZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXHXBXQ.[ / ~ c.cXcXcXcXvXdXvXcXzXnXdXdXzXzX.XdXdXdXdX.XdX.X X X|.'.|.`._.`.(._.|.^.{.^.(././.~././.~.~.~.~.~.T.T.~.~.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.^.T.T.T.T.T.XXU.T.T.U.U.U.T.P.T.Y.T.T.T.T.T.T.T.T.T.P.Y.P.~.T.T.T.Y.T.T.T.~.T.^.~.T.~.T.~.T.~.~.T.[.~.~.~.~.T./.~.~.^.E.T.~.~.~.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.U.T.U.U.Y.P.U.T.U.T.T.T.T.T.T.T.T.P.T.[.T.T.T.T.T.T.T.T.~.~.~.T.~./.~.~.^.~././././././.(.(.)./.(.(._.(._.}.|.|._.|.|..X X X.X.X|. X|.|..X.X.X.X|..X'.|..X X X.X.X.X.X.X.X X.X.X'.'..X.XdX X.X'..X.X|..X|. X'.|.|. X|.|.|.|.|.}.}.}.|.[.^.^.(.|.(.(.(.~.(.(.(.~.(.~.T.^.~.T.T.T.T.T.",
+"D C D Z Z C Z Z B D B D Z Z Z Z Z A Z C B C C C C C C Z C C C Z Z C Z C Z Z Z Z Z H H Z H H H L H H G H H H H H J H J J P P P J J P P P P P P J J L P L J P P L H L J J U J H J P K J J J J H P H J J J Z J K H H L H H H u %   #       o   o o $ $ $ $ $ $ % % % % % % 0 0 * * ; e ; * : * * = r : r y r r r r > * * * e r 0 * ; ; % ; > * * % % % & $ $ o o $ o   #             $ q T a.s.i.i.d.d.t.z.u.a.z.i.a.a.a.i.i.a.i.i.i.i.i.i.i.i.i.i.i.a.i.i.i.i.a.a.i.s.i.i.i.i.u.u.u.u.u.u.p.t.p.r.t.t.t.t.w.p.t.t.t.t.u.t.u.t.t.t.r.t.t.u.t.u.t.u.u.u.u.u.u.u.u.u.u.i.u.i.i.i.a.a.a.f.a.f.k.g.g.g.g.A.g.g.g.g.h.h.k.h.k.h.h.k.g.g.f.g.z.d.f.f.f.d.k.i.f.f.k.f.f.d.z.i.a.a.k.k.g.a.f.g.g.f.g.g.h.g.h.h.g.A.G.A.A.A.A.A.h.H.A.S.A.S.A.A.S.G.S.H.H.H.D.H.A.U.L.L.Y.U.Y.T.T.Y.T.~.~.T.~.~.!.~./././.(.(.(.(.(.(.(.(._.(./.|._._._._._._._._._._.^.^.`.(.(.(.(././././.~.~.~.~.~.~.[.!././.(.(.(.^.^.(.(.(.!._.(.(.(.].(.(.(.(.).{.(.{.(.{.(.(.(.(./././././.(.(./.(.!.(./.!./.^./././.~.[./.~.~.~.~.~.[.T.T.T.T.T.P.L.S.L.L.G.S.S.G.z.A.A.A.h.l.A.A.h.l.h.h.l.l.h.h.h.g.g.g.g./ S S ZXZXDXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXGXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXVXZXZXBXm.} ~ Q [ xXcXcXcXxXxXcXzXcXzXvXzXzX.XdXzXdXdXdX.X.X.X.X.X'.|.|.`.|.`.`.^.^.^.(.[./././.~.~.~.~.~./.T.~.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.~.T.T.T.T.T.T.U.T.U.T.U.T.P.P.T.T.T.T.T.T.T.T.T.T.P.~.P.P.P.T.T.T.T.~.~.~.T.~.~.~.T.[.T.~.~.~./.~.~././././.T.~.T./.R.Y.~.~.~.T.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.P.T.P.Y.P.P.P.T.U.T.U.Y.T.T.Y.P.P.T.P.oXT.T.T.T.U.T.T.~.T.~.T.T.~.~.~././.~.~.~./././././././.(.(.^.(._._.}.}._.|.|.|.|..X X X X.X.X.X X.X|..X.X.X.X X X.X.X.X.X.X.X.XdX.X X.X.X.X.X X.X'.@X'..X.X.X|.|..X|. X|. X|.|.|.|.|._.|.}.}._.^._.(.`.(.(.(.(.(.(.(.~.T.(.~.~./.T.T.T.~.T.T.U.",
+"Z Z B Z Z Z C Z C Z Z Z D C Z C C Z C Z C D D C D C C C C Z C Z C Z F Z Z Z Z Z Z Z Z Z Z H Z Z D H P H H H H H L J J J P L J P J J J J P L P P I J P P J L J P G K H J H H P J P L J J J J P P J I J J J H H J K J H Z H Z C K q = $   #             o o o $ $ $ $ & , $ & & % % % % % ; ; % % : % * % % % * * * % * % % % % & % $ % & $ $ $ $ o o o                       $ B w.a.i.t.i.u.i.i.p.w.i.a.i.i.i.i.a.a.a.i.i.i.a.u.i.i.i.d.i.i.i.i.i.i.i.a.i.a.a.a.i.i.s.i.i.u.i.u.u.u.u.u.p.t.t.t.y.t.t.t.t.t.r.t.t.t.t.u.t.t.p.t.t.t.t.t.u.t.u.t.u.t.u.t.u.u.u.i.u.u.i.i.i.a.a.a.a.a.f.f.h.g.g.g.k.k.g.k.k.A.h.z.k.h.k.h.h.g.g.g.f.g.k.k.f.k.k.f.k.k.z.f.f.f.f.f.z.f.f.k.f.f.f.f.a.z.z.h.h.h.h.h.h.h.h.h.g.A.A.A.G.H.A.S.S.S.S.S.H.A.H.A.H.S.L.H.L.L.L.L.L.L.U.U.T.T.T.T.Y.T.Y.T.T.~.~.~./././.^.(.(.(.^.(.^.|.^.`.|./.|.}._._._._.`._._._._._._.^.`.(.~./././././.~.(.~.~.~.^.E././.(.(.|.`.(.(.(./._.(.(.(.(.(.(.(./.`.(.(.(.(.(.^.(.(.(.(.^././.^././.^.(./.[./.(.(.(.(.^././././.~./.~.~.~.~.T.~.~.T.T.U.P.U.L.L.H.H.S.S.S.z.A.h.A.A.l.l.h.A.h.A.l.A.h.h.h.h.g.g.g.a.S ! / BXDXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXAXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXDXFXFXFXFXDXFXFXFXFXFXFXFXSXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXAXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXZXZXBXpX[ ~ Q m.cXcXnXdXvXxXzXcXzXcXdXcXcXxXzXzXdXdXdXdXdX.XdX.X X.X|.|._._.|.^.(.^.(.(.(././.~.~.~.~.T.(.~.~.~.T.~.T.T.T.T.T.U.T.T.T.T.T.~.T.~.~.~.T.T.~.T.T.T.T.T.T.T.T.T.U.T.Y.T.T.P.T.T.T.T.T.T.T.T.~.P.Y.Y.T.T.T.Y.Y.~.T.P.~.T.T.~.[.T.~.~.~.~.T.~.~./.~./././.(.~.R././.~.~.~.~.~.~.~.T.T.Y.T.T.T.~.T.T.~.T.T.T.T.T.T.T.P.T.P.T.P.U.T.U.Y.Y.T.Y.T.T.T.!.[.Y.T.T.T.T.T.T.T.T.T.T.~.T.~.~.T.~.(.~.[.~././././.(.(.~.(.(.`.^.|._.}.}.|._.|.|.|.|._. X@X X.X X|..X.X.X|..X.X'.|..X.X.X.X.XzX.XdX.XdX@X.X.X.X.X.X.X XdX.X.X.X.X X.X.X X.X|.'..X|.|.|.|.|.}._._.|.^.(.|.|.(.{.(.(.(.(.(.(.~.~.~.~./.T./.T.T.T.T.",
+"Z D Z Z Z Z Z Z Z C Z Z D C Z Z Z B F C C C C C C F C Z D Z C C Z Z C Z Z C Z G Z H Z D Z H H H H H H H H H L J J J H H J J J H J J P P J P L L P P L P J J J J J J J J L L H I L P J J J J P L L P I H H K H J H P H Z L G L H Z H Z u y % o       #             o o $ o $ o o o $ $ $ $ $ , $ $ $ $ , $ $ $ $ , $ $ $ $ & $ $ o $ o     o                 #   #   $ q T i.a.i.t.f.a.a.a.i.i.i.d.i.u.i.i.a.a.a.a.a.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.a.a.a.a.a.a.i.a.u.a.i.s.i.u.u.u.i.u.t.t.t.t.u.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.u.u.t.u.u.t.t.u.u.u.u.u.u.i.i.i.i.i.i.k.i.f.a.k.f.f.g.g.g.g.k.A.d.g.z.h.g.h.g.h.h.k.g.g.f.g.g.f.g.f.k.f.k.k.k.f.f.f.f.k.f.k.a.a.f.f.f.f.f.a.j.l.l.h.h.h.l.h.l.l.A.A.A.A.A.A.G.S.S.S.S.A.S.S.H.A.H.H.H.S.L.L.L.S.L.L.L.Y.P.U.Y.T.T.T.^.T.~.T./././.(.!.(.(.(.(.(.`.(.(.(._.{.`.{._._.|.}._.}.}.}.}.|.(._.(.^.(.(.(./.(././././.!.^.~././.(./.(.(.(.^.(.(.(.(.(.(.(.(.(.(.`.(.(.(._.(._.(.|.|.(.(.(.(.(./.(.(.(./.(.(.(.(.(.(.(.^.(.(././././././././.~.~.!.~.^.T.T.T.T.T.U.L.L.L.H.G.A.H.G.A.A.g.A.h.A.h.h.A.z.A.h.h.h.l.z.h.h.k.g.~ ~ ! ZXDXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXDXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXGXZXZXFXBXm.[ ! ! c.cXcXcXcXvXzXxXzXcXcXzXzXzXzXzXcXzXzXdXdXdX'.@X'..X|.|.|.|._.}.}.(.(.^.(./././.~.~.~.~.R.~.T.~.T.T.T.T.T.T.T.T.T.U.T.T.T.T.~.T.~.~.~.T.T.T.T.T.T.T.T.T.U.T.U.P.T.P.T.P.P.P.Y.Y.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.!.~.~.~.~.~.~.T.~.~.~.~.T.^.~.~.~./././.~./././././.~.(.~.~.T.T.~.T.T.T.~.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.Y.Y.T.T.Y.T.T.T.T.T.T.T.T.T.!.P.T.T.T.T.T.T.~.T.~.T.~.~.T.[.~.~./././././.[.(./././.{.^.(.{.`._._.|.}.}.'.|.|.|.'. X.X.X|..X'.|..X.X.X.X.X.X.XdX.X.X.XzX.X.XdX.X.X.XdX.X.X.X.X.X.X.X.X.X|..X X|..X|..X X X|.|.|.|.|._.|.}._.(.|.^._.|.^.(.(.(.(.(.(.(././././.T.T.~.T.T.T.T.",
+"B Z B D C Z C Z B F C C Z B C Z C Z A Z Z C Z B C C C C B C Z Z Z Z Z Z Z Z Z Z Z Z D D H D H D Z H H H H J J J J H H I J J J P J P J J J J P P P H P I J L L J P H G J L L H J P L P J J L K L P P J F H H H H L L H Z D D D Z Z Z H H C F H Z * % $ o                           o         o o o o o   o o   o     o                       #   #         $ 0 u w.e.g.i.i.d.f.s.a.s.a.s.i.s.i.u.i.i.i.u.a.a.u.a.a.i.i.i.u.u.i.i.d.i.i.i.i.i.i.i.i.d.i.f.a.f.a.a.a.a.a.a.a.i.i.u.u.i.u.u.u.u.u.u.u.t.t.t.t.t.r.t.t.r.r.r.r.t.t.t.t.t.t.t.t.t.t.t.u.u.u.u.u.u.u.u.u.i.i.a.i.s.i.f.a.f.k.f.g.g.g.f.A.k.A.k.z.l.g.z.g.h.h.k.g.g.g.g.g.f.g.f.k.f.k.f.k.k.k.f.f.k.k.k.k.z.g.g.g.z.g.g.h.z.h.l.h.h.l.l.h.j.A.A.A.A.A.A.A.A.h.S.A.S.S.S.S.A.H.Z.H.L.L.S.L.S.L.Y.L.L.Y.P.Y.T.T.Y.T.Y.~.T.!././././.(.(.(.(.(.`.(.(._._._.(.(._.`.|._.}.|.}.}.}.}._.|._.|._.(.(.(.(./.(.^.~.(.(.~.~././././././.(.(.(.(.(.(.).(.(.(.(.(.(.(._.(.(.(._.(._.^.`.^.(.(.(.(././.(.(.(.(.(.(.(.(./.(./.(.(./.(././.~././.~.~.~.~.T.~.T.~.T.U.U.L.L.L.H.L.G.D.D.A.A.A.A.A.A.A.h.l.A.A.A.h.h.S.h.h.k.h.k.~ ! S CXDXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXAXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXZXZXZXFXBXQ.{ Q ! [ cXmXcXxXxXxXcXcXzXcXxXcXcXzXzXzXzXzXzXzXdXdXdX X|..X|.|.|._.[.|.(.(.(.(././././.!././.~.~.~.T.T.T.T.T.T.T.P.U.T.T.T.T.T.[.T.~.T.T.~.T.~.~.~.T.T.T.T.T.T.U.P.T.P.T.T.T.P.P.P.P.P.T.Y.T.T.T.Y.Y.I.Y.T.T.P.T.T.~.P.~.~.~./.~.~.~.~.~.~.~.~.!.~.~././.(./././.T.!./.T.~.~.~.~.T.T.~.T.~.~.T.T.T.T.T.~.T.Y.~.Y.T.T.Y.Y.T.T.T.T.T.T.U.Y.T.P.T.T.T.T.P.oXY.T.Y.U.T.T.T.T.T.T.~.T.~.~.~.~.~./.~././././.!.!.(.).(.(.|.^.(.`.{._.|._.|.|.|.|.|..X X.X.X.X.X.X'..X.X.X.XdX@X X.X.XxX.X.XzXdX.XdXdX.XzX@XdX'..X.X.X.X.X.X'..X|..X|.|.|.'.|.|.|.|.|.}.}.}._.(.(.|.|.`._._._.(.(.(.(./././././.~.~.T.T.~.T.T.",
+"Z Z Z Z Z C Z Z Z Z Z Z C Z C D C Z C Z C Z D B C C D C C Z Z Z Z Z Z Z Z Z Z D Z D D D D H D H H H P H H L J P H J K Y J J P P P K Y J I P P J L P P K J J J J J J U K J J H H J J H J J H J J J J J J J L J H P H P L H Z H Z H Z Z D G H Z A D D Z Z A y % % $   o                                 #                             #         % % u Z T d.z.i.k.i.f.s.a.i.k.a.a.i.i.k.a.i.i.a.i.i.u.i.i.i.u.u.a.i.i.i.i.a.a.u.a.i.i.i.i.i.i.i.a.d.i.i.f.a.a.a.a.a.a.a.a.i.a.i.i.u.i.i.u.u.u.u.u.t.u.t.t.t.r.t.r.t.r.t.r.r.t.t.t.t.t.u.t.t.u.t.t.u.t.u.u.u.u.u.u.u.a.i.i.a.a.a.s.a.a.a.k.a.g.g.g.k.k.k.k.z.g.h.h.k.h.k.h.g.g.g.g.g.g.d.g.k.k.f.f.f.g.k.k.g.k.k.g.k.g.g.k.g.a.g.g.g.h.h.l.g.g.l.G.A.A.A.A.A.A.A.S.A.A.A.S.S.G.A.A.H.H.H.H.H.S.L.L.U.U.L.L.L.I.P.T.T.U.T.P.T.~.~.~./.~././.(.(.(.(.(._.(.(._._._.(.|.^.|.|._.|._._.}.}.}.|.|._.(._.(.(.(.(.(./././.(././.~./.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(._._._.(.(.(._.(.(.(.(.(.(.(.(.(.(.(.^.(./.|./.(.(.(.(.(.(././.(.(.(.~./.^.~.T.~.T.~.T.T.T.U.L.U.L.H.L.G.D.H.A.A.A.Z.h.S.A.A.A.A.A.A.A.g.A.A.A.h.h.h.~ ~ ! ZXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXAXFXFXFXFXFXDXDXGXSXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXDXAXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXBXpX[ ^ ~ [ cXcXcXcXnXcXcXvXvXxXxXdXcXdXzXzXxXzXdXzXdXdXdX@X.X.X|.`. X|._.`.(.(.(.(./.{./.[.~.~.R.R./.T.~.T.T.T.T.T.T.T.T.U.T.U.T.T.T.P.T.~.T.~.~.T.T.~.~.P.T.T.T.T.T.P.T.P.T.U.T.T.P.P.P.P.Y.Y.T.T.T.T.T.T.T.T.T.[.T.~.T.~.~.~.~.~.~.~.~.~./.~.~./././.!././.(./././././.R.^.T.~.~.~.T.~.~.~.T.T.~.~.T.T.~.T.T.T.Y.T.T.Y.T.~.T.T.T.T.T.T.U.Y.P.Y.P.P.T.T.T.Y.T.U.U.^.T.T.T.T.T.T.T.~.T.~.~.~.~.~.~./.[././.(./.(.(.).(.(.(.^.|.|._.|._.|.|.|.|. X|. X.X.X X'..X.X@X.X.X.XzX.XdXdXdX.X.X.XzXdXdXdXdX.X'..X.X'.'. X.X.X.X.X|..X.X.X|. X|.|.'.|.|.|._.}.}.}.}.|.`._._.^.|._._.(._.(.(./././.!./.~.~.~.~.~.T.~.",
+"Z Z D C C Z C C C C C Z D C Z C Z C Z C Z C C C F Z C C Z D B Z Z Z Z Z Z Z Z Z D D D D H D D Z H H H H J H J H J J H J Y K P P L P J J J J H J P P P H J J P J L H H J J L H J J J J J J J J J K J H H J H H J H H G H Z H H L D Z H Z Z Z Z Z Z Z D D D Z Z C Z B m u q = 0 * % o $ o         #     #                 o $ & w u u Z Y T z.z.z.g.g.g.z.k.k.f.k.z.f.k.s.i.i.s.a.i.a.a.t.a.a.a.i.i.i.i.u.u.a.a.u.a.i.i.i.u.u.a.u.i.i.i.i.i.i.i.a.a.i.f.i.a.f.a.a.a.a.a.a.i.i.i.i.i.i.i.u.u.u.u.u.u.t.p.p.t.t.r.r.r.r.r.t.r.t.r.t.t.t.t.t.t.t.u.u.t.u.u.u.u.u.u.i.a.i.i.i.a.a.a.a.k.a.k.f.g.g.a.g.k.Z.k.k.h.h.k.g.h.h.h.k.g.f.f.f.f.g.f.g.k.f.f.f.g.f.g.f.g.k.k.k.g.k.g.g.g.g.z.g.z.h.l.l.l.G.l.l.A.A.A.j.A.A.A.S.G.A.G.A.S.Z.S.S.H.A.S.S.L.L.L.L.U.L.U.L.U.U.P.P.T.T.T.^.T.T.T.~.~.~./.!.(.!.(.(.(._.(.|.^._._.(.`._.|.{.|.|.|.{.}.}.}.}._._._._.(.(.(.!.(.(.(.^.(././././.^.(././.(.(.(.(.(.(.(.(.!.(.(.!.(.(.(.(.(._._._._._._._._._.(.^.`.(.(.(.^.(.(.(.{.{./.{.{.(.{.(.(.(./.(././.(.^./.~./.~.T.^.T.T.T.T.I.I.L.L.L.H.H.H.D.G.A.H.g.A.A.A.A.A.A.A.A.A.A.A.h.h.h.h.h.~ ~ ! CXDXDXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXDXDXZXBXQ.} ~ ! M.cXcXcXcXxXdXvXcXxXxXcXcXzXcXzXzXzXzXzXzX.XdX X.X.X.X|.|._._._.^.(.(.(.^./././.~.[.~.~.(.T.T.~.T.~.T.T.T.T.U.U.T.L.^.T.T.T.~.T.T.~.~.T.T.~.T.T.T.T.T.T.T.U.T.P.T.P.P.Y.P.P.P.T.Y.U.Y.T.T.T.T.T.~.Y.T.T.T.~.T.~.[.!.~.~.~.~.^.~.^././.(./.~./././././.(./.(././.(.~.^.~.~.~.~.~.T.~.T.~.T.~.~.~.T.T.~.Y.T.T.~.T.Y.T.T.T.T.~.T.P.P.T.Y.P.L.^.P.P.T.Y.U.T.T.P.T.T.T.T.T.T.~.~.R.~.!.~.~.~.^.~./././.(././.(.(.^.`.(.`.^.|.|._._.|.|.|..X|.'. X'..X.XdX.X X'..XdX@X.XzXdXzXdXxX.XzX.X.XdXdXdX.XzX.XdX.XcX@X.X.X.X.X.X|..X X'.|..X|.'.`.`.|._.}.}.}.}.`.(._._.`.{.|.(.(.(.(.(.(.)./.!.~.~.~.~.~.T.T.T.",
+"Z Z Z Z B Z Z C C C Z Z C F Z C A C Z C D B Z D G C C Z Z Z Z Z Z Z Z Z F Z D Z Z Z G H Z D L L H H H L H J H J H L L P L J J P I J P P L P J I J L P L L J J L H J J U H H J J J J J J J K H I J H J H H H I U H H H Z L Z Z Z Z Z D D Z D D Z D D C D Z Z Z C Z C C C D C C Z B Z B Z Z Z Z Z S D Z Z Z C H Z T b.z.h.h.A.A.A.l.A.H.l.l.l.h.h.A.z.k.h.k.g.a.h.f.a.f.a.a.a.a.a.d.a.a.s.i.i.i.i.i.i.u.i.i.i.i.s.u.a.u.i.i.u.a.a.p.i.i.i.i.i.s.t.a.a.a.a.a.k.a.g.a.a.a.a.a.a.a.a.s.u.i.i.u.u.i.u.s.t.u.t.t.t.r.r.r.r.r.t.r.r.r.t.t.t.t.t.t.t.i.t.u.u.u.u.u.u.i.u.i.i.a.a.a.f.a.a.j.a.a.f.f.f.g.g.A.k.z.k.g.k.g.k.h.g.g.g.g.g.g.g.f.g.k.f.g.f.k.d.g.k.g.g.g.f.k.h.h.l.h.h.h.h.h.h.g.l.l.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.G.A.A.G.S.S.H.H.G.H.H.K.H.L.U.L.L.I.L.Y.U.P.T.T.T.T.~.~.~.!././.(./.(.(.(.(.(.|.^._.(._.(._._._._. X X_._._. X}.}.|._._._._._.(.(.(.^.(.(.(././.^./.^./.(.^.(.^.(.(.!.(.^.[./.(.(.(.].(.(.(.(.(.(.`.).(.(.`.(._._.(._._.(._.(.|.(.(.`.|.(.|.(.(.(.^.(.(.(.(.(./.(././././.~.~.~./.T.T.T.T.I.P.U.P.L.S.L.G.D.A.G.G.h.A.A.G.A.A.G.S.A.A.S.z.A.A.z.h.h./ / ! BXDXDXVXZXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXDXDXGXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXGXDXDXDXAXDXFXFXFXFXFXFXFXFXFXAXFXAXZXZXBXQ.} ~ ~ c.fXvXxXxXnXxXxXcXcXcXxXxXxXdXzXcXdXxXzXzXzXxX'.@X.X.X.X|.|.|.|.{.`.(.(.(.(./.~././.~.~.~.T.T.T.~.[.T.T.T.U.T.U.U.Y.T.T.P.T.T.!.T.T.T.~.~.T.T.T.T.T.T.T.T.T.P.P.T.T.T.U.T.U.T.I.I.I.U.T.U.T.Y.T.Y.T.T.~.T.~.~.~.T.T.~.~.~.(.[.(.~./././.(./././.^.(.^.(./.(././.!.(.~.~.~.~.~.~.~.T.T.~.T.T.~.~.~.~.T.~.T.T.T.~.T.~.T.T.T.T.Y.~.Y.T.T.T.T.T.T.Y.U.U.I.Y.T.T.T.T.T.~.T.T.~.~.T.~.~.T.(.T.~.~.(.~.(.!.(.(.(.(.(.`.|.(._._._.|.}.}.|.|.|.|.|.'. X.X|..XdX.X.XzX.X.XzXzXzXzXzXzXdXzXzXzXdXdX.XzX.X X.X.X.X.XdX.X.X.X.X.X.X|.|.|.|.|.|.}.}.}.}.}._.}.}._.|.|._.}._._.}.{.(.(.(.(.^.(././././.~.~.T.~.~.",
+"B Z Z C D C Z C Z C C C C C C Z C C C Z C Z Z C C Z C Z C Z C Z Z Z Z Z Z G Z G H Z D H Z L L Z H H H L L H J J J H I J J I I J J P L P P P H J K P I K L L U K J J H K L L Y K J H P J J P P L J J H H H H H H H H H H H H Z H Z Z D D G Z D H Z Z Z G Z C Z Z C C Z C C C C Z D Z D Z Z Z Z Z C Z Z Z Z Z C G G g.D.S.A.g.h.h.l.z.z.l.l.G.l.h.g.z.h.g.k.g.j.g.f.k.f.a.a.f.k.a.a.a.i.a.i.i.i.i.i.i.i.i.i.t.i.u.u.a.u.a.u.a.E x.p.a.i.i.s.i.a.i.a.a.a.a.i.k.a.a.a.a.z.a.a.a.f.t.i.i.s.u.s.u.u.i.u.u.u.t.t.t.r.r.r.r.r.E r.r.r.t.t.t.r.t.t.t.u.t.t.u.u.u.u.i.u.u.i.i.i.a.a.a.f.a.d.a.f.f.d.f.a.g.k.d.z.k.A.k.A.g.g.h.g.f.g.g.g.g.k.g.g.k.k.f.k.k.g.k.g.g.g.k.h.h.h.l.l.h.h.h.h.h.h.l.h.l.A.A.g.H.S.A.H.S.A.H.S.S.G.A.A.S.A.S.S.H.Z.H.H.S.H.L.R.K.U.K.U.U.P.U.Y.T.T.T.T.~.~.~.~.~././././.(.(.^.(.^.(.(.(.(._.`.`._._._._._.}.|.|.}.}.}.}. X_._._._.[.(.(.(.(.(.!.(.(./././.{./.(.(.(.{.(.(.(.[.(.).(./.(.(.(.].`.(.^.(.(.|.`.(.(._._.(._._.(.(._.(.(.(.(.(.^.`.(._.(.|.^.(.(.(.(./.^./././.^.~.~.T.~.T./.T.T.T.I.U.L.P.L.A.G.G.G.A.G.G.H.H.A.H.G.G.A.S.H.A.A.S.A.H.A.D.z.P S ! CXDXDXAXAXZXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXAXDXSXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXDXSXDXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXAXZXZXBXm.[ Q Q b.cXcXcXxXxXxXxXcXxXxXxXxXxXcXzXcXcX.XzXzX.X.X.XdX.X.X X'.|.|.|._.`.(.(.(.(.(.(././.~.T.T.T.~.~.T.U.T.T.T.U.U.T.T.P.P.T.T.T.T.T.T.~.T.T.T.T.~.T.~.T.T.T.T.P.T.T.T.T.T.T.U.I.Y.I.I.I.T.I.T.T.Y.T.T.~.~.T.T.T.~.T.~.T.~.~.~.~.~./.(./.^.~.(././.~.(.(.^.).(.(././././.(././.~.~.!.~.~.~.(.~.~.~.T.T.U.~.T.~.~.T.T.T.T.T.~.T.Y.T.Y.T.T.T.T.T.P.U.P.U.T.T.U.T.T.Y.Y.T.T.T.T.~.T.~.~.T.[.T.~.~.~.~.(.~././.(.(.^.(.(.^._._._._.{.}.}.}.|.|.|.|..X|..X.X.X.X.X.XzX.X.X.XzXdXdXzXzXzXdXdXzXzXdXdX.XdXdXdX@XdX.X.X.X'..X.X.X.X|.|.|.|.|.|.}.}.}.{.}.}.}.}._._._.|.}._._._._.^.(.(.^.(./.(./.~././.~.~.T.T.",
+"F C Z Z C C B Z C C C C C Z C B Z C D C Z Z Z C B D Z C Z Z Z Z Z Z Z Z D Z D D L D H Z L Z L L H H H Z P H J J Y H P J J P P P P P P L L P P J I P P L H J L J H J Z J K H L J J H J J J J J H K J H L H H H H H H H H Z L D D L Z L H Z Z Z Z D D Z Z C C Z C Z B Z C G Z D Z C Z D Z F Z D Z Z Z Z Z Z Z D D T Z.G.A.h.Z.h.A.l.l.l.h.l.l.l.h.A.h.g.k.g.g.g.g.f.f.g.a.a.f.a.a.a.a.d.a.a.i.i.i.i.a.i.u.i.i.s.i.u.u.i.u.a.a.u.u.s.i.p.i.i.i.i.a.a.a.i.i.g.a.g.a.f.a.a.a.a.a.a.a.i.i.s.i.i.u.u.u.u.p.t.u.t.t.t.r.r.r.r.r.r.r.t.r.t.t.t.t.t.u.t.u.t.u.u.u.u.u.u.i.a.s.a.a.a.i.a.f.d.f.j.d.f.f.f.a.d.z.g.d.d.A.k.g.h.g.g.h.h.h.k.g.k.g.d.f.k.f.z.g.k.h.k.z.g.g.h.h.l.l.h.h.A.l.h.h.l.h.l.A.A.A.G.H.A.S.H.H.G.A.S.S.H.H.S.S.S.S.H.G.H.H.H.H.H.L.R.H.L.Y.U.U.T.T.T.T.T.T.Y.~.T.~.~./././.^.(.(.(.(.(.(.(.(.(.(._._.(._. X_._.}._.}._.}.}. X}._._._._.`.^._.(.!.(.(.^./.(././.(./.(.(.(.(.(.[.^.!.(.!.(.!.).!.(.(.(.(.(.(.^.^.(.(.(._._._.(.(._.(._._.(.^._.(.(.^.(.(._.(._.(.(.(.(./.(././././.).^.~././.T.T.T.T.T.I.U.U.L.L.U.L.G.L.H.H.H.H.H.H.H.Z.H.H.H.H.G.H.A.A.A.A.A.A.! ! ! CXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXDXDXFXFXFXFXFXFXDXAXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXGXSXFXFXFXFXFXFXAXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXAXFXAXDXFXBXpX{ / Q [ cXnXJXcXcXxXxXcXcXxXdXxXxXdXxXzXzXzXzXzXzXzX.XdX.X.X X X|.|._._.`.`.^.(.(./././.!.~.(.T.T.~.T.T.T.T.T.T.U.T.T.U.^.Y.T.T.T.T.T.[.P.T.^.T.T.T.T.T.T.T.T.T.T.P.P.P.U.T.U.U.Y.I.U.U.Y.U.U.T.T.Y.T.T.T.~.T.~.T.~.[.T.~.T.~.~.~.~.~.~.[.^.[.^./.(./.(./.(.(.(.(.(././.(.!./.~.~.~.~.~.~.^.T.E.^.~.E.T.~.~.~.T.T.~.T.T.~.T.T.Y.T.T.T.T.T.T.T.T.T.T.U.T.I.U.T.U.T.T.T.Y.T.~.T.T.T.~.~.T.~.~.(.~.~.~.^.(.(./.(.{.(.(.(.(.(._.(._._.|._._. X|._.|. X|.|..X.X.XdXdX.X.XzXzXzX.XxXzXzXcXxXcXzXzXzX.X.X.XzX@XzX'.dX.XdX.X.X.X.X.X.X|.|.`.|.|.|.|.}.}.}._.}.}.|.|._._.|._._._.^.|.(.(.(././././.~.^.T.~.~.T.~.",
+"G B C C Z Z Z B C C Z C C C C C C Z B C C Z C Z Z Z C D Z Z Z Z F Z Z D D G Z Z D D Z H H H L L H P H Y H H J P H K L P P J P P P P P J P P J P L P L H J J J H G K H J P U L L P J J J H I J J J H L L H J H H H Z U H L H D D Z L Z Z Z Z Z G Z C Z C Z C G Z C Z C C C C B C C Z C Z Z D Z Z H Z Z Z Z Z Z Z T g.H.z.G.g.h.A.A.A.l.l.l.l.l.l.g.g.h.h.g.g.a.g.k.f.f.f.f.s.a.f.f.k.a.a.i.a.a.s.i.i.i.i.u.s.i.u.i.u.u.i.u.u.u.a.i.i.i.s.i.i.a.i.i.i.k.k.i.k.f.f.f.f.f.f.a.a.a.a.i.a.u.u.u.i.u.u.p.u.u.t.p.r.r.r.r.t.y.r.r.y.r.r.t.t.t.r.r.t.t.t.t.t.u.t.u.u.u.i.a.i.i.a.a.i.z.a.f.f.a.a.i.g.a.g.k.g.d.A.k.k.k.A.h.h.g.g.k.k.k.g.f.g.g.g.g.g.f.g.k.k.h.h.A.h.h.A.S.l.h.h.G.A.h.A.l.A.A.A.A.A.A.G.H.G.A.A.H.G.S.S.S.S.S.S.S.S.A.H.G.H.H.H.H.L.H.L.I.L.U.T.T.T.T.T.T.T.T.~.~.~.^.~./././.(.^.(.{.(.`.(.(.(._._._.(._._. X_.}.}.}.}.}.}.}.}._. X_._._._.(.(.(.(.(.^./.!.(.(./.(.!.(.(.(.(.(.[.`.(.(.(.(.(.(.(.(.(.(.(.(.|.(.(.(.(._.(._._._._._._._._.|.(.^.|.{.`._._.(.(.(.(.(.(.(././././././.~.~.T.T.T.T.T.T.U.T.U.U.U.L.P.L.L.G.H.H.H.H.H.H.H.H.S.H.H.H.G.G.S.S.G.A.D.h.S / ! ZXDXDXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXDXSXGXZXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXFXFXDXAXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXDXDXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXDXZXBXQ.[ / ^ { cXcXzXxXcXcXxXxXcXxXcXxXdXcXdXzXzXzXzX.XdXzX.X'..X.X.X.X|._._.|._.^.(.^.(./.[././.(.T.~.!.T.T.T.T.T.U.T.U.T.U.T.U.P.T.Y.P.P.T.P.^.T.P.T.T.~.T.T.T.T.P.T.T.T.P.T.U.U.U.T.T.U.U.I.I.U.T.U.T.T.T.T.~.T.~.T.T.~.T.~.~.(.T.~.{.~.~./.~.~.^.E.(.(.(.(.{.(./.(.(./.(.(.~.)././././.!.~.T.P.^.T.T.~.T.(.T.~.T.~.~.T.~.T.Y.T.Y.T.T.T.T.T.T.T.T.T.T.Y.Y.U.U.Y.Y.Y.T.T.U.T.T.T.T.T.T.T.~.~.~.T.T.~.~.[.^.~./.(.(.(.(.(.(.(._._._._._._._.|.|.|.|..X.X.X.X.X.X.XdX X.XzX.XzXzXdXzXzXzXdXdXdXzXzXzXzXcX.X.XzX.X.XdX'.@X'..X.X.X.X.X|.|.|.|.|.|.}.}.|._.|.|._._.|.|.{._.|.[.}._.{.|.(.(.(.(././.^.~.~.(.T.~.~.",
+"C C C Z Z C C Z C C C C D C Z C Z C Z C C Z Z C C Z Z B C D Z Z Z Z D D D D H Z D H Z Z H H H H H H H H H H P J L L P L P J P P Y P P J I J J P P L L J H J J F J H J H J J J J J J J P H J J J H J L Z J H H H H F H H D H D Z H Z Z H Z D Z Z Z Z Z D Z Z Z B Z C Z Z C Z D B Z C Z F Z Z D F Z Z Z Z Z Z Z G T Z.l.l.A.l.h.A.z.G.l.z.l.l.l.h.l.l.l.h.z.g.g.g.k.g.a.f.a.j.f.s.i.k.i.a.a.a.a.a.a.i.a.i.i.s.i.u.u.i.u.u.i.u.i.i.s.i.a.i.i.a.i.a.a.i.a.i.f.g.j.z.f.z.f.f.a.a.a.a.i.i.i.a.i.u.i.u.u.p.t.s.t.t.r.r.y.t.r.y.y.r.r.r.r.r.r.t.t.t.t.t.t.u.u.u.u.u.u.u.s.u.u.a.a.f.a.f.a.g.g.f.a.j.f.f.k.g.k.k.k.k.g.A.h.g.g.h.g.g.g.g.j.f.g.f.g.f.f.g.g.h.h.l.h.h.S.h.A.z.A.A.A.h.A.A.A.g.A.A.S.A.S.S.H.H.G.H.H.S.H.H.G.A.H.H.H.S.H.S.H.H.H.L.H.I.L.U.U.Y.U.T.T.T.T.T.T.~.T.~.~.~./.^././.(./.(.(.[.|.(.{.^.(.[._.}.}._._._._.}.}.}. X}.}._. X_._._. X_._.(.(.(.(.(.(.(.(.(./.^.(.(.(.[.(.(.(.`.(.(.[.(.(.(.(.(.(.(.(.|.(.(.(.(._.(.(.`.|.(.`._._._._.|._.|.|._.|.`.|.`.`.(.(.(.(./.(./.[././././.~./.~.~.T.T.T.T.U.U.Y.U.K.L.U.S.U.S.U.S.G.L.L.H.H.H.L.S.H.S.H.S.D.D.A.A.A.A./ ~ ! ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXZXFXBXm.} Q Q [ mXcXnXcXcXcXcXxXnXcXxXxXdXnXdXxXzXzXzXzXzXzX@XdXdX X'.'. X_._. X(.`.(.(././././.(.~.~.~.~.T.T.T.T.T.T.T.U.T.U.U.T.T.T.P.T.T.T.T.T.[.P.T.!.T.T.P.T.T.T.T.T.T.P.P.T.U.T.U.U.T.T.I.Y.I.U.T.T.U.T.~.~.T.~.T.~.T.[.T.T.[.~.~.~.~./.~./././.(./.(./.(./.(.(./.(./.(././.(./././././.~.~.T./.T./.T.T.T.~.~.T.~.~.T.~.T.Y.~.T.Y.!.T.T.T.T.T.T.T.T.T.Y.P.U.U.U.Y.P.T.T.T.T.T.T.T.T.~.T.~.~.~.~.~./././.(././.(.`._.(././.(._._._._._._.|.|.|..X.X.X.X.X.X@XdXdXdX.X.XdXdXcXdXdXmXzXzXdXnXdXvXdXzXzXzXzXzXzX'. X.X.X.X.X.X|..X'..X X|.|.|.|.}.}.}.`._.|.|.|._.|._.|._.{.|.|._.(.(.(.[.(.(.(.(.~.~.~.~.T.~.",
+"Z Z C C C C C C B Z C F C C C C C Z B C Z C C Z G C Z Z Z C Z Z Z Z D H D D H L D L L L H Z J H U H P H P H H J L H P P K I J P J I P P J I P J P J H J G J J J J J H J H G J J J J L H J J J J J H L H H H H H H H H H H H D D Z H H Z D Z Z Z Z Z C C C Z Z D C Z Z C Z C Z Z Z Z Z Z F Z D D Z Z Z Z Z Z Z D T Z.D.A.D.l.h.A.l.z.A.h.l.l.l.A.l.l.l.h.g.g.g.g.h.k.g.g.f.f.f.g.k.a.k.a.a.a.a.a.i.i.i.i.i.u.s.i.u.i.u.i.u.a.t.i.t.a.i.i.a.a.a.i.a.a.a.k.a.z.a.a.f.a.f.a.k.a.a.k.a.i.i.i.i.i.u.i.u.u.u.t.t.t.r.r.r.r.y.r.y.y.r.r.r.r.t.r.r.t.t.t.t.u.u.u.t.u.i.u.i.i.a.a.a.a.z.a.a.g.a.g.a.f.f.f.d.k.k.k.g.l.k.k.g.h.g.h.g.g.a.d.f.f.g.g.g.g.g.g.h.z.l.k.h.h.z.h.A.A.A.A.h.A.A.A.H.A.H.A.S.S.S.S.H.H.K.A.Z.S.G.H.H.H.S.G.G.G.H.A.H.H.H.H.L.H.L.L.K.U.T.T.T.T.T.T.T.(.T.~.~././.~./././.(.(.(.(./.^.`.`.^.|._.}._._.'.}.}.}.}.}.}.}.}.}._._.}._._._._.(.(.(.(.(.(.(.(.(.(.~.(.(.(.(.(.^.^.^.(.(.(.(.!.(.(.(.(.(.(.^.(.(.(.(.(.(._.^.^.`.|._._._._.^._.^._._.(.(.(.(.(.`.(.(.(.(././././././.~.~.T.T.T.T.T.T.U.T.U.L.L.L.L.U.L.L.L.S.L.L.G.H.L.L.H.S.H.H.H.H.G.G.H.S.A.H.A.~ ~ S CXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXAXDXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXBXm.[ ! ^ m.cXnXcXcXcXcXcXxXnXdXxXxXcXdXnXdXdXzXzX.X.X'..X'.@X.X X X|. X_._.`.(.(.(././.~./.~.!.~.T.T.P.~.P.T.T.T.T.T.T.T.T.T.T.T.P.P.P.P.T.T.T.T.T.T.T.T.T.T.U.T.T.P.T.T.T.T.U.U.U.Y.Y.U.I.U.T.U.T.T.Y.T.~.T.~.T.~.~.T.T.[.~.~.~.~.~.^./.~.!./.~.(././.(.(.^././.(././././.(.~.(./.(././.!.^.^./.R.~./.~.~.~.~.~.T.T.T.~.T.U.T.U.Y.Y.Y.T.T.T.T.T.T.P.P.P.U.U.U.P.P.T.P.T.U.T.T.T.T.T.T.T.~.~.T.T.~.~././.^.(.(./.(.(.(.^.(._._._._._._._._.|.|..X.X.X.X X@X XdX XdXdXvXdXdXdXdXdXdXdXzXzXzXzXnXdXnXzX.XzXzX.XzXdX'.'..X.X.X.X.X X'.|..X|.|.|.|.|.}.|.|._._.|.|.|._._.|.|._._.|.|.(.(.(.(.(.(.T./.~.!.T.(.T.",
+"C C C C Z C C C C C C C C C C Z Z C Z C C Z Z Z D Z C Z Z Z Z Z Z H H Z H H H Z L Z H H H H H H H H H P J H H J H J J P Y J P P J I P P J J K P J J J J H F J J K G J H J J J L J J L P J J H Y J J H H J H H H H Z H D Z D H D H Z Z H Z D D Z Z Z Z D C B Z Z Z C Z C Z B Z Z Z C Z Z Z Z Z Z Z Z Z Z Z F Z D j.A.h.l.A.g.h.A.A.z.z.A.l.l.h.g.A.g.l.h.h.h.g.h.h.g.g.a.k.f.g.a.g.a.i.a.a.a.a.a.i.i.i.a.i.i.u.i.u.u.u.a.u.a.i.i.a.s.i.i.a.i.a.i.f.i.i.s.a.g.a.z.k.f.f.f.a.f.a.a.a.i.a.a.u.u.i.u.u.p.u.t.t.t.r.r.r.y.t.r.t.y.y.y.r.r.r.r.t.t.t.t.t.u.u.u.u.u.u.i.u.i.a.a.a.a.a.a.g.a.f.f.f.k.f.f.d.k.d.z.g.g.k.g.g.g.g.g.g.g.g.j.g.d.f.g.g.g.g.g.h.h.z.z.S.h.h.A.j.Z.A.A.A.A.A.A.A.G.S.S.S.L.S.S.H.H.H.H.H.H.H.H.S.H.G.G.G.G.H.G.H.H.L.H.H.L.K.L.T.P.T.T.~.T.T.T.T.~.[.~.~.~.~.[./.(./.(.(.(.[.(.(.(.^.|.^._._._.}._._. X X}.|._.}._.}.}. X}._. X_.(.(.(.(.^.(.(._.!.!.(.(.(.(.(.`.^.`.`.!.[.(.(.(.(._.(.(.(._.(.(.(.(.(.(.(.(.(.(.(.|.^.`.{._.|._._.}.|._.(._._._.^.|.(.(././.(./.~./.~.T.~.~.~.~.T.T.T.T.U.U.U.U.L.L.L.L.L.L.L.U.L.L.L.L.L.L.H.H.H.S.H.H.H.D.S.H.A.A.A.S / ~ CXAXFXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXDXDXBXpX[ Q ~ c.vXnXcXcXnXxXcXvXxXcXcXcXzXcXdXdX.XxXzXzXdXzXdX'..X.X.X.X|._._._.`.(.(.(.^./.(.~.~.~.~.~.T.~.T.~.T.T.T.T.T.T.T.U.U.T.T.T.T.P.T.T.P.P.T.T.T.T.T.T.T.Y.U.T.T.P.T.P.U.T.U.T.I.T.U.T.U.T.U.T.T.T.T.T.~.T.~.~.~.~.~.~.~.~.~.~./.~././.~.~./././.(.^./.(./.(.(.{.(.(.~.(.(.(.(././././././././././.~.~.~.~.~.~.T.~.~.T.T.T.Y.~.Y.T.~.T.T.T.T.U.T.T.U.U.U.U.P.P.T.T.P.T.T.U.T.T.T.T.T.~.Y.~.~.~.~./././././.(.(.(.(.(.{._.(._.(._._._.|.'. X X'..XzX.X.X XdX#XdXdXzXdXdXdXdXdXdXdXdXzX%XdXdXdXzXzX.XzX.XzXdX.XdXzX'..X.X.X@X X'..X X|.|.|.|.|.|.`.|.|.|.|.|.|.`._.`.`.`._._._.^.(.(.(.(./.[./.~.~.~.!.T.",
+"Z C Z C C B C Z C C C D C C C C Z C C C Z C Z Z C Z Z D C Z Z D Z Z Z Z Z Z H L Z H H H H H H P H H H H Z J H J J H P P J J P J P J P P I J U P J J P L H J J H H J H J H J J L L J J J J J J H J H L J H H H H H H H H D H H D Z H D Z D D D Z D B Z C C G Z Z Z Z C Z C D Z C Z Z Z Z Z Z F Z Z Z Z Z Z Z Z D b.z.z.S.D.k.h.A.z.A.h.h.l.l.l.g.G.l.h.h.h.l.h.h.h.z.g.g.z.k.a.g.i.k.a.k.a.a.a.a.i.i.i.i.i.i.i.i.a.u.u.u.a.u.i.i.i.a.s.i.a.a.i.a.i.i.f.g.a.a.g.z.k.k.k.a.z.a.f.a.i.a.a.u.i.i.s.p.u.t.s.t.t.t.t.r.r.r.E E y.t.w.r.t.E r.r.t.t.t.t.t.u.t.u.u.u.u.u.u.i.s.i.a.a.z.a.a.a.k.k.f.f.z.a.d.k.A.g.g.g.g.g.j.g.g.g.g.f.f.g.g.j.g.z.g.g.k.g.h.h.h.f.D.A.A.h.h.A.A.A.A.A.A.A.H.A.S.H.H.S.S.L.H.S.H.L.H.H.H.H.H.L.h.L.H.H.H.L.S.H.H.H.L.L.L.L.U.U.T.T.T.~.~.[.~.~.~.~.(.!.(././././.^./.(.(.!.{.(.(.^.^.|.}._._._._.}.|._._._.{.}. X_._._._._._.^.(.(.(._.(.(.(.(.(.(.(.!.(.(.[.(.[.(.(.|.(.(.(.(.(._.(.(.(.(.(._.(.(.(.(.(.(.`.`.(.^.`.|.|.(._.|.[._.|._.(.`.|._.(.(.!.(.(./././.~./.~.~.T.~.~.T.T.T.T.U.U.U.U.L.U.L.L.L.L.L.L.L.J.U.L.L.L.H.U.S.S.H.H.H.G.H.S.S.A.H.! ! ! AXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXDXMXQ.{ Q ! c.nXnXmXcXxXxXxXxXxXcXxXdXcXdXnXdX.XzXzXzX'.dX.XzX.X.X.X X|. X X_._.`.(.(.(.^.(./.~.~.~.~.~.T.T.T.T.T.P.U.U.T.U.T.U.T.T.T.P.T.P.P.P.T.P.T.T.P.T.P.T.T.T.T.T.T.T.P.U.T.T.U.T.U.T.U.T.U.T.U.T.I.T.~.T.~.T.~.~.~.~.T./.T.[./.~././.~././././././.^.^.).(./.(.(.^.^.{.(.(.!.(.(././././././.~././.~.~.~.~.~.T.T.Y.~.T.T.~.Y.~.T.T.Y.~.T.T.T.T.T.U.T.L.U.L.U.T.P.P.P.T.T.T.U.T.T.T.~.T.~.~.Y.~.~.~.~././.(.(.(.(.(.(.(.(._._._._.|.|._.'.|. X.X.X.X.XdXdXdXdXdXdXzXdXcXdXzXdXdXmXnXdXdXzX.XmXzXzXzXdXzXzX@XdXdX.XdX.XxX.X.X X.X|..X.X.X|.|.|.|.|.`.|._.|.|.|.`.`.`.`.`._._._._.{.(.(.(.(.(./.~.~.T.~.~.",
+"C C C C C C F C C C A C C C C C C C Z C Z Z Z Z C C Z F Z Z D D H S Z H Z H Z L H L H ( G L H J H L H H L H H J J H J J P P J I P P P P J P P J L K U P H L J H H J J H J K G H P J P J J H H K H L L H L H H H F H D H S F H F H Z J Z Z Z Z Z Z B B Z C Z Z C C Z C Z Z C Z Z Z Z A F Z Z Z Z Z Z Z Z Z Z Z G j.h.A.z.h.h.l.A.A.A.A.h.A.h.h.l.h.h.A.A.h.A.A.h.h.h.z.d.l.k.d.z.a.f.z.z.a.a.a.a.a.i.a.a.a.u.i.i.u.u.u.i.i.i.a.i.a.a.a.a.i.i.a.a.a.a.a.a.a.i.z.a.k.z.f.s.a.a.a.a.a.a.a.s.a.i.i.u.i.u.t.u.t.t.r.y.t.t.y.y.y.t.y.t.r.r.r.r.r.r.t.t.t.t.s.r.a.u.a.r.u.i.i.a.a.a.i.k.a.g.i.k.f.f.f.s.g.k.k.k.k.k.z.d.k.l.k.g.g.k.g.k.k.j.h.k.z.z.l.l.l.l.l.l.h.A.A.Z.A.A.A.A.A.A.A.G.S.S.H.H.H.H.S.S.L.H.L.D.L.A.L.L.H.H.H.H.S.H.D.S.H.L.L.L.L.L.L.L.I.T.~.T.Y./.~.~.~.~.~././././././././.(./.(./.[.(.(.(.(.|._.|._._.{.|.|._.}.|.|.|.|._.|._._._.^.`.(.|.(.(.(.(.(.(.(.(.(.(.^.(.(.(.(.(.(.(.(.(.(.(.{.(.`.^.(.`.(.(._.(.|./.|.|./.^.(._.|.|.^.|./.|.(.(.|._._._._.(.`.^.`.^.(.(./.!.(.~.~.~.T.T.~.T.T.T.T.T.U.P.P.P.P.P.P.P.L.L.L.L.L.L.L.L.L.L.L.S.U.S.H.L.H.H.H.S.S.Z.S.S Q Q ZXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXVXBXQ.} Q Q c.MXnXnXnXcXcXcXfXxXnXxXzXdXzXzXdXzXzXzX'.zX.XxX'..X.X.X'..X|.|.|._._._.(.(.(././.!.T./.~.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.U.T.U.T.I.T.Y.Y.Y.Y.T.T.T.T.P.T.T.T.T.T.T.U.T.T.T.T.Y.Y.T.T.T.T.T.T.T.T.T.T.~.T.~.~.~.T.~.~.^.~./.~./.~./.~.^.~.(.~.(.(./.(.(.(.(.^.^.(.^./.(.(.^.~.{.(.^.[.!./.~./.~./.~.~.T.~.XXE.T.T./.T.T.T.T.T.T.T.T.T.T.XXU.U.U.T.T.T.P.T.P.P.P.P.P.U.T.U.T.T.T.~.~.T.T.~.T.~.~.~.(.(.(.~.^./.(.(.[.(.(.|._._._.|._.|.|..X.X.XzX.X.XzX.XxXzXzXzXzXzXcXdXzXzXzXzXzXxXzXzXdXxXnXzXzXzXzXzXzXzXdXdXzX.X.X.X.X.X.X.X.X.X.X.X|.|.|..X|.|.|.|..X|.|.|.|._.|._._.(.(.(.(.(.^.(.!.~.~.~.~.T.",
+"C C B Z C C C C C C C C Z C A C C D C Z Z C C Z Z Z Z Z Z Z H D Z Z H Z H L L Z J Z H H Z L H L L H H L L J J H J J H J L P P J P P P P L J P P P H H P K P J J J H H H J H J P P L J J J J J H J L L H H H H H H H H F H H D H Z Z D Z D Z Z Z Z Z Z C D C Z Z Z Z Z Z Z Z Z C Z Z Z Z F Z Z F Z Z F Z Z Z C G g.A.h.S.H.z.l.A.A.h.A.l.h.A.l.l.h.h.k.h.h.h.h.h.l.h.h.g.g.k.k.f.f.z.s.a.a.a.a.a.i.a.a.i.a.u.u.a.u.u.a.t.i.i.a.a.a.a.a.s.a.a.a.a.a.a.a.a.k.f.a.g.f.k.f.f.a.a.k.a.k.a.a.a.s.a.s.i.u.u.u.t.t.t.t.t.y.y.y.t.y.r.r.y.r.y.r.r.r.t.t.t.u.u.t.t.r.a.u.a.i.s.s.u.a.a.k.a.k.i.z.a.f.f.f.z.z.d.k.k.g.k.g.k.k.k.k.k.g.g.g.g.k.k.k.h.h.z.h.h.l.l.z.S.A.j.A.A.A.A.A.h.A.G.G.A.D.D.H.H.H.H.L.H.L.L.L.S.L.L.L.D.H.H.H.H.H.H.L.G.L.S.L.L.L.L.L.Y.T.I.T.T./.R.~.~.~.[././././././.(./.(.[.[.(.(.(.(.(.(.(.`.^._.(.|._.|._.|.|.|.|._._.|._.|.|.|.`.`.^.`.(.(.(.(.(.(.(.(.(.(.`.(.(.(.(.|.(.^.`.(.(.(.(.(.(.^.(.(.(.(.(.(.(.(./.(.(.^.`.).^._.|.`.`.`.`.`._._.|.|._.(.(.(.(.{.E././.!.~.~.~.~./.~.T.[.T.T.T.T.U.T.P.P.P.U.P.P.L.L.L.L.L.L.L.L.L.U.S.L.S.H.L.G.L.H.H.H.H.H.H.~ ~ Q CXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXGXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXZXAXBXpX[ / / { nXdXxXxXcXnXcXcXxXxXxXnXcXcXzXcXdXxXzXzX.XzX'.@X.X.X.X'.'.|.|.|._._.(.(.(.(././.!./.~.T.~.T.T.T.T.T.T.T.T.T.U.T.T.T.I.T.U.T.I.T.T.U.Y.U.T.Y.T.T.T.T.T.T.P.[.T.T.T.U.Y.T.T.Y.T.T.T.T.I.T.T.T.T.T.~.T.~.~./.T././.~.~.~././.~./.~.~.~.^./.(.~./.(.(./.(.(.(./.(.).(.(./.(.(.(.[.~.~./.~./.!.~./.~.(.T.T.~.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.U.U.T.T.P.T.Y.U.U.P.Y.T.P.T.U.XXT.T.T.Y.T.~.T.~.T.~.~.~.~.~.^.(.(.(.(.(.(.(._.(._.(.`._.|.|.|. X.XdXdXzX.XzXzX.XzXzXzXzXzXzXzXzXzXzXzXzXxXzXzXdXxXdXzXzXzXzXzXzXzXzXzXdXzXzXzX.X.X.X.X.X.X.X'..X'.|.|.|.|.|..X|. X X|.|.|._._._.(.`.^.(.(.(.^././.~.~.T.T.",
+"C Z Z D Z C B C C C C C C C C C C C Z Z Z Z Z Z Z Z D D D L Z Z Z J Z H L Z H H Z H H H H H H H H H L H L J H J L P P L P J P P P J Y P L P J P H P L H U H H J Z J J J U K J J J J I H J J H J H H U L H H H Z H H D H H D H D H Z Z Z Z Z Z Z F D B D Z C B D Z C Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z A Z Z Z Z H G Z.A.A.h.z.h.A.h.h.h.h.A.h.z.h.h.h.h.k.h.h.l.l.z.h.g.g.k.k.f.f.f.a.a.a.a.a.i.i.i.i.a.i.a.i.i.u.i.u.u.u.i.i.a.a.i.a.a.a.a.i.a.a.a.a.k.a.a.a.a.k.f.f.f.a.z.f.z.a.a.a.a.a.a.i.i.u.i.u.u.u.u.t.t.t.y.y.r.r.y.E r.y.r.r.r.r.r.r.t.t.t.t.u.t.u.t.u.u.s.u.a.u.a.a.a.a.a.f.a.g.a.f.k.f.j.d.g.k.k.k.k.g.g.d.k.k.k.g.k.g.z.j.k.h.k.h.h.h.h.A.h.A.h.A.A.j.A.A.A.A.H.A.A.A.G.S.H.H.G.H.S.L.S.S.L.S.L.S.L.L.Z.H.H.H.H.L.H.L.L.Z.U.L.L.L.L.U.P.T.T.T./.T./.~././././.[././././././.(././.(.[.(.(.^.(.(.^.^.`.`._._._._._._.`.`.'.|.|.{._._.|.^.(.(.(.(.`.^.(.{.(.(.(.(.(.^.(.(.^.(.(.(.(./.(.^.(.(.`.(.(.^.`.(.^.(.(.(.(.(.(.(.[.(._._.|.^._.|.`.|.|.|.|.(._.`.(.`.(.(.^.^././././.~.~.~.T.T.~.~.~.T.T.U.Y.P.U.P.P.P.P.Y.L.L.U.L.U.P.P.U.L.L.L.L.L.L.H.L.G.L.S.H.S.H.H.~ ~ ! CXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXAXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXAXAXDXGXSXFXFXFXFXFXGXSXDXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXAXDXFXDXAXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBXQ.[ ! S b.nXnXnXxXcXnXcXcXvXxXxXxXdXxXdXnXdXdXzX@X.X.X.X'..X.X.X.X X|._.}._._._.(.(.(././.!.!.~.~.T.~.T.T.T.T.T.T.P.Y.T.T.T.T.T.T.T.T.I.I.T.T.U.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.U.T.T.T.T.T.T.T.T.T.T.T.~.~.T.~.~.~./.~.~./.!./.~.^.~.~.~.~./.~.^.~././.(././.(.(.{././.{./.(.(./.^./.{.^././.~././.[.~./.T.~.~.~.T.~.T.T.T.T.E.U.T.T.T.T.T.U.XXT.U.T.U.T.P.P.P.T.P.P.T.T.U.T.U.U.T.I.T.~.T.T.~.~.~.~.~.(.{.~.(./.(.{.^.(.`.(.(.(._.`.{.|._.|..X.X.X.X.XzX.XzXzXzXzXzXzXzXzXzXzXzXzXcXzXxXcXcXxXdXzXzXcXdXzXzXzXzXzXzXzXzXxX'..X.X.X.X.X.X.X.X|..X|.|.|.|.'.'.|. X X X|._.|._._.[.`.(.(.(./.(././.~.!.~.Y.",
+"C C C B C B F Z C C C C C C Z C Z C C C B D C Z Z Z Z Z Z Z H Z L Z H H Z H H H L H H H U H L J H L L L L H H H J L L L P J P P J I P P P I K J H U K J H J H L K G J H J L H J J J J P J J J H H H H H L H H H H H H H H H Z H Z H Z L D Z Z Z B D Z C C Z Z C D B Z Z C F C F Z Z Z Z C Z Z D Z Z F Z Z Z Z U h.A.h.A.h.h.l.l.A.h.h.l.l.h.h.h.h.h.h.g.l.h.l.l.h.z.l.k.k.f.f.f.a.a.z.f.a.z.a.z.a.i.a.i.a.i.s.u.i.s.a.i.i.i.a.a.f.a.a.a.a.a.a.a.a.a.a.a.i.f.f.f.f.f.f.f.a.f.z.a.a.a.a.s.i.i.i.s.u.s.t.t.t.t.t.t.r.r.y.t.r.r.y.r.r.r.y.r.y.t.t.t.t.u.u.u.u.t.i.r.i.u.a.i.a.a.a.a.i.a.a.g.a.k.f.f.g.k.k.k.z.k.k.k.z.d.k.g.g.h.k.k.k.h.k.h.h.h.h.h.A.A.h.A.h.A.A.A.g.G.A.A.G.G.A.H.A.H.L.H.L.L.L.L.U.L.L.L.P.U.D.U.S.L.K.H.L.H.H.L.L.L.L.L.L.L.L.U.T.T.T.T.T.T.~./././.(.^././.(./././././.(.XX(.(.^.(.(.(.(.`.(.`._.|.|._.|._.`.|.|.|.|.|._.|._._.`.`.(.(.`.(.^.^.(.(.(.(.(.`.|.(._.`.|.^.|.`.|._.`.(.(.(.(.|.(.(.(.`.(.(.(.(.|.^.|.|.(._._.^.|._.|.|.(.|._.|._.^.^.(.`.(.(.^.^././.!.~.~./.T.~.T.T.T.T.T.T.T.Y.T.P.P.P.P.P.L.U.U.U.T.U.P.L.L.Y.U.L.L.L.L.L.G.L.L.U.H.H.H.~ ~ Q CXZXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXAXDXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXDXAXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXVXBXm.} / S M.nXnXnXnXcXcXcXcXcXxXxXxXcXnXzXzXdXdXdXdXzXzX'.'..X.X.X.X X|.}.}._._._.(.(./././.~.~.~.T.~.T.T.T.T.T.T.T.T.U.[.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.T.U.Y.T.T.T.T.~.T.T.T.T.T.T.~.U.T.T.~.T.T.~././././././.~.~./.(./.~.(.~./././././.(.(.(.(.(.(.(./.(.(.(.^.^.E.[.~./././.~.~././.(.T.T.~.~.T.T./.T.T.T.XXT.T.U.T.XXU.U.U.U.U.L.T.Y.P.P.P.P.T.P.P.T.U.T.T.Y.~.U.T.T.~.~.~.~.~.~././.~.[.(.E.(.(.^.^.(.(.^.^.|.(._.|.|.'.|..X.XzX.XzX'.zXzXzXzXzXzXzXzXzXzXzXzXcXzXxXnXdXdXnXdXzXdXzXzXzXzXzXzXzXzXzXzXzX.X.X.X.X.X.X.X.X|..X.X.X X.X|..X|.|.|. X_._.|.^.|.(.(.(.(.(./././.~.!.~.~.",
+"C C A C C D C C C C C B Z C C C C D C C D B Z Z Z Z D D D D L H H H H H H H H Z Z L H U H L H H H H L L J H J H J J J H J I J J P J P P P L J P P H P J H J H J H J L L H H H J J J H L H J J H H H J H H P Z H H F H H H F H H H Z H Z D D Z Z Z Z D Z Z Z Z Z Z B D C Z C Z D B F Z B D Z C Z Z Z Z Z Z Z G T Z.A.A.A.h.h.l.h.A.h.l.l.l.z.h.h.g.g.z.D.k.D.h.g.h.h.k.k.k.f.k.i.f.a.z.a.a.a.a.a.a.a.a.a.i.i.s.a.i.i.i.i.i.a.a.a.k.a.a.a.a.a.a.i.z.a.z.a.a.a.f.s.f.f.g.f.a.f.f.a.a.a.a.i.i.i.s.u.i.u.u.u.t.r.r.r.r.r.y.w.y.r.y.r.y.r.r.r.r.r.t.t.u.t.t.u.u.u.u.u.i.u.i.i.i.i.i.a.i.f.g.f.f.f.f.g.g.k.k.g.z.k.d.z.f.k.f.g.g.g.g.g.z.z.h.h.h.z.l.h.A.h.A.h.A.h.A.A.A.A.h.S.A.A.G.G.H.H.H.L.S.L.L.L.L.L.L.L.L.L.L.D.S.L.L.L.S.L.U.D.D.L.L.L.L.I.U.U.T.T.T.T.R.!./.~./.^./.^././.(././././././.[.(.~.(.(.^.(.(.(._._._.|._.|._._.|.|.|.|._.|.|.|._._.(.(.`.^.^.^.(.`.^.{.(.(.(.^.(.`.{.`._.|.}.|._.|.{.|.(.^.(.^.|./.|./.(.(.(.(.(._.^._.|._.^.|.`._._.|.(.|.|.|./.|.(.`.(.(.(.(.(././.~.~.~.T.~.~.T.~.T.T.T.T.T.T.U.T.U.U.Y.P.Y.L.Y.U.P.P.Y.P.U.P.P.L.L.L.H.L.L.A.L.L.G.U.S.~ / S ZXZXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXFXFXSXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXZXHXm.[ ! ~ c.nXcXcXzXcXcXcXxXcXxXxXxXxXxXzXzXdXdXdXdXdX'.'.dX.X.X.X|.|.|.|.|.|.^._.(.(.(././.~.~.~.T.~.T.~.T.T.T.T.T.T.T.T.[.T.T.T.T.T.T.Y.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.T.T.T.T.T.T.T.T.T.T.T.U.~.~.T.~.T.XXT.XX~./.[.~.(.~.~.~.~.~.~./.(.^././.!.(./.^.(.(.(.).(.(.(.(./././.!.^.(.^./.(.~.[.~././.~.~.~.~.~.U.~.T.T.T.T.T.T.T.R.T.T.T.T.T.T.Y.U.U.P.P.P.P.P.T.T.P.U.T.T.T.T.T.T.T.T.T.T.~.~.T./.~.(.~.(.^././.(.(.^.^.(.(.(.|.|._.|.|.|..X.X.XdXzXdXdXdXdXzXdXdXdXzXzXzXzXdXxXxXxXxXdXxXdXcXzXnXvXzXzXzXzXzXzXzXcXcXzXzX.XdX'..X.X.X.X.X.X.X X.X X|.|.'.|.|.|.|.|.|.{._.|.(.`.(././././././.[.~.T.",
+"C C C C C C C C C C C B C C Z C B Z G C Z Z Z Z Z Z Z D D D Z H H Z H H H D H H D Z H H H H J H H H H H H J H H J H J I J K Y K P P L P P P J J P L H J J H J H J H L H H J J H J J H L J H H J H H J H Z Y H H H H H Z H H H H Z J H D Z Z Z H B Z C A Z B C Z Z Z Z Z Z Z Z B Z D Z Z C Z Z Z Z Z D Z Z Z Z T j.A.A.A.A.h.l.S.h.h.l.h.h.h.x.h.g.g.g.g.z.h.z.z.h.k.h.f.f.d.k.i.a.a.a.a.a.a.z.a.a.a.a.a.i.i.t.i.i.s.i.i.i.a.a.f.a.a.a.f.k.i.g.f.a.a.a.a.a.a.a.f.f.f.a.k.f.a.a.a.a.a.i.i.i.i.u.s.u.u.t.t.p.t.t.t.y.r.r.y.y.r.r.r.r.r.r.r.r.t.t.t.t.u.t.u.t.u.u.u.u.u.i.u.i.i.i.a.g.d.s.a.z.f.g.g.k.g.g.k.A.d.z.k.f.f.f.f.g.g.g.k.k.h.h.h.h.l.l.l.A.h.A.h.A.A.A.g.A.S.A.h.H.H.H.H.H.H.U.L.L.H.L.L.L.L.L.L.L.L.L.U.L.L.D.U.U.L.P.L.U.L.L.U.L.I.T.U.T.T.T./.~././.(./.(.{.(.(./.!././././.(././.(.(.!.(.(.(.(.(.(.^.{.|.|._.|.|.|.|.|.|.|._.|.|.|.{.`.`.(._.|.(.^.|.(.(.(._.`.`.(.`._.|._._.[.|.(._.^.`.`.`.`.`.(.`.(.(.|.^.|.^.|.`.|.{.(.(.|.^.(.`._._.|.|.|.^.(.^.(.(.(.(.(./.(./.~./.~.~.T././.T.T.T.~.T.T.T.T.T.U.T.T.T.T.T.U.T.T.Y.P.P.P.Y.L.L.L.L.L.L.I.L.L.L.L.L.L.L.~ ~ Q CXZXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXGXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXZXVXZXZXBXQ.' / ! m.nXcXcXJXJXcXcXxXcXxXxXxXxXdXdXcXcXdXzXdXzXzX@X.X.X.X.X.X.X|.|._.|.^._.(.(./.(.(.~.~.T.T.~.T.T.T.T.T.T.T.T.T.T.P.I.~.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.P.T.T.T.T.U.L.T.T.T.~.T.!.~.T.~.T.~.~.U.~.~.~.T.T.E.~.(.(.(.~.~.~./.~.^./.(.E.[./././././././.(.(.[./.(.(././.(.^./.(.(.^././././.~././.~.(.~.T.~.~.T.~.~.T.T.T.T.T.Y.T.Y.T.U.L.U.U.I.T.T.P.P.Y.P.P.P.P.T.U.P.T.T.T.U.T.T.~.T.~.Y./.~.~.~.~.~.(.^././.(.(.(.(.(.(.^.|.^.|._.|.|.'..X.X.XdXdXdX@XzX@XzXzXzXzXzXcXcXxXxXxXxXcXcXdXvXzXdXzXcXxXcXdXxXzXxXdX.XcXzXzXdXdX.X.X.X.X.X.X'..X X.X'..X.X|.|.|.|._.|._.|._._.(.(.(./.(././.~.~.~.~.",
+"C C C C C N B C C C B F C C B C B F Z C Z Z Z Z Z D D D G Z J Z H H L H H L L H L H L H H H H H J H H P U H H J J H K L P L P J I P L P P L L J L H H J J H Z J J H K H F J H K H J H J K H H H H L H H H H H H H H H H H D H H L S Z Z H Z Z Z D Z C Z C Z Z Z Z C C Z Z B Z Z C Z B C Z Z Z Z Z Z F Z Z C H T A.A.A.A.A.h.A.h.h.h.l.l.h.l.j.j.g.g.g.h.z.h.g.g.k.h.k.k.k.i.k.i.a.f.a.a.a.a.a.a.a.a.a.a.a.i.i.i.i.i.i.i.a.i.a.a.a.a.a.f.a.f.g.a.f.a.f.a.a.f.a.s.s.a.f.a.f.f.a.f.a.k.a.a.i.i.i.u.u.u.u.t.t.t.t.t.t.r.r.r.r.r.y.r.t.r.r.t.r.t.t.t.t.u.t.t.u.t.t.u.u.u.u.i.u.i.i.a.i.a.g.f.a.k.k.f.g.z.k.g.d.k.d.d.f.f.f.g.g.k.k.h.h.l.h.h.h.h.h.l.z.A.h.A.h.h.A.Z.G.A.S.H.H.H.H.A.D.H.L.L.L.H.L.L.L.L.P.L.P.L.L.L.L.L.L.L.L.L.P.P.L.U.L.L.I.T.I.T.T.T.!.~.T././.(./.(.(.[.(./././.~.(.(.~.~.(./.[.T.(.E.(.(.(.(.`._.^._.|._.}.|.|.|.|._._.|._._._._.^.|.^.{._.(.(.`.^.(._._._._._.`.^.|._._.`._._.{.`.(.|./.`.|.`.|._.|.^.(.|.(.`.{.(.(.`.(.`.^.|.{.`.`.(.|.(.(.(.(.(.(.(.(././.(.[.~.~.~.~./.T.T.~.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.U.P.P.U.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.! ! Q CXZXGXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXDXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXZXZXFXBXm.[ ~ S [ fXvXcXcXdXcXxXxXcXxXdXxXzXxXzXzXnXxXdXdXzX.X'..X@XdX.X.X|.|.|.|.|.`.(.|.(.(./././.T.!.(.~.T.T.T.[.P.T.T.T.T.T.[.T.~.~.T.T.T.~.~.T.T.T.T.T.T.T.T.T.~.T.T.T.P.P.T.I.Y.T.T.T.T.T.~.T.~.~.T.~.T.T.~.~.~.T.~.~.~.~.~.T.(.~.(.~./.~.~./.~././.(.!./././.(.(.(.^.^./.(././.(./.~././././././.[./.!.[./.~.~.(.E.T.T.~.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.U.U.T.P.Y.P.T.P.Y.L.Y.U.U.U.T.T.T.T.T.T.~.~.~.~.R.~.~.~.~.~./././.^.(.^.(.(.(.(.`.`._._._.|. X.X.X@X.X'.dXzXzXdXdX'.xXzXzXdXxXdXcXxXxXcXcXxXxXzXnXdXnXxXxXxXxXzXxXxXxXxXzXzXzXdXdXdXdX'.'.dX.XdX.X.X.X.X.X|..X'.|.|.|.|.|._._._.^.(.[.(./././.~.~.~.~.",
+"C C C B C u C C C C u C C C C C Z C C D B Z Z D D Z D D Z H H H L L Z G G Z Z H H H Z H H H J H H H H H H K J H H H U L P P H I P P J I K P J J H J J H J H L J F J J H H J J G J H J H J H H H H J H H H H H H H D H K H F H D Z L Z Z Z H Z Z Z Z Z Z Z F B Z Z Z Z A D F C Z Z Z D Z C Z B F Z Z Z Z Z F U e.Z.A.A.A.A.A.h.h.l.h.l.l.h.g.z.g.h.k.k.k.g.g.g.k.h.k.k.k.i.k.i.f.a.a.f.a.g.a.a.a.a.a.a.a.a.i.i.i.i.i.a.i.a.a.a.a.z.a.a.a.a.a.a.a.a.f.f.i.a.a.s.f.f.i.a.f.f.a.a.a.a.a.a.a.i.s.u.i.u.u.u.t.p.t.t.u.r.r.r.r.y.r.t.r.r.t.t.r.t.t.t.t.u.t.u.t.t.t.u.u.u.u.u.u.u.i.i.i.i.i.a.g.g.k.g.g.g.g.g.k.d.z.k.k.f.f.f.g.g.k.h.k.h.h.l.h.h.l.l.h.A.h.h.A.A.A.A.A.A.A.h.H.S.h.J.S.H.A.L.H.L.L.L.L.L.L.L.P.L.L.L.U.L.P.L.P.L.P.P.P.L.L.K.R.I.T.T.T.T.T.~.~././././.(./.(.(.(././././.[.(.T.[./././.^.^.{.(.(.(.(.^.|.|._._.|.`.|.|.|.|.|.|._._.|._._.|._._.).^.(.(.(.].(._._._._._.|._.^._.(.`._._.`.`.(.|._.|.(._.|.`.(.`.`.^.(.`.^._.|.^.(.`.`.(.`.^.(.|./.(.`.(.(.^./.^./.(././././.~./.~.T./.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.Y.T.Y.Y.Y.Y.U.Y.P.P.L.L.L.L.L.L.L.L.U.L.U.U.L.~ ! Q CXZXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXAXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXFXFXZXFXCXm.} / ~ { cXnXcXcXcXcXxXxXxXxXcXxXxXzXcXzXdXdXdXxX.XzXzX.X.X X.X.X X|.|.|._.`.{.(.(.(.(./.^././.~.T.(.T.T.T.T.T.[.T.T.T.T.~.T.T.T.~.T.T.T.U.[.T.T.T.T.T.T.T.T.P.Y.P.~.T.P.T.Y.T.T.T.T.~.T.~.~.~.T.T.~.T.T.~.T.~.~.~.~.~.{.~.~.(.~.(.~.~.(.~./.T.!.(././././.(.(.(.^././.(././././.(././.~.[././.~.~./.~.~.(.~.~.R.(.~.~.~.~.T.~.T.T.T.T.T.T.Y.Y.T.I.U.Y.U.T.P.T.P.P.P.U.U.U.U.U.E.T.T.T.T.T.T.R.R.~.(.T.T.~.~./././.~.~.^./.(./.(.(.(.(.|.|.|.|.|.|..X'..XzX'.'.dX'.dX@XzXzXzXdXdXdXcXxXxXxXxXxXxXdXnXcXdXxXxXxXvXvXxXxXvXxXxXcXcXzXdXdXdXdX@X.XdX.XdX'..X|..X.X.X.X|.|.|._._.|.|.|.(.(.(./.(././.(.[.~.~.",
+"C B C C C C C C C C C C C C Z C Z B D Z Z Z B G Z L Z Z Z L L L L L L Z H Z L L D H H H H H K H L H H H L U P H L H K L K J H L L U H H J H L Z H H P H L L L L L L J H L Z J J L J L L J H L J H J H H H H H H H H H H H H H H H D D D Z Z D Z Z Z Z Z Z Z B D Z Z Z F D Z Z C A Z Z C Z Z Z Z Z B Z C D A G e.A.A.A.A.A.A.A.A.l.l.l.l.h.g.h.g.h.g.g.h.g.g.g.g.z.f.k.f.k.i.a.a.a.a.a.i.f.a.a.a.a.k.a.a.a.a.a.i.i.i.i.a.i.i.i.a.g.i.s.a.s.g.g.a.a.f.a.a.a.a.a.a.k.i.i.a.a.k.a.k.f.a.a.a.a.u.u.i.u.u.u.t.u.t.t.E t.r.r.r.r.r.t.y.r.r.E t.t.u.t.u.t.u.t.u.t.i.r.u.u.u.u.u.u.i.i.a.a.a.f.f.f.h.g.g.f.g.f.g.k.f.f.k.f.f.j.f.g.g.k.z.z.z.h.l.l.x.h.h.h.h.h.A.A.A.A.A.G.A.S.S.H.H.H.H.H.H.H.L.L.L.L.L.L.L.U.U.L.L.U.L.L.L.U.L.P.P.P.P.U.U.L.Y.I.U.~.T.~.T.~.~.(.~././././.{.(.(.(.^./././.(.~.(./.(.~.(./.(.(.(.|.{.|.(.[.|.|.|.|.|.'.|.|._.|.|._.|.|.[.|._.^._.(.(.|.(.(.(.|.{.|._.|.^._.|.^._._._._.(.(.`.`.}._._._. X}._.}.^.|.(.(.^.`.^.{.^._.(.`.(.`.`.^.`._.(._.(.(./././.(././.~.~.~.~.~.~.~.T.~.T.~.I.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.P.P.P.L.P.L.P.U.A.L.U.L.U.U.P.T.U.~ / S CXDXAXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXDXFXBXM.} ! ! c.xXnXxXnXxXxXxXxXcXzXdXcXcXdXdXdXzXzXzX.XdXdXdXdX.X.X.X X X|.|.|.|.}.}.{.}.^.^././.!.~.^./.~.~.R.T.T.~.T.T.T.Y.T.T.T.~.~.T.T.T.T.T.Y.T.T.T.U.T.U.Y.T.T.T.T.T.P.T.U.T.U.R.T.~.T.~.~.~.T.~.~.~.T.~.T.~.T./.~.~.T./.(.(.^././.^./.!.(.T.XX~./.~.~.!././.~.(./././.(./.(./././././././.~././.~./././.^.~.T.~.~.~.~.~.T.~.~.T.~.T.K.T.T.T.U.Y.T.T.U.T.U.T.U.U.Y.U.U.U.U.U.U.U.U.U.U.U.T.T.~.~.T.~.T.(.T.^.~.^.~.~.~./.(././.(.(.(.(.`._.`.{.|.|.'..X.X.X.XdXdXdX.XzXzXcXdXzXdXcXcXxXxXdXxXxXxXxXxXxXxXxXxXxXnXnXvXxXxXcXcXJXdXdXnXdXdX.X.X.X.X.XdX.X.X.X.X.X.X.X|. X_.}.}.}.}.}.[.(.(.(.(././.~./.~./.",
+"C A C C C A C C B A C B C C F C C C C D D B D D Z L Z H L Z Z L L L D L J L Z S Z H H H H H J Z H H H H H L H J K H U H U J J J P K L L J J K Y Y J P H L L L J L L J H J L L Z Z J L H J I L Z H H H H L H H H H H D H H H H H D Z D D H H Z Z B Z Z Z Z Z F C Z Z Z B Z C Z D C C Z Z Z C Z Z C D Z C D Z T e.A.S.S.h.h.A.A.h.l.l.G.l.h.h.g.h.g.h.h.g.g.g.g.g.k.f.f.f.i.k.a.a.k.a.z.a.a.a.a.f.a.a.a.k.a.a.i.a.i.a.i.a.i.f.k.a.s.a.f.g.g.a.a.s.f.f.g.k.a.g.a.a.a.i.k.k.a.i.k.a.a.a.i.a.a.i.i.u.u.u.t.u.p.t.t.t.u.t.r.r.r.t.y.r.r.t.t.t.t.t.t.u.t.t.t.u.u.t.u.t.u.u.u.u.u.a.a.i.a.a.a.g.f.g.a.g.f.g.j.f.f.k.f.f.f.g.j.f.f.g.g.g.z.h.h.j.h.j.h.h.h.h.h.A.h.A.h.h.A.S.G.S.G.H.A.H.H.H.H.L.L.L.L.L.L.P.L.U.U.U.Y.Y.Y.U.L.U.P.P.P.T.L.L.I.Y.R.T.T.T.~.T.~.~./.(.(././.^.~.(./.(././././.~.(.[./.~.(.~./.~.(.^.^.^.`._.}.}.|._._.|.`.`.|._._._.|.{.|.}.|.(.|.|.(.`.^.(.|.^.`._.|._._._.|._.|._.|.|._.`.`.`._._.}.}._.}._._.}._.`.(.^.`.(.(.(.(.^.{.{.(.(.(.(.(.^.(./.(.{.{.(././.~./.(.(.~.~.T.~.T.T.T.T.T.~.T.T.T.~.T.~.~.T.~.T.T.~.T.~.T.T.P.P.L.L.P.P.P.U.L.L.U.U.U.Y.U.T.~ ~ ! ZXDXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXAXZXVXHXQ.[ / Q m.nXxXnXxXnXxXxXvXcXcXcXdXcXmXdXmXzXzXzXzXdXdXdXdX.X.X.X.X.X X|.|.|.}.}.^.(.(.{.^././.^.~.T.~.~.R.[.T.~.T.T.~.~.~.~.T.~.T.~.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.P.T.T.P.T.U.U.T.T.T.~.T.T.~.~.~.T.T.~.T.~.~.~.T.~.~.~./.~.~.(.~./.~./.!.~.~.~././.~.(./.~././././.(.~./.!./.~././././.~./.~.~./.[.!.~././.~.~.T.~.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.T.U.U.U.R.L.U.Y.L.Y.U.U.T.U.T.E.U.XXT.T.T.T.T.~.R./.[.~.~.~.~././.~./.(./.(.`.^.`.`.^.|._.|.|.|.|..X.X.X.X.X.XdXdX@XdXdXzXcXzXzXcXcXnXxXxXxXxXvXcXnXxXxXnXcXxXnXxXnXcXcXxXxXxXcX@XzXcXzXzXdXdX.X@XxX@X.X.X.X.X X|. X|._.}.}._.^.(.(.(./.!./.^././.~.",
+"C A C A C A A V C C u C C C C C C Z C Z Z Z Z Z G Z Z L Z J L Z L Z H D D L L Z H H H H D H H H G P H H H P H L P H J J H H J L J J K J L P U K H P H P J L L L J H H H L H H H Z L D H L Z L L H H U H H F P H H H H D H H K H H H D D Z F G B Z Z Z D Z D Z Z D Z Z Z Z Z C B Z Z C Z C F Z C Z Z B Z Z D Y j.h.S.S.S.A.A.A.A.g.G.g.A.g.h.h.j.h.h.g.h.g.g.g.f.k.f.f.f.i.i.k.i.a.k.i.i.a.a.f.a.a.k.a.a.a.a.a.i.a.a.i.a.a.a.k.i.a.g.a.f.s.i.g.g.a.f.f.a.a.a.a.a.a.a.i.i.i.k.d.a.a.a.a.a.a.i.i.u.u.u.u.u.u.t.u.t.t.t.t.t.r.t.t.r.r.r.r.t.t.t.E u.t.p.t.u.r.i.t.t.u.t.u.u.u.u.i.i.a.f.a.a.f.f.a.j.g.f.f.g.a.k.g.f.f.f.g.g.g.k.k.h.z.h.k.h.h.h.h.h.h.g.A.h.h.h.h.G.A.Z.S.S.G.G.A.H.G.H.H.L.D.U.L.L.P.L.U.U.U.Y.U.U.P.P.U.U.P.P.P.P.T.L.T.I.T.T.~.T.~.~.~././././././.(.(.(.(././././.[./.T./.[.[.(.~.(.(.(.(.(.(.|._.|.|._.|.|. X`.'.|.|.|.|._._.|._._._.(.^.^.(.(.(.(.`._._._._._._.|.|.|._._.(.`._._._._._. X_.}._._._.}.|.(.(.`.^.(.(.(.(._.(.(.(.`.(.|.(.(.(.(.(./.(.(././.!./.~.~.~.~.~.~.T.~.T.~.T.T.T.T.T.K.T.T.~.T.T.Y.T.T.T.T.T.T.P.T.U.L.L.P.L.L.L.L.I.U.T.T.P.U.! ~ ! ZXZXGXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXVXAXZXZXBXm.{ ! Q [ nXnXxXvXxXnXxXnXcXcXcXcXdXmXdXdXzXzXzXzX.X.X@X'..X.X X X|.|.'.|.}.}._.{.(._.(.^.(./.~.~./.T.R.~.~.~.^.T.~.T.T.~.T.~.~.T.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.U.T.U.T.T.T.T.~.~.T.~.T.~.~.~.~.~.~.T./.~.~.~.(.~.(.~.(.~././.~.~.~./.~././.~./.~.~.~./././././././.~.~.~./.~.~.~.~.~.[.~./.~.~.T.~.T.~.~.T.T.~.T.T.~.T.~.L.T.K.T.T.U.P.T.T.T.P.Y.L.I.U.U.U.L.Y.U.U.I.T.U.~.T.T.T.T.~.~.T.~.~.R.~.T.T.~.~.~.~././.~./.(.^.(.(.(.|.|.`._._. X|.'..X.X.X.X.XdXdXdXdXdXdXcXzXzXdXcXnXxXcXcXxXxXcXcXcXnXcXmXxXJXnXnXcXcXcXcXcXxXxXzXzXdXdXdXdXdX.X'.dX.X.X'.|..X|._.|.|._.|.(.^.|.(.(./././.~.[././.",
+"C B C C C V C C C C B B C B C C C C Z C B D Z D Z Z Z Z L Z Z L Z Z D L H Z Z Z H H Z Z Z H H H H H H P H H L H L Y J J H L L H H L H U J H H H P U H H J J Z H H H P H H H L L J L L J H J Z J H H H H H H H H D H H H G H F H Z H D D Z Z Z Z Z Z Z D D Z C Z B Z Z C C Z Z Z C B Z Z C A C Z Z Z D Z Z B L Z.A.A.S.A.A.S.A.h.A.h.A.A.j.G.h.j.h.h.h.f.g.g.g.g.f.f.f.f.f.k.i.i.a.a.a.a.a.a.a.a.a.a.a.k.a.a.a.a.a.i.s.i.a.a.a.g.s.f.f.s.a.f.s.a.a.f.f.a.g.a.a.i.a.a.i.k.f.i.a.a.a.a.a.a.a.a.i.s.u.u.u.u.t.u.t.u.t.u.t.r.t.t.r.t.r.u.t.t.t.t.r.i.t.t.t.w.t.t.t.u.t.u.u.t.u.u.i.a.a.a.a.f.f.a.g.a.g.f.z.k.f.k.f.f.f.f.j.f.k.k.h.k.h.k.h.g.g.h.h.h.h.h.h.j.G.h.G.h.h.A.S.S.A.H.H.H.G.H.L.H.S.L.L.L.P.P.P.Y.U.U.T.U.T.L.U.Y.P.P.T.Y.R.U.T.T.T.T.~.T.T.T./.~././././.^./.(.(./.(.^././././.[.(.(.~.(.(./.(.(.(.(.(.(.`.^.|._.|._.`._.|.|.|.|.|.|.|._.|._._._.`.^.|.(._.|._._._._.|.|._._._.|.|._.|.`. X_._._.}.}.}.}._.|.[.}.|.(.(.^.(.(.(.(.(.(.(.(.(.^.(.(._.(._.(.(.{./.(.(./././.~.~.~.~.~.T.~.~.~.T.T.~.T.~.~.T.T.T.T.T.~.~.~.T.T.[.T.T.T.P.T.L.P.U.U.L.L.T.Y.U.U.Y.T.T./ / S CXZXDXCXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXZXFXVXFXZXBXm.[ Q / c.nXcXnXxXnXxXxXxXcXdXcXcXdXdXdXcXzXzXzXzXzXzX#X'..X.X'..X X.X'.|.}.}.}._.{.(.|.^.(.(.(.~.E.(./.~.~.[.T.T.T.~.~.~.~.~.T.~.T.~.~.T.[.T.Y.~.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.T.Y.T.T.T.~.T.~.~.~.T.T.~.~.T./.T.~.~.~.~.~.~.~.~.~././.!./.~././././.~.~.T.)./.~.~.~.~./.T.~.~.~.~.~.T.~.~.~.~.~.~.~.~.!.~.~.T.~.T.~.~.T.~.~.T.T.~.R.T.~.T.T.T.Y.P.T.T.P.U.U.U.T.U.U.I.L.U.L.I.U.U.U.U.T.T.T.T.T.T.T.R.~.~.T.~.~.!./.~.~.~.(././.^.(.(.(.{.^.`.^.|.|._.|..X`..X@X.XdX'.dX@XzXzXzXcXdXJXdXxXxXxXcXcXcXxXnXcXnXnXnXcXnXnXnXnXnXnXcXxXxXxXdXcX.XdXdXdXxXdXdXdX'..X.X.X|.|._._.{.|.|.|.^.^.(.(./././././.[.~.",
+"C u B C C C C C C C C C C C C C C Z C Z C Z Z Z L Z L Z S L Z L P Z U Z L Z H J Z H H H H H H H H H H H H H H J H J H J J H J J L J L L L L H P H U H L Z L Z L H H H H H P L L J L J H D L Z J H H H J G H H H D H H H D D H H L L Z Z D D D D D G Z Z Z B G C B D Z Z Z Z C C F Z C Z C Z C Z Z Z Z Z C Z T Z.A.S.S.h.S.A.S.S.A.A.h.A.A.j.h.A.h.h.l.h.z.g.f.j.k.f.f.i.d.i.k.f.a.a.a.a.s.f.a.g.z.a.a.a.g.a.a.a.a.a.a.a.a.a.z.a.f.k.s.f.i.g.s.a.f.f.k.a.a.z.i.i.z.a.a.a.a.k.i.a.a.i.i.a.u.a.i.u.u.i.u.u.t.u.p.r.u.t.u.t.t.t.t.r.r.r.t.r.r.t.t.t.t.t.t.t.u.t.p.t.r.u.u.u.i.u.u.i.i.a.a.a.f.k.a.g.f.f.z.a.k.k.g.f.g.g.g.g.h.g.g.g.h.g.z.g.h.h.h.l.G.A.h.h.h.h.A.A.A.A.S.S.S.G.H.K.H.S.G.L.L.L.L.U.P.P.U.L.Y.T.U.T.Y.P.T.U.P.Y.T.U.T.T.T.T.T.T.T.~.~.~.~././.(././.(.(.(.(.(.[.(.^.(./././.[.(.(.E.(./.(.(.(.^.(.`.^.`.(.|._.|._.`.|.|._.|.|.}.}.}.|._.|.{.(.(._.(.|.|.|._._.|._._.|.|.|.|.|._.`._._._._. X_._.}.}.|.^._._.|.^.(.(.^.(.(.(.(.(.(.(.(.(.(._.(.(.(.(.(./.(./.).(.(.Y.~.~.~.R.~.~.~.T.T.~.T.~.~.T.~.T.T.T.T.T.T.T.T.~.T.T.T.T.T.U.U.U.L.U.L.U.L.U.R.T.Y.T.T.T./ ~ ! BXZXFXVXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXSXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXFXFXBXQ.} ~ ~ b.nXnXnXnXnXxXcXxXcXcXcXcXcXdXzXzXzXcXzX$XzXzX'.zX.X.X|..X X|.'.|. X|.|.{.|.(.|.(.(.(./././.~.!.~.T.[.[.~.~.~.~.~.~.T.~.~.T.~.T.~.T.~.~.T.Y.T.T.T.T.T.T.[.T.T.T.P.Y.T.T.T.T.T.T.T.~.~.T.~.T.XXU.XXT.~.T.~.~.~.~./././.~.~.~.~.~.(.~.~.~./.~.~.~.~.T.Y.~.~./.T.~.~.T././.T.T.T./.T.~.~.~.~.T.~.~.~.T.~.~.T.~.T.~.~.T.T.T.T.T.K.T.T.T.T.Y.P.P.P.Y.P.U.L.Y.I.I.U.U.U.U.L.U.U.U.T.U.T.U.T.T.T.T.T.~.~.[.T.T.~.~.~.~.~././././.(.(.(.(.(.^.(.|.|.`.|.|. X|..X.X.X.X.X.XzXzXzXzXdXxXxXxXxXxXxXxXnXcXnXcXcXmXmXcXmXmXmXcXcXnXnXcXcXcXxXzXzX.XzXzXzXzXdXdXdXdX.X.X.X.X X|._.|._._._._._.(.(./././././././.",
+"C B C C C C C C u C C C C C C A C Z C Z Z C Z Z Z Z Z Z Z Z Z J Z L L L L L Z Z H H H H H Z F J H U H H J J F J J H J H H J H H J J H J U K J J L H L L H L L L P H H P H H H L L L J Z L J L J H H H G P H H H L H Z H H H D D Z Z Z Z D D D Z Z B D Z Z Z Z Z Z Z A C A C Z Z A C C A Z C Z C C Z C Z F Z T Z.S.A.S.A.A.h.G.z.A.A.A.A.A.S.h.A.h.h.l.g.h.z.g.g.f.f.f.d.k.f.i.i.k.a.a.a.a.a.a.a.a.k.k.a.a.a.a.a.a.a.a.a.a.a.g.a.s.f.a.f.s.a.g.f.f.f.f.a.i.g.a.z.a.a.a.a.d.a.a.a.i.a.a.a.a.a.s.i.u.u.u.u.u.u.u.u.t.t.t.t.t.t.r.r.r.r.t.r.t.r.r.r.t.u.t.r.t.t.u.t.s.r.u.u.u.u.u.i.u.a.a.i.i.f.i.k.f.i.z.g.f.j.g.g.g.g.g.g.g.g.g.a.z.h.g.h.h.h.h.h.g.h.h.A.Z.h.A.A.G.Z.A.S.H.S.H.S.H.H.L.G.H.D.P.L.P.P.T.U.T.P.T.T.Y.T.Y.U.U.T.T.T.T.T.T.T.[.T.T.~./.~./.~.~.(./.(.(.^./.(.~.(.(.T./.(.[.(.^./.^.[.(././.^.(.(.(.(.(.`.(.`._.|.|.|.|.|. X|.}.}.}.}._.(.(.{._.|.(.{._.[._.|._._.`.`._.|._.|. X_.{.|._._._._._. X}.}.|._._.`.(._.`.(.(.(.(./.^././.(.(.(.(.(.(.(.(.(.(.!./.(.~.~./.(.~.~.~.~.~.~.T.~.~.T.~.T.T.~.T.~.T.T.~.T.T.~.~.T.T.T.T.T.T.T.T.T.Y.U.U.Y.Y.U.U.T.T.T.T.T.P ~ / fXCXSXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXDXDXDXDXFXFXFXFXFXFXDXSXDXAXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXGXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFXfXm.' ! S M.mXmXnXnXxXnXcXcXcXcXxXxXcXxXcXzXdXcXdX X.XdX.X'..X.X.X'.|..X.X|._.|._.|._.(.(.^.^.(.(.(././././.~.~.~.~.~.~.^.~.T.[.T.~.~.T.~.T.[.T.~.T.~.T.~.T.T.T.T.P.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.U.E.~.T.~.T.~.!.T.T.(.~.~.~.~.~.~./.~.(.~.(.~.^.^.T.[.^.~.Y.~.T./.~.T.T.T.T.T.T.~.~.T.T.T.T.~.~.~.T.T.T.T.T.~.~.T.T.T.T.T.~.T.I.(.T.T.T.U.^.P.P.Y.U.Y.U.T.T.L.U.L.L.U.L.U.L.U.I.T.T.U.T.T.T.T.T.T.T.T.T.~.[.T.~.T.~.T./.~./././.(.(./.(.|.(.(.^.|._.|.|..X|..X.XdX.XzXdXfXzXzXzXdXdXxXxXxXxXxXcXnXnXnXmXmXmXmXmXnXmXmXmXcXcXcXcXcXxXxXcXxXzXzXzXzXzXzXdXdX.X.X.X|.|.|. X_._.|._.(.(.(./././.(./.(./.~.",
+"C C C C C C C C B B C C C C C C C C Z C C Z C D Z Z L Z H H H Z H L Z H H F H H H H H F H F H D H Z H H H H H H H J H H H H H P J H H K J K U L L P H L J J J J H H H H H H H L L L H L L Z J H H H H H H H H H Z D D D Z H H Z Z Z H D D Z Z Z Z Z C D Z Z Z Z Z Z Z C C Z C A C Z Z Z C Z F C C Z C Z Z Z T G.A.S.H.H.A.S.S.A.G.A.A.A.A.j.Z.A.l.g.l.z.k.k.g.f.f.z.f.k.f.k.i.k.i.a.a.a.a.i.a.a.a.k.k.a.a.a.a.a.a.a.a.a.a.i.i.g.f.f.a.a.j.a.f.i.f.f.a.a.g.a.a.a.s.a.a.a.a.a.i.a.a.i.a.i.i.i.i.u.i.i.u.i.u.u.u.u.u.t.u.t.t.u.t.r.r.t.r.r.r.r.r.r.r.t.t.t.t.r.t.t.t.u.u.u.u.u.u.u.u.i.i.i.a.i.i.a.f.f.f.g.f.g.a.h.k.g.g.g.g.g.g.g.j.a.j.z.h.h.l.l.l.h.h.A.A.A.l.A.A.H.A.S.H.H.H.S.H.H.L.L.L.U.L.U.P.T.U.U.T.U.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.~.[.!./.~.[.(.(./././.(.(.(.(.(.(.(.[.(.[./.(.(.[.^.(.(.(.(.(.`.(.(.(._.`._.|._.`.`.|.|.|._._.|.[._._.|.^.|._.(.{.(.(.`._.{._._.|.|._.`.`.|.|.|.|.|._._. X_.|._.|.|._._.{.{.{.^.(.(.(.(././.(.(././.(.(.(.(.(.(.(.(.(.(././.^./.~.~.~.!.~.~.~.T.~.T.T.~.~.T.T.T.T.~.~.T.T.~.T.~.T.~.T.T.T.T.T.T.T.T.T.T.T.U.T.T.T.T.T.P.T.T.U / S hXfXBXCXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXAXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXAXFXFXFXFXFXFXFXFXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXDXHXfXm./ / ! m.nXvXnXnXnXnXzXcXcXcXxXcXcXdXxXdXdXdXdXdX.XzX'.@X.X.X|..X X.X|.|.|._._._._._.{.(.(.(.(./.(././.(.!.~.~.~.~.~.!.~.~.~.~.(.~.~.T.~.~.~.T.T.T.T.T.T.[.Y.T.P.P.[.T.T.T.T.Y.Y.T.T.T.Y.T.T.T.~.T.~.~.T.T.~.T.T.~.T.~.~.~.~.~.~.~./.~.~.(.~.~.~.~.T.T.T.~.E./.Y.~.T.T.~.T.T.[.T.T.T.T.T.[.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.I.T.R.R.T.T.T.T.U.P.T.Y.P.T.L.U.U.L.K.L.L.U.L.L.R.I.U.T.T.U.U.T.T.T.T.T.~.T.[.T.~.T.T.~.~.~.(././././.(././.(.(./.(.).|.|.|.|.|.|..X.X.X.X.X.X.XdXdXzXdXdXcXxXxXnXxXnXnXmXmXmXmXnXMXnXMXcXcXmXmXcXcXMXcXcXcXxXxXcXcXzXzX.X.XdX.X.X.X.X.X.X|.|.`.`._._.(.(.(././.(././.~./.~.",
+"C C C C C C C C C F C A C C C Z C C Z C C Z Z Z Z Z L Z H Z H H Z Z H Z Z D H H H F H H H H H H H H H H J H H H H H J J J J H H H H J H H L H L P L H Y J Z L Z H H H H H H H H L J L L L L L Z H H F H H H H F D D H H D H H D Z H Z H D D Z Z Z Z D Z D Z C Z C Z Z Z C Z Z C Z A Z C Z C Z H C C Z Z Z H T Z.A.H.A.G.A.A.S.G.A.S.A.A.A.A.h.h.G.g.z.g.k.k.g.g.a.d.f.i.d.i.i.i.a.a.a.a.a.k.g.a.g.d.z.i.a.z.a.a.a.a.a.i.g.i.z.i.s.f.g.g.i.f.a.a.k.f.f.f.a.a.z.a.a.k.a.a.a.i.a.a.i.a.a.i.i.i.s.u.u.i.u.u.u.u.u.u.t.u.t.u.u.t.t.t.r.y.t.r.r.r.r.r.t.r.t.r.t.t.r.t.t.u.t.t.u.u.p.u.i.i.i.i.a.i.g.a.f.f.a.g.f.g.g.g.k.h.g.g.j.a.g.g.k.k.g.z.g.h.l.l.l.h.h.h.h.A.A.A.A.A.H.G.H.h.H.H.H.L.L.L.L.L.L.U.T.U.T.T.T.T.T.T.Y.Y.T.T.T.T.T.T.T.T.T.T.~.~.T.T.~.~./.~.(.~./.(.(./.(./.(.~.(.(.[.(.(.(././.^.^./.(.(.(.(.^.^.(._.(._.|._._.`.`.|._.|._.|.{._.|._.`._.[.|.|._.(.|._._.|.|._._._.|.|.`._.|.|.|.|. X_._. X X_._. X|._.|.`.|.^.(.(./././.(././.(.(./.(./.(.(./.(.(.(.(.(./././.~.(.~.).~.T.~.T.~.T.~.T.~.~.~.(.Y.T.~.T.T.~.T.T.~.T.[.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.^.T.~.T / / pXhXBXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXAXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXZXBXhX} ' ! Q b.nXJXnXnXnXnXcXcXcXcXcXcXcXdXcXcXnXdXxXdXdXdXdX.X.X.X.X|..X|..X|._.|._._._.{.(.(.(.(.(.(./././.(.^.[././.~.!.[.~.~.~.~.~.~.~.(.~.~.~.~.~.~.T.~.T.U.U.T.[.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.~.T.T.T.(.T.T.!.~.~.~.~.!.~.!.~.~.~.(.~.~.~.~.~.T.Y.T.R.R.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.K.~.T.T.^.L.T.Y.P.P.P.P.L.L.L.L.L.U.L.L.L.L.L.U.I.T.U.T.T.U.T.T.T.T.T.~.T.T.~.~.~.T.~.~.~././././././././.(.(.(.^.{._.|.|.|.'..X.X.XxX'.dXdX@XxXdXcXdXxXxXxXcXcXnXnXmXmXmXmXmXMXMXcXMXMXcXmXcXmXmXcXcXcXvXxXcXxXmX.XcXdXdXdXdX@X.X.X.X X{._.|._._.(.(.(.(.(./././././.~.",
+"C C C u N C C C C C C C D C C C C C Z C C Z Z Z Z Z H D D D D G L S H J H H H H H H H Z H H H H H H Z H J P H H H L H L L H H L P D L L L L H P U H P L H J H H L L L H L J L L L L L H P H J H H H H H H H H H D H H H H F H H D H Z Z Z Z D Z Z Z Z Z Z Z Z Z Z Z Z Z C Z C C Z Z C Z D Z Z Z Z C Z Z A D T H.H.A.H.H.S.H.G.H.A.H.H.A.A.A.S.h.A.A.g.k.z.g.g.a.f.f.f.k.f.a.a.f.k.i.a.i.i.f.i.k.i.a.a.f.f.a.a.a.d.a.a.a.s.g.f.f.f.a.j.a.s.f.f.d.f.f.z.a.a.a.z.f.a.a.z.f.i.i.a.a.a.a.a.i.a.i.i.i.u.i.t.i.u.u.u.u.u.t.u.t.t.t.r.r.t.r.r.r.r.r.r.r.t.r.t.r.r.t.t.w.t.u.t.u.t.u.u.p.u.u.u.s.u.a.i.i.i.f.f.k.f.k.k.k.k.z.k.z.g.f.g.j.z.d.g.z.g.h.l.z.h.l.S.h.A.A.A.G.S.A.H.G.A.H.A.H.S.L.S.L.L.L.L.L.U.U.U.T.T.T.T.T.Y.Y.~.T.T.~.T.Y.[.T.T.T.[.~.~.T.~.(.!./.(./.^.(.^.(./.(.^.(./.{.{.(.(.(.(.(.(.(.(.(.(.(.^.(.(.(.(.(.`.`._._.|._.|.{.|.`.`.|._.|.^._.|._._.|._.|._._.^.`.(.`.`.`.}.|._.{.|.|.|._.|._.|.'.`.`.`.`.`.`.`.(.(.(.(.(.(.(./.(./././.(././.(./.(.(.(./.(.(.E.(././.~.~.~.~.~.~.T.~.~.T.~.T.~.~.T.XXT.~.T.~.T.T.I.~.~.T.~.T.T.~.T.T.~.~.T.T.T.T.T.!.T.T.R.R.~.~.T / ~ m.pXhXHXGXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXFXhXQ.[ / / ~ m.MXmXmXcXnXnXJXcXcXcXfXdXnXxXzXxXzXzX.XzX'.'.zX'.@X.X.X X.X|.|.|.`.`.|.(.|._._.^.^.(.(.(.(././././.!./././././.~.~./.~././.~.!.~.~.~.~.~.~.I.!.L.~.~.T.U.Y.~.Y.~.T.T.T.T.T.T.T.T.T.T.T.T.[.T.P.T.[.T.T.T.~.~.T.T.^.T.T.^.T./.~.~.~.~.~.~.T.T.T.T.T.T.T.T.T.T.P.T.T.T.T.T.T.T.T.U.T.T.T.T.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.T.P.U.Y.U.U.Y.L.L.L.Y.L.L.L.R.R.U.U.U.T.Y.T.T.P.T.T.T.T.T.~.T.[.~.T.T./.~.~././.~.~.^./././././.(.^.`.`._.|.|.'. X.X|..X.XzX.XzXzXzXzXcXcXdXnXcXcXnXnXMXmXmXmXmXmXMXmXmXmXmXnXmXnXmXnXnXnXnXJXxXxXxXcXxXdXdXdXdX.X.X'.dX X X|. X|.{.`.^.(.(.(./.(./././.~.~.",
+"C C C C B C C C B B C C C C C F D C C Z D B Z C Z Z Z D D D H Z Z L H Z H Z Z H H Z H L H H H Z H H H H H H H H L L H P L L L L L L L L L L Y H L P H P H H H H H P Z H L Z H L L H L H H H H H H H H H H H H H D K D Z H H Z K D Z H Z D D Z D Z D Z Z Z Z Z Z C Z C Z Z C Z Z C Z Z C B Z C Z Z Z C Z Z D e.G.H.h.S.A.H.A.D.H.S.G.A.H.A.A.l.h.g.h.A.g.h.g.g.z.k.f.f.k.f.k.a.a.a.k.a.k.k.i.k.i.a.g.a.f.i.a.z.a.i.i.g.s.f.f.s.f.f.a.f.f.f.g.s.f.z.a.a.f.a.a.a.a.a.i.i.i.i.f.i.i.a.i.i.a.a.i.i.u.i.u.i.u.i.u.u.u.u.t.t.s.t.t.t.r.r.r.r.r.r.r.y.r.r.r.r.t.r.t.t.t.u.t.t.u.u.u.u.u.u.i.i.u.i.i.i.k.f.d.f.z.k.k.k.k.k.k.k.k.k.f.f.g.g.h.g.g.g.h.h.h.l.h.h.A.A.A.A.A.A.A.A.A.S.A.H.H.H.D.L.L.L.Y.L.U.U.T.U.U.T.T.T.T.T.T.Y.T.T.T.T.~.T.T.T.T.T.T.T.~.~.~./.(./.(.^.(.{.^.(.(.|.(.(.(.(.(.(.(./.(.(./.(.(.(.(.(.(.(.(.|.`.`.^._._._.|.|.|.{._.^.|.`./.|._.^.|.|._._.|._._._.|.|.^.`.|._._.|.|.|.|._._.`.|._.|.`.`._.|.(.(.`.`.(.(.(.(.(./.(.[./.(.(.~.(././././.^.(.(.(.(.~.[.~.[.~.~.~.~.~.~.~.T.~.~.~.T.~.~.).XX~.T.~.T.T.~.~.~.I.~.~.~.~.T.~.~.~.T.~.~.T.T.T.T.T.~.~.~.Y.~.j.S S } m.hXBXDXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXfXaX} ] / / ~ m.MXmXmXmXnXnXdXcXnXcXcXnXxXxXzXzXzXzXzX.X@XxX'.zX|..X'..X.X|.`.`._._.{.|.`.^.^.|.`.(.(.|.{.(.(././././.(././.~./.~././.~././.~.~.~.T.~.~.~.~.~.~.Y.T.T.Y.I.T.I.I.~.T.T.T.T.T.T.T.T.T.T.T.T.T.[.T.P.!.~.[.T.~.~.~.~.T.~.~./.T.~.~.T.~.T.~.~.~.~.T.T.T.T.T.T.T.T.P.T.T.U.T.T.T.Y.Y.T.T.U.P.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.L.L.U.P.U.L.U.U.K.L.L.U.H.K.L.U.U.U.U.U.P.T.T.T.T.T.T.~.T.T.~.~.~.T.~.~./.~.~./.^./.(././.^.(.(.(.`._._.|.|.|..X XfX.X.X.XzXzXzXzXdXcXcXnXdXcXnXnXmXmXmXmXmXmXMXmXmXMXmXnXcXnXnXnXmXnXnXcXcXxXxXxXxXdXdXdXdXdX@X@X.X'.'.|.|._.`.|.(.(.(.(.^.(./././.~./.",
+"Z C C C C C C C C u C C C C C C C C C Z C Z Z C Z F Z Z Z Z H Z Z Z Z H H L H H H H H F H F H H H H H H H H P H P L H P L L H L L L L L L P L P L L L H H L H H H L H H L L H L L L H H H H H H H H F H Z H H H D H D H H F H A H H D Z D Z H Z D Z Z Z Z Z C Z Z C Z C Z C Z C Z C A Z C Z B Z Z Z C Z Z H e.S.A.H.S.H.S.G.S.S.S.S.G.A.A.A.A.A.A.A.D.g.h.h.k.z.k.k.z.s.f.f.a.a.f.a.i.a.i.k.f.i.a.a.a.f.f.a.i.i.d.g.a.a.i.a.g.f.f.f.a.f.s.a.i.f.a.f.a.a.a.a.f.a.a.z.i.z.i.i.a.i.a.a.a.i.a.i.i.i.i.i.i.i.s.u.u.u.t.u.u.t.t.t.r.r.r.y.r.r.r.r.r.r.t.t.t.t.t.t.w.t.u.t.u.u.t.u.t.u.u.i.u.i.i.a.a.a.d.z.k.i.f.k.k.k.k.k.k.h.k.f.z.f.k.g.g.z.z.h.h.l.h.h.g.G.A.A.A.A.G.A.H.A.A.H.H.S.H.H.S.L.U.L.U.Y.T.U.T.T.T.T.T.[.T.~.~.T.T.T.T.T.T.T.T.~.T./.~./.~././.!././.(.{.|.(.(.(.(.(.(.{.(.(.(.(.(.(.(.(.{.(.(.^.(./.(.^._.(.(.`.|.`.`._._.|.(.|.(.`.`.^.^._._.{.(.(.|.{._._.(.|.`.(.`.(._._._.|.|._.|.|._.}. X}._._.}._._._.`.^.(.^.(.(.(.(.[.(.(./.^./.(./././././././.(.^.[.^.^./.[.~./.~.~.T.T.~.T.~.~.~.T.~.U.T.T./.~.T.T.~.I.~.I.~.~.~.~.~.~.~.~.~.~.T.~.R.T.T.~.T.~.T.~.~.j./ / ' } m.fXHXDXFXDXZXFXZXFXFXFXZXZXFXZXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXAXFXFXFXFXHXAXCXhXm.' ! ~ / ^ m.mXmXmXcXnXnXmXmXnXnXxXxXdXcXzXzXzXzX.XzX'.zX'.'..X.X'. X|.|.|.`._.|._._.`.|.|.(.(.(.^.|.^.(.(.(.(.(././.[./././.~.^./.(./.~.~.~.~.~.~.T.T.~.T.~.~.I.T.~.~.Y.~.Y.T.T.T.T.T.L.T.T.T.T.T.T.T.[.P.T.T.T.T.T.~.T.~.~.T.T.~.~.T.~.T.~.~.T.~.~.T.T.T.T.T.T.T.Y.Y.Y.U.T.T.U.T.P.P.P.T.T.U.T.U.T.T.T.P.T.T.T.T.T.T.T.T.T.U.T.U.T.T.U.U.T.T.T.T.P.Y.Y.P.L.L.L.L.L.J.U.U.L.I.L.I.L.L.U.T.U.T.T.T.T.T.T.T.T.T.~.T.T.~.~.~.~.~.~.~.~.R.(.!./.~.(.(.(.`.(._.|.|.'..X.X.X@X'.dX.X.XzXzXzXzXcXcXdXcXnXnXnXmXmXmXmXmXNXnXmXmXmXmXmXnXmXmXnXnXnXnXcXnXxXcXxXxXzX@XdXdXdX X.X.X.X X|.|._.|._.^.`.^.(.(.(././.~.~./.",
+"B C A V C C C C C C C C C Z B C C C B Z C Z C Z Z Z Z D H Z H H L Z L Z H Z H H H Z H J H H H H D H H H H J H H H L L H H P H L J H L L L L P P P H L L L H H H L H H P S Z L H H H H H P H H H H H H J H H H H H H H H H H H H Z H H S D D D Z Z Z Z Z D C Z Z Z Z C C C C C Z C Z Z C Z Z D Z Z Z Z Z Z H e.S.H.H.H.H.H.S.S.H.S.S.G.A.A.H.h.A.A.h.h.h.h.h.z.l.k.k.z.f.f.f.k.s.i.f.f.f.f.i.f.f.z.a.g.a.a.i.g.a.f.a.k.k.a.g.a.g.f.f.a.f.f.f.a.d.a.a.a.f.g.a.a.x.i.z.a.a.k.i.a.z.a.a.a.i.i.i.i.a.s.i.u.i.u.u.u.u.t.s.t.t.t.r.t.r.r.r.r.y.y.r.r.r.r.t.t.t.t.t.s.t.t.t.u.t.u.u.u.u.u.u.i.s.i.a.a.a.d.i.k.k.f.f.f.f.k.k.k.k.f.j.g.g.g.z.k.g.g.h.h.h.h.h.h.h.z.A.A.H.A.G.A.H.A.H.H.G.H.H.U.A.L.L.L.L.Y.U.T.T.T.T.T.T.T.T.T.T.T.~.T.Y.T.[.T.T.T.T./.T.~././.(.(.(.^.).(.^.(.(.(.(.(./.^.(.{.(.(.(.(.(.^.|.(.{.|.|._.|._.`.`.(._.^.`.|.{._._.|.`.|.(.`.|._._._.(._.|.{._.|._._.|.(.{.(.[.|.|._.|.{._.|.}.}.}.}._. X}._._._.{.(.(.(.(.(.^.(.(.(.!.(./.^.!.(./.(././.(.(.(.^././.!.~.~.~.~.!.!.~.~.T.[.T.~.~.~.~.T.T.T.T.T.T.~.T.~.~.~.~.~.~.T.~.~.T.~.~.~.T.~.~.~.T.~.T.~.~.~.~.A./ Q ~ ( m.].MXZXFXZXZXAXVXAXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXAXFXHXBXfX].{ / S ~ ^ ' ].cXmXmXcXnXvXxXxXxXxXxXxXcXzXzXzXzXzXzX.XdX.X.X.X.X.X.X X.X`.|.`.|._.|.|._.|.(.`.{.`.^.(.(.(.[.(.(.(./.^././.[.~./.(./././././.~./.T.~.~.T.T.~.T.~.~.T.Y.~.I.I.Y.T.T.T.T.T.(.T.T.T.T.T.T.T.T.P.T.T.T.T.~.T.~.T.T.~.~.~.T.~.~.T.~.~.T.T.T.T.T.T.T.Y.Y.P.T.P.P.P.Y.U.T.U.U.T.T.P.T.T.U.T.U.T.P.T.Y.T.T.T.T.T.T.T.T.U.T.T.T.U.T.T.U.T.T.P.P.Y.P.U.L.L.L.Y.L.L.L.L.L.U.U.I.U.Y.U.L.U.P.T.T.T.T.T.T.T.T.Y.T.~.T.T.~.~./.~.[./.(./././.[.(.(.(.`.`.|._.|.|.|..X.X.XdXdXcXxXzXzXcXcXcXdXcXcXvXnXmXmXmXmXmXmXnXMXmXmXMXmXmXmXmXnXnXnXnXnXnXnXcXcXxXdXzXzX.XdX.X.X.X.X|..X|.|._.|.|._.(.^.(.(./.(./.~.~.[.",
+"C A C A u G B C A B C A C C C C C D C Z C Z D Z H Z H G Z Z H Z H Z H H H H H H F J H H H H H H H H H H J H H P L H L H H H L H L L L L L L H H L L L L H H H L H L L H L H L L L H H L J H H H H L L H H H H H H H F H H H H H H H Z L Z D Z Z Z Z Z C Z D Z B C Z C C C Z C Z Z A Z Z Z Z Z Z Z Z Z Z Z U j.A.A.H.G.G.S.H.D.A.S.S.S.A.H.A.A.A.S.h.A.h.h.h.h.h.k.g.z.g.k.f.f.f.k.i.i.z.i.k.f.f.g.a.f.z.a.f.i.f.a.k.f.i.a.f.i.z.f.f.s.i.g.a.s.f.a.a.a.a.a.a.a.a.f.f.i.i.a.f.i.f.a.a.i.i.a.i.u.u.a.i.i.u.u.u.u.u.t.t.t.t.t.r.r.r.s.y.r.r.r.w.E t.r.t.t.t.r.u.s.t.u.t.t.s.u.t.u.u.u.i.u.a.i.i.i.k.i.z.i.z.d.z.k.z.f.f.f.f.z.k.g.g.h.f.z.l.h.h.h.h.h.h.h.A.A.A.A.A.H.H.A.G.G.S.S.H.S.S.Y.L.L.L.Y.U.U.Y.T.T.T.~.T.~.~.~.T.T.T.T.~.~.~.T.~.T./.~.~.~.~./.^./.(.(.(.(.(.(._.(.(.(.(.|.[.|.|.(.`.(.`.(.(.(.|._.^.|.`.`._._.`.(.`.`._.(.(.(.(.`.`.|./.`._.(.|.^._.(.^.|.|.|.(.|._.(.|.`._._.^.`.`.^.|.(._._.|.}.|._.(.{._.(._.(.(.(.(.^.(.^.(.(.(.(.(.(.^./.(.^.(.!././././.~.(././.[.^.T.~.~.T.~.[.T.~.~.~.T.T./.T.T.T.~.~.~.T.~.~.~.~.~.~.~.~.T.Y./.~.~.~.~.~.~.T.~.~.~.~.~.~.A._ ^ ! / ' m.hXHXZXDXZXAXAXAXGXFXFXFXZXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXGXFXFXFXFXFXFXZXFXVXAXZXAXZXVXVXfXhX} _ ~ ^ ^ ' M.'.cXnXnXnXnXnXnXxXxXcXcXxXxXxXzXzX.XzXzXzX.X.X.X.X.X`.'..X|.|.`.`.`.`.`.|.{.`._._._.{._.(.(.(.(.(.(.(.(.(././././././././.~./.~./.~.~.T.T.~.~.I.T.I.~.~.Y.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.T.T.~.T.~.~.T.T.T.T.T.T.T.T.T.T.T.P.P.P.P.U.L.P.T.Y.P.T.T.U.T.Y.T.Y.T.T.T.T.P.T.P.T.T.T.U.T.T.T.T.U.U.T.Y.P.T.P.T.P.P.P.U.L.U.Y.L.L.R.L.Y.K.U.L.L.U.Y.U.Y.U.Y.P.T.T.T.T.Y.~.T.~.T.~.T.~.T.T./.(.T././.!./.(./.(.(.(._.{._.|.|.|. X'.'. X.XdXdXdXzXzXdXzXzXcXcXcXcXcXnXmXmXMXmXmXmXmXmXSXnXmXmXmXmXnXcXnXnXnXnXmXnXxXxXxXnXdXxXdXdX.X.X.X.X.X|. X|.|._.}.}._.^.(.(.(.(./././.(.",
+"C N C C B B C C C C C C C C C Z C C C Z D B B Z Z Z Z Z Z H D H D D H H H D H D H H H H H J H L H H H H H H H H L L L L J I H H L L D L L H L L L L H H H P Y H L L L L H H H J H L L H H L H J H H H H J H S H H H H H H H F H Z H H D D D G D F Z Z Z Z B D Z Z C Z Z Z C C Z C Z C Z Z C C Z Z Z F Z Z U b.S.H.H.H.A.G.H.H.H.A.G.A.H.S.A.A.A.z.A.h.A.h.h.h.h.z.g.g.g.f.j.f.f.a.g.a.g.d.f.i.k.f.g.a.i.k.a.a.f.f.a.f.f.f.f.f.f.a.j.j.a.g.a.g.i.a.f.a.f.a.z.a.k.g.i.k.i.z.i.k.i.a.a.a.i.i.i.u.i.u.u.i.u.i.u.u.u.s.t.u.t.r.t.r.r.w.y.r.r.r.r.r.r.t.r.t.t.t.t.t.t.t.s.u.u.u.u.t.a.u.u.u.u.i.f.a.i.i.z.z.i.k.d.i.d.i.f.f.f.f.k.g.g.l.h.f.h.h.h.h.h.h.h.A.h.j.A.G.A.h.H.H.H.H.H.G.H.H.S.L.L.L.L.L.U.P.P.T.P.T.T.T.T.T.T.T.~.T.T.T.T.T.~.T.~.T.~.~.~.~./.^.(.(.(.(.(.(.(.(.(.(.|.(.`._.(._.|.(.`.^.`.(.{.^.(.|.(.^.`.^.|.`.^.(.(.(.`.`.`.|.(.|.^.`.|.(.{.{.|.^.`.|._._._.(._._.{.^.{._._._.`._.|._._._._._._._._.|._._._._.(.^.`.`.{.(.`.(.(.`.^.(.(.(.(.(./././././.~././.(././.E.(./.~.^.~.~.T./.T.T.~.T.~.T.T.~./.~.T.T.~.U.~.~.~.~.~.~.~.(.~.~.~.~.~./.!.~.~.T.~.T.~.~.~.H.[ / ! / / ( m.hXfXZXZXAXVXZXZXFXFXFXVXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXZXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXFXFXFXFXFXFXFXVXDXZXZXVXMXhX{ _ ~ ~ ^ ' m.].zXnXmXzXJXmXcXnXvXcXcXxXcXzXzXxX'.zX.X.X'.@X.X.X.X`..X`..X.X|.|.|.|.|.`.`.|.|.|.|._.|.{.^.(.(.|.(.(.(.(.(.^.^.(.!./.^.~.(./.~.~.~.~.~.~.~.~.T.T.~.T.T.~.U.T.T.I.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.[.T.T.~.T.T.T.~.~.T.T.T.T.T.T.T.T.T.T.T.U.T.T.U.T.Y.P.U.Y.P.P.P.Y.P.T.U.U.P.Y.T.U.T.P.T.P.P.T.T.P.T.U.U.T.U.U.U.T.P.P.Y.I.P.P.P.P.U.P.U.P.L.L.J.K.L.L.L.U.Y.U.L.U.U.L.Y.U.T.P.T.T.T.T.~.T.T.T.T.~.~.~./.~./././././.!./.(.(.(.(.|._._.|.|.|. X X'..XdX.XdXzXzXzXnXcXcXcXcXnXnXnXnXmXmXmXmXMXMXmXMXmXmXmXmXMXmXMXmXnXnXnXnXcXxXcXxXxXnXdXdXdX.XdX.X.X.X|..X|.'.|.|.}.}._._.`.^.^.~././.~.~.",
+"C C C C C C C Z C C B C C C C C C B C C Z C Z A Z Z Z Z H Z D H H Z H H D H H H H H H H H H H H H H H H H I H H P H L L H L H I L J P L H P P L H L L L H H H H H L L H L J H L H L L J L L H L J L L H H H H J H H H F H D H H L H Z H D D D D Z A Z Z Z Z C C C Z A C C Z F C Z Z C Z C Z C Z Z Z D Z Z U g.A.A.H.A.H.L.S.H.Z.G.S.A.A.A.A.A.h.A.h.h.A.h.l.A.h.h.h.g.g.g.j.k.j.g.a.g.a.f.f.k.z.f.i.f.a.a.a.k.a.k.f.f.f.f.i.f.f.f.a.a.a.f.s.a.s.a.f.a.a.x.a.z.a.a.g.k.z.i.k.i.z.a.a.a.i.i.i.u.i.u.i.i.u.u.u.u.u.t.t.t.r.t.r.r.r.r.y.r.y.r.r.r.r.t.r.t.t.t.t.t.u.t.u.u.t.u.u.u.u.u.u.u.a.i.a.a.i.a.a.i.z.i.k.i.d.f.f.f.k.g.f.g.k.z.k.h.h.h.l.h.l.h.h.h.A.A.A.A.G.H.A.H.H.H.H.S.L.H.H.L.L.L.L.L.U.U.U.U.T.T.T.T.~.T.T.T.T.~.T.T.~.T.~.T.~.~.~./.~.^./.[.T.(.XX(.{.^.^.(.(.|./.|.^.|._._._._._.`.`._.(.`.(.`.^.`.(.`._.(.|.`.(.`.^.`.`.^.`.`.`.^.`._.|._._.|.|.|.^._.^.|.(._.(.^.|.^.|.^._.{.(._.(.`._._._._._.`.^._._._._.(.^.`.^.`.^.(.(.^.`.(.(.(.(./.(.(./././.~./.~././.~.(.~././.~.[.~.~.T.~.~.T.T.~.T.~.T.T.~.T.~.T.(.~.(./././.~./.~.~.(.R./.!.^.~.(./.~.~.~.T.~.~.U.S.[ ~ / ~ / [ m.hXBXBXFXAXAXAXFXFXZXFXZXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXGXAXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXDXZXMXhXc.' / ! S c ` hXJXzXmXvXnXnXcXxXnXxXcXxXxXzXzXzXzXzXdX.XdX.X X.X.X.X.X|.'.|.|.|.|.|.|.`.|.|._._.{._._._.`.(.^.(.(.(.(.(.(.(.~.{.(././.~./.~./.~.~.~.~.~.~.T.T.~.T.T.~.~.U.~.T.T.T.U.T.T.T.T.T.T.T.T.[.T.T.T.T.T.T.T.T.T.T.T.T.P.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.U.P.L.U.L.P.P.P.P.P.P.U.U.U.P.P.P.L.U.T.P.U.T.U.U.U.T.T.T.U.T.U.U.P.Y.J.T.Y.L.Y.U.U.P.L.U.U.L.L.U.L.L.L.U.L.U.U.U.L.U.T.U.T.T.T.T.T.T.T.T.~.T.T.T.T.T.~.^.~.(./././.(.(.(.(.(.(._._.|.|..X.X.X.XdX.XdXdX.XzXzXdXcXxXcXdXMXcXnXnXnXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXnXnXfXdX@XxXdXdXdX.X.X.X.X.X.X.X.X.X.X|.|.}._.[.`.^.(.(.[.(.^.~.~.",
+"V A C C C C B C A C C C C C C C C Z D Z C Z Z Z Z Z Z D Z Z H D Z D H D D H H H H H H H H H L H H F H H H H H H H H L L L L J H L H L L H L H L H L L J P L L H J J J J H H P J J L H L L L L L L L H H H H H H H D H H H H F H H H J Z D D D D D D Z D B Z Z C C Z Z D C B A B Z C A Z Z Z Z C C Z Z Z Z T Z.H.K.H.S.H.H.H.S.S.S.S.H.A.S.A.A.Z.A.A.A.h.A.h.h.h.h.h.h.g.z.k.k.j.f.z.a.g.k.d.d.i.d.f.k.a.k.a.z.f.f.f.f.f.k.a.f.z.f.f.g.d.i.z.f.g.a.a.a.a.a.k.a.a.g.k.i.i.a.a.i.k.a.a.a.i.i.u.i.u.u.u.u.u.u.t.u.t.t.t.t.r.r.r.r.r.y.s.r.r.r.r.r.t.r.t.r.r.r.s.u.t.u.t.u.u.u.u.u.u.u.i.i.a.i.a.a.a.a.d.i.i.f.i.k.z.d.k.f.f.k.g.g.g.h.l.h.l.l.l.h.g.h.j.A.h.A.A.A.G.A.S.H.A.H.H.H.H.L.H.L.H.L.U.L.L.U.U.U.U.T.T.T.T.T.T.T.~.T.T.~.T.~.T.T.~.~.~.~./.[.~.{.(.(.(.(.(.(.`._._.(.|.{._.|._.|._._.'.`.(._.^.`.`.`.(.`.^.`.`.|.^.`.`._.`.(.^.`.`.(.^.{.|.|._.{.|._._._._.(._.[.|.^.|.).^.|.^._.`.|.^.|.|._.`.`.^._._.(._._.|._.(._.^.^._._.(.^.`.(.(.`.(.(.(.(.(././././.~././././.(.~.(././.~.[.~.~.~.T.T.T.T.T.~.T.~.T.T.~.~.~.~.~./.T./.~./.~.~.)./.(.^.^.~.T.~.E.~.~./.[.~./.T.U.H.[ / ~ ~ Q ' m.hXfXBXZXZXFXFXFXFXZXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXVXFXFXZXZXBXxXaX} ` / S ^ ! ' '.hXnXnXmXnXnXxXnXnXxXnXcXxXzXcXzXzXzXzXdXdXzX.X.X.X.X.X'..X|..X.X|..X|.`.|.|.|.|.|._.|.|.`.^.`.(.(.(.(.(.(.(.(.(.(./.(.[.(././.~./.~.~.~.~.~.~.~.T.~.T.Y.R.~.L.T.T.T.T.[.T.T.U.[.T.T.T.T.T.T.T.T.T.Y.T.P.T.P.T.T.[.T.T.T.T.T.T.T.T.T.T.U.T.T.T.T.T.U.T.T.U.U.U.L.P.U.L.P.P.P.P.P.P.P.P.U.T.P.P.P.P.P.T.U.U.U.T.T.U.U.U.Y.U.Y.U.P.P.U.K.U.U.U.U.L.U.Y.Y.L.U.L.L.L.U.L.U.L.U.Y.P.P.L.T.Y.P.T.T.T.T.T.T.T.T.~.~.~.[.[.[.~.(.~./././././.(.(._.|._._.|.|..X.X.X.X@XxX@XdXdXcXdXdXxXxXcXcXcXcXnXnXnXnXmXmXmXmXmXmXmXMXmXMXmXmXmXmXnXnXnXnXcXnXcXcXxXxXxXxXdXdXdXdX.X.X'.'.|. X|.|._.}._.|.^.{.(.(.(.~.~.~.~.",
+"B C C B C C V B C C C C C Z C F C Z Z C Z C Z Z Z Z D Z G Z Z L D D D D H H F H H F H J H H H U H H H H L L G H H H G J H H H J P L L L H L L L J H H J J J H P H L L J L J J J L K H H L L H H L L H H L Z J J H P H Z H H H H L L H H D D D Z D A Z Z Z A D Z Z Z B C Z C Z Z H B Z Z C Z Z Z Z F Z D D T A.P.D.S.H.H.H.H.S.H.H.H.A.G.A.A.A.h.A.h.A.A.A.h.h.h.h.h.f.h.h.k.g.h.k.k.g.g.d.d.k.d.k.f.k.k.k.f.d.f.f.i.z.i.k.a.a.a.a.f.a.a.a.f.a.a.a.a.a.a.g.f.a.g.a.g.g.f.f.i.a.a.a.a.d.u.i.a.u.u.u.u.u.u.t.i.t.t.t.t.t.t.r.r.r.r.y.y.s.y.r.r.t.t.t.t.t.t.t.t.t.u.u.u.u.u.u.u.u.i.i.i.i.i.i.i.i.i.i.a.a.a.a.z.i.a.f.z.f.f.g.a.g.f.h.h.h.h.l.l.h.l.l.h.l.l.A.A.h.A.S.S.H.H.H.L.L.H.S.U.L.L.L.L.L.P.P.P.U.T.P.T.T.T.T.T.T.T.T.T.P.T.T.T.~.T.~.~.(.(./.(./.(.(.[.(.(.(.(.(.^._._.`._.[.|._._._._. X_.^._.`.`._._.(.`.`.(.(.|.^.|.(.`.`._.|.^.(.`.(.`._.`.(._.`.`.(._.|.`.^.(._.|._.(.(.|.{.{.(.`.^._.^.|.|.{._.|.(.|._._.{._._._.[._._._.(.|._.`.^.(.^.^.(.(./././././.~./.~.~.^.~.^./././.~.~.T.~.~.(.T.T./.T.T.~.T.~.~.~.!.~.~.T.~./.~./././././././.(.!./././.~./.~.~.(.~.~.T.I.Z.[ P / ! / ' m.hXfXBXHXHXZXZXDXZXFXFXZXFXFXFXFXFXFXFXFXFXDXFXDXAXZXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXZXZXDXFXDXFXFXZXFXAXAXDXAXDXFXFXFXFXFXFXFXFXZXFXFXFXZXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXZXFXFXFXFXDXDXFXFXFXFXAXZXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXFXDXDXAXAXAXDXDXZXFXFXFXFXFXFXFXFXDXDXFXFXZXFXFXFXFXFXFXDXFXFXDXDXFXFXFXFXAXDXAXFXFXFXFXFXDXDXFXZXFXFXAXFXFXFXFXFXAXZXFXFXFXFXAXDXFXFXFXFXFXFXFXFXAXDXDXAXDXAXZXFXFXFXFXZXFXFXFXZXFXFXFXFXFXFXFXFXDXZXZXDXVXDXFXFXFXFXFXFXFXFXFXZXZXAXZXFXFXFXDXZXZXFXGXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXZXAXDXFXZXDXZXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXZXZXFXDXZXDXDXFXFXFXFXZXFXDXDXFXFXFXFXAXFXFXFXZXFXFXZXFXDXFXFXFXFXZXVXZXZXZXZXCXfXhXpX} _ ~ ~ ~ S ' m.dXfXxXMXnXnXxXnXnXnXxXcXcXxXcXcXdXzXzX@XzX.XzXdX.X.X.X.X.X.X X|. X|.|.|..X|.|.|._._.|.|.|.|._.|.`.(.(.(.(.(./.(./.{.(.{.(././.!./././.~.~.~.~.T./.~.T.~.T.T.~.T.T.T.T.~.U.T.T.T.T.Y.T.P.Y.T.U.T.P.P.Y.P.I.T.U.U.U.T.U.Y.T.T.T.U.T.T.I.U.U.T.U.U.T.U.T.T.T.T.U.L.A.U.L.L.P.P.U.L.P.P.P.P.U.P.Y.P.Y.P.Y.Y.T.P.P.P.P.P.P.Y.Y.P.T.U.L.Y.L.Y.L.L.Y.L.L.L.L.U.L.U.L.L.L.L.L.L.U.Y.U.U.U.L.T.T.T.T.T.U.T.T.T.T.T.T.T.~.~.~././.~.(.^.(./.^.(.(.(.|.{.`.`.|.|..X.X.X.X.X.XzXzXzXcXzXcXvXxXxXcXnXnXcXMXcXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXnXcXcXvXxXxXdXdXdXdXdX'..X.X.X|..X'.|.|.|.|._._._.(._.(./././.~./.",
+"C B C C C B C C C C C C C C C C C C C C C Z Z Z H Z Z D Z Z D L D Z H D D H H H H H H H H H H H U L L L L L H J J H H J H J J H L L P H J L H L L L J H H J P H J L H P L J H Z H H J H J L J K L L L J H L L Z H S H H H F H H Z L Z H Z D D D D D Z Z Z B C Z C A Z A D Z Z C Z Z D C Z Z Z Z Z D Z S U T Z.D.S.G.H.H.H.S.H.H.A.H.H.A.A.A.A.A.h.A.A.A.h.h.g.A.A.h.h.h.h.h.h.k.k.k.g.d.k.k.i.k.f.f.k.i.f.f.k.d.d.f.f.f.a.k.i.f.f.a.g.g.z.a.a.a.a.a.a.a.a.f.f.f.g.a.i.g.k.a.i.k.a.a.a.a.i.a.u.a.i.u.u.u.i.t.u.t.u.t.t.t.y.t.r.y.r.r.r.r.t.r.r.r.r.t.t.t.s.t.u.t.u.t.u.u.t.u.u.u.i.i.u.i.i.i.i.i.i.a.a.a.i.i.z.a.a.a.a.f.k.g.g.h.g.h.h.h.h.h.l.h.l.l.l.A.A.A.A.A.Z.H.H.S.L.H.K.L.L.L.L.L.Y.L.K.Y.P.P.U.U.T.P.T.U.T.T.T.T.T.T.U.[.T.~.T.~.T.T.~.~././././.(.(.(.(.(.(.|._._._._._._._._._. X_._._.|._.`.^.^.`.`.`.`.`.|._.(._.|.|.`.(.`.`.(.(.`.|.^.|.(.|.(.`._._.(.^.`.|._.(.^.|.(.`./.`.{.(.|.(._.^.).^.^.{.{.^._._.`._.[._._._._._.|._.`.(.`.(.`.^.(.(.^./.~./.~./.!.~.~.~.[././././.~.~.~.~.T.T.T.T.T.T./.T.~.~.~.~.~.^.~.~.(.~./.~././.(.(././././././././.~.^.~.^.~.~.^.~.U.D._ / / S / ' [ m.hXfXBXZXFXFXZXFXAXFXFXFXFXFXAXFXFXFXFXDXDXFXAXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXAXFXFXZXFXFXAXFXZXDXDXDXFXZXFXAXFXGXAXDXDXFXFXFXDXFXFXFXFXFXFXGXZXFXFXFXFXZXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXDXDXFXZXZXFXFXFXFXFXDXDXZXFXFXFXAXFXFXGXFXZXFXZXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXDXVXFXFXAXAXZXDXDXDXZXDXFXFXFXFXFXFXFXFXDXDXDXFXFXDXDXDXFXAXFXDXFXZXFXDXFXFXFXFXAXZXFXFXFXFXFXFXDXDXZXFXFXFXDXDXFXFXFXFXFXDXFXFXFXFXAXDXFXFXFXFXFXFXFXFXAXZXAXDXDXDXAXZXFXZXFXFXFXFXFXZXFXFXFXFXFXFXFXFXDXDXZXDXFXGXFXVXFXFXFXZXFXFXFXZXFXFXFXDXFXFXFXZXFXDXZXAXFXFXFXFXZXFXFXFXFXFXFXFXZXZXFXDXDXZXFXDXDXAXDXFXZXDXZXDXDXAXFXZXFXFXFXFXFXZXFXFXFXFXAXAXFXFXFXDXDXZXDXZXFXFXFXFXFXFXDXDXFXFXFXDXAXFXFXFXFXFXZXFXGXFXFXDXFXFXFXZXZXDXBXBXhXhXV.} ' S ~ / Q ' m.hXJXmXnXnXnXnXxXnXcXcXcXcXxXcXdXvXzXzXdXdXzX.X'.#XdX.X.X.X.X|..X.X|. X@X|.'..X|.|.|.|.|._.{._.}.}.(.(.(.(.^.(.(.(.(./.(.^.^./././.!./.~./.~.~././.~.T.T.T.~.T.T.T.T.T.T.~.T.T.T.T.T.P.Y.^.T.T.T.P.P.P.P.P.I.Y.P.Y.U.Y.U.Y.T.U.U.T.U.Y.U.T.U.T.U.T.T.U.L.T.U.L.U.Y.U.L.U.L.P.P.L.P.P.P.L.L.P.U.Y.P.P.P.P.P.U.U.P.U.P.P.P.T.Y.Y.U.L.L.U.L.Y.Y.L.L.L.L.L.L.L.L.L.L.U.L.L.J.K.L.L.Y.L.Y.U.I.U.T.U.U.T.T.T.T.T.~.T.~.T.~.~.~./.E.(./.(.(.(.(.(.(.(.`.`.|.|..X.X@X.XcX.XzX.XzXxXzXcXdXzXxXxXcXcXMXcXnXMXmXmXmXmXmXMXmXMXMXmXmXmXmXmXnXmXnXxXnXxXcXxXxXdXcXdX.XdX.XdX'. X.X.X.X X|.|.`.|._.|._.{.[.(.(.[.(././.~.",
+"C V C C C C C C C C C A C C C Z Z C C Z Z Z D Z Z H D Z D D Z G D D D D H D H H H H L H H H H H H H H H Z H J J H H H H L H J H L D L L D L L L H H L F J L P H J L J H L F H J J Z D K J J F H L J L L L H L H L H H H H H Z H H D H D D D D Z D D D Z Z Z Z Z C Z Z C C Z A Z B D N C Z Z Z Z Z D Z D Z [ S.P.L.S.H.S.H.H.H.H.H.G.S.A.A.Z.A.A.h.A.A.h.A.A.h.z.h.h.h.h.h.h.l.f.g.g.d.g.f.f.f.f.f.f.k.f.f.f.f.f.j.k.d.i.a.a.k.a.a.a.a.a.a.a.k.a.a.a.a.a.f.a.a.f.i.k.k.k.i.k.i.i.a.i.u.a.i.i.u.u.u.u.u.u.t.u.t.u.t.t.t.t.y.t.r.y.r.r.r.r.r.t.r.t.t.t.t.t.t.u.u.t.t.u.u.u.u.u.u.u.u.i.i.i.s.a.i.i.a.i.a.a.a.f.i.i.f.a.f.f.f.g.g.g.h.h.h.h.h.h.h.h.l.h.l.A.A.A.A.A.H.H.H.H.A.L.H.H.L.U.L.L.L.L.Y.L.P.L.P.U.U.U.U.T.T.T.T.T.T.T.T.T.T.T.~.T.~.~.~.~.(._./.(.(.^.(.(.(.(.(.|.|.^.^.|._._._. X_._. X_.{.}.}.}._.|.^.(.(.|.`.^.`.(._._.(.|.(.^.(.|.(.(.(.`.|.(.`.|.|._.`.(._.(.|.).{.(.(.(.{.(.`.`.^.|.(.{.|.|.`.(.`.^._._.(._._._._._.|.^.{._.`.`.(.`.(.(.(.(.(.~.~./.(.~.~.~.~.(././.~.T./.~.~.~.T./.T.~.~.T.T.~.T.~.~.~./.~.!.~./.~./././.(././.(.(./.^.(./././././.(.T././.~.~.^.~.T.Z.T _ / ! / ' { ].hXBXHXDXDXHXAXAXAXAXAXVXAXZXAXAXAXDXZXDXFXFXDXDXZXGXZXAXVXFXFXFXFXFXFXFXAXAXFXFXFXZXDXDXDXDXZXDXZXAXDXDXHXFXDXDXDXDXZXFXZXZXVXZXZXAXZXZXZXZXDXDXZXAXHXDXZXZXZXFXAXZXDXDXFXFXVXVXFXVXFXZXVXFXFXFXVXVXDXDXZXDXDXDXDXDXDXDXDXHXZXFXDXDXFXVXDXFXFXVXVXAXFXVXZXFXFXVXAXZXFXDXZXZXFXFXZXZXZXFXZXFXFXDXDXDXDXDXZXDXFXDXDXDXHXDXDXDXDXDXDXDXDXAXCXZXFXZXFXFXZXZXFXGXDXDXDXDXZXHXDXVXFXZXDXHXZXDXZXDXDXDXFXZXFXZXDXZXHXDXDXDXDXDXDXDXZXZXDXDXZXVXAXFXDXZXFXHXAXDXZXDXZXAXZXAXFXZXFXFXDXDXDXDXAXAXAXFXZXDXDXZXDXDXZXZXAXAXFXFXDXDXZXZXGXDXDXDXFXZXZXZXFXFXZXFXZXZXDXHXDXDXFXFXDXFXDXHXFXFXAXAXHXZXAXVXZXHXFXDXFXVXFXVXFXHXFXDXHXFXZXDXDXHXAXAXAXAXDXHXAXFXFXAXAXFXFXAXAXVXZXDXAXZXFXZXFXFXFXZXFXFXDXDXFXVXVXVXHXVXZXDXZXDXDXHXHXVXAXAXFXVXVXFXVXFXHXDXFXVXFXVXFXFXBXfXhXQ.[ } ~ Q ^ ( ' c.].xXcXmXxXcXnXnXcXnXnXxXcXcXxXxXxXzXzXzXdXdXzX.X.X.X.X.X.X.X|..X.X X X.X|.|.|..X.X|.|.|._.|.}._.[.{.`.(.(.^.(.(.(./.^.(./.(.(./.^.~./.~./.~.~./.~.T.~.T./.T.~.T.~.T.~.T.T.T.P.U.T.T.T.T.T.T.T.T.P.P.P.P.P.P.L.U.U.U.U.U.P.U.U.U.U.U.U.U.U.Y.P.P.P.P.U.U.L.Y.U.L.L.L.P.U.L.U.P.L.P.L.L.P.L.U.P.P.P.P.L.L.D.L.U.U.U.L.P.Y.P.T.P.P.U.L.U.L.U.U.U.U.L.K.L.L.K.L.K.U.I.L.L.Y.L.Y.L.U.L.U.L.Y.Y.T.U.Y.T.U.T.T.T.T.T.T.~.~.~.~.~./.^.^.~.^.(.{.(.(.(.`._.|.|..X.X.XdX.X`..X.XxXzXzXxXxXcXcXxXcXnXnXnXnXmXmXmXMXMXmXMXnXnXMXmXmXmXmXmXmXnXmXnXnXnXnXcXxXxXnXzXzXzXdXzX'.@XdX.X.X X|.|.|.`.`.|._._._._.(.(.(./.(././.",
+"C F A C Z C C C u C C C C C C C C C C Z C Z B Z Z Z Z D D Z H Z D D D H H H H D H H G L H H H H L L H H H H H H H J H H L J H L L L L L P J P D K J L J H H K U P J Z P L J J J J J L H H J L L L H H L H H J H H H H H H H H H H H D H D D Z Z D A Z Z C Z C Z Z Z C Z Z B D C Z Z G Z Z Z Z Z Z D Z S J e.A.D.H.L.S.S.H.H.S.H.H.A.S.S.A.G.A.A.A.H.A.A.A.h.S.A.h.h.h.h.h.h.l.l.k.g.k.g.f.k.k.f.k.f.f.f.k.f.f.f.d.k.i.k.z.a.a.a.a.a.a.a.a.a.a.f.a.a.g.a.a.f.a.f.f.f.k.a.f.i.i.f.i.a.a.a.i.i.a.u.u.u.t.u.u.u.t.t.t.t.y.t.t.t.t.r.r.r.r.r.r.t.t.t.t.t.t.t.t.t.u.t.t.u.u.u.t.u.u.i.i.u.u.i.i.s.t.z.a.a.a.a.a.a.f.k.f.a.a.f.f.g.g.g.l.h.h.h.z.z.h.h.A.A.l.l.A.A.G.G.H.H.H.H.S.L.H.L.S.L.L.L.U.L.U.U.P.P.U.Y.P.T.U.U.T.T.T.T.T.T.T.U.T.T.T.^.~.~.~.~././.(././.(.(.{.(.`.^.^.|._.}.}._._._._._. X_._.}.}.}.|._.|._.|._._.`.`.(.|.(._.(.^.`.(.^.|.|.|.{.|.^.|.^.|.(.{.`._.|._.|.^.|.(.(.`./.(.(.{.).{.{.(.^.(.{.^.`.{.(._._._._._._._.`._.|.(.|.(.`.`.`.(.{.(.(.~.^.~.~./.~.~.~.!.~.~./././.~.~.~.~.T.T.~.T.T.~.T.~.~.~.!.~.~.~.^./.~./././.~.(.(.(.(./.(.).(.(.(./././.(././.^.(./.^.(.^.Z.[ ) / P ~ S ~ ^ / ! ~ Q ^ ^ ^ ~ ! ! ! ! S ~ ~ ~ ~ ~ ~ ~ / ! ! ! S ^ ~ ~ ^ ~ ~ ! S ~ ~ ! ~ ~ ! ! ~ ! ! ! S S ! ! ! ~ ^ / ~ ! S ! S ~ ~ S ! S ~ ~ ~ ~ ! S ^ ! S ~ ! ~ ! ! ! / ! ! S ~ S ~ ~ Q ! ~ ~ ~ ~ ~ S ~ ! ! ~ ! ! ~ S Q S ~ ~ ! ~ Q Q ~ ~ S Q S ~ ~ ! ~ ~ S ~ ~ ~ ~ ~ ~ ! ! ~ S ! ! ~ ! ! ! ! ! ~ ~ ~ ~ ~ ~ ~ ! ! S ~ S ! S ~ ~ ~ ~ / ~ ~ ! ~ ~ S ! S ~ S ~ S S ! ! S S ! ! S ~ ~ ~ ~ ~ ~ ~ ! S ! ! S S ! ~ S ~ ~ ! ~ S ! ! S S ! ! ~ ! ~ ~ S S ~ ~ ~ ~ ~ S ! ~ ~ ~ S ~ ~ ~ ~ ~ S ~ ! ! S ! ~ ~ ~ ~ ~ ~ ~ ~ S ~ ! ! ! ~ ~ S / S S / S S S Q S ~ ! ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ S ~ ~ ~ S ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Q ! ~ ~ ~ S ~ ~ S ! ~ ~ ! ! S ! S Q ~ S S / ! S ~ ~ ~ ! ~ ! ~ ^ S ! ! S ^ ^ ! ~ S ! ~ ~ ~ ~ ~ ~ S ! ~ S ! ~ ~ ! ~ ~ ~ ! ~ / S ~ S ~ ~ ! ~ ! ! ~ ! S ~ ~ S ( Q ~ ' v.m.hXdXnXmXmXmXJXxXfXxXnXnXnXcXnXvXxXzXzXzXzXdXxX.XxX.XxXdX.XdX.X.X.X|..X.X|.|.|..X|..X.X|.|.|.|.}.}.}.(.(.(.(.`.(.(.(.[.^./.(./.(./././././.~./.(.~.~./.~.~.~.~.T.~.~.T.T.~.T.~.[.[.T.T.T.Y.P.Y.P.P.P.P.P.P.P.L.L.L.L.P.Y.L.P.U.L.U.U.U.U.U.U.I.P.P.L.L.U.L.U.L.U.U.P.P.P.P.U.L.L.L.L.P.P.U.U.U.P.P.P.P.L.U.L.L.P.L.L.U.T.P.P.P.U.Y.L.U.L.Y.Y.L.L.U.L.L.Y.L.L.L.L.L.U.L.R.L.L.R.Y.Y.L.U.U.T.U.L.P.U.T.U.P.T.T.T.T.~.T.~.T.!.~./.~.{.(.(.`.(.{.(.|.^.|.`.|..X.X.X.X.XxX'.zXzXzXxXzXxXcXcXxXnXxXnXmXnXnXMXMXMXmXmXnXMXMXmXNXMXmXmXmXmXnXnXnXnXxXnXcXnXdXdXzXzX@XdX.XzX.X.X.X.X'.|.|.|.|.|.|._._.|._.^.(.(.(./././.",
+"C C C C Z B C C F N F B C Z C C D C D C C Z Z Z Z Z D D D Z D Z D D H D D H H F F H H H H H F H L H H F P H H G H H H H L H H H L L L L L L L L L L L J K L L H L L H P L J J L J J J J J H H L L H L H L H H U L H H H H H F H L H D H D D D D Z F D B Z B D Z C Z C C D B C Z C B D D Z Z Z Z D Z F Z L b.A.L.H.L.H.H.H.H.H.G.H.H.S.A.G.A.A.A.A.A.G.l.A.A.G.g.A.l.h.g.h.h.l.k.l.k.k.g.k.k.g.z.f.k.f.k.k.f.f.i.i.i.f.f.i.i.a.z.a.a.a.a.a.a.a.i.a.a.a.a.f.f.f.a.f.i.f.i.d.a.d.i.a.a.i.a.u.u.a.u.i.u.u.u.t.u.t.u.t.t.t.t.t.t.r.t.r.r.r.t.t.t.t.t.t.t.t.t.u.t.t.s.t.u.u.u.u.u.u.u.i.u.i.u.i.s.i.i.a.i.a.i.a.a.a.a.a.a.a.f.f.g.g.g.h.h.h.l.l.l.h.h.l.l.A.h.A.A.A.H.H.S.U.H.U.L.L.L.L.L.L.P.U.L.Y.L.U.U.Y.P.P.P.T.U.U.T.U.U.T.U.T.U.T.T.T.[.T.~.~.~././.(././.(.(.(.(.`.|.(._.}.}._._._._._._._._. X|._. X|.|._._._._.(.`._.`.(.(._.(.(.(.`.^.`.|.^.(.(.{.(.`.|._.|.|.^.{._._.^.(.{.(.|.(.`.(./.(.`.(.^.(.(.(.(.(.(._._.(.(.{._._._.(.`.|.`.(.|.(.(.^.(.(.(././.^.~.~.~.!.~.~.~.!./././.~.~.~.T.~.~.T.~.T.~.~.~./.~./.~./.~.~.~.~.^./././.(./.{.(.(.(.(.(.(.(.(./.(././././././.(.(././.~.F.F._ / / / / S S ! ! ~ ! S S ! ! ! ! ! c ~ ~ ~ ~ ~ S / S ! ! ~ ^ ^ ~ S ^ S ! ! ! ^ S ~ ~ ^ ^ ^ ~ ! ! ! S ^ ~ ~ ! ~ ~ ~ S ! ! ~ ~ S S ! ! ~ ~ ~ ^ ~ ~ Q ^ ~ ~ ~ ! ! S S ! ~ ~ ~ ^ ! Q ! Q S ^ ^ S ! ~ ^ K ^ ~ ^ S Q ! ! ! S ^ ~ ~ ! ! ! S ~ ~ ( ( ! ! ~ ~ S ~ ~ ~ ! S S S ! S ! S ~ ! ~ ! ! S / ! ! ! ! / ~ ~ / ! ! ! ! ! ! ! ~ ^ ~ ~ Q Q ~ ! / ! ! / ! ! ! ! ! Q / ! ! ! ~ ~ ^ ! Q Q / ! ! ! ! Q ! ! ! ! Q ! / ! ! / ! ! ! ! / ! ! ! / ! ! ! ~ / ! Q / Q ! ! ! ! ! ! Q ! Q Q Q Q Q ! ! ! ! S / ! Q / ! ~ ! Q Q / ~ ~ / ! ! Q Q Q / ~ ~ ! Q Q ~ ~ Q Q Q / Q Q Q Q ! Q Q / ! ! / Q ! / ! ! ! Q Q / ~ ! ! ! ~ Q Q Q ! ! ~ ! ~ ! / / ! ! ! Q ~ ! / Q S Q Q / ! ! ! S / ! / Q ! ! ! ! ~ ~ ! ! / ! / / ! ! ! ! ~ ! ! ! ~ ~ ~ / ~ / ! / ~ / Q / / ~ / Q / Q Q Q Q ! ! / ! ! ! ! ^ ^ ^ ~ ~ ' { m.hXhXcXMXcXMXMXvXnXnXxXvXnXxXxXxXxXxXdXxXzXzXzXzXzXzX'..XdXdX.X.X.X.X.X X.X X|..X X.X X.X|.|.|._.|.}.}.}.^.|.^.(.(.(.^.(.).^.^.(././././.~./.~././.~.~.~./.~.~.~.~.~.~.~.~.T.~.T.P.[.T.T.U.P.P.P.P.P.P.L.P.P.L.L.I.L.L.L.L.U.U.L.U.U.I.L.U.U.U.T.L.U.L.U.L.L.U.L.L.L.P.L.L.L.L.L.L.L.L.L.P.L.U.L.P.P.L.P.L.L.L.L.L.L.L.L.P.P.L.P.L.L.Y.Y.L.L.U.U.R.L.L.L.K.L.L.U.H.L.U.I.L.L.L.U.U.U.P.T.P.P.L.T.L.P.T.U.Y.Y.T.~.T./.T./.~.^.~././.!./.(.^.(.(.`.`.`._.|.'.|..X.X.XzXzXdXzXzXxXzXxXxXxXcXmXxXnXnXnXmXNXmXmXMXmXmXmXmXmXmXmXmXmXnXMXnXnXnXnXxXnXcXcXxX@XdXzXzXzXzXdXzX'.@X.X.X|.|.`.|._._._._._._.(.(.(.(.(./././.",
+"C A C Z F C C D C B C C C C B C C C Z C Z Z Z Z Z D C Z Z Z Z D D D Z D H H H Z G K H H H H J H H U H J G H H J H H L H L H D L H L H J L L H L H H J J U J L U P L P H L L J J L J J H J J J H L L L L H P H L H L L H H H H H Z D H Z Z D D Z Z Z Z Z F Z Z Z Z C C Z C Z Z Z Z D Z Z D B Z Z D D D Z Z e.U.U.H.L.H.H.H.H.H.H.S.h.J.H.A.G.A.G.A.G.g.G.A.j.A.A.l.h.h.z.h.k.z.l.g.g.g.k.k.k.k.k.k.k.k.f.f.f.f.k.z.i.k.f.a.a.a.a.a.a.a.a.a.a.a.a.a.a.f.i.f.a.f.f.f.f.i.k.i.a.a.a.a.i.a.i.a.a.a.u.u.u.u.u.u.t.t.t.y.t.t.y.r.y.t.r.y.s.r.y.t.t.t.t.t.t.t.t.t.u.u.t.u.u.u.t.u.u.u.u.t.i.u.i.u.s.i.i.i.a.a.a.a.i.a.a.a.f.f.k.a.g.g.z.h.k.h.h.h.z.l.l.A.l.h.A.A.G.A.H.H.H.H.H.S.L.L.Z.L.D.U.L.Y.L.U.U.U.P.L.P.T.P.T.L.T.U.U.T.U.T.U.T.U.T.T.T.~.T.~.~././.!.(./.(.(.(.(.^._.|.}._._.}._. X_._. X_._._._._.|._. X_.|._.|.`._._.`.(.|.^.(.(.(.(.(.^.(.|.`.(.(.`.(._.{.(.`.|._._.|.^._.(.^./.(.(.{.|.(.(.|.(.`.(.`.^.(.`.(.(._._.|._._._._.`.^.`._.(.`.(.^.|.{.(.^.(.~.^.~.~.~.~.~.~.~.~././.~./.~.~.~.~.~.~.~.T.~./.~./././././././.(.~././.(./.(.(.^.(.`.(.^.`.(.(.(./.(.(.(./.(././.(.(.^.(.~.Y.Z.Z.e.T L J K S S Q ^ K F ~ / ! ! ! ) ! ! ^ S ~ ~ u Y ~ ~ ^ ~ ^ ~ S S Q ! ! ~ G G ~ ^ ^ ~ ~ K ! ! ! ! ^ K ^ ~ ~ ~ ~ K ! ! ! ! Z c ! ! ! ! ^ J ^ ~ ^ A ! ! ^ S Q Q Q ! Q Q ~ ~ ~ Q ! ! L F ~ ~ ! ~ ~ L ^ ~ ~ K Q ~ ! ~ S Y ^ / ! ! ! S ! ~ ^ u ! ! Q ! ^ S ~ ~ S ! / c ! ! ! S ! ! Q Q Z c / ! ! ! ~ S ~ ~ / S ! ! ( / ! ! S ~ ~ ~ ( ( ~ S ! ! / c ! ! ! ! ! / ~ ! ! ~ ~ / ~ ! ! Q ! ! ! Q Q ! ! ! ! Q ! ! / S Q Q / / ! ! S S ! ! S S Q Q ! / ! ! ! ! ! / ! ! ! ^ ! ~ Q ^ ~ u ! ~ S Q ! S S ! Q S ! P ^ S ! Q ~ S ! ! ! ! ! ^ / ! ! ! ^ Q Q Q Q S Q u S Q ! Q ^ S ! S ^ S ! Q ! S ! S ! ~ Q u ! ! ~ ! ! ! ~ ~ ! S ~ K ! ~ Q ^ c ) ! Q ^ ^ ^ Q Q ' Q Q ! ! ! n ! S ! Q S K ! ! ! ~ ~ J ! ! ! ~ ! S ! ! ~ ~ S ! S ^ Q ~ ~ S ~ ! S ~ ! ! u S ~ Q ! ! ^ ^ ! ! ! ! ! ! c Q S n ' ' v.m.].hXcXJXMXMXMXcXnXnXnXnXcXcXnXxXxXxXxXcXcXdXzXzX@XzX.XzX.X.XdX%X.XdX.X.X.X.X|..X.X.X.X|..X|..X|.|.|.}.}.}.}._.^.`.(.(.{././.^.(.(./.(./.(./.(././.~./.~.~./.~./.~././.T.T.~.T.~.T.T.Y.P.T.T.Y.P.P.P.U.Y.P.P.P.L.L.L.L.L.U.L.L.L.L.U.L.L.L.K.L.U.U.I.L.U.L.U.L.L.L.L.L.L.L.L.L.H.L.H.L.L.L.L.P.P.U.L.P.P.L.L.L.L.L.L.H.L.L.L.P.P.L.U.L.U.U.L.L.Y.L.L.L.Y.L.L.J.U.L.L.K.U.L.L.L.L.U.U.U.Y.P.P.T.T.U.U.U.Y.Y.Y.U.T.T.T.^.T./.T.T.^.^././.[.^.(.(.(.(.`.(.`.|._..X.X.X.XzX.X.XzXzXzXzXzXxXxXxXxXnXnXnXnXmXmXmXmXMXMXMXMXMXmXmXmXmXmXJXnXnXnXnXnXxXxXxXnXvXdXdXxXcXzX.X.X.XdX XdX.X.X|.'.|._.|._._._._.(.`.`.(.(.{.^././.",
+"C C Z C C C C C G C D C C C Z Z C Z C C D C C Z C Z Z Z Z Z D Z D D D D D H K D H H H D H H H H Z Z L P L H G H H H L L D L L L H J L H L P J L H H F J H J P K K Y H P L H J H L J H J H H H P L L H H L L L H H H J H H H H D H Z D Z D Z D Z Z Z Z Z Z D B D Z Z Z Z Z Z Z D C D Z Z Z G Z Z D C G Z Z j.L.H.G.L.G.H.H.D.H.H.H.H.H.A.S.Z.H.A.G.A.A.Z.A.A.A.h.A.h.h.h.h.h.g.z.z.g.h.k.g.l.l.k.k.k.k.f.k.g.d.d.k.f.i.i.a.a.a.a.a.a.a.a.a.a.a.a.f.a.i.g.a.f.a.f.i.k.k.i.a.a.a.i.i.a.i.i.u.a.x.u.a.u.u.u.u.t.t.t.r.y.r.t.t.y.t.r.t.r.s.s.t.s.r.r.s.t.t.t.s.u.t.t.u.t.u.u.u.u.u.u.i.u.i.i.i.i.i.i.i.a.a.a.a.a.a.k.a.a.z.a.g.z.g.z.h.h.h.h.l.l.l.l.h.h.G.A.A.A.H.S.H.H.S.L.L.S.D.U.L.P.P.L.K.J.L.Y.L.Y.U.L.P.P.L.P.T.U.U.U.T.T.T.U.T.T.T.T.T.T.[.~.T.~./.~.(.(.(.(.(.|.^.)._._._._._._.}.}.}.}. X_.`.`.|.|._.|.'._._._._._.(.(.`.^.(.(.(.(.(.(.(.(.(.(.(.(.|.{.`._._._.|.`.|.|.(.(.(.|.(.(.`.(.{.^.(.(.`.(.{.(.(.(.^.`.^.`.`.(._.|.^.(.`.|.|.|._.`.(.(.|././././.E./.~.~.!.~.~.~.~./.~./.T.[.T.~.~.T.~.~.~.~.~./.~./.(././././././.(.{./.{.(.(.(.(.`._.^.^.(.(.(.(.(.(.(.^.(.(.(.`.(.`.^.^.!.!.U.H.Z.e.e.Y F V A u q u q q q u q q u q q q u e u e y u q q u q w u q q q u q w q q u q q t q u u u q q u u u q u % u u u u u u u u u u u q u u u u u u u u u u i S u u K q i q u q u q w q q q q q q u q q u u u e u 0 u u q u u u u u u q u u u u u 0 u u u u u q u u u u u u u u u u i u u u i u u u i i u i u i u u u u u i u u K u u i u i u i u i i K K i u i i K K i u c i K i K i c u i K i u i K i u i i i c i K i u i c u c K i u J c c i c i c ' c i c S c i ^ ' c ' c ' c c ' c c ) ^ c ' ^ c ' ' c ' n c I c ) ' c c ' ' c ' c c ' c ' ' ^ c ' ' c c ' ^ K c ) ' c c ' ' c ' ' ) c ' c ' c c ' ' c ' c c ' ' c ' c c ' c ' ' c ' c c ' ' c ' ' c ' ' c ' c ] c ' c c c c.c c ' c ' ' ' c ' ' c ' c c ' ' c ' c c ' c ' ' c c ] c ' ' ' c ' c ' ' c c ' ' [ M.m.'.hXhXmXMXMXMXMXMXmXmXnXxXMXnXcXJXxXxXzXdXcXzXcXzXzXdXdXzX.X.XzX XdX.X.X.X.X X.X.X.X.X.X.X.X|..X'..X|.|.|.}.}.}.(.^.(.(.{././.(.(./.).^./.(././.~./.~./././.T./.~./.[.~.T././.T.~.T.T.~.[.T.T.T.U.P.P.P.Z.P.L.P.A.L.L.L.L.L.H.L.L.L.L.U.L.L.L.Y.L.L.L.U.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.H.L.L.L.L.L.A.P.L.L.L.L.L.A.L.D.P.L.L.H.L.D.L.L.L.Y.L.U.L.L.Y.U.U.Y.K.L.L.L.L.U.L.L.L.L.U.Y.K.U.U.Y.Y.U.T.U.L.U.L.U.P.T.U.T.T.T.T.~.T.~.T.E.!././.(./.(.(.(.^._._.|._.|.|.|..X.XzX.X.XzXzXzXzXzXxXzXxXxXxXxXnXnXnXmXmXmXmXMXMXMXMXmXmXmXnXmXnXMXnXnXnXnXxXnXxXxXxXxXxXcXcXzXzXzX.XzX.X'.'..X.X.X|.|._._._.^._.`.`.`.^.(.(.(.(././.",
+"C F C C C Z Z C C C C C Z C C C C C C Z B Z Z D C Z C H Z Z Z G Z D D Z H H H H G H H H U H D Z J L L G J J H J H J L D H L L H H L H D L H L L K L L J H J H P H Z P K H U K L L L L J H H H D J L H P L H H P H H L H H H H H Z H H Z Z F Z D Z D Z Z Z B Z D Z Z Z B Z Z Z C G D C Z Z Z Z C D D D Z D b.G.A.H.S.G.H.H.L.H.L.H.Z.S.A.H.H.G.G.S.G.G.A.G.A.A.A.A.l.A.l.h.g.z.g.l.g.h.k.h.k.k.k.k.k.f.k.k.f.g.j.g.i.i.k.a.a.a.a.a.i.a.a.a.a.a.a.a.a.k.a.k.f.f.f.f.f.k.k.a.d.a.d.a.a.i.i.a.a.u.i.u.a.u.u.t.u.t.t.t.t.t.t.t.t.t.t.t.r.y.w.t.t.r.s.r.t.t.s.t.t.u.u.t.u.u.u.u.u.u.u.u.u.t.i.u.i.a.i.i.i.a.a.a.a.a.a.k.k.a.g.a.g.g.g.j.h.f.h.l.l.l.l.l.l.l.A.h.J.H.G.H.H.H.L.L.H.L.L.P.L.L.L.U.L.L.L.U.L.T.U.T.P.P.P.U.U.T.T.U.U.U.T.T.T.T.T.T.~.T.~./.(./.(.~.^.(.(.(.{.(.|._._._._._. X}.}.}.}. X}.`.`.`.|.|.|.|._._._._._.`.|.(.`.`.^.^.(.(.(.(.(.(.(.`.^.^.|.|._.|.^.{._._.).^.|.(.(.|.`.^.(.|./.|.(.(.^.`.(.`.(._._._.^.|._._._.|.|._.(.`.(.^.|.`.(.{./.(.[./././.~.~.~.~./.!.~.~./.~./.~.[.T.~.~.~.~.~./.~././.(./.^./././.(.(././.(.(.(.(.(.(.(.`.`.^.(.(.(.(.(.(.(.(.(.(.(.(.^.^.`.(.^.[.~.T.].L.Z.e.e.T G G G G G G G D G G G G G G G G G G G G G G G G R C G G G B G G G G G G G G G G U D Y G G U G Y T G G U U H G Y F L L U F Y U H Y Y Y Y G Y U Y Y Y U ` ` Y Y G G G G B T G G G V G G G G G C G G G G G C G Y L U U G G G Y G Y U Z Y G D Y L G Y Y U L Y L Y Y Y Y U [ Y Y ` ` ` Y Y ` Y [ ` Y [ Y ` Y c.) Y Y ` Y Y ` Y Y e.Y [ Y [ _ ` T ` [ _ ` ` U [ ` U [ [ [ _ T [ ` b.[ c.` c.` [ c.` c.[ [ ` [ c.[ c.[ b.[ ` [ c.[ c.[ c.[ [ [ b.c.c.[ m.c.c.[ M.c.c.c.c.c.M.[ c.[ M.c.M.c.c.M.c.c.c.M.c.` M.c.c.M.c.c.M.c.[ M.c.M.c.c.m.c.c.M.c.c.c.m.c.c.M.M.c.M.c.m.c.M.c.M.M.c.M.m.M.M.c.m.M.M.m.M.M.m.M.M.m.M.m.M.m.M.M.m.M.M.M.m.m.M.m.M.M.c.M.m.M.M.M.m.M.m.M.M.M.M.M.M.M.M.m.M.m.m.m.m.M.M.M.m.` m.c.M.c.M.c.M.c.M.M.[ m.M.c.M.c.M.c.M.c.M.c.M.b.m.m.].hXhXJXJXJXMXMXMXMXMXMXmXcXnXxXxXxXJXxXxXxXcXcXzXdXcXzXzXdXdXxX.XzX.X.X X.X.X.X.X X.X.X|..X.X.X.X.X'..X|. X.X X|.}.}.|.^.(.(.(./.(.(./.^.^.{.(./.(./.^./././.^.~./.~.~.~.[./././.~./.T.^.~.~.Y.Y.T.U.P.P.P.P.Y.P.L.D.P.L.D.L.H.H.L.H.L.L.L.L.L.L.L.L.U.U.L.L.L.L.L.L.U.D.H.L.H.H.H.D.L.H.H.L.D.U.S.P.L.L.P.L.L.L.L.L.L.L.L.A.H.H.L.S.U.L.L.U.L.L.L.P.J.K.L.L.P.J.K.L.L.L.U.L.U.L.L.L.L.U.U.U.Y.~.Y.T.T.U.L.U.L.P.Y.U.Y.T.T.T.~.~.~././.[././.(.(.(.(.(.`.^.|.(.`.|.|..X.X'.zX.XzX.XzXzXzXxXxXxXxXxXxXnXnXnXMXmXmXMXMXMXMXmXMXMXmXmXMXmXMXnXnXnXnXnXnXxXxXvXvXxXxXxXdXzXzXzX'..XdX.XdX.X|..X|.|.|.|._.`.`.(.^.`.(.(.(.(.(.^.(.",
+"C Z C C Z D C Z C C C C Z C Z B D Z B Z C Z Z B D Z Z Z Z C D D Z Z D D H D H Z H H H H H H H H H H H F H H H H H H H H F J H H L H H L L H L J J H P H H H H L J H L H L L L H L J P P L L L L L L Z H L L H L L I H H L P L D H J Z Z Z Z Z D D D D D Z Z Z Z C Z C Z Z Z Z H Z Z Z Z D D Z D Z H Z H G b.S.L.L.S.H.H.G.L.S.L.H.A.H.H.G.G.H.D.G.S.A.G.z.h.A.h.h.A.h.h.h.h.j.h.h.g.h.h.g.l.z.k.g.g.g.a.f.k.z.k.a.k.a.a.a.a.a.s.a.i.a.a.a.a.f.a.a.a.a.g.f.f.g.f.a.k.a.a.k.a.a.i.a.i.a.i.a.u.a.i.i.s.u.u.i.t.t.t.t.t.t.t.t.t.t.t.t.t.u.t.t.u.t.t.t.u.u.t.u.t.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.i.t.i.a.i.a.a.a.a.k.a.a.g.f.a.z.a.g.g.k.h.k.l.l.h.A.A.h.l.S.S.G.H.D.H.H.L.S.H.L.L.L.D.L.L.U.L.U.L.L.U.U.L.U.U.L.U.Y.T.U.Y.U.I.U.T.U.T.T.~.T.T./.T./.^.~.^.T.~.(.(.(.(.(._._.}.[._._._.|.}.|. X}.}.}.}.}.}.}.}.}.}.}.}.}._._.`.{.(.(.(.(.(.`.(.(.!.(.^.{.(._.}.}.}.}._._.|._.(._._._.^.(.^.`.^.|.(.{.(.(.(.(.`.^.(.(.`.(.`.`._._._._.|._._._.(.`.(.^._.^.`.(./.(././.~.~.~.!.~.!.~.~././.~./.~./.~./.~.(.~.T.{.!./././.(.(.(./.(.(.[.(.(.(.(._.{.[.}._._._.(.|.^.^.|.(.(.(.(.(.(.(.^.(.(._._.(._.(._.(.^.`.(.(.^././././././.~.[.^.(.(.(.|.|._._._._.`.(.(.^.`.(.`.(.(.(.).)./.T./.T./.~.T.~.T.T.T.T.T.I.L.L.H.H.A.A.A.A.S.A.S.G.A.A.A.H.A.I.L.L.L.L.L.L.L.L.Z.L.A.F.U.H.H.H.H.H.H.H.L.H.H.H.H.H.H.H.H.H.H.S.G.L.L.G.L.G.G.L.S.L.L.S.U.L.L.U.P.Y.P.T.P.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.Y.~.~.~.~.~.~.~.~.~.~.~.~.~.[.(.~././././././.^.(.~.(./.(.(.(.(.(._.(._.`._._._.|._.(.|.[._._._. X X|. X X|..X'.@X.X.X.XzXzXzXdXdXcX.XvXdXdXdXcXdXzXcXcXvXnXnXxXcXnXnXxXnXxXxXnXxXcXxXcXnXxXcXnXxXnXxXcXxXxXxXcXnXxXxX@XxXxXdXdXdXmXdXdXdXdXcXcXcXcXcXdXcXdXmXnXnXxXxXxXnXnXxXcXxXnXnXnXnXMXnXcXMXmXnXnXnXcXcXnXcXnXnXcXnXmXnXnXnXnXxXnXcXnXnXNXnXnXmXnXnXxXnXmXmXmXmXmXmXnXmXmXcXcXmXmXnXnXmXnXnXmXmXmXnXmXmXxXcXnXmXMXmXMXMXMXMXMXMXMXMXMXmXMXmXMXmXMXMXSXmXSXmXmXSXmXmXmXMXmXMXmXMXmXSXMXMXMXmXMXmXmXnXmXmXMXcXcXcXxXxXxXdXxXdXcXdXxXzX@XdXzXzX.XzX'..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X|.|._.`._._.`.(./.(./.(.(./.{.(.{.(.(./.(././.!././././.~././.~./.~.~.~.~.~.T.T.T.T.T.T.U.U.L.L.S.L.P.Z.D.L.L.G.H.U.L.G.L.H.U.L.L.L.L.L.L.L.L.D.U.L.L.S.U.L.L.L.H.K.G.L.G.L.L.L.L.H.L.G.G.L.L.L.L.L.S.Y.Z.L.L.H.H.K.H.H.U.S.U.S.U.L.L.L.L.U.L.L.U.L.L.L.L.P.P.P.L.L.L.U.L.T.U.T.T.T.T.T.Y.P.P.P.U.U.U.T.T.T.~.T.T.~.~.~./././.~./.^.(._.(._._._.|.|.|.|..X.X.X.XdXdXcXdX.XzXzXxXxXxXnXnXcXcXcXnXmXmXmXmXmXmXmXmXmXmXmXmXmXnXcXmXnXnXxXxXxXxXxXxXxX@XxXzXzXzXzXzX.X'..X.X'..X|.|.{._.{.|.^.{.`.(.(.`.^.(.(.(./.(.",
+"Z C Z Z C B C C Z Z Z Z G B D Z C Z C Z Z C Z Z C Z F D Z G D D F Z D D D D D H H H H H H H H H H H H H H H H H H H H H H G H H D H H L H H H H J J D K P H H J J P K U P K L L P L P H L L L L Z J J L L L L L H U Z H Z Z Z D Z Z H Z D D Z D Z D D D Z Z Z Z Z H Z Z Z G Z Z G Z Z G H Z D Z Z Z Z H T Z.L.H.S.L.G.L.L.L.A.S.H.H.G.A.D.H.S.S.G.S.S.S.S.G.A.A.A.A.A.h.A.h.h.h.h.h.h.h.l.l.g.k.g.z.g.g.k.z.a.a.f.a.a.a.a.a.a.a.i.a.a.i.a.a.a.a.f.k.a.a.f.f.g.a.z.a.k.a.a.a.a.a.i.i.i.i.u.a.u.a.u.i.u.u.u.a.t.u.t.t.t.t.t.t.t.t.t.t.t.t.u.t.u.t.u.t.t.u.t.u.u.u.u.u.u.u.u.u.u.u.s.u.i.u.i.i.i.a.i.i.a.a.a.i.a.k.a.g.f.f.g.z.z.g.h.h.h.h.h.h.h.h.l.A.l.l.Z.H.D.A.G.H.S.U.L.L.L.L.P.P.L.L.U.L.P.P.L.Y.U.U.U.Y.Y.U.U.U.I.Y.T.U.Y.T.T.I.T.T.T.T.~.T.~.~././.(.[.(.(.(._.(.|.}.}._.|._._.}.}.|.}.|.}.}.}. X}.}.}.|._.}.}._._.`.`.`.(.`.(.(.!.!.(.`.^.(.(.(._.{.}.}.}._.|.|._._.|.{._._.(.^.`.(.(.`.(.^.`.`.(.(.(.(.(.(.(.`.(._._._._._._._._.|.`.[.`.(.`.^.(.(././.!.~.~.~.~.~.~.~././.~.[.!.~./.[.!.~.~.(.(.^.^.(./.(./.~.(.(.(.(.(.(.(.(.(.^._._.}.|._.|.|.{.|.|._.`.(.^.`.(.^.`.`.(._.(._._._.(._.`.`.^.(.(.(.(.(.(.!././.(.(.^.^.(.(.{._.|._.|._.|._.|.`.`.(.(.^.(.(./.~./././.~./.T.~.~.~.T.T.T.T.L.L.L.H.H.H.H.G.A.A.h.A.A.S.H.A.A.H.G.S.L.L.L.K.L.L.L.P.P.P.L.I.H.H.L.H.H.K.H.H.L.L.H.H.H.H.L.H.L.H.K.H.G.G.L.L.L.S.L.L.S.L.L.J.L.L.I.P.T.T.T.Y.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.~.T.~.~.T.T.~.~.~.~./.~.~.!.~.~./.(.~.~./././.(./.^.(.{.(.(.(.(.(.|.(._._._.|._._._.|.|._.|.|. X_.'._.|.'. X.X.X X X'..X.X.X.X.X.X@X.XdXdXdXfXdXdXcXxXxXcXxXxXnXnXxXnXvXnXnXxXvXxXnXcXcXnXcXxXnXxXxXnXxXxXcXxXxXcXnXcXxXxXdXxXdXnXmXdXdXcXcXmXdXcXdXcXcXcXcXcXcXcXxXxXnXnXnXnXnXnXMXcXmXnXmXmXmXMXmXmXcXmXmXnXmXmXmXnXnXmXMXmXmXmXmXnXMXJXmXMXmXnXMXnXnXMXmXJXmXmXmXmXmXmXmXcXmXnXmXmXmXmXnXnXnXnXmXnXnXnXnXmXnXmXmXMXMXMXMXMXMXMXMXMXMXMXmXMXmXmXmXmXmXMXMXMXMXMXMXMXMXMXMXMXSXMXmXmXmXmXmXMXMXMXMXNXmXmXmXnXJXnXmXcXcXcXnXxXdXcXnXdXdXzXdXzXdX.X.XzXzX.X@X.X.X.X.X.X.X.X'..X.X.X.X.X.X.X.X|..X|.|.|._.{._._.(.(.(././././.(.(./.(././.(./././././.[./.~./.~.~./.~.~.~.~.T.~.T.~.T.T.T.U.U.U.L.L.L.D.P.L.H.L.G.L.S.H.G.L.H.H.G.L.G.L.L.L.L.L.L.L.S.L.L.L.U.S.S.U.U.G.L.A.H.L.H.G.L.D.L.L.L.L.L.L.H.H.H.L.H.L.S.L.H.H.H.H.S.L.L.L.L.L.L.U.U.L.U.L.L.L.U.L.P.L.P.P.L.L.L.L.Y.L.U.T.P.T.T.T.T.Y.P.P.T.U.U.U.T.T.T.T.T.~.T.~.(.^./.(.(.(.(.(._._.`._._.|.|..X.X.X.X.XdXdXxXdXxXzXzXzXdXxXxXcXnXmXmXJXcXmXmXmXmXmXmXmXNXmXmXmXmXmXmXnXnXnXnXxXcXxXxXxXcXdXxXzXzXzXzXdXzX.XzX.X.X.X.X|._.|._.|._.(.|.{.`.(.(.^.(.^.(./.",
+"C Z C Z C Z Z C Z Z Z Z B C Z D Z D Z D F Z B Z Z Z Z C B G C G D D D D D D H D H H H Z Z H Z H F J H H H H H H H F H F H H H H H H H L H L P P H J H H J Z L J J H L D H J J H P J P H L L L L J J J L H J L J P H H L L H D H Z L Z H H Z Z Z D Z Z Z Z Z D D Z C H Z Z G Z Z Z Z Z H Z Z D D Z Z Z Z G Z.L.S.L.L.L.G.D.D.S.H.H.H.G.G.S.S.S.S.S.G.S.S.G.A.A.A.A.A.h.h.h.h.h.h.h.z.h.h.z.h.h.z.g.g.h.g.f.f.f.z.z.a.z.a.a.a.a.a.a.a.a.a.a.a.a.f.f.f.a.f.a.z.f.f.a.k.k.a.a.k.a.u.i.i.i.i.i.i.i.a.i.s.u.u.u.u.u.t.t.t.t.t.t.t.t.t.u.E t.u.t.t.t.u.t.u.u.t.u.u.u.u.u.u.u.u.u.u.t.u.u.u.u.u.u.i.i.i.a.i.a.a.a.g.i.a.i.f.d.a.k.a.f.k.k.h.l.h.h.l.h.h.l.S.h.S.A.S.D.L.S.H.L.A.S.L.L.P.P.P.P.P.U.L.P.P.K.J.L.L.L.U.Y.Y.T.I.U.T.T.I.U.U.T.T.T.T.T.~.~.~.~././.(.(.(.(.(.^.^.|._.}.}.|._.|. X}. X X}.}.}.}.}.}.}.}._._.|._.|._.|.|.(.(.`.(.(.(.(._.(.(.(.(.(.^.|.^.|._.}.}.}.|._._.(.`.^.(.^.^.^.(.(.^.(.(.(.`.(.(.(.(.`.(.`.^.`._._._._._.|._._.`.(.^.(._.(.^.(.(./.(.~././.~.~.[.~./.~./.~./.~.~./.~.~./.[././.^.(./.(.{.~.(.(.^.(.(.(.(.{.`.`.|._.}.}.|._._._.`._.|._.`.(.`.(.|.|.^.|.`._._.(.(.(.|.(.`.^._.(.`.(.(.(.(.(.(.^.(.(.{.|._.|.|.|._.|.'._.|.|.|.`.`.`.^.`.(.(.(.~././././.~.~.~.T.~.T.~.I.T.L.L.L.L.H.A.A.S.A.S.A.S.h.H.S.H.A.S.S.S.H.L.L.K.L.L.P.P.L.L.L.L.L.L.Y.L.L.L.S.L.H.L.S.L.S.L.H.H.H.S.G.L.H.L.H.P.A.L.L.L.L.L.L.U.U.U.U.Y.T.Y.T.T.T.T.T.Y.T.T.~.T.T.T.T.~.T.~.T.~.T.T.T.T./.~.~.~.~.~./.[.!.~.~.T.~./././.[.(.[././.~.(.(.^.(.(.(.(.`._.}.|._.|.|.|. X'.'..X.X'..X X'..X X X.X.XdXdX'.zXzXzXzXzXdXdX.XcXdXdXcXdXzXzXxXxXnXnXnXxXvXnXvXnXnXvXnXnXcXnXcXcXnXnXxXnXxXnXnXxXxXzXxXxXxXxXxXxXxXxXxXxXcXdXnXdXdXcXvXdXcXcXcXdXcXcXcXcXnXnXnXnXnXnXnXnXxXcXmXmXcXmXmXmXmXmXmXfXmXcXmXcXcXnXcXnXnXmXcXmXmXmXnXMXmXMXnXmXMXmXmXvXmXmXmXmXmXmXnXmXmXcXmXmXnXcXmXcXmXmXmXnXnXnXmXcXnXnXmXmXnXmXmXMXMXmXMXMXMXMXMXMXNXMXMXmXMXmXMXmXmXMXMXMXmXMXMXMXmXMXmXmXmXmXmXmXmXmXnXMXMXmXmXmXmXmXcXmXnXnXnXcXxXnXxXcXfXvXzXzXdXxXdXdX.X.X.X.XxX.X.X.X'..X.X.X.XdX'..X.X.X.X'..X|..X|.`.|.`.|._._.(.(./.(.(././.(.(./.{.(././.(./././.~.~.~.[.~./.~.~.~.~.T.~.~.T.~.T.T.T.Y.U.P.P.L.P.L.L.L.S.H.L.H.H.H.H.G.S.H.S.H.H.L.L.L.L.H.P.L.L.U.L.L.L.S.H.H.S.H.H.D.L.L.D.H.H.D.G.H.L.H.G.H.H.H.H.H.U.D.H.H.H.H.H.S.U.H.U.L.H.L.L.L.L.U.L.L.U.L.U.L.P.L.P.A.P.L.P.U.U.Y.U.T.U.Y.Y.T.U.T.T.T.U.U.U.U.T.T.~.T.~.~.~.~.~.~.~././.(./.(.(.(.{._._.|.{.|.|..X.X.XdXdXdXdX@XzXzXzXzXzXxXxXcXcXnXnXmXmXnXmXmXmXmXJXcXmXmXmXmXnXnXnXnXnXcXfXcXnXxXxXxXxXxXxXxXxXzXzXdXzX.X.X.X`.|.|.|.|.{.|.{.|.^.^.^._.(._.(.(.(.(.(.",
+"Z Z D Z Z C C Z B Z Z D Z C Z B C B Z Z Z Z Z Z Z Z Z Z Z Z Z Z D Z D D D D Z Z Z Z H H H H L H H D H H H H F H H H H H H H H H H H L H H H H H J H H J L J J H J J L U U L H J J J U H L S L L L L L Z L L L L U H H H H L L H Z Z H Z Z Z D D Z D G B Z Z D D Z Z Z Z Z Z Z L Z G H Z D D D Z Z H Z G G b.S.H.L.S.G.H.L.H.H.H.S.H.A.H.G.S.S.G.H.S.S.S.A.A.A.A.A.h.h.Z.A.h.A.h.A.A.h.h.l.l.l.l.h.h.z.a.f.x.f.f.a.a.a.a.a.a.a.a.a.a.a.a.f.a.a.a.f.f.f.z.g.f.f.f.k.k.a.k.k.u.a.a.i.a.i.i.u.i.i.u.u.u.i.u.u.u.u.t.t.t.t.t.t.t.t.t.u.u.t.u.t.u.u.t.u.t.u.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.i.s.i.a.i.i.a.a.a.z.a.a.f.g.i.f.k.k.k.k.k.l.h.h.h.h.l.l.h.A.S.S.A.H.S.S.U.U.L.L.L.P.P.P.L.P.U.D.P.P.Y.L.L.L.Y.L.L.U.U.I.I.U.I.T.I.T.Y.T.T.T.T.T.T.~.~.~.(.~.(.(.(.(.(.[.|.(.|._.|.|._.|.}.}.|._.}. X}._.}.}._._._._.(.(._.(.(.`.(.(.(.(.(.(.(.(.(.(.(.^.^.^.|._.|._.|.}.|.(._._._._.(.|.`.{.|.(.(.(.(.(.(.(.(.(.(.(.^.^.(.^._._.(.(._.^._._.(.(.`.(._.(.(.(././././.~.~.^.~.!.~.~.~.~././.~./.~././././././.(./.(./.(.(.(.(.`.(.(.^.^._.^.^._.|.}.}.|.|.|._.|._._.{._.`.`. X_.{.|._._._._._.|.|.(._.(._.(.(.(.(.(.(.(.(.(.`._._.(._.}.}.|.|.'.'.`.`.|.'.|.|.|._.|._.)._.(.(./.~././.~.~.T.~.~.~.T.T.Y.U.L.H.H.H.H.A.S.A.S.A.H.A.h.A.G.H.Z.S.S.S.Z.U.Z.Y.K.L.Y.L.L.K.U.J.K.H.L.L.L.L.L.L.L.L.L.U.H.L.L.S.U.L.L.L.L.H.L.L.L.L.L.L.L.U.U.T.U.U.P.P.T.P.T.T.T.T.~.T.T.T.T.Y.~.T.~.T.~.~.~.~.~.^.~.~.!./.[.!.~.~.~.~.~.~.(.[.~././.(.(.(.(.^.(.^.(.!.(.(.(.(.`.(.}._.|. X|..X.X.X.X.X.X@X.XzX.XdXdXxXdX.XdXdXzXdXcXzXzXnXfXdXcXdXvXcXdXcXxXxXxXcXxXxXxXnXnXnXnXnXnXcXnXnXnXnXcXcXnXnXnXxXcXxXxXxXxXzXxXxXxXxXxXxXxXxXxXxXdXcXcXcXcXcXcXcXcXcXvXcXnXcXnXcXnXnXvXmXnXmXmXmXmXmXnXnXmXmXnXmXcXmXmXmXcXmXcXmXnXnXnXnXnXcXmXcXnXMXnXnXnXnXnXmXnXmXmXmXmXmXmXMXmXmXmXmXmXmXmXmXmXmXmXmXcXcXmXmXmXmXnXmXnXmXnXmXmXmXmXMXMXNXMXMXMXMXMXMXMXMXMXnXmXmXMXmXmXMXMXMXmXMXMXMXmXmXmXmXmXMXnXmXmXmXnXJXmXmXmXmXmXcXmXnXnXnXxXxXxXxXxXdXdXcXzXzXdXdXdXdXxXzX.X.X X.XdX.X.X.XzX.X.X.X.XdX.X.X.X.X.X.X.X|.'.`.`._._._.^./.(.(./.(.(./.(.(.(./.(./././.~./.~./.~.(.~.~./.~.~.T.~.T.~.T.T.T.T.Y.U.Y.P.P.P.L.S.L.S.U.S.H.L.H.H.H.H.H.H.H.H.H.G.G.D.D.H.A.L.L.S.L.Z.S.L.S.H.H.H.H.G.H.H.H.H.H.S.L.L.H.H.H.S.K.H.H.H.H.H.H.H.G.K.H.H.S.Z.L.H.L.L.L.S.U.L.L.U.L.P.L.P.L.P.L.P.P.P.L.L.U.L.U.L.U.P.Y.T.U.T.U.T.U.T.T.T.U.T.T.T.T.T.~.T.~././.[./.(./.(.(.`.(.|._.|.|.|..X.X.X@X.X.XdXdXdXzXzXzXzXxXxXxXxXnXnXnXMXnXmXmXmXmXmXmXmXmXmXdXmXnXnXnXnXcXcXvXcXxXcXxXxXxXxXzXzXzXzXzXdXxX'.zX'..X'.|.|.|.|._._.`._.|.`.(.(.(.(.(.(.(.(.",
+"C C Z Z D Z Z D Z C Z Z Z Z C D Z Z C Z Z Z F Z Z Z C G Z H Z Z Z Z Z Z Z H Z L H Z H Z H Z H H H H H H H F H H H D H H F J H H H H H L H P U D J J H H J J H J L L P K J H J H P P P L L L L L Z L Z J L H H J H H L H H H L Z J Z Z H Z Z H D Z Z Z G Z Z Z Z Z H Z G Z Z L Z H Z L Z Z Z D D Z Z Z L Y Z.S.L.S.U.A.D.H.S.H.H.H.H.G.G.S.S.S.H.D.H.G.S.H.A.A.A.A.A.h.h.A.A.A.l.h.S.h.h.h.h.h.h.h.h.h.h.f.f.f.f.a.f.a.a.a.a.f.a.a.a.a.a.a.f.a.f.f.g.f.f.a.a.g.a.k.a.a.a.a.a.a.a.a.i.i.i.u.a.u.u.i.u.u.u.u.u.u.u.t.t.t.u.t.u.t.t.u.t.u.t.t.t.t.t.u.u.u.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.r.a.i.i.s.i.a.i.a.a.a.a.i.g.a.z.z.a.k.f.f.k.g.g.g.g.h.h.h.h.A.h.A.A.A.D.H.H.S.Y.L.L.L.L.A.U.P.P.P.L.U.P.P.P.L.L.U.L.U.L.Y.U.Y.I.Y.U.T.U.U.U.T.T.T.Y.T.~.~.~.~.~./.^.(.(.(.(.(.`.|.^.`._.|. X X}.}.}.}.}.}.}._.|.{.|._.|._.(.|._.`.^.`.^.^.(.(.`.^.(.`.(.(.(.`.(._._._._._.|.}.}._.{._._._._.{.(.`.|.(.^.(.(.(.(.(.^.(.(.^.(.(.(._.(.(.(.(.`.(._._.(.(.(.(.{.(.(.(./.(.~.~.^./.~.~./.~.~.~.!./.~./.~.~.[.~.~./././.(./.(.(.^.(.(.(.(.(.(.^.`.`.(.(.`.|.}.}.|.|._.|.|.|.|.|.|. X_.|.|.|.|.|.|._._._._._.|.^.(._.(.(._.(.^.(.^.|._.|.|._.|.|.|.|.|.|..X|..X.X X|..X|.|.|.|.`._.|.(.|././././.T./.~.R./.T.~.U.T.U.L.L.L.H.H.S.H.Z.G.S.S.S.S.S.H.S.h.H.H.S.H.S.H.L.L.L.Y.L.K.L.L.L.L.L.L.L.L.L.K.L.L.L.L.K.L.L.L.L.L.L.L.L.L.D.L.L.L.L.U.P.P.P.U.L.Y.P.P.Y.Y.Y.T.T.Y.T.T.T.T.T.~.~.T.~.~.Y.!.!.T.~.~.T.~.~.~.!./.!.~.~.~.~.~.!.~.[.~././.[.^.^.^.).^.^.(./.(.(.(.^.|.}.}.}.|.|.`.'..X.X.XdX@XdX.XdXzXdXzXzXzXvXdXdXzXcXxXcXcXcXdXcXvXcXcXcXcXcXcXcXcXvXcXcXcXnXnXcXcXcXnXnXnXxXnXcXxXcXcXnXxXnXdXxXxXxXxXxXzXxXxXxXxXxXxXnXfXxXxXcXcXcXcXcXcXcXcXnXcXcXcXnXnXnXnXnXnXmXmXMXvXmXmXNXmXnXnXmXmXmXmXMXnXmXmXmXnXnXnXmXmXnXnXnXnXnXnXnXnXnXnXmXcXmXmXmXcXnXmXvXmXmXcXnXnXnXnXnXnXmXmXmXnXnXnXmXmXcXmXmXcXmXmXmXmXfXnXmXmXmXMXMXMXMXMXSXMXMXMXNXMXMXMXmXmXmXmXMXmXMXmXnXMXMXnXnXMXnXMXmXnXnXnXMXnXmXnXMXmXmXmXmXnXnXnXmXcXxXxXxXxXxX@XcXdXzXzXzX@XdXdXdX.XdX.X.X X.X.X.XzX.X.X.XdX.X.X@X'.zX'..X.X|..X|.|.|._._.`.(.(._.(.(./.(./.(./.(.(.(./././././.~.(.(.~.T.(.~.T.~.T.~.Y.T.T.T.~.T.T.P.T.U.L.U.L.L.L.S.L.L.H.H.H.H.H.H.S.H.S.S.H.S.H.S.H.H.P.H.L.U.L.S.U.L.H.H.S.A.D.H.H.H.H.G.H.H.G.G.S.H.H.H.H.S.H.H.H.H.H.H.H.H.H.H.H.H.H.K.H.L.L.L.L.L.L.L.L.P.P.P.P.P.P.Y.S.L.P.U.U.U.Y.U.T.P.P.T.T.T.T.T.U.U.T.T.T.T.~.T.~.~.~.~.~.~.^./.(.(._.(.(.`.|._._.|._.|..X.X.X XdXdXdXcX.XzXzXzXzXxXzXxXxXxXnXnXnXnXnXnXmXmXmXmXmXcXnXnXnXnXmXcXcXcXxXcXcXcXcXcXcXzXxXzXxXzXzXzXzXdX.X.X.X X'.@X|.|._.|.{.`.(.`.(._.(.(._.(.(.)./.",
+"G Z H Z B Z Z B Z D B Z D B Z Z Z Z Z Z Z Z Z Z Z D Z B Z Z G D Z Z H Z Z Z D Z S H D H F D Z H H F H H H H H H H H F H H H H F D H L H H H H H F J J J Z J F J L J L J P J P P P L L L L H L J J L L J H L H H L H H H H H D L Z L Z Z Z S Z Z Z Z Z D Z H Z G Z Z Z Z Z H Z Z Z Z D Z Z L D H H Z Z L T Z.L.L.U.S.L.L.H.H.H.H.D.H.G.D.H.S.G.D.G.S.S.S.H.A.h.A.A.A.A.A.A.A.h.A.A.z.A.h.h.h.l.l.h.h.h.h.h.f.f.f.z.f.f.f.f.a.a.a.a.a.a.f.a.f.f.f.f.a.f.g.d.g.f.g.k.a.k.a.a.a.a.a.i.a.i.i.a.u.a.u.u.u.u.u.u.u.u.t.t.u.t.u.u.t.t.u.u.t.p.u.u.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.s.u.u.u.u.i.r.u.i.i.s.a.i.i.a.a.a.a.i.g.i.a.k.a.f.f.g.g.g.k.g.h.h.h.h.A.A.A.A.Z.S.D.D.D.L.H.L.H.L.L.L.L.L.L.L.U.L.U.D.L.U.L.Y.L.P.U.P.I.T.U.U.Y.U.T.U.T.T.T.T.T.!.T.~.~./././.(.(.(.(.(.(./.|.{.|._._.}.}.}. X|.}.}.}.|.|.(._.|.(._.`._.(.^.`.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(._._._._._._.[.|._.|._.{.`.(.(./.^.(.|.(.(.(.{.`.^._.(.(.`.(.(.(.(.(.(.`.(.(._.(.(.(.(.(.(.(./.(./.(./.^.[./././.~.~././././././././.!./././.(.(./.(.(.!.(.(.~.(.(.(.(.^.^.^.`.(.`._. X}.}.|.{.}.|.|.|.|.|. X_.|.|.|.|.|.|._._.|._.|.(.(.|.(._._.(.^._.|._._.|._.|._.{.'.|.|. X.X.X.X.X.X@X.X.X.X.X.X|.`.`.`.{.(.(./././.~.~.T./.Y.T.T.T.U.T.U.L.H.H.H.A.Z.A.G.H.A.S.S.A.S.S.H.H.S.S.S.S.S.D.L.P.P.U.Y.U.L.U.U.L.K.L.U.L.K.L.L.L.L.S.L.L.L.L.L.L.L.L.L.U.L.L.L.L.L.U.P.P.P.Y.P.P.P.L.U.P.Y.T.T.T.~.T.T.T.T.T.T.~.T.T.T.^.^.~.~.~.~.~.~.T.(.~.~.~.~.~.~.~.~.~.~.~./.E.(.~.(./.^.~.(.(.(.(.(.^.(.^.}.}.|.|. X X X.X.X X.XdXzXdX@XdXdXzXzXdXnXzXcXxXxXdXcXnXcXcXcXcXcXnXnXcXmXcXcXcXvXcXcXcXcXcXcXcXcXnXnXxXxXxXxXdXcXxXxXcXdXxXxXvXzXzXxXxXxXxXcXxXcXxXnXcXxXcXcXcXcXcXcXmXcXcXnXcXnXnXnXnXcXcXMXnXMXmXmXnXnXdXmXnXnXcXmXmXmXmXMXnXmXmXnXnXnXnXdXnXnXnXnXnXnXnXnXnXnXnXnXnXmXmXmXmXnXmXmXcXmXnXnXnXnXnXnXnXmXmXmXnXnXcXmXcXmXmXmXmXcXcXdXNXNXmXmXmXmXMXMXmXSXMXMXMXMXmXMXMXMXMXMXmXmXmXmXmXmXnXnXcXmXMXmXnXnXnXmXnXmXmXvXnXMXmXmXmXmXnXnXnXnXnXnXxXxXJXcXxXxXdXcXcXzXdXdXdXdXdXzX'.zX.X@X.X.X.X.X.X.X.X.X.X.X X.X.X.X.X|..X|.|.|._.|.(.|.(.(.{.(./.(.(.{./.{.(.(./.(./.(././.~.~.T.~.~.~.~.~.T.~.T.T.T.~.T.T.T.T.T.P.U.U.P.P.P.L.L.L.H.L.H.H.G.H.H.G.S.H.H.H.H.H.H.H.H.H.H.H.S.L.L.S.S.H.H.H.H.G.H.H.H.H.G.D.G.S.G.H.S.H.S.G.H.H.H.H.H.H.H.H.H.H.G.K.K.K.S.L.G.L.S.L.L.L.L.L.P.P.P.P.P.P.P.P.P.L.L.U.U.U.U.U.P.Y.P.T.U.T.T.T.T.T.T.T.T.T.~.T.~.T.~.T.R.^./.[.(.(.(.^.(.(._._._.|.|.|..X.X.XdX XdX.XzX@XzXzXzXzXxXxXcXnXnXxXvXnXJXcXmXMXnXmXmXcXnXnXnXnXdXcXcXcXcXcXcXcXxXcXnXxXxXxXxXxXzXzXzXdXdX'.zX.X X`.|.|.|._.|.|.{.`.|.(._.(.(.(.(.(.(.",
+"Z Z Z Z Z Z Z Z Z Z D Z Z Z Z D B Z Z Z Z Z Z F D Z Z Z Z Z Z Z Z H Z Z G Z Z Z D D D D L Z Z H H F Z D H Z H F H H Z H D H H H L H H H H P L P L L F L J J J H L K L L H J J D L L L L L L L D Z L H Z H L L H L H Z H H Z Z H L L Z J D F Z Z L Z D D Z D D G Z L Z H D Z Z G Z Z Z Z H Z Z S H Z D G [ l.P.A.D.S.L.D.H.H.K.S.H.G.A.G.A.G.S.D.S.S.S.S.S.S.H.S.A.A.A.A.A.z.A.h.g.Z.h.A.D.h.h.h.h.h.h.z.k.k.f.f.f.f.f.f.a.a.a.a.a.a.k.a.f.a.k.a.f.f.g.f.a.g.d.f.k.a.k.a.a.k.a.a.a.i.i.a.u.a.u.u.x.u.u.u.u.u.u.u.t.u.u.u.t.u.u.u.u.u.t.u.u.u.u.t.i.r.u.u.u.u.i.u.i.u.u.u.u.u.u.u.u.u.u.i.i.i.i.i.a.a.a.a.a.z.z.i.i.a.z.a.a.i.k.a.f.g.g.g.k.h.z.z.A.h.A.A.A.S.S.S.H.H.L.L.L.L.L.L.A.U.L.P.L.D.U.L.L.L.L.U.Y.T.U.T.T.U.T.T.I.I.T.T.T.T.T.Y.T.T.T.~././././.(.(.^.`.(._.|.`.{._._.|.}.}.}.}.}._.}._.|._._.|._.(.|.^.(.^.^.(.(.(.(.(.`.(.(.(.(.(.(.(.^.`.(.(._._._._._.`.(._._._._._.`.(.|./.(.|.(.(.]._.(.(.(.(.(.^.(.(.(.(.(.(.!.(.(.(.(.(.(.(./.(./.(./././././.!.[./.~././././.~././.(.!./././././././.(.(.(.(.(.(.(.(.(.(.(.{.[._._._._.|.|.|._.|._.|.|..X|.|.|.|.|.|.|.|.|.|.|. X|.`.`._._.`.(._.(.`.`.|.`._.|._.|.|.|.|.|..X'.'.dX.X.X.X.X.X.X.X.X.X|.|.|.|.{.`.(.(././.~.~./.T./.~.Y.~.T.T.Y.L.L.U.A.H.H.H.S.H.Z.G.G.G.H.S.S.G.H.H.H.S.H.S.S.S.D.L.P.U.L.P.P.L.Y.L.L.U.U.L.U.L.L.L.L.L.L.L.L.L.L.L.L.S.U.L.L.P.P.P.P.P.U.P.T.L.U.Y.U.U.P.Y.U.Y.Y.T.P.T.Y.!.~.!.Y.!.Y.~.Y.T.XX~.~.~.~.~.~.!.T.~.!.!.!.!.~.~.~.T.~././.!./.(./.(./.(.(.(./.(.(.^.(.}.|.|.|.|..X XdX'.dX.XdXzXzXdXdXdXxXzXdXzXdXcX.XxXcXdXmXmXcXcXmXcXcXmXmXmXnXMXcXnXnXnXcXmXcXcXnXcXnXcXxXxXxXcXcXxXcXxXxXcXxXxXcXcXzXxXxXxXxXxXcXcXcXcXcXnXnXcXcXdXcXcXmXcXcXnXxXmXcXcXcXcXcXmXcXJXmXJXnXnXnXmXnXmXmXcXmXvXnXmXdXmXnXnXnXnXnXnXnXnXcXmXmXdXmXcXnXnXnXnXnXMXxXmXcXcXmXvXcXcXmXcXnXnXmXnXmXmXmXnXnXmXnXcXNXmXnXmXmXmXmXmXcXmXfXmXMXmXMXMXMXmXMXMXMXNXfXmXmXMXMXMXmXmXmXmXmXmXmXnXnXcXmXcXcXnXnXnXnXnXnXnXnXnXmXmXmXcXmXnXnXzXJXnXxXnXxXdXxXxXxXcXnXzXzXdXzXdXdXdX'.dXdXzX X.X.X.X.X@X.X.X.XdXdX@X.X.X.X.X.X.X.X|.|._.|.`.^.(.(.(.(.E.^./.(./.(.!.(././././.~./.~.[.[.~.T.~.T.~.~.T.T.T.T.T.T.T.Y.P.P.P.U.U.L.L.L.L.L.L.L.H.H.H.H.H.H.S.H.l.H.G.S.S.H.S.H.H.D.H.H.H.H.H.H.H.H.H.H.H.G.G.D.G.A.H.S.H.S.S.H.A.S.S.S.H.H.S.H.H.H.H.K.H.K.H.A.H.H.H.L.H.L.L.L.L.L.L.P.S.L.L.P.P.P.P.L.L.L.P.U.P.Y.Y.U.P.T.P.T.T.T.T.T.T.T.T.T.~.~.~.~.T.(.~././././.(.(.(.`.`.^.|._._._.|.|..X.X.X.X'.'.zX.X.X.XzXzXzXxXxXxXcXnXcXmXnXnXmXcXnXnXnXMXmXmXnXnXcXmXcXcXJXdXxXcXcXcXcXdXvXxXxXzXdXzXzXzXdXdXdX@X.X.X|.|.|.`._._.`.|.`.^.(.(.(._.(.^././.",
+"Z Z Z Z Z G Z Z Z Z Z Z Z Z Z Z F D Z F Z F Z C Z D Z Z Z D Z Z Z H Z Z H H Z Z D D D D H Z L Z D D D D F D D D D H H H H H H H L D H L H H H H H J J J H H J L L L L H P H L J L L J L L S H L L L J J H L H J H H L H H H H H Z Z Z Z D D Z H Z Z D D Z D D Z H G G Z Z G H Z Z H U Z Z H H Z Z Z G H T Z.P.P.L.L.L.G.H.H.A.S.H.H.D.H.D.G.H.S.S.S.G.S.S.S.S.S.A.A.A.A.A.A.A.h.h.A.A.h.z.A.h.h.l.h.h.k.l.j.a.f.f.f.f.a.g.a.z.f.z.a.f.a.f.f.k.k.g.f.a.g.a.d.a.f.d.a.a.a.a.a.k.a.a.a.a.u.i.i.u.u.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.u.u.t.u.u.u.t.u.u.u.u.u.u.u.u.i.i.u.u.u.s.u.u.u.u.u.i.u.i.s.a.a.a.a.a.a.a.i.a.g.a.a.k.a.k.k.f.f.f.f.k.k.h.h.h.A.g.A.S.A.L.H.H.H.L.H.L.L.L.L.P.P.L.L.P.P.L.P.U.L.L.P.U.U.U.T.U.T.U.U.U.T.U.T.T.T.T.T.T.T.T.~.T./././.(./.(.(.|.^.^.|.`.`.|.|.}. X}. X_._._._._.|._.{._.|._.^.|.[.(.(.(.(.(.`.(.(.(.(.(.(.`.(.(.(.(.`._.(._._.^.`._.(.[.|.|.^.^.|.^.`.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.!.(.(.(.(.(.(.(.(.(.(.^.(./././././.(./././././././.~.~././.!././././.!.^.(./.(.(.(.(.(.(.{.(.(.(.|.(.(.|._._.|._._.|.|._.|.|.|.|.|.|.|.|.'.'. X X X.X.X|..X|.|.`.|.(.`.`._.(.(.(.(.`.|.|.|.'.|..X.X.X.X.X.X X@X.X.X.X.X.X.X.X.X.X'.|.`.|.^.^.(././././.T.~.~.(.T.I.T.R.L.L.L.L.H.H.H.H.H.H.H.H.H.H.H.H.H.K.S.A.H.H.H.D.S.Y.Z.L.L.U.Y.L.L.L.U.L.L.L.L.L.L.L.L.L.L.H.L.L.L.L.L.L.L.L.L.L.U.P.P.U.U.U.P.P.P.T.L.U.Y.Y.P.Y.Y.T.T.T.T.T.~.T.Y.T.T.~.~.[.~.~.[.~.~.T.!.T.^.~.~.T.[.[.T.[././.~./.[.[.~.(././.(.(.(.(.(.(.[.(.(.(.{.{.}.{.}.}. X X@X.X.X.XdX.X.XdXdXdXdXdXvXvXzXcXxXxXxXvXcXcXcXcXcXcXnXcXnXmXmXmXmXmXmXnXnXcXxXcXcXcXcXvXxXvXvXxXdXxXcXdXdX X@X.XvXzXxXxXxXzXxXxXxXcXxXxXxXcXdXvXcXnXvXcXcXcXmXvXxXdXnXnXvXcXnXmXcXnXvXmXzXnXmXnXmXcXmXmXmXmXmXmXnXmXnXnXnXnXnXnXnXnXnXnXdXcXmXcXcXnXnXnXnXnXnXvXmXmXnXnXmXcXcXnXnXnXnXnXnXnXnXnXmXmXnXnXcXcXmXmXmXmXmXmXmXmXmXmXmXmXMXMXMXMXMXMXMXMXDXMXMXMXMXMXmXmXmXmXcXcXfXnXcXnXcXmXmXnXnXcXnXcXcXnXnXnXnXnXMXvXnXnXnXnXnXxXnXcXnXcXcXxXxXdXcXzXcXdXdXdXdXdXdX.X.X.X.X.X.X.X'.dX.X.X.X'..XdXzX.X.X.X|..X X|.|.|._.`.`.(.(.{.(.(.^.(.(.(././././././././.~.~.~.~.~.~.T.~.T.~.T.~.T.T.T.U.Y.P.P.P.P.L.U.L.L.L.L.L.A.L.L.S.L.H.G.H.D.S.H.H.A.S.G.G.H.D.S.H.H.H.H.H.H.H.H.H.G.H.H.G.G.D.H.G.H.H.S.S.G.H.H.S.S.S.H.H.H.S.H.L.G.G.H.G.G.H.K.H.L.L.G.L.L.D.P.A.H.S.L.L.L.P.L.P.L.L.L.Y.P.U.L.Y.U.T.Y.U.T.T.T.~.T.T.T.T.T.T.~.R.R.T.~.T./.~./././.(./.(.^.^.|.{._.|.|.|. X X.X.X.X.XzX.XzX.XzXzXzXzXzXzXxXcXcXcXnXnXmXnXnXnXnXnXnXnXnXnXnXnXdXmXmXcXxXcXcXcXcXnXdXxXxXvXzXcXzXzXzXdXdX X.X.X.X.X|.`.|.|._._.|.`.(._.(._._.!././.!.",
+"Z Z Z Z Z Z G Z Z Z C Z Z D C D D Z Z Z Z Z Z Z Z G Z Z F Z G B Z Z Z Z Z Z Z D Z Z Z P Z G Z L H F H Z H D H Z H D L D H H H G H H H H L H H L J J J J H J J H J D J J J J J H H L L L J J H H J L Z J Z H H L H H H H D Z D L Z Z Z Z Z Z Z H H Z Z D Z D D D L Z L Z Z H Z Z H H H Z H Z H H D H L L e.F.T.H.H.H.H.H.H.H.S.H.A.h.G.S.H.H.H.A.H.S.G.S.S.S.S.S.S.S.A.A.A.h.A.A.A.h.A.h.A.A.A.A.l.l.l.h.k.j.f.k.f.f.g.f.f.f.a.j.a.j.f.j.g.g.a.z.f.f.z.a.a.a.f.a.a.a.a.a.a.a.a.a.a.a.a.i.i.u.s.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.p.u.u.u.u.u.i.u.i.i.a.u.u.a.u.u.r.u.u.u.i.t.i.i.u.i.a.a.a.a.a.z.a.k.i.k.a.k.i.f.f.f.f.d.k.k.k.g.k.g.h.S.A.A.A.H.G.S.H.H.L.H.H.L.L.L.L.l.H.P.L.L.L.G.L.U.P.T.U.Y.Y.T.T.T.T.Y.P.Y.T.U.T.T.T.~.T.~.T.~.~./././.^.(.(.(.(.(.(._.^._._._.}.|.}.|.}.}.}.}.|.[.|._.{.^.{.|.`.^.(.(.(.(.(.(.].(.(.(.(.(.(.`.`.(.(._.(.(._.(.(._._.(._._._._.{.`.(.^.).|.^.(.(.(.(.(.`.^.`.^.(.(.(.(.(.(.(./.(.[.(./.(.(./.(./././././././.(./.(././././././././.!./.(.(./.(.(.(.(.(.`.^.(.(.(.(.(.(.`.^.^.|._.|.}.|.}.}.}.|.|.|.|..X|..X'.|.|. X.X X'. X.X.X|.|.|.|._.^.|.(._.(.|.`.`.`.'..X.X.X.X'..X.X.X'.dXdXdX X.X.X.X.X.X.X.X.X|.|.|./.(.(./.(.~.~.~.~.T.T.T.T.T.T.I.L.L.H.H.H.H.H.H.H.H.S.L.H.H.S.H.H.H.H.H.H.H.H.H.H.H.U.S.D.U.U.L.L.L.P.L.P.L.L.L.L.L.L.L.L.L.L.L.L.L.L.Y.K.U.U.T.U.P.P.T.P.P.T.P.Y.U.P.U.L.P.P.P.P.Y.T.T.Y.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.Y.~.Y.T.~.Y.T.~.T.T.T.~.~.~.(./.(.(.(.(.(.(.(.(.(.^.^.(.(._._._._.|._.'. X'.@X.XdXdXzXfXdXdXdXcXdXdXdXcXxXxXxXJXnXnXnXmXcXmXmXmXmXMXnXmXmXmXmXfXmXmXcXnXnXxXnXJXxXxXxXJXdXxXnXcXdXcXJXxXcXnXxXcXcXcXcXxXxXxXxXcXcXcXxXxXnXnXxXcXcXcXdXxXxXJXdXcXcXcXcXxXvXcXmXmXcXnXmXnXnXnXmXfXmXmXcXmXmXmXmXnXnXnXnXcXnXnXnXnXcXnXnXxXxXnXnXnXfXvXcXcXmXcXmXnXnXcXvXnXnXnXnXnXcXMXnXnXmXnXMXmXxXmXMXcXmXNXmXmXmXmXmXMXmXmXMXMXMXMXMXSXMXMXMXDXmXmXMXmXmXmXmXmXmXcXmXdXcXcXcXcXcXnXnXcXnXnXnXnXxXnXxXnXnXnXnXnXnXnXxXxXxXcXcXxXxXcXdXcXdXcXzXzX XdXdXzX.X.X'..X.X.X.X.X.X|..X X X@X.X.X.X.X'..X.X.X.X X|.|.|.|._.`.^.(.(.(.(./.(.(./.(./././././.~.~.~.~.T.T.^.T.T.~.T.T.T.T.U.T.U.T.P.P.Y.L.U.L.L.L.L.L.S.L.S.L.S.L.H.H.H.H.S.S.S.S.G.S.S.H.S.S.H.H.H.H.H.L.H.H.H.H.H.S.S.S.S.S.H.S.G.S.S.S.S.S.S.S.S.H.H.S.H.H.L.L.A.L.D.H.L.H.L.L.H.H.L.L.L.L.Z.U.S.L.L.L.L.L.U.S.L.P.P.P.P.P.P.P.U.U.U.U.T.T.T.T.T.T.~.T.T.~.R.~.~.~.T.(././././.(./.(.(.(.`.{.|._._. X'. X.X|..X.X@X'..XzXdXzXzX@XdXcXxXxXxXxXcXnXnXvXnXxXvXxXvXnXcXcXcXxXxXxXxXxXcXcXcXnXxXnXnXvXxXxXzXzXzXzXzXzXxXdXdX.X.X X|._. X_.|.{.|._.[.|._._.^.~.(.~.(.",
+"Z Z Z D Z D D Z Z D D Z D C D C Z Z G Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z D Z L G Z Z H Z L H Z Z Z D Z H H S D D L D H H H H H H H L H L H L H H L L J H H H L J L L L H J L L L L L L Z L L J Z L L J L Z L D H Z H H L D Z H H Z L H Z H Z Z D D Z Z D D D Z Z Z Z Z Z H Z Z H Z H Z H Z Z Z Z Z L e.Z.H.H.H.H.H.H.H.H.S.S.H.Y.S.A.G.A.H.H.D.H.S.S.S.S.S.S.G.S.A.G.A.H.A.h.A.h.Z.A.h.A.j.h.l.l.l.l.h.k.f.j.g.g.j.f.a.j.g.j.j.f.f.g.a.z.a.f.f.f.g.a.g.i.a.a.k.a.a.k.a.k.a.a.a.a.i.i.i.i.i.u.u.u.u.a.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.i.u.a.u.u.u.i.i.u.i.u.u.u.i.i.i.i.i.a.a.a.i.i.i.k.a.i.k.i.f.d.f.f.f.z.k.k.f.g.h.h.h.h.A.A.z.H.S.G.S.H.L.L.L.L.H.L.P.P.D.L.L.L.P.P.L.L.Y.P.T.L.U.T.T.T.T.P.^.U.T.T.T.T.T.T.T.T.T.~.~.~././.^.(.(.(.|./.|.|.|.|.|.|.}.}. X}.}.}._._._.|._.|._.`._._.].`.(.(.(.(.(.(.(.(.(.(.(.(.(.].(.`._._._.(._.].(.(.(._.(._.(._.{.(.(./.{.(.`.(.(.(.^.(.^.^.(.(.!.^.(.(.(./.(.(.!.^.(.(./././././.^./././.^./.(.(././././././.!.^.^./././././.(.(.(.(.{.(.(.(.(.(._.(.(.^.`.`.{._._.|.}.|.}. X|.|.|.|..X|..X|..X.X.X|..X X.X.X.X.X'.|.|.|.|.`.|._.|.(.|.`. X X'..X.X.X.X.X.XxXzX.X.X.XdXdXdX.X.X.X.X.X|.|.|.`.(.(./.~.~.T.T.T.T.T.T.I.T.~.L.L.L.L.L.H.H.H.S.H.H.L.G.H.H.H.L.U.H.H.G.H.L.H.H.L.L.H.D.Y.U.L.U.U.P.P.L.L.P.L.L.L.L.L.H.L.L.L.L.L.L.L.L.L.U.U.U.U.U.T.P.P.P.P.P.P.U.P.P.P.P.Y.F.P.Y.T.T.T.U.T.Y.~.T.T.P.T.T.~.T.T.T.[.T.~.~.~.[.T.[.[.T.~.~.~.[.~.~.~.T.^./././.~.(.(.~.(.~.^.(.^.^.`.`._._.|. X X X X X.XdX.XdX.XdXdXdXdXdXdXcXnXfXdXzXxXxXdXnXcXcXmXcXmXmXmXmXmXmXmXmXmXmXmXmXmXnXxXnXnXnXdXxXxXxXzXcXxXdXcXnXdXcXzXdXxXxXcXnXdXcXvXcXcXcXcXcXxXxXdXcXxXxXdXvXcXcXxXxXxXxXcXcXnXcXcXmXxXxXmXcXmXvXnXnXmXmXmXmXcXmXmXmXcXmXnXnXnXnXnXxXdXJXnXdXcXnXxXmXnXxXcXcXcXcXcXcXcXcXcXcXmXcXnXnXnXnXcXcXcXnXmXcXnXnXnXcXmXcXMXvXmXmXmXmXmXmXmXMXmXMXmXmXMXMXMXMXMXMXMXMXMXMXMXmXmXmXcXmXmXcXmXcXcXcXcXcXcXcXnXnXxXnXnXnXcXMXvXnXnXvXmXxXxXnXcXxXcXcXxXcXcXxXdXcXzXzX@XdX XdX.X.X.X.X.X.X.X|. X.X.X.X.X X X.XdX.XdX.X.X.X.X X'.|.|._._.{.|.(.(.(.(.^.{.(.(.^.(././.!.~./.!.~.~.T.~.T.~.~.T.T.T.T.T.T.T.U.T.U.P.Y.P.U.L.L.L.S.L.L.L.L.L.L.L.L.H.H.H.H.G.S.S.S.G.S.S.G.G.S.D.H.G.H.S.G.H.A.H.G.S.S.G.S.H.H.S.G.G.H.H.G.S.H.G.D.H.G.H.H.H.S.H.L.P.U.U.U.S.L.H.S.L.H.S.L.L.S.H.D.L.L.L.L.L.L.L.L.L.L.P.P.P.P.P.P.T.L.T.T.U.Y.T.T.T.~.T.~.~.~.~./.~.~.~./././././.(.(.(.(.^.|.`.{.|._.|.'.|. X.X.X.X.XxXxXdX.XzXzXdXdXdXxXxXxXnXcXnXnXnXnXnXMXnXmXnXcXcXnXxXcXxXxXxXxXcXcXcXcXxXxXxXzXxXxXxXzXzXzXdXdXdX'..X.X'.|.'. X|.|.|.|.|.}._.{._.(.(.(.(.(.",
+"Z Z Z D Z G Z D Z D D Z D Z D D D Z Z Z G Z Z Z Z Z Z Z F Z Z Z Z Z Z Z Z Z Z Z Z Z G Z H Z Z L H D L H H Z H H D H Z H D H H H H H H H H J H L H L L L H L H H L L L U L J L J L L L L L L H H J J Z L H H H L H H H Z H D L H Z Z J Z Z Z H H D Z Z D D D Z D P G L Z L Z D Z H Z H H H H Z H Z H D Z b.H.D.H.H.H.A.K.A.H.G.S.S.S.A.H.A.H.S.S.D.S.S.S.S.S.S.S.S.S.H.A.S.G.z.h.A.A.A.A.A.h.A.A.A.l.h.l.h.k.h.k.h.g.g.k.g.j.a.g.g.g.a.g.g.g.f.k.i.g.f.g.z.a.f.a.a.a.z.a.a.a.a.a.a.a.a.i.i.i.s.s.u.u.a.u.u.u.u.u.u.u.a.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.i.u.i.i.a.u.a.u.i.u.i.u.i.u.i.i.i.i.a.a.a.a.a.i.k.i.i.i.a.z.f.i.i.z.i.k.k.f.k.k.k.h.z.h.h.h.h.A.A.H.H.H.H.H.H.L.L.L.L.L.P.l.P.P.L.L.H.P.P.P.P.U.U.T.T.T.T.T.T.T.P.P.T.T.T.T.T.T.T.~.~.T.~.~./././.(./.(./.(.(.`.(.|.|._.}.}.|.}.}._._._._._.(.`.^.^.|.(.`.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.{.(.(.(.(._.(.(._._._.(.(.`.|.{.(.|.^.(.(.(.^.(.`.^.(._.(.(.(.(./.(./.^.^././././.!./.~.~.(./././././././.(./.!./././././.(././.(.(.(.(.(.(.(.`.(._.(._.(.`.(.(.|._._.|.}.}.}.|.|.|.|.'..X.X.X.X.X.X X.X.X.X.X.X.X@X|..X X|.|.|._._.|.|._.|.|. X X'. X@XdXzX.X.XxX.XzXdXdXdX@X.X.X.X.X.X.X.X|.`._.^.{.(.~.T.T.T.Y.T.U.I.Y.I.I.T.Z.L.F.L.H.H.H.H.S.H.H.G.L.H.H.H.L.L.D.L.L.H.S.L.L.H.L.P.D.H.D.L.L.Y.S.P.U.L.P.L.L.L.L.L.L.S.S.S.L.L.L.L.U.U.P.U.U.U.Y.T.T.P.T.P.P.P.L.P.P.P.U.P.P.P.P.U.T.U.T.Y.T.Y.T.Y.^.!.!.T.T.~.~.~.T.Y.~.Y.~.^.P.!.~.~.~.~.[.!.~.^.!.XX^./.(.(.(.~.(.(.(.(.(.}._.^.^.(.{.{.|.|.`. X X{.fXdXdXdXdXdXdXdXdXdXdXdXdXxXxXxXxXdXJXcXnXmXcXcXmXmXmXMXmXfXmXmXMXmXnXnXnXnXnXnXxXxXxXxXxXdXcXdXnXcXxXxXcXxXxXxXnXnXcXnXcXxXnXcXcXcXcXdXcXcXcXxXxXcXcXdXfXcXcXcXcXzXdXcXcXcXcXcXmXmXcXnXnXmXmXmXmXnXNXmXmXmXmXmXcXnXnXnXcXnXnXnXcXJXcXnXxXxXnXxXxXcXcXxXdXcXcXcXcXxXcXnXnXxXnXnXcXnXcXcXnXcXnXnXcXxXnXJXvXmXmXmXcXmXMXMXmXMXMXMXMXfXNXMXMXmXmXMXMXMXMXMXMXmXmXmXcXcXcXcXcXcXcXcXcXmXcXcXcXcXnXnXnXnXnXnXxXnXnXcXmXnXmXxXxXcXcXxXcXvXxXxXxXxXcXzXzXdXdXdXdXdX X.X.X.X.X|..X X@X.X.X.X X.X|..X.X.X.X.X.X X|.'.|.|._.|._.(.^.(.^.{._.(.(.(.(./.(.!./.!.~./.~.~.~.T.~.T.~.T.~.T.T.T.T.U.Y.T.U.P.P.P.P.L.L.L.L.S.L.L.L.S.S.S.S.H.D.G.G.S.S.S.S.S.S.S.S.D.A.H.D.H.A.S.H.G.G.H.G.H.S.S.G.H.S.S.S.S.D.D.G.S.H.S.S.S.G.H.H.H.H.H.S.L.L.S.H.L.L.L.H.S.S.H.S.H.H.H.U.L.S.S.H.L.L.L.U.L.L.L.L.L.L.P.P.L.Y.Y.P.U.T.T.~.~.T.~.T.T.R.~.!.[.~.~././././././.(.(.(.(.^.(.|._._.}.|..X X.X.XdX.X'..XdXdXzX.XdXdXnXcXxXxXnXnXnXnXnXnXxXxXxXxXcXnXnXxXxXnXxXnXxXcXcXcXcXcXcXxXxXxXxXxXzXzXzXzXdXdXdX'..X.X X.X.X X X|.|.|.|.|._.|._.(.(.).(./.",
+"Z Z Z Z Z Z D Z Z D Z D D Z D D Z G Z Z Z Z D D Z Z Z Z Z Z Z Z Z Z Z G Z Z G Z Z Z Z Z Z S L Z S Z H Z Z H H Z D D H D H H H H H H H H H L H L H H L Z H L H H J Z L H H H L D J Z J J Z L L H D H J J D H H L D H H H Z Z H Z L S Z H H S S Z D D D D D D D D Z Z Z Z L Z D U L S Z H Z H H H H H Z Y b.H.H.H.H.H.H.A.S.S.S.S.S.S.H.h.H.A.H.G.A.G.S.G.S.S.S.S.G.H.A.S.S.S.S.H.A.A.A.h.A.A.h.A.l.l.l.l.h.z.z.h.k.h.k.k.k.g.h.z.g.g.g.g.g.g.g.f.k.a.a.i.a.a.f.a.a.a.i.i.a.k.k.a.k.a.a.s.i.i.i.u.u.u.u.u.a.u.a.u.a.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.i.u.i.i.u.i.a.i.u.a.u.u.a.u.u.i.i.i.i.u.i.i.i.a.a.a.a.i.i.k.f.k.i.i.f.k.i.f.f.k.f.k.k.k.g.g.f.h.A.h.A.A.A.H.A.G.H.H.H.L.D.H.H.L.P.L.P.P.L.L.L.L.P.P.P.T.T.U.T.T.T.T.Y.Y.P.T.T.T.T.T.~.T.T.T.~.~.T./././.(./.(.(.(.(.^.(./.|.^.|.}. X}.}._. X_._._.|.(.|.|._._._.`.`.(.(.(.(.(.(.(.(.(.(.(.`.(.(.|.(.(.(.(.(.(.(.(.(.(.(.(.(.(._.`.(.|./.`.{.(._._.(.(.{.(.(.(.(._.(.(.(.(.(./.(././.!././././.!.^.[.~././.(.(./.(.(./.(././././.(././.(.(.(.(.(./.(.(.(.^._._._._._.`.(.`.|.|.|._.}. X|.|.'. X X|..X.X.X.X.X.X.X.X.X.X.X.X.X'..X.X|..X|.|.|._._._.|.|. X'..X@XdXdX.X.XxX.X.XzX.XxX.XdX XzX.XzXzX.X.X|.|.|.`.(.|./.~.T.T.T.Y.Y.U.U.T.I.I.H.T.L.b.H.S.U.H.H.U.S.L.H.G.H.H.H.H.L.S.H.L.L.H.S.S.H.S.A.U.U.U.L.L.L.L.L.L.L.P.P.L.L.L.H.L.L.L.K.L.L.L.L.L.T.P.P.Y.T.U.Y.P.T.P.T.P.U.P.P.P.P.L.P.P.Y.D.L.U.U.U.U.T.T.T.T.Y.P.Y.T.T.T.T.T.~.[.T.T.T.Y.Y.~.T.~.T.~.~.~.~.[.^.^.~.(.(.(.(.`.(.(._.^.`. X^.^.|.`.).|._._.|.'. X XdXdX.XdXdXdX%X%XcXdXcXdXdXxXvXxXxXcXvXcXnXmXmXmXcXmXmXmXnXmXmXmXnXNXmXnXnXnXxXmXvXxXxXxXxX@XzXfXcXcXcXxXdXxXxXnXxXcXcXnXdXvXxXxXxXdXvXfXcXvXdXdXxXvXcXfXdXxXvXdXxXvXcXcXfXnXxXcXcXxXMXcXnXNXmXmXmXmXmXnXnXnXnXnXnXnXnXcXcXcXcXcXdXxXxXnXnXmXnXxXnXxXcXxXJXcXxXcXcXxXnXxXxXnXxXnXxXcXcXnXcXnXnXnXnXJXxXzXhXhXMXmXmXMXMXMXmXMXMXMXMXMXMXSXMXMXNXfXDXMXMXMXMXmXMXdXmXmXcXcXcXdXmXdXcXdXcXdXcXxXcXnXxXxXnXnXnXnXvXcXcXnXxXmXvXxXJXxXcXvXxXxXcXxXdXzXzX.XzX.XdX.X.X.X.X.X.X.X.X X X.X X.X.X X.X.X.X.X.X|..X|..X|.|.|.|._.{.|.^.(.(.(.(.(.{.(.(.(././././.~.~.~.T.~.~.T.~.T.T.T.T.T.T.T.T.I.U.T.Y.P.P.P.L.U.Y.A.L.L.S.H.S.L.S.L.H.S.G.S.S.S.S.S.S.S.S.S.H.G.H.H.H.A.H.H.G.S.Z.G.D.D.H.A.H.S.G.S.S.S.G.A.H.S.S.S.G.D.H.G.H.H.H.H.P.D.U.H.L.S.H.L.S.H.H.H.H.H.H.D.H.L.L.L.S.L.L.S.L.L.L.L.P.L.P.P.U.P.P.T.T.T.T.T.T.T.~.~.~.(.(.T.~.~.~././././././.(./.(.|.|.(._.|.}.}.|.|.|.|..X.X.XzX.X.X.X.X.XdXcXdXnXxXvXxXnXnXnXcXcXnXnXnXnXcXMXdXnXnXxXnXxXcXcXcXcXcXcXxXcXxXxXxXzXzXdXcXzXdX@XzXzX.X.X.X X.X.X|.|._.|._._._.|._.(.(.(.(.^.",
+"Z Z Z Z Z D Z D D Z D Z D Z Z L Z D Z D Z D Z Z Z B Z Z Z Z V Z Z C Z C Z Z Z Z Z Z U Z Z L G Z H Z H Z J H Z H D D H H H H H H H H H Z H H L L H P H H L H J H J Z P H Z L J Z J J J L L L L H D L H H H H H L D H H H H H D D H H Z Z H Z Z Z D D D D D D D D H Z L S Z L L L Z L Z L H Z H D H Z P G g.l.H.H.H.H.h.H.H.H.Z.H.S.S.S.S.G.H.A.S.l.S.S.S.S.S.S.S.S.S.S.S.J.G.A.A.A.A.A.Z.A.A.h.h.h.A.l.l.h.h.h.f.k.h.z.k.k.g.k.h.g.g.k.g.g.f.f.f.f.f.a.f.a.a.a.a.a.a.a.i.i.k.i.k.a.a.a.a.i.i.u.i.u.u.i.u.a.u.a.u.a.u.u.u.u.t.u.u.u.u.i.u.i.i.i.u.i.i.i.u.u.i.i.i.x.u.s.u.i.t.a.u.i.a.i.i.i.a.i.a.i.a.a.g.a.k.a.a.f.i.i.z.f.i.k.f.f.f.k.k.k.g.h.h.h.h.A.A.A.S.A.H.H.H.H.L.L.H.H.L.P.S.L.P.L.L.U.L.P.Y.P.U.P.T.!.T.T.T.T.Y.U.T.T.P.T.T.T.T.T.~.T.~.~.~.~././.(./.(.(.(.(.(.(.(.`._.|._.|._.}.}._.}._.(._.(.^._._.[.(.^.(.(.(.(.(.(.(.(.(.(.(.(.(.`.(.(.(.(.(.(.(././.(.(.(.(.(.^.^.(.^.^.|.(.^.{.(.(._.(.(.(.(.(.(._.(.(.(././.(././././.!./.~././.~.(.~././././.(./.^./././.(./.(.(./.(.(.(.(.(.(.(.(.(.(._.(.`.`.|.`._._.|._.|._.|. X|. X.X X.X.X'..X'..X.X.X.X.X.XdX X.X.X.X.X.X.X X.X|.|.|.|.|.|. X|..X.X.X XdXdX.X.XzX.XzXdXzXzX'.zXdX.X.XzX.X.X.X|.|.`.(.(./.~.T.T.I.U.Y.L.U.U.L.U.H.K.m.m.[ L.A.D.H.L.H.H.L.L.H.L.L.L.L.L.L.S.L.S.L.U.U.L.S.S.H.U.H.L.L.L.L.U.L.L.U.L.L.S.L.L.L.L.U.L.L.L.L.L.U.U.P.P.U.U.T.Y.T.P.P.S.Y.P.].T.S.S.L.F.D.Y.Y.L.L.P.F.Y.L.K.U.Y.Y.].P.P.Y.P.F.T.T.T.T.P.oX!.Y.!.Y.^.].T.~.T.^.oXT.XX!.^.!.!.].[.^.(.(.^.oX'.]. X X X'.|.|. X'.fX XdXdXfX XdXdXdXfXcXdXhXdXdXfXdXdXfXfXcXnXMXcXfXfXcXfXfXfXMXBXmXfXMXMXfXfXnXcXcXfXfXfXcXmXmXnXfX XfXdXfXdXfXMXxXnXMXMXfXmXnXfXcXcXfXdXnXnXfXhXcXxXfXdXnXnXfXdXxXxXfXdXdXfXfXdXmXdXcXnXxXcXnXMXcXnXmXnXmXnXmXnXnXnXnXnXcXcXnXcXcXnXxXxXxXxXxXxXnXcXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXcXcXcXcXcXcXnXcXnXMXxXfXhXaXaXhXMXmXMXMXMXMXNXMXMXMXSXmXMXMXMXDXmXmXMXMXMXMXmXfXdXcXcXmXcXcXcXdXmXcXcXdXcXxXxXnXnXnXzXnXnXnXxXnXzXnXcXxXJXxXxXcXcXxXvXzXdXzXzXcXzXzXzX.X.XdX.X.X.X|..X.X.X X.X.X X.X|..X.X.X X'..X X X|.|.'.|.|.|.|.|.|.(.|.(.(.(.(.`.^.^.(././.!./.~.~.~.~.~.T.[.~.~.~.T.T.T.T.T.U.T.Y.U.U.U.L.L.L.L.D.L.S.H.L.L.S.H.H.H.H.H.H.A.A.D.D.S.S.D.G.A.G.G.H.A.S.G.S.S.S.S.S.S.S.S.S.S.G.S.S.S.A.H.S.G.S.S.H.S.H.H.H.H.H.H.D.G.A.D.U.L.H.L.H.H.H.H.S.H.H.H.H.L.Y.L.D.H.S.L.S.L.L.U.L.L.L.L.U.P.P.T.T.P.T.T.T.T.Y.~.~.~.^.~.~.!.~.~./.!./././.!.(.(.(.(.^.(.|.(._.|._.}.`.|. X X'.'.@X.XdXdXdXdXzXzXzXzXxXxXxXxXxXcXcXcXnXxXxXxXcXcXcXcXcXcXxXnXcXnXcXmXcXcXcXcX@XdXzXxXdXxXzXzXdXdXxX.X.X.X X.X.X|. X|.|.|._.|.|.|.|./.(.^.^.(.",
+"Z Z Z Z D D D Z Z Z Z D Z D Z Z Z Z G Z D D D G Z G D D Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z H Z Z H H L Z Z H H D D H H H F H H H H H H P H H D H H H P F H H Z J S P J L J L L Z Z H H H L L J L L L H H H H H H D H D H D D H Z H H Z H Z H D D D D Z D D D Z Z Z L L Z Z Z L Z H Z L Z D H L Z H G b.G.H.H.H.H.H.S.A.h.G.A.A.A.G.A.A.H.A.H.S.S.S.S.S.S.S.S.S.S.S.S.h.h.H.A.A.A.h.h.A.A.A.A.A.A.A.l.h.h.h.h.h.h.z.h.h.z.g.z.k.h.h.g.z.f.f.f.k.a.k.k.k.a.a.g.d.a.a.z.i.i.k.a.a.a.a.i.a.s.i.u.i.s.u.i.u.u.u.a.u.u.a.u.a.i.a.u.i.i.u.i.u.i.i.i.i.i.i.i.i.u.i.u.u.u.a.a.u.i.u.i.u.s.t.a.i.a.a.a.k.a.z.i.a.a.a.a.i.z.k.k.f.f.f.f.f.f.h.k.h.g.h.h.h.A.A.A.A.S.G.H.H.H.H.H.L.H.L.H.L.L.L.P.U.U.U.U.P.P.Y.T.T.T.P.P.T.T.T.T.T.T.T.U.T.T.T.T.T.~.T.(.~.~.~.[././.(.(.(.^.(._.{.(.`.(._._._.{.}._._._._._._._.|._.|.|.`._.|.(.(.(.(.(.].(.(.(.(.(.(.~._.(.(.(.(.(.(.(./.(./.(.(.(.(.`.`.(._.{.|._.`.|._.(._._._._._._.(.(.(.(.(././././././././././.~.~././././.(.(.^.(.(.(.(.[.(.(.^.(.(.(.(.(.(.(.^.(.(.`.`._.`.^.^._.|.|._.|.|.|..X|.'.'. X.X|..X.XzX'..X'..X'.zXzX.X@XdX'.'..XzX'..X.X.X|..X|.|.|.|.|..X.X.X.XdX.XdXdXdX.XzXdXzXzXdXzX.XdXzXzX.X.X.X.X|.|.`.`.(.(.~.Y.T.I.L.L.L.L.L.U.T.H.].aX' T L.A.U.D.H.L.L.L.L.L.L.H.P.S.S.P.P.L.P.L.U.S.L.L.L.L.S.U.H.S.L.L.L.L.L.L.L.L.P.P.U.Y.L.U.L.L.U.Y.Y.U.L.T.T.U.T.Y.P.P.P.].hXfXgXgXgXgXgXaXgXaXaXgXaXaXgXgXaXgXgXaXaXgXgXaXaXaXgXgXaXgXgXaXaXgXaXgXgXaXgXaXgXaXaXgXgXaXaXgXgXgXaXgXaXgXaXaXaXaXaXgXaXaXaXaXaXgXaXaXaXaXhXaXaXgXaXgXaXaXgXaXgXaXgXaXaXhXgXaXaXaXgXaXgXaXgXaXgXaXgXaXgXhXaXgXgXaXgXaXgXaXgXaXaXaXgXaXaXgXgXaXgXaXgXaXaXaXgXaXaXaXgXaXgXaXgXaXaXgXaXaXaXaXaXaXaXaXgXaXaXaXgXaXgXaXaXpXm.m.xXcXcXvXnXnXnXnXnXnXmXnXnXmXnXnXcXnXnXcXcXnXdXJXxXxXcXxXxXxXxXxXxXcXxXxXxXxXxXxXdX@XcXdXzXxXxXxXcXcXcXcXnXnXnXnXcXxXcXcXzXhXaXm.hXMXmXMXMXMXMXMXMXMXMXmXmXDXmXDXMXMXMXMXMXMXMXmXNXmXcXcXvXdXmXdX%XcXdXcXcXcXcXxXxXxXxXJXnXxXnXxXnXJXmXxXxXxXnXxXcXxXxXvXcXvXcXcXzXzXzX.X.XzX.X.X.X.X.X X.X|. X X|..X.X X|..X|..X|. X|.|.|.|.`.`.|._.{.^._.^.(.|.(.|.`.(.(.(.(././.^.~./.~.~.T.~.~.T.T.T.T.T.T.T.T.T.T.U.U.T.Y.U.Y.Y.L.L.L.L.K.H.H.H.H.H.H.H.H.H.H.S.H.G.G.G.S.D.G.H.D.H.G.D.G.S.S.S.G.S.S.S.S.S.A.S.S.S.S.S.S.A.H.G.H.H.S.H.H.D.H.P.H.A.L.L.D.P.L.S.L.H.G.H.S.H.S.H.H.H.H.H.S.S.H.U.L.L.L.L.L.D.L.L.L.U.U.L.P.P.P.T.T.T.T.T.~.Y.~.~./.^.~.~.~./.(./././.(./.(.(.(.(.(._.(.`._._.}.}.|.`.|.|.'. X.XdX.XdXdXdXzXzXzXzXzXxXxXnXxXxXcXcXxXxXxXxXnXdXxXxXcXcXnXxXcXnXcXcXcXcXcXcXxXnXxXzXdXzXzXzXdXdXdX'.dX@XdX X X.X.X X|.|.|._.^.{.`.(.(.(.{.).",
+"Z Z Z D D D Z G D D Z D Z D H Z Z Z Z Z Z D D Z G Z Z C D F Z Z Z C Z C Z C Z Z Z Z Z L Z H Z H H Z H Z Z L L Z D D D H H F H H F H H H H H H H Z U H H Z U H H Z J J H L L L L H L J J H L P H H P L L L D H H D H D H J Z D H H H H H S Z G Z Z D D D H D H D L L L Z Z Z Z S Z H Z H D H H Z G D L G Z.S.H.L.H.H.H.S.S.A.G.A.A.G.A.G.S.A.A.S.S.S.G.G.G.S.S.S.S.H.S.S.H.S.h.H.A.A.h.A.A.h.j.A.h.A.l.l.l.l.l.l.g.g.h.h.h.h.h.h.A.z.h.f.k.k.a.f.f.f.a.a.a.f.a.a.d.a.a.i.i.d.i.a.a.i.a.i.i.u.s.u.u.i.s.u.a.a.a.a.u.a.u.i.u.i.t.a.i.i.i.i.i.i.i.i.i.i.i.i.u.i.u.i.u.u.u.u.i.i.i.i.i.i.i.i.i.i.a.a.i.i.a.a.k.i.a.a.k.i.i.z.i.k.i.f.f.f.f.h.h.h.h.h.g.z.A.A.A.S.H.A.H.H.H.H.L.H.L.L.L.P.P.S.P.P.U.T.P.^.T.P.T.P.T.T.[.T.T.T.T.T.T.T.T.T.T.~.T.~.~.T.T././.~././.(./.(.(.|.{.|.^.^.|.[.|.|._.(._._.[.(.(._.^.`._.(._.`.{._._.(.(.(.(.(.(.!.).(.(.(.(.(.^.^.{././.(././.(.(.(.(.(.^.`.(.(._._.|._._.(._._._._._._.`.(.^.`.(.(.(./.(././././.~./.~.~.~.~././.(.(.(.[.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.`.^._._._.|.|.|.|.|.|..X.X X X.X.X.X.X.X.X.XzX.X'.zXxX.X'..XzX.XdX.XzX.X.X.X.X.X.X.X.X.X'.|..X.X.X.X.XdXdXdXdX.XxXdXdXzXzXzXzXzX@XdXzXzXzX.X.X|.`.|.^.^.(./.~.I.I.L.U.L.U.D.U.S.U.hXgXm.u ' L.L.H.L.L.L.L.H.L.L.L.L.P.P.P.L.P.L.L.L.L.L.L.L.H.L.L.H.L.L.L.L.L.L.L.S.L.L.Y.P.L.L.U.L.L.L.L.L.P.P.L.U.T.T.T.U.L.U.P.hXgXgXgXgXgXpXaXaXaXaXaXaXaXaXpXaXpXaXaXaXaXaXaXaXaXaXpXaXaXpXaXaXpXaXpXaXpXaXaXaXpXaXaXaXaXaXaXaXpXaXaXaXpXaXaXaXaXaXpXgXaXaXaXaXaXaXaXaXaXaXaXpXaXaXpXaXaXaXpXaXgXpXaXaXaXaXaXaXpXaXaXaXaXaXpXaXpXaXpXaXaXaXaXpXpXaXaXaXpXaXaXaXpXaXaXaXaXaXpXaXpXaXaXpXpXaXaXaXpXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXpXpXpXM.{ ! ` hXvXnXnXcXnXnXnXnXnXnXcXnXnXnXcXnXcXcXcXdXcXcXxXxXnXvXxXnXxXxXvXcXxXxXdXzXxXxXzXxXxXcXxXcXxXdXcXcXJXxXnXnXcXnXcXnXnXcXmXhXaXpX} m.mXMXmXNXMXMXMXMXMXfXNXMXMXMXMXMXMXSXmXMXNXmXmXmXcXcXcXcXdXmXcXcXcXcXdXcXxXxXxXxXxXvXnXnXvXcXnXcXcXcXnXxXxXvXcXcXxXxXxXxXxXzXzXzX.XzX.X.X.X.X.X X.X.X.X X.X|..X|..X|.|..X.X|.'.|.|.|.|.|.`.`.|._._.(.(.|.(.`.|.(.(.(.(.(.(./.^.~.(./.!.~.T.~.T.~.T.~.T.T.T.T.T.T.U.T.P.P.L.Y.U.L.L.S.L.Z.H.U.U.H.H.H.H.H.H.H.H.S.D.D.H.H.H.G.D.S.A.H.G.D.S.S.S.S.A.S.A.S.H.A.S.A.S.S.S.S.S.S.H.H.H.H.H.H.A.H.G.L.P.L.G.G.H.H.D.L.H.H.H.H.K.A.H.H.A.K.H.H.S.H.S.L.A.L.L.L.L.L.L.L.U.L.P.P.P.T.T.P.T.T.[.T.~.~.~./.~./.~.~.(.~.~.(././././.(./.(.(.(.(.(.|._._.|._._.|.|.|. X.X.X.XdXdXdXdX'.zXzXxXzXxXxXzXxXxXcXvXxXxXxXxXcXdXnXxXnXnXxXnXcXcXcXcXcXcXcXcXxXdXxXxXdXzXzXzXdXdX.XdX X.X.X.X.X.X X|.|.|._.|.(.^.|.(.(.(.(.(.",
+"Z Z Z D D D Z Z D Z H D D D Z Z L Z G L Z G D G Z Z Z D B Z Z C C Z C Z Z Z Z Z Z Z Z Z H Z Z Z H Z H D H Z H H D D H H H H H H H L Z J H H H H H H H H H H H H Z H Z L Z L L J Z L L J P H H P J H L L H H H H H H H D H H D D Z Z J Z L Z Z Z D D D D D D D D L Z H L L P H H H H H Z H Z H L Z L Z G F.J.D.L.H.H.A.S.S.H.A.A.G.A.A.A.A.z.G.S.S.S.D.S.G.G.S.S.G.H.H.H.H.H.J.h.A.A.W.A.A.h.A.A.A.h.l.l.l.h.h.z.G.h.h.l.l.g.g.g.z.h.h.h.k.k.k.f.f.a.a.z.a.a.g.a.a.d.i.i.k.i.i.i.i.a.i.i.i.i.i.i.i.u.u.u.a.u.s.u.a.a.i.i.u.i.i.i.i.i.u.a.i.i.a.d.i.i.i.i.i.u.i.u.a.a.u.a.i.i.i.i.i.i.i.i.a.a.a.a.k.i.i.a.k.a.z.f.i.i.k.a.k.f.k.f.f.f.h.k.k.k.g.h.g.A.A.A.A.A.A.S.H.H.H.H.L.H.L.H.H.L.L.P.P.P.U.P.T.T.T.T.T.T.T.P.P.T.T.T.T.T.T.T.T.T.T.T.~.T.~.~.~.R.~.~./././././.^.(.(.^.^.`.(.^.}._._._._._._.`.^.|.{._._._._.`.|.{.{.`.(.(.(.(./.(./.(.(.(.(.(.(.(./.(.(./.^././.(./.(.(.(.(.^.|.{._._.|.^.|._._._.(._._.`.(.`.(.(.{.(././././././.~.~.~.!.~.~./././.[.(.(.(.(./.|.[.{.^.`.(.`.(._._.(._.(.(.(.(.^.`.^.|._.|.`.|.|.|.'.|..X|..X.X'..X.X'. X@X.X@XzX.XzX.XzX.X.XdXdXdXzX.XzX.X.XdX.X.X.X.X.X.X.X.X.X XdXdX@X.XxXdXxXdXzXzXzXzXdXdXzXzX.X.XzX.X.X'.|.|.`.(./.(.T.T.U.L.L.S.L.U.U.K.'.gXpX' r P L.L.U.L.L.L.L.L.L.L.L.L.S.P.L.L.L.K.L.L.L.U.L.S.L.S.K.L.L.H.L.U.S.U.S.U.U.P.P.Y.P.P.U.U.U.U.K.U.L.L.T.T.U.U.U.T.Y.U.U.pXaXgXaXpXpXpXpXM.pXpX} M.pXpXpXpXpXpXM.pX} pXpXM.pXpXpXpXpXpXM.pXpXpXpXpXM.pXpXm.pXpXpXM.6XpXM.pXM.pXM.pXpXpXpXpXpXpXpX{ pXpXM.pXpXM.pXpXm.pXpXpXpX{ pXpXM.pXpXm.pX{ pXM.pXpXM.pXpXpXpXM.M.pXpXpXpXm.pXM.pXpXm.pXpXpXM.pXpXm.M.pXpXpXpXM.M.pXpXpXpXm.pXm.pXpXpXM.pXpXm.pXM.pXM.pXM.pXM.pXpXpXM.pXpXpXM.pXpXpXM.pXpXm.pX{ _ y ; c cXnXMXxXnXnXcXnXnXnXnXdXcXcXcXcXcXcXcXcXxXxXxXxXvXcXxXxXcXxXxXdXxXxXcXzXxXxXvXcXdXcXxXdXxXxXxXxXdXxXxXdXcXcXxXxXnXcXcXhXpXpXm.' m.vXMXMXMXMXZXmXMXSXmXMXMXSXMXMXMXMXMXMXmXMXmXfXcXcXcXdXdXdXcXdXdXcXvXdXxXxXnXxXxXnXnXxXnXnXnXcXcXmXnXxXxXfXxXcXxXxXxXxXzXcXnXdXzX.X.XzX.X.X.X@X|..X.X|..X.X X.X X|..X.X'.|.|.|._.|.|.|.|.`.`._.|.|._._.`.|.^.|.(.`.(.(.(./.^.[.E./.~./.~.~.~.~.T.T.T.T.T.T.U.T.T.I.Y.Y.T.L.L.Y.L.L.U.D.A.U.S.H.H.H.H.H.H.A.L.G.H.H.H.A.H.H.H.G.H.S.G.S.G.G.G.G.A.A.H.G.A.S.h.S.A.G.A.S.G.G.H.L.H.L.L.S.P.G.L.G.L.G.L.L.G.H.H.S.S.H.H.H.H.H.H.S.H.S.S.H.S.S.S.D.A.L.S.L.S.L.L.L.L.U.Y.P.T.P.T.T.T.T.T.T.~.~.~.~./.~.~.[.(./././././.(.(.(.(.(.(.(.(.^.|._._._._.|._.|.|. X.X.X.X.X.X.X'.@XzXzXzXzXzXxXvXcXzXzXxXxXxXxXzXdXnXnXcXxXnXnXxXmXcXmXcXcXcXcXdXxXxXdXcXnXzXzXzXzX@XdX'..X.X.XdX.X.X.X|..X|.|._.|.`.`.^.(.(.(.`.",
+"G Z D Z D Z Z Z Z J Z Z H Z Z S D D D F Z Z Z H D H Z D C Z C D A C Z Z A Z B D B D C D Z Z D G Z Z Z Z H S D Z H Z Z H H H Z H H H Z H H H H Z H H H H H H H J Z L Z H H H H H H U H L L H P J H J H H H H H Z H H F H H H D H Z Z L Z H Z Z Z H Z L Z H H Z L H L H Z L Z L L Z Z Z P Z L Z Z L Z D G Z.H.L.S.A.G.S.S.S.S.h.A.A.A.A.A.H.A.H.A.S.D.H.G.S.S.G.G.G.H.H.H.S.S.S.A.A.A.h.A.A.A.A.A.A.A.h.Z.Z.h.h.A.h.h.h.A.h.h.h.Z.j.h.l.h.z.z.f.k.k.k.a.f.a.a.a.a.a.a.a.a.a.a.i.i.i.a.i.i.i.i.i.i.i.i.i.u.a.i.u.a.i.i.u.i.a.a.a.i.i.i.k.i.u.a.a.a.u.a.a.u.a.u.a.u.i.u.a.a.i.a.a.a.u.i.a.a.a.a.u.a.a.a.a.k.a.a.z.a.k.k.d.i.d.k.f.f.d.f.z.g.h.h.h.l.A.A.h.S.A.A.H.G.S.G.L.H.K.H.L.H.L.L.I.I.U.L.Y.T.T.T.U.T.T.U.T.T.T.T.T.T.P.T.T.T.T.T.T.T.[.~.~.~.T.~.~.~.~.~.^./.(./.(.{.(.{.(._._._._.(.(.(.(.(.(.(.`.`._.|.^./.`.|.`.{.(.^.(.(.`.!.[.(.(.(.(.(.(.^./.(.(.(.(././.(./.).(.(.(.(._._._.^._.|._._.^._._._._._._._._.(.(.(.(./.(././.~.~.!.~.~.~.~./.~./.^./.(.(.(.(.(.(.(._._._._.(._._.|._.^.(.`.^.(.`.`.|._.|.|.'. X X X X.X.X.X'.@X'.'.dX.X.X'.dX.X.XzXzX.XzXzXxXzXzXdXzX.X.XzX@X.XdXdX.X.X'..X.XdX.XdX'.dXdXxXdXdXdXxXdXdXzXzXdXzXdXzXzX.X.X.X.X|. X{.^.(.(./.R.R.U.L.L.S.U.P.oX'.gXgXM.t % H L.L.L.L.L.L.L.L.U.L.U.K.L.L.L.U.P.P.P.P.P.U.L.L.L.D.L.L.U.L.L.L.L.L.L.L.Y.U.U.U.U.L.U.L.L.U.I.L.U.U.U.U.Y.T.U.P.P.Y.L.m.pXaXpXm._ { { { { { { { [ { { { { { { { { { [ { { { { { [ { { { { { { { { { { [ { { { { { [ { [ { { { { { { { { { { { { { { { { { { { { { { { { { { { [ { { { { { [ { { { { { { { { { { { [ { { [ { [ { { { [ { { [ { { { { { [ { { { { { { { { { { { { { { { { ' { [ { { { { { { { { { { { { { { { { { { { { { { ' { ' t = % - cXcXcXcXnXnXcXnXcXnXcXxXcXnXcXxXnXcXxXxXcXdXdXxXxXxXcXnXcXdXcXzXzXcXcXcXxXxXxXxXxXxXcXdXdXcXdXvXcXcXcXcXxXxXJXcXcXcXzXhXM.pXM.' u b.MXmXmXSXmXMXfXSXMXmXmXDXMXMXmXDXMXMXMXMXmXmXcXxXxXxXxXxXzXxXzXcXcXcXxXxXcXcXxXxXcXxXcXcXcXxXnXnXcXcXcXcXcXcXxXxXxXxX@XdXdXzXdXzX.XzX.X@XdX.X.X.X.X X.X|..X.X.X.X|.|..X X_.|. X|.{.|.|.|.|._.|._.}.}.}.}.{.}._.(.(.(.(.(.(./.(././././.~.Y./.U.~.T.T.T.T.T.T.I.T.U.U.Y.U.Y.L.U.S.L.S.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.G.G.G.H.S.S.S.G.S.S.H.S.S.S.S.S.S.S.h.S.S.S.S.S.S.S.L.S.D.U.U.S.L.S.L.F.D.U.L.K.S.S.L.S.S.G.H.H.G.H.G.H.H.h.H.H.S.H.H.G.G.L.H.G.D.L.L.L.I.U.L.Y.U.Y.T.Y.T.~.~.T.~.~.(.T./.~././.{././.(./.~.(.(./.(.~.^.~.(.(.`.^.)._.|._.`._.|. X.X X.X.X.XzX@X.XdXdXzXzXzXzXdXcXxXxXxXcXdXcXxXxXxXxXxXxXcXxXnXnXxXnXnXnXcXcXdXcXcXcXcXcXxXdXdXdXdXxXdXzX.XdX X X.X.X.X.X'._.|._.|.|.`.^.(.|.(.(.",
+"Z Z Z D Z Z H Z Z Z L J Z L H H D D D D Z H Z F Z A Z D Z Z F B C Z C Z C Z Z Z G C Z D D D Z D Z H Z H Z Z D H Z G H H Z L J Z H Z L L H H H H H H H Z Z H H Z L Z H H H H F J H H H L J L H J J H H H H H J H H H H H H H H Z H Z Z L Z H H Z Z Z S Z Z L L Z H Z H L P Z Z Z L P L Z Z L Z L L Z J U D.G.L.H.L.G.S.S.G.A.S.A.A.H.A.A.A.h.A.H.H.S.G.D.S.H.A.H.D.S.S.D.S.S.S.A.A.A.S.h.A.A.A.A.A.h.A.h.h.h.A.h.A.h.h.A.h.h.A.j.h.f.h.z.f.h.f.h.f.f.k.a.a.f.a.k.a.a.a.a.a.i.a.a.i.i.i.i.i.i.u.i.u.i.u.i.i.i.a.i.i.i.i.a.a.u.i.i.i.i.i.i.a.a.a.a.a.u.u.a.u.a.i.i.u.i.i.a.i.a.i.a.a.a.a.i.a.a.a.a.a.a.u.k.a.k.k.a.d.k.k.k.f.k.k.f.f.k.g.k.h.h.h.h.h.A.A.A.H.z.A.A.G.Z.A.H.L.L.H.L.L.L.L.L.T.L.P.T.T.T.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.[.T.T.~.T.~.Y.~.~.~.~.[././././.{.(.(.(.`.`.(._._.(.(.`.`.^.(.(.(._.|.|.|.`.`.^.`.{.`.^.(.(.(.[.^.!.(.[.^.(./.(.(././././././././.(.(.(.(.(._._._.|.|._._._._._.(._._._._._.(.(.(.(.!././././././.~.~.~./.~./././././.(./.^.(.(.^.^.(._._._.|.^.|.[._.`.(.(.^.(.{._._.|.}.|. X X.X X.X'.dX@XdX'.dXdX'..XzXdXdXdXzX.XzX.XzXdX.XzXzXzXdXzXzXzX.XzXdX'..XdX.X XdX'.dXdXdXdXdXdXdXxXdXcXxXdXzXdXdXdXzX.X.X.X.X.X|..X|.|.`.(.!.~.T.U.L.U.U.L.L.P.fXgXgXpX' % & S Y.L.Y.L.L.L.U.U.L.L.L.Y.L.U.U.U.P.P.P.P.L.P.P.L.L.L.L.L.S.L.S.L.L.L.L.L.U.L.Y.L.L.L.Y.K.U.L.L.L.L.U.L.U.U.U.L.P.L.Y.L.M.M.{ { / c S S u S ! u u n S u S S u S u u ~ n u S u u S c u S u u S u S ~ u n u u S S u n u c u S u u S u u ~ S u A ~ u S u u S u S S u u S u u ~ S u u u S S u n u S u Z u u S u S S u n u S u u n u u ^ u c S u u u u Q u n u u u S ~ u A u S ~ u S ^ u u ~ S u S n u ~ u S u S S S u ~ u ^ u u S S u S u S S S c u t : % $ $ cXmXcXcXnXnXnXxXnXnXnXnXxXxXxXxXxXcXdXxXcXcXcXxXdXxXcXdXcXzXzXzXdXzXdXzXzXxXzXzXdXxXxXxXvXcXdXcXdXcXdXnXcXxXdXcXnXxXnXQ.{ M.} _ y y m.mXMXmXMXNXmXmXMXSXMXMXMXMXmXMXMXmXMXMXmXnXnXxXdXxXzXzXxXzXcXzXdXdXxXxXxXcXxXcXxXnXcXcXcXnXnXxXcXcXcXcXdXJXvXxXxXxXdXcXcXdX.X.X'..X.XcX.X.X.X.X.X.X.X.X.X.X|. X|.|.|. X|.|.|.|._._.|._._.|.|._.}.}.}.}._._.|.(.(.(.(.(.(.^././././.~.~./.Y.~.R.~.T.T.T.T.U.T.L.U.T.P.P.U.Y.P.L.L.L.H.H.H.H.S.H.S.L.H.H.H.H.H.H.H.L.H.H.S.S.G.S.H.S.S.G.G.S.S.S.S.H.S.S.S.S.S.S.S.H.F.L.L.L.L.S.L.L.U.H.H.H.K.H.U.S.H.S.S.H.H.H.H.H.G.H.H.A.H.G.G.G.H.A.G.S.S.H.J.H.L.H.L.L.Y.L.U.Y.T.U.T.T.T.T.T.[.~.~.T.~.~.[././.(././.(.(.(./.(.(.{.{.(.(.(.^.`.(.|.^.|._._.|.|.|..X.X|..X.XdX.XdXdXzXzXzXcXcXcXxXxXxXdXdXcXxXvXxXxXxXxXcXnXcXcXnXnXxXcXcXcXnXcXdXcXdXzXdXdXcXdX.XdX.X.X.XdX X@X.X.X|. X'.|._.|.(.(.^.`.(.(.^.|.",
+"Z G D Z D D S Z S Z D Z H H Z H Z D D D H D D D Z Z Z D Z C Z A Z Z B C Z D C Z D C Z Z D Z D Z Z H H Z D D D D Z Z L H H Z Z H H H H H H H H H H H H H H H Z H Z G K L H H H H H H H H L J J J H H L J H H H H Z H F H H H Z H Z L S Z Z Z S H Z Z H H H Z Z L L Z L Z L Z Z Z Z Z Z Z L S S L Z Z H U Z.H.L.G.H.S.G.G.S.S.A.S.A.A.A.A.l.A.G.A.H.S.G.S.S.S.S.S.G.A.H.G.S.A.S.A.A.A.A.S.A.S.A.A.A.A.A.h.h.h.A.A.h.h.h.h.h.h.h.h.h.z.f.h.h.g.g.f.k.f.f.f.f.a.a.a.a.a.a.a.i.a.i.a.i.a.i.i.u.u.i.i.a.i.i.i.i.i.i.i.i.i.i.a.a.a.a.a.a.a.i.k.a.i.a.i.a.z.u.i.i.i.i.i.i.i.i.i.a.a.i.a.a.i.i.a.a.a.a.a.a.u.a.a.a.a.a.k.k.d.k.f.d.f.f.k.g.g.g.f.z.h.h.h.D.A.A.A.A.A.S.S.H.H.H.S.G.L.L.H.L.L.I.I.U.U.T.U.U.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.T.~.T.T.~.~.T.~.~./.~./.(.(.(./.|.`.(.`.(._.{._._.(.(.(.(._.(.(.|./.(.`.(.{.`.^.`.`.(.`.(.(.(.^.^.!.!.(.(./.(.!.(.(.!././././.(.(.(.(.(.(._._._._.^._.|._._._.`.(._._._._.(.(.(.(./././././.~.!.~.!.~.~.~./././.(./.(.(.(.(.(.`.`._.`._.`.|._._._._.`.^._.^.|.|._.|.|..X'..X.X.X X.X.X X.X.XdX@X'..X'.xX.X.XzXzXzXzXzX.XzXxXzXzXzXxXdX@XdX.X.XzXdXzX.X.XdXxX.XdX.XzX@XdXxXdXzXzXcXzXzXdXdXdXdX@XdX.X.X.X.X|.{.|._.^./.~.~.T.U.L.U.U.H.K.hXgXsXaXM.y $ o i P.U.Y.H.U.Y.P.U.Y.U.L.L.U.Y.U.U.P.P.U.U.L.L.P.L.P.P.L.L.L.U.P.P.L.L.L.U.L.L.L.U.U.Y.U.U.L.I.L.I.U.L.Y.K.U.L.U.P.T.K.U.{ { { ' u r r r ; : y : : ; : > : y : : r r : r y ; : > r r ; r r > r : r : ; q ; : : e r q * y y : r > : y ; ; r : ; y : ; r > y : : : r y e : > ; e t : r r e r y ; ; > y ; y > r r y r y ; ; > ; ; > y ; ; r r > e e y : y > = y : : r : r y : : r 0 0 ; y r ; e y : : ; : : y r : : ; : r ; : y : : r * : y ; > ; y * : $ $   dXmXcXcXxXnXnXcXnXxXcXcXcXxXxXxXxXxXxXxXxXzXcXxXcXxX@XdXzXdXdXzXcXdXzXcXxXzXxXxXcXcX@XdXcXcXdXcXdXmXcXdXcXdXxXcXnXxXmXm.{ { { ` n y A m.mXMXfXmXNXmXMXMXMXMXSXmXmXMXMXNXMXNXmXmXcXnXxXxXxXzXxXzXzXzXdXcX@XcXxXxXxXcXxXxXcXcXcXcXcXcXcXcXcXnXcXxXxXxXcXcXdXdXxXcX.XzXzX.X.X'..X.XdX.X.X.X.X.X|..X.X.X'. X|..X|.|.|.|.|.|.|.|.{.|.|._._._. X^._.}._.^.(.(.^.^.^.^./././.T././.~.T.R.R.~.T.~.T.T.T.U.T.I.T.T.U.U.L.L.U.L.S.S.H.H.S.U.H.H.U.H.G.H.H.H.A.H.H.G.H.G.G.H.H.G.S.H.S.G.A.G.S.S.G.S.A.H.H.S.H.H.S.H.S.L.L.L.S.S.L.L.S.L.S.S.L.Z.U.S.H.H.H.L.S.H.A.S.H.H.G.H.S.H.H.S.L.H.H.H.H.H.S.U.H.L.L.L.L.P.U.T.T.T.~.T.T.~.T.~.~.~././././././.(.(.{.(././.(.^.(./.(.(.`.(.`.`.`.|.`.|._.|.'.|..X.X.X.X.XdX'.dXdX.XzXdXcXxXxX@XdXxXxXcXzXxXzXxX@XxXxXxXcXmXmXnXxXcXcXcXdXcXdXvXzXzXzXdXxX@XdXdXxXdX.X.X.X.X|..X|. X|.|.|.|._.`.(.(.(.(.(.`.^.",
+"Z Z D D D D U Z L Z Z L Z H Z D D D D Z Z D D Z Z F Z Z Z Z C Z A C D Z C B Z Z Z Z Z Z Z D Z G Z Z Z H D D D D Z L Z S H L Z H H H Z H Z H Z H H H H H H Z H H L Z H Z D H H H H Z J H L H J J J H J H H H H H H H H H D Z H Z L L Z H H Z H H Z S Z H H Z L Z L Z H H P Z Z L Z S L L Z Z H H H Z H Y Z.G.H.H.H.S.H.D.S.S.H.S.G.H.H.A.A.H.A.H.G.S.S.S.S.S.S.S.D.S.S.S.S.S.S.A.A.A.S.A.S.A.A.A.A.A.A.h.A.A.h.A.G.A.A.A.A.A.A.A.A.h.h.h.g.g.g.g.k.k.f.f.f.f.a.a.k.a.k.a.a.a.a.i.i.i.i.i.i.i.u.i.t.i.i.u.i.a.i.a.i.i.a.a.a.a.a.t.a.i.i.i.a.a.i.a.a.u.i.a.a.i.i.u.i.i.a.a.a.a.a.a.a.a.a.a.u.a.a.a.i.a.a.a.k.a.k.a.k.k.i.d.f.f.f.k.d.g.g.g.h.h.l.h.l.z.h.D.A.G.S.H.H.H.H.H.L.H.L.L.U.L.L.U.U.L.K.T.U.T.T.U.T.T.T.T.T.T.T.[.T.T.T.T.T.T.T.T.T.T.~.T.~.!.~.~./././.!././.^.(.^.`.`.^._._._.|.(.`.(.^.(.(.(.^.|.`.(.|.|.`.`.|.`.(.(.(.^.(.^.(.`.^.[.(.(.(.(././.(././././.!./.(.(.].(.[.|.(._._._._._._.(.`.`._.(._.(.(.(.(.!./././.!./.~.~.~.~.~.~.!.E./.!./.[.(.(.(.{.(.^.`.(.(._._._._.{.|.^.|._.|._._.|._.|.|. X.X.X.X.X@X.XdX'.dXdXdX.XzXzX.XzX@XzX.XzXzXzXcXdXzXzXzXzXzXdXdXdX.XzX.XdX.X.XzXzX@X.X.XzX.X XzXzXdXxXdXzXdXzXzXzXzX.X.XfX.X.X.X X|.|.|.(.{././.~.T.T.U.U.U.H.U.].gXgXaXpX/ ; $ o S Y.T.P.Y.P.U.U.U.U.Y.Y.U.U.Y.L.Y.U.U.Y.U.P.P.L.P.L.P.L.L.D.P.P.P.Y.U.Y.L.L.Y.L.U.L.L.L.L.L.L.L.L.L.L.U.L.U.L.U.L.L.U.U.{ ' ' Q y r r ; r : : : 0 y q t = r r r r = r r r q y r r ; r r r : : : r : = y ; y * : r ; > = r y r : : r r r ; y e ; : r r r r y r r : y = : r : > y e ; r ; r ; y q ; ; r r r ; r ; ; ; y q ; y ; y ; r r r r ; : y ; : r r r r r : r y : : : r r : : y r r r ; : r y r e r r r r r r r r = y : y r r y r : ; 0 : r 0 % $ $ $ mXdXcXcXnXxXnXnXxXnXnXnXcXxXxXxXxXvXcXzXxXxXzXzXzXdXcXdXdXcXdXxXxXcXzXcXcXvXzXcXcXdXxXxXdXcXvXcXcXcXcXnXcXcXxXcXnXdXmXm.[ { { ` f y > > Q.fXSXmXMXMXmXmXfXSXMXMXMXMXMXMXMXMXMXnXnXnXcXxXxXzXzXxXzXzXxXdXdXdXdXnXxXxXxXxXcXcXdXcXcXxXxXxXcXnXdXxXxXxXxXvXxXdXdXzXzXzXzXzX.X.XzX.X.X.X'.dX.X.X.X.X.X X.X.X.X|..X X|.|.|.|.|.|._.|._._.|.|._.}.}.}._.(.`.(.(.(././././././.!.T.(.~.~.~.T.~.T.T.T.T.T.T.U.U.T.U.U.U.U.L.U.L.U.S.H.L.S.H.H.H.L.L.H.L.S.H.H.H.G.H.H.H.H.S.H.S.A.H.G.H.S.H.S.D.S.H.H.A.H.H.H.H.S.L.L.S.L.L.S.K.H.L.S.F.S.L.H.H.U.H.H.H.H.A.H.K.H.H.H.H.H.H.H.H.S.H.S.H.H.H.H.K.H.L.L.L.U.U.T.T.T.T.T.T.~.~.T.~.~./.~.~.~./.[.^.(./.^././.).(./.^.^.(.).(.(.(.^.^.`.^.(._.|.|.'..X.X|..X.X.X.XdXdXdX.XcXdXdXdX@XxXxXxXxXcXxXxXxXxXdXxXxXcXcXcXcXnXnXcXcXxXcXcXdXzXzXdXxXdXdXzX.XdX X@X.XzX.X.X.X|..X X|.|._._.|.`.`.`.(./.(.(.(.",
+"Z D G H Z Z Z H Z H Z Z H Z H Z F Z D H D D Z D Z D Z Z Z F Z C A Z D B Z Z Z C Z C H Z Z Z Z D Z D Z Z Z D D D Z Z J Z Z H H D J Z L H C H H H Z H H H Z L Z H H F H H L L H H H H H P J H J J J K J H H L H J H Z H H H Z J Z Z L Z L H S H Z L L P L Z L L L Z S L Z Z L P L P Z Z L Z Z Z ( Z D Z Y A.H.L.S.H.H.H.Z.H.H.A.S.H.A.A.A.H.A.H.H.G.S.S.S.G.S.S.S.S.G.S.S.S.A.S.S.A.H.A.A.G.A.A.A.A.A.A.Z.A.A.h.A.A.A.h.A.A.A.h.A.D.z.h.k.h.l.z.g.h.k.k.f.f.f.j.f.k.a.a.a.a.a.s.i.a.i.i.i.i.i.u.u.u.i.i.i.i.i.i.i.i.a.a.a.a.a.a.a.a.a.a.a.a.a.a.i.a.a.a.a.i.a.i.i.i.i.a.a.a.f.a.a.a.a.a.a.i.a.u.a.i.i.u.a.a.a.k.i.f.f.f.f.f.f.f.g.g.g.k.h.h.h.h.g.h.A.h.A.H.A.G.H.H.H.H.H.S.L.L.L.L.U.U.L.U.L.U.Y.P.P.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T./.~./././.(./.(.(.(.(.`.^.|._.|._._.{.^.^.(._.(.(.|.^.(._._._.(._.(.(.`.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(././.(.!.(.~.~.(.(.(.(._._.|._.|.(._._.(.(.|.^.(._.(.(.^./.(./.!./.~.~./.~.~.~.~.~.!.^.^./.(.(./.(.(.(.(.^.`.|.(.`.|._._._._._.|.|.{.|.|.|.|.|. X'..XdX@X'.'.zXzX.XzXzXzX.X.XdXdXdXdXzX.XzXzXzXzXzXzXdXxXdXcXcXxXdXdXdXdXdXzXdXdXdXdXzXzX@XdXdXdXxXdXdXdXdXcXzXzXdXdXdXdX'..X.X.X|.|._.|.(.(.(.[.~.T.Y.P.P.P.Y.].gXgXaXpX' y $ $ $ i T.P.T.T.U.U.U.T.U.U.U.T.Y.T.T.T.T.U.T.U.P.L.P.P.P.U.P.P.P.P.P.P.Y.P.P.U.L.P.P.L.L.P.L.L.L.L.L.U.L.U.K.U.L.U.L.K.L.L.].' ' ' c u r r * r r 0 r r = : * y * * r : r * y * ; : : 0 r r r ; r r r r y ; r r 0 r r r : r r * = r r r 0 r r r r r * r r r r r r * r r ; r 0 r : r r 0 r 0 : r r : 0 : r 0 r r r r r r 0 r * : : * y r 0 r r r r r r r r r r r : r r : 0 : r ; r r r 0 r r = r r r ; 0 r * r r r r r 0 r r r 0 r r r r * r : y r r : : % $ o   nXcXvXmXnXnXxXxXnXxXxXdXxXxXxXnXxXxXdXcXxXxXdXdXdXcXcXxXxXdXdXcXxXdXzXdXdXzXJX.XnXxXdXcX%XnXdXcXcXdX%XdXdXxX@XdXxXvXxXQ.' ' ' c u y c > y m.MXMXfXnXmXSXNXmXmXMXMXMXMXMXMXMXMXNXMXcXxXxXxXzXzXzXdXzXzXdXxXzXzXzXxXxXxXxXcXxXvXcXnXdXcXzXcXdXxXnXxXdXcXdXzXzXxX.XzX.XzX'.dX.X.X.X.X.X.X.X@XdX.X.X.X.X.X X.X|.|. X.X|.|.|.|.|.|.|.|._.[.|.|._.}.}.[.(.(._.(.{./.(././././.~./.~.~.~.T.T.~.T.T.T.T.T.T.Y.T.T.T.T.L.L.L.L.L.L.F.A.D.S.S.S.L.H.L.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.G.H.H.H.H.H.S.G.L.H.H.H.H.H.H.U.S.S.L.F.L.H.L.H.K.S.L.L.S.S.L.S.L.L.H.H.G.H.S.H.H.H.H.H.H.H.H.H.S.L.H.S.S.L.S.L.L.L.L.L.L.T.U.~.T.T.~.T.T.~.~./.T.(././././.(.(./.(./.(.(./.(.(./.(.(.(.(.(.(.(.|.(.`.|.|.|.|.|..X.X.X|..X X.XdXdXzXzXdXdXcXxXxXxXxXvXxXxXxXzXxXnXxXxXxXcXcXcXxXxXnXxXcXzXzXdXcXzXzXzXzX.X.XzXdX.X@XdX X.X.X'. X|.|.|._.|._._._._._.{.(.(.(.(.",
+"D D Z Z H Z Z H H H S J Z Z S Z D D H D Z Z D Z D Z Z Z D B Z D Z C Z Z Z F C Z Z Z D Z Z Z D Z Z Z Z L D Z D Z L Z Z H L Z Z H Z H H Z H H H H Z H L Z H Z H H Z Z H F L Z F J H H H H H J Z J J H L L H J H H H H H H H Z J F H H H Z Z Z H J Z Z Z Z Z H Z L G ( L Z L Z Z Z Z Z Z L Z L Z Z D F H T F.S.D.D.H.S.H.S.S.G.S.H.H.H.H.A.A.H.H.A.S.S.S.S.A.h.S.S.A.D.S.S.l.S.S.A.h.Z.A.A.g.A.A.H.A.A.A.A.A.h.A.h.j.A.A.A.A.h.Z.A.g.A.A.h.h.z.g.z.l.k.h.a.k.k.a.f.k.k.z.a.a.i.i.a.i.i.i.a.i.u.a.u.i.i.u.i.i.i.i.i.i.a.i.a.a.a.a.a.a.a.a.a.a.a.a.i.a.a.a.a.a.a.a.a.a.a.a.a.a.a.f.f.a.a.i.a.i.a.a.i.i.a.a.a.a.a.i.z.d.f.f.f.f.f.f.f.g.g.h.k.k.h.h.h.h.h.A.A.A.G.G.H.H.H.Y.H.U.L.L.U.L.L.L.U.U.U.R.L.P.P.U.T.U.P.T.T.T.T.T.T.T.T.T.T.[.T.T.T.T.T.T.~.~.~./././.!./././.(.(.{.(.^.`.`.|.^._._._._.`.^.|.(.{.`.(.`.|.|._.`.|.|.`.^.(.(.(._.[._.(.(.(.(.`.(.(.(.(.(.(.(.(.~.(.(.(.(.(.(._._._._._._._.`.(._._.|.|.(.(.(.).(.(./././.!.~.~./.~./.~./.~.^./.^./././.(.(.[._.(.(.{.(.|.`.(._._._.|.|.{.|.|.|.|.|.|.|. X.X.X X'.cXzXdX'.zX.X XdXzXzXdXdXdX@XzXzXzXzXzXzXzXzXdXcXdXdXdXdXdXxXdXxXdXzXdXdXdXdX@XzXzXzXdXdXdXdXdXdXcXcXzXzXzXzXdXdXdX.X|.'.|._.|.(.(.(.^.T.~.T.P.P.P.Y.hXgXgXaXpX{ i y $ $ o u T.T.T.T.U.T.U.T.T.T.T.T.T.T.T.T.T.T.U.T.P.P.P.P.P.L.P.P.P.Y.U.U.U.U.P.L.L.U.L.P.P.L.U.L.L.U.L.L.H.K.L.L.L.L.L.L.L.I.T.' ' n ! > r r r r r r r r : y y : r y r e r y : t : r r r r r r r r r r r : : y r r r r r y r r r e : r r r r r r r r y r r r r r r r r r r r r r y r r r r r r r r r = y r r r r r r 0 y r : y r : r r r r r r r r r r r r r r : r r * y r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r = y r r y : : % % $ o   dXvXvXdXnXxXxXnXdXcXxXxXxXdXxXxXcXcXzXzX@XdXdXxXzXzXdXdXdXxXzXzXcXdXzXzXcXxXdXdXdXxXcXcXdXmXcXcXdXcXdXmXnXxXfXdXxXzXxXm.{ ' ' S u u > c y y m.mXNXmXmXmXmXmXMXMXMXMXSXMXMXMXmXmXnXnXxXxXxXzXzXzXdXdXdXxXzXzXzXzX@XdXxXxXcXzXdXcXcXvXcXcXcXnXxXcXdXnXnXdXzXzXzXxXzXzX.XxXdXdX.X.XzX.X.XzX.X X.X.X.X.X X.X.X.X.X.X.X X@X|.|.|.|.|.|._.|.|.|._._._.|.(._.(./.(.(./././././.~./.~.~.!.~.~.Y.T.~.T.T.T.T.T.Y.L.Y.U.Y.Y.L.L.U.L.L.U.L.L.L.L.H.S.L.L.H.H.H.H.H.H.H.H.S.H.H.H.H.H.H.H.H.H.H.G.S.H.A.H.H.H.H.H.S.Z.K.H.U.L.S.L.H.U.D.U.S.L.L.L.D.S.L.S.F.H.S.G.G.H.H.H.H.H.H.H.H.H.L.H.H.L.L.S.L.L.L.L.U.L.U.U.U.Y.T.T.T.~.~.T.~.T././.~./.!./.(./.(./.{.(.(.(.(.(.(.(.(.(.(.(.(.(._.`.`.|.|.|..X.X X.X.X.X.XdX@X XdX@XdXnXnXdXxXcXxXcXvXxXzXxXxXxXdXxXxXxXcXcXcXxXnXxXxXzXcXdXmXdXzXzXdXxX.X'.zX'.zX.X X X X|.|.|.|.|.|.|._.|._._.^.|.^.(.(.(.(.",
+"D Z D G D D Z Z Z H Z Z Z H H H D D D Z D C D Z Z D Z Z Z Z Z B C Z Z C Z Z Z Z Z Z Z G D Z D D Z Z D Z Z D Z Z Z Z Z H Z H H Z Z H Z H H Z H Z J Z H H H Z H H Z L H H J H H H H P H P H J J J J H H L H H H H H H L H Z L J Z H Z Z H L Z H Z Z Z S Z L Z ( G L L Z ( Z L Z Z Z Z Z Z Z Z L Z D D F [ S.H.L.D.H.H.H.S.H.H.S.S.A.H.G.K.G.S.A.H.S.S.S.S.S.S.S.S.S.S.S.S.H.S.S.S.H.S.A.S.S.G.H.A.A.A.A.A.A.h.A.A.A.A.h.A.A.A.Z.A.A.h.A.h.h.h.g.z.h.l.k.g.g.g.g.f.k.a.a.a.a.a.a.i.i.i.u.a.u.a.u.u.i.i.i.i.i.i.i.a.a.a.i.a.a.a.z.a.a.z.i.a.a.a.i.a.u.i.a.a.a.a.a.a.a.a.a.k.a.f.a.a.a.a.a.a.i.i.a.a.i.i.a.a.a.i.d.z.f.f.f.f.f.g.g.g.g.g.k.h.h.h.h.h.l.A.z.S.A.S.S.H.H.H.S.L.S.S.U.L.U.I.L.I.L.L.Y.U.P.Y.T.U.T.T.T.T.T.T.T.(.T.T.T.T.P.T.T.T.T.T.~.~.T.~././././././.(.^.(.(.(._.(.`._._._._._.}.^.`.^.`.{.|.`._.|._.{._.`.(.`.(.(.(.[._.[.(.(.(.(.(.^.^.(.(.(.^././.(.(.(.(.(.(.(.(._.(.^._._.|.`.(._.(.(.^.^.(.(.(.{.{./././././.~./.~.~.~.~.(.~.~./.(.[.^.(./.(.(._.(.(.|.|._._.|._._.[.}.|._.|._.|.|.|.'..X.X.X.X.XdX.X.XdXdXzXzXzXzXxXdXdXxXdXzXzXzXzXzXzXzXzXcXzXdXcXzXdXcXdXxXxXdXcXdXdXdXdX@XdXdXdXdXdXdXnXcXmXdXdXmXzXzXzXzXdX.X.X.X.X|.`.`.(._._.(././.!.I.T.P.R.hXgXgXaXpX{ / y % % $ o Z T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.P.P.L.P.Y.P.Y.P.P.Y.Y.T.U.U.U.P.L.U.L.L.L.L.J.L.L.L.Y.L.U.L.L.L.U.L.L.L.L.L.L.' ' ' ! t r r r 0 * y r r : t 0 : : 0 0 = 0 0 * * 0 y : > 0 r r 0 r r * r * r r r r r r r : r r r r r r r r r ; y : ; e r r = t r : = r r r ; q r e r : : r r : : r > : : > ; q 0 0 r * ; r : r 0 r r r r r r r r r r r r * * t y r * * : : 0 > q y r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r e r r 0 : ; ; $ % o   cXcXcXcXxXxXxXxXzXcXxXcXxXcXxXdXnXdXdXdX.XxXzXzXzXzXdXdXdXzXzXvXnXdXcXdXzXzXxXxXxXxXdXxXcXcXdXdXmXcXmXdXzXdXcXxXxXxXmXm.' ] ! u t y y u y y y F.fXnXmXmXmXmXMXMXmXMXSXMXMXMXmXMXnXnXcXdXJXzXzXzXdXxXdXdXzXdX.XxXzXdXdXxXzXcXzXcXcXcXcXvXnXdXnXnXnXxXdXdXzXzXxX.XzXzXxX.X.XdX.X.X.X@X.X.X.X'.@X.XdX.X.X.X.X X.X.X.X X X'.|.|.|.|.|.|.}._.|.}.{._.}.(.(.(.(././.(.!.(././././.^.~.~.!.~.~.~.T.~.T.T.T.T.~.Y.T.U.Y.Y.L.L.L.L.S.S.L.L.L.U.L.L.H.L.L.H.S.H.H.H.H.G.G.H.H.H.S.H.H.H.H.H.H.S.H.H.H.H.H.H.S.H.U.L.F.U.S.D.U.H.L.Z.L.S.D.S.L.H.G.L.L.L.L.L.H.S.H.H.S.H.G.S.H.H.H.L.S.L.S.H.L.L.L.L.L.U.L.U.P.U.T.Y.T.T.~.~.T.~.^././././././.(./.(.^./.(./.^.^.(./.(.(.(.(.(.(.`.(.|._.|._.|.|.|.|..X.X|..X.X.X.XdXdXxXdXxXdXcXxXxXxXxXxXxXzX@XxXxXdXxXxXxXcXxXxXcXzXxXcXnXdXdXnXzXzXdX.X.XzX.XdX.XdX.X.X X|.|.|.`.|.|._.|.`.|.(.`.^.`.^.`.(.(.(.",
+"Z D Z Z D D Z H Z Z Z H Z H Z Z Z D D H Z F D Z D A Z Z Z C Z Z Z C A Z C D B Z Z Z Z Z Z Z Z B Z D Z D D Z Z H H S Z H J Z H H Z H L Z H H Z H Z L H Z Z H H Z D D Z H F H H H H H H H H H H H J H H L H J H U H H P Z L Z H H Z H L Z H H H H L Z Z L Z S Z Z Z Z Z Z Z Z L Z L S L S Z P Z Z H Z L T A.H.D.L.H.H.H.H.H.H.H.H.A.H.G.Z.H.H.A.A.S.S.A.S.S.A.S.D.S.S.S.S.G.S.S.S.G.H.S.S.S.A.Z.G.A.A.A.h.A.A.h.A.A.A.h.h.A.h.h.h.h.A.h.D.h.h.h.h.h.k.h.g.g.g.f.g.z.k.z.a.a.d.s.i.i.a.a.a.u.a.u.a.a.t.i.i.i.i.i.i.i.a.a.a.a.a.a.a.a.a.a.a.a.a.a.i.a.a.a.a.a.u.z.a.a.a.a.a.a.a.a.a.a.s.i.i.i.a.i.a.i.a.a.i.z.a.z.d.f.f.f.f.f.f.g.g.g.k.h.h.h.g.h.h.l.l.A.S.A.S.A.H.H.H.D.J.K.Y.U.P.K.L.I.L.Y.U.Y.U.Y.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.T.T.~.T./.~./././.(.(.(.(.^._.`.(._._.|._._._.|.`.|.{.^.|.|._._.{.^.|.`.(.^.|.^.|.(.(._.(.(.(.(.(.(.(.(.(.(.(.(.(.(./.~.(.(.(.(.(._.(._.|._._.`.{.(._.|.^.(.(.(.(.(.^./././././.R.~.~.~.(.~.~.^.^././.~./.(.(.(.^.(._.(.|._._._.|.|._._.}.}.|.|._.|.|. X X'..X@X'.dXdXdXdXdX@XdXzXzXzXdXcXzXdXxXdXzXzXzXzXxXvXxXzXdXnXzXzXcXzXzXdXdXdXcXdXcXdXdXnXzXdXxXzXnXdXdXxXdXmXdXmXdXzXzXdX@X.X.X|.|.|._.|.{.`.^./.~.T.T.T.L.!.hXgXgXaXM.{ Q u : ; $ $ o S T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.Y.Y.U.U.P.P.Y.U.Y.P.Y.T.U.Y.U.P.L.L.L.L.L.L.L.K.Y.L.L.L.Y.L.U.L.L.K.L.L.L.L.F.' { ' Q u ; r r r r * ; r * * y ; q > * y : e : e r r r r r * r r r r e r y : r r r r r r r r r r r r r r r r r = ; y * r t = r r r y r r ; y 0 > : = y : r 0 * q y r : y q r ; ; e > r r r r r r r r r r r r r r r r r r t > : * : y : y e e ; ; ; y ; ; ; ; 0 r ; 0 r r r r r r r r r r r r r r r r : r r = r r = > ; = % $ o   cXcXcXcXxXxXvXxXzXvXzXcXdXzXzXzXdXxXdXdXdXdXdXcXzXzXzXzXzXdXzXzXdXxXdXdXzXzXzXzXxXxXxXxXdXcXdXcXdX XcXcXcXxXxXdXcXcXvXm.' ] ) f u > t u u u u > Q.mXMXmXmXmXMXMXMXmXnXmXMXMXmXmXMXcXxXcX.XzXzXzXdXdXzXzXdXzXdXxXdXcXzXdXzXcXcXzXcXvXdXvXcXcXnXdXcXxXdXxXzXzX.XzXzXzX.XxXxX.XzXzX.XzXzX.X'.dXdX.X.XdX.X.X.X.X.X.X.X'. X|.|.|.|.|.|._.}._._.|._.|._.^.(.(./.^.(./.(.^.~.(./././.~.^.~.~.~.T.~.T.T.T.T.T.T.Y.Y.U.Y.U.U.L.U.L.L.L.L.U.S.D.L.L.L.L.H.L.H.L.H.H.H.L.U.H.H.S.U.H.L.S.H.H.G.L.U.H.H.U.A.H.U.U.S.H.H.S.L.U.Z.L.H.D.L.U.Z.S.L.P.P.L.L.S.L.L.H.Y.H.H.H.H.H.H.H.L.H.S.S.S.L.S.L.L.S.L.L.U.U.U.L.Y.U.~.~.~.T.~.~.~./.!.(././.!.(./.(./.(.(./.).^.^.(.(./.(.(.(.(.(.(.(.(.(._._.|.|..X.X|..X.X.X.X.X.X'.dX.XdXcXdXxXxXxXxXxXxXzXxXxXxXdX@XxXxXcXxXxXxXcXvXcXcXdXnXdXdXzXcX.XzX.XdXdXzX'..X.X'.'. X|.|._.{.|.|.(.|.(.`._.|.`.^.(.(.(.(.",
+"Z Z D Z G Z D Z H Z D D D D D D D D Z D D Z Z D Z D Z Z Z Z Z Z Z Z Z F Z Z C Z Z B D Z Z D Z G Z Z D D D Z D D H Z D D D Z D D L H Z D H Z L L H Z Z H Z J L J H Z H H D H H Z J L L L J H H L H P L H H H J J H Z H H H H H H H Z Z J J G Z Z Z S P _ [ { [ M.aXpXpXaXaXgXaXgXaXgXgXaXaXgXaXgXaXaXgXaXaXaXfXpXpX].hXQ.].Y.Y.Z.H.G.G.G.D.D.A.D.H.l.G.H.H.S.S.D.G.A.A.A.H.L.S.S.A.H.S.A.H.H.H.H.S.A.A.A.A.A.h.A.A.h.j.A.A.g.A.A.A.h.A.A.A.g.h.h.g.h.h.g.g.g.g.g.k.k.a.k.a.a.a.s.i.u.t.a.i.i.i.u.a.i.i.i.s.u.i.i.a.a.u.i.a.i.a.a.k.z.z.a.a.a.z.z.i.a.a.a.a.a.a.z.a.f.a.a.a.a.f.a.a.a.a.i.a.i.i.i.a.a.a.a.a.k.a.a.z.k.k.k.k.f.k.g.k.h.k.h.h.g.g.S.A.A.A.A.H.H.S.H.H.L.H.L.L.L.H.L.L.U.U.L.U.U.L.T.U.U.T.T.U.T.T.U.T.T.~.~.T.T.T.U.T.T.T.T.~.T.~.T.(.~./.!./.E.^.^./.(.(.(.|.`.`.`._._._._.`.`.(.`.|._.|.|.}.}.|.|.|.|.(.(.(.(.(.(.^.^.!.(.(.(.(.(.(.(.(.(.(.(.`.~./.(.(.(.(.`.^.(._.].|.`._._.^.|.(.`.(.(.^.{.(.(.^.^.(./././././.~.~./.~.~.~.^.[.!.(.^./.(.(.(.(.`.`._._.}.}.}.}.|._.|._.|.|. X X.X X X.X.X.X.XdXdX.XzXzXzXzXzXzXdXdXdXxXdXdXdXcXdXxXdXnXcXzXcXcXcXcXxXxXxXxXxXxXdXxXdXzXdXdXnXdXzXzX.XzXxXdXcXcXcXcXxXxXdXzXzXdXdX.X.X.X|.|._.{.{.(.(.~.~.(.R.R.T.'.gXgXgXpX{ c u e e > % o o K T.T.T.T.T.T.T.T.~.T.T.T.~.T.T.[.[.T.T.T.T.P.U.T.U.T.T.T.P.T.P.T.U.P.P.T.L.L.L.L.L.U.L.L.P.L.L.L.L.L.L.Y.Y.L.L.H.L.L.U.' ' ' c t e r r ; r r r r r : y : r 0 r 0 r ; ; y ; ; : : : = : e y r ; = r r r r r r r r r r r r r r r r 0 r 0 y r * e r r * r r : r 0 : r r r y : : : e * y r = y : * 0 ; e ; ; y r * 0 r r r r r r r r r r r r r r r 0 r r 0 r r r y ; r 0 r y r r 0 r = r r r r ; 0 r r r r r r r r r r r r r r r r r r : y : : y * * % $ o   dXfXdXcXxXxXxXxXdXdXxXdXzXzXzXzXdXxXzX@XxXdXdXdXdXxXdXdXzXzXzXzXzXzXdXxXzXzXxXdXnXdXzXcXcXdXcXdXcXdXcXdXcXzXcXcXdXdXcXQ.' c / u > ; y y y n A y y m.dXMXnXmXmXnXmXMXmXMXmXSXMXmXnXnXdXcXzXzXzX.XcX.X.XzXdXzXzX@XdXdXxXxXdXvXcXzXxXxXxXvXcXdXvXcXdXcXdXdXzXzXzXzXzXdXzXzX XzXzXzX.XzXzX.X.XzX.X.XdX XdX.X.X.X.X.X.X X.X X|.|.|.|.|._.|.|._.`._.`._.(._.(.(.(.!.(.).)._.^.(././.(.!./.~.~.~.T.~.T.T.T.T.T.T.T.U.U.U.U.L.U.U.L.L.L.L.L.L.P.T.A.L.L.S.S.L.L.L.H.L.H.L.H.H.L.D.U.L.L.L.S.S.H.S.L.L.L.L.L.L.P.P.L.L.H.L.L.S.L.S.L.D.H.S.P.S.U.H.H.H.L.H.K.H.H.H.S.H.K.G.H.G.H.G.A.P.L.L.D.L.L.H.L.L.U.U.U.Y.T.Y.T.~.~./.~./././././././.(././././.(.~./.(.(./.(.(.^.!.(.^.(.{.(.(.|.`.|.|.|..X.X.X.X.X.X.X.XdXdX'..XzXzXcXzXcXzXcXzXcXxXxXxXxXfXcXxX@XdXcXxXxXxXxXcXxXdXdXdXxXzXzXdXdXzX.X.X.X.X.X X X'. X_.|._._.|.`.(._._.|.`.`.^.(.(.(.^.(.",
+"Z Z G D Z Z Z D Z H H L D D H Z D D D D D Z D Z D Z Z Z Z Z C Z Z C B Z Z C Z Z Z D C D D Z D Z Z D D Z Z D Z D Z Z D D D Z H Z Z Z H S Z L Z G H H H H Z Z Z Z D H H H H H H J H L J Z Z L P P P L L J J P H J H J H J H Z D H Q P Z S ) { m.pXaXhXgXgXgXaXgXgXhXaXhXgXaXaXaXaXaXaXaXaXpXaXaXpXaXaXpXaXaXaXpXaXaXaX7XaXaXpXaXpXm.aXQ.F.F.Z.D.D.G.G.G.G.D.D.S.H.H.H.A.G.A.h.A.G.S.A.S.D.H.A.H.A.h.H.A.G.A.A.j.Z.A.A.A.A.A.A.A.h.A.A.A.g.G.h.A.h.g.h.h.h.a.g.g.f.k.k.k.a.k.a.a.a.u.i.i.i.i.i.s.i.u.i.i.i.i.a.i.i.i.a.a.a.i.a.a.a.a.z.E a.a.a.a.E a.i.a.a.a.a.z.u.f.a.a.a.a.f.a.a.a.a.i.i.i.i.i.i.i.d.a.a.a.k.a.z.a.k.k.a.f.f.k.k.h.k.h.h.h.A.g.g.A.h.A.A.A.H.H.H.L.H.L.L.L.L.K.Y.L.U.L.Y.L.L.U.L.U.U.T.U.T.T.T.T.T.T.T.T.~.T.U.T.T.T.T.T.T.T.~.~.~.~./././.(./.^./.(.(.(.^./.^.`._._.|._.`.`.`.|._.{.|.[.|.|.|.|._.`.`./.`.^.(.`.`.(.`.(.(.(.(.(.(.(.(.(.(.!.^.(.(.(.(.(.(.(.(._.(.(.`.`.`.`.|._.^.^.`.`.(.(.(./.(.(./././././.~.~.~.~.(.~.(.E.^./.^./.(.(.(.(.(.`.(._._.}.}.}.}.|.|.|.|.|. X|. X|..X.X.X'..XdXdXzX.X.XzXzXzXzXzXxXxXxXdXdXxXdXxXdXnXdXdXzXmX.XxXcXcXcXxXxXxXxXdXcXxXzXcXnXdXdXdXzXzXxXxX.XcXzXdXdXcXcXzXzXzXzX'.'..X X|.|.{.|.`.(././.^.[.Y.I.W.hXgXgXaXm.{ Q u : e ; % % $   J ~.~.T.Y.T.T././.~.~.~.T.T.~.~.T.T.T.T.T.T.T.T.T.U.U.T.P.T.P.P.T.P.Y.U.U.U.Y.L.L.L.S.L.U.U.L.L.U.L.L.U.L.L.L.Y.Y.U.L.I.' ' ' Q t y r r 0 * y r = r : 0 ; r r r ; : r r = y ; ; q : y r : = ; r y r r y r r r r r r r r r r r r r > * r r 0 y : e r r r : r r r : 0 ; e = 0 e y = e ; ; 0 * y * t : e ; t = 0 t % * : r r r r r 0 r r r r r r r r = y ; * : r : ; ; ; > ; r ; ; e r r r r r r r r r r r r r r r r r r r r r r r r r : r r 0 : ; : % $ o   cXdXdXcXzXdXxXxXdXdXxXdXzXxXzX.X@XzXzXzXxXdX.XdXdXdXdXdXdXzXzXzXzXzXdXdXzXzXdXxXdXxXxXzXdXmXdXmXcXcXcXdXcXxXdXdXcXdXdXm.{ ' ' c > ; e y q > > n y u b.MXnXnXmXMXmXmXMXmXmXmXMXmXmXnXcXcXzXzXzXzXzX.XdX'.zX'..XdXdXdXdXdXzXzXdXdXcXcXxXxXcXcXzXvXdXdXcXvXzXzXzXzXdXzX.XdXvXdX.XvXzX.X.X.XzXdX.X|.dXvX XdXdX X.XzX.X X X X|.|.|.`.|.|._.|.`.(.`._._.`.(.(.(.(.(.(.(.(.(.(.(.(.(././.~.!.~.~.~.T.~.T.T.[.T.T.U.T.U.Y.U.L.L.L.L.L.Y.P.L.P.L.U.L.L.L.U.L.L.L.L.L.S.S.L.H.L.H.L.L.L.L.S.U.L.L.L.L.S.S.L.L.L.S.L.L.L.H.S.U.L.S.L.S.H.H.P.H.L.A.L.L.L.H.H.K.H.H.h.Y.A.K.H.H.H.K.L.G.L.P.S.L.L.L.L.L.I.U.T.T.T.T.Y.T.~.~.~.~././.(./.(././.!.(././.^.(.(.(.[.(.(./.(.(.(.(.(.^.`.(.(.`.(._.`.|.|..X X.X.X.X.X.XdXdX.X.XcXzXzXcXzXcXzXxXcXzXxXzXvXxXcXxXxXJXdXnXxXcXxXxXxXdXnXcXdX.XzXdXzX.XzXzX.XdX@X X.X X|.|.^._._.(._._._.^.`.^.`.|.^.`.(.(.(.",
+"Z Z D D Z D Z Z Z Z Z Z Z H Z Z D D D D D Z D D Z B Z Z Z Z Z Z Z Z D Z Z D Z Z Z Z G Z D D Z D D D D Z D Z D Z Z H Z D D D Z Z D D D D Z H H D H Z H Z S H L Z Z Z D H H H J Z J Z H L P H H J S L U L G J K S H H H H H P P _ [ M.pXgXgXgXaXaXgXaXaXaXaXaXaXpXpXpXpXpXpXpXpXm.m.pXM.pXpXM.M.pXm.pXM.pXpXpX{ pXM.pXpXpXpXpXpXpXpXpXaXpXpXhXpXm.K.L.I.Z.Z.D.D.Z.S.S.A.G.H.G.A.Z.S.S.F.H.H.H.A.A.S.A.h.A.A.A.h.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.h.h.h.h.z.g.g.g.g.g.k.a.a.k.a.a.a.a.a.i.i.i.a.i.i.i.i.i.i.i.i.i.i.s.s.u.u.i.i.a.a.a.a.a.D.a.a.a.a.a.a.a.i.a.u.z.a.a.a.a.a.a.a.k.a.f.a.f.a.a.a.i.i.i.a.i.a.a.a.a.a.d.a.k.d.k.f.f.f.g.k.k.k.h.h.S.h.A.l.A.A.A.S.G.G.H.L.L.L.L.L.L.L.L.I.U.T.L.U.U.U.U.U.Y.L.T.T.T.~.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.~.T.~.(././.~./././././.^./.^.(.(.|.{._._._._.(._.|._.|._. X}.}.}.{._._.|.(.|.`.(.(.(.(.(.(.(.(.(.(.(.(.].!.(.(.(.!.(.(.(.(.`.^.(.(.(.^.`.^.(.{.(.|.^.`.(.(.(.`.^./.(.^./.(.(.~./.~./.~./.!.E.~.~.(.~./.(.(.(.{.(.(.`.(._._._.}.}.|.|._.|.'.|. X X X X.X.X.XzX.X.XdXdXxX.XxXzXzXzXzXzXdXcXcXzXcXdXcXxXnXcXcXvXcXzXxXcXcXcXcXcXcXcXxXxXcXxXcXdXdXcXnXdXzXzXzXzXcX.XdXcXnXcXxXcXzXzXzX.X.X.X.X|._._.{.(.(.^.~./.T.T.].JXgXgXaXM.{ Q u t e ; ; % , o o K ~.~.~.~.~.~.~.T.T.~.T.~.T.~.T.T.~.T.T.T.T.T.T.T.P.T.T.T.P.P.P.T.U.P.U.U.L.L.L.L.L.L.L.L.P.L.L.L.Y.U.U.U.L.L.L.L.L.U.L.' ' ' Q u ; r r r 0 r * ; r ; : : e y * ; * * 0 r ; ; ; & e * r ; r r ; % r r r r r r r r r r r r r r r r y r * ; * y * 0 r r : : r r : y : : e 0 y : * e e ; y y * t r r : > e ; e t * y y r r r r * r r r r r r r r r r ; e e e : 0 : : 0 r e 0 > % > = r r r r r r : : r r r r r r r r r r r r r r r r y : r r : y : * $ $ &   cXdXmXcXzXxXdXxXzXzXcXdXzX.X.XzXdXdXdXzX'.@XdXdXzXzXdXzXxX.X.X.XzXxXzXdXzX@XdXdXdXzXxXzXcXdXcXmXcXdXcXmXdXvXdXcXcXdXnXm.' ' / u r > e r y : u y u t u m.MXmXcXMXMXmXmXmXmXMXMXmXnXnXcXcXzXzXzXzX.XzXzX@X.XdX.X.X.XdX.XzXdXdXxXcXzXcXxXcXcXcXdXfXmXcXcXdXzXzXzXcXzXzXxXdXdXzXdXdXzX.XzXzXzX.XfX XdX.X X.XzX.X.X.XdX X.X X|.|.`.|.|.|._.|._._._._._.(.(._.(./.)./.(.(.(.(.(.(.^.{.(.[.^.~.~.T.T.T.T.[.T.T.T.U.T.U.U.U.I.R.L.U.L.P.P.P.P.P.U.L.L.K.U.L.L.L.L.L.L.L.L.U.L.L.L.L.L.L.L.L.L.L.L.L.S.P.L.S.L.L.L.L.L.H.D.H.L.L.H.L.L.L.H.H.H.L.K.H.K.H.S.U.H.H.H.K.H.H.K.H.H.L.H.K.U.S.L.S.L.L.I.L.U.U.U.T.T.T.I.~.~.~.!.~././././.!././.(.(././.(.(.(.(./.(./.(.(./.(.!.(.(.(.(.(._._._._.|.|.|. X.X.X.X.XzX|..XzXzX.XdXnXdXxXxXcXxXxXxXxXcXcXxXcXxXxXnXnXdXnXcXxXcXdXcXdXzXzXzX.XzXzX.XzXzX.X.X.X.X.X X|._.}.(.{._._.`.(.`._.{.{.|.(.(.(.(.(.",
+"Z H D Z Z Z Z Z Z H Z Z Z Z H Z Z Z D D D D Z Z G D D D Z Z Z Z Z Z Z Z Z Z Z Z D D D D D D D Z D D D D D D D D Z L D D D D D Z D Z Z D H Z Z Z Z H Z Z H H Z H H H H H J Z L J Z L L J H H J J P L P Z U U Z S J J J _ M.pXfXgXgXgXgXgXgXaXaXaXpXpXpXpXpXpXpX{ pX{ M.{ { { { { } { { { { { } { { { { { } { { { { M.m.{ M.{ M.M.pXM.pXM.pXpXpXpXpXpXm.m.Q.F.D.Y.G.S.A.G.H.A.D.A.S.A.D.D.S.G.H.H.H.H.H.A.A.A.H.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.h.A.h.h.g.z.g.g.g.g.k.z.a.k.a.a.a.a.a.a.i.a.i.i.i.i.i.a.i.i.u.a.i.i.i.i.s.i.i.i.i.a.a.d.E z.D.E a.a.i.a.a.a.a.u.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.i.a.a.a.i.d.a.a.a.z.k.k.k.k.d.f.f.k.k.k.h.h.g.g.z.A.h.A.A.A.S.S.H.H.L.S.L.L.L.L.L.L.Y.U.T.L.U.Y.U.U.U.Y.U.U.T.T.T.T.T.~.~.T.~.T.T.T.T.T.T.T.T.~.T.~.~./././.!./.!.[./././.(.(.(.(.^.|.|._.|._. X|._.|.|.|.}.}.|.}.|.|.(._.|.(.(.(.^.`.(.`.^.(.(.`.].(.(.`.(.(.`.!.(.(.[.^.(.(.`.(.(.(.(.^.`.(.(.|.^.|.`.^.(.(.(.(.(.^.(./././.(./.^.~.(.~.~./.~.(.~.^././.^.^.^.`.`.(._._.|._.|._.|.|.|.|.|. X'..X.X.XdX@X.XzX.XxXdXdX.XxXzXzXzXzXzXzXdXcXzXdXcXcXxXxXcXcXmXcXdXcXnXdXcXcXcXcXcXcXxXxXcXxXcXcXcXcXdXdXzXzXcXzXzXnXcXdXzXcXdXcXzXzXzX.X.X|.|.|.|.|._.{.`.(./.[.T./.hXgXgXaXpX{ Q u e r ; ; r % % &   K ~.~.~.~.~.~.T.~.~.~.~.T.T.T.~.T.T.~.~.T.T.T.P.T.T.P.P.T.P.P.P.P.U.U.U.U.U.U.L.L.L.L.L.L.L.L.U.Y.U.U.L.U.L.U.L.L.U.L.L.' ' ' Q t r r r = r ; e { LXLXLXLXLXLXLXLXgXc e r { LXLXLX' r ; y ; ; y e r r r r r r r r r r r r r 0 r r ; r y ; e 0 r LXLXLXLXLXLXLXLXLXLXLXLX- - LXLXLXpXe * r r r e = e HXLXLXBX> > ; 0 r : r r : r r r r r r r r r r IXLXLXLXLXgX; ; % gXLXLXLXPXIX- ; r ; e r r ; ; r r r r r r r r r r r : r r r r = r r r 0 : ; : % % o   dXdXdXmXcXxX@XdXzXzXdXdX.XzXzX.XdX.XdX'.dXzXdX'..X'.zX.X.XzXxXxXzX'.@XdXzXzXdXdXxXzXxXzXmXdXdXdXdXcXcXdXcXdXxXcXdXcXcXQ.' ' ' u e e : r > y y u u u y y m.dXMXnXNXMXmXMXMXmXMXmXnXnXcXdXzXcX.XzXxX'.'.zXdXdXdXdXdX@XzXzXdXxXdXdXdXxXxXzXcXcXmXcXdXdXcXdXzXzXdXcXzXzXzXzXzXzXzXzXzXzXzXdX.XzXdX%XdXvXvXdX.XzX.XzX@X.X|..X|..X`.|.|.|.{._._._._._._.(.(.^.(.(.(./.(.(.(.(.(.(.(.(.(.E.~.~.T.[.~.~.T.T.T.T.T.T.T.U.T.U.U.L.U.P.U.L.L.P.P.P.L.U.L.L.Y.L.L.L.L.L.L.L.L.H.L.L.L.L.L.U.Y.U.L.L.L.L.L.L.P.L.L.L.L.L.L.L.L.L.G.G.L.H.L.D.L.H.L.S.L.H.L.H.L.S.H.H.H.H.H.H.H.L.L.H.L.L.L.U.L.L.L.L.L.I.U.U.T.T.T.T.~.~.~.~.!./././.(././.(./.(././.(.(./.(.(.(.^.(.(.(.(.(.(.[.^.{.(.(._._._.|.|.|.|..X.X.X.X.X.X.XzX.XzXxXdXxXdXnXzXcXdXxXvXzXxXdX.XcXxXxXdXnXdXxXxXxXvXxXcXxXzXdXzXzXdXxXzXzXzX.X.X.X.X|.'.|.}.}._._._._.^.`.^._.|.`.^.(.(.`.(.|.",
+"Z Z Z Z Z Z D Z Z Z D D H H Z Z Z D D D D D D Z Z Z Z Z Z Z Z Z Z Z Z Z H Z Z D Z D Z Z D D D D D D D D D D D D A D D Z D D D Z Z D Z D Z Z H H Z Z Z S Z Z H Z H H H D H D Z H J L H H J S P P Z P I H ( J I Z [ pXhXgXgXgXaXaXaXaXpXaXpXpXM.M.{ M.{ { { ' ' ' / / n Q ^ u u u u S u S u u u u u S u S c S ^ ^ Q ' n ' ' ' { { { { { { M.M.M.M.pXM.pXm.pXm.m.m.F.n.F.H.D.D.A.S.G.z.G.H.H.S.H.H.H.S.H.H.S.A.A.A.A.A.h.A.A.A.A.A.A.A.A.A.A.j.h.A.h.z.g.g.h.z.g.g.k.f.f.i.a.a.a.a.i.i.i.a.i.i.i.i.a.a.i.i.s.u.s.u.t.i.u.s.i.i.a.i.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.z.a.a.a.a.a.u.a.d.a.a.a.z.a.a.d.k.a.k.k.k.k.k.g.h.h.g.h.A.A.A.A.h.A.S.H.H.L.L.L.L.L.L.U.U.I.T.U.U.T.U.U.Y.U.U.Y.U.T.T.T.T.T.T.T.~.T.T.T.T.Y.T.T.T.T.T.~.~.~./././././.~.^./.~././.^.(.(.^.|.[.|._.`.}. X|.|.|.|. X|.|.|._.|._._._._.`.(.(._.(.(.(.`.(.(._.(.(.(.(.(.(.(.(.!.(.^.(.(.^.(.(.(.(.(.(.|.^.`._.(.(.(.(.(._.(./.(././././.(.(.T.{./.!./.(././.!./.(.(.(.(.(.|._.^.|._.}.}.}.|.|.|.|.|.'.'. X.X@XdX.XdXdXdXzX@XdXdXzXzXzXzXzXcXdXzXzXcXdXcXxXxXxXxXdXnXcXcXcXcXcXcXxXcXcXcXnXcXJXxXcXcXxXxXxXxXdXcXxXzXzXxXdXdXdXxXdXcXzXcXzX@XdX'.|..X|._.|._._.(.^.(./.~.].hXhXgXaX{ { ^ u y 0 r ; y r * & $ o Z ~.~.(.~.~./.~.~.~.T.~.~.~.T.~.T.~.T.~.T.T.T.T.T.P.P.P.T.T.U.P.T.P.P.Y.L.L.L.L.L.L.L.L.L.L.L.L.U.L.L.P.U.P.P.P.L.L.L.K.' { ' n y * r r y : e * { LXLXLXLXLXLXLXLXLXPXu > { LXLXLX{ ; ; ; ; ; ; e : r r r e : e r r r r r r r r r y 0 = > e 0 : LXLXLXLXLXLXLXLXLXLXLXLX; * LXLXLXpX; ; ; * ; : r e IXPXLXIX- > ; * ; r r r r r r r r r r r r : t gXLXLXLXLXIX> ; e IXLXLXLXLXHX- % r : r ; e > e r r r r r r r r ; ; e : r r r e : : r : : : y : % $ o   nXdXzXcXxXzXzXzXzXcXdXdX.XzX.XzX'.zX.X.XdXdX.XdX.XzX.XzX.XzX.X'.zXzXzX.XdXdXdXdXdXdXxXdXdXdXdXcXnXdXcXnXfXdXdXdXdXdXdXm.' c / u y : ; : ; ; e y > u Q y y n.fXMXcXmXmXmXmXmXmXmXnXcXvXdXzXzX.X.X.XzXdX.XdX.XzX.XzX.XdXzXdXdXzXzXzXzXzXcXdXmXcXcXdXdXmXcXdXzXdXdXzXcXxXdXvXdXdXdXzXzX.XzXzXzXzX@XdXcX.X.XxX.XdXdX.X X.X|.|.`.`.`._._.[.|._._._._.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(././././././.T.~.T.~.T.T.T.T.T.T.Y.U.L.T.U.P.P.L.L.Y.P.P.P.T.L.U.U.U.U.U.L.I.L.L.L.L.L.L.L.U.L.L.U.U.L.L.P.P.P.P.L.P.L.P.L.L.P.L.L.L.L.L.L.L.L.L.L.G.G.L.L.L.S.L.H.U.K.H.U.H.H.H.H.H.L.K.D.U.L.S.L.L.L.P.L.U.T.U.T.T.~.~.~.~.T././.(././.!.(././.(././.(.(./.{.^./.^.(.(.(.(.`.T.(.~.(._.(.`._._._.|.|.`. X.X.X.X.XdXdX.X.XzXzXzXzXcXdXnXxXxXcXxXxXzXxXxX.XxXxXcXnXcXnXdXcXxXxXxXcXdXxXdXzXzXzXdX.XzX.XzX.X.X|..X|.}.}._.|._._.`.`.`.`.(.|.^.|.{.(.(._._.",
+"G Z Z Z Z Z D D D Z Z D Z Z Z S D D Z D D D D D H Z H Z D Z Z Z Z Z D D D D Z Z D Z D Z D D Z D D D D D D D D D D D D Z D D H Z D H D Z Z Z Z Z Z H H H H Z Z L H Z H Z L H H L L J H J P P J K P L H I / pXgXgXgXgXgXgXaXaXaXaXpXpXM.{ { { ' ' _ Q Q u u t u r e y e e r y u > : : : r > ; > > ; 0 e e = e e y t y y y t S u S S ^ ' ' ' { { { { M.{ M.M.m.M.M.M.m.m.F.Z.A.D.D.A.G.S.D.G.G.H.Z.H.H.H.A.H.S.H.A.A.W.A.H.A.S.H.A.A.A.A.A.A.A.h.h.g.g.z.g.h.a.a.g.k.k.k.k.a.a.k.a.a.a.i.i.i.a.a.a.i.a.i.i.i.i.i.s.a.u.s.u.i.a.i.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.u.a.a.a.a.a.a.k.a.a.a.a.a.a.f.a.a.a.a.a.a.a.a.a.a.a.d.k.k.d.f.f.k.k.h.z.h.h.A.h.A.A.A.A.H.D.H.S.H.L.L.L.L.Y.U.U.U.T.U.Y.U.Y.Y.U.T.U.U.U.T.T.Y.T.~.T.T.~.T.T.T.T.~.T.T.T.T.~.~.T.~.T./././././.~./.^.~.(.{./.(.^.^.(.|._.`.}.}.|.|.|.|.|.}.}.|.|.|.|._._._._.(.(.^.(.(.(.(.(.(.(.(.`.(.(.(.(.(.(.(.(.(.(.^.`.^.`.(.(.^.`.(.(.(.^.(.(.|.^.^.`.(.(.(./././././.~.(.^.~././././././.(./.(./.(.(.(.{._.|.}.}.}.}._.}.|.'.|.|..X X.XdX'..X.XdXdXdX.XzXdXdXzXzXxXzXdXcXzXcXzXzXcXcXxXxXxXxXnXcXnXcXcXcXcXmXcXcXmXcXmXcXnXnXnXcXxXxXxXxXcXdXxXzXzXzXcXcXnXxXcXcXdXdXzXzX.X'..X X_._._._._.(.(./.(./.hXgXaXaXpX{ / u e e r = ; y ; % % o   K !.~.(.~.~./././.~.~.~.T.~.T.T.~.T.T.T.~.[.T.P.T.T.T.T.P.U.U.P.P.Y.L.L.L.L.L.L.L.L.S.L.L.L.L.U.U.Y.Y.Y.L.A.L.P.L.L.K.Y.' ' c ~ t r ; r r : : ; ' LXLXLXLXLXLXLXLXLXLXM.% ' LXLXLX' * % ; ; > ; 0 r r r r e ; : : r r r e r r r r ; r r y : : ; LXLXLXLXLXLXLXLXLXLXLXLX% % LXLXLXpX; * * 0 * * ; ; M.pXpXM.% % * 0 0 r > r r r r r r r r r : : ; UXLXLXLXLXLXu % u LXLXLXLXLXHX- % * ; $ r ; ; ; r r r ; r r r r : > : e r r r = r y = ; : * ; * % $ o   dXzXzXzXzXzXzXzXdXdX.X.XzX.X.XzX@X.X.X.XdX'.dXdX'.zX.X.XzX.XzXzX'..X.X.XdXdXdXdXxXdXzXzXdXdXcXdXdXdXdXdXvXnXdXdXxXdXcXQ.' ' ' n t * t r y y ; e u > y e : y b.MXmXmXmXMXMXmXmXcXcXcXdXcXzXzXzX.X.X.X.X XdX.X.XdX'.zXdXdXzXcXzXzXdXzXcXzXcXdXdXcXvXmXcXdXnXzXnXxXzXdXdXxXdXzXzXzXzXdXzXzXdXzXdXdXdXdXdXcX.XzXdXdXdX X.X'..X`.`.`.|.|.}.}.|._._._.(.`._.(.(.(._.(.(.(.(._.(.(.(.(./.(.[./.[.T./.~.~.~.~.~.T.T.T.T.U.T.U.U.U.P.P.P.U.U.P.P.T.U.Y.Y.T.U.Y.U.T.L.T.L.L.U.L.Y.U.U.T.U.L.U.U.I.P.L.P.L.P.P.P.P.L.L.L.L.L.L.L.L.H.L.L.L.L.L.L.L.H.L.L.F.H.H.G.S.H.H.H.H.H.L.H.H.L.L.L.L.L.L.P.P.T.U.U.T.T.T.T.~.~.~.!.)./.!././.(.!.(././.(./.(./.(.(./.(./.(.[.(.(.^.(.(.(.(.^.^.(._._.(._.`.|..X|..X.X.X.XdXzXzXxXzXzXxXdXxXdXzXxXdXxXxXvXxXvXcXxXxXzXnXcXcXcXxXxXcXxXcXnXdXdXzXzXzXdXzX.XzX'..X.X'.|.|.}.}._./.|.(.(.^.^.(.(.^.|.(.{.|._._.^.",
+"Z Z Z Z Z Z Z Z D Z Z D D D H D D D D D D D D D Z D D D D Z D Z Z D D D Z D Z G Z D D D D Z Z D D D D D D D D D D D D Z D D Z Z H Z Z H Z Z Z Z Z Z Z H D H H H D H H H H J L H Z L J H U H J I H _ M.hXgXgXgXgXgXaXaXpXM.M.{ { ' ' ! c S y u y y e ; ; e r r e r r y ; : : = : : : : r : : ; y ; r r r = ; 0 : ; ; e e e e r e r y u u u u S Q ' ' ' { { { { M.} m.M.M.M.m.F.Z.Z.H.H.H.H.H.D.S.H.H.H.H.H.S.S.S.A.A.H.A.S.S.A.H.G.j.A.A.A.A.A.Z.h.h.h.z.z.z.g.g.a.g.i.a.a.z.a.a.a.a.a.i.i.i.a.a.i.i.i.i.i.u.i.u.i.u.u.i.u.s.i.a.a.a.a.a.a.a.u.a.t.a.a.a.a.a.a.a.a.a.a.a.a.k.k.a.a.a.a.f.k.a.a.a.i.d.i.i.a.a.a.z.k.k.k.k.f.k.k.k.h.g.h.h.A.A.A.A.A.G.S.H.H.H.L.L.L.L.L.U.U.T.T.U.U.T.Y.T.U.T.U.T.T.U.T.T.T.T.~.T.T.~.T.T.~.T.T.T.~.T.~.T.~.~.[.!././.[./././././././.^.(.(.(.(.(.`.{.}.`._.|._.|.}.|. X}.|._.|.|.`._._.(._.(.(.(.(.(.^.(._.(.(.(.(.(.`.(.(.(.(.(.(.(.(.(.(.(.(._.(.(.(.(.(.(.(.`.(.(.(.(.(.(.(.(./.(.(.(./.[.[.[./.(././.(.(.(.(.(.(.(.(.^.|.|._.}. X}.}.'.|. X|.|.|. X'..X.XzXdXzXzXzXzXzXzXzXzXzXzXzXzXzXxXxXxXxXdXxXxXxXxXcXnXnXnXnXnXcXnXnXmXmXnXnXnXnXnXnXnXnXnXxXxXxXxXxXdXxXzXxXzXdXdXzXdXdXxXdXcXzXdX.X.X'.|.|.`._.(.(.(.^.!.T.].pXpXpXM.{ Q u t y : : y 0 q 0 % & o   J /.(.~.!././.(.~.~.~.~.~.~.~.~.T.~.~.~.T.T.T.T.T.T.T.T.P.U.T.Y.L.L.U.L.L.L.L.U.U.L.L.L.L.L.L.U.L.T.L.L.U.L.L.L.L.P.F.K.' ' ' Q u r r : r : = e { LXLXLXIX$ e aXLXLXLXBX- c LXLXLXc : ; % e M.pXpXpXM.u y ; t { ' ' c ; 0 0 _ { { _ ; ; : : e : ; : : % LXLXLXLX$ % $ & % % LXLXLXpX> M.sXpXx % * ; ' { { c > * % y { pXpXaX{ u 0 r ; r ; y = e ; IXLXLXPXLXLXsX% M.LXLXLXLXLXIX% % % % ' pXpXaXpX{ ; r q * ^ { ' u u sXpXM.u : q r r : q r r : * $ $ o   nXdXnXdXzXzXzXzXzXzXzX.X.XzXdX'.dX X.X.X'..XdX.X.X.XzX@X.XzXzX.X.XzX.XdXdX.X.XdX.XzXzXzXdXvXdXcXcXdXcXdXdXdXdXbXdXdXcXm.' ' ' u y r y r : : ; e e : > e % % % [ mXmXmXMXmXmXmXfXMXdXcXdXzX.X.XzXzX.X.X@X.X.XzX.X@XdXdXdXdXzXzXzXcXzXvXzXdXcXcXcXcXdXdXnXdXcXcXdXcXdXxXdXzXzXdXcXzXzXzXzXzXzXdXfXdXdXdXcXzX@XdX.X.X.X X.X.X`.`.`.|.|.|.|._._._._.^.(.(.(.]._.(.(.(.'._.(.`.^.(.(.(././.(./.~.T./.~.~.T./.~.T.T.U.T.T.U.Y.Y.T.U.P.P.Y.P.T.T.U.T.U.U.T.U.T.T.I.L.Y.U.U.Y.Y.T.Y.L.T.Y.P.Y.I.P.P.P.Y.P.P.L.U.P.U.P.L.L.L.P.L.L.L.L.L.L.L.L.P.L.L.S.L.S.L.H.U.H.H.L.F.L.S.A.L.L.L.L.P.L.L.L.P.T.T.Y.T.T.~.T.~.~.~.~.~./././.(././././.(.(./.(.(././.(.(.(.^.^.(.(.^.(.^.[._.^.^.|._._.|._.|.|.|..X.X.X.X.X.XdX.XdXzXzXdXxXzXdXvXxXxXxXvXxXxXzXcXvXfXcXnXnXnXxXxXcXcXcXxXdXnXcXzXzXxX.X.XdX'..X.X.X.X'.|.}.}._.|.^._.(.(.(.(.`.(.(.(./.|./.|._.",
+"Z Z Z H Z Z Z Z Z Z Z Z D Z H Z Z D D D D Z Z B G Z D Z D D Z D Z D Z D D Z D Z D D D D D F D D D D Z D D D A D D D D D D L A Z Z Z Z Z Z Z H Z H Z H Z D H Z H H L H H H Z H J J P H J I J P [ pXgXgXgXgXaXpXaXpXpXM.{ { ' ' Q u u y y > y y : > : : ; r 0 r q r : : > : : : y : : : : y ; ; : e r r r r r y r : : : e r r r r e r : : > > y u t i c Q ' ' { } M.{ M.{ M.M.{ M.F.F.A.H.H.L.S.U.H.H.H.H.G.S.S.S.H.H.A.H.A.S.H.A.A.S.H.A.A.A.A.j.h.h.g.l.g.g.g.g.g.z.a.g.a.f.a.a.a.a.a.i.a.a.a.a.a.i.a.i.u.s.i.u.u.u.i.u.i.i.i.i.a.d.a.a.a.a.a.a.a.a.a.a.u.a.a.u.a.a.a.a.a.a.a.a.a.f.a.a.a.a.z.a.k.i.z.k.z.i.a.d.a.d.a.k.f.k.k.k.h.g.g.Z.A.z.A.A.A.l.D.H.H.H.H.L.L.L.U.L.L.T.I.T.U.U.T.U.T.U.T.T.T.T.T.Y.T.T.T.~.~.T.T.~.~.T.~.T.~.~.T.~.T.!.~./././.{././.(.T.(././.{.(.(.(.(.^.`.}.{.|.|.|._.|. X_. X}. X_._.`.`._._._.(._.(._.(.`.!.(.(.^.(.(.(.(.(.`._.(.(.^.^.(.(.(._.(._.(.(.(.(.(._.(.(.(.(.(._.(.(.(.(.(./.(./.(.(.(./././.(.(.(./.(.(.(.(.(.^.(.|.{._._._.|.|.|. X'..X|.|.|..X@X.XzXzXzXzXzXzXzXxXzXzXzXzXzXxXzXzXxXzXxXxXxXxXcXcXdXnXnXnXnXnXnXnXmXcXcXMXcXMXcXnXcXnXcXnXxXxXxXxXxXxX@XzXxXzXzXdX@XzXcXdXxXzXzXdXdXdX.X'.|.`.|.{.|.{.^.^.{.F.{ ' { ' ' ! y e > e e : : r > 0 % % $ o S /./././././.(.(.~.(.~.~.~.T.~.T.T.~.T.~.T.T.T.T.T.T.P.T.U.T.U.T.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.U.L.U.L.L.L.L.L.L.P.L.K.' ' ' c u 0 r r r r y e ' LXLXLXgX- $ n LXLXLXIXo ' LXPXLXc & % M.PXLXLXLXLXLXLXaX; ; PXPXLXIX: * * PXLXLXpXe * y * * e e : % % LXLXLXLX$ $ $ $ $ % LXLXLXgXIXLXLXLXPX{ = % gXLXLXgX% % sXPXLXLXLXLXLXPXpX; ; y ; ; e > : gXLXLXgXLXLXaX$ aXLXLXgXLXLXgXo % ; IXLXLXLXLXLXLXIXc ; * IXLXLXgXIXPXLXLXPXc : * : : q r r r * ; $ o $ dXdXdXdXzXzXzXxX.XxX.XzX.XdXdX.X.X.X.X.X.X.X.X.X.X.X.XdX.X.X.X.X.X.XdX X.XdX'.dX@XzX'.zXdXdXdXdXdXcXdXdXdXcXdXdXdXdX@Xm.{ ' / u y : * : : ; e e : ; : & $ $ $ % m.mXcXMXdXmXmXMXdXmXdX%XzXzX X.X.X.X.X.X.X.X.X.XdX.X.X.XzX.XzXzXcXdXzXzXcXcXdXcXcXdXcXdXcXdXzXcXzXcXnXdXcXmXdXdXdXdXzX.XzXzXzX.XvXdXdXdX.XxX.X.X.X.X X X`.`.`.`._._.|._._._._._.`.`.(.(.(.(.(.(.(./.(._.|.^.(.(.(.(././././.~./.~.T./.T.T.T.T.T.T.U.U.T.U.U.P.P.U.L.Y.T.U.T.U.T.T.U.T.T.T.T.T.T.T.T.T.T.P.T.T.T.T.T.T.P.P.Y.P.P.U.L.K.U.L.L.L.U.P.P.P.P.L.L.L.D.L.L.L.G.L.L.H.L.L.K.H.H.D.L.S.L.L.L.L.L.L.L.L.P.L.P.L.U.U.T.Y.T.T.~.~.~.~.(.~.(././.(.(./.(.(.(./.(.(./.(.(.(./.(.[.(.^.{.(.(.(.`.(.(.(.(.(.(.^.|._._.|. X|..X.XdX.XdXdX@X'.zXdXzXzXxXxXcXxXxXvXxXxXxXxXxXcXdXxXxXdXxXxXcXcXcXdXcXcXdXzXzXzXdXxXdXxX.X#X.X.X|._.|.}.}._.{.(.(.^.`.^.(.^.(.(._.|./.|._.|.",
+"Z Z Z Z Z C Z Z Z Z Z D D D D D D D Z Z Z Z Z H D Z D D D D D D Z Z Z H Z L Z L Z L Z Z Z G D Z D D D D D D Z D D Z D Z G Z Z Z L Z G H Z Z Z Z L Z L Z D D D D G D Z Z H J Z P Z U H J _ m.gXgXgXgXgXaXpXpXm.} { ' Q u u y y y r r r r r r r : r r r r r r r r r r r r r r r r 0 r r r r r r r e r r r r r r r r r r r r r r r r r r * r r r r y y y y u u u ^ ' ' { { { { m.M.{ [ b.n.F.A.D.H.L.L.G.H.H.L.S.S.G.S.S.S.A.H.H.h.S.A.S.S.A.A.j.Z.l.h.h.h.h.g.k.k.a.g.a.g.f.s.g.a.i.a.a.a.z.i.i.i.a.a.i.i.i.u.i.u.i.i.i.u.a.i.a.a.a.a.d.d.a.a.i.a.i.u.a.a.i.a.i.a.a.a.a.a.d.a.a.a.z.i.i.i.a.z.a.a.i.z.k.f.i.k.i.f.i.i.f.f.k.h.k.h.h.h.h.l.l.A.A.H.G.h.G.H.H.L.L.H.L.P.P.P.P.P.P.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.[.T.T.(.T.~.T.T.(././.(.(././.(./.(.(././.(./.(.(.`.(.(._._.|._.|._.}.|.}.|.|.}._.`.`._._._._.(.(.(.(.(.(.(.(.(.`.].(.`.(.`.^.`.^.(._._.(.|.`.^.^.^.{.(.(.^.(.^.(.(.^.|.(.(.(.{.(.(.(././.^./.(.(.(.(././.(.(.(.(.(.(.(.(.(.|.(.^.`._.|.|.|.|.|.@X|..X|.'.'..X'.dX@X.XdXzXzXdXdXcXxXdXxXxXcXdXzXcXzXcXcXxXxXcXxXxXnXnXnXnXcXnXcXcXmXmXmXmXmXmXmXnXnXxXnXxXcXxXcXcXxXxXxXxX@XdXdXxX.XzXzXzXcXzXzXzX.X.X.X X|._._.{._.(.(.(./.].[ y * r r ; r : r 0 r r r = > ; % $ o   K /./.~.[.^././././././.~.~.T.~.T./.T.~.T.T.T.T.T.T.T.U.T.U.U.U.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.A.U.U.L.' ' ' c e 0 r ; r r r e { LXLXLXIXf n IXLXLXLXaXo c LXLXLX' $ - LXLXLXLXLXLXLXLXLXx % pXLXLXLX; > { LXLXPXx % ; * ; ; ; % * % % LXLXLXLX$ o o $ $ $ LXLXLXLXLXPXPXLXLXIX% % UXLXLXIX$ f LXLXLXUXpXIXLXLXPXe > ; e ; ; r r IXLXLXsXPXLXIXo IXLXIXsXLXLXgXo & sXLXLXLXLXLXLXLXLXgX- > IXLXLXLXPXLXLXLXLXIX- ; % ; e ; : r ; % $ o   dXdXzXdXzXzXzXzXdX.XzX.XzX.X.XzX.X.X.X.X.X'..X.X.X'..X.X.X.X.X.X.X.X.X@XzX.X.X.XdX.X.XzX.XzX.XxX.XzX.XxXdXdXxXdXdXdXdXm.' ' / u y e e : y : e : ; % % ,       i hXnXMXmXmXcXcXcXcXcXdXdX.XdX.X#X.X.X.X.X.X.X.X.X XzX.XzX'.xXzXzX.XzXzXvXzXvXdXzXcXvXdXfXvXdXdXnXcXdXcXcXvXdXdXfXdXcXdXdXdXdXzXzXdXdXvXdXzXzX.X.X.X X|.|.|.|. X}._. X|. X_._.}.}.^.(.(.[.(.(.(.^.(.`._._._.(._.(.(.^././.~./.~.~.~.~.T./.T.T.T.T.T.P.T.T.U.U.T.T.T.U.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.U.P.U.P.Y.L.L.U.U.P.U.U.L.U.L.U.L.L.P.L.U.L.L.L.L.S.L.L.L.H.L.L.S.L.L.L.S.L.L.L.L.L.U.P.U.U.U.T.T.T.T.T.~.~.~.~.(.~.(./.(./.(.(.(./.(./.(.(.(.(./.{.(./.^.(.{.(.(.(.!._.(.(.(._.[._._._._. X|. X X X.X'.@XdX.XdX@XcX XdXcXdXdXdXvXcXcXdXcXcXcXzXxXzXvXcXcXcXnXcXcXcXcXdXvXmXdXdXcXdXdXdXdX.X.X'.'..X|.}.}._._.(.(.(.(.(.(.(.(.(.`.(._._._._._.",
+"Z Z Z Z Z Z Z Z Z Z Z D G Z Z Z Z G Z G Z L G Z Z D C H D D D D Z H Z Z H Z Z S H Z H G D D D G D D D D D D D Z Z D Z D Z Z H H Z G Z L Z Z Z Z H Z Z Z D D D D Z P P L Z Z U G P S ( pXgXgXgXgXgXaXpXpX{ { ' ' u u y u e > r r r r r r r r r r r : r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r 0 e r r r r r r r r : r ; ; e : > t t y u u Q ~ ' ' { { m.{ M.{ m.b.F.U.G.G.G.L.S.A.G.S.S.G.S.G.H.H.H.H.S.H.A.h.A.A.h.j.l.l.h.h.h.k.h.h.g.z.f.f.f.a.a.a.f.i.k.i.f.i.k.i.a.a.a.i.i.i.i.a.i.u.u.i.i.i.i.a.a.d.d.k.i.a.d.i.i.i.a.a.i.a.a.a.a.a.d.d.a.a.a.a.a.i.a.g.z.i.z.a.d.i.i.i.i.i.k.i.k.f.f.g.k.k.k.k.h.l.l.l.h.h.A.h.A.S.A.H.H.L.L.L.L.L.P.P.P.P.P.U.T.T.T.T.T.~.T.T.T.~.T.T.T.~.T.T.T.T.~.~.T.T.T.T.~.T.R.(.!.!./././.(./././././.(./.!.(./.(.(.(.(._._._.|.|._.}.|.|.|.}.}.|.|.`.|._._._.(.(._.(.(.(.(.(.(.^.(.(.(.^.^.`.^.(.|.(._.(.^.^.^.(.|.^.(.`.`.(.^.(.(.{.(.(.(.|.(.(.(.(.(./.(.(.(./.^.(.(.(.(.(.(.(.(.(.].(.(.^.`.|.[.|.|.'.|. X X`.'.|.'..XdX.XdX.XzXzXvXzXcX@XxXcXxXdXxXdXdXcXzXzXcXdXcXxXxXxXcXcXcXxXnXnXnXnXnXmXnXcXmXMXmXnXmXnXnXnXfXcXcXxXcXcXxXvXxXxXxXdXnXdXxXzXzXzXzXzXzXzX.X@X'.|.|.|.|.|.(.^.|.(.`.~.~.H % % % % * ; r r * r : 0 ; ; ; % $ o K /.(.^.(././.[.^./.^././././.T./.T./.T.~.~.T.T.T.I.Y.U.T.U.T.Y.L.L.L.L.L.L.U.L.L.L.P.L.L.L.L.L.L.L.U.U.U.L.L.L.L.U.S.L.{ ' ' Q t r r ; r 0 r y ' LXLXLXLXLXLXLXLXLXLXf $ c LXLXLXn $ { UXPXLXM.% c LXLXLXpX* u PXLXLXM.- aXLXLXHX% ; ; % ; ; ; ; : % % LXLXLXLXo   o o $ $ LXLXLXPX{ { IXLXLXLX* ; IXLXLXJX& c LXLXLXpX- > { u - % ; % e e = * r gXLXLXsXgXLXLXl LXLXgXM.LXLXIX  o gXIXLXIX> - gXLXLXLX% - gXLXLXLX6X& gXLXLXLXf ; % ; ; : : r * % $ o   xXdXzXcXzXzXzXdXdXdX.XzXzX.X.X.X.X.X'..X.X|.|..X'.@X.X.X.X.X.X.X.X.X.X.X.X.X.XdX.X.X.X.X.X'.zX.XzX.XzX'..XxX@XdXdX'.dXQ.{ ' ' u y r y e r r * ; ; & o       u dXMXMXcXcXmXcXcXcXxXxXvX.XdX.X.X.X.X.X.X.X.X.X X.X.X.X.X.XxX.X.X.XxXzXzXzXcXcXzXcXcXdXvXdXdXvXdXnXdXcXdXcXxXcX%XdXdXdXzXdXdXmXzXzXcXdXdXdX.X.X.X X.X.X'. X`._.}.}.}._._._._.|.}.}.|.(.(.(.(.(.(.`.(.(.`.^._._._.(.(.^././././.~.^.~.~.~.T.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.[.T.(.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.P.U.Y.L.L.U.U.U.U.U.U.U.U.U.L.L.L.U.U.L.H.L.L.L.H.L.L.U.S.L.L.F.L.U.D.L.L.P.U.P.P.P.P.T.T.T.~.T.~.~.(.~.~.~.~././.(.(././.(.(.(.(./.(./.(.^./.^.).{.(.(././.(.(.(.(.(.[._._._._.|.|._. X'..X.XzX'.dXzXcX XvXdXcXdXcXcXcXcXdXdXmXdXdXcXzXzXvXzXdXdXcXdXdXcXvXdXcXcXcXdXzXzXxXdXdXdXdX'..X'.|.'._.|._._.`.(.|.(.(.(.(.(.(.(.(._.(._._._.",
+"Z Z Z G Z Z Z Z Z Z Z D Z Z D G Z Z H D G Z C Z D Z D Z D D D D Z S H Z Z H Z Z Z Z H Z D D D D D D D D D D D Z Z Z D Z Z Z Z Z Z Z L Z G Z Z L D Z L Z D D D D H S H H L L I Y ' pXgXgXgXgXgXpXM.{ { ' / u u t y : : r e e e : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r r r r > ; r t e : r e : e y u u n ~ ' { { { { { [ b.m.A.H.D.D.H.L.S.L.H.H.H.H.H.H.H.H.S.S.h.S.A.A.A.A.l.l.l.h.k.h.g.k.g.a.g.f.j.f.g.i.i.z.f.i.i.i.f.z.a.a.a.a.i.i.i.i.u.i.i.i.k.a.u.a.a.E z.z.a.a.a.a.a.i.a.i.a.a.u.a.a.u.a.a.d.d.a.a.a.g.i.z.a.f.a.g.z.i.z.i.z.i.d.f.g.i.f.f.z.g.k.l.g.g.A.l.A.A.A.A.H.A.G.H.L.H.L.H.L.P.P.P.U.P.U.Y.T.T.T.T.T.T.T.T.T.T.T.~.~.T.T.T.~.T.~.~.~.T.~.~.~.T.~.T.~././.).(.^./.!.(./././.(./.(.(.(.(.(.`.[.{.|._._.|.}.}.|.}.}.}.|._.(.`._._.`.(.{.(.(.(.^.(.(.(.(.(.(.`.(.`._.(.`.^.|.(.(.|.(.`.`.`.(._.(._.(.`.(.(.(.(.^.(.(.[.(.(.(.(.(./.(.^.(./.(./.(.(.(.(.(.(.`.`.(.(.`._._.|._.|.|.'.|.|.'.'..X|..X.XdX@X.XdX.XcXxXxXxXxXxXzXzXcXdXcXxXxXdXcXcXcXcXcXcXcXxXnXnXnXnXnXnXnXnXmXmXmXnXMXmXcXnXnXcXnXJXxXcXcXcXxXxXxXnXdXdXxXdXzXdXdXzXzXzXzX.XzXzX'.'.|.|.|.|.`.^.(.^./.(.(.].K $ $ % % % : : * y r 0 : * % $ $   P (.~.(.~.[.E.^.(.(.)./.(.~.~.T.T.~.~.T.T.T.T.T.T.T.U.U.T.U.U.L.L.L.L.L.Y.U.L.L.P.U.L.L.U.L.L.L.L.L.L.L.L.L.L.L.L.L.U.L.' { / Q u 0 ; ; r r q ; ' LXLXLXLXLXLXLXLXLXaXo o f LXLXLXc $ , & - t { pXIXLXLXLXM.& - gXLXLXaX- IXLXLX{ - % % * ; : : * * % % LXLXLXLXo o o $ $ % LXLXLXsXo $ sXLXLXLX& o IXLXLXgX$ - PXLXLXLXLXPXgXpX- % % % * * e : ; UXLXLXsXM.LXLXgXLXLX{ sXLXLXIX  , o - - ' pXgXLXLXLXLX% $ UXLXLXIX- % > LXLXLXM.% ; % : ; r 0 ; % $ o   nXdXdXdXzXzXzXzXdX.XdXdX.X.X.X.X.X.X.X X.X.X|..X X.X.X.X.X.X.X'..X.X.X.X.X.X.X.X.X.X.X.XxX.X.XcX.X.X.XzXzX.X.X@XdX@XdXm.' ' Q u e : r : r : * % $ o       c hXxXnXdXnXvXmXcXcXcXxXdXdXdXdX.X.X.X.X.X.X.X.X X'..X.X.XdX.X`.zXxXzXzXzXzXzXdXcXzXvXdXcXdXvX%XdXmXdXcXdXcXcXvXdXcXdXdXdXdXdXdXcXdXcXdXdXdXdXzX.XdXdX.X.X|.|.`._.}._._.}. X_._.|._._.|._.(.(.(.^.(.(.`.`.`._._._._.(.(.(.(./.(.~.~./.~.~.~.[.T.~.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.~.T.~.~.T.T.~.~.T.~.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.U.T.P.L.U.U.L.Y.U.U.Y.U.T.U.U.U.U.L.U.L.L.L.L.L.H.L.L.L.H.S.P.L.L.H.L.L.L.U.P.P.P.P.U.T.T.T.T.T.~.~.~.~.T.~.~.~.(./.(.(./.(./.~.^.(.(./.(.(././.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.`._._. X|.|..X.X.X.XzXzX.X XdXcXcX XcXdXmXdXmXdXcXdXzXcXmXcXzXzXzXnXcXdXvXcXvXdXcXcXmXzXcXzXzXdXdXzX.XzXdX.X.X X|._.|._._.(._.(.(.^.(.(.(.(.(.(.(.(._._._.",
+"Z D D C D Z Z Z Z Z G C Z D Z Z Z Z D Z Z L Z Z Z Z D D D D D D H L H H S Z J Z G Z Z Z G L D D D D D D D D Z D Z H D D Z G Z Z Z Z Z Z Z L G Z D H Z Z D D H D Z Z L D U Z / m.HXgXgXgXaXpXm.{ ' ' ^ u u e : ; r r r : > ; : : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r : : r r : : r r y t ; e y u u u u / ' { { { ' { { n.D.D.G.G.H.S.H.S.H.H.H.H.A.H.S.S.J.A.A.A.A.A.h.z.h.h.h.k.g.z.g.a.g.f.f.a.f.f.k.i.d.f.z.i.i.i.a.a.a.i.a.i.a.i.i.i.i.i.i.i.a.a.a.a.x.E a.a.a.u.u.a.i.a.i.a.a.a.a.a.a.a.d.d.x.E a.a.i.a.a.a.g.i.a.a.i.k.i.k.f.f.f.k.d.g.f.g.h.k.h.A.H.l.h.A.A.h.A.G.G.H.H.L.L.L.L.P.P.P.P.P.U.P.U.T.T.P.T.T.~.T.T.~.T.~.T.~.~.T.~.~.T.~.~.~.T.~.~.~.~.^./.^.^.(./.(.(.(./.(.(./.(./.(.(.(.(.(.(.}._.|.|.|.}.}.}.}.}.}.}._.`.^._._.(.`.(._.^.(.(.(.^.^.(.(.^.(.`.(.(.(.(.(.`._._.(.`.`.^._._._.[._._.(.`.(.(.(.(.(.(.(._.(.(.(.^.(.(.~.(./.(.(.(.(.(.(.(.(.(.(.(._._.(.`.|.|.|.|.|..X'.|.'.|.|..XdX@X.XdXdXdXdXvXxXzXxXxXJXzXxXcXcXxXxXxXnXcXcXcXcXcXcXcXnXnXnXnXnXnXmXnXcXmXmXmXmXnXmXmXxXnXnXnXxXxXcXcXcXxXxXvXcXcXdXxXxXdXcXcXzXzXzXzXdX.X.X'.|.'._._.(.`.(.(.(.{.(.(./.].S $ $ % % : : y : = r y * ; % o o P ~.(.E.(.{.{.(.(./././././.T.~.~.T.~.~.T.~.~.T.T.U.Y.T.L.U.U.U.L.L.R.L.U.L.L.U.L.L.P.U.S.L.L.L.L.S.L.L.L.L.L.L.L.L.S.S.' ' ' c u r r r r r ; ; { LXLXLXPXgXIXgXaXc + o o c LXLXLXf $ o sXIXLXLXLXIXLXLXLXpX- o { LXLXLXn LXLXPX, $ % % * % * : ; : : % LXLXLXLXo , o $ $ % LXLXLXsXo   sXLXLXLX$ , gXLXLXIX% & f IXLXLXLXLXLXLXIX- $ % ; * * e ; gXLXLXM.z LXLXLXLXLXl 6XLXLXgXo o n sXLXPXLXLXIXLXLXLX$ - gXLXLXgX$ $ $ LXLXLXpX$ % % % ; r r * $ $ &   dXzXdXxX@XzXzX'.dXdXdX XzX.XzX.X.X.X.X.X|..X X.X.X'. X.X X.X.X'..X|..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X@X.X.XzX'..XdX.X'.m.{ ' ' c y * r y = * % % o #     t xXdXdXMXJXmXvXcXcXcXcXdX@XdXfXdXdX.X.X X.X.X|. X.X.X.X.X'. X@X.X.X.XzX.XzXzXzXcXzXzXzXdXdXcXdXdXdXmXdXdXmXdX%XdXmX.XxXdXcXdXmXvXdXcXdXvXvX.XdXzX.X X@X.X.X.X'.`.|.}. X_.}._._._._._._.^.(._.(.{.(.(._.`.(.(.`.{.}._.^.^.(./.(./././.~.~.~.~.R.T.~.T.~.T.~.T.T.T.~.T.T.~./.T./.~.~.T.~.~.T./.T.~.T.~.T.~.~.T.T.T.~.T.~.T.T.T.T.T.T.T.T.T.P.P.Y.U.Y.U.U.U.U.U.T.L.U.U.L.L.U.U.L.L.L.L.L.L.L.L.U.L.L.L.L.U.L.L.L.L.P.P.L.P.T.T.T.T.T.~.T.~.T.~.~./.~.!.!././././.(.(.(.(.(.~.(././.(.(././.(././.(.(./.(.(.(.(.(.(.(.^.`._._._. X.X|..X.X.X.X.XdX XvX XcXdXcXcXdXdXcXmXdXzXcXdXdXdXzXdXcXdXcXnXnXdXcXnXcXvXdXdXdXzXdXxXxX.XzX@X X.X X|.|._._._.{.(.(.^.(.^.^.).(.(.(.(.(.(.(._._.",
+"Z Z B G Z Z Z Z Z Z Z D Z Z Z Z Z Z Z G Z H Z Z Z D D D Z Z L Z H H H Z Z Z Z Z H Z Z L Z D Z Z Z D Z D G Z D Z Z Z G Z L H Z Z Z Z Z Z G D D D Z L D D D D L D H D U Z ) m.gXgXgXgXaXpXM.{ ' c u u y y ; : e : r r r ; r r r r r r r r r r r r r r r r r r 0 e r r r r r r r r r r r r r r r r r r r r r r r r r e 0 r r r r r r t r r r r r r r r r r ; r 0 ; : ; = : r r r y u u c Q ' ' { ' { ' [ n.H.H.H.J.H.S.H.H.H.H.H.A.S.H.h.S.h.A.A.A.A.A.l.l.h.g.g.h.g.g.g.f.f.a.z.a.i.k.f.f.i.i.i.i.i.i.i.i.a.u.a.a.i.i.i.d.i.i.i.i.i.i.a.a.u.a.u.a.i.u.a.a.d.d.E x.D.E z.E a.E D.d.a.a.k.i.i.k.i.k.z.a.a.z.f.f.f.f.f.f.f.g.k.h.h.l.h.G.A.h.A.A.A.A.A.S.H.H.H.H.L.H.L.L.L.P.P.Y.P.T.U.T.Y.T.^.T.T.~.~.~.T.~.~.T.T.~.T.U.XXXXT.~.~.~.~.~.^.~./.(.(.(.(.(.(.(.(./.(.(.(./.(.(.(.^.`.`.|._._._._._._._._._.|.(._.|.(.^.(.(.`.`.(.(.(.(.(.(._.(.(.(.(.(.(.(._._._._._.|.(.`.(.|.|._.|.}._.(.`.`.|.^.`.(.|.^.(.(.(.(.(.(.(.(.(.!.(.(.(.(.{.(.(.(.`.(.|.{.|._.}.}.}.|.|.|. X X.X|.|. X.X.XdX.XdXdX.XcXzXzXzXxXdXxXdXdXxXxXxXxXxXxXxXxXcXcXcXxXmXcXnXnXnXnXnXnXmXmXmXmXmXmXmXmXnXMXmXcXcXcXxXcXcXcXcXxXxXxXxXzXxXzXzXxXcXdXzXzXdXxXzX@XdX.X X'.|._.|._.(.{.(.{.^./././.].u % $ % % * * * ; * : r % $ $   K ~.(./.(.^.(.(.(.(././.(././.~.~.~.~.T.T.T.T.T.T.T.U.U.Y.Y.L.U.L.L.Y.K.J.U.L.L.L.L.L.S.L.L.S.L.S.S.L.L.S.L.L.S.U.L.S.Y.' ' ' Q t r ; r 0 r r r { LXLXLXIX#     o   o o o c LXLXLXc o sXLXLXPX6X- - LXLXLXsX$ $ $ IXLXLXgXLXLXsX, $ & & % % y * * ; r ; LXLXLXLXo   $ $ $ % LXLXLX6X& o M.LXLXLXo o gXLXLXgX, $ , - - { 6XUXLXLXLXpX& $ ; * ; ; ; IXLXLXsX  PXLXLXLXPXo sXLXLXIX  - PXLXLXgXf $ m.LXLXLX$ $ gXLXLXPX$ , - LXLXLXsX$ $ % : % ; r * % $ $    XdXdXdXdXdXdXdXdXdXbXdXdXdXdX.X.XdX'..X|.|..X|.|..X.X X X.X|. X|..X X X.X X.X.X.X X.X.X.X.X.X.X.X.X.XdX.X.X.X.X.X%X|.m.c ' ~ c y * ; * : % $ o     o u dXnXcXcXcXMXdXcXcXcXcXcXdXxX.XdX X X.X.X X.X X.X.X|..X.X.X.X.X.X.X.XcXxXzXzXzXzXdXzXzXzXzXzXzXzXdXdXdXzX%XfXdXnXzXzXzX.XzXzXzXzXdXdXcXdXdXdXvX.X'.zX'.'..X.X|. X`.`._._.|._._._._.`._.|._.|.^.^.(.(._._._._._._._.(.(.|.`.(.(./.~.~.[./.~.T.T.~.~.~.~.T.T.~.T.~./.~.T./.~.~.T.~.~.[.~.~.~.~.~.!.~.~.~.~.T.~.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.U.Y.Y.U.U.L.Y.U.U.L.U.U.P.L.L.L.H.L.L.L.L.L.L.U.L.L.L.U.L.P.L.L.L.P.P.P.P.P.U.T.T.T.~.~.~.~.~.~.~.~.~.~.~./././././.^.(././.~.(./.(././.(.(./.(./.(./.(./.(.(./.(.(.(.`.(._._._.|. X.X.X.X.X.X.XzX.X.XvXdXcXdXdXmXcXdXdXcXdXnXcXdXzXzXcXdXnXvXnXdXdXcXdXdXdXdXdXdXzXdXdXdXdXdX.X.X|.|.|.|.|.[.|.(._.(.(.(.(.(./.(.(.(.(.(.(.(.(._.",
+"Z Z Z Z Z Z B G Z Z F Z G Z Z Z Z Z Z Z H Z Z Z H Z D D L G Z Z H Z H H H Z L Z Z Z Z Z H Z G Z D Z Z G Z Z Z D Z Z H Z Z Z G Z Z Z U Z Z D D D Z Z D D D D Z D G Z Z { gXgXgXgXaXpX} } ) n S : > r : r e ; r = = ; r r r r r : r e r r t : r r r r r r r r r r r r r r r r r r r r e q r r r r r r r r r r r r r r r r r e r 0 r r r r r r r r r r r r r r r r : = : r r r r : > y : u u Q c ' { ' { ' [ n.L.G.H.L.H.Z.H.H.H.H.S.S.H.A.G.A.A.A.A.h.l.l.h.h.h.h.g.g.g.f.f.f.f.g.f.f.i.k.k.g.k.f.k.f.k.z.a.a.i.a.i.i.i.i.i.i.i.i.i.i.i.a.a.u.a.u.i.i.i.i.a.d.z.E z.a.k.z.a.a.a.a.i.i.a.a.i.f.i.a.a.a.i.k.f.f.f.f.f.z.g.g.k.h.h.h.A.g.A.g.A.A.A.A.S.A.G.H.H.H.L.L.L.L.L.U.P.P.P.P.T.U.T.T.Y.T.T.~.T.~.~.T.~.~.~.T.~.XXT.E.~.~.~.~.^.~.!.^./././.(.(.(.(.(.(.(./.(.^.(.(.(.(.`.`.(.^._._.|.|.|._._.|._.`.`.^.(.(.`.^.`.(.(.(.^.(.(.(.(.(.(.(.(.(.(.[._._._._._._._.`.`._._._.{.|._.`.`._.(.^._.(._._.(.(.(.`.(.(.(.].(.(.(.(.(.^.`.(.(.(.|._._.^._.|._.}.|.}.|.|..X.X|.|..X.X'..X.X X XdXdXzX.XzXcXxXxXcXxXxXxX@XxXxXxXxXxXxXJXcXcXcXmXcXcXnXnXmXnXnXmXnXmXmXmXmXmXmXmXmXmXmXmXmXcXcXcXnXcXcXxXxXxXzXxXzXxXxXzXdXxXcXzXzXdXzX'..X.X'. X_..X_._.|._.`./.(.(.~.{.(.~.u $ o % % * * : t : * * % o o S (.~.(.^.~.(.(.[.(./.(./.~./.T.~.T.~.~.T.T.T.T.T.U.T.U.L.I.L.L.L.L.K.U.L.L.U.U.L.L.L.D.L.L.H.F.L.L.S.S.K.L.H.L.L.S.K.L.' ' n Q u 0 r ; r r ; r ' LXLXLXgXo     o o o   $ c LXLXLXc o HXLXLXIX{ c IXLXLXLX{ $ $ $ pXLXLXLXLXLXf $ $ $ & % % : ; y r ; * LXLXLXLXo o $ $ ; * LXLXLXpX    M.LXLXLXo   IXLXLXIX  sXgXLXPX@   - LXLXLXM.$ - % % ; * ; IXPXLXM.  gXLXLXLXgX# sXLXLXgX# c LXLXLXaXn sXPXLXLXPXo   IXLXLXLXsXn UXLXLXPXc $ o % % 0 r r * % $ $   dXdXxXdXxX.XdXdXzX'.dX'..XdXdXdX@X X X X|.|.|..X|..X|. X|.|.|.|.|.|.|.|..X|.|. X|..X.X.X.X.X.X.XzX'.'..X.X.X|..XdX|..XQ.{ ' ~ S : ; ; * % % $       w hXcXdXdXcXxXdXnXdXcXcXcXdXdXdX.XzX.X.X.X.X.X X X.X|.'. X|.|..X.X.X.X.X.X.X.XxXzXzXzXzXzXzXdXzXdXvXdX%XcXcXdXdXdXdXzXzXzXdX.XzXzXzXdXcXdXdXcX.X.XdX.XzXzX.X.X.X.X|. X`._.|.}.}._._.`.|.^.(._.(._.|._.^._._._.|._._.{._.|.(.(.^.(.(.(.~.~.^.~.~.[.T.T.^.~.~.~.T.~.T.~.~.~./././././.~.^.~./.(.^./.~.[.~.~.T.~.T.T.~.~.T.~.T.~.T.~.T.T.T.T.T.T.U.T.U.T.L.U.U.I.I.I.I.U.U.U.L.U.L.L.L.L.L.L.L.L.L.L.U.L.Y.L.L.L.L.K.L.P.P.P.P.T.T.T.T.~.T.T.~.T.~.T.^.~.~.~./.~.~.~.[./././././.^.^.(.{.(.(././.(.(././.(./.(.(./.(./.(.(.^.`.|.|.|.|.|..X.X.X X@XzX.XdXcX%XdXvXdXdXmXcXcXdXcXdXdXdXdXcXzXdXzXcXdXdXcXcXcXmXdXvXcXcXdXzXdXxX'.dX@X.X.X.X|.|._.|._.(.|.(.(.(././.(.^.(.(.(./.(.(.(.(.(.",
+"D Z Z Z Z D D Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z H Z H Z Z Z L Z L H H Z H Z L L Z Z Z L Z Z H D D D D Z Z Z L Z Z Z G Z L D Z Z Z Z Z Z H H Z Z H D D D D D G Z L Z ' aXgXgXgXhXpXM.{ ' ! u y r r e : : : r r r r r r r r r r ; r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e q r r r r * y r r r r r r r r r r r r r r r r 0 r r r = y y : : r r r r : > ; 0 y u y c / ' ! ' ' { ' ` Q.F.H.L.L.H.G.S.A.A.S.A.S.A.A.A.A.A.l.z.h.h.h.h.h.h.h.f.g.g.f.f.f.f.k.f.f.f.f.f.d.f.f.i.i.a.a.a.i.i.i.i.i.a.i.f.i.i.a.a.u.u.i.u.i.u.i.i.i.a.a.a.x.a.a.E D.a.a.a.a.a.k.a.a.a.k.a.a.a.a.k.k.f.f.f.f.f.f.g.g.z.k.l.l.h.h.h.A.A.A.A.A.A.S.H.H.A.L.H.L.L.L.L.Y.P.P.P.P.U.U.T.U.T.T.T.T.~.T.~.~.~.T.~.~.T.~./.T.~.T.R./.~./.E.{.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.^.`.`.`.(.^.|.|._.(._.(.(.^.`.`.(.(.(.(.(.`.^.(.(.(.(.(.(.(.(.(.(.(.(.(.`.(._._._._._._._.|._.|.|.|.|.|.|._._.|.|.`._._._.(.(._.(.(.(.(.(.(.(.(.(.(.(.(._._.^.^._._._._._.|.|._.}.|. X X|.|..X.X X.X.X.X.XdX'.'.dXzXzXzXzXzXzXdXnXxXxXdXnXxXxXcXcXcXxXcXcXmXnXcXmXnXMXmXnXmXmXmXmXmXmXmXmXnXmXmXmXMXcXnXnXnXxXxXxXxXxXzXxXxXzXxXzXzXxXxXxXdXzXxXdXdXdXdX.X@X X'.`.|._._._.^.(.(.(.[./././.(.Z $ $ % % * w 0 > y % % $   K /.(././.^.(.(.(./.^././././.~.T.~.T.~.T.T.T.T.T.P.T.U.U.L.L.L.U.U.L.L.L.L.L.L.L.H.L.U.L.H.L.U.D.S.S.U.U.L.L.F.U.Y.K.P.' ' ' Q t r r r r r r : { LXLXLXgXo o o   o $ , $ c LXLXLXf o aXLXLXLXLXLXPXPXLXLXsX  $ $ - LXLXLXLXIX  $ $ $ $ % % ; : 0 ; y % LXLXLXLXo $ $ $ ; - LXPXLXsX  o sXLXLXLXo , gXLXLXUXo n LXLXLXIXIXPXLXLXPX- & & % * : * ; gXLXLX7Xo M.LXLXLXsXo { LXLXIXo - LXLXLXLXLXLXPXLXLXLX$ o gXLXLXLXLXLXLXLXLXgX  o $ % % % e r * % $ o   dXdXdXdXdXzX@XdXzXdX.XdXdXdX.XdX@X.X.X.X.X.X X'.|.|.|.}.|.|.|. X|.|.|. X|. X X.X.X.X.X X.X.X.X.X.X.X.X.X.X.X|.|. X X.Xm.' / ' f y ; ; % $ o       u dXzXdXdXzXcXxXcXnXcXcXxXzXnXdXdX.X.X.X.X.X X X X X|.|..X|..X.X.X.X.X.X.X.X.XzX.X.XzXzXdXvXzXdXdXcXdXdXdXdXdXdXcXcXdX.XxXdXzXdXzXzXzXdXzXdXdX.XdXdX.XdX'..X'..X.X X'.|.|. X_.}.}._._.^.`.`.(.(._.^.{._._._._.^._.(._._._.^.(.(././.(.(.~.^.~.~.~.~.~.~.~.~.T.T.~.^.~././.(./././././.^././.~.~./.~.(.[.~./.~.T.~.~.T.~.T.T.~.~.T.~.T.T.T.T.T.T.T.U.T.Y.U.U.Y.Y.T.T.U.T.P.U.L.L.L.L.L.L.L.L.L.L.P.U.L.L.L.L.U.L.U.Y.L.L.L.P.P.T.T.T.T.~.T.T.(.~.T.T.~.~.~.~.~.~.~.~././././.(.[.(.E.(.(./.(.(.(.(./.(./.(./.(./.(./.(.^.^.{._._.|._. X.X.X.X.XdX.X.XdXdXdXdXdXmXdXdXvXdXvXcXdXxXcXxXdXzXzXzXdXdXnXdXdXdXcXdXcXvXdXdXcXxXdXdXdX.XdX.X.X|.|. X|._._._.(.(.(.(.(.(.(.(.(./.(./.(.(.(.(.(.",
+"Z Z Z Z Z C D Z Z Z D Z Z D Z Z G Z Z Z Z Z G Z H Z Z H G Z Z Z H Z L Z L Z Z H Z Z C G Z Z D D D D D Z Z Z Z D Z Z Z G Z D D Z Z H Z Z G Z H Z D D D D D D Z Z m.fXgXgXsXpXpX{ ' c u t y r r ; y : r r r r : : r r r ; : e ; y r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r r r r r r r r r : r : : t r r r r 0 r e = 0 > r u > S c c ' ' ' ' ' Z.S.L.H.A.H.H.H.S.A.S.S.A.A.A.G.A.A.A.h.h.h.h.h.l.h.h.g.g.g.k.f.k.k.z.k.f.f.k.d.z.k.k.a.a.a.a.a.i.i.d.i.f.i.i.i.a.i.u.u.i.i.u.u.u.u.i.a.a.a.a.a.a.a.a.a.a.d.a.a.a.a.a.i.f.i.i.k.a.a.i.a.f.f.f.f.g.f.g.g.l.l.l.l.A.A.D.A.g.H.A.A.A.S.A.H.H.H.L.H.L.L.L.L.P.P.P.P.P.Y.P.T.T.T.T.~.~.~.~.T.~.(.T.T.[.~.T./.~.~./.~././.(.(.(.(.^.`.(.(.(.(.`.(.(.(.(.(.`.^.^.^._._.{.|.(._._.(.`.`.(.^.(.(.(.(.(.(.|.].`.(.(.(.(.(.(.(.(.(.].^.^.`._._.(.|._._.{.|.|._.|._.|. X_.|.'.|._._.|.{._.|._._._._.|.^.|.(.(.(.(.(.(.(.(._.`.^.`.|.{.|.|.|._._.|.'.'.|. X.X X.X X.X.X.X.X.X.X.XdXdXzXzXzXzXxXxXxXxXxXxXfXnXcXcXxXxXcXcXcXcXnXmXmXnXMXMXnXnXmXmXMXmXmXmXmXmXMXmXMXnXnXmXnXmXcXxXxXnXxXxXxXxXxXxXxXxXxXxX@XdXcXzXdXxXdXdX.XdX'..X X`.|.`._._.(.(.(.(.(./.(.[._.].u $ $ % % * * : : % % $ o S (.~././.^.^.(.[.{././././././.T.~.T.T.T.T.T.T.U.Y.P.U.I.I.I.L.L.L.L.L.U.L.L.L.L.L.L.L.H.H.K.H.H.L.L.S.H.S.L.L.S.L.D.n.{ ' ' / i r y r ; = r y ' LXLXLXIXo   , o $ $ $ $ c LXLXLX'   - gXLXLXLXIXn sXLXLXgXo   $ $ aXLXLXPXsX$ o o $ % % * = ; y ; * 0 LXLXLXLXo o $ $ % % LXLXLXM.$ o M.LXLXLXo o IXLXLXgX$ o { IXLXLXLXLXLXgXd $ $ $ % % % ; ; gXLXLXsX$ c LXPXLXw   sXLXLXgXo o { PXLXLXLXsXn LXLXLXc   IXLXLXUXHXLXLXLXHX- o $ $ $ % * ; r * % $ o   dXdXdXcXzXzXdXdX@X.XdXdXzXdX.X.XdX.X.X X X.X|.|.|.|.|.|.|.|.|._.|.|._._.|.|.|.'..X|.|..X.X|..X|.'. X.X X.X|.|. X X X.Xm.' ' c u t * % % o       ; hX'.zXdXxXzXdXxXvXcXcXcXnXdXdXdXcXzX.X.X.X X.X X.X|.|.|.|.'.|.`..X.X.X.X.XzX.X.XzXxX.XdXzXdXzXcX.X.XzXdXdXdX.XcXdXdXdX'.zXzXzXzXzXzX.XzXzXdX#X.XdXdXdXzX@X.X.X.X X|.|.|.|.'.|.}.}._._._.(.`.{._.|.(.(._._._._._._.`.`.^._.`.(.(.(.(.(.^.[./.~.~.~.~.[.~.~.~.~.~.~.T.E././././.(./././././.~.(./.~.[.~./.~.~.~.~.T.~.~.~.~.T.T.T.~.T.T.~.T.T.T.T.T.U.Y.U.U.Y.U.U.P.U.U.T.P.U.U.U.L.L.L.L.L.L.L.P.P.P.P.L.U.U.Y.L.L.L.L.L.L.P.U.U.T.T.T.T.~.T.T.T.~.~.~.R.~.~.~.~.~.(.~.~././.!.~.^.{.(.(.(./.{./.^././././.(./.(././.(.^.(.(.(.{.|.|.|.|..X.X.X.X.X.XdXdXdXdXdX XdXcXdXcXcX.XcXdXcXdXdXzXzXvXcXdXnXdXcXdXcXmXdXdXcXdXdXdXzX.XdXdX.XdX.X.X|.|.|.|.{.(.(.(.(.(.(.~.(./.(.(./.^./.(.(.!.(.",
+"Z Z Z G Z Z Z Z Z Z B D Z Z Z Z Z Z Z Z Z Z G L Z Z Z Z H Z H L Z H L Z Z Z Z Z D D D D Z Z Z D G Z D D H Z D Z H Z Z Z Z G Z Z Z S H U D D Z L D Z L Z Z A ' gXgXgXgXaXpX{ ' / u y : r r y r r = r : y e * r = r 0 r r ; ; r ; r r r : e r r r r r r r r r r r r r r r r r r r r r e 0 r r r r r r r r r r r r r r r r r r r r * t r r = r r r 0 y = ; e ; r r r r r r r r r r : 0 r r r y r r y u u / ' Q ' ' ' ` F.L.H.S.D.D.G.G.A.S.G.z.A.A.A.j.A.A.j.j.h.h.z.k.h.h.k.k.h.f.k.h.k.k.g.g.g.k.i.k.f.i.a.a.a.a.s.a.i.a.a.f.i.i.a.i.u.u.u.u.i.i.u.u.a.u.i.a.a.a.a.a.a.a.a.a.a.a.a.a.a.z.a.k.k.i.z.i.k.d.k.a.f.k.k.k.h.k.h.h.h.h.A.h.A.A.A.A.h.A.S.S.H.H.S.H.H.L.L.L.L.P.L.P.P.P.R.Y.T.R.T.T.T.~.~.~.R.~.~.~.~.~./././.R./.~.~.~.~.(.(.(.(.(.(.(.`.`.^.|.|.(.|.(._.(._._.|._.(.{._.^.(.(.(.{.(.(.(.(.{.(.(.{.(.{.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.|.`._._.|._.|.|.'.|.|.|.|.`.`.'. X|.}.}.{.}._.^.{.^.|.(.(.(.^.`.`.(.(.(.|.^._._._._.|.|._.|.|.[.|._.|.|.|..X|..X.X.X|..X.X.X.X.X.X.X.X.XzXzXzXvXxXxXcXxXxXdXnXnXxXxXxXxXcXnXnXcXmXmXMXmXmXmXmXmXmXMXMXMXMXMXmXMXmXmXmXJXcXMXvXvXnXnXdXcXcXxXcXzXdXcXzXcXcXzXzXxXzXzXzXzXzXzX'.zX.X.X.X.X`.|.|._._.(._.(.(.[.(.(.{.^.(.u & & % % ; ; * % % o o K (.^././.(.(.(.(.(.(././.^.~.T./.T.T.T.T.T.U.T.T.U.T.U.Y.Y.L.L.L.L.U.L.Y.L.L.L.L.F.H.H.H.L.H.U.Z.H.L.H.L.S.U.Z.L.L.L.L.' ' ' c e r r 0 * = t % e % - $ o o o o $ $ % % % % % - $ o $ $ o w ' z o +     $   o o   , gXLXLXLX-   o $ $ % % * r r r ; r = e - - $ o $ o $ * * % % $ $ $ $ $ $ o $ $ $ o o o $ o $ $ $ > n c n -   o o $ o % % ; ; * * - - $ $ $ o o o o o o o o   $ $ $ $ ~ c - $   o   o ,   IXLXLXgX+ - n -   o $ o $ & % * ; r * , $ o o dX@XzXzXdXdX@XxXdXdXdX.XdXdX X.X.X.X.X X X X|.|.}.}.}.|.}.}.}.}._._._._.|._._.{.|.|.|.'.|.|.|.|.|.|.|..X|.'.|.@X X`..Xn.' ' / u * * % o       t dXdXdXdXxXdXcXdXdXxXcXxXdXdXxXdXxXdXzX.X.X'.'.|.|.|. X X|. X.X|.|..X|..X.X.XdXdX X.X.XzXzXzXxXdXzXzXzXzXdXdX XdXdXdXdXdXzX.XzX'.xXxX.XzXzX.XzX'..X.XdX X.XdX.X|.'..X|..X|.`.|._.|._.}._.|._.|.^._.(.|.[. X`.`._.(.`.^.(.|.(.(.(.(.(.(.^./.(././.(.~.(.T.~.~.T.~./.~./.~.(././././././.(.(./.(././././.^./././.~.T.~.T./.~.~.T.T.~.~.~.T.T.T.^.T.T.P.Y.P.Y.I.U.T.U.T.T.U.U.U.U.I.I.U.U.L.L.U.L.L.L.Y.U.U.L.U.U.L.U.L.U.L.U.L.U.U.T.T.Y.~.T.~.T.~.~.~.~.~.[.T.~.T.~.~.~.~.~./.!./././.(.(.(.(.^.{.^.`.(./.(./.!.(.(.(./././.(.(.^._._.`.'.|. X.X.XdX.XdX XdXdXdXdXdXdXdXcXzXzXcXzXzXcXzXcXzXzXvXdXdXdXxXdXdXcXdXcXdXdXvXdXzX'..XxXzX|..X.X X|.|.|.|.^.`.^.(.(.(././.(.(./.[.(.(.~.(./.(.(.",
+"Z Z Z V Z G Z Z Z Z Z Z B Z Z Z Z D Z Z Z Z Z Z Z L Z J Z L Z S Z Z Z Z Z L Z L D D D Z D D D Z Z D Z Z Z Z Z Z Z H H L Z L L Z Z Z H Z Z D Z Z H H Z Z H [ gXgXgXaXpXM.' / u t r e r : r r r r r e e : r r 0 r e r ; e e r r r r r r r q r r r r r r r r r r r r r : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r y 0 r r r r 0 r r * y e ; y 0 y r r r r r r r r r : r r r r r r e e y u ~ c Q / c ^ _ Z.L.A.D.D.A.A.H.A.A.G.A.A.A.G.g.G.G.j.g.j.z.h.h.k.z.f.k.g.k.k.k.k.k.g.d.k.z.i.f.k.a.a.a.a.a.i.i.a.a.a.a.i.i.u.a.u.i.u.u.u.u.u.u.a.i.a.a.a.a.a.a.z.d.a.a.a.a.a.k.u.d.i.f.i.i.z.f.f.f.k.k.f.h.k.h.h.h.h.h.h.A.A.A.g.A.A.S.G.A.S.A.S.S.H.H.H.D.L.L.A.L.U.P.P.L.T.T.L.T.T.T.~.~.~.(.T.~.~.~.~./.!./.~././././.^.~.(.^.(.^.{.`.|.^._.(.|.^./.|._._.(.(.(._.(.{.{._._.(.(.(.(.(.(.(.(.(.(.{./.(.(.(.(.(.(.(.(.`.(.(.(.`.(.^.(.(.`.`._._._.|._.'.|.|.|.|.@X|.'.|.|. X}.}.}.}.|._.`.`.{.(.(.`.(.(.^.|.^.|.(.|.(.|.|._._.{.|._._.{._.|.|..X X|..X X|..X.X.X.X.X'.@X.X.XfX.XzXzXcXcXxXxXzXcXcXcXxXxXxXxXxXxXnXcXnXnXmXmXmXmXmXmXmXmXmXmXMXMXMXMXMXMXMXmXxXmXnXnXMXnXnXdXnXfXxXxXcXzXdXzXzXzXzXxXxXcXcXzXzXzXzXzXzXdXzX.X.X.X.X'.|.|.`._._.^.(.(.(.(.!.(.{.(.t & $ % % * % ; % o o K (././.(././.(.(././.^./.~.~.^.R.T.~.T.T.T.U.U.U.U.U.L.K.L.U.U.L.L.L.L.L.L.L.L.L.L.L.L.H.S.L.H.A.L.H.H.S.L.D.L.L.U.S.L.{ ' ' Q t e r : y : r r : ; ; $ $ $ $ $ $ & & % * 0 % % % $ , $ $ $ $ & o $ o o o o $ gXIXIXLXLXLXaX  o o $ o % : ; r r r r 0 * ; % $ $ $ o , $ * * % % % $ - $ $ $ - $ $ o - , $ $ $ $ $ $ - $ $ $ $ o o o $ & % % ; ; ; * % % % $ $ $ $ , o o o o $ $ $ $ $ $ o & $ o $ o o   $ o gXLXLXIX  $   $ $ o $ $ $ % % % ; r ; % $ &   dXzXzXdXdXdXdX.X.XdXdXdX.XdXdX@X.X.X X'.|.|.|.|.}.}.}.}._._._._._._.|._.}.|.|.|.|.|.|.|.|.|.|.|.`.`.`.`._..X`.`. X|. Xm.{ ' ^ > % & o       u '..X.X X@XdX XdXdXxXdXxXxXxXdXdXdX@XdX.X X.X.X.X|.|..X|.|.|.|.|.|.'..X.X.X.X.X.X@XdXdX.XdXdXdXzXzX@XdXdX.XdXdXvXdX#XdX.XdXdXdX'..X.X.XzXxX.XzX.XzX.X.X.X@X.X.X.X.X.X|.|.|.`.|.|._._.|._.}._.^.(.|.{._._.|.`.(._._.`.(.|.`.|.^.(.(.(.(./.{.(./.(.!.T.(.T.(.(.~.~./.~.~./././././.(./././.(./.(././.(.(././.~.(.~././.T.~.T.T.~.~.~.T.~.~.T.T.T.P.T.T.T.T.T.Y.U.U.Y.T.L.T.Y.U.U.U.U.U.I.K.Y.L.L.L.Y.L.L.U.U.Y.U.P.Y.Y.L.U.L.L.P.L.Y.T.T.T.T.~.T.T.T.T.~.T.~.~.~.~.~.~.~.~.~.~././././././.(.].(.(.(.^.~.(.^./.(././././.(.(.^.(.(.`._._.|. X.X|..X.X X.X.X@X.X XdXdX#XdXdXdXzXzXdXzXdXdXzXzXzXzXdXzXdXdXcXdXdXdXcXdXvXdXdXdX.XdX.X.X.XzX.X.X.X'.|._.(.(.`.(.(.(./.(./././.[.(./.(././././.(.",
+"F Z Z Z Z Z G Z Z Z B Z Z Z Z G D D G Z Z H Z Z Z Z L Z Z L P Z L H H S Z H Z S D A H A D D Z Z Z Z Z D Z Z Z Z Z Z Z Z Z Z G Z Z H Z Z D Z G G Z H Z P m.gXgXgXaXpX{ / n t u > r 0 ; r r r r r y r = e 0 e ; 0 ; ; e r r = * y r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r e 0 r r r r r r r r r r * e r r r r ; r e e ; ; * r r r r r r r r r r r r r r r r r r r e r : y y c S Q J K / ~ [ H.D.l.K.A.A.A.F.A.S.A.A.j.A.j.A.g.h.g.h.h.h.z.l.z.h.k.k.k.k.k.k.k.k.g.f.k.f.i.a.a.a.a.i.a.a.i.a.i.s.s.i.u.u.u.i.u.i.u.u.u.u.a.i.a.a.a.d.d.a.a.k.a.a.a.i.k.a.a.i.k.f.f.z.f.f.f.k.k.k.k.k.h.l.h.h.z.A.A.A.A.A.G.S.A.H.A.G.S.H.H.D.H.L.G.L.L.L.U.L.L.U.P.R.Y.T.T.T.~.~.~.(.~.~.~.~.~.~.(./.(././././././.(.^.(.(.|.|._.|._.`.|.{.|._.{._._._.`.`.(.(.(.(.(.(.^.(.(.(.(.(.(.{.^.(.(.(.{.(.(.(.(.(.]._.(.(.(.(.^.(.|.^.^.|.(._._._.|.|..X|. X|.|.|.|..X|.|.|.|._.{.}.{.}.^.^.|.(.(.`.(.^.{.`._.{._.(.(.|.|._.|.|.|._.|._.|._. X|.|..X.X.X|. X.X.X.XdX.XdX.XdX.X.XzX.XzXzXzXxXxXxXxXzXcXvXcXxXnXcXcXcXnXnXmXMXmXmXmXmXmXmXmXmXmXmXMXmXmXmXmXmXmXnXmXmXcXxXnXnXJXcXcXxXxX.XzXcXzXvXzXzXxXzXzXzXzXzXzXzXxXdXdX.XzX.X.X.X|.|.|.|.`._.{.(.(._.(. X/.^.{.(.u , $ $ ; ; - $ $ o K (.(./.(.(.(.(././.(./.T./.~.~.~.T.T.T.T.T.T.T.U.T.U.L.U.U.L.Y.L.L.L.L.Y.U.H.H.L.L.S.L.H.F.H.S.Y.H.H.L.F.L.L.S.L.L.U.S.' ' ' Q u = : r q 0 r e : ; ; % $ $ $ $ % * * * : * % % % & $ $ & & $ $ $ $ o , , $ o aXLXLXLXLXPX- o o o $ $ % : r r r r e r r * % % $ $ $ & % % * ; % % $ $ & & , % $ $ $ $ $ % $ $ $ $ $ % o $ $ $ $ o $ $ $ % ; ; ; ; * % % $ $ $ $ $ $ $ o $ $ $ $ $ - $ % $ - $ o $ $ $ o $ o IXLXLXgXo o $ o o $ $ $ & % % ; r e % % % o   dXdXzXzX.X.X.X.XdXdXdX.X.X.XzX.X.X.X|. X}. X}.}.}.[.|._._._._._._._._.|.|.}._.|._.|.|.|.`.|.|._.|.|.|.`.|.|.|._. X X'.m.' ' ! : % o       w '..X X@XzX'.@XdXdXdXzXzXdXdXdXcXdXdXfX.XzXzX.X'.|..X'.|.|.|.|. X|.'.|. X'..X.XdX.X.X.XdXdXdXxXdXzX.XdXdXdXdX.XdXdXdXdX#XdXdXdXdXdXdX.XxX.X.XdX'..X.XdX.X.X.X.X.X'..X.X'.`.|.|.|.|.|. X}.}._._.{.(.|._.|._._._._._._.(.|.(.(.(.`.(.(.(.(./.(.(./././.~./././.(.~./.~.~.~./././.(././.(.(.(./.(././.(.(./.(./.~.~./.~.~.~.~.~.~.~.T.~.~.T.~.~.~.T.T.T.Y.T.T.P.U.U.T.U.U.Y.U.U.U.I.I.Y.U.U.U.L.L.Y.L.L.P.U.P.U.P.T.P.Y.P.U.L.L.L.P.Y.U.Y.T.~.T.T.T.~.T.~.T.~.T.~.T./.~.~.~.~.~./.~./.(./.!.(.(.[.{.(.(.(.~.!.(.(././././.(./.(.(.(.^.`._._.`._..X|..X.X'..X.X.X.XdXdXdXdX.XdXdXzXzXzXzXzXzXzXzXzXzXzXzXcXnXzXzXcXcXdXcXdXcXcX.XdXzX.X.X.X.X.X.X X|._.|.`.`._.^.(.(.(.[.(./.!.(.(.(./.(.(.(././.",
+"Z Z Z Z D C B Z Z Z Z Z Z Z Z Z Z D Z G Z Z Z L J Z Z L L Z L Z H Z Z L H Z L L D D D Z D Z F Z Z H Z H Z D H Z Z Z G Z L Z Z Z Z Z Z H L Z Z Z H D S hXgXgXaXpXM.' c u y t : : r r r r r r ; 0 ; r * r r 0 r 0 y y ; r * 0 y * r r 0 e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r * r r 0 r r r r 0 r r r e * r r r r r 0 e r r r r r r r r r r r = : y r e y u u S c c ^ u T F.A.g.L.A.S.S.S.A.h.A.A.A.G.j.A.h.G.h.h.z.f.h.h.k.k.g.g.g.h.g.g.k.d.z.k.z.k.a.a.a.a.a.a.i.a.i.i.i.p.i.i.u.u.u.i.u.u.u.u.u.i.i.i.a.a.k.z.E x.a.d.k.a.a.i.d.x.f.f.f.k.k.k.k.k.z.k.k.f.k.h.z.l.h.D.h.A.A.A.A.G.A.A.A.S.G.G.H.H.H.H.H.H.P.A.L.L.U.P.U.P.I.T.T.T.T.T.T.~.T.(.(.~.~.~.~.)./././././.(.(.(.(.(.^.`.^.{.{._.^.`.|.(.^._.|.{._.(.`.^.|.(.(.(.(.(.(.(././.^.(.(./.(.(./.(./.(.(.(.(.(.(.(.(.(.{.(.^.`.(.(._.[._._.|.|.|.|. X X X.X.X.X|.|.|.|.'._.|.}.}.}.}.}.(.(.|.(./.|.|.(.|._.(._.`.|._.`.|.|.|.|.|.|.|.|.|.|.|..X X|..X|.|. X|..X.X.X.X.X@X.XzXzXzXzXzXvXxXxXxXxXcXcXzXzXxXdXcXcXcXnXnXnXmXmXmXmXmXmXmXnXmXmXmXmXmXmXmXMXmXmXmXmXmXmXmXnXcXcXcXcXxXxXzXzXzXzXzXzXzXzXzXzXzXxXzXzXzX.XzX.X.XdX.X.X.X.X.X_.}.}._._._.[.(.(.`.^./.|.`.hXu $ $ % % & $ $   ~ /.(././././.(.(.(.(.^./.~./.T.T.~.T.T.U.U.T.L.U.U.T.L.L.L.Y.U.L.Y.L.L.L.L.L.L.H.L.H.S.L.H.L.L.H.H.H.H.L.S.L.L.U.Y.S.L.' ' ' / w : r : : r r r : ; % % $ % $ % % % > * * ; : * % % % % % & % - , $ $ $ & $ $ c gXIXgXsX> $ o o o $ % % : r = r r > ; ; ; = ; % & & % % > ; : - : % $ % % % % % - & % $ % & % & % % % % $ $ $ $ , $ & % ; ; ; ; ; > * * % % , % $ , % $ $ % % $ $ $ & % % $ $ $ $ $ $ $ o o { pXsX6X  ,   $ $ $ $ % % % * ; r ; ; % $ o   cXdXzXdX.XzXzX.X.X.X@X'..X.X|.'.|.'.|.|.}.}.}.}.}.}._._._.}._._._.|.`.`.}.}.|.|._._._._.`.(.(.`.(.^.|._.|..X{.|. X_.'.n.' c u % o   #   t hX.X X.X'.`.dX'.dX'.dX.XzXdXxXdXdXdX@X.X.X.X.X.X.X.X X|..X.X|.'.|..X|..X|..X.X.X XdX.XdX.XdXdXdX.X.X.XdXdXdX.XdXdXdX.XdXdXdX.XdX.X.X.X.X.X.X.X@XzX.XzX.X.X.X.X.X'..X X|.|.|.`.|.|.{.|.}.}._._.|.|.(.`.(.(.|.`._._._._.(.|.(.|.(.(.(.(.(./.^./.^./.(./././.~.~.~.~.~./.~././.(./.(.(.{.(.(.(.(.).(.(.(.(.(.^.(./.(././.(.~.~.~.~.T.[.T.~.~.~.T.~.T.T.P.T.P.Y.P.Y.U.U.U.U.U.P.U.I.I.I.I.U.U.U.U.U.U.L.Y.P.P.U.U.T.P.Y.P.P.U.Y.U.P.U.L.!.T.T.T.~.~.^.~.T.T.~.T.~.T.[.T./.~.~.~.[./.~.!./.(./.(.(._.[.(.^.^.`.(././.(.(.(.(.(.(.(.(.(.(.^._._.`.|.|..X X.X'..X.X.XdX.X XdXdXcXvXdXzXzXzXzXzXzXzXzXzXzXvXfXdXdXcXzXcXdXcXdXdXdXdXdXdXdX.X.X.X.X.X.X|.|.|._._.`.|.(.(.(.(.(.^.(.(././.^.(.(.(.(././.",
+"Z D Z G B Z C D Z Z C D Z G D Z D D Z Z G H Z Z Z Z H Z L Z S Z L Z Z S Z Z Z S D D D D D D D Z Z D D D D Z Z Z Z H Z Z Z Z L Z H Z Z L Z H H H Z P hXgXgXaXpX{ ' u y y = r r r r ; r r r r r r * e e : ; e * > = r r = r y r ; r r r r r r r r r r r r r r e 0 r r r r r r 0 r r r r r r r r r r r y r r r r r r r r r r r r r * r r r r r r e * r = 0 ; 0 e ; r r r r r r r r r r r r r 0 r r y : y r r r y y y c S u S S Z Z.G.A.h.S.A.A.A.A.h.A.A.j.g.A.A.h.h.h.h.h.f.l.f.h.g.f.g.k.k.g.z.h.f.f.a.g.f.a.a.a.a.a.a.a.i.a.i.s.u.u.u.u.i.u.u.i.a.u.u.i.i.a.a.a.d.a.k.a.k.k.a.k.k.a.k.a.k.k.d.k.k.k.k.k.k.k.h.h.h.h.h.h.h.A.A.h.A.A.A.A.A.S.S.S.A.L.G.S.H.H.H.H.S.L.U.L.I.L.U.T.I.T.T.T.T.~.~.~./././.(.(.!.(./.(.(./.(.(.(.^.|.(.`.(.|.(.|.|._.|._.(.|._._.(.|.|.`.{.^.^.(.(.(.(.(.(.(.(.^.[.(./.(.{.~.{.(./.(.(.(._.(.(.(.(.(.(.{.(.`.`.(.}.}.|._.|.|.'.|.|..X.X.X.X.X.X|.|.|.|.|._._.`.{.|.(.|.|./._.^.|.(._.|._.(.|.`.(.|._.|.`.|.`.{.`.`.`.|.|.|. X X.X|.'..X X|.'. X.X.X.XdXdXdX.XzXzXdXcXdXcXxXxXxXxXdXcXxXxXxXcXcXcXmXcXmXmXmXmXmXmXnXnXmXmXMXmXmXMXMXnXnXmXmXmXmXnXnXnXcXcXcXcXvXxXzXzXzXzXzXzXzXzXzXzXzXzXzXdX.XzXzX.XdX.X.X.X.X.X.X|.|.}.`._._.(.(.(.(.`.|.^.(.`.'.u $ $ - % $ $   S (././.(./.(./.(.!././.~./.~.T.~.T.T.T.T.U.U.U.L.L.L.L.Y.L.U.Y.U.Y.L.U.L.L.L.L.H.L.H.L.H.S.F.H.H.K.H.U.H.L.L.S.S.L.P.P.{ ' n / u : r r r 0 r : : ; ; % % % % % e ; ; e ; * : % : % % % % % % & % & $ % $ % % % & & o - , o $ $ $ % % ; ; ; ; r r 0 r r ; % % % - % % : % % : > % % % * % % * % % % % % % % % % % % ; % % & % % % % % % % * * r e % : % % w & % % % % % % % % % % % % % % % % % & & , % & % % $ & o $ $ $ $ $ $ % % % ; ; : t : * % $ o   dXdXdXdXzXzX.X.X.X.X|..X.X|.'.|.|.|.|.|._.|._.}.`.`.`.(._._._.|.(._._.`.}.|.}.^.`.`.(._.^._.(._.`.(.|._._.'.|.|. X`. Xn.~ u : &       e '.'..X`..X.X.X X.XzX.XdXzXzXdXzX.X.X.XzX.XdX.XdX.X.X|..X.X|.|.|.|.'.`..X|..X.X.X.X.XzXdXdX'.zX'.xXzX@X'.dX.XdX.X.X.XdXdXdXdX.X@XdX.X.X.XzX.X.XdX.XdX.X.X.X.X.X.X|..X.X.X|.|..X|.|._.|.|._._.|.^._.|.^.{.`.(.|._._._.`.^.`.(.|.^.(.(.(.(./.(.(.(.^.(././.!./././././.(./.^./.(./.(.(./.(./.(.(./.{.{.^.(.(.(.(.(.^.[././././.~.~.T.~.T.~.T.T.T.~.T.T.T.T.Y.T.U.P.Y.Y.Y.P.P.P.P.P.I.I.I.I.T.U.U.U.L.Y.Y.L.U.L.T.T.T.P.T.P.P.P.P.P.P.Y.P.T.T.~.~.T.T.~.~.T.T.~.~.T.T./.T.~.~.~./././.~.!././.^.(.(.(._.(._.^.(.(.(.(.(.(.^./.(./.(.^.(.`.`._.|._.|.|.|. X.X.X X.X.XdX X.XdXzXzX.XzXxXdXxXdXdXdXzXdXzXzXzXzXxXzXcXdXcXzXzXxXcXcX XdX.XzX|..X.X.X.X'..X`.`._._.`.(.(.(.(._.(.(.(./.(.^.^.[.).(.(.(.!.",
+"G C Z Z Z Z D Z Z Z D Z Z B Z Z Z Z Z H Z Z Z G Z S Z H Z L L Z L Z L Z H Z H H D Z D D D D D D D Z D D D D D D Z Z Z H L Z Z Z Z L Z L H L Z S _ gXgXgXgX{ { ! u u y y r r : y r 0 0 r r r r r y r : > t { { { u e : - 0 * r r r r r r r r r r r r r r r r r r r r r r q e e r r : r r r r r r r r * : r r r r r r r q r r r r : r r r 0 r ; * ; ; e 0 r r e r r r r r r r r r ; 0 ; r r r r r : * * r r e e r y S u u n y S S Z.H.h.l.G.l.D.A.A.A.A.A.G.A.A.h.h.h.h.h.h.f.l.k.g.g.z.g.g.z.g.z.z.a.f.f.f.a.a.a.a.a.i.i.i.i.p.u.u.u.u.u.i.u.u.u.a.u.u.i.u.i.i.a.a.d.a.d.a.a.k.a.a.k.k.a.f.k.g.g.z.h.h.z.z.h.h.h.h.h.h.h.l.h.h.A.A.A.A.h.A.Z.S.S.A.S.G.G.H.H.H.H.L.H.L.L.L.I.U.U.T.I.T.T.T.~.T.~.T././.~.(.(.(.).(.(.(.(.(.^.(.^.^.|.(./.|.(.(.|.|._._.{.|.|.|._._.(.|.(.(.^.^.`.(.(.(.(.^.(.(.(./.(.)./.^.^.{.(.!.(._.].(.(.(.(.(.(.(.(._._._.|.|.|._.|. X X.X X.X.X.X.X.X|.|.|._.|.|.|.`.|.|.|.`.`.`.(.`.(.`.`.(.|._._._.|.|.|.`.|.`.|.`.`.`.|.|._.|. X.X|.|. X|.|..X.X'..XdX.X.X.XdXzX.XzXzXzXzXdXnXxXzXzXnXnXxXxXxXcXcXnXnXnXcXmXmXmXmXmXJXmXmXmXmXmXmXmXnXnXnXmXmXmXnXnXnXnXcXcXcXcXxXnXdXzXzXzXzXzXzXzXzXzXzXzXzX.XxX.X@XzXdX.X'.dX.X.X X|. X`.|._._._._._.|.^.^.'.|.|.|.^.u % $ $ $ o o ( /././.(./././././.(././.~.~.~.R.T.T.T.T.T.U.U.U.U.Y.U.U.Y.L.L.L.U.L.L.L.L.S.S.S.H.L.H.L.L.L.H.K.h.H.K.U.L.L.U.L.L.F.P.' ' ' c u y : r r r r r = ; ; ; ; ; % ; % * r r r ; ; : * * % ; % % % ; * % % % % % ; % ; ; % % $ $ o $ $ % % ; ; = ; ; r q * y ; r r % ; : % : : ; : 0 0 % * * r % * r % ; * * % * % ; % ; - % % % % % % % % ; ; ; r r * ; t * 0 % ; 0 * e % ; * = % * * * ; ; % ; % * % % > * ; * % % % $ $ $ $ o $ $ > ; % ; ; * r : * % o o   dX@XdXzX.X.X.X.X.X|.`.`.`.|.|.`.|._._.|.|._.}.{.(.(.`.`.[._.`.^._._._._.[.`.|.(.(.`.(._.|._.|.`.|._._.|._._.^._. X|._.m.c t %       e '.'.'.`.`.'..X.X|..X.X'..X.X.X.X.XxXzXxX.XdXdX.X X.X.X.X|.|.'.|.'..X`..X`..X.X.X.X.X.X.X@X.XdX@XzX'.dXdXdXdXdX'.@XdXdX.X.X.X.X XdX@X.X.XzX.X.X.X'..X.X.X.X.X.X.X|..X|..X|.|.|.|.|.|.|.|._._.`.`._.|.^.|.`.(.(.{.(.`.^.`.(.(.^.(.(.(.(.(././././.(.(.(.(././.~.~./././.!./././.^././.(.(.(.{.{.(.(.^.^.(./.(.(.(.(.^.E.(.(././.~.~.~.~.~.T.~.[.T.T.T.T.T.T.Y.P.P.P.U.P.P.P.P.Y.P.P.R.Y.I.I.U.U.U.U.U.Y.U.U.P.Y.U.U.T.Y.Y.P.Y.Y.P.U.U.Y.T.T.T.T.~.T.^.T.~.T.~.T.T.~.T.T.~.~.~.T.~././././././.~.[.[.(.[.(.(.(.(.(.^.(.(.~.!.).(.(.(.(.`.(.(.^.{._.|.|.|.|.|.|..X.X.X XdX@X.X X.XdX@XdXdXdXdXdXcXdXdXzXzXzXcXcXdXzXcXzXzXcX.XdXdXdX%XzXzXzX.X.X.X|.|.|.|.|._.|.(._.(.(.(.(.(./.(.(.(.(.^.(.^./.(.{./.",
+"B Z D Z Z Z Z Z Z G B Z Z Z Z Z D Z Z Z Z H Z Z L L Z Z H Z H H Z L L H L Z Z H D D D D D Z D D H D D Z D Z Z H Z L Z L L Z H D Z H G Z L Z c _ gXgXaXpXM.{ u ^ > ; ; ; y r r r r r r r 0 r : r ; y aXPXLXLXLXLXLXIXM.; t : ; r r r r r r r r r r e 0 r r r r r r r r r r r r r r r r r e r r r r r r r e r r r r r : r r r r r r r r r r r r r * } gX; r ; r r r r r r r r r r 0 r r r r r r r y : : : r r r r y > > n u u u u Z F.S.Z.G.D.l.h.A.A.j.A.A.g.h.A.h.G.g.h.h.h.l.l.k.h.l.z.h.g.g.g.j.a.j.f.f.a.f.f.a.a.a.i.i.t.s.u.a.u.u.u.u.i.u.u.u.i.i.i.a.u.a.a.a.a.a.a.a.a.k.a.k.a.k.z.z.g.g.k.h.h.l.l.h.h.h.h.h.h.g.A.l.A.h.A.A.g.A.H.A.S.S.S.H.H.H.H.H.H.H.H.H.L.H.L.L.I.I.Y.I.T.T.T.T.T.T.~./.~././.(.(.(.(.^.(.(.{._.(._._.|.^.|.{.^.(.|._._.|._.|._.|._.|.|._._.|.(.^.(.(.(.(.(.(./.^.(./.(./.^.(.^.(.(.(.(.(.(.(.(.(.(.(.(.`.(.^._._.|.|.|._.|.|.'..X X.X.X.X.X.X|.|.|.|.|.{._._.`._.|.{._.`._._.(.|._.`.{._.|._._.|.|.|.|.|.`.|.`.`.|.|.|.|.|. X|..X.X|.|.'..X|.'..X.XzXdX.X'.zXzXzXzXzXzXcXxXdXxXxXdXzXcXxXxXcXnXnXnXnXmXmXmXmXmXMXmXmXmXMXmXmXmXnXnXMXmXnXcXmXnXnXnXnXcXcXcXcXxXxXvXdXdXvXdXxXzXzXdXzXzXdXzXzXdXdXdXdXdX.X.X@X.X.X.X|.|.`.`.`._._.`.(.^.`._._.(.`._.|.^.u $ o $ o o i /./.^./.(./.(.(././././.~./.R.~.T.T.T.T.T.U.U.U.L.U.U.L.U.L.L.U.L.K.U.L.S.L.L.L.G.H.L.H.H.H.U.S.K.H.S.H.A.U.L.P.D.D.D.' ' ' ! t r r r r : : e : ; ; ; ; e * ; ; ; ; ; r ; r : ; ; ; ; e ; e ; ; : ; ; ; ; ; ; % % % $ $ $ $ & % % % ; ; e : ; r ; e ; ; r ; ; 0 : * : r : r : : ; ; r ; e e ; ; : : ; ; ; ; ; ; ; ; ; * ; ; ; ; ; ; ; r r e e ; e ; ; ; ; * ; ; ; ; ; ; ; ; = 0 ; ; ; ; ; ; ; ; ; ; % ; % ; % % % $ $ $ & % % ; * 0 = y : t > * & $ $   .XxXzXdX.X.X.X.X_.`.|.|._.`._._._.{._.|.|._._.(.{.`.^.(.`.(.^.^._._._._.^.`.^.^.(.(.(.(.(.`.`.(./.|.^.(.(._._. X`._.'.n.r > o     e `.|.|.|..X`.|.|..X X.X.X.XdXdX.XzX X.X.X.XxXdX'.dX X.X.X.X|.|.|.|.|.|.`..X.X.X.X|..X.XdX.X.XdXdXdX.XzXdXdXdX.XdX%X X.X.XdXdXdXdXdX.XzX.X.X.X.X.X.X.X.X.X'..X.X|..X.X|.'.|.|.|.|.|.|.|.|.|._._._.{.|.^.).{.(.`.(.(._._.(.`.`.(.(.(.(.(.(.!.(.(./.[./././.(./././.~./.).!././.(./.^././.(.(./.(./.(././.(./.^.(.(./.(././.(./././.~.~.~.T.T.T.T.T.T.T.T.T.T.T.Y.P.P.P.P.P.P.Y.U.U.P.P.U.U.T.I.U.T.U.T.T.T.U.U.P.Y.U.T.T.T.T.T.T.T.T.T.Y.T.T.T.~.~.T.T.T.T.~.~.T.T.~.T./.T.~.T.~.~.~./././././.^.^.(.(.(._.[._.(.`.(.(.(.(.`.(.(.(.(.`.(.^._.(.`.(.^._.|.|._.|.|. X.X.X.XdX.XzX XdXdXdXzXdXdXzXxXdXdXxXzXzXzXzXxXxXxXxXzXzXzXcXdXdXdX XzX.X.X X.X.X.X|.'.|.|.|.|.|._._.(.(.(.(./.^.(.(.(.(./.(./.(.(./.",
+"D Z Z Z Z D Z Z Z F D Z Z Z Z G Z G Z Z Z Z Z H Z L H H H H H H H H Z L Z H H Z D D D Z D Z D D D S D H S P Z D Z Z L Z Z L D D Z Z G L Z S ' hXgXgXaXM.' c u y e ; : y : r r : r r r ; r r ; : t IXLXLXLXLXLXLXLXLXLX{ : : = e r r r r r r r r r r r r r r r r r r r r r r r r r r r r * r r r r 0 r r r r r r r r * y r e r r r r r : r : t ` UXLXIXe ; = r 0 r r r r r r r r r r r r r r 0 r r r : : r e r r r ; ; > A n y y y A Z.S.A.H.A.A.A.A.G.A.A.A.A.h.l.l.h.h.l.h.h.h.h.h.l.l.g.z.g.g.k.k.f.f.a.f.a.a.a.a.a.i.i.i.u.u.u.u.u.u.u.u.u.i.a.u.u.a.a.a.a.a.d.k.d.k.k.k.k.k.k.k.k.z.g.k.k.z.h.h.l.h.h.h.h.h.g.j.G.A.A.l.A.A.A.G.S.A.S.S.G.H.G.G.S.H.H.H.H.H.L.H.L.L.L.I.Y.U.I.T.I.T.T.T.~.~.~.~.(.~.(.(.(.(.^.^.|._._.|.{._.`._._.|.|.|.|._._.|._.|.|._.|._._.|.(.(.(.`.(.(.(.(./.~.~.(./.^./.(.(./.(.(.{./.(.(.(.(.(.(.(._.`.^.`.`._.|._._._._.|.|.|..X.X.X`..X.X.X.X|.|.|.|._.|.|._._._._.|.{._.|.`.|.^.|.^.|.|._.|.`.|.`..X|.|.`.|.|.|.|.|._.|..X'. X|. X|..X.X|..X.X.X.X@X.XzX.XzX.XzXzXcXzXdXnXdXxXdXnXxXxXcXxXcXnXmXnXnXnXmXvXmXvXxXmXcXMXnXmXnXmXMXcXmXnXmXmXnXnXnXnXcXcXcXdXxXxXnXdX.XdXdXdX'.zXdXzXzXdXzX.X.XdX.XdXdXdX.X.X.X.X.X'.'.|.|.`._._.`.`.`.(._._.|.|.(.`.'.^.u $   o   K /././.(././././.(./././.~.!.~.R.T.T.T.T.U.U.U.U.U.U.L.U.U.L.L.U.L.L.L.L.L.L.L.S.L.H.H.H.L.H.H.S.S.S.U.H.L.L.D.S.S.P.V.' ' ' Q t * : : r : y r : * * ; * 0 ; 0 ; r 0 r 0 r r ; 0 ; 0 ; r = ; r ; ; ; ; ; ; ; ; * > % % $ $ & % % : ; ; ; : : r y r r ; 0 0 ; 0 ; * r r * * : : 0 r r * : 0 : : 0 : * ; * : * * * ; ; ; ; * ; ; ; r * r * r ; r r * r r r ; 0 0 ; * * ; 0 ; 0 ; % 0 ; * ; * * = y 0 * ; * ; ; * * % % % % ; ; ; ; 0 ; r ; : : * ; % $ ,   .XdXdXzX.X.X.X.X`.|._.(.(.^._.(._._.^._.(._.{.`.^._.`.^.^.(.(.(.(.(._.(.{.^.`.{.^.`.(.(.(.^.(.(.|.^.|.|.`.|.^._._._. Xb.: $     u '..X|.|.|.|..X.X X|.|..X.X.X.X.X.X.X@XzX.X.X.X.X.XdX'.@X.X.X.X.X`..X`.|.'.|..X|..X'..X.X.XdX.XdXdXzX'.dXdXdX'.dXdX.XvX.XdX XdX.X.X.X.X.X.X.X.X.X.X.X.X'..X.X.X.X X|. X|.|.|.|.|.|.|.|.'.|._._.|._.|._.|.^.^.(.(.(.`.^.^.`.^.^.|.^.|.^.(.(.^././.(./.(.(.!././.~././.~././.!./././././././.(.(./.(./.(././.(././.(.(./.(.(.(././.R.(.~.T.T.[.T.T.[.T.T.T.T.T.U.P.P.P.P.Y.P.P.Y.U.Y.U.Y.T.U.I.U.T.U.T.T.T.U.U.T.T.T.T.U.T.P.T.T.T.T.T.U.T.T.T.T.T.T.!.Y.T.~.T.T.~.T.T.~.~.T.~.T.~.~.~.~./././.!.(.(.(.(.[.(.(.(.(.(.(.(.(.(.!.^.(.(.(.(.`.(._._._.(._.|.{._._.|.'. X X.X.X.X.XdX X XdXdX.XzX.XzXzXzXdXxXzXzXdXvXcXdXdXzXzXzXzX.X.XdXdXdX.XdX.X@X.X.X X'.|.`.`._._._._._.(._.(.(.(./.(.(.{./.(./.(.(./.(.",
+"B Z C Z Z Z Z G Z Z C G Z Z D D Z Z D Z Z H Z Z Z L Z Z Z L H Z L Z L Z Z L Z Z Z H Z Z H Z H Z J L Z H Z S Z Z Z H L Z S L Z L H Z D D D ) gXgXaXaX{ ' u y y t : r r r r r r r : r r e : r = 0 IXLXLXLXLXIXUXLXLXLXLXIX- % e = : = : e e e = > r = 0 e * > 0 e : ; r y * : = ; : = r r % r > * : y 0 * ; ; > % = = : ; ; > : > r t e ; e e 0 IXLXLXIX> ; = ; ; e * r 0 % > ; ; e ; r 0 r y * ; r r r r r r r r r r r y y u u u y e u Z.h.D.S.h.A.A.A.A.A.A.h.h.z.A.h.l.l.l.l.l.l.l.l.h.h.h.g.z.f.j.g.k.k.f.d.f.z.a.i.i.u.u.i.u.u.i.i.u.u.i.u.i.i.i.i.a.i.f.i.i.i.i.i.i.k.k.k.d.a.g.g.z.h.h.g.z.l.h.h.h.l.A.A.h.A.A.h.A.h.A.A.G.G.A.S.S.S.S.D.S.H.H.H.H.H.H.H.H.S.P.L.S.P.P.P.P.T.T.T.T.T.T.^.T.^././.(.(.(.^.(._.(._.|._._.|.(._._.}.}.}.}._.}._. X_. X_.}._. X_._._._._.(.(.(.^./.~.(././.[.(.(.(././.(./.(.(.(.(.(.(.(.^.^.^.{._.{._.|._.`.|._.|._. X X.X.X.X@XdX.X X X|.|.|._.|.|.|.{._.}. X}.}. X}.}.}.}.}.}.}.}.}. X}.|. X X'.|.|. X|.|.|.|._.|._.|.|..X X|.|.|..X.X.X.X@X'.dX.XdX.XxXzXzXdXvXdXcXdXdXdXdXxXxXxXxXxXxXnXnXnXnXnXnXcXnXMXnXmXnXmXmXnXMXnXnXmXmXnXnXnXnXxXnXvXxXdXcXzXxXdXzX#XxX.XzX@XdXdXdX.X.XzXxXdXdX'..X.X.XdX.X.X.X'.|.|.|.|.`._._.(._.{._._._._. X_._.|.|.].S o     K /.(.(.(.(./././././././.~.~.~.T.T.~.T.T.T.U.Y.L.L.L.L.L.U.L.L.L.S.L.S.L.L.L.S.L.H.L.H.H.H.H.S.L.K.H.L.K.L.L.H.L.S.L.L.K ' ^ u u ; y ; : r r ; ; ; y : r ; ; * : r r > = : r r 0 : : * r r r : r : y r : * : : * ; ; % % % % % ; * ; ; ; r y r > y : 0 : y : : : r e 0 r ; ; > r r r : : : r r : : ; : : y = ; r r r r r r r r e r e e r ; ; ; : y : ; ; 0 r r r : : : : : 0 * y * : : y : > * t : r : : ; : * * ; % ; * ; ; ; ; ; ; : : * ; * % $ $     '.cX.XdX.X.X'.}.}.{.|.(.(.(.(./.^.(.(.`.^.(.|.^.(.|./.(.(./.(.(.(._.(.(.(.`.|.(.(.(.(.(._.^.`.`.(.`.(.`.(.(.(.`.|._.{.` $ o # u ].`.`.`.}.}.}.|. X X'..X.X.X.X.X.X.X'.'.zX@X.X'..X'.zX'..X.X.X|..X_.`.`..X'.|..X|..X.X.X.X.X.X.X.X@XdXdXdXdXdXdXdX.X'.zX.X X.X.X XdX.XdX.X.X.X X.X.X.X|..X.X'..X|. X|..X}. X|.|.|.|.|.|.|.|.}.|.|._._._._._.`.(.(.(.(.[.(.(._.[.(.(.(.(./.(.(./.(././.(./.(.^./.~./.~.(.(.!././././././././.(.E.{.^././.(./.(./.^.(.(.(.(.(.^./.~.~.~.~.~.T.T.T.T.T.T.T.~.T.T.T.I.U.T.U.I.Y.I.U.U.U.U.U.T.T.T.T.I.T.T.T.P.T.T.T.P.P.P.P.T.T.T.T.T.T.T.T.U.Y.~.Y.I.Y.T.I.I.~.I.Y.~.T.Y.Y.T.T.T./.~.~.!.(././.^./.^./.(.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.(.(.(.`.(.|.(.(.|.(.`._.|.`.'. X.X.X.X.XzX.XdX'.dX'.zXzXxXdXdXdXzXzXdXcXdXdXdXfXzXzXzXzXzX.XxX.X'..X@XdXdX.X.X X X|.|.|.|.{.|._.^.`.^.^.(.(.(.^.(.(./.(.(.(././.",
+"F Z Z Z G D Z B C Z Z Z D Z Z D D D D D D H Z Z L Z L L L Z L Z ( S Z L L Z L Z H Z H Z Z Z H S H Z Z H Z L P L L Z Z H L Z L L Z U D D J aXgXgXpX} ( n u y y : r r r r : r r r y 0 * e * q % ' LXLXLXPXf % , c PXIXUXpXu * * = % ' aXpXpX{ ; > y = x ' { ' ; c pXaX{ e t : ; > : ' aXpXpXM.0 > e : u { { n t pXpXn : % y [ pXpXpXpX^ % r 0 ^ IXLXLXUXc Q ; ; e ; ' pXpXpXM.; ; ; * 0 e r ; = y r r r r r r r r r r r r e y y y y e y A Z.S.G.Z.A.h.A.A.A.g.A.h.z.A.l.l.l.l.h.l.l.l.l.h.h.g.z.g.g.f.g.f.f.f.k.f.i.i.a.i.i.a.u.u.u.u.u.u.u.u.u.u.a.i.i.i.i.i.i.k.k.k.k.f.f.d.k.g.z.z.g.l.h.h.h.k.A.h.z.l.l.l.A.A.A.A.A.A.A.A.A.h.H.S.S.A.S.H.S.H.H.H.H.H.H.H.H.L.L.L.S.L.P.P.P.Y.T.P.T.T.T.~.T.~.~.~././././.^.).(._._._._._.^.}._.}.}. X}. X}._._._._._._.}._._.|._._._._._.(.(.(.{.(.(.(.(././.(././././.(.(.(.(.(.(.(.(.^.`.`.|.(._.|.{._.|._.|.|.|._.|..X X X.X X.X.X|.|.|.|.|._._.|._.|.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.|.|.|.|.|..X|.'.|. X|.|.|.|. X|.|. X|..X|. X.X X.X.X X'.dXdX.X.XdXzXzXvXdXnXdXcXcXnXcXdXxXxXxXnXvXnXnXnXnXnXnXnXnXnXnXnXnXmXmXmXmXnXnXcXcXvXxXnXxXnXxXxXxXcXcXzXdXzXzX.XxXdXzX.X.XdXdX.XzX.XzXdXdXzXdX.XzXzX.X.X.X|..X|.|.`.|.|._._.(.]._._._._._. X_.^. X`.`.u     i ^.(.(.(.(.(./.(./././.(.~.~.~.~.T.T.T.T.T.T.U.U.Y.L.U.U.L.L.S.L.L.L.L.U.S.L.S.S.H.H.S.H.H.H.L.H.S.H.H.H.D.F.L.H.L.S.G.S t y e ; % > % * % * ; : * % * % * ; % : * % % * % ; ; % r = * % : % % = : % : % r % : % % % % - % % % 0 % ; * : % * % : % : % ; % * ; % % : : % ; ; ; % * ; * : * * % : * : % : ; * % * ; % * ; * : * * * % : * ; ; ; * ; % = ; ; % * * % > * * : % % * * * * % % = * % * % : * % * % % % ; % % % % % ; ; * * * ; ; % % $       dX'..X.X.X|.|.|.^.{.(.^././.~.(.^.(.(./.(.(.(.(.(.(.(.(.(././.).(.(.(.`.(.^.(.(./.(.`.(.`.(.^.^.`.^.(._.`.[.(.`.|._. X[ $   t '.dX'.|.{.}.}.}.}.|.|.|. X|..X.X.X.XdXdXdX XdX.XdX.X.X.X.X.X.X.X.X`.|.`..X|.|.|.|..X|. X|.|..X.X.X.X.X'.'.dXdXdX.X'..XdX'.@XdX.X.XdXdX.X.X.X.X.X X.X.X|.|..X.X X X.X|. X|.}.}.|.|.|.|. X|.|.|.|.}.|._.|.(._._._.{.(.(.(.{.[.(._.(.(.(.(.(.(.(./././.!.(./.(.(././.[./.^.^././././.(.(.(./././.(.(.^.^.(./.(././.(./.(.(./.(./.(./.!.~.~.T.T.R.T.T.T.T.T.U.T.T.T.T.I.T.I.U.I.I.I.I.T.U.Y.T.T.T.I.T.I.T.T.I.T.T.P.T.T.T.T.T.P.P.T.T.T.T.T.P.T.~.I.~.T.~.~.!.T.I.~.~.~.T.Y.~.T./.T.T.T.~.(.~.(.~.^.~./.(./.(.(.(.(.(.(.(.(.(.`.(.(.(.^.(.(.`.(.(.(.(._.(.(._.^.|.(.|.|.|.|..X.X.X.X.XzX.X.XdXdXdX.XzX.XnXnXdXdXcXdXcXmXdXvXcXzXdXzX.X.XzXdX'.dX.X.X'..X.X.X.X|..X|.|.|.|.^.|.`.(.`.(.(.(.`.(.(.(./.(./.(.(.(.",
+"D Z B D C Z Z F Z D D D D Z D Z D D D D D D G H Z L L Z Z L L L G Z Z Z H H H Z Z H H Z J P Z Z Z H H Z Z Z Z L Z S H Z Z L Z L L Z J S m.gXgXpXM.' u u r r r r r r r r r r r r > 0 r r r = e pXLXLXLXaX% , % &   o o $ & & - f IXLXLXLXLXLXPX{ * : aXLXLXBXaXLXLXLXLXgXt 0 % n IXLXLXLXLXLXPX{ ; t pXLXLXBXIXLXLXpX> ' PXLXLXLXLXLXLXIXt ; LXLXLXLXLXLXIX% % f IXLXLXLXLXLXLX{ ; ; ; * r y ; r r r r e 0 r r r r r r r r r y y u u > ; U H.A.H.A.A.A.A.A.A.h.h.S.z.l.l.h.l.l.l.l.l.h.h.h.g.g.k.k.g.g.g.z.k.k.f.a.a.a.i.i.i.i.i.i.u.u.i.i.u.i.i.i.i.a.a.a.a.d.k.f.f.f.f.f.g.k.g.g.g.g.h.l.g.h.S.l.h.A.A.A.h.A.A.h.A.A.S.A.A.A.S.A.S.S.S.D.H.H.A.L.L.S.L.L.U.L.S.S.L.A.L.P.P.Y.P.T.T.T.T.T.~.T.~.~.~./././.(.^.(._.(._._._.{._.}._._.}.}. X}. X|._. X_._. X_._.}._._._._.(.(.(.(././.~.(./.(.(./.(.!.(./.(./.(.(.(.(.(.(.(.`._.^.^._.(._._.|._.|.|.|.|.@X.X.X X.X'.'..X.X.X`.|.`.|._.|.|. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.{.|.|.|.|.'.|..X|. X|.|.|.|.|.|.|.|.|.|..X X|.|. X.X.X.X'.@X'.dXdX.XfXzXdXdXdXvXdXnXcXzXdXnXxXxXxXnXnXnXnXnXnXnXnXcXnXnXcXnXmXcXnXnXnXxXxXnXnXnXcXnXcXcXJXxXxXdXzXzXzXzXxX.X.XzXdXdXdXdX.XzXzX.XdX.XdX@XzX.X.X.X.X.X|.|.|.|.`.`.|.(.(.(.(.[.^.`._._._._._._.(._.(.u $ i (.(.(.(.(.(.(././././.~.~.~.^.R.~.T.T.T.T.T.I.U.P.P.L.L.S.L.S.L.S.L.D.H.S.L.U.S.U.S.S.L.H.S.H.H.L.H.H.L.S.L.L.H.H.L.D.: ; % % & $ $ $ , & $ $ $ % $ $ & $ $ $ , & $ $ $ $ $ $ & $ $ $ $ $ $ $ $ $ $ $ $ $ & , o , $ $ $ $ $ $ $ $ $ $ $ & $ , $ & $ , $ & & , & % $ & & $ $ % $ & & & $ % & & % $ & % & $ % & % $ $ & & - , $ & & & & $ $ $ % $ & & $ $ $ $ $ & $ $ $ $ $ $ $ $ $ $ & $ $ $ $ % & $ $ $ , $ & $ $ $ $ $ & $ $ $ $ $ $ $ % $ $ o         dX@X.X.X'.|.|._.|.^././././.~.^.(.^.[.(.(.(.[.(./././././././.(.(.(.(.(.`.(.(.(.^.(.(.(.`.(._.{.^.`.^.(._.^.`.`.{.{.|.` $ u `.|.^.|.|.(.}.}.}.}.|.|.|.'.|.'.|..X.X.XdX@XdXdX.X.X.X.X.X.X.X.X.X.X.X`.`.`.|.'. X|.|. X X|..X.X|..X.X.XdX.X.XdXdX@XzXdX.XdX.XdX.X.X@X X.X.X.X.X X.X X.X X@X X|.@X X.X|.'.|.}.|.}.|. X|. X{.|.|.}.}._.|.`.{._._.(.(.(.(.(.(._.(.(.(.(.(.(.(./.(./.(./.(./.(./././.(././.^.T./.]./.(.(././.(./.(.(.(./.(.(.(././.^.(.!.(./.(.^././././.~.~.T.T.(.T.T.T.~.T.T.T.T.T.U.U.U.T.U.I.T.I.U.U.I.T.I.T.T.T.~.(.T.T.T.T.T.T.T.T.Y.P.T.T.T.T.P.T.T.T.[.T.~.~.I.T.~.R.T.~.~.I.~.I.~.T.~.T.~.~.T.~.~.~./.~././.(./.(./.(.`.^.^.`.(.(.].(.(.(.(.(.^.(.(.(.(.(.(.`._.(.(.|.|.(.(.|.|.|.'..X.X.X X@X.X@XdX.X XdXzX@XdX.XxXdXdXdXmXnXcXdXdXdXdXxXzXdXzX@XdXdXdX.X.X.X.X.X.X.X.X.X|.|.|.|._.|.`.^.|.(.(.(.(.^.(.(.{.^.(.(./.(.",
+"Z C Z Z Z Z Z Z D Z D Z D D D Z Z D D D D D Z Z Z L Z S L Z L Z Z ( G L Z Z H L L Z H L H Z Z Z Z Z H H L H Z Z L Z H L H L Z H L Z Z _ gXaXpXM.' ^ : > r r r : r r r r r r r r e 0 y = * y e IXPXLXLX] & & n 6XsX6XM.pXc % % IXLXLXLXLXLXLXLXLX^ : sXLXLXLXPXLXLXLXLXLX{ % t IXLXLXLXLXLXLXLXLXQ ; pXLXLXLXLXLXPXc - IXLXLXLXLXLXLXLXLXpX- LXLXLXLXLXLXgX- ; IXLXLXLXLXLXLXLXLX' % ; e e ; y r r r r r r r r r r r r r r e e r > y ; ; r T H.A.H.A.A.A.A.A.A.A.z.g.l.l.h.l.h.z.l.h.h.h.h.g.g.z.g.g.g.g.g.k.k.g.i.z.a.a.a.a.i.i.a.u.i.u.i.i.k.i.a.i.a.a.a.a.i.f.k.f.f.f.k.g.k.g.g.h.z.l.l.h.h.h.l.l.l.A.A.A.A.A.A.A.A.A.H.A.H.A.S.S.S.S.H.D.H.L.S.L.S.L.S.S.H.L.L.L.L.L.L.L.U.P.T.T.T.T.T.T.~.T.~.!.~.(./.^.(.(.(.(.(._.|._.|._._._.}.}.|.|._._._._._. X_._._. X_._._._._.(.(.(.(./.(.(.~.(./.(./.(./.(.~.(.^./.(.(.(.(.(.(.|.(.^.|.|._.|.|.|.`. X X|.|.|..X.X.X X.X.X X|.|.|.|.{. X|. X}.}.}.}.|.}.}. X X}.}.}.}. X}.}. X|.|.|..X X|. X'.|. X'.|..X X X|..X.X X|..X.X.X.X.X.X.XzX'.dXdX@XdXdXzXdXnXnXdXnXdXcXdXxXxXcXvXnXxXnXnXnXnXnXcXnXnXnXnXnXnXnXmXnXnXnXnXnXxXnXnXcXcXcXcXdXcXxXdXzXzXdXdXzX'.zX.XdXdXdXdXzX.XxX.XdXdXdXzXxX.XxX.X.X.X'.|._.{.(.{._.(.(.(.^.`.(.(._.[._._. X_._.[.|.].e ( (.(.(.(.(././.(././.(.~.~.~.T.~.~.T.T.T.U.L.I.L.L.L.L.L.L.S.H.H.S.S.H.H.L.S.L.H.H.H.H.U.U.L.L.H.K.L.H.L.L.H.L.L.H.U.U.* % $ $ o   o o   o   $   o     o   o     o   $ o   o   o   o o   o o   o o o   o o   o   o o o   o       o   o   o o       o o   o o o o o o o o o $ o o o o $ o o o o o o o o $ o o o o $ o o $ o o $ o o $ o o o o o o o o o o o o o o o o o o o o o o o o o o   o o o o o   $ o o o o     $ o o o o o o o o o o         #   u dX.X.X.X|._._.|.^././.~.~.~./.~.T.~.~.~.~.~.!.~.~./.~././././.^./.(./.(.^.(.`.^.(.(.`.{.^.`.^.(.^.(.(.(.^.(.(.`.|.|._.) y  X_._.^.|.|.'.}.}.}.|.|.|._.|..X.X.X.X.X.X XzXdX'..X.X.X.X.X.X'..X|..X.X|..X`.|.|.|.|.|.|.|.|.|. X.X.X'..X.X.X.X X'..X'.@X.X.X.X'.'.dX'..X.X.X X|. X.X'. X X|. X X X X|. X|..X X}.}.|.{.|.|. X}.|. X}.|._._.|._._._.(._.].(.(.(.(.{.(.(.(.(.(./.(.^./.!./././.(././.[.^./.(.E./.)./.(.(.(.(.(.(.(./.^.^././././././.(.).(.(./././././.!.!./.T.T.~.T.T.T.~.T.T.T.T.T.T.T.T.U.U.T.U.U.T.T.T.U.T.T.T.T.T.I.R.T.T.T.T.T.T.T.T.T.T.T.P.T.T.T.T.T.Y.U.~.I.~.I.~.~.L.Y.Y.~.I.~.I.T.U.T.T.~.T.R.~.~.~././.(./.(.(.(.(.].^.^.(.(.(.(.(.(.(.`.!.`.].(.(.(.(.^.(.^.(.(.(.(.|.`.(._.|..X|..X X.X.X.X.X.X.XdXdX XdXdXxXdXnXdXmXdXdXvXcXdXcXzXzXzXzX'.zX.X'..X.X.X.X.X.X.X.X.X.X X|.|.|._._.}._._.[.(.`.(.(.(.(.(./.(.(.(.(.",
+"Z Z Z Z F Z Z Z Z Z D Z Z Z Z Z D D Z Z Z L Z L S Z G L ( G Z L L L L L H H H Z Z H Z Z Z H J Z Z H Z J Z S Z H H H Z L H Z H H Z P _ hXaXaXM.{ Q y y r r r : ; r r r r r r r r : * t q : : > UXLXLXLXn $ o IXLXPXLXLXLXsX$ M.LXLXLX' - e IXLXLXgX* pXLXLXLXgX{ aXLXLXLXpX% pXLXLXLX' @ w IXLXLXgX- pXLXLXLXIX' { % u HXIXLXgX$ > IXPXLXIX, ' IXLXLXIXf n o pXLXLXLX' - c IXLXLXgX% * % ; ; ; r r r r r r r r r r r r : : 0 r r y e y % : 0 Z.A.G.A.A.A.H.z.A.l.G.g.h.h.l.l.l.H.l.l.l.z.l.h.z.l.g.g.g.g.k.k.k.k.k.i.f.k.i.i.i.i.u.u.u.a.i.i.f.i.a.a.a.z.i.f.k.f.g.a.g.k.k.k.k.z.g.z.g.h.h.S.g.g.A.A.h.h.A.A.D.A.h.A.H.A.S.D.S.S.S.S.A.S.H.H.L.G.L.S.S.L.S.D.L.L.S.P.L.L.U.Y.P.P.T.U.T.T.~.T.~.T.~.~.~././.(./.(.(.(.^.(._._.|._._._._. X_._. X X X_. X_._. X_._.|. X_._.(.(.(.(.(.(./.(././.(.(././././.(./.(.(.(.!.(.`._.{._.^.|.`.|._.|.|.|.|.|.|.|. X.X|..X.X X@X.X|.|.|..X|.|.|.|.[.}.}.}.}.}.}. X}.}.}.}. X{.|.}.}.}.}.|. X X'.|.|..X|..X.X.X'.|..X X.X|..X X|..X X X.X.X.X@XdX.XdXdXxXxXdXdXdXcXdXvXdXcXdXxXcXxXxXxXxXnXcXxXnXxXnXcXcXcXnXnXcXmXcXnXnXnXnXxXxXdXdXnXnXxXcXxXcXcXzXzXzXzX'.'.zX.XzXzX.X.XzXzX@XdXdX'.cXdX|..X.X.X.X.X.X|.`.|.{.(.(.(.^./.^.(.(.^.|._.(.(._.{.(._.{.{._.].n._.(.(.(.(.(./.(./.).(.!.~.T.^.~.~.[.T.U.U.L.L.L.L.U.L.S.H.H.H.H.H.H.S.H.A.H.H.H.S.H.H.S.L.L.L.L.S.U.L.L.L.H.L.H.H.L.S.[ ; o o                                     #                   # #                                     #               #                       o   o o o o o o o o o o o o o o o o o o o o   o o o   o o   o o o   o   o             o                           o                                 o                         i '.dXdX.X X|.}.}.(.(./.~.~.~.~.~.~.~.~.~.~.T.T.T.T.T.~.~.~.!.~./././.(.(.^.~.^.(.^.(.(.(.{.(.[._.(.(.(.(.^.`.^.(.(._._.'.n.].`.[.}..X`._.`.|.|._._.|.|.|.|.|.'.|..X'.@XzX.XdX@X.X.X.X.X.X.X X.X.X|.@X|.|.|.|.|._.|._.|.}. X|.|.|.'..X.X.X'..X.X.X.X.X.X.X.X.XzX.X.X.X.X.X.X X.X.X X|..X.X|..X'.|..X X'.|. X|.|.}.}.|. X|._.}.|.|._.|._._._._._._.^.(.(.(.(.(.^.^.[.(.(.(.(.(.(./././././.(.E.~.(.^.XX[.~./././././.(.(.(.!./.(././.(./.(.(./.(././.(././.(./././.(./.~.T.~.T.T.~.~.~.U.~.T.T.~.~.I.T.T.T.U.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.P.T.P.T.T.T.T.U.~.I.~.I.T.~.Y.~.T.~.Y.I.U.T.T.Y.T.T.T.T./.~././././.(.[./.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.`._.(.(.(.(.(.(.(.{.|.(.|._.|.|. X.X.X.X.X.XdX.XdXdX.X'.zXzXzXdXdXcXcXcXdXdXcXdXmXzXzXzXdXdXdX@X'.'..X.X X.X.XdX.X.X.X.X.X X|.|.|.|.}.}.}.`.(.(.(.(.(.(.(.(.(.(.^.",
+"Z C Z Z Z Z Z Z Z Z D D Z L H D D D H Z Z Z L Z Z ( Z Z Z Z L Z Z Z Z Z H Z Z S L Z L H S Z Z H H Z H Z H L H Z Z Z L Z H H H H L S pXgXaXpX{ Q u e r r r r = r r r r r r r r r r r 0 > : ; > BXLXLXLXn o $ gXLXLXLXLXLXsXo gXLXLXIXpXpXsXIXLXLXLX$ pXLXLXLXf , % LXLXLXpX$ gXLXLXIXpXpX6XIXLXLXPX- M.LXLXLX{ % $ % $ - - > c sXgXLXLXLXUX, $ IXLXLXgX+ o o gXLXLXIXpXpXpXIXLXLXLX$ : * % e r r r r r r q r r r 0 r r r r r r r r 0 e ; : % Z S.S.S.H.A.A.H.A.A.g.A.G.z.l.l.l.l.G.l.l.h.h.l.g.l.g.g.k.A.h.z.k.g.k.d.z.i.k.a.a.i.i.i.a.a.i.i.i.i.a.d.i.i.d.k.d.k.z.g.k.k.g.z.k.g.g.g.h.h.h.j.h.A.A.A.S.A.A.l.H.A.H.H.H.H.H.H.S.H.S.S.H.H.H.L.L.S.H.L.L.L.U.U.L.L.L.L.P.L.U.P.P.P.U.T.T.T.T.~.T.~.T.T.~././././.!.(.(.(.(.^.{.^.(._. X_._. X_._._._._._._.}._._.}._._._._.(.|.(.(.(././.(.(./././././.(./././././.(.(.(.`.|.(.}.}.`.^.|._.|.|.|.|. X|..X|.'.'.|. X X|.|.|.|.|.|.|.|.|.|. X}.}.}.|.}. X}.}.}.}.}.}. X|. X}.}.}.}.|.|.|. X'.|.|. X|.|..X.X|..X|..X|..X.X|. X'..X.X.X'.dX.XdXdXdXdXdXvXdXdXcXzXzXdXcXxXdXdXxXxXxXxXxXxXnXxXxXcXcXcXcXcXnXcXcXnXnXnXxXxXxXJXxXcXcXxXxXxXcXdXzXzXdXzXzXzXzXzX'.zX.XzX.XdXdXdXdXxXdXzXzX.XxXzX.X.X.X|.|.^.).(.(.(.[.(./.(././.[.(._.(._.].`.'._.{._.`.{.(._._.(.(./././././.~.~.~.~.T.~.T.T.T.U.L.S.L.L.L.S.H.H.H.S.G.S.H.A.H.H.D.H.H.H.H.H.H.H.L.S.L.S.L.S.L.L.L.L.H.L.U.L.H.L._ $         # #   #             #                                         #           # # #                                           o   $ o o o o $ o o $ o o o o o o o $ o o o o o o o o o o o o $ o o o o o o o o o o o $ o o   o       o   o                                 o         o                     o     $ ' dX.X X X'..X|.}.^.(.^././.~.(.~.~.~.~.T.T.T.T.T.T.T.T.T.T.~.~.T.~.~./././.(.[.{.E.(.(.(.(.(.(.(.(.(.(.(.(.`.(.`.(. X_.(.^.'.|.|._.}.{..X_.(.|.[.|.|.|.|._._.|.|..X.X XdX.XdX.X'..X.X.X|. X|.|.|.|.|.|..X|.|.|.|._.|.|.|.}.}.|.|.|.|. X|..X|.|.|..X.X.X.X.X.X.X.XdX.XdX.XzX'..X.X.X|..X|.|.|.|.|. X X.X|.|..X}.}. X}._._._.|.|.}._._.|.[.`.`._._.`.^.(.(.(.(.(.^./.`.(./././.(./.(./././.!./.[.^././.(.(.^./././.(.(./.(./.(.(.(.(.{.(.(.!././././.(.(./.(././././././.~.~.T.~.T.T.T.T.~.T.T.T.T.T.T.~.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.(.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.[.Y.~.~.Y.~.T.T.T.T.~.Y.~.T.Y.~.~.T.T./.T.T.~.~./././.(.(.(.(.^.(.(.(.(.(.(.(._.(.(.(.(.(.(.(.(.(.(.(.(.(.|.(.^.`.^.(.|._.|._.|. X X.X.X.XdXdX.X@X.X'.zX.XzXzX@XxXdXcXdXcXcXdXdXdXzXzXzXzX.X.XxXzX.X.X.X.X.X.X'.'..X.X.X.X|.'.|.|.|.|.}.}._.`.`.(.(.(.(.(.(.(.`.].",
+"Z Z C Z Z Z Z Z Z Z Z D Z Z L Z D D Z H Z L Z L L L L L Z S H H L Z Z L Z L ( Z Z L L H H L H Z Z Z J H Z L Z H H H L L Z H H H J ' gXaXpX{ ' u e : r : r r : r r r r r r r r r r r ; y : y e pXLXLXLXpX$ o { m.sXLXLXLXsX, IXLXLXLXLXLXLXLXLXLXLX$ sXPXLXLX& $ $ LXLXLX{ % UXLXLXLXLXLXLXLXLXLXPX$ sXLXLXLX$ % $ $ & { IXLXLXLXLXLXLXLXIXo o IXLXLXgXo $ o gXLXLXLXLXLXLXLXLXLXLX& % * % ; y ; r r r r r r r r r r r r : : * r e y 0 e % ; % e.G.S.H.A.A.A.S.l.g.G.g.h.l.l.h.h.h.A.l.l.l.l.h.h.h.h.z.h.k.h.k.k.k.k.f.i.i.i.d.i.i.i.u.a.i.i.i.i.i.k.d.z.i.z.k.k.z.h.z.g.l.l.g.z.h.z.z.h.h.A.h.h.Z.j.A.A.A.S.A.H.H.A.H.D.H.H.H.H.S.K.A.H.H.H.L.L.L.L.L.L.L.L.L.P.L.P.U.L.U.P.P.P.T.U.T.T.T.T.~.~.~.~.R./././././.(.^.(.(.(.(.^.`. X_._._._._._._._. X X_.}.}._.|._._.|.{.^.^.(.(.{.(.(.(.(.(.(././.!./././.(./.(.(.(.(.(.{._.|.|.(._.|.{.|.|.|.|..X|. X|.`.|.|.{.|.|.|.|.|.|. X X|. X|.}. X}.|._.}.}.}.}. X}.}.}. X|.|.}.}.}.}.|.|.'.|.'. X|.|..X.X.X|..X X.X|..X.X|. X.X X'..X.X'.'.@X'.'.dXdXxXvXdXdXdXzXzXxXdXnXdXcXxXxXxXxXxXxXxXnXxXcXcXcXcXmXcXcXcXxXxXxXxXxXxXxX@XdXnXnXcXxXxXzXzXzXzX.X.X.X.X'..X.X.XdXzXdXdXnXcXdXdXdXzXxX.X.XxX.X.X|.|.`.(.(./.(.^.(.E./.(./.(.^.^.(._.|.^.|.|._.^._.^.`.(.(.(.^.(././.(.~.(.!.~.!.!.~.T.Y.U.U.L.L.H.L.L.H.H.D.S.H.G.G.S.A.G.S.S.D.H.H.H.S.S.U.S.L.L.L.L.S.L.S.L.L.F.S.H.L.L.L.L.U.L.U.P.P.Y.L.L.Y.L.P.S.L.P.P.S.P.H.L.Z.L.S.P.P.P.U.Z.T.Y.T.T.H.T.T.~.T.Y.Y.!./.T./././.!.!.~.(.!.(.^.(.].Y.^.(.(.{.[._._.[._._. X`.(.|._._._. X}. X}. X X}. X}. X X X.X|.|..X X.X.X.XdX.XdXdXdX.X.X.X X.X.X.X X.X.X.X XdX X.X.X.X X X.X@X.X.X X'..XdX X XdX X X.X.X X.X.X'.@X.X X X X X X X X X X X X X X X X X'..X.X X X.X.X.X.X.X.X|.}.|.(.^.!.~.~.T.~.T.T.T.T.P.P.T.U.T.T.T.T.T.~.~.!.~.!./././.^.(.(.(.~.~.(./.(.(.(.[.{.{.(.(.(.(._.(.(.{.^.`.`._.|._.|.|._.|._.}.}.}.}.|. X|.|.|.|. X.XdX.X.X.X.X X.X|.|..X|. X`.'.`.|._. X|.|.|.|.|._.|.}.}. X|.|.|._._.|.|.|.|.|.|. X.X.X.X.X.X.X.X X'..X.X.X X.X.X.X.X|..X|.|. X'.|. X|.|. X X|.'.}.}.}.|._.|.}.{.|.`.`.|.`.`.(.`.^.^.(.(.(./.(.^./.(.(.(./.^././././.(././.^.^.^./.(.(./.^./././.(./.(.(./.(./.(.(././.(./././././././.!././././././.R.~.T.~.T.T.T.T.~.~.T.~.T.~.T.T.T.T.T.T.~.T.T.T.T.~.T.T.T.~.T.K.R.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.I.Y.~.T.U.U.Y.U.Y.I.~.~.Y.T.T.~.~.T.T.~.~.~.~./.[.(.^.(.(.`.(.(.(.(.(.^.`.(.(.(.(.^.(.!.(.(.(.(.(.(.(.(.^.(.(._._.|._.|.|..X|..X.X.X.X.X.X.X.XdX.XdXxXzXzXzXcXcXdXcXcXdXcXcX%XzXzXxX.X.X'..X.X.X.X.X.X.XdX'.dX.X.X.X.X.X X|.|.|._.|._._._.^.(.(.(.(.(.(.(.(.(.",
+"Z C Z Z Z Z Z Z Z Z F D Z L Z Z D Z Z Z Z H Z Z Z Z Z Z H H Z Z Z L Z L L L Z G H H D H H H L F P H Z Z H Z H Z Z H Z H H H H H Z pXaXpXM.' S e ; ; : : r r 0 : r r r r r r r r r : = : e r * c LXLXLXPXc & o & f LXLXLXM.  gXLXLXIXn c c c f c c $ sXLXLXLX$ o o LXLXLX6Xo gXLXLXIXc c c c c n c o sXLXLXLXo o $ $ c LXLXLXpXw o UXLXLXgX  o gXLXLXHX  o o gXLXLXIXc f f c c c c $ $ % % % ; r r r r r r r r r r r r 0 r 0 r r e ; r r > : % y G.A.H.H.A.A.A.h.z.h.G.z.l.h.h.h.A.A.A.A.h.h.h.h.l.h.h.h.h.h.z.k.k.k.d.k.k.d.k.i.a.k.i.z.z.a.a.i.z.d.i.z.d.k.k.z.z.k.g.l.g.l.g.h.h.h.z.h.h.h.A.A.A.h.A.S.G.S.D.A.H.A.H.H.G.H.H.S.S.S.L.H.H.L.H.L.S.L.L.L.L.L.L.L.L.P.L.Y.P.P.P.P.U.T.T.T.T.~.~.T.T.~./.!.!.!./.!.[.E.(.(.^.|.`.(.{.^. X_. X_._._._._.}._._.}.}._._._.|.[.`.`.(.{.(.(.(.(./.(././.(./././.!./.(.(.(.(.^.`._.^.{._.|._.`.`.|.|.|.|. X X X|.|.`.`.|.|._.|.|._.|.|. X|. X}. X}.}. X_.}.}.}.}.}.}. X}. X|. X}.}.}.}.}.|. X|.|..X X X.X.X|. X.X|..X.X X X.X.X'..X.X.X.X.X'.dXzX.XzXdXdXcXdXdXcXzXzXcXdXcXdXxXxXxXxXxXcXxXnXxXcXcXcXcXcXcXcXcXcXxXxXxXxXxXxXxXxXnXdXcXcXvXxXzXzXzXzX'.zXzX.XzXzXzXzX@XzXdXdXdXdX@XdXfXzXzXzXzX.X'..X|.|.|.(.^.(.^.~.^.[././././.(.(.^.{.(.|.^._.{.|.(.{.(._.(.(.^././././.~.(.~.~.~.~.~.T.Y.L.L.L.L.H.H.H.H.G.S.A.H.A.A.A.H.S.S.S.G.H.A.S.H.H.S.U.A.L.S.L.L.L.H.S.L.L.L.H.L.L.L.L.L.U.U.Y.L.Y.L.Y.L.U.Y.L.U.P.L.P.P.L.L.Z.P.L.L.P.P.P.Y.U.I.T.T.T.T.~.T.~.!.[.~./././././././.!././././.(.[.(.^.(.(.{.].(.(._._._._._.`._.|._._.{.|._.}._. X}.}.}.}.{.|.|.|.|. X X.X.X.X.X.X.X.XfX X.X.XdX XdX.X XdX.X.X X.X.X.X.X.X X X.X'..X.X.X.XdX X X X XzX XdX.XdX.X.X.X.X.X X X X X X}.}.}. X}._._._._. X X|..X.X XdX.X X.X.X.X X}.}.}.(.{.E.~.~.T.~.T.T.P.T.P.P.U.U.U.T.T.T.T.T.~.T.~.~.~././.^.[.~.~.(.[.~././.(.(.!.(.(.(.(.(.(.(.(._.`._.^.(._.^._._._.{.|.|.|. X}.|.|.|.|.|.|.'.|..X'. X.X X'.'.|.|.|.|.|.|.|.`.|.|.|.|.|. X X|..X|.}.}.}.}.|.|._.|.|.|.|.|.|.|.|..X|. X X.X.X.X@XdX.XdX.X.X.X.X.X.X|. X X|.'.|.|.|..X'.|..X X X|.}.}.}._._.{.}.|._.^.`.^.^._.`.`.(.`.!.(.^.(./.(.(./.(././././././.!.(./.!./././.[.~.(.(.~./././.(././.(.{.(./.(./.(.^./././.(.!.)./.(./.!.(././././.(.T.~.T.T.~.~.T.T.T.T.~.T.T.~.~.T.~.T.~.T.~.T.~.~.T.~.~.T.T.~.K.T.T.T.T.T.T.T.T.T.T.~.P.T.T.T.T.T.U.T.I.Y.Y.Y.Y.K.~.~.T.~.I.Y.T.Y.~.T.T.T.T./.T.(.~././.(.(.(.[.(.^.{.^.`.(.(.^.(._.(.`.^.].(.(.(.`.(.(.(.].(.(.`.(.|._.|._.|.|.|.|.'..X'..X XdX.X.X.XzXdX.XdXzXzXdXnXcXnXdXcXcXcXfXdXzXzXdXzX.XzX.X.X.X.X.X.X.X@XdX.X.X.X.X.X.X.X|..X_.|._._._._.`.^.(.`.(.(.`.^.(.(.",
+"Z Z G D Z Z Z Z D Z L G D H Z L L D D H D S H H Z H H Z Z ( L L L S ( Z H Z L L H H H H H H H H H H Z H D D D D H Z Z L J Z L Z { aXpXM.{ Q y y r r r r r r r r r r r r : r r r r r * t r r 0 0 IXPXLXLXLXIXIXUXLXLXLXLXsX$ { LXLXLXsXc sXPXLXgXM.o sXLXLXLXo $ $ LXLXLXsX$ ' LXLXLXsXf sXPXLXgXM.o sXLXLXLXo $ $ o sXLXLXLX{ n sXLXLXLXIX  o GXLXLXIXn u o { LXLXLXsXc { LXLXgXsXo $ $ % ; ; ; r r r r r r r r r r r r r r r r ; r r r 0 % % % b.G.S.H.A.D.l.A.G.G.A.j.h.A.A.h.A.h.A.h.A.h.h.h.A.h.h.h.h.h.h.k.h.f.f.f.f.i.i.d.a.a.a.a.a.a.a.k.d.f.f.f.g.k.k.h.k.z.h.h.h.h.h.l.h.h.A.h.h.A.h.A.A.A.G.G.A.G.H.H.H.H.H.H.D.S.U.F.S.L.L.D.S.S.S.L.U.P.L.P.L.P.P.P.U.P.U.Y.P.Y.U.U.T.E.U.T.T.~.~.T.~.~.~.~.~.~.(.~.(././.(.(.`.^.`.(._._.(._.|._._._._.}.}.}.^._._._._.{._.^._.(.|.(.(.(.(.(.)./.(./.(.(././.(.(.(.(.(.(.`.(.(.|.|.|.`._.|.|.|.|..X'.|.|.`.`._.|.|.}.}.}.`.|.|..X.X|.|.|.|.}.}.|.|. X}.}.}.}.|. X}.|.{.}.}.}.}.}.}.}.}.}.|.|.'.|..X.X.X.X.X|. X|..X|.|..X'.'.'..X.X.X.X.X@X.X@XdX.XdXdXdXdXdXdXdXcXxX@XdXnXxXxXxXdXxXxXcXcXcXcXdXnXxXcXxXdXxXxXxXxXdX@XxXcXzXvXzXcXvXdXzXzXzX'.zX@X XdXdXdXdXdXzX.XzXzXzXzXfXdXzXzXdXdXdXdX.X.X|.|.`.^.(.(././././.(.~.~././.(.(.(.(.`.(.`.|.(.^.`.(.(.(.(.(.(././.(.~./.~.~.~.T.T.Y.L.L.S.L.H.S.H.A.S.H.G.A.A.A.A.A.H.l.A.G.A.A.G.A.J.H.H.H.H.H.H.G.L.S.L.A.L.L.L.L.L.L.L.L.U.U.U.U.P.P.P.P.T.P.P.L.U.U.P.L.L.L.L.P.L.D.P.L.L.Y.L.T.Y.U.T.T.T.~.~.~.T.~.~.[.~.~./././.~.~./././.~.^./.^.^.(.(.(.(.(.(.(.`.(.(.(.`.`.`.{.|.`.|.`.|._.|.`.`._.|._._.|._._.|. X.X X X.X.X.X.X.X.X.X'..X.X.X.X|..X.X.X.X X.X.X|. X.X.X.X.X.X.X.X.X.X@X@X.X.X.X.X.X@X.X.X.X'. X|..X|.|._.|._.|.|._._.`.`.`.|._.`._.|.`.'.|.|..X|..X|.|.|._._.(.(./.~.T.T.T.Y.P.U.Y.P.P.U.P.U.U.U.T.T.T.T.T.~.~.~.~.~.~.(.^.~.^././.!.!././.^./.^.(.(.(.!.(.(.(.(.(.(.^._._._._._._.|.|.`._.|.|.|.|.|.|.|.|. X'.'. X X_.|.|.|._.|.|._.|._.|.|.|. X|.|. X X_.}.}._. X X_.{._.}. X}._.}.}.|._.|.|. X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X|. X'.|.|.|. X|. X X|..X X.X|.|._.|.|._._.|._._.(.`.(.(.^.^.(.(.`.(.(.`.(.!.`.(.(././.(./.(././././././././.(./././.^.[./.(.!././.(.(.(.(.{.(.~.[.^.(././././././././././././.~./.~.~.~.T.~.T.~.T.~.T.~.T.(.U.E.~.~.~./.T.T.~.~.T.~.T.~.~.~.T.T.~.T.T.T.^.T.T.T.T.T.T.T.T.T.T.^.P.T.T.T.I.Y.T.T.T.I.T.T.T.U.T.U.T.T.!.T.T.T.~.~.~.!././././.(.(.(.(._.(._._._._.(.(.(.(.(.(.(._.(.(.^.(.^.(.^.`.^.|._._._.|.|.}. X'.|.|.|..X.XdX'..X.XzX XdXdXdXdXdXdXcXdXdXnXdXxXxX@XdXxXdX@XdXxX.X.X.X.X.X'..X.X.X.X.X.X@X.X.X.X.X|. X|.|._.|._.|.|.[.(._.(.^.|.(.^.|.",
+"Z Z B Z Z Z Z Z Z Z Z Z D D Z L Z H H H H H H H H L Z S Z G Z P L Z Z G H H Z L Z H H H F H H F D Z H Z D Z U D H H Z H L Z Z P m.aXm.M.' t y y r r r r r r r r r r r r r r r r r r * y r r ; * > UXLXLXLXLXLXLXLXLXLXgX- $ o gXLXLXLXLXPXLXLXIX- o 6XPXLXLXo $ o LXLXLXsX  # IXLXLXLXLXLXLXLXIX- o { LXLXLXo o $ $ { LXLXLXLXLXLXPXLXLXgXo   sXLXLXLXLXaXo + IXLXLXLXLXLXLXLXPX%   $ $ % > ; ; 0 r r r r r r r r r r r r r r r ; r r r ; ; % % y H.H.S.H.D.G.l.A.A.A.A.A.A.A.A.j.j.h.A.h.A.A.A.h.h.A.h.h.h.h.h.k.z.h.f.f.z.f.f.a.z.k.a.k.k.k.k.f.f.k.g.f.g.h.g.h.g.h.h.l.l.l.l.h.h.h.A.Z.g.j.A.A.A.S.S.H.H.G.H.H.H.S.H.S.L.S.L.L.L.L.L.U.L.P.L.L.L.L.P.U.P.L.L.P.P.P.P.Y.P.T.U.T.U.U.T.T.T.T.~.~.~.~.~.~.~.~.^././.~.).(.(.(.(._.^.(._._._.{._._._.}.}.|.`._.|._._._._.|.^.^.{.(.(.(.(.(.(.(./.(./././.(./.(.(.(.^.|.(.`.`._.|.`.`.|.|.|.|.|.|.|.`.|.`._.|._.|.}.}.}.}.|.|.|.|.|.|.|.|.|.|.|.[.}.}.}.|.}.'.}.|.|. X X}.}.}.}.{.}._.}.}.|.|..X.X.X X.X.X.X.X.X|..X.X.X|.'.@X.X|..X.X.XdXxX'.dXdXdXzXzXdXcXdXcXdXxXnXcXdXxXxXxXxXxXzXxXcXcXcXJXxXcXcXxXxXxXxXcXzXxXcXdXdXzXzXvXdXzXcXzXzXdXzX.XdXdXdX XzXzX.XzXzXzX.XzXzXvXdX%XzXdXdXdXdX.X'.|.|.`.^.(.^.{.(././.~./.(.~./.~.(.(.(.(.(.(.^.`.{.^.(.(.(.(.^.(.(.~.~.^.~.~.~.~.T.Y.U.L.L.L.L.H.H.H.S.S.A.A.A.A.A.S.A.A.H.A.A.G.G.A.A.G.H.G.H.H.H.H.L.S.L.L.L.L.L.L.L.L.L.U.L.U.U.U.U.T.T.T.T.P.U.U.U.L.L.L.U.L.L.L.P.P.P.P.L.L.U.L.Y.I.T.T.T.T.~.T.~.T.~.~.~.~.~.~.~././././.~./.~./././.!.(./.(.^.(.(.(.`.`.`.`.`.^.^.`.(.^.(.(.(.[.|.^.|._._._.|._._.|. X|.|.|.|.|.'..X.X|..X'.|.|.|.|. X.X.X X'..X X|..X.X|.|..X'..X.X|..X'.'..X X.X.X.X.X X.X.X.X.X.X'.|.'.|.|.|._.(._.[.|.^.|.{.(.^.|._.`.`.`.|.`.|.}.|. X|.|._.`.^.(./.~.~.T.T.T.P.P.L.L.P.P.U.U.U.P.U.T.T.Y.T.T.T.~.(.~.(.~.(.!.!.(./././.!.[./././././.^./.(.(.(.^.(.(._.`.|.(._._.|._._.|.|.|.|.|.|.|.|._.|.|.|.|.|. X`. X|.|._.|.|.|._.|.|.|._.|.}.}.}. X_. X}. X_._._._._.|._.}._.}._.}._.|.|._.|. X|..X.X X.X X.X.X X.X|..X.X|. X X|.|._.|. X_. X X|. X|.|._.|.}.}.`.{._.(._.(._.|.(.(.`.^.(.(.^.(.(.^.(.(.!.(.(./.(./.(././.!././.(./././.!.!././.^.[.(././././.(.~.(.[.(.(.[.^././.(./././././././.!./././.~.~.~.~.~.~.T.~.T.~.T.~.T.T.T.XXXX~.~.T.T.~.~.~.~.~.T.~.T.T.T.T.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.I.I.T.R.I.T.T.U.I.T.U.T.T.I.T.T.~.~.~.~.~./.[././.(.(.(.(._.(._.(._.(.(.(.(.(.(.(.(.(._.(._.(.(._.(.(.(.^.{._._._._._.{._. X'.'.'..X.X@X.X XdX.XdXdXcXdXzXmXdXcXcX%XfXmXxXcXdXzXdXxXdX.X.X.X.X.X.X.X'.dX.XxX.X.XdXdXfX@X.X.X X X.X|.|.|.|._.|._._._._._._.(._.(.",
+"B D D Z B G Z Z Z D Z D D D H Z H Z H D Z L Z L L Z Z Z L L Z Z L Z L L H H Z L H H H Z D H Z H L Z L Z H H H H H Z H H Z L H _ aXpXM.{ n > y : r r r r r r r r r : r : r r r r r r r 0 r r r * > - M.PXLXLXLXLXPXgXn o $ o $ $ aXLXLXLXLXLXUX-   o M.LXLXLX  o o LXLXLXM.o $ + sXLXLXLXLXLXHX-   o sXPXLXLXo o $ $ $ aXLXLXLXLXsX{ LXLXPX$ o - IXLXLXLXgXo $ - gXLXLXLXLXLXgX-   o $ $ % ; ; ; r r r e * r e r r e r r r r r r r ; y ; ; * % % % b.L.A.H.D.A.A.G.A.A.A.h.A.A.A.A.Z.A.A.A.h.h.A.A.A.h.h.h.h.h.h.z.z.k.j.f.f.f.k.z.k.k.k.k.a.a.k.k.k.k.k.g.k.h.h.h.h.l.h.l.h.l.h.z.A.h.A.h.A.A.A.S.A.S.S.Z.H.H.H.H.H.U.L.L.S.L.L.L.H.L.L.L.P.L.P.P.P.P.P.U.U.P.P.P.T.U.U.P.T.P.T.P.T.T.T.T.~.T.~.~.~.T.[.~.~.~.(./.(.~.(.(.(.(.(._.(._._.^.|._.^._._._._.`.|._._._._.[._.{.|._.^._.(.(.(.!.(.(.^.(.(./././.^.(.(.(.|._.^.(._._.|.`.|.|.|.'.|.|.@X|.|.|.|._._._._._.}.}.}.|._.|.|. X|.|.|._.|.|.|.}.}.}.}.|. X|.|.|.|.}.|.}.}.|.{._.|.|._.|.'. X'..X.X X X.X X.X X.X|..X|..X.X|..X.X.X.X.X.XzX.X.X.XvXdXvXcXdXcXdXxXdXxXxXxXxXxXnXxXxXxXcXdXnXdXnXxXxXxXxXxXdXnXcXxXxXxXxXcXvXdXcXzXcXzXzX.XzXzX'. XdX.XdX.XzX.XzX.X%XdXvXdXdXzXzXdXxXdX.X.X.X|._.`.`.^.(.{././././.~.~.~.~./.(.(.(.(.^.`.`.^.{.`.|.(.(.(.(.(.(.~.~.~.~.T.U.Y.U.L.L.L.L.S.H.H.S.H.A.A.A.A.g.S.A.A.A.G.A.A.G.A.W.h.A.H.h.H.H.H.H.H.L.G.L.S.D.U.S.L.S.L.U.L.L.L.L.U.Y.P.U.T.T.T.U.P.L.L.L.P.L.L.L.L.P.P.L.L.L.U.L.U.I.U.T.T.T.~.~.T.T.~.~.~.~././.~./.~.~.^.~./.~.~./././.~./.(./.(.(.(./.`.(.`.(.(.(.(.(.`.`.^.|.(.(.(.(.^.(.(.(.|._.|.`.|.|.|.|.|.|. X X|.|.|.`.|.|.|.|.|.|.|.|.|.|.|. X X'.|.|..X.X.X.X X.X.X|..X'. X X.X.X'..X|.|.|.|.|.`.|.`.`.{.|.(.|.).{.{.(.(.|.^.(.^._.(.`._.|._.}.|.|.}.}.|.(.^.^.~.T.T.U.P.U.L.L.L.U.L.P.P.L.P.L.U.T.T.T.T.T.~.~.~.~.~.~./.~.^././.~./.~.XXE./././././.^.(.(.(.(.(.{.^.(.^._._.|.}.}.|.|._.|.|.|.|.|._.|.|.|.|.|.|._._._.}.}.|.}.|._.`.|._.|.|.|.}. X}.}. X_._._. X[._._._._.}.}. X_._. X|._.|.|.|.|..X.X X X|..X X.X.X.X.X|. X.X.X|.|.|. X X|.|. X X|..X|.|.|._.}.}.}.[.{.`.`.`.|.^._.(.^.(.(.^.(.(.(.(.!.(.(.(.(.(./././././.(.(.~./././././././.(.(.E././././.~.(.(.(.{.(.(.~././.~.(./././././.!./././.!.~./.~./.~.T.~.~.~.~.T.T.~.~.~.~.~.~.~.~.T.^.~.~.K.T.~.T.~.T.T.T.T.~.T.~.(.T.T.T.T.~.T.T.T.T.T.Y.T.T.P.T.U.P.I.I.I.L.R.T.U.U.T.I.T.U.T.T.T.T.T.~.T.~.~.~././././.(.(.(.(._._.(._._._._.(.(.(.(.(.(./.!.(.(.(.(.(.(.(.(.`.|.^._._.|.|.|.'.|.|..X.X.X.XdX.X.XzXdXzXzXzXvXzXvXzXcXcXcXcXcXzXzXcXxXdXdXdXzX.XzX.X.X.X'.@X.X.X.X.X.X.XdXdX.X.X.X.X.X X|.|.|.|.|.|._._.{.|.(._.^.^.",
+"D C Z Z Z F Z C Z Z D D D D Z L H H Z H H D L Z L Z L L Z Z L Z Z Z Z L L Z L L Z H H H H H H Z H H Z H H D D H H H H H Z L P c.pXm.{ _ u > * : r r r r 0 e r r r 0 t r r r r r r r r r r r r ; % % $ $ w c l f o $ o o   o o $ $ o n f f + o o o $ o $ o $ $ $ $ o $ o o $ $ $ $ o c n c +   o o $ $ $   o $ $ $ $ - & - c ' o o   o   o o $ o , n c f o $ , $ $ $ c n n o   o $ $ $ $ % * % r r r r r r r r r r q r r r r r r r ; q r > ; % % $ H K.A.A.L.S.H.A.A.G.A.W.h.A.A.A.A.A.A.A.h.A.h.A.h.h.h.h.h.h.h.h.h.h.h.k.g.k.k.k.k.k.i.k.k.k.k.g.h.k.z.g.g.h.h.h.h.l.A.l.h.A.h.A.A.A.h.A.A.A.A.S.A.H.H.H.H.H.D.L.L.L.S.L.S.L.L.L.L.L.L.L.L.L.L.P.P.P.P.P.Y.Y.Y.T.P.T.T.T.T.T.T.U.U.U.XXT.T.T.~.~.~.~.T.~.~.~.~.~.~.!.(.~.[.(.(.(.(.[._.^.^._.|._.{._._._.(._._. X_._.|.(.|.(.|._.(.(.(.(.(.^.^.(./.(.(.(.(.(.(.^.^.|.|.|.`.|.'.'.|.|.'. X'.'._.`.|.`._.|._.|.(._._._.}.|._.|.|.|. X_.|. X|.{._.}.}.|. X|.'..X|.|.|.|.|.|.|.|.|._._._._.}.|.|. X X.X X X@X|.|..X'..X'..X'..X.X.X.XdX.X.X.XzX.XdXdXdX.XdXdX.XdXcXdXcXdXxXxXxXxXdXxXxXcXxXnXxXxXxXxXxXxXxXxXxXcXdXdXxXcXcXdXdXxXxXzXzXzXzXdXzX.XdX@XdXdXdXzX.XzX.XdXdXdXzXzXzXvXdXdXdXdX@X.X.X|._.`.^.(.(././././.~.~.~.~.~./.(.[.(.(.`.^.`.{.(.`.(.(.^.|.(.(.(.!.~.T.T.T.U.U.L.L.L.L.H.H.S.H.A.h.A.A.A.A.h.A.A.A.A.A.A.A.A.A.A.A.S.A.H.A.A.H.H.H.P.A.L.U.S.L.L.L.U.L.L.L.U.Y.L.U.U.U.T.T.P.T.U.U.Y.U.P.L.L.L.L.L.P.P.Z.P.L.L.T.U.T.T.T.T.T.~.T.~.(.~.~.~./.~././.(.~.~.~./.~.~./.~.!.[.[././.(.(.(.(.^.(.(.^.(.^.(.(.^.(.|.(.(.^.(.(.{.{.(._.(.(.^.^.`.(._.|._.|.|.|._._.|.|._.`.|.`.|.|.|.|._._.|.|.|.|.|.|.|.|.|.|.|.'.|.|.|.|..X X'.|.|.|.'.`.|.|._._.^.`.^.`.(.(._.[.(.^.(.^././.^.(.(.(.(.(.^._.}.}.|.(.(.^.^./.~.T.R.T.U.U.L.P.L.L.L.L.L.P.L.L.L.U.U.U.U.T.~.~.T.T.~.T.~.^.~./.~././././.[.^.(.(././.~././.!.(.(./.(.(.`.(.`.(.(._.}.|.|.|.|.|.|.|.|.|.|.|.|.`.|._.^.|._._.}.}.}.}.(.`.(.`.|._.{.|.}.}.}.}._. X X_._. X_. X_._._.}._._._._._._._.|.|.|.|.|. X.X.X|. X X'..X|. X|..X'.|. X X|.|.|. X|.|. X_.'.{.|.|.}.}.}.}.`.(.(.|.{.(.(.(.(.(.(.`.(.(.(.(./.(.(././././.(././.(./.^./.(././././././.~.~.(.)./.(./.(.(./.(./.(.[.(././.^.~./././.~.~./././././.~./.~.~.~.!././.T.T.~.~.~.T.~.~.~.T.~.~.T.~.~.~.T.~.T.~.T./.~.~.T.T.T.~.I.T.T.~.T.T.T.T.T.T.T.P.T.P.T.U.U.U.Y.I.U.U.I.L.U.T.U.U.I.T.T.U.T.T.T.~.~./.!.[.(././.(./.(.(.(.(._._._._._._.(._.(.].(.(.(.(.(.(.(.|.(.(.(.^.`.(.(._._.|._.|.|. X X X XxX.X.XzXzX.XzXdXdXzXzXzXzXzXvXdXcXdXcXzXzXzXdXdXdXdX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XdX@XzX.X.X.X.X.X.X'.|.|.|.|.|._._.|.{.{.|.",
+"Z Z Z Z Z D Z Z Z Z D Z Z Z L L H Z Z H D D Z H Z S Z Z L Z L Z L Z Z P L H Z L H H H H H H H H H D H H H H Z H H L L Z P Z J m.M.M.{ n y r 0 r r r : r r r r r r r r r r r r r r 0 : : r 0 0 r ; ; % $ , $ o $ o o $ o , o $ $ $ $ , o $ o o o $ & $ $ & , $ $ $ $ $ $ , $ $ $ $ $ $ o $   o $ $ $ $ $ $ $ $ $ $ % ; % % % $ $ $ o o o o $ o $ $ $ $ $ $ $ $ & $ $ $ o o o o o o $ $ % % ; ; 0 r r r r e r : r r r r r r : r r ; r ; r r r % % & 0 D.H.D.L.S.A.G.A.A.A.A.A.A.l.A.A.A.A.A.A.A.h.h.A.A.A.h.l.l.l.h.h.h.h.g.j.h.k.h.k.g.k.d.k.k.k.h.k.h.h.g.h.h.g.h.h.h.A.A.l.A.h.A.A.A.A.A.A.S.S.H.S.A.S.H.H.H.H.H.L.L.L.U.L.P.L.L.L.U.L.P.P.L.U.P.T.U.T.P.T.T.T.T.T.U.T.T.T.T.T.T.T.T.T.T.~.T.T.T.~.~.~.~.~.~.~.~./././././././.(.(.(.(.|.(.`.^.`._._._.}.}.}.}._.|.`.|.|._.(._.(.(.(.!./.(.(.(.(.[.(.(.(.(.(.{.(.|.[._._.|.|.|.|. X X.X X.X|. X|._.|._.`.|.`._._.`.|.^.|._.|.}._.|.|.|.|._.|.|.}.|.}. X|. X X'.|.|. X}.}.}.}.}._._.{._.}.}. X|. X X|.@X|..X.X.X.X.X@X'.'.'.'..X.X.X.X'..X.X'.dXvXdXdXdXvXvXdXdXdXzXcXnXxXcXcXdXxXxXnXcXnXcXcXcXdXcXcXxXcXcXcXcXxXxXdXnXxXdXxXdXzXdXzXzXzXdX'.zXdXdXdX.XdX.XdXdXdXdXmXdXzXvXdX.XxXdX@X XdX X'.|.|.(.{.(././././.~.~.~.~.~.~./.(.(.(.(.|._.(.(.{.(.(.(.(./.(.(.T.T.T.L.L.U.L.L.L.L.L.H.H.H.S.A.A.A.A.h.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.S.G.H.A.A.H.L.H.D.L.L.L.L.L.L.L.Y.L.L.T.L.T.U.U.Y.U.I.Y.T.Y.U.Y.U.L.P.P.P.L.P.P.L.K.P.P.L.T.U.T.T.T.T.T.~.T.~.~.~.~././.~./.~.~.~.~.~.~.~.~./.~.~./.(./.(.(.(././.(.(.(.(.(.(.(.(.(.^./.(./././././.(.^.(.^.^.^.(.^.(.|.(.|._.|._.{.(.`.|.|.(.|.(.`.|.|._.|._.`._.|._._.|._.`.`.`._.`.`.`.`.`._.{.|.'.(.`.(.(._.(.(.(.(.(.(.XX(.~.(.(.~.~./././././././.(.(.(.(.(.^.~.^.~.T.P.T.T.Y.P.P.P.P.L.Y.L.L.L.L.L.L.P.L.U.L.U.Y.T.T.T.T.~.T.~.~.~.~.~.~.~.!.~./.^./.~.~.~././.~.~./.(././.[./.(.(.(.^.|._.`.}._.|.'.|.|.|.|.|.|.|.|._._.|.^.(.`.`._.}.}.|.(.|._.^._.}.[._.|._._._.}.}.}.}. X}._. X[._._._. X_._._._.[.|._._.}. X_.|.}.|.|.|.|.|.|.|..X|. X.X X|.|.|.|.}.}.}.|.|.|.|._._._.|.{.{.|.(._.^.|._.(.(.(._.(.(.(.(.(.|.(.^.(.).^.(./.(.~.(./././.(.(./././././././.~.~.~./.!.~./.(././.(.~./.(.(./.T.[.^.^././.~.!.~.~.~.!.!.~.~.~.~.~.~.~.~.~.T.~.~.~.~.T.~.~.~.~.T.~.~.T.U.~.T.~.T.~.T.T.T.T.T.~.T.~.~.T.~.T.~.T.[.T.T.T.T.T.U.P.L.U.U.U.L.U.U.U.I.U.U.U.P.U.Y.T.T.T.T.T.T.T.~.~.~././.[././.(.(.(.(.`.(._._._._._._.(._._.(.(.(.(.(.(.(.(./.(.(.|._.^._.[._._.|.|.'. X|. X X@X.X.X.X.XzX.XvX.XzXdXdXnXcXdXcXcXcXcXzXcXdXdX.X.XzX.X.X.X.X'.dX.X.X.X.X.X'..X.X.X.XdX.XzX X.X.X.X.X.X|..X|.|.|.|._._.|.|.(.",
+"Z C Z C D Z Z Z Z Z Z D L Z Z Z H H H H D H H H H H Z L Z Z H L H L Z L L Z L L Z H F H F H H Z H H H H H H H H H L H L J L ) pXM.{ ' ^ y r r y r r r r r r r r r r r r 0 e r r r r 0 : r r r r % % ; $ $ & $ o $ o $ $ o - $ $ & $ $ - $ $ $ $ o $ $ $ & $ & $ & $ % % $ $ $ $ & $ $ % $ $ $ o $ & $ $ , % $ $ $ % % ; % % % $ o , $ $ o $ $ $ & $ $ $ , $ $ & $ & $ $ $ $ $ $ $ $ % % * ; * r r r r r 0 r r r r r r r r r r r r r = y r ; * % $ $ n.H.L.G.S.S.S.G.S.A.A.G.G.G.A.A.A.A.A.A.h.h.A.A.z.h.h.h.h.l.l.h.h.l.h.z.z.z.h.z.k.g.k.k.k.k.k.k.z.h.h.l.h.Z.A.A.A.z.h.H.l.A.h.h.A.H.S.S.S.G.S.H.H.H.H.H.H.L.L.L.L.L.L.L.P.L.K.L.U.U.U.U.T.P.T.Y.T.T.Y.T.T.T.T.T.T.T.T.T.P.T.T.U.T.T.T.T.T.~.XX~.~.T.~.~.~.~.~.~./.~././.!.(.~.(.(.(.^.(.(.(.^._._._.}.}.}.}._._._._.|._.{._._.(.(.(././.(.(.{.(.(.(.(.(.(.(._.|._.|.|.|. X.X X.X|..X.X|.'.|.|._._._.(.^.|.|.}.}._.|.`.|._.|.|.|. X|.|.}.{.|.}.}.}.|.|.|.|..X|. X|.|.}.}.}.}.|.(.^.|.}.|.|. X|..X X X X.X|..X|..X.X.X.X.X.X|.dX.X.XdX.XxXdXdX X.XdX.X.XdXdXdXcXzXzXdXdXdXxXxXxXnXcXcXdXfXcXcXcXcXxXxXcXdXcXcXxXxXxXxXnXdXcXdXzXzXzXzXzXzXzXzXdXdXcX.XdXdXvXdXdXdXdXdXzXzXfXvXdX.XdXdX'.'.|.|.`.(.^.E./././.T.~.T.T.T.T./.T.^./.(.(.^.(.(.(.(.(.(.~.~.T.T.T.T.T.U.L.U.U.U.L.L.L.H.H.H.Z.A.l.A.A.h.A.h.A.g.A.h.A.A.A.A.A.A.G.A.G.A.A.A.G.S.G.H.S.L.L.L.L.L.G.L.L.L.P.L.U.U.L.L.U.Y.T.T.T.U.U.U.L.P.P.P.P.P.P.P.L.L.P.P.L.U.T.U.T.U.T.T.T.~.~.~.T.~.~.~.~./.~./.~.^./.~.~.~.~.~.~./.~.~.~.(./.~./.^././.^.^.~.~.^.(.~./././.!./././.~.~.[.T././.^.{.(.(.(.^.(.^.{.^.(.^.^.^.(.(.(.(.(.^.^.(.(._._.|.^.|.|.{.|._.(.`.`.`.(.`.(.(.^._.(.^.)./.^.^.(.(./.(./.(././.~.(.(.(.~.(.^.~./.~./././.^././.~.~.~.~.T.T.T.T.U.U.U.U.P.L.L.L.L.L.L.U.L.L.L.L.L.L.L.L.L.U.T.P.T.T.T.T.T.T.~.~.~.~.~.~.~.~.~./.~.^././././././.!.^././.^./././.(.(.(.^.}._.|.|.|._.|.|.|.|.`.(.{.^.|.(.^.`.(.`.}.}.^._.|.^.`.|._.{._._._._._._._.}._._.}._._. X_._._._._._.}.}.{.}.^. X}.}.|.}.|.|.|.|.|.|.|.|.|.|.|._.|. X|.|.|.|. X X|.|. X{.`.|._._.`.|._.|._._.{._.(.|.{.^.!.(.(.(.(.^.(.(.(.(.(.(.(.(.(./.(./.^././.(./.^./.[././.~.~.~.~.~./.!./././.(.~.(.~.[./.{.~.{.~.~.~.~.~.~.~.R.!./.T.!.~.~.!.~././.~./.~.~.~.~.~.T.~.~.~.~.E.T.[.~.~.~.T.T.T.T.~.T.~.~.T.T.T.T.T.T.~.T.P.U.Y.T.T.U.Y.T.P.Y.U.L.L.U.U.L.L.U.U.Y.U.T.U.T.U.T.T.T.T.~.~.~.[././././.(.(.(.^.(.`._._.'._._._._._._.(.(.(.(._.(.`.`.(.(.(.(.(.^.{.|._.|.|.|. X|.|..X X.X.X X X.X.XzX.XzXdXzXzXdXdXdXcXdXcXdXcXcXzXzXzXzXzX.XfX.XzXxX.X.X.X.X.X'..X.X.X.XxX.X.X.XdX.X.XdX.XzX.X.X.X.X X'. X|.|._.{._._.",
+"B D Z Z C Z Z Z Z Z L Z Z L L S H H H Z H H Z Z H Z L Z H H L Z Z H Z Z H L S Z H H H H H H K H H Z H H H H H H Z H L L L L ' M.M.{ ~ y y e 0 * r r r r 0 r r r r r r r r r r r r r r r r : r r ; ; : % % * o $ $ $ $ & $ % % % % % % $ $ $ $ $ $ & % % % % % & - % % $ % % % & $ % % $ $ $ $ $ $ $ - % $ % - $ % ; % ; % % % $ $ $ $ $ , $ $ % - % % $ - $ & $ % $ % $ $ $ $ $ $ $ % % ; * * r r r r r r r r r r r r r r r r r r r r r r ; * % & $ Y H.G.G.H.L.S.S.H.S.G.G.A.G.A.A.h.A.A.A.g.A.h.A.l.A.h.D.l.l.A.h.h.z.h.h.h.l.k.h.h.k.g.k.k.k.h.h.k.k.A.h.A.h.A.g.S.A.z.A.S.A.A.H.A.H.S.Z.H.G.H.H.H.L.K.H.L.H.L.L.L.L.L.U.L.U.Y.L.U.Y.U.T.U.T.T.T.T.T.T.T.T.T.~.P.T.P.T.T.T.T.U.T.T.T.T.T.T.~.U.T.~.~.~.~.~.~.~.~.~.(././.~./.(.(.^.(.(.(.(.(._._.{.}.}.}.}.}. X X[._._._.|.`.(.(.(.(.(.(.(.(.^.(.(.(._.^.`.`._.|.{. X_. X X|.|..X|..X.X|.|.|.|.|.(.{._.|.(.(.}.`.^.(.(.`._._._.|.|._.}. X|.|.}.}.|.|.|.'.}. X.X|.|.}.|._.[.(.|._.|._.}.}.|._..X'. X X.X.X.X.X.X`..X.X.X|..X.X.X.XdX.X.X'.dX.XdXdXdXvXdXdXvXdXzXzXzXzXxXxXcXxXdXnXxXdXnXdXcXxXcXcXxXcXcXzXzXdXxXcXdXcXxXdXdXdXzX@XzXzXxX'.zXdXcX.XdXcXdXvXdXdXdXdXdXvXxXdXdXdXzXzXdX.X'. X|.|.}.^.(.(.~.~.T.T.~.~.T.T.T.T.T.~.~././.(.).(.(.~.^.~.T.T.T.U.U.U.U.U.U.L.L.L.U.L.H.H.S.A.A.A.A.h.h.A.A.A.g.A.A.A.g.g.A.A.A.j.A.A.A.S.S.A.A.S.S.H.D.A.L.L.U.L.L.L.L.P.P.L.T.P.T.P.L.P.U.U.U.T.Y.U.P.T.T.P.P.Y.Y.U.P.P.P.U.Y.Y.P.Y.T.T.T.T.~./.T.T.~.~.~.~.~.~.~.[.~.!.~.~.~.~.~.~.~.~.~.~.[.~./.~.~./.~.~.~.~.~.~.~./.~.~.~.~.~./.~.T.~.~.~.~.T.~.~.~.~.~.T.E.~./././././.^./.(.^./.(./.(.(.(.(.(.^.^.^.(.(.(.[.(.(.(.(.(.(.(.(./.(.(.^././.(././.^./././././././.~.~.~.~.~.~.~.~.~.~.R.~.~.^.~.~.~.~.^.P.Y.P.U.T.U.L.U.L.L.P.U.P.L.L.L.L.S.P.S.L.L.L.L.P.L.U.Y.T.T.T.~.[.~.T.~.T.~.R.~.~./.~.~.~.~./.~.~.~.~././././.(.!./././.[.(.(.(.|.(.|._.|.|._.`.`.`._.|._.(.(.(.(.^.`.`.(.[.|.^.`.(.(.(.(.(._._._.(._._.|._. X_._._.}.|._._. X_._.}._._.}.}.}.}._.}.}.{.}.}.}.|.|.|.|._. X|.|.|.|. X[.|.}.|.|.}.}.|._._.|.(._.^._._.|._.^.`.(.^.|.(.(.(.(.(.(.(.(.(.].(.(.^.(.(.(.^.(.(.(.(./.(.(.(./.(./.~.~.{.~.~.~.~.~.~.~.!.~./././.(.T.(.~.(.~./.~.E.~.~.~.!.!.R.T.~.T./.~.~.!./.~.^./.~.{.T.~.~.~.~.~.T.T.~.XXT.T.XXU.Y.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.T.Y.T.P.Y.T.U.Y.U.L.U.U.U.L.U.U.U.L.I.U.U.I.I.U.T.U.T.T.T.T.T.T.~.~././././.(./.(.(.(.(._._._._._._._._._.(._.(.(.(.(.(.(.(.(.|.(.(.|._._._.|._.|._.|.|..X|..X.X.X.X.XzX.X.XzXzXdXzXzXdXxXxXdXcX%XdXcXzXzXzX.X.X.XzX.XzX.X.X.X.X X.X.X.X.X.X.X.X.XcX@X.X'.'.xX.XdX.X.X.X.X.X.X.X.X X|. X|._._.",
+"C Z Z Z Z D G B Z Z Z Z Z Z Z Z L Z H Z H Z Z L H Z H H H Z S Z Z L Z P H Z L Z H H Z H H H H H L L D Y H H H H L H Z D H U { { M.{ ^ u r e t e r r r r e r r r r r r r r r r r r r r r r 0 r r * * * * % $ > $ % % & , % % % % : : % % % % $ $ ; % % % % % % % % > % ; % ; % % : % % % $ % , % % % % % ; > % % % % ; : % : % % $ % % $ % $ ; % % % % % % % % * ; ; % % % % $ - % % ; % ; r r r r r r r r r r r r r r r r r r r r 0 0 r r r ; % $ $ u H.D.H.G.S.H.G.A.A.G.Z.G.G.Z.A.A.A.A.A.Z.A.j.A.l.l.l.l.l.l.h.h.h.h.h.h.h.h.h.h.g.h.k.g.g.l.h.h.z.D.h.A.h.h.A.A.h.h.S.A.A.S.A.A.G.A.H.G.H.H.H.H.K.G.H.L.L.L.L.L.L.L.L.U.U.U.T.Y.U.T.U.U.Y.P.^.T.T.T.Y.T.T.Y.T.T.T.T.T.L.U.T.T.U.T.T.T.~.T.~.XXE.T.~.~.~.~.~.(.~.~.~././.(./.(.~./.(./.(.(.(.`.[.}._.}.}.}.}.|._.|._.|.|.(.(._.(.(.(./.(.(.(.(.(.(._.(._._.(.{.|.|.|. X|.|..X.X|..X.X.X.X'. X_._.`.`.|.^.|.(.^.|._.(.`._._.|.|.|._.|.}.}.[.|.}.}.}.|.|.'. X'.@X|.|.}._._.|.(.(.^._.|.[.}.|.|.|..X X X|..X.X.X.X.X.X'..X.X.X.X.X.X.X.X.X@XdXdXdX X.XdXdXdXdXdXzXzXzXzXzXdXdXnXnXdXxXxXxXxXxXxXcXdX@XcX.XcXmXdXxXdXcXcXnXcXdXdXdXdXzXzXzXzXzXzXdXdXdXdXdXdXdXvX.XdXdXdXdXnXdXdX@XzX'.zX@X.X`._.|.(.(./.~./.T.(.T.T.T.~.T.T.~.T.R.~././.~.(./.(.~.~.T.T.T.T.U.U.L.I.L.U.L.L.L.U.H.H.J.G.A.A.h.Z.A.h.h.h.A.h.h.A.A.A.A.h.A.A.A.A.A.A.A.G.S.S.S.G.H.L.S.H.D.L.L.U.P.L.U.L.P.P.P.T.U.U.T.T.U.I.T.U.T.P.P.P.P.P.P.T.P.P.L.Y.P.Y.T.T.I.T.T.T.T.T.T.~.T.[.~.T.!.T.!.~.T.T.!.T.T.~.R.~.~.~.~.~.~.~.~.~.~.~.~.~.~.T.~.T.R.R.~.R.~.T.T.T.~.T.~.T.T.T.T.T.T.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.[.~.~.^././.~.(.[.(.(.~./././././.(./././././././././././.~././././.(.T.(.T.~.~.T.~.T.~.R.~.R.~.~.T.~.~.T.T.T.P.U.U.U.U.U.U.U.U.U.L.L.U.L.L.L.L.L.L.L.U.S.L.S.L.L.Y.T.P.T.T.T.T.T.~.T.~.~.!.~.!.~.~.~.!.~.~.~./././.[././.[././.(././.(././.(.(.(.^.^.[.).|.(.(.(.^.(.(.(.(.^.{.(.(.`.`.{.^.^.(.(.`.{.(.(._.|.^._.|.{._._._._._.}.}.}.|. X].}._.}.}.}._.}.}.}.}.}.}.}.}.|.}.|.|. X}.|.|.|.|.|.|. X}.|.|.|.|.}.|.|.|. X{.`.`.(.`.|.^.|.(.^.(.^.^.(.(.(.(.(.!.(.|.(.(.(.(.(.(.(.^.{.(.(.(.(.(.(.(./.(.(././././.~.~.~.~./.~.~.~.~./.~.~./.[.(.(.~.[.^.~.^.~.~.~.~.!.(.T.~.~.T.~.~.~./.T./.~.~.~.T.(.T.T.~.~.~.~.T.U.XXT.~.~.~.~.T.T.T.T.T.T.T.~.T.T.T.T.T.T.Y.^.P.T.T.U.T.Y.Y.Y.U.L.Y.L.Y.L.L.K.R.L.U.U.U.U.U.T.U.T.T.T.~.~.T././.~./.(.~.(.(.(.(.(.(._._._._._._._.(._.`.(._.(.(.(.(.(.^.{.(.^.|.[.}.|.|._._.|.|.|.|..X.X.X.XzX.X.X.XdXdXdXdXdXzXdXcXdXvXcXcXcXdXcXzXzXzXzXzX@XdX.X.XzX.X.XdX@X'..X.XxX.X.X.X'.'..XxX.X.XdXdXdX.XdX@X.X.X|. X|. X|._.|.|.",
+"Z B D Z Z Z F B D D Z D D D D D J L Z H Z L H Z Z Z S H H Z H H Z H F D H D H H F H H H J G H H H H H P L L K J P Z L H D H { M.{ ' n r > r r y : r r r r r r r y e = y 0 0 r ; 0 0 r r : : e q ; ; ; * 0 % % % % % % % % ; % ; * : * % % % % = * % * * ; % * % % ; % * * % * * : % % ; % % % % * ; % % ; % ; ; % * * e : * % * % % % % % % ; * ; % ; % * % % ; ; ; * % % % % % * ; % ; ; ; r 0 r = r 0 e * r r r r r r r 0 r r r r r r : : * % $ $ : L.H.L.S.H.S.H.H.h.A.G.S.H.A.A.A.A.A.A.A.h.G.A.g.A.h.A.A.g.h.h.h.h.h.h.h.h.h.h.h.z.h.h.h.h.h.l.h.A.h.A.g.A.A.A.h.A.A.A.A.A.G.J.G.G.G.H.H.S.L.L.L.S.L.L.L.L.Y.L.L.U.L.U.U.T.U.U.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.P.T.T.~.U.~.T.T.~.T.~.T.E.U.~.~.T./././.^.~.~.^.~.~.(.[.(.(.(.(._._.}.}.}.}.}.}._. X_._._._._._._._.^.{.(.(.`.(.(.`.(.(._._.(.|._._.|.|. X'. X X.X|..X|.|.|.|._._.|.}.}._.(.|.(.|.^.(.(._.^._._._._._.|._._.|.|.|.`.`.`.|.|.|.|.|.|.}.}.}._.[.`._._.^._._.|.|.|.|. X X|.'.|..X.X.XdX'..X.X.X|..X X.X@X'.dX.X.X X#X.XvX.X.XdXdXdXdXdXdXzXzXzXzXcXcXdXcXcXxXxXxXzXxXzXzXzXzXcXdXdXzXxXxXzXzXzXzXzXdXcXdXdXdXdXzXzXzXzXzXzXdXzX.XdXzX'.zX.XxX.X@XdXdXdXzX'.'..X|.|.(.(.(./.~.~.~.T.T.T.T.T.T.T.T.T.T.~.~.~.~.~.~.T.T.T.T.T.U.T.U.U.L.L.L.L.L.L.L.L.H.H.S.S.A.h.A.h.h.A.g.h.A.h.A.h.l.h.S.g.A.A.A.A.g.A.A.H.Z.S.S.S.H.H.H.L.L.L.L.P.P.U.P.L.U.P.P.P.U.I.T.Y.U.U.U.U.U.L.L.U.U.U.U.L.P.P.Y.P.P.U.U.T.T.P.T.P.T.T.T.T.~.~.~.~.T.Y.~.~.T.T.T.Y.T.T.T.T.T.T.T.~.T.T.T.T.~.T.T.T.T.T.U.T.T.T.T.T.P.T.T.T.T.T.T.T.T.T.P.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.~.~.~.~.~.~.~.~.~.[.^.~./././.~.~./.~.~.~.~.^.~.~.~.~.T.T.!./.~.~.~.~.~.~.~.~.~.~.~.~.T.~.T.~.T.T.T.T.~.T.T.T.T.T.Y.U.U.P.U.U.U.T.U.U.L.U.L.L.L.K.U.U.L.L.L.L.S.L.D.L.L.L.L.U.P.Y.T.T.T.T.T.Y.T.T.~.T.~.T./.T.~.~.R.~.~.~./.~.(.~./././.[.~.~././.~.(./././.^./.(./.[.^.(.(.(.(./.^.(.(.(.(.(.(.(./.(.(.^.^.(.(.(.(.(.{.|.{.|.(.^._._._._._._.}.}._._._.(._._._._._._.(._._.|._._.|._._._.|.|. X_.|._.'.|.|.|._.|._.|.|.|._.^.|.(.(.|.`.(.`.(.`.`.|.{./.(.(.(.!.(.(.(.(.(._.(.(.(._.(.(.(.(.(.(.(.(.(.(.(./.(././././.T./.T.~.~.T.~.T.T.T.T.~.~.[./.~.~./.^.E.~.(.~.T.~.T.T.~.~.T.T.T.~.~.T.~.~.~./.~.~.~.R.~.T.~.T.T.~.~.~.T.~.~.~.T.~.Y.T.T.T.T.T.T.T.T.~.T.T.T.T.!.P.Y.T.U.T.P.U.U.L.U.L.U.L.U.L.P.Y.U.L.P.L.L.T.T.P.Y.T.~.T.T./.T./././././.(./.(.(.(.{.(.|.(.`.`.|.^.|.^.|.(.(.|.`.|._.^.`.^.(.(.(.|.`._._.{.|.`.|.`.'..X.X.X.X.X.X.X.X.XzX.XzXzXdXzXzXzXcXcXxXdXxXxXxXzXzXzXvX.XdXdX.X.XdX|..XdX.X.XzX.X.X.X@XdX.XzX.XzX.XzX'..XzX.XxX`..X'..X.X.X X|.|.|.|.",
+"Z Z C Z Z Z Z Z D D Z G D D Z L H Z H Z H Z Z Z J Z H H H Z H Z Z Z L Z Z H F H H H H H J D H H H H H H H H G D H H H L L H { { { ' u > r r r r r r r r r : r r ; e ; > e 0 > : e : r r : ; ; ; y ; : * * % e ; ; ; % ; r e ; * 0 * * * : t % % * * e : r r ; ; ; > : : = > * : : : * 0 * e ; % * ; ; ; 0 r ; e * r % * : : e * ; ; ; ; ; * ; e ; ; ; 0 ; ; * ; ; % ; ; ; ; ; ; ; % e ; y ; e ; ; y e e r r y * r r r r r r r r r r r r : : * % & o $ D.L.L.L.S.K.A.H.H.G.H.G.H.S.H.H.A.A.A.h.A.g.A.A.h.A.h.h.A.h.h.h.l.h.z.h.h.h.l.h.h.h.h.h.h.A.l.h.A.A.h.h.h.h.A.A.A.A.A.A.G.H.h.H.A.G.H.H.H.S.S.L.U.L.U.L.L.L.U.L.P.U.U.U.U.T.T.T.T.T.T.T.~.~.~.T.T.T.T.T.~.[.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.T.~.T.~.T.XX~.~./.~.~.~./.~.~.~.~.(.~.(.[.(.(.(._._._._._.}.}.}.}._._._._._._.}._._.`.^.(.^.^.(.(.`._.`.^.}.|._._.|.}.|.|. X.X|..X.X.X|.|..X|.|.|._.[.}.|.^./.|.{.^.|._.|.|._._._._. X{._.`.|.|.|.|.|.`.|.|.|.'.|..X}.}.{.|.}.}.|.(._._._._.|.|.'.|. X'..X|..X.X'.'.@X.X.X.X.X|..X XdX.X X.X.X@X XdX.X.XdX@XdXdXzX.X.XzXzXzXzXxXcXdXzXcXcXdXcXnXzXzXzXxXzXzXdXmXxXzXzXxXzXzXzXzXdXdXdXcXcXdXzXzXzXzXzXzXzXdXzXxX.XzXxX.XxX.XzXzX.XdX.XzXzX.X|.|.`.(.(././.R.T.~.T.T.U.T.L.T.U.T.T.~.T.~.~.T.T.T.Y.T.T.I.U.U.L.U.L.L.U.L.L.L.S.S.H.H.S.S.A.h.h.h.A.h.g.D.h.z.h.A.G.h.j.A.g.h.A.h.A.A.A.A.H.S.H.H.H.H.H.L.G.L.L.D.U.U.P.P.U.P.Y.T.I.Y.I.T.U.U.U.U.L.U.L.L.U.L.U.L.U.L.P.P.P.U.U.U.T.T.T.U.T.T.T.T.Y.T.T.Y.^.T.Y.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.U.U.T.T.U.T.T.T.T.Y.T.T.U.U.P.U.U.U.P.P.Y.Y.T.Y.T.T.T.T.T.T.T.T.T.P.T.R.T.T.T.~.~.T.~.~.T.~./.T.~.~.~.~.T.~.T.~.R.~.~.T.(.!./.T.~.~.T.~.~.~.T.~.T.~.T.T.T.T.T.T.T.T.T.T.Y.T.I.T.U.U.I.I.L.U.U.L.L.U.Y.L.L.I.R.L.L.L.L.L.L.L.L.L.L.D.H.L.L.L.L.L.T.U.P.T.T.T.T.Y.~.T.T.~.T.~.T.~.T.T.~.~.~.~.~.~.~.~././././.^.~.~././././.(./././.!././.^.(./.!.(.(./.(.(.(.(.(.(.`.(.|.(.|.|.(.`.(.|.`.^.(././.|.`._._._._._._.}._._._.|.`.`.|._._._._._._._._._._._.|.|.|.}.}._. X|.|.|._.|._.`.`.|._.[._._._.(.^.(.^.(.`.`.^._.(.`.(.(.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./.(.(./././././.!.~.~.~.T.~.T.~.T.~.~.~.~.T.~./.~./.^.(.~.~./.[.~./.~.T.T.(.~.(.T.~.[.T.~.~.(.~.~.~.~.~.~.~.T.~.~.T.T.~.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.U.U.U.Y.U.U.U.L.Y.L.L.U.P.U.U.P.Y.P.Y.U.P.T.T.T.T.T.T.~.R.(.~././././.(.(.(.(.(.(.(.(.`.(.(.^._.(.|.(.`._.^.(.(._._.`.^.(.|.{.`.|.`.|.|._.`.|.|.'..X.X.X.X.X.XzX'.zXzX'..XzXzXzXzXcXdXzXxXzXzXzXzXzXdXzX.XdXzX.XdXzX.XzX.X.X.X.X.X.XxX.X.X X.X.X.XzX.X.XzXzX.XzX@X.X.X.X.X.X X.X|.|.|.|.",
+"Z D Z Z C Z D B Z D Z D Z Z L Z Z H H H Z D L Z Z H H Z H H H Z S H D H H S H H H H F H H H H H J J U G Y H L H L H G J Z H [ { ' ' u e r r r r r r r r r r r r q 0 e ; 0 y ; r : ; r 0 q r : ; r r 0 r r r 0 r ; % r r e = r r : : y : * 0 : y * * e * r * r r e > ; % e : t > : r * e r ; e ; ; ; y : r r ; % 0 r r y r : y : r r 0 * ; ; r * r e ; ; ; * r r e : ; ; * = * ; = e r y = * e ; ; r ; r e ; ; ; r r r r r r r r y : : r r r ; % $ $ o D.L.S.L.D.L.H.K.A.H.H.A.K.G.S.S.H.G.A.A.A.A.j.A.h.A.G.j.h.l.h.l.l.h.l.l.l.l.h.h.h.h.l.l.h.h.A.z.h.A.g.D.h.A.A.A.A.A.h.H.A.S.S.S.H.G.G.G.L.L.L.L.L.L.L.U.Y.L.P.P.P.P.P.U.T.T.T.T.T.T.T.T.T.~.T.~.~.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.T.~.T.~.T.XXT.~.~.T.~.T.!.~.!.~.~././.^.^.(.(.{.(.(._._.|.}.}.}.}. X_. X_. X_._._._._._._.`.^.|.[._._._._.}.}.|._.|.}.'.|..X X|..X'. X|.|.|.|.|.|._.|.|._.`.|.`.`.^.`.|.^._.{._._._. X_.|.|._.|.{.}.}.}.}.}.}.|.|.|.|.|._._.^.^.|.^._._._._._.|.|.|.|.|.|. X.X|..XdX.X.X.X.X.X.X.X.X.X.X.X.XdX.X.X.X.X.XdXdX.X.XdX.XzXzX.XdXzXzXzXdXnXdXzXzXcXdX.XxXzXzXzXdXnXdXxXzXzXxXzXzXzXzXzXdXcXdXdXdXzXzXzXdXhX@XdXzXzXdXdXzX.X.XzX.X.XzXxXzXdX'..X.X.X|.|.`.^././.~.~.T.T.P.U.Y.Y.U.T.U.T.T.T.T.T.~.T.T.~.T.T.I.U.P.T.L.L.L.L.L.L.S.U.U.S.G.A.A.G.A.A.h.A.A.A.h.h.l.l.l.l.g.h.h.A.A.A.A.A.A.A.A.A.A.H.A.H.H.H.H.L.L.L.L.U.U.H.U.U.I.Y.T.P.U.U.U.T.T.U.U.U.L.L.Y.K.L.L.L.L.L.U.U.P.L.A.U.U.P.P.U.T.T.T.Y.T.Y.Y.T.T.T.T.P.T.U.T.L.U.U.U.U.U.T.U.U.P.Y.U.U.U.L.L.L.U.U.L.U.U.L.U.U.U.U.U.I.L.U.U.U.L.U.P.P.L.P.P.Y.U.L.U.P.P.U.U.U.U.L.P.U.P.U.T.U.T.T.T.P.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.T.Y.~.~.~.T.T.~.T.~.T.~.T.T.T.T.T.T.T.T.L.U.L.U.Y.I.I.I.I.U.L.L.U.U.P.P.L.Y.L.U.U.L.L.U.L.K.U.L.U.L.L.U.U.L.L.L.L.L.D.L.G.L.L.U.U.P.T.T.T.Y.T.Y.T.~.T.T.T.T.~.T.~.~.T.~.~.~./.~.^.!./././.(.~.~.~.~.~.~.^./.!./.!./././././.(./././.(.(./.(.(.(.(.|./.(.(.(.(.`.(./.{.`.(.`.(.|.{._._._._._._._._._.(.(.`.(._._._.(._.(._.{._._.(._._.|._.}._.|._._._.|._._._.(.`._._.{._.{.|.(.|.(.(.`.(.(._.(._.|.(.(.(./.(.(.(.(.(.(.(.(.(.(.(.(.(.(._.{.).^.(.(.(././././././.~.~.~.~.~.T.T.~.~.T.~.T.T.~.~.[.~.~././.~./.(.~.~.~./.T.~.~.~.~.~.~.~.T.~.Y.T.~.~.~.~.~.~.~.~.T.~.~.T.~.T.~.T.[.~.T.T.Y.T.T.T.T.T.T.P.Y.T.T.U.T.T.T.T.T.T.T.U.T.U.P.U.Y.U.L.L.U.P.P.P.P.P.U.P.T.T.T.T.T.T.T.T.~.~.~./././.(./.(.(./.(.^.^.(.(.^._.^.{.(.(.`.|._.(.|._.|._.{.|.^.|._.^._._.|.|._.|.|.|. X|..X.X|..X.X.X.X.X.X.X.X.XzXzXdXzXzXzXzXdXxXzXzXzXzXzX.XdX.XdX.XdX.X.XzXdX'.dX.X.X.X.X.X.X.XdXdXzXzXzX.X.XzXzXzX'..XzX.X.X|..X|.|.|.|. X",
+"Z B Z Z Z D F Z D Z D Z Z Z L Z H J Z H H Z Z H H Z H H Z H Z H Z H H D H D F H H F H H H H H H F H H H F H H H L H H Z H H { ' ' Q u : = ; r r r r r r r r r r y % e e ; = = * : y r y > = ; ; 0 r r r 0 e ; r r ; r r ; ; 0 r ; y * * e r : * r r : : r r r r = r e : : 0 e : e e ; ; ; = r r r r ; : r r 0 e r y r * r r = : * 0 r r r r 0 r 0 0 ; e r r r * : ; ; ; y ; * y e % e r y y r r 0 ; y ; ; y r r r r r r r r r r ; 0 : = y r * % & o   L.U.H.U.P.H.H.H.H.H.H.H.A.H.S.S.Z.A.A.A.A.A.G.g.A.A.j.A.A.A.A.l.h.h.h.h.l.l.A.l.l.l.l.l.h.l.A.A.A.h.A.A.A.h.A.A.A.A.W.A.H.S.A.H.H.H.H.L.G.L.L.L.L.L.U.U.Y.P.P.T.P.P.T.U.T.T.T.T.T.~.T.~.T.T.^.T.~.~.~.T.~.T.~.T.~.T.T.~.T.T.T.T.~.~.T.T.T.T.~.T.T.~.T.~.T.~./.[.T.~.~.~.~.~./././.(.[.^._._._._._.}.}.}.}._._._._._._._._._.(.`.^.^.|.^.|._.|._._.}.}._.|.|.|.|.'.|.|.'.|.|.`.|.|._.|.|._.|.^.|.(.(.|.^.{.).(.(.(.`.|._.|._._._._._.|.`.|.|.|.}.|.}.}.}.}.|.|._.|.`.|.(._.|._._._._._.|._.|.|.|. X|..X X.X.X.X.X.X|..X.X.X'.'..X.X.X X.X.X.X.X.X.X.X.X'..X.XzX.XzXzXzXzXzXdX@XcX.XzXzX.XcXzXzXzXzXdXcXnXdXzXxXzXzXzXzXzXzXdXdXdXdXcX XdXzX.XzXvX.X'.zX'.zXzX.XzXdX.XzX.X.XzXdXzX.X.X.X'.|.`.(.(./.~.R.T.T.T.Y.U.U.U.U.U.T.I.T.~.~.~.T.T.T.T.U.T.U.P.P.L.L.L.L.L.S.U.H.S.L.H.H.A.A.A.A.A.A.k.h.h.h.l.l.h.l.g.h.h.h.h.h.h.A.A.A.A.A.A.S.H.H.H.L.S.L.L.L.L.L.U.U.U.U.I.U.Y.T.T.T.U.U.U.U.L.I.U.L.U.J.U.U.L.L.D.L.S.S.L.P.H.L.S.U.L.U.L.L.U.L.U.U.U.T.T.U.U.L.L.L.U.U.U.U.L.Y.L.U.L.L.U.L.L.L.L.U.L.S.L.L.H.L.H.L.L.L.U.U.U.L.U.L.L.L.P.P.L.L.S.P.P.U.L.U.U.U.L.L.L.L.L.U.P.P.U.L.U.U.P.P.T.T.T.T.T.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.Y.T.T.Y.I.I.R.Y.L.L.I.L.L.L.L.K.L.U.U.P.P.P.P.L.L.L.U.L.L.L.L.L.U.L.L.L.L.L.U.U.A.L.U.L.L.L.L.L.L.Y.U.T.P.T.Y.T.T.T.T.T.T./.T.T.T.[.~.~.~.~.~.~.~.^./.~.~.[.~.~.~.~.~.T.~.^./.!./././././././././.(.(././.(.(.(.(.(.`.(.`.^.{.`.{.(.(.`.{.(.`.{.(.(._._.[._.}.}.}._._._._.(.(._._.(.(._.(._.^._.(.(.{._.^.|.}.{._.|.|.|.{._._._._._.`.|.(.`.^.^.(.(.(.(.^.(.`._.(._.{.(.(.(.(.(.(.(.(.(.(._.(._.(.(.(._.(.(.(.(.(.[././././././././.~.~.R.!.~.T.~.T.T.~.T.~.T.~.~.~.!.~.~./.~.~.~.~.~.~././.~.~.!.~.~.~.T.[.~.[.E.(.(.~.~.~.~.~.~.~.~.~.T.~.~.~.T.E.Y.~.~.T.~.T.T.T.T.P.U.T.Y.U.T.T.T.P.~.P.U.T.U.P.U.P.U.U.L.L.K.Y.P.P.P.P.Y.Y.T.Y.T.T.T.T.~.T.~.T.~./.~././.^./.^./.(.(.(.(.(.(.`.(.|.`.`.(.|._.{._.|._.^._._._.|.(.`.|.|._.|._.|.|.|.|.'..X.X|..X'..X@X'.dX@X'.xXzX.X.XfXzXzXzXzXzXdXzXzXzX.XzXzX XdXdX.XdXdXzX.X.X.XdX.X'.dX.X.XdX.XdX.X.X'.dXzXzX.XzX.XdX.X.X.X.X.X.X.X.X|.|.|.",
+"C Z D Z Z Z Z F D Z Z Z H D D H H Z H S Z D Z H D H H H Z H H H L H Z H D H H H D H G H H H H H H H J H H H H F H Z G S Z U ' ' ' c u ; : e r r r r r r r r r r { LXLXLXIX- * ; : pXLXLXLXn e ; : * r e * : r r y y * : r r r r : : y * r = : ; y ; r r r r r r r : LXLXLXLXLXLXLXLXLXLXLXLX% e ; ; ; ; r : : : r * e : y ; y ; r 0 * r r 0 r r r * r r e ; r ; ; y r r r ; e { LXLXLX{ ; ; ; ; 0 r r q y : ; ; r r r r r r r r ; ; : y ; y ; % $ $   L.L.S.U.S.H.L.S.L.L.H.H.H.S.S.A.H.A.A.A.A.A.A.A.A.A.A.A.A.l.A.A.h.h.h.l.l.l.l.h.h.h.h.A.h.A.S.g.Z.A.g.A.A.A.A.A.A.H.S.S.A.S.H.H.H.H.H.L.L.L.L.L.L.P.P.P.P.Y.Y.T.T.T.U.T.T.T.T.T.T.~.T.~.~.T./.~.~.T.~.~.T.T.~.T.T.~.T.T.Y.T.!.T.~.T.T.T.~.~.T.~.T.~.T.~.~.~.~.~.T.^.[.~.[./.~./.(.^.(.(.{.^.|.|.^.}.}.}.}.}._.}._.}.}.}.}._._._._._.|.|._._.|.|.}.|.}.|. X|..X|..X'..X|.|.|.`.`.|._.|.|._.`.^.^.|._.(.^.(._.(.`._._._._._._.|._._._._._.(.}.}._.|._.|.}.|._.|._._._.^._._._.|.(.{.(.`.(.|.|.|. X|.|.|.|..X X.X.X.X.X|..X|..X.X X.X|..X.X.X X X.X.X.X.XdX'.zX.XzX.XdXzXzXzXdXdXdXfXzX.XzXdXzXzXdXdXdXdXdXdXzXzXzXcXzXzXzXzX.XdXxX@X#XzXzXzX#XzX'.zXzX@XdX X.XdX.XzXzXzXdX.XdXdXdX.X.X.X X'.(.(.^.(./.T.^.T.T.Y.U.U.U.Y.Y.Y.T.T.T.T.T.T.T.T.T.U.T.U.U.U.Y.U.S.U.S.H.A.D.H.S.G.A.A.A.A.A.z.S.h.h.l.h.l.h.l.l.h.l.l.h.h.l.h.z.A.Z.j.A.S.S.H.H.H.L.S.L.L.L.U.D.L.U.P.P.U.I.T.T.U.T.U.Y.U.U.L.Y.L.L.L.P.L.L.H.L.S.S.U.S.H.H.H.H.S.L.L.D.L.H.L.L.P.L.U.U.L.L.L.L.L.L.L.L.L.L.L.L.L.L.H.L.H.K.W.L.S.L.S.L.L.H.L.D.L.L.G.L.L.L.L.H.L.L.L.L.L.L.L.H.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.S.L.L.L.P.U.U.P.U.U.U.U.Y.T.Y.T.T.U.T.P.T.I.R.T.Y.Y.T.Y.T.U.T.T.Y.T.T.U.T.L.Y.U.L.L.L.L.L.L.L.H.L.L.L.L.U.L.L.Y.P.L.P.L.U.L.L.L.L.L.U.Y.P.L.U.L.I.L.L.U.L.L.L.D.L.L.G.L.L.L.U.L.P.P.Y.U.U.T.T.T.T.T.T.T.T.[.T.T.T.~.T.~.^.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~./.~./.~.^.~.!./.~././.~./.^././.(.(.(.(.(.`.(.(.(.{.`.{.{.`.(.{.`.^./.|.(.`.(.}.|._._._._.(.`.`.(._._.^.`.(.(.|.(.|.^.(.(.|.(._.`._._.^.|.`.`._.`.(.(.{.(.(.(.{.(.{.(.(.(.(.(.^.(.(.`.|.(.(.^.(.(.(.^.(.(.^.^.`.^.(._.^.(.(.(.^.(.(.{.(.(.~.(./.~.~.~.~.~.~.T.T.~.T.~.~.~.T.~.~.~.~.~.~.~.~.~.{.E.T.~.~.[.~.~.~.~.~./.~.~.~.~.~.XX(.XX~.~.~.~.~.~.~.~.~.~./.~.~.~.XXE.~.~.~.T.T.T.T.T.P.P.P.Y.U.T.I.I.T.Y.T.P.T.P.U.T.T.L.U.U.U.U.U.U.U.P.P.P.T.Y.P.T.T.T.~.T.T.~.~.~.~.~.~.~.E.~.~.(./.(.(./.(.(.(.(.^.^.(._.|._._.{.}.[.|._.}.}.}.}.^.|._._.|.`.`.`.|.@X|.'..X|.|..X.X.X.X.X.X'..X.XdXdX.XdX.XzXzXxXzXzX.XzXdXdXdX.XvX XvX.X.X.X@X.XdX.XzX'..X#X.XzX.X.XzXzX'.dXdXdX.X.XzXzXdX'..X.X.X.X.X.X.X.X|..X",
+"Z Z B Z B Z D Z H Z Z Z D D Z D D Z Z Z D D D D Z H S Z Z Z S Z Z H J Z H D D H H H H H H H H H Z H F H H H H H H L H L Z L ' ' ' ~ y > = r 0 r r r r r r r r r { LXLXLXLXpX* ; r pXLXLXPX{ : ; * : r : : y = > * r y y r e ; ; ; ; y * e * r ; y ; ; r = r = r * e LXLXLXLXLXLXLXLXLXLXLXLX; 0 ; ; = y : y t = r r : y ; ; y e * e r e r r r r ; e r r = t r y r = r r r * : { LXLXLX{ ; ; * ; 0 r * > : : ; ; r : r r r r r r q ; r = y ; % % $ o   H.S.L.L.A.L.H.L.S.S.H.H.H.S.A.H.A.H.A.G.A.A.A.A.h.A.A.A.A.h.A.h.A.h.h.l.l.h.A.A.h.A.h.A.h.j.A.h.A.A.A.h.A.A.A.A.G.A.S.S.H.H.H.H.H.H.L.H.L.L.L.K.U.P.P.Y.P.P.Y.P.T.U.T.U.U.T.T.Y.T.T.~.T.~.~.~.T.T.^.T.T.~.T././.T.~.T.~.~.T.T.T.T.T.~.~.T.T.~.T.~.T.~.T.~.T.~.T.~.T.~.~.~.~./.!.(./.(.(.{.^.(._.}.}.}.}.}.}.}. X_.}.}.}.}._._._.|._._.|.|. X_.|.|.|.|.|.|. X|.'.|.|.|.|.|.`.|.`._.`.[._._.^.`.`.|.(.{.`.(.{.(.^._._._._._._._._._.|.(.{.|.}.}.|._.|._.}.}.|._._._._._.|._.(._.|.(._._.`.`.|.|. X{.|. X.X.X'..X.X'..X|..X X X.X X X X.X|..X X@X|..X.X.X@X X.X.X'.zX'.zX'.zX@XzXdXdXzXzXzXfXzXzX@XxXnXdXcXcXzXxXzX.XzXdXzXdXxXdX.XdXdX.X.XzXdX.XzX.X'.zXdXdXdXdX.X.X.X.X.XdXdX.XdX.X@X.X'._.`.`.(.(././.T.T.T.P.P.L.L.U.I.I.T.T.U.Y.T.T.T.T.U.T.L.Y.L.L.L.L.L.U.S.H.S.S.S.S.H.A.A.A.A.A.h.A.h.h.l.h.h.h.h.h.l.h.l.l.h.A.G.l.A.A.A.A.S.G.H.H.H.G.L.H.S.H.L.U.L.L.Y.U.T.U.T.U.T.U.U.U.T.U.U.L.L.U.P.L.L.L.L.H.U.S.H.H.D.S.H.H.L.S.H.H.H.H.H.H.H.D.H.H.U.D.L.S.H.L.H.H.S.H.H.H.H.H.H.H.S.L.H.S.H.S.H.H.H.D.H.H.H.G.L.L.S.L.L.L.D.L.L.L.G.L.L.L.H.L.L.L.L.L.S.L.H.L.H.L.L.L.H.H.P.L.L.L.U.L.P.L.U.U.U.L.U.L.U.P.L.U.Y.U.U.Y.U.T.Y.L.Y.U.U.T.P.P.I.I.U.Y.L.I.L.L.L.L.L.L.L.L.L.K.L.L.L.L.L.L.L.U.L.P.L.L.L.L.L.U.L.U.L.L.L.L.U.U.Y.L.L.L.L.L.L.U.L.L.D.L.D.L.P.L.P.P.P.T.T.T.T.T.T.T.T.~.T.~.T.T.T.~.T.~.T.~.~.~.~.[.[.~.~.T.~.T.T.~.~.~./.~./.~.~.~./.~./.~.[./././././.(.~./.(.(.{.(.(.|.^.(.{.`.(.|.(.^.|.(.|.^.|.^.{.[.(.{.^.(._.(.(.(.(.(.(.(.(.(.(.^.^.(.^.(.(.^._.^.`.(.`._.(.`.`.{.^.^.`.(.(.(.(.(.(.(.(.(.(.(.(.(.`.^.`.^._.|.`.|.|.(.`.(.`.`.(.`.(.(.(.`.(.^.(.[.(.~.!.(.~.~.~.~.~.~.~.~.~.~.T.T.T.T.T.T.T.T.T.T.T.~.T./.~.~.T.E.(.XXT.~././.~.~././.~.~.~.T.~.T.~.T.E.~.~.T.~.~.~.~.~.~.T.T./.~.~.XXU.~.T.~.T.T.T.T.T.T.T.T.T.I.T.U.T.T.P.T.T.T.T.Y.U.L.L.U.U.U.U.I.U.U.U.P.T.T.T.T.T.T.T.T.T.T.~.T.~.~.!.~.~.~.^./.^.^./.(.^./.(.(.(.^.`.(.^.`._.|._.}.}._.|.}.|.{.}.|.{.|._.|.|.|._.|.|.`. X'..X.X'..X.X.X.X.XzX.X.X@XdX.XdXzXzXdX.XzXzXdXzXdXdX.X.X X.X.X.XxX.XdX.X.XdX.X.X.XdX.XzX.X.X.X.XzX#X.XdXdXdXzX.XdX#X.X.X.X.X.X'..X|..X.X",
+"C Z Z F D Z Z F D D D D D D H Z Z H H Z D Z D S Z Z Z Z H Z J Z Z H D H H H H H H H J F Y D H H H H G J H H H H Z L H Z J P ' ' ' u u r : * r r 0 r r r r r r r { PXLXLXLXLXc : % pXLXLXLX' * ; * * t : : y r ; y ; * * : : ; t ; ; e * r : ; ; ; ; e ; ; e r * t : LXLXLXLXLXLXLXLXLXLXLXLX- % ; ; 0 ; ; y % > r r ; e ; e % t e ; ; e : y : : : : ; y > * ; : e e e ; r r r S pXpXM.^ % : : % > : e y ; : ; ; r r r r r r r r r r r r = y : $ $ $   H.L.H.L.G.L.H.S.L.L.S.L.H.H.H.H.H.J.h.A.G.A.H.A.A.l.A.A.A.A.g.h.h.S.g.g.l.A.h.A.A.A.A.g.A.H.A.A.A.A.A.A.A.A.A.A.A.Z.H.G.A.H.H.H.L.H.H.L.L.K.L.L.Y.P.P.P.T.Y.T.T.T.T.U.U.T.U.T.Y.~.~.~.~.~./.~.~.~.~.T.~.~./.T.~.T.~.T.~.T.T.T.~.~.T.T.~.~.T.~.~.T.~.T.~.T.T.T.~.~.T.~.T.~./.~././.(.(.^.(.`._.}.}.}.}.}.}.}.}.}.}.}.}.}.}._._._._.|.|.|.|.|.|.|.|. X|. X.X.X'. X X|. X|.|.|.`._.|._.|._._.`._.^._._.`.^.(.(.(.(.`.(.(.(._.}.}.|._.|.|.|.^.}._._.|.}.}.}.}._._.`._.(.`.`._._.|._.(._._.|.`._.|._.|.|.|..X|..X'..X X.X.X|.|.|..X.X`.|..X X X X X X.X.X.X.X.X.XzXdX.X.XdXzX@XzXzXzXzX.XzXdXdX@XdXdXdXdXdXdXdXzXzXdXxXdXdX'.zXdX.XdX.X.XdXzX.XxX.X.XzX.X.XdXdX XdX@X.X.X.X.X.X.X.XdX X.X.X X_.{.(.^././.~.T.T.T.P.U.Y.T.Y.I.T.Y.T.T.T.T.T.T.T.U.T.L.L.L.L.S.L.S.H.H.S.S.S.S.S.A.A.H.h.A.g.l.l.l.l.l.h.h.h.h.h.l.z.l.h.h.h.h.h.A.A.A.G.S.S.H.H.L.L.L.L.L.L.L.L.L.I.U.U.U.U.U.T.U.T.Y.T.L.L.Y.L.L.L.L.L.D.H.H.L.H.H.H.S.S.G.H.H.H.D.H.H.H.H.H.A.H.H.D.H.H.H.G.H.H.H.H.S.H.G.H.H.H.H.S.H.H.S.A.G.S.S.F.H.H.H.H.H.S.H.H.L.L.H.D.U.L.L.L.G.L.D.H.L.S.L.L.H.L.S.L.L.L.D.D.L.H.H.H.L.L.A.S.L.L.S.L.S.L.L.L.L.L.L.S.L.L.L.U.L.U.U.I.U.I.U.Y.U.U.Y.U.P.I.Y.U.L.L.L.L.I.L.L.L.L.L.L.L.L.L.H.U.L.L.U.L.L.P.L.L.L.L.L.L.L.L.L.L.U.P.P.L.U.U.L.Y.L.L.H.L.S.L.L.H.D.L.L.U.L.P.Y.P.P.T.P.P.T.T.T.T.T.T.T.T.T.(.T.~.T.~.~.P.[.~.~.~.~.~.T.~.[.~.~.(.T.~.(.(.~.~.[./.~.~././././.[./.~.^.(.(.(.(.(.^.(.(.(.(.(.{.`./.|.`.(.{._.|.(.(.|._.^.|.^.(.(.^.(.(.(.(.(.(.(.(.(.^.(.(.`.{._.(._.(.|.|.^.(.`.(.(.`.(.^.^.(.(././.~.(.(.~.(.(.(.(._.(.^.`._._._.^._.(.`.^.`.(.`.(.^.(._.(.(.(.`.(.(./.^.^./././.~.~.~.~.~.~.~.R.~.T.T.T.~.T.~.~.T.T.~.T.T.T.~.~.T.~.T.T././.~.~./.~.~.~./.~.~.~.T.T.~.T.~.~.~.~.T.~.~./.T.~.).T.T.T.~.~.XX[.T.~.T.T.~.T.T.T.P.P.P.U.Y.U.T.P.Y.T.P.U.U.U.U.Y.L.U.L.U.U.U.U.T.T.P.T.T.T.T.T.T.T.T.T.T.T.~.~.~.~.~.~./.!.!././.(./.(.(./.(.(.`.^._.|._._.|.{._.}.}.}.}.}.}.}._.|._.|.|.|.|.|.|..X|. X|..X.X|..X X.X.X.X.X.X.X.XdXdX@X.XzX.XzXdXdXdXdXdXdXdX X%X.X.X.XzX.X.XxXzX.XzXzXdX.XdX.XxX@XdX'..XxXzXdXdXdXdXdX@XdXzX'..X.X.X.X.X|..X|.",
+"Z Z C Z Z Z D C D D D D D Z S Z Z L Z H D S D Z Z L Z J Z Z L Z Z H Z H Z F H H H H L H H H H D H H H H H H H H H H G P D S / c ^ ^ y r : y : : r r r r r r r r { LXLXLXLXLXIX- ; pXLXLXLX' % % % % ' pXpXpXM.; = : u { ' ' u ; ; c [ { _ : ; ; ' ' { ) e r r y : : ; ; % % LXLXLXLX& & $ % & * % c pXm.pXM.; > e ; u [ { ) t pXpX^ ; ' { ' ! ^ pXM.u * e t M.pXpXpXm.! r r * u ' { { e : u ' { ' % ' m.aX{ ; > r r r r r r r r : y * r ; : * $ $ o   H.T.D.U.L.L.L.L.L.L.L.L.L.H.H.H.S.H.A.G.A.A.h.J.g.Z.A.A.h.l.H.A.A.z.D.h.l.h.A.A.g.A.A.h.A.A.A.j.S.A.A.A.h.A.A.A.A.A.G.A.G.H.H.A.L.H.L.S.L.L.L.L.U.T.P.P.P.T.T.T.P.T.T.U.U.Y.T.T.T.T.~.T.~././.~.(.~.(.~.~.T.(.~.~.~.~.~.~.~.T.T.T.~.T.T.~.~.~.T.~.T.~.T.~.T.~.T.T.~.T.~.~.~.(./.(./.(.(.)._.^.}.}.}._._._.}.}.}.}.}.}._.|. X_.'.|.'.|.|.'. X|..X.X X.X.X.X.X|.|.|.|._.|.|._._.|.`._.^._.|._._.`.(.(.{.(.(.(.(.^._.`.^.|.|.[.}.}.(.^._.`.|._._.^.`.}._._._._._.(.`.|.|._.^._.|._._._._.(.`.|.|.|.|.|.|..X.X.X.X.X.X|..X|.|.'. X X'.|.}. X}. X X X.X.X.X.X.X.X'.dX.XdX.XzXdX`.zX.X.XzX.XdX.X'.dXxX'.nXdXcXdXzXzXxXdXdX@XzXzX.XxX.XdX.XcX.XzX.XdXzX.XzXzXdXdXdX.XdXzX.XdX.XdX.X X@X.X.X X X'.|.(.^./././.^.T.T.T.P.U.U.U.U.I.T.T.T.T.T.T.T.U.U.L.L.L.L.L.H.S.H.H.H.S.H.S.S.S.A.H.g.A.A.A.l.A.l.l.l.h.h.h.h.h.l.h.l.l.h.h.h.j.A.A.S.A.S.S.H.H.D.D.L.G.L.L.S.L.L.L.I.I.T.Y.U.U.T.T.U.T.L.U.L.L.L.L.L.S.H.H.L.H.H.H.H.S.H.D.H.A.H.A.H.H.H.A.H.H.A.H.S.S.S.S.A.S.H.G.S.A.A.H.H.A.S.S.S.S.S.S.G.G.S.S.S.A.H.H.S.F.H.L.G.L.H.H.G.L.G.L.G.L.L.H.H.H.H.L.L.H.H.U.S.H.D.L.H.L.G.L.H.H.S.P.L.S.S.L.S.L.L.H.L.H.L.H.L.L.L.L.L.U.L.L.I.I.I.R.L.L.L.U.P.L.I.L.L.L.I.L.L.L.H.L.L.L.L.L.L.S.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.P.U.L.L.L.L.P.U.U.U.L.K.H.L.L.L.H.L.H.L.U.L.P.P.U.P.P.P.P.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.~.T.~.R.~.T.T.~.~.T.T.~.~.~.~.~./.^.[.[./.!.~.~./././././././././.(.(.(.`.(.(.`.(.`.(.(.^.{.{.(.(.^.(._.(.{.^.|.(._._._.(.`.(.(.(._.(.(.(.(.(.{.(.|.(.(.(.(.^.^._.(.^.`.^.`.(.(.(.(./././.(.~.(.(./.^.(./.(.(.^.(.^.(._._.`.`.`.`.(.(._.`.(._._._.(.(.(.(.(./././././.T.~.~.~.~.T.[.R.~.~.R.T.~.~.T.T.T.T.T.T.T.T.T./.T.~.~.T.~.~.Y./.~.~.!.~.~.~.^.XX{.~.~.~.~.~.~.~.~.~.~.T.~.T./.T.XX[.T.~.~.~.XX~.~.~.T.T.T.T.T.P.T.T.P.T.I.I.P.P.P.P.T.U.U.U.U.L.U.U.U.U.U.U.U.T.P.T.T.T.T.T.T.T.~.T.(.~.~.~.~.~.!.~./././././././././.(.(./.(.(.(.^.{._._.{._._.}.}.}.}.}.}.}._._.|.`.|.|.|.'.|.|.|.|.'.|.|.'..X|.'..X.X.X.X.X'.'. X.XzX.X.XdX.XzXzX.XdX XdXdXdX.X.X.X.X.X.X.X.XzXzX.XdXdXdX.X.XdXzX.XzX.XzX.XdX'.dXdX.X.X.X.X.X.X.X.X.X.X.X.X",
+"C D B D B D Z Z C D D Z D Z Z D Z Z D Z Z D D D Z Z Z H Z H H Z H Z D H Z H H H D H H H D H H H F H H H H H H J H D H H Z H ^ c / n > = : : r r r r r r r r r r ' LXLXLXLXLXLXsX- pXLXLXLXc % % w IXLXLXLXLXLXPXM.: 0 PXLXLXM.- ; IXLXLXLXw ; ; PXLXLXpX: ; : ; : * ; % % % LXLXLXLX$ $ o % $ u gXLXLXLXLXLXPX{ ; > pXLXPXIXIXLXLXm.> IXLXLXsXLXLXLX{ = M.PXLXLXLXLXLXLXaX; > ' LXLXLXc % pXLXLXUXaXLXLXLXLXgX> * e : 0 r r r r 0 r r 0 r r * & $   o G.P.L.U.D.L.L.L.S.P.D.U.S.H.H.S.H.G.G.S.S.A.A.A.A.A.h.A.A.h.h.h.A.A.A.h.h.g.A.A.j.A.A.A.A.A.A.h.A.A.A.A.A.A.A.A.A.Z.G.H.G.H.H.H.H.H.L.L.L.U.U.P.P.Y.Y.T.Y.T.U.T.T.T.U.T.T.Y.T.T.~.~.~.~.~././.~.~././.~.!./.~.~.~.~.~.~.~.T.~.~.T.T.~.T.T.T.~.~.~.~.T.T.T.T.Y.~.~.T.~.~.T.(.~.^.T.(./.(.{.^.|.{.`.(.`._._._._._._. X|._._.|.|.|.|.|. X|.`..X.X'..X'. X@X'..X.X.X X|.|.|.|.}.}._._._.|._._.^.`.(.`.`.(.|.(.(.`.(.(.|.{.^.`.).|.(.|.(.{.{.`.^.|.(._.(.`.(.`._._._._._.[._.|._.{.|.(.`.^.{.{.}.}._.|.|.|.|..X|.|.`. X|.|.|.|. X}.}.|.}.|.|.|. X.X|.|..X.X.X.X.XzX.X.X@X.X.X.XdX.X.X.XdXdXdX.X.X.X.X.XzX.XzXxX'..XxX.XdX.XdXdXdXdXdX.XdXdXdX.XxXdXzX'.'.zX.X.XzX'.zX@X.XdX X.X.X.X.X.X.X.X|.|.{.|.[.(././.R.T.T.T.T.T.U.U.Y.U.Y.U.T.Y.U.T.U.U.P.U.U.L.S.H.H.H.S.H.S.S.S.S.H.h.A.j.S.h.A.A.A.h.l.h.z.h.h.h.k.k.z.l.h.z.h.h.l.l.Z.h.h.A.G.G.S.G.H.H.H.S.L.L.L.L.L.U.L.Y.Y.U.T.U.U.P.P.P.P.U.L.L.L.L.L.L.H.A.H.G.S.S.S.A.S.S.S.S.S.S.H.H.H.A.G.G.A.H.A.H.A.H.A.G.G.S.H.S.A.A.H.A.S.A.S.A.H.A.A.A.A.H.A.H.G.Z.H.H.H.H.H.H.A.D.U.S.L.H.L.H.H.L.H.H.A.H.H.H.H.L.L.L.H.H.H.H.H.H.H.H.S.S.S.G.H.A.H.H.A.S.K.H.S.S.K.H.H.L.H.L.U.L.L.L.L.U.U.U.L.P.L.P.L.L.L.U.L.L.U.L.L.K.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.H.L.L.L.L.L.L.L.L.U.L.L.L.P.P.P.P.L.L.L.L.L.L.L.L.L.L.L.U.L.U.Y.T.T.U.T.T.T.T.T.T.T.T.P.T.T.T.T.T.T.~.[.T.T.~.~./.T.~.T.~.^.T.~.~././.~.~.^.T.^.~.~.!.~./.~.^.[.E.~.^.(.[.(.(.(.(.(.|.(.(.^.`._.^.`._.`.`.|.|.^.|.(._._._._._.(.(.(.(.(.(.(.(.{.(.(./.(.(./.(.).{.(.(.^.{.^.`.^._.{.^.(.^./.[./.E.~.(.~.[.(./.(.(.(.(.(.(.|.`.`.(.(.|._._.|.(./.|.{.^._.(.(.(.(.!.^./.!./.~.!.~.T.^.T.(.T.~.T.T.~.T.T.~.T.~.T.T.T.T.T.T.T.T.~.T.~.T.~.T.(.~.~.~.~.~.~.(.~.{.U.~.T.~.T.~.~.~.T.T.XXU.XX/.T.~.T.~.^.~.T.~.~.T.[.T.~.T.T.T.T.T.T.T.L.T.L.L.L.P.P.Y.P.P.U.P.P.U.U.Y.P.P.P.Y.Y.T.T.T.U.P.T.T.!.~.T.T.T.T.E.XX~.T./.~./././././.~.~./././.(.(.(.(.(.(.^.`.`._._.`._._.|.}.|.}.}.|._.'.'.|. X X|.'..X|. X|.'..X X.X.X|..X.X|..X.X.X.X|..X.X.X@XdXzXzXzX.X@X.X.X.XdX.X.X.XzXdX.X.X'.zXzXzXdXdX.XdX.X.X'.zX.XzX.XxXzX.XzXdXdX'..X.XdX@X.X.X X X.X.X",
+"G Z Z Z G Z Z Z Z Z Z Z Z G D D S Z Z F Z D D Z H Z H Z Z Z Z H Z H L S H H H D H H H H H H H F H H Z H H H H Z Z H H H Z H S u u u u > : r 0 r r r r r r r r r ' LXLXLXPXLXLXLXf { LXLXLXc $ - IXLXLXLXLXLXLXLXLXc * gXLXLXgX: u LXLXLXLXM.; c LXLXLXc % ; : r : ; ; ; % % LXLXLXLXo $   $ - IXLXLXLXLXLXLXLXLXn $ pXLXLXLXLXLXLXc , IXLXLXLXLXLXIX% c LXLXLXLXLXLXLXLXLX' % ' LXLXLX' % pXLXLXLXLXLXLXLXLXLX{ % * * * r r r r 0 : r : = r % & $   % L.H.U.U.L.S.L.L.L.P.U.S.P.K.H.H.H.H.H.S.S.S.A.H.A.S.A.A.h.D.A.A.A.z.S.l.h.G.A.h.A.A.h.A.A.A.h.A.A.A.A.A.A.A.A.A.G.A.G.Z.G.H.H.H.L.L.H.L.H.U.L.P.Y.Y.T.T.T.U.T.T.T.U.T.U.T.T.T.T.T.~.~./././.~./.~.~.~.~.~.^.~.~././.~.~.~.~.~.T.~.~.T.~.~.~.~.T.~.T.U.~.~.Y.T.Y.T.T.~.~.~.~.^.~.^./.(.(./.^.|.|.(.`._._.|.|.|.|.|.|.|.|.|.|.|.|. X|..X.X.X'..X.X.X'..XdX X.X.X|. X|.|.|.|.}.|._._.{._._._.(.|.(.(.(.(.(.(.^.^.(._.^.|.).(./.`._.{.^.|.(.`.(.(._.(.(.`.`.`._._._._._.|.}.}._.`.^.|.(.|.^._.}.|._.|.|.|..X|.|.|.@X|.|.|.|._.}._.|. X|.|. X}.|.|.|..X|..X|..X.X'..X.X'..X.X.X@X'..X.X.X.X@X.XxX.XxX.X.XzX.X.XxXzXxXzX@XzXdXdXdXdXzX.X@XdXfX.XdXdX.XzXzXzXzX.X.XzX'.dX@X.X X.X'..X.X.X X'.|.|.|._.(.(./././.E.T.T.T.T.T.T.U.T.T.T.T.T.T.U.U.U.P.L.L.L.U.H.H.H.H.H.S.S.S.z.S.A.A.A.A.g.A.h.l.A.l.l.l.h.h.h.h.z.l.j.h.h.h.l.g.G.A.A.A.A.A.S.S.H.H.H.L.U.L.L.L.L.L.L.L.Y.U.U.U.U.P.P.P.P.P.U.P.P.L.H.L.H.H.H.G.W.S.S.S.S.S.A.S.S.H.A.A.S.H.A.A.G.A.G.A.A.A.G.A.G.S.S.A.H.A.A.A.A.S.A.A.A.A.A.A.A.A.A.A.A.H.S.S.H.H.H.H.H.L.L.S.U.H.L.L.H.H.H.H.H.H.D.H.H.S.L.G.G.L.D.H.H.H.H.S.H.H.S.G.G.H.H.S.S.Z.J.S.G.H.H.S.L.H.H.H.H.H.L.L.L.L.L.L.U.U.L.L.L.U.L.L.L.U.L.L.L.L.L.L.L.L.L.L.L.L.L.U.L.L.L.L.L.D.L.L.L.L.L.L.H.L.L.L.L.L.U.P.U.P.P.P.P.L.L.L.L.S.L.L.L.L.L.L.L.L.U.U.U.T.Y.T.T.T.T.T.T.P.T.Y.T.T.T.U.T.T.T.T.T.~.T.T.T.T.~.T.T.T.~.~.(./.~./.^.[.!.~.^.~./.[./.[.^.(.(.(.[.(.(.(.(.^.^.(.(.(.`._._._.`._.`.|._._._.|./._._.(._.(.(._.{.(.(._.(.(.(.(./.(././.(.(./.^.^.(.(./.).^.(.(.(.(.(.(.~.(.T.~.^.~.(.~.(././.(./.(.(.(.(.`.(._._.`._.|.^.(._.|./._.|.(.(.`.(.(.(.(./././.~.~.~.~./.T.T.~.T.T.!.T.T.T.T.T.T.T.U.T.U.T.T.T.T.~.T.T.T.T.~.~.~.~.~.~.~.~.!.~.T.).E.(.^.T.~.T.T.~.~.XXXXU.T./.~./.T.T.T.^.~.~.~.T.~.T.T.T.T.T.T.U.L.T.U.Y.K.Y.U.P.P.P.P.U.Y.P.L.U.L.U.P.Y.Y.P.T.P.T.T.T.T.Y.T.T.T.~.~.XXT.U.T.~.T./.T.T././././.~./././.(./.(.(.(.(.`.(.`.`.^._.|._.|.}.}.}.}.|.|.|. X.X|.|..X|. X.X|..X|.|.|.|. X|..X.X.X.X.X.X.X.X.X.X.X XdX.X.X.XzXdX.X.X.X.X.X.XdX.X.X'.zXzXzX.XzXdX.XzX.X.XzXzXzXzX.XdX@X'.dX'.@XzX.XzX'. X.X.X.X@X.X.X|.",
+"C Z C Z B Z D Z Z C G H Z D D D Z L Z Z D D D D Z Z Z H H Z S H Z Z L Z H H H D H H H H H H H J H H H H H Z H Z Z H H H H Z S u c u y > : r r r r r r r r : r r { LXLXLXsXPXLXLXIXsXLXLXLXc $ sXLXLXLX' & f IXLXLXgX- f LXLXLX* pXLXLXLXLXgX% pXLXLXgX- * * ; % : * ; * ; % LXLXLXLXo o o o pXLXLXLX' $ c IXLXLXgX; pXPXLXLXIX{ { % * UXLXLXLXaXc { % { gXPXLX{ - f LXLXLXpX% { LXLXLXc $ pXLXLXLXgXn aXLXLXLXpX% * : 0 * r r : : r r : * ; % $ o   u P.L.L.L.H.L.L.L.L.L.L.U.S.H.H.H.H.H.H.H.S.A.S.S.S.S.A.G.A.S.A.A.g.A.h.h.A.g.A.g.G.g.G.H.g.h.A.G.G.A.A.G.A.A.H.A.S.S.H.H.H.H.H.H.L.L.H.L.L.L.L.L.P.U.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.~.~.~./.!.~.~././.~.~.~.~.~.~./.^.~.~.~.XX~.T.~.T.~.~.~.T.~.U.T.T.U.T.T.T.T.Y.T.T.~.T.[.~.{.^.~.(.(.|._.(.|.|.|._.|._.|.`.|.|.|.|.|.|.'. X.X.X@X X X.X.X.X.X.XdX.X'.dX.X.X.X.X|.|._.|.|._.}.}._._._._._.|.`.^./.{.|.^.`.^.(.(.{.[.|.(.|.{.|.(.^.(.(.(.(.(.`.`.|._.`.(._._._._.|._.{.{.(.|.^.(.|.(.(.`.[.|._._.`.|.'.|.|.|.|. X|.|._._.}. X}.}.|.|.}.|.|.|.|. X.X X.X|.|..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XxX.XzX.XdXdXzX.X@XdXzX.XzX.XzX.X.XzX.XxXzXzXzXzXzXzXzX.X.XzX.X.XdX'..X.X.X.X'. X X|.|.|.|._._.{.(.(.^./.~.~.T.~.T.T.T.Y.T.T.T.T.Y.Y.U.U.U.L.P.S.L.S.S.S.H.A.H.H.A.S.H.A.A.h.G.A.G.g.h.A.g.A.l.l.h.h.h.h.h.l.k.h.g.h.l.l.h.G.A.h.A.A.A.S.W.S.H.H.S.H.S.U.L.L.L.L.L.U.L.P.L.U.U.U.L.L.L.U.P.U.L.L.L.H.H.G.G.S.S.h.A.h.S.S.S.S.A.S.H.H.A.Z.G.A.A.H.A.G.A.G.A.A.S.A.A.l.A.A.A.A.A.A.J.A.A.A.A.A.A.A.A.S.H.A.H.H.H.H.H.L.L.S.L.L.S.H.H.H.L.S.G.L.H.H.H.U.L.A.U.S.L.H.H.H.H.H.H.H.S.G.G.G.H.A.H.A.H.A.A.H.H.H.G.H.H.H.H.H.H.L.H.L.L.L.L.L.L.L.P.L.L.L.I.U.U.L.U.U.L.U.L.L.L.L.L.U.L.L.L.L.L.L.U.L.U.U.L.L.L.H.L.L.S.L.L.L.L.U.L.U.P.P.P.P.P.L.L.L.L.L.D.U.U.L.U.U.L.T.U.T.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.T.Y.T.T.T.T.T.T.~.T.~.T./.~.~.T.~./.~./.XX~.~.(././.~./.~./.~.(.[.^.(.[.(./.).(.(.(.`.(.[.|.}.}._.^._.^.`.`.{.(._.(.(._.`.{.(._.(.(.(.(.{.(.(././.(./.(.^././././.(./.(.(.(.(.(.(.~.(.~.~./.^.~.~.~.T.(./././.(.(.(.(.(.^.|.|.`.`.^.(.`.|.^.^.|.|.^.(._.^.(.(.(.(.(./.(.!.~.~.!.T.~.T.~.T.~.T.T.T.T.T.T.U.U.U.I.U.U.T.T.T.T.T.T.T.T.~.~.~.~.T./.~.~.(.~./.~.~.T.(.T.~.~.~.~.[.T.E.T.~.T.T.~.T.^.~.~.T.~.T.~.T.T.T.T.P.T.Y.Y.U.U.U.Y.L.U.U.U.L.Y.P.Y.P.P.Y.Y.U.L.Y.U.Y.T.P.Y.T.T.T.T.Y.T.T.T.~.T.T.T.~.~.T.~.T./././.~./././././.(././.(.(.(.^.(.(.`.`._.}.}.|.|. X|.}.}.|.|.'.|.|..X|..X X|.|.'.|. X'.|..X|..X X.X X|..X.X|..X|..X.X.X.X'..X.X.X.XdX.X.X.X.X.X.X.XdX.XzX@XdXzX.X.X.XdXzXzXdXdXzXdXzX.X.X.X#XzX'..XzX.X@XdX.X.X.X X X.X.X",
+"Z B Z Z Z Z Z Z Z Z Z Z G Z D Z Z Z D D Z D D D H S H H S Z Z H Z P Z L Z Z L H H F H H J F H H H H H Z S H D L H H F Z H H ~ u u u u e : r y r r r r r r r r r { LXLXLX6Xc LXLXLXPXLXLXLXc $ gXLXLXIXpXpXM.IXLXLXPX% > IXLXPXc IXLXLXPXLXLX> IXLXLXM.% % % % > : = * ; ; % LXLXLXLXo   o   gXLXLXIXsXpXpXgXLXLXPX% pXLXLXLX{ o - % $ BXLXLXLX- % $ % % > - u { sXIXLXLXLXM.% c LXLXLXc $ sXLXLXPXn & % LXLXLXpX% % % * * r : r 0 * y : ; ; % $   # Y D.L.L.L.L.U.L.L.U.D.D.H.S.L.H.S.L.H.H.H.H.H.H.S.A.A.S.G.A.A.A.A.A.A.A.A.h.h.A.G.g.A.A.h.G.A.A.A.A.A.A.S.G.S.A.A.S.H.H.G.H.H.H.H.S.L.L.L.L.P.L.L.P.U.T.T.Y.T.~.T.T.T.T.T.T.T.T.T.~.~.~.~./.T.).(././.!.(.~.~.~.(.[.~.~.~.~.U.XX~.T.~.~.T.~.~.T.T.~.~.T.T.T.T.T.T.P.T.~.~.~.(.~.~.E./.^.(.^._.|.|./.}.|.|.'.|.|. X|. X.X'..X X.X X.X X X.X.X.X.X.X.XdX.X.X.X|..X|.|. X|.}.}._. X}.}.|._._._.|._.`.(.(.`.(.(.^.`.|._.|._.|.|.(.(.^.|.^.`.(.(.^.(.^.^.^._.^.`._.|._._._._.^._.`.^.|.`.(.|.|.|.^.`.|._._.`.|.|.|.|.|.|._._.|.|.}.}.}.}.|.}.}.|.|.|.|..X|.|. X X'.|.|..X'..X.X.X|..X|..X.X'..X.X@X.X.X'..XzXdXdXzX.XdXdXzXzX.XzX'.zX.XzXdXdXdXzXzXzXzXzXzX.XzX'.zX.XdXdX.X X.X|.|.|.|.|._._._.^.|.(.(.(./././.~.~.T.T.T.T.U.T.T.T.T.T.T.U.I.L.L.L.P.L.S.L.S.H.S.D.S.H.S.A.A.A.h.g.j.Z.A.A.A.h.h.l.l.h.k.h.h.l.k.z.g.h.l.h.l.g.g.A.A.A.A.A.S.A.A.H.Z.H.H.H.S.S.L.L.L.L.L.P.P.P.L.U.L.L.L.L.D.D.L.G.L.H.H.H.S.G.A.S.S.S.S.A.A.h.S.J.A.h.A.A.A.l.A.h.A.G.A.A.A.A.A.A.A.A.A.A.h.A.A.A.A.h.A.A.A.S.A.A.H.A.H.H.G.H.H.H.L.H.H.S.L.G.U.L.L.L.H.G.L.L.G.L.S.U.S.G.U.S.H.H.H.H.H.H.G.H.S.S.S.H.D.A.H.A.H.H.H.A.H.S.S.S.H.A.D.H.H.S.H.H.H.L.L.L.L.L.L.L.P.U.L.I.L.U.U.U.U.L.L.Y.L.L.L.L.L.U.S.S.L.L.L.S.L.L.S.L.S.L.L.L.S.L.L.H.L.L.L.L.L.L.L.A.L.L.P.L.L.L.L.L.U.L.L.U.U.Y.P.U.U.U.P.L.L.L.U.L.P.U.U.T.T.U.T.U.U.U.P.T.T.T.~.~.T.~.T.T.~.T.T.~.~.~.~.~./.E.(.~./.~./././././.(.(.^.^.(.~.(.(.(.(.(.^.`.`.}.}.}.}.`._.|.`.(.(.^.|._._._._.(.^.|.(.(.(.(.(./.(./.(.(.^.^./.(././.(././.(.(.(.(.(.(.(.(.~.^./.^.~.~.~.T.(.~.~.~./.(.(.^.`.(._._._.(.|._.|.(.|.|.|._.|.{._.(.`.(.(.(.(.(./.!.~.~.~.~.~.T.T.T.Y.U.T.T.U.T.L.T.U.U.U.I.T.U.U.T.I.T.T.~.T.~.T.T.T.~.].T./.(.~.~.T./.{.T.T.T.(.~.~.~.T.(.T.~.T.~.~.T.[.~.T.~.[.T.~.T.T.T.T.T.P.T.L.Y.U.Y.U.L.U.L.Y.L.U.P.P.P.U.U.U.L.U.U.U.U.U.U.U.T.U.U.T.T.T.T.~.T.T.T.~.T.T.~.~.~.T.~.T.~.~./././././././.(.(.(.(.(.(.(.(.(._.}._. X|.}.|. X X_. X|. X.X X.X|..X.X|..X.X X|..X X.X.X|.|..X X.X|..X'. X.X|. X.X.X.X.X.X.X.X.X.X.XdX.X.X.XzXzX.XdX.X.X.XzXzXdXdX.XzXzXzXzX.XzXdXzX'.@XzX.X'.'.zXdX.X.X.X'. X.X.X",
+"D C Z Z Z Z Z Z Z Z Z Z C D G Z Z D D D Z L Z L H Z L Z Z Z L Z Z H H H Z L Z L H H F H H H H H D D H H Z L Z Z D H H D H Z J e u r u : r r r y r r r r r r r r ' LXLXLXM.o sXLXLXLXLXLXLXn   IXLXLXLXLXLXLXLXLXLXLX, $ pXLXLXgXLXLXIXsXLXLXsXLXLXLX$ % % % % % : y * * ; % LXLXLXPXo o o o IXLXLXLXLXLXLXLXLXLXLX$ pXLXLXLX$ $ $ $ , UXLXLXIXo , , & $ sXIXLXLXPXIXLXLXLXM.  { LXLXLXc $ sXPXLXLX$ , $ LXLXLXpX& & % % : * * r r * : ; ; * $ $     n.L.S.P.S.P.L.U.L.L.L.S.L.L.L.L.L.H.H.S.L.S.H.H.H.A.S.A.S.S.A.S.A.A.A.A.h.A.h.g.A.A.A.A.A.A.A.A.G.A.G.S.A.D.S.S.A.S.S.H.H.H.L.H.L.L.L.L.D.H.U.L.L.L.U.T.T.T.~.T.~.T.T.T.T.T.~.~.T.~.~.~.~.^.~./.~./.~./.~.~.(.T.(.(.~.(.~.~.XX~.~.T.(.T.~.~.~.~.~.T.T.T.T.T.T.T.T.U.T.T.T.[.~.~.(././.(.(.|.|.{.}.}.}.}.}.|.|. X.X.X X.X.X|..X.X.X|..X.X.X.X.XdX X.X.XdX.X.X.X|..X.X|.|.|.|._.|.|.|.|._.|.^._._.|.(.`.(.(.^.|.(.(.|.|._.|._.(.(.`.(.`.^.(.(.(.(.(.(./.(.|.(.|.^._._.^.{._.(.|.^.{.|.`.|.[.|._.(.`.|._.}.}.|.}.}.}.}.|.|._._.}.}.}.}. X|._.|.|.`.|.|. X|. X|.'. X|.'..X|. X.X|..X.X'..X|..X.XdX.X.X.XzX.X.XzXzX.X.XzX.XzX.XzXxX.XdXzXdXzXzXzXzXzXzXzXzXzXdXzX.XzX.X.X.X.X|. X|.|.{._.|._._.|.[.(.(.(.XX[.~.~.~.T.~.Y.T.T.U.T.T.I.U.U.U.L.L.L.L.S.D.H.H.G.S.S.H.A.A.A.A.A.A.A.l.G.l.j.h.l.l.l.l.l.l.h.h.h.k.h.z.l.h.h.h.l.l.l.A.A.A.A.A.S.S.A.H.A.H.H.H.H.U.L.P.P.P.P.P.P.P.P.L.L.L.L.L.L.H.H.L.U.S.H.S.S.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.G.g.l.G.A.A.A.A.j.A.h.A.A.h.A.A.h.S.A.S.G.A.H.H.H.H.H.S.S.H.H.A.U.L.L.S.H.L.L.G.L.L.L.L.H.L.L.G.L.H.S.H.H.H.H.H.H.S.S.G.S.S.G.H.A.A.H.A.A.h.S.H.A.S.H.S.H.H.S.H.G.H.H.H.S.L.L.U.L.L.L.L.L.L.L.I.L.U.U.U.U.U.U.U.L.L.L.L.U.L.L.L.L.L.S.L.L.L.P.H.S.S.L.L.L.H.L.L.D.L.L.L.L.L.P.L.L.L.L.L.L.U.Y.L.U.P.P.P.T.I.I.I.U.U.L.L.P.P.L.Y.U.U.P.U.T.U.T.T.Y.T.I.T.T.T.T.T.T.T.T.~.T.~.T.~.~.(.~././.~././././.~.[./.[././.~.(.(.(.~.(.^.(.(.`.(._._._.|._.}.}._.|.|.`._.|.^.|.(._.`.^.`.^.`.^.^./.^./.(.^.^././././././.!./././.(.(.(.^.(././.~.~.~./.~.~.~.~.~.~./.~./.(.(.(.^.(.`.`._.|._.|.`.`.(.{._.(._._._._.(.(.`.(.^.(.E.{.~./.~.T.~.T.T.T.T.U.T.T.P.P.P.T.P.L.P.P.L.U.T.U.I.T.T.T.T.~.T.~.T.~.~.~.~.{.~.~.R.(.(.R.~.T.(.T.~.~.~.T./.T.~.T.T.~.T./.~.~.T.~.~.T.T.T.Y.T.T.P.U.L.Y.L.L.U.P.P.L.P.L.L.P.U.L.L.U.Y.U.L.P.P.P.P.U.T.U.T.I.T.T.~.T.T.~.T.T.T.~.T.T.~.~.T.~./.T././././.(././.(./.(.(.(.(._.(.(._.|.}.}. X}.|.|.|. X X|. X X.X.X.X.X|..X X.X|. X|..X|..X|..X|..X|.|..X|.|.|.|.'.|.|..X.X X.X.X.X.X.X.X.X.X.XdXdXdXdXzX.X'..XzXzX#XdX@XzXzXzXzXdX'.zX.X'.'.zXzXzX.X'..X.XdX X.X'.'.",
+"C Z C Z C Z Z Z C Z Z H Z D Z Z D D D D H Z Z Z Z S Z Z H Z Z Z H Z H S L Z L Z D H H H F H H H H H H Z Z H L Z D H F H Z H Z y r e y y r r r * r r r r r r r r { LXLXLX{ o $ UXLXLXLXLXLXf o gXLXLXIXf S c c f x c $ $ w LXLXLXLXLXsX, LXLXPXLXLXsX% $ $ % % % : 0 r : ; ; LXLXLXLXo $ , o gXPXLXIXc c c f x c x $ sXLXLXLX$ $ $ $ o IXLXLXgX, o $ $ sXLXLXLX{ * - LXLXLXsXo c LXLXLXc $ pXLXLXLX$ $ o LXLXLX' $ $ % % * : y r r : e ; * % $     $ H.P.U.U.L.P.L.L.L.L.U.H.H.U.L.S.L.L.S.L.U.S.H.H.S.H.H.S.S.S.A.A.S.A.h.z.A.A.H.A.A.A.A.A.A.A.A.A.A.A.h.S.S.S.S.S.G.G.A.H.H.H.H.L.L.H.L.L.Y.K.U.L.Y.U.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.~.~.~.~.~./.~./././.~./.~.T.T.(.T.(.~.~.~.E.T.~.~.T.~.~.T.T.T.T.T.T.U.T.T.U.T.T.T.T.T.~.T.~.~.~./.!.(.(.(.^.[.}.}.}.}.|.}. X|..X|..X.X|..X|..X.X.X X'. X.X'.@X.X.X.X.X.X.X.X.X X|.'.|.|.}. X_.|._._._.|._._.|._.|.(.|.|._.`.|.(.`.`.^.|.(.(.{.(.(.^.`.(.(.(.|._.(.|././.|.|._.|.|._.(.^.|.{.(.`.^.(.^._.|.|._.^.`._._.}.}.}.}.}.}.|.{.|._.}.}.|.}.|._.|._.|.|.`..X.X|.|..X|.|..X|.|..X|..X X.X|..X.X.X.X.X X X.XdX.X.XzX.X'.zXzX.XzX.XzXdXdX#XdXzXzXzXzXzXzXzXzXzXzXzXdX.XzX.X.XxX.X.X.X X|.|.|.|.|.|._._.^.|.(.(./.~././.~.~.T.~.T.T.T.T.T.U.U.T.L.L.S.K.S.L.H.S.G.G.S.H.A.H.A.A.A.z.A.A.l.l.g.G.l.l.h.l.l.l.h.h.l.h.l.h.h.l.h.g.l.l.h.A.g.A.A.A.A.A.Z.S.A.H.G.H.S.U.S.L.L.S.P.P.L.P.P.S.L.L.G.L.L.H.H.H.A.D.H.A.S.G.A.S.A.A.A.A.A.A.A.A.A.A.A.A.A.A.h.h.h.h.h.h.A.h.G.g.A.h.h.A.h.h.A.h.j.A.l.A.S.S.A.A.A.H.H.H.H.S.H.U.H.L.H.L.S.L.U.S.L.L.L.L.L.G.H.G.L.H.L.G.G.H.H.H.G.G.H.S.H.S.S.S.S.S.H.A.H.A.G.A.S.S.A.A.S.S.A.G.H.H.S.S.A.H.H.H.H.D.L.S.L.L.U.L.L.L.L.I.U.U.U.U.U.L.L.L.U.L.L.L.L.L.L.L.L.L.L.L.L.D.H.F.L.L.L.S.H.H.L.H.D.L.L.L.D.P.P.L.L.L.U.L.L.L.L.L.U.P.P.P.I.I.I.U.L.R.L.U.U.L.L.L.U.U.U.U.U.T.K.U.I.I.U.U.U.T.T.T.T.T.T.T.~.T.~.~.T.~.~.~.~.!.~./.~.~././././.^./.(.(.[.~.(.(.^.[.(.`.|._.|._.|.|.}.}._._.|.^._._._._.^.`.(.`.{.^.^.^.(.(./.(.^.[.^././././././.~.(./././.[.(./.!././.~.~.~.~.~.~.T.~.~.~./././.(.(.(.`.^.(._.{._.{._.{.`.|.|.|.{._.(._._.(.(.^.(.(.(.^.^.(.~.~.~.~.T.T.T.T.T.Y.U.P.P.Y.L.L.P.P.P.L.U.U.U.I.I.I.T.T.T.T.T.~.T.~.T.T.~.~.~././.R.(.T.(.(.T.~.~.T.~.T.~.T.T.~.T.T.T.T.~.T.~.T.T.T.P.T.P.T.P.U.R.U.L.L.Y.P.P.P.L.L.U.U.L.U.U.U.L.U.U.P.P.P.P.L.T.P.P.T.T.I.T.T.T.T.T.~.T.T.~.~.T.~.T.T././././././././.^./.(.(././.`.(.(._.(.}.}.}.}.}.}.}.|.|. X.X|.|.|.'. X|. X|..X|..X.X|.|..X|.'. X X|..X|.|.|.|.|.@X_. X X|.|..X.X.X.X.XzX.X@XdX.X.XdXdXzX.XxX.XzX.X'.zX.XxX'.zXdXdXxX.X.XzXzXzXzX'..X.XdXdX.X.XdX@X'. X",
+"C Z Z Z Z Z Z Z Z D Z Z Z H Z Z Z D D D Z D Z Z L L Z Z H H Z Z Z Z Z Z Z H L Z D H D H H D L Z H Z Z H Z H H D D H A D H Z L y r r r y r r r e r r r r : r ; : ' LXLXPXM.$   z LXLXLXLXLXc   } LXLXLXsXn sXPXLXgXsXo $ o UXLXLXLXLX* o IXLXLXLXLXn o $ $ % % % : r r 0 ; ; LXLXLXLXo   $ $ 6XLXLXLXsXc sXPXLXgXM.$ sXPXLXLX  o o $ , gXLXLXgXo o o $ UXLXLXIX{ n gXLXLXPXM.o c LXLXLXc o sXLXLXLXo $ o LXLXLXsX$ $ $ % % : r r q ; ; ; : % o     C L.L.L.P.P.L.L.U.L.L.L.L.L.L.L.L.L.S.D.L.L.L.H.H.H.H.H.S.S.G.G.S.S.S.S.G.Z.S.G.A.A.A.h.A.A.A.h.A.A.S.S.S.S.G.G.S.H.H.H.H.H.L.L.H.L.L.L.L.L.L.L.L.U.U.U.T.T.T.T.~.T.T.~.T.T.T.T.~.T.~.~.~./.~.~././.[./.~.~./.~.(.(.~.~.~.~.~.T.~.~.~.~.~./.T.T.T.T.T.T.T.U.U.T.U.T.T.T.T.T.~.~.~./.~.~.(.^.^.`._.}.}.}.}.}.}.|..X|..X.X|..X|..X`..X.X X'.|..X.X.X.X.X.X.X.X X.X.X.X|.|.|. X X|. X'.`.|.|.|.`._.|.|.(.|.^.|.{.^.|.^.|.`.^.^.`.|.^.(.(.(._.^.(.{.(.(.{.(.|.^.|.{.^.|.(.(.{.^.`.{.(.^.|.|._.|._.|._._.|.}._._._.}.}._.}.}._._._._.|.{.|._.|. X|.|.|.|..X X|. X X.X|.|..X.X.X X|..X|..X|. X.X.X.X.X.X.X'.dX.X.X.X.XxX.XzXzX#XdXdXxXdXdXzXzXxXdXzXzXzXzXzXzXdXdXxXzXzX.X'..X.X.X.X|._.|._.[._.(.(.^.(.(.(./././.~.~.T.T.T.T.T.U.T.T.U.T.L.U.L.S.U.H.H.H.H.H.A.h.S.A.A.A.A.A.A.g.A.l.l.l.l.l.l.l.l.l.l.h.h.h.h.l.l.z.l.h.l.l.h.l.l.A.A.A.A.S.A.A.S.S.S.G.H.H.H.S.L.L.L.L.S.P.P.P.L.L.L.L.L.H.G.H.S.H.H.G.G.S.A.h.A.A.A.A.h.A.A.A.A.A.A.A.S.h.h.l.A.A.l.h.A.A.h.A.h.h.h.l.l.h.h.h.l.g.A.A.A.S.A.S.S.S.S.H.S.H.H.H.H.L.L.H.H.L.U.L.L.H.L.H.H.L.A.L.L.H.H.L.L.L.G.L.G.S.S.L.D.G.S.S.S.A.S.A.A.A.A.A.A.A.Z.H.H.S.H.A.A.D.G.G.S.S.A.H.H.A.H.H.H.S.U.L.L.L.L.L.L.I.U.L.L.Y.U.K.L.L.L.L.L.L.U.S.L.S.L.S.L.L.S.L.L.L.S.L.S.L.H.D.L.P.L.L.L.L.L.L.P.L.P.U.Y.U.U.P.U.U.U.T.T.T.T.T.L.L.L.U.L.L.Y.L.U.L.U.U.U.U.U.U.L.L.U.U.T.L.T.T.T.T.T.T.T.T.T.T.~.T.~.~./.~./.^.~././././.(.[././.^.T.^./.(.(.(.(.(.(.`._.`.`.|.|.'.|.`.`._.{.`._.|._._.`.(._.(.|.`.(.(.(.{.(.(.E./././././.!./.~././.~./.~./.~.~.~.~.~.[.~.(.T.~.~.T.~.[././././.(.(.{.`.|.|.`.|.|._.|.|._._._._.`.^.`.(.(.(.(.(.(././.^.^./.~.T.T.T.T.T.P.Y.U.U.P.Y.U.P.P.P.P.L.L.P.L.L.I.I.I.T.T.T.T.~.T.~.T.~.XXE.~.T.).U.~.T.T.(.E.~.~.T.T./.~.T.T./.T.~.~.T.~.T.~.T.T.T.T.T.Y.Y.U.U.U.L.U.L.L.L.P.S.P.P.L.L.L.L.L.L.L.U.Y.L.U.U.L.L.K.L.Y.U.I.I.T.Y.T.T.T.~.T.T.T.~.T.~.T.T.~.T.(././.(./././.(.(././.(.(.(._.(._._.}.}.}. X}.}.|.|. X.X|.'.'.|.|.|.'. X X|. X.X|..X X.X|.|.|.'.|.'.|.|.|._.{. X_.|.|.|.|.|..X.X'..XdX.X.XdX.X.XdX'..XzX.XzXzXzX.X.XdX.X.XzX.XzX.XzXzX.XzX'..XzXdX.XdXdXzX.X.X'..X'.",
+"G C Z C Z C Z Z C Z Z H Z G Z H D D D D D Z H Z Z L S Z S Z H Z L Z L Z Z H Z H H F D D Z H Z Z H L J Z D D H D D H Z D Z Z P A * r r r r r r r r r r r ; y ; ; ' LXLXPXsX  , o sXLXLXLXPXx o   UXLXLXPXLXLXLXLXIX- $ , o { LXLXLXIXo # 6XLXLXLXIX  $ $ $ & % ; : 0 : r ; ; LXLXLXLX$ $ o $ , UXLXLXLXLXLXLXLXIXo $ 6XLXLXLX$ $ o $ o UXLXLXIXo $ o $ aXLXLXLXLXLXLXPXLXLX6X$ c LXLXPXf $ sXLXLXLX$ o o LXLXLXsXo $ & % * : r r 0 : ; : % $       n.U.Y.L.L.P.U.P.L.U.L.L.L.L.S.L.L.L.L.L.L.L.L.L.L.H.H.L.S.H.H.H.S.G.H.S.S.S.S.S.A.A.A.A.A.A.A.A.A.A.A.S.S.A.H.G.G.H.H.H.H.H.H.H.L.S.L.L.L.L.L.P.U.U.U.U.T.T.T.T.T.(.~.T.T.~.T.T.T.T.~.~.~.~.~.~././././.(./.~.(.(.T.T.(.~.~.~.~.~.~.~.~./.T.~.T.~.T.T.T.I.T.Y.T.U.T.T.T.~.~.~.~.~./.(.(.(.(.^.`.^.}.}.}.}.|. X X|..X.X.X.X.X.X'..X.X.XdX@X'..X.X.X'..X X.X.X X@X X.X X|.|. X}.'._._.|.|.|.{.}.|._.{.|.(.(.`.|.(.`._.`.`.`.`.^.(.(.|.(.(.(.(.(.(.{.(.^.(.(.(.(.|.{.^.|.(.|.(.^.(._.`.^.{._._.|.{._.`.{._._._._.}._._._._.}._.}.|. X_.|.|.|._. X|.|.|.|..X|.|..X|.|.|.|.|.|.|.|..X|. X.X.X|..X.X.X.X.X.X.XdX.XdX.X'..XxX'.zXzXdXdXxXxXdXdXcXzXzXcXzXzXzXzXzXxXdX.X.X'.zX.X.X.X X_.|.{.|._.^.(.(.`.^.(.(.^.^.~.T.T.T.T.T.T.T.T.T.U.U.U.L.L.L.D.H.H.S.S.S.H.h.J.A.S.A.A.A.A.A.h.h.h.l.l.l.l.l.h.z.h.h.h.h.l.l.k.l.l.l.l.l.h.z.l.A.S.h.A.S.A.A.A.A.S.S.S.H.H.D.L.L.P.S.L.L.L.S.L.L.L.L.H.H.H.H.H.H.H.H.S.S.A.S.A.A.A.A.A.j.Z.j.A.A.A.A.z.h.A.h.h.h.l.l.l.h.h.h.h.h.A.h.h.h.l.l.h.A.A.A.A.A.S.H.H.S.H.H.H.H.H.H.L.H.H.H.H.L.L.S.S.U.L.H.H.L.G.L.G.L.L.H.H.G.H.H.G.L.S.S.L.S.S.S.S.A.A.z.A.A.g.H.A.G.A.A.A.A.A.A.A.H.D.G.G.h.A.H.A.G.H.H.H.H.H.S.L.S.L.L.L.L.L.L.U.L.L.L.U.L.U.L.L.L.L.S.U.S.L.L.L.L.L.L.L.A.L.S.F.L.G.H.H.L.D.L.L.A.L.L.L.L.P.L.P.L.U.L.U.P.U.P.T.P.I.T.Y.I.Y.L.L.U.L.L.L.P.Y.L.U.P.U.L.U.L.U.U.U.U.U.U.L.T.T.U.T.T.T.~.~.T.~.T./.T.~./.~././.~.~.!././././.^.{.E.(.^.^.(.(._._._._.`.`.`.|.|.}.`._.|.|._.|._._.|.{._.(._.(.^.(.(.(.{./.~.(././././././././.~.!./.~./.~.~.~.~.~.~.T.~.T.~.T.~.~.~.~.~././.^./.(.(.(._.(._._._.|.{._.|._._.|.`.(.`.(.(.(.!.(.(.(.(.^.^.~.~.~.~.T.T.T.T.Y.L.U.L.L.L.P.P.P.L.L.L.L.U.L.I.Y.I.I.I.T.T.T.T.T.T.~.E.(.T.(.Y.~./.R.!.T.~.T.~.T./.T./.T.T./.T.T.~.T.T.Y.Y.T.T.P.P.T.L.U.L.T.Y.L.L.L.L.L.P.S.P.P.P.L.L.L.Y.U.L.U.U.L.L.L.L.U.U.I.I.U.I.T.U.U.T.T.~.U.~.T.T.T.T.~.~.~.~./././././././.(.~./.(./.(.~.(.(.(.(.(.}._.}._.}. X}. X|. X X|.|. X'.|.|.|.|.'.|..X X.X X|..X X.X|. X|.|.|. X|.`._._._.|.{.|.`..X.X'.'..XzX.X.X.XzX#X'.zX.X'.zXzX.XzXdXdXdX.XxX.X.XzX.X.XzX'..XzX.XdXdXdXdX'.@X.X.X'..X",
+"C C Z Z Z Z Z Z Z Z Z Z Z G G Z L Z Z Z H Z H L Z Z Z H Z Z Z H H Z Z Z Z Z Z Z J Z L Z D H L L Z H H H Z D D D Z Z G Z Z G L G > = % r : y = e r r r r r r 0 ; n LXLXLXsXo     o IXLXLXLXc   o - aXLXLXLXLXLXIX- o $ o $ - LXLXLXsX    - PXLXLXM.  o o $ $ % ; ; * q = ; r LXLXLXLXo o $ $ % 0 sXLXLXLXLXLXgXd o o sXPXLXLXo o o $ - BXLXLXIX  o $ o - HXLXLXLXIXb aXLXLXBX  n LXLXLXc   sXLXLXLXo o o LXLXLXsXo $ $ % * ; 0 r 0 0 > % % o     0 K.U.U.U.T.T.D.U.L.L.L.Y.K.L.L.L.L.L.L.L.L.L.L.L.L.L.S.U.U.S.U.L.S.S.H.S.S.S.S.S.A.S.A.S.H.g.h.A.A.S.A.A.H.H.h.H.H.H.H.H.H.L.L.L.L.L.U.L.L.L.U.L.L.U.Y.Y.T.Y.T.~.T.~.T.T.~.T.~.T.~.T.~.~.~.~.~.^././././././././././.!.~./.~.~.T.~.~.[.T.T.~.T.~./.T.T.T.T.T.T.T.T.T.T.T.XXXXE.!.~./.(.T./.(.(.(.(.`.`._.|.|.|.|.'. X.X.X|..X.X.X.X.X.X.X.X X.X.X'..X.X X'..X.X.X.X.X.X.X.X|.|.|.|._._.}.}.}. X|._._._.|.|.}.}.}.{.|.|.^._.|.(.{.`.(.(.(.|./.(.(.(.(.(.(.(.(.(.(.|._.|._.[._.[._.(.(.|._.{._.|.}.}.[.(.|._._.|.^.`.^.|.^.|.`.`.|.(.|. X|.|.'. X|.'.|.|.|..X'._.|. X|.|. X|..X.X|..X|..X.X'..X.X.X.X.X.X.X.X@XdX@X.X.XzX.XxXzX.XzXzXzXzXxXxXzXzXdXdXxXdXzXzXzXdXdXdX.X.X.X.X|. X|._._._.(.^.(.(.{.(././././.T.T.~.T.T.T.T.T.Y.U.Y.K.L.L.H.L.L.H.H.H.S.S.H.H.A.A.A.G.A.j.A.A.h.A.x.h.z.h.h.z.z.h.h.G.k.j.h.h.h.h.A.h.h.l.A.g.G.h.A.A.A.A.A.A.A.W.h.J.S.A.H.H.H.H.H.K.L.U.L.G.L.S.G.L.H.H.H.G.S.S.S.z.S.S.h.A.h.A.G.A.A.A.g.A.h.h.h.A.x.G.z.j.z.h.h.h.G.j.l.l.k.k.z.h.h.l.D.g.D.z.z.A.D.H.H.H.S.H.H.S.H.H.H.H.L.H.S.U.Z.L.H.H.H.L.L.H.H.L.H.H.H.H.H.H.H.H.H.H.H.H.K.S.h.H.H.A.H.A.A.A.A.A.A.A.g.A.A.H.A.H.A.S.A.S.A.A.A.S.A.G.S.H.S.S.H.H.H.H.H.L.L.L.L.L.U.L.U.U.L.U.P.L.L.L.S.L.S.L.L.L.S.L.H.I.H.L.L.H.S.U.S.S.H.H.H.S.L.L.L.G.S.L.L.L.U.P.U.U.L.P.P.P.P.T.T.T.U.P.P.Y.P.P.Y.L.P.L.P.L.P.P.U.L.L.L.L.L.P.L.P.U.U.L.L.U.L.Y.Y.T.T.T.T.T.T.T.T.~.~.!.~./.~.!.~.~././././././.(.(.(.(.(.(.(.|._.|.|.{._.|.|.`.`.`._._.}.}.|._._._.`.^.|.(.(.(.(.(.^./.~././.(.(.T.(.T.~.~.~.~././.~./.T.~.~.T.~.T.~.T.~.~.~.(.~.~.!.(./././.(.(.(.(.`._.`.`.`.`.`._.{.|._.`.^.(.`.(.(.(.(.(.(././././.T./.T.T.T.U.U.L.Y.L.P.L.U.L.L.L.A.P.P.L.L.P.P.P.P.P.P.T.T.T.T.Y.~.T.T./.T.~.T.~.~.~.T.T.~.~.T.~.T.~.T.T.~.T.T.~.T.T.T.T.T.T.U.U.Y.P.U.U.L.P.U.L.L.U.L.L.L.L.L.L.H.L.L.S.U.P.L.L.L.P.L.L.L.L.L.L.L.L.R.Y.T.U.T.U.T.T.T.~.T.T.T.~.T./.~.~././././././.(./././.^.(.(.(.(.(.(._.^.|._._.|.}.|. X X|.'.|.|.|.|._.|.`.`.`.|.|.|.|.'.|.|._.|.|.|.|.|.|._.|.(.|.[.|.|.|.|._.|.'..X.X@X X@XdX.XdXdX'.dXdXdX.X.XxX.XzX@X.XdX.XzXzX'.'.zXzXdXdXdX.X.XzXdXdX'..X.X.X.X X",
+"Z Z B Z C Z C Z Z Z Z Z Z Z D D Z L L Z H L H Z Z Z L Z H H H H H H Z L Z J Z H L S H H H D Z Z D D Z Z D D D D Z Z Z H Z Z Z Z u * ; ; * r : : r ; r r r r e ; e e % $ $ $ $ $ , $ o   o o o o $ $ o c x f $ o   o $ , % $ $ + $ o $ o o o o   o   & o , * % ; e : y y ; ; - - - $ o o $ $ % % - % c n n $ o $ o $ o $ $ $ o $ $ , % - o - $ $ , $ % & - t c f $ &   o o o o   $ o o $ $ $ $ o o $ $ $ $ o $ o $ $ $ % % ; : : e ; = % $       [ !.P.P.U.L.U.Y.Y.L.L.L.L.L.P.P.Y.L.K.L.L.L.L.L.L.L.L.L.S.H.S.L.S.H.L.S.H.S.S.S.G.G.S.S.A.S.A.H.A.A.Z.G.S.S.S.H.H.H.H.H.H.H.L.H.L.L.L.U.U.P.U.L.U.L.U.U.I.T.~.T.T.~.~.T.~.T.~.T.T.~./.T.~.~.~.~.[.~././.!./.^./.(./././.~.~.~.~.(.~.~.~.~.^.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T./.~./././.(.^.(.(.`.(.{._._.|.|. X|..X.X.X.X.X.X.X|..X.X'.'.'.'..X.X.X.X.X|..X.X.X.X'..X.X|..X_.|.|.|.|.|.[. X|.{.|.[.|._.(.[.}.}._.^.`.{.^._.(.{.(.(.(.(.(.(.(.(.(.^.`.(.`.(.(._._.|.|._._._.^.|.[.|.|._.}._.}.}.|._.^.`.^._.|.`.`.`._.|.^.|.|.|._._.|.'. X|.|.`.|.|.|.|.@X|.'.|.|. X|..X.X|.|.'.'..X.X.X.X.X.XdX.XdX.XdX.XzXdXzXdXdX.XzX.XzXzXzXzXzXzXzXcXdXxXxXdXdXzXdXdX.XdX.XdX.X X.X X.X|.|.|._.|.|.(.(./././.~.T.T./.T.T.T.T.Y.U.U.U.Y.I.L.L.L.U.L.H.H.H.H.S.S.h.G.A.A.A.A.A.A.A.h.h.A.h.h.G.j.h.h.G.h.l.h.h.h.h.h.h.h.h.x.h.h.l.A.A.h.A.A.h.A.h.G.A.A.A.A.H.H.H.A.H.H.G.H.H.U.L.L.L.L.L.L.H.H.S.H.G.S.S.S.A.A.G.A.J.g.A.A.A.j.h.A.G.h.G.h.h.h.h.h.z.A.h.h.h.h.l.h.l.l.l.h.z.h.g.A.h.l.G.S.A.H.H.H.D.H.L.H.H.H.S.L.H.L.H.H.H.H.L.L.H.H.H.H.H.H.H.L.H.H.H.H.H.H.H.H.H.G.A.S.H.W.A.S.h.A.A.A.A.h.A.A.A.A.A.A.z.S.A.A.A.A.A.H.A.S.A.Z.A.S.S.S.A.S.H.H.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.H.H.L.L.L.Z.L.T.D.L.H.L.H.H.K.K.L.U.H.H.H.H.H.G.L.L.U.P.P.L.P.Y.L.P.P.P.Y.P.U.T.U.P.T.Y.P.P.P.U.L.P.P.L.P.U.S.Y.U.L.L.L.K.P.P.U.L.L.U.U.U.L.U.T.U.U.T.T.T.~.T.T.~.T./.(.T.~.~.~.~./.~.~.~./././.(.(.(.(.(.(._.(.|._.|.}.}.`.`.`.`. X{.}.}._._.|._.`.(.`.`.`.(.(.(.^./.[././.T././.~.(.~./.~./.T.T.T.T.T.T.T.~.T.~.T.~.T.R.~.T.~.~././././.(././.(.(.^._.(._.(.`.(._.|.|.|.`.{.(.(.(.(./.(.(./.(.!././.~.T.~.T.T.T.U.U.U.L.L.L.L.L.L.L.L.P.P.L.P.L.P.L.U.P.T.Y.T.T.T.~.T.~.^.T./.T.T.T.T.~.~.~.~.T.~.T.~.T.T.~.T.T.T.T.~.T.T.T.T.T.U.T.P.U.L.P.U.Y.U.U.U.S.L.L.L.L.L.L.L.H.L.L.L.U.P.L.L.L.L.L.L.L.L.U.L.Y.K.T.U.T.T.T.T.T.T.T.T.~.~.T.~.T.~./.~././.!.(./.(././.^.^.(.(.(.(.(._.(.`.(._.|.}.|._.|.|.|.|.|.`._.|.|._.`.`.`.`.|.|.|.|.`. X|.|.|.|..X|.{.|.|.|._._.|.|.{.|.|.|.|.|..X'.dX.X.X.XdXdXdX.X.XzX'..X.XzXzXdX.XdX.X.XzX.XzXzX.X.XdXdX.XzX.XdXdX.X'..X.X X'.",
+"Z Z C Z B Z D Z C G Z Z D D G D L S Z Z Z Z H H L S L Z Z H Z Z Z Z L Z Z J Z Z H Z Z L H H S L H L Z Z D D D D Z H Z Z L Z L G L * % ; % : : : 0 r r r 0 r r r 0 * % & $ o $ $ $ $ $ $ o o o $ $ $ $ $ $ o $ o o $ o $ $ % % % $ $ o o $ $ $ $   $ o $ % % % ; e r : y = 0 * % , $ $ $ $ - % % % % $ $ o $ $ o o $ $ , , $ $ $ $ % % * % % $ $ $ $ % * % % % $ $ $ o o $ o $ $ $ $ $ $ $ $ $ $ $ % $ $ $ % $ $ $ $ % % ; ; ; : % e 0 $ o     % L.T.P.L.T.Y.S.T.U.L.L.Y.U.U.P.P.U.Y.L.U.L.U.P.P.L.L.L.S.S.L.L.L.L.L.D.S.S.L.S.H.G.G.H.A.G.A.G.A.A.S.S.S.S.S.H.S.H.H.H.U.G.U.L.L.L.L.L.L.L.L.U.L.L.T.P.Y.T.T.T.T.T.~.T.~.~.T.~.T.T.~.T.~.~.~.~.~././././././.(././././././.~./.~.~.~.~.~.~.~.~.T.~.~.~.T.T.T.T.U.T.T.T.T.T.T.~.T.T.~././.(./.).!.(.(.^.`._._.{.|.|.|. X.X.X.X.X.X.X.X.X'..X.X.X@X.X.X.X.X.X'..X.X.XdX.X.X.X|.|.`.|.|.|.|.|.}._.|._._.|.}.|.|.|._.}.}.}.}.`.`.^.^.|.(.|.^.(.(.|.(.`.(.(.^.(.^.^.(._._._.(._.|._.}._.|._._._._.}._._.}.}._._.^._._.|.^.^.`._._._._._.(.|.|.|. X.X|.`. X|.|.|.`.|.|.|.|.|..X|. X X|.'..X.X.X'.'..X.X.X.X.XdX.X.XdX.X.X X.XdXzXzX'.zXzXdXzXzXzXzXdXxXdXzXdXdXzX.XdXdXdXdXdX X.X.X'..X'.|._._.(.(.|.^.(././.~.~.T.T.T.T.T.Y.U.U.U.U.U.U.L.L.L.S.U.H.H.H.S.H.S.A.A.A.A.A.A.A.Z.A.A.A.h.z.A.h.h.h.l.h.h.A.h.A.z.h.h.h.A.h.h.A.G.g.G.h.A.A.A.A.A.G.A.A.A.S.A.h.H.H.I.H.H.H.S.L.H.S.L.H.S.H.H.H.H.G.H.G.S.A.G.A.A.A.A.G.h.A.A.j.G.A.h.g.h.z.z.h.h.h.h.h.j.j.x.h.h.j.g.h.z.z.h.h.h.h.h.A.D.S.S.D.H.H.H.H.H.H.H.H.H.H.H.H.H.S.L.U.H.S.H.H.H.H.S.H.H.S.H.H.H.H.H.H.A.H.H.h.H.H.H.S.A.A.A.A.A.A.A.h.A.A.A.g.G.h.A.S.h.Z.A.A.h.A.A.S.A.H.A.A.A.A.S.A.G.H.H.L.H.L.L.L.L.L.L.L.L.L.U.U.U.L.L.D.S.L.H.S.H.D.H.H.L.L.H.H.H.H.H.S.U.S.H.H.U.G.G.L.G.L.S.L.L.P.U.L.U.P.P.P.Y.P.T.T.U.U.P.P.U.L.U.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.U.U.U.T.T.T.T.Y.T.T.T.(.T.Y.~.~.~.~.T.~.~./.^./././.(.^.(.(.(.(.|.|._.}.}.}.}.|.|.}.}._._.}.}.|.|._._.(.`.`.^.^.(.(.(././././././.(././.~.~.~.~.~.T.~.~.T.T.~.T.T.~.T.~.T.~.~.~.Y.~.~.~.!././././.(.(.(._.`.`._._.`.`.}.}.{._.|.(.`.(.(.`.(.(.(././././.!.~.T.T.T.T.T.Y.U.L.L.L.L.L.L.L.L.P.L.D.L.L.L.P.L.U.P.P.P.T.T.T.T.T.~.~.T.[.T.T.T.T.T.T.~.T.~.T.~.T.~.T.T.T.T.T.I.U.Y.T.U.U.T.U.U.L.P.U.Y.L.L.L.L.L.L.L.H.L.L.L.L.H.L.L.S.L.L.P.L.L.L.L.L.L.L.L.L.L.U.Y.Y.U.U.T.T.T.T.~.T.T.~.T.~.Y./.~.~.~./.!././.(./././.(.^.^.(.[.(._.^.).(._._.(.}.}._.|.|.|.|._._._.|.{.`.`.`.`.`.|._.|.|.|.|.@X.X|.|.|._.|._._.|._._.(._.{.|.|.|.'..X.XdX.XdX'..X'.dX.XzXzXdXdXxX.XzX.X.XzXzXdX'..XdXxX.XzX'.zX.X.X.XxXdXdX@XdX.X.X.X X",
+"C C Z C Z D B Z Z Z Z Z D D Z Z Z Z Z L H Z H L Z Z H H P Z H Z L Z S Z Z S L Z Z J Z H H H H Z Z Z H Z D D D D H L Z G Z Z Z Z Z A * % e * y = ; r r 0 ; r r r * % 0 & - $ $ $ $ % $ & , $ o $ $ $ - $ $ $ o $ o $ $ $ % % % % $ $ $ $ $ $ $ $ $ $ $ $ & % ; ; % r * : r * 0 0 % % $ $ , % % % % % $ $ o $ o $ $ $ $ $ & $ $ $ & $ * * % % % & - % $ % % ; & % $ o $ o o $ o $ $ $ $ - $ $ o $ $ $ $ $ % , $ $ $ & & % % ; ; ; > = $ &       n.U.U.P.U.Y.L.U.U.L.U.U.L.U.Y.P.Y.Y.P.P.L.U.L.L.L.L.L.L.L.U.L.L.L.S.H.U.K.U.S.H.H.S.Z.J.H.G.S.S.G.S.A.S.H.H.H.H.H.H.H.S.L.L.L.L.L.L.L.L.T.U.U.U.U.T.P.P.T.T.T.T.T.~.T.~.T.T.~.T.~.T.~.~.~.T.T.~./.~././.[./././.(.(.!./.!.~././.~.~.~.~.T.^.T./.T.T.T.~.~.T.T.~.~.T.T.T.T.T.T.~.T.~.T.T.~././.(.(.(.(.^.^.`.`._._.|.|.|..X|..X|..X.X.X.X'..X.X.X.X.X.X.X.XdX.XdX@X'.dX.X.X.X|.|.`.|._.|.|. X}.|._.|. X}.}._._.|.|.}.}.}.|.{.`.`._.(.(.`.(.^.`.^.(.`.(.`.`.`.`.(.`._.(._.[.(._._.|.|._._.|.}._._._.}.}._._.`.|.|.`.`.`.{.|.{.|.|._._.|._.|.|.|.|.'.`.@X|.|.|.|.|.|.|.|.|.|.'.|..X X.X|.|..X.X@X.X.X.X.X.X.X.X.X'..XdXdX#XzX.X'.dXzXdXzXzXzXzXzXdXdXzXzXdXdX@XzXzXzXdXdX@XdX.X.X.X.X X|.|._._.`.(.(.~.~././.T.T.T.T.T.U.P.P.P.U.L.U.U.L.U.S.U.S.H.H.S.H.S.S.H.A.A.A.A.A.A.g.A.h.h.h.A.h.h.h.G.g.h.z.A.h.h.G.A.h.h.h.A.h.z.h.A.g.A.A.j.A.A.A.A.G.A.G.A.A.A.A.S.H.h.H.H.H.H.L.L.U.S.L.H.H.H.G.G.H.S.S.G.S.A.A.A.A.A.A.j.G.A.g.g.A.h.A.G.h.h.h.h.h.h.G.h.h.h.h.g.x.h.l.g.k.z.h.h.h.A.l.D.H.H.G.H.H.L.H.H.H.H.H.H.H.H.H.H.S.D.H.H.H.S.H.H.H.G.H.L.H.H.H.H.H.H.H.H.G.H.H.H.A.G.A.A.S.A.A.A.Z.A.A.G.j.A.A.A.A.h.h.z.A.A.A.A.h.A.l.A.A.H.A.A.S.H.G.H.H.H.L.L.L.S.H.H.L.L.L.L.S.L.S.S.H.H.U.L.S.S.S.H.H.H.U.H.H.L.S.H.H.H.H.H.H.S.H.L.L.G.L.H.S.L.L.L.P.P.L.Y.P.P.T.T.U.U.Y.P.P.U.P.Y.L.L.U.P.P.L.L.L.L.S.L.L.L.L.L.P.L.P.L.U.L.U.L.L.U.U.T.U.U.U.T.T.T.T.~.R.T.T.~.T.~.T.[.~.~.~.~././.!./.(./.(.^.(._.{.(.}.}.}.}._.|.|.}._.|.}.}.|._._. X(.`.(.(.(.(.(.(././.^.^.E.T.~.~.~.~.~.T.[.T.(.T.T.T.T.T.~.T.T.~.XX(.~.R.~.~.~.~.~././././././.(.(.(.(.^.^._.(.`.}.}._.{.^.|.^.^.(.(.^.(././././././.T.~.T.T.T.T.U.U.L.L.L.L.L.L.L.P.L.L.U.P.L.P.P.L.Y.U.T.T.T.~.T.~.T.T.T.T.T.T.T.~.T./.T.T.~.T.~.T.~.T.~.T.T.T.Y.I.T.I.U.T.T.U.Y.U.U.Y.L.L.L.U.L.U.S.U.S.L.K.H.L.L.L.H.L.S.H.L.L.L.S.U.H.L.L.S.L.L.U.L.L.P.T.T.U.T.T.T.T.T.T.T.T.~.~.~.~.~././.(./././.(./././.(./.(.(.(.(.|.(.(.(.^.|.[.}._._.|.|.|.|._.|.|._.`.`.`.`.`.`.|._.|.|.|.|.|.|.|.|._.|.|._.(._.|.|.|.|._._.`.|.|. X X.X.XdXzXdXdXdX'.'.zXdX.XzXzXzX.X.XdXdXzXdX.X.X'.zX#X.XxX.X.XzXdX XdX.X@X.X.X X",
+"Z C A Z D C Z Z Z D Z Z Z C H Z Z Z Z Z L Z Z S Z H H S Z S H H S L Z Z Z Z Z L H Z Z L H Z J Z D D D D D D D D Z Z Z Z D D D Z Z H 0 % % % : ; 0 e r r 0 r r r ; ; ; % % & $ % % % % % $ $ $ $ % % & % $ & $ $ $ $ $ % % * % * % $ % - $ - % , & % & % % * % e = y : : r e ; % % % % & % % : : * * % $ & $ $ $ $ & % & % & % & - % ; % * % & % $ % % ; % % % & $ $ $ $ $ $ % & % % $ & - & % $ % $ & $ % % % % % % % % ; * > * ; % o       K Y.U.U.T.U.T.Y.T.L.L.U.U.U.U.U.U.T.Y.U.P.P.P.U.L.L.L.U.L.L.L.L.L.L.L.L.L.S.U.S.L.S.H.H.H.H.H.S.S.S.A.H.S.h.S.H.H.H.H.U.U.L.L.L.K.L.P.P.P.P.L.U.U.U.P.P.P.Y.T.T.~.T.T.~.~.T.T.~.T.T.T.~.~.~.~.~.~.(.~./././.E.(.(.(.(./.(./././.~./.[.~.~.(.~.~.~./.~.~.~.T.~.T.U.T.T.~.~.T.~.~.T.~.T.~.~.~.!./.^.(.(.^.(.(.(.`.|.|.|._. X|.'..X.X.X.X.X.X@X.X.X.X.X.X.X.XdX X.XzX.X@X'..X.X.X.X|.|. X X|.|.|.|.|.|.|._._.|.}.}.}. X}.}.}.}.^.}.}.}.(.`.(._._._.{.|._.|._.(.(.(.(._.}.}.}.}._.|.|._.}.}.}.}._.}.}._.}.}._._.}.}.{.|._._.|.|.|._.|._.{.|.|.|.|.'.|..X|.|.|.|.`.|.|.`.|._.|.|.|. X.X|.|..X.X.X.X.X.X.X.X.X.X.XdX.X.XzX.X.XdXdXdXdXdX.XdXzXdXxXxXdXdXdXzXzXdX'.zX@X.XzX.X'.xX.X.X.X.X.X X|.|.|.(.(.(.(.^./.~.R.T.T.U.T.U.P.P.L.L.L.L.U.L.L.L.L.L.G.G.G.H.S.S.S.A.A.A.A.A.g.A.A.h.A.h.A.l.h.G.A.h.h.h.A.h.A.A.A.A.A.A.h.A.h.j.A.g.A.A.A.j.A.A.G.h.A.G.A.H.A.A.G.A.H.H.A.G.H.H.H.L.H.H.L.S.H.H.H.H.G.G.G.G.A.G.A.l.A.A.A.z.A.h.A.h.h.h.h.G.h.z.h.h.z.h.z.G.j.A.h.x.j.h.f.g.k.l.l.h.A.A.A.D.S.L.L.L.H.L.S.H.H.H.S.L.H.H.H.H.H.H.H.H.H.H.G.H.H.A.H.H.H.H.H.H.H.D.S.A.H.H.H.A.H.S.h.A.S.h.H.A.A.A.A.A.l.l.l.g.A.h.A.A.A.h.z.h.A.A.A.A.A.A.A.A.h.H.G.H.H.H.H.S.L.G.H.S.L.L.H.L.S.L.U.L.H.S.H.G.G.H.G.H.H.H.H.L.H.H.L.h.H.H.H.H.H.H.H.H.H.H.H.L.Z.P.U.L.K.P.P.P.P.U.Y.U.U.U.L.P.P.P.P.L.L.L.U.L.L.L.L.L.H.H.L.L.F.L.L.U.P.L.L.L.L.L.L.L.L.Y.U.P.P.P.Y.U.T.T.T.T.~.T.~.T.T.(.T.~.~.~.~./././././.(.(.`.^.(.(.`.}.}._.|._.}.}.}._._._. X_. X_._.[._.(.^.(.(.(././.(./.~.~.~./.~.T.~.T.~.T.~.T.T.T.T.I.~.T.T.T.T.E.[.T.T.~.~.~.~.~.~.!./././.^.(.(.(.{.^.(.(.`.(.^.|.|._.^.{.(.`._.(.(.(.(./././.^.~.Y.T.T.T.T.U.L.T.L.L.L.L.L.L.P.L.L.L.L.L.L.L.L.L.P.U.T.T.T.T.~.T.T.T.T.~.T.T.T.T.T.T.T.T.~.T.T.T.~.T.T.U.Y.U.T.I.Y.Y.T.U.U.T.T.U.P.P.U.P.P.L.H.L.K.H.S.H.J.K.G.L.G.G.H.H.H.H.L.U.H.H.L.L.H.L.L.P.U.U.P.P.U.T.T.U.T.T.T.T.~.T.~.~.T.~.~.~.~./././././.~.(.~.[./.(.(./.^.(.(.|.|.(.{.|.(.`.`.`.|.|.{._.|.|.|.|.|.|._.|._.|._.{._._.|.|.|.'. X|. X|.}.}.|.`._._._.^.|.{._.|.|..X.X.X.XdX.XzX.XzX'.zXzX@XzXzXzXxXzXdX.XdXdX.X@XzX.XdXdX@X.X@XdX.X@XdX XdX.X.X.X|.",
+"C C Z C C Z C Z C Z Z Z Z G Z Z L Z Z L Z Z Z H L Z H Z H Z H Z Z Z Z H S J Z Z Z J Z H Z H Z Z Z D D D D Z D D H Z H Z Z D D D Z L A = % % % ; ; ; r r r r r r ; ; % * % * * * ; ; % % = % % $ % % % % % % % % % % % % : % e % % * $ % % % ; % % % % % : 0 : r r r r : ; e ; ; % % % % - % * % % * * % % % & % ; % % * % % % ; % ; * * * 0 = % % * ; % ; ; ; % % % % % , % % % % % % % % % % * % ; - % % * % % % % % ; * : * * * $ o #   $ L.L.U.U.U.T.T.P.P.P.Y.L.U.U.P.T.U.T.T.Y.T.T.Y.L.U.P.L.L.Y.L.P.P.P.L.L.L.L.L.L.L.L.H.H.L.H.H.H.H.S.H.A.H.H.H.D.H.H.H.U.S.S.L.L.L.L.L.P.P.T.P.U.U.P.P.P.P.P.T.Y.T.T.~.~.Y.T.T.T.T.~.T.~.~.T.~.T.~.T.~././.~./.[.(.~.(./.(././././.~./.~.~.^.~.~.~.~.~.~.~./.T.~.T.~.U.T.T.T.T.T.T.~.T.~.~.T././././.~./.(.(.(.^.`.(.|.|.|.|.|.|.|..X|.'.|..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X'.|..X|.|. X|.|.|.|.|. X{._.|.'._.}.}.}.}.}.}.}.}.|.}.}.{.`.(._.(._._._.|._.{.|.|.`.`._._.}.}.}.}.|.|._._. X}.}.|.}.}.^.}.}.}.}.}.}.}.}.}._.|._.|.|._._._._.|._.|.|.|.'.|..X|.|.|..X`.|.|._.|.|.|.|.'.|.|..X.X|..X.X.X.X.XdX@X.X.X.X.X.X.X.XdX.X.X'.@X.XzX.X.XdXdX@X.XdXdXdXdXzXzX'.zXzX.X.XzX.XzXdX.X.X.X.X X|.|.|.^.(.(.^./.~.T.Y.Y.I.I.P.P.L.L.L.U.L.L.L.L.S.L.L.G.L.G.U.S.S.S.H.A.A.A.A.A.A.l.A.h.h.h.z.h.g.z.G.h.h.h.h.A.h.A.A.j.A.h.h.h.A.h.G.A.A.A.A.A.A.A.J.A.A.A.A.A.A.A.A.A.A.H.G.H.H.H.H.H.H.H.H.H.L.L.H.H.H.G.G.A.A.A.A.A.A.A.h.S.h.h.h.h.h.h.h.h.h.h.h.J.h.G.h.A.z.h.j.h.j.f.k.g.k.l.D.h.A.A.H.H.G.L.H.L.H.H.H.L.H.S.H.H.H.H.H.H.H.H.H.H.S.H.H.H.H.G.H.H.H.H.H.H.H.H.H.H.H.A.H.A.H.A.A.h.A.S.j.A.h.h.h.A.l.l.A.h.A.g.h.A.h.D.A.A.h.A.A.A.A.H.S.S.S.S.H.H.H.H.H.L.L.L.H.L.L.S.L.H.G.H.H.H.H.H.S.S.S.G.A.H.H.H.G.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.L.L.D.U.P.P.P.P.P.P.U.U.P.P.L.U.P.P.P.L.U.L.L.L.U.L.L.L.L.L.L.H.A.L.L.L.L.L.L.L.L.L.L.U.L.L.L.L.L.L.Y.L.U.U.T.T.T.T.T.~.T.~.T.~.T.~.!.~.~./././.^.^./.(.(.`.`.`._.}._.|.}.}.}.}. X}.}._._. X_._._.(._.(.(.(./.(./.(.!.~.~.~.~.~.~.~./.T.~.T.T.T.T.T.T.T.T.T.T.~.U.T.T./.T.~.~.~.~.~.~./.!./././.(.(.^.^.(.(.^.(.(.^.(._.|.(.(.(.(.(.(.(.(./././.~.~.~.T.T.T.T.T.T.L.U.L.L.L.L.L.L.L.L.L.L.L.L.P.P.P.P.Y.T.T.Y.T.~.T.T.T.T.T.T.T.T.T.T.T.~.T.T.~.T.T.T.T.T.Y.U.U.I.I.U.U.U.T.T.U.U.T.Y.Y.L.P.P.S.L.L.S.H.H.Y.S.H.G.H.L.H.H.S.H.H.A.H.H.L.H.S.L.L.P.L.L.Y.Y.L.U.Y.T.T.T.T.T.T.T.~.T.~.~.~.~.~.~./././././././././././.(.(.^.(.^.(.^._.|.^.^.`.(.`._.|._.|.|.(.|.|.|._.|._.|._.|.|.|._.|.|._._.|.|.|.|.|.}.{._._.(.|._.|._.|._.|..X.X.X.X.XdX.XzX.XzXzXzXzXzXzXzX.XzXdXzXdX.X.X.X.XdX.X.X.XzX.XdX.XzX'.'.'..X.X|.'.",
+"A Z B D A Z Z Z Z Z Z Z H Z Z Z D L H Z S Z H Z Z L Z J H Z Z H L Z H Z H H Z H H H Z D L J Z Z D D D Z D D D D G Z Z G G Z Z D D Z H y % $ % % * 0 : r r r ; r e ; * * * * % ; ; ; ; * ; % ; ; ; * % ; % ; % % : % : ; : ; r % : * : % % ; ; % % r ; % % * y 0 0 * y e r * ; ; : % e * * * r e ; * * & % % % % % ; e % % ; ; % * * ; ; * ; * * * : : ; ; * : % ; % % % % % > % e % * ; % * e % ; * ; ; * * ; * % ; % * r r * % & o       b.I.~.T.T.T.U.T.P.P.Y.U.U.U.U.Y.T.T.T.T.U.T.U.U.U.P.P.P.Y.U.L.L.L.S.P.L.L.L.L.U.L.L.L.L.L.H.H.H.H.H.H.A.H.H.H.H.H.H.L.S.S.L.L.L.K.U.U.P.P.T.P.P.P.P.P.U.P.T.T.T.~.T.T.T.~.T.~.!.~.T.~.T.T.T.~.T.~.~.~./.~.!./.^.~./.(.(.(././././././.^.E./.~.^.~.~.~.~.~.~.~.~.~.~.~.~.T.T.T.~.U.T.T.~.~.T./.~././././.(.{.(.(._._._.|._._.|.|.|.|. X.X.X.X.X|..X.X|..X'..X.XdX@X.XxX.X.X.X.X.X.X.X|._.|._.|.[.|.|.|.|.|.`.|._.`.|._.}.}.}.}._.|.|.}.`.(.`.^._.`._._.|._._._.(.`._._.}.}.|._.|.|.|.|. X|.}.}.}.|.|._.}.}.|.}.}.}.}.}.|.`.|.|.|.`.`.`.|._.|.|.|. X|..X|.|.`.`.`.`.|.`.|.|.|..X X|..X X.X.X.X.X.X.X.XdXzX.X.X.X.X.X.XdX.X.XzX.X'.zXzXzX.XzXdX.XxX.XxXzXdXdX@XdX.XxXxX.X.XzXzX'.dXdXxX@X.X.X.X|.|.`.(.(././.~.Y.T.L.Y.L.L.P.P.D.L.S.L.L.L.L.U.L.L.G.G.S.D.D.H.A.h.A.A.A.h.A.l.l.A.h.h.h.h.l.z.G.g.A.j.h.h.l.h.A.h.A.A.A.A.A.A.A.A.A.A.A.A.A.S.A.h.S.G.A.G.A.A.H.h.H.A.H.A.H.H.H.H.H.H.H.H.L.H.H.H.G.S.G.G.G.A.A.A.A.j.A.A.A.A.h.l.l.h.l.z.z.h.h.h.h.h.h.A.h.h.h.h.g.j.j.k.A.g.g.h.h.l.A.H.H.L.L.L.L.H.H.S.H.H.H.H.H.H.H.H.H.H.H.S.H.H.G.S.H.H.H.K.A.A.K.H.H.S.U.H.H.A.H.G.S.A.S.A.J.A.A.G.A.A.A.A.l.h.h.h.h.g.g.h.h.h.h.h.h.h.A.h.A.A.A.G.h.G.S.H.H.H.H.H.H.H.H.H.H.H.H.H.S.H.A.H.H.A.H.S.S.S.S.S.G.S.S.H.S.S.S.H.S.H.H.H.H.H.H.H.G.H.H.L.A.L.L.L.L.P.P.T.T.L.U.L.Y.U.P.L.P.L.P.P.P.L.L.U.L.L.L.L.H.L.L.L.L.L.L.L.L.L.L.L.L.L.D.L.L.L.L.L.L.U.Y.U.L.L.T.T.T.T.T.T.T.T.T.~.T.T.~.~.~.!./.(.(.(.(.(.(.`.(._.}.}._.}.|.|.|. X}.}. X_._._._._.(.(.(.(././.(././.~.~.(.~.~.~.~./.T./.(.T.T.T.T.T.T.T.T.T.T.~.T.~.~.~.T.~.~.~.~.~.~././.~./././././.^.^.(.(.(.(.(.(.{.^.(.{.(.(.(.(.(./././.(.~.~.T.~.T.T.U.T.U.U.U.Y.L.L.U.L.P.P.P.L.L.L.P.P.U.U.P.T.T.T.T.~.T.~.T.[.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.Y.U.U.R.I.T.U.R.T.T.P.U.P.P.P.L.L.L.H.H.H.H.H.H.Y.A.H.H.H.G.H.H.H.H.H.S.H.H.L.H.H.L.L.P.P.L.L.U.Y.U.T.T.U.T.T.T.~.T.T./.T.~.~.~././././././.(./.~.~./.(./.(.(.(.{.)._.`.^.(.(.`.(.`.(._.}.}.|.|.|.|.|.|.|._.`._.^._._.|._.|.|. X_.|. X}.}.}.(.|._._._._.|.|._.'. X X.XdX.XdX.X#XzX.XzXzXzXzXzXzXzXzXzXzXzX.XzX.X.X.X.X.XzX.X.X.XzX X'.dX.X.X.X.X X|.",
+"Z C Z Z C D B Z C Z Z H Z Z Z Z Z S H Z L H Z Z Z Z Z L Z H Z Z Z Z Z H Z H L Z H D H H Z Z Z L D D D H D D D D D H Z D Z Z G Z Z D L S r % & % * * * r e = r r ; t > * ; % ; ; ; ; e 0 % : % ; ; ; e ; ; % ; % % : ; ; ; ; t * * * : * : 0 : % * * : : r * r r : y = r q * t r : : * * * * 0 e ; > * : : ; % ; ; % ; ; ; ; ; ; 0 r * ; ; ; * w r : * ; * r % 0 ; % : % ; ; ; ; ; ; % = * * % ; * ; % ; ; * ; ; ; r r ; ; ; % $ o       I ~.Y.Y.Y.U.T.Y.U.T.T.!.T.U.T.T.U.T.T.T.T.T.T.Y.Y.T.P.T.T.L.L.U.U.Y.L.U.L.L.L.P.P.U.U.L.S.L.L.L.H.S.H.H.H.H.H.H.L.H.H.L.U.L.L.L.L.Y.U.U.P.P.Y.Y.P.P.P.P.U.Y.T.T.T.T.T.T.~.T.~.T.~.T.~.T.(.T.~.T.~.~.T.~.~.~.~./.^.(./.(.^./.(.^./././.!.~./.~./.~./.~.~.~./.~.T.~.~.U.~.~.T.~.T.T.{.T.~.~.T./.T.~.~.~.!./.(./.^.(.^._._.}.|.|.|.|.|.|..X.X'.|..X.X|..X'..X.X.X.X.X.X.X.X.X.X.X.X.X.X|. X|. X|.|. X|.|. X|.|.|.|.|.|._.|.}.}.}._.|._.}.}.^.`.`.`._.|.|._._.|.|._.|.|._._.}._.|.|.|.|.|..X X|.|.}.}._._.|.}.}.}. X}.|. X}.`.|.`.|.|.|.|.`.}.|.|.|.|. X|..X'.|.'.@X|.|.`.|. X X|.|..X.X.X.X.X.X.X'..X'.'..X.X.X.X.X.X.XdX.X.X.XzX.XzXzX'.zX'..XdXzXzX.X.X.XdXxX.X.X.XxX.X.XzXzXzXzX.XdX.X.X.X.X'.|.|.(.(./.~.T.T.T.T.L.L.S.D.U.A.L.L.L.G.L.L.L.U.S.L.L.G.H.S.A.S.A.A.h.l.A.h.A.A.l.l.h.z.h.h.h.l.z.A.h.W.h.A.h.A.h.h.A.A.h.h.A.A.h.W.A.h.A.A.A.A.h.S.h.A.A.A.G.A.h.J.h.H.A.H.A.A.H.H.H.S.H.H.H.H.H.H.H.S.S.A.A.A.A.A.A.A.h.S.h.h.A.z.l.l.l.h.h.h.h.h.h.h.h.h.h.h.j.z.h.j.z.k.k.z.g.g.g.A.D.A.G.G.G.L.H.H.H.H.H.H.G.G.A.S.H.H.A.S.H.H.H.G.H.Z.A.H.A.S.S.S.G.Z.H.S.S.A.H.H.H.A.A.H.h.A.A.A.A.h.A.A.h.l.l.l.h.h.h.h.h.h.h.h.k.h.h.Z.g.A.A.h.h.S.S.S.S.A.H.H.H.H.H.S.H.H.H.H.H.H.H.H.H.H.H.H.h.A.S.S.S.S.S.S.S.H.H.S.S.S.H.H.H.H.S.S.H.H.G.H.H.D.F.A.L.L.L.Y.P.P.P.Y.Y.L.L.P.L.L.L.P.L.P.P.L.P.L.L.L.H.L.L.H.H.S.L.S.L.L.L.L.L.L.L.L.L.L.S.K.L.L.L.L.L.P.P.Y.L.T.T.I.T.T.T.T.T.~.T.~.T.!.~.~.(.!.(.(.(.(.(.^.(._._.[.|.|.}.}.|.}.}.}.}._._._._.(._.(.(.(./.(.(././.~./.T.~.~.~.~.T./.T.T.T.T.T.T.T.T.U.T.T.T.T.T.T.T.~.~.~.T.~./.~./.~././././.(.(./././.^.(.(.(.(.(.(.^.^.(.{._.(.).(././.!.!.~.!.~.T.T.T.T.T.L.Y.L.L.L.L.L.U.D.P.P.A.L.L.P.P.T.P.P.P.T.P.T.T.~.T.T.T.T.T.P.T.U.U.T.T.T.T.T.T.Y.T.T.T.U.Y.U.L.U.L.I.L.U.L.K.U.U.L.P.P.L.L.L.S.L.H.H.L.H.H.H.H.G.L.H.S.H.H.H.A.H.S.H.H.H.L.H.L.L.L.P.L.U.L.L.L.T.U.T.U.T.T.T.~.~.T.~.~.~./.~./.T./././.~.~.(.(.~./././.^.(.^.(.^.{.(.(.`.].(.(._.(.[.}.|._._.{.{.|._.|.{.|.|.|.(.|._._._.|._.|._.|._.}.|.^.|.`.|._._.|._. X|..X'..X.X.XdX.X'.zX.XzXzXzXzXzXzXzXdXzXzXdXzX'..X.X.X.X.X.X.X.X.XdXdX.X.X.X.X.X.X|.",
+"Z Z C Z D Z Z Z Z Z Z Z Z G Z H D Z D D D D D D H Z H Z L H Z D D D D Z Z D G D Z J Z L Z J Z L Z Z S H Z L Z Z L H H Z Z D D D Z Z Z D A e $ % % * % : > ; : 0 r r r r r y : : ; ; r r r r r r * r 0 r * r 0 ; r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r 0 r * r r 0 e r ; ; r 0 ; r = r r r r * y r r r r r r r 0 e r r ; ; = : * r 0 0 r r r 0 0 r ; r ; > * * : * : : > : : 0 * * % o       u U.[.T.U.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.U.U.T.U.U.P.P.U.P.T.U.Y.L.U.Y.U.U.I.I.L.L.U.L.L.L.S.H.U.S.H.H.U.A.L.L.L.L.U.U.L.U.L.L.U.Y.T.T.P.P.P.P.T.I.U.T.T.T.T.T.T./.T.T./.T././.U.T./.~.R.T.T./.~./.~.~./././././.(./.(./.(./.!././././.~.(./.T.~.~.(.~.~.~.~.(.~.T.~.~.~.T.T.~.~.~.~.~.T.T.~.~./.~./.(./.(.(.(._.}.|._.|._.|.|.|.'.|..X X.X X|..X.X.X.X.XdX.X.X.X'..X.X@X@X X'. X|.|.|.|.|.|.|.|.'.|.|.|.|.|.|.|.}.}.}.}.}.}.}.}.`.`.`.`.`.|.|.|.|.@X|.`.`.`.`.`.(._.|.|.|.|.|.|.}.|.}.}.}.}.|.}.|.}.}.|.|.|. X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.`.'.|..X X'..X.X.X.X.X.X.X'.@X.X.X.X.X.X X.X.X.X.XzX.X.X.XzXzX'..XzX.XzX.X.XxX.XxXdXxXdXdXzXdX.XxXzX.XzXdX.XzX.X.X@X X.X|.|.{.^.~.T.T.T.T.U.U.H.L.L.L.H.U.S.U.S.U.L.S.L.A.P.L.D.H.W.S.S.A.A.A.A.j.h.h.l.l.l.l.l.l.A.Z.h.h.A.A.h.h.h.A.h.A.A.S.A.H.A.A.A.A.A.H.A.Z.S.A.A.G.A.A.A.A.S.S.S.S.A.A.H.A.A.H.A.H.S.S.H.S.H.H.D.H.D.D.S.S.S.A.S.A.A.A.A.A.z.h.h.l.h.h.h.z.h.h.h.h.G.z.h.h.h.h.h.h.g.g.g.g.g.g.d.z.Z.h.A.D.S.G.H.H.H.H.H.H.H.H.S.S.H.H.H.G.H.A.L.A.H.S.H.S.H.A.H.H.H.H.H.S.S.H.K.A.A.H.H.A.H.A.A.S.A.A.A.A.h.h.h.l.A.h.h.h.h.h.h.h.h.h.h.h.g.l.h.h.l.l.G.z.S.A.H.S.S.S.G.G.H.H.H.H.H.H.A.S.S.S.H.S.G.S.S.S.G.A.G.A.S.S.S.S.A.H.S.S.H.H.H.H.U.H.H.H.H.H.H.H.H.H.L.L.L.U.P.L.U.U.L.L.K.Y.L.L.P.S.U.L.L.L.Y.K.L.Y.S.L.L.L.L.H.L.H.H.L.L.S.L.H.U.L.L.H.S.H.L.H.L.S.U.P.L.Y.L.U.U.T.T.U.Y.T.P.L.Y.T.T.T.T.^././././.(.(.^.(.^.`.^.|._.|.(._._.|.}._.}.}. X}._._.(.(.^.(.(.(./././.)././.~./.~.R.!.~.~.T.T.T.T.T.I.I.T.Y.T.T.T.T.T.~.T.~.T./.~.~.~.~.~.~.!././.(.^.(.~.(.(.~.~.(.(.(.(.(.{.{.(.{.(.(.(./.!././.!.~.~.T.T.T.T.U.T.P.Y.U.U.L.P.P.P.P.P.H.P.L.L.Y.U.Y.Y.Y.T.T.T.T.T.T.T.T.T.T.U.Y.U.U.I.U.T.T.T.T.T.T.T.U.T.P.P.U.U.L.U.U.L.U.U.L.L.U.P.L.L.L.L.H.H.H.H.h.H.H.H.H.A.H.H.H.S.S.A.A.H.S.H.S.S.H.G.S.I.S.Y.L.U.L.L.U.U.T.U.T.T.Y.T.T.~.T./.(.U./.~./.~.(.T.~.~.~.~.~.~.~.^././.(.(.(.!.(.(.(.(.(.(.(.(.(.(.`.`.(._._._.`.(.`._._.|._._.|.{.}.}.}.`.|.}.|.(.`._._._.(.`._.^.|._.|.|. X|..X.X.X.X'..XdXdXzXzXzXxXzXzXzXzXzXzXzXdX'..X.X.X.X.X.X.X@XdX X'.'..X.X.X.X|. X.X",
+"B D C Z B Z Z Z Z Z Z Z D Z Z Z Z D D D D Z D D Z Z Z Z Z Z D D D D D D D D D D Z Z Z Z Z Z Z Z H Z D D Z Z Z L Z S H Z Z Z D D Z Z D Z Z u % $ $ % % : ; ; r r r r r r r * : r : ; r r r r r y r r ; r 0 r ; r r r r r r r r r r r r r r r r r : r r r r r r : r r r r r r r r r r r r 0 r r r : r r r r r 0 r : ; r 0 r r r r r r : e r r r r r r r r r r r r ; ; r : r r ; r ; r r ; r ; r 0 ; ; : y : r r r 0 0 ; ; % $ $   #   w (.~.T.T.~.T.T.T.T.T.~.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.U.T.U.P.T.U.P.P.P.P.P.P.P.U.U.U.U.U.I.U.U.L.L.L.U.S.H.H.S.L.L.L.L.L.L.L.L.L.L.L.U.U.P.T.P.P.T.P.P.P.I.U.T.T.T.T.T.~.T.T.T.T.T.T.T.XXT.T.~.~./.T.T.~.T./.~./.(././.~././.~.(././././././././.~.~./.~.~.~.~.~.~.~.T.T.T.~.T.~.~.~.T.~.(.T.~.T.T./.~./././.~.(.(.|.(.^.[._._.|._.|.|.|.|.'.|..X|..X.X|.'.'..X.X'..X.X'.'.zX.X X'.|..X'..X X|..X.X|..X'. X X|.|.|.|.|.|.}._. X}.}.}.|.}.`.`.`.`.|.|.|.|.|.|. X_.|.`.`.`.|.|.|.|.|.|.|.|.|.|.|. X|.}.}.|.|.}.}.|.|.|.|.|.|.'..X|. X X'.|. X|.|. X'..X.X.X.X.X.X.X.X.X|..X.X.X|.|..X.X.X.X@X'..X.X.X.XdX'..X.X.X.X.X.X.X.X.XdXzX.XdX.X.X#X.X'.zX'.xX.X.XxXdXdXzXzXzXzXdXzXzXzXzXzX.XzXzXzXdX.X.X|.|.|.(./.~.T.T.T.U.L.L.U.L.A.S.U.H.H.L.L.L.L.L.L.L.L.P.A.A.S.A.A.A.A.A.A.h.h.h.h.A.l.l.G.h.A.h.h.A.h.Z.h.A.h.A.h.A.h.g.h.A.A.A.A.A.h.S.A.A.S.G.A.G.A.G.A.Z.S.A.A.S.S.S.S.S.A.S.S.A.G.S.G.S.S.S.G.S.S.S.A.h.A.h.A.g.A.h.A.h.h.l.l.h.A.h.h.z.A.h.h.h.h.h.h.h.h.h.k.k.g.g.g.g.g.g.g.g.h.z.A.A.H.H.H.H.H.H.H.H.H.H.H.A.H.h.G.S.H.H.H.A.S.Z.G.A.H.H.A.S.A.S.A.A.H.S.S.H.H.H.H.S.S.A.A.A.g.A.h.A.A.S.l.l.z.h.h.h.g.g.h.g.g.h.h.h.h.h.h.l.G.G.D.H.j.A.A.S.S.A.H.A.H.H.H.A.W.S.S.S.H.S.H.S.S.S.S.S.A.A.G.S.S.S.S.S.A.S.S.G.S.H.H.S.H.L.H.D.A.H.H.H.L.D.L.L.L.P.P.L.R.L.L.L.L.L.L.Y.P.L.L.L.L.L.L.U.U.L.L.U.S.L.H.H.L.H.H.H.L.L.L.L.L.L.L.L.H.H.H.H.L.A.P.L.U.Y.U.U.U.U.U.U.T.T.T.U.Y.T.T.T.~./././.(./.(.(./.(.(.^.(.(._.|._.|._.}.}.}.}._._.'._.`.`.(.(.(.(.(.!.~.T.~./././.R./.T.~.T.^.T.~.T.T.T.I.U.U.T.T.T.T.T.~./.T.~.~.~.T.~.~./.~./.~.T.~.~./.(.!.(.(.{././.(.^.(.(.).(./.(.!./././././.!.~.T.~.T.T.T.T.U.P.P.L.Y.L.P.P.L.P.P.L.L.L.L.L.U.U.T.L.T.T.T.T.~.(.T.T.T.T.T.U.T.U.U.U.U.U.U.T.U.P.P.U.U.P.P.P.U.P.L.L.L.U.L.L.L.L.L.L.L.L.H.H.H.H.H.H.H.H.H.H.G.H.H.Z.H.H.A.H.H.A.S.S.S.K.H.L.L.L.L.L.L.L.L.L.K.U.U.T.P.T.~.T.T.~.T.T.~.~./.~.~.~.~.{.~.~.~.!.^.~./.^.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.`._._.`.|.`.^.^.|.`.(.[.}.`.`._.|.}.`.`.`.`.`._._.`.|.|.{.|.|.|.'.|..X.X.X.X.X@X.X'.dX.XzXzX.XzXzXzXzXdXzXdXdX@X.X.X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X X|.",
+"C D Z Z Z Z Z D Z Z Z Z Z D D D D D F D D D D D H Z H Z D D Z H D Z L Z D Z H D S H L Z S L Z Z D D H Z L L S L L Z Z Z G Z Z D Z D D D F L u * $ $ % % % * ; ; r : e r = e r r : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r r r r r r r r r r r r r r r e 0 r r r ; r 0 r r 0 r : : : * r r r ; 0 * ; % & o       $ F./.T.~.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.U.U.T.U.Y.P.P.P.T.U.T.P.T.U.U.U.T.U.U.U.L.U.L.L.S.L.L.S.L.L.L.L.L.L.L.U.L.L.Y.P.U.T.T.P.T.T.P.T.P.U.T.T.T.T.T.T.T.~.T./.T./.~.XXT.XX~.~.~.T./.~.T.~./.~././.^././.~.^.(./.~./.~./.!./.~.~.~.~.~.~.~.~.~.~.T.~.T.~./.T.~.~.~.~.[.T.T.~.~.~.~.~./.~.~./.(././.(.(.`._._.(.|._.|.|.|.|.|.|. X X.X|.'. X.X'..X.X.X.X.X'.zXdX.X.X.X.X X.X|. X|.|.|..X|.|.|.|.|. X_._.|._.|._.|.}.}.}. X`._.`.|.|.|. X.X|.|.|.|.|.|.`.`. X|._.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|. X.X.X.X|..X.X|.|..X'.|.|.|.|..X|..X.X|..X.X|.|..X|.|..X.X.X.X.X.X.XdX.XdX.X.X.X.X.XdX.XdX.X.X.X.X.X.X.XdX.XdXdXdX.XzXdXdXdX.X.XxX.XzXzXzXzXzXzXzXcXzXzXzXzXzXzXzX.XdXdX.X.X|.(././.T.T.Y.L.L.S.S.D.D.S.L.H.S.L.S.L.G.L.L.D.D.P.D.H.H.S.G.G.G.A.A.A.l.g.h.g.h.h.l.l.h.A.A.h.h.h.A.A.A.A.z.A.h.h.g.A.A.A.A.G.A.W.H.A.H.A.A.A.A.G.H.h.S.A.A.S.A.F.S.A.h.A.H.S.S.S.S.S.S.S.S.S.S.S.S.G.A.A.A.A.A.j.z.A.h.l.l.l.l.h.l.z.h.h.z.A.h.h.h.A.h.h.h.h.h.k.k.k.g.g.d.k.k.h.g.A.A.A.H.S.H.H.S.H.S.S.H.S.H.A.S.Z.S.S.S.G.H.A.G.K.A.H.H.A.S.S.S.G.A.S.A.S.h.H.A.H.H.A.A.A.A.A.h.j.h.A.h.h.h.h.h.j.k.z.g.g.h.h.f.k.h.l.l.l.h.A.z.S.A.G.A.H.S.H.S.S.H.A.H.S.H.G.S.S.S.S.S.A.S.S.S.S.G.A.A.H.A.S.A.A.S.Z.H.S.S.S.G.H.G.H.H.L.G.L.L.L.L.S.L.L.L.L.L.L.Y.L.U.L.U.L.L.L.L.L.Y.U.L.L.K.L.L.L.L.U.S.U.S.H.H.H.H.L.L.H.H.L.L.L.L.H.S.L.L.S.L.S.P.L.L.U.U.U.T.U.U.T.T.Y.T.T.U.T.T.T.T.T.!.(././.(./.E.^.(.(.^.(._.{.{._._.|._.}. X}. X_._._.^.(.^.|.(.(.(./.(.!./././.~./.~.^.~.!.T.T.T.T.T.U.U.T.T.U.T.T.T.T.T.T.~.T.~.~.~.~.~./.~.~./.~././.~././.~./.(././././.^.^.~.(././././././././.~./.~.^.T.~.T.U.T.Y.P.L.P.L.L.L.P.L.U.L.L.L.U.L.U.T.U.T.T.Y.T.T.T.T.T.T.T.U.U.U.I.U.U.U.U.U.L.L.U.P.P.U.L.P.L.L.L.P.L.U.L.L.L.L.L.L.L.L.S.H.H.H.S.G.H.H.S.H.H.H.H.H.H.H.S.A.S.A.H.A.S.S.H.S.H.H.S.L.L.L.S.L.L.L.L.U.U.Y.T.T.T.T.~.~.~.T.~.T.~.~.~.T./.T.[.~.~.~.T.~.~././.!.(.(.(.(.(.(.(.(.(.!.(.(.(.(.(.(.(._._._._.(.`.`.`.|.`.|._.}.`.}.|.}.`.`.`.|.|._._._._.^.`._.|.|.|. X|..X.X.X.X.X.XzX@XzX'..XzXzXxXzXzXzX@XdX.XdX X.X.X X.X.X.X.X.X.X.X.X.X.X.X|.|.'.|.",
+"D B Z Z Z Z Z Z Z Z Z F D D D Z D D Z Z F D D D Z H Z Z D D D Z Z Z Z Z Z D D D H H Z Z Z L S Z Z G Z H Z L Z Z Z Z Z H G Z D Z Z D D D Z Z C A & $ $ % % * % ; ; 0 = r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r : r r r r r r r r r * r r r : r r r r : r r r r r r r r r r q r r r r r r r r r r r r r r r r r ; 0 r r r r r r r r r ; ; y 0 0 ; 0 ; e % % $ o       & Z.(.U.~.~.T.[.^.T.T.~.~.Y.~.~.T.~.~.T.T.~.~.T.T.T.T.T.T.T.U.T.T.L.T.Y.T.P.T.T.T.P.T.T.T.T.Y.U.U.R.Y.L.U.Y.L.L.L.L.L.Y.K.Y.L.L.K.L.L.L.L.U.P.P.P.P.P.T.T.T.T.T.T.U.T.U.T.T.T.T.T.(.T.(.T.~.~.~.).R.~.~.~.T.~.~.~.!.[.~.~././.[.~./.~.!./.~././.(.~././.~.~.T.T.R.~.~.T.~.~.~.~.T./.~.T.T.~.T.~.~.~.T.T.~.~.~./.(.~././.[.(.(.^.{._.^.{.`.{.|._.`.|.|.|.|.|.|.|.|.|..X.X.X XdX XzX.X.X.X.X.X.X.X|..X|..X.X'..X|.'..X X X|.|.|.|.|.|.|.|. X}.}.}.|.|..X|..X.X.X'..X.X X'..X|..X.X|.|.'. X.X|..X.X.X.X X X X|..X|..X X'. X X|.|..X'.|..X|..X.X.X.X X X X.X X|..X|.|..X.X.X.X.X.X.X.X.X.X.X.XcX XdX.X.XdX.X.XzX.X.X.X.X.X.X.X.X.X.X.XdX.XzX.XdXdXdXzX'..XdX.XxX.XxXzXzXzXzXxXcXzX.XzXzXzXzXzX.X.XzX.X.X X'.|.{./.T.T.Y.U.L.L.L.L.L.H.H.S.H.L.S.G.L.L.L.H.L.H.H.H.H.H.H.G.A.G.A.A.A.G.A.A.A.A.A.h.l.A.h.A.A.A.A.h.A.A.A.A.S.h.S.A.A.A.G.A.A.A.S.A.H.H.G.A.G.H.A.A.Z.S.A.S.A.S.z.A.S.H.S.S.S.S.S.S.S.S.S.S.S.G.z.A.A.A.S.A.h.A.A.l.A.l.l.A.l.l.l.h.z.z.h.h.z.h.j.x.h.h.h.h.h.h.h.h.k.g.g.g.g.k.k.h.A.A.A.S.G.H.G.H.H.S.G.S.S.S.S.S.S.A.S.S.A.A.H.A.A.H.H.H.H.S.S.Z.G.S.S.S.S.H.H.H.A.A.A.A.A.A.h.A.A.h.h.h.h.j.h.k.k.g.g.g.g.k.h.h.h.l.h.l.l.h.h.z.A.A.A.A.A.A.A.S.S.A.H.S.A.A.H.S.A.A.S.S.H.S.S.S.S.S.H.A.z.S.S.S.S.S.G.S.S.S.H.S.L.L.L.H.H.G.L.G.D.L.L.L.L.L.L.L.U.R.L.U.L.L.U.U.U.U.L.L.L.U.U.L.L.S.L.L.S.S.H.H.H.H.H.G.L.H.L.L.U.S.L.L.S.L.L.S.S.L.L.S.L.L.L.L.Y.U.L.T.L.T.U.U.T.T.T.T.T.~.~.~./.~././.^.{.^.^.^.^.|.^._.|.(._._.}.}._.}._. X_._.|.(.^.(.(.(././././.!./.~.~./.T.T.~.T.T.T.T.I.T.T.I.I.U.T.T.T.T.~.T.T.~.T.~.T././.~.~././.~./.~.~.[./././.~.~.~./././.~./.^././././././././.~.~.T.~.T.~.T.U.T.U.Y.P.U.U.L.L.P.L.L.L.U.L.U.U.U.T.T.T.T.T.~.T.Y.Y.T.T.T.T.U.T.Y.U.U.U.U.U.U.U.U.L.P.L.U.L.L.L.P.L.L.L.L.L.L.D.L.H.G.H.H.H.S.S.S.H.G.Z.G.G.A.H.H.H.H.H.G.A.G.Z.A.A.S.S.S.S.H.S.U.S.L.S.L.L.L.L.L.U.U.U.T.T.T.T.T.T.T.~.~.~./.~.~.~./.T./.U.~.~.T.~.~././././.(.^.(.(.(.(.(./.(./.(.^.^.(.(.(.(.^.^._._.(.(.(.(.^.`.`.`.}.}.|.|.'.}.|.`.(.(.^._._.^.`.(.|._._.|. X X X X|..X.X.X XdXzX.XzX.XzX.X.XzXdXdXdX'..X'..X|..X|..X X|..X.X.X.X.X.X X.X X.X X",
+"Z C B Z D D F Z Z Z C G Z D Z G D D D D D Z D D Z Z D Z Z D Z Z Z Z G Z Z Z Z Z Z Z Z Z H Z H H J Z Z L Z H Z H Z H L Z Z Z D Z D Z Z D D Z D D u * $ $ $ % * * ; ; : * r r 0 r r : r r r r r r 0 r r r r ; r 0 r r r r r r r r r r : : r r * y r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r r : r r r r r r r r r e r r r r r r r 0 r r ; 0 r ; r r r r r r r r r r ; ; ; r r : : % - $ o #     t K.[.E.~.T.T.[.U.T.~.~.T.Y.T.~.T.T.~.~.~.~.Y.T.~.T.T.T.T.T.T.T.T.T.T.T.P.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.Y.T.Y.U.U.U.U.L.L.L.L.Y.L.L.U.L.Y.K.U.L.U.P.P.P.P.P.P.T.P.P.U.T.T.T.T.T.T.T.T.~.~.~.Y.R.(.~.T.XXT.^.~.~.~.[.~./.~.^.~.~.~./.(.~.!.~.!.~.~.~.~.~.~.~.!.~.~.[.R.E.~.~.T.~.~.T.~.T.~.T.~.T.~.T.~.~.T.~.~./.~.~.~.[.^./.(.(.(.(._._.(.|.`._._._._.|._.|.|._.|.|. X|.'..X|..X.X@X'.zX.XzX.X.X.X.X.X|..X.X.X.X.X.X.X|.'.|.|.|.|.|.|.|.|.|.|.|.|.|..X'..X.X.X.X'. X|.'.|..X|..X.X|. X|. X|. X.X.X|.|..X X|..X|.|. X|. X|..X|.|..X X.X|..X|.'. X.X.X.X.X.X|..X'..X|.|..X.X|..X.X.X'.|..X.X.X@X XdX'.'..X.X@X.X.X'.zX.X.X'..X.X.X.X.X.X'..XzX.X'.zX.XdXdXdXdXdXzXzXzXdXJXzXxX.XzXcXzXcXzXzXzXdXdX.XdX@X.X.X|._.^.(.T.T.P.U.L.L.H.L.H.H.H.L.G.A.H.H.L.L.L.L.P.L.L.L.H.H.H.A.H.S.A.h.A.A.A.h.Z.g.A.g.A.h.A.h.h.h.A.A.A.z.A.h.A.A.A.A.A.h.A.A.A.A.G.H.A.A.G.H.H.h.H.S.S.S.A.S.A.S.A.S.S.S.S.S.S.S.A.S.S.A.A.A.l.A.A.A.A.A.A.j.A.A.h.A.l.l.l.l.l.l.A.l.A.A.A.h.h.h.h.h.h.h.l.h.h.h.h.k.k.k.k.k.k.k.h.h.h.A.h.G.A.S.S.H.G.S.S.S.S.A.S.S.S.G.Z.S.S.H.A.G.G.H.H.A.h.A.H.G.A.A.H.H.S.A.H.H.A.G.A.A.A.A.A.h.l.h.h.g.l.k.g.k.g.g.f.f.g.h.h.h.k.h.h.z.S.S.A.h.A.A.A.A.A.A.A.A.S.H.S.S.S.S.A.S.S.S.A.S.A.S.A.S.A.S.A.S.S.S.A.S.S.S.S.S.S.S.H.H.H.G.L.H.H.H.L.G.U.S.U.L.D.U.L.L.L.K.L.U.L.K.L.P.L.L.L.L.K.L.L.L.U.U.L.S.S.H.H.H.H.H.H.K.H.H.H.U.H.L.H.H.H.L.L.H.L.S.L.P.L.U.P.P.L.L.L.T.L.U.T.T.T.T.T.T.T.T.T.~.~.~.~.(.^./././.(.(.^.(.(.`.`.(._._. X X_._._._._._.^.(.(.).(.!.(.(.~.(.~.~.~.~.T.T.T.T.T.T.Y.T.U.Y.P.U.Y.T.T.T.~.T.T.~.T.~.T.~.T.~.~.~.~.~.~.~.~.~./.!.~./.!.~.~.~.~.~.~.~.~.~.~.(.~.^.~.~.~.~.~.T.~.T.T.T.P.T.T.P.Y.U.U.P.P.U.U.U.U.P.P.T.P.P.T.U.T.T.T.T.T.T.T.T.T.T.T.T.U.L.I.Y.U.Y.K.L.L.U.L.U.U.L.L.L.U.L.U.L.L.H.L.L.H.L.H.H.G.S.H.S.S.S.A.S.S.H.A.H.H.H.S.h.H.A.S.H.A.A.H.S.S.S.S.H.H.H.H.L.L.L.L.L.L.L.U.U.U.Y.T.T.T.T.T.T.~.~./.T.~.T.~.~.~.~.E.[.T.~.~.!.~././.(.(./.(.(.(.(.(.(./.^./.!././.(.(.(.(.(.(.(.^.(.(.(.(.`.^.}.}.}.|.|.|.}.|._.(._._._.`.(.(.`.|._.|.|.|.|..X|..X.X.X.X.XdXzX.XxXzXdXdXxXdXdX.XdX'..X.X.X.X|.|..X|. X.X.X.X.X'..X.X|..X|.|.",
+"C D Z F C Z F C D B D Z Z D D D D Z D D D D D Z D D Z Z Z Z Z Z Z Z C Z Z H L Z Z H Z H Z H H Z Z L H L Z H H Z D Z Z Z Z Z Z Z Z Z Z Z D D D Z Z u ; o o $ $ ; * * : y : : : : r r r r r r r r ; r ; 0 0 r 0 e r r r r r 0 r r r r y 0 r r r r r r r r y * r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r : r r r r r r r : r r r r r r r r r : e r r r ; r r r r r : % $ $         y ].(./.~.~.[.T.T.{.~.~.T.~.~.~.~.~.~.~.~.T.T.~.~.T.T.~.T.T.T.T.T.T.P.U.T.Y.T.T.T.T.T.T.T.T.T.~.T.T.Y.Y.T.T.T.Y.T.U.U.Y.Y.L.L.U.L.U.L.L.L.L.U.U.P.P.T.P.P.U.P.T.T.P.T.U.T.T.T.T.T.T.T.~.T.~.(.T./.E.T.E.~.^.~.~.[.~.~.~./.~./.~././.~.~.~.~.~.~.!.~./.~./.^.[.~.T.[.(.R.~.T.~.~.T.~.T.~.T.~.T.~.~.T.Y.~.~.~.~.~././.~.~.E.(.(.(.(.(.(.^.^._.|.^.`.|.|._._.|._.|.|.|.|.'..X X.X.X.X.X.X.X.X.X.X.X.X'..X.X.X.X|..X.X|..X X.X|.|. X|.|.'.|.|.|.'. X'.'..X.X.X.X.X.X.X X|..X.X|..X'.|..X X|.|..X.X|.'.|..X|..X|..X'..X.X|..X|. X.X X X X.X.X.X.X.X'..X.X.X.X.X.X|..X.X.X.X.X.X.X.X.X.X.X.X.XdX@XxX'.dXdX.X.XxX'..XdX.XzXdX.XzX.X.X.XdX.X.XzX.XzXzX.X.XzX X@XdXdXdXzXzXzXdXxXzXzXcXzXzXzXzXzXzXzXdXdXdX@XdX.X.X|._.{./.~.T.T.U.P.L.L.H.H.H.S.D.L.D.U.H.L.G.L.D.H.H.L.H.G.H.H.H.A.G.A.H.A.j.G.h.j.h.G.G.j.h.A.A.A.A.A.j.j.A.A.A.A.A.A.H.A.A.A.A.A.A.G.A.H.G.G.S.S.S.H.S.G.S.A.S.S.A.S.S.S.S.S.S.S.S.S.S.A.G.A.A.A.A.H.g.A.A.A.A.g.l.l.l.l.l.l.l.h.z.l.z.A.h.g.h.z.h.A.z.z.h.h.l.h.k.h.k.h.k.k.z.k.k.h.z.l.h.A.H.S.A.H.A.H.S.S.A.A.Z.H.A.S.S.S.S.S.H.A.H.G.A.H.H.H.H.H.A.G.G.A.A.A.H.A.H.S.A.A.A.j.l.l.l.l.h.h.h.g.k.j.a.j.g.g.g.g.k.k.k.h.z.h.h.h.z.h.h.A.h.A.A.A.A.H.A.S.A.A.A.S.S.A.S.A.A.G.A.A.A.A.A.A.A.S.S.S.S.S.S.S.S.G.A.H.G.H.H.H.H.H.S.H.L.G.L.G.L.L.L.L.L.L.L.U.L.L.U.U.Y.L.U.L.U.U.U.Y.L.U.L.U.I.S.U.L.H.H.H.H.H.S.H.H.H.H.S.H.A.L.H.H.S.H.L.S.S.L.A.L.S.L.L.P.L.T.U.L.L.U.U.Y.T.T.T.~.T.~.~.T.~.~.E.~././.(.(.(.|.(.(.(.(.(.`._._._._._._._._.|.(.(.(.(.(./.!.~.~.~.~.~.T.T.~.~.T.T.P.U.U.U.T.P.P.P.T.T.T.T.T.T.~.T.~.T.~.T.(.~.~.~.~.~.~.~.~.~./.[.~.[.~.~.~.~./.~.~.~.~.~.T.~.~.T.[.(.T./.T.~.~.T.T.T.T.P.P.Y.P.Y.P.P.P.U.Y.U.L.P.P.T.T.P.U.T.T.T.T.T.T.T.T.T.T.T.T.U.T.Y.I.U.U.U.L.Y.L.L.L.S.L.L.L.L.S.L.S.D.U.L.G.H.H.H.H.S.G.S.S.S.S.S.S.S.A.H.A.A.H.G.A.H.S.A.S.H.A.A.A.S.S.S.S.S.H.H.H.S.L.S.L.S.L.L.L.L.L.U.Y.T.T.T.T.T.T.T.T./.~.~.T.T.~.~.XXT.[.T.~.~.(.~.[./.(.(.(.(.(.(././.(.!.^.^.(././.(.^.(.(.(.(.(.(.(.(.(.(.`.}.}.}.}.|.|.'._.|.|.(.(.(.(.(.(.(.(.|.{._.|. X X.X|..X.X.X.X.X.XzXzX.XdXdXdX.XdXdX.X.X.X.X|..X@X|.|.|.|.|..X.X.X.X.X.X.X|.'.|.",
+"Z Z Z Z D F Z Z D Z Z D D D D D D D D D D D D D Z D Z Z Z Z Z Z Z Z Z C Z Z Z Z Z Z S H L Z H D S H Z Z H Z H Z Z D Z Z D Z D Z B Z Z Z B Z Z D B L C * $ $ $ $ % % % ; * r r r r r r r r r r r 0 r r r r ; e q r r r r r e : r r r r t r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r e e 0 r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r r 0 r r r r r r r ; % % $ o         _ [.[.T.^.(.!.T.(./.I.T.^.~.T.T.~.~.T.T.^.T.~.~.~.T.~.(.T.~.T.T.T.T.T.T.Y.Y.T.T.T.T.T.T.T.T.~.T.T.T.T.T.Y.Y.T.T.T.T.T.T.T.U.U.T.U.U.L.U.Y.U.L.P.P.P.P.P.T.T.U.T.T.P.[.T.T.T.T.T.T.T.T.~.~.T.T.T.~.~.~.[.~.~.~.~.T.~.~./.~.~.~.~./.~.~./.~.~.~.~.~.!./.~.~.~.~.~.~.~.T.~.T.~.T.~.T.T.~.~.T.~.T.T.~.T.T.~.T.T.~.~.~./.~.~./.[.(.(.(.(.^.`.(.{.|._.`.(.`.`._._._.|.}.}.}.|._.|.|..X.X.X.X.X.X@X.X.X.X.X.X|..X.X.X.X.X.X.X.X.X|..X|. X|.'..X|..X X.X|. X.X X@X.X.X.X.X.X.X.X.X.X.X.X.X.X|. X|. X|..X|..X.X X.X X.X|.|..X|..X|..X.X.X.X.X X'. X.X.X'..X.X.X.X.X.X|..X.X.X|..X'.|..X.X.X.X.X.X.X.X.XdXdX@XdX'..XzXzXdX'.zX'.zXzX.X.X#XdX.X.X.X.X.X.X'.zXzXzX.XdX'.xXdXdXzXzXzXzXxXzXxXzXxXzXcXzXdXdXcXdXzXzXdX X.X|.`.(./.~.T.P.L.L.L.H.S.L.L.H.S.H.H.S.L.L.L.L.L.L.L.A.L.S.H.H.H.A.G.A.A.A.A.A.j.A.A.A.A.A.A.h.A.A.A.A.A.A.A.A.A.A.A.h.H.z.G.A.W.G.A.A.G.H.H.A.H.G.H.G.G.G.A.S.F.l.S.S.S.S.S.H.A.S.S.A.A.Z.A.A.h.A.A.g.h.A.h.h.h.A.l.h.h.h.l.l.l.l.h.l.l.l.z.z.A.h.z.h.h.h.h.h.h.h.h.k.g.g.k.f.k.d.k.k.g.d.g.h.A.S.A.H.H.A.H.H.H.g.A.A.S.S.H.H.H.S.H.S.G.S.H.H.H.H.H.A.Z.H.A.A.A.G.A.H.A.A.A.A.A.z.h.h.l.k.k.h.z.g.a.j.z.g.g.g.g.g.k.h.k.h.h.h.h.h.D.z.A.h.A.A.A.A.A.G.A.S.S.A.S.S.S.S.S.A.A.A.G.A.G.A.A.A.z.H.S.S.S.S.S.S.G.S.G.H.H.H.S.D.G.H.H.L.G.H.G.L.L.L.L.L.L.S.L.S.L.U.K.U.L.Y.L.R.L.L.L.L.L.L.L.U.L.L.S.U.S.H.H.H.K.S.H.H.H.S.H.H.H.H.H.H.L.L.H.L.L.U.P.L.L.S.U.L.L.L.L.L.U.U.U.T.T.T.T.T.T.T.T.~.~.~.~././.(./.(.(.^.|./.|.^.(.`.]. X_. X_._._._.^.(.(.(.(.(.(.).~.).(./.~.~.~.~.~.T.T.Y.T.U.Y.U.T.P.P.Y.U.T.T.T.T.T.T.~.~.T.T.^.~.T.~.~.~.[.~.~.~./.~./.~.~.~.~././.R.~.~.T.~.~.T.~.~.T.~.~.~.T.~.T.T.T.T.T.T.T.P.T.T.P.P.Y.L.L.U.U.P.P.T.T.U.T.T.U.T.T.T.T.Y.T.T.T.T.L.T.U.T.L.L.U.L.L.L.L.L.L.L.L.G.L.S.L.U.G.H.H.S.H.H.S.S.H.S.S.S.S.A.H.A.G.S.G.Z.A.H.H.H.G.G.A.A.A.H.A.A.A.S.S.S.A.H.A.S.S.L.S.S.L.L.L.L.L.L.L.L.U.T.T.T.T.T.T.~.T./.T.T.~.~.~.~.T.~.T.~.T.~.~.~.(./.(./.(././././././.^.~.^././.(./.(.(.(.(.(.(.(.(.(.{.(.^.`.}.}.}.|.|.}.|._._.^.(.(.(.(.(.`.{.`.|._. X|.|.|. X.X.X.X.X.X'.@X'.dX'..XdXdX.XdXzX'..X.X.X X X X`. X X.X X.X X X.X|.|..X|._.",
+"B D Z Z Z Z Z Z C G D D D D G Z D D D Z D D Z Z D Z Z Z Z Z Z Z Z C Z L Z Z Z Z Z H Z H Z H Z H H H Z L Z J H H D Z D D Z Z Z Z D D Z Z F D Z Z Z Z Z Z e $ o o $ & % * * : : y r r 0 e r r r r r r r r r r r r r : r r r r r r r r e * r r r r r r e 0 r r r r r r r r r r r r r r r r r r r r r r : 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r ; 0 r r ; r 0 r r r r r r r r r r = * % % $         o ` T.[.T.(.T.~.(././.!.(.~.~.~.T.~.~.T.^.~.~.~.~.~.T.~.P.~.T.T.~.T.T.T.T.T.~.T.~.~.~.~.~.~.~.~.T.~.T.~.~.T.~.T.T.T.T.T.T.Y.T.T.T.U.U.U.U.U.L.U.L.P.P.T.P.P.P.T.P.P.P.P.P.T.T.T.T.T.T.T.T.T.T.~.T.T.~.T.~.T.~.T.~.~.[.~.~.~.~.~.!.~.~.~.!.~./.~.~.~.~.~.~.~./.~.~.!.T.T.~.XX~.T.~.T.T.~.T.~.T.T.~.T.~.T.T.T.~.T.~.~././.~././.^.^.(.(.(.^.^._.|._.{.|.`.(.(._._._.{._._._.|.|.|.'.|..X.X.X'.zX|.dX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X'. X|. X|. X|.|..X.X.X X.X.X.X.X.X.X'..X.X.X.X.X.X|.'..X.X.X.X.X.X.X.X.X.X|..X|..X.X X.X.X.X.X.X.X.X@X X.XdX'.@X@X.X.X.X.X.X.X.X'..X.X.X.X.X.X.X.X.XdX.X.X.X.XdX'. XdX.XxX.X.X.X.X.X.XzX.X.XdX.XdX.XdXdX.XxXxX'..X.XzXzXxXdXdXdXdXcXzXxXzXxXxXzXxXzXzXzXdXdXcXdXdXdXdX.XdXdX.X'.|.(.^.~.T.P.P.U.U.S.H.L.H.L.D.L.L.L.A.L.L.G.L.L.L.P.L.G.S.H.H.G.A.G.A.A.G.j.A.G.g.h.A.j.A.A.h.A.h.A.A.A.A.A.A.A.J.z.G.A.A.A.G.h.G.A.Z.H.H.H.S.S.S.S.Z.G.S.A.S.H.S.S.S.S.S.S.H.S.S.S.A.A.D.S.h.A.h.A.A.h.A.Z.h.h.l.h.h.h.l.l.l.l.l.h.A.l.G.z.h.A.h.h.A.h.h.h.h.k.g.k.g.g.k.k.k.k.k.k.k.z.h.g.A.g.A.A.H.A.h.A.A.A.A.A.S.H.S.H.H.H.H.H.H.H.A.H.H.h.H.H.S.S.A.G.H.A.Z.A.A.A.A.A.h.A.h.h.h.h.h.a.a.z.z.k.k.k.f.g.g.z.k.k.k.z.h.h.g.k.g.A.S.h.g.l.A.A.A.A.G.A.A.H.A.A.A.G.A.A.A.G.A.A.A.A.A.A.S.A.S.S.S.G.H.S.S.G.A.H.H.H.H.L.L.H.G.G.L.D.L.L.S.U.L.A.L.L.L.L.L.L.L.U.U.U.U.L.U.R.L.U.L.L.L.L.L.L.U.S.U.H.H.H.A.H.A.A.S.D.A.H.H.H.H.S.S.H.H.H.S.S.D.L.L.L.L.S.L.L.Y.L.U.L.U.T.T.T.T.T.~.T.T.T.R.~.R.~././.{./.(.{.|.(.(.^.`.(.|.[._._._._._._.|.(.(.{.(.(.(.(.~.~.~.~.T.~.~.T.T.T.T.Y.T.U.T.P.P.P.U.T.T.T.T.T.T.T.~.T.T./.T.~.T.[.T.~.T.~.~.~.~.!././.~.~.[.T.T.T./.T.T.~.T.T.T.T.T.~.T.T.~.~.T.~.T.T.T.T.T.T.T.T.T.T.P.P.U.U.L.U.P.P.T.U.T.U.U.T.T.Y.Y.Y.Y.T.T.T.T.T.U.T.Y.T.L.L.L.U.S.K.L.S.H.S.L.L.H.H.S.H.G.G.A.H.S.H.A.S.S.S.S.A.A.A.A.A.A.A.G.G.A.G.A.G.H.S.H.H.h.A.H.S.S.A.S.S.A.S.A.H.S.S.L.L.L.S.S.L.L.L.L.U.U.T.Y.T.T.T.T.T.T.T.T.T.T.T.~.~.~.~.~.~.T.~.!././././././././././.!.(.~.!././.(././.!.(.^.^.(.{.(.(.(.(.^._.}.}.}.}.|.|._._.|.|.(.|.(.(.(.(.^.|.|.{.|._.|.|..X.X.X.X.X'..X.X.X.XcX.X XdXdX@XzX.X.X|..X|.|. X_.|..X|..X|..X.X'..X|.|.@X|.",
+"Z G Z Z Z Z Z Z Z F Z D D D D D D D D D D D F Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z G Z Z L H D D D D D Z D D D D D C Z Z C Z Z D Z Z Z Z Z Z A G Z Z Z q % o o o $ % = * % ; : e : ; e : r 0 r ; 0 r r r r y ; r r r r r r r r r r r r r r r r r r e 0 r r r r * r r : r r r r r y * r r r y r r r r e * t : r r r r r t 0 y r r 0 r r r r r r r r r e q r r r r ; r e r ; : r r r r ; : * * * > % $ o o     #   u F.^.~.~.`.(./././.(.~.~.~.~.~.~.~.~.~.~.T.~.T.~.T.~.~.~.[.T.~.T.~.T.~.T.T.~.U.T.~.(.~.~.~.~.~.T.~.~.T.~.T.T.~.T.~./.T.[.T.T.T.T.T.T.Y.T.T.U.U.U.L.U.U.U.P.T.T.U.U.T.U.T.T.T.~.K.T.T.T.T.T.~.~.T.~.T.~.T.~.~.~.~.(.E.(.~.T.~.[.~.~.~.(.~.T.T.~.~./.~.~.~.T././.(./.!.[.~.[.XXT.[.T.T.~.T.T.T.P.T.T.T.T.T.T.T.T.~.T.[.[.~.~.[.(./.[.[.{.[.{.XX|._.|._._._._.|.`.[.|._.{._.|.`.`.|.|. X.X.X.X.X.X.X.X.XdX.X.X.XdX X.X.X.XzX.X.X.X.X.X X.X.X X.X.X.X.X X X XdX'..X.X.X'.@XdX'. XdX.X X.X.X.X.X.X.X.X.X.X.X X X|.|. X X X'.|..X.X.X.X.XdX.XdXdX.X.X.X@X.X.X.X.X.X.XdXdX.X.XdX X.X.X.X.X.X.X.X.X.X'. X.X.XdX.XdXdXdX@X.X.XdXdXhX.X%X.XdX.XdXdXdX.XdXzX'.'.zXzXzXzXzXzXzXzXcXxXxXzXcXdXcXzXzXcXzXzXzXzXzXzXzXzXzX'..X.X.X|._.(.~.~.T.U.L.L.L.H.L.H.L.G.A.L.L.L.L.L.H.L.L.L.G.L.L.K.H.H.H.A.A.A.A.h.g.A.l.A.A.g.A.A.A.h.h.A.A.A.A.h.A.A.z.S.S.A.G.A.A.A.D.G.D.A.H.H.G.A.H.A.H.H.A.S.S.S.A.S.S.S.S.A.S.G.z.G.A.z.A.S.A.h.A.A.z.A.z.h.h.h.h.h.h.h.A.h.h.h.h.z.h.h.h.h.h.h.h.h.h.h.h.h.h.h.z.h.k.z.g.z.z.f.a.f.f.f.z.g.h.l.D.A.A.A.A.S.A.A.A.A.A.D.S.H.H.H.G.H.H.H.H.H.S.H.S.S.S.H.h.A.A.A.A.A.A.A.A.A.A.k.h.h.g.h.k.g.z.f.f.k.d.k.k.i.z.g.z.g.g.j.z.k.z.z.D.D.k.A.h.A.h.A.A.h.A.H.h.A.H.G.h.S.A.A.A.S.A.G.A.A.A.A.A.A.A.A.A.G.G.G.G.H.S.L.A.S.H.H.L.H.L.H.H.H.L.G.L.U.S.U.D.L.L.U.A.L.K.L.L.U.U.U.U.U.L.U.L.U.L.L.K.L.G.L.H.H.H.H.S.G.G.G.G.D.S.S.H.H.G.H.G.H.H.H.H.G.G.G.H.J.H.H.H.S.U.L.L.L.P.L.P.U.T.T.T.T.T.T.T.T.(.T.~.(./././.(.(.[.(.`.(.{.`._._._. X`.`.(.`.`.`.`.(.{.(.^.|.[.~.^.T.~.T.~.~.T.T.T.T.T.P.P.P.P.Y.T.T.U.T.U.Y.T.T.T.T.T.^.T.~.T./.~.~.~.~.~.~.~.~.~.~.!.!.T.~.~.T.T.T.T.T.T.I.T.I.T.Y.I.T.I.T.~.T.T.T.T.I.T.T.T.L.T.P.P.T.P.U.L.U.U.U.U.U.I.T.Y.T.T.U.U.U.U.U.P.U.T.P.T.U.Y.P.U.L.L.D.U.U.S.H.G.G.H.G.H.G.G.H.H.H.A.S.A.S.S.l.A.A.A.h.A.A.A.A.A.A.G.S.S.S.S.H.S.S.S.S.A.S.h.h.A.A.G.S.S.S.S.A.H.H.H.H.L.H.L.H.L.L.L.U.P.P.P.T.T.T.T.U.I.T.T.Y.Y.!.T.T.T.T.!.~.T.~.~.~.!.(./.~.~.~.~.~.^.T.^.~./.E.!.[.~.~.~.^./.(./.^.(.(./.(.`.`.(.`._._.}.}.}.}.[.|.|.^.(.(.(.{._.{.(._._._.|. X.X.X.X.X.X.X'..X'..X'.'.zX.X.X.X.X.X.X.X.X|.|.|.}.|.|.|.|. X|. X'.|.'.|. X'.",
+"C B Z Z Z Z Z Z Z Z Z Z D D D D D C D F D D Z Z Z Z Z Z C Z Z F Z C Z C Z Z Z Z G Z Z Z G D H Z D D H Z D D D Z Z D D D Z Z Z Z Z B Z Z Z Z Z Z F D C Z Z Z u r o $ o $ $ $ % * 0 * e 0 ; ; r r r = ; r r r r ; r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r r r r r r r r r r r r r r 0 y r r r r e * : : r r r r r r r r r r r r r r r r 0 0 r 0 ; ; e r r r 0 r y * * > * % $ $         o u ]./.T.~./.!././.~./.~.(.~.(.~.~./.~.~.~.~.~.(.~.~.~.~.~.~.~.T.~.~.T.~.R.~.~.~.~.[.~.T.Y.~.~.~.~.~.T.T.~.~.T.T.T.~.T.T.T.T.T.~.T.T.~.~.T.U.T.Y.U.Y.U.T.U.P.P.U.T.T.U.U.T.T.U.T.T.T.T.~.K.T.T.~.T.~.T.~.~.~.T.T.~.T.T.~.~.T.{.~.R.~.~.~.T.~.~.~.~.T.T.~.T.~.!.T.~.T.T.T.T.!.~.T./.~.T.~.~.~.~.T.T.~.T.~.T.T.~.T.~.T.~.~.!.~.!.(.!.(./.^.(.(.`.(.(.(.(.(.`.^.^./.(.^.(.{.^.|.(.^.(.`.`.`..X'.'..X.X.X.X.X.XdX.X.X@X.X.X.X.X.X.X@X.X.X X.X|..X|..X.X|.@X.X'.@X.XdX.XdXdX'.dX XdX.X.X.X@X|..X|..X|.|..X.X.X.X.X'..X`..X'.|.|.@X.X.X.X.X.X.X.X.X.X.XzXdXdXdXdXdXdX.X.X.X.X.X.X.X.X|..X.X|..X@X.X.XdX.XzXzXdXdXzX.XdXdXdXdXdXdX.XdX.XdX.X.XdXdX.XdXzX.XdXzXdXdX.XzX@XzXdXcXdXcXxXxXcXcXcX.XcXzXzXzXzXzXdXdXzXdXzX.XdXdX.X X|._.(.(.~.T.T.T.U.U.L.L.L.L.U.L.D.L.D.U.U.D.L.L.U.U.L.L.S.S.H.G.S.A.A.Z.H.z.A.A.A.A.H.l.A.A.Z.D.S.S.D.S.S.H.S.S.A.S.D.G.D.A.G.A.A.G.H.H.S.H.G.G.S.S.G.H.S.S.D.A.S.A.S.D.G.A.D.G.A.A.D.D.h.G.l.A.A.A.S.h.A.h.h.h.h.A.h.l.h.h.A.A.h.D.h.A.H.z.S.h.A.h.A.h.l.h.h.k.h.z.g.g.a.g.f.f.a.f.f.k.k.k.l.h.h.l.H.z.A.A.A.A.A.A.D.S.H.S.H.S.U.H.S.H.H.H.H.H.S.S.A.S.A.A.A.A.A.A.A.A.h.h.h.h.g.z.a.g.k.f.f.f.k.z.k.z.z.z.d.g.g.a.g.g.k.g.g.h.A.g.l.h.h.A.z.A.S.S.G.D.S.S.S.S.S.S.A.S.D.z.A.A.S.l.A.H.l.F.D.A.D.A.S.D.S.S.S.L.D.L.H.S.H.H.S.U.L.S.L.U.L.L.U.U.L.U.U.U.L.L.U.U.U.U.T.U.L.L.U.U.L.U.U.L.U.L.L.L.U.A.L.L.H.H.A.L.U.H.A.D.S.L.H.S.H.S.L.L.L.L.L.L.L.H.K.H.S.L.U.U.L.Y.P.!.!.T.T.~.~.T.~.I.T.L.~.(.(.(./.(.(.~.(.(./.(.(.(._.^._.{.(.(.(.(./.(.(.(.(././.~.(.[.T.^.^.T.T.T.T.T.T.T.T.Y.P.Y.Y.U.U.T.T.Y.U.T.U.T.T.T.T.T.T.~./.T.T.~.T.~.~.~.~.T.T.~.[.T.T.~.[.~.T.U.T.T.T.~.T.T.~.T.Y.~.T.^.T.~.~./.T.T.T.~.(.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.!.T.T.T.T.T.T.Y.L.U.P.Y.U.U.U.U.S.L.U.L.H.L.H.S.L.H.G.D.H.D.A.A.A.D.S.S.D.A.S.A.A.A.A.S.S.l.D.S.A.S.G.A.S.S.S.D.S.D.S.A.H.H.S.A.S.S.G.S.H.H.L.H.L.L.L.H.L.U.U.U.Y.T.P.T.T.T.~.T.~.~.T.T.T.[.T.~.~.T.K.~.T.!.~.~.~././.T./.~.~.T.^.P.T.R.(.[.^.~.~.[.^.~.~././././.(.(.(.(.(.`.|._.}.}.}.}.|.^.(.(.~.(.(.(.|.^._.|._.|.'.|.|..X.X|..X.X.X.X.X.XdX.X@X.X.XdX.X.X'..X.X'.|.}.|.|. X`.}._.|.|.|.|.|.|.|.|.",
+"D Z D D Z C Z C Z Z Z D Z D Z D H Z Z Z F Z Z Z Z Z Z Z Z D B D Z Z C G Z Z Z Z Z D Z Z D D D L D D H D D D D F D Z Z D Z B B D Z Z Z C Z Z Z C D D Z Z Z Z G C y $   o $ $ $ % % * * = y ; r : r y r ; = r r r r r r r r r r r r r r r r r r r r r 0 : r r r r r r r r r r r r r r r r r r r r r r r r r r r r : y * r * y : 0 r r r r r r r r r r r r r r r r ; r r r r r r r * y ; r = 0 % * $ $           % F._.{.~.[.{.^.(.^.E././.~.~././.(././.~.~.!.~.~.~.~.~.~.~.~.~.~.~.T.~.~.!./.~.~.~.~.~./.[./././.~.~.~.~.~.~.T.T.~.T.T.T.T.~.T.~.T.T.T.T.T.T.T.T.U.T.T.T.U.U.U.T.T.T.U.U.T.U.U.T.K.T.T.I.T.K.T.T.K.~.T.~.~.~.~.T.~.~.~.T.T.~.~.T.~.T.T.~.~.R.~.~.~.T.T.^.(.T.~.~././.~.~.^.!.~.~.T.(.(.T.(.T.~.~.T.T.[.~.T.T.T.~.T.T.T.T.~.[.[.[.(.(.!./.(.(.(.(.{._.{.|.|._.`.`._.(.{._.^.|.`._.|._.|. X X X.XdXdX.X.X.X.XdXdX.X'.dXdXdX'.zX.XzX.X.X.XdXdX@X.X.X'.'..XdX.X@XdXdXdXzXdXdXdXdXdX XzX.X.X'.@XdX'.zX.X.X X.X.X.X.X.X|..X.X X.X X X X.X.X.X.XdX.X.XdXdXdXdXdXdX.XdXdXdX@XdX.X.XdX.XdXzX.X'..X.X.XdX@XdX@X.XdXfXdXdXdXdXdX.XdXcXdX'.@XdXzXdXdXvX.XdX.XzX.XdXzXdXdX@XzXdXdXdXfXdXxXdXcXcXdXcXcXzXzXzXzXzXzXzXzXfX.X.XdXdX@X.X.X'.|.`.(.[.~.~.T.U.U.L.U.U.L.L.U.P.L.L.U.L.G.L.H.L.G.L.L.H.H.G.G.H.h.H.z.h.H.A.h.h.A.A.G.h.G.h.h.G.G.h.A.G.h.A.z.H.G.g.G.S.A.G.G.D.D.S.S.G.S.G.G.A.G.H.A.D.G.z.A.A.A.H.S.G.z.H.G.h.H.h.z.h.h.h.A.h.h.h.h.h.h.h.h.h.h.g.g.h.h.z.h.h.h.g.h.l.z.k.h.z.h.h.h.l.l.z.z.g.g.g.g.a.g.g.a.a.g.f.f.a.g.g.h.g.h.g.A.A.h.h.S.A.A.S.D.G.S.H.H.H.H.D.A.H.H.S.S.S.A.S.h.A.A.A.A.A.h.A.h.h.g.k.k.g.j.f.k.a.k.a.f.k.i.k.a.d.j.g.g.a.z.g.k.d.g.z.D.g.k.z.z.h.h.h.h.h.A.g.A.h.h.A.A.A.z.h.H.h.H.A.A.z.A.g.h.A.l.G.G.G.D.G.S.H.G.H.S.S.H.H.L.L.A.L.G.D.L.L.H.L.L.U.L.D.U.L.L.L.L.L.L.U.U.L.U.Y.U.U.H.H.U.L.L.L.L.G.L.U.H.L.G.H.H.S.D.H.H.A.H.H.H.L.G.L.L.L.A.G.G.G.G.D.S.S.U.L.L.L.L.P.P.P.P.T.T.T.T.T.T.U.~.~.T./.[./.(.!.(.(.`.`.`._.`.|.(._._._._._.|.(.`.(.`.(.(.(._.(.!.(.[.~.~.~.~.T.~.T.T.T.I.Y.P.L.U.U.U.U.Y.T.U.U.Y.U.T.T.T.T.T.T.~.T.^.[.T.~.T.[.~.T.~.(.~.~.~.T.L.L.U.U.T.T.Y.I.U.T.T.U.T.T.T.U.T.T.T.T.T.T.T.T.I.T.U.T.U.P.U.U.P.U.U.T.U.U.U.U.I.I.U.T.U.U.U.I.U.U.T.H.L.U.U.L.U.L.L.L.L.L.U.L.A.H.L.H.S.H.H.L.G.S.S.D.z.A.G.A.S.h.A.h.h.z.A.A.A.l.G.A.A.h.H.h.H.S.S.S.H.G.S.S.A.h.A.A.A.H.z.H.G.H.G.S.G.G.G.G.L.L.L.U.P.P.U.U.T.U.T.T.U.T.U.I.T.Y.U.T.T.T.T.T.~.T.(.~.~.T./.~.~./.T.~.T.[.T.T.T.~.!.!.~.~.Y.~.~.~././././.(.(.(.(.(.(._._._.|.}.|.(._.^.(.).(.(.^.(.).(.^.`.|.[.|.|.|. X.X.X.X.X.X.X.X'.'.dXdX X@X X.X|..X X X|._.`.|.|.|._.|.|._.|.|.|.|.|._._.",
+"Z Z B F Z Z Z Z B Z Z Z D Z Z Z Z Z Z G Z Z Z Z Z Z B D Z B Z Z Z Z Z C Z B D Z Z G Z Z Z Z G Z H D H Z Z F Z Z Z D Z Z Z D Z F C C Z D F V Z Z Z D Z Z Z F C D Z C % $ o o o $ & % % * * = : y r ; r 0 e r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 e r r r r r r r r r * r r r r r r r r y * r r r : : y r r r r r r r r 0 e r r : r r r r r ; r r 0 r : r ; 0 % ; % % $         # % c.!.[.~.~.[././.T.(.^.(././.E././.!././.~./.~.~.~.^.~.~.~.~.~.~.~.T.~.T.(.[./.~.~./././././././././.E.(.~.~.~.~./.T.T.~./.T./.T.~.T.T.~.~.T.T.~.~.T.T.T.T.T.T.T.T.T.T.U.U.T.U.T.U.T.T.~.T.~.T.~.~.T.~.T.T.~.~.~.K.~.~.T.~.~.~.~.~.~.T.~.~.~.~.~.~.T.~.T.T.~.~.~.~.~.~./.!.!.!.F.[ _ ~ S ) S S / S S / ~ ~ S ~ ~ ~ ~ P ~ ! ! S / S ~ ~ / ~ ~ ~ ~ ~ / ! ! ~ / / S ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ / ~ / ~ ~ / ~ / ~ ~ / ! ~ / ~ ~ ~ ! / ~ ~ ~ ~ ~ ~ / ! ~ ~ ~ / ! / ~ ~ ~ ! ~ ~ ! ! / ~ / ~ / ! ~ / ~ / / ~ ) / ~ ~ ~ ~ ~ ) / ~ ~ / ~ ! ~ ~ / / ~ ~ / Q Q S ~ ~ ~ S ! / Q / ~ ~ ~ / ~ ~ / ! / ~ ~ / / ~ / ~ / [ Q.dXdXdXzXzX.XdXdXdXdXzX.XvXdXdXdXvX'.zXzX.XdXdXdXdXdXdXcXdXzXcXdX@XzXzXzXzXzXzXzXzXzXzXzXzXdX.X].Q.[ / ) ~ ~ ~ ~ S ~ S ~ ~ ~ ~ ~ ! / J S ! ! P ! ~ ~ / ) / ~ ! ! / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ J S ~ ~ ) ~ ~ ~ ~ ! / ~ ~ ~ ~ ~ / ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ / ~ ~ ~ ~ ! ~ ~ ~ / ~ ~ ! ~ ~ ~ ~ ~ ~ / ~ ! ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ _ ~ / ! ~ ~ / ~ ! / ~ ~ / ! ~ ~ ~ ! ! ! ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ / ~ ~ / ) _ b.Z.U.L.J.K.D.H.H.U.S.H.H.D.S.S.A.A.h.h.h.h.f.h.f.h.k.g.g.g.a.i.f.k.f.a.f.a.i.k.a.k.a.g.g.a.z.z.a.[ [ P S S / / ! ! S ^ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ~ ! ~ ! ! ! ~ ~ ~ / ~ ~ ! / ! ! ! S ~ ~ / u ~ ~ ~ ~ ! ! ~ ~ ! ~ ! ~ ~ ~ ~ ~ ! ! ~ ~ ~ ! ! S ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ! ~ ~ ~ S ~ ~ ~ ~ / ~ ! ! ~ ~ ! ~ S ~ ! ! ! ! ~ ~ ~ ! ! ~ ~ / ~ ~ ~ ~ S ~ ~ ~ ~ ! ! ~ ~ ~ / ~ / ~ ! ! ~ ~ ! ! ~ ~ / ~ ~ ~ / [ [ !.].~.T.~.T.T.U.T.U.U.P.Y.P.U.L.U.L.P.U.U.L.U.T.U.T.T.T.T.T.T.T.T.T.T.T.~.T.~.I.~.T.U.T.[.T.].F.[ ) / / / / ~ ^ ~ ~ ! ~ ~ ~ ^ ~ ~ ~ ~ ~ ^ ~ ~ Q ~ ~ Q ~ ! ~ ! ! ! Q ~ ~ ~ ~ ! Q ~ Q ! ~ ~ ~ ! ~ ~ ~ ~ ^ ~ ~ ! ! ~ ! ! S ~ ! ! / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ~ ~ ~ ! ! ~ ! ! ~ ~ ! ~ S ~ ~ ~ ! ~ ~ ~ ~ ~ ~ ~ ~ ! ~ ~ ~ ! ! ~ ~ ~ ! Q ~ ~ ~ / ! S ~ S ! ! / ! ! ~ ~ ~ ~ ~ Q ~ ~ ~ S ' ~ ~ ) ~ ~ S S ~ ~ ! ^ S ~ ~ S ^ ) S S ! ! S [ b.F.Y.T.~.~.T.!./.~./././././.(.(.(._._.|.}.}.`.|.{.|.(./.(.(.(.(.{.(.`.(.`.|.|.|.|.'.|..X.X.X.X.X.X@X.X.X.X.X.X.X.X X.X.X'.|.`.`.|.|.}.}. X_._.|.|.|._.|._.|.",
+"Z D Z C Z C Z D Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z B C Z C D C Z Z B Z Z C Z Z Z Z C Z Z Z G Z Z Z G D D D D Z D Z D Z Z Z Z C Z Z Z Z B D C C A Z Z B D Z Z A Z A D G C Z u % o   o $ $ $ % % ; ; ; e : : : r r 0 y r r r r r r r r r r r r e 0 r r r r r r r r r r r r r e r r r r r r r r y : : y r r r * r r r r r r r r r r r r r r r r r r r r r r r r r r r r r : 0 : ; y ; = * * % * & o             u ].!.(.[.!.(./.(.(.(.(.^./.^.^.(././.!././././.~.~.!.~.~.~./.~.~.~.~.~.~.~./././././././.[.~./././././.~.~.~.(./.R./.~.~.T.~.~.T.~.~.T.~.~.~.T.[.R.~.T.T.T.T.T.T.T.T.T.T.T.T.I.T.Y.T.T.T.~.T.T.T.T.T.~.~.T.T.~.T.~.~.T.T.~.T.~.~.T.~.T.~.~.~.T.~.~.T.~.T.T.~.~.~.T.~.~.T.(.F._ S / ~ ! ~ ! ! ! Q Q ! ! Q Q Q Q ! Q Q Q / ! ! / Q Q ! ^ S ~ ! Q ! ! / ! S ! ! ! ! ! Q Q ~ ! ! ! ! ! ! Q ~ ! ! ~ ! ! ! Q ~ ! ! ! ! ! ! ! / ~ ! / ! ! ! ! Q ! ! ! ! ! ! ! / ! ! Q ! ! ! ! ~ ~ ! ! S ! ! ! ~ ~ Q ~ Q ! ! Q ~ ~ ! Q ~ ! ! Q ~ ~ ! ! ! ! ! ! ! ~ ! ! ! ! ! ! Q S ! ! ! S ! ! Q ! ! ! ! Q ! ! ! ! ! ! Q ! ! ! S ~ ! S ~ / / S ' ].dX.X@XdX'.dXzX.XzXzX.XdXdXdX.XxXzX@XdXdXdXzXzXzXzXcXcXcXzXzXcXzXzXzXzXzXzXzXzXdXdXdX].m.[ ' ! ! ! Q Q Q ! Q Q Q Q Q ~ ! Q Q Q Q ! ! ! S Q ^ / ~ ! ! ! ! ! ! ! Q Q ~ ~ ~ ~ ~ Q Q Q ! ~ Q ~ ^ ! Q ! Q ~ ! ! ! ! ! ! ! ! Q ! ~ ~ ! ! ! ! ! ! ! ~ ! ! Q ~ ~ Q Q ~ ! ! ! ! / ! ! ! ! ! ! ~ ~ ^ ~ ! Q Q ! ! Q ~ ~ ~ ! ! Q Q Q Q Q ! ! ! ! ! ! ! ! ~ ~ ! ! ~ ! ! ! Q ! ! ! ! ! ! ~ ! ! ! Q ! ! ! ~ ! ! Q ! ~ ~ ~ / ! S ! ~ ~ / _ [ [ Z.S.P.Z.D.H.H.H.S.S.S.S.S.h.h.z.k.z.k.k.k.k.k.g.d.f.f.i.a.i.d.a.a.a.a.a.a.a.a.z.a.z.D.T U / S S / ! Q Q Q ~ ~ ~ ! Q Q Q ! Q Q ! ! ~ ! ~ ! Q Q ~ ! ! ! ! ~ ~ ! ! Q ! ! ! ! ! ! S Q ! Q Q ~ ~ ~ ~ ! ! S ! ! ! ! ~ ! ! ! ~ ! ~ ! ~ ~ ! ~ ~ ! ! ~ ! ! ! ~ ~ ! S ! ~ ! ! ! ~ ~ S ~ ~ ~ ! ! S Q ! ! ! ! ! ! ! ~ ! ~ ~ ! ! S Q ! ! ~ ! ! S ! ! ~ ! Q ! S ! ! ^ ~ ^ ~ / ! ! ! ~ ! ! ! ! ~ ! ! ! ! ~ ~ ! ! ! ! ! ! ! ! ! Q Q ! S ! S / / Q _ F.[.T.Y.Y.U.U.U.L.U.L.L.Y.P.L.U.U.Y.L.U.L.U.U.P.T.T.T.T.T.T.T.T.[.~.T.T.T.~.~.T.T.T.F.[ S ! / / S ~ ! ^ Q ! ! ! Q Q Q S ! Q Q Q Q Q Q Q Q ! ! S ! ! Q S ~ ! ! Q S ^ ! Q ! ~ ! ! ! ~ ! ~ ! ~ ~ ! S Q ! ! ^ S ! ! ! / S / S ! ! ! ! ! ! S ! ~ ~ ! ! ~ ! ~ ! ! ! ! ! / ~ ~ ! S ! ! ! ~ ~ ! ! Q Q ! S S ! ! ! ! Q Q ! Q Q ~ S / ! ! ! ~ ! ! ~ ~ ~ ~ ! ! Q ^ ( ^ ~ Q S Q Q ! Q ! ! Q / ! ! ! Q Q Q Q Q Q Q ! ! Q Q Q Q Q Q ! / / / / _ F.~.P.~.T.~.~././././.(./.(._._._.^._.`.`.`.`.(.(.(.(.~.(.(.(.(.(.`._._.`.`.`.'..X.X'..X.X.X.X.X.X.X.X'.|..X.X.X|. X|.|.`.`.`.`._.|._._.|.|.|._.`._._._.",
+"Z C Z D Z Z F B F Z C Z Z Z Z Z Z Z Z Z C Z Z F C Z Z B Z C Z D Z C C Z C Z Z G Z Z F Z Z C D Z D D Z F D Z D Z Z Z F Z Z Z Z C C Z Z Z Z C Z C D C Z Z Z C C S C G G Z Z q $ o     o $ $ % % % % * r e ; r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r y * 0 t y * r r r r r r r r r r r r r r r r r r r r r r r r 0 : r r r r r r : * r r e ; ; ; % % & o o       #   y F./.T.(.T.(.(./.(.(././.(.^././.(././././.(.(././.(.~.~.~.~.~.!.~.~.~././.(.(././././././.(././././.(././.(.~.~.~.~././.T.~.~.T.~.~.~.T./.~.T.T./.~.~.~.T.P.^.~.T.T.T.T.T.T.T.T.Y.U.U.T.T.T.T.T.T.~.T.T.T.T.~.~.T.~.T.T.~.~.T.T.~.~.T.~.~.~.T.XXXXT.~.~.T.T.~.T.T.~.!.~.~.(.F.` Q ~ / ! ! ~ ~ ! ! ! ! ! ~ ! ! ! ! ~ ~ ~ ~ ! ^ ! S ~ / ! S ~ ~ ~ S ! ~ ! u ! ! ! ! Q S ! ~ ! ! ! ! ! S ! ! ~ ~ ! ! ! S ! S ~ ~ Q Q ! ! ! S ^ ~ S ! ! Q ! ! ! ! ! S Q ^ Q ! S ~ Q ~ Q Q ! ! Q ! Q Q Q Q Q Q ~ ~ ^ Q ^ ! ! Q ~ ~ ~ ~ ~ ~ ! ! ~ ~ ! ~ ! ! ! S ~ ! Q ^ ! ~ Q ^ Q Q ! ! Q Q Q Q ! ! ! ! ! ~ ^ ! S ! ! ! ! Q ! ! Q Q ! ! ! S S S / [ ].dXdXfXcXdXdXzX@XzXvXdXcXdX.XxXzXzXdXdXzXdXzXzXzXdXdXzXzXzXdXdXzXzXcXzXzXcXzXzXdX].[ / / / Q / ! ~ ! ~ ! ! / ~ ! S ~ ~ ~ ! ~ ^ / ! / ! ~ ( / S ! S S ~ ! S ~ ! ~ S ~ ~ ! ~ ! Q ! ! ! Q Q S ! ~ ! S ~ S ! ~ ~ S ! Q Q ! Q S ~ ! ~ ^ ! ! ! Q ! ! ^ Q ^ Q Q Q ~ ! Q S ! ^ ~ S ^ Q ! ! ^ ! Q Q ! S ! Q Q ~ ~ S Q ~ ~ ~ ! ~ ! ~ ~ ~ ~ ~ Q Q Q S ! ~ ^ ~ Q S ! Q Q Q Q ! ! Q Q Q ! S ! ! ^ Q ! / Q Q ! ! ~ ~ ^ ^ ! ! ! Q ~ S / / ) ) Z.F.L.L.H.S.H.H.H.S.A.z.h.h.k.f.f.z.f.f.k.z.k.d.d.d.i.a.f.a.a.s.a.i.a.a.a.k.a.z.z.T [ S / / / S ! / Q ! ! ~ ~ ~ S Q ~ ! ! ! ! ^ S ! ~ S ~ ~ S ~ ~ ! ! ! ~ ! ! ! ! ! S ~ ! ! / S ! ~ ! ~ S ~ / ~ / ! ! ! ! ! ~ / ! ~ ! ~ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ~ ! ! ! ! ! ! ! ! ! ~ ! ! Q Q ! ! Q Q ~ ! ! ! ! ~ ! ! / ~ / ! ! Q ~ ! ! ! ! ! ~ ! ! ~ ! ! ~ ! ~ ~ ~ ~ ! S ! S ~ ~ S ~ ~ ! S ~ ! ! ! S ! ! ! ! S ! ! Q ! S ! ! ~ ~ ! S / / / _ F.~.T.Y.U.T.U.U.P.Y.L.U.Y.L.L.L.L.U.P.L.U.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.U.T.F._ / / ! S Q c ^ K ~ Q Q ~ ! ! ! ! Q ~ ! ! ! ^ ~ ~ ~ ~ ! ~ ! / ! ! ! ~ ! ! Q Q ! ! ! ! ~ ~ ~ ~ / S / ! ! ! ! ! Q Q ! ~ ! ! ! ~ S / / / ! ! ~ ! ! / ! ~ ! ~ ! ~ ! ~ ~ ~ ! ~ ~ ! S ! ~ ! ~ ~ ! ! ~ S ! ! ~ ~ ~ ! ! ! ~ ~ ! ~ ! ! ! ! ~ ~ ! S ~ ~ ~ ~ ~ ! ! ^ Q ! ! ~ ~ ^ ! ! ! Q ! ! / S ! ! ! S ~ ! S ~ ! S ! S Q S ! ! ~ ~ ~ S ^ Q S c ! S ^ / | n.!.[.~.~.T.~.~./././.(.(.(._.|.|._.`.|.(.{.|.^.(.(.(.(.(.(.(.`.`.|._.`.`._.|.|.|..X.X.X.X.X.X.X.X.X'..X X|..X.X{.|.|.|.|.`.`._.|.|._.(._._.(.`.(._.|.",
+"Z Z C Z Z C Z Z D B C Z Z C Z Z Z Z Z Z Z C Z C Z C Z Z C Z C Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z D D D D D Z Z G Z Z Z Z Z Z Z Z D B A B A C Z Z C F Z C Z Z C D D C C Z Z C C D A e $ $ o     $ & & % % * ; ; ; = 0 r r r r r r r r q e r r r r r r r r r r r r r r r r r r r r r r r r r r r * r r r r r r r r r r r r r r r r e 0 r r r r r r r y r r r r r r r r r r : : ; % % $ $ o o           % c.T.[././.~./.^.(.(./.`./.(.(.(.(./././././././.(././.!.(.~.~.~.~.~.~./.~././.~./././.(.^.(./.^.^.(./.!.(././././.^.^./.~.~.R.~.T.[.T.~.T.T.~.~.~.[./.~.~./.~.[.~.T.T.T.T.~.T.T.~.T.!.T.T.T.~.~.T.T.T.T.T.T.T.T.~.~.T.T.~.T.T.T.T.~.T.~.~.T.~.T./.E.T.~.T.T.~.T.T.~.T.~.~.~.[.F._ / / / { pXMXDXDXZXZXZXZXZXZXZXHXCXCXZXZXZXHXZXZXZXZXZXZXZXVXFXZXHXZXZXZXHXZXCXZXAXZXZXZXZXZXCXFXVXCXZXAXCXCXCXZXZXCXZXZXCXCXZXSXZXCXZXSXFXSXZXZXCXSXZXZXCXSXZXZXZXFXZXZXCXSXCXCXCXSXZXCXSXZXZXZXZXZXZXZXCXZXZXZXZXSXSXZXZXZXCXZXCXCXCXCXCXAXCXFXCXCXCXCXCXCXSXCXZXSXVXSXAXSXDXZXZXZXZXZXZXZXZXZXZXSXCXSXZXZXHXZXZXZXZXCXZXSXDXHXCXAXBXhX` / Q Q [ hXdXdXdXdXzXzXdXdXcXdXdXcXxXdXzX'.dXdXdXzXcXzXdXcXcXdXzXzXdXdXzXdXzX@XdXnXzXhX].[ } / { ].fXZXZXFXZXZXZXZXZXHXCXZXCXVXCXHXCXZXZXZXZXZXVXAXZXZXCXZXZXZXHXZXZXZXZXZXAXCXCXVXZXCXVXZXDXFXVXVXZXCXCXFXCXCXCXCXZXCXZXHXCXSXSXFXZXSXZXZXSXZXZXSXCXZXZXCXVXSXAXAXZXZXZXCXZXZXZXCXCXZXCXZXZXFXZXZXZXZXZXZXZXSXAXAXZXZXCXCXCXCXCXCXCXCXZXCXCXZXCXZXZXSXZXZXCXZXZXSXCXBXCXZXZXZXZXZXZXZXZXSXZXZXAXSXZXCXSXZXHXZXZXZXCXZXZXAXSXBXhX` ) / [ Z.Y.D.S.D.A.H.S.S.A.A.h.g.z.f.f.f.f.f.z.i.i.i.i.f.a.a.i.i.i.i.a.a.a.a.k.k.s.k.e.I ~ ~ ~ { aXfXZXZXCXCXSXZXFXCXCXFXZXZXCXHXVXCXZXHXCXFXCXCXZXCXCXZXCXCXCXCXHXCXZXCXCXVXZXCXZXZXCXCXCXCXFXCXAXCXZXZXCXVXCXVXVXZXZXCXVXCXVXVXCXVXCXFXZXZXZXVXCXZXVXCXVXFXHXZXZXZXFXHXZXCXFXCXCXVXCXVXZXZXCXCXCXAXZXCXCXCXCXVXCXAXAXCXVXCXCXFXZXHXVXZXCXZXZXZXCXZXCXZXZXZXFXHXZXZXZXHXZXZXDXZXZXCXCXZXCXCXFXAXCXCXZXCXZXCXHXZXDXFXZXCXCXCXBXhX[ / ! ! _ Z.P.Y.U.P.P.P.P.L.L.P.U.L.Y.U.L.U.L.K.U.P.T.U.U.T.T.T.P.T.Y.U.T.T.T.U.T.T.T.F.[ S ! / } ].fXZXZXZXZXCXVXCXAXHXZXCXZXZXZXZXCXHXZXVXVXFXZXCXZXCXZXHXVXVXCXVXVXZXVXZXCXZXCXCXZXZXZXCXCXVXZXCXCXFXZXCXCXHXZXHXZXCXCXZXZXCXCXCXCXVXZXCXAXZXCXCXVXCXCXCXCXCXCXCXCXCXCXCXAXCXCXCXCXCXFXCXCXCXCXCXZXCXCXVXCXVXFXCXZXZXZXCXAXAXCXCXCXCXCXAXZXCXVXCXCXHXCXCXSXVXCXVXCXVXZXHXCXFXZXHXVXVXHXCXZXZXZXZXZXZXZXHXZXZXZXZXZXCXZXZXZXCXhXm./ / / _ F.~.~.T.~.~.~./././.^.(.^.`._._._.|.`.|.(.(._.(.(./.(.(.(.(.^.`.{.|.`.@X`.`.|..X|..X.X.X.X.X X|.'..X|..X X|.|.|.|.|.|.`.|.`.|._.{.|.|._.|._.`.`.`.`.",
+"B Z Z Z Z Z C A C Z Z C A Z C F C Z Z C C Z C Z Z C F B Z C Z C C Z C C C Z C Z Z Z Z Z Z G D Z D D D Z F Z Z Z Z Z Z F C Z Z Z F Z C Z C Z Z A C Z Z V G D B G Z C A Z Z Z Z D Z 0 $       o $ $ $ % % * % * = r r r r 0 r r r r r : r r r r r r r r r r r r r r r r r r r r r r r r r r r r * r r r r r r r r y : r r r r r r r r r r r r r r r r r r r r r r 0 0 * % % $ $ $             % c.~.^.^.~.(.^.~.`.^.[.).(.(./.(.!.{./.(././.(.(.(./././././.Y.(.(.~.!./.~.~.^./.~./././.(.(.(.(.(.(.[.)./.(.)./.(.T.(././.~./.~.~.T.~.~.~.~.~.!.~.~.~.~.~./.~./.~.^.~.~.~.~.~.~.~.~.T.T.T.T.T.T.T.T.T.~.~.T.T.T.~.~.K.T.~.~.T.T.~.T.T.(.T.T.~.T.T.~.T.T.T.T.T.~.T.~.~.T.[.~.~.Y.T._ ! ~ / n.fXSXZXAXAXFXVXZXVXCXHXZXZXSXZXZXZXZXZXVXVXFXCXHXZXVXAXZXDXZXZXDXDXZXZXDXDXZXDXFXFXHXZXFXDXZXZXDXZXZXGXFXHXZXZXZXZXZXZXZXFXZXVXAXAXFXAXAXDXAXAXZXAXZXFXVXZXDXHXHXDXDXDXDXDXFXHXAXZXHXFXFXVXZXVXZXZXZXZXZXDXZXZXFXZXFXZXZXDXZXZXAXFXVXFXFXZXZXFXDXDXDXDXDXHXDXZXDXFXFXFXHXDXZXZXZXHXZXZXVXZXAXZXZXZXVXZXZXZXSXGXZXZXZXGXZXDXVXAXAXFXHXpX/ / u | '.dXdX@XzXzXzXzXdXcXdXdX.XxXzXzXdXxXzXzXzXzXdXcXcXzXzXzXdXxXdXxXdXdXzX.X'.].b.] _ m.mXZXZXVXHXFXHXFXZXCXZXZXVXZXZXZXZXZXZXZXCXVXVXFXVXSXAXZXDXZXDXDXDXDXZXZXHXZXFXDXDXZXDXZXZXDXDXZXFXVXFXHXDXDXDXDXDXZXZXZXZXDXDXZXFXVXZXVXAXZXZXZXZXAXFXZXAXFXVXAXAXFXAXZXAXFXVXFXVXHXZXZXZXZXCXHXVXFXFXZXZXZXFXZXFXFXZXDXVXZXDXDXDXDXDXDXDXDXZXZXZXZXZXVXZXZXZXDXZXFXZXZXVXZXZXVXVXVXVXZXZXZXVXZXAXAXAXZXAXZXZXDXDXDXDXZXZXSXFXFXZXBXm./ ) / [ Y.Y.A.H.A.A.A.A.g.g.f.f.f.i.f.i.i.a.d.i.d.d.i.a.a.i.i.a.a.i.a.a.a.a.a.z.T P ~ / / n.fXCXVXCXFXZXDXFXFXZXFXFXDXZXFXZXZXZXZXDXZXZXDXDXZXDXDXDXDXDXZXGXDXDXZXDXDXZXFXZXZXFXZXAXZXGXZXGXAXZXZXZXZXVXFXZXZXZXZXZXZXAXAXGXFXZXFXZXZXFXZXZXZXZXZXZXZXZXZXZXDXDXZXZXZXZXZXZXFXFXFXFXFXZXDXZXDXZXAXDXZXZXZXZXAXZXAXDXDXZXFXVXFXDXCXFXZXZXZXZXFXVXVXZXVXHXZXVXFXZXHXFXHXZXZXFXHXFXZXVXVXFXZXFXSXDXDXZXZXDXDXDXDXDXZXZXFXZXAXFXAXBXm./ / ! _ K.T.U.U.P.P.P.K.P.P.L.L.L.L.L.I.L.Y.P.P.U.U.T.U.T.U.T.P.T.T.T.U.T.T.I.U.F.[ S / ! { hXHXVXCXFXDXZXZXVXVXZXFXFXZXAXAXZXZXSXZXZXZXZXZXZXZXZXGXZXZXFXVXZXFXZXZXAXAXAXAXZXVXZXZXAXAXAXFXZXZXAXAXZXFXFXFXDXZXFXFXZXFXZXZXZXVXZXZXZXFXDXAXAXZXZXFXVXZXFXFXZXGXZXDXGXZXDXZXAXDXDXDXDXDXDXDXZXZXZXZXZXZXZXZXDXZXZXZXZXZXGXFXAXAXZXDXZXDXZXZXFXVXFXFXFXVXFXFXAXAXFXFXZXZXAXZXDXZXZXZXZXZXZXVXVXFXZXZXZXDXAXVXVXVXZXAXVXZXZXZXBXBXQ./ ~ ) ` Z.U.~.~.T.~.~./././.`.(.^.|.(._.`._.^.|.^.(.(.(././.^.(.(.(.^.|._.`.`.`.`.|..X.X'..X|.|..X.X.X.X.X.X X|.|.|. X|.|.|.|.`.`._._.`._.^.{.(.(.(.(.(.(.",
+"D D B D Z C Z B C Z A C Z C Z C Z Z C Z C Z C Z B Z C Z Z Z C C Z Z C Z Z Z Z Z Z Z Z Z Z Z Z Z D Z F Z B C F Z Z Z Z C Z Z F Z C Z F C C D C D Z C D D C G Z C D B Z Z Z Z Z Z Z Z Z y $         o $ $ $ % % % % ; ; ; e y y : e e r r r = : : r r r ; 0 e r ; r r r * r r r r r = r r r = r : r r = r : r r : r r r 0 r t * 0 0 0 ; r y ; r r 0 : r : r ; * % % % $ $ o o         #   y n.^.T.[.~././././.(.(.(.(.(.(.(.(.(.(.^.(.(.(.(.(.(.(.(.(./.(././././.~./././././.(.[.^.^.(.(.(.(.(.^.(.(.(.(.(.(.(.(./././.~././.~.R.^.T.~.!.~.~./.~.~.~.~.~.~.(./.~././.!.~.~.~.~.~.T.T.~.T.~.T.T.~.T.T.T.~.T.T.T.T.T.T.T.~.XXXXT.T.~.T.T.T.(.T.T./.~.T.~.T.~.T.~.T.~.~.T.~.~.T.(.Y ! ! ~ m.fXVXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXHXDXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXDXFXGXFXFXFXFXFXFXFXFXFXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXAXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXZXCXm.' Q Q _ hXzX'.dXdXfXdXdXvXmXcXzXzXxX.XxX.XzX.XzXzXdXdXdXdXxX.XzXzXzXxXxX.XzXzX'.` _ _ m.BXZXFXZXFXFXFXFXFXFXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXDXDXFXZXVXHXFXFXFXFXFXFXVXGXVXGXDXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXFXFXFXFXFXGXVXAXFXFXFXFXFXFXFXFXFXAXAXGXVXZXZXFXFXFXFXFXFXVXGXVXFXFXFXFXFXFXFXFXFXVXVXVXVXDXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXZXDXm./ I _ b.U.A.h.A.A.A.j.z.g.d.a.a.a.i.f.i.i.a.a.i.a.a.a.t.i.a.a.i.i.i.a.a.a.i.z.| S ~ Q m.fXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXFXFXFXFXFXFXFXFXFXAXZXFXFXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXZXAXFXFXFXFXFXFXVXVXVXGXAXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXDXZXZXDXAXFXFXFXFXFXFXFXZXFXFXZXFXFXFXZXFXFXFXZXDXZXDXAXGXZXDXFXFXFXFXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXAXCXQ./ / / | n.Y.L.T.U.Y.H.Y.L.Y.L.U.L.L.U.L.U.P.P.P.U.P.P.P.Y.P.P.T.T.T.U.U.T.L.].) ! ~ ~ m.JXZXGXZXZXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXGXAXAXAXDXAXFXFXFXFXFXFXAXFXVXVXZXZXFXFXFXFXFXFXDXAXAXAXDXDXFXFXFXFXFXSXGXVXVXVXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXZXFXFXFXFXAXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXGXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXHX]._ / / [ P.T.T.T.~.~.~.~.(.(.(.(._._.|. X|._.(.^.`.(.(./././.(.(.(.`.(._._. X_. X|.|..X.X|.@X`._.|.|.'.|. X|. X.X X{. X X_.|.|.|.}.}.}.[.`.(.^.(.(.(.(.`.",
+"Z F Z Z Z Z D C C Z C Z Z A C A C C Z C A C Z A Z C A C C C C Z Z C Z C C Z Z B F Z C Z Z Z Z Z D D D D Z G Z Z C Z Z Z Z C C F Z C C D C C C C Z C C C C C C B Z Z C Z Z Z Z Z Z Z Z Z H u % o     o o o o , $ % % % * = = * y r r r r q : : e r r 0 ; 0 ; ; r r r r r r 0 : r r : r r r : r : r r e r r : y : r r r ; ; ; : = ; e ; r ; ; ; ; > : : * * * $ % $ $ o       #     o u F.T.(.(.~./.^././././.(.(.^.`.(.^./.(.(.(.^.(.(.(.(.(.(.(.(.(.(./././././.~./.~./././././.(.(.(.(.(.(.(.(.(.^.(.(.(.(.^.^./.(./././.~.~.~.~.~.~.~./.~./.[.~./././.~.~.~.~././.^.~.~.~.~.~.~.~.T.~.T.~.~.T.T.T.~.T.~.T.T.T.T.~.T.T.U.XXT.~.T.~.~.T.T.T.~.T.T.~.T.~.T.~.~.T.~.~.T.~.T.~.Y.) ! ~ m.fXFXZXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXZXFXFXFXFXFXAXFXFXZXFXVXFXFXFXFXFXFXFXFXFXFXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXZXZXHXm./ Q ~ [ hXzXdXcXcXcXdXdXdXdXzXzXzX.X.XzX.XxXzXzXdX@XxXdXxXdX.XxX'.vX.XxXdX|.} _ / } fXDXDXVXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXVXDXDXFXDXVXVXFXFXFXFXFXFXVXVXVXVXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXFXFXFXFXFXVXVXAXFXFXFXFXFXFXFXFXFXAXGXVXVXFXZXFXFXFXFXFXFXVXVXFXFXFXFXFXFXFXFXFXFXGXVXGXVXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXGXVXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXZXZXAXFXFXFXFXDXCXQ./ / ) [ S.A.A.A.j.g.a.d.d.a.a.i.i.i.a.i.a.i.a.i.u.a.i.i.a.a.i.i.i.a.a.a.k.i.H / / M.fXZXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXZXFXFXDXFXFXFXFXFXFXFXAXFXFXFXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXFXFXFXFXFXSXGXVXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXDXFXDXDXDXZXAXZXFXFXFXFXFXFXZXFXDXFXFXFXFXFXDXDXFXFXZXZXAXAXDXAXZXAXFXFXFXFXDXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXFXFXFXFXFXZXAXAXBXm.' ~ S ` G.L.L.L.Y.L.L.U.K.L.L.L.L.L.L.U.U.P.P.P.Y.U.P.P.Y.Y.T.Y.Y.U.T.Y.L.Z./ ! ~ } hXFXDXDXZXFXZXZXFXFXFXFXFXFXFXFXFXFXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXSXAXDXAXGXFXFXFXFXFXFXAXVXVXVXZXZXFXFXFXFXFXFXDXDXDXAXDXAXFXFXFXFXFXGXGXVXVXVXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXFXFXFXAXFXFXFXFXFXFXFXFXFXAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXDXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXCXQ._ / _ F.Y.T.~.~.~.~.^.(.(.(._._._.{._.^.|.|.`.^.(./.(./.(.(.(.(.`._._.|._.|.|.|..X.X|.|..X|.'.|.|.|.|..X|. X|. X|. X|._.|.}.|.}.}._.{.(.`.(.(.(.(.(.(.",
+"Z Z C Z Z Z Z C A C Z C C C Z Z C A C Z Z Z Z C C C Z Z B Z A Z C Z B Z C Z C Z Z B Z Z Z Z B D D Z Z Z F Z F Z Z Z Z C B Z C C C Z C C C D C D C C C Z C C C C C Z C C B F Z Z Z Z Z Z Z Z C C * $         o $ $ $ $ $ & % % % * * 0 r 0 : ; ; r 0 0 ; r r 0 r r r : : r * : r r : y : r r : ; r 0 r r r y ; ; r r r r 0 r y y e ; * 0 r ; r * * * % $ $ $ o o               > Y ~.(.K.{.{.T.~././././.(.(.(.(.(.(.(.(.(.(.(.(.(.(.].{.(.(.(.(.(.(.(./././.!.(./.(./.!.(./.(.(.(.(.(.(._.(.[._.(.(.`.(.(.(./.^.^.^././././././././.~./././././.~.~./.(.^./././././.~.^.!.~.~.~.~.!.~.T.~.T.T.~.T.~.T.~.T.T.~.T.~.T.T.T.U.XXT.T.~.~.T.T.~.~.T.~.~.T.T.~.~.T.T.~.~.~.~.[.[.(.F.~ / { hXFXZXZXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXFXAXDXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXFXFXFXFXGXVXGXFXFXFXFXFXFXFXFXFXFXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXFXFXFXFXFXFXFXFXFXSXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXFXFXFXFXHXfX[ / ~ ^ zXdXdXdXnXdXcXcXdXdXzXzX.XxXzX.X.XzXzXdXzXzX@XzXdX.XzX.X.XxXxX.XzX].` _ [ hXFXAXZXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXFXFXFXFXFXFXFXFXFXFXVXVXFXFXFXFXVXGXVXVXFXFXFXFXGXVXVXVXFXFXFXFXFXFXAXAXFXFXFXFXFXFXVXGXFXFXFXFXFXFXFXFXGXVXVXGXFXFXFXFXFXFXFXFXFXFXVXVXFXFXFXFXFXFXFXFXVXVXVXVXFXFXFXFXFXFXFXFXVXVXVXVXFXFXFXFXZXFXFXFXDXHXGXGXFXFXFXFXFXFXFXFXVXVXVXVXGXFXFXFXSXDXDXDXFXFXFXFXFXFXFXFXFXZXFXAXFXFXFXFXDXDXfX{ / H L Z.Z.Z.j.f.a.g.d.i.a.a.a.a.a.i.a.a.a.i.i.a.u.i.i.i.i.i.i.a.a.a.d.a.T / S [ hXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXZXFXFXFXFXFXZXFXVXFXAXDXAXFXAXDXZXFXFXFXFXFXFXAXAXAXFXFXFXFXFXFXFXSXGXGXSXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXFXFXZXFXHXZXFXFXFXFXFXFXFXDXDXFXDXZXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXDXDXZXCXFXFXAXFXFXFXDXDXFXZXAXAXFXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXFXFXFXFXZXVXZXFXfX} ~ ~ S K.K.U.L.L.L.U.L.L.U.L.Y.U.K.K.L.L.L.U.Y.L.U.U.Y.U.L.L.U.U.U.U.U.L.) ~ ! _ hXDXFXFXFXZXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXFXFXFXFXVXGXFXFXFXFXFXFXFXFXFXFXSXSXAXFXFXFXFXFXFXFXAXFXZXVXFXFXFXFXFXFXFXFXDXDXDXGXDXFXFXFXFXFXVXVXVXVXSXSXFXFXFXFXFXFXFXFXFXFXDXHXFXFXFXFXFXFXFXFXSXGXSXGXFXFXFXFXFXFXFXGXFXFXAXDXAXFXFXZXFXFXFXFXVXGXSXGXFXFXFXFXFXFXDXDXAXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXHXDXAXAXBX} / | b.Y.T.T.~.~.~.(.(.].(.(._.|.`.`.|.{.`.(.(.(./././.(.(.(.(.(._._._.|.|.'.|..X|..X|.|. X|._. X|.|. X X|.|. X X X X|. X_.|._._.(.(.(.(.(.(.(.(.(.(.",
+"Z D D C Z Z Z C Z C C C C Z B C C C C C C C C Z C C C C Z Z C C D C Z D Z Z Z Z Z D D B Z Z Z Z Z Z C D Z Z Z Z C Z Z Z D C Z C C C C C C C C C C Z C C C D C D Z A Z Z C D C Z A Z H Z Z C C Z C V u %             o $ o $ $ $ % % % % : : 0 ; ; 0 ; > r ; r r e : r r y = : q : r : * r y * y r r r r r ; : e r 0 r 0 ; r r = ; * * = * % % & $ $ o o             # # o K Z.U.T.(.R.T.T.T.{.[././.(.(.(.).(.(.(._.(.^.(.(.(.(.(.(.(.(.(.(.^.(.(.(.^.(.{.(././.(././.(./.(.(.(.(.`._.(._._._._.`.(.).{.(.(.(.(.(./.(./././././././././././.[././.~./.(.~././.[./././.~.(.(.~.~.(.T.~.~.~.~.~.T.T.~.T.T.~.T.T.~.T.~.[.T.E.U.~.T.T.T.~.~.~.T.~.~.T.T.~.T.T.~.~.T.T.T.~.T.~.[.` ! ^ Q.BXVXHXAXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXVXVXAXDXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXGXFXFXFXFXFXFXFXFXFXFXHXSXAXFXFXFXFXFXFXFXVXVXVXHXFXFXFXFXFXFXFXFXFXFXGXSXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXFXFXFXFXFXFXFXFXFXFXSXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXZXhX/ Q u zX'.dXdXcXdXcXvXdXcXzXzXzXzXxXzX.XzX.XzXdXzX.XzX.XzX.XzXzX.X.XxX.Xn./ ~ m.BXVXZXAXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXVXIXFXFXFXFXFXFXFXFXFXFXVXGXFXFXFXFXVXVXGXGXFXFXFXFXVXVXVXGXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXVXFXFXFXFXFXFXFXFXVXVXVXGXFXFXFXFXFXFXFXFXFXFXVXGXFXFXFXFXFXFXFXFXGXSXGXIXFXFXFXFXFXFXVXGXVXHXGXGXFXFXFXFXFXFXFXFXDXDXDXGXFXFXFXFXFXFXFXFXGXVXHXGXVXFXFXFXDXDXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXCXCXhX/ / S Z.j.j.d.j.g.i.f.i.a.a.a.a.a.a.a.i.i.i.i.i.i.a.a.i.i.i.i.i.i.a.i.i.T / / Q.BXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXZXFXFXFXFXFXAXZXHXFXZXAXGXFXFXDXFXFXFXFXFXFXAXAXGXFXFXFXFXFXFXFXFXGXSXSXSXFXFXFXFXFXFXDXFXFXFXDXFXFXFXFXFXFXFXFXFXDXZXFXZXFXFXFXFXFXFXFXFXFXFXDXGXFXFXFXFXFXFXFXFXFXVXFXVXFXFXFXFXFXFXFXFXDXDXZXCXFXFXFXFXFXFXFXSXFXZXGXZXSXGXSXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXFXDXDXVXAXAXZXhXS ~ ~ n.S.S.U.H.L.L.L.L.L.L.L.L.J.Y.L.L.U.U.L.Y.U.U.L.K.L.U.U.U.U.U.U.L.S ^ ^ m.fXHXZXZXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXVXVXSXVXVXFXFXFXFXFXFXFXVXVXGXGXFXFXFXFXFXFXFXFXFXAXBXSXFXFXFXFXFXFXFXFXDXDXDXGXSXDXFXFXFXFXVXGXVXVXGXGXFXFXFXFXFXFXFXFXDXZXZXHXFXFXFXFXFXFXFXFXVXSXVXGXFXFXFXFXFXFXFXSXFXFXFXAXVXZXFXZXZXFXFXFXVXSXSXGXFXFXFXFXFXFXZXZXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXZXAXDXSXfX_ / [ H.Y.T.~.~.~.~.!.(.(.(.(.(.(.`.`.|.(.^.`.(./.(./././.(.(./._._.|._.|.|.|.|.|._.|.|.|..X@X|.|.|.|.|.|. X|.|.|. X|._.|._._.(.{.(.(.(.(.(.(.`.(.!.",
+"Z Z Z Z Z Z Z V C B C Z Z C C C C C C C C C C C Z C C C C C Z C C Z C C Z C Z D Z Z C Z Z Z Z Z Z C D F C Z Z Z Z C Z A Z C C C C C C C C C Z C C G C C D C C B C C B D C Z C Z Z Z C C Z C D C D Z Z Z A u % o             o o o o $ $ $ % % % % % % : : : : : ; * * ; r : r r : r r : e e = > r ; ; 0 = ; * ; ; % * * % * % % % % $ , $ $ o o o             #   $ u n.Y.T.T.T.(.!.R./._.T./.!./.(./.(.(.(.(.(._.^._.(.`.`.|.(.(.^.`.(.(.(.(.(.(.(.(.(.^.(.^.(.(.(.(.(.(.(.(.^.(.(.`.`.}.}._.}._._._._.(.(.^.(.(.(./.(.(.^././././.(./.^.(././.!././.]././././././././.(./././.~./.~.~.~.~.T.~.~.T.T.~.T.~.~.T.~.~.T.~.~.T.~.~.~.~.~.~.~.~.~.XXT.T.~.~.T.~.T.~.T.T./.T.[.~._ ! S fXHXHXFXZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXKXKXKXKXKXKXKXKXaXeXaXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXsXKXKXKXKXKX7XhXoX7XhXO.oXsXKXKXKXKXKXKXKXKXKXaXKXKXKXKXKXKXKXKXKXKXKXKXaXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXsXKXKXKXKXKXKXKXKXKXKXKXKXKXKXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXVXVXfX} Q Q Q.dXdXdXzXcXxXdXzXzXcXzXzXdXzX.XzX.X.XzX.XzXdXdXdXdX.XzXzXzXdXdXdX[ ! ^ fXHXVXFXFXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXVXo.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.O.o.o.o.o.o.o.o.o.o.o.O.o.O.O.o.o...o.O.o.o.o.o.o.o.o.o.o.o.O.o.o.o.o.o.O.o.o.o.o.O.o.o.o.o.o.o.o.O.O.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.+.o.o.o.o.o.o.o.o.o.o.O.o.o.o.X.o.o.o.o.o.o.o.o.o.o.O.hXZXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXDXZXAXBX' / ! b.j.j.i.j.i.i.i.a.a.a.a.a.a.a.a.a.i.i.i.a.i.i.a.i.i.i.i.i.f.i.i.i.I Q S fXFXHXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXeXeX8.eXqXeXeXeXqXkXeXqXeXeXeXeXKXKXKXpX7XhXoXX.O.' b v :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXeX;XKXKXKXKXKXKXKXKXKXKXKXKXsXc v n sXl v b b eXgXyXuX<XaXeXuX3XaXyXuXKXyXM.eXeXqXeXeXeXqXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXHXFXVXVXFXfX' Q ! F.K.L.L.L.L.L.Y.U.U.K.H.L.U.L.L.L.L.L.Y.U.P.Y.L.L.U.L.L.U.U.U.L.S./ / Q hXCXVXZXFXFXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXKXKXKXaXeXeXsXKXKXKXKXeXsXsXeXeXeXkXKXKXKXKXeXaXKXKXKXeXkXeXKXKXKXeXkXeXeXkXeXeXhXO.oXoXhXO.7XsXlXeXeXeXeXkX8.eXeXKXKXsXKXKXKXKXKXKXKXKXeXgXoXhX7XoX7XoX7XO.aXsXeXeXKXKXKXeXeXkXeXKXeXeXKXKXeXeXkXKXKXKXKXKXaXeXeXeXeXsXeXkXKXKXKXKXKXKXKXKXaXeXFXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXAXAXVXDXZXS _ _ F.K.Y.T.~.~.!.(.^.(.(.^.|.(.|.^.{.{.^.^.(.(././././.(.(.(._._.|._.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|. X|.|.|.|.|.|._._._._._.(.(.(.(./.(.(.(.(./.",
+"Z Z Z C B D Z Z Z C Z C C C C C Z C Z C C C C C C C C C C Z C Z Z C C Z C Z C B B D Z Z C Z Z C C Z Z B Z Z C Z F B C Z Z F A Z Z D C C C C C C C C C F C C F Z C Z C C Z C Z C Z Z Z Z Z Z Z D S D Z Z C Z Z D u % &                 o o o $ $ $ , % $ $ $ & % % % * % % : % % % * : % ; % = : * * % % % % % % % % % , % $ $ $ $ o   o                     * J F.(.T.T.[.T.~.T.K.Y././././././././.(.(.(.(._.(.{._._._.(.(.(.^.`.(._.(.(.^.`.^.|.(.(.(.(.(.(.(.(.(.(.(.(.^.`.^.`.`.`.(._.|.}._._._._.|.`.^.`.(.(.^.(.(.(.^.(.(././.(./.^./././././././././.(.!.(././././.^./././.~././.T.~.~.T.T.~.~.T.~.~.T.~.~.T.T.~.T.~.T.~.~.~.T.T.T.~.T.E.~.T.~.T.~.T.~.T.~.T.~.T.T.~./ ! ~ BXCXCXFXZXHXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyXyX3X4XwXwX1X9.,.4.2X>XtXyX<XyX,X,X,XyXyX,X<XyXyXyXyXtXwXyX,X7X..X.X.O.O.+.<X4X1XyXtXwX1XyXwX>XuX2X<XyX<XyXtXwX3X,X0X0X4.-.5.0XwX3XyXyX,X3XyX0XyX,XyXyX1X1X1XyX1X1X2XyXyX2XwXyX3XyX<XyX,XyXyXyX,X,X,XyXyX,X2XtX,.9.0XtXyXyX<XyXyXyX:XKX8X6X8XFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXFXFXZXVXZXFXZXZX' Q ~ n.hXdXfXzXdXdXdXcXzXzXzXzXdXzX.X.XzX.X.XzXdX.X.X.XdX.XzX.XzX.XdX.X~ ! ~ BXCXVXFXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXVXo.o.o.o.X.o.o.o.o.X.X.o.X.o.o.X.X.o.o.X.X.o.o.X.X.o.o.X.o.o.o.X.X.o.o.6X,X,XyXyX6X .o. .O.+.o.o.X.X.X.o.o.o.o.o.o.o.+.O.O. .O.O.o.o.O.o.o. . ....... .o.o.o.o.o.o.o.o.o.X.o.o.o.o.X.X.o.o.O.o.o.X.X.X.o.o.X.X.o.+.o.X.X.X.o.o.X.X.o.o.X.X.o.o...7XDXDXZXDXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXZXZXZXZXBX' / ! d.e.e.s.a.i.k.f.i.a.a.a.a.a.a.i.a.a.i.i.i.i.a.a.i.a.a.i.a.i.i.a.a.J ! ! BXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX1XwXqX5.5.qXqX0X2XwXwX4X,X,X1X4X2X1XtX5.5.9XqX5.0X4X5.>.,.,.,.>.,.,.>.-.>.>.,.,.,.;.5.2XyX} W | | W W v iXyX-XtXqX5.9X9X5.qX>X1X>X,X,XtX,X1X1X2X1XyX1X;Xb 1X1X1X1X1X1X2X2X2X>X2X4X:Xz p kXn a iXuX*XeXsX0X5XeXsX0X5X;XsX0XtX9X;Xv :.,.>.,.,.>.>.GXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXZXFXHXFXBX' Q ! e.Z.S.K.S.U.S.Y.L.L.L.U.L.U.L.L.L.L.U.P.L.U.P.P.K.R.L.U.L.L.L.U.Z./ Q ' fXFXFXZXGXFXVXZXFXFXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXyX<X1X9.,.,.4.yXyXtX:.<.b 4.,.,.,.4.>X2X<X<.,.:.0X1X5.,.>.:.>X1X0X,.,.,.>.-.,.:.8XO.O.X.X.o.o.0X,.,.-.,.,.,.;.,.:.yXwX,.tX3XyX<XtX0X2X0X>.6X....O. .X.O.O...eX;.,.,.wX4XtX:.,.,.0X2X:.,.0XyX:.>.0X4X1X2X3XqX-.,.,.,.,.>.,.9XuX,X1X1X0XwX5X0X;.,.SXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXZXZXVXDXDXS / I F.F.Y.T.~.~.~.(.!./.(.(.(.`.(.|.`.{.|.(././././././.(.(.^.^.`.|.|.|._.|.|._.|.|.|.|.|.|.|.|.|.|._.}.}.|.|.|.|.}.|._._._.(.(.(.(.{.(.(.(.(.(.^.",
+"Z Z Z F Z V C Z Z C C C C C C A C C B C Z B B C C C C C C Z C Z Z C C C C Z D Z C V Z Z C Z C Z Z Z Z Z Z Z Z Z Z Z Z Z C C C C C C C F C C D C B D C C C Z C C C C A C B Z C C C Z C Z Z D Z Z D C Z D L Z Z D Z H Z A > % o         #           o   o o o $ $ $ $ % $ $ $ & $ $ % $ $ $ $ $ $ $ $ & $ $ $ & $ o o o   o         #                 o q b.T.U.XXT.XXY.~.~.T.T.!.~.~./.T.T./././././.(.(.^.^.(.|.(._.(.|.|._._.|._.(.(._.`.`.(.(.^.(.(.(.(.^.(.(.^.(.^.`.(.`._._._._._._._._.}.|._.|._._.`.`.(.(.^.^.|.(.).{.(.(.(.(.(././.(././.!./.(./.(./.).^.(.(./.(./././././././.T.~.~.~.T.(.R.XXXXT.~.~.~.~.~.~.T.T.~.~.T.~.~.~.~.~.~.XXT.~.~.~.~.~.~.T.~.T.T.~.T.~.T.! S ~ DXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3X<X2XtX0X:.9.1XyXwXtX,X,X,XyXyX,X,X2X1X3XtX,X1X2X,XuX4X5.:.2X2X6X..o.X.O.O.X.8X2X<XyX9.-.qX4.;.2X2XwX,X,X3X1XqX,.yXqX,.,.,.;.>.,.>.5.1XyX,X2XwX:.wX3X,X0XqX0X0X0X0X0X0X3X1X5.>.5.,X,XyX,X,X:XyX,X,X,X,XyX<XyX,X2XwX:.,.0X1X2XtX:X6X8X .....X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXVXFXBX' ! ^ m.'..XdXcXdXcXdXzXcXcXzXcXdXcX.XzX.XzX.XdX.X.XdXdXdXzX.X.XxXzX.XdX~ Q S CXZXFXZXZXFXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXGXo.o.o.X.X.X.X.o.+.X.X.X.X.X.X.X.X.o.o.o.X.o.X.X.X.o.o.+.o.o.X.X.X. .+.yXyX2X2XyX,XyX:X+.o.O.o.o.o.o.O.o.o.O.O.O.O.O.+.+.} 6X+.+.+.O.O.o.o.+.7X6X7X+.6X+.o.O.O.X.X.o.o.X.X.X.X.o.o.X.X.X.X.o.o.X.X.X.X.o.o.X.X.X.X.o.X.X.X.o.X.X.X.o.o.X.X.o.X.X.hXDXDXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXZXZX_ ! ~ e.j.a.d.d.i.a.i.a.a.a.a.a.a.a.a.i.i.i.i.i.a.i.a.a.a.a.a.i.i.i.i.i.! ! ^ ZXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXwX:.,.>.>.>.,.4.4X4.-.0X2X2XwX5.5.9X<.>.>.>.>.>.<.4X5.-.:.,.-.-.-.-.,.>.-.-.-.-.,.,.,.<X1X7X.. .+.+.+.c iX:X-XwX,.>.-.>.>.>.wX2X,X,X,X2X,XqX5.5.6.qXqX;X;XqX5.qXqX5.5.9X>X1XuXqX9X-Xz p -X:Xp *X2X*X0XsX;X5X0XsX-X5X0XsX;X>X:.2.v <.>.-.,.,.-.-.SXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXHXZXDXDX[ Q Q T Z.F.L.U.U.U.L.L.L.L.U.L.L.U.L.Y.U.P.P.P.P.P.K.L.L.L.U.L.L.L.U.F.! ~ ' MXFXHXFXZXZXFXFXFXFXZXVXFXFXFXFXFXFXFXFXFXFXFXFXAXyX3X,XyXwXuXtXyXwX:.,.<.v :XyXtXtXwXtX1X4.>.-.,.:.1X5.>.-.,.0X4X4X1X4.,.>.-.-.-.0X8X..X.X.X.X.8XqX;.-.<.wXsXsX6X6X8X6XqX9.0X1X1XwX:.yX0X,.:Xo.....X.X.o.X.O.eX,.;.-.4.qXyX2X0X,.0XuXtXtXyX5.,.,.9.9XqX,X,X,.-.,.;.:.;.;.>.<.>X1XwX5.,.5.1X:.-.>.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXFXFXZXDX~ / / n.Z.K.T.T.T.~././.(.(.(.(.{.`.(.(.^.`.(./././././.(./.(.(.(.(.{._.|._._.|._.|.|.|.|.|.|..X|.|.}.}._. X|.|._.|.|.}.|._._._._.(.(./.(.(.(.(.^.~.",
+"Z Z Z Z Z Z Z C C C Z C Z C C C C C C C C C C C C C C C C C C C C B Z G C C C C C G D B G C D D B Z Z Z C Z C Z D Z C B Z Z Z Z C Z C G C D C C C C D C D C Z C F Z C F Z C Z C Z C C Z Z C B Z Z Z Z Z Z Z D S D Z Z A Z Z Z D : : $                                   o o   o o   o o   o   $   o   o                             #     o t Z [ ].~.T.T.T.R.U.U.U.~.~.P.!.T.[./.(.Y./.(.~.(.!././.(.(.(.|.(.^._._.(._._.|.{.`.`._._._.(.`.|.(.(._.(.(.(.`.{.(.(.`.^.(.(.(._._._._._._.|._.}._._._._.`.(.(.`.`.|.(.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./.(.^.(.(./.(.(./././././.~.(././.~./.~.~.~.I./.T.~.T.~.E.(.T.R.R.(.~.~.T.T.(.~.~.~.~.~./.T.~.~.T.~.~.T.Y.~./.T.~.T.T.~./ / S FXFXDXDXZXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX,XwX<.,.<.tX3X1XuX8X,X,XtX<X<X,X,X2XwXwX2XtX0XwX2XyX0X<.:.2X,X,X6X .X.X.o...+.tX1XqX>.-.,.,.;.5.4.,.,X1XyX0X4.;.yX0X:.wXwXwXwXtX5.>.wX2X,X,X<XyX2X1XwX,.,.,.,.>.>.>.>.5.5.>.>.>.wX,X<X,X<XyX1X,X,X,X,X2X2X2XwX0X3X2XwX>X>XyX8XO.O.o.X.7XyX:XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXAXFXFXFXFXBX' ! Q m.]. XdXdXnXdXnXcXxXzXzXvXzX.XdXzXzX.XzXdXdX.X.XdX.XzX.X.XzX.XzXdX~ Q ~ ZXFXFXDXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXGXO.+.o.X.X.X.o.o.o.X.X.X.X.X.X.X.X.+.o.o.o.o.X.X.X.o.o.o.o.X.X.X.o.6XyXtX1X1XtX,X2XtXuX8X..o.o.O.o.o.+.} +.7X} 7X} +.yX:Xx g l x b 6X} +.+.<XtX2XtX,XyXtX6X+.{ +.+.X.X.o.o.X.X.o.o.X.X.X.X.o.o.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.o.o.X.X.X.X.X.oXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXZXFXFXZXVXDXZXZXBX{ Q ~ e.e.d.d.d.a.a.a.a.a.a.a.a.a.a.a.i.i.i.a.i.a.a.a.i.i.i.a.a.f.i.d.i.! ! ~ VXFXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX5.,.>.;.:.-.<.4XwX<.,.<.4X4X4.>.;.>.-.-.;.-.-.-.;.5.<.;.,.,.-.-.-.-.-.>.-.-.-.-.-.>.;.;Xp c f W o. .c O s O -X0X>.-.-.-.-.>.wX2X,X,X,X1XwX,.-.;.,.,.,.b b ,.>.>.>.>.>.>.0X6X<X<.,.2.d z >Xj k + p =X*Xg v 5X*Xp v 5X*Xk v 1X:.4.-X1.>.-.,.,.-.-.GXSXGXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXAXFXHXDXDXHXZX| ! c e.n.F.U.Y.A.P.K.R.L.L.L.Y.L.L.L.K.L.K.P.P.P.P.L.L.U.L.L.L.Y.L.L.Z./ / ' MXGXFXZXFXZXZXFXFXFXGXZXFXFXFXFXFXFXFXFXFXFXFXFXAXyX2X2X1X1X2X,X4X5.,.:.4.v :XqXwX1X<X2X4X5.,.;.;.<.1X5.>.-.-.,.5.qX0X9.,.,.;.;.-.:.0X6X . .X.X. .6X9X:.wX6X .X.O... .O.8X9X,.5.0X<XyX1X:X-.eXO. .O.X.X.o.o.o.:X,.,.:.,.,.wX1XtX:.0XuX1XyXtX<.,.:.,.,.>.4.5.;.-.,.9.tX,XwX;.>.qX4X:.,.,.5.1X:.,.4.FXFXFXFXFXFXVXGXAXFXFXFXFXFXFXFXFXFXFXDXFXFXVXDXDXS I I b.F.U.Y.~.~.~.!.(./.(.(.(.(.`.^.|.(.^.(.(./././././.(./.(.`.^.[.(.`._.}.}.|.|._._.|.|.|.|.|.|.}. X|.|.[. X_.|. X}._._._._.`.(.{.^.(./.(.(.^.{.",
+"Z Z B D Z C C C C C B C C C C B C C C C C C C u N C C C C C C C B C Z C B C D D C C C Z Z C D Z Z Z Z Z Z Z C Z Z Z Z C C Z C C D C D B C D C D C B C C G F C C Z C C C C Z Z C Z C Z C C C Z B D C Z Z Z Z Z Z Z Z G Z Z D D D D D D D Z u 0 * o o         # #                           #                                   - * A Y b.Y.Y.L.I.Y.U.I.T.T.T.T.~.T.~.~.~.~.T./.~.~.~.~./././.!./././.(.(._.(.|._.|._.|._.|.|.|._._.|.|._.|.[._._.(.^.^.^.|.^.^.^.(.(.(.(.|._._.`._.|._.|.|.|.|. X_.|._.|.{.^.`.`.^.^.(.`.(.(.`.^.(.(.(.(.(.(./.(.!./.(.(.(.(.(.(./.(.(./.(././.(././././.~.~.~.~.T.T.T.[.T.~.T.T.~.~.!./.~.~.~.~.~.~.!.~.~.~.~.~.~.R.!.~.~.~.T.~.~.~.T.~.T.~.~ ~ ~ ZXVXZXFXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX1X4.,.>.4.4X6X+.8X .<XyXyX,X,X,X,X1X4.<.4X5.,.<.1X5.,.;.<.1X1X,X2X6X.. .X. .+.<X,X9.>.>.:.wX5.,.0X5.5.wX4.,.;.wXtX,XtX2X2X2X2X4X0X>.tX1X1X<X,XwXyX<X1XtXwXqX:.>.;.;.-.-.,.5.wXtX<X,X,X,X2XwX0X2X1X,X,X0X0XqX>.,.0X1X<X3X6X6Xo.6X3X3X:X2X,XtXyXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXBX[ / ! M.m.hXhXbXcXdXdXnXnXcXzXzXxXzXzXzX@XdX.XdX.X.XdX.XdXdXdX.X.XdXdX.X~ ~ ~ ZXZXZXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.O...6X2X1XwX4.5.2X,X,X2X2X<X+.+.6X7X+.} g z v x v z l v g z + z h @ z v z v z z v l x l v v k p k l l n +.7X+.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...hXFXFXFXFXFXFXFXFXZXFXDXFXFXFXFXFXFXFXFXFXAXZXAXBX' / ! e.e.i.i.f.a.i.a.a.a.a.i.a.a.a.a.i.i.i.i.i.u.a.a.a.a.a.a.u.a.i.a.s.~ S ! ZXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDX3X<.<.,X1X<.:.5.:.<.1X4.5.5.4.2X4X4.-.-.-.-.-.-.-.-.-.-.>.-.-.-.-.-.-.-.-.-.-.-.-.,.<.v l n v < +...[ z 2.-X:X:X>.-.-.-.,.:.wX4X2X,X2X2X4.-.;.;.-.-.>.2.b >.;.:.;.-.-.-.0X+.6X:Xj :Xl -XtX,.2.sXl k k *X=X5X9X9X9X9X9X9X9X5.-.4.v :.-.-.-.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXAXAXBX' Q ! _ b.Z.K.L.I.L.L.K.L.U.U.L.L.L.U.L.L.U.U.L.U.U.U.L.L.P.L.L.L.L.L.F.Q ! ' BXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDX,XwXwX2XwXwX2X,X,XwXtX<Xv 4.,.,.wX<X,X,X2X<X4.<.tX1XqX,.-.-.-.>.>.>.wX<XwXwX,X5.,.;.9X7XX.X.X.X.X.6X8X7X.. .X.o.o.o.X.X.8XwX>.-.5.4X1X0X,.eX .o.o.X.X.X. ...6X;X8X6X8X6X8X6X8X3X6X6X8X8X6X8X6X;X8XwX;.,.,.;.,.:.0X1XwX5.;.>.<.qX;.-.>.5.4X<.:.qXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXFXFXVXZX~ ~ _ e.n.D.Y.T.~.(.~.(./.(.(.(.(.(.|.^.(.(.(.E./.!./.(./.(.(.(.(.(.(.(.(.{.(.`.`._.|.}.}.}. X}.}. X|.|.}.|._._.|._.}.|.|.|.[._.(._.(.(.(.(.^./.[./.",
+"F Z Z Z Z C C Z Z C Z C C C C C N u C C C C C C C C C C C Z C Z D C Z C Z C C C D C C B C Z Z C C Z B Z Z C Z Z B D Z C C Z C Z C C C C C C C C G C C D C C C Z C B G C C Z C C C Z Z Z Z Z Z Z Z Z Z Z Z F Z Z D D Z D D D D Z D D D D H D Z S D L Z A u y 0 * & $ o o           #     #   #       #   o $ - : C S H ` b.Y.L.Y.Y.].U.J.Y.T.Y.T.Y.U.T.T.U.T.T.Y.T.T.~.T.~.~.T././.~./.~././.(./.(.(.(.(.(.(._.(.|.|.{._._._.|.|.|.|.|.{.|.(._.{.(.|.{.`.(.(.^.`.|.{.(.`.{._._._.|._._.|._.|.|.|.|.|.|.|.|._.(.`.`.(.`.^.(.(.^.^.(.(.(.(.(.(.(.(.(.(.].(.(.(.(.(.(.(./.(.(.^./././././.T.~.~.~.~.(.T.~.T.~.(.~.[.~.~.~.~.~.~.~.!.~.~.~.~.~.~.~./.!.~.~.~.~.~.~.~.~.T.T.~.~.~.~ ~ ^ ZXFXDXZXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX1X<.,.<.,X>X7X.. . .+.3X,X2XtX2X2X4X4.>.wX1X4.1.2X2X4.>.;.qXwX2X2X6X . . .X.X.3X9X-.;.wX,X1X2XtX1X4X5.,.,.:.wX1X<X,X2X<X,X,X,X1X0X,.5.0XwX,XwX:.tX2X0XwX1X1XwXwXwXwXqX;.>.wX4X2X,X,X,X1XqX,.,.4.wXtX<X:.,.,.-.,.0X1X8XX.o.6X<X,X,XyXyX,X,X2X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXHXCX' ! ! [ ].'.'.zXcXcXxXnXdXzXcXzXzXzXzXdXdXdX.XdX.X.X.XdX.X.X.X.XzX.XdX'.~ ~ S ZXVXZXFXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o...+.>X>XwX<.>.>.wX2X;Xl d z v l g z z h v g k a 4 2 s O g n o 6XpXw @ k s g k k p v g k + 2 2 2 2 g O z -X>X2X6X..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.X.X.X.X.X.X.X. ...O.FXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXDXDXZXBX[ / ! b.e.d.i.i.a.i.a.a.a.a.a.a.a.a.a.i.i.u.i.s.a.a.s.i.a.a.a.z.a.a.a.a.~ / ~ CXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAX1X9.;.qXqX<.;.>.-.:.5.<.,.>.;.5.0X<.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.;.:.1.wX4X-Xw x d < =.| ..} j k -X0X>.-.-.-.,.0X4X>X>X2X4XwX;.,.2.2.;.-.>.b b ,.0X7XeX-.-.-.9.8X6X0X4.:Xx l b 1.j n a @ 5 n j -X:.,.,.>.>.>.>.-.>.2.v <.>.-.-.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXAXFXMX} ! ! T b.F.K.L.L.I.L.U.L.L.L.U.L.L.U.K.U.U.U.U.L.L.L.L.L.P.U.L.L.L.L.Z.! ! _ BXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFX3X9.<.4X4.9.2X,X<X1X2X1Xn 2.,.,.4.2X,X,X,X,X,X,X1X,X1X5.>.;.,.-.-.;.0X1X1X2X2X1X<X5.:.8XO.X.X.X.X. ... .X.O.7XO.+.O.o...O.6X0X-.-.5.4XwX,.eX..X. .X.X.X.o. ..... . .O. . . . . . . . . . . . ... .7X8X8X6XeXtXtX,X,X;.>.;.;.>.-.-.-.>.5.1X,XwX,XZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXFXAXAXZX~ ~ / b.n.F.Y.T.~.!.~.!.!.(.(.(.(.`.(.(.(.(.^.[././././././.(.(.(.(.|.^.|.|.|.`.(.`.|.|.}.}.}.}.}.}.|.|.}.}.|.|._.|.}.}._._._._.(._.(.(.[.(.(.(.(./.",
+"Z Z B D Z Z C C C C Z C A C B C C C C C B C C C C C C C C C C Z C F C C D C C C B D C D C C B D Z Z Z Z Z Z A Z Z C Z C Z C C Z D C G C D C C Z C C Z C C F C Z C Z B Z C Z Z C C Z C Z Z F Z C Z Z B D Z Z Z Z D Z D Z D D Z G D D D Z Z L L K G D Z L L J H Z H Z C ) L L L L S H L L L L / H L _ b.Y.R.R.T.T.I.I.U.T.K.Y.[.P.XXT.P.P.T.T.P.P.U.U.T.T.T.T.T.T.T./.T.T.~.~./.~.~./.~./.!./.!./.^.(.(.(._.(.{._.(.|.|.|._._.`.|.|._.|._._._.|.|._._.`.(.}.^.{.}._.{.|.`._.|.|.|._.|.|.|.|.|.|.|.|.|.|.|._._._.|.(.`.(.`.^._.(.^.(.(.(.(.(._.(.(.(.(.(.(.(.(.(.(.(.(.(.^.(./.(./././././.~.^.~.~.~.~.~.~.~.~.~.~.~.~.^./.^.~.~.~./././.!./.~./.~.T./.~.~.~.T.~.R.T.~.~.T.T.[.~ ~ S ZXVXZXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3X4.<.,X2XtX6X..X. ...7X>X,X,XwXwX1X5.,.:.wX2XtX,X2X2XwX4.>.:.,X>X7X .X.X.X. .+.>XtX4.0X2X2X,XyX<X8X6XeX:XwX,X<X,X,X,X,X,X,X2X1X5.0X5.,.>.wX1X,X1X5.>.>.wX1X2X2X2X1X4XqX>.5.2X,X,X,X1XqX5.0X-.>.,.wX2XtXwX0X:.5.5X8X .6X3X,X2X,X,X2X2X2XtX,XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX[ ! c [ m.].hXzXcXxXxXdXdXcXxXxXxXdXnXdXdX@XdXzX.XdX.X.XdX.X.X.X'..X'.`.~ ~ ^ ZXVXFXZXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .6X2X4X,X<.>.-.-.wX1X;X@ j k O x l o l s s 9.5.p z sX-Xs =X7Xo > @.- p 4.5.s 2.5.p v k 5.4 =.=.1 pX-Xk ;Xv tX3X1X7X..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X.o.hXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXZXAXAXAXBX} ! S T w.f.a.i.a.a.a.a.a.a.a.a.i.i.i.i.i.i.i.i.i.a.i.i.a.i.a.a.a.a.a.a.! ! S ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAX1X9.>.>.-.-.-.-.-.-.>.-.;.;.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.>.;.wX:Xv b -Xn w 5 @ 5 7 x ! v v v b 0X;.-.-.-.,.;Xn x b b v 8.-.;.=.j ,.-.-.8.b >.4.8.5.-.-.-.>.4.5.-.,.9.b z -XuX*XO s   z v eXh 9.;.,.-.-.-.-.-.;.4.-X1.;.-.-.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXAXAXHX[ ! S ) b.Z.H.U.L.I.L.L.L.U.L.L.K.L.U.U.U.U.L.U.U.L.U.L.K.L.L.S.L.L.L.Z.! / _ BXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXZXyX9.,.wX2X,X,X,X2X,X,X2Xv <XwXwX,X2X,X,X,X,X2X,X,X,X,X,XtX<X2X4.>.>.<.2X,X1X2X>X2X1X5.5.6X..o.X.X.X. .+.3Xb 7 7 2.4 8.O.O.O.8X9X>.-.5.4.>.wXO. .X.X.X.X.X.X.X... .X.X.X.X.X.X. . .X.X. . .X.X.O. . . ... . .+.8X<X9X>.5.<XtXwX;.-.-.,.qX1X,X2X,XAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXZXZXVXFX~ ) / T b.H.Y.T.~.~.(.!./.(.(.(.(.(.(.(.(.^.~./././.!././.(.(.(.(.(.^.(.`.(._.^.`._.}.}.}.}.}.}.}.}._.|.|.}.|._._._.}.}.}._.`.(.`._.(.(.(.(.[.(.(./.",
+"D B Z C C C F D C C C C C C B C C C A C C C C Z C C C C C C C C B C C C C B F D C C C C Z C C Z C Z Z Z C Z Z C C C Z Z C B Z C C D C C V D C Z C C Z C C C C C C D C F C Z C Z Z C Z A C Z Z Z Z C Z Z Z Z Z Z Z D Z D Z D Z B D D D D H Z Z Z D Z H H Z H H H P L S H Z H L I Z J L L L L H D L H b.!.U.R.T.U.T.I.I.T.P.P.P.P.U.T.T.T.P.T.T.U.T.U.T.T.T.T.T.T.T.T./.~.~./.~./.~.~./.~././.(././.(.(.(.(.^._.^._.(.{._.|.|.|.`. X_.|._.|.|.|._.|._.`.`._._._.}.`.|.(.`.{._.|.|.'.|.|.|.'.|.'. X'.|.|.|.|._.|.{.`.`.(.`._.|._.{.(.(.^.`.(.(._.(.(.(.(.(.(.{.(.(.(.(.(.`./.(.(.(././.~./.~.^.~.~.~.~.~.~././.~./.~.~.~.~./.~.~.^./././.(.~./.~././.(.~.~.~.~.!.~./.~.~.~.~.!.~ ~ Q ZXVXZXZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3X,XtX2X2X2X+.O. . . .+.8X3X4X5.<.1X2X9.>.<.1X2X,X,X2X1X1X4.<.,XuX8X .X.X.X.X.o.KX4X5.,.<X2X2X:X6X.. .o.o.O.8X2X,X,X,X,X,X,X,X4.,.wX4XqX>.5.wX0X5.>.>.>.5.wX,X<X,X2X2XwX;.>.wX2X,X2XqX>.5.qX-.>.5.1X,X,X1X1XwX4X6X..6XtX>X,XwXyX<XwX2X>X2X,XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBX} / ^ [ m.].zXxXcXxXcXnXJXxXxXxXzXxXdXdXnXzXzXzX.X.X.X.X.X.X.X.X.X X_.`./ ! Q ZXVXFXZXFXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.O.7X<XtX4.:.>.-.-.>.tX1Xb h 9.0Xd sX6X- +.v g k *Xa 4 q.8.# =X6X  2 2 < d j k k g k p v k k h 2 2 2 8.8.3 :Xl n > f > W .. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.oXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZX[ ! ^ e.e.i.a.i.a.d.a.a.a.a.i.a.i.i.i.i.i.u.i.i.a.i.a.i.i.i.i.i.a.a.a.a.! ! ^ ZXFXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXyX9.>.-.-.-.;.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.:.wXk g p - 7 2 j j w 7 S } +.w 2 5 :X9X>.-.-.:.b @ 1 + k b b -.-.<.9.-.-.;.2.b ,.,.,.-.-.-.-.;.,.>.2.j ,.2.l a b l z g h g @ 5 @ b b tX<.;.;.>.:.:.8.v :.>.>.-.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXAXAXBX' ! ! ) b.F.K.U.L.L.I.U.L.L.L.L.U.L.Y.U.U.U.U.K.U.L.L.L.R.L.L.L.L.L.L.F.! ! } fXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXGX3X4.>.4.1X2X,X2X2XtXwX:Xl :XuX2X,X,X,X,X,X,X,X,X,X,X,X,XtX0X0X9.>.:.wX1XtXqXwX1X1X2X1X5.0X8XO.X.X.O.7XyXwXj 5 7 7 7 j n O...O.0X,.-.-.-.-.5.8XX.o.X.X.X.X.X.o.o.o.X.X.X.X.X.X.X. .X.X. . .o.o. .O.X.X.X.X.o...+.2X<.,.5.4X2X1X<.,.4.<X,X,X,X2X2XZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXDXZXAXZX~ ~ ' e.b.U.T.T.T.(.!.(.(.(.(.(.(.(.(.(.(./.^.^.~.!./././././.(.(.(.`.(.(.(._._.(._.}.}.}.}.}.}.|._.|.|.}.|.}.}._._._._.^.|._.`.(.(.(.(.(.(.(././.(.",
+"Z G C Z Z B C C C C C C C C B C N C m C C C A C u B C C C C B C C C A C C D C C C C C F Z Z C Z Z C Z C D B C Z Z C Z C C C Z C C C B C C D C B C C C C C C C G C C C B D B C Z Z C B D Z A Z Z B D Z Z Z Z Z C Z D Z Z D D D Z D D D D D L G H D H H H H G L L L G L G Z Z H Z U H H H P L H L P H e.Y.T.T.T.T.T.!.L.T.T.T.P.P.T.T.T.T.U.T.T.T.U.T.T.T.T.T.T.T.~.T.T.T./.~.~./.^.~.^.^./././.(.(.(.(._.(._.(.|.(._._.|.|.|.|.|.|.|.|.|._.|.|._.{.|.}.|.}.}.}.}._.|.{._._.|.|.|..X|..X|.|.|. X|.|. X|.|.|._._._._._._.}._._._._.(.|.^.|.^.(.(.(.(.^.(.(.(.^.(.(.^.^.`.(.(.(.(.^./.(.!./././.E.[.(.~.!.^./.~./.~.~.~././.(.(.~.~././.(.!././././.(.~./.T./.R.~.~././.~.~.~.~./ ~ S ZXAXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyX3XyX2X>X6X..X.o.X.X.X. .+.3XtXtX1X4X5.>.<.1X1X,X,X,X,X2XtXtX2X,X2X6X . .X.X.X.+.1XqX:.2XyX7X . .X.X.X.X... .6X<X2X2X,X,X2XwX>.:.tX,X1X5.,.,.,.>.0XtX5.>.>.wX2X,X,X,X1XqX,.0X1X1X5.>.;.>.>.-.>.wX2X,X,X,X>XtX8XX.6X>X,X,XtX>.qX1X:.4.2X,X,X,XFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXHXBX' / Q c.].dXdXxXxXdXxXxXxXnXdXvXcXcXdXnXzXzXzXdXzXdX@X.X.X.X.X'.|.|.|.(.~ ! ^ ZXVXFXZXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXGXO.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...+.2X4X5.,.;.-.>.:.4.tX2Xb d j *Xo @.@.  @.> 4 2 j ;X4 2 2 2 < a z w z x z d v l v v l x l v x z z z a g :X:X:Xf & sXz f 7X .X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.7XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXBX' / S T e.i.i.i.f.i.i.i.a.a.a.i.i.a.i.i.i.i.a.u.a.i.i.a.u.i.a.a.a.a.a.a.~ ~ S CXDXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXeX:.-.:.-.<.1X9.>.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.<.2Xk 9.wXd 2 =.j 7 7 2 ' O.O.w 2 7 :XwX:.:.wXuX-X7 8.p -X;Xb 1.>.-.-.-.-.,.b b ,.=.2.;.>.;.qX8X6X0X<.4.:.8.d v 0Xk g k g h z g *X+ x k ,X<.,.2.k k k v 9.;.,.-.-.-.-.FXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXAXFXBX[ ! Q I e.F.F.U.U.L.L.L.L.L.L.L.L.L.U.L.U.U.I.L.L.U.L.L.L.L.U.L.L.G.L.Z.! Q ' BXGXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXyX1XyX1X1X2X2XwXwX4X5.9.b >XyX2X1X1X1X2X1X,X2X,X2X,X,X4X5.,.,.wX4.:.,X<X9.,.;.5.wX,X1X5.;.5.0X0X0X8.0X4.,.b g p p d < x O.O.X.eX:.0X2XtX9X,.5.8X . . .X.X.X.X.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .6XwX<.qX1X0XtXwX<.qX1X2X2X1XwX<XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXFXAXZXDXS ) ' T n.G.U.T.T.T./.!.(.(.(.(.(.(.(.(./.(.~.(.~.~.!.!./.(./.^.(.(.(.{.(.(._.(._._.[.(.|._._.|.}._.|.|.|._._.|._._.(.|.^.|._.`.^.(.^.^.(.(.(.(.(.(.",
+"C B C Z Z Z Z C C C F Z Z C C B A C A C A C N C B B C C C A N u C C C C C C B F C C C C C C C C Z C A Z Z Z Z C Z Z Z C Z C C C D C Z C C C Z C C C D C D C C C Z C Z Z Z Z Z Z Z Z Z Z Z Z Z C Z Z C Z Z C Z Z Z C Z Z D Z C Z D D Z Z Z D D Z H D S Z P H L I L Z L S L L L H H H P P L P P P J J ` (.U.T.T.T.T.T.T.~.Y.U.!.!.U.L.I.U.T.T.U.T.T.T.T.T.T.T.T.T.T.T.~.~.~.~./.~./.~.~.^./././.(.(.(.(.(.(.(._.^._.{.|.|._._.|.|.|.|._.|.|.|.|.|._.|.}.}.}.}.}.}.|._.|.|.`.|.|. X|..X X|. X X.X X.X'..X|.'. X|.|.|._.|._.}._._._.^.|.`.(.`.(.^.`.(.(.|.(.`.^.^.`.`.^.^.^.(.(.(.(.(./././././././.~.~.~.~.~././.~.^.~./././.~.~.(./././././././.!.~.~./.].!./.~.~./.~.~.~.~.~.~ Q ! ZXAXFXDXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyX,X<X2XtX7X..X. .X.X.X.X.o.+.<X1XtX0X<.>.;.0XwX2X,X,X,X<X,X2X,X,X<X6X . .X.X.X.X.:XuXtX2X6X.. .X.X.X.X.X.X.X. .X.8X>X,X,X,X,XwXwX,X,X2XwX;.0XwXtX2X1XwX>.;.wX2X2X,X,X1XwX:.wX1XwX;.qXwXwX0X-.5.1X1X2X,XtX5X6X .6XuX<X,X,XtX:.qX1X0X>.4.,X,XyXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXBX[ Q n c.m.].hXxXxXxXxXxXxXzXvXcXdXcXdXzXzXdXxXdX'.'..X.X.X X.X|.|.|.|.^./ Q ^ ZXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXVXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...6X3XwX5.9.;.,.:.4.tX2X2X;Xx d - d @ + a d k v z h p z l + w s p z h p p s =X=X>Xk h a a g a a p p - z a w { wX{ > n n l > v 6X .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...hXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXZXZXHX' / S b.w.e.u.i.i.i.a.i.a.i.a.i.i.i.i.i.u.u.i.u.u.a.u.i.i.i.i.i.a.a.a.a.! ! ^ HXZXVXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.,.<.1X<.:.9X4.,X9.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.;.-.-.;.<.wX2X1Xk 5.k d z 7 v 7 l 2 7 [ O.q.=.4 v ;Xb b b b v 5 kX8.*X:Xv b 8.<.:.-.-.,.2.b >.4.4.;.:.0X6X....8X;.-.5.:Xd v ,.j iXuXk 5 sXl p n 8.4 :X:XwX*X2.5.k @ k k k :.-.-.-.FXFXFXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXFXVXBX{ ! ! ) b.n.F.U.L.L.U.I.L.Y.I.L.U.U.U.U.U.U.L.U.Y.L.L.U.U.L.U.L.L.L.L.Z.! ! _ BXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXyX0X0X0X0XwX4X9.<.1X<X:Xv :XyX2XwX0X0X0X0XwX1XtXwX4XyXwX<.>.:.1X5.:.4X9X>.-.-.>.:.,X1X0X,.,.-.,.,.,.>.;.,.b -X2.*Xd 2 x O.X.O.:XtX1X2X2X5.,.>.5.8Xo. .X.o.X.X.o.o.X.X. . . .X.X.X.X.X.X. .X.X.X.o.X.X.X.X.X.X.X...+.1X,X,X<.qX4X2X,X,X,XwXqX,.<.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXFXFXAXZX~ ~ / ` b.Z.U.T.T.~.!.~.(./.(.(.`.(.(./././.~.^.~.~././././.^././.(.^.|.(.E.(.(._._.|._._.^.|.(.}.{.`.`.|._._.|.|.{.|.(.`./.^.^.(.`.`.^.(.(.(.(.(.(.",
+"C C C C B C C C C B C C C C u B A C C A C C C C Z Z B C C A B C C C B B V V u B C C C C C D C Z Z A C Z A C Z Z C Z Z Z C C C Z V Z C C C C C C Z C C D C C Z C Z C Z C C Z C Z Z D Z Z C Z B Z Z Z Z D Z Z Z D Z C Z Z Z Z G Z D D Z Z D D L L F H J P J H H Z L P L L P L L P H H P H U L L L L P e.~.T.[.~.T.U.U.U.L.U.P.P.P.U.U.Y.T.U.T.U.T.T.T.T.T.T.T.T.T.T.T.T.~.~.~.~./.~.~.[.E.^.(././.(.(.(._.`._.{._._._._.|.|._.|.|.`.|.`.|.|.|.|.`._._.|._.}.|.}.}._._.|._.|.|.'.|..X X.X X|. X|..X.X|..X|. X|.|.{. X`._._.}.}.|._.|.|.{.|.|.|./.`.`.(.^.`.|.(.`.^.(.`.(.`.^.(.!.(././.!.(./././.T.(.~.~.~.~.~././.!././././.(.(.(./././.(././././.).(.~././././.~.~.[././.^.~.~ ^ ^ ZXVXFXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXwXtX1X3X2X2XtX7X .o. .X.X.X.X.X.7X1X5.>.-.-.>.>.<.2X,X,X,X,X2X,X,X,X,X6X.. .X.X.X. . .8X<X7X..X.X.X.X.X. .X.X.X.X.X. .8X>X,X,X,X2X2X,X,X,X,XtX3X2XwX,X,X3XwXwX2X,X,X,X,X,X,XwX,X,X2X<X1X1X2X1X0X5.wX0XwX<XtX<XX.7XtX,X,X,X,X,XtX<X2X,X:.,.qX1X,XFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXBX[ ! Q { Q.].dXxXxXxXxXxXxXcXcXcXvXcXcXcXzXdXdXdXdXdX.X.X'. X|.|..X_.|.!./ ! ^ ZXVXFXFXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXGX+.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...+.2XwX1.>.tX0X4.;Xv z b b l + v z O v z p l z l z 5 j 3 p f | -X+ z @ v o O =X5X:Xs @ v - O z h g k p z h t | iX' > W n f @.v <X7X+.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. . .....7XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXBX' ~ ~ [ w.i.i.a.i.i.i.a.i.a.i.k.i.i.i.i.i.u.u.i.i.u.s.i.s.i.i.i.a.a.a.a.! ! S ZXZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX5.,.:.qX<.>.>.;.qX<.-.-.;.:.;.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.:.>X5.:.wX3X>X1X;Xz a v l l a g v z 7 =.S O.w =.7 - - s O d o g + O # O g - + v b 8.:.:.:.b x ,.-.>.4.b 4X+. . .7XwX;.0X<Xd *X,.7 wXtXg - n d O 8.q.g >X>X2X:Xj qXk d 2.5.-X<.-.-.-.FXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXFXBX' / ! Y b.Z.U.U.L.Y.U.I.I.L.U.L.Y.U.L.L.L.T.U.L.L.I.L.L.L.H.D.L.L.L.L.F.! / _ BXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAX9.,.>.>.,.1.0X:.<.1X2X2Xx :X1X1X5.,.>.>.>.:.0X<.;.0X<.,.-.-.<.4X5.:.0X1X4.>.-.,.1.>XyX,X>XsX;X6XsX<X:X5.<.b v k k g 6 8.O.O.O.3X2XyX1XwX:.,.,.;.tX8XO. .O.o.+.O.O.o.O.O...+.X... .o. .o.o.+.X.O.o.X.X.o... . . .X...6X,X1X<X,XwX<X,X2X2X;.9.wX;.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXZXZXVXZX~ ~ _ [ n.T.U.T.T.~.~.^./././.(.(.^.(.(.(.(.~.(.~.~./.~././././.(.^.(.^.(.(.(.(.^.|._.^.`._._.|.|._.|._.|._._._._._.^.|.^.|.`.^.^.(.`.^.^.{.(.(.(.(.",
+"Z C C Z C C Z C F C C C C C B C N A C N C C A C B B Z B C C B Z B C C C C C B B C B C C B C C C B Z Z Z C Z C C Z C C C Z C C C C C C C C F D C C C C C D Z C C C D B C Z C Z C Z B Z C Z Z D Z C Z B F Z C Z B Z Z D B Z Z Z C Z Z Z Z Z Z Z Z D D F Z Z Z H L Z J Z J Z P L H H K S L H S P L J U [ T.U.T.T.T.T.T.U.I.T.U.U.U.T.U.T.T.U.P.Y.T.U.T.T.T.T.T.T.T.~.T.T.T.~.~.~.~./././.^./././.(./.^.`.^.^.)._.|.`.{._.|._._.`.`.|.`.|.|.|.|.|.|.|.|.|.|.}.}.}.}._.|.|.|.'. X.X.X|..X.X|..X.X.X.X|..X X.X X|.|.|.'. X|.|.}.}._._.`._.^.`._.(.(.(._.(.^.`._.`.(.`.`.`.(.`.(.!.^.(./.^././././././.[.[.~.~.~.~.~.~.!.~././././.(.~./.(.(.(.(.(.(./.~.~.(.R././././.~.~./././.(.~ ~ ^ ZXVXFXZXAXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX5.:.0XtX2X,X,X,X<XyX+. .X.X.X.o.+.tX,X4.>.<.wX9.:.,X,X,X2XtXwX2X,X,X2X8X ...X.X.X. . . . . .X.X.X.X.X. .X.X. .X.X.X. . .<XtX,X,X,X,X,X,X,X,X2X1XwX:.wX2X2X1X2X,X,X,X,X,X,X,X2X1X1X2XwX0X1X2X1X4XqX,.>.>.wX2X<XX.8X>X,X1X,X,X,X2X,X,XtX;.>.qX1X3XVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXHXDX] Q ^ c.].'.JXxXxXdXJXxXxXdXcXcXnXdXnXdXcXxXdXdXdXdX.X.X.X.X|.`.(.{.(.].S Q ^ AXAXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXo.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.o.o.6X2X4X5.>.;.tX4X4Xb @ z k k v v 8.8.p -Xx d p v $ @ < 8.=.@ - @.> p k a :X} d s =X=X=X@ :X} a k z 4.5.k z p u @.@.@.x v - d d d k z f f o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.....fXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXHXHX[ ~ Q T T w.i.i.d.d.i.k.a.i.i.i.i.i.i.i.i.i.s.u.u.a.t.i.u.i.i.i.i.a.a.i.~ ~ ! ZXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX1X<.-.:.<X4.;.;.>.-.-.<.:XwX>X4.-.-.-.-.-.-.-.-.-.-.-.-.-.-.;.9X9.:X1X-Xv v z + + + v x g 9.*Xz 7 =.G O.7 =.4 f | -Xs 8X@.- w l :X+ n :Xp + - v b b :X-Xb :.:.-.1.5.0X8X+. . .8X,.9X:Xz k :.=.s v @ z a p p + O z -Xb b v a a w a j 0Xk :.-.-.-.FXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXSXGXDXFXFXAXBX[ / ! Y b.n.L.T.L.Y.U.L.Y.L.U.L.I.L.T.Y.K.L.U.U.I.U.U.P.U.L.L.L.L.G.L.F.! ! ' BXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAX9.>.-.-.-.-.,.,.4.2X1X2Xv :X1XwX<.>.-.-.-.-.>.-.-.>.-.-.>.:.<X1X<.,.:.1X0X,.:.0X:X6X8X3X7XO. . . .O.O.6X5Xb l v v z 7 v / n / n ;Xb ;Xb b b b b b v :Xn :Xb n b n ;Xn ;X;Xb b :XeX0XtXyXeX0X:X3X:XwXeX0X<X+. .o.......8XwXtX2X:.5.4XwXqX>.qX4X<.DXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXDXZXVXZX~ / / T b.G.H.T.T.~.!.!./.!././.(././.!.~.~.~.~.~./.T.~./.~./.!./.^.(.{.(.(.(.(.(.^.{.|.(._.|._._._.|.|. X|.|._._._._.(.`.|.^.`.(.(.^.`.(._.(.{.(.(.",
+"Z C C C C C C C C C Z C C C C B N C C m A C C C C C C C C C C C B N C C C B C C C C C Z C C Z C C Z Z Z C Z Z Z B Z C Z C C F C C C C C C C C F D C Z Z B C C Z C C Z Z C Z Z Z Z C Z Z Z Z Z Z Z Z B Z C Z F Z Z Z Z Z B Z C Z Z Z Z Z Z Z D Z D Z H Z H H D H J Z L Z J Z H L P H L L L L H L H P [ Y.P.T.T.T.T.U.U.T.P.T.P.P.T.T.U.U.U.T.T.P.P.T.T.T.T.T.~.T.T.T.~.~.~.^.~.~./.(.(./.(.(.^.(.(.{.|.(.^.{.}.}._.|.}.}.}.}.}.}.|.|.|.|.|.@X|.|.|._.|.|.|._.|.|.|.|.|.|. X X'..X X.X X X X.X.X.X.X.X X.X`..X@X'. X|.|.|.}.}.}.|.`.^._.|._._._.[._._._._._.'._._._._._.^.^.^.^.(.(.(.(./.^./.^.[./.(./././././././.^./././.(./.(.(.~.(.(.(.(.^.^./.(.(.~.~././.(././.(./.^.!.~ ~ Q ZXVXZXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXyX<.,.<.wX2X2XtXwX5X6XX. .X.o. .+.uX,X,XwX<X4X4.:.4X,X,X4X5.:.4X2X,X,X,X3X6X .X.X.X.X.X.X.X.X.X.X. .o.:XyX3X6X..X.X.X. .8XyX<X2X1X2X,X,X,X,XtXwX2XwX1X,X,X,X,X,X,X,X,X,X,X,X2XwXwX5.>.>.5.wX0XwX5.-.>.5.1XtX8X..6XtX>XwX2X2X,X,X,X2XtX:.5.,X1XwXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX} ^ ~ c.m.'.hXxXxXxXxXxXxXdXcXcXcXvXcXdXdXdXdXcX.X.X.X X.X|.|.|._.(.(.~.~ ^ ^ ZXVXZXDXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X.X.X.o.X.X.X.X.o.o.+.o.X.X.X.X.X.X.X.X.O.o...6X<X1XtX1.>.9.2XwX9Xb x sX@ z :Xk 7 q.O b p + z :X! a 4 7 j 4 z h d - g w n -Xp a g g h z b -Xk k z k *Xp z k 5 4 x < z p z g =Xd @.> > @.c X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.7XGXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX[ ^ ^ T T t.p.i.i.i.i.i.i.i.i.i.i.i.i.i.s.u.i.u.u.i.u.u.i.i.u.i.i.i.a.i.! ! ^ CXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3X9.>.:.:X4X,X>X<.;.-.:.wX4X4X5.,.-.-.-.-.-.-.-.-.-.;.;.-.-.-.,.-.0X2X=X-X/ p z l n -X-Xp 5.*Xd 7 2 / O.u =.l & | / p :X;X@ 5 7 h O l g z / O h a - b v b b b b :.,.,.4.0X<X7X8X,.9.:Xd b ,.2.KXn l d z *Xk g v 5 5 p g @ l :X;Xz @ a :X<.-.-.-.FXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXAXAXZX' ! ! [ b.n.H.U.U.T.U.U.Y.U.U.U.K.U.L.U.L.U.Y.U.Y.U.L.L.P.L.L.P.L.L.L.D.Q Q _ BXCXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX4.,.,.-.-.>.<.wX2X<XwXwXv :X4X5.>.-.-.-.-.-.-.-.-.<.wXwX<X5.qX4.>.-.-.0X4X4.,.8X...... . . .X.X.X.X.X...6X;X6X6Xn 6X} | / | } g a p w z ' n n s =X=Xa l p p @ @ O + @ 4 < 5 + b ,.,.wXyX:.,.qX1XtX:.,.,.4.:XO.O.o.o...6X;.9X1XwX4.qX;.,.5.2X0X;.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXVXFXAXAXDX! P ! e.b.F.U.T.T.~.~.!././.~./././././././.T././.T.~.~.~.~.~./.~./.~.[./.(.{.(.[.^.^.|.(.|.`._.|._._.|.}.}.}.}.|.^.|.{.(.^.{.`.(._._.`.(.(.(.(.(.(.",
+"C C C Z C C F C Z C C C C C C A A C A C C C C B C A C C C C Z C Z C N C C A C V C C C C C C F B Z C C C Z Z Z C F C C C C C C C C C C D Z Z C C C D C Z D C C C Z C B D C Z C Z Z F Z C C D B D C Z D Z Z Z C Z Z C Z C D Z Z Z Z Z G B Z Z G Z D Z H H H H H H J L J H L L L L H P H L L L H L J H e.!.T.T.T.T.U.Y.U.U.T.T.P.P.P.T.Y.T.T.T.T.^.T.T.T.T.T.T.~.T.~.~.~.T.~.~./.~./.~./././.(.(.(.(.).^.(._.|.^.}.}._.}.|.}.}.}.|.|.|.|.|.`.`._.|.|.|.|.|.|.|.|.|.|.|.'. X X.X.X'..X.XdX'.'..X.X.X.X.X.X'..X`.'..X.X X X|. X X}.}.|.|._.`.}.|._.|._._._._._._._._._._._._.(.(.(.(.~.(./.!./.^.^.E././.[././.~././././././././.(./.(.(.(.(.~.(.^.~.~.(.~.(./.[././././.!./.[.(.~ Q Q ZXVXFXZXFXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXyX<X<.,.4.1XwX<.<.wX3X7X..X.o. .7X2X1X>XwX2X4X4.;.wX2X,X2X2X4.qXwX2X,X,X,X2X6X .X.X.X.X.X.X.X.X.X.X.3XyXwXwX>X6XX.X.X. . .3X1XwX0XwX2X,X,X2XwX:.wX2X<X,X,X,X,X,X,X2X,X,X2X1X5.>.>.>.5.qX>.>.>.-.;.-.>.wX1X<X....8X2XtX,.qX1X,X,X,X,X<XtX2X2X3X:.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXBX[ ~ ^ c.Q.].hXdXxXxXxXxXxXmXcXcXcXdXnXcXdXdXdXvX.XdX@X X X X|.{.(.^.(.].! Q Q ZXVXZXDXVXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXo.X.X.X.X.X.X.X.X.o.o.o.o.X.X.X.X.X.X.X.X.....7X,X1XwX:.>.<.<X>X9X,.b h z p @ l z @ a d @ z z l n -X+ a p s @ a z b z z z 5 d @ a g l l z z a - a j z h l z @ h 8.8.4 z p sXx g f , eXl , f X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.oXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX} / ! [ T u.i.s.i.i.i.i.a.a.a.i.i.a.t.i.a.u.i.u.u.i.u.u.i.i.i.u.i.a.i.i.! ! ^ ZXZXAXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX1X9.>.-.:.0X0X0X<.-.-.-.:.qX0X<.>.-.-.-.-.-.-.-.-.-.,.,.;.;.;.:.;.<.yXs :X} - @ j 4 n n Q f } c u [ +.O.0 7 z 4   , P | | c h @ O + O - v -X+ 6X6X+ h p @ b b x b b 8.:.,.9Xj 2.<.,.8.a k 1.j :XeXz w b n g 8.n 4 d 4.5.k v yXtX;Xa k -X<.-.-.-.ZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXAXZXBX] ! ! Y b.n.K.U.U.T.U.U.U.U.U.U.U.L.Y.Y.U.L.L.U.L.P.U.L.U.L.L.A.L.P.L.Z./ / ' BXZXVXZXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXwXtX9.:.tX,X1X2X2X5.<.v :XwX<.;.>.,.;.;.,.-.-.:.wX4X4X2X<.,.>.-.>.>.:.1X9X<.6X..X.X. ...o.o.o.o.o.o.o...O.O.+. .X.O.O.O.X.KX*X4.*Xh ^ eXiX@.=XiX*Xs b 2.0Xk w z n - @ kXkX  b ,.>.4.yXwX:.0X1X1XtXwX;.,.qX+.o.o.o. .6X>.9.tX1XwX:.>.5.1X1X1.>.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXDXAXAXFX~ ) ~ T n.D.U.P.T.T.~.~.!.~.~././././././././.~.T./.~.~.T./.~.(.(.~././././.(.(.(.(.^.^.^._._.(._.|.|.|.}.}.}.}.(._.{.(.(.(.{._._.(.(.`._.`.`.^.(.(.",
+"C C C C C Z C F C C Z C C V C C A N C C C C C A C A Z C A N C C A B N C C A C A C C C C C C C C C A C C C C Z Z C C C Z D C D C Z C C C C C Z C Z D C C B Z Z C Z C C C Z B D Z C Z Z Z Z Z Z B Z Z Z C Z Z C Z Z Z Z Z C Z B D D Z Z Z Z F G Z D D D H G K H H L L H L H J L L H H H L L L P L P J [ !.T.T.T.T.T.U.T.U.U.T.P.P.P.T.P.Y.T.T.T.T.[.T.T.T.T.T.T.T.~.~.~.~.~./.~./.~.(./.(.(.(.(.(.(.^.^.{.|._.{.}.}.}.}.}.|._.|.|.|.|..X|.'.|.|.|.|.|.|.|.|.|.|.|.|..X|.'..X|..X.X.X.X.X@X.X.X.X.X.X.X'.'..X.X`..X|. X|.|.}.|._.}.^._._.{._._._._._._._.|._. X_. X_._.`.^.`.(.(.(.`.^.(.(.(././.(./.(./././.[./.(./././././.(.(.(.XX(.(./.[.(.(.(.(./.(.~.(.~.(./././././././.~ Q S HXZXZXFXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXyX2X<XwXtX1X5.,.>.<.wX2X3X+.....7XtXwX<.<.1X4X5.,.<.1X2XtXwX4X9.:.wX1X2XtXwXyX6X..X.X.X.X.X.o.X.O.+.4X0X,.:.tX8X .X.X.X. .3X5.>.>.,.wX1X,X,X,XwX2X,X,X,X,X,X,X,X,X,X,X,X2XwX:.>.>.>.5.qX,.>.-.>.>.>.5.1X>X<X .6XyX1X0X>.0X1X,X,X,X,X,X2X,X1X0X,.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXHX' Q Q { Q.'.zXxXxXzXxXxXxXcXcXcXzXcXdXcXzX.XzX X.X.X.X.X|.|.|.`._.`.^.K.! Q Q ZXCXFXZXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXVXo.X.X.o. .o.o. .o.+.o. .+. .o.o.o.o.+.X.o.+.6X,X,X<X0X1.4.,X1X1XwX9.k + - @ @ @ -Xl h - l s a l w a h h z h z z z z z 4 3 l s p + l s O 2 7 v g g l z + + p k z 7 c 4 z p l h p d n n x > f 6X+.X. . .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.O.O.DXSXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXFXHX' / S [ T i.i.i.i.f.a.i.a.i.i.a.a.s.i.i.a.i.u.u.u.u.u.i.i.u.u.i.i.i.i.i.! ! ^ CXFXAXGXZXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFX3X9.>.-.-.-.-.-.>.-.-.-.>.>.,.-.-.-.-.-.-.-.-.-.-.:.:Xb x b b b b b ;X@ a h z p + u ..c +.W ../ | O.O.O.q.6 x IXn S O.O.O.H 4 v *X2.p l l d + W W O 4.0Xz d v b v -Xv b b x % l b b b z -XtXv h h h d b eXO z 8.4 a j 9Xp v 2X,X*X2.5.-X<.-.-.-.DXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXVXVXBX[ Q ! I b.F.K.T.U.T.U.U.T.T.U.T.U.L.L.L.U.U.L.L.U.P.P.U.U.L.U.P.P.L.L.F.! / [ BXZXAXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXyX3X1XyX9.0XwX2X,X,XtX<Xv 9.,.;.<.wX:X;X8XeX3X9.:.1XwX0X4.wX4.>.<.wX5.,.0X1X>X6X..X.X.o.:Xv f v 6X .O. .o. .O... .O.O.O.+.:XuX-Xj k p A W W m =X=X=Xs d j 9Xs z 7 l + d 6X8.< b ;.,.>.0X4X>X2XtXwX0X9X-.>.0Xo.o.X.X.o.8X:.>.5.1X2X<XtX4XwXqX;.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXDXAXAXZX~ ~ _ Y b.D.K.Y.T.~.R.!.~.~././.~./././.~./.~.~.~.T.~.~.~.~.R.~.~.~./././.{.(.(.(.(.^.(.(.`.^.|.(.|._._.|._.}._.(.^.`.(.(.`.(._.`.(.(._._.^.(.`.(.(.",
+"C C C C C C C C C C C C C A C C C C C C C A C C N C C N A C C B B B C C C V C C C C Z C Z C C Z Z B Z Z C Z Z C C Z C G C C C C C B C C D C C C C C C D C C Z C C C G Z C Z Z C D B D B Z Z Z Z Z Z Z Z D B Z Z Z C C Z Z C Z Z F D B Z Z Z B D Z D D H H D H H J Z L L L L H L U H L L L L H L P U T Y.T.T.T.P.U.T.U.T.U.Y.P.U.P.P.P.U.T.T.T.T.U.T.[.T.~.~.~.[.~.~.~.~././././.^./.[.(.(.(.(.(.(.|.|._.^.|.}.}.}.}.|.|.|.|..X'. X.X|..X'..X X.X.X X.X X X X X.X.X|..X|..X.X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X'.'..X.X|.|.|.}.|.|.|.|._.`.|.^.`._._.`._._._._._._._._.`.(.`.(.(.(.(.^.!.(./.(././././././.^././././.(.(.(.(.(.(.(.(.(./.(.(.(.~.~.(.(./.(.~.(.(./.[././.^.^.~./.~ ~ Q ZXZXZXZXAXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXyX,X1X1X1X,X<XwX<.,.4.1X>X6XO.+.2X5.,.;.wX1XyX,XwXwX1X2X4.:.0X9.>.:.0XwX4.:.yX>X7X .X.X.X.X.o. .O.3X2X4.,.0X5X7X .X.X. .O.0X,.-.-.-.tX2X,X,X,X,X2X2X,X,X,X2X,X,X,X,X,X,X,X,XwXwXqX;.-.5.wXwXwXwXwXwX2X,XtX6X .:XyX<X>.5.1X,X,X,X,X,X,X,X2X0X5.tXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX[ Q S c.m.'.hXxXxXvXxXxXxXcXcXzXvXdXnX.XzXzXdXdX.X.X.X X.X X{.|._.`.(.].~ Q S ZXZXFXZXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXo.X.X. .o.+.+.+.+.+.+.+.+.+.+.+.7X+.+.+.7X,X2X,X-Xv v x v v x :XeXeX>X;Xn h @ g ;Xn p z +.-Xa a a p a z @ c s p z @ z 7 < X.;Xp @ | 6X3 =.7 p z eXl z x n z p l 5 @ @ l h z z a , / n f @.p v v - +.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.O.O.hXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXBX[ ^ ! [ T w.i.i.i.a.i.a.i.a.a.a.i.a.i.i.s.i.i.u.u.s.u.u.u.u.i.u.a.i.a.i./ ! ^ ZXSXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXwX<.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.<.>Xv @ g a + - s d 4 7 z < < ] O.L w f f s z u q.[ O.e.t l sXn | O...O.i 4 -Xj k k a h h + @.n - 2.0Xs p kXl g v w   5 l 5 w h - @ x k v g g g h a p p O O O p @ p p p g -X-X*Xj 9X*X:.-.-.-.AXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX} ! Q ) b.Z.L.T.U.T.T.U.T.U.T.U.P.P.U.U.U.L.L.U.T.P.T.U.U.L.L.L.P.L.L.F.! / ' BXFXAXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX,X3X4X4.,.4.1X,X2X1X1Xv 4.,.<.3X+. ... .O.+.5.:.4X9X,.,.wX1XwXwX1X1X4.:.1X>X8X..X.X.+.z z s h k f ~ | W f f | W f f > c ;X-X-Xv v k w w w l g g g h v v k z 5 4 O g a @   @ b ,.-.,.4.0XwXtX,X:.,.,.-.qX8XX.X.X.o...6X:.,.5.1X,X2XwX0X;.>.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXFXAXZX~ ~ / T n.F.U.Y.Y.T.~.!.~.~.T.~././.T././.T.~.~.~.~.T.~.T.~.~.~.~.~./.T./.~.(.(.(.(.(.`.(.`.`.{._.|.|._.^._.}.[.(.|.^.(.(.^.^._.`.(.(.`.`.^.(.(.(.(.",
+"C C C C C C C C C B A C C C C C C C C C C C C C C C N Z C B C B Z B Z N C C C C C C C Z C C Z C Z C C C Z C B Z Z C Z C D C C C F C C C B F C Z C B C C D Z C C F C C Z C C C Z C Z Z Z Z Z Z Z Z F Z Z B D Z D C Z C A C D Z C Z Z C Z Z Z D D Z D D H D H H H J H L L L L L P P H H L L H H J H J T P.U.T.T.T.T.T.U.U.T.P.T.T.Y.L.U.T.Y.Y.T.T.T.T.T.~.T.T.~.~.E.XX~.~././.~.[.(.(./.(.{.(.`.^.|.(._.|.|.|._.|.|. X'. X'. X|..X'. X.X X.X X.X.X.X.X.X|..X X X.X'.|..X.X.X'..X.X@X.XdX.X.X.X.X.X.X.X.X.X.X|..X.X|.|.|.|. X|._.|._.{.|.`.{._._._._._. X_. X_. X_.|.`.(.|.^._.(.(.[.^.(././.^./.!././.(.[.(././.[.(././.(.(./.^./.(.(.XX(.(.~.[./././././././././.(././.(.(.E.~ ! S ZXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXZXFXDXFXFXFXFXFXFXyX3XwXwXwXwX2X1XtXwXtX2X,X,X:X3XyX<.>.<.1X,X,X,X1X,XwX9.>.>.:.wX9.-.>.>.,.<.,X,X,X6X.. . .X...+.:X4X4.,.:.>X6X.. . . .X.+.0X>.-.-.0X2X2X,X2X1X1XwX1X,X,X,X,X,X2X,X,X,X2X,X<X1X2X1XwXwX2X2X1X2X1X2X2X1XuX8X .6X>X1X0X>.4.wX2X,X,X,X,X,X2X,X,.9.wXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXBX} Q S [ '.].'.JXxXxXxXzXxXcXcXnXvXdXcXnXdX.XdX.X.X.X.X'.|.|.{.`.{.^._.].~ ~ ^ ZXAXFXDXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXo.o.o.+.6XtX5X1Xb v l v v v v v b b v v v v l v x < 4 O b wX>X:XM.eX:X-Xl z a a k -Xg - @.> d z n :X5 z d | -Xa z z 5 =.< @.f d + @.~ O =.3 p sXkX@ 5 4 4 + k -Xw - b + 7 4 k g h f - d d p n n a +.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.7XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBX' ~ ! c.E w.i.a.a.i.a.i.a.i.a.a.a.a.i.i.i.i.s.u.u.i.u.u.u.u.i.i.i.i.i.d.! / S ZXFXAXZXFXFXFXFXFXFXFXFXFXFXFXZXDXFXFXFXFXFXFXFXFX9.>.;.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.>.:.<Xv z 8X:X> } *X@ z IX8.2 w X.Y =.< > } -Xa 4 O & | O.Q 5 @ z c }  .` 2 7 x v v l 4 8.=.; sXiXu 2 4 d d 3X;X- n x O 8.b 4 w n x + g 7 / n } | / x | / } | } } z | } | | | } 7XW } =X<.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXZXFXAXHX| Q ^ I b.n.K.T.T.T.T.T.T.U.U.Y.U.U.U.L.U.P.P.Y.U.U.P.P.L.U.L.L.U.U.L.Z.! ! ' BXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXyX3X1X3X<XwX,X1X4X3X0XwXv :XeX:X7X..X.O. .o.X.3X4.0X1XwX4.<.2X2X<X0XwX4.>.9XwX6X . . .+.c } =Xa g 9.qXv f } k g f } k p aXaXa + < p 4 h z s + p - s p a d s p l c ;Xc 4 4 a @ b ,.;.5.0X>.,.0X1XwXwXwXwX:XO.X. . ...6XtX:.>.qX1X2X,X:.>.>.;.-.-.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXAXDXAXZX~ ~ ' Y n.K.P.Y.Y.~.T.!.~.T.~.~./.~.~./.~.T./.T.T.T.T.~.~.~.~.~.~./.~.~.(.~./.(.(.(./.|._.(.(.`.(.`._._._.|.`.{.(.(.|.(.(.(.(.|.^.`._._.`.^.^.^.(.(.",
+"C C C C C C C B C C C C C A C C C C Z A C A C C m C C B N C B C A B Z C C C A C C B C C C C Z C Z A C Z C Z D C A Z C Z C C C C C C C Z C D C C F Z C Z C C Z C B Z C C Z D C C Z C Z Z Z D Z Z Z C Z Z Z Z Z B Z Z Z Z Z B Z Z D B Z Z D D D Z D D H D D H H H L L L L H L L L H L L J H L H L P H [ Z.Y.T.T.U.T.U.U.T.T.P.P.T.U.T.T.P.Y.U.T.T.T.T.~.T.~.!.T.~.(.~.^.^./././.XX^./.(.`.(.(.(.|.`._._.|.|.|.|._.|. X.X.X.X.X@X'..X.X.X.X.X.X.X.X.X.X.X.X X@X.X.X.X.X|..X.X X.XdXdX.X.X.XdX'.'.'..X.X.X.X.X.X.X'..X X'.|._.|.|._.|._.`.(.|.|._.|._._._._._.|._.|._._._._.|._._.(.`.^.(.(./.^./././././.(.[./.(././.(.(./.(.(./.(.~.(.(./.^.{.T./.[.(.XX/././././././.(./.(./.~ ! ^ ZXAXFXDXFXVXAXFXFXFXFXFXFXFXFXDXFXZXFXFXFXFXFXFXFXyX1X4.,.,.<.<X2X,X1X,X2XtX2X2X1X5.,.:.tX,X,X,X,XtX4.>.>.:.0XtX4X5.>.-.;.0XtX2X,X,X>X6X.. .+.8X3XyX4.-.0XtXuX3X..X.X.X. .8X0X,.>.>.0X2X<X,XwXwX5.,.wX2X,X,X,X,XwX2X,X,X,X,X1X1X2X4XwX2X,X,X,X,X,X,X,XtX6X .6X>X,X<X:.>.>.,.0X2X,X,X,X2X2X1XwX>.,.GXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBX[ ! n c.m.].JXzXxXzXxXxXxXvX.XdXcXdXdXdXdXdX.X.X.X.X X|.|. X|.`.`.|.(.!.~ ^ ^ VXVXFXZXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXo.o.o.7X>Xb v v x :X<Xs j g :Xv k p z p @ k s @ k 8.eXk *X>X=X:XeX:X:X>X;X-Xv -X-X*Xv v :X:Xv @ @ g 5 z + @.@.@ g g z w 7 - - d d a - 5 z z d 8.z + l 5 5 z g z @ 8.8.7 l *Xg z l + a d @ p x l p +. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.oXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXCX[ ! S { T e.s.a.a.a.i.a.a.a.a.a.a.i.a.i.u.i.i.u.i.u.u.i.i.u.i.u.i.i.i.i.S / ^ ZXFXVXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFX9.1.<X1.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.1.1Xv z 8X-X, | f @ z { j u  .6XqX=.7 - W x @ - | O S O.+.c @ z O / O.v 6 x + h a d 4 j 2.* @.W * =.2 x a p p @ n b O q.8.@ z x x p l | +.l / } / x / c ' } | n c / ! ' } Q ' ' } o.6XtX<.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXAXHX' ! Q Y b.F.K.T.T.T.T.T.T.T.U.T.U.T.U.Y.U.Y.Y.U.U.P.Y.P.U.L.L.L.L.L.U.F.! ! | BXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXwXtX1X1XtXwX0X0X0X<.,.4.v +. . .O. .X. .O.o. .+.3X5.0X4X1XtX1X4XqX,.,.>.-.,.:.6X . . .o.f W / a p 5.;Xp > W / a - | ! - KXl + 7 8.s @ - } -Xp - } -Xp > | k p Q sXiX/ @ kXkXO b >.5.4XtX,.-.4.,X2X1X1X8XX...O. . .6XuX,XtXwX,X,X1X,X;.4.wX:.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXZXZXAXDX~ ~ / e.n.F.P.P.Y.T.T.!.~.~.T.~.~.~.T.~.~.~.~.~.[.T.~.T.T.T.R.R.~.T.T.~.~././././.(.(.(.(.`.|.{.|._.(.`._._.`.(.(.(.(.(.(.(.|.(._.|._._.|.(.(.(.(.(.",
+"B B B u C B B C C C C C A C C F A C C C C C C C C B B C C N N C A m A N B C C C C C C C C C C C Z C Z C Z Z Z Z C Z Z C C C D C Z C C C C C C Z C D C C C C A C C B C C B C C D C Z C Z F Z Z Z Z C Z Z Z Z Z D Z C C Z D B C Z Z Z Z Z Z Z Z Z D D Z H H H H H J Z H L H L H P L H L L L J H H P J T Z.K.T.Y.U.U.I.L.T.T.T.T.T.U.U.Y.U.T.T.T.T.~.T.T.~.~.~.~.~.(.~.~.(./.(.(.(.(.(.(.(.|.^.^.}._.|._.|.|.|.|.|..X.X.X.X.X.XdX.XzX.X X.X.X.X.X'..X.X.X.X.X.X.X.X X@X.X.X@XdX'.dX X.XdX'..X.X.X@X.X.X.X.X'.@X.X.X.X.X X|._. X|.|._.|.`.(._._._._. X_._.|.|._. X_._._._._.(.`.`.(.^.`.(./.(.[./.^./././.(.^.{.^.)./.^.(.(./.(.(./.(.(././.^./././.(.(.(.(.(./.^.[././.(././.^.~ Q ~ ZXFXFXZXAXVXAXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXyX1X4.>.-.>.<.wX2X,X,X,X,X,XtXwX<.>.:.tXyX,X,X1X5.>.-.>.:.wX1X,X2X4.>.:.wX1X,X,X,X,XyX3X8X<X>X1X0X,.wX1X2X>X6X .X.X...+.1X0X,.0X5.:.tX1XwX>.>.,.>.wX2X,X,X1XwX:.qX4X1X2X1XwXwXwX5.:.0X1XtX2X,X>X,XyX8X..6XyX,X,X2XwXqX;.,.qX1X,X,X,XwXwXwX3XwXwXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBX' Q Q { Q.].hXxXxXxXxXzXxXzXxXcXzXnXdXdXdXvXzX@X.X|. X_.|.|.`.(.(._.{.].~ Q ^ ZXVXFXFXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo. .pX>X<Xv z s p ;X:Xj 9.k *Xj 5.k z k k 2.j d :Xj 2.7 -XwX9X>Xj k *X5X>X2X:Xa *Xk a ;XyX4X;Xp @ @ g g @ d - z z z 7 3 7 { eXc d z z z @ z 5 O p o O z =X5Xk a a z 8.4 g < p n n + x b @ d , @.> @...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.O.7XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBX} Q Q [ T w.i.s.a.i.i.a.a.a.a.a.a.a.i.i.s.i.u.i.i.u.u.u.u.u.i.i.i.i.i.i.! ! ^ CXZXVXZXFXFXFXFXFXFXFXFXFXZXFXZXFXFXFXFXFXFXFXAXFX9.:.wX<.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.;.0Xv d a @ @ - - z z + O c ] v ;Xf x - - % d w W @.v 7XO.' g sXv W O.' sXsXO 9.0Xd z O 2 < $ o   3 j -Xa 6X8Xp @ - @ + + @ z -X-Xk ' ..i a < @ O p O g s p g p a j v k g p p g ;XM.7X8X9.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXDXAXAXBX[ ! ! _ b.F.L.T.T.T.T.T.T.T.T.T.U.T.T.T.P.T.P.L.Y.Y.P.P.L.U.L.Y.P.P.U.F.! ! ' BXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAX9.:.wXwX1.,.,.;.,.,.1.:Xx +. .X.o.X...o.O.o.X.O.+.yX5.qX0X0XwXwX<.-.>.>.-.-.<.8X .X. .+.v - - g h d 5 h @ d , g a % + a 5 5 z 7 kXx 5 - W S p - W / p - | ~ a K W | @.p 6X8.6 b ,.wX4XqX-.-.>.wX1XuX6X .X. . ...6X4X1X1X4XwXtX2XwXqX,.4.1XwX:.>.AXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXGXAXAXAX~ ~ _ ` e.P.U.Y.T.T.T.T.~.T.~.T.~.~.~./.T.~.T./.T.~.T.~.T.~.T.~.T.T.~.~.~./././.(.(.(.^.|.^.`.(.(.|.(.`.`.^.(.^.`.^.(./.(.^.(.`.{.`._._.^.{.`.(.(.(.",
+"B F B V B u C C C C C C C C C C C C C C C C C C B C C N C N C N A Z N C C C A C C C C C Z C C F C Z C C C Z C Z Z C Z Z Z C B C C C C Z C D C C C C Z C C D B C C C C C F C C C Z Z C Z B Z Z Z Z Z Z Z Z Z C B F Z Z C Z Z C Z Z C Z C Z Z Z Z H Z H Z D H H D J L L L L L L H L L L H H H L H S P T F.J.T.T.U.T.T.I.R.P.T.P.T.T.T.U.T.T.T.T.T.Y.~.~.T.~.~.~.~.(.~.(.(.(.(.(.(.|.(.(.(.^.^.|.}.|._.|.|.|.|..X.X|..X.X.X.XdX.X.X.X.X.X@X'..X.X.X.X.X.X.X.X.XzX.X.X.X.X.X'.dXdX'..XdX'..XdX.X'.dX.X.X.X'.dX X.X|..X|..X|. X|.|.|.|.|.^.|._._._._._._._.{.|. X|._._._._.(.(.`.(.`.(.[.(.(.(.(.(.(./.[././.^.(.[.(.(./././.(./.(./.~.(.(././././.(.~.[.~.(./.^.^.~././.(./.^./.~ Q ^ ZXFXZXZXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3XtX<.-.-.-.9.1X,X,X,X,X1X5.,.-.>.>.9.1X,X<X1X5.,.:.wX4.<.2X,X,X1X4.-.:.,X,X,X,X,X,XwXwX,X,X,X<XwX1XtX2XtX6X .X.X...8X2X1XwX1X,XwX2X1X0X>.5.wXwX,X,X,X,X1X0X>.-.5.wXwX5.>.>.,.>.>.wX1X2X2X,X>XyX8Xo.6X>X,X,X,X,X,X1XwXwX1X1X2X,X,X:.,.,.qX4X3XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXDXBX[ Q ! c.V.].dXzXxXxXvXzXxXcXdXdXzXzXdXxX.X X.X X.X X X|.|.|.(.`.`.(.`.!.! Q Q ZXAXFXFXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXO.+.uX>X>Xx k 5.k :X>Xk j s :Xk j k z g -Xk k d :X:X:X-X2X5.>.>X>X5X5XwX>X;Xz k 2.*Xz l 6XeX} 4 z 7 @ g + z s p d z 7 =.w 6XiX/ d z n l p z 7 3 :X} o =X5XwXs h @ p O 5 5 g k x l p l l k - , :Xx > O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.O.O.oXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHX[ ^ ! ` T R i.i.a.s.a.a.a.a.a.a.i.a.i.i.a.i.a.t.i.u.i.u.i.u.i.i.i.i.i.i.S ! ^ HXZXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZX9.>.>.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.>.<.x @ z a + p p < 7 ] +.4 b ;X2.b j j j 7 z -   o j 6XO.X.l sX8./ O./ sXb O 5.;Xw 7 3 =.3 ;Xl p sXg k a :X:Xp l 7 3 j b v 0XuX3X} z 7 2 h q.*X@ =Xp g 9Xs g 9Xk v v >Xg 9Xp v :.,.5.7X:X<.,.FXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXDXFXAXAXFXAXAXCX' ! ~ Y b.F.Y.T.T.T.T.T.~.T.T.T.T.U.T.T.P.T.T.Y.P.U.P.Y.Y.U.U.P.P.P.P.F.! ! _ BXZXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAX9.,.,.>.>.1.wX;XeX:X:X+.n +. ...+.3X<X3X:X7X .X. .O.3X9.>.,.,.>.>.-.:.wX4.;.wX7X .X.X.+.k 5 + g k =X*Xg x n ;Xl 5 z v v ;X:Xn Q / A - c @.f n n f f -Xa $ - d w % w e - + + - ;XtX2XqX;.-.>.5.3X:X8XX.X.X.X. .6XtX0X0X0X0X;.qX4X;.4.wX>.5.4X,XwXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXZXZXAXAXZX~ ~ ! e.b.D.U.T.T.T.T.!.T.~.T.~.T.~.T.~.[.T./.T./.T.~.T.T.~.T.T.T.~.R.~.~./././.(.(.(.(.^.`.`.(.`.^.`.`.(.`.(.(.(.^.(.(.(.|.|.{.`.^._.|._.(.(.(.(.(.",
+"C C Z C B C B Z C C C A C C B C C C C C C C B Z C B C Z N C N C B B S N Z C C C C C C C C C C C C Z C A C Z Z C D C C C F C C C C C C C C C C C C C D C C C C C C Z C A C Z C C C D C Z Z Z Z Z Z F Z Z Z Z Z Z Z Z Z B C C C Z Z C Z Z C Z Z Z D D H D H H H H Z J J L H L H J K J H J H H H H H Z T Z.P.Y.U.U.P.T.P.P.P.T.T.P.T.T.T.T.T.T.T.T.T.[.T.~.~.~.(.~./././.(.{.(.(.(.(.(.{._.(.|.}._.|._.|. X.X.X.X.X.X.X@X.XdX.X.XdXdXdX.X.XzXzX.X.X.X.X.X.X.X.XxX.XdXdX.X.X'.dX.X'.'.zX'.@XdX X.X.XdX.X.X.X.X.X.X.X.X X|. X|.|.|.|._.|._.|.|._.|.{.|.}.}.[.|._._.|.{.}.}.[.|._.(.(._.[._.(.(.(.[.!.(./.(./.(.(./.(./.(./.~.(.(./.(././././././././.(.(./.^.(.~.~.(.(./.(.!.(.(.~ ~ ! ZXVXZXDXZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXyXyX1X9.>.-.>.<.1X,X,X,X,X2XtXwXwX0XwXwX2X<XwX1X,XwXwX1XtXwX,X2X>X1X1X4.:.,X2X,X,X1XqX,.:.,X,X,X2X1X,X,X>X8X..X.X. .o.tX2XwX1X2X2X2X,X,X2X5.qX4X2X,X,X,X,X2XwX>.-.>.>.>.>.>.-.5.wXwX<X,XyXtX>X3X6X .6X>X1X,X,X,X,X,X,X1XwXwXwX,X,X,XwX0X;.qX1XyXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX[ Q ^ { ].'.hXJXzXzXvXxXxXcXzXzXzXxXdX#X'..X.X.X'..X|.`. X'.|.|.|.|.|.].! S ! ZXVXZXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXo.6X>X,X>Xk k k k v b h l k v z d b g p x v z - :XuX2X2X1X0X<.2X1XyXyX,XuXb z l k k h / sXiX> < c 8.@ v d +.-Xa h z 7 =.w @.@.@.z z l l a z 4 2 n ;Xh k =X=Xs p z k - O l z x @ @ d @ @ + > f n v > +. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.hXDXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXCX' ~ / c.T w.i.i.a.a.a.a.a.a.i.a.i.a.i.a.a.u.i.u.i.u.i.u.u.i.u.i.i.i.i.s.L / S ZXFXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX4.,.;.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.>.<.v z 3X:X# p k 2 i X./ h k 5.,.:.h g s 2 < x 2 =.7 n / | X.| | | O.u < p + d a @ l 7 =.2 -Xb + n p + z a a z 7 2 5 3 p ;X<.eX+.+.7 =.4 w 8.8.x M.j k 4 k k j s z g -Xk j s k <.,.<.yX6X7XeXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXAXfX} Q / _ b.n.T.~.T.~.T.~.T.~.T.T.~.T.T.T.T.T.T.U.U.P.P.U.U.P.P.P.P.T.P.Z./ / ' BXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.>.-.-.<.,X7X.. .O.o. .c +. .+.2X>X2X1X,X3X6X..X.O.+.3X4.;.;.:.wX4.,.wX2XtX8X.. .X. .+.7 8.z a =XiX*Xk / eXiX> z kXaX-X6Xo.O.O.O.O./ W +.+.o.O.O.o.6X;X-X;X8.2.b ;X:X;Xb 8.j 0X1XwX;.>.>.5.8XX... .X.X.X. . .8X;.,.>.,.>.,.4.qX5.1X1X;.5.4X1X1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXSXVXGXZXAXZXS / / [ n.Z.U.T.T.Y.T.!.T.~.T.~.T.T.T.~.~.~.~.~.~.~.T.T.~.T.T.~.T.T.~.~.~././././.(.'.^.(.(.(.`.(.`.(.(.(.(.(.(.^.`.(.(.^.`._._._._._._._.(.(.(.(.(.",
+"B C B B B Z N C C C C C C C Z B C C C Z C A A B N Z B C C N C N N Z N m N Z Z C A C Z C Z C C Z C C C Z Z C Z Z C C D B C C D C C C C Z C D C D C D C C C F B C C C C C C C C C Z C Z C D B Z Z C D Z Z B D Z Z Z A Z Z C Z A Z A Z A Z Z Z Z Z D D D D H H H H Z L J Z J H H J J H H H P H H U H H ` K.P.L.L.U.P.P.P.T.T.P.P.T.T.T.T.T.Y.T.T.T.T.T.~.~.~.~.~./././.(.(.(.(.^.`.[.}.|._.}._.}.|. X'..X.X|..X'..X.X'.xXdX.XdXzX.X.XdXzX.X.XzXdX@XdX.XzX.X.X.X.X.X.X'..X'.zX.X.XzXzX.X.X.X.X.X X@X.X.X.X.X.X.X X.X|..X.X|.|.|.|.|.|._.|.|._.|._.|._.|.}.}._.|.}.|.|._.}.}._.^.^.`.(.|.(.(.^.[.^.(./.(./.^./.(.{.(./.(./.(.(.!./././.(././././.(./././.{.~.(.(.^.{./.(.(.(.(.(.~ ~ ^ ZXVXZXZXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXyX,X1X4.>.-.-.9.4X1X,X,X,X,X<X,X1X2X2X2X1X5.<.1X,X1X2X,X,X,X,X<XwXwX2X,XwX,X,XyX2X4X5.>.wX,X,X1X2XwX2X,XtX7X .X.X.X.8X1X0X,.0X1X,X,X,X,X1X0X>.0X1X,X,X,X,X,X1X5.>.-.-.-.-.5.wX1X1X1X2XyX3X:X8XX. .6X>XwXwXwX2X1X,X,X,XtX:.>.,.0X1X,X1X4XwX,X2XyXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX} Q Q v.m.].hX'.vX`.zXzXvXzXzXzXdXdXxXdXzXdXdXdX X.X.X|. X|.|.|._.|._.!./ S ~ ZXZXZXDXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX+.2X2X2X2Xx :X>X:Xx ;X:X*X:Xx 3 4 O a g 7 - v z v b <X,X,X2X2X<Xk k v k v g z b x v l u @.@.@.4 j s 4 z @ @.! @ z a 5 4 h 9 g h a @ p a @ h k a w p z @ p + O k a :X} - @ 3 a + :Xz z a *Xd / n > > +.X. .X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.oXDXZXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXAXBX[ ~ ^ { T e.p.i.a.a.a.a.a.k.a.a.a.i.i.i.i.a.u.i.i.u.i.i.i.i.s.i.i.i.i.a.~ / Q ZXAXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX1.>.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.:.wX,Xv z 8X-Xp j k e ..| g 5.*X2.;.:.n } -X< 2 7 < 2 7 IXb @.O. .o.O.O.[ w z l a z s p w 7 5 + + s k @ @ z z d w 4 O ;Xx @ x ;Xc / l g 7 7 z 7 5 5 g 4 b p 2.5.k z - 2.5.-X:X-Xg :X<.:.9.0X6X6XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXZXAXAXBX' Q S Y b.F.Y.~.~.~.~.T.~.T.~.~.T.~.T.T.T.T.T.T.T.Y.U.P.P.P.P.P.T.P.P.F./ / ' BXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDX9.>.-.<.3X7X..X.X.X.X.+.f :XeXwXtX1X<XwXwX2X>X7X..X...+.8X4.>.:.4X5.,.:.1X2X6X.. .X.X.7X7 =.v p =X=X=Xk @.| W @.g sXl v O.o.X.o.+.O./ } | |  .X.X. .O.O.6X2X:.>.,.wXuXyX,.>.>.-.wX,X;.>.9X8XX.o.o.X.X.X.X...6X0X;.4.tX0X:.>.,.4.4XwX0X,.5.1XwXtXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXZXFXVXZX~ ~ ) T b.I.U.T.T.~.T.].T.T.T.T.~.~.~.T.~.~.~.~.T.[.~.T.T.T.~.T.~.~.~.T.~.~.~././.(.(.(.(.(.(.(.`.(.(.(.(.(.(.!.(.(.(.(.(.^._._._._._._.(.(.(.(.(./.",
+"C B B C A Z C C A N N C C C A C C C A C C C Z C C B C B C N Z N C N N A Z N N Z Z C C C C C C C C C C Z Z C C Z C F Z C D D C C C C C C C C C C C C Z C C C C C C C Z C A C Z C C Z C Z C Z Z Z D Z Z Z Z Z B D Z C B Z Z C Z Z Z Z C C Z Z Z Z D D D H Z H Z H J H H L J H H L J H L H H H P H H U Y F.L.Y.Y.Y.P.P.P.T.P.P.T.T.T.T.T.T.T.T.U.P.T.T.T./.~.~.^.~.^.^.(.(.(.(.`.^.|.}.|.|.}.}. X|..X.X|..X.X.X@XdX.XzXzXzXdXdXdXzX.X.XzX.XzX.X XdXdX.XdX%X.X.X.X.XdX'.dXdXzX'.'.zX.X.X.X.X.X.XdXxXdX'.dX.X.X.X.XdX|. X'. X.X|.|.|.|.|.|.|.`.|.`.`.|._._._._.|.|.|.}.}._._.`.^.^.|.[.[.(.[.(._.(.(.(./.^.^.(././.^.(././.(././.(.(.(.(././.^.^./.(././././.(.E.^.~.(.(./.(.(.(.~ ! ! FXVXAXZXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3X<XtX<.>.>.:.wXwXwX2X2X,X,X,X,X,X,X,X,XtXwX2X,X,X,X,X,X,X1XqX,.<.1X1X2X,X3XtXwXwX4.>.wX1X2XwX4.:.>X,X6XX.X.X.O.+.2X4X5.>.;.<X2X,X,X,X2XwX>.>.0X1X,X,X,X,X1XwX>.,.;.5.wX1X3X2X>X3X3X8X . ... .6X>XtX:.,.,.5.wX,XyX,XwX;.-.,.qX1X,XwXwXwXwX2X3XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXCX' Q Q [ m.].xXzXzXvXzXzXzXzXzXdXzX.XzXzX.X.X.X XdX.X.X'. X|.(.|.|..X|.!.~ Q ^ ZXVXFXZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXo.n v v b v k *Xk h k -Xk :Xl q.eXs z z 2 7 k v   5 :X2X2X,X2Xv h z z w z d v g d g a h h w @ @ @ @ d l z - @ a z h g z d z z h l l l z h z v w 7 g 4 a :X} @ k z b ;Xg - 8.-Xk *Xd sXl g k :X-Xd v f  . .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.7XDXDXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXBX} ~ ^ ` T w.u.i.i.a.a.a.a.a.a.a.a.i.i.a.a.a.u.u.i.i.i.i.u.s.i.i.i.a.a.i.! ! S HXZXVXZXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX4X9.>.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.:.wX;Xz @ d a @ k / ..) l g 2.k j ,.:.l W ! < j l j 2.x KXn W O.O.X.X.X.O./ gXsXo } -X+ 7 4 7 x sXg v z n l + z n x O ;X:X+ f | } *X-Xa c eXn - a + l l z d 2.0Xk l -Xj qX-X2XyX:Xk :X:.-.>.4.3XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXAXCX[ ! ! _ b.F.Y.(.T.~.T.~.T.~.~.T.T.[.T.T.T.T.T.T.T.U.U.Y.T.P.T.P.T.T.P.S./ / _ BXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDX5.,.<.<X7X..X. .X. ...+.v 4.-.,.:.wX<.,.<.1X<X>X6Xo.o.o.X.3X4.:.1XqX,.;.0XwX6X .X.X. .+.d + + p j g g j w w 0 g h % h } o.X.X.o.o.O./ S | +. .X.X.X.X.X.X.8X9X;.,.wX1X1X0X,.-.>.5.qX>.9X8XX. . .o.X.X.o.o.6XwX,.4.1X1X1XtXwXwX4XwX,.,.>.5.1X:.5.AXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXZXZXVXZX~ _ ~ U n.A.I.R.T.T.T.T.T.~.~.T.T.~.~.T.~.T.T.~.T.T.~.T./.T.T.~.~.~.T.~.~.~././././.(.~.(.).(.(.^.(.(.(.(.(.(.(.(.(.(.(.(.`._._.(.(._._.(.(.(.(.(./.",
+"C C C C N C N Z C C C Z A N C C C C C C C C C C B C B C C N C C Z A C Z N A Z N C C C A C C A B C Z C C C C C C D C C Z C C C C C Z C C C C B D Z C C C C C C C C C C C C C C C B D C Z Z C B D B D B D Z C Z Z C Z Z A A Z B Z C Z Z Z Z Z Z Z F D D A D H H H H H H J H J H J J H P H H H H H H H T F.L.U.U.Y.T.P.P.P.T.P.T.T.U.T.T.T.T.T.T.T.T.T./.T.~.~.~.^./.(./.{.(.(.`.(.{._.|.|.}.'. X.X.X.X.X.XdX.X'..X'.zX.XzXdXxXxXdXcX.X.XxXzXdX.XdX.X.X.X.X.XzX.X.X.XdXdXdXzXzX.X.XzX.XdX@XzX.X.X'.dXdXdXdXxX.X.X.X.X.X.X|..X|.|.|.|.|.|.|.|.`.|.|.'._.|.|.|._.|._.}.}._.}.(.`.^.^.].(.(._.(.(.(.~./.{.(././.(.(./.(./.(.(.(.(.(.(./.(.^.^./.(.[.E./././.(.(.(.{.^.(.).(.(.(.^.~ ~ S ZXVXZXZXFXVXFXFXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyX<X2XtXwX<.,.,.>.4.1X,X,X,X,X,X,X,X,X,X,X2X,X,X,X,X,X,X2X>XtXeXeX:X<X<X>X1XqX,.,.>.>.;.wX5.,.qXwX2X6X .X.X. . .8X1X0X>.>.;.wX2X,X,X,X,X,X5.>.-.wX2X,X,X,X,X,XwXwXwX2X1X3X3X:X8XX. . . .X. . .6XuXtXwXwX5.,.,.wX4X1X<X;.>.,.4.1X,X<.,.>.>.qXyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX[ ! Q c.Q.].'.zXzX.XxXzXzXzXzXzXzXzX.X.X.XdXzX@X.X.X.X.X.X.X|. X|.'.`.!.~ ! Q ZXVXFXZXAXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXo.w p a   z g 4.;X- j 9.*X:Xv 7 sX7 a z < g v 8X> @ :XyX2X,X>X-Xl *XeXsX=Xb v d a v -Xh p 4 @ O g - + d s O z s p z 7 3 7 z + l ' eX! z O 5 7 O c 8.4 l b ;Xp h @ p s a O 4.sX7 :Xd x z + h 4X>X>XiX-X} X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.7XZXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXBX' ~ ~ c.G w.u.i.i.i.i.a.a.a.a.a.a.i.i.a.i.i.a.a.i.i.i.i.i.a.s.i.a.i.i.s.S ! ^ CXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX1X4.>.>.-.>.;.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.,.<.v + d p z l *X} ' w l h v v b b ;Xf d - k *Xg k -X5 5 + 7 ! | O.X.X.+.' sXx   W ! < =.2 7 z n @ @ l n x a z x x - S ~ % ' O.8.,.2.! { iX/ n n + z h p a p d @ v v a a g 2X:.5.-Xv <.-.-.-.<.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXHXFXHX' ! Q ` b.F.Y.~.^.~.^.~.~.T.T.~.~.T.~.~.~.T.~.T.~.P.T.T.T.T.P.T.T.T.P.F.Q ! ' BXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXpXeX:X7X..o.o.o.o.O.7X<Xv 9.,.:.wX<.>.>.<.4X5.;.wX7X..X.o.+.3XtX2XyX4.;.>.<.8X .X.X. .+.v - p p w 7 7 g h w + h b :X6Xo.X.X.X.o.X.O.( | W | O.X.X.X.X.o.o.O.6X:XeX:X1XyXqX>.-.-.-.>.5.6Xo.o.X.X.o.X. ...6XwX:.>.qX1X1X1X1XtXwX9X4.wX:.,.5.1X:.5.AXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXFXVXZX~ / ' d.n.G.Y.T.T.T.T.~.T.~.T.~.~.T.~.~.~.~.~.T.T.~.T.~.T.T.T.~.T.~.~.~.~.~././././.(.~.(.(.(.(.(.].(.(.(.(.(./.(.(.(.(.(.(.(._.`.`._.(.(.(.(.(.(.(.",
+"B N A Z B B Z A Z B N N B C B C B C C C C C C N B B C B C B B N C C C A A Z C A C C C C N A C C C C C C Z Z C C Z C C C C F C C C C C D Z Z C F C C F C C C C C C C A C C C F C Z C C C C Z C D Z C C D C D Z Z C Z C C C D Z C Z Z Z D Z Z Z Z D Z D D D H H H H L L L P H J J J J F Z J L L H L P T F.U.U.L.Y.P.P.T.P.U.U.T.U.T.T.T.T.T.T.T.T.T.T.[.T.~.~././.^.^.(.(._._._._.|._.|.|. X X XdX.X.X@X'.dX'.dX.XdXdX.X.XzXzXzXzXzXzXxX'..XzX'.'..X.X.X.X.X.X.X.X.X.X'.zX.X.X'.zX.XzX.XzX.XzXdXdX.XxXzX.X@X.X.X.X.XdX X.X.X X.X.X|.|.|.|.|.|.|.|.|.`.`.`.|.|.|._._.|._._.|.(.(.(.`.^.^.(.(.(._.(.(./.^.(.(./.(./.(.~.(.(.(.(.(.(.(.(.(.(.(./.^.(./.^././.(.[./.^.(.~.(.(.(.{.! ! ^ ZXAXZXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX<XtX,X2X2X1XtX0XwX0XwX,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X3X6XO.X.O. .+.8X:XyXwX0X0XwX9.,.>.:.,X1X6X..X.X.X.X.8XtXtX4.,.qXwX2X,X,X,X,X,X2XwX>.>.wX1X,X,X,X,X,X1X2X>X3X6XX. .X.X. .o.X. .O. .o.o.6X3X2X1X,X;.>.4.wXwX5.4.wX0X,.0X1XwXqX;.>.qX1XAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXHXBX[ ! Q { Q.'.hXdXxXzXzX.XzXzXdXdX.X.XzXzXzX.XzX'..X X XdX.X.X|.|.|. X|.^.~ ! ! ZXVXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.z -X6X> z k *Xk - g qX-X:Xk O p + d z 2 4 x ;Xv 5 :X2Xk k k s l ;XsXeXwX*Xl n z k ;Xg 3 4.x 3 9.b & +.;X+ } -Xs g b j kXkX< ! { iX/ l g ' 8.< 7 k 4 z - @ a a z n eX/ z -X:Xk z h + p p d :X:X*X>Xk +. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.O.O.DXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX} ~ ~ { T w.T a.i.i.i.a.a.a.i.a.i.i.i.t.i.i.i.i.i.i.i.i.i.i.i.i.a.a.a.a./ / ^ HXCXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyXwXwXwXwXwX9.1.wX4.,.-.>.>.-.-.-.-.-.-.-.-.-.<.wXv g 9.;Xa ' } ;Xj 5.j z @ w @ d 7 3 < < 3 3 7 3 < < l - kXeX> O.X.X.X.| ! / @.W W 7 2 =.1 z @ h p g + + g 4 4 Z X.+.x v n 8X<.,.2.n W | @.;X:X4 d 2.0Xk v 8.8.b h v ;X:X1X:.2.<Xg <.>.-.-.-.FXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXGXAXAXCX' ! Q ` b.F.!.~.T.~.(.~.~.~.~.~.~.~.~.~.[.~.T.~.T.T.T.T.T.U.T.T.T.T.T.F.! / ' JXZXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXO.O.o.....7X8X<X:XeX0XwXv 4.-.<.4X5.>.>.<.1X5.,.:.wX6X .X. .X.3X>X1X5.>.-.:.6X . .X.X.+.n } =X- 3 2 =.7 l 8.z - :X8XO.o.o.X.o.8XtX6Xn 6X6X-XeXeX8X.. .o.o.X. . .X.o.6XyX;.-.;.>.-.5.8XX.o.X.X. . .O.O.6XwX;.-.>.qX4XwXwX0X;.>.,.4.4XwX:.5.1XwX<XAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXVXFXFXVXZX~ ~ ~ [ b.H.U.U.T.T.T.!.T.T.T.~.~.~.T.T.~.~.~.~.T.T.T.T.(.T.T.~.~.T.~.~.~./.~.~././././././.(.(.(.(.(.(.(.(.(./.(.(.(.(.(.`.(.`.^.(._.(.(.(.(.(.(.(.",
+"N Z @.C Z N C N N C C C C B C B C C B N N C N C C B B C B C B Z C C C C Z N C N C C A N A C C C C C C C C C C Z C Z F C Z C C Z C C C C B Z C C B H C C A C C C A C B C C B C C C A C F Z B C C C Z Z B Z B Z C Z D A Z Z B Z Z Z C Z B Z Z S F D D D D H Z H H H H H H L H J H H J J J Z H L L L Z U [ L.U.U.U.T.P.P.T.T.T.T.T.T.T.T.T.T.P.P.T.T.T.T./.~./././.(.{.(.(.(._._.|._._.|.'. X'. X@XdX.XdXdXdXdXdXdX.XdX.XzXzXzXzXzXxXxX.XzXzX.XzXzX.X'.xX.XxX.X.X.X'..XzX.XzXzXzX'.zX'.zX'.zXdX'.zX.X.X'.zXdX.XdX.X.X.XdX'..X.X|.|.|..X.X.X'.'.|..X|.|.|.`.`.|.`._.|._.|._.`.^.(.(.!.^.(.(.(.(.~.[.(.(.(.(.(.^.(.(.(.(.(.(.!.(.(.(.(.(.(.(.(.(./.(././.(.(./.(.(./.(.[.(.(.^.)./ S ^ ZXZXZXFXAXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXKX<XyX2X>X,X2X2X1X1X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,XtX6X.. . .X.O.o. . .o.+.8X3X2X4X9X:.9XwX3X6Xo.X.X.X.O.+.<X0X,.>.-.<X1X2X,X,X,X,X,X,X,X5.>.wX2X,X,X,X>X,XuX3X8X.. .X. .X.X. . .o.X...o. ..... .6XtX2X0X-.-.-.>.5.1X1X1XwXtX,X,X4XwX>.5.yXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXHXBX} ! ! c.m.].'.dX'.'..XzX.X.XzXcX.XzX.XzX.X.XzX.X.X@X.X X.X.X|.|. X|.|.].~ ! S CXAXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXo.l x ;Xz z :X:X;Xl -X:X*X5Xz s 8X/ d z 2 l h w a l <XuX-X2.0Xs z *XM.:X:X*Xw l z -X;Xg 3 3 x o 2 g + @.f , @./ d v 7 4 n x < x @.@.@.k @ 4 k O p a d a k - o h c { iX/ z b b a d z l z x z k >X-X-X} +. .X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.o.O.O.hXDXDXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXCX' Q ^ [ R R u.a.i.i.i.d.i.a.a.a.i.a.i.i.a.i.i.a.i.i.i.i.i.i.a.a.s.a.a.s.! ! Q CXZXCXFXZXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX8.;XtX-X>X>X>XtX<X1XtXwXwXwXwX9.-.-.-.-.-.-.:.wXtX1Xv h 9X*X@ +.7X1X-X7 k 5 s :X/ @ 2 2 < 7 2 2 =.=.2 =.7 z sXj K O.X.X.X.O.O.....+.+.+.L K c c | } c x } +./ l b. .K P 8.n a -Xj b :X5 & %   O a O d 2.9Xg v 1.;.4.b v wXwX0X,.5.<Xk <.-.-.-.-.FXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXAXAXAXBX[ ! Q ` b.F.!.[.(.~.~.!.~.~.~.~.~.~.~.~.~.~.T.~.T.~.T.T.T.T.T.T.T.T.T.L.Q / [ BXAXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXGXo.o.O.o.+.wXtX4X9.>.-.9.v 4.-.:.wX9.-.>.<.1X5.>.-.:.wX7X .X. .O.:X1XqX>.,.<.6X . .X. .o.f | / h 2 =.2 7 x gX8.p 6Xo.X.o.o. .8X:X;X:Xv v *X0X>.,.9X6Xo. .X.X.X.X.X.X. .6X;XeX:XeXeX8Xo. .X.o...6X3X8X:X>X:.-.-.>.4.0X:.>.>.-.-.-.-.4.2XtXyX1X1X2XAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXVXZXFXAXFX~ ~ ^ e.n.F.U.R.T.T.T.!.T.T.~.T.T.~.~.~.~.~.T.~.~.T.T.~.T.T.T.T.~.T.~.~.~./.T././.T.~./././././.(./.(.(./.(./.(.(./.(.^.(.(.^.`.(.(._.(._.(.(.(.(.^.",
+"Z A Z N A Z Z N C N C B B C B C B C C C C C C C B C C B C B B B C C C C C C C A C C C C C C C C C C C C C C C Z F C Z C B C C Z C Z C C C C C D B C Z C C C C C B C C C C C C C C C C C C Z C Z Z C Z C Z C Z Z Z B C Z Z C Z C Z B Z Z Z F F Z A H D Z D H F H H H H L H K J H H J J H H H H H H H U Z.U.Y.L.K.P.Y.U.Y.U.T.T.T.T.T.T.T.P.~.~.P.[.T.T.~.~./././.(.(.(._.(.(.(.|.|.|.'. X.X.X.X.XdXdXcXdX'.zXzXdXdXdXzXzXzXzXxXzX.XxXzXzXzX.X.X.X.XzXzX.X.X.X.XdXzX.XzXdX#X'.zX.X.XzX.XzX.XzXdXdXxX.XzXzXzX.XdXdX.X.X.X.X|..X.X X.X|. X|. X|..X.X|.|.|.|.|.|.|.|.}.}.`._.`.(.`.^.(.(.[.(.(.(.(.(.!.(./.[.(.(.(.(._.(.(.(.(.`.(.(.(.{.(.(.(./.(.(./.(.(.(.(.(.(.(.(.^.(.(.[.(.~ ~ ^ ZXFXFXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX7X .+.3X<X3XyXyX,X,X2X2X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X2X,X7X.. .X.X.X.X.X.X.X.X.X.X.+.8X:XeX3X6Xo...o.o.X.X.o.X.8X1X4.;.;.wX2XwX1X,X,X,X,X,X1XwX,.wX2X2X2X,X:X3X6Xo..... .X.6X8X6X:X8X:X8X:X8X:X6Xo.....8X,X1X0X,.>.5.1X,X,X<X2X,X,X2XwX0X,.9X2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX' Q ^ [ m.].dXdXdXzX#XzXzXzX.X.XdX'..XzX.XzX.X.XxX.X.X.X X.X|..X|..X|.!./ ! ^ ZXVXFXFXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXVXo.l w z - h v -Xb l b b ,X2Xx s -Xc d v d g l g z - k -X-X9X*Xp z *Xb g :X*X5 @ @ z v h @ @ @ + @ a @ - - - + , + g g 5 @ + d z u - l x w p p z w s -   :X} + g c @.W @.v :X;Xa a v p :X;Xz a v b -X+.X.X.X.X.X.X.X.X. .+.X.X.X.X.X.X.X.X.X.X.X.7XDXSXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXBX' / S [ T T p.i.i.i.i.a.a.a.i.i.i.i.a.a.a.i.i.a.a.i.i.i.i.a.a.a.a.a.a.a.S / S ZXFXSXZXFXAXDXGXSXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXx KXkX8.:X1XuX5X5XuX2X1X2X2X4X5.>.-.-.-.-.-.:.:X2X,Xv v -Xf x t v k p s p z s -X6Xw j l gXsX6 2 2 < 7 2 7 @ O # @.O.X.X.X.X.X. . .| | O.O...| | +.u t u q.i x t i 3 o M.iX/ d n z k :X@ 8.n O n n 4 l a p @ b ;.-.,.8.v <.>.>.>.4.:Xk <.-.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXAXHX} ! ! ) b.F.].~.~.(.T./.~.~.~.~.~.~.~.~.~.~.~.T.T.~.T.T.T.T.T.T.T.T.T.Z./ / ' BXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXHXO.O.O.7X4X4.9.4X4.,.;.9.n 4.>.>.>.-.-.<.tX,X<.>.-.>.<.8X . .X.o.+.8X:XeXeXeX6X .X.X.X.+.v % - g g 4 7 g a x v } o.o.X. . .6X5Xb - @ - @ k 0X;.;.>.9X6X ... .X.X.X.X.X.O.o.O.X. .X. ...X.X.O.6X,X>X>X,X1XwX-.-.-.-.>.-.-.-.-.-.-.-.>.4.3X4XtX0XwXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXZXAXFX~ ~ ~ e.b.Y.U.T.T.T.Y.!.~.T.T.~.~.~.[.T.T.T.~.T.T.T.~.T.T.T.~.T./.~.~.~.~.T.~.~.T.~.!./.~./././.(./.!.^.^.(.(./.^././.(./.(.(.(.^.`.(.(.(.(.(.(.(.(.",
+"N C N C N C N A N C N B C B C A C N N C N N C N B B B C B C C C C C C C C C C C C C C C C C C Z C C C C C C C C C C C C Z C C B C C C C C D C B Z C C C C F C C A C A C C C C C B Z C C D C Z C Z C C Z C Z C C Z C A A C Z C Z Z D Z B Z Z Z Z D D D D D H H H H H H H J H H J J J H J L L L H Z H L b.K.U.Y.L.L.U.T.U.T.U.T.T.Y.T.Y.~.P.Y.P.~.T.T.~.~.~.~.^.[.(.(.(.^.{.|._.|.|. X X X'.@XzX.XdXdXdXdX@XzX.XzXdX@XzXzXxXzXzXzXxX.XzXzXxXzX.XzX.XzXzX.XzX.XdX.XzX.X'.dXdXzX.XzXzXxX.XzX'..XdX#X.XxX.XzXzX.X XdX X@X.X.X.X.X|..X|..X.X|..X.X.X|.'.`.@X|.|.`.|.|.}.|.|.(.`.`.(.(.[.(._.(._.~.(.!.(.(.(.(.(.{.(.(._.!.(.(.!.(.(.(.(.^.(.(.(.^./.(.(.(.(.(./.(./.!./.(.(.(.(.(.~ ~ ~ ZXAXFXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX<X+. .o.+.<X<X2X<XtX<X2X<X,X,X,X,X,X,X,X,X,X,X,X,X,X2X6X .o. .X.X.X.X.X.X.X.X.X. .O. .X.X.O.O. .X.X.X. . ...O.+.:X1X4.>.tXwX:.0X2X,X,X,X,X,X,XwX,X,X,XwX8Xo.o.....6X3X8X:XuXyXuX,XyXyX2XtX,XyXyX:X8X ...6X2X1XwX0X2X,X,X,X,X,X,X2X,X:.9.wXyX3XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXHX[ Q Q c.Q.].'.dXzX.X.X'.dX.XzX.X.XzX.XzX.X.XzXdX@XdX.X.X'..X|..X_.|.|.!.~ S ^ ZXAXFXFXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXHX+.x :X*X:Xv 2 2 + l @ z b b l p a d d v z a z z z z z g @ + p k v g k k =X;Xw z *X:X:Xv z 5 l n @ z s p a z n z p z 4 h n z 7 2 3 7 2 2 < g 4 + a <X} + n ;Xg h g w w w v 4X>Xp ;X8X-X<X<Xl p z z , :X7X .X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.o.oXDXDXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXFXBX[ ~ S c.T w.t.i.i.i.i.a.i.i.a.i.a.i.i.a.a.a.a.a.a.a.a.a.a.a.a.i.a.f.a.a./ / ^ CXFXAXDXFXDXDXDXDXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFX8.sX4.2.:X:X:X:X:X:X:X:X,X,X,X<.-.-.-.-.-.-.-.<.2X,Xx >X8Xo.n 2 8.- @ l x p O + O h 7 l aXv 6 j h 6XaXg j z +./ / o.X.X.X.X.o... .| 6X{ i q.w n =.=.7 7 4 7 7 7 < 2 & W | @.z ;Xx k :Xh 8.q.O q.q.4 v ;X;X;X:X<.,.5.:Xv wX:.-.-.,.2.k <.>.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXAXAXBX] ! S ` b.F.~.~.~.~.(.~.(.~.(.~.~.~.~.~.~.~.[.[.T.T.T.T.P.^.Y.T.T.T.P.F./ / ' BXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXAXFX} n n ;X;Xb b :X;Xb 8.b k b x 2.b 9.:.wX4X5.-.>.>.;.wX2X7X .X.o.X. .o.X.X.X.X.X.X.X. .+.v h s h 5 - p a b -X6XX.X.X.X.X.8X>X1X;Xz n z + ;X9X5.wX5.,.9X8X.. .X.X.X.X.X.X.O.X.X.X.X.X. .X...6X>X2X,X,X1X1X0X-.>.>.-.-.>.4.0X:.-.-.-.-.>.4.wX:.>.>.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXVXVXFX~ ~ ~ c.n.F.U.T.T.T.T.].T.~.~.T.~.T.~.[.T.~.T.T.~.T.T.T.T.~.T.~.T./.T.T.~.~.T.T.T.~.Y.~.~./././.(./.(.(.(./.(./.!./././.(./.(.(.^.(.(.(.^.{.(.^.!./.",
+"C N C Z N A N N N N C N C N C N N C N C B N C C N C C N N C C C C C C A C C C C C C C C C B C C B C C B Z C C C C Z C C Z B Z Z D D V C C C C C Z C C Z C C C B C C C A C C C B F C C C C C Z Z B B C Z C C Z C D C Z Z Z C Z Z Z Z Z Z Z Z F Z Z Z G D H H H H H H H L H L L L L H P H Z L H H L L U Z.Z.Y.P.U.T.T.T.U.U.T.U.T.T.T.T.T.~.Y.T.T.~.T.T.[.(.E.[.(.(.`.(.(.^._.|.|.'. X X XdXdXdXdXdXdXxXdXzXzXdXnXdXdXxXdXzXxXzXxXxXzXxXdXzXzXzXdXzXxX'.zX'.dX.XdX'.zX'.zX'..XxXdXdXzXdX.XzX.X.X'..XxXzX.X.XzX.XzX.XdX.XdX.X.X'..X X|..X.X X X X.X|..X|..X X|.|.|.|.}.}.}.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.!.(.(.(./.^.(.(.(.(.(.!.(.(.(./.(.(././.(./.^.^.~ ! ~ ZXAXZXZXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXtX2X8X:X+...7XuX1X5.:.tX2X,X,X,X,X,X,X,X,X,X,X,X,X,X7X .X.o.X.X. .o.X.X.O.o.o.X.X.X...X.X. .X.X.X. .X.8X:X7X....+.4X0X,.2X0X,.:.tX2X,X,X,X,X,X2X,XyXyX8X .....6XKX2X>X1XwXwX2X2X,X,X,X,X,X2X,X,X2X>X8X.. .:XtX1X1X2X2X2X2X,X,X,X1XwX>.4.1X2X<XFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXDXFXFXFXFXFXFXZXFXBX[ ! Q ` m.'.'.dXdX@XzXzXzX.XxX.XdX.XzX.XzX.XzX'.#XdX'.@XdX@X|..X|. X.X!.~ Q ! ZXVXZXDXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXVXX.x -Xk k l j j j 8.x - k v p p :Xv -X:X:Xz ;X-Xp p z z -X<X;X>Xb z n z k b x sXh ;XuX-Xd l gXaX+ } -X@ z kXsX+ k v - sXgX@ 4 =.2 2 7 x < 8.=.+ w n ;Xh z a - z v :X:X-Xg z p s v :X-X>X<Xl a n x a :X+.O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.hXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX' / Q ' G y.s.s.a.a.i.i.a.i.a.i.i.i.i.i.a.a.a.a.a.a.a.a.a.a.a.a.k.a.g.i.S ! ^ ZXZXVXAXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXx eX8.j 0X>X:X:X>X:X>X*X2X1X5.,.-.-.-.-.-.-.>.<.2X2Xb } O.7Xv 4 7 v + x 7 - 7 8.s p 4 5 a w v v p l l 4 z > X.@.$ ` O...X.X.X.O.O...n =.2 7 g 6 7 @ a p 5 4 @ - a l 7 w % w g a @ h v w 5 j k k g @ b 2X;Xb ;Xv j -X>Xv wX;.-.-.>.4.-X<.>.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXFXZXVXHX[ ~ Q ` b.F.~.~./.~.~.~./.~.~././.~.(./.~.~.~.~.~.~.T.~.T.T.T.T.T.T.~.F.~ ~ [ BXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX;X2.b b l z ;Xb b 8.b b g ;X-X;Xl ;XwX1X,XtXwXwXwX4.wX4X1X7X..X.X.o.o.X.X.X.X.X.X. .X.:Xf } k p > } =X@ :X8Xo.o.o.X.X.8X>X1XuX:Xw n v p b ,.5.4XwX>.>.tX8Xo..... ...o.X.X.+.o.o.o.o.X...7XtX>X2XyX,XwXqX5.wXwX0X;.-.>.5.4XwX,.>.>.-.-.-.>.-.-.-.DXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXVXFXFXVXZX~ ) / [ n.F.I.T.T.T.T.!.T.~.T.~.~.T.~.T.T.T.T.~.~.T.~.T.T.~.T././.T./.~.T.~.T.~.T.~.T.~.~./.T./.~.~.~./././.^.(./././.!.(./.(.(.(.(.(.(.^./.(./././.",
+"Z A N N Z B C Z A C C C N C N C C N C N V N V N C V C C C C C A N Z N Z Z Z C C C C C C B B B B C B C C B C C A C C C Z C C C C C C C D C C Z C C C C C C C u B C C C V B A u B B C F C C C B C F Z Z C D C C C C Z D B C C Z C C Z B Z Z Z Z Z H F D D Z H D H H H J Z L D L L L D H H J L J H L L U [ U.Y.T.U.P.P.Y.U.T.U.T.U.T.Y.T.T.P.~.P.!.T.~.~.~.~.(.^.~.(.(.^.|.[.|._._.|.'..X.X.XdXdXdXdXdXzXzXzXzXdXdXdXxXcXcXxXzXxXzXzXzXcXzXzXzX.XxX.XdXzX.XdXdXzX.XxX.XdX@XxX'.@XdXzX.XzXzX.XzXzX.X.X.XzX.X.X.X.X.X.X@X.X.X.X X.X|..X.X.X.X@X X X X X.X.X|..X|..X X|.|.}.}.|.|.(.(.(.(.(.(.^.(.(.(.!.(.(.(.(.^.`.^.(.(.(.(.(.(.(.(.[.(./.(.(.!.(.(.(.(.(.(.(././././.(.`.(.(.^.~ ~ S DXVXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.<.,X>XyX3X6X+.+.,XwX<.<.tX1X,X,X,X,X,X,XtX2X,XtX2X6X.. .X.X. .O.+.6X8X:X7XO. . .X.X.X.X.X.o.X.X.X.O.:X,X>XuX6X..O.6XyXwXuX,X0XwX,X,X,X,X,X,X>X,XuX3X6X.. .6X3X>X>X2X1X0X,.,.wX2X,X,X,XtX,X,X,XtX2XyX>X8X..7XtX>XtXwXwXwX,X,X,X1XwX:.-.>.0X1XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXZXFXHX' Q ^ [ m.].'.dXdX.X.X.X'.'.zXzXzX'.zXzX.XzXzX.X.X.XxX'.dXdX|..X X.X.X].~ S Q ZXVXZXDXVXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXSX+.x k 2.k h 7 j 7 8.4 z k k 0Xk *Xv k -Xk k :X*X2.k h a v ;Xb v v - c z g l l l p v uX-Xz h sXx   W Q @ d sXx + g 7 a sXx + 4 2 7 O aXgXo 7 2.4 l g h z z z b -Xg k p -X:X} - @ a d @ v b l a x l g +.O.O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.oXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX[ / ^ [ T T t.t.a.s.i.a.a.a.i.a.i.a.a.a.i.a.a.a.a.a.a.d.k.a.a.a.i.a.a.a.~ ! ^ ZXFXAXZXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDX0X0Xb ;X>X5X1X1XuXuXuX*X>X1X4.,.-.-.-.-.-.-.-.:.2X,Xv +.| -Xs O + O O O O a x kX2.a x 7 7 3 7 4 - d w 4 7 4 o + < Y O.o.X.X. .` J / w 2 7 d 6 4 d p iXuX4 2 4.x + b ;X;X;Xz j l z h d a b :.qX<Xb z v b - a a *XsXd k v <.>.-.-.-.4.v <.-.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX' Q Q Y n.F.Q.~.^./.~./.~./././.~.!.~./.~.^.~.!.!.~.~.T.T.~.T.~.T.T.T.F.! ~ _ BXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX9.,.,.<.b l :X9.,.;.,.4.v ;X-X3Xb l -X2X<X<X,XwXwX4.:.0XwX:X6Xo.X.o.o.X.X.X.X.X...o.3Xb : | c p > | / @ 6X..o.o.o.O.o.:X;X;X;Xv 5 a + w ;XqX,.tX4XwXwX<X2X3X8X:XeX8XO. . .o.o.o.o.X.X.8X0X;.0X2X5X,X:.,.qX4X1X4XwX;.-.>.5.0X4.wX0X:.-.-.-.-.>.>.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXAXZXFXFXFX~ ~ ) e.b.F.I.T.T.T.T.!.~.T.T.~.~.~.~.~.~.T.T.T.T.T.P.~.T.T.T.T.T./.~.T.~.T.~.T.~.T.T.~.T.(.T./.~.(.^./././.^.~./././././././.(.~.(.(.^./.^.(./././.",
+"C N C Z B C B Z N N Z N C N C N M C N V N A M A C V N C C C A C C C Z C C N C C C C C C B C C N C C B C C C C C Z C C C Z Z Z C C Z C F C Z C Z C C C C C C C C C C C C C C C C C C C C C Z F C Z C C D F B D C Z Z C Z Z Z D B D B D Z Z Z Z D D A D D S D H F H Z Z H H H H H H P H H J L H H L L U Z.L.L.Y.U.Y.L.P.T.T.U.T.U.T.T.T.P.~.P.T.T.T.~.~.[./.(./.(.(.(.(.|._.|.|.|. X X.X@X.XdXzXzXzXdXzXzXzXcXdXcXcXdXdXnXxXxXxXxXxXxXzXcXxXzXzXzXzXzXzXzXxX.X.XdX.X.XdXdXzX.XdXzXzX.X.XzXzX.XzXzX'.zX.XzX.XzX.X.X.X.X.X.X.X.X X X|. X|..X X.X X.X.X|. X.X.X X|. X X|.'.|._._.|.(.(.(.(.(./.(.(.(.(.^.^.(.(.(.(.(.(.^.!.(.(.!.(.(.(.(.(./.^.(.(.(._.(.`.^.(.(.[.(.)./.(.(.(.`.~ ! S ZXVXZXZXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXSX9.,.9.<X1X<XyX<X+.6X5XyX<.<.wX<X1X,X,XyX4.<.2X,X>X8X..X.X.X. .O.8X3X1X5XyXyX6X:X7XX... .X.X. . . .X.8X,X,X,X>X8X.. .o.:X>XtX2X2XyX,X2X,X>X>X>X3X3X6X....o.6X>X>X1X:XwX0X>.5.wX,X2X,X,XtX:.wX1X,X,X,X,X>XyXX.o.6XtX:.>.,.,.0X1X2XwX;.>.>.4.2X,XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXHX' Q ^ c.m.].'.zX'..XzXzX'..XdX.X.XzX.X'.zX.XzXzX.X@XdX'.'. X|. X.X|.|.!.~ Q ^ ZXVXFXZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.l k k s z 7 7 5 @ @ z h -Xg k -Xb g 2.j p :X*Xj k z k g p p a u n n - g ;Xk *X;X:XuX-Xz z 5 5 - - - d z a w 5 @ j g a @ h z kXBXO 8.n O a a z l z l w h 4 g *X:X/ a *Xn -Xk g z z a a z d a s p /  .o. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.7XDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXVXCX[ ~ Q { T w.i.i.i.a.i.a.a.i.a.a.i.k.a.a.a.a.i.a.a.k.a.k.a.a.k.i.a.a.a.a.~ ~ ! ZXFXAXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDX3X2XyX1X;X;X;Xn ;Xv v k >X1X5.,.>.-.-.-.-.-.,.<.2X,Xv :Xv > } s h l sXn h x O o   O z =.=.=.=.4 7 7 7 7 z 7 7 KXaXw +. .o.X.O.w 3 IX;XO j w aXsXO z iX5X6 2 3 j @ x ;X:Xb z + + + 6X:Xp v :.2.z ;Xh a g *XsXg k n 5 + v 1.-.-.-.-.2.v <.-.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXZXZXHX' Q Q ` b.Y.~.~.~.(.~./././././.E.[.(././.~.~.T.~.~.T.[.~.T.T.T.P.~.T.F./ ! ' BXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGX9.:.wX<.<.;Xl ;X:.,.0XwXx b x 4.9.:Xf ;X3XuXqX,.,.,.,.,.,.<.wX6X..O.o.X.X.X.X. .X.:X-Xv + % & h @ , $ p x / } / } } n v @ w 5 h h w k -X;X4XwX2X2X1X1XwXwXwXqX;.-.5.wX8Xo...O.O.....8X0X;.,.0X1X,X2X0X,.qX4XwXwX0X;.-.>.>.,.qX4X1XwX;.>.-.,.4.wXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXVXZXAXFXFX~ ~ ~ b.n.D.I.Y.T.T.T.~.Y.~.~.T.T.~.~.T.T.T.T.T.T.T.T.~.~.T.~.T.~.T.~.~.T.~.T.~.T.T.T.T.~.T.T.~.T./././.(.~././././././.!./.~.(.~././.~././././././.",
+"C C C N C B C B A N A N C N N N C N N A C V B C N C N C C C N C Z C C C A C C C C C C C C B C C B N C C C C C C C Z C Z C C C C D C C C C C C C C B Z C C A C B C B N u C C C C C C C C C C C C C C Z B C C C C C C C C Z C Z D C Z Z Z Z F D Z D Z Z D D H H H H H H H H H H H H H J H Z H H H L Z G [ K.U.U.Y.L.U.U.U.U.U.U.T.Y.P.T.T.P.~.T.T.~.~.~.~././.(.(.(.(.^.`.|.|.|.|.'. X.XdX.XdX@XzXzXcXzXzXdXxXcXcXdX@XxXcXxXvXzXxXxXxXzXzXzXzXxXzXzXzXzXzXdXdXdXdXzXzX.XdXzX'..XzXzXzXzX'.zXzX.X.X#XzX.X.X.XzX.X'..X.X.X.X.X.X.X X.X.X.X.X.X.X|..X X.X|..X.X.X.X.X X'.|.|.|.|.(.|.`.(.(./.(.(.(.(.(.(.(.(.(.(.(.(.(./.(.`.(.~.(././././.(.(.(.(.(.[.(.(.(.^./.{./.(./.(.(.[.(.~ ~ ! ZXAXAXFXAXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXyX1.>.<.,X1XtXyX3X7X2XyX:X<.,.<.wXtX1X5.,.<.2X,XuX+. .X.X.X.X.:XuX<XwXwXwXwXtX,X>X8X6X .X.X. . .8X3XyX,X,X2X<XuX7X ...+.8X3X<X3X2XtXyX,XtX>X6XX.X.X.6X:X8X2X2X1X0X,.>.>.5.4X2X,X,X2X1XqX,.0X1X,X,X,X,XtX<Xo. .8X>XqX,.4.wX<X2X,X:.>.,.,.qX1X,XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXHXBX[ ^ Q c.Q.'.]..XzXzX.X.XzX@XdX.X.X.XdX@X'.zX.X.X.XdX X.XdX.X|..X|.|.|.(.~ ! Q ZXVXFXZXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.l >X>Xv x :X-X:X:X:Xl w v v v v v v j k p v b v v z g -X2.*Xa / eXiX} k g *X=Xk :X5X-Xp h h z g g @ a z z g h -X-Xx p k @ z b v 3 - @ a l l a 5 c z 5 2.=.g :Xn ;Xv v z a a v z @ d h @ @ h g z +.o.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.oXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXZXVXBX{ ~ ^ ` T w.i.i.a.a.a.i.a.a.a.f.i.i.a.a.i.a.a.a.a.a.i.a.f.z.i.a.z.a.a.a.~ ! S ZXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZX,X,X2X<Xl ;X;X;Xz v n + :XyXtXwXwX9.>.>.,.,.<.wX1XyXv j v > | c @ > } @.g k *Xw n 6 @ 7 3 < < 4 4 =.2 2 7 < 7 aXv 2 i .. .o.O.{ j gXn g j d sX8.4 4 3 6 2 3 k k -Xb % 6 + 4 z n + ;X6Xs x ;Xb -X:Xw sXl k n g a v *Xg b :.>.>.,.4.:Xk <.,.>.,.9.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXZXnX} Q ~ ` b.F.].~./.(.~./.!./././.(.^.^.^././.!.~.~.~.~.T.T.~.T.~.~.[.T.F.S ! } fXHXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXyXyX3X<.>.4.-Xv 4.4.4X1Xv ,Xv b b -Xx l b -Xb 2.x 8.j 9.,.,.<.4X7XO.O.X.X.o.O.o.8Xb 4 g z n c l k =X*Xg v } / / / / ;Xx d n z + z sXg k ;XwXtXwXwXwX9X-.>.-.-.-.-.>.,.5.8X:X6X8X;XeX0X;.-.>.5.2X,X2X,X>.qX1X:.>.>.>.4.0X;.,.5.1X<X1XwX-.,.4.3X2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXZXZXAXAX~ ~ / Y n.F.U.T.T.T.T.].T.T.T.~.~.T.T.~.~.T.~.T.T.T.T.Y.T.T./.T.T.~.T.~.~.T.~.~.T.T.T.T.T.~.T./.~.T.!.~./.~././.~././.~.~.~.~.~.~.~./././.~./.~.!./.",
+"N C C C N C B B C N N N C N N A M C C V M A C N C N C C C C C C C C C Z C C Z Z C C C C N C N C N C B C C C C A C Z B Z C C F Z C C C C C C C C C Z C C C C C A C C C C C A C C C C A C C C C Z C C C Z C C C Z C Z C Z C Z Z B Z Z C Z Z Z Z D D D D D H D H H H H H H H H H H H H H H H H H H L Z U T T.T.T.L.L.T.U.L.P.Y.L.T.P.T.P.T.T.T.~.Y.T.[.^.^./.^.(.(.`.`._.|.|.|.|..X X.X.XdXdXdXxXzXzXdXdXnXcXdXdXcXfXcXxXxXxXxXvXzXzXxXcXcXxXzXzXzXzXzXzXzXzX'.dXdXdXdXzX.X.XzXdX.X.XzXdXzX@XdX.XzXdX.XdXdX.X.XdX.X.X.X.X.X.X.X@X X.X X.X|..X.X.X|.|..X.X.X|..X.X.X X|.|.|. X|.{.{._.(.^.(.(.(.(.(./.(.^./.(././.(./.(.(./.(./.(.(./.(./.(.(.(.(.`._.(.^.(.(.(.(.(.(.^.(.(.(.(.~ ~ Q ZXVXAXZXFXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXtX1.>.4.4X4.9.5X6X+.3X2XtX<.>.>.9.1XwX0XwX2X>X6X.. .X.X.X.3XuX=X2.,.,.,.,.<.yX,X>X,X8X8X6X6X:X>X2X2X,XyXtX,X>X2X<X7X .O.o. .o.8X<X3X<X<X6X . .O.8X2X2X2XtX1X0X-.-.-.>.wX1X,X,X1XtX0X-.>.0X2X,X,X,X,X2X3X . .6XyX1XwX,X1X,X<X,XwX0X0X0XtX2X,X<XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXBX' / ~ ` m.].hXzX'.zX'.'..X.XdX.X.X.X.X.X.XdX.XdX'..XdX@X.X.X|..X|. X|.]./ S ^ ZXVXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXHXo.c -X>X;Xl <X1XyX>XyX:Xz k -X5.b l v v v g w ;X:Xb x h k g k p ^ @.@.7X:Xn a v sX@ :X>X:X:X:X:X:Xv v 2.b :X:X*X-X:Xz 4.qXv a @ + w x l z d - O sXgXp 4 7 j 4 b @ a d a - p O v -Xa n x @ d n x - +.o. .X. .X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.O...hXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXDXBX' / Q ' T w.u.i.i.z.a.a.a.a.a.d.i.a.a.a.a.a.a.a.a.k.i.k.k.a.i.a.i.k.i.d.~ ! S DXZXAXZXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3X2XyX>Xz b *X5Xk z KX5 :X>Xk ;Xv >XwXj j h :X-X-Xk z 2 7 a - - l - - - l v g + n 7 h x 3 lXv @ 4 3 O 2 7 g 4 a 5 < ] O.o.o...o.x + g 4 w z @ + @ l 7 7 7 j ;X-X:Xb h q.=X  z x + -Xk @ g - c eX6X@ b z + + @ z -X;Xb b <.4.wXwXyX6X6X7X{ M.{ 7XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXVXFXCX_ / ! _ n.F.L.~./.~././.!./././.(.(.^././././.^.~.~.T.~.T.~.T.~.T.~.~.K.~ ! [ BXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXyX1X4.-.-.9.1Xx b b ;X-Xl <X;Xx b b b ;Xb b ;X;X;X;Xf b j 8.v -X;X{ n 6Xn :Xn :X-Xb 2 7 | wXiXf =XiX=Xg 6X .X.O...} :Xb z b v a z n p @ b ,.;.>.>.,.,.>.,.,.>.>.,.,.,.-.5.4X2X3X;.-.-.-.-.-.,.0X2X,X1XqX4.0X;.-.>.4.1X4XwX,.5.4X1X4XwX4.wX,X2X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXFXFXVXFXS ~ ) b.b.F.U.Y.T.T.Y.!.T.~.~.~.T.^.~.~.T.~.T.T.T.T.~.T.~.~.~.T.~.T.T.~.~.~.~.T.T.T.T.T.T.T.T.T.T.~.~.~.~.!././.~.~.~.~.~.~.~.~.~.~.~.~.~./.~.!.~.~.",
+"A N N C C N B B N C C N C N C N M M V M N N N C N C N C N C A C A C A Z N C N C C A C C C N C B B B C B B C C C C C Z C Z C C C C C Z G C F C Z C C C C V A C B C C B A C B C C C C C C C C C C C C C B C Z C Z C C Z C Z C Z Z Z A Z Z Z Z Z D D Z D D H H H D Z S Z H J Z L Z H Z H H H H L U H L U T L.T.L.L.Y.U.U.U.U.U.T.P.Y.P.P.T.T.~.~.T.T.~.~.~././.(.(.(.(.|._.|.|.|..X'..X.XdX.X.XdX.XdXcXdXcXcXnXcXcXxXxXxXxXxXxXxXxXxXxXdXxXxXxXxXzXzXzXzXzXzXxX.X@XxXdXdXdXcX.X.XdXzX'..XxXdXdXzX.XdXdX.XdXdX.X.X.X.XdX X.X|..X.X.X@X X X.X.X|..X|.|..X|..X.X.X.X.X.X.X.X|.|._.|.|._._.`.(.(.(.(.(.^./.(././.(.(./.(./.(.(./.(.)././././.(.(.(.(.(.[.(.{.(.[././.(.(.!.(.(.(.(.~ ! Q ZXAXAXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX1XtX:.:.1XtXwXtX3X+.+.,X2XtX0X0XwX,X1X1X,X3X6X..X.X... .3XtX-X# j qXqX0X0XwX1X>XyXtX,X2X>X>XuX,XwXtX4XqX:.wX,X,X>X,X6X.... .X.X.X. . . . .X.6X:X>XtX<X,X2X0X,.-.-.>.5.2X,X,X1X0X:.>.-.,.wX1X,X,X,X2X>XtX+.....<X>X1X2X,X2X<X2X2X1X1X1X,X,X,X2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX} ~ ~ c.Q.].'.zXdXzX@XzX.X.X.X.X.X.XzX.X.X.XdX.X.X.X.X'..X X'. X|._.|.].~ ! ^ ZXVXFXZXFXFXZXFXFXFXFXFXFXVXFXFXFXFXFXFXFXFXFXVXVXX.} v *Xk g :X2X,X1X1X2X>Xv 2.,.:.:X-X;X<Xz ;X2XqX<.;X@ l v v z w c ;X:X;Xb a @ x @ -XuX2X5X1X5X:Xv ;X,.5.s k s -X:Xp j 0Xp z g l h 5 x a } }   sXn 5 z @ p @ z d p p a | 6Xs v <Xp z x v g z x z +.o.+.o. . .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...O.oXDXDXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXBX[ / Q [ T T i.a.i.a.a.a.i.a.z.a.k.a.a.a.i.a.a.a.a.a.f.k.a.z.f.z.i.i.f.k.~ / ^ ZXGXAXVXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXtX-X-Xg g n x k l k *Xk :X>Xx n @ *X:X*X6X, *Xj 4.< - 2 3 7 l g a a p z a -X:X*X*X*Xl g 4 sXn + f 8.l 2 7 z - l @ w > | o.o.X.X.6Xl 7 4 6 @ + h x g w a @ a a p - l 4 kX8.< + + g :X;Xj g c M.iX/ z g k -X:X-X;Xz + + z wX>X2X6X+. .{ 6X6Xm.{ M.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXZXVXBX} ~ ! ` b.F.].~././././.!././.!./././././././.~.~.~.~.~.~.T.~.T.~.~.T.F.! ! ' MXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDX3X1X9.>.:.wX2X;X;X;Xx b l 4.<.v 5.;.1.4X5.<.4X1XqX:.2.b b b b l b k a p h w h 5 a d 3 4 ! | | > =X=X=Xk { X.X.o.O./ z z h + @ g h + h p b 8.2.2.8.2.v 2.b v 8.b 2.2.b 8.4.9X4X1XqX-.>.>.>.>.4.1X,X,X2X<X,.-.-.-.>.qX1XwX1X0X4.wXwX0X;.4.tXwXtX,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXVXFXFXVXGX~ ~ ~ [ n.F.Y.T.T.T.T.].~.T.T.T.T.T.T.~.~.T.~.T.~.T.T.~.T.Y.T.~.T.~.T.T.T.~.T.~.T.T.~.T.T.T.T.~.T.~.T.~.T.~.T.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
+"m C C N N C B B C C m A N C N C N N N A A B C N C B C C C C C C C C C C Z C C A C C C C N C C C B B B C B C C C C C C Z C C Z Z D C Z C C C C C C C C C C B A A C C C B C B B C C C C C C C C C C C C D C C C C Z C Z Z Z C Z B F Z Z D Z Z D D D D A D D H H D H J H H J D H J H H H H Z D L Z L L D [ Y.U.U.Y.U.T.U.U.U.Y.P.P.P.T.P.P.T.T.T.Y.~.!.~.~./.(.(.(._._.|.|.|. X X.X@X.X.XdXzXxXzXzXxXdXcXcXvXcXcXcXxXxXxXxXcXnXcXxXJXxXdXxXzXxXzXxXcXzXzXzXzXzXzXzXdXdXxXdX.X.XcXdX.XxX.XdX.XdXdX.X.XzX.X.X.X.XdX.X.X.X'..X.X.X|..X X X.X.X.X X|..X X'..X.X.X@X X X|..X X|.|.|.|.|.`.`.(.(.(.!.(./.(.(./././././././././././././.(././.^./.^.(.(.(.(.|.(.(._.(.^./.(.)._.(.(.(.! ! Q ZXZXHXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3XtX1X4.,.<.wXwX,X2X2X+.+.3X2X1XuX2X2X>X>X7X....X.X.X. .+.>X2X# # -XuX1X1XtXtXwX1X1X2X2X,X,X,X1X0X>.:.wX4.,.:.,X,X,X,X1X8X:X6Xo.o.X. .O.6X3X8X,XyX,XyX,X2XwX>.-.-.>.>.wX2X,X2X0X-.>.-.-.>.0X1X,X,X,XyX>X8X .6X6X6XyX,X2X2XwX:.5.1X2X2X1X2X<X,XyXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX[ ! Q ` m.'.'.'.zXzX'.zXzX.X.X@XdXzX.XzX.X.X.X.X.X.X.X.X.X.X|..X|._.|.!./ ! ^ ZXVXFXFXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXO.+.b g 2.k >X2X2X2XtX,X,X-X-Xb k -X-X-X-Xg v -Xv -Xz z -X-Xp p z b -X;Xd @ @ @ @ d z :Xb v ;X;Xx z x 0X:Xj 9Xp v v k z z v g l 7 7 sXgX+ W W o h 5 @ l z + x a | ;Xs - @./ - v :Xp + O *Xz - @ d v v v / +...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.7XFXFXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXHX' ~ Q ` T p.i.i.i.f.i.a.a.i.i.a.k.i.a.a.a.a.a.a.i.i.i.k.i.f.i.i.k.i.i.i.! ! ^ ZXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX:Xb x @ @ n v @ h yX:XyX2X,Xl 8.x *X:X:X;Xb *X7 2.7 - 7 7 7 l k 4.k p j j :XuXyXuXuX;X2 2 6 4 w x lX8.h x w gXKXO sXg / O.o.o. . .;X=.< kXsXO sXaXz - :X@.p k 9Xk b 4 g w 4 g k l z z h k } Z / @.:X1.qX;X;X;X;Xw @ x v yX2X7X..6X6Xk 5X9.,.:.,.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXFXBX' ~ ^ ) b.F.!./././././.(./.(.(./.^./.^.[././.^.!.~.T.T.~.~.T.~.T.~.T.L.! / ' BXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX1X9.>.9.4X1X4XyX4.,.4.v <.1.v b 2.4.wX9.:.wX1XtX0X9.,.,.,.<.b ;X*Xj k k j *Xk j k 2 7 u 0 * x g @ s f }  .X.X.| c k k 7 n { h s *X-Xd p - @ d d p k v @ 3 @ - z z d a b ;.5.1X<X,.5.wXqX>.0X4X2X2X,X1X0X;.-.-.>.qX4X:.0X1X:.>.-.;.-.-.,.,.qX1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXVXZXZXVXFX~ ~ / U b.G.K.T.T.T.T.T.T.T.~.T.~.T.~.T.~.T.~.T.T.~.T.~.~.T.~.T.~.T.T.~.T./.T./.~.T.T.T.T.T.T.~.~.T.T.~.T./.T.T.T.~.T.(.T.~.~.~.~.T.T.~.R.~.~.~.~.Y.",
+"C N N C A N N C N N C N N N N N V A N C M N N C V B C N V Z C C C C C C Z C C C C C A C C N C N B C C B C C C C C C C C C C C C B C C C C G C C C C C C C A B C N C C A C u C C C C C C A C Z C Z C C C C F Z C Z C C C B C Z Z C C Z B Z D Z D D D D H H D F H H Z Z H Z H H Z H D H D L H H H Z L L T L.Y.U.Y.U.U.U.U.U.L.U.L.P.P.P.!.T.~.~.[.~.~.(.[.(.^.(.(._._._._.|.|. X.XdX.XdXdX.XzX.XxXdXcXdXcXdXcXcXcXcXcXnXnXvXnXxXnXdXxXcXxXxXxXvXxXdXcXxXxXxXzXzXxXxXdXdXdXxX.XdXxXzX'.#X'.dXdX.XdXdX.X@XdX.X.X.X.X.X.X'..X.X.X|.|. X X.X.X.X X.X|.|. X|..X X X X X.X.X|..X|.|.|.|.`.|.`.(.(.(.(.(././.(./.!./.(.!.(.!././.!././.!./.{./.(.(.(.(.!.(.(.(.(.(././.(././.(.(.[.(.~ ~ S ZXCXFXFXFXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3X2X2XtX:.-.;.>.4.4XyXyX7XO.+.3X<X3X3X<X6X.. .X.X.X.X. .+.uX,Xk s :XyX4X5.,.,.<.wXwXwX<X4X9X:.1XqX,.,.-.qX0X0X,X,X,X2XwXwX,X,X6X8X6X6X:XyXuXwX,X5XtX2X,X1XwX,.>.>.5.wXtX,X2XwX;.5.5.>.>.>.0X2X,X,X,X,X<X .7X>X2X .6XtX1XtX:.,.>.5.tXwXwX2X1X2X2XFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXCXCX' ! ! [ m.].'.zX'..XzX.X'..X.X.XxX'..X.X.X.X.X.X.X.X.X.X.X'..X X|.'.`.]./ Q S ZXAXFXFXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXo.} v k k s ,X1X1X1X1X1X:X0X2.2.2.2.-X-X:X-X:X-X;Xj 2.9XwX:X2.b d b -X-X:X:X:X:X:Xk d a a p a p d p @ -X>Xg j p z g z w b k h d g g sXn + -Xf p z z g b 5 sXIX+ @.| ; z -X-X-Xb :Xp sXx k l *X-Xb d x v - +.O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.oXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXBX[ ~ ^ { E T i.f.i.i.a.i.z.k.i.z.a.a.a.a.a.a.i.i.k.a.a.a.k.i.k.f.k.f.f.i.! ! S ZXDXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX>Xn n g w a + @ g ;Xv ;X;X;X4 4 4 ;X;Xz z p b 5 a w d x l 7 7 j 5.*Xk j k -X2XyX:X;Xl 4 < 2 2 l 5 ;Xj 7 j z sXx + gX8./ o.X. .O.O.O.j 1 sXq.< gXn + l :X;Xk g j *X;Xz *Xg l g b v w @ @ v b w ; z :X0Xb e z h h h z x @ 6X}  .8X,X:Xv wX;.-.-.;.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXCX' ^ ^ ` b.F.!.~././././.(./././.(.(.^.~.E.(.~.[.~.~.~.~.~.T.~.~.~.~.[.F.! / ' BXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXyX,XtX0X4.wXwXwX<.:.0X<Xv 4.:.b b x ;X<.>.-.<.wX<X4X5.;.-.:.,.;Xx -Xj k s j *Xs j k 4 h g g p g v ;X} +.X.X.X.X.{ n k k ~ eXiX@.=XiX:Xs - c + + l sXg k 4 lXsX+ z n sXz b ,.>.0X2XwX,X2X0X>.5.wXwXwX,X,XtX:.>.;.,.4.0X4.2XwX;.>.-.-.-.<.wX0X,X2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXFXVXFX^ ~ ' d.n.U.Y.~.T.T.T.T.T.T.T.T.T.~.T.~.T.~.~.T.~.T.~.~.T.~.T.~.T.~.T.T.T.T./.T.~.~.T.~.T.~.T.T.T.~.T.T.T.T.~.T.~.T.~.T.~.~.T.T.T.~.~.~.T.~.Y.~.~.~.",
+"C V A N V C V B B N C N C m F M N B N B V B C B C N C N N C C V C Z A C C A C A C C C C C C Z N N Z N C B C C C C C C C C Z C C Z C C C Z C C C C C C C C C C C N C C N C C C N C C C C C C C C C C C C C C C Z C C D C C D Z C C D Z Z Z D Z D Z H H H Z H H Z Z L J Z H H J D Z H F H H D Z H H H H [ L.U.T.U.U.Y.Y.T.Y.L.Y.L.T.U.T.T.T.T.T.~.~./.(.^.(.(.(.^.`.`.|.|..X.X.X.X.X'.dXdXzXzXzXzXdXxXzXxXxXcXcXxXcXxXcXcXxXxXcXcXxXcXxXxXxXxXxXcXcXcXcXdXmXdXcXdXdXdXdXzXdXdXxXdX.XzX.XzXzX'.zX'..X'..XzXdX.XdX@X.X.X.X.X|..X.X.X.X.X.X.X.X.X|.|.@X'.'.`..X.X.X.X.X.X X.X X X X@X_._._._.^.(.^.^.(.(./.!./.~.~.~.(./.^.[./.(././.(././.(.).(.^.(.(.(.(.(./.(.^.^.^.(.(.(.(.(.~ ! ~ ZXAXFXZXFXVXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXyX,X,X1X4.,.>.>.<.wX2X>X2X+. .X.+.X. . . . .X.o.X.X.o.o.+.2X>XyX1X>X2X5.-.qX4.>.>.-.;.<.wX4.9X1XuX0X0XwX4XuX2X5X2X2X0X>.>.:.tX5XtX>X>X>X>XiX6XeX0X5X<X2X<X5.5.0X0X2X1X,X,X,XtXwX1X1XwX0X0X,X2X,X,X,X>X8X6X>XtX>X6X..6X<XtXwX5.-.;.,.-.;.5.tXtXwXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX} Q ^ c.Q.].'.dXdXzX.XzXzXzX.X.X.XzX.X.XdX'.'.'..X.X.X.X.X.X@X'.`.`.`.].~ ~ S ZXVXZXDXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXO.+.b :X:X5.0X0X0XqX0X0X<.>.>.>.,.>.:.qX0X0X0X0X9.>.,.,.:.-Xk k a :X0X0X0X0X0XqXwX*Xj 0Xk k 0Xk k 0Xa x ;Xv v d z v z h z v v 2.-Xs p p p -Xp h a + z g a 6X8.O - - p g :XuX;Xg v p n g + x >X>X>Xz l x z +. . .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.7XGXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXBX[ / ! [ T w.i.s.i.d.i.a.k.k.i.z.x.a.a.a.a.a.a.a.a.a.f.a.a.a.a.g.i.a.a.i.~ / S AXZXFXFXFXFXFXFXFXFXFXFXFXZXDXFXFXFXFXFXFXFXFXFXFX;X@ @ @ l ;X;X:Xz z v v z z v g z w z - z k z z l z x z z 4 < + p k k -X:X>X1X2Xv v b b b 7 7 z 2 2.2 2 7 d - 5 @ x l / O. .X.X.X.O.n x v p + g - 5 g z h g v v -Xb h z k v w z s ;Xl p ;X;Xh p g h d p p k ;Xp g k t Z O.6X6X5X3X:Xk <.;.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXAXAXBX{ S S _ b.Q.!.~.(.(.!.(./.(.(./.(././././.(./.~./.~./.~./.~.~.~.~.~.T.F.~ ~ [ BXHXZXDXDXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.<.wXtX<.,.>.,.>.1.4X,Xv 9.>.>.<.b x ;X<.;.>.<.1X4X5.>.>.>.-.<.b v v v v v v v v -Xv j *Xk j k :XKX+.o.X.X.o.+.u b a 5 / | | @.=X=X=Xs w W @., x { p @ z sX8.< d l b d b <.-.0X4XuX,X:.>.,.-.,.,.;.wX1X4XwXqX;.;.>.9.1XwX:.4.0X;.-.>.5.4X1XwXwXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXZXFXFXZX! ! / T n.K.Y.T.T.T.I.T.I.T.T.T.T.T.T.~.T.~.T.~.T.^.T.T.~.~.T.T.T.T.T.T.~.T.~.~.T.T.[.T.T.P.~.T.T.~.T.Y.T.T.T.T.T.T.T.T.^.T.T.T.T.T.T.~.T.~.T.T.T.~.",
+"N N M B M N C B N V N V M N m B B N B N B B B B N C N C C C C A C C C C C C C C C A C C N C N C B N C N B N B C A C C C C C C Z C C C Z C C Z A C C A C N N C N B B C C C C C C C C C C C C C Z C Z C C C Z C C B D B C C C C Z Z B Z C Z D D G Z Z Z Z H L Z L H Z L H H H Z H H Z J Z H H H H H D H Y F.L.T.T.T.T.P.P.U.L.U.U.U.T.T.T.~.~.~.~./././.(.(.(._.`.`.|.|..X X X.X.X@X.XdXdXzXzXcXzXdXzXxXcXcXxXcXcXfXnXcXcXcXcXxXcXcXxXxXxXxXxXxXzXcXdXcXvXdXdXdXdXxXzXzXdX.X@XdX.XzXzX.XzX@XzX.XzXdXdX@X.X.X.X X.X.X|..X.X.X.X.X.X.X|..X.X|. X.X.X'.|..X.X.X|..X.X'.|..X|..X X X|. X|._._.(.(.^.(././././././.~.(.~./.!.(.~./././././.(./.[.(.(./.(.(.(./.(.^.(.^.^.^.~.(.(.(./ ! S ZXAXAXFXAXVXZXFXDXFXFXFXFXFXFXAXFXFXFXFXFXFXFXZXSXyXyX2X,XwX0X0X<.>.,.4.1XtX3X8X+. . . ...+.8X8X+. .X.X.O.+.yX2X2X,X4X5.,.;.tX4.>.-.>.-.-.,.:.-X-X*X:X:X-X-Xv -X:X:X2XyXwX4.>.0X5.:.tX>X>X>X>X8.eX:X5X1XwX,.,.wX4X1X,X,X2X,X2XtX2X2X2X<X1X1X,X,X,X,X5X6X7X2XtX:.5.1X8X .6XyX1X4X0X-.-.-.-.-.,.,.;.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXHXCX[ / ~ ` m.].'.dX.XzX.X.X.XzX.X.X.X.X@X.X.X@X.X X.X|..X.X'.'.|. X_.|.|.].! Q ! ZXVXZXZXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXO.} b 5X9.,.>.-.>.>.>.>.-.-.-.-.-.-.-.>.>.,.,.>.-.-.-.-.,.2.0X0Xv 2.,.>.>.,.,.,.,.;Xp k s g k s g k s d a d b ;Xd z -X-X:X;Xb :.0X:X:X;X:X-Xa +.| - z g a + + a d z d a z v g l -Xk p + p h k -Xk z 5 -Xf X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.oXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXSX' / Q ' T w.s.d.f.i.k.a.i.a.a.a.f.a.a.a.a.a.a.a.a.f.z.a.g.i.a.a.a.a.a.s.L / Q ZXVXVXFXFXFXFXFXFXFXFXFXFXZXZXDXFXFXFXFXFXFXFXFXFXz z - -Xx :XuXuX;Xz *Xv + h p 5 *X;Xl c n - k *Xs g + < 3 p @ *X;X-X-Xv :X2X,X>Xn 2.,.:.2.b 8.b z 7 7 2 7 5 5 v 5 @ + / O.X.X.X.X.X.O.O.o.6Xg 5 + 4 h h l z z c n n k b :X-Xb x   :Xn k yX>Xk 0Xp a 2.9Xk g j s } 7XO.6X6X>X1XwX,.2.v 1.-.-.;.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXFXAXAXBX[ ! ! _ b.F.R.~.(.)././.(./.(.{././.(././.).!./././.~./.~.~.!.~.~.(.T.K.~ ~ ' BXDXCXGXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX4.,.,.,.,.,.,.,.,.9.4X2Xv 4.,.,.,.4.:Xv 4.>.,.1.1X4X5.,.,.,.,.<.b 4 7 7 7 7 7 7 7 z -Xj k k j k -X+. .X.X...7Xb w - p g w r > 5 g k s k 5 > % a a + a a g + + 4 a + - z b 8.8.:X;X;X;X;X2.2.8.8.2.2.-X;X:X1X3X0X;.>.5.wX:.>.4.wX:.-.>.4.wX<.>.>.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXVXAXZXFXFXZXS ~ ' [ n.F.Y.T.T.I.T.U.U.T.T.T.T.T.T.~.~.T.T.T.~.T.^.~.~.T.[.T.T.~.T.~.T.T.T.T.T.~.T.T.T.~.~.P.P.!.T.Y.T.Y.T.T.!.T.~.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.~.",
+"V N V N V N V B C V V V V V V V N B B B N B B B C N N C C N C C C C C C Z C C C C C C C C C Z N B C C C B C B N C C C A C C C C C C Z C C C C B A N C C C C C C B C C B B C B C C C C C C C C C C C D C C F Z C C H C C C C C C Z C D Z Z D Z Z Z H Z H Z H Z J H Z H H Z Z D D H H H H H Z H H H D H U L.L.U.U.I.U.Y.T.Y.U.U.U.U.U.T.T.T.~.~././././.(.`.`._.|.`.|..X|..X.X.X.XdX'.dXdX@XdXzXzXzXnX@XdXvXxXnXxXvXcXdXnXcXxXxXxXxXxXxXxXdXcXcXzXdXcXcXcXmXdXzXzXdXxXxXdXdXdXdXdX'..X.XzXdX.XzX.XdX.XzX.X.XdX.X.X|..X.X|..X.X.X X.X X.X|..X|..X'.'._..X.X'..X X.X.X.X.X.X.X.X.X|.|.|._._.`.^.(.(.(./././.[.!./.^.(.~.(.T.(./././.(./.(.(.^.^./.(.(.[.(./.(./.[.{.^.(._.[.(.(.~ ~ ^ FXFXAXZXDXVXAXFXFXFXFXFXFXFXFXGXSXFXFXFXFXFXFXAXDXyX<X,XtX1X4X4XtX0X:.<.1X,X,XtX<X8X6X8X6X3X2X5X6Xo.X.X.X.+.1XyX2X4X-X5.0X<.-.qX9.,.>.-.-.-.:.v 8.w -Xv 8.w + sXsX-X>X;X*X-X4.,.9XwX>X:X>X:X>Xb z -X5X<X,X5.,.qX1X2X,X,X<X1XwX:.wX1XwX:.wX2X,X,X,X>XtX6X6XtX2X5.;.qX1X3X6X6X3X>X4X0X>.>.>.-.-.>.,.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX' Q Q c.n.].'.dXdX.X.XdX'..XzX.X.X.X.X.X.X.X.X'..X.X.X.X.X.X|. X'.`. X(.~ Q Q ZXVXFXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXO.+.v <X:.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.>.-.-.-.-.-.-.-.>.>.:.b 2.,.;.-.-.-.>.,.5.0X2.0X9X9X9X0X0X:Xk 9Xa ;X1X3X:XwX1X4X:Xb <.9X-Xb v -Xb @ W W $ ;X:Xz a p - p a a @ p *Xz x -Xk g g p d j 9.*Xw @ -X5X<X+. . .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.7XDXAXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXBX' ! Q [ T w.e.a.i.i.i.i.a.z.k.i.a.a.a.k.g.a.a.g.f.a.a.a.i.z.a.a.a.a.a.a.! ! S HXZXVXZXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXx x g *Xb <X:X-Xv 5 k :Xk n 7 w :X1X} iX0XQ v k v n @ < j b 8.k >X,X1Xv :X5X2X1X-X2.;.-.,.,.;.:.2.;Xv 7 4 w aXaX+ eXg / O.X.X.X.X.X.X. .O.+.b 8.z @ a sXsX5 n { iXQ z b b g 6X:X- -X-X-X2X>Xg j s p j j k 6X} | O.6X6X4XuXtX0X4.wX<Xv wX:.,.-.>.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXAXAXFXBX} ! ^ ` b.I.!.(.(.(.(./.(.(.[././.^.(././.~.!./.~.~.~.~.~.~.~.~.~.~.T.K.~ ~ _ BXZXZXZXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXn 2.n 2.2.2.b x 2.;X;X;Xl b n j 8.b ;Xx b b 2.b -X;X;X2.b 2.8.b b 7 < < < 7 2 < < z v v v v v *X} .. .X.O.+.3X;Xw w k k a h *Xj 5 h 5 a a h k *X5 5 k *X9 n { n p z - h h 4 5 - a a @ - d a a d d d @ @ b 2X1X1X0X;.-.-.-.-.>.,.-.>.-.-.>.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXZXDXFXFX~ ' / [ n.L.Y.T.I.Y.I.T.Y.I.T.Y.~.T.T.T.T.T.~.T.~.~.T.~.~.T.~.T.T.~.T.T.T.Y.T.~.T.T.T.T.T.T.Y.Y.Y.P.~.Y.!.T.T.T.!.T.T.T.T.T.T.T.T.T.T.Y.T.T.Y.Y.T.T.",
+"N V N V M B V B N V B V M M N V N B B B m B B B V C C N C C C C C C C C C C C C C C C C N C N C Z N B B B B C B C C C C C A C C C C C C A C C A C C C C C C N C C B C N C B C B N A C C C C C C C A C C B C C C C B C C C D C F Z Z B Z D B Z Z Z Z Z H H Z Z H H L J Z Z P Z Z F H H Z H J H H Z H H I S.U.T.T.U.Y.U.Y.L.U.U.U.U.T.T.T.T.~.!.~.(.(.(.^.`.(.|.|.`.|.|..X.X.XxX.X'.dXdXdXdXdXzXzXdXdXxXxXxXxXcXcXxXxXJXcXcXcXxXxXcXdXxXxXxXcXcXdXcXdXdXdXcXdXzXzXdXdXdXdXdXdXdXdXxX.X.XdXdXzX.XzXdXdX'.dX.X.X.X.X.X.X.X.X.X.XdX.X.X|..X|. X.X.X X X'..X|..X.X.X.X.X.X.X.X|..X.X|. X X`.(.`.(.(.(.(.(.^./.~.~././.~.(.T.(././.(./././././.(.^.(./.(.(.(.^.(.(.^.{.(.(.(.(.(.(./ ! Q ZXFXFXDXFXVXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXAXDXyX2X5.<.tXwXwX,X4X9.:.tX2X,XtX>X>XuXtXtXyX,XuX7XX.X.X.X.o.+.>X,X2XO -X4X5.qX1XtX0X4.,.,.:.0X:XsX8.-X:XsX8.l gXx g -Xz 8.5 p *X-X:X>X*X*X:X5X:X*X>X5X,X,X1X5.;.wX2X1XwX;.qXqX,.0X4XqX,.0X1X,X,X,XuX6X6X,X,X2X<X,.>.9X2X,X8XO.7X8X1XwX0X5.;.,.4.eXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXZX' Q ^ c.m.].'..XdX.X@X XdX.X.X.XzX.X.X.X.X|..X.X.X'..X.X.X.X X X|..X`.].~ ~ ! ZXVXFXZXAXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.8Xv 4.>.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.:.b 2.,.;.-.-.-.-.;.>.>.;.-.-.-.-.-.,.*Xg k a ;X1XuX>X9X-Xb b x b b d - p p h @ - @ a x b f @ =X6X- g d sXl k k *Xv - 2.5.-X- j 9Xk + sXx k 5X6X . .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.oXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXAXCX[ ! ^ { T w.i.i.i.g.f.f.a.k.i.k.z.a.a.a.a.a.a.a.a.a.a.f.i.a.a.a.a.a.i.a./ ! ^ CXZXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXn x k :Xv :Xk v v z *X>X8.8.x h >XuX| / W f eXl + KXg g j b b @ :X1X5Xv :XyXyXuXv 8.,.>.:.=.2.4.;.:.8.b v x KXx + gX8./  .X.X.X.X.X.X.X.O.O.} sXeXa z sXn @ ~ ! ' W *X;Xv g v =X*XuX>X5X>X,Xn } / } { } } o.7X6X6X1XtXwXwX:.,.5.uX-Xg -X;Xj j 0XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXAXAXBX' ! ^ ) b.F.!.~././.(.{.(.(.(.(.(.^.(.^././.~.~./.~.^././././.~.~.~.[.F./ ! } BXHXZXZXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHX:X;Xb b b x b b b ;Xb b ;Xb -Xn *X;X;Xb b b l k *Xk z l n f f a h h z z a 5 z w d l @ @ d @ f 6XO...o.o.O.<X>Xb l :Xk k x 8.d -Xz b z @ z sXd k z sXg b S eXiX/ 5 2.2 + 5 8.sXO d } / + p | | + p } / o b 2X<X2X1X0X;.>.-.-.4.0X0XqX;.-.-.>.>.-.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXDXFXFXS / ] T n.Y.L.T.T.U.U.U.U.T.T.~.T.Y.Y.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.~.P.~.Y.T.T.P.P.Y.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.",
+"B N N N N N N N V N N V V N V N N B N B N N B B C C M C C C C C C C C C C C C C A C C C C C N N B B C N B C B C C C C C C C C C C C Z C C C C C C C C C C C N N B C B C N C C C C A N C C C C C B C C C C C Z C C C C C C C H C G B B Z Z Z Z Z Z U Z Z Z H Z H D H D Z H D H H H Z H H H H H H H F I U F.U.Y.T.U.U.Y.U.I.U.T.T.T.T.T.T.T.~././.^./.`.^.(.|._.|.|..X|..X.X.XxX.XdX@XdXdXzXvXzXzXnXxXxXxXxXxXxXcXnXxXxXnXxXcXxXzXxXnXcXcXcXcXcXnX@XdXnXdXzXzXzXzXzXdXdX.X@XdXdXdX.X.XzX.XdX.X'..XdXdX'.xXzX.X.X.X.X@XdX'.'.'..X.X.X.X.X|.'..X'..X.X.X.X.X.X@X X'..X.X.X.X.X.X X|.|.|.|._.(._.[.(.^.(././././.[.!.(.(.(.~././././././.(././.(.(.(./.^./.(.[.(.(.).(.(.(.(.{.(./ ! ^ ZXZXZXDXFXFXAXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFXDXAXyX3XwX:.>.>.,.4.1XtX:.4.2X,X,X,X,X,X,X,X,X,X>X6X . .X.X.o.+.3XuX>Xk -Xj :.,X2X:X:X;X2.2.0X-Xl n l v z v h O a g v l x kX8.h 5.b k :X1XwX:.0X>XuX1X>X,X,X,X2XwX,X2X,X,X0X5.,.,.qX0X;.,.0X1X,X,X,X:X7X2X2X,X,X2X9X>.,.0X1X2X:X6X6X..7X8X1XwX0XtX1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXCX' ! ~ ` m.hXdX'.@X XdX.XdX@X.X.X.X.XdX.X'. X.X.X|.'..X.XdX.X.X.X X X|.^.~ Q Q ZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXGXo.6Xb <X<.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.;.-.:.b 8.;.,.>.-.-.-.-.-.-.-.-.-.-.-.;.,.b v v x v b b -Xv w - O @ l :Xv | -Xp l p p d p p d d a =X6Xf a g n g p k >X:Xh j qXk w a d @ @ n z a >X1X<X7XO.X.X.X.X.X.X.X.X.X.X.X.X.X...hXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXZXDXBX' ~ ~ ` T R u.i.a.i.d.a.k.a.k.a.f.a.a.a.f.a.k.a.a.a.a.a.k.a.a.a.a.a.i.s.! ! ^ CXZXCXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXv v k :Xv z :X>Xl @ k -X@ 4 + z ;X;Xw r : @ z @ + a - < < @ @ a v :X;Xh -X-X;X;Xv b b 4.,.2.2.b 9.-.,.<.;X- + 4 + x c |  .X.X.X.X.X.X.X.X.O.| } | u u / S z u W @.} 7X8X;Xn 7X6X7X6X7X6X6X7XX.6X7X6X7X6X6X6X5XtXwXwX:.>.-.-.>.5.:Xv -Xb -X;X-Xv DXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFXAXAXCX' ! Q ` b.F.!./.(.~./.(.(./.^.(./.(.(./././././.!./.~./.~.~.~.~.~.T.[.K.~ ! ' BXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX1X1X5.,.;.>.,.9.4X1X2X4X5.1.wX>XtX4.;.,.4.v =XiX=Xh I eX0X@.g 4.*Xz 2 q.h @ l kXsX+ x 8.z |  . .....O.6X>X>X-Xl ;Xw @ x 6Xa @ z n x a x 8.p @ l { a @ n Z | @.4 2.2.@ z sX8.3 f X.W + - +.| - - W +.- -X2X2XtX<X1XwXqX;.>.5.4X1X4XwX>.<.wX0X:.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXFXFXVXGX~ / ~ [ n.F.U.U.U.U.U.U.T.U.Y.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.[.U.T.T.T.T.T.T.U.T.T.T.T.T.T.T.T.Y.T.T.Y.T.T.~.Y.Y.T.T.U.[.T.T.T.T.T.T.T.T.T.T.T.T.U.T.",
+"N V N N M M N V N B N N N N N N B N B B B B B C C N N C B C C C C C C C C N A C C C C C N C C C N C B C C B C B N C C N N C C N C C C C C C C C C A C C C N C C C B C B C C C B A C A C C C C C C C C C C C C C F C C C C C B C B Z Z D Z Z Z Z Z Z Z Z L Z H H D L H H H H H H H S H H H H H H P Z L U L.U.P.P.U.T.P.U.I.I.U.U.U.T.T./.~././.[.~.^.(.(.`._.|.|.'..X.X.X.X.X.X.X.XzXdXdXdXzXzXzXdXfXzXxXxXxXxXcXxXvXvXxXcXxXxXxXxXdXxXxXnXdXdXdXdXcXdXdXzXzXzXzXzXdX.XzXzXzX.X.XzXzX.XzXdXdXzXzXdX.XdX.X.X'..X.X.X'..X.XxX@X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X'..X|..X|..X.X|.|.|._.|.|.|._._.(.(./.(././././.[.(.~.~.(.!./.[././././././.(.(.(./.(./.(.(.^.(.(.(.(.`.(.(.(.S ! Q CXVXZXFXFXAXVXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFXAXDXyX,X1XwX0XqXqX9.wX<X<.<.1X2X2X2X,X,X,X,X,X,X>X<X+. .X.X.o...+.uX,X,XO =.1.yX2Xv w - a z - d a + a l v z 5 sXsXj <.b @ l f O 5.0X-XuX4X0X,.,.:.:X2X,X,X,X,X,X2XtX,X,X,X1XyXwX5.,.>.>.5.2X2X,X2X8X6XtX,X,X,X2X2X1X0XqXyX2X,XyXtXuX3X6X7X6X6X8X,XtXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXBX` Q ^ [ m.].].dX XdX.XdX.XdX.X.X.X.X.X.X.X.X'..X.X.X.X.X@X'.|..X|..X|.]./ ^ S ZXVXFXZXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXGXo.} v 2X4.>.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.,.:.1.b g j h 4.>.-.-.-.-.-.-.-.-.-.-.-.-.4.j 8.2.b -X;X;Xb 5 c.c o -X>Xv W / h v k j | -Xs 2.k d O s O z w h - 5 a b b g a z 5 x :X-X;Xg h a g b <X8X+. .X.X.X.X.X.X.X.X.X.X.X.X. ...O.AXGXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXBX} ! ! ` T e.s.i.a.g.i.a.a.a.i.g.f.a.a.a.a.a.a.a.k.f.a.a.a.a.a.a.i.a.i.i.S ! Q CXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX,X:X*X-Xz k uXyXg j 5.*X- a a h l @ h + + @ + l b ;X;X;X;Xz a @ + @ v k % z z w z x z ;X2.4.:.2.4.-.,.2.v v ;Xb b -X;XO.X.X.X.X.X.X.X.X.X.X.7X7X6Xb { 6X7X} n 6XpX6X6X+.{ c 7X6X6X7X6X6X6X7X6XtX2XuX5X2X1XtXwX:.;.,.-.-.-.-.>.5.-X:XuX4XtXyX>X:XDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXAXAXBX[ ! Q ` b.F.].~.(.^.^.(.(.(.(.(.^./././.(././././.~./././.~.~.T.~.T.~.F.! S [ fXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXyXtX<X:X1.,.<.0XwX2XwXwX,X<.>.;.,.,.,.-.:.<.v =X:X=Xz | { | t j 5.b d 2 2.b @ x gXz + b sX8.| .. . .+.| :X6X:Xv @ + a h h + a h h @ @ h h - p h h a a a - e $ w 4 4 g a h - @ 4 g % & h h - , p a = - - b 2X<X:.qX1X,XwX:.>.qX4X,XtX0X4.yX1XwX:.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXFXZXVXFX^ ~ ~ e.b.K.T.T.T.U.T.Y.U.T.T.T.T.T.U.T.Y.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.U.T.T.T.T.T.T.T.T.T.P.[.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.P.T.P.T.",
+"V N M M N M M M N N N N M N N N N N B N V N N B V C C V B C C C N A A C C A A C N A C A Z N Z m C B C B B C B C B C C N Z C B B N C C C C C A C C C C C C C C N C B C B C N C N N A C C C C C C C C C C C C C C C B C D H B B C B Z Z C Z C Z Z D Z Z Z Z H L L H D H Z H H H H H H H H H H H H L H L I F.U.P.Y.P.P.P.P.U.T.U.T.T.T.T.~.~.!.!.^.E.{.`.(.{.`.|.|.'..X.X.X'.'.zX'..XzXdXdXzXzXzXdXzXzXzXcXxXxXxXxXxXvXzXxXxXxXdXcXzXcXxXdXdXxXdXdXcXcXdXcXdXcXdXdXzX.XzXzXzX'.zX.XdXdXzX'..XdX.XzXdX.X'.@X.XdX.X X.XzX.XdX.X.XzX'..X.X'.@XdX.X@X'.|..X|..X|..X.X|.'..X.X.X.X|. X|.|._._.|.(._._._.(.(.(./.!.(././.[.^.(.~./././.(.(./.).(./.(.(././.(.(.(.(._.(._.^.(.`.^.{.(.~ Q S ZXVXZXDXFXVXZXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXDXDXyX3X,X,X1X1X1X<X<.,.>.<.wXtXwXtX,X,X,X,X,X,X2X>X6XX.X.X.X.X.+.,X>X2Xk 2.2.3XuXv g sXsXa - } s + aXsX*Xv l gXx 2.,.b 5 sXsX  p p *X4XuXyXwX4.,.wX2X,X,X,X,X,X,X,X2X,X<X,X2X2X0X4.0X0X>X2XyXyX6X6X2X2X,X,X2XyXwXtX4X1X1X2X,X2X,X,XtX>XtX6X6X7X6X8XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXHX' ~ ^ [ n.].'.'..XdX X.X.X.X X.X.X.X.X.X.X.X.X.X X.X.X.X.X@X'. X|. X|.!.~ ! ^ ZXVXFXFXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXVXo.} v <X4.,.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.;.j g g a z 8.f j ,.-.-.-.-.-.-.-.-.-.-.-.-.;.,.-.,.qX4XyXyX:X+ :.q.@ b >X-Xv k v v k 4 @.| g k k d | :Xs g -X:X;X;Xg ;X;Xg + p *Xv >X1X3X@.Q > @.-X7X..X.X.X.X.X.X.X. .X.X.X.X.X.X.X.o.hXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXHX' ~ Q { w.w.i.a.a.a.a.a.a.a.a.i.a.a.a.a.a.a.z.a.a.f.f.a.a.a.a.a.a.i.s.i./ / S DXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXv @ *X*X@ k -Xv h 4 2.s - l sXx @ k 6X, + l x w ,X5X-X-X,Xk 0Xp z b k >X-Xz k b k -Xz z v -X4.,.-.-.;.x v b >X>X>X5X6XO.X.X.X.X.X.X.X.X.X.O.6X-X:Xb z *X:Xv k *X-Xk :X:Xv ;XuX2XwX,X4X>X1X5X1X1XtXwXwXwXwX:.>.-.-.-.-.-.-.>.4.<X:X4XtXwX1.4.,X,XDXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFXFXAXHX} ! S Y b.K.!././.(.(.{.^.(././.(.(././././././.~./.~.~.~.~.~.T.~.[.~.]./ ~ [ BXHXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXSX3X4.1.2XtX0XwX1XtX4.>.;.;.;.2.2.8.2.8.8.2.8.k s s k g w e 0 h g k k g + O @ g a z 4 g a n z +. . . .@.f c , @.g h h w h h a v k 5 h h g h a w h g z h h p *X=Xk h a - h g w a h g d z h g n n z g p a a b 4X1XwX,X1X<.>.-.>.4.wX<.,.9.2X1X1.>.-.FXDXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXZXFXSXZX~ ~ ~ b.n.Y.T.T.T.T.T.U.T.T.T.T.T.T.T.T.U.T.T.T.T.T.T.T.T.(.T.T.T.T.U.T.T.T.T.T.T.U.P.P.T.T.T.P.T.P.T.T.T.~.T.Y.Y.Y.T.U.T.U.T.U.T.T.T.U.T.T.T.Y.U.T.",
+"N N M m M M M M N M M m M N N M N N N B V B B N C C N B B C A C C C C C C C C C C C C N N Z N C C C B C C B C B C C N C B B C C C C C C C C C C C C C C C N C C B B C C C C C C C C C C C C C C C C B u C C C C Z C C C C C C D C C Z Z Z C Z Z Z D Z H L Z Z L H H H J F H D Z H J H H H P H H L H H U Z.Y.P.Y.P.P.U.T.U.U.T.T.T.T.T.~.~.~.~.^.^.(.^.`.`.|.|.|..X.X|..X.X.X.XzX.X.X.X.XdXzXzXdXcXzXvXxXxXxXxXxXxXxXxXxXxXnXnXdXcXzXzXzXdXcXMXdXdXdXdXdXdXcXdXdXzXzXcX.XzXdXzX'..XdX#XzXzXdX.XzXdX.X'.dX.X.XdXdX@X'.dX.X.X.X'.'..X.X.X.X.X.X'..X.X.X.X'..X.X.X.X.X.X|..X|. X'.'.|._.{.|.|._._.(.(.(.(.(.[./././.^.T.[.(././.(.(.(.(./.(././././././././.(.[.(.{.(.(.(.(.(.^.~ ! ! ZXVXFXZXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXyXtX,X,X,X,X,X,X<.,.-.-.;.;.:.4.1X2X,X2X,X,XtXtX6X..X.X.X.X.O.+.,X,X1X1Xv :X:Xl z b n h > +.b z gXx k v @ @ 4 v 2.v l gXb + 6XsX;X>X-X-X*X-Xj :XyX,X2X,X,X2X,X,XtX,X2X2XwX:.,.qX1X1X,X,XyX8XO.:X1XtX<X2XwX:.;.;.9X,XwXtX2XyX,X,X<X2X<X2X2XtX6X+.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXHX[ ~ ~ { m.].'.dX'.@X.X'..X.X'..XdX'..X.X.X.X.X.X.X.X.X.X.XdX|. X|. X|.!.! ! ^ ZXAXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXX.+.v <X5.,.-.;.,.;.-.,.;.-.-.-.-.-.-.;.-.,.;.;.;.,.-.,.<.j gXx + v gX8.j >.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.,.wXyX,X1X;X5 4 - - v ;X;X;X;Xn l v z - - a v v - @.| w v uXyXyX:Xv 4X,Xz sXl k v ,X5X3X, n x > 8X+. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.oXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX[ ! ! c.T T i.a.a.a.a.a.i.a.z.i.a.z.a.z.s.z.a.a.f.a.f.a.a.a.a.a.a.a.a.i./ S ! CXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXh x z -Xz l n + @ j 5.k @ f } @.a n ;Xv 5 x w h <X,X:Xc k k KX@ l n a -XuX;X2.,.<.9Xv -Xv l v 4.>.>.:.b ;X=.4 *X-X:X8Xo.X.X.X.X.X.X.X.X.o.+.u v ;Xn a sXsXa @ } Q o sXsXa l :XuX:.>.5.wX:XwXwXwX:.-.,.;.>.-.-.-.-.-.>.>.9.0X2X:Xk 5X<.>.-.>.5.1XDXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXBX' ! ! ` b.n.!././.(./.(./.(.(.(././././.(././.~./.~./.~./.~.~.[.~.T.~.F.! ! ' BXHXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFX4X9.,.<.1X4X4X5.,.>.,.>.>.9.v @ 4 z 4 7 4 4 g g s @ g 4 5 5 g h h 5 g h z 5 @ a @ p g @ @ f +.O.X...W z eX- > l l n z @ l 8.k k z n z + z n l + z x l @ =X5XwXk a -X> + h n l @ d ;X;X+ n M.iX/ - ! | + b ,XwXtXwX0X;.-.-.-.>.,.-.>.4.4X1X:.-.>.FXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXFXDXFXAXDX~ ~ ~ c.b.Y.U.T.T.T.T.Y.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.[.U.T.T.T.T.T.U.T.T.T.Y.[.P.T.T.T.T.P.T.Y.T.Y.T.T.~.T.T.T.T.T.U.T.T.U.T.U.U.U.T.P.T.U.Y.",
+"M M M m m M m m m M M M M m m M V N N N B A V N N C N N C C C C C C C C C C C C Z N C A N Z N A B Z C C N C N Z C B Z C N C B B C N C B C C C C N Z C C C C C C Z N C C C C C C C C Z C C C B C C C B C C C C A C C C C C Z C C Z C C Z B C Z A Z Z Z Z D D H Z H H H H H H D J D J H J H L H J H L J U b.L.I.I.I.U.U.Y.I.T.T.T.T.T.T.~.~.~.~.(.(.{.^.(.|.`.|..X|..X.X.X.X.X.XzXzX.X.XzX.XvXdXxXzXzXnXxXxXxXxXxXxXxXxXxXvXxXxXxXzXzXcXdXzXdXzXzXdXvXdXdXzXzXdXnXzXzXzX.XzX.XzX.X.XxX.XzX'..XdX'.dXdX'..XzXzXzX'.zXdX.XdX.X.X.XzX.XdX.XdX.XdX.X.X.X.X.X.X.X.X.X.X@X_.|.|.@X|.|.|.|.|.|.{._._._._.(.(.(.(.(./.(./.(./././.!./././.(.(./.(././.!./././.{.^.(.(._.(.(.(._.(.(.).~ ! Q ZXCXZXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyXyX,X,X1X4.,.:.qX<.-.-.,.,.;.tX4.9.1X4X5.<.1X3X+.o.o.X.X.o...7XtX2XuXv 5 @ z O   O 4 o & + O + 5 -X:Xz x -X-Xb g - 5 @ + b x :X:Xs j O g l -X2X2XtX2X1XtX1XwX:.wX,X2XwX,.,.,.:.wX1XtX:X7X8X1XwX,.wX1X:.-.-.-.-.;.;.:.0X1X,X,X2X<XwXtX,X,XyX,XAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXBX' / ! ` m.].'.'.'. X.X.X.X.X.X.XdX@X XdX'..X.X.X.X.X.X.X X X|. X|.'._.!./ ! ^ ZXZXZXZXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXo.} v ;X;Xx b b 2.:XtX9.,.-.-.-.-.;.wXb b b b b b 8.x j wXv sXx 9 z l h v 5.,.>.>.-.,.,.,.-.-.-.-.-.-.-.-.5.1X2X,XyX-X4 b @ a x z @ d p O h h z z k k z @ @ + o + s =X,X2X:Xk ,X:Xz n z @ l ,X2X:X> n b y ..o.o.o.X.X.X.X.X.X.O.X.X.X.X.X.X.X.O.7XDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX} ! S [ T r.s.i.a.a.a.a.a.k.a.a.a.a.a.a.k.a.f.a.a.f.a.f.a.a.i.i.a.i.i.a.! ! S ZXFXVXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXDXDXa v sXx @ v yX- @ j 5.;Xa f f v z l z a + + 4 g ;X;Xn n @ O h @ + + a v :Xv 2.;.,.>.1.0X-Xv x b 8.0XwX;X2 2 4 8X-X-X8X..X.X.X.X.X.X. . .+.n g k :Xv l sXM.@ z +.W , aX6X@ b l :XwX9X,.,.-.-.>.>.-.-.-.-.-.-.;.-.>.9.0X0X:X-X:Xk v 1X<.>.,.,.4.4XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXVXFXZX' ! ! I b.F.].!.(.(.(./.(./.(./.(./.(././././././.~.~.~.~.~.~.[.T.~.~.F.~ ~ _ BXHXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3X9.>.>.9.wXtX<.-.:.qX0X0XwXx 2 2 7 2 =.=.=.l k k k z =.j s w O p k a z 6Xn h > } s p v 8.- @.O.X.o.+.n n > > z l b v @ l n z @ l n v @ z b v a l n x + =X=X=Xs l ;X:Xa z n x g a k -Xg c | ' @.- W +.- b <.;.-.,.>.-.-.-.-.4.qX;.>.>.5.wX:.-.<.GXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXZXZXFXFX~ ~ S [ n.F.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.T.T.T.T.T.T.T.T.P.^.T.T.T.T.T.U.T.T.U.T.Y.T.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.U.T.T.U.U.T.L.L.U.",
+"m M M m q m m N M M M m M M M M B N B N B N M C C N C C N C C C y C C C C C C B Z N N Z S N C C C B A Z Z C C A C B C N C N B N N C C N C C C N A C C C C A C C C C C C C C C C C N N C N N C C C B V C C C C Z V C F C C C Z C Z C Z Z Z Z Z Z Z Z D D D D P Z H H H H H H Z J Z H H H H L H J L L H U Z.Y.U.I.T.U.I.I.U.U.T.T.T.T.T.~.~.~.~.~.(.(.(.|._.`.|..X`..X'..X.XzXzX'..XzXzXzXzXzXxXdXcXdXdXxXxXxXxXxXxXcXxXxXcXdXxXdXcXzXzXzXzXzXzXzXzXzXzXdXzXzXdX%XzXzXzXzX.XzXdXzX'.zXzX.X'.zX#X.XdXdXzXzX.X.X.X'. XdXdX.X.XzXzX.XdXdXdX.X.X.X.X.X.X.X.X'..X X.X|.'..X X.X X X'. X|.|.|.|._.|._._._.(.^.{.(././.(.!.(././././.(./.(.!.(././././.!./.(./././.(.^.|.(.(.^.(.(.(.~ ! ^ FXVXDXZXAXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX,X<X,X,X1X9.,.9.4X:XqXqXqX0XqX<.>.:.wX,X<.:.2XyX>X+.o.X.X.o.X.+.,X2X2Xb w sXsX3 j s w g sXsX+ sXsXj <.b v :X:X,X:Xv v v @ o 5 -X:Xj j z n z -XyXwX:.0X0X:.0X0X,.wX2X,X,X0X0X4.,.0X4X:X6X,XtXwX,.4.>XwX>.,.>.-.-.-.,.>.qX1X,X2X,X<.>.:.5.tXyXyXAXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX} / ! c.n.].'.dXdXdX.X.X.X.X.X'.'.'..X XdX.X.X'..X|..X.X X.X|.|.|.|..X].~ ! ^ ZXVXZXZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXO.+.v b @ @ 4 v l -X-X=X;X4.>.-.-.:.wX-Xp h h p p a -Xz b d @ 4 z z a a 5 b b b b b j j ;X2.>.-.-.-.-.-.>.wX1X,X,X1X;XsXgX+ sXgXa - W -Xs p @ + d + + + z -X:Xv | -Xs <X2X:Xv yX<Xz + @ 5 l ,XyX3X/ b b @...O.X. .X.X.o. .X.X.X.X.X.X.X.X.X.X.O.O.DXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXCX' / Q _ T T e.d.a.a.a.a.a.a.a.a.a.a.k.k.a.a.a.a.f.i.a.a.a.a.a.a.i.i.a.a.! ! Q VXFXAXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXGXDXg p z @ z O O *Xz O s a d *X*X=Xl - a s 4 z 5 g b z g s *Xv z z a v ;Xb l v 4.,.2.=.,.:.:X-Xz l d -X:Xb 2 =.4 8X:Xv ....X.X.X.X.X.X. .+.u v ;Xk j p - + O O @   -   s O s tXx g :X4XqX;.-.-.-.>.>.-.-.-.-.>.,.,.4.,X4X<Xv v -X-X>X1X:.<.0X:.4.1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXDXZXVXVXBX' ! ! _ b.F.!./.E././.(.(.(././././././././././.^.[.~./.~.~.T.T.[.T.[.F.~ / ' BXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXyXtX:.>.-.;.-.-.:.wX1X,X1X2Xv 2 2 w b 3X1XeX7 *Xj k a 8.sXj - a k k 5 t } @.@ > } c a x kXeX| O.X.X.| f f / c z d - d h z @ g d z - @ h w - @ z h @ @ p k k k k d c z h @ w 5 a z p g p u % = ; d > - + x ,.>.4.0X5.-.-.-.>.4.4XwXqX-.,.,.>.,.5.FXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXVXDXFXFXFX~ ~ ) b.F.T.T.~.~.T.T.T.T.T.~.T.T.T.U.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.U.U.T.I.T.T.U.T.Y.T.T.P.[.T.T.T.T.T.T.T.T.T.T.XXU.T.U.U.T.U.T.T.U.U.T.U.U.Y.L.",
+"M m m M N m m m M m m m N M M M m V N N N A V C B C N C C C C C B N D B C C C B A N N C N C C C B C C N Z C N Z N C C C N C N Z C N C C B C B C C C C C C A N C C C C C C C C C C C C Z C N C N C C B C C C C C C C C C C C C C C Z B Z Z Z C Z Z Z Z D Z D D Z H H H H H H Z H H H H H H L H H L H L U n.Y.T.I.T.U.U.I.T.T.T.T.T.T.~.~.~.~.(.(.(.^.^.`.|.`.|. X.X.X.X.XzX.XzX.XzX.XzXzX.XzX.XdXcXzX@XnXcX.XxX@XdXcXcXcXcXvXcX@XzXzXzXzXzXdXzXdXfXvXxX.X.XzXzXzXzXmX.XzX#X'.'.'.'..XzXzXzX.X'.'..X.XzX.X.XzXxX.XdXdX@XdXzX.XzXzX.X@XdXdX.XcX.XdX.X.X.XzX.X.X.X.X X.X.X.X.X.X X X|.|.|.|.|.|._._.(.^.(.(.(.[.(./././.^./.(.!./.!././././.^.)././.^.(.^.^.[.(.(.[.(.(.(.(.(.(./ S Q ZXVXFXZXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXyX3XtX,X,X1X9.;.wX2X2X1X1XtX,X4X4.>.-.;.:.5.wX,X,X>XuX+.X.X.X.X...+.tX,Xv x gXl 4 kXj @ x gXl w gXx *X5.b g n aXk :X*X>X-Xb ;Xx ;X;Xv v O O   v yX,X4.,.;.>.>.,.>.wX2X,X,X2X1X1X0XtX8X7X3XtX:.,.4.1X2X2X0XqX5.>.,.>.9.0XtX1X,X<X,X0X5.-.;.:.;.0XFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX' / S { n.].'..X.X XdX X.X.X'..X.X.XxX.X.X.X.X'..X.X.X X X X|.'.|.|.|.!.! ! ^ ZXVXFXZXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXGXO.} b :X7 8.7 :Xv > } s *XyX4.-.-.-.1.-Xj j k *Xj p :Xb - d s -Xv - 6Xn g x @ 5 x z w sXaXj ,.-.-.;.-.-.;.wX1X2X2XuX-XsXn O aXn 4 d @.| O :X( $ z f v h v 1XuX:X@.W x 5X1X>Xz uXtX:X;Xv l :X:X-X-Xf > > > +.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.fXFXFXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXBX[ / K { T w.s.i.a.a.a.a.a.a.a.k.k.a.a.a.a.a.a.f.k.a.a.a.a.a.a.a.i.a.a.a.S / ~ ZXFXVXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXDXDXz z h @ a n b *Xz s eXl @ @.} s a f } s 4 n 7 5 :Xb x b >X2Xb x d :XuXuXb 8.;.;.2.<.,.>.:.0X-Xk v z 7 w < < # k b ;X . .X.X. ...X. .o.{ v :X>Xg j k - } -Xp w sXsX+ | -Xk ,X:Xv l :XuX;.>.-.-.4.qX-.-.-.-.9.0X0X2X2X:Xv k 2XuX1X>XwX;.4.tX,.4.1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXZXFXBX[ ! ! ` b.F.U.~./././.^.!././././././././././././.~.(.^.~.~.!.~.T.~.~.F.Q / [ MXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXyXyXyX<.>.-.-.-.9.4X5.4.1X<Xv 2 2 7 v aXeXj z v v v g 4 x < h a h @ g - , - g + > - p h n g | O.X. .+.8X4X4X;X4 7 7 7 7 < 4 5 4 7 7 w b b ;Xz 7 4 a v h h d w 5 h d @ 5 g 7 j x 7 v b b b ;X-Xb b b -Xv ;X>.9.,X1X4X0X-.-.-.>.0X4X1XwX0XqXqX0XtXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXFXZXVXZX~ ~ ! [ n.Y.~.~.T.~.~.Y.P.T.T.T.Y.T.T.T.U.T.U.T.T.T.Y.T.T.T.T.Y.T.Y.U.U.U.U.U.T.U.U.Y.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.T.I.I.U.U.T.U.U.L.L.K.Y.",
+"m M m M m m M M m M M M M m m M N N N N N N N m B B C B C N C B Z C V C B B C C C N Z Z C C A C Z C C C C C C N C C N N C N C N N C N C C B C B C A C A C C C C C C C C C C C C N C C B C C C C B C C C C C A C C V Z C C D F C C Z C Z A C Z Z Z Z Z Z D D D Z Z H H H G H H H H H H H J H J J L H J P b.Y.T.U.I.I.T.I.T.T.I.T.T.~.T.~.T.~.)./.(.(.(.{._.{.|.'..X'..X@X'..X.XzX.XzX.X.XzXzX%XdXdXzXdXdXzXfXdXdXzXzXvXzXxXdXcXxXcXzXzXzXzXvXdXdXdXdX#XmXzXdXzXzXzX.XzXzXdXxX.XxXzX.X.X.X.XzXxXzXdX.X.XzXzXzX.XzXdXdXdX X.XzXzX'.zX.X.X.X@X'..X.XdX XdX@X.X.X|..X.X X.X.X.X.X|..X|. X_.|._.|.|.[._._.(.(.^.(.(.(.(.(./././././.(./././.!.(.!././.^././.^.(.!.(.(.|.^.`.(.(.^./ ~ S ZXVXZXDXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXyX4.,.4.1X2XwXwX1X,X,X1X5.,.4.4X5.,.-.,.<.4X1X<X,X>X>X6Xo.X.X.X.o.+.2X>Xv - w 4 O l 4 5 - z + + z 5 v :Xv h n b a { sXb l v :Xg @ 5 v b 7 8.8.k uX2X4X4.-.5.0XqX0XtX,X2X,X,X2X2X1X>X6X6XuXtXqXqX,X3X<X<X3X1X1X0XqX0XtX1X:X+.8X,X,X2X,X;.-.-.>.5.FXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXCX[ / n b.Q.].'..X'.dX.X.X.X.X.X.X.X.X.X.XdX.X.X.X.X.X.X|.|.|.`.|._._.`.^.~ ! S ZXZXFXZXFXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXGXSXO.6Xb :X7 k 4 >Xv @.} f :XyXyX<.>.>.<.-Xj k k j k z :Xv f } k v v - | W -X-Xw KXaX@ l aXx j ,.,.-.,.-.,.,.qX:X;X;X-Xv w @ + @ a - v v -Xk :X;Xd a p l - b 5X-Xv - , d ;X;X-Xk -Xv ;X-Xz g *Xk @ - p p -X:X3X+. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.7XFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXHXCX[ S n [ T e.i.a.a.a.a.a.a.a.i.a.a.a.a.a.a.z.a.a.i.a.s.a.i.a.i.i.i.i.i.i./ / S AXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXg l n + @ n n w d k k -Xp > } x @ > | n 7 8.x p :X-X:Xx -X2Xv n l s -X*Xv 2.>.-.;.2.<.,.-.:.1X1Xk j z 4 4 8.- -X4X8X..O. . . .+.X. .+.b v :X-X*X-X-X- | } h h sXeX  W } -X2XuX,Xv z :XwX5.;.>.qX4X:.>.;.,.qX4X:X;X:X*X-Xv k -X>X9.>.>.>.1.0XtX2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXVXBX} Q Q Y b.F.]././././././.(.(./.(.!./././././././.(.~.~.^.~.~.T.~.T.~.F./ / ' BXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDX4.4.4XtXqX<.-.-.<.4X9.:.1X,Xx 2 =.l x eX3Xb 7 z d h g a + @ g a z a g h h h g z p z g 4 @ l Q X.X.X.X.O.7X3X;X7 2 2 3 2 o < O O 2 2 4 ;X:X<Xj < 4 :Xn + 4 2.2 @ 4 2.2 + l ;XKXeXx b <.,.:.0X2X<.,.,.2.-X2XwX,X2XtX2X2X:.-.-.>.4.,XwX,XtX1X1X1X3XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXFXZXAXAX~ ~ ~ b.n.L.T.!.^.~.T.T.~.Y.T.Y.T.Y.U.U.T.U.T.U.T.T.T.T.U.T.T.U.Y.U.U.U.U.I.U.U.I.T.Y.T.T.P.T.T.T.T.T.T.T.T.T.T.T.T.U.U.T.U.U.I.T.T.U.U.T.L.U.L.L.L.",
+"m m m m m M N m m M m M m m m V M M N N N V N N B B B C C B B C C B C B C B C B N N N C A C C C C C C C C C C C N C N C m C C N B C N C B B C B A C N Z C C C C C B C C C C C C C N B C C B B C C C C C C C C C C C C C C C D C B D C Z C Z C Z Z Z D D Z D H H H H F J K H H Z H H J H H H H J P J S U [ P.T.P.R.U.U.T.T.R.U.~.T.~.T.~.(././.(.^.(.(.|.|._.|..X.X'..X.X.X.XdXdXzXzXzXzXdXdX@XzXdXxXdXcXzXxXzXcXcXzXcXcXvXcXcXzXcXzXcXzXzXdXzXdXcXzX.X.XdXzXzXzXzXzX.XzX@X.X.XdXzXdX.XzX'.zX'..X.XzX'.zXzX.XxXzXdXzXdXdXdXdXdXdX.XzXzX.XdXdX'.dX.X.X.X.X.X.X.X.X.X.X%X.X|..X.X X|.|.|.|.}.}._.|.|.(.(.(.(.(.(.(.(.(.(./././.~./.~././.~.!./././.(.(.~.[.!.^.(.(.(.(.`.(./.(.~ ^ S FXFXFXFXAXAXAXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXSX5.;.qXwX<X,X2X2X,X,X2X2XwX:.:.tX4.,.;.qXwX1X5.9.2XyX5X7X .X.X.X.o.+.,X2X;Xb b -Xb b -Xv -X=X=X-Xh b b -Xl a + a @ n n - v z n z @ n k k l gX8.j uX>XyXwX,.0X1X4X1X2X2XyX,X,X,X,X,X2X3X .8X2X8X+.+.X.+.o.X.+.8X<X3X1X:X+.....8XyX,X,X2XqX;.-.;.;.SXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXBX} S / _ m.'.hX'.dX.XdX.X'..X.X'..X.X.X.X.X.X.X.X.X|..X|.|.|.`.|._._.|.].~ ! ! ZXVXFXDXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXSXO.} b :Xk =Xv :Xv   # # :XyX1X5.>.-.:.0X-Xv v -Xv z v l > | / p l v f v :Xb l aXx @ d @ @ z b 2.b x 8.b 2.b b v z 5 z z z z g l z v :X*Xv z p a p p a a v b w w 5 5 ;X;X;Xz v w z z - 5 w v a n b - z ;X;X:X6X..X.X.X.X.X.X.X.X.X.X. .X.X.X.X...hXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXBX[ / ^ ` T w.e.a.a.a.a.a.a.i.k.i.a.a.a.k.a.a.a.a.i.a.i.i.a.i.a.a.i.i.u.i.S / S ZXFXAXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX@ v KXa @ @ + @ h a g a z - - - 5 - - - + 4 @ w n n n f :X1X-Xk k s :X-Xd 2.,.-.;.2.:X0X0X0X2X1X>X-Xv x x sXeXk :X .+.W +.| +.+.+.+.Q 5 4 d - b :X;X- , , p z a 5 + - , p :X:X-Xn e l 3X4X0X,.qX1XwX5.;.9.;X-Xv v -XuX,XyX:Xv v wX0XqX>.4.1X1X2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXAXAXBX[ ! S ` b.F.!.[.~./././.(.!././.!././././././././.~.^././.!.~.~.~.T.~.Y.! / ' fXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX9.:.tXwX4X:X<.,.<.1XwXwX1X:Xb 2 2 z 7 b 7 7 z g 5.*X5 w z l 5 k -Xl @ a 6Xx z v j *Xa z aXsX@ } o.X.X.O.O.+.b c } n v n b -Xb n ;X6Xk z l w z z p k *Xg < 8.2.5 4 2.2.5 7 ;XkX9Xx b ,.-.>.0X1X5.-.>.q.b 1X1X2X,X<.5.wX:.-.-.-.>.;.;.,.>.9XyXyXuXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXGXZXVXFX! ~ S [ n.U.~.^.~.!.~.~.P.Y.T.U.Y.U.U.L.U.Y.Y.U.U.U.U.Y.U.U.P.U.U.L.L.U.U.U.U.U.U.T.Y.T.T.T.T.Y.T.T.U.T.T.T.T.T.P.T.U.T.U.T.U.U.I.I.U.U.U.L.L.U.L.L.",
+"m m m m m M N m M m M M N m N N N M M M V N N V B B B B B B C A B C B C B C B C A C Z A C C C C C N A C C A A C C C N C C C N C C N C N B C B B Z Z C N C C C C C A C C C C A C Z B C B B B C B C N A N N A C C V C C F Z Z B C C A C Z Z Z Z Z Z Z D Z D D D Z H H H H H H H H H H H J J J J J H H L U e.U.T.T.T.R.Y.Y.~.L.~.U.T.T.~.~.!./././.(.(.|.(._.|.|. X.X.X.X.X.X#XdXdX.XvX.XzXdXdXdXdXdXdXdXzXcX.XzXdXdXvXzXzXzXcXdXcXdXzXzXzXzXzXzXdX.XcX.XzXzXzX.XzXdXzX.XzXdXdXdXdXzX'..XzX#X.XxXxXzX.XxXzXzXzXxX.XdXdX#XdX.XdXdXdXzX'.zX.X.XdX.XdXzX.XzX.X.XdX.X.X.X X X.X.X.X.X|.|.|.|.|.}.}.|.{.{.|.|.(.`.^.(.(.(.(.[.^.(./././././.~./.!.~././.(./.(.E.^.^.~.(.(./.(.^.(.(.~ ~ ^ ZXZXZXDXAXAXAXFXFXFXFXFXFXDXSXFXFXFXFXFXFXFXFXZXGX1.1.4X2X,X,X,X2X,X,X2X2X1XtX<.,.;.5.wX1X2X1X9.:.2X>X6X .X.X.X.X.X.6X,X,X2X2XyX9X;.1.:X1X1X=XiX*Xz -X:X;Xv c c l @ O a h ;Xb n z h sX@ @ z k g -X,X<X1XwX,.,.:.wX2X2XwX<.wX2X,X,X,X,XwX6X .o.o.o.o.o.o.o.o.o.o.+.+.o.O.....6X<X,X<X,X,X1XqX-.;.;.DXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZX' / S ` m.].'.zX@XdX.X.XdX'..X.X.X.X.X.X.X.X.X.X|.|.|.|.|.|.|._.|._.|.].~ S S ZXVXFXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXGXO.+.b 5X:X,X4X2Xx z x k :XuX1X1X<.-.-.:.b b -Xa z p a d O     d b >XuX4XuX;Xw p h z z z v 2.b b b b j b v a a g v -X;X;Xk + O + z z h h z d z z a z z z z l 5 i 8.j 2X1X1X;X-X;X;Xl l g :X<Xp x x p z @.Z @.W .. .X.X.X.X.X.X.X.X.X.X.X.X.X. ...O.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXBX' ^ ^ { T w.d.i.a.a.a.a.a.a.i.k.a.a.a.a.a.a.a.a.a.i.i.a.i.i.s.i.i.a.i.i./ / S CXAXSXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXz + z a z n n c g h h d + @ @ @ 5 @ p h a v ;Xv Z iXwX8XyXtX,X2X>X-XKXKXz 2.-.;.-.<.,X1X1X1X>X;X-X;Xk g w x j k > | | | | | W W S f n 5 kX2.O z d + 4 7 7 7 7 7 w z z w g b ;Xb b -Xv x :X4XwXtXuX4X4XwX*Xv -X:X>X>XwX,X2X2X>X-Xv 1X1X<.,.5.1XtXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXAXAXBX} Q Q ` b.F.I.~.~././././././.~./././.(.~.!.[././.(.~./.~.~.~.~.~.~.T.F.~ / ' BXGXCXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDX9.>.,.,.4.4XwXqXwX1X1XtX4.4.v 2 =.7 4 7 7 7 z j 9.;X@ z x l @ v ;Xz @ u } / h -Xj j + x gXl + :X7X.. .o.o.O./ |  .X.+.+.X.o.+.+.O.7X-Xj w z n sX+ g k d 5 O + @ 5 4 5 5 a eXsX=X7 b ,.>.-.5.4X,X;.>.2.-X3XyX:XwX;.-.>.-.-.-.<.qX-.-.-.>.5.yXeXsXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXZXZXVXGXQ ~ ~ b.n.Y.E./.(.~.~.~.^.T.Y.U.L.U.P.Y.Y.U.U.U.Y.P.P.P.P.P.U.L.Y.U.U.I.I.U.U.U.Y.L.Y.Y.T.T.P.T.T.T.U.P.U.U.P.T.T.T.T.U.U.T.U.T.U.I.T.L.U.L.L.L.H.L.",
+"m m m m m m m m m M m N N N m N N m M m N N C N B N B B M C C M N C N C B B B C C N N A C C C A C C A C C C C C C N C N A m C N C m N C C m B C B m A C C C N A C A C A C N C C N C N Z B B B C C m C A A m C C C C C C C C C Z C Z Z C F B Z Z D D Z D D D H H F H F H H H H H H H H J J J H J L J P U b.F.T.T.T.T.Y.~.I.~.T.T.~.T.~.~././.(./.{.(.^.(.|.`.|.|.'..X@XdX.XzXdXdXzX.X.XzXdXdXdXzXzXzXzXdXdXdXzXzXvXdXxXcXdXcXvXzXzXzXzXzXzXzXzXdX.X.X.XdX.XzXzXzXxXzXdXdXdXxXdXdXdX.XdXdXdX@XzX'.zX.XzXzXdXzX.XxXdXzX@XzXvXdX%X.XzX.X.XzXxX.X.XzX.XzX.X.XdX.X.X.X.X.X.X.X X.X.X.X|..X X}.}._.{._.`.(._.(.(.(.`.^.(.(.(./.~././.~./.~.^.~.~.~.~.(.(.(./././.(.(.[.(.(.`.(.(.(.~ ~ ^ AXAXDXDXAXAXAXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXDXDXwXwX,X,X,X,X,X,X,X,X,X,X2X1XwX:.1.1X2X<X<X1X4.0X,X,X6X..X.X.o.X.8X5XqX<.tX1XqX,.-.5.9.<.>X=X*X=Xp z eXsXe eXiX@.v b ;Xx ;Xv a @ + + a @ ;X2X1XwX:.:.wXqX4.4.>.wX2X2XwX,.5.1X,X,X,X,X2X>X6X..o.X.o.X.X.X.o.o.o. .o. .O.O.7XtX,X,XtX,X,X2X,X;.,.,.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXBX` ~ ~ [ m.].dX.X.X.X.X'.@X@X'..X.X.X'.'..X.X.X.X|.|.|.|._..X{._._.|._.!.~ Q ! ZXVXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXO.} b -Xk -X:X-Xl - 8.4 :X2X,X4X5.;.-.-.>.<.wX/ } s a > } =X@ ;X>X4X:X-Xk g w 7 4 p p a b ,.,.>.,.;.,.,.;Xk *Xa ;X,XyXuX;Xw n z @ + l z a a - - v p p h g z @ 7 v 7 1X:Xk *Xj 1X;Xx ;X:XuX2Xa + @ a f , n l , ....X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.hXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXCX} ~ ~ [ T w.s.a.a.a.a.a.a.a.i.k.a.k.k.a.a.a.i.a.a.i.i.i.a.i.i.a.i.u.u.i.! / ! ZXZXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXa ;XsXw l ! iXeX; v 8X-X@ l z 2 b s < 5.-X:X,Xb W _ W 6XuXuXyXyX2X-X*X*Xl 8.;.,.-.;.<X2X,XtX2Xv sXsXp d x v j j / O.....O.X.O.X.f w 5 z aX8.3 w ' > p 2 2 3 3 2 2 a :X@.d uX:X:X8X3X:Xv b >X:X;X-X:X1X:X:XuX1X<.-.,.:.5.tX,X>XyX-Xv 2XwX0XwX2X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXBX' ^ ^ Y b.F.!./.~./././././.^.(.^.!./.[././././././.[./.~.~.[.[.T.T.[.K.~ ~ [ BXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXGXDXDXwXqXqX:.<.1X1X1X1X1X4.,.>.<.v 3 3 2 2 2 < 2 g a k a h + 4 4 h @ z p g - , , h v v v g 5 z 4 g -X<X7X..X.X.O./ }  .X. .O.X.o.X.O.O...o.x 7 z n n z z s *Xz c n l a z a z z j x 7 5 b 8.4.;.-.0X1XqX,.2.-XwX<.,.-.-.-.-.>.>.,.qX4X:.-.-.>.5.wXaXsXGXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXZXAXVXAX) ~ / T n.F.T.^.(.(.~.~.~.T.P.U.U.U.U.T.P.T.Y.T.L.L.P.L.P.P.L.Y.L.L.L.I.I.U.L.I.I.I.Y.P.Y.P.T.T.T.P.P.T.P.Y.P.P.T.T.U.U.T.U.U.U.U.T.L.L.L.L.S.L.L.L.",
+"m m m m m N m m M N m m N m N m V m N N N V N B B B B B B N N C C N C V C C B B N A C C C C C C C C C C C A C C C C C C C N N C C C C N C C M C A B N N N C C C C B C C C A C C C C A B B B C B C C C C C C C A C C C C C Z C C A Z A C Z Z Z Z D D D D D D D H H H J G L H H H J D L H H J J J L H L U [ Z.[.T.T.T.T.L.Y.~.T.~.T.~.T.~.~./././.(.(.|.`.^.`.|. X'..XdX'..X'..XdXzXxX.XdXzXdXzXzXzX.XzXzXdXcXzXzXxXdX.XdXcXdXzXzXcXzXzXzXzXzXzX.XzX.XzXdXdX.X.XzXdXdXdXdXdX'.dXdXdX'.dXdX.XdX.XzXzXzXzXzXzXzX.XzXdXdXdXzX XdXdXcXzXzXzX.XzX.XzX.X.XvXzXzX.X.X.X.X.X.X X.X X.X.X.X X|.|.}.}.}.|.|._.|.|.|.(.(._.(._.(.(.(.(././.~./.~.~.~.~.~.~./././.(.(./.!.(./.(.(.^.(.(.(./ ~ ~ DXSXDXDXAXAXAXFXFXAXDXAXDXDXAXFXFXFXFXFXFXFXFXFXFXyX1X,X,X,X,X,X,X,XtX1X5.<.:X4XwXwX2X,X2X1X5.:.1X>X6X.. .X.X.o.+.,X4X4.>.<.2X:XqX0X4XwX0X>X*X*X=Xb w n n @.{ ' @.:X2X:Xk - a h w v z z d + v 5X0X>.>.,.,.tXwX,.wX,X,XyX0X4.:.wX2X,X,X2X2X3XX.X.X.o.X.X.X.X.X. .o.o.X.X...8X>X1XwX<.0X1X,X2X0X5.qXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXCX' ! ~ c.Q.].'.zXdX.XdX.X'.dX X.X.X.X.XdX.X.X.X X X|.|.|._.|.|.|.{._.(.].~ ! Q ZXVXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.+.l j 5.-X:Xk 4 O # g :X2X,X2X2X<.-.-.-.;.<.f | n h > | ' a v -Xk g - b b @ j g 4.0Xp 8.;.,.-.-.>.-.>.0Xj j p -XuX1X1X-Xl x + h sXgXz @ } } + j 9Xk k 8.s 5 4 s z :Xj t 8.l <Xl l -X:X;X;Xa z l l n > n b > ....X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.oXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX_ / ! ` T w.f.i.a.a.a.a.a.i.k.i.a.a.a.a.a.a.a.a.i.i.i.a.t.s.i.u.i.a.i.i.! ! ^ ZXAXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX@ -XKXl z W _ W f v 8X-Xh n w 2.sXh j 5.k k 5Xb & $ $ ;X-X-X*X;X-X-Xk -Xl -X2.4.<.;.wX1X2X1X>X;XgXx k -Xv x f 6X} ..o.O.X.o.X.c z 2 7 d O O + @ 1.q.-X5.3 z v O 7 l ;X:X-X4X:X{ iX{ uX;Xz -Xv -Xv wXwX<.,.5.4X0X;.-.-.>.,.9X1X1X:Xk <XuX4X1XyXyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXZX' ^ ^ ` b.F.R./.~./.(.!.(./././.!././.!././././././././.(./.~.~.[.~.~.F.~ ~ ' BXZXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXDXZX2X1X1XwXwX2XyX,X2X4.>.-.-.<.x @ h d x z d d g @ @ @ g 4 @ @ g 5 5 5 g h d g g p a p g p n c d g @ k 6XO.O.O.c | o.X.X.O.X.X.X.O.O.o.o.+.:X5 + 5 w =X5X>Xz M.iXS z x l + w - k v a k s b ,.4.,X4XwX,.2.v <.;.,.-.-.>.9.qXqXqXtX1X0X-.-.>.9X:X:XsXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXZXAXAXFX~ / ( b.n.U.~./.|.(.^.~.~.U.T.L.U.L.L.L.P.U.P.L.U.U.P.P.P.P.L.L.U.U.L.U.L.U.U.I.U.U.P.P.T.Y.^.P.T.P.P.P.P.P.U.U.T.U.U.T.U.T.U.U.U.U.L.L.L.L.L.H.H.H.",
+"m m m m m m m N m N m m m m N N m B N m N m m m N N C N B N C M B B N B u N N B C C C V B C B C C C C C C C C C N C N C C N C C N N C N N C N C N C N C C A V C B B Z C B Z B B B C B C B C B C C C C C N B C B B Z C C C C C Z D C Z Z Z C Z Z G Z D D Z H Z H D D H H H H H H H H H H P H Y L D P H L [ F.T.T.T.[.T.T.~.T.~.T.~./.).!./.).~./.^.(.(.`.`.`. X'..X X.X'.zX'..XzXzXzX.XxX#XdXdXdXzXzXzX.X.XxX.XzX.XxXdXdXdXdXxXdX.XzXdX'.zXzXxX.X.X.X.XzXxXdXdX.XdX'.zX@XdXdX'.zX.X.XdX'.zX.XdXzXdXcXdXdXdX X X%XdXdXdXdX.XcXdXdXzXzXzXzXxXdXdXdXdX.XzX@XdX.X.X.X'..X.X.XdX.X.X.X|.|..X|.|._.|._.|._._._.`.^.(.(.(.(._.(.(.(./.!./.~.~.~.~.~./././.~./././.(./.(.(./.{.(.[.(.~ ^ S ZXVXAXZXFXVXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXyX3X2X2X2X,X,X,X,X,X2X4.5.<.<.1X1X,X,X2X1X9.0X>X8X..X.X.X.X. .+.1X9X>.-.qX1X2X1X2X,X2X2X,X2X<X;Xb + + @ - = = u :XuXv c d + n z -X-Xx z + n k 9X,.4.qXqX2X,X0XyX2X,X,X4XwX,.0X1XyX,X,X>X:Xo.X.X.X.X.X.X.X.X.X.X.X.X. .7XtXtX,X:.<.tX2X,X,X1X1X1XAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXCX' / Q [ M.'.'.@XzX.X.X.X'..X.X.X.X.X|..X|. X X'.}.'._._.|.|.{.|.^._._.].~ ~ ~ ZXVXZXZXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXo.+.c h j k :Xd q.-Xs :X1X,X,XyX1X5.,.-.-.-.;.j f $ z O   o - k ;X, @ - x k p g g 5.9Xa v k j 2.,.-.-.,.;Xs s p -X>X:XwXj 6 3 5 z sXn a z W +.@ j j k k j p l d a a z g 7 v 7 -Xz v @ a *Xz p d z @ n / b x > 8X+.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.fXZXDXDXDXZXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX' ~ S { T i.i.i.i.f.i.z.a.z.i.a.k.i.a.a.a.a.a.i.i.u.a.u.i.s.i.i.s.u.u.u.~ ~ ~ SXFXSXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXz k -Xk l c f n l @ g a O 6 o 3 x 3 + p v c k k k 3Xl + 7 c 7 @ z :X, @ x wXb 7 4.,.>X<X:X:X;Xh d @ v ;Xv k } O.O.O.O.O.O.X.c z 4 < 4 4 2.2 + @ < w v b 3 v -Xa f p a O s -Xv | } | :Xg z -X:XwX<.,.;.-.-.-.5.wX:.-.-.-.-.5.1X2X2X;Xv -X;X:X-X:XHXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXAXAXAXFXFXAXBX[ ! Q _ b.n.~.^.~./././././.~./.~./.~./././././././././.~.(.~.~.~.T.~.F.! / [ BXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX4.4.1X2X,X,X1X5.>.-.,.,.<.g > } s @ f } s a 4 h x - h x k d 1 j s - g 4.*Xz * ' s s A eXiXu k k k -X6XO.O.Q } .. .X.X.X.X.X.X.X.X. .O.:Xg l h w =X=X=Xf | { @.g n x a z n g *Xn g *Xb wX,XyXwX:.,.2.b ;.,.-.>.>.9.,X1X1X1X2X3X4X0X;.>.5.5X:X=XFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXFXFXVXZX! ~ / ` n.T.T.(.(.(.^.~.~.T.U.L.U.L.Y.U.L.U.L.L.L.L.L.L.L.U.K.L.L.L.L.L.L.T.L.Y.T.U.T.U.T.U.T.T.P.U.R.R.U.I.I.Y.T.Y.T.T.T.P.U.U.U.U.L.R.L.U.H.S.H.H.",
+"m m m m m m m m m m m N N m m m m m B m N B m m N C N N N N M C N B B B N V B B C B N C F B Z B C C C C A C A C C C B B C N C N A N N C C N C N N C C N N C N A B C B B B B C C C B C B C B C B C m B N Z B B C Z B Z Z C Z C C C Z C Z Z Z Z Z Z D Z D L Z H Z H H K H H H H J H H H P H H L J U H H P ` U.T.T.T.T.T.T.T.~.T.~./.T.~.~././.^./.(.(.^.`.(.'._. X'..X.XdX'.zXzX.XzX.XzX.X'.dXzXzX.XzX.XzXzX.XzX.XdX.XdXdXxXdXdXxXzX@XdXzXzX.X.XzXxX.X.XzXdXdX.XzXdXzXdXdXdXdX.XzX.XzXdXdX.XzXzXzX.XzXdXcXzXcXvX XdXdXfXdXzXdXzXdXzXdXzXzXdXdXdXzXzX.X'.zXdX.X.X.XdX.X.X.X.X.X.X.X.X.X|.|. X_.|.|._._._._.|.^.{.`.^.`.^.(.(.(././././.~.~.~.~./././.(././.!./././././.(./.(.(.~ ~ Q ZXAXZXZXFXVXFXFXFXFXFXGXFXAXDXFXFXFXFXFXFXFXFXFXFX3X9.4.1X,X2X,X,X,X1X5.:.1X9.,.4.1X,X2X2X5.0X1XtX7X..X.X.X.X.o.8X1X5.,.:.1XqX<.<X1X2X,X,X,X,X-Xb x b b v b b b 5 v -Xv b l a b l -X;Xc z d sX@ g ,.wX4X1X,X,X1X,XtX,X,X1X0X>.wXtX<.wX2X,X3XO.X.X.X.X.X.X.X.X.X.X. .o. .8X>X,X,X0X<X2X,X,X,X,X<X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXBX[ / Q _ Q.].'..X'..X.X@X.X.X.X X.X X.X X X.X|. X|.|.|._._.|.|.{.|._._.Q./ ! S ZXVXZXZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXo. .x k v v ;Xa 2.kXg :X>X,X,XtX4X5.,.-.-.-.-.<.b d d 2 q.z p x :X6X- - + + d 7 5 a p @ v *Xb j ,.-.-.,.0X-X9Xp *X>X2.:XKXeX2.a z @ p + z & % d v k v v v v a | -Xs l :Xk *XO l ;X:XsXz k z p b x + h @.@.> @.-X6X..X.X.X.X.X.X.X.X.X.X.X.X.X.X.7XDXZXZXDXZXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX} ~ ~ ` T T i.f.i.i.z.i.a.a.a.a.a.a.a.a.a.a.a.i.i.u.a.u.i.i.i.u.i.i.i.u.~ ~ S AXFXVXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXv ,X2X,Xv -X:X*Xz @ a a x v -Xd @ p v z n ;Xd - k k -Xd 7 n j @ v :Xn d 0X,.:.2.=.,.:X:Xb h d a a p @ z - z / | | } | | | n 4 @ } u @ 4 8.2.- z h + z v - o O O p -X>   | s p f n - -X;X-XwX<.;.,.>.-.-.-.-.-.;.-.-.-.-.>.4.<X,X,X,X:Xk -Xk v v VXVXDXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXAXGXZXFXAXAXBX} ! ! _ b.F.K./././.(.^.!.~.~.~./.~.[./.~.~././.[./.T./.~.[.~.~.~.[.[.F./ / ' BXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXwXwX,X,X2X,X1X9.>.>.;.qXwXz > } v 5 > | n @ z n z a z n b @ 8.kXx @ k 9.*X@ > +.n p | { | @.*Xj j a ;X6X6X/ | O.X.X.X.X.X.X.X.X.X.X. .n h n sXh k g *Xz q * u h - p z l sX5 @ sXz @ b 1X>XwX:.>.;.2.n ;.,.9.qXqX<X2X,X,X2X,X<.qX1X:.>.5.>XsXaXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXFXAXAXZXS ) ~ b.n.Y./.^.(.(.(.~.~.Y.Y.L.L.L.L.L.T.Y.T.Y.Y.L.Y.L.L.Y.L.L.L.L.L.U.U.L.L.Y.Y.Y.T.T.U.T.U.U.U.L.L.R.L.Y.Y.U.Y.Y.U.T.P.P.U.U.U.L.L.L.S.H.H.U.H.H.",
+"m m m m m m m m m N m N m @.m m N B m m m m m m N N N N B B M B B N B B C N V V B B B C B C B C Z C C C C N B C C C C B Z C B B C N C N B C N N A C N C N A C C C C B B G B C N B B B C B C B N N C C B B C B C B B B B B C Z C C Z C Z Z Z Z Z D D D D F J H D F H D D H H J H J P H U L L L J H H P L Y F.Y.T.T.^.~.T.~.T.~.T.~.~.!.!./././.(.(.(.(.(._.|.|.'. X.X.X.X@X.XzXzX.X.X'.xX.XzXzX.XzX.XzX.XxX.X.X'.xX@XdXdX.X.XdXdXxXzX'.dX.X'.zX.XzXdXzX'.dXdXdX.XzX.XdXdXdX.XdXdXzX'.zXdXdXdX.XzXdXzXcX.XzX XzXdXdXdXzXzXdXdXzXdXzXdXzXzXzXzXdX.X.XzX.XzX.XdXdX.X'..X.X.X.X.X.X.X.X|.|.|.|.|._.|._.|.|._.|._.{._.|.(.(.(./././././././.!././.~.~./.~./.~.~./././././.(./.(./.~ Q Q ZXZXZXFXFXVXAXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFX5.,.<.1X,X2X,X2X,X2XwX:.,.-.-.<.1X,X,X5.0X1X>X6X . .X.X.X.o.+.,X,XwX5.wX1X5.,.<.wX1X,X<X2X,X1X0X,.<.2X1X,X>X2Xb x z p v z p z k :X-Xz k p g k j ,.;.tX2X,X,X,X,X,X,X2XwX;.4.2XwX,.qX4X>X3X ...X.X.X. .X.O......... .7X,X,X,X2X1X2X,X,XtX2X,XtXyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBX_ ! S [ m.].'.zX.X.X.X|..X.X|..X|..X|.|.'.|.|.|.|.|.}._.`.|.^.`.{.`._.~.! ! ^ ZXVXFXFXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXo.+.z -X;Xv ;Xl 4 4 O k >X,X,XyX4X5.-.-.-.-.-.:.v k k =.2.v h l l p w ;X;Xk d O s z @ @ v j j j ,.-.-.>.;Xg j p -XwX0Xn kX4.j g 8.s j b d z d @ @ x h p @ - h W | d v yX2X;Xl -XuX*X;Xz @ z a x n p v z z k l g 7X..X.X.X.X.X.X.X.X.X.X.X.o.X...hXDXDXDXDXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXBX[ ~ ^ c.T E i.i.z.i.i.k.k.a.k.a.a.a.a.a.a.a.i.i.a.u.a.a.u.s.u.i.u.u.u.s.! / ^ DXFXAXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXv <X2X<Xg z 8X-X- g 5.*Xd :X>Xl n s -Xv O O O - @ a a d 6 p O d l l k a b 2.2.4.,.:.b @ h k k j p | f + v g n { n { { 6Xn b j 4 W W - h 4 5 @ w ' - k >X;Xd | k O :X;X- W } v >X-X*X:XuX<.;.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.>.qX4XtXtXyX1XyXyXyXFXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXFXZXFXBX' ! ^ Y b.F.Y.~.~./.~.~.~.[.~.~.~.~.~.~.~.~./.~.~././.(.~.~.~.~.~.~.T.Y.! ! ' BXHXVXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXyXyX3X<XtX,X,X1X4.,.;.wX4XyXv , > - g - > - g 4 4 O h @ + + p 3 x 4 p g k v g + > , g w q = d v v k f 2.<.yXb | o.O.X.X. .X.X.X.X. . .O.;Xh n n l h 4 + 4 4 < h g a z z 5 @ a + + a @ ;X2X:.;.-.-.,.2.v wXqX,X1X1X2X,X,X,X,X2X0XwX,X:.>.5.eXKXkXHXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXZXZXAXFX~ ~ / Y F.L.~./.{.(.(.~.~.Y.U.Y.L.L.U.U.U.U.L.U.U.U.U.L.L.L.H.L.L.L.L.Y.P.U.L.Y.U.L.U.Y.U.U.P.U.U.L.U.L.U.L.U.U.L.L.U.U.P.P.L.U.L.D.L.L.U.S.H.H.H.H.",
+"m m m m m m m m N m m m m m N N m m N m m N m R N N m N M N B V B B N N N B B N B C C B C B C B C N C Z C A C C N C Z B B B C B N C B C C N C A N N C N B C C C C C C C B B B Z B B Z B B N C C N C Z B C B C C C C B Z C C Z C Z Z C Z B D Z Z Z D D D H Z Z Z H H H Z H H H H H H H H L L L P P P H P T F.Y.!.T.T.T.~.T.T.~.~.~.~.~./.!.(././.(.(.(.`._._.|.'.'. X@X.X X.X.X.X.X.X@X'.zX.X.X.X.XzX.XzX.X'.zXzX.XzX.XdXzXdXdXdX.XzXzXzXzXzX.XzX.X#XzXzXdXdXdXdX.XzX.X.XdXdXdXdX.XzXzX@XdX@XzXzXcX.XdXmXzXzX XvXdX@XzXzXcXdXdXdXzXxX'.zXzXdXxXdXzXzXzX.XdXdX.XdX.XdX.X X'..X.X X.X.X'.|.|.|.'._.|. X|._.^._.|.^.^.(.(.(.(././././././././.~./././.~.~./././.~.^././.^./.(.^.~ Q Q CXVXZXZXAXVXZXFXFXFXFXDXDXDXAXFXFXFXFXFXFXFXFXFXSX9.,.9.1X1X4.4.1X,X,X4X4.,.>.:.0X1X5.:.:.,X,X>X6X .X.X.X.X. .+.2X2X2X1X1X4XqX>.>.-.<.2X1XqX<.2XtX5.qX1X3X2XyX2Xb b k n 7X+. .+.+.:X>X2XuX1XyX1X9X4.9.0X2X2X,X,X,X,X,X,XtX0X,X2XwX,.>.0X2X,X8X6X ... .......} 8X6X6X6X>X,X,X,X,X<.0X,X<.>.qX,X1X3XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBX} / c [ m.'.].zX.X.X.X.X.X.X.X.X|..X|.|.|.|.|.|.|.|.}.|.^.`.(._.`._._.]./ Q ^ ZXZXFXZXVXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX ...l >X,Xk k @ @ v 8X-X:XyX2X-X-Xv <.>.-.-.-.<.v s j O O + h 5 5 4 v <XuXf } s O -X} + ;X-X*X2.>.-.-.-.5.-X:Xv b :.2.8.sXb j p j s j j d @ 2.=.+ l - n 8Xh p - - - v 2X;Xz ;X>XKX:X*Xv k ;Xp + + + k p 5 s *X-X<X+.X.X.X.X.X.X.X.X.X.X.X...O...7XDXDXDXDXDXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXZXHXZX' Q S { T e.i.i.k.f.f.i.a.a.a.a.a.a.a.i.a.a.i.a.u.a.u.u.i.i.i.i.u.i.u.u.S ! ^ ZXZXVXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXz >X2X,Xl v 6X-Xp j 9.;Xd :X:X> | n *Xv k iX*Xk ;Xv b b v x b a d - d v b n v ;X9.,.b @ sXaX7 *X> ..W @ b p { pXpXhXpXpXn -XyXv > , d z a p h 4 1.Y v 1X4X-X| } w -X-Xp f - p v v :X1XwX,.;.-.-.-.-.-.-.-.>.-.-.-.-.-.-.-.-.<.tX1X9.,.9X1X2X2X,XVXHXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXAXAXDX] ! S _ b.F.L.T.~.T./.[.~.~.~.~.~.~.~.~.~.~.~.~.~.~.T.[.~.~.~.~.T.T.~.F./ ! _ BXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXtX1X5.,.4.tX,XwXqXwX2X2X,Xl h p z g @ p + g a a a g h a 5 g h a a g a a z g @ 4 a g h h 5 g g *Xk z ;X0X:Xv b } 6X{ } 6X{ 6X+.O.O.O.O.} 4 O 4 g h M.eX# 8.6X+ z ;X;X+ z d d a z - h v :X8.8.-.-.-.8.-X1X,X1X,X,X,X,X,X,X,X,X1X2X1X0X>.9X<X;XsXHXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXAXFX~ ~ ~ b.n.Y.~.(.|.(.(.(.~.~.Y.L.L.U.Y.L.U.Y.U.U.U.L.L.U.U.L.L.K.R.L.L.U.U.L.U.U.U.Y.U.U.Y.U.U.U.U.L.L.L.L.L.L.Y.U.U.L.U.U.L.U.L.L.L.L.H.S.U.S.H.H.A.",
+"m m m m m m m m m m m m m m m m m N m N N B m m N N M N N N N C V B B N V B V A A N C N B C B C C C B B N C C N C N B C B C B C C B N C N C N C N C B B C C C C C B C B C N B B B B B Z B B N C C C N B Z N C B C B C C Z F C C G V C Z D B Z Z D Z Z D D D Z H H H H H H D H H L J L L L J L L P L H P ) F.T.T.T.~.T.T.~.T.T.~.~.!.~./.(././.(.(.(.(.(.|.|.}.|. X.X.X.X.XdX X@XxX'.'.xX@XdXzXzXzXdX.XzX'..X.XzX.X.XdX.X'.dXdX.XzX.X.X.XzX.XzX.X@XdXzXdX.XzXxX@XxXzXzXzXzX.XdXdXdXdXzX.XdXdXzXzXcX.XcXdXdXzXdXdXdXdXzXzXzXzXcX.XzXzX.XzX.XxXdXcX.XdXdXdXdX.X.X.X'.'.zXdX.X|..X.X X|..X|.|.|.`.|.|.}._.|.{._.).|._._.(.(.(./././.(././././.!././.~.~.!.~.~.(.~.~././././././.~ ! ~ ZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXeX:.<.2X4.>.<.1X,X,X1X4.5.qXwX4X5.>.-.>.9.1X>X6X.. .o.X.o.X.8XtX,X1XqX<.,X4.,.>.5.0X,X2XwX0X2XyX1X1X>X2X<X>X8XJ f f | ......o.O. .X.+.<X2XwX:.>.wX9X,.:.tX<X,X,X,X,X,X,X1X,X,X,X0X4.>.0X1XuX2X6X6X8X6X6X8X<XuX>X>X,X,X1X,X2XtX,.5.wX<.5.;.:.9X1XDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX` ! S b.n.].dX.X.X.X.X.X.X|..X|. X X}.|. X|.|._.|.}.}.[.|.`.(._.(.|.|.].S Q ~ ZXVXFXDXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.+.z <X:Xz z x @ v 8X-X:X>X:X:XHXd =.:.;.-.-.:.f | =Xk l n ;X7 n 7 -XuXuXf | ' s :X6X- :X5XwX,.,.>.>.-.-.,.,.b b 5.b j z 7 x v v k k s s 4 2.2.7 l - ! } - z a h a b :Xz v 5X:XM.eXuX2XuX3Xd -X-X;X-Xv eXx *X<XuX6XO. .X.X.X.X.X.X.X.X.X.X.X.X.oXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXCX} ~ ~ [ T e.i.f.a.g.a.z.a.a.z.a.a.i.a.a.u.a.i.i.a.a.u.u.u.i.u.i.u.i.p.u.S / ^ ZXZXCXZXGXFXFXFXFXFXFXFXFXFXFXFXFXZXDXFXZXFXFXFXZXv <X>X:Xl a z a a @ k p g ;X:X- , , ;Xz *XiX:X-XyX2X2X2X1X1X>Xv 6X-Xd 8.:.<.;Xl ;X0Xx x kXx 7 *XO &   d n / c c / n / d 5 a d @ a a d d / =Xp + s s v yXyXv ,   s 1X1XuX>Xk -X:XyX2X2X<X;.-.-.-.-.-.-.-.9.5.;.-.-.-.-.-.-.-.4.2XwX:.,.4.<X2X,X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXAXHX' ! ! Y b.F.].(.T.T.~.^.T.~.~.T.[.T.~.[.T.T.~.~.T.~./.!.~.[.~.~.T.~.[.K.Q ~ ' BXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXFXFXFXFXZXyXyX1X<.>.>.,.4.4X2X,X,X,X,Xz x sX;X@ @ l l @ f { s a = f =X@ > / s p j 5.-Xd 5 kXx 5 , f =X- =XiX:Xz w a z g g @ z h p @ h g ! | } } | f 7 j j 7 d aX8.3 aXM.< a -X-Xg z x l O n l + n { iX' ;.>.,.2.b 1.:.0X1X,X<.0X1X,X,X,X2XtXtX1X0X>X=X0X=XUXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXFXZXAXZX~ / ) b.n.U.~.(.(._.`.(.~.~.P.P.U.L.U.U.L.Y.U.U.T.T.Y.Y.U.L.L.L.L.I.L.Y.U.Y.U.U.U.U.L.T.Y.U.L.Y.L.L.L.L.L.L.L.L.L.L.L.L.P.P.L.L.L.L.L.L.H.H.H.H.H.H.",
+"m m m m m m m m m m m m m m M m m N m m m m N N N m m N N M N N N N B N B B M B N Z N C B B B B B C C B C B C C B C B N C B C C N C C N C B C M A N C C B C C C C B B C C C B C Z B B B B B C N C N Z N C B C B C C C C C C C Z Z Z C Z Z Z Z Z Z D D Z D D Z H D H H F H H H H L Z L L L L L L J H J P U F.T.T.T.T.~.T.T.~.~.~.~.~./.!./././.(.^.(.|._.|._.}.|. X.X|..X.X.X.X.X.X.X.X'..X.XzX.XzX.XdX@XzXzX.XzXzXzX.XzX@XdXdX.X.XzX.XzX.X.X'.zX.X.X.XdXzXzXdX.XzX.X.XxXzXzX.XdXzXdXdXzXzXdXdXzXdXdXdX XcX.XdXdXdXdXzXzXcX.X.XcXzXzXzXzXmX.XzXzXxXzXdXdX.XzX.XzXdX.X.X@X.X.X.X X.X.X.X|.|.|.`. X X}.|. X|.|.^.{.(.(.(.(.(.(.(././.(./././././.!.~./.~.~.~.~.[.~./.~././.(.(.~ Q S ZXAXFXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXwX:.;.>.,.<.1X,X1X5.:.1X1X1X5.>.-.:.5.0X,X3X6X..o.o. .o.+.2XyX,X2XwX<.-.;.5.0X1X1X,X2X,X1X,XyX,X2X8Xo.+.+. ....... .7X8X6X6X8X7X..O.+.3XyX4.,.>.5.9.,.wX1X,X,X,X,X,X,X,X,X,X,X1X1X4.,.0X1X4X>X>X>XtX<.wX2X2X1XwX:.,.0X1X2X,X,.,.9.1X,X>.>.>.0XDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXHX' ! c c.m.].].'..X.X.X|.|.|.'.|.|._.|.}.}._._._.|.}.}.|._.`.^.|.[._._.!./ Q S CXAXFXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXo. .x <X>Xz x 4 @ @ z a v b k sXsXn 2.,.,.-.-.:.c | n - ;X2XyXj x x j -X:Xh , , p s g @ k *Xk 7 j j =.>.-.-.>.j -X;X+ h 5 5 z z p + | -Xs $ O s O d z , , - z n 6Xw z k z :X>X0XsX;X>X,X3X<Xb ;X:X:X;X5 n l h :X3X+. .X.X.X.X.X.X.X.X.X.X.X.X.X.7XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXBX' / ^ ` T t.i.z.i.a.f.i.a.k.a.a.a.a.i.a.a.i.i.i.u.u.a.u.u.i.s.u.i.t.i.s./ / ! ZXZXCXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXZXFXz <X<Xg h p a b g b v b g v v b :Xb b v h -X*X:XyXtX2XyX<X2X,X-X8X-Xd 2.,.,.<.b 4 4 z w z a j k a 8.a *X6X....o.O.O.O.i < k k g } Q + > | } $ =XiXwX=XyXyX-XW =X*X2X2X:Xv k 2X2X,XtXtXwX;.-.-.-.-.-.-.>.5.,X:.-.<.9X;.-.-.-.-.;.;.;.-.-.;.5.1X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXFXAXHX[ ! ! P b.F.K.T.T./.T.~.T.~.T.~.T.~.T.T.~.~.~.T.~././.~.~.~.Y.T.~.T.T.F.S / [ BXDXCXZXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXFXFXFXFXyX3X1X9.-.qXqXwX2X2X3X2X2X>Xz n gXx w l n l @ @.| v d s -Xz 5 > } n - g 9.*X@ x gX2.4 s -Xf a =X5X=Xs w sXsX@ 9 sXsX@ @ sXsX@ v n ! c c v h 5 @ d h < < 3 O 3 4 5 < g 5 l n x g n x p c | { | ;.4.qX;Xv ,.<.1X2X,X0XwX,X,X,X,X,X<.:.5.2X5XuXeXaXGXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXZXFXVXZX~ ) S [ n.Y.~.~.|.^.^.(./.Y.Y.U.L.Y.U.L.U.U.U.U.U.U.U.L.U.U.Y.I.U.U.U.U.L.U.L.U.U.U.L.L.L.Y.U.L.L.L.L.L.L.L.L.L.L.L.P.L.L.L.L.L.G.L.S.L.L.H.H.H.h.H.",
+"m m m m m m m m m m m m m m m m N m m m m m m m m m m m N N N N N N B N N B N N N C N N Z B C B C B N C C N C C B B B C B N C N C C N N N C N C M B C B C A C C C C C B N C B C B B B N B N C C N C N C N N C C B C C C C Z C Z Z C Z C Z B G Z Z Z D Z D D Z G H H H H H H H H Z H L L L L L L J H H P J F.T.T.T.~.T.T.~.~.T.T.~.~././././.(.(.^.(.|._.|.|._.|.'..X X.X.X.X.X.X.X.X.X.X.X.XdX.X.XzX.XzX'.'..X.X.X.X.X.XdX.X.XdX.X.XzX.X.XzXdX.XdXdXdXdXzX#XdXdX.X.XzX'.@XdXdX@XzXzXzXzXzXdXzXzXdXcXdXzXdXdXdXdXdXdXdXzXzX.XdXdX.XzX.XzX.XzXdXdX.XzX'.#XzX.XzX.XdX.X.XdX.X.X.X.X|..X|.|.|.|.@X`.|. X|.[._._.^.|.(.(.(.(.(.(.(./.(./.(./.^././.~./.~.!.~.~.~.~.~././.~././.(.~ Q ! ZXVXFXFXAXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX4X9.>.;.qXwX1X,X1X4.,.4.1X5.>.-.-.<.1X1X,X2X:X+.O.X.X.X. .6XyX,XtX1XtX<.;.,X1XtX,X,X8X+.+.+.+.+.+. . .X. ...7X3X6X6X5XtX>X<XyX>X8X+...+.3XtXqXqX2X>X0X<XyX,X,X2X,XtX2X,X,X<X,X2XyX1X9X4.:.0X1X,X2XwX,.0X1X2X,X:.9.5.tX2X2XyX0X4.5.tX:.9.5.,.5.GXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX[ / S { Q.hX].'..X.X|.|.|.'.|.|.|. X_.}.}.}.}.|.}.}.}._.}.`.|.|.|._._.~.! Q ^ ZXVXFXFXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXGXo.+.x ,XyXg g g b -Xa z g 5 l 4 @ d 2.,.-.-.;.k p ,   d ;X:X:X4 s p w w n _ n ;Xz w z h w | / O 8.z j >.-.,.,.j :X;XsXaX+ sXgXk *Xh W } d z 7 qXk j j *Xg l + / | - g x ;XuXuX-Xg v >X6X .O.+.x / / / / u > f X. .o.X.X.o.X.X.X.X.X.X.X. .X.X...hXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXBX' / S ` T e.i.s.i.g.a.a.a.k.a.a.a.i.a.i.a.i.a.i.u.a.u.u.u.u.i.u.u.u.t.i.S / S ZXZXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXZXZXv :X,Xl g 5.*X:Xb -X*X-Xb 5.,.:.:.:.4.b l <XyXyX>X1X1X2X,X2X,Xk v *Xl 2.>.-.:.b < 2 5 a d z v v z kX8.n 7X .+.o.O.+.} u 9 -Xj w +.W @ + , , a =X=X=X=X1X1Xv W } v 5X;Xv v v -X:X<X<.;.;.-.-.-.-.-.-.-.-.-.;.-.-.5.,X:.-.-.-.-.-.-.-.-.-.<.wX2X2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXBX} S ! P b.Z.F.T.T.T.T.~.~.~.~.T.~.^.T.~.T.~.T.~.[.T.T.~.T.~.T.T.T.T.~.F.! / ' BXDXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXDXSXyX,XyX4.wX4X1X<XtXyXtXtX2X2Xz d z 5 h + 3 + g - > - g s + + a - > - g h k k g @ @ 4 @ p + O g s s k g x kXn + x IXb + x gXn O n O. . ...:X- z p p 7 =.< < 2 2 l 7 2 < 7 z 5 5 + a @ @ z S u x ,.0X4X:Xb 0X>XtX:.0X1X2X,X,X,X2XtX:.,.,.,.qXwXsXsXGXVXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXFXVXVXZXS ~ ! c.n.L.~.(.(._.(.(.!.~.Y.U.Y.L.U.L.L.T.U.T.P.T.T.U.Y.U.Y.U.U.L.P.P.Y.L.U.L.Y.U.L.L.L.L.L.P.L.L.L.L.U.A.H.L.H.L.U.S.S.P.H.L.H.L.H.K.H.H.G.H.S.G.",
+"m m m q m m m m m m m m m m m m m m N m N N m N m m N N M M N N N B N V N N N C N N A N N B m B B C C B C C C N C B C B B C N C C m C A C N C B N C B C V M C C C C B B B B B B B B Z N C C C N N C C N C C C C C C C C C C C C D B Z Z Z D Z Z Z D Z D D Z D Z F D H H H S H H H H L L S L L L L J L S Z Z.T.T.~.T.~.~.~.T.~.[.!././././.(.(./.(.(.(._._._.|._..X X'..X.X.X.X.X.X.X.XzXdX.XdX.X.X.X.X.XzX.X.X.X@X.X.X.X.X.X.XdX.X.X.X.X.X.XdXdXdXdXdXdX'..X.XxXzXzX.XzXdX.XxXdXzXzXzXdXzXzXzXdXdXcXdXdXcX.XdX%XdXdXfXzX.XcXzXzXxXzXxXdX.XzXxXzXvX.X.XzX.XzX.X.X.X.X.X@X.X.X'.'..X|.'.|.|..X`.`. X X}.|.|.[.^.(.(.(.(.(.(.(.(.(.(.(.(././././././.~.(.T.(.[.!.(./././././.(.~ ! ^ ZXFXFXFXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX1X9.,.<.4X2X,X,X1X9.,.0X1XwX:.,.;.0X2X,X,X2XuX6XO.X.X.X.X...+.<X2X,X1XwX0X2X2X,X,X6Xo...O. . .o. . .O.X.X.6X5X>X>XtX>XyX>X<X<X2X2XtX6X..+.3X2X1XtX2X2X2XtX,X2X<X2X<X+.X.X.X.+.+.8XyX4X1X4.;.wX1X2XtX,.qX2X1XwX,.0X4X<X<.qX1X1X1X:.9.4.5.,X,.5.ZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXHX' Q Q ` Q.].'..X.X|.|.|.|._.|._._._._.|.}.}.}.}.}._.}.}.}.'.)._.{.|._.].! Q ^ ZXAXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXGXO.X.x ;X:X*X:X1X1X>Xj 5.*Xz b ;Xx b 9.>.-.-.<.f / =Xp - d 5 h a z h l / eXiX:X>Xb sXsXh > +.W d gXsXj ,.,.,.,.j -X;XsXM.O sX8.p g 7 > - @ k k j k 7 j 2.p b s w , - z h k *X>X>X*X*X:X.. .O.+.u 6X6X+.| +.} f  . .o.o.X.o.X.X.X.X.X.X.X.X.X.X. .oXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXAXCX[ ~ S ` T e.f.k.k.k.k.a.k.a.a.a.a.a.a.i.a.a.a.a.u.u.i.u.u.u.u.u.u.u.s.i.~ / ! SXDXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXHXv <X<Xz j 9.*X:Xl g 5.k d 4.>.-.-.-.-.9.v ;X:X<X:X:X2XuX2XuX5X:X:X:Xx 2.,.;.:.b h ;Xk k k j d z z n z | ..7 u ..+.=.7 -Xk *Xs O , , + z 8.aXa p s *X:X>XuX-X- , k -Xk >X1X<X-Xk ;XwX5.5.qX5.;.-.-.-.-.-.-.-.-.-.-.;.-.-.-.-.-.-.-.-.-.,.9.4X2X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXZXFXBX' ! ! Y b.F.Y.[.T.T./.T.T.T.T.T.T.T.~.T.~.T.~.T.~.T.^.~.~.T.~.~.T.T.T.F./ / ' BXZXVXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXAXFXFXFXDXDXDX5.;.,.1.1X4.;.:.;.:.;.,.,.4.v 4 v 7 g 7 7 7 g g 7 7 g - v g g g 7 4 g h w @ g h 5 a g 4 @ z p p s w z @ @ @ @ @ @ O + @ h O 4 6Xo.X. .O.n @ v c d l h w h l g 4 @ w g a @ z l 5 a g v b <.,.9.qX2X1X;Xb 4XwX4.5.tX2X,X,X,X,X,XyXqXqXqX5.yX:X:XsXGXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXFXDXFXVXZX~ ~ ~ b.F.L.~.^.(.`.`.(.~.~.Y.Y.Y.Y.U.Y.T.L.U.T.Y.P.T.U.Y.T.T.T.U.Y.T.P.U.U.Y.U.L.L.L.L.L.L.L.L.L.S.L.L.L.L.H.L.L.L.S.S.U.S.L.H.S.H.H.H.H.H.H.G.S.S.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m N N m N m N N V m N N N N B N N A B B B B B B N Z B N Z M N C C N N Z C B B B N C N C C N C N C C V B Z B C B B C B C B B B B C B M A C N V m V C N C C C C C C C Z C V Z C C C Z Z Z Z Z Z F Z Z Z Z D D D D D D H D H H H H H H H H H H P H H L K H H n.~.T.T.T.T.~.!.~.!.T./.!./.(.(././.(.(.`._._._.|._. X|..X.X.X.X|..X.X'..X.X.X.X.X.X X'.dX.X.X.X.X.X X X X.X.X.X.X@XdXdX.X.X.X.X.X.X.XdXdXdX.XzX.X.X.X.X.XdXdXzXzXzXzXzXzXzXzXzXzXzXzX X.XdX.XdX.XcX.XdXdXcXdX.XcXdXcXdXdX@XxXcX.XzXdX.XdXzX.XzXxX.X.X.XdXdXdX.X.X.X X|..X.X'.|.|.|.|..X X}.}._._.{.(.(.(._.(._.(.(.(.(.(././.(./././././.~.~.~.~.(.~.(.~././.(.~.~ ! Q CXVXZXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXGXDXFXyX2XwX5.wX2X,X,XtX1XwXwX2XtX1XwX5.0X1X2X,X,X,X,X3X+. .X.X.X.X. ...6X2XyX<XuXtX8X+.+.o.O.X.X.X.X.X.X.X.X.X.X.<XyXyXtX2X,X,X,X<X,X,X,X,X,X7X..X.+.3X,X,X,X2X<X+.o.X.X.o. ...7X6X6X....+.8XuX1X4.5.1X2XwX,.0X1X,X,X0XwX1XwX;.-.0X1XwX>.5.2X:.>.,.5.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX[ / Q [ m.]._.'. X X_._.|._._.{.|.`.`.|.(.}. X}.}.}.}._._._.{.|.|.'.(.(.~ Q ^ ZXCXZXDXZXFXZXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXVXVXGXo.o.l 5 d @ z <XyX>Xj 5.b 5 <X5.,.,.-.-.>.:.wXf | n a 4 8.x + l b z @ / | | } >Xk sXn h - , - + l x g 8.2.2.8.v v v d @ + z 5 g v z z @ @ l -Xv v -Xv -Xz v k j x ;Xv @ x z ,X2X2X7XO...7X6Xn g :X;Xz 5 5 *X*XyX8X:X+.o.o.X.X.X.X.X.X.X.X.X.X.X.hXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX' / ! ' T s.s.i.k.j.g.g.x.a.a.a.a.a.a.a.i.i.a.i.u.u.u.u.s.u.u.u.s.u.p.p./ ! S HXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXk :X2Xl p k -X:Xz j 9.-Xf 4.,.;.-.>.,.:.g 7 5 a a z b -X-X-Xv *Xz v b 2.-.-.:.b z j g s 2.7 k p z -Xd { 7 =.[ ..4 7 4 ;X-X| S O } f + l gXn O n M.iX} 1X1X-Xk -Xk g <XwX<.qX4X:Xg :X1X1X1X,X;.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.<.5.5.,X9.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXZXBX} Q ! I b.A.Y.T.U.T.T.~.T.T.~.Y.T.T.T.T.T.R.Y.T.~.~.T.T.T.T.Y.T.~.Y.~.K.Q ! [ fXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXeX:.,.-.>.,.,.;.-.;.2.2.2.2.v 1 *X7 j 3 2 3 l 2 2 2 g 7 j < h < < 2 w - } s p f } s s a sXsX+ g sXsX- g sXsX@ z n 5 @ z 8.w a 6Xo.o.X.o.:X+ a - z w 8.8.< 7 h 8.6X1 4 2.2   7 < n k -Xb ,.<.1X4XwX1.8.v 2X:.5.4X2X,X,X,X,XyX2X>X1X1X2X,X5X=XwX=XHXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXFXAXVXZX~ ~ ( e.n.K.~.(.^.^.^.(.^.!.T.T.T.T.I.U.T.U.U.U.U.P.L.Y.T.Y.T.T.T.Y.P.T.P.P.L.L.L.L.L.L.L.L.L.L.S.H.L.L.H.H.H.H.G.H.L.S.G.H.H.H.H.H.H.H.H.H.H.A.Z.S.",
+"m m m m m m m m m m m m m m m m m m m m m m m N N m m m m m N m m V m V N N N N C m B B B B B B N C m C N C C N N N A B B B C B B N C N N C N C C B C B B C B C C B C B C B B B B B N M M N C A B N C N C C C C C C C C C F Z A C Z B D C Z Z Z F Z Z Z D D D D D D D D Z H H H H H J Z H H H H H J J J G n.T.~.~.T.~.~.~.~.~.(./.(././././.(.(.(.(.(._.|.{.|. X X.X|. X|..X'..X.X.X.X.X.XdX.X@X'.@X.X.X.X.X|..X X.X.X.X|..X.X.X.X.X.X.XzX.X.X.X.XdX XdX.XzXzXzX.XdXdX@XzXzXdXdXzXzXdXxXzXzXzXzXcX.XcXdXcXvXdX.XdX.XdXvX%XdXdX.XdXdXdXdXzXzX.XdX.XdX.X.X.X'..XxXdX.X.X.X.X.X.X.X X|.|.|..X|..X|.|. X X}.|._._.{.(.`.(._.(._.(.(.^.(.(./.(.E././././.T.~.~./.R.~.~./././.~.^.~ ! Q ZXFXZXDXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXSXyX<X1X1X2XtX,X,X,X,X,X,X2X2X,X2X4X1X<X2X,X,X,X,XuX2X+. .X.X.X.o... .o.+.+.+.+... .X.o.o.X.X.X.X.X.X.X.X.X. .+.,X>X4XwX;.;.:.:.,.<.tX,X>X3X8X6X6XO.X.o.+.X... .7X6X6X6X6X8X,X2X1X6X6X..O.:XyX1X5.:.:.>.,.qX1X,X,X1X1X,XtX>.,.5.yX<.-.>.>.<.5.5.tXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXCX' / ! [ m.]._..X|.|. X_._._.|.|.^.(.|._.|.}.}.}.}.}.}._._._.|._._..X.X]./ Q ^ ZXVXDXDXVXVXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXAXGXGXo.X.l j 5.v d -X:X-Xp p v z 2.,.,.-.-.:.2.8.:X- > - h l 8.q.+ x n z a w = * x :Xk @ 5 h b v -Xb v b b v v b b d d x p z l z @ h z 4 =.x @ x a d a d h z z l v g b uX:Xl x h >X3X+.O.+.6Xv p + h 4 z + n l k *XuXuXyXyX+.o.X.X.X.X.X.X.X.X.X.X.O.O.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXBX[ / ^ [ T e.i.k.i.a.a.g.d.k.a.a.a.i.a.a.i.a.a.u.i.u.u.u.u.u.u.u.u.u.u.u.! ! Q ZXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXv yXyX;Xx *XuX,Xz p k s d 4.>.-.>.;.4.0X7 2 4 5.*X5 p 6X-Xp 8X-Xa 2.:.,.-.-.;.b < 2.z   n x j j -X8X{ u c | +.7 j z z g f +.W ,  .W @ z b v p } } { } uX:Xv 2XuX-Xv <.,.-.;.qX,X:Xk *X:X,X<X,.>.-.-.-.-.-.-.-.-.-.-.-.-.-.-.>.-.-.-.-.4.1X<.,.-.FXFXFXFXFXFXZXAXFXFXFXFXFXFXFXFXFXFXFXAXZXAXAXZXMX' ! Q Y b.n.T.T.U.T.T.T.T.T.T.T.T.T.T.T.~.T.(.T.T.~.T.T.T.T.T.Y.T.T.Y.F.S / ' BXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXyXwX5.qX5.qX5.<.,.<.v x ~ n g g - 5 g d d z h z z a g l c c g k k -Xl > } n 4 > | b + x JXn + x UXx + x gXn + x kX8.- v sX8.5 n O.X.X.o.n w + + z l sXeX4 j h lXsX< 4 8.2.a b v sXh @ ;XqX,X,X1.;.,.2.-X>X0X2X2X,X,X,X,X2X2XyX,X<.:.:.:.qXuXeXKXGXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXFXZX~ ~ ~ [ n.!.~.(._.`._.^.(.~.~.T.T.T.T.Y.I.I.L.T.U.T.T.U.U.T.Y.T.T.T.T.P.P.P.U.L.P.P.L.L.L.S.L.L.H.L.H.L.H.H.H.H.H.G.H.H.S.G.H.H.S.H.S.S.S.S.H.A.S.A.",
+"m m m m m m m m m m m m m m m m m m m m m N m m m m m N m N N N M M m V N N N M B N C N N C B B C N m B N C N C C N B B B B C V B C B C C C Z C B C B B C B C B B C C B B C B B B M N C C C C N V C C C C A C C Z C C C C C C Z Z C C Z Z Z Z Z Z Z D Z D D D D D D D H H H F H H H H H H P P H J H J J G b.P.P.T.~.~.R.~.~././.(./.(.(.(.(./.(.(.(.(.(.|.|.|._.|.|.|.|.'..X X.X X.X'..X.X.X.X.XdX'..X.X.X|..X|..X'. X'..X.X.X.XdX.X'.dX.X.X.XdXdX.XdX.X.X%XzX'.dX.X.XcXzXdXzXzXzXzXJXdXzXzXzXzXdXcXcX.XdXcXdX.XdX.XfXdXdXdX.XcXdXcXdXcXzXdXdXzX.XzXzXzX.X.X.X.XdXdX@X.X.X.X.X X'.|.|..X|.|.|. X X|._.}._._._._.`.^.`._.(.`.(.(.{.(.(.(.(././././.~.~.~.~.~.~.~.~.~.~.~././.~ ~ S ZXZXZXZXFXVXVXFXFXFXFXFXFXFXFXFXDXFXFXDXAXFXFXFXFXyX,X2X5.:.5.1X1X5.,.:.:.4.2X,X,X,X,X,X,X2X,X,X,X<XtX6X..X.X.X.X.X.X.X.o. . ... .o.X.X.X.X.X. . . . .X.X.X.X.o.+.,XyXwX5.<.;.>.4.9X<X,X,X,X>XyXtX6X6X6X6X6X6X8X,X,XtX5X>XwX:.:.wX4XtX6X6XX.:X2X1X4.>.<.5.-.0X1X<X<.0X1X2XqX5.5.;.-.<.5.5.3X4X4X3XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX_ ! Q ` n.].].'.|._.}._._._.|.^.|.|._._.|.}.|.}.}.}.}.}.}. X|._. X|.|.].Q Q ^ ZXVXFXZXZXVXZXFXFXFXFXFXFXFXFXFXVXVXFXFXFXFXAXFXFXo.+.c j 9.-X< 7 7 7 7 n x -X<.-.-.>.,.<.v z g p a 7 z + 4 4 w z @ @ d ;Xb b b x b b b b wX>X0X:.;.;.;.,.:.;.:.j :X*XsXKXh v k *Xg 4 =.b g z j *Xk ;Xp z a a a z v :X-Xo 4 k uX7Xo...6X:X=X/ $ a z n 4 b n + p k -XyXuXyXo... .X.X.X.X.X.X.X.O.o.7XAXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXCX' ~ ^ ' T w.d.f.z.z.g.z.a.a.a.a.a.a.a.i.i.i.a.i.i.u.u.u.u.u.u.u.u.u.u.u.~ S ^ ZXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXg -X-X*Xx k -X-Xz g j s g 4.,.,.,.<.b :X7 2 7 9.;Xh f KX-Xs KX:Xd 5.,.,.-.-.qX-X2 q.j , l U f -X+.+.7X7Xf b x z h g l z a - , O > , + b :X:X:Xv & = x :Xv v :.,.b -X5.,.-.-.-.:.0X1X-Xg -XyX0X5.;.-.-.-.-.-.-.-.-.-.-.-.;.<.5.:.-.-.-.;.;.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXZXZXBX' ! Q I b.n.G.T.T.T.U.P.T.Y.P.P.Y.T.T.~.T.T.T.~.T.T.~.~.T.~.T.T.Y.T.!.Y.! Q } BXGXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXyX2X1X1X2X,X4XwX:.<.v S iXeX> g b g 5 - :Xx @ g 5.-Xz Q iXwXf =XiX=Xd , ; - h - * , z z z 5 5 a x @ z w d 5 5 p n v @ z n x 5 ;XX.X.X.o.:Xp 8.8.O w @ + < 7 z @ + 4 5 4 g g ,Xv @ p + ;X1X,X:.>.-.,.2.-X2X2X,X,X,X2X2X,XyX:XyX2X,.,.-.,.5.3XsXaXGXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXDXZXAXAX~ ~ ~ c.n.U.~.(.`.(._.(.(.~.~.T.T.T.T.Y.T.I.Y.L.U.U.T.T.Y.T.T.P.T.T.T.P.P.P.L.L.P.L.L.S.L.S.L.H.L.H.U.A.H.H.H.S.G.G.S.S.S.S.H.S.H.H.H.S.G.H.A.S.A.A.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m N m m N m N m m m V B N B C B B m B m N C m B N N C B C N B B N C B C B C B B C B C B C N B B C B B C B B C B B C B C B B B N M B C N C M N C C N N C C V C C C C Z C D Z A C C Z Z Z Z Z Z Z Z Z Z D Z D D D D D H D Z H H H H H H H Z H H H H J H J L e.Y.^.T.~.~.~.~.~././.(.^.(.(.(./.(./.(.^._._._.{. X_.|.|.|.|..X|..X|..X`. X.X X.X X.X@X.X.X'..X.X.X'..X X X.X'.'..X.X.X.X.X@X.XzX.X@X XdXdXdXdXdXzX.X.XzXzX.XzXdXcXdXzXzX.XdXcXzXzXzXdXcX.XcXdXdXdXcXcXvXdXdXdXdXdXcXdXdXzXzXzXdXzXzXcX.XzX.XxX.XvX.XdX.XdX.X.X.X.X.X|..X.X|.'.|.|.|.|.|.|._.|._._._.(.`.(._.`.^.`.{.|.^.|.(.^.^./.(.~.(.~.~.~.~.~.~.~.~.~./.~./.~ ! Q ZXVXZXZXVXVXZXFXFXFXFXFXFXFXFXFXFXAXDXAXDXFXFXFXFXyX,X5.,.;.0X1X2XwX5.:.>.,.4.1X,X,X,X,X1X5.9.,X2XyX<XyX+.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. ......... .X.X.X.X.o.+.3X>X4X2X9.>.tX1X,X,X,X,X,X<X2X,XtXuX,X2XuX>X2X>X,XwX1.,.,.;.;.wX2XyX2X7X..<XuX2XqX,X1X5.>.wX2X5.>X2X2X1X4X4X5.,.qX4X4X1X,X2XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXZXBX} ! Q ' n.].'.'.|.}.}._.}._._.|.`._._.|._.}.}. X}.}.}.}. X_.|._.|.|._.~.! ! ^ ZXVXFXZXFXVXZXFXFXFXFXFXFXFXFXFXGXFXFXFXFXFXAXAXFXO. .z p g @ 3 2 < 7 7 j v 2.>.,.>.,.2.;Xb v j k 6 2 + g v v @ @ @ l b 2.,.,.;.,.,.,.:.,.:.:X0X;.;.-.-.-.-.;.;.2.-X;XaXM.O v g j p w O O z d 2.2.j 2.p @ 2.9Xk w + @ d b l k -X2X+.X.7X:X;X:Xz a x 8.7 s g p x n @ -X;X:X;X7X..X.X.X.X.X.X.X.O.O.oXDXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX} ~ Q [ T e.d.k.s.a.a.i.a.a.a.z.a.a.u.a.a.i.i.u.u.u.u.u.u.u.u.u.u.u.u.s./ / ~ ZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXp j 5X*X@ g 2.*Xl k 2.k z 8.2.2.2.0X:X:X7 2 a *Xp d a z p + f p - 8.2.2.2.8.3Xv   O h @ 5 2 S +. .:X:X-Xh +.6Xg g 4 < v s s s p s p k g -Xk v v k k k v -X>XqX9.2.-X,X-.-.-.-.-.-.0X4X:Xk :X1X4X5.>.-.-.-.-.-.-.-.-.-.-.>.4.1X:.-.-.<.5.;.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXDXDXHX[ ! S I b.n.G.U.U.T.U.T.T.P.P.T.T.T.T.T.T.T.T./.T.T.~.T.T.T.T.T.T.T.Y.F.! S ' fXHXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXyX1X5.,.,.,.5.4XwX0Xb | { | > l n v 5 u 6X/ w j 9.*Xw | { Q f =X>X=Xk l g l g 7 l l g l 4 7 z 4 4 5 7 v b v k n x v b v l v b 6XX.X.o.+.n l gXsX4 z a - z z - - z z z @ - z c c l l v b 2X2X5.>.,.,.2.n 2X,X<X,X2XtX<.:.:.:.0X1X0X5.-.>.5.:XwXsXVXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXFXAXFX~ ~ ~ b.n.K.(.^.^.`.(.(.E.[.~.~.~.T.T.Y.T.T.T.T.T.T.T.T.T.Y.Y.T.Y.T.T.T.P.Y.P.L.L.U.L.L.L.L.H.H.H.G.S.H.H.G.H.S.S.A.S.S.A.S.S.G.S.S.S.H.A.A.A.A.A.A.",
+"= m m m m m m m m m m m m m m m m m m m m m m m m N m m m m N m m M M N N B N N N N C N C N C N N B B B B B N C C C B C B C B C B C B C C N C C C B C N B C B C C B B B B B B B C V V B V C m V C C V C C C C C C D C B C C Z C Z C Z C C Z C Z Z Z H Z Z Z H D D D D D H H H H H H H H H H H U H H L H G b.!.T.~.~.[.T./././././.(.(.(.(./.(.(.{.(.(.^._.|.|._.|._. X X.X X|.'..X|.|..X|. X.X.XdX X'.'. X'.|.|.|..X|..X XdX X.X.X.X.X.X.X.X.XzXdXdXdXdX.X.XzXdXzX.XzX.XdXdXcXdXcXdXnXdXzXxXdXzXcXdXdX.X.XcXdXcXdXdXcXdXcXdXvXcXcXxXdXxXzXzXzXzX.XdXxX.XxX.XzX.XdX.X.X.X.X X'. X.X|..X|.|.|.|.|.|.|.|.|.|._.|.|.|.^._.|._.^.`.^.(.(.(.(.(./.(.~./.~.~.~.~.~.~.~.~.~.~./.(.~.~ ! ^ ZXAXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXyX4X9.>.0X1X,X2X1X4X9.>.5.0X2X,X,X,X2XqX>.-.4.2X2X,X>X,X+.O.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.6X6X6X6X8X+.o.X.X.X.X.o.+.,XyX4X0X,.wX,X,X,X,X,X,X,X,X,X,X,X1X,XwX<.wXtX1.;.>.4.4.-.>.0X1X<X,X>X6X..8X>X,X,X,X2XqXwX,X1X2X2X2X<X<.0X4X5.5.1XwX9.:.0X3XGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX[ ~ ! ` m.]..X{._._.|._._.|.`.`.`._._.|._.|._.|.}.|.|.|.|._.|.|.{.|._.!./ Q S ZXVXFXDXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo. .u *Xn b *Xb x a @ p -X4.,.2.j *Xx z z s 7 j < + x v :Xb @ w x 5 8.,.>.;.>.-.5.4.-.,.2.*X-X4.,.-.-.-.-.-.>.j -X-Xp 7 + 5 | -Xs v k j h v v z v k z z j qXk a 2.5.*X:X- ;Xz *X+...7X:Xn -Xk d 4 b g uXtX*Xb n a g b l h -X6X+.o.+.O.X.X.X.X.O.oXGXDXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXHXBX[ ~ ~ ' T i.i.i.a.a.a.k.k.a.a.k.k.i.i.a.a.i.i.i.i.u.u.u.u.u.u.u.u.u.u.u.~ / S ZXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXz *XiX:X@ j 5.;Xg ;Xv k d x z z z z l l g v w z w v b b v b v b v v v n v -Xl z p a @ a h v c d d @ n ! z +.6X-X! S + f } s O } s -X;X:XwX<.wXwX1.:.:.:.wX4X1XwX,.wX<X;.-.-.-.-.-.-.0X1X-Xz ;XtX1X9X-.-.-.-.-.-.-.-.-.>.<.qX:.>.-.>.4.1X:.-.-.-.ZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXAXAXBX} S ! U e.F.F.U.U.U.U.Y.U.U.P.U.T.T.T.T.T.T.T.T.~.T.T.~.T.~.T.T.Y.T.~.F.~ ~ [ BXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX:X:X0X2.4.2.0X:X<X:Xz t = = a @ + + h - , , g @ k v g t = = l k s s g 2 l 2 l < 7 3 2 < 3 2 2 2 2 2 2 n 7Xo.n | O.+.+.7X+.+.+... . . .O.n z a + 5 4 b 2 + 4 j 2 + - j 2 O c { iXQ ;X;Xb 1X5X>X>.>.,.2.-X1X>X>X>X<.,.-.>.>.-.5.4X1X1X:.,.9X=X:X*XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXVXZXZXSXDX~ ~ ~ b.n.!.E.(.|.^.(.(.(./.~.~.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.P.P.P.P.P.D.L.S.U.S.H.S.L.G.L.S.H.H.S.S.H.l.A.S.G.S.S.S.S.G.S.S.A.Z.A.h.A.h.",
+"m m m m m m q m m m m m m m m m m m m m m m m m m m m m m m m m M M M N N N N N N N N N N N B N B B B N B B B C N C N B C B C B C B C B C N C N B C N C Z N C B B C C B B N u B M u B B C B C C N C V C C B A C C C C Z C Z A Z C Z Z Z D Z H D Z Z Z H H Z Z Z D D D D D F D D Z H F H H H H H Z L H J H [ L.~.~.T.~.~.T././.(./.(.(.(.!.(.(.(.^.(.(._.|._.{.|.|._.|.|.|.|..X X|..X|.|.|..X.X.X'. X.X X X`.|.|..X.X X.X'.@X.X.X.X.XxX.X.XdX.X.X.X%X XdXzX.X.X.X.XzXzXxXdXdXdXdXdXxXdXdXzXcXzXzXdXcXcXcXcXcXdX.XdXdXcXdXdXdX.XdXdXdXdXdXzXzXzXzXxXzXzXzX.X.X.XzXdXdX.X.X.XdX@X.X X.X X|.'._.|.|.|.|.|.|._._._._._._.|.[._._.(.`.`.(.(.(.).(./.~.[.~.~.T.~.T.T.T.[.T.~.T.~.~.~ ~ S ZXAXFXDXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXyX3X9.0X4X>X7X6X>X2XwX0X4X,X,X,X2X,X2X4.>.-.>.9.2X,XyX>X3X+. .o.X.X.X.X.X.X.X.X.X. . .7X6X,X>X,XuX>XuX+. .X.X.X.o.o.+.,X1XqX,.wX2X,X<X<X,X,X2X,X1XwX<.wX2X<XqX,XwX,.>.,.wXwX>.-.;.wX1X,X,X2X7XX.:X>X,X,X,X1X1X2X2XtX1.wX2X5.;.0XtX:.:.,.,.,.5.1XFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXHXCX' ! ! ` F.Q.]._._._._._.{.^._.(.(._._._.|.|._._.|._._._._. X|.|._.'._.].S ! ^ ZXVXFXFXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo. .6X>XpX0X5X>Xz g 2.-X:XtXwX-Xk k @ g 4.*X3 j s + n v *X;Xw x x @ :X0XqXqXqX0X1X1X0X5.;Xk k j ;.-.-.-.-.-.,.j ;X>Xj j g - | } @ v k 2.s z g - z ;Xb b z v k z 2.9X*X;Xz sXl h 6X8X+.X.8X>X1Xb x :X;X:X:X-X- a a *X-Xh n f *X+. .o.o.X.X.X.X.O.7XDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXCXHX' ~ ~ [ T e.i.i.k.k.a.a.a.a.i.d.a.a.a.i.a.i.i.u.u.u.u.u.i.p.u.u.u.u.t.p.S / ~ DXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXg p k p 5 p k p h -Xg 4 @ p p p @ p a h g 4 @ v k v 0X,.,.,.,.:.:.:.:.:.,.4.b v k k @ 6XsX*X7X/ eXsX/ 7Xn u 6Xx +.W @ - | { , | } b -Xb ;.,.,.,.-.>.>.>.qXwX:.;.<.>XwX,.-.-.-.-.-.>.-.0XyX4Xk -X,X1X9X,.-.-.-.-.-.-.-.,.5.,X9.5.;.-.-.:.-.-.-.-.DXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXAXHX] / S ) b.n.P.U.U.Y.U.P.P.U.U.U.U.U.T.T.T.T.~.T.T.~.T.T.T.T.T.T.T.Y.Y.Z.Q ~ ' BXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXx w l d d d l w @ 5 g h h 5 g 4 h 5 g 4 7 z g h d z g h 5 4 h w w 4 j l l 2 7 l g g z d h z a x 3 =.;Xo.o.O./ } O.o.X...o.O. ...+.X. ...;Xh - 5 l < 2.2.p 4 2.2.- 7 2.2.h Q / M.@.;X;Xv ,X>X>X9X5.5.-Xv <X>XtX>X5.2.5.5.5.5.5X>X<X<X9X4.>XiXeXyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXAXFXAXAXDX~ ~ ~ b.n.U./.(.^.|.(.^.{././.~.~.~.~.~.~.T.Y.T.T.T.T.U.T.T.Y.U.T.T.T.T.T.P.P.P.L.L.U.L.H.H.H.L.H.H.H.H.H.H.S.S.A.A.A.A.h.S.S.A.S.S.H.S.A.A.H.S.A.A.",
+"m m m m m m m m m m m m m m m m m m m m m N m m m m m N m N m B N M m B N B N N N N N N N m N C B N B B B B N N N C B D B C B C B C B C N C N C B C Z C B B B C C B C B B B B B B B B B B B B C C B C C C C F C C C C C D C Z C C Z Z Z C G Z Z D D Z D Z H D Z Z D D D D H H H H D H H H Z H H L U J P J T F.~.~.~.~.~.!././.(.(.(.(./.(.(.(.(.|.^.(.|.[.}._.|._.|.|.|.`.|. X'.@X|.|.|.|. X.X|.'.|.|. X|.@X|.|.|.'..X.X.XdXdX.X.XzX.XzXzX.XdX.X.X.XfX X.XzX.X'.'.zX.X.XdXdXdXdXdXdXzXcXdXdXzXzXdXdXcX.X.XmXdXcXcXcXdXdXdXcXcXcXdXnXdXnXzXzXcXxXzXzXzXzXdX.XzX.XdXdXzX.X.X.X.X.X.X X'.|.'.|.}.|.}.}.}.|.|.|.'.|.|.|.|._._._.`._.^.(.(.(.~.(.~./.~.~.~.~.T.~.~.T.T.T.~.T.T.!.~ ! ! ZXAXFXFXFXAXAXFXFXFXFXAXFXFXFXFXFXFXFXDXAXDXDXGXSX5.:.9.4X>X7XX.+.tX2X2X1X<X,X,X1X5.,.;.>.-.-.>.:.2X,X,X,X>X3X+.....X. .X. . . . ...7X8X5X>X5X,X>X,X,XtX2X+. .X.X.o.X.o.<X>X<X9.;.<.<.>X<X2X1X0X<.tXtX5.<X,X2X4X1X0X>.4.5.,XwX>.>.4.,X,X,X,X,XyX6XO.3X>X2X<X<.0X,X<.:.>.5.1XwX,.>.:.>.<.5.5.4.;.0XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXCXDXHX[ ~ ~ { n.].].'._.`._.`.(.(.(.`.`.^._.|._.|._.`.`.|.}.{.|.}.|._.|.|._.!./ ! ! ZXVXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXo. .7X:XsX;XtX>Xz j 9.;X:XyXyX-Xj k z j 5.;X7 kXj o + O v l + + O @ ;X1X1X1X1X2X,XyX4XuX:Xj j j ,.,.;.>.,.;.,.j -X;Xv v k 5 , , @ b k -Xk 5 =.x 4 -X-X@ a g -X- a k a ;Xl @ @ a :X:X} | } :X;X-Xz @ 5 @ l b b ;Xl l l z n v p :X+.X.X.X.X.X.X.X.oXDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXBX' ~ ^ ` T t.a.a.a.d.k.a.k.a.z.i.a.a.a.a.a.i.i.i.u.i.u.u.u.u.u.u.p.u.u.u.S / ~ DXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX:Xl v k h g g h 5 j =.=.2 O p k d 3 x @ 2 =.4 <XuXv b 2.2.4.2.2.<.>.:.;.1.8.b p 2.j d UXx v 7X/ n b | n k v g z f f d d f f p f f =X-X;X0X5.5.4.,.,.>.-.;.4.4.,.j -X<X-.-.-.-.-.-.-.-.-.:.0X1X-X-X,X4X9X-.-.-.-.-.-.<.5.-.,.5.1X:.-.-.-.-.-.-.-.DXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXAXAXBX[ S ! Y b.n.Z.U.U.Y.U.U.P.P.U.U.U.U.U.T.T.T.T.T.T.T.T.T.~.~.T.T.T.T.!.R.Q / _ BXZXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXx 2 a g 5.-Xg + d d d g 5.*Xa =.j s 5 2 =.=.7 g *Xk d - l k w 5 2.3 d 7 =.2 2 2 h f / s + } s d 7 :XO.O.o.O.c | O.o.X.X.X. .o.o. .X.O.{ b z x l @ a 3 g h h 4 4 h + O O O u + f - -X;Xv :X:X:X:X:X>X*Xv :X:X:X:X:X:X>X:X:X:X:X:X:X:X:X:X:XwXKXaXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXGXFXAXZX~ ~ ) c.n.!./.^.(.(.`.^.(./.(.~.~.[.~.~.~.~.T.T.Y.T.T.T.T.T.T.P.T.T.P.T.P.P.L.Y.L.U.P.L.S.H.H.U.H.L.H.H.H.D.S.A.A.A.z.H.l.A.l.A.h.S.S.A.h.G.A.S.A.A.",
+"m m m m q m m m = m m m = m m m m m m m m m @.m N m N m m N m m m M M M N B N N N N N m C C N m N N N B N B C N C C m B C B C B C B C B C C C Z B B B B C C B B B C B C B B B B B B B B C B C C M C N C C C C C C A Z C C B Z Z C Z C Z Z B D D Z H Z H Z D D L D Z D D H Z H F H D F H H H H H Z H L I L ` F.~.T.T.~.~././././.!.(.(.(././.(.(.(.^.(.^._.|._.|._.|.|.|.|.|. X'.`.|.|..X.X|. X.X.X.X.X|..X|.|.|. X|. X'..X'..X.X.X.XzXzX.XzX.XdX.X.XdX.X.XzXdXzX.XzX.XzXdXxXdXxXdXxXzXdXxXxXdXcXdXdXvXcXcXdXcXdX.XcXdXcXdXvXdXdXdXnXdXdXcXdXdXdXvXzX.XmX.XcX.XzX.XdX.X'.dX.X.X X|..X X|._.|.|.|.}.}.|.|.|. X_.|._._._.|._._._._.{.|.|.(.(.{.(.{.~.~.[.T.~.~.T.~.T.T.~.T.T.~./ Q ^ ZXVXFXZXAXVXAXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXGXSX9.,.<.5X6X....6X2X,X,X,X,X,X,X1XwX5.5.5.:.>.-.0X2X,X,X,X,X2X3X6X+... ... . .6X6X8XyX1X0X:.<.>X,X2X,X,XuX8X..X.X.X.X.O.:X,X1X0X,.-.,.wX1X2XwX:.,.wX1X1X,X2X2XwX:.;.>.wX4X2XwX>.>.0X1X,X,X,X,X,X>X7X..3X2X2X4.-.,.-.-.-.>.:.4.5.4.>.,.0X4X4X3X,.5.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBX' ! ^ ` n.].!.'._.`.(.`.(.(.`.^.^._.|.{.|.'.`.|.|.|.|.|.|. X|.}.}.`.`.].~ ! ^ ZXAXFXFXAXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXo. .6XwXl v >X>Xl @ k a -X<X;Xv v k l O s p O x < - ;X;Xn b v b b b v -XyX2X2X2XuX:X:X;X-Xv k v 8.2.2.2.2.8.2.v v ;Xl z a k v b v v g 2.z 7 =.b 5 j =.# j =.o v ;Xv b h 5 h z b v c / b v b b b z g :Xl z ,X,X-Xz z x v v z z :X6X .X.X.X.X.X.X.7XDXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXDXHX[ ~ ~ ' T e.d.k.a.k.k.a.a.a.a.a.a.a.a.a.a.a.a.i.i.a.u.u.u.u.u.u.p.r.u.u.! / ! HXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXtXsXwX>X*Xn b v l 2 2 3 2 p g k d =.q.j 3 2 l :X:X-Xk p z z z v ;X<.;.:.j :X-X- v < + c e +.7Xd p z } / -XuX;Xb :X:Xv -X:X:X:X:X:X3Xb v ,X:X:X2XqXqX4.>.>.0XwX>.2.-X1X5.-.-.-.-.-.-.-.-.;.,.0X1Xv -X:X:X9X-.-.-.-.-.5.1X:.-.-.;.-.-.-.-.-.-.-.-.DXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXFXZXAXAXHX' ! ! Y b.Z.L.U.L.U.U.U.U.P.U.U.U.U.T.T.T.T.T.T.~.T.~.T.T.T.T.~.T.Y.T.F.! ~ ' BXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXDXx 2 w j 9.-X- l 8.z - j 9.:X- 8.sXz 5 2 2 2 l j 9.j a z :Xb @ 7 5.7 - 7 l 2 7 l z > } :X, | n - :XO.X.O.o.O./ | O. ...O.O.O. . .....6Xj < x n v @ ;Xj 2.-X;X0X2.<Xa -X> + =X5X:Xs ;X;Xb 9.,.,.;.:.<.b b 9.:.:.<.:.:.:.;.:.,.:.,.0X5X>XtX>XeX6XaXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXZXFXAXZX/ S / b.n.!.!.(.(.|.(.(.(.^./.^.(.^./.!.~.~.~.T.~.T.T.T.T.T.T.T.T.T.T.P.P.T.P.L.L.S.S.P.H.H.L.D.H.G.H.H.H.A.S.A.A.A.A.h.S.l.S.S.A.h.A.A.A.A.S.A.S.A.",
+"m m m m m = m m m m m m m m m m m m m m m m m m = m m m m N m N N N m m B N m B m m B m m N m N m V N V V V B B B B B C B C B C C B C B C B Z B N N C N C C N C B C B C B B B C B B B B Z N N Z C C N B C C C C C C Z C Z C C C C C C Z D Z Z Z Z Z Z D D Z u Z K ` _ { m.[ pXaXpXaXgXgXaXgXaXgXaXgXgXaXgXaXaXgXaXaXaXgXpXhXaX].hXhXQ.].'.^.[.[.^.^.^.}. X[.|.{. X}.'. X|. X.X X}.'. X`.|.|..X.X|.|..X.X|. X|.'.'..X.X.X.X.XdX.XdXdXdXdXzX.X.XzX.X@X.X.XzX@XdX.X.XzX.XdX.XzX.XzXzXzXzXzXzXzXcXzXxXzXzXxXxXxXzXxXdXcXdX%XdXfXdXcXcXdXcXzXzXcXdXdXzXzXzXdXxXdXdX.XdX.XdX.XdX.X.X'..X|.|.|.|.|.|.|.|.'._.|.|.|. X|.}.}. X}._._._.|.[._.{.^.(.(.!.^././.T./.T.~.T.T.T.T.T.T.T.T.! ~ Q ZXHXZXZXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.>.-.5.7XO.X.7X>X,X>X2XtX,X,X,X1X1X1X4XwX5.0X1X2X,X,X2X2X2X>X>X3X6X6X8X7X8X>X2X>X2X2XwX1.,.:.<.<.2X1X1X,X7XX.+.X.X. .+.2X1XqX,.-.-.:.tX1X0X,.>.wX1X,X2XwX:.>.9.4.,.0X1X1XwX,.,.:.wX1X,X,X,X2X>X3X..8XyX3X1XqX4.>.>.<.4.>.qX4X1X9X5.tX,X,X2X5.;.FXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX' / ^ ` n.].~.`.`.`.^.`.`.{.`.(.|.(.`._.`.'._. X_.}.}._.}._.|.|._.|.|.~.! ! ^ ZXVXAXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXVXFXo.O.6X>X*Xs =X*Xx b v b b b v b b ;Xz h 5.-Xd v b b >XyXyX1Xb v *X*Xv b :X:X-X-X:Xx l b b v b b v l b b b b b v g v k *X5 ;XtX<X:Xv z v v a O + O q.5.< 7 2.7 x *X*X-Xz x l a 2X7X .+.,XyXyX,X,Xh -XKX;Xz ,X:Xx x a >X7XX.o.+.+.X.X. .X.X.X.X...hXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXCX' / / ` T e.a.k.g.a.k.a.i.i.i.i.a.a.k.i.i.i.a.i.i.i.i.u.i.t.i.u.u.u.u.u.S S Q CXDXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXeXsX;X5X>XpX;X5Xv d a - z w f d w O O O z z @ @ 4 d @ a p d @ + z 2.,.,.,.4.b - M.j @ | +.7X:X;X:X*X6X{ :X:Xn a a - g g @ a z v l z a v v b l v <X:X:X5.>.>.;.-.8.-X5X2X,.;.-.-.-.-.-.-.-.>.5.4X,X-Xk z -X0X5.-.>.-.-.:.-.-.-.-.-.-.-.-.-.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXAXCX' ! ! P b.Z.F.U.U.U.U.L.L.U.L.L.L.Y.U.T.T.U.T.T.T.T.~.T.~.T.~.T.!.~.[.F.~ ! ' BXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXSXx 2 g h k g h + < O h h k h p 3 x < g 3 =.2 g a v v g @ + + h 4 h 4 h < 7 7 l < 7 - > - o > - a n +.| } +.X.l ' } 6X6X} 6X} 6X6X} 6Xj 2 l w 5 a @ v :X<Xv v :X:Xb l ;X;X@ =X5X<Xs ;X:Xb >.4.5.4.-.,.2.b ;.-.-.-.-.-.<.5.5.5.5.5.wX1X1X2X>X:X*X=XCXGXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXZXZXAXAX~ / ~ b.n.T.[.(.(.(.{.^.(.(.(.).(._.{.(.^.T.~.T.T.T.T.Y.Y.T.T.Y.T.Y.P.P.U.T.U.L.U.S.U.S.U.S.H.A.H.S.H.H.H.H.J.A.A.h.h.l.h.A.A.A.A.A.A.A.A.A.A.A.W.G.",
+"m m m m m m m m m m m m m m m m m q m m m = m m m m m m m N m m N N N m N m m m N m m N M N m V N N N V N B u N B B C B C B C B C B B C B C B B C Z C C N C C C C B Z B C N B B B C B B N Z C N C B C C C C C A A B Z Z Z C Z C Z C C B Z Z Z Z Z Q ) [ M.pXaXgXgXgXaXgXgXgXaXgXaXhXaXaXaXpXaXaXaXpXaXaXaXaXaXaXaXpXpXaXaXpXaXpXaXaXpXaXaXaXaXaX].hX].].|. X X}. X X X`.`._.`.`.'.`.|.|..X|.|.|..X|.'.|..X|..X.X.X.X.X.X.X.X.X XdX.XdXdXzX.XzX'. XdX.X.X.X.X.X.XdX.XdX.X.X.XzXzXzXzXzXzXzXzXzXzXzXzXzXxXzXxXzXxXcXdXnXdXcXdXcXdXzXzXzXzXzXzXdXdXzXdXdXdXzXdXdXdX.X.XdX.X.X'.'. X.X|.|.'.|.|._.`. X_.'.|.|.|.|. X}.}.}.}. X_._.]._._.(.(.(.(.(.(./.~./.T.~.~.T.T.~.T.T.T.~.T.~ ~ ^ DXVXZXFXAXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXeX;.;.0X7XO.o.7X>X,X2X>X,X,X,X,X,X2X,X,X1X1X1X,X,X,X1XqX9.tX2X1X>XyXtXtX>X<X,X2XyX2X2X4X5.4.<.>.;.tX0X<.tX6XO.o.X.X.X.X.3XuX<X9.>.-.4.2X<XtX5.5.,X2X,X2XyX5.5.2X2X4.;.wX,XtX9X4.,.qX1X,X1X1X2X,X2X6X..:XtXyX1X2X5.,.qX,X<.tX1X,X2X1X>XtX,X2X1XqXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXBX} / ~ [ n.].].(.(.`.^.(.`.(.(.`.(.(.(._._.|._.}._._.}._. X{.|.|._.}._.T./ ! Q ZXZXZXGXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXFXo. .7X>X>Xb l 5 g >X>X>XtX1X2X1XuX,Xx g 9.;Xd <XyX1XyX1X<XyXv z c z - v b b b b b b :X1X1XwX<.1.b b 1.,.:.:.,.b -XtXg j p v ;Xk k a p z v h l -Xz O h o O g + a -X6X+ - n x k +...+.<X2X,X2X2X:Xz g ;Xk l 2X,Xb n k :X6X..X.X.O.X.X.X.X.X.X.X...O.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXBX[ / ! ` T w.f.i.i.g.z.i.x.a.i.z.a.a.d.i.k.i.a.a.i.i.i.u.u.i.u.u.u.u.u.t./ / ! SXDXCXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXwXx b >XwXM.eX>Xg z <X-Xz Z iXeX> 7 b - @ 2 j s 2 a :X, O 2.< @ g ;X2.4.2.2.v + j g + +.8X:X:X;Xk *X7X+.m.iXu 5 - z p v k k *XuX:Xk k v ,XuX<Xv v b v v 8.2.5.2.:X:X>X:X8.5.4.-.-.-.-.-.-.-.;.0X1XyX1X,X-X-X1X0X5.-.-.-.-.-.-.-.-.-.-.,.>.>.>.>.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXAXBX[ ~ ! I b.n.L.U.U.U.L.U.U.Y.L.U.Y.L.Y.U.T.U.T.T.T.T.T.T.~.~.T.T.T.T.T.F.~ / [ BXHXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXx l g 5 @ 5 g g w 7 g h w w g h - w g z p z g 5 @ 5 g h @ h g h a @ g @ z h h h h a @ @ z a a z v n u n f c z a z a z w l f x 5 a h l z z z 5 p c c f d -Xk z l l z l z + s s s p b ;Xx -.0X4X2X,.,.2.n ,.>.-.-.-.-.5.4X1X1X1X1X,X9.5.1X1X9.:.:.IXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXSXDXZXFXZXS _ / c.n.~.^./.(.(.(.(.(.(.(.|._.(.(.(.(.(./.~.~.T.T.T.T.T.T.~.T.T.T.U.T.P.U.U.L.L.A.U.S.L.H.L.U.L.K.H.H.H.A.h.A.A.A.l.A.g.A.g.A.A.h.A.A.A.G.A.A.h.",
+"m m m m 0 m m m m m m m m m m m m m m m m m m m m m m m m N N m m m m m m m m N m N m N N m N N N N N N B N V V B B B C B C B C B B B B B C C B B B B C C B Z N C N C N B C C B B B B C N C N C N C B Z Z A A C Z Z B B N C Z Z N Z Z Z S ' [ m.aXgXgXaXgXgXhXaXaXaXaXaXaXaXpXpXpXpXpXpXpXpXm.pXM.M.pX6XpXm.pXpXpXpXpXM.m.pXm.pXpXpXpXpXm.pXpXpXpXpXaXpXpX].].hX{. X X.X X|.|.|.'. X XdX.X|.`.`.|.|..X.X.X|..X.X.X.X.X.X.X.XxX'..X.XdX.X'.xXzX.X.X.XdXdX.XdX.XdX.XdX.XdXzX.XxX.XzXzXzXzXzXzXcXzXzXxXzXzXzXxXxXxXdXcXdXvXdXdXdXmXcXzXzXzXdXzXcXzXzXvXzXdXzXdX.X@X.XdXdX.X XdX|..X|.|.@X_.|.|.|.|.'.|.'.`._.|.|.}.}.}.}.}._._._. X_._.{.^.(.(.(.^././.^.T.T.~.T.T.T.Y.~.T.T.T.~ ~ Q ZXVXFXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFX4X1.<.1X:Xo.o. .6X2X1XyX2X2X,X,X,X1X,X2X5.<.4.yX,X,X1X4.,.:.4.tX,X,X,X2X,X,X2XqX:.<.:.:.5.4X5.,.>.;.;.,.tX6X..X.X.X.X.o.:X>X1X0X,.-.tX2X2X2X1X1X,X,X,X,X2X1X4X1X1X<XqX:X2X2X1X0X>.;.wX1XwX<.wX,X,X>X7XO.:X1X<X>X1X9X4.,.qX4X,X,X>X,X7X+.o.+.8X1XVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXCX' S S ` n.].!.(.(.(.{./.(.(.(.(.(.^.`._._._._._._.}.}.}.}.|._._.|.}.}.].S Q S ZXVXAXFXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXGXo...7XuX>Xn x g z tXk ;Xk <XyX>X,X:Xg @ k g 4 -X<X:X:X,X>XyXb l n v @ :X>X1X1X,X2X4X2X,X1X0X>.>.2.b j 2.2.5.9X*X-X:Xs k g % f g O | k s :Xv ;X1.5.b b b b b b d k v k h k d S +.8X<XuX4XyXyX<X;Xv :XuX<Xx :X;X- @ a >X6X .X.X.X.X.X.X.X.X.X.X.o.hXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXBX' / ~ ` T e.g.a.g.a.d.i.a.a.k.a.a.a.a.k.a.a.a.a.i.i.i.i.u.i.u.u.u.u.s.t.~ / S ZXVXVXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDX:Xv *X=X*Xb b >Xk v KX-Xd | { / - b 8.8.+ 8.lXx 2 l :Xc 3 8.=.-Xg @ a d p p @ + s p p pXn + s g k :X+.+.{ { @.h n x @ v j j *X:X-Xg 2.a x -X-X:X1X>Xk - d l z z - z x l -X4X>X;.-.;.>.-.-.-.-.-.:.:.qX1X,Xv -X:X1XqX>.,.-.-.-.-.-.-.,.<.5.5.5.;.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXVXFXHX} S ! L b.Z.L.U.U.I.I.U.L.U.L.U.L.L.U.U.T.U.T.T.T.T.~.Y.~.~.T.~.~.T.T.F.S / _ BXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXSXx 2 @ z l g h =.=.2 a 2 j s d 2 j s h b 2.k @ 5 5 g h w l k - 4 2.O d 3 2.5 , n s O - z 5 - } s f O.+.+.+.X./ z n sXw u eXiXu p ;Xn + l x z + c M.iXA =X=X>Xs x b b v v v b x b v -X:Xb 5.:X:X:X2.2.b b 2.4.>.-.-.;.;.<.:.:.:.:.:.-.-.0X1X;.,.,.FXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXDXFXFX~ / ) b.n.].^.(.(.|.(.(.(.(.(.|.{._.|.(.(.(././.~.~.~.T.T.~.T.T.Y.T.T.P.P.P.U.L.L.L.U.L.U.S.H.U.S.U.G.H.H.Z.H.A.A.A.l.A.z.A.A.h.A.A.A.A.A.A.A.A.A.A.",
+"m m q m m m m m m m m m m m m m m m m m m m m m m m m m m m N m m m m m B m N B N N m m N m m N N N N V N V N B B B B N C B C B Z B B C C B B C C B C N B C N C C C C N C C N C C B C B Z N C C Z B B C N C C C C C C C G C H H A _ [ aXgXgXgXgXaXgXgXaXaXpXpXpXpXm.pXM.{ m.m.{ { M.{ { } { { { { { { } ' { { { { { } { pX{ { { { M.M.{ { pXpXM.pXpXpXm.pXpXsXpXpX].hX].`.|.|. X.X X_.`.|..X.X.X.X|.|..X|.'..X.X.XdX.XdXdX.X@XdXzXdXzX.XzX.X.X.XdX.X.X.X.X.XzX.XdX.XdX.X.XzX.XzX.XzXzXzXzXzXzXzXxXzXzXzXxXzXzXxXvXvXcXdXcXcXcXdXzXzXzXzXdXzXzXdXdXvXdXcXzXdXdXxX.X.XdXdX@X.X.X.X.X|. X X|.'.'.|._. X|.`._.|._.}.}.}.}.}. X_._._._._._.[.(.^.^.!./././.~.T./.~.T.~.T.Y.T.T.~.~ ~ S ZXVXFXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXGX3X9.>.5.5X7X..o.O.+.+.X.6X3X,X,X1X5.:.:.>.>.<.2X,X1XqX-.-.-.,.4.2X,X,X2X2X0X<.-.>.-.4.9X1X1XwX5.5.5.4.qX>X,X7X .X.X.X.o.+.2X,XtX5.5.<X,X,X,X,X,X,X,X,X,X,X2XwX<.wX1XyX2X1XwX<.4.5.9.0XtX:.<.tX,X,X,XtX6XO.+.8X>XuXyX2XqXwX2X2X<X7Xo.7X6X7X6X..6XFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX[ / c [ m.].]._.`.(.|.^.(.(.(.(.(.`.^._._._. X_. X}._.|. X|._.|._.}.}.~.! ! Q ZXVXAXAXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXVXo...+.tX:Xg @ @ z <X=.j s b :X>X:X;Xl v b b k x v x g ;X:X:Xv @ @ @ @ :XyX<X2X,X,X,X,X2XwX;.-.>.b v k k *X:X:X*X*Xj M.KXl a v x + W { -X1XyX:.,.,.:.:.;.,.1.2.d k *X-X2X>X7X..6X5X>X-X:X;X>X>Xx z k -X<Xz @ @ *Xl a -X6XX. .O. . . .X.X.X.X.X.O.oXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXGXBX' Q ^ ` T w.f.g.i.f.g.i.k.a.a.a.k.i.a.a.a.a.i.a.i.i.i.i.s.u.i.u.u.u.u.u.~ / ~ DXZXFXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDX+.+.-X+ *Xk k *Xk d v a z = N = w 4 4 4 d 1 x < < h v g O g 5 *Xv 7 sX6X9 sXsX+ 8.sX+ | i eXsXO 6XsX! @.$ = - h 7 p h - } s =X-X-Xv s v p :X, k yXb =.s + 4 =.s O -XuX-Xb ,X1X5.>.<.4.-.>.-.-.-.;.,.;.:.9X4X-Xg -X2X0X5.-.-.>.-.-.<.5.wX4X1X1X<.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXBX' / S Y b.Z.F.L.K.U.L.L.U.U.U.L.U.Y.L.P.Y.T.T.T.P.T.T.T.~.Y.~.T.T.~.~.F.! S } BXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXSXx =.@ l :Xv 5 2 2 =.w 8.sXk @ 8.aXz @ j 9.k 5 l n x @ l :Xb a 7 8.=.a 2 q.b % +.n g n x a > | -X> | W W W / f d ;X8.h / } { @.g -X-Xg l n v p / } 8.@.=X5X:Xs b 3X<X:X:X:X<X>X:X:X<X;Xa c n x l v *Xj v v v 2.4.2.4.;.,.-.;.;.-.>.>.<.wX1X0X5.5.FXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXDXFXFXZXS ~ / b.F.!.(.(.(.(.|.(.^.|.(._._.|._._._.{.^.~.~.~.T.~.!.T.T.T.T.Y.T.P.P.U.U.L.L.L.S.H.S.U.S.S.H.U.L.H.S.S.A.A.A.A.A.A.Z.g.A.A.A.A.G.A.A.A.A.j.h.A.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N m m m N N M N m B N B B B B B V C B B B C C C N Z N Z N C N C N C B C C N C N B C B C C B C N Z N N C C N B C C C B B C Z C G H D Z S { pXgXgXgXgXgXgXaXaXaXpXpXpXpXM.{ M.{ { { ' ' ' / ` ^ ^ c u u u u u u u u u S u u u Q u u u Q Q Q ' ' ' ' ' { { { { { M.M.M.{ m.M.pXpXpXpXpXm.].].'.hX.X.X X|.'. X X X|..X.X.X'.@XdX@X.X.X'..X.XdX.X'.@X.XzX.XzX.XzX.XdX.X.X.X.X.X.XdX.X.XdX.XdXdXdXcXzXzXzXzXzXzXzXzXzXzXzXzXzXxXxXcXdXdXcXzXzXzXzXdXdXfXdXdXzXzXdXcX.XxX.XdX'.zXzXzX.X.X.X.X.X.X.X.X.X.X|..X|.|.'..X|.|.|. X_._.|.}.}._._. X_._._.`.`.(.`.^.(././.(.~.~.~./.T.~.T.~.T.~.T.~.T.~ ! ! HXZXFXZXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX5.>.-.>.4.3XX.X.O.o. . ...6X>X,X1X0X4.5.5.,.:.2X,X2XwX:.,.>.-.;.,X,X2X0X:.;.>.>.>.5.1X4X0X9.1X1X1X4X4X1X2XuX8X .X.X.X.o.X.3X2X2X1X1X,X,X,X,X,X,X,X,X,X,X,X,X,X<.:.wX1XtX1XtX5.,X4XwX,.9.5.,X2X,X,X,XuX>X6X..O.+.8XtXyX4X2X<X6X..+.6X3XtXuX<X6X6XFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX} S ! _ n.].K.(.(.(._.(.(.(.(.(.(.(.|._._._._.|._.}.}.}.|._._._.^._.{.~./ Q Q ZXZXZXZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.O.7X>Xl - h w l :XeXaXl g b h z - l >X,XtXn :X1X2X;Xb v b g b v b l :X1X,X,X,X,X,X,X,X,X4.-.>.b v j j -XuXyX-X;X;XsXsX@ z k z d f f k 1X2X5.>.>.;.-.-.-.,.2.n 9.5.1X,X,X8X .3XyX:Xl x a >X:Xz x v @ :Xh n z *Xh n l *X8X6X8X8X6X+. .X.X.X.X.X.7XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXCX' / ^ _ T e.i.f.g.z.i.i.a.a.k.a.a.a.a.a.a.u.i.a.i.i.i.i.i.i.u.u.i.u.u.u.! ! S HXZXAXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.O.W X.<Xk 5 b k 5 @ k z a 5 @ k k l h d 5 w h h z z h h 5 4 :Xv x IXz z UXz d IXx + ! n UXn 5 IXb > c aXb + ;XuX1X;X- | } k *X;Xl k ;Xz 3X6Xk :Xj kX:X@ 7 lX;X5 b uX;Xb 5X>X3X9XtX1XqX4.>.>.>.-.-.-.-.,.qX4X,Xv -X>X2X0X5.5.-.>.4.4X2X,X,X2X0XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXZXDXZXBX' ! Q I b.Z.Y.H.L.U.Y.U.L.L.U.L.U.U.U.P.T.P.T.T.T.T.Y.~.T.~.T.T.T.T.~.Y.! / ' BXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXx < z + + + h < 2 2 g 3 n 3 h < n 3 g p v -Xz + < O h @ + + d O g < 5 4 O p   > - O + O 5 - > , ;XO.O. .O.o./ a + 5 h > = N w p g k p g 5 @ g - M B t s s s k l z z z n z @ h p w h z f { iX) s 5X5Xs b :Xv b -Xz v 8.4.>.-.>.>.<.5.wX1X,X1X1X1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXZXZXFXGX~ ) _ c.n.].!.(.(._.(.{.(.(.(.(.{.{._.^.{.^.{.^.~.~.~.~.Y.Y.Y.T.T.Y.T.T.P.T.U.L.U.L.U.S.U.S.S.L.L.D.H.H.H.G.H.A.A.j.h.A.h.h.j.h.A.A.A.h.S.A.A.A.h.h.",
+"m m m q m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N m m m N N m M N B N B B N B B B N B C B B C N C N B C C C N Z B C C B Z N C B C C N C B B C C C C N C C C C C C N B G B D Z C C ' b.hXgXgXgXgXgXaXaXpXpXpXM.M.{ { { ' ' ! ^ u u u u f > e e y y 0 q > r : r r > r r : t r r y : y r ; ; e e y u u u S u ! ^ _ / ' { { { { { M.} M.m.pXM.pXpXQ.].'.'..XdX X X.X|..X.X.X.X.X X'.dX.XdXdXdX.XdXdX.X.X.X@X.X.X.XzXdX.XdXdX.XdX.X@X.X.XdXdXdXdXdXzXdXzXzXzXzXzXcXzXzXzXzXzXzXxXzXcXcXdXmXzXzXzXcXdXdXvXdXcXzXcXdXdXzXdXcXvXvXzX.XzX.X.XxX.X.X'..X|.|..X'..X.X|..X X|.|.|.|.{.}.|.}._._._._._._._.(.(.(.!.(././././.^./.~././.T.~.~.T.~.T.T.~.~ ! S DXZXFXZXAXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.,.-.>.,.5.3XX. .o.......X.<X2X2X2X4X4X1XwX0X2X,X,X2XwX5.5.5.qX2X,X2XwX:.>.4.5.qX1X,X,XwX5.yX2X1X0X<.,X2XyX6X .X.X.X.X.X.<X2X,X2X,X,X2X,X,X2X2X2X,X,X,X,X,X4XwX>.;.<.<.wX2X1X2X,X,X5.tX1X2X,X,X2X,X1X,X2X6X+... .+.+.+.+. ...+.2X>X>X2X,X>XyX3XFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXBX' / S _ n.].!.(.(.(.(.(.(.(.(.(.(.(.^._.|.^.{.[.|.}.}.}.}.|._.|._.{.(.].~ Q ^ ZXHXAXZXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXO.o.<X>Xz x x @ @ -X< l 4 k -Xl x 5 @ -X:X*Xv :XyX>X,X2X2X1Xb *X*X>X;X;XyX,X,X,X,X,X,X,X4X0X,.,.2.-X-X*X:X1XyX-X-X:Xv g k >X1X1X>X>X>X2X,X2X1X0X5.-.-.-.-.;.2.v :.,.qX1X1X1X6XyX2X:Xb n p *X:Xd n n g *Xz sXx @ @ M.x @ *X:X-X>XuX3X+. .X.X.X...hXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXBX' / Q ` T e.i.g.i.a.f.g.a.a.a.a.a.a.a.a.a.a.a.a.a.i.a.u.i.a.i.i.i.u.u.u./ / Q ZXFXAXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X./ o.>Xb z *Xz x z *Xv x O z v -Xv 4 2.  @ l ;Xp s j $ / 7 -Xv @ z + @ z d + g 4 a } c d + + z 4 ^ { IXn @ -X:X>Xb - > - -Xk z a k ;X- l g k ,Xk 7 7 5 O 7 g O -XuX;Xv 5XeXsX>X5X,X1X1XqX5.4.-.-.-.-.-.-.qX1X>X-X-X>X1X1X1X:.>.>.1.qX1X2X,X1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXZXZXBX_ ! ! ) e.n.S.U.I.U.L.L.Y.U.K.U.L.L.U.P.T.Y.T.T.T.T.T.T.T.T.~.~.~.~.[.F.! / ' BXDXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXx 7 g z w 5 g d d z g 5 @ @ h g a 5 g h a h l g w l l h z z z c f l 4 5 a a g h z z a d a g 5 h } O.o. . .X.:X5 @ a g g k k g g 4 w h g - z k h h @ h j z v j z x 5 k :X@ -X>   -X> O c | eX@.=X=X=Xs v :X1X1X5X:Xv n b 2.,.<.5.wX1X2X2XtX4.:.0XVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXVXZXZXAXZX~ ~ / b.Z.!./.(.(.(.(.(.(.(.(.^._._._.|.}.{.^.^./.~.~.T.T.~.T.T.Y.~.T.T.T.P.T.U.L.L.L.L.L.L.L.S.L.Z.H.H.H.S.A.A.A.A.A.h.A.A.A.A.A.A.A.J.A.A.A.A.A.h.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N N m N N m m N M M N N N B N m V B N C N C B B C N B B B C N C B C B C B C C C C N C C B B Z B C N N Z Z N C N B B B B B C D S [ gXfXgXgXgXsXaXaXsXm.M.{ { { ' ' u u u u e e y > > r r r r y > : : : : t : r r r * t : > : : r e : r r : : e > : y > e ; > t u y u n u S ' ' ' { { { { { M.{ M.pXM.m.pX].'. X'..X.X.X'..X.X.XdXxX.X.X.X'.xX XdXdXdX.X.XdX.XdXzX.X@X.X.XdX@X.X.X.XzX XdXdXdXdXdXzXzXzXzXzXzXzX.X'.@XzXzXzXxXzXxXcXdXcXdXzXzXdXdXcXdXdXdXdXdXdXdXxXdXzXzXzX.X.XzX.XzX'.zX@X X'..X'..X|..X.X'..X.X.X X.X}._._._._.}._._._._.}._._.`.`.(.(.(.(.(./.(.T./.~.~.T.~.T.~.~.~.T.~.~./ ~ ^ DXFXFXDXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXwX;.:.5.:.<.>X:X7X6X6X6X6X6X7XyX,X1X5.4.2X1X1X2X,X,X,X2X1X1X1X1X,X,X,X1XwXqX1X1X1X,X,X,X2X1X,X,X2XwX5.,X2XyX8X..X.X.X. .X.3XwX<.tX,X2X2X1X1XwX1.<.tX2X,X,X2XwX<.-.>.>.9.,X2X,X,X,X,X4X1X2X2X2X1XwX<.:.wX1X>X>X8X6X6X6X7X6X6X7X,XyX2X4XyX2X2X2X2XFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX[ ! ! _ F.F.].(.(.(././.^.(.(.(.(.^.(.(.(.`._.|._.}.}.}.}._.[._.(._.(.T.! ! S HXZXAXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXO.6X<X:Xl n b g z l c f b b z x n z p x x w @ :X5XyX,X1XuXuXv l n k k ;X1X,X,X,X,X2X2X4X0X;.-.-.;.:.qX4X>X>XyX;Xv yX2X2X2X1X>X,X,X<X<X,X,X,X2X4X2X;.-.-.-.,.4.-X8.2.0X:X:X:X:X<X2X:Xh @ a :X:Xz - + p :Xg @ @ a z @ p + < j s ;X<X>X3X+. . .....7XAXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXBX[ / ! ` E e.i.k.i.d.k.i.a.k.a.a.a.a.a.a.a.a.a.a.i.a.i.i.a.i.i.s.u.i.u.u.S / Q FXAXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXX.X./ X.-XsXx @ + :Xn + p KX5 z 3Xx @ =.5.7 z v KX+ O 4., n F w f c x f l d d c f c a l f c f v v z z 5 4 v a v l v v b v v v b v x v g g b v b v v v v b z j k p -X1X;Xb uXeXeX;X5X2X,X,X1X1X4X5.;.-.-.-.-.-.qXyX2X-Xv :XtXyX0X5.4.,.4.4X1X,X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXHXDXDXDXHX[ ! ! ) b.n.L.U.L.L.I.U.L.Y.U.U.U.L.Y.P.P.T.P.P.T.T.~.T.~.T.~.~.T.~.T.K.! ! [ BXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXl 2 a , v s a f n s z h @ z d 2 j s 4 f f s 2 =.=.z k k k @ u eXeX< 7 - c s 1 =.7 5 2.< a f S s -XO.O.X. .+.n 4 8.b & =X5X,Xs z x z + z n k *Xz x z + ;XuX*X;Xz n l -X:Xw :X;Xa :X6Xa c r @.u k *X=Xk b :X1X9.;.0X4X<Xl v 0XwX4X2X2X<X9.:.-.,.5.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXVXGXZXVXFX~ / / b.n.~./.(.(.(.(.(.(.^.(.|.|._.|.|._.}.^.(./.~.~.T.~.~.T.T.T.T.T.T.T.T.U.U.I.L.L.L.L.L.L.L.L.S.S.L.H.S.h.H.A.A.Z.h.Z.h.h.A.A.A.h.A.A.A.h.A.A.A.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N N m m N M M V N N V V B M M C N C N B B N C B B C B C C C B C B C B N C B Z N C Z B B C Z C Z C B C C N B C C B C _ pXgXgXgXgXsXaXpXaXm.{ { { ' / u u y y y y ; e > 0 0 : e : r r : e e : y r : : y r e r : * y y : : : r : r r t : : ; r : 0 0 0 0 r 0 t e = > : y u u u S ' ' { { { { M.M.} M.{ M.Q.'..X|..XdXdX.XdX'.'.dXdXdX'..XdXdX.X.XdX.XdX.X.X.XdX.XdX.X X.X.XzXzX.X.XdX.XzX.X@XzXzXzXxXzXzXdXdXdXdXzXzXzXzXxXzXdXcXcXzXzXzX.XcXcXdXdX.X@XvXdXcXdXzXzXzXvXzXzXzXdX.X.X'.xX X.X'..X|..X|..X|..X.X X'. X}. X}._._.}._._._._._._._.(.(.(.(.(.(././././.~././.~.~.~.[.T.~.[.T.~.~ ! S ZXVXFXFXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGX3X<.<.4X0X0X1X2XuX>X,X>XyX>X2X2X,X1X0XqX4XqX<.4.2X,X,X,X,X,X,XtX,X,X,X,X2X1X,X,X,X,X,X,X,X,X,X,X,X2X4X2X2X:X ...X.X.X.O.6X1X0X,.wX1XwX<.1.,X0X,.4.tX<X,X,X1X0X>.9.9.>.wX1X,X,X1X,X2XwX9.wX,X9.:.9.4.>.;.wX1X<X>X,X>XuXuX>X>XtX2XtX>X9.:.0X1X9.0XFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX{ ~ ! ` c.K.]././.(./././.(.(.(.(.(.(.).(.`.^.^.}.}.{.}.}.|.(._._.{.(.]./ Q Q CXDXFXZXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFX .7X,Xz z + s f X.....7X1X2Xv @ @ @ a l n g 5 <X2X:X<X3X:X:Xv x { @ w ;X,XtX2X,X2X2X1X0X;.-.-.-.,.4.>X,X1XyXtX-X-XyX2X,X,X2X2X,X,X2X>X,X,X,X,X2X1X5.>.>.-.,.2.f v v l v b k x l ;Xl k n b k b b v b b b g l v v b b l v 8.sXz 5 :X1X4X6X..X.....fXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXCX' / ! _ T e.g.i.z.k.z.i.a.a.k.a.a.k.a.i.a.a.i.i.i.i.i.i.i.i.i.u.s.u.u.u.S / S ZXAXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXX.X.@. . .c d d u f d d d n d - n - f % x w -Xl v f v v , 4 7 | O.O. .O.| / { X.o...n } ..X.O.6X3Xn c f x x c 6Xb ;X3X:X8XwX:.:.:.;.<.b b <.,.:.:.:.:.,.:.:Xg 2.p -X>X;Xb 5Xn x b 5X>X,X,X,X,X2X1X5.-.-.-.-.-.-.<.0X,X-Xg -XyX4X1X4XqX>.:.5.1X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXBX' ! S I b.F.G.U.U.L.I.L.U.L.U.L.U.L.T.T.P.P.T.T.T.T.~.~.T.~.T.~.~.~.T.F.~ ! ' fXGXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXx 2 d f -Xv 5 @.} v @ x n v - 8.sXg @ @.| v 2 =.2 5 -X2.j z | eX{ w 7 f +.n 2 =.w < 8.=.@ f  .:Xf O.O.X.o.O.b z HX8.4 =X5X-Xp v n z p l sXa - x n l @ ;X<.<.;X- a @ v ;Xl x f + l g a v wX:X;Xv wX:X;Xk ;XwX2.4.:X:X:X-Xb 4X3X,X2X2X9.>.-.>.,.5.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXVXZXFXVXZX~ ~ / c.n.]./.(.(.`.(.(.(.(.(.(./.|._._.{._.`.^././.~.T.T.^.T.~.T.~.T.T.T.T.T.U.U.L.U.L.L.L.L.L.L.L.U.S.S.G.H.A.A.A.A.h.h.A.h.A.A.A.A.A.A.A.A.h.A.j.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N m m m N N m N M N M N N V N A M N A V B B B N C N A C C B B B B C C N B Z C C A C N C Z C B N N B N Z C Z Z C Z A P M.gXgXgXgXgXaXaXm.m.{ { ' ' / u u y y y y ; : r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r t r : r r r y r r r r r r r r r r r r 0 r r ; y u u i / ' ' ' { [ { { M.{ { m.].dX'.`..X#XfXdXdX.XdX'.'.dX X.XzX'.dX'.dX XdX.XdXzX'..X.X.XzXzX.XdX.XzXzXxXdXzXzXzXzXdXdXzXxXdXzXzXdXzXcXdXxXcXnXdXnXdX%XdXfX X.XdXvXdXdXcXzXzXzXcXzXzX.XzXzX.XdX.X.XzX'..X.X'.@X.X.X'..X.X.X.X|..X|. X|._.|._._.`.`.(.`.`.(.(.^.(././.^./././.(.~.~.!.!.~.~.~.~.~.~./.~.~ ! S ZXZXZXZXFXFXAXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXDXyX0X;.5.4X4X,X,X,X,X,X,X1X5.4.1X2X2X2X1X1X4.,.:.2X2X,X,X,X,X,X1X2X2X2X2X,X,X,X2X,X,X,X,X,X,XtX2X2X2XyXyX:XX. . . .X. . .<X2XqX>.wXwX:.-.-.:.-.>.wX1X2X,X1XwX:.>.wXwX,.0X1X2XwX9.wX,X:.<.2XwX,.<.2XtX>.-.:.wX2X2X,X2X2X2X,X,X,X,X,X<X>.<.wX2X5.wXZXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXVXBX[ ! ! ` n.F.~.^.~.^././././.^.(.(.(.(.^.`._.^.`._.^._.(._.(./.(.(.{.(.Q.J ! ~ ZXVXFXFXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.6XtXz n l *X+...X.X.o.o.6Xb c f v c f z g a :XyXv -Xx - v x w h k k l ;XuX<X,X1X0X<.;.-.-.-.>.4.1X,X,X,X,XyX-X-XyX>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X1X0X5.>.,.2.v 9.:.:.:.qX4X:Xb v *X:XsXwX5X>X+.tX2X*X-Xz l :Xk :X*Xl -X3 b 6 z *X<X6X..O.X.X.X.7XDXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXHXBX_ ! Q ` T w.d.a.g.g.g.i.a.a.z.a.k.a.a.k.a.a.a.i.a.a.i.a.a.i.i.i.u.u.i.u./ / ! ZXZXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.o./ X.X.X.X.X. .+. . .o.+...X.+. . .X...X. .X.+...o.O.O.o.o.o.X.X.X. .W | ....X. .' { X.X.X.X.X. .X.o. . .X.X.| { +.O. .6X5.q.5.q.8.:X:X8.q.4.q.8.q.2.5.;X-Xv f -X6Xf b yX*X*X*X5X>X1X,X,X>X2X>X1X5.>.>.-.-.-.>.5.4X2X1X-X-X:X,X>X4X0X4.>.qX1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXAXBX' ! ! T b.n.L.U.U.L.U.L.U.U.L.L.U.U.U.T.P.P.P.T.T.~.T.T.~.~.~.T.~.T.T.K.! S } BXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXl 3 w s + O d , > - a O 3 O - < c < h & = - < < 2 l v v k z * m @.2 g , > - 4 3 7 + g 4 h - > , v +.| | +.+.f p - 4 4 s s =Xs z w p p h 5 p a h z a a 2.,.>.2.d - k v l g 5 5 g l d @ d z b v g g z k p z v v v w x x + v 2X,X<XtX9.>.-.-.-.,.5.AXAXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXVXAXFXZXHXDX~ / ) b.n.^.T.^.(.(.^.(.(./.(.(.|._.|._._.^.(.^.{.E.(.~.T.~.T.T.T.~.~.T.T.T.T.T.Y.Y.L.L.Y.P.L.L.L.L.L.S.L.L.D.S.H.A.A.A.A.h.A.A.S.S.A.S.A.A.A.A.A.A.",
+"m m m m q m m m m m m m m M m m m m m m m m m m m m m m m m m m m m m m m m m m m N N N m m m m N M M N N N N V N N N N B B N F C N B N B B C B B B C N C B N C N C C N N Z C C N Z Z Z N C N N u M.fXgXgXgXaXaXpXpX{ { ' Q u u y y : > : : e ; ; y r r r r r r : : r r : r r r r r r r r e 0 r r r r r 0 r r r r r r r r r r r * r r r r r 0 e r r r r r e r r : : : > t y u u n / ' { { { M.{ { { m.Q.hXfX.X@X X.XdX@XdXdX@XdX.X.X.X.X.XdXdXdX.XdXdX.X.XzX.X.X.X.X.X.X'.zXdXxXzXzXzXzXxXzXzX.XdXdXzXzXzXzXnXdXdXdXvXdXcX.XdXdXdXcXdXdXcXdXdXdXzXzXzXzXxX.X.XzXdXzX.X.XzX'..X.X'.zX.X.X'..X.X.X.X.X|.|.|.|.{.|.|._.(.(.(.(.(.(.`.^.(.(.(.(./.(.(.~././././.~.~.~.~.~.~.T.~.~ ! ~ ZXVXFXFXFXFXAXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXZXFXyX4X9.,.4.1X2X2X,X,X,X,X1X4.,.4.2X2X,X,X2XwX:.,.4.2X,X,X,X1X1XqX<.<.4.,X,X,X2X2X2X,X,X,X,X,X,X,X2XyX>X8XO. .X. . . . .6X,XwX:.-.:.-.>.>.-.-.9.9.:.<.tX,X2XtX5.<.;.;.>.wX1X,XwX,.wXwX,.0X1X,X5.<X1XwX>.>.-.;.<.wX,X9.:.wX2X2X,X1X,X2X5.wX1X,X3XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXBX' ! ^ ` b.].].(.~./.(.~.^./././.(.(.[.(.(.^.`.`.(._.(.(.(.(.(.(.(.(.(.U./ ! S ZXVXFXFXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXO.+.yXl b x @ +.X.X.X.X. ...X.X. .o.o...6X2Xb :X4Xv 4 b 7 -X-Xl *X>X2Xb -XwX;.,.:.-.-.-.-.-.>.4.1X2X,X,X,X,X,X;X-X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X1X2X;.;.4.n :.,.:.,.5.4X,X<X2X5XeXpX;X5X6XX.6X:Xl l @ d z 2 j s w h z @ z b *X6X . ...X.X.X.oXDXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXZXZXBX[ / Q ` T k.j.a.f.a.f.a.a.a.a.a.a.a.a.a.a.a.a.i.a.t.i.a.a.a.i.i.i.i.u.u./ S S CXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.O.S X.X.X.X.X. . .X. . ...X.X. . .X.X.X.X.X.X. . .X.X.O.o.X.X. . .X. ./ +.O. .X.X.O.X.X.X.X.X.X.X.X.o. .X.X.X.o.X.X.X.X.X...O.O.O.O.+. .O.O.O.o.7XO.O.o.X.O.O.} +. .| ~ } ;X7X7X+.+.3X>X2XtXyX2XyX1XqX4.-.-.-.>.-.qX2X2X,X-Xg -X:X>XyX1XqX0X1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXAXHX[ ! ! ) T F.F.U.L.Y.U.L.L.U.L.P.T.P.T.T.T.T.T.T.~.T.~.~.~.~.T.T.~.T.~.F.! / ' BXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXn v b x v v x l v x v x x v v v v v g l x c z k s k l a z z z a k v g g d - d @ g h @ h g g x x f f c c c c z 4 4 @ g p 4 h < g - w g h 5 w g g w @ z b ;.;.8.d n g >X;X4 x x g :X4 x x g tX:X@ n g *Xn g *Xb j h n l @ b 2X,X2X4.>.-.-.>.:.5.wXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXVXAXFXZXFXDX^ ~ ~ [ F.Q.~.{.^.|.|.(.(.(.(.(./.|.^.^.|._.`.`.^.(.~.~.~.~.~.~.T.T.T.~.~.T.T.Y.Y.Y.U.U.L.U.U.L.L.L.L.L.A.S.H.S.A.A.A.h.A.A.A.A.g.H.G.h.A.A.A.A.A.A.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m m = m m m m m m = m m m m m N m m N m m m F M N N N M V V B V N N B N F C N N N B B N C C N N Z C B N C C B C A N N C Z Z N Z N Z Z ( Q.gXgXgXgXaXaXpXM.{ _ Q n u t r ; e e : : r r : : r r r r r r r r r r r r r r 0 r r r r r r r r r e r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r : = : e r r > e e u u Q Q ' ' { { { { { [ ].hXdX.XdX.XdXdXdXxXdX@XdX.X.XdXdXzX@XdXdXdXdXdX X.XzX.X.X.XxX.XxXdX.XdXzXdXzXdXxXdX.X.XdXzXzXcXzXcXnXcXdXdXxX.XcX XdXdXdXdXcXcXdXvXdXzXzXzXzX.XzXzX.X.X.XdXdX.X.X.X.X.XzX.X.X.X'..X.X|..X.X|.|.|.|.|.`._.`.^.`.^.(.(.^.(.(.(.(.(./././././././././.~.~.~.~.!.~./.~ Q S ZXVXFXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXyX2X0X5.4.<.5.1X,X,X,X,X1X4.,.,.:.4.1X,X2X4X5.9.qX,X,X,X1XqX<.-.>.>.:.,X,X1X0X9.,X2X,X,X,X,X,X2XuX:X+.+. .X.X.X.X. .6X>X4XqX,.-.<.5.5.<.-.>.wXwX,.,.wX2X,XyX1X,X5.4.5.tX2X1X0X,.0X2X5.<X2X,X1X,X,X,X5.4.>.>.>.qXtX>.<.<X2X,X,X<.0X1X4X2X,X,X,X3XFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXCX' ~ ~ [ n.F.Y.!.!./././././././././.(.(.(.^.(.`.(.`.(.^.(.(././.(.(./.].! Q ^ ZXVXFXFXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXo.O.6Xv z g d +. .X.X.o.o.o.o.o.X. .o. ...+.n :XuXv l 8.x *XuXb k *X:Xv :XtX5.9X<.>.-.-.-.,.4.1X1X,X,X,X,X>XyX-X-XyX>X,X,X,X,X2X,X,X,X,X,X,X,X,X,X,X,X2XqX5.:Xv :.;.-.>.4.4XyX>X>X>X;Xx b >X7X .X.6Xv n a d z 8.sXz @ x l @ z z k tX6X+.X.o.o.O.O.DXDXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXHXBX' / ~ _ T e.h.g.z.a.f.z.z.a.k.a.a.a.a.a.a.a.a.a.a.a.a.i.i.a.i.i.i.u.u.i.S / S CXZXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.o.W X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X. .o.o. . .X.X.X. . .X.O... .O.O.W +.+. .X.X. .o.X.X.X.X.X.X. . .X.X.X.X. . .o.X.X.X.X.X.o.o.O./ / o.X.X.o.o.X.X.o.o...O.hX7XO./ u +.| O.o. . .X.+.+.+.8X>X2X,X1X1X5.>.>.-.-.-.<.<.<.qX,X-Xz -X:X<X1X1X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXAXBX' / ! I b.n.P.U.U.U.L.I.L.L.T.U.T.U.T.T.T.T.T.T.T.~.T.~.~.~.~.(.~.~.[.].! ~ ' BXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGX5.:.<.<.:.5.2X,X1X1X,XyX2X1XqX<.:.2.n u eXeX> =XiX=Xz g 2.k a =X>X=Xg 2 z , f s @ 3 j h - u eXwX}  . .X.X.o.-X5 8.n + 5 2.2 @ a -X, @ p :Xn a @ j 3 + 8.,.,.b l sXa k -Xw 8.8.j ;Xw 8.8.g :X;Xw sXz + sXz - 7 7 n w g a b 2X2X<X-.,.,.:.5.wX4X2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXVXAXGXZXFXAXS ~ ~ b.n.!./.(.(.|.(.(.(./.(.(.(.(._.{._.`._.^.(.(.(.~.~.Y.T.~.~.~.~.T.T.T.~.T.T.T.U.T.U.U.L.L.U.L.P.S.P.S.A.H.A.A.A.A.A.A.h.H.S.A.H.H.G.h.A.A.A.z.",
+"m m m q m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m M M M N m V V N N V N B N N V C N A N B B B B N C A N B B C N N B C C Z C C C N G N N S m.gXfXgXgXaXpXM.{ ' ~ S u y y t > r r : : : : r : 0 r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r r r r r e r r r r r r r r r r r : r r r : e 0 > r r r y > e e u u S c ' ' ' { { { { b.m.dXdXdX.X'.@X X.X.XdX.XzX.X.X'.dXdXdX.XdX XdX@X.X.XdX.X@X#X'..XdXzX XxXdXdX'.dXdXzXzX.XzXdXdXxXdXzXcXdXvXcXdXcXcXcXcXdXdXdXdXdXdX.XdXcX.X.XxX.X.X.XzX@X.X.X.XzX.X.X.X.X.X.X`..X.X.X.X.X|.|._._.{._._.`.(.`.(.(.(.(.(.(.(.(.(./.(./.^./.(././././.~./.^.~./././ ~ ! ZXVXFXZXAXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXyX3X3X1X4X1.,.4.1X2X,X,X1X4.9.5.4.9X,X,X1X5.:.1X1X,X1X0X1.-.,.>.>.>.:.,X2X4X5.,.:.9.2X,X,X,XyX8X+.X.O.o.X.X.X. . .6XyX2XwX:.-.-.yX4X4X0X>.-.:.:.9.5.<X,X,X<X2X1X1X4X1X2XwX9.9.5.<X2X1X,X,X,X,X,X,X,X1X1X5.9.-.:.:.>.5.4X,X,X1X5.wX2X<X1X2X2X2X2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXBX[ ~ ~ ) b.F.!.!././.^.~.^./././././././.(.(.(.^.(.^.~.(.(.(.(././.(./.].S ! ^ ZXAXFXZXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo...7XtXtX>X7X .X.X.X.X. ...o.o.o.X. . ...X.f } >Xb o 7 < k :Xv h b w @ :XKXeX=XiX>.-.-.-.4.1X2X>X,X,X,X,X>XtX-Xb yX,X2X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X1X4X:Xv 8.-.-.-.-.5.>X>X>XwX>X*X;X5X:XX.X.+.c g g z w 3 b < z x n @ @ x l *X5X6X .o.O.O.hXGXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXHX[ / S ` w.e.j.s.f.f.g.a.a.a.i.k.k.a.a.k.a.a.a.a.a.a.i.a.a.a.a.a.i.i.i.u./ / ! CXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.o.@.X.X.X.X. .o. . .o.o.O.X.X.X.o.o.o.O.O.o.O.o.X.X.X.X. . .+...+.+.| @./ ! X.O.O. .+.X.O.X.X.X. . ...X.X. . .X.+.+.X.X.X.X.X.o.o.O.) / O.X.o.o.o.X.X. .o.o...7XhXO.} /  .| O.X.X.X. .o.o.o.o.8X>X,X,X,X1XqX4.-.-.-.>.>.>.-.<.<.qX*Xv -X,X,X1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXGXAXAXHX` / ! U b.Z.F.L.L.Y.L.L.T.Y.L.T.U.U.T.T.T.T.T.~.~.~.~.~.~.~.~.~.~.~.~.K.! / _ BXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX0X,.,.,.,.<.1X1X5.:.5.>X2X1X9.,.,.<.v | eX' f =X>X=Xz j 9.*Xp =XiX=Xg 2 7 d -X-X@ =.q.b a / { M.} O.O.X.X.+.b p IX8.4 4 2.2.@ l <Xn a g k ;Xa 4 8.=.4 v ,.,.2.d w p k :Xa - 4 k ;Xa 4 7 g >X-Xz g k p z p - f { iX} >X:Xv 1X>X9.:.5.5.wX4X1X<X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXVXAXFXVXAXFX~ / ~ c.n.T.(.(.`.^.(.(.(.(.(.(.(.(.|.^.|.^._.`.(.(.~.(.~.~.~.~.T.T.T.~.~.~.T.T.T.T.T.U.U.U.Y.U.L.U.P.P.S.S.H.A.A.A.Z.A.A.A.S.h.A.A.G.A.G.A.A.A.H.A.",
+"m m m m m m m m m m m m m m m M m m m m m m m m m m m m m m m m m m m m m m m m m m N m m m m m M M M N M C C M N B V N N N N N N N C B B B C B N C B B Z N C C C N C N N C C N Z N ! m.gXgXgXgXaXpXpX{ ' ~ S y : y ; : = r r r : e r r 0 : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r : r r r r r r r r r * y r r r r r r r = y r r r y : r ; r y y S ) ' ' ' ' { ' { m.m.fXdXdXdXdX.X.X.XdXdXcX@XdXfXzX.XxX.XdX.XdXdX.XzX.X.X'.'.'..XzXdXdXdXdXdXdX'..XdXzXzXzXzXnXxXdXnXvXdXmXdXmXdXdXdXzXzXzXzX XvXcXdXdXdX.XdXdXdX.XzX'..XdX XdX.XdX.X.X.X.X|..X.X.X|.|.|.|.}._.|.^.^.`.`.^.(.(.`.(.!.(.(.(.(.(.~.(.(./.(./.(.(./.~.^././.~.!.~ ~ Q ZXVXFXZXFXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyX2X1X5.:.4.:.5.2X,X1X5.<.4X1X1X1X,X,X2XwX;.4.1X,X4X4.,.-.4.4.4.5.:.9.1X0X;.9.4.5.,X,XyX2X:XX... .X.X.X.X. .7X6X1XwX<.;.-.-.>.wX1XwX:.-.-.-.>.wX4X2X,X,X1XwX1.:.<.wX1X0X,.0X4X,X,X,X,X,X,X,X,X,X,X,X,X1XtX>.>.,.<.4.wX,X9.0X4X2X<X2X4.<.<.1.wXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXDXBX' / ~ ` b.].K.(.~.(.~.~.~././././.!./.^.(.^.{.(.(.(./.(.(.(.~././.[.~.Y.! ! ^ ZXVXAXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.O.+.>X,X5X7X..X.X.X.X.6X6X+...o.X.o.6X6X+.n  .+.v z v - -X1Xv z n z @ ;XsXeX<X9X>.>.>.>.tX1X,X,X,X,X,X,X,XyX*Xv uX<X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,XyX:Xg x :.-.-.-.:.:.qX1X,X5XwXsX0X5X:XO. .+.6X<Xv x v v v z @ z k a n n @ :X6X .X.X.X.7XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXBX' / ~ ` T e.i.f.k.k.k.a.a.k.a.a.a.a.a.a.a.a.a.a.a.a.a.a.i.a.a.a.i.a.i.i.! / Q CXFXVXGXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXo.o.' X.X.X.X. .| +.+.| +.| X. .X.X.+.W | +.+.| W +. .+.+. .@.> n > > b p + { | | X.| f | | X.o.X.+.7X+.O.+.+.+.+.f X. .X.X.X.X. .o.O.| { O.X.X. . .X. .X.X.o.X.hXhXO.| / +.W O.o.o.X.X.X.X.X. . .<XtX,X,X,X1X1X5.;.-.-.-.-.-.-.-.;.<.5.-Xv :X>XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXAXAXAXZX' ! ~ I b.n.A.U.U.L.U.I.L.T.U.U.T.U.U.T.T.T.T.~.~.T.~.~.~.~.~.~././.~.].! / ' MXDXHXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGX3XwX4.5.4.0X2X1X0X4.qX1X2X1X4.,.>.<.v ; m m w s s s k p -Xk g k s =Xg < h s + + d + < p h e @.@./ o.X.X.X.o.b a @ 4 5 o 7 h + z x k h a k k p 4 4 g + 8.>.,.b z 5 z l v g 5 @ z j h - a z v z v :X:X>X<X-Xz c | 8.| uX;Xb 4.:.>.5.4X1X,X,X,X,X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXAXZXFXVXZXS ~ S v.n.].!.(.`.(.(.(.^.(.(.(.|.(.^.`.^.`.`.(.(.^././.!.~.~.~.T.~.~.T.~.T.~.T.~.T.T.U.Y.U.U.U.L.U.U.S.L.S.H.H.S.A.A.A.S.H.z.S.A.G.A.S.G.A.A.G.A.H.",
+"m m m m m m m m m m m m m m M m m m m m m m m m m m = m m m m m m m m m m m m m m m m m m m m m M M M M M M M M N N N N N N N N C N N N B B C N N A B N C A C N B Z Z C C C C C C _ gXgXgXgXaXpXM.{ ' Q u e e e ; ; : : y : r r : r r r r r r r r r r r r r r r y e r r r r r r e r r r r r r r r r r r r r r r r r r e r r r r r e r r r r r r r r r r r r r r r r r r ; r r r : ; r r ; y e r e u S n ' c { ' ' ' c.aXxX XdX XdXdX.XdX'.dX XdX@XxX.X.XdX.X.X.X.X.X.X.XzXdXzXzX@X'.dXdX@XzXdXdXdXdXzXzXzXzXdXdXdXdXdXcXdXcXdX.XzXzXzXdXzXzXzXzXdX.XdX XdX@XdXdXzX.X.X.X'.dX.X.XdX.X.X.X.X'.|..X X X X|.|.|.|.|._.|.`.(.`.(.(.(.(.(.!.(./.(.(./.(.(.(./.(./././.(.(.!.(./././ ~ Q ZXVXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX5.1.5.4X9.<.4X9.,.5.1X1X0XqX2XyX,X,X,X,X,X1XwX5.2X1XqX,.;.5.4X1X1X4XwX5.1X5.,.2X4X1X,X2XyX8XO.O.X.X.X.X. ...6X2X5XwX;.>.-.-.9.5.2X1X0X>.-.-.-.4.,X,X2X1X1XwX4.4.4.5.tX1X,X9.:.tX1X,X,X,X,X,X,X,X,X,X,X,X,X,X5.4.4.,XtX:.;.<.tX2X,X1XwX;.>.>.:.wXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXHXFX' / ~ ` n.F.!.~.].(.~.~.~././.E.[././.^.(./.(./././.^././.^./././.[.~.]./ Q Q ZXVXZXGXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo...6X>X2X5X6X..X.X. .+.5XuX<X+... .+.5X:X-Xx +. .c x n z -XuXb @ a a g :Xn l -XqX,.4.5.5.,X,X,X,X,X,X,X,X2X2X;X-X2X<X,X,X,X,X,X,X,X,X,X,X,X,X,X,X2X,X,X,XyX:Xl ;X:.>.-.-.-.>.4.4X,X5X:XpX;X5XuX:X6X ...6XtX2X>X:X*X- l >X,Xb x p g >X6X .X.X.X.oXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXBX[ / ~ _ T e.j.f.f.a.k.f.a.z.k.a.a.k.a.k.k.a.a.k.a.a.a.a.a.a.a.a.a.i.i.i.! ! ^ ZXFXSXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXo.o.W o.X. .o.+.n j *Xv l w |  .X.X.l -Xp O z l + > | / W W @.b ;X, > KXz @ z x a f n z x @ W O.sX<.9.6X..;XuXuXv | o.o.X. .+.+.+.| +.n / O.X.o. ... . .X.O.o.o.fX7XO.| n +.W  .X.X.X.X.X.X.X.X...6XtX,X,X,X,X,X1X:.-.;.-.-.-.-.-.-.-.;.9X-Xk -XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXBX' ! ~ Y b.n.P.U.L.U.U.U.T.U.T.T.T.T.T.T.T.~.~.T.~.~.~./.~.~.^./.~./.[.F.S / [ BXHXCXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXyX1X1X1X1X1X1X1X1X4X1X5.:.<.-.-.-.1.v @ a g g h g 4 g p - l g h a 4 g v v f l v x v x l v x j j 6XO.X.X.X.+.n w f n p h d d g h p - g g - - g g @ g v v 8.4.;Xa l z k ;Xa -X; p :X@ -X> a tX:X@ z z d z d d l N @.f 4X:Xv :.,.<.wX1X2X2X,X1X2X2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXFXAXVXAXFXZXVXGX! ~ ! T F.]./.(.`.(.|.(.(.(./.(.^.(.|.(.^.|.(.^.(.(.(./.~.!.~.T.~.~.T.T.T.~.T.T.~.T.T.T.T.T.T.U.L.L.U.L.L.S.S.A.H.A.W.A.Z.S.A.A.A.H.S.S.S.S.A.A.A.S.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m V M M N V M M M V N N N V N N N m N N N B B B N C C N C N B C C Z C C m N N A ) aXgXgXaXaXaXM.{ / Q u : : t e r r : r r * ; e : r = e r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r q r r r r r r r r r r r r 0 e r ; r ; r ; = r y ; y = r r r r > e e u u c ! ' ' ' ' ' m.dXdX@X.X.XdX.XdXdXxXdXdX.XzX'.zX.X'..X.XxXzX@XzX.XzX.X.XzXdXdXzX'..XzXdX.XzXzXzXzXzXdXdXcXvXdXmXcXdXcXcXdXdXcXzXvXdXzX@XdXdXdX X.XdX.XxX.X.XxXdX.XdXdX'.zX.X.X.X.X.X.X X|. X|.|.}.|._.|._.|._.`.(.(.(.!.(.!.(.(.(./.(./.(.(.(.(./.(./././.(././.~.~ Q ^ ZXZXFXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDX0X4.0X4X<.<.4X0X9.qX2X<X4X1XtX,X,X,X,X,X,X,X2X2X1X0X>.4.qX1X,X,X,X,X>X1X,XwX:.<.1X2X,X>X:Xo. .X.X.X.X.X.+.8X,X,X1XwX<.-.-.,.tX4X2XwX:.>.>.,.4.2X2X,X1XwX1.:.wX4X1X4XyX,X2X,X5.wX2X<X,X,X,X1X,X,X,X,X,X2X1X<X1X1X1X<X1.<.4.tX2X,X,X9.:.-.>.,.5.4XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXVXBX[ ~ S _ b.K.K.!.~./.~.~.~.~.~.!.[././.^.~.(.E./.^././././.(.~.^.~.~./.F.! Q S ZXVXAXFXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXHXo...6X>X,X>X7X..X.X.X.X.7X2X,X<X| +.} -Xk k a +.O.f z g k :XuXb x v l :X5X*X*X>X0X4.1X1X1X,X,X,X,X,X,X,X,X2XyX-X-XyX2X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X2X:Xv 2X0X4.;.-.-.-.;.qX5X>X;Xc v >X5XtXyX7X.. .6X5X>Xh @ w g tX1X,X,X,X>X6X . ...X.O.7XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXVXBX' / S ` T i.f.g.k.k.f.a.i.a.a.a.z.a.a.a.a.a.a.k.a.a.a.a.a.a.a.a.i.f.i.f.S / ! VXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXGXDX+.| > o.+.+.+.+.v eXx l n z +.....+.v KX+ p v KXz +.O.O.+. .| n n - f -Xk d z KXx *Xv d 8Xl / ..8.;.,.7X../ v k k | o.o. .+.8X>X-Xv k *X}  .+...+.+.| +.+.+.| W ..7X7X' ! W W .. .o. .X.X.X.X.X.X.+.6XuX,X,X,X,X,X:.,.,.>.>.,.,.>.-.-.-.-.1.0X-XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXAXZXAXBX[ ~ ~ ) b.A.U.U.U.I.Y.T.U.T.T.T.Y.T.Y.T.T.T.T.~.~.~.~.~././././.~.~.[.].! / / BXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXyXyXyX2X1X1X5.<.<.<.<.:.4.:.,.>.,.<.v g b s z g 2.*Xa 2 j s @ 2 7 s @ 8.<.:.:.<.:.<.;.;.9.5XwX>X6X .X.X.X.o.:Xt eX:Xc 4 2.< @ 5 2.< @ p -Xn a z n k *Xu sXiX! z n l k ;Xz <Xn v -Xz :X{ k :X*Xw x z + b x + h g k b uX:Xb :.,.5.4X2X1X2X2X4.1.<.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXAXFXDXFXAXAX~ ~ / c.n.~.(.(.`.(.(.(.(.(.(.(.(.(.(.`.|.{.{.(.(.(././.(.R.~.~.T.~.T.~.~.T.~.~.~.~.T.T.T.T.T.T.Y.U.L.L.L.S.H.S.S.S.A.h.A.h.H.A.S.S.S.G.A.S.G.A.G.S.",
+"m m m m q m m m m m m m m m m m m m m m m m m m m m m m m m m = m m m m m m m m m m m m m m @.m M N M M M M M M N N N m N N N M N N N C B B B B N N Z N C N B Z C N N C A A M.fXgXgXgXaXM.{ ' Q u y : y ; y r r r = : y t ; r r r y r r r ; r r r r r r r : r r r r r r r r r r q r r r r r r r : r r r r : r r r r r r r r r r r r r r r r r r r r r r r r r y : r y ; y ; r r ; : ; r r r r r ; e e y > u u S ' ' ' ' _ ' m.vXzXzXzX.X.XxXdXdXzX.XzXzX.XzX.XzX.X.X'.'.zX.X'..XzXzX.XdXzX.XzX'..XzX.XzXzXdXdXxXcXdXdXcXcXdXdXmXcXcXcXdXcXdXzXzXdXdXdXdX.XdXdXdXzX.X.X.X.XdXdXdX@X.XdX@X.X.X.X|. X'.|.|.|.|.|.|._.|.{._.|.(.(.(.(.(.(.(./.(.(.(.(.(./.(.(.(./.(././.~./.~./.~ ~ Q CXCXZXZXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXyX1X4X5.,.<.1X1X1XyX2X1X5.5.1X,X,X,X,X,X,X,X,X,X2X0X5.4X1X,X,X,X,X,X,X,X,X1XwX5.2X2X,X>X6XO.X.X.X.X.X.o.2X>X,X,X,X1XqX,.>.-.<.,X2XtX4.4.4.5.,X2X,X,X1X0X,.>.:.tXtX<.wX1X,X2X2X2X2X2X1X1XwX9.wX2X2X1X2XtX4.wX1X2X2X2X9.5.4X4X2X2X1X4.>.<.9.,.qX1XFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXBX' ~ Q ` b.F.].~.^.~./.~.~.~.!.~.~./././.^.(.[./.(.(././.!./.~.!.~./.~.].~ Q Q ZXVXAXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXFXO.o.X.tXyX>X6X .X.X.o.X...6X>X>Xk k k s 2.j @ 3X6Xn ;X*X:X<X:Xv :XyX5XtXtX>XuX5X,X2X,X,X,X,X,X,X,X,X,X,X,XtX2X;X-XyX2X,X,X,X2X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X:Xb 1X1X4X5.>.>.-.>.>.9XuX:X*X*X5X>X<X>X:XO. .O.7X>Xl n l z :X,X,X,X<X8X .X.X.O.O.O.oXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXHXBX[ / S Y T e.i.i.a.a.z.i.a.k.a.a.z.a.k.a.k.z.a.a.k.a.a.a.a.i.a.z.i.f.i.i.S / ! SXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXHXz -Xg @.W / W @.f n + a + p | .. .+.f n a a + -X@ W o.X.X. .W f c @.-Xv *Xv + v p -Xb a -Xk | O.8.,.;.} O./ eXn a c W ~ W n *X:Xb sX@ + -Xf > ! > = ;Xv + @ :X*Xp -X:X-X> > } > W 6X7Xo.X.X.o.X.X.X. .7X8X>X2X,X>XqX4.4.5.4.4.5.4.4.-.-.-.>.4.<XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXAXAXBX} / S ` e.n.Z.U.U.I.I.U.U.T.U.T.Y.I.T.T.T.T.!.~.~.^.^.[./././.~./.~.T.Q./ / ' BXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3X2X2X1X5.<.-.>.>.-.>.<.4XwX4.4.4.qXz j 4.k a j 9.;Xh 8.aXg @ 8.aXk g b 9.4.<.9.4.=.4.4.2.wX*X-X:X+.X.O.o.o.v u sXsX@.< 8.=.d < 8.=.5 g -X;Xp x sX@ @ / { eX@.z v p -X-Xz n v *X:Xa b -Xk 9.0Xz n v + n x + n g *Xb :X;Xx :.-.:.<.<.<.0X2X:.>.,.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXAXFXZXZXAXAX^ ~ ! b.n.]./.^.|.(.(.(.(.(./.(.(.^.`.(.(.`.|.(.(.^.(.(./.(.~.~.~.~.~.~.~.~.T.~.~.~.~.T.T.T.T.U.T.Y.I.I.S.S.H.H.A.H.W.G.J.A.A.H.S.S.S.S.S.S.H.A.H.A.",
+"m m m m m m m m m m m N @.m m m m m m m m m m m m m m m m m m = m m m m m m m m m = m m m m m m N m m N m B N m N N B N N N N N B B V B N A C N C B Z C A C C B C m T m ) aXgXgXhXaXpX{ ' Q u t r r : r : r r r r r r r * y r r r 0 r r r r r r r r r r e r r r r r * : r r r r * : r r 0 e r r r e r r r : r r r r r r e * y r r r r r r r r r r r r r r r r * r r r r r r r 0 r r r r r r r r r r r r r y y u u ~ ! _ ' c ) { '.xXdXdXzX'.xXzXzX@X'.zXzX'.'.dXdXdX'.zX.X.XzX.X'.dXdX.XdX.XzXdXdXdXcXdXdXmX%X.XzXzXxXxXcXdXcXdXzXxXcXzXcXdXxXdXzX.X'.zXzXdX@XzX.X.XzX.XdX'.dX.X.X.XdX'..X.X.X X|. X|.`.|._.}.|. X X}.}.|.^.(.(.(.!.(.(.(.(.(.(.(.(.(.(.(.(.)./././././.~./.~ ! ^ ZXAXFXZXFXVXAXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3X1XqX9.0X1XyX,X,X1X5.;.5.1X,X,X,X,XyX1X1X2X<X,X2X1X,X,X,X,X,X,X,X,X,X2X2X2X1X1X2X>XyX6X..X.X.X.X.o.6X2XyX1X1X,X2XwX5.4.<.,.wX1X,X1X1X1X1X2X,X,X2X2XtX4.4.5.tX<X5.tX2X,X2X2X2X1XtX9.1.:.<.<X1XwX9.wX:X,.5.4X2X2X2X,X:.<.1.wX1X1XtX<.wX1X>.5.4XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXHX[ Q ~ [ n.F.]././.~.~.~.~.~.~.~.~.~.^.^./.^.^.~.~./.!.~.~.~.~./.T././.K.~ Q Q CXCXZXDXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXo. .6XyXyX>X6X..X.X.X.X.X...7XyX-X2.j s k k z -X,Xb - a z x b l :XyX2X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X2X2X,XuX;Xv 1X,X,X,X,X,X,X,X,X2X,X,X,X,X,X,X,X,X,X,XyX:Xv 2X,X,X1XqX4.;.>.,.9.1X1XuXyX,X,X,XyX2X:X ... .6Xg 4 + v tX,X,X,XyX6X..O.o.o.X.o.7XGXDXSXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXZXBX_ ^ ! _ T i.a.a.g.f.f.f.a.a.z.s.a.z.a.a.s.a.z.a.a.a.a.a.k.i.a.a.a.a.z.i.S / ! CXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX-XKX:X+. . . . .X.+.z s v ;Xz +. .+. .+.v -Xp k }  .X.X.X.X...6X3X2Xv ;XsXw l l l z h k :XtX6X..8.>.,.m.o.f z p + | o.O.o. .+.4X-Xz g d ;X} d ;Xd > :Xn O g iXyXp v <X;X> z sXz f :X>X6X . .o. .X.X.X. .X.7X+.+.8X5X4X4X4X1X1XuX4X4X9X-.-.-.;.5.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXAXAXCX[ / Q ) b.n.Y.K.U.Y.Y.T.T.T.T.T.T.Y.T.T.T.T.T./././././.^././.!.(././.F.! S ' BXDXDXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX5.1.:.:.,.>.-.-.-.-.>.<.1X2X1X1X1X4Xx p v k z h k g z < 8.< - < n 3 w x v v v -Xf v n b l g ;XeX0X8.O.O.X.7X-X> u @.e O 4 4 @ 4 4 g h a s k d a - p @ t = @.= b :X:X<X;Xv :X:X:X;Xv :X:X<X4.b a z a + a z + sXh @ l l l :X5.,.>.,.,.,.5.2X:.:.4.ZXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXVXDXFXFXFX~ ~ ~ [ n.].^.(.`.`.^._.^.(.(.(.(.(.(.(.|.|.`.^.|./.(.(././././.~.~.~.~.~.~.~.~.~.~./.T./.~.T.T.Y.Y.U.L.H.L.H.H.H.G.H.S.S.A.Z.S.H.A.S.S.S.S.S.S.S.S.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N N m N m B N N N N N N B B N N N V N V M C B B B B C C B C N Z B { gXgXgXgXpX{ { Q u u e > r r * r 0 r 0 : r r r r : r r r r e r r r r r r r r r r 0 r r r r r y r r r r r y r r r r r r r r r r r r r r r q r r r r r r r r r r r r r r r r r e q r r r r e r r r r r r e r r r r r r r r r r r 0 r r : r u u ! n ) ! ' c _ ].dXnXxXcX.XzXzXdXzXzXzX@XdXdXdX'.zX.XzXzX.XzX#XdX'.zXdXdXdXxXdXdXdXdXdXdXdXzXzXdXxXcXcXcXcXxXxXxXzXcXdXzXzXzXdXzX.X.XdXdX.X.X.XzX.XzXdXdXdXdX'.zXdX'..X.X.X X'.|.|.|.|.|.|. X}.}._.|.`.{.`.(.(.(.(./.(./././.(.(.(.(.(./.(./././.^././.^.~ ! ~ ZXAXFXZXAXVXZXFXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXyX3X1X1X4X1X2X2X,X1XqX>.<.4X1X,X,X,X,X1XqX<.1.5.2X,X1X2X1X2X,X,X,X,X,X2X0X9.2X0X1.<.4.8Xo.O.X.X.X.X.o.2XwX<.<.4.,X,X1X1X4XwX4.9.9.tX<X2X,X,X,X2XtX<.9.tX4X1X1XtXtX4X1X,X,X,X2XtX<.;.>.>.,.wX4X>X<.,.:.<.-.:.<.<.wX1XwX<.<.,.5.4X<X<.qX4X2X5.wX3XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXCXBX' ! S Y b.F.!.~.!.^.~.T.T.T.~.~.T.~.~.[./.^.~././.~.~.~.~.!.T./.T.T./.F.~ Q Q ZXZXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXo. .+.yXtXyX6X..X.X.X.X.X.o...6X:X-X-Xv z l b b l x 4 n l -X4X2X,X,X,X2X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X2X>X,X<X*X-XyX,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X2XyX2X;Xb ,X,X,X,X1X4X9X5.4.wX2X,X,X>X,X,X,X,X1XyX8X} +. .6X5X6X+.6X>X2X2X>X:X+... .X.X.o.O.DXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXBX[ / ^ ` T e.a.z.f.a.f.f.a.f.k.a.k.a.z.f.z.a.i.a.z.a.f.a.a.a.a.a.a.a.a.a.! ! ! CXZXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXz b z +.O.X.X.X. .X.6Xs >XaXl X. .+. .+.f x @ + +.X.X. .X.o... .6X2Xb IXx + :XtXb p ;Xb s yX7X..M.;.;.} ..c -X  + } O.X.X.X.O.+.<X>X1Xb ;X6Xn n d > v v @ h *X*Xp z x v Q n n v > b g 5X6X..o.X.X.X.X.X.X. . . .+.+.+.+.+.7X7X+.8X5X5X;.-.-.-.4.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXAXBX' Q Q ) e.A.L.L.Y.U.T.U.T.T.Y.U.Y.T.T.T.T.T.~.~./././.(./.(././././.(.].! ! ' BXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXeX9.4.4.;.>.>.-.-.-.-.<.1X1X,X2X2X<Xv z v b x l z l g z z v v v z v l :X1X2X1X0X9.yX4X2Xv l 8XlXqX{ O.o.X.O.+.;Xj g z b z v x v l l k v x d x v z x v v v l z b v v v v v v x v v k v v v v v v l z x l z h d g a l v ,X<X1X9X4.4.4.>.>.<.>.5.4XDXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXAXDXFXVXFX~ ~ ) ` F.T.(.(.^.`.{.^.`.(.(.(.(.(.(.|.(.(.`.(.(.(.T.(.~././././.~./.~./.~.~.!.!.~.~.~.T.T.T.T.T.Y.L.U.L.H.S.L.H.H.H.H.S.S.G.A.S.A.S.S.S.S.S.S.G.G.",
+"m m m m m m m m N m m m m m m m m m m m m m m m m m m m m m m m = m m m m m m m m m m m m @.= m m T N m m B m m N V N m N N N N N B N N V B N B B C B C N B A C B Z m.gXgXgXaXM.{ ' u u e e > e r r r r : r r r r r r r e 0 r r r r r r e q r : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r r r * t r r r r r r r r r r r r r r : 0 r r r r r r ; e y u f K Q c / c m.#XdXcXhXzXdXxXdXdX.XdXdXdXdXdX@XzX'..X.XzXzX.X.XzXxXdX.XdXdXcXcXdXdXdXdXcXdXdXdXcXxXxXxXdXxXzXzXzXzXzXzXdX'.zX.XzX.XdX.XzXdXdXzX'..X#XzXzXzX.X'..X.X.X.X|.|. X|.|.}.|.}.}._.|._.}.{.^.^.`.(.(./././././.(.~.(./.(./././././.(././.~./.~ ~ S ZXFXAXZXDXVXAXAXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXZXZX3X5.<.5.1X1X,X<X,X1X9.-.-.:.5.,X,X,X,X1X4.,.>.5.1X0X<.<.4.1X1X,X,X,X,X2XwX4.4.-.9.:.;.6XO.O.X.X.X. .o.yXqX,.>.>.tX,X,X,X,X2X4X0X,.wX1X,X,X,X<X4X0X>.>.wX1X,X<XtX4XwX9.wX2X,X>XtX4.4.4.4.<.:.<.;.<.9.,.>.-.-.<.<.qX,X<.qX,X>.;.wX,X,.5.4X2X4X4X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBX[ Q Q ` b.F.!.(.Y.T.T.T.~.~.~.T.^.~.~.~./.[.~.~.~.~.!.Y.Y.~./.~.T.~.~.Y./ Q S ZXVXDXZXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.....6X1XyX7X..o.X.X.X.X.X.X. .6XuXuX:Xv k :X*Xz :Xb 8.q.*XuX,XtX,X,X,X,X,X,X,X,X>X,X2XuX,X,X>X,X,X,XyXtX,X,X-X-XyX>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X2X2X<Xl v ,X,X,X,X,XtX1X1X1X1X,X,X,X,X,X,X,X,X,X,X>XuX} X.X.+.X. .+.>X2X,X,X5X7X .X.X.X.X.hXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXCX' ! ^ ) w.e.s.z.f.a.a.a.a.f.a.a.i.z.i.a.f.f.a.f.i.s.a.a.k.a.k.z.a.i.a.k.! ~ Q CXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXx d f +...+. . .O.X.X.a p k p @.| u W @.n n h p +. .X.X.X.X.X.X...+.f i l 0 eXeX@.k -Xv k ,X6XO.8.,.4.6X..} :X} a } O.X.X.X.X.o.+.<X2X;X-X} W f @.f >X:X;X5 l z *Xv 4X;X> @.@.> = sXw k uX6X . .X.X.X.X.X.X.X.X.X.o.O.o. . . . . .+.6X<.-.-.-.4.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXAXAXHX' ! Q ) b.n.D.U.U.U.T.Y.T.T.Y.T.T.U.Y.T.T.T.T.~./.(./.!././././././.(.].! / ' BXDXGXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAX1X1X1X4X0X4.9.;.-.-.>.-.:.5.2X2X1X2Xl :X1X>X2X2X2X,Xv :X,X1X1X0X4.2Xv <XwX<.<.:.4.1X2XyXb w eXeX*Xn o.X.X.o.O.+.+.+.+.+.6X+.6X} +.+.+.+.1X;Xv wX<.<.<.<.<.<.:X2X:X9.<.1.1.<.<.:.;Xv 4.<.<.<.<.1.wX2X<X1X:Xv z v -X-Xz :X1X5X1X4X1X1X5.9.-.>.5.4XDXDXDXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXAXSXVXFXZXAXFX~ ~ ~ b.n.].~.`.`.(.(.^.(.(.(.(.(.(.(._.^.`.(.(.(.(././.^.(.(././././.~./.~./.~.~.~.~./.~.~.~.T.T.I.T.L.L.L.S.S.H.H.H.A.S.A.A.S.S.A.S.S.S.S.S.G.H.A.",
+"m m m m m m m m N m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N m N N N m m N N N N N B N N V N V C N C N C N C M G B V A Z aXgXgXgXpXM._ / S e y y t : : 0 r r ; e 0 r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r y 0 r r * r r r r r r r r r r r r r r r r r r ; t > y t u u Q Q ^ / S c.zX.X@XcXnXdXdXxXcXzXdXdX.XdXdX'..XxXzX.X.XdXzXzXdX.XzXdXvXdXdXdXcXdXdXdXdXcXzXdXxXxXxXxXxXxXcXzXzXvXzXzXxXzXzXzX.XdXzX.XdX'.#X.X'.zX.X.XzXzX@XdX.X X.X|.'.|.'.|.|.}.}.}.}.}.}.}.|.^.`.^.(.(./.(./.(.(./.!.(.(./.(./.(.!./././.^.!./.~ ! ^ ZXFXFXFXFXVXAXFXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXZXGXyX9.,.-.1.5.1X1X1XqX,.-.-.9.qX2X,X2X,X1X4.,.5.1X,XwX;.>.>.<.4.2X1X1X,X2X4X4X5.4.4X5.4.3X+...X.X.o.o.+.3XwX4.9.5.,X,X,X,X,X,X2XwX5.,X,X1X,X1XwX9.:.-.;.wXwX9.wX1XwX4.<.0X1X,X1X2X1X1X1X4XwX,.<.4.<XtX>.<.9.>.0X<X:.4.<.:.:.<.4.wX1X4.;.<.wX1X4.1.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXCX' Q ^ _ b.F.K.~.~.T.^.~.T.T.~.~.~.~.~.~.!.!.~.~.T.!.Y.Y.!.T.T.~.Y.T.T.K.~ Q Q ZXVXFXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X...6XyX1X:XX.O.X.X.X.X.X. . ...+.6X*Xv @ @ z d -Xk 7 g -XyX,X1X,X,X,X,X,X,X,X,X2X,X,XyX,X,XyX2X2XyXyX,XyXyX;X-XyX2X,XtX,X,X,X,X,X,X,X,X,X,X,X,X,X,X,XtXyX:Xb 2X,X,X,X,X,X,X,XyX,X,X,X,X,X,X,X,X,X,X,X,XyX8XX.o.X.X.X.X.+.6X>X,XyX6X .X.X.X.X.oXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXBX[ ! ^ ` T e.f.f.f.a.f.a.k.a.z.s.i.a.z.a.a.f.a.a.a.z.k.k.k.a.a.a.k.a.k.i.S ! Q ZXDXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX:Xf @.n t @... .X.X.X.z d l @ +. . .O.X.c g g p +.o.X.X.X.X.X. ..... .+.+.+.eX6X> O s s k 7X..:X>.,.}  .../ v k @ | O.X.O.O.o.X.X.X.+.;Xl x w w l l a d h z :X;Xa -XuX:Xz f v f d a a k <X:X6X..X.X.X.X.X.X.X.X.X.o.o.o.X.X.X.X.X. .6X9X;.-.,.4.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXAXAXBX' ! Q ) e.F.P.U.U.U.Y.T.U.Y.T.T.Y.T.Y.U.~.~.T.~.~.~./././././.(.(.!.(.P./ / ' fXHXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3X,X2X1X4X4X4.>.-.4.4.9.;.:.<.5.v z <X9X1.5.2X2X2Xv :XwX<.<.-.,.3Xv :X5.>.-.:.tX1X:X2Xb 7 b b j b +.X.X.X.O.X.X.X. .....O.O.o.o. .X...7X-Xl ;X<.,.>.,.,.,.wX1XwX>.>.>.>.>.<.4.b x ,.>.>.;.,.>.qX4X<X9.<.<.8.v v v v :X4.<.<.wX1X1X4X1X:.-.;.<.GXDXDXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXAXHXAXFXFXVXFX~ ~ ~ [ n.K./.(.(._.(.`.{.(.(./.(./.(.^.`.(.|.^.(.(.(./.(./././.(.^././././././././././.T.T.T.T.~.T.U.T.L.L.L.U.H.H.S.S.S.S.H.A.S.S.S.S.S.G.S.S.S.H.",
+"m m m m m m m m m m m N m m m m m m m m m m m m m m m m m m m m = m m m m m m m m m m m m m m m m m m m B m N N M V m N N N N N N B N N N C N C V V C V M A A S hXgXsXgXpX{ ' n u y : r : y = : 0 r ; 0 r r r r r r r e 0 r r r r r r r r r r r r r r r r r r r r q r r r r r r e r r r r r r r r r r * y r r r e r r r r e 0 r r r r r e r r r r r r r : r r r : r r r r r r r r r r r r r r r : 0 r r r r r r : r y r y u u u u n u S ' hXzXzXcXzXcXxXzXxXzXdXzX.XzXzXdX@X'.zXzXzX.XdXxXzXzXzXdXdXcXdXdXzXdXdXxXzXzXzXcXcXcXxXzXzXxX@XdXzXzXzXzXzX.XzXdXdXdX.X.XdXdX'.dXdXzXzX'.dX'..X.X|..X.X|.|. X|. X_._._.}.}.(.{.`.(.`.^.(.(.(.(.^././.(.~./.(./.(./.).T./.~././.~.~.~ ~ Q ZXZXZXDXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX1X9.-.-.>.>.:.5.4X4.-.9.qX4X2X,X,X,X1X4X4.5.4X2X2X4X5.>.-.>.-.<.<.4.2X0X<.<.:.1X0X:.tX>X8X..X.X.X.X. .+.<X1X1X1X,X,X,X,X,X,X,X2X1X2XwX9.,XwX:.-.-.-.>.wXwX,.wX,X:.wXwX:.tX,X9.tX<XyX,X2XtX5.tX1X<X<.,.0X,X,.:.<.<.wXtX<.<.qX4X2X2XyX>.>.;.:.:.9.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXCXBX' ! ^ ` n.].K./.Y.T.~.T.~.~.T.~.~.~.~.~.~.~.~.!.!.Y.K.].K.Y.T.~.Y.T.T.L./ ! ^ ZXVXAXFXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X. .6X3X,X>X:Xo.X.X.X.X.X.X.X.X. . .-Xz l n x @ :XuX,X<X,X>X1XuXtX<XyX1X2X2XuX2XyX2XtX1XyX:X:X<X<X:X:X:X>X<Xv -XyX2X2X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X2X,X,X,X,XtX2X,X,X,X,X,X,X,X,X,X,X,X2X,X,X,XyXtX6X+..... .X.o.o.6XyX8X..X.X.X.O...hXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXDXBX' S ~ ` T e.f.f.k.a.a.a.a.a.k.i.z.a.z.i.k.a.a.a.a.g.k.a.f.f.k.i.a.i.a.z.~ ! S ZXZXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXc - n v ,  .X.X.X.X.d b n z | o.X. . .-X*X:Xk | O.X.X.X.X.X.O. . .X.X...| @.m t p 0X*X/ ..8XwX9.5.7X .+.6X>Xb z | O.+.W  .+.X.X.X.X.X. .f =Xv k k n z @ @ z v O b <X:X;Xb 9.wX:Xw h h l l v 6XO. .X.X.X.X.X...X.+.+.O..... . .X.X.X.8X<.-.-.4.CXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXAXAXZXZXZXZXHX} S ! ) b.n.D.U.I.L.T.T.T.T.T.P.T.P.~.T.~.~.(.~./././././.^./.(./.(.(.].S ! _ BXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX5.5.1X1X1X2X1X4.>.9.4X4X4X0X9.;.<.v :X0X,.,.:.2X2X>Xx >X5.,.,.>.5.2Xb :XwX4.<.;.yXb a w h z z u x x :X..X... .X.X. .X.O.X.X.X.o.o.o.X.o. .+.:Xx b >.<.4.9.4.:X:X:X5.9.4.4.4.b v l ;X5.4.4.9.5.5.wX>X>X5.9.4.4.<.<.<.0X:X:.>.,.5.4X4.0X,X;.-.-.>.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXAXAXAXDXFXAXFX~ ~ _ b.n.].(.(.(.|.(.(.(.(.^./.(.(.(.(.`.`._.^.{.^.(./.(./.(./.^.(././.(./././././.~.~./.~.~.~./.T.T.U.L.L.L.L.S.H.H.S.S.Z.A.S.S.A.S.A.A.S.S.S.S.S.",
+"m m m m m m m m m N N m m m m m m m m m m m m m = m m m m m m m @.m m m m m m m m m m m m m m m m m m m m m m N M N m A N N N B N C N B N C B V C C B C C S ) hXgXgXaXpX{ _ u e q r r y ; ; r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r 0 r r r r r r r r r r r r r r r 0 : r r r r r r r r e 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r 0 : r r : r ; > u u S S S y ! fXdXzXcXzX.XcX.XzXzXdXzXzXdXdXzXxXzX'.zXzXcXzXzXzXzXdXdXdXdXxXcXzXdXdXzXzXzXzXzXdXxXxXxXxXdXvXzXvXzXzXzXzXzXzXzXzX.X'.dXdX.XdX.X.XzXdXdXdX.X.X'..X|.'. X|.|.|. X_. X|.^.`.`.`.(.^._.(.(.!.(.(./././.(./././././.~./.~././.~.~.!./ ~ ^ ZXVXVXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFX5.:.>.>.-.4.4.4.<.-.<.4X1X1X,X,X1X1XqX<.<.1X1X1X,X1X4.>.-.-.;.-.>.9.9.;.<.9.5.2XwX5.,X,X:X+. .X.X.X.o.o.6X>X>X,X,X,X,X2X,X,X,X,X,X2XwX<.wX<X<.-.-.-.>.tX0X,.wXwX>.<.<.,.0XwX,.0X,X,X,X,X,X1X<X9.4.<.,.0X<X>.-.,.0X1X<.qX,X:.wX1X>X1X4.>.:.9.wX4XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXHXHX[ ! ^ _ b.F.K.~.!.~.~.~.T.~.~.T.~.~.~./.~.~.~.!.T.Y.Y.Y.Y.Y.P.T.T.T.T.Z.S ! ^ ZXVXFXAXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXo.X...+.,X,X,XyX6X .X.X.X.X.X.X.X.X.o.W n O + < 5 :XtX>X:X<X:X:X:X>X>X<X:X<X:X<X:X>X:X:X:X>X;Xl h k v z z z l z v yX,X2X,X,X,X,X,X,X,X,X,X,X,X2X,X,X,X,X,X,X,X,X,X,X,X,X2X,X,X,X,X,X,X,X,X,X,X,X2X2X,X,X,X,X,XtX8X6X+. .X.X.X.O.+. ...X.X.X. ...O.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXDXBX} ~ S ` w.e.s.f.f.f.k.a.a.z.i.k.a.a.z.a.a.a.a.k.f.a.a.z.i.k.i.f.k.f.i.f.! ! Q ZXZXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX>Xf Q n b > ..X.X.X.o.d a z p z +.X.X. .f x - p +.O.X.X.X.X.+.+.+.X.X.X...b :X-Xz k iXuX| ..<XsXwX5X6X.. .6XuX;X/ o.o.u -X-Xv 6XX.X.X.X.O./ <XKX:X-Xn x @ x z z k z v b l b >.:.;Xz v k s :Xx b +.o.X.X.X.X...+.2X4.0X8X6X ... .X.X...7X<.-.-.4.ZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXZXZXDXBX` / S ) e.n.D.U.I.R.Y.Y.Y.P.T.T.T.P.T.T.T.~.~.~./.~./.(.!./././.(.(.(.Q.! ! _ BXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXqXqX4X5.5.1X4X9.>.<.1X2X,X1X4X4.:.x ,X0X4.4.qX2X2X2Xv :XwX9.4.5.1X,Xx :X1X4X5.,.2Xb + @ h 5 u eXeX= ;X7X........ ..... ..... ...o.o.X.o.X.O.+.v n 5.;Xv v v v x v v v v v x l :X7X+.7X7X7X7X7X7X6X+.7X+.6X7X3X4.-.-.5.:X:.-.>.5.1X>.>.9.9.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXAXVXFXDXDXAXFX~ ~ ~ [ F.K.(.(._.(.|.|.(.(./.(.!.(.^.(.^.(.^.`.^.`.(.(.(.(.(.(.^.[.(.^././././.!.(././.~.~.~.~.T.T.T.T.Y.P.U.S.L.U.S.H.H.H.S.S.A.A.A.S.S.S.S.S.A.S.",
+"m m m m m m m m m N m m m m m m m m m m m m m q m m m m m m m m m m m = m m m m @.m m m m m m m m m m m N m M M N B N N C N N N B B B B N V B B N B C C A / gXgXaXaXm.' Q u t * ; ; y = 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r q e r r r r e 0 : r r r : 0 0 ; r r r ; ; 0 r e e y : u u n S u ! dXdXdXcXcXvXcXxXzXdXzXzXzXfX.XzXzX.X.XxX.XzXzXzXzXdX%XcXvXnXdXdXvXdXdXzXdXzXcXzXcXxXxXdXcXzXvXxXxXzXzXzXzXdXzXzXdX.X'.zXdXdX'..X'..XdXdX X.X|.|..X X|. X|._._._._.{.`.(.(.(.^.`.`.(.(._.(.(./.(.~.~.(././././.~.(.T././.!.~.~.~ ! ^ ZXVXZXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFX9.>.9.4.qX4X1X1X0X;.;.<.<.5.1X9X<.9.-.-.-.<.<.4.2X4XwX;.-.-.-.-.5.4X5.,.1X4X4X,X2X1X,X,X,X8X..o.X.X.X.X.X.7X,X,X,X,X2X1X2X,X,X,X,X,X4X0X<.1X0X>.-.>.>.wXyX5.tXwX,.>.,.1.4.<.,.0X2X2X,X,X,X<X<.,.0XwX<.tXwX>.>.<.wX,X5.wXtX,.5.1X2X1X1X5.wX4X,X3XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBX[ ! ^ ) n.F.Y.~.~.T.T.T.T.T.T.~.T.~.~.~.~.~.T.~.^.K.F.K.Y.Y.T.T.T.T.P.Y./ ! ! ZXVXFXFXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXo.X...6XtX,X,X,X7X .X.X.X.X.X.X.X.X.o.W u x z z g z z d z d z w z z w z l b l v l z w z l c l h x k *X- x h k -X-X2X,X,X,X,X2X2X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>XuXuX7X..X.X.X.X. .X.X.X.X.X.X.o.hXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXDXBX' ~ Q _ T a.a.f.f.a.f.a.z.x.a.a.a.s.i.i.a.a.z.a.a.z.f.a.z.f.d.f.f.k.k.k.~ ~ ! ZXZXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX<Xc @.> > @. . .X.O.o.-Xv :X:Xv +. .X.+.n n z p +.O.o.X.X. .w -Xp | O.o.O.w + g h p k s W O.;XsX:X:X:XW @.b :Xk > | | f 8X8X-X>X6X..O.X.O./ -X-X-X-Xz k p b :X:X;Xk :X:X;Xb ;.>.qX-XeX;Xp 1X:Xx +.O.o.X.X.X.X.8X4.-.:.<.0X8X7X .X.X. .6X9X;.>.4.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXAXDXAXZXDXHX' ! ! P b.F.L.U.U.L.R.Y.P.T.T.T.T.~.T.~.~.~.~.~.(./.!./././.(.[.(.(.).!.S / ' BXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFX3X4X4X<.;.<.<.-.-.<.1X,X,X2X1X0X5.b :X1X1X1X2XyXyX,Xv :X4X1X1X1X2Xb l <X2X1X5.,.2Xv l n n a W sX8.> :X3X7X6X6X6X7X6X6X7X6X6X7X6X+...o.X.X.o.X.;Xl -X;Xb 9.wX2X1X:X9.<.:X;Xg ;X+.o.X.X. . . . ... . . . . . .X.3X5.;.5.:X:.-.>.5.4X5.4.wX1X:.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXVXAXZXDXVXGXS ~ ! [ F.].E.(.(._.^.(.^././.(.[.(.^.(.(._.|.(.(.(.(.(.(.(.(.[.(.).(.(./.(.(././././.~.~.T.T.~.T.T.T.T.U.P.Y.L.S.Z.H.H.G.H.A.S.S.S.S.S.A.S.A.H.H.S.",
+"m m m m @.m m m m m m m m m m m m m m m @.m m m m m m m m = @.m m m m m m m m m m m m m m m m m @.N m m N M M V N N N N N N B C B B B B C N C C C B C C [ fXgXaXsXM.' ! t > > > r ; : ; : r r r 0 r r 0 r r r r r r r r r r r r e r r r r r r r r r r r r 0 e r 0 r r r r r r r r r r r r r 0 r e 0 r r r r r r r r r r r r r r r r r r r r q * r r r r r r r e r r r r r r r r r : r r r r r r r r r : r r r r e ; r r 0 0 y r r y u y u y y S dXcXnXdXzXcXdXzXzXzXzXzXxX.XzXzXxXxX.XcXcXzXzXxXdXdXdXcXdXdXzXzXzXdXcXnXzXdXcXzXxXxXnXdXzXxXzXxXdXzXxX.XdX.X$XdXdXxX@XdXdX.XzX.X'.dX@X.X.X.X.X X'.|.'._. X|._._.(.[.(.(.(.{.`.^.(.(.(.(.(./.].(.~.~./././.!.~.~.(./.!.~.T.~.! ! S ZXAXZXZXAXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXqXqX1X1X1X,XtX2X4X9.>.-.9.5.4X4.,.,.-.-.>.;.;.9.<.4.4X5.>.;.9.5.1X1XwX:.:.1.4.<X2X1X,XwX4.3X+.X.X.X.X.X.X. .7X,X,X2XwX9.,X1X2X,X,X2X4X0X>.:.:.;.<.4.4.yX,X1X2XtX4.9.4.,XwX>.<.<X2X,X,X,X1XwX>.>.<.4.tX1XyX5.9.<X2X2X2X2X<X5.wX1X<X4.wX1X2X,X,X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXHXBX' ! u ` b.F.].T.T.~.T.T.T.[.T.T.~.T.T.~.~.T.Y.Y.F.P.Q.K.K.P.P.T.Y.P.P.Y.S ! S ZXVXZXGXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXo.X...7X,X,X,X>X6X..X.X.X.X.X.X.X.X.O./ +.8Xx z z h p 2.k *X*XwXk O b z k ,X,X>Xv l z % sX:X! x sXw h x n l h *X:X2X,X,X,X,XyXtX,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X8XX. .X.X.X.X.X.X.X.X.X.X.O.oXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXGXDXHX[ / S ` T e.a.k.a.z.z.a.i.i.z.a.a.z.i.z.a.a.a.a.a.a.f.a.f.f.f.f.f.k.i.k.~ S Q ZXFXAXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX:Xz a c w f +.X.X.X.O.O.d l l l +. .o. .x d p h | O.X.X.X. .x KXa / O.O...n n b + s 0X*X/ O.6Xn n ;X6XO...8X;Xx | .. .f v k p g 6X .+.o.o. .6X:X1X,X<.<.;Xu M.iXQ O x x + b ;.>.0X-Xl v + >X-Xv +.O.o.o.X. .7X4.,.-.-.,.;.9.:X7X .X.X.X.8X:.>.4.ZXZXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXDXDXBX_ ! ! L b.Z.F.L.U.R.Y.Y.T.Y.P.T.T.T.T.T.T.~.~.T.~.~././.!.^.^.(.(.(.[.].! ! ] BXHXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXqX<.<.;.;.9.-.-.-.<.1X,X,X,X<X4X2Xl :X:X>X:X>X:X>X:Xv ;X2X,X2X2X2Xv :X2X2X1XwX5.2Xx + < O @ = @.@.- :X<X>X<X>X<X>X:X>X>X>X>X:X>X:X+.o.X.X.X.o.+.:Xl x b ,.0X1X1XwX,.<.;Xz ;X7Xo.X.X.X. .X. . . .X. .+.X.X.X. .X.3X5.wX:X,.,.,.5.1X1X1X1X,X:.>.>.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXAXVXAXFXVXSXAX~ / S b.n.].(.(._._.`.(.(.(.(./.(./.{.(.(.(.(.(.^.{.(.(.(.(.(.(.(.^.(./.(.(././.(./.^.~.~./.T.~./.T.T.T.T.U.U.L.U.L.H.H.G.A.H.S.S.A.A.S.A.S.A.H.z.S.",
+"m m m m m m m m m m m m m m = m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m B B N C m C N N B B N V N N C V V A C Z N C S gXgXgXpXM.' c y t y e 0 r r r r r r r r r r : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e : r e * y r r r r r r r r r r r r r r r r r r r r r r r r r r : r r e r r r r r r r r r r r r r r r r e 0 r r r r r r r r r r r e r r y r r r r > y y u u y t e S hX.XcXcXzXcXzXdXzXzXdXdXdXzXzXdXdXcXcXdXcXcXdXfXdXcXdXdXdXdXcXdXzXzXzXzXzXdXvXxXxXzXcXdXdXcXxXdXdXzXcXdXzXdXdX.XdX.XzX.XzX.XzXzX.X.X.X.X.X'..X.X|.|.|.|._.{.{.(._._.(._.(._.(.(.(.(.(.(.(.!./.!./.~.(.~.~.E.~.E.T.~.T.~.T.~ ~ S HXZXZXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXyX4X3XyX,X,X,XqX<.;.;.<.4X1X4X4.,.>.>.;.4.;.:.4X0X9.9.:.>.:.1X1X,X,X1XwX9.<.5.2X0X4.4X5.,.9.3Xo. .X.X.X.X.X.X.+.3X<XwX:.:.4.tX1X1XwX<.:.-.<.1.,.wX4X1X2X2X>X<X2X4X4X4X1XwX,.wX4X<X1X1X2X2XwX-.-.,.qX1X,X,X1X4X2X2X1X,X,X,X1X2X1XtX,.5.1X,X,X,XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXBX[ Q Q ) b.F.Q.T.~.T.T.T.~.T.T.T.T.~.~.~.T.!.Y.Y.F.F.K.K.K.P.Y.U.Y.L.U.L./ ~ ^ ZXVXZXZXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X.X. .sX>XuX>X6X7XX.X.X.X.X.X.X. .O.| W  .v k s d g 9.0X:X*XiX>Xh 8.8.k uX2X2X;Xn v > { eX@.+ + s h z z z p -X,XtX,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X2X,X,X,XyX2X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X2X,X,X,X,XtX:XO... .X.X. .X.X.X.X.X.O.O.GXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXBX' ~ ~ ` T e.f.g.f.a.a.f.a.a.a.f.i.a.f.a.z.z.k.i.d.g.k.a.f.f.f.k.g.f.d.z.! ! ! CXDXDXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXZXAXx k p @ v ;Xz +...X.X.X.z l +.X.X.X.o.O.v p k +.O.X.o.o.X. .f v @ k *X} } - 4 O @ g iX5X| ..:X*Xk :X>X2X1X<Xb /  .o.o.| l l l v s z / O.o.o...6X9.:.>.,.2./ _ eX@.g 8.8.4 b ,.,.2.b ,X-Xn z - v +.X.X.X.X. .6X;.-.-.-.-.-.>.4.8X..o.X. .+.5.;.4.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXZXDXAXAXBX_ ! ! P e.n.U.U.U.L.L.P.T.P.T.T.T.[.~.T.T.T.[.~.~././././././.^.^.(.^.].S ! _ BXDXZXZXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.,.>.-.<.4X9.>.>.<.2X,X,X,X,X,Xv x x l v x v l v x v v z :X:X3X:Xv :X1X0X4.1X4X2X;Xl z x g a h g g g h z z z z z d a v v l x v l ;X7Xo.o.o.X.X.7X:Xl b 9.:.9.<XwX1.;Xz n +.X.X.o.X.o.+.+.+.} +.7X} +. . .X.X.X.X.3X:X>X9X9.9.wX,X2X3X,X>X9X9.4.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXZXZXAXZX~ / ' c.n.T./._._._.(.(.(.(././.^./.(.(.(.(.`.^.(.).^.{.(.^.(.].(.(.(.(.!.(.(.(./.!.~.~.~.~.^.T.T.~.Y.T.T.U.P.P.L.L.H.H.H.H.A.S.H.A.D.A.A.A.A.S.S.S.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m @.m m m m m m m = m m m m m m m = m m m m m m N m m B m N N N N N C N N B B B C N V B M C N A A hXaXaXaX{ ' u > y ; ; r r r r r r r r r r r r r r r r r 0 r r r r r q e r 0 r r r : r r r r r r r r r r r r r r r r r r r r r q r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r e r * r r r r r r r r r r r r r r r r r r r r r r r : r r r r e e e y y i y y e H cXcXcXcXxXxXxXxXcX@XcXnXzXxXcX@XcXcXcXcXdXdXdXmXdXdXdXmXdXdXcXvXzXcXJXzXdXdXnXdXzXcXnXdXdXcXcXdXzXzXzXzXvXdXdX@XzXzXzX.XzX.X.X.X.X'..X.X'. X X|.|.|.|.|.|.|._._._._._.(.(.(.(.(.(.(./././././.!.~.~.~.~.!.(.[.T.(.T.~.T./ ^ ! DXVXZXZXFXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZX5.5.1X1X2X2X1X9.,.-.;.5.2X2XqX;.9.4.9.5.4X4.>.5.1X4X4.>.-.-.4.2X,X,X,X2X1X4X1X1XwX;.<.:.<.5.yX2X+. ...X.X.X.X.X.6XuX1X,X4.;.:.<.<.:.<.<.:.>X0X>.<.tX2X1X2X1X<XtX9.<.9.<X,X<.:.9.wX,X4.wX4XwX>.<.5.wX2X<X,X,X4.wX,X9.wX2X,X,X,X4.<.>.qX1X,X,X,XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXMX} Q Q ) n.F.Y.T.E.T.~.T.T.T.T.T.T.T.~.T.~.Y.Y.Y.K.K.L.L.L.P.U.P.U.U.L.L.! ! ^ ZXVXZXZXFXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXo.X.X. .+.>X2X>XtXyX<XX.X.X.X.X.X.X.o.W  .O.-X2.j d a ;Xk -Xk *X-X+ 7 4 *X3XtX:Xv w d - m @.t z z k *Xv :X*Xk -X1X>X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,XyX2X,X,X,X,X2X,X,X,X,X,X,X,XtX,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X2X2X,X8X6X+.X.X.X.X.X.X.X.X.O.O.GXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXFXBX} / ~ ` T w.i.g.a.k.f.a.a.z.a.a.f.a.a.f.a.a.f.k.g.g.k.k.f.f.k.f.k.f.k.f.S / ! CXFXHXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXAXb KX  + wXaXz X.X.X.X.X.z z X.X.X.X...6Xv :X<X+. .X.o.+.X.X.X.f z z -Xv k a z v v g *X-X| ..8X5X5X5X1X4X1X1X;X| O.o.X. .6X<X;Xv j 2./ O.o.....6X<.,.>.,.2.> @.m > @ 7 4 @ b :.,.8.v 1X-Xn x p -X7X..X.X.X...+.:.-.-.-.-.-.-.:.0X7X..X.X. .6X:.4.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXDXAXAXBX} ! ! P b.Z.F.U.U.R.R.P.T.T.T.T.T.P.T.~.~.T.^.T.~.~./././.!.(.(.(.(.`.].! / ' BXZXZXZXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX9.-.9.4.qX4X0X9.9.9.2X1X1X1X,X:Xv :X,X,X2X1X,X<X<Xx :X2Xb x v v x x :X4X5.>.:.4.1X,X,X<X,Xb p b g z k k k d v s k d =X5X=Xa v 4.;Xz ;X+.O.X.X.X.O.+.-Xz ;X<.;.:.4.b z ;X7X..X.X.o.+.3X>X>X>X>XtX=X*X>X6X .X. .X. .o.} u 7X7X6X6X+.7X6X7X+.7X6X7XAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXVXVXGXFXVXZX~ ~ ~ b.F.!.(.(.(.(._.(./.(.^.(.(.(.(.(._.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./././.(.~.~.~.[.T.~.T.T.T.T.Y.P.P.S.L.K.H.H.H.H.S.G.G.S.A.A.A.S.A.z.H.",
+"m m m m m m m m m m m m m m m m m m m m m m m = m m m m m m m m m = m m m m m m m m m m m m m m m m m m N m B B C N N m N B B B B C C V B C V N H A m.gXgXpXM.' u e ; y ; : r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r e q r r * r e r r r r r r r r r r r r r r r r r r 0 r r 0 y r r r r r r r r r r r r r r r r r r r e r r r r r r r r > e ; : > u t 0 * 0 [ cXzXvXcXxXxXxXxXxXdXxXxXxXcXxXnXcXcXcXcXcXcXnXdXmXdXdXmXdXzXzXvXzX.XzXzXdXxXnXdXzXnXdXdXdXdXcXzXzXzXdXzXdXdXdXzX.X.XzXzX.XzX.X.XzX.X.X.X.X|..X'.|.|.|._._._._._.(._.(.(._.(.(.(.(.!./.(.!.~.(.~.~.~.~.~.~.^.T.T.T.T.~.) Q ! FXVXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXqX9.5.1X1X1X1X0X4.-.<.4X,X4X<.:.4X4X1X1X1X0X9.5.2X1X5.,.-.>.5.2X,X,X,X,X2X,X,X,X4X5.,.;.1X1X,X>X<X7X+.o.O. .X.X. .+.6XtX1XtX4.9.9.:.yX0X,.wX,X<.,.wXtX<.1.9.,XwX,.>.>.wX1XwX>.>.:.:.>.<.wX2X<.0X4X2X,X1X1XtX>.:.4.9.wX2X2X,X4.>.>.>.:.wX1X,X,X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXBX[ Q ^ ) b.F.].~.T.T.T.T.T.T.T.T.T.T.T.~.P.].Y.K.F.L.F.L.L.Z.L.P.L.L.U.U./ Q S ZXVXFXGXAXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXGXo.X.X.O.+.2X,X2X5X,X>X8XX. .X.X.X.X.o.! +.6X-Xk k z z @ 5 l z - a a + @ a z z z h z z v g h g b sXw @ g x z + ;X9.wX4X1X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X2X2X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,XtX4X7X..X.X.X.X.X.X.X.X.hXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX[ / S ` T e.d.f.k.a.i.g.z.a.f.a.a.k.k.i.k.a.f.f.d.a.a.g.f.f.k.f.k.f.d.g.S ! S DXDXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXAXv ;X@ a p v k +. .X.X.X.d z +. .X.X.X.3Xk :X7Xo.X.X.o.o.X.X. .8.5.b k 2.k z ;X0X9.<.<.4.} ..8X:X9.<.<.<.4.>Xb | O.X.X.X.o.8X;Xv s s f O.o. .o.+.,X5.<.,.b z a g @ z v g -XwX;.>.2.l x a d d p n O. .X.X.X.o.+.:.-.-.-.-.-.-.,.4.7X....X...6X:.4.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXAXHX[ ! S Y b.F.Y.U.U.T.P.T.T.T.T.T.T.T.~.~.T.T.~.~./.~././.(./.(.~.(.{.(.Q.! / _ BXZXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXqXqX4X1X1X1X1X1X4X4.<.4.<.5.<Xv x <X4X9X<.<.5.2X2Xv :X2X2X2X2X1X>Xv ;X,XwX9.9.<.wX,X,X2X2X;Xz 2.j p -Xj 2.a -X2.j z =XiX=Xs 2.,.wX-Xl ;X+...o.X.X...+.-Xl ;X4.4.b l :X+.o.o.X.X.+.2XyX>X5Xk z g w z >X3X7X.. .X.X. .+.W ..O. . . ... . . .O... .DXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXFXZXZXVXZX~ / ! b.n.]./._.`.^.(.(.(./.~.(.(.(.(.(.(.{.|.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(././.~.~.~.~.~.T.~./.^.P.Y.U.P.P.L.S.G.H.H.G.H.A.A.A.A.S.S.A.h.h.S.S.",
+"m m m m m m m m m m m m m m m m m m m m m = m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N N N N m B B B N B B B N B N B C C B B C [ gXaXpXM.' f u y ; y y 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 e r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r 0 : y > > t u y r r * m.nXnXzXxXxXxXxXdXnXxXxXxXxXxXdXcXnXdXcXdXcXdXcXdXmXdXmXcXcXcXdXdXcXdXvXJXzXdXzXcXdXcXdXnXdXzXvXxXzXdXdXdXdXdXdXdX#X'..X.X.XzX.X.X.X.X.X.X X'.|.|._._.|.|.`.`._._._.(.(._.(.`.(.(./.(././.~.~.~.~.~.~.~.I.T.T.^.T.~.T./ Q S ZXVXFXDXFXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXVXFXyX1X0X9.1.1.5.4X4X0X;.5.2X1X0X:.5.1X,X2X2X1X1X1X2X1X0X:.>.5.1X,X,X,X,X,X2X1X<X2X2XwX9.:.4.2X1X1XyXyX<X+.....X.X.X.X...+.7X6X1X5X4X0X:.:.,.wX4X0X,.wXtX4.:.,.wXwX,.<.4.tX1X,X9.-.<.<.-.>.0X4XwX:.9.tX2X9.1.<.-.,.qX4X,X,X2X4.>.>.:.9.9.wX2X,X,XyXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXCX' Q J ` b.F.Y.~.~.~.T.[.T.T.T.T.T.T.Y.Y.T.L.Y.P.L.P.P.Z.S.L.L.L.L.L.L.L./ Q Q ZXVXFXZXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXGXo.X.X.O.6X2XtX2X2X,X<XuX:XX. .X.o.O.O.W  .2Xb v b x p 2.k O j *XO + z + wX-XO x x + ;XtXk x k *Xz s p x n x p j ,.:.9.wX1X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,XyX,X,XtX,X,X,X2X,X,X,X,X,X,X,X,X,X2X<X8XX.O.X.X.X.X.X.X.X.7XFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBX' ! S ` T e.i.f.f.z.i.i.i.a.f.a.i.z.a.k.f.a.a.k.g.a.g.z.k.k.f.k.f.f.f.g.! ! Q ZXDXZXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXFX;X*X>Xz z d *X7X .X.X.X.z z +.+.X. .X.:Xk +.o.X.X.X.o.o.X.X. .8.,.b v s k d 0X:.>.-.-.;.+...eX:.,.;.-.-.,.b l } o.X.X.X...6X;Xa 2.:Xp } O.X.o...+.6X3X5.;X4 l x O -X1X<X4.<.-.-.<.:X:Xz a - d v +.X.X.X.X...7X5.-.-.-.-.-.-.>.5.7X.. .O.o.7X5.0XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXBX' ! ^ I e.n.Z.U.T.U.T.T.T.T.T.T.T.T.T.T.~.~.T.~.~.~.^././././.^.[.^.|.].! / [ BXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3X1XyX2XqX5.1X2X1X9.,.>.,.<.v z :X0X9.9.9.9.5.<X>Xl :X<X1X0X<.4.>Xb l x :X4X4X5.9.2X,X2X2Xb v k k z v k k @ v k -Xz s s =Xs 8.,.<.3X:Xl ;X+.O.X.X.X. .o.;Xz c x l n 6Xo.o.o.O.+.>XuX:X:X>X:XpX:Xb v 5X>X5X6X .X.X. . ./ O.X.X.X.X.X... .X.X.o.X.AXZXGXFXFXFXFXFXFXFXFXFXFXFXFXDXFXZXFXVXZXDXZXVXGXS ~ I b.F.Q.(.^.(.(._.(.(./.^.~.(.(.(.(.(.`.(.(.(.(.^.(.^.(.(.(.(.(.(.(.(.(.(./.(.(.(.~.^./.~.^.T.T.~.T.Y.P.P.P.L.L.U.S.H.H.H.G.A.H.S.A.S.S.S.S.A.A.",
+"m m m m m m m m m m m m m m m = m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N m m N m m N C B B B B B B B B B C m C B C C B / hXaXsXM.' u u > : : : y 0 r r r r r : r r r r r r r r r r r r : r r r r : 0 r r r r r r r r e r r r r r r r r r r r r r : * r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r y r r r r y r r e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r : r r r y y r * * r hXxXxXxXcXcXcXxXnXdXxXxXcXxXxXxXdXcXcXvXcXcXcXdXmXcXcXcXxXcXxXxXxXxXcXdXnXdXmXdXcXnXdXcXzXzXzXzXzXzXzX.XdX'.zXdXzX.XzXxXzX.XdX XxX.X.X|. X|..X|.}.}.}.|.`._.{._._._.(.(.(.(./.(.(./././.~.~.~.~.T.~.~.T.~.T.~.~.T.T.~ ~ ! ZXHXZXDXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX,X4X<.;.<.:.1.5.4X<.:.4X,X1X4.:.1X,X,X,X,X,X1X0X5.4X0X5.3X,X,X,X,X,X2X0X5.1X1X2X2X4X5.,.<.<.4.1X1X1X3X6X+. .X.X.X.X... ...+.6X,XtX4.:.>.<.4.9.4.,X2X4X0X,.wXwX,.wX4XwX9.tXwX,.wXwX,.,.0X4XwX:.<.:.<.:.<.-.-.>.qX1X,X<XtX;.-.:.wX4X1X2X,X,X<XyXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXCX} Q ^ I b.F.T.~.~.T.T.T.T.T.T.T.T.T.T.T.T.L.L.P.L.F.L.L.L.L.D.S.U.L.L.L.! Q Q DXDXCXDXAXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXGXX.X.X. .+.>X2X3X:X,X<X>X>X:XO...+.+.+.@.;X:Xv :X2X>Xk 9.0Xs 9.0Xg n n k iX>X@ 8.8.- ;X>X-XsX- k 1.9.b a z h p -X9.-.>.0X1X1X2X1X1X1X1X1X2X1X1X1X1X2X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X>X>X8X .X.X.X.X.X.X.O.hXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXBX' / S ` w.e.j.a.a.a.i.g.a.a.a.k.a.f.a.a.a.f.i.f.f.k.g.a.f.k.k.k.k.f.d.k.! ! ^ CXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXv z *Xg sXn + +.O. ... .x z +. .X.+.+.<Xk +. . .O.+.o.o.X.....2.:.b v v v v 8.>.-.-.;.:.7XO.8.,.-.-.-.-.,.b |  .X.X.X.X. .6X-Xa 9.2.p / X.o. .X.o...+.4X:X@ M.8.4 -X>X9.>.-.-.-.;.qX:Xa x % O b 7X....X.o.O.O.6X:.-.-.-.-.-.-.5.7XO.O.O.o.6X1X>XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXAXFXBX[ ! Q I b.b.D.U.U.U.T.T.T.T.T.T.T.T.T.~.T.T.~.~.~.^.~././.(./.(.(.(.).Q./ ! ' BXDXZXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXyX,X,X1X<.<.1X,X2X0X9.;.,.1.v :X4X4.;.1X1X1XyXv l x :X1XwX9.9.5.,X,X>Xv :X,X2XwX<.tX,X,XyX;Xl v b v x v v l v v v n l z z z 8.>.>.<.tX;Xl ;X+...o.X.X...X.+. .o.+. . .X.O.X.+.2XuXk x l s eX:XsXb k 5X,X,X>X6Xo. .....W O. .......O... . . .....CXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXVXAXDXDXAXAXS ~ ~ b.n.[.(.(.`.(.(.(.(././.(.[.(.(.`.^.^.`.(.(.(.(./.(.(.(.(.(.(.`.(.(.(./.(.(././././.(.~.~.~.~.T.T.T.Y.P.P.L.L.L.U.H.H.Z.G.S.Z.A.S.S.A.J.A.A.A.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m = m m @.= m m m m m m m m m m m m m m m m m m m N m N B B N N B m B B B B B B B C C C B C A C m.gXaXpX{ Q u e ; ; q : r r r r r r r r r r r r e r r r r r r r 0 r r r r r r r r r r r r r r 0 r r r r r r r r e r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r q r r r r r * r r r 0 * r r r r r r r r r r r 0 e r r r r r r r r r r r r r r r r r r r r r r : : r 0 r r e r r r r % ` xXxXvXcXcXcXcXxXxXxXfXcXcXxXxXcXvXcXcXcXcXcXmXcXdXvXcXxXxXxXxXdXcXdXcXdXcXdXdXdXcXnXdXzXzXxXzXzXzXzXzXdXdX.XdXzX.X'..X.X.XdXdX.X.X.X.X X|.|.|. X X}._._._._._._.(._.(.(.(.).(././.)./.~.~.(.T.~.~.T.~.~.I.~.T.T.~.~ Q S ZXFXAXDXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3XqX-.qX4X4.,.<.4X0X5.2X1X4X9.<.2X,X,X,X,X,X4X4.,.5.4X4X2X,X,X,X,X,X4X5.>.<.5.,X,X1XwX:.>.<.:.<.9.4.2X5X3X+... .o.X.X.X.X. . .+.7X1XtX<.,.,.wX4X1X1X1X:X5.<XwX,.;.9.9.9.tXtX5.wX,X4.9.4.<.:.0XtX>.:.<XtX-.-.<.wX1X,X<X5.<.,.qX4X2X,X,X,X,X,XyXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXBX' Q ^ I b.n.K.~.T.T.T.T.T.U.U.T.T.T.T.T.P.Y.Y.L.L.L.H.L.L.S.L.S.U.S.L.L.) Q S BXZXZXDXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXo.X.X. .7X2XtXv g z l >X>X1X<X7X& + 5 @ 2.k w :XuX>Xk j k O b k O g < O *Xg O 7 4 - -X>Xv a a g 4.9.b z a p z v ;X>.-.:.9.<.4.9.<.9.<.<.4.9.<.9.<.wX2X,X,X,X,X,X,X,X,X,X,X,X,X,X2X,X,X,X,X,X,X2X,X,X,X,X,X,X,X,X,X,X,X,X,X>X<X5X7X .X.X.X.X. ...O.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXCX` ~ / ` T p.d.a.g.a.z.a.k.a.i.f.i.f.i.f.f.f.f.f.f.f.g.a.k.f.k.d.f.k.g.g.~ ! ! ZXDXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXsXn h z 5 @ @ +.+.+.+.+.d l +. .+.7X2X1Xk +.X.+.:X1X1X+. .....8.,.<.<.<.4.v 2.;.>.-.>.:.} o.c.,.;.;.-.>.;.j | o.o.o. .o. .6X;X@ *X;Xg } O.X.O.o.X.X...7X;Xa 6 j + -X<.-.-.-.-.-.>.0X:X@ :XeX+ n +. .X. . .O.O.6X:.,.>.>.-.;.>.5.7X....O...7X1X>XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX{ ! ! _ e.n.K.T.U.T.T.T.T.Y.T.T.~.~.P.T.~.~.~.T.~.~.~.!././././.(.^.`.!.J / ' BXDXAXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAX3X,X<X1X9.;.5.1X<X1X4X0X9.5.l ,X9X,.5.4X,X,X:Xv :X>X1X0X:.<X1X1X,X2X2Xx :X,X,X1X5.<.2X1X,X<X>X:X2X:X,X<X<XwX4.9.<.4.3XtX>X1X0X>.-.<.tX2X;Xl ;X+.O.X.O.o.O.X.X...O. .X.o.o.+.<X>X2X-X8.8.j ;XeXsXb k 5X,X,XyX3X6X6X6X} | 6X7X6X7X6X7X6X7X6X6X7X7XZXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXVXAXFXZXAXDX' ~ / c.n.!.(._.(.(.(.(./.~.~.(.(.(.`.^.`.`._.^.(.(././././.!.(.`.(.(.(.(./.(./.(././././.~.~.~.~.~.~.T.T.T.L.U.P.L.L.A.H.H.H.G.G.H.S.S.A.A.h.A.A.h.",
+"m m m m m m m m m m m m m = m m m m m m = m m m m m m m m = m m m m = m m m m m m m m m m m m m m m m m N N N N B B B B B B B B N B B C A A A ` aXaXpXM.' u r r : : ; : ; ; r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r : r r r r : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r ; q r r : r r : r : % : - ].dXMXnXnXcXnXnXdXcXcXcXcXnXxXcXcXcXcXcXcXdXcXcXcXdXcXxXxXvXdXcXzXdXxXnXdXdXcXcXdXdXdXcXxXzXzXzXzXzX.X.XzXzX.XzX.X.X.X.XzX.XdX@X.X.X X X|. X|.}.|._.|._.{.|.^._.(.`.(._.(./.(././././.~.~.~.~.T.~.T.T.T.T.~.T.T.~./ ~ S DXAXAXDXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX1X5.5.1X4X4.-.qX1X2X1X1X0X<.;.<.2X,X,X,X,X,X1X4.,.;.<.5.1X,X,X,X,X2XwX;.-.-.,.,X,X2X1XwX4.4XqX,.;.>.<.4.1X3X6X7XO...o.X.X.X.X.X.X.+.yXtX4.4.,XtX9.4.wX2X4XwX<.<.4.4.wX4X,X,X1X,X2X1X1XyX9.9.tX,X5.wX2X<.>.,.qX1X<X,X<.5.1X<.wX2X,X,X,X,X,X1X1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBX[ Q ^ ) b.F.K.~.T.~.T.T.Y.T.P.T.T.T.T.U.P.P.P.L.S.D.L.S.H.L.H.H.S.L.L.L./ Q Q ZXZXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X.X. .+.yX:Xl x @ z ;X:X*X:X:Xk b x 4 9.>X+ :XyX1Xv l z z a f z l g f a f v f v f v v l z v f -Xv v l w x l + j ,.-.-.>.>.-.-.>.>.>.-.>.>.>.>.,.5.1X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X2XtX,X,X,X,X2X2X>X6X..X.X.X.X.X.X.hXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXBX' ~ S ` T s.j.d.f.f.a.a.a.f.a.a.a.i.f.f.f.k.k.k.k.f.z.g.k.g.k.k.k.z.k.k.S S ~ CXDXHXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXl g p z z h z l x f l u d l x l l x <X<Xv -X6X:X1X<X5X+.O.o.7X6X4.4.9.<.5.v ;X4.9.<.4.4.7XO.eX9.4.4.<.4.4.-X| X.+.+.+. .6X2X;Xz -X2X;X/  .+.+. .X.+.+.o./ v :X:X-Xj ,.-.-.-.-.-.>.qX<Xa v v + v ..O.7XO.o.o.O.6X2.4.9.1.4.4.4.<X7XO...O.O.6X>X:XFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXAXBX' / Q ) b.n.L.T.U.~.~.T.T.T.T.~.~.Y.!.~.~.~.T.~.T.~.~./././.(.(.(.(.(.].! ~ [ BXDXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXyX2X4XqX;.-.<.1X<X1X4X1Xv v l >X0X5.4X,X,X,Xb x :XyX1X0X;.4.1X,X,X,X,Xb l :X2XyXwX4.4.4.,X2X2XyX2X2X2X1X1X5.,.>.>.<.,X<X,X2XtX<.>.wX4X,X,X;Xz ;X7X ...X.X. . .O...O...o.+.<X2X2XyX-X7 7 k :X:XwX*X*X5X*X:X:X*X*X:X:X*X:X2X>X>X,XyX>X>XtX2X>XuX,XAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXAXFXFXAXDX~ ~ ) b.n.!./._.(.(.(./././.~./.(.(.^.^.`.(.(._.(.(.(./.(.(.(.(.(.(.(.(./.(.(.(././.(./.~.~.~.~.~.~.~.T.T.T.T.U.L.L.L.L.H.S.H.H.H.A.G.A.G.S.A.S.A.A.",
+"m m m m m m m m m m m m m m m m m m m m @.m m m m m m m m m m m m m m m m m m m m = m m m m m m m m m N m N N N B B B B B B B B C B B B C A S Q.aXpXM._ c > y > r y r : ; r e r r r r r r r r r r q r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r q e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r = ; y ; r r r e e * r % % u cXvXcXnXnXnXnXMXnXcXcXcXcXxXzXcXcXcXcXcXcXmXdXmXdXcXdXJXvXxXxXcXxXdXdXcXmXdXdXcXdXcXdXzXzXzX.XdX.XxX'.'.dXzXzX.XzXzXxX.X.X.XdX.X.X'.'.|. X|. X}.|._._._.|._._.(.(.(.(.(.(.(.(.!.(./.~.~.~.~.T.~.~.T.~.T.!.T.T.~.~ ~ ~ AXAXDXDXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3X,X4X4XqX<.>.<.4X,X,X1XqX>.>.>.>.5.1X,X,X,X,X2X0X9.9.-.,.3X,X,X,X1X0X-.>.>.>.4.2X2X,X<X,X1XwX;.>.>.>.<.:.<.2X3XuX:X6X+. .X.X.X.X.o.o.+.6X3X1X,X0X,.<.tX2XyXwX4.tX1X1X,X,X<X,X,X,X,X,X,X<X1X1X,X<X4X1XtX4.9.4.wX2X2XtX,.:.<.5.1X,X,X,X,X2X2X4.1.DXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXZX' Q ^ U b.F.Y.T.T.T.T.U.T.U.P.T.P.U.T.[.U.K.P.L.L.L.S.S.L.L.S.H.H.S.S.S./ c S ZXZXZXDXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X.X. .8X>X>Xb n h z :X>XtX>X>X4 < O p b k g :X,X1X<X<X<X2XwX<.<.<.1.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.9.b z n x p b ,.-.>.-.>.>.>.-.-.>.>.>.-.>.>.,.9X1X,X,X,X,X,X2X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X2X,X,X,X,X,X2X3X:XX.X.X.X.X.X.o.oXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX} / S ` T g.a.g.s.i.i.a.a.a.a.a.z.f.f.f.k.f.f.f.k.k.i.z.k.f.f.k.f.k.k.k.~ / ~ ZXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX:X>X:X>X<X<X>X>X6X .+.X.d :X<X-Xh a p z z g k z d g s f aXhXhXc s k z z g z d s k z z k 6XfXn p f k g z k h d g z z d z g g z a h z a p z g z d d z z z d g k v v ;X>.-.>.-.>.>.>.:.wX1X-Xp d k 6XfXfX7XfXhXhX7Xk k v k k v z { 7XhX7XhXfX7Xh k AXAXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXAXFXBX[ / ! P b.A.Y.T.T.T.T.T.T.T.[.P.~.~.P.T.T.T.~.~.~.^.~./././././.(.(.`.Q.~ ~ _ fXGXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXyX4X5.>.>.>.<.1X2X0X<.5.v :X<X<X2X1X,X,X,X,Xv :X2X,X2X4X4.,.2X,X,X2XyX>Xv :X,X,X>X1X5.,.tX2X,X,X2X,X<X<X1XwX<.>.>.tX,X,X,X<X1X0X,.wX1X,X,X3X;Xz ;X7X} 6X+.7X} 6X} X.6X} <X>X<X<X<X;Xh g v j b k v z ;XyX>XuXtX,XuXtX,X1X>X2X,X<X,X>X,X<X,X,X,X,XCXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXZXFXSXZX~ ~ / b.n.~./.^.(.(./././././.(.(._.`.(.`.^._.(.(.(./.(./.(.(.(.!.!.(.(.(.(./././.(.(.~.(.^.^.~.~.~.~.~.~.T.T.U.U.U.L.H.L.H.A.H.H.H.H.H.h.A.A.h.g.g.",
+"@.m m m m m N m m m m m m m m m m m m m = m m @.= m m m m m m m m m m m m m m m m m m m m m m m m m m m m B N N B B N V B N C C B C Z C m Z ' aXaXpX[ / u : r y r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r y r = e r 0 0 y : ; ; r = e r r r r r r 0 e ; y r r r e ; y r r r : r r r ; ; e ; y ; : r 0 r r r r r r r e r r * r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r > r 0 % % * Q.cXMXcXdXMXnXnXcXcXcXcXnXxXxXxXnXxXcXcXcXcXcXcXcXcXJXcXcXdXxXdXzXdXdXfXdXdXdXcXdXvXdXdXdXcX XvX X.X'.zX#XdXzX.X'.zX'.dX'.zX.XdX X'.'. X`.`._._.|.|.`.(._.|.^.(.(.|.^.(.(.|.(.(././.!.!.~.T.~.~.~.T.T.T.T.T.T.T./ ~ ~ fXVXVXFXVXZXSXZXZXVXFXZXZXZXZXDXHXFXFXZXZXFXZXFXFXyXyXyX3XqX9.9.qX3XyXyXyXqX9.9.9.9.5.KX1X2XyXyXyXyX3X1X0X5.yXyXyXyXyXwX9.9.9.5.yXyXyXyXyXyX3XwX9.9.9.5.KXwX4.yXyXyXyXyXyX+.O.o.o.o.o.o.O.X.o.o.3XtX5.yXyX3XyXyXyXyXyXyX3XyXyXyXyXyXyXyXyXyXyXyX3XyXyXyXyX1XyX1XyXyXyXyX5.9.9.eX1XyX3XyXyXyXyX5.9.SXAXAXAXAXFXVXFXVXFXZXHXFXZXVXVXFXFXZXZXDXFXZXZXBX' Q ! ) b.F.U.Y.Y.T.U.T.T.Y.U.Y.T.Y.U.U.U.I.H.H.H.H.H.H.A.S.S.S.S.H.G.D.) / S fXZXAXHXZXAXAXDXFXHXAXHXDXZXHXDXZXFXZXZXHXFXAXVXVXo.o.O.8XyXyX<Xl l d l x x b l x x z x l z l c <XtX3XyXyXyXyXwX9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.1.9.9.9.9.:Xe l z a ;X9.9.9.4.9.9.9.4.9.9.9.9.9.4.9.9.eX3XyXyXyX3XyXyXyXyXyXyXyXyXyXyX3XyXyXyXyXyX3XyXyXyXyXyX3XyXyXyXyXyX3XyXyXyXyXyX+.o.o.o.o.o.o.hXDXZXDXZXAXVXFXFXAXVXZXZXZXAXAXAXFXFXFXVXDXDXFXfX' ! S ` e.j.g.i.k.i.k.i.a.a.a.g.i.f.f.a.a.j.g.a.k.g.k.j.g.a.g.a.g.g.a.g./ / ^ fXZXZXVXZXVXDXAXAXFXDXHXZXAXDXFXHXFXZXZXZXDXZXDXZXyXyXyXyX2XyXyXyXyXKX7X7X;Xv z ;X<Xx x x l x x l x l n l x n x x l n x l x z x x x l x l c n x l x l x x x l x l x x x l x l x l x l n l x l x l l n x l x ;X3X3X<XyX4.9.9.9.9.9.9.9.eXyX3XyXtX:XKXO.o.o.o.O.hX7X<XtX:X3XyX3X<X8X .o.o.oXo.o.+.yXVXSXZXVXZXDXHXDXZXZXHXVXFXFXFXFXFXAXAXVXZXDXZXDXBX] Q ^ I b.F.F.T.T.T.T.T.T.T.T.T.~.T.T.T.T./.T.~.~.~.~.!.(././.(.(.`.(.^.S ! ' fXZXDXZXAXDXDXFXZXVXFXAXAXFXHXFXZXHXAXZXHXAXZXDXHXyX3XqX9.9.9.qX1XyXqX9.5.n :XyXyXyXyXyX3XyXyXn 3XyXyX3XyX0X5.yX2XyXyXyXyXn <XyXyXyXyXeX5.yXyXyXyXyXyXyXyXyXyXeX9.5.yXyXyXyX3XyXyX5.wXyX2XyXyXyX;Xx v x b x x v x v b x x v x x x x x ;XyX:XyX3XtX:Xx b ,XyXyXyXyX3XyXyXyXyXyX2XyXyXyX3XyXyXyXyXyXZXZXFXHXFXFXZXAXDXFXFXZXHXZXVXVXFXAXAXDXZXZXVXDXGX~ / ) c.n.!.(.(.(.(.~./.T./.~.^.(._.`.(.`.`.`.(.(.(.(././.(././.(./././.(./.(./././././././././.~.~.~.~.~.T.T.I.U.U.L.S.L.L.H.H.D.G.G.G.S.A.A.A.A.A.",
+"m m m m m m m N m @.m m m m m m = m m m m m m m = m m m m m m m m m m m m m m m m m m m m m m m m m m m m N N B B B Z N N B C M C B C N C A m.aXpX{ ' u r r * : r r r r r : r r r * e q r r r r r r r 0 r r r r r r r r r r r r r r r r r r r : r r : 0 e e e ; e r r r e r r e 0 r r r r r r r e y ; * r r r r 0 ; r ; ; ; r 0 r r r ; ; ; r r e r r r r r r r r r y 0 * r r r r r r r r r r r r r r r r r q e r r 0 : r r r e r r r r r r r r y r % e * & u mXcXmXcXmXnXmXcXcXcXcXcXxXxXnXnXxXcXcXcXcXcXcXcXcXdXnXcXcXcXdXJX.X%XdXdXmXfXdXcXdXdXdXdXdXvX XdXdXzX.X.XdX'.zXdXdXzX.XdX@X.X@X X'.|.'.|.|.|._. X_._.|.|.(.`.(.(.`.(.(.^.(.(.(./././././.T.~.T.T./.^.P.T./.T.T.[ ~ ~ hXCXVXAXFXGXZXFXDXFXAXHXFXDXFXZXVXFXAXAXFXAXFXFXZXFXSXAXAXGXVXSXSXFXFXFXFXAXGXAXFXZXZXZXDXDXAXSXDXDXGXZXAXGXGXFXFXFXFXAXAXSXSXDXDXDXAXSXDXSXGXAXFXSXGXDXZXFXZXGXFXFXSXFXVXDXGXGXVXFXAXGXVXVXVXFXZXGXSXSXSXFXFXFXFXFXZXVXFXAXAXFXSXFXFXAXAXAXSXFXAXAXAXFXSXAXDXGXFXDXSXFXFXSXFXFXFXDXAXFXVXFXSXAXAXVXFXAXAXFXZXZXDXZXVXFXFXAXFXFXZXZXFXGXAXAXAXZXZXfX/ Q ^ Y b.Z.K.!.T.T.T.U.U.Y.T.U.U.I.U.U.U.L.H.K.H.H.H.H.K.S.A.G.S.A.D.D.[ ! / hXCXAXVXFXGXZXAXAXAXVXFXFXAXZXAXAXAXFXFXVXAXFXFXFXFXVXZXSXZXFXZXFXFXDXDXDXAXHXVXDXZXFXFXCXZXZXZXFXZXAXAXFXSXFXAXSXGXSXSXAXDXSXSXSXSXAXAXSXFXDXAXDXAXSXSXFXVXFXZXZXZXDXGXFXFXSXZXFXVXAXFXZXZXSXGXZXFXGXDXDXDXZXFXFXVXFXSXFXDXFXAXAXSXFXZXAXFXFXSXAXAXAXAXAXAXFXAXFXAXAXSXFXFXAXAXFXSXAXFXGXGXVXGXDXVXDXDXZXZXFXAXZXAXZXFXFXHXFXFXAXFXFXFXGXFXDXDXZXfX_ ^ ) Y e.a.g.i.i.f.i.i.f.f.a.s.a.a.f.x.z.z.f.j.g.j.k.k.g.f.z.g.g.z.g.k.] Q Q hXZXHXVXVXFXFXDXDXFXFXDXAXFXAXDXAXFXFXFXZXAXAXAXAXAXFXSXGXAXFXFXFXZXSXZXZXGXDXAXAXAXFXZXZXDXZXDXAXSXDXZXAXAXAXGXDXZXZXFXDXSXDXDXZXAXFXDXZXDXDXDXZXZXZXDXSXFXFXZXDXZXZXAXAXDXSXDXAXDXDXAXAXFXFXZXDXZXAXAXAXDXZXAXSXAXDXGXFXAXGXZXFXDXDXZXGXFXFXAXAXDXDXAXAXGXGXDXSXAXAXGXDXAXSXZXAXVXVXHXGXDXAXGXGXVXVXAXFXAXAXAXAXAXFXDXFXFXZXVXZXAXAXFXFXDXDXZXZXfX' Q ^ P b.F.K.U.T.~.T.~.~.T.T.T.T.T.~././.T.~.!.^.~.~.!./././.(.(.(.`.].~ Q Q m.HXZXZXFXFXFXFXVXZXFXFXAXAXAXAXAXDXAXAXFXFXAXAXFXSXDXAXFXFXGXSXFXZXDXFXFXGXFXFXGXDXDXSXZXVXFXFXVXVXVXFXVXZXGXGXAXFXSXFXFXGXZXFXCXSXVXFXFXAXSXDXDXSXFXFXSXDXDXDXAXAXSXSXAXDXAXAXSXFXSXGXVXVXFXVXDXSXAXAXAXZXDXDXAXAXZXAXDXDXAXAXDXDXDXDXAXFXDXFXAXSXDXAXDXDXDXSXAXAXAXAXSXAXAXAXFXAXAXAXSXAXAXAXVXAXFXFXFXAXFXFXFXZXAXAXAXFXFXFXZXAXAXAXDXZXAXZXAXfX~ ' ~ b.F.].(.(.(.(.(./.(./.^.^.{._.|.`.^.|.^.`.(.(.(.(.(.(.(.(.(.(.(./.(./././././././././.~./.~.~.~.~.~.T.T.T.U.L.L.L.L.S.H.H.H.H.S.S.z.S.A.A.A.A.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m = m m = m m m m m m m m m m m m m m m m m m N N N N B V N B V C V C C N B C C ) aXpXM.{ f t ; : : 0 r r r 0 r r r r : y r r r r r r r r r r r r r r r r r r r r r * r r r r r r r r = y t ; e ; ; t r r 0 r r r : : r r r r r r r r r = ; y r = r r 0 r r y ; e : y r ; = r 0 y r ; r r r r r r r r r r r r : r r r r r r r r r r e r r r r r r r r r r y : r r r r r r r r r r r r r r 0 ; % % $ hXcXcXmXcXmXcXcXcXcXcXcXcXnXnXxXnXcXcXcXcXnXnXcXcXnXcXcXcXcXcXdXcXcXdXdXfXcX%XcXdXcXdX.X.XzXdXdX.X'.zX.XzXzXzX@X.X.XzX.XdX.X'..X X X|.'.|. X}.|._._.{.`.(.(.(.(.(.(.(.(.(.(././././.~.~./.~.T./.T.^.U.T.T.T.T.F.! S M.MXZXAXAXDXDXFXDXFXHXAXAXAXAXFXVXAXAXAXDXFXVXAXFXFXFXFXFXFXFXGXDXFXFXAXAXAXDXAXZXAXAXDXDXFXAXFXFXDXDXFXFXAXAXFXFXFXFXFXFXAXAXDXFXFXDXAXDXDXDXAXZXAXAXDXZXZXFXFXFXFXFXFXFXFXFXGXAXAXAXFXFXVXVXFXVXFXFXGXVXFXFXFXFXDXSXZXFXVXFXFXAXFXFXZXFXAXZXAXAXAXFXFXAXAXAXFXFXFXFXAXZXFXAXFXAXAXFXFXFXFXFXFXFXAXFXAXZXDXFXFXFXDXFXFXFXZXFXZXGXFXAXAXAXZXAXZXHXm.! / ! _ e.F.K.Y.T.T.U.U.I.Y.T.T.U.I.I.I.U.L.L.H.H.H.A.S.S.S.A.A.A.z.H.A.n.) ! [ BXAXVXDXDXDXAXFXFXFXFXFXFXFXAXFXAXAXAXFXFXFXFXFXFXAXAXFXVXFXFXFXZXDXDXAXAXFXZXZXDXFXZXFXFXCXZXZXFXFXFXFXFXAXDXAXFXFXAXAXAXFXFXSXFXAXAXAXAXGXDXAXDXFXFXVXFXAXAXFXAXDXFXFXFXVXFXFXFXFXZXFXFXZXFXFXZXAXFXGXZXFXFXVXFXFXAXAXZXFXFXZXZXFXVXZXAXFXFXFXFXDXFXAXAXFXZXFXFXAXFXFXFXFXFXFXFXFXFXAXFXVXVXDXDXAXFXFXFXDXDXDXDXDXFXDXZXFXZXGXZXFXFXZXDXDXDXHXQ./ / _ ` Z.j.a.g.k.i.f.f.f.f.a.a.a.f.f.f.f.j.z.g.k.k.k.h.z.a.g.g.g.g.h.l.[ L ^ c.fXSXZXZXFXVXAXAXFXAXAXAXAXAXFXAXFXAXFXFXAXAXAXFXAXAXFXFXFXFXAXVXZXSXZXZXAXAXAXAXZXAXAXFXZXZXDXDXDXDXAXDXAXAXAXFXZXZXAXZXDXDXDXDXAXZXAXAXHXFXDXVXZXDXDXDXFXZXAXFXZXZXZXAXDXDXZXAXAXDXDXAXVXFXVXFXAXFXAXAXAXVXAXVXAXAXAXFXAXZXZXDXZXAXDXGXAXZXAXFXFXAXAXAXAXAXDXZXFXAXFXAXAXAXAXAXFXFXHXDXAXFXFXFXVXFXDXVXAXAXAXAXAXAXAXAXAXHXFXZXFXZXFXVXFXZXDXHXm.~ Q ^ U b.F.K.T.T.!.T.T.~.T.T.T.T.T.~.T./.~.~./.~.[.~.~.(./.(.(.^.(.`..X/ / Q { cXZXZXAXAXFXAXZXZXFXDXZXFXAXAXFXAXAXDXFXZXFXAXFXFXFXAXDXAXFXFXFXFXFXFXFXFXFXFXAXDXSXGXAXFXAXAXVXFXVXVXFXFXFXFXFXFXAXFXFXFXFXFXDXZXZXDXFXAXFXFXFXZXDXFXDXDXDXDXFXAXAXAXAXAXAXAXFXFXGXAXFXFXFXFXDXAXAXAXAXDXAXGXAXAXAXAXFXFXFXAXDXDXDXDXFXFXVXFXAXDXDXAXFXFXAXDXFXFXAXFXZXDXAXAXFXFXFXFXZXZXFXFXFXAXFXZXVXZXFXZXFXAXZXFXFXAXDXAXFXFXFXFXFXFXCXSXCXaXS / ) b.].!.!.(.(./././.~./././.(.{.`.^.`.(.|.(.(.(.(.(.(././.^.~.(.(./.(.(.(.^.(./.(.~.~.(.~.~.^.~.[.~.T.T.T.U.U.U.L.L.S.L.H.H.H.H.G.S.G.S.A.A.A.A.",
+"m m m m N m m m m m m m m m m m m m m m m m m m m m m m m m m m m = m m m m m m m m m m m m m m m m m m B V N B B N B B C V B N N C D B Z [ pXM.{ Q u y y y * r r r r y r r r r r r r r r r r r r r r r r 0 e r r r r r r r r y 0 e r r r r r r e : * r e y = r r r : 0 y r * e r r r r r r r r r ; e ; r y r = r r ; ; ; y ; y r q y r r r 0 > r r r r r r : r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r : r r r r r r r r r r r r ; r r % ; $ $ _ mXcXmXcXnXcXnXnXcXcXcXcXcXnXdXxXcXcXcXcXcXcXcXnXcXcXxXxXcXnXdXdXdXdXdXvXcXdXdXcX.XdXvXdX.XdXzX.XzX'.zXzX.X'.dX.X'..XdX X.X.X.X.X X|.|.|.|.|._.|.|._.`.|.`.^.(.(.(.(.(.(./.(././././.(.~.~.~./.T.[.T.T.T.T.~.F.! ! ! hXCXZXZXDXZXVXZXVXFXDXZXFXHXZXZXFXDXZXHXAXFXFXFXZXFXFXDXZXZXAXZXAXZXFXAXAXDXFXHXDXFXAXZXAXDXFXAXAXAXFXZXFXZXSXFXFXFXFXDXZXZXFXFXFXAXAXFXAXAXDXAXFXZXZXFXZXZXVXVXFXFXZXFXVXZXVXVXVXAXVXFXFXVXHXAXDXZXVXSXVXFXFXFXFXDXFXDXZXFXAXAXAXZXZXFXFXFXDXDXDXAXAXAXAXDXFXFXFXFXVXZXFXZXAXAXFXFXFXVXFXFXZXDXZXFXAXAXAXAXDXHXFXFXZXVXFXZXZXFXAXAXFXFXAXAXHXhX[ ! Q S ` b.Z.L.Y.L.U.T.U.T.I.T.U.T.U.U.L.L.L.H.K.G.S.G.G.G.A.A.A.z.S.z.A.H._ / _ aXCXSXZXDXFXZXAXZXZXZXAXFXZXDXHXAXDXFXZXZXFXHXFXAXAXAXFXFXVXFXFXVXFXFXDXAXFXFXDXZXZXVXZXFXDXZXZXZXAXFXFXFXHXAXFXDXAXAXFXAXAXAXFXFXZXDXFXZXSXDXAXZXFXFXVXVXFXAXZXDXZXDXFXFXFXFXFXFXVXZXFXZXZXFXFXAXDXFXZXZXZXFXZXZXFXVXAXAXAXZXFXFXHXFXDXFXAXAXAXAXAXAXAXAXHXAXFXZXAXFXAXZXAXVXFXFXVXZXZXFXVXVXVXFXZXZXAXZXAXAXAXAXAXVXAXZXFXZXFXVXDXDXDXZXHXZXhX' Q Q Q T b.Z.g.k.g.g.z.h.j.f.f.f.f.z.f.j.f.f.g.g.z.g.j.k.g.g.g.g.h.g.h.g.D.Z / / hXFXDXDXVXFXAXAXAXAXAXAXAXHXZXZXFXHXVXZXDXDXFXHXAXFXFXFXZXFXZXZXZXZXZXDXZXAXFXDXFXHXFXZXZXZXZXZXDXZXAXZXZXDXFXVXZXZXAXAXSXZXZXZXAXZXDXFXDXFXFXFXDXZXZXZXFXAXZXZXZXZXZXDXDXDXZXDXZXDXAXAXFXHXZXZXZXZXAXZXZXZXZXZXAXZXDXZXFXSXDXFXZXZXDXZXAXZXFXHXAXZXAXZXDXZXDXFXHXAXDXAXAXAXAXAXFXFXDXDXFXHXFXZXVXDXHXGXHXDXZXFXHXDXAXZXZXAXAXFXZXFXVXFXZXDXDXhX' ~ ~ S ` b.F.I.T.T.~.T.T.T.~.U.~.~.T.T.T.~.~.~.~.~.~.~.~./.(./.(.`.(.(.'.| Q / ' Q.HXFXAXVXFXAXVXGXZXDXHXFXDXDXAXFXAXDXFXFXZXAXFXFXAXDXAXAXAXFXZXVXZXZXFXFXFXFXZXAXFXDXFXHXFXDXVXVXFXZXFXFXFXFXFXZXZXZXDXFXZXVXFXZXVXFXZXZXHXZXAXAXFXAXHXDXDXDXHXFXZXZXAXDXAXDXAXAXAXAXZXZXZXZXAXDXDXZXDXSXZXAXZXFXHXZXFXAXAXDXZXDXSXDXZXZXFXFXSXDXZXAXFXFXAXDXFXZXFXZXFXDXAXAXVXAXZXZXZXFXFXDXZXZXFXVXFXZXAXZXFXHXFXZXZXFXDXFXHXFXFXZXAXVXAXFXhX[ ! ! _ [ n.].(.(._././.~./.~.~./.(.|.(.|.^.{.`.|.(.(./.~.(.(.(./.(.(./.!.(./.^.(.(.(.(.(.(.~.(.~./.^.~.T.^.T.T.T.U.U.L.L.L.L.L.S.H.H.S.S.S.S.S.A.h.A.",
+"m m m m m m N m m m m m m m m m m m m m m m m m m m m m m m m m m = m m m m m m m m m m m m m m m m m B m B B N N V B B N B C B C C C N S m.m.{ { Q t > e e r r r r r r r r r r r r r r r r r r r r r r r r r r r r q e r r r r r r r r r r r r r r : y 0 = * = y : r e * ; q 0 : r r r r r r 0 r 0 ; e y r * 0 ; y r r 0 ; > : r ; r = r e r ; r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r : r r r e 0 r r r r * y r r r r r r r r y ; : ; % % % > cXcXdXcXnXcXnXnXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXnXvXxXxXxXcXcXdXcXvXcXvX.XdXdXdXdXdXdXvX.XzXzXzX'..X'..XdXdX.XzX.XdX X.X.X.X X X|.|.|.|.|.}.}.^.|.`./.`.(.(.(.(.(.(.(.(.(.(././././.~.~.T.~.T.T.T.T.T.T.T.T.I ! ! ' hXDXDXZXZXFXFXZXZXAXAXAXAXAXAXAXAXAXAXZXDXAXAXAXAXZXFXVXZXFXFXDXAXDXFXFXFXVXAXFXFXFXFXAXAXFXFXFXFXVXFXFXFXZXFXFXFXFXFXAXFXFXAXAXFXDXDXFXFXVXFXFXFXFXAXFXZXZXFXFXFXFXFXFXZXFXFXFXVXGXFXFXFXZXFXFXAXAXAXDXZXFXFXFXZXFXFXVXZXVXFXDXFXFXZXDXFXAXAXFXFXDXDXDXZXFXFXFXFXFXFXFXFXFXFXZXVXFXFXFXFXZXVXZXFXFXFXZXFXFXAXFXZXFXFXFXFXGXVXAXFXAXFXAXZXfXc.S / S u [ b.Z.F.L.U.P.T.U.T.T.U.U.U.U.K.L.L.L.H.H.H.G.A.G.A.A.A.h.A.A.A.h.S.b.| ~ ' hXZXCXZXCXFXFXFXAXAXFXZXAXFXAXAXFXZXFXFXAXGXAXFXZXFXFXFXZXFXFXFXFXDXZXDXFXFXFXFXFXFXFXFXFXFXZXVXFXFXFXFXAXAXAXFXFXFXDXZXFXFXAXDXDXAXAXAXFXFXVXFXAXFXFXDXDXZXAXAXAXAXAXFXVXFXFXFXFXFXFXFXFXZXFXAXAXAXAXFXZXFXFXFXFXFXZXZXZXFXDXZXAXDXAXAXFXZXFXFXAXFXFXFXAXAXAXFXFXFXFXDXFXFXFXFXFXFXVXZXFXFXZXVXFXFXFXZXZXAXAXAXAXAXAXZXVXZXZXZXVXVXHXZXDXfXc./ / Q S ` j.S.h.h.h.h.h.l.h.l.l.g.f.f.f.k.k.h.k.g.h.h.h.j.g.h.z.h.h.h.h.z.g.T / / { hXFXDXFXZXZXVXZXVXCXFXDXAXFXFXZXDXZXZXAXAXAXAXDXDXAXDXVXFXFXFXFXFXDXZXFXAXZXZXFXFXAXFXFXFXFXVXAXDXAXDXVXFXFXFXFXFXHXVXDXDXAXFXFXFXFXFXFXFXFXAXZXAXAXDXAXAXZXFXDXFXDXDXFXFXDXDXDXDXAXDXZXFXFXFXFXFXDXDXAXAXVXFXVXZXFXFXAXAXAXAXDXDXDXDXAXAXAXFXFXFXFXVXAXAXZXZXAXDXZXFXFXDXZXZXFXFXFXVXZXAXZXAXFXFXDXDXDXFXFXFXFXFXFXFXDXZXFXAXZXZXDXFXFXFXfX{ S Q S S T e.K.T.T.T.T.T.T.~.T.T.T.T.XX/.~.~.~.~././.~.~././.(.(.(.(.(.(.{.]._ ! ! ' hXFXFXAXAXVXVXFXFXZXFXFXZXVXFXFXAXFXDXAXZXFXFXZXZXFXDXAXFXFXFXFXFXAXFXFXFXVXDXDXDXAXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXFXFXVXFXFXVXVXFXZXZXDXZXDXFXAXAXFXFXFXFXAXAXZXAXDXDXAXDXVXZXFXVXFXFXFXFXAXAXAXAXFXFXAXFXAXFXZXDXDXZXZXZXVXFXFXZXZXFXZXZXFXFXZXZXFXFXFXFXFXZXFXDXDXAXFXVXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXAXZXZXVXFXMXm.! / Q _ n.n._./.(.(./././.~./.~./.^.).|._._.|.{.(.(.(.(.~.(.(.(.^././.(./.(.(.(.(.(./.(.E.[./.~./.[.T.~.~.~.~.T.T.T.U.U.L.L.L.L.S.D.H.H.H.H.S.S.S.S.S.",
+"m m m N m m m m m m m m m m m m m m m m m m m m m = = = m m m m m m m m m m m @.m m m m m B m m m m N B N N B B V C B B C C V C C C C C J M.pXM.' c e ; : * r : r r r r r r r r r r r r r r r r r r 0 e r r r r r r r r : r r r r r r r r r r r r e ; = e r e 0 ! { ( c e ; > * r r * r r ; ; r 0 r ; y = 0 % t > ; ; t 0 r e t e * y r e 0 0 > r r r r r r r r r r r r r r e r r r r r r r r r r r r r y r r r r r r r r r : r r r r r r r r r = ; * : ; % $ $ '.nXJXnXmXcXnXnXcXnXcXnXnXcXnXcXcXcXcXcXcXnXcXcXcXcXxXxX@XxXdXdXcXdXfXdXcXdXdXcXdXdXdX#XdXzXzX.XzX.XzX.XdXdX'.@X.X.X@X.X'..X.X X X'.'.|.|.}.}.}.`.|./.|.(./.|.`.`.(.(.(.(.(././././.(.^.~.^.~.~.^.T.T.T.[.T.T.n./ ! / [ hXDXZXGXFXZXZXFXDXZXDXDXZXZXZXDXDXAXZXZXDXZXZXZXZXFXZXVXDXAXAXZXFXFXFXFXZXZXZXZXZXDXZXZXZXAXZXFXZXZXZXFXZXZXZXFXVXZXZXZXZXDXZXHXAXAXAXAXZXZXZXZXDXZXDXZXFXFXFXZXFXZXZXZXZXFXZXFXVXZXAXAXZXVXZXAXDXZXZXZXZXFXVXZXZXFXZXFXZXAXDXZXZXFXZXAXAXZXAXZXAXAXZXZXZXFXZXZXFXZXZXZXFXZXFXZXVXAXFXZXVXZXFXZXZXFXZXZXZXZXVXZXFXZXVXZXZXFXFXZXAXFXZXfX{ Q / ~ u i e.d.F.K.L.U.U.U.Y.P.U.T.T.U.U.L.L.L.L.H.H.S.G.Z.Z.G.A.A.A.h.A.A.h.H.Z.T ) ~ } fXCXSXFXFXZXFXZXZXZXAXDXAXDXDXZXZXFXFXAXAXVXZXVXZXZXFXZXFXZXZXHXZXZXZXZXZXVXZXZXZXVXZXZXFXZXZXFXAXAXFXZXZXZXDXFXZXZXZXDXAXAXAXAXDXZXAXFXZXZXFXAXFXAXAXAXFXDXZXDXDXDXZXFXFXFXZXFXZXZXZXZXAXZXZXDXZXAXDXVXZXZXFXZXZXZXZXZXFXAXDXAXZXVXZXZXAXZXHXAXFXZXAXZXZXZXDXFXZXZXZXFXAXZXAXZXFXFXZXZXAXZXZXFXZXFXDXZXZXDXDXDXZXDXDXZXDXAXVXFXVXGXFXfX{ ~ S Q u I e.Z.h.S.h.A.A.h.h.h.l.l.h.h.h.j.k.h.k.g.g.h.h.h.h.h.g.h.h.h.A.A.h.g.[ / ~ ^ [ hXBXGXZXFXZXFXVXFXFXZXAXFXZXDXDXZXZXDXDXDXZXAXZXAXAXZXZXZXFXZXFXZXVXDXDXFXVXVXZXVXZXZXFXZXZXAXAXDXAXZXZXZXZXFXFXDXDXAXDXZXZXFXZXZXZXZXFXZXAXDXDXAXDXZXZXDXFXDXZXZXDXZXVXDXDXAXAXAXAXZXZXZXZXZXDXHXZXDXDXZXZXFXZXZXZXDXDXDXAXZXZXAXAXZXZXZXDXFXZXZXZXDXDXZXVXAXZXVXZXFXZXZXVXZXDXDXZXZXVXZXFXZXZXZXDXAXAXZXZXZXZXZXZXFXZXZXZXDXGXZXDXSXfX[ / ~ ~ u ^ [ n.F.Y.T.U.~.T.T.T.T.~.E.XXT.T.~.~.~.~.~././.~./.(.(.(.^.`.`.(.(.`.Q._ ~ ~ } ].ZXGXFXFXFXDXZXFXFXFXZXZXZXZXZXFXFXHXZXFXZXFXHXFXDXAXZXZXZXFXAXZXZXFXZXZXAXAXAXAXZXZXZXZXZXDXZXZXSXFXZXZXZXDXZXZXFXZXZXFXZXZXZXZXZXZXZXDXDXZXZXZXAXDXZXZXZXFXAXZXAXZXDXZXAXAXZXAXZXZXFXFXZXVXZXZXDXDXZXZXAXDXAXZXDXFXZXSXZXZXDXDXZXZXZXFXZXFXFXVXDXSXFXDXZXZXZXZXFXAXAXAXFXHXFXFXFXZXZXFXFXZXFXZXFXZXVXZXZXZXVXZXZXZXVXFXZXZXFXFXAXVXMX} / ! ! L ` b.].]./.|.^.(./.~././.~./.(.(.(.|._.{.(.`.`.^.(.(.(.(.(./././././.(.(.(./.(.^.[.{.(.[.(./.^.(.~.^.~.T.T.T.T.T.Y.L.L.L.L.L.U.S.H.S.H.H.G.G.S.G.",
+"m m m m N m m m m m m m m m m m m m m = m m m m m m m m m m m m m m m m m m m m m m m m m m m m m B N m N N B B V C B C B C C C N C B H _ M.M.{ / u e e y r r y r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r e * y y : f pXPXLXLXLXLXLXpXt > 0 ; r r r r e 0 y ; e ; r e { LXLXLX{ % y * e { gXe ; ; r r * r r r r r r r r r r r r r r r r r r r r r r r r r r r r r * r e 0 r r r r r e 0 r r r r r r r r : ; y e e % % $ $ M.fXxXxXvXvXcXcXcXcXcXcXnXcXcXcXcXcXcXcXcXcXnXxXnXnXxXxXdXxXdXcXdXdXcXdX.XdXdXdXdXdXdXdX%X.XzX.X.XzXzX.X.X'..X'..XdX.X.X X.X.X X|. X|.|.}.|.}.}.`.(._.^.|./.(.(.(.(.^.(.(.(.^./././.~.~.~.~.~.~.T.T.T.T.U.U.T.Y.[ U / / / hXfXHXFXFXFXHXFXAXAXAXVXZXAXZXAXDXZXDXFXZXFXVXFXAXFXZXAXAXZXZXZXAXFXFXAXAXFXHXFXAXVXAXFXAXFXDXFXVXZXZXZXDXFXFXFXZXAXVXFXFXDXAXAXAXDXFXZXVXAXZXAXFXZXZXFXZXZXFXFXFXZXVXFXFXVXVXAXHXFXDXAXZXAXZXAXAXZXZXFXFXFXZXFXVXZXZXFXFXVXAXFXFXFXDXAXZXAXAXAXDXZXZXFXZXZXZXFXAXZXVXFXFXZXVXVXZXFXFXZXVXZXVXFXFXFXZXFXVXFXZXFXZXVXZXZXGXHXZXZXHXhX} Q Q Q S u Y e.n.Z.L.L.U.P.P.U.T.Y.U.U.U.U.L.L.L.L.H.S.S.S.A.A.A.A.A.A.h.z.h.A.D.Z.Z.[ / / ' aXBXCXVXFXFXVXZXVXZXAXZXAXAXFXZXZXDXZXVXZXFXVXZXZXVXZXVXFXFXHXFXZXAXFXVXFXZXFXZXVXZXFXFXZXVXVXZXFXFXVXZXVXZXFXFXDXDXFXAXDXAXAXAXDXAXFXFXAXVXAXAXDXDXHXHXVXAXAXDXZXFXFXZXZXZXFXVXZXVXFXFXVXZXZXVXZXFXZXVXZXVXFXFXDXDXDXFXGXHXFXZXAXZXFXFXDXAXAXAXDXFXZXVXVXZXAXFXZXZXFXVXZXZXAXVXZXZXFXFXVXZXVXZXFXFXAXAXAXZXAXAXZXDXFXZXFXFXAXVXBXhX{ ! ~ Q u u Y e.Z.W.S.S.h.A.S.A.A.A.l.l.l.h.h.k.j.h.l.h.h.h.h.h.l.h.h.h.A.h.A.h.l.h.T / S ^ } hXfXZXZXZXVXZXAXZXZXVXFXFXDXHXDXDXAXAXAXDXAXAXDXDXZXVXVXZXFXFXFXFXAXZXAXAXFXZXFXZXFXFXVXFXAXDXAXFXAXAXFXHXAXAXFXDXZXAXZXVXFXVXZXVXFXFXCXVXAXAXAXDXVXZXVXAXAXAXZXHXFXFXDXAXAXAXAXDXVXVXZXVXFXFXZXZXAXAXZXAXFXVXZXVXAXAXAXAXDXDXAXFXVXZXAXZXFXAXFXZXAXAXDXAXFXZXVXZXZXFXVXVXFXVXFXFXAXFXZXVXFXFXDXDXAXAXFXFXZXVXVXVXZXVXFXZXZXZXDXHXhXc./ Q ' u t K b.Z.K.K.T.T.U.T.I.T.T.T.T.XXY.~./.Y.~.~.~./././.(./.(./.^.(._._.^.|. XQ./ / / ' Q.fXZXFXVXVXAXZXAXFXAXZXZXVXFXFXFXFXZXVXZXFXZXHXAXFXFXAXFXAXAXDXFXFXFXVXDXAXDXDXAXVXZXDXFXAXZXFXZXZXZXZXFXVXZXVXFXFXHXFXZXVXFXFXVXZXVXZXFXFXHXZXAXAXFXAXAXVXZXZXDXAXZXZXDXAXDXAXZXVXFXZXFXFXFXZXAXZXAXZXZXAXAXZXAXDXAXZXAXZXZXAXVXZXZXVXFXFXFXFXDXAXAXDXFXVXZXVXFXFXDXAXZXFXZXVXZXVXFXFXHXZXZXZXZXVXZXFXZXVXZXVXZXVXZXFXFXZXDXHXHXhXM.~ S ! u K b.n.].^.|./.^./././.~.T.~././.|.(.|.{.(.|.{./.|.(.(.(.(.(./.(./././.(.(./.(.^./.^.^.~.~.~.^.E.T.~.~.T.~.T.T.U.T.Y.K.U.L.L.L.L.L.S.H.H.H.H.H.S.G.",
+"m m N m m m m m m m m m m m m m m m m m m @.m m m m m m m m m m m m m m m m m m m m m m m m m m m N N B N B B B B B B B C B C B A Z Z y [ M.{ { K u ; > : : r : r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r r r r 0 r : * r 0 : u IXLXLXLXLXLXLXLXLXIXe 0 * ; 0 r r r r r ; ; ; 0 r { LXLXLX] 0 * { JXLXHX% y r 0 e r ; r r r r r r r r r r r r r r r r r r 0 e r r r r r r r r r r r r r r r r r r r r e r r r r r y * e * ; : ; % $ o F dXnXxXcXcXcXcXcXnXnXcXcXcXnXcXcXcXcXnXcXcXxXxXnXxXcXcXxXxXdXdXcXzX%XdXdX%XdXfXdXdXdXdXdXzXzXzXzX.XzXzX.XzXxX'.'.@X'.'..X X.X.X|. X X|. X}. X}.|.(.`.|.`.(._.^.(.(.(.(.(.E././.[.^.~.~.~.~.~.~.[.T.[.T.U.T.!.U.T.b.S / / { m.hXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXfXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXJXBXfXQ.[ ~ Q Q S u J Y e.n.Z.L.L.L.P.U.L.P.U.Y.L.L.L.L.L.L.L.H.S.S.S.A.G.A.A.H.h.A.A.A.A.D.D.Z.Z.U / / ' m.hXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXMXBXMXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXfXm.[ / ! ! ^ u K e.n.Z.S.A.S.S.S.A.h.A.A.h.G.l.h.h.l.f.h.l.h.h.h.h.h.z.l.h.A.h.A.g.h.D.z.z.[ S ~ S _ m.fXBXBXBXBXBXMXBXBXBXBXBXMXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXmXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXhXQ.{ ^ / / u u K e.b.n.K.T.T.T.T.T.~.T.T.T.~.R.R./.T./.(.T./././././././.(.^.^._.`. X{.|.dXn.! / ~ ' m.fXfXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXMXBXBXBXMXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXCXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXMXBXBXMXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXfX].[ ~ / / n u _ c.n.].~.(.|.(.|././.T././././.^.|.^.|.`.^.|.(.(.(.(.).(././.(././.(.~./.^.{.^.^.^.^.^.(.(.~.{.^./.[.~.~.~.T.T.T.T.Y.U.L.L.L.L.L.L.L.H.L.H.H.S.Z.",
+"m m m m m m m m m m = m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N m N m m m m m M V N B M M C N B C B C N B C C C Z C C { M.{ ' u y > r r r 0 r r y r r r r r r r r r r r r r r r r r r r r r r e 0 * y r r r r r r r r r r r r : : y - IXLXLXLXLXIXIXLXLXLXLXIX- * > e ; ; ; e * w = q : y f pXaXm.u ; > gXLXLXUX> = ; * e ; ; : r r r 0 : r 0 y * r r r r r e r r r r r r r r r e * y : r r r r r r r r r r r q r r r r r r r r r r r : % $ $ w vXxXxXxXxXnXcXcXcXxXnXnXnXcXxXxXnXxXcXcXnXdXnXcXcXcXcXcXdXdXdX@XzX.XzXdXdXdXdXvXdXdXdXcXdXzX.XdXdXdXdX.XdX.X.X X X.X X.X|. X.X X|.'.|.|.|._.|._.(.|.^._._.^.`.(.(.(.^.(.(.(././././.~.~.~.~.~.T.T.~.T.Y.T.U.L.U.U.[ ! / Q ! ! S ! ! Q Q ! ! ! ! ! ! ! ! ! ! ! Q ! ! ! ! ! S ~ ^ ^ ! ! ! ! ! S ~ ^ S ! ! ! Q Q S ! ! ! Q ! ^ S ! S ! ! S ! ~ S S ~ / ! ! S ! Q ~ ! / ! ! ! S ! ! ! ! ~ ! ! ^ ^ S ~ ! ! S ~ ! S ! ! ! ! Q ! ! ! ! ! S ! ~ ! ~ ~ S ~ Q S ! ! Q Q ~ S ~ ! ! ! ! ! ! ! ! ! ! ! ! S S ~ ! ! ~ ! ! ~ Q ! ! S ~ ^ S ! ! ! ! ! ! ! ^ ~ S ~ / / Q ! ! S ^ u y i Y e.n.S.F.L.L.L.U.L.L.P.L.L.U.L.L.Y.L.L.L.H.A.A.A.S.A.G.A.z.A.h.h.A.A.A.G.S.I.b.) / / / S / ~ ! ! ! ! ! ! S Q Q ~ ! Q Q S ! ! ~ ! ! ~ ~ ~ ~ ! ! ! ! ~ ~ ! S Q Q Q ! ~ S S ! ! ! ! ! ! Q ^ ! ! ~ ^ S ! S ! S ! ^ ! ! ! ! S ~ ! / ! ! S ! ! ! ! ! ~ ! S ^ ! ! ! ! ! ! S ! ~ S ! ! ! ! ! ! ^ ! ! ! ! S ! ! ! ! S ! Q ~ ~ ~ S ! ~ ! ! ! S ! ~ ! ! ! ~ ! ! ! ! ! ! ! ! Q S S S ! ! ! ! ! S ! ! ! ! ! ! ~ ! ~ ! ! ! ! ! ! ! ! S / u u S T n.H.S.S.S.G.S.S.A.A.A.A.A.A.A.g.h.l.z.h.h.h.h.A.h.h.A.A.A.A.h.A.h.h.A.h.l.Z.U S / / ! Q ! ! ! S S ! ! Q Q Q Q ^ ! ! ^ S ! ! ! ! ~ ! S ! ! ! ~ ~ ! ! ! ! ^ ~ ! ! ! S S ! ~ Q ~ Q ~ ! ! ! S ! ! ! / Q ! ! S ! ! ! S ! ~ ~ S ~ ~ ! Q Q Q ! ! Q Q Q Q Q S ! S Q S Q ! ! ! ! ! ! Q S Q ! Q ! ! ! ! ~ ~ S ^ S S ! ! ! ! ! ! ! ~ S Q ! / ^ S ! ! / ! ! S Q S ! ! ! ! ! ! ! ! ! ! ! ! S ! ! S ~ ~ Q Q ! S ! / ~ ~ ! ~ ~ Q / / / S u u K _ b.n.H.Y.U.Y.Y.T.T.T.T.T.T.~.T.~.~.~.~.T.~.[.~.~.(.(./.(.(.(.(.(._._. X`..X]._ / ~ ! ! ~ ~ ! ! ! Q S ! S ! ! Q S Q ! S ! / ~ ~ ! ! ! ! ! ^ ! ! ! S S ! Q S ! ! ! ! ! ! ~ ! ! ~ ! Q Q K ~ Q ~ ~ ~ ^ Q S ! S ! ! S Q ! Q ! ! ! Q ! ! ! Q ^ Q ^ ! ~ ^ ~ ! ! ! Q Q ! Q ^ ! S Q Q / Q Q Q Q ! ! ! / / S ! ! ^ ! S ! ! ! ! ! ! Q ~ ! ! ! ! ! ! ! ! ! ! ! ~ ~ ~ ~ ! ! ! ! ^ ! S ! ! ! ! ! S ! / ~ Q ~ S Q Q ! S ! ! S ^ ~ Q Q ~ ~ u c ~ v.n.!.].^.^.(.(.(./././.~.~./.(.{.^.|._./.|./.`.^.(.(.(.^./.(././.^./.(././.(.(.E.(./././././.!.T.~.~.~.~.T.~.T.T.T.T.U.U.U.U.L.L.L.L.L.G.H.H.G.D.",
+"m m m m m m m m m = m m m m m m m @.m m m m m m m m m m m m m m m m = m m m m m m m m m N m m B N N N B C C V C C N V C C C C C Z C C C { [ { ' S y 0 r r r ; r r * r r r r r r r r t * 0 e r r r r r r : r r r r r r r r r e r r r r r r r r r ; e = ' LXLXLXPXu $ $ c PXLXLXLX' % u ' ' { * e = { ' { ! ; u { { n > % { IXLXLXIXn c % ; ; ; e : r r r r r r : r : r r r r r r r r r r 0 r r r r r t 0 r r r r r r r r r r r r r r r r r r r r e 0 0 r 0 % $ $ & zXxXnXxXxXxXcXcXnXnXnXnXxXxXcXnXnXJXdXxXcXJXnXvXmXdXdXcXcXcXdXdXzXzXzXdX.XdXdXdXdXdXdX XdX@XzXdX.XdXdXzX.X X.X X@X X.X.X.X.X|.|..X.X|.|._.(.|.(._.(.|._.{.|.^.`.(.(.(.(.(./.(././.~.~.~.~.~.T.~.~.T.Y.T.T.U.Y.U.U.[ ` ! S ! / Q Q Q Q Q ! ! ! ! Q / ! ! S ! ! Q Q ! ^ ! ^ ~ ~ ! ! ! S ! ! ! ! Q S Q Q Q ! ~ ~ / ! ! ! ! ! ~ / ! ! ! ~ ! ~ ! ( ! ! S ! ! / ! ! Q S ! ! ! S ! ^ ! ! ! ~ ! ~ ~ ^ Q ! Q Q ~ S ! ! ! ! Q ! Q ! Q Q Q / ! ! ! ~ ~ S / ! ! ^ ! ! Q ! ~ S Q Q Q ! ! ! ! ! ! ! ! ! ! ^ Q Q Q Q ~ S ! Q ! ! / ! ! ! ! / ! ! ! ! ! ~ ~ ~ Q Q Q / ! Q Q Q S u Z ) e.b.Z.A.H.L.L.U.L.L.U.P.P.Y.U.L.L.L.L.L.L.H.H.S.A.A.A.A.A.A.A.h.A.h.A.A.A.J.H.Z.[ ) P Z / ~ ! ! ! / Q Q ~ ~ ! ! ! ! ~ ~ ! ! ! ~ ! ! ! ! / ~ ! ! ! ! ~ ~ ! Q ! ~ ! ! ! P Q ~ ! S ! ! ! ! ! S ! ! ! ! ~ ~ ! ! ! ~ ! ! ! S ~ Q ! ! ! ! ! ! ! ! ! ! ! ~ / ! ! ! Q Q ! ~ ! Z ! ! Q ! Q Q Q ! ! ! ! Q Q / ! ! Q ! ! ! Q Q ~ ( ~ Q Q Q ! ! ! Q Q Q ! ! ! S ! Q ! Q ! ^ Q Q / ~ ! ! S ! ! ! ! / ~ S ! ! ! ! ! ! ! ! ! / ! Q Q c ^ S u F Y b.F.G.S.H.Z.H.G.A.A.A.h.Z.A.A.j.A.G.l.h.A.h.A.A.h.h.Z.h.A.h.A.A.h.A.A.h.h.l.Z.T U S S ! ~ / / ! ! Q Q ^ ~ ! ! ! ! ! S ! ! ! ! ! ! ! ~ ! / ! ! ~ ~ ! ! ! ! ! ! ! ! ~ / Q Q ~ ~ / Q ! ! ! ! ! ! Q Q Q Q ! ! ! ! ! ! ! / ! ! ! ~ ~ ~ Q ! ! Q ! ! ~ ^ Q Q ~ ! ! ~ Q Q ! ! S ! S ! Q Q ! ! ! ! ! ! Q ~ ~ ~ ! ! ! ! / ! Q ! ! ! ! ! ! ! Q Q ! ! ! / ! Q / ! Q ! Q ! / ! ! ! ! / ! ! ! ! ! ! ! ! ~ ~ / ~ ! / Q Q Q Q ! ! S ! ^ S S i H U b.b.F.Y.I.U.T.T.T.U.T.T.T.T.T.T.T.~.T.~.[.~.~.~./././.(.(.(.(._._.`._. X`._.dX].] / S ! ! S ! / ! / ! ! ^ ! ! Q ! Q ! ~ ! ! ! ! / Q ! ! ! ^ ! ! ! S ~ ~ ~ Q ! S ! ! ! ! ! S ^ Q S ! / / ~ / ~ ~ ~ S Q Q ! ! ! ! ! ! Q ! ! Q Q ! ! ! ! S ! ! ! ^ ~ ! ! ! ! ! ! ! ! ! ! ! ! ! Q Q ! ! ! ~ Q S ! S / S ! ! ! ^ ! ! Q ! Q ~ ! ! Q S ~ / ! ! ! ! ! ! ! ~ ! ! ! / ! ! ! Q Q ! Q ! Q ! ! ! ! ! / / ~ Q ~ Q ~ ^ ! Q Q Q Q Q Q Q / u u Q c.b.n.].!.].(.`.(.(././.~.~.~./.(.(./.|.(.|.(._.(.|.(.(.(.(.(./.(./.(.(.(././.(./.(././.(.(.(./.!.(.~.~.~./.~.T.~.T.T.T.T.U.U.U.U.L.L.L.L.L.H.H.S.G.",
+"m m m m m m m m m m m m m m = m m m m m m = m m m m m m m m m m m m m m m N N m N m m m m m N N N N M V M C C N N C N N B B C C C C C Z { { ' ! u t ; r ; r r r r r r r * r r r e r 0 y r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r y ; e pXLXPXLXaX, $ % $ pXPXLXLXaX$ pXPXLXLXe > : LXLXLXpXw c LXLXLXn % LXLXLXLXLXLXHX- % ; e = r : r r 0 r r r e r r r 0 r r r r r e r r r r r r r r q r r r r r e * y r r r r r r r r r r r r 0 r r r = % $ $ o dXxXxXxXxXxXcXcXcXcXnXcXdXnXxXcXcXxXnXxXnXnXxXcXcXcXcXdXdXdXcX.XdX.XzXdXdX@XdXcXcX%XdXdXdXdX X.X.X.XzX.X.XdX.X X.X.X.X.X.X.X.X.X|.|.|._._.|.^.(.|.(.|._._.(.`.^.(.(.!././.(./.(././.~.~.~.T.T.~.T.T.P.Y.U.U.L.P.P.I.K.n.b.T K ~ S S Q J ^ S D ! S S u S S Z c ^ Q ~ S S Q S S S S S S S Z S ! Z S K u S S S H S S Z ! S S K S S ! H S ^ S i K S Z S S S D S S F Z u u Q S S S S Q H S S S F K S S S S H K A u S S S S K S u F S S Z S S u i L S S S Z S S S S L S F i S S u S S u Z S S ^ K S S S S Q Z S H i S K ^ S A S Z K S ! K S S Q Z u ^ u c u u u > u u F Y T b.n.A.G.D.U.L.L.L.U.P.U.U.U.U.Y.L.L.S.L.G.H.H.A.A.A.A.h.A.A.A.A.h.l.h.A.W.h.A.A.H.Z.n.[ U P S S S S ^ ^ S ^ S D ! S S Q ! S ^ u S S ! S H u S F S S S S S S D S S S u K S Z ! S ! D S S Z Z Z i S Z Q S S S H S S S F S S A S S B H u K S H ! S H S S K S Q Z S S S u Z S S S S S S S S B K F M S Z u S S S Z S S S F u S Z Q S Z S Z i S S S Q B Z u u S c Z S ^ S Z C ^ Z S S S Z S S S S u F ^ Z S S S ! Z u u u u u y F J e.b.Z.G.H.H.H.G.G.G.H.S.H.G.A.A.A.A.A.g.A.h.A.j.Z.h.A.g.h.A.A.A.A.A.h.h.A.z.h.h.l.S.Z.b.[ I I I S ! ! Q u D S S c Q S S S ^ ^ ! S ! S u H S ^ ^ ! ~ S S S ^ S S ! ! S S S Q ^ ^ ~ Q ~ Q ^ H S S K Q Q S Q S c S ^ ~ S S ! ^ S ^ ^ S ~ u ! / S ^ ^ S ^ S ^ S ^ ^ ^ S S c Q ^ Q ! Q ^ ^ ^ Z Q S S ! Q ^ S S ! S S ~ S ~ Q S S S S S ^ ^ ^ ~ ! Q S S Q S H S ^ ^ ^ S S S S S ^ S S Q S ^ ~ S ! ~ S ~ ^ ^ Q Q ^ ^ ^ u ^ ^ S S u u u K Y e.b.G.Z.Y.I.I.T.T.T.T.I.I.T.T.I.~.~.~.T.~.~.T.~.(.~./././.(./.(._._._. X X.X{. XzX].].Q.[ _ ~ f P c S ! S S ! Q u Q ^ u / P i ^ u Q S ^ ^ S S S ! ^ c S S Q ^ c S J c ^ S ! ^ u / S K ^ ^ u ^ ^ ^ ^ S ^ S S S ^ S Q Q ^ S ! J ^ S Q S Q ^ ^ ^ ^ ^ ! ^ ~ ~ ^ u u ! ^ ^ S c Q ^ u u S n ^ ^ S ^ S Q ! c ^ ! ! S S S S ^ ~ ~ S C ^ ! S Q Q S ! ~ ! S S S ! ~ Q Q Q S ! Q ^ ^ S S Q S ! S ! S ~ u S / Q Q ~ ^ ~ S Q ! ~ u u u u i i ` c.F.].~.(.(.(.^.(.(./././.~././.(.(.^.|._._.|.^.(.(.(.(.(.^.(.(.(./.(./././././././././.~./././.~.(.~.~./.T.~.T.~.T.T.T.T.U.P.T.U.L.L.L.L.L.L.H.H.A.",
+"m m m m m m m m m m m m m m m m m m m m @.m m m m m m m m m m N m m m m m m N m m N m N N N m N N V N M A M N C C V C C C A C C C C Z C ' { ' ' u : e = y r r r r : r r r r r r r * y : r r r r r r r r r r r r r r r r : r r r r r r r r r r r : : > gXLXLXLXn $ o o   n LXLXLXIX  sXLXLXLX% * * LXLXLXpX* ' LXLXLX' $ LXLXLXLXLXLXgX% % % ; ; r : 0 r e r r r r r r r r r r r r r r r r r r r r r r e r r r r r 0 r r r r r r r 0 e r r r r r : r r r = $ $ o o nXxXxXxXxXcXcXmXcXcXcXcXJXnXxXxXxXcXdXnXxXxXnXcXcXcXcXcXcXdXcXdXdXdXdXdXxXdXdXdXdXdXdXzXdXdXdXdX@X.X.X.X.X.X.X.X.X|..X.X|.|..X|.|.|.|.`.`.`.`.^.^.`.{.(.|.(.(.(.(.(.(./.(././././.~./.~.T.~.(.T.~.T.T.T.T.T.U.Y.U.L.L.D.F.b.b.` Y J S K u u u u u u S S u u u u u A u u u u i u u u u y u u u u u u u u u u q u r u u u y q u q u q u u u q u u u u u u u u r u u u u u u q A u u u q u u q u u C u y q u u u y N t u M u u q u > A q u u q u u y u u u q u r q q u u u u u q u u q u u t u q u q u u u q u u u q u u u u u u u y q u u u u u u u A A Z q u A Y Y T b.e.G.A.H.U.S.L.L.L.L.U.U.U.L.L.L.L.L.L.L.K.H.H.A.A.A.A.Z.g.h.h.h.S.h.h.A.A.A.A.W.G.A.A.Z.b.` Y I K S u u Z u u u u u A u u u u S S u u u u u u u u u u q u y u q u u u u u u u u y u u r u u u u u u u q u y u q u u u u y u u u u u u u u u q u q u u u u q q u u u u A u u q N t N u y u q u u u u y u u y u y u u q A u q u u q u u u q u u y u u u u y m q u u u u A u u u u u u u y M u u u u u r u u y u u u ! F G Y Y b.b.H.L.U.H.H.H.H.H.H.S.S.A.A.S.G.H.G.A.A.A.A.h.g.A.A.A.A.A.A.A.h.A.A.j.A.Z.A.A.l.k.z.A.g.d.e.T U U Z Z u u u q u u u u u u u C u u u A K i u A u u u u u i u u u u S u i i u F u u u i F u i Z i u u K u u u S u K S c i H S K c S K c ! ) u c J i K K c I c K S c c K S S c K S c K S c H K u K i K u u u S u u i u u u u u u u i u u u A u u u K u u i u u H u u i S K i S u S u u K K K S i S u i u S u u D u K u u u i u K ` ` b.n.Z.F.K.I.Y.T.I.T.T.U.T.T.T.T.T.I.~.I.~.T.~.~.~.~./././.(.(./.(._._.`..X`. X.X_.|.dX|.].Q.Q.m.c.` ~ 8.' c ' c ' ' c ' c ' ' c ) ' ' c c ' c ' ' Q ' c ^ c ' ^ _ c _ i ' K c ' ' i ' c c ' K c ' ^ c c ' c c S ^ c ^ K S c J c K c S c S c K S K c i S c i ' ^ ) K c ~ S i ' ^ ] ^ J ' S c S c Q S i ' i K c S n c K u u S i K S i K u K u i S K u u K K u i J K J i u Z K i D i S i S i K u S i u K i J i K u S i K S c ^ ) ] c.b.n.].!./.(.(.|._.|.^.(././././././.[.(.(._.(./.`.(.(.(.(.(.(./.^./.(.(./.(./.~./.~./././././././.(.~.~.~.T./.~.T.~.T.T.T.T.T.P.P.U.U.U.L.H.L.L.D.H.S.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N N m N N N m N N N N V B V V A N N C B B C B B C C B C A C ' ' ' ! y ; ; ; ; y = r r r q e r r r r r r r r r e r r e r r r r r r r r r r r r r r r r r r r r r r r y y : IXLXLXLXQ & $ o $ c LXLXLXgX$ pXLXLXLX% ; * LXLXLXpX: ' LXLXLX{ $ c UXLXLXIXc f & $ % ; ; 0 : r r r r r r r r r r q r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 * r : = ; % $ o   nXdXmXvXxXcXcXnXxXxXnXnXcXxXxXnXxXxXJXnXcXcXnXcXcXcXcXdXdXdXdXdXdXdXzXzX@XdXdXzXzXzX.XdXzX.X@X.X.X.X.X.X.X.X.X.X|..X|..X|..X X|.|._.|._.}.`.^._.(.(.(./.|.(.(.`.(.(./.^./././.^.^.~.~.~.T.T.~.T.T.T.T.T.T.P.P.U.P.Y.P.L.F.Z.F.b.e.e.v.Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y G Y Y Y Y Y F Y Y G Y G Y F G F Y F Y K U Y Y Y Y Y G Y G G Y F F Y F K F F Y G G G G Y F G Y F F F G Y G G Y G Y G G G G G Y G G G G G G G G G G G G G G F G G G G G i G u G G G G G G G G G u F F G G G G G G G G Y i G G G G G Y G G G G i Y U G F F G F Y Y Y Y Y i G U U Y Y Y Y Y T e.e.Z.S.S.S.H.S.S.S.Y.L.L.U.U.L.L.L.U.K.L.L.L.L.H.H.A.A.g.A.A.l.l.A.l.A.h.A.A.A.A.A.A.A.A.A.A.h.A.A.Z.Z.Z.e.b.e.Y Y T v.Y Y Y Y Y Y Y Y Y Y Y Y D Y Y G Y G Y U G Y G G G Y G Y G Y D U Y Y G Y G e.Z D Y G G G G Y Y F H Y F G G G Y G Y Y G G G Y H Y G G F G G Y G Y G G G G Z G G G G G G G G G G F G G G G G G G G U G G G G G G G G G F G G G G G G G Y D G G G G Y F Y G G Y G G Y G Y Y G Y G Y Y e.b.b.b.b.b.b.b.b.b.n.F.K.L.Y.U.Y.I.H.H.H.H.H.h.H.A.S.A.A.H.A.h.A.h.A.h.A.A.A.z.S.A.A.h.S.A.h.A.h.A.h.h.A.h.l.z.l.e.j.e.e.T Y Y Y Y Y Y Y K F Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y ` Y Y ` e.Y Y Y Y c.Y Y c.c.I Y e.Y c.Y ` [ c.c.c.c.` [ c.Y c.b.` v.` c.` [ v.` c.c.` c._ [ c.` c.` ` _ ` ` c.c.c.b.v.[ _ ` c.[ c.c.c.` c.[ c.[ Y ` b.c.T Y Y Y Y e.Y Y Y Y Y c.Y Y Y Y Y Y c.Y Y c.Y Y Y Y e.Y ` Y ` Y [ Y c.Y c.Y ` e.c.` ` Y U Y ` Y Y ` e.Y c.Y e.` T b.b.n.Z.L.K.I.I.T.L.I.T.T.L.R.T.L.T.T.T.T.~.T.T./.~.~./.(.~.^.(.(.(._._._._._._.|.'.'.'.|.'.'.].'.m.m.n.[ c.M.c.M.c.c.M.c.M.c.M.c.M.c.c.M.{ c.b.c.c.c.c.c.c.c.c.c.c.M.c.c.M.c.c.c.c.M.c.c.m.c.c.c.m.[ c.c.c.c.c.c.` c.c.c.c.c.c.c.[ ` [ v.b.` c.c.c.[ c.{ b._ c.[ ` c.c.c.c.[ c.` c.c.c.b.[ c.c.c.c.b.c.c.c.c.v.c.` [ [ [ c.c.` c.c.c.` Y c.` [ ` c.[ Y v.b.c.c.` ` ` _ c.Y [ ` c.c.c.` Y ` ` Y v._ [ T c.Y [ U c.Y ` Y ` [ [ b.b.b.F.K.].].~.^.(.`.|.`.|.(.^././.(./.{.^.^.`.(.`._.^.`.(.(.(.(.^././.(./.(./.(./././.~.~./.!.~./.~.(.~.~.T.~.~.~.T.T.~.T.T.T.T.T.T.T.U.U.T.U.D.H.U.L.H.S.S.",
+"m m m m m m m m m m m m m m m m m m m m m m m = m m m m m m N m m m m m N m m m m m N N B N B N N N N B M C B C B B C B C C C C C C Z C ' ' ' S u > e > r r r r r r r r r r r r r r r r t * * y q r * r r r r r r r r r r r r r r 0 r r r r r r = r > gXLXLXLXc $ $ - o f LXLXLXgX  sXLXLXLX& % % LXLXLXpX% c LXLXLXc $ o IXLXLXIX  $ $ $ % % ; 0 r ; r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r e r r : r y r ; % $ o   dXdXnXxXzXvXcXxXxXnXxXxXnXJXxXxXcXnXnXcXnXcXnXnXcXzXcXmXdXcXdXdXdX.X.XdXdXdX.X@X.XzXzX.X'. XdX.X.X.X.X.X.X.X.X.X X X.X X.X|. X|.|.{.|.|.[.^.`._.(.(.(.(./.^.(.(.(./.(.^./.(.!./.~.~.~.~.T.T.~.T.T.T.T.T.P.P.T.U.U.H.P.Y.L.Z.S.S.n.b.b.b.e.b.e.e.b.b.b.b.e.e.b.e.b.e.e.b.e.e.e.e.e.e.e.T e.e.e.e.T e.e.e.T e.T e.T e.T e.T e.e.e.e.e.e.e.e.e.e.e.e.e.e.T e.e.e.e.e.e.e.e.e.e.T T e.e.e.T T e.e.e.T T T e.e.e.e.T e.T T w.e.e.T T e.e.w.T T e.w.w.e.e.T e.T e.e.T e.e.e.w.e.e.T T T e.e.T T w.e.e.T e.T e.w.e.T e.e.e.T e.e.e.e.e.T e.e.T e.e.e.e.e.e.T e.e.e.e.j.b.Z.Z.F.S.H.L.H.K.A.L.L.L.L.L.U.U.L.L.L.L.L.L.H.H.H.A.A.A.A.h.A.l.h.A.z.A.h.h.A.h.A.A.A.A.h.A.A.Z.H.G.Z.Z.Z.Z.Z.b.n.b.e.e.b.b.b.e.b.b.b.b.b.e.b.b.b.e.b.b.b.b.b.b.b.b.b.b.e.b.e.b.e.b.b.e.b.b.b.e.c.e.e.b.e.b.b.e.b.e.e.b.e.b.e.b.e.b.b.e.e.b.b.b.b.b.e.b.n.b.b.b.b.n.b.n.n.n.n.F.n.n.n.F.F.n.n.n.F.n.n.F.n.n.n.n.n.F.n.n.F.n.n.n.n.n.F.n.F.n.b.n.n.b.b.n.b.n.b.n.b.F.b.n.n.b.n.n.b.n.n.b.F.b.b.n.n.F.F.n.n.F.L.K.Y.Y.I.Y.R.Y.U.Y.!.T.R.R.L.L.H.K.L.H.H.H.H.H.H.S.H.S.G.G.A.H.A.A.A.S.S.A.G.A.S.H.A.A.A.A.A.h.h.h.A.A.G.A.G.A.A.W.e.e.e.e.e.e.e.e.e.e.e.b.e.T e.e.e.e.e.b.e.b.b.b.e.b.b.b.b.b.b.b.b.b.b.b.e.b.e.b.b.b.b.b.b.b.b.n.b.b.e.n.b.n.n.n.F.n.n.n.n.n.n.n.n.n.F.n.n.n.F.n.n.n.F.n.n.n.n.n.n.n.n.F.n.n.n.n.n.n.F.n.n.n.n.n.b.n.n.n.n.b.b.n.b.e.b.b.b.b.b.b.b.b.e.b.n.b.n.b.e.b.b.b.b.e.b.b.b.b.b.b.b.n.b.b.b.n.n.b.b.n.b.b.n.n.n.F.F.n.n.b.n.b.b.b.b.b.b.Z.b.F.S.U.K.Y.T.T.T.T.T.I.Y.T.T.T.T.U.T.T.K.~.~.T.~.~.~.~.~././.(.(.(.(._.|.|.|..X|.`..X@X.XdXdX'..X].].'.Q.'.Q.Q.Q.m.m.Q.Q.].'.Q.m.m.Q.Q.Q.Q.n.m.Q.Q.].n.Q.Q.Q.Q.Q.n.].m.n.Q.].m.Q.m.m.].Q.m.Q.n.m.n.].n.Q.Q.Q.Q.F.n.n.n.F.n.n.n.F.n.F.n.n.n.n.n.F.n.F.n.n.F.n.F.n.n.n.F.n.F.n.n.m.n.n.].n.n.n.Q.n.n.n.n.F.n.b.F.n.n.b.n.n.n.n.n.b.n.n.b.n.n.n.n.n.b.n.n.n.b.b.F.n.n.n.F.n.n.n.n.b.n.b.F.n.n.n.n.b.b.n.n.n.n.n.n.n.F.n.F.n.n.n.n.n.Q.!.T.T././.(.(.(._.{.`.(.`.(.(./.(./.(.(.(.^.`.^.`.{.(.(.(.~.^./.(./.(./././././.!.~.~.!.~.~./.~.~.~.~.).~.~.~.~.~.T.~.T.[.P.T.T.T.U.T.P.U.P.P.D.H.H.H.S.",
+"m m m N m m m m m m = m m m m m m m m m m m m m m m m m N m N B m m m m N m N m B m B N N B N B B B N B C V N C B C B C B C C A C Z Z C c ' ) c u : e : 0 ; r r r r r r r r r r r r : r 0 : y : r 0 y r r r r r r e r r r r r r r r r r r r r r r r : pXLXLXLXsXo sXPXsXpXLXLXLXsX$ M.LXLXLX% $ $ LXLXPXpX& c LXLXLXc $ $ gXLXLXgXo   o $ % % ; ; r r r : r r r r r r r r r r r r r r r r r r r r r r r r r r r : r r r r e r : r r r r r : * r r : : r % % $ o o fXcXdXxXxXvXzXxXxXxXfXxXxXdXcXcXvXnXnXJXzXmXnXdXcXcXcXdXmXdXcXzXxXzXxXzXdXdX.XdX.X.XzX.XdX.X.X.X.X.X.X.X.X.X.X.X.X.X|..X|.'.|.|._.|.|._.(.(.(.(.(.^.(.(./.(.(.(.(.(./././././././.~.~.~.~.~.T.T.T.T.U.P.T.P.T.P.P.P.P.Y.L.L.S.Y.Z.Z.Z.Z.n.Z.n.Z.Z.Z.Z.Z.j.n.Z.n.A.n.b.n.f.h.b.b.e.e.Z.Z.e.e.e.j.e.j.e.e.j.j.d.Z.j.g.b.j.b.j.j.b.j.e.b.e.Z.j.e.e.e.e.j.e.j.e.e.j.e.j.e.e.e.e.j.e.f.e.e.j.b.j.a.e.j.e.e.e.e.e.e.e.e.f.i.e.e.s.e.a.e.e.e.e.i.e.e.e.e.e.j.s.e.y.e.p.e.e.e.e.e.e.j.s.e.e.w.e.d.d.e.e.e.f.e.e.s.e.j.e.e.j.i.e.e.e.j.Z.e.e.e.e.j.j.e.b.e.e.Z.e.j.j.Z.j.Z.A.A.A.D.H.H.S.H.U.L.L.L.L.U.L.L.L.L.K.H.L.H.H.H.G.G.A.A.h.A.z.h.l.A.h.A.A.A.Z.h.A.A.A.A.A.A.A.A.G.A.H.S.Z.Z.Z.F.Z.Z.F.Z.Z.F.F.n.Z.F.Z.Z.h.F.Z.F.F.Z.H.K.F.F.F.F.G.G.Z.F.Z.h.F.n.Z.F.Z.Z.z.F.Z.n.n.Z.S.Z.n.z.n.Z.n.k.Z.Z.Z.Z.Z.Z.n.Z.n.S.F.F.Z.F.F.S.L.K.F.K.F.F.U.I.].F.F.].I.I.].K.F.].L.K.].].K.].I.I.Q.K.K.].XXQ.].].].].L.].].K.Y.K.].F.J.].F.].U.K.].F.Q.K.L.F.L.F.P.n.P.A.K.F.F.K.A.L.].Q.F.].K.~.].!.!.].(.^.!././.(.(./.~.~.~.T.U.I.L.L.L.L.H.H.S.Z.A.H.S.S.S.S.S.S.S.A.S.A.A.S.S.S.G.h.A.h.h.A.A.h.A.A.A.A.l.G.A.h.Z.A.Z.Z.Z.Z.e.A.Z.e.b.Z.n.h.Z.Z.b.Z.n.n.F.Z.n.Z.S.Z.Z.F.Z.Z.F.Z.F.Z.F.Z.Z.Z.Z.n.Z.F.Z.Z.F.F.Z.F.F.F.Y.F.F.S.F.K.F.].Y.F.F.K.].R.!.F.].].].].K.].^.].!.!.!.~.].].[.].].].~.].].].[.].K.].].].Q.].K.].P.Y.K.F.K.F.Z.F.Z.n.F.Z.Z.n.Z.F.Z.Z.A.F.Z.F.F.F.D.F.F.Z.F.F.K.F.F.F.F.K.F.F.K.F.F.F.G.F.F.F.S.F.F.F.F.K.Z.F.F.F.K.Z.Z.F.F.F.H.L.L.L.U.I.T.T.T.U.U.T.U.U.U.U.R.Y.T.T.T.T.~.~.T././.T.!.~./././.^.(.^.(.`.{.|._.|.|.dX'. X X XdXdXdX'.'.].'.'.).].].'.'.].'.].].].].(.'.].].].].].].'.^.].].].].].'.].].].'.].].].].].].].'.].'.].|.].].].].'.].].].].].].].].].K.].].].].].Q.K.].].~.].Q.Q.].].].K.].^.].].].^.].].].~.].T.].!.]._.!.Q.].K.].K.].Q.].].K.L.U.L.].].K.U.L.K.Q.].L.P.].F.].].F.H.Y.].F.Q.F.K.].K.F.F.].L.L.F.].L.P.K.].Y.Q.P.F.].F.F.].P.Y.K.Q.K.K.Y.].!.!.~.(.(.(.^.(.(._.|./.(.^.(.(.(./.(.(.(.`.(.^.^.(.(.(.(.~.(././.~./././././.!.~.~.~.~.~.~.~.~.!./.~.~.~.~.~.~.~.T.~.T.T.T.T.T.U.T.P.P.P.L.L.L.H.H.S.S.",
+"@.m N m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N N N N N B N N N N B N V B N B N N C N B C C B C C C C C C C C c ' ! n y : r r r r r r r r r r r r r r r r y * y : * r r e r r r y * r r 0 r r r r r r r r r r r r r : e 0 e { LXLXLXPXf { IXLXLXLXLXLXc o sXLXLXLX% $ n LXLXLXsX- c LXLXLXf $   IXLXLXIX  o , o & % ; 0 ; 0 r r r r r q r r r r r r r r r r r r r r r * r r r r r r r r r r r r r r r r r r r r r y r : y r : ; & o o   dXdXnXxXcXzXJXxXxXxXxXnXnXxXnXxXcXnXcXnXnXcXnXcXcXcXdXcXdX.X.X.XzX.X.XdXdXdXzXdXdXzXdXdXdX.X.X X.X X.X X.X X.X.X|..X.X X|.'.|.|._.|._.}.^.(.(.(.|.(.|.(.|.(.(./.(.^./././././././.~.!.~.~.T.~.T.T.T.T.P.U.P.P.P.P.P.P.L.L.L.L.H.L.H.K.G.G.A.A.S.D.F.Z.G.Z.G.G.D.G.A.l.A.h.A.G.A.A.j.Z.j.g.j.Z.h.j.h.h.j.j.j.Z.a.z.l.l.G.e.Z.Z.h.h.h.l.h.j.Z.h.h.G.j.g.g.z.k.e.j.j.j.j.h.A.h.h.j.j.j.f.j.j.Z.g.f.j.g.j.s.j.f.f.k.a.s.j.e.j.j.d.j.a.s.e.s.f.s.j.j.s.s.j.a.j.j.e.f.f.s.j.j.j.a.j.a.j.j.f.d.f.d.d.s.a.a.a.e.e.z.j.a.g.A.j.a.l.G.A.h.h.g.A.h.Z.h.h.h.A.A.h.Z.Z.g.j.A.A.A.S.h.S.G.H.L.S.F.L.H.L.L.L.K.U.L.L.L.L.K.H.L.H.A.A.A.A.A.A.A.h.h.h.A.A.h.A.A.A.A.A.A.A.A.A.A.A.A.Z.H.h.J.h.K.H.K.H.L.L.L.L.H.G.U.F.K.H.K.Y.K.F.U.K.K.K.K.L.K.I.K.L.K.H.R.F.G.G.H.Z.K.L.L.D.H.K.G.A.K.K.G.G.G.Z.H.l.S.H.Z.D.L.G.G.Z.A.G.S.Z.H.L.L.F.U.T.K.U.!.T.~.U.!.!.T.~.T.].Q./.!.!.!.!.!.!.].!.!.(.!.(.].(.~.{.^.!.~.].~.~.!.!.Y.^.Q.T.T.Y.T.L.T.L.K.(.U.~.Y.T.U.].].(.L.Y.Y.!.].Y.!.K.K.Y.T.Y.!.U.!././.(.(./.^./.{.(././././.~.T.T.T.Y.U.L.U.H.H.H.H.H.H.G.S.G.G.H.A.A.A.A.A.A.A.A.A.A.S.H.g.G.A.A.A.A.A.A.A.l.l.A.A.A.h.A.Z.h.A.j.Z.A.A.z.A.A.S.S.F.H.D.S.A.l.H.A.H.S.L.F.H.H.K.K.K.K.K.K.K.K.K.L.K.H.K.K.K.L.K.Y.~.K.K.K.L.!.K.!.L.!.!.!.Y.!.!.!.!.(.~.~.(.~.~.'.].(.].(.]._.].].^.^.(.Y.!.^.^.~.!.(.~._.]./.~.~.!.].!.~.].].Y.!.K.K.T.K.K.K.Y.L.G.H.K.F.K.Y.D.U.F.L.K.L.U.K.L.L.I.Y.K.U.K.K.I.K.K.R.K.K.Y.U.U.Y.K.Y.Y.K.K.K.Y.P.P.K.K.K.K.K.L.K.H.F.L.K.U.Y.Y.T.U.U.U.T.U.T.U.U.U.I.Y.U.T.T.T.U.~.T./.T.~.~././././.(.(.(.(.`._.|. X|.|..X'..XdX@X'..X'.zX'.'.JX'.'.'.'.'.fX'.JXxX'.zXxXJX'.'.'.dX_.'.'.'.].'..X|.'.'.hX'.'.'.'.'.'.'.dXdX.X'.'.dX'.'. X.X'.'.'.].'.'.'.|.]._._.^.(.!./.].~.~.!.!.].^.!.!.~.(.~.(.(.{.(.(.].|.~.].]..X{.(..X_.]..X'._.]. X_.]._.!.~.E.(.!.T.].(.~.!.!.Q.~.K.].!.Y.!.].!.P.!.!.!.!.K.].!.P.^.!.^.P.!.Y.!.K.!.!.!.^.Y.!.].Y.!.Y.!.[.~.Y.~.P.].!.!.!.]./.~.E.R.!.].(./.(.(.(.(.(.|.(._.(.(./.(.^.(.(.(.^.`.`.`.(.(./.~.(.~.(./././.~.!././.~.~.~.~.~.!.!.~.~.(.L.~.T.~.~.~.T.~.T.~.T.T.T.T.T.T.U.T.P.A.L.L.L.S.H.S.S.",
+"m m m N m N m m m m m m m m m m m m m m m m m m m m m m m m N m M M M N M M M M N N N N B B B B N V B B B B C B B C B C C C C Z C C G C S ] / S > ; ; : r ; r r r r r r r q r r r r r r r r r r r r r r r e r 0 r r : 0 y : r r r r r r r r r r ; y ; ; HXLXLXLXLXgXIXLXLXLXLXHXo $ pXLXLXLXIXsXIXPXLXLXsX$ n LXLXLXc % $ IXLXLXPXf n o $ % % % * r r r r * r r e r r r r r r r r r r r e r r r r r r r r r r r r r : r r r r r r r r 0 r r r r r r y : * $ $   $ .XcXdXfXxXxXdXxXxXxXcXxXxXxXxXxXnXnXxXnXnXxXnXvXcXdXdXzXzXzXzXzX.XdXdXdXdXdXdX.XzX'..X.X.X.X'.'. X X.X|..X|..X.X.X|.|.|.|._._._.`.`.`.`.`.(.(.(.(.(.(.(.(.(.(.(.(./.(.(./.[./././.~.~.~.[.U.T.T.U.T.T.U.U.L.U.U.L.U.L.L.L.A.U.L.S.L.S.S.L.S.L.L.L.H.S.U.H.L.D.G.H.H.H.G.H.G.D.A.A.A.A.A.j.h.h.h.l.h.l.S.h.h.S.A.A.A.A.A.A.h.A.G.z.G.l.g.A.A.g.Z.h.h.h.l.g.l.l.l.h.h.h.g.h.k.h.h.h.h.h.h.l.l.h.g.z.g.g.z.k.k.k.k.f.k.f.k.f.k.k.f.f.f.f.z.k.d.k.k.i.k.a.k.k.g.a.k.f.f.z.f.g.g.g.g.g.f.d.k.k.k.k.f.f.h.f.k.f.k.h.z.h.h.h.h.h.A.h.l.G.A.h.Z.A.h.A.h.A.A.Z.h.A.h.h.A.A.A.W.A.G.W.H.H.H.H.H.L.L.H.L.H.L.L.L.L.S.L.S.L.Z.H.A.h.A.A.A.A.h.h.h.h.H.A.A.A.A.h.A.A.A.A.A.A.A.A.G.H.A.S.L.L.L.L.Y.U.T.Y.P.^.L.P.T.P.P.T.P.P.P.P.Y.U.I.T.T.T.T.U.L.U.P.U.U.L.L.L.L.L.L.L.U.L.L.L.L.L.L.L.L.L.L.H.L.H.L.L.L.U.D.L.S.L.L.L.L.U.U.U.T.U.~.~.T.~.T././././.(.(././.(.(./.(.(.(.(.`.(.(.(.(.(.(.`.`._._.`.(.(.(.(.).(./././././././.!./.~./././.(.~./.(.~.~.~.~./.~.~.~.~.~./.~.~.~.~.~.!./././.(.(.(.{.^.`.`.^.(.(.^./.~.~.~.T.T.T.L.L.H.H.H.H.H.H.H.D.S.H.G.S.G.S.S.A.S.G.S.S.G.G.A.A.A.H.G.A.A.A.A.h.J.S.A.S.S.S.S.S.S.S.D.A.H.H.H.H.S.L.S.H.H.S.H.S.S.Y.S.L.L.L.L.L.Y.U.U.T.L.U.U.U.P.P.Y.U.U.P.L.U.Y.Y.Y.T.T.T.T.~.T.~.~.~./././././././.(.(.(.(.(.^.|.|.(.(.(._.|._._.(.(.(.(.^.(.`.(.^.`.(.(.(.(.(.(./.(.~././.~./.T./.~.T.T.T.U.U.U.U.U.P.P.T.P.P.P.T.T.U.Y.U.P.T.U.T.T.T.I.I.I.L.~.T.~.T.~.~.T.T.~.U.~.Y.T.T.T.T.~.T.T.(.T.T.T.T.T.T.U.U.U.T.U.T.U.T.T.U.T.T.U.I.Y.I.I.T.T.T.T.T.~.T.~.T.~.~.~./.^./././.{.(.(.`.|.|._.|.`.|.'..X.X.X'..XzXdXdXdX.XdXdXzXzXzXzXcXzXnXcXdXzXnXdXdXdXdX X.X.X.X.X|..X'..X.X'. X@XdX'.'.dX.X.X'.@XzX.X.X.X@X.X.X.X'. X.X X|. X.X_.|.|._._.{.^.(.^.(.(.(.(.(.(.(.^._.(._._._.^.^.`.^.{.{._.(.|._.|.{. X X_.(.|.`._.(.}.^.|.^.^.^.(.(.(.(.(./.{.(./././././.{.^.^.~.(././.(.(./././././.~./././.~.^.^./.(.(././././.[.~.T.^.(.^.~.(././.[.^./././././.~././././.^.(.`.|.^.`.`.^.(.^.(.(.(.(.^.(.(.`.(._.(.(././.~.[.(.~.~.~.[.~.~.~.T.~.T.~.R.Y./.I.T.~.T.T.~.~.T.~.~.~.~.Y.T.T.T.T.T.U.U.U.U.L.S.S.H.H.S.S.",
+"m m m m m m N m m m m m m m m m m m m m m m m m m m m m m N m m M M M N V A M M B B N B N B B B B B N B B B B B B A V u C C C C Z C V C u u c ! y 0 : : r 0 r r r r r 0 r e r r r r r 0 r r r r r r r r r r r r r r * t y * r r r r r 0 r r r r y r * ; w IXLXLXLXLXLXLXLXLXLXgX- o z LXLXLXLXLXLXLXLXLX{   c LXLXLXf o o pXLXLXLXPXsXo $ % : * r r r r r 0 : r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r : : * * & o   % JXdXdXdXxXcXnXxXxXvXxXcXxXxXnXnXnXxXnXcXcXxXxXcXcXcXdXzXvXzXzXxX.X.X.XdXdX.XzX.X.XzX@XzX.X.X X X.X.X|..X.X.X.X.X.X.X|.|.|.|.|._.`.(.(.^.(.(.(.(./.(.(.(.(././././.(.~./././././.T.~.T.T.T.T.T.T.T.U.U.U.U.U.U.U.U.L.S.L.L.U.L.G.L.L.L.L.L.L.L.L.L.U.U.D.U.H.L.H.H.G.G.G.H.G.G.H.A.A.A.A.h.h.h.h.S.h.z.z.S.A.A.A.A.A.A.W.A.A.A.J.h.g.A.G.j.j.G.h.h.h.h.l.h.l.l.h.h.h.g.h.g.z.z.h.h.h.h.l.h.h.l.g.A.h.g.g.k.k.k.k.f.f.z.i.k.a.z.a.f.a.f.i.k.k.d.f.k.k.k.i.z.k.z.k.k.f.k.g.d.k.k.g.f.g.f.f.f.d.k.f.z.f.f.k.j.l.g.g.h.h.l.h.Z.h.A.h.Z.A.A.h.A.A.A.h.A.h.A.h.A.Z.A.A.A.A.h.W.A.H.h.S.H.H.H.L.S.L.L.L.L.L.H.U.L.S.L.H.D.H.A.S.A.h.g.g.A.A.h.h.h.A.A.A.A.h.Z.A.A.A.A.A.A.G.A.H.H.H.H.L.L.U.L.L.L.T.P.P.Y.P.P.P.T.P.P.P.P.P.P.I.Y.T.U.T.U.T.I.U.L.L.L.L.L.L.U.L.Y.I.L.L.I.U.L.L.L.S.L.L.H.H.P.L.L.H.L.L.L.L.L.L.L.L.U.T.U.T.T.T.~.T.~.~.(.!././.~.!./.(././.(.(.(.(.(.(.(.(.(.(.(.`.(.(.(.`.^.^.`.(.(.(.`.!./././././.[./././././.{./.~.(.~.(./././.~.T././.!.~./.~.~./.~.!.~./.~././.(.(._._.^.`.^.^.(.(.(.(.(.~.^.~.~.I.T.U.L.L.L.L.H.L.H.L.H.H.H.H.S.S.S.S.S.S.S.G.H.A.A.G.A.A.A.A.S.A.A.A.h.A.H.S.S.S.S.S.G.S.H.H.H.H.H.H.S.S.L.D.H.U.S.L.S.L.S.L.S.K.Y.L.U.P.P.P.L.I.L.T.L.U.T.U.U.P.U.P.P.Y.T.T.T.T.T.~.~.~.~./.~./././.(./.(./.(.(.(.(.).^.{.(.|.|.^._._.(._.(._.(._.`.(.(.(.(._.(.(.(.(.(.(.(.^./.^.~././.T.T.T.T.U.T.T.U.T.U.P.P.P.U.U.U.P.T.T.U.U.T.U.U.U.T.U.T.T.I.~.R.~.T.~.T.T.~.T.T.T.U.Y.~.T.~.T.~.~.T.T.T.T.T.T.T.T.U.U.T.U.T.U.T.U.T.T.T.T.U.T.I.I.T.T.I.T.T.T.T.T.T.T.~.T.~.~././././.(.(.(./.`.|.|.|.@X.X.X.X.XdX.X'.@XdX.X.XdXdXdXdXdXzXzXzXzXdXzXzXzXdXdXdXdX.X.X.X.X.X|..X'.|..X.X.X.X'..X.X.X.XdXzXdXzX.XxX.XxXfX'..X|. X@X|.'.|.|.`.|.|.|._.|.|.(.(.`.(.(.(.(.(.(.(.(.(.(._._._._.`.(.(._.`.{.(._._._.|.|.{.'. X|._.`.}.|.^.{.`.(.(.(.(.(.(.(.^./.(./././.(./.E./.^.[.(.^.(.(.(.(./././.^././././.[.(./././.(.(.(././.~.(.~.(.~.^.(.~./././.~.T./.~.~./.~./././.(.(.(.(.(.[.(.(.`.(.(.{.E./.^.(.(.(.^.(.(.[.(./././.(.T.~.~.~.~.~.T.T.~.~.~.T./.~.~.~.~.~.~.T.T.~.~.~.T.~.R.Y.T.T.T.T.T.T.Y.L.L.L.U.H.H.G.G.S.",
+"m m N m m m m m N N m N m m m m m m = m m m m m m m m m m N m m M M M N N N C M N B B N B N B B C N B C B B B B B A C C B Z C F C C C A u u u u u r : : r r r r r r r e r r r r r r r e r r 0 : r r r r r r r r r r r r r r r r r r r e r r r r ; r e ; $ - pXLXLXLXLXLXLXPXLXLXLXo o sXLXLXLXPXb gXLXLXsX$ n LXLXLXc $ o w IXLXLXLXBXo $ % % > * r r r : 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r e * > * % $ o   u JX@XdXfXdXdXdXcXcXvXcXdXcXnXxXnXxXxXxXcXxXnXxXcXcXcXdXcXdXdXdXzXzX.XdXzX.XzX.XzXzXzX.X.X.X.X.X.X X`. X|..X|..X.X.X'.|.|.|._._.(.|.`.^.(.(.(.(./.(.(././././././././././././.!.~.~.~.~.T.T.T.T.U.U.T.L.T.U.U.L.U.P.P.L.S.L.S.L.L.D.L.S.L.S.S.L.A.P.S.U.U.H.L.S.L.L.H.L.H.H.H.S.A.A.A.A.A.G.A.A.l.h.l.A.A.A.z.A.h.A.A.A.h.A.A.A.z.G.g.A.h.Z.A.A.A.A.h.l.G.h.h.l.h.h.z.z.k.h.g.g.h.g.h.h.h.h.h.h.D.k.g.k.g.z.k.k.f.a.f.i.f.i.a.a.k.a.a.k.i.z.i.z.i.a.k.i.f.g.g.a.f.f.f.k.f.f.f.f.g.g.g.d.i.k.k.k.f.a.f.j.h.j.g.h.h.h.l.g.S.g.A.A.h.A.A.A.A.A.A.A.G.A.h.Z.A.A.h.h.h.A.A.A.A.A.A.H.H.S.G.G.H.H.S.L.L.H.L.H.S.S.S.S.H.D.S.A.A.A.A.h.G.g.A.A.A.A.A.A.A.A.A.A.A.h.A.A.A.A.A.S.H.H.H.H.L.I.U.U.U.T.T.P.T.P.T.U.P.T.P.P.P.Y.Y.P.Y.U.U.T.U.U.T.U.U.L.U.U.U.L.U.L.L.L.L.K.I.I.U.L.L.L.K.Y.L.L.H.H.H.L.H.L.L.L.L.L.L.L.L.I.U.I.U.T.~.T.T.~.~.~./././.(././././.^.(.{.(.(.(.(.(.(.(.(.(.].(.(.^.^.^.(.(.{.(.(.(.(.(./.(.(./././././././.(./.(.(.~./.(./.~./././.!./.~.~.~.~.~.~.~.~.!./.(./.(._.(.(.(.`.`.`.(.{.).(.(.^.(./.~.T.T.T.L.L.L.L.L.S.U.D.L.L.S.H.S.S.S.S.S.H.G.S.H.Z.H.A.H.A.A.A.A.A.H.A.H.z.A.G.H.G.A.H.G.H.S.H.H.H.H.H.L.D.S.L.H.U.L.L.U.L.S.L.U.U.L.U.P.P.P.T.U.U.T.U.T.U.T.U.U.U.L.Y.P.T.P.T.T.T.T.T.T.~.~././././././.(./.(.(.[.^.^.{.[.{.{.(.(.(.|._.|.|.(.(.(.^.^.`.(.`.(.]._.(.(.(.(.(.(././././.[.T.~.~.[.T.T.T.U.T.U.U.P.P.P.P.P.Y.T.P.T.P.U.P.U.T.U.T.T.U.T.T.Y.R.Y.T.T.~.~.T.T.T.~.T.~.T.~.T.~.T.T.~.~.~.T.T.T.T.T.U.T.T.U.T.T.T.T.T.U.XXT.U.T.I.T.I.T.T.T.T.T.~.T.T.T.T.~.~.~./././.(.(.^.|.`.`._.|.|..X X.X.X'..X.XdX'.xX XzX.XzXzXzXzXdXxXzXcXdXzXzXzXzXdX.XzXzX.X.X.X.X'.|. X.X|..X'..X.X.X.X XdX'.dX.X.X'.xXzX.XdX'..X.X X|.|.|..X|.`.`.`.|.{._.^.(.(.(._.(./.(.(.(.`.^._._._._.(.(.^. X`..X`.{.|.(._.dX|.|.|.|.`.(..X(.`.(.`._.(.(.(.(.(.`.^.(.(.^.(./.(./.!.(./.(.(.(.^.(.(.(.(./././.^.~.E.(././.!./././././.[.!././.(./././.[.^././.(./.~.~.~./.~.~.~./././././.(.[.^.`.`.`.(.(.(.(.~.~.(.^.(.(.(.(.|.^.^./.~./.[.T.~.~.~.~.~.~.~.~.~.T.T.^.T.~.Y.~.~.T.~.T.T.~.~.T.T.~.~.T.~.T.T.T.T.U.U.T.L.L.L.K.H.G.S.S.",
+"m m m m m N m m N m m m m m m m m m m m m m m m N m N m m N B N N N M N V N m N N B N B N B B B B V C N C B C C C B C C C C C C C F C Z S t c u u e r r ; r r r r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r r r r r ; 0 * : % $ $ w n f c   # sXLXaX  o o - f c o $ o o $ $   $ o $ o $ $ $ o - f c c o $ % % % : 0 r r r r r 0 r r r r r r r r r r r r 0 r r r r r 0 e r r r r r r r r r r r r e r r r r : r r r : r : * % o     c.zXdXdXdXdX@XvXzXcXzXcXcXcXxXnXxXnXnXxXxXnXxXxXcXdXcXcXdXcXcXdXzX.XzX@XzXzX.XzX.XzX'.zXzX'..X.X.X`..X'. X|. X|.|.|.|.`._.|._.|._.(.|.(.(.(.(.!./.(.(././.(./.~.^./././././.~./.~.T.T.T.T.T.T.T.Y.U.R.T.U.U.U.K.U.P.L.L.L.L.L.L.S.L.S.L.S.L.L.D.D.L.Y.D.U.U.L.L.L.H.H.L.G.H.H.H.H.S.A.A.A.g.g.h.l.A.A.l.g.A.h.A.A.A.A.G.A.A.A.G.G.h.G.h.G.g.A.h.g.G.l.A.h.h.h.l.h.h.h.z.h.k.h.j.g.g.g.g.l.l.k.l.g.k.h.k.k.i.f.f.a.a.a.a.a.k.a.a.a.k.a.a.z.d.i.a.z.a.a.k.a.a.a.g.f.k.k.i.f.f.f.f.g.f.g.f.f.f.f.i.z.a.z.j.k.f.z.z.h.h.h.h.h.A.h.A.A.A.h.A.h.A.A.h.h.h.h.h.h.A.A.A.A.A.A.A.A.A.A.A.S.S.G.S.H.H.H.H.H.L.H.L.L.L.L.H.H.A.A.H.A.A.A.A.g.A.g.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.W.G.H.H.L.L.L.U.U.U.U.T.T.T.U.T.T.Y.P.P.T.Y.P.P.Y.U.T.U.Y.T.T.I.U.T.Y.P.L.L.L.U.U.R.Y.R.I.U.L.U.L.L.I.L.L.L.L.T.L.T.H.U.L.L.L.L.L.L.L.I.I.I.T.T.T.T.T.~.T.~./././././././.(.(.(.{.^.{.(.(.(.(.(.(.`.^.(.(.(.`.(.(.(.(.(.(.{.].(./././.(./.^./././././././.!.).(./././.~.(./././.!./././.!.~.!./././././.(.(.(._.(.`.^.^.(.|.{.(.(.{.(.)././.~.T.T.T.Y.U.U.U.L.K.L.H.H.H.H.H.H.S.H.S.H.S.G.G.G.S.G.A.G.G.A.S.h.A.H.H.H.G.G.H.S.H.H.H.H.H.H.H.L.S.H.U.L.L.L.S.K.S.L.L.S.L.L.L.L.L.U.U.P.P.P.Y.T.U.T.U.T.U.U.P.P.U.L.P.P.P.P.T.T.T.T.T.~.T.[././././././.(./.[.(.(.(.^._.{.(.{.(.|./.|.(.^.|._._.`.`.(.(.(.(.(.(.(.(.).!.(./././.[.~./.~.T.T.T.T.T.T.T.U.T.T.P.T.P.P.P.P.T.T.T.T.T.P.T.U.T.I.U.T.I.T.Y.!.~.Y.~.T.T.~.T.~.T.T.T.T.~.~.T.~.~.T.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.XXT.T.T.T.T.T.Y.T.I.T.T.I.T.T.T.T.~.~.~.!./././.(.(.(.(.(.|._.|.|.|.|..X.X.X.X.X'..X@XdX'.zX.X.XdXdXzXxXzXzXzXzXzXzX@XdXzXzXzX'..X.X.X.X.X|.|..X X.X.X.X.XzX@X.X.X.XzX.X.X.X.X'.zX.X.XdX.X.X.X`.`.`.`.{.`.{.(.|.`.^.`.(.).(.(.(.(.(.(.(.(.(._.(._._.`.`.^._.`.{.|.'. X_._. X X|.`.`.`.`.`.|.^._.(.`.(.(.(.`.^./.[.(.(./.(./././.^.(.(.(.(.(.(.(.(.(.(./.(.^.[.~././././././.(.[.[./././.(./.~.(.!.~.[.(./././.~./.(.~.~./.~.~././.(./.^.(.^.`.(.^.`.(.(.{.^.^.(.(.(.(.(.(.(./././.~.~.~.T.~.~.~.E.XX~.~.~.~.~.~.~.R.~.R.T.~.T.~.~.T.T.~.~.~.T.~.T.T.~.T.U.T.U.U.L.Y.S.A.H.H.S.S.",
+"m m @.m m m m m m m m m m m m m N m m m m m m m M m M N N N N N N m N V N V N N B V B B B B B B B B C N C C C B F B C C C D C C Z C C Z A y y u y : r r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r r e r r : y r r r r q r : r r r r r * 0 * % % $ o $ $ o o o o - - o $ $ $ $ $ o o $ o o $   $ o $ $ $ $ $ $ & & $ , $ o & % % : : : r r 0 r : r r r r r r r r r r r r r r 0 * y r r r r r r r r r r e r r r y r r r r r r r r r * r r * % o     !.cXzXzXdXdXzXcXcXzXcXzXxXxXcXcXcXcXxXxXxXxXcXcXdXcXcXdXdXmXdXdXzXvX.XdXzX.XxX.X'.zX.X.X.X.XdX'. X'.|. X|.'.|.|.|.|.|.|._.|.|._.|._.(.(._.(.(.(.(.(.(.E.^./././.!.(./.~./.~.~.T.T./.T.T.T.T.T.T.L.T.Y.T.P.Y.L.U.P.P.L.L.L.S.H.S.G.H.H.H.L.L.S.P.L.L.L.L.L.L.L.L.L.H.H.H.H.H.H.H.S.A.S.A.H.A.h.h.l.h.j.A.A.A.A.A.A.A.A.h.A.A.l.A.A.A.A.h.A.j.G.A.A.Z.j.h.A.A.l.l.l.h.h.h.h.h.k.z.g.g.f.a.k.g.k.k.k.k.k.k.f.f.a.k.a.a.a.a.i.a.a.a.a.a.a.a.a.a.a.d.a.a.a.f.f.g.g.a.k.k.k.f.a.k.f.k.f.f.k.f.f.f.z.k.f.f.k.f.g.g.h.h.g.l.l.l.g.A.h.g.A.h.h.A.Z.A.A.A.j.h.h.A.h.A.h.A.h.A.j.A.A.A.A.A.A.S.G.H.H.H.J.G.H.H.H.S.L.H.H.G.S.H.A.A.G.A.A.A.h.A.h.A.A.A.A.A.A.A.h.A.G.A.A.A.A.H.G.H.H.H.L.L.P.P.P.P.Y.U.T.T.T.T.T.T.Y.U.P.U.T.T.U.U.T.U.U.U.T.Y.P.T.U.T.U.Y.L.U.U.U.U.U.U.I.L.Y.U.J.I.I.L.L.L.P.L.P.P.P.P.T.L.L.L.L.I.U.U.U.T.Y.T.T.T.T.T.~.~.~.~./.~.(././.^.^.(.(.(.(.(.(.(.(.(.`.(.(.`.(.(.(.(.(.(.(.^.(.(.(.(.(.(./././.(.(./.).(./.(.(.[.(.(.(.(.(.!.(././././.T.(././.~.~.~.~./././.^.^.^.`.`._._.`.(._._.^.{.(.(.(././.!.~.~.T.T.T.T.U.U.L.L.L.L.L.L.G.H.D.G.H.H.H.H.K.G.H.H.A.H.A.H.S.S.S.S.A.G.H.H.A.L.D.H.L.A.S.L.L.L.S.L.L.L.L.S.H.H.L.L.L.L.S.S.L.U.L.L.P.P.P.P.U.T.U.T.U.T.T.U.Y.P.P.P.P.P.P.T.T.U.T.T.I.~.~.~.~././././.{./.(.^.(.(./.(.(.{.|.{.|.`.^.|.`._.^.(.|.(.|.(.(.(.(.(.(._.(./.).(.(.(.(.~./.~.~.~.T.T.T.T.T.T.T.T.U.T.U.T.T.U.U.U.T.T.U.T.U.T.U.U.T.T.T.U.T.U.~.Y.~.T.~.T.~.T.~.T.~.~.T.~.T.~.~.~.~.~.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.T.T.T.~.T.U.T.I.T.T.T.T.T.T.T.~.R.~./.~./././.^.(.(.`.`._.`.|.|..X.X'..X'.dX.X.X.X.XzXdXdXdXdXdXdXdXzXzXzXzXzXzXzXzXzX'.zX.XdX.X.X.X.X|.|..X.X X.X.X.X.X.X.XdX@XdX.X.X'..XzX@X'.dX|..X X.X|.|.|.|.{._._.|._.|.^.^.(.(.(.(.(.(.(.(.(.{.(._.(.(.`._._.(.^.(.`.|._.|.|. X|._.|.|.|.{.|._._._.|._._._.^.`.(.(.(.(.(.(.(.(.(.E.(.^.(.(.(.^.|.`.(.(.(.^.(.(.E.(.(.!.[.[././.~.^././././././././.(.^.^./././.[./.(./.~.!./.~.~.~./././.^.(.`.[.`.`.`.^.(./.(./././.(.(.(.(.(.(./././.~.~.~.[.T.~.~.XX~.~.~.~.T.~.T.T.~.~.T.~.T.~.T.T.~.T.T.T.R.~.T.T.~.T.T.T.T.T.P.I.L.U.H.H.H.A.A.",
+"m m m m m m m m m m m N m m M m m m m N m m m m M m M M N N V N m V N N N N B B N V B N B B B B B C N C C N B B B C C A C C C Z Z C Z C D y : e y y r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r : 0 : r r r r r * y r r r r r r * = % % $ o $ $ $ o o o o o $ $ $ $ $ $ $ o $ $ $ $ $ $ $ % o $ & $ % & - $ $ $ & % % * 0 : r r r r : r r r r r r r r r r r r r : e r r r r r r r : r r r r r r r r * r r r r r r r r r : : * % $     $ dXcX.XzXvXdXcXdXzXzXzXcXxXcXcXzXcXdX@XxXxXxXxXxXvXcXdXcXcXdXcXcX.XdXzXdXzX'.xX.X.XdX.XzX.X.X X'.|.|.|.|.|.|.|.|.`.|.`.|.|._.(.`.}.[.^.|.^.`.(.(./.(.^.(././.(././.!.~.!.~.~.~.T.T.T.T.T.T.T.T.T.T.U.U.T.T.P.P.U.L.L.L.U.L.H.L.H.H.D.L.G.S.L.L.Z.L.L.U.S.L.L.L.A.L.L.L.L.H.S.H.H.S.S.S.A.z.S.A.h.A.g.A.G.Z.h.h.A.A.A.A.A.A.A.A.A.g.A.A.G.j.A.A.j.h.A.h.G.h.A.l.A.l.h.h.h.h.z.g.g.g.g.z.j.g.k.k.g.k.g.f.f.f.f.a.a.f.a.a.a.a.a.a.a.a.a.a.a.i.a.a.a.a.f.a.a.a.a.a.g.k.f.g.k.f.f.k.k.k.f.g.f.f.d.i.z.z.k.h.f.a.x.g.l.h.h.l.l.S.j.A.A.Z.A.A.A.h.h.A.h.W.h.G.j.h.h.A.A.A.A.A.A.A.A.A.A.A.G.S.G.H.H.G.G.H.H.H.S.H.H.S.G.S.A.H.A.A.A.A.A.A.A.S.A.l.A.A.A.W.A.A.A.A.A.A.A.A.H.H.H.G.L.L.L.P.P.T.P.U.T.T.T.Y.Y.T.T.T.T.Y.T.P.T.T.U.T.U.T.U.Y.T.Y.T.Y.U.P.U.U.I.T.U.T.I.Y.R.L.U.U.K.L.L.L.I.P.L.P.L.L.L.L.H.L.U.U.U.U.Y.U.T.T.T.T.Y.T.~.~.T.!.~.~.!.!.E./.^.^.^.[.(.(._.(.(.(.(.(.(.(.(.^.(.(._.(.(.(.(.{.[.(.(.(.(./.(.(.(.(./.^.^./.^./.(./.(.(.(.(.(.(.(.(./././.(././.!.^.^.~./.~././.(.).(.^.(._._._.`.|.{._.^.`.(.(.(.).^.~./.~.T.~.T.T.T.P.U.L.L.S.S.D.H.H.G.H.H.H.H.H.H.S.H.h.H.H.H.S.H.S.G.H.H.H.H.H.S.H.U.S.L.U.A.L.S.L.L.S.L.U.S.L.L.H.L.U.S.U.L.L.L.L.L.U.U.P.P.U.T.T.T.T.U.U.U.T.P.P.P.T.P.P.P.U.T.T.T.T.I.~.~.~./././.^./.(.(.^./.(.(.(.^.(.(.(.(./.|.^._.^.|.(.(._.(.(.(.(.(.(.(.(.(.(.(.(./././.(.~.~.~.T.~.~.T.T.T.T.T.T.T.T.T.U.P.T.T.U.T.U.T.U.T.U.T.Y.U.T.U.T.T.Y.~.L.~.~.T.~.T.~.T.~.T.~.~.~.T.^.T.~.~.T.T.~.~.T.[.~.T.T.T.~.T.~.T.~.~.E.T.T.T.U.T.~.U.T.T.T.T.T.T.T.~.T.T.~.~.~./././././.(.(.^.(.|.`.|.|.|.'..X.X X.X.X.X.XdX@XdX'..XdXdX.X.XzXzXzXzXzXzXzXdX.XzXdX@X.X.X.X'..X.X X|.'..X.X|..X.X.X.X.X.X.X.X.X.X'.zXdX X|..X@X`.`. X X X_.|.|._._._.`.(.(.(.(.(.(.(.(.(.(.(.(.(._._.|.^.^.{.{._.`.`.{.|.{.{._.{.|.|.{. X|.|.|.|.|._.`.(.^.`.(.(.(.(.(.(.].(.(.(.(.^.(.(.[.(.(.(./.(.(.`.(.(.^.{.^.~.^././././.[././././.[.(./././.[.(./.(./.^.~.!.~.(.~.~.~.~./.~./././.[.(.^.(.(.^.(.(./.(.!././.(.^.(./.(.(././.~.~.~.~.T.T.~.~.~.T.T.(.T.~.~.T.T.T.T.T.T.T.T.T.T.T.T.~./.T.~.U.~.T.~.T.T.T.P.T.P.L.L.H.U.H.H.H.S.",
+"m m m m m N m m m N m M M m m m m m m m m m m m m M M N M N N V V M M N N V N N B m N B N B B B V B N B C C N C B C C C C C C C Z C Z C Z u 0 ; e e r r r r 0 r r r r r r r r r r r r r r r r r r r r r r y r r r r r r r r r r r r r r r r r r ; r y * ; * : - , $ $ $ o $ , o $ $ $ $ - % $ & $ , $ $ $ $ , $ $ - $ $ % % % % $ % & $ & % % ; 0 r r r e 0 r r r r r r : 0 r r r r r r r r r r r r r r e 0 r r r r r r r r r r r r * y y r r r : : * & o     ' @XdXdXzXcXzXzXzXvXvXdXcXdXcXdXcXxXxXxXxXxXcXdX.XcXvXdXdXdXcXcXdXzXzXdXxXxX@X.XzXdX.X@X.X.X.X.X.X|.|.|.|.{.|.|.|.|.|.|.|.|.{.(.`.`.(.`.^.(.(.!.(.(./.^./.~.~.^.~.~.~.~.~.~.R.~.~.T.T.T.T.T.T.T.U.Y.U.U.U.P.U.P.Y.L.U.D.S.L.L.H.H.H.H.H.H.L.D.L.F.S.L.P.P.L.L.L.L.L.S.S.L.H.H.H.H.A.S.A.A.A.A.A.A.A.A.g.h.A.A.A.A.A.A.A.A.A.A.A.A.G.j.G.j.A.j.h.A.j.A.A.z.A.h.l.l.l.h.h.h.h.a.a.g.f.f.g.a.a.g.k.k.i.z.i.f.a.a.a.a.a.i.i.i.u.a.a.a.a.a.s.i.i.a.a.a.a.a.f.a.f.a.g.f.z.a.k.k.f.f.f.k.k.f.f.i.k.f.f.i.f.f.k.f.h.j.l.z.h.z.l.l.h.G.A.h.h.h.A.A.h.Z.A.A.Z.h.A.h.h.h.h.A.A.h.j.S.A.A.A.A.A.H.G.A.A.H.G.G.H.S.S.S.H.S.H.D.S.S.H.A.A.A.A.A.h.A.A.A.A.A.A.A.h.A.A.A.A.h.H.A.A.H.H.H.H.L.L.U.Y.Y.T.T.T.T.T.T.T.~.T.T.T.T.U.T.T.P.T.U.U.U.T.U.T.U.P.T.P.T.T.P.I.T.I.T.U.Y.Y.L.U.L.L.U.K.R.U.L.P.P.P.U.U.L.L.P.U.U.U.U.U.T.T.T.T.T.T.~.T.~.T.T.~.!.~.~.[.~.~./.(.(.(.(.(.^.(.[.(.(.(.(.(.(.(.(.(.(.`.(.(.(.(.(.(.(.!.(./.(.{.(.{.(.^.(.^.^.(.(.{.^.(.(.(.(.(.(.(.(.(././.!././././.T.~./.!./.(./.(.^.`.^.`.(.`.^.^._.`.(.(.(.(.{.(.(./././.~.T.T.Y.T.Y.U.L.L.L.L.H.L.H.S.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.A.S.U.U.S.U.D.L.L.L.L.L.L.U.L.U.L.L.H.L.L.L.L.L.P.P.L.L.U.U.U.U.T.T.T.T.T.T.T.T.T.P.T.P.P.P.P.T.P.Y.U.T.Y.T.T./.T.~././././.(.^.(.(./.(.(.(.(.(.`.(.`.(.|._.^.`.^.{.|.(.(.(.(.!.(.(.(.(.(.(.(.^.(.(./././.~.~.R.T.~.T.T.T.[.T.T.T.T.T.T.P.T.U.T.U.T.T.U.U.T.T.T.U.U.T.U.T.~.U.T.T.~.T.~.T.T.~.~.~.T.~.T.~.~.~.~.~.~.~.~.T.T.T.T.T.T.~.T.~.T.~.T.T.T.~.Y.T.~.T.~.T.T.T.T.T.T.~.~.T.~.~.~.~.~.~.~./.(.(.(.^.`._._.`.`.|.|.|.|..X.X XzX.X.XdX.XdXdXdXdXdX.XzX.XzXdXzXdXzXdXdXdXzXdX.X.X.X.X.X.X.X.X|.|. X|..X'..X.X X.X.X.X.X.X.X X@X X.X.X_.`..X'.|.|.|.|._.|.|._._._.^.(.(.(.(.(.{.(.(.(.(._.(._._.{.|.(.(. X{.[.n.n.].|._. X{.n.F.Q.{. X|._.|._._.`.(.`.(.(.(.(.(.(.{.(.(.(.(.(.(.(.(.(.(.|.(.|.^.(.(.(.(.~.(.[.^.^.(././.^.~././.!.(././.[.[.(././.(./././././.~.~./.!./.~./.~.~./././.(.(.^.(.|.(.(.(./././././.!./.(.(././././.~.~.~.~.~.~.~.~.~.~.T.~.~.T.~.T.T.T.T.~.~.T.~.~.~.T.T.T.T.T.~.~.T.T.T.T.T.T.P.T.I.L.H.H.H.G.h.A.",
+"m m m m m m m N m M N m m M m m m N m m m m m m M m M M M N N N V N N N N C N N B B B V B B B B C V C C N C C C B C C C C B Z C C C Z A Z M * 0 e r r r r r : r r r 0 e r : r r r r r r r r r 0 r r r r r * r r r r r r r 0 r r r r r r r r r r r ; e ; ; r * % % % % % $ % $ $ $ $ % % % % % % % $ $ % % % $ 0 % = % % % * ; % > % % % % * : % : r r r r r 0 y r r r r * y r r r r r r r r r r r r r r r r r r r r r q r r r r r r r r * r r r : * * $ o     m.'.dXzXzXdXzXzXzXzXzXzXzXcXzXvXnXxXdXzXxXzXzXcXcXdXcXcXcXcXdXdXdXzXzXdX.XdX.XxX.XdX'.dX.XxX.X.X.X|..X X_.|.|.|._.|._.`.(.`.(.`.(.(.^.`.^.(.^.`.(./.(./.~./.~.~.~.~.~.~.Y.Y.~.T.T.T.T.T.T.T.T.T.U.U.U.Y.U.Y.P.L.L.L.L.U.L.L.H.H.H.H.G.G.H.L.A.L.L.P.L.L.L.L.F.L.L.L.L.L.L.H.H.H.A.H.S.A.S.A.A.A.A.A.h.j.Z.A.A.A.A.A.h.A.A.A.z.A.A.h.A.h.j.Z.G.g.A.A.A.A.A.h.A.l.l.h.h.g.h.z.g.g.g.f.f.f.g.a.g.i.k.k.i.f.d.a.a.a.a.t.i.i.i.a.a.u.s.s.a.i.i.i.a.a.a.a.f.a.a.a.a.f.a.z.i.k.f.f.f.f.f.f.f.f.f.i.k.i.k.f.f.k.g.l.z.h.l.h.l.h.z.g.Z.h.A.A.A.A.h.A.A.A.A.h.A.h.h.h.Z.h.Z.h.A.A.A.A.h.A.A.A.A.A.G.A.S.G.A.G.S.H.S.H.D.H.G.S.H.A.H.H.H.g.J.A.A.S.S.G.G.H.G.H.H.H.A.J.A.H.H.H.H.H.K.U.L.I.U.T.T.T.T.T.T.T.T.T.Y.~.T.T.T.Y.Y.P.T.T.T.U.T.U.T.Y.Y.T.Y.P.U.T.T.I.T.U.U.U.I.U.U.L.U.U.L.U.L.L.U.L.P.P.L.U.U.P.P.U.U.U.U.U.T.T.T.~.T.T.~.T.~.~.~.~.~.~.~.^.^.^./././.(.(.[._.{.{.`.(.(.`.(.(.(.(.(.(.^.(.(.(.(.(.(.!.(.(./.(.(./.^.(.{.(.(.(.(.(.~.(.(.(.(.(.(.(.(.(.(.(././.(.!./.~.(.!././././.(.^.^.^._._.`.`.|.`.{.`.(.|.^.(.^.(.(.^./.^.^.~.~.~.Y.P.U.U.L.L.L.L.G.L.S.H.H.H.H.H.H.H.H.H.H.H.H.H.H.G.L.L.L.U.U.S.L.L.L.U.L.L.U.L.L.L.U.L.L.L.L.L.L.L.L.U.S.S.P.U.Y.L.U.U.U.T.T.T.T.T.T.T.T.T.T.P.U.U.T.P.P.P.I.I.I.I.~.~.T.T.~././././././.(.(.(.^.(.(.(._.^.(.(.(.(.`.`.(.'.(.^.(.(.(.^.`.(.(.(.].(./.^.(.(.(./.!.~.~.~.T.~.~.T.T.T.T.T.T.T.T.T.P.T.T.T.T.U.U.U.U.U.Y.U.U.T.T.U.T.T.U.Y.~.~.T.~.~.~.~.~.~.~.~.~.^.~./.~./.T.~.~.~.T.~.~.~.T.~.T.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.~.T.T.T.~.~.~.~./.^.(./.|.^.`.|.|._.`.`..X.X.X.X'.@X.X.X.XdXdXdX.XdXdX@XzXdXzXzXxXdXdXzXzXdX.X.XdX.X X@X.X.X.X|..X|.|..X|..X X.X.X X'.'..X.X.XdX X|.'. XdXy * ; > 0 : r r * y * r _.{._.(.(.^.(.(.(.(.(.(.(.(.(.(._.(.(.(.`.].[ = 0 y q [  XQ.u y r r y m.* q q m._.`.(.`.`.`.(.(.^.(.(.(.(.(.(.(.(._.(.(.(.{.(.(.(.(.(.(.^.(.~.~.(././.!.[./.~.(./.[./././.(.!././.^././.[././.~.(.!.R./.T./.~././././.[.(.(.|.(.(.(.^./.(././././.(./.(././.(./.~.~.[.~.T.T.~.T.T.~.T.(.T.T.~.T.~.T.~.T.T.T.T.T.T.T.~.T.~.T.T.R.Y.T.T.T.T.T.U.T.P.I.L.L.H.K.G.G.H.",
+"m m m m m m m m M M m m m M M M N m N m M M m M m M M M m N N N V V B B N B V B B N N B B B C B M C C V N C A C C C C C Z C C Z C C Z Z Z A 0 = * r ; e r 0 r ; r : r r r r r r r r r r r r r e r r r r r r r r r * t 0 r r r e e r r r r r r r r r r r r r 0 : : ; % % % % % % % % % * % % % % % 0 * % % % * % * % * * ; * % * ; ; % * % * : : r e 0 r r r r * r r r r r r r r r r r r q r r r r r r r r r r r r r r r r r r r r r : r : r : r : ; $ $     u xXdXdXdXcXdXdXcXzXzXzXcXzXcXzXzXdXxXxXxXdXcXzXzXdXdXxXdXcX%XdXdXfXzXzXzXzXcX.XzX.XzX.X.X.X.XdX.X.X.X|..X X|.|.|.|.|.}.}.}.`.(.^.(.(.(.(.(.`.(.(.(.(./.~.~.[.~.[.^.~.T.~.~.~.T.T.P.T.T.T.T.U.T.T.U.U.Y.L.L.L.L.L.P.L.L.H.L.H.S.H.H.H.H.H.S.L.H.L.L.L.L.L.L.L.L.L.L.L.S.L.L.H.H.H.S.S.A.S.A.A.A.A.h.A e ; ; y q : : q A b.D.H.D.z.A.A.g.h.h.h.H.A.g.h.h.A.Z.z.z.G.g.h.l.z.G.Z.g.g.k.i.d.z.d.k.i.k.k.i.d.a.a.T 0 % y T s.u.a.r.u.s.u.i.i.s.u.a.p.a.s.s.a.a.a.k.a.a.a.g.a.z.z.a.s.d.z.a.f.i.z.i.f.d.f.f.f.g.g.g.h.k.h.h.h.S.h.A.h.h.A.A.A.A.A.A.A.A.A.A.A.A.h.A.h.A.h.A.h.h.h.A.h.A.A.A.A.A.W.A.G.A.G.G.A.G.G.H.H.H.G.H.A.A.H.A.A.H.A.S.A.G.A.D.G.G.H.H.H.H.H.H.L.H.H.L.L.L.U.U.U.T.I.P.T.T.T.T.~.T.[.T.T.T.T.T.T.!.Y.T.Y.Y.T.L.T.T.Y.U.~.T.XXT.T.L.U.T.Y.U.Y.T.T.T.U.T.Y.Y.Y.U.P.U.Y.T.~.P.P.U.U.U.T.XXU.T.~.T.T.T.(.~.T.~.U.~.~.T.~.T.T.(.T.~.[.(.~.(./.(.(.(.`.(.(._.(.|.(.(.`.{.(.`.(.(.(.`.].(.(.`.^.^.(.`.^.(.(.(.^.|.~.|.~.~.(.(.(.(.(.(.(.`.(.(.(.^.(././././././././.^././.^./.(.(.(.^.(.`.(.(.`.`.(._.(.(.`.|.^.(.(.(.(.!.^.~.T.U.U.T.U.U.K.P.S.L.P.L.L.L.L.S.Y.D.L.L.L.S.L.S.S.S.L.P.S.L.L.L.D.H.L.S.U.L.U.P.P.P.P.U.U.U.U.L.L.L.L.K.L.L.L.L.P.U.P.P.T.U.T.T.T.!.U.Z r r 0 y ; e > 0 Z b.T.U.T.U.~.T.T.~.(.].~.(.!.(.(.(.~./.{.(.].{.[.(.(._.(.~. X(.|.(.).y : : [ _.(.(.^.(.).(._.Z 0 > Z (./.!.~.[.T.T.Y.T.T.T.T.~.[.T.T.U.T.~.T.T.Y.P.U.U.U.U.T.I.Y.U.T.T.U.T.U.T.T.T.~.~.T.~.~.~.~.~.[.~.~.~.~.~.~.~.~.~.T.~.~.~.T.(.~.~.T.(.T.~.~.~.T.~.T.T.T.T.T.T.~.~.T.~.T.~.T.(.~.~.~.~.~.~.~.(.^.(.(.(.^.`.|._._.|.|.|..X X@X.X.X.X.XcX.XdXzX.XdXzXzX.XdXdXdXdXdXzXzXzX'.zX.XzXzX.XzX.X.X.X|..X.X.X.X.X X.X.X|.|.'..X|..X|..X.X.X|..X.X* y ; 0 : y * y * y : : |.^.|.^._.T.|.~.(.`.(.(.{.~.(.(.{./.{._.(.n.r > ; > N n. XS ; = t y U n.> q y n.|.'.|.}.[.{._.(.(.(.^.(.{.{.(.|.(.(._._.(.|.^.(.(.(.(.(.~.(.(./.~./././.[.~.[.~.~.~.[.~././././.^./././././.T.~.~.[.~.~.~./.~.T.(./././.!.^.[.`.`.(./././.^./.^.(./.(.(././././.~.~.~.~.~.T.T.~.T.T.T.~.!.T.T.T.T.T.T.T.T.T.[.T.T.T.T.Y.U.T.~.~.Y.T.T.T.T.T.U.T.P.I.L.U.L.H.H.H.l.",
+"m m m m m m M m m m M M m m M M m N m N M M M M M M m M V m M N N N N N B N B N N B N B B B B B A B A A C C B C C C C C C C C B Z C C Z Z Z u = * ; ; ; e r r ; r r r r r r r r r r r r r r r r r r r r r r r r r r : y r r r r r r r r r r r r r r r r 0 r : 0 : ; * ; : % * % 0 : ; % * * r : = % * * ; * ; ; r ; ; r r ; r ; % ; ; = ; : ; ; r r r r r r r r r r r r r r r r r r r r e r 0 r r r r r r 0 r r r : 0 r r r r r r 0 : 0 * r r r : % $ o #   m.'.dXdXxXdXcXdXzXzXzXcXcXzXzXzXzXzXxXdXdXvXzXzXdXcXzXvXdXcXmXdXmXdXzXzXzXzXdXdXdX.XzX'..X.X.X.X.X.X.X X|.|.|.|.|.}.}.}.[.}.`.^.`.(.(.(.(.(.^./.(.(././.(.~.~.~.~.~.~.~.Y.T.T.T.T.U.T.T.T.T.I.U.T.U.U.U.Y.U.P.L.L.L.H.L.L.L.L.L.H.L.H.H.H.H.H.L.L.H.G.L.A.U.L.H.L.U.L.L.L.L.H.H.H.H.S.S.A.A.A.A.A.A.S 0 ; y % e 0 : ; r q e.h.l.D.l.h.A.j.G.A.h.G.A.S.z.A.A.z.z.Z.h.j.h.g.j.i.k.g.i.d.z.z.i.i.f.a.k.g.a.s.i.E t r : T a.a.u.a.u.u.r.a.u.u.i.i.i.a.f.f.a.a.a.a.a.a.g.g.a.a.a.f.a.g.a.i.a.f.i.i.d.k.f.a.f.a.g.g.h.g.h.h.g.g.h.h.A.A.A.A.A.A.A.A.A.A.h.h.A.h.A.A.h.h.A.h.Z.h.A.A.A.A.A.A.A.A.h.A.A.A.G.G.H.A.H.G.Z.G.G.H.H.H.H.H.A.S.H.H.G.H.H.D.G.H.H.H.L.S.D.L.S.L.L.L.L.U.U.U.U.T.T.T.~.~.T.~.T.T.T.T.~.T.T.T.T.Y.Z.= y ; r y y r r : = [ J.U.U.U.L.P.T.I.T.T.U.U.T.Y.T.U.L.Y.L.U.P.P.U.K.Y.b.Y U.T.T.D * r D T.T.R.~.T.T.~.~.~.T.~.(.~.~.~.{.~.~.^.~.(.(.^.(.(.(.`._.^./.^.`.(.(.`.`.`.(.(.^.(.(.~.[.` q : > ^.(.`.^.{.{._.!._.`.(.(.(.|.(./.|.^.(.(.`.(.(.^.[.(./././.!./.~.^././.(.^.(.(.`.^.(.`._.^.`.`.(._._.(.^.^.(.^.(.[.^.E.~.T.T.T.T.U.U.I.P.P.P.S.S.L.S.L.U.S.U.S.S.P.L.S.S.U.U.D.L.L.L.L.L.L.U.L.L.L.L.U.P.P.P.P.T.U.U.U.Y.L.L.L.S.U.R.L.U.P.U.P.U.T.T.T.Y.U.T.T.S r 0 > > y * r e r q b.U.H.T.T.U.~.T.T.T.[.~.(.(.!.(._././.^.`.{.^.`.~._.(.(.(.`.~.`.(.* t * b.(.(.(.|.(.{.(.!.Z 0 y Z !.!.!.T.T.~.~.~.T.T.~.U.T.~.U.(.~.~.U.T.Y.T.P.T.T.T.U.L.T.U.U.T.T.T.T.T.T.T.T.T.T.~.T.~.T.T.~.~.(.~.~.~.~.~.~.~.[.~.~.T.T.~.T.~.~.~.~.~.~.T.~.T.T.T.~.T.~.T.~.T.~.~.T.~.T.T.T.T.T.~.~.!.~.~./.(.(.(.(.|.`.{.`.|.|.|.|.'. X'..X.X.X.X.X.X'.@XdXdX'..X'.xXdXdX'.xXdXdXzXzX.XzXdX'..X.X.X.X.X.X.X X.X|.|..X|. X|..X|..X.X X|..X.X X|.'._.q = 0 q > y 0 * q r q 0 ^.{.'.`._.^.{._.`.^.{.(.{.|.[.|.~.(.(._._.[ y : 0 b.n.^.^.y ; > Z n.Q.'.b.b.b.!. X_._.{.|.(.(.|.~.(.`.(.(.(.|.^.(.`.(._._.(.{.(.(.(.(.(.(.~./.(.{.(././././.!./.!.(./.!././././.(././././././.~.~.T.T.~.~.~././././././././.(.^.^.(.(./././././././.(././.~./.~./.~.~.~.T.~.~.~.~.~.T.T.T.T.~.T.~.T.T.T.T.T.T.T.~.T.~.~.~.~.Y.R.I.(.T.T.L.T.T.P.P.I.L.L.S.D.H.H.H.",
+"m m m m m @.m N M M m M V M m m m N m m N m N m M M M M m N N V V N N N B B N B B B N N B B B B C C C C C C C A u B B C C C D C C Z C C Z A A 0 % % : ; : r e ; r r r r r r r r r r r r r r r r r r r r r e r r e r r r r r r r r r r r r r r r r r r r r r r r : : : : : r r : * : ; ; : * e = ; ; * ; ; r r ; ; e r ; ; ; r ; ; ; ; ; : r : : r r r r r r r r r r r r r e r r r r r r r r : r r r r r r r r r e r r r r r r r r r 0 r r r r * * $       > hX'.dXdX@XdXdXdXdXzXzXzXzXzXvXdXcXzXzXzXxXdXcXzXzXzXzXzXdXnXdXcXdXcXvXdXzXdXvX.XzX.X.XxXzX.XdX.X'..X.X|..X|.|.|.|._._._.^.|.`.(.(.(.(.(.(.(./.(././.^.(./.~.~.~.T.T.T.T.T.P.T.T.T.T.U.U.T.T.U.U.I.I.U.L.I.L.P.L.L.L.H.L.K.H.H.H.G.G.H.S.H.H.H.H.H.S.L.L.L.G.L.L.L.S.L.L.S.S.H.H.H.D.S.G.H.A.A.A.H.S.A y y ; : 0 t = ; > ; Z l.h.D.l.A.h.J.g.z.A.h.h.H.z.Z.h.l.z.k.g.l.a.a.z.i.k.z.f.k.d.d.k.i.i.i.s.i.i.s.u.T = e e E a.u.u.r.i.z.y.r.a.i.u.i.a.a.a.s.a.i.s.a.a.a.z.a.g.i.a.f.z.a.s.k.g.f.a.k.g.i.f.a.a.z.g.z.g.g.z.l.z.h.l.A.l.z.h.A.A.A.A.A.A.W.A.h.h.A.A.h.h.A.h.A.A.A.A.A.A.A.A.A.A.A.A.A.l.W.A.A.h.H.A.A.H.H.G.S.S.A.h.H.S.A.H.D.S.H.H.L.H.L.H.L.L.L.U.U.U.U.I.L.U.T.T.T.T.T.T.T.T.T.T.T.~.~.T.~.T.~.Y.T.T.T.b.e r r 0 0 0 r 0 r > Y T.T.U.U.U.U.T.U.I.U.U.T.T.U.Y.T.U.U.U.T.U.Y.U.b.Z > D U.U.P.u : > H U.T.T.!.T.^.~./.T.~.T.T.~.~.~.T.^.~.(.(.{.^.(.{.{.(.`.^.|._._.(.(.|.(.^.`.~.{.(._.^._.(.b.* e y ].(.(.].{.{.[._.^.|.~.{.[.[.(.|.(.(.(.(.(.(.(.(.(./.^./.(.^./.E.[./././.(.(.(.(.`.(.(._.^.(.(._.(.(.(.`.(.(.(.^.^.~.(.~.~.T.T.T.U.U.I.P.Y.P.P.L.L.S.L.D.U.L.L.P.L.L.L.U.L.A.L.L.L.L.L.L.L.L.P.L.L.U.U.P.P.Y.U.U.U.U.U.K.L.L.L.L.U.L.R.U.P.L.L.U.T.U.T.T.U.!.U.F r r : : * 0 t ; : q L U.U.~.T.U.(.U.T.[.[.[.~.~.(.].(././.(.(.!./.[./.{.^._.{.`.{._.`.y q 0 [ (.(.(.[.(.R.[.(.b.[ [ b.~.T.~.T.[.~.T.~.T.[.~.T.L.^.T.Y.~.T.T.U.T.U.T.P.I.U.L.T.T.I.U.U.U.T.T.T.T.T.T.~.~.T.T.~.(.(.E.T.~.!.~.~.~.!.~.~.T.~.T.~.~.~.~.~./.~.~.~.~.~.T.~./.~.T.~.T.T.~.~.T.~.T.T.(.T.~.~.~.~.~.~./.^.(.(./.^.(.`.`.(.|._._.|.|. X X'..X.X.XdX.X.X.X'.zX.X.X.XzX.X.XdX.XdXdXdX'.zXzX.X.XzX@X.X.X'..X.X.X.X.X|.|.|.'.|.|..X X|.|. X.X.X|..X|.|..X'.'.'.|.; r 0 r ].'..X^./.F.n.n.(.b.[ F.^.`._.F.[ [ [ b.n.(.|.).Q.I 0 r q n.Q.|.n.* t > Y m.}.!.n.n.n.{.{.|. X|.n.b.[ b.n.].]. X(._.^.|.^.(.`.(.`.^.(.^.^.(.(.[.(.(.(.(.T./.[.{././.[./././.^.!.[.~./.[./.(././.~./.T.~./.[.T.~.~././.^.(.E.^././.^.(.(.(.(.(.(.~.~.(././.(./././././.~.~.~.~.~.~.T.T.XXU.~.~.~.T.T.T.T.T.[.T.T.T.T.T.T.T.T.T.~.I.I.~.T.T.T.T.T.T.T.P.P.T.L.L.L.L.L.S.H.H.",
+"m m m m N m m m m m M M m m V V m N m N N m N M M M M m V m m M N N N V N N N N m N u B B B F B V u A C C C C C B F C D C C D C C Z Z Z C Z Z u % % * : * 0 0 ; r r r r r r r r : r r r r r r r r q e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r : r r : r * r r * r : 0 r r : : r 0 e ; r ; r r ; ; r r y ; y r ; ; ; : 0 : : 0 r r r q r r r r r r r r r 0 r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r 0 % $ $       ].`.@XdXdXdXdXxXdXcXzXzXzXvXzXzXzXzXzXzXzXcXzXzXzXzXzXzXvXdXzXcXmXdXdXdXzXvXdXdX.XzX.X.X.X.X.X@X.X.X.X.X X.X.X|.|.|.|.|._.|.^.^.(.(.(.(.^./././.(./././.~.~./.~.~.~.T.T.Y.T.T.T.T.T.U.T.Y.U.L.U.L.U.U.L.L.U.L.S.L.S.L.H.H.H.H.H.S.H.H.G.H.H.S.H.H.H.L.G.L.L.L.L.H.H.U.U.S.L.L.H.H.G.G.G.G.Z.A.A.H.z.h.A ; ; 0 e.A.A.T : ; ; A Z.z.A.A.j.T U T e.e.H.g.z.J.T e.T Z.e.T T z.z.z.Z.T T T T e.d.i.f.a.f.i.T T T T T y r : T a.t.s.u.T T G T E u.u.u.i.E T T i.i.T T T T a.a.T U T T z.s.x.g.i.a.f.i.a.k.z.z.f.f.g.a.z.h.g.l.h.h.h.g.S.A.A.h.A.A.Z.A.A.h.A.h.Z.A.h.A.h.A.A.h.h.A.h.A.A.j.h.A.G.A.A.A.A.A.h.A.H.A.A.H.A.Z.G.S.H.H.H.G.S.H.H.H.L.H.L.L.L.L.L.U.U.U.U.U.Y.T.T.T.T.T.T.T.T.T.T.~.~.~.~.~.T.~.~.T.T.~.Y.U.T.Y.Z.r = > ; y ; y r r = [ L.U.Y.U.U.U.T.~.T.U.T.U.T.T.U.T.U.T.U.T.~.T.!.Z q > G U.U.L.Z : r S /.~.T./.T.T.~.~.T.T.~.^.T.U.{.P.(.[.~.[.T.`.].^.(.(.(.`._._.{.(.`./.{.(.^._._.(.[.(.`.{.[ r * 0 (.|.{.(._._.|.|.{.~.{.|.^.`.(.(.(.(.(.(.(.(.(.(.(.(.~.(./.(./.(.(.(./.(.(.(.(.(.(.^.(.|.|.|.^._._.(.(.(.(.(././.[.~.~.T.~.T.T.U.T.U.Y.P.P.L.L.P.P.L.L.U.H.L.L.L.L.L.S.K.L.U.U.L.P.P.A.L.L.P.L.Y.U.L.U.P.T.U.T.U.T.U.U.U.U.L.U.L.L.U.K.L.T.P.U.T.T.T.T.T.T.~.I.A r r r b.L.U.T = > : Z U.T.T.T.Y.` [ T [ ].^.~.(.~.F.F.n.~.!.b.b.b.!.!.'.b.[ b.Q..X{.(.: * q [ ].[ [ Z./.~.~./.n.n.F.F.(.~.Z.n.b.!.T.[ [ T F.[.P.U.!.!.[ T b.F.Y.n.n.b.T.T.T.I.Y.Y.~.I.T.T.T.T.~.T.T.T.T.T.~.~.T.T.~.~.~.~.!.~.~.~.~./.~.~.~.~.~.T.~.~.T.~./.T.~.~.~.~.~.T.~.T.~./.T.~.T.~.~.T.T.(.~.~.~./.~.~.~.^.T.(.(./.(.(.^.(._._.|.|.|.'..X.X X.X'.@X'..X.XzX.X'.dXzX'.zX.XdXdXdX'.@XzX'.zXzX'.@XzXxX.X.X.X.X X X|..X X X.X|.|..X.X|..X X|. X X X`.@X_. X X X(.y : : y (.(.{.{.n.r : r [ y : J `.].Z r r : y r = S n._.Z 0 r : 0 y J F.0 ; : : : = L.n.y = r Q.[._.Q.S = : : = * u b.^.`.|.(.`._.`.`.(.(.`.^.|.|.(.(.(.(.(.(.(.(./././.^././././././.!./.^.[.!.(.(./././.~.~.T.~.T.~.~.~.~.~.~.~.~.^.!././.(.(.(.^././.~.~.~././.(./.^././././.~.~.~.~.~.(.T.E.XXT.~.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.U.I.~.~.U.~.~.T.T.T.T.T.U.P.P.U.I.L.L.S.L.G.G.",
+"m m m m m m N m m m m M M M M m N m M m M M m M m M m M M m V M B N B N N m B B V B B N B B B C B C C B C C C C Z C C C C C Z C D C Z Z C F C Z e % % * ; 0 r e r r r r r r r r r r r r r r r r r r r * e 0 r r r r r r r : r r r r * y r r r r r r r r r r r r 0 r : = y ; r r y : r r : r ; ; r ; = e r ; ; 0 r ; ; ; = y ; r : = y y : r : : r r r e r r r r r r r r r r r r r r r r r r r r r r r r q r r r r r r r r r r r e r r r r 0 % % $       ' .XdX.XdXdX.XzXzXzXzXzXzXzXzXzXvXzXzXzXzXzXzXzXzXzXzXzXzXzXdXvXzXdXdXcXvXdXcX.XzXzX.XdXxX.X.X.X'.zX.X.X.X|. X.X.X|.|.|._._.|.(.(.(.(././././.(./././.[.^.~.~./.~.T.T.T.T.T.P.T.T.P.T.T.U.U.U.U.L.R.K.U.L.S.L.U.L.S.L.H.H.H.H.H.H.H.H.H.A.H.H.H.D.H.H.L.L.G.L.L.H.L.L.L.L.L.L.L.A.D.A.G.S.S.S.A.S.A.A.S.Z 0 ; r e.S.Z.T 0 r q T z.h.D.T y = q e ; t G D.h.S.= y q J y * q f.h.T t y = : > = C T f.u.d.F = > q > N : : y T a.a.T q y ; r * e G E a.u.C q q D u = t > q T H q : r N G a.a.a.g.i.z.a.k.k.i.a.a.g.z.z.g.h.z.h.z.h.g.l.l.l.A.A.A.A.A.A.h.A.A.G.A.h.A.A.h.A.h.A.A.A.h.A.Z.h.W.A.A.A.A.A.A.A.A.A.A.A.H.h.H.S.S.H.H.H.H.A.H.K.H.H.L.L.L.L.L.P.U.P.T.Y.T.T.T.T.T.T.T.T.(.~.T.~.~.~.~.T.~.T.~.~.T.T.Y.T.T.P.P.L.A.; ; r Z ].Y.K.I.T.~.U.T.U.T.L.b.[ T ` b.F.~.T.U.F.Z.b.F.F.[ T F.T.n.A : > u n.n.T.Z : : D ~.b.[ b.n.~.~.[.T.Y.!.T b.b.!.F.n.F.].[.!.n.F.n.{.{.(.F.n.F.^.^.|.`.^.n.b.[ [ b.].(.^.(.[ : ; y './.~.n.F.n.F.{.~.(.].[ [ [ b.]..X(.`.(.(.(.(.(._.`.`./.(./.(./.^./.(.[.(.(.!.(.(.(.`.^.(.{.`.(.(.(.(.(.(.^./.(./.~.~.~.T.T.U.T.T.T.U.P.P.P.U.L.P.L.L.U.L.L.P.P.P.L.L.L.L.P.D.L.L.L.P.L.U.L.L.P.P.P.P.T.T.T.P.U.T.U.U.U.U.U.L.U.R.K.L.P.P.P.T.T.T.T.T.~.U.T.U.Z e e 0 b.T.T.[ y : 0 [ T.U.T.T u y = y = y [ (./.!.0 ; y [ y * * ; y Q.A * y t r n.`.`.y : : u = 0 r y S ].~.!.Z : 0 L T./.q r q [ t 0 r r q n.T.~.n.A y : t y _ y r q K.U.T.T.I.Y.Y.T.T.T.T.T.T.T.~.T.~.T.T.~.T.~.~.~.~.~.~.~.~.~.K.T.T.~.(.T.~.~.~.~.~.^././.~.~.~.~.~.~.~.~./.T././.~.~.~.~.~.~./.~././././././.(./.(.(./.(.`.^.[.|._.|.|.|..X.X@X'. X.X.X.X.X@X.XzX'.@X.XzX.X@X.X@X.XzX.X.X@XxX'..X.X.XzX'..X.X.X X X.X|.|.|..X|..X X|. X|.|.'.|. X`.|.|.|.`.|._.; r * 0 (._.(.(.F.; > r 0 y > b.(.Y ; ; y : 0 r e : U (.H y : r : > U n.q ; q : y = Q.Q.y : > Q.|._.u * : * : y y : = Q.{.(.|.{.`.`.(.(.(.(._.(.(.[._.(.(.(.{.^././.(.(./.!././././././././././././.~./.~.~.~.T.T.~.~.~.~.~.~.~.~.~.~./.~./.(.(.(././.~.~.~.~././.(./.(././././.~.~.T.U.(.T.(.T.~.T.T.T.T.[.T.T.T.T.T.T.T.T.T.T.T.~.~.~.T.I.~.Y.R.T.T.T.T.U.Y.U.Y.L.L.U.L.L.D.H.D.",
+"m m m m m m m N M M M m m M M M M N M m M m M M m M M M V N m m m B m B B B B N N B B B B B C B C C C C C C C C C B C C F C D B C B Z Z C D C D u 0 % % % e ; ; r r r r r r r r r r r r r r r r r r r r r r r r r r r r y 0 r r 0 e : r r r r r r r r * r r r r : r q r * : r * : 0 r r = r q ; r r r r 0 r r r r r y r r r = r r ; : r : r = y r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r : r r : r : % &       $ hXdX%XdXdXdXzXzXzXzXzXzXzXzXzXcXzXzXzXcXzXzXzXzXzXzXdXvXzXzXnXdXdXnXdXvXnXdXdXzXdXzXzXzXzX.X.XdX.X'..X.X.X.X X X|.|._.|._.^._.(.[.(.(./.(././.~.T.^.~.~.~.!.~.T.~.T.Y.T.T.T.P.T.P.P.U.U.L.U.U.U.L.L.L.L.L.L.L.S.L.H.H.H.H.S.S.S.A.H.G.l.H.H.H.G.D.H.H.H.S.L.H.L.L.L.H.H.L.S.H.S.H.H.H.S.S.S.S.h.S.S.A.A.u 0 y ; y ; y > : e G h.k.D.T * t 0 t t 0 0 y T z.Z.> ; e r = y U j.T m r ; 0 = 0 : r C e.i.T = y ; q : q e e = E a.T M ; > r q 0 ; y Z u.i.B > * = q q 0 0 0 = = = : ; ; y g.a.a.a.a.a.a.k.a.k.g.g.a.a.g.k.k.g.h.h.g.z.l.h.A.A.A.A.A.A.A.A.A.A.A.A.A.h.h.A.A.h.A.h.h.A.Z.h.Z.A.A.A.A.A.A.A.A.G.A.G.l.A.A.H.S.H.H.H.A.H.K.A.H.H.S.L.L.L.U.U.Y.T.Y.P.T.T.~.T.T.~.(.T.~.~.~.~./.~.~.~.~.~.[.T.T.[.~.T.~.T.T.U.T.b.e r y u [ T T [ T T Y.P.~.[ y : e : 0 q : U ~.U.T * 0 D u = q [ U.> : : e * = Z T.S r e u Z = * = r T [.T.T.[ = t r r A u 0 r T T.[ : q q (.|._.r r = [ .X'.[ y 0 * r : ; y Y  X{.b.; e * |.Q.q y = = b.`.].[ q e 0 ; 0 y ` (.|.`.`._.(.(.(.(.^.!.(.(.(.(./././.(./.^.(.(.(.(.(.(.(.(.(.^.(.(././.(.^./.~././.!.~.~.~.T.T.T.T.T.T.T.Y.P.P.K.L.L.L.Y.L.P.P.P.P.U.L.Y.P.P.L.L.L.U.L.L.P.P.P.U.T.T.T.T.T.T.T.T.T.U.U.T.U.I.L.L.U.U.U.U.T.T.T.T.T.T.Y.T.T.L.Z ; * r y y = r : 0 Y U.T.T.b.t = ; 0 = y * q [ /.(.= e > r q y : e ; * q q = : r A `.`.: e r r 0 r r > ; ) Y.(.A * y S T./.: e 0 q = q : e : A ~.~.L 0 * * r > = ; ; 0 Y.T.T.U.I.T.T.I.T.T.T.T.T.~.T.~.T.~.~.T.~.~.~.~.~.~.].~.~.~.(./.).~.T.T.~.~.~.~.~.~.~./.~.~.~.~.~.~.~.~.T.~.T./.~.~.~.~.~.~.~.~.~./.!././././.(./.(.(.(.^._._.|.|.|.|.|.|.|.|. X X.X.X.XdX X.X.XdXdXdX.X XdXzX.XzX.X.XxX.X.XdXdX.X.X.X.X.X.X.X.X.X.X.X.X X|.|.|.|.|.|.|.|.|.|.|.'._._._. X_. X; r r r (.|./.|.n.r r 0 q n.b._.(.Y Z q u (._.J r : q (.Q.) 0 r r n.Q.|.Q.e : r ) n.^.n.* 0 0 n.|.[ * : : [ '.n.y q q [ (.|.(.|._._._.`.^._.(.(.(._.(._.[.(.(.(.(.(././.(.(././.(././././././././.!.~./.~.~.T.~.~.~.T.~.~.~.~.~.~.~.[.~.~././.(./././.(.~.~././././././.(././.~./.~.(.~.T.~.T.~.T.[.T.T.[.T.P.U.T.T.T.T.T.T.T.T.T.K.T.I.I.T.~.R.~.T.T.T.T.Y.Y.L.L.U.L.U.S.G.L.H.H.",
+"m m m m N N m m M M m M M M N N M N N M M M M m M M N m m m m M B m M B B B B B N B N V B C C C A C C C C C C Z C C C F C D C C Z Z B Z G Z Z Z G q * $ % % % : r : e q r r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r : 0 r r r r : r r r : r r = * r : = r r r r 0 r r r r : r r r r r r r r 0 r : * r r ; y e * r r r r r r r r r r r r e 0 r r r r r r r r r r : r r r r r r r r r r r r r r r : r : = : % $ $     o m.'.dX.XxXdXzX.XzXzXzXzXzXzXzXzXzXcXzXzXzXzXzXzXzXzXzXzXdXzXzXdXdXvXcXdXmXdXdXmXzXdXzX.XdX.XzX'.@X.XxX.X.X.X.X X X.X|.|.|.|.(.(.(.|.^././.~./.(./.(.~.~.~.~.T.T.~.T.T.T.T.T.P.P.P.P.U.U.L.P.L.L.L.L.L.L.U.L.H.L.S.H.S.H.H.S.S.h.S.A.H.A.G.H.H.G.H.H.H.H.L.H.H.G.L.L.H.L.L.S.L.S.L.D.S.G.S.S.S.S.S.A.S.S.S.C q y r r 0 q q t * Z l.h.Z.y ; * A Z.e.C y = y h.j.r 0 e * G T i.j.Z ; e q e.z.T ; * r T s.N = : q w.i.N % e > E y.G y 0 q E e.V r r q T u.u r t q T G y ; 0 0 G T B 0 ; ; e.s.i.a.a.a.k.a.a.k.f.f.a.z.g.g.k.g.k.k.h.k.l.l.h.l.A.A.A.A.A.h.W.h.h.A.A.A.A.z.h.A.A.h.h.h.A.h.A.A.h.A.A.A.h.A.W.h.G.A.A.H.A.H.A.H.S.A.H.H.H.H.H.H.S.P.L.P.P.U.T.T.~.T.T.T.T.~.~.~.~.~.~.[.~.~.^.~.~.[.~.T.~.T.~.~.T.T.T.T.T.~.~.n.; ; * > : 0 q r t q Y.J.F.q r r 0 * 0 = = 0 F.~.` y ; * 0 r y F.T.q r * e > y F Y.J 0 0 : = r e r : q Y.T.F.y y : r q = e e q [ ^.[ : > * _.(.(.: y : [ .X].q ; y e 0 y e ; y F.{.[ y : y ].y > ; : b.'.`.P : y : ; = r r y [ (.(._._.(._._.{.^.(.(.(.(.(.(./.(.~.~.(.(.(.(.(.(.[.(.(.(.(.(./././././.~././.~.~.~.T.T.T.T.T.T.T.U.T.T.T.L.P.P.P.P.P.P.P.U.P.Y.P.I.U.Y.P.P.P.U.U.L.T.T.P.P.T.U.T.T.T.T.T.T.T.T.T.T.T.I.T.U.U.U.T.U.E.T.T.T.T.T.~.~.T.].U.Z e r : q : = r r ; ~ Y.I.!.A > * u T.].u e 0 q ^.~.r r 0 q [ b.0 r r r [ n.u 0 e y (.`.* : r y F.].Z e 0 q ].~.K r * H U.T.r * e q b.b.u * > y T.F.= : q G Q.F.u * r y T.U.~.T.I.T.T.T.I.T.T.T.~.T.T.T.~.T.~.T.~.T.~.~.~.~.T.(.R.~./.!.T.T.~.(.(.~.T.(.~.^.E.(.{.~.~.(.~.~.~.~.~.~.~.~.[.T.~.~.~.~.!././.~./././.(./.^.(.(.^.(.`.^.(.|.|._.|.|.|.|.|..X.X.X.X.X'..X.X.X'..X.X.X.X.X.XdX'..X.X.X.XdX.X'..X.X.X.X.X.X.X.X.X X.X|.|..X|.|. X|.|.|.|.|.}. X|.|. X|.|.|.(.y r : > [.|._.[.n.0 y > [ [.|.{.|.{. XdXn.b.I u ; y = |.(.[ r 0 q |._.{.'.; y 0 [  X[.n.: 0 y F.|.L = ; A _.|.{.Q.].(..X X_.|.^.|._._._._.(.{._.^.}.(.(.(.[.(./.(./.(././.(././.(.[././.!./././.~.~.(.!.~.~.~.~.T.~.T.~.T.~.~.~.~.~.~.~.~.~././.(./.~.~.~.~.~.~./././././././.~.^.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.U.[.T.T.T.~.T.T.I.T.I.~.Y.~.U.~.T.~.T.Y.Y.U.Y.L.L.Y.L.U.L.L.G.H.D.",
+"m m m m m m m N M M M M M m B m M N m M m M M M m M M M m V V m B B B m B N N B V V A M C N B B B C C C C C C C C C C C C C C Z C C D Z Z C H B G Z > $ $ % r 0 r r r r r y * r r r r r r r r r : r r r r r r r r r r r q : r r r r r r r r e 0 r r e 0 r r 0 r r r r r y r y : r r r r r r r r r r * r r r ; 0 r r r r r ; r ; r r : ; ; : r : r r r r r r r r r r r r r r r r r r r * e r r r 0 r e r r r r r r r r r r r r y ; r : * * $ o       ` '..XzXdX.XdXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXdXdXdXzXdXdXzXzXcXdXdXdXcXdXcX.XzX.XcX.XvX.XzX.XzX.X.X.X.X.X.X X@X X.X|.|. X_.|.(._.^.^.(./.~./.~.~.~.~.~.~.~.T.~.~.T.T.T.T.T.P.P.P.P.U.L.U.L.L.L.L.L.L.L.S.L.L.H.H.H.L.H.H.S.S.S.A.A.A.G.G.H.H.G.G.G.H.H.H.G.H.H.H.H.L.H.L.U.S.S.S.H.D.S.S.S.Z.A.S.S.S.S.S.S 0 ; = J U U Z = y ; u A.d.q ; > T j.l.T : e : d.j.r r ; A A.f.z.d.q e : Z G T G Z 0 : C e.q 0 > G i.i.T e * q G p.q % q G u.u.p.q > ; G t.V = > m p.a.G y ; 0 w.i.T = e ; T s.a.a.a.a.a.a.k.f.f.f.g.a.d.a.g.z.k.h.k.k.l.h.h.A.h.A.Z.h.A.A.h.G.A.A.h.A.n.z.A.h.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.G.A.A.A.A.H.A.H.H.H.H.H.H.H.H.H.L.L.L.L.U.U.Y.T.T.~.T.~.~.~.~.~.~./.~.~.~./.^.~.~.~.~.!.~.~.~.~.~.!.^.~.~.T.T.T.n.q r 0 r : : t > > t ].L.b.Z y r b.!.n.q y > [ T.[ ; ; y C n.b.T.T.b.C y r C b.F.T.S y * y [ n.Z t : * n.~.[ t * r ` `.U = 0 q [ ~.[ e r * (._.|.: : 0 b.T.n.H y > b.`.F.q = * c.(.b.0 : t A y ; e b.`.(.F.q : : b.^.`.J : ; u {._.(._._.(.(.`.^.`.^.(.(.(./.(.(.(.(.(.^./.(.(.(.`.^.(.(.(.(./././././././.[.T./.~./././.T./.T.^.T.T.T.U.U.Y.P.P.P.P.P.P.U.T.T.Y.U.Y.P.P.P.P.U.P.P.P.U.P.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.U.T.T.U.T.XXT.T.T.T.T.T.~.T.T.!.I.Z : r * ) T ` J q r : C L.F.; : * b.T.XXb.0 * y F.T.y r : ` !.^.I ; : Z {.[.[ r > 0 |.|.> r = [ '.[.n.0 > = F.~.Z e y S ~.~.* : : U !.T.[ 0 : = ^.n.e * = n.U.~.T q r ; Y.T.T.T.I.T.T.I.T.T.T.~.I.Y.~.T.T.~.T.~.~.T.~.~.!.~.).~./.(.R.T.Y.(.(.T.T.~.~.E.~.~.[./.(.~.~.~.~.~.~.~.~.~.~.~.~.(.T.(.~.~./.~.~././././././.(./.(.(.(.`.(._.(._.|.|.|.|._.|.|. X.X|..X.XdXdX X.X.X.XdX.XdX'.dX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X@X.X.X.X.X|..X X}._.|.|._.|.}.|. X_.|.(._._.r e ; ; |.(.(. XF.0 0 > n.(.|.{.(.Q.L > > * > t ; ; y {.{.b.> e 0 '.|.{._.; ; y b.}.}.Q.> y * n.|.L y e P '.{.{._..X{.|.`.`.|.`._._._.|._.(.(.(.}.[.(.(.(.(.^.(./.(.(.(./.(.^./././././././././.~.~.~.~.~.[.T.~.[.T.~.~.~.~.~.~.~.~.~.R.!.[./././././.~.~.~.~././.(.!./.(././.^.~.~.~.~.(.T.T.T.(.T.[.T.T.P.T.T.T.U.T.T.T.T.T.T.Y.~.T.I.~.T.~.~.T.T.T.T.Y.Y.U.U.U.L.L.U.S.L.H.H.D.",
+"m M m m V m m V M M m M m M B m N N V M C M M M V m m V M M M N m m m B N B N N B B B B B C C B C C C A C C C C C C Z C C C Z Z Z Z C Z Z B C Z A D A 0 $ % % 0 % : ; ; > : 0 y 0 r 0 ; r r r r r r r r : r r r r r r r r r r r r r r r r r r r r r y 0 r r * r r r y * r r r r r y q : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r * y r r r e r r r r r r r r r r r r r r r r r r r r r r r r e : r r e r ; 0 e ; - % ,       u hX.X.XzX.X@X.XdXzXzXzXzXdXdXdXcXzXcXvXzXzXzXvXdXdXdXdXcXdXdXzXcXzXzXzXzXzXzXcXdX.X XzXzXzXzXdXdX'.zX X X.X.X.X.X X.X X|.|.|._._.(.`.(.(.(./.^.(.~./.~.~.~.~.T.T.T.[.P.T.P.T.T.P.P.T.P.P.P.L.L.S.L.L.S.L.S.L.L.L.A.S.S.S.S.S.Z.H.A.A.A.S.G.S.S.G.H.H.H.H.H.K.H.H.H.H.H.H.L.G.H.H.H.H.S.S.S.S.A.H.G.G.A.A.h.G.A 0 r 0 b.h.S.g.A q ; q e.e.: 0 y T g.h.T q * * T f.e 0 = G z.f.k.g.= e 0 q y y : r = q C w.r : * G s.r.T * * q T u.M ; 0 G u.u.i.% = 0 G u.B * y m u.u.G y 0 0 r.i.T : e : T x.a.a.a.u.a.a.k.k.a.k.f.f.a.a.z.f.a.k.k.g.k.h.h.h.A.h.z.A.A.A.A.A.A.A.A.A.S.h.A.A.A.A.A.A.S.h.G.z.h.A.A.A.A.A.A.H.G.A.A.G.A.H.A.H.H.H.H.H.H.L.H.L.L.L.U.U.U.T.T.T.~.~.T.~.~.^./.~./.[./././././././././.~.~.~.T.~.T.~.R.T.T.T.~.b.0 r ; u [ T [ T [ T P.T.U.U.T.F.b.[ A * ; 0 T ~.[ ; ; ; b.~.I.~.~.T.Z : e S ~.~.~.S e 0 u ~.~.b.y > 0 F.~.Z ; 0 S T.~.Y.; ; e [ [.T ; r 0 `.^.|.r r y [ |.{.|.`.].n.[ u : r 0 b.^.[ y ; ; ; r 0 0 Q._.(.[ y : e [ [ b.I : ; y Q.(.|.(.|.(.^.(.`._.(.(.(.(.(.(./.(.(.(.(.(.(.(.(.^.(.[.(.(./././.E.{.~.~.^.(././././.~./.~./.~.~.~.R.T.T.T.U.L.Y.U.U.U.T.T.U.T.T.T.T.T.T.T.T.T.T.U.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.I.[.U.T.!.S : : r b.U.T.Y.A r e q n.n.= y 0 n.T.[.b.r : y n.{.: : = [ (.(.D e t S {.|.[ q : : |.{.y ; e [ {.(.F.t : : n.T.D : y S T.T.y ; 0 [ /.!.` : t : T.n.0 e 0 b.U.T.[ = ; y Y.U.Y.~.Y.Y.U.T.T.T.T.T.T.T.T.[.T.T.[.T.T.~.~.~.~.~.~.~.~.~.(.I.~.!.~./.~./.~./.~.~./././././.!././././.~./.~.!.~./.~././././././././././.^.(./.(./.(.(.(.^.|._._.}.|.}.|.|.'..X.X X.X.X.X.X.X.XdX.X.X X.X.X.XdXdX X.X.X.X.X.X.X.X.XzX.X.XdXdX.X X.X.X.X.X.X.X.X'.|.|. X|.|._.|.|.|._.|._.|._.r r : : `.^.`.^.F.0 e e n.{.|. X].q > r U F.'.Y q : : .X`.b.* r > (.'..X.X0 e * [  X{.Q.t ; : F.}.I > * u _. X_.n.[ n.n.'.}.}.|._._.|.|._.`.`.(.(.[.^.(.(._.(.(.(.[.(.^./.^.^./.(././././.~.~./.~.~.~.T./.T.~.~.~.~.~.T.T.~.T.T.{.U.T./.XX~.~.(././././.~.~.~././././././././.(.~.~.~.~.~.~.T.~.~.T.~.T.T.T.T.I.I.T.T.T.T.T.T.T.T.T.P.P.^.T.T.T.T.T.T.I.T.T.P.P.P.P.U.L.L.L.L.S.L.",
+"m m m m m m m m M M M M M M m M N N M V M M N M m V N N N N N B M C B N B B B B B B B B B B C N C C C C C A A C C Z C C Z B Z B C Z Z Z Z D Z Z D Z D A % $ $ % % : ; ; 0 ; ; : r r r r r r r r r r r r r y * r r r r r r r r r r r r r r r r r r r : t r r r r r r r : r r r r r * e r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r * r r r r r r r r r r r r r r ; ; ; = * % $ $   #   t hX'..X.XzX.XxXdX@XzXdXzXzXzXfXxXdXdXdXdXzXzXzX#XdXdXzXdXdXdXdXzXzXzXzXzXzXzXcX.XcXzXJXzXzXzX.XdX@XzX.XdX@X.X.X.X.X.X.X X'.|.}._.`.(.(._.(././.^.~.~.~.~.~.T.~.[.T.T.T.T.T.T.P.P.P.P.P.P.P.L.L.L.L.L.P.P.L.S.L.L.S.U.S.H.H.S.A.H.l.A.H.A.H.S.S.A.H.A.K.A.H.H.A.A.K.H.H.H.H.G.L.H.H.H.S.S.S.S.S.A.S.S.A.S.G.H.G.Z * 0 y T A.g.e.y 0 ; > e.j.> t y T l.z.T t t 0 d.j.y r y T i.k.i.j.y 0 * Z T T T e.T T u.u.q y q B t.i.T q : r T w.m : q C u.t.E u e e T t.m q * A u.a.G = = y i.u.E y y : T u.u.a.a.s.a.a.a.a.i.a.f.f.a.k.f.a.k.k.z.g.h.h.h.h.h.h.A.S.g.A.A.A.A.A.A.A.h.A.z.A.A.h.h.h.z.h.z.D.A.A.j.A.A.A.A.g.h.H.G.A.A.H.A.H.H.H.H.H.L.A.L.L.L.L.U.U.T.T.T.T.~.~.~.~.~.~./././././.!./././././.~./.~.~.~.~.T.T.~.~.~.T.T.~.Z.r : r Z T.T.I.U.T.U./.U.U.[ u r = = u * e 0 b.~.e.0 r q L.T.~.I.~.~.S : 0 H U.T.L.Z 0 r S U.T.Z.0 r 0 b.(.A 0 0 A ~.T.~.y ; ; [ {.b.; e q (.`.`.: ; = b..X^.[ A > y q q : 0 r [ ^.b.* e 0 ; r e e H _.{.b.y ; 0 y y : > y y q n.|.|.(.^.(.|.(.^.(.(._.(.`.(.(.(.(.).(.(.(.(.(.(.(.(.(.(.(./././.(.T.^.~.^.T.~./.!././.~./.~.~.~.T.~.~.T.T.T.T.U.T.U.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.~.T.T.T.~.T.T.Y.Z q r : b.T.Y.b.q : r > e.!.; r = b.E.T.b.r : = F.T.r r q [ /./.H 0 * L ^.(.[ 0 e : {.|.0 * e P {.{.b.* : * F.!.D * r Z U.T.y 0 * e.T.!.e.: 0 y ~.!.0 : 0 U L.].A * r ; Y.~.~.K.!.U.U.T.T.T.T.T.T.T.T.T.T.T./.T.~.~.~.~.Y.~.~.~.~.T.~./.~.~././.~./.!./.(.~././././.~.^././.~././.~././.~.~./.T././.!./.~./././.(././.(.(.(.(.(.(.|.(.(._.}.}.|.|.'.|..X X.X.X'..X.X.X.X.X.X.XxX.X.X'.dX.X.XdX.X.X.X.X.X.X.X.X.X.X.X.X.X.XdX.X.X.X.X X.X|.|.|.|._._.|.|._.|.|._.|.(.(.r r r 0 ^._.^.~.Q.= t : Q.{.[. Xn.q y y ` Q.[ y : > r '.^.[ r r r `.(.`.{.y r * b.|.[.n.q ; * F.}.b.q r 0 U m.b.y y q U '.|._.|._.|._._.|.(.(.(.(.(.^.(.(.(.(.{.(.).(.^.(.).(.(./.(./././././.~./.~.~.~.~./.~.T.~.~.~.~.~.~.~.XXT./.U.T.T.~././././.T.~.~.~./.~.(./.(./.(.[.(.^.~.~.~.~.T.T.T.T.T.Y.Y.T.T.T.T.T.I.T.U.T.T.T.T.T.T.T.T.P.Y.T.~.T.!.T.T.T.I.T.Y.P.P.L.P.L.L.D.U.S.L.",
+"N m N m m m V m m M m m M m m B N V M M N V V M V M N B B B N N B B B M B M B B B B B B B B B C C C C C C C C A C C Z Z A Z Z C B D C Z Z Z Z Z G Z G C u % $ $ & % ; ; r ; ; r 0 e r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r e * r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r r * y r r r r r r e : r r r r r r r r r r : r r r r r r r r r r : r r r r r r r r r 0 : r r ; r 0 r r * * e % $ &       & ].dX X@X.XzX.X.XdXdXdXdX@XdXdXdXzXzXzXdXdXzXzXzXdXdXdXzXdXcXzXzXzXzXzXzXcXzXzXzXcXdXzXzXzXzXzX.XdXdXdX.X XdX.X.X X.X.X|..X|.|.}._._.`.(.(./.(.~./.!./.(.~.~.~.T.[.P.T.T.T.T.T.P.P.T.T.P.P.P.L.L.L.L.S.S.L.L.L.L.S.L.H.H.H.S.Z.S.A.Z.A.A.h.Z.G.Z.Z.G.G.A.G.S.H.G.G.S.H.A.H.S.H.H.S.H.H.H.S.S.G.S.S.A.A.S.A.G.A.A.S ; e ; > q r e * r > q j.j.A > > y T T Z > 0 u z.g.y : > Y i.z.s.a.G q r q T T T = y N T i.Z ; t y G T q ; y : T r.G y ; * T G q 0 > y T s.V * : V p.i.G r 0 e i.i.T q : 0 T i.u.i.a.i.a.i.a.a.a.a.a.k.z.a.a.z.f.f.k.k.k.h.h.h.h.h.A.h.A.A.A.A.g.A.A.A.A.A.h.A.A.A.A.A.A.A.l.S.h.h.A.A.A.A.S.G.A.A.A.A.A.S.A.G.H.S.H.H.H.L.L.L.L.U.U.P.T.T.T.T.~.~.~.T.~.~.~./././.~./.[./.[././././.~.~.~.~.~.(.R.~.~.T.T.Y.n.> q = H ].T.T.T.U.I.T.~.[ q * e b.T.K.q ; ; [ T.[ r ; ; ].~./.~.T.T.Z * : Z (.T.~.S e e S /.~.b.r r > b.~.H r e u (.~.].* 0 q b.~.[ q ; = ].^.Q.e : e ` ].[ > : y b.~._.q e 0 [ `.` r : r q ` > ; : b.`.b.% : 0 n.L.n.Q.Q.n.n.T.|.{.(.|.`._._.^._.(.(._.(.(.^.^.(.(.(.(.(.(.(.(.(.(.(.(.(./.(././.(.~./.(././././.(././.~./.~.~.~.T.T.T.T.T.T.T.U.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.T.~.T.~.T.T.!.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.T.~.~.T.~.T.T.Y.Z 0 0 ; > q = r : : * : !.U.A ; y y b.b.y : * C /./.r ; y [ (.(.Z t * S (.(.b.0 ; ; `._.y e ; 0 ` n.y ; * C ~.~.F r r S T.T.> e e T !.Y.[ ; e ; T.T.U : = > y ; : r 0 0 Y.T.T.~.~.U.T.T.T.T.T.T.T.T.T.T.T.T.T.[.T.~.~.~.~.~.~.~.R.(.~.~./.~.(.!.!./.!.(./././././././.~.~./.~.~.~.~.~./././.~.{.T.~.~.~.~.~././.^.(.~.(./.{.{.(.(.(.^.|._.|._.|.|. X X.X.X.X.X.X.X.X'..X.X.X'.@X.X.X.X.X.XdX.XzXzX.X.X.X.X.X.X.XdX.X.XdX.X.X.X.X.X.X.X X|..X|.|.|.|.|.|.|. X|._.|._.[.> * y y _./._./.Q.q > > n.|.{.|.Q.q 0 : 0 0 y y r r q (.|.[ ; ; y |.`.|.(.r > e [ {.|.n.y > : Q.{.|.Z * y : : : y : q Q.dX'.|. X|.|.[.^._.(.(.(.`.(.(.^.(.^.(.^.(.(.^.(.{.^.(.).^./././././.~./.~.!.!.~.T.[.T.~.~.T.~.T.T.T.T.~.~.~.T.T.E.~.~././././.~.~.~././.)./.(.^.^.(./.~./.~.~.~.~.T.~.T.T.~.I.T.T.T.I.T.I.U.T.T.T.T.T.T.T.T.T.T.~.T.T.T.Y.T.T.I.U.Y.U.Y.P.P.P.P.L.S.L.L.L.",
+"m N M m m m m m M M B m M M N m N N C N N N N B N N N N B N N N M M B B N B B B B B B B B C Z C A C C C C C C C C C C C C Z C Z Z Z Z Z C Z B D D Z A F Z A % $ $ % % % * ; r r ; ; r r 0 r r r r r r r r r r r r r r r : 0 r r : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r * e r r r r * 0 r r r r r r r r r r r r y r r r r r r r r r r r r r r r r r r r r r r r r r q e r r r r r r r r r r ; r = y * : % &     #   & ].@X(..X X.X.XzX'.'.dXdX XdXdX@X#XzXzXzXdXzXzXzXzX.XcXzXzXcXdXzXzX.XcXdXcXzXzXzXzXdXcXzXzXzXzXzXzXdX.XdXdX.X.X.X X X.X.X|. X|.}.}._._.(.(.(.(.(./././././.T.~.~.T.T.T.T.T.T.T.T.[.T.P.T.P.P.L.L.L.S.P.L.L.L.L.L.H.H.H.H.H.S.S.S.A.A.A.A.H.A.G.A.G.G.G.Z.H.S.S.H.A.H.A.H.I.H.H.H.H.H.H.G.G.H.G.S.S.S.S.S.A.A.G.H.S.Z 0 ; t = q = r y ; q G j.Z.T N t 0 0 : * * M e.j.g.= * : T z.u.i.z.e.q * r y = r % * D i.u.w.0 : = y * q ; : e E t.T M 0 ; = 0 0 * q T r.u.V e e N w.p.T y 0 0 t.t.T 0 r 0 T a.i.u.i.i.i.i.a.a.a.a.a.a.a.i.z.i.f.f.k.z.g.g.g.h.l.h.h.h.A.g.A.h.A.h.h.A.h.A.A.A.A.A.h.A.h.h.l.l.h.h.h.A.A.h.A.A.J.h.H.A.A.A.H.G.A.H.H.A.H.L.L.L.U.P.P.P.T.T.T.~.~.T.~.~.~./.~./././././.~.!.~./.!././././.~.~.T.~.I.~.R.T.T.T.b.e : e * 0 0 0 0 e r Z U.H > e u [ b.H > y ; ` ~.Y r e y ~.~.~.~.(.T.H * > u b.F.T.H : ; L T.T.n.r y = n.Y.[ 0 > * U n.F 0 0 = [ [.[ y : > G [ u 0 e r e.`.P r y y n.n.J ; > q [ (.b.t r 0 Q.`.u e e y !.Q.q 0 0 I n.b.C * S [  X(.`.|.`.^.`._.^.(.`._._._._.`.^.(._.`.(.(.(.^.^.(.(.(.(.(.(./.(./.^.(./.~.(./.^.(.^././././.~.~.~.~.~.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.T.~.T.T.~.T.~.T.~.~.~./.~./.~.~./.~.~.~.[.~.~.~.T.T.T.~.~.T.~.~.~.T./.~.T.~.Y.~.~.!.S = e e y = ; y y : = b.U.T.F.q * : q r : = B Q.!./.y ; 0 [ !.(.Z ; : S (.^.[ 0 ; > '.'.= r y y = q > ; : [ ~.[.S > y Z T.T.0 r e [ T.^.T e * > [.U.L.A 0 y = y H y r > Y.U.~.U.T.U.T.T.T.T.T.T.T.T.[.T.[.T.T.T.~.T.~.T.~.~.R.~.~.T.~.~.~.~./.~./././.~./.^././././.~.~.~.T.~.~.T.~./.~.~./.~.~./.~./.~.!.~./.~.~.~.(.(.(./.^.(.^.(.(.(._.|.|._.}. X|. X'..X.X.X'..XdX X.X.X.X.X.X.X.X.X.X.X.XdX@X.X.XdX.X.X.XdX.XdXdX@XdX X.X.X.X|..X.X X.X.X|.|. X|.|.}._.{.|._.|._.; * t q (._.{.{.n.q 0 * F.|.|.(.{.b.q > y * P ].: : r Q.`.[ y * y '._. X|.q = r b. X|.Q.q * y Q.}. X_.[ q r : 0 r L Q..X_.|.|._.|.|._._.`.`.(.^.`.(.!.(.(.(.`.!.(./.(././.(.^.^.^.(.(.!././.~./.~.~.~.T.~.T.~.~.T.^.[.E.XX~.~.T.~.~.P.^.[.~.~.~./.T./.~.~./././.^.(.(.(.{.(.(.(./.{.~.T.T.~.~.T.~.~.Y.~.Y.T.T.T.T.T.T.U.U.T.T.T.T.T.T.T.Y.T.T.T.Y.T.T.T.T.P.Y.P.U.L.P.P.L.U.L.L.S.",
+"m m m m m m m V m m M M M M M B N M N V M N N M N N N N m C m N M B B N B B B B N N Z B C B C C C C C C C Z C C C D C Z Z Z C Z B D Z D Z D Z Z G Z H C Z Z u % $ o $ % % % 0 = ; ; ; r = r r r r r r r r r r r r r r r r r r r r r r r r e q r r : y * r r r r r r r r r r r 0 r r r r r r r r t : : y r r r r r r r r r r r r 0 r r r r r r r r r r r q r r r r r r r r r r r r r e r r r r r r r r r r r r r r ; 0 * y ; % % $ o #     t '.'.|..X.X X.X.X X@XdX@XdX X.XzX.XxXzXzXdXzXzXzXzXzXcXvXdXcXvXzXcXcXxXdXvXzXdXcXxXzXxXxXzXzXzXzXzXzX.XzXzX.X@XdX X'..X|..X|.|.|.}._._._.^.(.(./.(./.~.(./.~.~.~.T.T.[.P.T.T.T.T.T.[.T.U.P.P.P.P.L.L.L.L.S.L.G.L.L.G.H.H.H.H.H.H.H.A.H.g.S.h.H.A.G.A.A.h.S.A.S.S.S.S.H.A.H.H.H.H.H.H.H.H.H.H.H.A.H.S.S.S.A.A.G.A.A.A.A r ; r 0 y 0 ; q Z T d.f.i.z.T A y 0 e = Z T k.a.z.y = = Y f.a.i.f.i.T Z q * = e = T T u.u.u.T y = * y U m ; = E t.t.T V = q q = u T u.r.r.N e > B w.p.G * = y u.u.T q y q E u.u.i.u.i.i.u.u.s.i.a.a.a.a.a.z.i.f.f.f.a.f.k.k.h.l.l.l.l.h.A.h.A.h.A.A.g.h.A.A.D.g.A.A.h.h.h.l.h.h.l.l.A.A.A.A.G.A.A.A.A.A.A.S.H.H.H.H.H.H.H.H.L.Y.U.U.T.T.T.~.T.~.~.~.~.~.~./.~.~././.~././././././././.~././././.T.T.[.T.T.T.Z.0 0 r r * 0 * > : e A !.T r = q y r 0 r % y e.!.b.* y = ).Y.R.^.~.T.Y y > y * ` ~.S * e Z ~.(.F.* e y F.[.].y * > 0 r * = q 0 [ (.F.* * : r 0 q : > : b. XY ; * t > y = y * 0 b.|.` r ; q  X`.b.0 : > [ ].[ y : > 0 r * > q Q._.|.`.`._._._._._.`.`._._.^._.|.|._._.(.(.(.(.(.^.(.(.(.(.(.(.(.(.(.(.(./.(.(./.(././.(./././.!.!.~.~.T.~.T.T.T.T.T.T.T.T.T.~.T.~.~.T.T.~.~.T.~.~./.Y.~./././././.E.^./.~.~.~.~.~.~.T.~.~.~.T.~.!.~.~.~.~./.~.T.~.!.~.Y.Y.H = r r r r e ; t H ` T.L.T.(.F.F ; * y ; H F.~.^.].y r q [ ~.^.H : ; P `.(.[ q 0 q (.`.y * y [ S : > q ` ~.(.T.H q q A T.T.q ; q [ (.!.b.0 0 = L.T.~.].b.[ b.F.T 0 0 * T.T.T.I.T.U.T.T.U.T.XXT.T.T.T.T.T.T.~.~.T.~.T.~.~.~.T.~.R.R./.~././././.(./././././././././.~.~.~.~.~.~./.~.~./.~.~.~.~.~.~.~.~.~.~.~.^.~.(.(.(.(./.(.(.(.(.(.`._.|.|._.|.`.|..X|.'.'..X.X.X.X@X.X.X.X.X.X.X.X.X.X.X.XzX.X.XdX.X@X.XdX.X.XdX.X.X.X.X.X.X.X.X.X.X.X X.X|.|.|.|.|. X}.|.{. X|.|.|.(.`.|.^._._.(._.!..X]. X_.{.|.|.|.`.n.n.'. X(.|. X`.@X{.|.|.|. X{.|.(._.`.`.`.|.|.{.|.|.'.}.}. X_. X|. X].Q.F.]. X'. X|.}.}. X X|.|.|.(._.(.(.^.(.(.(.(.(.`./.^.(./.(.(.^.{.(.(./././././.!./.~.~.~./.T.~.T.~.~.~.T.XXT.T.~.~.~.T.~.~.~.T.~.~.(./.~.~.~./.~.(.{.|.^._.|.|.(.(.(.~.~.R.~.R.T.T.T.T.T.T.T.T.T.T.I.U.T.U.T.T.T.T.T.T.~.Y.T.T.T.!.Y.T.T.T.U.T.U.Y.L.P.P.P.L.L.U.U.S.",
+"m m m m m m m m B m M m m M M N V N N N N N V N N N V B C m C N N B B B B B B B B B B B B C B B C C C C C C C C C B C C Z C C Z Z D Z B Z B Z Z Z C Z Z N D D A % $ $ $ % % 0 * : : r r r r r r r r 0 e r r r r r r 0 e r r r r 0 r r r r r r r r r r r r r r r r r r r r r r e r r e r r r r r 0 y y * r r r r e q r r r r r r r r r r r r r r r r r r e r r r 0 e r r r r r r r r 0 r r r r r r r r r r r r r r r : : * % $ $         u '.`.'.dX X XdX XdX.X.X.X.X'.dX.XzXzX'..XzXdXdX'.zXzX.XdXdXvXdXzXdXzXzXvXvXcXzXcXzXdXdXdX.XdXzXzXzX.XzX.XzX.X'..X.X X X X X|. X_.`.}._._.(.(.(.(.(.(./.(.~./.~.~.T.T.T.T.T.T.T.P.T.T.T.U.~.^.P.P.P.L.L.L.L.L.L.L.S.G.L.H.H.S.S.A.A.A.A.g.H.A.A.A.A.A.G.A.H.S.A.S.S.A.S.H.H.A.S.H.A.H.H.S.H.A.H.S.S.S.S.A.A.A.A.A.G.A.h.h.l.A.A.h.z.z.A.Z.g.j.f.z.z.a.k.f.e.w.T e.j.z.f.z.g.s.j.u.z.z.i.f.i.x.i.u.a.T T T i.t.a.i.p.u.s.i.T E t.u.E i.u.t.t.t.p.w.t.T T w.E t.t.r.r.r.i.t.t.u.u.y.u.p.u.t.t.u.t.s.w.i.u.i.u.i.u.u.i.i.u.u.u.i.a.a.a.i.x.f.f.f.f.z.k.h.h.l.h.l.l.h.h.h.h.h.h.A.h.A.A.A.h.A.g.A.h.h.h.h.l.h.h.l.l.A.h.A.A.S.A.A.J.A.H.A.A.A.H.H.H.H.S.L.L.L.U.L.T.U.T.T.T.~.~.T.~.~.~.~./.^.~.~./.~.~./.[.^./././.~./.T././.~.~.T.T.T.T.h.y > 0 r r r r > r q F ~.F.L e > > C b.U r : K !.[ q r y T.(.~.T.~.~.Q.C : = q D ~.J q 0 L T.].F.y 0 = n.T.{.F.u 0 q r [ : e 0 ` (.^.[ y q ; y n.J ; y [  X].H 0 r q u b.) y r S _.b.0 e q _.~._.A y : q Y.dX[ y = r : : A n..X_.`.(.|._.|.[._.|.(.(._.(.`.|._.(._.`._.`.`.^.(.|.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./.(./././.~./.~.~.~.~.T.~.~.T.~.T.T./.T.~.T.^.~.~.~.~.!.~.~.~.~././.!./././././.(./.^././.!.~././.^.~.~.~.!.~.~.~.!.~.~.~.~.~.T.~.~.T.~.!.^.~.T.U.T.T.T.T.T./.~.T.~.T.T.~.].n.n.].!././.{.R.(.(.(.(.~.^./.`.^.(.(.(.`.!.dX`.`.^.|.`.`.^.`.F.F.].(.~.T.~.T.].!.T.U.U.P.~.Y.Y.H.T.T.K.].].T.T.y y H [ !.T.L e > q Y.T.!.T.T.U.T.T.T.T.U.T.~.T.~.~.T.(.T.~.~.T.~.~.Y.T.~.~.~.(.R.(./.(././././.(././.^././././.[.~.T.~.~.T.~.~.~.~.~.~.~.~.T.~.T.~.~.~.~.~.~.(.~.~.(.(.(.(._.(.(._._._.{.|.|.`..X|.@X'..X|..X.X.X'..XdX'.dX.X.X.XdXzX.X.X.XdX.X.X.XdX X'.dXdX.XzX.X.XzX.X'.|..X.X|..X|.|..X.X|.|.|.|.|._.|. X_._.{.(.^.|._._._._.(.{.|..X|._._.|._._.`.@X(.|.{.{.[.`.'.^._.|.|.|.|.|.|.$X_.`._.(._.{.(.`.`.|.|.|._. X`..X X X.XdX.X.X@X|..X X X.X X|._.|._._._.(.|.(.(.(._.(.!.(././.(.(./././.(.(./.(././././.!.~.~.~.~.T.~.~.~.~.~.~.).T.~.~.T.T.T.~.~.~.~.~.~./.~.~.~.~././.(.^.(._.(.(.[.(.(.(.(.~.(.R.T.(.~.T.T.T.Y.T.T.T.T.I.P.T.T.U.T.T.T.T.T.Y.~.T.~.T.T.Y.T.Y.U.T.U.U.U.Y.U.P.L.U.L.D.U.S.",
+"m m m m m m m m M M M M M M N M N N N N M M V C N V B B N C A N B B B B B B B B B B N N C B C C B Z A C C C C C C C Z C Z C Z Z B D Z C Z C Z Z Z D Z Z D A D D u * $ $ $ & % % * ; y : r r : : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r * r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r * r r r r r r r r r r r r r r r r r r r ; ; ; * - $ o         ` '. X X|._. X.X'.dX XzX.X.X.X'.dX.XzX.XzXzX.X.XzX.XzXzX.XdXcXdXdXxXcXnXdXdXnXdXvXcXzXzXzXzXnXxX.XfXzXdXdX'.zXzX.X.X.X.X|.|.|.|.|._._.`.`.^.`.^.(.(././././.~.~.~.~.T.~.T.T.T.T.T.T.T.T.T.T.U.P.T.Y.Y.L.P.L.L.L.S.L.H.H.L.H.H.H.G.H.A.A.A.J.A.h.A.A.A.G.A.S.A.A.H.A.S.A.H.G.S.A.H.G.H.H.A.G.H.S.S.S.S.G.A.S.S.G.A.A.l.G.l.z.A.A.h.z.h.f.f.z.s.f.i.a.z.f.f.k.g.k.a.a.g.z.g.g.i.j.g.z.f.i.s.i.i.u.x.a.t.u.u.u.u.s.i.u.s.u.t.r.s.t.u.t.t.t.r.t.t.t.u.t.t.t.r.E t.t.r.t.t.t.t.E i.r.w.t.t.t.p.i.u.i.E i.p.u.u.u.u.u.u.u.i.u.i.u.u.a.i.a.a.a.a.f.f.f.f.g.g.k.h.j.z.h.h.h.h.h.h.h.A.h.h.D.g.A.z.h.A.h.h.h.h.h.h.h.h.l.h.h.A.A.G.S.H.l.h.Z.A.S.S.H.H.S.H.H.L.L.L.L.U.U.Y.T.T.T.~.~.T./.~./.~.~.T.!.~.~.~./.~././.~./././.~./.~./.T.T.~.T.~.T.~.Y.T.T.T.U.R.T.U.T.Y.!.T.T.T.!.F.n.F.T.(.T.(.!.~.[.!.!./.!.T.(.T.~.T.T.~.~.n.b.F.].(.!.(.(.!.[.T.~.~.^.].^.E.|./.(.Q.n.XX].y : * b.`.^.{.].n.Q._._.^.`._.(.[.{.(.].n.!.^._.{.(._. X{.`.'.'._._.|.{.(._.'.^.`.{.`.`.!.n.Q.].{._._. X_._._._.}.}.|._._._._._._.(.^.}._.|._.^.(.(.(.^._._.(._.(.(.{._.^.(.(.(.(.(.^.(.(./.(.(.(.!././.~.~.~.~./.T.~.~.T.~.T.~.~.~.^.~.[.~.~.~.~.~.~.~.~././.(.(.^./.(.(.^.(.(.(././.(././.~.~./.~./.~.~./././.~.~./.~.[.!.T.T.T.T.T.T.T.T.T.T.R.T.T.T.(.T.~.~.(.!.~.~./.^.(.(./.[.(.(.[.(._._.(.(.(.{.`.(.(.`.(.{.{.`._._.!.|.^.`.(.(.~.(.^.T.T.T.T.K.(.T.Y.Y.Y.T.T.P.~.T.T.~.T.~.N e = 0 A S > y ; U L.U.Y.T.T.T.T.T.U.T.T.T.T.T.T.~.T./.T.~.~.T.[.T.~.~.~.~.~.T./.(.(.~.(.~.).(.(./.(.(././.~.T.~.~.~.T.~.~.(.T.T.~.~.~.T.~.~.~.T.~.T.~.~.~.~.(.(.(./.(.(.(.(.(.(._._._.|._._.'.|.|.|..X|..X.X'..X.X.X X.XzX XdX.XdXdX.X@XdX.XdX.X.XdX@XdXdX.XdX@X'..X.X X.X.X.X.X.X.X.X.X|.|. X X|.[. X_._.|.|.[._.`.`._.|.{.'._.(.{.{._._.|.`._.{.^.|.^.`.|.}.}._.`.|.|.'..X|.`.|.|..X'.'. X`.|.|.'.^..X`..X.X.X|. X_. X@X.X.X'. XdX X'.cX XdX|..X|.|.|._.^._.(.[._.(.(.(.(.(.(./.(./.(./.(./.(.~./././././.~.~./.~.~.T.XX~.~.T.~.~.~.T.~.T.~.T./.^.~.T.~.~.~.(.(./.~.~.~./.(.(.`._.(.|.(._._._.(.(.(.R.!.R.~.T.T.T.T.T.T.T.T.U.U.T.U.T.U.U.T.T.T.Y.Y.T.Y.Y.T.T.T.T.T.U.U.U.L.Y.L.P.L.Y.L.L.L.L.A.",
+"m m m m m m B V m m M M M m N M m m u N A M M N N N N A A N N N B B B B B B B B B B B C B C B C C C C C Z A C C Z C C C Z C Z Z F Z Z Z Z D Z B C C Z Z Z F D Z Z S e $ $ o o & % % * : r r ; : r r r r r r r r r r r r r r r * r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r e r r r r r r r 0 r r r r r r r r r r r r r : r r r r r r r r r y r e 0 r r r r r r r r r r r r r r r ; ; * * $ $     # # $ n.`.(.|.|. X@X'.|..X.X X.X'..XdXdX.X.X.XzXzX.XzXzX.XzXzXzXzXdXdXdXcXdXcXdXcXvXcXdXvXzXzXzXzXdXdXzX.XdXdX@XxX#X.XzX.X.X.X.X'.|.|.|.{._.`.(.(.`.(.`.(.(.(.(.(.(./.~.~.~.~.T.T.T.T.T.T.T.T.T.T.[.Y.T.P.P.P.P.P.L.L.L.L.S.L.H.G.A.H.G.A.H.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.S.A.S.S.A.H.A.H.G.A.H.l.G.Z.S.S.S.H.A.A.G.G.A.A.l.l.l.l.h.g.k.k.h.j.j.h.z.a.j.j.d.i.z.i.f.a.a.a.a.i.k.i.i.f.f.s.a.a.a.s.f.i.u.t.i.i.i.i.a.t.u.s.u.u.u.s.u.u.i.t.u.t.t.t.r.t.t.t.t.t.t.t.e.t.u.t.t.y.t.t.t.r.t.r.t.u.t.u.u.t.u.u.u.p.u.u.r.u.u.u.u.u.u.u.u.u.u.u.a.a.i.k.f.k.f.f.g.g.k.k.j.k.h.h.z.h.h.h.h.h.h.h.h.A.h.D.A.g.S.h.h.h.k.h.h.h.h.A.j.A.A.h.H.z.H.G.l.Z.S.A.h.H.S.H.H.L.L.L.Y.U.U.P.U.T.T.T.~.~.T./.T.~.~./.~.~././.~./.~./.^.!./.~.~.~.T.T.~.~.T.~.T.I.T.!.T.T.U.T.U.T.T.T.T.T.~.T.T./.T././.R.(.~.!./.~.[././.~./.~.!.^.~.[.T.T.!.[.E.{.(.~.`.T.(.~.~.[.[.[.{.^.[.^.~.^.{.{.(.[.(.q > y [ {.).[.{.[.(.(.{.(.(._._.|.{.(.'.|.{.`._.{.{.^.`._._.(.(. X_._.{.|.`.|.'. X|.|.|.|._.{.|.|._.|._._.|._._.}.}._._.|._.|._.|._.|.}.}._._.`.`.(._.{._._.(.`.`.`.(.^.`.(.(.(.(./.^.^.(.^.(./././././.^.~.~.~.(.~.~.~././.~.T.~./.!.~.~.~.~.[.^.~.^././././.(.(.(.(.(.(.`.(.(.^.(.^.^./.^.^././././.~./.~.~.~.(./.~.~.(.T.[.T.(.~.T.T.~.T.T.~.T.~.~.~.T.~.~.~.~.[.~./.(.~.!.(.(.{.(.(._./._._._.(.(.^.`._..X(.(. X`.(.|.`.(.{.(.(.!./.T./.!.(.~.T.[.T.T.T.!.~.T.U.!.T.T.T.T.(.P.U.b.* t 0 r 0 ; 0 u Q.U.T.T.~.U.T.T.T.T.[.T.T.T.T.T.~.T.T./.T.T.~.T.~.Y.).~.~.~.(.T.).~.(.(.(.(.(.(./.!.(.(.!./.(.~.T.~.~.T.~.T.~.~.T.T.~.~.~.T.T.T.~.~.~.~.~.(.T.~.(././.(.(.(._.(.(.(._._.|.|.|.'.`.@X|.|.'.'..X.XdX.XdX@X.XdX@X.X.X X.X.X.XdX.X.X.X.X.XzX.X.X.XdXdX.XzX@X.X.X|..X.X.X|.'..X.X|.|.|. X X|.|.|.|.|. X{.|.|._.|.|.(. X(.|.(. X|._.|.|._.'.`.`.}.|.}. X_._.`.|.|.|..X{.|.(.|._. X_. X|.`.@X`.|.|.|.|.'.'.dX.X X.X.XdXdX'..X.X X@X|.|.`.|.|.|.|._.|._._._.(.(.(.(.).!.(./.(.(.(.^././.(././././././././.~.{.).XX~.~.~.~.~.~.~.~.T.~.~.~.~.~.~.~.~.~.~.~.(.~.~././.(.`.(._.^._._.|._.(.(././.(.R.~.T.T.~.T.~.Y.T.T.T.U.T.U.U.U.U.T.U.U.T.T.T.~.T.T.T.T.T.Y.T.U.T.U.U.L.U.L.P.D.L.L.L.L.P.",
+"m m m m m N m m M m M B M N C M N N N B N B B N N C N C N C C N B B B B N N Z N C N C N N C C C C C A C C C B C C C Z C F C D Z B D Z Z Z Z Z Z Z Z Z Z Z Z D Z Z Z H u $ o $ o $ $ % * ; ; ; ; r r r r r y : * y r r r r r : y r r r r r r r r r r r r r r r r q r r r r r r r : y * r e 0 r r r r r r r r r q y r r r r r r r r r r r r r r r r r r r r r * r r : r r r r r * * q r r r r r r r : q r r ; : * ; $ $ $     #   r ].'.`.{._. X X|..X|..X X.X.X.X.X@X|. X.XdXzX`.'.dXdX.XzX.XdX.X.XvX.XcXdXcXcXdXcXzXcXnXdXxXzXzXxX.XzX.XdXzX.XzX'.zX.X X.X.X'.|.|.}.}._.}.}._.^.(.(.(.(.(.(././././.T./.~.T.T.T.T.T.T.T.T.T.T.P.T.T.U.T.T.Y.L.U.L.L.L.H.L.Z.H.H.S.H.S.S.S.S.H.A.A.A.h.A.A.A.A.A.H.h.A.A.A.G.A.G.J.H.H.A.H.A.H.H.G.A.G.S.A.A.A.A.h.H.z.g.h.h.l.z.Z.g.g.k.g.h.g.f.k.i.z.k.d.g.f.i.a.a.z.i.a.i.a.a.a.z.d.a.a.a.i.z.i.a.i.i.i.i.u.u.r.u.u.t.i.u.s.u.r.u.t.t.t.t.p.t.r.y.y.t.t.t.t.r.r.y.y.y.y.t.t.y.r.r.t.r.t.t.t.t.t.u.a.u.t.u.t.u.t.i.u.t.s.r.s.u.u.r.a.s.t.s.a.a.z.f.k.k.k.k.k.k.z.k.k.g.k.h.h.h.k.h.h.h.h.S.h.A.h.h.l.l.l.l.l.h.h.h.h.l.h.l.A.h.A.A.A.A.A.S.S.S.H.H.G.H.L.K.H.L.U.L.I.T.T.T.T.T.T.T.~.T.~.~.~.~.~.~.~.~.~.~.~.~.T.(.T./.~.!.^.~.~.^.R.T.T.~.T.T.T.T.T.~.T.U.(.U.!.Y.T.T.T.[.T.^./.T./.(./././.(.!.(.{.~.(.~.!././.!./.~.(./.(.(.[./.^./.!.^.^./.(.(.(.(.(.(.(.(.{.].(.`.q r 0 [ (.|./.(.`.].(.`.`.^.`.(.`.^.(._.(.|.|.(.(.`.`.(.|.|.[.|.`._.(._.{._. XdX|. X|. X|.|.|._. X_..X_._.|._.`.`._._._._.^.^.|._._.|.|.|.{._._.(._._._._._._._._.[.|._._._.^.`.^.(.(.^.(.(.(.(.(.(.(./././.!.^./.~.(.~./.~././.~.~.~.~.~./././././.~.{.(.(.(.(.(.(._.(.|.^._.(.(.(.(.^.(.(./.^./.(.(.^././././.!./././.!.!.(.(.T.T.[.~.T.[.!.~.Y.T.!.~./.Y.!.T.(.T.^.^.{./.(.(.(.`.{.(.(./.{._.^.(._._.|.(.(.`._._._.`.(.`.(.^.|.(.(.[./.~./.!././.~.~.T.T.T.~.U.T.P.U.I.T.T.T.Y.T.T.F.T H S H _ T L.T.T.T.!.U.Y.T.T.T.T.T.~.T.T.~.T.T.~.T.T.~.~.~.Y.E.!.~.~.~./.].(.^./.(.(.(.^.^.{.(.(.~././.~.~.~.T.T.~.T.~.T.~.T.~.T.~.T.T.T.~.~.~.T.~.T.~.~./././././.(.(.(.(.(.(.(.|._.|.|.`.|.`.`.`.|..X.X.X.X.XdX.X.X.X.XdXdX.XdX.X.XzX.XzX.X.X'..XxX'..XzX.X.X.X.X.X.X.XdX.X X'..X.X.X|. X.X|. X X|.{.|..X`.`.`.`.`.`.|..X{.`. X}.}. X}._.^.`.`.|.`. X X'._.|.(._. X'.@X^.'._.|.`.'.@X X_.|.(.`. X.X.X.X X X'. X.X'.dX XdX'.@X|.dXxXdX X|.'..X|.|.|.|._.|._.|._._._._.(.(.(.(.(.(.(.(./.~.~.~././.^./.~././.~.~.~.~./.~./.~.~.T./.T./.T./.~.~.[.XX~.~.~.~.~././.!./././.(.).^._._._.|.{.{._.(.(.~.~.~.~.T.~.T.T.T.T.T.T.Y.T.U.T.P.P.T.T.P.U.T.T.P.T.T.T.T.T.T.T.U.U.T.P.P.L.L.L.L.L.L.L.L.H.L.",
+"m m m m m m m N M M M M B M M M N N B N B B N B N C C m C N N C C B B B C N m A N C N C C C A C C C C C C Z C C C C C C C D Z Z Z Z Z C C Z Z D C Z C Z Z Z D D H Z Z D u : $   o $ % % % ; * * r 0 r r r 0 : : * : 0 r r r y * r r r 0 r r r r : r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r * : r r r r r r r r r r r r r r r r y * r r y r r 0 r * r r r y r e 0 e r 0 r ; e e ; ; * ; * & $ $   #     $ I ].dX^.^._.|. X|.|.|.|.|..X|.|..XdX'.fX@X.X.XdXdXdX@X.XzX.XxXdXdXdXdXcXdXvXdXcXdXcXzXdXdXdXdXcXdXzXdXzX.XdXzXhX@XdXdX@XdX.X.X.X X}.}.}._._._.|.(._.(.!.(./.(././.T./.~.~.~.T.~.T.T.[.T.T.P.T.P.T.T.T.T.T.U.Y.L.L.L.L.L.L.H.L.D.P.H.H.S.S.S.A.A.h.A.A.S.g.A.g.A.D.A.A.A.A.A.G.A.A.g.A.A.A.A.H.A.A.A.S.h.G.S.D.D.L.A.Z.A.G.Z.A.h.j.z.a.d.j.a.j.f.a.d.i.i.i.i.i.i.i.d.a.i.i.a.z.d.a.a.a.a.a.a.a.i.i.i.i.i.a.u.u.t.u.u.i.t.t.u.u.t.u.i.t.t.u.t.t.r.t.t.p.u.t.r.t.u.t.r.y.s.y.t.w.y.r.r.t.y.r.y.u.u.t.w.i.r.t.u.u.t.t.s.t.r.t.t.r.u.r.u.u.u.u.s.i.a.a.a.g.k.a.f.k.k.k.a.z.k.k.h.k.k.k.h.k.h.h.z.D.h.A.h.l.l.l.h.l.l.h.h.h.l.l.l.l.A.A.A.A.A.A.A.A.A.S.H.Z.H.H.H.H.H.U.L.L.L.Y.U.U.T.T.T.~.T.~.T.~.~.~.~.~.~.~.~.~.~.~.(.~.T.~.~.T.T.(.U.T.~.~.T.Y.T.T.T.T.T.T.T.T.L.T.T.T.P.T.T.T.T.~.I.(.(.R.(.E.~.[././.!./.~./.(.~./.(.~.T.(./._./.~._././.~.[.(./.!.^.{.~.^.~.|.^.(.`.`.|.b.[ [ Q.(.^.(.(.^.(.`.(.{.(.(.(./.(.{.(.(.(.^.{.^.^.`.`._._._._.|._.(.(._.{.^._.|.|.|.|._._.`.|._.{._. X`. X_.|.|._._._.`.|.|.|.|._.|.|.|.|.|.(.|._._._._._._._._._._._._._.`.(.{._.(.|.(.(.(.E././.(.(././.^.~.(.~././././.[.!.~.~.^.~././././.(.^.^.(.(.(.(.(.(.[._.^._.|._.|._.^.`.^.(.(.(./.(./.(.(./.(./.(.(./././.(.~././.Y.(.U./.U.T.(.T./.~.T.T.~.{././.~.(.(.{./.(.{.|././.^.`.(.`.(.`.|.(._.`.^._._.`._._._.(.|.{.`.^.~.T.(.(.(.~./.!.T.T.R.~.U.~.L.!.H.(.T.U.I.L.T.L.T.U.U.Y.T.I.!.R.T.U.T.U.T.T.E.I.Y.P.~.T.T.T.T.T.T.T.~.T.T.T.~.T.T.T.~.T.~.~.~.~././.E.(.(.(.(.(.{.(.(.(.).{.{./.(.~.~.~.~.T.~.T.T.T.T.~.~.T.~.T.T.T.T.~.~.~.~./.~./.~././.(././.(.(.(.(.(.{.{.}._.`.`.|. X`. X.X.X.X X@X.X.X.XdX.X.X.X.X.X.X.X.X.XzX'.zX'.zX.XzX'.zXxX.X.XdX.X.X.X.X.X.X'..X.X.X.X.X|.|.|. X].b.[ [ [ b.b.'.^..X`.(.|. X}.|.|.}.|.^.|. X|.{.|. XdX`.|._.@X_. X_.|.|.'. XQ.P Z |. X X].` P S [ .X'.@X Xn.H ) [ '.@X'.Q.b.[ b.[ ` @XdX|.|..X|.|.|.|._.{.|._._._.(.(.(.(.(.^.(.(./.(./.^.~.~./././.(./.~.(./.(./././.~./.T.R.~./.T.~.~.~.~.~.U.XX~.~.~.~./././././.(.(.{.(.(.(._.`._._.|.(.(.(.~.~.~.~.Y.Y.~.T.T.T.T.U.U.Y.P.T.T.P.U.T.T.T.T.T.T.T.T.T.T.T.U.T.P.P.P.L.L.L.L.P.S.L.L.D.D.L.",
+"m m m m N m m N M M N N M B M N F N N B B B B B C N N N A N C N C B C B A N B B N B C C C N C A C C C C C C C F C C F B Z C B F C Z C F Z C Z B F D B Z Z Z Z D Z Z Z D Z Z A $   o $ o $ % % * 0 * * : : r r q : : y r r r r = r e r r e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r : r r : : r r e ; r * % = * % $ $ o         * n..X`.(.`._.{._._.|._.@X X|..X.X|..X X'..X.X.X.X.X.X'.cX.X.XzX.XxXdXdXdXdXvXmXdXdXcXzXvXzXzXnXxXdXdX.XzXzXzX.XxX.XxX.X.XcX.X.X.X'. X|.}.}._._.`._.^.|.^.^.(./././.~.(.T.~.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.U.Y.T.T.U.L.L.L.L.H.S.L.U.H.H.S.S.S.S.S.A.A.S.S.A.A.z.A.A.h.A.A.A.A.A.A.A.A.H.A.H.g.A.A.A.A.A.A.h.H.Z.S.z.A.A.H.G.l.h.h.h.j.z.g.d.d.f.z.a.a.i.z.i.i.i.d.f.i.i.s.a.i.i.a.i.a.s.i.s.s.i.a.i.i.i.i.i.i.t.t.s.u.t.p.u.u.t.r.t.i.t.r.t.u.t.t.r.t.t.t.t.u.t.t.t.u.r.u.w.G w.t.r.r.t.E E G E w.t.r.w.t.t.w.T T r.t.t.t.r.r.t.T E G p.u.u.u.i.u.i.a.a.k.k.a.f.k.k.k.g.z.g.k.g.g.g.g.z.z.l.l.g.A.h.z.l.z.h.l.l.l.l.h.h.h.h.g.A.A.l.A.A.A.A.h.A.S.A.H.H.H.H.H.K.H.L.L.U.L.L.Y.T.U.T.T.T.T.~.T.~.~.T.~.T.^.~.T.~.~.T.~.~.U.~.~.~.T.T.P.R.Y.T.U.~.~.T.T./.U.U.U.U.T.U.U.T.T.(.~.(.T.^.~.~.(.(.~.(.(.(.{.(.{.!.[././././.!.(.^.^.^./.(.(.(.~.^.E.(.^.{._.(.(.{.^.^.`.`.^.{.(.`.|.[.(.{.{.~.^._.^.`.^.`.^.(.(.(.~.`.(.(.(.|.{.(.{.(.`.|.`.}._.|. X X{.|._.`..X|.|. X'._._.|.|.(._.@X X{._.`.|._.`._.|.|.{.(._._._.|._.{.|.|._.|._._.|._.{._. X_. X}.}.}.}.}._._._.|.(.(.^.{.^.(.|.(.(.(.(.(.(.(.(.(./.(.~././.[.^.~././.E././././.(./.(.(.(.{.^.(.}.}.}.|.|._._.|.|.[.|.^.(.(./.(.(.(.(.!.(./././.(.^./.b.[ e.[.[.n.[ T U.T.~.~.~.[.T.^.[.[.T.~.[.[.[.~.[./.`.~.(.).b.[ F.(._.`.^.`.)._.{._.|.|._.(._. X'.(._.`._.{.{.[.{.(.T.~.~./.T.~.R./.n.Z H T.U.T.P.` A Z [ T.U.L.Y.T.K.T Z Z Y.[.L.U.T.U H Z Y.~.~.~.T.~.T.T.~.T.T.T.~.~.T.~.T.Y./.~.~.(.K././././.(.~.(./.(.(.).(.^./././././.~.T.T.~.T.~.T.~.T.~.~.~.~.T.[.~.T.T.~.~.~.~.~././.(./.(.(.(.(.(.(.(.{._._.^._.|.`.|.|.|..X|.'..X'..X.X.X.X.X.X@XdX'.dX.X.X.X'..XzXzX.XzXzX.XzX'.#X.X.XxX.X.X.X.X.X'. XdX'..X.X.X.X.X|. Xm.y e 0 q r y Z `.{.|..X`._.|. X_._. X X_.'.|.(. X(.}.`.@X|. X|. X X_.|.dXQ.S * y _. X'.y > u y y [ .X.X) = u u : Z '..XI > y : t y .X.XdX.X|..X X|._.|.|.|.`._._._.(.(.(.(.(.(././.~./.~.~./.~././.^././.^./././.(./././././.~.~.~.~.~.~.~.E.~.~.~.~.~./././.(./.(.(.^.(.(._.^.^._.(.|.^._.{.(./.~.Y.~.T.~.T.T.T.T.Y.U.T.T.Y.U.T.U.T.T.U.P.P.T.T.T.P.T.T.T.T.P.P.P.L.L.L.L.A.L.L.L.L.L.P.L.",
+"m m m m m m m N M M M N B M N B N N B B B B B B N N C A N C N C N B C B N Z B N C C N C C N C C C C C C C A C C A C C Z C Z C Z Z Z Z Z Z Z F D B Z Z Z Z D Z D U C Z L D Z D A * $   o o $ $ * % : % y : = y : y r r r r r r t r r r r r r r r y * r r r r r r r r r r r 0 e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r 0 : r r r r r r r r r r ; r r ; : * r % & $ o         & _ ].^.^.^.[.|._.(.|.|.|._.|.|.|.|.|. X'. X X X'..X.XdX.X.X'.zXdX.XxXzX@XcX.XvXdXdXdXdXcXzXzXzXzXdXdXdXdXzX.X.XzXvX.X.X.XdX@X.X.X.X.X'. X X}.}._._.`.|.^.(.(.(.(././././.~./.Y.~.~.~.~.T.T.T.T.T.T.T.T.T.T.T.T.Y.U.U.L.U.L.L.L.L.L.U.S.L.H.S.S.S.A.A.A.A.S.h.A.A.A.h.l.A.h.A.j.A.g.A.A.H.A.A.h.H.A.A.A.A.Z.A.H.Z.0 0 0 = = > A T A.j.h.z.a.h.z.z.z.a.g.a.Z : : d.f.0 : A i.i.i.z.i.a.i.i.a.a.i.i.i.z.i.i.i.i.T = > G E T > q u.p.y 0 B w.p.p.p.t.u.w.t.r.r.t.y.t.u.t.t.u.t.T q = T r.y.E T q 0 e e A E t.u.E G q q = = G u.r.u.T m q q * C E u.u.i.i.a.a.a.a.a.z.f.f.f.k.a.g.k.k.k.k.g.g.l.l.l.h.h.h.h.S.l.S.h.l.l.l.l.l.h.h.h.A.l.l.A.A.h.A.A.A.A.A.A.S.H.H.H.H.H.L.H.L.K.R.L.U.U.T.U.T.~.T.T.T.T.T.~.T.~.T.~.~.T.~.~.T.T.U.T.~.!.I.T.P.` S H J Y Y.T.U.J.T.XXT.T.T.U.~.~.T.XXP././.T./.~.~.T./.` [ [ [ [ [ F.(./././.(.~.(.(.^.(./././.(.^._.{._.^.[.E.[.(./.|.^. X!._.|.[ [ F.{.(.{.{.{.|.`.^.^.(./.`.`.(.{.|.(.(.`.(.(.(.|.(.^._.(.'.}.~._.[ P b._._.'.[ I J ` Q.dX|.|.Q._ ) S n..X{.`.~.` S ) n._.|.`.`.(.|.|.|._._.|.|._.|.|._.|._._._._._.}.}.}.|.}.|.|.|._._.|._.|.(.(.(.(.(.(.(.(.(.(.(.{.(.(.(.^.(.(.E./.^./.^./.^.(.(.(.(.(.(.^.{.|.|.}.}.}.}._.{.{._.|._._._._.|.|.{.(.(.(.(./.(.(.(./.(.^.H r q [.T.b.= e n.~.(.(.T.~.T.!.[.(.T.(.^./.!.(.[.(.!.{.^._.= * [ (.`.`.(.(.`. X|.^._.|.{.{.|.`.`.{.{.`.^.^.~.|.].).~.~.(.~.~.~.T.F.S : = T.[.Z.> > u u = U ~.L.P.I.[ r * > !.U.T.I.T y e > T.U.T.T.~.T.T.~.T.~.T.T.T.T.~.T.~.!.~.~.~.~.(././././.(.(.(.(.^.(.[.(./.{./././.T.~.~.~.T.~.T.T.T.T.T.T.T.T.~.T.T.~.~.T.T.~.T.T.~././././././.(.(.(.(.(.^._.|.|.|.`.`.`.'. X.X'..X.X.X X@X.X.X X'. X X.X.XzX.XzXzX.X.XzXzX.XzX'..XdX.X.X.X.XzX XdX@XdX.X@X.X.X.X.X.X.X.X.Xn.0 0 J [ y e > '.{._.Q.[ [ F.].`._.Q.n.~.[ n._.F.Q.].b.[ ]..X|.'.|.|..X) : y * : '.|.b.0 u '.'.y = !.Q.: y dX].` b.].fXS y [ c.b.[ '..X X.X.X.X X'.|.|.|._.`._._._._.|.(.(.(.^.(./.(.~.~.~.~././././.!.~././././.E./.~./.~./.R././.~././.~.~.~.~.~.~.~.~././.(.(.(.(.(.|.{.(.|.(.(._.^.|.|.^.(.~.T.!.T.T.Y.T.T.T.T.P.T.T.U.U.T.T.T.T.U.T.P.T.U.U.U.T.P.T.T.U.T.U.P.L.P.L.P.U.P.L.L.D.L.D.L.",
+"m m m m m m m N N N N N N N B V V V B B B N B B C m C N N C C N C V B C B B N C C B B B C C C C C B B C C C C Z C C C B C C Z C D Z Z Z Z Z Z Z D B D Z Z Z D D C L D Z G Z Z G Z C %   o o $ $ $ % % * : r r ; : : ; r : = r r r r r r r r r r r r r r r r * : r r r r r y r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r e q r r r r r r r 0 : r : y * r : q : 0 r r * * % % $ , o           A ].^.(.).(.^.(.(.(.|.|._.|.|.|.|.|.|.'. X X|..X.X.X.X.X.X.X'.zX@XzXdXdXzX%XdXcXdXvX.XdX X%XxXdXzXzXzXzX.XdX.XzXzXzX.XzX.XzX.X.X'.zX.X.X.X|.'.}.}.}._.|.(.}.{.(././././.~.~.~.~.(.T.T.~.T.~.T.T.T.T.T.T.T.P.T.T.T.T.P.P.P.L.L.L.U.L.L.L.D.U.S.S.S.S.A.A.A.A.h.A.h.h.A.l.A.l.h.h.h.A.h.A.z.A.A.A.h.H.z.h.A.A.z.H.A.A.e : r r e * * q G Z.z.j.k.i.k.k.a.a.a.a.C ; 0 i.u.0 > N k.a.k.r.i.t.a.t.f.i.i.a.s.s.u.u.a.a.w.q 0 T R B : = t.i.: * B u.t.t.y.r.r.t.r.r.r.t.r.t.p.r.t.t.T q 0 0 G r.E E : 0 = m e * m E y.C * 0 y u ; t T t.w.q 0 r A * > N p.u.u.a.i.a.a.a.f.a.a.k.a.a.a.z.f.k.g.z.g.g.h.h.l.l.l.A.h.A.A.h.h.h.l.z.h.l.l.l.g.A.h.h.h.A.A.A.A.A.G.A.S.S.h.H.G.H.L.L.K.L.U.U.L.U.Y.Y.T.T.T.T.T.T.T.~.T.~.~.T.~.~.T.T.T.~.~.U.T.~.Y./.Y.Z q r = 0 > Z ].H.U.U.Y.Y.~.T.T.~.U.T.!.).~.{.T.T./.(.~.!.q : q y q q [ (.(.^./.^.(.(.(.%X(.^.(.(.[.(._.^.^./.^.(.(.^.{.).{.(.^._._.q y [ (._.'.|.`././.{.(.(.(.(.(.`.R..X(.(./.(.(.|.`.(.|.|.^.{._.`.[ r q [ ^. X[ y : / 0 u Q. Xn.0 = J r y F.`.Q.y q P * > n.~._._._._.{.|._._.|._.|._._.|._.|. X_.}.|._.}.|.}.}.}.}.}.|.}.{.}._.^.|.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./.(.(.(.(.(.(.(.(.(.(.`.|.|.}.}.|.}.}.}.}.}.}.}.}.}.}.|.|.^.{.^.(.(.(.(.^.(.(.(.(.(.H 0 0 [.~.[ y > n.T./.b.b.[ [ U.{./.n.F.].b.[ n.(.T b.K..X_.: e _ b.[ Q.|.(.F.Q.].|.F.n._.{.Q.F.Q.[ n.(.].[ [ !.n.n.!.!.T.T.~.T.J q 0 0 y L.].T e B P.F.y y b.XXK.b.: > : r U.I.I.b.> : * e T.T.~.~.~.T.~.~.T.~.T.~.~.T.~.~.~.~.~.~.~././././././.~.^./.(.(.(.(./././././.~.~.~.T.~.T.~.T.T.T.T.(.T.~.T.T.T.~.T.~.~.~.T.~.~.~.~.~.!./././.(.(./.(.(.^.^.|.(.|._.|.|.|.|..X X.X.X|..X.X.X.X X@X.X.X.XdX.X.X'.@XdXdXdX.X.X.X.X.XzX.X@XdX'.zX.X.X.XdXdX.XdX.X.X.X.X.X X.XQ.* y K [ u : _  X.X` = * q * [ {.F.: = J y [ n.y : S q r q  X.X|._. X.X= Z J : ; |..X[ : P dX.XS y b.b.> K [ ) _ ]. XbX: e [ b.n.].cX.X.X.X.X.X.X'..X|. X|.`.`.|._.|.}.(.(.(.(././././.~.~.!.~.~.~././././././././.~.~.~.~.T./.(.!././.~.~.~.[.T.~./.~./././.].(.|.(._.^.(.^.{.(.{.|.^.).{.(.(.~.~.Y.T.~.~.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.Y.P.T.P.P.P.T.T.L.U.T.P.P.U.U.P.L.L.L.S.L.H.L.S.U.",
+"m m m m m N m N m M M N N B B B N B N B B B B B N N N C C C N C B V B B Z B C A B C C B B B A C C u C C C D C C C C D Z Z Z C Z B Z C Z Z D B D Z Z B Z Z Z D Z Z C D D L Z Z Z Z Z Z u $     o $ $ $ $ % % % ; : * : r r r r 0 r r r r r r r r r r r r r : y y r r r r : * r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r e r r r r r : 0 : y 0 r r y r r > ; * % * $ $ o     #     e M.(.~./.[.{.(.{.|.`.`.`.(. X|._.`._.|.|.|.|.|. X X|..X.X.X.X.XzX.XdX X#XdXdXdXdXdXdXdXcXdXvXdX.XdX.XzXzX.XzXdXzX.XzX.XzX.XzX.X.X.X.X.X.X.X'.|. X}.}.|.|._._.[.(.(./././.~.~.~.~.~.T.(.~.T.~.T.T.T.T.T.T.T.P.T.T.T.U.T.Y.U.P.Y.L.L.U.S.L.Z.L.H.H.G.S.S.A.A.z.A.A.A.h.A.h.A.h.l.A.h.h.A.h.h.A.A.h.z.h.G.S.l.A.l.z.h.Z.A.0 > y T T U q r q j.f.e.T d.k.i.T T i.a.C r 0 i.i.0 0 A s.w.w.T T G T p.s.E T T f.t.s.T T w.y.G T t.t.V r r t.w.: 0 V E u.w.G T G R E y.t.t.t.u.t.t.T B q q * e G t.y.T 0 q G r.T q 0 G w.q : A E r.= : C E G 0 = T T T : q T i.a.a.i.i.i.a.a.a.a.a.z.a.g.i.f.f.z.a.g.z.k.h.l.l.l.h.h.h.h.h.A.A.h.H.G.l.l.l.G.g.h.Z.A.h.A.A.A.A.h.W.S.S.H.H.H.H.S.L.L.L.U.L.R.L.U.Y.U.U.U.T.T.T.I.I.T.K.T.T.T.T.~.~.T.T.~.T.T.T.~.I.n.q * L n.V = N F.U.P.[ b.T b.K.Y.Y.n.b.].T e.n.(.(.!.^.^.{.= q u [ [ [ n.Q.n.!.b.` ~.!.` [ [ b.!.(.].F.b.].T [ Q.(.!.`.n.T b.n.}.^.(.n.Q.T._.].[ [ ` ].(.(.(.!.b.` [ ].].).(.^.b.[ b.].`.|.(.^.|.(.n.A * e y [ |.|.y 0 b. Xb.0 ) '.J 0 [ dX[ 0 P `.) 0 [ .X[ [ b.`._._._._._._._._.|.|.|.|.|.|.|.|. X|.|._.|.}.|.|.'.|.|.|.}.}.}.}.|._.|._.`.^.|.^.|._._.^.(.(.(.{.(.(.(.^./.^.{.(.(.(.^.(.^.{.`.`._.`.|.|.|.}.}.}.|.}.|.}.}.}.}.}.{._.|.(.`.(.(.(.(.`.(.(.(.(.(.S r y [ [ F r y n.(.Y q q q * r Q.(.0 0 C 0 y : L q > = F.{.; q > q : y ].].q q b.|.y r [ _.r : S y Z ].q ; y A = q b./.~././.T.0 u H r y L.T.` ; A U.P.u 0 [ J.A.q m P q > U.R.n.m u I e e T.~.T.~.T.~.T.T.~.T.T.T.~.~.T.~.~.~.~.!.).~./././.!.(././.(.(./.(.(./././././.(.~.T.~.T.~.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.~.T.~.~.~.~.(./././.(.(.(./.|.(.|.`._.|.|.|.|.|..X.X.X.X.X.X.X|..X|. X|. X X.X.X.X.X.XxX.X.XdXdXzX'.zX'.zXzX.X.X.X.XzX.X'.dXdXdX.XdXzX.X.X.X.X.Xn.y * y y * y F..Xn.; r n.m.0 q Q.n.* = S n. XQ.: y ` [ > q Q.`..X X'..Xn.'.b.: : @X@XQ.* = n.[ y : v.b.e > A y > y '.].y > t r r S _..X.X.XdX.X.X.X.X.X.X|. X X_._.|.[.`.(.(.(.(.(.~./.~.~.~.(.~./.~./././././.^./.~././.(./.R.!././.!.~.~.~.~.~.~./.T.~.[.(.(.(.(.(.(.(.(.(.(.(.|.(.(.(.(.(.~.!.T.~.~.T.T.T.T.T.T.T.Y.P.T.U.T.T.T.T.T.T.Y.P.P.P.P.P.P.T.T.U.U.H.P.P.U.L.L.L.L.L.L.S.L.P.D.",
+"m m m N M N m N m V N N N V N N N B N B B V N B m C N C N Z Z N B B V V B A N N C B C B Z C C C C C C C B C C C C Z Z C C Z Z C Z Z Z D C Z Z B Z Z D Z Z D Z Z D Z Z Z Z Z D D L H Z G L y $     $ o $ $ $ % % * % : e r r r r r r r r r r r r 0 r r r r r y * r r e 0 r r r r r r r r r r r r e 0 r r : r r r r r r r r r 0 r r r r r r r r r r r r r r 0 r r r r r r * t * r = r * % % $ $ $     #       e v.(./.^.!.(.(./. X^.^.`.(.`.`.|._._.|.|.|.|.|._.|.|..X.X.X X.XzX.X X.XdX XdXdXcXdXdXdXdXdXvXdXdX.XdXdXzX.X.XzXdXzX.XzX.XzX.XvX.X.XdX.X.X X.X.X X.X X|.|._.|._.(.{.(.^.(././.!.~.~.~.T.T.T.T.~.T.T.T.T.T.T.T.T.P.P.T.T.Y.T.Y.U.U.L.L.L.L.L.L.L.S.L.A.G.H.A.h.A.A.A.A.A.A.A.A.h.D.l.h.h.h.h.h.h.l.l.A.A.h.S.l.l.l.l.g.z.A.h.= y q S.z.h.Z > = T e.y q T f.T q q G i.Z ; = i.d.: ; C p.T e * * = > G r.C > q T s.G y = T T q q G p.A r e t.t.t > Z p.t.G = % = e q T t.t.w.p.t.u.G = = C q q R E y.G y : T y.E e = A E * = G u.u.m ; y w.B q q p.r.T : = G r.a.a.u.i.i.i.a.i.a.k.a.f.a.g.f.k.k.g.g.g.h.h.h.l.l.h.h.A.A.h.h.g.A.h.z.h.h.h.h.A.A.h.A.A.A.A.A.A.A.H.A.H.S.H.H.L.L.L.L.L.L.U.U.L.U.U.L.Y.T.U.I.U.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.F.q r u Y b.].U.T.U.C > = y * A !.b.0 q S q = y ~.(./.~.~.^.> 0 u ` [ b.(.F > J y q U.S r : y ; C [.n.= y C q ; y ^.`.P y 0 : y Z [.{.q = b.F.y = u > u ].~.].y > * y = b.(.Q.y r q = u Q. X(.|./.`.[ q [ : r [ {.{.r r n..Xn.y y .Xy : m. Xn.= y '.y * b.P P b.`.`._._._._._.|.|. X|.|.|.|.|.|.|.|._.|.|.|.|.|.|.|.|.|. X|.}.}.}.}._._._._.|.`.|.(.`.{.^.|.^.[.(.(.(.(.(.^.(.(.^.^.(.(.(.`.(.|.`._._._.|.|.|.|.|.}.}.}.|.|.}.}.|.}.|._._.|.(.|._.^.`.^.`.^.`.(.`.S t % q * : e ; Z.~.[ I ` n.u r [ (.y * Z n.: r A n.r * [ {.q r P ].y y I dX: * [ .X: q [ '.; q q b.!.b.q * F.[ y q n./.~.~.~.T.b.].) r > T.Y.Z.; y T T > : T F.A y n.T 0 y T.T.y > n.[ 0 e !.~.~.T.^.~.~.~.T.^.T.T.~.~.~.~.~.~./.~././.!./././././.(.(.(.(.(./././././.[.~.T.~.T.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.~.~.T.~.(.E.^.~.^.(.(.(.(.{.{.(.^.|.{._.|.|.|.|.'..X|.`..X X.X.X|. X'..X X.X.X.X.X.X.X.X.XdX'.'.#X'..X.X.XdXdX.XzX'.dX.XdXdXdX'..X.X.X.X.X.X.XQ.y r S b.I y 0 n.[ y : U H y q [ n.: y F. X|.n.q 0 F.Q.0 = n.@X'. X.X|..X'.b.; > '..X'.[ = q y y y b.b.; y hXdXu > b.].b.[  X].u q b..X.X'.'..X.X.X.X|..X|.'.|.|.|._.|._._.(.(.(././.~./.~.~.~.~.~.~././././././././././.~.~.(./././.~.~.~.~.~.~.~././././.(.].`.{.(.^.(.(.(.^.(.(.(.(.`.^././.(.~.Y.T.T.T.T.T.T.T.T.T.T.P.T.T.T.T.T.T.Y.Y.P.P.P.P.P.P.U.U.U.U.T.L.P.A.L.L.S.L.S.L.H.P.P.L.",
+"m m M M m m M M m N N N N B N B m N B V B B B V C m C N N N N C B D B Z B Z B Z N C B C C N N A C B C C C A C C C C C Z C C Z C Z C Z B Z Z Z D B Z Z Z C G B Z G Z H Z Z Z D Z S Z Z Z H L D u o       $ $ $ & % * % % 0 r 0 e r r r r 0 r r r y r r r r r : : r r r r r r r r r 0 e r r r r r r r r r r r r r r r r r r r y r r r : r r r r r : r r r r r r r r r r r * y : * : % % - $ o             0 [ ].(./.^.!.`.^.!.`.(.|.`._.(._.^.(._._.|.|._.|._.|.|.|..X X X'..X.X.XdXdX.XdX XdXdX.XdXcXdXdX.XdXdXdX#X'..XzX.X.X.X.X@X.XzX.X.X.X.X.X X'.dX@X.X.X X|. X|._._._.|.(.(.(.(././.~.~.~.~.T.(.T.~.T.T.T.T.T.T.P.T.P.T.T.T.T.T.P.U.Y.L.L.U.L.Y.L.L.L.S.L.S.H.H.Z.A.A.A.A.h.A.h.A.h.h.h.k.h.h.h.h.h.h.S.l.A.h.h.A.h.l.l.h.h.G.l.A.g.e : 0 j.z.z.Y t y G T > : G i.T q = Y a.C e 0 i.u.; ; A a.V = q e.T N G r.T = q T u.N e * s.T = = T r.u r r r.t.0 r A w.T q * C G q 0 0 E u.r.t.u.r.y.G T T * 0 G r.t.T r = q C u * 0 m T * = T E w.C : > w.m q = t.t.T e ; T t.i.u.a.i.a.i.i.a.a.a.a.k.f.f.g.a.g.g.g.g.h.h.h.l.h.A.j.S.g.A.h.Z.h.A.h.A.W.h.A.h.A.A.A.h.j.A.A.A.A.H.G.A.H.H.H.U.H.L.L.L.U.L.Y.U.U.U.U.U.U.U.I.Y.U.I.Y.T.P.T.T.T.T.T.T.T.T.T.T.T.U.I.P.[ y t t > = [ Y.F.T S b.` r 0 b.Z.; 0 ) ` r q n./././.|.~.y e 0 0 * q ].L = y [ n.].[ L b.b.q > n.F.= ; ` ` y y F.F.: > b.n.y H n._.* y ` b.0 0 Q.b.b.].^.J r F !.U y _ |.U = P ].S * J !.|./.|.(.F.Q.hX= r b._. XP 0 ) n.H = q  X: * n.@XQ.e 0 |.: r * S r q [ (._.[._.}.}._.|._.|.|.|.|.|.|.|.|.'.|.|.|.|._.'.|. X'..X|. X|.}.}._._._.|.^.`.`._._.`._._._.|.(.(.(._.(.|.(.(.`.^.`.`.`.(._._._.`._.|.|.|.|.|.|.|.|.|. X X X X}.|.|.|.|._.`._._.|.|.(.(.`.^.^.`.S 0 q [ [ S * ; Z.~.L.[ Z y * q e.(.* t [ ].0 0 b.].> * b.'.> ; [ |.J ; K '.r : b.|.r y [ `.r q [ |.[.[ > * {.Z.y = b./.~.~.~.~.!.I.e.0 ; T.Y.T.Y y : t u r T H ; S Y u t r T L y u T Z e = T ^.T.~.T.T.T.T.~.T.~.T.~.T.~.~.~.~./.(.R././.~./././././.(./.(.T.(.!././.~.~.~.T.~.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.R.~.^.~.~.~.(./.^.(.(.^.^.(.|.{.`.`.|.|.|..X|..X.X'..X.X.X.X.X.X X.X.X.X X.X.XdXdX.XdXdX.XdX'..XzX.X.XdX.X'.zXzX@XzXdXdXdX'.dXzXzX.XzX'. XQ.y 0 [  Xn.r > ` b.r = [ b.[ [ F.Q.q = n.{.|.F.> ; Q.n.y y Q..XdX'..X.X.XdXc.y y  XdX'.@Xm.Q.'.y 0 m.m.; S @X X) ; b.xX].Q.dXdXS : b.dX.XcXdX@X.X.X.X.X.X.X X|._._.}.^._.^.(.{.(.(././.~.~.~.~.~.~.[././.(././.(././././.^./.~.(././.~.~.~.[.[.~.~.T.(.~./.(.(.(.(.(.|.(.(.(.(./.{.|./.(.(././.~.~.~.~.T.T.[.T.T.T.T.T.T.T.T.T.T.T.T.T.P.U.P.P.P.P.P.P.P.P.L.L.L.L.P.L.L.L.S.L.L.L.D.P.P.A.",
+"m m m M M m M M m V m V N N B N C m N C N m B B B N N C C N C N N C C N C N N Z N Z C B C B C B C C V A N Z A C C C C C C C Z C Z C Z B D Z Z Z Z Z C Z Z Z D D Z Z Z D F D D D D D D D H H H H I y &         $ $ $ $ $ * = % * ; ; : ; : y y = * : y : : : y * r r r r r : r r : 0 0 : : r r r y 0 : r ; r : q : r y = : * y r r ; ; ; r r r ; y ; > ; r r ; * r 0 0 0 * * % % % $ o       #       t n.(.~._.(.~.^.^./.(.(.(.(._._._._._._._._.}.}.|.}.|.|. X X|.|..X|..X.X.X.X.X.X.X.X.X.XdXzXdXdXzXzX@X'.dX.XzX.XdX'.dXdXdXdXzX.X.X'..X.X'..X.X.X.X.X X.X|..X|.'.|.|.|._.`.(.^././.!./.~.~.~.~.~.T.T.T.[.T.T.T.T.Y.U.P.T.T.P.T.Y.P.P.U.U.L.P.U.L.U.L.S.U.S.H.H.A.S.A.A.A.h.A.h.j.h.h.h.h.h.h.h.h.g.h.l.l.h.h.l.l.l.h.h.h.h.h.j.h.G.g.0 e * g.j.j.T : : T T y q T i.T q = R p.V ; e u.u.; y V u.T q * u B T w.u.p.q e Z t.= 0 T u.T 0 0 T r.u 0 ; u.u.0 = A E C 0 q Z T V 0 0 G p.t.r.t.t.p.t.t.T 0 e G E E y.B q = 0 q 0 0 q T * q G r.y.C * = w.Z r 0 u.t.T = > T u.u.u.u.i.u.u.a.u.a.a.i.k.f.g.z.g.g.g.g.k.h.h.z.g.l.l.S.z.h.H.z.A.A.h.A.Z.j.h.A.A.A.h.A.h.A.h.A.A.D.D.A.S.H.H.H.L.G.L.L.L.L.L.U.Y.U.U.P.P.L.P.U.P.U.U.U.U.I.U.T.T.T.U.T.U.U.T.T.L.T.P.Y.].].T T A : q [ T.b.` C * : q b.A.0 y n.F.= r n.[.^.[.(.(.: y u [ [ b.(.S y A _._._.n.[ S 0 : q F.F.0 ; n.F.r ; F.b.r > `.`.^.|.{.{.y > [ F.: > 0 : S !.(.e : b.(./.{.~. X* : [ {.b.: = {.{.`.`.(.`.(.(.y * [ |.|.Q.u > y S ; y .X> ; Q._.n.y r '.: : [ |.F.= y  X|.(.(.`._.`.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|..X|.'.|.|.|.|. X|.'._.|._.|.}.}.}.}.}.[._._._._.[.|.^._._._.|._._.}.}.}.|.|.`.`._.|.|.|..X X|.|.|.|..X_.|.|.|._._.|.|.{._.|.}.[.}._._._._.(._.S ; = '.~.b.0 : Z.!.= > Y n.; = [ ].r r [ /.0 : [ (.; e b.^.r ; b.].S r Z  X; y [ '.e : b.].r ; [  X(.b.= q ].n.> q b.(.T.~.~.^.T.T.[ r 0 Y.I.I.U.b.f.F.y y b.C ; = t : : y 0 S 0 = q ; : e 0 !.~.~.T.T.~.T.~.Y.~.~.~.~.~./.~.~./.~./././.~./.~.^././.^.{././.~././.~./.T.~.T.~.U.XXU.P.T.T.T.T.T.T.T.U.T.T.T.T.T.T.P.~.T.~.T.~.T./.T.~./.(././.(.(.(.`.{.(.(.^._.|.|.|.|.'. X.X|..X.X.X|..X|..X|.|.'..X.X.X.X.X.X.XdX.XdX.XdXdXdX'.dXzX.XdXdXdXdXdXdX.XdXdXdXdX.X.X.XQ.* > t : r : r Q.].; > [ b.S [ '.n.> y n.|.[.F.> ; Q.n.y : Q..X X@X.X.X@X'.b.= : dX.X].0 > c.[ : y dX'.: t b.m.e = m.].= 0 b.m.* y ].dXdX.X XzX'..XdX.X'..X X|.}.|._.|.^.}.(.(.(.(./././.~.~.~.~.~.(.~.~.~.^././././././.(./././.!./.!.~.~.~.~.!./.~.~.~.(.(.(._.(.{.(.(.(.(./.(.(.(.`.(.(.~.(.~.T.T.T.T.T.T.T.T.T.XXU.T.T.E.P.T.T.T.U.P.P.U.U.P.P.L.L.L.P.L.L.H.I.H.H.L.H.L.L.D.L.L.L.L.L.",
+"N m m M M N M m m N N V N V N V N N C N B B B B B B C N N C N C C N C C C C C C C B B C B C B B C C C B C C A C C C C C Z C Z C C Z Z Z C Z Z Z Z Z Z Z D F C Z Z Z D Z Z D Z D D Z H H H H H H L L J S % o         o $ $ $ % % % % ; e ; * : : t 0 : ; * y : y r r r r r r r r r r r r * r r r : r * y r : * : : r : : y : : r r r r 0 r r r ; ; r 0 ; 0 0 r 0 % e ; % % $ $ o $               J Q.(.!.{.[.E.(.{.^.(.(.(.(.(.(._.{._._._.|._.|.}.}.}.}.|.|._. X.X.X.X X X X.X.XzX.X.X.XxX@XdXdXzX.X'.zXdXdXdX@XdX.X.XdX.XdX XdX.XzX.X.X.X XdX'..XdX.X.X.X.X|..X X|.|._.}.}.`.(.(././././.~.~.~.~.T.~.!.^.T.T.T.T.T.T.U.T.T.T.P.T.T.P.T.U.L.L.L.L.L.S.L.H.H.L.S.G.G.H.h.A.A.A.A.g.G.h.g.h.g.z.z.h.h.h.h.g.h.l.g.h.h.h.g.h.h.h.h.g.z.j.j.q r q z.z.j.Z ; ; T T > 0 G d.e.* t G u.A * ; i.i.* 0 A u.T N 0 0 0 0 q E t.G = = G 0 t p.u.T q = G r.C = 0 p.E y y V r.C r % e * = 0 q T w.t.r.p.t.t.t.t.E q y R y.E y.w.T G T R 0 q m E 0 0 C r.E V > y w.Z ; t t.t.E 0 = G u.k.i.u.i.a.a.u.a.a.a.i.f.f.a.z.a.g.g.g.g.l.h.h.z.l.h.A.g.l.l.l.l.A.A.h.A.h.A.A.h.A.A.A.A.A.A.A.S.S.S.S.L.S.K.L.H.L.L.L.L.L.L.L.L.P.U.P.L.L.U.L.U.U.U.U.Y.I.T.T.U.U.T.U.T.T.U.T.~.P.P.b.= q [ ].b.* q [ b.q = [ b.* q n.b.r = S.n.y r F.T._.^.(.(.: * H {..X^.`.S ; H `.|.n.= 0 [ b.r = n.n.; ; F.n.r r F.[ = : `.~.F.~.{. X* * b._.!.[ L 0 y P !.= y ` (.].Q.{._.q : [ (.c.y :  X/.`._.`.|.(.'.= : b._.|.dX].b.!.b.r A .XZ y n.|.n.q Z {.S y n.(.n.0 q '.^._.`.|._.`.|.|.'.'..X.X X|..X.X.X|..X.X.X.X.X.X.X.X X|.'.|.'.|. X X_.|.|.|.}.}.}.}.}.}._.(._._.|._.`._.|.^._.|._.|.|._.|.|.`.|.'.|. X.X.X X X'..X|.|.|.|.|.|.|.|.|.|.|. X|._. X}.}.}.[._._.`.J ; : `.(.[ * : n.n.y y ` [ : = [ /.r r [ {.q y T _.; 0 [ {.r e A m.y * b.'.y = S I = r b.'.= y [ _.`.].q * y q * q n.XXT.[.~.T.~.U.[ ; > !.L.Z.r > Y T ; A F.e.[ T [ S 0 ; [ e.Y [ [ Z ; 0 [ T.T.T.~.~.T.~.T.~.T.T./.~.~./.~.~./././.~.~./.(.^.~.^.[.^.[./.[./.~./.~.~.~.~.~.~.XXXXT.T.~.T.T.T.T.U.T.T.T.T.T.T.T.[.U.~.T.~.T.~.~.(./.^.(./.(.(.(.(.^.^.(.(.`.|.|.|.|.|.|.`..X|.|.|..X.X.X.X.X'..X.X.X.X.XdX@XdX X.XdX.XdX.X.XdX.XzXzX.XzXdXdX.X.XdXdXdX.X'.dX.X X@X Xn.q * = q q u b.(.{.b.y 0 = y b.`.n.> y Q._.@Xn.: q F.n.y q Q..X|.'.dXdX XdXc.y y  XdXdXn.; y q u ].dXdX].y q > q [ cX.X[ 0 r r r b.fX'.zX.XzX.XzX.X'. X'..X|.|.}._._.^.|._.(.(.(././.[.~.~.~.~.~.~.!.~.~.[./././.(.(.(.(./././././././.~./.~.~.~.~./.~.~./.(.^.(.(.^.(.(.(./.(.(.(.(.(.(.(.^./.(./.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.P.L.U.L.P.L.U.L.P.L.L.I.L.L.L.L.L.G.L.L.S.S.L.L.L.",
+"m M N M M M m m N V m N N V B u m C C N B B B B C N C B N C C C C N N C C N C N C C B B C B B C C V C V A C C C C C C Z C Z C Z Z C Z Z Z Z C F G Z F D Z Z G Z Z Z Z D Z D D D D H Z H Z H Z L H L H G H K r o o       o o o $ $ $ $ % % % * * t r 0 : 0 : : : e 0 0 r * r * * : r : r r : r r > 0 * : : : : : : r r : : * > ; r r ; r r r ; ; r r ; ; ; ; = % % $ o o o       #         e [ ].~.~.(./.~.(.{.(./.(./.(.(.(.(.(.^._._._._._._._.}.}.}. X}. X|.|.|..X|..X X X.X X.X.X.X.XzXzXdX.XdXzXdX@XdXdX'.'.xX.XdXzX.X@X.X'..X.X.X.X@XdX.X.X'..X.X.X.X.X.X.X|.|.|.{.}.|.^.(.(./.(././.~.~.Y.T.~.T.[.P.T.T.T.U.T.T.[.P.T.P.P.T.Y.T.P.U.U.L.L.L.U.S.L.H.H.S.H.G.G.G.G.A.A.j.A.l.h.h.h.g.g.k.g.g.h.g.z.l.z.g.g.l.z.l.z.k.g.g.g.f.h.h.z.r > y T T T q ; q e.e.= r Z e.G y * G s.V e ; u.u.0 * m i.w.E T T C * = G r.t.q e y 0 A i.u.T > = G u.N r 0 r.y.r r V y.C = y E E E T E E y.t.r.t.t.t.w.r.T * * G y.E y.G N R y.G 0 q T E q * C r.y.q 0 C y.G q * G w.T > q T u.u.u.u.i.i.u.i.i.a.a.z.i.g.a.d.g.a.g.a.g.k.h.h.l.h.h.g.g.l.l.l.l.z.A.h.h.j.A.A.g.A.h.A.A.A.A.h.A.S.S.S.S.H.H.L.L.S.U.L.U.L.L.L.Y.P.L.L.P.Y.U.U.U.U.U.L.U.Y.U.P.Y.U.U.T.U.T.T.U.T.P.~.Q.> * r S y = 0 n.T = : b.P : = n.n.; > b.n.* r n./.(.[.^.`.* * S (.|.(._.S ; H .X'.b.y * b.Y : : n.L.; ; F.F.: * F.F.e * [ ` q 0 b.|.q e [ n.U ) ].u = P `.P : u n.S = A (.Y ; u n.u = _ |.(.`.`.^.|.^.'.: y [ _.|.U y C n.u * [ '.b.= S m.S 0 [ `.b.* S m.H * S _.^.`._.|.|.|.|.'.|..X.X|.|..X X'..X|..X|..X.X.X.X.X|.|..X X X.X.X|..X'.|.|.|.|.|.}.}.}.}._.|.|._._.|._.|._._._._.|.|.|.|.|.|. X|. X X|..X.X|. X X|.|.|.|.@X_.|.|.|.|.|. X_._.|.|.|._._._._._._.K : > ^.(.[ > : F.|.C : q L A y [ (.e y [ |.> : b.`.; y [ '.* * ) q y A '.'.[ q 0 Z S y b.'.: q b._._.!.Q.P T [ : 0 n.T.~.T.T.T.P.T.T q q K.~.U.e.* y y y Z.H.Y.L.I.H.T y q ].I.R.T.T.T q q ].U.T.T.~.T.~.T.~.T.~./.T.T./.T.~.~.~./.~.~././.~.{.^.^./.E.^.^./.{./././.~./.T.[.~.T.E.T.T.T.T.T.T.T.T.U.T.T.T.T.T.T.Y.~.T.~.T.~.T.~.T.~.!.(./.(./.(.(.(.(.(.(.(.|.(._._.|._.`.|. X|..X X.X.X.X.X.X.X.X.X.X.X X'.zX@XdX.X@XdX@XxX.X.X.XzXzX.X'.zXdXdXdX.XdXdXdX'.@XdX.X.XvX|..X X'.'.`. X X_.'.].F.F.!.|.[.(.|._.(.{.^. X X_._.'.'. X|.'.'.dXfX X.X'.dXdX'.dX'.'.dX'.].Q.zX.XxXdX XdXQ.Q.`.dX.X'.dX'.Q.Q.].dX.X.X@X.XxX.X.X'.'.dX.X|.|.|.|.|.|._._.{.(.(./././.^.~.~.~.!.~.~.~./././././././.~.[././.(.!./././.~.~.!.~.~.~.!./.!.~./.~.(.(._.[.^.(.(.[.(.(.(.(.(.^.(./././.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.P.U.U.P.H.U.L.L.L.L.L.L.L.L.U.H.U.S.U.H.L.H.P.L.D.L.U.L.S.",
+"M M m M M M N M M m V N N N V m B B N N B m B B B C B B N C N N C Z C N C C N C C N C B B C C B C A A C C C C C C C C C C C Z B D C B C Z Z Z Z B Z D C Z Z B Z D D Z D Z D D D H H H H H H H J P H L L L L P P u % o           o $ $ $ $ & % - % % % * : : : ; 0 r r r : r r ; r r r r r r r r r r y : r y : y * r r r y : % ; r r r r r ; : 0 * % % ; % $ $ $ $ $ o               $ u F.P.Y.XX[.E.T.(./.~.~.(.{.(.(.(.^.^.`.(._._._.|._._._._.}.}.}.}.|. X X|.|.|..X X@X X X.X.X.X.XzX.X.XzX.X.XdXzXzXdX'.zX.X.X.X.X'.zX.X.X.X.X.XxX.X.X.X.X.X.X.X.X X X|.|._.|.'._._.}.[.(.(.(.(.(././.~.~.~.~.T.T.T.T.T.T.[.T.T.T.T.T.T.T.P.Y.P.T.P.U.U.L.L.L.S.H.H.H.H.H.H.G.G.A.A.A.A.h.h.h.h.h.h.h.g.g.k.a.z.k.k.h.h.g.g.z.g.g.g.z.h.g.g.k.j.j.j.e ; e q y e 0 y T z.e.= 0 * q q e * G u.A r 0 p.u.0 r A p.N : = T B q q T r.t.G e > q T s.w.y.> * G y.C e 0 r.t.r r V y.T y * q u t q q r.y.r.t.t.t.t.w.E T : t T t.w.r.q = * q q % q w.t.B 0 = y A * * T r.E q * y q * = A u.i.u.u.u.u.u.i.i.a.a.a.i.f.d.d.a.z.g.k.g.g.k.k.k.h.l.h.h.h.l.l.l.l.h.A.A.A.Z.A.j.G.A.A.h.h.A.A.S.A.S.A.S.S.H.H.H.H.S.L.L.L.U.L.L.K.L.L.P.L.U.L.U.U.Y.U.U.U.T.P.T.P.U.Y.I.U.U.Y.U.U.L.P.U.e.q y = r y b.T.F.y y = ) y q [ F.; = F.n.y y n.^.!.|.(./.q q H |.^.{.'.P 0 Z `.(.Q.y y y ) > y b.Q.; > F.n.: > n.{.b.y e r y [ |._.r r [ Q.y y q q u Q.(.].Z y = ; u Q.`.!.K ; q y S ^.[.`.(.`.`.{.|.^.q : b.|._.`.S : 0 q [ '.'.].P y = = P ].|.`.P r = > u Q.(.`.^._.^._._.|.|..X|..X.X.X X.X X.X.X.X.X.X|..X.X.X.X.X.X.X.X.X.X X|..X X|.|.|.|.}.}.}.}.|.|._.|.|.|._._.|.|.|.|.|.|.|.|.|..X X|. X.X.X.X.X.X@X|.@X|.|.|. X|.{.|._.|.|.|. X|. X|.|.|._.|._._._.(. X|.@X!.{.{.'.(.{.|.n.F.}. X^.(.(.!.(.`.{.(.(.|.^.'._.|.%X`.'..X].Q.dX|.{..XQ.Q.|. X_.{.'..X|.|.^.|.Q.Z [ n.b.; 0 F./.~.[.T.~.T.T.T.^.Y.I.S.K.Y.F.Z.b.S.Z.S.L.U.G.I.Y.K.L./.Y.Y.T.T.T.].U.(.T.T.~.T.T.T.T.T.~.T.T.T./.~.~.~.(.~././.~.(.~./.~.[.[./.(.(.(./.~.~.~.~./.~.~.~.~.~.T.~.T.T.T.T.T.Y.T.U.U.T.T.T.T.T.T.T.T.T.~.T.~.~.^.~././.!./.(.^.[.(.(.(.^._.(.`.|.|._.|.}.|.|.'.|..X.X|..X.X.X.X.X.XdX'..XdX'.zXdX.X.X X.X.X.XzXzX'.'.dXzX.XdXdX.X.XdX@X.XzXzX'..X'. X X|._.|.'.{.^.`.`.(.(._._.{.(.{.|.|.{.|.|.|._.|.|.|. X X|. X'. XdX|.|..X'. XdX@X.XdXxX'.dXdXdXzX.XdXxXcXdX'.cX.X|.dX@X`.'.dXdXdX X X|..XdXzXzX.XzX@X.X.X|.|.|.|._.|._.|._.^.`.(.(.(.^././.~.~.~.~.~./././.^./././.(.[./././././.~.~.~.~.~.~.~.~./.~./.~./.{.].(.(._.(.(././.(.(./.^._.{.(./.!.T.~.[.T.T.T.T.T.T.T.T.T.T.T.T.P.P.P.L.U.L.P.H.L.L.P.L.L.L.L.L.L.L.H.L.H.H.L.D.L.L.H.L.S.L.L.",
+"m m m M M M M M m B N N V N B N m N C B C N B B B B B B C N C C C N C N C C N N C N C Z N B B C C C B A B C C C C Z C C C C Z C D Z C Z Z Z Z Z D Z Z Z Z G Z Z Z D B D D Z D D Z H H H H H H L Z S J J J P H L L J ) u % o         o     $ $ o $ $ $ % $ % % ; % : * * * * ; ; * : * : r r r r 0 : 0 : : ; * ; r r ; : y ; ; ; ; ; % ; % % , % % $ $ $ o o         #       o $ u b.T.[.T./.T./.Y.^.(.(.(.(.(.~.(.^.(.(.(.{.`.(._.(.`.`.[._.|.^.}.}. X}.|.|. X|.|.|. X.X.X|..X.X.X.X.X.XzXzX.XzXzX.X.X'..X.X X@X.X.XdX.XdX.X.X.X.X.X'.'..X.X.X.X.X.X|.|.|.|. X_._.|._.|._._.(.(.!.(././.!./.~.~.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.P.P.U.U.L.L.L.L.H.A.H.H.S.H.G.G.A.A.A.A.l.l.z.g.h.g.k.k.k.k.h.k.g.k.g.g.g.g.g.g.g.A.g.g.g.g.f.z.l.j.y 0 e > 0 = C T a.z.a.G > > M G q = T u.m ; r w.i.r ; N t.T q e * y q G E r.a.E q q Z t.t.u.T = q T t.B > q r.w.y ; V r.r.T q = w 0 q T y.y.t.t.t.t.t.r.r.E q 0 T y.r.r.E m = q 0 m G y.y.r.B q q q q F E E t.T N q y q N T t.t.i.t.i.t.u.i.i.i.i.i.i.a.a.g.f.f.f.k.a.z.g.g.g.g.z.h.z.g.h.h.h.h.h.l.h.l.h.h.A.h.A.A.h.G.A.A.A.H.H.S.S.L.D.H.H.H.L.H.L.U.L.L.U.P.L.L.L.U.U.L.K.R.U.U.U.L.P.Y.L.U.L.L.U.U.L.T.Y.T.T.U.U.U.I.b.Z.n.K.Y.I.~.Y.n.F.T.Y.~.~./.[.XX^.R.(.).^.{.{.~.^.|.`.`.(.`.|._._.'.'.'._.|.|.[.F.].|.~.^.{.[._.(.^.^.(.`.|.|.|.(.n.n.]. X|.{.(.'._._.|.n.Q.Q._._.}.`.`.Q.Q.F._.(.{. X(.^.n.].{.(.(.`.|.|.(.`.^.@X`.'.`.|.|..X`.].n.]..X.X`.(.'.Q.].F.'.|.|.{. XQ.F.F.(.|.{.|.`.^.`._.|.|.|..X X.X|..X.X.X.X.X.X.X.X.X.X.X'..X.X.X.X'..X'.'..X.X|.'.|.|.|.|.|._.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.'..X|..X.X.X|.|..X.X.X.X.X|.|.|.'.|.|.|.|.|.|.|.|.|.|.|.|.{.|._._._._.}.|.|..X|.|.^._.|.`._.~._.'.`._._.(._.{.(.^._./.(.(.`.{.|.`.|.{.|.|.|.|..X`.|.@X`.'. X|.|. X|. X(.|.`.^._.!.u * r q = Z !./.T.~.T.Y.Y.T.T.L.U.U.U.U.U.T.U.L.P.F.Y.U.L.U.L.T.P.T.L.~.T.T.T.T.T.U.U.T.T.T.T.T.T.T.T.T.~.T.~.T.~.~.~.~.~.~././.~.~.~.~.~././.[././././././././.!.~.~.~.T.~.~.T.T.U.U.U.Y.U.T.U.U.T.T.T.T.T.~.T.~.T.~.T.~.~.~.~./.^.[.^././.(.(.(./.^.(.(._._._.}.|.}.|.|..X X.X.X.X.X.X.X.X.X.XdX.XzX.XzXdX.X.X.X.XdX.X.X@X.X.XdX@XdX.X.X.X.XdX.X@XdX X'..X|.|.|.|. X_.|.{.|.`.(.`./.|.`._._._. X(.`._.(..X_._.{.|.|.|.|._.|.|.'.xX.X XdXdX'..XdXdXdXdX@X'.cX'.vX.XdX'.vXzXdX.X.X.XzX'..X@X'.'..XdXdX.X.X'..X.X'.zX.X.X|.|.|.}.|.|.|.{.{.(.(.(.(.^.~.^.!.^.~./.~./.!.~./.^.^././.^./.(.~././.~./.~.~.~.~.~.~.~.~.!./.~.(.(.]._.(.(.(.(.(././.(.(./.(.(.(.[.[.~.~.T.T.T.T.T.T.T.T.T.P.T.T.U.T.T.L.L.L.L.L.L.L.L.H.L.L.L.L.L.L.L.H.K.H.L.H.L.D.P.L.H.L.L.L.",
+"m M M M M M M m m m m B N N B m C N N B N N Z B B B B N N C N C N Z C C N C C C N C N N C C C B C m A C A B C C B C C C C A Z C C B Z Z Z B Z F Z Z Z Z Z B Z Z D Z D D H Z D D H H Z H H L L H H I H H J J J J L P P S / ~ u * o                 o o $ o $ o , $ & , % % % % % % % * : * % % * * % % ; % % * * * * % % % % % % % & $ $ $ $ $ o o       #               ; J n.Y.T.[.!.Y.Y.~.T.(.(.~./.(.E.(.{.|.(.(.(.(.^.`.^._._._.(.`.}.}._.|.}.}.}. X X|. X X.X.X.X|..X.X X.X.X.X.XdX.X.X@X.XzX'.zX.X.X.X.X.XdX@X.X.X.X.X.X.X.X'.`.@X.X|.|..X|.|.|.|._.|.|._.|._.|._._.(._._.(.(.(./././.~.~.T.~.T.~.T.T.T.T.[.T.T.T.T.T.T.P.P.P.P.U.Y.L.L.L.H.H.H.H.A.H.H.S.G.A.A.A.h.l.l.l.g.h.g.k.g.g.k.k.z.g.g.g.g.g.f.g.g.g.k.f.g.g.g.g.f.z.s.z.j.a.j.a.a.Z.j.a.a.a.a.d.p.T p.a.i.i.u.i.p.i.t.u.r.p.u.t.t.t.u.E T T w.t.u.r.p.i.E w.w.p.t.t.t.t.w.t.r.r.u.E t.t.y.y.y.t.E y.y.G E E r.r.t.r.t.t.r.r.r.t.y.t.r.y.r.y.y.E w.E T R E w.E y.y.y.y.w.G T w.y.y.r.r.t.y.T T E T t.x.t.u.u.i.u.i.u.i.i.i.k.i.a.f.i.f.f.k.f.z.a.g.k.k.g.g.g.g.g.h.g.h.h.h.A.l.A.h.A.h.h.h.A.A.A.A.A.A.h.A.H.S.S.H.H.H.L.H.L.L.S.H.L.L.S.A.P.L.P.U.I.L.L.L.U.T.L.U.U.L.L.U.U.U.U.U.L.Y.Y.T.T.T.T.!.T.U.L.T.T.~.T.!.T.[.[.(.!./.(.T.^.^.(.|.(.(.(.(.~.`.{._.(.^. X_. X_._.|.{.{.|._.(.|._.}.|.|._.^._.|._.`.^.(.`._.{.{. X_.|.|.|.|.'.'._.|.(.`.(.}.}.[.{.{.{.^.`.|.).[.(.(.|.(.(.^.`.(.(.`._.|.`.|.|.(.(.|.|.'.`. X`.}.|._.|.(.|.|.|.`.`.|.`.(.'._.|.|._.).{.{.{.{._.|._.|.|.|. X.X|..X.X|..X'..X.X.X.X.X.X.X.X.X.X.X.X.XdX.X.X.X.X|..X|.|..X|._.|.|.|.|._.|.'.|.|.|..X.X.X|.'.|.|.'.|..X X.X.X.X.X.X.X|..X|.|.|.'._.|.|.|.|.|.|.{.|.|.|.|._. X_._._._._.}.}.|.}._.|.|.|.{.(.(.^.{.|.{.`._.|.{._./.|.(._.(.{./.|.{._.|._.(.[.@X|..X|.|. X`.`. X|.|._.|.(.|.`.(.(.|./.^.].b.[ [ b.]./.T.~.I.~.~.Y.U.T.Y.T.L.L.L.L.U.L.P.D.P.K.L.U.Y.U.T.P.U.U.U.L.T.T.L.~.T.U.T.T.T.[.T.T.T.~.T.T.T.T.~.T.T.T.~.~.~.~.^.~.(.~.^.E.!././././.[./././.~.~.~.[.~.~.~.T.T.T.T.T.T.Y.P.U.T.T.T.T.T.~.T.Y.T.~.T.T.~.^.!.~././.~.^.~.~.~./.(.(./.(.(.(.|.{._.}.}.}.|.}.|. X X.X.X.X.X X@XdX@XdX'..X.XzX.XdX.XdX@X.X.X XdXdX.XdX'..XzX.X.XdXzXdX.X.X.X X`.|. X'.|.|.|._.|.^.(. X`.{.{.^.^._.|.|.(.(.|._.|._._.|.'.|..X X|.|..X.X.X'..X@XdX'.vXzXdX'.dXdXdXdX.XdXdXcXdXdXdXdXzX.X@X.XzX@X.X.X.XdX X XdX.XdX.X@XzX.X.X.X.X_.|.|.}.}._.|._._.`.(.(.(.(.(.[./././.~.(.~.(./.~././././././.(.~.~.~./.~.~.~.~.~.~.!.R.~.~.~./.(.(.(.(.(.(.(.(./.(.!.(./.^.(.(.(.~.~.~.~.T.T.P.T.T.T.U.T.T.T.T.T.L.U.L.L.L.L.A.L.L.L.F.H.H.H.L.H.H.H.L.L.S.L.H.L.L.D.L.L.L.L.H.L.",
+"M M M m M M M m M M m B N N M M C m m C N N B B B B B C N C N C N C C N N C N C C m C B m C B C C B Z C B C C C Z C C Z C Z C C C Z B Z F D Z Z D Z Z Z D Z Z Z Z Z Z G H Z D Z H H L H H H U H Y Z L U P L J I P P U P P I I I P S u % $                   o   o o o o o $ $ $ $ $ $ $ $ $ % $ , $ $ $ & $ $ $ $ $ $ & $ o $ o o     o       #                 $ u b.Y.I.T.~.!.].T.T.[.T.~.~.~.~.~.~.~.{.{./.^.(.(.(._.(.^.`._._._.`._.}.}.|._.|.|.}. X|. X|. X|.|.'..X|..X.X.X.X.X.X.X.X.XdX.X'.zX.X.X.X.X.X.X X.X.X.X.X'..X'..X.X.X.X|. X|.'.|.|.|.|.|.|.|.|._._.(.|.(.`.(.(.(.(././././.T.~.~.~.~.T.T.T.[.T.T.T.T.P.T.P.T.P.T.T.T.U.L.U.L.L.L.S.H.H.G.Z.A.S.G.h.A.A.A.h.h.h.h.k.h.k.g.g.g.k.j.g.g.g.g.f.g.g.g.g.k.z.g.g.g.g.f.k.j.z.g.z.i.z.a.z.k.i.a.g.a.a.i.k.i.i.i.p.s.i.t.u.u.t.t.w.t.r.t.y.a.u.y.r.t.t.u.t.t.y.t.y.t.u.t.s.u.t.y.t.r.t.t.r.w.y.t.r.r.r.y.y.r.r.r.r.r.u.r.r.r.r.t.r.r.E w.y.y.y.t.t.E y.w.y.y.y.y.y.y.y.y.y.y.y.y.y.y.r.t.r.t.t.r.t.u.u.a.t.r.t.u.i.u.t.u.u.u.a.i.i.a.a.a.f.a.f.f.k.a.z.g.d.z.d.g.g.g.g.k.h.z.h.h.h.l.l.A.h.A.Z.A.h.h.A.A.A.A.A.S.S.G.A.H.H.H.H.L.H.H.L.S.L.S.L.P.L.L.L.L.L.L.L.L.U.L.U.U.L.U.U.L.U.U.U.T.L.T.T.Y.~.T.U.T./.T.T.~.~.~.I.~.~.(.~.).!././.[.(.(.(.^.^.(.|.|.{.(._.(.|.`.(.|._. X_.@X[.|.|.'. X_.|.^.|.|. X X|._.|.`._.|.`.|..X_. X.X X_._.{. X'.|.{.|.[.{.{.{. X_.|.^._._._.(.(.`.(.^.|.`.(.^.`.^.{.(.|.|._.'.`.`._.|.|.|. X X|.|.(..X^.|.'.`.`..X/._. X`.|. X|._._._.|.{.)._.`.{._.|.|.'..X.X.X.X.X X.X.X.X X.X.X.X.X.X.X.X.X@X X.X.X.X.X.X.X.X.X.X|.'..X|.|.|..X_._.|.|..X.X.X.X.X|.|. X X|. X.X.X.X.X.X.X.X X.X X.X.X|.|.|.|.|.|.|.|.|. X X|.|.|. X|.|.`.`.`.`.|.|.|.}.|.|.|.(.|.|.|._. X_.[.}._. X_._.(.|.^.|.`.(.(..X_.{._._..X.X}.}.'. X|._.|.|.'. X{..X.X_.|.`._.`.^.[.(.(.(.~.{.(.[.T.T./.Y.T.T.I.Y.Y.T.U.U.L.U.L.L.L.D.U.H.U.Y.L.L.Y.P.P.U.T.U.L.U.T.T.U.L.(.P.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.T./.~.!.[.~.~./.~.~.~././././.~././.~./.~.~.T./.~.T.T.~.T.T.P.Y.T.U.U.U.T.T.T.T.T.T.T.T.~.~.[.T.~.~./.~.~.~.~.[.~.!./././.^.(.(.|.(._.}._.}.}.}.|.|.|. X X.X.X.X.X.XzX.XzX.XzX.XzX.X.X.XzX.XdX.X.X.X@X.X.X.X.X.X.X.XzX.X.X.X.X.X.X|..X.X'.|.{.{.|.|.(.|.`.(.|./._.|._._.|._.|.`._.|.|.|.'.|.|.|.|.{._. X X.X.X.X'.@X'..XdXdXdXdXdXdX X.XxXdX@X.XdX.XdXdX'.'.dXdXdX.XzX X'.dX.X X@XdX.X.X.X.X'..X.X|.}.}.}.|._._._._.`.(.(.(.E.[.(././././.^.~.!././././.!.^././.^./.~.(.~.~.~.~.T.~.~.~.~.~.~.~./.~._.].|.(._.(.(.(././.(././.(.(.(./.~.~.T.~.T.T.T.U.T.T.U.T.U.T.P.Y.Y.U.U.L.L.P.L.L.S.A.K.L.H.L.L.H.H.G.H.G.L.L.H.G.L.L.H.L.H.L.L.",
+"M M M m M m M M M m m N N B m u N C N N N C N C N B B N C N C N C m C C Z N C C m C C m C C C B C B C N C C A C Z C C C C C C F Z C D B Z Z Z Z Z Z C D Z Z Z Z Z Z Z Z Z D D L Z H H H H H H H J H J J J P I L P P P P I I P I P P J P P ! u * $ o                                 o   o   o o o   $ o   o o   o                           #         $ u H b.].[.Y.!.Y.Y.T.T.I.T.T.T.~.~.~.~./.!.(.^.^.[.^.{.(.(.(.(.(.`.`.(.`.|._._._.}.|._.|._.[.|.|.|.|..X|.|..X|..X.X.X X.X.X.X.X.X.X.X.X.XzX'.zXzX.X.X.X.X X.X.X X X X.X X`.`.`.`.|.|.|.|.|.|.|._.|. X[._.`.(.`./.|.(.(.`.(.(.(././././.~.T.~.T.~.T.[.P.T.T.T.T.T.T.T.T.T.T.P.P.P.U.L.S.U.L.S.H.H.H.S.S.A.G.l.A.A.l.l.z.j.z.h.z.g.h.z.z.g.g.g.a.g.g.f.g.g.g.g.g.k.g.g.a.z.k.k.j.f.a.z.f.f.a.d.g.i.g.a.a.a.i.i.u.i.i.t.u.t.i.t.t.t.t.t.t.u.r.t.y.t.E r.u.r.r.p.E i.E u.t.t.r.t.E t.r.t.y.t.r.t.y.y.r.E y.r.r.y.t.y.w.r.r.y.r.t.r.r.t.t.E t.w.y.t.r.E r.r.r.y.E r.y.r.y.y.E y.y.y.y.y.y.y.r.r.E t.w.u.r.t.p.t.t.s.u.t.i.a.u.i.i.u.a.i.i.i.a.z.i.a.g.f.f.z.f.k.k.a.z.g.g.g.g.h.g.h.h.l.l.l.h.h.A.h.A.A.A.A.A.A.A.A.H.S.H.A.H.H.G.H.L.H.H.H.H.L.L.L.L.L.U.P.P.L.U.U.L.L.L.Y.L.L.U.L.L.P.U.U.P.U.Y.T.U.T.T.T.T.T.T.U.T.T.~.T.^.T.~.~.[./.(./.(.{.^.(.^.`.^.`.].`.^._._.`.(. X`._. X X X X.X|.|.|.`.`._..X_.'.`.|._._.'.`._._.`.`.{.{.|.^._.|.|._._.{._._.|.`.(.`.^.E.`./.|.`.(.`._.'._.(.|.(.{.(. X(..X`.`._.^.|.`.`.`.'. X|.|.|.|. X{..X^.'. X|.{.{.^.`.`.|.^.|.{.{._._.|.(.{.^.|.^.|._.|.|. X|..X.X.X.X@X.X.X.XdXdX@XdX.XdX.XdX.X.XdX.X.X.X.X.X'.|..X X.X|. X`.@X|. X'.@X|..X|..X.X.X.X.X.X X X X X.X.X.X.X.X.X|..X|..X'.|.|.`.`.|._. X{.|. X|. X}.|.}.|._.|.|.`.`.|.`.|.|.|.`.|.|.|.|.|._.{._._.|._.|.(.|.[.|.(._._.`./.|.`.|._._..X`.{..X X X|.|.|.|.{._._.|.|._.|._.|.`.(.{.|.(.(.~.~.~.[.T.T./.Y./.Y.T.T.T.U.L.H.Y.L.L.L.U.U.T.L.U.P.L.P.L.P.U.U.Y.U.T.P.U.U.U.T.T.U.!.T.T.T.T.T.[.T.T.[./.T.T./.T.~.~.~.~.~.~.~./.~.~.~./.~./././././././.~./.~./.T.~.T.~.T.T.Y.T.Y.^.U.T.U.T.T.T.T.T.~.~.T.~.~.T.[.~.~.~.~.~.~.~.~.~.E././././.(.(.{.(.{.}.}._.}.}.|.|.|. X'..X.X.X.X.X.X.X.XxX.XzX.X.XdX X.X.X.X.X.XdXdX.X.XzX.X.XzX.X.X.X.X.X.X.X.X|..X X|.{.|.{.|._.`.^.(./.{./.|._._._._.^.|.(.`.`._.|.|. X.X|.|. X X X@X|.'.dXdX.XzXdXdXdX@X'.dX.XxXdX.XdXdX.X.XdXdX'..XdXdXdXdX.X XzX.X'.@X'.'..XdX.X.X.X.X.X.X_.|.}.}.}.|._._.`.^.`.(.(.(.(.(.!././.!./.~.^././././.[.[././././.(.~.~.~.~.T.~.~.~.~.~.!.~.~.~.(.[._.(.(.(.(.(.(./././.(.(.(./././.~.~.~.T.T.~.T.T.T.U.T.U.T.P.Y.U.L.U.L.S.U.D.L.L.S.H.H.H.L.H.H.H.L.L.G.L.G.L.L.L.L.L.L.L.L.L.U.",
+"B m m M M m m m m B m V B B m B B B B N N B C N C N B C N C N C N C C N C C C N m C A B B B C N C N C C A C C A C C Z C C C C Z C Z A Z Z Z Z Z Z Z Z Z Z Z Z Z G Z H Z D D D D J L Z H H L L L L H Z J P J P J P P P P P I P ) I I I P P P / I I I S u e w $ $                               #                                           - e K Y n.~.!.~.T.T.~.T.T.~.T.T.~.T.T.T.T.T.~.~.~.^./.^./.(.(.(./.(.(.(.(.(.^.^.|.(.(.^.`._._._._.`.`.|.|.|.'. X X X.X|.|.|.'. X.X.X X.X.X'..X.X.X'.@XdXdX X X.X.X.X.X.X.X'. X|.`.|.`._.|._._.|._._.{.|.|.|._.|.[._.(.(.(._.(.(.|.(.(.(.(./.(.~.(.~.!.[.~.T.~.T.T.T.[.T.[.P.T.T.T.T.P.T.U.U.U.L.L.U.H.S.S.G.S.S.S.A.h.A.A.h.G.j.h.g.h.h.k.h.h.g.g.g.g.g.g.g.g.a.k.f.k.z.g.f.f.f.k.k.k.z.f.g.a.a.z.a.a.a.a.a.a.a.a.a.a.i.i.u.i.u.u.u.u.u.u.u.t.t.t.r.r.r.t.t.r.r.t.t.t.t.r.r.t.r.r.r.r.r.r.r.r.r.t.r.y.r.r.r.r.y.y.y.y.y.y.t.y.r.y.r.r.y.w.y.y.r.y.r.y.r.E r.t.r.y.w.r.y.t.y.r.y.w.y.y.y.y.y.E r.y.y.r.r.r.r.t.t.t.r.u.u.a.u.u.u.u.u.t.u.i.u.i.a.a.a.a.z.a.z.a.f.f.a.f.a.g.g.g.g.g.g.a.z.k.z.h.h.h.h.h.A.h.A.A.h.A.A.A.A.A.J.H.h.G.S.S.A.H.H.A.G.H.H.L.S.L.S.L.S.L.L.L.L.L.L.L.L.L.L.K.L.L.L.U.U.L.P.U.Y.Y.U.T.U.T.T.T.T.T.T.[.T.~.~.~.~.(.(.(.~.(.(._.(.`.(.^.(.(.|.|.`.`.{._._.}.}.}.|._.|. X X|. X|.|.|.|.|. X|..X|.'.|.'.|.'. X|. X|.|._.`._.|._.(.|.(.|./._./.|.(._.^.^._.(.|.{.^.|.|._._.|.^.(.(.|.{.{.[.|._. X{._.|._.|. X|._. X'.|.|.|._.|.`.(._._._._.^._.`.`.{.^._._.(._._.(.(._._._._.|.|.'. X X.X.X.XdX.X.XdXdX.X'.zX.XxX.XdX XdX.X.X.X.X'..X|..X|.|..X.X'.'. X.X X.X.X.X.X.X'.@X'..X'..X.X.X X.X.X.X.X'..X.X|.|. X|.|.|.|.{. X X|.|.|.{.|.|. X|.|.}.|.{.}. X}.}.|.|.|.|.|.|.|.|.|.|._. X|._.}.}.}.}.}.}.}.|._.|._.|.`.(.`.(._._.|. X}.'.}.|.|._.|._._._.|.`._.|._.{.|.(.|.(.(.(.(.[.^.~.~.T.T.T.~.T.T.U.T.T.U.L.P.L.L.L.P.P.P.L.L.J.U.L.L.P.P.P.P.Y.U.U.Y.U.Y.I.U.T.P.T.T.T.U.T.T.T.T.T.~.T.~.T.T.~.~.~./.^./.~./.~.(.~.~.^.~./.^././././.~.(.!.(.~.!.T.T.T.Y.T.T.Y.T.Y.Y.I.T.T.T.T.T.T.T.T.~.T.(.~.T.(.~./.~./.~./.~.!.~.~./././.(.(.(.(.^.|._.|.|._.|.|.|.|. X.X.X.X.X@X.XzXzX.XzX.XdXdX.X.X.X.X.X.X.X.X X.XdX.X.X.X@XdX.X.X.X.X.X|..X.X'.|._.|.|.(.(._.(.|.^.(.`.^.^.(.(.|.(.`.`.(.|.(.|._.|.|.'.|.`.|._. X.X.X.X.XzX.XdXdXzX.X'.xX'..X.XdX.XdX.X.X.X'.dXzXzX'.xX.XzXdXdX.X.X.X.X.X.X.X.X.X|..X|..X}.|.}.}.|.|.}.}.[.|.(.(.(.^.(.(./.(.(.(.^./.[.E.~./.(.~./././.(.XX(.~.(.~.~.~.T.~.T.~.T.~.~.~./././.{.(.`.(.{.|.^.T.(././.^.(./.(.(././.~.~.T.~.~.Y.I.T.T.U.T.P.P.P.L.P.P.L.L.L.L.P.S.H.H.H.H.H.H.H.S.H.H.H.L.H.L.H.L.L.L.L.L.L.L.S.",
+"m M M M M m B m m B m m m B M B B B B B B B N N N N C N C N C N C N N C C N N A A N N N B B C Z C C C C V C C C C C C C C F C C Z C Z C Z Z Z Z Z F Z Z Z Z Z Z D Z Z Z D D D D D L L Z H H H H L P L J L S L P P P P P P P I P I I P P ) P P P I I ) ) I I Q ) Q ^ u u = ; % $ o o                   #   #           o $ $ - w y ` b._.].(.(.~.^.(.(.^.T./.~.T.~.~.T.T.T.T.~.T.T.T.T.~.~.~.~././././.(.(.(.^.{.^.(.`.`.(.^.|.`.`.(.`.^._._._._._._.|._.'.|.|..X.X.X.X|..X|..X.X.X.X.X.X.X.X XdX'.@X'.dX.X.X.X.X.X X'.`.|.|.`.(.|.|._.`._.^.|.`.|.|.|._.}.}._.|._.(.(._.^.^.(.(.(./.(./.(.~.~.~.~.~.~.~.~.T.T.P.T.Y.Y.T.T.T.T.T.U.Y.U.L.L.L.L.S.G.S.S.S.S.S.A.S.A.h.h.h.h.h.h.h.k.h.k.g.g.g.f.g.g.g.g.g.z.f.k.f.a.z.z.f.k.k.k.k.a.f.f.z.a.i.z.a.a.f.a.a.a.a.i.a.a.a.u.i.i.u.u.u.t.u.t.t.t.r.r.r.r.r.r.r.t.r.t.t.t.r.r.t.r.r.r.r.r.r.r.t.r.r.r.r.r.r.y.y.y.w.y.y.y.y.y.t.w.r.y.r.r.r.y.r.y.r.y.r.y.r.y.y.y.y.r.y.t.y.y.y.y.y.y.y.E w.y.y.y.r.r.r.r.r.r.r.t.p.t.u.u.u.u.u.u.u.s.u.i.u.i.i.a.a.a.a.i.i.i.i.d.d.z.f.a.g.a.g.f.g.g.h.g.g.g.g.h.h.h.A.h.A.h.h.A.A.A.A.A.S.g.S.H.S.S.H.H.H.S.L.H.H.H.H.H.S.L.S.U.L.L.L.L.L.K.L.L.L.U.L.P.L.L.U.U.U.P.P.U.U.U.U.T.T.T.T.[.T.T.~.T.~.~.~.T.(.~.(.(.(.(.(.(.(.(.}.|.[._._.`._.|.|.|._.|.|._.|.|.'..X.X|..X|..X X.X'.|..X X|. X|.|.|.|. X_..X|.|.|._._.|._.`.`.{.`.|.`.`.`.`._.^.|.|.^.|.(.^.|._.{.`.|.`.^.(._.|.|.}.|.|.|._.|.|._.|. X|.|.|.`._._.|._._.^.|._._._.`.`.(.|._._._._._._._._.`.`.|._._.|.|.|.|..X.XzX.X.XdX.X.X'.zX.XzX'..X#X X@X.XdX.X.X X X.X.X.X.X'..X X.X X'.|..X|..X.X.X.X.XzXdX.X.X.X.X.X X.X.X.X.X.X.X.X.X.X X|.|.|.|.|.|.{. X X|. X|. X{.|.|.}.|.|.}.}.}.|.|.}.|.'. X.X|.|.|._. X|.|.|.|.}.|.}.}.}.}.`.{.|._.^.|.(.|.`._._._.}.}.|.|.|.|._._.|.(._._.(.`.|._._.`.`.^.(.(.(.[.E.(.~.~.T.~.T.T.T.T.T.U.U.T.P.L.L.Y.L.P.P.L.U.L.K.Y.U.U.P.P.P.P.U.U.Y.U.Y.U.I.T.T.P.P.T.T.T.T.T.T.T.T.T.~.T.T.~.!.~.~.!.~././.~.~.!.~.~.~.~.T./.~.~././.~./.T.~.~.~.~.~.~.T.Y.~.T.T.T.Y.Y.T.T.T.T.T.T.T.T.T.~.T.~.[.T./.~.!.~.~.~.~./.~.~.~./.(./.(.(.(.^.[._._._.|.|.{.|.|.|..X.X.X XdXzX.X.XzX'.zXdX.XzXdX.X.X.X.X.XzXdX.X.X.XzX'..X X.X.X'..X.X.X|.|.|.|.|._.(.`.|.|.{.(.{.|.).|.(.|.(.|.|.^._.`.|.(._.{.|. X|.`.`._.|.'..X.X.X@X.XdXdXdX.XzX.XzXdXdX.XdXdXdX.XxX.XzX.XdXzX'..X@X.X.XdX.X.XdXzX.X.X.X.X.X.X.X.X|.}.|.}.}.}.}.}.}._._._.|.(.|.(.(.(.(././.(.(.^.(./.~.~.(.!./.(.~.(.~.~.~.T.~.~.~.T.~.T.~.T.~.~.T.~./.(.!.^.(.(.(.(.(././.(./.(././././.~.~.Y.Y.~.Y.~.T.I.T.U.Y.P.P.P.U.U.L.L.L.S.S.P.L.D.H.H.H.Z.H.G.H.H.H.L.L.H.L.L.H.L.L.L.U.L.L.L.",
+"m M M m M M m N m m m B M M B V N N B B B B N N N A N N N Z N C N N C N N C N C B B A N B A C N A N C C C C C C C A C C C Z F C C Z C F B Z Z Z Z G Z Z Z Z G D D D Z D D Z L Z H Z H Z H H P H L L L J L P P P I P U P P I I I I P I I P ) P P I I P P ) I I ) J I P ) I ! _ P ) U I U L ) ! L J I I I P I I I J Q ) ) H I ) P ) Q.^.(.(.!.{.[.[.^.~./.T./.~.~.~.T.T.~.~.~.~.~.~.T.~.~./././.{.^.(.(.(.(.(.(.(.(.(.^.(.(.`._.`._.`.(._.^._.|.(.|.|.|.'. X|..X|..X X X.X|..X.X.X.X.X.XdX.X.X.X.X.X.X.X.X.X'..X.X|..X X`.`.|.`.`._.{.`.^.(.|.|.|._.|.|.{.|._.^.^.(.(.(.(.(.`.^.(.(./.(./.~.~.~.~.T.T.~.T.[.T.T.T.[.P.T.T.T.T.Y.Y.U.U.U.L.L.L.S.U.S.H.S.S.h.G.G.h.A.A.A.l.h.g.h.h.h.k.g.g.g.g.g.g.g.g.g.g.f.f.f.a.a.g.g.g.a.f.f.f.k.f.z.a.a.a.a.a.a.i.i.a.i.i.i.i.i.u.u.t.u.u.u.u.u.t.t.t.t.r.r.r.r.r.r.t.r.r.t.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.y.r.y.t.r.y.y.y.y.w.r.y.y.y.r.y.y.y.y.r.y.r.t.r.y.r.t.y.y.y.y.t.y.r.y.t.y.y.w.y.r.y.y.y.r.y.y.y.r.r.r.r.r.t.p.t.t.t.r.u.u.u.u.u.a.u.u.i.i.i.i.i.a.a.i.a.a.z.a.z.a.f.g.g.z.g.f.g.f.g.k.h.z.h.h.l.l.A.h.A.G.h.A.A.A.A.A.A.G.A.S.S.S.G.H.H.F.H.H.H.H.S.H.H.S.U.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.P.P.L.L.L.U.T.U.T.T.T.T.T.T.T.T.~.~.~./././.(.(.^.(.(.(.|.[.|._._._.|.`._._._.|._.|.|._.|.|. X|..X|.|.'. X.X|..X.X.X.X'. X X|.|.'.'.|.|.|. X`.|.|.|._.^.`.^.|.`.`.^.|._.(._.^._.(.^.(._._._.`._.^.|.`._.|.}.}. X}.|.|.|.|.|.|.}._.{._.|.|.|.|.|.{.}.`.^.`._._.(._.`.].{._.(._.(.`._.(.|.(._._.`. X_.|..X.X.X'..XdX@XdX.XzXzX'.dXdXdXdXzX.XdX.XdX.XdXdX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X@X'.xX'.zX.X.X.X.X.X.X.X'..X@X.X.X.X.X|.|.|.|.`.|.|.|.{. X{.|.|.|. X|. X{.}.|.|.}.}.|.|.|.|.'..X|..X|.|.|._.|._.|.|.|.|.|.|.}.}.}.|._._.|.^._.`.|.|.|.|._.}.}.}.}. X}.|._._.`.|.(._._._._.`.`.`.(.(.(.(./.(.~.!.~.T.T.T.T.T.U.T.T.L.U.L.L.L.L.L.L.P.Y.L.L.L.L.U.L.P.P.P.P.U.T.U.U.T.U.U.T.T.P.L.T.T.U.U.T.T.Y.T.T.T.T.~.~.~.~.~./.~.~./.~.~.~.~.~.~.[.~.~.~.~.~.T.R.~.~.T.T.~.T.T.T.T.~.T.T.T.T.Y.P.T.T.T.~.T.T.T.T.~.T.~.~.^./.~.^.~.~./.~.~.~./.~././././.(.(.(.`.^._._._.|.|.|.|.|..X.X'..X.XdXzX.X.XzX.XdXdX.X.X.X.X.X.X.X.X.X.X.XdXdX.XzXdX.X.X.X.X|.|.|.|.|.|.|._._.|._.`.^.`.`.(./.(.(.^.(.(.(.`.^.(._.^.`.|.|._.|._._.`.`.|..X.X.X X@XdXdX#XdX.XzXzXzX.XdXzX.XzX@XxX.XzX.XzXzX'.zX'.zX.XzXdX.X.X.X.X.X.X.X.X|..X.X X|.|.|. X}.}.}.}.}.|.|.|.^.^.|.(.(.(.(./.^.~.^.~.(./.~.~.~.[.^././.~.~.(.E.~.T.T.T.~.T.~.T.T.~.~.~./.~.^._.(.(.(.(.^.^./././.(.(.(././.!.~.~.~.~.T.T.Y.T.T.T.T.Y.P.U.L.L.U.L.L.L.L.L.P.S.U.H.H.G.L.G.H.D.H.H.H.L.L.H.L.L.H.L.L.U.L.L.U.",
+"M m M M m m N m m B B m M B m B B B B B B B C N N N C N C N N C C C N C C N C N B B B C Z N C N C C C V A C C V C C C Z C C C C Z A Z D D Z Z Z D B Z Z D B B D D D D D D Z H H Z H H H H H H H P H J J L P H P P P P P P I P I P I I I I P P I I I ) U I I U I I P ) ) J ) ) ) I ) ) I I P P P ) I I ) ! I ) I ) P ) ) I ) ) ) ) F. X[.(.{.~.(.E.(.(././.(.Y./.T.[.~.~.T.~.~.~.~.~.~.[././././.(.[.(.[.(.(.(.(.(.(.`.(.(.(.^.`._.^.`.`.|._._.|._.|.|.|.|..X X.X.X.X.X|..X.X.X.X'.'..X.XdX.X.X.X.X.X.X.X.X.X X'.|.|.`._.`.`.`.(.|.(.`.(.(._.(.|.|._._.|.{._.|.(.(.`.].(.^.(.(.(.(././.^.[.~.~.~.~.~.~.T.~.T.T.T.T.T.T.Y.T.T.T.T.Y.U.L.L.U.S.H.H.S.S.S.S.H.S.S.A.A.A.A.h.h.l.h.h.h.k.g.g.f.g.g.g.a.g.g.f.f.f.f.f.z.i.a.a.a.k.a.a.f.a.i.z.a.a.a.i.a.s.i.i.i.i.i.i.u.u.u.i.i.u.u.u.u.t.t.t.r.r.r.r.r.r.r.r.r.t.r.r.r.t.t.r.r.r.r.r.r.r.r.r.r.r.r.r.y.y.y.y.y.y.y.w.t.y.y.y.y.y.y.y.r.w.r.y.y.y.t.E w.y.y.y.y.w.y.r.y.y.y.y.y.y.y.w.r.y.y.y.y.r.y.t.r.r.r.r.t.u.s.t.u.u.u.u.u.i.u.i.u.a.t.u.i.i.i.i.a.a.a.a.i.i.k.k.z.a.a.g.g.g.g.g.g.h.h.h.h.l.l.l.h.h.h.h.Z.h.h.A.A.A.A.A.S.S.S.S.H.H.D.H.H.H.H.H.L.D.L.S.U.S.L.L.L.L.L.L.L.L.U.U.P.U.L.L.L.L.L.P.L.U.U.T.U.U.U.T.T.T.T.T.~.T.~.^././.(.{.[.{.(.(.(._.}._.|._._.|._.|.|.|.|.|.{._.|.|.|.|..X X.X.X.X.X|..X.X.X.X X.X|.|..X.X|. X X|.'.`.`.|._.{._.`._.`.|._.^.|.(.|._.{.}.(.|.(.(.(._.(.(.|.{.`._._.|.}.}.}.|.|.|._. X|. X}.|. X|.|._.|._.{._.^.|._.^.(.(.(.(.(.^.(._.(.(.(.^.`.^.^.|._._._._.|. X'.|..X.X.X.X.XzXzX.XzXzX'..XdX'..XdX.XdX.X.X.X@X@X.X.X.X.X.X.X'..X.X.X.X.X.X'.dX.X.XxX'.zX.X.X.X X.X'. XdX'..X.X.X|.'..X|.|.|.|. X|. X|. X|.|. X|.|.}.|. X{.|.}.|.|.}.|..X|. X.X.X.X.X.X X|. X|.|.|.|.|.|.}.}.}._.|._._._.`._.(._._.|._.}.}.}.}.}._.|.|.|.|.(.|.|.(.|._.(.|.(.`._.(.(.(.(.~./.~.(.~.T.Y.T.T.U.U.P.L.L.L.L.L.L.L.L.L.L.U.L.L.U.U.P.P.P.Y.U.U.T.T.I.I.T.L.L.T.P.T.U.U.U.T.T.Y.T.T.T.T.~.~.~.~.~.~./.~.~.!.~.~.~.~.~.T.~.E.T./.T./.R./.~.~.~.T.~.T.T.T.Y.T.T.T.T.T.P.~.T.T.T.T.~.T.T.T.!.~.!.^././.~.~./.~.!./.~.~.~.~././.^.^.(.{.(.^._._._._.|._.|.|..X.X.X.X.X.X.XzX.X.X#XdXdX.X.X.X.X.X.XzXdX.XdX.X.X.X.X.X.X.X.X.X.X.X|.|.|.|.|._.|.(.`.(.`.{.(.{./.|.|.(.`.(.^.(.(.{.|.|.|.(.|._.|._._.|._.`.|. X.X.XdXxX'.dX'.dXzX.XzX.XzX@XzX.X'.zX.XxX.XzXdX.XzX.XzX.X.X'.dX.X.X X.X.X.X.X X@X.X|.'..X|.|.|.}.}.}.[.|.(._.|.(._.^.`.^.(.(.(./.^.^.(.~././.~.~.~.~.T.(.T.(.~.~.~.~.~.~.T.~.~.~.~.~.~.T.~.~.(.!.(.(.(./.^./.!./././.!./././.~.~.~.~.T.~.Y.T.T.T.T.Y.P.Y.L.U.L.U.D.L.L.L.S.S.U.H.H.H.G.G.H.H.H.H.H.H.S.L.L.L.L.L.L.L.L.U.L.L.",
+"M M m m m N B B m B m m B B B B N B B B B B B N C N C N B B Z C C C C C C N C N m C N B C B C C C A B C A C C A C C C C C Z C C C C Z B Z C D B Z Z Z Z Z C D D Z D Z D D D Z D D L H H H H K H L H U H L P P P P P P P ) I I I P P / I P P I P I I I I ) P I I ) I I ) _ ) ) / I P ) I ) ) ) I K ) P I ) P P ) ) ) I ) I I ) ) S F.|.[.{.(.(.(.(././.R.~.!.~.~.~.~.[.~.~.~.~.[.~.~.~./.[./././.[.(.(._.(.(._.(.(.(.(.(.(.`.`.|.`.|.|.(.|.(.|._.`.|.|. X X|..X X.X.X.X.X'.'..X.XdX@X.X.X.X.X'..X.X.X.X.X.X|.|.'.|._._.|._._.(.(.^.(.(.(.(.(.|.{.(.`.(.`.(.(.|.^.(.(.(.(.(.(.(.^.(.(./.!.~.~.~.~.[.T.T.~.T.T.T.T.T.T.T.T.T.T.T.Y.U.P.P.P.U.A.L.H.G.S.A.A.S.A.A.A.A.h.A.h.z.h.h.z.k.j.f.k.g.a.g.f.g.g.k.g.f.f.i.a.k.i.z.a.z.a.a.i.i.a.a.a.a.a.a.a.i.i.i.i.u.i.u.u.u.u.u.u.u.u.u.u.u.u.t.r.r.r.r.r.r.r.r.r.t.r.r.t.t.r.r.t.r.t.r.r.r.r.t.r.y.r.E y.y.y.E w.y.y.y.y.y.w.y.y.y.y.E y.y.y.y.y.w.r.r.r.w.r.r.E y.r.r.r.y.w.y.r.y.y.w.E y.y.y.y.y.y.E r.r.r.r.t.t.u.u.u.r.u.u.u.u.u.i.u.i.i.u.i.i.i.i.i.i.a.a.a.a.g.a.a.a.g.k.g.g.g.g.g.k.h.h.h.h.h.l.A.h.A.h.A.h.A.A.A.A.A.A.S.S.S.G.S.S.H.H.H.H.H.S.H.K.H.L.H.L.L.F.A.L.L.L.L.L.L.L.L.U.U.S.L.L.L.L.U.L.L.Y.U.Y.T.U.U.T.T.~.T.T.~.(./.~./.(.(.(.(._.{.(._.|._.|._.|._.`.`.|.`.|.|._.|.|._.|. X X.X.X.X.X.X.X.X XdX'. X.X.X'.|.|. X.X|.@X|.`.`.|.|.`._.(.|.{.`.`._.`.`.|._.|.(.{.(.(.(.^.(.|.`.}.}.}.}.}.}.}.}.|._.|.|. X X X|.|. X}.}.`._._.|._._._.`.^._.(.(.(.(.(.`.(.(.(.(.(.(.(.(._.|.^.^._.|.{.|..X'..X.X'..XdXzX.XzXdX.XzX'.zX.X.XdX@X X.XdX.X.X'..XdX.X.X.X.XzX.XzX.X'.dX.XdXdXdXdXdX.X XdXzX'..X.X.X.X.X.X X.X.X.X'..X|.|.`..X X X[.|. X_.@X|. X{.}.}.}.|.|.}.|.|.'..X|..X.X.X.X|..X|.|.|.|.|.|.|.|.|.|.|.|.}.|.|.}.}.}.}._.(.[._.|._._.|.}._.}.|.}.}.}.[.`.(.[.|.|.^.).|.`.^.(.{.(./././.~.~.T.T.T.Y.Y.Y.I.U.T.L.L.L.L.L.U.L.L.L.U.L.L.L.L.U.P.P.K.Y.P.Y.T.T.T.U.U.I.U.L.L.L.U.U.P.T.Y.T.T.I.T.~.~.T.~.~.~././.~.~.~.~.~.~.~.~.T.XXXX~.T.T.~./.~.~.~.~.T.T.~.T.T.T.T.T.T.T.T.T.T.~.T.~.T.T.T.~.T.~./.~.~./././././.^././.~.~.~./.~././.(.(.^.`.|.(.`.|.{.|.|.|.|..X.X.X.X.X.X.X.X.XzXzX.XdX.X.X.X.XdX.X.XdX.XdX.XdX@X.X.XzX.X.X.X|. X_.`.|._.|.|.{.^.|.(._.(.^.|.`.^.^.(.(.(.(.|.(.|.|._.(.`.}._._.{.|._.|.`.|. X.X.X.XdXdXdX.XzXzXzXzX.XdXdXzXzXzX'..XxXzXxX.XdXdX@X.XzX.X.X'.dX.XdX.X.X.X.X X'. X.X.X|.|.|.|.|.}._._._._._.`.(.`._.`.(.(.(.(.(././.^.^./.!.~.~.~.~.(.~.~.~.~.~.~.T.T.E.XXXXT.~.T.[.~.~.~./.!.(.(.(./.(./././././././././././.~.~.T.T./.T.T.T.T.T.T.U.U.P.U.P.L.L.L.S.S.L.P.L.G.H.H.H.G.H.H.H.H.H.H.L.L.L.L.L.L.L.L.U.L.L.P.",
+"m M m M m B m m m B B B B m B m B B B B B N B C N C N C B C N C B N N C N C C C C C C C B C N C C N B C C C C C C C Z C C C Z Z Z D C Z Z Z Z Z C Z C G Z Z D C D Z H Z D D Z L H H Z L H H H H H P H J L P L P J P P P S P I P I ( I P ) ) P ) I J P ) ) J ) ! I I I I P P P ) ) ) ) I I ) I P ) ) ) ! ) ) ) ) P I I I I I I Y ) n.~.(.(.(.].^././././.(././.~.^.~.~.~.~.E.~.~.~.~./.(.(./.(.(.(.(.(.(.(.(.(.^.(.(.(.{.(.(.(._.`.^.`._.(.`._.|.{.|.|._.'..X X X.X.X.X.X.X.X.X.X X'..X.X.X.XdX'.'..X.X.X X.X'.|.|._._.|._._.(.(.(.(.(.^.(.(.^.(._.`.(.(._.(.(.^.(.(.(.(.(.(.(.(.^.(.(./.^.[.~.~.~.T.~.T.T.T.~.P.Y.P.P.T.Y.T.T.U.T.U.L.L.S.U.D.H.H.S.H.S.A.A.l.A.A.A.h.A.h.l.h.j.h.k.k.l.g.g.g.g.k.z.a.a.f.f.z.a.i.i.i.i.i.a.a.i.a.a.a.a.a.a.i.i.i.u.i.u.i.u.u.u.u.u.u.u.u.u.t.t.t.t.r.t.r.r.r.r.r.r.r.r.r.r.t.r.r.r.t.r.E t.r.r.r.r.r.r.r.r.r.t.t.y.y.r.y.y.y.y.y.y.y.y.r.w.y.y.y.y.w.y.y.y.y.y.r.y.r.y.y.w.y.y.y.y.y.y.y.y.w.y.y.y.y.t.y.r.t.r.r.r.t.t.t.t.t.u.u.u.u.u.u.i.u.i.i.u.i.i.i.u.i.u.i.i.i.a.a.a.f.k.z.g.k.g.g.g.g.g.h.h.h.h.l.z.l.h.A.h.h.A.A.A.A.h.h.A.A.S.S.S.G.S.H.S.H.S.H.H.H.H.S.H.S.L.L.L.D.U.L.S.L.U.L.L.L.L.L.L.U.L.L.L.L.L.U.L.U.L.L.T.U.T.T.T.T.T.~.T.~.!./././.^.`.(.^.^._.`._.|.|.|.|.|.|.`.|.|.|.|.|._._.`.|.|.|. X.X.X.X.X X@X@X.XdX'.|.|..X.X X|.|..X|.|._.`.|.|._.|.|._._.`.^.`.(.|.{.`.^.`.`.(.`.^.`.^.|.^.}.}.}.}. X}.|. X X|.|.|.|.[.|. X}.}.}.|.|._.|._._._._.(.(.(._.(.(.(.(.(.(.(.(.(.(.(.^.`.^.|._.|.|._.|.|.|..X|..X.XdX.X'.zX.XdXdX.XzXzX.XdX.X XdXzX.XdXdX.X.XdX.X.X.X.X.X.X.XzX@XdXdXdX.XdX'.dX.X'.@X.X.X.X.X.X.X|..X.X.X|.|..X`.|.`.|.|. X|..X X|._. X X X X|.|.}.|.|.}.|.|.|..X.X X|..X.X.X.X.X.X|.|.|. X}.|.|.'.|.|.|._.{.}.|.}.}.`.`.^.|._._.|._._._.}.}.}._._.|.{.|._.^.^.|.^.^.^.`.(.^./.(.(./.~.~.!.T.T.T.Y.I.T.U.L.Y.L.L.L.L.S.L.L.P.L.P.L.U.U.L.U.L.P.P.P.P.P.T.U.U.U.I.L.U.U.U.P.P.L.P.T.U.T.T.T.T.~.~.R.^././.~././.~.^.!.~.(.~.~.).T.~.~.~.~.T.~.T.~.~.T.~.T.T.!.T.T.(.T.T.~.T.~.T.~.T.T.~.~.~.~.~.~.(././././.~.(.~.~./././.~././.!./././.(.^.(.(.^.|.(.|.|.|.|.|..X.XdX.XdXdXdX.X.X.X.X.X.X.X.X.X.X.XdX.XdXdX.X.X.X.X.X.X.X X.X.X|.|.|._._._.|._._.(.|.|.^.{.(.(.`.(.(.(.(.(.(.{.(.^._.(.`.}.[.(._.(._._.|.|.'. X.X.X'.zX'..XdXzX.XdXzX.XxXzX.XxX.X.XzX.X'..XdXzXzX@X'.'.dX.X.XdX@X.X.X.X.X.X'..X.X|..X|..X'.|.|.|.|._.|._.{._.`._.(.`.(.(.(./.(.(.~.[./.!.(.~.(.~.(.XX~.~.~.~.~.~.~.[.U.~.~.~.~.T.T.[.T././.^.~.^.~./.~.~././././.(././././.~.~.~.T.T.~.T.T.T.T.U.U.U.P.P.L.L.L.U.U.U.S.Y.L.H.H.H.H.G.A.H.H.H.H.H.H.L.H.L.L.L.L.L.U.L.P.P.",
+"m M M M N m m m B m m B B B B m B N B B B B C N C N C N N C C C C B C N C N N C B Z B C C B C N B B Z C C C C C C C C C C C C C Z B C Z B D Z Z C Z C Z Z D H Z Z Z Z D Z Z D H H H Z H H P H L H P H H L P P J P P P J J I P P P P I I P I ) P ) P P I I ) L ) I ) ) I P P P P P ) I P I I ) I ) P P ) J ) I ) ) ) ) ) ' I ) _ I b./.{./.^./.^./.(./.^.~.~.(././.~.~.~.~.^.~././././.(./.(.^.(.(.(.{.[.(.(.`.(.^.(.(.(.(.`.^.|./.|.|.`.^.`._.|.|.|.|.|..X.X.X.XdX X.X.XdX.X.X.X.X'..X.X.X.X.X.X|..X.X.X.X|.|._._.|.|.(.(.(.^./.(.(.(.(.(.(.|.(.(.(.(.(.(.(.{.(.(.(.(.(.(.(.(.!.(./././.~.~.~.T.Y.~.~.T.P.~.P.T.Y.T.P.Y.T.U.T.Y.P.P.L.L.L.S.L.H.G.S.S.S.S.A.A.A.h.h.G.l.l.l.h.h.k.h.h.k.g.g.g.j.a.z.g.d.g.a.d.i.i.a.i.i.f.i.i.a.i.i.a.i.i.i.i.u.i.u.u.i.u.u.u.u.u.t.u.t.t.t.t.u.t.t.t.r.r.r.r.r.r.r.r.r.r.t.r.r.r.t.t.r.r.r.r.r.r.r.y.r.y.y.w.y.r.y.y.y.y.y.y.y.y.y.E w.y.y.y.y.y.E r.y.y.y.y.r.r.y.y.r.r.y.w.y.y.y.y.y.y.r.y.y.y.r.r.r.r.r.r.r.r.r.r.t.t.u.u.u.u.u.u.u.u.u.i.i.u.i.i.s.i.i.a.i.i.i.i.a.a.a.a.a.g.a.h.k.h.k.g.h.z.z.h.h.l.l.h.A.h.h.A.A.h.A.h.A.A.h.A.S.S.S.S.S.S.H.H.S.G.H.H.H.H.L.L.L.S.S.L.L.H.L.L.S.L.L.L.L.L.L.L.L.L.L.L.L.Y.L.L.L.U.L.T.U.T.T.T.T.!.R.~.~./.(.(.(.^.^._._.}.}.|.|.|.'..X|.|.|.|.|.|.`.|.`.|. X|.|..X X'. X.XdX.X.X.X.X.X.X.X X|. X|.'.'.|.|.|._.|.|.|.`.{.{.|._.|.^.|.`.`._._.(.{.{.{.(.(.^.^.}.}.|.}.|.|.'.}. X|.|.{.|.|.|._.}.}.|.|.|.|._.|.}._.|.(.`.`.^.`.(.{.(.(.(.(.`.^.(.(.^.`.(.(.{.^.{.|._.|.|.|.|..X.X.X.X@X.X'..XdXdXdX.XzX.XzXdX.X.XdX.X@X.XdX@X.X.X.X@XdX'..XzX.X'.zXzX.XzX.X@XdXdXdXdXdXdX.X.X.X.X'..X.X.X|..X`.|..X|.|.|.|.|.|. X|.|. X|. X X|.|.|.}.|.{.}.|.|..X|.|. X.X.X.X|..X|..X|.|.|. X|.|.|.|.'.|.|. X|._.}.}.[.|.^._._._._._._._._.[.|._.|.|.|.|.^.(.(.|.`.(.(.(.(.(.(.(././././.~.~.T.T.T.Y.I.I.I.P.L.U.L.L.S.U.L.L.L.P.L.L.L.Y.U.U.U.L.P.P.Y.P.P.U.T.U.Y.Y.U.U.L.L.P.P.U.Y.U.T.T.~.T./.~./.~././.[.~.~./.~./.~.~.~.T.~.~.~.T.~.T.~.~.T.~.T.~.~.Y.T.~.T.~.T.T.~.~.T.T.T.T.~.T.T.~.~.~.~././.!.~./././.~.~./.~./.~./././././.(./.{.(.{.|.{.|.|.`.|.|..X X.X.X'..X'.dX.X XdX.X.X.X.XdX.X@X.X.X@X.XdX.XdX.X.X.X.X.X.X|..X X'.|._.|.{._._._._._.^.(.{.(.`.^.^.(.(.`.(.(.^.|.^.^.(.^.(._.^.|._.|.|._.|.|..X.X.X.X.X'.zX.XdXdXdXzX.X#XzXzX.X.XzX.XxX.X'.dXdXzX'.zX'.dX.X.XdX.X.X@XdX.X.X.X.X.X.X.X.X|. X X|.|._.}.|._.|._._.|.^.(.`.(.(.(.(./.{.~.(.~.~.~.~.~.(.~./.~.~.~.~.T.~.~.~.~.~.~.~.~.~.T.~.~.~.~.!./.~./.~.~.~.~.R.~./././.~.~.~.T./.T.T.T.T.T.T.T.T.T.U.U.U.L.P.L.L.D.S.L.S.S.G.L.A.D.H.H.H.H.L.H.H.H.L.L.L.L.L.L.L.L.P.L.U.P.",
+"m m M M m m B N m B B B m m B B N N B B B B B C N N A C C N C N Z B C C N C C Z B C B B C B C N Z C N C C C C C C C Z C B C C F Z C Z C Z C Z Z Z Z Z D Z D Z D Z Z Z Z H Z H H Z H H H Z H U H H L H P D J P P P J P I J I J ) P P I I I I P ) P ) P I P ) P U I I I I ) ) ) ) P _ _ I ) I ) I P ) ) P ) ) I ) P I I ) I I I I ) ` Q.|.(.|.(.{./.(.!.^.(.(.^.~./.~.^.~./.~./.~.~./././.^.(.(.(.^.(.(.{.(.(.^.`.(.^.`.(.(.^.`.(.{.`.(.`.`.|.{._.|. X|..X.X|..X.X'.@X.X.X.X.X.X.X.X.X.X.X'..X.X.X.X.X|..X|. X|._.|._.{.|.`.(.(.(.(.^.{.(.(.(.^.(.(.(.(.(.`.(.{.(.(.`.(.(.(.].(.^.(.(.(./.~.~.~.!.~.T.T.T.!.P.~.P.P.P.^.U.T.T.Y.Y.Y.L.Y.L.H.L.H.H.H.H.S.S.A.A.A.A.G.h.h.l.h.h.z.k.h.z.h.j.g.a.j.g.z.a.a.a.f.a.i.i.k.i.i.i.i.i.i.i.i.i.i.a.i.u.i.i.u.i.i.u.u.u.u.u.u.u.t.u.t.u.p.t.t.t.r.r.r.y.r.r.r.r.r.r.r.r.t.t.t.r.r.r.r.r.r.r.r.r.r.t.y.t.r.y.r.y.y.y.y.y.y.y.y.y.y.y.y.y.y.w.y.w.y.y.y.y.y.y.r.r.r.y.y.y.E y.w.r.y.y.y.y.y.y.r.r.r.r.r.t.r.r.r.t.t.t.u.t.t.t.u.u.u.u.u.u.i.u.u.u.i.u.i.u.i.i.i.i.i.a.a.a.g.k.k.g.k.k.k.h.h.k.l.l.h.h.l.l.A.l.H.h.G.h.A.A.A.A.A.A.A.A.S.H.A.H.H.S.S.H.H.H.S.D.L.H.L.S.L.L.S.S.L.L.U.H.S.U.S.L.L.L.L.L.L.L.U.L.K.L.L.L.L.U.U.T.T.T.T.R.~.Y.~.~.!./.(.^.^.`._.}.}._.|.|.|..X|..X|..X.X|.`.|.`.|.|.|.|.|..X.X.X.X.X.X.XdX.X.X.X.X.X|..X|. X|..X X|._.|.|.|.|.`._.`.|.|.^.|._.(.{._._.`.`.(.(.|.(.|.{.[.}.}.}.}.|. X|.'.|.|.|._.|._.|.}.}.|.|.|.|.|.}.}.|.|._.(.`.(.{.(.^.(.(.(.^.(.(.(.(.(.(.(.^._.(.(.(._.|.|.|.'.'.|..X'..X.XdX'.dX@X'.zXzX'.dX.X.XdX X.XdX.X.XdXzX'.dX'.zX.X'.zX.XzX'.zXzXzXzXzXzXzXzXdXdXdX.X.X.X.X.X.X|..X.X.X'..X|.|.|.|.|.|. X{._.|.|.|..X{. X|.{.}.}.|. X X X X.X.X X X.X.X.X.X.X|..X|..X X}. X.X X X X|.|.|.}.|.}.}.^.|.|.^.{.`._._._._.|._.|.(.(._.[.^.(.(.^.^.|.^.(.(.^.(.(.(././././.~.T.T.T.Y.Y.I.L.U.L.L.L.L.L.L.L.L.L.L.L.U.L.U.K.L.U.Y.L.Y.P.T.T.U.U.U.U.U.L.L.L.L.L.U.Y.U.T.T.T.T.~.T./.~./.~.(.^.~.~././.~.~.~.~.~.T.~.~.~.T.T.T.T.T.T.~.T.T.(.T.T.T.~.~.~.T.~./.T.~.~.T./.~.~.T.~.~./.^.^.~././././.~./.(.!./.!.~./././.(.(.(.(.{.^.`._.{._.|. X|..X.X.X.X.XdX.X.X.X@X.X.X.XdX.X.X.X.X.XzXdX.XzX.XzXdX.X.X.X.X.X X'.|._.`.|._._.|._.(.`.`.(.`.(.(.`.(.(.^.{.).{./.|.`.(.(.^.|.(.|.^.}.(.|._.|.|. X.X'.dX@X'. X.XzXdXdX@XzX'.zX.XzXzX.X.XxX.XzXdXdX.XzX.X.X'..X.X.XdXdX X X.X.X|..X.X|.|..X.X.X|..X X|.|._.|.|.|._.`.`.`._.(.(.(.(.(./.(./.^.(.~.(.~./././.^.~.~.~.~.~.~.~.~.T.~.~.[.T.~.R.~.~.~.!.~.~.~.~.~.~.~.(.~./.~././.(./.~.T././.T.T.T.T.T.T.I.T.U.U.U.L.L.L.L.L.L.L.L.L.G.S.H.H.G.H.H.H.H.L.H.L.H.H.L.L.L.L.L.L.U.L.P.",
+"M m B m N B m m M M M V V N N V N N B N B B B B B C B C B C B C Z A C N A C N C C C C C A C C C A N A B C C A C C C C C C B C C Z Z C Z Z C Z C Z C Z Z Z Z D D D D Z D Z Z Z J L J H H H H H H H J J L L P P P P P P P P P P ) P P P ) P ) P I I ) I U _ P P I I I ) I ) P P I ) ) P ) ) J ) ) J ) ) H ) ) J ) ) ) I K _ I ) P ) ` F.`.`.(.`.(.^.^.(.(.(./.(./.(././././././././.(./.(.!.(.(.(.(.(.(.(.(.^.(.(.(._.(.(.(.`.`._._.|._._._._.|.`.|.'..X|..X.X.X.X'.'.xX.X@XdX.X.X X.X X.X|..X.X|..X.X|.|.|.|._.|.|._.{.^.(.(.(.|.(.(.(.(.).^.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.!.(.^.(./.^./.~.~.~.~.T.T.Y.T.~.T.U.T.T.T.U.T.Y.T.P.P.P.P.U.L.S.S.L.S.G.H.Z.A.A.h.A.A.A.A.h.A.h.h.l.h.h.z.l.k.j.k.x.f.a.z.f.a.a.a.a.i.i.i.i.a.i.i.i.i.i.i.i.i.i.i.u.u.a.u.i.u.u.u.u.u.t.u.t.t.t.t.t.u.r.r.t.r.r.r.r.r.t.r.r.t.y.t.r.r.r.r.t.r.t.r.r.r.r.y.y.t.w.E E r.E y.y.y.y.y.E E y.E y.y.y.E y.y.E y.w.y.w.y.w.y.r.r.r.y.y.y.y.y.y.y.y.y.y.r.r.y.r.r.t.r.r.t.r.r.t.t.t.t.t.t.t.t.u.u.u.u.u.u.i.i.u.i.i.u.u.u.i.u.i.i.i.i.k.i.i.z.f.f.k.f.g.k.g.h.g.h.h.A.h.A.A.A.G.A.j.A.A.A.A.A.A.A.A.A.A.A.H.G.G.G.G.H.H.H.H.K.L.L.G.L.S.H.L.L.H.U.S.L.L.L.L.L.L.L.L.L.P.L.L.L.U.L.L.L.U.L.T.U.T.T.T.^.~.~.~.~.^.^.(.(.(.(._._.|.|.|.|.`. X|..X.X.X|..X X|.'.|.|.|. X.X.X.X.X.X.X'.zX.X.X.X'..X.X.X'..X|.'.|.|.|.|.'.|.|.|._.|._.|._._._.|.|.`.^._.(.|.(._._._.(._.|.{.|._.'. X|.|.|.|.|.[.|.|.|._._. X_.|.}.|. X X}.}.}.}.^.|.~.(.(.(.`.^.(.(.(.(.(.(.(.(.(.|./.^.`.`.|._.|.|.|.|..X.X@X.X.X.XzXdX.X.XzXzX.X'.xX'.'.'.@X'..XzX.XzX XdX'.'.'.zX'.zX@XdXdXdXzXzXzXzXdXzXdXdXdX'.'.xX.X.X.X X.X X X.X.X|.'.|.|.|.'.|. X|.|.|.|.|.|.|.|.`.|.`.|.|.|.|.|.|. X.X.X.X.X.X|..X X.X|..X X.X|..X'.|.|.|.|.|._.|.`.`.{.`.{./.^.`.(.(.{.|._.(.(.`.`.^.`.(.(._.(._.(.(.(.(.(.(./.(./././.~.T.~.T.T.T.U.L.U.L.P.L.L.L.L.L.L.D.L.L.L.L.L.L.P.L.T.U.U.Y.L.U.Y.U.U.L.K.U.L.L.L.L.L.L.U.T.U.T.T.T.~.T.~.~.~.T.[././.(.~./.~.~./.~.~.~.~.T.T.T.T.T.T.T.~.~.I.~.~.T.~.!.~.~.T.~.~.~.T.~.~.T.[.~./.~././.~./././././.~.^.~./.~./././././.~.(.(.(.(.(.{.`.(.|._.^._.|.|..X|..X.X.X.X.X.XdX.X.X.X.X.X.X'.dXdXzX.XzX'.zX.X.X.XdX.X.X.X'..X|.|._._.|.{._._._._._.|._._.|.(.(.(.(.(.`.(.(.(.(._.^.`.(._._._._._._.|.}.|.|.|..X.X.X.X.XdXzX.X.X.XzXzXdXzXzXdXzXzXdXzXdXzX.XdX.X@X.XdX.XdX'..X.X.X.X.X.X.X.X.X.X.X.X.X X|.@X|.|.`.|.|.|._.}.}.}.|._.^._.(._.(.(.(.^./.(./.(././././.~./.~./.~././.~.!.(.~.~.~.~.~.T.^.~.~.~.T.~.~.~.~.T.~./.Y./././.T.~.~.~.~.T.!.T.T.T.T.Y.T.Y.Y.Y.P.P.P.L.L.L.L.L.S.S.L.J.H.H.A.H.S.H.H.A.Y.S.U.S.L.L.H.S.P.L.L.L.P.P.Y.",
+"M M m m m m N B V M C m N N V B V V N B N N B N B B B B C B C B N C N Z N Z A C C A A C N C A N A C C C C C C C C C C Z C C Z C A Z Z C C Z Z Z Z Z Z C Z Z Z B D D D D D D Z L Z Z H H H H H J J J H J L P L J P P P P P P P P J ) P P J ) P / ) U I I P ) P ) I ) P I ) I ) ) I ) ) I ) ) ) ) I ) I ) ) ) ) ) ) I ) ) I ) ) ) ) ` n._.{.(.^.(.(.(.(.(.(.(.(.(././././.^.E.~./.^./.(./.(.(.(.(.(.(.(.(.(.`.(./.(./.(.(.(.(.(.`._._._.|._._.`.`.|. X'.|..X.X X@XdX.X.X.X.X X.X.X X'..X.X.X.X.X X.X|.|.|.|.|.|._._._._.{._.(.(.^.(.(./.(.[.(.(.^.(._.(.(.].(.(.`.(.(.(.].(.(.!.`.(.(.(.~./.~.~.T.~.T.T.T.T.T.T.T.T.U.U.U.P.Y.P.P.P.P.L.L.U.L.L.L.H.H.H.G.G.A.A.h.h.h.h.h.h.h.l.z.z.k.k.f.f.j.a.f.z.i.a.a.a.a.i.i.i.i.i.i.i.i.d.u.i.i.i.u.u.u.i.u.u.u.u.u.u.u.t.u.t.t.t.p.t.r.t.t.t.r.r.r.r.r.r.r.w.t.t.y.r.r.r.r.r.r.r.t.r.r.r.r.r.t.r.t.y.y.r.t.y.y.y.y.y.y.y.y.y.y.y.E y.w.E y.y.y.y.y.y.y.y.y.r.r.r.r.r.y.r.y.y.y.y.w.y.y.r.r.r.r.r.r.t.r.t.t.t.t.t.t.t.u.u.u.u.u.u.u.u.i.u.i.u.i.u.i.i.i.i.i.i.i.i.a.a.a.i.z.f.f.k.z.g.g.h.g.g.h.g.A.A.h.A.h.j.A.A.A.A.A.A.h.A.A.A.A.G.A.A.Z.S.A.A.A.H.H.H.S.H.H.L.G.S.L.S.L.U.S.L.L.L.P.L.L.L.L.L.P.L.P.L.L.L.L.Y.U.L.U.U.U.T.T.T.T.T.~.~.[./.^.(.(.(.`.`.|._.|.|.|..X X.X X.X.X|. X.X|.|. X|.|.|..X.X|..X.X.X.X.X.X.XzX.X.X.X.X.X.X X X.X.X X'.|.|. X|._.|.`.|._.|.{.|.^.|.`.`.|.^._._.(._._.(.}._._._.'.|.|. X|. X|. X|.|.|.|.|.|.|.|.|.|.|.}.}.}._._.|.(.(.(.(.(.^.^.(.`._.^.(.`.^.|.{./.(.|.|._._.|.|.|.|..X.X.X X.X.X.X.XzXzX.XzX'.xX'.@XdX.XxXxX.X.X'..X'.@XzXdXdXdX@XzX.XdXdXzXzXzXzXzXxXzXzXzXzXdX'..X.X.XdX'. X.X.X X'. X.X.X X.X|.|.'.|.|.|.|.|.|..X|.`.`.`.|.`.|..X|.|.|..X.X.X.X.X.X.X.X.X|..X X.X|. X|.|. X'.|.|._.|._.^.|.(.(.`.|.(.(.(._.^._.(.`.`.`.`.`.(.(.(.(.(.(.(.(.(.(././.(.^././.!.T.^.T.T.T.U.U.L.L.L.L.L.L.P.L.L.L.U.K.L.L.L.L.L.P.L.K.U.Y.U.U.U.Y.U.L.U.L.L.L.U.L.L.L.Y.U.U.T.T.T.T.T.~.~.~.~.^.^././././.(.~./.~.~.~.~.~.~.~.T.T.T.T.T.T.R.~.Y.T.~.T.L.~.Y.T.T.T.~.~.T.~.~.T.~././.~./././.~.[./././.~.~./././././././.(././.[.{.(.(._.(._.^.`._.|._.|.|..X.X'..X'.dX X.X.X.X.X.X.X@X'.dX.X.X.XxXzX.XzX.X.X.X.X X.X|.|.|._.|._._._._._._.|.{.|.(.|._.(.(.(.(.(.{.(._.(.(.(._._._._._._._.|._.}._._.@X|..X.X.X@X.X.X.XxXzX.XzXdXzXdXxXdXzXzXdXzX.XzX.X.X.XdX.X.X.XdX.X.X.X@X.X.X.X.X.X X'..X|.|.|. X X|.|.`.|.|._.|.}.}.[.`.`._._._.(.(.^.(.~./.^././././././././.^.~.~.~.~.~.!.~.~.~.~.!.T.~.T.~.T.~.T.~.T.~.~.T.Y.(.!./.~./.~.~.~.~.~.[.T.[.T.T.T.T.Y.Y.P.Y.P.P.L.L.L.L.L.L.L.L.S.K.H.K.H.H.H.S.U.D.S.H.U.S.L.L.P.L.L.P.P.P.P.U.",
+"m M M m m N m m M M N N N N A N V B B V B B B B B B Z B B C B C B Z N Z C C Z C A C N C C A A m B C A C C C C A C C C C C Z C Z Z C A Z Z A Z C Z C Z Z Z Z D Z Z D Z D D D D Z Z H H H H L H H J J H P P P P J P P P I P P J ) P P ) J P P ) P ) I I I I I I I I I I ) P ) ) P ) ) J ) ) P ) ) I ) ) ) ) P J ) _ P ) ) ) ) I I ) I n.}.(.(.(.(.(.(.(.(.(./.(././.(.^./.^./.(./.(./.(./.(.(.(.(.(.`.^.(.(.(.(.(.(.(.(.(.(.(.(.^.^.|.}.}._.|.`._.|.'.|..X'..X X.XdX X.XzXdX.X.X X.X X.X.X.X.X.X X.X|.|.|._.|._.|.`._.`.(.(.(.(.^.(.[.(.(.(././.(.^.(.].(.(.(.(.~.(.(.(.(.^.(.!.(.(.(.!.!././.~.T.T.T.T.T.T.T.T.L.Y.P.T.U.Y.P.P.P.P.L.L.L.Y.S.S.H.G.G.H.A.A.A.A.A.A.h.h.h.h.h.h.z.h.g.h.f.g.f.j.a.a.g.k.a.a.s.i.i.i.i.i.i.u.i.i.i.i.i.p.u.u.u.u.u.u.u.u.u.u.u.t.u.t.r.t.t.t.t.t.r.r.r.r.r.r.r.r.r.t.r.y.r.r.r.r.r.r.r.r.r.r.r.r.r.y.y.r.y.y.r.y.r.E w.y.y.y.y.E y.y.y.y.E E E y.y.y.w.y.y.y.y.y.r.r.r.r.r.y.r.y.w.y.w.y.y.r.r.y.r.r.r.t.t.r.r.w.t.t.t.t.t.u.u.t.u.u.u.u.u.u.u.i.i.i.u.i.u.i.u.i.i.i.i.i.a.a.i.f.i.k.a.f.k.g.g.g.g.g.h.h.H.G.h.A.A.A.A.A.h.A.A.A.A.A.A.A.A.A.G.h.W.S.H.G.K.H.G.G.G.H.H.H.L.L.S.L.U.P.U.L.L.A.P.L.L.L.L.L.P.L.P.L.P.U.L.L.U.U.U.T.T.T.T.T.~.~.~.~.[././.(.(.^.`.(.`.|.|.|. X|.|..X.X.X X.X|.|. X|.|..X|.'.|..X.X.X.X@X.X.XxXxXdX XdX.X X.X.X.X.X.X X|.|..X X'.|.|.|._.|.|.|.|.|._._.(._./.|._._._._.^._._._._.|.`.`.|.|.|.|.|.|.|.|._.|.|.|.|.|.|.|. X}.}._._._.{.}.|.(._.(.`._._._.|.^._._.|.|.`.`.{.|.{.{._._.|.|..X.X.X.X.XzXdX.X.XzXzX.X.XzX'..X'.xX.X.X.X.XzX.XzX'.xX'.dX.X'.dXdXdXzXzXzXxXxXzXxXxXcXcXzXzXdXzXzXzX.X@X.X.X.X|. X.X|..X.X|..X X|.|. X.X|.|.|.|.|.@X|.|.|.|.|..X|.|.'..X.X.X.X.X.X.X.X.X.X|..X|.|.|.|.'..X|.|.|.|.|.|.{.|.`.`.^.(.(.(.(.|.^.|.^._._.(.(.^.(.(.(.(._._._.(.(.).(.(./././././.^.~.T.T.T.T.T.U.L.L.P.L.U.L.L.L.L.L.K.L.L.L.L.L.P.P.Y.L.U.L.L.L.Y.L.U.L.Y.K.L.U.L.L.U.L.U.U.U.U.U.T.T.T.T.~.~.~.~.{./.^././.~./.~.[.~.~.~./.T.T.~.T.~.T.T.T.~.L.~.~.T.T.~.~.T.~.~.~.~.T.~.T.R.T.[.~./.~.T.^././.!././.~.[././././././././././.(./.(.(._._._.`._.`.`. X|.`..X|..X.X.X@X X.X.XdX.X.X.X.XdX'.dXdX.XdXdX.XzX.X.X.X.X.X X|..X|.|.|.|._.|.(.`._.(.(._._.`.|.^.^.(.(.(.(.{.(.(.(._.(.(._._._._._._.|._.|.`._. X.X.X.X.XdX.X.XzX.X.XxXzXzXzXzXzXzXzXzX.XxX.X.XzX.XzX.X.XdXdXdX.X.X.X.X.X.X.X.X.X'..X.X.X.X|.|.|.|.|.|.|.|._.}.}.|.|.(._._._._._.(.(.(.~.(./.(././././.~.(.~.^.~.~.~./.!.~.~.~.~.Y.T.T.T.T.T.T.~.T.~.T.~.T.T.T.T.!.T.~.~.~.~.T.~.T.T.^.P.T.T.T.T.Y.U.P.P.U.P.Y.L.L.S.L.S.S.U.P.L.S.G.H.S.S.H.D.A.H.H.S.L.L.L.L.P.L.L.L.K.Y.U.",
+"m m m V N m B m M M N M N N M N B N B N V B B B B B B B B B C B B A B B C C A C C C C C C C C C C C C C A C C N C Z C C Z C Z C C Z Z C C D A Z B Z Z Z B Z C D Z Z Z Z D D Z L Z H Z H H D J J J H P P J J I J P P I I P ) P P ) P U / ) P P J P ) I ) P ) I I ) P ) I ) ) P ) ) J ) ) ) ) S P ) I K ) ) ) I ) ) I ) I ) P I J ) I b.}.^.|._.(.`.(.(.(.(.(.(.^./.(././.^././.(./.(.(.(.(.^.`.(.`.(.(.(.(.(.(.(.(.(.(.(.(.(.(.`.|.(.^.}.|.|.|.`.|.|. X.X X.X.X.X@X.X.X.X.X.X.X.X X.X X X|..X|..X X X.X|.}.|._._.`.(.`.(.(.(.(.`.(.(.(.^./.(.^.(.(.(._.(.(.(.(./.(.(.(.(.(.^.`.(.(./././.~./.T.~.~.T.T.T.T.T.T.T.Y.U.U.T.P.P.P.P.U.Y.L.L.L.H.H.H.G.H.A.A.A.A.g.A.l.l.l.h.h.z.z.h.f.z.j.j.f.f.f.g.g.z.i.i.a.a.i.i.i.i.i.i.i.i.i.i.i.p.u.i.u.u.u.u.t.u.u.u.r.u.t.t.t.t.t.r.t.r.t.t.r.t.t.r.r.r.r.r.y.r.r.r.y.r.y.r.r.r.r.r.r.r.y.r.r.r.r.y.r.y.w.E y.y.w.y.y.y.y.y.y.E y.y.y.E y.y.E y.y.y.r.r.r.r.t.y.r.y.r.y.y.r.y.y.r.y.y.y.r.r.r.t.t.r.t.t.t.t.t.t.u.u.u.u.u.t.u.t.u.u.u.u.i.i.u.i.u.i.u.i.i.u.i.i.a.i.i.k.i.z.k.f.f.f.j.g.g.g.h.h.l.h.A.g.A.A.A.A.A.A.G.A.G.A.G.A.A.A.G.A.A.A.A.A.A.G.A.S.G.G.G.H.H.D.S.L.H.H.S.S.U.D.L.L.L.L.L.L.L.H.L.P.P.P.L.U.U.U.U.Y.T.T.T.T.~.T.~.~.~.~.^./.(.(.^.(.`.`.|._.|.|..X.X.X.X X.X.X.X.X.X|. X|..X.X.X.X.X X@X.X.X.X'..X@XdX'..XdX@X'..X.X.X'..X X|.'.|.|._.|.|.|._.|._._.|.^.|.(.|.(._._.(.(.`._.^.|._.|.`.`. X|. X|.|. X X{.|.|.|.|.'. X|.|.|.}.}.|.|._._._.[.`._._.(._._._.{._.{.|.`.^.^.|.`._.`.`.|.|.|.|.|..X|..X.X.X.XdX'.zX.X'.'.zX.XzXxX'..X.XxX'..X.X'.#X.XzX.XdXdXdXdXzXzXzXcXxXxXxXvXxXxXzXxXzXxX.XzX.X.X'.'..X X.X X'.dX@X.X.X.X|..X.X.X.X.X.X|.|..X'..X|.|..X|..X|..X.X|..X.X.X.X.X.X.X|..X.X.X|. X'..X X|. X|.|._._._.`.`.^.|.(.(.(.(.^.{.|.(._.(.(.`.(.(.^.(.(.(.(.(.(.(.(./././.(././././.~.~.~.T.T.T.P.L.L.L.L.P.L.L.U.L.L.L.J.K.L.Y.L.L.L.P.U.L.L.L.U.L.L.L.U.L.L.L.L.L.U.L.R.L.U.U.U.T.T.T.T.~.~.!.~.~.E.^./.^./././.^.~.~.~.~.~.T.~.T.T.T.Y.Y.T.T.U.~.U.~.~.T.T.~.T.T.~.T.~.T.~./.~.~.~./.~.~.~./.~.~././././././.[.[././.!.(./././.(.(.(.{.(.(.(.`.(.(._._.|.|. X.X.X.X.X|..X.X.X'.'. X'..X.X.XdXdXdX.XdXzX.X.X.X.X.X.X X.X.X|.|.|._.|._.|.|._._.|._._.|.[._.|.^.(.(.(.^.(.(.(.(.(.(._._._._._._._._.|.|.'.'..X X.X.X.X.XzX.XxX.XzXdXzXzXzXzXzXdXzXzXdXdXzXzX.XzXdXdX@X.XdX.XdX.XdXdXzXdX.X.X'..X|..X|.|.|.|. X|.|.|._.|.}.}._._.|._.`._._._._._.`.(./.^././.^././.~.~.~.~.~.T.~.~.~.~./.~.~.~.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.~.T.~.T.~.~.T.~.T.~.~.T.T.T.U.T.U.Y.P.P.Y.L.L.L.L.L.L.L.L.U.L.S.Y.H.D.H.H.H.S.D.S.H.S.S.L.Y.L.S.L.L.L.P.Y.P.",
+"m m m m m m m N m N m C N N B m N N N B B B B B N C N C B B B C N C A Z C C C B C C N C C C C C C C C Z C C C C C C C C C C C Z Z C Z B D Z Z C Z C Z Z D Z C Z Z D D D Z Z H H H H Z H H J Z J J H H J P I I P I P P ! P P P J I P P ) P P P ) ) P ) ) ) ) P ) ) I ) I I ) Y I ) J I ) ) P ) ) ) P ) I ) ) ) P ) I ) ) ) ) S I ) P [ }.{. X_._._._._.(.(.(.(.(.~.(.(.^.(./.(.(.(.(.(.(.(.(.`.^.(.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.`.[. X|.|.|.|.|.|..X X X.X.X.XdX.X'..X.X.XdX X.X|. X.X|..X X|. X|. X_.}.}.}.{./.{.(.^.^.(.(.^.(.(.(.(.(.).(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.!././././.~./.T.T.XXU.T.T.T.T.T.U.U.T.T.U.U.P.P.P.L.U.L.L.S.L.H.H.G.G.Z.H.A.A.A.A.A.h.l.l.h.h.h.k.k.g.j.z.f.g.f.a.k.i.f.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.u.u.u.u.p.t.t.t.u.t.t.t.t.t.t.r.t.r.r.r.t.r.t.y.r.r.r.r.r.y.r.y.t.y.r.r.r.y.y.r.r.y.y.t.r.y.r.y.y.y.r.y.y.w.y.y.E E y.E y.E E y.E E E w.y.y.y.y.y.y.r.r.r.r.y.r.r.r.t.y.y.y.y.t.y.r.r.r.r.t.t.t.t.t.t.t.i.u.t.t.t.u.u.u.t.u.u.u.u.u.u.u.z.E i.u.i.a.u.a.i.i.a.a.k.i.i.f.f.f.f.f.a.k.g.k.l.h.l.h.j.G.A.A.A.A.h.A.A.A.A.A.A.G.A.A.A.A.G.Z.A.G.A.G.Z.H.H.h.S.S.L.D.H.H.H.H.L.L.A.P.P.L.L.L.P.L.L.L.L.U.P.P.U.U.U.U.T.T.T.T.~.T.~.~.~.~.~.(.^.(.(.(.`.`._._.|.|.|.'.|..X.X.X@X X.X X|..X.X X X|..X.X.X.XdXdX'.zX.XzX.XdXdX'.dX'.'..X.XdX.X.X.X.X|.|. X|.|.|.|.|._.|._.}._._._._._._._.(._._.^.`._._.|.|.|.|.{.|.|.|.{. X|.|.|. X'..X.X X'.|.|.|._.|._.|.|.|.`.`.^.|.`.|._.|.`.`.|._._.|._.|.`._.|.|._.|.|..X@X'..X.X.XdX.XdX'.dXdXdX.XzX.XdX.X.XzXzXzXzXzXxXdXdXdXdX.XzXzXzXzXzXzXzXdXxXxXxXxXxXcXcXxXxXdXdXzXzXzX.X@X X.X.X.X.X'.'.@X X.X.X.X.X.X.X.X X X.X`.'. X X.X|..X|..X'..X.X.XdX.X.X'.dX X.X.X|..X X|.'.|..X X'.|.|.|._.{._.{.(.`.^.`.{.(.`.(.`.(.`._.(.(._.(.^.(.(.(.(.(.(./.(.(.(././.^./.~.~.~.~./.T.T.T.Y.L.L.L.P.D.L.P.L.P.L.U.U.L.L.U.U.U.L.L.L.L.L.L.L.L.L.L.L.L.L.K.L.Y.U.Y.K.U.L.Y.U.T.U.T.T.T.T.~.~.~.~.~.(.~./.[./.~./.!./.~.T.~.T.~.~.T.Y.T.~.Y.I.T.~.T.T.~.~.I.~.T.~.I./.T./.T.T.T.~.~./.~.~.~.~./.~./././././.^./.(././././.^./.(.(./.(.(.^.`.`.(._._.}.}.}.|.|.|..X X.X'..X.X.X|.|..X'.@X@XdXdX.X'.dX.XdX.X.X'..X.X.X X|.|.|.|._.|._.`.`.[.|._._._.^.`.`.|.(.(.(.(.(.(.(.`.(.^.|._._._._._.|.`.|.|.|. X.X.X.X.X.XdX.X.XzX.XxXdXzXzXzXzXzXzXdXcXdXdX.X'.zXdXdX.XdX.XdX.XdX.X XdX.X.X.X@X X.X'..X|..X|.|.|.|.|.|.|.|.|.|.|._.|._.|.|._.|._._._.(.(.(.(.{./.(././././.(./.~.~.~.~./.~.~.~.!.T.T.T.T.T.U.T.T.T.T.T.T.~.T.!.T.T.(.T.~.~.T.~.~.T.~.~.T.U.T.T.T.U.U.L.P.L.L.U.L.L.L.L.L.S.S.L.H.H.H.H.H.H.S.S.A.L.D.H.S.S.S.L.U.L.L.L.U.U.P.",
+"m N m m m N m N N N N N N B N B B N B N B N B B N B N N C B B B C V B B C C A C C C A C C C C A C C C C C A C Z C C C G C Z Z B Z Z C Z C A F B C D B C Z Z Z Z Z Z Z Z L Z Z Z H H J Z Z L H L H U P J L K J Y ) P P P U P ) ) P I P P P ) P ) ) ) P J ) I ) I I ) ) ) ) ) _ ) ) ( ) U ) ) ) J ) ) I ) I ) ) ) ) ) I ) P ) ) I ) I [ }.|.[._._._._._.(.(.^.(.(.(.(.{././.(.(.(.(.(.(.(.(.(.(.(.`.`.(.(.(.^.(././.(././.(.(.(.(.`.(.|._.|.|.|.|.|. X X.X.X.X@X'.'..X.XdX.X.X.X.X|..X.X|..X|.|..X|.'.'.`.}.}.}._.|.|.|.^.(.(.(.{._.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.(.(.(.(.`.(.(.(.(./././.~.T.~.T.T.T.T.T.U.T.U.T.Y.Y.T.U.P.P.U.P.L.S.L.U.L.S.H.H.G.H.H.h.A.A.A.A.l.l.h.l.h.h.h.z.k.z.a.a.f.a.j.f.i.k.a.f.i.i.a.a.i.i.i.i.i.i.i.i.i.i.i.u.u.u.u.E t.p.u.t.t.t.t.t.r.r.r.r.r.t.t.r.r.r.t.t.r.r.r.y.r.y.y.t.y.r.y.y.r.r.r.t.t.y.r.y.y.r.y.r.y.t.r.E y.y.y.y.w.y.y.y.E y.y.y.y.y.E y.y.y.r.r.r.r.r.r.r.r.t.r.r.y.r.y.y.y.y.y.t.y.y.w.r.r.r.r.t.t.t.t.E t.u.u.u.u.u.t.u.u.u.u.u.u.u.u.a.i.u.a.i.u.E x.i.i.i.a.i.i.k.i.i.f.f.k.f.k.g.z.h.h.h.g.A.g.A.A.A.A.W.A.A.A.S.G.G.Z.H.A.A.H.A.A.A.A.A.A.G.A.S.S.S.G.S.L.H.H.H.L.P.S.L.L.D.L.L.F.S.L.P.K.L.Y.P.P.U.U.Y.T.T.T.~.T.~.~.T.~.~.~.~.~.~.(.(.(.`.(._._._.|.|. X|..X|. X X X.X|..X|..X|..X.X.X.X.X.XdX.XzX.XzX'..XdXdXdXdXdXdX'..X.X.X.X|.|..X X X|.|.|.|.|.|._.{.}.}._.|._._._._.|.|._.`.|._._.|._.|._. X|. X X X|. X_.|.'.|..X|.|..X|.|._.|.|..X_._.|.`.|.|._.|._.|._.|._.|.{.|._.|._.|.|.|.|.'.|.|..X X.X.X.X.X@X.XdXdXdX.XdXdX.XdX.XcX.X.X.X.X'.'.zXzXdXdXdXzX.XzXdXzXzXzXxXcXxXnXvXxXnXcXcXxXxXxXxXzXzXzX.XdXdX.XdX.X'.dX'.dXdX.X.X'..X.X X.X.X.X|.'.|.|..X.X.X'..X.X.X.X.X.X.X.X.X@X'..X.X.X.X X|..X|. X|.|.|. X|.`.|.|.|./.|.(.|.|.^.{.(._.(.(.(.(.^.(.(.^.^.(.(.(.(.(.(.^.(.(.(.(./.~./.!.~.~.T.T.T.T.T.U.L.Y.U.P.L.L.L.P.L.P.L.L.U.Y.L.P.P.U.L.U.U.U.U.L.L.L.L.L.L.L.L.L.U.L.P.T.L.U.U.U.T.T.T.T.~.T.~.~././.(.~.(.(./.~./.~.(.!.T.~.T.T.T.T.T.Y.~.I.~.~.~.T.T.T.T.~.~.T.~.~.~.T.T.T.~.~.(.~.(.~.~.~.~.~././././.(./.(./.(./.(.^.{.^.(.(.(./.(.(.(.(.(.^.`._._.}.}.}.|.|.'.'.|.|..X|..X.X.X.X.X XdX.X.X.X.XdX@X.X@X.X.X.X.X.X.X.X|.|.|.|.|._.|._._.|._.(._._._.(.(.(.(.(.(.(.(.(.(.).(.^.{._._.`.`._.|.`.|.|.'..X'..X.XdXdXdXdXxX.X.XxXzXzXzXzXzXzXdXdXdXdXzXdXzX.XdXdXdXdXdX.XdX.X@XdX.X.XdXdXdX X'.'..X.X.X|. X|.|.|.|.|.|._.|.|.|.|.|._.|.|.`.|.|._._.[.(.(.^.(./././.^./././.~.!.(.~.~.~.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.~.T.T.~.T.T.T.T.T.U.U.Y.L.P.L.P.P.L.L.L.L.S.H.L.L.H.Y.H.S.H.H.H.H.L.D.D.S.H.H.U.S.L.S.L.L.L.Y.U.P.",
+"m N m B m N m N m N m N N m N N N N C N N B B B C N N C C N B C N C C C C N C C C C A C C C C C C C C C C C C C C Z Z C Z Z Z Z B Z Z Z Z Z C Z Z C D Z Z F Z Z Z Z Z Z H D H H H H L P J L J L L L J I P J J J P P I P ) I P P P P P ) P P ) P P ) ) ) ) ) I ) I ) ) I ) ) ) ) ) ) I ) ) ) P ) ) ) I ) ) ) ) ) ) ) P ) ) I I ) ) I [ Q.|._._._._._.`.(.{.(.(.(.(.(./.(.(.(.(.(.{.{.(.(.(.^.(.(.^.(.^.(.(././.(.(.(.(.(.(._.(.(.`._.`._.|.|.|.|.|..X X.X.X.X X.XdX.X@X.X.X.X.X.X.X.X|..X X.X X|.'.|.}.|.}._.}.}.|.{.`.(.`.^.^.|.(.`.(.(.(.(.(._.(.(.`.^.(.(.(.^.(.(.(.(.^.(.(.(.(././././.T.T.T.T.T.T.T.T.T.T.U.T.T.T.U.Y.Y.U.L.L.L.L.S.H.H.H.H.H.Z.H.G.A.A.h.A.A.A.l.h.h.z.h.h.h.k.a.g.f.f.a.a.k.i.a.a.i.i.i.a.i.i.i.i.i.i.i.i.i.d.u.u.u.u.u.u.t.t.t.t.t.r.r.r.r.r.t.t.r.t.r.t.r.r.y.t.r.r.y.r.y.r.y.y.E r.r.r.y.r.y.y.w.r.y.r.y.t.r.y.t.y.y.t.y.y.E y.y.y.E y.y.y.y.y.y.y.y.y.y.y.y.y.y.r.r.r.r.r.r.y.y.r.y.y.y.r.y.y.w.y.y.y.r.r.t.t.t.t.w.p.t.u.i.E t.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.a.a.a.i.i.u.a.i.k.i.z.z.k.k.k.f.f.f.k.h.h.h.S.h.A.A.A.A.A.A.A.A.S.Z.G.H.A.A.A.A.A.A.A.A.A.A.A.A.A.A.S.H.S.H.H.H.H.H.H.L.L.L.L.U.P.U.L.P.P.L.L.U.Y.U.P.T.U.T.T.T.~.~.~.~.T.~.~.!.~.(.(.(.(.^._._._._._.|._.|.'. X X|..X X.X|..X.X.X|..X.X.X.X.X.X X.XdX.XzXzXxX.XzXdXdXzXzX@XdX@XdX.X'..X.X.X X|.|..X X|.|.|._.|._.}._.|.(.`.`._.|._.{._._._._.|._.|._.|. X X{.|._.|.|.|. X.X X.X.X|..X|.|.|.|.|.|. X_._.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.`.`.|.|.|.'..X.X.XzX.XzX'.'.dX.X.X#XzX.XdXzXzXzXzXdX.X XzX.XzXdXzXzX@XdXzXzXzX@XzXzXxXxXvXxXcXnXcXnXnXcXxXcXcXxXzXzXzXzX.X.XdXdXdXdXdX X'..XdX.X@X.X.X'..X|..X|..X.X.X.X.X.X.X.XdX'.@XdX.X.XdX.X.X.X.X.X.X|..X|. X|. X|.|.'.|.|._._.^.|.(.`.{.^.|.(.`.(._.(.(.(.`.^.(.(.`.^.(.(.(.(.(.^.(.(.^.(./././.~.~.~.~.T.T.T.T.I.U.U.U.L.P.L.P.P.U.P.K.Y.L.Y.U.L.P.P.P.P.U.L.L.P.L.L.L.L.L.L.L.L.L.L.P.P.T.U.P.P.T.T.T.T.T.T.^.T.~.~././.[.(././.~.(.~.~.(.!.~.~.~.T.T.T.I.~.~.T.Y.T.~.U.~.~.~.T.I.~.T.~.T./.~.~.T.~.~.~././.~.{./.~.[././.(./.(./.(.(./.(.E./.(.(.(.(./.(.(.(.`.^.^.`._.}.}.|._.|.|.|.|.|. X|. X|.|.'..X X'..X.X.X'.dX.X.X.X.X.X.X|.|..X.X|.|.|.|.|.|.|._.|._._.|.`._.`._.(.(.(.(.(.(.(.(.(.(.(.{.`.(.|._.|._.|.|.|..X|..X.X.X.XdXdX.XdX.X.XzX.XdXzXzXzXzXzXzXcXvXcXzXzXzXzXdXdXzX'.dX.X.XdX.X.XzX.X.X.X.X.X.X.X|.|..X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|. X|._._._.(._.(.(.(.(.(.(./././././.~././.~.~.~.~.~.T.T.T.T.T.T.U.T.T.U.T.T.T.T.T.T.T.T.Y.T.~.T.~.T.T.T.T.T.T.T.P.P.U.U.L.P.P.P.L.L.L.Z.L.L.L.H.H.L.H.H.H.H.H.H.H.H.H.H.H.H.H.H.L.L.L.L.P.Y.P.T.",
+"m m m N m m m m N N m B N N m N N N V N B N N C B V N C m C B B A N A N C A C C C C C C C A C C C C C C Z C Z C Z C C C Z C Z C D C A C Z C Z A Z Z C Z Z B Z Z D H Z Z D H L Z H H Z H J L J J J L J J P P P J P ) P P P P P P P P P P ) P P I ) J P ) ) P ) ) _ I ) ) _ ) ) ) ) ) ) ) P ) ) I ) P ) ) P I ) ) _ ) ) ) ) ) ) I ) P T n.{.[._.`._._.`.(.^.(.(.(.~.(.(.(.(.~.(.(.(.^.{.(.[.{.(.(.(.^.{.(.(.(./.(.(.!.(.).(.!.(.(.(.`._.|.|.|.|.|.|..X.X X'..X.X.X.X.XdX.X.X'..X.X.X.X.X.X.X|. X|.'.|. X}. X}.}. X_._._._.`.(.{._._.(._.(.(.`.(.(.`.(.(.`.(.(.(.(.(.(.].`.(.(.`.^.(.(././.!.~.T.~.T.T.T.T.T.T.U.T.Y.T.T.T.T.U.U.P.L.L.L.U.H.S.H.H.G.G.A.A.A.A.A.h.h.l.l.z.h.h.z.j.a.k.z.f.f.d.f.g.i.k.a.i.i.f.a.a.i.i.k.u.i.i.i.i.d.i.u.u.u.u.p.p.t.p.t.t.t.r.r.r.t.r.r.r.t.r.t.r.r.y.r.r.r.r.r.y.t.y.y.r.y.y.y.y.t.y.t.y.y.y.r.y.E r.y.r.w.y.E w.y.y.y.y.w.E y.y.E y.E E E y.y.E y.y.y.y.y.r.r.r.r.r.r.r.t.y.t.y.r.y.r.r.r.r.r.r.r.r.t.t.t.t.t.i.u.t.i.u.t.u.u.u.u.u.u.u.u.u.u.u.E u.u.a.a.a.u.a.i.i.a.a.i.i.i.z.i.i.i.k.f.k.k.f.k.h.h.j.A.h.h.A.A.A.A.A.Z.A.A.S.A.H.A.A.G.A.h.A.A.h.G.A.S.A.A.S.S.G.G.G.H.H.H.H.L.S.L.L.P.D.L.L.S.P.L.L.P.L.U.P.U.U.T.T.T.~.T.~.T.[.~.~.~.~.T.(.(.(.{._._._._.|.|.|._.|.|.|..X|. X X.X.X X|..X.X.X.X.X.XzXdX.X.XzX.X.X.XzX.X@X.X.X'.dX.XdX X.X X|. X.X|..X|.|.|.|.|.|.|._.|._._.^.|.(.`._.|.|.|.|.|.|._.{._.|.`. X|. X_.|.|.{. X|.'.|.|..X|..X|.'.|.|.|.|._.|. X|.|.|.|.|..X|.|.|.|.`.|.`.|.|.|.|.|..X'..X.X.X.X.X.X.X.XzX.XdXdX'.zX.X.XzX.X.X.XzX@XdXdX.XzX.XzXzXzXzXzXzXzXdXdXzXzXzXxXcXxXnXnXnXnXnXnXcXcXcXxXxXcXxXzXxXdXdXdXdXdXdXdX.XdXdXdXdX X.X.X.X.X X.X`.|.'..X.X.X.X.X.X.XdX.XzX.X.X.X.X.X'.'. X.X|.'.|..X'.|.`.|.|.|.|.|.).^.(.(.`.|./.{./.|.(.(._.(.^.^.[.|.[.(.(.`.(.(.(.(.^././.~./././.!.~.!.T.T.T.T.T.U.U.L.U.U.P.P.P.P.U.U.H.L.L.L.L.L.P.P.P.P.L.U.L.L.L.L.S.K.L.L.L.L.L.L.L.P.U.P.P.T.T.T.T.T.T.T.~./.~./././.(.(.(.~./.~.~.(./.T.~.T.T.T.T.T.T.T.Y.I.I.T.~.~.~.I.T.~.~.T.~.T.T.[.T.T.~.~./.~.~.~./.~./././././././.(.(./.(.(.(.(.(.(.(.(.(.(.(.(.(.(.`.(.(.(.^.}._.|.|.'.|. X'.|..X X|.'.|. X X'..X.X.XdX.XzX.X.X.X.X.X.X.X.X X|.|.|.|.|.|.|.|._._._.^._._.^.`.|.^.`.(.(./.(.(.(.(.(.^.|.`._.|._.|.|.|.|.'..X.X.X.X.XdX.XdX.X.XxX'.dXzXzXzXzXdXzXzXzXzXdXzXzXzXzXdX@XzXzXdX.X XdXdXdX@X.XdXdX.X.X.X.X.X.X X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|..X'._.|.|._._.(.(.^.(.[.(./.^./././././././.~.~.~.~.T.T.T.T.T.T.Y.U.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.P.^.T.T.Y.P.P.P.L.L.P.L.L.L.L.L.H.L.L.L.L.L.H.L.H.H.H.H.G.H.H.H.H.H.H.D.L.S.P.L.L.P.P.P.",
+"B m m N m m m m m N m m N m m N N V M C B N N B B N B B B B B B V N C C N C V A C C C C C A C C A Z C C C C C C Z C Z C C Z Z Z B u Z Z Z C C Z B D C Z Z Z C Z Z Z Z D D D H Z H H H H P H H J J I J J P P P P I Y H J P P I P S I I L I I I I ) P ) I ) P ) ) ) ) ) I ) ) ) ) ) ) ) I ) ) ) I P ) ) ) ) ) ) ) ) ) Y ) I ) ) ) I ) ) n.(._.}.}._.|._.|.(.^.(.(.(.(./.^.(./.!.).{.(._.`.(.(._.[.(.(.(.(.(./.(.(./.(./.(.(.(._._.^.}.}.}.|.|.|.|..X.X.X.X.X.X.X'.dX.X.X.X.X X.X.X.X.X|..X.X.X.X|. X X_._.|._._.}.}.|.}._.^.`._.^._.(._.(.^.{.^.(.{.`.(.(.(.(.(.(.(.(._.(.(.{.(.(.(.(.^././.~.T.T.T.T.T.T.T.T.T.T.T.T.T.P.Y.P.P.P.L.L.L.H.H.S.L.H.H.S.S.S.G.z.A.A.A.A.h.A.h.h.h.g.z.g.g.g.i.g.a.a.a.a.a.a.a.a.a.a.a.a.a.i.i.i.f.i.i.u.i.u.u.u.t.u.t.u.t.t.r.r.r.r.r.r.t.r.t.t.t.r.r.r.r.r.r.t.r.E y.r.y.y.r.y.r.y.y.y.r.y.t.y.t.y.w.y.r.r.r.y.r.t.y.y.E y.y.y.y.y.E y.y.E y.y.y.E w.y.y.y.y.y.r.r.r.t.r.r.r.r.t.r.r.r.t.t.r.r.y.r.r.r.r.t.t.p.t.u.t.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.a.a.u.a.a.a.u.a.i.i.i.a.a.a.a.i.d.i.i.k.f.g.f.g.k.h.h.h.h.A.A.h.A.h.G.A.A.G.S.S.D.A.A.F.S.A.h.Z.G.A.G.A.A.J.A.G.S.S.S.G.S.G.H.H.L.U.L.L.S.L.L.L.L.L.U.L.U.Y.T.U.Y.~.T.T.T.~.~.T./.(./.(./.(././.(.(.(.(.`.(.|..X|.|.|.|.|.|.|.'..X.X X.X.X.X'..X.X.X@XdX.X.XdX.XdXdXdXdXzXzXdXzXdXdXdXdXdX@X.X'..X.X.X`.'. X'. X X X|.|._.|.}.}.|._.|._._.|._.|.'.|.|._.|._.|.'.{. X|.|.'.|.'.|.|.@X X X'. X.X.X.X.X|.|.|..X X'..X.X.X.X.X.X'. X'.'. X|..X|..X|.'..X'.'..X.X XdXdXdX.X.X.XdXdXdX.XzX.X.X.X.XdXdXzXzX.XdXdX.X.XdXzXzXzXzXzXzXzXzXxXxXxXxXcXnXvXmXmXcXmXnXdXJXcXcXcXxXzXxXxXzXdXzXcX@XdX XdXdXdXdXdX'..X'.|..X.X.X.X.X'..XdX.XdXdX'.dXdXzX'.zXzX.XdX.X.X.X'. X.X X|.|.|.|.|.|..X|._._.`.^.(.`.^.`.{.{.(.`.(.(.(.(.(.`.`.{.(.|.(.(.(.(.(.(././.[.^.~.~.^.T./.~.T.I.Y.T.U.U.U.L.L.L.L.L.U.L.L.L.L.L.L.U.U.U.U.U.T.P.P.L.L.L.S.H.L.L.L.L.H.L.L.L.P.P.Y.U.T.T.Y.T.T.T.T.~.~.T.(.~./.{.~.~.(./.^./././.~.~.~.T.~.T.~.T.I.T.~.~.T.T.~.T.T.~.T.~.~.I.~.T.T.~.~.~.~.(./.~././././.^.~.E.(.(.(.(./.(.(.(./.(.!.(.(.(.(.(.(.(.^.^.`.`.(.`.`.{.|.|._.|.|.|.'. X X'.|. X_.|.'..X.X.X.X.X.XdX X.XdX.X.X'. X.X X.X.X.X X|. X'.|._.|.|._._._._.^.(._.(.(.(.^.(.(.(.(.(.(.`.`.|.|.|.|. X'..X.X.XdX.X.X.X.X.X X.X XdX.XdXdX.XzXzXzXdX.XzXzXdXdXxXdXzXzXdXdXdX'.dXdX@XdXzXzX'.zX'..X.XdX.X.X.X|..X X.X|..X`.`.'. X.X|..X.X.X.X.X.X.X|.|.|.|._.(._._.`.(.`._.^.(.!.(.^././.(./.~.~.~.~.T.~.T.T.T.T.U.T.U.U.P.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.[.T.T.T.T.T.U.P.P.P.L.P.Y.L.L.L.L.L.L.L.L.L.H.H.L.H.H.H.H.H.H.S.H.H.G.H.H.H.L.L.L.L.U.P.P.",
+"N m m m m m m N m m m m m N m m N M N N N B N N N C B B N N B B C V N C C N C C C C C C C C C C C C C C C C C F C C Z C C Z Z C Z Z C Z Z C Z Z Z Z C D Z Z Z Z Z Z D D D G H H H H P H H H J J H H J P H P P P J I J I P P I P I I P _ I I ) I ) ) P ) ) ) ) ) ) ) _ I Y ) ) ) P ) ) ) ) Y ) I ) S ) ) ) ) ) ) ) ) ) ) ) Y ) ) ) ) ) b.]._._._._._._._._.{.(.(.^.^.(.).(./.(.(.(.^.^.[.(.(.(.(.(.(.(.(.(.(././.(./.(.(.!.(.(.(._.}.}.}.|.|.|.|..X|.'. X.XdX'.dX.XdXdX.X.X.X.X.X X.X.X.X.X.X|.|.|.|. X|.|.|.|.|.}.}.}._._._._._.(._.(.(.|.(.(.|.|.^.`.{.(.(._.(._.(.(.(.(.(.{.(.(.(.^.^.(./.~./.~.T.~.T.~.T.U.XXT.T.T.T.P.Y.P.P.U.H.K.H.H.H.G.G.G.S.S.S.S.S.S.h.A.A.A.l.h.h.h.g.z.d.a.a.a.g.g.a.a.a.a.a.a.a.a.d.a.a.a.i.i.d.i.i.i.i.i.u.u.t.t.t.t.t.t.r.r.r.t.r.r.r.y.r.r.E r.y.y.y.y.r.y.y.y.r.r.y.y.r.r.y.E r.r.y.y.E y.y.y.y.y.t.y.y.y.y.R y.y.y.y.y.y.y.y.y.y.y.y.y.E y.y.y.y.y.y.y.y.y.y.r.r.r.r.y.r.y.E r.r.r.r.t.r.r.r.t.r.r.t.t.t.r.u.t.u.E u.u.u.u.u.u.u.u.u.u.i.u.u.i.E a.u.u.u.a.a.a.i.i.a.d.a.d.i.f.k.d.z.d.d.g.j.g.h.h.h.h.h.A.A.A.A.A.A.H.A.S.A.S.A.S.A.A.A.S.S.S.A.A.A.A.A.h.A.A.S.S.S.S.H.H.l.H.S.S.L.U.U.L.L.L.P.P.P.P.U.U.U.T.T.T.T.~.T.~.~.~.~.T./.R.~./././.^.{.^.^.`.^._._.|.[._.|.`.|.|._.|.|.|.|..X|..X.X.X.X.X'..X.X@X XdXdX@X.X'.'.'.zX.X@X.X.X.X.X.X|.|.|.|.|.|.|.`.|.|.|.{.|.{.|.}.}.`.|._.|.|.|._.|.|._._.}._.|.|._.|.{.|.[.|.{.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|. X|..X@X|..X.X|.@X_.|.|.|.|.|.|.|.|. X.X X X.X X@X.X.X.X.XdX.X'..X.XzX.XcX.XxX.XdXzXzXzXzXdXvXdXnXzXzXzXzXzXzXxXzXxXxXxXxXmXvXMXnXmXmXmXcXmXmXcXnXcXcXxXxXxXzXxXzXdXdXdXdXzXdXdXdXdX@X.X X.X.X X X.X`..X'.@X X.X.XdX@XdX'.dX@X'..X.X.X.X X X|.|.|.|.|.|.|.`.`._.{.|.(.(.{.{.(.^.(.|.(.(.(.(.{.).(./.[./.(.(.(.(.(.(./.(././.(.E.(.~./.~.~.~.T.T.~.T.T.T.Y.L.R.P.L.L.L.U.U.L.L.P.L.U.T.U.L.Y.P.P.P.P.U.P.P.U.L.L.L.L.L.U.L.L.L.U.T.U.Y.U.T.T.T.T.T.T.T.~.~.~.~.~.~.[.(././.~.(./.T.T.T.T.~.T.T.T.T.~.T.T.I.T.T.~.~.~.T.~.T.~.].~.~.~.~.~.T.T./.~././.^./.[./.^.^././././.(.].(.(.(.(.(./.(.(.(.(.(.(.`.^.(.(.^.^.^.(.(.(._.`.`._.|.|.|.|.|.|.|.|.|. X X.X.X.X X X@X.X.X.X'. X@X'..X|.|.|.|.|.|.|.|.|._._.}.|._.|._.(.{._.^.|.^.(.(.(.(.(.(.(.(.{._.`.`.|.|.|.|..X.X|..X X@X.XdX@XxX X.XdX.X.XxX.X.XxXdX@XzXdX@XdXdXzX@XdX@X'.dX@X'..X'.'.'.'.@X@XdX.X@X.X.X.X.X X'.|.|.`.`. X'.|.|.|.|.|.|.|.'.|.|.|.|.|.|.|.|.|.{.(.(.(.{.[.^.^./.^.~./.~./././.~.~.~.T.T.T.P.P.T.U.U.T.P.U.T.T.T.U.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.U.U.T.P.P.P.P.P.P.L.L.P.L.L.L.U.H.L.H.H.H.H.H.H.D.H.H.L.H.H.L.H.L.L.S.L.L.U.L.P.P.",
+"m N N m m m m m m m m m m N N m M N V N B V N B N B B B B M N B N C V C C C C C C A Z C C Z C Z C Z Z C C F C D C C C Z C Z C Z F D Z C C Z C Z C Z Z B C F C Z Z Z Z D Z D H D H U H J P H H J H H J P J J P P P P J I Y J P I P P ( L P I ) P P ) P I ) ) ) ) ) ) ) I _ ) ) ) ) ) ) ) ) ) ) ) I ) ) ) I ) ) ) ) ) I ) ) ) ) ) ) P ) [ _._.}._.|._._.|.`.`.(.^.^.(.(.(.(.(./.(.(.(.(.(.(.[.(.(.(.(.(.(.(./.(./.!././.(.(.(.(.(._._.}.}._.|.|..X|..X.X@XdX@X.X.X%XdXdX.X.XdX.X.X.X X|..X|..X.X|.|.|.|.|.|.|.|.|. X}.}._.(.|.^.}.^.`.`.(.^._.(.(._.`.(.|._.|.^._._.(.^.(.(.(.^.(.(.(.(.[.~./.~.T.T.T.~.T.T.T.T.T.T.T.T.P.Y.P.P.P.L.L.J.S.H.H.H.H.G.S.S.S.S.A.S.A.A.A.l.l.h.h.h.k.g.g.j.j.a.f.a.a.a.a.s.a.s.a.a.s.a.a.i.i.i.a.i.s.i.i.u.u.u.u.u.t.u.t.t.t.r.t.r.r.y.y.r.y.y.y.y.r.t.t.y.r.r.t.r.r.r.r.r.y.y.y.y.w.r.r.r.r.t.R r.r.y.w.y.r.y.y.r.y.y.y.y.E y.y.E y.E y.y.y.y.y.y.E y.w.y.y.y.t.r.r.E t.t.r.t.r.r.r.r.r.E p.r.t.t.t.t.t.t.t.p.p.t.p.t.r.t.u.u.u.u.u.t.s.s.t.r.r.u.t.a.u.u.E u.u.u.u.i.i.i.i.a.i.f.i.i.i.i.z.f.f.z.g.h.h.h.h.h.A.h.A.A.A.A.H.S.A.S.S.D.S.A.S.S.S.S.S.G.A.A.A.A.A.A.G.S.S.S.S.A.H.H.H.H.H.S.S.L.S.D.U.P.P.U.U.I.I.T.T.T.T.T.~.T.~.~.^.~.R.T.(./.(.(.(.(.`.^.`.^.`.{.`.}.}._.|.|.|.|. X X'. X X.X.X.XdXzX.X.XdXdXdXdX.XdX'.'.dXdXdXdXdX.XdX.X.X X X X X.X.X|. X|. X|. X X_. X|.|.|._.|._._.|._.|.'.|.|.|.|.|.|.|.|. X|. X|.|.}.|._.|.|.|.|.|.'. X.X X'..X X.X X.X.X.X.X X.X'..X.X.X.X.X.X X.X X X.X.X.X.X.X@XdX'.zXdXdXdXzX.XdXdXdXdXdXzX.XzX.XzXxX.X@XzXdXzXzXnXdXdXdXzXzXxXxXzXxXxXxXxXnXJXxXcXmXmXmXmXmXmXmXnXcXcXcXxXcXxXxXcXdXzXdXdXdXdXdXdXdXdXdXdXdXdXdX'.dX.X.X'.dX X.XdXxXdXdXzXzXdXdXdXdXdX.XdX@XdX.X.X X.X|. X X|.|.|.|.|.|._._.|._.`.(.`.(./.(.(.(.(./.(./.^.(._.].).(./.(./.(.(././.(./.~.(.(.T.!./.T.^.T.T.T.U.U.Y.K.J.U.L.L.P.U.P.D.L.P.L.U.I.I.P.P.P.T.U.U.L.U.L.L.L.U.L.L.U.L.U.L.U.U.U.T.T.T.T.T.T.T.T.~.~.~.~./././.^.[.[./.^.~.~./.~.~.~.~.~.~.~.~.T.~.~.T.T.T.T.T.~.~.~.~.~.T.~.~.T.~./.!.(.~././././.^./.[././.(.(./.(.(.(.(.(./.(.(.(./.(.(.(.`.(.(.(.(.(.`.(.|.|._._.|.|. X|.|._. X|. X X X'. X.X|..X X.X.X.X.X.X.X.X X|. X X.X.X.X.X.X.X.X.X.X'. X}.}.(._.`.`.|.^.{.{.(.^.(.`.(._._._.`.`.`. X|.|.|. X.X X X.XdXdX'.dX.XdXdXdX.XdXdX.X.XzX.XdXdXdXdXzXnXdXcXxXdXdXdXxXdXdXdX'.dXdXdXdXdXdX.XdXdXdXdX.X.XdX X.X|..X.X.X X.X X.X.X.X.X.X.X X.X.X.X X X'.|. X_._.`._._._.(._.(.^.(.).(././././.~.T.T.~.P.T.P.T.U.U.Y.T.P.T.U.U.T.T.T.T.Y.T.T.T.T.T.T.T.~.T.T.T.U.P.P.P.P.P.P.P.P.L.L.L.P.L.L.L.L.H.L.H.L.H.H.H.H.H.H.H.G.L.S.L.L.L.L.L.P.L.L.L.L.",
+"m m m m m m m @.N m m m m N N N N N V V N N B N B B B B N N C V C N C V N C C A C C C C C B C C C C C C C C B C Z D C C C C Z Z D B Z Z C Z Z Z Z C C Z Z B Z Z Z D D D D D H H Z H H H P H J J J U K H J J U P P J I J P P J P P P P P I I P I ! I ) ) P ) P ) I ) ) ) ) ) I ) ) I I I ) ) K _ ) ) ) I ) ) ) U ) I ) ) ) I ) P _ ) ) ' ]._._._._._._.{.^.(.(._.{._.].!.].(.(.!.[.(.{.(.(._.(.(.!.(.(./.(././.(.(./.(.(.(.(._.(._._._.|.|.|.|.|..X.X|.'. X.X.XzX.X.X.X.X.X.X.X.X.X X.X X.X|..X|.|.|.|.|.'.|.|.|.}.}.}._._.^.|.{._.^._.|.|._.|.|.^.{.`.`._.|._.[.^._._._.{._.`.(.(.(.(.E.~././.~.^.T.T.T.T.T.T.T.T.T.T.T.Y.P.Y.P.L.L.U.D.H.H.H.H.S.S.S.S.S.G.A.A.A.l.A.l.l.h.g.g.k.k.g.i.g.f.k.a.a.k.a.z.f.f.i.g.a.a.f.i.d.d.f.i.i.u.i.u.u.u.t.u.r.t.r.r.r.t.y.r.y.r.t.E y.t.r.r.y.t.r.r.r.E r.r.r.y.y.r.r.r.t.E y.y.y.y.r.r.y.r.E r.r.r.t.y.y.E E E y.y.y.E E E y.E E y.E y.y.y.E y.y.y.t.y.y.r.y.r.r.r.r.r.r.t.E t.t.t.t.t.t.r.u.t.t.u.p.t.p.u.u.u.u.u.u.u.u.u.u.u.a.u.u.s.u.u.a.a.a.x.a.a.a.a.a.a.f.f.z.i.f.f.g.k.f.f.k.g.k.z.h.h.h.h.h.A.A.A.G.h.A.A.A.S.S.S.A.S.S.S.A.A.S.A.A.A.A.A.A.A.h.A.S.S.S.S.H.H.H.H.H.S.H.S.L.U.L.L.P.P.P.Y.!.Y.T.~.!.Y.!.~.!.~.~.~.~./././././././.!.(.`.^.^.`.^._.}.}.|.|._._.|.|.|.|.|.|..X.X.X.X.XdX.X.XdX XdX X.XdX XdX.X.X X@X'. X.X'..X.X'._.|.|.|.|.|.|.|.|.|.|._._.{._.|.|._.|._.|.|.|.|.|.|.|.|.|._.|._.|.|.|.|.|.|._.|.|.|. X|.|.|.|.|..X|..X'..X|..X.X'.'..X.X`..X'..X.X.X.X.X.X.X'..X.X.X.X.X.X.X.X.X.X.X.X.X@X.XdX@XcXzXdX.XzX.X.XxXzXzXdXzX.XzXzXcXdXzXxXzXzXxXxXxXxXnXcXnXcXmXmXmXmXmXmXmXmXMXnXnXnXnXcXcXcXcXxXxXxXzXdXvXdXcX@XdXdXdX'.dX@X.X.X'..X@X.X.X.XdX'.dXdX'..XdXdX'.zXdX.X.X.X X.X.X.X X|.|._._.|._._.|.|.|.|._.{.(.|.{.(.|.(.(.(.(./.(././././.(.(./././.(./././././.~.!.T.~.~.~.T./.T.T.T.T.T.U.I.I.U.L.L.L.D.G.P.P.P.L.L.U.U.L.P.P.P.D.L.L.L.S.L.L.H.L.L.L.L.L.L.U.U.T.T.Y.Y.!.!.Y.~.~.T.~.~.~./././.~./.T././.~.~.~.~.~.~.T.~.T.~.T.~.~.T.T.~.T.~.~.T.I.~.Y.T.T.~.~.~.~.~.~.~.~.!.~./././.^.^.E.^././.(.(./.(.(.(.(.(.(._.).!.(.!.(.(.(.(.).^.(.(.`.^._._.|._._._.|.|.|.|.|.|.|.|.|.|..X|. X.X X.X.X.X.X.X.X X.X.X|.|.|.|..X|..X|.|.|.|.|.|._.|.|.(.^._.{.(.|.(.|.(.^.(.(.(.^.`.(.|.`.|.|.|.|..X.X'. X.X.X.X.X.X.X.X.X.X.XdX.X.X.X.XdXdX'..XdXfXdXdXxXxXdXdXdXzXdXdXdX'.dX'.dXdXdXzX'.dX'..X.X.X.X|. X.X.X.X.X.X.X.X X.X.X|..X.X.X.XdX.X.X.X X X|._.|.`.(._.[.(.(._.|.`.(.(./././.!./.~.!.T.T.T.T.U.T.U.Y.Y.T.U.U.T.T.Y.Y.T.U.P.U.T.T.T.T.T.T.T.T.U.T.T.P.T.U.P.Y.P.P.L.P.P.L.P.U.G.L.L.L.H.H.H.H.H.H.H.H.G.L.S.H.L.H.U.D.L.L.U.L.L.U.",
+"N m m m m N m m m m m m m m m m N m N N N V N V N B N B C B B B C B C C B C C C C C C C C C C C C C C C C Z C C C C Z B Z C Z Z B Z B Z D C Z D Z C C B C Z Z Z H Z D Z H Z H Z H H H P P H J J H P J L P P P P P P J I J P I P ) I I I I L _ ) P ) ) P ) I ) ) I ) ) ) ) I ) ) ) ) P ) ) I ) I ) ) P ) ) ) ) ) ) P ) ) ) I ) ) ) ) ) _ ].~._._.|.^.(.(.(.^.(.`.(.(.(.(.!.(.^.~.(._.(.(.^.(.(.{._.(.(.(./.(./././.(.(.(.(.(.(._._.|._.|._.|.|.|.'.'.'.dX.X.XdX'..X.X.X.X.X.X.X.X.X X X X|. X.X|.'.|.|. X|..X'..X}.}. X}.}.}.|._.(.|.`._._.^.`.).(.|.|.|.{._.}.}.|.(.|.`.^.^.^.(.(.(.(./.{.~./.T.T.~.T.~.T.T.T.T.T.T.T.T.T.P.P.P.U.L.H.L.H.H.H.H.S.G.S.S.H.S.S.S.A.A.A.A.h.h.k.h.k.k.k.k.a.k.f.f.g.a.a.s.a.a.a.a.a.a.a.a.i.i.a.a.u.u.d.u.u.u.t.t.r.r.r.r.E y.r.r.r.r.y.y.r.y.t.y.y.y.r.y.y.y.y.y.y.y.r.y.y.y.y.y.y.y.y.y.y.y.t.r.r.r.r.y.t.y.y.y.y.y.y.y.E y.y.E y.E w.y.y.y.y.y.E y.y.y.y.r.y.y.y.r.r.r.r.t.t.t.t.t.r.r.r.r.r.t.t.t.t.t.t.t.t.t.t.u.u.u.u.u.u.u.s.i.u.u.u.u.i.u.u.u.u.i.u.u.a.a.i.a.a.i.f.s.a.a.f.i.a.k.f.k.f.h.h.l.l.l.l.l.A.A.A.A.S.S.S.S.S.S.S.S.S.S.S.A.A.A.G.A.A.A.A.A.A.G.z.S.S.S.S.S.S.S.H.L.S.L.D.H.P.S.L.L.U.U.U.P.Y.T.T.T.T.~.T.T.T.~././././.(.[.{.{.(.(.(.^.`.(.(._.|.|._.|.|.'. X X|..X.X.X.X.X.X'..XdX.X.XdXdXdXdX.X.X@XdXdX X'..X'..X.X.X.X.X|.'.|..X.X.X X|.|.|..X'._.|.'.|.|.|.|. X_. X|. X X|. X|.|. X X_.'.|.|. X_. X X|.|.|.|.|. X X|..X.X.X.X'..X.XdX X.X.XdX.X'..X.XdX.X.X.X.X.X.X'..X.X.XdXdX X.X'.dX.XdX.X.XfXdXdX.XdXdXzX XzX.XzXdXdXdXzXzXzXzXvXzXcXvXzXzXdXcXcXxXxXcXnXnXmXmXmXmXmXmXmXmXmXmXcXmXcXcXcXcXJXcXxXxXxXxXdXdXcXnXxXcXcXdXdXvX.X.X.X@XdXdX.XdX'.dXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdX.X.X'..X.X|.|.'.|.|._.|.|._.`.`.^.(.(.`.^.(.(.(.{././.{./.(././.{./.!.(.E.~.[.[.[.~.[.(.~.~.(.~.~./.~.~.T.T.T.T.T.U.U.P.L.U.U.L.L.L.P.L.U.L.U.L.L.K.L.L.U.L.L.L.L.L.P.P.H.L.L.L.Y.I.L.I.T.T.T.I.Y.Y.T.T.~.T.T.T.T.T.~.^.T.~.~.[.T.T.T.T.~.~.T.~.~.T.~./.T.T.T.~.Y.I.T.~.T.R.~.R.~.~.~.~.~./.~.~.~.~.[././././.(././.^.[.(./.(.(.(.^.(.`.(.(.].(.!.(.(.(.(.(.^./.^.(.(.|.|._.|._.|.|._.'.|.|.|.'. X.X|..X|.|..X.X.X.X.X.X.X.X.X.X.X X X'.'..X.X@X XdX'..X|..X.X|. X|.`.`.`._.(._.{._.(.`.(.`.(.`.|.|._._. X|. X X.X.X.X.XdX.X.X.X.X.X.XdXdXdXdX.X.X.XdX.XdX XdXdXdXdXdXxXdX.XdXdXdX'.dXdX'.@XdX'.dXzXxX.XzX'..X@X X.X.X.XdX'.@XzX.X.X.XdXdX.X.X'.zX'.zX.X.X.X.X.X X'. X'.|.|._._._.(.(.`.^.(.^.(.(.(.(././.~.~.T.T.T.T.U.P.T.I.T.U.U.T.T.U.T.T.T.U.T.T.Y.T.T.T.T.T.T.T.T.T.P.T.P.T.T.T.P.T.U.U.U.L.P.S.U.D.L.S.L.H.H.D.G.H.H.H.S.L.L.L.L.S.P.L.L.L.L.L.L.U.",
+"N m N m m m m m m m m m m N N N F m N N V N V N B N B N M V B u M C C V C B C A F C C Z C Z C Z Z C Z C C C D C D C C C C Z C D Z D B D Z C Z B Z Z D Z Z Z Z C L Z D D D Z H H H J H H H P H J U K J J K P J P I J P P K L P P P P P P I I P I ) ) P ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) P ) ) ) I ) I ) ) I ) ) ) ) ) ) ) ) ) Q._. X_.`.`.`.|.`.^.^.`.^.(._.(.(.(.(.(._.!.{.[.`.(.(.(.(.(.(././.!.(././.(./.(.(.(.(._._._.|._.|.|.|.|..X X X@X.XdX.XzX.XdXzX.X.X.X.X.X.X.X`.@X.X|.|.|.|. X.X|.|..X|..X}. X}.}.}.}.^._._._.^._._._.^.|.|._._.|._.|.|.}.(.`.`.(._.`.`.^.(.)././././././.~.~.~.T.T.T.T.T.T.T.T.U.P.Y.P.P.U.L.L.L.L.H.H.H.H.G.S.H.H.S.S.S.D.A.A.A.A.h.h.k.k.k.k.k.g.a.a.a.a.a.a.a.s.a.a.a.a.a.a.a.i.i.i.i.i.i.u.u.u.u.u.u.t.t.t.r.r.r.E r.y.y.y.y.y.y.y.y.r.y.r.y.y.r.y.t.t.y.r.r.r.E r.r.r.w.t.E r.r.r.r.r.r.y.r.t.y.y.y.y.y.E E y.y.y.E E y.y.E y.E E y.y.w.r.r.y.r.y.t.r.t.r.r.t.t.r.t.u.t.t.r.i.t.r.t.p.t.t.u.p.u.t.u.p.u.u.u.u.u.i.i.u.s.p.i.i.u.i.u.u.u.u.u.a.a.a.a.i.d.a.g.f.f.g.j.k.k.k.g.z.z.h.z.l.l.l.l.h.A.g.H.A.S.S.A.S.S.S.S.S.S.S.S.S.S.S.S.A.A.A.A.A.A.A.A.G.A.H.A.S.S.S.S.S.L.L.S.D.P.L.Y.P.P.U.U.T.T.T.~.~.~.T.(.T.[.~.~.~.R.~././././.(.[.(.(.|._._.{._.^._.^.)._.`.|._.|.|.|.|.'. X.X.X.X.X.X@X.X.X@X.X.X.X.X'.'.'..X X.X.X|.|.`.|.|.@X.X`.|.|.|._._.|.`.|.|._._._._.`.|.`.`.|.|.|.`.`.|.|.|.|. X_.|.|.`.|.|._.|._._.|.|.|.|.|.|..X|.|..X.X.X.X.X.X.X.X.X.X.X.X.X.X'..X.X'..X.X.X.X.XzX@X'.'..XzX@X'.'..XdX.XdXfXdXzX.XxXdXzXdXzXzXzXdXzXzXdXvXzXzXzXdXxXxXcXcXzXxXxXMXnXnXmXmXmXmXmXMXmXmXmXmXMXnXnXnXcXxXzXcXxXxXcXdXcXnXnXdXdXxXdXcXnXdXdXdXzX'..X.X.XdX'.@X X.X'.@X'.@X'.xX'.dX'.@XdX@X.X.X.X|.|.|.|.|.|._.`.|._._.{.{.|.|.|.(.(.(.(.(.(.(.[.{././././.{././.(.^.{./.!././.[.~.T.~.[.T.~.~.~.T.T.~.~.T.U.T.U.L.P.L.U.D.P.P.L.U.P.L.U.U.U.L.L.L.L.T.D.U.U.L.D.P.U.U.U.U.L.U.Y.T.U.T.T.T.T.T.T.T.T.T./.T.~.~.T.(.T.~.[.~.~.~.T./.~.T.T.T.~.~.~.T.T.T.~.T.T.T.T.~.T.T.~.R.~.~.~.~.~.~.~.~./.~.~.!.[././././././.^./.(.(./.(.(.(.(.(.(.(.(.(.(.(.(.(.(.`..X_.(.(.(.(.).^.^.|._.|.|.|.|.`.|.`._.|.|.|.|.|..X|.|.|.|.|..X.X X X_.|.|.|.|.`.|.|..X'.'..X|.|.|.|.|.(.`._.(.(.`.(.).(.(.(.(.(.^.^.(._.|.|.|.|.|.|.|..X|.|.@X.X.X.X.X.X.X.X.X.X.X.X'..X X|..X@X'.'.dXdXdXdX'.zXdXdXdX.X'.'.@X'.zXdXdX@X'.zX.XxXdXdXdXxX'.@X.X.XdX'.zXdX@X@X'.@X.X@X'.'..X'..X.X.X.X.X'. X|.|.|.|.{.{.`.`.`.(.(.(.(.(.(.(.)./.^.~.~.T.T.T.U.U.U.T.U.T.T.U.U.T.U.U.I.T.T.I.Y.T.T.T.T.T.T.T.T.T.T.T.T.U.U.U.T.T.P.U.U.U.L.P.L.L.L.S.H.H.H.L.G.D.H.H.L.L.S.U.L.L.P.P.L.L.L.L.L.L.",
+"m m m m m N m N m m m m N m B m V V N N N V N N N N N B B B B B B B C B B C B C C C C C C C C C C A C C F Z C C C D C C Z Z C B Z C Z C Z A F C C Z Z Z D B D Z Z Z D D D D H H H U H P L Z L J H P H J Y J J J J P P L P H I L I I ( I I I I I P ) ) ) P ) ) ) ) ) Y ) ) ) Y _ I ) ) ) ) P ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) P ) I ) ) ) [ n.|.|.(.{.(.|.^.|.^.|./.(._._.(.(.(.(.[.(.(._.^.(.(.(.^.!.(.!.(.(.(./.(.(.(./.(.(.(._.(._._._._._.|.|.|. X X.X.X.XdX@XdXdX.X.X.XdXzX.XdX.X.X X X.X.X X.X X|..X X X|.|.|.}.|.}.}.}.}.{.{.^.(.`._.|.^.|._.|._.|._.|.|.|.}._._.`.(.(.(.`.(.(.(./.(./././.~.T.~.~.T.~.T.T.Y.T.T.U.U.P.P.P.P.K.L.L.S.H.H.H.H.H.H.H.S.H.H.A.S.H.A.h.A.A.z.h.k.z.g.g.k.z.z.j.a.k.i.a.i.a.g.z.i.a.a.a.a.f.i.i.i.u.u.u.u.u.u.t.t.r.t.r.r.r.r.r.r.r.y.y.y.y.y.y.y.y.y.r.y.y.y.t.w.r.y.r.y.r.y.E t.r.t.t.y.r.r.r.r.y.y.y.y.y.r.y.y.E E y.E y.E y.E y.y.y.E y.y.E y.y.y.t.r.y.y.t.y.t.r.t.r.r.r.t.t.t.t.t.t.p.t.t.t.t.t.u.r.t.t.t.t.u.u.u.u.i.i.i.i.i.i.i.i.i.i.i.u.i.i.i.i.i.i.u.a.k.d.f.f.f.f.a.g.i.g.j.a.z.k.z.z.k.l.l.l.A.h.A.z.A.G.G.A.S.S.G.S.S.S.S.S.H.A.S.A.A.A.h.H.h.A.A.G.A.G.H.h.S.S.S.S.L.A.S.S.Z.P.L.S.P.Y.U.T.Y.T.T.~.T.~.~.~.~.~.~.(.!.(./.(.(.(./.^.(.{.^.(.^.|.{._.{.|._.|.|._.`.`..X.X.X.X'.@X'..X X.X.X.X.X@X.X.X.X@X'.'. X.X.X.X@X'..X.X.X.X.X.X.X`..X|.|.|.|.|.'.|.|..X|.|.|.|.'. X`.'.'. X'..X|..X|..X@X`..X|.`.'.|. X'. X'.|.|.|.|..X.X.X_.'..X.X.X.X.X@X.X'..XdX'.zX.X.X.XzX.X.X.X.X.X@X X'..XdXdX@X.X'.@X'.dXdX.XdXdXdXzXzXzX.XzXzXzXzXvXdXzXcXxXcXcXzXvXvXxXxXdXcXcXcXnXnXnXnXnXmXmXmXmXmXMXmXmXmXmXnXmXnXmXcXcXcXfXJXxXxXdXdXcXcXcXdXcXdXzXdXxXdX.XzXdX.X.XxXzX'..XzXdXdXdXdXdXdXdX@XdXdX.XdX.X.X.X.X.X`.|.`.|.|.`.'.`.(.`.`.|.{.(.`.(.(.|.^.{.(./.(.{./././.^.^.~./.!././.(.(.(.~.~.!.!.T.T.!.!.~.~.~.T.T.T.U.U.U.U.U.P.L.L.P.L.L.P.L.L.L.L.L.U.L.L.U.S.U.U.L.L.L.D.U.P.L.L.L.T.I.I.U.T.T.T.T.T.!.Y.T.T./.T.T./.T.T.!.T.T.T.~.~.T.~.T./.[./.T.~.~.~.~.~./.(.~.T.~.~.T.T.T.~.T./.~.(.~.(.!././././././.(./.[././././.(.(.(./.(.(.(.(.(.(.(.(.(.(._._.(.(.{.|._.'.|.(.{.|.|.`.|.|._.'._.|.|.`.|.`.|.|..X.X.X.X.X.X'..X'. X.X|..X@X'.@X|._..X.X.X.X.X.X.X.X.X.X|.|.`.'.`.{.|._.|.^.^.|.`.(.{.|.|._._.|.`..X|..X.X.X'.zX.X'..X'.@X.X.X@X'..X.X@X X.X.X.X.X.X.X.XdX'.zX@XzXzXzX.XxX@X'.zXdXzXzXdX.XzX'.dXzXdXdXdXdXdX.XzXdX.X.XdXdX.X'.dXdX.X XdX'..X'.@X.XdX.X X.X.X@X.X.X.X|.`.`.|.|._.(.|.'..X(.(./.(.(.!.(.~.T.T.T.T.U.T.T.Y.T.U.T.U.T.I.T.L.Y.Y.I.T.T.T.T.T.T.T.T.T.U.T.T.Y.T.T.T.T.T.Y.P.U.U.U.H.D.L.L.S.L.G.H.L.H.D.L.L.H.S.L.S.L.L.L.L.S.L.L.L.L.K.J.",
+"m N m N m N m m N m m m m m m N N V V N V N V N N N B N B B B B B C B C B C C C C Z C C C C Z Z C C Z C C C C Z C C C D C D C Z B Z Z Z C Z C B Z Z C Z Z Z Z Z Z D D D L D Z H H H H H P H H J H L J L J J P J P P L L P P P I I I I I I L ( I I ) P ) ) ) ) P ) I ) ) ) ) I _ ) ) ) ) ) ) P ) ) I ) I ) P ) ) I ) P ) U ' ) ) ) ) I ) b.!._.`.`.`./.|._.|.(._.(._.(.(._.(.(.(._._.(.^.(.(.(.(.(.(.).(././.(././.(.(.(.!._.(._._._._._.|.|.|.|.|..X.XdX'..XdX X.X.XzXzX.X.XdXdX.X.X.X X.X.X.X X.X.X.X.X.X.X X X X|.}.}.}.}.}._.`.`._._._.|._.|._.|.|.|.|.|.|._._._._.`.`.`.^.(.(.(.^.^././.[./.[.~.~.~.~.T.T.Y.U.T.T.U.Y.P.U.P.U.L.L.L.L.H.H.S.H.H.H.S.A.H.G.G.H.H.A.A.A.A.h.h.k.k.z.f.f.T ` U ~ ~ ~ ~ ~ ~ S ~ ~ ~ ~ ~ ! ! ~ ! / S / I ! ! S ~ ! ! ~ ~ S ~ ! S ~ ^ / S S ~ ~ ~ ~ ~ ~ ~ ! ! ! ! ~ ~ ~ ~ ~ S S / S / S S ~ ! ~ ! ! ! ~ ~ ^ S S ~ A Z S ~ Z S S S S S S q ~ S ~ ~ ~ ~ ~ ~ S ^ ~ ^ S ! / S P ~ ~ ~ ~ ~ ! ~ ! ! S ! ~ ! ! ! ! ~ ~ ~ S / / P S / ! S S ~ ~ ~ ! S / ~ ! / / / S / H / S S ~ ~ ~ ~ ~ ~ ~ / ~ ~ L [ T b.h.l.l.l.l.A.A.A.A.A.G.A.S.S.A.A.S.A.S.H.H.h.J.G.A.G.S.h.J.A.A.A.H.S.S.S.S.S.S.S.A.G.H.G.P.Z.F.[ / I ! ! ~ ~ ~ ~ ~ ~ S ~ S ~ S ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ / ~ ~ / ~ / ~ ! ~ ~ ~ _ / ~ ~ ~ ~ / / ~ ! ~ ~ / / / / / ~ / / / / / Q / ! ! ~ ~ ~ ~ ~ S ~ ~ ~ ~ ~ ~ / ~ ~ ) / ~ ~ / ~ / / ~ ~ ~ ~ ~ ! / ! ~ / ~ ~ / ~ ~ ~ / ! ) / / ~ ~ ~ ~ ~ ~ ~ ~ ~ ' / ~ ! / / ~ / / / ! / ~ / ~ ~ ~ / ~ / ~ / ~ / / / ~ / Q Q ~ / ! ~ ~ ~ ~ ~ / _ [ m. X.XzXzXzXdXdXnXdXzXdXdXzXzXzXdXxXxXcXcXcXnXnXnXnXMXmXmXmXmXmXmXmXmXmXMXnXmXmXnXnXcXcXcXcXnXdX].m._ ~ ~ ~ ! Q ~ / ~ ~ / ~ ~ ~ / ~ ! / ~ ^ / ! ! / ! Q / Q Q / ~ ! ! ) / / ~ ~ ~ / ~ ~ ~ ~ ! ! / ~ ! ~ ~ / ~ ~ ~ ~ / ~ ~ ~ ~ / ~ ~ ~ / / ~ ~ ~ ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ) S ~ / ~ ~ / ~ ! / / / S S / P ~ ~ ! ~ ~ ! ~ ~ ~ ~ ~ / ! / / S / P / ~ ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ) ~ ~ ~ ~ ~ ~ ~ ! ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ P ~ ~ [ b.K.~.~.T.T.T.~.~.T.T./.R.K.(.K./.~.!.!././.!./././.(././.(.^.~./.(.(.(.(./._.(._.(._._.(.(._.(.Q.` ) / ~ ~ ~ ~ ~ ~ / ~ ~ ~ / ~ ~ / ~ ) / ~ ~ ~ ~ / ~ ~ / / ! ! / ! / ~ / ~ ~ / ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ) / ~ / ~ ! ~ / ~ / ~ ~ / ~ ~ ~ / ! _ ~ ~ / / ~ ~ / ~ / / / ! / / / ! / / / / ~ ~ / ~ ~ ! _ / / / ~ Q ~ ~ ^ / ~ ~ / ~ ! ~ ~ ~ / ! / / ~ ~ ~ ! ! ~ / / ! ~ ! ~ ~ Q ! ~ ~ / Q ! / / ~ ^ ! ! ) ! / ~ ~ ~ ~ ~ ~ / / ~ / S / | n.].(._.(.(./.T.~.T.~.T.T.T.U.Y.T.T.T.T.T.T.U.U.T.T.I.U.T.T.T.T.T.T.U.XXT.T.T.T.T.Y.P.T.P.P.Y.T.P.U.T.L.L.L.L.H.H.L.H.H.H.L.L.H.L.L.L.L.L.L.L.U.L.L.L.L.L.S.J.",
+"N N m m m m m m m m N m N m m N N M C m N N V N B M N B B B B B B B C B Z B C B C C C C C Z C C C B Z C C Z C C Z C C C C C C Z Z A C A Z C Z C Z Z C Z Z Z Z D D D D D D H D H H H H L L L J J K L J J H J H Y P P L P P J P P I P I P I I I ) I ) ) ) J ) ) ) ) ) ) ) ) ) ) ) I ) ) ) ) ) K ) Y ) ) ) I ` ) ) ) P ) P P ) ) ) ) ) ) ) [ Y. X}._._.}._._._.'.^.`._.(.(.`.^.(.`.(.(.(.(.!.(./.(./.(.(./.^././.(.^.(.(.].(.(.^.`.|._.}.}._._. X X X'..X.X@X.X.XdX.X.XdX.X.XdX.X.X.X.X.X.X.X.X.X.X.X.X|..X X.X`..X|.|.}.}._.|._.|.[.}.}.}.}.}.|.}.|.|.|.|. X`._.`._._._.^._.(.(.(.(.(.(.(./././././.~.T.~.T.T.T.T.T.T.T.T.L.U.U.P.U.U.L.L.L.L.A.L.L.L.H.H.H.H.S.S.A.H.G.A.A.Z.h.l.z.k.[ | ~ ~ ! ! Q ! ! ! / ! ! ! ! ! ! Q ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ~ ~ / ~ ! ! Q / ! ! / ! / ! ! ! ! ! ! / ! ! / ! / ! ! ! ! ! ! ! ! Q / ! ! ! ! Q ! ! ! ! / Q ! ! ! ! S S ! / ! ! Q / ! / ! ! ! / ! ! ! / ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! / ! / ! ! ! ! ! ! ~ / ! ! ! ! ! ! ! ! ! ! / ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ~ / ! ! / Z.k.A.A.A.Z.h.A.S.A.H.A.A.S.A.S.S.S.S.S.G.z.H.S.A.S.A.S.S.A.A.H.S.S.S.A.H.S.F.Z.D.D.Z._ ! Q ! ! Q / ! ! ~ / ! ! ! / ! ! ! ! ~ ~ ~ ~ ~ ! ! ! Q ! ! ! / ! ! ! / ! / ! ! ! ! ! ! / ! ! ! ! ! ! ! / Q ! ! ! ! / ! / ! ! ! ! ! ! / / ! Q ! / ! / ! ! ! ! ! ! ! ! ! ! / / ! ! ! ! ! ! Q / ! ! ! ! ! ~ / ! ! ! Q ! ! ~ / ! ! / ! ! ! ! / ! / ! Q ! / ! ! ! Q ! ! ! ! / Q ! ! ! ! / ! ! ! ! / ! ~ ! ~ ! ! ! / ! / ! ! Q ! ! Q ! ~ ! ! Q / hXdX.XcXmXdXxXdXdXnXcXcXcXxXcXcXcXnXnXnXnXnXmXmXmXmXmXMXMXMXMXMXMXMXMXmXmXmXnXvXnXfXxX_ ~ ! / ! / ! / ! ! ! ! ! ! ! ! ! ! ! / ! ~ ~ ! ! ! Q ! ! ! ! / ! ! / ! ! ! Q ! ! ! / ! ! / ! ! ! / ! / ! ~ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! / ! ! ! ! ! ! Q ~ ~ ! ! ! / ! ! / ! / ! ! ~ ! ! ! / ! ! / ! ! ! ! Q ! ! ! ! ! ! / S / / ! ! ! ! ! ! ! ! / ! ! / ! ! ! ! ! ! ! ! / ! ! ! ! / ! Q ! ! / ! ! ! ! ! / / / / / ^ ~ / ~ ! _ Q.!.T.T.[.~.~.T.~.!.~././.~.^./.(././././././././.(.(.~.(.(.(.(.^.(.(.^.`.^.|._._.^.!._ / / ~ ! ! S ! / ! ! ! ! ! ! ! ! ! / ! ! ! ! ! ! ! ! ! ! Q ! ! Q / / Q ! ! ! ! / Q ! ! ! ! ! ! ! ! ~ ! ! ! ! ! ! ! ! ! ! ! / ! ! / ! ! / ! ! / ! ! ! Q ! ! ! ! ! Q / ! ! ! ! ! ! ~ / ! ! ! ! ! ! ! ! ! ! / ! ! ! ! ! ! ! ! ! ! ! ! / ! ! ! ! ! ! / ! ! ! ! ! ! ! Q / Q / / / ! / / ! ! / ! ! ! ! ! ! ! ! ! ! ! ! Q ! ! ! / ! ! ! Q ! / S / Q.[.~.[.~.^.L.T.T.T.T.T.T.T.T.T.T.T.T.Y.U.U.U.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.T.U.U.T.U.U.U.L.L.L.S.L.L.L.L.H.L.L.S.L.L.L.L.S.P.P.P.H.P.L.L.L.L.L.L.",
+"m m m m m N m N m m m m m m N m m M M V V N N N B N B N B C B B C B B C C C B Z C C Z C C A C C D C C C Z C Z Z C C Z C Z C Z Z C Z Z C C Z Z Z D B Z Z Z D D Z D D D D Z H G H H H H Z L L J J U H J J J J H H L K L P J P P P L ) P I I I P P ) J P P ) ) ) ) ) ) S ) ) ) I ) ) ) ) ) ) ) ) ) ) ) ) ) Y ) ) ) ) ) ) ) ) ) ) ) [ ) ) ) ` Q.}.{._._.}.}.}.}._._.^._.`.^.^.^.(.^.(.(.(.(.(.(.(./.(.(././././.{./.(.(.(.(.(.(.(.(._.|.}.}.|.}._._.|. X|..X X.XdX.XdXdXdXdXdX.X.XdXzX.X.X.X'. X.X.X|..X.X.X|.|.`.`.|.'.}.}.|._.{._.|.}.}.}. X}.}.}._.|.|.'.`.`.|.|._._.|._._.(.(.(.(.(././././././././././.T./.T.T.T.T.T.T.T.U.Y.U.U.Y.L.L.L.L.L.L.L.S.L.S.H.H.H.D.S.F.G.A.H.h.l.l.k.[ T Z ~ S Q ! Q ! ^ ^ ^ ^ ^ Q ! S ! Q ^ ! ^ ^ Q S Q Q ! Q ! S ^ ^ ! ^ ! ^ ^ ~ S ~ ^ ~ ^ ^ ~ ^ S Q S Q Q Q S Q ^ ^ ^ ^ S ! / u ! Q ^ ! ! S ! Q ^ ^ ^ ^ ! ! ! S Q ^ ^ ^ ! ! Q S ^ ^ ^ ^ ! S ^ Q S ~ Q ^ ^ S ! S Q Q ^ ^ Q ^ ^ ! ! S ! ! ^ ! ^ ^ Q S Q Q ! ^ Q S ^ S Q Q Q ^ ^ ~ ~ ^ ^ ^ ! S ! ! ^ Q ^ ^ ! S ^ Q ! S ! ! ^ ! ^ ^ ^ S u ~ ^ ~ ! ! / ) T D.g.h.D.h.A.A.A.A.S.S.S.S.S.S.S.S.S.S.A.S.D.A.A.A.g.A.A.h.A.A.S.z.A.H.G.l.A.Z.H.) ! / / S Q ^ S Q Q ^ Q S Q ^ S Q ! ! ! S ~ ^ ^ ! ! S ! Q ^ ! ^ ^ ^ ^ S ! S ^ Q ^ ^ Q S Q ^ Q ^ Q ^ ^ ! ^ ^ S Q Q ! ^ Q S ^ S Q Q Q S ! ^ ^ Q ^ ^ ^ ^ S Q ~ S ! Q ^ ! S ! ^ Q / u ! Q ^ Q S ! Q ^ ^ Q S Q ~ S ~ S Q ~ ^ ! ^ ^ ! S ^ Q S Q ^ Q S ! Q Q S ^ ! S ! Q Q ! ^ ^ ^ S Q Q ^ Q ! S Q S ! ^ ! ^ ! ^ ~ ^ ^ ^ ^ ^ ! S S Q / u ! Q ^ Q / ! / ].mXdXdXdXdXvXdXcXdXxXxXxXcXcXcXnXnXnXnXnXmXmXmXmXMXMXMXMXMXmXMXMXMXmXnXcXcXcXNX].[ / ! S ! S S ! S Q ^ Q ! S ! Q ^ ! ^ ^ ~ ^ ^ ^ ! S ! Q ^ ! ^ ^ ^ ^ ^ S ! S ! Q ^ ! ^ ^ ^ ^ Q S ^ ! ^ ^ ~ ^ ^ ^ ! S ! ! Q Q ^ ^ ! ^ ^ ! ! S ! ^ ^ ! ^ Q S ^ Q Q ! S ! Q S ^ ^ ^ ^ ^ ! S ^ ^ / u ! Q ^ Q ^ ~ S Q S Q ! S ! ! ^ ! Q S ! Q S ~ ^ ~ ! S ! ! ^ ! ^ ^ ^ ^ ^ ^ ! S ! Q ^ ! ^ ^ ^ ^ ^ ! ^ ^ Q S Q ^ S Q ! Q S ^ S ! S S Q S S S S ~ S _ F.[.[.T.!.~.~.~.(./.~./.^.~././.~.(.(.~./././.(.(.~.{.(.(.(.(.(.(.(.^.|.`.^.^.(.Q._ ! / ! ! / S ! S Q ! ! S Q ! ^ ! S ^ ^ Q ! S ! Q Q ! ! S ! Q Q ! S ! ^ S Q Q ! ^ Q S Q S Q Q ! Q ! S ~ ^ ~ Q ! S ! Q ^ ! ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ S ! S Q ! ^ ! ! S ! Q ^ ^ ^ ^ ! Q ! S ^ ^ ^ ^ ! ! Q S ^ ~ S Q Q ^ ^ ^ ! S ! Q ^ Q ^ ^ ^ ! S Q Q Q ^ ^ ! S ! Q Q ! S Q S ^ ^ S ^ ^ ^ S Q ^ S Q Q ^ ^ ^ ~ ^ ^ ! ! S ! Q ^ ! ^ ^ Q S ^ ^ / S S / | Q._.[.^.^.^.T.T.T.T.U.T.T.T.T.T.Y.U.Y.P.Y.P.U.U.U.T.Y.U.T.T.T.T.T.T.P.T.T.U.T.U.U.U.T.U.T.U.U.L.P.L.L.L.H.L.H.D.L.G.L.L.L.S.L.P.L.D.P.P.P.P.U.L.L.L.L.",
+"m N m N m N m m m m m N m N N N M M m N M M m B N M N N N N B B C B C B B B C C C C C C C C C C C C C Z B A A Z Z Z C Z Z Z Z C Z Z A D C Z A C Z Z Z Z Z Z D D D D D Z J Z Z J H H H H L L L H H H J L H L K P J L P J K P J P P I I P I I I ( P I P ) ) P ) S ) ) ) P ) ) ) ) ) ) ) ) ) I _ Y ) ) ) ) _ ) I ) ) ) _ ) ) ) ) I P _ ) ) _ Q.}.}. X_._._.}.}._._.`._._._.(.`.`.^.`.(.(.(.(./.(.(./././.(./.(.(.(./.(.(.(.(.(.^.`.|.[.}.}.}.}.}.}.'. X.X.X.X.X.XdX@X X.XdXdX XdXdXdX@X.X.X'.@X.X.X.X|.|..X.X|.|.`.|.|.|._._._._._.^._.}.}.}.|.|.}.|.|._.|._._._._._._._._._.(._.(.|.(.^.(./.{./././.~.T.[.~.~.T.T.T.T.T.T.T.U.Y.U.U.L.L.L.L.U.L.D.S.L.H.L.H.H.S.L.H.H.H.A.A.G.l.A.F.P ! / / [ hXfXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXFXZXZXZXZXZXZXZXZXZXFXFXZXZXFXZXZXZXZXZXZXFXZXZXZXZXHXZXZXZXZXZXZXZXZXHXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXHXZXZXZXZXZXZXDXDXAXZXZXZXZXHXZXZXZXZXHXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXHXZXZXZXZXZXAXAXZXZXZXZXZXZXZXZXFXZXZXZXHXZXZXZXZXZXZXZXZXZXZXZXDXDXGXDXBXhXm.) S / U Z.h.h.D.z.A.G.A.G.h.H.S.S.S.S.G.S.S.S.S.S.S.A.S.A.S.A.A.A.A.A.H.S.S.G.D.G.L.Z._ ~ ! / { ].fXHXZXZXZXZXZXZXZXHXZXZXZXZXAXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXHXZXZXAXDXZXZXZXZXZXZXZXHXZXZXZXZXZXHXZXZXZXZXZXZXHXCXZXZXZXZXFXZXHXDXZXZXZXZXZXZXZXZXZXZXZXZXZXZXHXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXDXDXHXZXZXZXZXZXZXZXZXZXZXZXZXZXHXZXZXZXZXDXHXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXHXZXZXZXZXAXZXZXZXZXZXZXZXZXZXHXDXZXHXFXCXhXm.' / ! _ ].xXfXzXdXcXnXzXxXxXcXcXcXcXcXnXnXnXnXmXmXmXmXmXmXMXMXMXMXMXNXmXmXmXmXMXfXMXdX' ! ! ! { aXfXZXDXDXZXHXCXZXZXZXZXFXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXHXZXZXZXZXZXFXZXZXZXZXDXZXHXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXHXZXZXZXZXZXZXZXZXHXZXZXZXZXZXZXDXDXZXZXZXZXZXZXHXZXZXZXZXZXAXAXAXDXHXZXZXZXZXZXDXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXHXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXHXZXZXZXZXZXZXHXZXHXDXHXHXFXhXm./ ! ! I F.T.[.[.~.~.~./.~.~./.(.[./.(.(./.(.(./././.(.(.(.(.(.(.(.(.(.(.|.^.(.(.`.(.].| ! S ! [ pXmXDXZXZXZXZXZXZXZXZXZXZXZXZXZXZXHXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXHXZXAXZXDXDXHXZXZXZXZXZXDXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXFXFXZXZXZXZXZXZXZXZXZXZXFXZXZXZXZXZXZXZXZXZXZXHXZXZXZXZXZXZXZXZXZXHXZXZXZXHXZXZXZXHXZXZXZXZXFXZXZXZXZXZXZXZXZXZXZXZXZXZXZXDXZXHXhXm.' / S ) Q._.^.^.T.~.T.T.T.T.T.T.T.T.T.T.Y.Y.P.Y.I.U.T.I.T.T.U.T.T.T.T.T.T.T.U.T.U.U.U.U.U.T.Y.L.U.U.U.P.L.L.L.L.L.L.L.L.L.U.L.L.L.U.U.P.L.L.P.P.U.L.U.S.L.L.",
+"m m m m m m m m m m N m m m m N N N M N M V B N N B C B F C B B B C B Z C C C B C C C C C C C C C C Z C C D Z C B A D B Z Z D B D C Z B Z Z C Z Z Z C Z Z D F Z Z D D F Z H Z H H H H H H L Z P K L J L L L L H J P L H P P L P P P P I P I I P I ) ) ) ) ) ) ) P ) ) ) P ) ) ) ) ) ) I ) ) ) ) ) ) I ) ) ) ) ) ) I Y ) ) ) _ Y ) ) _ I ) n.}.}._._._. X_.}._._._._._._.{.`.(.(.(.(.(.(.(.(.(./.(.(.(./././././.(.(.(.(.(.(.`.`._.}.}._.}.}.|._. X|..X.X.X.X.X X.X.X.X.X.XdX.X.X'..XzX.X.X.X|..X.X.X.X.X.X|.@X|. X|.|.|.|._.|._.^.|.}.}.}.}.}.'._.|. X|._.|._.|._._.(.|.|.(.(.(.[.^.^.(.^.(.^././././.~.~.T.T.T.T.T.T.T.T.T.U.U.U.U.L.L.L.L.L.L.L.L.L.H.L.D.P.P.H.H.G.G.A.G.l.b.J ! / / M.fXHXDXZXDXZXZXZXZXZXZXZXZXZXFXDXZXZXZXZXZXFXZXFXZXAXFXZXZXDXZXZXFXAXVXZXZXVXZXZXZXZXVXZXHXZXZXZXZXZXZXZXZXFXAXZXFXZXZXZXZXZXZXZXZXZXFXZXZXZXZXZXDXFXFXZXSXZXZXZXZXFXFXDXFXZXZXZXZXZXCXFXHXDXAXZXZXZXZXZXZXZXZXZXZXZXDXZXZXZXAXFXZXZXZXZXZXZXZXZXZXFXFXZXZXZXZXZXZXAXAXZXZXZXZXZXZXZXFXZXZXZXZXZXZXZXDXZXZXZXFXZXZXZXZXDXDXDXDXZXZXfXm./ / S Y b.Z.h.D.A.j.A.A.A.S.S.S.S.S.S.A.S.S.S.S.A.S.A.S.A.A.A.A.A.h.G.A.D.G.h.G.F.U / / / { fXCXAXZXFXZXZXZXFXVXZXCXFXZXZXDXFXAXZXZXZXZXZXZXZXFXDXZXZXZXZXZXZXZXFXFXDXAXZXZXZXZXZXZXZXZXDXZXZXFXCXDXZXZXZXZXAXFXZXZXZXZXZXZXAXFXCXZXZXZXZXZXDXZXZXZXZXFXZXFXZXFXZXZXZXZXZXZXZXZXZXDXFXAXZXZXZXZXFXAXZXZXZXZXDXDXFXHXDXAXZXFXZXZXCXDXZXZXZXCXDXDXAXZXZXFXZXZXZXZXZXZXZXZXZXZXAXFXZXZXZXZXFXZXFXFXZXDXZXDXZXFXZXAXZXZXZXZXFXAXHXfXQ.' / / ] ].dXcXcXzXzXcXxXxXxXdXdXnXcXnXnXnXnXmXmXmXmXmXMXmXMXMXMXMXMXmXmXmXmXmXnXhX_ Q / ! m.fXCXZXSXZXZXZXZXDXZXZXZXAXZXZXZXZXZXZXZXZXZXZXZXFXDXZXZXZXZXZXZXZXZXZXZXAXZXZXZXZXZXDXCXDXAXZXZXFXZXZXZXZXFXZXZXFXZXZXZXZXZXZXZXFXFXFXZXAXDXDXZXFXZXZXDXCXAXZXZXFXZXFXFXZXZXZXZXFXDXZXZXZXZXZXZXZXDXHXDXAXCXZXZXZXZXZXDXZXZXZXZXFXZXZXZXZXZXZXZXFXDXZXZXZXZXZXZXZXZXZXZXAXDXZXZXZXZXZXZXZXZXZXDXAXZXZXZXDXDXZXAXFXZXZXZXZXZXZXHXFXMXm./ ! / / Q.(.!.T.^.~.T.(.~./.E.(./.!.~.(.(.(.(.(.(.(.(.(.^.`.(.(.(.^.`.(._._.^.`.].[ ! ! S M.fXHXDXDXZXZXZXZXZXZXZXAXDXDXZXFXZXZXZXZXZXZXZXZXAXZXZXFXZXVXZXZXZXZXZXZXZXZXVXFXZXZXFXZXFXDXFXFXZXFXFXZXZXZXZXFXDXZXZXZXZXZXZXZXAXFXAXAXZXZXZXZXZXZXZXDXFXZXZXAXZXZXZXZXDXZXFXFXZXZXZXZXZXDXAXFXZXHXZXZXZXZXZXZXFXZXZXFXZXZXZXZXZXZXZXZXZXZXZXZXFXZXZXFXZXVXZXZXZXDXZXCXDXCXAXFXZXDXZXZXDXZXAXAXZXZXZXZXAXZXZXFXZXFXZXZXZXCXDXDXZXHXpX' ! ! / F.^.T.T.~.T.(.T.T.~.~.~.T.Y.U.U.L.Y.P.L.T.L.T.Y.T.T.T.T.T.T.T.P.P.T.U.U.T.T.T.U.U.U.U.L.L.Y.L.L.L.L.L.S.L.G.L.L.S.L.U.L.L.U.S.P.L.H.P.L.L.P.L.L.S.",
+"m m m m m N m m m m m m m m m N M N u m N B m B B V B B m C N C B C B B B C C B C C C C C C C C Z Z C Z C A Z Z F Z Z Z Z Z C Z C Z Z C B Z C D Z Z C Z D Z D Z D D Z Z H Z H H H Z L H L H J H P H H J J H H H J J J J L P L P P L P P P P P ) ) P ) I I ) P ) ) ) P ) P ) ) ) K _ _ I I ) ) ) ) ) ) ) Y _ ) ) ) P ) ) ) ) _ ) ) ) ) ) I n. X{._._._._.}._._._._._._._._._._._.(.(.(.(.(.(.^.{./.(././.^./.(.(.(.(.(.(.(.(._.(.|._.|.^.`.(.|.|.|.|.|. X.X.X.X.X.X.X.X.X.X.XvX.XdX.X.X.X.X'..X|. X|..X.X.X|.|..X|.|.|.|._.|.`._._.^.|.`.}.}.}.}.|.|.}.}.|.}.}.}.|._.|._._.(.(.(.{.(.(.(.(./.(./.~.~.~.~.~.~.T.T.T.T.T.~.T.T.Y.T.L.L.L.L.L.L.L.L.L.L.S.U.L.S.L.A.H.L.H.D.D.z.l.Y ! S / m.BXSXAXAXVXFXZXVXZXZXZXZXVXZXVXAXAXAXAXAXZXFXZXVXFXVXZXAXZXZXZXZXFXVXFXFXZXZXAXAXAXAXAXZXFXVXVXVXZXZXZXZXFXAXVXZXFXHXVXVXZXFXVXZXVXVXVXVXZXFXZXVXVXFXZXVXDXDXDXZXFXVXZXVXVXAXZXVXZXZXFXZXFXVXAXFXVXFXFXFXZXVXZXVXZXZXZXCXVXZXAXVXZXVXVXZXZXFXVXZXVXZXFXVXZXZXZXVXFXFXSXAXZXZXVXZXVXZXVXAXZXVXVXFXZXZXZXZXAXVXZXVXAXAXAXVXDXZXCXFXAXFXGXBXm._ ! / I Z.j.A.A.A.A.A.A.S.S.S.S.S.S.S.S.S.S.S.h.S.A.A.A.A.A.A.A.h.A.A.H.A.G.H._ / / / c.fXFXDXVXVXZXVXFXAXFXFXZXFXFXZXAXAXAXFXZXVXVXZXVXZXVXAXVXVXZXFXZXZXZXVXAXAXAXAXAXAXSXAXZXSXVXZXFXZXZXFXDXCXZXFXVXZXVXAXZXZXFXFXVXAXVXVXVXFXZXAXZXZXFXVXAXAXAXAXAXAXAXAXZXVXVXFXZXZXFXZXAXAXAXFXVXFXZXVXVXFXFXVXZXAXVXZXAXVXAXAXFXZXDXHXVXFXVXAXZXZXZXZXAXAXAXFXSXZXZXDXZXFXZXVXFXVXFXVXZXZXFXVXAXAXAXHXFXZXAXAXZXFXVXZXVXFXVXZXZXZXZXZXFXQ.' / Q _ dXnXvXzXxXxXxXxXxXJXmXmXnXfXnXnXnXnXmXmXmXMXmXMXNXMXMXmXmXSXmXMXmXnXnX[ S Q / m.BXFXFXZXZXFXZXZXDXZXVXZXAXVXAXAXAXAXZXZXVXVXFXVXVXAXVXFXZXVXDXZXZXZXFXAXHXAXFXZXZXFXZXZXVXZXAXVXFXVXZXZXAXZXAXZXFXVXFXFXVXVXZXFXZXVXAXAXAXAXVXVXVXVXZXZXVXFXVXVXAXZXZXZXFXVXVXFXFXVXAXFXVXFXZXZXZXFXAXAXAXAXAXAXAXAXFXZXVXVXZXVXFXVXZXZXVXZXVXZXFXVXVXAXAXVXZXZXZXZXAXAXVXAXAXAXAXAXZXZXAXAXAXAXFXAXZXZXFXZXVXZXAXFXZXCXZXZXAXVXAXZXDXZXQ./ ! Q _ F.).~./././.(./.(././.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.`.^._._._.`. X[ / / ^ m.fXGXZXCXVXZXVXVXVXVXAXZXVXZXVXAXFXZXVXZXVXVXZXFXZXAXAXAXFXZXAXZXZXZXFXZXVXFXFXVXFXZXFXZXVXFXFXVXVXFXZXAXVXZXFXVXVXVXAXAXFXZXZXZXZXAXAXAXAXAXAXAXAXZXZXVXFXVXZXAXZXZXFXZXVXVXFXZXVXZXFXZXZXAXAXAXAXAXZXZXAXZXZXZXZXVXZXVXFXVXZXZXFXZXAXFXVXSXZXZXZXFXVXAXAXVXVXHXFXZXZXZXZXAXZXVXVXZXZXVXZXFXFXVXFXZXFXVXZXVXZXAXZXVXAXZXVXZXZXZXSXZXAXZXQ./ ! / [ !.~.~.~.T.T.T.T.Y.T.T.U.L.Y.Y.U.U.P.P.P.T.P.T.P.T.T.T.T.U.T.P.P.P.P.U.T.U.U.U.P.P.U.L.Y.P.L.U.L.L.L.L.L.L.P.L.L.P.L.L.U.L.L.P.L.L.L.L.L.L.P.P.P.",
+"m N N m m m m m m m N m m N N N N N N V B m B N N N B B N B V C B C C B C C N C C C C A A C C Z C C B C D B Z C D C Z C D B Z Z D Z Z A Z Z Z Z F B Z Z D D Z D Z D D Z Z L L Z L L H H H H H J H Y J H J H K U J H J H P H L P L P P P P P P ) P ) P I I ) I I P ) ) I ) ) I ) ) P Y ) I ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) I ) ) ) I ) ) b.!.}._._. X_.}. X_._._._._._._._._._.^.^.(.(.(.^.{.E.(././.(./././.(.{.^.(.^.(.^._.(.|._._._._.`._.|.|.|.|.'. X.X.X.X.X.X.X.X.X.X.X.X.X.X.XdXdX@X X|.|..X|. X|.|.|.|.|.|.|._.|.(._._.|.`.^.`.}.}.}.}.}.}.}.}._._._._.(._.(._.|.(._.(.^.(.(././.(.^./.{./.~.~.~.~.T.T.T.~.T.T.T.T.T.Y.Y.Y.L.Y.L.L.L.L.L.L.L.L.L.L.S.L.A.L.H.H.A.D.S.I / c m.fXFXAXAXFXZXFXFXFXZXZXZXZXFXFXFXFXFXFXZXFXDXDXZXZXFXFXFXFXZXZXFXZXVXSXVXFXDXZXFXZXFXZXFXFXFXFXZXFXZXZXFXZXZXFXFXFXVXVXVXVXZXFXFXFXFXZXFXFXZXDXZXFXFXFXFXFXZXDXZXZXZXVXFXFXFXFXFXFXZXZXFXVXFXFXZXFXFXFXDXDXFXFXFXFXZXDXDXZXFXFXFXFXFXFXFXVXZXDXZXFXFXFXFXFXZXZXFXZXFXFXGXAXDXZXFXFXFXFXFXFXFXFXZXFXZXZXFXFXFXFXFXFXFXFXZXFXZXZXFXFXAXVXAXAXZXm./ ! ~ I Z.h.h.A.A.H.S.S.S.S.S.S.G.S.S.G.S.A.A.S.S.A.A.A.A.A.D.z.D.F.S.G.Z.A./ Q Q ` fXFXFXDXZXZXFXZXFXFXVXZXZXZXFXFXFXFXAXFXFXZXFXFXFXFXFXFXZXFXFXFXZXZXFXFXAXDXDXAXDXAXFXAXDXZXVXFXVXFXAXFXDXZXFXFXFXFXFXFXZXZXFXZXFXDXFXFXAXFXFXFXZXDXZXZXFXFXAXFXAXDXAXDXFXFXFXFXZXDXZXVXZXAXZXFXZXZXVXFXFXFXZXFXZXDXZXZXFXFXZXFXFXZXDXDXZXFXFXFXZXZXFXZXDXDXAXAXDXZXZXDXDXZXDXZXFXFXFXFXZXZXFXZXFXZXFXZXFXZXFXAXFXFXFXFXZXFXFXFXZXVXZXFXFXVXpX/ / ^ hXdXcXzXxXxXxXxXxXxXmXdXdXNXnXnXnXmXmXmXmXmXMXmXmXMXMXMXmXmXMXMXMXMXfXS / / } BXZXZXDXZXFXFXZXZXFXZXFXFXFXFXFXAXFXFXZXZXFXFXFXZXFXFXFXFXFXFXZXZXFXFXFXAXAXFXVXAXAXDXZXZXFXFXFXFXFXFXDXZXFXFXFXFXFXFXFXFXZXFXZXZXZXFXAXFXFXFXVXVXVXVXZXZXFXFXFXZXFXFXZXZXFXFXFXZXAXAXZXFXZXAXZXDXFXZXFXFXFXAXAXFXFXFXZXZXFXFXFXZXFXFXAXZXFXFXFXFXFXFXFXFXZXFXZXZXVXZXFXFXFXFXAXFXFXFXDXZXZXFXFXZXFXFXZXZXFXFXFXFXFXFXZXZXZXZXFXFXFXZXCXZXBXm.' Q ! _ ]./.!.(.(.T././././.(.(.(.(././.(.(.(.(.(.(.(.(.(.|.(.`.|._._._._.Q.S / u } fXHXFXVXVXVXCXVXVXVXFXFXFXFXFXFXFXFXFXFXFXFXZXDXFXZXFXFXZXFXAXAXZXFXDXZXZXFXFXFXFXFXDXDXZXZXDXDXVXZXZXZXFXFXFXFXFXFXZXFXZXFXZXZXFXZXDXAXAXFXDXAXDXFXZXZXFXFXFXFXFXFXZXDXFXZXFXFXFXFXDXZXZXFXFXFXAXFXFXFXFXAXZXZXZXDXFXFXZXFXZXVXZXZXFXFXZXFXDXDXZXDXFXFXZXFXZXFXFXDXZXZXFXZXFXFXFXFXZXZXFXFXDXZXAXZXZXFXFXFXFXFXFXFXZXFXFXFXZXZXVXZXAXZXZXCXaX_ S P Q.~.T.~.~.T.T.T.U.!.Y.P.U.U.L.L.L.P.P.Y.P.P.Y.T.T.T.T.U.T.U.U.P.U.U.P.U.U.U.P.P.P.Y.L.L.L.P.L.L.D.L.L.L.P.P.P.L.P.P.L.U.P.L.P.A.L.L.A.L.L.A.D.L.",
+"m N m m m m m m N m m m N N m B V V N N B N B B V B B B B V C m B B B C N C C B C C C C C C A C C Z F C Z Z Z Z Z D Z Z Z Z Z Z Z Z Z Z F B C Z Z Z Z Z Z D D Z J Z Z H H Z Z H H Z H H H J L H L H H J J J K H H J J J H P H J J P P P P I P P P ) I P I ) I I ) ) I ) I ) ) P ) ) ) _ ) P ) ) ) ) ) ) ) I [ ) I I ) ) ) ) ) ) _ ) ) ) U [ Q. X_. X_. X_. X_.}. X_._._._._.^.^.|.^.|.(.(.(.(.(.(.(.(././.(.[.(.(.(._.(.(.(.(.`.^._._._._._._._.|.|.|.|..X|. X.X.X.X.X.X.X.X.X.X.X'..X.X X'..X.X|. X.X X X|.|.|.|.|.|.|.|.`.(.`.(.`.|._._.}._.}.}.}.}.}._._._._._.(._._.(.(.(.(.(.(.(./.(.(.[././.~.~.~.~.T.~.T.~.Y.T.Y.T.T.I.T.U.T.T.L.P.P.P.L.L.L.L.L.L.L.L.L.H.L.H.S.A.D.b.! / ` hXVXVXAXGXFXFXFXFXFXFXFXZXVXFXFXFXFXFXFXZXFXVXFXZXDXFXFXFXFXFXFXFXFXGXGXSXGXZXFXVXFXFXAXAXAXFXFXFXFXFXFXFXFXZXFXFXFXFXFXVXGXZXFXFXZXFXFXFXFXFXZXZXZXZXFXFXFXFXZXFXFXVXFXHXHXFXFXFXFXFXFXFXFXAXZXZXAXAXFXDXDXFXFXFXFXFXFXFXZXFXFXFXFXFXFXZXVXFXVXDXZXFXFXFXZXFXFXFXFXSXVXGXSXAXZXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXZXHXAXFXVXCXfX{ ! / ~ Z.h.A.A.A.A.A.A.A.S.A.S.S.S.S.S.S.S.S.S.z.G.A.S.A.A.A.A.D.A.D.D.P._ ~ ~ / hXGXVXAXZXFXAXZXZXFXZXFXZXFXFXFXFXAXFXFXFXZXZXFXFXFXFXFXFXFXFXZXFXFXFXFXFXDXAXAXFXAXDXAXAXDXZXDXZXFXZXFXZXFXAXFXFXFXFXFXZXFXZXFXFXDXDXDXDXZXFXAXFXAXFXDXZXFXFXDXAXAXDXAXAXFXFXZXFXFXFXFXFXAXAXFXZXFXFXFXZXFXFXFXFXFXZXDXAXZXFXFXZXZXFXDXDXFXFXZXFXFXZXFXFXZXDXZXZXDXDXZXDXFXZXZXDXZXFXFXZXFXZXFXFXFXFXFXFXZXFXZXFXVXFXFXFXFXVXFXZXFXAXAXZXVXVXMX} ! ! m.dXzXcXxXxXxXcXxXxXcXcXdXmXnXnXnXcXmXmXmXmXMXMXSXMXMXMXMXMXmXmXmXnXhX~ ~ [ hXVXFXFXDXFXFXFXZXVXVXFXFXFXFXFXFXFXFXFXDXVXZXDXFXFXFXFXFXFXFXFXFXZXFXFXFXAXFXZXZXFXZXFXZXZXFXFXFXFXFXZXAXZXAXFXFXZXFXZXFXFXFXFXZXVXZXDXFXFXFXVXVXVXVXGXZXFXFXZXFXZXFXFXFXZXFXZXFXFXFXFXFXFXFXAXZXAXVXZXAXAXAXAXFXFXFXFXDXZXFXFXFXFXFXZXZXZXAXFXFXFXFXZXZXFXFXFXFXVXZXFXFXFXFXFXFXFXFXFXZXFXZXVXAXAXZXAXFXFXFXFXFXFXFXFXFXAXZXDXFXFXFXFXDXZXGXfX[ ^ ^ ! ].E././.(./.{./.(.(./.(.(.(.(.(.(.(.(.(._.(.(._.[._.`.`.{._._._. X_ / ! _ hXFXFXFXFXFXVXDXZXZXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXZXFXZXFXFXZXFXFXZXZXFXZXZXDXZXFXFXFXVXDXZXDXFXDXHXHXZXFXFXVXFXFXFXFXFXFXFXFXFXZXFXFXDXDXAXDXAXFXDXFXZXZXFXZXFXZXFXFXFXZXZXZXZXFXFXFXFXVXFXZXAXFXSXAXZXFXFXAXFXZXFXFXFXFXFXFXHXFXZXDXFXAXFXZXFXZXZXZXZXFXFXZXFXFXDXDXFXZXFXFXFXFXFXZXFXZXFXFXFXAXFXZXZXVXZXFXFXZXFXFXFXFXFXFXFXZXZXFXHXZXGXFXdX[ ~ / b.Y.~.~.~.~.T.~.Y.Y.P.P.L.L.L.L.L.L.P.P.T.T.P.T.T.T.U.T.U.P.U.P.L.L.P.U.U.U.T.L.L.L.L.U.U.L.L.L.L.L.U.U.P.P.P.P.L.L.P.L.P.L.L.L.D.L.L.F.D.P.L.L.",
+"m m m m m m m m m m N N m m m m N N N V m B B m N B B V N C V C C B C B V C B C N C C C C C C C C C C Z C Z C C A B Z C Z C Z Z D B C Z Z Z Z Z Z Z Z D Z Z Z Z H Z H Z Z Z H D H Z H H H H H H J H J H J H G H J H J H J H P J U L P P P P P P P P I I I I I I P ) ) P ) I ) ) ) I ) K ) ) ) ) ` P P _ ) ) P ) ) I _ ) ) ) ) P ) ) ) _ I _ Q.}._._._._._._.`.}._._.|._._.(.`.(.(.(.(.^.}.(.(.(.(./.(.(.(./.(.(.(.(.(.(.(.^.`.(.^.|.{.{._._._.|.|._.|.|.|. X X|. X.X.X X.X X.X X'.zX.X.X.X'..X X.X.X.X|. X|.|.|.|.|.|.|.|.^.|.`.|.`.|.^._.}.}.}.}.}.}.}._._._._._._._._._.(._.(.(.(.(.(././.(././.~.~.~.~.~.~.T.T.~.~.Y.T.T.T.Y.T.Y.P.U.P.P.P.U.L.L.U.L.L.S.L.D.L.H.U.H.D.D.T / / m.MXAXAXFXZXZXAXFXZXVXVXZXVXZXAXZXVXAXZXVXVXAXZXVXZXFXVXZXVXZXVXVXZXVXVXVXVXFXFXZXZXVXAXFXZXFXZXVXZXFXVXZXVXFXAXVXFXVXAXAXVXGXZXZXFXVXFXVXFXZXVXVXZXFXVXZXVXAXVXVXZXVXFXVXFXCXZXAXAXZXVXAXZXAXAXFXVXAXAXFXDXHXVXVXVXZXFXZXVXFXAXZXVXZXVXAXVXVXVXZXVXFXVXZXFXVXVXZXVXFXGXSXSXSXZXVXVXFXAXVXFXAXZXVXZXVXVXZXVXVXZXVXFXVXZXVXFXFXZXZXGXZXAXZXZXAXZXZXhX! Q ~ e.h.j.A.A.A.A.A.S.A.h.S.A.S.S.S.S.G.S.G.H.H.S.A.A.A.A.A.A.L.S.D.P.S ~ ~ m.MXFXFXFXAXVXFXAXFXAXAXFXVXFXZXVXVXAXAXAXFXZXVXZXVXAXVXAXZXVXFXVXZXVXVXZXFXAXAXAXAXAXAXGXFXZXZXFXZXVXFXVXFXAXFXZXVXVXFXFXVXFXVXVXFXDXDXDXDXAXFXVXZXAXZXFXZXAXAXAXAXAXAXAXSXVXFXVXZXVXZXFXVXFXFXVXVXFXZXGXFXZXAXZXVXFXVXVXZXAXAXFXVXFXFXHXGXAXFXAXVXFXVXVXFXDXSXZXZXZXDXZXBXVXVXFXZXVXVXFXVXFXVXZXVXAXAXAXFXVXZXVXZXAXZXZXVXVXFXAXAXAXAXAXAXHXVXSXhXQ Q [ '.zXzXxXxXcXcXxXnXcXmXdXmXnXnXnXmXmXmXmXMXmXmXmXMXSXMXMXMXmXmXmXmXm.^ / m.HXVXVXZXFXFXVXFXZXVXZXVXZXVXAXAXVXAXAXFXZXFXVXZXFXAXAXZXZXVXVXZXFXVXZXVXZXAXFXAXAXAXSXGXZXVXFXAXAXZXVXAXZXAXAXVXVXVXAXAXVXVXZXVXFXZXVXFXAXAXVXVXSXGXHXVXFXZXFXVXAXAXFXVXZXVXFXVXAXAXAXZXFXAXZXFXFXAXAXAXAXAXAXAXAXAXSXSXZXFXVXZXFXVXFXVXVXVXFXAXAXVXFXVXAXFXZXFXVXFXZXFXVXAXAXVXAXAXAXAXZXFXVXZXZXFXAXAXVXZXVXFXAXAXVXVXFXFXFXFXFXFXVXSXZXDXZXCXhX/ Q ! F.~.(./././.^././.(.(.(.(.(.^.(.).~.(.(.(.(.(._._._._.(.|.|._._. XS ! ! m.BXFXFXFXVXFXDXDXDXZXVXAXZXVXAXZXVXVXAXZXVXVXZXFXVXZXVXVXAXAXAXAXAXSXZXVXVXZXFXVXZXVXVXZXVXZXVXHXDXDXGXZXFXVXZXVXZXVXZXAXFXVXZXVXZXVXVXAXAXAXAXAXAXAXDXZXVXZXVXVXFXFXVXVXVXZXFXFXZXVXZXVXZXVXFXAXAXFXGXAXAXAXAXAXVXVXZXVXZXVXFXFXVXVXFXFXZXVXVXFXVXZXFXAXVXFXVXFXFXZXZXFXVXVXFXAXVXFXAXAXVXAXAXVXAXFXAXFXZXVXFXVXFXFXVXAXFXAXVXFXAXAXZXGXZXFXZXDXfX~ / [ K.~.!.T.T.T.T.T.Y.T.P.L.L.L.L.L.P.L.L.P.T.P.T.U.T.T.U.T.U.P.P.L.L.L.U.U.U.U.L.U.U.L.L.P.L.U.L.U.U.L.U.P.L.P.L.P.P.U.L.P.L.L.L.D.L.S.L.L.H.A.L.",
+"N @.m m m m m m @.m m m m m B N N C B B N B N N N B C m C B Z N B V C N C A C N C B C C C B C A C Z Z C C C Z Z Z B D B C Z B D Z Z B D Z Z Z Z Z Z Z D Z Z Z Z Z Z Z L Z H Z Z H Z H H H Z J P H H H J H J J J H J H J H J Z P L L H P P P P P P P P ) P P ) ) I I I J ) ) ) ) I ) ) ) P ) P ) I I ) ) ) ) ) ) ) ) ) ) I ' ) _ ) I ) ) ) ) n.}.}.}. X|.}. X`.`. X X_._.|._.^.^.|.^.`.^.(.(.(.|.(.(.(./._.]._.(.(.(.(.(.`.^.`.(.^.|.(._._.|.|._.|._._.|.|.|.|.'.|..X|.|..X.X X.X.X.X'..X.X.X.X.X.X|..X|. X.X|.|.|.|.`.|.^.|.|.{.(.|._._._._. X_.}.|.}.[._._._.|.(.`.^.`.(.(.(.(.^.(.(./.(././.!.T./.(.R./.R.~.~.~.T.T.T.T.T.T.T.U.T.U.P.Y.U.T.L.L.P.L.L.P.L.L.L.L.H.G.L.S.L./ ~ ~ fXCXAXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXuXuXuXuX:X5XyXeXeXqXkX5.eX8.eXKX,XuXaXKXiX>XtXaXsXuXwXwXiXsXsX>XwXeXiXsXsXtXuXKXaXuXeXqXeXKXKXKXKX8.eXKXKX2XKXKXyXKXKXKXKXKXKXKXKXyXKXKXKXKXyXKXKXKXKXKXKXKXKXeXqXeXeXeXKXKXyXKXKXKXKXKXyXKXeXqXeX8.kXKX2XKXKXKXKXyXeX8.eXqX5.eX8.eX8.eX5.eXeXqXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXCXMX' / / e.Z.j.A.j.A.h.h.A.S.A.S.S.S.S.S.H.H.S.S.A.S.S.S.A.A.A.A.S.H.H.H.H.! ! / hXCXFXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXKXKX2X,Xv l wXn c b n n n x n c n c b n n c b n c b n n eXn x x n z n x ;Xb c :XuXb c n c x :XKXKXKXyXKXKXyXKXyXKXKXyXKX;Xc x - b v ;XeX5.8.eXkX2X2X8XyXKXKXyXKXpXO.o.oXo.7XO.hXO.o.+.hXO.o.o.hXO.o.oXo.hXO.7XO.hXO.7XO.hXo.oXo.hXO.7XO.hXo.oXo.ZXDXZXFXFXFXFXFXFXFXFXFXFXVXZXFXFXFXFXFXFXVXVXFXCX! ! ~ ].hXJXcXnXxXxXcXcXcXcXmXcXmXmXcXcXnXmXmXmXmXmXMXMXmXMXMXMXMXMXMXmX} / / dXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXKXKX{ KXKXKXKXKXKXKXKXaXKXKXKXKXKXaXhXO.7XoX7XoX7XoX7XoXhXoX7XoXO.hXKXKXKXKXKXeXkXeXkX0XeXkXeXeXkX0XaXeXkXeXeXsXeXeXkXeXeXaXKXKXKX7XhXoXoXKXKXKXeXkXKXKXKXKXsX{ n { { b 8.{ { n n { { n n sXKXKXKXKXKXKXKXKXKXKXaXeXeXkXeXsXKXKXKXKXKXKXKXKXKXKXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXfX_ / S n.].(.(.(.(.(.(.(.(.(.(.`.(.(.(.^.`.(.{.(._.^.{.|._._._._.|._._.`.! ! / hXCXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXKXKXyXKXKXyXn KXKXKX,XKXKXKXyXKXKXyXKXKXyXKXKXeXeXKXKXKXn yXKX4XKXKXKXKXyXKXKXyXKXyXKXeXeXKXyXKXKXyXKX;XeX2X8.8.KXyXKXKXyXKXyX8.eXKXeXKXKXKX3XKXyXKXyXKXyXKXKXeX5.qX8.kXeXKXKXKXKXyXKXKXeXeXyXKXKX,XeX6.sXuXKXKXyXKXKXKXKXKXKXeX5.qX8.eXKXKXKX3XZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXVXFXZXAXZX~ ~ _ n.Y.^.^.T.Y.T.P.Y.L.L.L.L.L.L.L.L.L.L.L.L.Y.Y.T.T.T.U.P.P.U.L.U.P.L.U.L.U.U.P.Y.U.L.L.L.Y.K.J.L.L.L.L.U.L.I.L.P.P.L.U.P.L.L.L.L.S.H.L.H.H.H.L.",
+"m m N m N m m m N N m m N m N N B N B B B B N N B B V B C m N C N C N C N V C B B C B B C Z C C C C C Z Z Z C A C Z D Z Z D Z Z Z Z Z Z Z Z Z Z Z Z Z D Z Z Z L H Z S Z H H H Z Z H H H H H L Z H J H J H H H H L U H J H H L U L H J P P P P P P P P I P ) P P ) I I ) I ) L ) ) P ) S ) ) ) ) ) ) P ) I ) ) ) ) ) ) ) ) P ) ) ) ) ) ) ) I b.{.}.}.}.}.}.}.`.`._._. X_.{.{.|._.(.`.`.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(._.(.^.^.(.(.^.(.(.{.(._._.|._.|.|._.|._.|.|.|..X.X.X X.X.X.X.X.XdX.X.X.X.X.X.X.X|..X'.|.|.|.|.`._._._._._.|.{.|.|.(._._._._.}.}.}.}.^.|._._.`.`.(.^.`.|.(.(.(.(.!.(./.(.(./././.~.~.R./.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.L.T.L.U.U.Y.U.P.L.L.L.G.L.G.D.L.S./ S ~ CXFXAXFXAXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX*Xl b x @ *XwX:.,.>.>.;.>.>.,.5.0X:XsX2.>X5XwXsXeX>X9X<.:XsXeX>X9X9.:XsX0X>X5XpX8.<XqX,.,.tX2X,X9.,.>.wXyXyX,X,XyXyX,X>X2X2X,X,X<XyX,X,X>X,XyXyX;Xv v v v ;XwX>.,.,.:.wXyXyXyXyXtXtX,X,X3X,X1.,.>.>.0X5X,X1X1X0XwX1X9.,.>.>.,.,.,.,.,.,.,.-.,.,.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX' S / T j.Z.W.A.A.S.A.A.S.A.S.S.H.G.S.H.S.S.H.G.S.S.A.S.S.A.A.H.H.H.H.F.! ! _ fXAXVXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXv x g :XsXn d @ z h *Xk l z a z z d *Xk k p -Xv d l - z :Xv x n z - n z *X;XsX@ :X;Xa j k @ x l v :X1X2X2XyX<X<XtX,X,XyX;Xn l p iXuXj ,.,.,.;.b x s =XyX3X,X>X1XX.X.X.o.X.O.O.X.O.X.X.O...o.o.o.O.X.X.o.o.X.X.....X.X.O.O.X.X.X.X.o.o.....X.X.O.IXZXZXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXSXGXAXAX! ! P aX'.dXcXxXnXnXcXcXcXcXdXmXmXcXcXmXmXnXmXmXmXmXMXMXMXMXMXMXMXMXMXmX_ Z / BXFXFXZXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXZX,X<Xx ;X<XyX,X,XyXyX2X>X,X,XtXyX1X6X..X.O.O.O.X.O.O.O.X...O.O.X.X.6X,X,X2X3X4.>.,.>.>.-.,.>.,.>.>.>.>.>.,.,.,.,.>.,.-.>.,.;.wX2X3X . .X.6X1X2X5.>.,.wXwXyX1X;Xb :X;Xk p a h g g g + g k - n ;X;Xb :XyX3X2XyX2X1X:.,.,.,.,.wXuXyXyXyXwX0XyXyXyX,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXFXHXZXBX' / ! n.!.~.^.(.(.(.(.(.(.(.(.`.^.|.^.^.[.(.(.|.[.`._.|._._._._.|.|. X].^ ! _ fXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX,X,X2XwX0X4Xx v wX5.5.5.5.0X2X,X2XwX5.0X1X1X1X5.,.4.0X2Xx 3XwX5.5.5.0X3XtX5.qX2X2X,X1XqX,.tXyXtXqX2XyXb eX0X,.<.tXyX,X<XyX2XwX,.,.0XuX2X5.5.5.tX1X,X,X>X,X,X5.>.>.,.,.;.9XuXqXwX2X2X1X5.,.5.4XqX:X;X9.:.qX1XyX1X0X5.5.5.5.wX4X4.:.,.,.5.1X>X0XwXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXZXFXZXZX! I / F.].T.T.T.T.T.P.Y.P.U.P.L.L.D.L.L.L.L.U.U.P.T.U.U.U.T.T.U.U.L.L.P.P.L.U.L.P.P.L.U.L.L.L.K.U.L.L.U.U.U.I.U.L.U.L.P.U.L.P.P.L.S.L.H.H.S.G.L.H.H.",
+"N m m m m m m N m m m m N B N B B N B B B B Z m B B B B N N C N C N N C C B B B C B C C C C C C Z C Z C C Z Z B C Z Z C B Z Z Z Z Z Z B Z Z Z D Z F D Z F L Z H H Z H Z Z H Z H S Z H H H H H L H H H L H H H P H H H H P H P H L L L P L P L P P P P P P P P ) S ) I I ) ) ) ) ) I ) ) I ) ) ) I ) ) ) ) ) ) P ) ) ) ) ) ) ) ) P ) ) ) _ I [ ].}.}.}.}.}.}._. X X_._._._._._.|.(.|._.(.`.^.`.^.(.!.(.(.(.(.~.`.`.(.(.(.`.(.(.(.(.`.(.|.|.(.(.(.|._.{._._.{.|.|.|..X.X X.X.X.X.X'.dX.X.XdX.X.X.X.X.X|.|. X|.|.|.|.|.|.|.|.|._.{.|.|.`.`._._._. X|.}._.|.|._._._.`.(.(.`.^.(.(.(.(.(.(./.(././././.Y.~.~././.~.~.T.~.~.T.T.T.T.T.U.T.T.Y.T.L.L.U.T.P.P.P.P.P.A.L.G.L.A.P.S.S./ ! ! ZXFXVXDXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX:Xb n b l >X9X,.-.-.,.>.-.-.:.,.<.wXM.;X5X5X:XsX;X:X5XuXwXsX;X:X>X:XwXM.;X:X=XeX;X:XiX:.<.tX1X9X,.-.>.wXyXyX,X,X,X,X,X<XqX,X1X,XtX,X,X,X,XyX2X2X;X4 @ 7 o ;XtX1.,.0X2X2X<X2X1X,X,X,X,X,X2X2XwX1.,.5.4X,X,X0X5.,.5.1X2XyXtX:.:.,.,.5.1XyX,X,X:.>.SXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXCX} / ~ T b.e.A.A.A.S.A.S.S.A.S.S.S.S.G.H.H.H.S.S.G.S.S.H.S.H.A.S.H.H.H.Z.! / [ BXFXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXDXn x z :Xz z p @ sXn g 5 n n d + eXn h v eX- *Xl x n z 5 v v z l g a x z *Xb z p -Xb d 9.0XO @ @ @ ;X3X>X4X2X,XtX,X,X,XyX-Xx z O >X:Xj ,.-.;.2.z | n -X-X=.s k 6XO.X.X.X.X.X.X.o.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X...X.X.X.X.X.X.X.X.X.X.X...o.X.X.o.FXZXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXZXSX! ! ! Q.'.hXdXnXnXxXcXcXcXmXfXcXnXcXmXcXmXfXmXmXmXmXmXMXMXMXSXfXMXMXMXmX! ! / DXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXyXyX;Xl :XyX2X,X,X,X>X2X,X,X,X,X>X1X7Xo.O.O.X.X.O.O.X.X...X.o.o.+.5X,X2XyX9.>.-.-.>.,.,.wX5.>.-.>.,.>.>.qXwXwXwXwX5.>.-.,.,.tXuX7X . .o.3X2XwX>.;.0X4X2X1X:Xv ;XyXuX-X4.0Xd a 4.0Xs 4.0Xv @ a p w v -X;Xb b v :XwX:.,.>.5.1X2X,XyXyX:.,.4.3X2XyXFXFXFXFXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXZXBX[ / S [ ].~.~.(.(.`.(._._.(._.(._.^.^.`.^.^.(.^.(._._.^.|._._._.}.|.|.!.! S } BXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3X,X0X;.;.5.8.v 2.:.:.;.-.<.2X2X4X5.>.-.5.0X4X5.,.,.:.2Xv :XqX,.,.>.>.,XqX,.>.tX2X,X2X0X<.,X2X<.>.5.1X:X;X9.wXuX,X<X,X1X<X2XwX<.1.>XyXwX,.>.<.wX2X<X<X2X2X:X,.-.-.>.<.0X1X,X,.5.4X1X2X:.,.5.4X<.2.b 4X1X1X0X5.5.-.,.,.;.,.4.4X4XyX2XyX2X,X1X<.5.VXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXZXZXVXZX~ ~ / F.].Y.T.T.T.T.Y.P.P.L.L.S.L.S.U.L.L.L.U.P.P.Y.U.T.T.U.P.P.L.L.P.L.L.L.L.P.P.P.I.U.L.I.U.L.U.L.U.L.L.U.L.U.L.I.U.P.H.U.L.L.L.L.H.H.H.H.H.L.H.H.",
+"m m m m m m N m N m N m N N N N C N B B B B B B B N C B N A N C C V C N N C B C B C B C C C C C C Z C C Z C Z D Z C Z Z Z D Z Z Z Z Z D Z Z D Z Z Z D D D D Z D Z Z Z H Z H H Z L H H H H H L L J H H H H U H H P H H P H H H L J J P S P P P P P ) ) P / ) P P I I I ) L ) J ) I ) ) ) P ) P ) ) ) I ) ) P ) ) I ) ) P ) ) P ) ) ) ) ! _ _ [ !.}.}.}.}. X}.}._._._._._._.{._._.`.(.|.^.(.(.^.^.(.(.(.(.(.(.(.(.(.(.(.(.^.(.(.(.(.^._.(._.{.|.`.{.(._.|.|.|.|.|.|.|..X|.|..X.X.X.X.X XdX@XdX.XdX.X.X.X'..X.X.X'.|.|.`.`.|._.|._._.`.(.`. X_._._._.|.|._.|.`.`._.`.(.`.|.(.`.^.`.`.^.(.(.(.^.(././.(.~.~.~.T.T.~.T.~.T.~.~.T.~.T.T.Y.T.U.T.U.T.Y.P.Y.P.P.P.L.U.P.L.H.D.L.S.S.~ S S FXVXVXZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXtXsXsX;Xg >X1X4.-.-.,.>.-.-.-.>.<.>Xz g :XuX:Xg g :X>X:X>Xg k *X5X>X>Xk g :X5Xj g *XuXtX,X,X2XwX:.:.<.tXyXtX,X,X,X,X1X0X>.4.qX2X<X,X,X,X,X2X3X2X;X4 _ 8.4 b yXyXyXyX,X1X1X1X0XtX,X,X1X1X1X2XyXtX>.1.yX1X1X:.,.,.5.1X2XyXqX;.,.5.yXyXyXyX1X0X,.:.DXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXBX' ~ ~ T e.j.A.Z.A.A.A.S.A.A.A.S.S.H.G.H.H.H.H.S.S.S.G.A.G.S.H.H.H.D.D.F.S ! ' BXVXZXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXl z g v & @ a z l g @ @ x x h - x l p + :Xa -Xv z x g h g l - @ 5 a - d l z @ d z l a 2.*Xa n n @ v p -X- -XyX,X<X>X5XyX:X;Xk O p @ k :.>.,.b - @.Q h x 8.-Xv O...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.FXZXDXFXFXFXFXFXFXFXFXFXFXZXFXGXZXFXFXFXFXFXDXZXAX! Q S m.].dXxXxXnXxXcXcXmXdXcXcXcXcXmXmXmXmXmXmXmXNXMXMXMXmXmXNXMXMXMXMX~ / ! DXZXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXSXyXyX1Xx >XyX,X,X,X,X,X2X,X,X,X,X>XtX6X..o.o.X.o.o.o.X.X.X.X.O.+.2XtX,X,X4.>.-.-.;.0XtX4.qX4.-.-.:.wX5.:.tXyXyXyX4X9.>.-.:.wX3X6X .o...+.3X1X4.>.0X1X,X1X:Xl b :XyXyXk 5.0Xp a 2.0Xg 2.0Xp h 4.0Xp z $ + b :Xb x ;Xb 0XwX1X2X,XyXyX,X0X:.>.4.<XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXDXBX} ! S [ ].].~.(._._._.{._._._.`.`._.|._.`.}.(._.|.[._._._._._._.{.}. X].! ! [ BXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX2X1X9.-.;.;.<.v -Xk k <.;.<.2XwXwX4X5.-.>.-.5.:.:.1X5.5.b :X0X:.-.-.<.1XqX,.;.:X2X,X,X,X2X<X<.;.;.>.5.n x >.4.,X,X1XtXqXtX,X,XyXyX4XyXtX<.0X4X4X1X1X2X2XtX5.;.-.;.0X2X1X1XtX:.0X4X0X4.;.,.0X1X1X<Xv 0X5.5.>.,.>.>.>.4.>X<.:.5.wXyXyXyX,X1XqX9.2XFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXFXDXFXAXAX~ ~ I b.F.Y.T.T.T.P.P.Y.P.P.S.L.L.L.G.L.L.L.U.P.P.P.U.U.T.U.T.T.P.P.P.L.L.L.L.P.P.P.L.I.L.L.L.L.U.L.R.L.U.U.I.L.U.L.L.L.P.L.P.L.P.L.L.H.L.H.H.G.G.L.",
+"m N m N N m m N N N N N N N N m N B B B B B B B C N m A C N A N V B V C C N C B C B C C C C C D D B C C C C Z Z Z B Z Z B Z Z Z Z Z D D A Z D D F D Z D H H Z H H Z H Z H D H L Z L Z L L H H J H J H H H H H H P H H H L H H H J D P J L P S P P P I I U P ) P I I I I ) I ) P ) K ) ) ) ) ) ) ) ) ) ) I ) I ) ) ) ) ) ) I ) ) ) ) ) ) ) I [ Y._.}._.}.}. X X_._._._._._._.^.|.`.(.(.(.(.(.(.`.(.^.(.(.(.(.(.(.(.^.`.].(.(.(.(.(.`.^.(.(.|.`.(.^.^._.^._.}.}.}.|..X.X.X X.X.X X.X.X.X@X@X.XdX.X.X.X.X.X.X.X.X|.|.|.|.|._.{._._.`.|._._._._._. X_.|.|.|._.|._.`.`.`.(.|._.^.(.(.^.(.(.(.(././././.~.~.Y.~.~.T.~.~.~.T.~.T.T.T.T.T.T.T.T.T.U.U.T.Y.T.T.P.L.L.L.L.G.L.G.L.L.D.~ ~ ~ ZXAXAXDXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXHX:Xn sXsXz >X5X1X9.-.-.-.-.-.-.>.<.*Xg =X*X:XuX*X*X>XwX9X5X5X*Xv b b v k k b k -Xk v :XuX,X,X>X,XtXuX,X2X,X,X,X,X,X,X,XwX>.>.>.5.2X2X,XyX1XyXyX2X;X4 7 s 4 ;XuX2X4X<X2XqXqX4.>.9.tX2X0X5.qXwX2X2X9.;.<.5.5.;.:.:.qX1X2X2X4.,.5.3XyXyX,X,X1X<.>.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXCX' / ~ Y e.j.Z.A.h.A.h.A.A.A.S.A.H.S.H.H.H.S.G.H.S.Z.G.G.H.H.H.S.H.L.H.F.Q / ' BXZXZXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFX-Xg h z 4 x 5 w @ a + z @ a a g 5 @ z @ @ h x x + a *Xk z + b h j 0X;Xk v x z ;X<X:X:X*Xk + 7 5 @ l g :X/ -X;Xv 0X0X;X2X2XuX;Xz n l v tX:.>.2.a + a + h 8.x w O.o.X.X.O.o.X.X.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFX! ! S m.].xXJXxXcXcXcXxXnXcXcXmXnXnXnXnXmXmXmXmXmXMXmXMXSXmXMXMXMXMXMXmX~ ~ ! CXDXZXDXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXyX3X<Xl ;X<X,X,X,X,X2X2X1X1X2X,X,X,X6X..o.X.X.X.X.X.X.X.X...+.4X>XyX>X9.-.-.;.,.1.2X4XqX,.>.-.;.wX4X,XtXyX1X,X1XqX>.-.:.0XuX8X..X.X.X.8X2XwX:.0X4X>X2X:Xl x 3X>X,X2X:X-X-Xv @ a @ @ a d z h 2.0Xp :X> + v -Xk a z :Xl ;X;X;X3X1X,X,X2XwX:.,.0X1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXVXCX[ ! Q [ n.Q.(.(.(._._.|.^._.|.}.|.}.}._._._.|._._._._._.}.}.}.}._. X_.!.Q / ' BXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3X1X4.-.-.-.<.v k 2.*X4.,.4.4X4.>.0X4X4.,.-.,.-.;.5.<.:.v :X1X1X9X<.,X2X<.>.;.tX2X1X1X4X4X0X<.tXqX,.,.b b :.1.tXtX9X9.:.>X2X,X2XtX5.qX,X1X2X5.5.5.5.wX2XwX>.-.>.5.1X,X1X0X9.5.4X9X>.>.,.5.:Xk -Xs v <.,.>.;.-.:.:.:.5.4X<.-.,.<.wX4X1X1X0X;.4.1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXFXFXAXDX~ / ! b.F.U.T.T.T.T.U.P.L.L.L.L.L.L.U.L.L.L.P.T.P.T.U.U.T.U.U.P.P.P.L.L.L.D.L.L.L.U.U.K.H.L.U.L.I.L.U.Y.L.I.L.U.Y.U.L.L.L.P.P.L.L.S.L.L.H.H.G.L.G.G.",
+"N m N m m m m N m N N C N N C C N B B B B B B B N C N N N C C N C N C N N C V B B C C B C B C C C C Z Z A Z D B Z C Z D D Z Z Z Z Z D Z D D D F D Z D D Z H L Z Z L D Z H H Z H L Z Z H H H H H H H H H H J H H L Z Z H H H H H J J H J P P I P P L I I ) P I I I I I ) S I ) ) I ) ) ) ) P J ) P ) I P ) I P ) I ) I ) ) ) P ) ) ) P ) ) ) [ n.[._. X}._.}._._._._._._._._.|.|.`.(.`.`.(.(.(.(.(.`.(.(.(.(.(.(.(.(.(.(.).(.(.(.(.(.(.`.(.^./.(.|.|.(.|._.|.}.|.|.|..X|..X.X.X X'.zXdXdX'.zXdX'.dX.X.X.X.X|..X.X X|.|.|.|.|.|.|. X]._._._._._._._.|.|. X|._.|.|._.|._._.`.(.(.(.(.(.(.(./.(.(././.~./.~.T.T.~.~.~.T.T.~.~.T.~.T.T.T.T.~.T.T.T.U.T.T.U.P.P.P.L.S.L.L.L.H.H.H.~ ! ! ZXAXZXZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXHXwX9XwX:Xk 5X>X1X4.-.-.-.-.-.-.,.<.:Xn z b :XuX:Xv :X5.>.9X1X:X:X:X:X:X<Xb b 4.2.:X:X<X2X2X1X1XyX1X4X1XyXyX,X,X,X,X,X1X0X,.-.-.,.wX2X,X,X-Xb v b k g h p @ k v b v -XtX>.>.>.-.,.0X1X,.>.>.0X2X,X<XwX;.,.;.5.,XtX2X,XtX,X<XyXyX1XyX1X<X2X0X:.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX} ~ ~ I T e.Z.A.A.A.A.H.H.l.S.S.A.S.G.H.S.H.H.S.G.S.H.Z.H.H.S.H.H.S.H.Z.! / _ BXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXFXFXGXv z *Xg x sX7 @ n n z @ z z *Xk h z *Xk x @ -Xv n n d ;Xv l 8.x 2.,.k d @ @ g l sXeX8X;Xv z @ + z z x b ;X-X2.eXkX8.0X2X2XyX-Xz l z -X1XwX1.b - 6X7Xd 4 4 x c O.o.o.o.O.O.X.O.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.DXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXQ ! S m.m.hXxXnXnXcXcXcXcXcXcXmXnXMXnXMXmXmXmXmXmXmXmXMXMXMXMXmXMXMXMXmX/ S S ZXDXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXyX2XtX;Xl >XyX,X,X2XtX0X0XwX2X,X2X<X6Xo. .X.X.X.X.X.X.X.X.+.3X1X,X1XqX,.>.:.wXwXtX2X<X<X4.>.-.;.0XwX1X2XyX>X,X2X0X,.:.0X4X>X7X .X.X.X.<X>X2XwX2X2X:X;Xz v >XwXwX1X2X>XyX4X:X-X;X;X:X;X;X;X-X*X-Xz :X:Xv b @ 6X6Xs k a z v l :XyX,X,X,X1XwXwX3XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXFXFXBX} / / ` n.].!.).'._._._._.|.|.}.}.}.|._.|.|._.}._._._._._.}.}.}.}._. X].Q S ' BXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX1X9.-.-.>.<.v k j -X2.:.2X4X5.:.9.4X5.>.-.:.:.:.>.-.9.v x :X1X1X1XtX<.>.-.:.tXtX5.5.5.qX4X2X1X0X>.:.x -XuXtX1XwX,.,.0X1X,X2X2XwX>.>.wX1XtX;.;.,.:.wX1XtX>.-.:.wX1X,X5.,.>.qX,X;.-.-.,.qX-X6X3Xk v uX9.:.:.5.2X2XwX9.5.;.-.-.,.:.5.wX4X<.,.9.1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXFXFXAXAX~ _ / b.n.L.T.T.T.P.U.L.L.L.L.L.S.L.A.U.H.L.U.P.P.P.U.T.U.U.U.U.P.P.P.U.U.P.L.L.P.L.L.L.U.L.L.L.U.U.L.L.L.U.L.L.K.L.U.P.L.L.P.L.L.L.L.H.H.H.G.D.D.A.",
+"m N m m m m m N N m N C N C Z m C N B B B B N B B B N C N C N A A M C N C V B C C B C B A Z Z C C C Z C C Z C Z G C C Z Z Z Z G Z F D A D A D D Z Z D Z H Z D Z F S H H Z H D H Z Z J L H H H H H H U G H H H H H H L F H Z H P J J K U L P P P P U I I I I I I ) I I I ) ) ) I ) ) P ) I ) ) P ) P I ) ) I ) I ) I ) I I ) ) ) ) I I ) ) ) ) b._._._.|._.}._._._._._._._.|.(.(.`._._.(.(.(.(.(.(.`.`.(.(.(.(.(.`.(.(.(._.(.(.(.(.(.(.^.(.|.^.`.^.`.[._.}.}.}. X|..X|..X X.X.X.X.XdX'..XdX'.dXdX.X.X.X.X.X.X.X|.|. X'.|.|.|._.|._._._._.^._. X_.(.`.`.|.|.|.|.|. X[.|._.`.^.^.`.(.(.(.(.(.(././.~.(.~.~.~.~.~.T.].~.~.T.~.T.T.~.T.~.T.T.T.T.T.T.Y.T.P.Y.P.P.L.L.L.L.L.H.H.S.~ ! ! ZXHXZXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXDX*X>X=X5X5X5X2X4X4.>.-.-.-.;.:.4.<Xv g a a v k *X-X:X<.-.-.0X4X>XqXqX9XwXn 2.,.;.tX1XuX5X2.7 7 2.< =.=.< ;XuX,X,X,X,X,XwX:.:.-.-.4.,X,XyX;X@ z o p @ z z @ a z o + -XtX;.;.-.-.-.9.5.;.;.qX1X,X,X2X5.5.2X2X1X2X,X,X,X,X,X2X2X,X,XyX,X,X4X1.,.-.:.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXBX[ ! ! G e.j.Z.h.J.G.A.A.A.H.S.S.H.S.G.H.H.H.H.H.H.H.H.H.H.S.G.L.S.L.L.F.^ / ' fXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXZXZXsXn g z 4 2.w a l l p @ eXb z d 8.n a l n p -Xv x z a :Xb 4 q.z =.:.c +./ a g | eXwXe 4 O 5 a v + - z a p v x eXlX2.-XuXuX:Xl z @ k :X1X3XuX:X- S @., a sXkXd 7X+.+.+.+.+.+.+.7X+.X.o.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXZXVXQ Q Q M.m.'.dXMXcXcXnXxXxXnXmXdXvXcXnXmXmXMXMXnXmXmXMXMXMXMXMXSXSXMXMXSX~ ! S ZXHXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXFXyX<XyX2Xx <X,X,X,XtX<.;.>.9.1X,X2X,X2X7X .X.X.X.X.X.X.o.X.+.,X,X2X,XtXwXwXtX2X2X2X,X2X1XqX>.-.-.>.;.0X4X,X,X2X,X,XwXwX2X>X6XX.+.X. .X.3XtX2X2X1X:Xl x ;X:XwX>.>.5.4X2X,X2X1XuX1X3X8X3XyX5XtX>XuX:Xk p p v a :X3Xs -Xn v <Xb l ;X;XyX,X,X2X2X,XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXFXFXAXBX' S ! [ F.Q.!.`.(._.'.|.`.|.|.}.|.|.}._.|._.|.}.}._.}.}._.}.}.}._._. X!.^ / ' BXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX1X9.>.-.>.4.v v O h k 0X4X4X2X<X2X1X5.,.:.tX,X2X5.<.>X,Xx g *Xk :X0X:.:.:.<.2XqX,.,.>.>.5.1X1XqX,.,.b -XyXyXtX9.;.<.;Xb x v b ;X<.wX4X1X4XwX,.qX1X>X2XwX;.>.5.4X2XtX<.;.,.qX,X:.,.-.,.qX:X-X8Xa l :X:X<XtX2X2X2X1X<.>.-.-.-.-.,.,.<.5.:.>.5.1XZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXZXAXAXAXS ~ ) c.F.].!.P.Y.Y.U.P.L.L.L.D.L.L.L.S.L.L.L.P.P.T.U.U.T.U.U.U.L.L.P.P.P.P.P.U.P.P.L.Y.L.U.L.L.I.L.I.K.U.U.U.Y.U.L.L.L.Y.L.L.S.P.S.H.H.H.H.S.S.D.S.",
+"m m N m m m C m m C m m N N N B N N B B B B B B B B N N A N N V C N N C V B B C B V C C C C C C C Z C C Z C Z A C C Z Z F Z Z Z Z D Z D D D D H D D D D Z D H L J Z L L H H L Z L L Z L H H H Z H Z H H H Z H H H H L L H L D G H J L H P L L P P ( I I I I I ( I I I ) P ) ) ) K P ) I ) P ) ) ) ) ) P ) ) I ) ) I I ) I P P ) _ P ) I ) ) P b.].|._._._.}. X_._._._._.^.(.(.(.^.(.(.(._.(.(.(.^.(.(.].(.(.`.(.(.(.(.(.(.(.(.(.(.(.(.`.^.`.(.(.(.(.}.}.}.}.}.|.|. X|.|. X.X'.'.dX'..XdXdXdX'.dXdX.X.XdX@X.X.X.X.X.X|.'.|.|._._._._._._._. X_._.`.`.`.`.`.|.`.|._._.|._.|.(.(.].(.(.~./././.(./.~.(.~.~.~.T.~.T.U.~.~.~.T.T.~.T.~.T.~.T.~.~.T.T.T.Y.Y.L.U.P.L.P.L.D.G.L.S.L.~ ~ ! ZXZXZXFXFXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXZXx g k :X>Xk v k 9.-.-.-.9.z v v :Xa O *Xs b n g d 4.>.-.-.-.5.9.,.,.,.,.b 2.,.;.,X2.6 2.2 2 2 =.=.2 =.=.;XyX,X,X,X,X,X2XtX2X0X:.:.tX2X1X;Xh :X/ - a 8.8.5 a :X/ $ :XwX,.-.-.-.-.-.>.>.5.4X<X,X2X<X<.qX1X,X,X,X,X,X,X,X,X2X,X,X,X,X,X1X0X;.:.4.yXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX' ^ / i e.e.Z.S.A.A.G.G.A.A.H.S.A.H.H.G.S.H.H.H.H.H.H.H.H.H.H.H.H.L.S.Z.! ! ' BXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXZXSXx a @ z @ @ 4 g 5 @ @ a c d p - x h a d v g :Xb + a + g l -X*X-X9X4.f W @.- g M @.@.t eXs w g :X@.v k z o @ 7 b eXl 7 v v k z ;Xb l v :X5XyX:X+ + p O a 6Xl O -Xv p p p p v -Xz { eX+.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXCXQ Q c M.].hXxXfXnXcXcXxXxXxXcXmXmXfXmXmXMXmXMXMXNXMXMXMXMXMXMXMXmXMXMXfXI / ! ZXFXGXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXDXyX,X,X:Xl ;X<X,X1X5.,.-.-.:.wX2X,X,X5X,X+.X.X.X.X.X.X.X.6X3X>X2X>X2XyX2X2X>XyX2X,X,X,X2X,X5.>.-.>.>.;.0X2X,X,X,X,X1X1X>X>X6X . .X.X.X.3X2X,X>X:Xv v <XuXuX2XqX-.-.9X2X2XtXyX3X6XX.X...6X8X8X<X6X4X*X-X@.+ a + @ O :Xz s 1X:X:X;X:XyX,X,X,X,X,XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXVXFXZX[ S c ) n.].!.(.`.(.'.|.|.|.|.|.|.|.|. X_.{.|.}.}.}.}.[.}.}.}.}. X_. X]./ ~ _ BXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX4X9.>.-.4.2X:Xn k 5.k ;X5.5.0X1X2X1X4.>.<.2X2X,X2X,X1X4Xv g 4.j -X,XyX,X<X<X1XqX>.;.-.-.-.wX1XwX,.1.b ;X5XyX>Xb k k z @ s h @ ;XyXtXqX5.5.4.;.wX1X>X2XwX;.>.0X4X-Xv b g 1.0X,X;.-.-.>.<.2.-X-X-Xv *Xg ;Xk <X,X<X,X:.-.-.:.:.:.:.5.2X:.>.5.1X,XZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXFXFXAXVXZX~ ! / b.n.L.Y.T.Y.L.L.Y.L.L.H.L.F.L.L.U.D.L.L.P.P.T.T.T.U.U.U.L.L.L.P.P.U.U.D.S.P.P.L.Y.L.L.L.U.L.U.L.Y.L.L.U.L.L.L.L.L.U.L.L.L.S.H.L.G.h.S.S.A.G.A.",
+"N N m N m m N N B N B B B B m N B B B B B B N N C C C N C C N N A N A N N A N N C C C C C C C Z C C D Z C Z C C Z Z C Z Z Z D Z D Z Z L Z D D D Z Z Z Z Z L D D P Z Z L H H Z H H H Z H Z L H L H H L Z L Z L J H H H H H H H H H H H J J J J P P P P U I I I ) ) P P I I ) L _ ) ) ) ) J ) ) ) P I ) I I I I ) ) ) J I J ) ) P P ) ) ) ) I I _ ~.|.[.|.`.|._.`.{.(.|.`._.(.(.^.^.(.^.`.(.(.(.(.`.(.(.(.(.(.`.(.^.(.(.(.|.(.|.{.|.(.(.(.(.|.(.^.|.`._._.|.}.}.}.|.|._.|.|.|..X.X.X@X.X.X.XzX.XzXdX.XdXdX'.'..X.X.X.X`.|.|.|._.}._._._._._._.|.|._.|._.|.|._.|._.`.(._.(.(.(.(.(.(.^././././././././.~.!.~.~.~.~.~.I.~.T.~.T.~.T.Y.~.~.~.T.T.T.T.T.T.T.T.Y.P.L.L.L.L.L.L.L.L.~ ~ ^ VXFXFXZXAXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXz sXc h :Xv yX;X4.,.:.9.:Xb n d *XsX{ g p x x @ p 2.;.;.-.>.;.:X5.>.-.:.b 8.;.<.1X7 2 2 =.=.2 2 2 2 =.2 =.;X1XyX,X,X2X>X1X2X2XtXtXyX2X>X;Xw n ;X@ 5 x 2.a z n ;Xa b tX;.-.-.-.-.-.-.-.9.<X,X,X,X,X,X<X2X2X2X,X,X,X,X,X1XwXwX2XyX,X,X1X:.9.,X2X2XGXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXBX} S ~ G e.e.Z.A.A.h.H.A.G.S.S.S.H.H.A.S.H.H.H.H.L.H.H.H.F.S.H.S.L.L.S.Z.! / ' BXZXFXFXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX@ h + h z l @ h h z *Xv + @ *Xk h + =Xp + + *Xv b n z 5 l b n v b v < < # 5 h @ w l 3 sXq.+ x n -Xk -X:Xn @ l 7 h 7 z w z z z k *Xv z x -XuX;Xa 9.qXd k 2.v a -Xb a x n + -X:X> { iX} 1X+.+.X.o.+.X.X. .X.X.X.X.X.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXZXVX/ ! / M.Q.hXmXvXnXxXcXcXxXcXcXnXnXmXnXnXmXmXmXMXMXmXMXMXmXNXMXMXmXmXMXmX/ ! ! ZXFXHXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3XtX,X;Xl >X1X1XtXwX9.,.,.<.2X,X,X,XtX8X..X.X.X.X.X.X.6X6X3X8X3X:X:X6X8X<X8X6X3X>X>X1XyXyXwXwXwX5.,.:.<X1X,X,X2X,X>XtX6XO.X.X.X. .X.<XtX2X>X-X^ 6X3X6X<X:X4XqX>.>.wX1X:X6Xo...o.X.X. . .X. . .6X;X;X;Xz - sXgXg j -X:X>XwX2XuX2X,X,X,XyX>X1X,XCXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXBX[ ! Q _ b.!.].^.`.|.`.|.`.|.'.|. X|.|.|.|.|. X{.|.|._.|.|.{. X|.|.}. X[.Q ! ' fXHXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXeX5.1.,.<.1XyX1Xv k 9X-X2.,.,.4.4X1X1XqX:.9.4XyXyX1X>X2X1Xb k b k :X5X>X2X2X,X2X0X:.:.:.:.<.,X1X1X1X1X;X;XuXyX>X-XeXv o k 1XKXz ;X1X<X:.,.;.:.wX1XuX>X2X,X<.:.wX2X*X8.n j 1X1X2X<.:.;.:.:.;.0X4X:Xx g n 8.g 2X,X2X2X9.:.5.<XtX<X>X1X4X<.<.1X2X,XAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXAXAXZXAXAXZX~ ) ~ [ n.L.T.XXP.U.P.P.L.L.L.F.H.U.S.U.D.U.P.P.P.P.T.U.Y.U.U.Y.P.L.P.P.S.L.P.L.L.L.L.S.Y.L.U.H.L.L.L.L.L.U.L.U.L.L.L.L.L.L.L.S.H.S.H.H.S.A.A.A.A.h.",
+"m m m N N N N N N N B B B B B B B B B B B B m Z C N C N C N N C C N N C C N C C C B C C C C C C C C C C Z C C Z Z Z Z Z Z C D F Z Z Z Z D D D Z S H Z H H D G D Z L Z Z Z Z H H Z H H Z H D L L L H L Z Z L Z L H H H H H H H H H I H J J J H P P J P P I J I I ) P ) ) I I ) I ) L _ L ) ) S ) P ) I I I ) ) I ) J ) ) J ) ) ) ) P ) ) P I I [ ].(._.(._._._.(.(._.^.{.(._.(.`.(.(.(.(.`.(.(.^.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.(.(.(.`.(.^.(.(.`.(.^.|._.|.}.}.|.|.|._.|.'..X.XdX X.X.X.X.X.X.XdXdXdX'.dX@X.X.X|.|.|.|.|._.}._._.|._._._._.^._._._.|._.^._._.|.`.(._._.(._.^.(.(.^.^./././././././.~.!.~.T.Y.~.T.~.~.T.T.~.~.~.T.!.T.~.~.T.T.T.T.T.T.P.P.U.L.K.L.U.A.H.L.S.~ ! ^ ZXAXFXDXAXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXDXz l d a *X-XKXk z 2XtXyX2Xv x p v b d p p -X-X*Xp :X5.,.-.,.9.4X5.,.-.:.x <X<X>X>X2.2 =.2 2 2 =.=.2 2 2 2 2.,X<XyXyXyX,XyXyX2X2XtX-Xv -Xv a g p v z + 4 h g z a w ;X5.-.-.-.:.:.;.;.;.,.0X2X,X,X,X1X2XwXwX1X,X,X,X2X1X0X,.5.1X2X1X1X0X;.4.4X,X,XFXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXCX' ~ ~ I T b.A.G.A.A.J.A.G.S.S.G.S.H.H.S.H.H.H.H.H.D.L.H.L.S.S.U.L.L.S.F.Q / _ BXZXFXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXn n d @ n n - + sXn h p eXn h g n n 5 b n w :Xv z v z z -Xp g p + d x eXs w z v p g O 3 O 5 p g d *X;Xn v a z l - d a z z + v g + z b ;Xl :X:X@ j 0Xp b 1.8.d b z O 7 w O p *Xz @.@.@.k *Xv o.O.o.X.X.X.O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXDXFX/ S S M.].hXxXxXnXxXnXnXcXcXcXcXnXnXmXnXmXmXmXMXMXMXMXmXMXMXMXMXmXMXMXmX/ S Q ZXHXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyX,X2X<Xx ;X:X2X1X4XyXwX9.9.1X,X,X,X,XyX+... .X.X.X.X... ...X..... .X.o.O.X.X.+.8X:X6X2X>XyX4X3XuXwXwX<X,X>X>X>X2X>X8X..X.X.X.X.X. .8X3X8X8Xb | ..o. .o.X.6X3X9X,.wX3Xo.O.o.X.X.X.X.X.X.X.o.o. . .f k c d aXb g 1.wX,XtX;.0X1X,X,X,X,X2X2XuXyXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFXVXFXBX{ ! Q _ n.F.]._.{._.|.|.|.|.|..X|.'.|. X|.|.|.|.|.|._._.|.{. X}._.}.}.!.! / [ BXZXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZX9.<.4X<.<.1X2X<Xv g - v v x b b v v b v b b v v b b v b b g v z z b b <X1X>X2X2X2X,X;Xz b b b b v v b g v v b b a -Xl + d :X<Xl x b v b b b b v b b b b b b v b b a x 6.a b v b b b b b v b b v v x 5 x q.4 -X,X,X,X,XyX2X2X2X,XwXqX5.;.5.1X<X2XZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXAXAXDXZXVXZX~ ~ ~ b.n.K.T.T.T.L.P.F.L.L.L.L.H.L.L.H.S.U.P.P.T.T.T.T.Y.P.P.L.P.L.L.L.P.P.L.P.L.L.S.P.P.L.L.U.U.U.U.U.U.L.L.L.L.L.L.L.L.H.H.H.H.H.H.A.H.A.A.A.A.Z.",
+"m @.N m N N N N N N B N m B B N B B N C B m m C N C N C C N C m B m N C N C B N B C B C C C C C B C C Z C C Z Z Z C Z C D F C D D D Z Z Z D D D H Z D Z D D Z D Z H D D Z Z Z H H H Z L H Z Z Z Z L Z L Z L L Z H H H H F H Z H H K G J H J P P P P P J I I I I ) P U P I I ) ) ) S ) L L ) ) J I I ) I ) P I I ) ) ) ) ) ) ) J I ) I P I I U _ n.^.|.(._._.(.(.|.^.|.(.|.(.(.(.`.(.(.(.(.(.^.^.(.^.(.`.^.(.(.`.`.(.`.(.(.(.(.|.(.(.(.{.(.|.^.`.`.^._.{._._.|._.`.|.|.|.|..X|..X'.'. X.X.X.X.XcX.X.X@X'. X.X.X.X@X|.|._.|.|.{.}._.|.^.`._._._._.|._.^._.`.`.{._.`.`.`.(.(.{.^.(./.^.(.(././.~.~.~.~.~.Y.T.~.~.T.~.T.~.~.~.~.I.~.T.T.T.~.T.~.T.~.T.T.T.P.U.P.P.L.L.L.L.H.L.Z.~ ~ S ZXVXFXDXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXx O O =X>Xp s *Xl @ ;Xv :X@ + O a - n n a v -Xk p :X<.>.:.;X-X-X2.;.>.:.b j 0X:X0X2 2 2 2 =.2 2 2 2 2 =.2 < -X;Xk k k k b z j z p 4 < 2 2 3 7 j v g 3 w 5 p p z a b ,.-.>.5.<XtXtXtXtXtX,X,X,X,X,X0X5.>.5.4X,X,X,X1X0X-.,.5.4XwXqX5.:.>.4.1X,X,XFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXMX} S S L e.e.j.A.G.A.A.G.A.A.G.H.S.A.H.A.H.H.H.L.L.L.L.L.S.L.L.L.D.Z.L.Z.Q ! _ BXZXAXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXx l g z l x p z z z p - x z p - l l p @ x d :Xb a @ - z :Xb 9.0Xa l 7 sX7 @ k k 5.0X7 eXk 5 g :Xb -Xv c eXu z n v + l n x + n l + d ;X4Xb l x z z d a v v v p @ @ a @ @ @ a z 5 w 4 @ 4.5.-X6X+.+. .X.O. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVX! S / c.M.'.zXJXnXxXnXnXnXJXcXcXcXmXmXmXMXnXmXmXmXMXMXmXMXMXMXMXmXmXmXmX~ ~ Q ZXFXVXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX,X,X,X2X;Xx <X<Xj k k -X-Xk tX2X,X>XtXtX5X7X .X.X.X.X.X.X.X.X.O.X.X.X.X.X.X.X. . . .o.+.8X:X:X6X:X3X8X8X3X8X:X<X6X2X7XX.X.X.X.X.X. . .o.O.O./ } O.X.X.X. .O.o.8X>XuX6X..X.X.X.X.X.X.X.X.X.X.X.X...} } } v v v ;XtX2X1X>X5.4.uX,X,X>X>XyXtX3X8XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXAXBX' / Q ' b.].]._.}.}.|.|.|.|.|.|. X'. X X|.|.|._. X|._.|. X_.|.}.}.|. X].! ! _ BXZXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFX9.;.5.:.;.wX>X,X:X:X:X:X:X;X:X;X:Xx p g p @ 4 h + w 4 O @ h z p d - @ p :X>X>X2X4Xk a a z + 5 w l h + z a w k -X+ a x @ p s O + w z a + z 7 2 2 2 2 2 < z z a k ;X@ O p O - g s a z - p w a a a z p - O p O v ,X,X,X2X2X,X<X,X2X<.,.,.5.1X1X4XwXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXAXDXDXAXAXAXDXDXAXAX~ ~ ) b.n.!.~.T.U.Y.L.Y.L.L.D.L.L.H.L.L.U.U.P.P.T.Y.T.Y.U.U.P.P.L.L.U.L.U.L.P.L.L.L.L.L.S.U.L.L.H.I.L.L.U.L.L.L.L.L.L.L.S.G.H.H.S.H.A.A.A.A.A.h.g.G.",
+"m m N N N B N N B B B B B B B B B B B N T m N N C N C C C N C A A C C N C N Z B C B Z N C C C C H C C C C Z C Z Z Z Z Z C D D D Z F Z Z Z Z D D D D D D D D Z Z Z Z D Z D Z D D Z Z H H Z H D D H H D H L Z J L F H H D H H H H H H H H J K L L P P J I J J I J P ) ) ) I ( ) ) ) ) ) ) ) ) ) ) I I I I ) I I I ) ) S J ) J I ) I ) P ) ) P P ) n.~.(.(._.(.|.(.(.^.).(.{.(.(.(.(.(.(.(.(.`.`.`.`.`.(.^.|.(.(.(.^.(.(.(.(.^./.`.{.(.`.(.).{.(.(.(.`.^.|._.|._.|.|.|.|.|.|.|..X.X'. X.X.X.X.X.X.X.X'.dX X.X'.'. X`.|.|.|._._.|._._._.`.(._._._._._.{.(._.^.^.|.(.(.`.(.(.(.(.(.(.(././.!././.[.~.[.~.~.~.~.~.T.~.T.~.T.~.T.~.T.T.~.T.~.T.T.T.T.T.T.T.T.P.Y.P.L.P.L.L.L.L.L.H.! S Q ZXFXFXZXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXz sXn v *Xb n b h j { 7 *Xb n d z | iXeX- x n - p 4.>.>.9.-Xj k v 4.>.:.v 7 eXkX8.2 2 =.2 2 2 =.2 =.2 2 2 7 gXsX+ @ n b p 3 4.x p 7 2 2 =.2 =.2 j l q.=X- p -X} - b <.;.:.0X1X<X<X2X,X,X<X>X,X2X2X<.>.;.<.tX2X,X1X0X;.-.,.5.4X<.,.>.-.-.4.4X,X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXCX' / ! U T j.n.G.Z.h.G.A.G.A.A.A.S.S.A.H.S.H.H.S.S.H.L.L.L.S.L.P.L.S.L.Z.! / ' BXVXFXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXVX- + # z @ @ g g 5 @ 5 g a h h g h h h w @ @ v l l x -Xv 3Xk 9X*Xg l k <X;Xv g k j *XO kX7 5 a s -X-X6XM.iX@.z x z a z v x p n x p a z v k @ a z k k d a - a a d k g - + x @ + + a ;X@ j 0Xs v v 4X+.+.O.O. .O.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXVXS / ~ M.].hXxXcXnXnXnXnXnXcXxXMXmXcXMXnXnXMXmXnXMXmXMXmXMXMXMXmXmXmXnXnX~ ~ ! AXVXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX,X,X,X2X2Xz -X>Xq.k s s 2.k :X,X,X1X4.:.wX6XO. .X.X.X.X.X.X.X. .o.X.X.X.X.X.X.X.o.X.X.O.o.O...O. .o.O.X...O.X... .X.X.o.X.X.X.X.X. . .O.+.O./ ! O.o.X.X.X.X.o.X.6X6X .o.X.X.X.X.X.X.X.X.X.X.X.X.X.+.| | / O.O.o.7X<X:X8X<X:.0X>X,X3X8X:X6X .X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXGXAXVXBX[ / Q ` n.].`.}.{.}.}.|.|.|.|.|.|.|.|. X|.|.|.|.|._.|._.|.|.|. X}.}. X]./ / ' BXZXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX5.;.,.;.:.4.1X,X3X2X2XtX2XuX,X1X>Xv b 9.;X@ =.8.x @ l x b - k f +.! a # O :X1X<XuXO + z sXz + l n l p v x sXh k p IXx l p 1XKXz z ;X,Xg g *X*X*XwX*X*X*Xz w sXz k p 4.qXk z j 9Xs k p -X6X- h :Xb z d 5.9.v l 2X,X,X,X,X,X,X,X2X<.,.4.1XwXqX5.:.FXFXFXFXFXFXFXFXAXFXFXFXFXFXFXDXAXDXAXAXAXDXAXSXAX~ ~ / b.n.!.Y.T.Y.Y.L.L.L.L.L.S.L.L.S.S.L.L.P.P.P.Y.T.U.U.U.P.L.L.L.U.S.L.U.L.L.S.L.L.L.S.L.H.L.U.H.L.L.L.L.L.L.L.L.S.L.L.L.H.H.H.A.A.A.A.A.A.A.g.g.",
+"m m B N N N C N B B N B B N B B B B B m N C N N N C N C N C N C B m N C N N B C C C C N C C C C C D C B C D Z Z Z C D Z Z Z C D Z Z D D Z G Z H Z H D D D D D G L L Z Z D D D D Z Z H H D D D D Z H Z H D Z L D H S D H H H H H H H H H J H H L P P P P J ) S P P / U P P ) J ) ) I L ) ) ) ) J L ) ) ) P P ) P ) P ) ) ) U I ( I ) S ) I I ) ) b.].(.~.(.`.^.(.`.(.|.{.{.(.(.^.|.(.(.(._.(.`.(.^.(.^.`.^.(.{.{._.(._.(.).{._.(._.(.|./._.^.(.(.^.`.^._.|.^._._._.|.|.|.|. X.X X|..X.X.X.X.X.X.X.X.X|.|..X X X X`.`.|.|.|._._.|.|._._._._._._._.|.^.(.(.(.^.(.(.(.(.`.(._.(./.(././././././.~.~.T.~.~.T.~.~.T.T.T.U.~.~.~.T.~.T.~.T.T.~.T.T.T.T.T.T.T.P.P.P.U.U.L.L.L.L.L.H.~ ^ Q ZXCXZXZXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXl x l @ 3 g ;Xl - z 8.j *Xb n g z C W @.- z x a p 2.,.<.uX-Xg k h 5.:.<.b z 8XkX2.2 =.2 2 2 =.2 2 =.=.2 2 4 sXv + @ z g @ < 3 z p < 2 2 =.=.2 2 3 4 8.8.4 p =X6X- ;X2XtXtX>XyX<X2X1X5X4XuX3X1X1X5XyXwX,.>.qX1X2X0X;.-.-.>.<.qX:.;.;.:.,.5.1X,X2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXCX{ ~ S K Y e.G.h.G.A.A.A.A.A.A.A.S.S.S.H.H.H.S.U.L.H.L.L.S.L.L.L.H.L.L.F.Q / ' fXDXVXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXHXn eX@ w g g o g :X:X:Xg z z *X*X;Xz k p l ;Xz z @ h :Xb l z a w a l v b ;Xx - v z h a @ @ w d z p v / @.@.@.b *X*Xb @ + + p p + p x v :X:X;X@ p @ O s k a a h k p <X/ @ l z x n h 7 g 2 3 # sXl v { 7 W W W W .. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXVX! ~ ~ c.aX'.vXvXcXcXnXnXcXcXcXnXmXmXmXmXMXnXMXMXmXmXmXMXMXmXSXmXnXMXnXnX~ ~ ~ ZXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXyXyX<X<X,X,X;Xx v 8.sX7 k j k :X4XuXuX5.,.<.1X3X6XO.o.o.X.X.X.X.X.o.X.X.X.o.X.X.X.X.X.X.X.X.X.X.o.o.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X...f | X.X.X.X.X.X.X.X. . .X.X.X.X.X.X.X.X.X.X.X.X.X. . .+.| } Q O.X.X. ...X. .7X{ 8X8X7X+.X.X. . .X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXZXFXFXHX' Q Q ` n.Y.]._._._._.|.|.|.|.|.|.|.|. X{. X}.|._.{. X|.|._.|.|.|.|.}.].! / _ fXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXyXyXtX<X2X2X,X,X,X,X,X,X,X<X,XtX,Xx g 9Xk a < 7 g g 5 l 4 5 g > W @.a # # O -XuXk # + a :Xv @ l l g p z z x a @ a :X;Xa a :XKXz a wXeXs h *X-Xv v z z *Xz z l a @ a 2.0Xp v k g k g a =X6Xd @ v v + a j 9Xp v 1X>X2X<X,X,X,X>X1X<.,.5.4X<.>.>.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXAXZXFXAXZX~ ~ S b.F.F.Y.T.Y.U.P.P.P.L.H.S.U.S.U.L.L.L.U.U.T.U.T.P.T.P.P.L.L.P.L.S.I.S.D.L.F.L.S.L.U.L.S.L.L.Y.A.L.L.U.L.L.L.L.L.H.H.H.H.S.H.A.A.A.A.A.g.h.h.k.",
+"m N m N N N N N B N B N B B B B B B B B B N C N C N C N N A C N B B C N C C B C N C C C C A C Z C C C D C B Z Z Z D B Z Z Z D D Z Z Z Z Z Z Z Z Z Z D D D D Z D Z Z D D D Z Z D Z H Z Z D D D D Z L Z L H J Z L F H H H F D H S H Z H H H H H P L P J P I J P I P ) ) P P P ) P P ) ) ) ) J ) ) ) ) U P P ) P ) I ) I I ) I ) I ) I ) I I I I I [ !.(.(.^.`.(.(.(.(.`.^.(.`.(.`.^.(.(.(.(.(.(._.(.(.`.(.(.|.(.(._.(._.(.|._._.|.`.(.^.|.^.`.|._.(.`.}.{.`._._._.|._.|. X|.|.|.'..X|.|..X.X X|..X.X X.X.X|.|.|.|.'.`.'._._.|.{.|.}.}._._._._._.`.(.^.{.(.^.|.(.|.(.(.(.(.(.(.(./.(.(./././.~.R.!.T.T.T.~.~.T./.T.~.~.~.T.T.~.I.~.T.T.T.T.T.T.P.T.T.P.P.T.T.P.P.P.L.P.U.D.L.H.~ Q Q ZXZXZXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX;X@ s p 4 + s + z + O + v a p p h 5 e - a p s p z -Xb b ;Xv v v g b b b x 7 eXeXj 2 2 =.2 2 2 =.7 g < 4 < 7 z 2.4 h @ + p h - h k 7 2 =.2 2 2 =.3 a @ @ h g p d w ;X1X4X:X2.j 2.2.7 =.7 j 2.7 2.j 2.1X<.5.2X,X2X:.-.>.4.<X,.<.,XwX<XyX:X2X2XwXwXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXHXBX[ ~ ~ G e.e.A.Z.G.G.A.A.G.A.H.S.A.S.S.H.H.H.S.L.S.L.S.L.L.L.L.U.H.D.L.Z.Q / _ BXDXFXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXCXv <X@ 5 7 4.< z 2XuX,Xv n n g l :X;XeX+ @ :X:Xn z z :Xv @ z h -X*X@ g p w -X;Xg g z v :Xk z + - ;Xv b b d @ k *X*Xg d n l + -X:X>X;X;XyXuX;Xz :X/ + 4.qXk a 4.qXs n ;Xp l 5 5 w 3 w z 7 7 4 n a @ b l * 8.g @. . .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXS ~ ~ M.'.hXJXmXnXnXnXnXnXcXmXmXnXmXmXcXnXnXnXnXmXmXMXmXmXMXmXmXMXnXnXJX~ ~ Q SXVXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3XtX2X>X-X-Xp 5 4 l 4 k v b ;X;X;X-X-Xj :X<X*X-XS +. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.O./ } o.X.X.X.X.X.X.X.o.X.X.X.X.X. .X.X.X.X.X.X.X.X.X...| | } Q X.X.X.X.X.o. ... . ... . .X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXVXBX] ! Q ` b.Q.].(.`._.`._.{.}.|.|.|.|.|.|. X|.}.|.{.|. X|.|. X{.|.|.|. X].! / ' BXDXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXyX1X3X2XwXwX,X,X,X,X,X,X,X>X>X2X2Xv @ a l g 5 @ 5 g 5 @ 4 g 5 a - @ g g @ + l n a a g a a 5 h a @ @ + g a + z g h @ @ h g @ @ a g - d @ w *X;X:Xn v v =Xg l @ h g h d a - g v v l h g a d z z a d g g g a 5 k b -X-X,X,X,X,X,X,X<.<.4XwX:.-.-.-.AXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXSXAXZXZXFXFX~ _ / b.n.].~.Y.Y.U.L.F.L.L.U.Y.S.L.L.L.L.L.L.U.T.T.T.T.T.P.L.L.P.L.L.U.L.L.L.L.H.L.S.L.S.U.H.L.H.L.U.L.L.L.S.L.L.G.G.L.H.H.H.A.A.A.A.g.j.G.h.h.h.h.",
+"B m N N B N N B B Z B B N B B N C B N N B B m N C N C Z C N N A B A N C N Z C B C N N N C C C C C D Z Z Z Z Z F Z D Z Z Z D C C Z Z Z D D Z Z Z Z Z Z Z Z D Z D D D Z D Z Z Z Z Z Z H Z D D D D L Z Z Z Z Z H D D H H H H H H F H H H H H H H H P P P P P P ) P P P I I ) P P ) ) ) ) ) ) ) J S P ) ) P P ) P ) ) P I I P ) I ) ) I I I I _ I I Y Q.`.~.(.[.(.(.(.(.(.{.{.(.^.(.(.(.^.`.(._._.(.`.`.^.(.(.`.^.|.|.^._._._._.}.{./.|.|.^._.|._.^.(._._._._._._.`._.|.'._.|.|.|. X|.@X|.|. X|.|.'.|..X'.|.|.|. X|._.|.|.`._.|.|.|.}.}.}._._._._. X(.^.(.(.(.(.(.^.(.(.(.(.(.(.(.(./.(././.~.~.!.!.T.T.T.T.T.~.~.T.T.~.T.~.T.~.~.~.T.T.T.T.T.T.T.U.T.T.P.P.P.P.P.P.L.L.L.L.L.L.~ ! S ZXFXVXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXv @ g @ p k p :X:Xg k p @ + k + @ @ v x z 4 v a z v p p - a g g p 5 z a z < O O < 4 4 O 4 < < 7 a @ z k 7 eXkX9Xg p h z @ a p g p 7 2 2 2 =.2 =.3 p z z g 5 < @ + b *Xk < 2 2 2 =.2 2 =.2 2 =.=.2 =.1XyX2X2X,X2X<.:.,.9X4X<.5.4X1X1XwXtX4XwX:.5.DXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXCX} ~ ~ L e.e.Z.W.A.A.A.A.A.A.S.S.S.G.S.H.H.Z.L.L.L.L.L.L.L.L.L.L.S.U.L.Z.! / ' BXDXFXAXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX@ + =Xh 3 8.< z :X;Xv z x z p w v z :X@ @ :Xv x g a :Xv x n z *Xv h 9.0Xp v b v z h h :X*X:X> + :X;Xx v h l w h z w z x v + v b -Xk k n b v l :X;XO j 0Xh z j 0Xp z h d g @ + O z O @ z + z @ a z l 7 u ;Xk @...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXZX/ / Q M.M.hXJXvXMXnXMXnXmXmXmXcXMXnXmXJXcXMXcXmXmXmXmXmXMXmXmXmXnXnXmXcX~ ! Q ZXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXyX,X,XyX>Xj 5.k b l ;Xa h @ @ s a a j 9.-X:X>Xj 5.k | ..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O./ / O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.O. . .} } } / X.X.X.X.X.o. .X.X.X.X.X.X.X...7X:XKXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXCXDXZXZXBX[ Q Q ` F.Q.{.(.(. X`.|._._.{.|.|.|.|.|.}.}.|.|. X X|. X{. X[.|. X}. X!.! S [ BXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXwXqXwX4X4.4.,X,X,X,X,X,X,X,X2X>X1Xz k *X=Xg 5 g g g z p g h h p v @ a + g 4 @ a d + a a z h a x { M.c g p s g h h k k h h z k *Xd g k + z *XeXsXsXv -X:Xz w g z 5 a g z a h h k @ a a # O @ -X# O + g g k a h # O :X4XyX>X<X,X2X:.4.4X1.-.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXVXGXZXVXZX~ / _ [ n.U.Y.~.P.T.L.Y.L.S.U.S.L.L.L.L.L.L.P.P.Y.Y.P.T.P.T.U.L.P.P.L.S.L.L.L.H.S.L.L.H.H.S.H.S.L.L.L.D.S.L.L.L.H.H.L.H.G.D.G.S.A.A.A.A.g.h.h.z.h.g.",
+"N m B N B B B B N m B N B B N N N C N B B B T N N C N N N C Z N Z N C N C N B C C C N A C C Z C C C Z C C Z Z C Z B Z Z B D D F Z Z Z Z G B D D Z D D D D Z D Z Z Z Z Z Z Z Z Z H Z Z Z D Z D D Z Z H H L H D H H F D Z H D H H H D H H H P J H L P J P P P P P ) U P P P P ) P I P J ) H ) ) ) U P P ) I P I P I I ) / ) P ) I I ) ) I I I I I I n.(.(.(.(.(.(.(.(.`.(.(.|._./.|.(.(.(.(._.(.`.(.(.(.(.(.(.(.(.(.`._._.(.^.`.|.|._.(.|.^.|.|.^.`._._._.|.^._.|._.|.|.|.|. X'.|.`.(.|.|.|..X|. X X X|.|.|.|.}.}._.|.`.`.|._.|._.}.}._._._._.[.].(.(.(.{.(.^.^.)./.^.^.(.(.E./.!./././.~./.~.~.~.~.T.T.~.~.T.T./.T.~.I.~.~.I.~.T.P.^.T.T.T.P.T.T.P.T.P.P.P.P.P.P.U.L.G.L.S.H.! ! ~ ZXVXZXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXg n n + g yX*XO :X:XiX-X4 x 8.x + :XsXh z z sX7 a v qXj h g 9.;Xa f sXn @ g z n - > } -Xp z gXsXp k BXsX4 sXkX2.j k -Xn z + p k g 7 =.2 2 2 2 =.< s ;Xb z 5 8.=Xa v k 9X4 =.2 =.2 2 2 2 =.2 2 2 2 3 1X2XtX,X,X,X,XtXwX,X1X,X,X1XwXqX-.<.5.5.wX2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXmX' ! ~ K T Z.A.h.A.A.A.A.A.A.A.S.S.G.G.H.D.P.L.S.L.L.L.L.L.L.L.U.L.U.S.F./ / ' MXZXFXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXsXn z h + O *Xv :Xl @ @ *XO h 5 a w @ @ l v h - a z :Xb z x g :Xb h 5.*Xz ;Xg   + z z :X;Xn ;X- :X:X:Xk v >X;XeX*X*X+ + s *X+ z l @ v p p @ z - - @ a p 5 g d a d - 4 2.5.k - 8.8.3 n 8.4 w w l @ w 3 / c n @.+. .X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXS ! ~ c.].hXJXmXnXnXnXnXcXmXMXnXcXnXnXdXmXmXmXmXmXmXmXmXMXmXnXcXmXcXcXcX~ ! ! ZXVXGXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXyXtX2X<X:Xg j k >Xb -Xj 5.-X4 9.*X- g 5.k k v j 5.k } O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .n } O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.O.6X:X:X:X;X' o.X.X.X. .o.X.X.X.X.X.X. . .6XuXyX2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXZXSXBX} ! Q ` n.].].`.(.`.(._.|.|._._._._._.}.|. X{.|._.|.|.|.|. X X X|. X X]./ ! ' BXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVX9.,.:.wX,X,X1X1X,X,X,X,X,X>X>X1X>X-X=XiX-Xz j 9.:Xd k 5.;Xz k v 8X:Xd 7 M.8.@ k 8X> @ a eX3X@ / eXiX> g p 4XKXz @ iXuXh l sXh v d eXv O h -X6X;XsXb v =Xz d ;X2Xz a 4.qXk p 4.qXk z 5 # # + :X# # # d 4.5.k w # # k :X*X-Xv >X2X<.<.9X;.-.-.,.4.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXZXZXAXZX~ ~ ! b.F.].Y.T.P.P.L.Y.L.L.L.L.S.L.D.U.L.L.U.U.T.U.T.T.T.P.P.P.P.P.U.S.H.H.L.L.L.S.Z.D.H.U.H.L.L.S.S.U.L.L.S.S.L.L.H.H.G.A.G.A.A.A.A.h.h.h.g.h.g.g.",
+"N B N B B B B B B B B B N B B B B B B B B N N C N C N B B B C B B C B C B C C B C C N C C C C C C C Z C Z Z Z Z Z D N G Z Z Z B Z Z Z D D Z Z Z C Z Z C D F C D Z Z Z Z Z Z Z Z Z Z D Z G Z D D P H Z H Z Z D D D D D D D D H H H Z H H H H H J J L P P P P P K P P I I I I P ) ) U ) ) ) ) ) P _ P ) L P ) P P P P ) P I I I I ) I I I ) I L I P F.~.(.(.(./.(.(.(.(.(.(.|.{.^.(.(.(.(.(.(.(.(.(.|.(.(.^.`.^.`._.(.(.|._.(._._._._._._._._._._.(._.^._._._._._.}.|._.|.|.|.|.|.`.|. X_.|. X X X}.}.}.}.}. X}.}.|.|.|._.'._.}.}._.|._._._.^.`.^.{.{.(.(./.(.(.(.~.(.(./././.~.(.~.(.~.~.~.~.~.T.T.T.T.T.T.T.T./.T.~.~.~.U.~.Y.L.T.T.T.P.T.T.Y.U.Y.P.P.P.P.P.P.Y.U.L.G.U.S.G./ S ^ ZXVXZXDXZXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXz x x a v KX-Xs <X*XiX-X- g 8.7 @ k eXv @ @ 8.4 z k j k d g 5.*Xd - | @.@ 5 7 4 a > W c @ z sXl + v sXl < ;XeXb 7 s ;Xa @ h v k p 7 2 2 =.2 =.2 3 p ;Xg + 4 M.8.4 v k j 4 2 =.2 2 2 =.2 2 =.2 =.2 =.1X>X2X,X2X,X2X1X4X4XwXwX1X0X:.>.-.>.9.4X4X<XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBX[ ! ! L e.e.Z.A.A.A.S.S.S.S.S.H.G.A.H.G.H.K.H.H.H.L.L.L.H.L.S.L.S.L.L.F.S / _ fXDXFXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXZXx g p + 8.b g z :Xz n n k j M.7 @ z z 5 @ d @ @ =X=X=Xv 5 @ + v l a a a z b x l n @ z :X:X-X*Xv v b -Xz v *XsXeXwX*Xl sXz k s -Xn a v k 9Xd b :X:X:X:X:X;X7 3 7 7 =.2 j 0Xp z 8.q.O x 8.4 @ 8.8.- @ w > , > d 5X+...o.X.X.X.X.X.X.X.X.X.X.X.X.X.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFX~ S ! M.V.hXfXnXMXmXMXnXMXnXmXcXmXnXmXnXmXmXmXmXmXmXmXmXmXmXmXcXcXcXnXxX~ ! Q ZXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3X1X4.9.,X-Xs g @ - j 5.*X7 qX-Xa + p k s - p s k -X} ..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.Q | o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.6X3X2XuX>X>X;X;XyX:X3X3X6X ...X.X.X.......7XuX,X,XwXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXFXFXBX[ ! ! _ b.m.(.`.(.`.`._._._._._._._._.}.}. X}.|.|. X|. X X}. X X X X X~.! S } BXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.>.>.4.4XtXqXwXtX,X,X,X,X,X,X,X,Xv =X=X=Xp 4 5.-X@ h 5.*Xz g s 6X-Xa 3 k g + v ;X;Xw g KX:Xa ! @.W > g a <XKXz p iX:Xa l x a @ h :Xb O z *XeX:XeX-X*X=Xj h <XyXh @ 2.9Xp d j 0Xk z @ # # p *X# # # a j 9Xk @ # # O -XwXuX-X>XyX<.>.,.;.;.4.2X1XDXGXDXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXZXAXAXZXZXZXVX~ / ~ b.n.P.T.T.U.Y.P.L.L.L.Z.D.U.L.L.L.L.U.P.P.T.T.T.T.T.U.U.U.U.L.U.L.L.L.L.S.S.L.H.H.G.L.H.H.H.H.L.S.H.H.H.H.L.H.H.H.S.S.A.A.Z.j.h.h.g.g.g.g.g.a.",
+"N N N N B m B B B B N B B N N B B B B B N C C Z C N C N B A B C C B C B C C N C C N A C A C C C Z C C Z Z Z C Z Z Z B Z Z Z Z G D Z Z Z C G Z Z G Z Z D C Z Z F Z Z Z C Z Z D Z Z Z D D Z Z D Z Z Z D Z D D Z D D H D D H D F H H H H H H H J H J J L L L P P P I P ( I I P ) I U / P P ) P ) ) P ) U / ) P P ) ) P G / I I I ) P I I I I I P ) I b.~.^.(.(.^./.^.(.(.(.{.(.(.{.(.(.].(.(.(.(.(.{.(.(.(.(.(.(.(._._._.|.(.|.{.|.}._._.}._._.|.(.`.(.`._.|._._._.}.}.}.|._.|._._._.|.|._._.|.|.|.}.}.}.}.}.}.}.}.`._.`. X|._.|._.|.|.{.|._.`.^.{.(.^./.^.(./.[.(.(./././.(././.~.(.~.(.~.T.~.T.~.T.T.T.Y.T.T.T.T.~.T.U.~.~.U.R.~.T.T.T.T.T.U.P.P.P.P.P.P.Y.Y.P.P.U.L.U.L.U.G.! / ! ZXVXZXZXVXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXd + +   O p O -X;Xa @ a h @ @ 4 g h p h g o @ 4 a v v v g @ d h g @ , - g 4 @ + g 5 - @ g 5 d h p 3 < 2 2 2 2 2 4 5 z p h h @ + z 7 =.2 =.2 2 =.< g - h h h w 4 5 g v v g 7 7 w 7 7 7 4 j j < 7 g h -X-X-X-X:X2X1XwX0X5.,.5.4X:.-.-.-.>.<.0X0XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXCX{ ! Q i e.j.Z.H.S.A.S.S.S.S.S.H.A.H.H.H.S.H.H.L.L.H.L.L.L.S.L.L.L.L.L.F.Q / ' BXDXFXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXZX*Xn ;X*Xb z p z tXv x x a 4 8.7 h x n a z n a p =XiX-Xh ;X:Xz z w w 4 l w @ 5 l 5 @ @ v b v ;Xv z s d d v >XsXsX-X*Xl n p + s k *Xa v k k a :X<Xv ;Xb -Xv w 7 l 7 7 5 @ c 8.i 1 O < 2 < -Xa l 8.4 h n v O sXl k 6X..o.X.X.X.X.X.X.X.X.X.X.X.X.X.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFX/ / S M.].hXxXMXmXnXmXmXmXnXmXmXfXnXnXbXnXmXnXmXMXnXmXmXnXnXmXnXcXnXcXdX~ S Q ZXZXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX2XyX:.;.yX>Xl l l h a *Xs O p k b z g 9.k v l g 9.*X} O.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.f { +.o.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X...6X5XtX2X:Xk v v b :X;X;X;X;X:X6XX.o. .+.8X<X1X,X1X0X<.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXVXHX' Q ^ ` n.!.!.`.(.(.(._._._.(._._. X_.}.}.}.}.}. X X{.}.|.}.|.|.|. X X].! / ' BXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.>.1.1XwX<.,.<.2X>X2X,X,X,X,X,X,Xz 5 p s h p p p a a s p @ h p p p @ + p p 5 a g p @ + a + a 5 - 5 p z p + p @ + s p @ a + p a @ a p a a p *Xk *X*X*Xk z @ p h @ d p p a @ p s p h a O O p v O p @ a p s @ 5 O O p -X*XuXk 2X1X4.;.4.<XtX1XwXqXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXZXVXFXZXZXVXVX~ ~ ~ b.n.L.T.T.T.U.U.L.L.L.U.U.D.L.S.L.L.L.P.T.P.T.T.U.U.T.U.Y.L.L.U.P.P.S.U.S.Y.S.G.L.H.H.H.H.H.H.A.L.H.S.H.H.G.H.H.G.S.S.A.A.A.h.h.g.g.g.a.g.z.k.",
+"N N N N B m B B B N B N B B B N B B N N N B B B Z m N A B B N C B Z B C N B C B C C C C C Z A Z Z Z Z Z B Z C Z C Z Z Z Z Z Z Z D D Z C B Z Z Z Z Z Z D F B Z F B Z Z Z Z D C G Z Z Z D Z D D Z D D D Z D D Z H D H H D D H H H H D H H H P H J J H H L P P P P P P P P I I I I _ P ) ) L ) P I I ) U ) ) P P P ( P ) P I I I I I I ) I I ) I I I [ T.(.(.(.(./.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.(.`._.|._._._._.|._._.}._.|.}._._._.`.(._._.|._._._._.}.|._.|._._.|.`.`.`.|.{.}.|._.}.}.|._._.}._.}._.|._._._._._.}.|.{._._.|.^.(.(./././././.(.(.[././././.!./././././.(.~.~.T.T.T.T.T.I.T.~.I.T.T.T.~.I.~.T.I.!.I.T.T.P.P.U.U.U.P.P.Y.P.P.Y.P.P.Y.U.L.L.S.S.S.~ S ~ ZXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXz b ;Xo v 6X-X< w @ z 5 h a d p a 5 v w a =X*X*Xg 4 l 5 h h k g a l n M.x h g g h 5 + + h p a z p < =.=.2 2.2.=.7 k g v v @ g 4 @ 4 6 O O 2 4 x 5 p z s p h p g g h c eX/ a - s p z @ b l p a s p d < < p # v 1XyX:.,.>.;.5.4X9.>.-.-.-.-.>.,.<.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXCX' ! ! Z T j.Z.S.S.S.G.S.S.S.S.G.A.H.H.H.L.L.H.L.S.L.H.L.H.U.U.L.U.S.L.F.S / _ BXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXZXwXpXeX5X*X+ + p v l o O =XO 4 O @ l x a g x z z =X=X=Xz :Xk 4 8.v + l 8.x + w 4 + z z w { 8.c z v 2.j p -XuXk g ;X*X@ + p s z h z a x v v g j v z a p 5 < k @ + d s - - } iXu 2 d < + O b z + 5 z z x l p n a p <X7X..o.X.X.X.X.X.X.X.X.X.X.X.X.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXVX~ / ! c.m.hXxXxXmXnXmXnXmXnXcXmXnXnXnXnXnXnXnXnXnXnXnXnXnXnXnXnXcXcXcXdX~ ! ! ZXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyX<.-.-.<.:Xz x 4 v l v j 9.-X4.<.x j 2.k :Xv j 5.k }  .X.o.O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. . .o.o.O.} } X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.8X:X;X:X;Xn x + e + h @ a d @ ;X<Xv v -X>X>X>X<XwX:.;.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXBX[ ^ Q ` n.].~.^.^.(.`._.(.^.`._.|._._.}.}.}.}.}.}.}.}._.|.|._.}.}.|. X].Q ! _ BXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX9.>.9.4X9.>.-.9.1X,X2X2X2X,X,X2X,Xl z z z p g z z g g l l g h z z l g h z z g g z g g l z l p g z z z a g l l g g h x g g l l g g g z z a g z w g z d 5 g g z v g p l l g g h l z 5 g a z z z l l a g l v z g x z z a g g a b ;XtXwX2X1XwXqX:.,.FXZXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXZXAXVXGXZXVXFX~ ~ ) b.n.].Y.T.U.U.U.U.L.L.P.L.L.L.L.L.L.L.P.P.P.T.T.U.T.U.Y.P.U.Y.U.L.P.L.L.D.Z.L.H.H.L.G.H.H.H.H.P.L.D.S.H.H.G.D.S.A.H.A.A.g.g.h.z.g.g.g.g.f.f.z.",
+"B N B B B B B B N B N B B m B B N B N C B B B B A C Z B B B C N B B C B C B B C N C A C C C C C C Z C D D Z Z Z Z Z D F Z Z Z Z D B Z F D Z Z Z Z Z Z B Z Z Z Z Z Z Z Z Z Z Z Z D D Z Z Z G D G Z D Z H H Z H D D D D D H H D H H H H H H H H J J J K U P P J P P P ) P P I P I I ( P P ) P ) P I I I ( P P ) ) I ) P I I I I I I I P ( I J ) J I ` F.(.[.(.(.^.(.(./.(./.(.[.(.(.(./.(.(.(.(.(.(.(.(.(.(.(.(.^._.(.|.^._._._.|.}._.|._.[.|.^.`._.`._._._._._._.|.^.[.}.|._._._.`.(.(._._.}.}.|.|.{._._._._.}._.|._._. X_._.}.}.|._._.{.|._._.(.(.(.(./.(./.(.~././.~./.~.~././.~.~.T.~.~.T.L.T.T.T.I.I.~.Y.T.T.~.Y.T.T.~.~.I.~.Y.T.T.T.U.T.P.P.P.P.P.T.T.P.P.P.L.S.L.L.U.D.~ / S ZXVXAXDXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXHXd v 8Xp k 8X-X2 7 l sX7 @ v KX-X@ x 8.l s =XiX-Xd g 8.7 + j 9.;Xd | wXiX@.g 9.:X@ z v n + s :X/ @ b 2.< 2 2.9.2.4 7 < 4 v 4 8.=.+ w c.t p g gXsX+ p | -Xp d 4.qXk Q { iX/ d | -Xs w sXgXa p W -Xs 7 2 q.-Xp k yX2X,.4.tXtXyX2X,XwXwX:.-.-.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX} S ! J e.b.Z.S.S.S.S.S.H.S.H.H.K.L.H.H.H.S.L.S.L.L.L.L.L.L.S.L.S.L.L.F.! / ' BXZXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXSX:XsX:X>X=Xn n @ k k eXn h l sX7 @ +   =X+ + O z g 4 j l <XO 4 q.x @ a q.2.+ 4 x g z g ! eXiX@.z v k v p ;XuX*Xk k v 5 z z z b h 5 5 5 b ;Xk b ;Xv k 0X3 < <X/ % p :X/ % W W @.2 z :XQ - a h v 4 < z @ @ a @ + p k k > ..X.X.X.X.X.X.X.X.X.X.X.X.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXVX! S ! m.Q.JXJXmXmXmXmXMXmXnXnXcXnXnXnXnXnXnXxXnXnXnXnXnXnXnXnXcXcXvXzXfX! ! Q CXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX4X4.>.-.-.>.4.k k g >X;Xz g 5.*X:X>Xv p -Xv ;Xl g *X=X>X7XO.X.O.X.X.X.X.X.X.X.X.X.X.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .o.O. ... .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.o.| p a - ;X-Xc v a a 2.9Xs 4.0Xp b :Xj ;Xk 1X2X2XtX:.;.,.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXFXFXVXBX} Q Q ` F.Q.!.(.^.^.`.(._._._._._._._.}.}.}.}.}.}.}.}.|.|._._.}.}.}.}.].Q ~ ] BXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX5.,.4.1X4.>.-.<.1X<Xk v v :X2X,X,Xv h g g g g h g h h g k h h + 5 h h k w a h h a w 5 k =X=Xk h v n @ g h l x h a z z h a k p h a g g + z @ z z w d p k h 5 g n h h w 5 + h s g a h h p v a z a g p g < h O v p k a d h p g + a -Xk wXyX4.,.>.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXVXAXFXVXFXFX~ ) ~ c.F.!.Y.P.U.P.L.L.L.L.P.P.L.L.L.L.L.L.U.T.Y.U.U.U.T.U.L.U.U.L.L.U.P.L.L.L.U.L.H.L.H.L.L.H.L.G.D.A.D.D.D.S.S.A.H.H.h.J.A.A.h.h.f.g.a.f.f.f.a.z.",
+"N B B B m B B B B B N B B B B B C N N N B B C N N N Z N N C N C B C C B C C C B C B C C C C C Z Z C Z Z C Z B Z D Z Z Z D C Z Z F Z Z Z Z Z Z Z Z Z Z Z D B D B B Z Z Z Z Z Z Z Z Z Z D Z H Z Z D Z Z H Z Z F Z D D D H H H H H H H H H H Y H H P H J J L J J J P I P P P P ) P I I P I P ) P P I I I P I I P P I I I I I P P I I I P ) I I J ( I ` n.(././.(././././.^./.(././.~.(.(.(.(./.(./.(.(.(.(.(.`.^.`.|.^.}._._.{.}.}.|._.}._.|.[._.|.^.`._._._._._.|._.^._.|.{.|.`.`.(.`.(.|._._.}.^._._._._._._._._.`._._. X_.|. X X_.{.}._._.{._.(.^.(.(./.~.(././.~.~.~.~.~.~.~.T.~.T./.T.T.T.T.T.U.U.T.U.T.T.T.T.T.T.T.T.Y.I.T.~.P.T.T.Y.P.P.Y.P.P.Y.P.Y.Y.P.P.Y.L.L.G.L.S.S./ ! ! ZXHXZXFXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXz 3 2 3 3 3 2 2 a l q.j + k 6X-Xp l 8.7 - =X=X=Xh l 8.4 z g 5.-Xz A @.W > g 5.*Xw w x 4 @ s :X6X@ ;X1.2.=.2 2.=.2 =.2 < z 4 2.j 5 4 <.q.+ p sXn O - W / z a 2.0Xp c W W @.w S | h - sXn O p W | d 7 2 8.sX< v 2XtX1.5.1X1X2X,X2X1X4X<.-.-.-.>.9.ZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXHX' ~ ~ i e.s.Z.Z.Z.H.H.H.H.G.H.H.H.H.L.H.L.G.H.H.L.H.L.L.L.L.L.Y.S.S.A.F.! / _ fXZXFXZXFXVXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXDXAXGX:Xg k >X5Xv l z :X>Xn z + 4 8.4 @ :Xn g v n z d z p h z k p O O p v + O s k 7 n x 4 k r W W > z z v v a z ;Xn b :X:Xv 4 4 d k 7 4.n 5 ;X*Xp g h v k j 4 2 ;X;Xd l :X;Xd 2 2 2 2 l n ;Xg @ -X;XO < l + 4 2 3 z w 2.=.3 +.O.X.X.X.X.X.X.X.X.X.X.X.DXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXVXQ / S M.].JX.XJXmXvXmXnXMXnXnXnXnXnXnXxXcXcXcXcXcXcXnXnXxXxXcXxXcXzXcXdX/ ~ Q ZXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXtX<.>.-.-.:.yXuX:XtX>Xv a -Xk k -Xk + a a v v 5.9.*X*Xv  .O.O.O.O.o.o.O.O.O.o.O.o.o.O.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.o.X.X...o. .X... . .X.X.X.O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.f =XKXd ;X*XO p k a 5.9Xs 2.9Xp ;X-X2.j k 5X2X2XtX>.4.wXGXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXZXFXFXHX[ Q ! ` n.Q.!.`.(.(.^._._._.(._._._._._._.}.}.}.}.}.}.|.{.`._._._._._.].Q ! ] BXZXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXyXtXyX1X9.>.>.<.1X:X=X6Xu :X2X>X,Xz j 9.:Xz k 9.:Xd g 9.;Xz k h n ;X@ k 9.0X5 s <X| % =XiX=Xz v KXz k z z KXl l l n l @ z iX5Xa a iX5Xk g z n x @ a iXuXz z KXx z w :Xn + d iXuXk g d 4.9Xv @ 2.9Xk h q.;Xg l k 5.-Xg h 2.9.k v yXb ;X*X-Xk <.,.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXDXFXAXVXZXFXSXFX~ ~ / b.n.L.Y.T.P.U.L.L.L.U.U.U.L.L.L.L.L.L.L.P.Y.P.T.U.T.L.T.U.L.L.U.L.L.Y.K.L.S.Y.U.L.H.L.H.H.H.G.H.A.H.H.G.S.H.G.A.A.A.h.l.l.g.g.a.f.i.z.a.f.a.a.",
+"B B B N B B B B N B B N N B B m N N N C B C N N N C N C C B C N B B B C C B B C C C C C C Z C C C Z Z B Z Z D Z Z Z C D Z Z D Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z F Z F Z C B D Z Z Z Z Z Z Z Z Z G Z D Z F Z H D D D D D D Z H F H H H H H H H H J J H H J K U H I J P P ) ) ) P P I I I I P ) P ) I I I I I P _ L I I I P I I ( P I I I P I I I I J I b.{.(./.^.(./.!.(./.^././.(.(./.(././.(./.(.(./.(.(.(.^.|.(._._._._._._.`.}.}._.}._._._._.(.`.(._._._._._._._.|.|._._._.(.(.(.(.(.^._._._.|._._._.|._._._._.(.`._._._. X_.}._.|.}.}._._.^._.(.(.(.(.^././././.~.T.~.T.T.~.~.T.~.~.T.T.U.Y.U.I.U.Y.U.U.T.T.T.T.T.T.T.Y.T.I.Y.T.T.P.P.T.T.P.P.P.P.P.T.P.Y.P.P.L.L.U.H.S.S.! Q ^ ZXVXZXZXAXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXv 7 4 3 7 7 7 4 g + + 4 g h d - l a 4 + x g g g g 5 - a g a a @ g 4 w w g a g p g h + 5 h h p d h j 2.=.2 =.2 =.=.j 2.j z w + 5 5 @ 4 - d p p @ a @ - + @ @ p p p - 4 w 5 @ + + a z 5 h 5 a - & a g 5 + 9 4 v yX,XuX,XyX,X>X<X2XwX0X:.-.-.-.>.4.ZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBX[ ^ S L T j.Z.A.S.S.A.G.S.H.H.L.H.L.H.H.K.L.H.L.S.L.H.L.H.H.H.L.L.U.U.F.! / ' BXDXFXAXAXFXFXFXFXFXDXZXFXFXFXFXFXFXFXFXFXFXAXDXFXtX:X9X9X9Xj j j qXwX-X=X-X-X-X-Xl c l p - n z w -X:X:X:X-X-X:X:Xk z n sXz z z 8.q.5 w v b b x ;X:X:X:Xv v ;X;X0X0XuX-X+ kXkXk k 2 j p ;Xj 8.=.+ x v v k w w - d d % a z 7 g 7 z w z d z @ k -Xp 8.8.4 3 7 3 z + 7 0Xg >X+...X.X.X.X.X.X.X.X.X.X.DXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFX! S Q ` m.hXvXmXmXnXMXnXnXnXnXnXnXnXnXnXnXcXnXcXcXcXcXcXnXnXxXcXcXzXzXzX! S Q ZXZXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3XtX<.,.>.,.4.5X:X*XwX;Xl ;X:Xj 9.k g 5.-X:Xb g g g 4.*Xa v f n v ;Xc @./ f +.O.O.O.O.O.O.X.X.X.X.X.X.X.X.X.o.X.X.X. .O.o.O...X.X.....X.X. ...} +.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.../ 4XKXl b v sXz -X@ a a @ p g d b v v :X>XyX>X>X,XwX<X2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXBX' Q ! ` n.].].(.(.].`.(.(.^.|.(._._._.(.|.[.}.}.{.{.}._.^.`.^.|._._.{.!.Q / ` BXAXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGX3X1X1X1X5.>.-.9.4X>Xs yXf v ,X1X>Xb g 2.j d g 2.*Xh g 2.*X- g h z g z g 9Xk @ s =X6X- =X=X=Xs z eX;Xa l g yX;X@ l x x a a iX:Xa p iX>Xp k z x l d @ iXtXh 5 :X:Xl - ;X;X@ @ wXuXp k @ j 0Xp 5 2.9Xg 5 5.sX< v k 9Xs g h j qXs -XKXv *X;XiX-X>XtXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXSXAXZXFXVXFX~ ~ / b.n.].T.T.Y.L.L.D.L.U.U.L.L.L.L.L.L.L.P.P.U.T.U.U.U.U.U.U.U.L.U.U.L.L.L.U.L.L.S.L.H.L.H.H.S.G.H.H.A.A.S.l.S.z.A.A.A.j.l.h.g.g.z.d.i.d.a.a.a.a.",
+"B N B B B B B B B N N B N B N N N B B B B B N C m B C N m C C N Z N Z N B C B C B C C C C C Z Z D C Z Z Z Z B D C Z Z D Z Z Z Z Z Z Z Z Z Z Z F B D D B Z C C Z Z Z Z G Z Z Z Z Z D D Z Z Z Z Z Z H Z Z Z H Z D D D D D H H H H H H U H H P H P J F J J J I I J P P P P L P ) P P L L _ P P P I I ) P P ( P P I P I P I P ) P ) P P P I P P L ) J J [ (.(.(.(.~.(./.{././././.(./.(.(.).!./././.(.(.(.(.(.`.^.|.(._._._._._._._._.|._.`._._._._._._._._.(.`.(.`._.|._.^._._.`.`.(.`.^.`.^.`._.^._._._._._._._.(._._._._._._._._.}._.}._.|.`.`.`.{./.(.(.(./.~.~.(.~.~.~.~.T.T.~.T.~.T.T.T.T.U.U.I.T.I.Y.U.T.T.T.T.T.T.I.T.I.I.U.T.Y.Y.P.P.P.T.P.Y.P.P.P.P.P.U.L.U.L.L.H.H.H.~ ~ S ZXFXFXDXFXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXz 7 < < 7 g p p g z M.c l 5 h a 3 7 3 7 3 h g g a a g p h 5 l w a @ z h p v d p g h g z h a d h p < 2 2 =.7 2.2 2 2.1.*Xh 5 z - a a + + a a d s p a p s + a d s p @ + a @ g =X=Xk z @ h a + d z a g < + z @ s *X-Xk ;Xn KX6X2X2X<.,.-.-.-.-.>.4.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXCX} S ! F e.e.Z.G.Z.H.H.H.H.H.A.L.L.L.L.S.L.H.L.H.L.L.L.S.L.S.L.L.D.S.L.Z.! ! ' BXAXAXAXDXAXFXFXFXFXDXFXDXFXFXFXFXFXFXFXFXFXDXDXVXwX<.,.>.>.,.,.,.>.:.0X0X0X0X0XqX5.j j 2.j -X-X:X>XyXyXyXyX1X,XuXv p l x p a 5 @ + z k v *X-Xz v -X-X*Xk :X1X5.,.,.wXv d 6X4 7 d + a - -Xj 7 2.4 b k h 4 O g v k -Xp @   a g O p z @ l 7 z a z + x q.4 c 8.4 h p O + O 2X1X+.X.X.X.X.X.X.X.X.X.X.DXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXZXZX/ ! S m.V.hXJXdXnXnXnXnXmXmXnXnXnXnXxXxXcXcXcXxXcXcXcXcXnXxXcXcXzXdXzXdX~ ~ ! ZXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3X2X<X0XwX0XwXyX2X>X*X,X;Xg -Xj 9Xk g 5.:X:Xv # # g 9.-X2 8.g h O p s , 6X=Xf v v f > @.> +.X.X.o.X. . ... .X. . .| > > | O. .o.......X. .O.} u o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .O.| z p l a l n z @ b v a a @ d g a z k -X-X*X-X-X3X1X<X:XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXZXHX' Q ^ [ n.F.!.(.(.(.(.(.(.^._._._.`.`.(.|._.|._.|.}.}.`._.(.`.^.`.{.{.].! / ' BXHXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXwXqX0XwX1X<.-.<.-Xv p p z g b ;Xn g v k v g v h h g v h v k g @ @ @ h g z l k @ p a g h 4 g g h a d @ g h w z h g @ @ h h 5 5 a g 5 d + g h @ @ h g a a h h h h h h a d z l h h h h g h z v g a d a g 4 w @ x v p v @ g a z @ a @ p p *XiX-X;XwXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXVXFXGXZXVXFX~ ~ I b.n.U.^.Y.U.L.L.L.L.L.L.U.L.L.L.H.L.L.P.P.P.Y.T.U.U.U.L.U.U.U.L.U.L.L.L.L.L.U.L.L.H.L.H.H.A.H.A.H.A.G.G.A.A.h.G.l.l.l.h.g.f.f.a.a.a.i.i.i.i.s.",
+"B B B B B B B m B B B N B N B B B N B m m Z C m A B A B A C N N N C N C B B F C N C C C Z Z Z B B Z C Z D B G Z D Z Z Z Z D Z Z Z Z Z Z Z D B G Z Z D Z Z Z Z Z Z C Z Z Z Z Z Z B D D Z Z Z D D Z C H Z Z Z D D D D D D D H D H H H H H H L L H L J J P J J J P P P ) P P ) P _ P _ P L I P ) I I P I P I P ) L P P P I P P I P P P P I P J ) L I J b.!./.(.(.!.(.[./.[.(.(.[./.(.(.~.!././.(./.^.~.(.(.(.^.^._.(._._._._._._._._._.|._.^.|._._._._._.`.`.|.`.|.{._._.|.(.`.^.(.(.(.^.^.`.(.{._._._._._._._._._._._._._._._.|.|.}.}.}.}._._.(.(.`.(.(.^./././.~.T.~.T.T.~.T.T.T.~.T.T.T.T.U.T.T.U.U.I.I.U.T.U.T.T.T.T.T.I.Y.Y.U.Y.Y.P.P.P.T.P.P.P.P.Y.P.P.Y.L.U.U.L.H.H.L.H.! ^ ~ ZXFXFXZXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXz 2 =.2 =.g 2.k c | iXeX> j 9.*X2 =.=.2 =.j 9.k d j 9.;Xd 7 8.x @ v 8X:Xa v 9Xj a g 4.0Xa d 6X{ a < 2 2 2 2.9.2.2 =.2.g l z } / + d c v s d | -Xp @ O k p f | -Xp 4 1.n o =X5XwXs w x ;Xg p { sXz 7 < *X7X- p 2.5.k c ' iXn ,X2X<.>.-.-.-.;.>.4.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXVXBX' ! ! K e.Z.Z.J.Z.H.H.H.H.S.L.H.L.L.H.L.L.L.H.L.L.H.L.L.H.L.L.L.L.S.H.Z.! / ' BXVXAXFXZXAXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXGXDXDX9.>.-.-.-.,.>.,.-.,.,.,.:.>.,.,.,.>.>.>.:.wX1X>X>X2X2X2X,X1XuX2Xv z w a a z z z @ *X;X@ g @ @ a -X-X-X:X0X5.9XtX>X:Xp @ @ + 5 b 8.:X;Xv x 5 *Xz -X*X8.=.O 4.5.k *X<X/   8.=.  { sXl 4 2 @ O 7 d + @ O n 8.g s a -X} - 5X5X4X7XO.X.X.X.X.X.X.X.X.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXCX! ! c M._.].fXnXnXnXnXMXmXnXnXnXxXnXnXxXcXcXxXxXcXcXcXcXxXxXnXdXzXxXdX.X~ S Q ZXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyX,X2X1X1X1X2X>X1X,X:X<X,X;Xl @ g k a g a *Xz O . + -Xk 2 2.v - p x k , | f + f } s s s # -XKX3X6X3X8X3X8X6X3X8XKXO s , @.+.W W +.+.W +...O.! | o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.v aXl z z @ a @ ;X-X2.9Xp 2.qXp d 2.5.s 7 5.-X,XyX:Xl FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXZXnX} S ! ` b.].].(.(.(.!.(.(.^.|._.(.(.^.^._._._.{.^.}.{.|.(.(.(.^.^.(.(.Q./ / _ BXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXZX9.,.,.4.4X5.,.<.d @ @ - a g < 3 < g 4 h @ h p h w h a z h h h a g z h @ k a p a g g h z g h h h g g @ g h a z h p g p h h v *X*X5 h g @ h h g a @ h g g h h z 5 h 7 3 =.7 3 < < 7 h v @ k a h h g h g 7 < 7 < 6 7 7 a v z p p x ;X:X:Xj j -X9.5.DXZXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXVXZXZXZXVXZX~ / ~ b.F.].P.Y.U.U.L.L.L.L.U.P.L.H.L.L.L.L.U.U.Y.U.U.U.T.U.P.U.Y.U.L.Y.L.U.L.L.L.A.H.L.H.L.H.H.H.H.A.A.G.A.A.A.A.A.l.l.l.g.g.g.g.a.a.g.a.i.i.i.i.i.",
+"Z N B B B N N C N N N N N N B N B N B N B N C m A m C B B B C C B Z B B C C C C C C D D C C C Z Z C Z Z Z D Z B Z Z Z Z D Z Z Z G Z Z F Z Z Z C Z Z D B Z B Z Z Z Z Z Z F B Z C Z Z Z Z Z D C Z Z F Z Z Z H Z Z Z J Z H H H H H H H D H L L L L L L P L P P P P P P P P P P I I I ) P P I I I I I I ~ P P P P P P ) P P P I P P I I P P ) P P / U P [ F.^.^.T.^.(./.(.(././././.(.!./././.(./.(.~.^.(.{.^.(.(.`.|.`.^.`.`.`._.|._._._._._._._._.|._._.|._.{.`.(.{._.|.^.(.{.^.).(.(.(.{.(.^._.(.(.(.(.(.(.|.(.`.(.`.`.`.(._._._._._.|._._._._.^.^._./././././.~.~.~.~.T.T.T.T.T.T.T.T.U.T.U.U.U.U.U.Y.T.T.T.T.T.T.P.T.P.T.P.P.P.T.U.P.P.P.P.P.Y.U.Y.P.P.Y.U.L.Y.U.L.L.S.S.S.! ! ^ ZXVXAXZXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXg 2 =.2 2 k j k l A W @.f g qX*X2 =.=.2 2 7 2.k z g 5.*Xw l 8.v 4 z 6X-Xa v j k d g 5.-Xa > | @.p < =.=.=.7 2.=.2 =.=.< v - +.W + d g x a a W / a a v k g - W ! d 5 2 x h k =X=X=X@ z v p p ! W - w 2 =X6Xf p j 9Xk c @.| W ,X,X<XwX:.-.-.-.>.4.DXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX' ~ ~ U T T G.G.H.D.H.S.L.L.L.L.U.P.P.L.S.L.D.L.L.L.P.P.L.H.S.U.H.L.H.S.! ! ' BXDXAXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXDXDX9.>.-.9.wXwXtX,X<.;.-.-.-.<.wXtX2X4.>.-.-.<.,X,X,XtX,X,X,X,X,X2X-Xk x z z *Xv x sXg g x n z @ z :XyXwX9.,.qX1XwX1X1X-Xz :X:X:XwX<.*Xv s + z -Xn v h 7 2.O j k *X;Xn ;XO 7 2.O @.W - @ 8.*XO =.2 < 7 k @ a k k l n ;Xk n / f ! W X.X.X.X.X.X.X.o.FXFXFXFXFXFXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXVX/ ! ! M.m.hXzXJXnXnXnXxXmXcXmXmXcXnXcXcXxXcXxXxXxXnXnXdXcXdXcXcX.XzX.X.X~ ~ S ZXDXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXZXyX,X,XwXtX2X,X,X>X>X>X:X<XyX>Xz z 5 z z h l w v v + w ;X:X- O @ z h @ @ + % - @ > | n k b p v :X;X;X;X;X;X;X;X-X;X;XO s > c n - @.l n - | +.} x | .. . . .X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.-XKX;Xa z + k v ;X-X5.0Xs 5.0Xk @ 2.0Xs 5.9X-XyX,Xb n FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXFXAXBX[ Q Q ` b.].]./.).(.(.^.(.(.(.|.(.(.(.^._._.|.{.(.`._._.^.(.(.(.(.{.^.!.S ! ' BXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.>.-.:.wX4X4.9.v a =.8.4 z 2 =.2 z =.8.z p s 8Xf @ k ;Xx d k j 9.*Xz k 2.*Xd g 9.0Xa l eXz + k iX>Xs g z eXv o @ iX5Xh l n b v d eXv O k ; ;X3X- + iXuXp h :Xn + 4 =.2 2 =.2 =.4 l z 2.9Xk - 2.5.v 5 2 2 2 =.=.2 2 g v k 9Xg z v *X-X9.9.uX>X2XCXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXVXFXDXDXFXZX~ / _ b.n.~.P.Y.P.L.L.L.L.U.U.L.L.S.L.S.L.U.L.Y.Y.Y.U.U.T.U.L.Y.U.U.U.L.L.L.L.L.L.L.L.H.L.H.H.H.A.S.h.H.A.A.A.A.A.h.l.l.z.z.k.k.a.a.a.a.a.a.s.i.u.u.",
+"B B B B N C C N Z N N C N N N B B C B B B B N C B B B B B B N C N N C C C C C C B C C C C Z Z Z Z D C Z Z Z Z D Z Z Z D D G G Z B Z Z D Z Z Z Z Z Z Z Z Z D C D Z Z Z Z Z D Z Z Z F Z Z Z Z D Z Z D Z Z Z Z H Z Z Z Z H H Z H H H H H U L H H H L L L L L P P P J P ) P P ) L / P P ) P J I J I I I I P P I P P I P ! P I P P I I I L ( P I P P I U [ F.^.^.^.^./././././.(.(././.(.!./././.(././.^.(.(.(.(.(.(.(.(.`.(.(.(.^.`.|._.|._._._._.|._.(._._._._.`.^.|.{.`.(.(.|.(.(.(.(.(.(.`.(.(.(.(.(.(.(.(.(.(.(.^.`.(.`._._.(._.}.}._._.|._.|.|.`.(.(.(.(./.~.~.R.!.T.~.~.T.~.T.T.T.T.T.U.T.T.U.T.I.T.U.T.T.U.T.T.T.T.P.T.P.T.P.P.P.P.P.Y.P.P.P.P.P.U.P.U.U.U.U.L.U.U.H.L.L.~ ! ^ ZXVXZXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXl 2 2 2 =.k v k d w w w h p p p 4 6 4 h < p *Xk h @ p p g + + + g h p p @ v *Xk d p s p a @ , + p 5 3 3 < 4 < < < 4 < @ z 5 , p a + p p a a - - 4 g @ @ g @ - - p g + @ g g g s g h @ @ @ @ - - 5 j 4 p h @ z h g h g % w w ;X,X1XwX:.-.-.-.>.<.GXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXBX[ / ! ) T Z.Z.G.J.H.H.H.S.L.L.U.L.P.S.L.P.U.Y.L.L.L.A.L.D.H.L.L.S.S.L.Z.! ! ' MXZXFXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFX9.>.<.<X2X1X,X0X<.-.-.-.-.<.4X<X0X<.>.-.-.;.wX1X2X1X1X,X,X1X1XtX,Xv g n n g g l x a @ z x z h p -X5.>.;.,.,XwX>.5.0X0X-X-X:X-Xk ;Xb | :Xp @ + + a z @ h @ z v b v z a z 4 h @ - - a @ 8.sXO =X*X3 3 h + v a v g z 5 g > , 6Xz @. .X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXVXFXFX/ S ! m.].'.xXzXnXnXnXnXnXmXcXcXmXcXcXcXxXxXdXxXxXdXxXxXxXdXdXdXzX.X.X'.~ ~ Q ZXHXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXyX4X4.,.4.1X,X2XtX>X>X:X2X<Xv v z -X-X@ p p *Xv g z x ;Xb -X;Xd + w @ k @ v ;Xv - , , h @ p + + a @ a z @ + O 4 + @ +   , x :Xd @.x :X- 6X;Xa @ v ;X3XKX6XX.o.X.X.X.X.X.X.X.X.X.X.X.X.X. .f O p @ l sXg k b v a p + a g - z g d + d p a :Xb l :XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXAXFXCX' Q Q ` n.Q.(.(.(.(.(.(.(.(.(.(.(.(.(.`.[.(.(.`.(.(.`.|.(.(.(.(.(.{.(.Q.! ! ) BXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGX9.>.;.-.:.wX,X:Xv a 2 4 k d 2 2 2 h 2 =.k d s :X{ - k ;X@ d g g qXj z -Xj j d h 5.*Xd h :Xz + k iX:Xp v a :Xl + g iX5Xh h :Xn + @ 3Xb O v a tXyXp a iXtXg w ;X;X@ 7 2 =.2 2 2 2 2 z g g 0Xg h 2.9Xk 7 2 =.2 2 2 2 2 a v k j p d v :Xv :X1XwX0X0XDXDXZXFXFXFXFXFXFXFXFXFXFXFXFXDXFXAXDXVXAXDXFXSXZX~ ~ ~ b.F.].^.T.L.U.L.L.L.L.L.U.L.L.L.L.L.L.L.L.T.P.U.U.U.U.U.P.U.U.U.U.U.L.L.S.L.L.L.H.H.H.H.S.S.S.H.A.A.A.A.A.h.A.f.l.k.j.j.a.a.a.a.a.i.i.u.i.u.u.",
+"B B C B N C C N N N C m C C N N B B B B C N N N A N B B Z N C C B C B C C C C C C Z C F C Z B C Z D Z Z Z Z Z D D D Z Z Z Z H D Z Z Z D Z Z G C Z Z Z C Z Z Z Z B D C Z Z Z Z Z Z Z Z G Z Z Z Z Z Z Z H Z H L H S H H Z H H H H H H H H L L L D L P L J H P P J P P I P P P P P P ) P P P I ! J I I ) P I ) P P P P ) P P P P P ) L ) I P P P P P P [ F.(./.(.(./.(././././././.(././././.!.!.(.(./.(.(./.(.(.(.`.`.|.^.`._.`._._._.|.{._._._._._._._._._.^._._.^.`.(.(.(.^.(.{./.(.[.(.^.(.(.^._.(.(.(.(.(.(.(.(.`.(._.(._._._.}.}.}.|._.`.[.{.(.(.(.(.(./.~.~.~.T.~.T.T.~.T.T.T.T.T.T.T.U.T.U.I.T.I.U.T.Y.T.T.T.T.T.P.P.T.T.P.P.P.P.P.P.P.Y.T.P.T.U.U.P.U.U.U.T.S.S.L.S.S.! S Q ZXCXZXZXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXl 2 =.2 3 s p O g p O + O + g p p + + + z @ k h @ p k p h p k p p s p @ d 4 4 p @ @ d p p - 4 p + p p s p + 4 p p z a z h + < 9 + @ 4 h p z f eXc a z 4 + k s z h 5 5 4 4 h @ g h h k d a + p + @ g 7 p p z h + + @ g d a a l 2X1X<.-.-.-.-.-.-.DXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXBX} ! ^ P e.e.Z.S.U.U.H.L.L.D.L.U.P.L.P.L.P.L.L.L.S.L.D.L.A.H.H.U.H.U.H.F.! / ' BXDXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFX9.>.9.4X4X<X<.,.-.-.-.-.-.:.0X<.>.-.-.-.-.>.:.0X0X0XwX1X<X0XwX4X2Xv p x n p @ z + a z w a @ h z 2.>.-.-.-.5.5.>.>.,.>.5.-Xk k j -Xv W / a z x n - a a z @ a g p + a 5 + z % + p w h h + w s 5XiXs :XQ - v z 3 g 5 b w > f n x @. .X.X.X.X.X.X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXVXFXVX! S / c.].].xXJXnXnXnXnXnXnXnXcXcXcXnXcXcXxXxXxXxXxXzXzXzXdXxX.XzX.X.X X/ ~ ~ ZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXyX3XwX0XwX2X,XtX>X>X>X*X2X>Xk :Xx ;XtXj 4.*X:X>X-X-X-X-X>XuX5XO # a   *Xs *X;Xz g 7 7 < g 4.0X# p k d v 5.*X< 8.s k ;Xv W n c > @.( n > -X-Xz wXl l 8X6X8X+. .X.X.X.X.X.X.X.X.X.X.X.X.X.O.-X=XeXp z 6X@ a w g *Xk w a a a g O @ a z ;Xb w @ <XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXFXHX' / Q ` b.].].!.(.(.(.(.[.{.(.(.(.(.{.(.(.^.|.^.(.|.(.^.(.(.(.(.(.(.(.].! / [ BXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX9.,.:.,.,.<.yX1Xv p + 5 w g 7 7 7 g 5 & a a a a z g h z @ a h a a v g v a v k h a d g a z @ g p a a @ g h a @ h h a d h h z @ - g d w @ g h h w h g z h h z @ h 5 g 7 3 7 7 7 7 4 a k v z v g g g a g 7 7 7 7 7 7 7 h g b v v 5 -XKX-X>X4X4.;.>.GXDXZXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXVXVXFXFXFXZX~ _ I c.n.~.T.!.U.D.L.L.L.L.L.L.Y.L.S.P.L.L.L.P.T.T.U.Y.U.Y.U.L.U.U.U.U.L.L.L.L.L.L.L.L.L.H.H.G.A.S.A.A.A.A.A.A.h.h.k.h.f.f.f.g.a.s.s.i.i.i.i.u.u.u.",
+"Z N N C N m C C C N C C N N N C B B B B N N N C B B C B N C C N C B C B C C C C C C C C Z C F Z Z B Z Z D F D B Z Z Z H Z Z Z D Z Z G C Z Z Z Z Z C Z Z C D B Z Z Z Z Z Z Z Z Z Z Z D Z Z D D Z Z H Z D Z Z S Z H H Z J Z Z Z H H H Z H H H H L L L H L H J P P P I P I P J P P P P P P I I I ) ) I P P P J P P P P P P P P P I J ) P L I P P I ) P U [ !.(.(.(./.(.(.(.(.(.(.(./././.(././.(.^.[.(.(./.(.^.^.`.(.`.(._.`._._._._.|._.|._._._._._._.(._._._._._.^.^.(.(.(.^.^.^.(.^.~.(./.[.(.`.(.(.(.(.`.(.(.^.{.(.(._.(._.(._._._.^._.^.(.^._.(.(.^.(./././.~.R.~.T.~.~.T.T.T.T.T.T.T.U.T.U.U.I.I.U.T.Y.T.T.U.T.T.T.T.P.Y.P.T.P.P.Y.T.T.T.P.T.T.T.U.Y.Y.L.L.L.L.L.G.D.S.S.! ! ^ ZXZXZXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXg 2 2 2 g 5.s g 9.-Xg b x # p k p z l x @ 7 n l 5 g 2.j z g 9.*XO s :X/ @ 7 8.s w , / =X- 7 qXs p f } k p h lXeXO z sXsXz @ kXsX+ z kXsX+ c sXiX! + 8.=.+ v 2.9Xd 4 c 8.5 @ O k g @ 2.0Xk @ d n d 4 7 k 0Xg z w n z 5 ;X8Xv x 2X1X<.-.-.-.-.-.-.FXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXCX' ^ ^ K e.Z.Z.F.S.H.L.L.L.U.P.L.P.L.P.L.S.L.L.L.L.L.L.L.L.S.L.L.H.L.L.F.S / ' fXZXZXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZX9.>.1.0X0X<.>.-.-.-.-.-.-.-.-.-.-.-.-.:.wX4.>.>.>.>.;.qX4.>.,.0X4Xv z 5 a a z b z d z z h z z k b >.-.-.;.-.>.-.-.-.>.,.b k k j k g - - d a l 7 a s -X} - a 4.9Xp 2.=.O <X/   v ;Xg z =.b s =X=Xs n :Xk g =.=.5 x n 7 f / n x @. .o.X.X.X.X.X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXZXVXS / ~ M.m.hXxXdXnXnXnXvXmXnXmXcXmXcXcXcXxXcXxXxXdXdXzXxXdXxXdXdX.X.X.X@X~ ~ ~ GXFXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyX,X2X2X1X4.<.1X,X5XeX,X5Xk :X;Xg -Xj 5.;Xk -X5X*Xg *Xk k -Xk # O v x k v c a @ 3 < < 4 5.*Xp k k d g 5.;X4 kXx *X2Xb , > , @.@., , > 6Xl d :Xv @.o. ... .X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.-XKXKXx @ O l @ z x v k n v # 2.0Xs 2.9X-X>X:X@ *XyXuXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXFXVXHX' ! Q [ b.Q.K./.).(.(.(.(.^./.~.(.[.(.^.`.(.(.(._./.(.(.(.(.(././.(.^.Q.! ! ' BXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZX4.1.7 j g 7 v j z d @ h s g z p a h + + @ g v p a g h 5 @ h a 5 5 + 4 + g a g 5 5 @ g h g a h a d z @ h h v n a p p d g h h k *X5 g p @ h @ z k *Xg z n h 5 z k *Xg a g d d a z a g @ < 4 O h + + a h 3 h + l p p a a g h g @ z O s + k -Xg :.>.DXCXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXAXZXZXAXZX! ~ ~ b.F.Q.Y.T.U.L.L.L.L.Y.U.L.L.L.L.L.P.L.P.P.P.P.U.Y.Y.L.P.Y.U.L.P.U.L.L.L.L.L.U.H.H.H.S.H.G.A.A.A.A.g.g.f.h.h.f.h.j.f.f.s.a.a.a.i.i.i.i.u.u.u.p.",
+"N C C N Z N C N N C N m Z N m Z B B B C B B B B B B C B B C B C B C C B C C B C D C C C B Z C C D B Z Z C C D D Z Z Z Z Z Z D H Z Z Z Z L Z Z Z Z C D B Z B D Z C Z Z D Z Z Z Z Z D Z H Z Z Z Z Z Z D D Z Z Z Z Z L Z H H H H H H D H H H H D L H P H J J L P J P P P I P P P J P P S / L I I I P P ) J ) P P P P P P P P P J J L ( P P ! I I P I P I [ ].^.{.(.(./.(.(.(./.(.(.(.!.!./.(././.).^.(./.^.!.(.(.(.(.`.`.`._.|._._.|._.|._._.|.`.(.`.(.`._._._.(.(.`.(.(.(.(./././.(.[.(.~.~.(.(.(.(.(.(.(.!.`.^.(.`.^.(.(.(.(.^.`._.`.^.(.`.(.(.(.(.(.(.^.(././.~.~.T.T.~.T.T.T.T.T.T.U.T.U.T.U.I.U.T.T.U.T.T.Y.T.P.T.T.P.P.T.T.P.Y.P.P.T.P.T.T.T.T.U.T.U.P.L.S.U.L.L.G.L.D.S.~ ~ ^ AXAXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXb 4 4 j *Xj k s 2.s O x + O k g + z x 4 a l 8.x a -Xj s z z 2.:X@ s >X} d 7 sXj 4 s s z a 7 kXx 4 - | / p g sXq.4 d l x w z 6X8.< z 6X8.< ! @.| @.< 7 2.4 p j 2.s 4 g k 4 a k k g z j j p p 7 x d 7 7 k j s h l x + - -X8Xk l ,X2XtX<.;.-.-.-.>.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXCX' ^ ! J e.e.Z.H.S.G.L.L.U.L.L.L.L.L.L.L.L.L.L.P.S.Z.U.S.U.L.L.L.H.P.L.Z.! / ' fXDXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZX9.;.;.>.>.-.-.-.-.-.-.-.;.>.-.-.-.-.-.9.4X5.>.-.-.-.-.>.-.-.-.;.0X-Xa h z z d k -X:X;Xj :X;X-X:X4.;.,.>.>.-.-.>.-.-.-.,.;Xk v k k z a p a @ O O + p =X6X- a 2.0XO 7 2.4 n :X+ l z a l 4 k 4 7 3 s + O k g 7 l 4 q.8.4 - , > > } w i X. . .X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXVXS ! S M.'.hXzXJXzXnXcXMXcXcXnXnXnXcXcXcXxXnXzXzXzXzXxXdXdXzXzX.X.X.X.X|.! ! Q ZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX2X1.1.wX,X1X9.<.>X>X:XsXeX>Xk :XuX-Xl @ d g x x g b n k s b b k k a z eXx h n z p g 9.:XO p p + @ + d v p g O z 4 g :Xv a 4.:Xa g :Xe k v z % a g f | 7X7X6XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.n -X-Xz a KXv z z ;XeX+ n x p 5.9Xs 2.qX-X:Xg *XyXsXsXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXFXFXFXFXFXDXBX' Q ! ` n.!.^./.(.(././.(.^./.(.(.(.(.{.(.(.(.^.`.`.(.(.(.^.{.(./.(.(.]./ ! ' BXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZX>X:Xq.v s , } w - p ^ } s d b 4.;Xz z z x z v j j z 2 8.4 - k 3 5.l 5 v ;Xx d 6 q.x h g 9.;Xa p :X:Xp l g lXz z s <XeXh l sX@ k z eXb O v z sXz k h sXx z z sXh v a 4.0Xk - n sXd k z q.-Xg z h n z 5 q.=Xp z 2.5.-Xp a wXuXk @ wXiXk z 2Xv <.>.FXZXDXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXAXVXFXZXAXVXZX~ / ! b.n.].T.Y.U.U.L.L.P.Y.U.P.P.L.L.L.L.L.P.Y.P.Y.U.L.U.Y.U.P.U.U.P.L.L.L.L.H.L.S.L.H.H.H.S.A.H.h.A.A.A.h.h.h.z.h.a.z.a.f.a.a.a.a.i.i.i.u.u.u.p.u.",
+"C C N C N C N C Z N C Z N N A N B B B B C B B B C B B B C B C B C B C C C C C C C B C D D C Z Z Z Z Z Z D D D C Z Z Z Z Z Z G Z G D Z G Z Z L Z Z Z Z Z Z Z D Z Z Z Z B Z Z Z Z Z D B G Z Z Z Z Z Z D Z Z Z Z L Z J Z H H Z D H D H H D H H L D H H L J H P P P ! P P I ) P J J P J P P I I P I P I P P J P J P P P P P I P P I P I P ) I P I I I U I [ ].|.(.(.(._.(.(.(.(.(.(./.(././.!././././.(.^.(.(.(.(._.^.`.`.(.|.(.|._._.|._.|.|.^._.(.^.`.^.(.(._.(.|.(.^.(./.^././.(.~.(.~.(.(././.(.(.(./.(.(.(.(.(.^.`.(.(.`.(.(.^.^.`.(.(.^.^.(.^.(.(.(.(././.~.~.T.~.~.T.~.Y.T.~.~.T.T.T.T.U.T.T.U.U.U.T.U.P.T.T.[.T.T.T.T.T.P.P.P.P.Y.P.T.T.T.U.T.T.U.U.L.L.P.S.L.S.G.G.G.D.~ ! ^ DXAXFXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXv s p k -Xj j 7 j 7 3 2 < < k + k @ 4 + z @ 9 @ z c -Xv g v d h p @ p z g 4 4 5 g p + a g 4 @ 4 g a - - @ @ O @ h a @ 5 g a + . h a + O 5 @ w & z p 4 p @ v k g v h 4 p 5 g z @ 5 k v v v @ 4 + 4 g j b v v 5 + 3 4 l a a - v 2X2X2XwX:.>.4.wXwXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXCXHX_ S Q ) T Z.Z.U.S.L.L.L.L.P.P.U.U.L.L.L.P.L.L.L.L.L.D.L.L.L.S.L.H.L.P.Z.! / ' BXDXDXZXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZX9.>.>.-.-.-.-.-.-.>.<.wXwX4.-.-.-.-.:.:X4X<.>.-.-.-.-.-.-.>.-.;.:.>X:X-X;X-X;X:XyX4X0X1.tX4XuX5.,.0XwXwXtX5.,.0XqX>.-.0X:X+ + 4 p a 6X6X- w 6X6Xa p + s p z a z @ @ z + z z a + @ + v j 5.p x j *XQ + g j @ l O # 4 O + 8.8.g j =.=. .X. .X.X.X.FXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXVXDXFX/ ! Q m.M.].JXxXnXnXcXxXnXnXnXcXnXcXnXcXvXdXcXzXzXzX.XzXdXdX.X.X.X.X.X|.Q ! Q ZXFXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX4.:.0X<.4.1XwXwX>X5XwXsX;X:X*X:X>X:Xb k v z n n + v n a g n n z :Xv @ z a + + @ z g 5.;Xs p 7 h 5 p w b n n 7 7 7 g :X:Xa 5.0Xa - yXb 5 d @ k b > @.y f :X6Xo.o.X.X.X.X.X.X.X.X.X.X.X.X. . .tX4X;X@ KXeXz @ h z + - a + a g + g k d b z *XeXKXgXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXAXSXFXFXFXDXCX| S ! ` b.F.!././.(.(.(.(./.^.(.(.(.(.(.(.(.(.(.(.^.(.^.(.(.(.[.^././.F.! ! ) BXDXSXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAX>X>X8.sX3 , 2.e z k > | x a g 5.*Xa 5 x 5 a -Xj k d < =.v d k 3 =.v a d ;Xa a 3 =.j a g 5.0Xp p KXeXp z g yX;Xd d yXKXl l n a @ a :Xl O k l n h @ a yXeXp z n h + a 2.0Xk - ! W - k w 8.eX5 h 7 x + @ 8.sX< @ j qXk k 5 >XiXv - *XiXs -XKX-X<.<.FXFXAXFXFXFXFXFXFXFXDXFXFXFXFXAXAXDXAXAXFXDXAXVXZX~ / ! b.n.[.~.T.U.L.L.P.P.P.Y.L.L.L.L.L.P.P.P.P.Y.U.U.U.Y.L.L.U.P.P.L.P.L.L.L.L.L.H.L.H.H.H.H.A.h.g.l.h.g.h.z.a.h.a.f.f.g.a.a.a.i.a.i.i.u.i.u.u.u.p.",
+"C N C N C N C C C C C N C N N C C B B B B B C B B B V C B C B C C C B C Z C Z C C C C Z Z A Z Z Z Z Z Z B G Z Z D Z Z G H Z Z Z Z H Z Z Z Z Z Z Z Z Z Z Z Z B Z D Z Z C Z Z Z Z Z Z C Z Z Z H Z D Z D D Z H H Z H Z H H S H Z H D G H H D H L L H H H L J J L P P P J ) P P J J P P P P P P P P I I P ) / I P P P P P P P P P P P P P P I P I P P I I U Q.(.(.(.(.(._.(.(.(.(.(.(.(.(.(././././.(./.(.(.(.(.(.(.(.|.`.{.^.|.(.{._.}._._.`.`._._.(.(._.(.(.(.(.(.(.(.(.(.(./././././.~.~.~.(./.(./.(./.(.(.(./.(.(.[.^.`.(.`.(.`.(.(.(.(./.(.(.(.^.!.(./.~./.(.~.~.~.~.T.~.T.T.~.T.T.T.T.T.T.I.U.P.P.P.T.T.T.T.T.T.P.T.T.T.T.P.T.Y.Y.P.Y.P.T.T.U.Y.Y.P.P.U.L.S.L.S.H.H.H.S.S./ ~ ^ ZXAXAXZXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXk 5.k p j =.2 =.=.2 2 =.=.2 g a k g 4 < g d p < < 2 7 1 g @ a @ @ a z s a a l d g a d d a a d + a @ 5 4 @ a d a 5 4 4 4 h -X{ | | | | } | } } | } | | } | | | { b @ g z a a a a a a g p p @ a z d g 4 - p p ;Xb d p a a p k :XwX:X4XwX:.9.,X1X2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXCXDXBX} S ^ I e.Z.Z.L.G.L.L.L.L.P.P.L.P.L.L.L.P.L.L.L.L.L.U.S.L.L.L.L.L.P.L.F.! / [ fXDXZXAXDXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.>.-.-.-.-.-.-.<.wX2X4X4X1X9.>.-.-.<.4X5.-.-.-.-.-.-.:.wXtX4.>.;.0X4X1XyX1XyX>X2X,X<XtXtX1XwX,.,.tX2XwXwX5.>.2XwX,.qX4X;X& W n @ - / W d - ! W - - | -XO h - + z h O 4 @ 5 c eXn ;Xv k 9Xk l 7 ;X-Xv g 4 x 8.+ x { 7 p x 8.3 2 =.2  .o.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZX! S Q c.'.dXJXxXnXnXnXJXcXmXnXcXcXcXcXcXdXcXdXdXxX.XzXzX.X.X.X.X.X.X.X|.! ~ S ZXAXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFX9.1.4XwXwX,X1X2XwX>X:Xx z >X*X*X:X:X5X>X>Xv @ @ a @ a a @ @ + + -Xp O + v :X;Xx l 5 g a ;Xb 2 w } =Xy eXiX@.3 =.2 7 ;Xb a h p z v z @ @ z sXk k > z n - | +.o.o.X.X.X.X.o.X.X.X.X.X.X.X.O.+.-X-Xv z s z @ z - a @ + h z z z z @ h b l -X5X0X;XsXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXAXAXFXFXZXZXHX' ! ! ` n.F.!./.)./././.(.(.[.(.(.(.[.(.(.(.(.(.(.(.(.(.(.(.(.(./.(./.].S ~ ' BXDXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXSXAXyXyXk g 4 @ @ < g g - - - g v z a g + 4 + g v v v g 5 @ @ g h - + 5 g a h @ h 5 @ z g h p a g h w @ @ g h a z z g a a h h - a h 4 a a @ g g @ a h g a d a g + @ h h a d g g - - @ a g 5 w 4 g 5 + h g 4 w 4 g h d p h g 5 a h h @ s d - z j -.4.FXAXGXFXFXFXFXFXZXFXDXFXFXFXFXDXAXDXAXVXAXFXAXVXFX~ ~ ) b.n.Y.~.Y.U.K.P.L.P.P.P.P.P.L.L.U.L.L.Y.U.Y.U.U.U.L.U.L.U.L.L.L.L.L.L.S.L.H.L.H.H.H.H.A.A.A.Z.h.h.z.f.g.j.g.a.a.f.a.a.a.a.i.u.u.u.i.u.u.u.u.t.",
+"C C N C N C C N N N Z C C C C C B B B B C B B B B B B N C N C B C B C C A C C C C D C C C Z C D B Z Z Z D Z Z Z D Z Z Z Z Z D Z L Z Z Z L H Z Z Z Z Z C D B D Z B Z Z Z C G Z Z Z Z D Z Z Z Z D Z Z H Z Z H Z Z Z H H Z Z H H H D H H H H H L D H L H J L L P P L P P P I P P P P P P P P P P I I I P J P P P ) J P P P P P P P P P P P P I P I P I I _ F.(.^.|._.(.(.(._.(.(.^.(.(.(././././././.(.(.~.(.(.(._.`.`.^.|.(.`.|.|.}._._.|._._._.(.^.{.(.(._.(.(.(.(.(./.(././.^.~.~.~./.(././././././.^.(.!./.(.(.(.(.(.(.(.^.^.{.{.|.(.(.(.(.(.(.^.~.(./././.!.~.~.T.T.~.T.~.T.T.T.T.T.U.U.T.T.I.T.P.T.T.T.T.~.T.[.T.T.T.P.T.T.P.P.T.T.Y.T.P.U.T.U.Y.Y.L.L.L.L.L.H.S.G.H.H.S.~ ~ ^ ZXFXFXZXAXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXk j k g < 7 < < 3 6 3 < < 4 g k 9Xk 2 =.k 2.k j 2.j =.2 4 c 6Xn p f } s a z 8X:X@ z 8X:Xa k <X> 5 , | n p d } / + a lXsXO } 7XsXsX{ M.M.M.{ M.M.M.{ M.M.M.M.6X7X{ z -X:X+ p -X} - z j 9Xs p O g s 7 2 | -Xs 9.2.2.0Xk j 5.k wX:.4.wX:.<.1X1X2X1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXZX' ! S K b.j.Z.S.L.L.L.L.L.P.L.P.L.L.P.P.P.L.L.Y.S.L.S.L.L.L.L.L.L.P.U.F.! ! _ BXDXZXZXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.-.-.-.-.-.-.>.9.4X,X0X0XwX<.-.-.>.:.0X<.-.-.>.>.-.:.wX4X4X5.>.-.;.qXwX1X1X2X1X1X2X1X1X1X1X4.>.-.<XwX,.>.-.-.5.5.>.>XyX;X, @ q.+ p , O @ 4     + d W / + 9.x O 2.=.O <.n - { iX} :Xg s s + l - z v s -X:X8.8.4 x 8.4 d + O # 3 2 c X.o.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXZXZXS / / c.].aXJXzXnXnXnXxXcXcXcXcXcXcXcXcXnXcXdXzXzXzXzX.XdX.XzX.X.X.X.X.X~ ~ ! ZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.<.4X2X1X,X>X2X>X5X5X*X*X5Xk *X:X*X:X*X:Xg h z z z z z a @ k *Xp g s # s *Xv z k k z h z l < % | n @._ | f 3 j j 4 w g @ + + z b b v v x n @ h @.x sX- } o.o.o.X.X.X.X.X.X.X.X.X.X.X.X.o.W x l + l w - a z n x # # n l + z n l p ;Xb 5X>X>X*X;XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXSXFXZXDXBX' ! ! ` b.].!./.^./.(././.(.(.[.(.(.(.(.(.].(._.(.(.(.(.(.(.(./.(./.(.].! ! ' BXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXyX1XyX;X:X8.j b j 5 a g 5 k g d h g g a g g @ h h h g v p h a a h @ h h d @ h z d O a w z + h k =X=Xk g h z a a @ 7 5 @ k a v h v a z @ g h a p h h p a a h a p h h p g @ v p p @ 5 k a g a g g z d k -X=Xk h c n c a h s a h g :X;X-X-X:X9.9.6XVXFXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXVXVXGXFXVXFX~ ~ / b.n.].~.T.U.U.P.P.P.Y.P.P.P.L.U.P.P.P.P.T.P.U.U.L.U.L.L.L.L.L.L.L.L.L.L.L.K.L.H.H.H.h.S.A.j.A.l.l.h.g.f.j.a.g.a.a.a.a.a.i.i.a.i.u.u.u.u.u.u.r.",
+"N A N A C C A C C C A N Z m A A C C B N N M C M A B B C C B C C C C C C C Z C B A C C Z Z Z C B D Z Z Z Z Z G D D Z Z Z D Z G D Z H Z Z G Z Z Z Z Z G B Z Z Z Z Z Z Z D Z Z Z Z Z Z Z Z D D Z Z D Z D Z D D Z H H Z Z Z H Z C J S Z H Z Z H F H H H L L L H P K P S P J P P P P P J J P P P I I P ) P P P P ) P J J P P P P J P P P I P P I P P ) J I ) b.]._.|._._.^.^._._.`.^.(.(.(.)./.(./././.(.(.(.`.(.`.(.(.(.|.{._.|._._.}.}.|.}._._.|.|.^.(.(.(.(.(.(.^.[./.(.E.~.^.~.~.~.~./.[././././.(./.(././.(.(.(.^.^.(.^.(.(.(._.^.(.(.(./.(./.(./.(././././././././.T./.T.~.T.T.~.T.T.T.T.U.T.I.T.U.T.T.T.T.T.P.T.T.T.T.T.T.T.T.T.T.P.T.U.T.U.U.U.U.P.P.U.L.S.S.G.H.H.G.S.S.~ ~ S ZXVXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXeX:X:Xp + + p p z @ g z @ p s *Xj j 2 =.k j k 6XO.o.;X2 7 > } @.s > W x @ g 8X:Xp g 8X:Xa l ;X;Xh , g q.O d X.W + z sX8.3 | M.-.>.,.,.,.,.,.,.,.,.,.,.,.,.,.,.M.| a k -Xg p =XsX- v k j s p v k g - < @.| v tX:Xj 2.s j 7 *X<.-.>.>.>.<.wXwXwX0XGXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXBX[ ~ ^ I b.b.Z.U.L.L.L.L.L.Y.L.P.L.L.L.L.Y.P.L.L.L.L.P.L.L.P.L.P.P.P.L.F.! / ' BXZXFXZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGX9.>.-.-.-.-.-.-.:.0X<.,.;.>.-.-.-.-.-.-.-.-.:.wXtX4.,.wX1X4X5.>.-.-.>.;.qXwX0X0X0XwX0X0XwX4.-.;.-.5.5.-.-.-.-.>.,.qX1X,X;X+ O p O g } -Xs 4 q.=Xp z - n O =.b O 7 j < =.x l W | W :Xz j 9Xd z 7 7 v k -Xs # O O # O - @ z -X} , n O.X.X.X.X.X.X.DXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFXS / / M.Q.].cXcXcXcXcXcXcXcXnXcXcXxXxXxXzXzXxXzXzXdXdX'.zX.X.X.X.X|..X|./ ~ Q DXDXDXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXwXtX2XyXwX2X1X<X,X,XyX:X2X2X:Xb v -Xz a p z h v p g + a p l b k v b v *XiX*Xv n k s p k - b v - > - o $   % =XiX=Xk aXsX$ f p h b ;X:X;Xz k k g / x b - W X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O./ b v a d n x + h 6X;XO + b l @ + ;X:X& x -XyX>X*XuXyXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXBX} ! S _ b.F.~.~.(././././.(.(.(.(.(.^.(.(.(.(.(.(.!.(.`./.(.(././.{./.].Q / _ BXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX:X1X4X4.,.,.9.v p f 8Xx z v *Xj a k 5.*Xz g 9.*Xp h 9Xk g g f  .f + c } ! + w ` w @ w M.w + =XiX:Xs z a 6X<Xg w lXsXO v 4.2.d v 2.0Xk g d 4.9Xp a 4.0Xz p 4.qXz a 2.9Xp z 2.0Xk k d 2.qXk d 2.5.v s =XiXs c ' iXn z @ =XKXv z uXuX>XeX>X5X:Xo.GXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXVXFXAXVXFX~ ~ ' b.Q.Y.~.T.Y.L.P.Y.Y.U.L.T.U.L.L.L.Y.U.Y.U.U.U.T.U.L.Y.L.L.L.D.L.S.L.L.L.H.U.L.S.S.S.D.A.D.g.A.k.l.g.g.f.f.a.a.a.a.i.a.s.i.u.u.s.u.u.s.t.u.t.u.",
+"C C C C A N N C C C C C C Z N N B B C B V B B C B B B B B C C B C B C C C C A Z C Z C A C Z Z Z Z Z C G Z Z B Z D D D D Z D Z Z Z Z G Z H Z Z L Z Z Z Z Z C F C Z Z D D Z Z Z Z Z C G G D D Z Z Z D D D Z D H Z Z H Z L L J Z L H D L Z H H H H H H L L P J H P P P P P P P L P H P J P P I I L P J P P P P P P P P L L P J L L U P P P P L P P ) J U ) [ ~.{.{.|.(._.|._.(.`.^.(.(.(.(.^./.(././.(.(.(.(.{.^.`.`.(.^.`.^._.|._.}.}.}._.|.{.^.(./.(.(.(.(.(.(.(.^.[.{.~.T.^.~.~.~./.~.~./.[./././././.(.(.(.^.).(.(.(.`.(.(._.(.(.(.(.(.(.(.(.(./././././.~.~././.T./.T.~.T.~.T.T.T.T.T.U.T.Y.Y.T.T.T.T.T.P.T.^.T.T.T.T.T.T.T.P.T.P.T.P.T.U.U.T.T.U.P.L.H.L.S.U.H.H.H.S.S.S./ ~ ! ZXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX7X..7Xg v d b gXn l IXb > } =X< 7 :Xx n -X-X;X}  . .7Xj l - , - @ @ , @ g p - a g h - d h z z ; h h a 7 @ - - - @ a + O h | M.-.4.2.=.2.2.=.=.2.2.=.2.=.2.2.;.M.} g a p z z s z h k v v v a a @ h j 4 & $ a :X:X*X:X-X-X>X;X:.-.-.-.-.>.;.>.>.>.ZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXMX} ~ ^ Y T h.S.L.H.L.L.L.U.U.L.U.U.U.U.L.L.L.P.L.L.L.L.P.P.P.P.P.P.P.G.H.! / ' MXZXAXZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVX9.-.-.-.>.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.:.0XwX4.>.;.0XwX4.-.-.-.-.-.>.>.>.-.,.,.,.>.>.-.-.-.-.-.-.-.-.-.-.-.;.wX1X2X;Xa 4.9Xs - | / d l M.8.4 z 7 z o + h h + 5 + + @ - w * x b v k j s 7 =.j k 5 :X/   *X}   x 8.4 d n ;Xd c n 7XX.X.X.O.X.DXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXDXFX~ / S M.].hXxXcXnXcXmXcXcXnXcXcXcXxXcXdXxXzXzXzXzX.XdXdX.X.X.X'..X.X|.{.! ~ S HXCXZXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3X1X4.,.<.,X2X,X,XtX:X,X>X9.9.4X1Xx w n c v :Xb n + d a a eXn p eXx s iX-Xx n + O k k w -Xp - d h f } =Xa =X=X=Xv sXx O v f - -X-X>X;X;X-X:Xv W W W W +.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.| > v k - :X;X@ h -Xg a b k k v z -Xv + b uXyX>X9X<X,XFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXFXFXHX' ! S _ n.F.^././././.^./.(./.(.(.(.(.(.(.(.(.(.(.`.(.(.(.(./.(.(./.[.K./ / / BXHXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX9.:.tX4X9.>.-.<.v a > | @.z k j g z g 5.k - j 9Xb z g 2.k z k * +.@.p > +.@.a < 9.i - < <.u 5 =X=X=Xs z - 8X:X5 l 6Xx 4 h 5.*Xp d 5.0Xs g a 5.0Xd h 2.0Xp a 2.0Xa h 2.0Xv h j 9Xk a v j j p v j 9Xp k =X=X=Xc W | @.k h ;XKXn g :X>X:XeXeX5X+...FXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXAXAXVXZXAXAXFX~ ~ ~ [ n.].~.T.U.U.P.U.P.Y.U.U.P.P.P.P.U.Y.U.U.U.Y.U.L.L.L.L.L.K.U.L.H.H.L.L.H.S.H.H.S.S.A.A.A.h.g.z.k.g.a.f.f.f.a.a.i.i.i.i.u.i.u.t.u.t.u.u.u.t.t.",
+"N A A N A C C C C C N C B B B N Z N N C N B B B N A C B C B C C B C C C C C C C Z C Z C C C Z C Z Z C Z D D Z Z Z Z Z G D Z D D G Z Z Z Z H G Z Z Z Z Z D C D Z Z Z Z Z Z Z G D Z Z F Z Z Z Z Z C G Z Z Z D Z D S L Z Z Z Z J J H H H D H H H H H H H H H J Y H J L P P P L P P P P P J P P P P P P P P P P P P K P P P P K P P J L P P P P P P P P P I ` ].`.^.^._._.[.|._.{._.'.^.(.(./.(./.^./.(.(.^.(.(.{.`.(.|.(.|.(.|.`.{._.|._._.(.(.(.(.(./.(.(.(./.^.~.~.(.~.~.(.!.~.~.~.~.~.~./.~.~././././.^.(./.(.^.(.(.(.).(.(.(.^.(.(.(.(.(.(.(./././.(.!././././.~.~.~.T.T.~.T.~.~.T.T.U.T.T.T.U.T.~.T.T.T.[.P.[.T.P.!.U.T.P.P.T.T.U.T.T.T.T.Y.P.P.P.P.L.Y.U.Y.H.H.Z.H.H.L.H.~ ~ Q ZXZXZXZXVXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X.} g x + n aX+ z sX+ , | a g x } O.o.X.o.O. .X. .+.x @ g + b v - n { l w g 4 a h g @ p s =X*Xa a d + @ p g a h @ d z h } M.;.2.2 2 =.2 2 2 2 2 2 2 2 2 =.,.8.| h z + @ d - p p a 4 @ + p - a p g 4 4 l l g -X*X=XyXuXwX:.-.>.-.-.-.>.>.>.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX[ ~ ^ K e.Z.Z.K.H.L.L.Y.U.L.Y.L.Y.L.U.L.U.P.L.P.L.P.L.P.P.P.P.P.P.P.P.Z.! / _ BXZXAXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAX4.>.<.wXwX<.-.-.-.-.;.>.-.-.-.-.-.-.-.-.-.-.-.>.>.,.;.-.>.,.>.-.-.-.-.-.-.-.-.-.wX5.>.-.-.-.-.-.-.-.-.-.-.-.>.;.0X1X3X1X;Xa 2.k s p - + p 4 g k k + + 4 + 4 5 p d p + d s p h d @ z v v v v h 4 k j 2 n ;Xp :X;Xa x q.7 d v h + 8.gXv +.o.O.O.X.DXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXVX! S / M.m.hXxXxXnXcXcXcXcXnXcXnXnXdXdXcXcXzXdXdX.XxX@X.X.X.X.X.X|.|.|._./ ~ ! CXZXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX2XyX1XwX<.,.<.yX1X,X2X*X2X5.>.:.tX>Xz | iXeX> *Xv sXz w z k -Xz d -Xf k -X-Xd v k p v d v x s -Xc @ > | c z k s s O < O O s   4 n b g v > > > f } O.O.X... .X.X.X.X.X.X.X.X.X.X.X.X.X.X. .O.O.8X:X@ z g @ b -Xa a -X:X;X;Xx :X;Xl :X1X5X5X5X>X5XZXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXFXFXVXBX[ Q ^ ` b.Q.!./././././././././.^.(.).(.(.!.(.(./.(./.^./.(./.(.[././.].! Q ' BXZXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAX9.,.1.wX1.-.-.<.v a - , - g b v v j v g v g @ g v g v v v g h + @ - g $ - d g 4 4 z g 5 4 w g k h g g g g h g g h + @ 4 g a v k h p p @ g h p p a h a p a g a g g h a p h k v z @ a k v v v k z v v g k g g g w 0 w h h a k a v :X>X;XsX-XwX+.o.AXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXAXAXAXDXDXVXAX~ ~ I c.F.].~.T.Y.U.P.Y.Y.U.Y.U.P.L.Y.L.P.P.T.Y.I.L.U.U.L.U.U.L.S.S.H.L.L.H.H.H.H.H.S.S.A.A.g.A.A.g.g.k.k.g.f.a.i.a.s.i.i.i.u.u.u.u.s.t.t.t.t.u.t.t.",
+"C C C C C C C C C C C C C A Z N B B Z N A N C B B B B C B C B C B C N C C Z C C C C Z C D C C D Z C Z C B Z Z Z Z D Z Z Z D D D L Z Z G Z Z D D Z Z Z F Z D Z Z Z Z Z Z Z Z Z Z Z L Z Z Z Z Z Z D Z Z Z Z Z D D Z Z L H Z H Z Z H Z H H D D H H H H L L H J J H L L L P J P P P J J P P P P P P P P P P J P P P P J J L P P P P L P P P P P P P P P P I P F.^.|.{.|._.|._.(._._.(.^.(.(.(.(.(.^.(.(.(.(.(.`.(.(.{.^._.`.`.`.{.|._._.[._.|.(.(.^.(.(.(./.^././.~.^.^.~.~.!.~.~.~.~.~.^.~.~.~.~.~./././.[.(./.(.(.(.(.~.(.^.(.`.(.{.(.(.^.(.)./.(.(.(./././.~.~./.~.~.~.~.~.T.~.T.T.T.T.T.T.T.U.T.T.T.T.T.T.T.T.T.T.^.T.T.T.T.T.T.T.U.T.U.T.T.T.U.T.P.P.P.D.U.H.D.H.H.L.S.S.S.~ ~ S HXZXZXZXFXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.O.+.z l d f v v v v v O l v } O.X.o.o.X.X. .O.X.X.o.:X7 2.2 -X*Xc eXiX> 7 n q.a 4 8.2 + =XiX:Xp w c.w p p 8X:X@ z { sXh | M.,.=.2 =.2 2 =.2 =.2 =.=.2 2 2.,.M.+.@ ` n O p | -Xp 5 <.x 4 p | -Xs 7 2 eXgXz - W v s 2X1X1.,.9.wX:.-.<.wXwXwX<.>.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX{ ^ ^ I e.n.Z.L.L.L.U.I.U.U.U.U.Y.L.U.U.U.P.L.L.P.L.L.P.L.P.P.T.P.T.P.Z./ / ' BXAXFXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXyX:.<.1X4X4.>.-.-.-.:.wX4.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.;.wX4.>.;.0X5.>.-.-.-.-.-.-.-.>.>.-.-.qXwX1X:X;X;Xv @ z v v g z z d z h :X<X8.;X*X5 kXkX# | -XO W -XO n 8X@ h w 7 < 7 v v d x 7 z d @ % a + 4 4 O v p l p ;XsX+ v f > / X.DXZXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXZXVXS / ~ c.m.JXdXcXcXcXcXxXcXcXJXdXcXcXzXdXzXzXdXdXzX'.dX X.X.X.X|.|.|.|.|.~ ~ ! ZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyXyX1XtX0X:.1.tX2XyX:X2XwX0X<.<.>Xv A [ W u :X*X-X*Xz g 6XO.O.O.O.o.o. .O.o.O.:X+.O.X.O.n s <X} d - % - a k k -X< 2 4 8X-X< 7 x n @ , f { & | 7XO.o.o.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.O.O.;Xv @ @ @ k v l z z @ a - + p a a ;XuX=X;X*Xk s 5XFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXBX' ! Q _ b.F.!.R.(.~././././.(.^.^.(.(./.(./.(.(.(./.(.(.(.(.(././.(.^.F./ / [ BXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAX9.1.0X<.>.-.-.9.v p s w h g g a a g p 5 + a p g 5 g 5 h @ h a a d @ a p p a a a d + h @ @ + h a d O @ g a + + 4 h d - h h 4 a 5 g @ z @ h h 4 d a h a a a g z a a p @ w h h + + @ z k a p p v a p @ g g p h g l g a p j g a a z 5XuX:Xl g >X+.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXDXAXAXFXDXFXAXAX~ / ~ b.n.T.~.T.T.U.P.P.P.P.P.L.U.U.U.T.U.T.U.I.T.U.L.L.U.L.L.U.L.L.L.L.H.U.H.H.H.H.S.S.A.A.A.h.g.g.k.k.g.a.f.a.a.a.i.i.p.i.u.u.u.u.u.t.s.t.t.t.t.r.",
+"C C A C C C C C Z C C N Z C Z Z B B B C N N B B B C N A C B C V C B B C C C C C C C C Z B C D C Z G C Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z H Z Z Z H Z Z Z D C Z Z Z Z Z Z Z Z Z Z D Z Z Z Z Z Z Z Z Z Z Z Z Z D Z D D H Z Z Z H H Z L H Z L H Z H H H H H J H H L J J S I P P P P P P J P P J P P J L J J S P P P L P P P J P P L P P P P J P P P P P P P P ) P n.|.|._.|._.|.|.^._.`.`.(.`.^.^.(.(.^.(.(.(.(.(.|.^.`.^.(.^.|._.(.`.^._._.(.^.|.(.(.(.(./.(.(.~.~.[.~.T.~.~.~.~.~.~.~.!.~.T./.~.~././././.^.[././.^./.(.(./.(.(.(.^.(.^.(.(.(.(.(.!.(.(././.(./././.~.[.T.T.[.T.T.~.T.~.T.~.T.T.T.T.T.T.T.[.T.T.T.T.T.T.~.~.U.^.L.T.T.T.T.T.T.T.T.T.T.P.P.L.L.L.S.L.S.H.H.H.H.F.D.~ ~ ^ ZXAXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXGXVXo.o.o.O.O.o.O.o.O.o.O.7X8.} O.O.o.X.X.X.X.X.X.X.X.X...7X7 8.7 -X*X@.| W > < v g g 3 2.2.@ =X=X=Xv < 1.i p g 6X<Xa z x l @ } M.,.2.2 =.2 2 3 O 2 =.=.2 2 =.=.,.M.} 5 <.q.+ p W } d @ =.x g p W } z 4 2 sXsX+ a W | v :X1XwX:.4.wX,.,.5.4X2X1XwX<.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX[ ! ! I b.g.Z.L.L.L.I.I.U.L.L.Y.P.P.Y.P.Y.P.P.P.P.U.P.U.U.T.P.P.P.U.P.n./ / ' fXDXAXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3X9.<.4X4X4.-.-.-.-.:.tX4X9.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.>.-.-.-.-.;.wX4X0X,.-.>.-.-.-.-.;.-.-.-.-.qX5.>.0X1X2XuX;Xh 5 w p @ p a a a - v b z *XeXsXwX*Xp b 8.o | } @ W } + / W , g 5 < < j l v k d d l :X;Xn :X;X;Xd j 9.k w a w d + -X{ $ z X.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFX~ ~ ^ M.].].JXnXcXcXcXcXcXxXcXdXcXzXcXdXzXzXzX@X.XdX.X.X.X.X|. X_._._.(.! ! Q ZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX;X;X;X:X2X4X9.,.9.4XuX:X2X2X4XtX:.9.b c n t l ,X*X*X-Xd g -X} | | | | | } } | | n } | } | x p s k a z g z d -X2.k 2 =.a 8X3Xd c Q > v f v 6X@  .O.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X. .X.X.X.X.O.f -X:X+ 8.g *Xz p p p 2.9XO 2.0Xs b 5Xk v l l l >XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXAXBX[ ! Q ` b.U.]./.T.~././././.(./.(.(./.(./.(.(./.(./.(.(./.(././.^.[./.K.Q / ' BXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXSX9.<.4X4.,.-.>.<.l a s 6Xc z *Xj k z =.8.z a n 8Xn + n sXn @ k f } f @ d 6X:Xa w c.w @ f z k a w [ w O z - v k a d } B + 4 4.x 5 s -X} a v 4 q.x - - ;X6Xw a 2.*Xh p -X} w z h n g g b k 2.p z 2.0Xp v k 9Xg v k 2.s k v k 0Xp v wXwX9X>X:X6X .X.HXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXGXZXAXZX~ ~ ~ b.n.!.T.P.T.U.T.T.U.U.T.L.L.Y.U.T.T.L.T.U.U.Y.L.L.L.P.L.L.L.S.U.S.H.H.H.H.S.S.S.S.z.A.h.S.k.g.k.f.g.k.i.a.f.i.a.i.u.u.u.u.t.u.t.t.t.u.t.t.t.t.",
+"C A C C A C C A C N A Z Z N B B N Z B C N C B C C N B V B C N C B C C B C C C C C Z A C C F C C C V Z C C Z Z Z Z Z Z Z Z Z Z Z Z H Z Z C G D Z H Z G Z G B Z Z Z D D D D G Z H Z Z Z Z D Z Z Z Z Z Z D Z D Z D Z H H Z Z Z H J Z H L Z H H D H H H H H H H J J H P P L L L L H H J J J L P J P P I P P P P J P J J J J J J J J J P P L P P P P I U P ) U n.[.{.^._.|._._._._.(.(.`.`.(.`.^.(.|.(.(.^.|.|.^.|.).{.|.|.(./.|.|.^.|.^.`.(.(.(.(.(.(.(.[.(.(.~.~.~.~.~.~.~.~.~.~.~.~.~./.T.~.T.~.T.E./.~.^././././.(.~.(.(./.(.(.(.(.(.(.(.(.(.(.(.(.(./././././.~.~.~.~.~.~.~.T.~.T.~.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.P.T.T.T.T.T.T.T.T.T.T.T.P.P.U.U.P.L.L.S.H.Z.H.D.L.L.~ ~ ^ ZXAXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXVXGXo.o.o.o.O.O.X.X.X.X.X.X.O.O.O.O.X.X.X.X.X.X.X.X.X.X.O.+.s O O k v w % 0 z 4 s O h @ p + @ h s s p + < a a p g p h @ + @ h | M.;.=.2 2 2 3 k *X< 2 2 2 2 2 7 ,.8.} @ 4 w a p , - a w + + h @ - $ 4 g 4 @ 5 h g - - z <.qXuX1.,.<.wXwXtX<X,X,X1XwXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXCX' ! Q I T b.K.L.L.L.I.T.I.Y.U.Y.Y.P.P.P.T.P.P.P.P.P.U.P.P.P.P.P.P.U.T.F.Q ! _ BXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXyXyX,X<XwX<.-.-.-.-.-.:.wX<.-.-.-.-.-.-.-.-.-.-.-.-.-.>.;.wX4.>.-.-.;.0XwX4.-.-.-.-.-.-.-.-.-.-.-.;.,XwX,.wX1X1XyX;Xw gXsX, } -Xp p -X} v :Xh *XsXsX:X*Xv d + O @ , O , @ + a , p h z v -Xk p v k 9Xs n +.O...7XuX>Xd j qXk z h 7 7 z ;X-Xz z X.HXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXDXZX~ ~ ^ v.m.JXJXcXcXnXnXcXxXcXcXcXzXzXdX.XzXxX'.zX.X@X.X.X.X X|.|.|.`._.(.~ S Q ZXGXDXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX:Xn b x -X:X:X2.;X;X:X;X:X-X:X:Xb b z :X:X*Xx ;X+ #   p ;Xl z g k *X-X-Xp + *Xs g p p g g h + @ p a @ g x @ z k *XO 2 O - p a | o...8X} l n w W  .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O./ ,XKXp 6Xz & + # # p 5.qXs 5.qXd b 5XeXsX6Xb v uXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXAXFXBX{ ! Q ` b.F.Q./.~.~./.~././././.(./.(./.(./.(.(./.(.(.(./.(.~.(.E.~.(.].Q / / BXGXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXZX9.9.4XtXwX<.,.9.v a s 3X! a k qX*Xd 2 7 j @ r | @.a > } @.@ g > +.@.- v 8X:Xa < 1.u - k z f - < 1.c p v h z f p > +.W - < =.x z p =X6X+ k < =.x k - | | - p 5.9Xv p =XKXw 5 x x O z v k 0Xz z j j p v *Xj p z k qX-Xp v k j s v <.,.9.5X+...X.X.VXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXZXDXAXZX~ ! ' c.F.].T.^.T.T.T.P.Y.T.T.L.U.L.T.U.T.L.T.U.Y.R.U.L.L.P.L.L.H.L.H.H.H.H.H.H.H.S.A.S.A.A.A.h.k.z.k.f.d.i.a.a.f.i.i.i.s.u.u.u.u.t.t.u.t.t.t.r.t.t.",
+"C C C C N A N N Z N C N A S N B C C B B C N N B N C N C B C V C C C B C B B C C C C C C C C C Z C Z B Z Z C Z Z D C Z D Z Z Z Z Z Z Z Z Z Z Z Z Z D Z G G Z G C D D Z D D D Z Z Z D Z H Z Z Z Z Z F Z D D Z F Z S H Z H D H H Z L L Z L H H H H U H K H H F J J L L L P J J P J L L J H L P L P J J P P L P P P J H L L J J J J J P J L P P P P J P I ! P b.].{._._._.{._.|.^.`.`.`.`.(.^.|._._.(.(.`.(.(.`.(.(.(.{.`.(.|.|./.`.^.^.^.`.`.(.(./.(.(.T.T.~.~.~.T.T.T.~.T.T.~.~.~.~.[.T.^.T.T././.~.~.~.^.~.(././.(./.(.(.(./.(.(.(.(.(.(.|.(.(.(./.(./././.~././.~.~.~.T.T.T.~.T.~.T.~.~.~.T.T.T.U.T.T.T.T.T.T.T.~.U.!.T.~.P.T.T.T.T.T.T.T.T.T.T.P.U.L.L.P.P.P.L.H.H.U.H.U.S.Q Q S ZXAXFXFXVXVXVXGXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFX+.o.X.X.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...+.v } > k -Xp h O @ a k v h a g a @ @ k *Xk @ p s p w h z g v { | ~ +.eX,.2.2 2 =.j k j 3 2 2 2.2.2.4.,.M.| @ - p p @ h z z h - s p @ d p p g 4 5 l z a a @ g b k -Xk 2.4.1X1X<X,X,X<X1X2XZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXCX} S Q J b.g.F.L.I.I.I.I.U.T.P.P.T.T.T.Y.P.P.P.P.P.P.P.Y.U.T.P.P.P.T.U.H.Q / ' BXDXFXFXZXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXyXwXwX<.>.-.-.-.-.-.-.-.:.wX<.-.-.-.-.-.-.-.-.-.-.>.:.wX4.0X4.-.-.-.-.;.>.-.-.-.-.-.-.-.-.>.-.-.-.>.qX4X5.5.wXwXwX;Xz KXn   W { - p =X6Xv -X@ *Xv g b *Xb :X- s g p p s s d s O p k - b :Xg k :Xk j s / O.....O.7X2Xh a g a g @ < 7 g z z @ x X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXVX~ ~ ^ M.Q.hX|.vXcXdXcXvXxXxXnXdXzXzXxXdXxX.XdXdX.X.X.X.X.X.X|.|.|.^._.(.! ! Q ZXDXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZX2X1X<Xd p d g d g w 7 w j 4 7 l ;X;X;Xv 4 @ + w a h a g h 5 5 l ;X:X:X:Xb n k k n - @ z d @ z n @ @ v KXz l k 4 2.k 6X:Xp z 4 } O.o.6X} W W W +.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.| c -Xp @ @ @ @ O p p p s # s *Xg b 5X:X;XsXb v 5XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXAXBX' / Q ` n.K.!.~.~./././.!././././.(.^.(.(.(.(./.(./././.(.~.(.(.{.^.~.K.S Q _ BXDXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXAXAXAX9.:.wXwX,X2XwX:Xx p p s a a @ p p - + O p - + , + h + - + @ z @ - @ p p p p @ + 6 h a + p @ @ 4 4 @ a z p p - @ @ a a @ @ O p @ a s @ a z @ O O g a $ , @ a p p @ @ s d a a O O + z g k s k z v k a a s -Xz z k p p g z v v k v 1.<.3X+.X.X.X.X.VXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXVXZXFXVXFX~ ~ S [ n.].^.~.T.P.Y.T.Y.T.U.T.U.Y.U.Y.Y.T.T.L.Y.L.L.L.U.P.U.S.L.H.S.H.H.H.H.H.S.S.A.A.A.A.g.g.g.g.k.f.a.z.k.a.i.i.i.a.p.p.p.u.t.t.t.i.u.r.t.t.r.r.",
+"C C C C C C C A A N Z N N N @.Z C B C B N C C N C V C N C N C N B B C B C C C C C C A C C Z C C C C Z D D Z Z Z Z Z Z Z D D Z Z Z Z Z Z D Z Z D D C Z Z D Z Z Z Z Z G Z D D Z Z G Z D D Z D D Z Z Z Z Z Z G Z Z Z Z Z Z Z H Z H Z Z J Z Z H Z H H H H H H J H H L L P H P J P J P J J P J J J P J J Z P P P P J J J J U K J J J P P J P U P P P P P I ) L [ ].{.`.{._.|._.(._.`.(.^.`.`.}.}.}.^.`.^.`.(.^.(.`.(.`.(.(.|.`./.|.(.^.`.(.(.{.^./.(./././.(.~.~.~.~.T.~.T.~.~.~.~.~.~.(.~.T.~.~.T.~.~.~.~.~.(.~./.~.~.(.~.(.(.(.(.(.(.`.`.^.^.(.(.(.(.(.(./././.~./.~.~.[.T.[.~.~.~.~.~.~.T.~.T.T.T.Y.T.T.T.T.T.T.P.U.~.P.Y.P.~.T.P.T.T.U.T.T.T.T.T.T.U.Y.L.P.S.L.L.L.L.L.H.P.S.! S Q ZXFXFXZXFXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. . .+.3X@.+.@.<XuXb n h @ b sXz l g <Xn + x n j k > } s p h aXsX@ { 7X6XM.6X5.,.2.2 =.2 < v -X7 2 2.:.,.,.,.9X6X} @ | -Xs g sXgXh p | -Xs p | -Xs w 2 n gXl a x b h h l b h x :.5.1X2X2X2XtXwXwXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXMX[ ! ! ) e.Z.H.L.L.L.I.T.U.P.T.T.P.P.Y.P.P.P.Y.P.P.T.U.U.Y.T.P.T.U.U.P.Z./ / _ BXDXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.,.-.-.-.-.-.-.-.-.-.-.:.tX2X4.-.-.-.-.-.-.-.;.wX4.,.wX4.,.;.-.-.-.-.-.-.-.-.-.-.-.-.-.-.0X5.-.-.-.;.<X4X5.>.>.>.b 4 4   O f - a p p l h h 5 ;X*X*X*X*Xk v @ 2.=.# W -XO W -Xs n sXh v *Xg k -X*Xv v O.7XhX7X} hXpXz z z g h z l l g w @ h @  .FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXVXS ! ^ M.Q.].fXvXcXxXxXcXdXxXcXdXzXzXzXzX.X.XdXdXdX.X.X.X.X|.|.|.|._._.(.~ / ~ ZXDXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXSX2X2X>Xj 9Xk k j k z =.7 KXKX8.l k ;X-Xz =.b s 5 g 5.-Xa g :Xp 5 5 z 5 w b n + z n z @ v n @ + KXz @ z KXb a b k < 4 KX:Xh 7 2 ! O.X.X.+.O.....X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.:Xb x ;X;Xv ;X:XO 2.0X+ p :X;Xv :XeX6XaX;Xk uXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXVXFXBX[ / Q ` b.F.].~./.~./.~.[.[./.[.(././././././.(./.(./.(./.(./.!.[.^.^.]./ Q _ MXDXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXZXSX9.>.,.>.<.<X2X,Xz a z g d h l g z h k z z g k z z p z k g h p z z z d z z z g g v k g z g z g g z a z p g z z g a v z g g z z h h z z z p g x z g g k z g g h z g p l z a g z z z h a z z d s z z z g d z g g z z z k a z z d v >X3X+.+.X.X.X.X.VXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXVXDXDXVXZX~ ~ ~ b.F.].!.P.T.T.T.Y.T.L.T.L.T.U.T.U.T.Y.U.T.L.R.U.Y.L.P.U.L.L.S.H.H.H.H.H.H.S.A.S.A.A.A.A.h.z.g.k.f.i.k.i.i.i.f.i.s.s.u.t.u.s.t.p.t.t.r.t.t.r.r.",
+"C C B C B B C B C B C B C V N C B C C B B C N B B B B B B B B B N C N C B C C B C C C C C C C C Z C C Z F B Z Z Z Z Z Z Z Z Z F Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z L Z Z Z Z Z L Z Z Z Z Z Z Z Z Z Z Z G Z D D C Z Z D Z Z Z Z P D P H H H H H H H H H J H D P L Z L L Z I J J U L L U P S P P J L U H P P P L K S I L L L J I G H U J ( Q ) P I L ) P P [ F.].dX}.}.^.^.}.dX^.dX X X^._.(._.}._.'.}. X_.[.[.^.[.'._.[._._._._.`.(.^.(.(.(.(.^./.^.~.~.!.T.!.T.T.T.~.T.T./.T.~.~.[.T.[.T./.T.~.~.~.~.~.~.~././.!./.(.(.(.^.(.(.(.(.(.^.^.|.(.(.(.(.(./.^.~./.~.~.~.~.~.~.~.~.~.~.~.T./.~.~.T.~.Y.T.T.T.~.T.T.I.T.~.T.T.T.T.T.Y.T.T.T.T.T.T.U.T.U.L.I.L.U.L.L.L.L.L.H.L.L.H./ S / ZXVXAXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.+.o.o.X.O.X.3X>Xv l v :X1Xk eXz @ z KX;X- g -X-X@ z :Xn @ - | / s z aXb + +.M.>.-.,.,.:.2.2 2 =.3 l v 7 2 2.,.4.eX{ 6X6Xv - | } p g sX8.+ p W } h p W } z 7 2 sXsX+ a l v g - z b g v <.5.4X,X,X4X<.>.>.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXBX_ ! ^ _ T Z.Z.L.L.U.U.U.U.T.T.T.T.U.T.U.U.U.T.U.U.P.P.U.U.Y.U.T.T.T.T.Z.! ! ' fXZXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDX9.>.-.-.>.;.-.-.-.-.-.-.-.<.wX1XwX9.,.>.-.-.-.:.wX4.>.-.;.0X4.-.-.-.-.-.-.-.-.-.-.-.-.-.;.,XwX,.-.-.>.qX4X4X5.,.;.b w 8.x p *Xa h h l a a p d s k z w s :Xb 4 2.2.  W ' - W } + / | > z z h z p s p l 7XhXhX/ 4 } hXv + s =X*X5XqX=X*X*Xj 4.o X.VXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZX~ ! ! c.m.JXfXvXvXxXxXxXzXzXzXzXzXzXzXzXdX'..X.X.XdX.X X.X|.|._.|.(.(.(.~ ~ ~ VXFXFXSXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyX<Xg 2.p j 5.k l j x sXqX5.w 7 j s + 8.aXz g v 5.-Xa v KX@ + 4 M.j @ d @ p @ @ @ w g KXl O g f v v -Xv v z 4 z a p g - -Xj [  .o.X.X.X.X.X.X.X.X.X.....O... . . .X.X. .o.X.X.X.X. . .X.X.X.X...n v -X:XKX;X;X;Xp 4.qXk w + + @ k 9X*X*X*X5X5XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX} ! ! ` n.Q.!./.~././.~.~././././././././.^./.(././.(.(././.^.!.^.(.~.]./ S } BXAXAXFXFXFXFXFXFXFXFXFXFXFXSXZXDXFXFXFXFXFXFXFXFX9.>.-.-.>.9.1X,X;Xa b -X;Xv h a h g 5 d % g z g a g v a p g a p O + v p - O h 5 4 @ h h z h g p a a + p z d + a z d p g a 4 x h h w p + g g h p p g + 4 4 g 5 @ 5 g + - @ g h a @ a g < 7 7 7 7 3 7 h 2 7 7 7 7 7 3 7 j 2 3 7 v 3X+. .X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXZXGXDXFXZXQ ~ Q b.n.Y.~.~.T.T.T.T.Y.T.T.T.Y.U.U.T.T.Y.T.U.Y.U.U.L.L.L.S.L.L.L.S.S.D.S.S.H.H.S.H.z.A.A.h.h.z.g.j.z.f.a.a.a.a.a.s.i.i.u.u.p.t.p.t.t.u.t.r.r.r.r.",
+"B C C C C C B C B C B C N C C N C B B V B N B B u B B B B B B B C N Z B B B B B C B C C C C F Z C Z C Z C Z Z Z B Z Z Z Z Z Z B Z Z Z Z Z Z Z Z Z Z H Z G Z Z L Z Z Z P Z Z Z Z Z Z Z Z Z Z Z H Z Z Z Z Z D D D G Z Z Z H H L Z Z Z Z H Z H H H H H H H Z H H H L L L L Z P J H H P J Z Z L U P P L K H H P L H U J U P I J S S K _ ` { { M.m.aXpXpXpXgXgXaXaXhXaXgXaXgXgXaXaXgXaXaXaXaXhXaXaXaXhXhX].].].'. XdX^._._. X_._.^.[.].(.(.(.(.(.(.[.~.~.T.~.T.T.T.T.T.T.T.T.T.T.~.~.~.T.[.~.~.T./.~.~.~.~.!.~.~.[././.(././.(.^.`.(._.(.(.{.(.(.`.(.(.(./.(././././.~.~.~.T.Y.~.~.~.~.T././.~.~.~.T.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.K.T.T.T.T.U.U.T.U.U.T.L.L.L.I.S.L.L.L.H.U.L.H./ S ! ZXVXAXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.o.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.o.o.X.X.O.+.6XqX,.<.uXyX2X-X-X-Xz a g p h a a z @ a z 5 h 5 > - p h z 5 h } M.,.4.=.=.2.< 2 2 =.< b -X7 2 =.,.eX+.| } b v v , $ @ p p a @ a o - p a , - @ l 9 @ w + g + + @ g + + + k 8.;X-X,X1XwX:.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXBX} ! ^ Y b.n.F.L.L.U.P.U.T.U.T.T.T.T.U.T.U.U.U.U.T.P.T.T.U.U.T.T.U.T.T.U.! / ' BXCXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZX9.;.>.1.wXwX<.-.-.-.-.-.-.-.<.wXwX4.0XwX9.-.-.-.>.-.-.-.:.4XqX>.>.>.-.-.-.-.-.>.>.-.-.-.;.>X1X4.>.-.-.;.qX:X5.-.,.b l kX6Xp ;X:Xa a ;X3Xp a sXz k n l s =X>X@ + a o - - + - - + $ , - l @ z k k 0Xp v 7X7X} b lXw ..| 6Xz *X=X*X;X*Xg =X=.2.< +.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXZXVX! ! / M.].].'.nXxXxXxXxXxXzXxXzXdXzXdXdX'.zXdX.X.X.X.X X.X|.|._.(.|.`.(./ ~ ~ CXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX1X4.9.:X-X*Xk -X;Xg =.2.KXsX8.4 8.aXl h < p < 5 O p + h @ z 5 a x 8.q.@ d - @ @ a a z @ z p 7 [ O.o.X.o.+.O.u d v n l x n -X6X .X. .X.X.X.X.X.X.X.X.o.[ ) ) +. . . .X.X.O.O.O...O.X.+. .X.X.X.X.6Xb v 6Xc.iX@.;X:Xd -Xs + @ # # O l b KX0XqX>X0XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXCX' ! S ` b.F.L./.~././.~././.(.).(././.(.(./././.(./.^././././.(.[.[.~.L.S / ' BXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXFXZX9.>.>.>.>.9.1X,X,Xv >XyX<Xv j 5.*Xd s ;Xn d k 9X;Xz k j ;Xz k # # # *Xs # # @ h kX8.+ k j k z l } / O v w ` w + -Xk 0Xk w KXgX@ z | -Xs l - | -Xp , @.n w 4 =.x 4 4 4.x 5 - ;XsXa 5 z 7 < 7 l 2 7 7 l 7 3 7 n 3 3 2 7 x 7 < 7 x +.o.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXZXFXVXZX~ ~ ~ [ F.].~.~.~.Y.U.P.T.Y.U.U.T.T.T.T.U.T.Y.Y.Y.U.U.L.L.L.L.L.L.S.S.H.H.A.H.D.S.S.A.A.h.A.h.h.h.g.a.j.a.f.f.a.i.a.i.u.u.u.u.t.u.t.t.u.t.r.r.r.r.r.",
+"B B C B B C C B C B B B C C C C B B A V B B B B m B B B B B B B N C N C Z C B B C C C C Z C C C C Z A Z Z Z C Z D Z C Z B Z Z G Z Z Z Z Z Z Z Z H Z G Z L Z Z H Z G G Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z H G Z D D Z D D D Z L Z L H H H H Z H H H H H H H H G L L L L P J H J S J J I L L Z P S H P I P L L L / P Q [ [ M.pXhXgXgXgXgXaXgXgXaXgXaXgXaXaXpXaXaXaXpXaXaXpXpXaXpXaXaXaXaXpXaXaXpXpXpXaXaXaXpXaXpXaXhX].'.'.^.oX[.(.(.(.(.(.(.^.(././.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.~.~.~.T.T.~.T.~./.~.~.~.(.~./././.(.(.(.(.(.(.(.`.(.|./.(.(.(.(./.^.^./././.(./.~.~.~.~.~.~./.~.(.T.~.XX[.T.~.T.T.T.T.T.T.T.T.T.T.T.!.K.T.).[.T.T.T.T.U.U.Y.P.U.L.U.L.L.L.L.L.L.L.L.L.L./ S S ZXAXDXFXAXVXAXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXFXFXO.o.X.X.X.X.X.X.X.X.X.X.X.X.o.o.X.X.o.o...O.o.O...o.7XtX0XwX3X:X:X3X<X3X-X;X-X-Xk b -X-X;Xg z @ h h h k k h - a 4 ) 8.;.2.2.2.=.=.2.2.2.x -Xb x 2.4.,.M.| a 4 l z p p s p p + s p @ g h p p a p + z 4 a p p g 4 a 5 k a z h g d @ p ,X1X9.-.>.1.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX[ / ^ Y b.D.D.L.K.U.U.Y.U.T.U.T.T.T.T.T.U.T.T.T.U.T.Y.U.U.T.I.~.Y.T.T.Z.! / ' fXDXAXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.>.1.tX<XwX<.>.-.-.-.-.-.-.-.-.>.:.wXtX4.>.-.-.-.-.-.-.;.wX4.,.0XwX4.-.-.-.-.0X4.>.-.-.-.0X4X0X>.-.-.-.-.-.-.-.,.2.@ h v O =X;X- p 6X3Xa z 8.h + n v s 5XwXk -Xa d g v v z z z z k z d v z k k j s v ;X:Xv 6XeX7 o.W 8.d p *Xv v l l *X# k c  .CXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXZXVX! ~ ~ c.m.JXzXvXxXxXxXxXzXzXzXzXzXdX.XzXzX@XdX.X.X.X X X|.|.|._._._.(.(.! ~ Q ZXZXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXwXwXyXyXyX1X1X2Xx 2 7 b 7 7 l 3 4 # w g 9Xk @ s ;Xc h @ + @ l O O O @ d 8X-Xs 8X-X- l 7 z | } } X.X.X.X.o.O.} } O.c } ..| +. .X.X.X.X.O...o.o.+.} 6Xx < < x 6X6Xn } | | } | } | Q } X.O.} { } b x v f / { @.b v v :Xg + h 2.9Xp 7 n IX4.9X<X*XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX_ ! ! ` b.Q.]./.~./.!././././.(.(./././.(.(.(.(././././.[.^.(.(.~.^.[.].Q / ' BXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZX9.1.wXwXwXtX3X2X<Xk >XyX,Xl g 5.*X- s 3X} - k 2.k a v 9Xj - k # # # -XO # # @ x sXq.4 -Xj j a > +.W p v 3 1.i @ v j k a l sXn + f W } a k - W } g - d q.w 4 =.b g 4 =.x g + / | - h 5 a @ z z z z @ z a z a @ f @./ > > p d - c X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXVXVXDXFXAXAX~ ~ / c.n.!.~.~.T.Y.T.Y.Y.U.Y.T.T.T.T.T.Y.Y.U.T.T.L.P.P.L.L.L.L.H.Y.L.H.S.H.S.S.S.S.l.A.l.l.h.g.g.k.g.g.g.s.a.a.i.i.i.u.u.u.r.p.t.u.t.t.t.t.t.r.r.r.",
+"B C B C C B B C B C C N F N N C B B B B B B B N B B B B B B B B A N C C N C C B N C C C C C C C C C C C Z C Z Z C Z Z Z C G Z Z Z Z D Z G Z L Z Z H Z Z Z Z G Z Z L Z Z U Z Z L Z Z Z G Z Z Z Z Z Z Z Z H Z G Z D H Z D D D Z Z L Z Z H H H Z H H H H H H Z J L L L L L Z I J H J H L H L H P P G U H H Z P _ M.m.hXgXgXgXgXgXaXgXaXaXaXaXaXpXaXpXpXpXpXpXpXpXpXM.pXpXM.pXpXpXpX{ pXpX} pXpXM.pXpXpXpXpXpXpXpXpXpXpXaXm.aXpXaXQ.^.(.(.(.(.[.^.!.!.~.~.T.T.T.T.Y.T.T.T.T.T.T.T.T.L.~.T.~.~.~.[.~.!.~.~.~././.!./.!././.^.`.(.(.(.(.(.(.^.|.(.(.^.(.{.(.(./././.(./.~.~./.~./.~.~././.XXE.XXU.T.~.~.~.~.~.T.T.T.I.T.T.T.T.~.~.T.~.T.T.T.T.T.T.T.T.Y.U.I.L.Y.U.L.L.L.L.G.L.G.L./ / ! DXZXZXZXFXVXZXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXo.o.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.o.+.6X:X8X:X6X6X3XyXyX6X . .O. .X.o.+.1X3X6Xf n n :X1Xv n z + l 8.k k z n d 2 Y sX-.>.,.,.,.,.,.,.,.b b k ;X;.,.,.M.| g sXsXh p | -Xs + | -Xp @ =.x @ p | -Xs 4 < | -Xs 4 q.k p x j 9Xv - / -Xs <X1X<.-.>.4.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXCX' ! ~ P e.Z.F.U.L.U.U.U.U.T.T.T.T.T.Y.U.T.U.T.U.U.T.U.T.T.T.T.Y.Y.T.T.F.! ! _ HXDXAXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.>.9.4X4.>.-.-.-.>.-.-.-.-.-.-.-.-.>.>.>.-.-.-.-.-.-.-.-.>.;.:.wX4XqX>.-.-.:.1X0X>.-.-.-.:.1X0X>.-.-.-.-.-.-.;.,.b w sXgXp =Xs d a p a @ + O s s + p =X=X=X=X>Xk 0Xp z v p p s d p p p k z + p p k k O O O   + n O.+./ f *X,XsXsXb l >Xf 6XO. .CXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFX~ S ! m.m.].zXzXzXxXxXxXxXzXzXzXdXzXzX.XzX.X'. X.X'..X.X.X|.|.|.(._.(.(./ S Q CXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX2X1X,X2X,XtXwX<X-Xn z @ a a h p - z h j 4.k - s 3X} 5 @ z z - h 5.*X@ v KX-Xp KX:Xa 2 =.b n / z / X.X.X.X.o.hX7X .' |  .| |  .X.X.X.X. .7X} } n 4 < a l z 5 h 5 b ;Xb n c / f c } X.X.O.+.l p x :X:X- $ = x z k p w h h a 5.qXv 4 8.KX8.j >X:XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXZXFXZXDXCX' Q Q ` b.F.!./.~./.!.~./././.].~././.(././.(.(./.(././.(.~.(.[.(.T.[.F.! ! ' BXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDX9.:.wXwXwXwXwX>X<Xk :X1X,Xv v g p g s p h g v k v g v p v g h + + O b s O O a h + + h v k b v - - - @ g 4 7 w h k v v g g d - a p , - a z a - , p a p 6 4 h @ + h 5 + 4 h @ , , p g n x   n x @ z ;X;X# v :Xg > > n n , =X2Xk d X.O.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXVXZXAXFXFX~ ! ~ b.n.].~.~.E.T.T.Y.T.Y.T.U.T.T.T.T.Y.T.Y.U.U.U.L.Y.L.S.S.L.L.S.S.S.H.S.S.S.A.A.H.A.l.l.h.h.g.j.f.a.g.a.a.a.i.i.i.i.u.u.u.u.u.t.u.t.t.t.r.r.r.y.",
+"Z N C B C B C B C B B C C N C C C B B B B N V m N B B B C V V u C C N C A C N C C B Z C C C A Z Z C Z C Z Z C C Z Z Z D D Z Z Z D Z Z Z L Z Z G Z Z Z L Z Z Z Z Z G Z Z H Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z D D Z D Z H Z Z Z L H Z H H H H H H H H H H H H H H Z Z H H L L Z J H G Y L ) ) Z P _ M.aXhXgXgXgXsXgXaXaXgXsXpXM.pXpXM.M.pXM.{ { M.{ { { { { { { { { { { { { { { { { { { { M.{ { M.{ pXM.M.pXM.M.m.pXpXpXpXpXpXpXpXm.hX].'._.^.~.~./.T.!.P.P.T.T.U.T.T.T.T.T.T.T.T.~.~.~.~.[.~.~.~.~./././././.(./.(.(.(.(.(.(.(.(.(.(.(.{.`.|.(.|.(./././././././.Y./.~.~.(./.~.~.~.~.T.[.T.T.T.~.~.U.T.T.I.~.~.I.T.~.T.~.T.T.T.~.T.T.T.T.T.T.T.T.P.P.L.L.L.L.L.L.G.L.L.L./ S ^ ZXAXFXZXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .+.yXuX9.<.1X6X .o.X.o. . . ... . .X.<XyXf n n , 6X5Xv :Xl + x 6Xa + z b v < x 6XM.M.M.M.8.M.M.8.M.n v x n M.M.sX7X{ a sXn k a W } a a W } z 4 =.x g p W } d 5 3 W } z + eXsX7 h j 5.p - @.} v >XwX:.-.-.-.DXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXVXBX' ~ ^ I b.Z.F.U.P.U.T.U.T.T.T.T.T.T.Y.P.T.T.T.T.T.T.T.T.T.T.T.T.Y.Y.T.K.~ / ' BXZXAXZXZXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXFXFXFXFXZX9.>.9.4X4.-.-.-.:.wX<.>.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.:.wX4.>.-.>.;.2XqX>.-.-.-.-.0X5.>.-.-.-.-.-.-.-.,.b z sXc -X<Xk w - v b b a sXz k sXg *Xs s :X>Xk j s g k k 9Xp z w O k p a z c @ *Xn 5 w n z v +. .o.O.O.6X:X;XsX6Xv >XX... .o.DXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXZXFX/ ! ! c.m.'.JXvXdXxXvXdXzXzXxXzX.X.X.XxX.XdX.X.X X|. X.X'.|._._.(.`.(.(.! ~ Q CXZXZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3X,X,X1X5.,.;.;.4.4Xl g 5.-Xh z x z z p v v z O s a @ z 8.z + j 9.;Xh @ z p + z h z j 6X+. .O.| z ' X.O.O.O.7XhX..W | o.| +. . .o.O.O.O.6Xv g g 4 eX8.+ a 6X:X- Q -X6X........o.o.O.O.o. .| 5 v :Xv z eXg -Xv ;XO b n 4 @ O p O x 2.;Xv b >X*XGXIXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXBX} S / ` n.F.{./.~.(././.~./././././././.(.(.(.(./.(././././.(.(.~.(.[.K.Q / ' BXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXtX<.>.>.-.>.>.9.2Xv :X2X>Xv h d d h h g p h g h h h @ z a g h - z + d @ d d p h d - g @ + + a p p a a g a @ + a @ O + a 7 7 7 7 7 7 7 4 g g g g h h - @ 5 g z w a g @ z g 7 < 7 < O :XeXO b v p p -XeX# :XKXk f > n x , -XKX:X/ o.X.X.X.X.X.X.X.AXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXZXZXVXZX~ S Q b.n.].(./.R.T.T.T.U.T.T.T.T.T.T.T.T.U.Y.U.P.Y.U.L.L.L.S.L.H.H.H.G.H.S.S.S.S.A.A.h.l.h.g.g.g.f.f.f.k.f.a.a.i.i.i.i.u.u.s.i.t.u.t.t.u.r.r.r.r.r.",
+"B C C C C B B C B B B V B N N N B B C B B B B u B B u B V B B B N N C N N Z C B N C A C C C C C C C Z C B Z A D C C B Z B Z Z Z Z G Z L Z D H Z Z H G Z L G G L Z Z L L G Z Z Z Z L L Z Z Z H C Z Z Z Z Z Z G Z D D D D H Z G Z H H Z H Z H H H H F H H H H H H H H L L H H H H L U H U L Z ' [ pXgXgXgXgXgXgXaXaXaXpXpXpX{ m.M.M.} { { ' ' ' ' ' Q _ S / S S S u S S u u u S u ! / ~ u u J ~ ! ' Q ' ' ' ' { { { { { { M.m.M.pXM.pXpXm.m.m.m.].T.~.~.T.T.Y.P.P.T.U.U.U.U.U.T.T.T.T.T.T.T.~.T.~.~./.~.^./././././././.(.(.(.(.(.(.|.`.(._.(.^.^.{.(.(.(.(.(./././.~././.^.~.~.~./.~.~.~.~.~.~.~.~.~.~.~.~.T.~.T.T.~.T.~.T.(.~.~.~.T.~.T.T.T.T.T.T.T.T.T.U.U.U.L.L.D.L.L.L.L./ S ^ ZXAXFXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.+.5.>.-.<X8X . .X.X. .8X8X3X6X..O.+.4X/ x n , 6X>X-Xv -Xz @ O a g p g O 4 b } | } | +.} } | } | n l n n } | A c j d w 5 5 @ , - a a , , p a O O a + % - @ h 4 $ % @ 4 4 l < k v k v z d f v 1X9.;.-.-.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXHX[ ! ^ I b.n.D.U.T.U.T.U.T.Y.~.Y.T.T.^.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.F.! / _ BXZXFXAXFXAXFXFXFXFXFXFXFXFXFXFXDXAXAXDXFXFXFXFXZX9.>.<.wX<.-.-.-.<.wX4.0X9.>.>.-.-.-.-.-.-.:.0X9.-.-.-.-.-.-.-.,.;.>.;.-.-.-.:.2X0X>.-.-.-.>.>.-.-.-.-.>.>.>.>.,.>.b w z a z s -X} @ b :.j g n a + 8.h + g a b ;Xv v z z -Xg j s d a k k g 5 z x O ;Xv O z x + v 7X..O.O...7X:XeXsXeXp 5X+.o. . .GXDXCXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFX! ! ! M.m.hXdXdXzXcXzXdXzXzX.XzXzXzX'.'.dX.XdX.X`..X|.|.|.|.|.|.`.`.(.(./ ! Q ZXZXZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX,X,X<X2X<.-.-.>.<.1Xz j 9.*Xw < 3 3 7 z p w @ k -Xv - O O # w @ k g z b 5 5 z v l 7 { O. .X.X. .} z ! O.O.O.fX7XO./ }  .} +. .O.+.} | } v h 2 < x gX8.4 d 8X3X, f { , W .. . .o.o..... .O.} h x z + z sXz + ;X:Xa 8.8.@ w a l @ ;X1XtX5XtX:XwXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXAXAXBX' / / ` b.n.!./.~.R././.(././././.(.!./.(.(././.^././.[.(.[./././././.K.Q / ' BXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXyX<.>.-.-.-.>.<.<Xv :X2X2Xn v *Xj z g 9Xk z v *Xk - k ;Xv d g h c.@ @ f } ! + d } n + f d g @ f | / O v - f k a z O # + 3 =.2 2 =.=.2 7 z p -Xb d 4 <.x 5 4 =.x 5 @ sXgXh ' u c K c l / > f @.f / ^ ^ f v v v / ' n v @.@.f | ..o.X.X.X.X.X.X.X.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXAXFXFXAXDX^ ~ Q c.n.].R.(.R.R.T.T.T.T.U.Y.U.T.T.T.T.T.T.T.U.L.L.L.L.L.L.S.H.H.H.H.S.G.S.S.S.h.A.h.h.l.g.g.g.f.f.f.f.a.a.a.i.i.i.i.u.u.u.u.t.p.u.t.t.t.r.r.y.y.",
+"B B N B C C B N B B B B N C B N B B B B V B N V B B m m C M B V B B N Z B B C B A N B C C C C F C D C Z C C Z C C C Z D Z Z Z D Z Z Z Z D Z G Z Z Z Z Z Z Z Z Z Z G Z Z Z L Z L Z Z G Z Z Z Z L Z Z Z Z Z Z Z Z D D Z Z Z H Z L Z H H H Z Z Z H H H H H H Z H H H L H H L L L H Z S S _ M.aXfXgXgXgXgXaXaXpXpX6XpXM.{ { { / ~ ) S u u u u y y e y e e e e ; > ; 0 r e : r y 0 r ; : ; : y t y y y t y u S u c u Q ~ ' { ' { { { M.{ { pXm.pXM.pXm.m.].].P.P.Y.Y.U.T.U.U.T.T.T.T.T.T.~.~.~.~.~.[.~.~.~.(././.!././.(./.(.(.(.(.(.^.`.^.(._.(.(.(.[.^.(.(.(./.^././././././.~.~.~.^.~.~.~.~.T.~.~.T.Y.~.~.T.~.T.~.~.T.~.T.~.T.T.~.~.T.T.T.~.T.T.T.T.Y.U.U.U.L.L.I.L.L.L.L.L.L./ ~ S ZXAXFXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXGXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .7X5.,.,.<.2X+.X.X. .+.uXtXtX3X7X.. .6XW x n - 6X>X2X2XyX-X@ w d v p p *X*Xp w p z 5 + a a h @ 4 4 h + + h 7 =.q.u g @ d a 9 h l l z g 5 4 h c 8.c p h h @ h 5 a p p g @ + 5 h a p - v 1X4XuXwX:.-.-.-.>.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX[ ~ ~ I e.n.Z.L.Y.T.U.T.Y.T.T.Y.T.~.T.T.~.T.T.T.T.T.T.T.T.Y.T.T.Y.T.T.K.! ! _ BXZXAXZXFXAXFXFXFXFXFXFXFXFXFXGXSXDXFXFXFXFXFXFXVX9.>.-.>.-.-.-.-.-.,.<.2X2XwX0X<.-.-.-.-.-.<.4X5.>.>.>.-.-.>.,.>.,.>.>.>.-.-.;.wX4.,.-.-.-.qX5.-.-.-.-.5.wX0X0Xj b b 5 h - @ s =X6X- j ,.9Xp + s s k v *Xj h h a a d l z k *Xk g z z a @ h l 4 + + a z + + 3 + k _ / } | | n *X-X*X*X*X:X+. .X.X.DXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXZXFX/ S ! c.].'.dXzXcXcXJXdXzXzXzXxX.XzX'.zX'.zX.X X.X|.|.|.'._.|._.(.`.(.(.~ / ~ CXDXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyX<X1X5.,.,.,.:.wX1Xv @ k p z < 2 2 6 w s -Xf s b a d 2 8.5 z h - @ l >Xv pXeX:X3 7 ` O.X.X.X. .X.| z / o...7X7X..Q :XsX:X:Xn { b a @ - - 4 2 7 - O # 5 + a a , x :X@ +...X.X.o.o.O.O.o. .| d n b p z + @ @ b ;X+ < O O z x c + ;XwX<.9X1X<X:XZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXAXBX[ S S ` n.].Q./.~./././././.(./.^.(././.(./.(.^./.~.{.(.[.(./.[./.(.(.K./ / _ BXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXAX5.,.>.-.-.-.>.<.1Xv <X1X2Xx k j k x k 2.k z -X2.g z k :Xa - k < 1.i @ y +.@.a = +.W @ a v c a > +.W p z a v x @ v p # + 7 =.=.=.=.2 2 < z z -Xz d 4 =.b h 4 =.b g 5 sXeX- ..O. ...+.| O.O.O.O...O.o. .X.X.X.X.+.W W W W O...O.X.X.X.X.X.X.X.X.o.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXFXDXFXVXFX^ ~ S b.F.Q.Y.~.~.T.T.Y.T.P.P.T.U.T.T.T.T.T.T.Y.U.Y.L.P.L.L.S.U.A.H.H.H.H.G.G.H.A.A.A.h.h.h.g.g.g.g.f.f.a.a.s.a.i.i.i.i.t.u.p.u.u.u.u.t.t.t.t.r.t.y.",
+"B B B C B B V G B B N V N C N V N B N B N V m N B B B B V B B C B N C N B B B C B Z B C C C C C C B Z C D C C Z C B Z C C Z Z B Z Z Z Z Z D Z Z L Z Z L Z H G Z L Z Z Z Z Z Z Z Z G Z Z Z Z Z Z Z Z Z Z Z Z Z H Z Z D Z H Z Z H H Z Z H L H H H F F H F H H H H Z G L H L D L D ) M.hXgXgXgXgXsXaXaXpXpXM.m.{ { ' ! ^ S u c u e : : t > ; ; > e e ; : : : : ; > : y r : : : r r ; : y : e : e ; e : > : t : : e u y u S u c _ ' ' ' { { { M.} M.{ M.M.M.m.Q.Y.L.T.U.T.U.U.T.T.T.~.T.T.T.T.~.~.~.~.~.(.~././././././.(./.(.^.].(.(.(.(.(.(.(._._._.^.{.(.(./.(./.~./.T./.~./.~.~.~.~.~.T.~.~.~.~.~.].~.~.~.~.~.I.~.~.T.~.T.~.~.I.T.~.T.~.T.T.T.T.T.T.U.T.I.U.Y.L.U.L.L.L.L.L.S / ! ZXFXFXZXAXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .+.<X0X0XwXuX>X7X .X.+.9X,.:.tX6X.. .O.+.W W W } <X6X+.1Xb z n z @ l { k k p 6X:Xh 5 sXn + z n 7 + p sXn O u 6XiX/ 5 eXgXa p sXkXh 4 c 8.4 x ` iX} p l b g 4 2 | v s w 5 l z a 2.qXk l >XwX<.>.-.-.-.<.0XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX} ~ ! I b.Z.Y.Y.U.U.T.U.T.T.Y.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.Y.T.~.Y.T.T.F.! / ' BXVXFXAXFXAXFXFXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXVX4.,.>.>.-.-.-.-.-.-.-.<.wXtXtX4.-.-.-.>.>.:.wXuXeX0X9XiX5.0X0X9X0X0XwX9.-.-.-.>.-.qX4.>.;.wX5.>.-.-.qX4X>X4X<Xx l p 5 8.z + @ p z @ b ,.5.;Xv z *XsXsXwX=Xz k j ;Xp l k k k -Xv g z @ h @ a h + 4 z z + z z b } / / f } c Q ] b ;Xv O / X.o.X.X.CXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXZX/ / S M.Q.].hXzXzXdXzXzXzXdX'.zX'.xX@XdX.X'. X@X.X.X.X|.|.`.|._._.`.`.(.~ ~ ! VXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyX,X,XwX5.qXqXwX-X*Xa v z w a a - d a z s 8X/ p -Xs z 2 q.v z , f =X- ;X:XgXz j 2.{ X.o.o.X.X.X.X.X.} l | ..hXQ.} c v *X-X7 2 5 l 9 sXv o { - @ - f p a 4 x x * n n z W ..+.X.X. ...O. .o.} w O   a x a z z z d p ;X<Xg @ 4 4 + b <.>.>.0X>X:XVXAXGXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXAXAXHX_ ! c ` b.K.!./.~././././././.^.^.)./.^./.(./.^.(.{.(.(.[./././.(.~.[.n./ S } BXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXeX<.,.>.,.>.,.4.:Xp ;X:X;Xk v k v k v h v g k v v g a z @ h p 4 7 w h @ > d p - - - a p p - p - & - a g a a - h @ O O d 7 7 < < 7 7 < 4 g h z a a h + 4 a 5 O 4 @ z / > !  ... . .+.W O.X. .X.X. .X.X. .X.X.X.o.O.O.O.O.O.X. .X.X.X.X.X.X.X.X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXZXAXZX^ ~ ! ` n.!.(.~.T.~.T.Y.P.T.T.P.P.T.T.T.Y.T.Y.U.L.P.L.S.L.S.D.S.D.H.H.A.G.G.A.A.A.A.A.h.h.h.g.j.z.a.f.a.a.a.a.a.a.a.i.i.i.i.s.u.u.u.r.u.i.t.t.r.r.r.",
+"B B B C N N B N N N N F m m F N N N V N V N V N V B B N V V V M A B A N N B B Z B B C C C C C C Z C Z C C C A F G C C Z B D Z Z Z Z Z Z D D Z Z Z L L H Z G Z H Z Z G Z Z Z D G D D Z G Z Z C G C Z Z Z D Z C Z Z Z Z Z H Z Z S H Z H S Z H Z H H J S H H D Z I Z H J J J S { aXgXgXgXgXgXaXaXm.M.M.{ ' / ~ u u u t y e r r r r r e r r y 0 r r ; ; r r r r r r r r r : * y r r r r r r r r r r e e r r r r r r 0 r r e r e y u u ^ ~ ' ' { { { M.{ M.m.{ M.M.m.K.Y.L.Y.T.U.U.I.U.Y.T.~.T.T././.(.~./.~./.(.(.~.].(.(.(.(.(.).(.(.(.(.(.`.(.(.(.(.`.^.{.{.^././.(./.)./.!./.~.~.T.~.~.[.T.~.T.~.~.~.(.R./.!./.T.~.K.~.T.~.~.~.~.^.T.~.T.T.T.T.T.T.T.T.I.T.Y.L.L.L.U.L.L.L.U./ S ^ ZXVXVXZXFXVXVXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXVXFXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.7X3X3X<X<X6X.. .7X8.,.>.<.6X....o.X.o.O.O.o.X.o.8XtX;Xl n x a x 8.d p p 8X:Xd 4 sX8.@ l M.j @ 4 sX6X4 l | / @.z sXM.O k sX8.+ 4 z v 4 c | } @.p x b p 4 2 W } l 5 z x @ a 2.qXk v <.,.,.;.-.-.>.4.4XGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX[ Q ^ ) b.Z.K.K.Y.T.T.T.T.T.Y.T.~.T.T.~.T.T.Y.T.T.T.T.T.T.T.T.Y.T.Y.~.F.! / _ BXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX0X0XwX<.,.,.>.>.;.-.-.>.>.>.-.-.,.:.0XwX<.<.>XsX;X5X5XsXeX5X5XsXeX5X9X,.-.-.-.;.1X4X4.-.-.-.-.-.0X4X2X>X-X:Xv v k j kXM.@ a v -X-X;X,.,.,.;X@ k eXM.:X:X@ v k j a v k 2.-X1X-Xk h x b + x =.# 8.gXd 8.gXv 7X . .X.o. .O.O.X.8XuX<X>  .X.X.X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFXQ Q ! m.m.].JX@XzXzXzX.XzXdXzXdXdX.X@X.X.X.X.X.X.X.X.X.X|._.|._._._.(.(.~ ! ! ZXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3XtX,X,X1X1X1X1X>Xh w z :Xv g 5.*XO 9X*Xa s -Xb <X2X2Xv + p k g s =Xf @ p + + 3 6 6XO.X.X.X.X.X.X.X.X...n } ..hX4 4 g l z a v z 7 l 5 kXM.< 1.i - a v f a z 8.8.- @.f > @.+.oXhX7XhXO.7X7XhXX.f O # s k z w p z a s 8XKXk w d a d v ,.>.<.tX:X:XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXAXBX[ / Q ` n.n.!.^./././././.(.[.^.(.(.(./.^././.(./.(.).(.{.(./././././.K.! ! } mXCXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXtXj j j j j k z a a p h g < @ 4 h k =Xk g g g g g @ + + g a p d @ g @ a - h h g + g 4 4 a a g a p @ g p + O h h @ @ h h 5 l z z =X=Xa h g a h g g h a h x ;X;Xv c o.O.O.o.X. . .+.} O. . .X.X.X.o.o.X.X.X.X.X.X.X.X...o.X.X.X.o.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXDXZXAXFX~ ~ ! c.n.F.T.{.T.T.T.T.Y.P.T.U.U.T.T.T.U.P.Y.I.L.L.H.L.S.H.H.H.H.H.A.H.A.H.A.A.H.g.A.h.h.z.g.g.j.a.i.z.a.a.i.f.i.i.i.i.i.i.u.u.u.u.u.u.r.u.E u.t.r.",
+"B B B m A N Z N C N C N V M N N V V N V m V N N N B N B B B B N B B C N B B N C u C C C C Z C C C C C C C C C C C C C Z C Z Z Z Z Z Z Z Z D D Z Z Z Z Z Z Z G Z Z Z Z Z Z L Z H D Z D C Z G Z B Z Z C Z Z Z D Z Z Z Z Z Z Z H Z Z H H H H Z J H Z Z Z H F J P F J J Z ) m.gXgXgXgXgXaXaXpXM.M.{ ' / u f u u y y e > : : r r r r r q r r : : r r r r r r r r r r r r r r r r r r r r r r r r r r e > r r r r r r r r * : r r 0 t ; e t y u u / Q ' ' { { M.} M.{ { m.Q.L.I.U.T.T.[.T.T.T.~.^.~.~.~.(.[./.(./.~.(./.(.(.(.!.(.(.(.(.(.(.(._.(.(._.(.(.(.).{.(.^.^././././.!./.~.~.~.~.~.T.~.T.~.~.~.~.R./.!././.!.~.~.~.~.~.T.~.T.T.T.T.T.T.T.T.T.T.T.U.T.T.I.U.L.U.U.L.U.L.L.~ ! Q ZXFXZXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXVXGXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.o...X.X.X.o.X.X...7X5.;.,.;.tX6X .X.X.X.X. . .X.8XwX1.b w + 5 h h d p p p g s d d g h + a h a @ a g g g x * = w 5 z g h a d d 5 h < s 4 l * * w @ @ + a 4 < , % @ h + < 5 g a g a b wXwX0X;.-.>.<.tX2XZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX} Q ~ Y b.Z.F.U.Y.U.T.T.Y.~.Y.T.T.Y.~.T.T.T.~.T.T.T.T.T.T.~.T.~.T.Y.~.K.! S } BXZXZXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXyX1X1X1XwX0X0X0X0X0X<.,.>.>.>.>.>.,.;.wX1X4.:.wXsXeX>X=XsX;X:X=XsX;X>X9X>.-.-.-.;.0X>X5.,.-.-.-.-.0XwXwX:Xk k p v j 4 z 2.j a b sXKX:Xj j qX;X@ *X:Xg b -Xh v k k g v k j -X:Xv :Xw l ;XO q.5.O sXsX. 6XsXp +. .X.X.X.o.o.X.o...6X6Xo. .X.X.X.o.DXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXZXVXFX~ Q ! c.Q.'.dX.XvX'.zXzX.XzX.XdX.X XdX.X@X'..X.X.X.X'.|.'.`.|._.|._.`.(./ ! Q CXVXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX,X,X,X,X,X2XuX<Xl n z :Xh j 9.*Xj 9.;Xd :X:X:X:X:X:Xv :X:X:Xx O # O p n a 2 =.;XO. . .X.X.X.X.X.X.X.o./ } eX-Xh a @ p g @ z j 2 4 a a < # < w d 5 s - w 5 4 4 k g h z f 6XfX7X7XhXfX7X7XhX} p + + p g p k k g @ # p z a a 2.9Xa b 0X9XtXtX5XwXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXZXFXVXCX' ! Q [ b.!.^./././.(./.(.(.(.^.(.(.^.(./.(././.(.(./.^./././././.!.[.].! Q ' BXHXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXyX<X-X0Xk *X2.k z v k b k f =.j s z =XiX*Xz k j k a z z x w g f | c + f } f @ w [ - @ w kX8.+ z } / O z   # # + w f k a h sXaXo =XiX:Xs z g -Xn z p *X:X+ ;X8Xo.+.{ +.O.O.o. .+.6X:X-X.... .o.X.X.o. .X.X.X.X.X.X.X.X. .o.X.X.X.o.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXZXZXVXFX! ! ! c.n.!.~.T.~.Y.T.T.P.Y.U.T.U.T.T.T.T.U.U.U.P.U.L.H.K.H.H.H.A.S.H.A.H.A.A.A.A.l.h.A.h.h.g.a.g.f.k.i.z.a.f.i.a.i.i.i.i.i.u.u.a.u.u.u.u.t.t.t.t.t.",
+"B B B C B A N N B B M B N N V N V N V N B M V N N B V N N N B N B B A Z C N C B C C C C C C C C C C Z C C Z C Z C Z C Z Z Z Z Z Z Z Z Z Z Z Z G Z Z G Z Z L Z Z Z L G Z Z Z Z Z D D D Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z G Z H Z H L Z Z Z Z Z Z S Z G G H L K A L Z ( m.gXgXgXgXaXaXpXM.M./ ' c S t u y t : = ; ; : r y : r r r 0 r r r r : r r r r r r r : t r r r e r r r r r r r r r r r e r r r r r r r r r r r r y 0 r r r * > r r y : t u u u n / ' { ' { M.M.{ { m.F.~.T.T.T.T.P.^.~.T.~.(.~.~.(./.^./.(.~.(.(./.(.(.(.(.(._.(.(.`.(.(._.(.`.^.(.^.(.(.(.(./././././.~.~.~.~.(.~.~.~.~.T.~.~.~.(.(./.~./.~.~.~.~.T.T.T.~.~.~.T.T.T.T.T.T.T.T.U.T.T.U.Y.U.I.U.P.U.U.U.U.~ ! S HXZXZXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXVXGXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.o.X.:X0X0XwXuX6X .X.X.X.X.X.o.o.:Xj 2.x z Y c w 3 7 z ;Xd a a @ a g p @ 4 O h @ + < 4 g g 5 x g g + 4 @ + a - a g @ z z h h h @ h h p h 5 7 =X*Xk 4 4 5 @ g h h a x -X-X:X<.-.>.5.4X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX[ Q ^ P b.Z.F.Y.I.U.U.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.~.T.T.T.[.~.L./ ! ' fXDXFXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXSXyXtX,X,X>X1X4X4X4X1X>X0X0X0XwX0X0XwX9.,.,.,.:.;Xx j :X>Xl l :X5Xz z :X9X>.>.-.-.-.,.;.qX4.-.-.;.;.,.,.:.-X7 j z g k k s 2.k p u 6XiX/ k *X*X:X5 k *Xb 3X-Xz k k *Xp v k j k v v -Xz + + + O g + h @ + @ @ z +.O.X.X.X. .o.X.X.X.....X.X.X.X.X.o.VXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFX~ Q Q [ m.].dXdXvXzXzXzXzX.XzX.X'.dX.X.X.X'. X.X.X|.|.|.`.`.`.`._.`.^.(.~ / ! VXVXAXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX,X,X,X,X,X,X;X-X# O O k z p v p + k g z z a a 5 h a g p - 4 h f } s x aX8.3 2 } O.X.X.X.X.X.X.X.X.X.X./ ;X=.=.2 7 g sXsXw ;Xh z z g g 8.8.+ d h @ z z a z a v g 7 =.Y O...O...X.X.X. .O.O...! s O iX:X=X5X5Xs x b - a z a 9.qXz v 4X5XeXsX:X5XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXZXFXFXHX' ! Q _ n.].]./.(././.(./.(.[.(.(.(.(.{.(.^./.(.(./.(././.(./.~.~.[.~.].S ! } BXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXyX3Xj 2.s g 5.k h k -Xj k @ 8.kXg p =X=X=Xv v 5.k w a x z @ k f +.@.+ > X.@.a 7 1.i @ z sX8.4 > +.W + v O # # + h v f - l gXb O =X=X=X=Xz a ;Xz @ k =Xn h } O.O. .o.o.o.X...7XtX*X:XwX3X8X . .X.o. ...X.X.X.X.X.X.X.X.o.o. .X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXZXZXFXDX! S ! ` n.Q.!.T.T.U.T.Y.L.P.U.L.U.U.U.U.T.Y.U.L.S.S.L.H.H.H.H.G.S.S.A.Z.h.A.A.A.A.A.A.l.h.h.g.g.f.f.i.z.i.i.i.i.a.a.i.i.i.u.u.i.u.u.u.u.u.t.u.t.t.t.",
+"B C B C N N N C B C B B N N N N m V N V M N N N B N B B C V N Z B B B B Z C C C C C C C C C C C C C B C C C C C C Z C Z C Z C Z Z Z Z Z Z Z Z Z G Z Z Z Z Z Z Z Z Z Z Z G H Z Z D Z D Z Z Z Z Z Z C Z D D B G Z C Z F Z Z H Z Z Z J L Z L Z Z H H H Z Z Z Z P _ aXgXgXgXgXaXpXpX{ } ! ! n t y y > r y t : y : 0 r : e : r r r r r r r r r r r r r r r r 0 e r r r r r r r r e 0 r r r r r r r r r r r r r r r r : : r * r r r r t : r : ; : > e t y u u Q ' ' ' ' { { { { { n.F.U.~.~.Y.T.(.^./.(.[./.(.(.{.(.(.).(.!.(.).(.(.(.(._.(.(._._._._.(.(.(.`.{.^.(.[.(././././././.~.^.~.~.~.~.~.~.~.~.~.~.~.~.~././.~.(.K.~.~.~.T.T.T.T.T.(.~.T.~.T.T.T.T.T.T.T.T.T.P.P.U.U.P.L./ ^ Q ZXZXZXZXAXVXZXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXVXVXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.7X3X1X6X.. .X.X.X.X.X. .+.=.2 3 4 u eXiXe =.=.< z z n d + z n z   4 kXeX+ w eXM.O g sXsXz @ 8.kXO p :X3Xp w sXsXz + 2.=.O p -X6Xs 4 < 5XtXs w 2.k p - j 5.k d j 2.s <.-.-.<.1X<XFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBX' Q S Y b.F.F.U.Y.U.T.U.T.T.T.T.T.T.T.~.~.T.T.~.~.T.~.~.~.~.T.!.~.[.~.F.! ! _ BXDXAXZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXZXSXyX2X2X2XtX<X;X:X;X:X:X:X-X:X:X:X:X-X;X2.wX0X5.5X:X=X=XiX:X=X5XiX0X=X=X>X9X9X9X9X9X9X0X>X:X0X9X9X9Xj j 2.v aXKXw - sXKXp v v g S ! / / j j -X:Xg b l M.iXS a k k 2.p v k j s p k g @ d @ @ @ + a z g b v c }  . .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXZXSXQ Q Q m.Q.].dX'.'.zX.X.XdXdX'.dX.X.X.X.XdX'..X.X.X.X X X|.|._._.{.^.^.(.! ! ~ VXAXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX,X,X,X,X,X<Xg 5.k =.j s z z d a @ - @ l k 2.k p ;Xl a 7 8.7 @ @.} n + x @ 2 ;Xo. .X.X.X.X.X.X.X.X.X. ./ < < 2 < 4 z IXb @ w a z z z a gX8.4 v ;X, @ h ;X-Xp z 2 =.=.7  .O...O.X.X.X.X.O... .7X3X-XiX1Xs =X=X=Xb :Xj *Xv 5 s s + -X>X>XeXsX;XuXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXVXFXAXHX' ! Q ` b.F.T./.(.(._.(.(.(.(.(.(.(.(./.(.(.{.(././.(./.(.!./.~.[.!./.K.! ! / BXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXyX:Xv v z v g v g h b v v p < l 4 p j s s g v k v g + 3 4 a p & = @ g @ > - p 4 3 w h @ 4 O @ d > & a g + O O h a g - h h h h g k j s a g 5 z p @ a p f W  . .X.X.o.X.o...6X,XtX:X<.;.0X5X:X8XX. .6X6XX.X.X.X.X.X.X.X.o.o.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXSXAXGXZXVXDX! ! / Y F.Q.Y.^.T.T.U.U.L.U.U.T.L.T.T.U.U.L.L.L.L.L.L.H.H.H.G.H.S.S.A.A.A.A.A.A.A.A.l.h.h.g.g.g.f.g.k.k.g.k.i.k.a.a.i.i.i.i.i.u.i.u.u.u.t.u.t.u.t.t.",
+"B B B B B N C N B B B B M M M M M B B M V N N M B N B B N C N C B C C B N C C N C C C B C C C C C C Z C D C C C C D C C Z B Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z G Z Z Z Z L D D Z D Z D D Z Z Z Z Z C Z Z Z B D D Z D G Z D D Z H Z Z Z L Z H Z Z F Z Z P L Z U M.gXgXgXaXgXpXpXM.' ' Q t y : r y t y ; r r r r y : r r 0 * : y r r r r r r r r r r r r : : y r r r r r r r r r r r q * y r r r r r r r r r r r r r r r 0 : 0 : r 0 0 r r r : r r r r y r r e u u ^ / ' ' { { ' { { n.D.[.T.R./.!./././././.(./.(./.(.(.(.(._.(.(._.^.`._.`._.`.|.(._._.^.^.(.(.(.(.(./.^.!.~./.~.~.~.^.~.~.~./.~.!./././././.~./.~.~.~.~.T.I.~.I.!.~.L.~.T.T.~.Y.T.~.T.T.T.T.T.T.T.T.Y.T.P.U.Y.! ^ ~ ZXAXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXGXo.o.o.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.8X7 j k *X> } | % =.2 =.7 d sXv @ d eXn p z sX8.3 z sX8.4 p sX8.@ d sXM.6 s 8X8Xg z sXsX+ 4 2.2.4 s 6XKXk 4 g =X5X=Xw eXsX7 a 2.qXv d 2.5.k <.>.-.-.5.1XVXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXFXHXZXBX[ Q S ) b.Z.F.K.L.P.T.T.P.T.T.T.T.T.T.~.T.~.T.T.T.T./.~.T.~.~.~.^././.].! / ' BXAXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDX1X<X;X:X-Xk @ + *Xp + + *Xk p @ + *Xs v -X:X5X-X;X-X:XsXeXiX=XsXeX5X=X9XwX>X>X*X:X:X:X:X:X:X:X:X-Xk *Xa l sXn @ l sXn h z l g w 0 0 x b v -X-Xh b v | { @.l g v k d v -Xp | -Xs 4 =.n O 8.x O 8.gXv >X;Xo.o.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXFX~ ~ ! c.Q.hX'.zX@XhXzX.X'.'..X.X.X.X.X.X.X.X.X|. X.X|.|.|.|.{.|.(.`.(./.~ / ~ ZXVXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX2X<X<X2X,X1X>Xj 9.*X8.KXg l k 0Xs s 6Xw @ j 5.;Xk ;Xd a 7 n j a & & o 4 n + < 6X .X.X.X.X.X.X.X.X.X.o...x h - d h l w z 5 5 5 sXsX@ k p a + 4 x :Xn z g 6X8Xh z 4 2 3 2 - +.o.X.X.o.X.X...o.o.X.O.| v *Xs k s p d a 5.qXp d k k p b :X:Xn x ;X5XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXAXDXAXZXZXBX} S Q ` F.Q.^.~.(.(.(.(.(.(.(.(.|.(.XX(.(.(.(./.(.(./././.!./.!.~.~./.].Q ! [ BXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAX2Xx b -Xb ;Xb b k 5 w 7 7 j z a a g w n ' h g d d g a d @ g a p g @ g h @ + g z p p g k a z g a a @ @ g h z z h h h z g g d @ a h & w + h g p 4 g ;X:X7XO.o.o. . .+.| X.7X2X3X;X;X8.2.:X:XtXuX3X6XtXtX+.o.X.X.X.X.X.X...o...O.o.o.o.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXDXZXVXZX~ ! ! c.n.!.Y.T.T.T.Y.U.L.L.L.U.U.P.U.U.L.U.L.L.U.L.G.G.H.G.S.H.A.S.A.A.A.A.h.h.A.h.h.h.h.k.k.k.g.z.g.a.g.i.d.a.i.i.g.a.a.i.i.i.i.u.u.u.u.u.u.u.u.t.",
+"B A V N B N M N B B N m N M M M M M M B N N N B N B B B V V B V B B B C C C Z C C C B F C C B C u C C C B C C D C Z C Z C D C C Z B Z C Z Z C Z Z Z Z L Z L Z Z L Z Z Z Z Z G Z G B Z Z Z G Z Z Z Z D Z Z Z Z Z Z Z Z Z D D Z Z Z L J Z Z H Z H P G Z I m.gXgXgXgXaXaX{ { ' u c : e t > r r r : r : r r ; 0 0 : y * : ; r 0 r r r r r r r r e r r r r y : : r r r 0 r r r r r r r : r r r r r 0 r r r r r r r r r r r : : r r r e r r t : r 0 r r : * r y y e u u S c ' ' { { ` { { n.^./.R.R./././.(.(.(.(.(.(.^.(.(.(.(.(.(.(.(.^._.^._._.(.|._._.`.^.(.^.`.(.(.(.^././.~.(.~.T.[.~.!.~.~.~./.~./.~.~.~.~.~.~.~.T.~.~.~.~.~.L.R.Y.~.U.T.T.~.T.T.T.T.T.T.T.T.T.T.T.U.T.U.U./ ! S ZXAXFXDXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.o.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .o.3X2.j j j < w 0 2 =.2 2 7 d z p z g p p @ z p O a z p O a p z 5 @ d + + p p a z a @ h 5 + 5 O g + a s p p h 3 s s s @ 4 7 4 h h k p a a v -XwX5.;.>.4.1XZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXDXFXFXVXBX} ! Q P b.Z.P.U.U.P.T.P.Y.T.T.T.T.T.T.T.T.T.~.^.T./.T.T.~.~.[.~.T././.].S / _ BXZXAXAXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGX:Xk + + *Xp n x *Xs n x *X:Xa n n k v k 5 k k l x h *XsXeX=XiXsXeX>X9X,.<.1X0X,.-.,.:.uXwX,.1.>X:Xj j d a j 7 + g 4 j + z a a k g g a h h p - h k l 0 q t z z ;X*X;Xx z p W } z @ =.x k sXsX7 6XsXg <X+.O. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXAX~ ! ! M.m.hX'.zX#X'..XzX@XdX.X.X.X.X.X.X.X|..X.X|.|.|.|.|.|.|._._.(.(././ S S CXAXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3X>X2X2X,X:X:Xg k p 6 x < - j 9.*Xs :X} @ + g p p g + z 4 s O w 7 =.2 n KX8.{ o.X.X.X.X.X.X.X.X.X.X.o.6X2 1 sXv 2 7 g @ h h x gXn + z 4 z a - + + s + + a v p z d z z z 4 [  .X.X.X.X.X...O.O.X...X.+.:X5Xj l n 5 @ p k p v j 2.p b 5XuX=X*X*XtXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXAXZXDXZXDXBX[ ! ! _ n.].Q.(.(.(.`.(.(.^.(.(.(.(.(.(.(.(.(.(././.(./././.~.[.~.!./.F.Q ! ] BXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAX-Xg k 2X>X2X4X<Xv g 2 2 2 z k 5.-Xz ^ iXwXn k 2.k z o p k d g 7 2.< @ > d g p v k *Xz v k k g - d p p l d W c @ p :Xn + s -X} @ 4 4.x p z s :X-X*X8X+.o.o.o.o. .+.u 6X8X,X,Xb g 7 g h 4 b +.7X3X:X3XtX+.o.X.X.X.o. . .o...7X:X6X+.o.X.X.X.X.X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXFXDXFXVXFX^ ! S ` n.F.Y.T.T.T.U.P.L.L.L.P.P.U.U.U.L.L.L.L.H.H.L.G.H.S.S.H.S.A.h.A.A.h.h.A.h.h.h.h.h.g.a.g.a.a.a.g.i.g.k.i.a.g.g.i.a.a.a.i.u.u.u.u.u.u.t.u.t.u.",
+"B B C N N N C N N N N N M N M M M M M M M N B V B B B V B N M C B B C B C B B B C C u C C A C C N B C C C C C C C C C Z Z Z C Z C Z C Z Z Z Z Z Z Z G C Z L L Z Z Z D H Z Z Z D Z G Z Z Z Z Z Z Z Z Z Z G Z Z Z D D Z G D D D L S Z L Z S D Z Z S Z } gXgXgXgXaXpXM.{ ' S u y y r : e e r r r r r r r r r r 0 ; r t y : r : * r * : r r r r r r r r : 0 r r r r r r r r r r r r r r r r r r r r r r r r r r : r r : 0 : * y r r : * * : r r r r ; ; r = > e r r > : u u c ' ' ' { ' { b.F.~.T./.(././.(.(.(./.(.].(.(.^.{.^._.(.`.`.(.|._.`.|.(.`._.`.(.`.(.(.(./.(././.~././././.~./.~.!.(./.~./.~./././.~.~.~.~.~.~.~.T.~.~.~.T.T.~.~.Y.~.Y.T.T.T.T.T.T.~.T.T.T.T.T.T.U.U.~ Q ^ ZXVXFXFXAXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.o. .+.c g -X:X7 =.=.2 2 2 2 7 w p @ g p k k k 5 v v c @ a p a d p + @ a p a a @ p + @ a p p a 5 a a a z @ + @ g l d 4 4 g a z h g 5 z @ g @ d z 2X4X<.<.tX2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXFXDXDXAXBX[ Q S Y b.Z.F.Y.Y.P.T.P.Y.T.U.T.Y.~.T.~.~.~.~.~.^.~./.~.~.~.~.(.~.[./.L.! / _ BXZXFXZXFXAXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXv -X:X) -Xs n b p p n b a :Xk b b @ @ n n k k z n k *Xb v *X>Xc l :X>X9X9X>X-X0X9X5.9X5X9X-.5.1X;Xv k z v g j v v g j k k b p v k b s k *Xk v h g l g k g z v :X:X-Xz z v , - d z 4 + + w x @ v v v +. .X. .o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXZXAXQ ~ Q c.Q.].dXzXzX.XzX.X.X.X.X.X.X.X.X.X.X|.|. X|.|.|.|._.|._.|.(.(.^././ ! Q ZXAXFXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX1X<X:X-X-Xl @ 5 - z - @ a z p s p O s g @ O s g :Xv h z a @ z a z a 5 @ c x | O.X.X.X.X.X.X.X.X.o. .+.=.2 < kXn 2 7 w sXsX@ w l 4 w z < =.o f p O 6X-X4 4 z x g s -Xn + ' O...X.X.X.X.X.X.X.X.X.+.7X7X;X>X*X8.8.w a x x 4 v k v g b >X2X2X2XuXyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXAXZXDXZXDXBX' ! Q ` n.Q.(.(.(.(.(.|.^.^.{.(.(.(.(.(.(.(./.(./.!./././././.~.[.[.[.L./ / ' BXHXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXGXVXAXe b 7 :XyX2X2X>Xl z 2 2 =.w g 5.k a W ` W u g 5.k z p v k a k 3 8.=.@ g v f z v 2.0X@ k j j z z z c s k > +.W + g -X-Xz s -X6X- < =.b g g g =X;Xf 7Xo.X.o.X.X.O.| v ;X:X-Xb v 7 k KXeXj x +.o.O.+.8XtX+.X.X.X. .+.:X8X6X8XwX<.4.3XX.X.X.X.X.X.X.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXVXDXZXVXZX^ ! ^ ` n.].!.T.Y.Y.L.L.L.L.L.L.L.U.L.L.L.L.L.L.H.H.G.H.S.S.S.h.A.A.A.h.h.A.A.h.h.h.h.g.g.g.z.g.z.g.a.g.k.g.z.g.z.a.a.i.i.a.i.i.u.i.u.i.u.u.u.u.u.t.",
+"B B B N B N N B M B M N N N N V M M M N B N N M B B B B N V B N C C N C B Z B B C B B C C C C C C C C C C C C D Z C C C Z C D Z Z C D B Z Z Z Z Z Z Z Z Z Z Z Z Z Z G Z Z Z D D D Z D Z Z Z Z Z Z Z G Z Z Z D Z D Z D Z D D H Z Z Z J Z Z Z Z S ` hXgXgXgXaXaXM.{ ' Q u > > : y r : t : r r e r r ; = r r ; ; t r * * y : 0 : r y r r r 0 r r r r r r r r r r r r r r e r r r r r r r r r r e r r r r r r r r r r y * : r r : r r : r : r r : r : y r : e : 0 r > e y y > Z n ' ' ' ' c ' n.]./.(././.(.(.(.(.(.`.^.(.`.(.(.(.(._.(.`.`.(.`.(.|.(.(.`.`.(.(.(.(.(././.~.(.~././.~././.~.~.~.~.~.~./.~./.~.~.~.!.~.~.~.T.~.~.T.~.T.~.T.T.U.~.T.T.~.~.T.T.U.T.T.T.T.P.U.U.U.U./ Q Q ZXFXFXZXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.o.O.W +.+.b 7 =.=.2 =.=.< z :Xv O z b v k / M.iXQ z { - + 5 2.=.+ 5 2.2 + 4 x 8.4 d -X> o h :X:Xp 4 x 8.4 k - -Xf O @ *XsX@ 4 l n 4 @ *XeXa ,X<XwXwX2X,XFXFXVXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXFXVXBX' ! S J b.F.K.U.U.U.Y.U.U.U.T.T.U.Y.~.~.~.~.~.~.T.T.~.T./.~././.^.[.(.Q./ / ' BXVXFXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXx :X;Xx @ g h h h h @ h h k k a + k h n b a s g + O *Xk k *X=X*Xk *X*X-X-Xk *Xk *X*X*X*X;X0X1XuX;Xz n ] v *Xj z v k k -Xj j g v j j k j j -X-X+ p k k a @ + p p O v ;Xz - p 5 7 4 7 7 4 n sXv >X+.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXQ Q Q c.Q.].'.'..X.X'..X.X.X'..X.X.X.X|..X.X.X'.|.|.|._.|.|.(._.(.(.(.!.~ ! Q ZXFXFXHXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX<X>Xj 5.k h =.x 5 5 k ;Xv + g 2.-Xs b s h p j k :Xv g 5.k p 5.*Xw 4 kX7 < { O.O.X.X.X.X.X.X.X.X.o.O.6Xj =.4 z + 3 7 k HXn @ h a @ z z < =.4 v v p 8X3Xs z p p g k v :Xp c +...X.X.X.X.X.X.X.X. .6X:X:X:X0Xk < 4 4 d 8.8.w v v b b -X2X,X>XuX2XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXHXDXBX' ! Q ` n.].!.(.`.(.(.(.(.(.(.(.(.(.(.(.(./.(.(./.^./././././.~.!.~.~.].~ / _ BXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXSXSXGX7 n 7 >X2X<X2X2Xz @ 7 2 7 g b k v g u t q l v k v k a h @ h h + h a h a p - p v k v z v -Xv k p p - @ g - > & a h p d a a s z p h + 5 p h g s f W O.o.X.X.X.X...6Xb b x b b b z 8.IX9.x b 8Xo.7XyXuX+.o.X.X.X. .7XyXyX<X5X9.,.,.9X7X .X.X.X.X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXZXVXVXZX~ ! J ` b.F.].T.Y.Y.L.L.L.L.L.L.L.L.L.L.L.L.L.L.H.A.H.G.S.S.S.J.A.A.A.A.h.h.h.h.h.h.g.k.g.g.z.a.a.f.g.a.g.a.a.a.j.a.i.z.a.a.i.i.i.u.u.u.u.u.u.u.u.u.",
+"N B N V M M N N V m m M M M N M m m A m m m N B B B B m B B N G N C N C Z N B B Z N C B B C C C B Z B C C C C Z B C F C B C C C Z Z C F Z Z Z B Z Z Z Z Z F F F G Z Z D D D D D D D Z G C Z Z Z Z D D Z Z H H D J Z H H D H Z S Z F Z Z J Z Z m.gXgXgXaXaXpX{ ' S u u t r r 0 r r r r r r : r r r r : e r r r r r : r r r r r r r r r r 0 r r r r r r r r r r r e q r r r r r r r r e r r r r r r r r r r r r r r r 0 r r r r r r r r r r e 0 r r r r r r r r r r 0 r e r y u S u ' ' ' ' Q { m.(.(.~.~.{.^.|.(.(.(.(.(.(.(._.(._._._._._._.|.|._._._._.^.(.^.(.(././././././.~./.^./.~./.~.~.~.~.~.~.~./.~.~.~.~.Y.~.R.~.~.T.T.T.T.T.T.T.T.T.T.T.T.[.T.T.T.T.T.T.T.T.T.T.U.~ S ^ ZXZXZXDXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.....X. . .X. .X.X.o.W +. .o.7Xb 3 3 2 3 7 z yXl O k :XeX@ Q | { @.4 1.Y 5 < 2.2.5 4 2.2.5 4 x v 4 z ;X:Xw h 6X8Xk 5 7 b 4 k z ;X;Xz d k -Xk @ n 8.7 @ k -X*X:X>X2X2X,X,XVXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXHXFXBX[ / / Y b.n.F.T.T.T.U.P.T.U.T.U.T.T.~.~.T.T.(.(./.~.~.~.(.~.~.^./.[._.].! ! _ BXDXDXZXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXv :Xp @ @ w 5 z w + v w z @ g *Xl ;Xl @ @ a a z z z g v -X*Xg -X*X-Xv -Xv -X-Xv b k b *Xk -X;X3Xb ! eXiXf 7 j s a a - v k v z v v -X-X-X-X:X:Xa n g k n c O j =.O ;X:X@ | -XO =.2 2 2 2 sXsXp 6X..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVX~ ~ / c.m.]. X.X@X'..X|..X.X.X.X.X.X.X.X|..X|.|.'.|.|.|.`._._.|.(.(./.(.! ~ ! CXVXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX3Xj 4.s a =.8.g - -Xb z - j 9.:Xg 4.k z z v k *Xk g 9.:Xp 9.*X@ b HX2.n  .........O.O.O.O.O...O.6Xj @ a @ @ @ - z + a O 4 z } > + g z l + p - + k z p x a -Xn # d s @ 4 L O.X.X.X.X.X.X.X.X.o.| > > / @.c f b b - 4 4 @ b 5X3X+.+.8XtX,X,X,XyXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXFXBX' ! Q _ n.Q._.(.{.`.(.(.(._._.^.(.`.(.(.(./././.(.~.^./././././.(.!.(.].~ ~ _ BXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXl =Xg >X1X2X9.4.l h z d a g 5 a 5 g a h @ g 5 a - g @ a w g h p a w g h a a g z d - g p d - a h w 5 h k g h 5 a h a - d 7 7 7 g a z w 5 h j 6XX.X.X.X.X. . ...6XwX<.>.;.:.,.8.g 8.KX0X7 n 1X<X,X3X+.o.X.X.X.X.X.X. .+.X.6XwXqX0XwXo.X.X.X.X.X.X.DXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXFXVXVXZX! S Q ` b.F.T.Y.Y.P.L.L.L.H.L.L.L.L.I.L.H.L.H.H.H.K.S.S.S.A.H.A.A.z.A.h.h.h.h.z.g.h.g.g.f.f.f.f.l.z.f.g.j.f.g.i.g.a.a.a.a.a.i.i.i.i.u.s.s.u.i.s.u.u.",
+"B N B N B M M N M M M M m M M m m m m m m m B m m B B m N N B m C N C N N C Z N C B B C B C C C C B A C C C C C C D D C Z C F C C C Z C B D Z D Z Z Z Z Z D D D D Z Z Z G Z Z G Z H D Z L Z Z Z Z G B Z G Z D G S Z Z Z D Z H Z H P H Z S ' gXgXgXgXaXpX{ ' Q u y r : : r r r r r : r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r : 0 e r r r r r r 0 r r r r r r r r r r r r r r r e r r r r r r r r r r q e r r r r r r r r e r r 0 : r r r y u u Q / ' ' ' _ [ _.T.(.(.(.(.(.{.(.(.(.(._._._._._._._._._._._._._._._._.^.(.(./.(././././.[./././.^.~./.~./.!.~.~.~.~.~./.~.~.~.~.~.~.~.R.T.~.~.T.[.T.T.~.~.T.~.T.T.T.T.T.T.T.T.T.T.P.T.T.~ ! S ZXFXZXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXHXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X. .6X8X7X.. . . .X.o./ +.O.X.O.o.z 2.j h b @ z a p a w @ a w 0 * w h < e - 5 + 5 @ 4 4 5 4 h 3 s 5 g l g d d g z h 5 4 s + a w 7 l 3 h 4 g 4 5 2 3 3 @ < g p ,X2X2X,X,X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX' Q ~ I b.Z.H.U.T.U.T.P.T.Y.Y.T.T.T.T.~.[.(.~.[./.~.~.~././.~.~.(.[./.].S / / MXZXDXDXZXZXFXFXFXFXFXFXFXFXFXFXFXHXFXFXFXFXDXDXDXv *Xz @ z v l b 4 4 n 7 @ n x *Xv b z z a v h a z @ z :XuXuX>XtXtX1XyXtXyX2X0X,.,.,.1.wX>X-Xz @ @ S | } } k | =Xs -Xp @ p p a 4 4 s :XuXuX>X-Xz sXz + n v O q.2.4 -X:X- W } 6 2 2 =.2 2 k v x O...X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.o.X.X.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXDXVX! ~ / c.].]. X.XdX.X.X.X'..X'.'.|..X.X'..X|.'.|.|.|.|._.|.|.{.^.(.(.^.).~ ~ Q ZXAXFXVXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFX<X:Xv k v z O < h a a g p a p k g v k k l :X:X:X-Xz a k p k k v a - + O ~ +.X.} | | +.} | } W +.} 7 7 f } >   f p h 4 n x O u +.W @ b g @ a a k g @ p v v g v -Xs :X-Xp J [ +.X.X.X.X.X.X.X.o.o.W > } - W ..O.7X:X> > f c ;X1X+.o.O.6X5X,X<.:.wXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXHX[ ! Q ` n.Q.^.(.(._.(.(._.(.`.(.(.(.(.(.(.^./.(.E.^.^./././.!././.!.(.Q.S ! ' BXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX,X2X2X:X4.,.<.x d k *Xg a g 5.*X@ g 5.*X@ g 5.*X@ k ;Xv a g 4 5.< + l ;X-X@ g ;X, a @ } f @ w { o p *Xv } Q + @ ;X3Xp 4 3 2 4 d 8.l + l ;X+. .X.X.X.o.+.6X7XwX<.-.-.-.-.,.2.z z x 7 4 v >X1X3X+.o.X..... . ...o. . .X. ...O.+.X.o.o.X.X.X.X.X.DXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXZXVXFXFX~ Q ^ [ n.F.T.~.U.T.U.Z.H.H.H.H.H.L.L.L.L.H.H.H.H.G.S.S.S.Z.A.A.A.h.g.A.h.h.h.g.h.h.g.g.h.f.f.k.f.k.f.g.f.f.g.z.k.g.g.g.a.g.i.i.i.i.u.i.u.i.u.u.i.u.",
+"M N V M M M m N M M m N M N M m m m m m m m N B m B B B V u B V N C N N N C N C N B B B N C C C C A A C u C C C D C C C Z Z C C Z Z C Z Z C C Z Z Z Z Z Z Z D D D Z D G Z G Z D Z Z Z Z Z Z Z Z Z Z D Z Z Z Z Z F D Z Z D D Z G Z D Z G { gXgXgXgXaXM.' Q u y y * r : r r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r y r r r r r r e 0 r r r r 0 r r r r r r r r r r r r r r r r r r r r r r : r r 0 r r y u y u c n ' ^ ' ) K Q.{.[.(./.(.|.(.(._.(._._._._._._._._._._._._._._._._._.(.(.(.(./.(.[././././././././.~.!.~.~./.~.~./././.~./.~.~.R.~.T./.T.T.~.~.T.T.~.T.T.~.T.T.~.T.T.T.T.T.T.T.T.T.Y.~ ~ ^ ZXFXZXZXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .+.1X5XwX6X3X7X .X. .W +. . .O. .u 0X0Xo 7 k z d v z @ z j g h h g g g *Xj h w z *Xg w h h h z w h g @ z h h a @ h g d - a h l 2 3 7 l 2 < 7 z < 7 3 5 =.=.7 <.4.1X2X,X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBX[ Q Q _ b.Z.F.T.T.T.P.T.T.T.U.T.T.T.~.~.~.[.~././.^.~././././.~.^.[.(.Q./ / ' BXDXAXAXZXZXZXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXDXDXHXd 7 n 7 z :X8.8.4 l 8.7 5 n n a z :Xv x d ;X*X4 2.3 @ :X2X2X5.,.<.wXyX2X2X>XtXqXqX4.,.*XtXb v k *X- = = b f W / j j + | =Xp @ eXsXO v :X;X-Xv l a p + @ @ O 3 h + v ;Xw - , X 6 2 2 6 2 7 7XX.o.o.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXZXFX! ! ! c.m.].'..X X'..X|.|..X.X.X.X.X.X.X.X.X X.X|._.|.|.`.(._._.[.(.[././ S Q CXVXFXHXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXn v v v b v a @ h g v h a - w - - 4 g z h 4 7 v z a g a a w l v b v l n c f n f c n c f f n c n v z 7 > X.W + v v @ l 8.8.@ + , , @ 7 =.7 z @ h z w 7 4 x p k k O 6X3Xp 7 7 ) O.X.X.X.X. .X.X.O.+.z :Xa @...+.7X6X; } - f 4X3XX.X. .8XyX2X5.,.5.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXBX[ Q ^ _ n.].].(.`._.(.(.(.(.(.|.(.`.^.(./.(.(./././.(./.(./.(./././.(.F.! / _ BXHXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXyXtXtX4.:.5.:.<.x p j 9.*Xd j 9.;X- j 9.:X5 j 9.:X@ v ;Xh z k < 8.=.+ v 8X:Xd b :Xn p > +.W @ < 1.c.p k f +.W @ z 8X8Xh v k *Xh l aX8.s ;XX.X.X.X.X.X...6X5X,X:.-.-.-.-.-.,.2.b b -Xb b :X:X+.X. .o...+.<X6X8X6XX.....X.X.o.o.X.X.X.X.X.X.X.X.X.FXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXFXFXFXVXZX! S ^ [ b.F.Y.T.U.L.L.K.G.H.G.H.S.L.U.A.H.H.H.S.A.H.S.S.A.A.A.A.h.h.l.z.l.h.h.h.g.g.g.g.g.h.z.a.k.f.f.g.g.a.a.a.z.a.f.f.k.i.f.a.i.i.s.i.i.u.i.i.i.i.",
+"M M M M M M M N m M m m m m N m m m m m m m N m N m m N N V N V N A N C C N C N B C B Z C C C C C C B C B C C Z V C Z C C C Z Z C C C Z B Z C Z D B Z F Z Z B D D D Z Z Z D U D D Z Z D Z Z Z Z Z Z D D D D H Z D D G H H Z Z H G D S m.BXgXgXaX{ { / S u y e e e r r r r r : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r : * r r r r r r r r r r r r : r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r > > e y y u u c c ~ / n././._.(.^.(.(._.|._._._._.'._._._. X_._._._._._._._.(.(.(./.(./.(./.(./.(./././.^.~.~.~.~.~.~./.!./.~./.~./.~.~.T./.T./.~.~.T.~.~.T.~.~.T.T.~.T.{.T.T.~.T.T.T.T.T.T.~ ! ^ ZXVXZXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X.X. .X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .+.uX0X:.-.<.<X6X . .W +...+.O.O./ :X;Xv k g - @ z l n k -Xz b w + h x v *Xz ;Xg *Xw ;Xv O z n z + a -XeXa a -X6Xp p -Xf o g z z @ 5 @ h w l x z v v 5 3 2 h 0X;.5.4X,X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXBX} Q Q I b.F.Y.P.T.T.T.T.T.T.T.T.T.T.~.~.~././././././././.(././.^.(.~.U.J / _ BXDXFXZXZXAXFXFXFXFXFXFXFXFXFXZXFXZXFXFXFXFXDXZXGXd 8.8.x z -X+ 4 4 + 7 + w h h a g *Xn n d *Xk 3 5.7 - <X4XqX,.,.>.,.<.,X2XtX2X1X1XtX0X:X>X;Xk j j p l l l d > - a -Xd | } 5 d gX8.3 p z a z ;Xz x z v v a 5 - z p @ + @ z + n gX5 n KX7 3 +. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFXQ ! ! m.Q.hX'..X'. X.X|..X|..X X.X|..X.X.X|.|.|.|.|._._._._.(.^.^.(.(././ ! ! CXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX1X5.:.:.:.5.-X2.k z :Xv ;X-X2 3 n 7 < < n 7 7 l v j -Xk *Xk :XuX2X:Xv W O.O. .o. .o.O.o.O.X.X.o.v 3 2   > , O s - w a 7 4 - d z k a 7 2 4 g @ sX6X2 =.2 < z a d a f f - | ..X.X.X.X.X.X.X.X.X.X. .x n z @.| W ;Xv - ;Xw / 4X+...X.X.6X,X3XyX;.;.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXFXBX} ^ ^ [ n.].!.(.^._.`.|.(./.|.(.(.(.(.(.(.(./.(.^.(./.(./.(.(././.(.).]./ / ' BXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX5.;.>.:.wX4X4.<.v a a v b z a k g z a k g h p k g h h z a a a O a a z d d d z l l p z - > - z 4 < w < 4 + > , z a a z + -Xj j a l ;X;Xb O. .X.X.X. .X.6X1X1X:X-.-.-.-.-.;.>.9X4X2X<X+.O.+.O.O.X.X. .7X2X>XtX9.5.<X6X8XX... . ... . . .X.X.X.X.X.FXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXZXFXFXZX! ! ^ ` b.K.L.Y.U.L.H.H.H.H.H.H.H.L.L.H.H.H.S.S.S.G.A.S.A.A.A.A.S.h.l.l.h.h.g.h.g.g.g.g.g.a.k.a.k.k.g.a.f.z.z.g.g.g.k.f.a.a.a.a.i.i.s.u.i.i.i.i.a.i.",
+"M M m m N N m m m m m m m m m N m m m m m m m m B N m N V N N M N A C N N C B C N C B C N C C C C C C C C B C C C C Z C C D C C C C C Z C Z Z C Z Z C Z Z Z F Z Z Z Z Z Z H Z Z D D D Z H Z Z Z Z Z Z Z Z Z H D D D D D D H D Z Z I aXgXgXgXpXM.' n u y > : e : r r r 0 r r r r r r r r r r r r r r r r r r r r e r r r r r 0 r : r r r r r r r r r r r r * y : r r r r r e 0 r r r e r r r r r r r r r r r r r r r r r r r e 0 r r r r r r r r r r 0 r r r r r r r r r 0 ; 0 ; = r r : y u u n S ! f u [ !.[.`.^.^._._._.|.|._._._._._. X_._. X_._._.(._.(.(._.(.(.(.(.(././.(./././././.~.~.~.~.~.~.~././.~./././.^.T./.~.~.T.~.~.T.T.~.T.~.T.[.T.~.T.~.T.T.T.T.~.T.T.U.T.~ ~ ! ZXFXFXZXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.o. . .4X5.,.>.>.yXyX6X6Xu | Q } O. .} ;X:X:Xv w ' - + l sXa + z eXn @ d ;X6Xw l sXz a h eX;X  z n x a a k -Xg a 6XKXk z :X;Xz p z b ;XO x v o v :Xx g *Xp *XiX=X<X:.4.1X,X,XAXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXBX' ! S Y b.Z.F.Y.T.T.^.T.T.T.T.T.T.!.T.~.~./.!././.^.^././.(./././.(./.Q.S / ' BXAXFXAXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXDXl O O O h b v v @ 5 @ l b v x z l -Xg d p -Xz O h + w ;X:X;X5.2.2.2.0X3X2X,X,X,X,X>X1X:X>Xb l k v l 5 d @ 5 h g h ;Xv $ - a z @ O + z z + @ p a z z ;X-XS ~ + d n :X+ z x p sXsXO aXsX3 =.+.O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.ZXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXSXZXFXQ ! ~ c.Q.]..X.X X|..X|.'.|. X X.X|..X|.|..X|.|.|.|.}.}.`.^.(.(.(.(.!.(.! / ! CXVXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXyX9.,.-.,.<.j 4.g l ;X-XKX-X2 7 n 5.2 3 n 7 j l j 9.;Xg 9.b -X:Xv x c +.O.X.X.X.X.X.X.X.O. .O.6Xv a 6X-Xa v d p d - @ @ h x z n ;Xh v p + a x IXn O < < O -X, d x @.> ' > W O...X. .X.X.o.X.X.X.@.W W @.W  .o.7X6Xx n z f +.+.+.+.6X<X,X2X2X5.,.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXAXFXZX' ! ^ ' n.].].^.(._.^.{.^.^.(.(.`.(.(.(.(.(.^.(.(.[.(.^.(.(.(.(.(.(.(.Q.P / _ fXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.,.:.wX1X1X9.1.l a z w z l l @ z z h g z g z z z h g z x g @ z z z z z z z z l g l l z z z z v z z l a a d a z h 8 7 @ v v -X-X6X+.+.O.o.o.X.X.X. .7XuX<X+.:X;.-.-.-.-.>.9.3X+.X.X... .o.o.X.X.o.6X3X>X2XtX;.>.;.,.9X3X8X8X6X6X8X............o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXZXDXFXZX^ ~ S Y b.F.I.U.K.L.K.Z.S.H.S.H.H.S.S.H.S.S.S.S.A.A.A.H.A.A.h.A.z.h.h.l.g.h.z.l.a.l.g.g.g.k.k.k.f.f.f.f.f.f.f.f.f.f.f.f.a.f.a.a.a.a.i.i.i.i.i.i.a.i.",
+"m M m m N m N N m m m m N m m m m m m m m m m m m m m N m N N N N N N C N N B B C N C C C C Z C C B A C C A C C C C C C C C Z Z Z Z C C Z D Z Z Z C Z Z Z Z Z F Z L Z L H Z Z Z D H Z D Z Z H Z Z G Z Z Z Z D D D D Z F Z H S Z S gXgXgXaXpX{ ' S u e r : : y y * r r r 0 r r r r r r r r r r r r r e r r r r e q r r r r r r r * r r r r r r r r r r r r y * : r r r r r r r r r r q r r r r r r r r r r : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r : y y y y S n S u u ) !.{.(.|._._.{.`._._._._._. X_._._._.|._._._._._._._.(.(.^.(.(.(.(././.(./.(./.~.~.~.Y.~.~.~.~././././././.~./.T.~.~.~.~.~.~.~.~.T.T.~.~.~.T.~.~.~.~.~.T.T.T.T.T.~ ^ ^ DXVXZXZXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXo.o.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.O.+.0X,.>.5.j -X*Xv p @ @ / o.X.o.} Q x v v 3 9.q.@ d + a @ + s *Xg @ a v + 5 O O + - p z + z 5 @ p h a k d a s z a h l n a h z ;X:X# ;XsX@ v *Xb sXl @ wXiX-X9.,.4.uX2X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXHXBX[ ! c Y b.Z.K.Y.Y.T.P.Y.~.T.~.T./.~.~.~.~././././.!.(.(./././././.(.~.].! / _ BXZXAXFXZXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXd j 5.k z 5.9.v 5 z l d 5.9.b v b f > > ! v h @ v b ;Xv b d d d z n -X:X3X2X,X,X,XtX1X:X:X:Xv z z l v n - O sXaXp w x ;Xz z v g z v b 4 4.s O sXsXw ;X-X+.+.+ - } +.& l :XO p @ O 4 + O 7 +.O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.GXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXZXVXQ ! ~ c.m.].|.|..X'..X|..X.X|.'.|..X X'.|..X|. X|._._.{.(.`.^.`.`.(.(.(./ S ! CXVXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXyXwX;.,.:.0X-X-X-Xv l k v O 2 2 s O 2 2 s O 2 g k *Xv s -Xk h b x +.X.X.o. .X.X.X.X.X.X.o. .7X=.7 z KX<X@ -X-X/ f o d p -X;X@ + O h z - d p O w 4 O } / a eXn -X;X> z ;X- W ..O.X.X.X.X.X.X.X.X......... .X...o.+.W W @.W W N | ! :X*X:X>X>X,X:.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBX' ! ~ [ m.].{.(.`.`.{.(.|.|.(.(.{.(.(.(.(.(.|.(.(.(.(.{.(.(.!.(.(.(.^.].! / [ BXDXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXwX5.wX1X,X1X9.<.b k k *Xp + p *Xg h a a + @ p p @ @ @ p p a p p p a + p + @ @ a p p @ p - @ a p p p a z k :X-Xa h 0XwXg b v ;X7XX... .O.O.X.X.X.X.6X<X6XO.O.sX,.-.-.-.;.9.<X+.o.o.X.o.X.X.o.X. .+.<XtX2X<X<.-.-.;.<.wX1X<X>X4.>.5.3X8X6X8X6X8X+.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXFXZXFXDX^ ~ ~ c.b.Z.K.L.J.H.H.H.S.A.S.A.S.H.H.H.S.S.S.A.A.H.A.A.z.A.A.h.h.h.h.h.g.k.h.g.l.f.g.g.g.k.f.k.f.f.g.a.f.f.f.f.f.f.j.f.f.a.i.a.a.a.f.i.i.i.a.i.a.a.",
+"N m N m m m m m m m m m m m m m m m m m m m m m N m N N M M V N C N N C N N C B N C C N C N N A C A A C C C C C C C C B C C C B B C C Z Z C C C Z Z Z Z Z Z Z A L Z Z Z Z Z Z Z Z Z D D Z L Z Z Z Z Z Z H D Z Z Z H Z Z D L ! ' gXgXgXaXM.{ _ S : y ; r r : ; ; r r r * r r r 0 r r r r r r r r r r 0 r r r r r r r r r r r r r y r r r r 0 r r r r r r r r 0 y r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r e r r r r y y > ; y y u S c u u n S !.(._._._.^.`._._._._. X_. X X_. X_._.`.`._.(._.(.(.(.(.(.(.(.(./.(./././././.~.~.~.R./.~.~.~.(.~./.~.~.^.~.E.~.~.T.~.(.~.~.T.~.(.~.~.~.~.T.~.~.T.T.T.T.T.T.Y.~ ~ Q ZXFXFXFXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .+.<X9X0X2X=X:X;Xa s >X;XW O.X.X.O...+.3X;Xw w u > c z b v z x b -Xp pXl l - -X> + v v b b z z j k g - h k h - a 5 g w z - d h + v O p p O v -Xa g + h g k p 2.5.tXyXtX>XBXVXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXBX} ! S _ b.n.K.Y.Y.T.~.T.T.~.T./.T.~.~.~././.!./.!.(.~.~./.(.~././.[.(.].~ / _ BXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXDXDXz j 9.-Xz j j @ z n w d ;Xb x :X4X@.u c > 8X:Xv k >XqX<.1Xj 2.< - z v l b tX2XyX2XtX>XtX*XtX-Xk *Xa x lX8.z gXn g j -X:Xp g -X-Xw - z @ kXb + aXeX+ v s o , a d , , o + + O j =.+ h n sXv 7X..o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.ZXAXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFX~ Q _ c.m.].`..X.X|.|. X|..X|.|.|.|.'.|.|.|.|.|.|._._.^.(.(.(.(.(.(.(.~./ / ! VXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXyX1XwX5.0X4X2X1X5.4.v ;X2 2 2 2 2 k < 2 2 2 z v <X2X:X:Xl b b 6Xo.o.X.X.X.X.X.X.X.X.X.X.X.X.+.7 4 a v p - :X} +.W p v c -X;Xz l z z a p v n 3 =.< n ..W + x p + h ^ n n d | +.O.X.X.X.X.X.X.X.X.X.X. . .X.X. . . ... .....O.X.O...3XuX*X:XuXtX:.FXFXFXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXZXVXBX} ! ! [ F.Q.].(.(.`.(.`.{.^.(.|.`.^.|.|.(.(.(.^.{.(.(.(.(.(.(.{.^.^.`.T.! ! ] BXHXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGX3X4X3X<X,X1X9.<.z l x -Xz x x *Xv p x x - 5 s <X-X5 k iX*Xa d 6X-Xa k :X, - k 6X-X@ g :X, + d } n + z l z 6X:Xa g -Xn -X8XX.O.X.o.X.X.X.X.X.X...7XtXtX6X6X6XtX>.>.-.,.9.3X+.o.X.X.o. .X.X.o.o.7X<XyX1X,X<.>.-.-.>.5.1X<X,X2X0X9XwXyX>X>X>X2XyX8XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXVXZXFXSXFX~ ~ ~ Y b.n.K.U.L.S.H.A.S.A.h.H.A.H.S.H.S.A.A.A.A.A.A.A.A.A.h.A.h.h.g.g.h.f.f.a.f.h.g.f.f.g.z.a.k.f.k.a.f.i.f.f.a.f.f.f.f.k.a.a.a.a.a.a.i.a.a.a.a.a.",
+"N m m m m m m m m m m m m m m m m m m m m m m m m N m m M M V N N C N N C N N B N N N C N C C C C C C C C C C C C C C C C C C C Z C C Z Z Z C Z C D B D B Z Z Z Z Z G Z H Z Z G G Z D D Z Z H Z Z D Z G Z Z Z H Z D H G D S _ BXgXaXpXM.' n : > : ; ; e e ; ; y r * r r r r 0 e r r r r r r r r r r r r r r r r r r r r r r r e r r r r r e r r r r r r r r t * y : r r r r r r r r r r r r r r r r e q r r r r r r r r r r r r r r r r r r r r r r r r r r r r * r r r r 0 ; r r r : : : ; y : : > A y ! : y S (.(._._.|.`.(.|. X_._._._._._._.|._.{.|._._._._.(.(.(.(.(.(.(.(./.(././.~.~.~.~.~.~.~./.~././.~././.^.~.(.(.~.~.(.~.T.~.(.[.~.~.~.~.T.~.~.T.T.T.T.~.~.T.T.~.~ Q S ZXVXFXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXGXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.7X3X2X-XKXKXz z KXKX} +.o.X.X.O.X.o.n | O.o.O.} { +.KX*X:Xn @ a KX:Xd l ;X:X% :X1X1XuX-Xx v *X5 eXg *Xg n l + h -X:Xs z @ eXn - n l + b x z c x g @ w -Xv v wXm.wX5XVXHXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXZXCX] Q Q I b.H.K.Y.Y.~.T.[.~.[.~.~./.~.~./././././.^.(.!.[./././././.[./.F.S / ' BXVXFXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXHXz @ k h z =.k s @ < O z v b b <X3Xf x ;X, :XuXyX:Xk ;X0X2X7 8.=.d 3X1X-Xl ;X,X2X,X>XuXuX*X>X;Xj j a z ;X:X@ z h 7 j -X-Xg :XuX;X5 eXsXO 8.x % l i t z h l @ z @ z v b b b 4 q.2.4 - gXKXg +.O.o.o.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.AXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXZXFX! ! / c.n.].].@X.X|..X|.|.|.|.|.|.|.|.|._.|. X_._.|._._.(.(.(.(.(.(.)./.~ ~ ! CXVXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXyX<X1X1X1X2X5.:.>.<.l l 2 2 3 6 2 d :Xk 2 =.z >X:X:Xv l v 6X+.+.o.X.X.X.X.X.X.X.X.X.X.X.X.X.7X8 7 5 @ @ z -Xd , , O p - z k h 5 h a v z a - O 2 7 a > , < 2 5 -X:X, W @.@.} 6X..X.X.X.X.X.X.X.X.X.X.X. .X.X.X. . .+.X.X.X. .X. ...6XtX>X:XyX3XqXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXFXZXCX_ S ! [ n.].].`.{.`.(.^.).{.`.^.{.^.|._.|.(.(.{.|.(.(.(.(.(.^.(.^._.[.].! ! ] BXHXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXyX5.9.1X<X1X4.<.z v <Xx w b n @ w k v n k a v KXKX5 k iX>X@ v 6X<X@ v 3Xn a z 8X:X@ v :Xn @ > +.W + z l p v -Xz 6X+.+.+.o...O.X.X.X.X.X.X.X.X...8X2XtX1X<X,X3X0XqX5.qX3X+.o.X.X.X.o.X.X. .o.+.<X2X2XtX<.-.-.-.>.>.5.1X,X2X,X1X2XyX,X,XtXtX2X2X<XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXDXFXFXFX^ ! ~ ` b.F.S.U.U.D.H.F.A.S.A.A.h.H.S.S.S.A.A.A.A.h.A.g.h.A.l.h.h.h.g.z.f.g.g.g.g.a.g.g.g.k.k.f.f.f.a.f.a.f.a.f.z.x.j.f.f.f.g.k.a.a.a.a.a.a.a.g.a.a.",
+"m m m m m = m m m m m m m m = m m m m m m m m m m m m N M M N N N B B N B N V V N C N C C N C C B Z B B B Z B C C C C C C C C C C C D Z Z Z Z Z C A Z Z F D Z Z Z Z G Z Z D D D Z S Z Z Z Z S Z G Z D Z D D D D Z Z J D Z _ gXsXgXaXM.' S u r y y : r r r r r r r r r r r r : r r r r r r r r r r r r r r r r r r r r : r r r r r e 0 r e r r r r r r r r r r e * r r r r : r r r r r r r r * r r 0 r r r r r r r r r r r r r r r r r r e 0 r r r r r r r r r r r r r r r r r r r r r r r r r r : y y r u u > u S ].^.|.(._.|.|.}.}.}.}._._._._.|.{._.{._._._.(./.^.(.(.(.(.(.(.(.(.(.(././.~.!./.~.~.~.~./.~.~./././././.(././.~.~.(.T.(.~.(.T.~.~.~.~.~.Y.T.!.~.T.~.T.T.T.~ ~ ~ ZXVXZXZXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.+.o.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.7Xv -X-Xz @ k k b 6X+.X.X.X.X.O./ / O.X.X.X.O. .o.v b v k k -X-Xk v -Xv W o.+.6XyX-X;X:Xe z sXz + a ;X:Xt a 6XKXk k - <XsXp ;X:Xs 1X<X_ iX{ - n z :X:Xk ;XsX;X>XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXCX[ / ~ U b.F.K.T.~.T.Y.~.~.~.~.~./.T.~././././././.^././././.!.~.(.^.~.K./ / _ BXZXZXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXHXz d @ @ d 8.sXz ;Xx v b 6Xo.+.6X3X/ n n > 6X>X1X2X:Xv ,X1XO O O - :X2XyX;Xz b <X<X,X2X2X:XtX:Xg v g ;X:X:Xb h z s p -Xv z ;X3X;Xh gXn z 7XX.o. . .O.| l n @ 5 b gXz :X=X-Xp 5 h 4 - + + g +.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.AXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZX~ ! ~ [ m.'.}.|. X.X X|. X X|.|.}.}.}. X|.|.}.}.}._._._.`.(.(.(.(.(.(.!.~ ! ! CXAXFXHXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFXFXFXFXFXFXyX1X,XyX5.,.;.9.4.2.3 l 6 - d p < v KX-X2 2 h :Xz x n } +.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.O.o.+.2 2 7 x 4 h p 6X-Xs z p g v v l < =.7 w l d d d d 5 5 h a w h h 8X8Xh l } 7XO. .o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X...6X>X:X:XtXtXuXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXFXAXCX' ! ! ` m.].].`.(.`.{.(.`.^.|.{.|.(._.(.|._.|./.).(.(.{.^.`.`.^.^._._.].~ S } BXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDX3X1.<.1X,X2XwXwXz @ l a h @ a a g a 5 @ p h a k g h h k g @ p z h p z l @ g h z g a z l p h - f f d f z z 6X+.+.X.X. .O.o.X.X.X.X.X.X. .X.X.X. .X.+.X.+.o.+.+.+.o.+.+.O.o.o.o.o.X... ...7X6XwX<.0X4X<.-.-.-.<.qX>.5.1X,XyX2X2X,X2X1X4.,.;.5.tX9.ZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXGXDXZXZXS ! ~ Y b.n.G.T.P.G.H.G.A.A.A.A.S.H.G.A.A.A.A.A.A.A.A.l.l.A.l.h.j.j.f.j.z.f.z.a.z.a.f.f.k.k.f.a.k.f.a.a.a.f.k.j.a.s.f.f.f.f.f.a.i.j.a.a.a.a.a.a.g.a.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m N N M N V V N N N V B N V B B N C N N C B C B C B Z C N C C N N C C C C Z C C D Z C C Z B D Z Z D B B Z Z C Z Z Z Z D D D D Z Z Z H Z Z H Z D D D D G Z Z G Z H Z Z J gXgXhXpX{ ' Q y r r r = y r r r r r r r r q e r r r r r r r r e r r r 0 r r r r r r r 0 r r r r r r r r r r r q y r r r r r r r r r r r r r r r r r r r r e r r : y r r e r r r r r r r : r r r r r r r r r r r r r r r r r : r r r r r : r r r r r r r r r r r r r r : r y u > u n y y A ].(.{._.{._._.}.}.}._._._._._._._._.^.|._._.|.(.(.|./.(.(.(.(.(./.(.(./.~.~.~.~././.~.~././././././././././.(.T././.~.(.~.~.~.~.~.~.~.~.~.~.T.T.~.T.T.T./ ~ ^ ZXVXVXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.o.o.o.X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.+.+.;Xl @ @ v k W o.X.X.O.../ } X.X.X.X...O.O.O.+.:X1X2X<X<X<X,X:X+.O.o.O.o.O.-Xk v a 4 $ l d z g k a 5 s z p h z s -Xg v b k uX8X| sXW 5 sXv h ;Xk 9Xx v >XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX' Q Q P b.F.L.~.T.(.~.~.!./././.~././.~./././././././././././.(.~.[.~.].S / ' mXDXDXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXd j 5.*X- < x 3 w b 8XX.X.o.O.X.X.W W f W :X2X>X2X1Xk :X1Xj 2.< @ :XyX2X2X;Xl :X1X<X>X>X:X>Xv d z g g h a 4 sXsXh sXsXs z b ;X- + @ a | O.X.X.o.o. .| 4 h h z lXsX# -X> o z a a a 4 n aXb 8XX. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXVX~ ! ~ c.n.Q.|.|..X'.|. X{.|.|.|. X X}.|. X|.}.}._._._.[.(.(.(.(.(.(.(././ ! ! VXAXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXDXSXAXDXFXFXFXFX1X4.:.:.>.4.2.2 2 2 2 5 z d f v j h v g 2 2 d n v 6Xo.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.o. .O.[ 7 2 2 x 8.j @ v KX:X+ z z z 7 4 2 2 7 2 2 7 a -X-X  d p 5 p -X, # h g 5 c ;X3X6X . .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...8X5X>X>X5X5XuXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXAXAXBX[ ! ! ` n.].'._.(._._.(.^.`._.`._.|.{._.(.|.^.|.^.(.(._.(._.^.(.`._._.!./ / ' BXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXwXwX1XyX,X1X2Xx @ @ h g p p @ g h - z h g 5 @ z g @ k k g 4 z 5 g w @ w g g a 5 g v v b b v :X+.} O./ /  .X.o. .X.X.o.o.X.X.X.X.X.X. . .X.X.X.X. . .o.o.o.O... .o.O.o.o.o. .o.+.8X6X6X>X<.:.,.5.4X:.-.-.>.5.2X<.wX2X9.:.5.1X,XtX1X0X;.,.-.<.5.SXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXZXZXFXFX^ Q ~ Y e.Z.l.G.H.H.A.H.A.A.Z.A.h.J.A.A.A.A.A.A.h.l.g.h.A.h.l.h.z.k.k.g.f.f.a.k.g.g.f.f.a.f.k.f.f.f.f.f.a.a.a.a.f.f.f.f.f.f.f.f.g.i.a.g.g.a.g.a.a.a.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m M B N N N N N N B N N N B B N C B C C B Z B C C C C B B C N C C Z C Z C Z C C Z Z C Z Z B Z Z Z Z Z D B Z Z Z Z Z L Z D D H Z J Z H L Z D D D D Z Z L Z U Z Z S aXgXgXpX{ ' c y e : * ; r r r r r r r r r r r r r r r r r r r r 0 r r r r r r : r q r r r r r r r r r r r r r r : * r r r r r r r r r r q e r r r r r 0 r r 0 * r r r r r r r r r r r r r r r r r r r r r * : r r r r r r r r r r r r r r r r r r e q r r r r r r r r r : r ; y u y u y 0 e S _.(._._.|.}.}.|.|.}.}.}._._.{._.|._._.|.^.`.(.(.`.(.(.(._.(.(.^.(.(./././.~.!.!.~./.~.~.^././././.~./.~./.(./.T./.~.~.~.~.~.~.T.~.~.].~.T.~.T.T.T.T.T.~ ! S ZXVXZXZXFXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. . ...7Xb z b k k | ..o.o.O.O./ } O.O.O.O.+.+.X.X. .X.+.+.+.+.+.+.X.X.X. .X.X.o.o.+.8X:Xu M.iX/ z @ - a g w @ a h x b :X:X:X:X:X:X;Xq = = h O O s :Xb =X*X-X5XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXHXBX[ Q ^ ) b.Z.L.~.T.T.~.(.~.~.[./.~./.~./.~././.[././././././.!.!.(.^.(.].Q / ' fXDXFXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXFXd j 9.-Xg z p z v ,X7X .X.X.X.X. .O.O.+.+.+.o.6X2X,Xk -X4X7 8.=.z :XyX2XtX1Xb ;X:X>XuXyX:X:X*X2.*Xa v *Xk a gXn + kXn O z z l k 8.h f O.o.X.X.X.X.X. .8X1X:X@ + < + ;X6Xa - / =XO 2 aXsXa <Xo. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.O.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXQ Q ~ c.n.^.|.}.|.'.|.|.|.|.|.|.|.}.}.}.}.}.}._._._._.(.(.(.^.(./.(././.~ / ~ CXVXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXDXAXDXAXFXFXFXFX5.;.<.4.2.< 3 2 3 - d + h @ a - < 2 2 2 z v c +.+.O.X.X.X.X.X.X.X.X.X.X.X.X. . .X.X... .+.=.=.2 2 7 b h h a v k + z 2 2 2 =.2 [ ..7 =.7 d KX3Xp x v 5 x 3X6X< =.3 v } +. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X. .6X5X=X:X:X*Xk 5XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXGXAXAXBX} ! / ` n.K.]._.(._._.|.^.^._._._.(.|.|.`._.|.`.^.|.(._.(._._.`.`._._.].S / ' BXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXyX<X2XtXtXtXyX,Xz *XiX-Xw s >Xv w g z x w @ z ;Xp @ x x *Xv 4 n l + 7 n =.w s :X, @ :X,X>X8X+.O. .hX7X} { X.X.X.X.X.X.X.X.X.o. ...X....... ... ..... . ..... ........... .7X8X8XwX<.0X1X,X:.;.>.5.1X:.-.-.-.-.,.5.4X2X:.,.4.4X4.:.5.<X<.-.>.4.4XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXFXDXZXVXFX^ ! ~ Y b.n.H.D.H.H.h.Z.A.A.j.A.A.A.A.A.A.A.h.A.h.A.l.h.h.g.h.k.f.z.k.f.a.z.k.k.k.k.k.f.f.f.f.f.f.f.j.s.a.s.a.f.k.z.f.a.k.f.f.j.a.a.a.a.a.a.f.a.a.a.",
+"m m m m m m m m m m m m q m m m m m m m m m m m m m M M M M M V N N N N B B N C N C B N N B B C N C B B B C C C B C C C C C C C C C D B A D B Z F Z Z C C Z Z Z Z Z Z Z Z Z Z D H D S D Z L Z Z D D D D H Z L Z H Z J m.gXaXpXM.( n y y r : ; e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r * r r r r r r r r r r e r r r y r r r r r r * r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r 0 e r r r r r r r r r r e : : > y t u e > * ` _.|.|._.}.}.}.}.}.}.}.|._._.}.^._.|.(._.{.|.(.(.(.`.(.(.(.(.(.(.(./.(././.~.~.~./.~.~.~././.~.~./.~./.~.~.(.[./.T.(.~.~.~.~.~.~.T.T.T.~.~.T.T.T.T.T.~ ! ! ZXVXFXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.v x sX@ @ | +.+.| n } x ] | | W | u +.X.X.X.X.O.X.O.o. .o.X.X.X.X.X.X.X.O. .+.6XS / { @.- x l + z x l p -Xh h k v d : g w z 5 5 @ O *X>X-X:Xb wXKXwX5XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXBX} Q Q ` b.F.].~.~.~.[.~.[./.~././././.~./././.~./.(.(././.~./.^.T.(.(.!./ / _ BXDXAXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXz g k p l k k z >X7X+.X.X.X.X.X.X.X.o.O.O.......o.+.{ } O.O p O @ <XuXyXyXyX;Xv x 8.,.<.:X2X*X9.0Xd v j j p z 5 + l a + a a d v aX8./ o.o.X.X.X.X.X. . .3X;X5 8.sXO l k a - | } 4 2 g k k 7XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X...FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXZXFXQ Q / c.m.]._.}.|. X|.|.{. X|. X}.|.|.}.}.}.}.}.|._.(.(.(.(.^.).(././././ S ~ VXVXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXAXDXFXFXFXFX2.j 3 2 < k :Xk k z v v 5 l 2 h x v v b c :X+. . .X.X.X.X.X.X.X.X.X.X.X.X.X. ...o.O.+.[ 2 2 2 6X=.-X<X:Xv x h z @ z 2 =.2 =.K X.q.2 2 7 p z v O p > @ z x z < < 7 -X>X7X .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X...6X5Xv l k g g *XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXFXHX] ! S ` m.].!.'.`._._.(.`.{._.|._.|.(.(.|._.(._.`.{.[._.[._._.`.(._._.].! ~ _ BXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGX5.:.:.:.:.:.4.yXl *XiX*X@ -XKXKXz k b n z @ k KX5 + l eXn @ v 8.8.@ 7 b n 5 n :Xn @ b 5X6X . .o.O.hX7XX.o.O.X.X.X.O.o.X.X.o. .O.....6X8X6X6X8X8X6X6X6X6X6X8X6X8X6X6X8X6X6X<X<.:.;.<.tX2XtX:.-.,.5.1X:.,.>.>.<.qXwX2X2XwX5.wX2X<.,.-.:.-.-.:.wX1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXVXZXZXVXZX^ ! ! Y b.Z.H.H.H.G.A.Z.A.A.A.A.j.A.h.A.A.A.A.h.A.l.A.h.h.h.h.h.h.h.k.k.f.f.k.a.g.k.f.f.a.f.a.i.k.i.f.f.f.k.f.f.s.s.f.f.f.a.i.i.f.g.f.f.g.g.k.f.z.z.",
+"m m m m m m m m m m m q m m m m m m m = m m q m N m m N M M N N N N N N B B N N B B M M V C N C C N C C C B C C C B C C Z C Z Z Z C C Z C Z Z C Z C Z Z C Z Z Z Z Z G C Z D D D Z D L Z S H Z H H H Z L L D L H Z H [ gXaXaXM.' S y y ; r r 0 r r r r r r r r r r * y r r r r r r 0 r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r e r 0 r r r r r r r 0 r r r r r r r r r r r r r r r r r r r q y r r r r r r r r e 0 r r r r r r r r r r r r r r r r y e y e y r : 0 b._.{._.}.}.}.}.|._._._._._._._.{.}._._.{.|.(.^.(.(.^.{.(.(.(.(./.(././.~././.~.!.~././././.~.~.~.^.~./././.T./.(.~.~.T.T.~.~.T.~.~.T.T.T.T.T.T.T.T.~ ! ! ZXVXFXZXFXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.v a - p a ! | W z ;X-Xa 4 2 eX8.O ;X7X .o.X.X.o.X.o.o.X.X.X.X.X. .X.X.X.X.X.X.O.+.N @.c 5 :XeX@ @ :X;Xz :X@ x k *X@ v n 4 w x z @ @ wXiX-X-Xk eXsX;X>XHXJXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX' Q ! Y b.F.F.!.T.~./.(.!.(././././.!././././././././././././././.(.[.!.S / ' BXVXAXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXv x - d g k 2.s } ..X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.O.7Xo. .S f =X+ -X-X-X>X,X<X:Xx -X2.5.:X:Xk g g h v -Xv z 5 5 h p b z g v x O x z > O.o.X.X.X.X.X. ...8X:Xw KXaX3 @ w z + , - 3 =.7 6Xo. .X.X.X.X.X.o.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.o.o.X.AXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVX! ! ! c.m.].}.}.}. X}. X X|. X{.|.}. X X|._._._._.^.^.(.(.(.^.(.(././././ / ~ ZXAXAXFXFXFXFXFXFXGXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFX2 7 sXh k -XKX-X4 + p - < l v c +.+.+.+.X. .X.X.X.X.X.X.X.X. .X.X.X.X.X.....O.+.+.+.2 =.7 7 +...j b b v z k z c v 2 2 =.=.2 2 2 2 =.2 7 7 2 5 x z h j 5 + - z @ - -X8Xo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.7X<X5XeXpX:Xb v 5XHXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXAXHXBX} ! ! ` n.Q.|._._._._.|.^.|._.^.|._.|./.`.^.|.(.{.(.|._.(._._._._._._.!.! ! ' fXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX9.>.>.,.,.-.>.4.x p k g h p v a h h @ @ a h h v @ h 5 x a a + 4 4 a 4 s p 4 z z 5 - *X6X+. .X.O.O.fX7Xo.O.X.X.X. . .o.X.7X8X6X6X6X6XwX<.wX>XtX<.:.:.:.;.:.wXuX>X>X<.,.;.;.;.>.>.>.5.1X2X2XqX-.>.5.tX9.5.qX5.tX4X,X1X<XyX1X2X2X<.>.>.-.-.>.4.4X5.ZXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXFXZXVXZX~ ! ! Y e.n.S.H.H.A.A.A.A.h.l.A.h.A.A.A.A.h.A.h.h.A.A.h.h.z.g.g.f.f.f.f.a.k.a.g.z.i.f.f.k.a.f.a.f.f.f.a.k.f.a.f.f.f.g.a.g.d.g.a.f.g.a.a.g.a.a.f.a.g.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m M M V N M V N N N V B N N B V C C N N V C N N C N C B N B C C C C C C C Z C Z Z Z A D Z Z D Z Z Z Z Z C Z Z C Z D D D D Z H Z H H H L Z Z Z L J L D H D H _ gXaXaXM.' n y e e e r r r r r r r r r r 0 r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r q e 0 e r r r r r r r * r r r r r r r r r r r r r r r r r r r r r r y = r r e e > y y e : % y ].(.|.}.}._.}._.|._.{._.[._._._.(.{._.(._.(.(.(.^.`._.(.(.(.(.(.(.(./././.~./.~.!.~.^.~.~./.~.~.~.~.~.).XX/.T./.~.T.~.~.T.(.T.T.~.T.~.~.T.~.T.Y.~./ ! Q ZXVXFXZXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXGXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .o.:Xv z c l } O.O.S KX<Xd 7 4 gXM.O -X1X7XO.....o.o.X.o. . .X.X.O.7X6Xo. . .X.X.X.X.o.o.;Xa p - @ d z k z -Xa ;XsXz w 8.8.7 a n n a g k *X-X:Xv 9Xb b >XVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX[ Q K ` b.F.K.!.~.~.~.~.(./././././././././.~././././.(.[.(.~.(./.[.(.K.Q / _ BXZXAXAXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXz z 4 n 7 -X-Xn +.X.X.X.X.X.X.X.X.X.X.X.X.o.O.X.X.O.hXoXO.A +.c a k -Xv j 4.v @ @ a h :X>Xv h d w g h d l z @ M.sX-X:Xv v ;X-X4 b 5 u O.o.X.X.X.X.X. . .o.;X@ O   # 8.sX@ n sXg =.3 x .. . .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.DXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXZXVXQ ! / c.n.!._.}.}.}.|.{.|.|.|. X}.|.|.}._.|._.|.^.|.(.(.(.(./.(.(././.!.~ ~ ~ CXAXFXAXFXFXFXFXFXSXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFX2 6XIX=.2 4 v p z v v v x l 6X .X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.....+.2 =.2 2 7 T O.O.{ ,X-Xl v g j +...i =.2 2 2 2 2 =.2 2 2 7 z l l k < 2 4 5 8.sX+ ' o v +.o.X.X.X.X.O.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X...6XuX>X0X;XsXn -XiXVXHXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXAXDXCX' ! S [ m.!.]._.(._._._.|._.|.|._.|.^.|.|.`.^.(.(.(.^._._._._._._._.`.Q.! / [ BXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX9.;.5.5.5.:.>.<.v d - 5 g 5 a @ g h @ z x g 5 @ w g g w 7 g h g w g g @ @ g k v v b ;X}  .X.X.O...7XhX .+.X.O.+.Q f 6X8XwX;.:.<.:.:.;.-.;.tXwX,.-.,.-.-.4.,X,X,X,XqX4.-.,.<.9X4.-.;.:.9X1X,X:.-.-.:.5.4X,X4X2X9.,.5.1X,X,X,X1X<.:.5.:.-.:.tX1X:.ZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXAXDXFXAXDX^ ! ! Y e.g.S.D.H.A.l.Z.h.A.A.l.A.A.A.g.A.A.A.h.l.l.h.h.h.g.h.a.j.j.f.f.k.k.a.f.i.z.f.a.s.f.a.f.a.f.f.a.s.f.a.s.a.k.z.g.a.a.a.g.f.f.g.a.g.f.z.f.g.z.",
+"m = m m m m m m m m m m m m m m m m m m m m m m m m m N m N V N N N N N N V B B V N M M C M C M N C N C Z C B C C B C C A C C Z A B D C B Z Z C C Z C C B Z C Z Z Z Z G Z Z D D H H Z D Z Z L H L Z Z Z L Z H H S m.aXhXpX{ ~ u y r ; ; r r r 0 r r r r r r r r r r r r r r : r r r r r r : r r r r r r r r r r r r r y r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r r e 0 r r r r r r r r r r 0 r r r r r r r r r * r r r r r r r r r r r r r r r q * : r ; e ; y y e r * * S `.(._.|.{.[.}.^._._._._.{._.|.^._._.`./.|.^.(.(.(.(.(.^.(.(.(.(.(.(././././././././.~.~.!.~.~.(.~.~.~.~.~.R.~.~.~.T.~.T.T.T.T.~.T.~.T.T.~.T.T.~.~ ~ Q ZXZXDXFXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.o.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.+.+.o.../ | O.O.u g g 4 b j @ < < ;XyX2X8X6X8X7X} ....O. . ...7X5XyX6X.. .o...X.X.X.o.6Xv v l v x z j v l @ h v + a 4 7 + h h h a v 2X>XuX:Xb =X*X*X5XCXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBX' Q c ) b.F.Y./.(.(.(././././.(./.(.!./.~.~.[.~.(.(.[./.(.(./.(./.(.(.F.! / ' BXZXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXz - 8.8.n | o.O.X.X.X.X.X.X.X.X.X.X.X.X.X.o.+.O.O.O.fXO.| o , , p v -Xz 2.,.b 3 2.5 + ;X:Xb p 2.*Xa h 2.*Xp x gXb k -Xz l :X;Xz aXeX/ O.X.X.X.X.X.X.X.X.O.6Xh 8.z   aXsXO sXsXg 7X+.+.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXVXQ Q ~ [ m.!.}.}.}.|.|.|.|.|.|. X}. X}.}.|.{._.{.^.|.(.(.(.(.(.(./.!.~.!.~ / ! VXAXFXFXFXFXFXFXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFX7 5 @ < 3 2 w g c +.+.+.+.f +.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. . .o.O...T 2 2 =.T X.O...+.{ p -Xb v k 3 =.u ....7 =.2 2 =.2 2 =.2 2 7 4 2 2 < / f + l IX6X< 9.c @.O.O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .7X<X>X>X;X;XaX;Xv 5XFXVXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXZXDXDXBX_ ! ! ` m.].]._._._._.|._._.|.(.|.{.|.`.^.|.`.(.(.(.(.(.(._.(._._.`.(.].! / ' BXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXeXwX4X4X4XwX:.<.v z x @ @ z n + z g v sXz l l x + a 2 2 2 g 7 n =.% k ;X, a 8.<.uX8X| +. .X. .O...7X+.| - / 6Xp iX:X*XwX,.,.>.-.>.>.-.-.-.wX4X4.;.-.-.,.wXtX<.:.0X1X1X0X5.2X1X4X5.;.-.-.0X1XqX>.-.>.5.4X,X<X<.:.5.-.qX1X2X,X2X0XwX4X1.>.4.4X4.>.FXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXVXAXDXDXVXZX~ ! ! Y b.n.A.H.A.A.A.Z.h.A.h.A.g.A.A.A.h.A.S.z.h.z.l.l.h.g.g.g.a.g.f.s.f.a.i.g.i.a.a.a.a.a.f.a.a.a.a.j.f.s.k.f.f.a.a.z.g.g.i.f.f.f.g.k.z.a.f.f.a.a.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m N N N N M N V N N N N V V N A M M M C N C N C B C N C N C C C C C C C C C Z A Z F C Z Z Z Z Z Z D Z Z Z Z Z D Z Z Z Z G Z Z Z H H H Z J H H D L Z L H D ' gXaXpX{ Q u : : y : ; r r r r r r r r r r r r r r r r r r r r r r r r 0 e r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r e r r r r r r r r r y r r r r r r r r r r e r r : r : r : r : ; ; : y : e % * % n.|.^.(._._.{._._._._.|._.|._._._._.(.{.(.|.(.|._.(._.{.(.(.^.(././.(.(.^./.!././.!.~.~.~.~.~.~.~.~.R.~.~.~.~.R.~.T.T.(.T.T.~./.T.T.~.T.~.T.~.T.~ ~ S ZXCXZXDXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFXFXVXVXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.O.+...n } o.O.u 3 2 7 3 j j 2 7 ;X3X:X:X:X2X:X:X:X6X6X} } ;X,X-X;X>X8X| | | O.X.X.X.X.+.:Xn uX-Xx v *Xv p w @ 5 g @ g k g w z @ v -X:X:X<Xk wXeXwXuXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBX[ ! Q ` b.F.!.!.~.(./././.(././././.!.(.^.(.~.(.~.(./.(.(.(.!.(./.(.~.]./ / _ BXAXAXZXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXv d O < + X.O.X.X.X.X. .X.X.X.X.X.X.X.X.X.O.O.O.O.O.7XO.7 j s - z O p O k 2.v 2 q.b g x *Xb g 9.0Xa g 9.0Xa z b h g v v ;XuX;X@ b z > O.X.X.X.X.X.X.X.X.X.+.n KX8.g v l w c n u O.o.O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.AXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXZXQ Q Q c.n.]._.{.|.|. X{.|.{. X|.}.}.}._._.}._._.`.(.(.(.^.(././.~./.~.~.~ ~ ! VXAXFXFXFXFXFXFXFXFXAXDXDXFXFXFXFXFXFXFXFXFXFXFXFXc l z v v v c +. .X.o.o.o.x +. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.o. .o.O.+.| =.=.4 +.....o.7X{ 7 2 7 v p j 2 2 =.=.Y O.w =.2 2 2 =.=.2 2 2 7 a -X-X, ..| @ @ a O O =.l | O.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .8X,X>X5X<XwX:X=X*XuXVXHXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXDXDXDXBX[ ! ! ` n.].(.(.|._._.{.|._.(.|._.`.^.`.`.(._.|.(.`.^.(.(.(._._.^.`.(.T./ / ' BXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX1X4.4.,X4XwX0Xf x n z @ z KX5 h k -XKXv - z KXl - 2 =.=.w 7 n x @ v :Xn h ;X9X6X..| +.X. .o...O.n g v + -X-Xp iX>X-X,XqX4.>.>.4.4.>.-.,.qX4XwX,.-.-.,.0XtX>.>.-.<.0X1X1X2X2X2XtX:.-.>.5.4X1XqX-.>.4.4X,X9.>.5.1X;.4.1X2X,XtX2X,X4.,.,.4.4X0X;.FXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXFXFXFXVXFXQ Q ! Y e.b.S.H.H.A.A.S.h.h.h.l.h.A.h.A.h.h.l.l.h.l.z.h.h.h.z.g.g.a.f.f.a.a.i.a.a.a.a.a.f.a.a.a.z.s.a.s.a.z.f.f.f.f.g.f.z.a.k.f.f.k.g.g.a.z.f.f.k.a.",
+"m m m m m m m m m m m m @.m m m m m m m m m = m m m m m m m @.m B m B B m B m F m M B M m B B B m B B B C m C C C C C C A C C C C Z C Z C Z C Z Z C Z C C Z Z Z F B Z Z Z Z D A H Z H D H Z H D Z H H Z J L L H pXhXpXM.' u y e r r r r r r r r r r r r r r r r r r r r r : r r r 0 r r r r r r r r r r r r r r ; r r 0 0 q r ; ; e > > : 0 r ; r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r ; r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r r e 0 y ; * % u {.{.(.].`.(.`.`.^.}.[.{.`.|.^.|.^.`.(.`.^.`.(._.{.(.|.{.^.(.(.(.{./.^././././.(.T.(.(.~.~.~./.~.~.~.Y.T.~.~.T./.T.~.T.~.T.~.T.~.T.(.T.~.T.^.T./ ^ ^ ZXAXFXZXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXo.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.O.f } O.O.J p d x v - g w g v l h w z ;X-Xn g >X-Xb z p -Xb l v j 7 j t O. .X.X.X...} v 8X-X;X:Xv :Xp x l @ a n z *Xh l n 4 p - n j :Xk eXsX;XtXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX} ~ ! ` b.F.!.(././././.(.(./.(././././.(.(.~././././.(./.[.~.(./.(.(.!.Q / ) fXDXAXAXAXFXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXZXFXDXz z g 2.-X+. .X.X.X.X.X.X.X.X.X.X.X.X.X. .o. .o.o.O.fXO.` lXs 5 g 2.j @ } s d O # O -Xv k v + k k @ p k k + ;X-Xk h v l :X5X;X@ n 7 > O.O.o.X.X.X.X.X.X.X.O.| { { f 7X+.O.X. .o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.DXDXDXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXVX! Q ~ [ n.].`.`.(.`.`.(._.|. X|. X{.}._._._._._.(.(.(.(.(.(.(./.~.(.T.[.~ ~ ! ZXAXZXZXZXFXFXFXGXSXDXFXFXFXFXFXFXFXAXDXFXFXFXFXAX+.+.;X+.+.+.o...X.X.X.X.+.u +.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .[ +.=.2 < [ O.O.} { 6X1 4 z @ a + z < 2 7 2 2 2 i ..i =.2 =.2 2 2 2 2 7 d 8X8X+ > > @ w x + v 7XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.+.+.:XuXtXuX>XyXyX<XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXAXBX[ ! ! _ n.Q.].(.`.^.`.(.|.`.(.`.(.`.|._._.|.^.(.(.(.(.(.`.(.^.(.`.^.(.K.! ! ' BXZXFXFXFXFXFXFXFXFXVXGXFXFXFXFXFXFXFXFXFXFXFXFXGXyX5.,.,.:.4.,X1Xx h a p a a v a g a p v g h a v a h 3 7 2 l 3 s O g g l g z :X3X .o.| +.......7X8X-Xh :X-XtXKXO *X*X-X1X1X2X5.qX1X1X4.-.-.:.wX1X4.-.-.9.<XtX;.-.-.-.;.<.:.:.:.:.:.-.-.-.;.qX1XyX:.-.>.0X1X:.-.;.:.,.4.4X4.:.:.<.:.-.-.>.9.1X4X<.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXZXZXFXFX^ S Q Y b.Z.Z.H.G.A.A.Z.l.l.A.h.G.g.Z.j.h.G.g.h.l.l.l.h.h.g.f.k.f.a.i.f.a.a.a.i.a.a.a.a.a.a.a.a.a.a.i.z.i.k.d.k.f.k.a.g.a.g.f.g.g.g.z.a.f.j.z.f.f.f.",
+"m m m m m m m m m m m m = m m m m m m m m m m m m m m m m m m m B V m B m B B B M M N N B V B B B B C B m G N C A C C C A C Z C C C Z C C Z C Z D Z C Z Z Z Z C Z Z Z Z D D D D F Z Z D H H Z D L Z Z H H Z Z [ aXaXpX{ n > r r r r r r r r r r r r r r e 0 r r r r r r r r r y r e r r r r r r r r r r r r r r r e ; r y e ; r 0 0 q y 0 r * e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e ; r : r r r r r r r r r r r r r r r r q r r r r r r r r r r r r r r r r r r r r r r r r r r r e r 0 : ; % % b.{.(.(.(..X^.^._.}.}.|._.|._.(.|.^.`.(.|.^.`.(.{.{.^.[.(.(.(.(.(.{.(.(./.(./.(.T.(.T.T.(.~./.~.~.T./.~.~.T.~.T.~.T.~.T.~.T.~.T.T.T.T.T.~.T.T.~ ! S ZXAXFXZXAXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o./ | ..o.v 2.3 -X-X3 x 7 + ;X-Xv z + :X-XsX@ p - eXn @ l n v a 4 b n u O.O.X.X.X. .} c O.;Xv n k :Xp n x p @ sXl a w 8.8.7 a 8.8.x ;Xk -Xc b >XAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXBX[ ! S _ b.F.Q.).(./././.(./.(.(./././.[.~.(.(././.(.^.(.[.(.(.(./.(.(.].! ! ' BXDXFXZXAXAXAXZXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXx a j 9.;X+. .X.X.X.X.X.X.X.X.X.X.X.X.X.+.| | | | | 7X+.+ z 4 5 g 9.wX, X.-X@ % :Xv k p g g h a a h h a a 5 @ v v x v :XtX<.b d sXeX/ O.o.o.o.X.X.X.X.X.X.O.O.+.o.X. .o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.DXDXDXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXVXQ Q ~ c.n.].(._.`.`.`.`._.|._.|.}._._._._._._._.(.(.(.(.^.~./.~.~.~.~.T.~ ~ ! ZXFXZXVXZXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXAXVXo.X.W O.o.X.X.X.X.X.X.X.X.l +. .X.X.X.X.X.X.X.X.X.X.X.X.X.X. .+.=.2 =.+.O.O. .{ j 2 2 O g a c s a z z 5 w l 2 =.=.S o.K 2 2 2 =.2 =.2 7 a v k d v b l x sX8./ O.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.o.o.o.X.+.+.8X>XyX2XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXAXFXBX} ! ! _ n.].(.(.'.|.(.|.(.(.|.`.|.^.|.(.(.|.(.|.^.(.(.(.(.(.(.(.(.(.(.].! ~ ' BXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXyX0X5.5.:.>.5.1Xl @ - 5 g a a 5 g h w 5 5 g h 5 k k a 5 5 g h w - g j v v <X6X . ...|  .O.7X:XwX<.v z ;Xk b l @ -X1X,X,X>X,X4X1X,X2XwX>.-.-.;.wXtX>.<.,X1XwX>.-.-.-.-.-.-.;.-.-.-.-.-.-.-.-.:.;.-.>.,.5.4X:.-.-.-.,.5.4X:.>.>.,.>.,.>.-.-.5.2X<.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXAXDXFXAXDX! ! ! U e.b.A.H.G.g.j.Z.l.h.l.l.z.A.A.h.h.h.h.h.l.l.l.h.g.g.f.k.f.f.k.k.a.a.i.a.a.a.a.a.a.a.z.a.f.i.a.a.a.k.k.d.f.k.g.a.z.f.z.a.j.g.j.z.j.f.f.f.f.j.",
+"m m = m m m m m m m m m m m m m m m m m m m m m m m m m m m m m V M B m B B m m M M N N B B B B B B B B C C B B C C C C C Z C C Z C C Z C Z C Z Z B Z C C Z C G D C Z Z D Z D Z Z Z H Z Z D D D Z H H H D J S m.pXpX{ ] u r : 0 r r r r r r r r r r r r r r r r r r r q r r r * r r r r r r * 0 r r r r r r r r q r e e ; ; r r 0 0 r * r y y ; r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r = r r r r * r r r r r r r r r r r r r r r r r r r r r r r r r r y r r 0 r r r * r r r r r r r : y r * % % % u ^.(.(./.'.(.|.|._.|._.|.^.|.^.^.`.`.(.|.(.(.(.(.(.{.(.(.^.`.(.(.(././.(././././.^.~.~.[./.~./.~.E.T.^.T.~.~.~.~.T.T.T.~.T.~.T.~.T.T.T.T.T.T.~ ! ~ ZXFXAXFXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.o...X...+.c } 7X8Xj 8.=.;X-X5 c 8.4 ;X;Xn v @ x z a p @ h z k h h 5 @ h 4 g s w O.O.O.O.X.O.| c  .o.6X>X>X:Xp a @ a z + p a a 4 4 + a 4 7 g <Xv *X*X*X5XgXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXCX' Q Q ` b.F.).(./.(./.(.(.(.(././.(./././.~.^.(.^.(./.(./.(.(.(.(.(.(.].! / ' BXZXAXZXAXDXFXFXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXz l a k p W |  .X.o.X.X.X.X.X.X.X.X.X.X.p *Xk k k k s g 2.k *Xv a k k   > % a > 6X| O j b k g z z g k b b b v v x :X1X:X:X5.-Xv n b - +.o.X.X.X.X.X.X.X.X.X.X... .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.ZXDXZXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFX~ Q Q [ m.].(.(._.|._._._._.'.`.}._._._._.|.^.(.^.(.(.(.(.^.!.(.~.[.T.[.~ ! ! ZXAXAXAXZXFXFXFXFXAXDXAXAXFXFXFXFXFXFXFXFXFXFXGXVXo.O.@.X.o.o.X.X.X.X.X.X.X.v +. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.7 =.+.....X.} 2 =.7 z a p l f +.n p z a 6X-Xa 7 2 =.2 u +.7 =.=.2 2 =.3 n x z d b :XuX;Xz sXn / O.X.O.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.X.+.3XuXtXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXBX' ! Q ' F.Q.{.(.^._._.^.|.`.|.(._._.(.(.|.^.(.`.(.`.(.(.(.(.(.(.(.(.(.Q.~ ! | BXDXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXyX1X1X4X9.,.<.2Xz k iXk - k iXk g p z ;Xp a x x *Xk s >Xk a 4 b z @ :X2X5X7X.. . .O.| ;X:XyX>X<X5.*Xg z - @ z v 8.<.:.:.:.<.:.,.:.:.-.-.>.>.,.wX2XqX<X1XwX<.-.>.>.-.>.>.-.-.-.-.-.;.-.-.-.-.-.-.-.<.5.wX2XqX-.-.>.<.wX1X:.>.<.5.5.5.5.-.-.>.<.5.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXVXZXZXAXFX~ ~ ~ Y e.n.Z.G.G.A.A.Z.h.h.l.l.l.A.j.A.A.h.h.h.l.l.l.z.g.f.z.a.k.k.f.i.a.a.a.i.i.i.a.a.a.a.a.a.a.k.a.k.i.k.k.k.k.f.f.f.k.z.a.j.f.g.h.f.z.g.j.k.j.f.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m q B N B B m B B M B N B B V N B B B B B N B B C C N A C C C C C C C C Z C B Z C C Z C Z C Z Z Z Z Z Z Z Z Z Z F H Z D D Z D Z H Z H Z G D P / aXpXM.{ S > y > r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r y e r r r r r r r r > = ; 0 * ; y = r r ; ; y * ; ; r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r 0 y ; r * r r r r r r r r r r r r r r r r 0 e r r r r r r r r r r * : r e r r r r r r r r r r r : r * * ; % % $ ]./.(.`._.(.(.(._.|.(.^._.(._.|.(.^.|.(.`.(.(.(.(.(.(.(.(.^.[.(.(.^.(./././././.(./.^.~././.!./.^.~.!.~.T.~.T.~.^.T.~.T.~.T.~.T.T.T.T.~.T.T.~ Q ^ ZXFXFXDXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .o.....6XuX-X;X,X:X5 4 5 v ;X4 O s + ;Xk w a a x ;Xv v v z 5 w h g w h h g - 4 v 6X| W +.O.O.} / o.X.X.8X>X<X-Xk v z z a h h h k h h a p k v ;Xv uX>XyXuXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXBX[ / ^ ` b.F.].!./.(.(.(./.[.(.(./.[./././.~.(.(.^./.(./.(.(.(.!.(.(.(.].S / ' BXZXAXDXAXAXFXAXZXGXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXd z @ z h *Xg 6X+.O.X.X.X.X.X.X.X.X...7X*X2.k k 2.j s j 9.wXz g z g z l v v v f > > p -X-Xb v k k p ;X:X:X<XwX<.:.<.:Xg g a v :Xk x 4 > O.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.DXDXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXZXSXQ Q ^ c.n.!.|.^._.(._.|._.`.(.`.}.}._.}.{._._.(.`.(.[.(.(.^././.~.T.[.T.~ ~ ~ ZXAXAXFXFXFXFXFXFXDXAXDXDXFXFXFXFXFXFXFXFXFXFXVXIXO.+./ X.X.X.X.X.X.X.X.O. .c +.O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.....o.| eX7 2 w v z c s p , , f p d v 8X:Xa 7 =.2 2 =.=.=.2 2 2 2 2 7 -XyX;X;XyXeXsXb k :X+.X.X. .O...O.O.o.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.o.+.8XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXAXFXHX' ! ! ` n.].].`.|.|.(._.|._.(._.(._.(.(.(.(.(.(.^.^.(.(.(.(.!.(.(.(.(.].Q Q [ BXDXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXyX<XyX2X4.>.4.1Xz *XiX:X@ *XiX:X@ k v KX@ + n n w h v KXaX5 x 8.8.5 :XyX8XX. . . .+.v j =XsXeX>X5X*X- a :X-Xj 1.>.,.;.;.-.>.<.5.4.5.4.>.9.5.5.tX<X1X2XtX<.,.<.5.5.5.5.4.>.>.>.>.-.<.4.-.-.-.>.>.<.tX1X2X<X1XqX;.>.4.4X1X0X>.4.4X1X1X1X0X;.,.4.4XZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXZXVXFXS ~ ! I e.Z.H.H.A.A.A.Z.h.h.h.l.l.h.A.G.g.j.h.A.l.l.z.g.g.g.g.g.f.k.i.z.a.a.a.a.i.i.i.a.a.a.a.a.a.f.a.a.k.d.z.i.k.d.f.f.f.a.g.g.f.f.f.j.f.h.j.f.f.h.",
+"m m m m m m m = m m m m m m m m m m m m m m m m m m m m m m m N B m M B M B M B M B B M B B B m B B B B C N B C C C N C C C C A Z C Z C C C Z Z D Z D B C Z Z Z C Z Z Z Z Z Z C Z S Z Z Z G H Z D L H G D H M.M.M.{ ' n r ; r ; r r r r r r r r r r r * r r r r r r r r r y r r r r r r r r : r r r r r r r r r : > e 0 r ; ; : e e e ; e ; r 0 r r r r r r r r r r r r 0 r : r r r r r r r r r r r r r r r r r y 0 = ; : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r e t ; 0 t ; % - $ P _.T.|.(._.(.`._.(._.}._._._.|._.|.{.|.^.(.(.`.(.(.(.(.(.(.^.!.(.(.^.(.(./././.~.(./././././././.~./.~.~.T.~.T.T.^.T.~.T.T.T.~.T.T.U.~.T.Y.~ Q Q ZXCXZXZXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.6X8X1X:Xz 5 w l z + a z g h z v k x l @ 5 5 v :X-X:XyX-X*Xn a a -X> + @ x 2.4 l x z - O...| ]  .X.X. .6X5X<X,X2X:Xz z - z a - d x v w z z v b ,X,X,X,XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBX_ Q ~ _ n.].K.(.(./.(.{./.(.(./././.(./.(.E.^.(.(.^./.(.[.`.~.(.(.(.(.].! / _ BXDXZXZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXj 2.k g k 2.k =X;X| O.O.o.X.X.X.X.X.o.+.:Xk v k v k @ + k g a x k k k 2.9.1XwX:.<.:Xs p p g v j j g v k k b :.>.>.4.b h z 4 w z l sX8.b o. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXAX~ ~ ^ c.n.].(.(._._._.(.`.(.`.(._._._._.^.(.(.(.(.(.(.^./.(././.~.~.~.T.S ! ! ZXVXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo. .S o.X.X.X.X.X.X.X.X.+.l +...X.X.X.X.X.X.X.X.X.X.X.X.o.O.O.O...} ;X=.2 l b x <Xf +.n w z h z + l + v s a d d 5 l < =.2 =.2 2 z v z -X:Xv :XeXsXsX*Xb +. .o. .} { 6X{ { +.O.O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXSXFXFXFXAXBX[ ! ! ` n.Q.!.(.(.`.`.`.|.(.|.(.`.(.(.(.(.(.(.^.(.(.(.^.(.(.(.(.(.`.^.].Q S ' BXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXyX3X1X2XwX;.<.2Xz p *Xp 4 g *Xp h h a v 5 h 5 @ p h p *Xv p 4 4 4 w :X8XX. .o. ...z >X*X*XsXsX:X5X-Xz z 8X:X*X5.5.5.<.-.-.>.wX4X1X4X2XqX,X1X1X,X<X2X2X<X5.5.,X4X1X1X1X1XqX5.5.4.,.qX1X:.-.-.<.5.tX1X,X,X2X2X,X:.;.>.:.qX4X0XwX1X<X2X2X4X1.;.wX2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXFXZXFXDX! ! S P e.n.A.H.A.A.G.g.G.l.A.h.l.h.G.A.j.G.h.h.h.h.a.k.g.g.g.l.f.f.z.f.i.a.a.a.a.i.i.a.a.a.a.k.a.a.k.f.f.f.f.d.k.i.f.f.g.g.g.f.g.f.g.g.g.j.g.g.g.z.",
+"m m m m @.= m m = m m m m m m m m = m m m m m m m m N m m m m m M M B M m M C M M N m B N B B N N B C B N C C B C C S N A C C Z C C Z C Z C C Z Z B Z Z Z Z Z B Z A Z C Z Z Z F Z Z F H Z Z Z Z D D Z D D S m.pXM.{ Q y y r r r r r r r r r r r r r r y r r r r r r r r r * r r r r r r r r r r r r r r r r r r e * : 0 r r e e ; = y r e 0 r q r r r r r r r r r r r r e r r r r r r r r r r r r r r r e q r r ; ; e ; ; e = r r r r r r r r r r r r r r r r : r 0 r r r r r r q e e r r r r r r r r r r r r q : 0 : r ; ; % & * _.{._.(._.(.)._.`._.{.{._.(.(.|._.(.|.(.(.(.(.(.(././.~.^.(.(.(.~.(././.(.(./.^.^././././.!.(./././././.~.~.~.~.~.T.T.~.~.T.T.T.T.T.U.~.Y./ ~ ^ ZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXo.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.,X,XuXs + x z @ a iX*X-X-Xw v j *X;X-Xb k + z x z k uX-Xk ;Xp l :Xn z 4 c n 5 - :X;Xu O.O.} c  .X.o.X.o.8X>X<X2X-Xv :X@ @ v <Xp b *Xa b 4 ,X<X,X,X,XyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXBX{ ~ Q [ b.F.!.!././.(.^.(.[.E.[.^././././.^.~.(.(.(.(./.(.!.(.(.(.[.{.Q.! / ' BXZXZXZXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXj 9.-Xz -Xk k k k k +.....X.X.X.X.X.X.X.7X-Xv v b b h x g d l z v 2.k 2.,.,XqX,.;.k 4 sXsX5 v h k g v j b j ,.>.,.;Xk h O 2.w + @ :Xx v 6Xo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXFXAX~ ~ Q [ n.Q.(.`.(._.|._.`.(.(.`.(._.(._._.(.(.(.(.(.(./.(./././.~.~.~.T.! ! ! ZXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXO...W o.X.X.X.X.X.X.X.X. .f +. .X.X.X.X.X.X.X.X.X.X.X.O.O.O.....6X=.2 2 - z -Xk l , , , a g 2.*Xp l O p g a d / - @ 2 2 2 2 7 d w -Xz u s p *XsXaXyX*Xn +.+.+.7Xj < 2 2 2 j 8X+.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXGXZXFXAXFXBX{ ! ! ` n.Q.~.`.(.`.(.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.(.(././.(.^.(.(.Y.! ! ' BXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXyX5.4.2X1XwX0X1Xx l w l g h w l g h z w z g g z z g l w d g v v l v :X . . ...X.6X*XiX>X*Xn n -X>X*Xz - -X-X-X4X1X4XwX,.>.>.wX2X,X2X2X1X,X,X2X2XtX<.wX2X1X1X,X,X,X,X,X,X1X1X1X1XqXwX1X5.-.>.5.4X1X2X<X2X9.:.:.-.:.5.>.4.1X1X2X,X2X<X2X1X0XwX1X2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXAXGXZXVXZX^ S ~ Y e.Z.A.H.S.A.A.Z.g.g.h.h.j.G.g.A.g.h.h.h.g.h.z.g.g.g.a.g.z.f.f.f.f.a.a.a.a.a.a.s.a.a.a.i.z.a.k.k.f.f.f.f.f.k.k.g.a.a.f.g.g.g.g.g.g.g.f.g.g.g.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m N N m m m M M M M B M B m M B m B B B B B N C B C C N B C C C N A C C C C C C B C C C A C D B A D C Z Z C Z C Z Z Z Z Z Z Z Z Z D H Z Z Z D D Z S S ) M.pXM.' S y y r r e r r r r r y r r r r y : e r r * r r r r r r r r r r r r r r r r r e r r e r r r : y : e ; ; = 0 ; r = r 0 * e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 e r r * y ; e e e r 0 r r r r r r r r r r e 0 r r r r r e y * r r r r r r r r r r r r r r r r r r r r = e ; = ; ; % $ $ n.{.[.`.(.(..X(.`.{._._.|.`._.^._._.`.{.(.(.(.(.[./.(.(./.(.(.(.(.(.(.(.(.(.(.(./.(.(.{./././.(././.~.(.T.~.~.~.T.~.E.T.T.T.T.T.T.T.T.T.T.~ Q S ZXVXZXZXFXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXo.o.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...6X2X,X,X1X;Xn v @ z iXuX*Xx h :X{ @ :X-XeXn O z n l k *Xk s k p l v k @ 4 3 s + a z p p 6X+.} f o.X.X.X...6X>X>XyX:X:XKXv a ;XKXk z *X8.8.x >X2X<X,X,X2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXBX[ ! / ` n.].!././.(./././.[.~.^././././.[.^.^.(.(./.^.(./.(.^.(.(._._.!.Q / _ fXDXZXDXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXk :Xk - z h x k 2.k :X+...O.X.X.X.X.X.X. .7X,X,X<X4Xk :Xk 2.*Xa -X*X-X2.,.:X:X4.8.v l IXn @ 7 2 =.j b v k *X4.2.2.k z l 3 4.x a @ v g k :X} O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXHXAX~ Q ! c.F.].(.(.`.`.^.^.(.(.(._._.(._.(.(.(.^.(.^.^./.(./.(././.~.~.~.~.~ ! ~ AXAXAXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXO.O.! X.o.o.X.X.X.X.X.X. .c +. .X.X.X.X.X.X.X.X.X.X.X.+.} { { :X7 2 l v x s v v - a b z + g 9.j s l a g *Xa f ..W @ < 7 l w - p -X$ , +.:Xd :Xk s =X*Xn u n z d h d z v z -X<X7X . .X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXSXVXFXFXFXAXBX' / ! ` n.].].(.(.(.(.(.`.^.`.(.(.(.(.(.(.(.(.(.{.^.^./.(.(.(./.(.(.(.].S / ' BXHXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXSXFXFXDX1X<.,.5.1X>X2X2Xv a v k h + p p a h a p k g @ s k p a p v d :X,X,X6XX. . ...O.6X*Xk *Xk k k k *X>Xv z -X1X,XwX:.<.wX<X5.9.,.wXyX1XwX<.:.<.<.wX2X<X5.tX2X2X,X,X,X,X,X,X,X,X,X,X,X1X,X,X4X5.>.;.:.0X1X,X2XqX4.>.<.wX1X:.4.4X4.:.:.<.<.:.5.4X1X4.5.AXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXZXAXVXZX^ ! ~ Y b.n.D.H.H.A.A.Z.h.l.h.h.A.A.A.h.h.l.h.h.h.g.g.g.a.j.a.a.k.k.i.i.z.i.a.a.a.a.a.a.a.a.a.k.a.i.f.f.i.z.f.f.f.f.k.k.z.z.f.j.g.f.g.a.z.h.g.g.g.g.",
+"@.m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N N M M M C m B m B B M B B N B B M B N B m C B C B C C Z C C C C C C D C C C Z Z Z C Z Z C Z Z Z Z C Z D B Z Z Z Z Z Z Z Z D Z G Z Z Z Z Z S [ m.{ { / t * y r r e r r r r r e r r r r 0 t * r r r r r r r r r r r r r e 0 r r r r r 0 r r q y * : : PXLXLXLXLXgX- e ; e ; LXLXLXpXe r r r r r r : r r r r r r r r r r r r r r r r r r r r r r r r ; e u hX{ ; r : r r r r r r r : r r r r r r r r r r r : r r r r r r r r r r r r r r r r r r r r ; ; e > ; % % & $ c.(.(.`.!.{.`.`.^.|._._.^.(.`.(._.(.(.(.(.(.(.(.(.(.(./.(.[.(.(.(.^.(.(././.(.(.(./././.^.(.!.(./.(.~.~.~.~.~.~.~.T.Y.(.T.T.T.T.T.T.T.T.T./ Q ~ ZXVXVXZXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.o. .6X<X,X,X,XyXk w a a a *Xk v ;X@ k z + ;Xk v p + z z p k v v g p g p v w l l z 7 l z - @ -X;X> +.c ..X.X.X.O.o.:X>X5X:Xv -Xs d d n p v ;X4 4 5 <X,X,X,X1X4.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXBX[ / c ` b.F.!./.^.).(././.(.^./././.(.(././././.(.(./.{.(.(.^.(.(._._.].Q / _ BXDXZXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZX>X5X:X7 8.7 z -Xv k *X;X| X.X.X.X.X.X.X.X.o.o.6X>XuXv :Xk 9.*Xa 8.9.<X:X5.b h a z h + p + 5 z 5 z a g d z l d ;XsXh z v O 3 O k -Xj =.b g z O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXDXFX! ! S [ m.K./._.^.(.`.(.(.(.(.(.(.(.(.`.(.(.(.(.^./.(./././././.~.~.~.R.~ ! ~ FXHXFXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX;X6X;X6X} o.o.O.....X.O.X.l +. .X.X.X.X.X...o.O.O.O.{ 2 2 2 2 2 j z w ;Xl v -Xz @ c 6X| z p *Xb p l a g a 5 - > > @ n x s *Xk d <Xn   > , d :X*XwX*Xv o.X. .f =Xv + b k *X@.> / , W O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXFXVXZXFXVXFXBX[ / ! [ b.].!.(.(.(.(.(.(.(.(.^.`.(.(.{.(.{./.(.E.(.^.(./././.(././.(.].~ / _ BXHXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXDX2X0X;.1.1X1X5.4.z l v *Xk z ;Xp z p l l *Xk l x *Xv z sXg z :X>X8XX.X.X.X.+.;Xk wX*X+ g b *Xb k b g w :X1X1X,X9.,.:.yX4X0X9.yX1X:X:.-.>.>.9.tX,X,X1X,X,X2X2X,X,X,X,X,X,X2X,X2X2X2X2X,X<X4X5.-.>.5.1X<X2X4X4X,.5.4X4.>.4.4XqX;.-.>.>.,.9.4X5.>.-.AXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXDXAXFXFX^ ! ~ U e.Z.l.G.S.A.A.j.h.h.h.A.h.h.h.l.G.h.h.h.h.g.g.a.g.g.k.k.k.k.z.x.z.a.a.a.a.a.a.a.a.a.i.k.z.k.i.k.i.k.k.f.f.f.k.g.i.g.k.g.f.g.g.g.f.a.h.g.g.z.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N M M m M M M B M N N V M N V N V B B B B A N V N C N C C Z C C C C C C C D F C C B D Z Z Z Z Z C Z Z Z Z B Z C Z Z Z B Z G Z Z Z Z Z D L Z { M.m.' c y = ; ; r ; r r r r r r r r r : r r r r r r r r r r r r r r r r r r r r r r r 0 r e ; e ; y { LXLXLXLXLXPX* ; ; r ; LXLXLXpX% e * ; * y : e 0 e > 0 0 0 ; : y * e * e = e r e r r e = r : e u pXLXLX' e > * : r r r r * r : r r r r r r r r r r r r r r r r r r r r r r 0 e r 0 r r r r r r r : r 0 r * % $ $ u (.(._.(.(.(.(.`.(.`.`.(.(.^.(.`.(.(.(.(.(././.(.(.(.(.(.(.^._.(.!.(.!.(.^.(.(.(./.(./.(.(./.)./././.[.~.^.~.~.^.T.~.T./.T.T.T.T.T.T.T.T.P ~ ^ ZXZXZXZXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.6X>X,X,X,X,XyXk + p a @ p p g h 5 g v d z p k k k 5 p p g <X1X-X-X> O 4 =.=.7 7 2 2 =.2 g k ;X-X;X/ O.o.X.X.X...8X>X<X,X,X>X:Xg v z v g b v g -X,X,X,X,X1XqXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXBX' ~ ! ` n.F.!._.^.(./.[././././././././.^.(.(.(.(.[.(.(.(.`.^.(.(.(.(.K.Q / ' BXZXAXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX,X2X:X7 n j h h z a 2 g s | O.X.X.X.X.X.X.X.o. .+.6Xv :X:Xk k g b 5.b z d z p :X, + p v v p p -Xn @ v j *Xa z n 6Xg g v j j s j 2.-Xz aX8.-X6Xo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .O. . .o. ...X.X.X.X.X.X.X.X. .o.X. .X.X.X. .X.X.X.DXDXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXZXVXQ Q ^ [ n.].(.(._._.(.!.(.(.(.(.(.(.(.(.(./.(./.(././././././.~.[.~.~.[.~ Q ! ZXZXZXZXAXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFXFXFXFXFXFX=.3 *X=.2 ;X6X{ { 7XO...X.l +.O.O.o.O.O.O.+.+.[ } 6X< =.l w h 5 l v k k g + k O a , = , k a @ p k l 5 h @ z p a z g ;Xb s >Xv a ;Xv h z @ @ -X-XiX5X/ X.X.X.-XKXKXx sXw h > z eX& W O. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.GXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXZXDXHXDXHX' Q ^ ` b.].K.(.(.).!.(./.(.{.^.^.(.(.(.(.^.{.[././././.~.^./././.[.(.]./ ! _ MXFXDXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXFXFXDXDXFXFXFXyX4X9.,.4.4X0XqXl l ;Xx @ v KX+ @ k ;Xn @ @ n n g a b aXv d tX8XX.o. .X. .8Xp p iXuX5 :X0X<.yXwX1.*Xd 8.9.wX4XyX5.5.2XwX:.wX1X1XyX9.,.9.9.0X1X,X<X<.<.:.<.wX2X,X,X,X,X<X<.:.wX1X9.0X1X,X2X,X:.>.;.0X1X9.5.4X5.5.,X:.-.:.qX1X<.>.-.-.:.wX4X<.>.;.FXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXFXFXAXZX^ ! c Y e.z.A.H.K.A.A.Z.j.h.h.l.l.g.A.G.j.A.h.h.z.g.g.g.g.d.z.g.g.g.a.f.f.a.f.i.a.k.a.a.i.k.a.a.f.a.f.f.f.f.k.k.f.z.a.g.g.j.g.f.g.f.g.g.g.f.g.a.g.f.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m m N N m m m M M M M M B N M N N V V m m B B B C N C C C C C Z B C C C C C C C C C C C D Z C Z Z V G Z Z Z Z Z Z D Z Z Z Z Z G Z Z Z Z F D Z G Z F { { { ' S y r r 0 ; r r r r r r r r r * y r r r r r r r r r r r r r r r r r r r r r r r r t : ; r r r aXLXLXLXLXLXLX{ ; % ; % LXLXLXpX* % e % r r : > q y * = ; ; y 0 : y * q ; y e : r 0 = e ; * q : ' LXLXLX{ % ; ; : : r * = : e : r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r y 0 0 r r * % $ $ t (.(.(.^.(.(.(.(.(.^.(.(.`.`.`.(.`.(.(.(.(./.(.(./.(./.(.(.(.[.(.[._.(.(.(.|.(.(./.(.(.(./.(.~.^./.{.~.~.T.~.~.!.^.T.T.T.T.T.T.T.T.T.T.T.~ ^ Q DXVXZXZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXVXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.o.X.,XtX,X,X,X,X>Xb -Xk @ + x x k ;Xt 6XiXA ;X-Xx k *X5 x h k tX1X;X:Xn p 4 2 2 3 7 2 2 2 3 h s k s -Xb o. .X.X.X. .6XuX>X<X:X:X-Xx :XyX;Xb 3X-X*X:X,X,X,X,X<X1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXZXBX[ ! S ` n.Q.^.^.^././.(./.(.(././.^./.(.^.(.(.(.(.(.(.(.(.(.(._./.`.`.].! / _ BXZXFXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXKX>X>XO s O w k n   8.eXg :Xo. .X.X.X.X.o.X.X.X. .+.v 2.4.:Xv 5 d d l p ;Xl - 3Xn p k ;Xx - g -X-Xg l 9.2.d @ + @ 5 z v k k v -Xh ;X-XM.n k 1XX.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o. . .[ +.+.| | +.X.X.X.X.X.X.X.X.X. . ...O.o.X. .X.X.o.ZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXCXZXFXQ Q ~ v.m.Q.).(.(._.`.(.(.(.(.(.(.(.(.(.(.(./././././././.~./.~.~.~.T.T.~ ! ! ZXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXx z z z z 2 =.2 2 :X:X{ } l { { } } { } } =.=.=.=.@ l z g 4 x 7 @ j 5.j d g j k a p k k a O n z 5 + p s - c s p z e =.7 s =Xd v >X:X-X  # # *X*X*X-X| o.X.O.v k k p h a @ / n n d W O.O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.VXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXDXDXBX_ ! Q [ n.Q./.!.(./.(./.(.(.[.(./.(.(.^.~.(.E././././.[.~././.!./.^.^.K.! / ' BXHXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX4X0X5.>.4.4X1Xx a b @ z @ v @ a a h 5 h z l a p h a *Xz z ;X . .o. ...6X>X,X*X*Xk @ *X9X,.tXwX5.v z 2.,.;.<.tX1X4XwX:.>.wXwX<.wX2X5.1XwX:.:X1XwX>.>.<.9.;.wX2X,X,X,X2X5.9.5.,X>.;.0X1X,X<X:.-.>.5.4X5.>.0X4X0X:.-.-.;.-.:.-.,.,.:.wX1X4.-.:.wXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXVXFXFXFXZX! ~ S I e.n.S.H.A.A.A.Z.h.h.l.h.l.G.A.g.A.h.h.f.f.g.k.f.g.z.a.z.d.g.f.k.f.f.a.a.a.i.a.a.i.k.k.i.k.a.d.k.d.f.f.k.f.a.g.a.g.g.g.f.g.g.g.g.g.g.g.g.f.z.",
+"m m m m m m m m m m = m @.m m m m m m m = m m m m m m N m m m m M M m m m B M M N M N N N V M F N B C N C N N C C N N A N C A C C C C B C C C C C D C Z F Z Z Z B C D C Z D C Z Z Z C Z C B Z Z Z Z D Z A { { { ' u t : r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r e 0 r 0 * y ; r t > IXLXLXIXLXLXLXsX% % * * LXLXLXsXf M.pX{ % : : : y * e pXpXpXM.u e ; > * { { ] S : = u { { { = S pXLXLXLXpX{ 0 ; ; ; r r r e e : r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r ; % $ $ $ (.(.(.(.(.(.(.^.(.(.(.`.^.|.`.(.(.(.(.(./.(.~.(.[././.(.(.(.^.(.[.^.[.(.(.[.(.(.(.(.(.(.(./.(.(././.~.(.~.~.~.~.T./.~.T.T.T.T.T.T.T.Y.Y.) c ! ZXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.7X,XyX,X2X,X1X-XeXl o z 8.8.k ;X@.{ eX@.:X;X:X:X- l n x -X,X<X-Xx v p 4 =.s + 7 3 *Xk p 7 < k k a b 6XO...o.X.o.X.+.8X:Xb -XO p ;Xn w b -Xh n 4 >X<X,X,XyX,XVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXHX] ! ! [ b.].].(.(.(.(./././.(./.(.(./.(.(./.(.(.(.).^.(.^.^.(.(.(.(.(.].Q ! _ BXZXVXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.6X>X+ @ 5 @ b 6Xf 3 8.< k :XO.O.X.X. .o.X.X.X. .+.v ;X5.:Xk g 2.*X@ k -X-X- l k a p g s h a g k h a k *Xz l v v k *Xl x c f z a - z @ 5 v :X} +.X.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X. . .X.| 6Xc 2 < x k k k X.X.X.X.X.X.X.X.X.X.+.} +.| | +.o.O...ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFX! Q ! [ F.!.~.(.(.(.(.(.^.(.(.(.(.(.!.(././././.~./.~.[.[./.~.~.T.~.T.T.~ ! Q ZXAXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX:Xk b s z z d z v 2 =.2 2 z 2 2 2 2 2 2 2 2 2 2 2 z k k s < { 2.a v k k h j 9.wXp =XiX=Xp l 8.8.5 a g *X- +.v d c eXeXQ z w h g a d l O # # k :X:X+. .X...6X-Xz k *Xz v x : Q f >  .O.X.X. . .......X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.VXVXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXDXDXDXBX[ ! Q ` b.].T././.(.~.(.~./.~././.(./.^.!.^.(.~.~.^.~.~.~.~.~././.[.(.K.! / _ BXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX5.5.3X4X0XqX,X>Xv d @ h g 5 - z h h 5 @ 5 g h a w g v x v 6XX. .X.....+.3X1XwX0Xx z x k *X2.>X1X5X*Xz -X2.2.:.wX<X,XtX5.9.:.9.5.:X1X4XwX<.,.0X1X,X4.,.0X4X5.wX1X1X1X,X,X4XtX:.:.-.-.;.0X1X,X;.>.-.;.0XtX,.4.1X4X5.-.>.-.;.-.:.5.4.wX4X4.>.,.9.4XZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXDXZXFXFX~ ! S U e.n.S.K.G.S.h.Z.h.h.h.h.h.A.A.h.h.g.h.h.g.g.g.k.g.a.f.a.k.k.f.f.k.i.z.i.f.f.a.k.a.a.a.a.i.a.z.i.k.k.f.f.f.k.f.g.g.g.g.j.g.g.g.g.j.f.g.k.k.k.",
+"m m m m m m m m m m m m m m m m m m m m m m m m m m m m N N m m m m m m M M M B M N N N N N V M N N N C N B C M Z Z B B A C C C C C u B B C C D C C D Z Z Z B Z F Z Z Z Z B Z Z Z Z Z D Z Z Z D Z Z D Z K [ { ' Q u : t r r r r r r r r r r r r r r r r r r r r r r r r 0 : r r r r r r r r r r : * y : r r e ~ LXLXLXsXgXLXLXLX- % % % LXLXLXIXLXLXLXLXIXt : y ; pXLXLXLXLXLXPXpX- = ; LXLXLXpX: : aXLXLXLX* pXLXLXLXLXLXLXc % % * : r r r r : r r r r r r r r r r 0 r r r e 0 r r r r r r r r r r r r r r r e r r 0 r > ; % $ o o (.(.~.(.(.(.(.(.(.|.(.|.`.(.`.^._.(.`.(.(.(.(.(.~.^./.[.(./.`.^.`.!.(.(.(.(.(.(.(.(.(./.!.(.~.{.~./.~.~.(././././.T.~.T.T.T.T.U.T.T.Y.L./ ! S ZXVXFXDXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.+.tXuXtX1X2Xp k g a a j 7 ;X;X* m @.0 ;Xv z l @ z h 5 k <Xb z - a h h kXv a 4 7 k 2.d 7 7 k 2.p w 2.n }  .X.X. . . .-X;XeX  a KXsXg v *X8.8.x >X>X,X,X,X,XVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXBX} ! c ` m.K.].(.(.(.(./.(./.(.(././.(.[.(.(.^.`.^._.|.(.(.`.(._.(._.(.!.S / ' BXVXFXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXFXO.7X>Xx n x 5 l g p 3 4 s *Xp -X+.X.O.O.o.X.X.X.X.7Xv d d w l g 9.0Xd p s k a z v g a @ k v z 5 5 g g - h z ;XyX=X5X=Xf M.iX! a 2.*XO j *XO n sXQ  .X.X.o.X.X.X.X.X.X.X.X.X.X.X.X. ...6Xk k s w z v g 2.k +. .X.X.X.X. . .O.[ 7 k s h b k | +. .CXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXFXFXQ Q Q c.n.Q.!.(.(.`.(./.(./.(.(./.(.(./././.(.(././././.!.~.~.~.~.T.~.T.~ Q ! ZXAXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX>X2.9.k g g b k h h h z z z z l v l v b v h w w w x k 2.j O s O w z d z l + k s p =XwX=Xg O 4 4 w a z p , > > p | { eX@.3 x 7 O -X, - + # O b k :XX.X.X...3X-XsX@ w b <X;Xf v :X6X..X.X.X.W > / , W  .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.o.VXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBX' ! ! ` b.F.].~.~.~./.~.(./.(././.(.!././.^.~./.~.~.~.~.~.(.!.~.~.~.~.Q.! S } BXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGX9.,.4.1X1X1X1X,Xz a ;Xg 5 k wXk z a h ;Xp 5 h ;Xg @ :X1X:XX. .X.X...8X0X4.>X,Xv v :X,X*XwX-Xk :X:X*Xg a -X-X-XyX<X,X2X4X0X>.wX4X2X,XwX<.;.,.0X1X1X2X5.wX1X4X<X9.<.0X1X1X2X<.>.-.-.-.>.5.4X2XqX9.-.>.-.9.5.4.<.0X4XqX4.-.>.,.4.4X1X,X,XqX4.5.0X1XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXFXAXFX~ S / U e.n.A.A.S.A.A.A.A.h.h.g.A.h.A.A.j.S.g.g.g.g.k.f.a.g.k.g.k.k.f.f.f.f.s.f.a.a.a.a.a.a.f.a.f.a.d.i.k.i.f.f.k.k.j.g.g.a.g.g.f.g.f.g.g.f.z.g.a.k.",
+"m m = m m m m m m m m m m m m m m m m m m m m m m m m m m m m N u m m m M B M M N M M M C M m N N B N Z N N A B A N N Z N A C C C C B D H C C C C Z C C Z D Z C C Z A Z C Z Z B Z Z D Z Z D Z D Z Z D Z D ' { c ' u ; = r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r ; ; 0 q r hXLXLXLXc { LXLXLX{ $ % ; LXLXLXLXPXLXLXPXLXgX% = { LXPXLXLXLXLXLXLXM.; % LXLXLXM.; * pXLXLXLX% pXLXLXLXLXLXLXn ; % ; : : : r r r r r r r : q r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r 0 r r % % $ $   (.^.^.^.(.(.(.(.(.^.(.|.|.(.(.`.^.(.`.(.(.{./.(.(.^./.(./.(.^.(.(.{.(.[.(.(.(.(.(.(./.(././././.~./.~.(././.~./.R.R.!./.T.T.T.I.T.T.T.T.! ! ^ ZXCXZXAXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.yXtXyX>XyXb x k *Xb -X:XuXb z 5 h g b z @ - l v @ g k b v 5 w 2.4 + 2.l 4 7 j k k k 7 7 -Xk v 7 2 =.j 6Xo.o.o.o.O.} k b @ a g v a x ;X4 7 5 ,X,X,X,X1X1XFXFXFXFXFXFXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXSXZXBX' / ~ ` n.Q.^.(.(.(.!.(.(./.[././.~.(.(.(.(.(.(._.(.(._.(.{.^.`.(.`.^.K.! / ' fXDXFXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X.+.@ 1 # z 5 z 2 =.5 *XyXf d 3X+.+.| X.X.X. ...+.k p 2.k a p k k k z g g a a v v z @ @ w g -Xv a + p k p :X4X=XiX=X-X} :X@.- 9.qXs 9.qXp gXsXf O.O.O.O. .O.O...O...O.X.....X.X.o.O.6Xk =.7 x + h h a k 6X .X.X.O.X. .+.+.;Xs 2.k k 2.k k p +.SXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXVX! Q ^ [ n.].(.(.(.(.(.(.(.(.(./.(.(./././././.(.~./././.~./.~.~.~.T.T.T.! ! ! ZXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFX:Xp k s d j 9.k - k -Xa 4 n 4 k *Xl *X*X:X5 b 6 w *X*Xk g s c f @ p 5.*Xz p :Xz - =Xs =Xk O # @ f a a a a p z z % = @.> 4 { x g 8Xn w :X5X:XsXp | O.o. . .2X-X5 @ @ z z d z k tX8X..o...o.W l eXd W o... . .X.X.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXFXZXBX} S ! ` b.F.].~.~.~.~.~././.~.~./././././.~./.~.^.~.~.~.~.~.~.~.~.(.[.Y./ ! _ BXDXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXeX4.4.<.<.:.:.5.z -XKX:X+ *XiX:Xg k k KX5 @ k KX,X- :X8XX. .X.....6X0X;.,.>X1Xb ;X:X-X*XiX1X*X<.9.-Xz d 8X6X-X2X,X,XtX<.:.>.wX2X2X4XwX,.-.,.0X4XyX,X1X2X,X1XwX>.-.;.<.wX<X-.-.-.-.-.>.5.1XtX1X4X5.;.>.5.4X1X;.4.4X4X1XqX4.5.wX,X2XyX,X1X1X1X4X5.VXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXVXFXZXAXDX^ ! ~ Y e.Z.A.H.S.S.A.Z.A.h.h.h.A.A.h.A.j.A.g.g.z.g.f.g.g.k.g.f.g.f.k.f.f.i.z.i.a.a.a.a.i.z.a.i.a.a.a.z.i.k.a.f.f.f.j.j.g.j.g.h.g.f.g.g.z.g.f.f.a.g.",
+"m = m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m M m m M M M M M M m N m N F m B B N B N C N C Z C N A C A C C C C C C B C B H C C C F C B Z Z Z C Z D Z Z Z D C Z Z B B Z B Z A Z Z G D ' { ' c u y r r r r r r r r r r r e 0 r r 0 r r r r r r r e 0 e r q r r r : r r r r r e = y e r ; - IXLXLXLX$ - LXLXLXgXo $ $ LXLXLXLXc & IXLXLXLXe 0 IXLXLXIX> t IXLXLXPX- ; LXLXLX6X* % pXLXLXLX= n sXLXLXLXsXc - , % % % * r r r r r r r r * e r r r r r r r r r r r r r r r r r r r r r r r r r r * : r r : : % $ $   {.~.^.(.^./.(.(.(.(.(.(._.(.`.^.(.(.(.(.(.(.{.^.^.).(.(./.(.^.^.(.(.(.(.(._.(.(.(.(.(././.(./.{.(./.(.~./.[.~.~././.~.R.~.T.T.T.I.T.T.U.~ / Q ZXZXVXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.+.+.6X2XyX;XsXa a z b s 5X;Xp =Xb -X1Xb x g k -Xn k >X,X,Xj n n g k + p a a g k k a @ p p k -Xz h 4 w b 7XO. .o.X.X.+.8X:Xv v z l v x a p v ,X,X,X1X4.5.FXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXDXFXFXFXFXFXZXFXCX' / S ' F.Q.!.`.(.(.(.(.(.(./.(.(.(.(.(.(.(.(.(.(._.(._.(.|.^.(.(._.`.].! / _ BXDXAXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXo.X...7X*X4 sXn @ < 2 w s =X> z :X-Xk g | O.X. .O.8Xv g 9.0Xa -Xa + g v z a z w l z p k k a z ;Xl 5 p g k z ;X1X*Xs s d @.m t a k k + k k @ l @ z } 6X} 7X6X} 7X} } 6X} 7X7X6XX.X.o.+.:Xk @ :.8.g w x n 4 < KXX.X.o. .| k *Xk k v *Xk g x 5.*X+.CXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXVXFXQ Q S [ n.Q.(.{.`.(.(.(./.(.^.(.(.(.~././././.!.(././.~.~.~./.T.T.~.T.T.! ! ! CXHXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFX<Xg 2.k - p k s a -Xn 5 b 8.j # 2 l =.0X:X7 { 2.@ 2 =.2 2 s 8X} + j 9.;X@ v KX:Xd z g 4 k 2 2 4 - :X-Xo f s d p -Xv *Xb 3 s O 4 x k + -X1Xv + p > O.X.+.} 3Xb l w z z b k + v :X6X+.| +. .X.x n d W O... ...X.X.X.o.X.X.X.X.X.o.X.X.X.X.X.X.X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXAXFXHX[ ! ! ` n.F.Y.~.~.~.T./.T.T./././././.~.~.~.~.T.[.~.T.~.T.T.~.~.~.~.[.F.! ! _ BXDXCXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX3X4X4X0X4.4.4.5.v a v z 5 g *Xk z a a v + - g b z v ;Xo.o.X. ...8XwX>.>.-.<X>Xv p >X-XO *Xk b 9.4.v z p -X-X-X1X>X1X0X>.-.>.wX<X<.wX2X4.>.,.0X1X2XtX9.wX2X1XwX>.>.-.,.5.4X5.>.-.-.-.>.qX1X,X4.0X4X:.>.;.qX4X5.;.<.qX1X1X4X1X2X1X4.qX2X2XyX1X5.>.ZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXAXZXFXAXZX^ ~ ~ Y e.b.A.G.S.A.A.h.h.h.h.h.h.h.h.A.G.j.h.h.g.k.k.k.f.d.a.g.f.f.f.f.f.k.i.i.z.a.a.s.z.i.a.f.a.k.a.a.a.z.d.f.f.f.j.f.a.j.z.f.g.g.g.f.k.f.a.f.g.a.",
+"m m m m m m m m m m m m m m m m N m m m m m @.m m N m m m m N N m M M m M M M M M M M M B B N B B B N N N N N C N B Z Z N A N N C C C C C C C C C Z C C Z C C Z Z B F B Z C Z C Z Z Z Z G C C Z Z Z Z D F ' ' ' Q u r ; r r 0 r r q : r r r r r r r r r r r r r r r r r r r r r r r y * r r r * r 0 y ; ; r ' LXLXLXIXsXM.IXLXLXLX- o % LXLXLXpX$ o { LXLXLXn c LXLXLX{ 0 % { LXLXLXc & LXLXLXpX% % pXLXLXLX% % ( LXLXLXS o & $ & % : : 0 r r r r r r r r r r r e q r r r r r r r r r r r r r r r r r r r r r r * y 0 0 r : % $     |.[.(././.(.(.(./.(.(.(.(._.(.^.(.(.(.(.(.(./.(.(././.(.(./.~.`.^.`.~._.~.(.~.(.~.(./.(.(././.(.[./.~.~.(.~.(./.~./.~.~.T.T.T.T.T.U.T.T.~ ~ ! FXVXFXFXAXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. . ...<XyXv a s @ n sX+ k b p KXKX;X1X;Xn l -X:XM.5 v ,XuXj j s z 4 =.s + x a j k p z j b s 4 2 j *Xp 7 7 7X..O.X.o...X.:X2X,X,X,X2X:Xv z >X2X,X,X1XqX>.FXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXCX} ~ ! ` n.].~.`._.(.(.(.(.[.(.(./.(.(.^.{._.[.(.(.(.(.{._._.^.`.(._.^.].! / ' BXDXFXAXFXZXFXFXFXFXFXFXFXFXFXFXFXZXFXFXFXFXFXFXHXX.X.X. .6X;XIXl @ a z l S qXeX> z p 2.*X} ..O...+.<Xk p k k @ a z x d @ l x h 2 2 w v j 2.d a x p + + p + + w z x d w 5 h x b v z z w @ @ a + h z g g z g g h g g g l z h k :X+...O.n 2 7 5 O 4 g h 4 < O k *X6X+.X.| -Xk 5.k -Xk 2.l l z z v 8XCXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXZXVXQ Q S b.m.!.].`.`.(.^.(.(./.(./.(./.~.(.~.!././././.~.~.~.~.T.T.T.T.T.T.! S ! ZXAXFXAXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFX<X2.5.;Xp s -X-X5 a k s 4 7 4 2 2 7 3 =.2 3 s O h 2 2 2 2 s k l - h k k d p v k - z 3 2 =.< 2 7 f 8X,X> +.n @ v 6X:Xa z - a w - 5 z z z h w z l z f c c l w z :Xk # O 2Xn O z l - + x - k } @.f > W O. .......+... .X.X.X.X.X.o.X.X.X.X.X.X.o.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXAXBX' ~ ~ ` b.F.!.~.T.T.~.T./.T.~.~.~.!.~./.T.~.~.[.T.T.T.T.T.~.~.~.T.(.~.].Q ! } BXZXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXyXyX2X1X1X1X1X1Xl s s g g 5 @ z j @ z w z z z z x 6XX. .o.X...6X1XwX4.4.5.2XuXb g iXuXa w @ d v v g z ;X<.:.<.:.9.<X0X>.-.>.wX,X5.wX2X,X5.4.:X1X1XwX,.qX4XtX<.<.9.-.-.:.wX2X;.-.-.>.:.wX1X4.>.5.4XqX9.,.,.0X4X:.-.-.qX1X2X2X4.:.,.9.1X2X,X1X<.>.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXAXAXZX! ! S Y b.Z.H.H.H.H.A.Z.h.h.l.l.h.A.h.G.g.A.h.z.g.k.k.k.k.g.f.k.d.g.k.f.z.a.f.i.a.z.k.a.i.i.z.a.a.a.z.i.i.z.k.i.f.f.f.x.a.j.g.g.g.a.f.f.f.f.f.f.i.a.",
+"m m m m m m m m m m m m m m m m m m m m m m m N m m N m N N m m M m m M M M M M M M M N M M m B N B N Z A N C N A B B B C Z C A C C C C C C F C C C Z Z Z Z Z C A D C Z C Z Z Z B Z Z Z H Z D B Z Z D Z C ' ' Q Q > ; ; r r r r r e r r r r r r r : r r r r q e r r r r r r r r r r r r r r r y : r * e * y aXLXLXLXLXLXLXLXLXLXLXn $ $ LXLXPXsXo o x LXLXLXn Q LXLXLXc $ $ b LXLXLX' o LXLXLXsX& % M.LXLXLX& & c LXLXLXc   o $ $ % % e r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r t * y * r * & $ o   T.[./././././.(.(./.(.^.(.(.(.`.(.`.(.(.(.{.^.(./.(.(./.^.(.(.^.^.!.[.^.(.[.(.(.(.(.(./././.{./././.[./.~.(./.~./.Y.~.R.~.T.T.T.P.T.T.R.~ ~ S ZXVXAXGXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. . .3X>X>X>X<Xb - a p k ;X@ -X-X-XyX-Xz g -X-Xg p -X1X,X>X>X>X;X- kX-X3 3 z 2.2.p h 9.qXs 4 2 4.qXv 4 =.;X} } o.o. ...6X2X2X,X2XyX-XsXw g >X,X,X,X1XqXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXBX' / S ` n.].^.(._.(.(.(.(.(.(./.(.(.^.^._.(.(._.(._._._._.`.^._.(.`.[.~./ / _ BXZXAXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXX.X.X. .+.c v 4 - f s z | eX} f < j @ s -X} } } :Xg p p - p p a v n z p x n z @ z k *Xk s a d 2 =.< j <   + p @ -X*Xv c + ;X:X<Xk =.s O 2.g v b k k p k k + x sXl h k k O b sXn } 7X;Xl l l z p - z g g j k p k g k k k l d k 5.k k a l s x k <XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXVXAXQ Q ! [ n.].(.(.^.(.(.(.(././.!.(.!.(.~.(.(.E./.~.~.~.~.~./.T.T.Y.T.Y.Y.~ ! ! ZXAXVXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXGX:Xk *Xk w n KX-Xz x z k :X-X2 2 =.l 2 2 l g h 5 g l ; d h z a a d a 5 x l - h z v @ z x z - z x p v s   , % d p v k @ a -Xo O -X-X@ z x @ O 6X..X. ...} j =.3 :Xs # # v a + x n l + sX;Xp d f n l / O.X...+., / > W o.X.X.X.X.X.X.X.X.X.X.X.o.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXAXFXZX_ S ~ ) b.n.R.T.T.T.T.~.T.~.~.T.~.~.~.!.~.~.T.T.T.~.T.~.T.~.T.~.~.T.T.K.! ! ] BXHXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXSXGXyX9X<.5.1X1X1X<Xv =XiX=Xw v z *Xk g z k g v p v :XX.X.X.o.X.6XtX2X1X4X4X1X>X:Xb p *Xk - a -X-Xj 9.k b :.-.<.4.<.>.wXwX>.-.-.<.tX1X2X2X,X1X4XtX9.wXwX;.:.wX<X5.tX1X4.-.>.qX4X4.>.-.<.tX1X,X;.-.;.0X4X1XqX4.wX1X:.-.-.-.qX1X2XqX9.4.wX2X,X,X2X<.-.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXFXDXAXFXZX! ! S Y e.b.Z.A.H.A.A.Z.h.h.l.l.l.G.A.h.A.A.h.l.g.g.z.g.k.f.g.d.g.d.k.a.s.a.z.a.k.a.a.z.z.a.a.a.a.f.a.a.i.a.i.z.d.f.f.j.f.f.f.a.j.j.f.f.f.f.f.a.g.f.",
+"m m m m m m m m m m m m m N m m m N m N M m u m m m m m N m m N m m m m m M M M m M M M N B m m B V C V B B B B N C V C N A A C C C C C A C C C C C Z C C C Z C Z Z B Z C Z C Z Z Z Z Z D C D D G C F C F Q ' ! ^ y ; ; r r r r r r r r r r r r r r r r r r r r r r r * y r r r r r r r * t 0 : : r r : t - IXLXLXLXLXLXLXLXLXLXLXIXo $ LXPXLXsXo o { LXLXLXl w LXLXLX{ o - { LXLXLXf   LXLXLXpX- o gXLXLXLX$ $ x LXLXLXn o o o $ % * * : r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r : r 0 r r r r r y * $ $ o   /././.~.(.~./.(.(.(.(.(.(._.(.(.(.(.^.).|.(.{.(.(.(.(.(.(.(.(.(.(.(.(.(./.(.(./.(.!./.(./.(./.(././.[.(.~.~././.R.(.~.T.~.T.T.T.I.T.T.T.~ ~ ^ ZXVXFXZXVXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.+.yXyXtX1Xb l z v v l ;X>X:X,XyX,X>X>X,X,X>X<X,X,X,X,X2XyX:X4 q.z 2 7 v v v z d k k p 7 3 j *Xa 7 2 2 2 2.7Xo.X.X.X.8X>X,X,X3X:Xh p k ,X2X,X,X,X2XAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXBX} ~ ! ` F.Q.(.`._.|.^.`.(.(./.(.(.(.(.(.|.(.`.(.^.`.`.(.|._.^.{.^.|._.!.! / _ fXDXGXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXo.o.X.X.X.+.+.;X! } c h y m @.z =.q.j @ :Xk p z g O 2.k s ;Xo s g 5 a h + @ g g =X5X=Xs :Xn a < =.2 8.=.@ n 8.@ :X=X-X6X- d z z z kX-X@ 9.2.-Xv 7 2.s j 2.p kXsX@ v j 2.p aXKX5 l j l 7 2 =.2 > f d :Xd 2.5.k k 2.k k 2.p l v z x z z b k 2.k 6XZXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXZXAX! ! ~ c.F.Q.]._._.(.(.(./.(./.!.(.~././.~.^././.~.T.~.~.T.~.T.T.T.U.U.P.! ! ~ ZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX<X:X*X:Xz a *Xk :X>Xz p 6Xk < 2 2 l 3 =.w 7 x 7 d p :X-X  b 4 5 p 6Xk d 4 x 7 z -Xp k <Xk v v z k s k , , s a a -Xv - v :X' p 8X8X- z KXl v +.O. . ...j =.2 7 l h w p @ g v w z a O v v + ;X<X,X>X;X......W z sXh W  . . .X.X.X.X.X.X.X.X.X.X.X.FXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXFXHX| S ! _ b.F.K.!.T.T.T.T.T.~.~.T.~.T.[.~.~.T.T.T.T.T.[.T.T.T.T.~.P.~.[.Y./ S } BXZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX7X9.,.-.1.5.1X1Xv =X>X=Xd 8.n a g d :X:Xp -Xd *X6X .X.X.X.+.<X2X2X0X9.2X1Xv l v v z v x d 8X8Xj >.v 2.>.-.wX4X<X5.1XwX,.-.-.-.wX1X>XuX1X>X<.;.,.wXwX,.>.9X1X1X5X2XtX,.,.,.wX4X5.>.9X1X4X>X:.,.>.>.wX1X4X4X4X9.-.>.>.-.-.0X4X4X4X4X4X4X>X>X4X<.,.FXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXFXAXVXAX^ ! ! Y e.b.H.G.G.h.A.A.l.h.l.l.h.h.z.l.l.l.h.h.h.h.k.g.k.k.f.f.f.f.i.z.j.i.i.g.i.k.i.a.a.a.a.a.d.k.a.a.k.a.i.z.f.f.f.f.j.g.g.g.a.g.f.g.g.a.a.k.d.a.",
+"m m m m m m m m m m N m m m N N m m m N m M m m m m m m m N m m m m m M M m M M m N M M N N B B N N N N B B B B C N C N C N N C C C C C C C C F C Z C C F B C Z C Z D A C Z Z Z Z Z B Z Z D Z Z Z Z C H S I ^ n S u r y ; r r r r r r r r r * y r r r r r r r r r r r : r r r r r r r e e r y : : r 0 : > ' LXLXLXLXgXIXgXIXPXLXLXLX- o LXLXLXLXsXn PXLXLXIXo $ IXLXLXPX{ n PXPXLXUX$ o LXLXLXPXpXaXLXLXLXLXo $ c LXLXLXsX'   & % % : % : r = r r r r r r r r r r r r r r r r r r r e r r r r e r r r y r r r r = r r r : % , $   o /.~.(.!./.[.(./././.(.(.(.(.(.`.^.`.(.(.(.(._.(.^.^.(.(.(.^.(.(.(.(.^.[.(.(./.(.(././.(.(././.~././././.^.(././.!.T.~.~.T.T.T.T.I.T.T.T.~ ~ ^ ZXFXZXZXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.+.+.3X1Xb -X*X;X>X>X>XyX1X,X,X2X>X<X,X,X,X,X,X,X,X,X,X2X;Xl z z a @ z l z d d @ @ z l 7 3 j 3 4 =.=.=.3 6Xo.X.X.X.X.6XuXyX2X5X>X>X>X2XtX,X,X,X2XAXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXBX' ! K { n.].].`.|.|.|.(.^.(.(.(.(.(.(.^.{.^.^.(.`.^.(._._.|.)._.(._.^.].! / ' BXDXZXZXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXo.o.o.X.X. .o.+.= > d p w 4 w l O 6 p f 7X/ - n ;Xj 9.-Xz 8Xu @ l w x n z z k k =XiX=Xs v -Xa 3 2 < O 4 # O   + z s s l O -X, + w q.4 O k g p p O n aXv k g l - + z k p z z g + 5 2 2 2 =.2 3 +.+.f :Xz s s p x k -Xv k k l ;X@./ n j 4.k -Xv +.CXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXVXAX! S Q [ n.].{.(._._.(.^./.{.(./././././.~.(./.~.~.~.~.T.T.T.T.T.U.U.P.P.! S ! ZXVXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXb z g z z z w :X,X:X@ b KX:X@ z l l l 5 h 7 { q.d v KX-Xz 8.8.+ v 8X:Xa 7 { 2.5 h # + :X-X;Xz w -X2.9X+ -X-Xd z sXyXa f x k O -Xv d a v g !  .+.+.+.6Xj 2 =.4 a v v + n k *Xz h - z @ a z -X>X:X:Xv W G W W b n g W o. .....X.X.X.X.X.X.X.X.X.X.FXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXHX' Q Q _ b.F.K.R.T.T.Y.T.!.T.~.T.~.T.~.T.~.~.Y.(.T.T.T.T.T.~.T.T.^.T.[.L./ S ' BXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXO.9.,.-.-.-.<.5.v s =Xs z h @ s 6Xf } 6X:Xk s :XX. .X.X.X.6X1X,X1X5.,.tX2Xv :X4X0X<.4.b a -X-X2.>.j -X4.4.:X,X:X<X>X:X4.4.4.2.:X>X:X:X:X:X4.4.4.:X:X2.4.:X<X:X:X:X<X2.9.4.:X>X:X2.wX:X:X:X2.4.4.9.;X:X:X<X>X2.4.2.4.4.4.0X<X:X:X:X:X<X:X:X>X9X4.HXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXAXFXAXFXZX^ Q ! Y b.j.Z.G.H.A.A.A.l.l.A.h.A.A.G.G.l.l.l.k.l.k.g.g.g.k.f.f.f.a.f.i.f.k.a.k.a.i.z.a.z.i.a.k.a.a.a.a.a.k.i.d.f.f.f.f.f.f.f.a.g.z.f.a.s.a.a.a.a.a.",
+"m m m m m N m m m m m B m N m N N m N m m m M m m m m m m m m m m m m M M M m M m M M M N B N B B N N N B B B B M C N C B C C C C A B C C C C C C C Z C C F C D C Z Z D Z F D Z C Z D Z B Z G C Z Z C F S K u Q u u ; r r y r r r r * y r : 0 e r r e r r r r r r r r r r r r r r r r r r r r r : r ; e ; aXLXLXLXsX  o o   sXLXLXLXpXo LXLXLXPXLXLXLXLXLX6Xo $ c PXLXLXLXLXLXLXPXt $ o gXLXLXLXLXLXPXLXLXLXo $ - LXLXLXLXPX- o % % % : r r r r r r r r r r r : * y r r r r r r r r q r r r r r e r r * r r r r r y 0 r * % $ o   % ~.T.!./.~.^././.(.(./.(.(.(.(.^.`.^.^.|.|.{.(.{.^.^.(.(.(.(.(.(.(.(.(.(.(././.(././.(././.(.(./././././.(.~.!./.~.~.T.~.T.T.T.T.T.T.T.T.~ Q ^ ZXZXZXZXFXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .<X,X3Xb d x @ -X1X,X,XyX,X,X,X<X,XtX,X>X>X,X,X,X,X,X,X,X>X-X@ -X-Xp - + a O -X> O 7 g l g d 7 2 2 2 2 =.7XX.X.o.o.+.+.+.6X+.7X} 8XuXtX>X5X>X,XVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXBX[ ! ~ [ m.].`.`.|.{._.{.|.{.`.(.^.`.^.(.(.^.`.`.^.|.|.`.|._.{._.|.{.|.].S / _ BXFXFXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X.X.X.X.X.X. .+.6X=X1 j O z - - z 5 , @., + @ O p b k z v k 5 l u eX0X} eX- g s s s s s *Xg h -X, # -X-XO v v a + 7 + w eX{ a d @ @ l x v k k p KXsX+ z 5.4.z 4 =.s p h k ,   h g 2 a ;X2 2 = > a *Xa j 0Xk z l l l b v c X.O. .+.-Xv k :XO.X.FXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXZXFX~ ! ~ c.n.'.^.{.(.(.(.(.^.(././././.~./.(.~.~.~.~.~.~.~.T.T.T.T.P.L.L.P.! ! ! HXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX:Xg j k 2 2 z z d z l p -X@ z 2 2 ;X=.2 h < s O w p v k O 2.4 d p -Xk d < s O h -Xd v >Xk v p @ k -Xk s s @ d a v k a a @ g x z z k v g z f c z x x 7 < :Xl z a 2XKXz sXw a w k k O n x @ z l d O :Xo.+.o.W @.@.@.W  ....... .......X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXAXAXBX[ ! ! U b.Z.K.T.T./.Y.P.~.~.~.~.T.~.~.~.T.Y.T.T.T.T.T.T.T.T.~.T.~.T.(.F.~ / _ BXZXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXGX+.eX4.;.-.-.>.<.x w w z g v v 6X .x +.O.O.6X*X7X..X.X.o.+.,X,X,X1XwX5.,XyXv 8.1.;.-.;.b ;X>XyXwX5.:Xv k -Xv v k v k v v k k -Xv v v v k v v k v v v -X-Xk k v k v k v k v k z k v z k k v k v k k z k k v v k v -X-Xv z k v k k v k v v v k v v FXDXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXVXZXZXVXZX~ ! S Y e.e.A.G.H.A.h.A.h.h.h.h.A.A.A.l.l.l.h.h.k.h.g.g.g.k.f.f.f.f.z.f.i.d.i.k.f.a.i.a.i.i.a.k.a.a.a.a.a.k.z.f.i.f.f.i.f.f.f.f.f.f.f.f.k.a.a.a.a.a.",
+"N N N m N m m N m m m m m N B M N m N m M m M M m m N V N N N B m u M M m m M m m N M M N B N B V B B B B B B B A M C V C B A C C C C C C C Z C C C C C C C C C C C C B Z B Z C Z Z Z C F Z Z Z Z H Z Z S A u S ^ t y r r = r r r r r r r r r r r r 0 r r r r r r r r r r q r r r r r r r r r r r r t : e IXLXLXLX{ o $ o   { LXLXLXIX+ LXLXLXM.IXLXLXLXaX  o $   f IXLXLXLXLXIXn o $ o - IXLXLXLXgXn LXLXLXo o o pXLXLXLXLXc $ & % * r * r r r r r r r e r y * r r r : r r r r r r r r r r r r r r r r r r r r r r r e : % % o   u ~./.I./.~.[./.~././.(.(.(.(.(.`.(.`._.|.^.{._._.`.`.`.(.`.`.(.(.(.(.(.(.(.(.(.(./.(./.(.(./.(.(././././.~.(./.~.~.~.T.T.T.I.T.T.T.T.T.T.~ Q ^ ZXVXZXZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.yX2X1X;Xz KXx v uX2XyXtX<X2X,X2X2X2X2X1XuX>X1X2X,X,X,X2X1X:X- 8XKXk w b 8.+ :X{ h b 5 k k d 7 7 k k O =.6X . .o.o.o.+. . .o.......+.+.6X+.8XyXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXHX' ~ ~ [ m.].'.|.|.|.|.|.|.`.`._._.|.|.(.(.^._._._.|.(.^.`.|._.}.^.{.|.Q./ / ' BXZXFXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.X.X.X.X.X.X. .X. .6X8.sXk d 4 n 4 5 z 4 7 l a w g z 4 h z @ l l | pX;X= + p a w z a O v s k l <X} @ KX3X& 6X} & 3 9.n @ v k + a -X:XO *Xs 4.0Xs b b 5 @ g k p z lX;Xh z <X{ a 4 q.2.< 2 2 2 2 z f n a 2.5.v 4 2 2 < *X{  .X.X.X.o.o.O.O.X.X.X.FXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXZXFX! ! ~ c.n.Q.(.{.(.(.(.(.(./././.[././.~.~.~.~.~.~.T.T.T.T.T.T.U.P.P.L.P.! ! ! ZXHXZXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX<X2.9.-X2 2 h g j k - d @ w z 2 =.2 2 =.7 z g p d d - - @ - - d z > d d 5 w 5 g v z d d z @ h z x -Xv l d d d a @ w 4 x 7 -X2X2X:X:X+.n |  .+.X.+.} 2 < IXc z d ;X;Xp g g a d KXb O n l a h sXn p :X2X:Xl l x v !  .X.X...W = ( > W  . .X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXAXFXBX' ! Q _ b.F.R.T.I./.Y.~.P.~.T.T.~.T.T.Y.T.T.T.T.P.T.T.T.T.T.T.T.T.T.T.F./ ~ ] BXHXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDX8Xo.8X0X;.-.>.<.v l v @ d ;X8X .6Xk :X} 6XX.+. . .X.X.o.+.,X2X,X,X1X4X1X1Xb ;X9.:.>.:.b ;X2XyX,X4X1X<X:X4.:X>X<X<X<.<.<.4.<.<.<.9.:X,X<X>X-Xv >X>X>X<.<.<.<.9.:X<X<X,X<X4.4.<.<.wX2X2X<X4.9.<.0X3X1X<X1X4.<.<.<.<.;X1X,X1X2.9X5X:X<X=X:X:X:X:X:XZXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFX~ ! ^ G b.Z.Z.A.A.A.z.Z.h.h.h.h.h.z.A.l.l.l.h.h.h.h.g.g.g.k.f.f.f.f.f.f.i.k.k.a.i.f.z.a.a.k.a.a.a.a.a.k.a.a.i.f.f.k.f.g.a.f.f.f.f.f.a.f.a.a.k.a.a.a.",
+"m m N m m m N m m m N m N M m m m m N M m m m M m N N N m m m m m M M m m N m N M N N N N N N N N B N Z B B B B N M C N C C A C C C C C C C C C F C C C D C D C A Z C Z C D Z Z Z Z Z Z Z Z Z Z Z H Z Z Z S r u u t y > = r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r y * r y ; e % - - $ $ o o o       o , $   $ , o o z c $ o   o $ $ $ o d c c w o   $ & $ o o c c w o o o $ o o $ , $ w f c d $ $ & % ; * ; ; r e r r e r r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r 0 r : * & o     ` T.T.T.T./.~././.(./.(.(.^.(.`.(.^._.|._._._._._._.|.`.`.(.`.(.(.(.(.(._.(.(./.(.(.(.(.(.(.(./././.~.~.(.~.~.~.~.~.T./.T.T.T.Y.T.T.T.T.T.~ ~ S ZXAXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.,X2X,X;X+ v g v ,X3X<X:X,X:XwX>XwX:X>X:X:X>X:XwX>X,X2X2XyX:Xp v v a 5 4 3 O x v 4 < g 2.5.v x *Xj 2.g 2 7 6X}  .o.X.X.X.X.o.o.X.o. . . . .X.7XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXBX[ ~ ~ ` n.K.].dX'..X`..X|.|.|.|._.^.`.(.`.}.}.}._.}.}.}.|.}.{.}.}._._.].! / _ fXDXFXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXGXo.X.X.X.X.X.X.X.X.X. .% 8.< @ 8.M.x @ 2 =.2 2 2 l 2 =.2 2 2 2 =.w = = @.  -Xl + l n g l sX- d l b k s l -X+ > @.p < O h + f s p z -Xx p k -Xk v f } +.} z z h z 4 2.x < z b -Xg w 4 j < 2 2 2 7 _ iX{ 5 g b g g =.=.=.p + X. .X.X.X.X.o.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXZXAX! Q ! [ F.K.].^.(./.^.{.(.(.(./.~.~.~./.(.~.T.~.~.~.T.T.T.Y.P.P.P.L.L.L.~ ! Q ZXFXAXAXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFX,Xk *Xk :XtXh j 9.;Xp 2.k 5 2 =.2 2 2 2 2 w z -Xk d k -Xk O 2.k - p ;Xn + 6Xk d :Xk v v p j -X-Xv h h -X<Xv d ;X-Xa 5 { x *XKX7X;X7X..! | O.O.o.6X-X3 3 *Xv a ;X:X:X*X:X:Xk h v l O l h a @ v v p :X2X-X4 x k >X8X..X.o. .+.$ eXg W +.o.O.o. .X.VXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX[ ! Q Y b.F.K.T.T.T.T.T.~.T.~.T.~.T.Y.T.T.P.T.T.T.T.P.T.T.T.T.T.~.T.~.K.~ ~ ' BXHXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXHXqX5.X.6X0X;.,.<.z v n h h >X6X+.-Xk k v -X:Xo. .o. .X.O.+.4X1XyX1XwX<.9.4.b -X4XwX<.,.x -XyX4XwX<.9.1X0X>.wX2X2X<X<.>.-.-.>.-.-.,.0X1X>X1X;X-X4X1XyX4.<.-.>.>.0X1X,X,XtX,.-.;.;.qX4X1X4.,.-.,.5.4X1X4X1X2.>.>.-.>.4.4X1X1X:.4.>XO # O # O O O O DXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXZXFXFXDX! ! Q G b.e.H.G.A.A.A.A.h.h.z.h.h.S.z.h.l.l.h.g.h.k.A.k.k.k.g.d.f.f.a.z.z.a.i.a.a.a.a.a.a.k.a.a.a.a.a.a.k.a.a.z.f.i.j.g.a.g.z.g.a.g.a.a.g.a.f.i.a.a.",
+"m m m N m N m N N m m m m N V M m m m N M N m M m m N m m N N N M m m m m m N m N m m N N N N B B N N N B N N N V C M C N C N C B A B A B A C B C C C D C C C C C Z C F Z B Z Z C Z Z Z Z Z Z Z Z Z Z Z F S y u > u : : r ; r r r r r r r r r r r r r y r r r r e r r r r r r r r r r r r r r r e r r = = y ; % $ $ , o o $ $ $ o $ o $ $ o $ o $ $ o o o $ $ $ $ $ $ $ $ o $ o $ o o $ , $ $ $ o o $ $ o o o , o $ & % $ $ o $ $ % % ; ; r = r r r 0 r r r r r e r r r r r r r r r * : r r r r r r r r r r r r r r : ; * $ o     F.~.T.~.!.~./.!././.(.(.(.(.(.`.`._.|.|._._.{.|._._._.(.`._._.(.^.(.(.(.(.(.(.(.(.!.(.(.(.(.!./.(./.^.^.~.~.~.~.~.~.~.T.~.T.T.T.T.T.T.T.T.~ ^ ! VXAXFXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.+.,XuX;Xw - h l v v l l v 4 2 2 2 2 2 2 7 7 2 2 j yX,X:X>X;Xw - @ h g 5 5 z z w 4 l v k k s w 4 -Xk k :Xs k k +.O.X.X.X.X.X.X.X. .X.X.X. .X...FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXBX{ Q ~ { n.].'..X.X.X.X|.|.'.|.{.|.`.(.(.`.}.}.[.|.{.}.}._.}.}.}.}. X_.].! / ' BXZXFXFXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXVXo.X.X.X.X.X.X.X.X.X.X. .+.6Xv O 7 4 z 2 2 2 2 =.w 3 2 2 2 =.2 2 7 p -Xv O -Xv z z z g @ h s *X>X>X>X>X>X>X>X>X>X-Xh v s o +.{ a a s k O 9.2.f  .o. . . .X.8X:Xz z - @ z w v :X;Xv >Xk 2 =.2 =.:X| eXD < z l b x <X*XM.<Xl +.X.X.X.X.X.X.X.X.X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXVX! Q ! c.n.~.]._.(.(.(././././.!././.~.~.T.^.~.~.~.T.Y.U.T.P.P.P.P.L.U.D.S ! ! ZXAXAXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX2X:X>X:X:X:Xl p *Xp j 9.-Xz 2 2 2 =.2 =.=.h f KX:X- n KX-Xz 9.*X@ v KX-Xs KX:X- :X-XKX8Xg 9.wXk k k p 5.k d f KX:Xa < s s b +.O.| +.O.! { 7Xo.o.n e w h a a z d z z v z a g h h g w - h z @ x d z h z z z ;Xn -X6Xo.+.o.+.+.f :Xg / 3X<X6X7X.. .FXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXFXAXFXBX{ ! Q I b.n.K.T.~./.T.T.~.~.T.~.~.Y.[.T.T.T.T.P.T.T.P.T.T.T.P.T.T.T.~.F.^ / ' BXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGX1.<.6X..8X0X9.9Xv d d p z >X7X+.k ;Xk :Xa g 6X .X.X.X.o.o.0X4.2X1X5.,.;.4.b :X1X1XwX5.b b 9.4X0X,.>.tX0X,.wX1X2X1XtX4.4.4.<.-.-.>.wX,X>X2X-Xb 4.wX1X1X<X4.-.,.qX1X,X2XwX-.-.;.>.5.4X:X,.>.-.-.:.<.<.0X4X4X5.-.>.-.;.1.<.:.>.4.4X-X:X*X:X=X:X=X:XGXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXVXVXDXFXVXDXQ Q ^ U e.e.A.G.A.A.h.Z.h.h.h.l.l.l.A.h.l.l.h.h.f.h.g.g.k.f.k.g.f.f.a.a.i.a.f.a.a.a.a.a.a.i.a.a.a.a.a.k.a.a.a.a.f.k.a.a.g.a.a.a.g.a.a.z.s.f.a.a.a.a.",
+"m N m m N m N N m m N N N m m N N m N N M M m M N N N N m N N m M M m N m m m m m N m N N V B N V B N N B V C N M C N C C N B C C A C C C u B C V C C C C D D C C C F C C Z Z C F B D Z Z Z D D H Z Z H D Z y : e y y ; r r r r r r r 0 r r r r r r : * r r r r r r r r r r e r r r r r r e r r : e r e : * % % % $ o $ $ $ & $ $ o $ $ $ o $ $ $ $ $ $ $ $ o , & & % $ $ $ $ $ $ o $ & $ % $ $ $ $ o $ $ o o $ $ % % $ % $ $ $ % % * : : * ; r r r r r r r r r r r r r r r e 0 r r r r r e 0 r r r 0 r r r r r r r r * % $     & T.T.T.~.~.~./.!././.(.(./.(._.(.(._.|._._.(.|._._._._._._._._.(.|.(.(._.(.^.^.(.(.(.(.(.`.(.(././.!././.~.~.~.(.~.T.T.T.T.T.Y.T.T.T.T.T.T.~ Q ^ ZXAXFXZXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X. .X.X.X.X.X.X.X.X.o.X.+.6XyXs # # k 1X>X<X3X;X@ j j 6 7 k k h p k k v uXv l x + 4 u j 4 7 2 2 2 2 2 2 < l v l x h g x z z v k 2.k 6X} o. ..... ....... . ... .X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXBX' ~ Q [ m.].].'..X.X.X.X'. X X X|.|._..X_.}.}._._._._.|.|.}.}.}.|.}._.]./ ! ' BXVXVXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXGXo.X.X.X.X.X.X.X.X.X.X.X.X. .l j @ z z l l l 2 2 7 a @ z z @ w w z p -Xv p k *X-X5X>X:X,X>X:X7X7X7X7X7X} } 7X7X7X7X;Xj *X+ , > a a k v O *Xk f  . .X.X. .X.+.:Xg 2.s p b p w h z a z l 7 7 :X=.< m @.q l 7 < *Xl x w 7 x < +. . .X.X.X.X.X.X.X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXZXFXQ Q ^ [ n.Q.!.(.^./.^.(././././././.!.~.~.T.~.~.T.T.T.T.T.U.P.L.L.L.L.L.~ ! ! ZXAXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyX<Xj b k z g j s g j k z 2 2 =.2 =.2 2 7 p -Xs d p -Xs p 0Xk z p -Xk p v k a :Xk -Xv p k k s 2.j g 9.j d a v k + l ;X3X+...O.n -X6Xv :X:X..7X:X- l z @ ;X-Xl w *X-Xl w + z v k *Xb k O eXn z h z a + a v l p :X;X;X*X:Xn @.@.> f uX,X1X>X6X+.FXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXBX' / ! ) b.F.K.T.~.T.T.T.T.~.T.T.Y.Y.P.T.T.T.P.T.T.P.T.T.P.T.T.T.T.T.T.F./ / [ BXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXqXqX1X6X .+.7X7Xx } / } c } o.7Xv k g g s :X..o.X.X.X.X.6X5.,.2X1X5.-.:.>Xv :X4X2X1X1X-X2.,.tX0X>.-.wX,X<.<.9.9.<X1X1X4X4XwX>.-.>.wX1X2X1X,XwX,.:.wX>X1XwX;.-.:.wX4X2X1X4.,.:.9.;.wXtX<.4.>.>.;.-.-.;.<.0X4X9X9.-.-.-.9.9.4.0X:XO # # O # O O O DXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXVXFXZXVXZX! S ~ G e.e.A.G.A.h.h.g.h.h.h.l.l.l.l.l.h.h.h.g.g.h.g.g.g.k.f.k.f.i.k.a.a.a.a.a.a.a.a.i.i.a.a.a.a.a.a.k.a.a.a.k.k.a.k.f.f.f.f.a.f.f.f.s.f.a.a.a.a.i.",
+"m N N N m N N m m N N m m V m m N m M m M M M M T N N N m N N N M M m m m N B m m B m V N N N B B N B B M A m V V N V N B B C C C C C C C C C C C C C C C C C C D C C B Z C Z C Z Z Z Z F Z Z D Z D Z Z D Z u > e e y ; r y r r r r r e r r r r r r r r r r r r r r 0 r r r r r r r r r r r * r r = y : ; ; * ; - & $ $ $ % % % , % $ & $ - $ - $ $ & $ $ $ & $ , % % % $ - $ $ $ $ , $ % % % % $ $ $ $ $ $ $ % $ $ 0 % & $ $ % % % % : y q : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r % $ $     K XX~.T.~.Y.(.T./.!.(./.(.(.(.(.`.`._._.|.|._.|._. X_._._._._._.|.(.`._._._.`.`.(.(.^.(.(.!.!./.(././.!.~.~.~.~.T.~.T.~.T.T.T.Y.T.U.T.T.T.T.) ! ^ ZXFXFXZXVXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXGXo.o.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.,X:Xs # -X1X,X2XyX;Xh 9.0X4 j j 2.s g 4.j -XuX-X8.8.w + 8.8.5 4 =.2 =.2 =.2 < k k p 7 =.< k k p x *X*Xk =.8 7X6X7X6X6X7X6X7X6X7X7X .X.X.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXBX[ ! ! ` n.hX'.'.@X.X'.@X'.|..X X|.'.|.|.|.}.}._._._.|._.|.|.}. X|.}._.].! / _ BXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXo.X.X.X.X.X.X.X.X.X.X.X.X. ...6X7 2 g l g l 2 2 z s n   - 4 x z @ p k *X-X>X>X3X7X7X7X+.6X+... . . .o...O. . .o.o.} k v k s p g z -Xv v :Xs -Xf O.X.X.X.X...} k *X*Xh 2.p + - + f s s l z z z 7 l w l w 2 =.;X2 2 l @ s f , +.o.X.X.X.X.X.X.X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXZXVX! Q ^ c.n.]././.(./.(././././.^./.~./.~.~.~.T.T.~.T.T.T.P.U.P.L.L.L.S.L.~ S ! ZXVXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXyX:Xj 9.k a 2.9.;X@ a - @ c 2 2 2 2 2 2 w x z x d z - w d - v z z - - d @ a d z z - a z l l v k s p k -Xd l l l x v :X+.....7Xv x a + :X8X..6X-Xl n b @ ;Xb n v k v sXx + l ;X:Xp eXb # KXb d w eXn a l z l l v x x x v l c f n n <XtX<X3X1X8XFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXZXFXVXFXBX[ / ! Y b.F.Y.T.T.T.T.!.T.T.~.T.~.[.T.T.T.T.T.P.P.P.T.T.T.P.T.T.T.T.Y.F.! ! _ BXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX4X4X2X1X8X7X7X7Xv -X/ +.l 6XO.+.v -Xv -Xk 7X..X.X.X.X.+.wX:.:.yX1X5.;.,.tX-X8.<.9.2X4Xn 2.,.tX0X,.;.<.2X0X>.>.>.<.tX2X2XwX<.-.-.-.:.4.<.4.;Xj ,.,.0X4X1X:X-.-.-.:.9.wX4X:X1.wX1X4.,.<.5.4X5.9.-.-.-.-.>.:.0X4X4X5.>.5.4X5X4XuX1X5X5X5X4X>X>X4XyXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXFXZXZXVXZX! ! Q Y e.b.Z.g.h.A.h.Z.h.g.l.l.l.l.l.l.h.h.h.h.k.h.g.k.g.g.k.d.f.d.k.a.a.a.i.a.a.a.a.i.i.a.a.a.a.a.a.a.a.k.k.a.k.d.i.g.i.k.z.f.a.f.f.f.a.f.d.a.a.i.",
+"m B N m N m N m m m M m m M M N M N N N N N M M m m N N B N N N m M N V m N m m m m M N N N N N N N N B N B B B B N B V C B C B C C B G C C C C Z C C C Z C C Z C C C C Z C C Z Z Z Z Z Z D D D Z L Z G H Z S * * ; ; e r * ; r r r r r r r r r r r r r r r r e r e r r 0 r r r r 0 r r r r r r r r : r r r * * % % % * % % % % % % % % % % % % % % % & % $ % % % * * % % % % % % % % % % % * % % % % % % % % % % % ; % ; % % % % % % : y * : ; r r r r r r r : r r : * t y r r r r r r r r r r r r r r r r r 0 ; ; ; * $       A.Q.T.~.T.~.~.~.~.[.~./.^.(.(._.}.}.}.}. X_._.}._._._.}._._.}.}.`.`.{.{.`.^.{.{.(./.(.(.(.(.^.!././.~.~./.~.~.R.~.T.T.I.~.I.~.Y.T.T.T.T.T.U./ S ^ ZXZXAXZXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.o.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.yXp k 2X,X,X,X,XyX;X@ j k k -Xk -Xa v k k k :Xk 7 7 5 4 4 s + 7 2 2 2 2 2 2 7 k 2.p w =.7 j 5.s z b >XtXwX>X>X>X>X>X>X>XuX>X>X>XuX6X . .DXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXfX[ / f ` m.].hXzX'.dXdX.X.X.X.X.X.X.X`..X X|.|.|.|.|._._. X|.}.|.}. X_.~.Q Q ' ZXDXAXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXO.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.7X=.g 2.j g 2 2 h b :Xc - x 8.8.p >X<X:X:X7X7XO.O.o.X. ...O.o.X.X.X.X.X.X.X.X.X.X.o.o.o.:Xj 2.p - v p s -Xj 5.-X6X.. . .X...o.+.7X6Xv -Xp x n + | 6Xp v g l k s z z z g z z z 4 2 2 z ;X6Xd +. . .X.X.X.X.X.X.X.HXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXAXCXAX^ ! ~ [ n.].Q.[.^././.(././././.~.~.~.!.~.~.T.T.T.T.T.U.Y.U.P.P.L.H.H.G./ ~ S ZXZXDXFXAXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFX,X<X>Xp k k z p b k + g 2.k p z 5 l z z z v :X,X<Xa x 4 O 2.k + *Xk a h 2.-XO @ @ - a v z *Xb z l b z g v l :X,X1X>X>X6X.. .6X,X-XsXx @ :X+.+.2X;X5 l p @ ;Xv z a -X-Xv k h g -Xv   v l O -X-Xd @ v v + b ,X:X+.+.+.X.+. .+. .X.+. .X.o.+.o.+.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXDXCX' ! ! ) b.F.K.~.Y.~.~.T.T.~.~.T.T.T.T.P.T.P.T.T.T.T.P.T.T.T.T.T.P.T.T.Y.! Q ' BXZXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX5.5.1X,X,X>X9X5.v v eXz z >X7X+.;Xk g k b 6X .X.X.X.X.7X5.,.;.4.4X5.,.4.4Xb ;X9.:.<.9.b 2.,.2XwX4.9.9.1X0X,.;.-.>.<.tX2X:X<.;.;.-.-.>.>.,.j b ,.>.:.9.wX1X4.9.<.>.-.:.9.<.9X1X>X1X4.>.:.wX2X1X5.,.-.-.-.-.;.9.0X1X:.5.5XuXeXeX,XuXsX,XwXuXeXeXeXIXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXZXGXZXCXFXS Q ^ Y e.b.z.A.A.h.h.A.h.h.h.h.h.h.h.h.h.h.h.h.z.g.g.g.a.g.z.a.k.a.a.a.a.a.a.a.a.i.i.i.i.i.d.a.d.a.a.f.f.a.k.a.a.a.f.i.i.z.i.f.i.i.f.i.i.k.i.i.a.a.",
+"m N B N N N m N m m M m m M M M M N N V N M N M m m N N N N N N N N M M m m m N M M M N N N N B V B B N B m B m N B N B B B B C C C C B C C C C C C C C C C C C C Z C Z C Z Z D Z C Z Z Z D D Z Z Z Z H Z Z Z q * ; ; ; * 0 r ; r r r r r r r r r r r r r r r 0 r r r r * : r r r e r r r r r r r r : r r 0 : * ; * * % * ; ; * ; : : % ; % ; % % % % % % * % * % ; ; * % ; * % % % ; % ; ; ; * : % * % % * * % ; * ; % % % * % : * r : r e = 0 r r r r r r y * r r r r * : r r r r r r r r r r r r r r r r : r : ; * % o     r U.E.~.T.~.T.I.~.~.~.^././.`.(._.}.}.}.}._._.}._._._._._. X_. X_.|.(.^.|.`.|.(.`.(.(.(.(./././././.!.~.~.~.Y./.R.T.I.~.~.Y.~.U.Y.T.T.T.T.T.T./ ! S DXZXCXVXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.3X5X<X2X,X,X,X,XyX;Xl l a z v v z z l l v z z g p w 5 h h h d 7 =.2 =.2 =.=.=.k k g l l k g k g 2 =.=.7 ,X2X2X2X,X2X>X1X2X2X,X,X,XyX6X7XZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXHX' / Q [ Q.].'.dXdXzX'..X.XzX.X.X.X.X.X'.|.|.'._.|._.|.|.|.|._.|.|.|._.!.! ! ' fXDXHXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.+.2.k k s g z @ z z l k d + 7 4 - :XuXuX:X.... .O.X.X.X.X.o.o.X.X.X.X.X.X.X.X.X.X.X.X.O.6Xk *Xz z p a l l l z z v 6X+. . .O. .o.O.o.o.X.| 4 4   @.@.5 2.2.h 5.s k k s p b + 2 g O l z n v s 6X+.X.X.X.X.X.X.X.o.VXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXZXSX~ ~ Q ` n.!.(.{.~.~./.~././.~.[.~.[.~.~.~.Y.Y.~.T.U.U.T.U.P.P.P.L.D.H.D./ ~ S ZXZXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyX>X>Xp j k z d z z z j 9.;Xp j s 4 j *Xz :X,X2X<X8.8.x j 9.*Xh 9.j - j 9.0Xa n b @ v -Xz a *Xs d ;X*X<X,Xv :XwX9.4.2X+... .3X<Xp k g O z z g g g g z - z l l h - h z 5 *X>XeXeXx a 5 w @ @ - z h 5 a x l z z z b :X:X6Xo. . . .X.X.X. .o.o.o.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXDXDXSXDXBX' S ! Y b.F.T.R.~.~.Y.~.T.T.T.T.T.T.T.T.T.T.T.P.T.T.Y.T.P.T.T.P.T.P.P.Z.! Q ' BXDXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSX9.1.1X,X2X4X9.:.d :XaXz l <X6X+.uXk k >X8XX.X.X.X. .X.+.5.,.,.,.tXwX5.1X2Xv ;X4XqX,.,.b 2.,.wX1X1X4X>X1X0X-.,.<.9.9.tXyX1XtX<.>.>.>.>.>.,.b j ,.>.,.,.:.wX4X1X2X5.<.,.,.,.9X5X2X2X,X,.,.5.1X2X2X,.,.;.>.>.;.,.,.<.,.4.5XeXsXaXtXwXsXaX5XwXsXsX<XCXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXVXVXZXZXVXFX! ! ^ G e.Z.h.h.A.A.h.Z.h.g.g.z.z.l.h.h.h.h.f.h.g.g.g.g.z.z.a.k.a.f.a.a.a.a.a.a.a.a.i.a.i.a.a.a.a.a.f.a.a.a.a.a.a.a.g.d.i.z.f.k.a.k.f.f.k.i.i.k.a.i.",
+"N N C N V N M M m q M M M m M m M V y N N V N M m m N N N N B N N N N N N m m m M M N N B N N B B B B B N B B B B B N B C C C B C C C C C u C C B C C C C C C A C C Z C Z C Z B C H Z Z Z Z D D Z H D Z D D Z u * % : * y r r r : * r r r r r 0 r r r q r r r r r r r r y r r r r r r r r r r e r r r r r r 0 * ; * e = ; ; ; ; : : * : ; % ; ; * ; * * ; ; ; ; r r ; ; e ; ; % % 0 * r ; ; ; r : : ; % ; % ; ; ; * ; ; r * * % ; ; : * r r r r r r r r r r r r r r r r y r r r r r r r r r r r r e r r r r * r ; * * %       b.~.~.I.I.~.T.~.~.~./.(./.^.(.{.^._._.}._._._._._. X_. X X X_._._._.|.`.|._.`.(.(.(.(.(.(.(./././.~.~./.~.T.~.T.T.I.~.Y.I.I.I.~.~.T.T.T.T.T.~./ / Q DXZXZXFXZXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.X.o.o.X.X.X.X.X.X.X.X.X.X.o.o.X.X.X.X.X.X.X.X.X.X.o.X.X.X.X.X...6XyX,X,X,X2X<X,X,X2X,X,X1Xj 2 7 s s < 3 k k 3 2 3 k k < =.< v k O =.2 2 2 2 2 2 =.2 =.2 2 2 =.=.2 2 =.=.2 yXyX,X,X2X5.9.9.0X1X,X,X,X,X>XyXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXCXHX[ ^ ^ [ m.].dXdX'..X'.xX.XdXdX@XdX.X.X'.'. X|.|.|._.|.|._.|.|.|.|.'.|.]./ S } BXDXVXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXo.X.X.o.o.X.X.X.X.o.X.o.o.X.X.+.o.+.6X2.0Xz p ;Xl + z @ @ d l + *XyX+.7X+. .X.X.X.X.X.o.o.X.X.X.X.X.X.o.o.X.X.X.X.X.X.o.o.o.7X;Xa c s -X=Xp n O v k c ..X.X.X.o.o.X. .o.o.+.+.+.+.+.} k v v v v k 2.-Xk 5.p aX:Xa z l z z s *X- X.X.X.o.o.X.X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXFX~ ~ S ` n.].R./././.(.~.~.~.~.~.~.~.~.~.~.T.T.Y.T.T.U.U.P.U.L.S.L.A.L.D.! ! ~ ZXFXFXFXFXFXFXFXFXAXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXyXtX:X2.9.k g ,X>X>X;Xk ;Xs 2.9.;X4 9.*Xz :X2X,X>Xg x 4 s *Xk s *Xk z p *Xk O 4 O h h b p p 9.b d 3 7 s ;Xb :XqX,.,.6X . .6X>X-X*X*XO b s + b g + :Xb x z - ;X-X*X-X@ -X5XeXsXsX:X@ j *XO j ;XO v -Xs *Xs *X*Xg g *X:Xk ,X8XX.o.+.X. ... . .o.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXDXHX` ! ! ` b.F.L.T.~.Y.Y.T.~.!.T.T.T.T.T.T.T.T.T.T.T.P.Y.T.T.T.T.P.Y.T.P.F./ ! ' BXZXSXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGX9.1.4X,X1XqX-.<.z p -Xz d *X6X .6Xz 6X7Xo. .O.X.X.X. .7XwX9.9.5.2XyX1X>X>Xb :XuXtX9.5.b ;X5.tX<X>X>XtX2XwX9.4.,X1X1X2X2X>XyXtX4.9.4.9.9.9.-Xv 4.9.9.9.4.wXuX>X2X1X>X4.9.9.wXuX5X>X,X5.9.tXyX:X2X5.9.9.9.9.9.9.9.<.9.0X5X:XKXaXtXwXKXpX>XwXsXgXtXVXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXVXVXZXGXVXZX~ ~ ^ G e.e.g.A.l.l.h.Z.g.g.h.g.h.h.h.g.h.g.h.h.k.a.g.a.k.a.a.g.k.a.a.a.a.a.a.i.i.i.i.i.i.a.a.d.a.a.a.a.a.f.a.f.a.a.i.i.f.i.k.a.a.a.i.k.a.a.i.a.a.i.",
+"B m N N m m M M M M m m M M M M M N N V N N m N m m m N N N N N N N N m N N B m M m N N B N B N N B N B B N B N B B B C N C B C C A C C C B C B C C C C C Z C C C C C Z C Z Z Z Z C H Z B G D D Z Z Z D D D D Z ; % : 0 ; 0 ; r r y r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r ; r r r 0 r r ; e : : : ; ; y ; ; ; ; ; ; ; ; r 0 r r ; ; ; ; ; r r r r ; ; 0 : % ; ; ; ; ; ; ; 0 r = r ; r ; r : r : 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r 0 * r r r ; % $       % Q.U.T.T.T.~.~.~.~././.[.(.(.(.^.|._.}.}.[._.}.}.}._._._._._._. X[._.|.(.{.{.^.(.(.(.(.(./././././.(.~.!.~.~.~.T.T.~.~.T.Y.~.Y.Y.I.T.T.T.P.~.T.S / ! DXDXZXFXZXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXo.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.o.X.X.X.X.X.X.X.X.X.X.o.o.X.X.X.X.X.X.X.X.X.X.o.o.X.X.X.o.7XtX,X,X,X,XyX3X,X,X,X,X,X1X8.2 j j 9X3 < j 9XO =.g j 5.O =.< j 9X4 2 =.2 =.2 =.2 2 =.2 =.2 =.2 2 =.2 2 =.7 2X3X,X2X,X:.,.,.4.1X,X,X3XyX>X,XFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXCX' ~ K { Q.].dXdXdXzXzX.XxXdXdXdX X.X.X.X.X.X.X'.`.|.|.|.|.|.|.|. X_.(.~.! ! [ BXDXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXVXo.o.o.o.o.X.X.X.X.o.o.o.o.X.X.X.X. . .} 6Xv k ;Xx x b z @ b n l -Xo... .O.o.X.X.X.X.X.o.o.X.X.o.o.X.X.X.o.X.X.X.X.X.X.X.o.o...} - | { k s -X7Xd j 2.-X7XO.X.X.X.o.X.X.o.o...X.o. .o.o.o.o.+.+.+.*Xk b k b g 7 8.3 v k # x s 2.v X.o.X.X.o.X.X.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXGXFX! ~ ! c.b.].!.{././.~./.T.!.~.~.~.T.T.~.~.~.T.T.P.P.P.U.P.U.S.P.L.S.S.A.~ ^ ! ZXFXVXHXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHX=.2 :Xk *X*Xl 5.5.1X2X:X:X:Xk *Xk p 9Xk z :X2X>X>X:X:X<X2.<.<.2.1XyXv :X,X:X:X,X>Xx ;X>X:Xk k k d 8.sXv ;X-X;X;.,.,.} ..X.<X>X-XiXuXa KXl O KXx   ;Xb n l + :X-XiXuXa ;XyXsXyXkX;Xa 9.qXs 9.0Xa 8XKXp # O iXuXv a iXuX*X2X,X3X3XtX<X6X .o.+.o.o.FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXZXDXDXBX' ! ! ) b.F.I.~.T.~.~.Y.[.P.T.T.T.T.T.~.T.T.T.T.T.!.Y.P.T.P.T.T.T.T.P.F.! ! ' BXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZX9.,.5.1X1X9.;.<.v l d z v ;X:X;X:Xk ;X/ / @.( W Q @./ ;X:X:X*X:X:X;X:X:X:Xk b :X*X:X:Xx *X:X:X:X:X:X*X:X:X:X:X*X:X;X:X:X*X:X:X:X:X*X:X:X:X*X-X:X:X:X=X:X:X*X:X*X:X:X:X:X:X*X:X:X:X*X:X*X:X:X:X:X*X:X:X*X:X=X:X:X:X:X:X>X*Xk *X5XwXk ;X5X:X*X*X>XVXVXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXZXFXZXFXVXFX~ ~ ^ Y T b.g.A.A.h.h.j.j.g.f.z.h.f.g.h.g.g.k.k.f.z.k.g.g.k.i.i.a.f.i.a.a.a.i.a.i.i.i.i.i.a.a.a.d.a.z.a.a.a.a.a.z.a.i.k.a.f.i.i.i.k.i.f.i.i.i.i.i.i.",
+"V B B N N m V m m M m M M m M M M M N M N V M V V N N N C N N N N N N N N N M N M M M M N N N N N N N B N B N B B B B B B B C B C A V C C u B C C B C C C C C F Z C C C Z C C Z Z B H Z D D Z D Z D Z Z D D D D u * % = % ; r : r r r r r e r r r r r r r r r r r r r r r r r r r r r r r r r r r r : r r r r r ; r ; ; r r ; r ; r 0 r r r r * : = q : ; : : : y r r 0 r 0 r r r r ; r ; 0 ; r r 0 ; r ; = ; r q > 0 ; 0 r r r e r r : 0 r r r r r r r r r r r r r r q r r r r r * r r r r r r * r r r r : : r % % $       n.~.T.T.T.T.T.T.T.(.~././.(.(.(.(.(._._.[._._._._. X_._. X_._. X_._._.|.(._._.`.(.^.(.(./././.~././././.T.~.T.T.~.T.Y.U.~.~.~.T.T.T.T.T.T.T.^.T./ / Q MXVXCXVXZXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXSXo.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.O.o.o.o.o.O.o.o.o.o.o.o.o.o.o.O.o. .O.O.7XyXyXyXyXyXyXyXyXyXyXyX3XyXyX2.=.j ;Xv 7 j -Xb g =.j v -Xj =.7 -Xv g =.=.=.=.=.2 =.2 =.2 2 =.2 =.=.=.2 =.=.7 yXyXyXyXyX5.9.9.eXyXyXyXyXyXyXyXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXDXBX' ~ ! { Q.'.dXxXdXzX.XzX'.dX.X.X'..X.X.X.X.X|..X|.'.|.|.|.|.|.|.|.}.|.!./ / _ fXZXHXDXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXo.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.O.O.+.k v k @ l z z z l z ;XO.O.O.o.X.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.O.} w > > ;X-X=Xn z -Xv -X1X7XO.o.o.o.o.o.o.o. .X.o.o.o.O.o.o.o.O.o.o.+.o.o.+.o.+.<X:Xl #   b v -Xv o.o.o.o.o.o.o.o.GXAXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXSXDXGX~ / S ` n.F.^.(.~.~./.T.T.~.T.~.T.T.~.T.T.Y.T.U.U.U.U.L.S.U.L.L.D.S.G.G.P ! ~ BXDXHXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX=.7 eX3XyX2Xb 8.qXyXyXyXyXyX:X3X:X3X:X3Xb :X1XyXyXyXyXyXeX9.9.5.yXyXn <XyXyXyXyXyXn <XyXyXyXyXyXn 4 8.7 :Xn 0X9.9.5.7XO.O.sXuXv *X-X+ n z O b z @ :Xb l z z :X-X9X-Xh ;XuX*Xb :X:Xw j -X+ v -X+ v -X+ # O *X;Xz z *X;Xk yXyXyXyXyXyXyX3XyXyXyXKXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXVXAXAXSXGXBX' / ! Y b.F.].T.~.T.~.!.Y.T.T.T.Y.T.T.T.T.T.T.T.T.T.oXT.T.T.T.Y.P.Y.Y.Y.! ! ' fXZXFXDXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGX0X9.8.3X1XqX9.8.b :X3XyXyXyXyXtXyXv :X+.O.o.o.o.o.O.O.8X2XyXyXyXyXyXyXyXyXb :XtXtXyXyXn :XyX2XyXyXyX3X>XyXyXyXyXyXyXyXyXyXyXyXuX>XtX2XyXyX;X;XyXyXyXyX5XyXyXyXyXyXyXyXyXyXyXyXtXtXyXyXyXyXyXyXyXyXyXyX1X,XyXyXyXyXyXyXyXyXyXyX5XtXtXuXyXyXuXyX2XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXGXVXVXFXZXDXDXS ~ ^ Y e.e.g.l.h.h.h.j.g.g.h.h.h.a.h.h.k.g.g.g.g.g.k.a.g.d.k.a.a.a.a.a.a.a.a.a.i.a.i.i.i.i.a.a.a.a.i.a.a.a.a.a.a.a.a.a.a.a.i.i.i.a.i.a.a.i.i.i.i.s.",
+"M N B m N V M m M M m M m M M M M N N N N N N N N N N N m N N N V V V N N V V N M M M N N C N N N N N N B B N B B B B C C C B C C C C C C C B C C C C C C A Z C C C F C C Z Z Z Z Z Z Z D Z Z D D D D L D D D Z H 0 % % % ; r r r r r r r r r r r r r r r r r r r r r r r r r r r r : r r 0 r r r * 0 r r r r r r r q ; r = y ; r ; r ; y = r : r : * r : r r r r r r ; r ; r r 0 r r r r r r r r r r r : y ; 0 : * 0 y r r r r r r r r r r r r r r r r r r r r r r r r r r r r : y r r r r r r t r r * r e : * % $ o     F ~.Y.T.T.T.~.~.~.R.~.(./././.(.^.(.(._._._._._._.}.[._._._._._._. X_.|.^.|._.(.(._.(.(.`./././.(./.~.~./.~.~.~.T.T.T.~.U.Y.Y.U.T.T.T.T.T.P.T.T.T.[ P ~ hXCXGXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXGXFXVXGXVXGXFXFXGXGXGXVXGXFXVXVXVXGXFXFXGXVXGXVXGXFXAXAXVXGXFXFXGXGXGXVXGXFXVXVXVXGXFXFXGXVXFXAXAXAXAXAXDXSXFXFXSXFXSXFXFXFXVXVXZXZXFXFXZXZXSXZXZXFXSXHXFXVXFXFXGXFXFXZXCXFXBXCXZXSXDXFXSXSXSXZXFXFXMXBXCXSXFXFXGXSXFXZXGXFXZXVXAXZXFXFXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXfX' ~ ^ c.m.].].hX$XzXzXzXzX.XdXzX.X'.zX.X.X.X.X|..X|..X|.|.|.|.|.|.}.}.`.S ! ! m.HXZXZXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXGXFXFXVXVXAXVXGXVXFXFXVXGXFXFXVXGXFXFXZXDXFXFXDXDXFXFXZXSXFXFXDXGXAXAXVXVXFXFXVXGXFXFXFXHXFXFXVXGXFXFXGXGXFXFXGXGXFXFXDXDXFXHXDXDXFXFXDXDXDXDXDXGXDXDXFXVXFXFXGXGXFXAXVXVXFXFXVXGXFXFXGXGXFXFXGXIXFXFXHXHXZXAXDXGXFXFXHXHXFXZXDXGXFXFXVXGXFXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXGXMX/ S S c.n.!.Y.[.Y.(.!.T.~.T.~.T.T.T.T.T.T.T.T.U.U.L.L.L.H.D.L.S.H.D.G.G.Y / ~ hXZXAXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXDXZXHXGXZXDXFXGXSXDXAXGXFXAXSXAXFXGXZXFXGXAXDXGXAXFXFXSXFXHXHXAXAXFXFXSXGXGXZXSXFXHXHXFXDXFXFXGXDXZXGXSXFXSXDXVXGXFXFXDXZXHXGXHXZXSXZXDXDXDXAXGXDXAXSXSXFXIXCXAXSXDXAXHXFXHXVXGXFXZXZXHXVXFXFXDXZXVXHXGXFXHXZXCXHXDXAXSXGXFXZXSXFXVXGXVXCXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXAXDXZXZXfX_ / ! ` b.F.K.T.~.T.T.[.T.T.T.T.P.oXT.P.T.T.T.T.T.T.T.T.Y.T.Y.T.Y.Y.T.U.S ! / Q.ZXSXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXGXGXFXVXVXDXSXFXFXGXGXSXFXAXFXHXFXHXFXFXFXGXGXVXZXVXFXZXZXVXSXFXFXSXDXFXFXFXFXIXHXVXVXFXFXGXSXSXVXVXFXHXHXVXVXFXFXSXFXSXFXVXFXHXHXFXFXFXFXDXDXGXDXSXFXHXHXVXVXFXFXSXFXSXDXSXFXHXHXVXSXFXFXSXFXSXDXSXFXGXCXFXAXFXFXFXFXFXDXVXFXBXUXAXDXFXFXDXAXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXDXSXFXVXZXZXZXBX! ~ S G e.e.j.A.h.h.g.Z.g.g.f.h.h.z.h.k.g.g.g.g.a.z.a.g.f.f.a.a.a.a.f.a.a.i.a.i.a.i.i.i.i.a.a.i.i.a.i.a.a.a.a.a.a.k.k.a.k.a.i.f.i.a.a.i.i.i.i.i.i.s.",
+"C m N B V V V m M m M m M M M M M M M M M M N N N N B N N N N C N V N V N N N N N N N M N N N N N B N B N B B N B B B B B C C B C C C u B C C C C C C Z C C C B C Z Z Z Z C Z B Z B Z Z Z Z L Z Z Z Z D H H Z Z Z u * % % * 0 r r r r r r r r r r r * y r r r r r r r r r r r r r r r r r r r r r r r r r : r r r r y r r r r r y ; r r r r r : y : r r r r r 0 ; r e ; r r r r r r r r ; 0 r r r r r r r r r r r t r r r r * y : ; r 0 r r r r r r r r r r r q r r r r r r r r r r r r r r r * * y r : ; ; : % &   #   $ K.U.T.~.T.T.T.~.~.~.(././.^.(.^.[.(._._._._._._._._._._._._._._._._._._.|.`.(.|.(.(.(.(.(.(./.~.~././.~.~.~.T./.T.T.T.~.Y.I.Y.Y.~.T.T.T.T.T.T.(.T.n.Q Q [ hXVXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXFXFXVXVXVXVXSXFXVXGXVXGXFXFXFXFXVXGXFXFXFXFXVXVXFXFXFXFXVXGXFXFXVXVXVXVXFXFXVXVXGXVXFXFXFXFXFXFXGXAXSXDXAXDXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXSXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXZXZXDXFXGXFXDXDXFXFXDXZXSXDXFXFXFXFXFXFXFXFXFXFXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXFXDXBXm.' Q Q c.Q.].JXzXzXzX.XxXzXdXdXzXzX@X'.'..X.X.X.X.X|.|.|. X|.|.|.|.}.{.^./ / ! [ BXDXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXAXFXVXGXVXGXVXVXFXFXVXFXFXFXGXGXVXGXFXFXFXFXZXZXFXFXDXAXDXDXAXZXZXDXVXVXDXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXVXFXVXGXVXFXDXDXDXDXDXDXFXDXDXDXDXDXDXDXDXDXFXFXFXFXVXVXVXGXCXFXFXFXVXFXFXFXFXFXZXFXGXAXFXFXZXZXVXVXDXDXDXFXCXZXDXFXDXFXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXCXpX/ ! S ` b.Q.!.T./.!.~.~.T.T.~.T.~.T.T.T.T.T.U.U.U.L.L.H.Y.L.S.L.H.H.G.D.b.! ~ } fXVXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXFXFXFXFXFXFXFXDXDXSXFXFXFXDXDXDXDXDXAXGXFXAXDXAXFXFXFXFXFXSXGXVXGXFXFXFXAXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXAXAXFXFXFXFXVXVXFXFXFXFXGXFXZXZXDXDXDXDXDXDXDXAXAXZXFXFXFXFXAXAXAXDXFXFXHXVXFXFXFXDXHXVXFXFXFXFXFXVXFXFXFXFXZXDXAXDXFXFXDXSXFXFXZXZXAXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXAXZXFXDXBXm./ ! ~ ` b.F.Y.T.T.T.!.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.T.T.T.T.P.P.P.Y.P.U.! S / { fXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXFXFXFXFXFXDXGXFXFXFXFXSXFXAXFXGXAXFXFXFXFXFXFXFXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXFXFXFXGXDXDXFXFXFXFXVXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXGXSXDXFXFXZXFXVXVXFXFXFXFXDXDXFXFXFXFXFXVXFXFXFXFXDXDXFXFXFXFXDXFXFXFXFXFXFXFXFXFXDXAXAXAXFXFXFXFXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXZXDXFXBXaX/ ! K Y e.b.j.A.h.h.h.g.g.a.g.z.g.h.k.g.f.g.g.g.g.f.f.a.a.a.a.k.f.a.f.a.a.a.a.i.a.i.i.i.i.i.i.a.a.a.i.a.i.a.a.a.a.a.i.i.a.a.a.i.i.i.a.i.i.i.i.i.a.s.",
+"V B B N M m V m m m M M M M N m M M M N A N M N V N N N N N N A N N N B N V V V m N M V N N N N m N N m Z B N B B B B B C B B B C C B B A C C A C C C C C C D C C Z C C Z C Z Z Z Z Z Z Z Z Z Z F Z H Z Z D D D C J u % & % % e r r r r r r r r r r : 0 r e r r r r r r r 0 r r r r r r r r r r : r r r 0 : r 0 r r = ; r r r 0 r r = r r r r 0 r : r r 0 r : : r ; ; e ; r r 0 ; ; r r e ; r ; 0 ; 0 r r r r r ; ; e ; r ; : r r 0 r r 0 r r r 0 e r r r e r r r r r r r r r r r r r r r r r y 0 : : 0 ; * * % o       n.T.I.~.T.T.T.T.R.R./.T.!././.(.!.^.(.(.!._._._._._._._._._._._._._._. X_.`._.`.{.(.(.(./.(./././.~.~.T.[.T.~.~.T.T.~.T.U.Y.~.~.I.~.T.T.~.~.T.T.T.T.F.Q / ' hXCXVXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXGXVXGXVXGXVXVXVXVXVXFXFXFXVXVXVXFXFXFXFXSXGXFXFXFXFXVXVXFXFXFXGXVXVXAXGXVXVXGXVXFXFXFXFXFXFXDXDXDXAXDXAXFXFXFXFXFXFXFXFXFXFXDXDXFXFXFXFXFXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXZXFXDXZXSXDXFXDXDXZXZXZXZXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXZXZXFXFXhX' Q / Q c.].].zXzXvXzXzX.XxXzXdX.X'.zXzX.X.X.X.X.X|. X.X'.|.|.{.}.|.}.}. X' / ! Q m.CXAXZXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXVXVXFXFXVXGXVXVXVXGXFXFXVXFXFXFXHXVXVXVXDXDXFXFXZXZXFXFXDXDXDXAXZXGXZXDXVXGXGXVXFXFXFXFXFXFXFXFXFXFXFXFXVXVXGXVXVXVXFXFXDXDXDXDXDXGXDXFXDXDXDXDXDXDXDXDXFXFXFXFXGXVXVXVXAXAXFXFXFXFXFXFXFXHXZXDXAXAXFXFXZXZXZXFXDXAXSXDXDXAXZXDXFXFXFXFXVXGXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXhX` ~ ! S c.n.L.T.^.T.!.~.T.T.T.T.T.T.T.T.~.T.T.T.U.L.L.H.L.L.A.S.S.H.D.S.z.Z./ ! _ ].HXVXZXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXGXFXZXFXDXFXAXDXAXDXAXAXDXAXFXAXAXAXFXFXFXVXVXSXFXFXFXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXAXZXGXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXDXDXDXAXDXAXDXAXAXFXFXFXFXFXFXDXFXFXHXVXVXFXFXFXFXDXVXFXFXFXFXVXFXFXFXFXDXDXZXDXAXDXGXDXDXFXFXFXFXAXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXAXVXAXAXhX' S ~ S ` n.F.T.T.~.!.T.!.T.T.T.T.T.T.T.T.T.T.Y.T.P.T.T.T.T.T.Y.Y.P.[.T.U.[ / ~ / pXCXFXFXFXFXFXFXFXFXFXFXFXFXFXFXAXFXFXDXZXAXFXFXFXFXFXFXGXDXDXFXFXFXFXFXFXAXDXAXDXAXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXVXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXZXFXDXSXDXDXFXFXFXFXFXHXFXFXFXFXFXGXFXFXFXZXFXZXFXFXFXFXGXDXFXFXFXFXFXFXFXFXFXFXFXFXFXAXDXDXDXAXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXZXZXDXFXhX[ ~ S u F e.e.g.h.A.f.g.Z.g.k.k.a.z.f.g.g.g.g.f.f.a.g.a.d.z.z.k.a.a.a.f.a.a.i.a.a.i.a.a.i.i.i.i.i.i.i.a.i.a.i.a.a.a.a.z.a.i.a.a.i.i.a.i.i.i.i.i.a.a.s.",
+"C N V N N N M M M M M M M M M M M m B M M B B m B B m B B m B B B C B M C M C B N B N V N N N V m m N V N V N N V B C N B C C N C C A C C A C C C C C C C C C B F C Z C D C Z Z C Z Z Z Z Z Z G Z Z Z Z D D D D D J F e % % & % : ; ; ; > 0 * : r r = r 0 r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r e q r r r r r r r r r r r e 0 r r r r r r r r r r r e 0 r r r r r r r r r e r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r * : y : 0 y y ; ; ; r e * % % $   #   Y R.T.~.U.T.T.~.T.~.T.~.~.~././././.(.(.(.(.(.(.`.(.{.`.^.|.(.|._.|.^.|._.|._.(.|.(.(.(.(.(.(.(./.!./.E.T.~.T.~.~.T.T.T.T.T.T.U.T.T.~.T.T.T.!.!.T.P.T.Y.U / S [ fXDXDXDXHXDXZXZXFXZXDXDXFXVXAXFXAXDXVXFXAXVXFXHXFXVXZXVXFXFXFXFXFXFXFXFXFXZXZXFXZXFXZXDXDXFXZXZXZXZXZXZXZXZXFXVXVXDXAXDXDXAXDXZXDXDXFXVXZXFXZXFXVXFXZXVXFXAXAXAXAXVXFXVXZXAXAXFXFXSXDXFXSXZXZXZXSXZXSXZXZXSXZXZXZXZXDXDXZXZXZXFXSXDXZXZXAXAXAXAXAXAXAXFXAXVXAXVXVXZXZXFXVXZXVXAXZXAXFXVXVXZXFXZXVXZXVXZXFXZXZXDXDXZXZXZXDXDXDXFXZXDXFXFXFXfX} / / ^ ' c.].'.zXJXdXzXzXdX'.xX.X.X.X.XdX.XdX.X X.X.X|.|._.|.}.}.}.}.}.|.].^._ ~ / / ].VXHXHXFXFXZXFXZXFXZXZXFXAXDXDXDXDXDXDXDXZXDXZXDXGXDXDXZXFXDXZXGXZXDXZXFXZXZXZXFXFXFXFXZXAXZXZXZXVXZXDXFXFXZXZXDXDXZXZXFXDXZXZXDXZXDXDXZXZXFXDXVXZXZXDXZXAXZXZXZXAXZXZXFXZXFXDXFXFXFXFXAXZXAXZXFXZXFXFXDXZXDXDXZXHXDXZXAXFXAXFXAXAXAXFXVXZXHXAXHXVXVXVXAXAXAXFXAXAXHXVXAXDXZXZXAXAXAXAXAXAXAXFXAXAXFXZXVXZXFXZXFXVXFXZXAXAXAXFXVXFXFXFXGXfX[ ~ / u i c.n.F.T./.T.~.~.T.T.T.T.T.T.T.T.T.T.P.U.U.L.L.L.H.H.H.H.H.H.A.S.H.Z.P / / ' hXFXZXFXAXZXAXFXFXDXZXAXFXFXSXAXFXZXZXSXZXSXDXFXAXAXAXAXAXSXDXFXAXAXAXFXFXFXZXAXZXFXFXVXZXZXZXAXAXAXAXAXSXAXAXSXAXAXFXFXAXAXAXSXFXAXZXAXFXFXFXZXDXDXAXAXDXZXDXDXAXFXDXFXFXZXFXZXDXFXFXFXFXFXZXDXDXZXFXVXFXFXZXZXFXVXZXVXZXHXFXZXFXVXFXFXVXFXZXZXZXFXZXVXFXFXFXFXAXZXFXAXFXFXAXAXAXFXFXFXGXFXFXDXZXDXAXDXAXFXAXAXAXAXDXDXDXCXZXZXZXDXFXHXDXfX[ ~ Q Q i ` n.F.!.T.^.Y.Y.T.~.T.T.~.T.T.T.T.T.T.~.T.T.T.T.T.T.^.P.Y.Y.Y.L.P.F._ ! ! _ hXBXDXDXDXZXVXVXFXZXFXVXZXDXSXZXZXFXZXDXSXZXFXFXZXZXSXZXSXDXZXZXSXZXAXAXDXAXDXFXSXDXZXFXVXFXVXVXVXZXDXZXHXDXZXDXDXFXZXVXZXAXAXZXFXAXZXAXDXAXDXAXAXDXDXDXDXDXZXDXGXZXZXZXDXDXGXZXFXAXZXZXZXZXVXVXFXAXVXAXSXAXZXFXVXZXVXAXFXZXFXFXFXAXDXDXDXHXFXFXFXZXZXZXZXDXDXFXFXFXAXAXVXFXVXFXVXFXZXFXFXVXZXZXAXFXFXFXFXFXFXAXGXAXVXFXFXVXFXVXAXFXZXZXFXfX[ ^ ~ ^ A G e.e.h.h.h.h.k.A.f.f.f.z.z.g.h.f.f.z.f.f.f.f.f.i.k.a.k.i.i.a.a.a.a.i.a.i.i.s.i.i.a.i.i.i.a.i.a.a.i.a.a.a.a.a.a.a.i.i.i.i.i.i.i.i.u.i.i.i.i.a.",
+"m u B B N M M M M M M m M m M M M m m m m m M B B m m B B m B m B M C B m B m B N B V N N N C m N N V B C N N C A M N C C V C C C C B C C B B A C A C C C Z C Z Z C C Z C G Z Z Z Z Z D Z G D Z Z Z G Z D Z D Z H D F A r $ - % % * ; * 0 y e ; r : r r r r r r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r : r r r r e r r r r r r 0 e t r : 0 : ; ; y : = % ; 0 & o       e !.T.U.T.T.T.T.T.~.T.~.T.~.~.~./././.(.(.(.(.`.(._.|.(.(.{.(.{.{.`._.|.{._.(.|.(.(._.^.(.(.(.(.(./././.~.^.~.T.T.T.T.T.T.T.T.T.T.T.~.T.Y.~.T.T.P.T.T.P.^.F./ / / ' hXZXZXDXZXZXAXAXAXDXAXAXVXVXAXAXAXVXVXVXVXFXVXVXVXVXFXFXVXVXVXVXVXVXVXHXVXFXZXZXAXAXAXFXVXHXZXZXZXZXFXZXVXZXHXFXHXZXAXAXVXAXVXFXFXVXVXFXVXFXVXVXVXVXVXFXVXVXAXAXFXDXFXVXAXAXZXZXZXDXFXDXDXDXZXZXDXDXDXDXDXDXZXZXDXDXZXZXAXFXZXZXZXZXAXAXFXZXFXFXFXAXZXZXFXFXFXZXDXDXVXFXFXZXFXFXAXZXFXZXFXFXFXFXFXFXFXFXFXVXFXDXZXDXFXZXFXFXFXZXHXDXFXfX[ Q S ~ c ` M.].hXxXdXdXzXzXzXzX.X.XxX'..X.XdX.X.X@X.X.X X|. X|._.}.}.}.}.|..X_.Q._ ~ ~ ' hXHXGXFXFXFXFXZXFXFXZXFXFXFXDXFXZXZXHXFXFXFXFXZXAXZXDXFXFXFXFXZXVXFXZXFXFXZXSXZXVXZXZXAXAXAXAXVXFXFXZXFXDXZXAXFXFXDXZXFXZXZXAXFXFXFXZXVXVXZXZXFXZXFXZXAXAXAXAXAXAXFXFXAXAXVXZXAXAXFXFXAXAXAXAXAXAXAXZXFXFXFXZXZXZXDXZXFXZXZXFXAXFXAXDXZXVXFXDXFXFXZXZXAXZXVXFXAXAXFXFXFXAXFXZXFXDXAXDXFXFXZXZXAXFXFXZXVXZXSXZXVXZXZXZXAXFXFXZXHXFXFXFXfXm.' Q / S I c.n.].T.T.~.T.T.~.[.T.T.T.T.T.T.T.T.P.L.L.L.L.L.L.H.S.H.H.S.S.S.A.D.Z.I / / [ hXFXZXZXZXAXAXAXFXDXFXZXZXAXAXDXFXZXDXDXDXDXDXFXZXGXZXZXDXZXDXZXZXFXHXZXZXVXVXVXFXDXVXVXVXVXDXHXAXZXDXZXZXAXZXFXFXFXZXAXAXFXZXZXZXAXAXAXZXSXAXAXAXAXSXAXAXAXAXVXAXAXVXFXVXVXFXFXVXFXFXFXFXFXAXHXAXAXVXAXVXVXVXVXVXVXVXFXVXVXVXVXVXVXFXVXVXVXVXZXVXVXVXVXVXVXVXVXVXVXFXHXAXAXAXAXVXHXFXVXAXAXFXZXAXAXHXAXHXDXAXHXAXAXCXDXZXZXFXFXHXHXVXfXm.Q ~ ~ u _ [ F.L.T.T.T.Y.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.Y.P.~.^.Y.T.T.P.~.F./ / ! ' hXDXDXZXZXGXDXHXZXFXFXZXZXDXDXZXZXDXDXDXZXFXZXZXDXDXDXZXZXDXZXDXZXDXAXAXDXAXAXFXDXZXZXVXZXVXFXFXFXFXFXFXFXFXFXDXFXVXFXFXZXAXAXZXVXAXZXAXAXSXAXZXDXAXAXAXAXZXZXZXZXFXZXFXFXZXAXFXFXFXFXAXAXFXZXDXZXFXAXVXVXZXDXZXVXAXAXFXDXFXAXAXAXFXHXVXVXVXVXFXFXVXVXVXFXVXVXFXHXVXVXVXFXVXFXVXVXVXAXVXVXVXFXHXVXVXVXAXAXVXFXAXVXAXAXVXFXFXVXVXFXZXFXfXm.' Q S ^ S T e.j.A.h.h.k.j.j.f.g.g.i.a.g.f.h.a.z.f.f.k.a.a.f.s.f.i.k.k.i.a.a.a.a.a.i.i.i.i.i.u.a.t.i.u.a.i.s.i.i.i.a.a.a.a.a.i.i.a.i.u.i.i.i.i.i.i.i.a.i.",
+"B N N B N N M M M M M M M M m M M M m M M M m M B B B B m B m B m m B m B B B B B N N V V V N N V N V N N M N N V N C V C B N C C A C C C A C C C C u B C C C C Z C Z B Z C Z Z C Z Z Z Z D D D Z Z D D D H D D Z Z Z H u * $ $ % % * * 0 ; ; e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r q r r r r r r r r r r r r r r r y r r : r r r r r r r r r r r r r r r r r y r r r r r r r r r e 0 r r * r r r r r r r r r r r r r r r r r r r r r ; r r r : : y 0 r e = % $ o       q ~.T.Y.T.~.T.T.[.~.T.T.T.~.~././.~././.(.(.(.(.(._.(.).^.(.|.{.(.|.{.|.{.|.|.`.{.|.`.(.(.{.(.(.(.(./.^.~.~.T.T.~.~.T.~.T.T.T.T.T.U.T.T.T.T.T.U.T.T.T.T.P.P.!.[ U S ! ' hXfXCXHXDXVXZXDXDXZXZXZXDXDXHXFXDXHXDXVXZXZXZXFXZXDXHXHXVXFXDXFXDXHXFXZXGXFXDXFXFXZXZXZXDXDXZXZXGXDXDXZXZXFXFXDXDXDXDXFXFXDXDXDXDXHXDXDXDXZXFXFXDXDXDXZXZXFXAXDXDXZXGXZXZXDXZXDXDXZXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXZXZXZXDXDXDXDXDXDXDXZXZXDXZXZXZXZXZXDXDXZXZXDXDXDXZXZXZXDXFXFXDXFXZXFXFXDXZXZXFXZXFXFXFXFXAXZXHXVXAXVXVXVXZXDXVXhX` S / Q ^ ^ c.m.].hXdXJXdXvXzXzXdXzXzX.XzX.XzXdXdX.X.X.X.X|. X|.|.|.`.}.}.}.}. X_. XQ./ / / ' ].fXFXGXZXFXFXAXZXAXFXAXFXHXZXAXZXZXFXFXDXFXAXAXZXZXDXFXZXDXFXVXZXZXVXVXZXFXVXVXZXDXAXAXZXAXVXAXDXFXFXFXFXZXVXVXZXZXFXFXAXZXFXFXDXZXVXVXZXZXVXVXDXZXAXAXAXAXAXAXZXZXAXAXSXZXAXAXZXFXAXSXZXAXAXAXZXZXVXFXZXHXZXVXZXDXFXFXZXDXZXFXHXDXZXDXDXDXFXDXDXDXFXDXGXZXFXZXZXDXZXZXZXDXZXGXDXZXZXZXZXZXZXZXZXZXZXDXZXGXZXZXZXDXFXAXZXFXGXFXBXhX} ) / Q c S Y b.F.!.!.~.T.~.~.~.U.T.T.T.T.T.T.U.P.U.L.U.L.L.H.H.H.H.H.A.S.A.G.A.S.h.T / Q Q ' hXMXDXAXZXZXAXZXDXAXAXFXZXVXVXZXVXZXZXZXZXFXAXHXZXAXAXZXZXDXDXFXAXFXVXFXHXVXZXZXHXHXFXHXZXDXZXFXFXAXVXZXAXAXAXAXAXAXAXAXAXFXFXFXGXDXFXZXZXZXAXGXZXDXDXDXAXFXDXAXAXDXDXDXHXFXFXZXZXDXDXFXZXDXDXHXCXZXFXHXFXHXVXFXFXFXZXZXHXFXZXHXDXFXFXVXHXHXFXHXZXVXHXDXFXFXHXFXFXFXFXHXVXVXHXDXDXFXFXFXFXDXDXDXDXDXDXDXDXDXDXDXHXCXDXHXDXGXZXHXBXhX[ ~ Q ~ u u ` b.n.P.T.~.T.T.~.~.T.~.Y.T.~.Y.Y.T.T.U.T.Y.Y.~.P.Y.~.Y.T.Y.T.T.U.T.T.].F.! ! ! ' hXfXZXZXVXVXVXDXZXZXDXDXDXDXFXFXDXDXDXDXZXFXZXZXDXDXDXDXAXDXZXZXZXDXDXDXDXDXGXAXDXDXDXDXZXDXDXDXVXFXFXAXZXDXFXZXFXVXVXZXAXAXAXAXZXZXZXZXAXZXAXDXFXAXZXAXDXHXDXDXFXFXFXHXZXZXVXZXFXFXZXGXZXZXFXDXDXDXZXDXDXDXZXZXFXZXZXZXZXZXFXZXDXDXDXDXFXZXDXHXDXDXHXFXFXFXHXFXAXFXHXDXAXFXFXHXFXVXHXZXFXHXFXFXFXAXAXVXFXHXFXFXAXHXAXDXFXVXHXAXMXhXm.! / / S u F c.e.j.h.h.h.h.g.j.g.d.g.f.g.g.h.f.j.f.f.f.f.f.f.f.f.f.k.i.a.i.a.a.f.i.i.i.i.i.i.i.i.i.i.a.u.i.i.a.i.i.i.a.a.i.a.i.i.i.u.i.s.i.i.i.u.i.i.i.a.a.",
+"B N V V N N N M M M M M M M m M m M M M m M M M m M m m B B M B B B B m m m B m B N N V N N N V N N B V C V C C N C N C V B C V C C C C C C C C C C C B C C Z C C F C Z Z Z Z C Z Z Z G Z H D Z D D D D D D D Z L L Z S Z C % $ & & % * ; ; ; e r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r : r r r * r r r r r r r r r r r r r r r r r r r r * : r e r r r r r r r r r r y r r r r r r r r r r r r r r r r r r r r r ; r r r r q = : ; ; % %         $ m.L.T.~./.T.T.T.T.T.T.~.~.T.~.~.T././././.(.(.(._.(._.|.`.{.(.^._.|._.(.|.`./.^.|.^._.(.{.(.^.(.(././.~.^.~.~.~.~.T.T.T.T.T.T.U.U.T.T.T.T.Y.P.U.Y.T.U.P.P.P.P.P.[ / ! / ' m.fXBXBXBXMXMXMXCXfXMXBXBXMXBXMXBXMXBXMXBXBXBXMXBXMXBXBXMXBXBXMXBXBXBXMXMXBXBXBXMXBXBXMXBXmXBXMXMXBXBXBXMXBXMXBXBXMXBXMXBXMXBXMXBXMXMXBXMXBXBXMXBXMXBXBXMXBXMXBXBXMXBXBXBXZXBXBXBXBXHXBXBXBXBXBXBXBXBXBXBXBXBXBXfXZXBXBXBXCXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXCXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXfXpX' ^ / S c c ' M.].'.dXdXdXdXzXzXzXzX.X.X.XzXzXzXdX XdXdX.X.X|..X|.|._.`.}. X}._._._.(.`.n.S / / } [ hXnXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXMXBXMXBXBXMXBXBXBXMXBXBXmXBXBXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXCXBXBXBXBXfXQ.{ / Q / u u K b.n.F.U.~.T.~.T.T.T.T.T.T.T.U.U.Y.L.L.L.L.L.L.H.L.H.H.H.H.H.S.A.A.A.D.A.A.[ / / ! ' m.hXMXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXCXBXBXBXCXBXBXBXBXBXBXBXBXBXBXBXMXBXBXMXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXMXBXBXBXmXBXBXBXMXCXBXBXBXMXMXBXMXMXMXBXZXMXBXMXBXBXMXBXMXfXMXBXMXBXMXBXMXBXBXMXBXMXBXMXMXBXBXBXBXMXBXMXBXMXMXBXMXBXBXBXMXBXBXMXBXBXMXMXBXMXMXBXBXMXBXMXBXMXBXMXBXMXBXMXBXMXCXBXBXMXMXMXfXQ.} ~ / Q u u K Y b.F.T.T.~.~.I.~.T.T.T.T.T.Y.T.T.T.T.T.Y.P.~.P.~.T.T.T.T.T.Y.Y.T.T.U.T.T.n.S / S / m.hXmXBXBXBXBXBXBXBXZXBXBXBXBXBXBXBXBXBXBXBXHXBXBXBXBXCXBXBXBXBXBXBXBXBXBXBXMXBXBXMXBXBXMXBXBXBXBXBXBXBXBXBXBXCXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXMXBXBXBXBXBXBXBXMXBXBXBXBXBXMXZXBXMXBXBXMXMXBXMXBXBXMXBXMXBXMXBXBXBXMXBXMXBXBXBXMXBXBXmXBXMXBXBXMXBXBXMXBXBXMXBXBXBXMXBXMXMXBXBXMXaX[ ! Q ! u > A Y e.e.j.l.l.h.f.a.j.g.g.a.z.a.g.f.j.k.f.k.f.f.f.f.a.f.a.a.a.d.i.a.a.i.i.i.i.i.i.i.i.i.a.i.s.a.i.i.i.i.i.i.i.i.i.i.i.i.i.s.i.i.s.u.u.a.i.i.a.i.a.",
+"B B B N V N N N M M M M M M M M m M m N M M M m M M M M M V M B M B M N B B B m N N N B B B N V N N V B B B C N B B V A C N C C N C C A C C C B F C C C C C C A C C G Z C Z Z Z Z C Z Z G Z L Z D D D D D L Z H Z L Z Z Z F A % $ $ & % % : = : r r e 0 r 0 : * r r r r r r r r r r y r r r r r r r r r r r r r r : r r r r r r r r r r r r e r r r r r r r r r r r r r r * y r r r e r r r 0 e r r r r r r r q r r r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r ; * % % $ o       & ].T.~.T.R.Y.T.~.T.T.T.~.T.T.~.~.T.~./././././.(.`.^.(.(.(._.(.(.`.{.`._.|._._.{.`.(.`.`.(.(.(.`.(.(.^././.[.!.R.~.T.T.T.T.T.T.T.T.T.T.U.T.U.Y.P.P.P.T.P.P.T.P.P.U.L.) / / / ~ / ~ Q Q Q Q ! / / / Q Q ~ ^ Q Q Q ^ ! ! Q Q ! ! ! ~ ~ ^ Q Q Q ~ ^ Q Q Q Q ~ ! ! Q Q Q Q Q Q ! ^ Q / ~ ! ! ! / ! ! ! Q Q Q ~ ! ! ! ! Q Q ! Q ! ! ~ ~ S ! ! ! S Q ~ ! ! ! S / ! S ! S ! ! S S ~ ~ ~ S / Q Q ^ Q ! S ! ! ! Q / ! ! ~ ! ! S ^ ^ ^ S ^ S ~ S ^ ^ S S S ^ ^ ^ S S S S ~ ~ S ^ ^ ^ ^ S ^ ~ ^ ~ ~ ~ S S ^ ! S ~ ~ / Q ! / / Q c ' c.m.]..XzXzXzXzXxXzXzXdXzXzX.XzX.XdXzX@XdX.X'..X.X.X|.|.`.}.}.}.|._._._.`._.!.` / / / Q ~ ! ! ^ ! S ^ ! ! ~ Q ^ ~ ~ ^ S ^ ! ^ ^ / ! ! S ^ ! ~ ^ ~ S Q Q S S ! ! Q ! S S S S ! S ~ S ~ S ~ ~ S ! Q ! ^ S ~ ~ S ! ~ S ^ S S S ! S ^ K Q S S S S Q ~ ^ ^ S S S ! S ^ ! ~ ~ S ! ^ ^ ~ ~ ^ S ^ S ! ! S S ! S S S ^ S ^ S ^ ^ ^ Q ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ S ^ S ^ ! S S ! S ~ S ^ S ^ ^ ^ ! Q Q c Q Q ^ Q S S S ! ^ ~ ~ ^ Q ^ u u K Y b.n.~.!.T.T.T.~.T.T.T.T.T.U.U.L.I.K.L.L.L.L.L.L.G.H.S.H.A.H.A.S.A.A.A.A.h.Z.[ S ~ ! / ^ S ^ ~ ~ ! Q ~ ! ! / ! ! ! ! Q Q ! Q Q Q ! Q c Q Q Q ~ ! ! Q ! Q Q Q Q ^ ^ ~ ~ ! ! ! ! Q ! Q Q Q Q Q ~ ! ! ! ~ ^ ! Q Q ! ! ! ~ ~ ^ ! Q ^ ! ~ ! ! Q Q S / ~ ~ ~ ^ ! Q Q Q Q ^ ~ ! ^ Q Q Q ! Q Q ! ! / ^ Q Q Q ~ Q Q Q Q Q Q ! ~ ^ S Q Q Q ! Q Q ! ! ! ~ ! Q ^ Q Q Q Q Q ^ ! ! Q Q ~ ^ Q Q ! ! ! ~ ! ~ ~ ~ ! Q Q ! Q Q Q Q Q / S ^ n S u J Y b.n.K.Y.~.T.T.T.T.T.~.T.~.T.T.T.T.T.T.P.T.T.T.T.T.Y.~.~.T.^.Y.T.T.T.[.U.P.P.I / ! ! / ! ~ ^ Q Q ~ ! S S / S ~ ! ~ ! S ! ! S ! / S / S S ! ! ! ~ ~ ! S Q / / ! ! S ~ S ~ Q ^ ! S ! ~ Q ~ ~ S ^ S Q ! S ~ ! S S ! Q S S ~ ~ Q S ^ ^ S ! S Q Q Q S ! S ! ^ ~ ! ! ^ ^ ^ ^ S ^ ^ ^ S ^ ~ ! ! ! ^ ! Q Q ! Q Q Q / / ~ ! ! ! Q ! ~ ! ! S Q Q ^ Q Q Q ^ Q ^ Q Q ~ ~ Q Q Q ! ! Q Q ~ Q ~ / ~ ~ ~ Q Q Q Q Q Q Q Q Q ^ Q Q Q S ~ ~ ! u q u F T e.e.A.A.h.h.h.a.Z.g.a.g.z.g.a.f.f.f.f.f.z.k.a.f.a.f.a.a.a.s.i.i.i.s.a.i.a.a.i.i.i.i.i.i.i.i.s.i.i.a.i.i.i.i.i.i.s.t.i.i.i.i.a.i.a.u.a.i.a.a.a.",
+"N B N B B N V N M M M m M M M M M m M M m M M M M M M m M M M V N M B N B m M C N N N N B N B V B V B N N C N C C B B C N C C B A C A N C Z B Z Z B Z C Z B C C C C V Z Z C Z Z Z Z Z D Z Z Z Z D D Z D Z Z L Z F Z Z D B G Z u $ $ $ & % % * * : r : e : r : r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r 0 r r r r r r r r r r 0 r e r r r r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r r r r r r r : r r r r r r r 0 r ; ; % % $         y Q.T.~.T.T.Y.~.I.T.T.T.T.T.T.T.T.R.T./.~.~././.(.(.(.(._.(.(.(.^.|.{.(.(.|._.|._._.(._.(.{.(._.(.|.(.(.^./.~.~././.~.T.~.T.T.T.T.T.T.T.T.U.T.U.P.P.T.L.L.U.P.P.P.P.L.T.Z._ L S ~ S ! ! ~ ~ ! ! S S Q Q Q ~ ~ Q Q Q ! ! Q ! Q ! ! ~ Q ~ / ^ Q ~ ~ ~ Q Q S / ~ ~ ! ! ! ! Q ! Q ! Q ! ! ~ ! S ! ! / / ! ~ / ~ ~ Q ! Q ! ! ! ! S Q Q / / / ! / ! Q Q ~ ! ! S ! ! ! ! ! Q ! Q Q Q ! ! Q ~ / / Q Q Q S Q ! ! S ^ S / ! ! ! ! ! / ~ Q Q ~ ~ / ! / ! ! ~ ~ ! ! ! ! / / ~ ~ ~ ~ ! ! ! / ! ~ / ~ ~ ~ / ! ! ! / / S / ~ ~ c ^ u i _ c.m.].'.'.zXzXnXzXxXzXzXdX.XzXzX.XdXdX.X.X.XdX.X.X.X|.|.'.'.|.}.}. X_._._._.}.~.].) S / / / ^ Q Q Q Q Q ! ! ! ~ ~ / / ~ / ! / / ~ S ! ! ! ! ! / ! ! ! ! / / / ! / S / / / / / / / / S / / S / ~ / ! Q ! ~ S / ~ / ~ / ~ ~ / / / / / ~ / / / / / / / ! / ! / / / / / / S / / / / ! ~ ! ! ! / ! / ! / / / / / / ! ! Q ~ Q ~ ! ~ ~ ! ! ! ! ! ~ ~ ! ! / ! ! ~ ! / ! ~ / ! ! ! / ! ! Q / ! ~ ! ~ ! S / ~ ! ! ! / ! ~ / Q Q Q Q ^ ^ u i c.c.n.!.!.Y.~.~.~.T.T.T.T.T.U.T.U.L.L.L.L.L.S.L.H.H.H.H.H.H.H.S.S.A.S.l.h.A.Z.A.b.) Z / / / Q Q ~ ~ ! ~ S / ~ ~ S ~ ! ! ~ ~ ~ S ~ ! S ~ Q ^ ^ S ~ ~ ~ ~ ! S ~ ~ ~ ~ ~ S ~ ! ~ ! ~ ! ~ S ~ ~ ! S S / ~ / ~ ~ ~ ~ ~ ~ ~ S ! ~ ! ^ ! ! ~ ~ ! S ! ! / S ~ ~ ~ ~ ! ! ~ ! S ^ ~ ~ ~ S S ! ! S Q ! ! / Q ! Q ! ~ S Q ! Q Q ! ~ ! ! ! ! Q Q ! S Q ! ! ~ ~ ! ! ! / ! ~ / Q ! ! ! ! ! ~ ~ Q Q ! ! ! ! ! ! ~ ~ ! ! Q ! ! Q ! ~ Q / ^ ^ u u S I b.n.F.Y.Y.~.T.(.Y./.T.~.T.T.Y.T.T.U.Y.U.T.T.T.T.T.T.T.T.T.T.P.T.Y.~.T.T.U.Y.L.F._ ! ! ! ~ / Q ! ~ ~ ! ! / / / / ~ ! ! S ~ ! ! ! ! S ! ! Q ! Q ! / J ! ! ! S ~ ! ! ~ S ~ ~ ! ! ! / / ! ~ / ~ / ~ / S ! / ~ ! / / ! ! / / / S ~ / / Q / ! Q S ! / ! ! ! ! ~ / ~ ~ ! ! ! ! ~ ! ! ! ! ! ! ! / / ! ! ! ! ! ! ! / S / ! ! ! ! ! ! ! ! ! ! Q ~ ~ ~ Q Q ~ / Q ! ! ~ ~ ~ ! Q ! ! ! ! Q Q Q ~ Q Q ~ ~ Q Q ~ ~ Q ! Q ! ~ Q Q Q S S ^ S u u F T e.e.j.h.l.l.f.h.j.j.z.f.g.f.g.z.j.z.f.f.f.j.k.z.k.a.k.a.f.a.s.a.i.i.u.i.i.i.a.i.a.i.a.i.i.i.i.u.i.i.i.a.i.i.s.u.i.u.a.i.i.i.i.i.i.a.a.a.a.i.i.i.",
+"M V N N N N N N B N B N N N N B m B M M M M M M M M M M M M m m B N N V M V M M N B N B N N V N B B N m C N C N N C C N C B B C N C C C C A Z B C Z C C C C C C Z C C Z C Z C Z Z C Z L Z Z Z Z Z D D D D J Z Z Z Z H D H Z Z L S * $ $ $ % % % * * * 0 r : r r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r r r r r 0 r r r r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r * y r r r r r r r r : r e 0 * r r r r e 0 r r r r r r r r r r r r ; ; ; % $ o         e (.~.L./.L.T.T.U.T.T.U.T.T.T.T.T.Y.~.~.~.~./././.^./.(.(.(.`.(.(.^.^.{.(.[.|.(.|.|._.(.{.`.^.{.|.^.(./.(.(././.~.T.~.T.~.T.T.T.T.T.T.T.T.T.T.U.U.U.P.P.P.L.T.P.L.P.P.L.L.Y.L.F.[ U _ ~ S S S ^ ^ ^ c Q ^ S S S ~ Q S H ^ S S S ^ u ~ ^ ^ S ~ ^ ~ ^ ~ Q ^ u / ^ ^ ^ u ~ ~ S / Q ^ A ^ ^ S ~ S ! S ! S ^ u S ^ S / c S S / ! / Q ^ S u S ~ u ! ^ u Q ^ S u ~ n ^ / ^ ^ ^ S ^ ~ ^ c u ~ S ^ c u ^ n Z c ^ u S ^ Q ~ ^ ^ ! S ^ ^ ^ ^ Q ^ S S ~ S ! S S S Q S Q Q ^ ^ Q ^ S ^ Q ^ ^ ^ ! ! S S ^ ! ^ S S S ^ ^ ~ u u u S u i c.c.M.].'.'.zXzXzXzXzXzXzXzXzXvX#XdX'.dXdX.X.X'.zX.X.X X.X.X X.X X|.}. X_. X_._.(._.^._.].Q._ _ ~ S ! c S ^ Q S S Q S ! u S c S S S ^ S S S n S S ^ S u ~ c ^ S S S Q S S ~ u S u ^ S K S ^ K n u Q ^ S Q c K Q u ^ ^ i / ~ i S u ^ ^ u ^ / u S u S ^ S K K K Q S ^ Q J u ! u S u S ! S ^ ! K ~ u S ^ S S S S Q ^ ! Q ~ ^ S S Q ! Q ^ ^ ^ c Q / S ! ! S S ^ ^ ^ Q ! ^ S S S S / S Q ^ ^ ^ S J ! S Q Q Q Q ^ Q Q ^ ^ ^ Q ^ u u S i _ _ b.n.F.!.!.T.T.T.^.T.T.U.T.U.U.P.K.U.L.U.U.D.L.L.H.H.H.H.S.H.A.A.A.S.S.A.l.h.S.Z.j.F.h.[ ) P S S F J S S S S ! S K S H i ! S ^ S ^ u S S S Q Z S S S S Q Z S u S ^ S u G S S S u S S S u ^ ^ Z S S S S ! u ^ S Z Q ^ i S S Z S S S S S u S ! Z Z S K ! S S S S Z ^ S u F ^ S S Z ! Z Q S u Q S u c u ^ S u S ^ ( S ^ u S ^ S S S ^ S ^ S S ^ S P c S ^ S Z u S S ^ Q Z S Q ^ ^ ~ ^ c Q ! ^ ^ ! ~ Q S Q ^ ! S Q S ^ ^ u u u u u ) ` b.n.Z.Y.Y.T.T.~.T.R.R.T.T.~.T.Y.T.T.T.T.T.~.T.T.[.P.T.T.~.~.T.T.T.T.T.T.Y.~.P.~.Y.].F.b._ J S ! u Q ^ ! ^ c S ! ~ S c ~ c ^ ~ ! ^ S c ! c S ^ ^ c S f Q f Q c c / ^ ! S / c ~ ^ ! S S Q S S S S S ~ S ~ ^ S ! S S S ! S S u S ^ ^ J ~ ^ u ^ S S S S / Q ^ S S Q u ^ ! S ^ ^ Q ^ ^ S ! ! ~ ^ S Q ! c ! ^ u Q u ^ Q ^ ^ S ^ ^ S ! ^ S S ^ ^ S ~ ^ ~ S S ^ ^ S S S S S ^ Z S ~ S ^ ^ S u ^ S S S ^ S S S ^ ^ Z S ~ u Q S u u q u F G e.e.e.e.h.z.l.h.z.h.a.j.g.z.g.k.g.g.f.f.j.k.f.f.s.k.f.f.f.a.a.a.s.s.a.i.i.u.i.i.a.a.a.a.i.i.a.i.a.i.a.i.a.i.i.s.i.u.u.i.i.s.i.a.i.i.a.i.i.a.a.a.f.i.",
+"A M B V N N N N M B N M B N N M N M M m M M M M m M M M m M M M M M M V M M M M N N B V B B N V V B B G N C V C C N N C N C N B A C C C C C B C C C C C C C Z C Z C Z C Z C Z C Z Z C Z Z L G Z H Z D D D C Z F D Z Z Z Z Z Z Z D C % o $ o $ $ % 0 * r r 0 r r r r r r r e r r r r r r r r r r r r : r e 0 r r r r r r r r r r r r r r r r r r r r r r r r r e q e r r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r r r r r r t q r r r r r r r r r r r r r r r r * ; % % $ o     #   I ~.~.Y.[.U.(.U.U.~.Y.T.T.T.T.~.T.T.Y.(.~.~.T./.T./.^.(.(.(.(.(.(.`.(.(.^._.^.(.|._.(._.|.^.(.|.(.|.(.|.(.(.(./.~././.T.~.T.T.T.T.T.T.T.T.T.U.U.P.Y.U.P.P.P.L.P.L.P.P.L.U.L.F.L.D.F.n.b.` Y ) K u u i u u u u u u u u u u u u u u u u i u u u u u u u u u u u u u S u u D i u i u u u i u i u c u i u i i u u S i i y S A i u i i u K i i K S i i J u ^ i ! J i u i K u c K u u K S K K u Q F K i J S S c K c ) u u J i i S c K K c Q ) ^ c K c ^ c Q c K c K K c S c K c Q u K K c i _ c ^ c i c ^ c ' ) c c ' ` n ' ' c.M.m.].].hXhXdXzXzXzXzXzXzXzXzX.XzXzXzXdXdX.XdX@X'.xX.X.X.X.X.X|. X|.|._._._._.|. X_.(._.!.].Q.m.c.` ` ) ^ K S c c K c u c ' ' c c ) c c c P ) c c ) c c ' K ' c c ) c c ' c ' c ' c ' c ' c n _ ' c ' c ' ' c ' ' c ' ' c ' ' ' ' c ' ' c ' ' c ' c ' ' c c c ' c ) c c c ' ' c ' ^ c c ) c n ' ) c ^ c Q c K c K K c u ' ! c K c J i Q K S K u c K i c ! i S c K K c c i ) c ~ i c ^ K c ! c u c K S J i c K u K c K J K i K ) ` c.b.n.F.Y.!.~.~.(.T.T.~.I.T.U.P.U.L.Y.L.L.D.K.Z.U.S.H.H.G.G.G.S.S.S.H.A.l.z.D.A.h.g.h.s.Z.e.e.T T H u q u q u q u y q u q q q q u q q u q q q = u q q u q q u q u q q u q q q u q u q u q u u q u q u q u q q u q u q u q q u u y u r u u q u r u u u q u u q u u u y u u u u u y u u u u u u y u y N u u u u u u q u u u u u u u u u u u u u u q u y u u u u u u u u u u i u u u u u F A i i u u i u K i u K i u K i u K i i J Y ` b.n.F.Y.L.Y.T.T.~.~.T.E.~.T.Y.T.T.Y.T.T.T.T.T.T.T.T.T.~.T.T.T.T.~.~.T.~.~.Y.Y.Y.!.!.T.U.F.F.n.[ ` ` K Q S i u P i i u S / i u i J u i H S i S J i K S S K G S K K u K i c u S ! i u c ) c S c Q ^ c ' c ^ c i c ' c c ' n c ' c ) c ' c c ) ' c ' c c i K c c i ' ^ c K K c ^ S c K c S i ~ c i i K S S i Q ) i u K i u S i u K i u i u u u u u u u u u u u u u u u u u u i u u u u u u u u u u u u u u u u u u u u u y M u i F Y T e.T j.j.h.G.A.h.j.f.d.Z.z.a.a.k.k.k.f.f.z.k.z.a.z.f.f.f.f.a.f.a.a.s.i.i.s.u.i.a.a.a.a.k.i.a.i.a.i.i.s.i.u.a.i.u.u.i.u.s.i.a.i.i.i.i.i.f.a.a.a.a.i.i.",
+"B N B N N N N C N B N N V B N V M V B M M M M M V m m M m M M M N N M B m m m m B B V B B N B V B B N C B Z C N B B C V B N C N B C B B C C Z C D C C C Z C C B C C Z Z Z Z Z D Z Z Z Z Z Z D D D Z D D Z Z D Z D D D Z D Z Z Z D Z D y $ o $ $ $ % ; ; ; r 0 * r y r r : y ; t y : : q y r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r y * r r : r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r y r r r r y = ; ; : y ; y q y * y y * : ; 0 e ; - % o     #   $ b.T.~.T.!.T.T.T.T.T.T.U.T.U.T.T.T.U.U.T.T.T.~.~.T.(.(.[.~.(.(.(.{.(.(.(.(.(.(.|.(._.(._.(.|.(.(._.(.(.(.`.(.(.^.^././.R./.T.T.T.T.U.T.T.T.P.T.T.P.P.P.L.Y.P.P.P.P.P.P.L.L.P.Y.L.L.L.F.F.Z.b.b.e.e.e.Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y I Y Y Y Y Y T Y Y Y T Y T U Y Y e.` c.Y Y Y c.Y e.` e.` Y c.Y T ` ` ` ` U ` e.Y [ c.Y c.c.c.Y c.` ` [ ` ` ` [ ` ` ` [ [ c.` ` ` ` c.b.T c.` ` c.` e.b.` ` c.[ ` ` ` [ [ ` ` c.` c.b.v.[ b.c.c.c.c.c.c.c.c.c.c.[ c.[ c.c.c.[ ` c.b.c.c.c.b.` c.b.c.b.c.c.c.[ b.c.c.c.c.c.c.c.c.M.n.m.Q.].].'.zXdXdXzXzXzXzXzXcX.XzXzXdXzX.X.XzX'..X.X.X.X.X.X.X.X.X'. X|.|.|.|.|.|. X_._. X_.{.!.!.].n.n.n.c.b.b.c.[ c.c.[ c.c.c.b.b.c.b.[ m.c.c.M.b.c.c.m.c.b.b.c.c.c.c.c.` c.m.{ M.n.c.M.c.c.M.c.b.M.M.c.M.M.` M.M.M.c.M.c.M.M.M.c.M.{ M.c.M.c.c.M.c.M.c.M.c.M.c.c.M.` M.c.c.M.c.c.m.c.c.n.c.c.c.c.c.c.c.c.b.v.c.[ c.` c.c.c.c.[ ` c.b.b.` c.[ [ [ b.` b.c.v.[ b.[ c.[ b.v.b.c.c.c.[ c.[ c.c.[ ` [ c.[ ` c.c.` c.[ b.v.b.v.[ ` ` b.b.n.n.P.].T.~.~.~.~.T.~.T.T.Y.U.P.L.L.P.L.S.L.H.S.K.H.H.H.L.Z.S.S.S.S.h.A.A.A.j.A.h.h.h.h.h.j.j.e.T T T T H G T G G G G Z F G G B G G G G G G G T G G C F F G G G G T C G G G G F B G G B T G G G B G T G G F G u G G G T F Z G G G G G G G G G G H Y G G Y G Y G G G Y G F Y G F G Y G G Y Y Y Y U Y Y H Y K Y Y Y Y J Y Y G Y H Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y e.` Y Y Y [ Y _ T ` c.Y c.Y e.` U ` e.Y b.b.b.F.F.L.Y.~.T.T.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.~.T.~.~.T.~.T.~.T.~.T.T.~.T.~.T.~.T.Y.K.F.n.b.b.b.[ [ c.[ _ ` ` c.e.` ` c.Y c.b.[ ` _ b.` ` ` ` [ ` ` [ c.c.` [ c.` c.b._ c.[ c.c.c.c.[ c.c.c.b.c.b.c.m.c.M.c.M.c.b.c.c.n.M.c.c.c.c.c.b.m.c.c.c.b.c.c.b.c.m.b.v.c.b.b.c.b.v.c.b.c.c.c.` ` v.c.[ b.` c.[ Y [ c.T c.e.` T c.Y ` e.c.Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y P Y Y Y Y Y Y Y Y Y Y Y G Y G Y G U Y T T e.e.e.j.f.f.h.h.l.h.z.j.j.j.g.a.f.f.a.f.f.f.f.f.a.k.k.f.a.k.k.k.a.a.i.i.u.u.i.i.i.i.i.a.a.a.a.a.a.i.a.i.s.i.i.s.i.i.i.u.i.s.i.i.a.i.i.i.i.a.a.f.a.z.i.f.",
+"N B N B B N N B B m B V B N N N m B m C M M M M m M M V M m M M N m m m B m V B m B B B B B N C B N Z B B N C C B C C N B C N C C B C C B Z C C C C Z Z C C C G C Z D B C Z Z B Z Z G Z D Z D D D G D Z Z G Z D Z Z Z D Z Z Z Z Z A D H u $ o o o $ $ % % ; ; e r r r : ; : : * : ; = : = r ; r r r r q r r r r r r r r r r r r r r r r r r r r r r r : r r r r r r r r 0 e r r r : r r r r r r * r r r r r r 0 r r q e r r r r r r r * r r r r ; ; y : : : : 0 e : * r : y 0 : % % % $         o e Q.(.~.[.~.T.~.T.~.T.T.T.T.T.T.U.T.T.T.T.T.T.T.T.~.(.T.T.(.[.(.(.(.(.(.(.(.^.(.(.|./.(._._.|.(.^.{.`.(.`.(.(.(.|.^.^././.~.~.~.T.~.T.T.T.U.T.T.T.P.Y.P.P.U.U.P.P.P.P.L.P.L.L.P.D.L.U.L.K.Z.Z.F.n.n.b.b.b.b.b.b.n.b.b.b.e.b.b.b.e.e.b.e.b.e.b.b.b.e.b.b.b.b.b.n.b.b.n.b.b.b.b.b.b.b.b.n.b.b.b.b.b.n.b.b.b.n.b.b.n.b.b.n.b.b.b.n.b.e.b.n.b.b.n.F.n.n.n.F.n.n.n.n.F.b.n.n.n.F.n.n.b.F.n.n.n.F.n.n.n.n.n.n.n.n.n.n.n.n.n.n.F.n.n.n.n.n.n.Q.Q.m.n.Q.Q.m.n.n.n.m.n.n.n.F.n.n.n.m.n.Q.n.n.m.m.n.F.m.m.Q.m.n.m.m.].n.Q.m.Q.Q.].m.Q.].].].'.'.dX'..XzXzX.XzX.X.X.XzXzXdXdXzX.X.X.X@XzX.X.XdX.X.X.X.X.X|..X.X|.|.|.|.|._._._._._._.^._.~.~.Q.F.F.m.m.n.n.N.m.!.n.Q.m.n.n.m.m.n.N.Q.Q.m.m.Q.Q.m.Q.m.m.Q.m.Q.].m.'.m.m.Q.m.Q.Q.].m.].].m.m.Q.m.].Q.'.m.m.].m.Q.].].m.m.m.m.Q.'.Q.m.].Q.Q.'.m.m.Q.Q.Q.].m.Q.Q.'.Q.m.m.Q.Q.n.m.].m.Q.m.Q.m.Q.m.Q.m.m.n.Q.n.n.m.n.F.n.n.n.n.n.n.n.n.m.n.F.n.n.n.n.n.n.n.n.n.n.n.n.n.n.m.n.Q.n.n.n.F.m.n.n.n.n.n.F.n.n.F.n.n.n.n.n.n.n.n.F.n.n.n.Q.K.Y.T.~.~.^.!.T.~.T.T.Y.Y.P.P.L.L.L.L.L.S.H.H.H.S.H.H.G.S.S.S.A.A.A.A.A.A.A.A.A.Z.j.A.h.A.Z.g.j.T e.e.e.T T T w.G w.w.e.w.w.Y w.T w.T T T T R T T w.w.Y w.T T T T w.w.T T T T w.e.y.T T T T T w.w.T T w.T w.w.T w.T T w.e.w.T e.e.e.T e.e.T e.e.e.e.T e.e.e.T T e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.T e.e.e.e.e.e.e.` e.e.e.e.b.e.e.b.e.e.b.b.T e.b.e.e.b.e.b.e.e.e.b.e.e.b.b.b.n.b.b.b.b.b.b.b.b.n.b.n.b.b.n.b.b.b.b.b.b.b.n.b.b.n.Z.F.K.L.K.T.T.T.T.~.T.~.~.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.~.~.T.~.T.~.T.~.T.~.~.~.~.~.T.T.~.T.Y.~.F.K.F.n.n.F.n.n.n.F.n.n.n.F.n.n.F.n.b.n.n.n.n.n.n.n.F.n.n.n.n.n.F.n.n.n.F.n.n.n.n.n.n.m.n.m.n.Q.n.n.m.Q.m.n.n.Q.m.].Q.Q.Q.m.m.Q.m.Q.!.Q.m.Q.m.n.n.Q.Q.m.n.n.m.m.n.n.Q.m.m.m.n.m.n.m.n.n.F.n.F.n.n.n.n.n.n.n.n.n.n.n.b.b.n.b.n.b.b.b.b.b.b.b.b.b.b.b.b.e.b.b.e.e.b.e.b.b.e.b.e.b.b.e.b.b.e.b.e.b.e.T e.e.b.e.e.[ e.e.e.e.e.T e.e.e.e.h.j.j.j.h.h.k.z.h.f.j.g.g.d.g.f.f.f.k.f.f.f.f.a.f.k.f.k.k.a.a.a.a.i.i.i.i.s.u.i.i.i.i.a.a.a.a.a.i.a.i.i.i.i.u.i.s.u.i.i.u.i.i.i.i.i.i.a.i.f.i.a.a.a.i.",
+"N B B N N N N N m N B N N N N N m V M B M M F M m V m m M m m M m M m M m B m B B B m B B B V C B C C B B B N N C C C C B B C C B C B C C C C C C C C C Z C Z B Z C Z G B D C D Z Z Z Z Z Z Z D D D G Z D D Z D D Z Z Z Z Z Z D A Z D Z G C * o o o $ $ % ; = = : ; r r r r = : r r y y r r r r r r r e r r * r r r r 0 r r r r r r r r r r r q r r r r r r r r r r r r r r r r r r r r r r e r r r r r r r r e r r r r r r r r r r r r r r r r ; ; 0 q * y : : > r r 0 t 0 * * = $ o           G (.T./.^.~.~.~.~.~.T.T.T.U.U.T.T.T.T.U.T.T.P.T.~.~.~.~.~.(.(.(./.(.^.(.(.{.(.(.(.(./.|.(.`.^._.(.(.^.(.`.(.`.(.^.{.(.{././.~.T.T.~.T.T.T.T.U.T.T.U.U.L.U.L.P.L.L.P.P.D.L.P.L.L.L.L.L.L.U.U.L.L.H.D.F.Z.F.Z.F.Z.A.S.n.Z.Z.S.Z.n.Z.n.n.Z.A.n.S.Z.Z.Z.n.Z.A.Z.F.Z.Z.D.H.n.F.Z.F.F.F.F.R.Z.F.F.Z.Y.F.F.F.F.Z.F.F.F.D.F.F.F.F.F.L.F.F.F.F.F.A.F.].L.H.R.].F.L.].Q.K.].F.T.].K.].K.Q.F.].F.F.Q.K.F.].!.Q.K.].P.Y.].K.Y.F.].].].].[.!.m.!.].].].].!.^.].~.].!.[.!.Q.~.].].].].].].K.].].].}.!.~.].Q.]._.].K.].'.].].].].].].].'.]. X'.'.dX'..XdX'.zXdX.XzX.XxX.XzX.XzX.X.XzXzX.X.X X.XzX.X.X.X.X.X.X.X.X|..X|.|.|.}.|._._._. X}._._.].(.(.].].].]._.].K.].].~.].].].].].].'.].].].'.^.].'.'.].].].'.].'.]._.].`.].'.].].].'.].dX].].].'.].].'.'.].dX].].'.]. X'.'.].].'.].'.].].'.hX].].].].].hX].'.].].].dX].].].'.(.].].].]..X].'.].].].^.].].].!.].].K.].].'.].K.].!.].].Q.].].].].].Q.].].[.Q.~.].!.].Q.].Q.].!.!.].K.].].^.].].].!.].Q.].K.].!.].Q.I.K.].Y.].].].!.Q.XX!.~.^.~.~.~.T.~.T.T.T.T.T.P.P.L.L.U.S.L.A.H.H.H.H.H.H.H.S.S.S.A.G.A.h.A.g.A.h.h.A.A.h.Z.h.g.g.g.j.s.j.w.e.e.e.t.e.w.w.e.e.w.e.w.e.w.w.e.w.e.p.w.e.w.e.w.e.e.p.e.e.e.w.e.e.w.e.e.e.w.e.e.e.e.e.e.e.e.e.w.e.s.e.e.e.e.e.a.e.e.e.e.s.e.e.j.e.e.e.g.e.e.e.e.e.e.j.h.e.e.e.j.e.e.b.e.j.e.b.e.Z.b.j.n.k.e.Z.b.Z.j.n.e.A.b.j.Z.Z.n.f.n.j.A.Z.Z.Z.Z.Z.Z.n.n.Z.e.Z.n.Z.Z.Z.Z.Z.Z.Z.S.Z.F.Z.F.F.F.F.F.F.F.F.F.F.F.F.F.F.K.F.F.F.F.F.L.F.F.Y.L.K.I.Y.Y.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.[.~.~.~.~.~.~.~.~.~.T.Y.~.~.~.T.~.T.~.~.~.T.[.~.!.!.].].K.].].].K.K.].Q.F.L.].K.m.F.].F.!.F.].T.U.Y.].].L.].K.K.].F.!.].K.F.].K.].!.!.].K.].].].^.].].'.].].].'.^.].].].].].'.].'.].].].].'.].].hX].'.].].].'.].].^.].].~.Q.].].].~.].Q.].].].!.].].].!.T.K.Q.Y.F.Q.F.Y.F.F.F.F.F.F.F.F.F.Z.F.F.Z.Z.Z.Z.Z.Z.Z.n.Z.Z.Z.n.h.Z.Z.n.Z.h.Z.Z.Z.Z.Z.Z.j.A.b.Z.Z.Z.e.b.e.j.j.h.e.e.e.a.e.j.i.j.j.j.j.h.h.h.h.k.h.g.f.j.a.d.g.k.f.f.f.a.f.a.k.f.k.f.f.a.k.k.a.a.a.i.a.u.i.i.i.u.a.i.a.a.i.a.i.a.a.i.a.i.i.i.i.u.s.s.u.u.i.i.i.i.i.a.a.a.a.i.d.a.a.a.g.",
+"N N N N N N N N M m m N N N V N C m B M B m m M m m V m M M m M M M m M m B M m m B B B V B B V N C B B C B C N C N B N B C B B C B C C Z C C C C D Z Z C C Z V C C C C Z Z D D Z Z Z D Z Z D Z D D Z Z D Z H Z Z Z Z Z Z D D Z D F Z D C H S u $ o o o $ $ $ * * * : r r r r ; * * : ; r r r r * e r r r r r r r r r e r r r r r r r r r r * t r r r r r r r r e r r r r r r r r * r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r : y : : y : y y r : r * * % % $ $ o         r Q.(././.(.T.{.[.!.~.T.T.T.T.T.T.T.U.U.T.T.T.T.T.T.~.T.T.(.T.T.T.(./././.(.(.{.(.(.(.{.).^.{.(.|.`.^.|.{.|.^.|.(.(.(.).(.~.^./.~./.~.~.T.T.T.T.T.U.U.T.T.L.Y.L.J.K.U.P.P.P.L.L.L.L.L.L.L.L.L.L.L.L.L.T.H.K.I.L.Z.L.S.H.H.D.L.G.G.G.S.H.S.h.Z.D.A.D.H.L.S.S.Y.L.D.F.K.P.L.P.L.L.L.L.K.I.K.I.K.I.Y.I.K.R.L.L.T.U.Y.K.P.P.L.P.I.I.Y.K.Y.Y.T.Y.~.U.T.Y.Y.!.T.!.T.T.~.!.!.(.T.T./.!.!.!.!.T./.(.~.T./.~.T.!.!.!.!.~./.(.^.(.~.^.!.~.(.^.(./.(.(.(.`.(.]._.^.].`.^._.(.(.[.].^.}.'.].^.^.(.(.(.^._.{.{.}.(._.`.`..X'.'.'.dX'.dX'.dX'.'.'.'.'.zXdX'.zX'.@XzX.X.XzXzX.X.XdX.XzXzX.XxX.X.X.X.X.X.X.X.XdX.X.X.X.X.X|.|.|.}.}. X_._._._.}._._.(.(._.(.(.(.`.~.`.(.'._..X_.|.`. X|._.`..X`.'.'.'.'.'..XdX'.hX'.'.'.'.'.'.'.'..XdX'..X@XdXdXfXzX.X'.BX'.JXzXxXxXdXzXdXdXhXdXxXdXzXdXJX].dX'.'.#XzXzXxX'..X'.'.xX'.'.'.'.'.'.'.'..X'. X|. X'.'.'.'.|.(.'.(.`.(.(.(.^.~.(.^.^.^.^.}.[.!.~.!.~.~.~./.~.R.^.~.(././.^.~.[.~.(.^.!.~.!.!.~.].~./.~.~.{.!.(.(.!.~.^.T.!.!.!.!.T.T.U.U.[.~.T.[.(.~.~.~.~.~.T.~.~.T.T.U.P.P.L.L.P.L.L.D.S.S.H.S.H.G.H.A.A.A.A.A.h.h.Z.A.h.A.A.h.A.h.j.h.g.g.h.g.d.j.j.s.d.i.f.i.e.e.s.i.s.s.i.i.s.e.d.i.s.e.i.d.a.d.s.j.i.a.i.f.e.t.s.i.s.u.s.s.d.w.d.i.a.s.j.w.i.f.a.a.s.e.s.s.j.d.d.a.s.j.j.j.j.j.j.j.h.h.z.j.G.j.h.h.h.j.W.e.e.A.A.h.h.h.h.A.g.h.Z.g.z.A.Z.z.A.A.g.A.l.A.A.S.A.h.Z.Z.A.S.A.A.Z.h.S.H.h.Z.Z.h.z.G.Z.H.Z.D.Z.F.K.F.Z.H.K.K.S.K.L.Y.U.U.L.P.P.T.K.L.U.U.L.L.U.Y.Y.U.U.I.I.I.U.T.T.Y.T.I.Y.T.T.T.~.T.T.~.T.~.T.~.T.T.T.T.T.T.T.~.T.~.~.~.~.~.~.~.~.~.!.~.~.~.~.~.~.~.!.~./.!.(.Y.!.^.~.~.~.!.!.!.(.!.!.^.!.T.!.].T.~.^.T.~.^.!.T.!.!.!.~.~./.~.~.!.~./.!.!.~.^.[.!././.(.{.{.`.(.`.|.(.|.}.'.'.dX#XhXhXdXzX'..XdX'.'.'.'.'..X'..X'.dX X'.'.'.|.|.'.'.{._.(.(.`.^.(././.(.(.~./.!.!.~.!./.XXT.P.^.Y.P.T.T.U.K.U.K.T.L.K.L.Y.H.L.S.S.Z.F.Z.A.H.Z.Z.Z.A.Z.Z.z.A.Z.Z.Z.Z.Z.S.G.Z.A.h.A.b.A.Z.f.A.Z.j.h.j.j.j.j.d.Z.f.j.h.h.h.h.g.k.k.h.f.f.f.a.Z.f.i.f.f.f.f.f.f.f.f.z.a.f.f.a.k.a.a.a.a.i.i.i.i.u.i.a.u.i.i.i.a.i.a.a.i.a.i.i.i.s.u.i.i.u.i.i.i.i.i.a.a.a.a.a.a.a.a.i.g.a.a.",
+"N N N N B N N m m B B m N N N N B M B B B V M M V V M m M m M M B m m M M M B B B B B B B B V C B N C C B C B C C B B B C B B Z C B C C C C C Z C Z C Z F Z Z Z Z Z Z C Z Z Z Z G Z D D D D D D Z Z Z H G Z Z Z Z Z Z Z Z Z Z Z C Z Z Z Z Z Z G S = $   $ o $ $ % % : : : : ; ; t 0 r r r r r r t : r r r r r r r r r : r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r q r r r r r r r r r r r r r r r r r r r e r r r r r r r r 0 0 : 0 ; ; : : r 0 * * % % ,     #     $ ` ^.!./././.R.^.!.[.~.~.T.~.T.T.T.T.T.U.T.T.T.T.T.T.T.T.T.(.T.T.~.~.~./.~./.(.(.{.(.(.[.(.`.^.(.{.(.|.(.{.(.|.`.(.(.`.(.(.(.^./.~.~.~.~.T.T.T.T.T.T.Y.U.Y.U.U.L.L.K.U.P.P.P.P.P.D.U.U.L.L.L.L.L.L.U.U.U.I.U.U.Y.P.P.L.K.P.L.L.S.K.L.L.L.L.L.K.L.L.L.L.K.L.L.L.U.U.P.P.L.K.Y.T.T.T.T.T.T.I.T.T.T.T.T.~.T.T.T.T.T.T.T.T.I.T.T.T.I.~.T.T.~.T.~.~.~./././.(.!.!.(.(./.(.(.^./.(.(.(.(.(./.^.(.(./.(./.(./.(.(./.(.(.(.(.(.^.{.(.^.(.(.`.(.^.`.`.`.|.|.|.|.'. X`.`.|.|.{._._._.}.}._.}._. X'._.}.}.}.}.|. X'.'.'. X.X.X.X@X'..X.X.X#X.X'..X X.X.X.X.X.X.X.X'..X.X@X.XdX.X.X.XdX.X.X.X.XzX.X'..X'.zX.XdX.XdX.X.X|..X.X}.`.`.|._._._._._._._._._._.|.`._._. X|.|.|.'.|.'..X'. X@X'..X@X'.xX'..XzXzXdXdXdXdX.XdXdXzX.X'.zX.XzXdXdXzX'.dXxXxXdXzXzXzXzX'.vXvXzXzXzXzXdXdXxXdXdXzXzXzXzXJX'.@X'.xXdXzXdXzXzXzXzXxX'.zXzXzX'.zX.X.X.XdXdX XdX.X.X.X.X'..X'.`.`.(.`.(._._._._._._.[._._.(.~.(._._.(.(.|.(.`.(.(.(.(.(.|.(.(.{.(.].(.(.(.`.(.^.(._._._.(.(.^.^.(.(./.(.(.(./././.^./.~.~.~.T.(.Y.!.~.T.~.T.T.T.T.U.Y.L.U.S.D.L.S.S.S.S.S.H.H.G.H.A.S.A.G.A.A.A.A.g.h.A.h.h.A.h.h.h.f.Z.h.g.j.z.z.j.f.i.k.a.k.a.i.z.a.a.a.a.a.a.d.a.a.f.f.f.f.d.f.f.a.f.z.a.a.f.f.a.f.i.a.j.a.a.a.k.a.a.f.a.f.a.a.f.a.k.f.f.l.f.g.g.j.h.h.h.h.h.l.h.h.h.l.z.h.G.g.h.A.h.A.h.A.G.j.A.A.A.A.A.A.A.A.A.G.G.G.A.G.H.H.H.J.A.G.H.S.H.G.H.H.H.A.H.H.H.L.L.H.H.H.H.G.H.H.L.L.L.L.L.L.L.L.L.S.L.Y.Y.P.P.Y.Y.P.P.T.T.T.T.T.T.T.T.T.T.!.T.T.U.U.T.T.T.T.T.U.I.U.T.T.T.R.T.T.~.T.T.~.T.T.T.T.T.T.T.T.~.~.~.~./.~.~./.~.!.~./.~.~.~.T.!.~.~.(.~.~.~.~././.^.(.(.(.(./.(.(.(.(.(.(./.(.~./.(.(.(.^./.(.(.(./.(.(.^.(.`.(.^.(.(.(.^.^.^.(.(.(.|.{.}.`.`.`.|.|.@X X.X X.X.X'.'.zX.X.X.X.XzXzXdX.X.XdX.XdX.X X.X.X.X|._. X X X X_.|.`.`.`.`.`.`._._.|.`.(.(.(.(././././.~.~.Y.T.~.T.T.T.T.T.T.Y.P.U.L.L.L.L.L.L.L.L.G.L.U.H.H.H.H.H.G.J.H.H.H.H.H.H.W.G.h.H.A.S.A.A.h.G.j.G.h.h.h.h.h.h.h.h.h.g.h.g.g.g.g.f.z.f.f.x.f.Z.a.f.a.f.z.f.f.a.a.f.f.f.f.a.k.k.a.a.a.i.i.i.i.i.i.i.i.a.i.i.i.i.a.a.a.i.i.i.i.i.i.i.i.s.s.u.u.i.i.i.i.i.a.a.a.k.a.f.a.f.a.a.",
+"N N N N m B m m N N m N B N M C M B M M m M B B m m M M M m m M M m m M m M m V B B B B B B B V N C C C B C B Z B B C C N C C B B C C Z C Z C C Z C Z C B Z Z Z Z Z Z D G Z Z Z Z Z G Z D D D H G Z Z Z Z D D Z Z Z D Z Z Z D Z G Z Z Z Z Z Z Z C G A % o   o o $ & $ % % % ; ; : y r r r r r r 0 y r r r r r r r r r r r r e r r r r : r y * r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r r r r r r r y : : : ; ; : * 0 % % & $             u ].}.T.{.!./././.~.(.~.T.T.(.T.T.T.T.T.T.P.T.T.T.T.T.T.T.T.(.T.T.~.T.~.~.!.~.~././.(.(.^.(.(.(.(.(.(.(.(.(.`.(./.(.(.(.(.(.(././.~.~.~.~.T.T.~.T.T.T.U.U.U.Y.U.L.U.L.L.L.D.P.S.U.U.Y.S.L.S.L.L.L.P.L.P.P.U.L.I.Y.P.P.Y.Y.P.P.P.P.Y.U.L.L.L.L.L.L.L.L.L.L.I.J.Y.Y.U.U.P.P.U.Y.U.T.Y.T.Y.T.T.T.T.~.~.T.T.T.T.T.T.T.T.I.T.I.Y.Y.T.I.I.Y.T.T.T.~.!.T.~.~.~./.T.(././././.(.!./.^.(.(.(././.(.(.(.(.!././.(./.(.(.]._.`.^.`.(.`._._._.`.^.^.`.`.`.`.`.`.'.`.|.'.`.}.'.|.|._._._._.}._._._. X_._. X'.}. X'.|.|.'. X.X'.'..X'..XdX.XdX.X'.dX.X'.@X|..X X.X.X.X.X.X.X XzX.X.X.X.XdX.X'..X.X.X.X.XzX.X.X.X.XdX.X.X.X.X.X.X|..X|.}. X{._._._._._._.{.`.^._.(.`._._.|._.|._.`.`.|..X'.'..X.XdXdXzXzX.X.X.XdXdXdXdXdXdX#XzX'.xX.X.XzXdXzXzXzXdXdXdXdXdXzXcXzXcXdXzXzXzXzXdXcXfXdXdXnXzXzXzXzX#XfXzXxX'.dXzXzXdX.XdXdXxX'.zX'.vX'.zX'. X.X.X.XdX.X.X X.X.X|. X'.`.`.'._._._._.(.`.^.(._._.(._.(./.(.(.(.^.(.(.(.(.`.(._.`.^.(./.(.(.(.`.(.(.(.(.`.`.^.(._.(.(.^._.(.^././.!./././.~./././.~.~.(.T./.R.T.~.T.T.T.T.U.Y.L.L.L.L.L.A.S.L.S.S.H.H.G.G.A.H.A.A.A.A.A.l.g.G.A.A.A.Z.A.j.A.A.A.h.h.g.e.h.j.f.k.a.k.i.i.i.k.i.a.a.a.a.a.a.a.a.a.s.d.s.f.f.d.f.f.a.a.f.f.a.a.a.s.i.s.s.i.a.a.d.a.a.a.s.f.a.a.a.f.a.f.f.g.f.g.z.f.j.f.h.h.h.h.h.h.h.h.h.l.l.A.h.h.h.A.A.A.h.G.A.A.A.A.h.A.A.A.G.H.h.A.G.H.H.G.H.A.K.G.G.S.H.H.H.H.H.H.H.H.H.H.S.L.L.H.L.H.L.L.L.S.L.L.L.L.L.L.L.L.L.U.L.U.P.Y.Y.U.L.L.Y.Y.U.T.Y.Y.Y.T.L.T.T.T.I.T.Y.U.T.U.I.I.T.U.T.T.T.Y.T.T.~.~.T.T.T.~.T.~.T.T.~.~.~./.~./././.^././.~./.~./.~./.^.[.^.^././.^.(././././././.~.(./.(././.(.(.(.(.(.(.(.!.(.(.(./.^.).(.!./.(.(.^.!.(.(./.(.!./.(.(.`.(.`.(.^._.`.}.'.|.|. X X X'.`. X@XdX.X.X XdX.XdXdX.X.X.X'.dXdX'.dX'..X X X@X X|.|.'.|.|.`.`.`.`.`.(.`.|._.(.(.(.(.(./.!.!.~.~.(.(.Y.(.T.Y.Y.T.Y.T.U.Y.U.I.L.I.L.L.L.L.L.L.H.Z.L.H.L.L.H.H.G.H.H.D.H.H.H.G.W.A.A.G.A.A.A.A.g.A.g.h.j.j.j.f.h.k.h.g.j.j.k.g.g.h.f.z.z.f.f.a.i.f.a.i.z.a.f.a.a.f.f.a.i.f.f.a.a.a.a.a.i.s.a.i.i.i.a.i.t.i.u.i.i.i.i.i.i.i.a.i.i.i.i.i.u.u.i.t.i.i.i.i.i.a.a.a.i.a.g.f.a.z.a.",
+"N N N N N m N N m B V N N N M V B M B m M V B M m m m V m m m m m m M M M M M M B B B B B N B C Z B B B B B B C B Z C B C B B C B C C Z C C Z C C Z B Z Z Z Z Z B Z Z B B Z Z D Z Z Z D D Z G Z G Z Z Z D Z Z D Z Z Z Z Z Z D D Z Z Z Z Z Z A H F C C Z y & o   o $ $ $ % % % : ; * * r r r r : r r r r r r r r r r r r r r 0 r r r r r r r r r r r r r r r r r r * y r r r r r r r r r r r r r r r r r r r r r e 0 r r : r r r r r r : r r r r * : y ; ; ; ; * % $ $       #     u n.(.~./.~.~.(.(.T./././.[.~.(.~.T.~.~.T.T.T.T.T.T.T.T.T.T.T.T.~.(.T.~.~.T.~./.~.~././.(./.(.[.(.{.^.(.(.(.`.(.(.(.`.(.(.(.(./././.!./.~.~.~.~.T.T.T.T.T.T.U.I.U.U.L.U.L.L.K.U.L.P.U.L.L.L.L.L.L.L.L.L.L.P.P.R.I.I.U.Y.P.U.U.P.P.P.P.P.P.U.K.L.U.L.U.L.L.L.L.L.L.L.L.P.Y.U.U.Y.U.U.P.T.T.T.T.Y.T.T.T.T.~.T.T.T.~.~.K.T.T.I.T.Y.T.T.T.T.T.T.T.~.T.T.~.R././.R./././././.(.^.^./.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.|._.^._._._.{._.`.`.`.}.}.}.`.|.`.|.|. X'. X|.|._._.|._._. X_._.}.}.}.'.|._.|.|.|.|.|..X.X.X'. X.X.X.X.X.X.X.X.X.X.X.X|. X X X.X|. X.X X'. X X.X.X.X.X.X.X.X.X.X.X'..X.X.X.X.XdXdX XdX.X@X.X.X.X'.`.'.|.|._._. X_.|.{._.|.`.^._._._._.|._.|.|.'. X X.X.XdX.XdXdXdX@XdX.XzXzX.XdX.XdXdX.XzXzXdX.XzXzX'.zXzXzXcXdXdXzXzXdXxXzXzXzXzXzXzXzXzXzXzX.XvXdXdXzXzXzXzXzX.X.XxXzXzXzX.XdX.X.XzX.X.XzX.X.XzX.X.X.X.X@X.X X.X X.X|.'.|.|.'.|.`.`._. X_._._._._.(.(.(.(.(.(.(.(._.(.|.(.(.(.(.(.(.(.(.(.(.(.(._.(./.(.(.(.(.`.^.`.^.`.^.(.(.(.(.(.^./././././.~./.~././.~.~.~.~.T.T.T.T.T.T.T.T.L.L.L.L.L.U.S.S.H.S.S.S.A.A.H.A.A.A.A.A.j.G.g.A.h.h.h.A.A.h.A.h.A.h.g.k.z.a.f.s.k.a.k.a.z.k.i.k.i.s.a.a.a.a.a.a.a.f.s.a.f.a.g.a.g.f.f.f.a.a.g.f.a.a.a.i.a.a.a.a.a.a.a.g.f.f.a.f.f.a.f.f.f.f.z.k.k.f.h.h.h.h.h.h.g.z.l.l.l.l.A.A.h.h.h.h.A.A.A.G.A.A.A.A.A.A.A.A.G.S.S.S.S.H.H.H.L.L.G.L.L.H.H.H.L.H.H.H.H.H.H.H.H.H.L.H.H.L.H.H.L.U.L.L.L.L.L.L.L.L.L.L.U.P.P.P.U.P.I.I.U.U.U.T.U.L.T.T.T.T.T.T.T.T.T.T.T.T.U.Y.T.T.U.T.T.T.~.T.~.T.~.T.!.~.T.~.T.T.~.~.~.~./././.[./.^././././././././.E././././././.(./././.^.(.(.(.{.(.(.(.(.(.(.(.(.(.(.(.(.!.~.(.(.(.(.(.(.(.(.(.(.!.^.!.(./.(.(.(.(.(.`.^.|.}.}.|.|.|.|.|.|..X X.X@XdX].Q.Q.].'..X.X.X.X|..X.X.X.X'..X.X'.dX'..X|.@X_.|.|.{.`.`.|.{.`._.|.|.'._.|.`.(.(././.~.~.~.T.T.~.T.Y.T.T.Y.Y.T.Y.T.U.U.L.L.I.Y.L.S.L.H.D.L.L.L.H.H.H.H.H.H.H.H.H.S.H.A.H.S.S.A.A.A.h.A.g.G.g.h.g.g.g.h.k.k.h.g.g.h.k.g.g.g.f.f.a.a.z.f.a.g.f.a.a.z.z.z.f.x.a.z.a.a.a.f.a.a.a.i.a.i.i.i.i.i.i.i.u.u.i.i.s.i.i.a.s.u.a.s.s.s.i.i.i.u.s.a.s.i.i.i.i.f.i.a.a.i.a.i.z.a.a.",
+"m N m m m N N N m m m N V N N V M B M B m B m V V V m m m m m m m M M m M m M M B m B B G M B B N B B C C B C B B B B C B C B C C B C C B D C C Z Z C D D B Z Z D Z Z Z Z Z H Z Z L Z Z Z D Z Z Z Z Z H Z Z D D Z Z Z Z Z Z Z Z Z Z Z F Z D Z A A H Z C G B q $       $ $ $ % % * * * = r r r 0 r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r 0 r r e r r r r r r r r r r r r r r r r r r r r r y * r r r r r r r r r r r y : * ; ; % $ % o o           - b.!.].E.[.^.[.~./.R././.~./.~.~./.~.~.T.~.T.T.T.T.T.T.T.T.T.T.T.[.T.T.(.T.~.~.~.~.~.~./././.~./.^.^.(.^.(.`.(.(.(.^.(.(.(.(.(.(./././.~./.~.~.~.T.~.T.T.T.T.U.T.U.Y.U.U.L.L.L.Y.U.U.D.Y.L.S.L.L.L.L.Z.L.L.L.L.L.L.R.L.U.P.P.P.Y.P.P.P.P.P.L.U.U.U.U.L.L.L.U.U.Y.P.U.U.Y.U.P.U.U.U.U.U.Y.T.T.T.T.T.T.T.T.T.T.T.~.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.R.~.~.T././././.(.(.^.(.^.(.(.(.(.(.(./.(.(././.(.(.(.(.(.(.(._.(.(._.^.|.(._.|._._._.|.(.{.}.}.}.|.}. X|.|.}.|.}.|._.|._._._._._._._._.}._._.|.|.|.|.|.|. X X X@X.X.X.X.X.X.X.X.X'. X.X X X|.|.|.|.|.|. X|.'. X X|. X.X.X@X.X.X.X'..XdX@X.XzX.X.XdX.XdX.X.X'..X.X|.|..X|._._. X X_._._.|.(._.|.^._._.`._.|.|.|. X|.|. X X.X X.X.X'.dX'.dXzX.XxXzX.XdXdX@X.XdX.XzX.X.XzXvX.XzXzXdXdXcXzXzXzXdXzXzXzXzXdXcXzXzXdXzXzXdXdXdXzX.XzX.XzXzXzX.XzXzXzXzXzXdX.X@XxX'..XzX@X.X.X.X X X X.X|. X|.|.|.|. X|.|.|.`.`._._._._.`.^.(.(.(._.(.(.(.(.(._.`.(.(.(.(.(.(.(.(.(.^.{.(.(.(././.(.(.^.(.^.{.{.^.`.`.[.(.(.(.(././.!./././.(./.~./.(./.T.~.T.~.T.T.T.T.T.U.U.Y.Y.L.L.U.S.U.H.H.S.S.S.S.S.A.G.A.A.A.A.A.A.A.A.A.j.Z.h.h.A.h.A.l.l.k.z.l.g.f.g.i.z.a.k.a.a.a.a.a.g.a.a.a.a.a.a.a.a.a.g.a.f.a.g.a.f.f.f.f.f.a.a.f.a.a.a.a.i.i.i.i.a.s.a.a.s.a.a.a.f.f.k.f.a.l.k.k.f.h.z.s.h.l.l.x.h.l.h.h.z.z.h.h.A.h.A.h.A.A.A.A.A.G.A.A.G.A.A.G.S.G.S.S.H.A.G.H.G.L.H.G.H.H.H.H.H.H.H.H.H.S.H.L.L.H.L.H.L.L.L.L.S.L.L.L.L.L.L.L.U.U.L.U.U.P.P.U.T.U.U.L.U.Y.U.T.R.T.T.U.T.T.T.T.T.T.T.T.I.T.U.I.U.T.T.I.T.T.T.T.~.T.T.T.T.~.T.~.~.T.~.~./././.(./.^.^.(.(././.!./././.(././././.[./.(.(./.^.`.(.(.(.{.(.(.(.(.(.(.(.(.(./.(.(.(.(.(.(.(.(.(./.(.(.^.(.(./.(.(././.^.(.^.`.^.`._.{.}.}.}.|.|.|.|..X.X.Xm.J r e e : y Z ].dX.X.X.X.X.X.X.X.X.X.XP : * P ]..X'.|.|.`.`.`.|._.|._._._._.^.^./././.~./.~.~.~.T.T.~.T.U.T.T.T.T.U.U.U.U.T.L.L.S.L.L.S.L.L.S.L.H.H.S.H.S.H.H.S.S.H.H.H.G.H.A.A.A.A.A.A.A.h.f.h.h.g.g.g.k.h.k.k.f.f.f.g.g.a.g.z.f.f.k.f.f.a.f.a.a.a.a.a.f.a.a.a.f.a.a.a.a.a.a.a.a.a.i.a.i.i.a.i.s.i.i.u.i.u.i.i.a.u.i.i.i.a.t.i.i.u.s.a.u.u.i.s.a.i.i.i.a.a.k.a.a.a.a.k.",
+"N m m M M M m M V M m m M M m V B m B m B B B m M m M M M m m m M m M M N N M V B N C m B B C B B C N C C C A C C C C B C C C C C C B C F C C Z C Z C Z C G C Z Z D Z Z Z Z Z Z Z Z G Z Z G Z Z Z Z Z C D Z Z Z Z Z D Z Z C Z Z Z Z Z Z F Z D G Z D Z Z Z Z Z Z t $       o $ $ $ $ * * % ; y * : : r 0 = : : r r e r ; r r ; e r r r r r r r r r r r r : r r r = r r 0 0 r 0 r r r r r y : : y r * 0 r r r = r r ; y ; ; y r ; r r : e ; ; ; ; % ; % * $ $ o     #       w b.^./.[.(.(.(././.(.E.(.R././.~./././.~.~.~.T.~.T.T.T.U.T.T.T.~.~.~.~.T.~.~.T./.~.~.~.!.~./.^././././.^.(.(.(.(.).(.(.(.(.(.(.(.(./././././.~.~.~.~.T.T.T.T.T.T.T.T.Y.I.I.L.I.L.L.L.L.U.L.L.L.H.H.U.L.U.S.L.P.U.L.L.R.T.T.Y.I.T.U.U.I.T.T.I.U.T.L.L.U.L.T.U.L.L.T.L.T.U.T.U.U.U.U.L.U.T.U.T.T.U.~.U.T.~.~.I.T./.T.~.~.Y.T.~.U.T.T.T.T.T.T.I.~.T.T.U.(.T.~.T.T.(.!.(.R.|.!./.(.(.^.(.(.(.(.(.|.(.^.(.(./.{.(.(.(./.(.`.(.`.(._._.^.(.{.{._.|.|.|.|._.|.{._. X.X.X{. X'._.|.|.|.|.|.'.|._.|.|._.|.|._.`.`.|._..X|. X X.X X.X X X X.X.X.X'..X|..X|.|..X|.|.|.|.|.|.|.|.|.|.|. X X X|..X.X X'. X'..X.XdX.X.X.XzX.X.XzX.X XdX'. X X.X.X|.|.|.|.{.|.|.|.|.|.^.|._.`.`.|.^._._.|.'. X X.X@X.X.X.XdXdX.XdX.XdXxX'.cXdXdXzX.X.XzX'.@XzX@XdXdXzXdXzX.XcX.XcX.XdXdX@XdX.XdXzXzXzXvXdXdX@XdXxXcX.XzXvX.X.XcX@XdXdXhX'.dXzXxXdXdX X@X XdX XdX X X X.X XdX@X(._..X`.|.{..X_.|.|.|.`.`.{.|.(.^.`.^.^.(.(.^.|.(.(.(.(.(.(.(.{./.(.(./.`.~.^.(.`.(.(.!.(.(.(.(.(.{.`.(._.(././.(.{.!././.{./.[.{.^.T.(.!./.~.T.~.~.T.T.T.P.T.T.P.P.U.P.L.P.L.A.D.L.D.S.S.S.A.A.A.G.A.A.h.h.h.h.l.D.Z.z.h.G.h.h.Z.z.k.z.k.j.s.j.z.a.f.i.k.j.d.x.i.i.a.f.i.i.f.a.a.s.a.a.a.z.f.f.k.z.a.k.f.i.i.g.d.i.a.f.i.i.i.i.f.a.a.s.s.a.i.i.z.s.i.g.j.a.z.z.g.z.x.z.h.h.h.j.z.A.S.z.a.z.Z.g.j.g.h.z.D.z.z.A.Z.A.S.Z.A.l.D.G.h.A.A.S.H.S.G.G.L.L.L.T.G.D.H.L.L.L.L.G.H.T.H.G.H.G.H.U.L.L.U.U.L.G.T.H.U.L.D.H.U.U.S.U.P.U.U.U.L.L.U.Y.P.T.D.U.P.T.U.P.P.T.T.U.T.!.U.T.T.T.T.P.U.T.Y.P.^.T.T.T.T.[.T.T.~.T.~.T.~.~.~.~.~.~.~././.(.(.(.(.(.(.(././././././.(.^.!.(.(./.(.(.(.(.(.(.(.(._._._.(._._.(.(.(.^.(.(.(.(.(.^.(.(.(.[._.(.^.{.).(.(.(.(.(.^.(.(.|.{.|.(.(.`.^._._._._.|.|.|.|.'.[ y : y 0 : : ; * y Q.'.`..X|..X@X_..XdX XS ; ; S '..X{.@X|.|._.`.|.{. X_..X_..X{.(.[.[.(././.T.~.~.~.~./.Y.T.~.U.T.L.T.U.U.P.P.P.L.S.L.L.L.S.L.H.H.H.H.H.H.H.H.A.S.S.S.S.G.H.A.A.A.A.A.A.z.h.l.h.f.k.g.f.f.f.f.z.a.l.z.k.g.g.k.g.f.f.f.a.f.f.k.k.a.i.k.a.k.k.a.a.a.a.a.a.a.a.a.a.a.a.a.i.i.a.u.a.i.i.s.i.t.s.a.s.i.i.i.i.i.a.i.i.i.u.i.t.s.i.i.i.i.s.a.a.a.a.a.i.g.g.d.j.f.",
+"M m M M N M m M m M M M V m M m B B B m B m m B M N M m M M m u m M M M M N M C N N N C B B B B N C C C C C N C C N C C C B C B C C C C C Z Z C Z Z Z Z Z Z Z D Z Z Z Z Z Z G Z H Z Z D Z D H Z Z Z Z Z C Z G C D B Z Z Z D Z D Z Z Z Z D Z B B Z Z Z Z C D D D C Z u $   o     $ $ $ $ % * % % r r : : : > t r 0 ; r ; r r r r 0 r ; 0 r ; ; r r ; r ; ; ; r r r r r r r r r r r r 0 y * ; : ; 0 t : y r r r r ; r ; 0 r r r r 0 0 0 * ; ; * * % & $ o           #   u Z./.!.^.^.(.[././././.^.~.^.!././.~.~./.~./.~.~.~.T.T.~.T.T.T.T.T.T.T.~.T.~.~.T.T.(.~.~.~.~.~./.!./.!././.[.^.^.{.(.(.(.(.(.(.(.(.(./././././././././.T.T.~.T.T.T.T.U.T.Y.L.U.L.I.L.L.L.U.U.L.L.L.L.L.H.S.S.L.L.L.L.L.L.G.K.L.L.H.U.I.I.Y.T.H.I.U.Y.Y.U.K.T.T.U.Y.L.T.T.Y.Y.Y.U.T.T.Y.U.U.U.Y.Y.T.T.T.T.T.T.T./.T.T./.I.T.T.T.T.~.T.T.I.~.I.Y.Y.Y.T.T.~.T.T.T.~./.T.R.R.[.!.(./.(./._.{.(.(.(.^.(.^.(.^.(.{.(.(.(.`.`.'.`.`.`.`._.`._.|.|._. X|._.'._.{.`.`.'..X|.|.|.|.|.|.|._.|.|.|.|.|..X^.|.|._. X X|.|.|.|.`.|.|.dX.XdX X.XdX X.X.X X'..X|._.|.|.|.|.|.|._._. X|.{.|. X|._.'..X.X.XdX X.X'..X.X.X.X.XdX.X.X.XzX.XzX@X.X X'..X'.|.|.|._.|.|._._._._._.|.|._.!.n.n._. X'.|._..X|.'.'. X XdXdX XdXdX.XdX.XxX.XdXdX.XcX.XxXxXdXfXdXdXdXzXzXzXcXcXdXzXcXxXdXdXfXdXcXzXzXvXdX XvX'.dXdXdX.XzXzX'.cXzXdXdX'.mX@X.X'.dXdXdXdX'.dXdX.X'.@X|. X.X X`.|.'.'.'.|.`..X X|.|.{._._.`.(.~.|.|.`./.(.(.(.`.(.^.(.(.`.`.(.`.~.(././.).(.].(./././.(.].(.(.(./.(.(.(.(.^.(.`.`./.!.^./.(.!.).~.~.!.^.~.~.~.~.T.~.T.T.T.T.P.T.U.P.L.L.U.U.L.L.L.L.H.H.H.S.S.A.A.A.A.A.A.A.S.h.A.h.h.A.e.> 0 = Z Z.h.h.A.U > q m T g.d.d.i.j.i.s.s.a.i.i.g.d.s.a.s.s.d.a.a.a.f.k.f.a.C y = Z j.d.f.j.g.i.d.f.i.i.i.i.d.a.g.i.i.a.g.k.z.a.j.g.f.a.d.g.z.z.h.h.h.l.z.z.g.h.j.j.Z = > y 0 H D.A.D.G q : 0 q Z H.D.g.A.G.H.Z.S.H.F.A.H.H.H.Z q * H A.H.S.U.F.G e.T.H.P.P.H.S.L.S.S.T ; y q L.L.P.P.T.H.Y.U.P.P.P.L.L.Y.L.U.Y.P.P.T.Y.P.U.P.P.T.T.T.[.U.T.~.T.T.Y.U.Y.^.U.P.Y.L.P.T.T.T.~.T.T.~.[.T.T.[.~.~.~.~./.^.^.(.(.(.(.(.(.(./.(.(./././.(.(.(.(.(.)././.(.(._.(._.(._.^.(._.(._._.(.`.(.^.|.^.(.(.(.`.!.(.(.(.[.(.(.(.(././././.(.(.(.(.^.(.^._.(.^._._._.|._.|.|.|.'.Q.0 : ; 0 y J S : y ; y '..X|. X.X'. X X.X|.b.[ b.b.'._.'.(..X_._.`.`. X{._.{._.!.{.(.{./.~.~.T.~./.T.T.U.Y.~.I.I.U.~.T.I.I.T.P.U.U.L.L.L.L.L.U.S.H.H.H.G.S.H.H.H.H.G.S.S.S.G.H.A.A.A.h.A.h.h.l.l.h.k.g.g.f.z.f.g.a.g.f.k.z.a.f.g.f.f.a.k.f.a.f.k.i.i.a.i.k.a.a.k.k.k.a.k.a.a.a.a.a.a.a.i.a.a.i.i.i.i.i.i.s.i.i.a.u.i.u.s.s.a.a.i.a.a.u.i.i.i.i.i.i.a.s.a.a.a.a.f.a.i.a.d.a.a.",
+"M M m M m M M M m M M M m m V B B B B B m M B B M M M m m m M M M M M M M N N N B N m C B C B C B C B C C C C A A B C C C C C C C Z C Z C Z C Z Z D Z Z Z Z Z Z Z G Z Z Z Z Z Z Z H D Z D D G Z Z Z Z Z Z Z Z Z Z G Z Z Z Z Z Z Z Z G Z Z Z D Z B Z Z Z D Z Z B Z C Z Z Z %         o   $ $ $ % % % : ; * * = = ; r r r r r r r r r r : ; r r r r r r ; : y : : e e r ; ; e r ; ; r ; ; : : y ; : : ; : r : r e = r ; 0 r r r 0 ; ; ; * % % $ $ o o               S F.!./.~.~.{./.(./.(.(././.^.!.(././././.!././.~.(.~.[.T.~.T.T.T.T.T.T.T.T.T.T.~.~.T.[.T.T.T.~.!.~.~.~.~.~.^././.(.{.(.(.(.(.(.(.(.(.(./.(.!.~././.(.~.~.Y./.~.~.T.T.T.T.T.U.Y.U.U.U.I.U.L.L.U.L.L.L.L.H.H.L.L.L.L.L.P.L.L.P.L.Y.Y.H 0 r * > Y T.T.Y.P q : 0 0 H P.P.U.Y.T.U.T.U.U.T.T.L.Y.T.Y.P.T.U.~.T.T.T.~.U.U.I.T./.Y./.I.I.R.T.~.Y.~.T.T.].T b.T.~.T.T.T.T.(.T.P.^./.(.[./.(.~./.).{.{.|.{.(.|.(.(.|.^.(.(.|.!.t 0 q * y Y  X`.^.'. X_.'.].` F.|.`. X|.'.].[ n.|.|.|.|.|.|.|..X'. X_.'._._..X X|.|._.|. X_.|.|. X XQ.q ; q Q. X X_..X X@X'..X|..X|.|.'.|._.|. X}.|.|._._.|.|.|.|.|..X.X.X X|..X.X.X.X.X.X.XdX.X'.zX.X.X.X.X.X.X.X X|.|.`.`.|._.|.`._._.'.].c.q = y 0 q y b.'.|.|.dX_.dX@X X'.dXzXdX XdXdXdXzX@XdXdXdXdXnXdXdXdXdXdXxXdX.XzX@XzX@XzXxXxXdXdXdXQ.[ .XdXdXdXdXcXzXnXdXdXdX'.xXxXzXQ.r 0 0 ].'..XxXzXzXdX.Xm.q ; : y : ; : : : J '.|.0 r * [  X_._.|.{.{.|._._.{.|.|.(.(.(.{.~.~.`._./././.|.~./.(./.{./.(.].Z e 0 S (.(.q = q [ (.(.(.(.(.(.{.(.(./.(.(./.^.~.~.~.(.T.(.T././.~.R.T.T.T.T.U.U.U.P.L.U.Y.L.U.H.L.L.S.S.L.S.H.A.S.z.A.A.A.A.A.A.g.A.D.g.A.l.e.: * w * T h.k.z.T 0 0 > f.d.z.a.a.d.d.a.a.a.u.i.i.i.d.a.a.i.d.a.f.z.a.k.g.g.u ; r C j.s.z.i.f.d.k.i.i.i.a.d.d.a.g.a.z.a.i.f.f.g.z.g.j.z.l.z.z.f.A.h.h.l.f.l.l.j.h.h.A 0 * t e u a.g.l.m * e 0 : C D.D.H.L.D.G.H.D.H.S.L.A.I.H.S : : S F.P.L.T y = n.G.H.U.H.T.L.L.U.U.[ r * : L.L.L.P.L.U.U.L.L.L.U.P.U.T.P.L.U.Y.T.P.U.U.T.U.T.T.T.P.P.T.~.T.T.Y.T.T.U.Y.T.U.Y.P.~.T.P.[.~.T.T.~.~.T.T.~.~.^.!.E.^.(.[.(.(.(.{.(.(.(.(.(.(./.(.(.(.(.(.(.(.^.(.(.|.(._.(.(._.^._.^.{._._._._.`.(._.(.(.(.(.(.^.[.[.(.(.(.(.|.(.{.(./.(.(.(.(.(.{.(.`.^.|._._._.|._.|.|.|.|.'.`.J y e : _ '..X'.` ; = q Q. XQ.n.Q.`.Q.b.n.`.Q.Q.Q.Q.@X_.Q.Q.n.].|.n.b.b.]. X].b.b.[ F.(./.{.^.{.].e.[ b.[ F.R.~.I.T.U.I.Y.U.U.U.L.L.L.L.U.S.S.S.S.H.H.S.S.G.H.S.S.G.S.S.S.A.A.H.h.A.A.A.A.A.h.l.k.k.g.f.j.f.f.g.a.g.a.f.f.f.k.f.f.a.f.f.a.a.a.i.k.a.k.a.k.k.a.a.k.a.a.a.k.a.a.a.a.a.a.a.a.i.a.a.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.a.i.i.i.a.i.i.i.i.i.a.i.a.a.a.a.f.a.f.f.g.a.a.g.",
+"m N M m m m M m M M m m m V B m B m m B B B m B M m M M M m M m m M M V N N N N N B C B C B C B B N C B C C C C C C C C A C C C C C C D Z C Z C Z B Z Z Z Z Z Z D B Z Z Z Z Z Z D Z Z Z D D Z Z H C Z D Z C Z Z Z D C Z G B Z Z Z Z B Z Z C G Z Z Z Z Z Z Z G B Z Z C Z C Z C *         o   o o $ $ $ % % % * = * ; ; 0 0 r r * r ; r r r r r r ; ; r r r r r r r ; r r r ; r r 0 ; = y y : * y y y : * r y * : y r r * ; * % ; % % $ $ $ o o       #       % ) T.I.Y.~./.~.`.~././.(./.(./././.(././././.(./.^.~.(.~.~.~.~.~.~.~.T.~.~.T.~.~.T.XX~.T.~.T.T./.T.T.~.!.~.~.~.~.(././.E.^.^.^./.(.(././.(./.(./././././.R./.~.!./.T.T.T.T.T.T.T.T.Y.U.U.L.L.U.U.L.L.L.H.L.L.L.L.S.S.L.L.P.P.L.P.P.L.U.Y.A q y * y u H.U.L.A ; ; 0 > A !.U.U.!.U.T.U.T.U.U.T.T.T.Y.T.T.T.T.L.T.T.!.I.~.I./.T.I.Y.Y.(.~.T.T./.~.T.K.Y y = F.T.T.T.T.~.T.T.~.^.^.E./.^.~.(.[.^./.{.[.(.E.(.(.`.(.(.~.`.(.^.Q.= t e > ; y `.(. X_._.!.[ u = F.`.|. X(.[ m = ].|.{..X|. X'. X X'. X X.X X|.|. X'.|..X'._.|.|.|. X_.Q.* : r Q.|.|. X@X.X.X'..X|.|.|..X|._. X_.|._.}.}.|._.|.|. X.X.X X|.|..X|..X.XdX.X.XdX.X.XzX#X.XzX.X.X.X X X.X.X.X|.|.|.|.|.|.{.|.|.].A = y y ; ; ; : 0 ) '.|. X.X.X.X.XxXdX'.@XdXdXdXdXdX.XzXdXcXdXdXdXdXdXdX.XdXdXzXzX'..XdXvX'.zXxXQ.) r J nXxX.XxXcXzXzXdXdXdXdXzX.X.XzXQ.= e r ]..X.X'.'.'..X.XQ.0 y : e : : y : > J '.|.q y 0 [ |.{.|._.|.{.|._.|.(._./.`.(.(.~.(._.[./.(.(.(.(.(./././.{.~.{.(.S : y ~ ^.!.q y e [ {.^.(.(.(.(.{.~.(./.(.!.(././.^.T.~.~.~.T.T.Y./.R.~.~.T.T.U.T.U.P.Y.U.U.L.L.H.L.L.L.S.D.S.S.S.A.S.A.A.A.A.A.A.A.A.l.g.S.h.e.q * 0 0 y e.z.g.Y = w ; T a.g.a.i.u.k.u.a.a.x.s.i.d.s.i.i.i.z.a.a.a.a.z.k.i.u y t A i.z.a.z.a.i.d.d.f.z.a.a.d.a.s.a.i.a.j.i.z.a.g.z.h.f.l.D.z.h.h.a.h.l.l.l.z.g.h.h.C r e * e q e.A.j.> * 0 e > L z.A.D.l.H.G.A.A.A.A.H.L.G.L.Z * * Z L.P.b.0 r q b.G.U.G.U.D.U.U.U.U.T r e e L.U.L.Z.L.I.S.U.U.T.U.P.T.T.P.U.P.U.U.Y.U.Y.L.T.T.U.T.T.~.T.U.T.[.U.[.T.~.~.T.~.Y.Y.T.~.~.~.T.T.~.T.~.T.~.~.~.~.[.(./.(.(._.(.^.(.(.(.^.(.(./.(.(.^.(.^.(.`.(.(._.^.^.(.(.(.(.(._._.|._._._._._.(.(._.(._.(.(./.`.!.(./.(.!.[.(.(.(.(.(.^.{.(.(.|.(.(.(.^._._._._._._._._.|.|.`.].y * r = '. X@X|.'.b.].'.`. Xr : : [ * = u ].J 0 q H |. X> = * [ u = 0 r y n.S r > 0 u n.(./.^.T y > y 0 0 0 G F.T.T.U.Y.T.U.U.L.L.L.L.S.S.L.S.S.S.S.H.S.S.H.H.S.S.S.S.S.A.W.S.A.A.A.A.h.A.h.h.k.h.h.k.f.f.a.f.a.g.i.k.z.f.k.f.f.f.f.a.f.a.f.f.a.a.i.i.k.i.a.k.a.a.k.a.a.a.k.a.f.a.a.a.a.a.i.a.a.a.i.i.i.i.i.a.i.i.i.i.i.i.i.i.i.i.a.i.i.a.a.i.i.a.a.a.a.a.a.a.a.f.a.g.a.g.g.a.",
+"N M m M M m N M m M M M M m M B B M N B M m M B M m M M M m M M m M m N M B N B B B B N B C C C C B N C C C C C Z C Z C C C C C Z C C C Z C C Z C Z Z Z Z Z G D Z Z D Z Z Z D G Z G C Z Z G Z Z Z Z Z Z C Z D Z Z Z Z Z Z Z Z Z G Z Z Z Z Z Z Z Z Z Z G Z Z Z C Z C Z D B Z H Z H C %           o   o $ $ $ $ % % % % * ; ; * ; r r 0 r 0 r : 0 q ; t = : y : r r r r y e r r r r r = r ; ; ; : q > ; : r * : * = * % % % % $ $ o o o o               $ i F.T.T.T.R.~.~./.~.~.[.(././.(././.(.(.(.(.(././.!././.~./.!./.~.~.~.~.~.T.~.T.T.T.T.~.).T.~.T.XX{.XXE.(.T./.~.~.~.~.~.~.~././.(./././.(.(././.(.(.~./.~.^.~./.~.~.~.~.~.T.T.T.T.T.U.U.I.U.U.U.U.U.L.L.L.S.U.L.L.S.L.L.L.L.L.P.L.U.L.L.L.U.U.Z : : 0 * : L.T.Z.; ; > r y Z ~.L.U.I.R.U.T.^.~.[.H.U.U.Y.P.P.U.U.T.T.U.~.I.T.~.T.Y.T.~.K.T.T.T.T.U.T.(.b.e : 0 b.T.(.Y.Y.T.T.L.(.T.T.^.~./.!.~.(.{.(.(.|._.|.|.(._._.^.|.`.|._.` r r r e ; * n.|.|.{.|.Q.q > ; Q.`.|.'.Q.* y y Q.`.dX X.X@X|..X.X|..X`.`.'..X|.|. X.X'. XdX_.|. X_..XQ.: r y Q..X.X_.'.'.zXdX X X|.|..X X|.|.|.|.|.|.|.|.|.|. X_. X X X.X.X|.|..X.X.XdX.X XdX@XxX.X.XdX X@X X X.X.X.X.X|.|.|.|._.|.(.|.`.S = > * : S J 0 r 0 > [ '.@X X|.'.zX'.dXdX.XzX|.dX.XdXcXdXdXcXdXdXdXdX XxX@XdXdXdXdXdXdX.XdXfXdXdX) e ; ) dXcXzX.XdXdXdXdXdXdXdX.XxXdXdXn.y : * Q.dXdX'.@XdXdX.XQ.: : r : y : ; * y H .X.X> > r b.|.(.{.{.`._._.|.}. X{.(.(.(.(.`.^.~.~.^.{.XX(.(.^.(.T.(.~._./.^.J 0 0 H ).T.[ ` [ F.~.(.(.].[.`.~.(.T.^.~._.T.~.~./.E.~.!.[.^.T.T.!.T.T.T.T.T.P.Y.Y.L.L.U.L.L.L.H.L.H.H.S.S.G.S.S.S.A.A.h.A.A.A.A.h.Z.h.h.g.h.e.> : * > > u z.z.T > 0 y T z.e.T i.T a.a.i.T T T T i.u.a.a.T T T G T s.f.a.s.Z > ; A f.z.a.h.e.T G T T w.s.z.i.s.a.k.e.T G T G T g.D.a.f.T e.T Z.e.T T A.h.l.l.g.A.g.Z e ; y > = T l.T : r y y : A G.G.z.H.A.T T Y T F.Z.I.G.H.D > : Z L.Z.T : e y T b.U.L.L.L.b.T T n.T y ; = L.L.U.T.Z.e.T ` [ Z.T.T.U.e.b.b.Z.P.P.P.b.b.F.U.T.U.F.b.b.n.T.F.n.n./.F.[ [ [ U.{.T.T.T.~.~.T.~.~.~.~.!.~.~././.^.^.(.(.(.(.(._._.(.(.(.(.(.(.^.(.(.(.(.(.(.|.^._.(._.(.(.(.(.`._.|._.|._.|.|._._.`.|.^.(.^.(.(.(.^.^.^.(.(.(.(.(.(.^.(.(.(.`.{.^.|.^.(.^.`.(._._._.}.}.}.|.|.|.n.* r e S '. X X.X.X.X.X X.X'.t r : r r y ` @XS e ; L .X.X> r e y * = : ; ; y = ; * y y S [.^.b.q ; y 0 * y 0 * J ~.Y.U.T.L.I.U.U.U.L.L.S.H.H.H.S.H.Z.H.S.H.A.A.S.S.S.S.A.A.A.A.A.A.A.h.h.A.h.g.g.g.z.l.f.f.f.f.a.k.k.a.k.a.k.a.f.a.a.a.a.g.a.a.a.a.a.a.a.a.k.a.a.a.a.a.a.a.k.a.i.z.a.a.a.a.a.i.i.a.i.i.a.a.i.a.i.a.i.i.i.i.a.i.i.i.i.i.a.a.i.a.a.a.i.a.f.a.a.k.k.f.f.z.g.g.g.g.",
+"M M M M M M m M M M B m M m N M N N N N B B M M M m M m M M M M M M N N N V N B B B N C B B N C Z B C N C C C C C C C C Z C C Z C Z Z B C Z D Z Z Z Z Z B F B Z Z Z Z Z C Z D Z D Z D Z Z Z Z Z D B D B Z Z Z Z Z Z Z D C D C Z C Z Z Z Z Z Z Z Z Z D Z G Z Z Z C Z Z Z D Z B H D Z Z Z y %               o o o $ $ $ $ & % % % % = * * : 0 * 0 r ; ; ; y 0 : > r 0 r = ; ; ; r r r r r ; : ; * * ; * : % : % % $ % % $ $ o o         # #       % u b.L.XXT.T.T././.~.~.!.!.~.(.(.(.(.(.(.[.(.(.(./.(.(.(.(././.^././.~.~.~.T.~.~.T.T.~.~.~.~.T.[.T.~.~.E.XXU.XXT.~.T./.~.~.~.~.~.^.(.~./.^./.(./.(././././././.~.~.~.^.~.~.~.~.T.~.T.T.T.T.U.T.Y.I.U.U.L.L.K.L.L.L.K.S.L.L.L.L.P.L.L.L.U.U.U.L.S.L.U.S : : y * > [ L.[ ; ; y 0 = S !.L.U.Y.I.[ [ T ` K.T.[.T.U.F.b.b.Y.~.T T T F.~.T.T.T.].b.b.b.T c.F.T.T.S.[ > 0 0 [ n.F.R.(.~.P.b.[ [ b.].~./.(.(.n.n.n.~.n.[ b._.{.`.(.`.(.(.(._.A r r S = : : Y |.[. X~.[ : ; ; b.n. X].b.* ; 0 [ n.`.'.|.'.Q.b.[ b.b.Q.'..X|.|.@X.X].b.b.[ b.]..X.X Xn.y : * Q..X_.Q.Q.F.n.].|..X.X X_..X'.|..X|. X X}.|.|. X@X X X@X X.X X.X.X.X.X.X X.XdX X X.X.X.X.X.X.X.X.X'..X|..X|..X'.|._.|._.|.F.* t * u Q.|.'.Q.q > 0 P '.|..X'.].b.[ b.Q.zX'..XdXdX.X'.n.n.[ n.n.'.dXxXdXdXdX].b.n.[ b.].dXnXdXQ.A ; ; u Q.].zXdXvX#Xn.b.b.b.n.].zX@X'.].y : e Q.dXdX@X.X.X.X XQ.y y = J '. X.X X.X|.|.(.y 0 r ` (.(.|.'.].b.[ [ n.].(._.!.).(.!.Y.[ [ [ b.^.{.~.~.(.(.].b.` b.].Z y 0 Z (.~.F.n.n.Y.{./.F.K.n.~.].[ b.b.].~.T.(.^.Q.T [ [ ~.F.F.n.F.~.~.T.T.T.T.U.U.U.U.L.U.L.L.L.L.S.H.L.H.G.S.S.G.A.A.S.A.A.A.A.A.A.h.A.S.g.e.: y 0 0 t = T j.G q * q T i.T y = y i.d.f.> r m T i.i.T B q * r > = q T k.f.B * ; C f.s.k.G q q 0 e ; t G u.i.z.e.C q e ; ; : y N T z.j.q e q D 0 = q e.z.z.g.h.j.j.Z 0 0 C e * G l.Y e 0 Z : : C A.S.F.Y t r e y * q G F.L.L.S ; ; Z U.Y * e r 0 > y b.L.L.S ; > 0 q u t = y G.T.I.T u r = : * u T T.T.G * y ) P.T.I q 0 = b.K.T.G y 0 U n.= = q [ u 0 = r C F.~.[.~.T.Y.T.T.T.~.~.~.^.^.E././.^.^.(.{.(._.(.(._.(._.(.(.(.(.(.(.(.(.(.(.^._._._._._.`.(.(.`._._._._.|.{._.(.{.(.`.`.(.{.(.^.(.(.(.(.(.(.(.(.(.^.(.(.(.(.(._.(.(.(._._._.`._.|.(.}.}.|._.|._.!.y : r ) @X.X X.X.X X`.|.|..X0 : y 0 b.n.].'.S e ; J |.'.; 0 * y n.b.: e r 0 b.n.u = * > ).(.r q : L Q.^.Y y > y n.T.T.U.U.L.L.L.L.A.L.L.H.H.S.L.D.A.H.A.G.A.H.S.h.h.S.A.A.W.h.A.A.A.A.G.e.h.g.g.g.f.a.f.f.f.f.k.i.i.k.k.z.i.a.i.j.f.g.a.a.a.a.k.i.a.k.a.a.a.a.k.a.a.z.a.a.a.a.a.a.i.a.i.a.a.a.a.i.i.a.i.t.a.a.a.i.i.a.i.i.i.a.i.i.a.a.i.i.a.i.a.a.a.a.a.a.z.a.a.z.g.a.z.a.g.f.",
+"N N m M M m M M M m m M m M M N N m N N M M m M M V m M m M M M M N M V B B N C B V B N N C B C C C N A C C Z C C F Z C B C Z C Z C Z C Z Z Z D Z Z Z D D D D Z Z Z Z G Z G Z L Z L D Z Z Z Z Z Z B Z D Z Z Z Z D C Z Z G Z Z Z Z Z Z Z B G Z Z Z Z Z Z Z Z Z Z Z Z Z Z D Z A D Z D Z C C B u u % $                   $ o & o $ $ , $ $ % & $ % * % % % % ; % % % ; % ; ; ; % ; * % % % % % % $ & $ $ $ $ $ $ o o                         % ) n.T.T.U.U.XXJ.~.(.~.R.!./.~.(.(.!.~.(.(.(.^.^.(.(.(.(.(.(.)./.(././././././.~.!./.~.~.T.~.~.~.~.~.T.~.~.~.T./.~.XX~.~./.~.~.~.~.~.~./.~./././././././././././.~.~.~.~.~.~.~.T.T.~.~.T.T.T.T.T.T.U.L.Y.U.Y.Y.U.L.L.L.L.L.L.U.L.L.P.L.L.L.U.U.L.L.U.T.T.U.A : y H = 0 U T.U q r J q : Z E.XXT.[ u = = y * q [ ^.Y.T.: = r [ u q r : y b.T.~.T y = y * q : u [ ~.T : * y 0 = q Z.~.T.` q y * r r 0 U ~.!./.q : q ` : * A ].^.^.`.|.(._._.Q.0 ; r [ ) 0 : y ]..X|.b.0 0 * : ; q F.b.> y ; : : : Q..X'.S y * y ; * r A Q. X'.'.[ q * y q 0 * S ~..XQ.r : 0 Q.].H * y * T '.@X'..X.X|.'.|. X|. X'.|.|.|.|. X|..X.X X.X.X.X|..X.X.X.X.X@X X.X.XdX.X.X.X.X.X.X.X.X|..X'.|._.|.|.|.|.'.'.[ y r 0 [ |.@X(.|.n.Q.'.'.'.dX].I r 0 0 0 y P ].fX.XdXb.u > ; r 0 ; : b..XdXdXK 0 y y y ; * I '.cX0 q : : ; : I dXcXb.u = y : y ; y ` zXzXm.* : r ].'..X.X.X.X.X.XQ.0 r * A Q.n.!.n.n.|.|.'.= e : b.|.{.{.[ q 0 : q = Z n.`.`.(._.` q 0 r : q A n.[.~.Y.n.u = = 0 y u * > S /.(.e 0 q [ ~.n.y > * b.y 0 e 0 A ]./.(.b.u q q * u U 0 q G Y.T.T.T.U.U.U.U.L.L.L.U.L.S.L.L.H.H.S.D.S.S.S.S.A.A.S.A.A.A.A.j.h.h.A.h.h.e.> 0 0 t = 0 ; e.T y t r T i.G e e r i.i.f.r ; > G k.u.N w ; 0 r q > % 0 T z.V 0 : Z d.d.T q t y = r y * 0 A f.a.G r r ; ; q ; * q P A.g.r : : y 0 t Z A.z.j.z.h.A.g.A ; * U u ; u g.A ; r T e y C A.H.T r ; ; : = y : ; Z D.L.C ; * Z P.[ y * r r = = b.T.U = > e : q : : : y L.U.b.= : = y y ; ; y e.T.b.: : A U.XXA ; e y U T.U.C > 0 b.n.e : * = ; 0 * y r [ !.T.T.~.~.T.~.~.~.~.~.~././././.(.(.(.`.(.`._._._._.(.(.(.(.`.(.(.(.(._._._.(._._._.(._._._._._._._._._.|._.|._._.(.(.(.`.(.(.{.^.(.(.(.(.(.(.).(.(.`./.(.`.{.(.|.|.(._._._._.`.|._.}._._.|.|.n.; 0 r S .X X X X'.~. X@X X[.0 : : Z '. X X_.P ; ; J  X`.; = y )  XdXS r r S ^.).[ q t : (.F.> : y U b.` [ q : = T T.T.L.T.L.L.S.L.S.L.L.H.H.H.H.G.A.A.A.A.H.A.A.A.S.h.A.A.A.A.A.A.A.h.z.h.h.g.g.f.z.a.f.f.a.f.z.k.f.i.i.a.z.a.a.a.a.a.a.a.a.a.a.a.a.i.z.i.a.a.a.a.a.a.a.k.a.a.a.a.a.a.a.a.a.a.a.i.a.u.i.a.a.i.i.a.i.i.i.a.a.i.a.a.a.a.a.a.a.a.a.a.a.a.a.f.f.g.k.g.z.g.z.g.z.f.",
+"N N M M N M M m m M M m B M M M M C N N V M M F m M M M M M N m M N V M V m A N B C B C C N C B C C C C C C A C C C C C D Z C C C D B Z C Z D Z Z Z Z Z D C Z Z Z Z Z B Z Z Z Z Z Z Z G Z Z Z Z D Z Z B D B D Z Z Z Z Z Z Z Z Z Z Z Z Z D Z Z Z Z G Z Z Z Z Z Z Z Z Z C C D D C Z H Z Z G C G C Z Z u 0 & o                   o   o o o o $ $ $ $ $ $ $ & $ $ % $ & & $ $ $ $ & $ & $ $ $ $ o $ $ $ o o   o                       % D [ U.T.U.U.T.T.XXXXU.XXT.T.[.R.~.~././././.^.(.(.(.`.(.(.(.(.(.`.(.^.^./././././.[.~./.~./.~.~.~.~.~.[.~./.T./.(.T.XXT.~.~.T.T.~.~.^.~.~.~.~./.~.(././././.~./.T.(./.~./.~.~.~.~.~.~.~.~.~./.T.T.T.T.T.U.T.Y.Y.L.U.L.L.U.L.L.U.S.L.U.P.P.L.U.P.L.L.L.L.U.L.S.U.L.Z r r ) u : N L.u 0 r [ ; : Z T.T.b.q ; 0 e ; r r q T ~.U.t ; ; = : : e ; ; C U.F.y : t u ` y > * M F.b.r e 0 0 : > b.~.e.* y r e e = r ; U ^.~.q > > 0 0 r J |.^.|.(.`.|.|.`.[ : : q m.b.: : y n. X X[ : e q : 0 0 n.b.> : 0 0 y = Q..XU r r r ; ; e ; 0 I '. Xb.r ; y ; ; ; r y Y _.Q.: ; q n.I = y : ` '. X X.X|.|..X|..X.X|..X.X X X X|.|.|.|..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X|..X.X|.|. X X|.|.|.`.'.Z e : y n.|.|.|. X X X X}.@X'.Z ; ; : y r r 0 A dXdX].y : y r e ; > : * ].dX_ : : y [ _ e q : b.dX> : r : e : ^ dX'.0 * * > y : > r t ].zX].* y = Q.dX.X'..X.X'.'.n.q : e e : ; y y y |. X|.0 e : [ |.(.[ = * ; e r > * r Q.{._.T y > e ; r ; r r F.!.!.A * > e 0 r r * t S (.(.0 : y [ /.F.= r * 0 r e > ; = ` ^.].q 0 = > r t q : r Z !.T.U.T.T.U.L.L.L.U.L.U.S.L.L.S.L.G.L.H.G.G.S.S.A.H.A.G.h.A.A.A.A.h.h.h.h.e.0 > t H u : ; B G > > y E i.T * e * i.i.i.0 y = T t.T * * = T z.T q r 0 T s.u r ; A g.Z.M 0 0 C a.j.G y * > t.d.Z y q m Z.j.Z e > = Z.j.y : e q Y T h.h.h.A.z.z.S.k.A ; q U Z ; * e.* y S T q > S Z.Z.u 0 r H F.U.T ; ; : Z.L.S : t Z U.L.T : ; q [ b.L.F.q r = Z L.b.u : : : L.U.u e > u Z.F.C t : q F.T.y r = n.Z.> ; 0 e q Y.n.= > = ].A.r q q Z b.[ q 0 ; A !.T.~.~.~.T.~.~.~./.~.!.~./.(.(.{.(.(.`.^.`.(._._._._.(.(.(.(.(.(.^.|.(.(._._.{._._._._.(._._._.{.|.|._._.{.|.|._.|.^.`.^.`.(.).^.(.^.{.(.^.(.(.(.^.^.|.(.(.^.|.(.(.`._._._._._._.}.}.|.|.`.|.{.y : 0 q '..X X XQ.r S [ ].|.: > : [ `.{.|. XL ; y S  X@Xr r : b.}.}.P r = S `.{.[ * > y ).n.* : : : r = q * > q [ Y.L.L.L.U.U.L.L.L.S.H.H.D.G.A.H.A.S.A.A.A.A.A.A.A.A.A.A.h.A.A.A.j.A.h.h.f.g.j.f.a.f.f.f.f.f.i.k.i.i.x.a.i.k.a.a.a.a.a.a.a.a.a.i.i.k.a.a.k.a.a.a.a.a.d.a.a.k.z.a.a.i.a.i.a.t.i.i.i.a.i.a.i.a.i.a.a.i.a.a.i.a.i.a.a.a.a.a.a.i.a.a.i.k.f.a.f.a.h.a.g.z.k.k.i.k.",
+"N N N N B N N M M m m N M M M M M M M M M B N m M N M N N N N V N N B N B B B B C B N V B C B C C V C C C C C Z Z C Z Z C C C Z Z C Z D Z C G C Z L Z L Z Z Z Z Z Z Z Z Z G Z Z Z Z Z Z Z Z Z Z Z C Z Z Z Z D Z Z Z Z Z Z H Z Z Z Z Z Z C Z D Z H Z G D Z L Z Z D Z Z Z Z C Z Z Z Z Z Z Z Z C Z Z C Z Z Z Z C m % $ o                           o         o o   o o         o o   o                                     $ e K c.L.L.U.P.U.T.T.U.T.T.~.T.T.~.T.~.T.~.[././././.^.(.(.(.(.(.(.|.(._.(.(.(.(.).(./.^./././././.(.!.(././././.!././.!.~.~.~.~.T.T./.~.~.~.~.T.~.~.~.~.(.~.~.~.~.~.~.!.~././.~.~.~.~.~.~.~.~.~.~.T.T.T.T.T.T.T.T.T.T.U.T.U.P.U.L.L.L.L.L.L.L.U.U.U.L.P.P.P.P.L.L.L.L.U.Y.U.Z : e ` I ; ; b.y r P T y r A T.~.u * 0 A K.Y.A r = t !.T.: : ; u [ b.m * ; : U.b.: > r T T.L.n.H.T.Y.Y.T : e : [ b.L.R.y r = U Y.~.e.: 0 0 F.(.* r e 0 [ n.U._._._._.'._.|.`.u 0 0 : _.^.r : e P .X X].b.e r q [ Q.|.^.b.: > 0 [ Q.{.|./ C : S .X'.L : : y '..Xq 0 : Z ~./.` r > u `.n.y ; y S ; ; * ` `.|.|.|.|. X X.X.X|..X X.X.X'..X.X X X.X.X.X.X.X.X.X.X'.zXzX.X.X'..X.X.X.X.X.X.X.X'. X.X.X.X X.X|.`. X X X|.'.'.P : y : n..X|. X'..X X|. X|.b.r t 0 b.dXb.r t 0 b.dXn.P y > n.dX].e : e [ dXP r : u hXdX].n.mX@XdXm.P r ; A Q.].dXn.) y : n.dX].q ; r [ dXQ.r y r n.dX.X.X.X'..X'.Q.* 0 r : 0 * : e * '.`.(.r r r ` (.].y ; > ` ^.Q.y % : U (.P.: y = U /.F.y r e P ~.b.y r : ` (.b.0 r * ~ (.{.* r > T T.F.y y ; A b.[ q ; 0 Z /.[ r : ; [ ~.b.* r r H Y.^.T.T.P.U.L.Y.L.U.L.L.S.L.H.H.S.H.H.G.S.A.S.H.A.H.G.A.A.A.A.A.h.l.h.k.A.T * 0 q U e.= 0 0 y r r y T f.T ; ; 0 a.w.d.r 0 * T u.N e * u i.i.p.e.a.g.a.a.A ; y A j.e.q q : Z Y T Z y > q T g.a.g.j.e.G Y q q > ; g.j.0 > r V Z.A.l.h.h.z.h.k.z.h.A e : G T r > C w = T U = * S Z.j.r e r J U T Y y > q T U.S * r Z T.U.e.t e 0 b.I.U.n.= y * b.U.(.U t * : U.Z.r r q e.P.T.e.q * : F.L.L y ; ) Y * r q y q b.[ : : U ~.Z.: r 0 b.~.!.S r r Z (.Y.Y./.~.~.~.~.~.!.~.~././.(.(._.(.(.|.[._._._._.|._._.(.`.^.[.(._._._.^._._.`._._._.`._.^._.`._._.|.|._.|._._._._._.`.`.^.{.(.(.(.(.(.(.(.(.(.'.(.(._.(.|.(.^.|._._._.|._.`.}.}.}.|.}.|.}.}. XZ y > r [ '.'.{.A e * q n. X0 * r b.`._._. XP 0 ; Z .X'.0 e ; [ @X XS ; e S `.^.[ 0 : y (.F.* > * [ L.n.n.b.b.b.F.U.U.U.Y.L.L.L.H.L.H.H.H.H.G.H.H.A.S.A.A.A.A.A.A.A.h.A.A.h.A.A.A.h.l.h.g.j.g.k.f.f.z.a.d.g.i.a.a.k.a.a.a.a.a.a.u.a.a.a.a.a.i.a.a.a.a.a.a.a.a.a.i.a.a.a.a.a.a.i.a.a.a.a.i.i.i.i.a.i.a.a.a.a.a.a.a.a.a.a.a.a.i.f.i.i.f.z.i.i.i.a.a.a.a.g.z.a.z.z.f.k.f.k.f.f.k.",
+"V V V V N N N m M M N m M m M M M M M C m N M B m N M M N M N V M N N N B B B B N C A N C N C B C C C C C F C C C Z C C A Z A C Z C Z B Z Z C Z Z Z Z Z D Z Z Z D Z Z Z Z Z G Z C G Z Z Z Z Z Z Z Z Z D Z Z D Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z G B Z Z G D L Z Z Z C D Z Z Z G Z Z Z Z Z Z Z B Z Z Z Z C C C Z C C Z A Z A q * $ $                           #                                     #           $ % u G e.n.K.S.H.L.L.L.P.P.Y.T.U.T.T.U.T.T.T.(.~.~.~.~.~.~././.^.(.(.!.(.(.(.(.(.(.(.(.(.(.(.(./.^./././.(././././././.(././././././.~.(.~.~././.T.~.~.~.~.~.~.~.!.T.~.~.~.~.~.T.~.~.!.~.~.~.!.~.~.T.~.~.T.T.~.T.~.T.T.T.T.T.T.P.P.T.U.P.P.Y.L.U.L.U.L.L.U.U.L.L.U.P.P.U.P.P.L.L.L.L.S.U.Z : e T T 0 : A y r Y [ : ; L T.F.: * r [ Y.P.b.= r * Z.T.: y ; Y P.P.T * : e U.L.q q 0 r q q H Y L.T.I.n.r r q b.~.Y.Z.r y : _ [ [ [ : t r [ {.q 0 r A `./.{._.(.(._.|._.|.F.* e * S b.[ u : : y [. XdXQ.e r y m. X.X`.Q.0 e q ].'.`.@X.X'.dXn.b._ u y * = '.Q.t e : b. X|.].Q. X'.^.Q.; 0 r ; 0 ; y [ |..X|.@X|. X.X'.|..X|..X|..X.X'..X.X|.|..X'..X.X.X.XzX'..X.X.X.X@X X.X'..X.X.X'.@X@X.X'..X'.'. X|.|. X X'.`. X'.U e * y Q.'. X|. X^..XdXdX XP 0 e S dX'.dXS > > ) .XdXdXdX].m.b.A r > y b.dXb.r ; > = e S ` Q.dXfXdXK e y ) cXdXdXdXdXdX].m.b.Z > y > b..XQ.* y r Q.dX'. X.X.X.X.XQ.; : e y J I S S P |.(.'.* r ; [ ^.b.= e : !.T.~.` y : y {.T : 0 q ].T.T.` * r y T.[ * e = !.(.(.A = q P (.[.* r * b.[.n.* ; y b.].~.H 0 : D (.T : : q U.[.~.D r : A P.T.P.P.T.L.U.L.L.L.L.U.S.H.H.H.H.H.H.H.S.G.H.A.H.A.A.A.A.g.A.A.A.h.h.z.z.e.t r > T j.L : 0 0 ; r q T t.T ; q q d.i.i.y 0 = G i.B : r C i.i.z.i.i.g.a.a.C y r Z e.T > e * : 0 = q q y 0 T h.T Z y = 0 y y q : q Z.S.e r t U G.z.z.A.z.z.Z.g.A.h.A ; * T e.r ; q e q e.T * : A A.d.; ; e : y r = * e 0 ` H.D 0 0 Z U.U.b.; ; r b.I.T.b.: 0 = b.G.U.[ r 0 y L.e.r e = n.T.P.n.= r = b.Y.b.= : A u > y [ = q P Z r q F.T.b.0 r 0 b.(.~.H 0 r F ^.~./././.T.~.~.~./.(./.[.(.(.|.(.(.(._.|._._._._._._.^.`.(.`.|.(.(.|.`._.|.(._._._._.|.(._.`._._.|._.|._._.|.{._._._.(.`.(.(.(.(.{.(.(.(.(.(.^.^.^.^.|._._.|.}._._.|._.`.`.`.|.}.}.}.}.}.}.|.|.m.* > r 0 u I y * e > y dX|.0 ; ; [ `.|.|. XS r y J |..X0 ; e [ |._.Z r : I {.(.b.0 e : {.~.u * t A b.b.F q Z G D.T.U.U.H.L.H.H.L.H.H.H.H.H.G.S.S.H.A.A.A.Z.h.A.A.h.A.Z.A.G.h.A.g.G.l.h.g.g.g.h.a.f.f.z.f.z.a.k.a.a.z.a.a.a.a.a.x.a.a.a.i.i.i.i.a.i.a.a.i.i.a.i.k.a.i.a.a.a.a.i.a.a.i.i.i.i.s.a.i.a.i.i.a.a.i.a.a.a.a.a.a.z.i.i.z.z.i.i.i.a.a.a.a.a.g.a.g.k.d.a.k.f.k.k.k.k.k.",
+"B V V V V N N m M M M M m M M M M V M M m m m B N M M M N N C M B V V V B B B B C N B B B N C C V C C D Z C Z C Z C Z Z Z C Z Z Z Z Z Z Z B D Z Z Z Z Z D Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z H Z Z Z D Z Z Z Z Z Z Z F D Z Z Z Z D D Z Z G Z Z Z Z G Z Z Z Z G C Z D Z Z C C Z C C A C C A C Z Z Z C G C C C B B G C A q = * % % , o $ o                     #         o $ $ $ $ q B G T n.z.D.A.A.A.z.G.Y.U.L.L.L.P.U.P.Y.U.T.U.T.T.~.T.T.T.E.T.~.!./././././.(.(.(.(.(.(.].(.(.(.(.(._.(.(.(.(.(.(././.(.(./././.(./././././.(./.).~.~.~.~.T./.~.~.~.~.^.~.~.~.~.~./.T.~.~.~.~.T.~.T.~.~.Y.T.~.~.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.P.P.P.P.U.P.U.L.I.L.L.L.U.U.Y.P.P.P.L.P.L.L.L.Y.L.L.S r ; T Z.0 y e * : Z.T e y S T.b.y * y Z.Y.U.b.r > y b.U.= e > [ T.U.[ > r : U.T.Z.B > y > ; ; y Z F.Y.Z.r y y Z.[.T.n.* 0 : ; q = = > * q [ ^.> 0 > [ /.{.(.(.(.`.`.`.(.{.[ e ; : r q r q ; : * b..X'.n.: r q Q..X`. XQ.: y y n..X X@XQ.) * : * q C r e r .XQ.q > y m.{.|.`.`.|.@X(.Q.: r r ; y y : y ]._. X_. X.X X.X.X.X.X|..X'..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X'..X.X.X'..XdX'.dX.X.X'..X'.|..X|.|.|. X|.|..X X[ : y = b. X|. X@XS u I n.dXJ 0 e ~  X@X.XI : : P .XdX[ u : = : S r > ; b.dXdX` = > ; r r y y n.dX.XH y ; K dXdXdXdXb.S * * q u > y * v.dX].* ; : Q.dX.X@X.X'. X.X!.: 0 q !  X'.|.|._.{..X`.> ; e b.^.[ : ; q {.[.[.b.* : y ~.b.0 > 0 {.[.T.[ q : y Y.[ = * y ~.T.(.S : r S !.(.e 0 : [ [.F.* : 0 F.^.~.S : e S T.b.e : y [.T.T.S r r S P.P.Y.P.P.U.Y.U.L.L.L.S.L.H.H.H.H.H.G.H.H.S.S.A.H.A.A.A.A.G.A.A.z.l.l.l.z.e.= ; ; T z.d.u q > y 0 t T a.T r = 0 u.g.T e > = G i.D e > y i.i.i.T T T T i.Z r ; C g.d.> : * Y e.e.T T T e.f.j.V : > A f.h.) 0 0 y l.A.0 : * T z.z.l.h.h.g.A.h.g.z.Z > : T j.y 0 > e = A.T t 0 A A.b.; e ; T b.z.Z.b.b.e.S.L.S * ; A L.Y.b.: 0 = Z.T.T.A.* > * b.T.T.Y > 0 ; P.F.y : ; [ T.U.[ = > y F.L.!.m r e ; ; Z !.u = y : * u !.~.F.> ; y n.T.(.Z > : J (.!.(.!.{.(.T./././.^./.^.(.(.^.^.^._._._._._._.|.{._.`.^.`._._.(.{.|._.^._._.|._.`._._.`.|._._.|._.|.|._.|._._.|.{.|.(.`.(.`.`.(.^.(.(.(.(.(.`.(.`.`.{._.|._.}.}.}.}._.`.`.`.|.}.}.}.|.}._._._. Xb.: r y * * > y * y Q.|.|.t r r [ .X^.|. XP 0 = P '.`.0 e r [  X`.J r r J ^.{.[ 0 ; > (.{.n.y ; : ; 0 r : y [ T.T.U.L.L.L.H.L.L.L.H.H.L.H.H.H.A.S.A.A.A.j.h.h.A.Z.A.h.h.A.A.A.g.h.l.h.g.a.g.k.f.f.f.a.g.i.z.a.a.a.k.a.a.a.a.a.a.a.a.a.a.i.a.a.a.u.i.a.a.i.i.a.u.u.a.a.a.i.a.a.a.a.i.i.a.i.i.a.i.a.i.a.a.a.a.a.i.k.a.i.a.a.z.k.k.i.i.a.a.a.f.a.i.a.k.f.i.k.k.f.f.k.f.f.a.k.f.",
+"B V N V N N V V M M M N B M M M M N M M B N B N N M M M V M M N V B N C B B C B V C N B C C B C B C C C B C C C C A Z C V Z Z C D B Z C Z Z Z D Z Z Z G Z D Z Z Z Z G Z Z Z H Z D Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z D Z G Z Z Z Z Z G Z D C Z Z Z Z Z D Z H Z Z Z Z Z C Z Z Z Z Z Z Z Z Z C Z C C Z C Z Z Z Z C C C A C Z C Z Z C B B C B Z D A u Z C m G C C m Z D u C Z Z C C Z Z Z B V C V Z m D T b.Z.z.A.A.z.A.A.A.H.G.S.S.L.U.L.P.U.P.U.U.P.Y.U.U.T.T.~.T.XXT.~.~./././.(./.(.!.(.(.(.(.`.(.(._.(.(.(.(.(.{.].(.(.^.(.(.(.(./.(.^.(.(./././.T.~.~././.(.~.~.~.~./.~.~.!.~.~.~.~.~.~.~.T.~.~.R.T.T.~.T.~.T.~.~.T.T.~.T.T.Y.T.T.(.T.T.T.T.T.P.P.P.Y.P.P.P.P.P.P.L.L.U.U.U.U.I.I.P.P.P.U.L.L.L.L.U.S.L.Z r ; T L.y : : : y /.T > : Z U.L.0 : q [ U.R.b.* e r Z.T.r : : T U.T.T 0 = q Y.Y.F.I.F.[ [ Z * ; = [ !.b.: > = b.T.T.F.= q y U n.n.F.F.n.b.!.!.= r * b./.^.(.`._.(.(.`.|.|.u ; > : * e > q > e r A zX XQ.: r = n.`..X`.Q.0 > y n.dX.X].y : y I ].`.[ * > r '.F.y : y [ @X'.!.b.b.F.].Q.= r y = [ y : r ` .X X|.|.'. X X.X|.|.'..X'..X.X.X@X'..X.X.XzX.X.XzX.X.X.X.X.X|..X.X X|..X.X.X.X.X.X.X.X.X.X.X X.X@X|. X'.(.@X.XQ.= r 0 y ].dX'.b.r r = A dX_ ; y u '.`.`.u : : `  Xb.y > t n.].`.: : e b.'.dXdX@XQ.b.Y y > r y dX'.Y 0 ; K xX'.@Xb.t > y n. X Xq > ; b.`.].0 ; t Q..X.X X@X.X.X|.n.e 0 * L '.|.|.|._.{.^.`.y e ; [ _.b.0 0 0 ].[.(.Y ; : S ].b.: : y F.T./.U = e u ~.[ q r q F.(.].u : 0 K (.(.r r e [ ~.F.* : y Z.~.~.D y > S ~.b.* y ; [ ~.n.; r r Z T.~.P.T.P.L.L.L.L.S.L.L.S.H.H.H.H.G.H.G.S.A.S.h.G.H.A.S.A.A.j.A.l.l.l.k.k.e.0 e 0 G z.z.T q * r 0 y T s.T e > ; G Z B 0 0 0 G u.T 0 0 q C T T y y 0 B a.A * e B g.f.Z ; 0 A T T D q q u l.T e ; ; ) T T y ; : 0 Z.D.* * r T e.z.D.Z.h.g.z.j.z.h.A 0 * T z.C e 0 0 Z l.Y > q u A.G.q y 0 C T [ A r q L F.L.S e e Z U.U.Z.> 0 y ` b.U.T.u : q q b.T = r r ; T.Y.q r y q [ b.q y : S Y.P.U.[ * ; y ; b.R.Y e r r q [ [.U.b.: r ; F.I.(.Z e ; Z !.~./.~./.~./.^././.^.^.^.(.(.(.^.`.^._._._.|._._.|._.`._._._.|._.|.[._.|.|._._._._._._.(.`.{._._.}.}._.|.^._.{._.^._.^.`.|.^.^.(.(.(.(.^.|.^.(.(.`.^._._.|._.}.}.|.}.|. X|.`.'.}.}.}.}.}._.(.|.[.'.n.C q = y r 0 K ]. X X{.* q q b.|.|.|._.~ r r S .XdXr = ; [ dX`.J = r S ^.|.[ q r : (.(./.b.A = ; y = y [ T.T.U.U.L.Y.K.L.A.S.H.H.H.H.H.S.H.S.S.A.A.A.A.h.A.h.j.h.h.A.A.h.j.G.h.h.h.g.j.f.f.f.f.a.g.a.d.g.k.k.a.a.k.a.k.i.a.a.a.a.i.a.i.i.i.u.a.i.u.a.u.i.t.s.a.a.a.i.a.i.a.a.i.i.i.i.i.i.a.a.i.a.a.a.a.a.a.k.a.a.k.i.k.d.i.k.i.z.k.s.k.i.a.k.a.a.k.k.k.d.f.f.k.f.f.f.f.f.",
+"B B N B N N N m N M M M B M m M M N M N V N m B m m N N N N N V B B B B B B C B C B B C B C B C C C C C C Z C C Z C C Z F Z Z C Z C Z Z Z D Z D Z Z Z G D Z G H D D G Z G Z Z Z H Z Z Z Z Z Z Z Z D D Z Z D G Z Z D G Z Z H Z Z B Z B Z Z D G Z D Z Z Z H Z Z H Z B C D Z Z Z Z Z Z B Z C C C Z Z Z C C Z C C Z Z Z C C C C Z C Z C Z Z C C A C C Z A Z A Z Z Z Z Z Z Z Z Z Z Z Z C Z Z C Z C C T u.H.z.z.z.z.D.A.A.A.H.G.U.S.U.Y.L.P.L.P.P.T.U.U.T.T.T.~.~.~.XX~.!.E.(././.(.(.(.(.(.(.(.(.{.].].(.(.(.(.(.(.(.(.(.(.^.(.(.(.(.(.^.(.^.(./././.~.(.~.~././.T.~.!.~.~.~.~.^.~.~.T.~.~.~.T.~.T.T.~.T.T.~.T.T.T.T.T.T.T.T.T.I.T.I.U.T.U.T.T.U.T.U.P.P.P.P.Y.P.P.P.U.L.U.L.U.U.U.U.U.P.P.L.L.L.L.L.L.L.S.A : e T U.S ; 0 0 P T.T y * L T.].A : e u b.b.y e * C T.U.e ; 0 [ U.U.T e : y L.T S : q J.T.F.0 y y [ T.b.; e q [ b.T.U.A : = S b.b.S = u Z E.(.: * * [ _._.|.^.`.`._._._.F.: r e y G P P L y : e > ].dXQ.0 : r b.n.@XdXn.t y 0 b.n.dXQ.0 r r [ m.[ y > e : '..XA : e y b.Q.P : * y Q.Q.= r r [ .XY = = 0 Q. X X_. XdX X_..X X.X.X.X.X.XdX.XdX.XzX.X.X.X.X.X.X.X.X.X.X|..X|..X.X|.'..X'..X.X.X.X.X.X.X.X.X|. X.X.X X X'..X) r r r 0 L u y : : y b.'.n.; > * ` Q.` ; ; y n.dXL = r u n.F.H r 0 0 b.].K u e b.'.cX[ * : u .XcXL : ; S n.].xX/ r 0 u n.m.P : 0 r b.dXn.y y : ].dX.X XdX.X.X.Xn.y : r P '.|.|.|. X|.^.(.q r ; [ {.Y.q = : S n.` e * 0 U ~.F.r t * A n.b.q = * Y ~.].= ; r Z n.I q 0 t i ~.(.0 e e b.T.b.0 y y D.!.Y.H r e S T.(.S * > * = q t r : F Y.T.T.P.P.L.L.L.L.L.L.U.S.K.G.H.H.S.S.G.G.S.A.A.A.G.A.A.h.A.A.h.A.h.l.h.l.e.= 0 r T a.i.z.G q 0 0 = e.a.e.r y - y > = * e r T i.u.B q : : r y = y q e.i.A r r C g.g.T e q 0 q ; y > r U z.e.0 e r ; 0 e q q ; 0 Z.A.* e = Y A.h.h.D.z.h.D.h.f.Z.Z ; 0 U z.T r ; > U Z.T > * C Z.H.b.q * > r : * > y T ].U.S 0 ; Z L.U.L.0 : : > y L.T.[ * : > > 0 u : * ; T.U.n.q > 0 0 y 0 0 y b.~.T.U.K.0 * e = Y.U.Z.> * r q n.Y.~.F.0 ; > n.T.!.K ; ; S `././.!.~.[./././.^.(.(.(.(.(.(.^.(._.|._._._.|._.|._.`.|._._.}.}.}.|.}.}.|._.|._.(.|._.(.`._._._.|._._.(.|._._._._._._._.|.[.^.^.(.(.(.(.^.|._.[.(.(.(.|._._.}.}.}.|.|.|.|.}.|.|.|.}.{._.|. X(.`.(.|.'.'.Q.n.n..X'.`. X|.|.'..X'.`.`._.|.|._._.'.@X{.(.|.`.`._.{.{.(._._._.(.^.`.(.`.(.^.~.~.{.!.].n.n.Z.~.P.U.U.T.T.L.U.U.L.U.L.L.H.L.H.H.H.H.G.H.H.A.A.A.h.A.h.A.A.g.A.g.A.g.g.h.h.k.g.g.g.z.g.g.a.a.a.g.i.k.a.a.a.x.a.a.a.a.a.a.a.z.u.u.i.i.i.u.i.i.i.i.i.u.x.t.a.u.u.i.a.i.i.a.i.s.i.i.i.i.a.i.a.a.a.a.a.a.k.a.k.k.a.k.a.i.z.f.f.f.i.k.i.i.z.z.d.i.i.z.z.a.a.k.k.k.k.f.f.",
+"B B B N V N V N N N N N B N B m M M N N V N B N N N N V B B m B B B B B B B B B B B C B C B C B C B C C A Z C Z B Z C Z Z Z Z Z Z Z D Z Z Z C D Z Z Z Z Z D Z Z Z D Z Z Z H Z H G Z Z Z L G Z Z Z D D D D Z Z D D D Z D Z Z H G Z Z G Z D D C Z Z D G Z H Z Z H Z Z G Z Z Z Z Z Z Z F C Z D C C C Z C C C Z C Z C C Z Z C C C C C C C C C N G G C Z Z C Z Z Z A Z Z Z C A C Z C Z C C C C C Z B Z T h.h.G.A.A.z.Z.H.S.H.H.H.H.L.L.L.L.P.P.P.L.T.U.T.T.~.T.T.~.~.~.~.~.(.(././.(.!.(.!.`.(.(.(.(._.(.(.(.(.(.(.(.(.(.(.^.(.(.(.(.(.(.(.(.~./././.(.~.~.(.~././.T.~.~.~.~.~.~.~./.[.~.~.T.~.T.~.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.T.U.T.U.T.U.U.T.T.P.T.P.T.P.P.P.U.U.U.T.U.U.U.T.U.U.P.P.L.L.L.L.S.P.L.S ; > [ I.` : t * [ U.[ : r S T.~.Q.y * > = y > : q F.H.T.; y : T L.H.[ e e * U.b.q r 0 u C u ; y = F.P.P.0 ; : : y L.XXn.e e : 0 0 0 y q [ ^.(.* r r b.^./.(.(.(._._.`.^.[ ; e 0 Y .X(..X`.L y : y [  X`.r r > r y ].dXhXr > y : : .X].y r ; q y q y y : : '.|.n.q : ; e 0 y : > ` .Xn.* ; r Q.`.].t ; y Z '.@X|.'.^.@X|..X|.|..X.X.X.X.X.X X.X'..XxX.XzX'.zX.X.X.X.X.X.X X.X|..X X.X.X.X.X.X.X.X.X|..X.X X X|..X.X.X.X.X].u 0 r r t : : e = ` .X'. X` q y * * y : : ` dXdX_ > : : y ; > q e e [ dXF > > : S u r r : [ dXfX[ y ; y t [ .X_ y y 0 : : y y ; r b.dXQ.r ; ; Q.dX.X.X.X X.X'.Q.: r r S `._._.(.|.~.|.(.0 0 y [ [.{.[ ; ; t : : ; 0 C ].T.~.b.* : e : * > e u K.U.~.L e ; ; e = y > y S T.(.0 e % e.[.b.y r * n.(.!.S ; r S ^.T.F.u r = r A u 0 : F T.T.U.P.P.L.L.L.S.L.S.L.L.H.H.G.A.S.A.S.A.A.A.A.A.A.A.A.A.A.h.A.h.h.h.k.Z.T q 0 y T i.i.z.e.A > 0 > T a.i.G q 0 > C T A = m G u.z.T J y = > = q C T f.d.A y ; C j.z.g.T q = * r * y U h.g.H.T y > > q Z [ 0 e q e.A.= t q T G.G.A.A.l.h.A.h.A.d.D q t U z.e.y 0 q e.Z.T r q Z H.l.H.[ m : * : t y Y P.U.Y.H 0 = P L.T.U.[ q 0 : = b.K.E.Y y y e A _ q q 0 T.U.K.F.L 0 0 > q Z Z.~.L.I.T.I.C q y Z T.T.U.u y q H ].(./.b.0 q y b.{.!.H * q G ~./.(./.~./././.(.(.).(.^.`.^.`.`._._._.(.|._.|.|.|.|._._._.|.}.}.}. X}.}.}.|._.}._.`.`.|.`.(._._.`._.`.|.(._._._._._._._._.^.^.`.(._.(.`.|.(.(.(.|._._.{.(.|.}.{.}.|.|.|.|.}.|.|. X}.|.|._._.|._.|.(..X|.{.|.|.[.(.|.|.|.|.(.^.|.`.(.'.|._.|.|.'._._.|. X`.`.'._.|.(._.(.(.(.{./.{.~././.(./.T.[.Y.~.T.XXT.T.Y.U.T.I.Y.H.H.H.L.L.S.H.L.H.H.H.H.G.A.A.A.A.A.A.h.A.A.h.G.j.G.l.G.j.h.h.g.g.k.g.a.f.f.g.g.g.f.a.a.k.a.k.i.a.a.a.a.a.a.a.a.i.s.u.u.u.u.i.u.i.a.t.a.u.u.u.a.a.u.a.i.i.a.u.u.i.a.a.a.i.a.a.a.a.a.a.a.a.a.k.a.k.k.k.k.a.f.f.f.k.k.a.a.i.i.i.k.i.f.i.z.a.a.a.f.a.i.z.",
+"B B N B B N B N B B M M N M N N M m N V N m N B V N B N M M B m B B m B B B B B B C B C B C B C C V C A Z C Z C F Z B D Z F Z Z Z C Z Z D F Z C Z H Z G Z D D Z D Z Z Z D Z D D Z L Z Z Z Z Z H Z G Z Z Z G C D D Z D Z Z Z H Z G Z Z Z C Z D Z G Z D D Z Z Z G Z G F Z Z Z Z Z Z C Z D C C Z C C Z Z C C N C C C Z C C C Z Z C Z C C Z Z Z Z C Z C A Z Z Z Z Z Z G C G Z C Z Z A Z D B D Z D Z Z e.z.A.z.l.H.G.S.G.A.G.G.H.L.L.L.L.L.L.Y.T.L.U.U.T.T.T.~.~.~.~.~.~./././.(.(.(.(.(.(.(.(.].(.(./.(.!.(.(.(.(.^.`.(.^.`.(.`.(.`.^.(.(.(.(.(.(./.(.~.~./.^.~.~.~.~.~.~.~.!.~.~./.~.T./.T.T.T.T.T.T.T.T.T.T.T.U.Y.T.U.T.Y.T.T.I.I.U.U.U.T.U.U.T.P.Y.Y.P.Y.P.P.Y.P.T.Y.Y.I.Y.L.U.L.U.U.L.L.L.L.L.L.U.U.F.L = 0 T U.Z.y 0 q n.(.T : q Z T.T.T.n.Z y q q 0 Z n.T.I.T.q = q [ T.U.T = ; y L.T.b.y % r ; : y Z F.T.T.~.Y y q y = n.[.!.b.u > = r : y [ (.T./.q 0 > [ (.^.|.`.^.^._.(.|.Z ; * > b.dX.X X.Xb.: * y H dX Xb.r y y r !..X.X[ y 0 t y Q.'.b.y e > r ` Q.q * y n.|. Xn.A e > 0 y q [  X|.Q.* r 0 F.`.|.[ ; 0 0 b.`. X X.X|. X.X X.X.X|..X@XdXdXdX.X.X.X.X.X.X.X.X'..X|..X.X'.|.@X.X.X X.X.X.X.X|..X.X.X|..X|.|..X|..X.X X X@XdX].` y r * = e y b. XdX|..X X[ y * r q y b.dXdX'.].P 0 * y Z n.` ; y J  X X) q ; : : * u b.dXdXdX].u y : : J dXhXP y > : S n._ : y S dXQ.* : y ].|.dXvXdX.X.X.XF.y 0 0 P  X|. X(.`.(.`./.y 0 e b.~./.`.n.B * = * q Y !./.[.T.^.b.C = q r = U K.T.~.~.].F : > 0 I _ y * H ^./.q * = [ ~.F.* = y F.]./.A 0 q Z [.T.T.].[ [ b.~.L : r K Y.T.U.L.L.U.L.S.U.L.U.S.S.G.H.G.S.S.A.S.A.A.A.A.A.A.A.A.A.A.h.h.h.h.f.h.k.G.j.z.g.i.k.f.a.z.s.s.s.j.s.k.i.i.s.w.T u.a.i.z.i.i.u.i.i.z.t.u.T e.e.s.s.z.k.g.s.j.j.z.g.a.g.j.Z.T T j.g.h.z.z.h.h.z.e.e.l.H.h.h.G.Z.A.G.Z.G.F.Z.A.A.A.h.l.h.A.z.j.h.h.g.h.z.z.z.j.g.j.z.l.S.Z.Z.D.l.A.G.G.S.Z.Z.b.Z.F.P.L.L.U.L.I.Y.Y.Y.I.U.I.F.n.F.F.U.~.XXU.L.b.Z.K.I.T.Y.].U.U.J./.P.F.b.n.F.T.T.T.T.T.Y.~.L.!.!.].T.T.~.!.T.!.~.T.T.[.~.~.~.R./.~.T.~.(.!.~.`.~.~.(.(.^.(.(.(.(.(.(._.`.(.`.(._._.|.`.(.|.|._.|._.|.|.|._.}.|.}.}. X}.|._.}.}.}.|.`.|._.`.|._._._.^.`.`._._._._._._._._._.(.(.`.^.(.`.^._.{.(.(.(._.(._.|.}.}.|.}.}.|.|.|.|.}.|.}.|._._.|.|._.|.|.|.|.|._.|.}.|.{.|.|._._.|._._._.`.(.|.'.^.`.'.|._..X`.`._._.`.^.{._._.(._.^.(./.(./.!.(.T.|.[.[.T.P.T.P.~.T.U.T.L.H.L.L.S.S.H.S.G.G.H.H.H.H.H.h.A.A.A.A.h.A.h.A.A.j.h.A.l.h.h.h.g.g.g.g.g.k.g.a.g.g.k.d.a.a.i.z.a.a.a.a.a.a.a.a.a.i.a.u.r.a.u.u.i.i.u.u.u.u.u.i.a.u.i.u.u.i.u.i.i.s.i.s.i.i.a.a.a.a.a.a.a.a.k.a.k.i.k.k.k.f.f.z.k.k.f.k.z.i.i.z.f.z.k.i.a.f.a.k.i.z.a.a.",
+"B B B N B B N N B N B B N B N B M M N N V u B m N N N B B B N F B B G B B B B B B B C B C B C B C C C C C C C C Z C Z Z Z Z Z D D C Z Z Z Z Z H Z Z Z Z Z Z D G Z D D D Z Z G Z Z Z G Z L Z Z G D Z Z Z Z Z Z D G Z Z D Z Z Z Z Z Z G Z Z Z C D Z Z D Z Z Z Z Z Z Z Z G Z Z Z Z Z A C C Z B C Z C Z Z C C Z Z C C C Z C C C C C C C C C C B C Z C Z Z Z Z C Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z C C C A T g.Z.D.Z.A.A.G.S.G.H.L.L.H.H.L.L.L.L.L.U.U.U.T.U.T.T.T.~.T.~.~.~././././.(.!./.(.(.(.(.`.(.(.).!.(.(.(.^.`.(.^.`.`.`.(.`.(.(.`.(.(.(.(.(./././.[./.~.~.~.!.~.~.~.!.~.~.~.~.~.~.~.~./.~.T.T.T.T.Y.T.T.T.T.T.Y.T.U.U.U.U.U.U.T.U.T.T.U.U.T.L.P.P.~.P.P.P.Y.T.T.T.U.T.I.I.U.I.R.U.L.L.L.L.L.L.L.U.L.G.H.L.Y.P.U.L.P.U.U.T.Y.T.~.T.T.T.T.T.U.T.F.b.b.F.I.I.L.T.Y.Y.L.Y.S.L.T.U.U.P.T.G.T.L.U.F.Z.n.e.F.T.P.H.P.~.~.F.b.n.L.~.T.(.~.(.U.n.n.F./.~.(./.(._.).{.{.^./.(.^.`.^._._._.|.{.|._..X_..X.X.X.X'.dXdX X.XdX@X].Q.m.]..X.X.X@X].m.Q.]..XzXdX.XQ.Q.`.'.dX.X|. X@X|..X X'.].F.Q.n.|.|.|.{.[.|.`.`.|.{.|.'. X`.dX}.'.'.'.`..X'.|..X|..X.X.X'..X.X.X.X.X@X'..X.X.X.X.X.X.X.X.X X X X.X|..X.X.X.X.X.X.X.X.X.X.X.X.X.X|..X X X.X X X.XdXzXQ.Q.Q.].'.dXdX X X_.@X'.dXQ.Q.Q.'.|..X X.X@X'.!.Q.Q.dX'. X.XdX.X.XdX.X'.].Q.n._..X.X.XxX XdX@XQ.Q.Q.zX.X.XdX].F.]..X@X'..X'..X`. XdXdX X'..X.X.X.X.X.X.X|.dX'.'.|.{.|.|.).(.`._.(.^.(.(.].~.(.[.XX{.n.K.n.!.T.XX~.~.~.~.T.[.n.n.b.!.XXXXT.T.~.U.T.Q.Z.L.T.T.T.(.T.[.T.!.[.~.(.T.[.].~.T.T.T.T.!.(.L./.T.F.= u C b.~.].N r r H U.(.P.P.Y.L.U.L.L.L.H.S.L.H.H.S.S.S.S.A.S.A.H.A.A.A.A.h.A.A.A.z.D.l.l.l.k.h.h.i.l.z.i.k.k.k.a.k.k.z.s.i.i.a.i.i.d.u.i.i.E i.u.i.i.i.a.z.u.i.f.i.z.a.a.a.a.a.g.a.d.d.g.z.g.a.a.H.l.g.z.l.J.A.D.A.H.G.G.z.G.A.z.H.A.z.H.z.h.h.j.A.A.H.h.S.A.g.A.k.D.a.z.z.z.k.A.f.J.l.z.A.h.h.H.H.H.G.G.D.U.H.D.L.U.P.L.L.U.~.U.I.T.T./.T.K.~.T.L.~.T.T.U.T.Y.T.Y.Y.T.U.T.T.XXU.U.U.T.T.[.L.T.T.T.T.T.~.T.T.T.Y.T.T.L.T.~.T.T.~.~.T.[.T.R.~.~.{.XX~.[.(.(.~.[.[.(.(.(.(./.^.(.(._.(._._.^._.`.|._._.(.`.`.|._.|.|.|.|.|.'.|.}. X}.|.}.}. X[.}.}.}.[._.(.{.|.[._.(.`.`.^.^._.(._._.[.{.|._.^.`.(.`.(.`.(.`._.^.|.|.{.(.|._.(.|._.}.|.}.|.|.|.|.|. X}.|._._.{._._. X_.(._._. X X|._.|.|._.|._._._._.'.{.(.|.|.(.`. X X_.'.(.{.`.'.(.`.(.^.(.(.T./.[.(./.!././.(.T.~.U.T.^.T.~.I.T.Y.L.U.L.L.L.U.F.L.H.L.H.L.H.H.H.W.A.A.A.A.A.A.A.A.h.g.Z.A.l.l.h.h.g.g.g.g.g.k.a.a.g.a.a.g.i.a.k.a.a.a.a.a.a.a.u.a.a.a.a.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.a.u.u.i.u.u.i.t.s.a.a.i.a.a.a.a.a.k.a.k.k.k.k.k.a.f.f.f.f.f.k.f.a.z.i.i.z.i.i.k.i.a.a.z.a.a.a.a.z.",
+"N N B N B N V N N B B N B M N N N N V N V B N B B N N B B B C N B B B B C C B B B B B B C B B Z C C N C C Z Z Z C Z Z Z Z Z Z Z Z L Z H Z Z Z Z G Z Z L Z D Z Z Z H D Z G Z D D Z G Z Z D Z D Z C D Z D D D Z D H Z Z H D Z D Z H Z Z H H Z Z Z Z L Z Z Z Z D H G Z Z Z D Z C B D Z Z C C C C Z D C C C Z C C C C Z C C D C C C C C C Z D C Z Z Z C Z Z Z Z Z Z D Z Z Z Z Z D Z Z Z Z C C Z Z A C T Z.S.A.Z.G.A.S.S.A.H.D.H.S.L.D.L.L.L.L.L.L.U.T.T.T.T.T.T.[.T.!.~././.^./.(.(.(.(.(.(.(.^.(.(./.(.(.!.^.(.[.`.^.(.^.(.|.`.(.`.(.(.{.^.(.(.(.(.E.^.~.^./.~./.~.~.~.!./.~.~.~.~.T.~.T.T./.T.T.T.U.T.T.U.P.U.U.U.U.P.P.U.U.U.P.P.Y.L.U.Y.P.P.P.P.Y.Y.U.Y.U.Y.T.P.T.U.T.U.U.Y.I.I.U.L.L.I.L.I.L.L.L.U.L.L.L.L.L.U.L.U.Y.T.T.T.T.T.T.T.~.T.T.T.T.T.U.T.Y.U.T.L.U.U.U.U.U.U.U.L.U.L.T.U.U.L.T.U.U.U.P.T.U.T.U.U.T.T.~.T.(.~./.~.~./.(.[.(./././././.(.~.(./.(.(.|.[.(._./.|.{.^.`.|._.|.|._.|.|. X X.X.X.X.X.X.X.XdX.XdX.XdXdXdXdX'.dXdXdXdXdXdX.X.X@X.XdX'..X|..X.X|..X|.|.|._._.'.|.|.|._.|.}.}.|.|.|.[.|.}.}.}.|.|.|.|..X|..X.X.X.X X X@X'..X.XdX.XzX.XzX.XdX'..X.X.X.X.X|..X.X|..X.X.X.X.X|. X|..X.X|..X'..X.X.X.X.X.X.X.X'.'..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X X X|.|. X.X.X.X'..X|.@X|.|. X'.|.|. X.X'..X.XdXdXdX'.dX.XdXzXdXzXdXdXdXzXzXdX.X.XdXdX.X.X.X.XdXdX.X'..X.X.X.X.X@XdX'.dX.XdXdX.X X.X'.|.'.|..X|.|.|._.(.|.^.(._.{.(.(.(./.~.(.T./.~.R.~.~.T.R.(./.~.R./.I.T.~.~.~.~./.T./.!.~.T.[.T.T.{.T.~./.~.~.~.^./.~.~.~.~.(.T.~.T.~.~.~.~.F.q : * q u u r > 0 b.T.U.T.T.Y.U.L.A.L.L.L.S.H.H.G.S.S.S.S.Z.A.A.A.A.A.A.A.A.A.h.A.h.h.h.z.h.h.k.h.g.k.a.g.a.k.f.a.z.i.i.g.i.a.i.a.i.a.u.u.u.i.i.i.i.i.i.a.a.a.i.i.i.k.a.k.d.k.a.g.a.f.f.f.f.j.h.a.z.j.z.A.A.H.h.H.h.H.h.A.Z.A.A.Z.G.A.G.G.S.h.h.A.G.A.l.z.H.z.h.h.h.h.h.h.S.A.h.h.h.h.l.h.z.G.G.G.A.K.D.L.A.L.L.U.H.P.P.T.~.U.U.U.Y.T.Y.T.Y.(.T.~.~.T.T.[.T.Y.T.~.T.T.T.T.L.T.Y.T.T.T.T.T.P.T.T.T.T.~.T.T.T.T.I.T.T.T.Y.Y.T.T.~.T.T.~.~.~.T.~.~.~.(.~.~.(././././.(.^.^.(.(.^.(.^.^.(.(.|._.|.^.|.|.|._._.|.|.|.'. X'. X|. X|.|.|.|._.}.}.}.}._.|.|.|.}.{.|._._.^.(.`.^.|.|._._.|.(.`.(.|.|._._._.(._.^.(.(.`.`.`.`.(.`.`.(.(._._._._.|. X X X X{.{..X X^. X{._.|.(.`.`.{.'._.@X^.`._.|._. X|.`._.|._._._.{._.|.`.|. X[. X X|.(.{.|._.^.{.(.(././.(.!.~.[.~.T.~./.~.(.[.T.T.P.U.T.T.T.H.H.L.S.L.S.G.G.L.S.H.G.G.A.S.S.A.A.A.h.A.h.h.A.h.h.h.h.h.h.k.k.g.g.j.g.f.f.f.k.z.k.i.k.i.i.a.a.a.i.i.i.i.i.u.a.a.i.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.i.i.a.i.i.a.i.a.s.z.d.k.f.f.f.f.z.f.a.k.k.a.z.a.g.z.f.z.a.k.a.i.k.a.a.a.k.a.a.a.a.k.",
+"B B C V B B V C B B V B V N N V N N N N B B B N N B V B B B B C B B B B B B B B N C C B B C B B C B C Z C C C Z Z Z C Z Z Z F A Z Z Z Z G Z Z H C Z G Z D Z D D D D Z Z D D D D H Z Z G Z Z Z D L Z D D D D D Z Z Z H G D G D D Z Z G Z G Z Z Z Z Z Z H Z Z G Z C Z Z Z Z Z Z Z G C Z C Z Z Z C B Z Z C Z C D C C C C C C C Z C C Z Z C C B Z C C Z A C C Z Z C B Z Z C Z Z B Z C Z Z Z Z B C Z C Y e.g.j.A.S.G.G.S.H.H.H.H.H.U.U.L.P.L.L.U.U.L.U.T.T.T.^.T.T.~.~.~.~././.(.(.(.(.(.(.(.(.[.!.(.(.(.(.(.{.[.`.^.^.`.`.(.{.(.^.`.(._.(.|.|.(.(./.[.^.(./.~./././.~././.T.~.~.~.!.^.~.^.T.T.T.T.T.T.T.U.Y.P.U.U.U.T.L.U.L.U.U.P.P.P.U.U.L.P.U.U.U.T.T.Y.U.Y.Y.T.T.T.U.Y.P.I.I.U.T.K.U.L.I.L.L.L.U.L.L.L.L.L.U.Y.L.U.P.T.U.P.T.T.T.T.T.T.T.T.U.T.T.T.U.U.T.U.U.U.L.I.I.L.U.K.U.L.U.L.U.Y.Y.T.S.U.U.P.P.P.T.~.T.T.T.T.T.T.~.~./.~.~.~.(.E./././././.~./.`./.(.~.^.(.(.(.|.(.{.{.^.{.(.|.|.`.|. X|. XdX.XdX.X|.dX@XdX.XdXdXdXdXdXdXxXdX'.dX X.XdX.XzX'.dX.X.X.X.X.X|.'.|.|.|.|.`.|.|.|.|.|.|.}.|.}.}._._.|.}.}. X}.}.|.|.|.|..X X|. X X.X X.XdX.X.X XzX.X.X.XdX.X@X.X.X.X.X.X.X.X.X.X.X.X X|. X.X.X.X.X|..X.X.X.X.X.X.X.XdX.X.X.X.XdX.X.X.X.X.XxX.X.X.X.X.XzX.X|.|..X X|. XdX.X.X.X.X.X.X.X|.|.'. X X X.X X X XdX'.dX X@XdXdX'.dX.XzX.X@X'.'.zX.X.XzXzX.X.X.XdX.XzX.X'. X.X.X.X.XdXdX XdX@X'..XdX X.X.X.X|._.|.|._.|.'.|.^.|./.(.(./.^.(.(./.(.~.[.(./.~./.R.T.[.~.I.I.R.~.T.^.T.T.!.~.~.T././.T.I.~.T.(.~.T.T.(.R.~.~.U.(.Y.T.~.~.T.T.T.~./.~.T.T.~.~.U y > 0 y : > 0 U U.T.U.L.T.I.L.L.P.L.L.S.S.D.H.G.G.S.S.S.S.h.A.A.A.A.A.h.A.A.A.A.h.A.A.f.k.k.k.k.g.f.g.a.g.i.g.a.i.g.a.a.a.a.a.i.i.t.u.i.u.i.i.u.i.i.i.i.i.a.a.k.d.a.k.d.k.d.g.a.f.f.f.a.f.k.z.z.z.k.h.A.z.z.S.z.A.A.S.S.z.A.G.A.z.G.A.h.S.S.H.G.A.D.G.z.A.A.H.h.g.g.A.h.Z.z.l.A.A.h.D.D.z.Z.A.A.G.A.U.D.P.D.L.L.P.U.D.T.U.Y.T.T.P.T.~.Y.T.Y.T.T.T.~.T.L.T.T.T.U.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.!.Y.T.T.T.T.T.T.Y.Y.T./.T.~.~.T.~.~.~.~.~.~.~./.(./././.(./.(.(.(.(.`.(.(.`.^.`._._._.|.(._._._._.|.{.|.|.|. X|.|..X|.|.|. X_.|.|.}.|.|.|._.|.^.}._._.|.|.|._.|._._.^.^.^.(.`.^.|.(.(.^._._._._._.`.`.`.^.|.(.(.(.`.^.|._._._.'.[.n.c.[ [ b.b.'.|..X`._. X^.^.`.|./._.|.].F.`._.(.|.[.(.(.`.^.|._.|._.{._.b.[ b.{.{.~.!.!.[.(.|.^.^.(.(.(.b.Z [ ~.~.(.F.) A L b.T.[.T [ [ T [ T T n.L.A.U Z A U Z.L.S.H.H.G.S.S.A.A.g.A.j.A.A.h.h.h.A.h.h.h.h.k.g.g.g.a.a.g.g.i.i.k.f.i.i.f.a.a.i.a.i.i.i.i.a.i.u.a.u.u.u.u.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.i.i.a.a.i.i.a.a.u.i.i.i.z.f.f.d.i.a.a.k.k.g.g.a.a.i.i.k.a.k.a.a.a.a.k.a.a.a.k.i.z.",
+"B V N N N N N N B B B N V N N N N N N V B N V C B C N N B N B V B Z B N C B B B C N C N C N B A C C C C Z C Z C C Z C Z Z Z Z Z Z Z Z Z Z Z Z L Z H Z Z Z Z H Z D D D D D D D D Z D Z Z D Z Z D D D D D D D D Z Z Z Z Z D D D D Z Z Z G Z Z Z L Z G Z Z Z H Z Z Z Z Z Z Z Z Z Z C Z C D C Z C Z C C Z C D C C C Z C C F C C C C C C B C C Z C Z F C Z Z C Z Z Z Z Z D Z B Z C Z Z C B D A Z Z C F G e.A.A.G.A.A.A.S.H.H.H.H.U.S.L.L.P.L.Y.U.Y.T.U.U.T.T.T.T.~.T.~.~.!././././.^.(.(.(.(.(./.{.^.(.!.(.(.(.].(.(.(.`.^.`.|._.(._._.{._.^.^.(.(.(.(./.!././././././.(././.~.~.~.~.~.T.T.[.~.T.T.T.U.P.U.P.P.P.U.L.P.L.U.U.U.L.P.P.U.L.U.U.Y.P.U.U.U.T.U.T.T.T.P.T.T.T.U.T.U.T.T.U.L.U.L.L.L.U.L.L.U.U.L.L.L.L.L.U.U.U.Y.U.P.T.T.T.T.T.T.[.T.T.T.T.U.T.U.L.U.U.L.U.L.Y.U.U.T.U.U.U.U.U.T.U.~.T.T.U.U.L.T.U.T.T.T.Y.T.P.~.T.~.[.~.~.^.^.!.(././.~./.(.~.!.(.^._.(._.(.`./.(.|.(.`.(. X{.|.|.|.|.|.@X X@X.XdX.X.X'.@XdX.X.XdXnX.X.XxX'.vXdXdXdXzX.X.X.XdX'.dX.X.X.X X.X.X|..X|.|.|.|.|.|.|.|.}.}.}.}.|. X}.}.}.}.}.}.|.|.|..X|. X|.|..X.X.X.X.X.X@XdX'..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X'. X.X|..X.X.X.X.X.X'..X.X.X.X X.X.X.X.X.X.X.XzX.X.X.X.X@X.X.X'..X.X.X.X.X|..X X|. X X X.X.X|..X X X.X.X.X(..X X.X@X.X.X X'..X.X XdXdXdX.X'.@X.XdXcX.XdXdX.XzX.X.XdX.XdX.X.X@X.X'.%XdX.X'..X.X'.dXdXdX.X.X.X|.(..X.X_.|.|._.(.{.^.|.).(.`.`.(.].(././.(.~.!.~.~.(.R.~.~.R./.~.E.T.~.~.~.~.~.T.~./.T.U.[.{.T.~.T.~.T.T.~.T.T.~././.Y.^.~.~.[.T.~.T.T.T.~.T.~.T.~.b.` Y C H _ b.K.~.I.T.Y.T.L.L.U.L.L.L.L.A.L.H.D.S.S.A.S.Z.A.A.A.A.h.h.A.g.G.A.g.A.h.h.h.h.h.z.f.k.f.k.a.k.f.f.a.a.a.a.a.a.s.a.i.a.u.i.u.i.u.u.u.i.u.i.i.i.i.a.a.z.i.i.k.a.k.i.g.s.k.f.f.k.z.g.k.g.S.A.A.z.z.A.G.z.G.Z.L.H.D.z.A.D.A.A.G.A.A.D.A.l.A.h.h.A.h.h.h.D.A.h.h.z.h.h.A.h.G.g.l.A.G.h.S.H.A.P.P.F.P.L.L.L.L.T.Y.P.Y.T.T.(.T.~.!.].~./.T.~.L.[.Y.T.T./.U.T.T.T.T.T.T.T.T.T.T.U.T.T.T.T.I.Y.T.U.T.T.T.T.T.T.Y.T.~.T.T.T.Y.T.~.~.~.~.~.~.~.~./.~.~.~./.(./.(.(.^.(.(._.(.`.|.`.^.|._._.|._.|.|. X_.|.`.|.'.'.|. X.X|.|. X{.|.|.}. X|.}._.|.}.{.}.}.^._._._._.^.{.|.(.|.|.(.|.|.(.|./.|._.(._._._.(.`.(.`.|.^.`._._._.|._._._._.{.D q r 0 = r K ].|.`.|.|.|.(.(._.|.(.) y [  X|.`.|.|._.{.}._./..X^.|.|._.P = L  X!.H q n. X(.(.`.(.(.].b.u > Z ~.~.n.= ; u q * b.Y.L q * r 0 * y b.n.q > u u = A F.H.S.H.A.A.A.A.A.h.h.h.h.h.h.l.h.l.h.h.h.k.i.g.i.g.g.f.g.a.a.i.d.i.i.a.a.a.a.a.i.a.u.i.u.a.i.i.i.u.u.u.u.u.t.u.u.u.u.u.u.E u.u.u.t.u.u.u.u.u.u.i.i.a.a.i.a.a.a.a.a.z.d.a.a.a.i.i.i.k.a.k.a.k.i.g.k.i.z.z.k.a.a.a.a.k.a.a.a.i.a.k.i.a.",
+"B B C V C C C N B B B B V N C N N N N B B B V B B N C V N C N C B B B Z B B B C N C N C B D Z B C C C C C C A C Z Z Z Z Z Z Z Z Z G Z Z Z G Z Z Z Z Z Z H Z Z H D D D Z D D D D Z D D G D D H D D D D D D Z Z D Z H Z Z G Z D D Z Z Z L Z Z Z Z Z Z G Z D Z Z H Z G D Z Z Z C B Z C Z B A C C C Z C C C B Z Z C C C C C C C F D C C C D Z C C C C Z Z C Z Z F B Z C Z C F Z Z D Z Z Z A Z C Z C Z C T W.h.A.S.A.S.S.Z.H.H.H.S.L.S.L.L.U.L.U.L.P.U.T.T.T.T.T.T.T.~.T.T.^./././././.[.(.(./.(././.^.^.`.[.(.(.[.{.(.(.(.(.^._._._.|.(._.^.^.(.(.|.(.(././././.{./.(.R.!./.~.~.!.~.~.~.T.T.T.T.T.T.P.T.Y.U.U.Y.L.Y.U.L.L.L.U.L.L.P.Y.L.L.L.L.U.P.U.U.T.T.U.T.T.T.T.U.I.U.I.I.T.U.U.U.U.I.L.L.L.U.U.L.U.U.U.L.P.Y.U.T.T.U.Y.T.T.T.T.T.T.T.T.T.T.T.T.U.U.L.T.L.Y.L.L.L.L.L.U.L.L.U.L.Y.U.T.U.H.T.L.T.!.P.T.U.T.T.T.~.~.~.T.~.~.~.~.(.!.^.(.!.(./.(.~.~.{.^.~.~.|.(.|.(.`.`.(.(.(.(.'. X|..X|..X.X.XdX'..X.XdX X XfX'.dX.XdX.X XdXdX.XdXdX'. X'.dX.X.X'..X.X.X.X.X.X.X|..X'.|.'. X|.|.|.|.|.|.|.}.}.}._.|. X}.|.}.}. X|. X|.|.|.'..X|. X'..X.XdXdX.X.X.X#X.X.XdX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X'.@XdX.X.X@X.X XxX.X.XzXzXzX.XdX.X.XzX.X.X.X.X.X.X@X_. X X X X X@X|..X X X.X|.|.@X|.|.|..X X X.X.X.XdX.XdX XdXdXdXfXdX.X.X.X XfXdX.X.XzX@X.X@X.X.XdX].dXzX.X.X@X'..X'..XfX X.X.X.X@X X X X|..X|._.|.{.^._.{.(.^.(.(.).(.(.!.~.(.^./././.T.(./.~.(.~.T.(.~.~.T.[.T.T.~./.T.~.Y.^.!.T.T.(.T.~.T.U.(.T./.R./.!.T.~.~.T.Y.~.T.~.~.T.U.XXT.T.~.T.^.Y.T.Y.T.I.I.T.I.I.L.U.A.L.L.D.L.P.S.H.H.G.S.G.A.S.A.A.A.A.A.A.A.A.A.A.A.h.A.h.g.k.k.g.k.f.k.k.z.i.i.a.i.a.a.a.a.i.a.a.a.u.a.u.i.u.a.u.i.i.u.i.i.i.i.a.a.a.a.i.i.k.d.g.a.f.f.f.f.z.s.f.T Y U G T Y Z.G.g.A.G.h.z.l.D.S.A.S.G.H.G.G.G.A.A.A.Z.e.G.D.h.H.A.A.z.h.A.z.D.h.A.A.A.g.Z.G.S.H.H.S.H.T B i U b.L.U.L.[ J S T L.U.T.T.Y.F.Z Z T.~.Y.Y.[ Z Z [ F.~.T.T.~.T.T.T.Y.T.T.U.T.U.T.P.I.T.Y.T.T.T.T.T.Y.I.!.T.Y.Y.~.T.~.~.T.~.~.~.~.~.~.~./././.(.).]./.(./.(._.(.(.(.|.^.|.^._._._._.|.{._._.|.|.|._.|.|..X X|.'. X|._.|.|._.}.}.|.}._.|.}.}.}.}._.|.|.{._.^.`.`._.^./.|.(.(.`.^.{.|.(._._.(.(._.(.|.^.(.(.(.^.{.(.^._._._.{. XS ; : [ ) ; ; Y (.'._.b.[ [ Y./.^.F.y : _ F.{.n.n.!.[ F.`.~.b.[ b.T.|.(.Q.n.Q.!.[ : ; [ ].].(.[.~.].A q = e S /.[.I 0 P !.F.0 0 !.[ T [ ` u > Z F.T : y G.F.y : e.S.G.S.H.A.S.A.z.S.h.h.h.h.h.z.h.z.z.z.k.k.x.a.j.a.a.a.a.a.a.z.i.a.i.a.a.a.i.a.u.u.a.u.u.u.a.i.i.u.t.t.p.t.p.t.u.t.u.t.u.u.u.t.t.u.u.u.t.u.u.u.u.i.a.i.a.a.a.i.a.a.a.k.a.a.a.k.d.i.a.a.a.g.a.a.d.a.k.i.a.i.k.k.a.a.a.a.a.k.i.a.a.a.a.",
+"C N C C C V N C B B N N M N V N V M M M C N N N N B V C C N C V Z N Z B C B B B C N C N C C C C C C Z C C Z C Z V Z Z Z Z Z Z A Z Z Z H D Z D D H Z D D D D L Z Z D D D D D D D Z Z Z H D Z D D D D D A D D D D Z L Z Z D D D Z H G Z H Z Z Z Z Z Z Z Z Z G Z Z Z Z D C Z D G B C Z Z C Z Z C Z C Z C D C Z D B C C C Z C C C C C Z C C D C C Z C Z Z Z A Z D Z Z Z B Z D Z D Z Z B F C Z A Z A Z Z T Z.S.A.A.A.S.S.S.H.H.H.J.L.L.L.L.Y.U.U.L.P.U.U.T.T.Y.T.T.~.~.~.~.~.~.^.(./.(./.(.^.~.[.(.[.(.[.(.[.{.(.^.(.(.(./.|.|._.|.^._._._.`._.^.(.(.(.(.(././././././././.~.~.~.~.~.~.T.T.T.T.T.T.T.P.T.L.U.P.U.L.U.U.L.L.L.L.L.U.P.L.L.L.U.P.P.P.P.P.T.P.T.P.T.P.Y.U.I.I.I.T.U.T.T.Y.P.L.K.L.K.L.L.Y.U.K.L.L.U.P.P.U.T.T.P.T.T.T.T.T.T.T.T.T.T.P.T.Y.U.P.P.Y.L.L.U.L.U.K.I.R.L.U.U.[ T T [ T T T [ Z.Y.T.T.Y.Y.T.T.Z.[ T ~.T.T.~.~.!./.~./.[.(.(.{.(./.{.(._.^.{.[.^.{.^._.^..X^.J H Q.{..X'.[ S Z [ hXdXdXdXm._ L ] '.cX].b.b.[ b.b.[ n.dXzX.X.X.X.X.XdX.X'.'.|..X.X.X.X.X.X.X|.|..X|.|.|.|._._.|.|.}.|.}.}.}.}.}._.|.|.|. X X|.'..X.X.X.X.X.XdX.X.XdX X.X.X.X.X.X.XdX.X.X.X.X.X@X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XzX.X.XzXdX.XdX.X.X.XzX.X.X.X.X.X.X.X.X.X.X.X.X|.].b.[ [ b.[ b.].'.].[ n.!.`..X`.|.|.|.|..X.X X.XdXdX'..X'.].b.b.].dXdXdXdXdX@XdXdXdXdX@XdX.X.X.X'.n.b.[ '.@X.X.X.X@X'.|..X.X.X.X.X XdX.X|. X_.'.|.|.`.(.{.F.[ b.{.~.^./.(.^.(./.[.{.~./.T.T.{./.(.T.~.!.b.F Z ~ b.T.T.T.b.G F I F.~.T.T.P.~.b.G D F.L.[ [ T T [ ` b.~.T.~.U.XXU.T.T.[.T.Y.[.T.T.~.P.T.~.U.L.L.S.L.G.L.L.L.H.L.H.H.H.S.G.S.S.A.A.A.A.A.A.A.A.A.A.A.h.A.h.l.k.k.k.f.g.k.k.i.k.k.i.a.a.a.i.a.i.a.a.i.i.u.u.u.i.u.i.i.u.u.i.i.i.u.i.a.a.a.a.k.a.k.d.f.i.g.a.a.g.f.j.g.t = 0 q r r q Z.H.Z.g.H.z.G.Z.D.D.G.H.l.G.z.A.z.Z.G q T l.A.A.G.l.h.z.h.H.z.h.D.D.A.z.z.D.A.A.G.S.L.Z = y u 0 = F.R.S q u u = L ~.U.!.F.A ; r T.~.T.A = A u q U ~.T.T.T.T.T.T.T.T.T.T.T.U.Y.T.U.U.T.T.T.T.T.U.T.Y.Y.~.Y.I.T.T.U.T.~.R.T.~.~.~.E.^.~././.!./.(.(.(.(.(.(._._.(./.{.|.(._.|.(.`.|._.|.|.|.|._.'..X|.|.|.'. X'.|.|._.}.}.|.}.|. X|.}.}.}._.|.[._._.`.{.`.}.}.}.}._._.{._.|./.|.{.|.|.^.(.(.(.(.(.^.`.^.`.`.|.{.|._._._.{.`.H ; r '.'.u * A  X~.u : t 0 q b.'.* ; e 0 H F.: ; Z > [ Q.u = = * t Q.{.P * ) n.= : > q T |._.[.^.n.q Z A 0 F ~.^.H 0 b.XXP.0 ; F.T.Y.U.b.* q A.U.S.h.Z.h.e.: y Z.h.z.A.z.S.h.S.h.h.h.g.g.g.k.k.h.h.k.k.k.k.k.f.f.k.a.a.a.i.i.i.i.i.i.i.i.i.i.u.i.i.u.u.u.u.u.u.t.i.t.u.t.t.t.u.t.u.u.u.t.r.i.r.u.u.t.t.u.t.u.u.u.i.u.i.a.a.i.a.a.a.a.i.a.a.a.a.a.a.a.i.i.a.a.a.a.a.a.a.k.k.a.a.a.a.a.a.k.d.k.a.d.a.a.",
+"N C B V C N C N C B C C A N B V B Z B V V N C N C V N C N C N C N C N N B C B B N B C C C C C C Z A C C D B B A F Z C Z Z Z Z Z G Z Z L Z Z D D Z H D D Z D Z D Z D Z D D D Z D H Z Z Z D Z Z D D D D D D D D D G Z Z G Z Z D D Z Z Z Z Z Z Z U L Z Z H D Z Z Z G Z Z Z Z Z Z Z F Z Z D Z C Z C Z Z Z B C C C Z B Z C C B Z B D C C Z C F C F C C C A C Z C Z C Z Z F Z Z Z B Z Z D B Z D C C Z C C U j.j.A.A.A.S.S.S.S.A.H.S.P.L.U.L.L.L.U.L.Y.T.U.U.T.~.T.~.T.~.T.~.~.~.~././.(././././.(.(.(.^.`.(.(.(.(.(.(.(.^.(.^.|._._.|.^._.{.`.(.^.`.^.(./.(.(.(.(./././.(././.~.!.Y.~.T.T.T.~.T.T.T.U.T.T.U.U.P.U.P.P.P.P.P.L.H.L.P.L.U.P.L.P.L.P.P.L.P.P.P.T.T.Y.P.P.U.U.Y.I.U.Y.I.U.P.P.P.P.L.Y.U.L.U.L.T.L.Y.U.T.U.U.T.P.U.P.T.T.T.~.T.T.T.T.T.Y.P.P.T.P.L.U.L.L.L.L.L.H.U.I.U.U.U.S : : * e t r > T Y.U.U.R.~.U.T.[ = = !.[.~.(./././.~.~.(.{./.~.^././.(.!.{.).{.|._.|.`.`.].P : * Q.|.|.S ; u S > A '.dXb.q y A = y ].Q.q r * : y r ) dXzX.X.X X'..X.X.XdX.X.X.X.X.X'.|..X X.X X X|. X'.|.|.|._.|.}.|.}. X}.}.|._.|.|.|.|.|..X.X.X.X X@XdX X.XxX.X@XdX.X.XzXzX.X.X.X.X.X.X.X'..X.XzX@XdX.XdX.X.X.X.X.X.XdX.X X@X.X.X@X'..XdXdXdX'.zXzX'.zXzXzXzX.X.XdXdX.X.X.X.Xn.y y t 0 * : u ].Q.y = m..X.X'.'.{.@X X|.|..X.XdXdX X XxXQ.; * Q. XdXdX X@X'. X'..X.X.X.X.X.XdXdXJ : = dX.XdX'.'. X.X X|.@X XdX'..X.XdX@X(. X_. X].`. X`.[ q : {.~.(./.|.~./.{.(./.~.(.{.~.~.T.^.(.^.` = q A : = b.!.` 0 y A 0 0 ].T.~.U.b.y = : n.n.y : y y 0 = U Y.P.XXU.T.T.~.T.P.T.~.[.T.T.T.T.T.P.U.T.L.T.L.L.L.S.L.L.H.H.H.H.S.G.S.S.S.A.A.A.A.A.A.A.A.A.A.A.h.A.h.l.h.k.k.f.g.i.f.f.a.d.a.a.a.a.a.a.a.a.i.i.a.u.a.u.i.u.u.i.u.u.i.i.i.i.a.i.a.a.a.a.a.k.a.g.a.g.g.a.f.j.Z.> * u L y r r e.z.Z.Z.T T [ A.z.A.Z.T Y T b.H.Z.b.= y Z b.A.H.e.T T b.h.D.A.e.T F.T T Z.A.D.H.A.H.b.q q n.L.u t T b.y * F.].0 = n.(.H ; q r r ~./.n.y * ].].> 0 n.~.T.T.~.T.T.T.T.T.U.U.Y.U.P.U.T.U.U.T.T.T.T.T.T.~.T.T.T.~.T.~.~.T.~.~.~.R.(././.^.^./.^./././.(.).`.(.(.(._./.|.(.`.^.`.|._._.|.|.|.|. X|..X'.|. X.X|. X|.|.|. X|.}.}.}.}.}.}.}.}._.|.(._.(.^.|._.|.}.|.}.}.|._.|.^._.(./.(.^.^.(.(.(.(.(.(.(.(.(.(.(.^.(.(.`.(.{._.`.I ; * _.`.P : > (.b.q y ].[ q q (.b.r ; S b.n.; y A b.'.S : P .XI ; D ^.Z y Z !.P q e I K.[.!.~.{.L.n.].S e K T.~.[ y u [ I r y [ U.U.L.N q b.XXS.L.XXZ.Y w * U h.S.D.A.h.h.A.l.h.h.h.g.g.g.k.k.k.k.k.k.f.f.i.a.f.a.a.a.i.i.i.i.i.i.u.u.i.i.a.i.u.u.u.u.u.u.u.t.i.u.t.t.p.u.t.t.u.t.r.u.t.i.E t.t.u.E t.u.u.u.u.u.u.i.i.i.i.i.a.a.u.a.i.a.a.i.i.i.a.i.i.i.a.a.a.a.k.a.k.a.a.i.a.a.a.a.a.k.i.a.a.a.a.a.",
+"N C B C N C V C N C B B N C V C C V V C N C A B C N B V C V C N C N N C C Z B Z N C C C C C C Z C C C Z A C Z Z C D Z C Z Z Z Z Z Z H Z G Z D D D H Z D H Z L Z Z Z D D D D D D Z Z D D D D D D D D D D Z D Z L L Z Z L H Z Z L G Z Z H Z Z Z Z Z Z G Z Z D D Z Z L Z Z Z Z Z F Z Z Z B Z C Z Z Z C C D Z C Z C C C D F C C C C V C C C C Z C C Z A Z Z C Z Z Z Z C Z D C Z Z C C Z A Z Z C C C Z Z T e.A.A.A.A.A.S.S.H.K.H.L.H.S.L.L.L.L.U.P.U.U.T.T.T.T.T.T.T.Y.T.T.T.Y.~.~.~.~.(././.^./.~.(.(.(.(._.~.^.!.^.(._.(.`.^.`.(.|.`.`.|.(.|.`.{._.(.(.(.^.(.(./.(./.(.(././.~.~.R.[.T.T.Y.T.T.U.T.Y.Y.U.L.P.U.U.L.L.U.P.P.P.L.P.P.L.U.P.P.P.L.P.P.P.U.P.P.L.U.L.U.T.I.I.R.T.U.Y.T.Y.P.Y.P.U.U.L.R.U.U.T.L.U.T.U.T.T.U.T.T.T.T.T.T.Y.~.Y.T.T.T.P.Y.U.U.L.P.L.U.L.U.L.U.L.U.U.U.U.U.b.T ` 0 e u Y T Z.F.b.[ T F.~.Y.[ 0 r (.F.n.b.].n.F.K.(.T.n.F.!.~.].b.` n.{.^.^.(.(.(.|.b.y r 0 * Q. X].* r '.dXJ q b.dXu : n.fX[ [ Q.].b.[ m._ ; r b.dX.X.X.X.X@X.X.X.X.X.X.X.X.X'..X.X.X X|. X|..X.X|. X|.|.|.}.}.}. X}.}.}.}. X_.|.'.|.|..X|.'..XdX.X.XdXdX@X.X.XdX.X.X.X.X.XdX.X.X.X.X.X.XdX'..X'..XdX.XdX.X.X@X.XdX.X'..X.X.XzX.X.XcX'.dXdX.X.XzXdX.XdX'..X.X#X'..X.X X.X Xm.y y K [ _ : : b..XQ.Q.^..X|.!.[ b.Q. X@X.X.X.X.X@X'.b.b.m.* e Q.dXdXQ.[ b.n.dXdXdX'.zX.XdX.X.X'.P r = dX'.].n.[ [ Q.|.'.].Q.].].b.b.].`. X.Xb.b.b.F.{._.].n.F.[.Y.F.Q.n.[ T.E.Q.[ T n.~.^./.(././.!.M q ` {.` : G ~.* : b.!.A > T ^.Y.F.q > * * b.G.T [ [ U : q [ !.T.T.[.T.T.P.T.T.T.U.U.T.T.T.T.Y.U.U.L.S.T.L.L.L.H.H.L.L.G.S.H.l.S.S.S.A.A.A.h.A.A.h.A.A.A.A.h.A.l.l.l.g.k.g.k.f.f.i.k.i.i.a.i.a.i.i.a.i.i.i.i.i.i.u.u.u.i.i.u.i.u.u.u.i.u.i.i.i.a.k.a.a.i.d.g.f.g.a.g.i.z.x.> = u Y A * Z z.D.Y q q q 0 C S.F.C > u q > T Z.q * r q Z l.G > 0 0 y I S.b.* = Z q y q F.D.S.A.H.L.Z.e.D.Z.y e [ T y A L.J.J > b.].y A J q 0 ~.~.[ * A ~.T.S * b.~.T.T.(.U.T.T.P.P.T.P.P.L.T.P.P.L.Y.T.T.T.T.~.T.~.T.T.U.~.T.T.~.~.~.R.~././././././.(./.(.(.(.(./.(._._._._.|.`.^.(.|.|.|.`.|.|.|.|..X'. X X|. X X'. X|. X_.|.|.}.}.}. X}.}.}.}._.}.|._._._._.`.`._.}.}.}.}._.{.|._.^.|.^.|.(.(.(.`.(._.(.^.(.(.^.(.(.(.(.(.|.(._.|.`.S r ; _. XH : y '.Z > y S H > y n.].y ; [ !.F.= r F.`.(.q ; [ (.Y r > ^.S : L {.Q.0 * n.[./.{.~.~././.~.Z e S !.T.!.Z 0 q Z * y Z.Y.L.[ > B U.P.U.D.A.I * * T S.S.A.A.h.h.A.h.l.l.z.g.g.g.f.h.f.g.h.k.k.f.k.i.a.f.a.a.a.i.i.i.i.u.i.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.t.r.t.t.t.t.u.t.p.t.E i.u.t.t.u.u.t.u.t.u.u.a.u.u.a.u.i.a.a.u.a.u.i.i.i.i.i.i.i.i.a.i.i.i.a.i.a.a.a.a.z.d.a.a.a.a.a.a.a.a.k.i.a.a.",
+"C N C N C N C N C B B B B N C N V M C N C V M N C C N C N C N C N A C C N B N N C C C C Z B Z C Z C D C C Z C Z C Z Z Z Z D F A Z Z Z H Z G Z D Z Z S H Z H Z H Z Z D D Z D D D G D Z H Z H D D D D D D Z L Z Z Z Z G Z Z H Z Z Z Z Z Z G H Z Z H Z H G D Z D G Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z C D B Z C Z C C Z D C C C Z C C C F V C C C C B D Z B C Z C Z D B Z C Z B Z Z Z A Z C Z C Z C Z A Z Z G T A.g.A.A.Z.A.S.S.G.H.H.L.L.L.L.L.L.P.P.U.Y.T.T.Y.Y.T.T.~.T.T.~.E.R.~.~.~.(.~./././.(.(.{.(.[.(.!.`.[.^.`.(.(.(.(.^.`.{./.|._.^.`.|.(.(._.`.^.`.(.(./.{.(./.^./././.~./.R.T.T.T.[.U.T.T.Y.T.L.U.U.P.U.L.L.L.L.L.L.L.P.P.P.L.L.L.L.L.L.P.U.Y.P.P.P.U.Y.L.L.U.Y.L.T.I.U.U.I.P.P.P.L.L.Y.L.U.L.U.L.T.U.U.T.T.T.T.T.T.T.T.T.[.T.T.Y.T.T.P.P.P.U.U.U.U.P.L.L.L.L.L.U.K.U.U.U.U.G.T.].y e H T.L.F.C = > 0 q [ ^.T r 0 [ q * A Y.L t S (.F.= > Q.b.0 0 0 ; S !.`.(.|.{.|.Z y _ ; : Q..XQ.r : dX%X[ e I ].> r F.P ) Q.zX.XdX.XdXC y [ dX X@X.X.X.XdX.X.X.X.X.X.X.X.X.X.X.X.X.X|..X'..X|..X X.X|.|. X}.}.}. X}. X|.|.|.|.|. X X.X.X.X'. XdXdX.X.X.XdXdX.XdX.X.XzXzX'.zX@X'.zX'.dX.XzX.X.XzX.X.X@X.X.X'.dX'..XdX'.zX'..XzX.XzX.X.XdXzXzX'.zX.X.X.X.X.X.X.X.X.X.X.X.XQ.y e U Q.[ : = [ n.0 0 Q.dX[ * y : t _ '..X X.X.X].A 0 ; > e : ]..X` ; y > : [ dX.XdX'..X.X.X.X XP : * fX].y y y ; * b.'.[ q y y > 0 I zX].S y > ; : b. X` q : (.[ = Z y > n.b.: : y * H ].^.~./.~.(.!.n.T.F.Z e U n.r = /.U.[ ; P Y.P.D y ) 0 r n.P.T.~.].B 0 ` T.Y.P.U.E.T.U.T.T.T.T.T.T.T.T.U.T.L.U.L.L.U.U.L.L.L.L.H.L.S.H.H.H.G.H.S.S.S.A.A.A.A.A.A.A.A.A.A.A.z.A.l.l.g.g.f.f.f.k.k.i.i.z.a.i.a.i.i.i.a.i.i.i.i.u.u.a.i.u.u.u.i.u.i.u.u.u.u.i.i.i.a.a.a.k.i.i.i.j.g.g.a.g.s.> 0 0 q > ; U h.z.q 0 T b.y 0 T T q 0 Y T [ Z.A.U y * A [ i.t e e.e.r r e.e.0 q H ) r 0 e.D.H.H.S.L.H.U.n.q r Z Y.T * S Y.XXS y T ~.e.!.` > r T.|.T q L ~.[.u q [ T.T.T.T.~.T.T.T.P.P.U.L.T.U.T.P.P.P.U.T.T.T.Y.T.Y.T.~.~.U.T.T.T.~.~.~.~./././././././.(./.(.(.(.(.(.(._._.(.(.`.|.`.`.(._.`.|.|.|.|.|.|.|..X.X|..X|. X|.|.|._. X}.}.}.}.}.}._.}._._._._.|._._._.`.{.}.}.|._.|.|.|.^.`.(.(.(.(.(.[.^.^.|.[.(.(.(.{.(.{.(._.(.^.|.^.(. XZ : : {.Q.* e A '.S 0 u b.[ [ [ I.(.0 r [ ^.F.y r n._.`.= r [ (.b.; 0 ].A : S (.n.: q n././.[./.^.(.~.(.Z * H Y.~.!.^.b.b.F.0 ; U.U.T.Z : T T.S.L.D.Y r y e.l.D.S.j.A.h.A.A.h.l.l.h.k.h.g.h.f.f.k.k.k.f.f.k.z.a.a.a.a.a.i.i.u.i.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.t.t.r.u.t.t.t.t.t.t.t.u.t.t.u.t.t.u.u.t.t.u.u.u.u.u.u.u.u.t.u.a.u.a.i.i.i.i.i.u.i.i.i.i.i.i.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.",
+"B B B C N C C B C V C B C B C B V B C N C C N V B C N B C N C B B C B C C N C C C C C C C C Z C Z C A Z Z C Z Z Z Z Z Z C Z Z F D Z D Z D D D D Z H H Z H H H Z L H Z Z Z Z Z Z J H Z Z D D D D H Z Z Z J Z S H Z Z H Z Z D Z Z Z Z Z Z L Z G Z D Z Z D Z D Z Z Z Z Z G F Z Z Z Z Z Z Z V C Z D Z Z C B D A C C C Z C Z C C C C C C Z C Z C C C C C C Z C Z C C Z B D Z Z Z C Z Z Z B Z C Z A C C Z C T h.h.G.h.A.G.A.G.H.H.L.G.L.L.L.L.P.U.U.Y.Y.T.T.T.T.U.T.T.T.T.T.~.~.~.T.T.~.~.~.(.(./.(.(.(.(.(.(.(././.(.(.(.(.(.(.(.(.|._._.|._._._._._.|._._.^.`.(.(.(.(.(././././.~.~.T.T.T.~.T.T.U.P.U.L.U.L.U.L.L.L.P.P.D.P.P.P.P.P.L.P.P.P.L.L.P.P.L.L.Y.U.U.L.U.L.U.U.Y.L.P.P.Y.Y.P.Y.Y.U.U.U.L.P.P.P.P.P.P.P.T.P.T.T.T.T.T.T.T.T.T.T.T.T.T.U.Y.U.L.Y.U.Y.L.U.L.L.U.K.L.U.U.L.U.T.U.U.U.> e S T.U.[ : r L.[ * y K.[ t ; y e A !.~.F.= e ].b.= u /.q e [ !.y e b./.^.(.`./.n.^.Q.* 0 Q. X|.y y [ n.t ; H ].; ; y S r q Q.dX.XzXn.> I dXdX'..X.XdX X.X.X.X.X.X.XdX.X.X.X.X.X.X.X.X.X'..X.X.X X`._.|.}.}.|.|.|. X|.|._.|. X_.'. X.X X.X.X@XdX.XdXdXdXxX@XzXzX.X.X'..XdXdX.X.XzX'.zXdX.X.X.XzX.X.X.X.X.X.XdX.XdXdXdX@XzX.X.X.XzX.XzXzXzXdX.XzX'.zX'.dX@X.X.X.X.X.X'..XQ.: > e 0 : e y _.Q.0 : Q.Q.; e Q.Q.> : Q.'.dXdXdXb.> : Q.b.e e Q.Q.0 q Q.Q.y : ]..X'.dX X|..X|.@XS : y dXn.[ J ].` * : '.b.r r b.I r : dX[ > u ].b.= y {.[ : 0 `.` r r Y n..X: y [ ^.y : [ (./././.(./.R.K.Z > y Z.n.: 0 U.Y.[ > G P.i q T n.= y b.T.T.U.[ : Z T.T.T.T.T.U.T.T.U.U.T.T.P.P.T.T.U.P.Y.P.U.L.L.L.L.H.L.H.H.H.L.G.H.H.G.G.H.S.A.A.W.A.A.A.Z.A.A.A.A.A.h.D.z.k.h.z.k.k.f.a.f.a.z.f.g.k.i.i.i.i.u.i.i.i.i.u.i.u.u.u.u.u.i.u.i.u.t.i.i.u.i.i.a.a.d.z.k.g.i.a.k.k.g.k.j.0 e u T C > q U b.= q e.Z.Z : Z Z.q * q r y e.A.S.= y T Z.T ; * H.z.r e T n.* 0 b.e.; = b.Z.H.U.H.L.U.` 0 ; G Y.U.T > Z U.T.S = [ [.XX~.b.= ; T.(.[ q S ~.T.S q T T.~.U.~.T.T.T.T.T.P.P.P.P.P.U.Y.U.U.T.T.U.T.~.T.T.T.T.T.T.~.T.~.T.~.~.~.(./././././././.{.^.(.(.(.(.(.(._._.|.|.[.}.}.}.}.|.|.|. X|.|.|.|. X X|. X X|. X X|.|._.}._._.}.}.}.|._._. X_._._._.}.{.}.}.}.}.|.|._._.^.`.(.(.(.|.(.|.[.(.(.[.(.(.(.`.(.{.{.(.(.^.(.(.(.^.'.S ; e : y ; y n.'.b.= = m.[ Z b.~.(.q : ) Q.F.; = F.{.{.` 0 t m.t = Y ].H > J !.n.0 t [ Q.(.[.{.~.~.T.^.S = H (.R.b.; q b.) y L L.U.L.y : b.D.U.J.[ r r : e e q T h.A.S.h.g.l.h.h.h.g.j.j.j.z.a.z.z.f.k.a.a.a.a.a.a.i.i.u.u.u.i.u.u.u.u.u.u.u.u.u.u.t.u.u.u.t.t.t.t.t.r.r.t.t.t.r.r.t.t.r.t.t.t.t.t.r.E u.u.t.u.u.u.u.u.u.f.u.u.a.u.a.i.i.u.i.u.i.u.i.u.i.u.u.u.i.i.i.a.a.a.a.a.a.a.a.a.a.a.a.a.i.i.i.",
+"C B C C C N B B B B B C B C B C N C N C C N N C B B C C C C B C C B B B N C C N C N C C C Z C Z B Z C Z Z D B C Z Z F B Z D Z Z Z Z Z D D D D D H Z H L Z Z H L D H Z Z H Z H Z Z Z H Z D A D A Z H H Z Z Z Z L Z L H Z H D D Z Z L Z Z Z Z L Z Z Z G Z Z G Z Z Z Z D Z D Z Z Z Z Z Z Z F D D C Z Z Z F Z C C A C C Z C C Z C D C C C C C C C Z Z Z Z C Z C C D Z C C Z Z C Z C C A F C Z C Z Z C Z C T A.h.A.A.A.A.G.A.A.H.G.I.L.L.L.P.L.L.U.U.P.T.T.T.U.T.Y.T.T.T.T.T.T.~.~.~.~.~.~.~././.(./.(.(.!././.(./.).(.(.(.(.(.`./.{.^.|._.{.^.|._._.^.^.|.|.`.(.(.(.(.(.)./././.~.~.~.T.T.T.T.T.T.U.P.Y.T.L.U.L.L.U.P.P.P.P.L.P.P.D.P.L.L.L.L.L.P.L.L.U.L.U.L.L.L.U.L.U.U.U.Y.P.U.P.P.P.P.P.L.Y.L.Y.P.P.P.Y.T.Y.P.T.T.U.T.T.T.T.T.T.T.U.T.U.U.T.U.U.U.U.L.U.L.Y.L.U.L.I.U.L.L.I.U.T.T.U.L.r 0 Z I.U.Z ; H U.Z.0 * n.T 0 r 0 y A ~.~.E.u 0 b.L q [ Z.= > F.`.F 0 S `.|.(.|. X^.|.n.y 0 Q._.|.n.y = t S ; K Q.> * ].'.` * ) .XdX Xu 0 n.xX X'..X.X'. X.X.X.X.X.XdX.X.X.X.X'.@X.X.X.X.X.X.X.X.X@X|.'.|.}. X|.|.}.|.|.|.|.|.|. X|.'..X.X.X.X.X.X.X.XdXdX'.zX'..XzX'.dX@XdX'.zXzX.XzX@XdXdXdX.X.XxX'.zX'.zXdX.X.X.X.X.XzXzXzXzXzXzXzXdXzXzXdXzX.XzX.XdXdX'..X.X'..X.X.X XF.0 * u y : u Q._.n.y r ].[ = r @X'.y = [ dXdXdXdXb.y y .XQ.e r m.b.y > P ! : y [ dX.X'.zX XdXQ.'.I : 0 '.dXb.` u 0 y : '.b.> : .Xb.t * `.J ; y S S e r n.b.r : ^.b.0 0 ]._.F.= * n.[.L * K /.[./.~./.(.Q.y * A F.T.Z.: : !.(.T : D [ r y [ Y t : U S.U.U.u q b.T.T.T.T.T.T.U.U.L.T.L.U.U.U.U.U.L.U.U.L.I.L.L.L.H.L.L.L.L.H.L.G.H.G.H.A.H.H.A.A.A.A.A.A.h.h.h.A.z.S.A.h.g.g.k.h.k.z.f.k.a.a.s.a.i.a.a.i.s.i.s.i.i.u.u.i.i.u.i.u.i.u.u.u.t.i.u.i.u.i.i.i.a.a.a.a.a.i.f.g.g.a.k.k.j.> * Z z.e.q ; G T y = e.J.A 0 Z Z.Z.T G y y y S.L.r : I H.T > r H.A.y : T e.: 0 b.Z.; > d.L.U.H.L.U.[ y 0 _ Y.].P.Z.: u ^.~.u r b.T.XXT.[ 0 0 (.T.b.: u ~.^.u 0 b./.~.T.U.U.T.T.U.P.P.P.P.T.Y.T.Y.U.T.T.U.T.T.T.T.T.T.T.T.U.~.T.T.~.T.~.~././././././.^.^.(.(.(._.(.(.|._.(._.[._.|.}.}.|.}.}.|.|.|.|.|.|.|..X|. X'.|..X|.'.|._. X_. X X}._.}.}.|._._._._._._.}.}.}.}.}. X}.|.|.|.|.{.(.(.(.^.(.(.!.(.^.`.(.(.(.(.{.(./.(.{.(.).(.|.(.(.G q 0 y : A b.].|._._ 0 = q u F._.`._ y t q n.; y n.(.{.Q.H q q q H ]._.G q Z (.!.D 0 0 G ~.~.T./.~.[.Y.Z y Z K./.[.U q > = D F.T.L.Z.= y F.U.D.G.G q q 0 0 : N [ A.h.l.h.h.g.h.k.h.g.k.f.k.k.g.a.g.a.a.a.k.a.a.a.a.i.i.i.u.u.u.u.u.t.t.u.t.u.u.u.u.u.u.t.t.t.t.t.t.E t.r.r.r.r.r.r.r.y.t.r.t.t.t.r.r.t.u.t.t.t.u.t.u.u.u.u.u.u.u.i.u.i.i.u.u.i.u.u.u.i.u.u.i.u.u.i.a.a.a.a.a.i.a.a.a.a.a.i.a.a.a.i.a.",
+"N N C N C B C C B C V C C B C V C N C N N C C C B C C B B B C B C N C B C C C C C C C C C C Z C D A D C C Z Z Z C Z C Z Z Z Z F Z D Z D D D D D Z J L Z L H L G H H S H Z H Z Z Z Z Z Z D Z D D Z H D Z Z L Z L Z H D D Z Z D Z Z Z Z Z Z L Z Z Z G C D D Z Z L Z G Z Z Z Z Z Z Z Z Z Z Z D D Z Z B Z C Z Z C D C Z D C Z C C B A C C C C C C C C C C Z D C C C C Z C Z Z A Z Z C Z Z Z Z B Z C Z C Z G Z.h.H.A.A.H.S.G.H.H.H.H.S.L.L.P.L.U.L.U.Y.P.U.T.T.P.P.T.P.T.T.T.T.~.~.T.~.~.~.(././.^.[.(.(./.(.(./././.(.(.(.(.(.(.(.(.{._._._.|.^._._.`.(._.{.(.(.`.(.(.(.(.^.(.~./.(.~.T.T.T.T.U.T.U.P.U.L.Y.U.L.L.L.P.P.U.L.L.L.L.L.P.P.L.L.S.P.P.P.K.L.L.L.L.U.U.U.U.L.U.Y.P.P.Y.P.P.P.P.P.Y.U.L.L.L.L.P.P.P.P.Y.P.T.T.T.T.T.T.T.T.T.T.U.T.T.U.U.T.U.U.L.Y.U.U.L.U.Y.I.L.J.L.U.U.U.T.U.L.y 0 S L.T.Z e S ].b.r r Z.[ e > u > y b.!.~.[ = / = * Q.n.; y n.(.K ; Z '.`.|._.{.`.|.Q.= * F. XdX XQ.n._.P y [ .X: * '.dXc.r I zX Xm.q r .X.X.X.X.X.X'.dX'.dX.X.XdX.X.X.X.X.X.XdX.X.XdX.X.X|..X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|..X|. X|..X.X.XdX.X.X.XdXdX.X.X'.dXdXzX'.'.'.'.zX.XzX'.cX.XzX'.zXzXzXzX.X.XzX.X.X.XdXdX.XdX.XzXzX.X'.@XzXzXzXzXzXxX'.'.'..X'.dX'..X.X.X.X.X XQ.q r b.].y * u (.Q.* y Q.b.; ; .XdX= e [ dX'.@XdXb.: : dXQ.r : Q.b.r r b.b.[ b.Q.`.@X_.dXJ r ; ].S ; y dX[ * y n.[ r 0 '.b.= e dX[ * y .XH > u b.b.[ b.].b.= r /.b.: r _.(.F.* r n.(.H : L !.~.^./.(.F.q = I ].^.Y.~.0 : F.U.U y _ T > ; y = r : r F.Z.n.q y ~.T.T.T.U.T.T.U.U.L.U.P.P.P.P.P.U.U.Y.U.L.L.L.K.U.L.L.H.L.L.H.H.H.H.H.H.H.A.H.H.G.A.G.A.G.A.A.W.j.A.g.g.A.h.h.h.k.k.k.f.i.z.a.k.a.f.a.a.i.s.u.i.u.u.i.i.u.i.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.i.a.a.a.f.z.k.d.f.g.k.k.d.* e t e q : : T Z.B ; H T q 0 T e.U Z b.G 0 y S.Z.q : Z b.Z.q r Y T : = Z.b.y r e.e.: = e.K.T.G.XXF.y 0 : 0 0 y [ n.u r [ T * q Q.E.T./.v.e r !.(.F.t > T [ = q ].T.T.T.T.T.T.U.U.P.P.Y.P.P.P.T.L.U.U.U.U.T.T.~.T.T.T.T.T.T.T.~.T.~.~.T.~.~.~.~././././.(.(.^.(.^.`.^.^.^._._._.|.}.}. X}. X|.|.|. X|.`.|.|.|.'.|.|.|.|.|.|._.}._._._._._. X}.}.}._. X{._. X_.}.}.}.}.}.|.|.|.`.|.|.|.|.(.(.^.(.^.(.(.(.(.[.(.(././.(./.(.(.(.(.(.^.{.{.].].(.(.^.'..X X{.`.`.].F.n.(.{.(.~./.F.n.F.^.}.(.^.^.(.{./.].F.Q.~._.!.!.^.^.~./.~.n.n.F.{.~.T./.Y.Y.(.U.!.]./.U.R.~.F.n.F.K.P.T.P.L.P.F.L.L.H.H.S.S.A.Z.S.S.g.z.z.h.k.g.h.g.k.k.h.k.g.j.g.k.g.a.a.a.z.a.z.a.a.a.a.i.i.u.u.u.u.t.t.u.t.t.E u.t.t.t.t.t.t.t.t.t.r.t.y.r.r.r.r.t.r.r.r.r.r.r.t.r.r.r.r.t.t.t.t.t.t.t.u.u.t.u.u.u.u.a.a.u.u.u.u.u.u.u.u.p.i.i.p.i.u.u.i.u.a.u.a.i.i.a.i.a.a.i.i.a.a.a.i.",
+"C C V B B B C C C C C V B C B C A N C C C C N C C B C N C C C B C Z C B N C C N C Z C C C Z C C Z Z B Z Z Z C Z Z Z Z Z Z Z Z Z D Z D D D D Z D Z H Z L H Z S L Z Z H H H H S J Z Z H H D D Z D S D Z H Z D J Z Z L D D Z D Z D Z L G Z Z Z Z Z D D D G D Z Z Z Z Z Z B G Z B G Z Z Z Z Z C Z Z Z Z F Z C Z Z B C B B Z C C C C Z C C Z C C C C C C C C C C C D A Z Z Z B F C Z Z Z C Z D A A D C Z C Z e.h.h.A.A.A.S.G.H.H.H.H.L.L.L.S.L.L.L.L.L.L.U.Y.U.P.P.T.T.T.P.T.T.T.T.~.~.~.~.~.~././.(.(.(.(./././././.(./.(.(.(.(./.|._._._._._.`.`.`.`.`._._.|.(.(.(.^.(.^.^././.~.~.~.~.~.T.T.T.U.U.U.U.U.L.L.U.K.Y.U.U.D.U.L.L.L.L.P.L.L.L.U.L.P.L.R.L.L.L.R.K.L.L.U.L.L.U.P.P.P.P.Y.P.Y.P.U.L.Y.L.Y.L.L.L.P.P.T.T.T.T.T.T.T.T.T.T.T.U.T.U.T.U.U.T.Y.U.U.U.L.Y.L.K.D.U.U.K.K.I.T.U.T.T.!.; 0 H (.T.[ q = b.P > y Y.T : * Y.T 0 y `.~.].A : t U ~.{.Z > Y b.y ; b.'.(.(.{._._._.Q.; r m.dXdXu ; [ n.y : m.zXZ y ` F.u > [ dX.Xn.0 ~ .X.X.XdX.X@XdX X.X.X.X.XdX.X.X.XdX.X.X.XzX.X.X.X.X.X.X.X.X.X|.|.|.|.|.|.|.|.|.|.|.'.|. X.X.X.X.X.X.X.XzX.X XdX.X.XdX'.dX.XzXxX.XzX.XzX.X.XcX.X.X.XzXzX.X.XzXzX'.zXzXdXdX.X.X'.dX.XzXzXzXdXzXzXxXzXzXzXdX'.xX@XxXdX.X.X.X.X.X.X.Xn.r > [ '.b.q > [ Q.> : Q.].; * b.[ y ; ].dX@X.XdX].r > b.) : : n.'.: y c.[ J [ '.|.'.dX'.[ * y S e e K dXJ * u m.Z 0 0 dX[ y 0  Xb.t = .Xb.q ; n.[ ) [ '.[ y r (.[ > y _.(. Xu > ) b.0 * b.^.).T./.].u > y e 0 e S !.D : ) b.* = b.n.T [ T I r e U S.T.Y : Z U.T.T.T.U.P.Y.L.U.Y.Y.L.P.P.P.P.L.L.L.L.L.L.I.S.Y.S.H.L.H.H.H.H.H.H.H.H.A.H.A.Z.G.A.A.A.A.A.A.j.A.S.z.A.G.h.h.k.k.k.k.k.k.a.a.a.a.a.a.i.i.i.i.i.i.u.u.i.u.i.u.u.u.u.u.i.u.i.u.u.u.u.i.i.d.i.i.d.a.i.i.i.k.f.a.k.d.A.q y 0 q 0 u F g.F.e.A > = q Y Z.Z.A : y y e e.G.L.G q = N H.T t : > y [ U.b.= = Z.b.0 r Z.K.Z.U.J.T q > y = : y T T.[ y r : q [ (.T.T.T.[ q 0 !.~.).b.y q = u [ (.T.T.T.~.U.U.U.T.P.T.T.P.T.P.P.P.U.U.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.~.~.~././.~.!./.(./.(.(.(.(.(.(.(.(.(.(._.|.}.}.}.|.|.|.|.|.|. X@X|.|.|.|.}.|.|.|.|._. X_._._._. X_.}._._._._._._. X_.}.}.|.}.}.'.|.|._._._.(.`.^.`.(.^.(.(.(.!.(.(._.(.{.(.(.).(.(.(.(.(.(.(.^.|..X{._.`._.~.{.|.^.^./.(.[.(.(.^./././.!.(.~.[.[.|.^.{.~.{.!.~.~.(.~.E.[././././.^.T.{.~.T.[./.T.!.!.T.T./.~.U.Y.T.~.T.K.L.U.L.S.P.U.T.U.S.S.H.D.S.h.A.l.A.D.A.Z.z.h.h.h.g.g.k.h.k.h.k.k.a.g.f.f.g.a.a.a.u.a.a.a.a.a.i.u.i.u.u.t.u.t.u.t.t.t.t.t.t.t.t.t.t.t.t.y.t.t.r.r.w.r.r.y.r.r.r.r.t.r.r.r.r.r.t.r.r.t.t.u.t.u.t.u.t.t.r.u.r.u.u.u.u.u.u.u.u.u.u.u.t.u.u.u.u.u.u.u.i.u.i.i.u.i.u.u.i.i.i.i.a.i.",
+"C C C C B C C C C C C C C C C C C C C C C C C C A C C Z C A C C C C C C C C C C C C C C C C C Z Z Z Z C Z D Z Z Z Z Z Z Z Z F Z Z L Z D Z H Z Z H L Z J H H Z Z H Z D H D Z Z Z Z H D D D D D D H H Z H H Z Z J L Z Z D Z H Z Z L Z Z Z G L Z Z Z F D Z C Z D Z Z Z Z Z Z Z Z F Z D G B G Z Z Z Z Z Z Z C D C Z D C Z C C C C C B C C F C C C C C C Z C C C C C Z C Z C C Z A D C Z Z Z C Z C B C Z Z Z e.Z.A.A.A.A.H.A.H.H.S.H.L.L.L.L.L.S.L.U.K.U.U.L.P.P.P.P.Y.U.T.T.T.T.~.T.(.T.~.~.~.(.~.^././.(././.).!./.(.(./.(.^.(.(.(._._._._._._._._.(._._._.|.^.(.(.(.(./.(.[./.^.~.T.~.T.T.T.T.U.U.L.L.L.U.U.L.L.U.P.P.D.H.L.P.G.L.P.U.P.P.L.L.L.P.L.U.L.L.L.U.U.L.L.L.L.Y.P.U.L.T.U.U.T.L.L.U.L.L.P.Y.P.Y.P.P.P.T.T.T.T.T.T.T.T.T.U.U.T.U.Y.U.U.U.U.Y.U.I.U.U.L.L.L.L.L.Y.K.R.T.U.T.~.!.q 0 F Y.T.T.Y q q q u b.[.e.; e L.K.y t T ~.T.U 0 * n.{.[.n.u = > = ` '.(.|.`._.{.|.|.Q.q * Q.|.|.!.u * * u n.dX X'.S = q 0 / dXdX@XP r [  X X.XdX.X.X.X.X.X'.@X.X.X@XdX.X.X.XzX.X@XdX.X.X.X.X.X'. X.X.X X|.|.|.|.|.|.|.}.|.|..X.X|..X.X.X.X.XdX.X.X.XzX.X'.zX@XxX.XzX.XzXzX@XdX@XdXdXdXdXzX.XzXzXdXzXzXzXzXzX.XzXdX'.dXdX.XzXdXdXdXdXxXdXzXzXzXzX.XdX.XdX.XdX.X.X.X.X.X.XQ.y = b.'.'.y = u n.y 0 n.dXb.u : : y n.dXdX XdX.XhX[ = r _ y 0 Q.hXb.> t = * n.dX.X|.|.zXdXS 0 y = S ]. Xn.y : = ) y y ].[ > : |.b.* q |.'._ r r y y Q.'.[ * q `.[ q q (.|._.Q.u 0 y q U (.`.^././.n.q r ; = : * Z Y.F.u * = e Y Y.U.T.P.P.b.q : b.U.P.L > [ U.U.T.T.U.U.U.U.U.P.U.L.P.P.L.L.L.L.L.L.L.S.U.L.S.U.S.D.U.H.H.H.H.S.S.H.h.S.S.A.A.A.G.h.W.A.G.A.h.A.h.S.g.g.z.k.k.k.k.k.a.a.a.k.z.a.a.a.i.i.i.i.u.i.t.u.i.u.u.u.u.u.u.u.u.u.u.u.u.i.u.i.i.i.i.a.a.a.a.i.i.i.f.k.i.h.e.z.j.z.z.h.j.g.d.g.A.e.e.b.z.A.H.A.e.b.Z.S.Z.D.A.F.b.b.e.G.G.Z.b.e.G.z.G.P.H.H.G.G.L.L.S.U.L.L.U.P.U.Y.Y.~.Y.~.T.T.T.Y.F.n.U.[.T.P.[.~.^./.!.(.~./.T.].n.b.Y.^.!.T.T.T.T.T.P.P.T.P.P.P.T.P.T.U.U.U.T.P.T.T.P.U.T.T.T.T.T.T.T.T.T.T.~.T.T.XXT././.~./.!.^.(.(.(.(.(.(.(.(.`.`.}.}.}.}.|.}.|.}._. X|. X`.'.|.|.|.|.}. X|.|.|._.}.}.}._._.|._._.}._.'._._.}._.}.|.|._.}.|.|.`.|.`.`.|._.(.`.^.|.(.{.^.^.(./.(.(./.{.[.(.(.^.(.(.[.(.(.).(.[.^.)._.^.^._.^.(.(.`.`.`..X!.`.(.(.!.~.(.(.`./.(.(./.(./.~.(.{.(././.{.~.~.~.^.T.~.(.~.T.[./.~.T.~.~.L.T.T.(.~.T.U.U.U.U.U.L.U.L.L.U.U.G.H.L.G.G.H.z.A.h.h.l.h.g.h.h.h.g.g.g.k.k.g.k.k.f.a.g.f.g.a.i.a.a.a.a.a.i.i.i.a.i.u.u.t.u.t.t.t.t.t.r.r.t.r.t.r.r.t.r.y.r.r.y.r.r.y.r.r.y.r.r.r.r.r.y.y.w.y.r.y.r.r.t.t.t.t.r.t.t.t.t.t.u.u.u.u.u.t.u.u.i.t.u.u.t.u.u.p.t.t.s.u.u.u.u.i.i.i.u.u.i.u.a.i.a.i.i.",
+"C N A C C C C C C C C C A C C C C C C C A C C C C C C C C C C C C C C C C A C C C C Z Z C Z Z Z C Z Z Z F B C Z C D B Z B F D D Z D D D H Z Z H H H H Z H Z Z H H L D L H H Z H Z L D D D D D D Z D H Z Z H Z L Z H H Z H Z L Z Z Z G H Z Z Z G Z Z Z Z D Z Z Z Z Z Z Z Z Z Z Z Z F Z D C Z Z Z Z Z C Z Z Z Z F Z C Z C D C C Z C C C C C Z B F C C C C C F C Z A D Z C Z C Z C Z C Z C Z A Z Z C C Z Z T Z.A.A.A.G.A.G.H.A.H.L.L.L.H.S.S.U.P.L.L.L.L.U.P.P.P.P.U.I.U.U.T.T.T.T.T.~.~.~.~.~.T.^././.!././.!././././.(.(.(.`.(.(._.`.^.`._._._._._._.|._.|.).^.(.(.(.(.(././.~.~.[.T.T.[.T.T.T.U.U.U.U.L.U.K.L.I.P.P.P.P.G.P.P.P.P.U.S.P.U.P.P.P.L.U.U.L.L.L.L.L.L.L.L.K.P.Y.P.P.L.R.L.L.L.L.L.U.P.P.P.L.P.P.P.T.T.T.T.T.Y.T.P.Y.T.U.T.U.U.I.T.I.U.L.T.L.L.U.L.U.L.L.L.L.U.L.U.T.I.L.U.].(.Y.~.T.T.T.P.b.n.~.T.P.Y.!.].~.T.(.~.~.T./.[ 0 y ~.[.).(.^.Q.F.].(.(.^.`.(.{.|.'.|..X X@X.X|.|..X X].Q. X|. X_.dX'.].m.!.dX'..X|.dXdX@X X@X'..X.X'..X.X.X.X.X.X.X.X.XdX.X.X.X.X.X.XdX.X.X.X.X X|..X|..X.X.X|.'.|.|.|.|.|.|..X|..X.X.X.X.X.X.X.X.X.XzX.XzX'.'..XxXzX.X.XdXdXxXdXdXdXzXdXzXdXzXzXzXzXzXzXzX.XzX.XdXdXdXdXzX.X.XdXdXdXxXdXzXzXzXzXzXdXdXdX.X'..XdX.X.X.X.X X`.dX'. X.X'.dX X|.'.'.@X.X|..XQ.n..X.X X.XdXdX'.@XdX].].dXdX.X@X.X.X.XQ.Q..X`. X X@X|.|.@XdX].Q.Q.dX X XdX!.n.|. X'.{.{.@X|.|.`.|.'.'.|.|._.].n.Q.'.'.[.|.'._._.|.'.`.`.(._._./.!.n.^._.(./.^./.^.T.E.~.].T.T.~.~.P.T.U.Z.b.F.U.U.L.U.P.P.P.P.L.L.XXD.L.U.L.U.U.U.U.U.U.U.U.L.U.L.L.L.L.L.L.L.L.L.L.U.U.S.H.L.H.H.H.H.H.H.H.G.H.S.H.H.A.H.S.A.G.A.A.A.A.A.A.A.h.A.g.k.h.g.g.k.f.f.k.a.f.z.a.a.a.a.i.i.a.t.a.u.a.u.a.u.u.u.u.u.u.a.u.u.u.u.u.i.u.u.i.u.i.i.i.a.z.a.a.z.i.z.k.h.f.g.z.z.A.A.h.l.z.D.D.g.A.A.S.H.D.D.z.H.A.A.Z.G.S.A.H.H.G.G.G.H.l.L.U.G.L.D.P.H.H.L.U.L.L.U.U.U.L.U.U.L.P.T.T.T.T.T.T.[.T.T.~.T.T.~.^.[.~.~.~./.[.^.T.(.T.~.(.(.T.P.T.T.T.T.T.P.T.P.Y.P.T.P.P.T.T.T.T.U.P.P.T.T.U.T.T.T.T.T.T.T.T.T.~.T.XX).U.(.~.~././././././.(.(.^.{.^.^.(.`.}.}.}.}._.|.}.}.|.|._.|.`.`.|.|. X|. X|.}.|._.|.}._._._._._.|.{._._._._._.}._. X|._.|.|.|.`.|.(.{._.|._.(.(.^.{.(.^.(.[.(.(.(././.(.).(.^.^.(.(.^.^.(.^.~.|.(.{.~.{.|.^.{._.`.~.^.^./.(.{.(.(.(.~.~.(.~.(./.(.(./.[.[.~.~.~.~.~.^.~._.!././.~.T.T.[.^.P.T.~.T.~.T.T.T.T.T.T.T.T.T.H.U.U.H.U.H.G.L.G.G.A.G.G.A.S.H.g.H.z.H.h.j.h.k.h.g.k.h.k.k.k.k.z.g.a.f.a.a.a.a.i.a.a.a.a.i.i.i.u.u.u.u.t.t.r.t.E r.r.r.r.r.r.r.r.r.y.t.y.r.r.y.r.y.y.y.r.y.r.y.r.r.r.y.y.y.y.y.r.r.r.r.r.t.r.t.t.t.t.t.t.t.u.t.u.t.t.E u.t.u.u.s.u.t.r.s.t.p.u.u.u.u.u.u.u.i.u.u.u.i.u.i.i.u.",
+"C C C A A C C C C Z C C C C C C A C C A C C A C C C C C C C C C Z C C A C C Z Z Z C Z C C Z Z C B Z Z C Z Z Z C Z Z Z C Z Z F Z D D Z Z D D Z L H H Z H Z H Z L Z H H Z Z Z Z Z Z Z L Z H D D D H D H H Z L L L Z L H Z Z Z Z Z Z Z Z Z C Z H Z G B Z Z Z Z Z Z F Z Z Z Z Z B Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z B C Z Z B C C C C C C C C C C Z C Z C C C C F C C Z B A C B D Z Z Z Z Z C B D Z C Z C A Z U d.A.A.A.A.S.Z.H.S.H.H.H.L.L.L.L.S.L.L.L.L.Y.L.K.L.P.P.I.Y.I.I.T.T.T.T.~.T.~.T.T.~.~.~.!.!./././.(././.(./.(.(.(.(.`.^._.^.{._._._.|._.|.(.^._.`.^.{.|.(.(.[.(.(.[./.(.~.~.T.T.T.T.U.U.Y.K.U.U.L.T.U.L.P.L.P.L.U.U.U.U.P.P.P.P.U.S.P.P.I.U.I.L.Y.L.L.K.L.U.Y.U.P.P.U.Y.Y.Y.L.R.L.L.L.L.P.T.Z.P.P.T.P.T.T.T.T.T.Y.Y.T.T.T.U.U.U.I.T.I.Y.U.Y.U.Y.L.Y.L.L.L.L.U.L.L.T.U.T.U.[.[.U.I.I.T.~.T.(.U.~.T.U.P.[.T.~.T.T.~.~.T.R.` y r 0 [ {.^.^./.`.(./.(.).`.`._._.|._. X|.|. X{.dX XfX'.'..X.X.X.X X@X.XdX.X.XdX'.dX@X.XdX X|..X.X X.X.X'..X.X.X.XdX.X.X.X.X'..XzX.XzX.XzX.X.X.X|.dX'. X|..X.X.X|..X|..X|.|. X|..X|..X'..X.XzXdX.XdX X.XxX.XzX.XzXzXzXzXzX.XzXdXdXdXxXfXzXzXzXzXzXzXzXzXzXzXzXzXzX.XzX@XdXzX'.zXzXdXcXdXxXdXxXzXzXdX.XzX.XdX'..X.X.X.X@X'.|..X.X@X_.'.`.@X'.`. X.X.X|. X|.@X X@X.X@X X XzXdXdX#X X@X.X'..X.X.X@X X.X'..X'.dX'..X X X.X|.|.'..X X.X}.@X|.dX.X@X X.X'.'.|.|.|.|._._.|..X^.|..X`.|.|.@X_.{._.|.|.(.`.^.|.`.`.(._./._.(.^.(.(.(.!.[.[.[.[.T.[.~.~.~.~.(.U.U.U.T.U.U.L.T.Y.P.P.S.U.L.U.G.P.U.L.T.P.U.U.U.U.L.U.L.L.L.L.L.L.L.U.L.L.L.L.S.H.S.H.L.H.H.H.H.H.H.H.A.G.S.H.A.H.G.A.A.A.A.A.A.A.G.A.A.h.A.h.A.h.h.g.g.k.z.a.f.i.k.i.k.a.a.a.a.i.a.i.u.u.i.i.r.u.u.u.u.u.u.u.s.u.i.u.u.s.i.i.u.u.i.i.i.i.i.i.a.a.g.i.k.k.f.g.j.h.k.j.h.h.d.D.A.D.j.G.G.g.A.A.l.Z.U.S.G.G.G.G.H.H.H.H.H.H.G.U.L.D.H.T.G.L.H.L.G.K.L.L.U.U.T.U.U.U.P.Y.[.P.T.U.T.T.T.T.!.T.T.[.~.E./.Y./.{.R.(.(./.[.~./.(.T.~.^.Y.T.T.U.T.P.T.P.P.P.U.U.T.T.T.P.T.T.T.P.T.T.I.I.I.T.U.T.T.T.T.~.~.~.T././.^./././././.(./.(.(.(.`.(.`._._.|.}.}.}.|.|.}.}.|._.|.|._.|.|.|.}.|.}.}.}.}.|._.}.}.}._._._.'._._._._._.}.}.}.}.|.|._.|.|.`.`.`.`.|.|._.|.^.(.(.`.^.{.~.(.(.~.(.(.(./.(./.(.{.(.(.(./.(.(.^.^.(._.(.(.(.(.).^.(.!.(.^./.[.).~./.~.(.~.(./.(.(.(.~.~.[.~.^.~.!.[.^.!.(.~.T./.~./.~.T.T.~./.T.T.T.T.T.T.T.U.T.U.U.L.Y.L.L.L.S.L.K.H.A.H.K.A.A.H.A.A.A.h.z.j.g.j.h.g.k.g.k.k.k.f.f.a.z.a.k.g.a.z.i.z.s.a.i.i.i.i.i.u.u.u.u.t.u.t.r.r.r.r.r.r.r.r.t.r.r.r.y.r.y.r.y.y.r.y.y.r.y.t.r.y.r.y.y.y.y.y.w.r.E y.r.r.t.r.r.r.r.t.r.t.t.u.t.t.t.t.t.t.u.t.u.t.t.u.t.t.s.t.s.u.u.u.u.u.u.u.u.u.u.u.u.i.i.u.i.",
+"C A C C C C C C C Z C Z C F C C B F C C Z C Z C Z C Z Z C Z C C C C C A C C C Z C Z C C Z C C Z D Z Z F C Z C D B Z Z D B Z F Z Z H H Z D D Z H Z Z H H H Z H Z L Z Z L H H J Z H Z Z H D D D D Z H Z H L Z H S L D Z Z L Z H Z Z H Z Z G Z L Z Z Z Z Z Z Z Z B Z Z Z Z Z Z D Z Z Z Z Z Z Z G Z Z Z Z Z C Z Z C Z D C C C B Z C C C Z C C C C C C C Z C C C B D C Z Z C Z A B D C C A Z Z Z C Z Z A Z Z G e.A.A.A.A.S.S.A.H.S.H.G.G.L.S.L.U.D.L.L.L.L.L.P.L.P.L.I.U.U.T.T.T.T.T.T.~.T.~.~.~.~.~./.(./././././././.(.(.(.(.(.(.(.(._._._._._.(.`.`._.`.`.`.(.^.(.(.(.(./././.~.~.T.~.T.T.T.T.U.T.U.L.U.L.U.L.I.L.P.L.P.P.P.P.z.XXP.P.P.U.U.P.P.P.L.U.L.K.U.U.K.L.L.L.L.L.P.P.Y.L.U.U.Y.L.L.L.L.U.P.P.P.P.P.P.Y.U.T.T.T.T.T.P.U.U.L.U.T.U.I.T.I.U.Y.U.U.R.L.L.L.L.L.U.L.U.L.U.U.T.Y.T.T.U.[.~.T.T.T.T.[.T.~.T.T.T.T.~.~.T.T.T.[.R.Y.[ [ b.~.~.(./.(./.(./.^.|._.(._._._._.'.|.|.@XdX'. X X X'..X|..X'. X|..X XdX.XdX.XdX.XdX.X.X'. X.X.X X.XdX.X.XdXdXzX.X.XzX.X'..X.X.X'..X.X.XdX'.@X'. X.X.X|. X|..X|..X X X|..X|..X'.|..X|..X.X.X.X.XdX%X.X.XzXdXzXdX.XdX@XdXzXdXxXdXdXdXzXzXzXzXzXzXzXzXzXzXzX@XzX.XzXzX'.zXzXdXdXdXcXdXdXcXdXzXzXzXzX.XzX@XzX'..XzX.X.X|..X.X|..X XdX.X X X.X X XzX X X X XdXhX.X.XdXdXdX XdX XdX X.X.X.XdX.X'. X X#X X X X@X'.'..X.X.X.X.X'..X X X|. XdX.X|. X|..X.X_. X|.|.|. X|.`..X|.{..X|.|.{._. X X_.{.|.{.|.`.|.(.`.|.(.`.`._.[.(.[.~.~.~.~.T.[.T.T.!.T.P.Y.P.U.T.T.U.U.I.L.S.Y.D.L.P.L.U.S.H.L.G.L.U.L.L.L.L.L.L.S.U.L.L.L.L.S.U.L.L.S.L.U.S.H.H.H.H.H.H.H.H.H.S.H.G.Z.H.G.A.Z.G.G.G.A.A.A.G.A.A.A.h.h.A.h.h.g.z.g.g.g.k.k.a.i.a.a.a.a.a.a.i.u.a.i.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.i.i.i.k.i.i.k.a.d.i.z.i.k.k.h.g.k.z.z.k.k.h.D.z.g.A.A.g.S.G.D.A.D.A.D.S.G.G.L.G.G.L.L.H.U.L.H.L.L.L.L.P.H.L.L.L.Y.U.U.U.T.U.T.T.Y.Y.P.P.T.T.T.~.T.T.(.[.!.~.[.T.(.~.(././.^.).^.!.~.[.~.~.^.T.P.[.P.[.T.T.P.P.T.P.P.P.T.U.P.T.T.T.T.P.T.T.I.I.T.I.T.T.T.T.T.T.T.~.T.~./.T.~.^.E.!./.!./././.(.(.^.^.^._.`._.{.}.}._.[.|.|.|.|. X|. X|._.|.|.}.|.}.}.}._.|.^.}.}._._._._._._._._._.}._._. X_.'.|._._.`.`.`.`.`.(.(._.(.(.|.^._.[.(.(.~.(.(./.^.(./.(././.(.(./.(.`.^._.].(.^.(.(.(.(.(.(./.{.(.^.{.!.^.[./.(././.(././.~.~.^.~.~.(.~.!.T.~.T.~.T.~./.T.~.T.T.~.~.T.T.T.T.U.T.T.T.U.U.U.L.U.L.Y.S.H.S.L.S.H.H.H.H.A.A.H.z.G.H.A.h.H.h.h.A.h.g.h.h.k.k.k.z.z.g.a.z.f.f.a.g.i.a.a.a.a.a.i.i.i.u.u.u.t.u.t.r.r.r.r.r.r.r.r.y.y.r.E r.r.y.r.r.y.y.y.r.y.r.y.y.r.y.y.y.y.y.w.E E y.r.r.r.E y.r.r.r.r.E r.r.t.E t.t.t.t.u.t.u.u.t.s.t.u.u.t.t.t.t.E u.u.u.u.u.E u.u.u.u.i.u.i.i.u.",
+"N C A C C A C C Z B C Z C Z Z C B C C A C C C C Z Z C Z C C C C C C C C C A Z C C Z Z C Z C Z Z Z D D Z A Z C Z A Z B D Z Z D Z L Z L Z Z Z Z Z Z Z L Z H H S L Z J H D D Z H D D D H Z D Z Z Z H H Z H Z H Z H Z H Z Z Z L Z G S H Z Z D Z Z S F Z Z Z Z Z Z Z Z Z Z G B Z Z Z Z Z Z L Z Z Z L Z Z Z C Z C Z Z C Z B D C C C C C Z C Z C Z C C C C Z C C Z C Z C C C Z C Z C D Z Z B Z C Z Z C Z V Z A Z e.h.D.A.A.S.S.S.H.G.G.L.L.D.L.D.H.L.S.L.L.L.H.P.P.D.U.P.U.U.U.U.T.T.T.~.T.T.~.^.T.T.^./././././.(.(.(.(.(.(.(.(.(.(.(.(.(._.`.(.`.^.`.(.^._.`.|.(._.`.(.(./.(././.~.~.[.T.~.T.T.T.T.U.U.L.U.L.L.I.L.I.I.L.L.U.L.L.Y.K.Y.P.P.U.U.L.L.Y.L.U.U.L.L.L.L.L.U.L.L.Y.U.U.L.L.U.U.U.U.L.L.L.L.L.U.L.I.U.U.P.P.Y.Y.Y.T.T.U.T.Y.R.I.U.U.Y.T.I.T.U.U.U.L.L.U.L.U.L.L.Y.P.P.P.T.T.~.~.U.~.T.T.T.T.T.~.T.T.T.~.T.T.T.~.T.^.T.~.T.~.T.~./.~./././.(././.(.(.(.(.(.(.^.}.|.}.'.|..X|..X.X.X.X.X|.'..X'. X.X.X.X.X.X.XdX'..X'.dX.X.X.X.X|..X'..X.XdX.XdX.XzX.XdX'.dXdXdXdX.XzXdX.X.X.X.X.X.X.X.X.X X.X.X.X.X|..X X'.|..X X'..X.X.X.X.XdX.X.X.XzX.X%XdXdXdXdXdXzXzXzXzXzXzXzXzXzXzXdXvX.XvXdXdXdX X.XcXdXdXdXdXdXdXdXdXdXdX.XcXdXdXcXdX.XcX.XzX.XzX.X'.zX'..XzX.X.X.X.X|..X|. X X X|. X X X.X.X.X.X.X'..X.XdX@X'..XdX.X'.dX.X@X.X.X.X|.dX'..X'..X.X.X@X_. X.X'.|.|..X.X.X|.|..X.X`.'.|..X.X'.|..X|.|.|.|.}.|.|.|.}.|. X|.|.|.|.|._._.`._._._.|._._._._.^.`.`.(.(.(./.R.~.~.~.T.T.T.T.T.T.T.T.T.U.U.U.U.L.L.L.L.L.H.L.L.L.L.H.L.L.L.L.L.L.L.L.L.L.H.G.L.L.L.L.L.L.L.L.L.L.L.S.H.H.H.H.H.S.G.G.H.G.S.S.S.G.S.G.S.A.H.S.A.S.A.h.A.A.A.A.A.A.h.h.h.g.g.k.g.f.d.f.d.i.z.f.a.a.a.i.i.i.i.a.u.u.u.u.i.u.u.u.u.u.u.u.u.a.u.u.u.u.u.u.a.i.i.i.i.a.i.a.a.z.k.a.g.g.h.f.h.h.h.h.h.h.h.h.A.h.A.H.h.z.S.A.S.S.S.S.G.G.H.H.H.L.D.L.P.P.P.L.P.L.L.L.L.L.U.K.U.U.U.U.T.U.P.T.P.T.T.T.T.Y.~.T.~.Y.~.~.~.~./././././././.^./.(.~.~.^.~.(.~.~.~.T.T.T.T.T.P.T.P.Y.P.T.T.T.T.P.T.T.T.P.T.P.T.T.U.T.U.T.U.T.T./.T.~.~.~.~.~.^.~././.(./././.^.^.^.(.`.(.^._.^.(._.|.}.}.|._.}.}.}. X}.}. X}.}._.}._.}.}.}._._._._._._.(._.(._._._._._._._._._. X_.|._._.|._.(.`.^.^.^._.(.(.(.(.(.).(.(.(.(./././.(.(.^.(.~./.(.{.(.(.(.(././.(./.(./.(.(.^./.~././././././.^.~.~./.~.~.~.~.~.!.~.~.~.~.[.T.~.T.~.~.T.~.T.^.~.T.T.T.T.T.T.T.T.T.T.U.U.L.U.L.L.H.H.H.H.H.H.H.J.S.A.S.A.A.A.A.h.A.j.h.l.h.z.h.h.g.g.g.k.g.g.a.f.k.f.z.a.a.a.k.a.a.a.s.i.i.u.u.u.t.t.t.t.t.r.r.E y.t.E r.y.r.y.y.t.r.r.y.y.r.y.y.y.E y.w.y.y.r.w.y.y.y.y.y.y.y.y.r.E r.r.y.r.r.r.r.r.y.r.r.r.r.t.t.t.t.t.t.t.t.t.t.t.s.t.t.t.s.u.t.t.t.u.t.t.u.u.u.u.u.u.u.u.i.",
+"C C C C C C Z C C Z D C C C B Z D A Z Z D Z C Z Z C C C C C Z Z C A Z C C Z C Z Z Z C Z C Z C C Z B D B D C Z C Z Z Z Z Z Z Z Z Z Z G Z Z G L L L G Z Z Z H D Z H Z Z D D H D D D Z H Z D L D H Z H Z H L Z L H L Z S L L Z Z H Z Z D D D Z Z Z Z Z Z F Z Z F Z D C Z Z D Z D Z Z Z L Z Z Z Z Z H G H Z Z Z Z C Z C C C C C C C C C C C C C C F C C C Z C C C G Z Z Z Z Z C Z C Z Z Z C Z C C Z Z V Z Z Z T A.H.h.A.A.Z.S.S.H.H.A.L.L.F.L.L.L.L.L.L.S.U.P.P.Y.U.P.U.U.T.T.T.T.T.T.T.T.~.T.~.T.~./././././.(./.^.(.(.(.^.(.(.(.(.(._.|.^._._.`.`.`.`._.|._.(.{.^.(.(.(./././.~.~.~.~.T.~.T.T.T.T.T.L.U.L.L.I.L.I.L.I.L.U.L.K.L.L.L.U.Y.U.Y.L.L.U.Y.U.U.Y.L.U.L.K.L.L.I.L.I.L.U.I.K.U.K.L.I.L.U.L.L.L.L.L.U.U.P.T.U.Y.U.U.T.I.Y.Y.U.U.U.U.I.I.I.I.U.U.U.L.Y.L.L.L.L.P.L.U.T.T.T.T.U.~.~.T.~.T.~.T.~.T.~.~.T./.~.T.T.~.^.T./.~.~.~./.T.T./././.(./././.(.(.(.(.(._._.}.}.|.|. X|..X|..X|.|. X.X|.|. X X'.|..X.X.XdX'..XdX.X.X.X.X.X.X.X.X.X.X.X'.dX'.zX'.zX.XdXdXdX XdXdX.X XzX.XdX.X.X.X.X.X.X.X.X.X.X.X.X'. X.X.X|..X.X|.|..X.X.X.X.XzX.XzX.X.XvXdXdXdXdX.XzXzX@XzXzXzXzXzXzXdX XcXzXfX%XdXcXcXdXdXdXxXdXdXdXdXdXdXdXdXvX.X%XdXdXxX.XxX.XzX.XzX.X'.@X.X.X.X.X|..X.X X.X.X X X@X.XdX@X.X.X.X.X.X'.dX.X X.XdXdX.X.X.X.X.X.X.X.X.X.X X X X.X.X|..X X X X|..X.X.X'.|.|.|.|..X.X.X.X|..X|..X.X|.|. X|.|.}.|.|.}.}.}.|.`.|._._._._.|.{._._.|._._._._._.(.(.^.^./././.(.~.~.~.~.[.T.~.T.T.T.U.T.T.U.U.U.L.L.L.L.L.J.S.U.H.L.L.H.H.L.L.G.L.L.L.S.H.G.L.H.G.H.H.H.A.H.H.H.S.U.S.H.H.H.H.H.S.S.G.A.H.H.S.S.G.S.S.S.H.A.S.S.A.A.A.A.A.A.A.A.h.h.h.h.g.g.k.k.f.f.f.f.k.i.a.a.a.a.a.i.i.a.i.i.u.i.u.u.u.u.u.u.a.u.u.a.u.u.i.i.u.i.u.i.u.i.i.i.a.a.z.i.i.k.g.g.a.g.f.h.k.h.h.l.h.h.h.g.A.h.z.G.S.A.S.A.S.H.S.S.G.G.H.H.P.U.A.P.D.P.L.L.L.P.L.L.U.U.U.L.U.I.U.T.U.P.Y.T.T.T.T.T.T.T.T.T.~.~.~.~.~.(.T.!./.!./././.(.[.(./.~.~.~.!.T.~.T.T.T.T.U.P.T.P.P.P.P.P.T.T.T.P.T.T.P.T.T.U.T.T.T.T.U.T.T.T.T.T.~.~.~.~.~.~.[.[././././.^.(.(.(.(.(.(.`.(._.|._._.}.}.(._.}.}.}.}.}.}.}.}.}.|.}._.}._.}.}._. X X_._._._.(._._._._._._._._._._._._._.|.|.|.`.{.`.`.(.(.(.(.(.(.(.(.(./.~.(.(.(.(././.^.(./.(.(.^.(./.[.(.(./.(.E.(.(./././.(.(./.!././././.~./.(.~.~.~.!.~.~.~.~.~.~.~.!.T.~.~.~.~.^.~.T.T.T.T.T.T.T.T.T.T.T.T.T.H.L.L.L.L.L.L.H.H.H.H.H.H.S.G.A.A.A.A.A.A.A.A.h.A.h.h.h.z.h.g.g.g.g.g.g.a.k.f.a.a.f.a.k.a.a.a.a.a.i.u.i.u.u.u.u.t.t.t.r.r.r.y.y.t.y.y.y.y.y.r.y.r.r.t.y.y.y.r.y.y.y.E y.y.y.E w.y.y.w.w.y.r.E y.y.y.y.r.y.r.y.r.r.r.r.r.r.t.r.y.t.t.t.t.t.t.t.t.t.s.t.t.t.r.t.t.u.t.t.u.u.u.u.u.u.u.u.s.u.",
+"C A C C C D Z C D C Z B Z C C D Z Z Z Z Z D Z Z Z C Z Z Z Z A C Z A D A Z Z Z C Z C Z C Z C C Z Z Z Z Z F Z Z C B Z C Z G C Z H Z Z Z G Z Z G Z D D L Z Z H H D L D H H H H H H H H Z L H Z Z H Z H L H H Z H H H Z L Z Z L H Z Z H D Z D Z D Z Z D Z D Z Z Z Z Z Z Z D Z B C D Z Z Z Z Z Z G G Z G Z H Z Z Z Z A Z C D C C C V C A C C C B C Z C Z Z C D Z C C B Z C Z Z C B Z C Z B Z C C Z C C Z Z Z C T j.A.A.A.A.A.A.H.H.G.F.L.L.L.D.L.S.L.S.L.U.H.L.L.P.L.P.L.L.U.T.U.T.T.T.T.T.T.T.T.~.~.R.~././.!././.(.).(.(.^.^.(.`.`.[.(._._.|.|.^.`.^.|._.{.).|.|.(.(.(.(./.(././.~.T.~.T.T.~.T.T.U.U.U.U.L.L.L.K.Y.L.L.L.L.I.L.L.I.L.Y.U.U.U.L.Y.U.U.Y.L.U.L.L.K.R.U.U.L.K.U.L.L.I.L.U.L.L.L.L.L.L.U.K.L.Y.U.U.P.P.U.U.U.U.I.U.U.U.Y.U.U.U.I.T.T.T.U.U.U.U.U.L.Y.Y.P.U.Y.L.T.T.T.T.~.T.~.~.~.T.~.~.[.T.T.~.Y.R./.R.~.T.T.T.T.[.~.~.!./.~.~./././.^././.(./.(.(.(.`._._.}.|.|.|. X.X.X X.X.X|..X'. X|..X|..X.X.X X@XzX@XdX.X.X.X.X'.|..X.X.X.X.X@X'..X.X.X.X.X@X.XzXdX.XzX.XdXdX.X.X.XdX.X.X.X.X'.'..X.X.X|..X.X.X'..X.X.X.XzX.X.X.X.XdXzXzX.X.XzX.XzXzX.XzX.X.X@XzXzX@XzXzXzXzXzXzXdXdXdXcXvXdX.XcXdXdXdXdXdXcXdX@XvXvX X.XdXdXdXcX.XxX'.zX.X.X.X.X.XzX.X.X.X.X.X|..X|.|..X X'. X X.X.X.X.X.XdX@XdX.X.X.X.X.X.X X.X.X.X.X.X.X.X'..X.X.X.X.X.X.X.X.X X.X.X.X.X.X|..X|.|.|.|.|.`.'..X|..X|..X.X|. X|.|.}.}.}.}. X{._.|.`.|._.|.{.(.|._._.|._.`.`._._.(.(.(.^.(./.~./.~.~.~.T.~.T.T.T.[.T.U.U.Y.P.L.Y.L.L.L.L.S.S.U.H.S.S.H.H.H.H.H.L.S.L.H.H.H.H.H.U.L.D.G.H.S.H.G.H.H.H.S.S.S.S.S.S.S.D.G.D.S.S.S.S.S.S.S.S.S.H.A.H.A.A.H.A.A.h.A.A.A.h.h.h.h.h.k.k.k.f.f.f.f.i.z.i.a.a.a.a.i.i.i.u.a.u.u.u.i.u.u.i.u.u.u.x.u.i.u.i.u.i.u.u.u.i.u.a.i.a.i.k.k.d.k.a.f.k.l.z.h.h.h.h.h.h.A.A.A.A.z.S.S.h.S.S.S.S.S.H.H.H.H.H.L.A.P.P.U.U.P.P.P.L.P.P.U.U.U.U.U.I.T.U.T.I.T.T.T.T.T.T.T.~.T.~.~.T.~.~.~././././.!./.{././././././.~.~./.~.T.T.T.P.T.T.P.P.P.P.Y.P.T.T.T.P.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T./.T.[.~.~.~.(./.(.(.(././.(.(.(.(.(.`.`.`.`.|.{.}._._.}.|.|._.|._._.}.}.}.}.}._._._._._._.}._._.`.`._._.(.(.(.(._._._._._.(._._._._.[.}._.|.^.|.(.^.`.(.|.(.(.(.(.(./.(.(././.(./.(.(./.^.{./.(.{.^.(.{.(./././.^.^././.~.(././.~./.~./.].~.~.~.~.~.~.~.~.~.~.~.~.~.~.T.~.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.P.P.T.P.P.H.L.L.L.H.H.D.H.H.A.H.H.H.S.A.A.A.A.A.A.A.A.S.h.G.h.h.g.h.g.g.k.z.g.g.g.d.k.f.a.k.a.a.a.a.a.s.a.u.u.u.u.u.u.t.t.t.r.r.r.t.y.r.y.y.r.y.y.r.r.y.r.r.E y.r.y.y.r.E y.y.r.y.y.w.y.y.y.y.y.y.y.y.E y.r.y.w.E w.y.y.r.y.r.r.r.y.r.y.r.r.r.r.r.r.t.t.t.t.t.t.r.t.t.r.t.t.t.t.u.t.u.u.u.u.u.i.u.i.",
+"C C C C C Z B C C Z C Z C Z Z Z F V Z Z Z B Z C C F Z C Z C F Z B Z B Z C Z Z C Z Z C Z Z Z Z Z C D B Z B Z Z Z D Z Z Z D D D C Z Z Z Z Z L Z Z D Z L Z D H H D H S Z D H H H D L H H H H H H Z H H Z H H H H H H H Z L L Z Z Z D H D H D Z Z F Z Z Z D Z Z Z Z G B D C Z G Z Z G Z Z Z Z Z Z L Z Z Z Z Z Z C Z Z Z Z B F C C Z C C C F C Z C C C Z C C C C Z Z D C Z C Z Z Z D Z Z D Z Z Z Z Z Z Z C Z A U j.D.A.H.A.H.H.A.G.H.S.L.S.S.L.L.L.S.H.L.L.U.L.L.L.L.L.T.T.L.T.T.T.T.T.T.T.T.T.~.T.~.~.~.T./././.(.(.{.(.|.^._.(._.(._._._._.^._.|.`.|._.^.|.`.(.^.(.(.(.(./.^./.~./.~.T.~.T.T.T.T.U.U.U.L.L.L.L.L.L.U.L.U.L.L.L.L.I.U.U.T.P.U.L.L.L.L.L.L.L.L.U.L.L.L.L.L.Y.U.U.U.U.U.U.K.L.L.I.L.U.K.L.L.L.U.Y.U.Y.U.U.U.L.L.U.L.U.I.I.U.T.T.T.T.U.T.T.U.U.U.L.U.L.P.P.U.T.T.T.T.~.~.T.~.T.~.~.~.T.T.~.T.(././.T.~.T.(.E.XX[.~.~.~.~.~.~.~././././.(./.(.^./.(.(.(.|._.}.|.|.|.|.'.|.|.|.|.|.|.|.|.'.|. X|..X X.X.X.X.X X.X.X.X.X.X.X.X.X|..X.X.X.X.XzX'.zXzX'.zX'.dX%X.X.X.X.XzX.XzX.X.X.X.X.X X X.X.X.X.X.X.XdX X.X.X.X.X.X.X.X.X#X.X'..X.XzX.XzXzX.XzX.XfX.XdXdXdXdXzXzXzXzXzXzX.XcXdXcX.XcXcX.XdXxXdXxXdXdXcXfXdX XdXdXdXdXdXdXxXxX.XzXxXzXzX.X.X.X.X.X.X.X.X|..X.X.X|..X.X.X.X.X.X.XdX.X.X'.zXdX.X.X.X.XzXdX@X.XdX'..X.X.X.X.X.X.X.X X'.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|..X|..X.X|..X X|.|._._.|.}.}.|.}.}.|. X`.`.|._._.|.`.|._._._._._._._._.(.(.(.^.)./.~./.~.~.~.~.~.T.T.U.U.U.U.T.P.U.L.L.L.L.L.L.P.L.L.S.L.L.L.S.H.H.H.G.H.H.H.H.H.H.H.G.G.D.H.S.D.H.H.S.D.G.G.S.S.S.H.G.S.G.S.S.S.S.S.S.h.S.S.S.S.S.A.A.A.A.A.A.A.A.A.j.g.A.h.g.k.k.k.k.f.f.f.f.k.k.i.d.a.a.a.i.a.a.a.i.a.u.u.i.u.i.u.i.a.a.t.u.i.i.i.i.a.u.u.u.u.u.i.i.a.i.f.a.i.k.k.k.z.k.k.l.h.l.h.l.h.A.A.h.A.A.A.G.S.H.S.S.S.G.S.G.H.H.G.L.L.L.D.L.L.L.L.U.U.P.P.U.U.U.U.T.T.U.T.I.U.T.U.T.T.T.~.T.T.T.T.~.T.[.~.~.~.~./.(./.(./././.^.(.~./.~./.~.~.T.~.T.T.U.T.U.P.P.P.P.P.T.P.T.T.Y.T.P.U.T.T.P.T.T.T.T.T.T.T.T./.T.T.~.~.~.~././././.(./.^.`.!.(.(._.[.`.(.(.`._._.|._.}.}.}._.|._._._.}.}._.}.}.{._._._._.}._.|._.(.(.(.(.(.(.(.(.^._.(._._.`.(._.(.(._.}.}.(.`.(.|.|.(.^._.(.`.`.(.(.(.(.(.[./.(.(.(.{.(.(.(./.(./.(././././././././.!.^./.(./././.~./.~.~.(.~.~.~./.~.~.~.~.T.T.~.T.T.~.T.T.T.T.T.T.T.T.T.Y.P.T.T.T.U.T.U.U.L.U.S.U.H.L.H.H.H.H.H.H.A.H.G.A.G.A.A.A.A.A.A.A.A.h.h.h.h.h.g.g.g.g.g.f.g.g.a.g.f.a.f.a.a.a.a.a.a.a.a.u.u.u.u.u.u.t.t.t.r.r.y.y.r.r.y.y.y.y.y.r.y.r.y.E r.y.w.y.y.w.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.r.y.y.y.y.y.y.y.y.y.w.y.y.r.r.y.y.r.y.r.r.r.r.t.t.t.t.r.r.t.t.t.r.r.r.t.u.t.t.u.t.u.u.u.u.u.i.",
+"Z C C C Z C C D F B D B Z Z Z Z Z Z Z Z Z Z A Z Z Z Z Z C Z Z B D Z C Z Z C Z Z Z Z Z B D Z Z Z Z Z Z Z C Z B D Z Z Z Z Z Z Z Z Z Z L L Z Z Z Z D D D D H H H H H H Z H G H H H Z L H Z H H Z H H H H H H H H H H H H H L L Z H Z Z Z Z Z F H Z Z D D Z Z Z Z Z Z C Z Z Z Z Z Z Z Z G L L Z Z G G Z Z Z Z Z Z C Z C Z C C C C Z C C Z C C C C F C C Z Z C Z Z Z D C G F Z Z Z Z B D Z D Z Z Z Z C Z B Z Z G e.J.A.A.A.S.A.A.H.H.L.L.A.L.S.L.U.A.U.D.P.H.P.P.L.L.P.U.T.U.T.U.T.T.T.T.(.T.T.T.~.~.T.~.~.~.(.(.(.(.(.`.^.^._._._.|.}._.}.}._._._._.^.|.|.^.(.|.(.(.(.(././.~./.~.~.~.~.T.T.T.T.T.U.Y.L.Y.K.J.L.L.L.L.I.I.L.L.L.I.I.L.P.P.P.U.Y.L.L.L.L.L.L.L.L.L.L.L.I.L.I.L.L.Y.L.U.U.L.L.U.L.L.L.L.L.L.L.L.U.L.U.L.L.P.Y.P.L.U.L.U.U.U.U.U.T.U.T.I.T.U.I.I.I.I.Y.U.U.Y.T.T.~.T.~.T./.~.~./.~.~.T.~.~.~.[.~.~.~.~.~././.!.T.^./././.T./././.!.(.!./.(.(.(.(./._.(._._._.|.}.}.}.|.|.|.|.|.|.|.|.|. X|..X|..X.X.X.X.X.X@X.X.X.X.X X.X|.'..X.XxX.XzX'.xXzX.XzX.X.XzXdX|..X.XdX.X.X.X.X.X.X.X.X.X.XdX.X.XdX X.X.X.X@X.X.X.X.X.X.X.XdX.X.XzX.XdXzXzXzX.XdX.XzXzX.XdXxXdXdXdXfXdXdXdXzXdXdXcXdX.XdXcXcXdXfXdX%XdXdXdXdX.XzX XvX.X XvXdXdXzXdX.X.X.XzX.XzX.X@X|.dX.X.X.X X|..X.X.X.X.X.X'..X.X.X.X.X.X.X.X'.dX.X.X.XzX.X.X.X.X.X X.X X.X.X X|..X|..X'.|.}.|._.|.|.|._._.|.|.|.|.|.|.|..X X.X.X X|.|. X_.}.|.{. X|._. X_.|.`._._.{._.|._._._.}.}.(._.(.(.(.(./.(././.~./.!.~.!./.T.T.T.T.T.P.P.Y.P.U.P.P.L.L.L.H.L.H.H.L.H.H.H.H.H.H.H.H.Z.H.S.S.H.H.A.H.A.H.S.S.S.S.S.S.S.S.S.S.G.H.A.H.S.S.S.A.A.D.A.S.S.S.S.S.A.S.A.G.A.A.A.A.A.A.h.A.A.g.h.h.g.g.k.k.k.k.k.k.f.f.z.i.k.i.i.a.a.i.a.a.i.i.s.u.u.i.i.i.a.a.a.a.a.u.i.i.i.i.i.u.a.i.i.i.i.i.a.a.a.g.s.j.j.h.l.z.h.h.l.l.h.l.A.A.l.A.A.S.S.A.S.S.S.S.H.H.H.L.G.L.L.L.L.L.U.L.L.U.P.L.U.U.U.U.T.T.T.T.T.I.T.U.Y.T.T.~.T.T.~.~.~.T.~.T.[.~././.(.E./.(./.(././.(.(.~.~.^.^.~.~.T.T.~.T.T.T.T.P.T.P.P.P.P.T.T.Y.P.Y.U.T.T.^.T.T.Y.~.T.T.T.T.T.~.~.!.~.~.~.(././.(.[.(.(.(.(._.(._._._._._._.|._._.|._.}.}.}._._._._.|._._._.[._.(._._._._._.(.`.`.`.(.^.(.(.(.(.^.`._._.^.(.{._.(.(.^.|.^.|.(.`.^./.{.^.{._._.^.^.^.(.(.(.(.(.{./.(.(.(.[.^.(.{.^.^./.^.[./././././.~./.~.~.E.(.(.~./.~./.T.~.T./.T.~.~.~.~.T.T.Y.T.~.T.^.P.T.T.T.T.T.T.T.T.T.U.U.T.U.U.U.L.L.L.L.H.H.H.H.H.H.H.G.G.H.S.S.A.A.A.A.A.A.A.g.G.j.h.h.l.l.l.k.k.g.a.g.g.f.f.f.a.f.a.a.a.a.a.i.a.i.i.i.i.u.u.u.u.t.t.t.t.r.r.y.y.y.y.y.y.y.y.y.r.y.r.r.r.y.t.y.y.y.y.y.y.y.y.y.y.y.E w.y.y.y.E y.y.y.y.y.y.y.y.y.y.y.y.y.r.r.r.y.y.y.y.y.w.y.y.w.r.t.t.r.r.r.r.r.r.r.t.r.t.t.u.u.t.u.t.u.u.u.u.u.",
+"B Z Z C C Z Z B Z Z Z Z Z Z D Z Z Z Z Z Z D Z Z Z Z Z C Z Z D B Z Z Z Z Z Z Z F C Z Z D B Z Z C B Z Z C Z Z Z Z Z Z Z Z D Z G Z Z Z Z Z G H Z G D D H G H H H D H H H H H H K D L Z H H Z H H H H H H Z H H H J H H H H Z L L Z H Z H Z D H Z D D D D D Z Z Z H Z Z G D Z Z Z G Z Z Z Z Z L Z Z Z D D Z Z Z Z G D B Z C Z Z C C C C C C C Z C C Z Z C Z D Z Z B Z B V Z B D Z Z Z Z Z B C Z C Z B Z Z D Z D T Z.G.A.H.S.H.H.H.H.S.L.L.D.L.D.P.U.U.U.P.H.P.H.L.U.U.L.T.U.U.T.T.T.T.T.T.T.T.~.T.T.T.~.~././.(.(.(./.(.(.`._._._._.}._.}.}. X_.|._._.^.(.(.(./.(.^.^././.(.(.(././.~.T.~.T.T.T.T.U.U.L.L.L.L.L.L.Y.L.L.L.L.I.L.L.U.Y.U.T.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.H.U.L.U.L.L.L.L.U.L.L.U.L.L.K.Y.K.L.U.L.L.L.L.L.S.L.L.L.U.U.U.U.I.U.U.U.U.T.I.U.T.U.U.Y.U.T.T.T.T.~.T.!.~.~.T.~.~.T.T.~.~.~.~.~.~.~./.!./././././.~.^./././././.~./.~./.~./././.(.(.(.(.(._._.|._.}._.}.}.|.|.|.|.|.|.|.|.|.|.|.|.|..X.X.X.X X X.X.X|..X|.|..X.X.X.X.X.X.X.X.X'.zX.XzX.XzXdXfX.XzX'.dX.XzX.XzX.XzXxX.X.X@XdX@X@X.X.XdX.XzX.X.XzXzXdXzX.XdXzX.X.XzX.X.X.XzXzX.XxX.X.XzXdX#XdXdXdX.XvX XcXdXcXdXdXdXcXcXdXdXzXvXzXzXmXdXdXmX%X.XcX.XdXvXdX XdXdX.XzX.XdX.X.X.X'.'..X'..X.X.X|..X.X|..X.X.X|..X X.X.XdX.XzX.X.XdX.X.X.X.X.X.X.X X.X.X.X X.X.X'..X.X.X'.|.|.|.}.|._.|.|.{._.|._.|._.|.|.|.|.|..X|.|..X.X|.|.|.}. X|. X|.|.|.|.`.`._.|._.`._._._._.|.[._.(.(./.(.^./.!./.{.[./.(.~.T.(.T.~.T.T.P.T.P.L.Y.U.P.L.L.L.L.H.H.H.H.H.H.H.H.S.S.G.H.G.H.S.S.S.H.A.A.h.D.z.z.S.A.A.A.A.S.S.z.G.A.G.A.A.S.S.S.A.S.h.A.S.S.S.H.S.A.H.S.H.A.A.g.A.A.h.h.h.A.h.h.g.g.g.k.k.k.f.d.k.i.f.k.i.a.k.a.a.a.a.i.a.a.i.i.u.i.i.i.i.a.u.u.a.a.a.a.a.i.i.i.i.i.i.i.i.i.i.k.i.a.g.a.f.j.f.k.l.l.l.l.l.l.l.A.A.A.A.A.S.A.G.S.S.S.G.S.S.H.G.L.L.L.L.P.L.L.L.U.U.P.U.U.U.T.U.U.T.T.T.T.T.T.T.T.Y.T.T.~.T.~.T.T.~.~.~.!.~././.(.^./.(.(./.(.(.~.(.(.(.!.~.~.T.[.T.T.T.T.T.P.P.P.T.T.Y.P.Y.Y.T.oXD.T.T.T.T.~.T.T.T.T.T.T.T.~.T.T.~.~././.~./.(./.(.(.(.(._.(._._._._._.|._._.|.|.|.|._.}. X|._. X_.`._._.`._._._._._._._.^.`.(.^.^.(.`.(.(.^.(.`.^.`.^.`.(.^.(.(.(.^.(.(.(.^.`.(.|._.|._._.(.`.`.(.(.(.(.(.^.(.{.(.(.(.(.(./.).^.^./.~././.^.~.~./.~./.~.~.~.~.R.~.T.~.T.~.~.~.T./.T.T.T.T.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.U.T.T.U.U.P.P.P.U.L.L.L.H.L.H.S.H.A.A.H.G.A.A.h.A.A.A.A.A.A.h.A.A.A.h.h.h.l.l.h.k.g.g.g.z.f.f.f.k.f.a.f.a.i.i.a.a.i.i.u.u.u.u.u.t.t.t.r.r.r.r.r.r.t.r.y.w.y.r.r.y.r.w.y.r.y.E y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.E y.E y.w.y.y.y.y.y.y.w.r.y.y.y.y.y.y.y.y.w.y.y.y.y.y.r.y.r.y.y.r.r.r.r.r.r.t.t.t.t.t.u.u.u.u.t.u.u.",
+"A C C Z Z C Z Z C Z Z Z Z D D D Z D Z Z Z Z D D V Z F Z C Z D Z C Z Z B Z C Z Z B Z Z Z D Z Z Z F Z C D Z Z Z Z Z B G D Z Z Z Z Z Z Z Z Z Z L H D D D D Z H D H H H H H Z H H H H H H Z L H H H H H H L J H L H H H H H H H L H Z J D D D Z D D D Z Z D G Z Z Z D D D D G Z Z G Z L Z G Z Z Z Z Z Z Z G Z Z Z Z Z Z Z C B C Z C D B C C C B D C C Z Z C Z Z Z Z Z B Z Z Z Z Z Z Z Z Z Z Z Z Z C Z D Z F Z Z T A.A.G.h.S.A.A.G.H.D.L.L.D.S.L.S.U.D.P.H.P.P.P.P.U.U.U.P.T.T.U.T.T.T.U.T.T.T.Y.P.~.~.~.~././.(.^.(.(.(.^._.[.|.|._. X}.|._._._._.[.(./.(.(.(./.(.(.(.(././.~.~.~.~.T.~.~.T.T.T.U.T.Y.L.L.L.L.L.L.L.I.L.L.I.Y.L.U.U.U.U.Y.L.L.L.L.L.L.L.L.L.K.L.L.R.I.L.U.K.U.L.K.L.Y.K.L.L.L.U.L.L.L.U.L.L.L.U.L.L.L.L.L.L.L.P.L.U.L.U.R.I.I.I.U.U.Y.T.T.I.T.I.U.T.T.T.T.~.T.~.T.~.T./.~.~././.~.~.~.T.[.~./././.(.(././././././.~./././.~./.~.~.(.(././.(.(.(.).(.^.|._.}.|.{.{.|.|.|._.|.|.|.|._.|.|.|.|. X.X|..X.X.X.X.X.X.X|.|.'..X'.'..X.X.X.XzX.XzX.XzXzX.X'.%XdX.XdX.XdX.X.X.XzX.XzX.X'..XzX X.XdX.X.X'.dX.X.XzX'..X.X.XzX.XxX.XvXzXzX.XzX.XzX'..X.XzXzXzX.XdX%X@XdXdXzXzXzXdXcXcXdXcX.XdXcXdXzXzXzXdXnXdXdXdXdXcXdX.XdX.XvXdXdXdX@X.X.XdXdXzX.X.X.X.X.X'..X.X.X.X X X.XdX X.X.X.XzXdX.X.XdX.X.XzX.X.X.X.X.X.X.X'. X.X.X|..X.X|..X X|.'.|.|.}.}._._.[.|.|._.`.(._.`._.|.|.|.|. X.X|.|.|.|._.|. X|. X|. X'.|.|._.|._._.`._._.`.^.^.(.(.).(./././././.~.~.~.[.~.(.T.T.T.T.T.R.P.P.U.L.L.P.L.P.L.H.H.L.H.S.H.H.H.H.D.A.S.S.A.l.A.A.h.S.A.A.A.A.A.A.A.A.A.A.A.A.A.A.S.G.G.A.A.G.A.S.A.z.A.A.A.A.A.S.h.S.A.G.z.A.A.A.h.A.G.h.h.A.z.h.h.h.g.g.k.g.k.f.f.i.f.k.a.i.a.i.a.a.a.a.a.i.i.a.a.i.i.a.a.a.u.u.a.a.a.a.a.i.a.a.a.i.u.a.i.i.i.k.i.g.f.g.j.g.f.k.l.l.h.l.l.h.h.h.A.A.A.A.A.H.A.G.A.S.S.S.H.H.H.G.H.L.S.U.L.L.P.P.T.U.P.P.U.U.U.T.T.T.T.T.T.T.T.T.Y.T.~.T.~.T.T.~.~.~.~.~.E./././.~.^./.^.^.^.(.(.(./.~.(.(.~.~.~.T.T.T.T.T.T.T.T.T.T.P.P.P.Y.P.Y.Y.D.T.T.T.T.T.T.T.T.T.T.T.~.~.~.~.~./.(.(.(.(.(.(._._.(._._.|._._._._._.|.|.|.|.|.|.'.|.|.}. X_.'.`.(.`.`.(._._._._._._._.(.(.`.(.(.(.(.(./.(.(.{.`.[.[.^.(.(.(.{.^.(.(.(.(.(.(.(.^.^.|._._.(._._.^.(.(.(.(.(.(.(.(.(.^.(.{.(./././././././.~.~./.~.~.~.~.~.~.~.T.~.~.~.~.T.(.Y.T.T.T.~.T.T.T.T.Y.T.T.T.U.T.T.U.U.U.Y.U.U.Y.T.L.U.L.L.L.L.L.L.L.H.H.H.H.A.A.S.S.S.A.S.H.A.A.h.A.A.g.h.A.A.h.h.S.z.h.l.l.k.a.g.g.a.z.z.g.a.a.a.a.a.a.a.a.i.i.i.u.u.u.u.t.t.t.t.r.r.r.r.y.r.y.y.y.y.y.y.y.y.r.r.y.t.y.t.y.y.y.E w.y.E y.y.y.y.w.y.y.y.y.y.E w.y.y.y.y.E y.y.y.y.y.E y.y.y.r.y.E y.y.y.y.y.E w.y.y.y.y.y.y.y.y.t.t.r.r.r.t.t.t.u.t.t.u.u.u.u.t.",
+"Z Z Z C Z Z Z D D Z Z Z Z Z D D D D D Z Z Z D A Z Z Z Z Z Z A Z Z Z Z F F C Z Z D Z Z C B Z Z Z Z Z Z Z B D C Z Z F B Z Z Z D Z Z Z L Z L Z Z L D D D L H H H H H H D H H H H H H H H H Z H H H H J H L L H H H H H H H H H H Z G D D D D D D D D D Z D Z Z H Z G Z D Z Z Z Z C L Z Z Z Z Z Z Z H Z Z Z Z Z Z Z Z C Z Z C D C C Z C C Z C C D C C D B Z Z C Z C Z D Z Z Z Z Z Z Z Z Z C Z Z Z Z Z A Z B Z Z T h.A.A.A.A.H.G.H.H.L.L.S.L.Z.S.L.S.P.H.P.H.H.P.S.P.U.U.P.T.U.U.T.T.T.T.T.T.Y.T.P.T.T.!././.(./.(.(.^.`.|.^._.|._.|._.|.|.|._._._._.`.|.{._.{.|.(.(.(.(.(./.(.~.~.~.~.~.T.T.T.T.T.U.U.U.L.L.L.L.L.L.L.I.L.L.K.U.U.U.Y.Y.L.U.U.L.L.L.L.L.K.L.U.L.L.L.L.L.L.U.U.L.L.L.L.L.L.L.L.L.U.U.U.L.L.L.L.L.Y.L.L.L.L.L.L.L.L.L.U.U.L.U.U.Y.U.U.U.U.I.I.T.U.T.T.U.T.T.T.^.~.~.!.~.~./././././.~.~.~.[.~./.(.(././.(./././.(././././././././.~.)./././././.(.(._.(.[.}.}._.|._._.|.|._.|._.|. X X|.|. X|.|..X.X X.X.X.X.X|.|.|.|.|. X.X XdX@X.X.X'.zXzX.X'.zX.XzXdXdX.X.X.XdXzXzX.XdX.X.XzX.XzXzX.XdX'.dX.XdXdXdX.X.XzXzXzXxX.XzX.XxX.X'.dXzX.X.X.XzX.XxXzX.X$X.XdXdXdXdXcX XzX.XdXdXdXdX.XcXdXdXvXzX.XzXdXdXdXdXcXdXdX.XdXvXdX.X.X XdX.X.XxX.X.X'.zX.X.X.X.X'..X.X|..X|..X|..X.X.X X@X.X.XdX.X@XdX.XdX@X.X.X.X.X|. X.X.X X@X|.|..X.X'..X X|.|.`._.}.|.(._._.(.|.|.(._.|.`.|.|._. X|.|.'.'.|.|.|.}.{.|.|. X_.|._._.|.}.|.|.(._._.^.^.|.(.(./.(./././.!./.~././.~.~.T.T.T.~.T.T.T.U.Y.U.L.P.P.P.S.L.L.L.H.L.H.G.H.H.H.S.S.S.A.A.A.A.A.A.A.A.A.h.h.A.A.h.A.A.A.A.D.A.A.A.h.A.A.A.A.A.S.h.S.A.A.A.A.h.S.h.A.A.A.h.A.A.A.A.A.h.A.h.h.Z.h.h.k.g.f.k.g.f.f.f.f.i.i.z.f.f.d.k.a.a.a.a.a.a.i.a.a.a.i.a.a.a.a.a.a.a.a.a.a.a.u.a.a.a.a.a.u.i.f.i.i.k.i.a.g.f.k.h.k.l.z.l.l.l.h.A.A.A.A.A.A.A.A.S.S.S.S.G.H.H.L.L.L.L.U.L.P.P.P.P.P.T.P.P.U.T.U.T.T.T.T.T.T.T.T.T.~.T.~.T.~.~.T.~.~.!.T.^./././.^.^.(.(.(.^.(.(.(./.^./.E.[.~.~.[.T.T.T.T.T.T.T.P.P.P.T.P.P.Y.T.Y.hXP.T.T.T.T.T.T.T.~.T.T.~.~.~.~.!./.^.(.(.(.(.(.(.(.(._._._.|._.|._.|.|._.|.|.|.|.|.|.|.|._.`.(.^._._.`.{._._._._._._._._.(.(.(._.(.^.(.(.[._.^.(.].^.(.(.(.(.).(.(.(./.^.(.(.(.`.[.(._._.`._._.^.|.^.(.(.(.(.(.(.(.(.(.).(./.(.(././././.^./.~././.!.~.~.~.T.~.~.T.~.T.T.T.T.T.T.T.Y.T.T.T.Y.T.T.T.T.T.U.U.U.U.U.P.L.L.L.L.L.U.L.L.U.U.L.H.H.H.H.H.G.A.H.A.A.A.S.A.A.A.A.A.A.A.A.A.h.l.l.h.h.A.h.z.k.z.g.g.g.g.z.a.f.z.a.a.a.a.a.a.i.i.i.i.u.u.u.u.u.t.t.t.r.y.r.t.y.E r.w.r.r.r.y.r.y.y.y.w.E y.r.y.y.y.y.y.y.y.w.y.y.y.E y.y.w.E y.y.y.y.E y.y.y.y.y.y.y.y.y.y.y.r.y.y.y.y.y.y.y.y.E y.y.y.r.E r.y.r.y.r.E r.r.r.t.t.t.t.t.u.t.u.u.u.t.",
+"D B Z D D D Z Z Z Z Z Z F D Z D D D D H D D D Z Z D Z Z Z Z Z Z Z D Z Z Z B Z D C D C Z Z C Z B Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z D D D D Z Z Z D D D D Z J Z H H H H H H H H H F H H J H H H H J J L J J Z L J P H H H H H H H H Z L L H Z D L D D D D D D D Z Z H Z Z L Z L Z Z Z Z L Z Z L Z Z D Z D Z Z Z Z Z Z Z C C Z C D C C C C V Z Z C C Z Z C Z B D Z Z Z Z Z Z Z F D Z D B Z Z C Z Z Z Z A Z Z Z H Z.l.A.A.G.S.S.S.S.H.H.H.H.H.H.H.H.S.L.L.L.P.L.L.L.L.Y.P.Y.Y.T.T.U.T.T.T.T.T.T.T.T.T./.~././.(.(.{.`.(.`.(.`._._._. X_. X_. X_._._._._._.(.(.(._.(.(./.(././.~.~.~.~.T.T.T.T.T.U.U.U.U.U.L.U.L.L.U.L.I.P.U.Y.T.Y.U.T.P.P.U.U.U.L.L.L.L.L.L.L.P.P.P.Y.U.U.L.U.L.L.L.L.L.L.L.U.L.P.L.L.L.L.U.L.U.K.L.L.L.L.L.L.L.P.P.L.L.U.U.L.U.U.Y.L.I.I.T.T.T.Y.Y.T.~.T.~.T./.~./.~././.[././.~.~.!./././.(.~.(.(.^.(.(.(./.(./.(.(.(./.!./././././././.^./.(.(.{.`.^.`.`.(.`.(.`._._._.'._._._.|. X|.|.|. X.X|. X.X.X.X`.'.|.'..X'..X.X.X.X@XdXdXzX'..XzXzXzX.X.XfX X.XzX.X.X.XzX.XzX.XzXzX'.dX'..XzXzX.X'.zX.XzXzXzX.XzX.X.XzXzXzXzXzXzX'.vXzX.XdXdXdXdXzX.XzXzXdXdX XdXcXdXdXdXdXcX XdXdXcXcX.XcXdXzXdXzXzX.XdXdXdX%XdXdXdXdXdXxX.X.X.X.X.XdX X@X.X.X.X.X.X.X.X.X.X'..X'..X.X.X.X.XdX.XdX.XzX.XdX.X.X.X.X.X|..X'..X.X|..X X|..X'.|..X|.|.|._.|.^.|._.(.(._.{.{.`.^.|._._.|.|._.|.|.|.|.|.|.'.|.|.|.}.|.}.|.|.|._._.|.|._.|.`.`.(.(.^.(.(.~././././.T././.T.~.~.~.~.T.T.Y.U.U.U.Y.L.L.L.L.L.D.U.L.L.L.L.H.H.H.S.G.Z.H.h.A.A.A.A.A.g.A.g.G.h.h.h.l.l.D.A.A.z.A.g.A.A.A.h.A.A.A.A.A.A.A.A.h.A.h.A.A.A.A.A.A.A.A.A.A.j.A.h.G.l.l.l.h.h.h.h.k.z.k.k.k.k.a.g.a.f.f.a.a.k.a.f.a.a.a.a.i.d.a.i.a.i.a.a.a.a.a.a.a.a.a.i.a.a.a.a.a.a.d.i.a.a.f.a.a.f.z.a.k.g.h.h.g.g.h.h.A.A.A.A.A.A.A.G.S.S.S.G.S.H.H.H.H.S.D.L.A.L.L.L.P.P.P.P.T.T.U.T.T.T.I.T.I.T.T.T.T.T.T.~.T.~.~.T.T.~.~.T.~.~.~.~.~.^.~./.(.(.^._.{.).(.(.(./.(./.!.~.~.~.T.T.T.T.T.T.T.P.T.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T./.T./.T.~.(.(.(.(.(.(.(.|.^._._._.`._.|.|.|.|.|.|.|.|.|.|.|.`.`._._._._._._.(.|.^.|._._._.(.`.(.`.(.(.(.(.(.(.(./.(.(././.(.^.(.(./.(.(.(./.^.(.(.(.^.(.(.`.(.(._.[.(.(.^._._._.(.(.(.(.(.(.(.(.(.^.(./././.~.~./.~.~.~.T./.~.T.T.T.T.~.T.^.~.T.T.T.Y.T.T.Y.Y.T.T.T.T.T.T.P.T.P.P.T.T.U.U.P.P.P.P.P.L.L.L.L.L.D.L.G.H.L.S.H.G.S.H.A.A.S.A.A.A.A.A.j.G.l.l.z.G.g.l.l.A.l.l.l.h.h.g.f.a.z.g.a.f.f.a.f.a.a.a.a.a.i.i.i.u.u.u.u.u.t.r.r.r.r.r.y.r.y.r.r.r.r.y.y.y.r.w.r.y.r.y.y.y.r.E w.y.y.y.y.y.y.y.E w.y.y.y.y.y.y.y.w.E y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.w.y.y.y.y.y.y.y.y.y.w.y.E w.y.r.E r.r.t.t.t.r.t.t.t.t.u.t.u.u.",
+"Z Z Z B Z Z Z Z Z D D Z Z Z D D D D D Z D D Z Z D Z D D Z Z Z Z Z Z Z D Z Z D C Z Z Z Z Z Z Z Z Z Z Z L Z L Z Z Z D Z Z Z Z G Z Z D D D Z Z L Z D D H D H H H H H H H H H D H H H H H H H H H L L Z L Z L L L J H D H H H H L C L D Z Z Z H Z H D D D A A D D A Z Z Z D Z Z Z Z Z G Z Z Z G Z L D Z Z Z Z Z Z Z D C Z Z Z A A B C D C F Z C G V C Z Z Z Z Z Z Z Z Z Z C Z V D C Z Z D Z Z Z G C Z Z Z Z Z C T g.Z.G.A.H.S.A.J.S.H.H.H.H.H.H.H.H.L.L.L.S.S.L.P.U.L.U.P.Y.P.Y.Y.Y.T.T.T.T.T.~.T.~.T.T.~./././.(./.(._.`.(._._._.|._._._._._._._._._.(._.(.(.(.(.^.(.(./.(././.~.T.~.T.T.~.T.T.T.U.U.P.U.L.L.L.L.U.L.U.L.U.Y.U.U.Y.Y.U.P.P.L.P.L.L.L.L.L.L.P.P.Y.P.U.U.L.L.L.U.L.L.L.L.U.L.L.P.L.P.L.L.H.K.L.U.L.L.L.L.L.L.L.L.L.P.L.U.U.L.L.L.U.U.R.Y.U.T.T.T.T.T.~.T.~.~.(.~./.~././././././././././././.(.(.^.(.(./.(.(.(./././.)./.(.!.)./.(./././.^.^.^.(.(.{.^.`.(.(.(.`._._._._._._._._. X_.|.|.|..X|.|..X.X'..X.X|..X.X.X|. X.X.X.X XdX.XdX'.'.zX.X'..XzXzX.X|..XzX.XzXzX.XzXxXzX.X.XzX@XzXzXzX.X.XzX.XzX.XzX.XzX.XzXzX.XzXzXzXzXzXxX.XzXzXzXzXzXdX@XxX.X.XdXdXzXdX@XdXcXdX XcXdXcXdXdXdX.XdX.XzXdXzXdXcXcXfXdXzXzX.XdXdXdX.X.X.XxX.X.X@X.XdXdX.X.X.X'..X.X.X.X.X.X.X.X.X.X.XdX.X.XzX.X.X.XdX.XzX.X.X.X.X.X|..X|..X|..X.X|..X'.|.'.|._.|.|.(.(.(.(.^.|.^.{.(.(.(.`.|._.|._.|.|.{.|.|.|.|.|.}.|.|.|.|.}.}.}._.|._.|.{.|.(.`.(.^.{./.~.(.~.~.T.^.~.T.~.~.~.T.T.~.T.T.T.U.Y.L.U.L.L.L.L.L.U.H.L.L.S.H.H.H.H.S.G.G.A.A.A.A.A.h.A.A.h.A.j.h.h.h.h.h.d.l.h.A.A.A.A.A.A.A.A.A.G.g.h.A.A.g.h.A.A.A.A.G.j.A.A.A.z.A.h.h.l.A.l.l.h.h.h.h.h.z.g.g.k.k.k.k.g.k.x.f.f.f.f.f.f.a.a.k.a.k.k.i.a.k.k.a.a.a.a.k.a.a.a.k.a.a.a.a.a.a.a.a.a.a.a.a.a.f.f.z.f.f.g.g.l.g.h.k.S.A.A.A.A.A.A.G.A.A.S.G.S.G.H.H.H.H.H.L.L.L.U.L.L.P.P.P.T.T.T.T.T.T.T.T.T.T.U.T.I.T.T.T.T.T.~.T.T.~.~.T.~.T.~.~.~./.^.[.(.(.~.(.{.(.(.(.(.(./.(././.^.~.~.~.T.~.~.T.T.T.T.T.T.T.P.Y.U.Y.Y.Y.Y.T.T.T.T.T.T.~.~.T.T./.~./.~./.(.(.(.(.{.(.`.(._.^.|.`.^.|._.|.|.|.|.|.|.|..X|.`.'.|.|. X|.|._._.|.^.^._.(._.{.^.`.^.^.(.(.~.(././.(././.(./.^././.(.(.(.(.(./.(./././.^.(.(.^.(.(.(._.(.^.`._._._.(.(.(.(.(.(.[.(.(.(./.^.~./.~./.~./.~.~./.^.~.~.~.[.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.Y.P.P.T.L.U.U.U.U.P.P.L.P.L.L.L.H.U.H.L.H.G.H.L.H.G.H.A.H.A.A.A.A.A.A.A.h.l.l.l.l.h.g.l.A.h.h.l.h.h.k.h.g.g.g.f.g.f.f.a.f.a.a.a.a.a.i.u.i.u.u.u.t.t.t.r.t.t.r.r.r.y.r.y.r.y.y.w.r.E r.y.y.t.y.w.t.t.y.y.y.y.w.y.E y.w.y.E y.y.w.E w.E E w.y.y.E y.y.y.y.y.y.y.y.E E w.y.y.E y.y.y.E y.y.y.y.y.E E y.y.y.y.y.E y.r.r.r.r.t.t.t.r.t.t.u.u.u.",
+"Z C Z Z Z Z D D D Z Z D D D D D D D D D D D D D Z F Z Z D Z D D Z D Z D Z Z D Z D C Z Z Z Z G Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z B Z D Z D Z Z H Z Z D D D D D L H H H H H H H H H H Z H H H P H L H Z J L L H J L Z H H H H J Z H H H Z H Z H Z Z Z D D D D D D D H L Z G Z G Z Z Z Z G Z Z Z Z Z Z Z Z G Z Z Z Z Z Z Z C Z C Z Z C Z C C Z C Z V Z C Z Z Z D C Z Z Z Z Z Z Z G Z Z Z Z C D Z Z Z Z Z Z Z Z Z Z G T A.A.A.G.S.h.S.S.S.H.S.H.H.G.H.S.S.L.L.L.L.P.L.L.U.P.Y.P.T.P.Y.T.T.T.T.T.T.T.~.T./.~.~.~././.(.(.(.`.`.`._._._.|._. X_. X_._._._._._.(.(._.(.`.(.(.^.(./././.~.~.^.T.T.T.T.T.T.U.T.P.U.U.U.U.P.P.U.L.U.T.Y.U.T.U.L.L.U.L.L.L.L.L.L.P.L.P.P.P.P.P.L.L.Y.K.L.L.L.L.L.L.L.L.U.L.L.L.L.L.L.U.K.J.L.L.L.L.L.L.P.P.A.P.L.L.L.U.U.U.U.U.T.Y.T.T.T.T.T.T.~.T.T.~.~./.~.~././././././.~.^././.^.(.(.(.(.(.(.).(.(.(./.(./././././.~.!.!./.(.(.).{./.(./.(.^.`.(.(.(.(.^.^._.(._._._._.|.`. X`.|.|.|..X X.X X.X.X.X.X`.'.|.'..X.X X.XdXdX.XvX.XzX'..XzX.X.X.X.X.X.X.X.X.XzXzX.X.XdXzXzX.XzXzX.XzXzX.XvX.XzXzX.XzXzXvX.XzXzXzX.XcXdXzXzXzXdXzXdXdXdXdX.XxXzXdXdXdXdXcXdXdXdXcX.X.XcXdXdXcXcXcXdXcXdX.XdXdXdXdXzX.XzXdXdXdXdX.XzX.X.X.X'.xXzX X'..X.X.X.X.X.X|..X.X.X.X'..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X|..X X|.|. X.X.X|..X|..X|.|.`._.|.^.|.^.(.(.(.(.(.(.(.{.(.(.(.|._.{.`._.|.|._.`.|.`.|.}.|.|.|.|.}.}._._._._._.|.^.`.(.(.(./././.~.[.~.T.T.~.T.~.T.(.T.T.T.U.U.U.U.L.L.L.L.P.L.L.L.S.A.L.A.H.S.H.H.S.G.h.h.A.A.h.A.A.A.h.A.h.h.h.g.h.g.z.h.h.k.A.g.h.g.l.A.h.h.A.g.H.g.A.A.g.A.A.A.A.A.A.A.A.g.Z.S.A.h.A.h.l.l.h.h.S.h.h.h.z.z.k.k.k.k.g.z.k.f.f.f.f.f.z.k.f.k.a.k.a.f.i.f.i.i.i.f.i.a.k.a.k.a.k.a.k.a.a.k.a.a.a.a.a.a.a.a.f.f.z.z.a.k.g.z.h.l.G.A.A.g.A.h.A.A.G.G.A.Z.G.S.H.H.H.L.H.L.L.S.L.L.L.L.P.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.T.T.T.T.T.T.T.T.^.T.~.T./.~./.(.E././.{.(.(.(.^.^.(.(.(././.(.^./.~.~.~.T.T.~.T.T.T.P.P.T.T.T.T.Y.Y.~.T.T.T.~.T.~.~.~.T./.~.~.~./././.(.(.(.(.(./.^.|.`.(._._._.|.|._.|._.|.|.`.|.|.|.@X`.`._.}.}._._.^.(.(.(.(._.^.(.^.^.(.^.(.(.(.(.(.^.~.^././././././././.^.(.(./.!.(./.(.^.(.(.(.(._.(.(.`.^.^.`._.(.(._._.^.^.(.(.(.E.[.~.~./.!.~.~.T.~.T.~.~.T.T.~.T.T.T.T.T.T.T.T.T.T.T.U.T.T.T.T.U.T.P.P.P.P.P.P.S.U.U.P.L.L.P.L.L.L.L.H.H.L.D.L.D.H.H.G.S.G.S.S.H.h.A.A.h.A.A.A.h.h.h.l.l.l.l.l.l.l.l.h.h.h.h.k.k.k.g.z.z.a.f.f.g.a.a.a.a.a.i.i.i.u.u.u.t.t.t.t.r.E t.r.E t.y.y.r.y.y.r.y.y.r.y.r.r.y.r.r.E r.y.y.y.y.w.y.y.y.y.y.y.y.y.y.y.y.E y.y.y.y.w.y.E E y.y.y.y.y.w.w.E y.E E E E y.y.y.E y.y.E y.y.y.y.y.y.y.E y.y.r.r.r.r.t.t.t.t.t.t.u.u.",
+"Z D Z Z D D D Z D D D D D D D D D D D Z D D D D D D D D Z D D Z Z Z Z D Z D Z Z Z Z Z Z Z Z B G Z Z Z Z Z Z Z G G Z D Z G Z Z Z Z D Z D H Z Z Z D D D Z H D H Z G H K D H H H H H H H H H H H L L J J L Z L L H P H H P Z J H H H D H H H Z L Z D D D D D D Z D G Z Z Z Z Z Z L Z Z Z L Z Z H Z H Z L Z G C D Z C Z Z C D B Z Z C C Z C C Z Z Z Z Z Z C Z F B Z Z Z C Z Z Z Z Z Z Z G Z Z H Z D Z Z Z Z Z Z G T Z.A.H.A.S.S.S.H.S.H.S.H.S.G.H.S.D.F.L.S.L.L.L.U.P.P.P.P.P.P.T.T.T.T.T.T.T.~.T.~.T.~.~.~.{././.(.(.(.(.`._._._.|._. X_. X X_. X_._._._._._.(.(.(.(.(.(./././.~.~.T.~.~.T.T.T.T.T.U.T.Y.U.U.U.P.P.U.U.Y.U.U.T.U.T.Y.U.Y.U.L.U.L.L.L.P.P.P.P.P.P.P.P.T.L.L.Y.L.L.U.U.L.L.U.L.U.L.L.L.I.L.L.Y.L.L.L.L.L.L.L.P.P.P.P.Y.L.U.L.U.U.T.T.U.Y.T.T.T.T.~.T.T.~.~.~.~.~././././././.^./.^.[.(.(.^.~.^.(.^._.(.(.(.(.(.(.(./.!.(./.!.(.(./././././.(./.(.(./.^.(.(.(.(.^.^.`.(.(.(._._._.`.(._.|.|.|. X.X.X|..X.X.X.X.X.X.X.X.X.X.XdX.X.XdXdX'.zX.XzXzX.XzXzXzX.XzX.XzX.XzX.X.XzX.X@XzX.XzXzXzXzX.XzX.XzXvX.XzXzXzXzXzXzXzXzXcXdXzXdXdXzXzXzXzXzXdXdXdXdX.XxXdXdXdXdXdXdXdXcXdXdXcXdXvXdXdXdXcXdXdXdXmXdXdXzXvXdXcXdXdXdX#XdX.XzX.X.X.X.X.X.X.X.X.X.X'.'.'..X X.X.X.X.XdX@X.X X.X.X X.X.X.X.X XdX.X.X.X.X|.'. X|. X'.|. X.X X|..X'.|._.|._.`.{.}.(.(.(.(.(.(.^./.|.(.(.(.(.|.|.^.^.`.|.|.|._.}.}.}. X|.}.}.}.|._._._._.[.^.^.(.(.^.(.~.!.~.~.~.~.T.T.T.T.T.T.T.T.T.U.U.L.U.L.L.L.Z.S.A.L.L.U.K.U.S.H.Z.H.A.S.H.A.A.h.Z.A.h.A.g.g.g.h.h.h.h.g.k.h.g.h.h.h.h.h.g.h.A.h.h.h.h.g.D.h.z.D.h.A.h.h.A.j.j.G.h.g.l.l.l.l.l.l.l.h.h.z.h.h.h.g.z.k.h.k.g.g.f.g.g.z.h.k.f.f.k.f.k.a.f.k.k.d.k.k.k.k.k.d.a.a.a.k.a.a.a.a.a.a.a.a.d.a.a.a.a.a.f.a.i.g.k.k.z.g.g.k.h.g.h.A.G.A.A.A.A.A.A.A.Z.S.H.H.H.H.L.L.H.L.L.L.L.Y.Y.P.P.P.P.T.T.T.T.T.T.T.T.T.~.T.T.T.T.T.T.~.T.~.~.T.^.T.~./.~.~.~.~././.(.(.(.(.(.(.^.(./.(.(.(./.(.^./.~.~.~.~.~.T.T.T.~.T.T.T.T.T.T.~.T.T.T.~.T.T.T.T.T.~./.!.~.~.!./.(./.(.(.^.(.^.|.(.(.|.(._.|._._._.|.}.|.|.|.|.|.|.|.|.|.|.|.|.}.}.|.`.}._._.(.(.(.(.`.(.(._.(.(.^.(.^./.^.~././.~./././././.~.^.!./././././.[.E.{.(.^.(.(.(.(.^.{._.(._.(.`.{.|.(.(.(.(.^.^./.~./.~.~.T.~.T.T.T.~.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.P.P.L.Y.T.U.P.T.P.P.P.P.L.U.U.P.L.U.L.Z.L.L.L.L.L.G.L.L.H.H.S.S.S.S.S.A.h.S.A.A.A.h.h.g.G.h.A.l.l.l.l.l.h.l.h.h.h.h.h.h.h.k.g.a.z.g.a.f.a.f.a.a.a.a.i.u.i.u.u.u.t.t.t.t.t.t.r.r.r.r.r.r.y.r.y.y.r.y.y.r.E y.y.y.r.r.y.t.y.y.E y.E w.y.y.y.y.y.E y.y.y.w.E y.y.y.E y.y.y.y.y.E y.y.E y.y.w.E E y.y.y.y.E E y.E y.y.y.y.E y.y.r.y.y.t.y.y.r.r.y.t.r.t.t.t.t.u.",
+"Z Z F Z D Z D D Z Z Z Z D D D D Z L Z Z H Z Z Z D D D D Z H D Z D Z F Z D Z D Z Z Z G Z Z D D D Z Z Z Z Z Z Z Z Z D D Z Z D Z D Z D Z Z D D H Z D D D D H H Z L H H H H H H H H H H H H L H H L L J L L H H H H S L L L P Z J Z H H H L H D D H D D D D D Z D D Z Z L Z Z Z Z Z Z L Z Z Z Z Z G Z Z Z Z Z C Z Z Z Z Z C Z B D C Z Z Z C C Z C Z Z Z Z Z Z Z Z Z B D Z Z G B Z Z Z G D Z G Z D D H Z H F Z H Z G Z.S.Z.H.S.A.H.G.S.S.G.S.Z.H.H.H.S.L.L.S.L.L.U.Y.U.Y.U.P.T.Y.T.T.T.T.T.T.T.T.T.~.~.~.~.~././././.(.`.^.|.|._.^. X_._. X_._.(.(.`._._._._._._.^.^.`.(.(.(./././.~.~.T.~.T.T.P.T.T.T.U.T.U.U.U.U.P.P.P.L.U.T.T.Y.T.Y.I.I.U.L.L.P.U.P.P.P.P.P.P.P.Y.T.Y.I.U.U.L.L.L.L.U.U.I.L.L.L.U.I.L.L.Y.K.K.L.U.L.L.L.L.P.L.L.L.L.P.U.L.L.P.U.U.T.T.T.T.T.~.T.^.~.T.~.!.^.^./././.(.(./.(.(.(.(.(.(.(.(.(.(.(.{.(.(.(.{.(././.(.(./././././././././.(././.(.(.(.!.(./.(.(.(.(.(.(.(.(.(.`.`.{.|._.|.|.|..X.X|..X.X.X.X.X.X'..X.X.X.X.X@X.XdX XdXxX.XxX XzXzX.X.X.XdX#X.X.X.XzXzXzX'.zXzXzX.XcX.X.XzX@XJX.X.XcXvXzXzXzXzXzXzXzXzXcXdXdXcXxXzXzXdXzXdXzXzXzXdXzX.XdXdXdXcXdXdXvXdXdXcXdXvXdXdXcXdXdX.XzXzXdXcX.XzXzXzXzXzXcXvX XdX.XdX.X.X.XdX.X XdX.X.X.X.X'..X.X.X'.dX'..X.X.X.X.X.X.X@X.X'..X.X|..X.X X'.'.|.`.|. X X`.|..X.X.X'.|.|.|.|.(.`.(._._._.(.(.(.^.^.).^.^.(._.(.(._.^.(.|.{._.|._.|.|._._._.{.}.}.}.`.(.`._.^.`.(.(.{./././.~.~.T.~.T.T.T.T.T.T.T.Y.T.U.L.U.P.L.L.L.L.S.S.L.L.L.H.L.H.H.H.H.S.S.H.A.g.A.h.A.h.A.z.g.h.h.h.k.g.z.j.g.k.k.k.k.g.g.g.g.h.f.h.h.h.h.h.h.h.h.A.h.l.l.l.l.j.G.g.h.h.h.h.h.l.h.l.h.l.h.l.h.l.g.l.z.g.z.k.h.g.a.g.g.h.f.h.f.k.k.k.k.k.k.a.z.f.f.f.f.d.f.f.f.z.a.k.a.a.a.k.a.a.k.a.d.a.a.a.a.g.a.a.g.a.k.k.g.g.a.h.l.h.A.A.h.A.A.A.A.h.Z.G.A.S.H.H.H.U.D.L.L.S.L.L.U.P.P.T.U.U.U.T.T.T.T.T.T.I.T.T.I.T.T.T.T.T.T.~.T.~.T.~.~.T./.~.R.T.~.~./././.^.(.(.(.(.(.(.(.`.(.(.(.(.(.!.(./.~.~.T.~.~.~.~.Y.~.~.T.T.Y.~.T.~.T.T.T.~.~.~.~.T.~.~.~.~.~././.(.~.{.(.(._.|.(./.(.|.`._._._._._._.|.|.|.|.`.|.|.|.|..X`.|.}.}.}.}._._.(.(.^.(.(.(.(.(.(.!._.^././././.(.~.T./.~.~.~.!./.~.~./.~././././././././.^.(.(.(.(.(.`.^.(.(.(.`.`.`.(.`.(.(.^././.~.~.~.T.~.T.~.T.T.T.T.T.T.T.T.T.T.T.U.T.U.T.T.U.Y.P.P.P.P.P.Y.P.P.P.P.P.D.Y.U.L.L.L.L.L.L.L.L.L.L.L.H.L.H.H.G.S.S.S.S.S.S.A.A.A.A.A.A.A.h.A.g.h.l.l.l.l.l.l.h.h.l.h.h.l.h.k.l.h.g.z.g.f.d.a.a.a.a.a.s.a.i.u.u.u.u.t.t.u.t.t.t.r.r.r.r.t.y.r.r.y.t.r.r.y.y.t.E y.r.y.y.t.y.y.r.y.y.y.y.y.y.y.y.y.y.y.y.y.E y.E w.w.y.y.y.y.y.E w.y.w.y.y.y.E E w.E y.y.y.y.E E E y.E w.y.y.E y.y.y.E y.y.y.r.r.y.r.y.r.r.t.t.t.t.",
+"D Z D Z D H D D J L S L D H D H H Z H H Z Z P H D H D D Z Z D H D F Z D D D Z D D D Z Z D C D Z D D Z Z Z G Z H Z D Z H Z F G Z D Z D D D D Z Z D D D D Z H H Z H F H Z F J H H H H Z J H L L L Z J H Z L H H L J J Z J J L J J J Z H H H H D D D D D D H Z Z D L Z Z Z Z G L Z Z Z H G Z Z Z Z G Z H Z Z Z Z Z C Z C C Z D Z B D B Z C Z C Z Z Z Z F Z Z Z Z Z Z Z Z F Z D F Z Z Z Z D D D Z G Z Z D Z Z Z Z G Z.S.G.A.A.S.H.A.S.G.S.G.H.H.H.H.L.S.L.L.L.L.S.L.U.P.U.P.P.T.P.T.T.T.T.T.~.~.T.~.~.~.T.~././.^.(.(.(.(.^.{._._._. X_._._.|..X`._._._._.(._._.`.^.^.(.(.(.^.(.~./.~.~.T.~.T.^.T.Y.T.T.T.T.T.T.P.P.P.U.T.T.T.U.U.U.T.Y.U.U.U.P.U.P.P.P.P.P.P.P.P.P.T.U.U.I.U.U.L.U.L.U.L.Y.U.U.K.Y.I.L.L.L.L.L.L.Y.L.L.L.L.L.P.L.L.U.L.U.L.Y.T.T.T.T.T.T.T.~.T.~.T.~./.~.~.~././.!.(././././.(.(.(.(.(.(.(.(.(.^.].^.(.(.^.(.(.(.~././.(././.(.(./.(.(.(.(.(.(.(.(.(./.(.(.(./.(./.(.(.(.(.^.^.^.(.|._.|. X|. X.X.X.X.X'..X'.@X.X.X.X.X.X'.dX@XxXdX#XdX@XzX.X.X.XzXdXdX.X.X.XzX.XzXzXzXzXzXzXzXzXcXzXzX@X_.xX.XzXzXzXzXzXzXzXzXzXzXdXzXvXdXzXcXzXxXzXzXzXdXdXzXdX'.dXdXdXdXcXdXdXdXvXdXdXdXnXdXdXdX.XcXdX.XcXdXcXdXzXzXzXzXdXdXdX@XzX.XzXdXdX.X.XdX.X.XdX'..X.XdX.X.X.X.X.X.X.X.X.X.X.X X X|..X|. X.X.X X'.|.@X.X|.%X|.|.|.|.|.|.|..X|.|.|._.`.^.|.(._.(.(.(.(.^.^.^.(.(.{.(.(.(.(.(.(.(.{._.|.^.|._._.|.|.}.}.}.}._._.`.(.`.(.(.!././././.~.~.T.~.T.T.Y.T.U.U.L.U.U.U.L.L.U.L.L.L.L.L.L.L.L.S.L.G.H.S.H.S.A.A.A.A.A.h.h.h.z.l.z.g.k.l.h.h.k.g.g.z.k.k.k.h.g.g.g.g.h.z.h.h.S.z.h.h.g.z.g.h.l.l.l.l.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.z.g.z.g.h.f.h.g.g.g.z.h.k.h.f.h.g.k.h.k.z.k.h.f.k.f.f.f.f.f.f.f.a.k.a.k.k.d.a.k.a.a.a.d.z.a.a.z.a.g.g.a.g.k.k.h.h.h.h.z.g.A.h.A.A.A.A.H.J.h.A.G.S.H.H.H.L.L.L.L.U.U.L.L.P.P.U.U.U.U.T.T.T.T.T.T.T.T.T.T.T.T.T./.T.~.T.~.T.~.~.~.~.R././.(./.~.~./././.^.(.(.(.(.(.(.(.(.(.(.(.(./.~.)././.~.~.~.~.~.~.T.T.T.~.~.T.~.~.~.~.~.~.T.~.~.~.~.~././.~.(./.(.(.(.(._.(.`.(.|./.|.(._._.{.|.{.|.|._.|.|.`..X|.|.|.|.|.|.}.}.}._._._._.(.^.`.[.(.(.(.(.(.(.^.(.(./.(.~.[./.~./.~.~.~.~.~.~./.~.~.T././.!./././././.(./.(.(.(.(.(.^.`.`.(.`.`.(.(.(.^./.T.~.[.T.~.T.T.T.U.T.T.T.T.T.T.T.T.U.U.T.Y.U.U.T.U.P.U.P.P.P.P.P.P.P.P.P.P.L.L.L.L.S.L.L.P.L.D.L.S.L.L.H.H.H.H.H.G.S.A.S.S.z.A.A.A.h.A.h.l.A.A.h.h.h.l.h.l.h.h.h.h.h.h.h.l.h.h.k.k.g.g.z.a.g.a.f.a.a.a.a.a.i.i.u.u.u.t.t.t.t.t.t.t.r.r.r.t.y.r.E r.r.E y.y.r.E w.w.w.y.y.y.w.t.y.r.y.E w.y.y.y.y.y.E y.w.E E y.y.y.y.y.y.E y.w.E E y.E E E E y.y.E y.y.y.E y.y.w.y.y.E y.y.E y.y.E y.y.y.y.y.r.y.r.r.r.r.t.t.t.t.u.",
+"Z D D D Z Z Z L Z Z J Z D H H Z Z L J Z S H H D H Z D H J Z Z H D D D D Z D D D D D Z G C D Z Z Z Z Z Z D Z D D Z Z G Z D Z Z D D D D D D D D H D D D D H Z D H S F H H H H H H H P H L H H H L P S L L L H L L L H L Z Z L L Z L H H H H Z D H D D D D F D D D G L Z Z Z Z Z Z Z Z Z Z G H Z Z Z Z H Z Z D G Z Z C Z Z C Z Z Z C Z C Z B Z Z Z C Z Z F Z Z Z F Z Z Z Z Z Z Z Z Z G Z Z Z D Z Z Z Z D Z L Z D H e.Z.H.A.A.A.A.S.z.H.S.H.H.A.D.H.S.D.L.L.D.U.L.P.P.Y.P.T.P.T.T.T.T.T.T.~.T.T.~.T.T.~./.~./././.(.(._.(.|.^.|._._._._._._._._._._._._._._._._.`.(.(.(.(.(.(./././.~.T.~.~.^.P.T.T.T.P.T.T.T.T.T.T.P.Y.P.T.Y.T.P.Y.P.T.U.U.L.P.P.P.P.P.P.P.P.T.T.T.I.I.U.Y.T.L.L.U.P.P.P.P.U.L.L.L.U.L.L.L.J.L.L.L.P.L.L.L.L.L.P.L.L.L.L.Y.L.T.U.U.T.~.T.~.~.~.T.~.~.!./.~././././.(./.(.(.(.(.(.{.`.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./././././././.(./.{.(.{.(.(.(.(.(.(./././.(.(./.(.(.(.(.^.`.(.|._.|.|.|.|..X.X.X.X.X.X'..X.X.X.X.X.X'..XdX.XdXdXdXdXdXdX.XzX.X.XdXdX.XzXzX.XzXdXzXzXzXzXzXzXdX.XdXdXdXdX'.xXzXzXzXzXzXzXzXzXzXzXzXcXzXzXvXzXdXcXxXzXzXzXzXzXzXdXvX.XdXdXcXdXcXcXcXdXdXcXnXdXnXdXdXdX%XdXdXdXdXdXzXzXzXzXdXdXdXdX.XzXdXdXdX.X.X@X.X.X.X.X XdX.X.X.X.X.X.X.X'..X.X.X.X.X.X.X X|..X.X|. X'.|.|.|.|. X|._.|.|.|.|.|.|.|.|.|._.{._.(._.(.^.(.^.{./.(./.(./.(.(.(./.(.(.(.(.`.|.(.`.|.{.|.`.(.^.|.{.|._._._._.^.(.(.(.~./.~.~.~.~.~.T.T.U.T.U.U.L.L.L.L.L.U.L.U.L.S.S.L.S.L.S.G.L.G.L.S.J.S.A.A.A.A.A.A.g.S.z.h.l.h.k.k.h.h.f.f.h.a.z.k.k.k.k.z.k.g.h.g.g.h.h.h.z.z.k.k.h.k.h.l.z.h.h.h.h.h.h.h.h.g.h.z.h.k.h.k.z.h.h.h.h.h.k.l.z.z.g.g.l.h.h.z.z.h.g.g.g.k.h.k.h.f.g.z.f.g.f.k.k.g.f.k.f.k.k.d.k.a.k.k.a.a.x.k.a.a.x.a.a.k.f.g.z.a.z.g.z.g.l.h.h.h.h.A.A.A.A.A.H.H.A.S.H.S.L.S.U.L.L.P.U.Y.L.P.P.P.P.P.P.T.T.T.T.T.T.T.~.T.T.~.T.T.T.~./.~.~.T.~.T.~.T././.!.~.~.~./.^./.(.(.(.(.(.(.(.(.`.(.(.(.(.(.(.(.(./././.~.~.~.~.~.~.~.~.~.~.[.~.~.~.~.~.~.~.~.~.~.~.~./././././.(.^.(.(._._.|.^.|.|._.|._.`._._.|.|.|.}.'.|.|.'._.|.|.|.|.`.|.}.}.}._._.(.(.^.(._.(.(.^.(.(./.(././././././././.~.~.~.~.~.~./.~.~.~./.~./././././././.(././.(.(.(.`.(.(.`.(.^.(.(.(.(./.(.!./.T.T.T.T.T.T.T.T.T.T.T.T.U.T.U.U.T.U.U.U.U.U.U.P.Y.P.L.U.P.L.P.L.L.L.L.L.L.S.U.L.D.L.S.L.L.S.P.L.H.H.H.H.G.S.S.G.H.A.A.A.A.S.A.A.h.A.h.h.A.h.h.k.l.l.k.k.z.l.l.g.h.z.f.g.k.g.g.g.g.a.z.g.f.d.f.a.a.a.a.u.i.u.u.u.u.t.t.t.t.E t.r.r.r.y.r.r.r.y.y.r.w.y.w.y.r.t.E t.y.w.E r.E r.y.y.y.y.y.y.y.y.w.y.y.y.y.E y.y.w.E y.y.y.E E y.y.E w.y.y.y.E E w.y.y.y.y.y.y.E E E E y.y.y.y.y.y.y.y.y.y.y.y.y.E t.r.r.t.t.t.t.",
+"D D Z F Z Z H Z Z L Z L Z D L H L L D H H H D H Z H Z D Z H H G D D D D D D D D D Z Z Z D Z Z Z Z Z Z D Z D Z D Z G Z D Z Z Z D D Z D D D D H H D D D H H H H D H Z H H H H H H H H H H H L L H H L P Z L H H H L L L J L L J J H H H H H H H H D Z D D D D D Z Z Z L Z Z L G Z Z G Z L Z Z H Z Z G Z Z Z Z C Z C Z Z Z Z D B D Z C Z Z D Z C Z Z Z Z C Z Z A D Z Z Z Z Z Z Z Z Z Z Z D Z Z G D H Z D D J Z H J T h.H.H.G.A.G.S.S.S.S.S.G.G.A.U.U.D.Z.L.L.L.P.P.P.P.P.P.T.T.T.T.~.T.~.T.T.~.T.T.~.~.~.(././.(./.(.(.^.|.^.(._.{.'._._. X_._._._._._._._.`.(.`.`.(.`.(.(.^./././.~.~.T.T.~.T.T.Y.T.T.T.T.T.P.T.Y.P.U.T.T.T.T.Y.T.Y.L.Y.Y.Y.P.P.P.P.P.P.P.P.T.P.P.U.T.T.U.T.U.P.Y.L.P.P.L.U.U.L.L.L.U.U.U.L.U.U.U.L.P.L.L.L.L.L.L.L.U.L.Y.Y.U.T.T.~.T.T.~.T.~.T.~.~./.~.[./././.(./.(.(./.(.(.)._.(.^.`.(.(.(.(.(.(.).(.(.(.(.(.~.(./././.(.(.(./.(.(.(.(.(.(./.(./.(.(./.(.(././.(./.(.(.(.^.{._.|._.|.|..X.X.X.X.X'.'..X.XdX.X.XzX'.dX.XdXdXdXdXxX.XdXdXzX.XzXdX.XdX.X.XzXzXnXdXzXzX'.zXzXzXzXzXdXdXxXdXzXzXzX.XzXzXzXzXzXzXzXzXzXcXzXcXcXzXxXzXxXzXzXzXzXdXzXzXdXdXdXdXdXvXdXdXmXdXdXcXdXdXdXdXdXdXmXdXdXmXdXvXzXzXcXfXdXdXdXdXdXdXdXdXxX.X.XdX.X.X.XdXdX@X.X.X.XdX.X.X.X.X.X.X.X|..X.X.X|..X|..X'.`. X@X|..X|.|.|. X|.|. X|..X|.|._.|.|.|._._._.(.(.(.(.(./.(.(./.(./.(.!././.|.^.(.(.(.(.^.(.`.(.`.^.`._._.^._._.(.^.(.(./.(.(.~./.~.T.~.T.T.T.T.U.U.U.L.L.L.L.L.L.L.S.U.L.L.L.L.L.G.L.G.S.D.G.S.S.A.A.h.A.h.A.A.h.h.h.h.k.k.h.f.f.h.k.k.z.f.k.d.g.k.g.k.k.g.k.g.g.g.k.h.k.k.z.k.k.z.z.h.h.h.k.h.h.h.g.g.h.z.k.j.h.k.h.j.z.k.k.k.l.h.k.h.g.z.h.l.a.h.h.k.h.g.g.g.k.h.h.k.k.g.f.k.g.g.g.z.g.g.k.a.k.k.d.d.d.d.a.k.d.z.d.z.d.d.g.i.a.g.g.a.z.g.g.l.g.z.A.A.l.h.A.h.A.A.A.A.H.G.S.S.K.S.L.L.L.P.U.T.L.U.P.P.T.T.P.T.T.T.~.T.T.T.T.T.T.~.T.~.T./.Y.T.(.T.~.~.~.~.~./.!.R.(.~.~.(.!.!.(.(.(.(.(.`.`.`.(.(.(.(.(.(.(./.(.~.~./.~./.~.~.~.~.T.~.~.~.~.~.~.~.~.Y.~.T.~.~.!.^.^./.^.(.^.(.).{.`._._._.^.`.(.`.|.^.|.(._.|._._.}.|.|.|.@X`.|.'.|.|.`.`.}.}.}.}._.[.(._.(.(.(.(.{.{.(.(.(./.(./././././.~./.~.~.Y.!.~.~.~./.~.~.~.~.~.~.~.~./././.!.(./.(.(.(.^.^.`.^.`.`.(.(.(.(.(./.T.~.T./.T.T.T.U.T.U.U.U.U.P.T.U.U.U.U.U.T.U.L.L.L.P.P.L.P.L.L.L.L.L.L.L.L.U.U.H.H.Y.H.L.S.L.S.P.S.H.H.H.H.H.G.S.S.A.S.A.h.G.g.g.h.A.A.l.A.h.h.h.h.l.l.k.l.l.f.h.h.k.z.l.a.g.g.f.g.a.g.g.g.f.f.a.a.a.a.a.a.i.i.u.t.u.t.t.t.t.t.t.t.r.r.r.E r.r.r.r.t.y.R y.E y.y.y.y.y.E t.r.y.r.r.w.y.y.y.y.y.y.y.y.y.y.y.y.E y.y.y.y.y.y.y.y.E E y.y.E E y.y.w.E E E E y.y.E y.y.y.E y.y.y.y.E y.E y.y.E E y.y.r.r.E r.r.t.t.t.t.",
+"Z Z Z H D Z L Z D H D D H H L D H H H D H H H D D H H H H F H H H Z J H Z H Z L H H L Z Z Z L Z Z H Z Z Z Z G Z D D D D D D D D D D D D D D D D H Z K H H D F S H Z H H H H H J J F H H J H L L J J L J J L L Z D L Z P L L L Z J L P D H H H D H H F D D D D D Z D Z F D D Z Z Z Z F Z Z Z Z Z D D Z Z Z Z Z Z Z Z Z Z Z C Z Z C Z C Z Z Z Z Z Z Z Z Z Z Z H Z Z Z Z D D D Z D D Z H Z Z H Z Z Z D D D D D D D T n.S.S.S.H.H.A.H.A.S.A.A.H.H.H.H.H.L.L.L.L.U.L.U.Y.T.U.U.T.T.T.T.T.T.~.T.~.~.T.[.T.(.(./.(.{./.(.(.(.(._._._._.(.|.^.|._.|._.|.`.`.(._.`._._._.|.(.(.(.(./././.~.~.Y.~.T.T.T.T.T.T.T.T.T.P.T.T.Y.T.P.[.P.T.T.T.T.P.T.T.P.P.T.P.P.T.T.Y.Y.T.Y.Y.U.Y.Y.P.^.P.Y.Y.P.U.L.L.L.I.H.K.P.K.L.L.U.L.L.P.U.L.L.L.L.L.L.L.P.P.U.U.U.T.~.T.T.~./.T.T.T.~.~.!./././.(./.(./.(.(.(.(.].(.^.`.(.`._._._._.(._.(.(.(.(.(.(./.(./.(.(.(.^.(.(.(.(.(.^.(.(.(.(.!.(.(./.(.(./././.(.(.(.(.(.(.`.(.`. X_. X'.|. X.X.X.X.X|..X.X.XdXzX.X.X.XxX.XxXdXvX.XdXzX.X.X.X.XzX#XdXdXzX@XdXdXdXnXdXcX.XcXzX.XzXzX@XdXdXdXzXzXzXzXzXzXcXdXcXxXxXdXdXdXcXdXcXxXxXxXxXzXzXzXzXzXdXdXdXcXxXzXzXzXzXzXvXzXzXzXzX.XzXzXzXzXzXzXzXzXdXdXdXnXzXzXzXdXdXdXdXdXdXzX'.@X'.xX.X.X.X.X.X.X.X.X.X.X.X.X.X'..X|..X.X|..X|. X X%X X_. X|.[. X X|. X|.|.}.|.}.|.|._.|._.`.`.^.(.(.(.(.(.(.(././././././././.(.(.(.(.(.(.(.(.(.(.(.(._.^._.(.`._.`.^.(.(./././././.R./.T.T.T.T.T.XXU.P.P.L.L.L.L.L.S.L.L.S.S.L.H.L.H.H.H.S.H.S.A.A.A.A.g.Z.g.l.h.h.z.h.k.g.f.j.f.f.k.k.k.f.i.f.f.f.k.f.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.g.g.g.g.g.k.h.k.g.k.g.k.k.z.a.g.g.g.a.g.a.g.g.g.g.a.h.h.l.z.g.h.h.g.g.g.j.l.k.g.g.z.g.z.A.d.g.g.g.k.g.g.g.z.k.k.f.f.f.f.f.a.g.a.g.z.a.f.f.g.g.g.a.j.z.h.h.h.h.g.h.A.g.A.g.A.A.A.A.A.H.H.H.H.H.L.L.L.L.L.U.U.U.U.P.P.T.T.Y.T.T.T.T.T.T.T.~.T.T.T.~.~.~.~././.~.~.~.~.~.~.{.^.T.^.~././././././.(.(.^.(.`.(.|.(.(.(.(.(.(.(.(./.(.(.(.~.[.~./.~././.~././.~./.~.~.~.~.!.~.!.~.~./.!./././.(.(.^.(.(.^._.`.`.[.}.}.}.|._._.|.|._. X|._. X|.|.|.|.'.`.`.|.|.`.'.}._._.|.(._.[.(.(.(.(.(.|.(.(.(.(././.^.^.[.^.~.~.~.R.XXE.T././.T.T./.~.~.XXXX!.~.~.~././.^.^.(.(.(.(.^.(._.(.(.^.^.(.(./.(.~./.T.T.T.T.T.T.U.U.I.T.L.T.L.Y.I.U.T.L.L.U.Y.P.L.L.H.H.L.L.L.L.L.S.L.S.U.L.H.S.H.H.H.H.H.S.H.H.H.H.H.H.A.S.S.S.S.A.A.h.A.A.l.l.l.A.z.l.h.l.h.h.h.g.h.g.g.g.g.k.f.g.g.k.g.g.g.f.g.j.g.g.k.a.f.f.f.i.k.a.i.i.s.u.p.u.t.u.t.t.t.r.t.t.t.y.r.r.y.y.r.t.y.y.y.y.y.y.y.y.r.y.E E y.y.r.y.w.y.y.y.y.y.y.E y.E y.w.E y.y.y.E E y.y.E y.E y.y.E E y.y.E y.y.y.y.y.y.y.y.E w.y.y.y.E y.y.y.E E y.y.E w.y.y.y.w.y.w.r.t.t.t.",
+"D D H Z H H H H D D D D H H D L D H H H H H D H D K F H H H D H H Z Z H J Z H Z Z Z G Z Z L Z G H Z L Z Z D L Z D H D D D D D D D D H Z D H D D H H Z Z H F H D H H H D G H H H H H H H L H H J Z L L C H H J J P L L J J P L L S Z H H H H H H H D H H D Z D D G Z Z D D D Z D F G Z Z Z Z Z Z Z Z Z D Z A Z Z B Z C A A Z C A Z Z Z Z C Z Z C Z Z H L Z Z Z Z Z Z G Z D D D D A D D D H Z Z H D D Z D D D D D G b.S.D.S.A.H.A.A.S.S.S.S.S.H.H.H.H.L.H.L.L.U.L.L.L.U.T.Y.T.T.T.U.T.T.T.~.T.~.U.T.(.T.(./.(.^.(.(.(.(.(.(.(.(._._.^._.(._.^._._.(.`._._.|._.|.^._.(.(.(.(.^././.~.~.~.T.~.T.~.T.~.T.T.T.T.T.T.P.P.T.T.T.P.T.T.T.T.T.T.P.T.T.P.T.T.P.T.U.Y.U.P.T.Y.Y.Y.~.U.T.P.P.Y.L.T.L.U.U.L.U.L.P.Y.U.L.L.L.P.L.L.L.P.L.L.L.L.L.U.L.L.U.T.T.T.~.T.~.T.~.^.!.~.~./././.(.(./.(./.(.(.(.`.(.^.(.(.`._._._.(._.(.(.(.(.!.!.(.(.(.(./.(./.{.(._.(.(.(.^.`.^.(.(.(./.(.(./.(.(.(./.(././.(.(.(.^.`.(.`._.'. X'.|..X.X.X.X.X.X.X.X.X.XzXxX'..X@XzXdX.XxX.X.X.XzXzX.XzX'.dXdXzXzXdXdXdXdXdXdXdXdXzXzXfXdXdXdXdXdXzXzXzXzXzXzXzXzXcXcXcXcXxXxXcXxXdXxXxXxXzXzXdXzXzXzXdXcXdXcXzXzXxXxXzXxXzXzXvXzXzXxXzXzXzXzXzXzXzXzXnXdXxXnXcXdXdXdXzXzXxX.X.X.X XdX'..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X|..X.X|.|.'. X X X|.|. X X|. X|.|.|.|. X X|.|.|.|._._.^.(.`.(.(.(.(.(.!.(.^././././.!.^./.^.(./.(.^.(.(.(.(.(.(.(.{._.(._._._.^.(.(.(.^.(.!./.R.~.R.~.T.T.T.U.U.U.L.P.L.P.G.L.L.L.S.L.S.H.L.H.L.H.H.H.H.S.H.A.H.A.A.A.h.l.h.h.g.g.k.g.a.f.f.f.f.a.k.k.k.z.d.f.f.i.k.k.k.z.f.k.k.k.k.k.k.k.k.d.k.f.g.g.f.g.f.h.k.g.g.g.g.k.k.g.z.z.g.g.z.k.g.g.g.g.g.h.z.z.h.h.h.g.h.h.h.g.h.k.l.g.g.k.A.d.A.k.k.g.g.k.k.g.k.f.k.k.f.f.f.f.f.f.g.g.a.g.h.z.a.g.g.g.g.a.z.h.h.h.h.z.h.h.S.g.G.A.A.A.H.S.H.H.G.L.L.H.L.L.L.L.Y.Y.L.U.U.T.P.Y.T.T.T.~.T.T.~.T.T.T.~.~.~.~.!./.~./././././.~.~.E.T.^.^.[././.(././.(.(.(.(.(.`.`.^.(.|./.`.^.(.(.`.(.(.E.~.(././.{.~.~././.~.~.[./.~.!.~.~.~.!.T./.~././.(.!././.(.(.{._.(._.(.^.(.}.}.}.|.|.|.{.|.|.|.|. X.X|.|.|.|.|.|.|.`.|.|. X X|._.{._.^.|.`.(.(.(./.^.(.(.(.(.(./.!.~.~.!.~.~.T.[.XXXXXXT.~./.~.~.~.T.XXE./.~.~./.~./.T.(.(.(.(.(.|.[.(.{.(.(.{.(././.[.T.~.T.T.T.T.T.T.U.U.U.U.U.L.L.I.L.U.L.U.L.U.L.L.L.L.L.U.L.L.D.L.L.L.L.S.L.H.H.H.H.H.H.S.H.H.S.H.A.W.S.A.H.G.S.H.A.S.A.A.h.h.A.l.l.h.h.l.l.l.A.h.l.h.g.g.g.g.g.g.g.g.g.g.g.f.g.g.f.f.f.g.f.k.f.f.f.i.a.a.i.i.t.p.u.u.u.t.t.t.t.r.r.t.t.t.r.r.r.r.r.r.t.y.y.y.y.y.y.w.y.y.r.E t.y.y.t.y.y.y.y.y.y.y.w.y.w.w.y.y.y.y.y.y.y.y.y.E y.y.y.y.y.E E y.E y.E E E y.w.E y.y.E E y.E E w.E E y.y.y.E E y.y.y.y.y.y.y.r.r.t.t.",
+"Z S H H H H Z L D D H F Z H D L D H D H F H D H H D H H H Z H D Z H H Z Z Z H H H H Z Z L Z Z S Z Z Z Z D H Z Z Z Z D D H D D H Z D H Z H L H H H D H H H H H H H H H F H H H Z H H U H H L H H H J L H J J J Z J Z L L L Z L J J H H H H H H H H H H D D D D Z Z Z D D D Z D Z Z Z Z Z Z Z D Z Z Z Z Z Z Z Z C F Z C Z Z B B D Z Z C Z Z Z Z Z Z Z Z Z G Z Z Z Z Z D D Z D D D D D D Z D D H Z D D Z D D D D D G A.D.S.S.A.H.A.A.S.A.S.S.S.H.H.h.Y.H.L.L.L.L.U.L.U.L.P.U.T.U.T.T.T.T.T.T.~.T.E.[.E./././.(./.(.(.^.(._.(._._._.^.|.}.{.|.|._._.|._._.|.|.^._._.{._.(.(.(./././.~.~.~.T.T.~.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.T.P.T.T.Y.T.T.Y.T.Y.Y.T.~.P.T.P.T.T.U.U.L.T.L.L.L.U.U.L.L.L.L.L.L.L.U.L.L.L.L.L.L.L.P.L.L.U.U.T.T.T.T.~.~.~.~.~.~.(.(.~./.(./.(.(.(.(.(.(.(.^.^.(.(.`._._._._._._._.|.^.(.(.(.(.(././.(./.(.(.(._.[.(.[.(.^.(._.(.(.(././././.(./.(.(.(.^.(.(.(.(.(.`.(.`.|.|. X.X'.'..X.X'..XdXdXdXzXzXzXzX@XzXzXzXzX.XzX.XzXxXzX.X.XzXdXzXzXzXdXzXcXxXdXdXdXdXzXzXdXcXdXdXdXdXzXzXcXcXzXcX.XcXdXxXzX@XdXxXxXxXnXxXcXcXcXdXxXzXzXdXdXvXdXcXzXxXxXzXvXzXxXzXzXxXzXzXzXzXzXxXzXxXdXzXdXxXdXdXvXdXcXdXzXdXdXdXzX'.dX'..X.X XdX.XdX.X.X.X.X.X'..X X.X.X.X.X X X|..X.X|. X[.|.|.|.|.|.|.|.|.|.|.|.}.|._.}.}.}.|.`.(.(.`.(.(./.(./././.~.~./.~.!./.~././././././.(.(././.(.(.)./.(.(.(.(.^.(.(.(././.^.~.~.~.~.T.T.T.T.T.U.T.U.L.L.T.L.L.L.S.H.D.D.H.H.H.H.G.H.D.H.S.S.H.G.A.h.A.h.h.h.h.g.g.z.f.f.f.f.f.k.a.f.f.k.k.d.k.f.f.f.z.f.k.f.f.f.f.k.k.i.f.f.k.f.f.f.g.f.g.f.g.k.k.h.g.z.a.k.g.z.a.g.a.g.a.z.g.j.g.j.f.f.g.g.g.g.h.h.g.g.g.g.g.g.l.g.z.k.k.g.z.g.k.g.g.k.z.z.l.k.k.k.f.f.f.f.f.g.a.g.g.g.h.f.k.a.f.h.h.g.h.h.l.h.h.l.A.A.j.A.A.A.A.A.S.S.Z.G.L.A.H.L.U.L.U.L.L.Y.U.T.T.T.T.T.T.T.T.T.Y.~.T.~.T./.~./.~.^.~.(.~./././././.~././.~./.(.~.(./.(.^.{.(.(.(.(.(.^.(.|.(.(.(.(.(.(.`.(.(.(.[.(.~././.~.~./././.~./././.~.~./.~.~.!.~.~.~././././.^.(.(.(.(.(.(._._._._.|.}.}._.|.|.|.|.|.|.|.|.|.|.|.|..X|.`.`.`.`.`.|.|._._.`.`.(.|.|.(.^.(.(.{.|.(.(.(.(./.(./.~.~.~.~.[.T.~.~.~.~.~.XXE.~.~.~.XXE./.~./.~./././.~.^.(.(.(.(.(.(.(.(.(./.(./.~.[.!.T.~.T.T.T.U.T.T.U.Y.U.U.R.R.L.L.L.L.L.L.U.L.L.D.L.L.S.L.L.D.U.S.H.H.H.H.H.H.H.H.H.S.S.S.H.h.A.H.G.A.A.G.H.H.A.A.A.A.A.A.l.l.l.l.l.l.l.l.h.h.h.h.g.h.g.g.g.g.g.g.g.f.g.f.g.j.a.f.f.g.g.g.k.k.k.f.k.f.a.i.i.i.u.u.u.u.u.t.t.E t.r.t.y.r.r.y.r.r.r.y.r.r.y.r.y.E r.y.y.y.r.t.r.t.w.y.y.y.y.y.y.y.y.y.y.y.E y.y.E y.y.y.y.y.y.y.E y.y.y.y.y.y.y.y.y.y.E w.y.y.E w.E w.E y.y.y.w.w.y.E w.w.E w.E w.y.y.y.y.y.r.r.t.t.",
+"Z D H H D Z J Z D H D H H H H H H H H H H H H H H H H H H H H H H H Z H H H Z H Z Z H Z Z Z Z Z Z H Z Z D Z H Z Z D D H D D D D H H D H Z Z H H H H H H H H F H F H H H H H H H H H H H H L L H L H H L L Z L L L L J L L L H L P P P H P H D H H H D H D D D D L Z D D D Z Z D G Z Z Z Z Z Z Z Z B Z D B Z Z Z C Z Z Z C D Z C C Z Z Z Z Z Z Z C G Z Z Z H Z Z Z Z Z Z G Z Z Z D D Z D Z D G Z D D D Z Z Z D D C e.S.S.S.G.A.G.A.S.S.S.S.S.A.H.H.A.L.L.L.L.L.L.Y.U.Y.Y.U.U.U.T.T.U.~.~.T.~.XX[.^././././.(.^.(.(.(.(.(.(.(.(._.}.}.}._._.(._.|.[._._._._.|._._.^.(.(.^./.(.~.!.~.~.~.~.T.T.T.T.T.T.T.T.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.P.T.T.T.T.Y.Y.T.T.T.Y.P.U.L.^.Y.T.Y.P.P.U.I.I.L.U.U.Y.L.U.L.L.U.L.L.U.L.L.L.L.P.L.L.L.L.U.U.U.T.T.~.~.T.^.T.~.!.~.~.(.(./.(.(.(.(.(.(./.(.(.(.(.(.(.`.(._._._._._.(.(.(.(.(.(.(./.(.(./.(.(.(.(.(.(.(.(.(.(.(.].(.(.(.(.^.(.(.(.(.(./.(././.(.(.(.`.^.`._. X|.|..X|..X.XdX.X@X.X.XdX.X'..XzXdXzXzX'..XxX.XzX.X.X.XzXzX.X.XzXzXdXcXzXdXdXxXdXdXzXdXzXdXdX@XxXdXcXzXzXdXdXnXdXxXxXcXxXxXxXxXxXxXxXxXxXzXcXcXxXxXxXzXnXcXcXdXcXxXzXxXxXzXxXxXxXxXcXcXdXzXzXzXzXdXxXzXzXxXdXdXxXcXdXdXdX%XzXdXdXzXzX'.dX'..X.X X'.@X'. X X.X X@X.X.X.X X|.|.|..X'. X|. X X|.|.|.|.|.|.|.|.|.|.|.}.|.|.|.|.}.}.[.(.`.(.^.(.(.(./././.~.!.!.~.~./.~.~././.~./.!./././.(./.(.(.(.^.(.(.(.`.(.(.(.~./././.~./.T./.T.~.T.T.T.U.U.U.L.D.H.D.L.L.H.L.D.S.H.H.H.H.G.D.S.S.S.A.A.A.A.A.h.l.h.h.l.g.g.a.f.f.f.s.f.f.k.a.f.f.i.k.f.i.f.i.i.d.i.k.i.f.f.k.k.k.k.f.f.d.f.f.f.j.g.g.g.k.g.g.g.g.g.a.g.f.g.a.g.a.g.a.g.f.f.g.f.g.g.g.g.f.h.z.k.g.g.g.h.g.g.g.g.k.l.A.k.g.k.k.Z.l.l.k.h.k.z.z.k.k.k.f.f.a.g.a.a.g.f.k.k.h.h.z.h.l.l.l.l.h.h.l.l.g.G.j.A.A.A.S.A.H.H.H.H.U.L.L.L.L.U.P.U.Y.Y.T.T.T.T.T.T.T.T.T.~.T.~.~./.~.~.~././.~./.(./.(./././.(.^./.^.(.(.^.(.(.(.(./.^.`.^._._.(.(.(.^.`.(.(.(.(.(.{.(.^.^././././.~././.~./././.~././.~.~.~.~./.(.~././././.!././.(.(.(.(.(._._._.{._.}.}.}.}.|.|.|. X|..X|.|.'.|.|.|.`.|.|.`.`.`.|._.|._.|.(._.|.|.{.{.|.^.{.(.^.(.(.(./.~.~.~.~.~.~.T.~.~.T.~.~.XXXXXXT.~.~.~.~.~./.~./././.(.(././.^.(.(.^./.(./.(./././.~.~.~.~.~.T.T.T.U.U.U.Y.U.L.U.L.L.R.R.Y.L.U.L.S.L.U.S.S.L.L.H.D.A.S.H.H.H.D.H.H.G.A.G.G.S.S.S.A.H.A.A.A.A.G.A.g.A.A.A.A.A.A.h.A.l.l.l.l.l.l.h.g.z.h.z.h.g.g.g.j.f.j.f.g.g.g.g.f.g.g.j.j.f.z.k.k.f.a.f.k.i.i.i.i.i.i.u.t.u.u.t.t.u.r.t.r.r.r.r.t.r.r.r.r.y.r.y.y.r.y.y.y.y.y.y.y.r.y.r.y.r.w.y.y.y.y.y.y.y.y.w.E E y.y.y.y.E y.E E y.y.y.y.E E y.E E y.y.y.y.y.y.y.y.y.y.y.y.y.y.E E E E E y.E y.E y.y.y.y.y.y.r.r.t.t.",
+"Z Z H Z H Z H H F H H Z H H H H H H H Z H H H H H H H H K H D H Z H Z H Z H Z L H H Z L Z H Z L D Z Z Z D G D D H Z H Z H H H H H D H D L H H L H H H H H H H Z H H H H H H H H H H D P K H P H L L L L J H L L J L P J J L L L H L U H H H H G H H H D D D D D Z H Z Z H D D Z C Z Z Z Z Z Z G D D C D D Z B C Z C C Z Z Z C Z Z Z Z Z C G Z Z Z Z G H G Z Z Z H Z D D H D H H Z Z Z Z Z Z Z L D D D D D D Z D H T H.H.S.F.G.l.z.H.A.S.H.G.H.H.H.H.H.L.L.L.L.L.L.L.U.L.U.Y.Y.U.T.T.~.T.T.T.~.~.[.T././.(.(.(.(.(.(.(.(._._.|.(.(.|._._.}._.}._. X`.|._._.|._.(.(.(.(.(././././.~.~.~.T.~.Y.T.U.T.U.P.Y.T.T.T.T.T.T.P.~.T.T.T.[.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.T.T.T.T.P.T.P.T.T.P.P.P.U.L.L.Y.L.L.L.L.L.L.L.U.U.L.L.P.L.U.L.L.L.L.L.L.L.Y.I.T.T.~.~.~.~.^.T.(.^.~.(.(.(.(.(.(.!.(.(.^.(.(.(.(.^.[._._.{._._._.[.(._.(.(.^.(.(.(.(.(.(.(.(.(.(.(.`.(.(.(.{.(.(.(.(.(.^.^.(.^.(.(.(.(.(.(.(.(.(.^._._.|.|.|.|..X|..X'..X.X.X.X.X.XzX.XzXzXdXzX'.zXzXcX.X.XdXdXdXdX.XzXzXdXxXzXzXzXzXzXcXdXcXdXzXzXzXzXdXdXzXzXzXcXcXdXcXzXcXcXxXcXcXcXnXdXxXxXxXxXxXxXxXzXxXzXzX.XcXdXzXcXzXcXzXxXxXzXxXxXxXxXzXxXxXxXzXzXxXxXcXcXdXdXdXdXdXzXdXcXcX.X.XdX.X@XdX'.'..X.X@X.X.X.X|..X.X.X.X.X|..X|. X|.|.|.|.|.|.'.}.|.}.|.|._. X_.|.|.}.|.}.|._._.`.(.`.(.^.(.`.^.^.(.(.^.~.[.~.~.~.~.~.T./.!.~.~.~.~./././.(./.(.~./.^.(.(.(.(.(.(.(.^.(./.~.~.~.~.T.T.T./.T.T.U.P.P.P.P.U.L.L.D.L.G.L.L.S.L.S.S.H.H.S.S.S.A.H.A.A.G.l.l.h.l.j.g.k.f.f.f.i.a.a.a.a.f.g.a.a.a.i.z.a.a.a.z.f.i.k.a.z.a.z.k.a.k.k.k.f.f.f.f.k.k.k.z.g.g.g.k.k.a.g.a.g.a.g.g.f.f.f.k.f.f.a.g.g.g.g.g.g.f.g.f.g.g.g.g.g.g.h.h.h.h.k.h.l.g.g.h.h.h.h.h.h.z.h.h.z.z.k.f.g.g.g.g.g.z.h.k.g.h.z.k.l.h.h.h.G.g.G.g.Z.h.S.g.A.S.S.A.H.H.L.S.L.L.L.L.U.L.U.T.T.T.T.T.~.T.~.Y.Y.T.~.T.~.~.~.E.!././././.^.(./.(.(.(././.^.(.(.(.(.(.(.(.(.^.(.(._.`.^.(._.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(././.~.!./.~.~.~./.~./.~.~.~.~.~./.~././././././.(.(.(.!.(.`.(._._._.|.|._.|.|.|._.|.|..X|..X.X.X|..X|.`.`.`.|.|.`.`.}.|.|._._._.|._.|.`.|.^.^.(.(.(.(./././.~.~.~.~.T.~.E.T.XXT.~.T.~.(.E.XXXXXXE.U./.~./././././././.(./.(./.(././.~./.~.~.[.~.~.~.T.T.T.T.T.T.Y.Y.I.I.L.Y.U.L.L.L.L.L.L.U.L.S.L.S.S.S.K.H.H.H.H.H.H.H.H.H.A.S.G.H.S.G.S.A.A.A.A.H.A.A.A.G.A.A.A.A.A.A.A.h.h.h.l.l.g.z.h.k.h.z.h.h.h.h.g.g.g.g.g.g.f.f.f.f.j.f.g.f.f.f.g.i.k.f.f.f.i.a.a.a.a.i.i.i.u.u.u.t.t.t.t.t.t.t.y.t.E r.r.r.r.r.y.r.y.r.y.r.y.y.r.y.w.y.y.r.r.w.y.r.E y.y.y.y.y.y.E E w.y.E E y.y.y.y.E y.y.E y.E y.y.y.y.y.y.y.y.y.E w.y.y.y.w.y.y.E w.y.E E E E y.E y.y.y.y.y.y.r.r.r.r.t.",
+"H H H L H H H H H H H H H H H H H H H P H H H H H H H H D D H H H H L Z H Z H F L Z L Z H Z L Z D H Z H D D D D D L H H H D H Z H H H H Z L H Z H H H H H H H Z H H H H F H H H H H H H H H H H L J H H L L L L Z L Z L L L H L H H L L H H H H H D D H D D D D Z S D H Z Z Z D C D Z Z Z Z Z B C Z Z Z C Z Z D D Z Z C B Z D Z Z C C Z Z Z Z Z Z H Z Z Z H Z Z Z Z Z G Z H G Z Z Z D L L Z L Z D Z D D D D D D H U Z.G.H.H.H.G.G.S.G.S.A.H.S.H.U.H.L.L.H.L.L.L.U.Y.L.U.U.Y.U.T.U.U.U.T.~.~.T.~.~.^./.(./.(.(.(.(.^.`.^.(.(.|.(._._._.|.}.}.}.|._._._._._._._.(.(.(.(./././.~.~.~.~.T.~.T.~.T.T.T.T.T.Y.Y.T.Y.T.T.Y.~.P.T.T.P.P.T.T.E.T.T.T.T.T.T.T.T.T.T.P.T.T.Y.T.Y.T.T.U.Y.P.Y.P.Y.U.L.U.K.U.U.P.P.P.L.L.L.L.P.L.L.U.L.P.L.L.L.L.L.L.L.U.U.T.T.~.T.~.T.^.[.(.(.(.(.^.(.(.(.(.(./.(.(.(.(.(.`._._._.|._._._._._.(.(.(.(.(.(.(.(.(.(.(.{.[.(.(.^.(.(.(.(.(.(.(.(._.`.`.`._._.^.(.(.(.(.(._.`.{.(.(.(.|.|.|.|..X.X.X.XdXzXzXzXdX.XzX.X.XdXzX.XzX.X.X.XcXdXdXdX%X.XzXzX.XzXzXzXzXzXzXzXdXzXzXzXzXzXxXcXxXzXzXzXdXzXcXdXxXxXxXcXcXdXcXcXcXxXxXxXxXcXxXxXxXxXcXcXxXdXcXcXcX@XcXcXcXzXxXxXcXxXzXxXxXxXvXxXxXxXzXzXdXdXnXcXxXzXzXdXdXzXzX.XdXzX.XdXdX.X.XcX'..X.X.X.X.X.X.X X X.X|..X|.|.|.|.|.|.|.|. X}. X|.|.|. X|.|.|.}.}.|.}.|.(.`.`.^.(.(.(.(.(.(.(.~.(.~.~.T.T.~.T.T.~.T./.~.~.~.~.~.~.!./.T./.(./././.(.(.~.(.(.(././.~.[.~.[.~./.~.T.T.T.U.T.P.P.L.L.G.P.P.P.L.G.G.G.S.S.H.H.G.G.S.S.G.A.A.h.g.l.l.l.l.l.j.z.g.a.a.g.a.a.a.a.a.a.i.f.i.a.i.z.a.z.a.a.f.i.k.a.a.a.a.a.k.a.a.a.f.k.f.f.k.k.k.f.j.g.k.k.k.g.f.g.a.g.a.a.f.f.f.a.f.g.g.k.g.f.a.g.f.j.f.g.g.a.f.g.z.g.z.g.k.k.h.k.d.D.h.g.h.h.h.l.l.h.h.k.k.k.k.k.k.k.g.g.h.g.g.z.f.h.h.h.l.h.h.g.g.j.A.A.A.A.A.H.S.S.H.H.H.L.S.H.L.L.L.K.U.K.U.T.T.T.T.T.T.T.T.~.~.~.~.~.~.^.^./././.(././.^././.(.(.(.(.{.^.(.(.(.(.^.(.(.`.{._.(.^.`.|._.(.{._.^.`.|.(._.(.(.(.(.^.(.(.(.(.(./.^.[././././.^.~./.~././.~./.~././.~./././././.(./.(.(.(.(.(.(.|._.|.|.|.|._.|.'. X|.|. X|..X X|.@X`.`. X|.|.|.`._.|.`.|. X_._.|.|.(.|.`.`.^.(.(./.(.(./.~.~.~.~.~.T.U.XXT.~.~.~.T.T.~.U.U.XXT.[./.~./.~./././.!./.!.(././././.!./.^.~.~.!.~.~.!./.T.T.~.T.U.Y.U.Y.I.U.L.U.L.L.L.L.U.S.H.S.L.L.S.S.S.H.S.A.H.h.H.H.S.S.S.S.A.S.H.A.A.A.A.A.A.A.h.A.A.A.A.A.A.A.h.g.A.A.h.l.l.l.l.l.l.g.h.h.h.f.h.j.h.g.g.j.f.g.z.f.j.f.j.f.g.f.f.h.f.g.z.f.k.k.k.k.a.i.g.a.i.i.i.u.u.u.s.t.t.u.t.t.t.t.r.r.t.t.r.r.y.r.y.y.y.w.E t.y.y.y.t.y.t.y.r.r.r.y.y.y.y.y.y.y.w.E E y.y.y.E y.E y.y.E y.y.E y.E y.y.y.y.y.w.E y.y.y.y.w.E y.E E y.y.E E y.y.w.w.y.y.E y.y.y.y.y.r.r.r.r.t.",
+"Z Z L Z L D Z Z Z H Z H H H H L H H H H H H H H H H H F H H D H H Z L Z D L D H H H H L L Z L Z L H Z L H H L H H Z Z L Z L H H H D H H H H H H H L H H H H H J H H H H H H H K Y Z H L H P H L L L L J L L J L D L L L L L J L P H L H H H H H H H H H D D Z D Z Z D D D Z Z G D Z Z Z Z Z C Z C G Z B Z C Z Z A Z Z C Z C C Z C Z Z Z Z Z Z H H H Z Z Z Z Z Z L Z Z H D Z D D Z D Z Z Z Z L Z D D D A A D D D Z L e.H.H.H.D.G.S.S.G.H.G.H.H.H.H.H.L.S.L.L.L.L.L.Y.L.U.L.Y.U.U.U.U.T.T.T.~.~.~.~.~.^.^.(./.{.(.(.^.(.`._.(.(.(._._._.}.^.|.{._._._._._.(.(.(.(.(.(.(././.^.~.~.~.~.~.T.T.Y.T.Y.T.T.U.P.T.T.T.Y.Y.T.~.Y.~.T.[.P.T.(.~.T.[.T.T.T.T.T.T.T.T.^.P.T.Y.P.T.T.T.T.Y.Y.Y.P.U.L.U.L.L.U.P.L.P.L.L.L.P.L.L.P.P.L.P.L.L.L.L.L.P.U.U.U.U.T.T.T.~.[.~.{./././.(.(./.(.(./.(./.(.(.(.(.(.(.(._.(._._._.{.|._._._.(._.(.(.(.(.(.(.(.(.{.(.(.(.(.].(.(.^.^.`.(.(.(.|.{.`.(._.^.|.(.|.(.(.(.(.(._.|._.{.|.`.|.|..X'.'.zX.XzXdXdXzX.X.XvXzX.XzXzX.XzXzX.XdXdXvXdXzXzXzXzXzXzXcXzXzXzXdXdXzXzXzXzXzXzXzXxXxXzXzXvXcXcXdXcXxXxXcXxXmXnXdXnXcXxXxXxXxXxXxXxXxXxXxXcXcXcXcXvXxX.XcXcXvXxXcXcXxXcXvXxXxXcXxXxXxXxXxXxXdXdXxXdXzXzXdXcXzXzXdXdXdX@X.XdX.XdX.X.X.X|..X.X.X X X.X|. X X'.|.|. X X|.|.|.|. X|.|.|.|.|.|._.|.|.|.}.[._.{._.(.^.(.(.(.(.(.(.^.(.[.~.~.T.T.T.T.T.~.~.~.~.~.~.R.(.R./.~.~.~.~.~./.~./.~.(.(.(.(.~.(./.~.~.~.T.T.T.T.~.T.T.U.U.U.L.P.L.L.L.H.D.L.H.H.S.S.L.S.G.S.S.S.A.h.A.A.A.A.h.l.h.h.k.a.f.g.a.z.a.a.a.a.i.a.a.a.a.a.a.a.a.a.z.a.a.a.k.i.g.a.k.a.k.a.k.a.k.k.k.f.f.d.k.k.k.a.a.g.g.z.g.z.i.a.a.f.a.f.f.f.f.f.k.g.k.a.z.g.a.i.g.f.g.g.g.g.g.g.z.z.g.g.f.l.k.g.A.g.h.g.h.h.h.l.h.h.h.h.h.k.g.z.g.z.g.g.h.h.g.l.l.h.l.l.l.A.G.A.A.A.A.h.A.A.A.S.H.S.H.H.H.H.L.L.L.L.I.Y.U.T.I.T.T.T.T.T.~.~.T.~.~.~.~.~./.!./.(./.(./.(.(.(.(.^.(.`.(.(.(.(.(.(.^.(.(.|.|._._.`.|.|.^._._.`.^.^.(.`.(.(.(.(.(.(.`.^.(.^.(.[./.^.(.!./././.!./.~./././.~.~./.~.~./././././.(.(.(.(.(.(.(.|._.|.}.|.{._.|.|..X|..X|..X.X.X|.|..X|.|.'.|.|.|.`.|.`.`.|.|.|.|.|. X{.|._.^.`.^.(.(./.(./.!.~.~.T.^.T.~.T.~.(.~.~.~.XX~.XXXX~.~.(.~.~./.^.~.~.~./.(././.[./.(././.[.~.[.~.~.~.~.!.~./.T.T.T.T.T.T.U.T.T.L.U.U.L.L.L.L.S.L.S.L.L.S.S.S.S.S.H.H.A.A.H.A.S.A.S.A.A.A.A.A.A.A.A.A.A.A.A.A.h.A.A.A.A.A.A.A.A.A.A.l.h.h.l.l.k.z.h.k.h.h.k.g.h.g.g.g.d.a.g.g.f.g.g.f.g.f.j.g.g.g.a.f.k.f.f.a.k.z.i.a.a.i.i.u.u.u.t.t.u.u.t.t.t.t.r.t.r.r.r.r.r.r.y.y.r.y.r.y.r.r.y.y.r.r.y.r.r.y.y.w.y.y.y.y.w.y.E w.y.y.E w.y.y.y.E y.y.E E y.y.y.y.y.y.y.y.y.y.y.y.E E y.E w.y.E y.y.E w.E E y.y.y.y.E y.y.r.r.r.r.r.r.t.",
+"Z H Z H Z L D P H H L H H H H L H P H H J H H H D F H H D D D K H H H H H L D H L Z L Z Z L L L H D Z L Z H Z H L J Z L Z H H H H H Z H H H H H L H H J H H H H H H D H H H H G H H H H H H H H L H L H P Z L H J J Z J Z J L L L H L H H H H H H H D D D L H D D H D D D Z Z Z Z Z B G Z H Z C C Z Z F Z C B C C Z C Z Z C Z Z Z Z C Z Z Z Z Z Z Z Z G H G Z L Z Z G Z D D D D D D D D L Z Z Z D D D H D D D Z Z G e.Z.H.S.H.A.S.H.A.H.H.H.H.H.L.H.H.L.H.L.L.L.L.U.U.U.Y.L.U.U.U.U.T.U.T.~.~.T.~.[./././.(.(.(.(.(.(.^.{.(.(.`.(._.[.(.|._._.|.|.|.|._._.(._.[.(.(.^././.~.[.~.!.~.~.~.T.Y.T.Y.T.T.P.T.T.P.T.T.Y.Y.P.Y.~.T.T.~.~.~.T.[.T.T.T.T.T.T.T.T.T.P.P.Y.T.[.T.T.T.Y.Y.Y.U.P.Y.L.U.U.L.L.L.P.P.L.L.L.L.L.P.L.L.U.L.P.L.U.L.L.U.P.U.U.T.T.T.~.~.T.E././.(./.(.(.(.(.(.(.(.(./.^.(.(.(.(.(.(._._._._._.|._._._._._.^.|.(.(.(.(.{.(.{.^.{.{.(.`.^.^.`.`.(.`.|._._._._.|.[.|._.(.(.(.(._._.(.{._._.`.`.`.|.|..X|.@X'.zXzXdXdXzXzXzX.XzXzXzX.X.XzXzXdXzXdX.XdXzXzXzXdXzXzXzXzXcXzXcXzXcXzXzXzXxXzXzXzXzXxXxXzXdXnXnXcXcXxXcXcXcXcXJXcXcXxXxXnXcXxXxXxXxXxXxXxXcXvXcXcXxXxXcX.XxXxXdXcXvXvXcXvXxXxXxXxXxXxXxXxXdXnXcXdXzXzXdXdXdX@XdX.XdXzX'.zX.XdX@X.X.X.X.X|. X X.X'.|.|.|.|.|.|.|._._.|._.|.|. X}.}.|._.|.|.|._._.|.|._.|.^.(.(.(.(.(.^./.(.^.^.~.T.^.T.T.T.T.T.Y.T.T.T.T.T.T.T.~.~.!.~.~.!.!.~.~./.~./.~.^.(./././.~.~.~.T.T.T.T.T.T.T.U.U.P.P.L.U.L.L.P.P.G.H.L.D.L.A.S.G.S.S.A.h.h.l.A.A.l.l.h.h.k.k.z.f.g.a.i.a.a.a.a.i.i.a.a.i.a.a.a.a.a.a.k.i.a.f.i.i.a.a.a.a.a.i.k.k.f.d.f.f.f.f.f.d.f.g.a.g.a.a.z.i.z.a.f.k.k.a.f.f.f.f.a.k.a.g.f.f.f.j.j.g.f.f.g.g.g.z.g.g.g.z.f.h.g.g.Z.d.h.h.h.A.l.l.A.h.h.g.k.g.h.h.g.g.z.l.h.g.h.l.l.l.h.l.z.h.G.j.h.A.A.A.A.A.S.A.H.H.H.H.L.L.S.U.L.Y.U.T.U.Y.T.T.T.T.~.T.T.(.^.~.~./././././.(.(./.(.(.(.(.`.`.(.^.(.^.(.(.^.(.`.|.|.|._._.|.|.|._.|.{.|.(._.`.(.(.(.(.(.(.^.(.(.(.(.(.(.(.(./.(.(././.!././././.~.~.~.~.~././.T.(./.!.(./.(.!.(.^.(.^.^.|._.}._.|.|.|. X|. X.X.X.X.X.X X.X X|.|..X|.|.|.'.|.`.`.`.|.|. X X|.|.|.|.|.`.(.(.(.(.(.(.!.~.~.T.T.~.~.~.~./.T.~.~.[.~.~.~.~.~.~.T.~.~././.~./././././.(.(././.~.!.T.R.~.T.~.Y.~.Y.T./.T.T.T.U.T.U.U.L.U.L.L.L.L.L.L.L.U.H.S.S.S.L.S.S.S.S.S.S.H.A.S.S.S.A.A.h.A.A.A.A.G.g.Z.g.j.S.h.h.h.A.G.j.G.h.h.A.j.h.h.h.l.z.k.g.h.k.h.h.z.h.h.g.g.g.a.g.g.k.g.g.g.f.h.g.g.f.f.g.g.g.f.k.z.f.g.z.i.g.a.a.a.i.a.u.u.t.u.u.t.i.E t.t.t.r.t.r.t.r.r.t.y.t.y.r.y.r.y.y.y.r.E r.r.y.r.y.r.E w.y.y.y.y.w.E E E E y.E y.E E E y.y.y.y.y.y.y.y.y.y.y.y.y.E w.y.y.y.y.y.y.y.E E w.E E E y.E y.E y.w.y.y.y.y.r.r.r.r.t.",
+"H Z Z J Z H H H H H H H H H J H U H H H H H Z H H H H H H H H D D D D H F H D D J J H F H H D H L U H D Z H H H Z D H H H H H H H U H H H H H H H H H H H H U H L H H H H H H H H H Z U H H H H P L Z L Z L L H H L H L Z L H U H H L H H H H H H Z H H D D D D H Z Z Z H Z Z G Z G C Z Z Z C G C Z Z C G C C Z Z C Z C C F C Z Z Z C Z G D C D H H Z G Z Z G Z Z Z D D D D D Z G Z Z G Z J G Z Z Z D Z Z Z D Z D Z T F.A.S.H.S.G.G.H.H.H.H.H.H.S.K.H.H.L.H.L.L.U.U.U.U.P.P.Y.Y.T.T.T.T.T.~.~.(././././.(./.(.(.(.(.(.(._._._.(.`.(.`.(.|._.|._.|._.|._.`.(.`.^.(.(.^.(././.E.(.~./.T.T.T.T.T.T.T.P.P.T.T.T.T.T.T.T.Y.~.T.^.T.T.~.~.~.~.~.Y.T.T.T.~.~.T.T.T.~.Y.Y.!.T.T.T.T.T.Y.P.P.P.U.T.P.L.L.L.L.L.L.L.L.P.S.L.L.U.U.L.L.Y.L.L.U.P.P.T.P.P.Y.T.~.~.[.~.^.(./.(.(.(.{.[.(.(.(.(.!.).(.(.(.(.`.(.(.^.`._._._.|.^.^._.(.^.{.(.^.|./.(.(.^.^.^.^.(.(.[._._._._._._._.|.|.{.|.|._.`.`.`.(.(._.^._.|.`._.(.|._.|..X.X.X@XdX'.zXzXdXzXzXzXzXcXzXzXdXzXdXzXzXdXdXxXdXzXzXzXzXzXzXxX.XzXcXxX@XdXdXdXdXxXzXzXzXxXxXxXxXxXxXxXxXxXvXnXxXnXnXnXnXnXnXnXnXxXnXxXJXxXxXJXnXnXcXcXcXxXcXxXxXxXxXxXnXnXxXnXnXxXxXcXxXxXxXxXdXdXxXdXzXnXdXdXcXdXdXxX'.@X'.dXzX.XdX.X.X.X.X.X.X X|.|.|. X}.}.}._.|.}.}.{.}.}.|.|.{._._.|.|._._._.|.|.|.^.`.(.(.`.(.(.(.(.(.T.(.~.[.T.~.T.T.T.U.T.Y.T.T.T.T.T.T.T.T.T.T.~.T.~.T.~.T.~.~.~.~.~.(.~.~.~.~.~.~.~.T.~.T.T.Y.Y.Y.Y.Y.L.L.P.P.P.U.L.D.L.G.H.H.H.H.H.S.A.A.A.A.g.G.l.l.l.h.l.h.k.f.f.f.f.a.a.a.i.i.a.a.a.a.a.a.a.a.a.a.s.a.a.a.f.f.a.a.a.a.a.a.a.a.k.a.d.k.i.k.k.k.d.z.a.h.g.a.a.g.g.f.i.f.f.f.s.f.f.j.g.a.a.g.a.g.k.i.d.f.f.f.z.g.a.g.j.f.x.h.g.g.h.h.l.z.z.l.h.h.G.l.l.l.l.l.h.h.h.h.z.h.h.h.h.h.h.A.h.h.h.h.h.A.g.Z.A.A.A.A.A.A.S.S.H.H.H.L.L.H.L.S.L.L.U.U.T.T.T.T.[.T.~.T.~.!.~.~.^././././.^.(.(.(.(.(.(.|.^.|.(.|.^.`.(.|.[._._.`.`._.|.|.|._.'.|.|.|.`._.{.|.`.(._.|.(.^.|./.{./.|.(.`.(.(.(.(.(.~.(.(./././././.~./.~./.!./././././.(.!././.(.(.(.(.^.^.`.|.^.|._.}.|.'. X X|..X.X|. X.X.X|..X.X.X.X|. X|.|.|.'.|. X.X|.'..X|.|.`.|.|._.[._.{.(.^././././.{.^.~.~.~.~.T.[.~.~.~.~.(.~.~.~.~.~.T.(.[.~.~././.~.~./././.(.~.~.T.~.~.T.T.~.T.~.T.~.~.Y.T.T.L.I.L.P.Y.L.U.L.L.L.A.L.L.L.S.S.H.H.S.A.H.A.G.A.A.h.A.g.H.H.g.A.A.h.A.h.A.A.A.h.h.h.l.l.l.l.A.h.G.h.l.h.h.A.l.h.l.h.h.A.l.k.l.k.l.k.l.k.h.h.h.k.f.k.k.k.k.k.g.g.z.k.g.g.g.g.f.a.z.f.a.z.a.g.z.a.g.a.i.i.i.i.u.u.u.p.t.u.t.t.t.t.r.r.r.r.r.r.r.y.t.y.y.y.r.r.E r.r.y.t.t.r.y.r.y.y.y.y.y.E y.y.E y.w.y.E y.E y.E y.y.y.y.y.y.y.y.y.y.r.y.y.y.y.y.y.E y.y.y.E w.y.y.E E w.y.y.y.E w.y.y.y.y.r.r.r.r.t.t.",
+"Z L Z L H H H H H H Z H H H H H H H H H H H H H H H H H F H F D D D H H H H K H F G H H H H H H H Z H H H H H H L H Z H H H H H H H H H H H U L H H H P H H H H L H H P H H H H H H H H H H H L H H L L L L H J Z H H H J H L H L H J H H H H H H Z Z Z H D D D Z G H D Z Z Z D Z Z F Z Z Z Z C C Z Z Z V C C C C Z C B C Z Z C Z Z B B Z D C D Z Z Z Z Z Z Z Z Z L D D Z D Z Z H Z Z Z L Z Z L H G Z Z D D Z Z Z Z T Z.D.S.G.H.A.H.H.S.H.H.L.H.L.H.L.L.H.L.L.L.L.L.U.L.P.Y.P.P.P.T.T.T.T.~.~.~.~.!./.(./.(.(.^.(.(._.(._.(.(._.(.(.`.(._.|.[.}._.`.(._.^.^.(.(.(.^./.(./.(.~.~.T.~.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.P.~.T.T.~.T.T.~.~.!.~.~.~.~.(.T.[.T.T.T.T.T.T.T.T.P.T.T.T.T.T.T.U.T.P.P.L.P.L.Y.L.L.L.L.L.L.U.U.L.L.L.L.L.U.U.P.L.P.U.U.P.T.P.T.~.R.T.~.[.~./././.(.(.(.^.(.(.(.(.`.(.(.(._.].(.^.`.`.^._._._._.{._.{.|.^.|.(.`./.|.(.(.^.`.`.|.`.`.|.(._._._.|.|._._.|.|.|.|._.(.|.(.`.`.^.|.{.^._.`.|._.|.|.|.'..X.X XzX.X@XdX.XzXzXzXdXcXzXzXzX.XzXzXdXdXdXxXzXzXzXzXzXzXzXxXdXcXxXxXxXxXcXxXxXxXzXvXzXxXxXxXxXxXxXxXxXnXxXnXcXnXnXcXnXcXxXxXxXxXnXzXxXvXxXcXcXcXcXcXcXcXxXxXxXxXxXxXxXnXnXxXxXxXnXfXcXcXxXxXcXcXnXdXdXcXdXdXdXdXdXdXzXzXdX.XzX.X.X.X.X.X.X.X X X'.|.|.|.|. X|.|.}.}.}.}.{._.|._.|.|.}._.|._.(.`.^.(.(.(.(./.^.(.^./.(.(.~.(.~.(.~.T.T.T.T.T.T.P.T.P.T.T.T.T.T.~.T.T.T.T.T.T.T.~.T.~.~.~.~.T.~.~.~.~.T.~.T.~.T.T.T.T.P.Y.P.U.L.L.P.U.H.H.L.L.H.H.H.H.G.A.A.H.A.G.h.A.A.l.l.l.h.g.g.j.l.f.f.a.k.f.a.a.a.i.u.a.i.i.i.i.i.i.i.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.d.i.i.z.z.d.d.k.i.a.a.a.a.z.i.s.a.a.g.a.f.f.f.f.f.f.z.g.a.g.k.i.g.f.f.f.g.g.g.g.g.f.j.j.a.j.l.k.z.h.h.h.l.h.h.g.l.l.h.h.D.h.h.h.h.g.h.h.h.h.h.A.h.h.A.A.A.A.g.A.A.A.A.A.h.S.H.A.S.H.S.H.H.L.H.L.H.L.L.U.U.U.T.T.T.T.~.T.~.~.~.~.~././.^././.(.(././.(.`.(.(.(.^.|.(.|._.|.|._.{.|.`.`.|.|.|.|.'._.|.|.|.`.|.`.|./.|.|.[._.^.^.`.|.(.(.(.(._.(.(.(.(.(./.(.(.(././.(././.~././././././.^.~././.(./.(.(.(.`.(.`._._._.|.|.}.|.'..X X X|..X|..X|..X|.|..X.X|.|.'.|.'.|.|. X|..X|. X|._.|.|._.|.|._.`.(.(./.^././.E.!.~.~.~.~.~.~.~.~.~.~.T.~.~.~.T.~.~.~.T.~.~.~./.~.(././.(.~.T.~.~.T.T.T.~.T.~.T.~.T.T.T.T.T.T.T.U.Y.L.L.U.I.L.L.L.L.S.U.H.H.S.S.S.H.A.S.A.A.S.A.A.A.H.g.A.A.A.A.A.h.A.A.h.h.l.l.l.l.l.l.h.h.A.A.A.D.D.h.A.l.l.h.h.l.l.g.A.l.l.l.l.h.h.k.k.k.k.z.f.k.k.k.g.k.k.k.g.h.a.g.f.z.f.g.f.g.a.a.a.f.a.a.a.i.u.u.u.u.u.u.p.t.t.t.t.t.r.r.r.w.r.t.y.r.y.t.y.y.w.w.r.y.r.r.r.r.y.r.r.r.E y.w.y.y.y.y.E y.E E w.y.E y.y.y.E y.y.y.w.E y.y.y.y.y.y.y.E y.y.y.y.E y.E y.y.E E y.E E y.y.y.y.y.y.t.r.r.r.t.t.t.t.",
+"Z J Z H Z L H H H H H H H J J H H H H H H H H H H H H H H H H H F H H H H H H H H H H H H H H H L L H H H H D H H H L L H H H H H H J P H P H H H P H U H P J H L J L L L H J G H G K H L H H H P H H H L H H L J H H H H H L H H H H H H H H H Z H P H D D D D Z H Z Z D Z H D Z Z Z Z B Z Z B Z C C Z C C Z C Z C B C C C D Z Z Z Z G Z C D Z Z Z Z D L H Z L H D D D D D H Z Z Z G Z Z Z G Z Z Z H Z D D Z G Z Z U Z.S.H.S.H.H.S.H.H.H.H.H.H.S.S.H.L.L.L.L.L.L.L.L.L.P.P.P.P.P.T.T.T.T.T.~.~.~././././.(.(.(.(.(.(.(.(._._._.|.{._.|._.(._._._.^._.(.(.(.(.(./.(./.!./.T.~.~./.T.~.T.T.T.T.T.T.T.P.T.T.T.T.T.~.Y.T.T.T.~.~.~.~.~.~./.~.T.~.~.T.T.T.T.T.T.T.T.!.T.~.T.[.T.T.T.T.U.U.T.U.U.L.U.L.L.L.P.L.S.P.P.U.U.U.L.L.U.L.L.U.U.Y.T.T.T.T.T.R.~.~.~./.[.(././.(.(.(.(.(.(.(.(.!.(.(.(.(.`._.(.^.^.^._.(._._.{.(.^.`.(.(.`.(.(.^.^.|.`.`.[.(.(._._.|._.|._._._.|.|.|.|.{.|.|.`.|.{.`.(.|._.{.`.^.^.`.`._.`.|..X.X.XdXzXdXdXdXzXzXzXzXdXdXdXxXzXzXzXzXdXxXdXdXzXcXzXcXdXcXxXxXcXcXxXxXdXxXdXdXzXzXzXxXvXvXxXxXxXxXnXxXnXxXcXmXnXnXnXnXnXnXnXnXnXxXxXnXnXnXnXnXmXcXcXcXcXcXnXxXcXxXnXvXnXnXnXxXnXJXxXnXcXJXxXxXxXdXcXxXdXxXnXdXdXdXxXdXzX'.xX.X.XdXxX.X.X.X.X.X.X|. X|.|.}.}.}.{._.}.}.|.|.|._.|.|._._.}.}.}._.|.|.|.(.(.(.(.(.(.(././.(.~.(.~././.T.T.T.T.U.U.P.P.P.P.T.U.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.^.~.~.~.~.~.T.~.Y.T.T.P.T.P.P.U.L.P.P.P.L.L.S.S.L.H.H.G.H.G.A.H.S.A.A.A.h.h.h.h.h.h.h.l.k.f.f.g.a.k.a.a.a.i.i.i.i.i.i.i.s.u.i.i.s.a.i.a.i.a.a.a.a.i.i.i.i.a.a.d.a.f.i.z.i.k.i.z.a.g.s.f.g.a.a.k.i.a.a.a.g.f.f.f.f.z.a.g.g.a.g.g.i.f.f.f.f.g.g.g.j.z.k.f.h.f.f.k.h.h.z.l.l.h.l.l.l.l.h.l.l.h.h.h.h.l.l.h.l.g.A.h.A.A.h.h.A.A.A.A.A.A.A.S.S.Z.H.G.S.L.L.L.S.L.L.L.L.L.U.U.U.T.T.T.~.~.T.~.~.~.~.~.~./.(./.(.(.[.|.^.^.|.(.`._.(._._.{.{.|.(._.|.|.|.`.`.|.|.|..X@X`.'.|..X|.|.`.|.|._._.[.|.|.(.(.(.(.^.(._.(.(.(.(.(.(.(././././././././.~.!././././././././.(./.(.(.(._.(.(._._._.|.|._.'.|.|.|..X|..X|. X X.X|..X.X.X|..X'.|. X|.'. X|..X.X X|.|.|._._.|._.|._.^.(.(.(.^././././.^.!.~.~.~.~.~.~.(.~.T.~.XXU.~.T.T.~.~./.~.~././.~.~.~.~.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.U.U.U.T.P.U.U.U.L.L.L.L.L.L.L.H.H.H.K.Z.A.H.H.A.A.A.A.A.h.h.A.A.Z.j.A.A.A.A.h.h.h.h.h.g.h.h.l.l.G.g.h.l.h.A.A.l.l.l.z.h.k.g.g.g.l.l.d.l.h.k.h.k.g.k.k.h.g.k.k.k.k.k.g.z.g.g.g.g.z.a.g.f.a.g.i.g.a.g.a.a.i.i.i.i.u.u.p.t.t.t.t.t.r.r.t.r.r.r.r.r.r.r.y.w.r.E y.t.y.r.r.y.y.r.y.y.y.y.E y.y.y.y.y.E y.y.y.E w.E y.y.E y.y.y.y.y.y.y.y.y.y.y.y.w.y.y.y.y.y.E y.y.y.E y.y.E E y.y.y.y.y.y.w.r.r.r.t.t.t.t.u.",
+"Z Z H Z H H Z L Z H H H H H H H H H F J H H H F H H H F F F H H Z K H G H H H H H H H H H H H Z L Z H H H H H H H H H D L D U H H P H H H P U J H H H P H P H H J H L H H L H H Z H H H H H L H H H H H H H H Z H H H H H H H H H H H H H H H H L H H Z D D D D Z Z H Z Z D D D Z Z Z D D Z Z G G C C C Z C Z C C C D Z Z Z C Z Z C Z Z Z G Z Z Z G Z D Z Z G Z Z D D D Z D D D H Z Z H Z Z Z Z Z Z Z Z Z G D Z H Z G e.Z.H.z.H.S.H.S.H.S.H.S.H.L.L.L.L.L.L.L.L.L.L.L.L.P.P.P.P.T.T.T.T.T.~.T.~.~.~././././././.(.(.(.(._.(._._./.|.(.^.|._.|.|.(.|._.(._.(.(.(.(./.(./.(.~./.~.T.~.~.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.~.Y.~.~./.~./.~.~.~.~.T.~.T.T.~.T.~.T.T.T.T.T.T.P.T.T.T.T.T.U.U.L.L.L.L.L.L.L.P.U.P.P.P.U.L.L.L.Y.L.Y.U.Y.U.U.T.T.T.T.T.~.~.~.~.~.(.^.(.(.(.(.(.[.(.(.(.(.(.(.(.(.(.(.^.`.`.(.^.(.(._._.`._.|.(._.^.|.(.{.).^.`.`.(.}.|.|._.|._.|.|._.|.|.|.|.|.|.|.|._.|._.|._.^.`.{._.`.`.`.^.`.`.|.|. X.X.X.X.XdXdXdX'.zXzXzXdXxXdXdXzXzXzXzXcXdXnXcXzXdXdXxXcXcXxXxXcXcXxXxXdXdXdXMXxXzXxXxXxXxXxXxXnXcXnXxXnXnXnXnXnXnXmXnXnXnXcXnXnXnXnXnXnXnXnXnXnXnXnXnXnXnXxXxXnXxXnXnXnXmXzXJXcXnXcXnXcXcXxXxXxXcXcXzXcXdXdXnXdXdXdXxXzXzX'.zX.XdXdXdX.X.X X.X.X X X|.}.|.}.}._.|.}.}.^.{._.{._._.|.`.}.}.[._.|.^.^.`.(.(.(.(././././.~.~.~.~.T.T.T.T.T.T.U.U.P.P.P.U.T.U.T.U.T.U.U.Y.T.T.U.T.T.T.T.T.T.T.T.T.~.~.~.T.~.~.~.T.T.T.T.T.T.P.Y.L.P.P.P.D.S.L.H.H.G.H.H.S.H.H.A.h.S.A.A.A.h.l.h.h.h.l.k.k.f.f.a.f.a.a.i.s.a.i.i.i.s.t.i.u.i.u.u.i.i.i.i.a.a.a.a.a.i.i.k.k.a.a.a.a.z.i.a.a.i.z.d.f.a.a.a.a.g.i.f.a.a.f.f.s.f.f.f.f.a.z.a.g.f.a.a.f.f.a.a.g.a.g.g.a.j.a.f.j.k.j.j.k.h.l.l.z.h.G.g.A.A.A.l.l.A.h.A.h.l.h.A.A.A.A.A.A.A.G.A.A.A.A.S.A.A.S.S.S.J.H.S.J.S.S.L.L.L.L.L.U.U.U.U.T.T.T.T.T.T.T.~.~.~.~.~././././.(.(.(.(.(.(.(._._._._.|._.|.`.|.|._._.|.|.'.|.|..X|..X|..X.X.X.X.X.X|.|.|.|._.|._.|.^.|./.`.(._.(._.(.(.|.(.(.(.^.(./.(././.(.^.~./././.(./.(./.(./././.(.^.{.(.(.(.`._._._._.|.}.|.|.|.|..X X X X|..X.X X|.|.|.|.|.|.|.|.|.|. X|.|..X X.X|.|. X|.|._.|._.(.{.(.{.^./././.~./././.T./.~.~.~.(.(.T.XXXX~.~.~.~.T.~.~.~.~./.~.~.(.T.~.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.Y.Y.T.U.U.U.I.I.L.L.L.H.S.L.S.S.H.H.H.A.S.A.h.h.A.A.A.A.A.A.A.j.G.h.g.A.A.h.h.h.h.h.g.h.z.h.z.l.l.l.l.l.h.A.l.h.l.l.l.l.l.l.l.l.l.l.l.l.k.h.h.k.k.h.h.k.g.g.g.k.k.k.g.g.g.g.f.g.f.z.g.a.g.i.z.a.f.a.a.a.i.a.i.i.i.u.u.u.u.u.t.t.t.t.r.r.t.r.r.r.r.r.r.y.y.t.y.r.r.y.y.r.E t.y.r.r.w.y.y.y.y.y.y.w.y.E y.w.E E y.E y.y.y.E y.w.y.y.y.w.r.y.w.y.y.y.w.y.w.E w.y.E E y.y.E y.E y.E y.y.y.w.r.r.t.r.u.t.t.u.",
+"S J L Z H H H Z H H J H H Z H H J H H H H H Z H H H H H L H Z D H H H H H H H H U H H H H H H H D H H H H J H H H H H H H P H L Y L U H J H H H U L P H P H P U J J J H H H H H H H H H H F H H H H H H H H H H H J H H L L H H H H Z Z J H H H H H H H Z Z D D L Z Z Z D Z Z Z Z Z Z B D C D C C C C B C B C C C Z C C B Z C Z D Z C G Z Z Z Z D D D Z Z D D D D D D D D D D D G Z Z Z Z Z Z Z Z L D G Z D D D Z D Z T H.S.A.S.H.S.H.S.S.H.H.S.L.S.L.L.L.L.L.L.L.L.L.U.U.U.P.T.P.T.T.T.T.T.~.~.~.~.~./.!././.^.^.(.(.(.(.(._.(.{.(.|.{.`.`.`.`.(.|.(.(.(.(.(./.(./.!.~./.~.~.~.~.T.~.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.~.T.~.~.~.~././.~./.~.~.~.~.~.T.T.T.~.~.R.~.^.~.~.T.T.T.P.T.U.T.T.U.U.L.L.L.S.P.P.P.U.P.P.D.L.U.U.L.U.I.U.U.Y.T.T.T.T.T.~.T.~.~.~.[./.(./.(.[.^.^.`._.[.|.^.(.(.(.(.(.(.(.(.^.(.(.(.(.`._._.(.|.|.|._.(.`.(.(.^.^.|.|.{.|._._._.|.|.|.|.|.'.`.`.`.|.`.`.|._.^._.|.`._.(._._.(.`.|.^.|.|.|.|..X.X.X.X.XdXdXdXzXvXzXvXzXzXdXxXzXzXcXzXdXcXnXdXcX@XxXxXxXxXxXcXxXvXxXzXcXzXvXzXzXxXxXxXxXxXxXvXxXcXvXnXcXmXnXcXnXnXnXnXnXnXmXcXnXnXnXnXnXnXnXnXnXnXnXnXcXnXnXnXxXnXcXcXxXxXvXmXcXnXcXcXnXxXxXxXxXcXdXcXxXdXdXdXcXdXzXzXzXzXzX.X.XzX.X.X.X.X.X`.|. X|.|.|.|._.|._.`.|.(.`.(.`.(.`.(.|.(.(.{.(.`.^.(.(.(.{.(.(.^././.~.^.~./.(.T.T.T.T.U.T.U.U.U.P.P.P.P.U.U.T.L.U.U.I.I.U.U.U.U.U.T.U.T.T.T.T.T.Y.T.T.~.T.T.T.T.T.T.P.T.U.U.U.U.L.T.L.H.U.H.H.H.H.A.H.S.A.G.A.A.A.A.A.g.h.h.h.h.j.f.k.k.f.f.k.a.a.a.i.i.i.s.a.i.a.i.u.u.u.i.u.i.i.i.i.a.i.a.a.i.a.i.a.i.a.a.i.d.i.i.a.a.a.a.a.a.a.a.d.s.a.a.a.f.a.g.f.z.a.a.f.f.g.f.f.a.i.g.a.a.d.z.a.f.z.a.z.g.a.j.j.j.j.z.k.f.k.z.l.h.h.A.h.A.l.A.h.A.h.A.h.A.S.h.A.h.A.A.h.A.A.A.G.A.A.A.G.H.H.H.H.D.H.H.L.D.S.L.L.L.L.U.P.P.T.T.T.T.T./.T.T.[.T.~./.~./.^.(.(././.(.(.`._.(.|._.|.[.|._.|._.|.`.`.'.|.|.|. X|..X X.X.X.X.X|..X.X|..X.X.X|.|.|. X|.|._._.(.`._.|.`.^.^.(.(.(.(.(.).(.(.(.^./.(.!././.(./././././.(.(.(.(.(.(.).{.(.(.(.(.`.(.|._._.|.|.|.|.|.|.@X X X|.|. X X X X|.}.|.|._.|. X X|..X.X|..X X_.|.|.|.|.|.|._._._.(.(.(.(.(././.!././.~.~././.(.T.~.T.E.T.T.T.T.(.T.T.~.~.~.~.T.~.~.T.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.U.U.T.U.Y.Y.U.L.Y.L.L.L.L.L.L.H.H.H.G.G.Z.J.h.A.A.A.A.j.Z.A.h.A.j.A.g.A.g.j.h.l.l.h.h.h.z.l.l.h.k.h.h.h.l.A.A.l.A.l.l.l.l.l.l.h.h.l.l.h.l.h.h.h.h.z.h.g.z.g.g.g.k.k.g.g.z.g.k.g.f.g.z.a.g.i.a.z.k.i.k.k.a.a.i.i.i.u.i.u.u.t.u.u.t.t.t.t.t.t.r.r.r.r.r.y.r.E r.y.E y.w.t.y.y.y.y.y.w.y.y.y.y.y.y.y.y.y.y.y.y.E E y.y.E y.y.y.y.y.w.y.y.r.y.y.y.y.r.y.y.E y.y.y.E y.w.E E w.E y.y.y.y.y.r.r.t.r.t.t.t.t.u.t.",
+"H H Z H H H L Z H H F H H H H H H H H F H H H H H H Z F H H H H Z H H H H H J H H H H H H H H H H U H H H H H H H H H U U H P H J H H J H J P H P H H P H P H J J H K J J H H L G L H H H H H H H H Z H Z Z H H Z Z H Z Z L Z H H H H L H H H Z H H Z H Z H D D D Z Z H Z G D D Z Z Z Z Z D C C D C Z Z C D C D D C Z C C C Z C Z Z Z Z Z Z G Z Z Z D D H D Z Z A D D D D D Z D Z Z Z Z G Z Z Z Z Z Z Z D D D D Z Z Z T A.S.H.H.h.H.H.S.S.H.S.S.L.L.L.U.L.L.L.S.L.L.L.L.U.U.P.P.T.T.T.T.T.T.T.~.!.~./.!./././././././.(.(._._.(.|.(.^.`.^.(.^.(.(.(.(.{.(.(./.(././././.~.~.T.~.~./.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.T.~.~.~.~.~.(.T./.~./.~.~.~.~.~.!./.~.~./.~.T.[.T.~.[.!.T.[.[.T.T.U.U.U.U.U.L.P.P.P.U.P.U.L.I.L.U.Y.I.T.U.T.T.T.T.T.T.~.T.~.~.~.~.!././.(.(.`.(.(.[.^.(.(.(.(.(.(.(.(.`.(.(.(.(.(.(.^.`.(._.(.`.(._.|.|.|.(.|._.(.`.{.|.|.|. X|.|.|. X_. X_.|.`.|.`.|.|._.|.|.|._._._.|.|.(.(.`.|.(.`.|.|.|. X.X X.X'.dXdX.X'.zXzXzXvXzXdX.XzXzXzX.XcXcXdXdXzXxXxXzXxXxXzXcXxXxXxXcXzXzXJXzXzXxXzXxXxXnXnXnXnXxXmXnXmXnXnXmXMXnXnXnXmXnXnXnXnXnXmXnXmXnXnXnXcXnXnXnXmXcXnXnXnXnXnXzXnXnXnXnXnXxXcXnXfXxXnXnXvXcXcXcXxXxXdXnXcXdXzXzXzXzX.X.X.XzXzX.XzX.X.X.X.X|.'.|. X_.|._._.(.`.`.^.^.|.(.^.{.^.`.(.|.^.^.(.(.(.(.(.^.(./././.~.~.~.~.~.T.T.T.T.T.Y.U.P.P.P.P.U.Y.L.U.L.L.L.L.L.L.L.L.L.U.U.Y.U.T.U.U.T.T.T.T.T.T.T.^.~.Y.T.T.T.P.I.U.U.L.H.L.L.L.L.H.H.G.A.G.A.A.A.A.A.A.A.g.A.l.l.l.h.k.h.z.f.j.f.f.a.a.a.a.a.i.i.i.u.s.i.i.i.i.i.s.i.u.u.i.u.i.i.i.a.i.i.a.a.i.i.a.i.i.i.i.i.k.a.a.z.a.a.a.a.a.f.i.f.i.a.a.a.f.a.z.a.f.f.f.d.z.f.g.g.f.i.a.z.f.a.g.k.j.x.j.j.a.f.f.j.j.h.h.h.h.A.h.l.l.A.z.A.g.A.h.A.j.h.G.h.z.h.A.A.A.A.A.G.A.S.S.A.G.H.H.H.S.L.H.K.U.L.L.U.L.L.P.T.T.T.T.T.T.T.T.~./.~.~.~.~.~./.~./.(./.(.^.(.^.{./._.|.|._.|.|.|.|.`.|.|.`..X'..X|.'..X.X.X.X.X.X.X.X.X.X.X.X|.|..X|.'.|.|._.`.`.|.(.(.(.|.`.(.(.(.(.(.(.(.(.(./.^././.(././.(.(.(.).(./.(.(.).(.(.(.(.(.^._.(.`./.^.(.|.{.|.|.|.|.|.|.}. X|.|.|. X|.}.|.}._.|. X|.|.'.'..X'..X|.|. X}.|.|.|.|.}.|._.`._.(.(.(./.(.^././././.~./.~.(.(.~.(.U./.[.T.T.~.~.~.T.~.~.~.~.T.~.T.T.T.T.U.T.I.T.T.T.U.I.I.U.T.U.T.T.L.U.U.P.U.U.L.L.L.L.L.K.H.H.K.H.H.H.H.A.A.A.A.A.S.g.G.g.A.A.A.h.A.h.D.h.h.l.l.h.h.h.g.g.k.h.k.h.h.l.l.h.h.h.A.G.l.l.l.l.h.h.z.h.l.l.l.h.k.h.k.k.k.h.g.g.g.g.g.g.k.g.h.g.g.g.g.a.f.f.f.a.g.i.f.z.a.i.a.a.a.a.i.i.i.i.u.u.t.t.u.t.t.t.u.r.r.r.r.r.r.r.r.r.r.t.y.E r.y.y.y.w.y.t.y.y.w.y.y.y.y.y.y.y.y.y.y.w.y.y.y.w.w.y.E y.y.y.w.y.y.y.y.r.y.y.w.y.y.y.y.E y.w.y.y.y.y.E y.y.y.y.y.r.r.r.t.t.u.u.t.t.u.",
+"H Z L L Z Z H H H Z J H Z H H H H H G H H F H H H H H H H H H H H H H H H H G K H H H H H H H J P H H H H H J J L H L L J H P P H H J H J H L K J H H H P U J H J J H H J J G K P H H H H F H F L Z H H J H Z S Z L Z L Z L P L Z Z Z J H Z H H Z H H H D H D D G C Z Z Z D D D Z Z B Z B D C D C C C C D C C C Z B Z C D C C Z B D Z Z Z Z B D G Z D D D Z D D D D H D Z G D Z Z L H G Z Z Z G H Z H Z D D Z Z Z D Z U Z.Z.H.S.H.S.S.L.S.S.S.L.L.L.S.L.L.L.L.L.Y.L.P.U.U.P.P.P.T.T.T.T.T.T.!.T.~.!.~.~.^.~.!././.(.(.(.(.(.(.(.|._.{.|.^.(.`.^.(.(.(.(.(.(.~.{.(./././.~./.~.~.T.~.T.~.T.T.T.T.T.T.T.T.T.T.T.T.T.~.!.T.~./.[.^.^./.~./.~././.~./.~././.~./.!.!.~.~.~.T.T.~.T.[.T.T.[.P.U.U.P.P.U.U.U.U.P.P.U.U.U.U.I.T.T.U.I.T.T.T.T.T.~.T.~.~.~.~.~.!./.(.(.(.[.^.(.(.(.^.(.[./.(.(.(.(.(.(.(.(.(.(.(.(.(._._._.^.|.|.[._.(.(._.|.`._.{._.|.|. X X|.|. X|.'. X|.|.|.|.|.`.|.|.|.|._.|._.{._.{.|.`._._.{.|.|.|. X|..XdXdX'.zXdXzXzXzXzXzXzXzXJXzXzXcXcXvXzXcXcXxXxXxXxXxXxXxXdXxXzX.XcXvXzXdXdXzXcXxXxXxXxXnXxXvXxXnXnXnXnXnXnXnXnXmXmXmXmXmXvXMXmXmXmXmXmXmXmXmXcXmXmXcXmXnXnXvXnXxXJXvXcXnXvXxXJXnXxXnXxXxXnXcXxXcXcXxXxXxXxXzXcXzXzXzXzX.XzXzXdX.XzX'..X.X.X.X'.|.|.|._.|.(.{.`.(.^.(.(.^.(.(.(.(.(.(.(.(.|.(.(.(.(.(.(.[.E.E.^.~.[.~.~.T.T.T.T.U.U.U.U.L.U.P.P.L.U.L.L.L.L.L.L.L.L.L.L.L.L.R.U.U.U.U.Y.U.Y.Y.Y.T.T.Y.T.Y.P.P.P.U.T.L.L.L.L.L.H.L.H.H.H.H.A.H.A.G.A.A.A.A.A.A.A.l.l.l.h.l.k.k.k.k.k.f.a.k.a.a.a.a.i.a.i.s.i.u.i.i.r.i.t.i.u.i.u.u.a.i.i.a.i.a.a.i.i.i.i.d.i.i.i.i.a.a.i.a.a.d.a.a.a.i.i.k.z.a.z.a.a.a.a.f.z.f.g.g.a.f.a.a.k.z.a.f.f.g.a.a.g.j.z.h.f.j.f.z.h.z.l.h.h.h.l.h.h.h.S.A.A.A.A.A.A.A.A.A.A.S.S.A.A.A.h.G.A.A.H.H.L.H.U.L.L.L.L.J.L.U.L.U.P.U.Y.T.T.T.T.T.T./.~./.T.~.~.~.(./././.!.(.(.(.(.`.(._.|._.|.|.|.`.`.|.|.|.|.@X_..X.X|.'..X.X.X.X.X'..X.X.X.X.X.X.X.X.X.X.X|. X|. X|.{._._.|.`.`.`.^.^.`.(.(.(.(.(.(.^.^.(.(./.(.^.(./.(.(._.^.(.'.(.(.(._.^.`.(.|.^.|.`.|._.|._._.|.|.|.|. X|.}.|.}.}.}.|.[.}. X|.|._.|.|.|..X X|..X X X'.|.|.|.|.|.}.}.`.(.|.(.`.^.^././.(./././.~./.~.~.~.~.~.T.(.T.T.T.T.~.T.~.T./.T.~.T.T.T.T.U.U.Y.L.Y.Y.U.U.T.U.Y.U.Y.I.U.U.U.U.U.L.U.L.L.L.L.L.H.S.H.K.G.H.H.G.A.A.A.A.A.A.A.A.g.g.A.h.A.D.g.l.l.h.h.l.h.l.z.k.a.z.z.g.h.h.h.h.h.h.h.l.D.h.l.l.h.l.l.l.l.h.l.l.l.h.h.h.k.h.k.g.g.g.g.g.g.h.h.h.z.g.g.g.g.g.a.d.f.a.z.k.a.a.a.k.a.a.a.a.a.i.i.u.u.u.u.u.u.t.t.u.E t.r.t.r.t.t.r.r.r.y.y.r.t.r.y.r.r.w.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.E y.y.y.y.y.w.y.y.w.y.y.w.y.r.r.r.y.w.y.w.y.y.E y.E y.E y.E y.y.y.E t.y.r.E t.t.E i.t.u.u.t.",
+"H H H Z L L H H H Z H H H H H H F H H F H H H H H F H K H H H H H H H H H P H J H J H G H H H J H H H L J H H H L J L K H J J J P P J J J J L P J J J J J H J J J L J L L L L H H H D H H H H H Z J Z Z H Z J Z C J Z Z L Z Z Z Z H L Z H H H H H H Z S D D D D H Z Z Z G Z D Z Z Z D Z Z C C D C C Z C C C G C C C C Z C Z Z C C D Z Z Z Z Z Z Z D Z D D Z D D D D Z H A Z Z D Z Z Z Z Z L Z L Z Z Z Z D Z H H Z H Z G b.A.H.S.S.H.S.S.S.U.S.L.S.L.L.S.L.L.L.L.U.P.P.P.U.P.P.P.U.T.T.T.T.T.~.~.~.~.~.~.^.E./././././.[.(.(._.(.(._.^.(.^.`.{.(.(.(.(.^./.(.^.~./././.~.~.~.~.T.T.~.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.~.~.~.~.~./././.(.^.^./.~.~./.~././.!././././.~.~.T.~.~.~.T.T.T.T.T.T.P.U.U.U.P.P.U.D.P.P.U.P.U.U.U.U.U.T.T.T.T.T.T.~.T.~.T.~.~.~.~./././.!.(._.!.(./.(.{.{.].(.(.].^.`.(.(.`.(.(.(.(.`.`.(._._.|._._._._.|.|.|._.`._.|.|._._. X_. X|..X|..X'.|..X|.|.|.|. X|.}.|._.|.|._.|.|.^.|._.|.|.|.|.|. X.X.X@X.XdXzX@XzXzXzXzXzXzXzXzXcXzXdXcXdXcXzXcXxXxXxXxXxXxXxXJXxXvXcXcXcXnXdXdXzXdXxXxXxXcXnXnXmXnXnXnXnXnXnXcXnXmXnXMXnXmXmXfXnXmXmXmXmXmXmXmXcXmXmXmXmXmXmXnXnXnXnXnXnXnXnXnXnXnXxXxXnXxXxXnXnXxXcXcXxXxXxXxXcXzXzXzXzXdXzX.X.X.X.X.X.X.X.X.X|.|..X|.|._.`.`.|.^.`.(.(.(.(.(.{.(.(.(.^.|.(.(.(.(.(.(.^.(.^.(.^.~.~.~.~.T.T.!.T.T.U.U.L.U.L.L.P.Y.L.L.L.H.L.L.L.L.L.H.L.L.L.L.L.L.L.L.U.L.L.U.U.U.T.T.T.Y.Y.!.T.P.U.U.U.U.L.L.H.L.H.S.H.S.S.H.A.H.j.A.A.A.h.A.l.h.A.l.k.l.l.h.l.j.k.k.f.s.a.a.a.a.a.s.i.i.t.a.i.i.i.a.u.i.u.i.u.u.a.t.i.i.i.a.i.i.i.i.i.i.u.i.u.i.i.i.a.i.a.a.a.a.a.a.i.f.i.i.a.a.a.f.a.k.f.a.f.f.f.g.f.f.g.k.a.z.g.a.g.a.f.f.a.f.f.j.f.f.f.j.z.k.h.h.h.h.h.A.h.l.A.z.A.g.h.A.A.A.A.A.S.S.A.S.H.J.A.G.A.H.S.D.Z.L.L.L.L.L.L.L.Y.P.P.U.T.T.T.~.T.~.T.T.T.~.~.~.~.^.^./././././.!.(.(.(.^._._._.|._.{._.|.|.`.'.`.`.'.'.|..X.X.X'..X.X.X.X.X.X.X.X'..X.X.X|..X.X.X X.X'.|._.|.|.^.|.(.^.(.`.^.^.(.(.(.(.{.^.(.(.(.(.(./.(.(.{.{._.(.(.(.^.(.(.(.|.(.(.{.^.|.(./.|.|.|._.|.|.|.|.}.|. X}. X}.|._.|.|.|._. X X_.|.'.|.|.|. X|.'.|.|. X X}.|.|.}.}.(.|./.(.{.(.|.(.(./././././././.~.~.~.T.~.T.T.(.~.T.~.~.T.~.~.T.T.T.T.T.T.T.U.L.L.L.I.U.U.U.U.Y.Y.U.I.U.U.L.L.U.Y.L.U.U.L.L.L.L.L.H.H.H.H.H.H.A.A.A.G.A.A.g.h.A.h.h.h.h.z.S.l.l.h.h.h.h.z.h.g.z.g.g.g.h.z.h.h.l.A.h.A.z.D.l.l.l.l.A.A.l.A.l.l.A.A.h.h.h.h.h.g.g.z.g.g.g.k.h.h.h.g.f.g.k.f.f.f.f.a.a.a.k.a.a.a.i.k.a.i.i.i.i.i.u.u.u.t.t.u.t.u.E t.r.r.r.t.r.y.r.r.y.t.y.r.y.y.y.w.y.r.w.y.y.y.y.y.w.y.y.y.y.y.y.y.y.w.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.r.r.y.y.y.y.y.w.y.w.E E y.y.y.y.y.E r.r.r.t.t.t.u.t.u.t.t.t.",
+"H H H J J G F H H H F K H H H H H H H F H H H Z H H Z H H F J H H H L L Z J H H J H J L L Z J Z J F D H P P H P P H J J H P P P J P L P J L J J L J J L L P K H P J J P L L L L L L H H H Z H H H H D D D D D D H D D D Z Z G L D D D D D D D D D D D D D D D Z Z D Z D Z D Z Z Z Z C Z Z C Z C C C Z D C C D C F C D C Z C Z Z Z Z Z Z Z Z G Z Z F Z Z Z Z F D H Z Z H Z Z Z G Z Z Z Z Z L Z Z G Z C Z Z Z Z L Z A H H e.Z.S.H.S.S.S.H.H.H.H.L.S.H.L.L.L.L.L.L.P.P.P.P.P.P.T.P.T.T.T.Y.T.T.T.~.~.~.~.~.~.^.(.^.~.(././.(.(.(.(.`.(.(.(.(.(._.(.(.(././.(.~.(.(.(.~.~.~.~.~.~.T.T.T.T.~.~.T.T.T.!.T.U.Y.!.T.~.T.~.~.~.(.^.(./././.(.(.(././././././././././././.!./.~.~.~.~.~.~.T.T.T.T.T.T.T.U.U.P.L.L.L.U.P.U.Y.U.T.T.T.T.T.~.T.U.T.T.~.~.~.~.~.~.~././././.(./.{./.(.(.(.^./.^.(.{.(.(.(.(.(.(.{.(.(.|.(.|._.}.}.(._._.(._.|._.}.}.}.}.|.}.}. X X.X|..X|..X X'.|..X`.'..X.X`.|.`.|.`._.|._._.|._._.|.`.|.|.`..X|. XxX.X.XdXdXzXzXdXzXzXzXzXcXzXzXcXdXnXdXxXxXxXcXxXxXdXnXnXcXcXcXcXcXxXxXxXxXxXxXxXxXxXcXnXnXvXnXnXnXcXmXcXmXmXdXmXmXSXfXmXmXmXmXmXMXmXmXmXmXmXmXmXmXmXmXmXnXnXnXnXnXnXnXnXnXnXcXcXcXcXcXcXmXcXcXcXcXnXnXcXdXdXzXzXzXzX.XzX'.dX'..XxXdXdX.X.X.X|.'.|.|.`.(.`.(.(.(.(.|.(.(.(.(.(.(.(.(.(.(./.(.(./.^.^././.~.~.~.[.T.T.T.T.Y.Y.P.L.U.U.U.U.P.L.L.L.S.L.L.L.S.H.L.L.S.U.L.U.L.L.S.L.L.U.Y.L.L.P.P.P.P.Y.P.Y.L.P.P.P.P.P.L.L.L.H.L.H.S.H.H.H.l.A.A.A.h.A.A.g.G.A.l.l.l.h.h.h.f.k.k.k.f.f.f.a.a.a.a.a.a.i.u.s.u.u.i.u.i.i.r.a.i.i.u.u.s.i.s.i.s.u.i.i.a.u.u.i.u.u.i.u.i.u.i.i.u.i.a.i.a.a.a.a.a.i.z.i.k.a.k.k.a.a.a.f.f.f.k.f.f.g.f.a.z.a.z.g.a.z.g.g.a.j.f.g.h.g.h.h.h.h.l.h.h.A.S.h.A.A.A.A.A.A.A.A.A.A.S.S.H.S.H.H.A.H.S.H.H.L.H.L.L.L.L.U.U.U.T.T.T.T.T.T.~.T.~.~.~.T././.~.!././././.(./.(.(.(.(.(._._._.(.|._.|.|.|.|.|. X X.X|..X.X.X.X.X@X.X.X.X.X.X.X.X.X.X.X.X.XdX.X.X.X.X'..X X'.|.|.|.|._.|.|.{.^.^.(._.(.(.(.(.(.(.(.(.`.(.(.(.(.|._.(._._.^.|.^.^.`._._._._._._._._.{.|.|.|._.|.|._.|._.|.[. X|. X X|.|.|.|.{. X|.|._.|.|. X|.|. X'.|.|.`._._._._.(._.(.|.(.|.^.(.(.(.(./.(.(././.~.~.!.~.~.~.~.~.T.~.T.~.T.~.T.T.T.U.Y.T.U.U.U.U.P.P.L.U.L.U.U.Y.Y.P.Y.P.U.P.P.P.U.Y.L.L.S.P.L.Y.U.L.S.H.H.H.S.Z.A.A.A.A.A.A.g.A.j.h.h.h.l.l.l.l.g.h.h.h.g.g.k.z.k.h.k.h.h.h.h.z.h.h.h.h.h.D.z.g.h.h.A.A.h.Z.h.G.g.g.h.h.h.g.h.g.g.g.g.h.g.g.g.a.g.k.f.f.d.f.f.a.i.g.f.a.f.s.k.a.z.f.a.i.i.i.i.u.u.u.u.u.t.t.t.t.r.r.t.r.r.r.r.r.r.y.y.y.r.y.y.r.y.r.y.y.r.y.y.y.y.y.r.y.y.r.y.y.y.y.y.y.y.y.E r.y.y.E w.y.t.y.r.r.r.r.r.y.y.r.y.y.y.y.y.y.y.y.y.y.y.r.y.r.r.t.r.t.t.u.t.u.u.t.p.",
+"H H H H J H H H D H H H H F H H H H H H H Z H H H H J F H H H H H H H L H L H L L Z Z L H J L L J H P J H H P H J J J P P P P I K P L P P J J J J J J J P H I J H P P H L J L L L Z P H H H L Z Z D D Z D D D D Z Z Z F Z G Z Z D D D D D D D D D D D D D D Z F Z Z H Z D Z F Z Z Z Z Z Z Z C C Z C C C C F C C C C C Z A C Z Z D Z G C Z Z Z Z Z Z Z G Z G D D Z G H Z Z Z L Z Z Z G Z G Z Z Z Z Z G Z L Z G Z H Z Z H Y Z.G.H.D.A.S.H.H.H.L.S.U.H.L.H.L.H.L.L.P.P.P.P.P.P.P.T.T.T.T.Y.~.Y.~.T.R.~.~.~.~.~.~.~.(.~.!.^.(.(.(.(.(.(.`.^.(.(.(.(./.(./.(.^.^.~.~.~.(.~.~.~.~.~.~.~.~.~.T.T.T.~.T.T.T.!.Y.T.T.T.~.T.~.T.~.~././././.(.(./././.(././.^.(././.(.!./.T.^./.~.~.(.~.T.~.T.T.~.T.T.T.U.P.P.Y.U.U.U.U.T.U.T.U.T.T.T.~.T.(.^.T.(.~.~.~.~.^.~.~.(.[.^./.[.(.[.^.(.(.(.[.(.(.{.(.(.(.(.`.(.(._.(.(.^._.^._.}.|._.|.|.|._._._.|.}.}.}.|.}.}.|. X|.'. X.X.X|..X|..X|..X.X'.`.|.|.`..X|.|.|._.|.|.|._.`.`.|.`.|..X.X.X.XdX.XdX.X.XdXzXzXzXzXdXzXcXdXxXxXxXxXxXxXxXxXxXxXxXfXcXcXzXcXcXcXxXxXxXxXxXvXxXcXcXcXMXnXnXnXmXmXmXmXnXmXcXmXmXcXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXmXmXmXnXnXcXcXnXnXnXcXnXnXcXcXcXcXnXnXcXcXnXxXcXxXcXzXzXzXdXxX.X.X XdX@X.X.X.X.X.X.X.X|.|.|._.|.(.(.|.`.(.^.(.(.(.(.(.(.(.(.(.(.(.(.(././././.(.(.~.~.~.T.T.T.U.P.P.L.U.U.L.P.L.L.L.L.L.U.S.S.U.H.H.K.H.L.U.S.S.U.L.U.L.L.L.L.Y.L.P.L.P.Y.Y.P.U.P.U.U.P.P.L.L.U.D.L.H.H.S.H.A.H.A.A.A.A.h.A.A.A.j.l.h.h.h.l.l.h.z.k.x.k.f.a.k.a.a.a.a.i.i.s.i.i.i.i.u.i.u.u.u.i.t.u.u.u.i.i.u.i.i.a.a.u.i.u.i.u.i.i.u.a.u.i.i.i.a.i.i.i.a.a.a.a.a.i.i.a.a.a.a.k.k.d.g.g.a.f.f.a.f.a.g.a.z.a.f.a.z.f.f.g.g.g.g.g.g.g.h.l.l.l.l.h.h.j.g.A.h.A.A.A.A.A.A.A.S.S.A.H.D.G.H.H.H.H.H.H.L.H.L.L.L.L.I.L.U.U.U.T.T.T.T.T.~./.T.~.~.~./.~./././././././././.(.(.(.^._._._._.|.|.|.|.|.|. X|..X|..X X'.'..X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X'. X'. X.X|..X|.|._.(._.(._.`._.[._.[.(.{._.{.(.(.`.^.^.|.^.(.{._._._._.{.}._.`._._._._._._._._._._._._.|._.`.`.|.|._.|.}.}._.|._._.|._.|. X|.|.|.|. X|.{. X X|.|.|.`.`._.|._.|.|.|.|.(.(.{.(.(./.(.(././././././.~.~.~.~.~.T.~.~.T.~.T.T.T.T.T.T.T.T.L.T.U.Y.L.P.U.L.L.U.U.U.L.Y.Y.P.L.U.L.L.U.U.L.U.S.L.L.D.H.P.A.H.H.H.S.S.S.A.A.A.A.A.j.A.G.h.h.h.h.l.h.l.l.h.h.k.h.h.z.k.k.k.k.h.h.k.h.h.l.h.l.z.A.A.h.l.l.A.l.h.h.h.h.l.l.h.h.h.k.h.k.g.g.g.g.g.a.g.g.k.g.g.k.k.k.f.f.f.f.g.i.f.f.f.a.s.f.i.z.a.a.a.t.i.u.u.u.u.r.u.t.t.t.t.r.r.t.r.r.r.r.y.r.r.y.r.y.y.r.y.y.y.y.y.y.y.y.y.y.y.y.r.w.y.r.t.r.r.y.r.w.y.y.r.y.y.r.r.y.r.r.r.r.r.r.r.r.y.y.y.y.y.y.y.y.y.y.y.y.y.r.r.r.r.t.t.u.u.t.t.u.p.u.",
+"F G H H F H H H H H H G H H H H H H H H H K H H H H H H H H H H S I D J L J H H H J J J D J J Z J H J J K L L H J P P J J P ( S P P J P P K H J J J J J L J J J I H P H S L L L L H Z H Z Z H Z Z D Z D D Z F Z Z D H Z H Z Z D D D D D D D D D D D Z D Z D Z Z Z Z C Z B F Z Z B Z Z Z C C Z C Z C C F C Z C C Z C D C Z Z B Z Z Z Z Z Z Z Z Z Z Z Z Z Z D Z Z Z Z Z L G Z Z Z Z Z Z Z Z Z Z G Z Z L L Z Z Z L H Z Z Z G g.H.A.H.H.G.G.H.H.H.H.H.H.H.L.L.L.L.L.P.P.U.P.P.Y.T.P.T.T.T.~.Y.~.T.~.T.~.R.~././.~./.!.(.^./.(.(.(.(.(.(.(.^.(.(.(.(.(./.(./.E.[.~.(.~.~.~.~.(.T.~.T.~.T.T.~.T.~.T.T.T.T.T.U.T.~.~.~.~.T.T.^./././././.~.^././.(./.(.(.(.~.(.(./././.~.[./.[./.~.~.~.T.T.~.T.T.T.T.U.U.P.U.U.L.Y.L.U.U.T.T.T.T.~./.T.~.~.(.R.~.^././.~.~.(./.(.(.(././.(.(./.(.(.(.(.(.^.(.(.(.(.(.(.(.(.(.`._.`.(.`.[.|._._._._.|.|.|.|.}.|.|.|.|.}..X'..X|.|..X.X.X.X.X.X.X'..X.X.X_.`.|.|.|._.|.|.|._. X|.|.`.@X'..X X.X.X.X.X@XdXzXzXzXzXdXdXxXdXcXdXdXcXxXxXcXxXxXxXcXcXcXcXxXxXcXzXcXdXcXcXxXxXxXxXxXxXcXnXnXnXnXcXnXnXcXcXxXmXmXmXmXmXmXmXmXmXmXMXmXmXMXmXmXmXmXmXmXmXMXnXnXMXmXmXmXmXmXnXnXnXcXcXmXcXcXmXmXcXnXnXcXcXxXxXxXxXcXvXzXzXzX.XdXdX.XdXdX.X.X.X.X.X|..X.X|.|._.|.^.`.(.(.(.(.(./.(.(./././././.(./.(.^./././././.~.T.T.^.P.T.T.U.L.U.L.L.L.P.P.P.L.S.L.L.D.H.H.S.H.L.H.H.H.Z.S.H.H.S.L.H.L.S.L.L.L.L.L.L.L.P.L.L.P.L.P.L.L.L.L.S.L.H.H.S.S.H.S.A.A.A.A.A.Z.A.A.g.h.l.z.h.h.k.k.l.k.z.k.f.i.z.a.a.a.a.a.i.i.i.i.i.u.u.i.u.u.u.i.u.u.u.u.i.u.i.i.s.i.a.i.i.i.u.u.i.u.u.u.u.u.i.i.u.i.i.s.i.i.i.i.s.a.i.a.a.a.a.k.k.a.g.a.g.g.f.g.f.a.f.f.f.f.k.f.z.g.z.f.g.g.g.g.h.h.h.h.h.h.l.h.h.A.A.A.A.A.A.A.z.S.S.S.S.H.S.S.S.L.H.H.H.H.H.L.H.L.L.K.L.L.I.I.R.I.T.T.T.T.T.T.T.T.T.[.[.~.~.~././././.(.(.(.(./.(.(.(.^.`._._.`.`.}. X|.|.|.|.|..X.X|..X.X.X.X X'..XdX.XdX.X.X.X.X.XdX'. X.X.X.X.X@X X.X.X.X X|.|.}.}.|._._._._._._._._.(._._._.^.(.(.^.^.^.{.^.).`._._._.}.}.}.}._._._._.|._.|.|.|._.}._._._.|.|.|.|.|._.|.}.}.}.|.|. X}. X{.{. X_. X|.[.|. X X{.|.`.`.|._._._._.|.{.[._.(.(._.(.(.(.^.(./././.!./././.~.!.~.T.~.~.~.T.~.T.T.T.T.T.T.P.Y.L.U.L.L.L.L.P.L.L.Y.U.U.U.U.P.U.P.U.L.L.Y.P.P.P.L.L.L.L.P.L.S.H.H.H.S.z.A.A.A.A.A.G.j.h.l.l.h.h.h.h.k.h.k.h.g.g.k.k.k.k.k.g.h.k.k.l.k.z.k.h.h.l.l.l.l.l.h.h.h.h.h.l.l.l.g.l.k.h.g.g.g.g.g.g.g.g.f.f.g.h.g.k.k.f.a.g.i.g.a.g.f.s.k.f.f.f.a.a.i.s.a.t.a.u.u.u.u.u.u.t.t.t.t.r.t.r.r.r.r.r.y.r.y.r.r.y.y.y.y.y.y.y.y.y.y.y.y.y.r.y.y.r.r.r.y.r.E r.y.r.w.y.y.y.r.y.w.r.r.y.r.r.r.r.w.y.y.y.r.y.y.y.y.r.w.y.y.r.r.r.r.t.t.t.t.t.t.u.t.u.u.u.",
+"H H H Z H H H H H H H H H H H H D Z H H H L F H H H H H H H K G Z H H J Z J H L H D L L L L J L H J L H H L K H J J P P P P P P P I ) L J I P J P J J J J J J J H P H U L L L L L H L H L L J Z F D D D D Z Z Z D D D Z Z Z D Z D D D D D D D Z Z D Z F Z Z Z Z C Z Z D Z Z Z Z D B C C C Z C Z C C C C C C C D C B C Z C Z F Z Z Z Z Z D B G G Z Z Z Z D Z Z G L H G Z Z Z L Z G L Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z G b.I.G.L.G.H.H.H.H.S.H.H.S.L.L.L.H.L.L.P.P.U.Y.P.P.P.P.T.T.T.T.T.T.T.T.~.~.~.~.~.~././.(.~.(./.(./.(./.(.(./.(.(./.(.(.(.(./.(.(./.~.~.).!./.(.~.~.~.~.T.~.~.~.~.T.T.~.!.T.T.[.~.T.~.T.~.T.~.~.~././././.(././.(././.(.(.(.^.(.(./.(.!.^.!.[.~.~.~.~.~.~.T.T.T.T.T.T.T.T.T.Y.U.Y.Y.Y.T.T.T.T.T.T.~.T.~.~././.].E./././.~.(./././.^.[.^.(.(./.(.(.(.~.(.[.(.(.(.(.^.`.(.(.(.(.^.|.^.`.^.`.^._.{.|.|.|.|.|.|.'.|.'. X X X.X|.|..X.X.X.X|..X.X.X'..X|..X`.'.'.@X|.|.|.|._.{.|._._.`.|.|.|.|..X.X.X'.zXzX'..X.XzXdXcXdXdXvXdXxXxXxXxXcXcXcXnXnXcXcXcXnXxXcXzXcXvXcXnXcXcXcXxXnXnXnXnXnXcXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXMXmXmXmXMXmXmXmXmXnXMXmXmXMXmXMXnXnXmXmXmXmXmXnXmXnXmXmXcXmXnXcXcXmXdXJXnXnXxXxXnXxXcXzXzXzXzXzXdXdXdXdX'.dX.X.X.X.X.X.X.X|.|.|._.|.(.(.|.^.(.(./.(.(./././././././.^.(.!.E././.~.~.T.~.T.T.T.T.U.U.L.L.L.L.L.L.U.S.L.S.A.D.H.H.H.H.H.H.H.H.S.L.H.H.L.H.L.S.P.L.L.U.L.L.L.L.L.L.L.L.L.L.L.L.L.H.L.H.G.G.H.S.A.A.A.A.A.A.A.j.h.h.A.h.h.h.h.h.l.l.z.f.k.k.z.z.a.a.a.a.a.i.i.s.u.u.a.r.u.u.u.u.u.i.u.i.u.i.u.i.u.i.i.i.u.i.u.u.i.u.u.u.i.i.u.u.u.i.u.u.i.i.i.u.i.i.i.i.i.i.i.a.i.a.a.a.a.g.f.a.f.g.a.g.x.k.a.f.a.z.f.a.g.g.z.g.g.h.g.h.h.h.h.g.A.A.G.h.A.A.A.A.A.G.S.S.S.H.H.S.U.S.S.S.L.H.H.L.H.L.L.L.L.L.R.K.L.Y.I.T.U.U.T.T.T.T.T.~.~.T.~.~./././.^././.(.(.(././.(.(.(.^.|._.|.`.`.}.|.|.|.|..X.X.X.X.X.X.X.X'.dX X.X.X'..XzX.X.XdX.X.X@XdX'.dX.XdX'.|..X|.|..X.X|.|._.|.|._._._._._._._._._.(.^.[.(.|.`.(.`.`._._._.`._._.}.}.}.}._.|._.|._.}.|._.{._.}.}._. X|.`. X X|.|.}.}. X}.|.|.|.}.|. X|.|.|.|. X X X|. X%X_.`.`.|.|.|.|._.|._._.^.|.(.(.^.(.(.(./.(.(././././././.~.~.~.~.~.T.~.T.T.(.T.T.T.T.U.U.L.L.L.L.L.L.L.L.L.L.U.L.P.P.U.P.L.L.L.U.L.S.P.L.U.S.L.L.D.S.L.Z.S.S.S.S.H.A.z.A.A.j.A.g.h.h.h.h.h.h.h.h.k.k.g.g.g.g.k.k.k.k.k.k.k.k.k.z.l.k.k.h.h.h.z.l.h.h.h.h.h.l.h.l.l.l.k.h.g.g.a.g.g.f.g.f.g.g.g.g.g.k.k.k.z.a.g.d.a.a.a.g.f.f.s.f.a.a.a.a.a.a.u.i.u.u.u.u.u.u.t.t.t.t.r.r.r.r.y.y.r.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.w.y.y.y.r.w.r.y.E w.r.y.r.y.r.E E t.r.y.y.E y.r.r.r.r.r.t.r.y.y.y.E y.r.y.r.y.r.r.r.r.r.r.t.t.t.u.u.t.p.p.u.u.u.",
+"H H H H H H H H H H Z H H H H H H F F H H D H F H H H H Z H H H J J Z Z H H H H L L Z J L L H H J H J H J J J J H L P P P P P J P P P P P P P P J J H J L J J P I J L J L L L L H H H H H Z D D D D D D D D D D D D Z Z G Z H D Z D Z D D D Z G D D Z Z Z Z Z Z D C C Z Z Z Z C Z Z D C Z Z C C C C C C C C C F C C C Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z D Z D G Z Z Z Z Z Z Z G Z Z Z Z Z Z L Z Z L G Z Z G Z G Z Z Z H C H Z b.Y.H.H.H.H.H.H.H.L.H.U.S.L.H.L.L.L.L.L.L.P.P.P.P.P.T.U.T.T.T.T.~.T.^.T.~.~.~.~.~./.[././.(././.(././.(./.(.(.(././.(./.(./.(./.!.~.~.!.(./.~.T.~.~.T.T.~.~.~.T.T.~.T.Y.~.P.~.T.T.T.~.~.Y./.E.R.(././././././././.(.(.(.(.(.(.(.(.(.(.~.(./././.~.~.!.T.~.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.Y.Y.T.T.^.~.~.~.~./././././././.[././././././.(.~.(.(.^.(.~.~.(./.(.(.(.(.(.(.(._._._._.}.[.|.|._._._._.|.|.|.|.'..X.X X.X|.@X}..X'.'..X.X.X.X.X.X.X.X'..X|..X'. X.X.X|.|.|.|.|._._._.|.`.|.`.|..X.X.X.XxX.X.XzXzX.X.XzXzXzXzXzXcXzXcXcXvXxXxXcXxXxXMXcXcXcXcXcXxXxXxXnXcXnXnXnXcXcXnXcXnXnXnXnXmXmXmXmXmXmXmXmXnXmXcXmXmXmXmXmXmXmXmXNXmXmXmXmXMXmXMXmXmXmXmXmXmXmXmXmXmXmXmXfXmXmXmXmXnXmXdXmXnXnXcXcXcXxXxXxXzXdXxXdX.XdXdXdXdXdXdX'..X.X.X.X.X.X.X'.|.|.{._._.`.(.(.(.(.(./.(././././.~././.^.~./.!././.T.~.~.T.T.T.T.U.U.L.U.L.L.L.L.S.U.U.H.H.H.H.H.h.H.H.H.H.H.H.H.H.H.H.S.K.G.L.L.L.S.P.S.P.L.L.L.S.L.U.L.U.L.S.H.H.K.L.S.S.S.S.A.A.G.l.A.h.l.A.h.h.h.h.h.g.h.h.h.g.z.f.k.d.k.i.a.a.a.a.a.s.i.i.i.u.u.i.u.u.t.i.i.t.u.u.i.u.u.i.i.i.u.i.u.i.u.u.u.u.u.u.u.u.i.u.i.u.u.u.u.i.u.u.a.s.a.i.i.i.i.i.a.a.a.a.a.j.f.f.f.z.a.g.f.f.f.f.k.k.j.j.f.z.h.z.h.h.h.h.h.h.l.A.A.g.A.A.A.A.A.A.S.S.S.G.H.H.S.L.S.P.S.L.H.L.S.U.L.S.K.L.L.L.L.L.R.U.U.Y.U.T.T.T.T.T.~.T.T.~.~.(././.^.[.(.(.(.(.(.(.^.^._.(._.|.|._.|.|.}.|.|. X.X|.'.|..X.X.X.X'..X.X@X.X.XdXdX.X.X.X.XdX.XdX@X.X.X@XdX.X.X.X.X X X X@X|.|.`.(.|.`._.|._._._._.|.(.|.}.`.|.(.`.|.(.|.`._._._._._. X}.}._.|._.|.|.}.}.}._.|.}.}.|.|._.}. X|.|.|.|.}.}.|.|.|.|._.|. X|. X X|.|.|._.|.|.|.`.|._._.|.(.(.`.^.|.(.|.^.(.(.(.(.(.(.(.(./././.(./.!././.~./.~.T.T.~.T.T.T.T.T.T.U.L.L.L.L.H.L.L.L.L.L.L.P.L.P.P.U.P.L.P.P.L.L.L.L.L.L.P.D.L.S.H.H.H.H.S.A.A.A.A.h.h.A.l.h.l.l.l.l.h.h.h.l.g.h.g.g.g.g.f.f.z.k.d.f.f.f.k.k.k.k.g.g.k.f.k.z.f.f.z.h.h.h.g.h.h.g.h.k.h.k.f.j.f.g.g.g.g.g.g.g.g.z.g.f.g.a.z.g.a.z.s.a.s.j.a.a.f.a.a.a.a.a.i.i.i.u.u.a.u.u.u.r.t.t.t.t.r.r.r.r.y.y.r.y.y.y.y.w.y.y.y.y.y.y.w.y.y.y.y.y.y.y.w.p.y.y.r.y.y.t.y.r.y.r.r.y.y.r.w.E y.t.y.r.r.r.y.y.y.y.y.y.r.y.r.r.r.r.t.t.r.t.t.t.t.t.u.p.t.u.u.u.u.u.",
+"H K H H H H H H H H H H H H F H H H H H H H Z H F H H H H H H H Z H J L H H H P J Z L L L L H L J J L K J J P P L P P P P P J I Y H P P J J J P J J P K J J J J P L P L L L L L H H H H Z H H D D D D D D D D D D D Z Z D Z Z G Z Z Z Z C Z F Z Z Z D Z Z Z Z Z C D Z D Z C Z C C C C B Z C Z C C C C Z Z D C C C F C Z Z C C Z C Z Z C Z Z Z Z Z Z Z Z Z Z Z Z H Z G Z Z Z H Z Z Z Z Z Z Z Z Z Z Z H Z L Z Z H Z Z Z H G T Z.H.L.L.L.H.H.H.H.H.H.H.H.L.S.L.L.L.L.P.L.P.U.U.P.L.Y.T.T.Y.Y.~.~.T.T.[.~./.~.~.~./././.~././././././.(.(././.(./.^.(././././././.~.!.~.~.~.[.(.~.~.~.~.~.T.~.T.T.T.T.Y.~.Y.T.^.~.T.~./.T.T./.R./././././.(./.(./.(.(.(.(.(.(.!.(.!.(.^././.~././.~.~.T.~.T.T.T.~.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.~.~.~.~././.(.(./././.~./././.[.(.(./.(./.T.^.(.(.(.(./.(.(.(.(.(.(.(._.(.|.(.}.}.^.|._.|._.|.|.|.|.'..X|.|..X.X.X X X.X.X.X.X.X.X.X.X.X'..X.X.X.X.X.X.X X.X X|.|.|.|.|.|.|.|.|.|.|.|. X|..X.X.X'.zX.X.XzXxX.XzXdXzXzXzXcXcXzXxXxXxXxXnXxXdXnXnXcXMXdXxXxXxXvXnXnXxXnXnXnXnXMXmXnXMXnXmXnXmXnXJXmXmXmXmXnXmXmXmXmXMXmXMXmXmXmXmXmXmXmXmXmXmXMXMXMXmXMXMXMXmXMXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXnXcXxXxXxXcXdXcXxXdX@XdXdXdX'.zX.XdX.X.XdX.X.X X|.|._.|._._.(.(.`.(.`.(.(./.(././.!.(./.~.!.~././.~.~.~./.T.T.T.T.U.U.L.U.L.L.U.S.L.H.S.H.S.H.S.S.H.H.H.H.H.L.H.H.H.H.H.H.H.H.L.U.S.U.L.L.L.L.L.L.S.L.L.A.S.S.U.H.H.H.S.D.S.S.S.A.A.A.g.D.l.A.l.l.h.h.h.h.g.g.k.g.z.z.a.f.d.f.z.i.a.a.a.a.a.i.i.u.s.u.u.u.u.u.i.t.t.i.u.u.u.s.u.u.u.u.u.u.u.u.u.i.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.i.t.i.t.a.i.i.i.a.a.a.a.a.f.a.f.f.f.a.g.a.k.f.f.f.k.f.f.g.h.l.l.l.h.h.h.h.h.h.A.A.A.A.A.A.A.A.G.A.D.G.S.G.H.S.L.L.L.L.L.L.H.L.L.L.L.U.L.L.L.L.Y.L.I.I.L.I.U.U.T.T.T.T.T.T.T.~.R.~./././.^.(.(.(.(.(.(.(.(.(._.(.|._.|.|.|.|.|.'. X|. X.X.X.X|.|..X.X.X.X.X.XcX'..X.XzXdX.X.X.X.X'.'.zX'..X.X.X.X|. X X X|.|.|.`.`._._.|._.|._._._._.|._.|.`.^.`.`.^.`.(.|.`._._.}._._. X}.|.|.|.|.}.}.}.|.|.|.|.|.|.|.'. X|. X X{.}.}.}.|._.|.|._.}.|. X X{. X|. X X|.|.|.|._._._.^.`.|.`.(.(.`.`.|.(.(.(.{.(.~.(.(.(.(.(././.(./././.~.~.[.~.~.~.T.T.U.T.T.U.U.L.L.L.L.L.S.L.L.H.L.L.P.P.P.P.P.Y.P.L.L.U.L.L.U.Y.U.L.L.L.H.H.S.S.A.S.A.A.H.h.h.S.l.G.l.l.h.h.h.h.h.h.g.g.g.g.g.g.k.f.a.k.k.k.z.f.k.k.k.k.g.z.k.f.f.k.g.k.g.g.k.k.k.g.z.z.k.h.f.f.g.g.f.g.a.g.f.g.g.g.a.k.f.g.z.a.f.f.a.a.z.f.a.a.f.f.f.a.z.a.a.a.a.i.i.i.u.u.u.u.u.u.u.u.E t.t.y.r.r.r.r.y.t.y.y.y.r.E y.y.y.y.y.y.y.y.y.y.y.y.y.r.y.r.y.t.r.y.r.t.y.t.y.w.y.E r.t.y.y.y.r.y.y.r.y.t.t.y.t.y.r.y.r.r.t.t.t.t.t.r.u.t.u.t.u.t.p.u.t.i.i.u.",
+"H H H H H H H J J G H H H Z H H H F H H Z H H H H H H H G H H H J D H H H H H H L J J L S L L U P P J H J L J P J J L J P P I J J ) I I J I P J P P P P P H P J L L L L L L L L Z H D H D D D D Z Z D D C D F D Z D C Z D Z B B Z Z Z Z Z Z Z Z D B Z Z D Z C C Z C Z C C Z Z Z Z C C D C Z C C G C C B C C Z B C Z C B C D B D Z Z Z G Z Z Z Z Z Z Z Z Z H D D G H Z L L Z L Z L Z Z L Z L Z Z Z Z Z L G Z Z Z Z L Z Z Z T Z.D.H.L.H.L.H.G.H.S.H.H.S.U.L.L.L.L.L.L.P.L.P.L.P.P.U.T.Y.T.T.T.T.~.T.~.T.~.~.~././.~./.~./.~.(./././.(.(./.!./././.!./././././.(.~.(.(.~.~.(.E.T./.E.XX~.T.T.~.T./.[.!.~.~.T.~.T.~./.T./.Y././.~.(.!./././././.(.(.(.^.(.(.(.(.^.(.^././././././.~.~.T.T.[.~.T.T.T.T.T.T.T.T.T.T.T.T.T.~.~.^.~././.(././././././.(././././././././././.[./.~.(.(.(./.^.^.(.(.|.^.`.(.|._._.}.}.{.}.|.|._.|.|.'.|.'. X.X.X.X.X.X.X X.X.X'.dX@X'..X.XdX X.X'..X.X.X|..X.X X|..X`.|._.|.[._.|._.|.|.|.|..X|..X.X.XdX.X.X.X.XzXdXdXcXdXdXvXdXnXvXxXdXxXdXxXxXnXcXcXcXxXxXcXxXnXnXnXnXcXdXMXmXnXmXmXnXMXnXmXnXmXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXMXMXMXMXMXMXmXMXMXMXMXMXMXmXmXmXmXmXmXmXmXmXmXmXMXnXnXnXnXcXcXxXxXzXdXdXdXdXzXzX.XdX.X@XdX.X.X@X.X.X.X.X@X X|.|.|._.(.`.(.(.(.(./.[.~././././.~.~./.~.~.T.~.~.T.T.T.T.U.U.U.L.L.L.L.L.S.U.H.H.H.H.H.S.G.S.S.G.G.G.H.H.H.H.H.H.G.H.G.G.H.H.H.H.S.U.L.L.U.S.L.L.L.L.L.A.H.H.H.S.A.D.S.S.S.h.A.A.g.g.h.l.h.h.l.h.h.g.f.g.j.g.j.f.f.f.f.i.i.f.a.z.z.i.i.s.u.u.s.u.u.u.u.r.u.i.i.t.i.u.u.u.u.i.s.u.u.u.u.u.u.u.i.u.u.u.u.u.i.u.u.u.u.u.t.u.u.u.u.s.u.u.i.a.i.i.a.a.a.a.a.i.s.k.z.a.f.f.a.f.f.k.j.k.z.g.l.l.h.l.h.h.h.G.h.A.A.A.A.A.A.A.S.A.G.S.S.H.H.S.A.L.L.L.S.P.U.L.U.U.L.L.L.K.U.L.Y.U.P.T.U.U.T.I.U.U.T.T.T.~.T.T.T.~.T.~./././.).(.(.(.!.(.(.(.(.|.{.`._._.|.|.'.|. X X|.|..X.X.X.X X.X|..X.X'..X.X@XdXdX@XdX.X.XdXdXdXdXdX.X'.dX.X.X.X.X.X'.|.|.|.|.@X|. X(.|.|.|._. X_.|._.|.|.|._._.{.`.^.`.|._._.}._.}.}.}.}.|.|.'.|.|.|.|.|.|.|.|.|.|.'.|. X|. X|.|.|.|.}.}.|.|. X|.}.}. X[. X X[. X X|.|.{.|.{.`.`.|.`.|.{.`.`.^.(.^.{.(.(.{.(.(./.(.(.[.(./.^.^./././.~./.~.~.~.T.~.T.T.T.T.L.L.L.L.L.L.H.L.L.L.D.L.L.P.Y.U.L.L.U.L.P.L.L.L.L.L.A.L.L.L.L.H.H.S.A.G.A.A.h.A.g.g.G.G.g.z.f.l.h.h.h.h.h.z.g.g.g.j.a.f.f.z.i.i.k.f.f.d.d.d.k.f.f.f.f.f.f.k.j.g.a.g.g.k.h.g.g.h.f.f.j.h.f.g.f.a.z.g.a.a.g.f.k.f.f.a.g.d.f.d.g.a.s.a.j.f.a.a.f.f.a.a.i.i.i.a.u.i.u.u.u.u.t.u.u.t.t.t.y.r.t.y.y.t.y.y.y.r.y.y.y.y.y.y.y.y.y.y.y.y.y.y.r.r.r.r.y.r.r.r.r.y.r.r.y.r.y.r.w.r.R y.r.y.r.y.r.y.y.t.y.r.r.r.r.r.t.t.t.t.t.t.u.t.u.r.i.u.u.u.u.i.i.u.i.",
+"J H H J H H H H J L H H H H H Z H H H H K D H H G H H J H H H H D H D H H H H L Z I H H U L J L J H P P J J P P L P P P P P I I P P I J I J P P P H P L P J L L P L S L H L Z J H H H H D D D D Z Z F D D D Z Z Z Z G Z D Z H D Z F Z Z Z Z Z Z Z Z Z F B Z Z F C D C Z Z C C C C C C Z C C C Z C C C Z C C C C C F Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z D Z Z Z Z D Z Z G Z Z G Z G Z Z G Z G Z Z Z H Z Z Z Z Z Z L Z Z H Z J I A.G.H.L.L.L.H.L.H.H.H.S.U.S.L.L.L.L.L.L.P.L.P.P.P.Y.Y.Y.T.Y.Y.T.~.~.~.~.~.~.~././.~.~./.!./.(.).!./././.!./.(./././././././.T./.~./.~.K.!.~.~.~./.U.XXXXXX~.~.~.~.T.~.T.T.T.~.T.~.T.T.T.T.~./.T.~.~.~./././.(./.(.(.(.^.`.(.(.(.^.^.(.(.(.!.!.~.~.~.~.~.~.T.~.T.~.~.T.~.~.T.~.~.T.T.T.[.~.~./././././././.(./.(././.[./.[./././././.(././.(.~.(.[./.).^.(.(.(.(.(.(._.^._._.}.}.}.|. X X|.'.|.|..X|..X|..X|..X|..X.X.X.X.X.X X.X.X.X'.@X.X.X.X.X.X.X.X|..X|.|.|._.|._.|.|.|.|.|.|.|..X X.X.X.X.X.X.XxX.XxX.XxXdXdXdXcXdXcXnXcXxXcXxXcXnXnXxXcXcXcXxXxXcXnXnXnXnXnXnXmXmXmXmXmXmXMXcXmXnXMXmXnXmXmXmXmXmXmXmXmXmXmXMXmXmXmXmXmXmXMXmXmXmXMXMXmXMXMXmXMXMXMXmXmXNXmXdXmXmXmXmXmXMXnXnXnXmXcXcXcXcXxXxXcXcXxXdXxXdXzX.XdXdXdX.X.X.XdX.X.X|.|.|.|.|._._.`.(.(.(.(.(.(.(.(.~.~./././././.~.T.~.T.T.~./.T.T.T.T.U.Y.L.L.L.L.U.H.S.S.H.H.H.H.S.S.S.S.A.G.G.S.S.S.H.A.G.H.S.H.G.H.H.H.H.D.S.S.L.U.U.L.S.A.K.D.U.H.H.S.S.S.A.Z.A.A.A.A.g.A.A.h.k.g.z.h.g.z.f.g.g.f.z.z.a.a.a.k.k.i.i.a.i.s.i.i.i.u.i.u.u.u.t.u.u.t.u.t.i.u.u.u.u.u.u.u.u.u.u.i.u.u.u.t.u.u.u.u.r.t.u.t.u.u.u.t.u.u.u.u.u.i.i.u.t.i.a.i.i.a.a.f.s.i.a.s.f.f.f.f.k.k.f.k.h.z.h.h.l.h.A.l.h.h.A.A.A.h.A.A.A.A.A.S.S.S.S.D.H.H.L.U.L.L.L.P.P.U.U.L.U.L.L.L.R.U.U.L.U.Y.L.U.U.I.T.T.T.T.T.T.T.T.~.T.~.~.(./././.(.(.(.(.(.^.{._.(._._._._.|._.|.|..X|..X.X.X'..X.X|.|..X.X|..X.X.X.X.X X.XdX.X XdX.XdX.XzX'.zX'.dX.X.X.X|..X|..X X X|._.|.|.`._._._. X|._.|.|.|.|.|.|._.`.`.|.^.(._.|.}. X X}. X}.|.|._.|.|.|.|._.|.|.|.|. X|. X@X|._.|.|.|.|.|.|. X[._.|.}.}.|.|.%X X X X|.|.|._.|._.^.`.{._.`.(.(.`.(.(.(.(.`.^.(.(.(.~.(.(.[.(./.(././././././.T.~.[.T.T.T.T.T.L.Y.L.L.L.L.H.L.L.L.L.U.L.L.L.L.L.L.U.L.P.L.P.U.L.L.L.L.A.L.S.L.H.H.H.S.A.S.A.H.G.g.A.l.l.g.h.h.l.h.h.h.h.h.z.z.g.g.g.a.f.f.f.z.f.f.i.f.k.d.k.x.f.f.f.f.f.f.f.z.g.g.k.k.k.k.f.g.k.h.k.f.f.j.j.g.z.f.f.g.i.f.k.f.f.z.g.a.a.g.a.g.a.g.a.f.a.a.s.j.a.a.i.a.i.u.u.t.u.i.u.u.t.u.t.t.t.t.t.t.r.r.r.r.E r.y.r.y.y.y.y.y.y.y.y.y.y.y.y.w.y.y.y.r.y.r.r.r.r.y.r.r.r.r.r.E y.w.y.r.y.y.y.y.y.w.y.t.y.y.t.r.r.r.r.t.t.t.p.u.u.t.t.t.u.u.u.i.u.u.i.i.u.i.s.",
+"H H H U L L H L H L H H H H H H H H H H J H H H L H H H L L L D L L Z D L L H H H K H H J J J P J K P J P P P J Y P L P I I I I P ) I I P P P P P P P J J L J U H P L H L L H H H J H D D D D D D D D F Z Z F Z Z Z Z Z Z Z Z Z C D B D Z Z Z C C C Z Z C C C D C C B Z D C C A C B C Z B Z C C C C Z C C C C C C C C C Z D Z Z D B Z D Z Z B G Z Z D Z Z Z G Z D Z G D D D Z Z Z D D Z D D D D Z Z Z Z Z Z D D Z Z L H D L T P.U.L.S.U.H.H.G.H.H.H.L.L.L.L.L.L.L.L.U.L.P.L.U.L.T.L.T.T.T.T.T.T.~.~.T.~.~.~.~.[.~./.~././.~.[.!.~.!.^././.(./.~.~./.~.~.~./././.R.).~.~.~./.~.~./.T./.T.~.~.[.T.T.T.~.T.T.T.~.~.T.~.~.~.~.~./.~./././.(././.(.(.^.^.(.(.(.(.`.`.(.(.(./.~.!./.~.~.T.~.T.~.T.~.T.T.~.T.T./.T./.~.E./.!.!./././././././././.(.(./.(././.~./.!./././././.(./././.(.(.(.(.^.^.`._._.(._._._.|.'.|.|..X|.|._. X'.|..X.X.X.X.X.X.X.X X.X.X.X.XdX.XdX.XdX X.X'..X X.X.X'.'.|.|.`.|.`.|.|.|.|.|.|.|. X.X X.X'..X.X.X.XdX.X.XzX.XzXzXzX@XxXvXdXcXdXcXxXxXxXxXcXcXnXcXcXcXcXcXnXxXnXcXnXnXmXmXMXmXMXNXmXmXnXMXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXfXNXMXMXmXMXMXMXMXmXMXMXMXMXMXMXMXSXmXMXMXmXmXnXnXnXnXmXnXcXcXcXcXxXdXnXzXzXdXdXdX.XzXdX.X'..X.X#X.X.X.X.X'. X}._.{.`.(.(.(.(.(.(.(.~.(./.(./.T.~.T.T.~.T.T.T.T.T.T.T.U.Y.U.P.U.U.L.L.L.L.L.G.G.H.A.S.S.D.h.A.H.G.G.H.A.G.G.S.S.G.H.H.H.H.H.H.G.G.H.H.H.K.H.H.H.H.H.L.G.S.S.A.A.A.A.A.A.A.S.A.g.k.g.h.h.k.h.g.h.g.j.z.z.a.g.f.f.f.k.i.i.a.a.a.a.a.a.i.i.i.a.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.u.p.u.i.t.t.s.t.s.t.s.u.t.t.u.u.u.u.u.u.u.s.a.i.u.i.a.i.a.a.a.i.i.a.a.f.a.k.a.z.f.f.f.f.g.h.g.l.l.l.l.j.Z.h.A.A.A.A.A.A.Z.A.A.A.G.H.H.H.S.P.L.S.P.P.L.L.U.P.Y.L.L.P.Y.U.U.Y.L.U.T.U.Y.U.U.Y.I.U.T.T.T.T.~.T.T.T.T.~.~.~.(.(.(.(.(.(.(.(.(.`.(.(.`.`._.|.`._.|.|.|.|. X X.X|..X|..X.X X'..X|..X'..XdX@X.X.XdX.X.X'..X.X.X.X.X.X.X.X'..X'..X X.X|.|.|.|.|.|.|.|. X X|.|.|.|.|.|.|.|.|._._.|.|._.|.|.|.|.|.|.|. X X'..X|.|.|.|..X'.|..X|..X|.|.|.|.`.|. X`.`.`.`._._._._.|._.|._._.|.|.|.}.}.|.}.|._.|._.|.{.(.^.|.(.^.(.|.(.(.{.(.(.(.(.(.(.~.^././.(.(.[.[./.~.~.~.T.~.T.T.T.Y.U.P.P.L.L.L.H.L.G.L.L.S.U.L.L.L.L.L.L.L.U.L.G.U.L.L.L.L.L.H.H.H.H.h.A.A.A.A.A.A.A.A.l.l.l.l.h.h.h.z.z.z.h.h.g.k.a.g.a.g.f.g.f.f.a.a.z.a.a.z.a.a.f.i.f.d.f.a.f.k.f.f.f.k.g.z.g.g.k.f.z.g.g.k.k.k.k.a.g.a.j.s.k.f.f.f.a.g.a.a.f.f.a.g.f.a.a.a.k.a.a.f.a.t.i.a.i.i.i.u.u.t.u.t.u.u.p.r.t.r.r.r.r.r.r.r.y.y.y.y.y.r.y.w.y.y.y.y.y.w.y.y.r.y.r.y.y.r.y.r.y.r.r.r.r.y.y.t.y.E y.y.y.y.y.y.r.y.y.y.r.t.r.r.r.t.t.u.t.u.u.u.u.u.u.u.u.u.i.i.u.i.i.i.i.i.",
+"H H H H H H H H L H H H H H H H L H H H Z H Z H H H H H L Z D L L L L D H D H L H H L H J J P J H U P J J J L P P I J P P J I I P P P S I P P P P L H I P L P L H L L H Z H H H D F D H Z D D D Z G Z Z Z Z Z Z Z Z Z D Z Z Z Z B Z Z Z Z C B Z Z Z C C Z C C C F D C C C F C B C D C C D C Z C C C C C C Z Z C Z Z Z Z C B Z Z Z G Z Z Z Z Z D Z Z Z Z Z Z D B Z D Z Z G Z L Z D Z D H Z D D D H Z H Z Z Z D Z H Z Z D Z H [ U.S.U.L.L.H.K.H.H.H.H.H.K.L.S.S.U.L.L.L.P.P.U.U.U.L.Y.U.Y.P.T.T.~.T.T.[.~.~.~.~.~.~.~./.~.~./.~.~.~.~.~.^.~.~.^.^.~.~././././.~.~.~.!.~./.~.!.~.~.E.XX~.~.~.T.U.E.T.[.~.~.~.T.T.~.~.T.T.~././.~.~./.~.^.E.(.^.(.(.(.(.(.(.(.[.!.[.(.(././.(.~././.~.~.~.T.~.~.~.~./.T./.~.~./.T.~.~././././././.(.(.^.(.(.(.(./.(.(.^./././././.^./.^./././.(./.(.^.(.(.(.^.{._.^._._._._._.|.|.|.|.|.@X|.'. X.X.X.X.X.X.X.X.X.X.XdX.X.X.X.X.X.XdX@X.X.X.X.X'. X.X|.`.@X|.|.|.`._.|.|.|. X'.'.|..X X'..X.X.X.X.XdX.X.X.XzX.XxXdXdXcXdXxXcXxXxXcXcXxXxXxXcXnXxXxXnXcXnXxXnXnXJXcXmXmXmXmXmXMXMXmXmXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXMXMXMXMXMXMXMXNXmXMXMXMXMXMXMXSXfXMXmXMXmXmXmXmXnXnXcXnXcXxXxXxXxXvXdXdXdXzXdXvXdX.XdXzXzX.XxX.XzX.X.X|.|.|._.|.|.`.`.`.^.(.(.(.~.(./.~.~./.~.~.~.[.~.T.T.T.U.T.T.U.T.P.P.P.D.L.L.H.L.H.G.H.S.G.A.S.S.A.S.A.A.G.A.A.H.H.H.S.S.G.A.H.A.H.h.H.S.G.G.H.H.H.H.H.H.S.S.G.S.S.S.A.A.A.A.h.A.A.A.S.h.g.g.k.k.h.k.h.g.k.a.a.g.f.f.f.f.a.a.i.i.a.a.a.a.a.a.i.i.i.r.i.r.u.u.t.u.u.u.u.u.u.u.u.u.u.u.u.r.u.u.p.u.u.u.t.t.u.t.t.u.p.t.t.s.t.u.u.u.u.u.u.u.i.u.i.i.i.u.i.i.i.a.i.f.a.a.a.a.f.k.f.k.z.f.j.g.h.h.l.l.l.l.A.A.h.A.A.H.A.A.S.S.H.H.S.S.H.H.H.J.S.L.P.P.P.U.L.Y.P.P.T.Y.U.U.P.Y.U.U.L.U.U.U.Y.Y.T.T.T.T.T.T.T.T.T.T.~.~.T.~.~.[.~.(.(.(.(.(.(.(.`.`.`.^.(.|.|._.|.|.|.|.|.|.|. X|..X.X|.|.|.|.|..X.X.X'..X.X'.dX.XdX.X.X.XxXxXzX.X.X.X.X.X'. X X.X X@X.X.X'..X X|..X|.'.|. X.X.X.X.X|..X|.@X'._.|.|.|.|.|.|.|.|. X'.|..X|.|.|.|.|.|.|..X.X X.X|. X|.`.|._.}.`.|._.`..X_._. X_.|._.|. X_. X_.}.|.}.}._.|.|._.^.|.`.(.(.(._.(./.(.{.(._.^.(._.(.(.`./.^./.(././.(./.~.~.~.~.T.T.T.T.U.P.P.L.L.L.H.L.G.L.S.L.L.L.U.L.L.L.L.L.U.P.U.U.U.L.L.H.L.L.L.H.H.H.S.H.A.A.A.A.g.l.A.l.l.l.l.h.h.z.l.h.h.h.g.g.g.g.g.f.z.f.a.i.k.a.k.a.a.a.a.k.a.f.f.f.i.a.f.a.k.f.f.f.f.a.z.a.g.h.f.g.f.z.a.k.k.d.k.g.a.f.f.a.f.f.g.a.a.f.a.a.a.f.a.a.a.f.a.f.a.a.a.a.a.i.a.i.u.u.i.u.u.u.u.t.t.t.t.t.r.r.r.r.r.t.y.w.r.y.y.y.y.y.y.E y.y.y.y.y.y.y.r.r.r.r.r.r.r.r.r.r.r.r.r.t.y.r.y.r.w.r.y.y.r.y.w.y.t.r.y.y.r.r.t.t.u.t.u.u.u.u.u.u.u.i.i.i.u.u.a.i.i.i.i.i.",
+"H H H H H L J H L H H H H H H H Z H H H J Z H H U H H H H H L D L Z H H H H H H H I H L H L P J H P P P P P L P I L P I P P ) I P P P ) I P P P P L P P J L L L H J L L H H H H H D H H H D F Z D Z D Z Z Z Z Z Z Z B D Z Z B D Z Z B D Z Z D C C C C D Z C Z D C C C C C C C C C C C Z B Z C C C F C C C C Z C C Z Z C Z Z D Z Z Z D C Z Z Z Z Z C Z Z Z Z Z Z D D D D Z Z Z Z Z D D Z D D D Z D D Z H Z H Z Z Z H Z H H H T Z.F.S.S.U.H.H.H.H.H.H.H.H.L.L.L.L.L.L.L.L.U.L.L.L.L.U.U.U.T.T.T.T.T.^.T.~.~.~.~.~.!.~.!.~.~.^.~.~.~.~.~.!.~.~.~.~./.!./.~.~.~.~./.~.).T./.~.~.~.!.U.XX~.~.~.~.XXXX~.T.T.~.T.~.T.~.Y.~.~.~./.~.T.(.~./.~./.(./.(.(.(.(.(.(.[.{.(.(.(.(.(./.~./.~./.~.~.~.~.~.~.~.~.~.~.~.~./.~./.~.~.(./.(./.(.(.(./.(.(././.(.(.(.(.(.[.(./.(././././././././.(.(.(.(.(._._.|._.|._._.|.|.|.|.|.|.|.|.|.'..X'..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XdX.X.X.X'..X.X X.X X|..X|..X`.|.|.|.|.|.|.|. X|..X|..X.X.X.X.X.X.X.XxXxX.XxX'.zXdX.XzXzXzXvXxXzXcXcXxXxXxXcXxXxXJXdXnXxXnXnXcXmXmXmXmXmXmXMXMXmXmXmXMXnXnXmXmXmXnXnXmXmXmXmXmXmXMXfXmXmXmXmXmXMXMXMXNXMXMXMXMXMXMXMXMXmXMXSXMXMXMXMXMXMXMXmXmXmXmXnXnXnXnXcXxXxXcXcXdX%XdXcXdXzXdXzXdXdXdXdX.X.X.X.X.X.X.X X|.|._.|.(._.^.`.(.^.(.(./.~.~./.T.~.~.~.T.T.T.T.T.T.T.U.P.P.P.P.L.L.L.L.H.L.H.H.H.S.S.S.S.S.S.S.A.G.A.G.A.H.A.A.S.S.S.A.A.H.S.S.A.H.A.H.A.H.H.H.G.G.A.H.S.A.A.A.A.A.A.A.A.A.j.g.h.g.g.g.f.f.a.z.z.z.g.a.f.f.f.f.a.a.a.a.f.i.k.i.a.a.i.i.i.u.i.i.u.u.u.u.u.t.t.u.u.u.u.t.u.u.u.u.u.u.u.u.r.u.t.u.u.t.u.s.s.t.t.u.u.t.t.t.t.u.u.t.u.u.u.i.u.i.u.u.i.a.u.i.i.a.a.z.z.a.f.f.f.k.f.f.f.h.l.l.h.g.l.l.A.A.A.A.A.A.H.H.S.S.G.H.Z.H.H.G.L.L.P.U.U.P.P.U.P.T.P.P.U.U.U.U.Y.U.U.U.P.Y.U.U.U.T.T.T.T.T.T.T.T.T.T.T.T.~.~.~.~./.[.(.!.(.(.(.(.(.^.(.`.`.{.|._._.|.|.|.|.|.|.'.|..X|..X.X.X|. X.X|..X.X.X.X.X'.zXdX.XzXzX.X.X.XzX.X.X.X.X@X'..X.X.X.X X X.X|.|.|.|. X X|..X|.|..X.X|.|.|..X X|.|.|.|.'. X|..X'.'. X X.X X|. X X'.|.|. X|..X.X|. X|.|.'._.|._._._.|.|._._.|.{._.|.|._.{.|. X|.|.|.}.}._.|.(._.|.`.`.^.{.(.(.(.(.(.{.(.^.`.{.^.(._.^./.(././.(././././.~.~.T.^.T.T.T.I.P.L.L.L.H.L.G.L.S.L.L.L.L.L.L.L.S.L.L.L.D.U.S.L.H.L.L.H.G.G.G.H.S.S.A.A.A.A.A.A.l.l.h.h.l.z.l.l.z.g.h.h.g.g.g.g.f.h.g.f.g.a.g.z.a.z.a.a.a.a.a.a.g.a.f.i.a.f.f.a.f.f.f.f.k.a.k.k.j.f.j.f.f.f.k.d.f.g.a.g.f.f.f.k.f.a.g.a.i.g.a.f.a.a.a.a.a.a.a.a.a.a.a.a.a.i.i.u.i.u.u.u.u.u.u.t.p.t.t.r.r.r.r.r.w.r.y.E y.y.w.y.y.y.y.y.y.y.y.y.r.y.r.y.y.r.r.r.r.r.r.r.t.r.r.y.r.y.y.r.y.y.y.t.y.r.y.y.y.t.r.r.r.t.t.t.u.u.u.u.u.u.a.u.i.i.i.s.i.i.i.i.i.i.i.a.",
+"P H H J L H L L L H H H H H G J H H H J S I H H H H H H H H H L L H H H L H L H H H U H P K P L J J J P L J P L P P P P ( I L ) I ) P P Y P P P P J H P J L L P H L L L H H H H D H D D Z Z D Z D D D Z Z Z Z Z Z B Z Z D B Z Z C D Z C C C Z C C Z C C C C B Z Z C C Z C C C C C C C C C C C C B B u C C C C C Z C C D B Z Z Z Z Z Z Z Z Z Z D G C Z Z Z D C D D Z D Z Z H Z H A D D D D D D D D D D Z Z H L Z D H H Z L L U Z.S.L.U.S.H.L.G.S.H.H.H.L.L.S.L.U.L.L.L.L.L.L.L.U.U.U.U.T.Y.T.T.~.T.T.~.~.T.[.T.[.~.[.~.~.~.~.~.~.~.T.~.~.~.~.~.~./.~.~.!.~./.!.~.(.T.].!.~.~.~./.XXXX~.~.~.~.U.XXT.~.~.T.~.T.~.~.~.~./.(.!.~.!.T././.~./.~./././.(.(.^.{.(.(.(.(.(.(./././././.~./.~.^./.~.~.!.~.~.~.~././.~./.~.^.~././.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.!.(.^./.(.^.(.(./.(.(.(.(.(.(.`._._._._.`.|.|.|.|.|.|.|..X|.|..X.X|..X.X.X.X.X.XcX.X.XxX@X.X@XdX.XdXdX.X.X X X.X X.X|.|.|.|.|.`.|.|._.|.|. X.X.X X.X X XdX.X@XdXdXdX.X.X.X.XzX.XzXzXdXzXzXnXdXvXdXcXnXxXxXxXnXxXnXxXnXnXnXnXmXmXmXmXmXmXmXmXMXnXmXmXMXnXmXmXmXmXJXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXMXmXMXMXMXMXMXMXMXMXmXNXfXMXMXMXMXmXMXmXmXmXmXcXmXcXmXdXnXxXxXxXzXcXzXfXdXvX.XzXdXdX.XdXdX.XxX.X.X.X.X.X X|.|.|._.`._.^.(.(.|.[.~./.~./.~./.T.T.T.T.T.T.T.T.U.U.U.U.L.L.L.L.L.H.F.S.H.H.H.A.S.S.S.S.S.S.A.G.A.A.A.A.A.A.A.S.A.A.G.A.S.A.A.H.A.G.G.H.H.l.G.H.A.H.A.A.S.A.z.A.A.z.A.h.h.A.g.g.g.g.a.f.f.g.a.a.f.f.g.f.f.a.f.a.a.a.a.i.i.i.i.a.i.i.i.i.i.i.u.u.u.t.u.i.r.u.u.u.t.u.u.u.u.u.u.t.u.t.u.i.t.p.p.t.t.t.t.t.t.u.t.u.t.u.t.t.u.u.t.u.u.i.t.u.i.u.a.t.a.a.a.s.a.a.a.a.a.k.f.f.f.k.k.k.k.l.l.h.G.l.l.S.h.h.A.G.H.G.A.G.G.S.H.W.H.I.K.L.L.L.U.Y.U.P.P.P.P.T.T.T.T.T.U.U.Y.U.U.Y.T.T.U.T.T.Y.T.T.T.~.T.~.T.[.T.T.~.~.~.~.~.^.^.(./.(.(.`.^.`.(._.^.`._._.|.|._.|._. X|.|.|..X X|.|.|..X|.|.|.|. X.X.X.X'..X'.dX.X.X.X.X.X.X.XzX.X XdX.X.X.X.X.X'. X X|..X.X.X|. X.X.X.X.X.X.X.X.X.X.X'. X.X.X X X.X.X.X|..X.X.X.X.X.X.X X X|.@X'.|.|.|.|.|.|._._.|._.|. X_._._._.|.|._.|._.(.|.|._.{.|.|.[.}.}.(._.|._._.{.(.|.(.|.|.(.(.^.^.|.`.^.^.`.(.[.(.(.(.(./.(././././.~.T.T.T.T.T.T.I.P.U.U.S.H.L.L.L.L.S.L.S.S.L.U.A.L.L.L.L.U.U.L.L.L.H.L.H.H.G.A.H.S.A.A.A.A.h.A.g.h.h.h.h.l.z.j.z.l.h.z.l.a.z.g.g.g.a.a.g.a.a.d.a.a.z.a.a.a.a.a.k.a.g.a.a.a.f.a.f.a.k.a.a.a.z.i.k.f.f.a.f.z.g.a.k.a.a.g.a.s.f.a.a.g.a.a.a.a.g.a.k.f.a.z.s.a.a.a.a.a.a.i.a.a.i.u.i.u.u.u.u.u.u.u.t.t.t.r.r.r.r.y.r.r.y.y.r.y.y.y.E y.y.y.y.w.y.y.y.r.t.y.r.r.r.r.r.r.r.r.r.r.r.r.r.y.r.r.y.r.y.y.y.y.y.r.y.y.y.r.r.r.t.p.p.u.u.u.u.i.u.a.t.i.s.i.a.i.a.i.a.a.i.i.k.",
+"S J J Z H J L D H H J H H H H H H J Z H L L L H Z L L L H H H L H H H H H H H H U H P H H L P P J J J J P P J I P P P P P P P P I ) ) P J P P P P J P P J L U H J P H H H H D D D D D D H Z Z D Z Z Z Z Z Z B Z Z C C Z Z C Z Z Z C Z C Z D C Z C C D C C A C C C C C B C C C C C C C B B C C B C C A C B Z C C C D Z C Z Z C Z Z Z G Z C Z Z C Z Z D Z G Z Z Z Z Z Z D D Z D Z H D D D D D D D D D L L H H Z H D H Z L Z Z U b.H.L.L.H.L.H.K.H.H.S.H.H.L.S.L.A.U.S.L.L.L.P.L.L.U.L.P.Y.T.T.T.T.~./.T.~.~.~.~.~.~.T.~.~.~.~.~.T.~.T.T.~.T.T.T.~.~.~.~.!.~.~.^.~.~.~.~.~.~.~.~./.T./.T.~.~.~.T.~.~.~.~.~.T.~.~.T.(./.~.~.(./.R.).~./.~././././.(.(.(.(.(.^.(.(.(.(./.(././././.!././.!./.(.~./.~.^.^.~./.(.~.T.(./././.(.(.(.(.(.(.].(.(.(.(.(.(.`.(.(.(.(.(.(.^.(.(.(.{.(.^.(.^.`.(.`.`.^.|._._._._._._.|.|.|.|.|..X|..X.X.X.X.X.X.X.X.X.X.XzX.X.XzXzX.XdX.XdX.X.X.X@X X.X.X|.|.|.|.|.|.|.|.|.|. X|.|.|.|.|. X.X.X.X.X X.XdX.XzXdXdX.X.XzX.X.XzXzX.XcXdXzXvXxXxXxXvXxXxXxXxXnXxXnXnXcXmXvXmXmXmXmXmXmXmXmXMXmXmXnXnXnXnXnXMXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXMXMXMXMXMXMXSXfXmXMXMXMXmXMXMXMXMXMXMXMXmXMXmXnXnXnXnXcXxXxXxXxXzXzXcXdXdXdXdX.XzXzXzXzX.XdXdXdXdX X'.dX X X.X|.|.|.|.(.(.(.^.{././.~.~.~.~.~.T.^.T.T.T.U.U.U.L.L.L.L.L.L.L.L.U.L.G.G.H.H.H.S.S.S.S.S.S.A.A.A.l.A.A.A.A.A.S.H.g.A.A.A.G.A.G.A.G.G.A.A.A.G.A.h.J.A.A.A.A.A.h.A.h.S.h.h.h.h.z.g.g.a.g.j.s.f.a.z.g.z.i.f.f.k.a.a.a.a.i.i.a.i.a.i.i.i.i.i.i.u.u.i.u.s.t.r.u.t.u.t.u.u.u.u.u.u.u.u.u.u.u.t.u.t.t.t.t.t.t.u.t.t.p.u.t.u.u.t.t.u.r.u.t.u.i.u.u.u.u.u.i.a.i.i.i.a.a.a.a.g.f.f.f.g.g.g.h.l.l.h.A.A.A.Z.h.A.H.H.H.S.S.H.H.H.H.H.S.L.L.L.L.U.U.P.P.P.T.P.Y.T.T.T.T.T.T.Y.Y.Y.T.U.U.T.T.T.T.T.~.~.T.T.T.~.T.~.T.~.T.~.~.~.~.~.~././.(.(.^.(.(.^.|.(.|._.`. X(.`.}.}.|._._.|.|.'.|.|.|.|.|._.|.|. X.X|.'.|..X'.@XzX.X.X.X.XzX'..X.X.X.X'.dX@X.X.X X X.X X|..X.X.X X X@X X.X.X|..X@XdX X X.X.X X X.X.X.X.X.X.X.X.X.X.X.X.X X.X X.X'. X|.|.|.|.|._.|._.|._._.(.|._._._.|._.|._.|.(.`.|.`.|._._.[.|.{.`.(.|._.|._._.`.^.(.(.^.(.(.(.(.(.(.`.^.(.(./.(.(.^.^./././.~.T.~.T.T.~.Y.T.Y.P.P.L.L.L.D.H.H.H.U.D.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.H.H.H.H.h.H.h.A.A.A.h.h.h.h.h.h.h.k.h.g.g.g.z.h.h.k.k.g.g.k.k.k.f.f.g.d.a.g.a.a.z.a.a.a.a.a.a.f.a.a.a.g.a.f.f.a.a.k.f.f.f.f.f.f.k.f.f.f.k.a.f.a.a.f.a.a.a.z.a.a.a.f.a.a.f.a.a.a.a.a.a.a.a.a.a.a.i.a.a.u.s.u.u.u.u.u.u.u.u.u.p.t.r.r.r.r.r.r.r.y.r.y.r.y.y.r.y.y.y.y.y.y.y.r.y.r.y.t.t.t.t.r.t.r.t.r.r.r.t.r.t.w.y.r.y.r.y.r.r.t.y.r.r.r.r.r.t.t.t.u.u.u.u.i.i.a.i.a.i.a.a.i.a.i.a.a.d.i.f.i.",
+"P Z L L L D J H H H H H H H H H Z J J Z S L L L P H Z P H H H H H J H P J H J H J H H P H J P P P P J Y P P P J P P P P ) P ) ) I P P P P P P P P P H P J L L H H H L H H H H H D D D D D Z D Z Z Z F Z C Z D Z F Z Z C C Z D C B Z C Z C B C Z B D C C C D C C C C C C C C C A B B C C C B B C C C C C C C C D Z B C Z Z Z Z Z B Z C Z G Z F D Z Z Z B B Z C Z Z Z Z Z Z D Z Z D D D D D Z D D D Z Z Z H Z H H D Z L D Z Z P T Z.L.L.A.L.H.G.H.H.H.L.H.L.L.L.L.L.L.L.L.P.L.P.P.L.L.P.T.T.T.~.T.T.T.T.T.T.T.T.~.~.(.T.T.~.T.T.~.~.T.~.T.T.~.~.~.~./.~.(.!.~.~.~.~.!.!.~.~.~.~.!./.T./.~.~.T.(.~.~.T.T.~.~.~.~.~./.T./.~././.(./.~./.[./././.(./.(.(.!.(.(.!.!.(.(.(.(.(.(././.(.(./././.(.~././.~.)./././.^.{.(.^.(.(.(.(.^.`.(.(.{.(.(.(.(.(.(.(.(.(.(.(.(.!.(.(.(.(.(.(.|.(.^.(.(._.(.}.}.|.^.|._.|.|.|.|.|.|..X X.X.X.X.X.X.X.XdXdX.X X.X.X.X@X.X.XzX XdX.X.X.X.X X X|.|.|.|.|.|.`.|.@X|.|.`.|.|.|..X.X.X.X|..X.X@XdXdXdX.XzXdXdXdXdX.XzXzX.XzX.XzXzXzXzXdXvXxXxXxXnXxXnXnXnXnXnXcXmXMXmXmXmXmXmXmXmXmXmXmXMXnXMXmXmXnXMXmXnXnXmXmXmXmXmXMXmXmXmXmXmXmXMXMXMXMXMXMXMXMXNXMXMXMXmXMXMXMXMXMXMXmXmXmXmXmXnXnXnXcXcXxXxXdXdXcXzXdXcXdXvXzXzX%X.XxX'.zX@XdXdX.X.X@X X X X'._._._.^.(.(.(.(././././.^.~.T.T.T.P.T.T.T.P.U.L.L.L.L.L.S.H.L.D.H.H.S.H.H.H.A.S.S.S.S.S.A.A.H.A.A.G.z.A.A.S.h.H.l.A.A.A.l.A.G.A.A.A.A.G.A.A.G.A.h.A.A.A.h.A.A.j.S.h.h.h.h.z.g.g.a.g.z.z.i.a.k.g.a.a.g.f.a.a.a.a.a.a.a.i.a.i.a.i.i.i.i.i.a.u.u.u.u.t.u.u.t.u.t.t.u.t.t.t.u.t.u.u.u.t.u.u.t.t.t.t.t.t.t.t.t.t.t.t.u.t.t.u.u.u.u.u.t.t.u.u.i.i.u.i.i.u.u.i.i.i.a.a.a.a.a.f.f.f.g.h.h.l.l.A.h.h.A.h.A.A.S.S.A.S.H.H.H.L.S.L.L.L.U.L.L.P.P.P.P.T.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T./.T.T.~.T.~.~.~.~.!.~.~.~.~./.(././.(.(.`.(.^.|.(.|.(.`.`.`._.|._.{.|.|.|.|.|.|.|.|.|.|.|.|. X|._..X.X X.X.X.X.X.X.X.X.X.X.X'..XdX.X X.X.X.X.X.X.X.X.X.X X|..X X X.X X|. X.X'..X X'..X.X.X.X.X.XdX@X.X.X.X.X X X.X.X.X|..X|._.|.|.|.}._._._._.|.}.|.|._._._.|.{.|._._.|.^.|.(.^.{.|.|.|.^.^.(.`.`.(.|.|.{.|.`.`.`.`.`.(.(.|.`.(.^.`.(.(.(.(./././.^./././.~.Y.~.~.T.T.T.U.T.P.U.L.L.S.L.L.H.L.H.H.L.L.S.L.L.L.U.L.L.L.L.L.S.A.S.H.G.J.S.S.A.H.A.A.G.Z.h.h.h.h.h.h.h.h.g.g.f.f.z.h.k.g.g.g.g.g.k.f.f.g.a.f.a.a.a.i.a.a.a.a.a.a.a.f.a.a.a.a.a.a.a.a.f.f.f.f.f.f.f.a.f.f.f.z.i.a.f.f.a.a.f.a.f.a.f.a.a.a.a.a.a.a.a.a.a.a.a.a.a.i.a.a.a.a.i.u.u.i.u.u.u.u.u.u.u.u.u.p.t.r.r.r.y.r.r.y.r.y.y.y.y.r.y.y.y.t.y.r.y.r.r.r.r.t.t.t.t.t.t.r.r.t.r.t.r.t.y.t.r.r.y.r.y.r.y.t.y.r.t.r.r.t.t.u.u.u.u.i.i.i.a.a.a.a.a.a.i.a.a.a.a.i.i.f.i.",
+"H L J H J H L L H P J H H H H H H S J Z L Z L J J L L Z L L L L H H H J H H H P U H P H J J J U P P P K J P P P P P J I J P ) S I I I P ) P P I P P J P J P H J H H H H H Z H D D D D D Z Z Z Z Z Z Z Z Z Z C Z Z C C Z C B C C Z C C C C C C C C B C C C C C N C C C C C C A C C B B C B C C B A B C C C C C C Z Z Z C C Z Z D B D Z D Z Z Z Z Z Z Z G Z D Z Z Z Z Z Z D Z Z Z D D D D P H H Z L Z H Z H H Z Z Z Z J Z Z D D T Z.L.H.L.H.H.S.G.L.L.H.L.S.L.L.L.L.L.L.L.P.L.L.P.U.T.T.I.T.P.T.T.T.T.~.T.T.~.~.~.T.~.T.~.~.~.~.T.T.~.T.T.~.T.~.T.~.~.~.~.~.~.~.~.~./.~.~.~.~.!.~.U./.XX~.~.~.[.T.~.~.T.~.T.~.~.~.~./././.~./.~.~././././.!././.(./.[.!.[.(.[.!.[.(./.^./.(./././.E.^././.(.^./././././.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.(.(.(._.(.^.(.^.(.(._.(.`.^.(.(.(.^.(.|._.`.|.(._._.}.}.{.}._._.(.'._.@X|.|..X.X'..X.X@X.XxX.X.X.XzXdX.XdXdXdX.X.X.XdX.X.X.X.X.X|..X|.|.|.|.|._.|.|.|.|.|.|.|.|.|..X.X|..X.X.X'..X'..X.XdX'.dX.XdXdXzXzX.XzXzXzXzXzXzXzXxXzXxXxXxXxXxXxXvXnXnXnXmXmXmXmXmXnXJXnXmXmXmXmXmXnXmXnXnXmXnXmXmXmXmXmXmXcXmXmXmXcXmXmXmXmXmXMXMXMXMXMXMXMXMXMXmXMXMXMXMXMXmXMXmXmXmXmXmXmXmXmXcXnXcXcXdXcXdXdXnXzXdXcXdXdXcXdXdXdX.XzXdXzX.XdX@X X.X'.'. X`._.|.(.(.(.(.^.(.~.~.~.^.T.~.T.T.T.T.T.T.Y.P.U.L.L.L.H.H.H.H.H.S.H.H.H.A.H.S.S.S.S.G.G.S.S.G.S.A.A.A.A.h.A.A.A.A.A.l.A.A.A.h.A.j.A.A.G.A.A.A.g.A.A.A.h.A.A.h.A.A.h.h.h.l.k.g.a.a.g.a.a.i.i.k.i.i.z.i.i.a.a.a.a.a.a.a.i.i.i.s.i.i.i.i.i.a.u.p.u.u.u.u.t.t.u.t.u.t.t.t.u.u.t.u.t.u.t.u.t.u.t.t.t.t.t.t.r.t.r.t.t.t.t.t.t.u.u.u.u.u.t.u.u.u.u.u.i.u.i.u.u.i.s.i.a.a.g.a.f.f.f.z.g.h.h.l.l.A.A.A.A.A.A.H.G.S.S.S.H.H.K.J.L.L.L.L.Y.L.L.P.P.T.T.Y.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.T.~.T.~.~.~.~.T.~.~.[.~.~.(.(.T./.{./.^./.(.^.(.(.(.^.`.`._.(.^._.}.|.|.|.|.|.|.|. X{.|.|.|.|.|.|.|.|.|.|..X.X.X.X.X.X.X.X.X.X.XdX'.'.'..X.X.X.X.X.X|..X.X|..X X.X X.X X X.X|..X.X.X'..X.X.XdX X.XdX.X.X X.X.X.X.X.X.X X|..X|. X|.|.}.}.}.|.|._._.[.}.}.^.|.}.}.|.[.}.}._.^.`.`.^.`.^.(.`.(.^.(.(.(.^.|.[._.|._.^.|.(.`.`./.{.^.`.(.(.^.(.(.(.(.(././.(./././.~.~.T.T.T.T.T.U.U.U.U.L.L.L.S.D.H.L.G.S.S.S.L.S.L.L.S.L.L.L.S.L.L.H.H.G.H.H.A.G.A.A.A.j.g.A.l.l.h.k.z.h.k.f.h.f.g.g.g.k.k.g.g.h.k.a.z.f.k.f.f.a.f.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.f.a.f.f.f.f.f.f.f.k.k.i.k.f.a.a.a.a.a.a.a.f.a.a.a.a.i.a.s.a.a.a.i.i.a.a.a.a.a.i.a.a.a.i.s.i.u.u.u.u.u.u.t.u.u.t.t.r.r.r.r.y.y.y.y.w.r.y.y.E r.y.y.r.y.r.r.y.r.r.t.t.t.t.t.t.t.t.r.t.r.t.t.t.t.t.t.y.y.r.r.r.y.r.r.E t.t.t.u.u.u.u.u.i.i.i.i.i.a.a.a.a.s.k.a.a.a.a.d.f.f.k.",
+"H H J D L D L L H H H H H H H H H I Z J L L H J J Z L L L L Z L J H H H H H J H P H H P H J J P P J P J I P P P ( P I I P P P P P I P P P I I P P P J P P L H I J H H H H H H H D D D D H F Z Z Z Z Z D D B Z C C D C B D C Z Z C C C Z C C C C C C C C N C C N A C C C C C C C B C C B C B C B B C C C C C C Z C C C Z Z C B Z Z Z Z B Z Z Z Z Z Z D Z B Z C Z Z Z Z D D D D Z D D D D Z Z Z Z H H H H H Z L H F L P Z L L D U Z.L.H.H.H.K.S.K.H.H.L.H.L.L.S.L.L.L.L.P.L.L.U.L.L.U.U.T.T.T.T.T.~.~.T.~.~.T.T.T.T.T.~.T.Y.T.T.T.T.T.T.T.[.T.T.T.!.~.!.~.~.~.~.~.~.!.~.~.~.~.~.~.XXE.XX~.~.~.T.U.~.~.~.~.!.^.^././.R./.~./.~./././././././.^.(./.(.(.`.^.(.(.`.^.(.(.(.(././.^.^.^.(.(./.!.)././././.^.[.(.(.(.^.|.(.(.(.^.`.`.(.|.|.^.|.(._.^.`.`.(.(.(.(.^.(.`.`.(.`.`.`.(.^.|._.`.|._.}.}.}.}._._.`.|.|.|.|.'..X.X'..X XdX'.zX.XzX.X.XdX.X.XdX.X.X X XdX.X.X.X|. X.X.X|.|.|.|.`.`.`.|.|.|.|.|. X|.|. X|. X.X|..X.X.XzX'.zXdX.XdX%X%X.XzX'.zX.XdXdXdXzXzXzXzXxXxXxXxXcXnXxXcXnXmXmXcXmXmXnXnXJXnXnXmXmXmXmXnXMXnXmXmXnXmXmXmXmXnXmXfXmXmXmXmXmXmXNXmXMXMXmXMXMXmXMXMXMXMXMXMXmXMXmXMXmXMXMXMXMXmXmXmXmXmXcXcXcXcXcXnXcXcXdXdXcXdXvXdXzXdXcXdXdXzXzX.X.X.XdX.X.X.X.X.X|..X{.|.|.(.(.(./.(.^.~.~.T.~.T.~.P.T.T.T.U.P.P.L.L.L.L.L.L.H.H.H.H.G.G.D.S.S.S.S.G.A.A.H.G.h.h.A.A.A.A.A.A.h.h.S.g.A.A.l.Z.z.A.h.G.j.A.g.A.g.A.Z.h.A.g.Z.A.h.h.h.h.h.h.h.l.k.z.g.f.i.a.a.f.i.i.f.i.a.g.i.a.a.a.a.a.a.a.i.s.a.u.a.i.i.i.i.u.s.i.u.u.u.u.t.s.u.t.t.t.u.t.t.u.t.t.u.t.u.t.u.t.t.t.t.r.t.r.r.r.t.t.t.t.t.t.t.t.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.i.i.i.a.a.a.a.k.f.k.g.k.h.h.h.l.A.z.A.A.A.H.A.H.H.S.H.H.S.S.L.L.U.U.L.L.T.Y.U.U.T.T.T.Y.~.T.T.T.~.T.~.T.T.T.T.T.T.T.~.T.T.T.T.~.T.~.T.T.~.T.~.~.[.~.~.~.~.~.~.(.(./.(./.(.[.(.{.(.^._.^._._.(.`._._.{._.|.|.|.|._.|.|.|.|.|._.|._.|.|.|.|. X|. X'. X.X.X.X.X.X.X@X'.dX.X.X.X.X.X X.X.X.X X.X X X.X X.X X.X.X.X.X.X.X.X.X.X.X@X.XdX'.dX'.dX@XzX.X.X X X.X.X'.|..X X}.}.|._._._.(._.}.}.}.}.}.}.}._.}.}._.|.(.(.`.{.^.`.(.^.(.(.(.(.^.^.(.(.(.(._._.(.`.`.|.^.|._.^.(.`.^.(.(.(././.(.~.~././.~.~.!.Y.T.T.T.Y.I.U.U.U.L.L.L.L.H.L.H.H.F.S.L.L.S.L.L.U.S.L.L.L.S.L.H.H.H.S.A.G.A.A.A.A.A.G.g.l.h.h.z.l.l.h.h.f.g.g.f.g.a.h.g.h.k.k.g.g.k.g.f.g.i.j.a.a.a.a.i.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.f.a.k.k.f.f.f.k.f.z.a.f.f.a.a.a.f.a.k.a.a.a.a.s.i.a.a.s.a.a.i.a.a.a.a.a.a.a.i.i.i.i.u.u.u.u.u.u.u.u.s.u.u.t.t.t.r.r.p.y.r.y.y.r.E r.y.y.y.r.y.w.t.r.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.y.y.r.r.r.y.r.r.r.r.t.t.t.t.u.u.u.u.u.i.i.i.s.a.f.a.k.a.k.a.a.a.a.a.i.k.d.i.",
+"H H H H J J L J Z J H H I H H D H H H H H J P H H H H L L H H L H H H J F L L J I J K I H P L P P P L P P P I P P P ) P P ) P P ) P P ) P ) L ( U P P L H L L H H H H H H D L D Z D D Z Z G B D D D Z C Z B D Z C C C C Z C C C C C Z C C C C A C C C C C C A C B C B C C B C C B C N C N C C N C N C C C C Z C C C C Z Z Z Z A Z Z Z D Z Z Z Z Z Z B D Z Z C Z Z B C Z F Z G Z H H Z L Z H Z H H H H H J J L L D H D D H Z G Z Z.H.L.H.H.G.L.S.S.U.U.S.S.L.L.S.L.L.U.P.P.L.L.P.U.U.L.Y.U.Y.T.T.T.T.T.T.T.~.T.T.T.~.T.[.T.T.T.T.P.T.T.T.T.T.T.~.~.~.~.~.T.^././.~././.~.~.~.~./.~.~.~.XXU.[.XXE.~.~.~./.!./././.(.~.~.(./.~.~./././.!.(.(././.(.).!.(.(.).(.(.(.(.(.(.(./.(.(.(./.(.(.(./.(.(./.(.(.(.(.~.(.(.(._._.^.`.(.^.(.(.|.^.|._.|.^.`._.^.(.(.`.`.^.^.{.(.`.^.`.`.^.|.|.|.}.}.}. X}.}.}.|._.|.|. X.X|..X|..X'..XdXdX.X.X.XdXdXdXdXdX.X.X.X.X.X.X.X.X.X.X|.|..X|.|.|.|.|.|.|.|.'. X X.X|.|. X X.X.X|..X.X.X|..X.X.X.XdXdXdXdXdXdXzX.XzXzX.X'..XzXzXzXzXcXdXnXcXdXnXcXnXnXmXmXmXmXmXmXmXJXzXmXmXmXmXvXMXvXMXmXmXmXmXmXmXmXnXmXmXmXmXnXmXmXmXmXmXmXmXMXmXNXMXmXmXfXmXmXMXMXmXmXmXmXMXmXmXmXmXmXmXmXnXnXnXxXxXxXxXcXdXcXzXzXdXdXdXfXcXdXcX XzXzX.X.X#X.X.X.X.X X|.|.|._.}.|.^.^.(./././.~.!.~.T.T.T.T.P.P.P.P.P.P.P.L.L.S.L.S.H.H.A.H.G.A.H.A.S.S.S.S.A.H.z.A.A.A.A.g.A.A.g.h.Z.h.A.g.A.g.A.l.l.l.l.l.l.l.z.l.l.l.l.h.h.h.h.h.h.h.h.h.h.l.z.z.z.k.d.k.a.a.a.a.a.a.a.a.a.a.a.a.a.k.i.a.i.a.u.i.i.i.i.i.i.i.i.i.i.u.u.u.i.p.u.p.u.t.u.t.t.s.t.t.t.t.u.t.p.r.t.t.t.t.t.t.y.r.r.r.r.r.t.t.u.t.u.u.u.u.u.u.u.t.u.u.u.u.u.u.i.u.i.u.i.i.i.i.a.a.i.f.f.g.f.k.h.h.h.A.A.j.A.A.H.H.H.H.H.S.D.H.L.L.U.L.L.U.U.T.U.P.T.T.T.T.[.T.T.~.T.~.R.R.~.T.T.T.T.~.T.~.Y.T.~.T.~.~.~.~.T.Y././.~./.~.~.T./././././.^.(.[.(./.(.(.(.(.`.(.^.`.`.`.[._._.|._.|.`.|.`.`.|.|.|.|.|.{._.|.}.}.}. X|.|..X.X|..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X|..X|..X|..X.X.X.X.X.X.X.X.X.X.X.XdX.XzX.X.XdXdX.XdX.XdXdX X'.dX}. X|.`.`.`._._._.|.`.`.^.`.(.|.`.`._._._.`.^.(.(.`.(.(.|.(.(.(.{.^.(.^.(.^.(.(.|.(.|.(._.|._.(._.(.`.^.`.(.(.(.(.(.(.[././././.~.~.~.~.~.T.T.T.Y.Y.U.L.P.P.L.L.L.L.L.L.L.S.H.H.H.L.G.L.L.D.L.H.D.L.S.L.L.G.D.D.G.A.A.A.A.h.l.l.l.l.l.l.D.d.g.z.k.k.k.k.k.k.f.k.k.h.h.z.g.z.k.z.f.f.i.f.a.a.a.a.i.d.a.a.a.a.a.d.i.a.a.i.i.a.a.a.k.i.i.i.s.f.a.f.g.a.s.a.k.a.k.a.i.i.a.a.a.a.a.a.a.i.a.i.a.u.a.a.a.u.a.i.a.a.i.i.i.u.u.u.i.u.u.u.u.u.u.u.u.u.u.r.t.t.i.r.r.E E r.y.r.r.r.r.r.r.r.r.r.r.r.r.t.t.p.t.t.u.t.t.t.p.t.t.t.t.t.t.t.r.r.r.r.r.r.t.t.r.t.r.t.p.t.p.u.u.p.i.i.i.a.a.a.a.g.f.a.a.a.a.a.a.f.a.a.a.a.",
+"H L H L Z H L Z D L H H D H H H Z H H H H H H H L U L L L H P H H L J H J H L L J J P P I J P P P J P P P P P P P P P P P P I P P I P P P L P P P P P L L L L L H H H H D L D D H D Z D D D Z Z Z B Z Z C C C C Z C C C C C V C C C C C C C C C C C C C C C C C C B C B B C C B C B Z N C N C m C C C N Z C C Z A Z Z C Z C Z C C Z Z B Z Z Z Z Z F Z Z Z Z F Z Z D Z Z Z Z G Z S Z H Z Z H H Z H H Z L Z Z Z Z H H D D D H Z H b.S.H.H.H.S.L.H.H.S.L.D.U.L.L.L.L.G.L.L.P.L.L.P.L.Y.Y.Y.U.T.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.~.~.T.^.~./././.~.~.~.~./.~.!.~.~.~.XXE.XXU.XX/.!.~.~.~.~.~.~.~.~.[./././././././././././.(./.).(./.!.(.!./.(.(.[.(.(.(.(.(.(.(.[.(./.(.^.(.(.(.{.(.~.^.|.(.(._._.|.^.`.`.`.|.[.|._.`._.|.|.(.^.(.(.^.^.^.|.(.`.`.{.`.|._.`.{._.|.}.}.}.}.}.|._._.|.|.|..X.X X.X.XdX X.X.XdX'..X.X.XdXdXdXdXdX.XzX.X.X.X.X.X.X.X|..X|. X|.'.|.'.|.|. X|..X.X.X|..X.X|. X.X|..X.X.X.X.X.X.X'.dXdXdX.XdX.X'.zX.XzXxXzX.XzXzXzXdXvXcXvXcXcXcXnXnXmXmXMXcXMXvXvXMXmXmXvXmXmXmXnXmXMXvXmXmXmXmXmXmXmXmXmXmXmXmXfXMXmXmXmXmXmXmXmXmXMXnXNXSXMXmXMXMXmXMXmXmXmXMXmXmXmXmXmXcXmXnXnXnXnXcXdXcXzXzXzXzXdXcXdXdX.XdX@XzXzX.XzX'..XxX.X.X X X|.|._._.^.(.(.(././.~.~.~.~.~.T.T.T.T.T.T.P.P.P.U.U.S.L.L.S.H.H.S.S.S.A.A.A.S.H.S.A.S.A.S.S.A.A.A.A.A.G.g.G.S.g.A.h.G.j.G.l.l.l.l.l.l.l.l.h.l.l.h.h.h.h.h.h.h.h.h.h.h.h.h.k.k.k.k.k.a.a.a.a.a.i.i.a.a.a.a.a.a.a.u.i.i.a.u.a.i.i.i.i.i.u.i.i.s.a.u.u.u.u.t.u.t.t.t.t.t.t.t.t.u.t.t.t.t.t.t.i.t.t.t.t.t.r.r.r.r.r.r.r.t.t.u.t.t.u.u.u.u.u.u.u.t.p.u.u.u.u.i.u.i.i.a.a.a.i.k.f.f.f.g.z.l.h.h.h.h.j.S.A.A.A.A.A.D.D.D.L.S.S.L.L.L.U.U.U.U.U.P.P.T.T.T.T.T.~.T.~.R.~.~.T.T.~.~.T.T.~.T.~.~.T.T.~.T.~.~.~.~.!.~.~.~././././././././.(./.(./.(.(.^.(.(.(.(.^.`.(.^._._._._.|._.`.`.|.`.|.|._.{.|._._._.}.}.}.}.|.|.|.'.'.|.|..X|..X.X.X.X.X.X.X|..X|..X.X|..X X.X|. X.X.X.X.X.X.X X.X.XdX.X XdXdX.XdXdX.XdX.XdXdX.X@X.X'. X.X X.X|.`.`.}.}.^.|.|.^.`.(.(.`.(.|.|._.|.^.|./.(.^.^.`./.(.^.(.(.(.^.^.(.(.(.(.^.(.{.(._.|._.|.|.|.`._.(.{.(.(.(.^.(.(.(./.(./.(.~.~.Y.T.~.T.T.T.Y.P.U.L.P.L.L.L.L.S.L.L.U.H.H.H.H.L.G.L.L.L.L.D.L.L.D.A.L.H.H.H.A.A.h.A.A.l.h.l.l.h.h.k.g.g.g.g.k.k.d.g.f.f.k.k.h.k.h.k.k.k.f.f.d.d.d.a.a.a.a.d.a.i.d.a.i.a.i.i.i.i.a.a.a.a.a.i.i.z.k.z.f.f.f.a.s.j.g.i.a.a.a.f.k.a.a.a.a.i.i.i.i.a.a.a.a.a.u.a.a.a.a.a.a.a.i.i.u.u.a.i.u.i.u.u.u.u.i.i.u.u.u.t.u.E u.r.r.r.r.r.r.y.r.r.r.r.r.r.r.u.E r.t.t.t.t.p.u.t.t.t.u.t.u.t.u.t.t.r.t.r.r.y.y.r.t.t.t.t.t.t.t.u.s.u.s.s.i.i.a.a.g.i.z.i.a.a.z.a.a.k.a.g.z.a.a.a.",
+"H L L L Z P Z L J J S H H H H D H F H H J H J J L P H L H L L L H K J H H U J J J J J L J J L J L P P P P I P I I ) P ) ) P ) P P P ) P P ) P L H P P L L H L L U H H H L L D D Z G D Z Z H Z D Z Z Z Z Z Z C B C B C C C C C C C F C C Z C C B C C C C C C Z N B C B C C B B C N C m C N N N Z B C C C C C Z C C Z C Z Z C Z C Z Z C Z Z B D Z Z Z Z Z Z Z B Z Z Z Z Z Z D Z Z L Z Z Z H H H H Z H Z J L L L L H Z D D D D D H T Z.S.H.H.S.G.L.H.H.H.L.L.L.S.Y.L.L.L.L.L.L.U.L.L.L.U.L.T.Y.U.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.Y.U.Y.P.T.T.T.T.T.T.~.T.^.T.~.~.~.~./.~./.~.~.~.~.~.~.~.~.E.{.~.~.~.XX~.~.~.~.~.~.~./.~.(.~./././.~.~./././././././.^.(.(.`.(.(./.!.(./.(.(./.(.(.~.(.^.(.(.(.(.(.(.(.(.(.(.(.(.(.}._._._._._.|._._._.{._.|.|.{.`._.{.|.^._.|._._.}.}.`._.`.|._.|._.|.|._.|._. X|.}.}.|.|.|.`.|.'. X|.|.|..X@XdX@X.X.X.XdXdX@X.X.X.X.XvX.X.X.X.X.X.X.X.X|..X|..X|.|. X|.|.|. X.X|.|. X X|.|..X.X|..X|..X.X.X.X.X.XdX.X.XzXdXdXzXzXdX'.'..XdXdXzXzXzXcXcXxXxXcXcXnXnXnXmXmXmXmXmXmXmXvXmXMXMXmXmXmXJXmXmXJXnXcXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXMXMXmXfXMXMXMXMXMXmXMXmXMXMXMXmXmXvXnXmXnXnXnXxXxXxXxXdXzXzXzXzXdXdXdXmX.XcXdXdXzX.XzX.X.X.X.X.X|.|.|.|.|._._._.(.(.~.^.~.~.Y.~.~.T.T.T.P.P.P.P.L.L.L.S.L.L.S.H.H.H.A.H.H.A.A.A.h.A.A.G.l.H.A.h.j.A.h.A.g.S.l.h.g.h.h.h.a.h.l.h.z.h.l.h.h.l.h.h.l.h.g.g.h.l.z.h.f.h.h.z.k.h.k.k.k.k.k.a.a.a.a.u.a.a.a.i.a.a.a.a.a.i.a.i.i.i.t.a.u.u.i.i.u.i.i.i.u.u.u.u.u.u.r.u.u.u.p.t.t.t.t.t.t.t.t.r.t.t.t.t.r.t.t.r.r.r.r.r.r.t.t.r.t.t.t.u.u.u.u.u.t.u.r.u.u.u.u.u.u.u.i.i.u.s.i.a.i.a.f.f.f.f.k.k.k.h.h.A.A.h.A.A.A.A.H.H.S.H.S.L.L.L.L.L.L.L.U.P.U.T.T.T.T.T.T.~.T.~.~.~.~.R.~.~.~.~.T.~.~.~.~.~.T.~.~.T.~.T.~.~.~.~./.(./././././././.(./.(./.(.(.(.(.`.(.(.`.^._.^.{._._._._.|.|.|.`.|._.`.|._.}.{._.}._._._. X}.}. X|..X|.|. X|..X.X.X.X.X.X.X'. X.X.X.X.X|..X.X.X X.X|..X.X.X.X.X.X.X.X.X'.dX.XdX.XdX.X@XdX.XdX.X.X.X.X.X'. X.X X X|.`.|.}.}.|._.|.^.`.(.`./.|.|.(.|.`._.`.^.(.`.^.(.(.(.(.(.(.E.^.~./.(./.(.(.(.(./.|./.(.|.{._._.|.(.(.(.(.(.|.(.(.(./././.~.~.~.~.[.T.T.Y.U.P.U.Y.L.L.L.L.L.L.L.S.S.U.S.H.L.H.G.H.L.G.L.H.H.G.L.P.H.D.H.A.G.A.A.A.h.H.z.h.l.l.h.l.k.g.g.l.g.d.k.g.k.f.f.k.k.k.k.k.k.k.g.k.f.k.f.i.d.a.a.a.i.i.d.a.a.a.i.i.i.i.a.i.i.a.a.a.i.z.i.k.s.a.g.f.g.a.a.a.a.a.a.d.d.a.a.a.s.a.s.s.s.i.i.i.a.u.u.a.a.i.i.u.i.i.i.i.i.i.i.i.u.u.i.u.i.u.u.i.a.u.u.u.u.t.t.E r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.t.t.t.p.t.u.u.t.u.u.t.t.t.u.t.t.r.t.r.r.r.t.r.r.r.t.t.t.t.p.t.u.i.s.s.a.a.i.i.g.a.i.z.f.a.f.f.a.f.a.a.a.a.z.a.",
+"H H H H L L J L H Z H H D H H H H H H H H H H H H H L L L L L L H H J J K L H J J L J J J P J J L J P P L Y P P P P P K P I P P ) ) P I L ) P I I P P L L L S L H H D L Z D D D S Z D D H D Z D Z Z D B C Z D Z C Z C D G C C C C C A C B C C A C B V u N A A A C B C B B C B V C C C C A C N C B B N C C C C C Z C Z A Z Z Z Z C Z Z Z Z D G D Z Z C G Z Z D Z C Z Z Z Z Z H Z Z Z D H H Z Z H C H Z L L Z Z Z Z H Z D D D D H T b.H.K.H.Z.G.H.H.L.F.L.U.S.L.L.L.G.L.D.U.L.U.L.U.U.L.Y.U.U.U.P.P.T.T.T.Y.U.T.T.T.T.T.U.P.Y.P.U.T.P.P.T.T.T.T.T.T.T.~.T.T.~.~././.~.~.~.~.~.~.!.T.T.XXXX~.~.~.~.!.~.!.~.~./.^.~./.~./.~././.(././././././.(./.(.(.(.!.(.(.(.(.(././.(.(.(.(.(.(.`.(.(.(.(.(.(.(.{.(.{.(.{.[.}.|.|.|._.|.|.|.|._.|.|._._.|.|._.|.`.`.(.|.|.[.}.}.^.`.^.|.|.|._.|._.|.'._.|.|.}. X|.|..X X.X|..X.X.X.X.X.X.X'..X.X.X.X X.X.X.XdX.X.X.XzX.X.X.X.X.X.X.X.X.X|.'. X|.'..X'.|.|.'.|..X.X.X.X|.|..X X.X X.X|..X.X XdX.X@X.XdX.X.XdXdXdX#XxXdXxXzXzXzXzXdXxXxXcXcXnXnXnXvXmXmXmXmXmXmXmXmXvXmXmXMXmXzXmXvXnXnXmXmXmXmXmXmXMXmXmXMXmXmXmXmXmXmXmXmXmXmXmXfXMXNXfXMXmXMXMXmXMXmXMXMXmXmXmXmXMXcXJXnXnXnXnXnXxXcXcXnXdXdXxXdX%XdXdXdXdXdX XzXzX.XzXdX.X.X.X|.|.|.{._._.(.(.(.(.(.~.!.~.~.R.T.P.U.T.P.P.P.T.L.L.U.L.S.U.S.S.H.A.S.A.A.S.A.A.G.S.h.H.h.A.z.S.h.A.A.A.z.k.h.h.g.z.h.g.h.h.h.h.l.h.l.l.k.z.h.k.l.f.z.g.k.k.f.h.k.f.k.h.k.k.k.k.k.d.k.a.a.a.a.a.a.i.a.i.i.i.i.a.i.a.a.i.i.u.a.a.u.i.u.i.i.i.u.i.u.i.u.u.u.u.u.u.t.t.u.t.t.r.t.r.t.t.t.r.t.t.t.t.t.t.r.r.r.r.r.t.t.r.t.r.t.u.t.u.u.t.t.t.t.u.t.u.u.u.u.u.u.i.u.s.i.i.i.a.a.a.i.i.f.f.k.k.h.k.h.h.h.A.h.A.A.A.z.H.A.G.S.H.S.L.L.L.Y.P.U.Y.T.T.T.T.T.T.T.~.~.T.~.T.~.~.~.~.~.~.~.~.~.^.~.T.~.~.T.~.~.~.~.T.~.~./.!./././././.(./././.(.(./.(.(.~.^.(.(.(.`._._._._._.}._.|.`.|.`.`.|.`.|.|.}.}.}.}._._._._.|.|.|..X|.|.|.|.|.|.|.|.|.|..X|.'.'.@X.X.X.X.X.X.X.X|..X.X.X|..X@X X.X.X.X.X.X'.dX.X.X@X.XdX X.X.X.XdX.X.X.X.X.X.X|.|.|.'.|.|.}._.^.`._.^.|.|.|.|.{._._.`.(.(.`.(.(.(.(.(.(.(.(.(././.(.(././.(.(.`.(.(.`.(.(._.{.(.{.^.`.(.(.^.(.(.(.[.(././.R.(.~.~.~.~.T.T.T.Y.P.L.L.P.L.L.L.L.L.L.L.U.S.K.H.G.H.H.H.H.H.H.S.G.L.G.G.H.G.G.D.A.A.A.A.A.h.h.h.l.h.l.h.D.z.g.d.g.g.k.g.f.k.d.k.k.g.k.k.k.k.d.k.f.k.i.d.a.a.a.a.k.i.i.u.i.i.i.a.i.i.i.i.i.a.i.a.a.i.i.z.f.k.a.f.g.a.g.s.f.i.a.d.a.a.a.a.a.a.s.a.i.u.i.u.a.u.a.u.i.u.i.u.i.i.i.u.u.i.u.u.i.u.u.a.i.i.i.i.u.u.u.u.u.u.t.r.r.t.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.t.p.t.r.p.u.t.i.u.t.u.u.t.t.t.u.t.t.t.r.r.t.r.t.t.t.t.u.p.u.s.u.i.i.i.a.a.a.z.a.a.g.a.f.f.f.f.k.a.a.a.a.z.a.a.",
+"L L L L H H H J H H H H H H H H H D H H Z H H H L H H P H L H L P P J J L K P J P P P P J P J J P P P J P J P U P J P I I I P ) P ) I I P P L I P P J J L L L Z H H Z D H H D D Z Z Z Z Z L H Z Z Z C D Z C C Z C B C C B C C C C C C C A C B A C C C A V C C C C C B C C B B C C C C N C N Z B B B C C C C C C A F C Z Z Z Z B B Z Z D Z Z Z Z G Z Z Z B D C Z C Z Z Z D Z Z Z H Z S Z Z H L Z L H H H H D H P H H Z Z Z Z H D Z b.A.P.L.H.H.H.K.H.H.L.L.L.L.L.L.L.L.S.L.L.P.L.L.L.L.U.L.Y.L.Y.P.P.T.L.T.T.T.U.T.T.P.T.P.Y.P.P.P.P.T.Y.T.T.T.T.T.T.T.~.~.T.~.~./.[./.~.~.~.~.~.~.~.~.~.T.[.(.T.~.~.~.!.~.~.~.[./.~./.~.~.~.^.~.(.E.[.^.(.^.(.(.(.(.(.(.(.(.(.(.(.(.(./.(.(.(.(.`.^.^.^.(.(.^.^._.(.`.^.`._.{._._.|.|. X|.|.|.|.|.|.|.|.|._.|.|._.|.|.{._.{.}.}._._._._._.|.|.|.|._.|.`.|.`.|.|..X'.|..X|..X.X.X.X.X.X.X.X.X.X.XdX.X.X.XdX.X.X.X.X.X.XzX'..X.X.X.X|. X|..X X|.|.'.|.|. X X|..X|.|..X.X.X|..X X X.X|.|..X.X.X@X.X'.dXzX.XzXzXdXdXdX.XdXdXzXzXzXzXzXcXcXcXnXnXnXmXMXmXmXmXmXmXmXmXvXMXmXmXmXNXMXnXmXzXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXdXMXmXmXmXMXmXMXMXfXmXmXMXMXMXmXMXmXMXmXNXmXmXJXzXnXnXnXxXvXxXxXxXdXcXdXdXvXdXdXdXdXdXdXdX.X.XdX.X@X.X X'.|.|._._.|.(.{.^.(.(./.~.~.T./.T.T.T.T.T.P.U.L.U.L.L.L.S.L.S.H.S.J.A.A.G.A.A.A.h.A.h.A.A.A.A.l.l.A.A.h.h.l.l.l.l.h.h.g.h.g.h.g.g.z.z.z.h.h.k.h.h.f.k.g.g.f.z.j.f.k.k.k.f.z.k.k.k.d.k.a.a.a.a.a.a.a.a.i.i.i.i.i.i.a.a.i.i.u.a.u.u.i.i.u.i.i.u.u.i.p.i.t.u.u.t.i.t.u.t.u.t.t.t.t.r.t.r.r.r.r.r.t.t.t.t.r.r.y.y.y.t.r.t.t.t.t.t.t.t.u.t.u.t.u.u.u.t.t.u.u.u.u.i.i.u.i.s.i.a.a.a.z.f.d.i.g.k.g.g.g.h.h.A.A.h.A.A.A.H.D.H.G.L.H.L.L.L.P.P.U.Y.U.T.T.T.T.T.T.~.T.~.T.~.!.~.~.~.~.~.E./.~.~./.~.T.~.~.T.T.~.~.~.~.~./././.(././.(.(./.(.^.(.(.(.(.!.(.(.(.`._._._._._._.}.}.|.|.|.|.`.`.`.`.}.}.}.}.^.|._._._._. X_.`. X|.|.|.}.|.|.|.|.'.|.'.'.'..X.X'. X X.X.X X X X X.X.X|..X.X.X.X.X.X.X.XdX.XdX.X.X@X.X.XzX'..X.X.X'. X.X'..X X.X|.|.|.}.}.}.}._._.`.^.|.|.{.{.`.(.(.(.(.(.(.(./.(.~.(././././.~./././././.(.(.(.(.^.`.(.(.`.(.(.(.`.(.(.(.|.^.(.(.(.!./././.~.~.~.T.T.T.T.Y.P.P.U.L.L.L.L.L.L.L.L.S.U.H.H.H.H.H.G.L.S.S.L.H.H.H.G.G.H.S.S.A.A.A.A.z.D.l.h.h.h.z.k.l.z.g.g.g.k.k.k.k.g.f.k.f.g.k.k.k.z.a.g.i.i.f.i.i.i.k.i.a.i.i.i.i.i.a.i.i.a.i.a.a.a.i.a.a.a.a.i.s.f.k.a.a.i.s.g.a.i.a.a.a.a.a.a.a.a.i.a.i.s.u.u.a.a.a.u.i.u.u.u.u.i.i.i.u.u.u.u.u.i.u.i.u.u.i.i.i.u.i.i.u.u.r.i.t.t.t.r.r.t.t.r.r.t.r.t.r.r.u.r.t.t.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.t.t.t.t.t.t.t.r.t.t.u.u.u.u.i.i.i.a.a.a.i.a.g.f.f.z.a.z.a.g.a.f.f.z.k.f.f.a.",
+"P H L L L L D H K H H H H F H H H H H H J H J H L L L L L P U H H H L L H P L L H H H H H L P H J J H P P P P P ) P P I I I I P P P I I P I I I J J J J H L L P H H H H D H D D Z H F H Z Z Z Z Z Z D C Z Z Z C Z D C F C C B F C C Z C B C C B C B C C C C N Z B N C B B C B B m A C N N C N B B A C N A C Z A C B Z Z C Z Z Z G C Z Z Z Z Z G D Z Z Z Z Z Z D G C Z Z Z G H Z Z Z H H H Z L H H Z H Z L Z Z Z H D Z H F D D D Z e.G.H.H.G.H.K.H.H.L.H.L.S.S.L.L.S.L.L.L.L.P.L.L.Y.U.L.U.U.U.U.P.P.T.Y.U.U.T.Y.P.P.P.P.P.P.P.P.P.P.P.P.T.T.T.T.Y.T.T.~.T.^./.~.~.~.T./.~.~.~.~.T.~.~.T.~.~.T.~.~.~.~.~.~./.~.^.~./.T.[.^.[././././.^.~.!.(.(.(.(.(.(.(.(.(.(.!.(.(.(.(.^.(._.(.^.|.^.`.`.^.`.^.(._.^.[.^.`.|.|.|.|.|.|.|.|.|.|._.|.|.|.|.|.|.|._._._.|.|._.}.}._._._._.|._.|.|.'.`.`.|.|..X|..X|..X.X.X.X.X.X.X.X|..X.X.X'..X.X.X.X.XzX.X.XdX.X.X.X.X.XvX.X.X.X.X.X.X.X.X|. X X.X.X.X|..X.X X.X.X.X X|. X|. X X|..X.X X|..X.X.X'.dX.X@X'..XdX'.dXdXcXdXzXzXzXzXdXcXcXcXvXnXnXnXvXmXmXmXMXvXMXcXmXnXmXmXcXnXvXmXmXJXmXvXmXmXxXmXmXmXcXmXmXmXmXmXmXmXmXmXmXmXmXmXMXMXmXMXNXmXmXMXmXmXmXmXMXmXmXmXmXmXmXmXnXnXnXcXxXxXJXdXcXcXxXdXdXdXdX#X.X.XvX.XdXdX.X.X X.X X|.|.|.|._.|.{.{.).(.(././.~.~.T.T.T.T.T.U.P.U.P.U.L.L.L.S.P.S.S.S.h.G.A.A.A.G.A.A.A.A.h.h.h.h.l.h.g.h.h.h.h.h.k.k.f.g.h.a.z.g.h.z.l.h.h.f.f.h.f.f.z.f.f.f.f.f.a.g.z.k.k.f.k.k.a.a.k.i.a.a.a.a.a.a.i.a.u.i.i.i.i.i.i.i.i.i.u.u.u.a.u.u.i.u.u.u.u.u.u.u.u.u.u.u.t.u.u.t.t.t.t.t.r.r.r.r.t.t.r.t.r.r.r.r.r.r.r.t.t.t.t.r.y.t.t.t.t.t.t.u.t.t.t.t.t.s.u.u.u.u.u.u.u.i.u.a.i.a.a.i.i.k.f.k.k.f.g.g.f.h.h.h.h.A.A.A.A.A.H.S.H.G.L.L.U.U.U.P.T.U.Y.U.T.T.T.T.T.T.~.T.T.[.~./.!.~.~.^.^././.(.!.~.~.~.T./.T.~.~.~.~./././././.(.(.(.(.(.(.^.(.(.(.{.(.(.(.^.`._._._._._.`.}. X|.|.|.|.|.|._.`.|.}.}.}.{._._.|._._.|.|.`._.|.|.|.|.|._.|.|.`..X X`.|..X.X`. X@X X.X X@X.X X.X.X.X.X.XdX.XdX.X.X XdX.X.XzX.XdX.X.X.X.X.X.X.X@X.X.X X|..X|.|.|.|.}.}.}._.`.|.(.`.{.(.^.(.`.(.(.`.(.^.(.(.(./.{.~./././.!.~.(././.!.(.(.(.(./.(.(.^._.^.`.(.`.(.(.(.(.(.(.(.(.(.(.E.(./.~.T.T.~.T.T.P.U.Y.P.Y.L.L.L.L.L.L.L.S.L.H.S.H.H.S.H.H.S.S.S.H.H.H.H.D.H.H.H.G.H.A.A.A.A.l.A.l.h.h.h.h.g.l.g.g.g.k.k.h.k.f.k.k.f.k.k.f.a.g.i.k.i.k.k.a.k.i.u.i.a.i.i.i.i.i.i.i.a.a.i.i.i.a.a.a.a.i.k.i.f.f.s.f.g.z.g.a.k.i.a.a.a.i.a.d.i.a.i.i.u.i.i.i.E x.u.a.u.i.i.i.u.u.u.u.u.i.u.u.i.i.i.u.i.i.u.i.u.i.u.u.u.u.u.u.t.t.t.t.t.t.t.t.p.r.t.r.r.r.r.r.t.p.t.u.t.t.u.u.i.u.u.u.u.u.u.u.p.u.u.t.t.t.t.t.t.t.u.u.u.u.u.u.i.i.a.a.i.i.f.f.i.z.a.k.g.a.g.g.k.k.a.a.a.k.a.f.",
+"H H L L L L H P L L H H H H H F H D H H H H H J H P H L L P L P P L L P Y H J L U P U P J H L Y J J H J P P P P S I P P S P I ) ) ) P I P P P L J J L H H H H L H H L Z H Z D D Z Z H D Z H Z D Z Z Z Z Z Z C D C G C C D C C B C C C B C C C A V C C N N B B B C B B Z N C B C N C C A Z N B B B B Z C C C C C Z Z C Z C Z Z Z Z Z Z Z G Z Z D D G Z Z Z Z Z B Z Z D Z D D Z G H Z H Z H Z H H H Z Z H D H Z H D H Z H Z D D D Z [ D.L.L.H.H.H.L.H.L.H.L.L.S.L.L.L.L.L.L.L.L.L.U.L.L.L.L.L.L.U.Y.P.P.U.U.Y.L.U.P.P.P.P.P.P.P.P.P.P.U.U.U.T.T.T.T.~.T.T.~.T./.T.~.~.T./.T.~.~.~.~.T.T.~.~.~.~.~.~.~././.~.~.~.~./.~.~.^.(.E.~././.!./.!.(.^.(.(.(.(.(.(.(.(.^.(.(.(.(.(.(._.(.|.^.).^.`.^.(.[.|._._._.|._.|._._._.|..X|..X|. X X|..X.X|.|.'. X|.|._.|.|._._.|.}.|._.`.`._.|.|.|.|.|.'.|.'.|.|. X.X X.X|..X.X.X.X|.|..X.X.X X.X.X.X.X.X.X.XdX.X.X.X.X.X.X.X@X X X.X|..X.X|..X|..X|..X X.X|..X.X|.|..X|. X|.'.@X}.|.|..X.X'..X.X.X.X'..X'.zX'.zXdXdXdXdXdXzXdXdXcXcXzXvXnXxXnXnXnXMXMXmXMXmXNXxXmXmXMXmXMXmXmXmXmXmXmXmXmXmXmXJXnXmXcXcXfXmXfXmXmXmXmXmXmXmXmXmXmXMXMXmXmXmXmXmXcXfXNXMXmXMXMXMXmXmXmXmXmXnXnXnXnXxXxXdXcXzXdXdXxXdXdXdXdXdX.X X@XdX.XdX.X X X'.|.|.|._._.^.^.(.^.^./././.~.~.T.T.T.T.P.U.U.P.L.L.L.L.L.L.S.H.S.S.A.A.A.A.A.A.A.h.l.h.l.h.z.g.g.l.g.g.z.g.h.k.h.k.k.k.g.l.g.g.g.g.f.x.f.f.k.k.k.f.k.a.f.f.f.f.a.a.i.z.f.f.k.a.k.a.a.k.a.a.a.a.a.a.a.a.i.i.i.i.i.i.i.i.i.i.a.a.a.u.i.u.i.i.a.u.u.u.u.u.u.t.t.u.p.r.t.t.t.t.t.t.r.r.r.t.r.r.r.r.r.r.t.t.r.r.r.r.r.t.r.r.t.t.t.t.u.t.t.u.t.u.u.t.u.u.u.u.u.u.u.u.u.u.i.i.i.a.a.k.i.f.f.k.f.k.g.f.g.g.h.f.h.A.A.A.A.G.G.G.H.L.H.L.L.U.P.Y.U.T.P.Y.T.Y.T.T.T.T.~.T.~.[./.(./.^./././.(././.(.(./.~.~.!.~.T./.T././././.(./.(.^.(.(.(.(.{.(.(.^.(.(._.(.^.(.`._._.|.`. X}.|.|.|.|.|.|.|.|.|.}.}.`._.|.`._._._._._._.`.`.}.}.|.|.|.|.|. X'..X`.'..X.X.X.X X.X.X.X X.X.X.X|..X.X.X'.'.@X X.X.X.X@X.X'.dX.X.X X.X.X.X.X.XcX.X.X.X|..X|.'.|.|.`.}.}._.^.|.(.|.{.^.(.(.(.^.(.(.(.(.(.(././.(.~././.(././.~.~./././././././.(.(.(.(.(.(.(.(.(.`.(.(.(.(.(.(.(.^./.^.^./.~.~.~.~.T.T.Y.U.L.K.P.L.L.L.L.L.L.L.L.H.L.H.H.H.H.H.H.S.L.L.S.H.S.D.L.H.Z.G.G.A.A.A.h.h.A.h.h.h.z.z.h.g.g.z.h.g.k.k.k.k.k.g.k.k.f.i.f.a.g.k.a.a.a.i.a.f.i.a.i.i.i.i.i.i.i.i.i.i.i.a.i.a.a.a.a.a.a.a.a.f.s.k.f.a.a.i.i.k.a.a.a.i.d.i.i.i.i.i.u.i.i.u.u.a.u.i.u.i.u.i.i.u.u.u.u.u.u.i.i.u.a.i.i.i.i.a.i.i.u.u.a.u.u.u.E u.t.t.t.t.t.u.t.t.t.t.t.t.t.u.r.t.t.t.p.u.u.u.u.u.u.u.u.u.u.i.u.t.u.t.u.p.t.p.t.t.u.r.u.u.i.u.a.i.i.a.a.z.a.g.f.a.f.z.z.f.g.f.a.f.a.a.a.a.f.k.k.",
+"L P L H L H L H L H H H F H H H H D H I S H D J H H L L L H P L H H P H H J H L P H H P H P H J J J J J P P P P P I I I I ) I P P P I I P P ( P J J J H J P H H H H H L H H D D H Z Z H Z Z Z H Z Z Z Z C Z Z C C C D C C C C C C C C B u C C C C C C C C A B Z C C B C B B C N C N m N m A B B B B N C C C C C C C Z Z Z Z Z C Z Z Z Z D Z Z Z D D Z Z Z Z Z G Z Z C D D Z Z Z Z D D H D H S Z Z H Z H H Z H D H D D Z Z D D Z Z T Z.D.H.H.S.L.H.H.H.K.S.L.L.L.H.H.L.H.L.L.L.L.S.L.L.L.L.U.L.P.P.P.P.Y.U.U.L.U.P.P.P.T.P.P.P.P.P.P.U.U.T.U.T.T.T.T.T.~.T./.T./.~.~.(.T.~.~.~.T.T.T.~.~.T.~.~./.~.~.(./.(./.!.~./././.^.~./././././././.~.^.(.(.(.].'.(.(.(.(.(.(.(.(./.|.(.|.^.`.(.`.(.(.|._._._._.|._._._.|.|.|.|.|. X.X.X X'. X.X|. X.X X|.'.|.|.|._.|.|.}.|.`.|.|.|.|.|.|.|. X|..X|. X.X.X.X|..X.X.X.X.X'..X X@X.X X.X.X.X.X.X.XdX.X.X.X.XdXzX.X.X.X.X.X X.X.X.X.X X.X X X.X|. X|..X.X|..X X.X X'.|.|..X X X.X|.|.|.|.|.|.'..X.X'.xX.X.XzX@X.XxX@XzXzXcXdXcXdXxXxXxXnXxXnXnXJXzXmXvXmXmXmXmXmXvXJXzXmXmXvXmXmXmXmXmXmXcXnXnXmXmXcXcXNXfXmXmXmXmXvXmXcXMXmXmXfXMXmXMXmXfXSXfXNXmXmXMXMXMXmXmXmXmXmXvXnXxXnXnXnXcXcXdXzXzXzXdXdX.XdXdXdX XdXdX.X.X.X'..X'.|.|.|.{.|.^.{._.|.(.(.{././.T.~.T.T.T.T.P.U.U.U.U.L.S.L.S.L.L.D.S.S.A.G.G.A.A.A.h.A.l.h.l.h.g.z.g.k.g.g.g.z.g.g.k.k.k.z.f.z.k.k.g.a.f.f.f.f.f.f.f.f.f.f.f.f.a.f.f.a.i.a.i.i.a.a.a.a.a.a.a.a.a.a.a.a.a.i.a.i.i.i.i.i.s.i.i.i.u.u.u.x.u.i.i.u.u.u.u.u.u.u.u.u.u.t.t.u.t.t.t.t.r.r.r.t.r.r.t.r.t.t.r.r.r.r.r.r.t.y.y.r.r.t.r.t.t.t.t.u.t.t.t.u.t.t.u.t.u.t.u.u.u.u.i.u.u.a.i.i.a.a.d.f.i.k.k.k.g.f.g.g.h.h.h.h.z.A.A.A.H.G.H.H.L.L.L.U.Y.U.T.P.Y.Y.P.T.T.T.T.~.T.~.T.~./.!.(././././.^././.[.~././.~./.~./././././.(./.(.(.(.(.(.(.(.(.(.(.(.^.`.(.(._.^.`.`.(._._.(.|.'.|.|..X|.|.|.|.|.`._.|._.|.`.{._._._.|._.|.`.|.}.|.}.|.|.|.|.|.|..X'.@X|.|.|..X.X X|..X|. X.X.X.X|..X.X.X.X'..XdX.X.X'..X.X.X.X.X X X.X X.X.X.X.X.X.X.X.X X|.|.`.`.}._._.`._.`.`.^.`.(.(.(.(.`.(.`.(.(.(.(.(./.^.!./.~./.~./.~./.(././././././.(.(.(.(.(.(.(.(.^.(.(.(.(.(.(.(./.(././././.T.~.T.T.T.Y.Y.P.P.L.P.K.L.L.L.L.S.L.K.H.L.H.H.S.S.H.S.D.A.S.S.H.H.D.H.S.H.H.G.A.A.A.A.h.A.l.h.l.k.l.g.k.h.k.h.k.k.k.k.k.g.d.f.k.k.i.g.a.k.a.z.a.a.a.i.i.i.i.i.i.i.i.a.i.i.i.i.i.a.a.a.a.a.a.a.a.k.i.a.f.a.f.g.i.z.i.k.a.a.i.i.i.i.i.i.i.i.i.u.u.u.i.u.a.u.i.u.i.k.E u.u.a.u.i.u.u.i.i.i.i.a.i.i.a.i.i.u.i.u.u.a.i.u.u.u.u.u.u.t.t.u.p.u.t.t.t.p.u.r.t.t.t.t.u.u.u.u.u.u.u.u.u.u.u.i.u.p.p.u.t.u.t.t.t.u.u.i.u.u.i.i.a.a.k.a.i.g.a.g.g.f.f.f.f.a.f.a.k.k.a.f.f.k.a.k.",
+"L H H L H P H P Z H H H H H H H H H H H H H H H H H H J H J J J P P P J P K J U H J L L J J J J L L L L J P P P P P P P P P J ) I I P I P P P P J H U H H H H H H H H D H D D D Z H Z L D Z Z Z D Z D Z Z Z B Z D D C Z B C C C F C C C C C N C N C C C A C A C C C C C N C C N V A N N A N N N B C N u C C C A Z A C Z Z Z Z Z Z Z Z Z Z Z G Z Z Z Z Z D C B Z Z Z G C Z G Z Z Z D D D Z L H L H H L L Z Z Z L D D D D Z D D D C L b.S.D.G.U.L.U.L.S.S.L.L.Z.S.L.L.L.L.L.L.L.H.L.L.H.L.S.U.L.P.L.U.P.U.L.U.U.L.P.T.U.U.U.U.P.P.L.R.Y.I.T.T.Y.T.T.T.T.~.~.T.~.~.~.T.T.~.~.T./.T.~.~.~.~.~.~././.^.(./.~.!./.~./.~.(.~.~.~.~.^./././.!.).~./.(.).(.(._.(.(._.(.`.(._._.(.`.(.(._._.(._._._._._._.}.}.|.|._._.|.|.'. X.X.X.X.X'..X.X.X.X.X.X.X.X.X|.|.|.|.|.|.|..X|.|.|.|.|.|.|.|.'..X|..X X.X.X|..X.X.X.X.X.X'..X X X.X|..X.X|..X.X.X.XdX.X.X.X@X X X@X.X@X.X.X.X|.'.|..X|..X.X X.X.X.X.X X|..X.X X|..X.X|.|.|. X|.}.}. X}. X X|.'..X'.@X'.zX.XdXdX@XzXdXzXzXcXzXxXxXxXcXcXcXxXmXMXnXnXnXMXnXcXMXMXcXcXMXnXnXmXmXmXmXmXmXmXmXmXmXfXmXNXmXmXmXmXmXmXmXmXmXfXmXNXfXSXdXMXMXMXMXMXMXmXmXfXfXmXmXMXmXmXmXnXmXnXnXnXnXxXxXxXxXdXnXxXdXdXdX.XdX.X.XdX'..X.X.X.X.X|.|.|.`.^.|.^.(.(.^.^././.~.^.T.~.T.T.T.P.P.L.U.P.L.L.L.H.L.H.G.S.A.S.S.S.A.A.h.A.h.h.h.h.h.g.k.g.g.g.g.g.g.a.z.z.a.z.k.k.k.k.f.a.a.g.f.f.f.f.f.g.f.j.g.f.a.f.a.f.a.a.f.i.k.i.i.a.a.a.a.i.d.a.a.a.a.a.a.i.a.i.a.i.i.u.i.u.i.a.u.u.u.u.i.u.u.u.u.u.u.u.u.t.u.u.t.u.t.t.t.t.r.r.r.r.t.r.r.t.r.t.r.r.r.r.r.r.r.r.r.r.t.t.r.r.r.t.t.t.t.t.t.t.u.t.t.u.u.t.t.u.t.s.u.i.u.u.s.i.a.a.a.z.a.a.k.f.f.f.k.g.g.g.g.h.h.A.A.A.l.S.S.G.H.L.L.L.L.U.U.U.T.P.T.U.U.T.T.T.T.~.T.^.T.~./././.(.(.E././.[.(.(.(.(./././.~.~.E./.(./.(./.(.(.^.(.(.^.(.(.{.^.(.(.(._._.(.`.^._.^.}._._.|. X|..X X.X|.|. X`.|.|.|._.}.}.}.(.|._.[.|._.}.}.|._._.|.|.|.|.|.|..X X|.|..X|..X.X X X.X|.|.|.|.'. X|.|..X.X.X|..X.X.X.X.X.X.X X'..X.X.X.X.X|..X.X.X.X.X X|.|.|._._._._.(.`.(.`./.(.(.(.(.(._.(.(.(.(.(.(.(././.^.~.~././././.T.T././././.~.(.[.(.~.(.[.(./.(./.(.(.(.(.(.(.(.(.(./.(.^./.T.~.T.T.~.T.P.P.P.P.P.U.U.L.L.L.L.L.S.H.H.H.H.H.H.A.A.A.H.H.A.G.S.H.G.G.H.S.S.A.A.A.A.A.h.l.l.h.h.h.k.k.h.k.h.k.h.l.k.f.k.k.f.k.k.k.z.a.i.g.a.a.a.i.a.i.a.i.i.a.i.i.i.i.i.i.i.a.a.i.a.a.a.a.a.a.f.a.k.f.f.f.a.a.a.a.f.a.a.i.i.i.a.i.i.i.i.u.i.u.a.i.u.i.u.i.i.i.u.i.i.u.u.i.u.u.a.u.a.i.i.i.i.i.i.i.i.u.a.u.x.u.a.d.u.u.u.u.u.u.t.t.u.u.t.t.t.t.t.u.u.t.u.u.u.t.u.u.u.u.a.a.u.u.u.i.a.u.p.u.p.t.u.t.u.t.u.i.i.i.i.a.f.g.a.a.a.i.f.f.g.f.k.k.f.g.a.f.f.a.f.g.i.z.g.a.f.",
+"L P H L H H H H P H Z L H F H H H F H H H H H H H H P P J J J I J J P P P P H K P H H J L J H H J L J P L P P P P P P P P P ) P I I ) P P P P P J J P H J H J H H H H H D H D D D Z L Z D H H Z Z D Z Z Z D F Z Z C Z C D C C Z C C C C C C C A C C C C V C V C C C C C C B N C C N M C N N A C C B B N C C C C Z C Z Z Z C Z Z Z Z Z Z G Z D D Z Z Z Z Z D D Z Z Z Z Z Z G Z Z D D D D Z Z Z Z Z H Z L Z L L Z D D D Z D Z D Z Z L T D.L.H.G.L.A.L.L.L.S.L.L.L.D.H.L.H.H.L.H.Y.H.L.L.L.L.L.P.L.L.L.P.P.L.L.L.U.U.U.U.P.L.P.P.P.U.Y.I.Y.T.T.~.T.T.T.T.T.~.~.T.T.T.[.~.T.T.T.T.~.~.~.~.~.~.~.~.!.~.~.~./.[.~./.~./.^.(.~.T.(.~.~././.(./.^.!.(.(.(.(.(._.(.^.^.`._.(._._.(.|._._._._._._.[._._._._.}._._.|.|.|.|.|.|.|..X.X.X.X.X.X.X.X'..X.X.X'..X.X|. X'.'.|.`.|.'.'.|. X.X.X|..X|.|.'..X.X.X.X.X'..X X.X.XdX'..X.X.X.X.X.X.X.X.XdX.X.X.X.X.X.X.X XdX.XdX.X.X.X.X.X.X|. X|..X.X.X.X.X.X X|..X|..X.X X|..X|.|.|. X X}.}.|.}.|.|. X X X.XzX'..XdX.XdXdXdXzXzXzXcXdXxXdXcXcXnXxXnXcXbXfXnXnXcXMXnXnXmXmXcXMXmXmXdXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXMXMXMXmXMXNXfXMXSXMXMXMXmXmXmXMXvXnXnXnXnXcXcXxXdXcXzXdXcXdXdXdXdXdX.X.X.X.X'..X.X.X|._.|._.|.(.`.^.(.(.(././.^.T.T.T.T.U.P.P.P.L.L.P.L.L.L.L.H.H.H.S.H.A.A.A.A.A.A.A.A.h.h.h.h.g.g.g.g.g.g.g.g.z.g.f.g.g.k.f.f.f.k.f.g.z.f.i.g.a.f.a.a.a.a.k.a.a.a.a.a.a.i.i.i.i.i.a.a.a.i.a.d.a.d.a.a.a.a.a.a.a.a.i.i.i.u.u.i.u.a.u.u.u.u.u.u.u.u.u.u.t.t.u.t.u.u.t.u.t.t.t.t.t.t.t.r.r.r.r.r.r.r.t.r.r.r.r.r.r.r.r.y.t.r.r.r.t.t.t.t.u.t.t.u.t.t.u.t.u.s.t.u.t.u.u.u.i.u.u.a.a.a.a.k.a.i.f.z.f.k.g.g.g.k.l.k.A.g.A.A.A.S.G.G.S.H.L.L.U.U.U.T.P.U.T.T.T.T.T.T.~.~.~.^.[././.^.(.^.{.(./.(.(.(.(./.(.(./.(.^.^./././.(.|.^.(.(.^.(.`.{.).(.^.(.(.(.(.(.(._.`.(.|.}.|.|.|..X'.|.|.|.'. X'.|.`._._.|.}._._.{._.}.}._.|.}.}.|._..X_.|.|.|.|. X|..X'. X|..X.X.X|..X|..X|.@X|. X'. X.X.X.X.X.X|..X|. X|. X|. X X X.X X.X.X.X.X|..X X X X|.|.|._._._._._.`.^.`.`.(.(.(.(.(.(.(.^.^.(.(.(.(././.(.(.~.~.T./././.(.!./.~.~./.~./.(.(.(.(././././.^.(.(.(.(.(.(.(.(.(././.~./.~.T.T.T.P.U.P.P.T.P.L.L.L.L.U.S.L.L.H.H.H.H.H.H.H.H.H.A.S.H.G.S.A.G.G.S.S.S.A.Z.h.A.h.A.l.h.l.h.l.l.h.k.h.k.k.k.k.k.f.f.f.k.f.z.i.i.a.f.a.a.k.a.a.i.i.i.i.a.i.i.i.i.i.i.i.i.a.a.a.i.a.a.a.a.a.i.a.k.a.a.s.a.a.k.a.a.a.a.i.k.a.i.a.a.t.i.u.u.u.u.u.i.u.i.i.u.z.E u.u.i.i.u.u.u.u.u.u.i.i.i.a.a.i.i.i.k.E u.E u.u.k.E u.i.u.u.u.u.u.u.u.u.u.u.t.t.t.u.u.u.p.t.u.i.u.i.i.u.u.u.i.i.u.u.u.u.u.u.u.u.t.u.u.u.u.s.i.i.i.a.a.i.g.a.g.f.f.a.k.f.k.f.k.k.f.f.f.f.a.f.z.a.k.g.",
+"L H H L U H H H H H H J K G H H Z L H H H H H H P H H J J J J J J P J J P P L P H P H H J L J L L L J J J L P P P P P ) ) J P ) P I P U P P Y L P H P P H H H H H H H H H H D Z D D Z Z Z L Z Z Z D Z Z Z C C Z C D C Z Z C C C A C C C C C C V C C B C C C C C C C C C N C C B A N V C B Z B A B C B C C C C C C C Z C Z Z Z C G D Z Z Z G B D Z Z Z Z C G D Z Z Z Z Z Z Z Z G Z D D D Z H D D H S Z L H Z Z Z Z D D D Z Z Z Z Z D T H.S.H.A.P.H.H.H.H.L.L.L.S.L.H.H.L.L.L.L.L.L.S.L.H.L.U.L.L.L.L.Y.L.L.L.L.L.L.U.U.U.P.P.P.P.U.U.T.U.L.T.T.T.T.T.T.~.T.~.T.~.T.~.T.~.T./.~.T.~.~.~.~././././.~.~.~.~.!././.~.~./.~.~.~.~.^.(././././.`.!.(.(.(._._.{.`.^.^.^._.(.(._./.{._._._._._._._._.}._.}.}._.|.|.|.|.|.'..X|..XdX.X.X@X.X.XdX.X.X.X X.X.X.X.X.X.X|..X X|..X.X.X X.X'..X|..X.X.X.X.X.X'..X.XdX'..X.X.X.X.X X.X.X.X.X.X.X.X.X.X.X@X X'..X'..X.X.X X'..X.X.X.X.X.X.X.X X X.X|..X|. X X X|..X|..X|..X|. X X}.|.}.}.}. X|.|. X.X.X.X.X.XdXdXdXdXdXzXzXzXzXzXxXxXxXcXcXnXnXxXnXnXnXnXnXnXMXnXcXcXcXmXnXMXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXMXmXmXmXmXmXmXmXmXmXmXmXmXmXMXMXMXMXMXmXMXMXMXMXMXMXmXmXMXmXmXnXnXnXxXdXnXcXzXdXdXnXdXdX.XdXdXdXdX.X.X.X.X.X.X|.|.`.`.(.(.(.(.(.(.^.~./.~.~.~.T.T.U.U.U.U.L.L.L.L.L.L.L.H.H.H.H.A.A.H.A.A.A.A.A.h.l.l.h.h.h.g.g.g.g.g.g.g.g.g.g.z.a.a.g.f.a.f.i.f.i.i.s.a.a.a.a.a.a.f.a.a.a.i.a.a.a.a.i.i.i.i.i.i.a.a.a.a.i.k.a.a.a.i.a.a.a.i.a.i.i.i.u.i.u.u.u.u.u.a.u.u.u.u.u.u.t.u.u.u.t.t.t.u.u.t.t.t.r.t.t.r.r.t.r.r.r.r.r.r.r.r.r.r.r.r.E y.t.r.r.r.r.t.r.r.u.t.t.t.t.t.u.t.t.u.u.t.t.u.u.u.u.i.s.u.a.i.a.a.a.z.f.f.f.f.g.g.g.f.g.z.g.h.A.h.A.A.S.S.G.G.L.L.L.L.L.U.P.P.U.T.T.T.T.T.~.T.~.~.~./././././.^.(.^.(.(.^.(.(.(.^.(./.~.(.(.(.(.(.(.(.{.(.^.`.^.^.^.{.(.`.(.{.(.(.|._.^.`._.(.}.}._.|.|.|.|.'.|. X X|.`.`.|.|._._._.|._.|.}.}.}._.}._.|._.|.`._.|.|.|.|. X|. X X|.'. X X.X|..X|.'._. X|.|.'.|.|..X.X|.|.'.'.|..X|.|.|..X.X|..X.X|..X X X X|.@X'.|.|._._._._._._._.{.(.(.^.(.(.(.(.(._.(.(./.(.(./././././.~.~./.~./.T.~.~.~.~.~.~.~.~.[./.T.(.(.~./.^.(.(./.(./.^.(.[.{././././.~.T.~.T.T.P.T.P.U.U.U.L.L.L.L.L.L.S.L.H.S.H.H.H.H.H.A.S.A.h.H.S.S.l.S.S.S.S.h.A.A.h.A.D.A.h.h.l.l.l.k.k.h.h.k.h.k.k.h.k.k.k.f.f.f.f.i.a.a.g.a.a.a.i.a.a.i.i.i.i.i.a.a.i.a.a.a.i.i.i.i.a.a.a.a.a.a.a.a.a.f.a.a.a.a.f.a.a.a.a.a.a.i.i.a.i.i.i.u.u.i.u.a.i.i.u.i.u.i.a.a.u.u.u.u.u.u.u.a.u.u.a.i.i.i.i.u.a.a.u.i.i.E x.d.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.a.a.a.i.t.u.u.u.t.i.u.u.u.u.u.u.u.u.i.i.i.a.a.a.a.i.g.a.g.f.f.z.a.g.f.k.k.f.z.k.a.f.f.a.g.a.a.",
+"H P L H L H H J H H U Z H H H H H H H H H H H J P Z H P J P J J P P J Y I H P P P H U H H H U K J L U J J P P P S P P P I P P P P P P P P P P S H J H H U P H H H H D Z H D D D L D D D D Z Z Z D Z D Z Z Z Z Z Z B Z C B C Z C C C C Z C C A C A C B B u C C C C C A C C C N B V C N N B B B N C B V V A C C A C Z C Z B C Z Z B Z Z Z Z Z Z D Z Z Z Z D D C D Z Z Z Z Z Z Z Z Z Z Z Z D D D Z H Z L Z Z H Z H D D D D F Z Z D Z Z T Z.S.S.S.L.H.L.L.L.L.S.L.L.H.H.H.H.S.L.H.L.L.L.L.L.S.L.L.L.L.L.L.L.L.L.L.L.P.L.L.L.P.P.P.P.T.U.U.U.T.U.T.T.T.~.T.~.T.T.~.T.T.T.~.T./.T.~.~.T.~.~.T.T.T.~./.~.~.~.^.[.~././.~.(.~.(.~.~.~.~.(././.(.~.(.(.(.(._.^._.^.`.`.^._._._._._._._._._._._.(.}.}.[.}.}.}._.|.|.|.|..X.X X.X.X X.X.X.X.X.XdX.X@X.XdX'.@X.X.X|..X.X X'..X.X.X|..X.X X.X.X.X.X.X.X.X.X.X.X'.@X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XdXdX X'..X'..X.X.X.X'..X.X.X.X.X.X.X|. X X|..X.X X|..X.X.X.X.X|. X|.|.|.|.}.}.}.|.}.}.}. X|.|. X.X.X.XdX'.dXdXdXdXzXzXcXdXxXxXxXxXxXcXnXnXnXxXnXnXnXcXcXnXcXmXmXcXnXcXmXmXmXmXmXmXMXmXmXMXMXmXmXMXmXmXMXMXmXmXmXmXmXmXNXmXmXmXmXmXMXMXNXMXNXfXMXMXMXmXmXmXmXmXmXmXmXnXnXnXcXcXcXcXcXdXdXdXdXdXdX%X@X'..X.X|..X'.|.|._._.(.^.(.(.(./.(.~.~.E.T.T.T.T.T.U.U.L.U.L.L.L.L.S.L.L.H.H.H.S.A.G.G.G.G.j.Z.A.h.A.l.h.h.h.g.k.g.g.g.g.a.g.f.g.a.g.g.a.f.f.f.z.a.k.d.a.f.a.f.a.a.a.a.a.a.a.i.a.u.a.i.i.i.i.i.i.i.i.i.a.a.a.a.z.i.a.z.a.i.a.i.i.i.i.u.a.u.a.a.u.u.u.u.u.i.u.u.u.t.u.u.t.t.u.u.u.t.t.t.p.t.t.t.t.t.r.t.r.r.r.r.y.r.r.t.r.r.r.r.t.t.t.y.r.r.t.r.r.t.E t.t.t.u.t.t.u.t.t.t.u.u.u.u.u.u.i.i.i.i.a.i.a.a.a.i.f.f.f.f.g.f.g.g.g.S.g.h.A.l.A.A.S.G.S.D.H.L.L.L.Y.P.U.T.T.T.U.T.T.T.~.!.~.~.~././.(.(./.^.(.(.(.(.(.(.(.(.(.(.^.(.(.(.^.(.{.^.`.`.`.(.(.^.|.(.(.(.{.(._.^.^.(.`.(.|.[.}.}.|.|.|.|.|.|.|.|.|.|.`.|._.|.|._._._.|._.[.}.}.}.}.}.|.|._.|.|.|.|.|.|..X'.|.|..X|.'.|.|. X|.|.`.|.`.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.'. X X_.}.}._.`._._.(._.(.(.(.(.(.|.(.{.(.(.(.(.(.).(././.(./././.T.~.~./.T./.T.~.~.~.~.~.T.[.(.T.(.~.~././././.^.(./.(.(.{.(.(.(./././.~.~.T.T.T.T.T.U.P.L.U.L.U.S.L.L.S.L.L.S.U.L.H.H.H.H.H.H.S.S.S.S.S.S.S.S.S.S.Z.A.A.A.l.A.z.h.D.g.l.l.l.l.h.h.k.h.k.k.k.k.f.f.f.f.f.k.k.i.a.f.a.a.a.a.a.a.i.a.i.a.i.a.a.a.a.a.a.a.a.i.i.i.i.i.i.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.i.a.a.i.a.t.i.u.i.u.u.i.u.t.E u.u.u.u.i.i.E u.i.u.u.u.a.u.a.u.u.u.a.u.u.i.i.a.E x.u.u.i.E d.i.i.u.i.u.u.u.u.u.i.u.u.u.t.u.u.u.u.u.i.u.u.u.i.u.u.u.u.a.u.a.u.u.u.u.i.u.u.i.i.i.u.s.a.i.a.a.a.a.z.f.f.f.f.f.f.f.g.g.g.g.k.a.h.k.g.f.z.k.z.a.g.",
+"L L H H H H J H H H H H H H H H Z H H H L H H H H L U J H J J P P J I J J I J P K J L G P H L K J L L J L P P P ) P P I P ) J P P P P P P P H P J H P H H H H H H H Z H H D D D Z D D D Z Z H Z Z Z F Z Z Z Z Z C Z Z C C C Z C Z C C C C C C C C C A B C C C C A N C C C C C B B C B B B Z C C B C C B C C A C D C B Z D Z Z C Z Z B Z Z Z Z G F B Z Z Z Z Z Z Z D Z Z Z Z F Z D Z D Z D D D Z Z L H Z L S L Z D D D D Z Z L Z Z Z T b.S.S.U.S.G.H.L.L.H.H.H.H.H.H.S.H.L.L.L.H.L.H.L.A.U.L.L.S.L.L.L.L.L.L.L.L.L.P.P.L.U.L.P.Y.U.T.U.T.T.U.T.T.T.~.T.T.T.T.T.~.T.~.T.~.~.T.~.~.~.T.T.~.~.~./.T./.~.[./.~././.~.~./.~.~.~.~.~././././.(.(.(._.(.(.(.(.(.{._._.(._._._.(._._.(._._._._._._.|._.}.}.}.}.|.|.|. X|.'.'..X.X.X.X.XzXdXdX.X.XdX.XdX@X X.X.X.X'..X.X.X.X.X.X'..X.X.X.X.X.X.X.X.X.X.X.X.X.X.XdXdX.X.X.X.X.X'..X.X.X.X@X.X.X.X.X.X.X.X.X'..X.X.X.X.X X.X.X.X.X.X.X X X_.|..X X|.@X X X.X|..X.X.X.X|.}. X}.}.}.}.}.}.|.}.|.|.'. X.X.X.X@X.XzX.XcXzXzXzXdXcXxXxXxXdXJXnXxXxXxXnXxXnXnXnXcXmXnXnXnXmXmXmXmXMXMXmXNXmXmXmXMXmXMXMXMXmXmXNXmXmXSXmXmXMXmXmXmXmXmXMXmXMXMXMXMXmXMXMXMXmXMXMXMXmXmXnXnXmXnXnXnXcXcXdXzXdXzXdX.XdXdX X@XdX X.X.X X|.|.|.{.`.`.`.(.(.(.(.(.~.~.~.~.Y.~.P.U.T.L.L.U.L.L.S.L.L.U.S.H.L.G.G.S.S.A.Z.A.A.A.j.G.g.l.l.h.h.h.z.g.k.g.g.g.g.g.g.a.g.d.a.a.a.f.f.a.f.a.a.a.a.a.a.a.a.d.a.a.a.i.i.i.u.u.i.i.i.i.i.i.i.i.a.u.a.a.i.a.z.k.a.a.a.a.i.i.i.i.i.u.u.u.u.i.u.u.u.u.u.u.u.u.t.u.t.u.t.t.t.u.t.t.p.t.p.t.t.t.t.r.r.t.y.t.y.r.r.r.t.t.t.t.r.r.r.r.r.r.r.r.r.t.r.t.t.t.t.t.t.t.t.t.u.u.u.u.u.u.u.i.u.a.t.i.i.a.a.a.f.k.f.f.z.k.k.z.g.h.h.k.A.A.A.A.A.A.H.S.S.H.H.L.L.L.U.Y.U.T.T.T.[.T.~.T.~.T.T.~.!./.~.[.(.(./.(.(.(.(.(.(.(.(.(.(.^.(.(.(.^.|.|.|.(.{.|.{.|.(.(.(.(.(.(.(.(.(.^.`.^.|._._.|._._._.|.|.|.|.|. X|.|._.|._._.{._._.^._.|._.}._.|.|._.`.|.|.|.|.|.|.|.|.|.'.|. X|.|. X X X|.|.|.|._.|.|.|.|.|.|.|.|._._.|.|.|.}.|.|.|.|.|.|.|.|.|.|.'.|. X|.|.|.|.|._._._._.(.(.(.(./.(.(.(.^.(.(.(.(.(./.(.^.(././././.!.~.~.~.T.~.~.~.~.T.~.~.T.~.~.^.T.~.[./.~./././././././.(./.(.(./././.T.^.T.T.Y.U.P.P.P.L.L.P.L.L.L.S.H.Z.K.H.H.H.H.H.H.S.H.h.A.S.S.A.S.S.S.S.A.S.A.A.A.z.A.h.D.h.A.h.g.h.k.l.h.h.f.k.k.k.k.f.k.k.f.f.z.i.k.k.f.a.a.a.f.s.a.a.a.i.a.i.a.a.a.a.a.a.a.i.a.a.i.i.i.a.a.i.i.a.i.i.a.a.i.a.a.a.s.a.a.a.a.i.a.i.a.u.u.i.a.u.u.u.i.u.z.t.u.i.u.u.u.u.u.u.i.u.u.u.a.u.i.u.u.u.i.i.u.a.u.i.i.i.i.u.a.u.u.i.u.u.i.u.a.i.i.u.i.u.u.i.i.u.u.u.i.u.i.u.i.u.a.u.a.u.i.u.u.u.i.u.u.i.i.i.i.f.a.a.a.a.a.a.a.a.g.a.g.f.f.a.h.j.g.j.f.g.f.h.f.f.g.g.z.a.k.k.a.g.",
+"L L H P U H H H H H J H H Z H H H H H H H H L L L L P P Y K P J P P J I P P L P I L L K J J H U L L L L J P L P P P P P I J P K P P P P P P P P P P H H P H P H H H H H L H L D D D L D H H Z Z F Z D Z Z C B D Z Z C Z F C F C C C C C A C C C C C C C C C Z C C C C C C C B C N B B C B B B B C B C B A B V C C C C C C C A Z Z C D D Z Z Z C Z G Z Z D D Z Z Z Z Z D Z Z Z Z Z F Z D Z F D D H Z H S Z Z L Z D D D Z Z Z Z Z Z Z H T S.L.L.H.L.H.G.H.H.H.H.Y.H.H.H.H.H.H.H.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.P.P.P.U.U.U.P.P.T.U.T.U.U.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.~.T.~.T.~.T.~.T.[.~.T.T./.~.~.~.!./.~././.~.~.~.~.~.!.~./.!./.(./.(.(.(.(.(.(.(.(.^.(.(.(._._._._._._._._.[.|._._.|._._._._.}.}.|..X|..X.X.XdX.X.X.XdXzX.XdX#XdXdXdX.X.X'. XdX.X.X XdX.X.X.X.X.X.X.X.X.X.X'..X.X.X.XdX'. X.X.XdX'..X.X'..X.X.XdX'..X.X.X'..X.X.X.X X.X|.|..X X.X X.X.X.X.X.X.X X@X.X.X X@X.X X.X|. X X.X.X.X X|..X|.}.}.}.}.}. X}.}.}.}.}.|.|.|..X.X.X.X.X.X.XzX.XzXzXcXcXvXcXxXxXcXnXxXcXvXnXxXnXcXnXnXnXnXnXnXnXcXmXmXmXMXMXMXmXMXmXMXmXMXmXMXMXmXSXfXmXmXmXmXmXMXMXMXmXmXmXmXmXMXMXMXMXNXfXMXMXmXMXMXMXmXmXmXJXnXnXnXnXcXvXnXzXcXvXzXzX#XdXvX.XdX X.X.X|.|.|.|._._.^.|.(.(./.(.^.~.~.~.T.~.P.Y.T.L.U.L.L.L.L.L.S.L.L.H.H.H.H.G.A.S.h.A.A.A.A.A.j.h.l.l.h.h.z.l.z.h.g.g.a.g.g.z.z.a.j.f.i.g.a.a.a.a.a.a.a.a.a.a.i.i.i.i.i.i.i.i.i.i.u.u.i.u.u.i.i.i.a.u.a.a.a.k.a.a.i.a.a.a.a.i.i.i.i.u.i.u.i.u.i.u.i.u.u.u.u.u.t.u.t.u.t.u.u.t.t.u.t.u.t.t.t.t.t.t.t.r.t.r.t.r.r.r.r.t.t.r.t.t.r.r.r.r.r.r.r.t.r.r.t.t.t.t.t.u.t.u.t.s.u.t.u.u.s.u.u.u.i.i.a.i.a.a.a.a.i.f.f.f.k.k.k.z.l.h.h.g.h.A.h.A.A.A.S.S.S.G.L.L.L.U.U.Y.T.T.T.T.T.T.T.T.~.!.~.~././././.(.[.(.(.(.(.^.{.(.^.(.(.(.(.`.(._.^.^.`.|._._._.`.^.(.(.(.(.(.(.(._.(.^.`.(.|._._.`.|._.|._.|._.|._.|._.|._. X`._._._._._._.(.}.|._._.|._.'. X'.|..X X.X'.|.|. X|.'. X|.|. X}.}.|._.|._._._._.|.|.|._.|.|._._.|.|._.}.|.|._._.|.|.`.|.|.|.|.|.|._.|._._._.^.(.(.^.(.(.(.(.(.(.(.(.(.(./.(.(./././././.~./.~.~.T.~.~.T.~.T.~.~.T.T.(.~.~.T./.~.~././././.(././././.(././././.^.R.T.T.Y.T.L.Y.P.P.K.P.P.L.L.L.L.L.U.L.S.H.S.H.H.H.H.H.H.S.F.S.S.S.S.l.S.S.S.A.A.A.A.A.h.A.g.A.h.g.l.l.h.l.h.f.h.f.k.k.f.k.f.f.f.k.i.k.i.k.f.a.a.a.a.i.a.a.i.i.i.a.d.a.f.i.d.a.a.d.a.i.i.i.a.i.i.i.i.i.i.i.a.i.i.i.s.a.s.a.i.a.i.i.i.a.u.i.i.u.u.u.u.i.u.u.E a.u.s.u.i.i.u.i.u.u.i.u.a.u.a.u.a.u.a.u.i.i.u.i.i.u.i.i.i.i.i.i.u.i.i.u.i.u.i.i.i.s.u.i.u.u.s.i.i.i.p.i.i.i.i.u.a.u.a.i.i.u.a.i.i.a.a.i.i.a.a.a.a.a.a.a.a.f.f.a.g.a.z.g.f.f.g.f.g.g.g.g.l.h.k.g.g.g.z.k.a.a.a.",
+"H J L L I H F J L L H H H H H H H H H H H H H L L L H P P L P P P P Y J P P J I H J H H J G H P L J L J J P J P ! P P P I I J I P J P P P H P H P H H P P U H H Z L Z L Z D Z D D L D D L Z L Z Z D Z D Z Z B Z C Z C C C Z C C B C C C C C C B C C C C D V C C C C C C C C B B C C N B B B B N C C B C C C C C C C C C C Z Z B Z Z Z Z Z Z D D Z Z Z G Z Z Z Z Z Z Z B Z Z G Z Z Z Z D Z D D D H Z Z H Z H Z Z F D D D H D Z D Z Z J T Z.G.G.H.L.G.H.H.H.H.H.A.H.H.H.H.H.L.L.L.L.L.L.L.S.L.L.L.L.L.L.S.S.U.D.L.L.P.P.P.P.P.Y.P.U.T.T.T.T.T.T.U.U.T.T.Y.T.U.T.T.T.T.~.T.~.T.~.T.~.T.~.T.~.~.~.T.!.~.~./.~./.~.~./.~.~.~.!.~./.~.!././.(.(.(.(.(._._.(.(.(.(.(.{.(._.(._._._._._.`.`.(._._.|._. X}.}.|.'..X X.X.X.X.XdX.X@X.X.XzXzX'.zXzXdXdX.XzX.XdX.X.X'.@X.X.X.X X.XdXzX@XdX.X@X.XdX.X.XzX.XdX.X.X.X.X.X.XdX@X.X.XdX XzX'.dX X.X X X.X.X.X X.X.X X X.X.X.X X.X.X.X X'.|..X|. X.X|..X.X X.X X.X.X.X.X X.X|.}.}.}.}.}.}.}.|.}.|.|.|.|..X X.X.XzX.XzX.XzXzXzXdXnXxXxXxXnXcXnXxXxXnXnXJXzXxXmXnXnXnXnXnXnXcXmXmXmXMXMXMXMXmXNXMXMXMXSXMXMXmXMXSXfXMXmXmXmXMXMXMXMXmXmXMXMXMXMXSXfXMXSXMXMXMXmXmXMXmXmXnXnXnXnXnXxXcXcXcXdXzXzXzX.XdXdX.X.X X'..X X|.|.|.(.{.{.(.(.(./././.~.~.T.~.Y.Y.U.U.U.L.U.L.L.H.H.L.L.H.S.H.H.H.H.S.S.A.A.A.A.A.h.h.h.l.h.h.h.h.l.l.g.h.k.g.g.g.g.a.k.a.i.g.d.a.f.a.a.a.a.a.a.a.i.i.i.i.i.i.i.u.u.i.u.u.u.u.t.a.u.s.i.i.s.u.s.a.a.a.a.a.a.a.a.a.i.a.i.i.i.u.u.i.i.u.u.u.u.u.u.u.u.t.u.u.t.t.u.u.t.u.t.u.t.t.s.t.t.t.t.t.t.r.r.t.r.r.r.r.t.t.E a.r.t.t.r.r.r.r.r.t.r.t.t.t.t.t.t.u.t.u.t.t.t.t.u.u.u.u.u.s.i.s.i.i.a.a.a.k.a.k.k.k.k.g.h.h.h.z.h.h.G.j.G.A.Z.h.S.D.H.H.L.L.L.U.U.U.T.T.T.T.T.T.T.Y.~.T.~.~.!.!./.(././.(.(.^.^.`.(.(.^.(.`.(.(.(.^.|._.|.|.^._.^._._.`.^.(.`.(.(.(.(.(.(.(.`.^.|._.(.`.(.`.(._.|.{._.|._._.|.|.`._.|._._._._._._._.|.|.{.|.|.|.|. X|. X|. X|.'.|.'. X|.|.|.'.}.|.}.}._.|._.|.^.`.|.[.|._._._.|.|._.|._.|._.|.|.|.|.}.|._.|.|.|.|.|.|.|._.[._.(.(.(.{.(./.(.(.[.(.(.(./.(././.(./././././././.T./.~.T.~.T.~.T.~.~.T.~.T.T.~.T.~.~.~.~.~.~././.~.~.(./.(././.).~.^.~.~.T.T.Y.P.U.P.P.L.L.P.L.P.L.L.L.U.P.S.H.H.H.H.G.H.S.S.S.S.l.S.S.S.S.S.S.D.G.S.S.z.A.h.A.l.h.h.D.k.l.l.l.z.g.g.z.f.a.f.f.k.f.k.f.d.f.i.z.a.a.f.a.a.a.i.a.a.i.d.a.i.a.d.a.i.a.z.i.i.i.i.i.k.a.a.a.i.i.i.i.i.i.i.a.s.s.u.s.i.a.i.i.i.u.i.u.u.i.u.u.u.u.u.i.i.z.u.a.a.u.i.a.u.u.i.i.u.u.u.a.u.a.u.u.u.a.u.u.i.i.u.u.i.u.u.u.u.a.u.i.i.u.i.d.i.i.u.i.i.u.i.i.u.i.i.i.i.i.i.i.i.u.a.u.a.i.i.a.i.i.i.a.a.a.a.a.a.a.a.a.f.f.a.a.f.a.g.z.f.f.g.g.h.k.k.g.k.l.a.f.h.g.g.f.g.g.f.g.z.",
+"L U H L H J H H J G H F H G H H H H H H H L H P H U H P P P P P P J P P P P L J P H J J J J J J L J U J L P P ) P P J P I J I P P J P P H U P P P H P H H H D H H H L D L H Z D D D Z D Z L Z Z D Z D D Z Z D Z Z C D C C C C Z C D C C F C C C C B u C C C C D C C Z C C B C C C C C A Z A Z C B B C B C C C C A C Z C C C C D D B Z Z C Z C D D G Z Z Z F Z D Z Z Z G Z Z C C Z Z D D Z D D D Z L Z Z H L S Z D D D Z D Z H Z F Z G G Z.S.H.L.H.L.S.H.H.H.H.H.H.H.H.H.H.H.H.H.H.S.S.L.L.L.L.S.L.L.L.L.L.L.U.L.P.L.P.P.P.P.Y.Y.T.U.T.T.T.T.T.Y.T.I.T.Y.T.T.T.T.T.T.T.T.T.~.T.~.T.~.T.~.T.T.T.^.~.~.~./.~.~.!.~.~.!.~./.~.!.~././.(.(.^.(.(.(._.].(.(.(.(.(.(.(._._._._._._._._.(.|._. X_.|.[._._.|.}.|..X X.X.X.X.X.XdX'.dX.XdX.XzX.X.XdX.X.XzXzX.XdX.XzX'.zX.X@XdXdX'..X.X'..X'.dX.X'.dX'.'.@X.XxX.X.X.X'. X.X'.dX@X.X.X'..X'..X X.X.X X.X.X|..X.X.X X.X X X.X.X.X.X X.X.X.X.X.X.X|..X|.|..X.X.X.X|.|.|.|.}.|.}.}.}.}.}.}.|.|.|.|.|. X.X.X.X.X.X.X XzXzXzXcXcXxXxXxXxXxXxXxXcXnXnXxXnXxXnXnXnXnXnXnXnXNXmXMXmXMXMXMXMXMXMXMXMXMXMXMXmXmXSXMXMXMXSXMXMXMXMXmXmXmXMXMXMXMXMXmXNXMXMXMXMXmXmXMXmXmXnXMXnXnXnXnXxXvXnXdXzXvXdXxX.X.X.X.X.X X X X X|.|.|.`._.(.(.(././././.~.T.~.Y.T.T.Y.T.L.L.L.L.L.L.H.H.H.L.H.H.H.H.S.S.G.A.G.A.A.j.h.h.h.h.h.h.f.h.k.h.k.k.k.g.a.g.a.g.k.g.j.i.a.a.a.a.a.a.a.a.i.i.i.i.i.i.p.i.u.u.i.i.u.i.s.u.u.u.u.u.i.s.u.i.a.a.a.a.a.a.a.k.a.a.a.a.a.a.i.u.i.u.u.i.u.u.u.u.u.u.r.u.u.t.t.u.u.t.u.t.u.t.u.t.t.t.t.t.y.t.r.t.r.r.r.t.r.t.t.t.t.u.t.t.t.r.r.r.r.r.t.r.t.t.u.u.t.t.t.u.t.s.u.u.u.u.t.u.u.u.u.u.s.t.i.a.i.a.a.f.i.d.g.k.k.k.g.z.z.l.g.g.S.h.h.h.A.z.G.S.A.L.H.L.L.L.U.T.T.T.T.T.~.T.~.~.T.~.~.~./.~././././.(.(.(.(.(.(.|.^.^.(.`.^.`.(.(.`.`._.`.|.`.|.{.|.|.^.(.(.(.(._.(.(.(.^.^._.|.`.{._.|._._.}.|._.|.|.|.|.`._._._._.`.(.(._.(._.|._.|.|..X.X X.X.X|.'.|.|.|..X|.'. X|.}.}.}.}._.|.[.}._.|.^._.{.|.|.^._.[.(._.|.{.|.|.|._._.}.|.|._.|._.|._.|._.}.{._._.(.(.^./.(.(./.(./././.(./.(././././.~././.~./.~./.~.~.~.~.T.T.T.T.T.~.T.T.T.T.~.~.T.~.~.T.~.T./.~.~.~.(.~.^.^.[.~.^.~.T.~.T.Y.Y.P.P.Y.L.P.P.P.L.L.L.L.S.L.U.K.H.H.H.H.H.S.S.S.A.S.S.A.D.S.A.S.A.A.S.S.A.A.A.h.h.h.A.h.h.g.l.k.g.g.z.k.f.f.f.f.f.f.a.f.f.i.f.f.a.a.a.a.a.i.a.a.a.i.i.a.a.a.a.a.k.a.i.k.i.k.k.i.i.i.a.i.i.i.i.i.i.s.i.u.i.i.i.i.s.i.i.i.i.i.u.i.u.i.u.a.u.i.u.u.u.s.u.E a.i.E i.i.i.a.u.u.u.a.u.a.u.a.a.u.u.i.u.u.u.u.i.a.u.u.a.u.u.i.i.i.a.a.a.i.i.i.s.i.i.s.i.i.i.i.i.i.i.i.i.i.a.a.u.a.a.i.i.i.i.a.a.a.a.a.a.k.k.a.z.a.z.f.g.a.z.a.k.g.f.f.g.a.h.h.k.h.l.h.h.g.g.g.a.k.k.z.f.a.",
+"L H H P H H P H J J L L Z J Z L L H Z L H L L L J J P P J P P P P J P P L P L J Y J H H J J K Y J L P J P L P P L P P L P K H P P J P J P H P H J P H H J H H H Z Z H Z H J Z H H H Z L H Z L Z Z F Z Z Z Z Z Z Z C B Z C Z C Z B C C Z B C C A F C Z F C C B C C C C C C A C C B C C Z B C C N B B B C B Z B B C C C B C B C D A Z Z Z Z Z Z Z Z A Z D Z D C D D F B G Z Z Z Z Z Z F Z Z G Z Z Z Z G Z D D Z D L Z D Z D Z Z D D Z Z G b.D.S.H.H.H.H.G.A.H.S.H.H.G.H.H.H.L.L.H.S.U.L.S.H.L.L.U.L.L.L.L.L.L.L.L.L.U.L.U.P.P.U.P.T.T.P.Y.T.Y.P.T.T.U.T.U.U.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.[.T.!.~.~.T.~.~.T.~.~.~.T.~.(.~.~.(./././.~.(.(.(.(.(.(.(.(._.(.(.(.(.|.|.^.(._._._._._. X_.}.}.}.}.|._.|._. X.X.X.X.X@X.X.XzXxX.X.XdXdXzXzXzXzXzX@XdXzXdX.XdXdXdXdX.X.X.XzX.XzX.X XdX@X'..X.XdX.X.X.X.XdX.X.X.XdX.X.X'.dX X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X.X.X.XdX.X'..X.X.X.X|..X.X'.|..X X.X.X|..X.X.X|.|.|.|._.}.}.[.}.}.}.|.`.|. X|.|..X.X.X.XzX'.zX.XdXdXcXcXxXxXxXcXcXcXcXcXcXcXcXcXcXnXnXnXcXcXnXmXnXmXMXMXMXNXMXMXMXMXMXMXMXMXMXDXMXSXmXmXMXMXMXMXSXfXMXmXmXMXMXMXmXmXMXMXMXMXMXMXMXMXmXmXmXmXmXnXxXmXxXxXxXcXxXdXzX.XzXzX@X.X|..X|.`.|.|._.`.^.`.(.(.(.(././.~.R.T.~.I.T.T.Y.L.L.L.Y.L.L.H.L.L.L.H.H.S.H.G.S.S.S.S.A.A.A.h.A.h.h.f.z.h.g.g.g.g.l.k.k.k.k.g.h.g.f.f.k.i.z.i.f.a.a.a.a.a.i.i.i.i.u.i.i.u.i.u.i.u.u.u.u.u.u.u.u.u.s.i.p.s.s.i.i.i.a.a.a.a.a.i.i.f.i.i.i.i.i.i.u.i.u.u.u.u.u.u.s.t.u.u.r.p.t.u.t.t.p.t.u.t.u.t.t.u.t.r.r.t.r.r.t.t.t.t.t.t.t.E i.t.E i.t.E i.t.E t.t.u.r.t.t.t.u.t.u.u.u.u.u.u.u.u.u.u.u.u.i.a.a.i.i.a.a.a.i.a.z.d.z.z.k.k.z.h.h.h.g.h.h.h.A.A.A.G.G.G.G.L.L.L.L.U.T.U.T.Y.T.T.!.T.T.~.~.~.~.~.~./././.^.{.(.(.(.(.(.`._._.(.(._._._.|.|._.|.|.|._.{._.|.^.(.(.(.(.^.(.^.|.(._.`._.`._.(.(.`._._._._._.|.|.|.`.`.`.`.`.(.^.(.(.|.(.`.|.|.|.|.|..X|..X|.|.|.|. X|. X X X|.|.}.|._._._.{.^.(.|.^.(.(.^._.(.(.(.(.(.|.^.`.(._._.}._.}._.}.{._._.'._._._._._.).(.(.^./.(.(./.^.(././././././.!./././././.~.~./.~.~.~.T.T.~.T.~.~.T.~.T.T.~.T.T.T.T.T.T.~.~.T.~.[.~.~./.~.~./.~.~.~.T.~.T.T.T.T.U.L.R.K.L.L.U.L.L.K.L.L.L.L.H.G.H.H.H.S.H.H.H.H.A.S.H.G.Z.S.A.S.S.G.A.A.S.A.h.Z.j.h.A.l.A.z.h.h.h.z.d.z.h.g.k.k.f.f.f.f.i.d.a.a.a.a.a.a.a.a.a.i.a.x.E a.a.i.z.a.a.a.i.i.f.a.k.i.a.i.i.i.s.u.i.i.u.i.p.i.i.i.u.i.i.i.u.i.u.i.i.u.i.i.u.i.u.u.i.i.i.i.u.u.u.u.u.u.u.i.u.i.u.u.u.i.u.i.u.i.u.u.i.u.u.u.u.i.i.i.u.a.a.u.i.i.d.u.u.d.a.a.a.a.a.i.a.a.a.i.a.a.a.i.i.i.i.a.a.a.a.a.i.i.a.a.z.i.i.a.k.i.k.a.g.g.g.k.g.a.z.g.f.j.g.g.f.g.z.h.h.z.g.z.z.g.h.g.g.f.k.k.g.f.f.",
+"J H J H H H H H Z J L H J Z P S L Z H L P H L U J J J J K P P P P P P J L P L J H I J H L H J H J P P K J P P P P P J P P P P P J P P J P J H J J J J H H H H H H J H H H Z D D Z L H Z S Z Z Z Z Z D C Z Z F V Z C D C C C D C C C C C C C C C C A C C C Z C C Z C Z C C C C C C C B N Z B C C C B C B C B B Z C B C C C D C Z Z Z C Z Z Z Z Z F Z Z Z Z Z F Z Z Z Z Z Z D B Z Z G Z Z Z Z Z Z S Z Z L D D D D D D D D Z D D Z Z Z H G b.Z.G.L.L.L.H.G.H.H.S.S.G.H.H.S.H.H.H.H.H.S.U.L.S.L.L.S.L.L.L.L.L.L.S.L.L.L.L.U.P.P.U.U.P.T.T.T.T.T.T.T.P.T.U.Y.T.U.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.~.~.~.T.[.T.~.~.~.~.(.~./.(.(.(.(.(.(.(.(.(.[.(.{.^.(.(.^.^.|.^._._._._._._.}.}.}.}.|._.|.|..X.X.X.X XdXzX.X.X.X.XxXzXdXdX.X.X.XzXzXdXdXdXdXdX'.dX'.dX.XzX.XzX.XzX.X.X'.zXzXdX.XdX X@X.X.X'..X.X.X.X.X.X.XdX.X.X.XdX.X.X.X.X.X.X.X|.'..X.X.X.X.X.X.X.X.X'.|..X|.|..X|..X.X|.|.|..X|..X|.|.|.|._.|._.}.}.|.}.|.}.|.`. X_.|.|.|..X.X|.'..X@XdXxXdXdXcXxXxXcXxXxXxXxXcXcXcXcXcXcXcXxXxXnXcXnXnXnXMXMXMXmXMXMXMXMXMXMXSXMXMXMXMXMXMXMXMXSXMXMXMXmXNXmXdXMXMXMXMXSXMXMXMXMXMXMXMXMXmXmXmXnXMXxXnXmXxXnXnXxXxXzXzXxX.X.X.XdX.X.X.X|.|.|._._.`.`.(.(.(././././.~.~.T.T.T.T.T.U.U.U.L.L.L.L.L.H.Z.H.L.H.G.G.S.S.S.S.Z.A.A.A.D.A.l.k.h.h.h.k.g.g.g.z.k.k.k.k.g.a.f.f.k.z.i.i.d.i.a.a.a.a.a.a.i.i.i.i.r.i.i.u.u.u.u.u.u.u.u.u.u.u.p.i.p.u.i.i.s.u.i.a.a.a.a.a.a.a.i.a.i.i.i.i.i.p.i.u.u.u.u.u.t.t.u.u.u.s.t.t.t.u.t.t.u.t.u.t.u.t.t.t.t.r.r.t.r.t.t.t.t.t.t.u.u.t.t.u.t.t.t.t.t.t.t.t.E u.t.t.t.t.u.u.t.u.t.u.u.u.u.u.u.u.u.u.i.u.i.a.i.i.a.z.i.k.k.k.k.k.k.l.h.h.l.G.h.A.A.z.A.A.A.G.L.H.L.H.K.Y.U.U.T.U.T.Y.T.~.T.~.~.T.~././.~./././.^.(.(.(.(.(._.(._.^._._._.|._._._._.{.|._.|.|.|._._.|._.(.(.(.(.(.{.^.(._.(.(.(._./.|._._._._.|._._.|.|._.|.(._._._.^.^.(.|.^.`._. X|..X'. X|.|.|.|.|.}.|. X}.|.|.}.}._._._._.`.(.(.(.(.(.(.(.(._._.(.(.^.(.`.`.`.|._.}.}._.}._.}.|.|.`._._._._.(._.(.(.^.(./.(./././././.^.^./././././.^.~.~.~.~.T.~.(.T.T.~.T.~.T.T.T.T.T.~.T.T.~.T.~.~.~.T.~.~.~.T.!./.~././.~.~.~.~.~.T.~.T.T.U.Y.R.L.L.U.L.L.L.L.L.L.L.L.L.H.L.A.S.G.S.S.G.A.H.A.S.A.A.S.S.S.S.A.h.S.A.G.A.A.j.G.A.h.A.h.h.h.l.h.l.g.z.k.k.d.f.f.k.k.k.i.i.z.z.i.a.a.a.i.i.i.a.a.u.x.a.a.i.a.a.a.a.z.z.i.a.a.a.i.i.u.u.s.i.u.i.s.i.i.p.i.u.u.i.i.u.i.i.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.i.i.u.u.i.u.u.i.i.u.i.u.i.i.u.i.u.i.i.u.u.i.u.i.i.u.u.a.k.E u.a.i.a.a.a.i.a.a.a.a.a.a.a.a.f.a.a.a.a.a.a.a.a.a.a.a.a.s.i.a.a.d.i.i.z.i.k.k.k.k.z.a.z.k.a.z.f.g.g.g.f.g.g.g.g.h.k.g.z.g.g.g.g.k.g.g.f.k.f.f.f.",
+"H J H H P H H P L Z H J Z Z J Z L H L H H I H H J L L I P P H H P P J H P P J J H K U K L L J J J J J P P P L P L P I J P P P P P J J P P J P H P P H H P H H H H H F H H D D H H Z Z L L L Z Z Z Z D D Z Z D Z Z C D B Z F B C C C C C C C C Z C C C C C C Z C C C C C C C C C C N C C C N B Z B C B C B C Z B C C C C C B Z Z Z C C Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z G G Z Z Z G Z C L Z Z H Z Z D D D D Z D D Z D D D D D T Z.S.S.S.H.H.H.H.H.S.S.S.H.H.L.H.H.H.H.U.S.L.S.L.L.L.L.L.L.H.L.H.L.L.L.L.L.D.L.P.U.U.T.P.T.T.T.P.T.T.P.T.U.T.U.Y.T.T.T.U.P.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.~.~.P.T.~.T.~.^.T.[.~.(.~.~.(.(.(.(.(.(.(.(.XX(.(.[.(.(.(.(.|.^._.{._._. X}.{.}._.'.|.|._._._. X'..X.X.X'.dX.X.XxXxXzXzXdXdXxXzXzXzXdXzXdX.XdX@XdXzXzXxXdX.XzX.XzX@XfXdXdXdX.X'.xX@XdXdX.X.X'.dX'.@XdX'..X.X.X@XdX.X.X.X.X'..X.X.X.X.X.X.X X X.X X X.X.X.X.X.X.X.X.X|.|..X X'. X.X.X.X|. X|.|._.|.|._.}.}.}.}.}.}.|.|.|.|.|.|.|.|..X.XdX.XdXdXdXdXdXcXdXxXxXzXxXxXxXcXcXcXcXxXnXnXnXnXnXnXnXnXnXmXcXMXmXmXMXMXSXmXmXMXMXSXMXMXMXMXMXSXMXMXMXMXmXMXMXSXMXMXNXmXMXMXMXmXMXMXMXMXmXmXmXmXvXnXnXnXnXJXzXnXxXxXzXzXzX.XcX.X X.X.X|.|.|.|.|._.{.`.(.(.(././.E.(.~.T.^.T.T.T.T.T.U.L.L.P.S.L.H.L.L.H.G.H.D.S.S.G.S.z.A.A.A.A.z.h.l.h.h.h.g.g.g.g.z.a.k.k.k.d.i.f.f.f.i.a.a.a.a.a.i.i.a.i.i.i.i.i.u.i.a.u.i.u.u.u.u.u.t.s.t.u.u.u.u.u.u.i.i.i.i.i.u.u.i.a.s.i.a.a.a.a.a.i.i.p.u.u.u.u.u.u.u.u.u.t.s.u.t.u.r.t.p.t.t.u.t.u.t.u.t.u.t.t.t.r.t.r.r.r.t.t.t.i.t.t.u.u.t.t.u.u.t.u.t.t.t.t.E u.t.t.u.t.u.t.u.u.u.u.u.u.u.u.i.u.u.i.u.i.i.a.i.k.f.i.k.k.d.k.k.h.l.h.j.h.A.A.A.A.A.A.A.A.G.J.H.H.S.L.L.L.U.U.Y.U.T.T.T.T.T.T.T.~.~.~.~./.~./.(./.(.(.(.(._.(._._._._.|.|._._.|._.|.|._.|._._.}.}.}._._._.(.(.^.|.(.(.(.^.(.|.(.(.(.(._._._._.|._.{.|.|._.`.`.{._.^.^.|.{.^.|._.|.|.|..X|.|.'.|.|.|._.}.}.}.}.}.}.}.}._.^.`.(.^.(.(.^._.(.(./.(.(.(.(.(.`.^.`.(._.|._._.}._.}.}.}.|._.(.`._._.(.(././.(././././././././././.^././././.^.!.~.~.~.T.~.~.T./.T./.~.T.T.T.T.T.T.T.T.~.~.~.T.~.~.~.T.~.~.~.~.~.~.~.^.~.{.U.T.T.~.T.T.Y.U.U.L.L.L.U.U.L.L.L.L.L.L.A.H.H.H.H.H.H.G.S.S.S.S.A.A.S.A.S.S.S.H.S.A.G.A.A.A.A.A.A.h.h.h.h.l.l.h.l.h.g.h.k.g.f.f.g.f.f.f.d.i.i.k.i.a.a.a.a.a.a.a.i.a.d.i.a.a.a.a.z.i.z.i.i.a.a.a.a.a.s.i.i.i.u.i.u.i.u.u.i.u.i.t.i.u.i.u.u.u.i.u.u.u.i.u.u.i.u.i.u.u.u.u.p.u.u.u.u.u.u.u.u.u.i.u.u.i.u.i.u.i.u.i.u.u.u.E i.i.E u.i.i.i.a.a.a.a.i.d.a.a.z.i.z.a.i.i.a.a.i.a.a.k.d.a.a.a.a.a.k.i.d.a.f.i.f.f.k.k.a.z.k.z.a.g.z.a.f.g.g.f.g.g.g.g.g.k.h.g.l.l.l.g.g.l.g.g.g.f.f.k.f.f.",
+"J H J J H H H H H J H Z J J L L L L H L J H J H P L P K J P P P P P J I L P J J H H H I L H J J L J J L L P K P H I J P J L P L H J P P L L L L Z L Y P H H H H Z H H H H H D D Z H H Z Z Z Z L Z F Z D Z D B Z Z Z C Z C Z Z B D A C Z Z C C C C C Z C C C C Z C C Z C C C A C C C C C N C N C C B C B B B B C B C C C C Z C C D B Z Z B D B D Z Z Z Z Z F Z Z C D Z Z Z Z Z Z Z Z Z Z Z Z Z Z G Z L Z Z Z Z D H D D Z D Z D Z H Z Z D G Z.A.D.L.D.H.G.H.A.L.H.H.H.H.H.H.H.H.H.S.U.U.S.L.L.H.L.G.L.L.L.L.L.S.H.L.L.L.U.L.P.P.P.P.T.P.Y.T.P.P.T.Y.U.T.U.U.U.I.U.T.P.T.U.T.T.T.T.T.T.T.T.T.T.T.T.~.~.T.T.T.T.T.^.~.T.~.~.T.~.~.T.~.~.(.~.~.(.(.(.[.(._.{._.(.(.(.(.^.(.(.(._._._._._.}.}.}.|.}.}._.|.|.'.'..X.X.X.XdXdX.X.X.X.X.XzXzXzXdXzXzXzXzXzXzXzXzXzXzXzXzXzXdX.XvX.X.XdXdXdXdXzX.XzX X.XdXdX.X.XdX.XdX'. X.XdX@XcXdX.X.X.X.X.XdX.X@X.X.X.X'.'..XdX.X@X.X.X.X.X.X.X.X|..X'.|.|.|.|.|.|.|.|.|.|.|._.}.|._.}.}.}.}.}.|.}.|.|.|.|.|. X|. X X.X.X.X'.dXdXxXxXdXcXzXvXzXzXxXxXcXcXcXcXcXdXnXnXnXnXnXnXnXnXnXmXMXmXmXDXMXfXNXmXMXMXMXMXMXMXMXMXMXMXMXMXSXmXMXSXfXMXMXMXmXMXMXMXNXMXMXmXmXmXmXmXmXnXnXnXnXxXxXcXcXxXxXzXzXcX.X.XzX.X'..X X|.|.|._.`.`.(.(.(.(././.~./.T.~.T.T.T.T.U.U.U.U.L.L.L.P.L.H.H.H.H.G.G.S.A.G.A.A.A.A.g.A.h.h.l.l.g.g.g.f.f.k.a.a.k.k.k.a.z.f.f.f.g.a.a.a.a.a.a.a.i.a.i.i.s.u.u.i.u.u.u.u.u.u.u.r.u.u.u.u.u.t.p.u.u.i.u.i.i.i.s.i.i.i.i.i.a.i.a.i.a.i.i.i.i.u.u.u.i.t.u.u.u.t.t.t.t.t.u.r.u.t.t.u.t.t.u.t.u.t.t.u.t.r.r.r.t.r.t.t.t.t.r.p.u.E u.t.E u.E u.t.t.t.t.E x.t.t.t.u.u.i.E u.u.u.u.u.u.u.u.i.i.a.s.i.i.i.i.i.k.i.a.d.k.k.k.k.h.z.S.h.g.A.A.A.A.A.S.A.A.S.H.H.H.H.L.H.L.I.U.U.U.T.T.Y.T.~.~.T.T.~.T./././.(.(./.(.(.(./.(.(._.`._.|._._.|.|.|.|._.|.|.|.|.}.}.}.[._.(.|._.|.(.|.[.(.(.(.(.|.(.`.(.^._.^._.[.(.{.|._._.^.(.`._.|.`.(.|.`.`.|._.|.|.|.|.|.|.|.|.|.|.}.}.}.}.}.}.}.}.`.`.(.(.(.(.(.(.(.(.(.(./.(.(.(.(.(.(.`._._.`.^._._.}._.}.}._._._._.(._.(.^././././././.~././././.!./.E./././.!.~.[.~.~.T.~.T.~.T.T.T.T.T.T.T.T.T.T.~.T.T.T.T.~.T.~.T.[.T.[.~.[.T.T.~.(.E.XXT.XX~.~.T.T.U.Y.T.U.U.U.L.L.L.U.K.L.U.L.L.L.L.H.H.H.Z.H.S.S.S.S.A.G.A.S.S.A.S.S.A.S.A.A.A.G.G.A.A.A.A.A.A.h.l.h.l.l.h.h.h.k.g.g.f.f.f.f.k.i.z.i.i.a.a.a.a.a.i.a.a.i.a.a.a.a.a.a.a.a.d.a.a.a.a.a.i.i.a.u.i.u.u.i.i.s.s.u.i.u.i.u.u.u.u.u.u.u.i.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.p.t.u.u.u.u.u.u.u.u.u.u.i.u.i.u.i.u.i.a.a.a.i.u.x.a.x.i.i.a.i.a.a.d.x.a.a.a.i.k.a.k.i.a.a.f.i.k.i.i.f.a.z.a.a.z.i.k.z.i.f.f.f.f.z.k.h.k.g.z.g.g.g.k.k.g.g.g.g.g.g.g.g.l.l.z.g.l.g.z.k.f.g.g.g.k.f.d.k.",
+"J J J L H H H H H J Z H Z H H L H K L L H H P J L J J H H I P P P J P J K P L P L P J H J J J L Y K J J L P J J J P J K L J P P P L K L P J H J L L H H L Z H H L Z H D H Z Z H S Z L L H Z Z H F D Z D Z Z Z Z Z Z Z C C C C Z C C C C C C C C A C B C B C C F C C Z C C C C C C C C N N C N B B C C B C B C B C B C C D Z C D D C Z A C Z C D A F Z Z Z Z Z Z D Z Z Z Z C H Z Z Z Z G Z Z Z D Z Z Z Z G Z D D D D D Z D Z Z H Z H D D D Z.L.H.H.H.H.H.S.H.H.H.H.H.H.H.H.H.H.D.H.G.L.L.L.Z.L.L.U.L.L.L.L.G.L.L.S.L.S.L.L.P.U.U.Y.P.P.P.P.T.T.U.U.Y.I.I.T.I.T.I.P.T.P.T.T.T.T.T.T.P.T.P.T.U.T.T.Y.Y.T.T.Y.T.T.T.T.T.T.T././.~.T.~.~.^.(./.(.(.(.}.(.(.(.(.(.(.(.(.(.(.(.^.|._._._._._. X_.|. X}.|.|.|.|. X.X'.dX.X.XzX.XzXzXxXzXdXxXcXcXzXzXzXdXzXzXzXzXzXzXzXzXzXzXdXxXxXdXdXzXdXzXdXdXdXdXdX.X'.dXdXdXdX.XdXdX.X'.zX.X X@X.X.X.XdX.XdX XdX X.X'..X.X@X.X.X.XdX@X.X.X.X|..X_.'.|.|.|.|.|. X|. X|.'._._.}.}._.}.|.}.}.}.}.}.|.|. X|.|.|. X|..X.X X.XdXdX@XxXcXdXmXdXxXxXxXxXxXxXcXxXcXxXxXcXcXcXnXnXnXnXnXMXnXmXMXmXNXMXmXmXMXMXMXMXDXMXDXMXMXDXSXMXMXMXMXMXmXmXMXMXMXMXMXMXSXfXmXmXmXcXmXmXmXfXnXnXnXcXmXcXdXcXxXzXdXdXxXdX.X.XdX.X'. X|.`._._.^.^.(.(././.)./.~.~.T.~.T.T.T.T.P.T.P.P.L.L.S.L.H.H.H.H.S.G.S.A.A.A.A.A.h.A.A.j.h.l.k.h.k.z.g.g.k.f.f.f.k.k.a.k.i.i.z.i.i.a.i.a.i.a.i.i.i.a.i.i.i.u.u.u.i.u.t.i.u.u.u.u.t.t.u.t.p.u.t.u.u.i.u.u.i.i.i.u.i.i.i.i.i.a.a.a.s.s.u.i.u.u.u.u.u.u.u.t.t.u.t.t.u.t.t.u.t.u.t.t.u.t.t.t.t.t.r.t.t.t.r.t.r.r.t.t.p.u.t.u.t.u.t.t.t.p.t.u.t.t.t.t.E i.t.t.u.u.u.t.u.u.p.t.u.p.u.u.i.u.i.u.a.i.a.a.a.a.a.z.i.f.f.f.k.k.h.h.A.A.A.A.A.A.A.A.A.H.H.S.H.H.H.L.L.L.U.L.L.Y.U.P.T.Y.T.T.T.T.~.~.~.!./././.(.(.(.(.(.(.(.{.|.|.|.`.|.`.|.|.|.|.|.|.|.|.|.|._._.|.(.(.|.(.{.{.(./.(.(.(.(.(.(.(.(.^.`.^.`.(.|.^._.(.(.|.|._._._.|.|.[.|.|._._.|.|.|.|.|.|._._.|._._.`.{.|.}.}._.}.`.`.^.(.^.).(.(.(.{.(./.~./.(./.(.(.(.(.^.`.(.`.^._._.|.`.`.(.`.^.(.(.(././.(./.~./.~.~.(.~.~./.~.~.~.~.~.~.~.~.~.~.T.~.T.[.T.T.T.T.T.T.T.~.T.T.T.T.~.T.T.T.T.~.~.~.T.~.~.T.~.T.^.~.T.T.~.~.~.~.T.~.T.T.T.T.L.L.L.Y.K.L.U.L.U.L.L.L.L.L.H.L.H.H.G.H.h.H.S.S.A.A.Z.A.G.S.S.S.S.S.G.H.A.A.A.H.A.A.h.A.h.S.S.A.h.h.h.h.h.h.g.g.d.g.f.f.f.i.i.f.a.i.a.a.i.a.a.a.i.a.a.a.a.a.a.a.a.a.k.k.a.a.a.a.i.i.s.i.u.i.s.u.s.i.i.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.i.u.u.u.i.u.u.u.u.t.p.p.u.u.u.u.u.u.u.u.u.i.a.a.a.u.i.u.i.u.i.u.i.a.a.u.u.i.i.i.a.a.a.a.a.z.z.i.z.f.a.f.i.a.k.a.f.i.f.f.f.k.a.k.d.i.k.a.z.f.f.f.f.f.f.k.g.z.k.g.k.a.a.z.z.g.g.g.g.h.h.h.k.D.k.k.D.z.g.g.g.f.f.z.f.a.k.k.f.",
+"H H H L H P H H H J H J P H L J J L L L J J J P J J J J I H L P P K P P J P P L L L H J J J L L Z L H H L J J J J P P P L I K L L L P J J J H J H H H H H J H H L H H H L Z D Z L Z Z L Z Z H Z Z D D Z Z Z Z Z D B C Z Z Z C C B Z C C C C C C C C Z C C C Z C A C C C C C C C N C N Z Z B B A B B B C B C B C C C C C C C C C B Z C Z Z C Z C B Z C Z Z Z Z C Z Z Z Z Z Z G Z D Z Z Z D C F C Z Z Z Z Z Z Z H D D D D D Z D D Z D D Z Z T Z.A.H.H.H.H.S.H.H.H.H.H.H.H.G.G.H.H.H.L.L.H.U.S.L.L.L.L.L.L.L.L.H.L.U.L.U.L.L.L.L.L.P.Y.P.Y.P.P.P.Y.I.I.Y.Y.U.U.U.I.T.P.P.P.P.P.U.T.T.U.T.P.T.T.U.T.T.T.U.T.T.T.T.T.T.~.T.~.T.T.~.~.~.!.~.(.(./.(./.(.(.(.(.(./.^./.(.(.(.(.{._.|._. X_._._.|._.}.}._.|.|.|..X.XdX X@X.X.X.X.X.X.XzXzXzXdXdXcXzXzXdXdXzXcXzXzXzXxXzXzXzXdXdXdXdXxXdXzXzXxXdXdXdXdXzXdX.XdX.XdXdXzX'..XzX.X.XdX XdX.X.X.X.XdX.X.X.X.X'..X.X.X.XdX.X X X.X.X.X.X.X.X|.|.|.|._.`.|.|.}.|._.|.|.}.}.}.}.|.}.}.}.}.|._.}.|.|.|.'.|..X X.XdX@X.XdX'.dXdXdXdXdXdXcXxXzXzXxXcXxXxXcXnXcXmXcXfXnXnXmXnXnXnXmXmXMXmXMXMXSXMXmXMXMXmXMXmXMXMXmXMXMXMXMXMXMXmXSXMXMXMXMXMXMXMXMXMXmXmXmXmXmXcXfXnXcXnXnXcXcXnXzXxXzXxXdXdXdXzX.X.X.X.X.X|.|.|._.|._.^.(.(./.^.!.~.~.~.~.T.T.T.T.P.P.L.L.L.L.U.D.H.H.H.G.S.A.H.S.A.A.A.g.A.h.h.h.k.h.l.k.k.g.k.g.f.d.f.f.a.a.a.a.a.i.a.a.a.a.a.i.i.i.i.i.i.i.i.u.u.i.u.u.u.u.i.r.u.u.s.t.u.u.u.t.u.t.u.u.u.t.u.u.u.u.i.i.i.i.i.i.i.i.i.i.i.s.p.u.i.u.u.u.t.u.u.t.u.t.t.u.t.p.p.u.u.t.t.u.t.t.u.t.t.p.p.t.t.t.r.t.t.t.t.t.t.t.t.t.u.t.t.t.t.t.t.t.t.t.t.u.t.t.t.a.t.t.t.u.t.u.u.u.u.u.u.u.u.u.i.i.a.i.a.a.a.a.i.a.k.f.h.f.h.h.g.A.A.A.A.g.S.A.A.S.A.G.H.S.H.H.H.H.S.L.L.U.L.Y.T.U.T.T.T.~.~.~.T.T.~.~.~././.(.(.(.(.^.`.`._.|._.|.`.`.|.`.|.|._.|.|.|.|.|._.|._._.`.|.^._.(.(.(.(.(.(.(._.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(._.^._.{._.}._._.|.|.|.|.|._.`._.|._.`._.`.^.`.^.}._.|.^.(.`.^.^.(.(.!.).(.~.~./.~./././.(.(.(.(.(.^.`.`.(._.{.^.(.`.(.(.^.^.(.(.(.^./.~./.~.~.!.~.~./.~.~.~.~.~.T./.~.T.T.~.~.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.T.~.T.T.~.~.~.~.~.~.~.~.~.(.~.~.T.T.~.~.T.T.T.T.U.U.U.L.L.L.L.L.L.L.L.L.L.S.L.H.H.G.G.H.H.S.H.S.S.H.A.G.Z.S.A.S.A.S.S.A.H.H.H.H.h.G.A.A.A.l.h.z.A.l.h.A.h.h.k.g.g.z.g.k.f.k.i.k.f.a.i.a.i.i.a.i.a.a.i.a.d.a.a.a.a.a.a.i.i.a.a.a.a.a.u.i.i.s.i.i.i.u.i.a.i.u.i.u.u.t.u.u.u.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.p.u.r.u.u.u.u.a.u.u.u.u.u.u.u.E i.u.i.i.i.u.u.i.u.E x.a.i.a.a.a.a.a.a.a.i.i.z.i.a.g.i.k.k.i.k.i.f.f.i.k.d.k.k.k.z.a.k.a.f.f.k.k.k.g.g.k.g.g.k.g.g.g.g.g.g.g.g.f.f.k.h.h.k.g.k.k.g.g.k.g.g.g.f.g.z.f.f.k.",
+"J J H L L L L H H H H H L H L L H H L L J J P J J J J J J J H K L L J L L J P P H L U K H L L L K L J J L U H Z P H J L P L J J J P P J L L J D Z P P H H H H H Z Z L H H H L D Z H H H H Z Z L Z D D D D D Z Z Z Z Z C Z B Z C F B Z C C C C u C C C C C C C C Z C C C Z C C C C B N C N B C N B B B B C B C B B C C C C C C D Z C C C B C C Z A B C Z B Z B Z Z Z Z G Z Z G D Z Z Z Z D D Z Z Z Z Z C H Z Z Z D D D D Z D Z Z S Z Z Z D T Z.S.H.H.G.S.S.H.F.G.H.H.S.H.H.H.G.G.P.A.L.L.L.L.L.H.S.L.L.H.L.D.L.L.L.S.D.U.L.L.L.U.P.P.P.Y.P.Y.P.P.I.T.U.U.Y.I.U.U.P.P.P.P.U.U.T.P.P.T.P.T.T.P.T.P.U.Y.T.T.T.U.T.U.T.T.T.T.T.~.T.T.~.~.^.~.(.(./.^.[.^.^.(./.(./.(.(.(.(.(._._._._._. X_. X|.{.|.|. X|. X|.|..X.X@XdXdX.XzX.XzXzXzXdXdXdXdXcXzXxXcXcXdXcXdXcXzXxXzXzXzXzXzXzXxXcXdXzXzXdXxXxXdXdXxXdXdXdXdXzX.XdXdX'..X XdXdXdXdX.XdX.X@X.XzX'..XzX@XdX.X.X.X.X.XdXdX.X.X.X.X|.|. X|.|.|.|._.|.}.}.|._.`.(.^._.}.}.}.}._.|.}.}.|.|.|. X|.|.|. X|..X.X.XdX'.dXdXdXdXdXxXxXdXzXxXxXxXcXcXcXxXxXxXcXcXcXmXnXdXnXmXMXnXMXMXMXMXMXMXMXZXMXDXmXMXNXfXMXSXMXMXMXMXSXmXMXMXMXmXmXMXMXfXNXMXmXmXNXmXmXcXcXcXcXnXcXcXcXcXcXzXzXzXzXdXzXdXdX.X.X.X.X.X'.|.|.(._._.(.(.(./.~.~.~.~.T.T.T.T.T.T.P.P.L.L.S.U.L.S.H.H.H.H.G.z.A.h.z.A.h.j.g.h.h.h.h.h.l.k.d.z.k.k.d.f.d.i.a.k.a.d.a.a.a.a.i.a.i.i.i.i.i.i.i.i.u.i.u.s.s.u.u.u.u.u.u.u.u.u.t.t.u.t.t.u.u.u.u.u.u.s.u.u.u.i.i.i.i.i.i.i.i.u.a.i.u.i.u.u.u.u.u.u.t.u.s.t.u.t.u.t.t.p.t.u.u.t.u.t.u.t.p.t.t.t.t.t.r.r.t.r.t.t.t.t.u.t.E i.E t.t.u.u.t.u.t.t.u.t.u.t.E t.t.t.u.t.u.u.u.i.u.i.p.i.i.i.i.i.a.a.a.a.k.k.k.k.k.f.z.k.h.h.h.h.A.z.H.S.A.S.S.H.S.L.S.H.S.L.H.U.L.L.L.L.L.U.T.T.Y.T.~.T.T.~.T.~.Y.~././.^./.(.(.(.(.[.|._.|.'.|.`.|..X|.|.|.|.|. X'.|.|.|.|.|.|.|.|._.|.(.`.(.(.(.(.(.(.(.(.(.(.(.(./.^.^.(.(.{.(.|.(.(.|.(._._._.|._.|.[.{._.|.|.|.{.|._._._.(.|.|.`.`.`.^.`.(.(.(./.!.(.~.~.~.~.^.~.~.~./.^.(.(.(.(.(.(.(.(.^.|.^.`.^.(.(.^.(.(.(.(.E.^.~.~.!.T.~.~.~.~.~.~.~.~.~.~.T.T.~.T.T.T.~.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.~.T.T.^.T.~.~.T.T.~.~.T.T.~.~.~.T.~.~.T.T.~.T.T.T.U.Y.U.U.U.L.L.L.K.L.L.L.L.S.S.U.L.H.H.A.H.A.H.G.S.S.S.S.S.S.A.S.A.S.S.A.H.H.S.H.A.A.A.A.A.A.A.z.h.A.h.S.z.z.h.h.h.k.g.g.d.f.f.f.f.f.z.i.i.k.E a.i.a.i.a.a.a.u.u.a.i.a.i.a.i.a.i.i.a.i.i.i.i.u.i.i.s.i.s.s.u.i.i.u.u.u.u.p.u.u.u.u.u.u.t.u.t.u.t.i.u.u.u.u.u.u.u.u.t.u.u.u.r.u.u.E u.u.u.u.i.u.u.i.u.u.E a.a.u.i.a.a.u.u.a.i.i.i.d.i.a.d.a.i.k.i.i.i.a.a.i.g.a.a.k.f.d.f.f.k.k.d.k.z.a.k.k.f.k.k.k.k.g.h.k.g.k.k.k.k.k.k.k.g.g.g.z.h.h.h.g.g.g.g.z.g.g.g.g.g.f.k.k.f.f.k.f.",
+"H H L L Z H L L H J H J H H H H P U H H J P P H P J J H J J L H P P J J J J J J J F J H J J H J H P J J J K L P J J J J J P J J J J P J L K H P L L H H H G F U L J D Z H H G D H Z H H S Z H Z D D D D D Z Z Z D C Z Z D C C C C Z C C C B N F C C C C C D D A C C C A C C C C B C N C A C N N C B B B B C B C B C C C Z Z C C A Z C Z C D Z B C D D C D Z D Z Z Z D B D Z Z D Z G Z Z C Z Z D C Z Z Z Z Z Z Z D D Z Z G D D G Z Z Z H H I Z.G.H.H.H.H.H.H.H.D.H.H.H.H.S.D.L.L.S.L.U.A.H.L.L.L.U.L.L.D.L.L.S.L.L.U.L.L.S.L.L.L.P.P.P.P.P.P.Y.U.I.I.U.T.U.T.T.T.T.P.P.Y.U.T.P.P.T.P.P.P.P.P.P.P.U.U.U.Y.T.T.U.T.T.T.T.~.T.T.T.~.~.~.~.^.[.E././.^.~./././.(./.(.(.(.(.(.^._._._._._._._.|._.|.|.|.|.|.|..X.X.X.X.X.XzX.XzX.XzX.XxXdXxXcXcXdXdXdXcXxXcXxXxXxXxXxXxXxXcXcXxXzXxXcXcXdXcXdXdXxXdXdXdXzX@XzXzXzXzX.X.XzX.XdXdXdXdX X.X.X'.xX.X.X.X.X'.zX.XcX'..XdXdX.XdX.X.X.X.X'.|. X_.|._.|._.}.}._.|.`.^.|.|.[.}.}._.|._._. X|.|.|._.|. X|..X|..X.X.X.XdX XdX'.dXdXdXdXdXxXzXxXxXcXxXxXcXcXcXnXnXcXnXnXnXnXnXnXmXmXMXMXMXMXSXMXMXMXnXDXmXmXDXMXMXMXMXSXMXMXMXMXMXMXSXMXMXMXSXmXMXMXmXmXmXmXmXcXmXcXnXcXcXcXcXcXnXxXzXzXzXdXzXzX.X@X.X.X.X|.|.`.|._.(._.(./.~.!.(.T.~.T.T.T.T.P.Y.P.P.L.U.L.L.S.L.H.H.A.z.H.A.A.A.S.h.h.S.g.g.h.g.k.h.k.k.k.k.k.f.f.f.f.k.k.a.d.a.a.a.a.i.a.i.i.i.i.i.i.u.u.u.i.u.i.u.i.i.u.u.u.u.u.t.t.u.t.u.t.s.u.t.u.u.u.u.u.u.u.a.a.u.a.i.i.s.i.a.a.i.s.u.i.s.u.u.u.u.u.u.u.t.t.u.t.u.t.u.t.t.u.t.u.t.i.E t.t.t.t.t.t.r.r.t.t.t.t.t.t.p.p.t.t.u.u.u.u.t.t.t.t.t.t.u.E E i.t.u.t.u.t.u.u.t.u.u.u.i.i.i.u.s.a.i.i.a.a.a.f.a.a.k.f.k.k.k.h.h.h.H.h.G.H.S.S.S.H.A.S.S.S.H.H.H.H.L.S.S.L.L.I.Y.U.U.T.T.T.T.T.~.T.T.R./././././.(.(.(.(._.{.|.|.|.|.|..X|.|.|..X|.|. X X|. X|.|.|.'.`._.|.(.|.|._.(.^.{.(.|.(.(.(.(.(.(./.(.{.^.(.(./.(.^.|.^.^._._._.|._.|.|.|.|.|._.|._.|.|._._._.|.^.(.(.^.^.^.^.(.(.(.(./.(.(.~.~.[.~.!.~.!.E.[./.(.^.(.(.(.(.(.(.(.^.^.`.(.!.^.^.^.[.E.(.~.T.~.Y.~.~.T.~.~.~.~.T.].T.~.!.(.T.T.^.T.T.T.T.T.[.T.T.T.T.T.T.T.T.[.T.T.T.T.T.T.T.T.T.T.~.T.~.T.~.~.T.~.~.T.T.~.~.T.T.T.T.T.Y.Y.Y.L.U.U.L.L.L.L.F.L.L.L.D.L.H.H.S.S.H.H.S.S.H.A.A.A.A.Z.A.S.A.A.H.H.H.h.A.H.H.A.A.A.A.A.A.A.A.D.h.A.A.A.h.h.g.g.g.g.k.f.f.i.i.i.i.d.d.x.E x.a.i.a.a.a.a.a.i.a.i.a.a.i.i.i.i.i.i.u.i.i.i.s.i.i.a.i.i.i.i.u.i.u.u.u.t.t.u.u.u.u.u.u.u.u.u.u.t.u.u.t.u.u.t.u.t.u.t.t.t.t.t.t.u.u.u.u.u.a.E i.a.u.u.a.u.u.u.u.a.E a.i.i.i.i.i.i.a.a.a.d.z.i.k.f.f.k.z.g.a.g.i.g.f.f.f.d.k.k.k.k.k.k.k.k.h.g.k.k.g.g.k.h.k.k.g.k.g.k.k.g.j.g.g.k.h.h.k.h.g.g.l.g.d.l.z.g.g.g.f.k.f.f.f.k.",
+"J H J H L J H H H H H H L L H P H J J J J J J L J J P P P H J H L J J J H P J J J J H H H P H Z H P H H P H J H J P H I P L P P J J J L L L D D L J H H H H H H Z H Z H H Z L H H Z H H J Z Z L D D D D Z D Z Z B Z Z Z C Z A Z C C C C C C C C C B C C C C C C C C C C C C C A B Z B B B B A C N C N C B B C C C C C C Z C C B C C Z F C C F C C B C Z C Z B Z Z B D C D F D C Z Z F D D C B F Z Z D G Z D D D D D H Z G Z H F H D Z D D H T T.A.H.H.A.H.H.H.H.H.L.H.H.H.H.H.D.L.S.U.S.L.L.L.L.L.L.L.S.S.L.L.L.L.G.L.H.K.H.L.L.L.L.P.U.U.L.Y.U.P.T.Y.U.P.U.P.P.P.P.P.L.P.P.P.P.U.P.U.U.U.L.Y.T.Y.P.P.Y.P.Y.Y.U.T.T.U.T.T.T.T.T.T.T.~.!.~.^././.~./././.!./.(././.{.(.(.(.(.(.|.|.`.`._.|.|.|.|.|.'.|..X|..X.X'..XzX.XzX.XdXzXzXzXzXzXzXxXzXxXxXcXdXxXxXxXxXxXxXxXxXcXcXcXxXxXxXcXxX@XxXdXdXcXdXzXzXzXzXzXzXdXdXdXdXdX#XdXdXdXdXzX.X.XzXdXdXdX'.zX.X'.xX.XdX@X.X.X.X.X.X.X|.|..X|.|. X|._.}.}.}.(._.{.(.`.`.(.(.`.`._.`._.|.|.}.|.|.|.|.|.'..X|..X.X.X.XdX.X'.@XdXdXzXzXzXcXcXvXcXvXxXcXmXnXnXnXcXnXxXnXmXmXmXmXmXMXMXMXSXMXMXMXMXMXSXMXmXMXMXMXMXmXMXMXSXMXmXMXMXMXSXMXMXMXMXMXmXSXmXmXmXmXmXdXcXcXcXxXxXxXdXdXzXdXdXxX.XdXdX.XdX X.X X X}.}.}._.^.(./././.~.~.~.~.T.Y.U.T.P.U.P.P.U.L.S.S.H.U.H.D.G.A.A.A.A.h.A.h.h.g.k.h.z.k.z.g.k.f.f.f.k.d.k.a.a.k.a.a.a.a.a.a.a.a.i.a.u.i.i.u.i.u.u.u.i.u.a.u.a.a.u.u.i.u.u.u.u.u.u.t.u.t.t.u.t.t.u.u.u.i.u.a.i.i.i.i.i.a.i.i.s.a.i.i.i.u.i.u.u.u.p.u.t.u.t.u.u.t.u.t.u.u.t.u.u.t.u.t.u.t.E t.E t.a.E t.t.r.t.t.u.t.t.t.u.t.u.t.t.t.u.t.u.u.t.s.t.t.t.t.t.t.u.u.t.u.u.u.u.u.i.a.u.i.i.a.a.a.a.a.a.d.a.k.k.f.z.g.g.A.g.S.h.S.S.S.G.S.H.H.H.H.S.Y.H.L.L.S.Z.U.S.U.L.L.Y.P.U.T.T.T.T.T.T.^./.R./.E.[././.^.(.(.(.|._._._.|.|.|..X|.'.|..X|. X|.|.|..X|.@X`.|.|.|.`.|.`.`.(.^.^.(.(.(.(.^./.^.(.(./.(.(.(.(.(.(./.(.(.(.`.|.`._._._.|._._._. X_._._._._._._._.^.(.(.(.(.(.(.(._.(./.(.(././.~.~.~.T.~.~.~.~.(.[.(.[.(.^./.(.(.(.(.(.(.(.^././././././.T.~.~.T.T.[.T.~.T.~.~.~.T.T.~.T.~.T.T.T.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.~.T.~.T.T.T.T.~.T.~.T.~.T.~.T.~.~.~.~.~.T.~.~.T.T.T.T.T.U.P.P.Y.P.U.L.U.L.L.L.L.L.H.H.H.H.H.G.G.H.S.S.S.S.S.S.A.S.A.A.G.H.A.G.A.H.H.H.J.S.A.G.A.S.D.h.A.A.A.A.g.S.A.l.l.l.k.l.g.g.k.k.d.z.z.a.a.a.d.k.a.a.a.d.a.i.a.a.a.i.a.a.i.a.i.i.i.i.i.i.i.i.i.s.i.i.i.i.i.i.i.u.i.u.u.u.u.u.t.u.p.p.u.t.t.u.t.u.u.t.a.t.u.t.u.t.u.t.u.t.t.u.u.u.u.i.u.t.u.u.u.a.u.a.E u.a.a.u.u.i.i.u.u.a.a.i.i.i.i.a.a.i.f.i.d.i.z.i.i.k.i.f.f.f.f.f.k.g.f.k.k.k.d.k.k.g.g.g.g.k.g.k.h.k.k.k.g.g.k.k.g.g.g.d.g.h.h.z.z.z.h.Z.g.l.D.g.g.g.g.k.f.k.f.k.k.d.f.",
+"H H P H H L H H L P P H L L L Z H H I J H J J J J J P L H J K U J J H H J J J G J J H J H H J U H H L H H H J J J J J J P P P J J L J L L L H J H H H H H H H H H H H H H Z Z H Z H Z H Z H S Z D Z G D D Z Z Z G C Z C C C C C Z C C C B A A C C A C C C B C C C C C C C C C C B C B B N Z m B N B C N Z B C C C C C C C Z C Z D C C B C D C C Z D C C Z C D Z G C B D D D D G G Z H Z C D D D Z Z Z C Z D D D D D Z Z H Z Z Z Z Z D F F H T Z.H.H.S.K.A.H.H.H.H.H.H.H.H.H.H.H.S.U.L.L.H.L.L.L.L.L.L.L.U.U.S.U.G.L.L.S.L.L.L.L.P.L.L.P.U.Y.P.L.P.P.U.T.P.P.P.P.P.P.Y.P.U.P.T.U.K.U.U.L.Y.P.P.P.T.Y.P.P.P.P.U.L.U.U.T.U.T.T.T.~.T.~.~.(.~.(././././././././././.(.^.(.(.^.(.^.|.(._.^.|._.|.|.|.|.|. X'.|..X.X.X.XdX.XzXzXzXzX.XzXzXzXzXxXxXzXxXcXxXcXxXcXcXxXxXcXxXcXcXcXxXxXxXcXdXdXdXdXxXzXzXdXzXzXzXzXzXzXdXdXdXdXdXdXdXdXdXzX.X.XzX.XdX.X.X.XzXxX.X.XxXdX.XdX.X.X.X.X.X|.|.|.|.{.|.}.}.{._.|.[.^.|.(.(.(.(.`.(._._.|.|.|.}.|.|.|.|.|..X|..X.X.X.X.X.X.XdX.X.XdXzXdXcXcXcXzXxXzXcXxXdXnXcXcXnXnXnXnXmXmXvXMXmXMXmXSXMXMXMXMXMXMXMXMXZXMXZXmXMXZXSXMXMXMXMXmXMXMXmXMXSXMXMXmXmXmXMXmXmXmXmXmXnXvXJXxXdXvXcXzXzXxXdXdXdXdXdXdX.X.X'.|.|.}._.}.`.(././././.~.~.T.~.T.T.T.Y.U.U.P.P.L.U.L.L.H.S.H.G.G.A.A.A.A.h.h.h.h.h.z.k.k.k.k.k.f.f.k.d.f.i.a.a.a.a.a.a.a.a.a.a.i.i.i.i.i.i.u.i.u.i.i.i.u.i.u.a.u.u.u.u.u.u.t.t.u.t.u.u.t.u.u.u.u.i.u.u.u.u.u.u.u.i.i.a.i.i.i.i.i.t.u.i.i.s.u.u.u.u.t.u.u.p.t.u.t.u.u.u.u.t.u.r.u.u.t.u.t.t.i.u.i.t.r.t.t.t.t.t.t.t.t.u.u.t.t.p.t.u.u.t.t.u.p.u.t.u.t.p.t.p.u.t.t.p.u.u.p.i.a.i.a.a.a.a.a.a.f.a.g.a.g.g.g.k.g.g.g.h.h.A.A.A.H.A.S.S.H.H.G.H.K.H.S.H.S.S.U.L.L.L.L.L.L.U.T.T.U.T.T.T.T.~.T.T./.T.^.T.~./.(.(.(.(.(._.|.|.|.|..X`..X|.'. X X|.|.|.|.|.|.|._. X|.|.|.|.{.`.(.|.^.(.`.(.(.(.(./.(.(././././.(.!.(.(.(.(.(.(.(.|.|._._.{.`.|.|._._._. X_.(.`._.(.(.(.(.(.(.).(.(.(.(.(.!.~.~.T.~.~.~.~.T.T.[.~.^.(.T.~.[.~./.(.(.(.(.(./.(./.(././.^./././.T.~.T.T.T.T.T.~.~.T.~.~.T.T.T.T.T.T.T.T.T.T.U.T.T.P.T.T.T.T.T.T.T.T.T.T.T.T.T.K.~.T.T.T.T.T.T.T.~.T.T.T.T.T.T.T.T.T.T.T.P.T.U.P.P.P.P.L.L.L.L.U.S.L.L.L.H.H.H.S.S.S.H.S.S.l.G.A.S.A.Z.A.A.H.A.S.A.H.S.Z.H.h.A.H.A.G.h.H.A.A.A.A.g.j.Z.h.A.l.l.h.z.g.g.d.k.k.d.a.z.a.a.a.a.a.d.a.a.i.i.i.i.i.a.a.i.i.i.i.i.i.i.i.u.i.a.i.i.i.i.i.i.i.i.i.i.u.u.u.u.u.u.u.t.t.u.u.u.u.u.u.t.t.u.t.u.t.u.t.u.t.u.u.t.u.t.u.E u.E t.t.u.u.i.u.a.a.a.u.u.u.a.u.u.u.u.i.E i.p.u.i.i.a.f.i.i.a.a.i.k.i.k.i.z.f.f.f.k.g.f.f.g.k.k.z.k.g.k.z.g.g.g.z.h.h.z.k.h.g.g.k.g.k.g.g.k.z.g.g.g.l.l.z.h.k.g.z.d.g.g.g.g.f.k.f.k.f.k.k.f.",
+"H H H H H H H H H H H H L J L L J J J J J P L J P L K I J J J H H P J H H L I H H G H H J H H F L H Z L H J K J J J J J I L P P J J K P L L H P D H H Z H D H H H H Z L H Z L S Z H H Z Z Z Z H H Z Z Z H Z Z Z B D Z Z C Z C Z C C C C C B C C C F C C C C C C C C C C C N C C B B B C B B B B C C N C N C C C C C A Z Z F C C D B B D C Z C D C C B Z Z C Z Z Z D Z Z Z Z F Z G B Z D D D D C Z Z Z D Z Z Z D D Z Z Z H D Z Z Z Z G Z Z A T Z.H.H.G.G.H.H.G.K.H.H.H.G.S.H.H.H.H.S.L.L.L.H.L.H.U.L.L.L.L.S.U.D.L.D.U.U.L.L.L.L.L.P.U.L.L.U.L.U.P.P.P.U.P.Y.P.P.Y.U.P.L.U.L.L.L.L.Y.U.Y.P.P.Y.T.U.Y.L.P.U.P.L.U.U.U.U.T.U.T.T.T.T.~.T.~.~.!./.~.~./././.(././.^.(./.(.(.(.(.(.(.`.(.^.|.|.|.|.|.|.|.|.|..X|..X.X.XzX'..XzX.XzXzXzXzXxXxXzXxXxX@XcXcXxXcXxXxXcXcXcXcXJXcXcXcXxXxXxXxXcXdXcXzXzXzXzXzXzXzXzXzXdXcXdXdXdX@XdXdXdXdX'.zXzX.XdXdXdX.XzX.X.X.X.X'.zX.XzX.X.X.X.X X_.@X_.|.|.|._.}._._.`.(.^.(.(.(.`.(._._.|._.|._._.|.{.|.|.|.|.`..X|..X|.'..X.X.X.X.XzX'..XzXdXfX@XcXxXxXcXcXcXnXcXcXxXnXnXnXvXMXmXmXMXMXMXMXmXMXMXMXSXMXMXDXMXMXMXMXMXSXfXSXmXMXmXMXMXMXMXMXfXNXSXmXmXmXmXmXmXmXmXmXnXxXcXcXxXcXzXcXzXzX@XdXxXdX.XdX.X.X'. X|._.}.^.(.(.(.(.~./.~.T.T.T.T.T.U.T.L.U.S.Y.L.A.L.L.L.H.H.S.H.h.A.h.A.h.k.g.g.g.k.k.k.f.k.k.d.k.i.f.i.a.a.a.a.a.a.a.a.a.a.i.a.i.i.a.u.i.i.u.i.u.u.u.i.i.u.u.u.i.u.u.u.u.u.u.u.u.u.t.u.t.t.u.u.t.u.u.u.u.u.i.i.u.a.i.i.a.i.i.i.i.s.u.s.u.i.u.u.p.u.u.u.r.u.t.u.t.u.u.u.t.u.u.u.u.u.r.t.u.u.t.t.t.i.r.t.u.t.t.u.u.u.t.t.t.t.t.t.t.t.t.u.t.p.t.t.t.p.t.t.t.t.t.u.t.p.u.u.i.i.i.a.a.a.a.a.a.d.f.a.g.a.z.z.g.g.g.g.A.A.h.S.A.G.A.H.L.S.H.H.H.A.K.H.H.L.L.L.S.D.L.L.L.L.Y.U.U.T.U.T.T.T.T.~.T.T./.T.^././.(.(.(.(.|._._.|.`.|.|.|.|..X.X|..X X_.|.@X`.|.|.|.|.'.|.`._.|.`.|.(.(.^.^.(.^./.(./././././.!./././.(.(.(.(.(.(.|.|.}._._._._._._._._._._._.`.(.(.(./.(.^.(.(./././.(././.~.~.~./.T.~.T.~.T.[.~.~.~./.~.~././././././.(./.(.(./././.~.~.^.T././.T.T.T.T.T.T.T.T.~.T.T.T.T.~.T.T.T.T.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.K.~.T.~.T.T.T.T.P.T.T.T.T.T.T.T.T.T.T.U.Y.T.T.U.Y.P.Y.U.U.U.Y.U.U.L.L.S.L.L.S.H.H.H.A.S.S.G.G.A.S.A.Z.h.S.H.S.A.S.A.S.S.S.H.H.H.H.S.H.S.A.A.A.A.A.A.A.A.A.h.h.l.l.h.h.g.g.k.g.k.k.d.k.a.a.a.a.a.E D.u.a.i.i.i.i.i.d.u.i.i.a.i.a.a.i.i.u.i.u.u.u.i.i.i.i.i.i.s.i.u.u.u.u.r.u.u.u.t.u.t.i.t.u.t.t.t.u.t.i.t.u.t.u.t.E t.t.t.t.t.t.u.t.u.u.u.u.t.E u.a.E E u.u.i.i.t.u.u.u.z.s.u.i.i.i.i.a.a.i.i.a.z.i.i.i.k.z.k.f.f.f.f.g.f.g.k.k.k.k.k.l.k.k.g.k.k.g.h.z.f.h.k.z.h.k.g.g.g.k.k.h.h.h.l.l.l.l.h.g.g.g.g.g.g.g.z.k.f.k.f.k.f.f.f.",
+"H H H Z H H H H H H H H L L L L J J I J P P P P J P L J J J J G P F H J U K H J I K H J H H J J H L H L H H H H P J J H L J K P J J J U U H H H H H H L H H H Z H H H Z H Z H Z Z Z H Z Z H Z Z D G Z D Z G B Z Z Z Z C C Z C B F C C C C C C C C C C A C F C C C C C C A C C C C B C B B B B A N N C N C B B C C C C C C C C C C C C C C C C C C Z F B Z Z C Z C Z Z Z C Z Z Z Z Z Z C D C C D Z Z B D D D D Z D D Z Z A Z D H Z H J Z L Z I Z.H.G.A.H.H.H.H.H.H.S.H.H.S.H.L.H.H.S.L.L.L.L.L.L.L.L.U.S.L.U.H.Z.A.L.D.H.H.L.L.L.P.L.L.L.L.U.L.Y.P.T.L.U.Y.U.P.U.U.L.L.P.L.T.L.Y.L.U.L.L.P.Y.P.Y.P.P.U.U.Y.U.Y.U.U.T.U.U.U.T.U.T.T.T.~.~.Y.~.~.~.!.~././././.(.^./.(.(.(.(.(.(.(.`.(.`.`._._._.|.|..X.X|..X'..X.XzX'.zXzXzXzXzXzXzXzXzXzXxXxXxXxXxXxXcXcXcXcXcXcXmXcXdXnXnXcXcXnXxXxXcXcXdXzXzXzXzXzXzXzXzXzXmXdXcXfXdXdX%X XdXdXxXzX'.zXdXdXdX.XzXzXzXxX.XxX.X.X.X.X'..X'.'. X|.|.|._._._.{._._.^.(.(.(.(.(.(.`._.^._._._._._._.|.|.|.|.`.|.`.|.|..X|..X.XdX'. X.XdX.XzXdXdXdXcXxXxXcXcXcXcXmXnXmXnXnXnXmXmXmXmXMXMXMXMXZXMXMXMXmXMXMXmXMXSXMXZXMXMXMXmXmXmXNXmXMXMXMXMXMXmXMXMXmXMXmXmXmXmXmXdXnXfXcXcXcXcXzXzXzXzXzXzXzX'.dX X.X.X'.|.|._._.`.(.(././.(.!.T.~.T.T.Y.Y.U.P.T.K.P.U.L.L.H.L.H.G.H.S.S.A.h.A.A.g.h.h.g.f.g.f.k.k.d.d.a.d.i.k.a.i.i.a.a.i.a.a.a.a.a.a.a.i.i.i.a.u.u.i.u.i.a.a.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.t.u.u.r.u.u.i.u.i.u.i.i.i.i.i.i.i.i.i.s.i.i.i.i.u.u.u.u.u.t.u.t.t.s.u.u.u.u.t.s.u.u.u.u.a.u.u.t.u.t.u.t.t.u.t.u.t.t.t.t.t.t.u.u.u.u.u.u.u.p.u.u.u.u.t.i.t.p.p.t.t.u.t.u.t.t.u.i.i.i.a.a.a.a.k.a.a.f.g.k.g.g.h.z.h.h.h.A.A.A.S.S.G.H.H.h.H.S.K.A.H.G.S.S.L.F.L.L.U.L.L.L.L.L.Y.U.U.T.T.T.T.Y.T.T.T.T.Y.(./.~./.(.(.(._.|._.|.|.|. X.X|.'.|..X|.|. X X_.'.'.|..X.X'.|.|.|._.^._.`.|.`.(.(.{.(./.(.(./././.)./././.E.(.(.(.(.(.^.^.}._._._._._.(.(._._._._.(.(.(.(.(.(.(.(.(.(.(.(./.(./.~.~.~.T.T.T.T.~.~.~.~.~.~.~./.!./././././././././././././.~.~.~.~.T.T.T.T.T.U.T.T.T.T.U.T.T.T.T.T.T.T.I.I.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.P.T.T.T.T.Y.T.P.T.U.U.T.U.P.U.L.L.P.U.L.L.L.H.L.S.S.L.H.H.H.S.S.S.A.A.S.S.S.S.S.S.S.S.G.S.S.S.S.H.H.H.G.G.A.H.S.G.G.A.A.A.A.h.h.l.l.A.A.l.h.h.k.k.g.g.k.d.x.a.a.a.a.a.a.a.d.a.i.i.i.i.i.i.a.i.i.i.d.a.i.i.i.i.i.u.u.u.i.u.u.i.s.u.i.i.u.i.u.u.u.u.u.t.t.u.u.t.u.t.r.p.t.u.t.u.r.u.t.u.t.u.u.u.t.u.u.t.t.t.t.u.t.u.u.u.a.u.u.u.a.u.i.u.i.u.u.a.i.E u.i.u.i.i.i.i.i.i.i.a.a.i.z.z.i.i.f.f.f.g.f.g.g.g.g.h.h.h.h.k.l.l.k.l.l.g.A.l.l.h.h.g.g.g.g.g.g.g.l.h.h.g.l.l.l.l.h.l.g.k.D.g.g.g.d.d.k.f.k.f.k.f.f.",
+"H H H H H H Z H J H H P H H H Y J J P P J P P J L J P J J J J K J J J H J H H H J L L H H H G J H H H J L Z J H H J J L K P J L J J L J H H H L H H H H H Z H H Z J Z L H H Z Z J Z Z Z S L L H Z Z D Z Z Z Z Z Z D Z Z C C C C C C C C C A C Z C C C C C C C C Z m N C N C N C Z B B C N C C B C N C C C B C C C C C C C C N F C C F C C C Z C C C C D B C D Z C Z B Z D Z Z Z Z Z B Z Z F Z Z Z Z Z Z Z Z D D H A Z D D D D D H Z L H H Z Y T Z.H.H.H.H.H.G.A.H.H.H.H.H.H.H.S.L.L.L.S.L.L.L.L.L.L.L.L.L.L.H.L.H.L.L.S.L.L.L.L.L.L.U.U.L.L.L.P.L.L.U.L.P.U.L.L.Y.L.L.U.U.L.U.L.U.U.L.U.U.U.U.U.T.Y.U.L.L.U.L.L.P.P.P.P.T.U.Y.T.T.T.T.~.T.~.~.~.~.(.T.~.^././././.(.(.(.^.(.(.(.(.(.|.(.(._.|._.|.|.`..X|..X.X.X@X.X.XdXzX.X#XxXzXzXxXxXxXxXxXxXxXcXxXcXcXmXcXcXcXmXnXnXnXcXnXcXcXdXnXdXdXxXcXdXzXzXnXcXdXdXdXdXdXzXcXdXcXdXdXdX.X.XzX'.zXzX@XdXzX.XzXzX@XdX.X'..XzXdX.X X.X|.|.|.{.}.{._._.(._.^.(.(.(.(.(.(.(.^._.(._._._._.|._.|.|.|._.|.|.|.|.'.|. X.X.X@XdX@XdXdXdXzXzXcXdXxXxXxXcXcXcXcXnXnXJXnXzXmXmXmXmXMXMXMXMXSXMXmXMXMXMXZXmXMXMXMXMXMXZXMXMXMXMXmXMXMXMXMXMXmXmXNXMXmXmXmXmXmXmXmXfXcXmXcXcXxXzXcXzXzXcX@XdXdX.XxXdX.X.X'.|._._._._.^.(././.^.~.T.~.T.T.Y.I.L.U.U.U.L.L.L.L.L.L.H.G.G.H.S.A.A.A.l.h.g.g.g.g.k.a.a.i.z.a.a.a.a.a.a.a.i.i.i.a.a.i.a.a.a.i.i.i.a.u.i.i.E x.i.u.u.a.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.t.t.u.u.t.u.u.u.u.u.u.i.t.i.i.i.i.a.i.i.i.i.i.u.i.s.u.u.u.i.u.t.u.u.u.t.u.p.u.u.u.u.i.u.u.u.u.u.u.t.t.t.u.t.t.u.t.t.t.u.u.u.u.t.u.t.u.t.u.u.u.t.u.u.t.r.u.u.u.t.u.t.u.t.t.t.p.u.u.u.a.a.a.a.a.a.k.a.f.a.l.g.a.h.h.l.h.g.g.A.A.A.H.G.H.H.H.L.H.H.H.L.H.H.H.H.L.L.S.S.L.L.L.L.P.U.U.T.T.U.T.T.T.T.T.T.T.~.T././.(./.^.(.(.(.|._.|.`.`.|.'.|..X X.X|.'.'.'.'..X.X|..X|.|.|.{._.|._.{.^.^.(.(.(.(.^./././.(././././.!./.^.^.^.(.(.(.|._.^._._.^.|.^.`.`.(._.^.`.^.^.(.(.(.(.^.(./.(.(./././.~.~.~.~.~.T.~.~.T.~.~.~.~.~.~.~./.T./././././././.(././.[.~.T.[.T.~.T.T.T.T.T.T.T.U.Y.L.P.Y.T.T.T.Y.T.I.I.I.P.Y.U.T.U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.U.U.T.T.T.Y.T.T.U.U.T.U.P.U.U.U.L.L.T.T.U.I.Y.L.L.L.L.L.L.H.L.L.L.H.H.H.H.G.G.A.S.A.H.A.S.A.A.S.S.S.S.S.S.S.S.H.H.A.G.H.S.G.H.H.A.A.S.A.A.z.A.A.A.l.A.h.D.k.g.h.z.k.k.k.k.k.a.d.z.i.a.a.a.a.a.i.i.u.a.i.i.i.i.i.i.i.a.i.i.a.u.a.u.u.u.u.u.u.a.u.u.i.u.i.u.u.u.u.u.u.t.u.u.t.p.t.t.p.t.t.t.t.t.t.t.t.t.u.u.u.t.t.u.u.t.u.t.u.t.u.u.u.u.u.E i.i.u.a.u.i.u.u.u.a.u.u.a.u.a.u.i.i.u.i.i.i.i.a.a.i.k.i.d.z.f.f.z.g.g.k.k.k.h.h.l.k.l.l.l.g.l.h.h.h.h.h.h.g.h.h.z.g.l.g.z.g.l.A.g.l.l.l.A.h.D.h.A.l.z.g.k.g.k.f.f.f.f.f.d.k.f.",
+"D H H Z H H H H H H H H H U H P H J J P H J P L J J J J J J H H H H H J H K U K I J J H L H H L H H H Z J J H H H J J P L L J L J J J H H P H H H H H H F J H H L Z Z H H Z L Z S Z L Z Z H S Z D D Z D Z Z Z C C C C Z C Z C Z C C C C C C C C C Z Z C B C C C A A Z N C C N A B B C B B N C B N Z C N B C C C B B C B V C B B C C C C Z C C C C Z C B C Z Z Z Z Z D Z C D D C Z Z D Z B Z C Z Z Z Z Z Z Z Z Z D D Z D D D D D Z Z Z Z H Z Z T Z.H.H.H.G.H.G.L.H.S.H.H.S.H.H.L.S.L.L.L.L.L.S.L.S.U.L.S.H.L.L.H.H.H.L.L.S.L.L.L.L.L.L.L.L.L.L.L.P.P.P.P.U.U.L.U.L.L.U.U.U.U.U.L.Y.L.L.Y.L.U.T.Y.T.U.T.U.U.L.K.L.P.P.U.P.U.Y.U.T.T.Y.T.~.~.~.T.~.~.~.~.~.~.~././.!.(.(.(.(.(._.(.|.^.(.`._.|._.|.|.|.|.|. X|..X.XdXzX.XdX'.xXdXdXzXzXxXxXxXxXcXxXcXxXcXcXcXnXmXmXnXMXnXnXnXnXnXnXcXcXxXxXnXdXcXdXzXzXdXdXdXxXdXnXcXzXdXdXdXdX%XmX.XxXdXzXzXzXzXzXzXxXdXzXdXdXdXdX.X.X.X.X X'.|.|.|._.}._._._._._.^.`.(.(._.(.(.(.(.(._._._._._.(._.{.[.|._.|.|.|.'.|.|..X.X.X.X.XdX.XdXdXzXzXzXcX@XxXxXxXdXJXcXcXzXnXJXmXmXmXMXMXmXNXmXmXMXMXZXMXMXMXMXMXmXZXMXmXMXmXMXSXDXMXMXMXMXMXMXmXfXSXmXMXmXmXmXmXmXmXcXcXcXMXcXcXxXcXzXzXzX X.XdXdXdX'.@X.X X|.|.|._._.(.|.(././.~.~.~.T.T.T.I.Y.T.U.L.U.L.L.L.L.H.H.H.G.A.H.S.A.A.S.l.l.g.g.j.j.z.i.k.i.i.a.a.a.a.i.i.i.i.a.i.i.i.a.i.i.u.k.a.a.i.i.i.u.a.u.i.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.u.u.u.u.u.u.i.u.u.a.i.i.i.i.i.i.i.i.i.u.i.u.u.u.u.u.u.u.u.u.t.u.u.p.u.u.u.i.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.u.u.u.u.u.u.u.u.u.u.p.u.u.u.p.p.u.u.u.t.p.t.t.u.u.p.u.u.i.t.a.a.a.a.i.f.f.g.g.g.g.h.h.l.l.A.A.A.S.A.H.S.H.H.H.G.S.H.H.H.H.H.H.H.H.S.L.L.L.L.L.L.P.U.L.U.T.U.T.T.T.T.T.T.T.~.T.R.(./.!.(.(.^.|.|./._._.`.|.|. X|..X.X|..X|.'.|.`..X.X.X.X|..X|.|.|.|.(.`.(.`.(.(._.(.(.(./.(././.].(./.(././.^.^.^./.(.(.{._.{.`.^.`.(.(.(.(.(.(.`.(.(.(.(./.(.(././././.(./././.~.~.T.~.T.^.T.[.T.~.~.T.[.T.~.~.~.~./.!./././.!.~././.~.~.[.T.T.T.T.T.T.T.U.Y.U.T.U.U.P.T.U.U.U.U.I.I.U.Y.P.P.P.P.P.U.T.T.T.T.T.T.T.T.T.U.R.L.U.T.~.U.T.T.T.Y.T.T.T.U.Y.U.U.U.P.L.U.U.L.L.L.L.K.L.L.L.U.D.L.H.L.G.D.H.H.H.A.G.S.S.A.A.A.G.H.A.S.S.A.S.G.S.S.S.S.A.G.A.K.H.G.Z.A.G.S.J.G.A.A.A.A.A.l.A.h.l.h.h.k.k.k.a.k.k.k.d.a.k.d.d.a.a.a.i.a.i.i.u.a.u.i.i.i.i.i.i.a.a.a.a.a.i.k.u.a.u.u.a.u.a.i.u.x.u.u.u.u.u.u.t.u.t.t.u.u.t.u.t.t.u.t.p.t.r.t.t.t.t.t.t.t.t.E u.E t.u.t.t.u.u.u.u.u.a.u.u.u.i.i.u.i.a.u.u.u.u.u.u.u.i.i.i.i.u.i.i.i.a.a.a.a.k.i.i.f.f.f.g.g.h.l.l.h.l.l.l.l.g.z.z.l.l.h.h.A.l.h.l.l.h.h.h.z.h.g.z.l.l.h.l.h.l.l.z.l.g.A.h.l.l.k.g.g.k.f.f.f.f.k.f.k.",
+"H H H H H H H H P H P P L L P L J J J J P P J P J J J J H H J J H J J H G J J L J J J H H J H L L H L J H J H J P H H L L P K L J P J J H H D P H G J H L H H H Z H Z D Z L Z Z H S Z Z Z L Z L D D D Z Z Z C Z Z C Z C Z C C C Z C C C C C C C C C A C C C C C N C Z A C N B B B C C B C B B C C B C V C B C B C B B C C B C C N B B C V C C C Z C C Z C Z Z Z Z Z Z Z Z C Z B Z Z Z C D Z Z B Z C Z Z Z Z Z D D D H Z D D D D Z H H D F S D H Z.H.D.H.H.H.H.G.H.S.G.S.H.H.L.H.L.S.L.S.L.S.L.L.L.L.L.L.L.H.L.L.H.H.S.L.G.L.L.L.L.L.U.L.L.L.L.L.L.L.P.P.P.L.L.U.L.L.L.T.I.L.L.Y.U.L.L.L.T.U.T.U.T.Y.L.U.L.Y.L.L.P.L.P.P.P.P.T.U.T.T.T.T.T.T.~.T.T.~.~.~./.E././.(.(.(.(.(.(.(.(.(.(.^.`.{.|._._.|.|.'. X'..X'..X'..XdXzXdXxXxXdXzXxXxXvXxXvXnXxXxXxXxXcXnXnXnXmXMXmXnXnXnXnXnXnXcXcXnXdXdXdXxXdXdXxXdXcXnXcXdXdXzXzXcXvXcXvXzXdXzX.XcXzXzX.XxXzXzXzXzXzXdXdXdXdX@X.X.X.X.X.X|.|._.}.}.|._._._.^.(.(.(.(.(.(.(.(.(.(.|._._.(.`.|.|.|.|.|.|.|.|.|.|._.|..X.X.X.X.X.X.XdXdXdXdXxXzXdXxXxXxXnXnXnXmXmXnXmXmXmXmXMXMXZXSXmXSXMXZXmXMXMXMXMXMXMXMXSXZXSXZXfXMXnXMXmXmXMXMXmXMXMXMXmXmXmXmXmXmXmXmXmXmXcXcXnXdXxXxXzXzX.XdXdXdXdX X@X.X.X.X'._._._._.(.(.(./.~.~.~.~.T.T.T.T.I.U.L.U.L.L.L.L.L.L.S.H.H.G.H.H.A.A.A.h.h.z.g.a.g.z.d.a.a.a.a.i.a.a.i.i.i.u.k.i.i.i.a.a.a.a.a.i.a.k.i.u.a.a.a.i.u.u.i.u.u.a.u.a.u.i.u.u.u.u.u.u.u.u.u.t.t.u.t.u.u.u.i.s.u.i.i.i.i.i.i.i.i.i.i.s.p.p.s.u.i.u.u.i.u.t.u.u.u.u.u.u.u.u.u.i.u.u.i.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.E u.u.r.u.u.u.u.u.p.t.u.p.u.t.u.t.p.t.t.u.t.u.u.u.u.i.u.a.f.a.f.f.k.k.j.k.g.h.h.h.A.A.S.j.h.A.A.G.S.H.H.H.H.H.H.H.H.L.S.H.K.G.L.L.L.H.L.L.L.L.U.U.Y.U.T.U.T.T.T.T.T.T.T.T.~.~././.(.(.^.|.|.`.|.|.`.`. X|.'..X X.X|..X.X.X.X|..X.X.X.X.X|.|.|._.(._.{.(.(.(.(.(./.(././././.)././././././.(.[.(.^.(.(.{.|.^.`.^.(.(.(.(.(.(.!./.(.^./.(.(././././.!./.~.~.(.~.~./.~.~.T.~.~.~.T.~.~.~.~.~.~././.~./.[./.(.~.~.~.~.~.~.[.T.T.T.T.T.U.T.T.Y.U.P.U.U.L.L.L.U.U.U.Y.L.U.U.L.P.P.T.P.Y.U.Y.T.T.T.T.T.T.T.Y.R.Y.T.I.R.T.T.L.Y.P.T.U.L.U.L.L.P.L.P.P.U.L.U.L.L.L.L.L.L.L.L.S.L.L.L.H.H.Z.H.S.S.S.S.S.A.H.G.A.A.A.A.A.S.S.h.S.S.S.G.S.G.G.G.Z.G.G.A.A.Z.h.A.A.A.g.h.l.l.A.h.h.h.k.g.g.k.d.k.k.k.k.k.d.z.k.a.a.a.i.a.i.u.i.u.a.i.i.i.a.a.i.a.i.a.a.i.i.a.u.u.t.u.u.u.u.a.u.r.u.u.u.u.u.t.u.t.u.u.t.t.u.u.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.u.u.t.u.a.i.u.u.a.i.u.i.u.i.i.i.u.a.u.i.a.i.i.u.i.u.u.i.u.i.i.i.i.a.a.a.i.z.f.f.f.d.k.k.l.k.h.h.z.l.l.l.l.g.h.h.k.k.h.h.l.l.l.l.h.h.h.k.h.h.l.l.l.h.l.h.l.l.l.l.l.l.l.l.l.k.k.d.d.f.f.f.f.f.k.f.",
+"D H H F F J H H H H H U L H H P J J J H J J H L P J J L P J H H J F H H J J J H J J H H L L H H H H H L H H J H H P L L J H U H D L J H H P H H H H J F H Z F H H D H H L Z H Z H Z L Z Z Z Z Z Z D Z Z Z Z Z Z C Z B D Z C C C C C C Z F C C Z C C C C C C u B Z N C N Z C A Z B C B C B C B C B V C B B C B C C B u B C C C B u N C C V C C C C C C C C Z C D F B C Z Z Z Z D Z Z Z Z Z C Z Z F C C G Z Z D Z D D Z Z F D D D D H H D F Z H L e.Z.H.H.A.S.H.Z.H.H.H.H.H.H.H.H.S.S.L.L.L.L.S.L.L.L.L.L.L.L.S.L.L.H.H.L.H.L.L.H.L.L.L.P.S.L.L.L.L.L.L.P.L.U.L.L.K.R.U.U.I.U.U.U.U.L.Y.U.U.U.T.P.T.P.P.P.U.Y.L.L.L.Y.P.P.Y.P.P.P.Y.Y.T.T.T.T.~.T.~.~.~.[./././././.(.(.(.(.(.(.(.`.(.(.(.^.|.|._.`.|..X|. X'..X.XdXdXdXzXzXdXdXxXzXzXxXxXxXxXxXxXxXcXnXcXnXnXnXmXmXMXMXnXMXnXcXnXcXcXnXxXnXdXdXdXdXnXdXdXdXxXdXnXcXcXdXcXcXdXvX.XzXzXdXxXzXcXzXzXzXzXzXzXdXdX'.dXdXdX.X.X.X'.|.|.|.}.}.}._._._._.`.^.|./.(.(.(.(.(.^.^.(.(.|.(._.|._.{._.|._.|.|.|.|.'.|.|..X|..X.X.X.XdXzXzXdXdXxXxXxXxXdXnXMXcXmXmXnXmXmXmXmXMXmXmXMXMXMXMXMXMXSXMXSXMXMXZXMXMXMXMXNXmXmXMXMXmXmXMXfXmXMXmXfXmXmXNXmXmXmXmXmXcXnXxXnXcXzXvXdXdXzXdXdX'..X.X X.X|. X_.|._._._._.(.^././.~.~.T.T.T.T.T.I.U.U.K.I.L.L.L.S.H.L.H.H.G.H.A.A.A.z.h.h.h.h.z.a.i.z.a.a.a.a.a.i.a.a.i.i.u.u.i.i.i.a.i.a.a.a.a.a.u.a.a.a.u.u.u.i.i.u.i.a.t.a.r.s.u.u.u.u.t.u.u.u.u.t.i.i.t.u.u.u.u.u.i.u.i.u.i.i.a.i.i.i.i.i.s.u.i.i.i.s.i.u.u.u.u.u.u.t.u.p.u.u.u.i.u.i.i.i.u.i.u.i.u.u.t.t.u.u.u.u.u.u.t.t.u.u.u.u.u.u.p.u.p.u.u.u.u.u.p.u.p.u.i.t.p.p.t.u.u.t.i.u.u.u.a.a.a.a.a.f.f.z.h.h.h.h.h.h.A.h.h.A.S.A.S.Z.H.H.H.H.H.H.S.H.H.G.K.U.H.H.S.L.H.L.L.L.L.U.L.U.U.T.T.T.T.T.T.T.T.T.T.~.~././.(.(.(.(.(.(.|.{.|.`.|.|..X|. X.X|..X X|..X.X.X.X|.|.'.|.|.|.|._.|.{._.(.(.(.(.(.(./.(././././.(.!././././.(.E./.(.(.(._.^.^.(.(.(.(.(.(.(.(.[.(././.(.(././././.(.!.!.~./.!.~.~.T.~.T.~.~.~.~.[.T.~.T./.T.~.[.~./.~.~.~./.~.~.~.~.~.~.T.T.T.T.T.T.T.U.T.P.P.P.K.Y.L.L.U.L.L.L.K.L.L.L.P.P.P.P.P.U.Y.U.U.T.T.T.T.T.T.T.I.I.I.I.Y.R.T.T.T.L.U.L.U.L.L.L.L.P.L.P.L.U.L.L.U.I.L.S.L.U.S.H.H.H.H.H.H.H.S.S.A.S.S.A.h.G.z.A.G.A.A.S.h.h.z.H.S.S.S.H.A.H.G.G.Z.Z.A.H.A.A.A.A.A.G.A.l.l.l.l.h.h.g.g.z.k.k.k.a.k.k.d.k.E x.a.i.a.a.a.u.a.i.u.i.i.i.a.u.a.i.i.a.a.a.a.a.u.u.a.a.u.u.u.u.u.u.u.u.u.u.u.u.u.t.t.u.t.u.t.t.t.u.t.u.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.u.E u.t.E t.u.u.u.u.i.u.u.u.i.u.i.u.i.u.a.u.u.i.u.i.u.u.i.u.u.i.i.i.i.f.i.i.i.f.g.g.k.h.k.h.g.l.h.h.l.l.l.l.h.h.h.h.h.h.l.l.l.l.h.h.h.h.A.g.h.l.D.g.l.A.A.h.l.A.h.h.k.l.l.l.k.k.k.k.f.f.f.f.k.k.",
+"H H Z H H H H H P H L H H J K H J J J P H J P P L H J L H Z H H L J H H L H L P H H J H J H H L J L L H L K H H H P H P P H J J J J L H H L H H Z H H H H H H D H D Z H Z H H H D Z D D D D D Z Z Z Z Z Z Z Z F Z C F C Z C Z C C C C C C C C A C C A C C C C C C N Z C C N C C C N C Z C B B Z B B C B N C C C C C C C m C A N C C C C C C N C C C C C C C Z C Z Z Z Z C Z C C C Z Z Z Z Z Z C Z Z C Z Z Z Z Z Z Z D D D D D D Z L Z Z Z S H H T Z.S.D.U.S.H.G.S.D.H.S.G.H.H.H.D.U.L.H.S.U.S.L.L.S.U.S.Z.L.S.U.L.L.S.L.L.L.S.L.L.L.S.L.L.S.L.S.U.L.L.Y.P.P.P.P.P.P.L.U.U.L.Y.U.U.U.L.U.U.U.U.U.T.Y.Y.L.Y.L.L.U.L.L.L.I.I.U.P.P.U.T.U.T.T.T.T.~.T.~.T.~.~.~.(.[.(.(.(.(.(.(._.(._.(.(._.(._.|.}.}.}.}. X X.X.X.XdXdXzX@XdXdXmXnXdXdXcXxXxXxXxXxXcXcXcXmXnXnXmXmXmXmXNXMXcXcXmXcXcXcXcXxXxXzXdXcXzXzXzXzXxXxXxXzXxXxXvXxXcXzXzXcXzXzXzXzXzXzXzXxXxXzXzXzXzX.X.XdXdX@X.X.X.X'.|.|._.|._._.^._.{.`./.|.^.|.(.(.(.^.^.^.(.(.(._._._.(._._.|._.|.|.|.|.|.|.|..X X X X.XdX.XdX.XcXdXcXdXcXvXcXcXcXnXnXfXNXmXmXMXMXMXMXMXmXmXNXNXfXMXMXMXMXMXMXAXMXBXBXSXfXBXmXmXmXmXmXmXmXmXmXmXmXmXmXMXmXmXMXmXmXcXcXcXcXcXcXdXcXdXdX XdXdX.XdX.X.X X|.|.|.|.|.(.(.(.(.[.~.~.~.~.T.T.T.T.Y.P.P.P.P.P.U.L.L.L.D.H.H.H.H.H.A.S.A.h.l.h.l.k.f.f.f.f.i.i.k.i.a.a.i.i.i.i.i.i.i.i.i.i.a.a.a.a.z.i.i.i.i.i.i.i.i.p.i.i.i.p.i.u.i.i.u.i.u.u.u.u.t.u.u.u.u.t.u.u.u.u.u.u.u.i.i.i.s.t.i.i.i.i.i.i.i.i.i.i.i.s.u.u.i.u.u.u.u.u.i.i.u.u.u.i.i.i.i.i.i.u.i.i.u.u.t.u.u.u.u.u.u.u.u.u.u.u.u.r.u.p.t.u.p.i.r.u.u.u.u.s.t.u.u.u.u.u.u.u.u.u.u.u.a.t.i.i.a.a.f.a.g.f.h.h.l.l.z.A.A.A.A.A.A.G.G.H.H.H.H.S.L.H.H.H.H.H.L.H.L.H.L.S.H.L.L.L.U.T.T.T.T.T.~.T.T.T.T.~.T.T.Y.~.~./.^.(.(.(.(._.(.`.`._.(.|.|.|.|.|.|. X.X.X X X.X X.X.X.X.X|..X|.|.|._.|.|.`.(.(.(.(.(.(.(.^.~.E.(././././././././.(.(.^.(.^.`.(.(.(.(.(.(./.(././.(././.(.!.(.)./.~.(.~.~.U.(.~.~.T.~.~.T.~.~.~.~.T.^.T.~.T.[.~.~.~.^.~.~.~.!.R.~.~.[.T.T.T.T.U.T.T.U.T.I.U.U.U.L.L.Y.P.L.L.L.L.U.L.P.L.P.P.L.L.L.P.P.U.T.T.T.T.T.T.U.U.P.U.L.Y.Y.Y.Y.Y.U.U.L.L.U.L.S.S.L.L.L.L.L.L.L.L.L.L.L.L.L.S.L.H.L.H.H.H.H.H.H.S.S.A.A.H.A.A.A.A.A.A.A.A.h.A.A.A.A.A.A.W.J.A.H.J.h.H.h.H.A.H.A.A.A.h.h.h.h.l.h.l.l.h.j.f.z.j.f.x.f.f.j.a.j.a.f.a.a.a.a.i.i.u.i.i.u.i.i.i.i.a.a.i.a.i.a.a.i.i.i.u.u.u.u.u.u.u.s.u.i.s.u.t.u.u.t.t.u.t.t.t.t.u.t.t.E a.r.t.t.t.t.t.r.t.r.r.r.t.r.t.t.t.t.t.u.u.t.u.u.u.u.u.a.a.a.u.u.i.i.u.u.i.u.u.a.u.u.u.u.a.a.u.a.a.u.a.i.a.a.a.z.k.k.k.k.z.k.h.h.h.z.h.h.h.h.h.z.h.h.h.h.h.h.A.z.h.l.l.l.h.h.z.z.l.l.l.l.h.A.l.h.D.h.h.h.g.g.g.g.g.g.f.g.a.g.k.g.",
+"Z Z L H H F J H L L L H H H U P J J H L P H L H U P L L J P H H H H L H L H L L J J H H L H L H H H H H L H J H H U H H H H J L H J L H L L H H H H H J H H H H Z H H Z H Z H H F Z D D D D Z D Z Z Z Z Z Z C C C Z C C C C C C C Z C C C C C C C C C C C Z B C N Z N C N C N C C N B B B C C N B C B C C C C N C C Z C A C A C C C A N A C A C C A C Z C C Z Z C Z Z C Z A Z C Z Z C Z C A C Z Z Z Z Z Z Z Z F Z D D D D D D D Z H Z L H H Z H U Z.D.S.Z.S.A.G.G.S.G.D.G.H.L.S.U.D.S.K.L.S.L.U.L.L.L.U.L.H.U.S.U.S.L.L.L.L.L.L.L.L.S.L.U.U.L.L.U.L.L.L.S.P.P.P.Y.L.U.L.U.L.U.L.U.K.U.L.U.U.U.U.U.L.T.L.L.L.R.K.L.U.L.L.U.U.P.P.U.U.T.U.T.T.~.T.~.~.(.~.~././.(.(.(.(.(.(.(.(.(.(.(.(.(.(._._._.}.}.|. X.X.X.X.X.XdX XzXdXdXdXcXcXxXcXcXdXxXxXcXnXnXnXcXMXmXMXmXmXmXmXmXMXmXMXcXcXcXxXcXxXxX@XzXxXzXzXxXxXxXxXzXxXvXxXxXzXcXcXdXcXzXzXzXxXzXzXzXzXzXzXzX.XzX.XdXdX'..X.X|..X|.|.|.|._.`.`.`.`.`.(./.|.(.(.(.(.(.(.`.(._.(.(._._.|.{.|.|.|._.`.|.|.|.|.'.|. X X X.X.X.XdX.XdX XdXcXdXdXfXdXcXcXnXcXcXfXmXMXMXMXMXMXDXMXfXmXZXMXSXMXZXMXZXMXSXMXSXSXSXMXSXMXmXmXMXmXmXfXmXcXmXmXNXmXmXmXmXmXmXmXmXcXcXcXcXdXcXdXcXdX.X.X.X.X.X X.X|.|.|._._.(.^.^.(.E.~.!.T.~.T.T.T.T.P.P.U.L.P.P.L.S.S.P.U.H.H.H.D.S.H.A.A.A.l.l.k.l.j.f.f.f.k.a.a.a.i.a.i.i.i.i.i.i.i.i.a.i.a.a.a.i.i.a.a.a.a.a.i.i.i.i.i.i.i.i.i.i.u.i.u.u.u.u.u.u.u.u.t.u.u.u.u.u.u.u.u.i.i.u.i.u.a.i.i.i.i.i.i.i.s.i.t.s.i.s.i.u.u.i.i.u.u.i.u.u.u.i.u.f.i.i.i.i.i.i.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.s.t.i.a.i.a.f.a.k.k.f.f.h.h.l.l.l.A.A.A.A.A.A.A.h.G.G.G.S.L.S.H.H.H.H.L.H.L.L.H.L.H.L.L.H.U.L.L.U.Y.T.T.T.Y.T.~.~.~.T.~.~./.~.~.~.~.(.(.(.(.(.(.|.(.|.|.|.|.|.|..X.X.X|..X X@X X.X.X.X|.|.'..X|.|._.|.(.^.^.(.(.(.^.(./.(.(.[.{.^./.T./././.!.(.(./.(.(.`.(.(.`.(.(.(.(.(.(./././././.(.(./.(.^./.~.~.~.(.(.~.~.~.~.~.~.~.T.~.T.T.~.T.~.T.T.~.T.~.~.T.^.~.~.~.~.~.T.T.T.T.T.T.U.U.Y.U.I.T.T.U.L.U.L.L.L.L.L.L.L.L.L.L.P.L.L.L.L.L.Y.P.U.T.U.Y.T.Y.U.T.P.P.U.Y.L.U.P.P.P.U.U.Y.L.Y.P.P.L.L.L.L.S.L.L.L.L.H.L.L.L.H.L.H.H.H.H.H.H.A.H.A.S.S.S.A.A.g.A.A.A.g.h.A.A.h.A.A.j.A.Z.A.h.A.A.A.A.A.A.S.S.A.A.A.A.g.h.h.h.h.l.h.h.k.h.z.f.z.f.f.f.f.f.s.f.i.a.f.a.a.a.a.i.i.a.i.i.i.u.i.i.i.a.i.a.a.a.i.i.i.i.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.t.u.t.u.u.E t.u.t.u.t.t.E u.t.r.r.r.t.r.r.t.t.t.t.t.t.u.t.u.u.u.u.a.u.u.u.u.a.u.u.u.i.i.u.i.u.x.u.i.u.u.a.E u.u.u.a.i.a.a.a.a.a.k.k.k.k.g.g.h.h.J.z.h.h.A.h.h.h.h.h.l.h.h.A.z.h.A.l.l.h.h.h.h.z.l.h.l.l.l.l.h.h.f.h.z.z.g.g.a.g.i.k.k.a.g.k.k.z.",
+"G H Z H Z H J F H H J H H H L L H L L L H J L P J L L L J L J H H H H L L H H L J J J H H L J L H H J H L H H H J H P H U H L L J Z J H L J J H H H H Z H D H H H H H H Z J Z S Z Z Z D D D D D Z Z Z Z C Z C Z Z C C Z Z C C C C A Z C C C C C C C C C C B C C N N Z N Z C C C C C C C C N C C Z B B C N C C N Z C C C A C N C C A C N C C A C C C C C A Z C Z Z C Z Z Z C Z C Z C C Z Z Z C Z F B Z C D Z Z Z D Z D D D Z H D L H D Z H Z L H J e.H.H.H.G.S.D.S.S.S.H.G.H.H.L.H.U.L.H.L.L.L.S.H.U.S.L.H.L.L.H.L.U.S.L.L.L.L.L.L.L.L.P.L.L.L.L.L.P.S.P.P.P.P.P.L.L.Y.U.L.U.L.L.L.U.U.I.U.Y.U.U.U.U.L.U.U.L.Y.L.U.L.L.K.P.P.Y.P.T.Y.P.P.T.T.T.~.T.~.T.~.~.~.~.(.~.(.(.^.(.{.{.(.[._.(.(.(._._._.}.|.|..X.X.X XdXdXdXzXzXdXcXcXdXvXdXcXcXcXnXcXcXfXnXnXnXmXmXnXMXmXMXMXMXnXMXcXmXnXnXvXnXxXxXxXxXxXxXxXzXzXxXcXcX@XdXxXxXcXcXvXzXzXvXzXxXzXvXzXzXzXzXzXzXxXzXdX'.'.dX.X.X.X|.|.|.|._.|.{.|._.{.{.{.(.`.(.`.(.(.`.^.(.^.(.(._._._._._._.|._.|.|._.|._.|.|..X|. X X.X.X%XdXdX XdXcXcXdXdXcXnXnXmXnXmXNXNXmXMXMXmXMXMXZXMXZXmXZXMXMXSXMXSXMXMXZXBXMXfXSXMXMXMXMXmXcXmXmXmXmXmXcXmXmXmXmXmXmXmXmXcXcXcXcXcXcXnXdXzXdX@XdX.X.X.X X'.|._._.{.|.(.(.(./.^./.^.~.T.T.T.T.T.U.U.P.L.L.L.L.L.L.L.L.S.H.S.A.S.S.A.A.A.h.h.h.l.l.g.f.k.i.a.k.a.a.i.k.a.i.i.i.i.i.i.i.a.a.a.a.k.z.i.a.a.i.i.i.i.i.i.i.i.i.i.i.u.i.p.i.u.i.u.u.u.u.t.u.u.u.u.t.t.u.u.u.u.p.u.i.s.i.i.s.i.i.i.i.i.i.t.i.i.s.t.a.u.u.u.i.i.u.u.u.u.u.i.u.i.u.i.i.i.d.u.i.u.i.t.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.i.u.i.s.u.i.u.u.i.u.u.i.a.i.i.a.a.z.k.f.k.l.l.l.l.z.A.A.j.G.A.A.A.S.W.S.H.H.H.S.H.H.H.H.H.H.S.L.H.H.L.L.L.L.L.U.L.L.U.U.T.T.T.~.T.T.T.T.~.~.T.T./././.^./.^.(.(._._._._._.|.|.|.|.|.|.|. X.X X X X.X.X|..X.X.X.X|.|.|._.|.`._.`.^.(.(.(.(.(.~.[.^./.~.(.(./././.(././.(.(.(.(.(.`.(.(.(.!.(./.!././././.(.(.(./.(././.~.~.^.T.R.R.~.~.~.~.~.T.~.T.~.~.T.^.~.~.~.T.T.~.[.~.~.~.~.~.~.R.T.T.T.T.T.T.U.T.U.T.U.Y.L.U.U.L.L.L.L.L.L.L.L.L.P.P.L.L.L.P.L.U.P.U.Y.U.U.T.U.Y.T.L.L.T.U.U.P.U.L.P.P.P.L.L.L.P.L.L.L.L.L.L.L.L.H.L.L.L.H.L.L.L.H.H.H.H.H.H.Y.A.G.H.A.S.A.A.A.A.A.A.h.A.A.A.h.h.A.A.A.A.A.A.A.h.A.A.A.h.A.A.h.h.S.z.A.h.A.h.h.h.h.h.z.f.z.j.z.j.f.z.f.f.a.f.f.a.f.a.a.a.a.a.s.i.i.u.u.u.i.i.i.i.i.i.a.i.i.a.a.i.i.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.u.u.t.u.t.u.x.E u.t.t.u.t.t.r.t.r.r.r.t.t.t.t.t.t.t.t.u.u.u.u.u.t.u.u.u.u.u.a.u.u.s.u.i.i.i.x.u.u.u.u.i.u.i.u.i.u.i.i.a.a.a.a.k.x.i.d.k.k.k.z.h.h.h.h.h.h.G.z.z.h.h.h.z.g.h.z.A.A.z.h.h.z.l.A.h.l.A.l.l.D.h.l.l.h.h.h.h.z.g.g.g.g.g.z.k.g.g.g.g.z.a.",
+"D H H H Z H H H H G L L L L K P P L L H P H L H P L L L L L L H H L H L H P P H J H H H H H Z L H H H H H H H H U H J H H J L H L H J H H H H J G H H H H H Z H H D Z L Z H J D Z L D D Z Z D F A Z Z Z F C Z C D C C Z C C C C C C C C A Z C Z C C Z C C C C A Z N Z N N N C N N C N C B C N C N C B B C C C Z N C C C C N C A N A C A C C C C C C C C C Z C Z C Z Z C C C Z Z C A Z Z C Z Z Z A Z Z Z Z Z Z Z Z D D D D H D Z H Z H H H Z Z L Z b.G.U.S.G.G.S.S.S.H.S.S.H.H.G.Z.L.S.L.L.Z.S.U.L.D.L.F.L.L.H.L.L.S.L.L.L.L.L.S.L.D.L.P.S.L.S.L.P.P.P.P.P.P.P.S.L.L.U.U.L.U.L.Y.U.U.U.Y.L.L.L.U.L.U.L.L.U.L.L.L.L.U.Y.U.P.Y.P.P.P.Y.T.Y.T.Y.T.T.~.T.~.~.~./.(./.(.(.{.^._.(.{.(.(.(._.(.}.{.|._.|.}.|..X.X.X.X@XdXdXdXzXdXnXdXdXvXdXxXnXdXnXcXcXvXcXnXmXmXmXMXnXmXMXmXmXMXmXcXmXcXnXnXnXcXxXxXxXdX$XzXxXzXxXdXxXxXcXzXxXxXcXcXdXcXzXzXzXzXzXzXzXzXzXzXzX'..XdX.X.X.X.X.X.X X|.`.|.|._.|.^.|.|.`.^.|.^.(.`.^.(.^.(.`.{.(.(._.(._.(._._._._._._.|.|.|.|.|. X X X X@X.X XdXdXdXdXdX.XvXdXcXcXnXcXcXmXcXfXmXmXNXSXMXMXMXMXSXMXMXMXZXMXMXMXMXZXMXSXMXCXMXmXCXmXmXmXmXmXmXmXfXmXcXmXmXcXmXmXmXfXcXcXcXcXdXcXdXdXdX%XdXdX X X.X X X_._.|._._.(.|.(.[.^.(.^.~.~.~.~.P.T.U.U.U.P.L.L.L.L.L.L.S.S.S.H.S.H.S.S.A.z.A.h.h.h.k.k.k.z.a.k.k.i.i.f.i.i.a.a.i.i.s.a.i.a.a.a.a.a.i.a.i.a.a.i.i.i.i.i.i.i.i.i.a.i.s.i.i.i.i.u.u.u.u.u.u.t.u.E u.u.u.p.u.i.u.u.u.i.u.i.u.i.i.i.i.i.i.i.s.i.i.u.i.u.u.i.u.u.u.i.u.i.u.u.t.i.u.i.i.f.i.i.i.u.i.u.u.u.u.u.u.t.u.u.u.u.u.u.u.u.a.u.u.u.u.u.u.u.u.t.s.s.u.u.u.u.u.u.u.u.i.u.u.s.i.i.i.i.a.a.a.k.f.f.f.z.l.l.h.A.A.A.h.A.A.A.H.A.S.A.K.H.L.H.H.H.H.H.H.L.L.H.L.U.L.L.L.L.P.U.U.T.T.T.T.T.~.~.~.T./.T.T./.T.!./.!./.(.{.(.(.(._._._._.|.|._.|.|..X X|.|.|..X.X|..X.X.X.X.X`..X|.|._._.`.|.(.(.(.(.(.(.^././.^.{.~.(.~./././.!.(.(.(.!.(.^.`.(.`.(.(.(./.(./././././.(.^.(.)./.(./.(.~.~.~.~.E.~.~.~.~.~.~.T.(.~.T.~.T.T.~.T.~.~.T.~.~.~.~.~.~.R.~.T.T.T.T.T.Y.T.Y.I.I.U.U.U.U.L.L.L.L.L.L.L.L.L.L.L.A.L.P.P.L.P.L.P.L.U.Y.L.Y.P.U.U.U.U.L.L.Y.L.L.L.U.L.L.U.L.L.L.L.S.S.L.H.D.F.S.H.H.S.H.H.H.H.H.D.H.H.H.A.H.A.H.H.H.A.h.A.A.A.A.A.A.A.j.h.A.Z.h.h.h.A.h.A.A.h.h.j.A.j.Z.j.S.h.A.h.h.h.h.h.A.h.h.l.h.k.k.s.s.j.z.f.a.f.f.f.a.f.f.a.f.a.a.a.a.i.a.i.i.u.i.i.i.i.a.a.a.i.a.a.a.i.i.i.a.u.t.u.u.u.u.u.u.u.u.u.u.u.u.t.u.t.t.t.t.t.t.u.t.t.u.u.t.t.t.t.r.r.t.t.t.t.t.t.t.t.t.u.u.u.u.u.u.u.t.u.u.u.u.u.u.u.a.i.i.u.a.t.u.u.u.u.u.u.u.u.u.i.i.i.u.a.i.a.a.a.d.k.k.k.k.g.l.h.h.l.h.z.h.g.J.l.G.h.l.z.G.l.z.z.h.h.A.z.A.l.A.l.l.l.l.l.l.l.l.h.h.h.h.l.g.h.g.g.k.g.k.k.k.k.k.z.z."
+};
diff --git a/images/button1hilite.xpm b/images/button1hilite.xpm
new file mode 100644 (file)
index 0000000..5edd153
--- /dev/null
@@ -0,0 +1,352 @@
+/* XPM */
+static char *button_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"157 90 256 2",
+"   c #035E00",
+".  c #0A5C00",
+"X  c #035A08",
+"o  c #145C00",
+"O  c #016302",
+"+  c #00640B",
+"@  c #016B01",
+"#  c #006A0B",
+"$  c #0A6700",
+"%  c #006A1A",
+"&  c #006614",
+"*  c #007302",
+"=  c #017C01",
+"-  c #007B0A",
+";  c #0A7C00",
+":  c #057505",
+">  c #007413",
+",  c #007917",
+"<  c #116200",
+"1  c #127A00",
+"2  c #137700",
+"3  c #006828",
+"4  c #006A30",
+"5  c #205900",
+"6  c #106A17",
+"7  c #25557D",
+"8  c #265C8B",
+"9  c #2A5D8C",
+"0  c #2A5A84",
+"q  c #295E90",
+"w  c #315E89",
+"e  c #335D83",
+"r  c #2C608D",
+"t  c #2C6292",
+"y  c #266090",
+"u  c #34638D",
+"i  c #38648E",
+"p  c #3A658A",
+"a  c #346491",
+"s  c #396590",
+"d  c #3B6892",
+"f  c #386796",
+"g  c #307EB1",
+"h  c #456789",
+"j  c #466B91",
+"k  c #4D7295",
+"l  c #4A77A0",
+"z  c #018301",
+"x  c #00830A",
+"c  c #008B01",
+"v  c #008B0A",
+"b  c #098200",
+"n  c #0A8B00",
+"m  c #008814",
+"M  c #019301",
+"N  c #00930A",
+"B  c #009B02",
+"V  c #009A0A",
+"C  c #0A9200",
+"Z  c #0B9B00",
+"A  c #009714",
+"S  c #128300",
+"D  c #148C00",
+"F  c #169900",
+"G  c #008B27",
+"H  c #00A302",
+"J  c #00A30A",
+"K  c #00AB02",
+"L  c #00AB0A",
+"P  c #0AA300",
+"I  c #0BAC00",
+"U  c #00AC15",
+"Y  c #00A313",
+"T  c #01B400",
+"R  c #00B30A",
+"E  c #00BA03",
+"W  c #00BA0B",
+"Q  c #0AB200",
+"!  c #0CBC00",
+"~  c #00B411",
+"^  c #00BA11",
+"/  c #00BA19",
+"(  c #15A700",
+")  c #16B700",
+"_  c #21A900",
+"`  c #23B500",
+"'  c #109911",
+"]  c #01C302",
+"[  c #00C20B",
+"{  c #00CB03",
+"}  c #00CC0A",
+"|  c #0AC300",
+" . c #0BCA00",
+".. c #00C416",
+"X. c #01D301",
+"o. c #00DB02",
+"O. c #00DC09",
+"+. c #08D602",
+"@. c #00D612",
+"#. c #16C900",
+"$. c #14D700",
+"%. c #00E302",
+"&. c #00EA02",
+"*. c #06E606",
+"=. c #00E817",
+"-. c #01F302",
+";. c #02FC03",
+":. c #02FD0C",
+">. c #0AFD02",
+",. c #09FF0A",
+"<. c #09F501",
+"1. c #0CFF13",
+"2. c #03FB16",
+"3. c #15FA04",
+"4. c #13FF15",
+"5. c #13FF1A",
+"6. c #1BFF13",
+"7. c #19FF1B",
+"8. c #14EC00",
+"9. c #00EA25",
+"0. c #01F725",
+"q. c #04FC34",
+"w. c #1CFF24",
+"e. c #17FF27",
+"r. c #11F936",
+"t. c #26C700",
+"y. c #25D900",
+"u. c #33CA00",
+"i. c #2AE800",
+"p. c #2CFC01",
+"a. c #28F804",
+"s. c #24FF13",
+"d. c #22FF19",
+"f. c #29FF17",
+"g. c #36FB05",
+"h. c #33FF14",
+"j. c #36E400",
+"k. c #24FF24",
+"l. c #2BFF2A",
+"z. c #25FF28",
+"x. c #2DFF32",
+"c. c #27FF38",
+"v. c #36FF28",
+"b. c #33FF32",
+"n. c #3AFF34",
+"m. c #3AFF3B",
+"M. c #33FF3B",
+"N. c #0DFE49",
+"B. c #3CFF42",
+"V. c #38FF4A",
+"C. c #38FF56",
+"Z. c #29FF43",
+"A. c #36FF6A",
+"S. c #44FF1A",
+"D. c #47FF29",
+"F. c #41FF3C",
+"G. c #47FF35",
+"H. c #57FF39",
+"J. c #60FF3C",
+"K. c #43FF43",
+"L. c #42FF4B",
+"P. c #4CFF44",
+"I. c #4CFF4A",
+"U. c #48FF54",
+"Y. c #56FF46",
+"T. c #53FF53",
+"R. c #53FF5B",
+"E. c #5AFF53",
+"W. c #5BFF5B",
+"Q. c #59FF65",
+"!. c #4DFF6B",
+"~. c #60FF5B",
+"^. c #66FF56",
+"/. c #64FF46",
+"(. c #64FF64",
+"). c #6BFF6C",
+"_. c #67FF67",
+"`. c #6DFF71",
+"'. c #64FF78",
+"]. c #73FF69",
+"[. c #72FF72",
+"{. c #73FF7B",
+"}. c #7AFF75",
+"|. c #7BFF7A",
+" X c #1E82B7",
+".X c #2985BB",
+"XX c #3589B8",
+"oX c #1C89C5",
+"OX c #1C89C9",
+"+X c #1B86C5",
+"@X c #1B8ED3",
+"#X c #248BC5",
+"$X c #248CCA",
+"%X c #2B8CC5",
+"&X c #2A8ECA",
+"*X c #2886C5",
+"=X c #2A8DD1",
+"-X c #268CD0",
+";X c #2590CB",
+":X c #2B91C6",
+">X c #2C90CC",
+",X c #2391C3",
+"<X c #2B92D2",
+"1X c #2794D4",
+"2X c #338CC7",
+"3X c #3292CC",
+"4X c #3994CD",
+"5X c #3997CC",
+"6X c #3493D1",
+"7X c #3D9AD1",
+"8X c #3897D1",
+"9X c #328FD2",
+"0X c #4699CC",
+"qX c #429CD1",
+"wX c #4094D2",
+"eX c #48A0D3",
+"rX c #4FA0CD",
+"tX c #79FF84",
+"yX c #76FF91",
+"uX c #71FFA4",
+"iX c #4D85A8",
+"pX c #84FF33",
+"aX c #84FF7A",
+"sX c #88FF6B",
+"dX c #98FF54",
+"fX c #B5B2FF",
+"gX c #84FF84",
+"hX c #8CFF85",
+"jX c #8BFF8A",
+"kX c #83FF8A",
+"lX c #87FF96",
+"zX c #96FF89",
+"xX c #96FF95",
+"cX c #9DFFB0",
+"vX c #A7FF96",
+"bX c #B5FF99",
+"nX c #A6FF87",
+"mX c #A8FFA6",
+"MX c #B4FFA3",
+"NX c #B9FFB5",
+"BX c #A3FFB1",
+"VX c #BDFFC5",
+"CX c #A2FFC6",
+"ZX c #CEFF9A",
+"AX c #CCFFB6",
+"SX c #FFF9A1",
+"DX c #D5FFD8",
+"FX c #CDFDCC",
+"GX c #D0FFE1",
+"HX c #EAFFC8",
+"JX c #E8FFE7",
+"KX c #FEF5FB",
+"LX c #FBFEF5",
+"PX c #FDFDFC",
+"IX c #F9FAF7",
+"UX c #F5EBF5",
+/* pixels */
+"9 9 9 9 8 8 9 9 9 9 9 9 9 q 9 9 q 9 9 t 9 q r 9 r r u u r r u u u u u t i i i d i s d d d d i d i d i d d s p h h h p h k k f.v.G.F.E.T.W.(.[.[.[.{.`.`.[.`.`.).`.`.).).`.)._.W.I.L.U.b.l.s.>.j j iXrXrXeXeXeXqXeXqXqXqXqXqX7X7X5X7X7X4X8X3X3X3X8X>X3X3X3X3X>X3X3X<X&X>X&X&X;X:X&X$X$X:X&X>X&X>X>X>X3X<X3X3X<X3X3X3X3X3X3X",
+"9 9 8 9 9 9 8 9 8 9 9 9 q q 9 9 9 9 9 9 9 9 9 u r a 9 u u u u u i w i u i a i d i s d i i d d i d d d d p j k l.F.W._.{.kXgX}.}.}.[.].]._._._.(.Q.(.~.~.~.(.W.~.~.~.W.W.W.W.Q.Q.Q.W.E.T.W.W.Q._.~.~./.E./.J.0XeXqXwXqXqX7XqX7X5X7X5X8X4X8X8X8X3X8X3X3X3X3X:X>X>X<X3X3X>X&X>X>X$X&X$X>X;X&X&X&X>X&X3X&X3X>X3X3X3X3X3X3X3X3X",
+"9 8 8 8 9 9 9 9 9 9 8 9 9 9 q 9 9 t 9 t q u u 9 r u 9 u a a t t 9 f a a i d p s d d i p p i d i d l l.K.].|.kXaX}.sX[.`._.(.(.~.W.E.T.T.I.P.I.P.P.K.L.L.L.L.L.L.V.L.L.B.L.L.B.B.L.B.K.P.I.I.I.I.U.U.Y.T.R.Q.R.Y.Y.J.Y.rXqX7X7X7X7X7X8X8X>X5X3X4X3X8X4X8X3X4X8X>X&X&X>X>X&X&X>X&X&X:X&X&X>X&X&X>X&X9X>X:X3X>X<X3X3X3X3X<X3X",
+"9 8 8 8 8 8 9 8 9 9 q 9 9 9 9 9 9 9 9 9 9 9 9 r u 9 u 9 a s 9 u d w w s d w i d f f d d j k G.W.}.jXgXgXtX[.).(.(.~.R.R.U.P.F.m.n.b.x.x.x.z.w.e.6.5.4.4.5.4.6.5.6.4.e.7.5.7.w.w.e.z.7.z.k.x.l.b.n.n.G.F.m.L.L.P.P.Y.!.L.Y.H.H.0X5X8X5X3X8X8X6X6X8X<X1X:X3X:X3X>X<X3X&X>X&X>X&X&X;X$X&X&X&X&X&X>X<X&X>X3X>X>X3X>X>X3X>X3X6X",
+"9 8 8 8 9 9 9 8 9 9 9 9 9 9 9 9 9 9 9 q u 9 r r 9 u 9 f 9 w s s w e d u f f f d p j l.E.|.jXjXtXtXtX`._.W.U.U.I.B.M.l.z.7.4.,.:.;.-.:.=.&.%.%.*.O.O.o.X.o.o.o.o.o.o.o.X.o.o.o.O.%.*.-.-.-.;.;.,.1.1.f.s.k.k.l.B.V.V.H.G.B.U.L.B.G.H.H.0X4X2X6X4X4X3X4X3X:X>X>X>X:X:X>X&X>X&X&X&X&X$X&X&X=X>X>X&X>X>X3X&X&X3X>X>X3X>X3X>X3X",
+"9 9 8 0 0 9 9 8 8 9 9 9 8 9 9 9 q w 9 q 9 q r 9 u 9 u 9 a a w w i w d u s j k n.].zXlXkXkXtX_.(.Q.R.L.B.b.z.e.5.:.;.&.%.o.O.{ { ] ] E { [ E E T T T T T T K K T K T T T T E T T E E E E ] { { X.o.o.o.*.-.>.:.1.e.c.w.c.C.C.A.B.G.G.V.m.G.D.4X4X3X3X3X3X4X6X>X:X;X&X>X&X&X$X&X&X$X>X&X>X&X&X>X&X&X&X&X>X>X&X>X&X&X>X>X3X>X",
+"8 9 8 8 9 8 8 9 9 9 9 9 t 9 9 9 9 r 9 9 9 9 u 9 9 u a 9 f a a f i i i h D.sXnXzXlXlX{.'.'.R.L.m.c.w.,.;.-.%.o.X.} { E E T T E T T T T T T T T T T Q T T T T Q T T T R T T E R T E R T T T T T T T E [ [ ] { { o.&.-.;.:.2.4.e.z.z.l.M.V.n.n.G.D.D.5X3X3X6X4X>X>X=X=X;X&X$X:X&X&X>X&X>X>X>X&X&X>X<X&X&X>X3X&X&X&X&X>X<X>X>X",
+"9 0 8 8 9 9 9 8 8 9 9 8 9 9 9 9 9 q q u t 9 9 u w w s 9 w w s w e s.'.lXzXnXsX).`.'.R.B.k.7.,.;.&.o.X.{ ] E E T T T E E E E E T T T T T Q T T T T T R T R E E T E T T R E E E T E E T T T T T T T T W E T E T E E | @.@.o.*.8.3.,.4.s.f.h.l.v.x.v.b.D.S.3X>X<X<X>X;X&X:X$X&X&X&X:X>X>X&X&X&X>X&X:X9X>X&X&X>X&X&X&X&X3X>X3X",
+"9 8 8 8 9 9 8 8 9 9 9 9 9 9 9 9 9 q 9 9 r 9 r 9 t w 9 i i w h n.aXzXlXjX{.(.(.U.m.d.4.;.-.&.X.| E E E E T T T T T T T E T E T T T T R E T T T T T T T T E T R T E R T K T T T T T T T T T T T Q T T T T T E W T T T Q Q ! | ] O.=.9.<.;.,.5.w.e.c.Z.v.l.v.v.XX:X%X%X&X&X&X$X&X>X&X>X>X>X&X&X&X&X&X>X&X&X&X&X&X&X:X&X>X>X3X",
+"8 8 8 9 8 9 9 9 8 9 9 9 9 9 9 9 9 9 u t 9 9 r u u t q 9 i H.jXjXhX|.{.Q.R.B.d.4.:.&.o.{ E T T T T T E T T E Q T T T T T T T T T E T T T R E E E E E R T R T T T E T T T T T T T T T Q T T T T T Q T I T T W ^ ^ E T T W W E T T E ! @.=.*.-.;.,.6.s.c.e.7.f.v.h.2X-X&X$X>X:X&X&X>X>X>X>X&X&X&X&X&X>X>X&X&X&X&X&X&X3X9X<X>X",
+"9 9 9 8 8 9 9 8 8 9 9 8 t 9 9 9 9 q 9 9 u w 9 9 q t h E.hXjXgX}.].E.F.b.4.;.&.o.] E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E E T T Q T T T T T T T T Q T T T T T T T E { { o.%.-.;.5.e.e.e.7.s.h.h.&X&X#X>X=X=X>X$X>X>X=X>X&X&X>X2X&X&X&X&X&X&X>X>X:X3X3X",
+"8 8 9 9 9 9 8 9 8 9 9 9 8 9 t 9 9 9 r 9 q q t e h G.zXxXhX}.).E.F.k.,.-.o.{ ] E T E T T T T T K T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T { } X.&.-.;.1.5.6.6.s.6.h.&X>X:X:X;X;X>X>X>X$X&X3X>X>X&X&X&X&X9X&X&X&X>X>X>X",
+"9 0 9 9 9 9 8 9 9 8 8 9 t 9 0 8 u 9 9 r 8 9 u G.jXjXgX}.~.U.M.6.;.&.X.{ E W E R W W T T T T T T K T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E E | X.o.-.:.:.1.5.1.1.s.h.<X>X>X:X&X>X>X:X3X3X>X$X&X&X&X&X&X<X>X>X3X>X>X",
+"9 8 9 9 9 9 9 9 9 9 8 9 8 9 r 8 8 r t 8 p s.].xXkX|.(.R.b.7.;.%.X.] E T T E T R E W T T T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T T T Q E T T T T T T T T T T T T T T T T T T T T Q E T T T T T T T T T T T E T T T T T Q T E ] X.O.&.-.2.>.,.,.,.s.h.3X3X>X>X&X>X:X$X&X>X>X>X&X3X>X&X3X&X&X>X&X",
+"8 9 9 9 9 9 9 9 9 9 9 9 8 t 8 8 t 8 0 k E.zXlXyX_.T.m.6.;.o.{ { [ R T T T T K T K T T T T T T T T T T T T T T T T T T T T E Q T T T T T T T Q E T T T T T T T T T E T T T T T T T T T T T T T T T T T T T E T T T T T T T Q T T T T T T T T T R T T R W E E { { o.8.-.;.;.,.q.:.a..X<X&X&X=X>X>X>X&X&X&X>X&X3X>X&X3X&X9X9X",
+"9 9 9 9 9 9 9 9 9 9 w 0 9 9 t t 0 u n.jXxXkX|.W.m.k.;.o.X.] T R E E T T Q T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T E T T E E E W W W R E E E  .O.*.8.<.2.2.;.3.h.2X3X>X>X<X>X&X&X>X&X<X&X>X<X&X&X&X:X",
+"9 9 9 9 9 9 9 9 r 0 w r t 8 8 e h _.xXgX|.(.L.z.,.%.X.] T T T E T T T T T T T T T T T K T T T T E T T T T T Q E T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T E E T T T T T T T T T T E E T T T T T T T T T T T T T T E R Q T T E T T K E } {  .8.<.:.2.-.<.a.XX2X3X>X&X&X>X>X>X>X>X>X3X>X&X>X>X",
+"r 9 9 9 9 9 9 q 9 9 9 r 8 q r s.aXxX|.[.U.x.,.%.o.] E T E T E T Q E E E E R R T T T T T T T T T T T T T T T T T T T E T T T T T T T T Q T T T T T T T T T T T T T Q T T T T E T T T T T T Q T T T T T T T T T T Q T T T T T T T T T E E E E T T T T I T T T T R E T R [ { X.o.*.*.<.<.*.8.g.3X>X&X3X&X>X>X3X>X>X&X<X>X>X>X",
+"9 q q q e 9 q q r 0 9 q y e Y.xXgX{._.F.7.;.%.{ ] Q T T T T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T E ] O.%.&.&.2.9.*.p.2X<X=X:X&X9X>X1X3X9X:X>X&X&X",
+"9 u 9 9 w w t q r r q 8 p ~.hXjX].E.l.,.&.X.[ T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T E ] { X.+.%.*.%.*.8..X>X$X<X:X3X:X<X#X3X>X&X:X",
+"9 t 9 9 q w q q t r 8 p [.xX|.~.Y.d.<.o.] E T T T T T T T T T T T T T T T T E E T T T T T T T T T T T T T T T T T E Q T T T T T T T T T T T T T T T T Q T T T T T E T T T E Q T T T T T T T T T Q T T T T E E T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T T T T E { { o.o.=.9.@.i.XX1X&X:X%X3X$X>X<X>X>X>X",
+"q 9 9 w w q q t r r j aXlXtXQ.F.6.-.X.] E T T T T T E T T T T T T T T T T T Q T T T Q T T T T T T T E T E T T T T T T T T T T T T T T Q T T T T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T E E T T T T T T T T T T E T T T T T T T T T T T T T T T E T [ X.X.*.*.{  .$.*X&X>X$X$X>X&X>X&X&X&X",
+"9 9 u 9 9 a q 9 e k aXaX|.R.B.5.*.} E T T T E T E R T T T T T T T T T T T T T T T T T T T T T T T T E Q T T T T T T T T E T T T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T T T T T K T T T T T T T ..[ {  .o.X.} { $..X&X=X$X#X&X&X&X&X&X",
+"9 w 9 9 w q w e k aXzX].U.l.1.%.} ..E E T E Q T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T E T T T T T T T T T T T T T T T T T T Q E E T T T T T T T T T T T T T T T T T T T T T T E Q T T T T T T T T T T T T T T T T T T T T W T R E X.@.@.| ! $.*X&X<X&X>X&X:X$X:X",
+"u 9 a 9 9 u w e |.aX`.R.x.;.o.] E T R E T T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E Q T T T T T T T T T T T T T T T T T E T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q E T T T T T T T T T T T T T T T T T T T T E E T T E E [ } { | ! W  ..X&X=X$X$X&X&X#X",
+"9 w 9 9 9 9 p ].aX[.'.c.;.O.] T Q Q W T T T Q T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q E T T T T T T T T Q T T T T Q T T T T T T T T T T T T T T E T E Q T T Q E T T T T T T T T T E T T T T T T T T T T T T T T T T T T Q T T T ( T ..W Q ) | @.} T T #.&X-X$X$X$X$X&X",
+"9 9 9 a 9 w Y.yX).E.v.>.X.] E E T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T E E ] @.T T / t.,X-X$X$X$X#X",
+"u 9 9 t 0 f.[.].Q.v.>.o.| E T E T E T T T T T T T T T T T T T T T Q E T T T T T T T T Q E E T T T T T T T Q E E T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T Q E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E ] { E T K E y.$X-X$X#X#X",
+"t 9 9 u j _.{.(.n.,.o.] T E R E T T T T E E Q T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T E E T T T T T T T T T T T T T E Q T T T T T T T T T T T T T T T T T E E E E Q Q U W g OX@X$X#X",
+"w u q w T.{._.B.4.&.{ [ W T T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T T E E T T T Q T T T T T T T T T T Q T T T T T T T T T T T T T T E T T T T T T T T T T T T K T T T T K Q T T I Q T ~ U #.#X-X$X&X",
+"a 9 q s.).(.L.x.-.X.[ R T T T T T R T T T T T T T T T T T T T T T T T T T T Q T T T T T T T T T E E T T T T T T T T T T T T T T T Q T T T T T T T T T Q T T T T T T T T T E E T T T T T T T T T T T T E E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T T T T T T T T W Q ! R K B K a.$XOXOX",
+"u u w W.W.R.l.1.o.E W E E E T K T E T T T T T T T T T T T T T T T T T T T T E E T T T T T T T T T Q T T T T T T T T T T T T T T T E T T T T T T T T T E T T T T T T T E T T Q T T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q E E T T T T T T T T T T T T T T T T T T T T T T T T T T T T ..T K Q Z J ! %X#XOX",
+"9 9 6.].T.m.7.O.{ T T T T T T T E R T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T / E I I P H B i.*XOX",
+"u u P.E.I.l.;.X.T E T T T Q I T E E T T T T T T T T T Q T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T T T E T T T T T T Q T T T T T T T R T T T T T T Q T T T T T T T Q T T T T T T T Q T T T T T T T T T T T T Q Q ..Q K ^ H C ) g &X",
+"p 3.E.P.M.5.o.{ E T T T T T T T Q T T T T T T T T T E E T T K T T E Q T T T E T Q ^ T T T T T T R T W E E T T E T W E E T E E T E T T T T T W E T I T T [ E ( E Q ^ T T T E T I E ..Q Q Q K Q Q E E E T W E T E T ..W E E I K ..T I T T Q E R W T Q E R [ W E T Q T T T T T T T T T T T T T T T T T T K T E T K H B C a.$X",
+"p l.I.m.z.-.X.E T T T T T T T T E T T T T T T T T T T E K Q E T K [ ~ ..R T R E T T T E E T T Q T T R W W T K Q T E T T E T T T K E R T T R K T T E E R L ^ K W E / T T R E T E R W R ..q.N.r.=.^ / T I W T L ..( K I T E Q E ~ R ) T T Q K E R T T T K T K T T T T T T T T T T T T T T T T T T T T T T E T T K H B c t.oX",
+"e m.K.b.1.&.{ T T E T T T T T T E T T T T T T T T T T E T T T T E 1.PXPXLXMXW R Q T R W R E T T Q T E E R E E R T T T T T T T K Q T T R R T T I E R I Q LXPXPXQ.Q E T R T T T W K ] E.JXPXPXKXPXJXR.T T ^ e.LXPXPX1.Q K E R k.hXT I T E E E T T T W Q K Q Q T T E E T T T T T T T T T T E Q T T T T T T R T T K H B M F *X",
+"8.B.n.k.;.o.E T T T T T T Q T T T T T T T T T Q T T T T T T T T R 7.PXPXPXmXU W T T W K T E T K T K T T E E R E T Q R E E E R T E T T E W Q T E R [ T I KXPXKXK.T P K T R T E R %.HXPXPXPXPXPXPXPXPXjXP W >.PXKXPXr.T E ;.mXPXMXE E K W R E T E E ^ T T K ! K T T T T T T T T T T T T T T T T T T T T K T T T E K B V b a.",
+"4.B.l.5.-.{ T T T T T T T T T T T T T T T T T E T T T T K R T T T 1.PXPXKXbXR R H K T T T E E E T T T T K T E W T Q T T T E R T T T [ K Q K T R R W ..^ PXPXPXU.T K K E E K E W mXPXKXPXPXZXSXPXKXPXPXY.K +.R.!./.#.K L MXPXPXZXR R K K L E Q Q T ^ / W K T E E T R T T T T T T T T T T T T T T T T T T T T T R H B v = y.",
+"s.M.z.1.&.{ T T T T T T T T T T T T T T T T T T T T T T E E R T K 1.KXKXKXZXV J P K K K T K R R 2.W.R.T.<.Q E W K T T { z.R.R.T.M.O.~ T Q Q T *.R.I.M.R KXPXPX!.P B B K T E K e.PXPXKXJX&.K M $.JXPXPXMXZ Q 1.N.:.] P ;.VXPXPXAX>.*.E 6.1.:.o.Q T [ q.e.6.-.R [ Q T T T T T T T T T T T T T T T T T T T T R T T K H N m ) ",
+"s.w.7.;.o.E T E T T T T T T T T T T T T T T T T T T T T E E T E T :.PXPXPXBXV M Z J K K T W @.mXPXLXPXPXIXmXO.~ E T n.JXPXPXPXPXPXPX'.T K T n.LXPXPXPXAXKXPXLXY.S V B K K T K (.PXPXPX'.V M c M 0.0.U z V <.PXKXLXq.B LXPXPXPXPXPXmXB JXPXPXNXK T R IXLXLXI.R ^ L Q T T T T T T E T T T T T T T T T T T T E E R K H M v F ",
+"f.w.4.;.O.T T T T T T T Q T T T T T T T T T T T T T T T R W E T T 1.KXKXPXvXc n M J R R ~ W VXPXKXKXPXPXKXPXFX..L O.LXPXPXPXKXKXPXPXPX&.K o.LXKXKXPXKXPXPXPXPXC.C G M H K R Q MXPXPXPX;.z M c ; b c b n N 2.PXPXPX<.J PXKXKXPXPXPXBXZ H.KXKXPXE K >.KXKXLX$.L ^ R T Q T T T T T T T T T T T T T T T T E R E R T K B c z b ",
+"5.4.>.-.X.T T T T T T T T T T T T T Q E T T T T T T E T T T E T R 1.PXPXPXbX; z C C L H E C.PXLXPXD.K Z.PXKXPXP.H h.ZXJXPXb.B &.PXKXPXY.U '.PXPXPXz.H }.PXKXPXM.z D M B K L R MXPXPXLX0.v b 2 z v v S n A q.PXPXLXq.A 0.NXPXPXVX&.$.A ) LXKXKXC.J _.PXPXzXP R ~ L T K T T T T T T T T T T T T T T T K T T T E ^ R H M = = ",
+"5.1.>.&.X.Q T R T T T T T T T T T T T T T T E T T T T T T R T T T 1.PXPXPXBXG A m Y H W K jXPXPXNXH D J NXPXPXkXU H J L X.e.!.GXPXPXPXH.N mXKXKXAXB B K PXPXPXC.z z v H H E R mXPXKXLX0.m x 1 c W v M V V 2.PXPXPXN.N C bXPXPXxXz z A S zXPXPX{.J FXPXPX6.H B J L L K T T T T T T T T T T T T Q T T T T T T R W L H c = = ",
+"1.;.>.&.{ T T E T T T T T T T T T T T T T T T T T T T T E R T T K 1.PXPXPXxX; z z C H R Q MXKXPXbXH C N BXPXPXmXA V U.DXIXPXIXHXKXKXPXH.N bXIXKXbXN B c PXPXPXA.- v V M Z K R U.PXKXKXB.m m v z BXJX`.c.B -.PXPXLX2.n z bXPXPXcX= = - n ,.PXKXJXO.LXPXJXJ B c B H K K K T T T T T T T T T T T E T T T K T T E R R B c = * ",
+":.;.;.%.X.T E E T Q T T T T T T T T T T T T T T T T T K E E T T T 1.PXPXPXNX%.9.=.;.;.2.I sXKXPXFXM z G GXPXPXdXv H.PXKXUXZ.K H LXPXPXM.v aXPXPXFXv z Q PXPXIXC.x x A B Z Q E r.PXKXPXJX^ v z l.LXPXKXAXB :.KXPXPX*.N z BXIXPXBXx = x b v GXPXPXcXPXIXR.x N M C Z H K T K T T T Q T T T E T T T T T T T T T T W R B c = @ ",
+":.-.-.%.] T R E T T T T T T T T T T T T T T T T T T E T E E T T E ,.PXKXKXPXPXPXPXLXKXPXK B.PXPXPXsX9.uXPXKXPXp.c ZXKXPXHXg.>.vXLXPXPXv.x x.PXPXPX'.*.AXPXKXPXB.- c A B P K E ~ BXPXKXPXPXxXNXPXPXPXPXx.Y q.PXPXPX-.x x xXPXPXFX+.| = n N !.KXKXPXPXPXX.v c n n Z K K K T T T T T T T T T T T T T T T T K T T W K C c = @ ",
+"-.-.-.o.] T T T T T T T T T T T T T T T T T T T T T T T E T E T K 5.PXPXPXPXPXPXPXPXKXPXJ U tXPXKXPXPXPXKXPX].z x ].PXPXPXPXPXPXUXKXPXpX= c FXPXKXPXPXPXUXKXKXc.= z v J P P K ~ W AXPXPXKXKXKXKXKXPXtXV H -.PXPXPX9.b = R.PXKXKXLXdXz n N ~ PXKXPXPXNX= x v c M B H T K T T T T T T T T T T T T T T Q T Q T T R K M c @ @ ",
+"-.%.&.o.] E E E T Q T T T T T T T T T T T T T T T T T T E T T T E ,.PXPXPXPXKXPXKXKXPXLXB V B F.JXPXLXLXJXG.= x m J mXPXKXPXGXq.yXPXPXvX= 2 #.DXPXPXPXc.mXIXPXV.z ; M V K Q P T J Q uXJXPXPXPXPXJXC.n Z n ;.LXPXPX&.; c E FXPXPXPXxXm c B V ].PXPXPXb.= ; z v V L P K T T K T Q T T T T T T T T T T T T T T T R H C z @ z ",
+"&.o.O.O.{ E E E T T T T T T T T T T T T T T T T T T T T E E R T R K H V M z x x = z ; N C n M n n =.y.q.x v z b x z m } 8.X.; = = * , = = ; ; x X.=.M c = z x x = b c J L K Q K R H N n  .9.9.+.b c M z N A N A 1 b z c m v 2.&.=.G v C B V hXPXPXPXM : ; = A Y K K T T T T T T T T T T T T T T T T E T T T E T K n z @ v ",
+"o.o.o.X.{ E K T T K T T T T T T T T T T T T T T T T T T T T T T T T K H M z z = x x z z c c M N c v z z z z z z c v M c c c z z x x - x = z z c c c z z z z z z z c N V K K T K T J B M c z z z z v c v c M M c M c c c M M M c c z n kXCXfXPXPXPX].= - = z M B K K T T T T T T T T T T T T T T T T T Q T T T K B M ; O ( ",
+"+.X.X.X.{ E T K Q T T T T T Q T T T T T T T T T T T T T T T T T T K K H B c z z z z z c c M M M M M c c z c z c c M M M M c c z z z x z c c c c c c v c v z z z c c B J K T T T R H H B M c z c z z c c c M B M M c M N M M B M c c z W.PXPXKXPXJXT = = z c C H K E T T T T T T T T T T T T T T T T K T T T T K B z * + t.",
+"+.E E { } E T T T T T T T T T T T T T T T T T T T T T T Q E T T T T K K B M c c c c c c M M B B B B M M M M c M M B B V B M N M v v M c M M M B M C M M c M c c M B B H K K T T T K L J B M M c v v c M V V B V V B M B B B V V B M M -.zXvXbX^.E = = = z c B H K R T T T T T Q T T T T T T Q T T T T T T E K H M = @ O i.",
+"p | E E E E T E T T T T T T T T T T T T T T E T T T T T T T T T T T K K K B B B M M M Z M V B J H H B V M C B B J H K K H J B V B B B V B B H H H H J V B M B B V B K K T K T T E K R K H J V B B B B B H H K H K H J J L H K H J B B H V J J V c c z z c M H K K E T T T T T T T T T T T T E T T T T T T K K J z = 4 ;  X",
+"p { T T E E T E T T T T T T T T T T T T T T E Q T T T T T T T T K T K T K K H H H H H H H K K K K K K K H H H H L K K K K K H H H K H H K K K L K K K H H H H H L K K T T T T T R T R K K H K H H H J H H K K T K K K K K K K K H K H H L V H N M z z c c B H K T E T T T T T T T T T T T T T T T T T T T T K M x @ 4 _ oX",
+"i +.K K E T T E T T T T T T T T T T T T T T T T T T T T T T T T T T K T R K T K K K K K K K K K T K K K K K K K K R E T K K K K K K K K K K T K T K K K K K K K K T K K T K T T T T E R T K K K K K K K T K T K R T K R R T T K K K H T H P Z M M c c M B J K E T T T T T T T T T T T T T T T T T T T T T T H c * O @ j.oX",
+"i u E K T T T T T T T T T T T T T T T T T T T T T T T T T T T T T K Q T E E R R T K T R E R T T T K T T T K K T T T T T T T K T K T K T K T E E T E E R K K T R E E K T T T E T K T E E T K K T R T K R T T T T T T E E T T T K T K T K B I B B M M B V H K K T T I T T T T T T T T T T T T T T T T T K T K M x @ O ( oXoX",
+"u i X.T K K K T E R T T T T T T T T T T T T E Q T T T T T T T T T T I T T E T T T T E T E T T T R T T T T T T T E R K T T T Q T T T T T T T E T T R E T T T T T E T T Q T T T T T T R T T T T T T T E T T T T K T T E K K T T T T T T R E ~ R J H B J H K R K T Q Q T T T T T T T T T T T T T T T T T T K H c * O   $.oX@X",
+"a i p Q K L K K T R T T K T T T T T T E T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T E Q T T T T T T T T T T T T T T T T T T R E E R K K K K K K T K T T K T T T T T T T T T T T T T T T T E R T F M = # + D +XOX+X",
+"a i u +.B K K K T E T T T E E T T T Q E T T T T T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T E T R T R K K K T T K T T T T T T T T T T T T T K T T T T T T T T H H z # % # i.OX+X+X",
+"s a a d Q Z H L K T T T T T T E T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T E T T T T T E T T T T T T T T T T T T T T T T T T E E Q T T T T T T T T T T T T T T T T T T T T T T T T T T Q T T T T E R T R T T T T T K T T T T T T T T T T T T T T T T T T T T T T L Z v : # 3 _ -X+XOX+X",
+"i i a i r P V Y L P R T T R R E R E T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T K T T T T T T T T K T T T T T T T T T T T T T T T K J n : + 3 $ #X+XOX+X+X",
+"i i f a p +.B J V P T T E E R T T T T T T T T T T T T T T E Q T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T K H M m o O % j.#X+X#XOXOX",
+"s i a a p p ! M M B H K R T E T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T Q T T T T T T T T T T T T T T T T T T R E T E E T E T T T T T T T T T E T T T K K H M ; % o o #.$X+X+XOXOX#X",
+"a i i i s a i Q B A B B K R T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T T Q E T T T T T T T T Q E T T T T T T T T T T T T T T E E T T T T T T T T T T T T E T E T T T T T T T T T T T T T T T E E Q T T T T T T T T E E E R T E E T T T T T T T T T T T T T T K H N z $ @ $ F $X*X@XOXOXOX$X",
+"a i i j a a s e Z A C B H K K T K T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T E T T T T T T T T E T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T T E E E T T T R E R E T T T T T T T T E T T K H M z @ + 5 Z *XOX$Xg @XOXOXOX",
+"s s a a s s u d e Z v N B B H T T T T T T Q T T E Q T T T T Q T T T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T E T T T T T T T T T T T E E T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T T T T T K T T K T T T E E E E R E T T K P B c 2 $ + . S .X@X+X$X+X$X+X$X$X",
+"s s a a s s i i i e B c z B H H K K T T T T T T T T T T T T T T T T T T T Q E T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T Q T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T R T W E E T R L L v ; # + $ S g #XOXOXoX$XOX*X$X#X",
+"s s p s i i a u u i w C z v N B B T K T T T K T T T T T T T T K T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T E Q T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T E T T T T T T T T T T T T T T R E R E K K B U v = % 4 < ( g &X$XoX#X#X$X@X*X$X$X",
+"s s i s i a s a u u a e P z z N H B L K R E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T T E E T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T E Q T T T T T T T T Q E T T T T T T T T T Q T T T T T T T K K B c 2 * & o 5 ( *X@XOX$X#X#XoXOXOX$XOX#X",
+"i i i i s a u f s t u i i Q z v v N B H K T T T T T T T T T K T T T T T T T T T T T T T T T T T T T E T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T E E T T T T T T T T T Q T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T K K B c ; O o < O t.&X=XOX>X;X$X$XOX$X*X$X$XOX",
+"s i d i s s a r u u i a q s | c z = c M B H K T E T T T T T T T T T T T T T T T T T Q E T T T T T Q E T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T T E E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T K L H V z * X @ X ; i.6X*X&X:X#X#X&XOX$X$X#X$X$X#X",
+"i s d i s s a s a u r a a u p X.n = ; z c M B H K K T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T E T T T E T T T T T T T T T T T T T T T T T T T T T K R K H V v = @ O O X ( g.&X9X=X%X*X&X-X&X&X$X$X#X$XOX$X",
+"s s u a s a i a p i s u p p u a p ( * = = c M B H K T K T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T K B N z * O O O $ t.&X&X&X:X&X1X>X-X-X&X$X&X$X$X$X$X$X",
+"i i i i a s i i u a u u u u u u i w #.C * = v v V V H K K R E T T T E W T R E E E R T T T T E T T E T T T T T T T T T T E T T T T T T T T E T T T T T T T T T E T T T T T Q T T T T T T T T E Q T T T T T T T T T T E W W T T T T T T E E E T E T T T W R T K K P Z D b : + % & : M g.&X&X&X&X&X>X&X&X&X>X&X:X*X&X*X$X$X$X",
+"i i i a s a u u u d u u u a u u u u p p Q ; * - = N M B H H K R E R T T T T T T T T T R T T T K T T T T T T T T T T T T Q T T T T T T T Q E T T T T T T T T Q E T T T T E E T T T T T T T T E T T T T T T T T T T T T T T T T T T T T K T T T Q T T W T Q ~ U H M - m # O O X ; y.&X%X&X2X&X:X&X&X&X&X>X&X&X&X&X*X$X$X$X$X",
+"s i u u a u i u a u u u u u u u u u a w p $.B = * * z v M B H K K R K T T T T T T K T E E T E T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E Q T T T T T T T E T T T T T T T T T T T T T T T Q T T K Q Q T K I L U J C v - * 4 % O < ( g.1X>X&X>X>X&X&X&X&X&X&X&X&X&X&X&X:X&X$X&X$X",
+"s s s i i i i s i i i u i u u u u a a f a w p #.c $ * * z v M V H K K T T K T T T T T E E T T T T T T T T T T T T T T T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T E T T T T T T T T T T Q E T T T T T T T T T R E R E T T T T K K K L Z C z * @ O . @ < _ p.1X>X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X-X&X$X",
+"i s i s s i i s i i i a a i i u u i i a a a u p p #.b ; @ * - z N B V H L K K T T E T T T T T T T T T T T T E Q T T T Q T T T T T T T T T T T T E Q T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T E E T T E E R K H H B D z > % + < . + D i.&X<X3X2X&X<X&X&X&X>X>X;X&X$X$X&X&X&X&X&X&X&X&X&X;X",
+"s s s s s s u i s i u u i u i i i a d s a f a a i s s | c * @ - - - v N B J H K R R T R T K T T T T T T T T T T T T T E T T T T T T T T T T T T T T T T T T T T E E T T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T T T E R K H J M c = $ # % 3 4 % C j.9X2X4X&X%X2X%X;X&X>X&X&X;X$X&X&X&X&X&X&X&X&X$X&X:X&X;X",
+"i i s s s s i i u i s u u a p a i u u i i u a a u s a f i  .M * $ * : = c c M M J H K K K T T T T T T T T T T T T T T T T T T T E E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T H K J B M c z * @ O + $   + ( p.3X&X&X1X>X<X3X&X>X$X:X&X&X&X>X&X$X&X&X&X&X&X&X&X>X:X:X$X;X",
+"s s i s i s s i i s a s s u u a u a d a i s s s a a p i u a i  .P $ $ @ $ * = z c M H V H K K K K T T T T T T T T T T T T T T T T Q T T T T T T T T T T T T T T T T T T T T T T T Q T T T T T Q T T T Q T T T Q T T T T K K H B B M c z = $ O O O O 4 $ ` g.,X3X%X3X6X%X>X<X=X6X=X&X&X&X&X:X&X-X&X&X&X&X&X&X&X&X&X>X$X$X;X",
+"i i s s s s i u i s u a u a i u u i i i i i i i i i d i i u i u i $.T z O & # * * = z c M M B B H H K T T T T T T T T T T Q T T T T T T T T T E E K E E T E R E E T I Q T Q T T E E ^ [ W [ R W W E / W T T T K K K L U J B M z = = > & + O . O . F y.h.3X:X>X>X&X9X&X&X3X>X>X>X&X&X&X>X&X*X$X&X&X&X&X&X&X&X&X&X&X&X&X$X;X",
+"i i d i i s s s i i u a i i i i i a u i s i u s a i i i i u u u i w t i $.P * O @ @ * * = = z z c M V V J H H L K R R W W R W W W [ T T T T R E T T R T E E T T T R E R R E R E W W I Q Q I I I I I K K K K K L V N c n z $ $ @ > O O O   o 2 t.p.&X*X2X>X>X>X>X9X&X3X3X:X>X>X>X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X&X>X:X:X",
+"s s s s i s i i d u d u i u d u u u s s i i i a i i i i s i u u u u u t u u u  .Z $ & O O @ * = = = = z c c M M B H B P H I I K P K T T K K T T T T T T T T T T T T ^ ^ R R T E K K R K L K R K J H Z B M c z x x m = @ O O O $   O o S ` p.&X-X&X&X3X:X$X>X>X;X6X3X>X&X>X>X>X>X:X&X&X&X&X&X&X&X&X&X&X&X&X&X&X<X>X>X&X&X>X",
+"i s s i i s i i u u u u a u u u i i i i i i i i i i i i i i u u u u p p r t t r 9 w #.P b O   O O @ : : * = = ; z z v v v N N N B V B H J H H K H K H K K H K K K H K H K P P Z Z C B M B B v c v v 2 = = , , > @   . O % % % $ D u.p.2X%X2X>X&X&X&X$X$X;X>X>X;X:X%X>X>X&X&X&X&X&X>X&X>X>X&X>X&X&X&X&X&X&X&X3X&X>X>X&X>X>X",
+"d d i s s i i s d d d u u d u d u a i a s i i i i i s i s u u u p u u u u r u t r r w u 9 0 ! Z = O O O O O @ # @ @ - - = - x z z z z z v z c c c v M v M c N c c M n n b z z z z z x x x - : > > > % % + O O       % O S ` i.%X3X&X=X=X&X&X>X:X$X>X-X;X&X;X;X>X&X&X&X>X&X&X&X&X&X>X&X&X&X&X>X&X&X&X&X%X&X:X>X>X>X>X>X>X:X",
+"i i i s s s i i u p u u u u u u i i i i i i i i i a i d i u u u r i t a u r r u u q u 9 w w e 8 y y Q B n = $ O O O $ . O $ O $ $ $ * @ * * * - - - * * = * * * * * * = * - - , > > O $ O . O < . < O + + X @ S _ u.j.XX3X>X2X3X2X:X<X&X9X%X%X>X;X$X;X$X&X-X>X>X&X<X>X>X&X&X&X:X&X;X&X&X&X&X&X&X&X&X&X&X&X3X<X3X3X>X>X>X>X",
+"i u i d u p u d u d u d u d u u i i i a i i a i i s i i i u u u u u s a a w u u q t 9 q q q a q 9 9 9 9 9 w 0 ! I P x = * # + + # + @   O O O O @ # + O + O + + + + & & & + # O O $ 4 % & #   O . n P ) i.p.2X7X6X6X:X4X>X>X<X1X>X3X3X:X>X>X&X&X<X&X&X&X&X=X&X&X#X>X>X&X>X&X&X$X&X$X&X&X&X&X&X&X&X3X&X&X3X>X3X>X3X:X<X3X:X",
+"u p d u d d d d u p u u u u u u a u i i i i i i i i u i i u u u u a u w a a 9 9 u e u 9 9 w 9 u 9 9 q 9 9 9 9 8 8 8 r 8 0 7 ) Q ( Z Z z z ; @ O O O + O O O O O O O + + O $ ; D F F #.t.y.j.p.0XqXqX7X7X4X4X8X4X6X6X6X6X>X>X3X3X&X&X>X1X>X$X>X&X:X&X&X&X=X$X&X=X>X$X&X&X&X;X:X$X&X&X&X&X&X&X&X&X&X&X9X<X:X3X>X3X3X:X:X<X>X"
+};
diff --git a/images/button2hilite.xpm b/images/button2hilite.xpm
new file mode 100644 (file)
index 0000000..bf07937
--- /dev/null
@@ -0,0 +1,352 @@
+/* XPM */
+static char *button_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"157 90 256 2",
+"   c #045D02",
+".  c #135900",
+"X  c #016303",
+"o  c #00630B",
+"O  c #016A01",
+"+  c #00690A",
+"@  c #0A6700",
+"#  c #006813",
+"$  c #017301",
+"%  c #017C01",
+"&  c #007C0B",
+"*  c #0A7C00",
+"=  c #047306",
+"-  c #007712",
+";  c #137A00",
+":  c #166200",
+">  c #006B2E",
+",  c #247400",
+"<  c #2C557C",
+"1  c #265C8B",
+"2  c #2B5B85",
+"3  c #2A5D8C",
+"4  c #2C5782",
+"5  c #275E90",
+"6  c #315E89",
+"7  c #325C84",
+"8  c #2D608D",
+"9  c #2C6191",
+"0  c #266092",
+"q  c #32618D",
+"w  c #39638A",
+"e  c #336491",
+"r  c #396690",
+"t  c #396893",
+"y  c #476D92",
+"u  c #018302",
+"i  c #008309",
+"p  c #018B02",
+"a  c #008B0A",
+"s  c #0A8200",
+"d  c #098B00",
+"f  c #008412",
+"g  c #008A16",
+"h  c #019301",
+"j  c #00920A",
+"k  c #019B01",
+"l  c #009B0A",
+"z  c #099300",
+"x  c #0B9B00",
+"c  c #009211",
+"v  c #009A12",
+"b  c #00961A",
+"n  c #129600",
+"m  c #118800",
+"M  c #00902E",
+"N  c #01A301",
+"B  c #00A30B",
+"V  c #00AB01",
+"C  c #00AB0A",
+"Z  c #09A300",
+"A  c #0BAB00",
+"S  c #00A312",
+"D  c #00AB14",
+"F  c #00A91C",
+"G  c #01B400",
+"H  c #00B30A",
+"J  c #00BA02",
+"K  c #00BA0B",
+"L  c #09B200",
+"P  c #0BBB00",
+"I  c #00B412",
+"U  c #00BA11",
+"Y  c #00BA1C",
+"T  c #14A800",
+"R  c #17B700",
+"E  c #00AC27",
+"W  c #2AA90D",
+"Q  c #01C302",
+"!  c #00C20B",
+"~  c #00CB02",
+"^  c #0CC400",
+"/  c #0CCC00",
+"(  c #00C90B",
+")  c #00C613",
+"_  c #01D202",
+"`  c #00DB01",
+"'  c #06D605",
+"]  c #00D713",
+"[  c #13C800",
+"{  c #15D900",
+"}  c #01E302",
+"|  c #00E40C",
+" . c #01EA02",
+".. c #0AE200",
+"X. c #04EB06",
+"o. c #00E815",
+"O. c #00F302",
+"+. c #01FD03",
+"@. c #01FD0A",
+"#. c #0BFD03",
+"$. c #0CFF0C",
+"%. c #05F304",
+"&. c #0BFF13",
+"*. c #0CFF1C",
+"=. c #00F515",
+"-. c #16E800",
+";. c #13FC01",
+":. c #15FA06",
+">. c #14FF13",
+",. c #14FF1A",
+"<. c #1AFF1A",
+"1. c #1CFF14",
+"2. c #00E726",
+"3. c #02FB2A",
+"4. c #12FF23",
+"5. c #1BFF23",
+"6. c #18FF2B",
+"7. c #15FF34",
+"8. c #25D500",
+"9. c #23E600",
+"0. c #26FC05",
+"q. c #27FF17",
+"w. c #33FC08",
+"e. c #35FA11",
+"r. c #23FF24",
+"t. c #28FF28",
+"y. c #2BFF32",
+"u. c #29FF3A",
+"i. c #32FF2C",
+"p. c #38FF25",
+"a. c #34FF33",
+"s. c #3BFF3B",
+"d. c #37FF37",
+"f. c #2AE93D",
+"g. c #00CF2F",
+"h. c #29FF47",
+"j. c #3BFF42",
+"k. c #3AFF4A",
+"l. c #39FF55",
+"z. c #2FFF5B",
+"x. c #38FF74",
+"c. c #18FF4E",
+"v. c #42FF14",
+"b. c #40FF01",
+"n. c #47FF29",
+"m. c #42FF33",
+"M. c #49FF3B",
+"N. c #54FF28",
+"B. c #52FF33",
+"V. c #56FF38",
+"C. c #67FF33",
+"Z. c #41FF43",
+"A. c #42FF49",
+"S. c #4BFF44",
+"D. c #4BFF4B",
+"F. c #4BFF53",
+"G. c #4BFF58",
+"H. c #56FE48",
+"J. c #53FF54",
+"K. c #54FF5A",
+"L. c #5BFF5B",
+"P. c #5CFF54",
+"I. c #49FF74",
+"U. c #5CFF64",
+"Y. c #56FF67",
+"T. c #5AFF75",
+"R. c #45FF62",
+"E. c #64FF47",
+"W. c #62FF5B",
+"Q. c #68FF54",
+"!. c #71FF51",
+"~. c #64FF63",
+"^. c #6CFF6C",
+"/. c #67FF67",
+"(. c #6AFF73",
+"). c #74FF72",
+"_. c #7CFF7C",
+"`. c #75FF77",
+"'. c #70FF6A",
+"]. c #3B99CE",
+"[. c #3D9AD0",
+"{. c #3A97D0",
+"}. c #419ACE",
+"|. c #4B9AC9",
+" X c #439CD2",
+".X c #499ED3",
+"XX c #489DD8",
+"oX c #549CC9",
+"OX c #519ED4",
+"+X c #48A1CB",
+"@X c #44A0D3",
+"#X c #4AA1D4",
+"$X c #4AA2D9",
+"%X c #43A2D8",
+"&X c #58A4CC",
+"*X c #51A3D4",
+"=X c #5BAAD4",
+"-X c #5CABDA",
+";X c #57A7D8",
+":X c #5DB1DA",
+">X c #5DADE1",
+",X c #63ADDB",
+"<X c #66ACD6",
+"1X c #65B0DB",
+"2X c #6BB2DD",
+"3X c #62B0D7",
+"4X c #70B5DE",
+"5X c #74B8DF",
+"6X c #67A2CB",
+"7X c #66B2E1",
+"8X c #72B6E0",
+"9X c #65AEE1",
+"0X c #78FF84",
+"qX c #78FF95",
+"wX c #55FF9D",
+"eX c #34FF99",
+"rX c #83FF7C",
+"tX c #81FF6D",
+"yX c #AEEA79",
+"uX c #8CFF84",
+"iX c #8AFF8B",
+"pX c #83FF85",
+"aX c #8AFF94",
+"sX c #93FF8C",
+"dX c #98FF96",
+"fX c #9AFFA9",
+"gX c #93FFB1",
+"hX c #A8FF99",
+"jX c #B6FF96",
+"kX c #B1FF8B",
+"lX c #A6FFA8",
+"zX c #A6FFB8",
+"xX c #B8FFA2",
+"cX c #B9FFB7",
+"vX c #A7FFC7",
+"bX c #BAFEC5",
+"nX c #B0FFED",
+"mX c #93FFCB",
+"MX c #CCFD98",
+"NX c #C6FFBA",
+"BX c #CEF7AE",
+"VX c #E6FBA2",
+"CX c #C7FFC7",
+"ZX c #D4FFD7",
+"AX c #D3FFCE",
+"SX c #D1FFF0",
+"DX c #EDFFCB",
+"FX c #EAFFE8",
+"GX c #EAFDF5",
+"HX c #F4FFEB",
+"JX c #FEF5FA",
+"KX c #FAFEF5",
+"LX c #FDFDFC",
+"PX c #F7FBF6",
+"IX c #F1E5F9",
+"UX c #F9B9F2",
+/* pixels */
+"8 8 q 6 8 q 6 9 6 3 e 6 8 q 9 q 9 9 6 9 9 q q q q q q e e w q q q q q t e e r q q q e e 9 w q q 6 w 3 9 9 6 9 9 5 5 3 w r y 1.p.n.m.P.J.P.~.).).).^.).^.^.).).^.).^.).^.^.^.^.~.W.W.Q.Q.Q.E.E.&X*X#X#X#X#X#X#X.X.X@X.X#X#X@X.X#X.X.X@X@X X#X.X.X.X.X@X.X@X+X@X@X.X.X@X@X X X X]. X X].}.].}.[.].}.[.}.[.}. X[.[.[.{.].{.{.",
+"3 8 8 6 q 3 9 6 e e 3 e q 8 6 9 q 6 q 6 q q q q q q e e 6 e e e r r t q w w q e e e w 8 w 9 e 5 3 9 6 w 6 w y q.m.J.~.`.0XrX`.`.(.`.).^.^.^.^.~./.~.L.L.L.L.L.L.L.L.U.U.L.L.U.L.W.P.Q.Q.Q.W.P.U.Y./.P.H.E.V.oX*X#X$X@X@X%X@X@X#X@X@X.X.X.X X.X@X@X X.X.X.X@X.X.X.X.X@X+X X X.X].}.[.[.@X X[. X X X X X[. X[.[. X X].].].{.",
+"8 8 8 8 8 8 3 q e 3 6 e 8 6 8 6 q 9 3 q q q e q q q e e w e e e w q w w t 9 9 t w w e q e w 6 w t y i.M./.rXrXrX`.`.^.).^.^.U.U.L.K.L.J.F.F.A.Z.k.Z.A.k.Z.k.A.A.k.Z.A.k.A.k.A.A.j.k.F.A.F.G.Y.G.I.T.F.Y.T.T.Y.Y.J.D.E.oX&XOXOX#X.X@XOX.X X%X%X@X+X}..X.XXXOX.X#X@X@X.X.X@X.X}. X@X}.@X X X X X X X X X X X X X X X[.].].{.",
+"8 3 8 3 3 8 8 3 3 3 3 3 8 6 6 9 q q 3 q 9 q q q q q e 6 e e w w r q r q 9 e t t w r q q w y p.W._.sXrX0X_.`.^./.~.L.L.J.D.M.M.k.j.d.y.y.r.r.r.5.<.5.<.,.<.<.,.<.,.<.<.<.<.,.<.4.5.y.h.h.h.t.i.i.n.n.j.j.j.M.M.S.H.M.H.S.H.V.V.oX.XXX@X X@X@X.X.X.X.X.X.XXX.X#X#X#X#X.X#X@X.X@X X X X X X@X X X@X@X X X X X X@X[.].].].].{.",
+"8 3 8 3 3 8 3 8 6 3 3 3 6 3 3 6 q 3 q q 9 q q q q w 6 e q w w e t r w r t w 6 r w r p.H.rXuXuX_.).^.(.^.P.F.D.S.d.a.i.r.5.,.&.&.@.=.O. .} } } ` ` _ ` ` ` ` ` ` ` _ ` ` ` } ` } }  . .O.%.O.@.#.$.>.>.q.p.p.p.n.m.m.A.A.M.S.M.S.V.V.C.oXoX.X.XXX.X.X X@X#XXX#X$X#X#X#X#X.X@X.X@X X@X X X X@X X X X.X X}. X X[. X}.].].].].",
+"3 8 3 8 8 3 2 3 e 3 e 6 3 q 6 3 q q q q q q q q q e e e e e r r q w r 8 e r y i./.rXuXuXrX)./.'.Q.F.A.j.a.r.<.$.@.O. ...} _ _ ~ ~ ~ Q ! K J J J J G J V G G G G J G G G J G G J J K P P Q ~ ~ ' ] | {  .@.3.3.4.7.6.u.h.u.h.d.s.s.s.s.M.M.V.oX.X X@X@X X@X@X#X.X#X*X#X#X#X#X#X.X.X.X X.X.X.X.X X.X@X X@X X X@X[. X].].].].",
+"8 3 8 3 8 3 8 8 9 3 3 6 9 6 8 q 3 6 9 9 q q 9 q q e q q w w r e w t 9 y p.'.aXiX0XrX0X(./.K.k.d.i.<.$.+.O.} _ _ ~ ~ K J G G J G G G G G G G G G G J J J V J J V V K G G C G G G G G H K G G J J J Q ( ! Q ^ [ { { O.+.+.&.,.<.t.u.y.d.u.s.d.n.B.B.|.OX|.#X@X$X#X*X#X*X#X#X#X#X.X.X.X.X.X X.X.X.X.X X@X}. X X X X X].{.].{.",
+"3 8 3 8 3 3 8 8 3 3 3 e 3 3 8 q 9 q q q q q q q e e w e e r r 6 r q.J.sXdXrXrX)./.L.G.k.y.t.&.+.X.` _ ~ Q J J G J G J G G G J G G G V K K J G K J J V J J G G K J G G G G G G G G G G G G G G V G G G G J K U K ( Q Q / ` } O.+.&.4.<.5.r.t.y.i.i.i.B.B..X.X$X$X#X*X#X#X#X#X#X#X X@X.X@X.X@X.X X.X@X.X@X X X X X[.].].].{.",
+"8 3 8 8 3 e 3 8 3 9 8 8 8 2 8 q q 8 8 8 8 9 6 e 6 r q e e q y a._.gXpX_._.^.U.D.j.t.>.+. .} _ Q ! K G G G G P G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G J P G G G G G G G G G G G G G G G G Q ! ! Q ~ _ }  .O.+.$.>.<.r.t.t.z.t.n.N.oX+X#X$X*X$X$X$X#X#X.X@X.X#X.X#X#X#X.X+X#X@X X X X X}.}.].].].",
+"3 8 8 8 3 9 3 9 8 3 6 8 8 8 8 8 8 8 1 e q w w 9 e 9 w 6 y M.uXdXiX0X^.~.J.j.t.>.O.} ` _ Q J J G G G G G G G J G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G K G K V G J J Q ~ ` ..O.@.#.>.<.q.r.6.t.i.n.oX*X$X$X*XOX*X%X$X@X.X#X@X#X$X#X.X.X.X.X.X@X X[.].}.].].].",
+"3 8 3 8 9 3 3 9 9 3 3 3 3 8 3 8 8 8 w w 9 q e 9 9 e y P.iXiXaX0X/.L.M.y.>.+. .` ~ Q J G G G G G G G G G G G G G G G G G G G J P G G G G G G G G G G G G G G G G G G G G G P J G G G G G G G G G G G G G G G G G G G J H J J G G G G G J Q ( _ } O.+.$.>.6.c.7.r.p.p..XoX|.$X#X*X.X$X#X.X#X#X#X#X.X#X@X.X X X X X[. X[.[.[.",
+"3 3 8 3 3 3 e 3 3 9 3 3 8 8 q 8 q 8 6 3 9 9 e w w H.sXdXiX0X(.K.j.5.&.X.` ~ ! J J J K J G G G G G L G G G G G G G G G G G G G G G G G J P G G G G G G G G G G G G G G G G G G G G G G G G G G J G G G G G G G G G G G G G G G L G G J G J J K Q ~ ` ..%.+.@.,.,.>.>.<.n.+X@X@X#X#X.X#X#X#X#X#X#X.X.X@X.X.X X X X X[.[.[.[.",
+"8 3 3 e 3 3 e 3 e 3 6 3 8 8 8 8 8 8 e 9 9 8 w p.uXsXqX0X/.K.a.<.@.} _ ~ J K G J G G J V G J V G G L G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G P G G G G G G G G G G G G G G G G G G G G J J G G K Q ^ ' `  .+.#.$.0.4.&.q.n.*X$X#X*X*X.X#X#X#X*X#X#X.X.X X X X X X X[.[.[.",
+"3 9 5 3 5 3 3 9 3 9 e 3 8 8 8 8 8 8 0 9 2 q._.dXpX0X^.J.f.5.@. ._ Q J G G J J G G G V J J G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G P J G G G J G G G G G G G G G G G G P G J G G G G G G G G G G G V J G G V J G G K ! ( ~ '  .%.@.&.#.#.,.r.B.*X#X*X*X#X#X#X#X$X.X X.X.X@X X@X X X X X[.",
+"3 3 3 3 3 3 9 3 9 3 3 3 8 8 3 8 8 8 8 y W.sXaX0X^.D.a.<.+.| ~ ! J J G G G G G G G G G G G G J G G J G G G G G G G P J G G G G G G G G G G G G G G G G G G G G P G G G G G G G P G G G G G G G G L G G G J G G G G P G G G G G G J J K G G G G G G G I K G P Q ~ ] =.%.O.@.&.@.@.e.|.+X*X*X#X#X#X.X.X.X.X.X@X X[. X X X[. X",
+"9 3 e 3 3 e 3 9 3 e e 3 3 q 8 8 8 q n.rXdXpX`.K.j.q.+.` ~ Q K J G G K G G G G G G J G G G K V J K G G G G G G G G G G G G G G G G J P G J P G G G G G G G G J G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G V G V J G G G V G G G G L G G J K K Q ~ ` { -.#.#.#.+.#.N.#X*X#X#X#X$X@X.X X.X X X X X X[. X[.",
+"9 3 6 3 9 9 3 9 3 6 2 8 8 1 8 3 y '.iXaX0X^.F.r.+. .~ Q J J G G G G J G K J K G G G L G J G K C K G G G G G G G G G G G J P G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G A K K V L G J G G G G G G G G G G G G P G J J J Q ~ `  .O.+.O.+.3.q.oX#X.X$X#X|.@X@X@X X X}.}..X X].].",
+"3 3 3 6 e 9 3 3 8 q 8 q 8 9 q q.uXiX_.^.F.u.4.O._ Q Q J G G G G G G V J G V G J G G G G J V G G Q G G G G G G G G G G G G G G G G G G G G G J P G G G G G G G G G G G G G G J P G G G G G G G G G G G V G G G G G G A J ( J G G J G G G G G G G G G G G G G G G G J J J Q _ `  .O.%.-. .+.n.*X.X#X$X}..X$X X X.X]..X X X].",
+"9 3 3 9 6 3 6 3 8 9 8 8 8 8 S.sXpX0X~.M.5.O.` ~ K G G G V G G G G V K V G G V L L Z H G G G G G G J G G G G G G G G G G G G G G G G G G G G G G G G G G G G G J G G G G G G G G G G G G P G G G G G G G G G G G G G A K H K V J G G G G J G G G G G G G G G G G G G G G K J ~ _ }  .9. .=. .e.*X@X@X$XXX}.XX.X X@X X[. X X",
+"3 e 3 5 3 w e 3 8 8 8 9 w W.iXaX^.G.t.&. ._ Q J J G G G G G G G G G J J G G L G J K K J G G G G J J G G G G G G G G G G G G G G G G G G G G G G G G G J G G G P G G G G G G G G G G G G J G G G G G G J V G G G G G L V J G G G G J G G P G G G G G G G G G G G G G V J G G J Q _ _ } .. .| } 0.+X$X}.$X.X X.X X X X X X X",
+"3 9 3 3 3 9 6 6 e 9 3 w `.iX0X/.D.r.O.` ~ J J G G L G G G G G G G G A P A G G K I ) G G J G G J V J G G G G G J G G P J G G G G G G G G G G G G G G G P G G J G G G G G G G G G P J G G G G G G G G G G G G G G G G G P G G G G J V G G G G G G G G V G G G G G G G G J G G G G J Q ] ] ` { ` ` -.oX.X}.%X@X X.X}. X X]. X",
+"9 6 q 9 8 5 9 e 6 6 y rXaXqX(.s.<. ._ Q J J K G G G G G G G G G G G ! V H J _ $.&.,.Q G G G V G J G G G G G G P G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G V G G G J G G G A L V K J G G G G G G G G G G G G G G G G G G G V J G G G G J ( ' _ ' ' _ ` ' |.+X]. X@X}.#X X X X X",
+"6 9 6 8 9 9 e w 7 y uXiX`.K.s.,.` ` Q K G J G G G G G G G G V L G G I ( Y.HXLXLXLXKXLXAXy.C ! H G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G J G G G V J I q.rXK K K G G G G G G G G G G G G L G G G G G J H J J G J J G ! J ~ ( _ / ~ ] { |.|.}..XXX.X[. X X X",
+"9 6 6 9 9 9 e w y 0XgX).L.i.+.` ~ K G G K K K G J G G G G G G G G G / NXLXLXJXLXLXLXJXLXPXu.C J V L G G G G G G G G G G G G G G G G J P G G G G G G G G G G G G G G J P G G G G G G G G G G G G G G G G G G J V J <.vXLXlXH U V G G G G G G G G G G G G G G G G G V J J J V G J G V L J K Q _ ' ( ~ ( [ |.$X].$X].@X X X[.",
+"w q w 3 8 8 8 y _.0XqXU.y.+.} ~ G J G G G G G G G G K L G K G G G L lXLXLXLXKXNXxXLXLXLXLXAXZ N V G K G G L A V K K A L J G V H Q G J H J G V L L L K G L L A A P K G J L J H G ! J G G G H J G K Y J I G J V T V zXLXLXjXV J V G H K G L L A V G K K J G A J K V L G G G G G G G G K G G J P Q ~ _ ^ U [ |.].XX X+X[. X X",
+"q q 3 e 9 8 w W.0X`.Y.y.@.` Q J G P G G G G G G G G ! L V G G G K %.LXLXLXHX} D c 2.FXcXlXS.Q H V C C %.U.T.T.h.V G J J 2.*.4.@.G %.D.K.y.V G G J G C +.Y.T.T.h.V J G H ` >.,...~ K.U.] J H U 6.L.H.H.Q.%.! G P 6.cXLXLXcX;.%.B V G C %.Y.T.T.h.G L G V G G G K J P G G G G G G G G G J G J J Q Q ^ ) Q J { |..X#X}. X X X",
+"8 8 e q e 2 S.rX`.K.y.@.` Q J G G J G G G G G G G G K V G K G G H H.LXLXLXT.l l S b m u a d z v D ' zXLXLXLXJXLXHX<.J V Y.KXKXlX'.LXLXLXLXiXJ V V o.zXLXLXLXJXLXFXq.Z ) V.KXKXxXBXLXLXS.G  .ZXJXLXLXLXKXPXlX( H LXLXLXLXLXLXlXS C / zXLXLXLXJXLXHX1.V K G A G ! K A G G G J G G G G J G G G A G J Q ) Q G D -.}..XXX X X X",
+"q q 8 q 8 q.rX(.K.d.@.` Q G G G G G G G G G G G G G K L L J G G K lXLXLXPX@.h p q.m.C.d.k.B.-.l J VXJXLXLXLXLXLXLXLXX.C D.LXJXLXKXLXLXJXLXKXq.C Q CXJXLXLXLXLXLXLXLX%.D !.LXLXLXLXLXKX] x ZXLXLXLXKXLXLXJXJXY.I LXLXLXLXLXLXlXl G NXJXLXLXLXLXLXLXLXO.C V G G C ! G G G G G G G G G G G G G G G G P ( Q G K K 0.%X.X@X+X@X",
+"q q 3 e y '.'./.j.&.} Q J J G G G V J G G G G G G G H V G J J G C lXLXLXLX .d s jXJXLXKXLXLXM.j s.LXLXLX+.N ( ZXLXLXgXI G.LXJXLXaX3.U.LXJXLXS.N H.LXLXKX+.N ( ZXLXLXuXF E.LXLXLXNX3.w.Z / xXDXKX).N Y ZXLXLXhXk 0.cXLXLXcX%._ p M.LXLXLX+.N ' ZXLXLXiXC J Z G J H G G G G G G G G G G G G G V G G J ! G G V I L |.@X@X@X X",
+"q q e q H.`.L.F.4. .~ J G G G G G G G G G G P J G G K L G K G G P lXLXLXLXX.& u lXLXLXLXLXLXs.a dXLXLXZXA.S.R.vXLXLXGXh A.LXLXLX] l B LXLXLXM.v yXLXLXZXA.D.G.vXLXLXFXF N.LXLXLX,.B j k k k F Y &.D.sXLXLXLXzXB z lXLXJXjXu % d rXLXLXZXA.D.R.zXLXLXFXa C N V V J J G G G G G G G J G G G G G G G G K L L V V B { *X.X.X.X",
+"q q w :.'.~.S.r.O._ J G G G V G G G G G G G G G G G K L G K J V K H.LXLXLXK.% i y.eXl.LXLXLXs.a zXLXLXLXLXLXJXLXLXLXLXh B.LXJXLXz s c LXLXLXd.b MXLXLXLXLXLXJXLXLXLXLXh V.LXLXLXa h d d h *.cXLXLXLXFXGXPXLXzXi a zXLXLXdX$ % i zXLXLXLXLXLXJXLXLXLXKXj l V x C K J G G G G G G G G G V G G G G J G K P L G C I k w.#X.X.X",
+"q q q W.W.F.y.$.` ! G G G G J J G G G J G G G G G G G L G I J J V -.LXLXLXFX-.* u a %.KXLXLXN.s pXLXLXCX=.o.=.} { 9. .a k.LXLXLX% d a LXLXLXa.b yXLXLXCX=.=.o.| { 9. .u B.LXLXKXp * g j %.LXLXLXd.P M bXLXLXMX, c dXLXLXfX; % f mXLXLXCX=.o.=. .{ 9...i l h Z V V K G G G P G G G G G G G G V J G J G K J V Y D k ^ #X@X@X",
+"e 8 <.L.W.m.<.} ~ K G G G G G P G G G J G G G G G G G G G G G G V G lXLXJXJXLXnXvXZXLXLXJXLXl.i <.LXLXLXm.o.h.HXLXBXm.$ l.LXLXLX% % f LXJXLXx.b 7.LXLXLXi.o.u.HXLXMXd.% l.LXLXLX% i p % k.LXLXKXt.=./.LXLXJXhX% & lXLXLXSXo.( p q.LXLXLXm.2.u.HXLXVXs.p a k N C J G G G G G G G G G G G G G G G G G K J J J V C k k e.$X.X",
+"e q S.L.S.t.+.~ J K G G G G G J G G G P G G G G G G G G G G G G G V ! cXKXLXLXLXLXJXLXLXLXdXV a % hXLXLXLXLXLXLXLXSXm * u.LXLXLXs % % LXJXJXj.% % jXLXLXLXLXLXKXLXSXn % i.LXLXLX* % a j h.LXJXLXLXLXLXIXJXLXdX$ - Y.LXLXLXLXH.% i zXLXLXLXLXLXKXPXAXk $ p h l N V G G G G G G P G G G G G G G G G G G G G G G G N k [ .X$X",
+"w #.P.H.i.*.} Q J G G G G G G G G G G G G G G G P G G G G G G G G V N L V.FXLXLXLXJXPXuX| u % % u k qXPXLXLXLXLXzXE $ s i.KXKXKXd % * KXLXLXa.u d m qXLXLXLXLXLXzXE $ * i.LXKXKXu % p a h ~.LXLXLXFXd.f.LXLXFXh i Y SXLXLXLXhX* p S qXLXLXLXLXLXgXF $ % p p N C V G G G G G G G G G G G G G G J G G G G J G V V N k z v.*X",
+"q p.H.d.u.@.( ! G G G G G G G G G G G G G G G G G G G G G G G G G G G k h p I 3.2.2.% % i i & % p i i p | { ..h % % i i a i a i i i p i c i a u % c % a  .{ ..h % & a i a i a i i a s h z k G %.@.f u O % $ % % % i p O...} u u p h p h  .{ ..h * % u p u k N V V G G G G G G G G G G G G G G P G G G G J K V J Z k a -.*X",
+"w s.M.a.<.o.! J G L G G G G G G G G G G G G G G G G G G G G G G G G V V k h a f i a u u p & u i a l d h p i i % $ * f a p h j a a p p l j c h p h i d p p u i % $ % i j a h l a a a p k V k N k a c % u u % % % % p d p a a i p h d d h p % i % * * % u h N k G L G G G G G G G G G G G G G G G G G G G J K G V N k l A &X",
+";.m.m.q.@.` ! G G P G G G G G G G G G G G G G G G G G G G G G L G V C V C z p d m ; u u i a a l a h d h p v a i % d a p d d p j h p h d k h d u h h d h a a a i u u a p d d a j h d v S B C N N j h p i p a i p a p z p h c c a p z z z h a a % u s p p h k N G V G G G G G G G G G G G G G G G G G G G G V G G V k a p n.",
+":.d.i.1. ._ Q G V G G G G G G G G G G G G G G G G G G G G G G V G G G V V N N z * d p u d p a S k x N l k l a p h p h h Z x h h k z k h Z k k k h z k z k h h p a u h h x x k l k h k C B K N h k h h u p a a p l k h k k a l h k h k k h j h p h p p h N C V C V G G G G G G G G J G G G G G G G G G G G G K G V N z p 0.",
+"1.t.r.>...~ G G J G G J P G G G G G P G G G G G G G G G G G G G G G A V V V B l D c l x m h B F N Z D C N k k k j k S N k Z C C l N S H k V S C B N C C Z z x N j v B N k N C B N Z n A V Z V V N B h N k h N k N k C N N x x k k C C N Z z z k h l k N C C H G Q G G G G G G G G P G G G G G G G G G G G J G G C N d a R ",
+"y.r.6.@.` ! K V G J G G G G G G G G K G J J A T J K L L L G G G A R K K G Z A V N N k N N V N V V V V V V Z x Z k V V N V V V C V V x C Z V C A V V C I C D C N N N B G N x A V C C V V V G G V N V N N V N C N C C C V C V V C N C V V V V N N N N D J N H K V A G J G G V G G G K G G G G G G G G G G G J J H V x h u V ",
+"6.q.<.@.` J G J G G G G G G G G G G G G I Y J G K V U J G G K K J V K H J G Z V G V G V N C C G G V G V V V V G V N V C V G G V G C G K G G H H V K G A Z T n T A V H H G G G C H U V G V G V G J N C V V V V V G G J V K V V V C J V V V V V C V C V Z A K I K K K C K J L G V ! V G G G G G G G L J G G G H J C k h % p ",
+"4.>.@.O._ J G G G G G G G G G G G G L L G H G J J A H G L A G J J V J G V G G G V V V V V V G G G G G G G V V V V J V G J G G G G G I K I V K K J U V L G A A H V H G V J G G G G V A G G J G V G G G G V V G G G V J G G V G G J G K J J G V J V G V L L J V J J G J G G J J G J G J G G G G G G G G G G G K G V x h u $ ",
+"4.$.@.X.~ J G K G G G G G G G G G G ! Z J K K ! U L G J I U Y K K G T A L G G L G L K G J G J V K V J G G G J G J G K K V G G G G G K J G A G J A U K G K H U U K K G G V G G V A L G G G V J Q J K V G G G G G G G L V A G V L L V G K V V G J H ! K A A G K J G G V G ! K H K G G G P G G G G G G G G G G J K V k h u $ ",
+"*.#.@. .( K G G G G G G G G P J G G *.KXLXLXNXZ K A K J.LXJXKX;.C K L V A J G G G G K J J G G G J K G K G G G V G K K J G K G G G G G I LXLXLXKXLXLXLXLXLXLXLXLXN G G J J J V G L L G G G J K V V K G G V L G G G G G G G G G G G G G J G J J G ! &.LXLXLX*.I K J K G G K H K J V G G G G G G G G G J G G V H K G k p % $ ",
+"&.+.O. .~ J G G G G G G G G G G G G c.LXLXLXLXH.H K G J.LXLXLX*.V V V K J K K K H K G J G J V G G K J V G G J G K G J G G G G G G G A K LXLXLXJXLXLXLXLXJXJXLXLXC A H K K K K K K H G G G J G J J G V G J G G G G G H K J K J K H K G G G G G V K ,.LXLXKX*.H C V G G J V J G G G G G G G J G G G J G G G K J H V z p % $ ",
+"@.O.O.} ~ G G J L G G G G G G G G G 4.KXJXLXPXPX-.D x H.LXLXKX#.A Z V K H V V K U K K G V L G G V K K V G G J V G G G G G J V J P V L D LXLXLXLXLXJXLXLXLXLXLXKXB C C C K C V ! H K G K V G V J V G G G V J G G G J H K C J J C H J G G G V G J G ` Y.F.S.} C V A Z K J G G V G J G G G G G G G G G G G G J J J V k a % O ",
+"=.O. .} Q J J J G G G G G G G G G G 4.LXLXLXLXJXNXF C G.LXLXLX@.B B V N ;.H.P.H.r.G G J ~ $.1.$.~ G J } >.>.%.G G G O.$.>.O.J V J K J H K N V N KXLXLXKXh h h l x k x %.V.H.Q.q.G J G J ` ,.>.%.~ H.K. .J O.5.&.| | J.m.[ G L / t.F.G.U.s...G G G ~ $.0.0.G C _ $.*.O.V O.D.K.r.J J G G G G G G G G G G G G H J V h i $ O ",
+"%... .` ~ G J G G G G G G G G G G G #.LXLXLXLXLXLXM.l V.LXLXLX;.j N ] lXLXLXLXJXLXFXr.V A HXLXLXa.V G bXLXLXLXP H G HXLXLXY.G G G G G G V V B N LXLXLXLXu d % h a g.lXLXLXLXLXLXHX<.V G Y.LXLXvXcXJXLXH.J jXLXLX`.GXJXLX7.G N.FXLXLXLXLXLXLX~.J H :.LXLXLX;.k Z.LXLXvX(.LXLXLXLXdXD G G G V G G G G A G G G G G V h a @ i ",
+"..} ` ` ~ G G G G G L G G G G G J P *.LXLXLXIXKXLXLX] B.LXLXLX-.h C nXLXLXLXLXLXLXLXLX .G `.LXJXsXG _ LXLXLXLXs.V  .LXLXLX] V V V G J G G H N k LXLXLXLX% % & u V bXJXLXLXPXKXLXLXLXO.Z F.LXLXLXLXLXLX` N lXLXLXLXLXLXAXD ] LXJXLXLXKXLXPXJXLXX.C :.LXLXLX;.k S.LXLXLXKXLXPXLXLXLXu.V V G V G G G G G G G G G G N h i - N ",
+"` ' _ ` ~ G J G G G G G G G G G G G *.LXLXLXE.ZXLXLXcXQ.LXLXLX .h m.LXKXKX@.N _ AXLXJXfXB 3.LXLXHXN H.LXLXLXLXdXk H.LXLXdXC V V V V C G V V N N LXLXLXLX$ % i % s.LXLXKX;.k ~ AXLXLXiXN F.LXLXLXbX;.7.N C lXPXLXLX0X+.+.V <.hXKXKXC.F } LXLXLXA.B ;.LXLXLX;.l j.LXLXLXaX@.Q.LXLXLXR.N V V G V G G V G G V J G V N a $ > [ ",
+"' ~ ~ _ ~ K J G G G G G G G G G G G *.LXLXLXs.o.KXJXLXFXLXLXLX| i kXLXLXZXI.T.s.MXJXLXGXb D DXJXLX| NXLXLXZXLXLXG hXJXLXu.N k k V C V G V V C N LXLXLXLX% & g % uXLXLXAXs.I.I.fXLXLXFXk G.KXLXLX6.z l k k fXLXLXKXC k h h N C S ' 4.I.VXLXLXLXS.N #.LXLXLX%.a j.LXLXLX] b k LXLXLXI.k k N V V G G K G V J J G V k i @ > 9.",
+"{ P Q ~ Q K J G G G G G G G G G G G 4.LXJXLXd.= wXLXJXLXLXLXJX| i jXLXJXLXLXLXLXKXLXLXLXb h M.LXLX0XLXLXbXT.LXLXs.LXLXFXh N k k k C V G G G C V LXLXLXLX% % f a jXLXPXLXLXLXLXLXLXLXLXx A.LXLXLXa h u d j lXLXLXVXl p k d d k.ZXLXLXLXDXLXLXLXs.h ;.LXLXLX-.l k.LXLXLXc v p LXLXJXI.p h k V V G G G G G K J G V h i @ o N.",
+"q L G Q Q J J G G G G G G G G G G G *.JXLXLXi.u M NXLXLXLXLXLX..i _.LXKXAX . ... .2.....a d ! LXLXLXLXLXM.K LXLXFXJXLX(.h i p k k B V G G G G V LXLXJXLX% i f p sXJXLXAX..=.| { 8.-.W u l.LXLXLXh a d u u jXLXLXkXa a % p R.LXLXGXh.D N LXLXJXM.i -.LXLXLX..a j.LXLXJXa a * LXLXJXy.p h h N V G G G J G G V V k p $ X d *X",
+"q ^ V G J J J G G L G G G G G G G G :.LXJXLXB.u - Q LXLXLXLXLX{ = h.PXPXKXl.=.s.FXLXdXs.u p p dXLXLXLXJXL $ VXLXLXLXLX_ i a h h N C V G G G J V LXLXLXLX% % g h t.LXLXLXm.o.l.GXLXjXN.u x.LXLXLX% i * p B jXLXLXjXu % u u lXLXJXDX0.w.MXKXLXJXn.i o.LXLXLX .c j.LXLXJXi % ; LXLXLXm.i p h N V V G G G G G G N h % O X 8.*X",
+"q ' V G G J G G G G G G G G G G G G $.LXPXLXN.; & % eXLXLXLXLX{ & f nXLXLXLXLXLXJXLXDXS % a u r.KXLXLXUX*   yXLXLXLXZX% u i p h N C H G G G V G LXLXLXLX* u i h k zXLXLXLXLXLXLXLXSXm p x.LXLXKXi g u a c MXLXLXMXu * u h ~.LXJXLXLXLXLXGXLXKXm.i | LXLXLX .i d.LXLXLXi i m LXLXLXm.% p h k N G G G G G G V Z p % X + n.;X",
+"8 8 P V V G J J G G G J G G G L G G 7.KXLXKXk.f & % % cXLXLXKX{ O % k ^.LXLXLXLXKXfXD & i p a N KXKXLXd.$ ; T KXLXLXi.% $ % p h N V V G G J G H KXLXLXKX; % u p N J tXLXLXLXLXLXhXT & % m.LXLXKX% i s a l fXKXKXzXg % j p G hXKXLXLXAX#.^.LXLXdX% ..LXLXKX9.m B.LXLXKXu i i LXKXKXl.i u p k N G V G A J Y A z & O o R &X*X",
+"8 8 _ Z V H C J G G V J G G G G G G C G h k f j i i p a u $ u $ & % p p % } ..` h % % i p a l p h p i % % i O % i - $ $ p % z k V V G G K J J C C k h i % i p h k k l l =.] o.l & i % a % i a a u a i l v B h z l g a i l p C ~ =.] u u = & & i % & a & j % a i a i u % p p u d % p p p h k V V G L L I H Z u = X . e.3X=X",
+"8 8 w V V V V J C J G G G G G L G G G V x h p % p p h h p i & i % a % h h a i u % % u p u h j B v v p a & u u i a p % a % p k h V V G V G G G G V x B c c j a k k V N k p % u % u % * a h l a a p u p N B V N k a c a h N V k N h p u % i & i $ i p a p u h p p u p u h u u p j p d p p h k V V V K V I Z a i O # n ;X-X;X",
+"3 8 q / Z k C C G G G G G G G G G G V V Z z k p d d z k h h p a u u h h j l a i u p % % h h N N C B d d d u u h p p p % u h k N C V G J G K J N G V k l a c v l k N k N p h u % % p d * h h h h u d x k V Z x x k h z z h x Z Z k z u * d % u p % d p p p h u d h h c p d k k l k h p h k N V G J V U V d l O X o N.-X;X;X",
+"3 8 1 q G k N N G V G G G G G V G G I H C l k k h B N N N k p p k d z k k l p h p d h a z k k V Z N k h d k k h k k h h k h k V V J G J V J G J V V N h k h l k H C H N C a h a a a l k k n n z k l k k V N V Z z k h k Z V Z N k h d d u d p p h z k j j l v l k j l l h p B S k h k k k V V C J G C Z p O # o 8.-X;X;X;X",
+"8 3 9 8 4 A h k V V V G G G G G G G G K H V Z k Z V C C C B C l l N N Z N N k k z h k k k V Z N A Z V C l N k C B V N k k Z V V G V J J G J C J G V Z Z z N N C V C N V Z k k k k h D B k Z k V l I N H C C G C C N N V V C V C C B B k k B k B k B k k N N N k k V N C N C N G N k k N N V G G G C V p % . # * =X;X;X;X;X",
+"3 9 8 3 q ^ N k k C V V G G G G G V G V V V Z Z N H C K C V V V V V V C N G V V N N N N V N J G V A V V V V V V V V V G V V V V J G G G K G G K C G G k G V N V G G L V A x Z x k Z S V G V V C C C V V G K C H G V C C V J C J G C C C C B N C C C Z V A x x A A x G N C V N V G V C V C V G G C k z i X X + v.;X,X;X=X;X",
+"8 3 3 3 5 6 G h l k V V V G G G G J V K ! C G G H I K V A L Z A Z G U I G C V C I H V V J K C H J V J Z V V A V A A V C V V G V G K V J G G G G J J H K C C G G V G I K C G C G C H A Z V G G V L V V L V G G G V Z G J V G V G Z A V N V Z G V V V C J C J J C C H V C K V G Z J H C G J V G V N h &   X > w.:X-X=X&X=X=X",
+"3 3 6 3 1 8 2 L h c k Z Z G K H K L G G G G G G J G G G G G G G G G L V G V G G V G G J G G G G G G G G G G G G G G G G G G J P G G G G G G G G G P G G G G G G G G G G G G G G G G V G G G G G G L G G G G G G G G G J G G G G G G G G V G G V G V G G G G V G G G G G G G G G H V U K G V V C j % O X   R <X7X-X-X-X-X-X",
+"q 3 3 8 8 8 q < N p h N k N J K G G G G G V G G G G G G G G G G G G G G G G G G G G G G G G G G P G G G G G G G G G G G G G G G G G G G G G G G G J G G G G G G G G G G L G G G G G G G G G G G G G G G G G G G G G G P G G G G G G G G G G L G G G V G L G G G G G V K G G G G J H G V G H N h d @   X A <X<X-X;X,X-X-X-X",
+"3 3 8 3 8 8 1 w < Z u h k l V V V H J V G G G G G G G G G G G G G G G G G G G G G G G G G G G G G J G G G G G J G G G G G G G G G G G G G G G G G G G G G J G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G L G G G G G G G G G G V G G G G G G K G V G G K V T V H B k *   X   z oX>X,X=X:X;X-X-X-X",
+"3 8 8 1 0 8 1 3 6 2 x u c l k Z V H J J V J G V G L G G G G G G G G G G G G G L G G P G G G G G G G G G G G G G P G G G G G G G G J G G G G G G G G G G G P G G G G G G G G G G G G L G G G G G G G G G G J L G G G G G G G G G G G G G V G G G G G G G G G G G G G G V G G G G G G G Z Z u = X X o k 6X7X>X:X=X,X,X,X-X,X",
+"3 5 8 1 3 8 8 3 1 8 < k a a h k N C G G G G G G G G G G G G G G G G G G G G G V G G G G J G G G G G G G G G G P J G G G G G G G G G G G G G G G G G P G G G G G G G G G G G G G G G G G G G G G G G G J G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G J G K G G G V B V % % o #   ^ 6X2X3X,X=X:X>X>X-X,X3X",
+"5 3 3 3 1 3 8 9 8 8 e < V u % d k N V V V G G G G K G G G G G J G G G G V G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G J G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G L G G G J G G V J G V N l % $ o > X R <X9X,X,X2X2X-X-X,X1X-X-X",
+"3 3 1 3 3 3 3 3 8 9 1 e < A p i p d k N N G V J G K G G G G G G G G G G G G G G G G G G P G G G G G G G G G G G G G G J G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G P G G G G G G G G G G G G G G G G G G L G G G G G G G G J G G G V J G J C V h p % O o X X 0.4X,X:X,X2X,X,X9X7X<X,X,X1X",
+"3 3 3 3 3 6 3 1 1 1 3 8 1 8 J a & % p h N C V H H K G G G G G G G G G G G G G G G G G L G G G G G G G G G G G G G G G G G G G G G G G G P J G G G G G G G G G G J P G G G G G G G G G G P J G G G G G G G G G G J P G G G G G G G G G G G G G G G L G G G G G G G G G J V C B k u % o o X s N.3X1X<X,X,X<X7X>X,X<X,X:X3X-X",
+"3 3 3 1 3 3 3 3 3 3 1 8 8 1 3 / x $ % % h k Z V V V G G G H J G G A G G G G G H K K G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G P G G G G G G G G G G G G G G G G G P J P J G G G G G G J G V J K J G J G G G G K G H H N h m % +   o   R C.7X:X-X2X,X,X1X,X2X,X1X2X,X,X,X",
+"1 3 3 3 3 1 1 3 3 3 3 2 0 8 3 6 < L $ % u u p h k G G G J V G G G G K V G G G G G G G G G G G G G G G G G G G G G G G G G G G J G G G G G G G G G G G G P J G G G G G G G G G G J G G G G G G G G G G G G G G G G G G G G G G G G G G L G G G G K V G J V G G V V J C k h i + X X > ; 9.6X2X:X7X2X<X,X2X,X1X,X,X,X,X,X,X,X",
+"3 1 3 1 3 5 3 3 3 1 3 3 1 1 1 8 8 1 / d O % i p h h Z N G G G K J K G J J G G G G G G G G G G G G G J G G G G G G G P G G G G P G G G G G G G G G G G G G G G G G G G G G G G J G G G G G G G G G P G G G G G G G G G G G G G G G G G V V G G G G G V J G G G V N C n a -   O # X x V.2X8X,X1X7X2X<X7X2X,X,X,X,X,X2X7X,X,X",
+"1 3 1 3 3 1 3 1 3 1 1 5 8 3 8 8 1 5 3 7 A * $ % i p h k k V V G J V G J V G G G L G G G G G G G G P G G G G G G G G G G G G G G G G G J P G G G G G G G G G G G G G G J G G G P G G G G G G G G J G G G G G G G G G G G G G G G G G L G G G G G G G J G V N V N l a O O o >   s e.<X9X9X,X7X1X1X<X2X7X,X1X2X,X,X,X,X,X2X,X",
+"3 1 2 1 1 1 1 1 3 3 1 1 1 2 8 1 1 8 0 1 3 / x $ O % % a p k N V V G V G G G G G G L G J G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G P G G J P G G G G G G G J G G G G G G G G G G G P J G G G G G G G G G G G V G V V V N k i = # $ X   O / Q.2X1X1X1X1X2X1X2X2X2X2X,X2X,X,X2X,X2X,X2X,X",
+"1 3 1 1 1 3 1 1 1 3 5 1 3 3 2 2 2 2 0 0 5 3 6 ^ d $ $ $ % p p k N C V G G G G V G G G G G G G G G G G G P J G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G K K J K K G V G Z k h u $ = X X . + ^ V.,X,X7X:X2X1X2X2X2X1X2X7X2X2X,X2X2X,X2X,X2X,X,X",
+"3 3 1 1 1 1 1 2 3 1 3 1 1 8 1 1 3 2 1 1 5 1 1 q 7 P d % $ = % % h h k N N V C G G K G G G G G G G P G G G G G G G G G G G G G G G G G P J G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G V V V N N k d % $ + o X   @ T v.,X7X,X:X3X2X,X2X2X,X2X2X2X2X,X2X2X1X2X1X2X,X2X2X2X",
+"3 1 1 1 1 1 1 3 1 1 4 2 1 1 5 5 1 1 2 2 1 3 3 1 3 8 7 L d O @ = % % p p k N V C H J G G G G G G G J G G G G G G G G G G G G G G G G G J P G G G G G G G G J P G G G G G G G G G G G G G G G G G G G G G G G P J G G G G G G G G G G L V V Z k z u % $ X X + X   x e.,X2X3X3X1X2X2X2X4X2X4X2X7X,X2X2X7X2X2X2X1X2X1X2X2X,X2X",
+"1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 3 3 3 3 3 1 5 3 T d $ O + % % i a h k k Z V V V G J J G K G G G G J J G V G G V G G G G G G G G G G G G J G G V J V J J V G G V G G G G G G G J G G G G G G G J V H J H G A G G G G V Z T S S l a % $ O X     O   ^ V.,X9X,X,X,X2X,X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X<X2X2X2X4X2X",
+"1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 3 3 1 3 6 6 P k O = + $ * * % a l k k V V V C G J G G G G G G G J G G G G G G G G J K V G G G G G G G G G G G G G G G G G G K K G G G G V G G G G G G K J G J G G ) D V V V C l v a i % % X X   X X @ 8.V.-X,X<X<X,X2X2X,X1X2X2X1X4X2X4X2X2X2X2X2X2X<X2X2X2X2X2X2X2X7X2X",
+"1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 1 3 8 6 3 3 5 3 2 / Z d X X - $ $ % d p p h k k N N V G G G G G J G G G G G G G G G J V K V J V G G V J V G J J J G G G G G G K V K G G G G G G G G G G G G G G V V C C k l a i c - : : . . O X + U 0.!.2X;X9X7X3X3X1X,X2X2X1X1X2X2X2X2X2X2X2X2X2X<X2X2X2X2X2X4X2X2X2X7X2X",
+"1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 5 5 1 1 8 1 8 3 ^ k $ X   @ + $ % u % u p h k N N V N V C G V V G G G G J G V J G G J G J G K G K J J V V K G K J G G G J J G G G G G G G G V V V C V N k z c a u * ; O X o o +   . ; 9.B.-X-X9X,X3X3X-X7X7X2X2X,X2X2X2X2X4X2X2X2X2X2X7X2X2X2X2X2X2X2X2X2X2X2X2X2X",
+"1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 1 1 3 3 1 3 3 1 1 1 1 0 1 3 3 1 8 2 [ x $ X o + O $ = $ & i % i h h k k N N V N V V V V G G V G G G G G G G G G G G G G G G G G G G V V G V G V V N V N N k k j h p u i % % O @   X   . : # u [ n.;X-X:X=X,X<X=X,X1X,X,X1X1X1X2X2X2X2X2X4X4X2X4X4X4X2X4X4X2X2X2X2X2X2X2X2X4X2X2X",
+"1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 3 3 1 2 2 8 1 0 5 5 8 6 ^ A u X   X O O $ + $ % & % u u p p p h k h k k k N k N N N N V V V V N V V V N V V N N N N N N k h h j h p a u % % % = - + X X . @ # > o X T w.N.<X-X-X9X,X=X,X=X3X,X,X,X,X1X:X1X2X2X2X2X2X2X8X2X4X4X4X4X4X4X4X4X2X4X2X2X4X4X2X2X2X2X",
+"1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 2 2 3 8 9 8 9 0 8 8 6 4 P z $ X @   X X X O $ O $ $ $ % & i i i % p p p p p p p p h p h p h p h p p p p p u u u % % % % % $ O $ O O X     @   @   O n [ v.<X<X>X>X-X;X:X-X-X,X,X,X,X3X3X2X,X,X,X,X2X2X2X2X2X2X8X2X8X4X4X4X4X8X8X2X4X2X4X4X2X2X4X4X2X2X",
+"1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 1 1 1 1 4 1 5 3 5 5 3 8 2 3 3 6 3 3 3 3 3 8 8 3 3 P x d * X X X X X X + O O O + $ $ $ $ $ $ $ $ % $ $ $ $ $ $ $ $ % $ $ $ $ O O O O O X X X X X X X X X   O d R 9.e.oX-X;X;X;X-X-X-X-X3X,X=X,X,X,X9X1X,X,X,X,X2X<X2X,X2X2X2X4X2X8X8X2X4X4X8X8X8X5X4X4X4X4X4X4X4X4X2X4X2X",
+"1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 3 1 3 3 3 3 3 3 3 3 8 3 8 3 8 3 8 8 8 9 2 [ A Z d % X X X X o o + o o + o o + + o X X o X o X o . X +   X # o :   X X + X @ O N L { 0.v.&X-X*X;X;X-X;X-X;X-X-X-X-X,X-X,X-X<X,X,X,X,X,X,X2X2X,X2X,X2X2X2X2X2X2X4X5X8X8X8X8X8X5X5X8X8X4X4X4X4X2X8X2X2X2X",
+"1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 1 1 1 1 3 1 1 3 3 1 3 3 5 3 3 3 3 3 5 3 8 3 9 3 3 8 8 8 q q w w 7 6 w 7 7 / ^ A A z d s * O @ @   X X X o X X X X @ o   @ ; x Z T { { -.w.v.&X*X-X&X3X&X&X=X-X;X-X;X;X-X=X-X-X-X-X-X-X-X-X,X3X,X,X,X,X,X,X2X,X,X2X2X2X2X<X2X2X8X4X4X8X8X8X8X8X5X5X8X8X8X8X8X4X8X7X2X8X8X"
+};
diff --git a/images/button3hilite.xpm b/images/button3hilite.xpm
new file mode 100644 (file)
index 0000000..cf6ae0b
--- /dev/null
@@ -0,0 +1,352 @@
+/* XPM */
+static char *button_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"157 90 256 2",
+"   c #025D01",
+".  c #085C00",
+"X  c #00580B",
+"o  c #135B00",
+"O  c #005F10",
+"+  c #016302",
+"@  c #00640A",
+"#  c #016A02",
+"$  c #006A0A",
+"%  c #0B6300",
+"&  c #0A6C00",
+"*  c #006411",
+"=  c #006A11",
+"-  c #00681A",
+";  c #017301",
+":  c #017C02",
+">  c #007B0A",
+",  c #087C00",
+"<  c #047405",
+"1  c #007412",
+"2  c #136500",
+"3  c #117000",
+"4  c #006725",
+"5  c #006A37",
+"6  c #29567E",
+"7  c #315C7E",
+"8  c #00605A",
+"9  c #1E5688",
+"0  c #1E588A",
+"q  c #1D5686",
+"w  c #1E5C90",
+"e  c #225684",
+"r  c #235885",
+"t  c #21598A",
+"y  c #2B5A84",
+"u  c #2A5D8C",
+"i  c #225688",
+"p  c #225C91",
+"a  c #2B5D90",
+"s  c #325C84",
+"d  c #325D88",
+"f  c #2D608D",
+"g  c #2C6191",
+"h  c #256092",
+"j  c #32628D",
+"k  c #3A658D",
+"l  c #376080",
+"z  c #336491",
+"x  c #3A6690",
+"c  c #3C6892",
+"v  c #366996",
+"b  c #1F6193",
+"n  c #43678A",
+"m  c #446E94",
+"M  c #018302",
+"N  c #00830A",
+"B  c #008B02",
+"V  c #008B09",
+"C  c #098C00",
+"Z  c #0A8000",
+"A  c #008515",
+"S  c #019301",
+"D  c #009309",
+"F  c #009B02",
+"G  c #009A09",
+"H  c #099200",
+"J  c #0A9C00",
+"K  c #009311",
+"L  c #009B12",
+"P  c #009418",
+"I  c #128600",
+"U  c #109200",
+"Y  c #01A301",
+"T  c #00A40B",
+"R  c #00AB01",
+"E  c #00AB0A",
+"W  c #0AA300",
+"Q  c #0BAB00",
+"!  c #00A411",
+"~  c #00A812",
+"^  c #01B400",
+"/  c #00B30A",
+"(  c #00BA03",
+")  c #00BA0A",
+"_  c #09B100",
+"`  c #0ABA00",
+"'  c #00BC12",
+"]  c #00B516",
+"[  c #15AA00",
+"{  c #19BB00",
+"}  c #01C302",
+"|  c #00C20B",
+" . c #00CB02",
+".. c #07C803",
+"X. c #00C211",
+"o. c #00C916",
+"O. c #01D302",
+"+. c #00D40B",
+"@. c #00DA02",
+"#. c #00DB0B",
+"$. c #0AD300",
+"%. c #0CD900",
+"&. c #00D314",
+"*. c #17C600",
+"=. c #11D100",
+"-. c #15DB00",
+";. c #00CE2A",
+":. c #01E301",
+">. c #00E40B",
+",. c #00EA03",
+"<. c #0CE200",
+"1. c #05EC05",
+"2. c #00EA15",
+"3. c #01F402",
+"4. c #01FB03",
+"5. c #01FD09",
+"6. c #0BFD01",
+"7. c #0BFF0A",
+"8. c #05F205",
+"9. c #02FE13",
+"0. c #0CFF13",
+"q. c #04F817",
+"w. c #14E900",
+"e. c #12FD00",
+"r. c #1AFE03",
+"t. c #15FC09",
+"y. c #14FF19",
+"u. c #1AFF1B",
+"i. c #17FF14",
+"p. c #04FA29",
+"a. c #1BFF24",
+"s. c #16FF27",
+"d. c #1BFF33",
+"f. c #00EB31",
+"g. c #26F801",
+"h. c #26FF18",
+"j. c #33FD03",
+"k. c #38FF1B",
+"l. c #2AE400",
+"z. c #23FF24",
+"x. c #2BFF25",
+"c. c #28FF2A",
+"v. c #2AFF34",
+"b. c #36FF28",
+"n. c #33FF33",
+"m. c #34FF39",
+"M. c #3BFF34",
+"N. c #3BFF3C",
+"B. c #26DF00",
+"V. c #3CFF42",
+"C. c #39FF47",
+"Z. c #39FF55",
+"A. c #29FF4B",
+"S. c #1FF75F",
+"D. c #44FF18",
+"F. c #51E900",
+"G. c #45FF27",
+"H. c #42FF35",
+"J. c #47FF3A",
+"K. c #56FF37",
+"L. c #58FF2B",
+"P. c #60FF38",
+"I. c #42FF44",
+"U. c #42FF49",
+"Y. c #4BFF44",
+"T. c #4BFF4A",
+"R. c #49FF56",
+"E. c #52FF4B",
+"W. c #59FF49",
+"Q. c #52FF53",
+"!. c #5BFF53",
+"~. c #5BFF5A",
+"^. c #52FF59",
+"/. c #5EFF63",
+"(. c #57FF66",
+"). c #4AFF6E",
+"_. c #64FF48",
+"`. c #62FF53",
+"'. c #66FF59",
+"]. c #72FF5B",
+"[. c #76FF54",
+"{. c #74FF4A",
+"}. c #63FF63",
+"|. c #64FF6A",
+" X c #6CFF66",
+".X c #6BFF6A",
+"XX c #67FF76",
+"oX c #75FF68",
+"OX c #71FF74",
+"+X c #71FF7A",
+"@X c #7BFF75",
+"#X c #7BFF7B",
+"$X c #5DABDA",
+"%X c #5BABD4",
+"&X c #5DAAD1",
+"*X c #5BAEE2",
+"=X c #62ADDB",
+"-X c #6BAEDA",
+";X c #65ABD4",
+":X c #65B1DB",
+">X c #6BB2DD",
+",X c #6FB5D7",
+"<X c #72AED5",
+"1X c #71B5DE",
+"2X c #74B8DE",
+"3X c #7ABADD",
+"4X c #77B3D5",
+"5X c #6FABCA",
+"6X c #63B1E0",
+"7X c #6CB4E1",
+"8X c #6BB8E3",
+"9X c #73B6E1",
+"0X c #75B9E1",
+"qX c #7CBCE2",
+"wX c #7AB8E4",
+"eX c #64ADE0",
+"rX c #7CFF82",
+"tX c #76FF91",
+"yX c #7BC0E5",
+"uX c #7FC0DE",
+"iX c #82FF69",
+"pX c #84FF77",
+"aX c #83B7DA",
+"sX c #80BEE3",
+"dX c #84BDE5",
+"fX c #84FF83",
+"gX c #8AFF84",
+"hX c #8AFF89",
+"jX c #84FF8D",
+"kX c #8AFF92",
+"lX c #96FF87",
+"zX c #97FF96",
+"xX c #97FFAD",
+"cX c #A7FF9B",
+"vX c #B7FF95",
+"bX c #A7FFA9",
+"nX c #A5FFB4",
+"mX c #B4FFA5",
+"MX c #B7FFB4",
+"NX c #83C1E4",
+"BX c #89C2E5",
+"VX c #8BC5E9",
+"CX c #85C4E9",
+"ZX c #92C4E6",
+"AX c #BFFFC2",
+"SX c #C0FFBE",
+"DX c #FBF8B2",
+"FX c #C1FF9A",
+"GX c #CBFFCF",
+"HX c #E7FDE7",
+"JX c #FEF5FC",
+"KX c #F9FFF4",
+"LX c #FDFDFC",
+"PX c #F5F6F7",
+"IX c #ECFFF3",
+"UX c #CEDFDF",
+/* pixels */
+"t t t t t t t t t t t t t t t 9 t t 9 t 9 t 9 9 t t t t r e t t t h t t u t u t t u u t t r u u u y y j f f u h u i u a x m t.x.G.H.`.`.Q.|.OX@XOXOXOXOX+XOXOXOXOXOXOXOX.X.X X X].].].]. X].].<X<X>X>X>X>X>X8X9X9X9X8X8X9XwX1XwX1XwX3XwX2X2X0X9X2X2X0XqX0XqX0XqXwX2X2X2XwX3XqXqXqXqXqXqXsXsX3XqXNXqXsXsX3XqXqXNXNXqXqXqXqX",
+"t t 9 t t 9 9 t t t 9 t t 9 t 0 t 9 t 9 9 i 9 t 9 t t 9 t t t r t r r u i u u t u u y y u t u t u u t u y j m h.M.Y./.rX#XhX@X@XOXXXOX.X|..X X|./.}.}./././././././././.~.~.~.~.~.~.~.~.XX(.|.|.'.~.'.'.].].<X4X,X1X0X9XwX0XwXwX2X0X2X0XqX1X2X3X0X0XqX0X0X0XqX0XqXwX3XqX3XqX3XqXqXqXqXqXsXsXqXdXNXqXsXsX3XyXqXqXqXqXqXCXqX",
+"9 t t t t t t t t 0 9 t t t t i 9 t t 9 0 t 0 t t 9 t t t t r r y r r t u y t t u t t f 9 h u y y m k.E.'.pXpX#X#X#XOX.X.X X/.~.(./.^.^.R.T.U.I.U.U.Y.V.U.U.C.U.I.U.U.I.C.V.U.I.I.I.Y.Y.W.Y.Y.E.T.T.T.W.T.T.Q.~.~.].oX4X9X0X2X3X2X0X9X0XwX3X3XqXqX0X2X2X2XwX0XqXqX2X2XqXqXqXqXqXqXqXCXqXsXsXqXdXsXNXsXsXNXqXqXqXqXqXqXyXyX",
+"t t 9 t t 0 t t t t t t t 0 t t t t t t t t t t t t t t p t r r r t t p r t p p w p u t y m k.~.pXhXrX#XtXtX+X|.'.`.`.`.E.Y.N.H.M.m.v.v.z.z.z.a.a.y.y.y.y.y.u.y.u.y.y.y.u.a.u.y.a.a.z.z.x.x.c.n.n.N.I.N.Z.R.I.I.U.R.^.^.R.!.].4X3X0X0X0XwX2X0X0X0XqXqXwXwX2X2X0X2XqX3XwXqXqXqXqXyXqXqXqXNXNXqXqX3XqX3XsXqXqXqXqXqXqXqXqXqX",
+"0 t t 9 t t t t t t t 0 0 i t t t t t t t 0 t t t 9 t t 0 0 t t t 0 w h p p t t r k h.W.#XfXfXpX#X.X|..X|.!.T.Y.N.M.x.h.u.y.0.5.5.5.8.8.>.3.:.@.@.@.O.@.@.@.@.O.@.O.@.@.@.@.@.@.@.,.>.8.3.4.5.5.0.s.s.v.k.k.b.G.G.M.N.C.J.J.U.R.T.`.[.4X1X3X0X0X0X0XwXwX2X2XqX2X3XqXqXqXqX3XyX3XqXqXNXyXsX3XyXqX3XqX3XqXyXCXqXwXqXqXqXqXqX",
+"t t t t 9 t t 9 0 t t i t t 0 t 9 t t t t t t t t t t 9 u 0 0 0 t p t t r y k x. XhXfXhX#XOX.X}.~.^.U.N.G.k.h.7.5.9.9.2.@.O.O. . .} ) } ( ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ ( ( ( ( } } }  .O.O.@.#.:.,.3.5.5.s.y.u.k.D.m.m.M.M.M.N.U.Z.!.'.4X3XqXqXqX0XqXwX3XqXqXqXqXNXqXsXsXsX3XNXqXqXqXNXqXNXCXqXCXCXqXqXqXqXqXqXNXqXCX",
+"t t t t t t t t t t t t t t 0 t t t t t t t t t t t t t i 0 t t t r y s x.oXzXhX#X#X+X|.}.^.Y.n.c.u.y.5.1.%.$.O.O.| ) o.^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ / ^ / ^ ^ ^ ^ R ^ ^ _ _ ^ ( ^ ( ^ ' ' ' X.' | X.o.;.&.&.>.:.3.5.q.d.s.d.z.c.x.n.n.Z.Z.H.T.].4X3X3X2XqXqXqX3XqXsXqXqXqXsX3XqXsX3XdXqXqXqXqXqXqXqXqXqXqXyX3XqXqXqXqXqX",
+"0 t t 9 t t 0 t 9 t t 9 t t i i t t t t t p t t t t 9 i i t w 0 y e.W.lXkXkXrX+XXX~.Y.Y.n.y.0.5.,.>.@.} o.| } ^ _ ^ _ Q ( ( ^ ( ^ ^ ^ ^ ( ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ _ _ _ _ _ _ _ _ _ ^ ( ( }  .O.%.:.3.5.0.a.s.z.D.x.C.Z.A.M._.[.qXwXqXqXyX3XuXqXsXNXNXqXqXsXqXqX3XyXqXqXyXqXqXqXCXyXqXNXqXyXqXqXqX",
+"i i 0 i t 9 t t t t t t i i i 0 w w 0 t u 0 w t t r r r p i d c.fXzXkXjX@X X~.E.N.z.y.5.3.:.O. .} ( ( ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( } } O.#.,.5.7.7.i.a.h.h.z.x.c.M.'.aXqXqXyX3X3XdXdXqXqXyXqXNXdXqXqXqXyXqXdXqXdXsXsXsXsXsXsX3XyXqX",
+"0 0 9 9 9 t 9 t 9 t 9 t t t 0 0 0 u r r 9 t u u p 0 t t 7 J.lXlXpXpX@X].R.N.z.y.5.,.@.&.} ( ^ ^ ^ / ^ ) ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ( } } +.@.:.3.4.7.y.u.a.d.v.a.x.`.aXsXyXyXqXsXqXqXyXNX3XqXqXqXqX3XqXqXdXqXsXsX3XqXsX3X3XsXqX",
+"9 t t 9 t 9 t 9 t t t t 0 t u r e e i r r r t 9 p t j `.lXlXlXpX X`.K.b.u.9.,.#.| } ( ^ ^ ^ ^ ^ / ^ / ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ^ ( ( }  .@.:.8.5.0.y.s.v.c.s.x.`.3XdXyXCXqXwXsXsXqXsXNXqXyXsXNXqXqXqXqXNXNXqXqXqXqXNXqX",
+"9 9 9 9 q t q t 9 9 t t 0 0 i r y r u t 0 p 0 r 7 G.hXkXhX#XXX!.C.v.7.,.#.O.| } ( ( ^ ^ ^ ^ _ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ( }  .#.,.8.6.4.0.a.a.0.h.Y.dXdXBXCXsX3XyX3XNXqXdXqXqXqXqXBXNXqXsXNXsXqXyXqXqX",
+"9 0 0 0 9 9 t 9 t t 9 t t t t 0 0 t p w b 9 e M.gXxXfXpXXX(.C.s.9.2.#. .( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ( ^ ) ^ ^ ( ( }  .O.@.w.6.6.7.y.p.s.k._.aXdXNXNXqX3XNX3XqXqXNXsXqXNXNXqXqXqXsX3XqXqXqX",
+"0 9 0 0 9 t q t 9 t t t t t p t 0 t t 0 6 r.#XzXjXrX|.E.n.y.4.,.$.} ( ( ( ^ ^ ^ ^ R ^ _ ( ^ ^ R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( / ^ ^ ^ ^ ^ ^ ^ / / ) ( ( | O.@.<.w.e.6.7.5.e.G.].sXsXqXCX3XsXqXdXNXqXNXqXqXBXqXBXqXqXCXqXCX",
+"9 0 0 9 t 9 0 9 t 9 t t r r 9 0 t e y x |.kXgX@XoX~.N.s.4.:. .` ^ ^ ^ _ ^ ^ ^ ^ ^ / ( ^ / ^ _ ^ R ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ) ^ ^ ^ / / ^ ^ / ^ ^ ^ ^ ^ ( ( (  .@.<.1.e.5.5.6.e.H.3XVXwXsXsXNXqXsXdXNXBXBXNXqXqXdXqXqXqXqX",
+"0 9 9 0 9 t t t t t t t r t 0 p t y b.lXhXfXOXXXC.s.4.@. .} ( ^ ( ^ ^ ^ ^ / ^ ( ( ^ ( / ^ ( ( ^ ^ ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ( ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ Q _ ( X.o.+.O.:.8.4.9.9.4.g._.BXsXNXqXqXNXaXBXqXNXyXqXdXqXdXNXqXqX",
+"9 9 t 9 t t t r r r t 9 u 9 p i n '.zXfX@X}.Y.z.5.,. ..._ ^ ^ ^ R ^ ^ R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( }  .@.,.8.5.5.3.8.h.3XdXdXdXdX3XBXNXNXNXqXyXqXsX3XyXuX",
+"9 9 9 9 9 t t 9 r t t h 9 t e k.pXzX#XOXE.b.0.>.O.} ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( } }  .:.>.8.3.1.8.6.].aXBXBXNXNXNXBXqXBXNXNXNXqXBXyX",
+"9 q 9 9 9 u 9 t 9 0 t t 0 y J.hXfX@X}.N.u.4.#. .( ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ( (  .+.@.,.,.:.q.%.W.NXqXVXNXNXNXNXNXNXdXBXqXqX3X",
+"0 9 9 9 9 q h 9 h t t t j `.hXhX+X^.n.e.,.O.} ) ( ( ^ ^ ^ ^ ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ R ^ ^ ^ ^ ( ^ ( }  .@.,.:.>.,.$.k.BXNXqXBXNXBXBXdXNXNXBXqXqX",
+"q r 9 0 r 9 0 0 9 t e l oXgX@X|.T.u.4.@. .( ( ^ ( ^ ^ ^ R ^ ^ R ^ ( ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ R ^ ^ ^ ^ ^ ^ ^ ( ( ^ ( } +.@.%.>.#.O.e.aXBXNXBXBXdXBXBXNXNXNXuX",
+"0 q q t t 9 9 h t 7 m pXhX#X|.V.t.4.O.( ( ( ^ ) / ^ ^ ^ ^ ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ^ ^ ^ ^ ^ ( ( (  .#.O.@.@. .8.aXBXBXBXBXCXBXNXNXNXNX",
+"9 q t 9 r t t t 6 n gXgX+X/.n.7.,.o.( ^ ^ ^ ( ^ ^ ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ^ ^ ^ ^ / ^ R ^ ^ ( } ) O. .@.+.O.-.aXNXBXBXBXCXBXBXNXNX",
+"0 t 9 t t t t r m pXgXOX^.x.7.@.} | ( ( ^ ^ ^ ^ / ( ^ R ^ ^ R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ _ ^ ^ ( }  .+.O.$.{ ..,.dXCXBXBXBXBXdXCXBX",
+"r 6 t t f 0 w s #XkXXX~.b.6.@. .) ) ( ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ( } }  .O.} ( @.aXBXBXBXBXBXBXCX",
+"0 0 t 0 9 u y ].pX+X(.z.6.@.} ) ( ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ) } }  . .( ( -.BXBXCXVXBXBXBX",
+"0 t 9 0 p 6 K.pXiXQ.v.q.@.} ( ( ^ ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ / ( ( ( ( } } ( R R h.ZXBXCXVXBXBX",
+"9 9 0 w i u.pXoX~.b.7.@.} ( ^ ( ( / ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ( } } _ ^ R K.ZXVXNXZXBX",
+"r t t 9 k OX.XXXm.7.:.} ( / ^ ( ( ^ ^ Q ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R _ ( ( ( ` E R ` aXBXBXZXVX",
+"t t r e W.oXXXR.s.,...( ( ^ ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ( ( ( ^ ^ ^ F r.dXZXBXZX",
+"t r 6 t.OX~.R.a.4.O.( ^ ^ ( ^ ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ( ^ ^ ^ ^ ^ ^ / ^ R Y J !.VXVXVX",
+"t e y ~.tX(.n.e.%.( ) ) ^ ^ ^ ^ ^ ( ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ( ^ Q Y R %.ZXVXZX",
+"0 y r.}.~.N.y.:.} ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ( ^ _ ^ ^ ^ ^ _ ^ ( E / ) ( ) ^ ^ ^ ^ ^ ^ ^ ^ ) ^ ( ^ ^ ^ ^ ^ ) ^ ^ ^ ^ / ( ( ^ ^ ^ / ) ) ^ _ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ' ( Q R T F _.BXZX",
+"0 y J.~.R.v.4.O.( ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ( ^ ( R ^ ^ ^ ^ _ Q Q [ R ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ( ^ R ( ^ ^ ^ / R ^ ` R ^ / ^ ( ) ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ X.^ W R T F =.ZXVX",
+"t w.~.T.n.0.#.} ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ / ( ( / / ^ / ^ / ^ ^ ( ( ( ( ^ _ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ( ^ ^ ) ( ^ ^ ( ) ( ^ _ [ ^ / ( ^ ^ ( ( E ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ _ R E T C oXZX",
+"t k.T.U.z.4. .( ( ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( E ( ) ( ^ ( ^ ( ^ ^ ^ ( E ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ( ^ ^ _ _ _ R ) ) / ( ^ ^ ^ ^ _ R / } ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R ~ F B r.VX",
+"y J.V.n.y.:.} ( ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ ^ ^ ( ( / ( R | / ( ( R Q _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ) ( ^ ^ ) ) ( ^ ^ ( ^ ) _ ( ( R _ ` ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( R ^ / E F F ^ BX",
+"w.H.U.z.4.#.( ( ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( R } R ^ _ f.s.d.#.) ) ) ) ^ ^ ^ ^ _ ^ R ^ R ^ / ) / ( Y / ] ) E } R _ / ) _ Y } ^ _ Q ) X.^ ( ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ R ^ R F B D oX",
+"e.M.m.y.3. .( ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R ( ( R O.T.IXKXLXKXLXIXJ. .^ ^ R ^ ^ ^ ^ ^ ^ ( ^ / ) ^ ^ i.KXLXKXr.R ( / ' A.pX) / / ( R R ) ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ( ^ ^ R Y D B D.",
+"t.M.a.0.:. .^ ( ) ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^  .AXLXJXLXJXJXJXLXKXGX( ^ R R ^ ^ ^ ^ ^ ^ ^ / ( ^ ^ e.LXJXLX0.^ / t.mXKXbXR ' ^ _ _ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( E ^ ^ W J S N B.",
+"i.z.u.9.#.} ( / ^ ^ R ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ) W | / mXLXJXLXLXvXbXLXLXJXLXnXT W ^ _ ' ^ ( ^ ( R ( R ^ ) <.^.^.T.%.Y R nXLXLXmX/ ^ Q R ) / Q ^ ^ ^ ^ R ^ ^ R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ E F S M ` ",
+"h.a.y.5.@.( ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ` / 3.LXLXLXHXf.T S #.IXJXJXLX9.W +.r.9.t.E ( ) y.s.u.>./  .p.5.6.( Y 6.GXLXLXMX4.,.W _ R ( ^ ^ ^ ^ ^ ^ ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ^ ^ ^ F S M B ",
+"t.u.7.3.O.( ^ ( / ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( / / !.LXJXJX/.E B H S (.LXJXLX|.S ^.KXLXKX( / Q KXLXKX`._ j.LXLXLXp.~ KXJXLXJXLXLXmXT E W _ ) ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R T B M ; ",
+"t.t.5.>. .( / ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ) ( cXLXLXLX9.C Z I M 2.LXLXLXbXB ).LXLXLXF / R LXLXLXH.E r.JXLXLXp.L KXLXLXLXLXLXcXG ~ Y Y ) R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R F S M ; ",
+"6.7.5.,. .^ / ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ( ( MXLXLXLX8.D B , V 2.LXLXLXvXZ ).LXLXLXW R R LXJXLXT.R e.LXLXJXp.G F.DXJXLXMX<.O.B G G R / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( _ ^ / R F B : # ",
+"6.4.4.,. .^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( _ / bXLXLXJXq.A D Y M ,.LXKXLXvXZ ).LXLXLXH F W LXJXLXE.S g.LXLXLXq.D I vXLXLXcXM M C B T R R ^ R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ( ^ R F B : 3 ",
+"e.3.,.:. .^ ^ ) / ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ Q / ^.LXLXLXQ.B Q.HXm.(.KXLXLXC.Z Z.LXLXKXF S S LXLXLXI.G 4.LXJXLX3.M C cXLXLXzXM : : B F F _ R ^ R ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ) ^ ^ R F M : ; ",
+"1.8.3.:. .^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ [ X.q.LXLXLXHXo.e.GXLXLXJXJXLXf.: n.LXLXLXT V %.LXLXLXK.S l.LXLXLX<.B : nXLXJXnX> : M B S F Q ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ) ^ / R F M ; + ",
+"<.,.@.@. .^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ) ) ) E bXKXJXJXLXcXDXLXLXLXLXxX: : C.KXJXLXnX).GXPXLXLXH.C :.LXLXLXq.N B nXLXJXHXS.;.N B F Y R R ^ ^ ^ R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R S M < : ",
+"w.@.>.#...( ^ ^ ^ R ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ` ^ ( ) E ^ ( MXLXLXLXLXLXLXJXLXJXUX_ ; | LXLXJXLXLXKXPXLXLXM.: >.LXLXLX<.Z B E.LXJXLXLX_., H S E E ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R R S : # [ ",
+"$.$.@.O...^ R ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R ( R Y ( M.HXLXLXLXLXIXHXJXLXLXB Z H.KXLXLXHXe.zXLXKXM.M 2.KXLXKX<.Z : ` GXLXKXKXmXM B E T / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( E F B : $ -.",
+"$...O.O. .^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R F S B ^ >.2.o.1 > W.PX X: : Z F 1.<.M : : , B : , M M M M B N G N D ,.f.q.N N D F R R ^ R ^ ^ R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ( ^ F N ; % k.",
+"=.( }  .} ( ^ ^ ^ R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ _ ^ R ^ R Y F S M B B N N : : Q E > : M S B B : : B : : M M : B B S N B V D S D K K D V S F F R _ ^ ^ ^ _ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ^ R D : # + [.",
+"y ` ^ } ( ( ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R F F S B : M N N : : N : D B D A D M B Z M M B B B B C M C B H H F F S M B B H F W R R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ E F D ; + C qX",
+"u ..R ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( R ( E ^ F F B F B : M V N N B B S G T D H B B B D M S S S S F H S F H F F C J H B F F R R R ^ ^ ^ ^ ^ R ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R S : & % g.NX",
+"u =.R ^ ^ _ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ( ^ E R R Y F H H F S D G H H C J F T J H F F S F F F F W T E F R T R R Y E T G T F R R R ^ ^ ^ ^ R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ W B ; + % `.yX",
+"u y ` E Q ^ / ( ^ ^ ( / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ ^ R R R R F F F F J Y Y F Y F R Y R F R Y Y Y Y R R R R Y R R R R R R R R Y R R R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ R / G N 2 o =.qXqX",
+"u y ..Y R R ^ / ^ _ ^ / ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ ^ ^ E / E R R R R R R R R R E R R R R R R E R E R R ^ R ^ / ^ R ^ E R R E R R E / ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ^ ^ ^ E F L & . + P.aXqX",
+"h y s ^ Y R / / ^ ^ R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ^ E ^ ^ ^ R ^ ^ / ^ R ^ R ^ E / R ^ ^ ^ ^ / ^ ^ ^ / ^ ^ ^ ^ ^ ^ ^ / ^ ^ ^ / / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ E S ; % = ^ 3XCXdX",
+"r u u *.F T / R ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ^ ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ^ / ( ^ / / ) ) ) ^ ( ) ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ^ ^ ^ ^ R W S N 3 @ @ ].3XyXdX",
+"u u t f _ F E E R Q R ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ( ^ ^ ^ ^ ^ ^ ^ ^ / ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ ( / ^ ) ^ ) / ( ^ ^ ( ^ ^ ( ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ R F B & + - w.BXNXNXCX",
+"u h r g 7 R S T Y R R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ / ^ ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R / ^ ^ ( ^ ^ ( ^ ^ ^ / ^ ^ ) ( / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R F S ; 2 @ B aXqXyXqXqX",
+"u h f a u *.F F F Y R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ / ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R F B N = % & K.dXqXqXCXNX",
+"u t f r h y ^ S S T R / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ( ^ ^ ^ ^ ^ / ^ ^ ^ R ^ R ^ ^ ^ ^ ^ ^ ^ R ^ ^ ^ R ^ / ^ ( ( ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R Y F N # * 4 j.3XqXqXdX3XNX",
+"u u u u s f y Q D L ! Y R ^ ^ ^ ) ^ ^ ( ^ ^ ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ( / ^ _ ^ ^ ' Q ^ R R S A = % @ $.aXwXdXdXqXqXNX",
+"u u u u f t f y T D D F F Y ^ / E ( ( R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ^ ^ ^ ^ / ^ R Y K N % % 4 { aXqXqX2XsXqXCXqX",
+"u t u u h t f u 7 F B S S F E ^ ^ ^ / ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ^ ^ ^ ^ R ^ R T D : % % . J 5XyXyX0XwXqXqXqXNX",
+"u u a u h g y u d y J Z B F F Y R / R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ R ^ R F G ; & . $ U 5XyX,XyX2XCXqXqXyX3X",
+"u r a u f r j u u u 6 H B B S F F R ^ ^ ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ R R Y F B , . 5 $ *.,X0X0XqXqXqXqXqXqXqXqX",
+"u u u u y u y g 0 h f 6 J M M S F F R W ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / R R Y S M & . - @ *.3X9X0XqXwX2XCXwXqXqXqXqX",
+"u u u u f f u t f u f g s R M M B D F F R R ^ ^ ^ ^ / ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / R ^ R F B > # % O # j.4XqXwX0X9XwX3X3XwXqXNXqXqX",
+"u u u u t a a f y y f a g j ` M > M B F Y Y E R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R T F V > + . 8 C L.2X1X0X1XwXqXqX3X3XyXqX3XaXqX",
+"u u u u u u u u u u j u d d z ..C , : N D F J Y R ^ ^ / ^ ^ ^ ^ ^ ) ) ^ ^ ^ _ ^ ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ^ R ^ ^ ^ ^ _ _ ^ ^ _ ( ^ ^ ( ^ ( ( ( ^ ^ E Y G A M 2 o o - { _.wX8X0X0X0XwXyX0X0X0XqX0XqXqXqX",
+"u t u u u t u u u u u u g u r d s W < : : M D T E R R Q ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ^ ^ _ ^ / ( ^ ^ / R R Y F V C 3 X 4 * : l.<X3X-X>X8X0X0X0X0X0X0XqX0XqXqX0X3X",
+"u u u u u u u t u u u f g f g g u d *.C ; M M : S F Y E R ^ R ^ ( / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ( ^ ^ ^ R R R R F S B 3 + + $ 4 ^ K.1X4X<X7X9X9X9X>X2X2X0X0X0X0XqX0XwXwX",
+"u u u t t u u u u f u f g u g g u u j u R Z 3 : : M G T R Y R ^ ^ ^ ^ ^ ( ^ ( / ^ ( ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ^ R R F S M ; % @ = 4 L j.,X>X:X7X-X9X9X7X9X1XqX0X2X0X2X0XwX2X0X2X",
+"i u u u u u u u u f u f u g j u z u y g f =.W ; = A N M F F F R R ^ ^ ^ / ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ^ ^ ^ ^ ^ ^ ( ^ ^ R ^ R F F V > $ @ + @ $ =.{.1X:X8X>X>X8X>X8X9X9X9X9X1X2X2X0X0X2XwX0X3X",
+"u u u t u u u u u u f u d u d g a u u u f f d ..H # ; : : B S F F F R ^ ^ ^ ^ ^ ^ ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ / R Y F D N A - * @ . 2 ..K.1X;X:X6X-X7X1X9X9X9X1X>XwX9X1X9X2X2X2X0X0X0X9X",
+"u u u u u u t u u u u u u u u u u u u g d z u g j *.C ; ; > N M B S F F R R E ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ^ ^ ^ ^ R R F F B B : @ * =   % [ k.>X>X-X:X>X8XeXwX>X>X2X>X1X9X0X>X0X0X9X9X0X9X0X0X2X",
+"u u u u u u u u u u u u g g f u g u u u d d z g g j y *.N ; $ ; M M B S F F R R R R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ` ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ^ _ ^ ^ R R Y F D B : $ $ . # + . W D.;X>X:X>X-X>X>X;X1X:X2X1X>X>X1X>X1X9X2X2X9X9X0X0X0X9XwX",
+"u u u u u u g u u u u u u u a h u d f f f f g j j j f j x ..U % % $ ; M M B S F F Y R R ^ ^ ( ^ ^ ( ( ^ ^ ^ ^ ^ ^ ) ( / ^ ^ ^ ( ( ^ / ^ ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ / ^ / ^ ^ ^ ( ^ ^ ^ ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ) ) ) ( ( ^ ^ ^ ^ _ _ Q _ R T ! G V : , % @ * - + . *.P.:X=X>X:X>X>X>X:X7X7X>X>X1X1X1X1X1X1X1X1X9X9X9X9X9X9XwXwX0X",
+"u t u u u u u u u u u u u u u f f u f f f f d j f j j j j j k =.W ; + = ; > > N B S F F J W R ^ ^ ^ / ( ^ ( ^ ^ / ^ ^ ( ^ ^ ^ ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ( ^ ) ^ ( ^ ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ^ ^ ^ R _ ^ _ _ _ Q Q W R / ~ L G B , ; ; $ @ + . % & B.K.4X;X6X6X=X>X>X:X:X7X>X-X>X>X1X>X2X1X1X1X1XwX9X9X9X9X0X0X0X2X0X",
+"i u u u u u u u a u u f u u f u u f u f f d g j j j j j j z v z j -.` M $ @ $ ; ; > M M D D D F F W W Q ^ ^ ( ^ ^ ^ ^ ^ _ _ _ _ _ R _ _ / ^ ^ / ^ / ^ ^ / ( ^ ^ / ( ^ ^ ^ ^ ^ / / ( ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ _ R R E E ] ! ! D B M , ; $ 1 o %   O # [ j.{.-XeX6X*X6X:X>X7X>X>X:XeX>X>X>X1X1X1X1X>X1X1X1X1X1X9X9X9X9X2X0X0X0X",
+"u u u u u u p u u u u a u u g u f u f f j j g j j j j j x j f j z z k j -.J ; # # # ; ; < Z M B B S T F F F Y R R E ^ ^ _ R ^ ^ ^ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ R ( ^ ^ ) ( ^ / ( ^ ^ ^ ^ ^ ( ^ / ^ / ^ ^ ^ / R R ^ T E E T L L N N N > $ @ @ + % o % I -.K.$X$X:X7X=XeX>X-X;X:X>X:X8X>X>X>X>X>X7X>X1X1X0X1X1X1X1X9X9X0X9X9XwX0XqX0X",
+"u u u u u u u u u f u u u u g u f u f f z z g j j j j x j j k x x z j v z x k %.J ; % @ & # # ; : M M : B S H S F F F Y E R E R ^ R R ^ R ^ ^ ^ ^ ^ R ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ R ^ ^ E ^ R E R R F T F F F B B M : 3 3 2 - @   + % . % I *.k.$X*X$X6X=X=X=XeX-X;X>X8X-X:X7X>X>X>X>X>X1X1X>X1X9X1X1X1X1X9X9X9X0X0X0X9X2XwX0X",
+"u u u u p u a u u u u u a f g u u f f j z d j j j j j z f v j j j x k k v v x k n n $._ A = @ + # % & < ; ; M M M M B B S D G F G F T T F Y Y Y R R R R Y Y Y R Y R Y R E Y Y Y F F F F F S S B B M M : & < ; $ @ = @ @ 2 & . # Q g.L.&X*XeX;X&X%X$X=X:XeX6X>X>X=X:X>X8X7X>X>X>X>X>X>X1X1X1X>X9X1X1X9X9X9X9X0X9X0XwX0XwXqX",
+"u u u u a u u u a u u a g u u u d u z g z u g z j j j j v f j v c j k k j c c j x x x x m l { Y : $ * - + + + $ ; ; ; ; : : : : M N M B B B B S S B S B B B B B B B B B B B B M M M N M : ; ; # ; # $ # % # + * $ $ $ # H *.D.&X%X$X$X=X;X;X$X$X$X$X:X6X$X:X$X6X>X8X:X7X>X>X>X>X1X1X1X1X1X1X9X1X1X1X9X9X9X9X9X0X0X0XwX0X0X",
+"u u u u u a u u u u u u u u u g u u u d a z d j j j x j k j k k x v v j x x x c c x x c v c c k n n ..Q S : # . @ + @ + + # # # # & # ; # ; ; ; ; ; ; ; ; : : ; ; ; ; ; ; ; ; ; # # @ $ $ @ + @ @ + +   * * $ U { l.D.&X$X%X%X=X$X$X$X%X*X$X$XeX=X:X;X:X;X-X:X>X-X-X>X>X>X>X>X>X1X>X1X>X1X9X>X9X1X1X9X9X9X9X9X9X9X0XwXwX0X",
+"u u a u u u u u u u u u f u u f f f j j d g j j j z x j j z z x j x z x x x x c c c n c c c x x c x x c c x k =.` Q C M + + + + + @ # @ + + + + + + @ @ + + + + @ + @ + @ + + $ + + + + 4 O + % . [ [ B.g.G.;X;X=X$X$X=X$X$X$X$X$X$X$X$X$X$X$X$X$X=X=X:X:X-X>X>X>X>X>X>X>X>X>X>X>X1X1X1X>X1X1X>X1X1X9X9X9X9X9X0X0X2X2X2XwX",
+"u u u u u f u u f p u u u g u f f f j u d g z g j j j j z x j j j x x x x x x v x x c c c c n x k c x n x c m k k n n n n n O.$._ R J S M Z ; #   + + + @ + @   + + + + + + ; Z B F Y R *.h.G.<X<X-X>X6X>X>X>X;X$X=X$X=X$X$X$X=X$X=X$X$X$X$X=X=X=X=X:X:X:X>X>X:X>X>X>X>X>X>X8X>X>X>X9X1X1X1X1X1X>X1X9X0X9X9X0X2XwX2XwXqXwX"
+};
diff --git a/images/button4hilite.xpm b/images/button4hilite.xpm
new file mode 100644 (file)
index 0000000..2347743
--- /dev/null
@@ -0,0 +1,352 @@
+/* XPM */
+static char *button_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"157 90 256 2",
+"   c #025D01",
+".  c #095E00",
+"X  c #005E0C",
+"o  c #155B00",
+"O  c #005D14",
+"+  c #016303",
+"@  c #00630C",
+"#  c #016B01",
+"$  c #006B0B",
+"%  c #0B6300",
+"&  c #0B6B00",
+"*  c #006614",
+"=  c #017301",
+"-  c #017B02",
+";  c #007A0A",
+":  c #0A7C00",
+">  c #017308",
+",  c #007714",
+"<  c #146500",
+"1  c #137600",
+"2  c #006828",
+"3  c #006739",
+"4  c #2A557D",
+"5  c #31587F",
+"6  c #006641",
+"7  c #265B8B",
+"8  c #2C5A85",
+"9  c #2B5E8C",
+"0  c #265985",
+"q  c #245E91",
+"w  c #295E90",
+"e  c #315D85",
+"r  c #315E8A",
+"t  c #305780",
+"y  c #325F91",
+"u  c #2C608D",
+"i  c #286089",
+"p  c #2C6191",
+"a  c #276292",
+"s  c #31618D",
+"d  c #3A648C",
+"f  c #386085",
+"g  c #326491",
+"h  c #396691",
+"j  c #376895",
+"k  c #1F5B8F",
+"l  c #466A8D",
+"z  c #466D92",
+"x  c #507497",
+"c  c #018301",
+"v  c #00830A",
+"b  c #008B01",
+"n  c #008B0A",
+"m  c #098300",
+"M  c #0A8B00",
+"N  c #008614",
+"B  c #019301",
+"V  c #00920A",
+"C  c #009B01",
+"Z  c #009A09",
+"A  c #099400",
+"S  c #0A9B00",
+"D  c #009816",
+"F  c #158800",
+"G  c #139900",
+"H  c #01A401",
+"J  c #00A20A",
+"K  c #00AB01",
+"L  c #00AC0A",
+"P  c #0AA300",
+"I  c #0AAD00",
+"U  c #00A711",
+"Y  c #01B400",
+"T  c #00B30A",
+"R  c #00BA03",
+"E  c #00BA0A",
+"W  c #09B200",
+"Q  c #09BA00",
+"!  c #00B610",
+"~  c #00B811",
+"^  c #00B919",
+"/  c #12A700",
+"(  c #12BE00",
+")  c #15B300",
+"_  c #119B10",
+"`  c #00C302",
+"'  c #00C20B",
+"]  c #00CB02",
+"[  c #00CB0A",
+"{  c #0CC300",
+"}  c #0ACA00",
+"|  c #00C218",
+" . c #00D202",
+".. c #01DB02",
+"X. c #00DD0B",
+"o. c #07D603",
+"O. c #00DB10",
+"+. c #00D614",
+"@. c #16C900",
+"#. c #14D400",
+"$. c #00E302",
+"%. c #00E309",
+"&. c #00EA03",
+"*. c #06E904",
+"=. c #00E916",
+"-. c #01F202",
+";. c #01FB02",
+":. c #02FE0A",
+">. c #0CFE04",
+",. c #07F706",
+"<. c #0CFF14",
+"1. c #03FA15",
+"2. c #15E900",
+"3. c #12FF0B",
+"4. c #17FB05",
+"5. c #15FF14",
+"6. c #13FF19",
+"7. c #1BFF1B",
+"8. c #1AFF15",
+"9. c #0BFF28",
+"0. c #1DFF2A",
+"q. c #17FF27",
+"w. c #1AFF33",
+"e. c #00E923",
+"r. c #28D500",
+"t. c #28E700",
+"y. c #29FC06",
+"u. c #23FF1B",
+"i. c #27FF17",
+"p. c #39FD07",
+"a. c #37F70C",
+"s. c #23FF24",
+"d. c #2BFF25",
+"f. c #2CFF2B",
+"g. c #25FF2B",
+"h. c #2CFF33",
+"j. c #29FF38",
+"k. c #37FF27",
+"l. c #33FF33",
+"z. c #3BFF34",
+"x. c #3AFF3B",
+"c. c #31FF3C",
+"v. c #00C422",
+"b. c #3DFF42",
+"n. c #38FF47",
+"m. c #31FF53",
+"M. c #00FC56",
+"N. c #44FF1C",
+"B. c #48FF28",
+"V. c #42FF34",
+"C. c #45FF3D",
+"Z. c #4BFF37",
+"A. c #58FF35",
+"S. c #56FF2E",
+"D. c #62FF3A",
+"F. c #43FF42",
+"G. c #42FF49",
+"H. c #4BFF45",
+"J. c #4BFF4B",
+"K. c #4BFF52",
+"L. c #48FF54",
+"P. c #52FF43",
+"I. c #57FF49",
+"U. c #51FF59",
+"Y. c #5BFF54",
+"T. c #5AFF5B",
+"R. c #52FF54",
+"E. c #52FF62",
+"W. c #5DFF6D",
+"Q. c #58FF67",
+"!. c #4DFF69",
+"~. c #64FF43",
+"^. c #66FF4A",
+"/. c #63FF54",
+"(. c #62FF5C",
+"). c #6AFF59",
+"_. c #75F854",
+"`. c #63FF63",
+"'. c #6CFF6B",
+"]. c #69FF64",
+"[. c #6CFF72",
+"{. c #66FF76",
+"}. c #74FF63",
+"|. c #76FF6A",
+" X c #73FF72",
+".X c #7AFF7B",
+"XX c #77FF77",
+"oX c #449DBF",
+"OX c #459CD3",
+"+X c #4497C8",
+"@X c #4EA5D7",
+"#X c #54A5D6",
+"$X c #56A9D6",
+"%X c #55AADA",
+"&X c #5BA6D4",
+"*X c #5BAAD5",
+"=X c #5BAAD9",
+"-X c #58A6D9",
+";X c #5EB0DC",
+":X c #5EB0D6",
+">X c #58A3CB",
+",X c #5CAAE0",
+"<X c #5DB1E1",
+"1X c #64A5C9",
+"2X c #62ACD6",
+"3X c #63ADDB",
+"4X c #6BACD2",
+"5X c #6AADDB",
+"6X c #62A6D2",
+"7X c #65B0DC",
+"8X c #6AB2DC",
+"9X c #67B4D7",
+"0X c #71B4DE",
+"qX c #75B2D6",
+"wX c #70A8CD",
+"eX c #64ACE1",
+"rX c #64B2E0",
+"tX c #6AB2E1",
+"yX c #69B7E2",
+"uX c #72B5E0",
+"iX c #72B9E2",
+"pX c #619FC6",
+"aX c #73FF81",
+"sX c #7BFF83",
+"dX c #7AFF8B",
+"fX c #7FFF9D",
+"gX c #82FF7D",
+"hX c #88FF75",
+"jX c #91FF77",
+"kX c #EFFF2A",
+"lX c #83FF85",
+"zX c #83FF8A",
+"xX c #8AFF8A",
+"cX c #8AFF83",
+"vX c #88FF94",
+"bX c #98FF97",
+"nX c #8FF991",
+"mX c #98FFA1",
+"MX c #8DFFB2",
+"NX c #A4FF9A",
+"BX c #B5FFB2",
+"VX c #B4D090",
+"CX c #B9FFC4",
+"ZX c #9DFFD8",
+"AX c #C3FFB7",
+"SX c #E4FFAF",
+"DX c #D8FFD3",
+"FX c #C7FFCA",
+"GX c #F6FDD8",
+"HX c #E9FFE7",
+"JX c #FFF5FB",
+"KX c #FBFEF6",
+"LX c #FDFDFC",
+"PX c #F7F8F8",
+"IX c #F3F0ED",
+"UX c #FDD2DC",
+/* pixels */
+"9 9 9 9 w 9 9 u 9 s s r u y s s s s s s s s s i h g h s h h g s s d g g h h d s d h s f d d d s h g g j g j j h h d r l l x i.k.V.H.Y.I.Y.(.[.XX X|.hX.XaXaXaXaXaXaXaX'.'.}.}.}.}.}.}.}.|.}.}.qXqXqXqX8X0X8X0X0XtXtXtXqX8X8X8X8XtXtXtX3X3X=X;X=X=X=X=X=X=X=X=X3X3X=X3X3X=X=X7X=X=X7X=X7X3X2X7X3X3X5X7X7X5X8X7X8X8X8X8X8X8X",
+"u 9 u w g 9 9 u 9 y 9 s 9 s y g 9 s s s h s g g h i s s s s h s s h d d s d j j d s h f s h h h s j j d s d x i.Z.Y.)..XgXgX.XXX|.[. XXX'.{.[.{.`.].).(.T.(.(.(.(.(.(.{.{.Q.Q.E.E.Y.Y./././.).).Y.(.(.].}.}.qXqXqXqXuX8X8X8X8XtX8X5X5X3X7X=X=X=X,X,X%X=X=X=X=X=X=X3X=X3X=X7X7X=X7X=XeX7X7X3X=X7X3X7X7X7X7X8X8X8X0X8X8X0X0X",
+"9 9 u 9 9 9 9 g u 9 9 s s s s 9 s u s s s s s s i s s s s s s s h s g d f j g p s s d j g s d r d x d.H.).cXxXgX X X X X'.`.`.Q.T.T.Y.R.L.U.!.L.J.G.C.G.G.b.G.G.b.G.G.F.x.b.F.C.C.H.H.H.H.J.J.K.E.!.W.I.J.R.Y.Y./.)._.5X8X0X0X5X5X5X5X3X2X3X3X=X=X*X&X%X=X-X-X=X&X=X=X=X=X3X=X3X3X=X;X=X3X3X7X7X7X7X5X5X7X8XrX8X8X8X8X8X8X",
+"u 9 9 u u 9 9 9 u r r 9 y 9 r g s s s s s s s s h s h s h s s h s s h u u g a j g u h u d x z.T..XcXxXzXsX[.[.[.{.W.U.K.L.G.b.x.l.c.f.h.j.j.0.0.q.0.q.3.8.5.5.5.5.5.5.5.5.8.5.5.8.7.q.j.j.h.c.l.l.x.b.n.x.F.A.P.J.!.!.J.J.I.^.wX4X7X7X;X=X3X3X6X*X$X$X=X-X-X-X&X=X=X*X=X=X3X7X=X=X3X7X7X3X3X3X5X7X3X7X7X7X7X8X8X0X8X8X0X8X",
+"9 9 9 9 9 9 9 9 9 s 9 y r g g 9 s s s s s s s s g u s s u u g g s s g g h h s r f z d.^.XXxXcX.XdXdX{.Q.T.R.R.b.x.c.l.s.8.5.<.:.;.;.-.-.&.&.%.$.X.%...O.O.O.O.X.O.O.O.X.%.X.....$.&.&.-.-.:.:.:.>.<.5.i.i.h.c.m.c.b.x.n.b.C.H.A.P.~.^.3X2X3X=X=X=X%X%X=X*X#X%X-X=X=X=X=X3X=X=X7X5X3X3X3X5X7X3X3X7X7X7X7X8X7X8X8X8X8XqX8X8X",
+"9 9 u u w g 9 u 9 r s s 9 9 r r u s s s s s s s s s g s u h g u s h g d r f l z.].xXxXsXlX.X].Q.W.U.J.x.h.g.5.5.:.;.&.&... . .] ] ` E R R R R Y Y R T W W I W W W W W E T Y R R E ' ' { } `  . .....%.1.1.;.>.>.8.8.s.j.h.c.c.z.x.V.Z.L.P.~.1X*X#X&X-X=X#X=X*X-X=X=X=X*X=X=X7X=XeX7X3X7X7X7XtX3X7X7X5X7X7X5X8X8X8X8X7X8X8X",
+"9 9 9 9 9 9 9 g 9 s y 9 g r 9 g s s s s i s s u s s g s u g s s s s s h k.XXbXlXzXsX[.'.(.J.J.x.d.6.5.;.&.$...] ] ` ` R R R R Y Y R R Y Y Y R Y Y Y T R Y R Y Y Y Y R Y Y R Y Y Y W Y ~ ~ T Y Y Y W Y Q { ]  ...%.1.:.>.3.5.q.g.h.c.n.k.l.l.x.C.I.6X=X#X=X-X#X*X*X=X=X=X=X3X7X=X=X=X7X=X3X7X3XtX7X3X7X8X8X7XrX8X9X8X8X8X8X",
+"9 9 w 9 9 9 9 9 9 s 9 r 9 y s y u s u i d 5 s h u u h s s g g g d 3.Y.mXvXxXsX X].T.I.V.k.i.>.;.&... .` ` ` R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y R ` ` `  .o.*.-.;.>.6.6.7.h.f.h.c.h.k.z.~.&X-X#X%X%X$X*X*X*X=X=X=X7X7X7X7X7XtX7X7X5X5X7X8X9X8X8X8X8X8X8X8X0X",
+"9 w 9 9 9 9 9 9 g 9 y 9 9 y r 9 s 9 s s p p s 8 f j 9 g g r l z.gXbXlXzX.X[.T.J.x.d.5.;.-... .] ' ' E R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K Y Y R Y R ` ]  .$.=.:.;.<.6.0.u.g.s.d.g.V.D.&X%X-X-X,XeX-X=X=X2XeX7X=XtX7XrX7X8X7X8X7X9X8X8X8X8X8X8X8X8X8X",
+"w 9 9 9 9 9 u 9 9 r r s g r u r 9 s 9 9 p p u d f i g e z C.cXxXzXzX[.`.U.x.g.6.;.$...[ ` E E Y R E Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y R Q Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y E T R E E ] [  .$.-.;.:.6.5.u.g.0.7.k.S.>X3X,X-X-X3X=X3X=X3XtX3X7X7X7X7X8X7X7X8X9X8X8X9X8X8X8X0X8X",
+"9 9 9 w 9 w 9 9 9 r 9 r 9 s g r r r u s s s 9 p g d z Y.cXbXzX.X`.R.H.f.6.;.&...[ ` E R R R E R R Y Y Y Y Y Y Y W K Y Y Y Y Y W Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R T R Y Y R R R R ` ] ..$.-.;.:.<.5.q.0.w.s.B.pX*X3X3X&X3X7X7X3X7X7X7X8X8X8X7X8X9X8X7X8X8X8X8X8X0X0X",
+"9 9 9 9 9 u 9 u u 9 g 9 s y 9 9 g 9 s u s g s 9 h z.cXxXzX X`.Y.b.d.;.-...] ' R E E R T Y Y K Y Y Y Y Y Y Y Y K Y Y Y Y Y Y Y Y Y Y Y Y Y W R Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y K Y Y Y K Y Y Y Y Y Y Y Y Y R R E ` ] ..$.2.;.9.w.6.i.y.i.B.pX=X=XeX3X3X9XrX7X5XrX8X8X8X8X5X9X8X8X8X8X8X8XqX8X",
+"7 9 9 w 9 9 u u 9 g r s s r 9 r 9 y r r s 9 s B.xXmXfX X'.J.l.7.:.X.O.` E Y Y Y R Y Y Y Y Y Y Y Y Y K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Q Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y K Y Y Y Y Y Y Y R ' ` O...2.,.;.<.3.4.9.i.Z.&X7X=X:X9X2X7X8X8X8X8X8X8X8X8X8X8X0X8X8X8X0X0X",
+"9 w 9 9 9 u 9 u 9 r 9 9 u r g r r 9 s s e i.XXbXzXaX'.Y.h.5.>... .[ Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K K Y Y Y Y Y Y Y R Y Y Y Y Y R E ` [ ..*.,.1.9.q.9.>.k.A.2X8X7X7X8X7X7X8X8X8X8X8X8X8X8X8X8X0X8X0X0X",
+"9 w u 9 9 9 u 9 9 r 9 s g 9 s 9 s 9 y z ].bXvX.X'.R.z.8.;.$.] ` R Y R Y Y R Y Y Y Y Y Y Y Y Y Y Y T Y Y K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y W Y Y Y Y Y K Y Y Y Y Y Y Y W Y Y Y Y T R Y Y Y Y Y Y Y R R ` ] X.=.1.;.;.4.;.3.k.4X7XtX7X5X8X5X8X8X8X8X0X8X0X8X8X8X0X0X0X",
+"u u u g 9 s u u g 9 r u 8 u s y 9 e Z.vXvXgX XY.F.0.1.$. .` R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R `  . .o.;.:.1.1.-.3.C.5XrX7XrXtX8X8XtX0X8X8X8X8X0X0X8X0X0X",
+"u u 9 u s u u 9 s 9 s i g u a g l  XnXcXsX`.F.s.:.&. .` R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W ` ` ] ..$.1.:.-.,.4.y.4X2XrXtXyX8X0X8X8X8X8X0X0X0X0X0XuX",
+"9 u s 9 u u s 9 u p u 9 9 p u a.cXvXcX'.R.f.<.&. .` R Y Y Y Y Y K Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y W R Y Y Y R Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Q W Y Y K Y R ` '  .$.&.-.-.*.*.2.~.8XtXtX5X9X8XyX0X8X0X0XuX0X0XuX",
+"9 u 9 u 9 8 s s 9 u u p u s G.mXxXhXT.Z.7.-...] R W W R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R R Q } } o.&.-.2.&.&.V.7X5XyXtX0X0X0X8XyX8X0X0XuXuX",
+"9 9 9 9 u s s s u s u 9 d ).MXMX|.P.z.>.&. .' R R Y Y W Y K Y Y Y K Y Y Y Y W W Y Y Y R Y Y Y Y R Y Y W Y R Y Y R Y Y Y W R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K Y Y Y Y Y R Y Y R R ] ..%.=.$.%...y.8XtXyX8X8X0XiXiX0X0XuXuXuX",
+"w 9 w g 9 9 9 9 g f e d XXvXjX}.L.g.;...` R Y R R R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R E ]  .O.$.o.o...2.4XyX0X0X0X0X0XiX0X0XiXqX",
+"u u 9 9 9 u 9 s 9 5 x sXzXXX).I.<.1. .' R Y Y Y Y Y K Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W R Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K Y R R E Y Y ' ] X...#. .+.&.4X8X8X0X0X0X0XiXuXiXuX",
+"9 9 9 9 s g 9 g 9 x jXdXhX).n.<.$.] ' R R Y Y Y Y R E Y K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y R Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y W Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y K Y Y Y W Y E E E E R W | Q }  .X. .} #.8X8X0X0XyXiX0XuXuXuX",
+"u u r g e 9 p s l hXfXdXE.f.;.$.] R R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R ` ' ]  . .] ` ..4X0X0XtXiX0XqXuXuX",
+"u w u 9 s w 9 d gX.X XE.h.:.$.] R K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W R Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y R Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R E ` ] ] ] ' R #.wX7X0XuXuXuXuXuX",
+"9 g 9 s p p d ].sX.XI.g.:...` R R Y R Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y R Y Y W Y Y Y Y Y Y Y Q Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R ' ` ] ] W E *.qX8XqXiXuXuXiX",
+"g 9 s r p u C.zX[.R.f.;...` W Y Y Y R Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y R Y Y Y Y Y W Y Y R Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y R ' ` ] ` T T 4.qX0X0X0XiXuX",
+"9 g g 9 u i..X[.Y.x.;...` R Y Y Y K Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y R Y Y Y Y R W R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y R Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R R ` ` R Y K W k.0XyXiX0XuX",
+"g 9 g g z '. X`.x.:.%.] Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y Y W Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T R Y Y R R R ' W Y K I 4X8XiX0X0X",
+"r g r s Y.[.`.x.7.$.] R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y R Y Y Y R Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y R Y Y Y Y Y Y Y Y Y Y W Y Y Y Y R Y Y Y Y Y Y Y Y W Y Y Y Y Y Y R W Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y R R R K I H 2.qX8X0X0X",
+"y g g 4.'.`.J.f.&. .R R Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y W R Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y R E ! E K H H V.0X0X8X",
+"9 g r (.).E.l.:...` R Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y R W Y Y Y Y Y Y Y Y R K Q / W W Y Y R | | ^ Y I Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y E Y W W Y R R Y Y Y Y Y Y Y Y W Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y E T U K @.qXyX8X",
+"u r i.T.Y.F.6.%.] E Y Y Y Y Y Y Y Y Y Y Y Y W R Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K E T E E E T Y / I Y R W W P R Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y R Y Y Y Y Y Y K Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y L C P B.8X8X",
+"g e I.Y.J.d.-. .E R Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y W Y Y Y Y Y Y Y R W Y W W Y R K Y Y I W Y W K Y R E Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K R Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W R Y Y Y Y Y Y Y Y Y Y Y Y R W K K J A @.8X8X",
+"e 4.Y.J.l.6.%.` R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y R E E R Y Y R E ~ E E T E ' T R K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y I R K E Y ' Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y E R W Y H K C A I.8X",
+"e k.H.b.s.;.[ R Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y ^ ~ R Y R Y ~ ^ T R Y K Y K W W Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y E T K Y W Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y E Y W Y K J C b t.0X",
+"f C.F.l.6.&.` R Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y W P Q K K W W ) Y K R R Y R R E Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y E R K Y K H Z B I qX",
+",.C.z.f.:...' R R Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y W R Y Y R Y Y Y W R Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y R Y ' ! Y K Y Y R E Y R K ~ | Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y ` K R Y Y R Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y T R Y Y T T J b B D.",
+"4.z.f.q.-.] R Y Y Y R Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y HXLXLXLXLXzXT K T E K KXKXKXJ.Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W R Y Y Y Y Y Y Y Y Y Y Y Y Y R Y ] sX5.K E R Y Y Y Y Y R Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y E E L Z M n p.",
+"8.k.g.3.$.` R Y Y Y E Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R I Y ' ~ Y Y E q.LXLXLXLXLXGXL L Y Y Y LXLXLXI.K Y K E T R R Y Y W Y W I I Y R E K T K R Y W Y Y R W T E ~ Y / +.J.IXKX9.E Y I T Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y I Y Y K C B M @.",
+"8.d.7.>...' Y I Y T E Y Y Y Y W Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y E W W E T Y Y T `.LXLXJXLXLXLXq.H K Y K LXLXLXZ.I P W H Y R Y E Y E R L E T E E ! Y T Q Y E W R Y R K R Y ! Q W <.LXLXLXq.H Y K Y T Y Y Y Y E R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y W Y Y K Z B c ) ",
+"6.i.<.;...E Y Y Y Y E Y Y Y Y Y Y Y R Y Y Y Y W Y Y Y Y Y Y Q Y Y Y Y R Y Y Y Y Y Y Y Y W W Y E Y R T DXLXLXAXLXLXLX'.C C K H LXLXLXI. .F.F.i.K K K Y ' T [ G.E.T.b.[ ! W R Y 6.q.:.$.` Y o.6.<.w.H *.I.LXLXLXG.>.' K K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W R Y Y Y Y Y Y Y Y Y Y Y R Y W Y K Y C B c M ",
+"6.8.:.-. .R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y W R -.LXLXLXL.xXLXLXLXK C C K LXLXLXBXLXLXLXLXAX` Y Y ! !.HXLXLXLXLXHX!.G T Y LXLXLXR.K K T.KXLXLXY U.LXJXLXLXLXLX-.H K K Y K Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y I Y Y K H B v = ",
+"6.3.:.*. .Y Y Y K Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y R K [.LXLXLX=.j.LXLXLX0.b C H LXLXLXLXLXLXJXLXLX.XP K s.KXPXLXLXLXLXJXLXS.T C LXLXLXI.T K H.LXLXLXC E.LXLXLXLXLXLX1.C H K K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y I Y Y K C B v # ",
+":.>.:.*.[ R Y Y Y Y R Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y W Y E Y Y Y Y DXLXLXKXD Z KXLXLXzX- B B LXLXKXHX .C NXLXLXKXY K GXLXLXCXv.^ FXLXLXHXH Y JXKXLX~.H K J.LXLXLXH X.G.LXLXLXm.2.L D C H K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Z b v = ",
+":.;.;.&.] R Y Y I Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Q Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y E Y Y Y ;.PXLXLXUXm.m.UXLXLXLXP m A LXLXLX!.- : 4.LXLXLX;.*.LXLXLX6.L U 9.LXLXKXe.J LXLXLXZ.C C L.LXLXLXH Z 1.LXLXLX1.: v n B C K K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y R Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y I Y Y T C n ; & ",
+":.-.1...` Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y R W Y Y Y Y Y Y Y Y R Y Y Y Y Y Y I E T Y K R `.LXLXLXLXLXLXLXLXLXLX6.b M LXLXLXV.c - %.LXLXLX*.*.LXLXLXa.M B -.LXLXLXM.D LXLXLXF.B C G.LXLXLXA Z -.LXLXLX#.1 c m B C P K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y R Y Y K Y Y K C n ; & ",
+"-.;.&.$.] E Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y E W W K R K DXJXLXLXLXLXLXLXLXLXLXSX; D LXLXLXVX- - w.LXLXLX] E LXLXLXm.Z n i.LXJXLX| n KXLXKXW.A n nXLXLXLXD n t.LXLXLX$.= m : B C K K Y T Y Y Y Y Q Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y Y Y Y Y W K B c - # ",
+"&.&.&...] R R Y E Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y E Y Y R ~ 9.LXLXLXHXbXmXmXmXHXLXLXKXE N LXLXLXLXn.-.HXLXLXDXc n FXLXLXHX>.>.HXLXPXBXc b LXJXLXHX^.|.JXLXJXLXn M &.LXJXJX_.4.- n B C K Y T Y Y Y Y Y Y Y R Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K K B c > : ",
+"$.$.$...` R Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K E T aXLXJXLXaX- - = $ vXLXJXLXn.N LXLXLXHXLXLXLXLXLXz.- -  .HXLXLXLXLXLXLXHXo.c - jXLXLXLXLXLXIXLXLXLXc : D KXJXJXLXLXZ n B H K K Y R Y K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y E R Y Y H B - $ P ",
+"o. .$. .] E Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W K W DXKXLXLXs.- - - = w.LXLXLXAX: KXLXLXkXCXLXLXKXT.- c c - o.bXLXLXLXLXZX#.- c - R AXLXLXLXfX;.LXLXKXv v c n.LXLXLXKX=.n B C K K Y Y Y Y W Y Y Y Y W Y Y Y Y Y Y Y Y R Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y C b - $ @.",
+"#.] O.] ] E Y T R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W R Y Y Y Y Y Y Y Y Y Y Y Y R E ~ U U B v v - - - ; - , , N N N n N n - ] 2.A - - - v b v , ^ &.&./ : c c v n c c  .%.^ v - - n N ; n c b R e.e.T c M B C K T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K C c =   y.",
+"#.` ' ] ` R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y R Y Y R W Y Y Y Y Y Y R K W K C C B b c v c b c c c v c c M c b c - m - - c b c b n n D n v c m n v n n n B B c c : b m c v M c c M b J n V - F B C K K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K K B c # + A.",
+"8 Q E E ` R Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R I P P G C b c c b b B B b b n c m m b v b b c b b b c b B B C B B b b c c b b B V B V B M : - - b c : M b C B V B b b b C H K K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y W Y Y K K C c # + G %X",
+"u ` T Y R E Y R Y Y Y Y Y R W Y Y Y Y Y R W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y E Y Y R T L C B B B B B C C B Z V Z b B Z Z n n Z v V b B B B H P C B B b V M M M M H H C B B M B b b n M B D B K C C b B C B C K K Y T Y Y Y W Y Y Y Y Y Y Y Y Y Y W Y Y R W Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y K C c # + r.<X",
+"r ..K Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K K H H H C H K H H H H H H C C H C C C C C B C C H H H H H H J C C C C C H K L J L H C C C C C C H H K H H H C H C H K L Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y T T H M < % X D.*X",
+"r e Q K Y T T Y Y W Y Y Y Y R Y R Y Y Y Y Y Y Y R Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K K K K K K L K K L K K H H L H L H H C H H H H K K K K K K H H J H P H K K K K K K K H H J K H K K K L K K H H H H K K K Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y W Y Y Y Y Y Y Y Y K Y Y Y Y Y Y Y Y Y L C c + . ( =X7X",
+"u s @.H K T K Y Y K E Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y K Y Y K Y Y K K K Y K Y Y Y Y K Y L K Y K K K K K K K Y K Y Y Y Y K Y K K K K K K Y T Y T K K K K K Y K K K K Y Y K K K K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y C K n = 2 % a.=X=X",
+"u u u W H K T Y Y Y E Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K Y Y Y Y K Y Y Y Y T T Y Y Y T Y Y T Y T Y T Y Y K Y Y K K Y Y K K Y K Y Y Y Y K Y L Y Y Y Y T K K Y Y K K Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y R Y Y Y Y Y Y Y Y K Y Y Y K K M > * * G &X=X=X",
+"u u u } H J K K K Y E Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y R W Y Y Y Y Y Y Y Y T Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K Y Y Y Y Y Y Y K Y Y Y Y K Y Y Y Y Y Y Y Y R Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y L C c ; 6   S.=X=X=X",
+"u u 9 9 W C C H K Y T Y Y Y Y Y Y R Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K W Y Y Y Y R Y T R Y R Y Y T Y Y Y T Y R Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y K K Y Y Y Y Y Y Y K W Y Y Y Y Y R Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y K Z M -   . #.rX&X=X=X",
+"9 8 9 g 5 K B C H K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y E Y Y Y Y R T Y Y R T Y Y Y Y Y Y Y Y T Y E Y Y Y Y Y Y Y Y Y Y K Y Y Y Y Y Y Y Y Y Y T R Y Y Y Y Y Y Y Y Y Y K Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K H A # @   F 6X%X3X=X=X",
+"9 g s w h { C C S H Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y E Y Y R Y Y T Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y R Y Y Y Y Y Y R Y Y Y Y H Z = # 2 + B.<X=X3X=X=X",
+"9 9 9 r u u ) C U D S T Y T Y R Y Y W R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y W Y Y Y Y Y R Y W Y Y Y Y T E L R K K J Z N , O < t.2X,X=X=X=X3X",
+"s 9 9 s 9 8 8 Y n C C K K Y Y K Y R Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y Y Y Y W R Y Y Y Y Y Y Y Y Y Y Y Y Y W R Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y R Y Y Y W Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y T Y Y K K L n c % * + ) wX3X=X=X=X=X=X",
+"u 9 s s s s s t P c B C C K Y Y Y T T Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y R Y Y W Y Y Y Y Y R Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y R Y Y Y Y Y W Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y I W Y J B c # % + ) 4X=X&X6X3X=X=X=X",
+"u u s u 9 s 9 9 4 P n B C C K Y Y L T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y W Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y E Y Y Y Y Y Y K Y Z C : o + 2 F pX%X=X7X3X-X=X=X=X",
+"u s 9 u r 9 w i u 5 C m m B C H K Y Y Y I Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R W Y Y R Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y L Z B -   . + A pX=XrX*X&X-X,X3X=X=X",
+"9 u 9 u 9 r w i u u 4 S m m C B J K Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y L H J n =   3 > ) 1X,X=X=X2X2X3X-X#X=X=X",
+"u u u u 9 u 9 9 u 7 h 5 P c c b B H K H K W K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y W Y Y K Y K C V - # +     ( 5X=X,X=X*X=X=X=X=X=X%X=X",
+"9 9 u 9 9 9 9 9 9 u 7 w e I - c n B C P K Y K Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y R W Y Y Y Y Y Y R W Y Y Y Y Y Y Y Y Y Y R W Y Y Y Y Y Y Y R Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y L J V c . $ 2 . N.7X=X=XeX6X=X%X,X=X&X*X%X=X",
+"9 u 9 9 9 9 9 9 9 9 9 q 9 9 Q b - v n B Z L T Y K I Y E E E R Y T Y Y Y Y Y Y Y R Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y R R E Y Y Y Y Y R Y Y R Y Y Y Y I Y U U D c & o 3 + F B.2X=X=X7X7X=X=X%X%X%X=X=X=X$X",
+"s u 9 w 9 9 9 9 w 9 9 s 0 9 h { B - - c M A C L T E Y Y Y T E Y R Y T Y R R Y R Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y T Y T Y Y Y Y T R K R R Y Y Y I H J B = # X $ $ ) D.7X7XtX3X3X3X=X=X=X=X=X=X-X=X%X",
+"u u u 9 9 9 9 9 9 9 9 9 8 9 u 9 5 I c ; = m A C U K K Y K Y Y Y Y Y Y Y Y T Y Y Y R T Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y R Y E Y Y T R Y Y R W K H J B 1 < $ + # # 2.qX2X7X7X3X3X7X=X3X*X=X=X=X=X%X=X=X",
+"u u 9 9 9 9 9 9 9 9 8 9 u u 7 i s 8 { c v , v m M A H K K Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y R Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y R Y Y E E Y R W K K H C B n - < o @ @ / A.tX3X3XyX=XrX7X6X=X=X=X=X=X=X-X-X*X#X",
+"w 9 9 9 9 w 9 9 9 9 9 9 8 9 u 9 7 u p s Y - = - : M B C H K K K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y W Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y K K C B n = & X 2 @ F p.8X5X7X=XtX2X7X3X7X7X7X3X3X=X=X=X=X=X#X%X",
+"w 9 9 9 9 9 9 9 9 9 9 q u 8 8 9 9 a k a p @.S = , , v n B B H K K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y H H B c - # @ o @ * #.^.8X=XrX3X7X:X7X3XtX3X;X=XeX=X3X=X=X=X=X=X-X",
+"9 9 9 9 9 9 9 9 9 9 9 w 7 9 9 8 7 7 p 9 7 i u { B - = - c b b B C H K K K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y K K J C b c = #     # % @.S.8X7XtX7X7X5X8X:X7X7X5XeX7X3X3X;X3X=X=X*X=X=X=X",
+"9 9 9 9 w 9 9 9 9 9 9 9 9 w 9 w 9 9 8 5 9 9 7 i u W b # # - c n V B C K K K K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y Y Y K K H C B - - # @ @   # C B.qX4X7XrX7XtX3X7X3X5X3X3X3X3X5X3X7X=X7X=X=X*X&X=X=X",
+"9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 q 9 9 9 ( M # # ; ; c b b C J H H K Y Y Y Y R R T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W Y Y R Y R Y Y T Y Y Q W Y Y Y Y R Y Y Y T R R E E T ~ E T K H K H B M - < * $ + . . / N.7X5XtXtXtX7X7X5X5X3X2X7X3X3X3X5X3X3X=X7X=X7X3X=X=X=X=X",
+"7 7 9 9 9 7 9 7 9 9 9 9 7 9 9 9 9 9 9 9 9 9 w 9 9 9 9 0 9 { M & # = = c c b B C C H L Y K Y T T R Y Y Y Y K Y Y Y Y Y Y Y Y Y Y Y Y Y R Y Y T Y Y R Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y E Y T Y Y Y Y Y Y Y Y Y Y K Y Y Y Y Y I K I W I P P J B b c > * $ $ <   @ @.A.7X7X5X7X7X8X8X7X7X7X7X7X7X7X3X7X5X3X3X3X7X3X3X3X=X3X=X=X=X",
+"9 9 9 9 9 9 9 9 9 9 w i w 9 9 7 7 9 i q 9 9 7 9 9 7 9 a 7 7 9 { C # # # = = - v B B B C H K Y K K Y R Y Y Y Y Y Y Y Y Y Y Y Y T Y Y T Y E Y E Y T R T Y Y Y Y Y T Y Y Y T Y Y T Y E E Y T Y Y R Y T Y Y Y R Y Y Y W K L T K K H C b b v - # @ # @ * 3 & r.S.3XtX3X7XyX7X7X8X8X7X7X5X5X7X7X7X5X7X7X3XtX7X3X7X3X=X3X=X3X3X=X",
+"9 w 7 9 9 9 u 9 7 9 7 9 7 9 9 9 w 9 9 9 7 9 7 9 9 7 7 8 7 9 a w 9 @.W = # # # = = - c M b B C H H K K K K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y T R Y Y Y T Y Y Y Y E T Y Y Y K K K K C V n n v ; # +     @ @ # / y._.3X=X3XeX7X9X4X8XtX8X7XtX8XrX8X7X8X8X7X7X7X7X7X7X5X7X3X3X3X=X=X=X=X",
+"9 7 9 9 q u 7 7 u w 9 9 u w i 9 w i 9 9 9 9 9 9 9 9 9 9 7 9 9 8 9 9 9 u { P & @   = # - = - c v n B C H J H K K K K Y K Y Y Y R Y Y Y R Y Y R Y Y R Y Y Y R Y Y Y Y R Y Y Y Y Y Y Y Y R Y Y Y Y Y Y K Y L K H H B A B m : : - # @ @ @ % < + M r.A.7X=X%X=X3X6X3X7X7XrX7X8X7X8X7X7X8X8X8X5X9X7X8X5X7X7X7X7X3X7X3X7X2X7X=X7X",
+"7 9 9 7 9 9 9 9 u 7 7 9 w 7 9 9 9 9 9 7 9 w u w 9 7 7 q w 9 7 9 9 8 u p q q 9 { S #   X # # # ; = ; v n b B B B Z C H H K H K K K K Y K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K Y Y K K K K K K J H C B B B b c c = # = # X   X + # + M @.N.=X7X=X*X=X3X3X=X5X7X7X7XyX5X8X8X8X8X5X8X8X8X8X8X8X8X7X5X7X7X7X7X7X3X7X3X3X7X=X",
+"7 9 9 9 7 9 9 9 w 9 u 9 9 9 7 9 w 7 9 9 w u w 9 9 9 8 q w 7 9 9 7 7 9 9 9 9 7 7 i 0 @.P b + . + # $ * = # = - - c c b b b B B B B C C H J H J H J K K K H H K H K H K H H H H J C C C C Z B b b b c c - - = # # + # @ # $ @ X & G 4.Z.=X3X2X=X=X=X=X4X=X3X2X7X3X5X8X2X5X8X8X8XtX8X8XtX8X8X0XtX8X8X7X5X7X7X7X3X7X=X7X7X=X;X",
+"9 9 9 7 u w 9 7 9 7 7 9 7 9 u 9 9 9 9 w 9 9 u w 9 9 9 9 7 9 7 q 9 u 7 8 9 9 9 9 9 7 7 9 7 4 ) A = % + @ # # # # # # = - - - c - b c b n b n b B b B B B B V B V b V V B V b b c c c c c - ; - - # > # + +   + +     @ @ C @.a.#X=X$X*X:X*X=XeX,XeX=X=X;X=X3X3X7X7X9X5X8X8XtX8X8XtXyX8X8X8X0X8X8X8X7X7X7X4X5X7X3X3X7X7X7X2X",
+"9 9 9 9 9 9 9 9 9 9 9 9 9 w u 7 9 9 9 9 u u 9 9 9 w 9 9 9 9 9 9 9 i 9 9 9 9 9 8 7 8 7 9 7 9 9 8 9 0 ( S m = #     # @ + @ + # # # & # = = = = = > - > = = = = - = = = - = - = # # # $ # + $ 2 2   + @ . @ @ > b Q t.p.$X#X$X$X%X=X=X$X=X%X=X=X=X=X7X3X3X3X5X7X3X5X5X8X5X8X8X8X8X8X8X0X0X8X8X8X8X8X8X9X8X7X7X7X7X7X5X3X7X7X",
+"9 9 9 9 9 9 9 9 9 9 9 9 9 w 9 7 9 9 9 w 9 9 9 u 9 9 9 9 9 9 9 9 7 9 7 9 9 9 9 7 7 7 9 7 7 7 7 7 9 8 0 9 7 8 0 ( I S m = # + #     + @ +   + + % . %   # + @ # +   @ + $ @ @ + @   + @ O < +     < F K } t.p.oX@X@X@X#X#X$X#X#X=X%X%X=X=X=X=X=X=X=X7X=X7X7X7X7X7X8X8X8X9X5X8X8X0X8X8X8X8X8X8X8X8X8X9X9X7X5X8X7X7X7X7X5X5X7X",
+"9 9 9 9 9 9 9 9 9 9 9 9 7 u 9 9 9 9 9 9 9 9 9 u w 9 9 9 9 9 9 9 9 9 9 9 9 9 9 7 9 7 7 7 7 7 7 0 7 9 7 q k q 7 7 7 7 8 7 0 4 ( W P P G c v v = $ @ @ @ @ + +   + + +   @ + # = - m M A ) r.t.p.+X+X@XOXOXOXOX@X#X@X@X@X#X#X#X#X*X*X=X%X%X=X=X7X=X7X=X7X=X=X7X7X5X8X8X8X7X8X8X8X8X8X0X8X8X0X8XtX8X8X8X8X8X8X7X8X8X7X7X7X8X8X"
+};
diff --git a/images/checkbox1checked.xpm b/images/checkbox1checked.xpm
new file mode 100644 (file)
index 0000000..c5f8d34
--- /dev/null
@@ -0,0 +1,332 @@
+/* XPM */
+static char *checkbox_checked[] = {
+/* columns rows colors chars-per-pixel */
+"190 70 256 2",
+"   c #0B111B",
+".  c #10131A",
+"X  c #0D1522",
+"o  c #0C1B2C",
+"O  c #0D1826",
+"+  c #0F1C33",
+"@  c #131924",
+"#  c #121B2B",
+"$  c #161B29",
+"%  c #101D34",
+"&  c #16212B",
+"*  c #142236",
+"=  c #18273A",
+"-  c #0C2436",
+";  c #222C3A",
+":  c #24323C",
+">  c #152A43",
+",  c #142A49",
+"<  c #182B43",
+"1  c #192E4D",
+"2  c #142541",
+"3  c #1A2E52",
+"4  c #172F51",
+"5  c #1C314C",
+"6  c #17304F",
+"7  c #1A3253",
+"8  c #1C355B",
+"9  c #1B3A5C",
+"0  c #163255",
+"q  c #0F2A45",
+"w  c #1D3C63",
+"e  c #1D3E6A",
+"r  c #1D3C72",
+"t  c #223546",
+"y  c #203456",
+"u  c #213A5D",
+"i  c #233A57",
+"p  c #313E50",
+"a  c #223C64",
+"s  c #233D6B",
+"d  c #2A3B65",
+"f  c #2A3C6B",
+"g  c #233E72",
+"h  c #293E72",
+"j  c #1D4265",
+"k  c #1C426B",
+"l  c #1B4768",
+"z  c #1B4372",
+"x  c #174977",
+"c  c #274359",
+"v  c #3B464D",
+"b  c #3C4952",
+"n  c #364758",
+"m  c #3F5057",
+"M  c #224164",
+"N  c #23416A",
+"B  c #254B6D",
+"V  c #2A4464",
+"C  c #2A426B",
+"Z  c #2D4B6D",
+"A  c #274865",
+"S  c #234371",
+"D  c #234C7B",
+"F  c #2C4A71",
+"G  c #254776",
+"H  c #24517B",
+"J  c #2E5575",
+"K  c #324C69",
+"L  c #334C74",
+"P  c #39557B",
+"I  c #3D597C",
+"U  c #355378",
+"Y  c #385160",
+"T  c #414952",
+"R  c #45525C",
+"E  c #425A7C",
+"W  c #505966",
+"Q  c #4D616C",
+"!  c #4F6067",
+"~  c #4F6270",
+"^  c #49657A",
+"/  c #50626E",
+"(  c #566875",
+")  c #5A6A7A",
+"_  c #546674",
+"`  c #1C5985",
+"'  c #244E80",
+"]  c #225381",
+"[  c #295B8A",
+"{  c #275887",
+"}  c #2A5E92",
+"|  c #3E5B82",
+" . c #325B8D",
+".. c #345D95",
+"X. c #2B6595",
+"o. c #2D729E",
+"O. c #346489",
+"+. c #326593",
+"@. c #336A98",
+"#. c #38749C",
+"$. c #2A6188",
+"%. c #356CA1",
+"&. c #3573A2",
+"*. c #3C73A4",
+"=. c #3B7BAA",
+"-. c #3676A7",
+";. c #2D74A0",
+":. c #435D83",
+">. c #4A6485",
+",. c #4C6A8B",
+"<. c #486686",
+"1. c #467390",
+"2. c #526A8B",
+"3. c #526D91",
+"4. c #597583",
+"5. c #5A7594",
+"6. c #4177A6",
+"7. c #647586",
+"8. c #63788B",
+"9. c #627B9B",
+"0. c #657A94",
+"q. c #727F9F",
+"w. c #3881AF",
+"e. c #3D84B3",
+"r. c #3A8AB9",
+"t. c #3B96CE",
+"y. c #3D9ACE",
+"u. c #389AC8",
+"i. c #3A97D0",
+"p. c #3D9AD0",
+"a. c #3A9BD6",
+"s. c #3DA1CD",
+"d. c #3BA0D6",
+"f. c #4383B2",
+"g. c #428CBC",
+"h. c #4A8AB3",
+"j. c #4688B5",
+"k. c #4E8BB3",
+"l. c #668496",
+"z. c #71849A",
+"x. c #77919F",
+"c. c #6A85A3",
+"v. c #6E90AA",
+"b. c #7285A2",
+"n. c #768CA8",
+"m. c #7592A2",
+"M. c #7993A5",
+"N. c #7C93AA",
+"B. c #7494AB",
+"V. c #7797B3",
+"C. c #6095B7",
+"Z. c #7EA2BA",
+"A. c #488EC0",
+"S. c #429BCD",
+"D. c #4A9BC5",
+"F. c #4A9CCC",
+"G. c #4694C7",
+"H. c #4396D2",
+"J. c #439CD2",
+"K. c #459DD8",
+"L. c #489ED3",
+"P. c #4A9ED8",
+"I. c #4897D2",
+"U. c #519CCB",
+"Y. c #5599C6",
+"T. c #519DD3",
+"R. c #559ED5",
+"E. c #44A1CD",
+"W. c #4BA1CD",
+"Q. c #4AA1C5",
+"!. c #45A1D3",
+"~. c #44A2D8",
+"^. c #4BA1D4",
+"/. c #4CA3D9",
+"(. c #4CA9D4",
+"). c #4BA9D9",
+"_. c #47A8DB",
+"`. c #52A2CD",
+"'. c #5FA4CF",
+"]. c #52A4D5",
+"[. c #54A5D8",
+"{. c #55A8D6",
+"}. c #55A8D8",
+"|. c #59A4D3",
+" X c #59A4DA",
+".X c #5AA9D6",
+"XX c #5CAAD9",
+"oX c #41A0E0",
+"OX c #66A1CB",
+"+X c #62ADDB",
+"@X c #6AA8D2",
+"#X c #66B0DC",
+"$X c #6AB2DD",
+"%X c #7AACD2",
+"&X c #77AED3",
+"*X c #82949E",
+"=X c #8393AB",
+"-X c #8B99AC",
+";X c #839AB3",
+":X c #8A99B2",
+">X c #919DB3",
+",X c #949CAE",
+"<X c #89A3B8",
+"1X c #92A1B4",
+"2X c #93A5BB",
+"3X c #99A9BA",
+"4X c #92B0BE",
+"5X c #A1B0BE",
+"6X c #8DADC1",
+"7X c #88ABC8",
+"8X c #81ADD1",
+"9X c #8CB1C7",
+"0X c #91ADC1",
+"qX c #99ADC3",
+"wX c #9AB3CA",
+"eX c #97B4C5",
+"rX c #98BBD5",
+"tX c #A2AEC4",
+"yX c #A9B6C8",
+"uX c #A5BDD3",
+"iX c #9CC1D5",
+"pX c #9EC2D9",
+"aX c #9DCCDC",
+"sX c #A2C2D9",
+"dX c #A3C9DE",
+"fX c #A9C5DB",
+"gX c #B3C6D7",
+"hX c #A5CAE5",
+"jX c #ABCCE4",
+"kX c #A3C7E2",
+"lX c #ADD3EC",
+"zX c #ACD8ED",
+"xX c #ABD0E4",
+"cX c #AED6F0",
+"vX c #AED8F1",
+"bX c #B0D5EC",
+"nX c #B1D8EE",
+"mX c #B6D1E5",
+"MX c #B0D6F0",
+"NX c #B0D8F1",
+"BX c #B9DDF3",
+"VX c #BBDFF9",
+"CX c #B1CDE5",
+"ZX c #BDE1F5",
+"AX c #BDE2FA",
+"SX c #C7DDEE",
+"DX c #C4DEF1",
+"FX c #C3E2F4",
+"GX c #CBE6F8",
+"HX c #D2E9F6",
+"JX c #DAEDF6",
+"KX c #DAEDF9",
+"LX c #D1E8F7",
+"PX c #D9F1FB",
+"IX c #C1E1EE",
+"UX c #E0F1FA",
+/* pixels */
+"p.y.a.p.y.y.y.a.p.p.y.S.p.S.p.S.p.p.J.p.p.J.J.J.J.J.!.J.J.J.p.J.J.J.L.!.J.L.!.^.L.!.^.^.^.^.^.^.^.^.^.^.^././././.].Y.A./.].^.].].^.^.^.^.^.^.^.^.].].^.].].^.].`.^.].].L.].].`.L.T.].].].].^.`.^.^.^.].^.^.^./.^.^.^.].^.].].L.].].^.`.].`.^.].].].]./.].].}..X{.{.].}.}.}.}.XX}..X[..X}.}.XX.X XXXXXXX+X+X+X+X+X#X#X#X#X#X#X$X$X$X$X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X",
+"y.y.p.p.y.y.y.y.p.p.p.p.p.p.J.p.p.H.S.p.S.p.S.J.K.J.J.J.J.J.J.J.J.J.J.L.!.L.!.!.^.L.!.^.^.^.^.^.^.L.^.!.^.^.^.P.^.OXl.=.].[.{.].^.^.^.^.^.^.^.^.^.^.^./.^.^.^.^.^.^.].^.].L.L.]./.].].^.].^.].^.L.].^.^.^.].].^.^.^.`.^.L.].].].T.^.^.].^.].].].].^.].].[.].].].].].{.{..X}. X}.XX.XXX XXX}.XXXXXXXXXX+XXX+X+X+X+X#X#X#X#X#X$X$X#X$X#X$X$X$X$X$X$X$X$X$X$X8X$X$X$X$X$XaX$X$X$X$X$X$X$X$X$X$X",
+"a.y.p.p.y.a.i.y.p.p.p.p.H.p.p.p.p.p.p.J.p.S.S.J.J.J.J.J.J.J.J.J.J.!.J.L.L.!.!.!.L.L.^.^.^.^.^.^.L.^.^.^.^.^.^.^.%XB.,.&.].].^.].^.^.^.^.^.L.^.^.(./.^.].^.^.^.^.^.L.^.^.L.].^.^.^.].^.^.^.].].^.^.^.^.^./.^./.^.]./.`.^.].].`.L.T.].].].].].].].^.^.].].].].].].]..X[.{.[.}. X}.XXXX}.XXXXXXXXXXXXXXXXXXXX+X+X+X+X#X#X+X#X#X$X#X$X$X$X#X$X$X$X$X$X$X$X$X$XkX$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X",
+"p.S.p.p.y.y.y.a.p.p.p.p.p.y.p.p.p.p.H.p.H.p.p.J.J.J.J.!.J.J.J.!.J.L.!.!.L.L.!.^.^.`.^.L.^.^.^.W.^.^.^.^.^.^.].%X2Xl.B =.^.].].^.^.^./.L.L.^.L.^.^.^.^.^.].!.^.^.^.^.^.^.^.L.^.^.^.^.^.^.^.^.^.(.^.^.^.^.^.].^.^.^.^.^.`.].L.].].^.L.].^.].^.].^.].`.^.].].].].].].].{.[.].}.XX.X}.XX}.XXXXXXXXXXXX+XXXXXXX+X+XXX+X#X+X+X#X#X#X$X#X#X#X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X",
+"p.p.p.p.a.p.p.p.p.p.p.p.y.y.p.p.p.p.J.p.p.p.S.J.J.S.!.J.J.J.K.!.J.L.L.!.!.!.^.^.^./.^.^.^.].^.^.^.^.^.^.^.^.%XtX=XI M e.L.].].^.^.^.^.L.L.L.^.L.^.^.!.^.!.^.W.!.!.^.^.^.^.^.L./.^.].^.^.^.(.^.^.^.^.L.^.^.^.^.{.^.^.].^.].^.].^.].`.^.^.^.].{.^.^.^.]./.].].].].[.].].{.{.{.{. XXXXXXXXXXXXXXXXX+XXXXX+X+XXXXX+X+X#X#X#X#X#X#X#X#X#X#X$X#X$X$X$X$X$X$X$X$X$X$X$X$X$XaX$X$X$X$X$X$X$X$XkX$X$X",
+"J.!.p.p.p.p.p.p.p.p.p.a.y.p.p.p.p.J.p.S.p.S.p.p.J.J.p.J.J.J.J.!.L.^.^.!.L.^.^.^.^.^.^.^.].^.^.].^.^.^.L.^.%XwX1X9.s u g.^.]././.^.^.^./.^.L.^.L.F.^.^.^.!.L.F.L.^.!.W.L.!.!.^.^.^.^.].^.^.].].^.^.L./.^.^.^.^.^.].^.^.].].`.^.].^.].].^.^.^.^.^.^.].L.T.^.].].^.].].].{.{.{. X.X).XXXXXXXX}.+XXXXXXX+XXX+X+X+X$X+X#X#X#X#X#X#X#X#X#X#X#X$X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X",
+"p.J.p.J.p.J.p.p.p.p.p.S.p.p.p.S.p.J.p.p.S.S.p.J.p.J.J.J.J.J.L.!.!.!.!.^.^.^.^.^.].^.^.^.].^.^.^.^.{.^.L.@X5X3Xn.U 9 Z D.].^.^.L.^.L.^.L.L.L.^.L.L.L.L.L.!.J.L.L.J.J.L.L.^.L.L.^.^.^.^.^.^.^.^.^.^.!.^.^.^.^.^.^.^.^.^.^.L.^./.^././.].^.^.^.^.^.^.^.]./.].L.].]./.[.].{.{.}.[..XXXXXXXXXXXXXXXXX+XXXXX+X+X+XXX#X#X#X#X#X#X#X#X#X#X#X#X#X#X$X#X$XkX$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X",
+"p.S.J.S.J.p.p.!.J.S.y.t.p.p.p.S.J.p.J.S.H.p.S.S.S.J.J.J.J.J.J.L.!.!.^.^.^.^.^.(.^.].].^.^.].].^.^./.L.@X9X5X-X5.l 0 J L.^././.^./.L./.L.L.^.^.!.L.L.!.!.J.J.!.L.L.J.L.!.L.L.L.K.^.^.^.^.^.^.^.^.^.L.L.^.L.^.^.^.^.^./.].^.^.^.].^.^.^.^.^.^.^.^.^.^.^.^.].].].^.].].{.[.[.{.[..X}.XXXXXXXXXXXXXXXX+X+X+X+X+X+X+X#X#X#X#X#X#X#X#X#X$X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X",
+"!.J.J.y.J.p.S.p.p.J.p.S.p.H.y.p.H.p.J.p.J.S.S.p.J.p.J.J.J.J.J.!.L.^.^.^.^.{.^.^.].^.{./.].].].].^.^.|.6XqX1Xb.P 0 7 J W.^.^./.^./.^./.^.^.L.^.L.L.L.L.L.S.S.J.J.J.J.J.J.L.!.!.^.!.^.^.^.^.^.L.L.!.!.L.L.L.^.^.^.^.^.^.^.^.^./.^.^.^.^.^.^.^.W.^.^.^.^.^.`.].^.].^.].].].{.].{.[.{.XXXXXXXXXX.XXX+X+X+X+XXX+X+X+X+X#X#X#X#X#X#X#X#X#X#X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X$X",
+"J.J.J.J.p.J.p.S.J.p.J.p.p.S.S.p.p.p.J.J.J.p.J.J.J.J.J.J.!.J.L.!.^.^.^.^.]./.].).].{.^.].].^.]./.].].%X5X>XN.3.C 4 5 J !.^.L.^.L.L.^.^.^.L.L.^.^.L.!.J.J.!.J.J.J.J.!.J.!.J.L.J.L.^.L.^.^.L.L.^.!.L.L.L.L.L.L.^.^.^./.^././.].^.^.^.^.^.^.^.^.^.^.^.^.^.^.^./.L.].]./.].].].{.[.[. X X XXX XXXXX+XXX+X+XXX+X+X+X+X#X+X#X#X#X#X#X#X$X#X#X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$XaX$X$X$X$X$X$X$X",
+"J.J.J.J.J.S.p.p.p.S.p.S.p.p.p.S.S.p.J.S.p.S.S.p.J.J.S.J.J.J.J.!.^.^.^./.].[.{.{.[.[.}.).{.].].].^.@XwX2XN.9.:.9 5 > A F.^.^.L.^.P.^./././.L.^.L.L.L.J.!.J.J.p.J.J.p.J.J.J.J.L.L.L.L.^.^.^.^.L./.!.L.!.L.L.L.^.L.^.^.(./.^.^.^.].^.^.^.^.^.^.!.^.L.^.^.^.^.^.].T.].].]./.].].{.{. X}.XXXX+XXXXXXXXXXXXXXX+XXX+X+X+X+X#X#X#X#X$X+X#X#X#X$X$X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X$X$X+X$X",
+"J.J.!.S.J.J.J.J.S.p.J.p.J.p.S.p.S.S.J.p.J.J.S.J.y.J.p.J.J.S.L.!.^.^.].].[.[.[.[.[.{.[.[.[.[.].`.OXqX3X;Xq.,.Z 8 5 > A S.^.^.^.^.^.^.^.^.^.^.^.L.!.E.J.J.J.p.J.p.p.J.J.J.J.!.J.L.L.L.^.!.!.!.^.!.L.L.L.!.!.!.^.^.^.^.].^./.^.^.^.^.^.!.^.^.!.^.^.^.!.L.^.^.^./.^.].R.].].{.[.]..X{.XX.XXX XXXXXXX+X+XXX+XXX+X+X+X#X#X#X$X#X$X+X$X#X#X#X$X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X#X$X#X#X$X",
+"!.!.!.J.J.J.J.p.p.J.J.S.p.S.S.J.J.J.J.J.J.S.J.J.J.J.p.J.J.J.L.!.^.].].{.{.XX{.[.{.}.XX}.[.[.].].7X4X:Xb.3.P a 8 6 > 9 r.(.^.^.^.^.^.^.^.^.^.L.^.!.J.J.J.p.p.J.p.J.p.!.J.J.J.J.J.L.L.^.^.L.^.K.L.J.J.!.J.J.!.L./.^.^./.^.^.^.^.^.^.^.L.L.!.^.^.^.^.L.L.^.^.^.^.].]./.].].[.].[.{.{. X}. XXXXX X XXXXXXXXXXX+X+X+XXX#X#X#X$X$X$X$X#X$X#X#X$X$X$X$X$X$X$X$X$X$X$XrX$X$X$X$X$X$X#X$X$X#X$X$X$X$X",
+"J.!.L.J.J.J.J.J.J.J.p.J.p.J.S.S.p.J.p.J.J.J.S.p.p.S.J.S.J.J.L.L.^.].].{.{.}.{.XX}.}.}.}.[.[.].@X4X>Xn.0.E L e w 0 > 5 r.L.(.^.L.^.^.^.]./.^.].L.L.J.J.J.J.y.y.p.p.p.J.J.J.!.J.!.L.L.!.^.L.K.L.L.!.J.J.L.J.L.L.^././.^.^.^.^.^.^.`.^.^.^.^.^.!.^.!.L.L.L./.^.^.^.^./.^.]./.[.].].{.}.}.XXXX X+XXXXXXXXX XXXXX+X+X#X+X#X#X$X$X#X$X$X$X#X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X+X$X$X",
+"L.L.!.!.!.J.J.J.J.S.H.a.y.S.S.J.H.D.J.J.J.J.J.H.p.S.S.S.S.F.F.!.].].]..X{..X}.XXXXXX}.}..X[.'.7X2X-X0.>.U M s w 7 < > &.!.^.^.^.^.L.^.].].^.L.L.L.J.p.J.p.J.p.y.p.J.p.J.J.J.!.J.!.L.L./.L.!.L.!.L.J.J.J.J.L.L.L.^.!././.].^./.L.L.].^.^.L.^.L.^.^.!.L.L.^.L.^.^.^.].].].].].].[.[.{.}.}. X}.}.XXXXXXXXXXXX+X+X+X#X#X#X#X$X$X#X#X$X$X$X$X$X$X$X$XaX$X$X$X$X$X$X$X$X$X$X#X#X$X$X$X$X+X$X$X#X#X",
+"L.L.!.!.!.J.J.J.J.p.S.S.I.K.d.u.&XPXJXUXJXJXJXJXJXJXUXJXJXJXJXJXJXJXKXKXPXPXKXJXJXKXPXPXPXJXgXyX,Xq.3.I C B w u 1 = = $.L.^.(.^.^.].].^.^./.^.!.J.J.J.S.p.S.p.S.p.J.J.p.J.J.J.J.J.!.L.!.L.L.L.L.L.J.J.J.J.!.L.L.^.^.^.^././.P././.^.!.^.W.^.^.^.^.^.^.^.^.^.^.^.`.^.^.]./.].].].{.].{.{.}.}.}.}.}.}.XXXX+X+X+X+X+X#X#X#X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X#X$X#X$X$X+X$X@X",
+"!.L.!.J.J.!.J.J.J.J.S.!.t.oXa.rXKXUXUXPXJXJXKXKXKXKXJXJXHXJXJXJXKXKXKXJXKXHXJXHXJXJXKXHXJXSXyX2XN.5.:.L j w w 7 < o o 9 W.^.^.^.].]./.].L.L.!.L.J.J.J.J.p.p.S.p.S.p.J.J.J.J.K.J.J.J.L.L.L.!.J.L.J.J.J.J.J.J.J.L.^.^.P.^.P./.P./.L./.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.].].].^.].{.].].].{..X[.}.}.}.XXXXXX+X+X+X+X+X+X$X#X#X$X$X$X$X#X$X$X$X$X$X$X$X$X$XkX$X$X$X$X$X$X#X$X#X#X$X#X#X+X#X#X#X",
+"L.L.L.L.L.L.L.J.L.!.K.p.L.y.S.GXUXPXPXJXHXHXLXLXLXLXLXLXHXHXLXLXLXLXGXHXHXHXHXHXHXHXHXHXHXgXtX>X9.3.L C w w 5 < # X O > g.^.[.].].^.^.`.].L.L.L.J.J.y.p.p.J.p.S.p.J.p.J.J.J.J.J.J.L.L.L.J.L.L.L.L.J.!.!.L.L.L.L.!.L.L.^.L.^.P.^./.R.^.^.^.^./.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.].].].].].].].].]..X}.}.XXXXXXXX+X+X#X+X+X+X#X$X#X#X$X$X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X$X#X#X#X#X#X#X+X+X",
+"L.L.L.J.L.J.L.L.L.L.d.!.F.S.L.PXHXHXPXGXFXFXFXFXFXFXFXFXGXFXFXFXFXFXGXGXFXFXFXFXFXFXFXFXmXyX,Xn.3.:.C s 8 0 = @ . O * B r.)./.^.^.].^.^.L.L.J.J.S.p.p.S.p.J.p.y.S.J.J.J.J.J.J.p.S.S.J.L.J.L.L.L.L.S.J.!.L.L.L.L.L.L.L.L.L.L.^.^.^././.^.^.].].^.^.^.^.^.^.^.{.^.^.^.^.^.^.^.^.].^.].].].[.].]..X{.{.}.XXXXXXXX+X#X+X+X+X$X$X#X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X$X#X#X$X#X+X#X+X+X",
+"K.J.L.L.L.!.L.L.L.J.~.S.T.L.!.GXLXGXFXDXBXBXBXBXBXBXBXBXBXBXNXBXBXNXBXNXBXBXBXBXBXBXBXNXrX2X;X9.<.F a 8 7 > X . & q #.D.!.].].].^.^.L.^.L.L.J.S.J.J.p.p.y.p.p.y.p.S.p.J.J.J.J.!.J.S.L.J.L.J.L.J.J.L.J.!.!.L.!.L.E.L.!.L.L.L.P.^./.^.].^.^.^.^.^.^.{.^.].^./.^.^.^.^.^.!.^.^.].^.^.].].].[.{.].].{..XXX}.XXXX+X+X.X#X#X+X#X$X#X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X#X$X$X#X#X+X+X+X",
+"!.!.L.L.L.!.L.!.L.L.L.S.P.S.~.ZXSXIXZXNXnXnXvXNXNXnXcXNXcXcXnXcXvXvXvXvXvXvXNXNXnXnXbXfXqX-Xn.2.L s w 5 2 O @ & 9 h.^.^.(.].].^.^.^.L.L.J.J.p.S.S.p.p.p.p.p.p.S.y.J.J.p.J.J.J.J.J.J.J.L.S.L.!.J.L.L.J.L.!.J.!.L.L.L.L.L.L.L.^.P.L./.].`.^.].`.^.^.].L.].].^.^.^.L.L.^.^.^.^.^.^.^.].^.].].[.[.{.{.{..X XXX+XXXXX#X#X#X.X#X#X#X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X#X$X#X#X$X#X#X#X#X#X+X+X#X",
+"L.L.L.L.L.L.L.L.L.J.!.!.K.^.y.ZXSXZXBXBXcXcXvXvXvXcXcXvXcXcXcXcXcXvXNXcXcXcXcXcXcXcXlXwX1X=X8.:.F a 0 = o X $ : h.^.^.(.[.[.]./.^.L.J.J.J.p.p.p.t.p.p.p.p.S.p.y.p.J.p.!.p.J.J.J.J.H.J.J.J.L.K.L.L.J.J.!.!.L.L.J.E.L.J.E.L.L.^.^.^.P.^.^.].L.^.].].].`.].].^.^.^.L.L.^.^.K.^.^.^.^.^.].].].].{.].[.{.}.XXXXXX+X+X+XXX#X#X#X#X$X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X$X$X$X$X$X#X$X#X#X#X#X+X+XXX",
+"P.L.^.!.L.L.^.L.!.L.W.J.!.L.I.FXIXZXZXnXcXcXvXvXvXvXNXvXNXnXzXlXcXvXvXvXvXvXcXcXcXnXsX4X:Xz.2.L a 8 , @ @ = p _ Y.].{.{.].[.].].^.L.J.S.p.H.p.J.p.p.p.p.y.p.p.p.y.y.p.S.J.J.s.p.S.L.J.J.J.J.!.!.L.S.E.E.L.L.L.S.L.L.E.L.P.L.L.^.`.L.R.P.].^.(.^./.].^.].^.).^.).!.W.^.S.(.!.L.[.`./.(.].].].].].{.{.{.XXXX+X.X#X+X#XXX#X#X#X$X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X#X$X#X+X+X+XXX",
+"L.L.^.L.L.L.L.^.L.L.!.!.!.L.L.VXGXBXBXBXnXnXNXNXvXvXcXvXcXbXrX7XNXvXcXNXcXNXcXNXnXlXwX1XN.0.:.e 8 , * O * n 8._ ].{.{.{.{.].{.^.L.J.H.p.p.p.p.a.p.p.H.p.p.S.H.J.J.K.p.L.J.S.d.~.K.J.p.I.L.P.H.I.L.^.L.J.L.I.L.L.J.E.!.J.K.P.^.L.L./.]./.L.^.]. XR.P.].[.T.|./.L.R./.E.^.L././.J.^.^.^.^.].].].].{.{.{.}..X.X+XXX.XXXXX#X#X#X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X$X#X$X+X#X#X+X+X+X+X",
+"L.P.L.^.!.K.L.L.L.!.^.!.L.L.L.DXDXZXBXnXNXvXvXcXNXnXvXvXCXuX<Xc.kXcXcXNXNXNXNXcXNXsX2X:Xz.,.F 8 , * X = n x.8./ .X[.{.{.[.].].L.L.J.p.p.p.i.i.p.i.i.p.p.p.p.p.J.L.J.p.J.L.L.!.p.y.!.s.~.L.p.K.^.P.J.!.L.~.H.^.L.!.L.J.L./.L.I.[.L././.P.R.].R.].^.{.].^.^.^.)./.P./._.^.L.R.^.^.^.].^.^.L.].].].{.}.[..X XXXXXXX+X+X+X+X+X#X#X#X$X$X$X$X$X#X$X$X$X$X$X$X$X$XkX$X#X$X#X#X#X$X+X+X#X#X+X#X+X+X",
+"L.L.L.!.^.^.L./.L.^.F.!.!.L.L.FXFXZXZXBXBXvXvXcXvXvXvXlXgXwXn.,.V.cXcXNXNXNXNXNXcXqX>X=X9.P s 0 =   & n ;XM.8./ ].[.].[.{.].].^.J.L.p.y.i.i.p.i.u.y.y.p.p.y.a.J.S.S.K.S.H.H.L.J.!.p.S.L.J.y./.S.W.L.F.I.L./.a.J.L.L._.!.E.D.g.r.r.D.^.(.(.^.^.^.(.W.`.].).(./.`.R.|.T.^.]./.L.L.].T.^.^.^.].].].[.}.[..X}.XXXXXXXX+X+X+X+X#X#X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X#X#X#X+X#X#X+X+X+X#XXX",
+"^.L.L.^.!.^.^.^.^.!.J.!.!.L.J.ZXSXFXBXNXnXcXvXcXvXbXCXgXuX>X5.L 1.lXNXNXNXNXNXcXuX7X=Xq.,.C 0 2 o & : N.eXm.7./ ].{.].{.].].^.!.H.p.t.t.i.i.i.i.y.y.d.t.p.p.G.} r k e k S k s N N e !.!.~.!.D.x S N k G +.W.!.!.P.J.U.f.] C N h s N  .k.^.].+.r N N [ ].].R.`.[ N k z @.D.W.^.].L.L.^.^.].^.].].[.{.{.{.XX{.XXXX+XXX+X+X+X#X+X#X#X$X$X$X$X#X$X$X$X$X$X$X$X$X$X$X#X$X#X#X#X+X+X#X+X+X+X+X+X+X",
+"^.P.^.L.^.^.^.!.^.!.!.J.L.L.J.ZXFXZXZXNXnXcXcXcXbXCXgXyX>Xb.E C I rXNXNXNXcXNXcXwX:X=X0.U u < + O = l.jXeXm.7./ [.{.{.].].^.L.!.J.p.y.y.i.i.i.i.i.y.p.p.S.J.G.[ e A M s j S N s V s L.H.L.!.j.l e s V a G D.!.!.R.L.e.x j s k k B s M x D.{.Y.D s f k h.[.[.e.G a M ' k.^.(.(.L.].!.^.^.^.^.]./.].[.{.[.{.{.XXXXXXXXXX+X+X#X#X#X$X$X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X#X#X#X+X+X+X+X#X+X#X",
+"^.L.^.^.^.^.(.!.^.^.W.J.J.L.L.ZXDXZXVXnXNXnXbXjXgXuXtX-Xc.3.G a V c.cXvXMXvXbXkXqX:Xq.<.M 4 * X : ^ lXxX9Xm.4._ [.{.].].].^.!.J.J.p.y.i.i.i.i.i.y.i.y.p.J.u.G.[ k j d s k N S s s N y.!.K.L.@.k s B l k z w.!.^.!.^.] s C k =.6.H e C k %.`.L.e.l f k D U.U.H w k N e.[.).!.].]./.^.^.L.^./.].`.].{.]..X{..X{. XXXXX+X+X+X+X+X#X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X$X#X#X#X#X+X@X#X#XXX#X#X",
+"/.^.^.!.!.^.!.^.^.!.W.!.L.L.J.FXDXVXBXBXMXbXuXwX3X1XM.0.2.U e w d E aXbXMXMXvXuX>Xn.5.U 8 - O $ n pXvXhX4Xm.7./ ].].].^.^.^.J.J.p.t.y.y.i.i.i.y.y.y.y.y.J.a.y. .f d x e.S.S.S.J.J.s.!.L.P.T.] N C ' j f h X.L./.F.(.N C f z D./.g. .U #.=.].[.].+.k f k =.*.k C h ..[./././.R.^.!.!.^.^.^.^.^.].].].].].{.{..XXXXXXX+XXX+X+X#X+X#X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X#X#X#X#X+X#X+X.X#X+XXX",
+"^.!.^.F.!.W.^.^.!.!.!.L.J.L.J.ZXSXBXBXnXpXV.v.b.9.5.,.| F B w u u Z V.NXvXNXjXqX:Xb.>.f > # @ t Z.cXzXhX9Xm.7./ ].^.`.^.!.!.J.J.p.p.y.t.i.y.i.a.a.p.i.y.y.a.p.{ N N z +.#.*.o.o.&.f.~.E.~.j.j N s %.$.C a S D.].^.^.H j f s ' @.-.D.L.].L./.[.^.D.D h j S s c z x R.].].^.].].^.^.^.^.^.^.].]./.].].[.[.}.}.{.XXXXXXXX+X+XXX+X#X#X$X#X$X$X$X$X$X$X8X$X$X$X$X$X$X$X$X$X#X#X#X#X#X#X#X#X#X#X+X",
+"L.^.^.!.^.^.!.!.L.L.L.!.J.!.L.IXDXDXVXBXhXB.>.U C a a s a M s u w F 3.cXNXMXfX2X:X9.L 3 - . = 8.zXcXzXhX4Xm.7./ ].^.^.L.!.L.J.y.p.y.y.y.y.a.y.y.y.y.a.t.y.p.p.{ N N a k e M M k l @.H.!.!.@.S N k g.=.e s S =.L././.#.z f s s S k k [ 6..X^.]./.XX6.r A s C j r j.`.].].^.].^./.^.^.^.^.^.^.].].].].[.{. X}.{.XX XXXXXXX+X+X+X+X#X#X#X$X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X#X#X#X#X+X#X#X#X#X",
+"^.^.L.^.^.!.^.L.L.^.J.J.L.p.J.ZXDXFXVXNXNXMXrX5.Z 8 8 8 u w a M a s E rXNXlXwX>Xb.>.a * O $ Y jXNXNXcXhX0Xm.7.~ L.^.L.!.J.J.J.J.p.p.y.y.a.y.p.p.p.p.p.y.t.J.y.[ N s N S s s s s g -.L.!.J.' N f z E.D.x k j O.^.].^.R.-.z N N s M M M G =.{.].}././.+.M S s s +..X`.].].^.].^./.]./.^.^./.].].].]./.].|.[.}.}. XXXXXXXXXXX+X+X+X+X$X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X$X#X#X#X#X#X#X#X+X#X",
+"^.^.^.^.^.L.K.L.!.!.J.J.J.J.L.FXDXZXVXNXnXNXcXlXl.9 5 5 7 u e e w s | v.cXdX3X:X5.F 0 # O t 6XNXcXNXvXhX0Xm.7.~ L.L.!.!.J.J.p.p.p.p.p.H.p.J.p.p.p.p.p.S.t.p.t.{ N N s +.&.;.;.*.%.r.L.!.g.S e C F &.&.D N s G D.].]./.^.].=.+.D G f s a z `.].R.[.].Y.l N s l Y.(.].].].].].].].^.].].].^.`.].].].[.]..X}.}.{.XXXXXXXXXXXX+X+X+X+X+X#X#X#X$X$X$X$X$X$X$X$X$X$X$X$X#X$X$X#X$X#X#X#X#X#X#X#X#X",
+"L.L.L.L.L.L.L.L.L.L.J.J.J.J.J.ZXDXFXVXnXNXMXNXcXnX5.t > y 8 w w w F P 5.pX6X=Xq.>.9 2 . : 8.NXvXNXNXvXhX6Xm.7.~ J.!.!.J.J.J.J.p.H.y.p.p.S.p.J.p.J.p.p.p.p.p.y.[ N N e e.L.p.J.L.L.L./.L.@.s j M C k S j f N s =.^.G.h.=.&.g.R.}.f.D j f z g.(.{.].].{.s s s s .X!.].].].]./.].R./.]./.].].].].].]..X].}..X[.XX.XXXXXXXXXXX+X+X+X#X+X+X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X$X$X#X#X#X$X#X#X",
+"^.L.^.^.L.!.L.!.L.L.J.J.L.J.J.FXSXZXBXBXnXNXnXnXnXnX5.i , 1 8 a s G :.,.v.z.q.:.M > + & n jXvXNXNXNXvXhX0Xm.7.~ J.J.L.L.J.J.S.p.p.S.p.S.p.J.p.p.p.p.p.J.t.K.y.[ N N z e.H.P.P.J.W.E.!.^.H s l M N s s j f N e { F.e.j C s } ^.(.'.{ k f G g.(.}.{.].].N N s k ].).].^.].^.].]./././.].].].].].].].]..X].[.[..X.XXX XXX XXX+XXX+X+X#X+X$X+X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X$X#X$X#X#X#X",
+"L.^.L.L.L.J.J.L.J.L.J.J.J.J.J.FXDXAXVXNXnXNXvXvXNXnXnXv.A 5 y 7 w C P :.2.3.>.Z 3 % @ t 6XcXcXvXNXNXvXhX0Xm.7.~ J.L.L.J.J.!.J.J.J.S.J.J.J.p.J.J.H.S.p.S.y.J.p.[ s N d F S s S e s k r.g.N N k l [ } [ [ F s k S Y.D.k s f C @.h.1.z k s ' .X[.{.XX].[.j k M k `.].^.].].].].].].]./.].].].]..X].].{.{.}..X XXX}.}.XXXXXXXXXXXX+X+X+X#X#X$X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X$X$X$X$X#X$X#X$X",
+"L.L.L.!.!.J.J.!.J.J.!.L.L.p.J.ZXDXZXVXNXnXNXvXvXvXNXcXnXN.K y y 9 M F U E I B 9 , O ; 4.cXcXvXNXNXvXvXhX6Xm.7.Q J.L.J.!.!.J.J.J.J.J.p.J.J.J.J.p.S.p.a.J.p.K.p.[ s N l k N k j A s k e.%.a N N +.L.^.!.|.} M l s 6.^.*.z N M N e S S l S h.].[..X]. X Xk k N N |.R.].].]./.]./.].].^.].].].].].].{.{..X}.}. X}.XXXXXXXXXX+XXX+XXX+X+X#X#X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X$X#X$X#X$X$X",
+"L.L.!.!.J.J.J.J.J.!.J.!.L.L.L.ZXDXFXVXnXnXNXvXvXNXNXNXNXcXv.K y 7 9 a B C s 8 > o + n kXvXNXNXNXNXNXnXhX0Xm.7.Q L.E.!.L.L.L.L.L.L.J.J.J.J.J.J.p.J.S.J.J.J.L.G.} z N s a s M M s l s f.] k s S *.`./.^.`.6.k s l ` Y.R.=.] l l s s N X.A..X].{.[.[.XX|.x G N z Y.]./.].].].]./.].]./.{.].{.{.].].[.{.XX}.}.XXXX}.XXXXXXXXXXXX+X+X+X+X+X#X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X$X#X$X$X$X#X",
+"^.L.!.!.!.L.J.!.J.L.J.J.J.L.J.FXFXZXBXBXnXnXvXvXnXvXcXNXvXcXl.V i a w e s 9 5 o # t N.cXNXNXvXNXvXnXvXhX0Xm.7.Q L.L.L.L.L.!.L.L.L.L.J.J.J.J.J.J.J.J.S.H.!.p.K.S.S.S.!.J.J.J.!.!.L.K.].F.W.`.F.^._.~./.L.(.W.(.^.^.[./.].`.U.h.f.g.Y.|.XX.X].{.{.[. X{.`.'.'.`.}.).].].^.].].].].[.].].{.[.].{.].[.}.}.XX}.}.}.XXXXXXXXXXXXXXXX+X+X+X+X#X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X#X$X$X#X#X#X#X#X#X",
+"!.!.!.!.L.L.J.J.!.J.F.!.L.J.J.ZXDXZXZXNXnXnXvXvXvXvXvXNXNXNXcX5.V 7 u w 8 3 2 # ; ^ lXNXNXNXNXNXvXNXvXhX7XM.7.Q L.!.L.L.!.J.J.L.J.L.J.!.J.J.J.J.J.p.S.S.!.p.J.p./.J.J.L.L.F.J.!.L.L.L././.L././.P.R.[.P././.^./.R.R././.^.].{.(.).}..X{.].{.{..X[.[./.XX].].).!.R. X].].].[.].].[.[.{.].].[.].[.}.}.}. X{.{..X{..X{.XXXXXXXX+XXX+X).+X+X+X#X#X#X#X$X$X#X$X$X$X$X$X$X$X$X#X#X$X#X#X#X$X$X#X$X",
+"L.L.L.L.L.L.L.L.L.!.J.!.!.J.L.FXIXZXBXnXNXnXvXcXvXvXNXNXvXNXcXjX>.u 1 8 7 < # $ n 9XNXNXNXvXNXcXNXvXzXjX6Xm.7.Q !.!.L.L.L.L.L.J.L.L.J.!.!.J.J.!.J.J.!.E.J.P.L.J.I.L.!.!.J.J.L.!.!.!.^.^.^.L.L.^.L.F.!.^.].T./.]./.^.].R.].].].{.[.].(.{..X{.[.[.[.[.}.].[. X[.}.}.`.].].].].].[.[.{.].].{.{.{.[.}.}..X.X.X{.{. X{.XX XXXXXXXXX+X+X#X+XXX+X+X#X+X+X#X#X$X$X$X$X$X$X$X#X$X$X$X#X$X#X$X#X#X#X#X",
+"L.!.L.L.L.L.!.L.L.!.L.J.L.L.L.DXDXZXZXnXNXnXnXcXvXMXvXNXNXNXNXvXsXK i 3 < * # ; 0.bXvXNXNXNXNXNXvXvXzXhX6Xm.7.Q !.^.!.^.L.L.L.L.L.L.J.J.J.!.L.J.!.J.!.L.!.S.L.!.!.!.!.!.J.J.L.L.L.K.(.^.^./.L.!.(.E.].^.^./.^.L.).^.].`.^.{.{.[.{.].).[.].[.].[.[.].(.[. XR. X].(.{.].[.[.[.[.{.[.].].{.[.{.[.[. X}.}.}.[. X{.}.}.}.XXXXXXXXXX+X+XXX+XXX+X+X+X#X#X#X#X$X#X$X#X#X$X$X#X#X#X#X#X#X+X+X#X#X+X#X",
+"L.L.L.L.!.L.L.L.L.L.L.L.L.L.H.DXDXZXBXBXnXNXNXcXMXvXNXNXvXNXNXvXnX7XV 7 = # # n rXnXNXvXNXvXvXvXvXvXzXjX6Xm.7.Q L.!.L.!.L.L.J.L.!.L.!.L.L.L.J.L.L.L.p.!.L.J.L.E.E.E.!.E.L.L.E.!.E.E.J./.P.R.R.^.!.^.^.`.].[.].].].R./.]./.].].].[. X[.[.].[.[.].].].].].{.].}.[.(.{.[.].[.].[.].].{.[.[.[.{.}.[..X}.}.].{.[.{.}.}.{.XX XXXXXXXXXXX+X+X+XXX+X+X+X#X#X#X#X#X#X#X$X$X$X#X#X#X#X#X@X#X#X#X#X#X+X",
+"L.^.^.!.!.^.F.L.W.^.^.!.!.L.L.ZXIXZXZXNXNXNXvXvXMXMXNXNXcXvXvXNXNXNXv.i * @ : l.NXcXcXcXNXNXNXNXvXNXvXjX0Xm.7.Q !.!.^.L.!.L.L.L.L.L./.L.!.!.L.L.L.L.L.L.!.!.^.L.F.L.T.L.L.L.L.L.L.L.L.L.L.L.)./.L.^././.^.L.[.]./.).].].].[.[.}. X.X/.].].[.[.].].{.].].}.}.{.{. X X{.].[.[.].[.{.].]..X}.}.}.[..X}.{.[.{.[.[.{.}.}.}.XXXXXXXX+XXXXXXXXX+XXX+XXX+X+X+X+X#XXX#X#X#X#X#X#X#X#X#X#X#X#X#X#X+X+X",
+"^.K.!.^.L.W.!.!.!.!.^.K.L.L.L.ZXSXZXBXnXnXNXvXvXNXvXMXvXNXNXNXNXNXNXnX>.= $ n dXNXNXcXcXNXNXNXNXvXvXzXhX0Xx.7.Q L.^.L.L.L.L.L.J.L.!.!.L.K.L.!.L.L.L.^.L.^.L.L.L.P.P.J.!.!.!.L.L.!.!.L.L.E.!.W.!./././.^.].].^.^.].R.(.[.[.].].].^.(.|. X[.].].].].].^.}.^.).[..X}.}.{.[.{..X{.[.{.[.].{.}.}.[.XX X}.{..X{.{.}.{.XX}.XX}.XXXXXXXXXXXX+X+XXX+X+X+X+X+X#X#X+X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X+X+X",
+"^.!.!.^.L.^.W.L.L.^.L.!.L./.L.FXDXZXVXNXbXNXNXvXvXMXNXNXvXNXvXNXNXNXnXsXc t c.NXNXNXNXcXNXNXNXNXvXvXzXhX6Xm.7.Q ~.L.L.!.!.L.E.^.L.L.!.L.L.K.L.L.^.L.^.^.^.^.^.^.^.L.!.!.L.L.L.L.L.J.!.!.L.L.!.^.].^.^.^.^.^.].].].].].].].].].^.].]./.].[.].].].].].{.{.{.].].].{.{. X[.[..X.X|.].[.[.]. X}.}.}..X X].]..X.X}.XX}.XX XXXXXXXXXXX+X+X+XXXXX+XXX+X+X+X+X#X#X#X#X#X#X#X#X+X#X#X#X+X+X+X+X#X+X+X",
+"^.!.^.!.!.^.!.^.!.^.L.!.L.L.L.FXDXZXBXBXnXNXNXNXMXvXNXvXNXNXNXNXNXNXNXnX<XE kXNXcXNXNXNXNXNXNXNXNXNXzXhX6Xm.7.Q !.L.!.!.!.!.!.!.!.^./.L.L.^.^.L.L.^.^.^.^.^.^.^.^.^.L.^.L.L.L.L.L.L.L.L.L.!.^.L.^.^.^.`.].].`.].].].].].].^.].].].].].[.].].].].].{.].{.].{.].{.}.}. X{..X[.}.}.}.[..X.X}.[.XXXX[.}..X.X X{.XX}.XX}.XXXXXXXXXXXXXX+XXX+X+X+X+X+X+X+X+X+X+X+X#X#X+X+X+X+X+X#X+X#X+X+X+X+X+XXX",
+"!.L.L.L.L.^.!.^.L.^.L.!.L.^.P.ZXZXSXBXNXNXnXcXnXnXnXnXnXNXNXvXNXnXcXNXNXzX9XnXnXNXnXzXNXnXzXNXnXzXzXzXaX0Xx.4.! L.L.L.!.!.L.!.^.^.!.!.^.L.!.^.^.^.!.^.^.^./.].^./.^.^.^.L.^.L.^.L.!.L.L.!.^.L.^.^.^.^.].L.`.L.].].].].].].T.^.`.].].].].].].].].].R.{.].{.{.]..XXX}.}.}.}.}.}.}.}.}.XX}.XX).XX}.}.}.XX X}.XXXXXX+X).+X+XXXXXXXXXXXXX+X+X+X+X+X+X+X+X+X+X+X+X+X+XXX#X+X+X+X+X#X#X#X#XXXXX+X+X",
+"L.!.!.L.L.L.L.K.^.L.L.L.^.L.!.AXAXIXVXnXnXnXvXvXvXcXvXvXvXvXvXvXvXvXvXvXNXvXvXvXvXvXNXvXvXvXcXnXcXnXzXaX7Xz.) ! L.L.J.L.L.L.^.L.!.^.W.^.^.^.^.^.^.^.^.^.^.^.^./.].^.^.^.^.^.^.^./.!.L.!.^.L.^.^.^.^.^.^.].].].].].].^.].].]./.].].T.].].].].].].[.].].[.{.[.{..XXX).XXXXXX}.XXXX}.}.}.XXXX XXXXXXX{.XXXXXXXXXX}.XXXXXX).+XXX+XXX+X+X+XXX+XXX).#X+XXXXX+X+X+XXX+X+XXXXX#XXX#X+X+XXX+X+XXXXXXX",
+"L.L.L.L.!.L.L.L.L.!.!.K.!.!.!.BXAXAXVXnXzXzXzXcXvXvXcXcXvXvXvXcXcXvXcXvXvXvXvXvXcXcXzXzXvXvXvXcXcXzXxXiXZ.l.) R L.L.L.!.L.L.^.^.L.^.!.^.^.^.^.^.^.^.`.P.].^.]./.]./.^.^.^.^.^.^.L.!.L.L.!.L.!.^.^.^.^.^.].L.].].^.].T.^.^.].L.].^.].].].].].].].].].[.{.{.{.[..XXXXXXXXX XXXXXXXXX XXXXX XXX XXXXX XXX}.XXXXXXXXXXXX+X+X+XXXXX+XXX+X+XXX+X+XXX+XXXXX+X+XXX+X+X).+X+X+XXXXXXX#XXX+X+X+X+XXX+X",
+"L.J.J.L.L.L.!.!.L.L.L.!.L.L.^.BXNXcXlXdXiXiXpXpXpXiXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXsXsXpXpXaXpXpXpXeX<X8.Q R b J.^.L.L.J.K.!.^.^.^.^.^.^./.^.^.^.^.L.`.L.].].].].].].^.]./.^.^.L.L.^.L.^.L.^.^.^.^.^.^.T.].]./.].].].].^.].].].].^.].].].].].[.].[.{.[.}. X[.}.}.XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}.XXXXXXXX+X).+X+XXX+XXX+X+X+X+X+X+X+XXX+XXXXXXXXXXX+X+XXXXXXXXXXX#XXXXXXXXXXX+X+XXX",
+"J.J.L.L.J.J.L.L.L.L.L.J.J.J.!.zXxXwX0X;XM.N.N.B.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.m.m.x.) W T v b !.!.L.L.L.L.^.^.^.^.^./.].^.^.].^.^.`.^.].].].]./.].].^.^.].^.^.^.L.L.^.L./.^.^.^.].^.^.].T.].^.^.].].L.].].].^.].T.].].].].].{.].[.{.}.[. X{. XXXXX XXXXXXXXXXXXXXX+XXXXXXXXXXXXXXX+XXXXX+XXXXXXXXX+XXXXX+XXX+X+X+X+X+X+X+X+X+X+XXX+XXXXXXXXXXX.X+X.X+X+XXXXXXXXX+X+XXXXX+X",
+"L.!.J.J.J.J.J.J.!.J.L.!.J.J.J.rX4X*Xz.4.( ( ) ( ( ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) _ ~ ! b T v b O.~.!.L.L.L.L.^.^.^.^./.^.].^./.^././.^.].].].].].].].].].].^.^.L.^.^.^.L.L.!.^.^.^.^.^.(.L.].^.`.`./.].].^.].].].].^.].].].].].].}.[.}.{..X[.{. X).XXXXXXXXXXXX+X+XXXXX+XXXXXXXXXXX+XXX+XXX+XXX+X+XXX+X+X+X+X+XXX+X+X+X+X+X+X+X+X+X+XXXXXXXXXXXXX+X.X+XXXXX+XXXXXXXXX+XXXXXXX",
+"!.J.J.!.!.J.J.J.J.!.J.!.^.J.J.OXC.) Q R b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b Y O.g.].F.L.^.L.^.^.^.].].^.]././.].^.]./.^.].].].].].].].].].].^.].^.^.^.^.L.^.^.^.^.^.^.].`.].^./.].].R.].T.].].].].].].`.].].].].].[.[.{.{.}. X XXXXXXXXXXXXXXXXXXXXXXX+XXXXXXX+XXX+XXX+X+X+X+X+X+X+XXXXX+X+XXXXX+X+X+X+X+X+X+X+XXX+XXX+XXXXX}.XXXX+X{.XX+XXX+X.X.XXXXXXX+XXX+X",
+"!.J.!.J.J.J.J.L.L.!.L.J.F.J.~.S.g.^ b v b T b T b v b b b b b b b b b b b b b b b b b b b b b b b b v m n 1.u.a.d.~.^.L.^.^.^.^.].^.].].].].].].].].T.].]./.^.].].].].].^.].^.^.^.^.^.^.^.L.^.^.^.^.].^.^.].].^.].]././.].]./.].].].].].].].].{.{.[.{.}.}.{.{.XX XXXXXXXXXXXXX+XXX+X+XXX+X+XXX+X+X+X+XXX+X).+X+X+X+X+XXXXX+XXXXXXX+X+X+X+X+X+X+X+XXXXXXXXXXXXXXX{.XXXXXXXXXX+X.XXX+XXXXXXXXX",
+"J.J.J.!.J.~.J.J.J.J.J.J.!.L.a.K.{.Y.J.J.J.!.^.L.^.^.^.^.^.^.^.`.^.^.^.].^.].^.^.^.^.].^.].^.`.^.^.^.^.^.W.W.!.K.J.L.L.!.!.^.^.^.]./.].].].].].].].T.^.].].].].].].].].].].L.^.^.^.^.L.^.^.^.^.L./.^.`./.].^.].].].].].].].].].].].].].].].].].[.[.{.{.{.}. XXX.XXXXX+XXX+XXXXXXX+X+X+X+X+XXX+XXXXX+X+X+X+X+X+XXXXX+X+X+XXX+X+X+XXX+X+XXX+X+X+X+X+X+X+XXXXXXXXXXXXXXXXXXXXXXX.X+XXXXXXXXXXXXX",
+"!.J.J.J.J.J.J.L.J.J.J.J.S.J.a.K.~.!.!.!.!.J.E.E.!.E.!.!.!.L.!.^.W.(.^.^.^.L.^.!.^.(.W.^.^.^.^.^.^.^.^.^.L.].L.L.!.!.L.!.^.^.^.].L.]./.].].].].].^.].T.].^.].^.].].]./.].].].].^.^.].^.^.^.^.^.^.^.].^.].].].].].].].].].].].[.[..X]..X}.{.{.{.{.[.{.[.{. X.X XXX#X).+XXXXX+X+X+X+X+X+X+X+X+X+X+X+X+XXX+XXX+X+X+X+XXX+XXX+XXXXX+X+X+X+X#XXX+XXXXXXXXXXXXXXXXXXX{.XXXXXXXXXXXX+XXXXXXX+XXXXX+X",
+"J.!.J.J.J.!.J.J.K.J.L.J.S.E.K.^.K.L.J.L.L.L.L.L.L.L.L.L.^.L.L.P.^.L.^.^./.^.^.^.L.^.].].].R.R././.R..X^.W.L././.P.^.L.^.L.^.T./.]./.].]./.].].].].^./.].].].].].^.].].].].T.^.^.].^.].L./.].^.].]./.].^.].].].].].].[.].].{.].[.].|..X].}..X{.[.{.]..X{.}.XXXXXX+X+X+X+X+XXX+XXX+X).#X+X+X+X#X+X+X+XXX+X+XXX+XXX+X+X+XXX+XXX+XXX+X+X#XXX#XXX+XXX+X+XXXXXXX.X{.XXXXXX+XXX+X.X.XXX+XXX+XXX+XXX",
+"J.J.J.J.J.J.!.J.!.J.p.J.L.L.S.S.J.!.p.!.K.J.K.L.L.J.L.L.K.K.^.^.^./.^.^.^.^.L.^./.^./.^././././././.]./._.K.!.^.L.!.L.L.^.^.^.L.].].].].].].].].].`.].].].^.].].].].].].].].].].]./.].^.].T.].^.].].].].].]./.].[.].].].[.[.{.}.}.[.}.}.}.[..X{.].[.{..XXXXXXXXXXX+X#X).+X+X+X+X+X$X+X+X+X+X+X+X+X+X+XXX+X+X+X+XXX+X+X+XXX+XXX+X+X+XXX#XXXXX.XXXXXXXXXXX.XXXXXXX+X).+X+X.X+XXXXXXX+XXX+XXX+X",
+"J.!.J.J.J.J.J.!.J.J.J.J.L.J.J.!.J.S.p.J.J.S.S.p.S.L.J.J.!.!.!.!.!.!.L.^.^.!.L.^.^.^.^.W.`.^.].`.^.^.].W.W.`.W.W.^.W.L.^.^.^.].]./.].].[.[.].[.].].].].].^.].].].].].].].].].].]./.].]./.].^.].].].].].].]./.R.[.[.].[.[.{.{.}.}.}.}..X XXX{.XX}.XX}.XX}.XXXXXX+X+X+X+X+X+X+X+X+X+X+X+X$X#X#X#X+X+X+X+X+X+X+X+X+XXX+X+X+X+XXX+XXX+XXX+X+XXXXXXX+X+X+XXXXX+X.X.XXX+X+XXXXX+X(.+XXXXX+XXX+X+XXX",
+"J.J.p.J.J.J.J.J.J.J.J.J.p.J.p.J.L.a.J.J.p.J.L.H.J.J.L.L.!.L.^.^.L.^.^.^.^.L.^./.^.^.^.]./.]./././.]./.[.R././.!.^.L.^./.^./.]./.R.R.].].].].].].].].].].].].^.].].].^.].].]./.].R.].].].].].].].].].].].].`.].].{.].[.[.{.}. X X XXXXXXXXXXX}..X}.}.}.}.XXXXXXXXXX+X+X+X+X+X#X#X$X+X+X+X#X#X#X+X+X+X+X+X+X+X#X).+X+X+XXXXX+XXX+XXX+X+XXX+XXXXX+XXXXXXX+XXXXX.X+X(.+X+XXX+X+X+X+X+XXX+XXX#X).",
+"J.J.J.J.J.J.!.p.J.J.J.J.J.J.J.J.S.J.p.p.S.S.J.J.J.J.J.K.!.L.K.L.L.L.L.L.^.L.^.^.^.^.].^.].].`.].].].].^./.^.^.^.^.L.^.^.^.].].^.}.].[.[.[.].[.].].[.].]./.^.].].].^.].^.^.].].].].{.].].].].].].].].].].].{.]..X].{.[.[.{.{..X}..XXXXXXX.X.X.X.XXX{.XXXXXX+X+XXXXX+X+X+X+X#X#X+X#X#X+X+X+X+X#X#X+X+X+X+X#X+X+X+X+X+X+XXX+XXXXXXXXX+XXX+XXXXXXXXX.XXXXXXXXXXXXXXXXX+XXXXXXX+X+XXX+XXXXX+X+X+X",
+"!.J.J.J.J.J.J.J.J.p.J.p.J.J.J.J.p.S.S.J.p.J.p.J.J.J.J.J.L.!.!.!.L.L.L.L.L./.^.^.^.^.^.^.].^./.].].]././././.].^.^.^./.^.]./.].].].].].].[.].].[.].].R.].].].].].].].].].].].].].{.].].].]..X{.{.].].{.[..X].{.].].{.[.[..X{.{.XXXXXXXXXXXXXXXXXX.X.XXXXXXXXXXX+X+X+X+X+X+X#X#X#X+X#X+X$X#X#X+X+X#X#X#X+X+X+X+X+X+X+X+X+X+X+XXXXX+XXX+X{.+XXXXXXXXXXXXXXXXX.XXXXX+XXX+X+XXXXXXXXX+X+X+XXX+X+X",
+"J.J.J.p.p.J.J.J.J.J.J.J.J.J.S.J.p.S.p.S.J.p.p.J.J.p.J.J.J.!.L.!.L.!.L.^.^.L.^.^.^.^.^.^.].].^.].].]././.R./.]./.^.^.^.].^.].].].[.].].[.[.[.[.].[.].].].].].].].].].].^.].].].]..X].].{.{.[.{.{. X{.}.}.}.}.}.}.{.[.{.{.{. XXX}.XXXXXXXXXXXXXXXX.XXXXXXXXX+X+XXXXX+X+X+X#X#X+X#X#X#X#X#X+X#X+X#X+X#X#X#X+X+X+X+X+X+XXX+XXX+XXXXXXXXXXXXXXXXXXX+X.X.X+X.X+X.X.XXXXX#XXXXX+XXXXX+XXXXX+X+X+X+X",
+"J.J.J.J.J.J.J.J.p.J.S.p.p.J.p.J.S.S.p.S.S.S.J.J.J.J.J.J.J.J.J.L.L.!./.L.L./.^.^.^.^.^.].^.].].].].].].].].].].L.].].].^.].].].]./.].].].].].].[.[.].]./.]./.].^.].].].].]./.}.].].[..X{.{.{.{.{.XX X}.}.XX}.[.}.{.{. X.XXX{.}.}.XXXXXXXXXX+X+XXXXXXX+XXXXX+X+X+X+X+XXX+X#X+X#X+X#X#X#X#X#X#X#X#X#X#X#X#X#X+X+X+XXX+XXX+XXXXX+X.X.X+XXX+XXXXXXX+XXXXXXXXX.X.X.X+X.XXXXX+XXX+X+XXX+X+XXX+X+X+X",
+"J.J.J.S.J.J.p.J.J.J.H.S.J.S.J.p.J.p.H.p.J.p.p.S.J.p.J.J.J.!.J.!.!.L.K.L.^.P.^.^.^.^.^.^.].].].].].].].].].].].].].].].].].].].].].].].].[.[.[.].].[.].].].].].].].].].].].].[.}.{.{.]..X}.XXXX}.XX}.XXXXXX}. X}.}.XX}. X{.XX}.XXXXXXXX+XXXXXXX+XXX+XXX+XXX+X+X+X+X+X+X+X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X+X+XXXXX.X+X+XXX+XXXXXXXXXXXXXXX.XXXXX+X.XXXXX.X.X.XXXXX+XXXXX+XXX+XXX+XXX#X+X#X",
+"J.J.p.J.J.J.S.J.S.p.J.p.J.J.J.S.S.H.p.J.J.J.J.J.J.J.p.J.J.L.L.L.L.L.L.^.L.L.^.^.^.].].^.^.].].].].L.].].]./.].].].L.].^.].].].].].].].].].].[.].].].].].].].^.]./.^.].].].[.[.].[.{.{..X}.XX}.XXXXXXXX}.}.XX}.XX}.}.XX X X}.XX}..XXXXX+XXX+XXXXXXXXX+XXX+X+X+X+X+X+X+X+XXX#X+X+X+X#X#X#X#X#X#X#X#X#X#X#X+X#X+X#X@X+X+X.XXX+XXX+XXX+XXX.XXX.XXXXX+X.X.XXX+X.X.X.XXXXXXX.X+XXX+X+X+X+X+X+X+X+X",
+"K.J.J.J.J.J.S.J.p.S.J.J.H.S.p.J.p.p.J.J.J.J.S.S.J.J.J.J.!.p.!.J.L.L.L.L.L.L.^.^.^.^.{.^.].T.^.^.]./.].].].].].].].].].].^.].].].`.].].].[.].].[.].].].]./.].].].].].].].[.].[.]..X[.XX}.XX XXXXXXXXX XXXXXXX XXX.X.X}.}.}.}.XX{..X.XXXXXXXXXXX+X+XXXXX+XXXXX+X+X+X+X+X+X+X+X+X+X+X#X#X#X#X#X#X#X#X$X#X#X#X#X+X#X+X+X+X+X+X+X+X XXXXXXX.X.XXX.XXX+X.XXXXX.X.X.X.X.X.XXX#XXXXXXX#X+X+X+X+X+X+X",
+"!.J.J.J.J.J.p.J.S.p.H.p.p.S.S.p.S.S.J.p.y.J.p.S.y.J.y.J.J.J.!.L.L.J.L.L.L.^.^.^.^.^.(.^.].L.].].].`.].].].].].^.].].]./.(.{.].].].].[.].].[.].].].]./.].].[.[.].].].].].].[.].].{. X.XXX}.XX.X.X.XXXXXXXXXXXXXXXXX XXX}.XX.X{.{.XX XXXXX.XXX+XXXXXXX+XXX+X+X+X+X+X+X+X+X+X+X+X+X#X#X#X#X#X#X#X#X$X#X#X#X#X#X#X+X+X+X+X+X X X+X+X+XXX.XXXXX.X.X+X.X+XXX.X.X.X.X.X+XXX+X.XXX#XXXXX+XXX+X+X+X+X"
+};
diff --git a/images/checkbox1hilite.xpm b/images/checkbox1hilite.xpm
new file mode 100644 (file)
index 0000000..ba3a03d
--- /dev/null
@@ -0,0 +1,288 @@
+/* XPM */
+static char *checkbox_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"190 70 212 2",
+"   c #1E3E65",
+".  c #1D3E6A",
+"X  c #1D3C72",
+"o  c #233C64",
+"O  c #233D6C",
+"+  c #2A3B65",
+"@  c #2A3C6B",
+"#  c #233E72",
+"$  c #293E72",
+"%  c #0C4702",
+"&  c #0D4A02",
+"*  c #0E5302",
+"=  c #124B0B",
+"-  c #164E12",
+";  c #174E1B",
+":  c #1B4A1E",
+">  c #115F02",
+",  c #116302",
+"<  c #126B02",
+"1  c #147402",
+"2  c #157A02",
+"3  c #1F7813",
+"4  c #1F663D",
+"5  c #206B1F",
+"6  c #216530",
+"7  c #174368",
+"8  c #1C4265",
+"9  c #1C426B",
+"0  c #1C4966",
+"q  c #1D486A",
+"w  c #174670",
+"e  c #144973",
+"r  c #134979",
+"t  c #1B4372",
+"y  c #194876",
+"u  c #1B4B7A",
+"i  c #224265",
+"p  c #22416B",
+"a  c #284265",
+"s  c #29416C",
+"d  c #234371",
+"f  c #25457A",
+"g  c #244873",
+"h  c #234C7B",
+"j  c #2B4776",
+"k  c #24517B",
+"l  c #31587F",
+"z  c #2C7251",
+"x  c #1C5985",
+"c  c #214E80",
+"v  c #294D81",
+"b  c #225381",
+"n  c #255A82",
+"m  c #255C8A",
+"M  c #295383",
+"N  c #2C578E",
+"B  c #295B8A",
+"V  c #275F92",
+"C  c #2C5D92",
+"Z  c #325B8D",
+"A  c #345D95",
+"S  c #2B608C",
+"D  c #246396",
+"F  c #2E6293",
+"G  c #2F669C",
+"H  c #2C6D95",
+"J  c #2D729E",
+"K  c #32608B",
+"L  c #326593",
+"P  c #31659B",
+"I  c #326E96",
+"U  c #316A99",
+"Y  c #3C6F9A",
+"T  c #33739F",
+"R  c #3D779F",
+"E  c #2D74A0",
+"W  c #336CA1",
+"Q  c #386DA1",
+"!  c #3573A2",
+"~  c #3775A8",
+"^  c #3378A2",
+"/  c #3C73A4",
+"(  c #3876A9",
+")  c #3B7BAA",
+"_  c #4275A4",
+"`  c #407AA9",
+"'  c #168402",
+"]  c #178902",
+"[  c #188A03",
+"{  c #199303",
+"}  c #1A9803",
+"|  c #1E980A",
+" . c #1CA203",
+".. c #1DAB03",
+"X. c #1EB103",
+"o. c #209E0D",
+"O. c #31933F",
+"+. c #2BAE1B",
+"@. c #22B708",
+"#. c #20BB03",
+"$. c #33AE33",
+"%. c #3ABF35",
+"&. c #328E66",
+"*. c #338C7A",
+"=. c #3C9E69",
+"-. c #3F9F70",
+";. c #21C403",
+":. c #22CD03",
+">. c #27CD09",
+",. c #23D303",
+"<. c #25DA04",
+"1. c #2CDB0E",
+"2. c #2DD711",
+"3. c #32CE20",
+"4. c #39C534",
+"5. c #27E304",
+"6. c #28E604",
+"7. c #28E904",
+"8. c #2CEB0A",
+"9. c #29F304",
+"0. c #2CF907",
+"q. c #30EF0E",
+"w. c #30EB11",
+"e. c #31F30F",
+"r. c #31F90E",
+"t. c #33F910",
+"y. c #3AE423",
+"u. c #3DF420",
+"i. c #439F6D",
+"p. c #54B479",
+"a. c #67BA76",
+"s. c #42F824",
+"d. c #46F92A",
+"f. c #46C850",
+"g. c #5CEE52",
+"h. c #5DF153",
+"j. c #69F15B",
+"k. c #33928C",
+"l. c #3881AF",
+"z. c #3587B7",
+"x. c #3D85B3",
+"c. c #3C8AB9",
+"v. c #3D99A0",
+"b. c #3395B6",
+"n. c #369CCD",
+"m. c #3B96CE",
+"M. c #3D9ACE",
+"N. c #379CD0",
+"B. c #3A97D0",
+"V. c #3D9AD0",
+"C. c #3C9DD9",
+"Z. c #3DA1CD",
+"A. c #3CA0D3",
+"S. c #39A1D9",
+"D. c #419B9E",
+"F. c #4080AE",
+"G. c #4383B2",
+"H. c #4187B8",
+"J. c #438AB2",
+"K. c #428BBB",
+"L. c #4982B3",
+"P. c #4A8AB4",
+"I. c #4A8CB8",
+"U. c #4D90BD",
+"Y. c #5390BC",
+"T. c #478DC0",
+"R. c #498FC0",
+"E. c #4793C7",
+"W. c #4395CC",
+"Q. c #429BCD",
+"!. c #4B95C2",
+"~. c #4B94CA",
+"^. c #4A9BC5",
+"/. c #4A9CCC",
+"(. c #4396D2",
+"). c #439CD2",
+"_. c #459DD8",
+"`. c #4897D2",
+"'. c #489ED3",
+"]. c #4A9ED8",
+"[. c #5094C3",
+"{. c #5695C8",
+"}. c #5299C5",
+"|. c #519CCB",
+" X c #5B9ECB",
+".X c #519DD3",
+"XX c #529EDA",
+"oX c #599FD1",
+"OX c #46A0C3",
+"+X c #44A1CD",
+"@X c #4EA2C7",
+"#X c #4BA1CD",
+"$X c #45A1D3",
+"%X c #44A2D8",
+"&X c #47A8DB",
+"*X c #4BA1D4",
+"=X c #4CA3D9",
+"-X c #4CA9D4",
+";X c #4BA9D9",
+":X c #52A2CD",
+">X c #52A4D6",
+",X c #54A5D8",
+"<X c #55A8D6",
+"1X c #55A8D8",
+"2X c #59A4D3",
+"3X c #59A4DA",
+"4X c #5AA9D6",
+"5X c #5CAAD9",
+"6X c #41A0E0",
+"7X c #62ADDB",
+"8X c #66B0DC",
+"9X c #6AB2DD",
+/* pixels */
+"V.M.V.V.V.V.V.V.V.V.M.V.).V.V.).V.V.W.V.M.).).).).).).).).).).).).).$X).$X$X$X$X$X'.=X*X*X*X*X*X*X*X=X'.=X'.>X=X>X=X>X>X<X>X>X>X>X*X#X*X'.>X'.>X*X>X>X>X*X>X>X*X>X#X*X>X.X>X>X>X.X>X>X>X>X*X>X*X>X*X>X*X>X=X=X*X=X*X*X:X*X*X>X>X*X>X*X>X*X>X>X>X*X>X>X*X,X<X<X<X<X>X<X,X<X<X1X1X5X1X1X5X1X1X1X5X5X5X5X5X7X7X7X7X9X9X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X",
+"M.M.V.V.V.V.M.n.V.V.V.V.V.V.W.V.V.).).V.).V.).).).).).).).).).).).).'.).'.'./.*X'.'.$X*X*X*X*X*X*X$X'.'.'.>X>X'.*X>X<X>X>X>X>X=X=X*X*X*X/.*X=X*X=X*X*X*X*X*X*X*X*X*X*X>X*X'.>X*X'.*X>X*X>X*X#X*X.X*X*X*X'.>X>X*X>X'.*X>X>X*X,X*X>X/.'.>X>X>X>X>X*X>X>X>X*X,X<X>X<X>X<X>X<X<X1X3X1X5X5X1X5X5X1X5X5X5X5X5X5X7X7X7X3X7X7X8X7X9X9X9X7X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X",
+"V.V.V.V.V.N.M.M.V.V.).V.).V.V.V.V.V.V.).V.).M.).).).).).).).).).).$X'.$X'./.'.$X$X*X*X*X*X*X$X*X*X'.*X>X*X>X'.>X=X>X=X>X>X=X>X>X>X*X$X'.*X'.*X*X*X*X>X=X*X*X*X*X'.*X*X*X*X>X'.*X>X=X*X*X>X-X*X>X*X*X*X*X*X*X=X*X'.>X*X>X>X>X>X*X*X:X>X>X*X>X>X>X>X>X>X>X>X>X>X>X<X<X<X,X<X3X1X5X1X5X5X1X5X5X5X5X5X5X5X4X5X7X7X7X7X9X7X7X7X9X9X7X8X8X7X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X",
+"V.V.V.V.V.V.V.N.V.V.V.V.V.V.V.V.V.V.).V.W.).Q.).).).).).%X).).).).$X).$X$X$X'.=X'.*X*X*X*X*X*X*X*X$X'.*X*X*X*X=X=X>X>X<X>X>X>X=X'.*X*X=X$X'.'.*X*X*X*X*X'.*X#X*X*X*X*X*X*X*X*X'.=X'.:X*X#X*X*X=X*X*X'.*X*X=X>X*X#X*X>X#X>X'.>X|.>X*X.X>X>X>X*X>X>X*X/.>X.X>X>X>X>X>X<X<X2X3X1X1X5X5X5X5X1X5X5X5X5X7X5X7X5X5X7X7X7X7X9X9X9X7X9X9X8X8X7X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X",
+").V.V.V.V.V.V.V.V.N.V.V.V.V.V.V.V.V.V.W.V.V.).).).).).).).).).$X$X$X$X%X*X+X*X*X>X'.=X*X*X*X>X*X*X*X*X*X*X*X*X*X=X>X>X>X>X>X=X=X'.>X'.'.=X$X*X'.*X*X$X*X*X*X#X$X*X#X*X*X*X*X*X*X*X*X*X*X*X>X*X*X=X'.'.*X*X*X-X*X*X>X#X>X#X>X#X>X*X>X*X>X#X*X>X#X*X>X>X*X*X>X>X>X>X,X<X<X,X<X1X1X1X5X5X5X5X5X5X7X5X5X7X5X7X5X7X7X3X9X9X7X8X8X8X8X8X8X9X9X8X9X9X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X",
+"M.).V.V.C.V.V.V.V.V.V.V.V.V.V.V.).V.).V.M.M.M.M.).Q.).).).).).$X'.'.'.'.*X*X*X*X=X>X'.*X*X>X*X*X*X>X*X*X=X*X*X>X>X>X>X=X'.>X*X=X*X*X'.*X*X*X*X'./.*X*X*X$X$X/.*X$X$X'.'.$X$X*X=X*X=X#X>X*X-X>X*X*X>X'.'.*X*X*X>X*X>X>X*X>X*X>X>X'.>X*X*X*X*X*X*X*X*X*X*X>X*X*X>X>X>X>X,X,X3X5X1X1X5X5X5X5X5X5X5X7X7X5X7X7X7X7X8X9X7X7X9X8X8X8X8X8X8X9X8X9X8X9X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X",
+").).V.).).V.).V.W.V.M.m.M.M.M.Q.V.).V.M.).W.).).V.).).).).).$X$X$X$X%X+X*X*X*X*X*X*X*X#X>X*X*X*X>X*X*X*X*X#X<X>X*X>X>X>X>X=X=X'.'.'.=X=X*X*X*X*X'.$X'.'.'.).'.'.).'.'.'.*X$X].*X*X*X*X*X*X*X*X*X*X$X*X*X$X*X*X*X*X*X=X*X*X'.=X*X>X>X'.=X*X*X*X*X*X*X=X,X*X>X>X>X>X>X>X<X,X4X,X4X5X5X5X5X5X5X5X5X5X7X7X7X7X7X7X7X7X9X9X9X8X8X8X8X8X8X8X8X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X",
+").V.).).V.).V.).).).M.).M.M.M.).).V.).).M.).V.M.Q.).).).).).).'.'.*X'.*X*X*X*X*X>X*X>X>X>X>X>X#X>X*X*X*X>X>X>X>X>X>X=X>X>X'.*X*X'.=X'.'.'.$X'.$X$X'.$X$X).).$X$X$XQ.'.'.'.'.'.'.*X*X*X*X*X*X*X*X'.*X$X*X*X*X*X*X*X*X*X=X'.>X*X*X*X'.>X=X*X*X*X-X*X*X'..X>X>X*X>X>X>X>X,X<X,X,X3X1X1X5X5X5X5X5X5X5X7X7X5X7X7X7X7X7X9X7X8X8X8X8X8X8X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X",
+").V.).).).M.M.).V.V.).V.M.M.M.M.V.).W.).).M.M.).).V.).).).$X).$X$X*X*X=X>X*X=X=X=X;X>X;X>X>X*X>X'.'.>X>X>X>X>X>X>X>X>X*X=X*X*X*X>X'.=X'.*X*X=X'.'.'.'.).Q.).).$X).).).%X$X'.'.'.'.$X*X*X$X=X'.=X'.'.'.'.'.'.>X*X*X*X>X=X*X*X>X=X*X*X*X*X*X*X$X*X*X*X*X*X*X*X>X>X>X>X>X>X<X<X<X2X3X5X5X5X5X3X7X5X5X7X7X7X7X7X7X7X7X8X9X8X8X8X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X9X",
+"Q.).).).).M.).M.).V.V.W.V.M.).M.M.V.).).).).Q.M.).).).).$X).).'.*X*X*X*X>X>X>X>X,X>X>X>X>X>X>X>X,X>X>X>X>X>X<X>X>X*X*X>X*X*X'.*X'.=X'.>X*X$X=X'.$X).$X).).).).Q.).).).).).'.).$X'.*X*X*X*X'.$X*X$X*X'.'.'.'.'.=X*X*X*X*X=X*X*X*X*X*X*X*X$X*X*X*X>X*X'.>X>X*X>X*X>X,X*X,X<X>X<X>X5X3X5X5X5X5X5X5X7X5X5X7X7X5X7X7X7X7X9X8X8X8X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X9X9X9X9X",
+").).).).).).V.V.M.).).V.M.).).M.).M.).Q.).M.M.).Q.).).V.).).).$X$X*X=X>X>X>X>X<X<X,X>X>X<X>X>X>X>X>X<X>X,X,X,X,X<X>X>X>X*X*X*X*X=X'.'.'.*X*X'.'.$X$XQ.).).M.).).V.).).).).).$X'.*X'.*X$X*X/.'.'.$X'.$X'.'.$X$X*X*X*X=X*X*X>X*X=X'.>X#X*X*X*X*X*X'.'.*X*X*X*X'.*X*X,X>X>X*X<X,X<X3X1X5X5X5X5X5X5X7X5X5X7X7X7X7X7X8X8X8X9X8X8X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X9X",
+").).).Q.).).).).M.M.V.).).M.M.V.).).).M.).).).).).V.).Q.).).).*X*X*X>X>X>X<X1X1X1X<X>X>X<X<X<X,X1X>X>X>X<X,X,X,X>X>X>X*X*X'.*X*X=X'.*X*X*X*X=X.X'.'.'.).).).V.).).V.).).$X).).'.'.'.*X$X*X'.].$X'.'.).'.'.$X*X=X*X*X*X>X=X*X*X=X*X*X*X$X*X*X*X/.'.$X*X*X*X*X*X>X*X,X*X>X,X,X<X<X1X1X5X3X5X5X5X5X5X5X7X5X5X5X7X7X7X7X8X8X8X8X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X8X9X8X9X8X",
+").$X).).).).).V.).).M.).W.V.Q.).M.).M.).).M.).).).).M.).Q.'.).$X>X>X>X,X4X1X1X1X1X1X1X3X1X,X,X,X>X1X1X1X3X1X,X,X>X<X=X*X*X*X*X#X>X*X=X*X*X*X*X*X'.).).).).).V.).).).).).).).).).'.'.*X*X'.].$X'.).).).$X'.'.'.=X=X*X*X=X*X*X>X'.*X*X*X*X*X*X$X*X$X*X'.'.*X*X*X>X*X*X,X>X>X>X,X,X1X3X1X5X5X5X5X3X5X5X5X5X5X7X7X7X7X7X8X8X8X9X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X8X9X9X8X",
+"$X$X'.'.).).).).).).).M.M.).).Q.).).).).).).).M.M.M.).).).).'.*X'.>X>X,X1X1X5X1X1X1X1X1X,X,X,X,X1X1X1X1X1X<X,X1X<X-X>X=X=X*X*X*X'.=X*X*X*X*X*X*X).).).V.V.M.m.V.V.A.).).).$X).$X'.'.*X*X$X'.'.'.$X).).).).'.'.'.*X=X*X*X*X*X'.>X'.=X*X*X*X$X*X*X*X'.'.'.>X'.=X'.*X>X>X>X>X>X>X,X1X1X1X1X1X5X5X5X5X5X3X5X5X7X7X7X8X7X8X8X9X9X9X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X8X",
+"$X'.$X$X$X).$X).M.M./.C.M.W.M.).`.^.Q.).).M.V.).Q.).M.M.Q.Q./.$X*X>X<X4X1X1X4X1X1X5X1X1X<X<X<X4X1X1X1X1X1X1X1X1X<X>X-X>X>X>X*X*X'.*X>X>X*X*X*X'.'.).).).M.).V.M.V.).).).).).).).$X$X$X].'.$X$X'.'.).Q.$X).'.'.'.*X+X=X=X>X'.=X*X*X*X*X#X'.*X*X/.*X*X'.*X'.*X'.>X>X*X>X>X>X>X3X,X>X1X1X1X<X1X1X1X5X1X5X5X5X7X7X7X8X8X8X8X9X9X9X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X9X8X",
+"'.'.$X$X$X).).).).).Q.)./._.S.k.p.g.s.r.0.9.9.9.9.9.0.9.0.9.9.9.0.9.9.9.9.9.9.0.9.9.9.0.0.0.9.9.0.0.9.9.w.4.=.D.>X>X=X>X*X*X*X*X=X#X>X*X>X'.*X$X).).).V.V.).).M.V.).V.V.).).).).'.$X'.$X'.'.'.'.).'.).).).$X'.$X*X*X=X=X'.=X'.=X>X'.$X*X*X*X*X$X*X*X*X$X*X*X'.>X*X*X>X'.>X>X*X>X,X>X1X1X3X3X5X3X1X5X5X5X5X7X7X7X7X8X8X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X9X8X9X8X8X9X8X8X7X7X9X",
+"'.$X).).).).).).).).Q.'.W.6XC.a.j.d.t.9.0.9.9.9.9.0.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.0.9.9.9.9.9.9.8.y.f.-.>X<X<X-X>X>X>X*X>X>X'.>X'.*X'./.).).).).M.V.).m.M.).).).).).).).).).$X$X'.'.'.'.'.'.).).).'.'.'.*X*X=X'.'.=X'.=X=X>X'.*X*X*X*X*X*X*X*X/.=X*X*X*X=X*X*X>X>X*X>X*X<X>X>X<X<X2X<X2X<X1X4X5X5X7X5X7X8X8X8X8X8X9X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X7X8X8X",
+"'.'.$X'.$X'.'.).'.$X$XM.$XV.W.j.d.r.0.9.7.9.9.9.7.9.9.9.7.9.7.9.7.9.9.9.9.7.9.9.7.9.9.9.7.9.9.9.9.9.7.6.6.1.3.$.<X>X>X>X*X*X=X*X>X*X>X>X>X'.).).Q.).M.A.V.).).M.M.).).V.).).).).$X).'.'.).'.'.'.).$X).'.).).'.'.$X'.'.'.'.=X'.=X].'.=X*X*X*X>X*X*X*X*X*X*X*X*X*X*X*X*X*X*X>X>X>X>X>X>X>X>X<X>X<X1X<X5X4X5X5X8X7X8X7X7X8X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X8X8X8X7X7X",
+"'.'.'.).$X'.'.'.).'.S.%X/.).$Xt.w.9.9.7.7.7.6.6.7.7.7.7.7.6.7.7.7.7.7.7.7.6.7.7.7.7.6.6.7.6.6.7.7.6.7.5.<.:.@.o.,X>X>X>X>X>X*X>X>X*X'.*X'.'.'.).).V.V.).V.).V.M.M.M.).).).).).).).V.'./.).'.).'.'.).).$X).$X'.$X$X$X'.'.'.'.=X'.'.=X>X'.*X*X=X'.=X-X*X*X=X*X=X*X*X*X*X*X*X'.>X>X*X>X>X,X>X,X,X>X1X1X<X5X5X5X7X7X5X8X5X8X8X8X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X8X8X8X7X7X",
+"].$X'.'.'.'.'.$X'.'.%XQ..X`.A.8.7.7.7.6.5.5.<.5.5.5.5.<.<.5.5.5.5.<.5.<.5.5.5.<.5.5.<.5.<.5.5.<.<.5.5.<.;.X.} ' ,X,X>X>X>X>X>X=X*X#X>X$X'.).).).).Q.V.V.M.V.V.M.).).).).).).).V.).).`.).'.).'.'.'.).).$X$X'.'.'.$X/.'.'.'.=X'.=X=X'.=X>X*X>X*X#X*X*X>X>X*X>X*X*X*X*X*X+X*X*X=X*X*X*X>X>X>X>X<X<X1X1X5X5X5X5X5X7X8X5X8X7X8X8X9X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X8X7X7X7X7X",
+"'.'.'.'.'.'.'.'.'.'.'.Q._.).).7.7.6.6.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,.#. .] 1 <X,X<X>X>X=X>X>X=X'.$X'.).).).V.V.V.V.V.m.V.V.M.M.V.V.).).).).).).).).).).'.$X'.'.'.).).$X'.'.'.$X'.'.).'.].'.'.*X>X*X>X*X>X*X>X.X>X*X*X>X*X>X*X'.'.*X*X*X*X=X>X#X>X>X>X>X>X,X<X<X3X4X1X5X5X7X7X5X7X7X7X8X9X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X7X8X8X8X7X7X",
+"'.$X$X'.'.'.*X$X'.$X'.+X].$XM.7.5.6.5.5.,.<.<.<.<.<.,.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:.#.} 2 , 1X,X<X,X<X<X>X=X=X'.).'.).V.V.V.V.V.V.V.V.V.).M.Q.).).Q.).).).V.).'.).).).'.'._.'.).).'.$X'.$X'./.$X'.'.'.'.'.=X=X=X.X*X.X>X>X=X>X>X>X*X#X=X*X*X'.'.*X*X*X=X'.'.*X*X>X*X*X>X>X<X<X<X5X1X5X7X5X7X5X8X8X7X8X8X9X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X8X7X7X7X7X",
+"'.'.'.$X'.'.'.'.'.'.$X).'.'.'.7.6.6.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.;...} 2 , 1X<X,X<X>X,X>X>X*X'.`.V.V.W.).V.V.V.M.V.M.M.).V.n.V.).M.+X$XM.+X`.'.).`.).).A.).*X+X).+X).+X).Q.'.'.Q./.'.'.=X'.'./.>X'.>X-X*X*X=X>X=X2X>X;X*X;X-X#X#XQ.*X+X'.=X.X>X=X>X,X>X>X>X<X<X4X1X4X5X7X7X4X7X7X8X7X8X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X8X8X7X7X2X",
+"'.'.].'.'.'.'.$X$X'.*X$X$X'./.5.7.5.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:...} 2 , ,X<X<X,X<X,X>X*X$X).).V.V.V.V.V.M.M.(.W.M.)._.W.).].C.).'.V.).S.V._.A.(./.'.`.`.'.'.'.).'.`..X'.).+X$X$X'.].].$X'.>X=X=X'.*X,X2X>X].*X1X|.<X'.'.'.=X/.=X'.=X=X$X*X*X*X-X>X>X>X<X,X1X4X1X4X4X7X4X8X4X7X7X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X9X7X8X7X8X",
+"'.].'.'.'.'.'.*X'.'.$X$X'.'.).6.6.5.6.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,...{ 2 , <X<X,X,X,X>X>X*X'.Q.).m.M.N.B.V.B.M.M.V.V.V.V.V._.(.M.).'.).).A.M.%XZ.+X$X).).=X'.).%X).].)._.'.'.).).$X&X'.'.,X'.=X=X'.>X>X>X>X'.,X>X'.>X*X-X=X'.=X&X'..X'.=X].*X>X*X=X>X>X>X>X<X1X4X<X4X5X5X7X7X7X7X7X8X8X7X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X X9X8X8X8X7X7X7X7X",
+"'.'.'.$X'.=X].*X'.'.*X$X$X'.'.5.6.6.6.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:...} 2 , >X>X,X,X,X>X*X*X'.).V.m.B.B.B.B.M.B.m.V.V.m.A.).Q.Q.'.).`.`._.).).+X).'.).V.=XQ./.$X/./.'.=XA.).'.'.&X+X/.!.H.x.c./.#X-X*X*X*X*X<X@X:X>X;X&X>X:X2X.X.X*X*X,X'.'.*X>X*X*X/.>X>X>X,X1X,X4X1X1X4X5X5X5X7X7X8X7X9X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X8X9X9X8X7X7X7X9X2X",
+"=X=X$X*X*X*X*X*X$X#X$X).$X).'.6.6.6.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.5.<.<.<.<.<.<.<.,...{ 2 , <X<X>X<X>X>X*X$X`.V.V.m.B.B.B.B.M.M.N.V.V.).E.B t d 9 9 d p O p p . ).).%X$X!.u d d O f B >X+X)..X'.|.L.n d $ $ O 9 Z I.:X>XP X 9 9 S >X>X3X>XB d 7 t P ^.#X*X=X'.'.*X*X'.*X>X>X,X,X<X,X4X1X5X4X5X7X7X5X7X8X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X8X9X X7X8X7X X8X7X",
+"'.'.'.*X%X*X+X*X*X*X$X).).'.'.6.6.5.5.<.<.<.<.,.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,...} 2 , ,X>X<X>X>X*X#X'.).V.M.M.B.B.B.B.B.V.V.(.).M./.m . i i o 8 d 9 O s p /._._.+XJ.q   p a o h ^.%X$X].].x.e 9 p . 9 p a o u ^.<X{.h @ + p J.1X3XF.t o a h Y.>X-X-X/.=X'.*X*X'.>X'.>X>X<X,X<X1X1X4X5X5X5X7X7X7X7X7X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X7X8X8X9X7X7X",
+"'.'.*X$X*X+X*X*X$X#X/.'.).'.).6.6.5.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:.X.} 2 , ,X<X<X>X>X=X'.).V.V.M.N.B.B.B.B.M.V.V.V.V.n.W.m p 8 + @ 9 9 d O O 9 ).%X_.+XH p p p q 8 t l.+X*X$X=Xk p s 9 ) ` b p s 9 T >X/.F.w @ p h /./.h   q O x.1X;X'.*X>X*X=X*X*X*X*X>X>X>X,X>X1X1X<X1X5X5X5X7X7X5X7X7X7X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X8X7X7X7X7X",
+"*X*X*X*X*X*X*X*X*X*X$X'.).'.).7.6.5.5.<.<.<.<.<.<.5.<.<.<.<.<.<.<.<.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,.,...} 2 , ,X>X>X*X*X'.).).V.M.M.M.B.B.B.V.B.V.M.(.).V.W.N @ o r l./.M.M.).).+XM.'.]..Xb @ O M 8 s $ P >X=X/.-Xp s + y !.;XH.Z l R ) =X>X<XL 9 @ 9 ` R p s j A >X=X=X>X,X'.*X+X*X*X*X*X>X>X>X,X>X1X1X4X4X5X1X5X7X7X7X7X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X X8X7X8X7X7X7X",
+"'.*X*X*X*X$X*X*X*X$X$X_.'.$X).6.7.6.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,...{ 2 , >X*X>X*X$X$X).).V.V.M.m.M.M.V.N.V.V.V.m.M._.M.B p p # F Y / ! E ! G.$X+X%XI.8 d p ! S s @ d !.=X*X*Xk p @ O v P ( !.$X>X*X=X1X#X~.j $ 8 9 p i 9 u |.>X>X*X*X>X*X*X*X*X*X'.*X>X,X>X*X<X2X3X5X1X1X5X5X5X7X7X5X7X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X7X8X7X8X8X",
+"'.*X$X#X$X%X*X+X*X$X$X'.).).V.5.7.5.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,...} 2 , >X*X*X$X$X/.).M.V.M.M.m.V.B.V.V.N.N.V.V.m.V.M.B p p i q   i q   9 I `.%X).U d p . K.) . i 9 ) '.*X=X! w p + s 9 . p m ` 2X*X>X*X1XG.d i O s i X L.2X*X,X*X>X*X=X*X*X*X*X>X*X>X*X>X,X>X<X<X1X1X1X5X5X5X5X7X7X7X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X7X8X7X8X8X7X",
+"*X*X'.'.*X'.'.].'.'.).'.).).).7.6.5.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:...{ 2 , *X$X$X$X).).).V.V.V.V.m.M.V.V.V.V.V.V.M.m.).M.B O p @ p O O O O # ~ '.&X'.c p O t +X~.u q 8 Z *X>X=X3X~ w p p i s a 9 d ) 4X*X1X=X=XL i 9 O o F 4X>X>X>X>X>X,X*X*X*X=X*X'.>X>X>X>X>X>X<X2X<X3X5X5X3X5X5X5X7X7X7X8X8X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X9X8X9X8X8X8X8X8X8X8X7X",
+">X*X=X'.'.'.*X$X%X'.).'.).).).6.6.6.5.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.5.<.<.<.<.,...{ 2 , $X$X'.'.).).V.).V.V.W.V.V.).V.V.V.(.V.V.m.V.m.B p p d L ! J ! / W z.'.%XI.t o s j ! ! h p 8 j ^.,X=X'.*X>X) L h d @ p o y :X<X>X3X*X}.p j O a ~.<X>X>X*X*X>X*X*X=X>X*X1X>X*X>X>X,X*X,X,X,X<X4X1X5X3X5X5X5X7X7X7X7X8X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X8X8X8X8X9X8X8X8X",
+"*X*X'.'.'.'.'.).$X'.Q.).).).).6.6.5.5.<.<.<.<.,.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:.X.{ 2 , '.$X).Q.).).).M.M.M.V.V.V.).).V.V.V.V.V.M.V.M.B O p O l.).V.).'./.$X=X'.U . 8 a s t p 8 @ p O ) #XE.P.l./ K.,X3X` h 8 @ f c.<X<X>X<X<Xo O p i 5X+X=X*X>X>X>X*X>X>X>X>X>X>X>X>X>X<X>X2X2X3X<X1X1X5X5X5X5X7X5X7X7X7X8X7X9X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X8X8X8X8X8X8X",
+"'.*X'.*X'.'.$X'.'.).$X).).V.).6.6.6.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:.X.{ 2 < ).$X).'.).Q.).).).).).m.).V.V.V.m.).V.).V.).M.B p p w z.'.].].)././.'.'.k O 0 i s O p 8 @ p 9 M /.x.8 s O B '.-X2Xn 9 @ d K.-X1X>X<X>Xp 9 p 9 >X-X>X,X,X>X>X>X>X=X,X*X>X>X>X>X>X>X<X,X<X<X5X1X5X5X3X5X5X5X7X7X7X7X7X8X8X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X9X8X8X8X9X9X8X8X8X",
+"*X$X'.'.$X'.'.'.).).$X_.).).).7.6.5.5.<.<.<.<.,.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,.X.] 2 , ).'.'.).).$X).).).M.).).).V.).).).M.V.).M.).V.B p p + s 9 O d p p 9 c.K.i p q p B B m B j p q t Y./.q p @ 9 I P._ g 9 O c <X1X>X5X>X1Xp d a . >X>X*X>X*X,X'.>X>X=X=X,X>X>X,X>X<X>X,X1X1X3X5X1X5X5X5X5X5X5X5X5X7X7X7X8X9X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X9X9X9X9X9X8X9X8X9X",
+"*X$X$X'.$X).$X$X).).$X).'.).).6.6.6.5.5.<.<.<.<.<.<.<.<.5.<.<.<.<.<.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,.X.{ 2 , ).'.$X).'.).).$X).).).).).).).V.).V.V.).V._.V.B O p 9 9 p 9 q o p d x.! o s 9 L .X>X$X>XS a 8 O _ *X/ X s p i . d p 7 d P.<X<X1X>X3X3Xi 7 s 9 2X.X>X>X>X>X>X>X=X>X=X*X>X>X>X>X,X,X<X3X<X1X1X5X1X3X5X5X5X5X5X7X5X7X7X8X7X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X9X9X9X9X8X9X8X9X9X",
+"*X'.).).).).).).$X).).).'.'.).7.6.5.5.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:.X.{ 2 , $X$X$X'.'.'.$X).'.).).).).).).).).).).).).'.~.B w d i p p p i p O p G.b 9 9 d R .X*X*X2X_ 9 O 9 x |. X) b 9 p O O 9 D I.4X<X,X1X=X5X2Xw d p t  X>X>X>X>X>X>X>X>X>X>X,X<X<X>X<X2X<X,X5X5X5X5X1X5X1X5X5X5X7X5X7X7X7X7X7X9X8X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X8X9X8X9X9X8X",
+"$X'.$X'.$X).$X).).$X).).).'.).6.6.5.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,...{ 2 , )./.'.'.'.'.'.'.).).).).).).V.).).).W.)._.V.%XM.Q.^.$X).).).$X).).'.=X/.#X*X/.*X&XC.=X$X*X-X#X-X>X=X=X,X>X}.P.J.Y. XoX7X4X<X>X>X1X3X4X2X:X2X@X<X-X=X>X>X>X=X>X>X=X,X<X>X>X<X>X>X,X4X1X1X1X4X1X1X5X5X5X5X5X5X5X7X7X7X7X7X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X9X9X9X8X8X9X8X8X8X",
+"'.'.$X'.$X).$X).$X'./.).).).'.6.5.6.5.5.<.<.<.,.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:...} 2 , $X$X'.'.'.).'.'.'.).).).'.).).).).).Q.).$X).).V.=X).$X'./.).$X'.'.'.].*X*X'.].=X'.XX,X].=X=X'.,X,XXX=X>X=X>X:X-X>X>X5X<X<X,X<X,X1X,X'.5X>X>X;X+X=X3X,X>X>X>X>X>X,X,X>X<X>X1X>X,X,X<X<X4X4X<X3X,X4X1X5X5X5X5X7X5X7X5X7X7X7X7X8X8X8X8X9X9X8X9X9X9X9X9X9X8X8X9X8X8X8X8X9X9X8X9X",
+"'.'.'.'.'.'.).'.).'.'.).$X'.).6.6.5.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.5.<.<.<.<.<.,.:...{ 2 > $X*X'.'.$X'.).).'.'.$X).$X).).$X).Q.+X).'.'.]./.`.'.$X$X'.).).$X$X$X=X$X>X'..X*X*X#X$X*X>X.X>X*X=X'..X,X<X>X>X<X1X,X-X*X,X4X>X,X1X,X1X>X3X3X1X1X1X:X,X,X>X,X>X>X,X*X<X<X1X>X1X,X<X<X3X<X<X<X4X4X<X1X5X5X5X5X5X7X;X7X7X7X7X7X8X8X8X8X8X9X9X9X9X8X9X9X8X8X9X8X8X9X9X8X8X8X8X8X",
+"*X$X'.'.'.$X'.'.$X'./.'.'.'.).6.5.6.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:.X.{ 2 > '.$X$X'.'.'.'.'.'.$X).$X'.$X'.).).$X).$X).).).).$X-X)._.'.).).'.'.'.-X*X'.*X.X'.-X+X:X*X'.=X=X'.-X'.*X>X>X-X<X1X1X>X<X<X,X<X>X,X,X1X=X,X3X1X3X,X>X<X,X>X>X,X,X,X,X,X,X<X1X1X3X3X<X3X<X3X<X<X3X1X1X1X5X5X5X5X7X5X7X5X7X7X5X7X7X8X8X8X8X8X8X9X8X9X9X9X9X8X8X8X8X8X8X8X8X8X8X8X",
+"'.$X'.$X'.'.'.'.'.'.*X$X'.'./.6.6.5.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,.X.} 2 , $X*X$X'.'.'.).'.'.'.'.'.).).$X).'.).).$X$X).$X+X+XM.+X+X$X$X+X$X$X+X).*X=X].>X].$X$X:X>X>X3X,X'.,X2X*X>X>X=X>X*X,X5X>X,X>X,X,X>X'.>X<X>X1X=X1X>X-X:X>X>X,X,X>X<X<X<X,X<X=X1X1X1X3X<X<X4X,X<X<X1X1X1X4X3X5X5X5X5X7X7X7X5X5X7X7X7X8X8X8X8X8X8X9X8X9X9X9X8X8X8X8X8X8X8X8X8X7X7X",
+"].*X*X%X*X$X$X*X'.*X$X$X'.'.'.6.5.6.5.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.5.<.<.<.<.<.<.<.<.<.<.<.,.:.X.[ 2 , $X*X'.'.'.'.).'.'.$X].'.'.'.$X'.'.'.'.'./.*X*X$X'..X`.'.'.'.].`.`.'.'.].).+X=X=X'.'.*X=X=X*X1X>X=X,X>X>X*X3X3X3X,X>X>X,X,X>X,X>X>X<X<X>X1X1X<X<X3X1X,X,X<X,X,X,X<X>X<X,X1X1X1X1X<X1X1X1X,X,X<X1X3X<X1X5X5X5X5X7X5X5X5X7X7X7X7X7X7X7X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X",
+"'.'.$X$X$X/./.$X$X$X*X]._.'.'.6.5.5.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.:.X.{ 2 > $X*X'.'.'.'.$X'.'.$X*X$X'.'.'.'.'.'.*X*X=X$X$X*X'.'.$X'.'.$X'.$X$X$X$X$X+X*X/./.1X=X>X*X>X-X#X#X*X,X>X,X<X>X#X>X=X-X>X3X,X,X>X>X,X:X*X<X$X<X,X3X1X3X,X,X,X,X,X1X<X>X>X<X1X1X1X3X3X1X1X<X<X<X1X1X1X1X1X1X1X7X5X7X5X5X7X5X5X7X5X7X7X7X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X7X7X8X",
+"'.$X*X*X'.*X'.*X#X*X'.$X$X=X'.6.5.5.6.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,.X.} 2 , %X%X'.$X$X$X$X*X'.'.'.*X'.$X'.'.=X'.*X*X$X*X*X*X'.'.$X'.*X$X'.'.'.'.$X'.'.=X*X*X'.'.>X*X*X*X>X>X>X1X,X,X>X>X*X,X>X>X>X>X*X>X,X>X>X,X>X>X>X>X,X<X,X<X1X4X4X,X<X2X,X2X2X,X1X3X5X1X4X<X4X<X4X1X1X5X1X1X5X5X5X5X5X5X7X7X7X5X5X7X7X7X7X7X7X7X8X7X8X8X7X8X8X7X8X8X8X8X8X7X8X5X5X7X",
+"'.$X*X/.*X$X#X$X'.*X'.$X'.$X'.6.6.6.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,...{ 2 , $X'.'.$X$X$X$X*X+X*X].$X*X*X].'.'.'.*X*X*X'.=X'.>X'./.'.*X=X'.'.'.$X'.'.$X'.$X*X'.>X=X*X>X>X>X>X>X*X*X>X>X>X>X*X>X>X2X>X<X,X*X>X,X>X>X<X<X<X>X<X4X1X1X3X1X<X3X<X<X<X<X,X1X1X3X1X1X3X,X4X1X1X4X1X5X5X5X5X5X5X5X5X7X5X5X7X7X5X7X7X7X7X7X7X8X7X7X7X8X7X7X8X4X8X8X8X7X8X7X8X7X4X",
+"*X$X$X'.'.].'.'.'.].'.%X$X*X'.6.5.6.5.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,.<.<.,.<.<.<.<.<.<.<.<.:.X.} 1 , '.'.'.).'.'.+X'.*X$X$X*X*X*X*X*X*X*X*X*X*X*X>X'.*X*X*X*X*X*X*X$X'.'.'.'.'.'.$X*X*X*X*X*X:X*X*X>X>X>X.X>X,X*X>X>X'.1X*X,X>X>X>X.X>X>X<X>X<X<X>X,X5X1X1X1X1X1X1X5X1X1X1X5X5X5X5X;X1X1X5X1X1X1X7X;X5X5X5X5X5X7X5X5X5X5X7X7X5X7X7X7X;X8X7X7X7X7X7X7X7X7X7X7X8X7X8X5X8X5X8X5X7X5X",
+"'.$X$X'.$X'.'.'.'.'.'.*X*X$X].7.6.6.6.<.<.<.<.<.<.,.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,.<.<.<.,.5.;...] 1 , '.'.).$X$X'.*X*X*X$X*X*X'.=X*X$X*X$X*X*X*X*X=X>X=X=X*X*X*X*X*X*X'.'.'.'.*X'.*X*X*X*X*X*X'.>X>X>X>X>X*X>X>X/.>X'.>X*X>X>X>X>X>X>X>X,X<X<X<X<X<X<X1X5X5X5X5X1X1X1X5X1X5X1X;X5X5X5X5X1X5X5X5X5X5X5X5X5X5X5X7X5X5X7X7X7X7X5X7X7X7X7X5X7X7X7X7X7X7X5X7X7X5X7X7X7X8X5X7X7X7X5X5X7X",
+"'.'.'.'.$X'.$X'.'.'.'.$X$X'.'.6.6.6.5.<.<.<.<.<.<.<.<.,.<.<.,.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.,.<.<.<.:.X. .' < & '.'.'.'.'.'.*X*X*X'.*X$X>X'.*X*X*X*X*X*X*X*X>X>X*X>X*X*X*X=X*X*X*X'.'.'.$X*X*X$X>X*X*X>X>X>X*X>X*X>X>X>X>X>X>X>X>X*X>X>X>X>X>X>X,X>X,X,X<X<X<X3X1X5X5X5X5X5X5X5X5X5X5X5X3X5X5X3X5X3X5X5X5X5X5X5X5X5X5X5X7X5X7X5X7X5X5X7X7X5X7X5X7X;X8X5X5X7X5X7X7X5X7X5X5X8X5X8X7X7X7X5X7X5X",
+"$X$X'.'.'.'.'.$X'.'.'.$X+X).].<.<.<.<.;.;.#.;.#.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.#.;.;.;.#.;.;.;.;.;.;.X...' , * & $X_.'.$X'.'.$X'.*X$X>X*X'.>X*X*X*X*X:X*X*X>X>X'.>X>X>X*X<X*X*X$X*X'.$X*X*X$X*X*X*X*X*X#X>X'..X>X>X>X'.>X>X*X*X>X*X.X>X>X>X>X>X,X>X,X,X,X3X<X3X<X1X5X3X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X7X7X;X7X5X5X7X7X7X7X7X7X7X5X5X7X5X7X5X5X5X5X4X7X5X7X5X5X5X7X5X5X7X5X5X7X",
+"'.$X$X$X'.).).'.'.).'.'.).'.].2.>.@.X. .} } } } } } } } } } } } { } { } } { } { } { } } } } } } } { ' 1 , & % - $X$X'.'.'.*X$X*X*X*X>X'.=X'.*X=X>X'.>X/.,X,X>X>X>X>X*X>X>X*X*X*X*X$X*X'.$X'.*X*X*X*X*X*X.X*X>X*X#X'.>X>X>X>X>X>X>X>X>X>X>X>X>X>X,X1X,X1X<X3X4X1X5X5X1X1X5X5X5X5X5X5X5X5X5X7X3X5X5X5X5X7X5X7X5X5X7X7X5X7X7X5X7X7X7X7X7X7X7X7X7X7X7X5X5X5X5X5X5X7X7X5X5X5X5X7X7X5X7X4X7X5X7X5X",
+").$X).).).).).).$X).'.$X).).).%.+.| [ 2 < < < < < < < < < < < < < < < < < < < < < < < < < < < < , < , & & & = 4 %X$X'.'.'.'.*X*X*X>X1X*X>X=X>X*X'.'.>X>X,X*X,X>X>X=X>X>X>X*X*X*X*X$X'.$X'.'.*X*X*X*X#X>X>X>X>X>X>X>X'.>X>X>X*X>X>X>X>X*X>X>X,X>X>X1X<X<X3X<X3X1X1X5X5X5X3X5X5X7X5X5X5X5X7X3X3X7X5X5X7X5X7X5X7X5X5X5X5X7X7X7X5X7X7X7X7X7X7X7X7X7X7X7X5X7X5X5X5X5X5X5X7X5X5X5X5X7X4X7X5X7X5X5X",
+").$X$X_.).).).).$X'.).'.$X).'.i.O.3 , * & * & & & & & & % & & & & & & & & & & & & & & & & & & & & & * % = ; 6 k.=X#X'.'.$X*X*X*X*X*X>X*X=X*X,X*X=X,X*X>X>X>X>X*X>X>X>X>X*X>X=X*X=X*X*X*X>X=X*X*X*X=X>X'.>X]..X>X*X,X*X>X>X*X.X>X*X>X>X>X>X>X>X>X>X,X,X<X4X1X1X4X1X1X5X5X5X5X5X5X5X5X7X5X5X7X5X7X7X7X7X7X7X5X7X5X5X7X7X5X;X7X5X7X5X7X7X7X7X7X7X7X7X5X5X5X5X5X5X5X4X4X7X5X5X4X5X5X5X5X7X5X7X5X",
+").).).).).).).'.).$X'.$XQ.)._.v.&.5 & & & & & & & % & & % & & & & % & & & % & % & & & % & % & & & & % = : z k.b.).*X'.$X*X*X*X*X>X'.>X>X,X>X*X>X>X>X>X>X*X>X>X,X>X>X>X>X>X*X>X'.*X*X*X*X'.'.*X*X*X*X>X>X>X*X*X>X>X*X,X>X>X*X>X>X>X>X>X2X>X2X<X<X,X<X,X1X1X3X<X5X5X5X5X5X5X7X5X7X7X5X7X7X7X5X5X7X5X5X7X7X7X5X7X7X7X7X5X7X7X5X7X5X7X7X7X7X5X7X7X7X7X5X7X5X5X<X5X<X5X4X4X4X7X5X5X5X7X4X5X5X5X5X",
+"'.).$X).$X).).).).).).).'.'.C.%X'.~.).'.$X'.$X*X*X'.'.>X*X>X'.*X*X>X*X>X'.>X'.*X*X*X*X>X*X>X>X*X>X*X*X#X/.+X).%X'.*X*X$X=X*X>X*X.X,X>X>X>X>X>X>X>X*X>X>X*X>X*X>X>X>X>X*X>X>X'.>X*X*X*X*X*X*X*X*X=X*X>X>X*X'.>X>X>X>X>X>X>X=X>X<X,X>X>X>X<X<X,X<X,X<X1X1X1X3X4X1X7X7X7X7X5X5X5X5X7X7X7X7X5X7X7X7X7X7X5X7X7X7X7X7X7X5X7X7X5X7X7X7X7X5X7X7X7X7X7X7X7X7X5X5X5X7X<X5X5X5X5X5X5X5X4X5X5X5X7X5X5X5X",
+"$X).).).).).).$X).).$X).Q.).V.C.'.'.).$X).).+X$X+X+X*X$X$X$X/.*X$X*X*X*X-X*X*X*X*X-X-X#X*X=X#X*X*X*X].=X.X.X*X'.).Z.].'.'.*X*X>X>X*X>X>X>X,X*X>X>X>X*X>X>X>X>X>X>X>X>X>X>X*X>X'.*X*X*X'.*X*X*X*X*X>X#X>X>X>X>X>X>X*X>X>X,X,X,X<X,X2X<X<X<X<X,X,X<X,X2X4X3X1X5X5X;X7X3X7X5X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X5X7X5X7X7X7X5X7X5X5X7X7X7X7X7X5X7X7X<X<X7X5X5X5X<X5X5X5X5X5X5X5X5X7X5X5X5X5X5X5X7X",
+").).).).$X).).).).).'.).Q.$X*X'._.).).$X'.'.'.'.'.'.$X'.'.'.=X'.*X>X*X*X>X'.$X*X*X].*X>X.X>X>X>X.X*X<X>X'.$X,X].'.].$X'.'.*X*X*X=X*X>X*X>X>X>X>X*X>X.X>X*X.X>X>X'.*X>X>X>X*X>X.X>X*X*X>X,X*X.X*X>X=X>X*X>X>X>X*X>X>X,X>X,X>X,X<X,X,X<X<X>X2X,X,X,X<X<X<X1X5X5X5X7X7X7X7X7X7X7X5X7X;X8X7X7X7X7X7X7X5X7X7X5X7X7X5X7X5X8X7X7X5X7X5X5X7X5X7X7X5X7X7X7X5X5X7X5X4X5X4X5X5X7X5X5X7X5X5X7X5X7X5X7X5X",
+").$X).).).%X).).).'.V.).$XQ.).Q.).'.'.).)._.'.`._.).'.'.$X].].*X'.=X'.$X'.=X'.*X'.>X'.*X=X>X'.=X=X>X].=X&X$X$X%X'.%X*X'.*X'.>X*X>X>X>X>X>X>X>X>X>X>X>X*X>X>X>X*X>X>X>X>X>X>X>X>X>X,X>X*X.X>X*X>X>X>X>X>X>X>X>X,X,X>X>X>X,X<X,X,X<X<X3X<X<X,X1X4X<X,X<X<X5X5X5X5X7X;X7X7X5X7X7X7X7X9X7X7X7X7X8X7X7X7X7X5X7X5X7X7X7X7X7X7X5X7X5X7X5X7X7X7X7X5X<X5X5X7X5X5X4X4X4X5X7X;X7X7X5X5X5X5X5X7X5X7X5X7X",
+"$X).).).).).).).).).).).).).).$X).).V.).).+XM.Q.).).$X$X$X$X%X+X$X#X*X*X+X*X*X*X'.>X#X*X#X>X>X*X>X=X:X#X#X>X>X@X>X#X'.'.=X=X>X=X>X,X,X,X>X>X*X>X*X>X>X>X>X>X*X>X>X>X>X>X>X>X>X*X>X>X>X].*X>X*X>X>X*X>X>X>X>X>X>X>X>X,X,X,X,X1X4X4X3X5X1X5X4X1X5X4X4X1X5X5X5X5X5X7X7X5X7X7X7X7X7X7X7X7X9X7X8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X5X7X5X7X7X7X7X5X7X<X7X5X4X7X5X7X4X4X7X5X7X5X5X5X5X5X5X5X7X5X7X7X5X",
+").).).).).).).).).).'.).C.).V.).).V.W.).V.).).).).).`.'.'.'.*X].'.'.*X'.*X'.'.*X=X'.>X*X>X=X*X>X,X*X=X>X,X*X*X+X'.'.'.'.*X>X'.>XXX=X>X>X<X>X<X>X,X>X>X>X>X>X>X>X>X>X*X>X>X,X*X>X>X=X*X,X>X>X>X>X>X>X:X>X>X>X>X>X<X<X>X,X<X<X3X5X3X1X5X5X1X5X1X1X1X1X5X1X5X5X5X7X7X7X7X8X7X8X7X8X9X7X7X7X8X7X7X8X7X7X7X7X7X7X7X7X7X7X7X;X5X7X5X7X5X7X7X5X7X7X5X7X7X4X7X7X5X5X5X4X5X7X5X7X7X7X7X7X7X5X7X5X5X5X",
+").).).).).).).).).).).).).).).).).).V.).).M.).).).).).$X$X$X_.'.'.'.'.].*X].=X*X=X>X*X*X*X*X>X>X>X>X>X=X>X=X'.=X=X$X=X*X*X'.>X>X*X,X,X,X,X>X,X>X,X,X>X>X>X>X>X>X>X*X>X*X>X>X>X>X<X,X1X,X>X>X1X*X>X>X>X<X>X>X2X<X,X>X<X,X,X<X5X1X5X5X5X4X4X4X4X4X4X4X1X5X5X5X5X7X;X8X7X7X7X8X8X7X8X8X8X7X7X7X8X8X8X7X7X8X7X7X5X7X7X7X7X7X7X7X5X5X5X7X5X7X5X4X5X5X4X5X5X5X5X5X5X5X7X5X7X5X5X5X7X5X5X7X5X7X7X7X",
+"$X).).).V.).).).V.).).V.).).).).).V.).M.V.).).).).).).).'.).$X'.'.'.'.'.=X'.*X*X*X'.*X>X>X>X>X>X*X,X=X=X=X'.>X=X*X*X*X>X>X>X>X>X1X>X>X>X,X>X>X>X,X>X>X,X*X>X*X>X>X>X>X>X.X>X>X>X<X,X,X*X,X,X>X1X2X<X<X,X<X<X<X,X<X,X2X,X<X4X1X1X5X5X5X5X5X5X5X5X4X4X5X5X7X5X5X7X7X7X7X7X7X8X8X7X8X8X7X8X8X8X7X7X8X8X7X7X7X7X7X7X7X5X7X5X7X5X7X5X5X7X7X;X4X7X5X4X7X4X5X5X5X5X5X5X7X;X7X7X5X7X5X5X7X5X7X7X7X7X",
+").).M.).).).).).).).).).).M.).M.M.).W.M.).Q.).).).).).).).).).$X$X$X'.$X'.'.*X*X*X*X#X*X>X>X>X,X>X*X,X,X].,X,X*X>X*X*X*X>X>X*X>X,X,X>X,X>X1X,X>X,X*X,X*X>X>X>X>X>X*X>X>X>X*X>X,X>X<X<X>X,X,X,X1X1X,X1X1X1X1X1X=X,X<X<X3X4X4X1X5X5X5X5X5X5X7X4X5X4X4X5X7X5X5X7X7X5X7X7X7X7X8X8X8X8X8X8X7X7X8X7X7X8X7X7X7X8X7X7X7X7X7X2X7X7X4X7X4X5X5X7X5X7X4X5X7X4X5X5X5X5X4X4X5X5X5X7X7X5X5X7X5X7X7X7X5X5X7X",
+").).).).M.).).).M.).V.).).).).).).M.).).W.).M.M.).A.).).).).'.'.'.=X'.*X'.'.*X*X*X*X>X*X>X,X*X*X>X,X*X*X>X>X>X*X.X*X,X*X>X>X>X>X*X>X>X>X>X,X,X,X,X,X,X>X>X*X>X*X>X>X>X>X>X,X,X,X,X<X<X<X1X4X4X<X1X1X5X1X1X3X1X1X,X,X1X1X4X1X1X5X5X1X5X7X5X5X5X7X5X5X5X5X5X7X7X7X7X7X7X7X7X7X7X8X8X7X8X8X8X8X8X8X9X8X9X7X7X8X7X7X7X4X7X4X4X7X7X5X4X5X5X5X4X5X4X5X5X5X5X5X5X7X4X7X7X5X5X5X5X7X5X7X7X5X7X7X7X7X",
+").).M.).).).M.).).).).W.M.).M.).M.M.).M.).).).).).V.).).).).'.'.'.'.].*X'.>X*X*X*X*X*X>X>X>X>X>X>X*X>X>X>X,X>X>X>X*X*X>X*X>X>X>X>X>X>X>X>X,X1X>X>X,X>X>X>X>X>X>X>X>X>X>X,X>X,X3X<X<X,X<X1X5X5X1X5X5X1X5X5X1X5X4X<X4X1X1X1X1X5X5X5X5X5X5X5X7X5X5X7X5X5X7X7X5X5X7X7X7X7X7X7X7X8X8X8X8X8X8X9X9X8X8X7X9X7X8X8X7X7X8X7X7X7X7X7X7X4X5X5X5X5X5X7X4X4X5X7X5X5X5X4X7X4X4X5X5X5X8X5X7X5X5X5X7X7X7X7X7X",
+").).).).).).).).M.M.).).M.).).).M.).M.).V.).M.).).).).).).$X$X'.$X'.'.'.'.'.*X*X*X=X*X>X'.>X,X*X>X>X>X>X>X*X>X>X>X>X>X>X>X>X>X>X>X.X>X>X,X>X>X,X>X>X>X*X>X*X>X>X*X>X>X>X>X,X,X>X<X<X<X<X1X5X1X5X5X5X5X5X1X5X1X1X4X3X5X1X1X1X4X1X1X4X7X5X4X7X5X7X5X7X7X5X7X7X7X7X7X7X7X7X7X8X7X8X8X8X8X8X8X8X8X8X9X7X9X8X8X8X8X7X7X7X4X3X7X5X7X5X5X5X7X4X4X5X4X5X4X5X5X5X4X4X4X4X4X4X7X5X7X5X7X7X8X8X5X7X7X7X",
+").).).).).).V.V.).).).Q.M.).W.M.).).).M.).).M.).).).).).).).).$X'.'.'.'.$X*X*X*X*X*X>X*X>X>X*X.X>X>X>X*X>X>X>X>X>X>X>X>X>X*X,X>X>X>X>X,X>X,X>X>X>X>X*X,X,X*X,X,X*X>X>X>X>X>X>X<X3X<X5X1X5X5X1X5X3X5X5X5X5X5X5X3X<X3X5X3X4X1X5X1X5X5X7X4X5X5X5X5X7X5X5X7X5X7X7X7X7X7X7X5X7X7X8X7X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X7X7X7X7X5X7X5X3X7X5X4X5X4X5X4X7X5X5X4X4X4X4X4X4X5X7X5X5X5X8X8X5X7X7X7X7X7X7X",
+"'.).).).'.).).).M.M.).W.).M.).).W.).).M.M.).M.).M.).M.).).).).$X'.).'.'.$X*X*X*X*X=X*X>X*X>X>X>X.X*X>X>X>X*X>X*X>X*X,X>X>X1X>X,X:X>X>X,X>X>X>X>X>X,X,X*X>X,X3X*X>X>X>X>X,X>X>X,X<X3X4X4X4X4X4X4X4X4X5X5X5X5X5X5X5X5X1X5X1X1X4X1X<X5X4X5X7X4X7X5X5X5X7X5X7X5X7X7X7X7X7X7X7X7X7X7X8X8X8X8X8X8X8X8X9X8X8X7X8X8X8X7X7X7X7X7X7X5X7X7X5X5X5X5X7X4X4X4X5X5X5X7X4X4X4X4X4X4X5X5X5X5X5X8X7X7X7X7X7X7X"
+};
diff --git a/images/checkbox1hilitechecked.xpm b/images/checkbox1hilitechecked.xpm
new file mode 100644 (file)
index 0000000..5618f44
--- /dev/null
@@ -0,0 +1,332 @@
+/* XPM */
+static char *checkbox_hilitechecked[] = {
+/* columns rows colors chars-per-pixel */
+"190 70 256 2",
+"   c #0A141B",
+".  c #0B1A1B",
+"X  c #0C1915",
+"o  c #121B1E",
+"O  c #0B1A25",
+"+  c #0C1C2C",
+"@  c #0B1625",
+"#  c #111C27",
+"$  c #0E1F36",
+"%  c #0B221B",
+"&  c #0C2D19",
+"*  c #0A3318",
+"=  c #112816",
+"-  c #143A1B",
+";  c #14253A",
+":  c #133B39",
+">  c #0F242E",
+",  c #142B43",
+"<  c #182B43",
+"1  c #192E4D",
+"2  c #132745",
+"3  c #182E52",
+"4  c #1B314C",
+"5  c #183449",
+"6  c #1B3353",
+"7  c #1C355A",
+"8  c #1B3A5C",
+"9  c #163255",
+"0  c #0F2A45",
+"q  c #1D3C63",
+"w  c #1D3E6A",
+"e  c #1D3C72",
+"r  c #213B5E",
+"t  c #203455",
+"y  c #223C64",
+"u  c #233D6B",
+"i  c #2A3C6B",
+"p  c #2A3B65",
+"a  c #263E72",
+"s  c #0D4A02",
+"d  c #0C4702",
+"f  c #0E4719",
+"g  c #0E5302",
+"h  c #124B0B",
+"j  c #144919",
+"k  c #115F02",
+"l  c #17453C",
+"z  c #104A21",
+"x  c #116302",
+"c  c #126B02",
+"v  c #166608",
+"b  c #157902",
+"n  c #157504",
+"m  c #196B15",
+"M  c #1C6831",
+"N  c #22741D",
+"B  c #276735",
+"V  c #2D7933",
+"C  c #194A44",
+"Z  c #1C4E49",
+"A  c #1D4265",
+"S  c #1C426B",
+"D  c #1B4768",
+"F  c #1B4372",
+"G  c #174977",
+"H  c #24485B",
+"J  c #265857",
+"K  c #224164",
+"L  c #23416A",
+"P  c #2A426C",
+"I  c #27496B",
+"U  c #234371",
+"Y  c #234C7B",
+"T  c #2B4A71",
+"R  c #254776",
+"E  c #295378",
+"W  c #334C74",
+"Q  c #3D587B",
+"!  c #36547A",
+"~  c #32546E",
+"^  c #257344",
+"/  c #2B724B",
+"(  c #3F696C",
+")  c #435B7C",
+"_  c #244E80",
+"`  c #295B8A",
+"'  c #255685",
+"]  c #2A5E92",
+"[  c #385B88",
+"{  c #345D95",
+"}  c #2B6595",
+"|  c #2D729E",
+" . c #326593",
+".. c #336A98",
+"X. c #38749C",
+"o. c #2E6089",
+"O. c #3573A2",
+"+. c #3C73A4",
+"@. c #3B7BAA",
+"#. c #3676A7",
+"$. c #326FA0",
+"%. c #1C5985",
+"&. c #435D83",
+"*. c #4C698A",
+"=. c #4A6486",
+"-. c #526A8B",
+";. c #5A7493",
+":. c #54708D",
+">. c #4177A6",
+",. c #647A97",
+"<. c #6A7996",
+"1. c #178702",
+"2. c #199403",
+"3. c #1A9803",
+"4. c #1D9509",
+"5. c #1CA703",
+"6. c #1EB203",
+"7. c #2F8A37",
+"8. c #21B607",
+"9. c #2BAE1B",
+"0. c #35B72D",
+"q. c #229412",
+"w. c #3C9554",
+"e. c #368E4C",
+"r. c #328D70",
+"t. c #21C403",
+"y. c #22CE03",
+"u. c #27CD09",
+"i. c #24D403",
+"p. c #25DA04",
+"a. c #28DB07",
+"s. c #2ADA0C",
+"d. c #28D50B",
+"f. c #2DDA11",
+"g. c #2DD711",
+"h. c #30DA16",
+"j. c #33DB1B",
+"k. c #39DA25",
+"l. c #3DDA2A",
+"z. c #37D923",
+"x. c #3ED930",
+"c. c #27E304",
+"v. c #28E604",
+"b. c #28E904",
+"n. c #2CE40C",
+"m. c #29F304",
+"M. c #2DF709",
+"N. c #33F411",
+"B. c #3BEA22",
+"V. c #46B73F",
+"C. c #439A47",
+"Z. c #44965C",
+"A. c #469B65",
+"S. c #4E8A72",
+"D. c #43B946",
+"F. c #49AA55",
+"G. c #56B56C",
+"H. c #68BC77",
+"J. c #44D938",
+"K. c #40DB2E",
+"L. c #44F429",
+"P. c #4BD942",
+"I. c #4DD746",
+"U. c #54CA58",
+"Y. c #56D954",
+"T. c #59D95B",
+"R. c #57D355",
+"E. c #4DC44C",
+"W. c #5ED663",
+"Q. c #59EF4B",
+"!. c #63D25C",
+"~. c #68C675",
+"^. c #71C879",
+"/. c #6BD375",
+"(. c #67EA5C",
+"). c #3881AF",
+"_. c #3D84B3",
+"`. c #3A8AB9",
+"'. c #3897AB",
+"]. c #33928C",
+"[. c #3B96CE",
+"{. c #3D9ACE",
+"}. c #369CCD",
+"|. c #3A97D0",
+" X c #3D9AD0",
+".X c #3B9DD7",
+"XX c #3DA1CD",
+"oX c #3BA0D6",
+"OX c #4383B2",
+"+X c #428CBC",
+"@X c #4788B4",
+"#X c #4F8AB2",
+"$X c #71879C",
+"%X c #6D8A99",
+"&X c #6D84A3",
+"*X c #7589A3",
+"=X c #7C93AB",
+"-X c #6D90A6",
+";X c #77B588",
+":X c #7AB595",
+">X c #75A592",
+",X c #7FACA6",
+"<X c #429BCD",
+"1X c #4A9CCC",
+"2X c #4897C7",
+"3X c #439CD2",
+"4X c #459DD8",
+"5X c #489ED3",
+"6X c #4A9ED8",
+"7X c #4496D2",
+"8X c #519CCB",
+"9X c #5599C6",
+"0X c #519DD3",
+"qX c #559ED5",
+"wX c #488EC0",
+"eX c #44A1CD",
+"rX c #4BA1CD",
+"tX c #4AA1C5",
+"yX c #45A1D3",
+"uX c #44A2D8",
+"iX c #4BA1D4",
+"pX c #4CA3D9",
+"aX c #4CA9D4",
+"sX c #4BA9DA",
+"dX c #54A3CD",
+"fX c #52A4D5",
+"gX c #54A5D8",
+"hX c #55A8D6",
+"jX c #55A8D8",
+"kX c #59A4D3",
+"lX c #59A4DA",
+"zX c #5AA9D6",
+"xX c #5CAAD9",
+"cX c #41A0E0",
+"vX c #62ADDB",
+"bX c #6AA8D2",
+"nX c #66B0DC",
+"mX c #6AB2DD",
+"MX c #7AACD2",
+"NX c #6DA4CF",
+"BX c #76C684",
+"VX c #78D08E",
+"CX c #859E9F",
+"ZX c #8494AB",
+"AX c #859AA8",
+"SX c #8D9BB3",
+"DX c #82AB9C",
+"FX c #87B892",
+"GX c #86A2A6",
+"HX c #97A6B8",
+"JX c #8DB4A9",
+"KX c #A1B0BE",
+"LX c #81ADD1",
+"PX c #9AB1C4",
+"IX c #8FAEC9",
+"UX c #82C793",
+/* pixels */
+" X{. X X X X X X X X X3X X3X3X3X X3X|.3X X X3X3X3X3X3X3X3X3X3X3X3X3X3XiX3XuXiX<XiX3XuXiXiXiXiXiXiXiXiXiXiXiXfXfXuXiX9X@XhXfXiXfXfXiX6XiXiXiXiX6XiXiXfXfXfXiXiXhXiXiXfXfX5XfXfXfX1X5XfXfXfXfXfX6XiXfXiXfX1XiXiXpXiXiXfX1XfXfXfXfX5XiXfXfXfXfX5XfXfXfXfXfXfXhXhXhXhXhXhXgXgXlXlXjXxXzXjXjXjXjXxXjXjXxXxXvXvXvXvXvXvXvXmXvXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXLXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmX",
+"{.{. X X X X{.}. X X X X X|.|. X|.3X3X{.<X3X3X3X3X3X3XyXyX3X3X3X3X3XyX3X3XiX3XiXiXiXiXiXiXiXiXiXiXiX6XiX6XiXiX6XyXNX&X).iXfXhXfXpXiXiXiX5XiXiXiXiXfXiXpX6XiXiXiXiXiXfXiXfX5X5XfXfXfXfX5XhXiX1XfX5XfXiXiXiXfXgXiXfXiXiXfXfXiXiXfXfX8XfXiXiXfXfXfX5XfXfXfXfXfXfXfXfXhXfXhXjXkXjXjXjXxXjXxXxXjXxXxXxXxXxXxXxXvXvXvXvXmXvXmXnXmXnXmXnXnXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXLXmXmXmXmX",
+" X X X X{..X{.{.{. X X X3X|.3X X X3X|.3X X X3X3X3X3X3X3X3X3X3X3X3X3X3X3XiXiX3XiXiXiXiXiXiXiXiXiXiXiXiXuXiXiXiXiXMX=X*.+.iXhXiXfX6XfXiXiXiXiXiXiXfXiXiXaXiX6XiXiXiXiXiXiX5XfXiXiXiXfXiXfXiXiXiXiXiXiXiXiXfXiXaXiXiXiXiXdXiXfXfXfXiX8XiXfXfXfXhXiXfXiXfXfXfXfXfXfXhXfXhXhXjXjXzXjXxXjXxXxXxXxXxXxXxXxXxXxXxXxXxXvXvXvXvXnXnXnXmXmXvXmXnXmXmXmXmXmXmXmXmXmXmXmXLXmXLXmXmXmXmXmXmXmXmXmXmXmXmXmX",
+" X X X X{.{.{..X X X X X X X{.{. X X|.3X<X X<X X3X3X3X3X3X3X3X3XiX3X3XiX3XiXrXuXiXiXiXiXiXiXiXiXiXiXiX3XiXiXfXMXSX%XR #.iXhXfXiXiXiXuXrX5XiX3XiXiXiXiXiXiX1XiXiXiXrXiXiXiX5XiXiXiXiXiXiXiXaXiXiXiXiXiXiXiXiXpXiXiXiXiXfXfX1XfXiXfXfX5XfXfXhXiXhXfXdX5XfXfXfXfXfXfXfXhXgXjXgXgXzXjXxXxXxXxXxXjXxXxXxXxXvXvXvXvXnXvXnXnXvXnXnXnXnXmXmXvXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXLXmXmXmXmXmXmXmXmXmX",
+"<X3X X X.X X X X X X X X{. X X X X X X3X[.{.7X7X3X3X3X3X3X3X3XuXiX3XiXiXiXrXiXuXiXiXiXiXiXiXiXiXiXiXiXiXiX1XMXKXZXQ q _.6XfXfXiXiXiXiX5XiX3XiXiXrXiXiXuXiX3XrXuXuXiXiXiXiXiXiXiXiXiXrXaXiXiXiXhXiXiXiXiXiXiXpXiXiXfXiXhXiX1XiX6XfXfXfXiXfXiXiXiXiXiXfX6XfXfXfXfXfXfXgXhXgXzXxXjXxXxXxXxXxXxXxXxXvXxXxXvXxXxXvXvXvXvXnXnXnXnXmXnXmXvXvXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmX",
+" X X3X X X X X X X X X X{. X X X X X3X{.{.<X{.{.3X3X3X3X3X3X3XiXuX3X3XuX3XiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXMXPXHX,.P H +XiXfXiXiXiXiXiXiXiXiX5XiXiXiXiX3XrXiXrXiX3X3XiXiX5XiXiXiX6XfXfXiXiXiXiXhXiXiXiX6XiXiXiXiXiXiXiXiXiXfXhXfXfXiXiXiXaXrXiXiXiXiX6XfX5XfXfXfXfXfXgXhXgXlXjXjXxXxXxXxXxXxXxXxXxXxXvXvXvXvXvXvXnXnXnXnXnXnXnXnXnXnXmXvXmXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmX",
+"3X X3X X X X X X X X X[. X{.3X{. X X3X3X3X[.<X3X<X3X3X<X3X<X3X3X3XrXiXiXuXiXiXiX6XiXfXiXhXiXiXfX6XiXpXiXbXPXHX=XE 8 I 1XfXiXfXiX6XiXiXiX5X3XiXiX5X3XiXiX3XiX3XiX5X5X5X5X5X3X5XiXiXiXiXiXiXiXiXiXiXrXuXiXiXiXiXiXiXfXiXiXiXfXiXiXiXiXiXiXiXiXiXiXiXiXfXfXfXfX5XfXfXfXfXhXjXjXkXjXjXxXxXxXxXxXxXvXxXvXvXvXvXvXvXvXvXnXnXnXnXnXnXnXmXnXmXnXnXnXmXmXmXmXmXmXmXmXmXmXLXmXmXmXmXmXmXmXmXmXmXmXmXmX",
+" X3X X3X3X X3X X3X X<X<X X{.{. X X3X3X<X{.3X3X{. X3X3X3X3X3XiXuX3XiXiXuXfXiXiXaXiXiXiXhXhXdXiXiXhXiXiXbXIXKXAX;.K 8 E 1XpXiXiXiXiXiX6XiXiXiXiX3X3XiX3XiX3X3X3X3X3X3X5XiX3XiX5XiXiXiXiXiXiXiXiXiX3XiXiXiXiXiXiXiXiXiXiXiXiXfXfXsXiX6XfXiXiXiXiXiXiXiX6X5XfX5XfXfXfXfXhXfXhXgXhXlXjXjXxXxXxXxXxXxXxXvXvXvXvXvXvXvXnXnXnXnXnXnXnXnXnXnXvXmXmXmXmXmXmXmXmXmXLXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmX",
+"3X3X3X<X X X3X X3X3X3X3X{.<X X<X X X3X X3X<X X<X3X3X3X3X3XyX3XuX3XuXiX6XiXfXiXiXfXiXgXiXfXiXfXiXiXiXkXIXHXHX*X! 9 6 E 1XfX6XrXiXiXiX6XiX5XiXiX3XiX3X3X3X3X3X3X3X3X X3X3XiX3XiXuXiXiX3XrXiXiX5XiXiXiX5XuXiXiXiXiXiXiXiXpXiXpXiXiXiXiXiXiXiXrXiXiXiXiXiXiXiXfXiXiXfXfXfXiXhXhXhXgXlXxXxXxXxXlXxXxXvXvXvXnXxXvXvXvXvXvXmXmXnXnXnXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnX",
+"3X3X3X3X<X3X<X X X X3X{.[.3X3X[.<X<X3X<X3X X X X3X X3X3X3X3XiXiXiXiXiXfXiXfXgXfXfXaXhXpXfXfXfXfXiXfXMXHXHX=X:.i 3 1 ~ 1XiXiXuX6XiX6X6XiXiXiXiXiX3XiXiX3X<X3X<X3X3X3X3X3X3XiX3X3X5XiXiXiX5XiX6XuX3XiX5X5X6XuX5XiXiXiXiXiXiXhXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXfXhXfXfXfXfX0XhXhXgXjXxXlXxXxXvXxXxXxXxXvXvXvXvXvXvXvXvXmXnXnXnXnXnXmXmXmXmXmXmXmXmXmXLXmXmXmXmXmXLXmXmXmXmXmXmXmXmXmXmXmXmXmXmX",
+"<X3X3X3X3X3X X X{.3X X<X3X{.{.3X X X3X3X X3X<X3X<X3X X3X3X3X<X3XiXiXiXiXhXfXfXgXjXfXhXfXhXfXhXfXiXbXPXHXZX;.[ 7 4 5 I yXiXiXuXrX6XiXiXiXiXiXiXiXiXiX3X3X3X<X3X3X3X3X3X3X3X3XiX5X5X3X5XiXiX3XiXiX5X5X5X5XiXiXiXiXiXiXpXiXiXiXiXiXiXiXiX3XiX5XiXiX1XiXiXiX6XfXiXfXiXhXfXfXhXhXhXhXlXjXxXxXxXxXxXxXjXvXxXxXvXxXvXvXnXvXnXnXnXnXvXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXmXnXmX",
+"yX3X3X3X<X3X3X X<X{.3X X X<X X{.3X3X3X X3X<X3X X3X X3X<X3X3X3XiXiXfXfXfXhXhXjXjXjXjXgXgXgXhXhX6XbXPXHXSX&X*.W 7 4 ; I <XiXiX6XiXiXiXiXiXiXiXiXiX3X3X3X3X X3X3X X3X.X3X3X3X3XyX5X3XiXiXiXiXiX3X5X5X3X5X3X3XiX3XiXiXiXiXfXiXiXfXiXiXiXiXiXiXiXiXuXiXiXiXiXiX6X5XfX6XfXfXhXfXgXfXhXjXjXxXlXxXxXxXxXvXvXjXvXvXvXvXvXvXnXnXnXnXnXmXvXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXmXmXnXnX",
+"3XyX3X3X3X3X X3X X3X<X3X{.3X X3X<X3X3X3X3X X3X3X3X3X3X<X<X3XiX3XfXfXfXhXzXjXjXjXjXjXjXjXjXgXfXfXLXHXSX&X-.! y 7 1 , H `.uX6XiXiXiXiXiXiXiXiX6XiXiXiX3X3X3X X X X3X XyX3X3X3X3X3XiXiXiXiXiXuX5X5X X3X3X3XiXiX3XiXiXiXaXpXfX6XiXiXiXiXiXrX3XiXrXrX3XiX5XpXiXiXiXiXfXfXfXhXfXfXfXhXjXjXjXjXxXxXxXxXxXxXxXxXxXvXvXvXvXvXnXnXmXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXmX",
+"yXyX3XiXyX3X3X3X3X3X X3X3X{.3X3X X3X3X3X3XeX<X3X{.<X X3X3X3XiXiXuXfXfXhXjXjXjXjXjXjXjXjXgXgXfXbXKXSX=X,.) W q q 9 5 5 `.iXiXiXiXiXiXiXfXfX6XiXiX<X3X3X X3X X X X X3X3X3X3XyX3XyXuX5XuXiXiX3XiX5XiX3X3X3XiX3X5XiXpXpXiXiXiXiXiX6XiXiXiXuXiXiXuXiXiXiX5X5XiXiXiXiXiXiX6XiXfXfXfXhXlXjXlXxXjXzXlXxXxXxXxXjXxXvXvXvXnXvXnXnXmXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXLXmXmXmXmXmXmXmXmXmXnXnXmXnXnX",
+"iXiX3X3X3X3XiX3X3X<X7X.X{.<X<X3X3XtX<X3X{.{. X3X3X{.{.{.<X<X<XiXiXhXgXzXjXjXxXzXzXzXjXjXzXkXkXIXHXZX%X=.! K L q 1 < , X.3XaX6XiXiXiXiXfXfX5XiXiX3X3X3X3X X X X<X X X X3X3X3X3XyX3X5X5X5X5X5X5X5X3X3X3X3X X3XiX5XuXrXpXiXiXiXiXfXiXfXiXiXiXiXiX<XiX5XiXuX1XfXiXiXiXfXfXfXfXfXgXgXgXjXjXjXzXjXzXhXlXxXxXxXvXxXvXvXnXnXnXnXmXmXnXnXmXmXmXmXmXmXmXmXmXmXmXLXmXmXmXmXmXmXmXnXnXmXmXmXmXnXmXnXnXnX",
+"3XiX3XuXuX3X3X3X3X X<X<X1X X.X].G.Q.L.N.M.m.M.m.m.m.M.m.m.m.m.m.m.m.m.m.m.M.m.m.m.m.M.M.L.L./.JXAX$X-.! P P q q < 2 ; o.rXiXiXiXiXiXfXiXiXiXiXiX3X3X3X X3X3X X X X3X3X X3X3X3X3XyX3XiX5XiX3X5X5XiX3X3X3X3XiX5XiXiXiXpX6XpX6XpX6X6X6XiXiXiXiXiXiXiXiXiXrXiXiXiXiXfXiX6XfXpXfXfXfXfXgXgXjXgXjXzXlXjXjXjXvXxXvXvXvXvXnXnXnXnXmXmXmXmXmXmXmXmXmXLXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXmXnXmXnXnXnX",
+"5X5XuX3XyX3X3X3X3X3X<XuX<XcXoX~.(.L.N.M.m.m.m.m.m.m.m.m.m.m.m.m.b.m.m.m.m.m.m.m.m.m.b.M.L.(.;XGX=X,.[ W q q q 3 < + > 8 1XfXfXuXfXfXfXiXfXiX5X3X<X3X X3X<X X X{.3X3X3X3X3X3X3X3X3X3XiXiX3X5X3XiX3X3X3X3X5XiX3X5XiXpXiXiX6X6XiXpXiXfXiXiXiXfXiXiXiXiXiXiXiXiXiXiXfX1XfXiXiXhXhXfXhXfXfXhXhXhXgXlXjXjXxXxXhXvXvXvXvXvXvXnXnXmXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXLXmXmXmXLXmXmXmXmXmXmXnXnXnXvXnXnX",
+"5X5X5X5X5X5X3X5X3X5X4X{.3X X5XQ.L.N.M.M.m.m.m.m.m.m.m.m.b.m.b.m.m.m.b.m.m.m.m.b.m.m.m.N.Q.^.DXAX,.-.W L q q 4 < # @ O , `.iXiXhXfXiXiXfX1XiX5X3X3X3X3X X X X3X X{.{. X3X3X3X3X3X3X3XiX3X3X5X5X5XiXiXyXyXyX3X3X5XiX3XiX3X6X6X6X6X6XiXfXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiX6XiXfXiXiXhXfXfXfXfXhXfXhXgXjXjXxXxXxXvXvXvXmXvXvXnXnXnXmXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXnXvXvX",
+"3X3XiX5X5X3XiX5XiX3XoXyX1X7X<XB.n.m.m.m.v.v.v.c.v.v.v.v.b.b.b.b.b.b.b.b.b.b.c.b.b.b.n.x.!.;XDX*X:.[ P i q 9 ; #   @ > I `.gXfXiXiXiXiXiXiXiX3X3X X3X X3X X3X X<X3X3X3X X3X3X3X3X<X3X5X3X3X5X5X5X5X3X3X3X XiX5X5X3X3X5X5XrXiXiXiXiXiX6XiXiXiXfXfXiXpXiXiXiXiXhXuXiXiXiXuXiXiXiXiXfXfXfXfXfXgXhXgXjXzXjXxXvXhXxXvXvXbXvXnXnXnXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXvXvXnX",
+"3XiX3X3X5X5X3XiX5XiXyX<X0X5XuXb.b.m.b.v.c.c.c.c.c.c.c.c.c.p.c.c.p.c.c.c.c.c.c.c.c.n.B.T.H.,XZX,.=.T y 7 7 ;   X $ 0 X.1XyXhXpXfXfXiXiXiX5X5X3X X X<X X X X X X<X[.3X3X X3X3X3X3X3X3X3X5X5X3X5X3X5X3X3X3X3X5X5XiX<XiX5XiX3XiX6XiXpXfXiXiXiXiXiXiXhXrXiXfXiXiXfXiXiXiXiXrXiXiXfXiXiX6XfXfXfXqXhXhXjXjXhXhXxXvXvXvXvXvXvXnXnXnXnXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXnXvXnX",
+"iX5X5X5X5X5X5X3X3X5X5X<X4X<XuXb.b.v.v.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.c.p.p.p.p.p.d.h.P.~.DXCX$X-.! y y 4 2 @ o X 8 OX1XiXaXfXpXiX6XiX5X7X X X X3X{. X X X X X X{. X X3X3X3X3X3X3X3X3X3X<X3X5X3X3X5X3X3X5XiXiX5X3XiX3XiX3X5X5XiXiX6XiXiXiXiXhX1XiXiXfXiXiXfXiXiXiXiX3XuXiXiXiX6XpXiXiXiXfXfXhXfXhXjXjXjXzXxXvXxXvXvXxXnXvXmXvXmXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXvXnXmX",
+"4XiXiX3X5X5X5X3XiX3XiX3X6XiX{.v.v.v.v.p.p.p.p.p.p.p.p.p.p.i.f.f.s.p.p.i.p.i.p.p.d.k.W.;XCXZX<.&.P y 7 ; +   X - #XfXaXhXgXgXfXfXiXiX3X3X3X3X X3X3X|.{. X X X X<X<X3X X X3X3X3X<X X3X5X7X3X5XiXiX5X5XyX3X3X3X3X5X<XrXiX3X5X5XiX6XpXiXiXfXdXfXfXfXfXfXhX6XfXiXiXiXiXiXiXiXuXrXiXiXdXiXfXfXfXfXhXhXgXjXjXzXxXxXvXxXvXvXvXnXvXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXmXnXmXmXmXmXmXnXnXnXvXvXaX",
+"5X5X3XiX5XuX3X5X3XiXrX X3XiX3Xv.v.v.c.c.p.p.p.p.p.p.p.a.f.j.x.x.z.s.p.p.p.p.p.p.h.P.~.,XZX$X-.W y 7 2 # o % - B 9XfXgXjXgXgXfXfXiXiX3X3X3X|. X3X X X X X{.<X X X}.3XyX{.<XyX{.XX3X0X3XiX7XyX3X3X3X<X<XeX<XiX5X<XiXiX<XrX5X6XiX6XfX1XqX6XiXaXrXuX6XfXaXfXfXsX6XsXeXiXiX<XrXyXiXpX5XfXpXfXfX6XhXhXhXhXjXxXxXvXxXvXxXxXvXnXvXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXvXvXvX",
+"6X5X5XuX5XiXiXiXiXiXiX3X3XiX5Xc.v.c.c.p.p.p.p.p.p.p.a.s.l.Y.G.F.Y.z.s.p.p.p.c.f.x.W.;X,X=X;.) y 7 , $ . = j V m hXhXgXjXjXfXfXiXiX<X3X3X|.3X|.|. X3X{.{.{.3X7X3X7X4X X3XiX X.XuX.X3X X7X7X5X7X5X5XiX5X5X5X5X5X5X X3XuX3X5XiXiX7X5XiXpXpXiX6XhXlXqXfXqXjX8XkXiX6XqXpX<XfX5XpXpX3XiXrXpXiXfXfXiXkXjXjXjXjXhXvXxXvXxXbXvXvXvXmXvXvXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXmXmXmXmXmXmXnXnXvXvXvXvX",
+"5X5X5X3XiX5X5XiX3XiXiX3X3XiX5Xv.v.v.v.p.p.p.a.i.p.a.a.K.R.^.>X( BXJ.f.p.p.p.s.z.T.BX>XZX&X*.T 8 < ;   & f e.q.v hXgXhXgXgXfXiXrX3X3X3X{.{.{.{. X|.{.}. X3X X X7X5X7X{.3XiX3X3X3X{.XXXXuX3XyX4X6XiX4XuX3XuX7X4X5X3X3X3X3XsX5X5XgX3XpXpXiXlX0XfXfXiXiXhXuXfXuXhXuX6XsXsXiX5X0XiXpX6XfXiXiXiX0XfXhXhXgXhXzXzXxXxXxXvXxXnXvXnXnXvXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXnXnXnXnXnXvXvXvXvX",
+"6X6XiXiXiXuXiXiXiXiXiXyXuX3X3Xv.v.v.c.p.p.a.a.a.a.s.k.!.BXDX>X( w.P.h.c.p.p.f.J./.GXAXZX,.! q 3 ;   % f C.q.m v gXhXhXfXgXfXiXiX3X3X[. X}.|.|.|.|.|.{.7X7X|..X X<X<XyX3X7X7X5X XyXyX<X5X3X XuX<XrX<X1X1X5XpX3X X5X5XsXyXrX2X+X`.`.1XrXaXaXuXiXiXhXtXdXfXsXaXfXdX0X0X8XfXpXqX5XiXhXfXiXiXiX5XfXhXhXjXlXgXjXzXxXxXxXvXvXvXvXnXmXvXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXmXmXnXnXvXnXvXvXnXvXnXvXvX",
+"6XiXiX3XiX3XuXiXuXrXiX3X3XiX5Xv.v.v.c.p.p.a.d.d.h.K.!.^.JXSX:.H ^ Y.j.a.p.a.j.Y.VXAXZX*X-.P 7 2 O . * C.V.q.b x gXfXfXhXhXfXiXiX7X3X X[.|.|.|.|.|. X.X}.{.{.2X] a F S S U a u L L y 3XyXyX3X2XG F R u R ` fX3XyX6X5X8XOXE F i u u L { @XrXhX} a L L ` 0XpXlXfX` U S F O.1XrXyXfX3XiXiXiXiXhXfXiXhXhXhXlXjXzXzXxXxXvXvXvXvXvXvXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXvXvXnXvXvXvXvXnXvX",
+"iXiXiXrXiXiXiXiXrX3XiX3X3XiX7Xv.v.c.c.a.a.a.g.K.J.!.UXJXGX$X) H Z D.l.s.p.s.x.W.:XAXZX,.W r , + . * V R.9.4.b x hXhXfXgXiXiXiXiX X{. X|.|.|.|.|.{. X X{.{. X2X` A K K L A L F u L L 5X7XuXrX@XD y L K p Y rXeXyX0X5X_.G A U u F I P K G 9XiX9XY L P S @XgXlXOXD y K Y #XrXaXaX5XfX3X1XfXiXiXfXhXfXhXhXfXjXjXzXxXxXxXvXvXvXnXvXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXnXnXvXvXnXvXvXvXvX",
+"iX6X3XiXiXiXiXiX3XrXrX X3X5X5Xv.v.c.c.s.j.K.J.!.^.FXJXAX$X-.T r C 7.P.h.n.h.P.BX,XAX$X=.K 4 ;   = M U.l.9.2.b x jXjXfXfXiXiXiX3X X3X{.|.|.|.|.|.{.{.|. X7X}.<X` A q p i q F U L L L <XuXuXrX..D K L D w F @.yXuXiXuXE u P S >.>.Y L P S $.0X1XOXF P L G 8X8XY q D L OXgXaX3XfXqXpXuXiXiXiXiXiXiXfXhXhXhXjXjXjXzXxXxXxXvXvXvXvXmXnXnXmXmXmXnXmXmXmXmXmXmXmXmXmXmXnXmXmXnXnXnXvXnXnXvXvXvXvXvX",
+"iXuXrXiX3XuXuXrXiXiXiXyXiX7X1Xv.v.c.n.j.J.U.H.H.DXDX%X<.-.! y r 8 M E.l.f.k.W.BX,X$X,.W 9 0 @ X j D.K.g.8.2.b x fXfXfXiXiXiX3X3X X{.{.{.|.|.|. X{. X X{.3X.X2X` a L G _.<X<X X5X3X XyX3X6X0X_ u i ' A P a ..5XhX1XaXU P p F <XpX+X` ! X.@.fXjXiX .L i S @.X.L P U { qXpXsXpXqXfX3XaXiXiX6XiXiXhXfXfXfXhXjXzXzXzXxXxXvXvXvXvXvXvXmXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXmXnXnXnXnXnXvXnXnXvXnXvXvX",
+"6XiXiXiXiXiXiXiXiXiXuX3X5X3X3Xv.v.v.n.K.U.A.S.<.,.:.*.[ T I q r 9 Z w.J.j.J.BXGXZX*X=.p ; O . * F.J.h.y.8.2.b x fXfXiXiXiXiX3X3X{. X{.{.|..X{.|.{.|. X X[.4X}.` L L F  .X.+.| | O.OX3X3XuX@Xq P L O.o.P y U 2XqX5XiXE A P u _ ..#.9XiX6XiXpXhXrX2XY a K F i K F Y 8X6XfXfXiXiXiXiXiXiXiX6XfXiXfXfXfXhXgXjXjXjXjXxXxXjXvXvXvXvXvXnXmXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXnXvXnXvXvXnXvX",
+"iXiX<XiXiXuXrXrX3XiXiXuX3X3X3Xv.v.v.n.J.U.w./ J K H y i A K L r 8 H ^ Y.x.T.VXGXZX,.W 3 $ . = V R.K.s.y.6.2.b x iXrXiXiXiX<X3X X X{.{.[.{.|. X X X X|.{.[. X X` i L y D q L K A D X.7XyX3X| U U w +X@.w L S @.iXpXpXO.F L i L S S S ` >.kXiXfXiXzXOXa K w P K S OXhXfXfXfXfXiX6XiXiXiXiXfXpXfXfXiXqXgXgXlXzXjXxXjXxXxXxXvXvXxXnXnXnXmXnXmXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXnXnXvXnXnXnXnX",
+"iXiXiXiXuX5X5XiXuX5XiX3X5X3X3Xb.b.c.v.j.l.J.D.M Z 5 9 7 r y q u y K J G.(.VX,XSX-X*.q ; @ % z R.K.f.a.i.6.2.b c 3XiXiX3X3X3X X X X{.[. X X X X X X X X<X[.7X{.` i L i L u w u u e #.5XuX3X_ L a F 3X2XG F A { iXfXiXlX+.F L L K K K w R >.xXiXgXpXgX .A a u K  .zXfXfXfXfXiXfX6XiXiXfX6XfXfX5XfXfXfXfXlXhXhXkXzXxXxXjXxXvXvXvXvXnXmXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXmXmXnXnXnXnXnXnXnXnXnX",
+"iXiXiXiXiXiX5X5X5X5X X5X3X X Xb.b.c.c.a.f.f.f.J.7.: 5 5 6 r w w q K ~ A.VXUXJX=X;.~ 3 O . * G.I.f.p.p.i.6.2.b x iX3XiX3X3X3X3X<X X X3X|. X X X3X X X X X}. X{.` L L F  .O.| O.+.$.`.5XyXwXU y i R O.O.Y I y T 2X6XfXiX6XiX@...Y R p L y F iXhXgXfXpX9XL U u L 9XaXfXfXfXfXfXfX6XfXiXfXfXfX6XfXfXfXhXhXgXhXlXzXjXxXlXxXxXxXvXvXvXvXvXnXnXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXnXnXnXnXnXnX",
+"iXiXiX3XiX3XiX3X5X3X3X X3X3X3Xv.c.c.c.c.p.p.p.f.I./ : ; 4 7 y w A T ~ :.JX,XZX<.) 8 2 . - V Y.j.a.p.p.y.6.2.n x 3X3X3X3X3X3X3X X<X[. X3X3X X X3X7X X X X X7X{.' L L F OXyX X5X5X5X3XiXyX..w A H P S L A i L w @.iX2X@X@.#.+XqXzXOXY q i U `.aXhXfXhXhXK u u A zXyXaXfXfXfXfXfXfXsXgXfXiXfXfXfXfXhXhXfXkXjXjXjXjXxXxXxXxXvXvXvXvXvXnXnXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXmXnXmXnXmXmXmXnXnX",
+"iX5XiXiX5XiX3XiX5X3X3X5X5X3X3Xv.b.c.c.p.p.p.p.s.j.T.e.: 2 3 3 y L I ) =.-X$X<.=.K 5 + X z U.K.s.p.p.p.y.6.2.n k 3XiX3X3X3X3X3X X3X3X[.3X X<X3X X X X3X X X X{.` u L G @.7X6X6X3X1X<X5XiXE u D A P L L A i L L ' rX_.K i i ` uXaXdX' L i R +XaXhXhXiXhXL S L S fXhX6XfXfXfXiXfXfXfXiXfXfXfXfXfXfXfXfXkXgXjXjXjXxXlXxXxXxXxXvXxXvXvXvXvXnXmXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXmXmXmXnXnXnXnXnXnX",
+"3XiXiX3XiX3XiX3XiX3X3X3X3X3X3Xb.b.c.c.p.p.p.p.p.s.j.T.Z.C , t t q I ! &.-.:.=.T 1 $ . * F.I.h.a.p.p.p.y.6.2.b x iX3X3X3X3X3X5X X3X3X X3X3X3X X3X X X X3X X4X[.` L L p T U u U L P S `.+XL L D U ` o.` ` T L D F #XiXD L i L ..@X>.L S u Y hXjXhXxXfXgXL F y A fXgX5XfXfXfXpXfXfXpXfXfXfXfXfXhXfXfXjXgXjXxXjXxXjXlXjXxXxXvXxXxXxXvXvXnXmXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXmXmXmXmXnXnXmXnX",
+"5XiXiXuX3X3XyXyX X3X3X5X5X X3Xb.b.c.c.p.p.p.p.p.i.s.k.T.Z.l : t 8 K T ! Q Q K 8 2 # = B T.k.s.p.p.p.p.y.6.2.b x 3XiXiX3X3XiX3X X3X<X3X X X X3X X X3X3X<X X7X X` i A S S F A A K P F _.O.y P w  .5X6X3XkX` L D i >.iX>.F L K I w U L D U #XhXgXlXfXlXlXA A P u lXfXfXfXfXfXfXfXpXiXpXfXfXgXfXfXfXgXgXzXzXlXjXjXxXxXxXxXvXxXvXxXvXvXvXvXvXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXmXmXmXmXnXnXnXmX",
+"iXiX3X3X3X3X3X3X3XiX3X3X3X3X5Xv.b.c.c.p.p.p.p.p.a.a.s.l.T.w.l 5 6 8 L T R L 7 < + % j U.K.f.a.p.p.p.p.y.6.2.b x 3X3XuX3XiX3XiX5X3X5X X3X3X3X3X3X X3X5X X3X5X2X} F L A u I y L L L L OXY S L L >.fXiXiXkX>.S u S %.dXqX@.Y S K L i i } wXhXhXhXjXgXjXkXG U L F 9XhXiXfXfXfX6XfXfXfXiXhXfXhXfXhXhXgXjXxXxXxXjXxXjXxXxXlXxXxXxXxXvXvXvXmXvXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXmXmXmXnXnX",
+"3X5X3X3X3XiX3X3X3X3XiX3X3X5X3Xv.c.b.c.p.p.p.p.p.p.p.a.f.l.T.e.l 5 r 8 y L 7 6 + O * C.J.h.a.p.p.p.p.p.y.6.2.b x 3XrXiXiX3XiXiX5X5X5X3X3X3X3X3X3X3X3X<X5XyX XyX{.<X<XyX3X3X3X3X3X3X3XfX5X1XrXrXaXuXuXpX3XaXrXaXiX1XhX6XfXhX8X@X@X+XkX8XzXzXhXaXgXlXlXhXkXdXbXtXhXaXpXfXfXfXfXfXfXgXgXfXhXfXhXfXhXhXlXjXjXjXzXjXxXjXxXxXxXxXvXvXxXvXvXvXnXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXnXnXnXnX",
+"iX4X3XyX3X3X3X3X3XyXiX X3X3X5Xb.b.c.c.p.p.p.p.p.p.p.p.a.s.l.T.^ C 5 r q 7 6 ; O * M Y.k.a.p.p.p.p.p.p.i.6.2.b k 3X5X5X5X5X3X5X5X5X3X3X3X3XyX3X3X3X3X<X3XyX3X7X3XpX XiX3X1XiX3XiXiXiX6XpX6XiXiX6X6XgXgX6XpXfXiXqXfXfXpXqX6XiXhXiXsXjXzXhXfXzXjXjXjXlXpXxXpXgXsXeXfXlXfXfXfXfXfXfXfXfXhXfXhXgXfXlXhXgXhXhXhXzXzXhXzXjXzXxXxXxXvXvXvXvXvXvXvXvXnXvXnXnXnXmXmXmXmXnXmXmXmXmXnXmXnXnXnXmXnXnXnXnX",
+"iXiX3X5XiX3XiX5X3XiXiX3XiX3X5Xv.c.c.c.p.p.p.p.p.p.p.p.p.a.f.K.U.^ 5 1 7 6 < # . f V.l.f.a.p.p.p.p.p.i.i.6.2.b k 3X5XuXiX5X5X3X3X5X5XiX3X3X3X3X3X3X3XyX<X5XiX5X5X5X5XuXyX3X3X3X3X3XiXiXiXiXiX6X6XiX1XrX6XfXfX6XfXpXuX6XqXhXfXhXhXjXfXhXfXgXgXhXgXjXfXjXqXlXlXjXjXhXdXgXfXgXfXfXfXjXjXfXfXgXgXgXgXlXhXzXzXhXhXgXzXjXzXxXxXxXxXxXvXsXvXvXvXvXvXvXnXnXnXnXmXmXmXmXmXmXmXnXmXmXnXnXmXnXmXmXnXnXnX",
+"5X5XiX5XiX3XiX3XiX3XiX3X5X7X<Xv.c.c.v.p.p.p.p.p.p.p.p.p.a.a.h.P.~.C 5 6 , ; . & N P.f.a.p.p.p.p.p.p.i.i.6.2.n k iXiXuX5X5X5X5X5X5X5X3X X3X3XyX3X3X3X3X XyX3X5X3XiXeX3X3XuX3X3X3X3XuXaX3XiX5X5X5XrXeXiXaXuXiXiXiXaXrXhXiXaXaXhXhXgXfXsXjXjXhXgXgXjXjXaXfXlXgXlXpXaXhXgXfXfXgXgXgXfXjXfXhXhXhXjXgXgXzXgXzXjXgXgXzXjXzXjXxXxXxXxXvXvXvXxXxXvXxXnXnXnXnXnXnXnXnXnXmXmXmXnXnXnXnXnXnXnXnXnXnXnXnX",
+"iX3XiXiX3XiX3XiXiX5X5X3XiX5X5Xv.c.v.v.p.p.p.p.p.p.p.p.p.p.c.a.k.R.G.l , ; # . f E.l.s.i.p.p.p.p.p.p.i.i.6.2.n k yX3XiXiX3X3X3X5XiX3XiX5X3XiX3XiX3XiX3X5XyX X3XeX{.eXyXrX3XyXyXrX3X3X5XpX5XpXgX0XrXiX5XdXqXlXgX6XqXfXfXhXgXfXiXfXlXjXfXgXfXfXjXfXiXiXhXfXfXgXjXgXfXfXfXfXgXgXfXhXgXfXhXfXhXgXjXjXgXgXjXgXgXjXgXjXjXjXlXxXxXjXvXxXvXvXvXvXvXvXvXnXnXnXnXnXnXmXmXnXmXmXnXnXbXnXnXnXnXnXnXnXnXvX",
+"uX6X3XiXiX3X3XiXrXiXiXuX3X5X5Xv.c.v.c.p.p.p.p.p.p.p.p.p.p.p.p.s.k.T.w.: > . & 7.P.h.a.p.p.i.p.p.p.p.i.i.6.2.b x yXiXiXiX3XiX3X5XuXiX3X5XpXiX5X3X5X3XiX3X5XiX5X5X1X0X5X5X5X5X0X5X5X5X5XiX3X3XaXsXpXpXsXiX6XiXgXfXpXsXfXfXfXgXlXlXlXfXhXgXgXfXqXfXiXkXhXfXjXzXfXzXjXlXfXfXgXhXhXhXjXfXhXhXjXjXjXlXzXzXjXjXhXhXjXjXjXgXxXjXxXxXxXvXxXvXxXvXxXvXvXxXvXvXnXvXnXnXnXnXnXvXnXnXnXnXnXnXnXnXnXvXvXvX",
+"5XiXiXiXrX<XrXuX3XiX5X3XiX5X5Xv.v.c.c.p.p.p.p.p.p.p.p.p.p.p.p.p.g.x.W.^ > . j U.l.a.p.p.p.c.p.p.p.p.i.i.6.2.b k uXiXiX3XiX3XiXiX5X3XiXiXiX3X3XiX5XiX5XiXiXiX3XuX6X5X5X3XiX3X3XiXuX3X3XrXeXrXiX1XpXpXfXiXfXfXrXdXfXgXaXgXhXfXiXiXiXaXfXlXgXfXiXfXhXhXuXhXrXsXgXjXlXlXjXjXhXhXgXhXjXhXfXhXjXjXjXgXgXgXjXjXjXgXjXjXjXjXjXjXxXxXxXxXxXxXxXxXxXvXvXvXvXvXnXnXnXnXnXnXnXnXnXnXnXnXnXnXnXnXxXnXvXvX",
+"pXyX3XiXiXiXrXiXiXiXiX3XiXuX5Xv.c.v.c.c.p.p.p.p.p.p.p.p.p.p.p.p.a.h.I.H.z * 7.J.h.a.p.c.a.p.p.p.p.p.i.y.6.2.b c yX3X3X3XuXiX3XrXiXiXiX4X6XiXiXiXiXiXiXiXiXiXiXiXiX5X3X5X5X5XiX5X5X3X5XiXiXiXiXiX6XiXiXrXiXhXiXhXfXqXfXfXfXfXfXfXfXfXfXfXgXfXfXfXhXhXfXhXfXhXhXfXhXhXzXgXgXlXhXlXfXhXhXgXlXlXjXjXzXlXjXjXhXjXzXjXjXxXxXxXxXxXxXxXvXvXvXxXxXvXxXvXvXxXvXnXnXvXnXvXnXvXvXvXnXnXnXnXnXnXvXvXvXvX",
+"3XrX3XiXiXiX3XiX3XiXiX3XiXiX5Xv.v.v.c.p.p.p.p.p.p.p.p.p.p.p.p.p.p.a.z.R.C.m E.l.a.p.p.p.p.p.i.c.p.p.i.y.6.2.b x 3XiXiXuX3XyXrX3XiX3XiXiX3X5X5XuX3XiXiXiXiXiXiXiXiXiXiX5XiXiXuX5X5X5X5X3XiX3XiXiX6XiXiXfXiXiXhXiXfXfXfXpXfXiXfXfXfXfXgXfXfXfXfXfXfXfXfXfXhXhXfXjXjXjXjXzXlXhXgXlXkXhXlXgXxXjXjXjXjXgXzXjXzXzXjXzXxXjXxXxXxXxXxXvXvXxXxXvXvXxXvXvXvXvXvXvXnXnXnXvXnXvXvXvXvXnXnXnXnXnXvXvXvXxX",
+"uXiX5X3XiXiX3XiXiX3XiX5X3XiX5Xc.c.v.v.p.p.i.p.p.p.p.p.p.p.i.p.p.p.i.f.l.I.0.J.f.i.p.p.p.p.i.p.p.p.i.p.y.6.3.n k 5X5X5XyXyX5XiXiXiXiX3XrXiX3XrXiXiXiXiXiXiXiXiXfXiXiXiXiXiXiXiXiXiXiX3XiXiXiXiX6XiXiXiXiX8XfXfXfXfXfXfXfXfXfXfXhX0XfXfXfXfX0XqXfXfXfXgXhXhXhXfXjXjXjXxXjXjXxXjXjXjXjXjXjXlXxXxXvXxXjXzXzXxXjXxXjXvXsXxXxXvXvXxXxXxXxXvXxXvXvXvXvXsXnXvXvXvXvXvXvXvXvXvXvXvXnXnXvXvXvXvXxXvXxX",
+"iX3XiXiXiX4X5XiX5XiX5XuX3XiX5Xv.v.v.v.p.i.c.p.p.p.p.p.p.p.p.p.p.p.p.a.s.j.k.j.s.p.p.p.p.p.p.p.p.p.p.p.y.6.1.n k 5X5X5X3X5X5X3XiX3XiXiXuXiXiXuX6XiXiXiXiXiXiXiXiXfX6XiXiXiXiXiX6XiX3X5X5X3XiX3XuXiXiXiXiXiXfX5XfXfXfX5XfXfXiXfXiXfX6XfXfXfXfXfXfXfXfXfXjXhXgXjXgXxXjXjXxXxXjXxXlXxXjXjXxXxXjXxXsXzXjXjXxXxXxXxXjXvXxXxXvXsXxXxXvXvXvXvXvXvXnXvXvXvXvXxXvXvXvXxXvXvXxXvXvXvXvXvXvXvXvXvXvXxXvX",
+"iX3XiX3XiX3X5X4X3XiXiXpXuXiXiXv.v.v.v.i.i.i.i.p.p.p.p.i.p.p.p.i.i.p.p.i.s.s.s.i.p.p.p.i.i.p.p.p.p.i.i.6.5.1.c s iX5X5X5X5XiXiXiXrXiXiXiXiXiXiXiXiXiXiXiXfXpXfXfXfXfXfXfXiXiXiXiX3X5X3XiX3XiXiXiXiXiX1XiXfXiX5XfXfXfXdXiXiXfXfXiX5XfXfXfXfXfXfXfXfXfXfXgXhXhXlXzXxXxXxXxXxXxXjXxXxXxXxXxXjXxXxXxXjXxXxXjXxXxXxXxXsXvXxXxXnXvXvXxXvXvXxXvXvXsXvXxXxXxXvXvXxXvXvXxXvXvXvXxXxXxXvXvXvXxXxXxXvXxX",
+"5X X3XiX5X3X5X5XiX3X5XyXiX3X6Xp.c.i.i.y.y.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.6.5.1.x g s 3X3X5X5X3XuX3XiXiXiXiXiXfXpXiXiXiXiXdXiX6XfXiXfXhXiXiXiXhXiXiXuXiXiX5XiXiXiX3XiXfXiXfXiXiXfXfXfXfXiXfXfX5XfXiXfXfXfXfXfXfXfXfXfXgXjXjXjXjXlXjXjXlXxXlXxXxXxXxXxXxXxXxXxXjXvXjXlXxXxXxXxXxXxXxXxXxXvXxXxXvXxXxXvXvXvXvXvXvXvXvXvXvXxXxXxXvXxXxXxXxXxXxXxXxXvXxXxXxXvXxXvXxXxX",
+"iX3XiX3X3X3X3X5XiX3XiX3X X4X4Xg.u.8.6.5.3.3.3.3.3.3.3.3.3.3.3.3.3.2.2.2.2.2.2.3.3.3.3.2.3.3.3.3.3.2.1.n k d d h 3XyXiX5X3XiXiXiXiXiXiXiXiXhXpXiXiXiXfXiXiXfXfXfXfXfX6XiXhXiXiXiXiXiX5X3XiXiXiXrXiXiXfXiXdX5XfXiX5XfXfXiX6XfXfXfXfXfXfXfXfXfXfXhXgXgXgXjXgXgXzXjXjXxXjXjXvXlXxXxXvXvXxXxXxXvXxXxXxXxXxXvXsXvXvXxXxXxXvXxXxXvXxXxXxXvXvXvXvXvXvXvXvXvXvXxXxXxXxXxXvXzXvXvXxXxXxXvXxXvXvXzXvXxX",
+"3X3X3X3X3X3X3X3X3X3X6X3X3X7X7Xx.9.4.1.b c c c c c c c c c c c c c c c c c c c c c c c c c c c c x c x s s d j B yX3XuXiXiXiXiXiXiX6XfX6XpXiXiXpXfX5XfXfXhXhXfXfXhX0XiXhXiXiXiXiXiXiXiX3XuXiXiXiXiXiXiXaXfX5XfXfX0XfXfXfXfXfXfXfXfXfXfXfX0X5XfXhXfXgXjXjXzXgXgXzXvXsXxXxXlXxXxXvXxXxXxXxXxXvXxXxXvXvXvXxXvXvXxXvXvXxXxXvXvXxXvXvXvXvXvXvXvXvXvXvXxXvXxXxXxXxXxXxXxXzXxXxXvXxXvXxXxXxXxXvXvXxX",
+"3XyX3XyX3X3X3X3X3XiX X3X6X3X7XA.7.N v g s g s s s s s s d s s s s s s s s s s s s s s s s s s s s s s s h j M r.iXdXuX3XiXiXiXiXiX6XfXfXfXiXfXfXfX6XfXiXfXfXfXfXiXhXfXfXhXiXiXiXiXiXiXiX6XiXiXiXfXiXiXiXiXfXfX6X6XfXfX6XfXiXfXiX5XfXfXhXhXfXdXfXhXhXgXjXjXjXzXlXxXxXxXxXxXxXxXxXxXlXxXxXvXxXvXxXvXvXvXxXvXxXvXvXvXxXvXxXxXvXxXxXxXvXvXvXvXvXvXxXvXxXxXxXxXxXxXsXxXxXxXxXzXzXvXzXxXnXvXxXxXvX",
+"3X3XpX3X3X3X3X3X3X3XiXiX1X3XiX'.r.N d s s s s s s d s s d s s s d s s s s s s s s s s d s s s s s s h h z / ].}.yXuX6XpXrX3XiXiXfXfXiXhXfXfXfXiXhXiXfXiXfXfXfX6XiXfXfXfXfXfXhXiXiXiXiXiX6XiXiXiXiXiXfXhXiXfXfXfXhXfXfXfXfXfXfXfX0XhXiXhXhXhXhXfXhXfXgXjXjXzXjXzXxXxXxXxXxXxXxXvXvXvXxXvXxXvXxXvXxXxXvXvXvXvXxXxXvXvXvXvXvXxXvXvXvXvXvXvXvXvXvXvXvXvXxXxXxXxXxXvXzXxXxXvXxXxXxXxXvXaXzXvXxXxX",
+"uX3X3X3X3XyX3XyX3X3X3X3XiX3X.XuXrX9X X3X3XuXiXiXiXuXiXiX6XiXiXiXiXiXiXiXiXiXfX6XiXpX6XiXiXhXfXiXfXiX6XdXrX<X3X3X3XrXuXiXrXuXfXfX6XfXfXfXfXgXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX5XiXiXiXiXiX5XiXiXiXiX6XiXiXfXfXiXhXhXpXfXfXfXfXfXfXfXfXfXfXhXhXfXhXhXgXhXgXjXjXjXjXzXvXxXvXxXvXxXxXxXvXvXvXvXvXxXvXvXvXvXvXvXxXxXvXvXnXvXvXvXxXxXxXvXvXvXvXvXvXxXxXvXxXvXvXxXxXxXxXxXxXxXxXxXxXxXzXzXxXxXvXxXvXxX",
+"iX3X3X3X3X3X3X3X3X3X3X3XrX3X.X.X XiXyX3X3X3X<XrXyX<XyXrX3XiXrXrXyXaXaXiXiXiXrXrXrXaXaXfXiXiX1XiXiXrXiXpXfX0XfX5XuXeXiX3XiXiX6XiXfXfX6XfXfXfXfXfXfXiX0X5XfXiXfXfXfXfXfXfXfXfXiX6XiXiXiXfXiXiXiXiXfXiXiXfX5X0XfXfXfXfXfXfXjXfXfXhXhXhXhXgXhXgXhXjXhXhXgXzXzXzXjXxXvXsXxXvXxXvXvXvXvXvXvXvXvXvXvXvXvXvXxXvXvXvXxXxXsXvXvXvXvXxXxXvXxXxXvXvXvXvXvXvXxXxXxXxXxXxXxXhXxXxXxXxXxXxXvXzXxXxXxXxXxXxX",
+"3XyX3X3X3XyXyX3X3X3X5X3X<X3X3XuX4X5X3XiX5X5X5XiX5X3XiXiX5X5XiXiXfXiXiXiXfXiX1XfXiXfXfXfXfXfXfXfXqXpXgXiX3XuXgX0X6X6X3XiX1XiX6X6XfX6XpXfXfXfXfXfXdXfXfXfXfXiXiXfXfX5XfXfXfX6XfX5XfX6XfX5XhXfX6XiXfXfXfXfXfXfXfXfXfXfXqXfXfXgXgXhXfXkXgXgXfXhXgXlXgXfXlXjXjXjXxXxXvXvXvXvXvXxXvXvXsXmXnXvXvXvXvXvXvXvXvXvXxXvXxXvXvXvXvXxXvXxXvXvXvXvXvXvXvXxXhXvXvXvXxXxXxXzXhXxXvXxXxXvXxXvXxXvXvXxXvXxXvXxX",
+"3X3X3X3XyX XyXyX3X5X.X3X3X1X3X<X3X3X3X3X3X3X4X5X5X4X3XyX4XuX6XpXiXiX6X6XuXiX6XuXiX6X5XiX6XpXpXfXpXpXqXpXuXyXuXyXiXuXiXiXiXiXiXfXfXfXfXfXfXqXfXfXfXiXfXiXfXfXfXfXfXfXfXfXfXfXfXfXhXiX5XfXfXiXfXfXiXfXiXhXfXfXfXfXfXfXfXfXlXgXgXgXlXgXzXkXgXlXjXjXhXhXkXjXxXxXxXvXxXvXxXxXvXvXvXxXvXvXvXvXvXvXnXvXvXvXvXxXvXvXxXvXvXvXvXvXvXxXxXvXxXvXvXxXvXxXvXxXxXxXxXxXzXxXxXxXsXxXvXxXxXxXxXxXxXvXxXvXxXvX",
+"3XyX3X3X3X3X3X3X3X3X3X5X3X3X3XiX5X X3X{.<X X<X<X X5X3X3X3XuX3XrXrX3XiX3XiXrXrXiXiXiXdXiXrXfX6XiXiXiXiXdX1XiXiXdX1XiXiXiXiX6XfXpXfXqXfXgXfXfXgXfXhXiXfX6XfXfXfXfXfXfXfXfXfXiXfXfXfXfXfXiXfXfX0X6XfXfXfXhXfXfXfXfXfXfXgXgXgXgXlXjXzXjXjXjXxXzXjXzXzXzXjXjXxXxXxXvXvXvXvXvXvXvXvXvXvXvXvXnXnXvXnXvXvXvXvXvXvXvXvXvXvXxXvXxXvXxXxXvXvXvXxXvXzXvXzXxXxXxXzXvXxXxXzXxXxXxXvXxXvXaXvXxXxXvXxXxXxXvX",
+"3X3X3X3X3X3X3X3X3X3X5X X3X3X X3XyX X3X3X X5X3X7X3X3X5X5XiXiXiX3X5XiXiXiXiXiX6XiXiXiXiXiXiXfXfXfXfXfXsXgXfXfXuXaX3X5XiX6XiXiXiXfXfXfXfXfXfXfXfXfXhXhXfXfXfXiXfXfXfXfXfXiXfXfXfXpXfXqXfXfXfXfXfXfXfXfXfX0XfXfX0XfXhXfXgXgXjXzXjXxXzXjXxXxXjXxXjXxXjXjXxXjXxXxXxXxXvXvXvXvXvXnXnXvXnXnXvXnXvXnXvXnXvXvXvXvXvXvXvXvXvXvXvXvXxXvXxXvXxXvXxXvXxXvXvXxXxXxXvXzXxXxXxXxXxXvXxXvXvXvXvXvXvXxXxXvXvXxX",
+"3X3X3X3X3X3XyX3X3X X X5X3X3X3X3X3X3X X<X3X<X3X3X3X3X3X3X3XuXuXiX5X5X3X3XiXpX6XiXiX6XiXiXiXhXiXfXfXfXpXiXpXiXiXiXiXiXiX6XiXiXfXfXgXgXgXgXgXfXhXfXfXfXfXfXfXfX6XfXfXiXhXiXfXfXfXhXhXfXfXfXfXfXfXfXfXfXfXfXfXfXhXhXhXhXgXgXhXjXxXjXxXxXxXxXzXxXxXzXzXzXxXxXxXxXvXxXsXnXvXvXvXnXvXnXnXnXvXvXvXvXnXnXnXvXvXnXvXvXvXvXvXvXvXvXvXvXxXxXxXvXxXxXvXzXxXxXxXxXxXvXxXzXzXvXxXvXvXxXxXvXvXxXxXvXvXvXxXvX",
+"yX3X3X3X X3X3X3X3X3X3X X3X3X X3X X X3X3X3X{.3X X3X3X3X5X3X3XiXiX5X5XiXiXuX6X6XiXiXiXiXiXfXiXhXfXfXpXfXpXfXpXiXiXiXiXfXpXfXfXfXfXaXiXgXgXgXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX6XfXiXhXfXhXgXfXfXhXfXhXfXhXhXhXhXhXhXhXhXgXhXjXkXhXjXjXxXxXxXxXxXxXzXzXzXzXxXxXxXxXvXvXvXvXvXvXvXnXnXnXvXmXvXnXvXnXvXvXnXnXvXvXvXvXvXvXvXvXxXvXvXxXxXxXxXvXvXxXxXxXxXxXxXvXxXzXvXzXvXzXxXxXvXvXxXxXxXxXvXvXvXxXvXvX",
+"3X3X3X X<X3X3X3X3X3X3X<X3X3X<X3X3X<X<X{. X<X3X3X3X X3X3X3X3X3X5X5X5XiX4XiX5XiXiXiXiXiXiX5XfXfXfXfXfXfXfXfXfXfXhXfXiX6XfXfXiXfXfXfXfXfXfXgXgXgXqXfXfXfXfXfXfXfXfXfXfXfXpXfXfXfXfXjXfXhXhXjXjXgXjXzXgXjXjXjXjXjXlXgXjXlXgXzXjXjXxXxXxXxXxXvXxXxXxXxXxXxXxXxXxXvXvXxXvXvXvXvXnXnXnXnXnXnXvXvXnXnXvXnXnXvXmXvXvXvXvXvXvXxXvXxXxXvXxXxXxXxXvXxXvXzXxXvXzXvXzXzXzXxXvXxXvXvXxXxXvXxXxXvXxXvXvXxXvX",
+"3X3X3X<X X3X3X3X3X X3X3X<X X3X3X|.3X|.3X<X X3X X X X3XyX3X XyX5X3X5XiX5X6XiXiXiXiXiXdXiX0XfXiXfXiXfXfX6X6XfXfXiX5XiXfXfXfXfXfXfXfXfXfXfXfXgXgXfXgXfXfXpXfXpXiX6XfXiXfXfXfXfXjXfXgXjXhXhXjXjXjXjXjXzXjXjXjXjXjXjXgXgXzXjXjXzXxXjXxXxXxXxXxXvXxXvXxXxXxXvXvXvXxXvXvXvXvXvXvXvXvXnXnXvXnXnXnXnXnXnXnXvXvXmXvXvXvXvXnXxXxXxXxXvXxXvXxXxXxXxXxXxXzXxXxXxXxXxXzXxXzXzXxXxXxXvXxXxXxXvXvXxXvXvXvXvX",
+"3X3X3X3X3X3X3X3X<X3X[.3X|.3X3X3X3X<X X<X3X3X3X<X3X3X3XyX3X3X5X5X3XiX5XiXiXiXiXiXiXiXiXiXhXfXfXfXfXfXfXfXfXfXiXhX0XfXfXfXfXfXfXfXfXfXfXfXfXgXgXgXfXgXfXfXfXfXhXfXfXfXiXfXfXfXjXjXhXjXhXgXxXjXxXxXjXxXxXjXxXjXjXjXgXzXjXlXjXzXxXxXxXxXxXxXvXxXxXxXxXxXvXxXxXvXvXvXvXvXvXvXvXvXnXnXnXnXnXnXnXnXnXnXnXvXmXvXvXmXvXvXvXxXvXxXvXxXvXvXxXzXxXxXvXzXzXxXxXxXxXzXvXzXzXxXxXxXvXxXvXvXxXvXxXvXvXvXvXvX",
+"5X3X3X X3X3X X3X3X|.3X3X3X3X|.3X3X{.<X3X3X3X3X3X X3X3X3X3XyX5XuX5XiX5XuX5X5XiXiXiXaXiXfXiXfXfXfXfXfXfXfXfXfX6XfXhXiXfXhXiX6XfXhXfXfXfXfXgXfXfXfXfXfXfXfX6XfXfXfXfXfXfXpXfXfXfXjXhXhXhXlXjXjXxXjXxXxXxXxXjXxXjXxXzXxXjXxXzXjXjXjXzXxXxXxXxXxXvXvXvXxXxXvXvXvXvXvXvXvXvXvXvXnXvXnXnXnXnXnXnXnXnXnXmXmXvXmXvXvXmXvXxXbXvXxXxXvXxXxXxXvXxXxXzXxXxXzXvXzXzXvXzXzXzXzXxXxXxXvXxXxXvXvXvXvXvXvXvXvX",
+"3X3X3X3X X3X3X3X<X{.3X3X3X X<X<X{.3X3X<X3X<X7X X3X<X3X X3XyX3XiX5X3X5X5X3XiXiXpXiXiXiXhXfXiXfXfX6XhXhXfXfXfXfXfXfXfXfXfXfXfXfXiXfXfXfXfXfXfXfXgXfXfXiXfXhXfXfXfXfXfXfXqXfXfXfXhXlXzXzXjXxXzXzXzXzXlXxXxXxXxXxXxXxXlXjXjXxXjXjXjXzXxXxXzXxXxXxXxXxXvXvXxXvXvXxXvXvXvXvXvXvXvXvXvXnXnXnXvXnXnXnXnXmXmXmXvXmXvXmXnXxXvXvXvXxXvXxXlXxXxXxXzXxXzXzXvXxXzXxXzXzXzXzXzXzXxXxXxXxXxXvXvXvXvXvXvXvXvX",
+"3X3X3X3X5X7X X3X X<X{.{.<X[. X3X{.7X3X3X3X X<X X3X3X3X3X3X3X3X3X3X5XiX3XiXiXiXiXiXfXiXiXfXiXfX5XiXiXfXfX6XfXfXfXfXfXfXfXfXhXfXhXhXfXfXfXfXhXfXfXfXfXfXfXfXfXjXfXfXfXfXfXgXgXfXgXgXjXzXzXjXzXzXxXzXxXxXxXxXxXxXlXxXjXxXjXzXzXjXzXxXjXzXzXxXxXvXxXxXxXxXxXvXxXvXvXvXvXvXvXvXnXvXvXnXnXnXnXnXnXnXnXnXmXvXmXmXvXvXvXbXvXxXvXvXxXvXvXxXxXxXvXxXxXxXxXxXvXxXvXzXzXzXzXzXzXvXxXvXvXxXvXvXvXvXvXvXvX"
+};
diff --git a/images/checkbox2checked.xpm b/images/checkbox2checked.xpm
new file mode 100644 (file)
index 0000000..1120d95
--- /dev/null
@@ -0,0 +1,332 @@
+/* XPM */
+static char *checkbox_checked[] = {
+/* columns rows colors chars-per-pixel */
+"190 70 256 2",
+"   c #0C111B",
+".  c #0D1522",
+"X  c #0C1B2C",
+"o  c #0D1826",
+"O  c #0F1C33",
+"+  c #131924",
+"@  c #121B2B",
+"#  c #161B29",
+"$  c #101D34",
+"%  c #16212B",
+"&  c #172639",
+"*  c #0B2436",
+"=  c #222C3A",
+"-  c #24323C",
+";  c #152B43",
+":  c #182A43",
+">  c #192E4D",
+",  c #142845",
+"<  c #192E51",
+"1  c #1C314C",
+"2  c #17304F",
+"3  c #1A3253",
+"4  c #1C355B",
+"5  c #1B3A5B",
+"6  c #163256",
+"7  c #0E2A45",
+"8  c #1D3C63",
+"9  c #1D3D6A",
+"0  c #1D3E71",
+"q  c #223546",
+"w  c #203456",
+"e  c #213A5D",
+"r  c #233A57",
+"t  c #313E50",
+"y  c #223D64",
+"u  c #233D6B",
+"i  c #293D6A",
+"p  c #273B66",
+"a  c #233E72",
+"s  c #293D71",
+"d  c #313F6E",
+"f  c #1D4165",
+"g  c #1C426B",
+"h  c #17456B",
+"j  c #1C4371",
+"k  c #1D4776",
+"l  c #274359",
+"z  c #3B464D",
+"x  c #3C4952",
+"c  c #364758",
+"v  c #3F5057",
+"b  c #224165",
+"n  c #23426B",
+"m  c #244A6D",
+"M  c #2A4464",
+"N  c #2A426C",
+"B  c #2D4B6D",
+"V  c #274864",
+"C  c #234372",
+"Z  c #294372",
+"A  c #2B4971",
+"S  c #254977",
+"D  c #295279",
+"F  c #324C69",
+"G  c #334C74",
+"H  c #3D597C",
+"J  c #365379",
+"K  c #385160",
+"L  c #414952",
+"P  c #45525C",
+"I  c #425A7C",
+"U  c #505966",
+"Y  c #4D616C",
+"T  c #4F6067",
+"R  c #4F6270",
+"E  c #49657A",
+"W  c #50626E",
+"Q  c #566875",
+"!  c #5A6A7A",
+"~  c #546674",
+"^  c #284E80",
+"/  c #2C5C85",
+"(  c #2C5D8A",
+")  c #225580",
+"_  c #325C85",
+"`  c #325C8C",
+"'  c #3C5B84",
+"]  c #375D90",
+"[  c #2F5588",
+"{  c #2C618B",
+"}  c #2A6487",
+"|  c #2E6392",
+" . c #31628D",
+".. c #356587",
+"X. c #366795",
+"o. c #38759C",
+"O. c #2F7098",
+"+. c #3C75A3",
+"@. c #3B79A4",
+"#. c #3B78A7",
+"$. c #435D83",
+"%. c #4A6485",
+"&. c #4C6A8B",
+"*. c #486686",
+"=. c #437598",
+"-. c #526A8B",
+";. c #526D91",
+":. c #597583",
+">. c #5A7594",
+",. c #4275A5",
+"<. c #4476A9",
+"1. c #417AA5",
+"2. c #427AAA",
+"3. c #4978A6",
+"4. c #477CB2",
+"5. c #647586",
+"6. c #63788B",
+"7. c #627B9B",
+"8. c #657A94",
+"9. c #727F9F",
+"0. c #3C88B6",
+"q. c #3C83A3",
+"w. c #2E92CD",
+"e. c #3594CE",
+"r. c #3598CE",
+"t. c #3896CE",
+"y. c #3B99CE",
+"u. c #3A95C6",
+"i. c #3696D0",
+"p. c #3599D1",
+"a. c #3A96D0",
+"s. c #3C99D0",
+"d. c #399CD9",
+"f. c #3DA0D7",
+"g. c #4683AC",
+"h. c #438DBB",
+"j. c #4B8BB9",
+"k. c #4688B3",
+"l. c #4A91BA",
+"z. c #4893B8",
+"x. c #518BB9",
+"c. c #5492BD",
+"v. c #5E88A2",
+"b. c #668496",
+"n. c #71849A",
+"m. c #77919F",
+"M. c #6A85A3",
+"N. c #6E90AA",
+"B. c #7285A2",
+"V. c #768CA8",
+"C. c #7592A2",
+"Z. c #7993A5",
+"A. c #7C93AA",
+"S. c #7494AB",
+"D. c #7797B3",
+"F. c #6095B7",
+"G. c #7EA2BA",
+"H. c #429BCD",
+"J. c #4C96C2",
+"K. c #4A9BCC",
+"L. c #4698C6",
+"P. c #429CD1",
+"I. c #429BD8",
+"U. c #489ED3",
+"Y. c #4598D4",
+"T. c #518BC0",
+"R. c #5699C7",
+"E. c #569ED4",
+"W. c #4AA1CC",
+"Q. c #45A0D3",
+"!. c #4BA1D4",
+"~. c #4DAAD4",
+"^. c #4CAADB",
+"/. c #49A2D8",
+"(. c #53A4CD",
+"). c #55A9CE",
+"_. c #5CA5CD",
+"`. c #53A5D6",
+"'. c #55A6D8",
+"]. c #56A8D6",
+"[. c #55A8D8",
+"{. c #5AA4D4",
+"}. c #5BA4DA",
+"|. c #5BAAD4",
+" X c #5BAAD9",
+".X c #57B2D9",
+"XX c #5BAAE1",
+"oX c #57A8E1",
+"OX c #4CADE4",
+"+X c #63A3CD",
+"@X c #62A4D3",
+"#X c #61A5DB",
+"$X c #61A9D4",
+"%X c #62ADDB",
+"&X c #6AA9D7",
+"*X c #65B0DC",
+"=X c #62B0D7",
+"-X c #7BACD2",
+";X c #7DAFD3",
+":X c #64A9E0",
+">X c #64B0E2",
+",X c #82949E",
+"<X c #8393AB",
+"1X c #8A99AC",
+"2X c #8899B2",
+"3X c #919DB3",
+"4X c #949CAE",
+"5X c #89A3B8",
+"6X c #92A1B4",
+"7X c #94A5BA",
+"8X c #97AABB",
+"9X c #A1B0BE",
+"0X c #8DADC1",
+"qX c #87ABC8",
+"wX c #8DB1C8",
+"eX c #91ADC1",
+"rX c #98ADC4",
+"tX c #9AB4CA",
+"yX c #97B4C5",
+"uX c #98BBD5",
+"iX c #A9B6C8",
+"pX c #A3B5CB",
+"aX c #9CC1D5",
+"sX c #9EC2D9",
+"dX c #9DCCDC",
+"fX c #A4C5DB",
+"gX c #B3C6D7",
+"hX c #A5CAE5",
+"jX c #ABCCE4",
+"kX c #A3C7E2",
+"lX c #ADD3EC",
+"zX c #ACD8ED",
+"xX c #ABD0E4",
+"cX c #AED6F0",
+"vX c #AED8F1",
+"bX c #B0D5EC",
+"nX c #B1D8EE",
+"mX c #B6D1E5",
+"MX c #B0D6F0",
+"NX c #B0D8F1",
+"BX c #B9DDF3",
+"VX c #BBDFF9",
+"CX c #B1CDE5",
+"ZX c #BDE1F5",
+"AX c #BDE2FA",
+"SX c #C7DDEE",
+"DX c #C4DEF1",
+"FX c #C3E2F4",
+"GX c #CBE6F8",
+"HX c #D2E9F6",
+"JX c #DAEDF6",
+"KX c #DAEDF9",
+"LX c #D1E8F7",
+"PX c #D9F1FB",
+"IX c #C1E1EE",
+"UX c #E0F1FA",
+/* pixels */
+"U.P.P.U.P.P.P.H.P.y.P.s.s.s.Y.s.U.s.I.P.s.P.y.y.P.P.P.P.P.P.P.Q.P.P.U.U.P.U.U.U.!.!.!.!.!.!.`.`.`.`.`.!.`.`.W.`.!.`.R.h.`.`.`.`./.`.`.!.`.`.].].`.`.`.`.!.!.].!.`.`.!.`.`.`.`.].{.'. X'. X[. X X X XXX#X X X X X X X X X}. X{. X}. X X X X X X%X X%X X%X%X%X X%X X%X%X%X%X%X&X%X%X*X*X%X%X%X*X*X*X*X*X*X*X*X*X%X%X%X X*X X%X X%X X%X X X X X%X X%X X X%X X X X X X X>X X X*X*X X*X X*X*X%X*X",
+"U.U.P.P.P.P.P.y.y.P.P.y.P.Y.s.s.y.s.s.s.s.s.H.P.P.s.P.P.P.P.U.P.U.P.P.U.P.U.U.U.!.!.!.!.!.!.!.!.U.`.!.`.`.!.`.!.`.+Xb.#./.`.`.`.'.`.`.`.`.].`.`.`.`.`.(.].).].].`.`.`.`.`.`.`.].'.'. X X[.[. X X X X X X X XXX X X X'. X}.'.].'. X]. X X%X X%X X X%X%X%X%X%X%X%X&X%X%X%X&X%X*X%X%X%X*X*X*X%X%X>X*X*X*X%X&X*X*X%X*X=X%X X*X X%X%X%X X X X X X XXX X X X#X X X}. X X X X X%X X X*X X*X*X*X*X%X",
+"U.U.U.U.P.P.P.P.P.y.s.s.y.s.P.a.s.P.P.s.s.H.s.H.Q.H.P.P.P.P.P.P.P.P.P.U.P.U.P./.U.U.!.W.!.!.!.~.!.`.!.!.!.`.!.!.-XD.&.#.!.!.`.!.`.!.`.`.`.`.`.`.`.`.`.`.].`.`.`.`.`.`.`.`.`.`.'.'.'.'. X X X X%X X X X X X X#X X X X[. X]. X].].[. X X X%X X X%X%X X%X%X%X%X%X%X%X%X&X*X%X%X%X*X%X%X%X*X%X*X*X*X*X*X*X*X%X%X=X%X*X X X*X X%X%X X X%X X XXX%X X X X XXXXXXX X X X X X*X X X X*X X*X X%X%X*X*X",
+"U.U.U.P.P.P.P.P.P.Y.s.y.y.y.y.y.s.s.s.s.s.s.H.P.y.P.s.P.s.P.P.s.P.y.P.P.P.U.P.U.U.U.U./.U.U.!.!.!.!.!.!.!.!.`.;X5Xb.S #.`.`.`.`.'.`.`.`.`.`.].`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.'.'.'.'.].[. X X X X X X X X X X X X X X X X X]. X X X X X#X X|.%X X X%X X%X X%X%X%X%X%X%X%X%X%X*X%X%X%X&X*X*X%X*X*X*X*X%X*X%X=X X%X X*X X X X X X X X X X X X X%X X X X X X#X X X X X X X X X*X X*X X%X%X*X%X%X",
+"!.U.U.P.P.U.P.P.y.P.y.s.s.y.s.s.p.s.s.s.s.H.P.y.Q.Q.P.y.P.P.P.s.P.P.y.P.P.P.P.P.H.H.P.U.U.U.U.!.!.!.!.!.`.!.qXrX<XH 8 #.`.U.!.`.`.`.`.`.'.'.].'.].`.].'.`.`.`.`.`.].'.'.[.`.'.'.'. X X`. X X X X X X X X X X[. X X X[.'. X'.'.'.'. X X X X%X X%X X*X*X X>X*X*X X:X>X*X%X&X*X%X*X%X*X%X%X*X%X*X%X%X%X%X%X%X%X%X X*X X X X X X X|.|. X X X X#X%X X X XoX X X%X X X X X X X X*X*X X*X=X*X=X*X*X",
+"!.U.U.U.P.P.P.s.H.y.y.a.s.t.s.s.y.s.y.s.s.y.y.P.y.s.P.Q.P.s.s.P.y.y.s.s.y.y.H.P.P.P.P.P.P.P.U.U.!.!.U.~.U.-XyX7X7.M l h.!.`.`.`.`.`.`.`.!.`.`.'.`.'.`.`.].`.`.`.`.`.'.'.'.'.'.'.'.]. X'. X X X X X X[. X X X[.[. X X'. X'.].}.].[.'. X}. X X%X X X X X*X>X X%X>X%X%X%X*X%X%X*X%X*X%X*X%X X*X*X X%X*X X%X%X X X%X X#X X X X X X X X X X X X X X X X X X X X X%X X>X X X>X>X X X*X*X X X*X%X*X",
+"!.!./.U.P.P.P.P.y.H.s.s.s.s.i.y.s.s.s.s.s.P.y.s.Q.y.P.s.s.s.y.s.s.s.y.s.y.y.y.P.y.P.P.P.P.P.U.U.U./.!.U.&XrX8XV.D 5 B K.`.`.!.`.`.`.`.`. X].`.].'.].'.].].!.].`.].`.`.'.'.[.'.'.'.]. X].[. X X X X X X[.]. X X[.].].'.'.'.].'.}. X X X X X X X%X*X X X X>X X%X%X%X%X%X*X%X%X%X*X%X*X&X*X>X*X X*X X*X%X X X X X%X X X X X X X X}. X X X X X X#X X X#X X%X X X X X X X X X X X X*X*X*X X X%X*X",
+"!.!./.!.Q.P.P.P.P.P.d.s.y.i.s.i.s.s.p.y.P.y.P.H.H.y.f.s.s.s.y.y.s.s.s.s.y.s.t.P.H.s.P.P.P.P.U./.U.U.K.@XwX9X1X>.b 3 D U.`.U.`.`.`.`.`.`.`.'.'.'.'.'.'.].`.{.{.].!.'.'.'.'.'.{.].'.}.]. X[. X X X X X]. X[. X].[.}.'.'.'.{.].].'.'.'.'. X X X X X*X X*X X*X%X%X%X%X&X*X%X*X%X%X*X*X%X X%X X%X X%X%X X X X%X%X X X X X#X X X X X X{. X}. X X X X X X X X X X%XXX X X X*X X X*X%X%X X X*X=X*X%X",
+"!.!.!.!.U.P.P.H.H.P.y.s.d.s.y.L.y.t.y.y.s.y.y.y.s.s.s.s.s.s.p.i.y.e.a.a.a.I.y.P.y.P.y.P.Y.Y.U.U.U.U.E.qXrX6Xn.J 6 3 J K.`.`.`.`.!.`.].`.].`.'.].].'.`.].'.`.`.].].`.].{.'.'.].'.].`.[.[.]. X X]. X[. X[. X'.'.'.`.'.'.'.`.'.].'.`. X X]. X|. X X X*X*X X*X*X=X*X%X%X%X*X%X*X%X%X%X*X>X X X*X#X X X X X X X X'. X X X X#X}. X X}.'. X[.[. X X X X X X X X X X=X X X X=X%X X%X%X%X%X%X|.%X%X%X",
+"!.!.!.W.U.P.P.Q.s.H.y.y.r.y.y.t.r.d.y.y.s.y.y.t.y.y.p.s.r.t.t.t.u.t.y.i.y.i.y.y.y.y.y.P.Y.H.U.U.U.U.qX8X6XV.>.i 6 > B !.`.`.`.!.].`.'.'.'.'.`.`.].'.'.].`.`.`.`.!.'.'.].'.`.].}.'.`. X X X`. X X[. X[. X'.'.].].].'.].].].`.'.`.[.[.]. X X|. X X X X X X*X X%X*X%X%X*X%X*X%X%X%X%X*X X*X*X X X X X X X X X X X X X X X X X X X X X}. X X X X X X X X%X X%X X X*X%X X%X X%X X X%X X%X%X$X%X*X",
+"~.!.!.!.Q.H.Q.P.s.H.u.Q.s.y.y.y.y.i.y.a.s.Y.H.a.s.s.s.a.a.a.y.a.a.a.a.t.i.y.y.i.a.a.s.d.s.I.d.s.s.&XtX7X<X7.$.4 1 ; m W.!.'.[.!.].].`.].`.].].'.'.'.`.`.].`.`.].'.'.{.].{.'.'.'.'.}. X'.'. X}.].'.'. X`.'.]. X`.`.`.'.`.`.`.!.'.`.`.].[. X X X X X X X*X*X X X*X%X*X%X*X&X%X%X*X%X%X*X X X X X XXX X X X X].`. X X X X X X X}. X X X}. X X X%X X%X X X X*X X X X%X X%X X%X X%X X%X%X%X%X%X%X",
+"!.~.Q.!.Q.Q.Q.P.P.s.I.P.y.r.y.s.H.Y.t.y.y.y.y.y.y.y.y.y.t.t.t.t.e.y.e.e.t.t.t.t.y.y.H.y.y.P.H.P.E.eX8X2XM.&.A 4 2 ; V W.`.`.[.'.'.`.`. X`.'.'.`.].'. X`.'.'.].`.'.'.{.].'.'.'.'.'. X'. X'.'.'.'.].].'.`.].].!.].`.'.`.`.`.`. X`.`.[. X[. X X X X X*X*X X X*X X*X*X*X X*X%X*X*X X%X%X X X*X X X X X X X X X`. X X X X X X X X X X X}. X X X X X X X X#X X X X X*X|.%X X%X X%X X%X%X X%X%X$X%X",
+"U.`.!.!.!.P.P.P.P.P.d.y.Y.P.s.p.a.s.s.p.i.i.t.i.i.i.i.e.e.e.i.i.i.i.r.e.r.i.r.s.i.i.y.y.y.y.P.H.qX7X2XB.;.' u 5 2 ; l u.~.`.'.'.]. X`.`.].'.`.].'.].].`.`.`.].`.'.`.'.'. X'.}.'. X'.'.'.].'.'.'.{.'.`.`.`.`.`.`.`.`.`.`.`.`.'.`.].'.]. X X X X X X X X X*X*X*X X*X=X*X>X%X%X%X%X X=X X X X X X X[.[. X X`.].]. X[. X X X X X X'. X'. X X#X X%X X%X X X X X*X X X%X X%X X%X%X%X%X X%X%X%X X*X",
+"`.U.!.!.!.Q.Q.P.P.s.y.y.Y.P.p.d.d.w.d.a.e.t.e.e.e.a.y.e.e.a.e.e.e.t.t.e.a.e.y.i.H.a.y.y.y.y.P.+X8X4XA.6.I B 8 8 6 ; 1 0.U.`.'.].`.'.[.`.'.`.`.'.`.'.`.].[.`.`.[.].`.'.'.'.'.'.'.'.'.`. X[.[.].'.'.'. X`.`.`.!.'.`.`.`.`.`.`./.'.'.'.'.[.[. X[. X X X*X*X X X*X X X*X X X X%X X%X%X X X%X X X X X X[.'.].].].].}.[. X'. X X X X X X X[. X X X X X X X|.%X X X.X*X X%X X%X X X X X%X X%X X*X>X",
+"U.U.!.!.!.Q.P.P.P.P.y.H.L.y.P.y.y.J.i.i.t.e.e.t.i.i.t.t.e.t.i.i.r.e.i.i.e.e.s.s.i.i.y.y.y.Y.K.qX7X<Xb.%.G n n 4 3 , ; o./.'.'.`.'.].`.].].].`.`.`.`.].`.`.`.`.].].'. X'.'.'.'.'.'.'.].'.`.[.'.`.`.`.'.`.`.`.`.`.`./.`.`.E.`.`.'.'.'.'.'.[.[. X X X X X X X*X X*X X X X%X>X X%X X X%X X X X'. X X'. X'.].'.'.'.'.[. X X X}. X X X X X X X X X%X X X|. X|. X%X X%X X X%X X X%X X%X%X X%X%X X X",
+"`.E.!.!.P.Q.P.P.P.s.I.U.y.d.p.L.;XHXUXUXUXJXJXJXJXJXJXJXJXJXJXJXJXUXJXKXKXKXJXJXJXKXKXKXUXKXgXiX3Xn.;.H N N 8 y 1 & & } U.`.'.`.`.`.`.'.].`.`.].`.`.`.].`.`.`.'.'.`.].].}.'.{.].].].[.`.'.].`.`.'.`.].`.`.`.!.'.`.`.`.`./.`.`.'.'.'.].'. X[.[. X X X X X X X X X*X X%X%X X%X%X X%X%X X X X X X X'.`.'.'.].{.'.'. X[.}. X X X}. X[. X X X X X|. X X%X X|. X X X X%X X|. X%X|. X%X X*X X%X*X*X",
+"`.!.!.U.U.P.Q.P.P.H.P.s.y.d.y.uXKXPXUXUXKXKXKXKXKXKXJXJXHXJXJXHXKXJXHXKXJXJXJXJXHXJXHXKXJXSXiX3XA.7.' G b 5 8 3 : X X 5 K.`.`.'.`.`.].!.].`.`.`.`.`.].`.`.{.'.'.'.'.'.'. X'.'.'.'.'.}.].{.`.'.'.'.'.[.].`.`.`.`.`.`./.`.`.`.'.'.'.`.`.[.'. X]. X X[. X X X X X%X%X X%X X X%X X%X X|. X|. X].'.'.'.'.'.'.'.].'.'.'.'.'. X X X].}. X X X X X X X%X|. X X|. X|.|. X X X X%X|. X X%X X%X%X%X X>X",
+"!.!.!.!.U.!.P.Q.P.P.P.I.P.s.Y.GXUXKXPXKXHXHXLXLXLXLXHXLXHXHXHXHXLXLXLXLXHXHXHXHXHXHXHXHXLXgXiX1X7.-.G N 9 8 2 ; @ . o : h.`.`.`.`.`.`.`.].`.].`.`.`.{.`.`.`.'.'.'.'. X'.'. X'.'.'.].].].`.`.`.'.'.'.].`.`.`.`.`.`.`.`.`.`.'.'.`.`.'.'.'.'. X X[.[. X X X X].|. X X%X X|.%X X X%X X%X X X X X X'.'.'.`.{.{.'.'.'.'. X'. X].]. X X X X|. X%X|. X X%X X X%X X X%X|. X|.%X X X%X|. X%X X X%X X%X",
+"!.!.!.W.!.P.Q.P.P.P.y.P.P.s.e.PXHXHXHXLXFXFXFXFXFXFXFXFXFXFXFXFXGXFXFXFXFXZXFXFXFXFXFXFXmXiX4XV.;.I Z u 4 6 & +   o * m u.U.`.`.`.`.].].].'.].`.'.'.{.].{.'.'.'. X'. X X X].].].`.].'.'.'.{.'.`.[.`.].].{.].`.`.`.`.`.`.`.`.`.'.`.`.'.'.[.'.].[.]. X X[. X X X X X|. X%X X X%X X X&X X|.}. X[. X}.].'.].'.'.].{.].'.'.'.'.].].].'. X X X X X%X|. X X%X X%X X%X X X X X X X X%X X X%X%X X%X X",
+"!.!.U.!.U.U.P.Q.P.P.U.s.y.s.s.GXSXGXGXZXBXBXBXBXBXBXBXBXBXBXBXBXBXNXBXVXBXBXBXBXBXBXBXnXuXeX2X7.*.A e 5 3 ; +   X 2 O.R.U.`.`.`.`.`.].`.`.`.].].'.'.'.'.'.'.}. X'. X X X X'. X X X X].'.'.'.`.'.[.'.`.].`.`.`.`.`.`.`.`.`.`.`.`.'.'.`.].`.'. X X X[.[. X X X X X X|. X X X%X X=X%X X%X X X X].[. X'.'.].'.`.`.].].].].`.'.'.].}. X[. X X X%X X%X%X X X=X X X|. X X|. X&X%X|.%X X>X X X%X X%X",
+")./.U.U.U.U.P.Q.P.P.H.P.H.y.P.FXLXIXZXBXzXzXvXNXcXcXNXnXbXcXcXcXvXvXvXMXNXvXNXNXcXcXcXgXrX1XV.-.J y 8 1 ; o + # 5 k.U.U.U.`.`.`.'.'.`.`.'.`.'.'.'.'.].].[.[.[.[.[. X X X`.]. X[. X X[.[. X'.].'.`.'.'.!.].`.`.`.`.`.`.`.`.`.`.`.!.[.`.[.'.[.].'.'.].[. X X X X X|. X X X X*X X*X X%X X X X X X'.`. X`.[.].`.`.`.`.`.].{.'.].'.].[. X%X X X%X X X X X%X X X X X X X X X X X X X X X X%X X%X X",
+"!.~.!.U.U.U.!.P.P.P.P.s.H.y.y.ZXSXZXBXBXcXzXvXNXnXNXNXcXvXvXcXcXvXvXMXcXvXcXvXvXcXnXbXtX6X<X6.$.Z p 6 & X . # - g.U.!.!.`.`.U.`.`.'.`.`.].'.].}.'. X X X X X X X X X].'. X X[. X X X X X].'.'.].'.'.].].`.`.`.].`.`.'.].'.`.`.].].[.`.`.`.'.'.[.'.`. X X X X X X X X X|. X X X X%X X%X X X X[. X'.`.[.[.].`.`.`.`.`.`.`.].`.'.]. X X|. X%X|.%X X X X|. X X%X X%X X%X X X X X&X X%X X X X X X",
+"!.!.!.!./.P.Q.Q.Q.P.P.s.y.y.s.GXIXFXZXnXcXcXMXvXNXvXcXnXcXcXnXzXvXNXNXvXvXvXNXvXcXcXfX8X1XB.-.G 8 4 > + + & t Q J.!.~.!.`.U.`.`.`.`.`.`.].].'.'. X'. X'. X X X X X X}.|.'. X X X X X X X X'.'.'.'.].`.`.`.`.`.].`.`. X`.`.].'.!.`.`.`.`.[.'.`.[.`.[.[.[. X[. X X X X X X X X X*X%X*X X%X X X X'.'.`.`. X`.`.`.`.`.`.`.`.].'.'.'. X X|. X%X X X X X%X X X%X|. X X|. X X X X'. X X X X X X%X X",
+"`.U.`.W.!.U.Q.Q.P.P.y.P.y.y.s.ZXFXZXZXnXMXMXNXMXvXvXcXcXcXbXuXqXvXvXvXcXcXcXcXMXcXlXyX6XA.>.$.f 4 , $ + & c 5.~ K.!.!.!.!.`.U.!.`./.`.`.{.].}.'.'.'. X X X X X X X X X X X X X X X X X}. X X]. X].].`.`.`.`.`.`. X X'.'.'.].'.'.`.`.'.'.'.[.[.`.].`.[.[.[.[.[. X X X X X X=X X>X%X X X X X X X X X[.[.`.].`.`.`.`.`.'.`.`.`. X X X[. X X|. X|.%X X$X X%X X X X X|. X X}. X X X X X X%X X=X X",
+"!.`.!.U.U.U.U.U.P.P.P.P.P.y.y.FXFXVXBXBXnXnXvXvXNXNXNXcXbXuX5XM.kXvXvXvXvXvXNXNXVXuX3X2XB.-.A 4 > & + & c C.b.T P.!.!.!.~.!.!.`.`.`.`.`.'.'.'.[.'. X[.'. X X[. X X].[. X|. X X X].%X}.[.[. X X'.#X~.`.].!.].^.[.[.'. X X}.[.~.'.#X`.[.'.]. XE.}.[.`.`.'.'.~. XoX[. X X X X X X X X#X:X|. X X X[.'.}.].'.`.'.[.E.'.`.`.].}.'.}. X'. X X X X X X X XXX#X X X X X X X}. X|.'. X X X X X X X X%X",
+"`.U.!.!.U.!.U.U.P.P.Q.s.y.y.y.ZXDXZXZXnXcXcXvXvXcXcXNXCXgXrXV.&.D.vXvXvXvXvXMXMXlXtX3X<X7.J f < *   % c 2XZ.6.T Q.W.~.P.U.~.!.`.U.`.`.`.`.'.`.[.'. X X X X X%X@X@X&X%X{.|.%X[. X|.$X|.|.|.`..X[.E. X].`. X X'.[.]. X].^.^.`.|.{.(.].(._.].!. X`.~.`.].].{.|.].[.].`. X|.$X+X X X.X%X%X|.=X{.|..X[.`.].].].(.).'.^.).].(.].].|.).~. X X X X X#X X X X X X#X X X X X X X}.|.}.}. X X X X X X%X",
+"E.!.!.!.!.U.U.U.U.H.P.f.P.y.P.FXFXDXZXnXnXnXnXvXcXcXmXgXpX3X8.G &.lXNXcXNXvXvXMXuXrX2XB.%.N 4 7 X @ - A.yXC.6.T P.!.!.!.!.!.!.`.U.E.`.`.`.`.'.'.'.'.]. X]. X{.| j g 0 j O. X#X{.X.k m u u ] @X@X` u u b C u b u b b a @X].` u a C j n g k | g.@X'.[.!.+.j 9 s ,.].|._ a g j j.&X X%Xx.k 9 S { _.@X{ a j C S X.`.].`.X.C j j 9 ` @X:X X X X X X X#X X X X X X X X X X X}. X].{. X X X X X X X",
+"!.!.!.!.!.U./.U.U.P.P.P.P.s.y.FXFXBXZXcXBXcXcXnXnXCXgXpX3XB.I M H uXNXvXNXvXvXcXtX2X<X8.G e , @ + & b.jXyXC.6.Y Q.!.Q.!.!.!.!./.`.`.`.U.`.`.`.`.!.'. X X].|.&X( u Z n f D {.>X_.D j b b N `  X X/ u h j g g Z b C 8 a  X].} b n u g f f m h j X.E.'.'.<.g N u ,.|.}._ n b j l.|.|.*Xj.g i Z / $X%X/ N n p f S ).[.}.A n n b g { {.[.}. X'. X X X X X X X X X X#X X X|. X X}. X X X}. X|.|. X",
+"`.U.U.!.!.!.!.U.U.P.P.P.P.s.P.ZXDXDXBXcXcXcXcXCXfXiXpX3XM.;.N b M M.vXvXcXMXMXjXrX2XB.$.n 2 & . = E lXxXwXC.:.R P.!.P.P.!.!.!.U./.'.`.`.'.`.`.`. X].`. X X].|.( C y u b j K.%XR.j n p n n (  X X` n p b n u u 9 n a k '.!.( f n Z 9 n C u i i n g.`.`.+.g f g +.]. X_ 8 n j c.%X.X#Xl.m N 9 / |.`.( g j n b g K.!.R.n Z u b y (  XoX X]. X[. X[. X X X X X X X X#X X X}. X X|.'.}.|.}.|. X X",
+"E.`.!.!.!.U.!.!.U.U.P.U.P.P.H.ZXDXZXZXBXcXcXuXtXrX4Xm.8.-.[ 9 8 y I fXvXNXMXMXuX2XV.8.J 6 * o # c sXvXhX8XC.6.R Q.K.Q.!.U.U.U.~././.!.!.`.`.`.`.`.[. X}. X[.|.( n 8 A y N k.@Xk.u u Z 9 g {  X X` g u k j.|. X X}.}.+X[.}.{ g N 9 x.).L.| j u f D ].'.,.u p s 1.|.}.` i s u j.%X X>Xj.u i a ` %X X_ M n Z u u k.].4.n a Z n u (  X[.`. X X].[. X X X X X X X'. X X X X X}. X}. X}. X X X X X",
+"!.!.!.!.W.!.!.!.Q.!.P.U.U.P.H.FXZXDXBXnXuX2XN.B.7.>.&.' A m e y e G D.MXcXNXCXrX4XB.$.i & % + q G.vXzXhX8XC.6.T H.U.P./.U.U.U.U.`.`./././.`.`.`.'.[.[.`. X X X( n n  .g g X.|.X.9 j X.n n ` |. X` f a g X.@.#.@.+.+.h.'.#X` b u j j.'.'.+X0 y b h !.`.,.n g h #.].}.} h g j l. X X#XT.f b n `  X X' g g { Z u X.|.X.g Z ` g s ` {. X X'.'.'. X X X X XoX X X X X X X}. X|. X{.'. X X X|.&X%X",
+"`.!.!.~.!.!.!.U.!.!.P.U.P.y.P.FXDXZXBXBXhXS.%.G N M y p n f b e 5 A ;.cXNXnXkX3X2X7.G w * . & 6.cXvXzXhXwXC.6.Y Q.U.P.P.U.U.U./.!./.`.E.`.`.`./.`.`.[. X X'.@X` 9 n 1.C n D @XD u S ,.g b _ |.%X{ n b N m u n g m f @.`.{.( f b g j.'.[.].( g n j T.~.+.m y n @.].]._ N u u l. X X%Xc.f b n ( }.|._ M a o.Z a ) ).D h n 3.h 9 ( ].!.'.'. X'. X'.[.[. X X X X}. X'. X X X X'. X X X X X X X X",
+"U.!.!.!.!.W.!.U.U.U.Q./.U.P.P.FXDXFXBXBXcXcXuX>.A 3 3 w e 8 8 u 8 n I uXNXlXtX3XV.$.e & o # K jXNXNXvXhX0XC.5.R P.P.Q.I.U.U.U./.`./.!.!.U.`.`.`.'.`.[.[.].{.].( f b ,.| C y z.u m ] @.g n / |. X` f b 9 Z u a b n b <.}.].( p u C h.].{.'.( g f C 0.`.,.g b n +.].}._ b p b l.[. X|.c.g b m /  X%X_ g u 1. .n n x.C f  .1.g n ` {.~.'.'.`.'.]. X X X X X X[.]. X X[.[. X[. X}. X X X X X X%X",
+"`.!.!.!.!.!.U././.U.Q.P.U.P.P.FXFXVXVXnXnXcXvXlXv.r : w 3 y 8 u 8 n ' N.bXhX8X2X8.G 6 # o q 0XNXNXNXvXhX0XC.5.W s.P.P./.U.U.U.U.U.U.!.`.`.`.U.{.`.`.`.|.].}.].` n u o.#.C n / n g @.+.u b ..$X|.` n u C X.3.2.#.+.,.0. X]./ b n u h.{.`. X` f b u l.'.+.g f g #.[.'.( g p C T. X X Xj.Z n f ` XX{._ u n =.1.f 8 / u j 1.,.g u | ].'.{.`.'.'. X X[.[. X[. X X[.[.].]. X]. X[. X X X X|. X X=X",
+"!.`.!.!.!.U.U.U.U.!.P.U.U.Q.P.FXDXFXBXBXnXnXNXvXzX>.q : 3 w y 8 9 Z J >.uXeX1X9.I 5 , . = 8.NXvXvXNXvXhX0XC.5.W y.P.P.P.U.U.U.U.U.U.U.!.U.`.`.U.`./.'.!.].'.[./ s s 3.J.u u n i u J.2.n g ( |.|. .b 8 j x. X].~.'.].^.[.{./ g 9 a h.}.'.{.a f n u R.`.#.Z n n +. X[.( a u g x.{.XXoXk.g u f ( %X X_ n g +.J.g C j f 9 R.,.b u ] ].{.`.'. X'.]. X X[.[. X[. X X]. X'.[. X[.[. X X X X X X*X X",
+"!.!.!.!.!.U././.U.U.Q.U.I.Q.Q.FXDXVXBXcXnXnXNXvXvXcXb.r , > 4 y b Z $.-.S.B.8.$.V , X @ c jXvXNXNXNXNXhXeXC.5.W s.H.P.P.P.P.U.U.U.U./.!.U.U.U.`.`.`.`.!.^.`.]./ n C ,.`.D y u n Z '.+.n n ( {.|.` i C k j. X[.[.oX}.`.}.}.( j 9 C k.).K.O.N n f ^ @X'.<.g y N +.!.[.+.C b g ` {.[..X..9 Z u 3.`.%X` u u 3.#XS s s n S $X1.g y ] '.#X'.{.].].'. X[. X X[.]. X X[. X`.]. X[. X X X%X X*X X X*X",
+"!.!./.U./.U.U.U.Q.Q.U.Q.U.P.P.FXDXFXVXBXnXNXvXvXvXcXnXS.l 3 w 3 e m J $.;.;.%.B < $ + 1 5XvXNXvXNXNXvXhX0XC.5.Y y.P.P.P.P.P.U.P.U.U.U.U.U.!.!./.U.E.'.`.'.`.'.} f b 3.~.( m f g  .].@.C u / |..X` n i y N n g g n b k h.]./ N n i u j n 9 p u h 0.`.U.+.g f g @.`.[.J.j N b n m / Z f Z u g R. X|./ u A 2.].| b s f | |.+.g b ( ^.`.].].'.`.'.'.[.].]. X`. X X X].`. X[.[. X X X X%X X%X*X X",
+"`.U.!./.U.U.U.U.P.Q.P.P.U.P.P.FXDXVXBXnXnXNXvXvXcXcXcXcXD.F w w 5 n A J I H n 5 , o = :.vXvXNXNXvXNXvXhXeXC.5.R y.H.P.y.P.P.P.P.U.P.U.U.U.U.U.`.U.`.U.U.`.}.`.` y n +.`.3.u g u 3.|.@.b n ..|.]./ n n n b b n b b b 9 j.)./ f f n n u i u N 9 O.E.E.`.+.A u i ,.{.].|.2.h n n 8 m p i 9 h g.]. X@X .u f #.~.q.g Z e @.|.3.u i ` ].`.'.{.'.'.].'.].[.].]. X X[.]. X]. X].[. X X X X X%X X X*X",
+"U.U./.U.U.U.H.P.Q.U.P.P.P.Q.P.FXDXFXZXcXnXcXvXvXcXBXvXcXMXS.M r w 5 b A n n 4 : X @ c hXvXvXNXvXNXNXnXhX0XC.5.R s.y.P.P.y.P.P.P.P.P.P.P.U.U./.U.!.!.OX/.~.E.U.` n j #.'.T.j j k j.#X+.C 9 ` @X}.] g 9 j g n b g n n s x.E.` 9 j Z 9 j C S { k.{.'.Q.`.#.j 9 C <.`.'.!.{.k.^ k 9 n i g ^ 0.|.|. X@X{ g g 2.:Xk.S a g J.`.#.C u | `. X'.'.[.[. X'.].`.`.`.'. X X'.[. X X X X X X X X X X%X%X%X",
+"U.U.U.U.U.Y.P.P.Q.P.Q.I.U.P.P.FXFXVXZXBXnXnXvXvXcXcXcXcXcXbXM.l w e 8 8 n 4 3 X % q A.vXNXNXNXNXvXNXnXhXeXC.5.Y y.y.P.s.P.y.H.y.P.P.U.P.U.U.U.U.U.!.K.`./.E.^.E.{.`.].^.[.{.@X_..X'.'.].].`.oX[.`.].#X}.'. X!.'.'.!.`.^.OXE.`.~.E.`.`.!.`.].!.^.`.'.~.{.).].(.^.^.{. X`.}.@X(.j.j.h.R._. X`.'. X X{.|.|. X X].&X}. X|.XX`. X_.].oX'.[.'.[.[.`.`.'.'.].'.'.'.'.[.'.[. X[. XoX%X X X%X X%X%X%X",
+"!.Q.Q.Q.Q.Q.Q.P.P.Q.Q.P.P.P.H.FXDXZXBXnXnXcXNXvXNXvXNXvXNXMXzX>.M < e y 4 > & O : ~ lXcXcXNXNXNXNXNXvXhX0XC.5.T y.a.Y.s.y.y.y.P.s.P.P.P.P./.U.U.!./.U.!.~.!.!.`.`.`.`.`.`.`.`. X'. X'.[.`.'.`. X`.].].'.'.].'.`.`.`.`.'.`.`.'.'.`.`.U.`.U.`.!.`.`.`.`.'.'.'.'.'.].'.`.`.[.`.].'.'.].'.'.`.{.'. X[. X X X X[. X X[.[.[. X X X[.[.'.`.].].`.].].'.].'.[. X'.[.`. X X X X X X X X X X%X%X%X*X%X",
+"Q.!.Q.Q.P.P.P.P.I.P.P.P.P.P.P.FXIXZXZXnXnXcXNXcXNXNXNXNXNXNXNXhX*.r 3 4 3 : O # c wXBXcXcXcXNXNXvXvXzXhX0XC.5.Y y.s.P.s.H.P.P.y.P.P.P.P.P.P.P.U.!.P.!.!.!.!.~.].!.`.`.`.`.`.[.`.'.'.'.'.`.`.[.`.!.].`.`.`.`.`.`.`.`.`.'.`.'.`./.U.`.`.`.`.!.`.`./.`.`.`.'.'.'.'.`.`.].'.'.].`.`.`.`.`.'.'.].].'.[.]. X[.[. X X[. X X[. X[. X]. X]. X X`.'.'.{.`.'.].[.`.[.].[.'.].[.[. X X X X X X X X%X*X%X",
+"!./.Q.Q.Q.P.P.P.Q.s.Q.P.P.P.P.ZXDXZXBXnXnXnXcXcXNXvXvXNXNXNXvXcXfXB r < , & o - >.nXcXcXNXNXNXNXvXvXvXhX0XC.5.Y y.s.y.s.y.s.y.P.P.s.P.P.P.P.U.U.U.!.U.!.!.!.!.!.!.`.`.`.`.`.`.].`.`.`.`.`.`.`.`.`.`.`.`.`.`.].!.`.`.!.'.`./.!.`.`.`.`.U.`.`.`.`.`.`.`.`.'.`.!.].]. X X!.`.!.].`.`.`.`.`.`.`.`.'. X X[. X[. X[. X X[.[.|. X X X]. X`. X X'.'.'.'.`.`.'.'.`.`. X X]. X X[. X X X X X%X%X%X%X*X",
+"/./.P.!.Q.P.P.P.s.Q.Q.P.U.P.P.ZXDXZXZXBXnXnXNXcXNXNXvXvXvXvXNXNXcXqXM > & @ O c sXnXcXcXNXNXNXNXvXvXvXhX0XZ.5.Y P.s.Y.a.H.P.P.P.P.P.P.P.P.P.U.P.U.U.U.!.!.!.!.!.!.`.!.`.`.!.'.`.`./.`.`.!.].`.`.`.`.`.!.`.'.'.'.'. X!.'.`.`.`.`.E.`.`.`.`.U.'.!.`.`./.`.`.`.`.`.!.[.'.'.'.'.`.`.`.`.`.`.`.`.'.'.[.[.].]. X[. X X[. X].[.].`.`. X]. X[.]. X'.'.'.`. X`.].`.[.`.'.'.].]. X X X X%X|.%X X%X X*X",
+"/./.U.U.U.P.P.P.P.P.P.s.P.P.P.ZXDXZXZXnXMXvXvXvXMXvXvXNXvXNXNXNXcXMXN.r & + - b.NXNXNXNXvXNXvXNXNXcXvXhX0XC.5.Y y.s.Y.y.P.y.P.P.H.Q.P.P.P.P.P.U.U.U.U.U.U.!.!.!.`.!.U.`.`.`.`.!.`.`.`.`.`.!.`.`.`.`.!.`.`.`.`.`.'.`.`.`./.`.!.`.!.`.`.`.`.`.E././.E.U.`.!.'.`.!.'.`.'.`.'.`.`.'.`.`.`.`.^.`.'.'.'.[.'.'.'. X X'.].[.'.`.'. X'.'. X'. X].'. X'.'.`.'.`.`.'.`.].'.].[.[. X X X X X%X X%X%X%X%X",
+"U.!.U.U.U.U.P.P.U.P.P.U.K.P.P.FXDXFXBXnXMXNXvXvXMXMXvXNXNXNXNXvXnXNXbX-.& # c fXNXvXNXvXNXNXNXNXNXvXvXhX0XC.5.Y y.y.P.s.y.H.P.y.y.P.s.P.P.U.P.P.P.U.U.U.!.U.!.!.!.U.`.`.!.`.U.`.!.`.U.`.`.`.`.!.U.`.!.!.`.`.`.`.`.`.^.`.E.`.`.`.`./.`.!.`.U./.`.`.`.`.`.`.`.`.`.!.'.'.'.^.`.`./.`.`.E.`.'.'.'.'.'.`.].'.[.'.`. X[.].`.].`.'. X'.'.`.[.'. X'.'.'.'.].].'.`.'.].'. X[. X[. X X X#X X X X%X%X%X",
+"!.!.U./.U.U.U.P.U.P.H.U.P.P.P.ZXDXZXBXMXMXMXvXvXvXNXNXNXNXNXNXNXcXcXnXfXl t M.MXNXNXNXNXvXvXvXNXNXMXlXjX0XC.5.Y P.s.y.Y.P.y.y.P.P.H.P.P.H.Q.Q.Q.U.P.U.U.U.U./.U.U.!.!.!.!.!./.`.!.!.!.`.U./.!.!.!./.`.E.`.U.{.!.`.`.`.`./.!.'.`.`.`.`.!.`.`.`.`.`./.U.'.!.`.`.`.'././.`.`.`.`.'.'.`./.`.'.'.[.`.`.`.].`.`.`.[.'.].].'.`.].[.`.].].'.]. X X'.'.].].`.`.].].'.].'.[. X X X X X X X X X%X%X%X%X",
+"U.!.U.U./.U.Q.U.P.U.P.P.P.H.Y.FXDXZXVXBXMXMXvXvXMXNXNXvXNXNXNXcXNXcXvXbX2XE uXNXNXNXvXvXvXvXNXNXMXzXzXjX0XC.5.Y y.a.s.y.s.P.y.H.y.P.y.P.P.H.Q.Q.P.P.U./.U.!.!.U.!.!.U.`.!.!.U.U.!.!.!./.!.!././.!.`.!.`.U.`.!.`.`.`.`./.!.'.!.`.`.U.`.`.`.U.`.!.`.`.`.`.`.`.!.`.`.`.`.}.U.`.`./.`.`.`.`.'.[.'.'.].'. X`.`.].`.].'.`.[.[.`.`.`.].[.[. X X'. X'.'.].`.`.`.`.`.[.'.[. X X X X X X X|. X X X%X|.",
+"!./.!.!.U.U.U.U.U.U.f.y.W.Q.H.AXZXSXZXcXnXcXvXvXcXcXcXBXzXnXnXzXcXcXnXvXvXwXnXnXNXcXcXnXvXnXvXnXzXzXzXdX0Xm.:.T a.H.a.s.s.Y.H.s.y.y.P.P.Y.P.P.U.P.Q./.U.U.U.U././././.~.U./.U.U.U.U.U.!./.!.~.`.`.U.U.`.`.!.!.`.`.`.`.`.`.`.`.!.`.`.`.U.`.!.`.`.`.!.U.`.`.!.`.`.`.`.`.`.`.`.'.`.`.`.`.`.'.'.'.'.].[.'.].'.`.`.`.].`.'.].].`.`.`.`.'.'. X'.'. X`.'.`.`.'.`.`.'.'. X X X X X X X X X X$X=X%X%X",
+"/.!.!.!.`.U./.U.U.U.I.K.H.H.K.AXZXFXAXnXnXvXvXcXvXzXcXcXvXvXvXvXNXnXvXvXvXvXvXvXvXvXnXNXvXvXvXvXnXcXzXdXqXn.! T i.y.s.s.s.y.s.s.y.P.P.s.s.U.P.P.Q.Q.U.U.U.U./.P./.Q.U.U.U.U.P.U.U.U.U./.!.!.!.!.U.`.U.!.U.`.'.!.!.!.!.!.!.!.`.`.!.`.`.`.`.`.`.!.!.`.`.`.`.E.!.`.`.`.`.`.`.`.'.`.`.`.^.`./.}.'.`.'. X`.`.].'.].`.`.`.'.`.].`.].`.`.].].'.'.'.`.].`.`.`.`.'.'.'. X[. X[.oX X X X X X%X%X X&X%X",
+"U.!.!.!.!.!.U.U.U.H.P.U.H.Q.P.ZXAXAXZXnXzXzXzXvXvXvXvXvXvXvXvXvXnXvXvXvXvXvXvXvXzXMXzXvXvXvXvXvXvXvXxXaXG.b.! P r.P.a.y.y.s.s.s.P.s.y.P.y.s.P.P.P.Q.I.U.U.U.P.U.!.U.U.!.U.U.U.U.U.U.U.U.!.!.!.!.U.!.!.!.!.!.`.!.!.`.`.!.!.`.!.`.`.`.`.E.`.!.U.`.`.`.U.U.`.`.`.`.`.`.`.`.`.`.`.`./.`.`.`.`.`.'.`.`.[.`.`.`.'.`.].].`.`.].`.`.`.].'.'.'.'.'.`.`.`.`.`.`.`.'.`.'.'.'. X X X X X X#X X X X=X%X*X",
+"/.!.U.!.!.!./.U.U.U.Q.U.P.f.Q.nXNXnXlXfXsXaXaXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXsXsXsXsXyX5Xb.Y P z s.a.a.y.s.s.s.s.s.s.s.y.P.y.H.P.P.P.U.P.P.P.U.P.Q.Q.P.!.P.P.P.P.P.P.H.U.P.!.U.!.!.!.!.!.`.!.!.!.~.!.!.!.!.!.`.!.!.!.!.!.!.E.`.`.K.`.`.`.!.!.`.`.].`.`.`.`.`.`.`.`.`.`./.^.`.`.`.].`. X'.'.].'.].'.{.].].`.`.`.].`.'.{.].`.'.`.`.`.`.`.`.`.`.`.'.[. X[. X X X X X%X X|.%X%X*X",
+"!.U.!.!.!.!./.U.U.U.Q.U.Q.s.W.lXfXaXeX2XZ.A.A.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.A.V.C.C.C.! U L z z u.i.e.a.a.y.y.y.s.s.P.y.s.P.P.P.P.P.P.P.P.Q.Q.P.P.Q.P.P.P.U.P.P.P.P.P.U.P.!./.U./.!.!.!.!.!.!.!.U.!.!.!.!.`.`.`.`.`.!.`.`.!.`.!.U.`.U.`.`.`.!.`.`.`.`.`.`.'.[.!.`.U.!.`.`.`.'.`.'.'.[.[.'. X'.'.'.`.'.`.`.].`.`.`.'.`.'.`.`.`.`.!.`.`.`.`.`.[.'.'.'. X X X X X X X X%X=X%X*X",
+"/./.!.W.W.U.!.U.U.U.!.P./.P.K.uX5X,Xn.:.Q ! ! Q Q ! Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q ~ R T x L z K I e.d.e.y.a.a.y.y.y.p.P.s.s.P.y.P.P.P.P.P.P.P.Q.P.P.P.P.P.P.P.P.P.P.P.U.P.U.P.U.U.U.U.U.!.!.U.U.U.U.!.U.!.!.!.U.`.`.!.`.`.W.`.!.`.`.U.`.`.`.`.!.`.].`.].'.`.'.`.'.`.`.`.!.`.`.'.`.`.].'.'.].'.].'.'.'. X`.`.].`.`.`.`.'.].`.`.`.`.`.`.`.`.'.`.].'.'.'. X'. X}. X X X%X X%X%X%X",
+"!.!.!.!.!.!./.U./.U.U.!.!.U.s.+Xc.! Y P x x x z x x x x x x x x x x x x x x x x x x x x x x x x x x L x z K ..h.s.i.y.i.a.a.i.y.y.y.s.s.s.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.U.P.U.Q.U./.U.U.U.U.U././.U.U.!.!.U.!.!.!.~.`.`.!.!.`.!.!.!.`.U.`.!.`.`.].`.].'.'.].`.'.'.!.U.U.`.`.U.`.`.`.].`. X'.'.'.'.'. X'.`.`.`.`.`.`.`.`.!.`.`.`.`.`.`.`.'.'.'.`.`.].{.`. X]. X}. X X|. X=X=X%X*X",
+"/.!.!.!.!.U.!./.U.U./.Q.y.K.f.W.J.! x x x x L x x z x x x x x x x x z x x x x x z x x x x x z z x x z v x o.u.p.i.r.i.i.a.a.y.i.y.y.P.y.Y.P.P.P.P.P.H.P.P.P.H.Q.y.P.P.s.P.P.P.P.P.P.P.P.P.P.P.P.U.U.U.U.U.U.U.!.U.U.W.U.U.!.U.!.!.!.`.!.!.!.`.W.U.`.`.!.`.`.`.].`.[.`.`.'.[.'.`.`.`.E.`.`.`.}.`.'.'.'. X X X'.'.`.'.'.].`.].`.`.`.`.`.`.`.`.!.`.`.`.'.'.'.'.].'.].].`. X]. X X X X%X%X%X%X*X",
+"!.U./.U.U.U.U.U.!.U.!.U.Q.P.P.P.W.y.Q.y.P.P.P.s.P.y.P.P.s.P.s.s.p.y.s.a.t.e.e.w.w.w.w.e.w.e.e.e.e.i.y.i.r.t.t.t.t.t.t.t.y.a.a.a.s.s.s.P.P.P.P.P.P.P.y.P.P.H.s.P.U.s.s.Y.U.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.!.U.U.!.Q.Q.K.!.U.!.!.!.!.!.`.!.!.!.!.`.`.`.E./.`.`.`.`.'.!.].'.`.].].`.).`.).!.`.`.`.`.`.].]. X].].].'.].'. X[.`.`.`.`.`.`.`.`.`.`.!.`./.'.!.].`.`.`.].'.`. X[. X]. X X X X X%X*X%X",
+"!.U.!.U./.U./.U.U./././.Q.P.P.P.f.Q.y.Q.P.P.P.P.s.P.s.y.y.y.s.s.y.y.d.a.t.e.e.w.w.w.w.w.w.e.e.e.w.p.t.r.r.r.t.t.r.t.t.t.i.a.a.y.s.s.s.s.y.y.y.P.P.s.P.P.H.s.P.s.s.P.s.s.P.y.P.P.P.P.P.P.P.P.P.P.P.P.U.P.P.U.!.P.!.U.!.Q.Q.U.!.!.!.!.!.!.`.K.`.!.`.U.`.`./.`.!.`.'.`.'.].].!.`.`.!.`.!.(.(.`.`.`.`.'.`. X X[. X].]. X'.'.`.].`.`.`.`.`.`.`.'.'.`.'.'.[.`.].'. X`.'.[. X].'. X X X%X X*X%X&X*X",
+"U.U.U.U.U.!.U./.Q.U.U.U.Q.P.P.P.s.H.Q.y.P.y.y.P.P.s.P.s.P.s.s.s.a.a.i.y.t.e.e.e.w.w.e.w.e.w.e.e.r.i.t.t.t.t.t.t.t.t.t.t.y.a.y.s.s.a.s.y.y.y.P.y.P.y.Q.P.y.P.s.P.s.s.s.s.s.U.y.P.s.P.P.P.P.P.P.P.P.P.U.P.Q.P.P.!.U.Q.!.P.!./.P.!.!.!.`.W.U.!.E.!.K.U.`.`.`.`.`.`.'.`.'.`.`.`.`.`.`.`.`.`.!.`.`.`.[.'.'.`.'. X].'.].'. X'. X`.].[.{.!.`.`.`.`.`.`.`.`.'.'.`.'.`.[.[.[. X X X X X&X X*X%X%X%X%X",
+"!.!.U./.U././.U.!.U.U.U.Q.P.P.P.P.H.y.Q.P.y.P.H.P.U.s.P.y.s.y.r.a.a.y.i.e.e.e.e.e.w.i.e.w.e.e.e.e.i.t.t.t.t.t.t.t.t.y.t.i.a.a.i.a.s.s.y.s.y.s.H.y.Q.y.H.P.y.P.y.P.s.s.y.s.s.s.Y.s.H.P.P.P.P.P.P.P.P.P.P.P.Q.P.U.U.U.U.U.U./.!.!.).!.!.!.!.!.~.`.`.`.U.`.`.U.`.`.`.`.].`.].'.].`.`.`.`.`.`.`.`.`.`.].[. X X'.'.'.[.'.'.'.[.`.'.`.].`.`.`.`.!.].`.`.'.'.'.'.].].'.'. X X X X X X X%X X%X%X%X%X",
+"!.!.U.!.U././.U.Q.U.P.Q.Q.P.P.P.Q.y.y.P.y.H.y.P.P.P.s.s.Y.s.y.s.s.a.y.i.i.t.e.e.e.e.e.e.w.e.e.e.e.r.t.t.t.t.t.t.t.i.a.a.a.y.a.a.i.a.s.s.s.s.p.P.P.y.P.P.y.a.P.y.s.y.s.s.s.Y.s.a.H.P.P.y.P.P.P.P.y.Q.P.P.P.P.Q.Q.!.P.!.!.Q.!.!.!./.!.~.U.!.!.!.!./.E.`.`.U.E./.'.`.`.`.`.'.].`.'.`.`.`.`.`.`.`.`.`.`.].].`.[.`.`.'.'.].`.`.'.].`.`.'.].{. X`.[.'. X`.].[.].].}.].[.]. X X X X X*X X*X X>X%X*X",
+"`.!./.!.!././.U./.U.!.U.Q.P.P.P.H.y.P.s.P.y.P.y.P.y.P.P.P.s.y.s.a.s.i.y.t.t.e.e.w.e.e.e.w.e.e.e.e.t.t.t.t.t.t.t.i.y.a.a.a.a.a.y.a.a.i.s.s.s.s.s.y.P.y.Y.P.y.y.i.y.s.s.s.s.s.s.H.s.s.y.H.y.P.y.P.Q.P.P.P.P.Q.P.P.P.!.U.!.!.!.Q.!.U.!.!.!.!.!.!.!./.`.U.U.`.`.`.`.`.`.`.`.`.`.'.].].].].].{.`.`.`.`.`.].].`.[.].`.`.`.'.].'.].'.'.].].'.'.].[. X].[.[. X X].'.]. X X[. X X%X X X X*X X X*X*X*X",
+"U.!.U./.U.`.U.U./.P.P.P.Q.P.P.P.y.y.P.H.P.y.H.P.y.y.s.s.s.s.y.s.a.s.i.i.e.t.e.e.e.e.e.e.i.i.e.e.e.e.t.t.t.e.t.t.y.i.y.a.s.a.a.a.y.i.s.i.s.s.s.s.y.s.s.s.y.s.y.y.s.a.s.s.s.s.a.P.y.P.y.P.P.y.s.P.H.H.P.s.P.P.P.Q.U.P./.U.P.!.!.!.!.!.!.U.!.!.!.!.`.!.U.`./.`.`.`.`.`.`.'.].'.'.`.'.'.'.].].`.`.`.`.`.`.`.].`.`.`.`.`.].].].].`.].].`. X'.]. X X[. X X X[. X[.]. X[. X%X|. X%X*X X=X X*X X#X*X",
+"`.U./.!./.U.U.U./././.P.P.P.P.P.P.P.H.s.y.P.P.y.P.P.U.s.s.y.y.s.a.a.y.i.t.e.e.e.e.e.e.i.e.e.t.e.e.e.t.t.t.t.t.t.i.y.a.a.a.s.a.a.y.i.y.p.s.y.y.s.y.s.Y.s.s.s.y.a.i.i.a.s.y.s.y.y.y.y.y.y.y.y.P.P.s.s.P.P.P.H.Q.Q.P.P.P.U.P.U.Q.K.U.K.!.U.U.!.U.!.!.!.`.U.`.`./.`.`.`.{.].'.'.].'.'.'.'.{.`.{.].`.`.].`.`.`.`.`.`.`.{.].'.]. X X[. X]. X X[. X[. X X[. X[. X X X X X X|. X X X X=X X X*X>X*X*X",
+"!.`.`.!.!.Q.U.!.!.U./.P.!.P.P.P.P.P.s.P.P.P.s.P.s.I.s.P.s.a.y.e.y.e.t.t.e.u.e.a.i.i.e.e.e.e.e.a.i.i.a.e.e.t.t.a.a.s.s.a.a.y.a.y.i.y.a.a.t.t.s.s.p.s.y.s.s.y.s.s.y.y.y.y.y.i.i.y.y.a.a.y.s.s.s.s.s.Y.y.P.P.P.P.U.U.H.U.U.P.U.U.U.U.U.P.U.!./././.!.!.E.!.`.!.`.`.`.`.`.`.'.'.`.[. X'.].'.'.'.].].`.`.'.`.`.'.'.'.'.'.`.'.'. X'. X'.'. X X X X%X X XXX X X X X%X|. X X X X X X*X X*X X*X*X*X*X",
+"`.`.U.U.!.!.U.!./.U.U.!.Q.P.P.P.P.P.P.P.s.s.P.s.P.P.P.s.s.y.y.y.a.a.t.t.e.a.e.e.e.i.i.i.i.i.e.e.i.i.i.i.e.t.t.a.a.a.a.a.a.i.a.a.y.a.i.i.i.i.i.s.s.s.y.y.s.y.s.s.y.i.i.y.y.y.y.y.y.y.s.a.y.s.P.y.P.s.P.P.P.y.P.P.P.U.U.U.U.U.P.U.H.U.U.U.P.!.U./.!.!.U.`.!.`.!.`.`.`.`.`.!.`.'.[.`. X'.].].].'.].'.'. X`.'.!.`.`.`.`.'.'.'. X[.'. X X X'. X X X X#XXX%X X X X|. X X X*X X X>X X X X*X%X%X*X*X",
+"U.`.~.U.!.!.!.!.U.U.U.P.P.P.P.P.P.P.s.P.P.P.P.s.s.P.s.s.s.s.y.y.a.y.t.t.a.e.e.a.e.i.e.e.e.e.e.e.i.i.a.a.e.y.t.y.y.a.a.a.y.a.a.a.y.y.y.i.i.s.a.a.p.s.i.i.i.s.s.s.y.y.y.i.a.a.e.a.a.a.a.s.a.y.y.s.P.Y.s.s.P.s.P.P.P.P.U.U.U.U.U.U.U.P.U.U.U.U.U././.U.!.!.!.`.`.`.{.!.`.`.'.`.'.].'. X]. X'.[.].`.'.'.[.'.'.`.`.`.'.[.]. X X]. X X X X X X X X X#X X X X X X X X X*X X X X X X*X*X X%X%X*X*X*X",
+"E.`.!.~.!.U.!.!.!.U.!.U.U.U.P.P.P.P.P.P.P.P.P.P.P.s.P.s.P.s.y.i.y.e.t.t.e.a.a.e.e.e.e.e.e.i.e.e.i.i.e.i.a.e.t.a.i.i.a.a.a.a.a.y.e.i.y.i.i.s.a.y.i.t.s.y.s.p.s.i.i.y.i.s.i.y.y.y.s.a.a.a.a.s.y.s.y.y.s.y.s.P.P.P.P.P.U.P.H.U.P.U.U.U.P./.U.U.U.!./.U.!.!.!.!.!.U.U.`.!.`.'.'.`.`.'.'.'.].[.[.[.[.'.'.'.'.].].].`.'.'. X X X X[. X X X X X X X%XXX%X X%X X%X%X X%X X X>X>X*X X X X%X%X%X*X%X*X",
+"!.!.!.`.!.!.!.!.!.U.!.U.P.!.P.P.P.Q.P.Q.Q.P.P.P.P.y.P.s.s.s.y.y.a.a.e.i.a.e.e.a.i.e.e.e.e.e.a.e.e.e.e.a.i.y.e.t.y.a.a.a.i.y.y.i.a.a.e.y.e.a.a.i.t.t.t.t.r.i.s.i.t.t.s.i.i.s.t.t.i.i.i.t.i.y.y.y.s.s.s.s.s.P.P.P.P.U.U.U.U.P.P.U.U.U.P.!./.U.U.U./.U.K.U.U.!.!.`.`.!.`.!.`.`.`.`.`. X`.[.`.[.[.`.'.'. X].'.].].'. X'. X X X X X X X X X X X X X X X X X X X X=X%X X X*X X%X X%X%X%X%X*X*X%X*X",
+"!.`.!.!.!.!.!.!.U.!.U./.U.!.U.U.Q.P.P.P.P.P.I.P.P.P.P.s.s.y.y.y.a.y.a.y.a.a.a.e.a.e.e.e.a.e.i.i.e.e.e.a.e.t.i.a.e.a.t.a.t.y.y.a.a.e.y.e.y.i.y.i.t.t.r.t.t.t.t.t.t.t.r.r.t.r.t.t.s.i.r.s.i.y.a.y.s.p.s.s.s.P.s.P.P.P.P.U.U.U./.!.U.U./.U.!.U.U./.U./.!.U.!.U.!./.!.!.!.`.!.`.`.`.`.`.].`.`. X'. X X`. X X X'. X X X X X'. X X X X X X}. X X X X X X X X X X%X*X X*X X X*X%X%X X%X%X%X*X%X*X*X"
+};
diff --git a/images/checkbox2hilite.xpm b/images/checkbox2hilite.xpm
new file mode 100644 (file)
index 0000000..91b3509
--- /dev/null
@@ -0,0 +1,311 @@
+/* XPM */
+static char *checkbox_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"190 70 235 2",
+"   c #1D3E66",
+".  c #1C3D6B",
+"X  c #1D3E71",
+"o  c #243668",
+"O  c #223D65",
+"+  c #233D6B",
+"@  c #283E65",
+"#  c #293D6A",
+"$  c #233E72",
+"%  c #293D71",
+"&  c #313F6E",
+"*  c #0C4702",
+"=  c #0D4A02",
+"-  c #0E5302",
+";  c #114B09",
+":  c #164E12",
+">  c #174D19",
+",  c #184B17",
+"<  c #115F02",
+"1  c #116302",
+"2  c #126B02",
+"3  c #1E6B1A",
+"4  c #147402",
+"5  c #157A02",
+"6  c #1B780C",
+"7  c #1F663C",
+"8  c #216530",
+"9  c #164362",
+"0  c #15456E",
+"q  c #1D4165",
+"w  c #1C426B",
+"e  c #1E486E",
+"r  c #1C4371",
+"t  c #1E4378",
+"y  c #1C4973",
+"u  c #1D487A",
+"i  c #224065",
+"p  c #22426B",
+"a  c #22496A",
+"s  c #2A4067",
+"d  c #2A416D",
+"f  c #234372",
+"g  c #224678",
+"h  c #234A73",
+"j  c #244D7B",
+"k  c #294372",
+"l  c #28467C",
+"z  c #294972",
+"x  c #2A4A7B",
+"c  c #25527B",
+"v  c #2A507B",
+"b  c #2A714A",
+"n  c #244E80",
+"m  c #2D4E81",
+"M  c #205381",
+"N  c #205A80",
+"B  c #2B5680",
+"V  c #2C5C85",
+"C  c #2C5D8A",
+"Z  c #2F5F90",
+"A  c #304B80",
+"S  c #335789",
+"D  c #325C85",
+"F  c #325C8C",
+"G  c #3A5C89",
+"H  c #375D90",
+"J  c #266588",
+"K  c #2A6086",
+"L  c #2C618B",
+"P  c #2E698B",
+"I  c #2E6291",
+"U  c #2B6894",
+"Y  c #2F7098",
+"T  c #336087",
+"R  c #31628D",
+"E  c #336192",
+"W  c #346994",
+"Q  c #346A99",
+"!  c #3C6594",
+"~  c #3B6B96",
+"^  c #367A9F",
+"/  c #3B749F",
+"(  c #377AA4",
+")  c #377BA8",
+"_  c #3C74A3",
+"`  c #3F75A9",
+"'  c #3B79A3",
+"]  c #3D79A9",
+"[  c #40779E",
+"{  c #42789F",
+"}  c #4275A5",
+"|  c #4476A9",
+" . c #417AA5",
+".. c #427AAA",
+"X. c #4C79A2",
+"o. c #4878A9",
+"O. c #477CB2",
+"+. c #168402",
+"@. c #178902",
+"#. c #199303",
+"$. c #1A9803",
+"%. c #1E9E09",
+"&. c #1CA203",
+"*. c #1DAB03",
+"=. c #1EB103",
+"-. c #2C9333",
+";. c #27AE14",
+":. c #20B705",
+">. c #20BB03",
+",. c #2BAE22",
+"<. c #3BBF35",
+"1. c #369E55",
+"2. c #318E61",
+"3. c #328C7A",
+"4. c #3C9E69",
+"5. c #21C403",
+"6. c #22CD03",
+"7. c #2CCF13",
+"8. c #23D303",
+"9. c #25DA04",
+"0. c #2ADB0A",
+"q. c #2DD711",
+"w. c #3EC63F",
+"e. c #3DC83D",
+"r. c #27E304",
+"t. c #28E604",
+"y. c #28E904",
+"u. c #2CED0A",
+"i. c #29F304",
+"p. c #2EF20B",
+"a. c #2BF905",
+"s. c #2EF90A",
+"d. c #37E41E",
+"f. c #37EB1D",
+"g. c #33F512",
+"h. c #3CF91D",
+"j. c #449F72",
+"k. c #4CB369",
+"l. c #5DBA66",
+"z. c #4CEF3A",
+"x. c #54F145",
+"c. c #59F244",
+"v. c #33928D",
+"b. c #3E9A92",
+"n. c #3C83A3",
+"m. c #3E8CB3",
+"M. c #3F99A6",
+"N. c #3396B8",
+"B. c #2E92CD",
+"V. c #3593C6",
+"C. c #3594CE",
+"Z. c #3598CE",
+"A. c #3D96C7",
+"S. c #3896CE",
+"D. c #3B99CE",
+"F. c #3696D0",
+"G. c #3599D1",
+"H. c #359DD9",
+"J. c #3A96D0",
+"K. c #3C99D0",
+"L. c #3B9BDA",
+"P. c #3CA1D5",
+"I. c #3EA0DD",
+"U. c #4182A8",
+"Y. c #4B84AF",
+"T. c #4385B2",
+"R. c #438BB4",
+"E. c #448CBA",
+"W. c #4B85B3",
+"Q. c #4A8BB3",
+"!. c #4B8CB9",
+"~. c #4597BF",
+"^. c #4A91B4",
+"/. c #4A91BA",
+"(. c #5385B8",
+"). c #518CB5",
+"_. c #518CBB",
+"`. c #5090BD",
+"'. c #5C97BF",
+"]. c #4095CC",
+"[. c #429BCD",
+"{. c #4B96C2",
+"}. c #4C9DC6",
+"|. c #499DCD",
+" X c #4395D3",
+".X c #429CD1",
+"XX c #429BD8",
+"oX c #489ED3",
+"OX c #499FD8",
+"+X c #518BC0",
+"@X c #5293C1",
+"#X c #539BC3",
+"$X c #559DCD",
+"%X c #5B99C2",
+"&X c #5D9CCF",
+"*X c #539ED1",
+"=X c #539DD9",
+"-X c #5A9ED2",
+";X c #4AA1CC",
+":X c #45A0D3",
+">X c #4BA1D4",
+",X c #4BA3D8",
+"<X c #4DAAD4",
+"1X c #4CAADB",
+"2X c #53A4CD",
+"3X c #55A9CE",
+"4X c #5CA3CD",
+"5X c #5FAECF",
+"6X c #53A5D6",
+"7X c #55A6D8",
+"8X c #56A8D6",
+"9X c #55A8D8",
+"0X c #5AA4D4",
+"qX c #5BA4DA",
+"wX c #5BAAD4",
+"eX c #5BAAD9",
+"rX c #53B1D5",
+"tX c #57B3DC",
+"yX c #5DB2DB",
+"uX c #4CADE4",
+"iX c #55A7E3",
+"pX c #55AAE0",
+"aX c #5CA7E1",
+"sX c #5BAAE1",
+"dX c #60A4CE",
+"fX c #62A4D3",
+"gX c #61A5DB",
+"hX c #61A9D4",
+"jX c #62ADDB",
+"kX c #68AADC",
+"lX c #62B0D7",
+"zX c #65B0DC",
+"xX c #64A6E0",
+"cX c #64AAE0",
+"vX c #64B0E2",
+/* pixels */
+"oX.X.X.X.X.X.X[.[.K..XK..XK.K..X.XK.K.K..XK..XD..X.X.X.X.X.X.XoXoX.XoXoXoX>X>X>X>X>X>X>X>X>X6X>X6X>X6X6X6X>X6X>X6X6X6X6X6X6X6X6XOX6X6X6X6X6X6X6X6X6X6X6X6X6X2X<X6X6X>X6X6X6X6X8X0X7XeX9X9XeX9XeXeXeXeXeXeXeXcXeXjXqXeXqXeXqX8XeXeX7XeXjXeXeXeXjXeXjXjXjXjXjXeXjXjXjXjXhXjXkXzXjXzXjXkXzXzXjXzXzXzXzXkXzXzXzXzXzXzXhXjXeXjXjXeXjXjXeXeXeXsXeXjXjXeXsXeXeXeXeXeXqXsXeXjXeXjXjXeXjXjXjXjXjXjXzX",
+"oXoX.X.X.X.X.X.X.XD.K..X.XK..XK.K..XD.XXD.D.D..XK.[..X.X.X.X:X.X.X.X.X.XoX.X.X>X;X>X>X>X>X>X>X6X>X6X>X>X>X6X|.6X6X>X6X>X6X6X6X6X7X6X6X6X6X8X6X6X6X6X2X6X6X6X6X6X6X6X6X6X6X6X6X8X7X7XeX9XeX9X9XeXeXeXeXeXeXeXeXeXeXeX9XeXwX8X0XqX0XeXeXeXjXeXjXeXjXeXjXeXyXjXjXjXjXkXjXjXjXjXlXkXjXjXzXzXjXzXzXzXzXzXzXzXzXzXzXlXjXeXyXjXjXeXjXeXeXjXeXeXeXeXeXeXcXeXeXeXeXeXeXeXeXeXeXeXeXeXvXeXjXeXzXjXzXjX",
+"oXoXoXoX.X.X.X.XK..XK.K.K.K. XK..XK.D.K.D..XD..X.XD..X.X.X.X.X.X.X.X.X.X.XoX.XoXoXoX>X>X>X>X>X>X>X>X>X6X>X6X6X6X6X6X6X6X>X>X6X6X,X6X6X6X6X6X6X8X6X8X6X6X6X8X6X6X6X6X6X6X6X6X6X7X7X8X9XeXeXeXeXeXjXeXeXgXeXeXeXeXeXeX9XeX9XeX8X8X9XeXeXeXjXeXeXeXjXeXjXjXjXjXjXjXjXjXjXkXjXjXzXjXlXjXzXzXcXjXzXzXzXzXzXjXjXzXjXjXjXjXeXjXeXeXjXjXjXeXeXeXeXyXeXeXeXeXeXeXeXeXeXcXeXeXcXeXjXeXjXjXjXjXjXzXzXzX",
+"oXoX.XoX.X.X.XD.[..XK.K.K.D.D.D.D.D..XK.D.D..X.X.X.X.X.XD..X.XD.K..X.X.X.X.X.X>X.XoXoXoX>X>X>X>X>X6X>X>X6X>X|.6X6XOX6X>X6X6X6X>X6X6X6X6X6X6X8X6X6X6X6X6X6X6X6X6X6X6X6X7X6X6X7X7X7X7XeX8XeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeX9X9XeXeX9XqXeXeXeXjXjXeXjXeXjXjXjXjXjXjXjXjXjXjXkXjXjXkXjXjXjXzXzXzXzXzXkXjXjXjXhXjXyXeXjXjXeXeXjXeXeXwXeXjXeXeXeXcXeXeXeXeXeXeXeXeXeXeXeXyXeXeXjXvXjXjXjXjXzXjXzX",
+">X:XoXoX.X.X.X.X.X[.K.D.K.K.D.K.K.D.K.D.K.D..XD.D.:X.X.X.X.X.XD..XK..X.X.XK..X.X.X|.>XoXoXoX>X>X>X>X>X>X>X6X6X>X>X6X6X6X6X6X6X>X6X6X6X6X6X8X8X6X8X6X6X8X8X6X6X6X6X6X7X6X7X8X7X7XqX8X8X9XeXeXeXgXeXeXeX9XeX9XeXeXeXeX9X9X7X8X8X9X9XeXeXeXgXeXeXjXjXjXeXyXeXjXvXjXzXzXjXjXkXjXjXzXzXjXjXzXzXzXjXjXjXjXjXjXjXeXjXeXjXeXeXjXeXjXeXeXeXwXeXeXgXeXjXeXeXeXeXeXeXeXeXeXeXjXeXeXyXjXjXeXjXjXjXjXzXzX",
+">XoXoXoXoX.X.X.XD.[.K.K.D.D.S.D.K.K.K.D.K..XD..X.XD..XK..XK.K..X.XD.K.K.K..X[.K.D..X.X.X.XoX.X>X>X>X>X>X>X>XOX6X*X6X>X6X6XOX6X6X6X6X6X6X6X6X7X6X7X8X7X8X6X6X8X6X6X6X7X7X7X8X7X8X7X7XeX8X9XeXeXjXeXeXeXeXeXeX9X9X9XqXeX7X7XqX7XqXeX7XeXeXeXeXwXjXeXeXjXjXvXjXeXjXjXjXjXzXlXjXjXjXzXjXjXjXjXjXjXjXjXjXjXeXeXjXeXjXeXgXeXeXeXeXeXwXeXqXeXeXeXeXeXeXeXeXeXcXeXcXjXsXeXeXeXjXjXeXvXjXjXjXhXyXjXjX",
+">X>XoXoXoX.X.X.X.XD.K.K.K.S.S.K.K.J.K.K.K.D.D.D..X.X:XP.K.K.D.K.D.D.D.K.D.K.[..X.XK..X.X.X.XoX.X>X>X>X>X>X>X>X>XoX6X6X6X6X>X6X6X,X6X6X6X8X7X8X7X6X7X8X6X8X6X6X6X6X6X7X7X7X7X7XqX7X7XeXeXeX9XjXeXgXeX9XeX9X9XeX9X8X8X7X7XqX8X7X7X7X7XeXeXeXeXjXeXjXeXjXjXjXjXvXjXkXjXjXlXzXjXzXjXjXzXjXjXyXjXjXeXjXeXeXjXeXjXyXeXeXeXeXeXeXqXqXeXeXeXqXwXeXeXeXeXeXeXeXeXeXsXeXeXeXjXeXeXeXjXjXjXyXjXwXjXjXzX",
+">X>XoXoX:X.X.X.XK..XL.J.J.K.K.K.Z.J.D.K.K.:X.X.X.XD.K.K.K.D.K.K.D.K.D.D.K.K.K.K.D..X.XD..X.XoX>XoX>X>X>X>X>X,X6X6X>X>X>X6X6X>X6X6X6X7X6X7X6X8X7X7X0X8X8X6X6X0X6X6X6X7X7X7X7X8X7XqX8X8X9X9XeXeX7X9XeXeX9XeX9X9X9X8X8XqX7X8X8X8X7X7XeXeXqXeXeXeXjXeXjXeXvXeXjXjXjXjXjXzXzXkXjXjXzXlXkXjXjXjXeXeXjXeXjXjXeXeXeXeXjXeXeXeXeXeXeXeXeX7XeXeXeXeXeXgXeXeXeXeXeXeXeXjXeXeXeXjXeXeXjXjXjXjXjXjXjXjXzX",
+">X>X>X>XoX.X.XD..X.XD..XL.J.K.].D.K.D.K.D.K.K.K.K.D.K.K.K.K.G.S.K.D.J.K.J.L.K.K.K..XD.[..X.X.XoXoX.XoXoX.X>X6X6XOX6XOX6X>X6X7X6X6X6X8X9X8X6X7X6X7X7X8X7X6X6X6X6X6X6X8X7X6X0X7X8X8X7X9X9X9XeXwX9X9XeXeX9X9X7X9X7X8X7X7X7X7X6X8X7XqX7XwXeXeXeXwXeXjXeXjXjXjXzXjXjXzXjXzXzXzXjXzXzXjXjXeXjXjXeXeXjXeXjXeXeXjXqXwXeXeXeXeXeXeXeXeX9XeXqXqX9XeXgXeXeXeXeXeXjXeXeXyXjXjXwXjXeXjXeXeXjXeXjXjXhXjXjX",
+">X>X>X:XoX.XD.oXD.D.D.D.Z.D.D.S.Z.H.A.D.D.D.D.A.D.D.S.A.K.S.S.S.C.S.S.S.S.D.D.A.K.D.].]..X.XoXoXoXOX:X:X<X6X>X;X6X6X6X6X6X7X6X6X6X6X6X6X7X7X8X8X6X7X7X6X8X6X8X6X6X7X0X7X7X7X7X7X7X7XeXeXwX9X7XeXeX9XeX9X7X7X8X8X6X7X8X8X6X7X7X6X8X9X7X9XqXwXeXeXeXjXeXjXjXjXjXjXjXzXjXkXjXjXjXjXjXjXvXjXjXjXeXeXeXeXeXeXeXeX9XeXjXqXeXeXeXeXqXeXeXeX9XeXeXeXeXeXeXeXeXeXeXjXeXeXeXjXeXjXeXjXjXwXjXjXhXjXzXjX",
+">X>X>X>X|.:XoXD..XD.A.:XD.D.D.D.Z.G.K.K.K.XXK.J.K.S.L.L.J.K.S.S.J.J.J.K.C.S.L.D.K.K.L.L.K.XXoXXXXXXXOX*X>X>X>X>X6X>X>X6XOX7X7X6X8X8X7X8X6X7X6X7X9X9X8X7X7X6X6X8X7X8X7X0X6X7X7X7X7XqXeX7X7XeX9X8X7XqX8X9X7X8X7X6X6X6X7X6X6X6X6X7X8X7XeX8X9XeXeXeXeXeXjXjXjXjXjXzXjXzXjXjXjXjXkXjXjXjXjXyXeXeXeXeXeXeXeXeXeX9X9XeXeXeXeXeXeXqXeXeXeXeXeX9XeXeXeXeXcXeXeXgXeXjXjXeXeXeXeXjXjXjXeXjXeXjXhXjXjXjX",
+">X<X>X:X>X:X:XD..XD.XX.XD.Z.D.K. X XD.D.A.S.S.S.D.D.S.S.S.S.S.S.S.S.C.V.A.S.S.S.D.S.D.D..X.XD..X.XoX.X,X>X>X>X<X>X>X>X6X6X,X7X7X8X6X6X7X8X6X7X8X6X9X6X8X8X8X7X6X6X8X7X7X0X7X7X7XeX7X7XeX7X7XqX7X8X8X7X8X6X6X6X6X6X7X8X6X7X6X6X6X8X6X9X8XeXeXeXeXjXeXjXeXyXyXjXjXjXjXjXjXjXjXzXjXjXjXjXeXjXeXeXeXeX9XeXeX9X7XwX7X9XeXgXeXeXeXeXqX9XqXeXeXeXeXeXeXeXeXeXeXjXeXeXjXjXeXjXeXjXeXjXeXeXjXjXjXjXjX",
+"6X>X>X>XoX:X:X:X.X.XXXK..X.XK.G.K. XZ.Z.G.S.S.S.C.S.F.F.F.F.C.C.G.F.C.C.S.S.G.S.S.S.D.D.D.K.[.D..X:X[.;X;X>X>X>X>X6X|.6X6X7X7X7X7X7X8X8X6X7X6X6X7X8X8X7X7X8X7X6X7X8X8X7X7X7X8X9X7X9X8X7X7X7X8X7X8X0X8X7X6X6X6X6X6X7X6X6X6X6X6X7X7X6X9X9XeXeXeXeXjXeXjXeXjXjXjXeXyXjXjXjXeXjXjXeXjXjXeXeXgXeXeXeXeX9XeX9X8X0X8XeX9XeXeXeXeXeXeXeX9XeX9XeXeXjXeXjXeXeXjXeXeXjXeXjXeXjXeXjXeXjXeXjXjXeXjXjXjXjX",
+"6X>X>X>XoX:XoXD..XD.D.D.[. XL.H.H.Z.J.J.S.F.G.F.G.F.G.F.J.J.F.F.C.F.C.C.J.J.J.K.D.D.S.D.D.D.K..X.X:X>XoXoXoX,X6X6X*X6X6X6X6X7X7X6X7X6X7X7X8X8X7X6X7X6X8X6X6X7X8X6X7X7X7X7X8XqXqX7XqX9X9X7X9X8X7X7X7X6X8X6X6X6X6X6X6X6X6X6X6X6X6X7X7XwX9X9XeXeXeXeXeXyXeXeXjXjXjXjXjXeXjXjXjXjXjXjXeXjXeXeXeXeX9X9X9X8X7X9X9X9X0X9XeX9XqXeXeXeXeXeXeXeXeXeXeXeXeXeXeXwXeXeXeXyXeXjXeXjXeXjXwXjXjXeXjXeXjXeXvX",
+">X6X>X>XoXoX:XoX.XD.D.[.].K.P.D.A.{.H.S.Z.G.C.S.C.C.S.S.F.C.B.C.C.S.C.G.F.F.S.S.S.D.D.K.K..X.X.X.XXX[.;X<X:XP.,X>X6X>XoX6X6X6X7X6X8X8X7X6X8X6X6X6X6X8X6X6X8X6X8X8X8X7X8XqX8X7X7X7X7X8X8X8X7X7X6X7X7X6X6X6X6X6X6X6X7X6X6X6X6X6X6X9X7X7X7X9XeX9XeXeXeXeXjXeXjXeXjXjXeXeXjXjXeXjXjXjXeXeXeXeXeX9XeX9X7X7X7XqX8X7X7X9XeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXjXwXeXhXeXeXjXeXjXeXjXjXeXeXjXeXeXjXjXjXeXvX",
+"6X|.>X>X:X:X:XD..X.XXXXX.XK.D.v.k.x.h.s.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.a.i.i.p.f.w.4.b.>X,X6X6X6X6X6X7X6X6X7X6X8X8X6X6X8X6X6X6X6X6X6X6X7X8X7XqX8X7X7X7X7X0X8X7X6X7X6X6X6X6X9X6X6X6X6X6X6XOX6X6XOX6X6X6X7X7X7X7XeX9XeX9XeX9XeXeXwXeXeXjXjXeXjXjXeXjXeXjXeXjXeXeXeXeXeX9X7X7X7XeX8X8X7X7X9XeXeXeXqXeXeXqXeXeXeXeXwXjXeXjXeXeXeXwXeXjXeXwXeXeXwXeXwXjXeXyXjXeXvXjXjXjX",
+">X>X>X>XoX.XoXoX.X.XD..XK.D.K.l.c.h.s.a.a.i.i.i.i.a.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.d.w.1.oX2X6X>X6X6X6X7X6X6X6X6X6X6X6X8X6X6X6X7X6X6X8X7XqX7X7XeX7X7X7XqXqX8X7X8X0X7X7X7X7X7X9X9X0X6X6X6X6X6X6XOX6X6X7X7X7X6X7X7X7X9XeXeX9XeXeXeXeXwXeXeXeXjXeXeXeXwXeXeXjXjXwXwXeX7XwXqXqX7X7X8X7X0X7X7X7XeX9X9X9X9X8XqXeX9XjX0XeXeXeXeXeXeXwXwXeXeXwXeXwXeXjXwXeXjX0XjXjXeXjXjXjXeX",
+">X>X>XoXoX:X:XD..XoX.XK.K.K.XXz.h.p.a.i.i.y.i.i.y.i.i.i.y.i.y.i.i.i.i.i.i.y.i.i.y.i.i.i.i.i.i.i.i.i.y.t.0.0.q.,.6XoX6X6XOX6X6X6X6X6X6X6X6X6X6X6X0X6X6X0X7X0X8X7X7X8X9XeXeX7X8X9X7X7X7X8X6X6X6X7X9X7X9X6X8X6X6X6X6X6X6X6X6X6X7X7X7X7X9X6X7XeX8XeXeX9X9XeXeXjXeXjXwXjXeXjXeXjXjXeXwXeXeXeXeXeX7X9X7X7X8X7X0X8X7X7X8X9XqXeXeXwX9XqXeX9XeXwXeXjXeXhXeXjXjXeXjXeXjXeXwXeXeXwXjXeXjXeXyXjXjXeXjXjX",
+">X>X>X;XoXoXoX:X.X.XD..X.XK.S.g.u.i.i.y.y.y.t.t.y.y.y.y.y.y.y.y.y.y.y.y.y.t.y.y.t.t.t.t.y.y.t.t.t.t.y.t.9.6.=.&.*X>X6X>X6X6X6X6X6X6X8X8X7X6X8X6X8X8X7X8X7X7X7X7XqX7XeX9XeX8X8XqX8X8X7X7X0X7X6X6X7X7X8X8X6X6X6X6X6X6X6X6X6X6X6X7X7X6X6X9X7X7XeX9X9X9XeXeXeXeXwXeXeXeXjXeXjXjXeXjXjXeXjXwXeXqX7XeX8X8X7X6X7X7X0X7X8X7X8X7X9X8X8X8X9XeXeXeXeXeXeXjXeXeXeXjXwXjXeXeXeXeXjXjXeXjXeXjXjXeXjXeXeXjX",
+"6X>X:X>XoXoX.X:X.X.XoXXXD.D..Xy.y.y.y.t.r.r.9.r.r.r.r.9.r.9.r.r.9.t.9.9.r.r.r.9.r.r.r.9.9.9.r.r.r.r.9.9.6.=.$.+.oX,X6X6X>X6X6X6X8X6X8X6X8X8X8X8X7X8XqX7X7X7X7XqX9XeX9XeX9XeX9X8XeX9XeX7X7X7X8X7X7X7X6X8X6X6X6X6X6X6X7X6X6X6X6X6X6X7X8X6X8X8X9X9XeX8XeX9XeXeXeXeXeX0XeXwXeXeXjXeXjXeXjXeXeXeXeX9X7X7X7X6X7X7X6X8X0X8X6X8XqX7X8XqXeX9XjXeXjXeXjXeXhXeXeXeXeXeXeXwXjX0XeXeXeXeXeXwXeXjXeXjXeXjX",
+";X>X>X>XoXoX:X:X.XoXD..X[.S..Xy.y.t.t.r.9.8.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.8.>.&.@.4 -XOX7X6X>X6X6X6X6X7X6X7X7X7X7X7X7XqX8X8X9XeX9XeXeX9XeX9X8X8X9XeXeXeX9X9XeX7X0X7X8X6X9X6X6X6X6X6X6X6X6X8X6X6X6X8X6X7X7X9X7X9X9X6X7X8XeXeX9XeXeXeXeXeXwXjXeXeXyXjXeXjXjXeXqX9XwX7X7X8X7X7X8X6X6X6X7X6X6X6X7X8X7X8X9XeXeXeXwXjXeXjXeXjXwXjXeXwXeXeXjXeXwXjXeX0XeXeXeXjXeXeXjXeX",
+">X>X>X>XoXoX:X.X:XD.D..X.XD.S.t.r.t.t.9.9.9.9.9.9.9.9.9.9.9.9.8.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.6.=.$.+.1 oX7XOX*X6X6X>X6X6X7X6X6X6X8XqX7X9X7X8XeX8X9XeX9X9XeX8X9XeXeX9XeXeXeX9XeX9X7X7X8X7X6X6X6X0X6X6X6X6X6X8X6X8X6X6X6X6X8X6X6X6X7X9X9XqX9X9X9XeXeXeXeXeXeXeXeXjXjXeXjXjXeXjXeXeXeX9XeX7X8X9X7X8X6X6X6X6X6X6X6X8X6X7X8X9XeXwXjXeXeXeXeXeXeXeXeXjXeXjXeXeXeXeXeXeXjXeXeXgXeXeXeXeXeX",
+"6X>X>X;XoXoX:X:X:X.X:XD.D.D.K.y.t.y.r.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.6.=.#.5 1 >X6X,X>X6X>X6X6X>X6X6X6X0X8X8X7X7XeXeXqXeXeXeXeXeXjX0XeXeXeXeXeXeXeXeXeXeX9XeX7X0X8X6X6X6X6X8X8X8X8X9X9X6X7X6X6X6X6X7X6X9X9X7X9X8X6X7X7X9XeXeXeXeXeXjXeXeXeXgXeXjXjXeXeXeXeXeX9X7X8X9X7X8X6X6X8X6X8X6X6X8X7X9X9XeXeXeXwXeXjXeXjXeXjXeXeXeXeXjXeXwXeXeXeXeXeXeXjXeXeXjXeXjXeX",
+">X>X>X>X>X.X:X:X.XoXD.oX[.D.D.t.y.9.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.6.=.#.5 1 >X>X>X,X>X6X>X>X6X6X6X7X0X8X7X7XeX7XeXeXeXeXeX9XeXeXeXeXqX7XeXjXeXeXeX0XjX9X9X7X7X8X8X6X8X6X6X7X7X9X7X7X7X8X7X6X6X6X6X6X7X6X7X6X8X9X9X9X9X9X9XeXeX9XwXeXeXeXeXjXeXjXjXwXeXeX9XqXqX9X7X8X8X6X6X6X6X6X6X6X8X8X9X9XeXeXeXwXeXeXeXwXeXwXjXwXjXeXeX9XwXeXqXeXeXqXeX7XeXeXeXeXjXeX",
+">X6X>X>XoXoXoXoX.X.X.XK..XD.K.t.t.r.t.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.*.#.5 1 :X:X>X>X<X>X>X6X>X6X7X6X6X9X9X9X9XeX9XqXjXeX9XeXeX8X9XwXrX9XcXeX8XjXqX9X9XyX8XqXqX,X6X8X<X6X1X9XeX7X9XeXqXeX<X7XgX6X1X7X<X9X0X7X9X6X6XqX8X<XeXaX6XeX9XeXeXjXtXeXeXkXcX8XjXqXjX9XqXeX8X7X1X8X7X=X6X6X<X7XqX7XqXjX9XcX9XeXeXgXeXeXeXeXeXeXeXcXeXeXeXeXqX8XqXwXeXqXeXeXeXjXeXjX",
+"6X>X>X>XoX>XoX.X.X.XD..X.XD.K.t.t.t.t.9.9.9.9.8.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.6.=.#.5 1 oX;X>X>X>X>X>X6X6X>X6X7X6X7X6X9X7X7X8XjXeXeXjXfXfXkXjXdXwXeX7XeX5XwXhXwXwX0X9XrX6XwXwX*X8XeX6X9X8X8X8X1X1X6XwX7X$XwX2X4X8X6XgX6X<X6X6X8X8XwX6X9X8X8XeXwXwXfXyXgXeXjXjX5XjX0X3XtX6X6X8X9X8X2X2X9X9X6X3X2X9X9XwX2X<XtXeXeXeXeXeXeXeXjXeXeXeXeXeXeXqXeX0XeX7XeXeXeXeXeXeXeXeXjX",
+">X*X>X>X>XoXoXoX.X|.:XXXD.D.:Xt.t.t.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.=.#.5 1 :X:X>X;X>X>X>X>X6XOX6XOX6X6X6X7X7X9X8XeXeX9X0XI r . X r W jXkXdXQ u p . + H fXhXF + + p p + p + + i $ fX0XF + + g . p + h P o.qX7XiX>X_ r + + } 0XwXS k w r !.hXyXwX_.r w g L 4XhXR p $ p h W 2X9X6X! X p r . F fXkXeXqXeXeXgXeXeXeXeXeXeXeXeXgXeXeXeXeXeX0XqXeXeXeXeXeXwXeX",
+"6X|.>X>X>XoX,XoXoXoXD..X:XD.D.y.t.r.t.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.*.#.5 1 :XoXoX:X>X>X>X>X6X6X6X6X6X6X6X6X7X9XeX9X8XwXhXC . k p p c 8XcXwXc p i p d F eXeXV + w y p p p p p   $ eX8XJ p p + e q   e e r Q -X7X8X} w p d } 0X8XD p p w ^.hXeXjX!.w + k V hXjXV p + @   x wX9X0Xc p p p w L 0X9X9XeXeX9XeXeXeXeXcXeXeXeXeXeXeXeXeXeXeXeX8XwXqXeXeX0XeXwX",
+">X6X>X>X>X>XoXoXoXoX:XK.:XD.K.t.t.r.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.8.=.#.5 1 :X:XoXoX>X>X>X>XoX6X6X6X6XOX6X6X6X8X8XgXeX8XhXC f O # i e }.eX#Xw p O p p F eX9XF i @ O p + w . p k r 8X6XC i p k . w f + # # p T.2X6X] w p . ( 8XeXD   p f `.jXyXgX/.y + . V wX8XC q r f p p |.<X$X+ k O p + C hX9XeX8XeX9XeX9XeX9XeXeXeXeXeXeXeXgXeXeXeXqX7XqX9XeXeXeXwXeX",
+"6X>X>X>X>X>X>X:XoXoX:X.X.XD..Xy.t.r.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.r.9.9.9.9.9.9.9.6.=.#.5 1 oX>X:XoX.X>X|.>XOX6X>X6X6X7X6X7X6X7X9XqXeX9XwXC p O z O + W.hXY.+ + h . w L 9XeXR i X u !.eXeXeX7XfXfX9X-XC e p . ).8X{.U w + i c 8X7X} + @ + _ wXeXF # % + !.kXeXcX!.p # k F jXeXD d + k + @ T.8XO.w + h p + Z 9XiX7X9X9XwX9XeXeXeXeXeXeXqX7XeXeXeXeXeXeXeXeXwX0XeXeXwXeXeX",
+";XoX>X>X>X>X>X>XoXoX:X.XoXD.:Xt.y.r.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.=.#.5 1 :XD.:XoXOXoX>X>X>X6X6X6X6X6X6X7X7X7X9X8X9X9XhXC w p R w w Q wXW p w ! e p F hXqXR p p w ~ ' ) ' ] ] R.9XqXF i i r Q.8X9X&XX i i y ;X8X} p w r ' 8XqXJ . e r ^.eXeXfX`.p O p C jXwXD w w R k + Q 4X! . k G . + F -XeX9X9X7XqX9XeX9XeXeXeXeXqXeXeX9XeXeXwXeXqXwXqXeXeXeXqXjXeX",
+"6X6X>X>X>X>X>X>XoX>X.X.XoX:XD.r.y.t.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.*.#.5 1 .X|.:XoXoXoXoX>X>XOXOX6X>X6X6XOX7X7X8X9XeX9XfXE + i ] h p m fXv + l } . i D wXjXC i i d p + f + p w ' ,XqXC q + r !.7X9X0XC e p X _.<X/ p O p ] 8X9XV d + + !.eXtXjX!.a i p C qXhXD O p [ g + M 3Xc e e X.. . C 8X6X9X7XeX7XeX9XeX9XeXeXeXeXeXaXeXqXeXqX7XeX7XeXeXeXeXjXeXjX",
+"|.>X>X>X>X>X>XoXoXoX:X:XoXK.:Xy.r.r.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.6.=.#.5 1 D..XoX.X>XOXoXOX>XOX>X>X*X6X6X6X6X6X6X8X6X0XwXV   p } H h O ^.+ p F ] . p V hXeXF w p   f o + + p a _ 7X6XD O # g !.0X6X6XC p q h m.6X} q p p _ 7X7XD i @ + /.9XeX5X_.p i a V eXeXD p p  .E O p ).X p R  .e p C 0X<X8X7X8XeXeX9XeXeXeXeXeX8XeX8XeX9X9XeXeX9XeXeXeXeXwXjXeXjX",
+"6XOX>X>X>X>XoX>XoXoXoX.XoX:X.Xy.y.r.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.r.9.9.9.9.9.9.9.r.9.9.9.9.6.=.#.5 1 P..X.XoX.X>X.X>X>X>X>X>X>X6XoX6X6X6X7X8X8XqX9XR p w / ) X p V p e ] ' O p K hXwXF i d . [ } ..] .._ E.7X8XV q + X R.7X6XeXF . p o !.9X_ w q w ] 7X6XF w + w +XeX9XyX!.f i q F cXwXF + i [  .p q V + p ' _ e p H 8X6X0X7X7X7X8XeX9XeXeX9X9XeX9X9X8X8XeX8X9X9XqXeXeXeXeXeXeXyX",
+">X6X>X>X>X:XoXoX:XoXoX:XXX:X.Xy.y.r.y.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.6.=.#.5 1 .X.X.XoXoX.X>X.XoXOX>X>X>X>XoX6X6X6X7X6X6X7X9XC d % o.{.+ @ + d O @X..p e K wXwXR p O e ^.wX6X8X6X6X9X7X0XC w + f R.0X9X2Xf p p + }.7X` h p p _ 7X9XC g @ p (.0XaXxXQ.w + p Z jXwXF p . ' {.w p g q p `.} p + H 8XqX7X6X7X7XeX9XeX9XeXeXeXeX9XeXeX8X9XeX9X9XeXeXeXeXwXeXjXjX",
+">X>X>X>X>X:XoXoX>X>X:X:XOX.XoXt.y.t.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.=.#.5 1 D.D.D..XoX.X.X>XOX>X>X>X>X>X6X>X6XOX6X>X1X7X9XV p p } 8Xx   p p x 7X} + p L 0XwXF + X g !.eX9X9XqXaX7X7XqXC w . f W.8X|.W p a i A 0X7X| p O d _ 6X9X_ p + w L wX9XeXP . k . o.9XjXC + + o.eXl # + e l hX} p O F 7XgX0X8X8XqX7X8X9XeX8X9XeX9XeX8XeX8X9XeX9XeXeXeXeXeXeXeXjXjX",
+">XOX>X>XoXoXoXoX:XoXoX.X.XoX.Xy.r.r.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.6.*.#.5 1 D..X.X.X.X.XoXoXoX>XoX>XoX>X>X6X>XOXqX6X9X6X6XV e i o.6XK p q p R 8X .p p V wXyXF p # O d p w w p p r E.8XV d p # X r p . # p 0 T.>X>X_ e   p ' 6X9X`.y d i i h B g q k + w %XeXjXV @ h ` <XR p # e R wX_ q p C <X6X8X0X7X6X7X9X9X8X8X8X9XeXeXeX9X0X9XeXeX9XeXeXjXeXjXeXjXjX",
+"6X>X>X>XoXoXoXoX:X:X.X.XoX.X.Xt.y.y.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.=.#.5 1 D.D.D.K..X.X.X.X.X.X.X.XoXoXoX>X>X6XOXoX>XqX8XD O O ' 6Xo.+ f    .8X^ p i T wX8XV p p f p O i O p O . !.2XV a 9 p p + & + p w Q *X6X6X_ p # d } 8X8XwX..e p i   z p d + 0 n.8X9X0XF + p ' 8Xn.w % i ] 8Xo.+ + F 8X6X7X7X7X7X6X9X9X9X8X9X8XeX8X9X9X8XeX9X9XeXeXeXeXeXjXjXjXjX",
+"OX>XoXoXoXOX.XoX.X:XoXoX.XoX.Xy.r.r.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.6.=.#.5 1 D.D..X.X.X.X.X.X.XoX.X>XoXoX>XOX>X>X1X>X>XqX|.L w w ' 7X+Xr t g ^.qX_ h . F fXqXE . . w w p p w p p + _.-XF w r k . w p j R T.6X9X,X9X_ y . f ` 6X9X6XqXW.n g . p + p M T.eXwXeX0XK p . ..kXQ.g $ w `.8X] f p H 7XeX7X7XeX7X9X6X7X7X8X8XqX9XeX7X9X9XeX9XsXeXeXeXeXjXeXjXjXjX",
+"OXOXoXoX.X.X.X.X.X:X.XoX.X.X.Xt.y.y.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.6.=.#.5 1 D.D..X.X[.K.D.D..X.X.X.XoXOXoXoXoX>X;X6X6X=XuX0X0X6X8X1X9X0XfX0XrXeXqX&X8X6XeXiX6X8XgXqX7X7X6X6X7X7X6X,XuX6X8X>X-X6X6X>X6X6X>X6X6X7X>XqX2X2X6X<X6X8X8X>XqXfX2XE.!.R.%X-XeX9X7XeXeXwXrXwXeXqX8XkX9XeXwXsX9X9XdX8X9X7X9X9X9X7X9X6X7X0X8X7X7X7X7XeXeXeX9XeXeXeXeXeXeXeXeXjXjXjX",
+"oX:X:X:X:X:X:X.X.X:X.X.X.X.X.Xt.r.y.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.6.=.#.5 < D.K..XK.K.D.D..XD..XD..X.XoXoXoX>X.X>X>X>X6X6X>X7X6X*X6X8X8X9X9X9X9X9X9X8X8X7X7X8X6X8X6X6X7X7X6X6X6X6X6X6X6X6X,X6X6X6X6X6XoX>X6X6X6X6X7X7X9X7X6X7X6X8X8X7X6X9X6X9X6X7X6X8XqX7X9X8X9XeXeXeX9XeXeX9XeX9XeXeX9XeX8XqX7X8X8X8X0X7X7X8X7X7X8X7X9X7X9X9XeXeX9XeXeXeXeXeXjXjXjXjXzX",
+"oXoX:X:X.X.X.X.X:XL..X.X.X.X.Xt.r.y.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.r.9.9.9.9.9.9.9.9.9.r.9.9.9.9.9.9.8.=.#.5 1 D.K.K..X.X X[.D..X.X.X.X>X.X.XoXoX>X>X>X>X>X>X>X>X6X6X6X6X6X9X9X7X9X6X9X6X6X6X6X6X6X6X6X7X7X6X6X6X6X6X6X7X7X6X7X>X6X>X>X*X6X6X6X6X6X6X7X6X7X6X9X7X7X9X6X7X8X6X6X6X6X6X7X8X7X8X7X9XwXeX9XeXeXeXeXeX9X8XeX9XeX9XeX9X9XeX8X0X7X7X7X6X7X9X9X7X9X7XeXwX9XeX9XjXeXeXjXeXeXyXjXjXjX",
+">XoX:X:X:X.X.X.X.X.X.X.X.X.X.Xt.r.r.y.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.8.=.#.4 < D. X XK.D..XD..X.XD..X.XoX.XoXoXoX>X>X>X>X>X>X6X>X6X6X6X6X6X6X8X6X6X6X6X6X6X6X6X6X6X6X6X6X7X7X6X6X6X6X6X6XOX6X>X6X6X6X6XOX6X6X>X,X6X6X7X6X6X6X6X6X9X9X6X6X6X7X6X6X6X6X6X6X0X7X7XqX9X9XeXeX9XeXeXeX9X9XeXqX8XeX9X9XwX9X9X8X7X7X7X7X8X9X6X8X6X7X7X7XeX8XeXeXeXeXeXeXjXjXeXjXjX",
+"oX,XoXoX:X.X.X.X.X.X:X.X.X.X.Xt.r.y.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.6.=.#.5 1 D.K.D.K..XD..X.X.X.X.X.X.X.X.XoXoXoX.X>X>X>X>X>X6XOX6X>X6X6X7X6X7XOX6X6X6X6X6X6X6X6X6X6X6X6X6X6X7X7X6X6X6X6X6X6X6X>X>X6X6X6X6X6X6X6XOX6X6X6X6X6X6X9X6X6X6X6X6X6X6X6X6X6X6X6X7X7X9XeX8X9X9XeX9X9XwX9X8X8X8X8X8XeX9X9X9XeX7X7X7X7X6X8X7X8X8X7X8X7X8X7XeX9XjXeXeXeXeXjXeXjXjXjX",
+":X,XoXoXoX.X.X.X.X.XD..X.X.X[.t.t.9.t.9.9.9.9.8.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.*.#.5 < D..XK.K..XD..X.X.XD.oXD.oX:XD.oX.X>X.XoXOX>X>X>XOX6X6X>X>X6X6X6X6X6X6X6XOX6XOX6X>X6X6X6X6X6X6X6X7X,X6X,X6X6X>X6X6X6X6XoX6X>X6X6X6X6X6X7X6X6X6X6X9X6X7X6X7X6X6X6X6X7X6X6X,X6X9X7X8X7X0X7X7X7X9XeX9X9X7X8X7X7X7X7X7X7XwX9XeX9X9X9X7X6X8X7X6X7X6X9X8X9X9XeXqXeXeXeXjXeXjXjXjXjX",
+",X>XoXoXoX:X.X:X.X|.:XXXoX.X.Xt.r.t.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.8.=.#.5 1 D.K.D..XK..X[.K.D.oXD.oX.X.X:XoX.X:X.X>X>XoX>X>X>X>XoX6X6X>X6XOX>X6X>X6X6X6X6X6X>X6X6X6X6XoX6X6X9X6X6X6X6XOX6X6XoX6X6X7X6X6X6XOX6X6XoXOX6X6X6X>X,X6X6X6X6X6X,X6X6X6X6X6X7X7X9X9X7X8X7X8X9X7X7X9X9X6X8X6X8X7X7X7X9X9X9XeX7XqX7X9X8X8X7X6X8X8X8X7X9X9XeX9XeXeXeXeXeXeXeXjXjXjX",
+"OX>XoXoXoXoXoX:X:X.X.X.XoX.X.Xt.t.r.t.9.9.9.9.9.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.6.=.#.5 < D.K.K. X.XD.D..X.X|.D.oX:XoX:XD.oX:X>X.XoX>X>XoX>X>X6X>X>X>XOX>X>X>X>X>X>XOX>X<X>X6X6X|.oX>X6X6X6X6X6X6X6XOX6X>X6X>X*XOX6X>X6X6XoX7X6X6X6X6X6X>X6X7X7X6X6X6X6X6X6X6X6XOX7X7X9X7X7X8X8X6X7X8X7X8X8X8X7X6X7X8X7X8X9X8X9X8X9X7XqX8X6X6X6X6X7X6X9X9X9XeXeXeXeXeXeXeXeXwXeXjXjXhX",
+"OX,XoX>XoXoXoXoX.X:X|.XX.XD.|.t.r.t.t.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.8.=.#.5 < D.K..XK.K.[.D.K.D..XD.:XD.D.:XoXoX.XOXoX>XoX,X|.>X>X>X>X>X>X>X|.>X>X>X>X6X>X>X>X>X>X>X6X6X*XoX6X,X6X6X,X6X6X6X6X6X6X6X6X6X>X6XOX*X6X6XOX6X>X6X6X6X6XOX6X6X,X7XOX6X6X6X7X7X7X7X6X8X7X7X7X7X6X6X9X7X6X9X9X8X6X6X6XeX7XeX8XqXeX9X6X8X6X8X6X6X7X8X9XeXeXeXeXeXgXeX0XeXwXjXeXjXjX",
+">X>X>X>X>X>XoXoX.XoXP.D.;X|.[.r.r.t.r.9.9.9.9.9.9.9.9.9.9.8.8.9.9.9.9.9.9.8.9.8.9.9.8.9.9.9.9.9.9.9.9.6.=.$.4 1 J. XK.K..XK..X.XD.D..X.XXXD..X.XoXoXoXoXoXoXoX,XoX>X,X,XoXoXOX.X>X>XOX>X,X>X>X,X>X>X6X>XOX6X>X6X6X6X>X6X6X6X6X>X6X6X6X>X>X6X6X6X6X*X6X>X6X>X6X6X6X6X6X6X6X6X7X6X6X,X6X7X6XiX6X7X7X9X6X9X7X0X6X6X6X6X7X8X6X6X6X6X8X7X7X7X7X7X7X8X7X6X7X7X7X7X7X7XeX9XeX9XeXeXeXeXeXeXjXjXzXjX",
+",X>X>X>XoX>XoXoXoXOXOX[.|..X|.t.t.t.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8.9.9.9.8.9.6.*.@.4 1 G.].K.K.K.K.D.D.D..X.XK..XK..X.X.XoXoXoXoXoXoXoX>XoXoX>XoXoX>X.XoXoX>X.XoX,X>X>X6X>XoX6X6X>X6X6XOX6X>X6X|.6X>X6X>X6X6X6X6X6X6XoX6X>X>X*X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X7X6X9X9X8X6X7X8X8X6X8X6X7X6X6X6X0X6X6X8X7X7X7X7X8X6X6X6X6X6X6X6X7X9XeXeXeXeXeXeXcXeXeXeXwXjXhXzX",
+"oXoX>XOX>X>XoXoXoX.XoXoX.X:XoXt.t.t.t.9.9.8.8.9.9.9.9.9.9.9.9.9.9.9.9.9.8.9.9.9.9.9.9.9.9.9.8.9.9.9.6.=.&.+.2 = S.D.K.K.K.K.K.D..XD.K..X.X.X.X.X:X:XoXoX.XoX.XoX.X>X>X.XoXoX.X.XoX.X.XOXoX>X>X>X>XOX>X>X>X>X>X>X,X6X>X>X>X6X6X6X6X6X>X6X6X>X6X6X>X6X6X6XoX6X6X6X6X6X6X6X6X6X8X6X6X6X,X6X6X6X6X7X8X6X6X8X7X6X8X7X8X6X8X7X6X6X6X8X7X8XqX8X7X7X6X6X6X6X6X6X7X6X7X7X9XeXeXeXeXeXeXeXeXwXeXjXjXkX",
+">X,X>X>X>X:X>XoXoX>XD.:XL.K.:X9.9.9.8.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.=.*.+.1 - = D.G.K.S.K.D.D.D.D.K.K.K.K.[..X.X.X.X.X.X.X.X:X:X:X:XoX:X:X.X:X.X.X.X|.oXoXoXoX>X>X>X>X>X>X>X>X>X>X>X6X>X>X>X>X6X>X>X6X6X6X6X|.>X6XoXoX6X6X6X>X6X8X6X6X6X6X6X6X6X6X6X,X6X6X6X7X6X8X7X7X9X7X6X8X8X8X7X6X8X8X6X6X8X6X7X8X8X6X7X6X6X6X6X6X6X6X8X8X9X9X9XeXeXeXeXeXeXeXeXjXhXjXjX",
+">XoX>X>X>X>XoXoXoXoXoX.XK.D.:Xq.6.>.=.&.#.$.$.$.$.$.#.#.$.#.$.#.$.#.#.#.$.$.#.$.$.#.$.#.#.$.$.#.#.#.@.4 < = ; ; A.F.J.S.K.S.S.D.K.K..XK..XK..XD..X.X.X.X:X.XoX:XoXoX.X:XoX.X.X.X.XoX.X:X.X>X>XoX>X>X>X>X>X>X>X>X>X>X>X>X>X>X6X6X6X6X6X>X6X6X;X6X*X6XoX6X6X6X>X6X6X6X6X6X6X7X6X6XOX6X6X6X6X6X7X6X7X7X9X7X8X7X9X9X7X8X8X7X6X6X6X6X8X7X7X6X6X6X6X6X,X6X6X6X6X6X6X7X7XqX9XeXwXqXeXeXeXjXhXjXzXzX",
+":X>X>X>X>X>X>X:XoXoXoXoX,X|.|.<.;.$.@.5 2 2 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 = = ; ; 7 V.L.F.J.K.K.D.D.D.K.K.K..X.X.X.X.X.X.X.X.X:X.X.X.X>X.X.X.X.X.X.XoX.X:X.XoX.XoX>XOXoX:X>X>X:X:X>X>X>X>X>X>X>X>X>X6X>X6X>X6X|.6X>X>XoX6X6X6X6X6X6X9X6X8X7X6X6X6X6X>X6XoX6XoX6X6X6X6X8X7X7XeX7X7X7X7X7X8X6X8X6X8X6X6X6X6X7X6X6X6X6X6X6X6X6X7X6X7X7X7X7X9X9XeXeXeXeXeXeXyXjXjXjX",
+">X>X>X>X>X>X>X>X>XoXoX>X>X>XXXj.-.6 1 - = = = = = = = = = = = = = = = = = = = = = = = = * = * * = = = = ; : 8 v.H.C.J.S.S.S.S.D.D.K.K..XK.K..X.X.X.X.X.X.X.X.X.X.XD.D..X.X.X.X.X.X.X:X.X.X:X.X.X.X>X|.oXoXoX>XoX>XoXoX>X>X>X>X<X|.6X>X6X>X6X>X6X>X>X>X6XOX6X6X7X9X7X6X9X6X7X6X6X6X6X6X6X6X6X6X7X6X8XeX7X7X7X9X7XqX7X7X6X8X6X8X6X6X6X6X7X6X6X>X6X6X6X7X6X7X7X8X8X0X0X9XeXeXeXqXwXjXjXjXhXjXzX",
+">X,X>X>X>X:X>XoXoX>X>X:XD.|.I.M.2.3 = = = = = = = * = = = = = = = = = = = * = * = = = = = * * * = = = = , b v.N.C.S.S.S.K.S.S.S.D.K.K.D..X.X.X[..X.X.X.X.X:XD..X.XD..X.X.X.X.X.X.X.X.X.X.XoX.X>XoX.XoXoXoXoXoXoXoXoXoX|.>X>X>X>X6X>X>X>X>X>X>X>X>X6X6X6X6X6X6X6X9X6X9X6X6X9X6X6X6X>XoX6X6X6X6X7X7X7XeX9XeX8XqX7X8X7X6X7X6X8X6X6X6X*X6X6X6X6X6X6X,X6X6X7X7X7X7X0X8X8X8X9X8XqXeXeXwXeXyXjXzXjX",
+">X>XoXoX,XoXoXoX,XoX:X:X.X.X.X.X.X[..X.X.X.X.XK..XD..X.XK.K.K.D.D.K.J.J.J.C.B.B.B.B.B.B.B.B.C.C.F.F.F.J.G.S.S.S.S.S.S.S.S.J.J.K.J.K.D.D.D..X.XD..XD.D..X.XD..X.X.XK..X.X.X.X.X.X.X.X.X.X.X.X.X.X.XoX.X:X:X.XoXoX>X:X>XoXoXoX>X>X>X>X;X>X>X6X>X6X6X>X6X6X6X6X6X6X7X6X8X8X6X6X8X6X6X<X6X>X6X6X6X6X8X6X8X9XeX7X7X8X7XeX7X7X8X6X6X6X6X6X6X6X6X6X>X6X6X6X6X6X6X6X6X9X7X8XeX8X9XqXeXeXeXeXjXyXjXzX",
+",XOXoXoXoXoXoXoXoXoX,XoX:X:X.X.XXX.X.XD..X.X.X.XD..X.XK..XD.K.K.S.K.J.J.G.C.C.C.B.B.C.B.C.B.C.C.G.F.S.C.S.Z.S.S.S.S.S.S.S.J.S. XK.K.K.D..XK..X.X.X.X.X.XD..X[..XK..XK.K..XK..X.X.X.X.X.X.X.XoX.X.X.X.X:X:X|.oXoX:X:XoX>XoX>X:X>X>X>X6X>X>X6X|.>X>X6X6XoXOX6XoX6X7X6X7X6X6X8X6X6X6X2X6X2X2X6X6X6X8X7X9XwX9XwX8XeX8X8X8X9X7X8X6X6X6X6X*X6XOX6X7X6X7X7X8X7X8X6X8X6X9X9X7XeXwXeXeXeXjXjXeXjXkXzX",
+"oX>X>XoXoXoXoXoXoXoX:X:X:X.X.XD..X.X.XD..XD.K..XK..XK..XK.K.D.K.K.J.J.J.S.C.C.C.B.B.C.B.B.C.C.C.C.F.S.S.S.C.S.S.S.S.S.S.J.S.S.K.J.K.D.K.K.K.D..XD..X.X.X.XD.K.K.:XK.D.K.K..XK.K..X.X.X.X.X.X.X.X.X.XoX.X.X:XoXoXoX:XoXoXoX>XoX>X>X>X6X>X;X>X>X6X6X6XOX6X6X6X6X7X6X6X6X6X6X6X6X6X6X6X6X6X>X6X6X6X7X7X7X7X9XqX7X7X7XeX9X7X7X6X7X7X6X6X6X6X6X6X7X6X6X6X7X7X6X8X7X9X9X9XeXeXeXeXjXjXeXjXjXjXzXzX",
+">XoX,XoX,XoX,XoX,X,X:X:XoX.X.X.X.XD..X.X.XK.[..X.X[.XXK.K.K.K.K.J.J.J.J.C.C.C.C.C.C.F.B.C.C.B.C.C.G.S.S.S.S.S.S.S.S.S.S.S.J.J.J.K.J.K.K.K.K..XK..XD..XD.D..XK..XK.K.K.K.XXK..X.XD.D..XK..X.X[..X.X.X.XoX.X:X:XoXoXoXoXoX:X>X>X>X>X>X>X>X>X>X>X6X|.6X6X6X*X6XOX6X6X6X7X7X8X6X9X6X6X6X6X6X6X6X6X6X6X8X9X7X9X8X9X7X9X9X6X7X9X8X8X6X6X6X8X6X6X6X0X8X6X7X7X7X7X6X7X7X9X9XeX9XeXeXqXeXjXeXjXjXjXjX",
+">X>XOX>X>X,XoX,XoX:X:X:X:XD..X.XD..XD..XD.[..XD..XK..XK.K.K.D.D.J.K.S.S.G.C.C.C.C.B.C.C.C.B.C.C.C.C.S.S.S.S.S.S.S.S.J.J.C.K.S.J.J.J.D.D.K.D.D..XD..XK.[. X.XD.K.K.K.D.K.D.K.K..X.X.XD..X.X.X.X.X.X.X:X.X:X:X:X.XoXoXoXoXoXoX>X;X>X>X>X6X>X>X>X>XOX6X*X6X>XOX7X6X6X6X6X6X6X8X7X6X6X6X6X8X6X6X6X6X6X6X0X8X9X7X8X7X8X7X6X7X8X7X7X8X8X8X8X7X9XeX8X8XeX9X9X9X8X0X9X9X9XeXeXeXeXjXeXjXjXjXjXjXzXjX",
+">X>X>X>X>XoXoX,XoXoX:X:X:XoX:X.X.XD..XK..XD.[.K.[..X.XK..XK.D.D.K.J.S.G.S.S.C.C.C.C.C.B.C.C.J.V.C.C.S.S.S.S.S.S.K.S.K.S.K.J.J.J.J.J.H.D.K.K.D.K..XK..XK.K.D.K.D.K.J.J.D.D.K. X.XD..XD.D.D..XD..X.X.XD..XD.oX.X:X.X:XoXoXoXoX>X>X>X>X>X>X>X>X>X>X>X>XOX6X6X6X6X6X6X6X6X6X7X7X6X6X6X6X6X6X8X6X6X0X6X6X7X8X8X8X8X6X8X6X0X7X0X8X7X7X6X7X7X8X8X8X9XeX8X9X9X9X9X8X8XeX9XwXeXeXeXeXeXjXeXjXjXyXjXzX",
+">X>X>X,X,X,XoXoXoXoX:X:X:X.X.X.XK.K.[.[.[.D..X[.K.[.XX.XK.K.D.S.J.J.K.K.C.C.C.S.C.C.C.F.C.C.C.C.C.S.K.S.S.S.S.S.S.S.S.K.J.K.J.K.K.S.S.K.K.D.D.K.K.K.K. X.XK.S.D.S.J.J.J.D.D.K.D.D. X[.D.[.D.D..XD..XD.:XoXD..X.X.X:XoXoXoX>XoX>XoX>X>X>X>X>X>X>X>X6X6XoX6X6X6X6X6X6X6X8X8X9X6X7X8X7XwX6X0X6X6X6X6X6X6X6X8X6X6X6X6X8X8X8X7X7X8X8XwX9XqX8X9XeXeX9XeX9XeXeXeX9X9XwXeX9XeXwXeXjXjXeXjXeXjXvXzXzX",
+">X>X>X>XoXoXoXoX,XoX:X:X.X.X.X.X.X[.K..XK..XD..X.XD..XK..XS.D.S.J.J.Z.Z.S.S.C.V.C.C.F.C.C.F.C.C.C.V.S.C.S.S.S.S.K.G.K.L.K.J.J.C.S.S.S.G.S.D.D.K.D.K..XK.D.K.S.K.K.K.K.K.J.K.S..XD.D.K.K.K.K..X.XK..X.X.X.X:XoXD..X:X:XoXoXoXoX;X:X>X;X:X>X>X>X>X>X>XoX6X>XOX6X6X6X6X0X7X8X7X7X7X0X8X8X8X8X8X6X6X6X6X6X6X6X8X6X6X6X6X8XqX8X9X9XeX9X8X9XeX9X9XeXeXeXeXeXeXeXeX9XeXeXeXeXeXwXjXeXjXwXjXeXjXjXzX",
+">X6X>X>X>XoXoX>X>XoXOX.XoX.X.X.X.X.X.X.X.X.XK..X.XXX.XK.K.K.D.S.K.S.S.S.C.C.C.J.C.C.C.C.C.C.C.C.F.C.F.J.J.S.S.J.J.J.J.K.C.J.J.J.K.S.K.S.G.S.S.K.K.J.K.K.K.D.D.D.D.K.S.S.D.D.K.K.D.S.K.K.K.K.K..XK..X.X[.K..X.X.XoX.XoXoX.XoXoXoX[.oX.XoXoX,XoX:X,X,X>X6XOXoX6X6X6X6X6X6X6X7X9X9X7X9X7X8X8X7X7X8X7X7X7X7X7X6X6X7X7X7X6X7XqX9X7XeX7X7XeXeXeXeXsXeXeXeXeXeXeXeXwXeXeXeXeXeXeXjXjXeXjXvXjXjXzXzX",
+"6X6X>X>X>XoX>X>XoX>XoX>X:X.X.X.X.X:XD.K..XK..XK.K.K..XK.K.D.D.D.J.K.S.S.C.J.C.C.C.J.C.J.C.J.C.C.C.C.F.F.C.C.S.J.J.J.K.J.K.K.C.J.S.K.S.S.S.S.S.K.J.J.K.D.K.D.D.K.K.S.S.D.D.D.K.K.D.D.S.K.D.K.D.K..XK..XD..X.X.X.X.X.XoXoX|.oXoX.XoXoXoXoXoXoXoX,X>X>X>X>X6X6X6X6X6X6X6X6X6X6X7X9X7X9XeX8X8X9X8X7X7X7X7X6X6X6X6X6X6X8X7X7X9XeX9XeXeXeXeXqXeXeXcXeXeXeXeXjXjXeXwXeXjXeXeXjXeXeXeXjXjXeXjXjXjXzX",
+"6X>X>X>X>X>X>X>XOX>XOX.X.X:X.X.X.X.X.X.X.XD..XK..XK..XD.K.K.D.S.J.S.K.C.J.C.C.J.C.C.C.C.C.J.C.C.C.J.F.F.J.C.S.J.S.J.C.K.J.K.J.J.J.J.J.S.S.S.K.J.J.Z.J.J.S.K.J.K.S.S.S.S.S.S.S.S.S.K.K.S.K.K.D.K.K. XK..XD..X.X.X>X.XoXOX.XoX.XoXoXoX.XOXoXoX>X,XoX>X>X>XoX6XoX6X6X6X>X6X6X6X6X7X7XeX8X8XqX8X8X8X7X6X9X8X6X6X6X6X7X9XwX9X8X9X9X9X9XeXeXeXeXeXeXeXjXsXjXeXeXeXjXeXeXeXeXeXcXjXeXjXjXjXjXzXkXzX",
+">X6X>X>X>X>X>X>X>X.X>X>X.X.X:X.X:X.X.X.X.X.X.XD..X.X.XD.D.K.D.S.S.S.S.S.S.S.C.J.F.C.C.C.C.C.C.C.F.F.J.J.S.S.S.S.S.S.J.J.K.J.K.K.S.S.S.S.G.K.Z.S.G.K.K.Z.Z.K.K.H.K.S.K.K.S.S.K.S.S.J.S.S.S.S.K.K.D.K.K.K..X.X.X.X.X.X.X.XoXoXoXoXoX.XoXoXoXoXoX:X>XOX>X>X>X>XoX6X*XoX6X6X6X7X6X7X7X7X7X7X7X7X7X9X7X7X9X7X8X7X8X8X7XeX9X8XeXeXeXeXeXeXeXeXeXjXeXjXeXeXeXeXjXeXjXeXvXeXjXjXyXeXjXeXjXjXzXzXjXzX",
+"6X6XoX>X>X>X>X>X>XoXoX>XoX.XoX.X.XoX:X.X.X.X.X.X.X.XK.K.K.K.D.S.K.S.S.S.J.C.C.C.C.C.C.C.C.C.C.J.J.F.F.J.J.C.S.S.S.S.S.J.S.K.K.S.S.S.S.S.S.J.K.G.S.S.S.G.S.K.G.S.S.S.S.S.S.G.S.S.S.S.S.S.J.K.K.K.D.K.K.K.D.K.:X.X.X:XoXoX.XoX:XoXoXoXoXoXoXoXoXoXOXoX;X>X>X>X>X>X>X6X>X6X>X6X6X6X8X7X6X7X6X9X7X9X7X9X9XeX7X8X8XqX9XeXeXqXeXeXeXjXeXjX9XeXeXgXeXeXeXeXeXeXeXjXeXjXjXjXeXyXjXeXjXjXjXjXkXzXzXzX",
+">X6X6X>X>X>X>X>X>X>X>X.XoXoXoX.X:X.X:X.X:XoX:X.X.XK..XK.K.K.D.D.J.S.J.K.J.J.J.C.F.J.C.C.J.C.C.C.C.F.F.C.J.S.S.S.S.S.S.J.S.S.K.S.S.S.S.S.S.S.J.J.S.S.S.S.S.S.S.S.S.S.S.G.S.S.S.S.K.S.G.S.J.J.K.K.D.D.K.K.K..XK..XoX.X.X.XoX.XoX,XoXoXoX>X>X:XoX>X>XOX>X>X>XOX>X>X>X>X6X>X6X6X6X6X6X8X7X8X8X9X9X7XeX8XeX9XeX7X8XeXeX9XeXeXeXqXeXeXeXeXqXeXeXeXeXeXeX8XjXeXjXeXjXeXeXeXjXjXjXjXjXjXjXjXjXjXzXjX"
+};
diff --git a/images/checkbox2hilitechecked.xpm b/images/checkbox2hilitechecked.xpm
new file mode 100644 (file)
index 0000000..693a7d8
--- /dev/null
@@ -0,0 +1,332 @@
+/* XPM */
+static char *checkbox_hilitechecked[] = {
+/* columns rows colors chars-per-pixel */
+"190 70 256 2",
+"   c #0A141B",
+".  c #0B1A1B",
+"X  c #0C1915",
+"o  c #121B1E",
+"O  c #0C1C2C",
+"+  c #0B1825",
+"@  c #111C27",
+"#  c #0E1F36",
+"$  c #0B221B",
+"%  c #0C2D19",
+"&  c #0A3318",
+"*  c #112816",
+"=  c #143A1B",
+"-  c #14253A",
+";  c #112F34",
+":  c #142B43",
+">  c #192E4D",
+",  c #162844",
+"<  c #182E52",
+"1  c #1B314C",
+"2  c #183449",
+"3  c #1B3353",
+"4  c #1C355A",
+"5  c #1B3A5C",
+"6  c #163256",
+"7  c #0E2A45",
+"8  c #1D3C64",
+"9  c #1D3D6A",
+"0  c #1D3E71",
+"q  c #213B5E",
+"w  c #203455",
+"e  c #223D65",
+"r  c #233D6B",
+"t  c #293D6A",
+"y  c #273B66",
+"u  c #233E72",
+"i  c #293D71",
+"p  c #313F6E",
+"a  c #0D4A02",
+"s  c #0C4702",
+"d  c #0E4719",
+"f  c #0E5302",
+"g  c #114B09",
+"h  c #144917",
+"j  c #115F02",
+"k  c #17453C",
+"l  c #104A21",
+"z  c #116302",
+"x  c #126B02",
+"c  c #166608",
+"v  c #157902",
+"b  c #167605",
+"n  c #196717",
+"m  c #1C6830",
+"M  c #276735",
+"N  c #2D7933",
+"B  c #247D1B",
+"V  c #194A44",
+"C  c #1C4E49",
+"Z  c #1D4165",
+"A  c #1C426B",
+"S  c #17456B",
+"D  c #1C4371",
+"F  c #1D4776",
+"G  c #24485B",
+"H  c #265857",
+"J  c #224165",
+"K  c #23426B",
+"L  c #2A426D",
+"P  c #27496B",
+"I  c #234372",
+"U  c #294372",
+"Y  c #2B4971",
+"T  c #254977",
+"R  c #295279",
+"E  c #334C74",
+"W  c #385579",
+"Q  c #32546E",
+"!  c #267345",
+"~  c #2B7249",
+"^  c #3F696C",
+"/  c #435B7C",
+"(  c #2C5C85",
+")  c #2C5D8A",
+"_  c #225580",
+"`  c #325C85",
+"'  c #325C8C",
+"]  c #3A5A86",
+"[  c #375D90",
+"{  c #2C5184",
+"}  c #2C618B",
+"|  c #2A6487",
+" . c #2E6392",
+".. c #31628D",
+"X. c #336087",
+"o. c #366795",
+"O. c #35749B",
+"+. c #3C75A3",
+"@. c #3B79A4",
+"#. c #3B78A7",
+"$. c #435D83",
+"%. c #4C698A",
+"&. c #4A6486",
+"*. c #41779E",
+"=. c #526A8B",
+"-. c #5A7493",
+";. c #54708D",
+":. c #4275A5",
+">. c #417AA5",
+",. c #4478A9",
+"<. c #477CB2",
+"1. c #647A97",
+"2. c #6A7996",
+"3. c #168702",
+"4. c #199403",
+"5. c #1A9803",
+"6. c #1C9308",
+"7. c #1CA703",
+"8. c #1EB203",
+"9. c #2E8A35",
+"0. c #21B606",
+"q. c #27AE14",
+"w. c #35B72D",
+"e. c #229412",
+"r. c #3C9554",
+"t. c #368E4C",
+"y. c #318D6D",
+"u. c #21C403",
+"i. c #23CD03",
+"p. c #24D403",
+"a. c #25DA04",
+"s. c #28DB07",
+"d. c #2ADA0C",
+"f. c #28D50B",
+"g. c #2DDA11",
+"h. c #2DD711",
+"j. c #30DA16",
+"k. c #33DB1B",
+"l. c #39DA25",
+"z. c #3DDA2A",
+"x. c #37D923",
+"c. c #3ED930",
+"v. c #27E304",
+"b. c #28E604",
+"n. c #28E904",
+"m. c #2CE50C",
+"M. c #29F304",
+"N. c #2DF709",
+"B. c #39F619",
+"V. c #3AE024",
+"C. c #46B73F",
+"Z. c #43984F",
+"A. c #4A936D",
+"S. c #47B050",
+"D. c #55B667",
+"F. c #69BE78",
+"G. c #44D938",
+"H. c #40DB2E",
+"J. c #47ED30",
+"K. c #4BD942",
+"L. c #4DD746",
+"P. c #54CA58",
+"I. c #57D656",
+"U. c #4DC44C",
+"Y. c #5ED663",
+"T. c #56F044",
+"R. c #63D25C",
+"E. c #68C675",
+"W. c #71C879",
+"Q. c #6BD375",
+"!. c #66E45E",
+"~. c #3C88B6",
+"^. c #3A90AB",
+"/. c #33928D",
+"(. c #2E92CD",
+"). c #3594CE",
+"_. c #3598CE",
+"`. c #3896CE",
+"'. c #3B99CE",
+"]. c #3A95C6",
+"[. c #3696D0",
+"{. c #3599D1",
+"}. c #3A96D0",
+"|. c #3C99D0",
+" X c #399CD9",
+".X c #3DA0D7",
+"XX c #4B8BB9",
+"oX c #4689B5",
+"OX c #4A91BA",
+"+X c #4893B8",
+"@X c #518BB9",
+"#X c #5492BD",
+"$X c #4C84A9",
+"%X c #71879C",
+"&X c #6D8A99",
+"*X c #7589A3",
+"=X c #7C93AB",
+"-X c #6D87A3",
+";X c #7AB595",
+":X c #76B08B",
+">X c #7FACA6",
+",X c #429BCD",
+"<X c #4A9BCC",
+"1X c #4997C5",
+"2X c #429CD1",
+"3X c #489ED3",
+"4X c #439AD7",
+"5X c #5699C7",
+"6X c #569ED4",
+"7X c #518BC0",
+"8X c #4AA1CC",
+"9X c #45A0D3",
+"0X c #4BA1D4",
+"qX c #4DAAD4",
+"wX c #4CAADB",
+"eX c #49A2D8",
+"rX c #53A4CD",
+"tX c #58A7CD",
+"yX c #53A5D6",
+"uX c #55A6D8",
+"iX c #56A8D6",
+"pX c #55A8D8",
+"aX c #5AA4D4",
+"sX c #5BA4DA",
+"dX c #5BAAD4",
+"fX c #5BAAD9",
+"gX c #57B2D9",
+"hX c #5BAAE1",
+"jX c #57A8E1",
+"kX c #4CADE4",
+"lX c #63A3CE",
+"zX c #62A4D3",
+"xX c #61A5DB",
+"cX c #61A9D4",
+"vX c #62ADDB",
+"bX c #6AA9D7",
+"nX c #65B0DC",
+"mX c #62B0D7",
+"MX c #7BACD2",
+"NX c #7DAACE",
+"BX c #64A9E0",
+"VX c #64B0E2",
+"CX c #76C684",
+"ZX c #78D08E",
+"AX c #8494AB",
+"SX c #859AA8",
+"DX c #8D9BB3",
+"FX c #82AB9C",
+"GX c #87B892",
+"HX c #86A2A6",
+"JX c #96A7B9",
+"KX c #8CB5A5",
+"LX c #93A7AE",
+"PX c #98ADC7",
+"IX c #90AFC6",
+"UX c #82C793",
+/* pixels */
+"3X2X2X3X2X2X2X,X2X'.2X2X|.|.'.|.4X|.2X2X|.2X'.'.2X2X2X2X2X2X2X9X2X2X2X3X3X3X8X3X0X0X0X0XyX0XrXyX0XyXyXyXyX0XyX0X0XyX5XoXeXyXyXyXyX0XyXyXiXyXyXyXyXyXyXqXrXyXyXqXyX0XyXyXyXyXyXaXiXpXpXpXpXfXuXfXsXpXfXfXfXfXfXvXsXfXfXfXpXfXaXfXuXdXfXfXfXfXvXfXvXfXfXvXvXvXfXvXvXnXxXvXvXvXvXvXvXnXnXvXvXvXnXnXnXnXnXnXnXnXnXbXvXvXvXvXfXvXvXfXvXfXfXfXfXfXvXfXvXfXhXvXfXfXsXfXfXfXfXfXfXvXfXvXfXvXnXnXvXnX",
+"3X3X2X2X2X2X2X'.'.2X|.|.4X|.,X4X|.2X|.'.|.|.,X2X2X|.2X2X2X9X2X2X9X2X2X3X3X2X3X0X0X0X0X0X0X0X0X0X0XyX0XqX0XyXyX0X3XlX-X#.0XwX0XyXyXyXyXuXyXyXyXyXrXyXyXyXyXyXyXrXyXyXyXyXyXyXyXyXuXuXfXfXfXpXfXfXfXfXfXsXfXfXfXfXvXfXfXsXfXaXdXsXfXsXfXfXfXfXfXvXvXvXvXvXvXvXvXvXvXbXvXvXvXbXvXvXnXbXnXnXvXVXvXnXnXnXnXvXnXnXnXvXvXvXfXvXvXfXfXvXfXvXfXfXfXfXfXhXfXfXfXfXfXfXfXfXfXfXvXfXfXvXvXfXvXvXnXvXnXnX",
+"3X3X3X3X2X2X2X2X'.2X'.4X,X|.|.|.'.2X|. X|.,X,X'.,X2X2X2X2X2X2X2X2X2X2X2X2X3X3XeX3X3X0X0X0X0X0X0X0X0X0X0XyXeX0X0XMX=Xo.#.yXyXyXyX0XyXyXyXyXiXiXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXuXuXfXuXpXpXfXpXfXfXvXfXfXvXfXfXfXfXfXfXpXfXpXiXpXpXuXfXfXfXfXvXfXvXfXvXfXfXVXvXvXvXvXvXvXvXvXbXnXvXvXnXvXnXnXnXnXnXnXnXnXnXnXvXvXfXvXfXfXvXvXvXfXvXdXvXvXfXhXvXvXfXfXfXvXfXvXfXfXfXfXvXfXvXfXfXvXVXfXvXfXnXnXnX",
+"3X3X3X2X2X2X2X2X2X2X'.|.'.'.'.|.'.'.'.2X|.'.2X2X|.9X'.2X2X2X|.2X2X,X2X2X2X2X2X2X3X3X3X3X3X0X0X0X0X0X0XyXeX0X3XIXLX&XY #.0XyX0XyXyXyXyXyXyXyXyXyXyXyXyXyXyXiXyXyXyXyXyXuXyXyXuXuXaXuXiXfXfXfXvXvXfXfXfXfXfXfXsXhXfXfXfXpXpXfXfXiXpXfXfXfXfXvXfXfXvXfXvXvXfXvXvXvXvXvXvXvXvXvXvXnXvXvXvXvXnXnXvXnXvXnXvXvXvXvXvXvXvXvXvXfXfXfXfXfXfXfXfXfXfXfXfXfXhXfXsXsXfXfXfXfXhXfXfXfXvXvXvXvXvXvXvXnXvXvX",
+"0X3X3X2X2X3X2X2X,X,X'.|.'.'.|.}.'.'.'. X|.,X2X'.|.9X|.2X2X|.2X2X2X,X'.|.2X2X2X2X,X2X2X3X3X3XeX0X0X0X0X0XeX0XNXPXAXW J #.0XyXyX0XyXyXyXyXyXyXuXyXiXyXiXuXiXyXyXyXyXyXuXyXuXuXpXuXuXuXpXfXpXfXfXfXvXfXfXfXfXfXpXfXpXfXpXfXfXuXuXpXsXpXfXfXfXvXfXvXvXfXfXnXvXfXnXvXvXnXvXvXvXvXvXvXvXvXnXnXnXvXvXnXnXvXfXvXfXvXvXfXvXfXfXvXvXfXdXfXfXfXfXfXvXfXxXfXfXfXfXfXfXfXvXfXhXvXfXfXfXvXvXvXnXfXmXvXvXvX",
+"0X3X3X3X2X2X2X|.|.|.'.'.'.'.`.'.|.'.|.|.|.'.|.,X2X2X2X9X|.2X2X|.'.2X'.4X'.'.2X2X,X2X2X2X2X3X3X3XeXeX0X8XyXMXPXJX1.L G OXyX0XyXyXyXyXyXuXyXyXuXuXuXyXuXiXuXyXyXyXyXyXuXyXiXyXiXpXuXpXdXpXpXfXfXfXfXfXpXfXfXfXfXpXfXpXfXpXuXiXsXuXpXfXfXfXfXfXvXfXfXvXfXfXvXVXvXvXnXnXnXxXbXvXnXvXnXvXvXvXvXvXvXvXfXnXvXfXvXfXvXfXfXfXfXfXfXfXfXfXdXsXfXfXfXfXvXfXfXfXsXfXfXfXfXhXfXfXfXvXnXfXvXvXnXvXvXvXmXnX",
+"0X0XeX3X2X2X2X2X2X'. X|.|.}.'.}.}.}.|.'.|.2X|.2X|.2X|.|.'.'.'.'. X'.|.|.'.|.2X'.2X|.2X2X2X2X3X3XeX3X3X3XNXPXJX=XR q Y 1X0XyXyXyXeXyXyXyXiXuXyXiXuXyXpXaXaXyXyXiXyXyXyXuXuXuXuXuXuXaXpXfXfXpXvXfXfXfXfXpXpXpXpXfXaXpXuXuXuXaXuXuXpXfXfXfXfXfXfXvXvXvXfXnXvXvXVXvXnXvXvXvXnXnXnXnXbXvXvXvXvXfXvXvXnXfXvXfXfXvXfXfXfXfXfXfXfXsXfXsXfXfXfXsXfXfXfXfXfXfXfXfXhXvXvXfXfXgXfXfXfXvXnXvXfXnXfXvXfXnX",
+"0X0XeX0X9X2X2X2X2X|.|.|.|.|.'.`.}.|.|.|.|.,X,X|.'.,X.X|.|.|.|.'.}.'.'.'.|.'.'.'.'.,X2X2X2X2X2XeXeX3X8XcXIXPXSX-.J 3 R 3X0XyX0XyXyXuXuXyXuXyXaXpXpXyXpXyXyXyXyXyXyXuXuXuXuXuXuXuXuXfXpXpXpXfXfXfXfXfXpXfXpXiXuXuXpXpXpXiXaXuXuXuXsXpXfXsXsXfXvXdXvXfXfXVXvXvXfXvXvXvXnXvXvXvXbXnXnXnXvXvXVXfXfXvXvXfXfXfXvXfXvXvXfXfXfXfXfXfXfXfXsXiXfXfXfXfXfXfXfXvXfXfXsXhXfXfXVXvXfXvXfXfXfXfXnXfXnXvXnXnX",
+"0X0X0X8XeX2X2X2X,X2X'.'. X}.'.,X,X'.`.'.2X'.'.'.|.|.|.}.}.|.{.|.`.`.}.).|.|.|.'.|.|.'.,X,X2X2X3X3X3XrXIXPXJX%XW 4 1 R yXyX0XuXyXyXyXiXyXuXiXiXyXiXiXuXyXiXyXyXyXyXyXyXaXuXuXaXiXyXuXpXpXpXaXfXpXpXfXfXpXpXuXpXyXuXiXuXuXuXaXuXiXuXiXsXdXfXfXfXfXfXnXvXvXvXvXmXnXvXnXvXvXvXvXvXvXvXvXvXVXvXvXfXfXfXvXfXfXfXfXfXfXfXfXfXfXsXfXfXaXfXsXfXpXfXfXfXfXfXvXdXfXvXvXfXfXgXfXvXvXdXvXvXvXfXvXcXvXvXnX",
+"0X0X8XeX8X2X2X2X2X'.'.'.{.'.'.`.).{.'.`.'.'.`.'.'.'.|.}.{.'.).).`.`.'.'.|.}.'.'.'.`.,X4X4X,X3X3X3X<XMXJXDX=X=.t < > Q <XyXyXyXyXyXyXuXuXiXyXuXuXuXuXiXyXuXyXyXyXyXiXyXuXyXyXuXsXuXaXfXfXpXfXpXfXpXpXpXfXuXuXuXiXiXuXyXuXyXyXuXyXpXpXpXpXfXdXfXfXfXfXvXfXvXvXnXvXnXvXnXvXnXvXvXvXvXvXfXvXvXvXfXvXfXfXfXvXfXfXfXsXfXfXfXvXfXfXfXfXfXfXuXfXfXfXvXfXsXhXfXvXfXfXfXvXfXvXvXfXvXfXfXvXvXvXfXvXvXvX",
+"yXeX0XeX3X2X2X'.2X|.].2X'.'.'.'.{.).'.4X|.|.'.'.|.'.|.|.}.'.'.}.`.'.}.`.).}.}.}.4X'.|. X2X X X4X4XbXPXJX=X1.$.5 1 2 P 8XyXyXyXyXyXiXyXiXuXyXiXuXiXiXuXuXuXuXyXiXuXuXuXyXuXpXuXuXpXfXfXuXpXfXpXuXuXuXpXuXuXiXiXyXyXyXiXyXyXyXyXuXaXiXiXfXpXfXfXfXfXfXfXnXvXvXvXfXnXnXvXvXvXvXvXvXvXvXvXfXfXfXfXfXfXfXfXfXpXfXpXfXfXfXfXfXfXfXsXfXfXsXsXpXfXfXfXfXfXfXvXfXfXvXvXfXvXfXvXfXfXvXfXfXfXvXvXcXvXnX",
+"0XeX0X8XeX2X2X2X2X2X4X2X_.'.'.|.,X4X'.'.'.`.'.`.'.'.'.`.`.`.`.`.`.'.).).`.'._.'.'.`.'.2X,X,X,X,X5XIXJXDX-X%.Y 4 > : J ,XeXyXyXuXyXuXiXyXuXiXyXuXuXuXuXiXyXiXyXiXuXiXaXuXaXiXuXpXsXuXpXpXsXpXpXuXaXuXuXaXuXyXyXyXuXuXyXyXyXyXyXuXuXuXfXiXpXfXfXfXfXnXnXfXgXvXmXnXvXvXvXnXnXvXnXvXvXvXvXfXvXfXfXfXfXpXfXpXpXaXfXiXfXpXfXfXfXfXfXfXpXfXfXfXfXfXfXfXfXfXfXfXfXfXvXfXfXvXfXvXvXfXvXvXfXvXvXvXvXvX",
+"yX0X0X0X0X3X9X2X|.2X X'.4X2X|.{.|.|.).{.{._._.{.{._.{.{.[.[.[.[.{.).).).).)._.|.`.`.'.'.'.'.2X,XIXJXDX-X=.W r 4 1 : G 1X3XyXpXyXiXiXuXyXiXuXiXiXuXiXiXyXiXiXyXuXiXuXuXuXsXuXuXfXpXfXuXaXuXuXuXuXuXuXuXuXyXyXyXyXyXyXyXyXyXyXyXyXuXiXiXiXfXpXfXfXvXfXvXfXvXfXnXvXvXvXvXvXvXvXvXvXvXfXfXvXfXfXfXpXfXpXfXpXaXpXuXfXpXpXfXfXfXfXfXfXfXfXpXfXfXfXfXfXfXfXfXfXvXvXfXvXfXvXfXfXfXfXvXfXvXfXvXvXvXvX",
+"yX0X0X8X3X9X2X2X|.2X'.,X,X2X}. X X[.}.|.}.).}.).`.).}.}.`.`.).[.`.).).`.}.}.}.}.'.'.'.'.'.,X2XlXIXDX=X1./ E 8 8 < : 2 ~.0XyXuXuXyXiXiXuXyXyXuXyXuXyXuXiXuXyXyXiXyXuXuXuXiXuXuXuXpXuXpXpXiXiXiXuXyXiXiXiXyXyXyXyXyXyXyXyX0XyXuXuXuXuXuXpXpXfXfXfXfXfXfXfXfXvXvXfXvXvXfXvXfXvXfXvXvXvXfXfXfXvXpXfXfXiXpXpXiXpXiXiXpXfXfXpXfXxXfXsXfXpXfXfXfXvXfXvXfXfXdXvXdXfXfXfXvXfXvXvXfXvXfXvXfXvXvXvXvXfX",
+"0XyX3X0X9X9X9X9X9X2X'.,X,X2X X|.,X1X}.{._.).).).).)._.).).).(.).).).).{.).}.'.).'.`.'.}.'.|.1XIXJXAX2.&.E K K e 3 , : O.3XuXyXuXuXiXyXuXyXiXiXyXyXyXiXyXyXyXyXiXiXiXaXpXpXuXuXuXuXiXuXyXuXyXiXyXpXuXuXyXyXyXyXyXyXeXuXyXyXyXyXuXuXuXuXuXpXfXpXfXfXfXfXfXfXvXVXfXvXfXfXvXvXvXfXvXvXvXfXfXfXfXfXiXiXuXuXuXsXuXuXuXfXfXfXfXfXpXfXfXfXfXfXfXvXdXdXvXfXfXfXdXfXfXfXfXvXdXfXcXfXvXfXvXvXfXvXfXvXVX",
+"yX3X0X3X0X3X9X|.2X'.4X4X|.|.'./.D.T.B.N.N.M.M.M.M.M.M.M.M.M.N.n.M.N.M.M.M.M.M.M.M.M.N.n.B.T.W.KXSX%X;.W L P 8 4 > - - | eXuXyXuXyXyXyXiXiXyXyXyXyXyXyXyXyXyXyXuXaXuXpXuXiXsXuXuXuXaXuXiXiXyXuXuXaXiXyXyXyXyXyX0XyXyXyXyXyXyXyXeXiXuXpXuXiXfXfXfXfXgXfXfXfXvXfXvXvXfXvXfXvXfXvXfXvXfXfXfXfXfXpXsXiXuXpXuXaXiXuXpXuXfXsXfXfXsXfXfXfXfXfXfXfXfXfXvXfXfXcXvXfXvXfXfXfXfXvXvXvXfXfXvXfXvXvXvXvXvX",
+"0X0X0X0X3X2X9X9X2X2X2X2X2X|.2XD.T.B.N.N.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.N.J.!.GXFX=X-.$.E e 8 e < , O O 5 ,XyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXuXuXuXpXpXpXfXuXuXuXaXiXpXuXaXyXuXuXuXuXiXiXyXyXyXyXyXyXyX0XuXwXpXyXuXwXuXuXpXiXfXpXfXfXfXfXfXvXfXfXfXvXfXdXfXfXfXfXmXfXfXdXfXaXpXpXfXiXaXuXuXuXuXpXfXuXpXfXpXiXiXsXfXpXfXfXfXdXfXfXfXfXdXdXfXfXdXdXfXfXvXfXvXvXfXvXvXvXfXfXvXvX",
+"yX0X0X3X3X2X9X9X2X2X'.|.'. X2XJ.B.N.N.M.M.M.M.M.M.M.M.M.M.n.M.M.n.M.M.M.M.n.M.M.n.M.n.B.J.Q.KXSX1.=.E L 9 8 3 - @ + O : OXyXyXyXyXyXyXyXyXyXyXiXyXyXyXaXyXuXaXuXiXsXfXpXuXfXuXaXsXuXuXuXuXyXyXuXpXuXuXuXiXyXyXrXyXyXyXyXyXyXyXyXuXyXyXuXsXpXpXfXfXpXfXpXfXfXvXdXfXvXfXvXfXvXvXfXvXcXfXfXfXfXfXpXuXiXuXuXaXuXpXiXuXfXuXpXfXfXpXfXuXfXcXfXfXvXfXvXfXvXvXfXvXfXvXfXdXfXfXfXdXfXcXfXfXvXvXvXfXvX",
+"0X0X0X8X3X2X9X|.2X2X,X2X2X X`.B.N.M.M.n.n.n.n.v.n.n.n.n.n.n.v.n.n.n.n.n.n.v.n.v.n.n.m.J.R.:XHX*X-.] L K 4 6 - @   @ # P ].6XyXyXyXyXiXuXiXyXiXyXaXuXuXuXuXuXuXuXpXsXpXfXfXiXpXiXiXiXiXsXyXuXyXiXuXwXiXiXuXyXyXyXyX6XyXyXuXyXuXyXyXyXuXyXpXuXpXpXiXiXfXfXfXfXdXfXdXfXvXfXvXfXfXvXfXvXvXdXfXsXfXuXuXuXuXaXuXuXyXaXaXuXuXuXaXiXuXiXpXfXvXfXfXdXfXvXfXfXfXvXdXvXfXfXfXfXvXcXdXvXfXvXvXfXhXvXvXfX",
+"0X0X0X3XeX3X9X9X2X2X2X2X'.'.|.n.b.n.n.v.s.v.v.v.a.a.v.v.a.v.v.a.v.a.v.v.v.v.v.v.v.d.V.I.F.>XAX1.%.L e 5 3 -   X @ 7 O.1X3X0XyXyXyXyXyXiXyXiXiXiXuXuXuXaXpXuXfXpXfXuXfXpXiXfXpXfXiXfXpXuXuXaXuXyXuXuXyXiXyXyXyXyXyXyXyXyXuXyXyXyXuXuXiXaXuXpXfXpXpXfXfXpXfXfXfXfXfXfXdXfXfXvXfXfXvXfXvXfXfXfXpXfXuXuXpXyXuXyXyXyXyXuXuXiXuXpXiXiXfXpXfXfXfXvXfXfXdXvXfXfXfXfXdXfXvXaXfXfXfXfXfXfXfXvXfXfXfXvX",
+"rX0X0X3X3X3X9X9X2X2X,X2X,X'.2Xn.n.v.v.v.a.a.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.a.a.s.j.K.W.FXSX%X=.E e 8 1 , + @ X 5 oX2XeX0XyXyXyXyXyXiXaXuXyXuXiXpXuXpXfXpXiXpXiXfXpXpXaXpXfXpXfXfXpXpXpXpXuXuXuXuXuXyXyXyXiXyXyXyXyXiXyXyXyXyXiXyXuXuXyXuXuXuXuXuXiXfXfXfXfXfXfXfXfXfXfXfXfXvXfXfXvXvXvXfXfXpXuXuXuXpXpXyXyXyXiXyXyXyXiXiXuXiXpXpXpXfXfXvXvXfXvXfXvXdXvXvXfXvXfXfXvXfXvXvXfXfXfXfXvXfXvXfXvX",
+"0X0X0X3X3X3X3X9X2X2X|.2X2X'.'.v.v.v.v.v.a.p.a.a.a.a.a.a.a.s.g.d.s.a.a.a.a.a.a.a.f.x.I.:XFXSX2.$.Y e 3 , O   X = $XeX3XyXyX0X0XyXyXuXyXyXiXuXuXuXsXuXfXpXpXfXfXfXfXfXpXfXfXpXpXfXfXpXvXpXfXpXuXaXuXuXyXyXyXyXyXiXyXyXiXiXuXyXyXaXyXiXuXwXyXyXiXiXsXuXpXpXpXfXfXfXfXfXdXfXfXvXfXvXfXcXfXfXfXfXfXpXpXyXiXpXiXyXyXyXyXyXyXyXyXuXuXuXfXfXdXvXfXdXfXfXfXdXfXfXdXfXfXfXdXfXsXfXfXfXfXfXfXvXfXfXvXfX",
+"rX0X0X0X3X3X9X8X2X2X3X|.'.|.'.n.v.v.v.s.a.a.a.a.a.a.s.s.d.l.c.c.x.d.a.a.a.a.a.s.k.K.E.>XAX%X%.E e 4 , @   $ h M #X0XeX0XyXyX0XyXyXyXyXyXaXuXuXuXpXfXfXfXfXfXfXfXfXfXdXuXfXfXfXfXsXfXfXfXpXdXuXiXuXiXyXaXyXyXyXuXuXpXiXuXyXiXyXyXyXyXuXyXuXuXuXuXiXyXuXfXpXfXfXfXfXfXdXvXfXfXfXvXvXvXfXfXfXfXpXfXiXuXuXpXyXyXiXyXyXiXyXyXuXiXpXpXfXpXfXdXfXvXfXvXfXvXfXfXfXfXfXvXfXfXfXfXsXfXsXfXfXfXfXdXfXfX",
+"0X0X0X0XeX3X3X2X2X2X'.9X,X'.'.b.n.v.v.v.a.a.a.a.a.a.s.d.z.I.D.S.I.x.d.a.a.a.a.g.c.Y.:X>X*X1./ e 3 , # . * h N n 3X0X0X0X0X0XyXyXyXeXyXyXuXuXuXpXuXuXfXsXfXfXfXfXfXfXfXsXfXiXsXvXvXfXfXfXfXpXpXuXaXyXyXyXyXuXyXuXiXiXuXuXuXyXuXyXyXyXyXyXiXuXuXiXiXuXpXiXiXpXfXpXfXfXcXfXfXfXfXvXvXfXvXfXfXfXfXpXuXiXiXaXiXyXyXyXyXaXyXyXiXaXuXpXfXfXfXdXfXfXdXfXfXfXvXdXsXvXfXfXfXdXfXfXdXfXfXfXfXfXfXvXfXvX",
+"rXeX0XeX3X3X3X3X3X2X,X X,X'.'.n.b.b.b.a.a.a.s.p.a.s.s.H.I.F.:X^ Q.G.j.s.a.a.v.x.I.CXHXAX%X%.Y 5 > -   % d Z.e.j 3X0X9X0X0XqXyX0XyX0XuXuXuXuXuXuXpXfXpXsXfXfXiXfXfXqXpXfXgXaXhXvXiXvXxXiXpXfXdXsXsXqXrXiXqXpXqXjXpXpXfXpXhXpXqXuXxXyXqXuXqXpX6XuXpXyXyXuXpXqXfXjXpXvXpXfXfXvXgXhXvXfXBXiXfXfXcXdXjXsXiXfXwXuXiX6XyXyXqXaXsXuXsXvXuXvXfXfXfXfXfXfXfXhXvXfXfXvXsXfXfXfXdXsXpXsXfXfXfXfXvXfXfXvX",
+"0XyX0X0XeX3X3X3X2X,X2X2X2X'.|.v.b.b.b.a.a.s.s.s.s.d.V.R.CXGX&X^ y.L.j.v.a.s.j.G.ZX;XSXAX1.W e < -   * d t.e.b c 9X0XqX3X0X0X0X0X0XyXyXuXyXyXuXuXuXpXpXfXvXpXvXzXbXbXvXlXdXfXuXfXdXtXdXdXdXyXpXgXyXfXaXyXfXpXyXpXiXdXiXwXpXyXiXaX6XdXrXaXiXrXvXuXqX0XyXiXdXdXaXuXqXyXfXdXcXaXvXfXfXvXvXdXfXaXdXgXpXyXrXiXyXrXrXpXpXyXqXtXiXyXcXrXpXgXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXdXpXdXsXfXfXfXfXfXaXfXfX",
+"yXyX3X0X0X3X3X3X2X2X2X X2X'.|.v.b.b.v.a.a.a.s.f.j.H.I.CXKXSX2.H ! P.k.s.a.s.k.I.CX>XAX2.%.t 4 7 + . & Z.C.e.b z 9X8X0X9X0X0X0XyX0XyXyX0XyXyXyXuXiXpXpXfXiXfXaX .D 9 0 D O.sXbXaXo.T K A r [ zXbX' r r r r K K e y J u zXyX' r r I A K A T  .<.aXuXjX0X+.A 9 u ,.aXdX` U 8 F XXcXvXdX#XD A T } 6XzX} I 0 A T o.yXyXyXo.D I A 9 } zXxXsXfXsXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXfXiXaXfXfXfXfXfXdXvX",
+"0X0X0X3X0X3X3X3X3X3X,X2X2X'.,Xn.b.v.b.a.s.s.j.k.G.R.GXKXDX%X/ G m S.z.f.a.s.z.Y.;XSXAX1.W q , O   & N I.w.6.v z 2X9X3X0X0XeX0X0XyX0XyXyXyXyXyXyXuXpXpXfXiXiXbX) r U K A R yXVXtXR A J K L ) fXfX( r S F A 9 I K K 9 u fXiX| K K r A Z 8 P S I o.6XuXpX,.9 L r :.aXaX` K J D XXcXfXnXXXZ L U ( cXvX( K L t J R rXuXsXR r r A K } dXpXpXsXfXfXfXfXfXsXhXfXfXfXfXfXfXfXfXfXfXsXfXfXfXsXfXfXfXfX",
+"yX0X0X0X0X0X3X8X3X3X,X9X2X|.2Xb.b.v.v.d.j.H.G.R.W.GXKXSX%X=.Y 5 V t.c.k.d.j.K.W.>XAX%X&.J 6 # . = m P.z.0.6.b z 2X8X0X3XeX8X0X0XyX6X0XyXyXyXuXuXaXiXuXfXfXiXcX( I e r K A <XvX5XD I K K K ' fXpX) K J y L K r 9 A U D uXyX} A J U A 9 I r t t A $XrXyX#.A J S @.iXfX' 9 I A #XnXgXxXOXA r 9 ) dXyX..Z I I K 9 <XyX5XA U e K e ' vXuXfXiXfXiXpXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXfXuXaXfXfXaXfXvX",
+"<XyX0X0X0X0X0XeX2XeX2X3X2X'.2Xb.b.v.m.k.G.I.E.:XFXFX&X2.=.E 9 8 5 m U.x.g.l.Y.;X>X%X1.E 6 - + X g S.H.h.8.6.v z 2X2X3X3XeX3X3X0XeXeXyXuXyXyXuXeXuXiXpXsXfXiXdX) J 9 Y J K $XpX$Xr r U 9 9 } fXuX..J 0 F XXdXgXfXsXsXzXpX6X} J L 0 @XdX+X .I J Z _ yXuX,.r y L :.uXfX` t U r XXxXhXnXXXK t U ' vXfX` K r U r r oXiX<.A L I K r ) uXjXpXiXfXpXfXpXfXfXfXfXfXfXsXfXsXfXfXdXfXfXaXfXuXfXfXfXdXfX",
+"yX0X0X0X0X0X0X0XeXeX2X2X3X9X2Xv.b.b.m.H.P.A.A.2.1.;.%.] Y P Z q 5 V r.G.k.G.W.KXSX*X&.y - @ o % Z.K.j.i.8.4.v z 9X2XeX2X3X3XeX3X0XwXyXeX0XeXuXyXyXpXpXuXfXpXfX) A K ..A A o.dXo.9 A o.A K X.vXvX' K L A o.@.#.@.@.@.oXfXxX) Z J A XXpXpX6XA Z K F <XrX+.P 9 D @.iXzX| A A A OXfXfXfX7XJ e K ' dXdX` Z A ..I r o.dXo.9 Y ] A u ' rXfXpXpXuXsXpXfXsXpXfXfXfXfXfXfXfXfXfXsXfXsXdXiXfXsXfXdXfXfX",
+"3XyX0X0X3X0X0X0X0X8X2X3X2X'.2Xb.b.b.m.G.P.Z.H H G J e y K J J q 6 H ! I.G.I.UXHXAX1.E < #   % 9.I.l.f.i.8.4.v z 8X3X2X2X3X3X3XeX0X0X6X0XyXyXyXyXyXyXiXfXfXsXxX..r K >.I L { zXR r U :.A J ` dXfX' J K K K r L 9 P 9 @.eXsX) K 9 D XXuXpXsX) J K A 7XqX@.K r 9 @.iXyX( U r r XXfXgXvX#XJ J K ) xXdX` L A @.I r R tXR S J ,.D 9 ) aXyXuXsXfXuXfXpXpXfXfXfXhXsXsXfXfXsXfXfXfXuXsXfXfXfXfXvXfXvX",
+"yX0X0XyX0X0X3X3X3X3X9X3X3X.X2Xb.n.v.v.k.z.G.S.m C 7 6 5 q J e J 8 Z H D.Q.ZX;XDX-X%.5 - + $ l P.H.d.s.i.8.4.v z |.2X2X3X3X3X3X3X0X0X0X0X0X0X3XyXyXyXpXpXyXsXdX' Z K >. .I e +Xr K [ @.A A ( cXfX) K K r K r u r J A #.sXpX) y L u oXaXuXyX) K Z I ~.yX:.J K K :.aXpX` J t K OXiXcXmX#X9 9 K ( xXdX( A r >...e I @Xr A ..>.A L ) dXqXuXiXpXpXfXpXpXfXfXfXfXpXiXpXpXpXdXpXfXpXfXfXfXfXdXdXgXvX",
+"0X0X0X3X0X0XeX3X3XeX9X4X3X9X2Xb.n.v.v.s.d.g.j.c.9.k ; 2 3 5 9 9 e J Q A.ZXZXKXDX-.P 6 @ . & D.L.g.s.s.i.8.4.v z 2X2X2X3X3X3X3X3X0X0X0X0X0X6XyXyXyXyXyXuXiXsXiX) K Z +.#.I A ( L A +.>.e J X.vXdX) J t A *.:.,.#.>.:.oXiXiX( J K D oXuXyXpX' Z K y +XuX+.Z S A @.yXyX' Z y A XXhXpXfXXXI J Z ..vXdX] r K >.>.J 8 ( K I @.>.A K [ aXpXuXaXpXaXpXfXfXfXpXfXpXfXfXfXdXfXpXfXpXiXsXpXfXfXfXvXfXvX",
+"0XyX0X3XeXeX3X9X3X3X3X9X2X9X2Xb.n.v.n.a.s.s.s.g.L.~ ; 2 3 4 8 9 Z P Q ;.KX>XAX%X&.5 -   % N I.k.d.a.a.i.8.3.v x '.2X2X3X3X3X3X3X0X0X0X0X0XyXyXyXyX0XpXyXyXuXiX) t i ,.7Xr r t K r 1X>.9 Z | dXiX..K e D @XdXqXyXyX6XpXuX6X) 9 A r +XsXpX6XI J A r 5XyX#.I K r +.iXjX) L r A @XsXhXxXoXA r K ) VXpX' J Z +.5XS K I Z I 7X:.K r [ yXuXyXuXuXsXpXfXpXfXfXpXfXpXfXiXpXfXiXpXpXdXfXfXfXvXfXvXfXvX",
+"0X0X0X0X3X3X3X9X3XeX8X3XeX9X3Xb.n.v.v.a.s.a.a.s.k.Y.r.; - > 4 e K P / %.*X%X2./ J 2 O $ l Y.z.d.a.a.a.i.8.4.v x |.2X'.2X2X3X2X3X3X3X3XeX0X0X0XyX0XyXyX0XqXyXpX( A L :.yXR e K K Y uX,.u K } zXuX[ r 0 F XXfXiXpXjXsXyXjXfX) A 9 U oXyX<XO.I J Z { 6XuX,.A e K >.0XjX#.A r Z ..aXpXgX..e L r ,.aXvX) L r ,.fXT i u J T cX>.A e ) uXxXuXuXaXiXuXpXpXpXpXfXiXfXpXfXpXaXfXpXfXpXfXfXfXfXfXfXfXvX",
+"0X0X0XeX3X3X3X3X3X3X2X3X2X2X2Xb.n.v.v.a.a.a.a.a.s.x.I.A.k : 3 3 J K W $.=.;.&.Y > # X & S.K.k.s.a.a.a.i.8.4.v z '.2X'.2X2X2X2X3X3X3X3X3X3XeXeX0XyX3XjXuXiXuXyX| A K ,.yX} J A A ..iX>.L K ( dXgX' r L e L J 9 J K K F oXaX( L A t 0 D A r y K S oX0X0X+.A Z A @.yXpX1XF K K J I ( I Z L K A 5XgXdX` r I ,.qX..L i J  .gX+.Z K ) yXyXyXyXuXuXuXuXfXiXiXpXiXfXpXpXpXfXpXdXpXfXfXhXfXfXfXvXfXnX",
+"0X0X0X3X3X3X3X3X9X3X2X3X3X2X2Xb.v.n.v.a.a.a.a.a.v.s.z.I.Z.k 2 3 5 J Y W / W K 5 , + * N I.l.d.s.a.a.a.p.8.4.v z '.'.2X2X2X2X2X2X3X2X9X3X3X3X3X0X3XyX3X3X0XsXiX` e J @.tX>.t K e >.dX@.A J X.dXdX( J K I 9 J K J J y r +XqX( J Z K K r t r L 9 o.6XyXyX+.U t L :.aXyXdX>.A K J Z Y y t r S $XiXfXaX..y K +.qX^.9 t J #.dX,.r t ' iXiXuXiXuXuXuXiXiXpXiXiXfXiXfXiXpXiXfXpXfXpXfXfXfXvXfXvXvXvX",
+"3X0X3X3X3X3X2X2X9X9X2X2XeX2X2Xn.v.v.v.a.a.a.a.a.s.s.d.z.!.r.k 2 3 5 J P U K 4 : O . h P.H.g.a.a.a.a.a.i.8.3.v z '.'.2X|.2X2X2X2X2X2X2X9X3X3X3X6X3XyXwX0XeXsX3X[ A A #.uX#X0 F I OXsX@.I 9 ) zXsXo.9 9 D A A K A A A u @X6X' A D U 9 A I R  .oXyXpX9XiX#.D 9 I ,.uXfXrXuXoXR F 9 A u r _ ~.fXiXsXcX| A A ,.nX$XI u A 7XuX,.D 9 ..sXfXpXpXpXuXiXuXuXuXuXuXuXfXpXsXuXfXpXfXfXfXfXfXvXhXvXvXvXnX",
+"0X3X3X3X3X3X3X2X2X9X3X2X3X2X2Xn.n.n.v.a.a.a.a.a.s.a.s.d.z.I.t.k 2 q e Z K 4 3 O $ & Z.G.j.s.a.a.a.a.a.p.8.4.v z '.,X|.2X'.2X'.,X2X2X2X2X3X3X3X3X3X3X3XyX0X6XwXrXaXyXuXwXiXaXaX6XgXuXsXaXdXyXjXjXrXqXsXsXsXpXyXiXsXuXrXwXwXyXiX0X6XyXyX0XrXyX3XpXyXyX0XaXyXyXrXqXpXuXiXyX6XxX6XOXXX+X#XaXiXuXuXfXfXaXdXdXjXfXpXxXuXgXfXfXyXfXcXaXpXyXuXpXpXuXiXiXyXuXuXuXuXuXfXuXfXpXfXpXfXfXfXfXfXfXvXfXnXfX",
+"0X9X9X9X9X2X2X9X.X2X2X2X3X2X2Xv.v.v.v.a.a.a.a.a.a.a.a.s.g.z.I.! V 2 q e 4 < - + % m I.x.v.s.a.a.a.a.a.p.8.4.v z ,X|.,X4X2X'.'.2X2X2X2X2X2X3X2XeX3X3X0X0X0XyXyX0XyXyXyXyXyXuXuXpXuXpXpXiXuXuXuXiXuXyXuXyXyXuXyXyXyXyXyXyXuXuXeXyXeXyXyXyX0XyX0X6XyXyXuXuXuXuXuXyXyXyXuXuXaXiXiXyXiXyXuXiXuXpXuXpXpXpXfXfXfXpXfXpXgXpXfXpXfXfXpXpXiXuXiXpXaXaXuXuXuXyXiXpXiXuXiXfXpXfXfXpXfXfXfXfXfXnXfXfXnXnX",
+"eX9X9X0X9X2X9X2X9X2X9X2X2X2X2Xn.v.n.v.a.a.a.a.a.a.a.a.a.s.m.H.P.M 2 > 4 3 , @ . d C.z.g.s.a.a.a.a.a.p.p.8.4.v j '.|.|.|.'.'.2X'.|.2X'.2X2X3X3X3XeX3X0X0X0X0XqX0XyXyXyXyXyXyXpXpXuXuXuXuXyXuXuXiXyXaXyXyXyXyXyXyXaXiXyXyXuXeXuXuXuXyX3X0XyX0XyXyXyXyXuXwXuXyXuXyXuXyXyXyXuXiXuXyXyXyXuXyXaXaXuXuXpXdXfXpXfXfXpXfXfXfXiXfXpXfXiXfXpXiXpXaXpXuXyXyXiXyXiXpXpXpXiXpXpXpXfXpXvXfXfXfXfXfXnXnXnXfX",
+"eX3X3X2X2X2X2X2X2X2X2X2X2X2X2Xv.v.v.v.a.a.a.a.a.a.a.a.a.s.s.j.K.E.V 2 1 , - . & N G.j.s.a.a.a.a.a.a.p.p.8.3.v z '.'.'.|.|.2X,X2X2X2X2X2X3X2X2X3XeX3XeX8X0X0X0X0X0XyXyXyXyXyXaXiXyXuXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXeX0XyX6XyXyXyX0X3XuX0XyXyXuXyXyXyXyXyXyXuXuXyXyXyXyXyXyXyXyXuXyXuXuXpXfXpXfXfXpXfXpXfXpXfXpXfXpXfXpXpXpXpXfXuXiXpXuXiXuXiXyXuXuXiXuXiXfXpXfXfXfXvXfXfXnXnXfXnXnX",
+"eXeX2X2X9X9X2X2X2X2X,X2X2X2X2Xn.n.v.v.a.a.a.a.a.a.v.a.a.a.s.s.x.I.D.k 2 - @ . d S.V.d.a.a.a.a.a.a.a.p.i.8.4.v z `.4X,X4X|.|.2X4X2X2X2X2X2X2X2X3X3X3X3X3X3X0X0XyX0X0XyX0XeXyXyXyXyXyX0XyXyXyX0XyXyXyXyXyXyXuXuXuXuXyXyXwXyXuXuXyXyX0XyX0XyXyXyXyXyXyXyX0XyXyXyXyXyXuXyXuXyXyXyXyXyXyXyXyXyXyXuXuXsXpXiXpXpXfXpXfXiXfXiXiXiXuXpXpXpXfXfXpXfXuXuXpXyXuXiXuXuXuXuXuXaXpXpXfXvXfXfXfXfXfXfXvXvXvX",
+"3XeX3X3X3X2X2X2X9X2X2X4X2X2X2Xv.v.v.v.v.a.a.a.a.a.a.a.a.a.a.a.d.c.I.r.2 @ . & 9.L.g.s.a.a.a.a.a.a.a.a.p.8.4.v z '.|.|.|.'.2X2X,X,X2X,X9X2X2X3X2X3X3X3X3X3X0X0X0XyX0X3XyXyXyXyX0X0XyXyXyX0XyXyXyX0XyXyXyXyXyXyXyXyXwX0XyXyX0X0XyX0X0XyXyX3XuXyXyXyXyXyXyXyXyXyXyXyXyXyXuXwX6XyXyXyXyXyXyXuXyXuXuXuXiXuXuXuXpXpXsXpXuXuXuXiXuXuXuXiXsXuXdXuXuXsXpXuXiXuXuXuXuXaXuXdXpXpXfXuXsXfXfXfXfXfXvXfXbX",
+"0X0X3X3X3X2X9X2X2X2X,X2X,X3X2Xn.v.n.v.a.a.a.a.a.a.a.a.a.a.a.a.s.g.c.Y.M ; $ d P.l.s.a.a.a.a.v.a.a.a.p.p.8.4.v j '.'.,X4X'.2X'.|.2X2X|.2X2X2X2X2X2X3X3X3X0X3X0X0X0X3XyXyX0XyX0XyXyXyX0XyXyXyX0XiX0XyX3XyX0X6X0XyXuXuXyXyXyXyXyXyXyXyXyX0XyXyXyX3X0XyX0X0XyXyXyX3XyXyXwXuXeXyXyXyXyXyX0XyXyXuXuXuXuXaXiXyXuXpXiXiXpXiXyXuXuXiXiXiXpXpXpXpXfXuXpXpXiXyXyXiXuXiXiXuXpXpXfXpXfXvXfXfXvXfXfXvXnXvX",
+"0X0XeX3X3X3X3X9X3X9X,X3X2X2X2Xv.v.v.v.a.a.a.a.a.a.a.a.a.a.a.a.a.s.k.K.E.d & 9.K.j.s.a.a.a.a.a.a.a.a.p.i.8.4.v j '.}.'.|.'.2X2X'.'.2X2X2X2X9X3X2XeX2X3X3X3XeXeX3X3X0X0X0XyX0X3X0X0X0X0X0X3XeX0XeX0XyX0XyX0XyXyXyXyXyXwXyX6X0XyX0XyX3XyX0X3XuX3XyXyXyXuX6XyX0XyXyXyXyX0XyXuXuXuXyXyXyXyXyXuXuXwXiXiXuXiXuXaXiXyXyXuXuXuXuXuXiXuXiXuXpXpXfXfXpXaXiXiXyXyXyXiXuXiXuXpXfXpXfXfXfXfXfXdXdXfXvXfXvX",
+"0X0X3X3X3X3X3X9X9X2X2X2X2X2X2Xn.n.v.v.a.a.a.a.a.a.a.a.a.a.a.a.a.a.v.x.I.Z.n U.l.d.s.a.a.a.a.a.a.a.a.p.i.8.4.v j '.,X4X|.'.2X'.,X2X,X|.9X|.8X9X2X2X2X3X0X3X3X0X3X0X0X0X0X3X0X0X0X0X0X0XyXeX0X0X0X0X0XyX0XyX0X3XyX6X0XuXyXeXyXyXyXyXyXyXyXyXyXyXyXyX3XwX0XyXyX0X6XuXuXeXyXyXyXwX0X6XyXuXwXuXuXuXyXuXuXiXuXiXuXuXiXuXuXiXiXuXyXyXyXiXpXpXfXuXpXuXuXyXyXiXyXyXyXuXfXpXfXfXpXvXfXsXdXvXfXvXfXvXvX",
+"0X3X0X0X0X0X3X3X2X3X X'.8X8X,Xv.v.b.v.a.a.a.a.a.a.a.a.a.a.a.p.a.a.a.g.x.L.w.c.k.p.a.a.a.p.a.a.a.a.p.a.u.8.4.v z }.4X'.|.4X'.2X'.'.2X|.2X4X2X2X2X3X9X9X3X9X3X3X3X3XeXeXeX0X3X3X3X3XeX3X0X0X0X0XyX0X0XyX0X0XyXyXeX0XyXyXyX0XyXyXyXyXyXyX0XyXyX0X0XyX0X3XyXyXrXyXyXrXyXyXyXyXyXyXyXeXyXyXwXeXsXuXpXpXpXyXuXaXpXyXyXyXyXpXpXiXyXyXyXaXuXuXuXuXuXpXuXiXyXyXyXyXuXuXuXfXpXfXfXfXfXfXfXfXfXcXvXnXvX",
+"0X0X3X0X0X0XeX3X3X3X3X<X,X2X3Xn.b.b.v.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.g.x.x.k.f.a.a.a.a.a.a.a.a.a.a.a.u.8.3.x z {.,X}.'.'.'.|.|.'.'.2X|.'.2X2X2X2X9X3X3X3X3X3X3X0X9X0X0X3X3X2XeX3X3X3X3XeX0X0X0X0X0X3XyX0X0XyXyXyXyX0X0XyXyX0XyX0XyXyXyX0XyXyX6X0XyXyXyX6X0X0XyXyXyXyXyXyXyXuXuXuXuXyXuXyXyXuXuXuXiXiXiXiXyXiXyXaXyXpXyXiXyXyXyXuXiXpXuXuXpXaXiXyXyXyXuXyXuXpXpXsXfXfXfXfXfXfXfXfXvXvXfXcXvX",
+"3XeX0X0X0X0X3X3X3X3X2X2X2X9X2Xv.b.b.v.a.p.p.p.a.a.a.a.a.p.a.a.a.a.a.a.p.s.f.f.a.a.a.a.a.p.a.a.a.a.p.i.u.7.3.x f _.'.'.'.|. X'.'.'.|.'.2X2X2X2X2X2X2X3X3X3X3X3X3X3X3X0X0X3X9X2X2X3X3X3X3X3X0X3X0X0X0X0X0X0XyXeXyX3XwX0XyX0XyXrXeX0XyX0XyX0XyXyXyXyXyX3X3XyXyXyXyXyXyXyXuXyXyXyXwXuXwX6X0XyXyXuXuXuXuXuXyXuXiXiXuXiXyXiXyXyXyXyXiXyXuXuXuXpXyXuXyXyXyXyXyXuXyXuXuXfXfXpXfXfXhXfXfXdXfXdXvXvXnX",
+"eX0X0X0X0X3X3XeX3XeX,X3X4X.X,Xv.a.a.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.8.7.3.z f a '.[.|.|.'.|.,X'.|.'.4X'.'.2X'.2X2X9X2X9X2X2X3X9X3X9X3X2X9X9X2X2X,X2X2X3X3XeX3X0X0X0X0X0X0X3X0X0X0X0X0X0X0X0X0XyXyX0X6XyXyXyX0X0X0XyXyXyX0X0XyXyXuXyXyXyXyXiXyXyXyX0XyXyXyXyXuXyXyXpXuXiXiXyXyXuXuXiXyXiXyXyXyXiXiXiXuXaXyXyXyXyXyXyXyXyXyXyXuXuXpXpXfXfXfXfXfXfXvXfXdXvXcXnX",
+"0X3X0X0X0X0X3X3X3X3X3X3X2X X9Xh.i.0.0.7.5.5.5.5.5.5.4.4.5.5.5.5.5.4.4.4.5.4.5.4.4.4.5.5.4.5.5.4.4.4.3.b j s s h ].[.}.}.|.|.'.'.|.|.2X'.2X4X2X2X2X2X9X3X2X2X9X9X2X3X2X2X2X3X2X2X2X2X2X8XeX3XeX3X3X0X0X0X0X0X0X0X3X0X0X0X0X0XyXyXyX0XyXyX0XyX0XyXyX3XyX0XyXyX0XyXyXyXuXyXyXyXyXyX6X0XyXyXyXyXuXyXuXiXiXuXiXpXpXpXyXuXiXuXyXyXyXyXuXuXuXuXyXyXyXyX0XyXyXuXuXyXyXpXuXpXfXfXfXfXsXfXfXvXvXvXvXmX",
+"0XeX0X<X0X3XeX8X3X3X3X3X3X3X,Xc.q.4.3.v x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x z a a s h m ). X).}.}.}._.|.'.|.'.|.'.2X2X2X2X2X2X2X9X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X3X3X2XeX3X0XeX0X3X3X<X8X0X0X3X0X0X0X0XyXyXyX0XyXyX0XyX0X3XyX0XyXyXyXyXyXyXiXiXyXyXyXyXpXyXyX3XyX0X6XuXyXiXyXuXuXsXuXaXpXiXuXyXuXuXyXyXyXyXyXwXyXuXyXuX0XyXyXyXuXuXyXaXuXuXiXpXpXsXfXfXdXfXfXvXvXnXvX",
+"eX0X0X0X0X0X0XeX3X3X3X3XeX3X4XA.9.b z f a f a a a a a a s a a a a a a a a a a a a a a a a a s a a a f g f l M y.'.).`.`.}.}.'.'.'.'.|.|.2X2X2X2X|.9X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2XeX2X2X9X3X3X3X3X3X3X3XeX3X3X0X3X0X3X0X0X0X0X0XyX0XyX0XrX0XrXyX0XyXyX0XyXyXuXiXyXyXpXpXyXyX0X0XyXyXyXyXyXuXuXuXuXfXuXuXuXuXuXpXuXiXuXiXyXyXyXyXyXyXyXyX6X0XyXyXyXwXuXuXiXiXuXaXuXiXfXfXdXfXfXfXfXfXvXvXvX",
+"eX0X0X0X0X3XeXeXeX3XeX9X,X<X.X^.y.B a a a a a a a s a a s a s s a a a a a a a a s a a a a a s s a a a g h ~ /.~.)._.}._.).|.).'.'.'.|.2X|.2X2X'.2X2X|.2X2X2X2X2X'.2X2X|.2X2X2X2X2X2X2X2X2X9X2X2X2X3X3X3X3X3X3XeX3X0X3X3X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XyXyXyXyXyXuXyXiXuXyXpXpXyXyX0X3XyX0XyXwXuXyXuXfXpXfXuXfXuXuXuXiXyXuXiXyXyXyXrXyXyXyXyXyXyXyXyXyXiXuXyXuXuXuXuXaXpXuXfXfXfXvXdXvXvXnXnX",
+"0X3XeX3X3X3XeX0X3X3XeX9X2X2X2X2X,X'.2X2X2X4X'.2X'.2X'.4X2X'.'.'.{.}.}.}.{.).).(.(.(.(.).(.).).).).).).{.`.`.`.).`.).`.`.`.}.}.}.}.|.|.'.'.2X2X'.|.2X2X2X2X'.2X'.'.2X'.4X'.4X2X3X2X2X2X2X2X2X2X2X2X3X2XeX2X3X3X3X3X3X8XeX2XeX0X0X0X0XqX0X0X0X0X<XyXyXyX0XyXyXyXyXyXyXiXpXyXpXyXyXqXyX0XrXrXyXyXyXiXuXpXpXfXfXaXiXuXpXpXpXuXyXyXyXyXyXyX0XyX0XyXyX0XwXyXyXyXyXyXuXaXiXpXfXpXfXsXfXfXfXVXvXbXnX",
+"0XeX3XeX3XeX3X3XeX3X3X9X9X9X2X2X,X,X2X2X2X2X2X2X2X'.'.2X2X X'.'.{.). X}.}.).).(.(.(.(.(.(.).).).[.[._.).{.).`.'._.}.`.`.`.}.}.|.|.|.2X X2X,X'.2X2X2X,X2X'.,X2X2X2X4X2X'.'.2X'.2X2X2X2X|.2X2X2X2X3X2X2X2X2X3X3X3X8X3XeXeX3X3X8X0XrX0X0XyX0X0XrX6X3XyXyX0XyX0X3XyXyXuXiXyXyXyXiXyXyXyXrXqX0XrXyXiXiXyXpXpXpXpXiXpXuXfXpXpXaXyXyXyXyXyXyXyXyXyXyXyXuXsXuXyXaXiXuXiXpXpXpXpXaXfXfXfXvXvXfXvXvXnX",
+"3X3X3X0X3X3X3XeXeX3XeX9X3X2X2X2X'.2X|.2X2X2X,X,X2X2X2X'.'.'.'.|.}.}.}.}.`.).).(.(.(.).(.).(.).).).).'.).).|.|.`.`.`.`.`.|.}.}.|.}.|.'.|.|.'.'.2X'.2X2X2X2X'.'.|.4X'.|.|.2X'.2X2X9X2X2X2X2X2X2X2X2X2X2X2X9X3X3X3X2X3X3X3XeX0X3X0X0X0X0X0X0XrX3XyX6XyXyXyX0XyXuXuXyXyXpXyXyXyXyXyXyXyXyXyXyXyXyXyXuXuXuXuXuXfXuXuXuXpXiXiXiXuXuXyXyXyXyXyXyXyXyXyXyXyXyXyXyXuXyXiXuXpXpXsXfXfXvXvXfXvXvXvXnXvX",
+"0X3XeX3X0X0XeX3X3X3X9X9X9X2X2X2X2X2X2X'.'.2X2X|.|.2X'.4X'.|.|.|.}.|.).|.).).).).).(.[.).).(.(.).).).).|.'.).).`.`.`.'.'.).}.}.}.}.}.|.|.'.'.2X,X2X'.2X'.'.2X'.4X|.|.|.'.'.4X'.2X,X'.2X2X2X2X2X2X2X2X2X2X9X8X2X3X3X3X3X3X3X3X0X0XeX0X0XeX0X0XeXyX0X0X0XyXyX0X6XyXyXyXaXyXpXyXyXyXyXyXyXyXyXyXyXyXyXiXiXpXuXpXpXpXiXiXuXuXiXiXuXiXyXyXyXyXyXyXuXiXuXuXyXuXaXuXpXuXfXpXfXfXfXfXfXfXfXvXvXvXvXvX",
+"0X0X3X0X3X0XeX0X3X3X9X9X9X2X2X2X2X'.2X2X'.'.2X|.2X2X2X2X'.'.'.'.}.|.{.`.).).).).).).).).).).).).).|.'.).'.).`.`.`.}.|.}.}.}.}.}.}.|.'._.|.|.|. X'.2X2X'.2X4X'.'.|.|.|.|.|.|.|.,X|.2X'.2X2X2X,X2X2X2X2X2X9X9X9X2X8XeXeXeX3X3X3X0X0X0X0X0X0X0X0X0XyXeXyXyX0XyX0XuXyXyXyXyXiXyXyXuXrXyXyXyXyXyXyXyXiXyXyXiXpXiXuXuXiXiXuXuXuXiXyXuXiXyXuXyXpXpXpXaXpXiXpXiXiXpXpXaXiXpXvXfXfXvXgXvXvXvXvXvXnXvX",
+"yX0X0X0XeX3X3X3X3XeX9X3X9X2X2X2X'.,X'.2X2X,X'.2X|.2X X2X2X'.'.'.|.}.|.).`.`.).).(.).).).).).).).).).).'.`._._.}.}.}.}.}.).|.}.|.}.}.}.|.'.|.'.'.|.'.2X2X'.'.'.'.'.}.|.|.'.2X|.4X2X'.,X'.'.2X'.2X2X,X|.2X|.9X2X9X9X2X3X3X0XeX0X0X0X0X0X0X0X0X0XyXyX0X3X0XyXyXyXyXyXyXyXyXuXuXiXiXuXuXyXyXuXiXyXyXyXyXyXiXaXiXuXyXyXiXuXuXuXaXpXuXaXuXpXiXiXiXpXfXpXiXfXpXiXpXpXpXfXiXfXfXfXfXfXfXvXfXVXvXvXnX",
+"3X0X3X0X0X0X3X0X3XeX3X9X9X2X2X2X2X2X'.'.'.2X'.'.,X'.2X2X'.'.|.`.}.}.).}.).`.).].).).).).).).).).).`.`.).`.).'.).).|.|.}.}.|.|.).).}.`.|.'.|.|.'.'.4X4X'.'.|.}.'.|.|.}.|.'.'.|.|.|.'.'.2X2X'.2X|.'.2X|.9X2X2X2X2X2X3X3X3X3XeX8XeX0X8X0X8XeX0X0X0X3X0X6X0X3XyXyXeXyXyXyXuXyXiXuXuXuXpXpXaXaXyXyXiXyXyXyXyXiXyXyXyXiXyXuXiXiXpXaXiXiXiXpXfXpXfXfXfXfXpXfXfXfXpXpXfXpXfXfXfXfXvXfXvXvXvXfXvXnXnX",
+"yX3X0X0XeX3XeX3X0X3X9X9X2X2X2X2X2X'.2X,X2X'.2X,X|.2X2X|.4X`.'.`.|.|.{.}.`.).).`.).).).).).[.).).).).'.).).`.).'.|.).|.}.}.}.|.}.|.}.|.).}.|.|.'.'.'.'.4X|.'.'.}.}.`.}.|.'.'.|.|.|.'.'.'.'.'.2X2X|.2X9X2X2X2X2X2X2X2X3X2X3X3X2XeX3X3X0X0XeX0X0X0X0X0XyX3XyXyXyXuXyXyXyXuXuXiXaXuXuXuXuXiXyXyXyXaXyXyXyXyXyXyXyXyXyXyXaXaXiXpXfXpXfXiXpXfXpXfXpXfXfXfXfXfXfXfXpXfXfXpXfXdXdXvXvXfXvXfXvXvXnXnX",
+"yXyX0X3X0X3X3X0X3X3XeX2X3X2X2X2X2X2X2X2X2X2X'.2X2X|.2X'.'.'.'.`.}.`.`.`.).).).}.[.).).).).}.).).{.).}.{.).).`.}.}.|.}.}.}.}.}.}.}.}.|.{.).).|.|.|.|.|.'.|.'.'.|.'.'.'.`.'.'.|.'.'.|.|.'.|.|.'.'.4X2X2X2X'.2X2X2X3X2X3X2X3X3X2X3X3X3X3X3XeX3X0X0X0X0XyX0XyX0XyXwXyXyXuXyXuXyXyXiXuXpXfXuXiXuXuXuXyXyXuXuXyXyXyXyXyXuXuXuXuXpXuXsXpXfXfXsXfXfXfXhXsXfXvXfXfXfXfXfXfXfXvXVXgXfXvXvXfXfXnXvXvXnX",
+"0XyX0X0X0X3XeX3X0X3X3X3X2X2X2X2X2X2X,X,X'.'.2X'.|.2X2X X'.'.'.'.}.`.`.`.).).).).[.).}.).).).).).`.).).).}.`.`.}.}.}.|.|.`.}.}.}.}.'.|.`.'.).|.{.|.{.|.|.|.|._.'.).'.`.'.'.'.'.'.`.'.}.|.'.|.'.'.2X'.2X'.2X2X2X2X2X2X3X3X2X3X3X2X3X2X2X3X3X3XeX3X0X0X0X0X6X0XyXuX0XyXyXuXyXuXyXuXuXpXaXiXiXsXiXuXwXpXuXaXyXyXuXyXyXuXuXuXfXpXfXpXfXpXfXfXfXfXvXfXfXvXfXfXfXfXsXvXfXfXfXfXfXvXfXvXvXvXvXvXnXnX",
+"yX0XyXeX0X0XeX3XeX3X0X3X3X2X2X2X2X2X2X X2X2X2X2X2X2X2X}. X,X'.`.}.`.`.`.}.).).}.).).).).).).).}.[.[.|.).).|.`.}.}.}.}.}.}.'.}.}.'.`.).{.`.|.{.|.|.|.|.|.|.|.|.|.|.}.|.`.).|.}.`.}.`.}.|.|.'.'.'.'.4X'.4X|.2X2X2X2X2X<X3X3X2X3X<X2X3XeX3X3X3XeX0X3X0X0X0XeXyX3XuXyXyXyXyXuXyXuXuXaXfXpXpXuXpXuXuXuXuXpXuXiXyXyXuXiXiXfXpXpXpXpXpXfXfXfXfXfXfXsXhXfXfXfXfXfXdXfXfXvXfXfXVXhXfXvXfXvXvXnXnXvXnX",
+"0XyX0XqX0X<XeXeX3X3X3X3X3X3X2X2X2X2X2X2X2X2X2X2X2X|.2X|.'.'.'.`.`.'.`.}.).'.).).).[.).).).}.).}.[.`.).).}.).`.`.}.).}.}.'.}.}.}.}.`.`.`.`._.}.|.).).{.}.).|.|.).).|.}.}.|.).{.}.}.{.}.}.}.}.|.|.'.'.'.|.2X|.2X9X9X3X2X3X3X3X3X3X3X3X2X3X3X3X3X3X3X0X0X0X0XeXeX6X0XyX0X0XyXyXyXyXiXpXpXuXpXiXiXuXuXuXpXuXuXyXuXyXaXfXpXfXfXfXfXfXfXfXfXfXfXvXfXvXfXvXfXvXfXvXfXvXfXvXfXfXvXvXfXvXvXvXnXvXnXnX",
+"yXyX3XyX0X0XrX0X0XeX3XeX2X3X2X2X2X9X2X2X3X2X2X2X2X2X2X|.4X|.`.'.}.`.`.`.}.}.).}.[.).).).).).).).[.[.[.`.}.).`.`.`.`.`.}.'.'.'.}.`.`.`.`.}.}.'.).).'.|.).).|.{.|.|.).|.{._.|.`.`.`.`.|.{.`.}.'.|.|.|.'.|.|.2X2X2X2XeX2X3X3X3X3X2X3X3X2XeX3XeXeX3XeX3X8X3X3X0X0XrXyX0XyXyXyXyXyXyXuXiXiXuXyXiXpXpXuXuXfXpXiXiXuXiXuXpXfXsXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXvXfXvXfXfXvXvXvXfXvXvXfXvXvXnXvXnXvX",
+"yX3X<X0X0X0X0X0X8XeX3X3XeX2X3X3X3X9X9X2X2X2X2X2X4X'. X'.'.'.'.`.}.'.}.}.}.[.}.}.).).[.[.).).}.).[.`.[.[.}.`.`.`.`.`.`.}.`.'.}.}.`.`.`.`.`.).}.}.{.).).|.|.).).).).`.).'.`.`.`.`.'.).).|.}.|.}.'.'.'.|.'.|.2X X2X2X,X3X2X3X2X3XeX3X3X3XeX0X3X3X3X3XeXeX3X3X3X0XeX0X0X0XyX0XyXyXyXuXuXyXuXuXiXiXiXfXdXpXfXpXfXpXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXvXfXfXfXvXfXvXvXvXfXvXnXfXvXvXcXvXvXnXvXnX"
+};
diff --git a/images/checkbox3checked.xpm b/images/checkbox3checked.xpm
new file mode 100644 (file)
index 0000000..310cf02
--- /dev/null
@@ -0,0 +1,332 @@
+/* XPM */
+static char *checkbox_checked[] = {
+/* columns rows colors chars-per-pixel */
+"190 70 256 2",
+"   c #0C111B",
+".  c #0D1522",
+"X  c #0C1C2B",
+"o  c #0D1826",
+"O  c #0F1C33",
+"+  c #131924",
+"@  c #121B2B",
+"#  c #161B29",
+"$  c #101D34",
+"%  c #16212B",
+"&  c #172639",
+"*  c #092336",
+"=  c #222C3A",
+"-  c #25323C",
+";  c #0D2944",
+":  c #142B43",
+">  c #142A49",
+",  c #182A43",
+"<  c #192E4C",
+"1  c #142542",
+"2  c #1A2E52",
+"3  c #172F51",
+"4  c #1D304D",
+"5  c #17314C",
+"6  c #1A3253",
+"7  c #1C355B",
+"8  c #1C395C",
+"9  c #163656",
+"0  c #1D3C63",
+"q  c #1D3D6B",
+"w  c #153F6F",
+"e  c #1E3F74",
+"r  c #223546",
+"t  c #203456",
+"y  c #213A5D",
+"u  c #233A57",
+"i  c #313D4E",
+"p  c #223D64",
+"a  c #243D6B",
+"s  c #293E6C",
+"d  c #263A63",
+"f  c #283F71",
+"g  c #253D70",
+"h  c #1C405B",
+"j  c #1D4265",
+"k  c #1C436B",
+"l  c #16436B",
+"z  c #1C4473",
+"x  c #1C4975",
+"c  c #3C4952",
+"v  c #364657",
+"b  c #324855",
+"n  c #224165",
+"m  c #23426B",
+"M  c #23496B",
+"N  c #2B4463",
+"B  c #2A426B",
+"V  c #2D4B6D",
+"C  c #2B4865",
+"Z  c #234271",
+"A  c #2A4071",
+"S  c #2C4A71",
+"D  c #284778",
+"F  c #265278",
+"G  c #334B6A",
+"H  c #334C74",
+"J  c #39557B",
+"K  c #3D597C",
+"L  c #355277",
+"P  c #2F5067",
+"I  c #434B56",
+"U  c #44535E",
+"Y  c #47414F",
+"T  c #4A5C66",
+"R  c #425A7C",
+"E  c #4C616C",
+"W  c #4A6477",
+"Q  c #50606E",
+"!  c #516271",
+"~  c #556976",
+"^  c #5A6B79",
+"/  c #254E82",
+"(  c #255788",
+")  c #255989",
+"_  c #2B5585",
+"`  c #2B5A85",
+"'  c #2B5A8A",
+"]  c #265886",
+"[  c #315A86",
+"{  c #325B8B",
+"}  c #3E5B82",
+"|  c #36558B",
+" . c #2F5792",
+".. c #28638F",
+"X. c #2B6C99",
+"o. c #2D6694",
+"O. c #346998",
+"+. c #32709C",
+"@. c #376E8E",
+"#. c #3473A2",
+"$. c #3C74A2",
+"%. c #377BA9",
+"&. c #3A7DB1",
+"*. c #2A74A6",
+"=. c #435D83",
+"-. c #4A6485",
+";. c #4D6A8B",
+":. c #476787",
+">. c #526A8B",
+",. c #526D91",
+"<. c #5C7182",
+"1. c #5A7594",
+"2. c #466D91",
+"3. c #437CAA",
+"4. c #647686",
+"5. c #627886",
+"6. c #63798B",
+"7. c #627B9B",
+"8. c #647995",
+"9. c #727F9F",
+"0. c #3981AD",
+"q. c #3A82B3",
+"w. c #3C8AB5",
+"e. c #3787B9",
+"r. c #2F87BC",
+"t. c #2B8ECA",
+"y. c #2A8FC7",
+"u. c #2D91CC",
+"i. c #3494CD",
+"p. c #359ACC",
+"a. c #3896CE",
+"s. c #3B99CE",
+"d. c #3C94C5",
+"f. c #3695D0",
+"g. c #3A96D0",
+"h. c #3C99D0",
+"j. c #389AD4",
+"k. c #3DA3D5",
+"l. c #4284AB",
+"z. c #4A8ABB",
+"x. c #4487B6",
+"c. c #508BB5",
+"v. c #538BAE",
+"b. c #678397",
+"n. c #70869A",
+"m. c #6E8896",
+"M. c #6A85A3",
+"N. c #6D91AA",
+"B. c #7285A2",
+"V. c #768CA8",
+"C. c #7592A2",
+"Z. c #7993A4",
+"A. c #7791AC",
+"S. c #7797B3",
+"D. c #7FA4BB",
+"F. c #439BCC",
+"G. c #4B9CCC",
+"H. c #4697C6",
+"J. c #439CD2",
+"K. c #439BD9",
+"L. c #489ED3",
+"P. c #489BD9",
+"I. c #539AC8",
+"U. c #529FD7",
+"Y. c #44A1CD",
+"T. c #4BA1CC",
+"R. c #46A0C3",
+"E. c #45A0D3",
+"W. c #4BA1D4",
+"Q. c #4CA3D8",
+"!. c #47A8D9",
+"~. c #54A2CC",
+"^. c #5BA3CD",
+"/. c #52A4D6",
+"(. c #54A6D8",
+"). c #56A8D6",
+"_. c #55A8D8",
+"`. c #59A4D4",
+"'. c #5BA4DA",
+"]. c #5AA9D6",
+"[. c #5BAAD9",
+"{. c #53B0D2",
+"}. c #54A6E0",
+"|. c #609ACC",
+" X c #6CA6CF",
+".X c #62ADDB",
+"XX c #67AAD7",
+"oX c #66B0DC",
+"OX c #6BB2DD",
+"+X c #77AAD1",
+"@X c #70B5DE",
+"#X c #74B8DE",
+"$X c #6DB4E0",
+"%X c #72B6E0",
+"&X c #75B9E1",
+"*X c #78B9E1",
+"=X c #8393AB",
+"-X c #889AAC",
+";X c #8899B2",
+":X c #919DB3",
+">X c #949CAE",
+",X c #89A4B8",
+"<X c #92A1B4",
+"1X c #94A5BB",
+"2X c #98AABB",
+"3X c #A0B0BE",
+"4X c #8DAEC2",
+"5X c #87ACCA",
+"6X c #8CB0C2",
+"7X c #8BB2CB",
+"8X c #96ACC3",
+"9X c #98B3C8",
+"0X c #9CBCD4",
+"qX c #96BAD5",
+"wX c #A2AEC4",
+"eX c #A9B7C8",
+"rX c #A5BDD3",
+"tX c #9EC2D9",
+"yX c #9CC0D6",
+"uX c #A2C2D9",
+"iX c #A8C6DB",
+"pX c #B4C5D7",
+"aX c #A5C9E4",
+"sX c #AACCE5",
+"dX c #A1C5E0",
+"fX c #ADD4EC",
+"gX c #AED9ED",
+"hX c #AAD0E6",
+"jX c #AED6F0",
+"kX c #AED8F1",
+"lX c #B0D5ED",
+"zX c #B3D9EE",
+"xX c #B9DBEF",
+"cX c #B6D2E6",
+"vX c #B0D6F1",
+"bX c #B0D8F1",
+"nX c #BBDEF3",
+"mX c #B1CDE5",
+"MX c #BEE1F4",
+"NX c #B9E0FA",
+"BX c #BEE4EF",
+"VX c #C3DEF3",
+"CX c #CBDFED",
+"ZX c #C2E1F4",
+"AX c #C4E3F8",
+"SX c #CBE5F8",
+"DX c #D3E5F5",
+"FX c #D3E7F8",
+"GX c #D4EBF6",
+"HX c #D2E9F9",
+"JX c #D9ECF6",
+"KX c #DBEDF8",
+"LX c #DAF0F9",
+"PX c #D2EEF3",
+"IX c #E3F1F9",
+"UX c #E3EFFB",
+/* pixels */
+"/.W.U.T.T.W.W.L.T.L.L.T.P.W.L.L.L.J.L.J.J.J.J.J.J.F.h.h.J.s.s.s.s.s.h.s.s.a.h.a.a.a.a.a.a.a.a.a.a.F.g.g.g.i.g.F.a.F.I.e.h.s.a.g.a.a.a.a.a.a.f.i.s.i.p.a.a.a.i.a.f.i.a.g.i.h.a.a.a.a.a.a.a.s.a.h.s.s.s.j.h.h.J.h.J.J.J.P.F.P.L.L.L.W.W.L.L.L.L.J.W.L.W.J.W.W.W.W.W.!.W.W./././././././._.(._.(._.].[.[.[.[.[.[.'.[.[.[.[.[.'.[.[.[.[.[.'.[..X'.[.'.[.[.[..X.X[..X[..X.X.X[..X.X.X.X.XoX.XoX[.",
+"/././.L./.W.W.W.L.L.W.L.W.W.E.L.L.L.J.J.J.J.J.J.J.J.J.J.J.h.h.F.J.h.F.h.h.h.a.h.a.h.a.h.a.a.h.h.g.g.J.g.a.F.g.g.J.|.1.%.h.a.s.a.a.a.f.g.a.a.s.f.s.a.f.p.i.a.i.a.d.g.i.a.i.i.a.s.a.a.f.f.a.a.a.a.g.g.s.s.h.h.h.J.J.J.J.J.J.G.J.L.L.L.E.L.L.L.L.L.L.L.L.L.J.W.T.E.W.W././.T././././././.(.(.(.(.].[._._.[.[.[.[.[.).[.[.[.[.[._.'.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[..X.X.X.X.XoX.X.X.XoXoX",
+"/./.W./.Q.W.W.W.W.W.T.L.W.L.L.W.L.L.E.L.L.J.J.L.J.J.J.F.J.J.J.J.J.J.J.J.J.h.h.J.h.g.h.J.h.J.h.F.J.a.s.h.J.g.J.g. XA.:.#.h.s.a.a.a.f.a.a.a.a.a.a.f.f.i.i.i.i.i.i.i.i.i.i.s.i.a.i.a.a.a.i.a.a.a.p.f.s.a.g.s.s.h.h.J.h.F.J.J.J.L.L.L.L.E.E.L.L.L.L.L.L.J.J.L.J.E.W.W.W.W./.Q.Q./././././.(.`.(.(._._.[.[.[.[.].[.[..X.X[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[..X[.[..X[..X.X.X.XoXoX.XoX.X.X.X",
+"/././.W././.W.W.L.W.W.W.L.W.T.W.W.E.L.W.L.J.L.L.J.J.J.J.J.J.J.J.J.L.J.J.L.J.J.J.J.J.J.J.J.J.J.J.J.K.J.J.J.F.P.+X,X8.F *.s.a.a.f.f.f.a.a.a.i.a.i.f.f.i.f.i.s.i.i.i.i.g.g.i.a.i.s.i.i.a.a.i.a.a.i.a.f.g.a.a.s.s.J.h.h.J.J.J.J.J.L.L.L.E.L.J.L.J.L.J.L.J.W.J.L.W.E.W.W.W.W.W././.W.Q.Q./.(./.(.]._.[.{.[.[.[..X[..X[.[.[.[.[.[..X[.].[.'.[.[.[.[.[.[.[.'.[.[.[..X[..X[..X.X.X.X.XoX.X.XoXoXoXoX",
+"U././.W./.Q./.W.W.W.W.L.W.W.W.W.L.L.P.W.E.W.W.L.L.J.J.J.L.L.J.L.L.L.L.W.L.W.L.L.P.L.L.L.J.J.J.J.L.J.L.J.J.H.+X8X-XK 0 &.s.f.i.a.i.a.a.p.a.a.i.f.f.f.i.i.i.i.f.i.i.f.f.i.f.f.f.i.a.i.i.p.a.a.a.a.a.f.a.g.j.h.h.h.h.J.K.J.J.J.J.J.L.J.J.J.J.J.J.J.J.L.L.L.L.L.L.E.W.L.W.W.W.W.Q.`./././././.).`.(.[.[.[.[.[..X[..X[..X[.[..X[.[.'.[.].[.[.[..X[.[.[.[.].]..X[..X.X.X[..X.X.X.XoX[.oXoXoXoX.XoX",
+"/././././.L./.Q.Q.W.W./.W.W.W.L.L.W.E.W.W.E.L.L.L.W.L.W.L.L.W.W.W.Q.Q.W.W.T.W.W.L.L.U.L.L.L.L.L.L.L.E.E.P.+X8X1X1.a h e.a.a.a.f.f.a.a.i.a.i.i.i.i.i.i.i.i.i.i.i.f.i.i.f.f.g.f.f.a.a.a.a.a.i.i.a.f.a.a.g.h.h.h.J.J.h.a.J.J.J.J.J.J.J.J.J.J.J.J.J.L.L.J.E.W.L.L.L.E.W.W.W.W.W./.T./.Q.{././././.`._.}..X[.[.[.oX[..X[.[.[.[.[..X.X[..X].[.[.[.[.].[.[.[..X[.[..X[.[.[..X.X.X.X.XoX.XoX.XoX.XoX",
+"/././././././.U./.W.W.W./.W.W.W.W.E.W.W.P.L.W.L.T.Q.W.W.W.W./././.Q.Q./.Q./.W.Q.Q.L.W.L.T.W.W.J.L.E.J.L.+X8X2XV.L 9 m d.a.a.a.f.f.i.a.a.i.a.i.i.u.i.i.i.u.i.i.f.i.i.f.i.i.i.f.f.f.f.i.i.a.a.i.i.a.a.a.g.s.h.h.J.h.J.h.J.h.J.J.J.h.J.J.F.J.J.J.J.J.J.J.E.L.W.W.L.W.W.W.W.W./.W./././././.)./.).).[._.[..X[.[.[.[.[..X[.[..X[.'..X.X.X].[.[.[.[..X[.[.].].[.[.]..X[..X.X.X.X.X[.oXoXoXoXoXoX.X",
+"/.W.Q././././.W./.Q././.Q.W./.W.W.W.P.W.Q.Q.W.Q.W.W.W./././.Q./.(.(./././././././././.W./.Q.W.W.W.P.J.XX7X2X>X1.j 6 F a.h.a.a.a.i.f.a.i.i.i.i.i.i.i.i.u.i.i.u.i.i.i.i.i.i.i.i.f.f.f.a.a.i.a.a.a.s.f.a.s.s.h.h.h.J.h.J.h.J.J.J.J.J.J.h.J.J.h.J.J.J.L.L.L.E.P.W.E.E.T.W.W.W.W./.W./.W./././.).).).[._.[.[.[.[.oX[.[.$X[..X.X.X.X.X.X[..X[..X.X.X[.[..X.X.X[.[.].]..X[.{..X[..X.XoXoX.X.XoXoXoX",
+"/././././././././././.W././.U.W.Q.L.L.Q.Q.W.W.W././.Q././.`.(.(.).[._.`._._.(./././././.W./.W.W.W.W./.4X8X<XB.L 7 5 F s.a.a.i.i.f.i.i.i.i.i.i.i.i.u.i.u.i.f.u.i.u.f.i.i.i.i.i.f.f.f.i.f.a.i.a.a.f.f.s.s.s.h.h.J.h.J.h.J.J.J.J.J.J.F.j.Y.J.J.J.E.J.J.E.L.E.E.P.W.W.L.W.W.W.W././.!./././.`._.).)._.(.[.[.[.[..X.X.XoX[..X.X.X.X.XoXoX.X[..X[.[..X.X.X.X].[.[.[.[..X[..X[..X.X.X.X.XoXoXoXoXoX",
+"/././././.Q.W./.T./.Q.`.Q././.W././.W.T.L.W././././././.(._._._.).)._.[._.].(.(.(.Q././././.W.W.W.L.5X2X>X=X1.p 2 < F d.h.a.a.i.i.g.i.i.i.i.i.i.t.f.i.u.u.u.i.u.i.i.i.u.i.i.i.i.i.f.a.a.a.a.i.a.f.s.j.g.h.p.h.J.J.h.K.J.g.J.g.J.h.J.J.h.F.J.J.J.J.L.J.W.W.W.E.W.L.W.W.W.W.W.W././././.(.(._.`.)._.[.[.[.[.[.[..X.X[.OX.XoX.XoX.X.X[.oX.XoX.X.X[.[.].[.[.[.].]..X[..X.X.X.X.X.X.XoX.XoXoXoXoX",
+"/./.`./.`./././././././.Q./.(.W.W./.W./././.T././././.(.)._._._.].[.[.]._.'._.(.(.(./././././.W.L. X9X1XA.7.=.7 4 : M d.s.s.a.i.i.i.u.i.i.i.i.i.f.i.i.u.i.u.f.u.u.i.i.i.u.u.i.i.a.i.f.f.a.i.i.a.a.g.a.h.h.h.h.J.J.J.h.J.F.J.F.a.J.J.J.J.J.J.J.J.J.E.E.P.E.L.P.W.W.P.W.W.W.W././././.(.(.(./.).)._.)._.]..X[..X.X.X.X.X.X.XoXoX.X.X.X.XoX.X[.[..X.X.X].[..X].[..X[.[.[.$X[..X.XoXoX.XoXoXoXoX",
+"/././.`./././.T./././././././.W./.W.W.W./.W./././.Q.(.`.).[.[.[.[.[.[.]..X]._.]._././.(./.(./.Q.^.9X1X;XM.;.S 7 4 : j d.s.a.a.a.i.i.i.i.i.i.t.i.f.i.i.i.i.i.i.i.i.i.i.i.i.i.i.f.f.a.a.f.a.a.a.a.a.g.a.h.h.a.h.h.h.h.J.J.a.J.J.J.J.F.J.h.J.J.J.j.J.E.J.E.P.W.E.W.E.W.W.W.W./.W./././././.(.(.(.(._.).[.].].[.[.[..X.X.XOXoX.XoXoXoXoXoX.X.XoX.X.X.X[..X].].[.]..X[.oX[.[..X.X.X.X.X.XoXoXoXoX",
+"/././././.(./././././.(././././.W.T.Q./.Q././././.(.(.(.).[.[.[.[.[.[.[.[.[._.[.(.(.(.`.(.(.W.T.5X1X:XB.>.K a 8 5 : h w.s.p.i.i.i.u.f.i.i.i.u.i.i.i.i.i.i.u.i.i.i.i.i.i.i.i.i.f.f.a.f.f.f.a.f.i.a.h.g.g.h.h.h.J.J.h.F.J.g.J.J.J.h.J.J.J.J.J.J.J.J.E.E.L.W.P.W.W.Q.L.W.W.W.W./.W.W./././.(.).(.(.[.).].].[..X.X.XOX.XXX.XOX.XoX.X.X.X.XoX.X.X[.[.[..X{..X.X[.[..X[.[.[.[.[..X.XOXOXOX.XOXOXoX",
+"(.(.(.(.(./././././.(././././././.U./.W./.Q.W././.(.).(._.[.]..X.X[..X.X[.[.[.[._._.(.(././.W. X4X:XA.8.R H 0 0 9 : 5 r.F.p.f.i.u.i.i.u.d.u.i.i.f.i.i.i.i.i.i.i.i.i.u.i.i.i.i.i.i.a.f.a.f.a.a.a.a.a.g.g.a.h.h.h.J.h.s.J.J.J.J.F.J.J.J.h.J.J.J.J.J.K.L.E.W.E.W.E.L.L.L.W.W.W.L././.W././././.).(.]._.[.].[.[.[..X.XXX.X.X.X.XoXoXoX.XOX.XoX[..X.X.X.X.X[..X.X.X.XoX.X$X[..X.X.X[..X.X.X.XoXoX",
+"(.(.(.(./.(.W./././.Q././././.L.(.!.W./././.W.(././.(.(.).[.[.[..X[..X.X[..X[.[.].).(.(.(./.I.5X1X-X8.=.L m m 0 6 , : X.s.a.f.i.i.i.i.t.i.u.i.i.i.i.i.i.i.i.u.i.u.i.i.i.i.i.i.i.a.i.f.f.f.a.a.a.f.a.g.g.s.a.h.h.h.h.J.h.F.J.a.J.J.J.J.J.J.J.J.J.J.E.E.L.L.L.L.L.L.W.L.T.W.W.W.W.T.W.T./././.).(._.[.[.].[.[..X[..X.X.X.XXXoX[.oX.XOX.X.X.X.X[..X.X.X.X.X.X.X[..X.X.X.X.XOX.X.XOX.XOXOX.XoXXX",
+"(./.(.Q.(.W./.Q././.Q././.W./.G..XSXIXIXLXLXLXLXJXJXLXJXLXJXJXJXJXJXJXLXLXLXKXKXKXKXJXJXKXIXpXeX>Xn.,.R B B 0 7 < & & ..s.a.f.i.i.t.i.i.u.t.i.i.i.i.i.i.i.i.i.u.i.u.i.i.t.i.i.i.i.i.f.a.a.a.a.a.g.g.g.g.s.h.h.J.h.J.J.J.J.J.J.J.J.J.h.J.J.J.J.J.J.E.J.L.E.L.L.L.W.P.Q.W.W.W.W.W.Q.Q.T.Q././.).(.[._.[.[..X[..X.X.X.X.X.X.X.XoX.X.X.X.X.X.X[.oX.X.X[.oX]..X]..X.X.X.X.X.XOX.X.XOX.X.X.XOXoXoX",
+"/./././.U./.Q.W.W./././././.Q.#XbXIXIXIXJXJXKXKXKXJXJXJXJXGXJXJXJXJXGXGXHXKXLXGXGXGXGXLXJXCXeX<X=X1.} H j 0 j 6 , X X 9 a.s.p.i.t.i.i.i.u.i.i.i.i.f.f.i.i.u.i.i.t.i.i.i.i.i.i.i.i.a.i.a.g.f.j.h.g.g.h.a.h.h.h.h.J.J.J.J.J.F.J.J.J.J.J.J.J.J.J.J.J.E.J.E.L.L.L.E.W.W.W.W.W.W.W.W.E.W.W.W./././.).[.[.[.[.[..X.X.X.XoX.X.XoX.X.X.X[..X.X.XXX.X.XoX.X.X.X.X.X.X.X.X.XoXoX.XoXoXoX.XXXoXoXOXoXoX",
+"`.`.Q./.W./.(././.T.U././././.HXIXJXJXJXGXDXDXDXFXDXFXFXDXFXFXFXFXHXFXFXGXFXDXHXFXFXFXFXDXrXeX;X7.;.L B 0 0 6 & @ . X > e.i.i.i.t.i.f.u.i.i.i.i.i.i.i.f.i.i.i.u.i.i.t.i.i.i.i.i.i.i.a.a.g.a.a.a.h.g.h.h.h.h.h.h.h.j.J.J.J.J.h.J.J.J.Y.h.J.J.J.J.J.J.J.L.L.L.L.W.W.Q.W.P.W.W.W.W.W.W.W.Q.W./.).).{.}.[.[.[.[..X.X.X.X.X.X.X.X.X}.[..X.X.X.X[.oX[..X{..X.X[.[.[..XoXoXoX.XoX.XoXoXoXoXoX.XoXOX",
+"/./.Q./././.Q.W.L.T./.L.W.Q./.FXDXJXGXCXZXZXAXAXZXZXZXAXAXZXAXAXnXVXAXAXVXAXAXAXAXnXAXZXcXeX>XV.1.K A a 8 6 & +   o * k r.i.u.i.i.f.u.f.u.f.u.f.f.f.u.i.i.i.i.i.i.t.d.i.i.i.i.i.i.a.a.a.a.a.g.a.h.h.s.h.h.J.h.J.J.J.h.Y.h.J.Y.J.J.J.J.J.L.J.J.J.E.J.J.E.K.E.L.L.W.W.!.W.P.W.P.W.W.W.W.Q.W.(.(.).[.[..X.X.X.X{..X.X.X.X{.}..X.X.X.X.X.X.X.X.X[.oX}..X.X.X.X.X.X.X.X.XoXoXoXoXoXoXoXoXOX.XoXoX",
+"(././././.W.Q.W.U.W./.L./././.HXSXSXSXZXnXnXnXnXnXnXnXxXnXxXnXzXnXnXnXbXbXMXzXxXBXBXBXzX0X8X;X7.2.A y 7 7 1 +   X ; @.d.p.i.i.i.i.u.f.u.f.u.i.i.f.f.f.i.i.i.i.i.i.i.i.i.i.i.i.i.i.f.a.a.a.g.a.h.j.s.F.s.J.s.h.F.h.J.J.J.J.J.J.J.J.J.E.J.E.J.E.J.E.L.J.E.J.J.L.L.J.W.L.W.W.W.Q.E.W.W.W.W./.).(.(.[.[.[.[..X[..X.X.X.X.X.X.X.X.X.X.X[..X.X.X[.oX[..X.X.X.X.X.X.X.X.XoXoXoXoXoXoXoXoXOX.XOXOXOX",
+"/./././.W./.W.W.W.L.T.W./.W.U.VXAXAXNXnXjXkXbXkXkXkXkXkXfXkXkXkXkXkXjXjXvXvXvXbXfXkXvXpX8X-XV.>.L p 0 4 1 o + # h 0.s.p.i.u.i.u.u.i.u.i.i.u.f.f.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.a.f.a.a.a.h.s.a.J.J.h.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.K.J.J.J.L.J.L.E.E.W.W.W.J.W.W.L.L.W.L.W.W.W.Q././.(.(.[.[.[.[..X[..X[..X.X.X.X.X.X.X.X.X.X.X[.[..X}.oX.X.X.X}.oX}..XoX[.$XoXoXoX$X$XoXoXoXoX[.OX$X",
+"/.Q././././.W.W.W.W.L.L.W.T.T.VXMXBXnXzXlXjXjXjXfXjXkXbXjXjXjXjXbXvXjXjXjXkXbXkXkXjXjX9X<X=X6.=.B d 9 & X . # - 0.s.f.i.i.u.u.u.u.u.u.t.u.i.i.f.i.t.i.i.i.i.i.i.f.f.f.i.i.i.i.K.a.a.a.h.a.h.p.J.h.h.s.J.J.j.J.s.J.J.J.J.J.J.J.E.L.E.L.L.J.J.L.J.L.E.J.E.E.W.L.L.L.W.W.E.W.W.W.W.W.W./.T././.(._._.[.[.[.[..X.X.X}..X{..X.X.X{..X.X[..X.X.X.X.X.X.X.X.X.X.X.X.X.X[.[..X.XoX[.oXoX$XOXOX$XXX$X",
+"/././.W./.Q.W.W.T.W.L.W.L.L.W.AXZXnXnXnXjXjXkXjXbXbXbXbXbXkXfXfXvXkXbXbXbXbXbXbXkXjXuX8X-XB.>.H n 7 > + # & i ~ w.i.i.i.u.u.u.u.t.t.u.i.i.u.u.i.i.i.i.i.i.u.i.i.i.f.i.f.f.f.d.i.a.a.h.a.h.h.h.h.h.h.J.J.h.Y.J.J.J.J.J.J.J.J.J.L.L.L.J.L.W.J.J.L.L.L.E.L.W.W.E.W.L.W.T.W.W.W.T.Q.W.Q././.Q./.`._._.[.[.[.[.[..X}..X.X.X.X.X}.}..X[..X[..X.X.X.X[..X.X.X.X.X.X.X.X$X.XoXoXoXoXoXoXoXOXOXoXOXOX",
+"Q./././.W./.W.W.W.L.L.W.W.L.L.nXZXZXnXbXzXjXkXjXkXbXbXbXjXfX0X7XbXbXkXbXjXbXbXbXkXfX9X<X=X1.=.p 6 > $ @ & b 4.! i.i.i.u.u.t.t.u.u.u.u.t.i.i.u.i.i.u.i.i.i.i.i.i.f.f.H.i.f.f.f.f.a.a.s.s.h.h.h.J.J.F.J.h.J.J.J.J.J.J.J.J.J.J.J.J.L.L.E.L.J.L.L.L.J.L.W.P.E.P.E.W.W.L.W.L.Q.W.W.Q.W.Q././.(.`.(.(._._.[.[..X{..X.X.X.X.X.X.XoXoX.X.X.X.X.X[.[..X.X}..X.X.X.X.X.XoX.XoX.XoXoXoXoX$XOX$XoX$XoX$X",
+"/././.L././.L.W.W.W.T.E.W.P.L.ZXZXnXnXnXzXkXbXkXbXbXjXvXfXrX;XM.dXkXkXkXkXkXbXbXbXrX1X;Xn.;.A 0 < & . & v C.6.! u.u.u.u.u.u.u.t.u.u.f.t.u.i.u.f.t.u.f.i.i.i.i.i.f.g.g.g.s.f.f.s.f.s.s.s.s.h.J.h.J.h.J.J.J.J.J.J.L.J.J.J.J.E.L.L.L.L.E.W.L.L.L.L.L.E.L.Q.L.W.W.W.W.W.E.W.W.Q.W.Q././././././.)./._._.[.[.[.[.[.oX.X.X.X.X.X.X.X.X.X.X[..X.X[..X[..X.X.X.X.X.X.X}..X.XoXoXoXoXoXoX$X$XOXOX$XXX",
+"/././././.L./.L.W.W.W.E.W.W.E.ZXZXAXnXbXjXkXkXkXbXbXjXfXpX8XA.;.S.kXkXkXkXkXbXbXjX8X:X=X7.J j 3 &   % b -XZ.6.Q u.t.u.u.t.u.u.u.u.u.u.u.u.i.f.u.i.u.i.i.i.i.i.i.f.f.g.i.f.s.s.s.s.s.h.j.J.h.s.F.J.J.J.Y.J.E.!.J.J.E.E.E.J.L.J.W.W.L.W.W.E.L.L.L.L.W.W.W.L.E.P.W.W.W.W.W.Q.Q.T./.!././.(.).).(.(._._.).[.[.[.[.[..X.X.X.X.X.X.X.X.X.X[..X.X[..X.X.X.X.X.X.X.X.X.X.XoX.X.X.XoXoX$XoXoXOXOX$XXX",
+"/./.Q.W./.W.W.L.P./.W.W.W.Q.L.ZXZXZXnXbXzXjXbXjXkXvXmXpXeX:X1.H ,.fXkXkXbXbXbXbXrX5X;X9.-.B 9 & X % - S.9XZ.5.Q y.t.t.t.t.u.u.u.u.f.f.f.t.i.u.i.i.f.i.i.i.i.i.( a q s &.f.f.j.q.k a k ' s.F.h.E.d.Z a m j a o.E.P.F.J.L.{ Z k n l n j a f ( q.W.L.P.| m j j k m m C [ l.T.L.(./.`.!./.(.(.(.(./.(.(._.[.[.[.[..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X[..X.X.X.X.X.X.X.X.X.X.X.X.XoXoXoXoXOXOXOXOXOXOX",
+"/.T.Q./.Q.W.W.W.W.Q.L.E.J.W.L.ZXZXZXZXbXzXjXjXjXvXmXpXeX:XB.R B K qXbXkXbXbXbXbX9X:X=X8.L y > O . & b.sX7XZ.5.Q y.t.t.t.u.u.u.u.u.u.u.u.i.i.i.i.i.i.i.i.i.i.i.( a a q %.i.g.j.&.m 0 m ' s.J.h.J.e.m B 0 M B x L.Q.F.J.J._ a q B A d m n a A k 0.Q.Y.' q k s Z g a B a x X.).(./.(.(./.(.(.(.(./._.(._._.[.[.[.[.}..X.X.X.X.X.X.X.X.X[..X[..X.X.X.X.X.X.X.X.X.X.X.X.X.X.XoXoXoXoXOXOXOX$X$XOX",
+"/./.W./././.W.W.Q.W./.W.L.T.L.AXZXZXnXzXjXjXlXsXiXrXwX:XM.,.S d C M.kXkXbXvXvXaX8X;XB.-.N 5 & . - W hXsX6XZ.5.Q y.t.t.t.u.u.u.f.f.u.u.i.i.i.f.i.i.i.f.i.i.i.i.( m m m &.p.g.j.&.M j n ' s.J.s.h.+.q B q m p m &.L.T.J.L.' m a d D z e l a a k ] T./.' m C a z z D m B q k x./.Q././.(.(.(.(.(./.(._.).[.[.[.[.[.[..X.X.X.X.X.X.X.X.X.X.X.X.X.XoX.X.X.X.X.X.X.X.X.X.X.XoXoXoXoX$XOXOX$XOXOX$X",
+"/./././.W.L.W.W.W.W.L.W.L.L.P.AXZXVXNXbXzXfXrX9X2X<XZ.8.;._ q 0 d R uXkXbXvXvX0X;XV.7.L 9 ; . # v tXjXaX6XZ.5.E y.y.t.t.u.u.u.u.f.u.f.f.u.i.t.i.i.i.f.i.u.H.i._ Z m a &.a.h.j.&.k m a ' s.J.s.s./ q g _ q q a O.L.L.E.W.` g m m &.W.`.e.q M q f T.!.` k a q l.^.z...a m m ` I./.!././.(.(.(./.(.`._.`._.[.[.[.[.[..X.X[.}..X.X.X.X.X.X.X[.[..X[..X$XoX.X.X.X}.$X.XoXoXoXoXoXoX$X$X$X$X$XOXOX",
+"/././.W.U./.W.W.L.W.Q.W.L.T.L.VXZXZXnXnXuXS.V.B.7.1.:.} S S 8 d t S S.bXbXbXsX8X;XB.-.d & X + r ,XfXgXaX6XZ.5.Q y.t.t.u.u.u.i.u.u.f.f.u.f.u.f.i.f.f.f.f.f.f.f._ a m z o.+.+.#...k f s ) s.J.Y.w.m Z a #.{ m B w H.L.J.L.` a k k w.W.W.G.Z j m H /.W.{ m j Z z.W.!.T.k a f l I.(.L.'././.(.(.(.(._._._._.'.].[.[.[.[..X[..X.X.X.X.X.X.X.X$X.X.X.X.X$X.X.X$X.X.X.XoXoX.XoXoX$X$X$X$X$X$X@X@XOX",
+"/.Q././.W.L./.Q.Q.Q./.W.L.W.L.ZXZXZXnXzXsXN.:.L B d d a j j C 8 0 S ,.fXbXbXpX1X;X7.H 2 $ + & 1.fXkXzXsX6XZ.5.Q u.t.u.u.u.u.u.u.f.u.f.f.f.i.f.f.i.f.i.f.f.f.i./ m m m z q a a m 0 m s ) s.J.J.+.d m k w.#.m j z 0.J.W.Q.' q k m O.$.O.F B p k ..).(.` B a q w.Q.!.`.' m m k x./.Q./.Q./././.Q.(.(.`._._._.[.[.[.[.[..X.X.X.X.X.X$X.X.X.X[.$X$X.X.X.X.XoX.X.XoXoX.XoXoXoX$XoXoX$XOX$X@X$X@XOX",
+"/./././.T././.W.W.Q.U.W.L.L.T.AXZXZXnXbXzXkXyX1.M 7 7 t y j p j p a R qXbXfXwX:XB.-.0 & . @ P sXbXbXjXsX2XC.4.T t.u.u.u.u.i.u.i.i.i.a.f.a.h.a.g.f.a.a.a.a.a.p.( m m j q q a a M n a a _ s.K.d.F a Z M G.H.Z m m ' W.Y.W.` m q p D a M q m m ' I./.T._ m m Z z.'.Q.`.' q m M x.(.Q.Q././././././.).).)._.[._.[.[.[..X[..X.X[..X.X.X.X.XoX.XoXoXoXoX.XoXoX.XoXoXoX.X.XoXOXOXOXOXOXOX@X@X@X@XOX",
+"(.Q.(./././.T././.Q.Q.W.W.Q.L.nXZXZXnXzXzXbXjXfXb.h r 4 6 8 q q p a } N.jXsX8X;X8.S 3 @ @ r 2XzXkXkXkXsX6XZ.6.! i.u.f.t.u.u.f.u.i.f.f.f.a.i.i.i.i.f.f.a.f.a.a.( m m n _ _ _ ' F k s a ] F.K.d.q j m S *.*.D B q m G.E.W.{ m m j a m q m Z $././.Q.'.{ M m k z.(.!.`.' m s z c.(.L./././././.W././.).).[.[.[.).[.[.[..X[..X.X.X.X.X.XoXoXoXoX.XoX.XoX.X.XoX.XoXoXOXOXoXXXXXOXOXOXOXOX@X@X@X@X",
+"/././././.W./.W./.T.Q.Q.T.W.U.ZXZXZXZXbXzXjXjXkXzX1.4 : 4 7 d q q S J 1.0X4X=X9.R 8 1 . - 6.jXjXkXbXkXaX6XZ.5.! i.i.f.t.i.i.i.f.f.f.a.a.a.a.a.a.i.a.i.d.h.f.s.( s k a q.h.s.s.q.n C j ' J.s.O.m k a B m q m m k l %.J.Q.[ a j j w.x.j M p k l.`.'.Q.{ m p z z.Q._./.M a p l I.!./.U./././././././.(.).).[.[.[.[.[.[.[.[..X.X.X.X.XOXXXoX.X.XoX.XoXoX.XoX.XoXoXoXOX.XOXOXOXOXOXXXOXOX$X@X@X@X",
+"/././././.W./././.U./.Q.Q.T.P.ZXZXZXnXzXzXzXjXjXkXjX1.u > 2 7 p m A } >.N.B.7.-.C > X % v hXjXkXjXkXgXsX6XZ.5.T i.f.f.f.i.i.f.i.f.f.f.a.a.a.a.g.a.a.i.a.h.g.p.( M j k r.s.J.j.&.l l m  .P.J./ k m A k q k a p B g _ /.L.| Z j M x./.$.q a D x I.(.}.) x Z x 3..XI.X.m B p ` ^.W.W.(./.W./././././.).).].[.).].[.[.[..X.X[..X.X.X.X.X.X.X.XoXoX.X.XoXoX.X$XoXoXoX$XOXoXOXOXoXOXOXOX@X+X@X@XOX",
+"`.`././././.W./.U././.Q.T.W.W.AXZXZXnXbXzXkXkXkXzXkXbXN.N 4 t 2 0 C J =.>.,.:.B < $ + r 6XjXjXkXkXkXkXaX4XZ.5.! a.i.i.a.a.a.f.a.i.a.s.j.g.a.a.i.a.a.f.p.s.j.F.( s s a &.J.J.j.x.Z a l _ d.w.k j k k ` ' ) _ S B a q H.W.' g q q H.U.T.F g a B $._.(.{ k d p Z k k n A q Z 3./._._.W./././.W././.(.).[._._.[._.[.[.[..X[..X[..X.X[.oXoX.XXX.XoXoXoX.XoXoXoXOXoXoX.XOXOXOXOXOXOXOXOX@X@XOX@XOX",
+"`./.).(.)./././.W././.Q.T.W.L.ZXZXZXnXzXjXkXkXkXjXkXkXjXS.G r t 8 m S J R J C 8 > + = >.jXjXkXkXkXkXkXaX6XZ.4.Q s.i.a.i.a.a.a.f.s.a.a.a.g.a.a.g.a.a.h.a.p.J.F.( s g q x.F.s.J.&.l C x { Y.X.M a B o.T.E.W.G.X.l k C #./.` q M C x././.l.Z s y l z._.{ Z s B m Z m B m x X.`.'.W.W.Q.W././.)./.(.)._._._.[._.[.[.[.[..X.X.X.X.X.XoX.X.X.X.XoX.XoXoXoXoXoXoXoXoXOX.XOXOX.XOXOXOXOXOX@X+X@X@XOX",
+"_.(.(.(./.(././././.L.W.T.L.Q.nXZXZXnXnXzXjXbXkXkXjXjXzXzXN.N u 6 y j M Z m 7 : X @ v aXbXkXkXkXkXkXkXaX4XC.4.E s.g.h.h.a.a.a.a.g.g.a.a.g.a.a.a.g.i.a.p.s.h.d...Z z D &.s.Y.Y.0.Z g Z _ G.] s a Z 3.L.U.U.U.%.x q a ) I.` x k k z.(.`.]._ B k l O. X[ M j n j l k S o.x.`._.W.[.(.(./.(././.).(._._.`._.].[.[.[.[.[..X[.[..X[.$X.X[..X.X.X.XoXoXoXoXoXoXoXOXoXoXOXOXOXOXOXOXOXOXOX@X$XOXOX@X",
+"_._.(.(./.`./.Q./.W./.Q././.Q.VXAXZXnXbXzXjXkXkXbXzXkXbXjXlXM.N 7 y d 0 C 7 6 X X r =XbXkXbXbXkXkXkXgXaX2XC.5.E s.g.i.s.h.s.h.s.h.a.g.h.g.g.g.g.g.f.J.h.s.f.k.d.H.R.F.h.E.L.j.E.F.P.h.U.k.F./.Y.L.J./.U.P.Q./.L././.Y.!.T./.(.~.U.!.!._.).~.].{.(._.[.`.].[.(._.[.[.^.(.[.Q./.)./.(.(.(.(.).`.(.].[.[.[.[.[.[..X.X[..X.X.X.X[.oX.X.X[..X.X.XoXoXOXoXOXoXoXOXOXOX.X.XOXOXOXOX@XOXOX@XOXOXOXOX",
+").).(.)./.(./././././.W.L.Q.W.ZXZXZXnXbXzXzXkXkXbXbXbXbXkXbXjX1.N 6 y 0 7 2 , # r W lXbXbXbXbXkXbXbXjXaX4XC.4.E s.j.s.s.s.h.h.h.h.s.s.s.s.s.s.f.s.a.h.p.s.h.f.s.F.s.J.j.E.L.J.J.E.W.E.J.Q.W.L.W.L.Q.T.W.Q.W.W.W./.}.U.(.).'./.~.'.(.].'.[.(.'.'._.'.{.[.[.[._.).`.(.[.(.[._././._.'._._.(.]._._._._.[.[.[.[..X[..X.X.X.X.X.X[.[.[.[..X[.[.$XoXoXoXOXOXOXOXOXOXoXOXOXOX$X$XOXOXOXOX@XXXOXOX@X",
+").(.).)./.(././.U././.Q.W.T.W.ZXZXZXnXzXzXjXbXkXbXbXbXbXbXkXkXsX:.u 2 7 6 , @ # b 9XzXbXbXbXbXbXbXkXzXsX4XC.4.E h.j.s.s.k.h.h.h.h.s.s.h.s.s.s.s.h.p.K.p.d.P.J.J.L.K.h.E.K.G.L.Y.s.P.W.W.J.Q.L.L./.L.!.W.(.T././.T.(.(.Q.(._.W.{.'.`.(.(.(._.]._.[.[.[.[.}._.).]..X.X(.'.}.'.).)._.'._._.].].[.)._.[.[.[.[.[.[..X[..X.X.X[.oX.XoX[..X[..X$X[..X.XoXOXOXoXOXOXOXOXOXOXOX$XOXOX@XOXOXOX@XOX$XOX",
+").).(././././.(././.Q.W./.T.L.ZXSXnXnXzXzXjXjXjXbXbXbXbXbXbXkXkXuXG t 2 , & X , 1.zXjXkXkXbXbXbXkXkXgXaX4XC.4.E h.J.h.h.s.s.h.h.s.h.h.h.j.h.h.h.h.h.s.s.J.F.h.J.J.J.J.E.J.L.L.J.L.L.L.L.T.W.Q././.T./././.W./././.U.(.Q.(.(.(.(.(.(._.[._._._.[.[.[.[.[.[._._.]._._.[._.[.].'._.[._._._.].'.).[.[.[.[.[.[..X.X[.[..X[..X.X[..X.X.X.X'.[..X.X.XOXoXOXOXoXOXOXOX%X$XOX%XOX@XOX@XOXOX@XOXXXOXOX",
+"(.]./.)./.)./.(./.T./.P././.L.ZXZXnXnXzXzXjXjXjXbXbXbXbXbXkXkXbXjX7XC < & @ % b 0XjXjXkXbXbXbXkXkXjXgXaX4XZ.4.Q s.h.h.h.h.h.h.h.j.h.h.h.J.h.J.h.F.s.J.J.J.J.J.J.J.J.J.J.J.J.L.E.L.L.L.W.Q.W./.W././.T./.Q././.(./.(.(.(.(.(.(.`.(.(._._._.[.[.[._.[.[.}._.).[._._.`.[.`.].].].'.'.[._.[._.[.[.[.[.[.'..X[.]..X.X.X[.[..X.X.X[..X.X[.[.$X.X[.OX.XoXoXOXOXOXOX@XOXOX%X@X@X@X@X%X@X@X@X@XOXOXOX",
+"].(.(.(.(.(.(.(./././.W.U./.L.nXZXZXnXzXzXkXkXkXbXbXbXbXbXbXbXkXjXbXN.u & + = b.bXbXbXbXbXvXbXbXkXbXzXsX8XC.6.E h.J.h.h.h.h.h.h.h.h.h.h.h.h.J.J.h.J.J.h.J.J.J.J.J.E.J.J.J.L.L.L.L.L.W.W.W.Q./.W.W.Q.Q././././.Q././.(.(./.(.).).].].].'.[.[.[.[.[.[.[.'.[.[._.[.[.[.'.[.[.[.[.[.[.[.[.[.[.[.[..X[.[.[..X]..X]..X.X.X.X.X.X.X.X.X.X[..X.X.X.XOX.XOXOXOXOXOXOXOX@X%X@XOX@X@X%XOX%X@XOX@X@XXX$X",
+"(.].].(.(.(.(.(.(.Q./.Q.T./.Q.ZXZXnXnXzXvXkXkXkXfXbXbXkXbXbXbXkXkXbXzX-.& @ v dXbXvXkXjXbXkXbXkXkXkXgXaX4XC.4.E J.F.s.J.J.s.F.h.F.s.h.s.J.J.J.h.J.J.J.J.J.J.J.J.E.E.J.J.E.W.L.E.W.L.W.W.W.W./././.(././././.(./.(././.`.(.(.(.(.(.(.]._.[.[..X[.[.[.[.[.[.[.[._.[.'.].[.[._.'.[.[.[.[.[.[.[.[.[.[..X[.[..X[..X.X.X.X.X.X.X.X.X.X.XXX.X.XOX.XoXXXoXoXOXOXOXOXOX@X@XOX&X$X%X%X$X%X@X@X@XOX%X$X",
+"_.(.(.`.(.`._._.(././.Q./.W.Q.ZXVXVXnXzXjXkXkXkXkXfXkXkXkXkXkXbXkXjXjXuXb r b.bXkXkXkXkXkXkXkXkXjXbXjXsX4XC.6.E h.F.J.s.s.J.h.F.h.F.h.J.s.J.J.J.J.J.J.J.J.J.J.L.L.L.L.L.L.W.E.W.W.W.L.W.Q./././.Q.Q././.(.(./.(./.(.(._.(.(.).(._._.[.'.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.'.[.'.[.[.[.[.[.[..X[..X.X[..X'.].]..X]..X.X.X.XXX.X.X.XoXoXoX.XoXXXoXoXoXoXOXOXOXOXOX@X@XOX$X%X%X&X&X$X@X@X@XOX$X$X",
+"].(._./._.(.(._.Q./.`.Q././.Q.nXVXAXZXzXzXkXkXkXkXjXkXbXjXjXkXjXjXjXjXlX,XR uXvXjXjXbXjXjXbXvXjXjXjXjXdX4XC.4.E J.J.J.J.J.s.J.h.J.h.F.J.J.J.J.J.L.L.E.E.J.E.J.L.L.L.L.L.L.P.E.W.L.L./.T.U./.W./.].(.`.`./._.(._.(.(.(.(.(.(.].].[.[._.[.`.[..X[.[.[.[.].]..X].[.[.[.[.[.).[.[.[.[.[.[.[.[.[.[.[.[..X[..X.X.X.X.X.XXXOX.X.XOX.XoX.XoXoXXXoXoXoXoXoXoXoXoXOXOXOXOX@X%X&X$X%X$X&X%X@X@X@X@X@X%X",
+"(.(.(.(.(.(.).(./.Q./.Q./.U.Q.MXZXZXnXzXzXkXjXjXkXkXkXjXkXkXjXbXzXkXkXkXjX7XzXjXkXkXzXkXgXjXgXjXjXjXkXdX6XC.<.~ h.J.J.J.J.h.J.J.J.J.J.J.J.E.L.L.E.L.E.E.E.W.E.L.E.L.L.E.P.W.W.W.W.W.T.W.Q./././././.(.(.(.(.(.(.(.(._._._._._.[.[.].].[.]..X].].[.].[.[.[.[.[.].[.].[.[._.[.[.[.[.[.[..X[..X.X.X[..X[.[.[..X.XXX.XOXoXoXoXoXoX.XoXoXoXoXoXoXOXoXoXoXoXoXOXOXOX@X@X%X%X%X%X%X%X%X@X@X@X@X@X@X",
+"(.].(.(.(.(./.(.(././.L./.G.J.MXZXnXnXzXbXbXbXbXbXkXkXkXkXjXkXkXjXkXkXkXbXjXjXjXkXkXkXkXkXkXkXkXkXkXgXaX,XC.^ E J.j.J.h.J.Y.j.J.J.h.J.J.J.E.L.L.L.E.E.E.E.P.L.L.L.L.W.L.E.W.E.W.W.W./.Q./.Q././././.(.(.).).).(.(.(.'._._.[._.[.'.[.[.].[.].].[.]..X[.[..X]..X[.[.[.[.[.[.[.'.[.[.[.[.[.[..X[..X.X.XoX[..XoXoXoX.X.X.XoX.X.XoXoXoXoXoXOXoXOXoXOXOXoXoXoXoXOXOX@X@X@X%X%X%X%X%X%X@X%X%X@X@X$X",
+"(./._.(./.).)./././.Q.W./.T.G.MXnXnXnXkXfXfXkXjXkXkXkXkXkXkXbXkXkXkXkXkXkXkXkXkXkXkXgXgXjXgXjXkXkXgXhXuX-Xb.! T L.F.J.J.J.J.Y.J.J.J.J.J.L.L.L.W.W.W.W.W.P.E.L.L.E.L.L.L.W.W.W.W.W.W././././././.).).).(.(.).(.].(.]._.[.[.[.[.[.[.[.]..X].[.[.[.[.].[..X[..X[.[.[.[.[.[.[.[.[.[.[.[.[..X[..X.X.XoXoXoXoXoXoXXXOXOXoXoXoXoXoXoXoXOXoXOXOXoXoXoX$XoXoXoX$XoXOXOX@X@X@X@X@X%X$X@X%X@X@X@X%X%X%X",
+"(.`./.`.(.)./.).Q.Q.(./.G.L.Q.bXxXnXjXdXuXuXuXuXtXtXtXtXuXtXtXtXuXtXtXtXtXtXtXuXtXtXtXuXtXtXtXtXtXtX9X,Xb.! c b j.L.J.J.J.J.J.J.J.J.E.J.L.E.L.E.E.W.P.Q.W.L.W.E.W.P.E.W.W.W.W.W.W.L././././.`./.)./._.).).(._.)._._._.[.[.[.[.[.[.[.[.].[.[..X[.]..X.X[.[.[.[..X[.[.[..X[.[..X[..X'..X.X.XXX.X.XoX.XoXoXoXoXoXoXoXoXOX.X$XOX$X$XOXoXOXOXoX$X$XOXOXOXOXOXOXOXOX@X@X@X@X@X%X%X%X%X%X@X%X%X%X%X",
+"(././././.Q././././.L.L.Q.Q.!.hXtXyX2X-XZ.Z.Z.Z.C.A.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.C.Z.Z.C.C.m.^ U c c c J.T.J.E.J.J.J.J.W.J.J.W.L.W.L.W.W.W.W.W.W.W.J.W.W.L.W.W.W.L.W.W.Q.W././.Q._./._./.(.).).(.).[.).[.[.[.[._.[.[.[.[.[.[..X].[.[.[.[.[.[.[..X[.[..X[.[.[.[..X[.[..X.X.X[.$X[..XoX.XoXoXoXoXoXOXOXOXOXOXOXOXOXOXOXOXoXOX@XOXOX$XOXOXOXOXoXOXOXOXOXOX@X@X@X@X%X%X%X%X%X%X%X%X%X%X",
+").).).).).{./.W./.W.Q.U.T.E.E.tX,XS.m.5.^ ~ ~ ~ ~ ~ ~ ~ ^ ~ ~ ~ ^ ~ ~ ~ ^ ~ ~ ^ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! Q c c c c E J.s.W.J.L.L.L.L.L.J.L.E.W.L.W.W.W.W./.W.Q.W.W.W.T.W.W.W.W.W.W.L././././._.(.(.(.).].[._.].[._.[.[.].[.].[.[.[.[.[.[.[.[.]..X.X[..X[..X.X[..X.X.X.X[.oX.X.X.X.X[..X.X.X[.[.$XOXoXoXoXoXOXoXOXOXOXOXOX@X@XOXOX@XOXOXOXOXOXOXOX@XOXOXOXOXOXOXOXOXOXOX@X@X@X%X%X%X%X%X%X%X%X%X*X",
+"/.).)././././.W.T./.Q./.T.W.W.^.N.b.Q U c c c c c c c c c c c c c c c c v c v c c c Y c c c c c c c c Y Y U @.H.L.T.L.L.L.J.J.L.L.J.W.W.L.W.W.W.W.W.W.W.W.W.L.W.W.W.W.L.W.W.W././.Q.(._.(.(.]._._.[._.[.].[.]..X[.[.[.[.[..X[.[..X`.[.]..X.X[.[.[.[..X[.[.[.[..X.XoX.XoX.X{.[.oX.X.X[.oX.X.XOX.XoXOXoXOXXXOXOX@X@X@X@X@X@X@X@XOX@XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOX$X@X@X%X%X%X%X%X%X%X*X%X",
+"/./././.(././.W./.L.W.P./.W.L.~.v.@.c c c c c c c c c c c c c c c c c c I c c c c c c c c I c c c c I c P @.R.k.!.k.W.L.L.L.J.W.L.L.W.E.E.W.W.L.W.W.W.W.W.W.L.W.W.W.W.W.W./.L./././.`./._.].(.'._._.[.[.[.[.[.[..X[..X[.[..X[.[.[..X[..X[.[.[..X.X[..X[..X.X[..X[..XoX.X.X.XoXoX[.$X$XoXOXOXOXOXOXOXOXOX@X@X@X@X@X@X@X@X&X$X@X@X@XOX@XOX@XOX@XOX@XOX@X@XOXOX@XOXOXOX$X@X%X%X%X*X%X*X%X*X%X*X",
+").).(.(./.Q./.W.W.W.W.W.P./././.T.T.T.W.W.Y.T.Y.J.L.Y.Y.J.F.Y.J.Y.J.W.W.T.Q.T.W./.W.`.Q.W.T./.T.T.W.).~.U.T.T.T.T.G.W.L.W.W.W.L.E.W.W.W.Q.T.W.T.W.W.W.W.W.W./.W.W.W.Q.Q./.Q.T././.(.(.(._._._.[.[._.[.[.[..X[..X.X.X.X.X[..X.X.X.X[.[.[.[..X.X[.[.{..X.X[..X.X.X.XoXoX.XoX.XoX[..XoXoXoXoXOXOXOXOXOX@X@X@X$X&X&X&X&X#X%X#X%X@X@X@XOX$XOXOXOXOXOX@XOX&X$X$XOXOXOXOXOX@X@X@X@X@X%X%X&X$X&X&X&X",
+"/./.(./.W././././.Q././.Q.W.L.W.!.E.W.W.J.W.W.W.L.L.L.L.L.L.L.L.E.L.W.L.W.W.Q././.T./././.W././.~.(.W./.(.P.Q.Q.W.W.W.W.W.T.W.E.!.W.W.W.W.Q.W.L.W.W.W.W.W.W.W.Q.Q././.Q.Q.W./.T./.(.(.(._._._._._.[.[.[..X[..X.X{..X.X.X.X.X{..X[..X[.[.[.[.[.[.[..X]..X]..X.X.X.XoXoXoXoXoX.XoXoXoXoXOXOXOXOXOXOX@X@X@X@X@X%X&X&X*X#X#X%X%X@X@X@X@X&X@X$X@X@X@X@X@XOX$X$XOXOX$XOXOX@XOX@X@X*X@X%X&X&X&X&X&X",
+"(././.W././././.U./.L./.W.Q.Q.W.W.W.!.W.W.W.W.W.L.L.L.W.L.L.L.L.L.W.W.W.W.W.L././.Q././././.(././.Q.(./.Q././.T.Q.L.W.W./.L.L././.T./.Q.Q.Q.W.Q.W.W.W.Q.W.W.W././.Q./.W.)./././.(.(.(.(.(._._.[.[._.[.[.[.[..X[..X.X.X}..X.X.X.X.X[..X[..X[.[.[.[.[..X[..X.X.XXXoXoXoX.XoX.XoXoXoXoXOXoXOX$XOX%X#X@X@X@X&X&X&X&X&X*X*X&X&X@X@X@X%X@X@X@X&X@X@X$X@X%XOX$X%XOXOXOX@XOX@X@X@X*X@X%X&X&X*X*X*X*X",
+"(.(./././.W./.T.T./.L././.Q./.Q./.W.W.W.E.W.W.J.W.L.W.L.E.L.L.L.W.W.W.Q.W.Q.T.W./././.`.(././.(.(./.(././././././.Q.W.W.L./././././.W.Q.W././.Q.!.W.T.W.T.W.W./.T././././././.).(.(.(._.'._._._.[.[.[.[.oX.X[..X.X.X.X.X.X}..X.X.X[.[..X[..X.X[.[..X[..X.X.X.XoX.XoXoXoXoXoXoXoX$XoXoXOXoX$XOX@X#X@X&X&X&X&X&X&X*X&X*X&X&X&X&X&X%X%X@X@X@X@X@XOXOX@X$X$XOXOXOX@X@X@X@X@X@X@X*X%X&X&X*X*X*X*X",
+"/././.Q././././././././.W././.W.W.W.W.W.W.W.W.T.E.W.J.W.W.E.W.W.L.Q./.W.W./.W./.Q./.(./.).(.(.(.(./.(.(.(.(./.Q./.T.Q./.L./.L././.W././.Q./.W.T.W./.W.W.Q././.W.Q./././.(././././.).).).[._.[.[.[.[..X[.[.[.oX[..X.X.X.X.X.X.X.X.X.X.X.X.X[..X.X[..X[..X.X].XXoXoXoXoXoXoXoXoXoXoXoXOXoXOXOX@X@X%XOX&X%X&X&X&X*X*X*X&X&X&X&X&X&X#X#XOX&X@X@X@X@X@X@X@XOX@X@X%X@X@X@X@X@X%X%X%X&X&X&X*X*X*X*X",
+"/./././././././././.W./.W./.(.Q.!.W.W.W.W.W.W.L.L.T.T.W.W.W.W.T.W.W.Q.Q.W././././.(.(.(.(.).(.(./.(.(.(.(.(.(.Q././.W./.U././././././././././././././.Q./.W./././././.).(.(._.(.(.)._._._._.[.[.[.[.[.[.[..X[..X.X.X.X.X.X.X.X.X.X[.[..X[..X.X[..X[..X.X.X.X.XoXoXoXoXoXoXoXoXOXoXOXoX$XOXOXOX%X%X%X&X&X&X&X*X*X*X*X&X&X&X&X&X&X&X#X%X%X@X@X@X@X@X$XOX@X%XOX@X@X%X%X@X%X%X%X&X*X%X*X&X&X&X&X",
+"!.(./././././././././.Q./././.L.Q.W.Q.W.W.W.L.Q.L.L.W.W.W.W.W.T././././././.Q././.(.(.(.).(.)._.(.(.(.).)././.(.Q./.W.W.W.W././././././.Q././././././././././././././.).(.(.].`.).)._.[._.[.[..X[..X.X[.[..X.X[.{..X.X.X.X.X.X.X.X[..X.X[..X.X.X.X.X.X.X.XXXoX.XoXoXoXoXoXoXoXoXoXOXOXOXOXOX@X@X%X@X&X&X&X*X&X*X*X*X&X&X&X#X&X&X&X#X%X&X@X@X@X@X@X$X@X@X%XOX%X%X%X%X%X%X%X*X%X*X*X*X&X&X&X&X",
+"(./././././././././.`./.Q././././.T.W.W.W.W.L.L.Q.W.T.Q.W.W././.T./.Q././.(.(.`.(.(.].].).].[.).).).).).).`.(.(.`./././././././././.(./.(.(.(.(.(./.(./././././.(.(.).).(.(.).).[.).[._.[.[.[.[.[.[..X[..X.X[..X.X.X.X.X.X}..X[..X.X.X.X.X.X[..X{..X.X.X.X.X.XoXoXoXoXoXoXoXoXOXOXOXOXOXOXOX@X@X@X@X&X&X&X&X&X*X*X*X*X*X&X&X&X&X&X&X&X&X&X&X@X@X@X@X@X@X%X#X%X%X%X%X*X%X%X&X*X%X*X*X&X&X*X%X",
+"/./././.(.`./.`./.(.(.(./././.W.L./.W.L.W.W.T.W.W././.W./././.W.Q./.(./.(.(.(._.(.(._._._.[.[.[.[._.[.).]._._._.(.(.(././././.).`.(./.(././._._./.(.(.(.(.(.(.(.].(.(._.(.(._._.[.[.[.[.[.[.[.[.[.[..X[..X.X[..X.X.X[.[..X.X[..X.X[..X[..X.X.X.X.X.X.X.X.X.X.XoX.X.XOXoXoXoXOXoXOXOXOX@XOX@X@X@X@X#X@X&X#X#X&X&X*X*X*X*X*X*X*X*X*X*X*X*X&X&X$X$X$X@X@X$X&X%X%X$X*X*X&X&X&X*X*X*X*X*X%X&X*X%X",
+"`./.).).(._./.(.).(.(.(././././././.W./.W.W.W.W./.W.!././.W././././././._.(._.(.].]._.(.[.[.[.[.[._.[._._._._._.(.`._.(././.).(./.(./.(./.`.(./.(./././././.(.)._.(.[.(.[._.[._._.[.[.[.[.'.[.[.[.[.[.[.[.[..X.X[..X.X.X[..X.X[..X.X.X.XoXoX.X.X.X.X.X.X{.$X.X.XOX.XoXOXOXoXOXOXOXOX@XOXOX@X@X@XOX@X@X&X&X&X&X&X*X*X&X*X*X*X*X*X*X*X*X*X&X&X&X$X%X@X%X%X%X%X&X*X*X*X*X*X&X*X*X*X%X*X&X&X%X%X",
+"_.(.(.).(.(.(.(.(.(.`././././.Q./.L.L.L.W.W.W./.Q.(./././.(././.`./.(.(.(._._._.(.[.[.[._.[.[.[.[.[.[.[.[.[._._.(.(.).).(.(._.(.(.(.(.(.(.(.(.`.(.(./.(.(.(.(.).'._._.[.[.[._._._.[._.[.'.[.[.[.[.[..X[.[..X.X[..X.X.X[..X.X[..X.X[..X.X.X{..X.X.X.X.X.X[.oXoXoX.XoXoXoXoXOXOXOXOX@XOX#X@X@X#X@X#X@X@X@X%X%X&X&X*X&X&X*X*X*X*X*X&XqX*X*X&X&X$X&X@X%X&X%X&X&X&X*X*X*X*X*X*X*X*X&X&X%X&X&X%X%X",
+"_._.(.(.(.(.(.(.).(._._././././././././.(.Q.Q././.Q.(.(.(./.(.(.(.`.(.]._._.[._.[.[._.[.[.[.[.[.[.[.'.[.[.[._.[.(.(.(.(._.).).(.(./.).).]._._._.(.`.(.(.(._.).).].[.[._.[._._._.[.[.[.[.[.[.[.[.[.[..X[.[.[..X.X[..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XoX.XoX.XoXoXOXOXOXOXoXOX@XOXOX#X@X@X@X@X#X#X#X@X%X%X&X&X&X*X&X*X*X*X*X*X&X*X*X*X&X&X&X&X&X$X%X%X&X&X$X&X*X*X*X*X*X&X*X*X&X&X&X&X%X%X",
+"_.].].(._.[._.].]._.(.).(._.(.Q././././.W.(./.W.(.Q.(.(.(.(.(.).(._._.[.[.[.[.[.[.[.[.[.[..X'..X[.[.[..X[.[.[._.]._.)._.)._.(._.).(.(.(.).)._.`.(.(.(.(.).).[._.[.[._.[.[._.(.].[.[.[.].[.[.[.[.[.[.[.[.[.$X[.[.$X.X.X.X$X[.$X[.[..X.XoX.X.X.X.X.X.X.XoXoX.XoX.XOXOXoX.XOXOXOX$XOX#X@X@X#X@X@X&X#X#X#X#X&X&X&X*X*X*X&X*X*X*X*X*X*X*X*X*X*X&X&X&X%X%X&X%X$X%X*X*X*X*X*X*X*X*X*X&X%X%X*X%X%X%X",
+"_._.'.[._.[.[.[.[._._._.(.`.`././.(./.Q./.(./.(./././.(.(.(.(.)._._.[.[.[.[.[.[.[.[.[.[..X[.[.[.[..X[.[.[.[.[.[.].).).[._.).)._.(.(.(.]._._.[.).(.].(.]._._.].[._.[._._._._._.].'.[.[.[.[.[.[.'.[.[.[.[.[.[.$X[.[.[..X[.[.[.[.[.[..X.X.XoXoXoX.XoXoXoX.XoXoXoXoX.XOXOXOXOXOXOX$X@X@X@X#X@X&X#X&X&X#X&X#X&X&X*X*X*X*X&X*X*X*X*X*X*X*X*X*X*X*X&X&X&X&X&X&X*X&X%X*X*X*X*X*X*X*X*X&X&X&X&X%X%X%X"
+};
diff --git a/images/checkbox3hilite.xpm b/images/checkbox3hilite.xpm
new file mode 100644 (file)
index 0000000..ae2df70
--- /dev/null
@@ -0,0 +1,294 @@
+/* XPM */
+static char *checkbox_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"190 70 218 2",
+"   c #153F6F",
+".  c #1C3E65",
+"X  c #1D3D6B",
+"o  c #1E3F74",
+"O  c #233661",
+"+  c #233D65",
+"@  c #243D6B",
+"#  c #293F66",
+"$  c #293E6C",
+"%  c #253D70",
+"&  c #283F71",
+"*  c #0C4702",
+"=  c #0D4A02",
+"-  c #0E5302",
+";  c #104B06",
+":  c #114D09",
+">  c #15500D",
+",  c #105C02",
+"<  c #165111",
+"1  c #1F5D1C",
+"2  c #116302",
+"3  c #126A02",
+"4  c #147402",
+"5  c #157A02",
+"6  c #1C740F",
+"7  c #1F6D22",
+"8  c #226F37",
+"9  c #217132",
+"0  c #16436B",
+"q  c #1D4265",
+"w  c #1C426B",
+"e  c #1C4473",
+"r  c #1C4974",
+"t  c #1D4978",
+"y  c #214265",
+"u  c #22426B",
+"i  c #22486A",
+"p  c #29406B",
+"a  c #2A4B6E",
+"s  c #234271",
+"d  c #25447B",
+"f  c #2A4071",
+"g  c #2F467A",
+"h  c #2D4D74",
+"j  c #2B4A79",
+"k  c #23527C",
+"l  c #244E83",
+"z  c #294E82",
+"x  c #215684",
+"c  c #255788",
+"v  c #255A85",
+"b  c #255989",
+"n  c #2B5585",
+"m  c #2C568A",
+"M  c #2B5A85",
+"N  c #2B5A8A",
+"B  c #2F5792",
+"V  c #36558B",
+"C  c #315A86",
+"Z  c #325B8B",
+"A  c #23608F",
+"S  c #2D678F",
+"D  c #2C6592",
+"F  c #2E6399",
+"G  c #2F6994",
+"H  c #2B6C99",
+"J  c #31618F",
+"K  c #326593",
+"L  c #35679A",
+"P  c #33699B",
+"I  c #39699A",
+"U  c #32709C",
+"Y  c #2777A8",
+"T  c #2878A9",
+"R  c #306FA2",
+"E  c #3573A2",
+"W  c #347FAB",
+"Q  c #3C74A2",
+"!  c #3D76AB",
+"~  c #3E7CA3",
+"^  c #397CA9",
+"/  c #367EB0",
+"(  c #3B7CB1",
+")  c #40689B",
+"_  c #4379A5",
+"`  c #437EAC",
+"'  c #168002",
+"]  c #178902",
+"[  c #188A02",
+"{  c #199403",
+"}  c #1A9803",
+"|  c #1CA103",
+" . c #1DAB03",
+".. c #1EB103",
+"X. c #269818",
+"o. c #2A9227",
+"O. c #2E9E3D",
+"+. c #24AC0D",
+"@. c #23B50A",
+"#. c #20BC03",
+"$. c #37BF32",
+"%. c #31BA3F",
+"&. c #338A57",
+"*. c #2E936A",
+"=. c #318F70",
+"-. c #33957E",
+";. c #349879",
+":. c #3AAA47",
+">. c #21C403",
+",. c #22CC03",
+"<. c #2AC312",
+"1. c #23D203",
+"2. c #25DA04",
+"3. c #28D909",
+"4. c #31D01D",
+"5. c #27E304",
+"6. c #28E604",
+"7. c #28EA04",
+"8. c #2EEF0A",
+"9. c #29F304",
+"0. c #2CF309",
+"q. c #2AF904",
+"w. c #2FFB09",
+"e. c #33E517",
+"r. c #31EB12",
+"t. c #33F012",
+"y. c #35FB12",
+"u. c #3FF81E",
+"i. c #42FB23",
+"p. c #59EE57",
+"a. c #54F245",
+"s. c #3D9E86",
+"d. c #3680AE",
+"f. c #3A82AD",
+"g. c #3282B5",
+"h. c #3A82B3",
+"j. c #3C8AB5",
+"k. c #3C98A6",
+"l. c #38A1B2",
+"z. c #2A8FC7",
+"x. c #2B8ECA",
+"c. c #2D91CC",
+"v. c #3494CD",
+"b. c #359ACC",
+"n. c #3D90C4",
+"m. c #3896CE",
+"M. c #3B9BC5",
+"N. c #3B99CE",
+"B. c #3695D0",
+"V. c #359AD3",
+"C. c #3996D0",
+"Z. c #3C99D0",
+"A. c #3D9BD8",
+"S. c #3CA2D3",
+"D. c #4284AB",
+"F. c #4483B3",
+"G. c #4487BB",
+"H. c #4189B6",
+"J. c #438CBA",
+"K. c #4884B6",
+"L. c #4989B5",
+"P. c #4A8ABB",
+"I. c #449CB6",
+"U. c #4F92BC",
+"Y. c #508ABA",
+"T. c #4EB38F",
+"R. c #55BB8C",
+"E. c #4196CD",
+"W. c #439AC4",
+"Q. c #439BCC",
+"!. c #4A94C1",
+"~. c #4B95C8",
+"^. c #4D9BC4",
+"/. c #4B9CCC",
+"(. c #4393D2",
+"). c #439CD2",
+"_. c #439BD9",
+"`. c #489ED3",
+"'. c #499DDA",
+"]. c #5096C7",
+"[. c #539EC6",
+"{. c #539BCB",
+"}. c #589FCD",
+"|. c #519FD5",
+" X c #519FDD",
+".X c #599FDA",
+"XX c #44A1CD",
+"oX c #4BA1CC",
+"OX c #45A0D3",
+"+X c #42A3D9",
+"@X c #47A8D3",
+"#X c #44AED8",
+"$X c #4BA1D4",
+"%X c #4CA3D8",
+"&X c #4AA9D4",
+"*X c #4CABDD",
+"=X c #54A2CC",
+"-X c #5BA4CE",
+";X c #52A4D6",
+":X c #54A6D8",
+">X c #56A8D6",
+",X c #55A8D8",
+"<X c #59A4D4",
+"1X c #5BA4DA",
+"2X c #5AA9D6",
+"3X c #5BAAD9",
+"4X c #53B0D2",
+"5X c #54A6E0",
+"6X c #62ADDB",
+"7X c #68AFDB",
+"8X c #66B0DC",
+"9X c #6BB2DD",
+"0X c #70B5DE",
+"qX c #74B8DE",
+"wX c #6DB4E0",
+"eX c #72B6E0",
+"rX c #75B9E1",
+"tX c #78B9E1",
+/* pixels */
+";X$X|.;X/.$X$X$X$X/.$X`.$X`.`.`.`.`.).).`.).Q.).).N.N.Z.).N.N.N.N.N.Z.C.N.N.C.C.B.m.m.m.v.C.m.C.m.m.m.C.C.C.m.C.C.C.C.m.C.C.C.C.m.m.C.m.m.m.m.B.N.v.m.m.m.m.b.v.C.v.C.C.m.m.m.m.B.m.v.B.Z.m.C.Z.N.B.N.Z.N.Z.Z.Z.N.).).).`.`.`.OXOX`.OX$X$X`.`.`.`.`.`.`.OXOX$X$X$X$X;X;X$X;X$X%X;X,X:X:X,X,X:X,X2X,X3X3X3X3X3X3X2X3X3X3X3X3X3X3X3X3X1X3X3X6X1X3X1X3X3X3X6X6X3X3X3X3X3X3X3X3X8X3X8X3X8X8X8X8X",
+";X;X;X`.$X$X$X$X`.`.`.$X$X$X$X`.Q.`.OX).).).).).).).(.).).N.N.).N.Z.).N.Z.N.Z.Z.Z.Z.Z.C.N.Z.N.N.N.(.Z.Z.(.N.m.m.C.C.C.C.m.C.C.C.m.m.m.m.N.v.m.B.m.m.m.v.v.m.m.v.v.C.m.v.v.m.m.N.N.m.B.m.v.Z.C.C.C.Z.Z.N.Z.Z.).Z.).).).`.`.).`.`.`.OXOX`.OX`.`.`.`.`.`.OX`.$XOX$X$X$X$X;X;X;X;X;X;X:X:X,X>X,X<X2X,X3X2X3X2X2X3X3X3X2X3X3X3X3X3X1X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X6X8X*X3XwX3XwX3X3X8X8X8X8X8X8X",
+";X;X$X;X$X$X$X$X$X$X$X`./.$X`.OX`.`.`.`.).`.).).).).Q.).).Q.).).).).).).).).Z.(.Z.Z.N.N.N.(.).N.).Z.N.Z.N.Z.Q.C.N.N.C.C.m.m.m.m.m.v.m.C.v.Z.Z.v.B.B.m.v.m.v.v.b.v.v.n.v.m.m.v.v.v.b.m.m.v.m.N.v.v.Z.m.C.N.Z.Z.Z.N.).).).(.).`.`.`.OXOXOX).`.).`.`.`.).`.`.`.`.`.$X$X$X$X$X$X;X;X$X;X;X;X:X;X:X2X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X,X3X3X3X3X6X3X6X6XwX3X8X8X8X8X8X3X9X5X9X",
+";X;X;X$X;X;X$X$X`.$X$X$XOX$X$X$XOXOX`.`.`.`.`.`.`.).).).).`.).).).`.`.OX).).).)._.).).).).).).N.).).).Z.).(.).N.N.C.m.C.m.C.m.v.m.v.Z.v.Z.v.v.v.B.v.v.V.v.v.v.v.v.v.C.v.v.m.N.v.v.m.m.m.N.v.v.N.N.v.C.C.N.Z.Z.Z.).N.).).`.).).`.`.`.`.`.).`.`.`.).`.Q.OX).`.`.$X$X$X$X$X%X$X;X;X;X;X;X;X:X,X:X,X,X3X3X3X3X3X3X3X8X3X3X3X3X3X3X3X3X3X,X3X3X3X3X3X3X3X3X6X3X6X3X3X6X4X6X3XwX8X6X8X8X3X8X8X8X8X",
+";X;X;X`.;X$X$X$X$X$X$X`.$X$X$X$XOXOX`.$X'.OX%X`.`.`.`.`.`.`.`.$XOX$X$X$X`.$X`.`.`.`.`.`.`.`.).`.`.).`.`.).).Z.Z.Z.Z.N.C.C.v.m.m.v.N.Z.m.v.v.v.m.v.v.V.v.v.v.v.v.v.B.v.v.v.C.B.B.v.N.m.v.m.m.v.v.m.m.N.B.Z.Z.Z.Z.).Z.).N.).).).).`.`.).).`.Q.`.`.`.`.).`.`.`.`.OXOX$X$X$X$X$X/.;X;X;X;X>X;X>X<X2X,X3X3X3X8X8X3X8X8X3X3X3X8X3X8X3X1X3X3X3X3X6X3X3X3X3X2X6X6X6X3X3X3X3X8X3X3X8X3X9X8X3X8X8X8X8X",
+";X;X;X;X;X;X;X%X$X$X$X;X;X$X$X`.$X`.`.`.`.$X`.`.`.`.$XOX`.OX$XOX$X$X$X$X$X$X$X$X`.OX`.`.`.`.OX/.`.).`.'.OX`.)._.).V.Z.Z.C.C.v.v.m.v.v.v.v.m.m.v.v.v.v.v.v.v.v.v.B.v.v.B.B.B.B.B.m.v.m.B.v.b.N.v.v.N.v.Z.N.Z.Z.Z.Z.).).).Z.).`.).).).).).).).N.`.).).`.`.`.`.`.OX$X$X$X$X$X$X;X;X$X;X;X&X>X;X;X>X3X8X5X3X3X5X3X3X3X3X3X3X3X3X3X3X3X6X3X2X3X3X3X2X6X3X3X3X2X3X3X6X3X3X3XwX8X3X8X3X8X8X3X8X8X8X",
+"|.;X%X;X;X;X;X;X;X%X$X;X$X$X`.$X%X$X`.%X$X`.$X`.$X$X$X$X$X$X;X$X;X$X$X;X;X$X;X$X%X`.;X`.$X$X`.$XOXOX`.OX`.`.OX`.).Z.(.N.m.C.v.C.m.m.v.m.m.v.v.v.v.c.m.v.v.v.v.v.v.B.B.v.v.B.v.B.m.B.m.B.v.v.v.m.v.Z.m.B.Z.Z.Z.Q.).N.A.).).).).).).).).).N.).).).`.).).`.`.`.`.OXOX$X$X$X$X$X$X;X;X;X;X;X;X;X>X;X,X,X3X3X3X8X8X3X3X8X8X3X3X8X3X3X6X6X2X3X3X3X3X6X3X3X3X3X3X3X3X6X3X8X8X3X3X8X3X8X8X8X3X8X8X3X",
+";X;X;X;X;X;X;X$X$X;X;X%X$X;X;X$X`.$X%X`.%X`.;X$X$X$X$X;X;X;X%X:X:X:X:X,X;X;X;X%X;X;X;X`.;X$X$X$XOX'.`.+X`.%XOX).`.).N.N.m.m.B.C.m.v.v.v.v.v.v.v.v.v.c.v.c.v.c.v.v.v.v.v.v.v.v.v.m.v.m.v.v.N.N.v.B.m.Z.Z.N.Z.Z.A.Z.).Z.).Z.).).).N.).N.).).).).).).).`.`.%X$X`.OXoX$X$X$X$X;X;X$X;X;X;X;X;X>X>X>X,X3X3X3X3X3X3X3X3X8X3X3X8X3X8X3X6X3X6X3X6X6X6X3X6X6X3X3X3X3X3X3X3X3X3X8X3X3X3XwX8X8X8X9X8X8X",
+";X|.;X;X;X;X;X;X;X;X;X$X;X;X;X%X$X$X$X$X$X$X$X$X$X;X;X;X%X:X:X;X:X2X:X:X:X:X:X;X;X;X;X;X;X$X$X$X$X$XOX%X`.`.'.`.`.Z.).Z.N.C.v.v.v.B.B.B.v.v.v.c.v.v.v.v.c.v.c.v.c.B.B.B.v.v.v.v.v.B.m.m.v.m.m.v.m.m.Z.Z.Z.Z.Z.Z.).).Z.).).).).N.Z.Q.).).).Z.).).).`.`.OXOX`.%X`.$X$X$X$X$X$X;X;X;X;X;X;X;X;X<X;X,X,X3X3X3X3X8X8X3X6X6X8X5X9X8X3X8X3X3X3X3X8X3X3X2X6X6X2X2X2X3X6X6X3X6X6X3X6X6X6X8X6X8X8X8X8X",
+";X;X;X;X;X;X$X;X;X$X;X;X;X;X;X`.;X$X$X$X$X$X;X;X;X;X;X;X>X,X2X2X2X2X3X3X2X:X:X:X;X:X;X%X;X;X;X$X$X$X`.$X%XOX$X`.`.`.).Z.N.m.m.v.B.v.v.v.v.v.v.v.v.c.c.v.v.c.c.B.B.c.v.c.c.v.v.v.B.v.m.m.m.m.v.m.m.m.Z.B.Z.Z.Z.A.Z.).).).Z.).N.).).).N.Z.).).).`.S.).`.`.%X`.`.`.$X$X$X`.$X;X$X;X$X;X;X>X>X,X,X,X3X,X3X3X3X3X3X3XwX3X8X6X7X8X8X7X8X8X8X8X8X3X8X3X6X2X6X3X6X2X2X2X3X3X3X6X6X3X3X6X8X8X8X8X8X8X",
+";X:X;X;X;X;X;X;X;X;X;X;X;X'.;X$X$X;X$X;X;X$X$X;X;X;X;X;X:X,X2X,X3X2X3X2X3X,X,X:X;X:X:X:X;X;X$X$X$X%X%X`.$X`.'.OXOXOXZ.Z.N.N.m.m.v.v.v.v.v.v.v.v.v.v.v.c.v.c.c.v.v.v.B.v.v.v.v.v.B.m.B.B.m.v.m.m.C.C.Z.B.Z.N.Z.Z.).).A.).).(.N.).).Q.).).).).`.).`.`.).`.`.`.OX'.OX`.$X$X$X$X;X;X>X;X;X:X:X:X1X>X>X,X>X2X3X3X3X8X8X8X8X6X3X9X8X9X8X3X8X3X3X8X3X8X2X3X2X3X6X3X3X3X3X6X3X3X6X6X6X6X6X8X8X8X8X8X",
+":X;X>X;X;X;X|.;X;X;X;X;X;X;X;X;X`.;X$X;X$X;X;X;X;X;X;X>X,X3X3X3X3X3X3X2X3X3X3X:X1X;X;X:X%X;X;X;X;X$X$X`.`.$XOX`.OXQ.`.).N.m.v.m.v.v.v.v.v.c.v.v.v.v.c.v.v.v.v.v.v.c.v.v.v.v.v.v.v.v.B.v.m.m.m.m.m.C.C.Z.N.Z.Z.).N.A.Q.).N.Q.).).).Z.).Z.).).S.Q.`.).S.`.%X$XOXOX$XOX$X$X$X$X;X;X;X%X%X;X:X>X,X:X2X2X3X2X3X3X6X3X3X3X8X8X7X8X8X5X8X8X8X8X8X3X8X3X3X7X3X3X6X3X3X6X6X3X6X6X6X6X6XwX8X8X8X8X7X8X",
+";X:X;X;X>X;X;X;X;X;X;X;X;X;X;X%X;X;X$X;X;X;X;X;X;X:X;X:X2X2X3X3X6X6X3X3X3X3X,X3X>X;X>X;X:X%X;X;X;X`.$X$X$X`.`.`.OX`.).).N.C.v.v.v.x.v.v.c.v.v.c.v.v.v.v.v.v.c.v.v.c.B.v.v.c.v.B.m.m.B.B.v.m.m.m.m.C.C.C.N.N.Z.Z.).N.N.).Q.).).N.).).).Z.).).).Z.).).OX`.`.`.%X`.$X`.$X$X$X$X=X;X;X;X;X;X;X>X,X,X2X,X1X2X2X3X3X8X5X9X8X7X7X3X8X8X8X8X8X3X8X3X8X3X3X3X6X3X6X7X3X3X6X6X6X6X3X7X6X8X8X3X8X8X8X8X",
+":X:X>X;X:X;X$X;X;X;X;X;X;X%X;X;X;X$X;X$X$X;X$X;X;X:X;X:X2X2X3X3X3X3X6X6X3X3X3X,X,X,X,X;X:X:X;X;X;X$X$X`.$X$X%X$X`.`.).).N.C.C.v.v.v.v.x.v.c.v.v.c.v.v.v.v.c.v.v.v.v.c.B.v.v.v.v.v.m.B.B.m.m.v.m.v.C.C.C.m.Z.N.).).Z.(.).N.).Q.).).).).).).).).).).`.OX`.`.OX`.`.$X'.$X$X$X$XOX$X;X$X;X;X;X>X>X:X,X2X3X2X3X3X3X8X7X8X6X9X8X8X8X8X8X8X8X8X3X8X3X8X8X3X6X6X2X3X6X6X3X6X6X3X8X6X6X9X8X8X8X8X7X7X",
+":X:X:X:X;X%X;X;X;X;X;X;X;X;X;X`.$X;X;X$X;X$X;X;X;X;X,X,X2X1X3X3X3X3X3X3X3X3X3X3X2X2X>X;X;X;X;XOX;X$X$X$X$X`.$X`.OXOX`.Z.N.C.v.v.B.c.n.v.x.n.v.v.B.v.B.B.v.v.v.v.B.v.c.v.v.v.v.v.m.v.m.B.m.m.C.m.C.m.C.C.N.N.Z.N.Z.N.).N.).).N.).).).).Z.).).).).S.'.OX`.`.`.`.`.OX`.$X$X$X$X$X$X;X$X$X;X$X>X>X1X2X3X2X2X3X3X3X3X3X7X7X9X7X3X8X3X8X8X8X3X8X3X8X3X3X8X6X3X6X6X6X6X8X6X8X3X8X3X7X5X8X8X8X8X8X6X",
+";X;X%X;X;X;X;X;X|.;X;X;X;X;X;XI.T.a.y.q.q.q.9.9.q.9.9.9.9.9.9.9.9.9.w.9.q.w.q.9.q.q.9.9.9.9.9.9.9.9.q.9.r.$.*.k.`.`.`.).Z.C.v.v.c.c.v.x.v.c.v.c.B.v.B.c.v.v.v.v.v.c.B.v.c.v.v.v.v.v.m.B.m.N.v.m.C.C.C.N.N.Z.Z.N.Z.).).).).).).).).`.S.Q.).).).).).`.).`.`.`.`.%X`.$X`.$X$X$X$X$X$X$X$X$X;X;X;X,X,X3X3X3X3X8X8X3X7X3X3X5X3X8X8X8X8X3X8X8X3X8X3X8X8X3X6X6X2X2X6X6X3X8X8X8X8X9X8X8X8X3X8X8X8X9X",
+";X;X;X;X;X;X;X;X;X;X;X;X;X;X;XR.p.u.w.9.9.9.q.9.9.9.9.q.9.9.9.9.q.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.0.6.5.e.%.s.`.`.).).N.v.v.v.c.B.c.B.c.v.v.v.v.v.B.v.v.v.v.v.x.v.B.v.v.v.v.v.m.v.v.m.m.m.C.m.C.Z.V.N.N.Z.Z.).).N.Q.N.).Z.).).).).).).).).).).).`.).`.`.`.OXOXOX;X'.`.`.;X$X$X$X$X$X$X;X;X;X>X*X3X3X4X3X3X3X8X6X8X6X8X6X6X6X8X3X8X8X3X8X8X6X6X6X6X3X8X3X3X3X8X3X8XwX3XwXwX3X8X8X8X8X8X8X8X",
+";X;X;X;X$X;X%X$X$X$X|.;X;X;X;Xa.i.8.q.9.7.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.7.9.9.7.9.9.9.7.7.6.1.4.:.`.).).N.Z.v.v.v.c.c.B.c.B.B.v.v.B.v.v.B.v.c.v.c.n.c.x.v.x.B.B.v.v.v.C.m.V.B.C.C.Z.Z.Z.N.Z.N.Z.Z.).`.S.).).).Q.N.).).Q.Z.).`.).).).).`.`.).`.`.`.`.%X`.%X`.`.`.$X$X$X$X$X$X;X;X>X3X8X3X3X3X8X3X3X6X3X6X3X6X6X6X5X6X3X6X8X3X3X8X3X6X3X3X3X8X8X8XwX8X8X3X6XwX3X8X8X8X8X8X8X8X8X",
+";X;X;X;X;X;X%X$X`.=X;X`.$X;X;Xt.0.9.9.7.5.7.7.7.5.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.6.6.5.2.,.@.X.`.).).Z.C.v.v.v.B.B.c.B.c.v.v.c.B.B.v.v.v.v.v.v.c.v.v.v.B.B.v.v.v.m.m.m.C.m.C.N.N.Z.Z.Z.Z.Z.Z.).Z.).).).).Z.).).).).S.`.).S.`.).+X`.).`.).`.`.%X$X%XOX$X%X$XOX%X$XOX$X$X;X;X:X>X3X3X3X8X8X3X3X8X6X3X3X8X6X6X6X6X3X6X6X3X6X6X3X6X3X6X3X6X3X3X8X3X8X6X8X8X8X8X8X8X8X8X8X9X9X8X",
+";X;X;X;X;X'.;X$X$X`.;X$X`.;X;X9.9.7.7.5.5.5.2.2.2.2.5.2.5.2.2.2.2.2.2.2.2.2.5.2.5.2.5.2.2.5.2.2.2.5.5.2.,...} 5 `.N.N.Z.m.v.v.v.c.B.B.c.B.v.v.B.B.v.v.v.v.v.v.v.B.v.v.v.c.B.c.n.v.N.v.m.C.C.m.N.Z.N.Z.Q.N.).Z.).).).).).).).).).).).).`.).).).).`.).).S.).).`.`.`.$XOXOX$X'.$X`.$X$X$X;X;X:X;X>X3X3X3X3X8X3X3X3X8X3X8X*X6X6X6X3X6X6X6X6X6X3X6X6X6X6X6X8X3X8X3X8X8X8X6X8X8X8X8X8X8X8X8X8X8X9X",
+";X;X;X;X;X$X$X$X$X$X/.$X;X/.;X5.7.7.7.2.2.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.5.2.2.2.5.2.2.5.,.>.| ] 4 Z.N.N.C.B.b.c.c.c.c.B.c.c.v.B.v.v.v.v.v.v.v.v.v.B.v.v.v.B.v.B.n.v.v.N.m.C.C.N.N.Z.Z.(.N.).N.).Z.).).).).).).).).S.`.).).).).).).OX).).`.OX`.`.`.`.`.$X$X$X$X$XOX$X$X`.;X;X;X:X,X3X3X3X3X3X8X3X3X3X3X8X3X6X5X8X6X6X3X6X3X3X3X6X6X6X6X6X*X5X6X6X6X6X8X9X3X8X3X8X9X8X8X8X8X8X9X",
+";X;X;X;X;X;X$X$X$X$X`.OX`.;X`.7.5.2.2.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.1...} 5 2 N.Z.m.v.c.c.c.c.c.c.c.B.c.B.v.v.v.v.v.v.v.v.c.v.B.C.B.v.B.v.B.B.Z.v.C.C.C.Z.N.N.Z.).).).).Z.).Q.).).).).).).N.`.`.`.`.`.`.`.).`.`.`.OX`.OX%X`.+X$X$XOX$X$X$X$X$X$X$X;X$X;X;X:X2X3X,X3X3X3X8X6X6X8X3X3X8X6XwX3X8X6X6X6X6X6X6X6X3X6X6X6X6XwX6X6X6X6X3XwX8X8XwX8X8X9X8X9X9X9X9X",
+";X;X;X;X;X$X$X$X$X$X{.OX`.`.$X5.5.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1...{ 5 2 m.m.m.c.c.c.c.c.c.c.c.c.c.v.v.x.v.c.v.v.v.v.v.v.B.v.B.B.v.C.B.B.v.Z.C.N.Z.N.N.(.).Z.Z.).).).).).).).Z.).).).`.`.`.).`.).`.).`.`.`.`.`.`.`.$X`.OXXX`.$X$X$X$X$X$X$X;X;X;X;X;X;X2X3X,X3X3X3X3X8X3X3X8X8X3X6X*XwX*X3X6X5X6X6X3X6X3X6X5X6X6X5X8X6X6X8X6X9X8X8X8X9X9X8XwX8X9X9X9X",
+";X$X;X;X$X$X$X$X$X$X$X%X$X$X`.5.5.7.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1...{ 5 2 v.v.v.c.x.c.c.c.x.c.c.c.c.c.v.v.v.c.v.v.c.v.v.m.v.m.C.B.n.B.B.C.Z.v.Z.Z.Z.N.N.).Z.).Z.).A.).).).).).`.).).).`.`.`.`.`.`.).`.`.).`.).$X`.OX`.$X$X$X$X$X$X$X$X$X$X$X%X;X;X;X:X:X;X,X3X3X3X3X3X3X3X8XwX3X3X6X6X6X6X3X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X3XwX3X8X8X8X8X8X9X9X9X9X9X8X",
+";X$X$X;X;X`.$X$X$X$X$XOXOX`.`.5.5.7.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.1...{ 5 2 c.c.c.c.c.c.c.c.c.c.B.c.c.c.B.B.v.c.v.v.v.v.v.v.C.v.C.m.m.m.B.N.m.N.Z.Z.).N.).N.).).).).).).).).).).).`.`.`.OX`.`.OXOX`.`.`.`.`.`.`.$X`.%X`.$X$XOX$X$X$X$X$X$X%X;X;X;X;X>X;X:X>X,X,X3X2X3X3X3X8X3X6X8X6X6X6X6X6X8X6X6X5X6X6X3X6X6X6X6X6X6X6X6X6X3X6X6X8X6X8XwX8X8X8XwXwXwX7X",
+"%X;X|.;X$X;X;X`.$X$X$X$X$XOX`.5.5.7.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1...{ 5 2 c.x.c.c.z.c.c.c.c.c.c.c.v.x.v.x.c.v.x.v.v.v.v.v.v.m.v.C.N.B.Z.m.N.N.m.Z.N.N.N.).Z.).).OXOXOXQ.`.).`.S.`.).).OXOX`.`.$X`.OXOX`.`.`.`.`.OX`.OX$X$X$X$X$X;X;X%X;X$X%X%X>X;X,X;X>X>X,X,X2X3X3X3X3X3X6X6X6X8X6X6X6X6X6X6X6X8X6X3X6X6X6X3X6X6X6X6X6X6X6X8X6X8X8X8X8X8XwX8XwX8XwX7X",
+";X;X$X%X%X$X$X`.;X'.`.%X$X$X`.5.5.7.5.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1...{ 5 2 z.z.x.x.c.c.c.c.B.c.B.v.v.v.v.v.B.B.B.v.v.v.v.c @ w % / B.V.V.( q @ w N N.Q.Z._.M.s # y q @ G +X'.Q.).).Z s q y q i y u & c h.|._.'.V s 0 u q f w i Z D.;XXX;X;X:X%X,X;X:X:X:X;X,X>X,X3X3X3X3X6XwX3X8X3X6X6X6X6X6X6X6X6X3X8X8X3X6X6X6X6X6X6X6X6X6X6X6X8X8X8X8X8X7XwXwX7X9X9X",
+";X;X;X;X;X$X$X$X`.%X`.OX$X`.|.5.7.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.1...{ 5 2 x.x.x.x.x.c.c.c.c.c.c.c.v.x.v.v.c.c.B.n.v.v.v.c u @ @ W C.C.V./ u y q N N.).Z.+Xj.s s . u $ r `.+X/.`.).M X @ p & $ u y $ f e W &XOXC X q $ @ @ # p @ e H ;X>X;X;X>X;X1X;X%X:X;X,X;X,X>X3X3X3X3X*X8X3X8X6X6X6X6X6X3X6X6X3X8X3X8X6X6X6X6X6X5X6X6X6X6X6X6X8X8X8XwXwXwX7XwXwX9X",
+";X;X;X;X;X;X$X$X$X%X|.%X$X`.|.7.5.7.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1...{ 5 2 z.x.x.x.c.c.c.v.c.B.c.B.v.v.v.v.B.B.B.v.v.B.v.c u u i d.N.V.A./ w y @ N N.Z.Z.Q.P X & . u + u ( `.`.`.`.N % u O d e   e u + w v oX$XN u i + e e e $ p X e F.;X;X,X;X%X:X:X:X:X>X:X:X,X,X3X3X3X3X3XwX3X6X6X8X6X6X6X6X3X6X6X3X3X8X6X6X6X6X6X6X6X6X6X6X6X8X8X8X8X8X7XwX9XwX9X9X",
+";X;X`.$X$X`.$X$X$X$X|.OXoX`.`.5.7.5.7.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1. .{ 5 2 z.x.x.x.c.c.c.c.x.B.B.B.v.v.x.v.B.B.B.n.v.B.v.c u u @ ( m.N.Z.h.w s # N N.).Z.M.z w @ m w u u L `.`.`.`.M u s @ ` `.;Xh.$ u u % =X*XM u y $ D..X!.D @ p @ n }.&X%X;X;X:X%X:X;X;X>X:X2X2X5X3X3X3X3X3X3X6X3X5X6X6X6X6X8X3X3X8X3X8X6XwX6X6X6X6X6X6X6X6X8X8X8X8X8XwXwXwXeX7X9X9X",
+";X;X;X;X|.;X$X$X`.$X;X$X$X`.`.5.7.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,...{ 5 2 z.x.x.c.c.c.c.v.B.c.B.c.v.v.v.v.B.c.B.B.v.B.v.c s u @ F R P E D w & $ b S.).).j.s w @ E Z i u   W.`.OXOXM @ w w H.&X;X^.s q i g ;XOXJ + u u J.$X@XoXw u $ 0 -X$X$X.X:X;X:X:X,X;X:X2X>X2X1X3X3X3X3X3X3XwX6X6X6X6X6XwX6X6X8X5X9X8X6X6X6XwX6X6X6X6X8X6X8X8XwXwXwXwXwXwXeXeX0X9X",
+";X;X$X;X;X`.;X%X%X$X;XOXoX$X|.7.5.7.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,...{ 5 3 c.x.c.c.c.c.c.c.c.B.B.B.c.B.B.B.v.B.B.B.C.B.n.m u @ w r @ + @ w q u $ b M.).).U $ s w H.E u y w ^ `.;X$XM w w u I U I k u . w S -X;XM u u X H.;X%X>XM @ u 0 P.$X$X;X;X:X;X:X;X;X;X:X>X>X3X3X3X3X3X3X6X*X6X6X6X6X6X6XwX6X8X8X8X8X6XwX6X6XwX6X6XwX8X8X8X8X8X8X8XwX7XeXeX9XeX9X",
+";X:X;X;X$X;X$X;X$X;X|.%X$X$X`.5.7.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,...} 5 2 z.c.c.c.c.v.c.V.v.v.B.B.m.C.m.C.m.v.v.m.v.m.N.c @ u y w u $ # i q $ # M N._.N.k + @ i /.~.u u @ N $XXX`.M @ w y s @ u X @ s M [.;X$XM u i @ J.1X%X<XN @ i w K.;X:X;X;X;X;X;X%X;X;X<X>X2X2X3X3X2X3X3X3X3X8X3X6X6X6X6X7X6X8X8X8X8X8X9X3XwX3X8X9X3X8X8X7X7X9X9X9X9X0X0X0XqX0X9X",
+":X;X;X%X;X;X;X`.$X;X;X%XOXOX;X5.7.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,...} 5 2 z.c.c.V.c.c.v.c.v.v.m.m.m.v.v.v.v.N.v.m.m.C.v.v @ @ y n m c b k w % @ n S.(.n.w q @ h T Y j u w e /.@X$XC s u y s u q u % Q ;X%X,X1XN @ @ e P.,X%X:XN s u @ Y.;X%X%X$X;X;X;X;X;X;X>X>X3X2X3X3X3X3X3X8X3X3X6X6X6X6X8X8X6X8X8X8X6X3X3XwX3X9X8X8X8X8X8X8X9X8X9X9X9X7X7X0XqX0X0X",
+";X;X;X;X;X$X;X;X;X;X;X$X$X`.`.5.5.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1...{ 5 2 v.v.c.c.v.v.v.v.v.B.m.m.m.B.m.m.m.v.m.v.N.B.N.c u y # g.N.N.Z.h.q i u c /.N.I @ w @ s @ @ u i y 0 ~ ).%XC @ q y H.J.q i y w f.-X<X%XZ u + e P.:X,X;Xs u y 0 }.&X%X|.;X;X;X;X;X;X>X;X3X>X,X3X,X3X3X3X3X6X8X3X8X6X7X7X7X7X3X6X6X8X9X8X8X8X8X8X8X8X9X8X8X9X9X9X0X9X0X7X0X7X0X0X",
+";X;X;X;X;X;X$X$X;X`.;X`.=X`.;X6.7.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1...{ 5 2 v.v.b.V.v.v.v.v.B.B.m.B.N.B.C.v.m.Z.v.N.(.B.N.b u 0 e g.N.).Z.h.w w w B `.Q.l w u f y w w X $ $ @ m %X`.V s q u G.;XQ X $ a r {.*X:XN t u e K.1X{.H i p + M }.OX$X:X;X$X$X;X;X>X;X>X,X,X3X3X2X3X3X6X3X3X6X6X6X8X8X3X6X6X6X7X6X9X8X8XwX3X8X8X8X8X8X8X9X7X9X7X7X0X7XqX7X0X0X9X",
+"<X;X;X;X;X;X;X;X;X;X;X%X$X$X$X5.5.5.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,...{ 5 2 m.v.m.m.v.m.m.m.B.b.Z.B.C.C.m.C.m.m.V.b.Z.V.m.M p $ p h.).(._.h.@ p 0 M M.J.r q q w C Z b M s p @ w ~.%Xn s @ . !..X=Xl s X p Q ,X:XZ @ p # u e w y f q e ` ;X,X,X$X$X;X;X;X;X>X:X:X2X,X,X,X3X2X3X3X6X6X6X3X6X6X3X9X9X7X6X7X6X6X3X8X8X8X8X9X8X8X9X8X9X9X9X9X9X7X0X0X7XqX0X9X",
+"1X:X>X;X>X;X;X;X;X$X;X%XoX$X`.7.7.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,...{ 5 2 m.m.m.m.m.m.m.m.Z.B.Z.Z.N.m.m.m.m.m.N.v.C.).E.c $ & i h.N.Q.).d.0 u e Z Q.H u + s G XXOX$X/.G 0 y i E =XN w u u F.$X=XD.s # y 0 U.3XZ e # # u e p y @ r G 1X1X$X;X&X;X;X;X;X;X;X,X,X,X3X3X3X3X2X3X3X6X3X6X6X6X6X8X5X6X6X6X6X7X8XwX8X8X8X8X8X8X9X8X9X9X8X7X9X9X7X0X0X7X0X0X9X",
+">X1X>X;X;X%X;X;X;X$X;X$X$X$X;X2.7.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,...{ 5 2 N.C.C.m.Z.m.B.B.Z.B.B.Z.C.m.m.m.m.m.C.b.N.N.N.A e o s ( M.).).W u % % m ^.x $ u u _ |.'.:X1X! t X @ b ^.A u w q Y.<X1X<Xm p w 0 L -XC i + i q 0 w h K L.<X,X$X3X:X;X;X:X;X;X,X,X:X2X3X1X3X3X3X3X3X3X6X6X3X6X8X6X6X6X6X6X6X6X8X8X8X8X8X8X8X9X8X8X8X9X8X9X9X9X9X9X9X0X0X9X0X9X",
+",X,X;X>X;X>X;X;X;X;X$X%X=X$X$X7.5.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,...{ 5 , N.N.m.m.N.N.N.Z.N.Z.C.m.C.C.C.C.C.m.(.N.Q.N.Z.M.!./.M.+X+XOX_.S./.`.).%X+XQ.$XoX'.OX;X'.).$X$X$X;X;XXX*XoX<X>X=X%X#X*X*X>X=X2X-X,X,X3X<X<X>X>X,X3X1X-X>X,X%X;X>X;X:X;X2X;X;X<X,X2X,X,X3X3X3X3X3X6X3X6X3X6X6X3X8X6X3X6X3X6X6X8X8X9X8X8X8X8X9X9X9X9X8X9X9X0X7X9X9X0XqX7X9X9X9X",
+",X>X;X:X;X:X;X;X;X$X;X`.$X$X;X5.7.5.5.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1...{ 5 2 Z.Z.N.N.N.Z.Z.Z.N.Z.Z.N.Z.Z.N.m.C.m.N.b.N.N.V.N.Q.Z.).A.).`.(.S.Q.'.Q.OX%X%X`.$X$X$XoX$X;XOX$X&X%X X<X X;X6X.X<X.X,X1X,X3X:X1X1X2X1X,X,X3X,X,X4X3X:X3X,X5X3X;X;X,X:X,X,X2X:X:X2X,X3X3X3X3X6X3X3X6X6X6X6X8X8X3X3X3X3X8X3X8X8X3X8X8X9X9X9X9X9X9X8X8X9X9XwXwX9X9X9X9X0X7X9X9X0X",
+">X>X1X:X;X:X;X;X;X;X;X$X$X$X$X5.7.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,...{ 5 2 Z.N.N.S.Z.N.Z.Z.N.Z.b.Z.Z.b.N.N.N.N._.m.N.`.Z.Q.$X_.S._.)./.OXQ.S.'.$X$X).%X$X$X;X$X%X$X;X$X=X;X;X;X;X:X:X:XOX4X1X;X:X,X,X,X2X,X,X3X3X3X3X3X2X2X3X1X,X1X,X3X>X;X,X:X,X1X:X:X2X2X2X3X3X3X3X3X3X6X3X6X6X6X3X6X8X3X3X3X3X3X6X8X8X8X8X9X9X8X9X9X9X9X8X9X9XwXwX9X9X9X9X0X0X9XwX7X",
+"1X>X<X>X;X;X>X;X;X;X`.$X$X=X$X5.5.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1...{ 5 2 Z.A.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.N.N.N.N.).N.).).).S.`.).).`.`.`.OX`./.`.`.$X;X`.;X$X;X$X;X$X;X;X;X;X;X%X;X:X,X<X1X:X2X,X,X,X,X3X3X3X3X,X,X2X,X2X2X,X1X2X1X2X1X2X3X1X,X,X3X3X3X2X3X3X3X,X3X6X2X6X3X6X6X2X6X3X6X3X6X6X3X8X3X8X8X8X8X9X9X9X9X9X9X0XwXeX9X9X9X9X9XqX0X7X9X9X9X7X",
+";X,X;X>X;X>X;X:X;X;X;X'.;X;X`.5.7.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.5.2.2.2.2.2.2.2.1.1...{ 5 2 N.Z.Z.Z.Z.Z.A.Z.Z.m.Z.Z.Z.N.).Z.).N.Q.).Q.).).).).Q.).`.).`.`.OX`.`.$X$X$X$X$X;X;X;X$X;X$X;X;X;X;X:X:X:X,X%X>X>X1X:X,X2X,X2X3X3X3X3X3X5X3X,X2X,X,X2X2X1X3X1X2X2X3X3X3X,X3X3X3X2X3X1X3X1X2X3X6X6X3X6X6X6X6X6X6X6X3X8X8X3X8X3X8X8X8X8X9X8XwX9X9X0X9X9XqXeXeXqXeX9X0X0X9X0X9X0X",
+"2X>X;X,X>X;X,X:X;X;X;X%XoX$X$X5.5.5.5.5.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.,...{ 5 2 N.).N.Z.N.).N.N.N.Z.A.N.).Z.).).Z.).).Z.).Q.).).).`.S.Q.S.`.`.`.`.`.$X$X$X%X$X;X;X$X;X;X;X;X%X,X;X%X>X%X>X>X1X;X,X:X2X2X1X3X3X3X3X3X1X3X3X3X3X,X1X2X3X,X2X1X3X1X3X1X3X3X3X3X6X6X3X3X6X3X3X6X2X6X8X6X6X6X6X6X6X6X6X6X6X6X8X7X3X9X8X9X9X9XeX9X9X9X0XeX9XwXqXeX0X0XeX0X9X7X7XwX",
+":X1X:X>X,X;X>X%X%X;X;X%X;X;X$X5.7.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.,...[ 5 2 Q.).Z.).N.).N.).N.Q.N.N.A.Q.Z.).).).).).S._.).).`.`.`.`.`.`.`.`.$X$X$X$X%X;X;X$X;X;X:X;X;X%X:X:X:X:X;X;X>X;X;X:X,X>X1X3X3X3X3X6X3X3X3X3X3X3X,X3X3X3X3X3X3X3X3X3X3X3X3X2X3X3X3X3X3X8X3X3X3X3X6X6X6X6X7X3X6X6X3X7X3X6X6X7X3X9X7X9X9X8X9X9X9X9X9XqXeX9XeXeXeXeXeXeX7XeX0X0XeXeX",
+",X>X2X:X;X>X;X:X:X%X;X%X;X;X%X5.5.7.5.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.1...{ 5 2 ).N.).N.).N.N.N.).N.N.).Z.).).).).).).`.`.).).`.`.`.`.`.`.`.OXOX`.$XOX|.|.$X;X;X;X;X;X;X,X:X:X:X:X:X:X>X:X;X2X,X,X2X2X2X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X2X3X3X3X3X3X3X3X3X3X6X3X8X3X6X3X3X6X6X6X6X6X7X6X6X6X7X8X8X3X8X6X6X7X8X8X8X9X9X9X9X9X9X9XeXeXeXwXeXeXwXeX0X0X7X7XeX",
+":X1X,X;X>X>X1X:X:X:X;X;X$X;X%X5.5.5.5.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.,...{ 5 2 ).).).).N.).Q.).N.).Q.).).).OXQ.).`.`.`.S.`.).`.`.).`.`.`.`.$X$X`.`.;X`.;X;X;X;X;X;X>X;X;X2X:X;X:X:X;X1X1X>X2X,X,X1X2X3X2X6X3X3X3X3X3X3X1X3X3X3X1X3X3X3X,X3X3X3X3X3X3X3X3X3X3X3X5X8X3X3X6X3X6X6X6X6X7X8X8X8X6X6X6X8X7X7X8X8X8X8X8X8X8X8X9X9X9X0X9X0XwXeXeXeXeXeXqX0X0X0X0XeX",
+":X<X,X,X;X;X>X:X;X;X;X%X;X`.%X6.5.6.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.1.2.2.2.2.,...{ 5 2 Z.A.Q.).).Z.).Z.).N.`.).`.).OX`.`.`.OX`.OX`.`.`.`.`.`.%X`.`.$X`.$X$X;X`.;X$X;X;X;X;X>X;X;X,X>X:X,X:X:X:X,X,X,X3X2X2X3X3X2X2X3X2X2X3X3X3X6X6X2X2X3X3X3X3X3X3X3X3X1X3X3X8X3X6X6X6X6X3X3X6X6X3X6X6X8X6X6X8X8X3X8X8X8X8X8X8X8X8X9X8X8X8X8X9X8X9X9X9X9XeXeXeXeXeXeXeXeXeXeX7XeXeX",
+":X,X<X;X>X,X>X%X;X;X'.;X;X|.`.6.6.5.5.2.2.2.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.,. .[ 4 2 ).A.Q.S.).).).).).).).).`.OX`.`.`.OXOXOX%X`.`.`.`.`.OX`.`.OX$X$X$X$X;X;X;X;X;X;X;X>X;X:X>X;X,X:X:X%X3X,X3X3X,X3X3X3X3X3X2X6X6X2X3X2X3X3X6X2X3X2X3X3X3X3X3X3X3X3X3X3X3X3X3X6X6X3X6X6X6X6X6X6X7X7X9X8X8X8X8X8X8X8X8X9X8X8X8X9X8X9X8X8X8X9X9X9X9X9X0XeXeXeX7XeX7XeXeXeXqXeX7XwX",
+">X>X;X,X;X>X,X;X;X%X%X$X=X$X/.2.5.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.1.1.,.| ' 3 - `.Q.Q.).).).).`.).).).OX`.`.`.$XOX$X%X`.OX'.`.`.`.`.$XOX%X$X$X$X$X$X;X;X;X;X;X;X;X>X,X;X,X;X:X,X>X2X2X3X3X3X3X3X3X3X3X3X3X3X3X3X3X6X2X3X3X6X3X3X3X3X3X3X3X3X3X3X3X3X3X8X6X3X8X9X6X6X6X8X8X8X8X8X6X8X8X8X8X8X8X9X9X8X9X9X9X9X9X9X8X8X8X9X9X9X9X9X0X0X9XeXeXeXeXeXeXeXqXeXwXeX",
+";X,X;X>X;X>X;X>X;X;X:X;X/.OX$X5.5.2.2.,.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>... .' 2 - = V._.).).).).Q.S.Q.).`.OX`.OX`.`.OX$XOX%X$XOX`.OX`.%X`.$XOX$X$X$X$X$X;X$X:X;X:X;X>X>X,X,X,X2X,X,X,X2X3X3X,X3X3X3X3X3X3X3X3X3X3X3X3X6X3X3X3X6X3X6X3X3X6X3X3X3X3X3X6X3X6X3X6X6X6X5X6X8X8X8X8X9X8X7X8X8X8X9X9X9X9X9X9X9X9X9X9XwX9X9X9X9X9X9X9X9X9XqX0X0XeXeXqXeXqXeXeX7XeXeXeXeX",
+";X>X>X;X>X;X;X;X;X;X`.`.$X%X+X1.,.>...| } { { { } } } } } } } } } } } { { { } } } } { } { { { { { { ] 4 , = * : `.oX`.).).).).).S.OX`.`.OXOXOX$X$X$X$X$X$X$XOX$X$X/.OXOX$X$X$X$X$X;X;X%X:X:X:X;X<X:X,X,X,X2X,X2X2X3X2X3X,X3X3X3X3X3X3X6X2X3X3X3X3X3X3X8X6X3X3X6X8X3X3X3X3X3X3X3X6X6X6X6X6X8X8X8X8X8X8X8X7X8X9X9X9X9X9X9X9X9X9X9X8X9XeX9XwX9X9X9X9X7X9X9X9X9X9X0X0X0X0XeXqXeXeXeXeXeXeXeXeXeX",
+",X>X;X;X;X>X;X$X`.;X;X|.$X$X+X<.+.} ] 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 , = = * > 1 S.).`.`.OX`.`.Q.`.`.`.`.OX'.$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X;X;X:X:X>X:X:X,X2X,X2X,X3X2X2X3X3X3X2X3X3X3X3X3X3X3X3X2X6X6X3X8X3X3X3X3X6X6X6X3X3X8X3X8X3X8X8X6X6X6X6X3X8X8X8X8X8X8X9X9X9X9X9X0X9XqX7X9X9X0XwX9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9XeX0X0XeXeXeXeXeXeXtXeXeXeX",
+";X>X;X>X;X;X;X$X$X;X%X$X=X`.%XO.o.6 2 , = = = = = = = = = = = = = = = = * = ; ; = = = = = = * = * * * - ; < 8 =.$XoXOX`.`.`.`.`.`.`.`.`.$X`.$X`.$X$X$X$X$X$X$X$X$X$X$X$X$X$X$XoX;X;X:X,X;X,X:X:X3X,X2X3X3X3X3X3X3X3X3X3X3X6X3X3X6X<X3X2X6X6X3X3X3X3X6X3X3X3X3X6X3X8X3X8X3X8X3X6X6X3X6X8X8X8X9X8X8X9X9X9X9X9X9X9XqX7X0X0X0X0XwXwXwX9X9X9X9X9X9X9X9X9X9X9X9X0X9X9X9X9X7XwXeXeXeXeXeXeXeXeXtXtX",
+">X;X;X;X;X;X;X;X;X$X`.$X;X$X/.s.&.7 ; = = = = = = = = = = = = = = = = = = = = ; = = - ; = = = = = = - * : 9 ;.l.OXS.OX`.`.`.`.`.`.`.`.OX$X$X$X$X$X$X$X$X$X`.$X$X$X$X$X$X$X$X;X$X;X;X;X;X2X2X:X2X:X,X3X3X6X3X3X3X7X3X3X3X3X6X3X6X2X6X3X6X3X3X3X6X3X3X3X3X6X6X3X6X8X3X8X3X8X8X8X3X6XwX8X8X8X8X9X8X9X9X9X9X0X0XqXqX9XqX0X0XeX9XeXwXwX9X9X9X9X0X0X9X9X9X0X9X9X9X9X9XeX7XeXwXeXeXqXqXtXeXtXeXtXtX",
+";X;X;X,X;X$X;X;X$X$X;X`.$X$X;X;X%X`.$X$XXXoXOX/.OX$XXX/.Q.Q.Q.$XXX$XoX$XoX$X$X$X;XoX;X;X;XoX$XoX$X;X<X$X;X{.oXoXoX/.$XOXOX$X$X$XOX$X%XOX$X;XOX$X$X$X$X;X$X$X$X$X$X$X%X;X%X;X$X;X;X:X;X,X,X,X,X3X3X,X3X3X3X3X3X8X3X8X3X3X8X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X8X8X3X8X8X8X8X8X3X8X8X8X8X8X8X9X8X9X9X9X0X9XeX9XeXeX0XqXrXwXrXwXeXqXwXeXeX9X9X0X0X9XwX9XeXwXeX9X9X9X9XeXeXwX9X0X0X0XqXqXrXrXeXrXtXrX",
+";X>X,X;X;X;X;X$X%X$X;X;X'.%X$X$X%X+X$X$X`.$X`.`.`.`.`.`.`.`.OXOX`.`.$X$X$X$X$X;X$X;X;X;X;X;X;X;X%X>X$X;X'.'.%X%X$X%X$X$X$XOX$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X$X&X%X$X%X%X$X;X;X$X%X:X>X;X:X,X,X,X,X3X3X3X3X3X3X6X3X8X8X3X3X8X8X3X8X8X3X3X3X8X3X3X3X3X8X3X3X3X4X8X8X8X8X8X8X8X8X8X3X8X8X8X9X9X9X9X0X9XeX9XeXeXtXqXrXrXeXrXrXeXeXeX0XeXqX9XeX0X9XqXeXeX9XwX9X9X9X9X9X9X0X0XeX9XeXeXeXeXeXrXtXrX",
+"%X,X$X%X$X;X;X$X$X;X`.;X`.;X;X$X$X$XOX$X$X$X$XXX$XOX`.OX`.`.`.`.`.$X$X$X$X$X`.;X;X;X;X;X%X;X;X;X;X$X;X;X;X;X$X;X$X$X$X$X$X|.;X;X&X;X$X,X$X%X$X$X$X$X$X$X$X$X%X;X;X;X;X;X;X;X;X;X;X>X:X:X1X,X,X3X3X,X3X3X3X8X8X8X3X8X3X*X8X6X6X4X3X3X3X3X3X8X3X3X8X3X3X3X6X6X9X6X3X8X8X8X8X8X3X8X8X8X9X8X9XwX9XqX0XqX9XeXeXeXqXtXtXtXtXtXrXeXeXeX0X0X0X0X9XqXwX9X9XeXwXwX9X0X9X9XqX9XqX9X9XeXeXeXrXrXrXtXrXrX",
+",X,X;X;X;X;X;X;X;X$X;X|.%X;X%X%X;X$X$X$XOX$X$X$X$XOXOX`.`.`.`.`.`.$X$XOX;X$X$X$X;X;X;X;X:X;X:X;X,X;X,X;X;X;X;X;X;X$X$X$X;X`.;X`.$X;X$X;X$X;X;X$X;X$X$XoX$X$X$X;X$X;X;X;X;X;X;X<X,X2X:X,X:X2X,X3X3X3X3X3X3X3X8X3X3XwX3X6X8X6X6X6X8X3X8X3X3X3X8X3X3X3X3X8X6X6X6X7X8X8X8X8X8X8X8X8X9X8X9X8X9XwX9X0X9XqXqXtXrXtXtXtXtXtXtXtXeXrXeXeXqX0X0X0X0X0XqX9XwX9XwXwX9X9X9XeX9XeX9X9XtXeXeXtXeXrXtXtXtXtX",
+";X;X;X;X;X;X;X;X;X`.;X;X$X;X%X$X$X$X$X$X$X$X$X$X$X$XoXOX$XOX$X$X$X$X;X$X$X;X$X;X;X;X;X>X,X;X;X,X;X>X,X%X:X;X;X%X;X$X$X;X`.;X;X;X;X;X;X$X;X$X;X$X$X;X$X$X;X;X$X;X;X;X%X;X>X;X>X;X;X1X>X,X,X3X,X3X3X3X3X3X3X3X3X8X8X3X8X6X6X6X6X6X3X3X8X3X3X8X3X3X3X6X3X6X6X6X6X7X8X8X8X8X8X8X8X9X8X8X9X8X9X9X9X0XwXrXrXrXrXrXtXtXtXtXtXqXrXqXrXqXrXqX0X0X0X0X0XeXwXqXwX9XqX9XeXeXeXwXeXeXeXtXeXtXeXeXtXtXtXtX",
+"%X;X;X;X;X;X;X;X;X;X$X;X;X;X;X%X%X$X$X$X$X$X$X$X/.`.$X$X$X$X$X/.$X;X'.%X;X;X;X;X;X%X;X>X>X,X:X,X%X>X,X,X:X:X:X;X;X;X;X`.|.;X;X`.;X;X;X;X;X;X;X;X;X;X;X;X;X$X;X;X;X;X;X;X:X>X;X:X2X:X:X2X,X,X3X3X6X3X6X3X3X8X3X3X*X6X8X6X6X6X6X6X8X3X3X8X3X8X3X8X6X3X6X6X6X6X6X6X8X8X8X8X8X8X8X8X9X9X9XwX9X9X0X0XwXwXrXrXrXrXtXtXtXqXqXtXrXrXrXrXrXqXqX0X0X0X0X9X9X9XeXeXeXwXeX0XwXeXeXeXeXeXeXeXtXtXtXeXrXrX",
+";X;X;X;X;X;X;X;X;X;X;X;X$X;X;X;X;X$X$X;X$X$XOX$XOX$X$X$X$X$X$X$X;X;X;X;X;X;X;X;X;X>X1X,X:X:X,X:X>X1X>X<X<X;X,X:X;X;X;X;X;X;X;X;X<X;X:X%X;X;X;X;X;X;X;X%X;X;X;X;X;X;X>X;X>X;X:X<X,X,X,X2X3X5X3X3X5X6X6X3X3X3X8X3X6X6X6X6X6X6X6X6X3X8X3X3X3X3X3X8X6X3X6X6X6X6X7X6X9X8X8X9X8X3X9X8X9X8X9X9X9X0XeXeXeXwXqXrXrXtXqXtXtXtXqXrXrXrXrXrXrXrXqXqXeX0XqX9XqXwXeX9XeXeX9XrXeXeXeXeXeXtXtXtXtXtXrXrXtXrX",
+";X:X;X;X;X;X;X;X<X;X;X:X;X;X$X;X$X$X$X$X$XOX$X$X$X$X$X$X$X$X;X;X$X;X%X;X;X;X;X:X>X,X>X>X2X2X2X,X>X>X,X;X,X;X,X;X;X;X$X;X$X;X;X;X;X;X:X:X:X:X%X:X:X;X;X;X;X;X;X;X:X:X,X;X,X,X>X,X,X,X3X2X3X3X3X6X3X3X6X8X3X3X8X3X6X6X6X8X*X6X6X3X8X3X8XwX8X3X8X3X6X6X6X6X6X6X6X7X3X8X8X8X8X9X8X9X8X9X9X9X9X9X9X9XeXeXeXrXrXqXtXtXtXtXtXtXtXtXtXrXtXrXqXtXrXeX0XqX0X0X9XeX0X0XeXeXeXeXtXeXeXeXtXtXtXtXrXrXrXtX",
+":X,X;X;X;X;X:X:X,X;X>X;X;X;X;X$X$X;X$X$X$X$X$X$X$X%X$X;X$X;X$X;X;X;X;X;X:X,X%X,X:X,X,X,X,X3X3X2X3X2X,X,X,X:X2X:X>X;X%X;X,X;X;X;X;X;X;X>X,X;X:X:X%X,X1X>X%X;X,X:X:X:X:X,X:X,X,X2X,X,X3X3X3X3X5X3X3X3X5X8X6X6X3X6X6X3X3X6X6X6X6X6X3X6X6X6X3X3XwX3X8X3X8X3X6X8X3X3X8X3X9X8X8X8X8X9X9X9X9X9X9X0XqX0X0XqX0XqXqXqXrXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXrXeXwX9XeXeXeXeXeXeXtXtXtXrXrXtXtXrXtXrXrXrXeXeX",
+":X;X;X;X;X:X;X:X;X,X>X>X;X;X;X;X;X;X$X$X$X`.$XOX%X$X;X;X;X;X;X;X;X;X:X:X:X,X,X,X:X1X,X,X,X,X3X3X3X3X1X3X2X3X:X:X;X>X,X,X%X;X>X;X;X>X;X;X;X>X>X;X;X;X;X>X>X;X>X;X:X:X3X,X:X3X,X,X2X3X3X3X1X3X8X3X3X3X3X3X6X3X3X6X6X8X8X3X8X3X6X3X6X6X6X3X3X3X3X8X8X8X8XwX6X8X3XwX8X8X8X9X8X8X9X9X9X9XqX9X9X0X9X0X0X0XeXqXqXqXrXtXtXtXtXtXtXtXtXtXtXtXtXtXqXrXwXwXeXqXeXeXeXeXeXeXtXtXtXtXrXtXtXtXrXrXrXrXeXeX",
+"<X,X:X:X<X2X:X,X>X:X;X;X;X;X;X;X;X`.|.$X;X`.;X;X%X;X;X:X;X:X;X;X;X;X;X,X:X,X,X3X2X2X3X2X3X3X3X3X3X3X3X,X3X,X2X,X2X1X;X1X>X,X>X>X,X:X>X;X1X;X:X;X>X;X;X;X,X;X1X,X,X3X,X3X3X3X,X3X3X3X3X3X3X3X3X3X3X3X3X3X3X3X6X6X3X3X6X6X3X8X3X6X6X6X6X6X6X6X6X6X3XwX4X3X8X8X3XwX8X8X8X8X8X9X8X9X9X9XeX9X9X0XqX0X0X0X0X0XeXeXqXtXrXqXrXrXtXtXtXtXtXtXtXtXrXrXeXrXeXeXeXeXeXeXqXtXtXtXtXtXtXtXtXrXrXeXrXrXeXeX",
+",X,X:X:X2X:X,X:X>X1X>X1X%X;X;X;X;X;X'.;X;X;X;X%X%X,X>X%X:X;X;X;X;X;X:X:X,X2X,X3X3X2X3X3X3X3X3X3X3X3X3X3X3X3X,X3X:X,X>X;X2X,X,X>X;X>X,X<X:X:X2X,X<X,X;X>X>X:X,X2X,X3X3X3X3X,X,X3X3X3X,X3X3X3X3X3X3X3X7X3X6X6X6X3X6X6X3X3X6X3X8X3X6X6X3X6X6X6X6X6X8X3XwX3X3X3X8XwX8X8X8X8X9X9X9X9X0X0X9XqXeXqX9X0XqXqX0XrXeXeXtXtXtXtXrXtXtXtXtXtXtXtXtXtXrXqXrXqXeXwXqXqXeXeXtXtXtXtXtXtXtXtXtXrXrXrXrXeXeXeX",
+"2X,X,X2X3X:X:X:X,X,X:X,X;X;X:X;X;X;X;X;X$X;X;X;X;X%X1X>X:X,X:X,X2X,X3X,X3X3X3X3X3X3X3X3X3X3X3X3X3X8X3X5X3X3X3X,X2X,X,X>X,X,X,X,X,X;X:X1X>X,X:X1X:X:X:X,X1X:X,X2X3X,X,X,X,X2X,X2X3X3X3X3X3X3X1X3X3X3X3X3X3X6X6X3X6X3X6X6X3X3X8X3X6X4X6X8X3X8X6X6X3X8X6X6X8X8X8X8X9X8X8X9X9X9X9XwX0X0X0X0XqXqXeXqXqXqXqXqXtXrXrXrXtXtXrXtXtXtXtXtXtXtXtXtXtXtXtXtXeXeXqXqXtXeXeXrXtXtXtXtXtXtXrXqXrXrXrXeXeXeX",
+"1X,X:X3X,X3X3X3X2X3X2X:X:X:X,X;X;X;X;X;X;X;X%X;X:X;X;X>X:X,X:X2X2X2X,X3X3X3X3X3X3X3X3X3X6X3X6X3X3X5X6X8X3X3X3X3X,X2X,X2X2X,X,X>X,X,X,X2X:X2X2X:X:X,X1X:X,X2X2X,X,X3X3X,X2X,X2X2X,X3X1X,X3X3X3X1X3X3X3X3X3X6X3X8X8X3X6X6X8X8X3X8X6X8X6X6X8X8X6X8X8X6X8X8X8X8X8X8X8X8X9X9X9X9XwXeX0X0X0X0XeXrXqXrXrXrXrXrXeXrXrXtXtXtXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXeXtXqXtXtXtXtXtXtXtXrXrXrXrXrXrXeXeX"
+};
diff --git a/images/checkbox3hilitechecked.xpm b/images/checkbox3hilitechecked.xpm
new file mode 100644 (file)
index 0000000..4a4caf4
--- /dev/null
@@ -0,0 +1,332 @@
+/* XPM */
+static char *checkbox_hilitechecked[] = {
+/* columns rows colors chars-per-pixel */
+"190 70 256 2",
+"   c #0A141B",
+".  c #0B1A1B",
+"X  c #0C1915",
+"o  c #121B1E",
+"O  c #0C1C2C",
+"+  c #0B1825",
+"@  c #111B27",
+"#  c #0E1E36",
+"$  c #0B221B",
+"%  c #0C2D19",
+"&  c #0A3318",
+"*  c #112816",
+"=  c #14391B",
+"-  c #13243A",
+";  c #102F34",
+":  c #142B43",
+">  c #182A43",
+",  c #192E4D",
+"<  c #132744",
+"1  c #182E52",
+"2  c #19334A",
+"3  c #1B3353",
+"4  c #1C355A",
+"5  c #1C395C",
+"6  c #163656",
+"7  c #0D2944",
+"8  c #1D3C63",
+"9  c #1D3D6B",
+"0  c #153F6F",
+"q  c #1E3F74",
+"w  c #213B5E",
+"e  c #203455",
+"r  c #223D65",
+"t  c #243D6B",
+"y  c #293E6C",
+"u  c #263A63",
+"i  c #273E70",
+"p  c #0D4A02",
+"a  c #0C4702",
+"s  c #0E4719",
+"d  c #0E5302",
+"f  c #114C08",
+"g  c #114819",
+"h  c #115805",
+"j  c #1A5716",
+"k  c #17453C",
+"l  c #104A21",
+"z  c #116302",
+"x  c #126A02",
+"c  c #166608",
+"v  c #157A02",
+"b  c #177607",
+"n  c #176416",
+"m  c #1C6A2B",
+"M  c #286A37",
+"N  c #2B7733",
+"B  c #247D1B",
+"V  c #194A44",
+"C  c #1C4057",
+"Z  c #1C5D42",
+"A  c #1D4265",
+"S  c #1C436B",
+"D  c #16436B",
+"F  c #1C4473",
+"G  c #1C4975",
+"H  c #264F59",
+"J  c #224165",
+"K  c #22426B",
+"L  c #23496B",
+"P  c #2A426C",
+"I  c #2D4B6E",
+"U  c #234271",
+"Y  c #2A4071",
+"T  c #2C4A71",
+"R  c #284778",
+"E  c #265278",
+"W  c #334C74",
+"Q  c #3D587B",
+"!  c #375379",
+"~  c #2E536E",
+"^  c #257344",
+"/  c #2B7249",
+"(  c #3F696C",
+")  c #435B7C",
+"_  c #254E82",
+"`  c #255788",
+"'  c #255989",
+"]  c #2B5585",
+"[  c #2B5A85",
+"{  c #2B5A8A",
+"}  c #265886",
+"|  c #325B8B",
+" . c #355986",
+".. c #2F5792",
+"X. c #2C6896",
+"o. c #336998",
+"O. c #2E6894",
+"+. c #3777A5",
+"@. c #3A7DB1",
+"#. c #2A74A6",
+"$. c #435D83",
+"%. c #4D698B",
+"&. c #496586",
+"*. c #526A8B",
+"=. c #5A7493",
+"-. c #506F8F",
+";. c #437CAA",
+":. c #637A97",
+">. c #6A7996",
+",. c #178502",
+"<. c #199403",
+"1. c #1A9803",
+"2. c #1D9508",
+"3. c #1CA603",
+"4. c #1EB103",
+"5. c #2E8C35",
+"6. c #21B307",
+"7. c #24AC0D",
+"8. c #2DA921",
+"9. c #3C9554",
+"0. c #358C4F",
+"q. c #329374",
+"w. c #21C403",
+"e. c #22CB03",
+"r. c #23D203",
+"t. c #25DA04",
+"y. c #28DB07",
+"u. c #2ADA0C",
+"i. c #28D50B",
+"p. c #2DDA11",
+"a. c #30DA16",
+"s. c #33DB1B",
+"d. c #2AC312",
+"f. c #36DA22",
+"g. c #39DA25",
+"h. c #3DDA2A",
+"j. c #3AD329",
+"k. c #3ED930",
+"l. c #27E304",
+"z. c #28E604",
+"x. c #28EA04",
+"c. c #2DE60C",
+"v. c #29F304",
+"b. c #2CF707",
+"n. c #37F416",
+"m. c #46B73F",
+"M. c #439A47",
+"N. c #44965C",
+"B. c #4B906C",
+"V. c #47AF50",
+"C. c #56B667",
+"Z. c #69BE78",
+"A. c #44D938",
+"S. c #40DB2E",
+"D. c #43F128",
+"F. c #4BD942",
+"G. c #4DD746",
+"H. c #54CA58",
+"J. c #54D452",
+"K. c #59D95B",
+"L. c #58D556",
+"P. c #4CC44C",
+"I. c #5ED663",
+"U. c #56F048",
+"Y. c #63D35C",
+"T. c #68C675",
+"R. c #71C879",
+"E. c #6BD375",
+"W. c #66E35E",
+"Q. c #3981AD",
+"!. c #3A82B3",
+"~. c #3988B8",
+"^. c #2F87BC",
+"/. c #3A9F9C",
+"(. c #2B8ECA",
+"). c #2A8FC7",
+"_. c #2D91CC",
+"`. c #3494CD",
+"'. c #359ACC",
+"]. c #3896CE",
+"[. c #3B99CE",
+"{. c #3C94C5",
+"}. c #3695D0",
+"|. c #3A96D0",
+" X c #3C99D0",
+".X c #389AD4",
+"XX c #3CA2D3",
+"oX c #4284AB",
+"OX c #4687B7",
+"+X c #4E8FB3",
+"@X c #71879C",
+"#X c #6D8A99",
+"$X c #6D84A3",
+"%X c #7589A3",
+"&X c #7B92AB",
+"*X c #6D90A6",
+"=X c #77B588",
+"-X c #7AB595",
+";X c #75A592",
+":X c #7FACA6",
+">X c #51B78D",
+",X c #439BCC",
+"<X c #4B9CCC",
+"1X c #4797C6",
+"2X c #439CD2",
+"3X c #439BD9",
+"4X c #489ED3",
+"5X c #489BD9",
+"6X c #539AC8",
+"7X c #529FD7",
+"8X c #44A1CD",
+"9X c #4BA1CC",
+"0X c #45A0D3",
+"qX c #4BA1D4",
+"wX c #4CA3D8",
+"eX c #47A8D9",
+"rX c #57A2CD",
+"tX c #52A4D6",
+"yX c #54A6D8",
+"uX c #56A8D6",
+"iX c #55A8D8",
+"pX c #59A4D4",
+"aX c #5BA4DA",
+"sX c #5AA9D6",
+"dX c #5BAAD9",
+"fX c #53B0D2",
+"gX c #62ADDB",
+"hX c #67AAD5",
+"jX c #66B0DC",
+"kX c #6BB2DD",
+"lX c #77AAD1",
+"zX c #70B5DE",
+"xX c #74B8DE",
+"cX c #6CA6CF",
+"vX c #6DB4E0",
+"bX c #72B6E0",
+"nX c #75B9E1",
+"mX c #78B9E1",
+"MX c #5AA0D6",
+"NX c #76C684",
+"BX c #78D08E",
+"VX c #859E9F",
+"CX c #8494AB",
+"ZX c #859AA8",
+"AX c #8D9BB3",
+"SX c #82AB9C",
+"DX c #87B992",
+"FX c #86A2A6",
+"GX c #96A7B9",
+"HX c #8CB3A8",
+"JX c #A0B0BE",
+"KX c #85ABCA",
+"LX c #97ADC7",
+"PX c #98B1C3",
+"IX c #89B1CE",
+"UX c #82C793",
+/* pixels */
+"tXqX7X9X9XqXqX4X9X4X4XqX4X4X4X4X4X2X4X2X2X2X2X2X2X,X X X2X[.[.[.[.[. X[.[.[.[.|.|.|.|.].|.|.|.|.].|.|.|.|.].[.,X[. X6X~.[.].|.|.].].|.].].].].}.}.}.[.'.].`.`.].`.].].|.`.|.].}.].}.].].].}.[.[.[.[.[.[.[. X2X2X,X2X2X2X4X4X4X4X4X4X0XqXqXqX4X4X4X4X4X4X2XqXqXqXwXwXqXtXtXtXqXtXyXyXyXyXyXuXiXiXsXsXdXdXiXdXdXdXdXsXdXdXdXdXdXdXdXdXaXdXdXdXdXdXaXdXdXdXgXgXdXgXdXgXgXgXdXgXgXgXgXgXgXjXgXjX",
+"tXtXtX4XtXqXqXqX4X4XqX4XqXqX4X4X2X4X2X2X2X2X2X2X2X2X2X2X2X[.[.,X X X2X[. X[.[.|.|.|.|.|.|.|.|.[.,X].2X|.|.|.|.|.3X6X$X#.[.|.|.|.].].|.`..X`.].].].'.}.}.].].`.`.|.].{.|.`.{.].].].].}.`.].[.|.|.|.}.[.[..X X X X2X2X3X2X4X2X4X4XqX4X4X5X2XqX4X4X4X4X4X4X4X2X0XqXqXqXtXqXtXqXtXtXtXtXtXyXyXyXuXiXsXiXsXiXdXsXdXdXsXuXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXgXdXdXdXgXsXdXdXdXgXgXgXgXgXgXgXjXgXjXjX",
+"tXtXqXtXwXqXqXqXqXqX9X4X4X4X4XqX4X4XqX4X2X2X2X2X2X2X,X2X2X2X2X2X2X2X2X2X2X2X X2X|.[. X X[.,X X,X,X|.[.|.,X|.,X[.lX&X&.+.[.].|.[.].`.].].].].].].].}.`.}.`.`.'.`.`.`.`.}.].].].].].`.}.}.`.].`.[.].}.[.|.[.[. X2X|.2X2X2X,X2X5X4X4XeX2X0X2XqX4X2X4X4X2X4XqX2X2XqXqXqX9XwXqXtXtXtXqXqXtXyXyXyXiXiXdXdXdXdXdXdXdXdXgXdXdXsXaXdXdXdXdXdXuXaXdXdXdXdXdXdXdXdXdXdXsXgXdXgXgXgXgXgXgXjXjXgXjXgXjXgX",
+"tXtXtXqXtXtXqXqXqX4XqXqXqXqX9XqX4X4X4X4X4XqX2X4X2X4X2X2X2X2X2X2X2XqX2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X3X2X2X2X2X5XlXFX>.G #.[.].].`.`.`.[.].].].`.].].`.`.`.`.`.].].}.`.`.}.].`.].`.`.|.'.}.[.`.].`.].}..X|.[. X.X[.2X[.2X2X,X2X4X2X4X4X0X4X2X4X4X4X2X4X2X4X2XqX2XqXqXqXqXwXqXwXtXqXuXwXyXyXpXuXyXiXdXdXdXdXgXdXdXgXdXdXdXgXgXdXdXdXdXdXdXdXdXaXdXdXdXaXdXdXgXdXgXdXdXgXdXgXgXgXgXjXgXgXjXjXgXgX",
+"7XtXtXqXtXwXtXqXqXqXqXqXqXqXqXqX0XwXqX0XqX5X5X4XqX2X2X2X4X4X2XqXqXqX2XqXqX4XqX2X4X4X4X4X4X4X2X2X2X2X4X2X3X,XlXLXCXQ A @.|.`.].|.[.`.].].`.].`.`.}.`.}.}.`.`.`.`.}.`.`.}.|.}.`.`.[.`.}.}.'.`.[.`.[.`.].|.[. X X2X|.2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X4X2X4XqX4X4X4X8X9XwXqXqXwXqXtXtXtXwXfXtXuXyXuXdXiXdXdXdXdXdXgXdXgXdXdXgXdXaXgXdXdXdXdXdXdXgXdXgXdXdXdXsXgXdXgXdXgXgXgXgXgXgXgXjXjXjXgXjXgX",
+"tXtXtXtXtX4XtXwXtXwXqXqXqXqXqXqX4XqX0X5XqX0XqX4X4XqXqXqX4X4XqXqXwXqXqXqXqXqXqXqX5XqX4X4X4X4XqX2X4X4X4X3X2XlXLXGX=.J 8 ~.|.].].}.].].].`.].`.`.`.`._.`.`.`.`.`.`.`.}.}.`.`.}.}.}.].].`.].`.].`.].`.].].|.|. X X X2X|.|.2X2X2X2X2X2X2X2X2X2X2X2X2X4X4X2X4X2XqX4XqXqXqXqXqXqXrXtXtXtXtXtXtXtXtXpXuXiXdXdXiXdXgXdXgXgXdXdXdXdXgXaXgXdXdXhXdXdXdXdXdXdXdXdXdXdXdXdXdXdXgXgXgXgXgXgXgXjXgXjXgXgXjX",
+"tXtXtXtXtXtXtX7XqXqXqXqXwX9XqXqXqX0XqXqXqX5XqXqXqXqXqXqXqXqXtXwXwXwXwXtXqXtXwXwXqXqXqXqX9XqX4XqX4X0X4XqXlXGXGX%XW 5 L {.|.|.].`.].`.].].`.`.`.`.`.`.`.`.`.`.`.`.`.}.`.}.`.`.`.}.].}.].`.[.`.].`.].[.|.|. X X X2X,X2X|.2X.X2X2X2X2X2X2X X2X2X2X2X2X4X2X4XqX0X4X4X2XwXqXqXqXqXqXtXqXtXqXtXuXuXtXpXiXdXdXvXdXdXdXgXdXgXdXdXgXdXgXaXgXdXsXdXdXgXdXdXdXdXdXdXdXdXdXgXdXdXgXgXgXgXgXgXjXjXjXjXjXgX",
+"tXqXwXtXtXtXtXqXtXtXtXwXwXtXtXqXqXqXqXqXqXqXwXqX9XqXwXqXtXtXwXpXyXyXpXtXtXtXtXtXtXtXtXqXwXqXqXqXqXqX2XhXIXJXAX=.A 6 E ].].|.`.`.`.].`.].].`.`.`._.`.}._._.`._.`.`.`.`.`.`.`.}.`.`.}.].].`.].`.[.].].|.|.[. X X X2X.X2X2X2X2X2X2X2X[.,X2X2X,X2X2X2X2X4X5X0XqX0X4X9XqXqXqXqXqXqXwXtXtXuXyXtXtXpXuXiXiXdXdXdXdXgXdXgXgXgXgXgXgXaXgXgXgXgXdXgXdXgXdXgXdXdXdXgXdXdXdXgXdXdXfXgXgXdXvXgXjXgXjXvXgX",
+"tXtXtXtXpXtXtXtXqXtXqXpXyXqXqXqXwX4XqXqXwXqX9XtXwXtXwXtXtXyXyXiXuXuXiXsXiXiXtXtXtXwXtXtXtXtXqXqXqX4XtXKXPXGX@X! 6 3 E {.[.].].].`.`.`.`.`.`.`.`.`.`._.`._.`._.`.}.`.}.`.`.`.`.}.}.}.].`.].].].`.].].}..X[.[. X2X2X2X.X2X|.3X2X,X X,X2X X2XXX2X2X2X2X3X4X4X4X4XqX4XqXqXqXqXqXtXpXtXtXwXtXpXtXpXiXdXdXdXdXdXdXjXdXdXgXgXjXgXgXjXgXjXgXgXdXdXgXdXgXgXgXgXsXsXsXgXdXdXgXgXgXiXgXgXgXgXjXjXjXkXgX",
+"tXtXtXtXuXqXqXqXtXtXtXtXqXyXuXtXtXwXqX9XqXqXtXtXtXtXtXpXtXiXiXiXsXuXsXsXiXiXiXyXyXtXtXwXqXtXwXqXqXqXIXGXAX&X*.y 1 , L [.[.].`.`.}.`.`.`.`.`.`.`.}._.`._.}._.`.`._.`._.`.`._.`.`.`.`.].].`.`.].].].].|.[.[.[. X.X2X X2X2X2X2X[.2X2X2X[.2X2X2X2X2X4X0X4XqX0XwX0X4X4XqXqXqXqXqXqXqXtXwXuXyXyXuXyXyXiXiXdXdXdXdXdXjXgXgXgXgXjXgXjXgXgXgXgXgXgXgXgXdXdXfXdXdXsXdXsXdXgXdXdXgXgXgXdXgXjXgXjXjXgXkX",
+"tXtXpXtXtXtXtXtXtXtXtXtXpXwXqXwX4XtXqXtXtXqXqXtXtXtXtXtXyXuXdXdXsXdXdXsXsXiXdXyXyXtXtXtXtXtXwX9X9XcXLXGXCX:. .4 2 2 L [.[.[.].].`.}.`.`.`.`.`.`.`.`.`._.`._._.`.`.`.`.`.`.`.`.`.}.].}.].].`.].].|.|.[.|. X X X X2X2X2X2X|.2X2X,X2X,X2X2X2X2X2X2X2X0X2X0XqX5XqX0XqXqX0XqXqXwXqXtXtXtXwXyXyXyXiXuXyXyXdXdXdXdXdXgXgXgXjXjXjXjXjXgXjXgXgXgXgXgXdXgXgXgXsXdXdXsXgXgXvXaXdXdXdXgXgXvXjXjXjXjXkXgX",
+"tXtXtXpXpXtXtXqXtXtXtXtXtXtXtXwXqXtXqXtXqXtXtXtXtXtXtXiXuXiXdXdXdXdXdXdXdXdXdXyXyXyXpXtXyXyXtXwXpXIXGXAX$X%.W 4 , : J {. X[.`.`.`.}.`.`.`.`._.`.`.`.`.`.`.`.`._._.`.}.`.`.`.`.`.].`.}.}.].].`.].|.|.[..X X X X2X.X X2X2X,X2X[.2X X2X X2X2X2X2X2X2X0X0X0X0XqX0XqX0XqXqXqXqXwXqXuXtXtXyXtXyXyXiXiXdXdXuXuXsXdXjXgXgXjXgXjXjXgXjXjXjXjXjXjXgXgXgXgXgXdXgXsXgXgXsXdXdXgXdXgXgXgXgXgXjXjXjXjXhXkX",
+"tXtXtXtXtXyXuXtXtXtXtXtXtXtXtXtXtXtXqXtXqXqXuXqXtXtXyXuXuXaXdXdXdXgXdXdXdXdXdXsXiXpXyXyXpXtXwX9XKXGXAX$X*.Q r 4 2 : C ~.[.[.}.`._.`.`.`.`.`._.`.`.`.`.`.`.`._.`._.}.}.`.`._.`.}.}.`.}..X}.].].].|.|.|.|.|.[. X X2X,X,X2X|.2X|.2X2X2X2X2X2X2X2X2X2X0X0X4XqXqXqX0X4XqXqXqXqXwXqXqXqXqXtXuXpXyXyXuXiXdXaXsXsXgXdXgXgXgXjXjXjXgXgXjXgXjXgXgXgXgXdXdXgXgXgXsXgXdXgXsXgXgXaXgXgXgXjXjXgXjXjXjXkXgX",
+"yXyXyXyXyXtXqXuXtXtXtXtXtXwXtXwXqXtXqXqXtXwXqXuXtXyXyXuXuXdXdXdXdXgXdXgXdXdXdXsXdXyXyXyXuXuXqXcXGXAXCX=.) W 8 8 1 : 2 ~.[.}.`.`.}.(.`._._.`._.{.`.`.`.`.`.`.`.`.}._._.`.`.`.`.`.`.].].].}.`.].].{.|.|.|.|.[. X X2X|.[.2X2X2X2X2X2X2X2X X2X2X2X2X2X0X0X4X0X5X5XqX4X4XqX4XqXtXqXqXrXwXwXtXtXuXyXuXuXiXdXsXdXdXdXgXgXgXgXgXgXjXjXgXjXjXjXjXjXdXgXgXdXdXgXgXdXgXgXgXgXgXdXgXgXgXjXaXjXjXjXjXgXkX",
+"yXyXyXyXtXyXwXqXtXtXwXpXtXtXqXeXwXqXtXtXtXwXqXpXtXtXuXuXsXdXdXdXdXdXdXdXgXdXdXfXiXuXyXtXpXqXpXIXGXZX>.&.W K r 8 3 : : #.[.].].`.`._._.`._.`.`.`.`.}.`.}.`.`._.`.`.`.`.`.`.`.`.`.`.].`.}.].].].].}.|.|.|.[.[..X2X|.[.2X,X,X|.2X2X2X2X2X2X2X X2X2X0X0X0X4X4X4X4X4X4XqXqXqXqXqXqXqXqXrXqXqXqXuXpXiXdXiXdXuXdXdXgXgXgXgXgXgXgXgXjXgXjXjXgXhXgXgXgXgXgXgXgXgXdXgXgXgXgXgXgXgXgXgXjXjXgXjXgXjXjXgX",
+"yXtXyXwXtXqXtXqXtXtXtXwXtXtXtX+X>XU.n.v.v.b.v.v.v.v.v.v.v.v.v.v.v.v.b.b.b.b.v.b.b.v.v.v.n.U.R.DXAX@X-.) P I 8 8 , - - [ [.[.`.`.`.`.`.(.}._._.`.`.`.`.`.`.`.`._._.`.`._.`.`.`.`.`.`.].}.].].].].|.|.|.|.[.[. X X2X|.2X2X2X2X2X,X2X2XXX2X2X2X2X2X2X3X2X4X4X4X4X4XqXqXqXqX9XqXqXqXqXqXqXtXwXyXyXuXiXdXdXdXdXgXgXdXgXhXgXgXgXgXgXjXgXdXjXjXgXdXgXgXdXgXsXgXgXgXdXgXgXgXgXjXjXjXgXjXjXjXjXjXjXjX",
+"tXtXtXtXtXtXwXqXqXtXtXpXtXtXrX>XU.n.b.b.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.x.v.b.D.W.UXFXCX=. .W r 8 r 3 : O # C {.}.].`._.`.}.}.(._.`.`.`.`.}.`.`._.`.(.`.`.`.`.`.`.`.`.].`.].].].].[.|.|.[.[.[.[. X X2X X X2X2X2X2X,X2X2X2X2X2X2X2X2X2X2X0X0X4X4X4X4X4X0XwX5X4X4XqXqXqXqXqXqXwXqXuXuXuXdXiXdXdXdXdXdXgXgXgXgXgXgXgXgXgXgXgXgXgXgXdXgXgXgXiXgXgXgXdXgXgXgXgXgXgXgXgXgXvXhXjXjXjXjXjX",
+"tXpXwXtXtXtXtXtXtXqXtXwXqXtXtXU.D.b.b.b.v.v.v.v.x.v.x.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.x.n.A.R.HXFX:.*.! P 8 8 3 - @ + + - ~.}.`.`.`._.(.}.}.`.`.`.}.}.`.}.`.`.`.(._._.(.`.`.`.`.`.`.`.`.|..X}.|.|.|.|..X[.[.[. X X2X2X2X2X2X2X X2X2X2X2X X2X2X2X2X2X2X2X0X4X4X4X0XqXqXwXwX4XqXqXqXqXqXwX9XtXqXtXuXiXdXdXdXgXgXgXgXgXgXgXgXgXgXgXgXgXsXgXgXdXjXgXgXgXdXgXgXgXgXgXgXgXgXvXgXvXgXgXgXjXjXjXjXjXvX",
+"yXtXtXtX4XwXwXqX4X4XtX9XtXtXtXn.b.v.v.x.l.z.z.l.z.l.z.z.z.z.z.x.x.x.x.x.x.x.x.x.x.x.c.D.Y.=XFX@X-.$.P t 4 6 - @   + # G ^.}.`._.`.`.(.}.`.`.`.`.}.}._.`.`.`.`.}.`.`.`.`.`.`.`.`.`.].].|.|.].|.[..X X X2X X2X2X X2X X2X X[.2X2X2X2X2X2X2X2X2X2X2X0X2X0X2X2X2X4X0XeXqXqX0XwX4XwX4X4XqXqXwXtXtXyXuXdXdXdXgXdXgXgXdXgXgXiXgXgXeXeXvXgXgXgXgXgXgXgXdXgXgXgXdXgXgXgXgXgXgXvXgXgXvXvXgXjXjXjXjXjXkX",
+"uXqXtXtX7XtXwXqX4XtX4XqXtXqXtXv.x.v.x.z.l.l.l.l.l.l.l.l.l.l.t.l.t.l.t.t.t.t.t.l.l.u.f.K.T.FXCX>.%.P u 4 3 <     O 7 O.{.`.'.'._.(.}.}._.`.`.`.`.}.}.}.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.[.`.].|.].[. X X[.[.2X X X X2X2X2X2X2X2X2X2X2X2X2X2X3X2X4X2X4X0X2X2XeX2X4XqX4XqXqXqX4XwX4X4XqXqXqXwXwXtXyXuXdXdXdXgXdXgXgXdXgXgXgXgXgXvXgXgXgXdXgXgXgXdXgXgXgXdXgXgXgXdXgXgXvXgXgXgXgXgXgXvXjXjXjXjXjXkX",
+"tXyXtXqXtXtXqXqX4X9X4X9XtX4XtXz.z.x.l.l.t.t.t.t.t.t.t.t.t.t.t.y.t.t.t.t.t.t.l.t.u.a.F.T.-XVX@X*.! r 8 2 < + o X 5 Q.[.'.`._.`._._.}._.}.(.`.`._.`.`.`.`.`.`.`.`.}.{.`.`.`.`.1X`.`.].].|.|.|.|.|.2X|.2X[.2X[.2X2X2X2X2X2X2X2X2X2X0X2X4X2X2X2X2XqX0X2X2X3X4X4X0XqXqX4X2XqXqXqX9X8XqXqXqXqXtXyXyXiXiXgXdXdXgXgXgXgXgXgXgXgXgXgXgXgXgXdXgXgXdXdXgXgXgXdXgXgXgXdXgXgXjXjXgXjXvXvXgXgXjXjXjXjXkXjX",
+"pXwXqXyXtXwXqXqXtX4X4X4XqX4X4Xz.l.l.l.l.t.t.r.t.r.t.t.t.t.y.p.p.u.t.t.t.t.t.t.t.u.g.I.=XVXCX=.&.P r 6 > O o X = Q.[.}.`.`._._._.(.(._.(._.}.`.}.`.`.`.`.`.`.(.`.}.|.`.`.`.`.`.`.|.`.[.|.|.[.[.,X[.,X2X2X2X X2X,X2X2X2X2X2X2X2X2X2X4X4X2X2X4X2X2X4X4X2X4X4X4XqX0XqX2XqXqXqXqXqXqX4XqXtXqXtXtXpXyXdXiXdXdXiXgXgXiXgXiXgXgXgXgXeXvXgXgXgXgXgXgXgXdXgXvXgXdXgXgXgXgXjXdXjXjXgXgXvXvXvXjXvXjXjXkX",
+"tXtXuXqXtXqXqXqXqXqX7XqX4XtX9Xl.l.l.l.t.t.t.t.t.t.t.t.y.p.s.A.S.f.p.t.t.t.t.t.y.a.F.T.:XCX@X*.W r 4 < @ o $ g M ~.}.].`._._.(._.(.}.}.(.(.}.}.`.}._.`.`.`.`.`.`.`.`.`.`.|.|.}.}.|.|.[.[.[.|.,X|.[.2X X2X2X2X2X2X2X2X2X2X2X2X2X2XqX4X4X4X4X2X2XqX4X2XqX4X5XqX0XqXqXqX2XqXqXqXqXqXqXqXtXtXtXpXtXiXdXiXdXdXiXgXgXgXgXgXgXiXgXgXgXgXdXgXgXdXgXgXdXgXgXeXgXgXgXdXgXgXjXgXjXgXvXdXvXgXjXvXkXjXkXkX",
+"wXtXtXpXqX9XqXqXqXqXqX4X4XqX4Xl.l.z.l.t.t.t.t.t.t.t.y.u.S.J.C.V.J.f.u.t.t.t.t.p.k.I.=XFX&X=.$.u 4 : # . * g N n '.`._._.(.(._.(.(.(.(.(.}.(.}.(._.`._.`.`.`.`.].}.`.|.|.`.`.|.}.[.].|. X X.X[. X2X X2X2XXX2X2X2X2X2X2X2X2X2X4X2X2XqX4X2X2X4XqX2X4X4X0X4XqX0X4XqXqXqXqXqXqXqXqXwXqXtXtXtXyXtXyXiXiXiXdXdXgXiXgXiXgXgXgXgXvXeXgXgXdXgXgXgXdXgXdXgXgXgXgXgXgXgXgXgXjXgXgXgXdXvXgXvXvXjXkXkXkXkX",
+"tXqX9XtXtX4XqX4X4XqXtX4XqX4X4Xl.l.z.z.t.t.t.t.t.t.y.u.S.J.Z.;X( E.k.p.t.t.y.c.f.L.NXSXCX$X%.I 5 > -   % s 5.B c _._._._._._._._.(.(.}.(.}.(.`.`._._.}.`.`.`.`.`.|.|.`.|.[.}.}.|.[.}.[.[. X2X X2X X2X2X2X2X4X2X4X4X2X2X2X2X4XqX4X4X4X4X4X4X4X4X4X4X4XqX4X4X4XqXqX9XwXqXqXwXwXqXtXwXeXtXtXtXtXuXyXiXiXdXdXdXdXdXgXgXgXgXgXgXgXgXgXgXgXdXgXdXdXgXdXgXgXgXgXgXgXgXgXgXjXgXgXjXjXjXjXkXjXvXkXkXkX",
+"tXtXtXtXqXtXtXqXqX4X4X4X0XqXqXl.l.z.z.t.t.t.t.t.y.p.g.Y.NXDX;X( q.F.a.y.t.y.p.A.BXSXZXCX:.! 8 1 -   $ g M.8.b c _._._._.)._._._._.}._.(.(.`._.`._.`._.`.`.`.`.].}.`.}.|.'.}.[.[.[.[.[.[.[.2X,X X2X2X2X2X2X2X2X2X2X2X4X2X0X2X2X4X4X4X4XqXqX4X4X2X4X4X5X4X4XqXqXqXqXwXqXqX9XwXwXtXtXtXuXtXuXuXyXuXeXiXiXdXdXdXgXdXgXgXgXgXgXgXgXgXgXgXgXdXvXdXdXvXgXgXgXgXgXgXgXgXgXgXgXjXjXjXjXkXjXkXkXkXkXjX",
+"tXtXtXwXqXqXqX4XwXtX4XeXqXwX4Xl.l.z.z.t.t.t.y.y.a.S.Y.NXHXAX=.H ^ J.s.i.t.y.a.L.NX:XCX$X*.P 4 < + . & M.V.2.b c ).(.(.(._._._._._.}.}.}.(.`.(.`.}._.}.{.`.`.`.` P 9 i @.}..X.X@.9 P S { '.,X[.5X[.U r L S r O.0X5X,X2X4X| U S J S S J K i ` !.tX0XwX .U A K S U S J  .oXtXqXtXqXpXtXtXuXyXyXyXtXdXiXiXdXdXdXdXdXgXgXgXgXgXgXgXgXgXgXgXgXdXdXdXvXgXgXgXgXgXgXgXgXgXgXgXgXgXjXjXjXkXkXkXkXkXkX",
+"tXqXtXwXwXqXwXqX4XwX4X4X2XqX4Xl.z.z.y.y.t.u.a.S.A.Y.DXDXAX>.) H Z V.h.u.t.u.h.I.=XZXCX:.W w : O   & N J.8.2.v z (.(.(.(._._._._._._.(.(.`.`.}.`.}.}.}.`.`._.{.` t r 9 @.].}.}.@.S A K { [.2X[..X!.K U 8 L P G 4XwX8X2X2X[ K K P P t J K t Y D @.eX2X{ t A t K t t P t G X.tXyXtXtXtXtXyXtXyXyXtXiXyXiXsXdXdXdXgXiXgXgXgXgXgXgXgXgXgXgXgXvXdXdXdXgXgXgXgXgXgXgXgXgXgXgXjXjXjXkXjXkXkXvXkXkXkX",
+"tXtXtXtXtXqXqXqXqXwX7X4X<XtX4Xz.z.z.z.u.a.h.A.H.R.DXHXZX@X*.T w V 5.F.a.u.a.F.R.:XZX@X&.J 1 #   = m H.S.6.2.v x ).(.(.(._._._._.}._._.}.`.`.`.`.`.`.`.{.`.}.`.] U S J Q.}..X.X@.S J K { [.,X[.8Xo.9 i 8 K r K @.4X4X2XqX[ q K u R F 0 F P r S } 9XtX{ K L t F F F t P 9 F oXrXwXtXtXyXyXyXyXyXtXyXiXpXdXaXdXdXdXdXgXgXgXgXgXgXgXgXgXgXgXgXgXdXvXgXgXgXgXgXgXgXgXgXgXjXjXjXjXkXkXkXkXvXvXhXbX",
+"tXqX7X4XtX4XqXqXqXqXqXqXqX4X4Xl.z.z.c.s.A.Y.T.=XSXSX@X#X*.! S 5 6 M P.g.p.h.W.-X&X%X:.~ 6 - + $ g V.S.i.6.1.v c ).(.(.(._._._.`._.}.}._.`._._.`._.}.`.|.`.}.`.` K K t @.].[.|.@.D P t { [.2X8X8X_ S t ] S K r o.qX2X4X2X[ t P K OX,XrX~.t K S i 9XeX[ 9 r K oX7X+XO.t i i ` pXwXeXyXwXyXyXyXtXtXyXiXyXiXdXdXdXdXdXdXgXdXgXdXgXgXgXgXgXgXgXgXdXdXgXgXgXgXgXgXgXgXgXgXgXgXgXvXjXjXvXvXvXvXvXkX",
+"tXtXtXtXtXqXqXtXqXwXqXqX8X4X7Xl.z.z.c.S.C.N.B.>.:.*.&. .T L 8 w 6 V 9.A.s.A.NXSXCX%X&.u - O . = V.A.a.e.4.1.v c (.(.(.(._._.`.`.}._.}.}.}.`.`.`.}.}.}.`.`.}.`.` t K q X.o.+.+.O.S i y } [..X2X~.U U 9 +.{ L P 0 <XqX4XqX[ 9 S S OXqX7X1XU A K W qXwX| K r K OXwXeX9XF r t S rXtXwXaXtXtXyXyXyXyXyXuXyXdXdXiXdXdXdXgXdXgXdXgXgXgXgXgXvXgXgXgXgXvXgXgXgXgXvXgXgXgXjXjXjXgXjXjXjXvXvXvXbXvXvXzX",
+"tXtXqXtXtX7XwXqXqXqXtXqXqXqX4Xz.z.c.c.S.H.9./ H H J u y J J K w 8 H ^ J.k.K.BXFXCX:.W e #   * N L.j.u.e.4.1.v z (.(._._._._._._._.}.}.}.`.}.`.}.}.}.}.`.}.}.`.] P S K F q r 9 J A U y } XX2X,Xo.t K S OX+.A K q +.2X4XwX[ S S K o.+.o.E U 8 S O.rXuX[ P L S OXqXwXuX[ K K D OXqXqXwXtXtXtXtXwXyXyXpXiXyXdXdXdXdXdXdXgXgXdXgXgXgXgXgXgXgXgXgXvXdXvXgXgXvXgXgXvXgXjXjXgXvXvXvXvXvXkXvXvXbXzXkX",
+"tXtXtXtXqXtXrXqXwXtX7XqXqXqX4Xz.z.z.z.s.S.A.V.m Z 6 6 3 w 8 J K 8 J H C.W.BX:XAX*X%.5 - + $ l K.k.p.t.r.4.<.v z _._._._._.`._.`.`.`.}.}.].].].|.].}.].].].].'.` P J A S K y t K J t t ` [.3X{.E r K K <X1XU K K | 0X2XwX[ S D r R t K 9 t P [ 6XtXqX| K S K OXaXtXpX{ S K S OXyXyXtXtXtXtXtXtXtXuXuXiXsXsXdXdXsXdXdXgXdXgXgXgXgXgXgXgXjXgXjXgXjXjXgXvXgXjXgXgXjXgXkXjXgXkXkXkXkXkXzXzXzXzXzX",
+"yXtXyXwXtXtXqXtXtXqXwXqXqXqX4Xz.z.l.l.y.u.p.a.A.5.; > 2 3 w 8 9 r J ~ B.BXUXHX&X=.~ 1 @ . & C.G.p.t.t.r.4.<.v z _._.`._._._.`._.`.].'.}.].].`.`.].].`.`.`.|.'.} K K r ] ] [ ' E A y t ] ,X3X{.9 K K T #.#.R K S K <XeX9X{ y K J K K A U U +.tXtXtXuX{ t K F OXaXwXyX{ U K K OXtXqXwXqXtXtXtXqXuXtXtXiXiXdXsXdXdXgXdXdXgXgXdXgXgXjXgXjXjXjXgXjXjXgXgXgXgXjXjXjXjXkXgXkXkXkXkXkXkXzXkXzXzXzXzX",
+"tXpXtXtXqXqXqXtXtXtXtXwXqXqX4Xz.z.l.l.t.y.y.y.p.G.0.; ; 3 4 u r 8 T ( ( HX:XZX>.) 5 -   = N L.s.y.t.t.r.4.<.v z '.`.`.`.`.`.`.`.`.].}.}.].].|.].`.].}.].|.}.[.` t S t !.[.[.[.Q.J L K { 2X[.o.K S t P t q K P J D +.4XwX .r A J OXOXA L r S oXrXuXwX{ L r q OXyXdXtXK L u D rXtXwXtXwXtXtXtXtXtXuXiXsXsXdXiXdXsXdXdXdXgXgXgXgXgXgXjXhXjXgXgXjXjXjXgXvXgXgXjXjXjXjXkXjXkXkXkXkXhXkXzXkXkXkXzX",
+"yXpXqXtXuXqXuXqXqXtX9XwX8XqX7Xz.z.l.l.t.t.t.t.y.a.I./ V 7 2 4 J K R $.-.*X%X>.$.L 2 O $ l H.h.p.t.t.t.e.4.<.v z `._.`.`.`.`.`.].}.}.].].].].`.|.].].}.{.,X}.[.' K A S ^.[.3X.X!.D S S ..4X2X_ S K i S S S S r P t { wX4X| i S K OXtX+.9 t T G 6XyXyX..G K q OXgX<XX.K P r [ 6XwXqXyXtXtXwXtXtXtXqXrXsXiXiXdXdXdXdXdXdXdXgXgXgXgXjXjXgXgXgXgXdXjXjXjXjXjXjXjXjXjXkXgXkXkXkXhXkXkXlXzXzXkXzXzX",
+"yXyXtXtXtXtXqXtX7XtXtXwX9XqX7Xl.z.l.l.l.t.t.t.r.y.f.K.N.k : e 3 8 L ! $.*.-.&.I , # X & V.G.a.y.t.t.t.r.4.<.v x '.`.].`.`.|.'.|.}.}.[..X|.|.|.`.].].}.'.[.[.[.} P y i @.,X2X3X!.P y D [ ,X~.D A L S [ [ ' { Y P t 9 1XqX] U S 8 OXyXrXE q t Y +.iXyX| K r u U S S J Y 9 F ;.rXiXyXqXwXtXtXtXwXtXyXyXiXdXdXdXsXdXdXdXdXgXdXgXgXgXgXgXgXjXgXhXjXjXgXgXjXjXjXjXjXjXjXkXkXkXkXkXhXkXjXzXkXzXvXzX",
+"uXyXtXyXtXtXyXtXtXtXtX4X9XqXqXz.z.z.l.t.t.t.t.t.y.u.g.K.N.k - e 5 r W ! ) Q J 5 7 + * M Y.g.y.t.t.t.t.e.4.<.v x ].|.].].|.'.}.}.}.[.[.|.|.|.|.|.].}..X`.[.3X,X` t i L ~.[.[.3XQ.D K F { 8XX.L K K O.0X4X9X<XO.D S L +.6X[ 9 K K OXwXtXoXP y J S +XdX..K P K K U K r K G o.aXyXwXqXwXtXwXpXqXyXyXiXiXiXiXdXiXdXsXdXdXgXgXgXgXgXgXgXgXgXgXjXgXjXjXvXgXjXjXkXjXkXjXkXgXkXjXkXkXzXkXkXzXkXzXkXkX",
+"uXiXyXyXtXyXtXqXqXtXtXwXtX9XqXz.z.l.l.t.t.t.t.t.t.y.u.h.K.9.k 2 3 w K L U P 4 : O $ g H.h.p.y.t.t.t.t.e.4.<.v h ].|.|.|.|.}.[.}.[.}.].|.|.|.}.{.|.|.|.'.[. X'.' F q U @.[.8XXXQ.U i R ] 1X_ t K U ;.7X7X7X7X@.G r t ' <X[ G S S OXuXaXdX] K D D o.pX[ L A J A D S W O.OXpXiXqXsXuXuXtXtXtXtXuXpXyXdXiXdXdXdXdXdXdXdXdXgXgXgXgXgXgXgXaXgXgXjXjXjXjXjXjXjXkXjXkXjXkXgXkXjXkXkXkXkXkXzXkXkXkXzX",
+"uXpXyXyXuXyXtXtXtXtXwXwX9X4XwXz.l.l.l.l.t.t.t.t.t.t.y.p.S.K.0.k 2 w 5 A K 4 3 O $ & M.F.s.y.t.t.t.t.t.e.4.<.v x [.[.|.[.[.[.[.[.[.[.|.|.|.}.}.|.|.|.,X X[. XXX{.1X,X1X2X0X2X3X4X1X4X2X4XeX,XtXqX4X3XwX7X4XwXqX9XtXtX8XeXrXtXuXrXyXeXeXeXuXrXsXrXuXdXdXaXsXdXiXiXdXaXrXiXdXwXuXtXqXdXuXpXyXyXuXuXdXiXdXdXdXdXdXdXgXdXgXgXgXgXgXgXgXaXgXgXdXjXjXjXkXjXkXjXjXkXjXjXkXkXkXkXkXkXkXkXzXzXkXkXvXvX",
+"yXuXyXpXtXyXtXtXtXqXtX4XqXqXwXz.z.z.l.t.t.t.t.t.t.t.t.y.u.h.K.^ V 2 w 8 4 2 - + % m J.g.y.t.t.t.t.t.t.r.4.<.v h [..X[.[.[.[. X[..X[.[.[.[.[.[.}.[.[.|.'.[.[.}.[.8X[.3X.X3X2X2X3X2XwX X4XwX4X,XqXqXwX8XwXtXqXqXqXyXyX7XyXtXaXtXrXaXyXyXdXaXyXyXdXdXaXdXdXdXdXiXeXyXyXdXtXdXiXtXtXyXyXiXiXuXyXyXdXyXiXdXdXjXsXgXsXgXgXdXgXgXgXgXdXdXdXgXgXgXdXgXjXjXjXkXkXkXkXkXkXjXkXkXkXvXkXkXkXvXkXkXkXvXkX",
+"uXuXuXuXtXyXyXwX7XtXtXqX9XqX7Xl.z.l.l.t.t.t.t.t.t.t.t.t.l.p.S.H.M 2 , 4 3 , @ . s V.h.p.y.t.t.t.t.t.t.e.4.<.v z 2X.X[.[.[.[. X X[.[.[.[.[.[.[.[.[.[.3X'. X2X2X,X<X3X XeX8X<X<X8X8X5XqXqX2XwXqX4XqX9XwXtXwX9XqXuXqXyX7XyXyXyXeXfXaXyXyXiXiXiXyXdXiXdXdXiXiXdXuXsXgXaXdXaXaXaXuXuXuXyXdXyXuXyXdXuXdXdXdXdXdXdXsXgXdXgXgXgXgXgXdXgXdXgXdXgXgXvXgXjXjXkXkXkXkXkXkXkXkXkXvXkXvXkXzXkXzXhXkXzXkXvX",
+"iXyXuXtXtXtXyXtXtXqXtXwXtXtX4Xl.z.l.l.t.t.t.t.t.t.t.t.t.y.y.a.F.T.V 2 2 : -   % N F.p.y.t.t.t.t.t.t.r.r.4.<.v h [..XXX X X XXX2X.X X X X X X.X2X X X,X[.2X[.2X2X2X2X2X0X2X4X2X2X2X4X4X4XqXqXwXtX4XtXtX9XtXqXtXwXwXwXtXtXyXyXyXyXyXyXiXsXiXsXdXdXdXdXiXdXiXdXsXsXdXuXuXuXdXuXuXdXaXaXdXiXdXaXsXdXaXdXdXdXdXdXgXgXgXdXgXdXgXdXgXgXgXdXvXdXgXgXjXjXjXkXjXkXkXkXvXkXkXzXzXkXvXvXzXkXzXzXvXzXkXhX",
+"uXuXuXtXuXtXyXtXtXtXqXqX9X9XqXl.z.l.l.l.t.t.t.t.t.t.t.t.t.y.y.g.K.C.k , - @ . s P.s.y.y.t.t.t.t.t.t.t.r.4.<.v z [.2X X X X X X X X X X X X X2X X,X X X X2X2X2X2X2X2X2X2X2X2X4XqX4X4XqXqXqXqXtXqXtX9XtXtXwXtXtXtXyXtXyXyXyXyXyXyXyXaXsXiXiXsXsXdXdXdXdXiXsXiXiXdXuXdXaXdXiXdXaXaXdXdXiXdXdXdXdXdXdXdXdXaXgXdXdXdXgXgXgXgXgXgXgXgXdXgXdXgXgXgXjXjXkXjXkXkXkXkXvXzXkXzXzXzXzXzXzXzXkXzXvXhXkXkX",
+"uXyXyXyXiXpXyXyXtXpXtXwXtXtX4Xz.z.z.l.t.t.t.t.t.t.t.t.t.t.t.t.u.j.K.9.; -   & 5.F.a.y.t.t.t.t.t.t.t.t.r.4.<.v z [.,X|..X X X X X X X X[. X.X2X2X2X X2X,X2X2X2X2X2X2X2X2X2X4X4X4X4XqXqXqXqXqXtXqXtXtXtXtXtXwXtXyXyXtXyXyXyXyXiXpXyXyXdXuXdXdXdXdXdXdXdXaXsXdXdXdXdXdXdXdXdXaXdXaXdXdXdXdXdXdXdXdXdXdXdXdXdXgXgXgXgXgXgXdXjXdXgXgXdXjXgXgXgXgXjXjXjXkXkXkXkXkXkXzXzXzXbXkXzXbXzXzXzXzXhXvXzXhX",
+"uXaXuXyXtXiXyXyXtXwXtXwXtX9XwXl.z.l.l.t.t.t.t.t.t.t.t.t.t.t.t.t.p.k.I.^ % $ s H.g.y.t.t.t.t.t.t.t.t.r.r.4.<.v z ,X2X,X2X2X,X X X,X[. X2X2X2X2X,X2X2X2X2X2X2X0X2X4X4X0X2X4X4X4X0X4XqXqXqXwXwXtXtXtXtXyXtXtXyXyXyXtXyXtXyXyXyXpXiXyXdXuXdXdXaXgXaXdXdXdXuXdXdXyXdXdXdXuXaXdXdXdXuXdXdXdXdXdXdXgXdXdXgXdXdXdXgXdXgXgXgXgXgXjXjXgXgXgXgXgXgXjXgXgXjXjXjXkXkXkXkXkXzXkXzXvXnXzXzXzXbXzXzXzXzXzXvX",
+"uXuXuXyXyXyXiXyXtXtXtXwX7XtXwXl.l.z.l.t.t.t.t.r.t.t.t.t.t.t.t.t.y.a.G.T.= & 5.F.a.y.t.t.r.t.l.y.r.t.t.r.4.<.v z 2X,X,X|.2X[.,X[. X X[. X X2X2X2X3X2X0X2X2X2X2X0X4X2X4X4X4X4X0XqX4XqX9X7XtXtXtXtXwXyXtXtXyXtXyXtXyXtXiXpXuXpXyXuXuXuXaXdXdXdXgXdXaXdXdXdXdXdXdXdXdXdXdXdXdXuXdXdXdXdXdXdXdXdXdXgXdXdXdXgXdXdXsXdXjXdXjXgXgXgXgXgXgXjXjXjXjXjXjXjXjXjXkXjXkXkXkXzXbXbXbXvXvXbXbXbXzXzXzXzXvXvX",
+"aXuXuXyXiXiXtXyXyXtXtXqXtXwXwXl.l.l.l.t.t.t.t.t.t.t.t.t.t.r.t.t.t.u.f.J.V.n V.g.i.y.t.t.t.t.t.t.t.t.t.e.4.<.v h  X3X2X2X X2X X X[.2X,X2X2X2X2X2X4X0X2X0X2X0X4X2X4X4X4X4X4XqX0XqXqXqX4X4XtX4XtXqXyXyXtXtXtXpXyXyXyXyXyXyXuXuXiXiXdXaXsXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXaXdXaXdXdXdXdXdXdXdXdXdXgXdXgXgXgXdXgXgXgXhXgXjXjXjXjXgXgXgXjXjXjXhXjXhXjXjXjXjXjXkXvXkXkXkXbXkXbXvXnXbXbXbXzXzXzXzXzXbX",
+"uXyXuXtXiXiXuXtXyXwXtX4XtX7XqXz.z.z.l.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.u.h.G.8.A.s.y.t.r.t.t.t.t.r.t.t.t.e.4.<.v z [.2X2X X2X X2X,X2X2X2X2X2X2X0X4X4X0X0X5X4XqX4X5X4X4X4XeXqX4XqXqXqXqXqXwXwXtXtXtXtXtXtXyXyXyXyXyXyXiXiXiXiXiXiXdXdXdXuXdXgXsXsXgXsXsXsXdXdXdXdXdXdXsXdXdXdXdXgXaXdXdXdXdXgXdXgXgXgXgXdXgXhXgXgXhXjXjXgXjXjXgXjXgXjXjXjXjXjXjXjXkXjXjXjXjXkXkXkXkXzXzXzXzXbXbXbXzXbXbXvXzXzXzX",
+"aXuXuXyXuXtXiXtXtXyXtXwXtX4X4Xl.l.z.l.t.t.t.t.t.t.t.t.t.r.t.t.t.t.t.i.p.f.f.a.u.y.t.t.t.t.t.t.t.t.t.t.e.4.,.v z 3X.X2X2X2X2XXX2X2X2X2X2X4X0X4X4XqX0X0X0X0X0X4X4X4X4X0X4X4X4XqXqXqXqXqXqXtXtXtXtXtXtXuXyXyXyXiXpXyXiXiXdXiXdXiXdXdXdXdXsXsXdXdXsXsXsXgXdXdXgXdXsXdXsXdXsXdXdXdXdXdXdXgXdXdXgXgXdXgXgXgXdXjXgXgXgXjXjXjXgXjXjXjXjXjXjXjXjXjXkXkXjXjXjXjXkXkXkXkXkXzXzXmXbXbXbXzXbXbXzXzXzXvXvX",
+"yXpXtXyXtXyXyXyXtXwXwXqXrX2X9Xl.l.z.z.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.u.u.u.t.t.t.t.y.r.t.t.t.t.r.r.w.1.,.z d 4X<X2X2X2X2X8X2X2X2X2X2X4X0X4XqX4XeXqXqX4XwX4X4X4X4X4X4XqXqXqXqXqXqXtXtXtXtXtXtXuXuXiXyXyXyXiXiXiXiXiXiXdXdXdXdXdXdXsXdXdXsXdXgXgXsXdXdXgXdXgXdXsXdXdXdXdXdXdXdXdXdXdXvXgXdXgXgXgXgXgXjXjXjXgXkXjXjXgXkXjXjXjXjXkXjXkXkXjXkXkXjXjXjXkXkXkXkXkXkXzXzXzXvXzXbXzXbXzXzXbXzXmXbX",
+"yXyXtXyXtXyXyXyXtXwXyX9X<XqXqXl.t.t.t.e.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.4.4.,.z d p .X2X2X2X2X2X2X2X2X2X2X2X4X4X4X0XqXqXqX0X4X0X4X4X4X4X4XqX4XqX4XqXqXwXpXqXtXtXtXtXuXtXuXuXuXuXiXiXdXiXdXdXdXdXdXdXdXdXdXdXdXdXdXdXsXgXgXdXdXdXgXdXdXgXdXdXaXdXdXdXgXdXdXdXgXgXgXgXjXgXjXjXjXjXkXgXkXjXjXkXkXkXvXvXjXkXkXkXkXkXkXkXkXkXkXjXkXkXkXxXzXzXzXzXbXbXbXbXbXzXbXbXvXvX",
+"tXuXuXtXtXtXtXtXtXtX4X7XwXeXeXt.e.w.4.3.1.<.<.<.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.<.1.1.<.<.<.<.<.,.b d p p f 2X8X2X2X2X2X2X2XqX2X2X4X4X4X4XqXqXqXqXqXqX0XqX0XqXqX4XqX4XqXqXqXwXqXqXuXuXuXyXuXuXiXuXiXiXsXdXiXiXdXdXdXiXdXdXdXdXdXgXsXdXdXdXdXdXdXdXdXdXjXdXdXgXdXdXdXgXsXsXjXgXgXgXgXgXvXjXjXjXjXjXkXhXkXkXkXkXkXkXkXkXkXvXkXkXkXkXkXzXkXkXvXkXkXkXkXkXkXkXkXkXzXzXzXbXbXbXbXbXbXbXbXbXbX",
+"uXuXtXtXuXtXtXwXtXwXwX7X9X0X0Xd.7.1.,.v x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x d d p p j n 4XXXqX2XqX2X4X4X2XqX4X4XqX4XqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXwXqXtXwXyXtXuXtXyXuXuXdXiXiXdXdXiXaXdXdXsXdXdXdXdXdXdXdXsXsXgXdXgXgXdXgXgXgXdXdXjXdXgXgXgXgXgXgXdXgXgXgXdXgXdXjXjXjXjXjXkXkXkXkXkXkXkXkXkXkXkXkXvXvXvXkXkXkXkXkXkXjXkXkXkXkXkXkXkXzXzXzXzXbXzXbXbXbXbXbXmXbXbX",
+"tXuXtXuXtXtXtX9X7X9XwXtX9XqXqX5.5.b z d p p p p p p p p p p p p p p a p p p p p p p p p p p p a a p a d p f M q.4X<X4X4XqX,XqX2X2X2XqX4X4X4XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX9XtXtXyXyXuXiXiXpXiXiXiXsXsXdXdXdXdXdXdXdXdXdXiXgXdXdXdXgXgXdXdXdXdXdXdXdXsXgXgXgXdXgXgXgXgXdXdXjXgXgXgXvXgXjXkXjXjXkXkXkXkXkXkXzXkXzXzXzXkXzXbXkXkXkXkXkXkXkXkXvXkXkXkXvXkXkXkXzXkXzXzXvXbXzXmXbXmXmXbXbXmXmX",
+"tXtXtXuXyXyXtXqXwX9X4XwX4XtX6X/.0.m f p p p p p p p p p p p p p p p p p p p p p p p d p p p p p p p p a f m /./.eXXX4X4XqX4X2XqXqXqX4XqXwX4XqXqX9XeXqXqXqXqXqXqXqXqXqXqXqXqXtXqXuXyXyXyXiXyXyXdXdXdXdXsXsXsXjXdXgXdXgXdXdXgXgXiXhXdXdXdXdXgXgXdXgXdXgXsXgXsXgXgXgXgXgXjXgXjXgXgXgXgXvXgXjXjXkXjXkXkXkXkXzXzXzXzXzXxXzXzXxXnXkXzXkXkXkXzXxXkXkXxXkXzXkXkXzXkXkXkXkXzXvXvXbXbXzXbXmXzXbXbXbXmX",
+"uXuXyXtXtXtXtXqXqXqX9XqXwXqXtXtXqX2XqXqX8X8XqX,XqX8X<X2X,X8X8X4XXX2XqX8X9XqX9XtX9XqXtXqXtX9X9X9XqXwXtXrX4XrX8X9X9X<XqXqXqXqX4X2XqX0XqXqXqXqXqXqXqXwXwXqXqXwX9XwXqXqXtXwXqXqX9XtXtXtXyXyXaXiXiXaXiXdXdXdXdXgXdXjXgXdXgXdXgXgXdXgXgXdXdXdXdXdXdXgXdXdXdXgXdXgXdXgXgXjXjXgXjXjXjXjXjXjXjXjXkXjXvXkXkXkXkXzXzXbXbXnXnXnXbXvXxXnXkXzXxXkXnXkXkXkXkXkXzXkXkXkXkXvXkXkXkXkXvXzXvXxXbXmXnXbXnXnXnXnX",
+"tXtXtXtXtXuXtXwXtXwXtXtX4XwX4XqXwXqXwXqXqXqXqX4X4X4X4X4X4X2X4X4X4X4XqXqX4XqXwXwXtXtXtXpXtXwXtXtX9XtXqXtX7XtXwXwXqXqXqX2XqXqXqXqXeXqXqXqXqXqXqXqXqX9XqXqXqXqXqXqXwXwXwXyXyXqXwXrXtXyXiXyXiXiXiXiXdXiXdXdXdXdXjXdXgXdXgXgXdXgXgXgXdXgXdXdXdXgXdXdXgXdXdXdXgXgXgXgXjXjXjXjXjXjXjXgXgXjXjXjXjXvXkXkXkXkXbXbXbXbXbXnXnXnXvXnXnXxXnXvXzXkXbXzXnXzXzXkXzXzXkXvXnXvXvXkXkXkXvXzXzXzXbXzXbXbXbXnXmXnX",
+"iXeXtXtXtXqXpXqXtX4XqXtXtXqXwXqXqXqXqXqXqX0XqX8XqXqXqX2X4X4X4X4XqXqXqXqXqXqXqX9XwXtXtXtXtXtXtXwXwXtXtXtXtXwXtXwXqXqXwXqXtX4X4XtXqXqXyXtXwXwXqXtXwX9XqXqXqXqXtXqXtXtXqXwXtXqXuXuXtXiXyXyXyXiXdXiXiXdXdXdXgXdXdXgXgXgXgXgXgXgXfXgXgXdXgXdXgXdXdXdXdXdXdXdXgXgXgXjXjXgXjXjXjXgXjXjXjXjXkXkXkXvXxXkXxXxXzXzXxXnXnXmXmXmXnXnXnXbXvXbXzXzXkXzXzXzXkXnXzXnXvXvXkXkXkXkXvXzXzXzXzXbXmXzXnXnXnXmXmXnX",
+"yXtXtXtXqXwXtXwXtXtXtX9XwXtXtXwXqXqXeXqXqXqXqXqXqX2XqXqXqX4X4X4X4XqXqXwXtXwXqXtXtXtXyXtXuXtXyXtXtXtXyXtXpXqXwXtXtXqXqXqX4XtXtXtXqXtXqXqXqXwXqXqXqXwXqXqXqXqXqXtXqXwXpXtXyXtXqXuXyXiXyXyXyXdXiXiXdXdXdXdXsXgXgXgXgXfXgXgXgXgXgXgXgXgXdXgXdXgXgXdXdXgXgXgXgXgXgXjXjXgXjXgXjXjXjXgXkXjXjXjXkXvXkXkXxXkXbXmXxXnXnXmXmXmXnXmXnXnXnXbXbXzXbXxXzXkXbXkXkXzXvXvXzXzXkXkXvXzXzXzXzXbXzXmXnXnXmXmXmXmX",
+"yXyXtXtXwXtXtXtX7XqXtXqXtXqXwXtXqXqXqXqXqXqXqX2X2XqX2XqXqX2X8X4XqXqXqXtXqXtXtXqXtXtXyXyXyXyXyXyXiXtXyXtXyXtXtXwXtXqXqXtX4XtXtXtXtXtXtXqXtXwXtXtX7XtXtX9XtXtX9XtXtXtXtXuXtXtXyXyXyXuXuXuXiXdXiXdXgXiXgXdXgXsXgXgXgXdXgXgXgXgXgXgXdXdXgXgXgXgXdXdXgXdXgXgXgXgXgXjXjXjXjXjXjXjXjXkXjXjXvXjXkXkXkXxXbXvXnXnXnXnXmXmXmXmXnXmXmXxXxXxXbXbXbXzXkXzXzXzXbXkXbXvXkXkXzXkXkXzXbXzXbXbXbXnXbXbXmXmXmXmX",
+"yXwXtXtXtXtXtXtXtXtXtXwXtXtXwXqXtXqXtXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXwXqXqXtXtXwXtXtXyXyXtXyXuXuXyXiXyXuXyXyXyXwXtXtXtX4XtXtXwX9XtXtXyXpXtXwXtXqXtXtXwXtXtXqXtXwXqXyXqXuXuXyXyXtXiXuXyXaXiXdXgXdXiXdXdXdXdXgXdXgXgXgXgXgXgXgXgXgXgXgXgXdXfXgXgXgXgXdXgXdXdXjXgXjXjXjXjXjXjXjXjXjXkXjXkXkXkXkXzXkXbXbXnXnXnXmXmXmXmXmXnXmXmXmXxXmXmXbXbXbXnXzXzXzXkXbXkXkXxXxXnXnXbXvXzXbXbXbXnXnXbXmXbXmXnXnX",
+"tXtXtXuXtXpXtXtXtXtXtXtXtXtXtXtXwXqXqXqXqXqXqXqXqX8XqXqXqXqXqXtXqXwXtXtXtXtXtXtXtXyXyXpXuXuXiXiXpXpXyXyXiXyXyXyXtXtXtXtX4XtXtXtXqXtXyXyXtXtXtXtXtXtXtXwXwXtXtXtXtXtXtXyXuXyXyXuXuXyXdXiXdXiXiXgXgXgXgXgXdXsXdXgXdXgXgXgXgXgXgXgXdXgXgXgXgXgXdXgXdXgXgXgXgXjXhXgXjXjXjXjXjXjXkXjXkXjXkXkXkXkXkXbXbXkXnXnXxXnXnXmXmXmXnXnXmXnXxXxXxXxXbXbXbXkXxXkXnXkXzXzXzXbXkXnXbXbXbXbXbXmXnXnXmXmXmXmXmXnX",
+"tXtXtXqXqXtXtXtXpXtXtXtXwXtXtXqXqXqXqXqXqXqX8XqXqXqX9XqXqXqXqXuXtXtXtXtXwXyXyXpXiXiXuXdXuXsXiXsXiXiXiXiXpXtXyXyXtXtXtXqXtXtXtX7XuXqXyXyXyXyXtXtXtXtXtXyXyXtXyXtXyXyXuXyXuXuXyXpXdXiXdXdXiXiXgXiXgXiXgXdXgXgXgXdXgXgXdXgXdXgXdXgXgXgXgXgXgXgXgXgXdXgXgXgXgXgXgXjXjXjXjXjXjXjXjXjXkXkXkXkXvXvXbXxXkXbXvXnXnXnXnXmXmXnXnXnXmXmXmXmXmXmXxXmXmXbXzXnXkXxXzXvXbXzXbXbXmXbXbXbXbXnXmXmXmXmXmXmXmXbX",
+"yXyXtXtXyXyXyXyXyXyXyXyXwXtXtXqX7XtXqXqXqXqXqXqXwXwXwXqXqXtXqXtXtXqXtXyXyXyXyXyXiXyXiXiXiXdXiXdXiXdXdXuXuXyXiXyXyXyXyXwXtXtXqXtXuXrXiXiXtXtXtXyXtXyXyXtXyXtXyXtXyXyXaXiXiXuXiXdXiXdXsXdXdXaXdXdXdXgXvXdXdXgXdXvXgXdXgXgXgXdXgXgXgXdXgXgXgXfXgXgXgXgXgXgXgXgXgXjXjXjXjXjXjXjXkXkXkXkXkXkXvXkXxXkXxXzXbXbXbXbXmXmXmXmXnXmXmXmXmXmXmXmXmXmXnXvXnXvXvXxXbXzXzXbXbXbXmXmXnXnXnXnXmXmXnXnXnXnXbXbX",
+"tXyXtXyXtXtXpXyXuXyXyXpXpXtXtXtX9XtXqXqXqXqXqXqXwXyXqXtXtXtXtXqXtXwXyXyXyXiXyXyXyXdXiXiXdXiXdXdXdXdXaXuXdXiXdXiXyXyXyXyXtXuXuXyXuXqXtXuXpXyXiXtXiXtXtXuXtXuXiXiXuXyXiXiXyXdXiXdXdXiXdXdXdXdXdXdXdXdXdXdXdXdXdXdXgXgXgXdXgXgXdXgXgXgXgXdXgXgXgXjXgXgXgXgXgXgXjXgXgXjXjXjXjXjXjXkXkXkXxXkXvXxXkXxXzXzXzXzXbXmXxXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXvXvXxXxXbXvXbXbXbXbXmXmXmXnXmXnXmXmXnXmXnXbXbXbX",
+"iXuXpXtXuXpXuXyXyXyXyXtXtXtXqXtXtXqXtX4X9XqXqXyXtXtXqXyXuXyXtXtXuXtXyXyXyXiXdXiXdXiXiXdXdXdXdXdXdXdXdXuXdXiXiXiXuXuXiXpXiXiXiXuXyXyXuXyXaXyXuXyXyXpXtXtXyXyXyXdXdXuXiXdXdXdXiXiXdXdXdXiXgXaXdXdXdXdXdXdXgXdXdXvXgXdXgXdXdXdXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXjXjXjXjXjXkXkXjXkXkXzXzXkXxXkXkXnXzXzXbXzXbXbXbXmXmXnXnXmXmXmXmXmXmXmXmXmXnXnXnXnXkXkXnXnXnXnXmXmXmXmXmXmXmXmXmXnXnXnXnXbXbXbX",
+"yXiXiXyXiXiXyXyXuXuXiXyXtXtXtXtXtXtXwXtXwXtXqXtXtXtXyXyXyXyXyXyXuXuXuXiXiXiXdXdXdXdXdXdXdXiXaXdXdXdXdXdXdXdXdXiXuXiXpXuXiXiXiXuXuXyXyXpXuXuXuXyXyXyXtXiXiXuXyXyXyXdXdXiXdXiXiXdXdXdXdXdXdXdXdXdXdXdXdXdXdXgXdXdXdXgXgXgXgXgXgXdXfXgXgXgXgXgXgXjXgXgXgXgXjXgXjXjXjXjXkXjXkXkXkXkXkXzXkXxXkXxXnXkXzXxXxXxXbXbXbXmXnXmXmXmXmXmXmXmXmXmXmXmXnXnXnXnXxXxXnXnXvXnXnXmXmXmXmXmXmXmXmXmXnXnXnXbXbXbX",
+"dXyXdXyXdXyXyXyXiXdXiXiXyXpXtXtXtXtXtXtXwXtXtXtXyXyXyXyXuXpXyXyXuXiXiXuXsXdXdXdXdXdXdXaXaXdXdXiXdXdXdXgXdXdXsXdXiXiXuXuXuXiXiXiXyXyXiXuXyXuXaXyXyXyXtXyXuXaXdXyXiXdXiXdXiXdXdXyXaXdXdXuXaXaXdXdXdXdXdXdXdXgXgXgXgXgXdXgXgXdXgXdXgXgXgXgXgXgXgXgXgXgXgXgXgXjXgXjXjXkXjXjXkXkXkXkXzXzXzXxXxXxXbXxXxXxXxXxXmXxXxXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXnXbXnXxXzXbXnXnXmXmXmXmXmXmXmXmXxXnXnXnXbXbXbX",
+"iXyXdXdXiXdXdXdXsXiXiXiXuXuXyXyXwXtXwXyXtXtXtXwXqXyXtXtXtXiXyXiXuXdXdXdXdXdXdXdXdXdXdXdXdXdXdXvXdXdXvXdXaXdXdXdXiXdXuXdXiXuXiXuXiXuXiXiXyXdXuXuXyXdXyXdXuXuXyXdXdXdXiXiXuXiXuXdXdXdXdXiXdXdXdXdXdXdXgXdXgXdXgXdXgXgXgXdXgXgXgXgXdXgXgXgXgXvXgXgXjXjXjXjXjXjXjXjXkXkXkXkXkXkXkXkXzXzXzXzXxXxXxXxXxXxXmXxXmXxXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXnXmXbXmXmXbXbXmXmXmXmXmXmXmXmXnXnXnXmXbXnXbX"
+};
diff --git a/images/coal.xpm b/images/coal.xpm
new file mode 100644 (file)
index 0000000..c5eb48f
--- /dev/null
@@ -0,0 +1,85 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"64 64 14 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F m #ffffff",
+"b c #0000E6",
+"c c #3F3F3F",
+"d c #007F00",
+"e c #6666E6",
+"f c #FF0000",
+"g c #997E4C",
+"h c #00E600",
+"i c #FFFFFF",
+"j c #FFFF00 m #000000",
+"k c #CC7E66",
+"l c #FF7B00",
+"m c #BFBFBF m #000000",
+/* pixels */
+"kkkkkkkkkkkkkkkkkmmmmmmmmmmmmmmmkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkmmfaaaaaaaaaaaafckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkmmmmmmmmmmmaaaaaaaaaaaaaaackkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"jjjjjjmmlaaaaammmmaaaaaaaaaaaaaaaacjjjjjjjjjjjjjjjjjjjjjjjjjjjjj",
+"jkkkkmmmaaaaammmmmaaaaaaaaaaaaaacaackkkkkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkkmmmmaaaaammmmmaaaaaaaaaaaaac``aackkkkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkmmmmmaaaaammmmmaaaaaaaaaaaac``aaaackkkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkmmmmmaaaaammmmmaaaaaaaaaaac``aaaaackkkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkmmmmmaicaammmmmaaaaaaaaaae``aaaaaackkkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkmammmaicaammmimaaaaaaaaaeebaaaaaaackkkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkaammmaaaaammiamaaaaaaaacebaaaaaaaackkkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkammmmaaaaamiammaaaaacac``aaaaaaaaackkkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkmmmmmaaaaamammmaaaaaac``aaaaacaaaackkkkkkkkkkkckkckkckkckkckj",
+"jkkmmmmmaaaaammmmmaaaaaa``aaaaac``aaackkkkkkkkkkckkckkckkckkckkj",
+"jkkmammmaaaaammmmmaaaaacaacaaac``aaaackkkkkkkkkkkgkkgkkgkkgkkgkj",
+"jkkmmmmmaaaaammmmmaaaaaaaaaaac``aaaaacgkkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkmammmaaaaammmmmaaaaaaaaaae``aaaaaacggkkkkkkkkkckkkkkkkkkkkckj",
+"jkkmmmmmaaaaammmmmaaaaaaaaaeebaaaaaaacggkkkkkkkkckkkkkkkkkkkckkj",
+"jkkmammmaaaaammmmmaaaaaaaacebaaaaaaaacggkkkkkkkkkgkkkkkkkkkkkgkj",
+"jkkmmmmmaaaaammmmmaaaaacac``aaaaaaaaacggkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkmammmaaaaammmimaaaaaac``aaaaacaaaacggkkkkkkkkkckkkkkkkkkkkckj",
+"jkkmmmmmaaaaammiamaaaaaa``aaaaac``aaacggkkkkkkkkckkkkkkkkkkkckkj",
+"jkkmmmmicaaaamiammaaaaacaacaaac``aaaacggkkkkkkkkkgkkkkkkkkkkkgkj",
+"jkkmmmiaaaaaamammmaaaaaaaaaaac``aaaaacggkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkmmiamaaaaammmmma`aaaaaaaae``aaaaaacggkkkckkckkckkkkkkkkkkkckj",
+"jkkmiammaaaaammmmmaaaaaaaaaeebaaaaaaacggkkckkckkckkkkkkkkkkkckkj",
+"jkkiammmaaaaammmmmaaaaaaaacebaaaaaaaacggkkkgkkgkkgkkkkkkkkkkkgkj",
+"jkkammmicaaaammmmmaaaaacac``aaaaaaaaacggkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkmmmiaaaaaammmmma`aaaac``aaaaacaaaacggkkkckkkkkkkkkkkkkkkkkckj",
+"jkkmmiamaaaaammmmmaaaaaa``aaaaac``aaacggkkckkkkkkkkkkkkkkkkkckkj",
+"jkkmiammaaaaammmmmaaaaacaacaaac``aaaacggkkkgkkkkkkkkkkkkkkkkkgkj",
+"jkkiammmaaaaammmimaaaaaaaaaaac``aaaaacggkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkammmmaaaaammiama`aaaaaaaae``aaaaaacggkkkckkkkkkkkkkkkkkkkkckj",
+"jkkmmmmmaaaaamiammaaaaaaaaaeebaaaaaaacggkkckkkkkkkkkkkkkkkkkckkj",
+"jkkmmmmmaaaaamammmaaaaaaaacebaaaaaaaacggkkkgkkkkkkkkkkkkkkkkkgkj",
+"jkkmmmamaaaaammmmmaaaaacac``aaaaaaaaacggkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkmmaamaicicmmmmma`aaaac``aaaaaaaaaacggkkkckkkkkkkkkkkkkkkkkckj",
+"jkkmamamaicicmmmmmaaaaaa``aaaaaaaaaacgggkkckkkkkkkkkkkkkkkkkckkj",
+"jkkammamaaaaammmmmaaaaacaacaaaaaaaacggggkkkgkkkkkkkkkkkkkkkkkgkj",
+"jkkmmaamaicicmmmmmaaaaaaaaaaaaaaaaccggggkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkmamamaaaaammmamaaaaaaaaaaaaaaacacggggkkkckkckkckkckkckkckkckj",
+"jkkammamaicicmmmmmfaaaaaaaaaaaafcaacggggkkckkckkckkckkckkckkckkj",
+"jkkmmaamaaaaamammaccccccccccccccaaacggggkkkgkkgkkgkkgkkgkkgkkgkj",
+"jkkmamamaicicmmmaccccccccccccccaaaacggggkkkkkkkkkkkkkkkkkkkkkkkj",
+"jkkammamaicicmmaccccccccccccccaaaaacgcccaaaddaaaaaaaaaaaaaaakkkj",
+"jkkmmammaaaaamaccccccccccccccaaa`aacgcccaaaddaaaaaaaaaaaaaaakkkj",
+"jkkmammmaaaaaaccccccccccccccaaaaaaacgcccaaaddaaaaaaaaaaaaaaaaaaa",
+"jkkammmmaaaaaaaaaaaaaaaaaaaaaaaa`aacgccaaaaaaaaaaaaaaaaaaaaaaaaa",
+"jkkmmmmmaaaaaaaaaaaaajaaaaaaaaaaaaacgcaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"jkkmmmmmaacaaaaaaajajaaaacaaaaaa`aaccaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"jkkmmmmmaaaaaaaaajjjaaaaaaaaaaaaaaacgaaaaaaaaaaaaaaaaaaaaaaakkkj",
+"jkkmmmmmaacaaaaajjjaaaaaacaaaaaa`aacgaaaaaaaaaaaaaaaabbaaaaakhkj",
+"jkkmmmmmaaaaaaajajaaaaaaaaaaaaaaaaacgaaaaaaaaaaaaaaaabbaaaaahkkj",
+"jkkmmmmmaacaaajaaaaaaaaaacaaaaaa`aacgaaaaaaaaaaaaaaaabbaaaaakkkj",
+"jkkmmmmmlaaaaaaaaaaaaaaaaaaaaaaaaalcgaaaaaaaaaaaaaaaaaaaaaaakkkj",
+"jkkmmmmmccccccccccccccccccccccccccccgaaaaaaaaaaaaaaaaaaaaaaakhkj",
+"jkkmmmmccccccccccccccccccccccccccccggaaaaaaaaaaaaaaaaaaaaaaakkkj",
+"jkkmmmccccccccccccccccccccccccccccgggaaggaaaaaaaaaaaaaaaaaaakhkj",
+"jkkmmcccc`cc`cccccccccccc`ccc`cccggggaaggaaabbaddaaaaaaaaaaakkkj",
+"jkkmccccccccccccccccccccccccccccgggggaaggaaabbaddaaaaaaaaaaahhkj",
+"jkkkgggggggggggggggggggggggggggggggggaaaaaaabbaddaaaaaaaaaaakkkj",
+"jkkkkggggggggggggggggggggggggggdggdgghkkhkkhkkhkkhkaaaakkkkkkkkj",
+"jkkkkkgggggggggggggggggggggggggggggggkkkkkkkkkkkkkkaaaakkhkhkkkj",
+"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjaaaajjjjjjjjj"
+};
diff --git a/images/com.xpm b/images/com.xpm
new file mode 100644 (file)
index 0000000..d0cf8a5
--- /dev/null
@@ -0,0 +1,58 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"48 48 3 1",
+/* colors */
+"` c #000000",
+"a c #6666E6 m #000000",
+"b c #CC7E66 m #ffffff",
+/* pixels */
+"`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"`a`````````````````````````````````````````````a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbb`aaaaabbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbb`aa```aabbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aa`bbb`aabbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aabbbbb``bbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aabbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aabbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aabbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aabbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aabbbbbaabbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb``aabbbaa`bbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbb``aaaaa`bbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbb``````bbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"````````````````````````````````````````````````"
+};
diff --git a/images/demandg.xpm b/images/demandg.xpm
new file mode 100644 (file)
index 0000000..bd46ce8
--- /dev/null
@@ -0,0 +1,59 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"39 47 5 1",
+/* colors */
+"` c #000000",
+"a c #007F00",
+"b c #FF0000",
+"c c #FFFFFF",
+"d c #CFCFCF",
+/* pixels */
+"```````````````````````````````````````",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`cccaccccccccccccccccccccccccccccccccc`",
+"`cccaccccccccccccccccccccccccccccccccc`",
+"`caaaaaccccccccccccccccccccccccccccccc`",
+"`cccaccccccccccccccccccccccccccccccccc`",
+"`cccaccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccc````````````````````````````````cc`",
+"`cc``dddddddddddddddddddddddddddddd`cc`",
+"`cc``dddd```ddddddd```ddddddd`ddddd`cc`",
+"`cc``dddd`dd`ddddd`ddd`dddddd`ddddd`cc`",
+"`cc``dddd`dd`ddddd`dddddddddd`ddddd`cc`",
+"`cc``dddd```dddddd`dddddddddd`ddddd`cc`",
+"`cc``dddd`dd`ddddd`ddd`dddddd`ddddd`cc`",
+"`cc``dddd`dd`dddddd```ddddddd`ddddd`cc`",
+"`cc``dddddddddddddddddddddddddddddd`cc`",
+"`cc`````````````````````````````````cc`",
+"`cc````````````````````````````````ccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`cbbbbbccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"`ccccccccccccccccccccccccccccccccccccc`",
+"```````````````````````````````````````"
+};
diff --git a/images/fire.xpm b/images/fire.xpm
new file mode 100644 (file)
index 0000000..f4a45bd
--- /dev/null
@@ -0,0 +1,68 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"48 48 13 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F m #ffffff",
+"b c #0000E6",
+"c c #3F3F3F m #ffffff",
+"d c #007F00 m #ffffff",
+"e c #FF0000",
+"f c #997E4C",
+"g c #00E600",
+"h c #FFFF00 m #000000",
+"i c #CC7E66",
+"j c #FF7B00",
+"k c #7F7F7F m #000000",
+"l c #3F3F3F m #000000",
+/* pixels */
+"`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+"`e`````````````````````````````````````````````e",
+"`eggdggggggggggggggggggggggggggggggggggggggggd`e",
+"`egdgggggggggggdgggggggggggdgggggggggggggggggg`e",
+"`eggddggdggggggggggggggdgggggggggaaaaaaaaaaagg`e",
+"`edgddgdgggggggggggggggggagggggggaaaaaaaaaaagg`e",
+"`egdggggeeeeeeeeeeeeeeeeaeeeeeeee`jjjaaabbbagg`e",
+"`egdgggee``````````````a````````eajjjaaabbbagg`e",
+"`eggggeeecccccccacccccacccccccc`eaaaaaaaaaaagg`e",
+"`egggeeeeccccccaccccccccccccccc`ecaaaaaaiiiagg`e",
+"`eggeefeecccccacccccccccccccccc`ecaaaaaaiiiagg`e",
+"`eggeefeeccccaccccccccccccccccc`ecaaaaaaaaaagg`e",
+"`eggeeeeecccccccccccccccccccccc`ec``aaaaaaaagg`e",
+"`eggeeeeecccccccccccccccccccccc`ec``aaaaaaaagg`e",
+"`eggefefeccceeeeeeeeeeeeeeeeeeeeeeeeeaaaaaaagg`e",
+"`eggefefecceeccccccccccccccccccccccceaka`akakakk",
+"`eggeeeeeceeeaaaaaaaaaaaaaaaaaaaaaacekakakakakkk",
+"`edgeefeeeefeaaaaaaaaaaaaaaaaaaaaaaceakakakakakk",
+"`eggeefefeefeaaaaaaaaaaaaaaaaaaaaaacekakakakakkk",
+"`eggeeeefeeeeaachhhhhhhachhhhhaaaaacecaaaaaagg`e",
+"`eggefeeeeeeeaachhhhhhhachhhhhhaaaacecaaaaaagg`e",
+"`eggefeeeefeeaachhcccccachhcchhhaaacecaaaaaagg`e",
+"`eggeeefeefeeaachhaaaaaachhaachhaaacecaaaaaagg`e",
+"`eggeeefeeeeeaachhaaaaaachhaachhaaacefffffffff`e",
+"`eggefeeefeeeaachhhhhhaachhaachhaaace````````f`e",
+"`eggefeeefefeaachhhhhhaachhaachhaaaceccccccc`f`e",
+"`eggeeeeeeefeaachhccccaachhaachhaaacecca`ccc`f`e",
+"`eggeeefeeeeeaachhaaaaaachhaachhaaacecccccac`f`e",
+"`edgeeefeeeeeaachhaaaaaachhaahhhaaaceccccacc`f`e",
+"`eggefeeeeeeeaachhaaaaaachhhhhhcaaacecccaccc`f`e",
+"`eggefeeefeeeaachhaaaaaachhhhhcaaaaceccacccc`f`e",
+"`eggeeefefeeeaacccaaaaaaccccccaaaaaceccccccc`f`e",
+"`eggeeefeeeeeaaaaaaaaaaaaaaaaaaaaaaceccccccc`e`e",
+"`eggeeeeeefeeaaaaaaaaaaaaaaaaaaaaaaceccccccc`e`e",
+"`eggefeeeefeeeeeeeeeeeeeeeeeeeeeeeeeeccccccc`e`e",
+"`eggefefeeeeeeeeeeeeeeeeeeeeeeeeeeeecca`a`cc`e`e",
+"`eggeeefeeeeeeeeeeeeeeeeeeeeeeeeeeeccca`a`cc`e`e",
+"`eggeeeeeeeeeeeeeeeeeeeeeeeeeeeeeecccccccccc`e`e",
+"`eggefeeeeeee```````eee```````eeeeeeeeeeeeeeee`e",
+"`eggefeeeeee`flflfceee`flflfceeeeeeeeeeeeeeeeg`e",
+"`eggeeeeeee`flflfceee`flflfceeeceeceeeeeeceedg`e",
+"`edgeeeeee`flflfceee`flflfceee`ce`ce``ee`ceddg`e",
+"`eggeeeee`fififieee`fififieeeeeeeee``eeeeedddg`e",
+"`egggdddddlclcldddddlclclddddddddddddddddddddg`e",
+"`eggggddddclclcdddddclclcddddddddddddddddddddg`e",
+"`eggdggdddlclcldddddlclclddddddddddggggggdgggg`e",
+"`eeeeeeefflllllffffflllllffffffffffeeeeeeeeeeeee",
+"``````````lllll`````lllll```````````````````````"
+};
diff --git a/images/gr10.xpm b/images/gr10.xpm
new file mode 100644 (file)
index 0000000..3f685af
--- /dev/null
@@ -0,0 +1,39 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"69 26 6 1",
+/* colors */
+"` c #000000",
+"a c #3F3F3F",
+"b c #727272 m #ffffff",
+"c c #FFFF00",
+"d c #FFBB00",
+"e c #DFDFDF",
+/* pixels */
+"`````````````````````````````````````````````````````````````````````",
+"``eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee``",
+"`e`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`b`",
+"`ee`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`bb`",
+"`eee`````````````````````````````````````````````````````````````bbb`",
+"`eee`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`bbb`",
+"`eee`aaaaaaacddaaaaacddaaaaaacdddaaacddddddddaaaacddddaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaacdaaaacdacdaaaaaacddaaacdacdaacddaacdaacdaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaacdaaacdaaacdaaaaaacddacdaacdaaacdaacdaacdaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaacdaaacdaaacdaaaaaaacdddaaacdaaacdaacddaaaaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaacdaaacdaaacdaaaaaaacddaaaacdaacddaaacddaaaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaacdaaacdaaacdaaaaaaaacdaaaacdddddaaaaacddaaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaacdaaacdaaacdaaaaaaaacdaaaacdcddaaaaaaacddaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaacdaaacdaaacdaaaaaaaacdaaaacdacddaaacdaacdaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaacdaaaacdacdaaaaaaaaacdaaaacdaacddaacdaacdaaaaaaaaaa`bbb`",
+"`eee`aaaaaaacdddaaaacddaaaaaaaaacdddaacdddaacdddcddddaaacdaaaaaa`bbb`",
+"`eee`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`bbb`",
+"`eee`````````````````````````````````````````````````````````````bbb`",
+"`ee`bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`bb`",
+"`e`bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`b`",
+"``bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb``",
+"`````````````````````````````````````````````````````````````````````"
+};
diff --git a/images/gr10hi.xpm b/images/gr10hi.xpm
new file mode 100644 (file)
index 0000000..f7631b6
--- /dev/null
@@ -0,0 +1,39 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"69 26 6 1",
+/* colors */
+"` c #000000 m #ffffff",
+"a c #00FFFF m #000000",
+"b c #727272 m #000000",
+"c c #FFFF00 m #ffffff",
+"d c #DFDFDF m #000000",
+"e c #0000FF m #000000",
+/* pixels */
+"`````````````````````````````````````````````````````````````````````",
+"``bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb``",
+"`b`bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`d`",
+"`bb`bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`dd`",
+"`bbb`````````````````````````````````````````````````````````````ddd`",
+"`bbb`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`ddd`",
+"`bbb`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`ddd`",
+"`bbb`cccccccaeecccccaeeccccccaeeecccaeeeeeeeeccccaeeeecccccccccc`ddd`",
+"`bbb`ccccccccaeccccaecaeccccccaeecccaecaeccaeeccaeccaecccccccccc`ddd`",
+"`bbb`ccccccccaecccaecccaeccccccaeecaeccaecccaeccaeccaecccccccccc`ddd`",
+"`bbb`ccccccccaecccaecccaecccccccaeeecccaecccaeccaeeccccccccccccc`ddd`",
+"`bbb`ccccccccaecccaecccaecccccccaeeccccaeccaeecccaeecccccccccccc`ddd`",
+"`bbb`ccccccccaecccaecccaeccccccccaeccccaeeeeecccccaeeccccccccccc`ddd`",
+"`bbb`ccccccccaecccaecccaeccccccccaeccccaeaeecccccccaeecccccccccc`ddd`",
+"`bbb`ccccccccaecccaecccaeccccccccaeccccaecaeecccaeccaecccccccccc`ddd`",
+"`bbb`ccccccccaeccccaecaecccccccccaeccccaeccaeeccaeccaecccccccccc`ddd`",
+"`bbb`cccccccaeeeccccaeecccccccccaeeeccaeeeccaeeeaeeeecccaecccccc`ddd`",
+"`bbb`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`ddd`",
+"`bbb`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`ddd`",
+"`bbb`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`ddd`",
+"`bbb`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`ddd`",
+"`bbb`````````````````````````````````````````````````````````````ddd`",
+"`bb`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`dd`",
+"`b`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`d`",
+"``ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd``",
+"`````````````````````````````````````````````````````````````````````"
+};
diff --git a/images/gr120.xpm b/images/gr120.xpm
new file mode 100644 (file)
index 0000000..a13b435
--- /dev/null
@@ -0,0 +1,39 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"69 26 6 1",
+/* colors */
+"` c #000000",
+"a c #3F3F3F",
+"b c #727272 m #ffffff",
+"c c #FFFF00",
+"d c #FFBB00",
+"e c #DFDFDF",
+/* pixels */
+"`````````````````````````````````````````````````````````````````````",
+"``eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee``",
+"`e`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`b`",
+"`ee`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`bb`",
+"`eee`````````````````````````````````````````````````````````````bbb`",
+"`eee`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`bbb`",
+"`eee`aaacddaaaacdddaaaacddaaaaaacdddaaacddddddddaaaacddddaaaaaaa`bbb`",
+"`eee`aaaacdaaacdaacdaacdacdaaaaaacddaaacdacdaacddaacdaacdaaaaaaa`bbb`",
+"`eee`aaaacdaaacdaacdacdaaacdaaaaaacddacdaacdaaacdaacdaacdaaaaaaa`bbb`",
+"`eee`aaaacdaaaaaaacdacdaaacdaaaaaaacdddaaacdaaacdaacddaaaaaaaaaa`bbb`",
+"`eee`aaaacdaaaaaaacdacdaaacdaaaaaaacddaaaacdaacddaaacddaaaaaaaaa`bbb`",
+"`eee`aaaacdaaaaaacdaacdaaacdaaaaaaaacdaaaacdddddaaaaacddaaaaaaaa`bbb`",
+"`eee`aaaacdaaaaaacdaacdaaacdaaaaaaaacdaaaacdcddaaaaaaacddaaaaaaa`bbb`",
+"`eee`aaaacdaaaaacdaaacdaaacdaaaaaaaacdaaaacdacddaaacdaacdaaaaaaa`bbb`",
+"`eee`aaaacdaaaacdaacdacdacdaaaaaaaaacdaaaacdaacddaacdaacdaaaaaaa`bbb`",
+"`eee`aaacdddaacdddddaaacddaaaaaaaaacdddaacdddaacdddcddddaaacdaaa`bbb`",
+"`eee`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`bbb`",
+"`eee`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`bbb`",
+"`eee`````````````````````````````````````````````````````````````bbb`",
+"`ee`bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`bb`",
+"`e`bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`b`",
+"``bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb``",
+"`````````````````````````````````````````````````````````````````````"
+};
diff --git a/images/gr120hi.xpm b/images/gr120hi.xpm
new file mode 100644 (file)
index 0000000..4f01ce6
--- /dev/null
@@ -0,0 +1,39 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"69 26 6 1",
+/* colors */
+"` c #000000 m #ffffff",
+"a c #00FFFF m #000000",
+"b c #727272 m #000000",
+"c c #FFFF00 m #ffffff",
+"d c #DFDFDF m #000000",
+"e c #0000FF m #000000",
+/* pixels */
+"`````````````````````````````````````````````````````````````````````",
+"``bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb``",
+"`b`bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`d`",
+"`bb`bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`dd`",
+"`bbb`````````````````````````````````````````````````````````````ddd`",
+"`bbb`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`ddd`",
+"`bbb`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`ddd`",
+"`bbb`cccaeeccccaeeeccccaeeccccccaeeecccaeeeeeeeeccccaeeeeccccccc`ddd`",
+"`bbb`ccccaecccaeccaeccaecaeccccccaeecccaecaeccaeeccaeccaeccccccc`ddd`",
+"`bbb`ccccaecccaeccaecaecccaeccccccaeecaeccaecccaeccaeccaeccccccc`ddd`",
+"`bbb`ccccaecccccccaecaecccaecccccccaeeecccaecccaeccaeecccccccccc`ddd`",
+"`bbb`ccccaecccccccaecaecccaecccccccaeeccccaeccaeecccaeeccccccccc`ddd`",
+"`bbb`ccccaeccccccaeccaecccaeccccccccaeccccaeeeeecccccaeecccccccc`ddd`",
+"`bbb`ccccaeccccccaeccaecccaeccccccccaeccccaeaeecccccccaeeccccccc`ddd`",
+"`bbb`ccccaecccccaecccaecccaeccccccccaeccccaecaeecccaeccaeccccccc`ddd`",
+"`bbb`ccccaeccccaeccaecaecaecccccccccaeccccaeccaeeccaeccaeccccccc`ddd`",
+"`bbb`cccaeeeccaeeeeecccaeecccccccccaeeeccaeeeccaeeeaeeeecccaeccc`ddd`",
+"`bbb`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`ddd`",
+"`bbb`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`ddd`",
+"`bbb`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`ddd`",
+"`bbb`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`ddd`",
+"`bbb`````````````````````````````````````````````````````````````ddd`",
+"`bb`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`dd`",
+"`b`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`d`",
+"``ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd``",
+"`````````````````````````````````````````````````````````````````````"
+};
diff --git a/images/grcom.xpm b/images/grcom.xpm
new file mode 100644 (file)
index 0000000..8f91806
--- /dev/null
@@ -0,0 +1,54 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"32 32 15 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #00BF00",
+"c c #3F3F3F",
+"d c #3F3F00",
+"e c #003F00",
+"f c #FF3C00",
+"g c #3C00BF",
+"h c #727272",
+"i c #FFFFFF",
+"j c #FFFF00",
+"k c #DFDFDF",
+"l c #7F3D00",
+"m c #3C00FF",
+"n c #BFBFBF",
+/* pixels */
+"````````````````````````````````",
+"``kkkkkkkkkkkkkkkkkkkkkkkkkkkk``",
+"`k`kkkkkkkkkkkkkkkkkkkkkkkkkk`h`",
+"`kk`kkkkkkkkkkkkkkkkkkkkkkkk`hh`",
+"`kkk````````````````````````hhh`",
+"`kkk`gggggggggggggggggggggg`hhh`",
+"`kkk`gggggggggggggggggggggg`hhh`",
+"`kkk`gmgmgmgmgmgmgmgmgmgmgm`hhh`",
+"`kkk`mgmgmglllllgmgmgmgmgmg`hhh`",
+"`kkk`gmmmgmlddddmgmmmgmmmgm`hhh`",
+"`kkk`mmmmmmlcdcdmmmmmmmmmmm`hhh`",
+"`kkk`mmmmmmlddddmmmmmmmmmmm`hhh`",
+"`kkk`mmmmmmlcdaaaaaaammmmmm`hhh`",
+"`kkk`mmmmmmlddinnnnnnnmmmmm`hhh`",
+"`kkk`mmjaaaacdincncncnmmmmm`hhh`",
+"`kkk`mmjfffffdinnnnnnnmmmmm`hhh`",
+"`kkk`mmjfffffdincncncnmmmmm`hhh`",
+"`kkk`mmjfafafdinnnnnnnmmmmm`hhh`",
+"`kkk`eejfffffdincncncneeeee`hhh`",
+"`kkk`eejfffffdinnnnnnneeeee`hhh`",
+"`kkk`eejfafafdincncncneeeee`hhh`",
+"`kkk`eejfffffdinnnnnnneeeee`hhh`",
+"`kkk`eejfffffeincncncneeebe`hhh`",
+"`kkk`ebjfafafeinnnnnnnbebeb`hhh`",
+"`kkk`bebfffffbincncncnebebe`hhh`",
+"`kkk`bbbbbbbbbbnnnnnnnbbbbb`hhh`",
+"`kkk`bbbbbbbbbbbbbbbbbbbbbb`hhh`",
+"`kkk````````````````````````hhh`",
+"`kk`hhhhhhhhhhhhhhhhhhhhhhhh`hh`",
+"`k`hhhhhhhhhhhhhhhhhhhhhhhhhh`h`",
+"``hhhhhhhhhhhhhhhhhhhhhhhhhhhh``",
+"````````````````````````````````"
+};
diff --git a/images/grcomhi.xpm b/images/grcomhi.xpm
new file mode 100644 (file)
index 0000000..1d48fd6
--- /dev/null
@@ -0,0 +1,54 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"32 32 15 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #00BF00",
+"c c #3F3F3F",
+"d c #00007F",
+"e c #3F3F00",
+"f c #003F00",
+"g c #FF3C00",
+"h c #3C00BF",
+"i c #FFFFFF",
+"j c #FFFF00",
+"k c #7F3D00",
+"l c #3C00FF",
+"m c #BFBFBF",
+"n c #0000FF",
+/* pixels */
+"````````````````````````````````",
+"``dddddddddddddddddddddddddddd``",
+"`d`dddddddddddddddddddddddddd`n`",
+"`dd`dddddddddddddddddddddddd`nn`",
+"`ddd````````````````````````nnn`",
+"`ddd`hhhhhhhhhhhhhhhhhhhhhh`nnn`",
+"`ddd`hhhhhhhhhhhhhhhhhhhhhh`nnn`",
+"`ddd`hlhlhlhlhlhlhlhlhlhlhl`nnn`",
+"`ddd`lhlhlhkkkkkhlhlhlhlhlh`nnn`",
+"`ddd`hlllhlkeeeelhlllhlllhl`nnn`",
+"`ddd`llllllkcecelllllllllll`nnn`",
+"`ddd`llllllkeeeelllllllllll`nnn`",
+"`ddd`llllllkceaaaaaaallllll`nnn`",
+"`ddd`llllllkeeimmmmmmmlllll`nnn`",
+"`ddd`lljaaaaceimcmcmcmlllll`nnn`",
+"`ddd`lljgggggeimmmmmmmlllll`nnn`",
+"`ddd`lljgggggeimcmcmcmlllll`nnn`",
+"`ddd`lljgagageimmmmmmmlllll`nnn`",
+"`ddd`ffjgggggeimcmcmcmfffff`nnn`",
+"`ddd`ffjgggggeimmmmmmmfffff`nnn`",
+"`ddd`ffjgagageimcmcmcmfffff`nnn`",
+"`ddd`ffjgggggeimmmmmmmfffff`nnn`",
+"`ddd`ffjgggggfimcmcmcmfffbf`nnn`",
+"`ddd`fbjgagagfimmmmmmmbfbfb`nnn`",
+"`ddd`bfbgggggbimcmcmcmfbfbf`nnn`",
+"`ddd`bbbbbbbbbbmmmmmmmbbbbb`nnn`",
+"`ddd`bbbbbbbbbbbbbbbbbbbbbb`nnn`",
+"`ddd````````````````````````nnn`",
+"`dd`nnnnnnnnnnnnnnnnnnnnnnnn`nn`",
+"`d`nnnnnnnnnnnnnnnnnnnnnnnnnn`n`",
+"``nnnnnnnnnnnnnnnnnnnnnnnnnnnn``",
+"````````````````````````````````"
+};
diff --git a/images/grcrim.xpm b/images/grcrim.xpm
new file mode 100644 (file)
index 0000000..2eafe92
--- /dev/null
@@ -0,0 +1,47 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"32 32 8 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #3F3F3F",
+"c c #3F3F00",
+"d c #727272",
+"e c #DFDFDF",
+"f c #7F3D00",
+"g c #BFBFBF",
+/* pixels */
+"````````````````````````````````",
+"``eeeeeeeeeeeeeeeeeeeeeeeeeeee``",
+"`e`eeeeeeeeeeeeeeeeeeeeeeeeee`d`",
+"`ee`eeeeeeeeeeeeeeeeeeeeeeee`dd`",
+"`eee````````````````````````ddd`",
+"`eee`gggggggggggggggggggggg`ddd`",
+"`eee`gggggggggggggggggggggg`ddd`",
+"`eee`gggggggggggggggggggggg`ddd`",
+"`eee`ggbbgb``````gggggggbgg`ddd`",
+"`eee`ggg```bbbbbbbbbbbbb`gg`ddd`",
+"`eee`ggg```b```b`````````gg`ddd`",
+"`eee`ggg```b```b`gggggggggg`ddd`",
+"`eee`ggg`````````gggggggagg`ddd`",
+"`eee`ggcc``gbg`gggggggabggg`ddd`",
+"`eee`ggccc`gbg`gggggabbaggg`ddd`",
+"`eee`gccccg```ggggabbabgggg`ddd`",
+"`eee`gcfccgggggggabbabagggg`ddd`",
+"`eee`gccccggggggabbabbggggg`ddd`",
+"`eee`gccccgg`gggbbabbaggggg`ddd`",
+"`eee`ggggggga`gababbagggggg`ddd`",
+"`eee`gggggggga`babbaggggggg`ddd`",
+"`eee`ggggggggga`baggggggggg`ddd`",
+"`eee`ggggggggcca`gggggggggg`ddd`",
+"`eee`gggggggcfcga`ggggggggg`ddd`",
+"`eee`ggggggcfcggga`gggggggg`ddd`",
+"`eee`ggggggccgggggggggggggg`ddd`",
+"`eee`gggggggggggggggggggggg`ddd`",
+"`eee````````````````````````ddd`",
+"`ee`dddddddddddddddddddddddd`dd`",
+"`e`dddddddddddddddddddddddddd`d`",
+"``dddddddddddddddddddddddddddd``",
+"````````````````````````````````"
+};
diff --git a/images/grcrimhi.xpm b/images/grcrimhi.xpm
new file mode 100644 (file)
index 0000000..1f19ccd
--- /dev/null
@@ -0,0 +1,47 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"32 32 8 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #3F3F3F",
+"c c #3F3F00",
+"d c #7F0000",
+"e c #FF0000",
+"f c #7F3D00",
+"g c #BFBFBF",
+/* pixels */
+"````````````````````````````````",
+"``dddddddddddddddddddddddddddd``",
+"`d`dddddddddddddddddddddddddd`e`",
+"`dd`dddddddddddddddddddddddd`ee`",
+"`ddd````````````````````````eee`",
+"`ddd`gggggggggggggggggggggg`eee`",
+"`ddd`gggggggggggggggggggggg`eee`",
+"`ddd`gggggggggggggggggggggg`eee`",
+"`ddd`ggbbgb``````gggggggbgg`eee`",
+"`ddd`ggg```bbbbbbbbbbbbb`gg`eee`",
+"`ddd`ggg```b```b`````````gg`eee`",
+"`ddd`ggg```b```b`gggggggggg`eee`",
+"`ddd`ggg`````````gggggggagg`eee`",
+"`ddd`ggcc``gbg`gggggggabggg`eee`",
+"`ddd`ggccc`gbg`gggggabbaggg`eee`",
+"`ddd`gccccg```ggggabbabgggg`eee`",
+"`ddd`gcfccgggggggabbabagggg`eee`",
+"`ddd`gccccggggggabbabbggggg`eee`",
+"`ddd`gccccgg`gggbbabbaggggg`eee`",
+"`ddd`ggggggga`gababbagggggg`eee`",
+"`ddd`gggggggga`babbaggggggg`eee`",
+"`ddd`ggggggggga`baggggggggg`eee`",
+"`ddd`ggggggggcca`gggggggggg`eee`",
+"`ddd`gggggggcfcga`ggggggggg`eee`",
+"`ddd`ggggggcfcggga`gggggggg`eee`",
+"`ddd`ggggggccgggggggggggggg`eee`",
+"`ddd`gggggggggggggggggggggg`eee`",
+"`ddd````````````````````````eee`",
+"`dd`eeeeeeeeeeeeeeeeeeeeeeee`ee`",
+"`d`eeeeeeeeeeeeeeeeeeeeeeeeee`e`",
+"``eeeeeeeeeeeeeeeeeeeeeeeeeeee``",
+"````````````````````````````````"
+};
diff --git a/images/grind.xpm b/images/grind.xpm
new file mode 100644 (file)
index 0000000..361f82e
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"32 32 9 1",
+/* colors */
+"` c #000000",
+"a c #3F3F3F",
+"b c #3F3F00",
+"c c #003F00",
+"d c #FF3C00",
+"e c #727272",
+"f c #DFDFDF",
+"g c #7F3D00",
+"h c #3C00FF",
+/* pixels */
+"````````````````````````````````",
+"``ffffffffffffffffffffffffffff``",
+"`f`ffffffffffffffffffffffffff`e`",
+"`ff`ffffffffffffffffffffffff`ee`",
+"`fff````````````````````````eee`",
+"`fff`hhhhhhhhhhhhhhgbbbbbhh`eee`",
+"`fff`hhhhhhhhhhhhbbbbgbgbhb`eee`",
+"`fff`hhhhhhhhhhhhgbgbhb`bbh`eee`",
+"`fff`hhhhhhhhhhbgbbbgbbbhbh`eee`",
+"`fff`hhhhhhhhhbbbgbhbbbhbhh`eee`",
+"`fff`hhhhhhhhhbbb`bbbbbhhhh`eee`",
+"`fff`hhhhhhhggbbhbbgbhhhbhh`eee`",
+"`fff`hhhhhhbbbhhgbbhhhhhhbh`eee`",
+"`fff`hhhhhhbbhhbbhhhhhhhghh`eee`",
+"`fff`hhhhgbh`bbbhhhbhhhbbhb`eee`",
+"`fff`hhhhbbhgbbhhhhhhhhgbgb`eee`",
+"`fff`hhhbhhbhhhhhhhhhhgbbhh`eee`",
+"`fff`hhbhhbhhhhhhhhhhggbbbh`eee`",
+"`fff`hh`h`hhhhhhhhhhhbhbhhh`eee`",
+"`fff`hh`h`hhhhhhhhhhbhbhhhh`eee`",
+"`fff`hh`h`hhhhhhhhhahahhhhh`eee`",
+"`fff`hh`h`hhhhhhhhhahahhhhh`eee`",
+"`fff`h````````hhhaaaaahhhhh`eee`",
+"`fff`c``a`a```ccca`a`accccc`eee`",
+"`fff`c````````cccccccdccccc`eee`",
+"`fff`cccccccccdcccdcccccccc`eee`",
+"`fff`cccccccccccccccccccccc`eee`",
+"`fff````````````````````````eee`",
+"`ff`eeeeeeeeeeeeeeeeeeeeeeee`ee`",
+"`f`eeeeeeeeeeeeeeeeeeeeeeeeee`e`",
+"``eeeeeeeeeeeeeeeeeeeeeeeeeeee``",
+"````````````````````````````````"
+};
diff --git a/images/grindhi.xpm b/images/grindhi.xpm
new file mode 100644 (file)
index 0000000..6f8473e
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"32 32 9 1",
+/* colors */
+"` c #000000",
+"a c #BFBF00",
+"b c #3F3F3F",
+"c c #3F3F00",
+"d c #003F00",
+"e c #FF3C00",
+"f c #FFFF00",
+"g c #7F3D00",
+"h c #3C00FF",
+/* pixels */
+"````````````````````````````````",
+"``aaaaaaaaaaaaaaaaaaaaaaaaaaaa``",
+"`a`aaaaaaaaaaaaaaaaaaaaaaaaaa`f`",
+"`aa`aaaaaaaaaaaaaaaaaaaaaaaa`ff`",
+"`aaa````````````````````````fff`",
+"`aaa`hhhhhhhhhhhhhhgccccchh`fff`",
+"`aaa`hhhhhhhhhhhhccccgcgchc`fff`",
+"`aaa`hhhhhhhhhhhhgcgchc`cch`fff`",
+"`aaa`hhhhhhhhhhcgcccgccchch`fff`",
+"`aaa`hhhhhhhhhcccgchccchchh`fff`",
+"`aaa`hhhhhhhhhccc`ccccchhhh`fff`",
+"`aaa`hhhhhhhggcchccgchhhchh`fff`",
+"`aaa`hhhhhhccchhgcchhhhhhch`fff`",
+"`aaa`hhhhhhcchhcchhhhhhhghh`fff`",
+"`aaa`hhhhgch`ccchhhchhhcchc`fff`",
+"`aaa`hhhhcchgcchhhhhhhhgcgc`fff`",
+"`aaa`hhhchhchhhhhhhhhhgcchh`fff`",
+"`aaa`hhchhchhhhhhhhhhggccch`fff`",
+"`aaa`hh`h`hhhhhhhhhhhchchhh`fff`",
+"`aaa`hh`h`hhhhhhhhhhchchhhh`fff`",
+"`aaa`hh`h`hhhhhhhhhbhbhhhhh`fff`",
+"`aaa`hh`h`hhhhhhhhhbhbhhhhh`fff`",
+"`aaa`h````````hhhbbbbbhhhhh`fff`",
+"`aaa`d``b`b```dddb`b`bddddd`fff`",
+"`aaa`d````````dddddddeddddd`fff`",
+"`aaa`dddddddddedddedddddddd`fff`",
+"`aaa`dddddddddddddddddddddd`fff`",
+"`aaa````````````````````````fff`",
+"`aa`ffffffffffffffffffffffff`ff`",
+"`a`ffffffffffffffffffffffffff`f`",
+"``ffffffffffffffffffffffffffff``",
+"````````````````````````````````"
+};
diff --git a/images/grmony.xpm b/images/grmony.xpm
new file mode 100644 (file)
index 0000000..3dd4b26
--- /dev/null
@@ -0,0 +1,47 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"32 32 8 1",
+/* colors */
+"` c #000000",
+"a c #00BF00",
+"b c #003F00",
+"c c #FF0000",
+"d c #727272",
+"e c #FFFF00",
+"f c #DFDFDF",
+"g c #BFBFBF",
+/* pixels */
+"````````````````````````````````",
+"``ffffffffffffffffffffffffffff``",
+"`f`ffffffffffffffffffffffffff`d`",
+"`ff`ffffffffffffffffffffffff`dd`",
+"`fff````````````````````````ddd`",
+"`fff`gggggggggggggggggggggg`ddd`",
+"`fff`gggggggggggggggggggggg`ddd`",
+"`fff`ggggggaaaaaagggg``gggg`ddd`",
+"`fff`ggggaaababbagggg``gggg`ddd`",
+"`fff`ggggaabbabaagg``````gg`ddd`",
+"`fff`gggggaaaaaaggg``````gg`ddd`",
+"`fff`ggggggaaaabggggg``gggg`ddd`",
+"`fff`gggggaaeaaabgggg``gggg`ddd`",
+"`fff`gggbaaeeeaaabggggggggg`ddd`",
+"`fff`ggaaaebebeaaabgggggggg`ddd`",
+"`fff`ggaaaeaeabaaabbggggggg`ddd`",
+"`fff`ggaaabeeeaaaabbggggggg`ddd`",
+"`fff`gbaaaabebeaaabbggggggg`ddd`",
+"`fff`gaaaaeaeaeaaabbggggggg`ddd`",
+"`fff`gaaaabeeebaaabbggggggg`ddd`",
+"`fff`ggaaaabebaaaabbggggggg`ddd`",
+"`fff`ggbaaaabaaaabbgggggggg`ddd`",
+"`fff`gggbaaaaaaabbggcccccgg`ddd`",
+"`fff`ggggbbbbbbbbgggcccccgg`ddd`",
+"`fff`gggggggggggggggggggggg`ddd`",
+"`fff`gggggggggggggggggggggg`ddd`",
+"`fff`gggggggggggggggggggggg`ddd`",
+"`fff````````````````````````ddd`",
+"`ff`dddddddddddddddddddddddd`dd`",
+"`f`dddddddddddddddddddddddddd`d`",
+"``dddddddddddddddddddddddddddd``",
+"````````````````````````````````"
+};
diff --git a/images/grmonyhi.xpm b/images/grmonyhi.xpm
new file mode 100644 (file)
index 0000000..96f550e
--- /dev/null
@@ -0,0 +1,47 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"32 32 8 1",
+/* colors */
+"` c #000000",
+"a c #007F00",
+"b c #00BF00",
+"c c #003F00",
+"d c #FF0000",
+"e c #FFFF00",
+"f c #005F00",
+"g c #BFBFBF",
+/* pixels */
+"````````````````````````````````",
+"``ffffffffffffffffffffffffffff``",
+"`f`ffffffffffffffffffffffffff`a`",
+"`ff`ffffffffffffffffffffffff`aa`",
+"`fff````````````````````````aaa`",
+"`fff`gggggggggggggggggggggg`aaa`",
+"`fff`gggggggggggggggggggggg`aaa`",
+"`fff`ggggggbbbbbbgggg``gggg`aaa`",
+"`fff`ggggbbbcbccbgggg``gggg`aaa`",
+"`fff`ggggbbccbcbbgg``````gg`aaa`",
+"`fff`gggggbbbbbbggg``````gg`aaa`",
+"`fff`ggggggbbbbcggggg``gggg`aaa`",
+"`fff`gggggbbebbbcgggg``gggg`aaa`",
+"`fff`gggcbbeeebbbcggggggggg`aaa`",
+"`fff`ggbbbececebbbcgggggggg`aaa`",
+"`fff`ggbbbebebcbbbccggggggg`aaa`",
+"`fff`ggbbbceeebbbbccggggggg`aaa`",
+"`fff`gcbbbbcecebbbccggggggg`aaa`",
+"`fff`gbbbbebebebbbccggggggg`aaa`",
+"`fff`gbbbbceeecbbbccggggggg`aaa`",
+"`fff`ggbbbbcecbbbbccggggggg`aaa`",
+"`fff`ggcbbbbcbbbbccgggggggg`aaa`",
+"`fff`gggcbbbbbbbccggdddddgg`aaa`",
+"`fff`ggggccccccccgggdddddgg`aaa`",
+"`fff`gggggggggggggggggggggg`aaa`",
+"`fff`gggggggggggggggggggggg`aaa`",
+"`fff`gggggggggggggggggggggg`aaa`",
+"`fff````````````````````````aaa`",
+"`ff`aaaaaaaaaaaaaaaaaaaaaaaa`aa`",
+"`f`aaaaaaaaaaaaaaaaaaaaaaaaaa`a`",
+"``aaaaaaaaaaaaaaaaaaaaaaaaaaaa``",
+"````````````````````````````````"
+};
diff --git a/images/grpoll.xpm b/images/grpoll.xpm
new file mode 100644 (file)
index 0000000..e2f2b52
--- /dev/null
@@ -0,0 +1,49 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"32 32 10 1",
+/* colors */
+"` c #000000",
+"a c #00BF00",
+"b c #3F3F3F",
+"c c #3F3F00",
+"d c #003F00",
+"e c #3C00BF",
+"f c #727272",
+"g c #DFDFDF",
+"h c #7F3D00",
+"i c #3C00FF",
+/* pixels */
+"````````````````````````````````",
+"``gggggggggggggggggggggggggggg``",
+"`g`gggggggggggggggggggggggggg`f`",
+"`gg`gggggggggggggggggggggggg`ff`",
+"`ggg````````````````````````fff`",
+"`ggg`eeeeeeeehccceeehceecee`fff`",
+"`ggg`eeeeeeecccceeehccceeee`fff`",
+"`ggg`eieiehcceieihccicieiei`fff`",
+"`ggg`ieiehcceiehcccieieieie`fff`",
+"`ggg`eiihciiihcciiieiiieiii`fff`",
+"`ggg`iiiciiihcciiiiiiiiiiii`fff`",
+"`ggg`iib`iib`iiiiiiiiiiiiii`fff`",
+"`ggg`iib`iib`iiiiiiiiiiiiii`fff`",
+"`ggg`iib`iib`iiiiiiiiiiiiii`fff`",
+"`ggg`iib`iib`iiiiiiiiiiiiii`fff`",
+"`ggg`iib`iib`iiiiiiiiiiiiii`fff`",
+"`ggg`iib`iib`iiiiiiiiiiiiii`fff`",
+"`ggg`i``````````````````iii`fff`",
+"`ggg`dbbbbbbbbbbbbbbbbbbddd`fff`",
+"`ggg`d``````````````````ddd`fff`",
+"`ggg`d`b``b``b``b``b````ddd`fff`",
+"`ggg`a`b``b``b``b``b````ddd`fff`",
+"`ggg`d``````````````````dad`fff`",
+"`ggg`dadadadadadadadadadada`fff`",
+"`ggg`adadadadadadadadadadad`fff`",
+"`ggg`aaaaaaaaaaaaaaaaaaaaaa`fff`",
+"`ggg`aaaaaaaaaaaaaaaaaaaaaa`fff`",
+"`ggg````````````````````````fff`",
+"`gg`ffffffffffffffffffffffff`ff`",
+"`g`ffffffffffffffffffffffffff`f`",
+"``ffffffffffffffffffffffffffff``",
+"````````````````````````````````"
+};
diff --git a/images/grpollhi.xpm b/images/grpollhi.xpm
new file mode 100644 (file)
index 0000000..fd69154
--- /dev/null
@@ -0,0 +1,49 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"32 32 10 1",
+/* colors */
+"` c #000000",
+"a c #00BF00",
+"b c #3F3F3F",
+"c c #3F3F00",
+"d c #003F00",
+"e c #3C00BF",
+"f c #7F7F3F",
+"g c #7F3D00",
+"h c #3F0000",
+"i c #3C00FF",
+/* pixels */
+"````````````````````````````````",
+"``hhhhhhhhhhhhhhhhhhhhhhhhhhhh``",
+"`h`hhhhhhhhhhhhhhhhhhhhhhhhhh`f`",
+"`hh`hhhhhhhhhhhhhhhhhhhhhhhh`ff`",
+"`hhh````````````````````````fff`",
+"`hhh`eeeeeeeegccceeegceecee`fff`",
+"`hhh`eeeeeeecccceeegccceeee`fff`",
+"`hhh`eieiegcceieigccicieiei`fff`",
+"`hhh`ieiegcceiegcccieieieie`fff`",
+"`hhh`eiigciiigcciiieiiieiii`fff`",
+"`hhh`iiiciiigcciiiiiiiiiiii`fff`",
+"`hhh`iib`iib`iiiiiiiiiiiiii`fff`",
+"`hhh`iib`iib`iiiiiiiiiiiiii`fff`",
+"`hhh`iib`iib`iiiiiiiiiiiiii`fff`",
+"`hhh`iib`iib`iiiiiiiiiiiiii`fff`",
+"`hhh`iib`iib`iiiiiiiiiiiiii`fff`",
+"`hhh`iib`iib`iiiiiiiiiiiiii`fff`",
+"`hhh`i``````````````````iii`fff`",
+"`hhh`dbbbbbbbbbbbbbbbbbbddd`fff`",
+"`hhh`d``````````````````ddd`fff`",
+"`hhh`d`b``b``b``b``b````ddd`fff`",
+"`hhh`a`b``b``b``b``b````ddd`fff`",
+"`hhh`d``````````````````dad`fff`",
+"`hhh`dadadadadadadadadadada`fff`",
+"`hhh`adadadadadadadadadadad`fff`",
+"`hhh`aaaaaaaaaaaaaaaaaaaaaa`fff`",
+"`hhh`aaaaaaaaaaaaaaaaaaaaaa`fff`",
+"`hhh````````````````````````fff`",
+"`hh`ffffffffffffffffffffffff`ff`",
+"`h`ffffffffffffffffffffffffff`f`",
+"``ffffffffffffffffffffffffffff``",
+"````````````````````````````````"
+};
diff --git a/images/grres.xpm b/images/grres.xpm
new file mode 100644 (file)
index 0000000..2bd09fc
--- /dev/null
@@ -0,0 +1,50 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"32 32 11 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #3F3F3F",
+"c c #3F3F00",
+"d c #00DF00",
+"e c #3C00BF",
+"f c #727272",
+"g c #FFFFFF",
+"h c #DFDFDF",
+"i c #3C00FF",
+"j c #BFBFBF",
+/* pixels */
+"````````````````````````````````",
+"``hhhhhhhhhhhhhhhhhhhhhhhhhhhh``",
+"`h`hhhhhhhhhhhhhhhhhhhhhhhhhh`f`",
+"`hh`hhhhhhhhhhhhhhhhhhhhhhhh`ff`",
+"`hhh````````````````````````fff`",
+"`hhh`eeeeeeeeeeeeeeeeeeeeee`fff`",
+"`hhh`eieieieieieieieieieiei`fff`",
+"`hhh`ieieieieieieieieieieie`fff`",
+"`hhh`iiei`iebiieiiieiiieiii`fff`",
+"`hhh`iiii`ib``iiiiiiiiiiiii`fff`",
+"`hhh`eiii`b````bbbbbbiiiiei`fff`",
+"`hhh`iiiib``````b`````iiiii`fff`",
+"`hhh`iiib````````b`````iiii`fff`",
+"`hhh`iib``````````b`````iii`fff`",
+"`hhh`iiigggggggggjjjjjjiiii`fff`",
+"`hhh`iiigaaggaaggjajajjiiii`fff`",
+"`hhh`dddgabggabggjjjjjjdddd`fff`",
+"`hhh`dddgggggggggjjjjjjdddd`fff`",
+"`hhh`dddggaagaaggjajajjdddd`fff`",
+"`hhh`dddggabgabggjjjajjdddd`fff`",
+"`hhh`dddggabgggggdddddddddd`fff`",
+"`hhh`dddddccddddddddddddddd`fff`",
+"`hhh`dddddcccdddddddddddddd`fff`",
+"`hhh`dddddccccddddddddddddd`fff`",
+"`hhh`ddddddccccccdddddddddd`fff`",
+"`hhh`dddddddccccccccddddddd`fff`",
+"`hhh`dddddddddcccccccccdddd`fff`",
+"`hhh````````````````````````fff`",
+"`hh`ffffffffffffffffffffffff`ff`",
+"`h`ffffffffffffffffffffffffff`f`",
+"``ffffffffffffffffffffffffffff``",
+"````````````````````````````````"
+};
diff --git a/images/grreshi.xpm b/images/grreshi.xpm
new file mode 100644 (file)
index 0000000..2ced59d
--- /dev/null
@@ -0,0 +1,49 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"32 32 10 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #3F3F3F",
+"d c #3F3F00",
+"e c #00DF00",
+"f c #3C00BF",
+"g c #FFFFFF",
+"h c #3C00FF",
+"i c #BFBFBF",
+/* pixels */
+"````````````````````````````````",
+"``eeeeeeeeeeeeeeeeeeeeeeeeeeee``",
+"`e`eeeeeeeeeeeeeeeeeeeeeeeeee`b`",
+"`ee`eeeeeeeeeeeeeeeeeeeeeeee`bb`",
+"`eee````````````````````````bbb`",
+"`eee`ffffffffffffffffffffff`bbb`",
+"`eee`fhfhfhfhfhfhfhfhfhfhfh`bbb`",
+"`eee`hfhfhfhfhfhfhfhfhfhfhf`bbb`",
+"`eee`hhfh`hfchhfhhhfhhhfhhh`bbb`",
+"`eee`hhhh`hc``hhhhhhhhhhhhh`bbb`",
+"`eee`fhhh`c````cccccchhhhfh`bbb`",
+"`eee`hhhhc``````c`````hhhhh`bbb`",
+"`eee`hhhc````````c`````hhhh`bbb`",
+"`eee`hhc``````````c`````hhh`bbb`",
+"`eee`hhhgggggggggiiiiiihhhh`bbb`",
+"`eee`hhhgaaggaaggiaiaiihhhh`bbb`",
+"`eee`eeegacggacggiiiiiieeee`bbb`",
+"`eee`eeegggggggggiiiiiieeee`bbb`",
+"`eee`eeeggaagaaggiaiaiieeee`bbb`",
+"`eee`eeeggacgacggiiiaiieeee`bbb`",
+"`eee`eeeggacgggggeeeeeeeeee`bbb`",
+"`eee`eeeeeddeeeeeeeeeeeeeee`bbb`",
+"`eee`eeeeedddeeeeeeeeeeeeee`bbb`",
+"`eee`eeeeeddddeeeeeeeeeeeee`bbb`",
+"`eee`eeeeeeddddddeeeeeeeeee`bbb`",
+"`eee`eeeeeeeddddddddeeeeeee`bbb`",
+"`eee`eeeeeeeeedddddddddeeee`bbb`",
+"`eee````````````````````````bbb`",
+"`ee`bbbbbbbbbbbbbbbbbbbbbbbb`bb`",
+"`e`bbbbbbbbbbbbbbbbbbbbbbbbbb`b`",
+"``bbbbbbbbbbbbbbbbbbbbbbbbbbbb``",
+"````````````````````````````````"
+};
diff --git a/images/icairp.xpm b/images/icairp.xpm
new file mode 100644 (file)
index 0000000..c632816
--- /dev/null
@@ -0,0 +1,77 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"58 58 12 1",
+/* colors */
+"# c #000000",
+"a c #7F7F7F",
+"b c #5D5D5D",
+"c c #007F00",
+"d c #BF7900",
+"e c #FF0000",
+"f c #4F4FFF",
+"  c #FFFFFF",
+"h c #7F7F00",
+"i c #FF7700",
+"j c #BFBFBF",
+"k c #0000FF",
+/* pixels */
+"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj",
+"jaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaab",
+"jaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaab",
+"jaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaab",
+"jaab##################################################jaab",
+"jddb# # # # # # # # # # ### # # # # # # # # # # # # ##jddb",
+"jddb## # # # # # # # # # #bj # # # aaaaabjbjbjb# # # #jddb",
+"jddb# # # # # # # # # # ###b# # # aajajabaababb # # ##jddb",
+"jddb## # # # # # # # # # b#### # #aaaaaabaababb# # # #jddb",
+"jaab# # # # # # # # # # bhhf# # #aaja # baabaab # # ##jaab",
+"jaab##bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb #jaab",
+"jaab# jbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbjbbbbaabj##jaab",
+"jaab##bbabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbjbbbbabab #jaab",
+"jddb# jababjjbjjbjjbjjbjjbjjbjjbjjbjjbjjbjjbjjbbbbbj##jddb",
+"jddb##baabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbjbbbbbaab #jddb",
+"jddb# jbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbjbbbbabaj##jddb",
+"jddb##bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb #jddb",
+"jaab# # ajaa# # # # # # # # # # #aaaa # bbbjbbb # # ##jaab",
+"jaab## #aaaa # # # # # # # # # # ajaa# #bbbjbbb# # # #jaab",
+"jaab# # ajaa# # # # # # # # # # #aaaa # bbbbbbb # # ##jaab",
+"jaab## #aaaa # # # # # # # # # # ajaa# #bbbjbbb# # # #jaab",
+"jddb# # ajaa# # # # # # # # # # #aaaa # bbbjbbb # # ##jddb",
+"jddb## #aaaaa# # # # # # # # jjjjjjja# #bbbbbbb# # # #jddb",
+"jddb# #aaajaa   aaaaaa a aaa#jjjejbja # bbbjbbb # # ##jddb",
+"jddb## aaaaaja ajajaja    ab#jjbjjjja# #bbbjbbb# # # #jddb",
+"jaab# #aaaa  b b  aaaaab aba#jbjjjeja # bbbbbbb # # ##jaab",
+"jaab## aaaaa     aejjjjjjbab#jjajbjja# #bbbjbbb# # # #jaab",
+"jaab# #ejjjjbejjjb a a ajaba#jjjajaja # bbbjbbb # # ##jaab",
+"jaab##bj a ab a abjjjjjjjbab#jjjjjbja# #bbbbbbb# # # #jaab",
+"jddb# bjjjjjbjjjjbjjjjjjjaba#######aa # bbbjbbb # # ##jddb",
+"jddb##bjjjjjbjjjjb a a ajbabbbbbbajaa# #bbbjbbb# # # #jddb",
+"jddb# bj a ab a abejjjjjjabbbbbbbaaaa # bbbbbbb # # ##jddb",
+"jddb##bejjjjbejjjbkkkkkkkjaaaaabbajaa# #bbbjbbb# # # #jddb",
+"jaab# bkkkkkkk##kk#kk#kkfjjaajabbaaaa # bbbjbbb # # ##jaab",
+"jaab## #hhhbbhbbhhbh#b#ffjbaababbajaa# #bbbbbbb# # # #jaab",
+"jaab# # aaaabbbbbbb#bb##fj ja abaaaaa # bbbjbbb # # ##jaab",
+"jaab## ab#ahhaaaaaa#aaa#fjajjajba jaa# #bbbjbbb# # # #jaab",
+"jddb# #a##abbbbbbbaaaa#ffj jj jb  aa  # bbbbbbb # # ##jddb",
+"jddb#bjaaabababababaaaa#fjajjaj  aj  # #bbbjbbb# # # #jddb",
+"jddb#bbaaabhhhh #bbfaaa#fejjjje       # bbbjbbb # # ##jddb",
+"jddb#bjaacbbbbb# abfaa#fbbbbbbbb aaaa# #bbbbbbb# # # #jddb",
+"jaab#bbaacbbbbb #bbaaa#fja aa ab  jaaaaabbbjbbb # # ##jaab",
+"jaab#bjaaabbbbb# abaac#fjjajjajba aaaaaabbbjbbb# # # #jaab",
+"jaab#bbaaabbbbb #bbaaca#jj jj jbaajajajabbbbbbb # # ##jaab",
+"jaab#bjaaab### # abaaaa#ejajjaebaaaaaaaabbbjbbb# # # #jaab",
+"jddb#bbaaaa # # #baaaa#fbbbbbbbbaajaa # bbbjbbb # # ##jddb",
+"jddb#bjaaaaaaaaaaaaaaa#fjaaaaabaaaaaa# #bbbbbbb# # # #jddb",
+"jddb#bbaaaaaaaahaaaaaaa#j jj jbaaaaaa # baabbab # # ##jddb",
+"jddb#bjbaaaaaaaaaaaaaaa#jajjajbaaaaaa# #bbababb# # # #jddb",
+"jaab# bbjbjbjbjbjbjaia#fejjjje# # # # # baabaab # # ##jaab",
+"jaab## bbbbbbbbbbbbaia bbbbbb# # # # # #bjbjbjb# # # #jaab",
+"jaab# # # # # # #b#aaa# # # # # # # # # # # # # # # ##jaab",
+"jaab## # # # # # baaa# # # # # # # # # # # # # # # # #jaab",
+"jddb##################################################jddb",
+"jddbjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjddb",
+"jddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddb",
+"jddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddb",
+"jbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
+};
diff --git a/images/icairphi.xpm b/images/icairphi.xpm
new file mode 100644 (file)
index 0000000..7580317
--- /dev/null
@@ -0,0 +1,77 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"58 58 12 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #5D5D5D",
+"c c #007F00",
+"d c #BF7900",
+"e c #FF0000",
+"f c #4F4FFF",
+"g c #FFFFFF",
+"h c #7F7F00",
+"i c #FF7700",
+"j c #BFBFBF",
+"k c #0000FF",
+/* pixels */
+"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj",
+"jaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaab",
+"jaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaab",
+"jaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaab",
+"jaabggggggggggggggggggggggggggggggggggggggggggggggggggjaab",
+"jddbgdddhdddddddddddddddd`ddddddddddddddededededdddddgjddb",
+"jddbgaaaaaaaaaaaadddddddd`bjdddddhdaaaaabjbjbjbfdddddgjddb",
+"jddbgddddddddddhadddddddd``bddddddaajajabaababbddddddgjddb",
+"jddbgdddddddddddaddddddddb```dddddaaaaaabaababbddddddgjddb",
+"jaabgdfdddddfdddafddddfdbhhfddddfaajafdfbaabaabfdddfdgjaab",
+"jaabgebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbegjaab",
+"jaabgdjbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbjbbbbaabjdgjaab",
+"jaabgebbabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbjbbbbababegjaab",
+"jddbgdjababjjbjjbjjbjjbjjbjjbjjbjjbjjbjjbjjbjjbbbbbjdgjddb",
+"jddbgebaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbjbbbbbaabegjddb",
+"jddbgdjbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbjbbbbabajdgjddb",
+"jddbgebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbegjddb",
+"jaabgddfajaafddddfddddfadddfddddfaaaafdfbbbjbbbfdddfdgjaab",
+"jaabgdddaaaadddddddddddaddddddhddajaadddbbbjbbbddddddgjaab",
+"jaabgdddajaadddddddddddaaaaadddddaaaadddbbbbbbbddaaadgjaab",
+"jaabgdddaaaaaaaaaaaaaaaadddadddddajaadddbbbjbbbdjbdadgjaab",
+"jddbgdddajaadddddddddddddddadddddaaaadddbbbjbbbdjadadgjddb",
+"jddbgdddaaaaaddddddddddddddadjjjjjjjaddfbbbbbbbfdddadgjddb",
+"jddbgddaaajaagggaaaaaagagaaa`jjjejbjadddbbbjbbbddddadgjddb",
+"jddbgddaaaaajagajajajaggggab`jjbjjjjadddbbbjbbbdddhadgjddb",
+"jaabgddaaaaggbgbggaaaaabgaba`jbjjjejadddbbbbbbbddddadgjaab",
+"jaabgddaaaaagggggaejjjjjjbab`jjajbjjadddbbbjbbbddddadgjaab",
+"jaabgddejjjjbejjjbgagagajaba`jjjajajaddfbbbjbbbfdddadgjaab",
+"jaabgdbjgagabgagabjjjjjjjbab`jjjjjbjahddbbbbbbbddddadgjaab",
+"jddbgdbjjjjjbjjjjbjjjjjjjaba```````aadddbbbjbbbddddadgjddb",
+"jddbgdbjjjjjbjjjjbgagagajbabbbbbbajaadddbbbjbbbddddadgjddb",
+"jddbgdbjgagabgagabejjjjjjabbbbbbbaaaadddbbbbbbbdaaaadgjddb",
+"jddbgdbejjjjbejjjbkkkkkkkjaaaaabbajaaddfbbbjbbbfaddddgjddb",
+"jaabgdbkkkkkkk``kk`kk`kkfjjaajabbaaaadddbbbjbbbdadaadgjaab",
+"jaabgddhhhhbbhbbhhbh`b`ffjbaababbajaadddbbbbbbbdadbbdgjaab",
+"jaabgdddaaaabbbbbbb`bb``fjgjagabaaaaadddbbbjbbbdadaadgjaab",
+"jaabgddab`ahhaaaaaa`aaa`fjajjajbagjaadddbbbjbbbdadbbdgjaab",
+"jddbgd`a``abbbbbbbaaaa`ffjgjjgjbggaagddfbbbbbbbfadaadgjddb",
+"jddbgbjaaabababababaaaa`fjajjajggajggdddbbbjbbbdadbbdgjddb",
+"jddbgbbaaabhhhhhhbbfaaa`fejjjjeggggggdddbbbjbbbdaddddgjddb",
+"jddbgbjaacbbbbbddabfaa`fbbbbbbbbgaaaaddfbbbbbbbfaddddgjddb",
+"jaabgbbaacbbbbbdhbbaaa`fjagaagabggjaaaaabbbjbbbdaddddgjaab",
+"jaabgbjaaabbbbbddabaac`fjjajjajbagaaaaaabbbjbbbaaddddgjaab",
+"jaabgbbaaabbbbbdhbbaaca`jjgjjgjbaajajajabbbbbbbddddddgjaab",
+"jaabgbjaaab```dddabaaaa`ejajjaebaaaaaaaabbbjbbbddddddgjaab",
+"jddbgbbaaaadddddhbaaaa`fbbbbbbbbaajaaddfbbbjbbbfdddddgjddb",
+"jddbgbjaaaaaaaaaaaaaaa`fjaaaaabaaaaaadddbbbbbbbddddddgjddb",
+"jddbgbbaaaaaaaahaaaaaaa`jgjjgjbaaaaaadddbaabbabdddhddgjddb",
+"jddbgbjbaaaaaaaaaaaaaaa`jajjajbaaaaaadddbbababbddddddgjddb",
+"jaabgdbbjbjbjbjbjbjaia`fejjjjehdddddhddfbaabaabfdddddgjaab",
+"jaabgddbbbbbbbbbbbbaiadbbbbbbhhdddddddhdbjbjbjbddddddgjaab",
+"jaabgdhddhhhhhhhhb`aaaddhhhhhhhdhddddddddddddddddddddgjaab",
+"jaabgddddddddddddbaaadddddddddddddddddddededededdddddgjaab",
+"jddbggggggggggggggggggggggggggggggggggggggggggggggggggjddb",
+"jddbjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjddb",
+"jddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddb",
+"jddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddddaaaaddb",
+"jbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
+};
diff --git a/images/icchlk.xpm b/images/icchlk.xpm
new file mode 100644 (file)
index 0000000..54667b5
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 7 1",
+/* colors */
+"# c #000000"
+"` c #7F7F7F",
+"a c #5D5D5D",
+"  c #FFFFFF",
+"c c #FFFF00",
+"d c #FF7700",
+"e c #BFBFBF",
+/* pixels */
+"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+"e                                a",
+"e                                a",
+"e  aaaaaaaaaaaaaaaaaaaaaaaaaaaa  a",
+"e  a # # # # # # # # # # # # #e  a",
+"e  a# # # # # # # # # # # # # e  a",
+"e  a # # # # # # # # # # # # #e  a",
+"e  a# # # # # # # # # # # # # e  a",
+"e  a # # # # # # # # #e``# # #e  a",
+"e  a# # # # # # # #  e````# # e  a",
+"e  a # # # # # # #  e e````# #e  a",
+"e  a# # # # # # #  e e ```` # e  a",
+"e  a # # # # # #  e e ` ``a# #e  a",
+"e  a# # # # # #  e e ` ``a# # e  a",
+"e  a # # # # #  e e ` ``a# # #e  a",
+"e  a# # # # #  e e ` ``a# # # e  a",
+"e  a # # # #  e e ` ``a# #e# #e  a",
+"e  a# # # #  e e ` ``a# #e# # e  a",
+"e  a # # #  e e ` ``a# #e# # #e  a",
+"e  a# # #  e e ` ``a# #e# # # e  a",
+"e  a # #  e e ` ``a# #e# #e# #e  a",
+"e  a# #  e e ` ``a# #e# #e# # e  a",
+"e  a # #e e ` ``a# #e# #e# # #e  a",
+"e  a# #  e ` ``a# #e# #e# # # e  a",
+"e  a # #e ` ``a# # # # # # # #e  a",
+"e  a# # #` ``ae e e e e e e e e  a",
+"e  a # # #``ae e e e e e e e ee  a",
+"e  a# # # #eeeeeeeeeeeeeeeeee e  a",
+"e  a # # # # # # # # # # # # #e  a",
+"e  a# # # # # # # # # # # # # e  a",
+"e  aeeeeeeeeeeeeeeeeeeeeeeeeeee  a",
+"e                                a",
+"e                                a",
+"eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+};
diff --git a/images/icchlkhi.xpm b/images/icchlkhi.xpm
new file mode 100644 (file)
index 0000000..a6a7291
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 7 1",
+/* colors */
+"# c #000000"
+"` c #7F7F7F",
+"a c #5D5D5D",
+"  c #FFFFFF",
+"c c #FFFF00",
+"d c #FF7700",
+"e c #BFBFBF",
+/* pixels */
+"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+"e                                a",
+"e                                a",
+"e  aaaaaaaaaaaaaaaaaaaaaaaaaaaa  a",
+"e  a                          e  a",
+"e  a                          e  a",
+"e  a                          e  a",
+"e  a                          e  a",
+"e  a                  e``     e  a",
+"e  a                 e````    e  a",
+"e  a                e e````   e  a",
+"e  a               e e ````   e  a",
+"e  a              e e ` ``a   e  a",
+"e  a             e e ` ``a    e  a",
+"e  a            e e ` ``a     e  a",
+"e  a           e e ` ``a      e  a",
+"e  a          e e ` ``a   `   e  a",
+"e  a         e e ` ``a   `    e  a",
+"e  a        e e ` ``a   `     e  a",
+"e  a       e e ` ``a   `      e  a",
+"e  a      e e ` ``a   `   `   e  a",
+"e  a     e e ` ``a   `   `    e  a",
+"e  a    e e ` ``a   `   `     e  a",
+"e  a     e ` ``a   `   `      e  a",
+"e  a    e ` ``a               e  a",
+"e  a     ` ``ae e e e e e e e e  a",
+"e  a      ``ae e e e e e e e  e  a",
+"e  a       eeeeeeeeeeeeeeeeee e  a",
+"e  a                          e  a",
+"e  a                          e  a",
+"e  aeeeeeeeeeeeeeeeeeeeeeeeeeee  a",
+"e                                a",
+"e                                a",
+"eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+};
diff --git a/images/iccoal.xpm b/images/iccoal.xpm
new file mode 100644 (file)
index 0000000..20645e2
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"42 42 14 1",
+/* colors */
+"# c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #BF7900",
+"f c #FF0000",
+"g c #4F4FFF",
+"  c #FFFFFF",
+"i c #FFFF00",
+"j c #7F7F00",
+"k c #FF7700",
+"l c #BFBFBF",
+"m c #0000FF",
+/* pixels */
+"llllllllllllllllllllllllllllllllllllllllll",
+"laaiiiiaaaaiiiiaaaaiiiiaaaaiiiiaaaaiiiiaac",
+"laaiiiiaaaaiiiiaaaaiiiiaaaaiiiiaaaaiiiiaac",
+"laaccccccccccccccccccccccccccccccccccccaac",
+"laac##################################laac",
+"liic# # # # #llllllll #ja c # c c # ##liic",
+"liic## #llllllfaaaaafajaajc#jaac # c #liic",
+"liic# #llkaallaaaaaac#cc# #ja #a# c ##liic",
+"liic##lllaaallaaaaag#aac aca #jjc#j# #liic",
+"laac# lal cal aaaacgaaajjcj # c # cc##laac",
+"laac##allaaa aaaac#aacj# # # a #ccc# #laac",
+"laac# lllaaaalaaa#aac#ac#a# acjjc #j##laac",
+"laac##lalaaallaaaaag#aac ca#cj # # # #laac",
+"liic# lllaaallaaaacgaaajjcca#c# # #c##liic",
+"liic##lalaaal aaac#aaacc # # #cajaj# #liic",
+"liic# lllcaa aaaa#aac#ac# # ccac# # ##liic",
+"liic##ll aaaalaaaaag#aac #caajcc # # #liic",
+"laac# l laaallaaaacgaaajcacjjc# # # ##laac",
+"laac## llcaallaaac#aacjc # # # # # # #laac",
+"laac# llaaaallaaa#aac#ac# # # # # # ##laac",
+"laac##lalaaal aaaaag#aac # # # # # # #laac",
+"liic# allaaa aaaaacgaaac# # # # # # ##liic",
+"liic##lllc calaaac#aaaac # # # # # # #liic",
+"liic# lalc cllaaa#aaaaac# # # # # # ##liic",
+"liic##aalaaallaaaaaaaac# # # # # # # #liic",
+"laac# lalc cllfaaaaafcc # # # # # # ##laac",
+"laac##aalc clacccccccac# # # # # # # #laac",
+"laac# lalaaaaccccccc#ac caadaaaaaaa ##laac",
+"laac##allacaaaaaaiaaaac#caadaaaaaaaaa#laac",
+"liic# lllaaaaaiiiaca#accaaaaaaaaaaaaa#liic",
+"liic##lllacaaiiiaaaaaac#aaaaaaaamaa# #liic",
+"liic# lllkaaiaaaaaca#kc aaaaaaaamaa ##liic",
+"liic##lllcccccccccccccc#aaaaaaaaaaa# #liic",
+"laac# llccccccccccccccc acamadaaaaa ##laac",
+"laac##lcccccccccccccccc#ajamadaaaaa# #laac",
+"laac# # # # # # # # # # # # # # # # ##laac",
+"laac## # # # # # # # # # # # # # # # #laac",
+"liic##################################liic",
+"liicllllllllllllllllllllllllllllllllllliic",
+"liiaaaaiiiiaaaaiiiiaaaaiiiiaaaaiiiiaaaaiic",
+"liiaaaaiiiiaaaaiiiiaaaaiiiiaaaaiiiiaaaaiic",
+"lccccccccccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/iccoalhi.xpm b/images/iccoalhi.xpm
new file mode 100644 (file)
index 0000000..1c0fe6c
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"42 42 14 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #BF7900",
+"f c #FF0000",
+"g c #4F4FFF",
+"h c #FFFFFF",
+"i c #FFFF00",
+"j c #7F7F00",
+"k c #FF7700",
+"l c #BFBFBF",
+"m c #0000FF",
+/* pixels */
+"llllllllllllllllllllllllllllllllllllllllll",
+"laaiiiiaaaaiiiiaaaaiiiiaaaaiiiiaaaaiiiiaac",
+"laaiiiiaaaaiiiiaaaaiiiiaaaaiiiiaaaaiiiiaac",
+"laaccccccccccccccccccccccccccccccccccccaac",
+"laachhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhlaac",
+"liicheeeeeeeelllllllleejaeceeececeeeehliic",
+"liicheeellllllfaaaaafajaajcejaaceeecehliic",
+"liicheellkaallaaaaaac`cceeejaeeaeeceehliic",
+"liichelllaaallaaaaag`aaceacaeejjcejeehliic",
+"laachelalhcalhaaaacgaaajjcjeeeceeeccehlaac",
+"laacheallaaahaaaac`aacjeeeeeeaeeccceehlaac",
+"laachelllaaaalaaa`aac`aceaeeacjjceejehlaac",
+"laachelalaaallaaaaag`aacjcaecjeeeeeeehlaac",
+"liichelllaaallaaaacgaaajjccaeceeeeecehliic",
+"liichelalaaalhaaac`aaaccjeeeeecajajcehliic",
+"liichelllcaahaaaa`aac`acjeeeccaceeecehliic",
+"liichellhaaaalaaaaag`aacjecaajcceeeeehliic",
+"laachelhlaaallaaaacgaaajcacjjceeeeecehlaac",
+"laachehllcaallaaac`aacjcjceeeeeeeeeeehlaac",
+"laachellaaaallaaa`aac`acjeceeeeeeeecehlaac",
+"laachelalaaalhaaaaag`aacjeeeeeeeeeeeehlaac",
+"liicheallaaahaaaaacgaaacjeceeeeeeeecehliic",
+"liichelllchcalaaac`aaaacjeeeeeeeeeeeehliic",
+"liichelalchcllaaa`aaaaacjeceeeeeeeecehliic",
+"liicheaalaaallaaaaaaaacjjeeeeeeeeeeeehliic",
+"laachelalchcllfaaaaafccjjeceeceeceecehlaac",
+"laacheaalchclacccccccacjjeeeeeeeeeeeehlaac",
+"laachelalaaaaccccccc`acjcaadaaaaaaaeehlaac",
+"laacheallacaaaaaaiaaaacjcaadaaaaaaaaahlaac",
+"liichelllaaaaaiiiaca`accaaaaaaaaaaaaahliic",
+"liichelllacaaiiiaaaaaacjaaaaaaaamaaebhliic",
+"liichelllkaaiaaaaaca`kcjaaaaaaaamaabehliic",
+"liichelllccccccccccccccjaaaaaaaaaaaebhliic",
+"laachellcccccccccccccccjacamadaaaaaeehlaac",
+"laachelccccccccccccccccjajamadaaaaabehlaac",
+"laacheejjjjjjjjjjjjjdjdjbebebebaaeeeehlaac",
+"laacheeejjjjjjjjjjjjjjjjeeeeeeeaaebebhlaac",
+"liichhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhliic",
+"liicllllllllllllllllllllllllllllllllllliic",
+"liiaaaaiiiiaaaaiiiiaaaaiiiiaaaaiiiiaaaaiic",
+"liiaaaaiiiiaaaaiiiiaaaaiiiiaaaaiiiiaaaaiic",
+"lccccccccccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/iccom.xpm b/images/iccom.xpm
new file mode 100644 (file)
index 0000000..b075042
--- /dev/null
@@ -0,0 +1,68 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 50 11 1",
+/* colors */
+"# c #000000",
+"a c #0000AF",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #BF7900",
+"f c #4F4FFF",
+"  c #FFFFFF",
+"h c #7F7F00",
+"i c #BFBFBF",
+"j c #0000FF",
+/* pixels */
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iffffffffffffffffffffffffffffffffc",
+"iffffffffffffffffffffffffffffffffc",
+"iffccccccccccccccccccccccccccccffc",
+"iffc##########################iffc",
+"iffc# # # hhhhhhhhhhhhh # # ##iffc",
+"iffc## # #hhhhhhhhhhhhhh # # #iffc",
+"iffc# # # hhccccccccccccc # ##iffc",
+"iffc## # #hhc#####c#####c# # #iffc",
+"iffc# # # hhc#####caaaaaaa# ##iffc",
+"iffc## # #hhcccccccajjjjjjj# #iffc",
+"iffc# # # hhc#####cajaajaaj ##iffc",
+"iffc## # #hhc#####cajaajaaj# #iffc",
+"iffc# # # hhcccccccajjjjjjj ##iffc",
+"iffc## # #hhc#####cajaajaaj# #iffc",
+"iffc# #dddddddddd#cajaajaaj ##iffc",
+"iffc## dbbbbbbbbbbcajjjjjjj# #iffc",
+"iffc# #dbccbccbccbcajaajaaj ##iffc",
+"iffc## dbccbccbccbcajaajaaj# #iffc",
+"iffc# #dbbbbbbbbbbcajjjjjjj ##iffc",
+"iffc## dbccbccbccbcajaajaaj# #iffc",
+"iffc##fdbccbccbccbcajaajaajff#iffc",
+"iffc##fdbbbbbbbbbbcajjjjjjj#f#iffc",
+"iffc##fdbccbccbccbcajaajaaj#f#iffc",
+"iffc##fdbccbccbccb ajaajaaj#f#iffc",
+"iffc##f bbbbbbbbbb# jjjjjjj#f#iffc",
+"iffc##f# # # # # # # # # # #f#iffc",
+"iffc##f # # # #fffff# # # ##f#iffc",
+"iffc##f# # # #ff###ff# # # #f#iffc",
+"iffc##f # # #ff## ##ff# # ##f#iffc",
+"iffc##f# # ##ff# # ### # # #f#iffc",
+"iffc##f # # #ff # # # # # ##f#iffc",
+"iffc##f# # ##ff# # # # # # #f#iffc",
+"iffc##f # # #ff # # # # # ##f#iffc",
+"iffc##f# # ##ff# # # # # # #f#iffc",
+"iffc##f # # #ff # # ff# # ##f#iffc",
+"iffc##f# # ###ff # ff# # # #f#iffc",
+"iffc##f # # ###fffff# # # ##f#iffc",
+"iffc##f# # # ####### # # # #f#iffc",
+"iffc##f # # # # # # # # # ##f#iffc",
+"iffc##f# # # # # # # # # # #f#iffc",
+"iffc##f # # # # # # # # # ##f#iffc",
+"iffc##f# # # # # # # # # # #f#iffc",
+"iffc##fffffffffffffffffffffff#iffc",
+"iffc##########################iffc",
+"iffc##########################iffc",
+"iffciiiiiiiiiiiiiiiiiiiiiiiiiiiffc",
+"iffffffffffffffffffffffffffffffffc",
+"iffffffffffffffffffffffffffffffffc",
+"iccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/iccomhi.xpm b/images/iccomhi.xpm
new file mode 100644 (file)
index 0000000..b431d03
--- /dev/null
@@ -0,0 +1,68 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 50 11 1",
+/* colors */
+"` c #000000",
+"a c #0000AF",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #BF7900",
+"f c #4F4FFF",
+"g c #FFFFFF",
+"h c #7F7F00",
+"i c #BFBFBF",
+"j c #0000FF",
+/* pixels */
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iffffffffffffffffffffffffffffffffc",
+"iffffffffffffffffffffffffffffffffc",
+"iffccccccccccccccccccccccccccccffc",
+"iffcggggggggggggggggggggggggggiffc",
+"iffcgggggghhhhhhhhhhhhhgggggggiffc",
+"iffcgggggghhhhhhhhhhhhhhggggggiffc",
+"iffcgggggghhcccccccccccccgggggiffc",
+"iffcgggggghhc`````c`````cgggggiffc",
+"iffcgggggghhc`````caaaaaaaggggiffc",
+"iffcgggggghhcccccccajjjjjjjgggiffc",
+"iffcgggggghhc`````cajaajaajgggiffc",
+"iffcgggggghhc`````cajaajaajgggiffc",
+"iffcgggggghhcccccccajjjjjjjgggiffc",
+"iffcgggggghhc`````cajaajaajgggiffc",
+"iffcgggdddddddddd`cajaajaajgggiffc",
+"iffcgggdbbbbbbbbbbcajjjjjjjgggiffc",
+"iffcgggdbccbccbccbcajaajaajgggiffc",
+"iffcgggdbccbccbccbcajaajaajgggiffc",
+"iffcgggdbbbbbbbbbbcajjjjjjjgggiffc",
+"iffcgggdbccbccbccbcajaajaajgggiffc",
+"iffcg`fdbccbccbccbcajaajaajffgiffc",
+"iffcg`fdbbbbbbbbbbcajjjjjjj`fgiffc",
+"iffcg`fdbccbccbccbcajaajaaj`fgiffc",
+"iffcg`fdbccbccbccbeajaajaaj`fgiffc",
+"iffcg`febbbbbbbbbbeejjjjjjj`fgiffc",
+"iffcg`feeeeeeeeeeeeeeeeeeee`fgiffc",
+"iffcg`feeeeeee`fffffeeeeeee`fgiffc",
+"iffcg`feeeeee`ff```ffeeeeee`fgiffc",
+"iffcg`feeeee`ff`eee`ffeeeee`fgiffc",
+"iffcg`feeeee`ffeeeee``eeeee`fgiffc",
+"iffcg`feeeee`ffeeeeeeeeeeee`fgiffc",
+"iffcg`feeeee`ffeeeeeeeeeeee`fgiffc",
+"iffcg`feeeee`ffeeeeeeeeeeee`fgiffc",
+"iffcg`feeeee`ffeeeeeeeeeeee`fgiffc",
+"iffcg`feeeee`ffeeeeeffeeeee`fgiffc",
+"iffcg`feeeee``ffeeeff`eeeee`fgiffc",
+"iffcg`feeeeee``fffff`eeeeee`fgiffc",
+"iffcg`feeeeeee``````eeeeeee`fgiffc",
+"iffcg`feeeeeeeeeeeeeeeeeeee`fgiffc",
+"iffcg`feeeeeeeeeeeeeeeeeeee`fgiffc",
+"iffcg`feeeeeeeeeeeeeeeeeeee`fgiffc",
+"iffcg`feeeeeeeeeeeeeeeeeeee`fgiffc",
+"iffcg`fffffffffffffffffffffffgiffc",
+"iffcg````````````````````````giffc",
+"iffcggggggggggggggggggggggggggiffc",
+"iffciiiiiiiiiiiiiiiiiiiiiiiiiiiffc",
+"iffffffffffffffffffffffffffffffffc",
+"iffffffffffffffffffffffffffffffffc",
+"iccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icdozr.xpm b/images/icdozr.xpm
new file mode 100644 (file)
index 0000000..d2d4098
--- /dev/null
@@ -0,0 +1,50 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 9 1",
+/* colors */
+"# c #000000",
+"a c #7F7F7F",
+"b c #5D5D5D",
+"c c #BF7900",
+"d c #FF0000",
+"  c #FFFFFF",
+"f c #FF7700",
+"g c #BFBFBF",
+"h c #0000FF",
+/* pixels */
+"gggggggggggggggggggggggggggggggggg",
+"gccccccccccccccccccccccccccccccccb",
+"gccccccccccccccccccccccccccccccccb",
+"gccbbbbbbbbbbbbbbbbbbbbbbbbbbbbccb",
+"gccb##########################gccb",
+"gccb# # # # # # # # # # # # ##gccb",
+"gccb## # # # # # # # # # # # #gccb",
+"gccb# # # # # # # # # # # # ##gccb",
+"gccb## #ffdddddf # # # # # # #gccb",
+"gccb# # dfffffff# # # # # #b##gccb",
+"gccb## #ddff # # # # # # #ab #gccb",
+"gccb# # ddfff # # ### # #ab ##gccb",
+"gccb## #ddffhh # # # # #aab# #gccb",
+"gccb# # ddffh # # ### # ##b ##gccb",
+"gccb## #ddfffffdddd#ddd###b# #gccb",
+"gccb# # ddfffffffffffff ##b ##gccb",
+"gccb## #ddfffffffffffffb##b# #gccb",
+"gccb# # ##b#fb#fb#fb#aaa##b ##gccb",
+"gccb## b#bbbbbbbbbbbb#ba##b# #gccb",
+"gccb# #bbbb##b##b##bbbb###b ##gccb",
+"gccb##bbbb###b##b###bbbb##b# #gccb",
+"gccb# #bb#bb##bb##bb#bb###b ##gccb",
+"gccb###bb#bb##bb##bb#bb#aab# #gccb",
+"gccb# bbbb###b##b###bbbb#ab ##gccb",
+"gccb###bbbb##b##b##bbbb# #ab #gccb",
+"gccb# #b#bbbbbbbbbbbb#b # #b##gccb",
+"gccb## # #b# b# b# b## # # # #gccb",
+"gccb# # # # # # # # # # # # ##gccb",
+"gccb## # # # # # # # # # # # #gccb",
+"gccb##########################gccb",
+"gccbgggggggggggggggggggggggggggccb",
+"gccccccccccccccccccccccccccccccccb",
+"gccccccccccccccccccccccccccccccccb",
+"gbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
+};
diff --git a/images/icdozrhi.xpm b/images/icdozrhi.xpm
new file mode 100644 (file)
index 0000000..27f4d28
--- /dev/null
@@ -0,0 +1,50 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 9 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #5D5D5D",
+"c c #BF7900",
+"d c #FF0000",
+"e c #FFFFFF",
+"f c #FF7700",
+"g c #BFBFBF",
+"h c #0000FF",
+/* pixels */
+"gggggggggggggggggggggggggggggggggg",
+"gccccccccccccccccccccccccccccccccb",
+"gccccccccccccccccccccccccccccccccb",
+"gccbbbbbbbbbbbbbbbbbbbbbbbbbbbbccb",
+"gccbeeeeeeeeeeeeeeeeeeeeeeeeeegccb",
+"gccbeeeeeeeeeeeeeeeeeeeeeeeeeegccb",
+"gccbeeeeeeeeeeeeeeeeeeeeeeeeeegccb",
+"gccbeeeeeeeeeeeeeeeeeeeeeeeeeegccb",
+"gccbeeeeffdddddfeeeeeeeeeeeeeegccb",
+"gccbeeeedfffffffeeeeeeeeeeebeegccb",
+"gccbeeeeddffeeeeeeeeeeeeeeabeegccb",
+"gccbeeeeddfffeeeeee`eeeeeabeeegccb",
+"gccbeeeeddffhheeeee`eeeeaabeeegccb",
+"gccbeeeeddffhe`eeee`eeee``beeegccb",
+"gccbeeeeddfffffdddd`ddde``beeegccb",
+"gccbeeeeddfffffffffffffe``beeegccb",
+"gccbeeeeddfffffffffffffb``beeegccb",
+"gccbeeeee`b`fb`fb`fb`aaa``beeegccb",
+"gccbeeeb`bbbbbbbbbbbb`ba``beeegccb",
+"gccbee`bbbb``b``b``bbbb```beeegccb",
+"gccbeebbbb```b``b```bbbb``beeegccb",
+"gccbee`bb`bb``bb``bb`bb```beeegccb",
+"gccbee`bb`bb``bb``bb`bb`aabeeegccb",
+"gccbeebbbb```b``b```bbbbeabeeegccb",
+"gccbee`bbbb``b``b``bbbb`eeabeegccb",
+"gccbeeeb`bbbbbbbbbbbb`beeeebeegccb",
+"gccbeeeee`b`eb`eb`eb`eeeeeeeeegccb",
+"gccbeeeeeeeeeeeeeeeeeeeeeeeeeegccb",
+"gccbeeeeeeeeeeeeeeeeeeeeeeeeeegccb",
+"gccbeeeeeeeeeeeeeeeeeeeeeeeeeegccb",
+"gccbgggggggggggggggggggggggggggccb",
+"gccccccccccccccccccccccccccccccccb",
+"gccccccccccccccccccccccccccccccccb",
+"gbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
+};
diff --git a/images/icersr.xpm b/images/icersr.xpm
new file mode 100644 (file)
index 0000000..160dc2c
--- /dev/null
@@ -0,0 +1,49 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 8 1",
+/* colors */
+"# c #000000"
+"` c #7F7F7F",
+"a c #5D5D5D",
+"  c #FFFFFF",
+"c c #FFFF00",
+"d c #FF7700",
+"e c #BFBFBF",
+"f c #3F3F3F"
+/* pixels */
+"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+"effffffffffffffffffffffffffffffffa",
+"effffffffffffffffffffffffffffffffa",
+"effaaaaaaaaaaaaaaaaaaaaaaaaaaaaffa",
+"effa# # # # # # # # # # # # # effa",
+"effa # # # # # # # # # # # # #effa",
+"effa# # # # # # # # # # # # # effa",
+"effa # # # # f # # # # # # # #effa",
+"effa# # # # fff # # # # # # # effa",
+"effa # # # fffff # # # # # # #effa",
+"effa# # # fffffff # # # # # # effa",
+"effa # # fffffffff # # # # # #effa",
+"effa# # `ffffffffff # # # # # effa",
+"effa # ```ffffffffff # # # # #effa",
+"effa# #````ffffffffff e e e e effa",
+"effa # #````ffffffffff e e e eeffa",
+"effa# # #````ffffffffffeeeeeeeeffa",
+"effa # # #````ffffffffff # # #effa",
+"effa# #e# #````fffffffffa # # effa",
+"effa # #e# #````fffffffaaa # #effa",
+"effa# # #e# #````fffffaaaa# # effa",
+"effa # # #e# #````fffaaaa# # #effa",
+"effa# #e# #e# #````faaaa# # # effa",
+"effa # #e# #e# #```aaaa# # # #effa",
+"effa# # #e# #e# #``aaa# # # # effa",
+"effa # # #e# #e# #`aa# # # # #effa",
+"effa# # # # # # # #a# # # # # effa",
+"effa # # # # # # # # # # # # #effa",
+"effa# # # # # # # # # # # # # effa",
+"effa # # # # # # # # # # # # #effa",
+"effaeeeeeeeeeeeeeeeeeeeeeeeeeeeffa",
+"effffffffffffffffffffffffffffffffa",
+"effffffffffffffffffffffffffffffffa",
+"eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+};
diff --git a/images/icersrhi.xpm b/images/icersrhi.xpm
new file mode 100644 (file)
index 0000000..0cdcd1a
--- /dev/null
@@ -0,0 +1,49 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 8 1",
+/* colors */
+"# c #000000"
+"` c #7F7F7F",
+"a c #5D5D5D",
+"  c #FFFFFF",
+"c c #FFFF00",
+"d c #FF7700",
+"e c #BFBFBF",
+"f c #3F3F3F"
+/* pixels */
+"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+"effffffffffffffffffffffffffffffffa",
+"effffffffffffffffffffffffffffffffa",
+"effaaaaaaaaaaaaaaaaaaaaaaaaaaaaffa",
+"effa                          effa",
+"effa                          effa",
+"effa                          effa",
+"effa         f                effa",
+"effa        fff               effa",
+"effa       fffff              effa",
+"effa      fffffff             effa",
+"effa     fffffffff            effa",
+"effa    `ffffffffff           effa",
+"effa   ```ffffffffff          effa",
+"effa   ````ffffffffff e e e e effa",
+"effa    ````ffffffffff e e e eeffa",
+"effa     ````ffffffffffeeeeeeeeffa",
+"effa      ````ffffffffff      effa",
+"effa   `   ````fffffffffa     effa",
+"effa    `   ````fffffffaaa    effa",
+"effa     `   ````fffffaaaa    effa",
+"effa      `   ````fffaaaa     effa",
+"effa   `   `   ````faaaa      effa",
+"effa    `   `   ```aaaa       effa",
+"effa     `   `   ``aaa        effa",
+"effa      `   `   `aa         effa",
+"effa               a          effa",
+"effa                          effa",
+"effa                          effa",
+"effa                          effa",
+"effaeeeeeeeeeeeeeeeeeeeeeeeeeeeffa",
+"effffffffffffffffffffffffffffffffa",
+"effffffffffffffffffffffffffffffffa",
+"eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+};
diff --git a/images/icfire.xpm b/images/icfire.xpm
new file mode 100644 (file)
index 0000000..19d57f1
--- /dev/null
@@ -0,0 +1,54 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 13 1",
+/* colors */
+"# c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #BF7900",
+"f c #FF0000",
+"  c #FFFFFF",
+"h c #FFFF00",
+"i c #7F7F00",
+"j c #FF7700",
+"k c #BFBFBF",
+"l c #0000FF",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kffbbbbffffbbbbffffbbbbffffbbbbffc",
+"kffbbbbffffbbbbffffbbbbffffbbbbffc",
+"kffccccccccccccccccccccccccccccffc",
+"kffc##########################kffc",
+"kbbc## # # # # # # # # # # # #kbbc",
+"kbbc# # # # # # # # # # # # ##kbbc",
+"kbbc## # #ffffaffffaff # # # #kbbc",
+"kbbc# # #f###a####a##f# # # ##kbbc",
+"kffc## #ffccaccccacccf # # # #kffc",
+"kffc# #fefcacccccccccf# # # ##kffc",
+"kffc## fffccffffffffffff # # #kffc",
+"kffc# #ffecfcccccccccccf# # ##kffc",
+"kbbc## efffeaaaaaaaaaacf # # #kbbc",
+"kbbc# #fefffahhhhahhaacf# # ##kbbc",
+"kbbc## fffefchccachchacf # # #kbbc",
+"kbbc# #effffchhhachchacfiiiii#kbbc",
+"kffc## fffefchcaachchacf####i#kffc",
+"kffc# #feffechaaachchacfa#cai#kffc",
+"kffc## ffeffchaaachhaacfcca#i#kffc",
+"kffc# #effffccaaacccaacfcac#i#kffc",
+"kbbc## ffeffaaaaaaaaaacfccc#f#kbbc",
+"kbbc# #fffeffffffffffff#a#a#f#kbbc",
+"kbbc## fefff####f####fccccc#f#kbbc",
+"kbbc# #ffff#cccf#cccfffffffff#kbbc",
+"kffc## eff#cccf#cccf#f#f#f#f #kffc",
+"kffc# #ff#eeef#eeefffff#fff ##kffc",
+"kffc## # # # # # # # # # # # #kffc",
+"kffc# # # # # # # # # # # # ##kffc",
+"kbbc##########################kbbc",
+"kbbckkkkkkkkkkkkkkkkkkkkkkkkkkkbbc",
+"kbbffffbbbbffffbbbbffffbbbbffffbbc",
+"kbbffffbbbbffffbbbbffffbbbbffffbbc",
+"kccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icfirehi.xpm b/images/icfirehi.xpm
new file mode 100644 (file)
index 0000000..5a5610b
--- /dev/null
@@ -0,0 +1,54 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 13 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #BF7900",
+"f c #FF0000",
+"g c #FFFFFF",
+"h c #FFFF00",
+"i c #7F7F00",
+"j c #FF7700",
+"k c #BFBFBF",
+"l c #0000FF",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kffbbbbffffbbbbffffbbbbffffbbbbffc",
+"kffbbbbffffbbbbffffbbbbffffbbbbffc",
+"kffccccccccccccccccccccccccccccffc",
+"kffcggggggggggggggggggggggggggkffc",
+"kbbcgbbdbbbbbdbbbbbbbbdbbbbbdgkbbc",
+"kbbcgbdbbdbbbbbbbdbbabbbbbbbbgkbbc",
+"kbbcgbbdbbffffaffffaffaaaaabbgkbbc",
+"kbbcgbbdbf```a````a``fjjallbbgkbbc",
+"kffcgdbbffccaccccacccfcaaaabbgkffc",
+"kffcgbbfefcacccccccccfc`aeebbgkffc",
+"kffcgbbfffccffffffffffffaaabbgkffc",
+"kffcgbbffecfcccccccccccfa`aaagkffc",
+"kbbcgbbefffeaaaaaaaaaacfaaaaagkbbc",
+"kbbcgbbfefffahhhhahhaacfcaabbgkbbc",
+"kbbcgbbfffefchccachchacfcaabbgkbbc",
+"kbbcgdbeffffchhhachchacfiiiiigkbbc",
+"kffcgbbfffefchcaachchacf````igkffc",
+"kffcgbbfeffechaaachchacfa`caigkffc",
+"kffcgbbffeffchaaachhaacfcca`igkffc",
+"kffcgbbeffffccaaacccaacfcac`igkffc",
+"kbbcgbbffeffaaaaaaaaaacfccc`fgkbbc",
+"kbbcgdbfffeffffffffffff`a`a`fgkbbc",
+"kbbcgbbfefff````f````fccccc`fgkbbc",
+"kbbcgbbffff`cccf`cccfffffffffgkbbc",
+"kffcgdbeff`cccf`cccf`f`f`f`fbgkffc",
+"kffcgbbff`eeef`eeefffff`fffdbgkffc",
+"kffcgbbbddcccddcccddddddddddbgkffc",
+"kffcgbbdbdcccddcccdddddbbbdbbgkffc",
+"kbbcggggggggggggggggggggggggggkbbc",
+"kbbckkkkkkkkkkkkkkkkkkkkkkkkkkkbbc",
+"kbbffffbbbbffffbbbbffffbbbbffffbbc",
+"kbbffffbbbbffffbbbbffffbbbbffffbbc",
+"kccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icind.xpm b/images/icind.xpm
new file mode 100644 (file)
index 0000000..dbd3962
--- /dev/null
@@ -0,0 +1,65 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 50 8 1",
+/* colors */
+"# c #000000",
+"a c #7F7F7F",
+"b c #5D5D5D",
+"c c #BF7900",
+"  c #FFFFFF",
+"e c #FFFF00",
+"f c #7F7F00",
+"g c #BFBFBF",
+/* pixels */
+"gggggggggggggggggggggggggggggggggg",
+"geeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeb",
+"geeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeb",
+"geebbbbbbbbbbbbbbbbbbbbbbbbbbbbeeb",
+"geeb##########################geeb",
+"geeb# # # # # # #ff # ffff# ##geeb",
+"geeb## # # # # #fbb#bbffbbbb #geeb",
+"geeb# # # # #ffbbbbbffbbbfbff#geeb",
+"geeb## # # # ffbbbbbffbbbfbff#geeb",
+"geeb# # # # #fbbfbbbbbbfbbb ##geeb",
+"geeb## # # #fbbb bbfbbbbff # #geeb",
+"geeb# # # #bfbb #fffbfff# # ##geeb",
+"geeb## # # bfbb#ffffbbb# # # #geeb",
+"geeb# # # fbb #bfbb # # # # ##geeb",
+"geeb## # #bb## bb# # # # # # #geeb",
+"geeb# # # bb# #bb## # # # # ##geeb",
+"geeb## # #bb## bb# # # # # # #geeb",
+"geeb# #baabb#aabb#aaaaaaa # ##geeb",
+"geeb## bbaab#aaab#aaaaaaaa # #geeb",
+"geeb# #bbbbbbbbbbbbbbbbbbbb ##geeb",
+"geeb## bbb################b# #geeb",
+"geeb##ebbb################bee#geeb",
+"geeb##ebbb#bb#bb#bb#bb#bb#b#e#geeb",
+"geeb##ebbb#bb#bb#bb#bb#bb#b#e#geeb",
+"geeb##e#bb#bb#bb#bb#bb#bb#b#e#geeb",
+"geeb##e #b################b#e#geeb",
+"geeb##e# # # # # # # # # # #e#geeb",
+"geeb##e # # # #eeee # # # ##e#geeb",
+"geeb##e# # # ###ee## # # # #e#geeb",
+"geeb##e # # # ##ee# # # # ##e#geeb",
+"geeb##e# # # # #ee # # # # #e#geeb",
+"geeb##e # # # ##ee# # # # ##e#geeb",
+"geeb##e# # # # #ee # # # # #e#geeb",
+"geeb##e # # # ##ee# # # # ##e#geeb",
+"geeb##e# # # # #ee # # # # #e#geeb",
+"geeb##e # # # ##ee# # # # ##e#geeb",
+"geeb##e# # # # #ee # # # # #e#geeb",
+"geeb##e # # # #eeee # # # ##e#geeb",
+"geeb##e# # # ####### # # # #e#geeb",
+"geeb##e # # # # # # # # # ##e#geeb",
+"geeb##e# # # # # # # # # # #e#geeb",
+"geeb##e # # # # # # # # # ##e#geeb",
+"geeb##e# # # # # # # # # # #e#geeb",
+"geeb##eeeeeeeeeeeeeeeeeeeeeee#geeb",
+"geeb##########################geeb",
+"geeb##########################geeb",
+"geebgggggggggggggggggggggggggggeeb",
+"geeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeb",
+"geeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeb",
+"gbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
+};
diff --git a/images/icindhi.xpm b/images/icindhi.xpm
new file mode 100644 (file)
index 0000000..7d1a6fd
--- /dev/null
@@ -0,0 +1,65 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 50 8 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #5D5D5D",
+"c c #BF7900",
+"d c #FFFFFF",
+"e c #FFFF00",
+"f c #7F7F00",
+"g c #BFBFBF",
+/* pixels */
+"gggggggggggggggggggggggggggggggggg",
+"geeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeb",
+"geeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeb",
+"geebbbbbbbbbbbbbbbbbbbbbbbbbbbbeeb",
+"geebddddddddddddddddddddddddddgeeb",
+"geebdddddddddddddffdddffffddddgeeb",
+"geebddddddddddddfbbdbbffbbbbddgeeb",
+"geebdddddddddffbbbbbffbbbfbffdgeeb",
+"geebdddddddddffbbbbbffbbbfbffdgeeb",
+"geebdddddddddfbbfbbbbbbfbbbdddgeeb",
+"geebddddddddfbbbdbbfbbbbffddddgeeb",
+"geebdddddddbfbbddfffbfffddddddgeeb",
+"geebdddddddbfbbdffffbbbdddddddgeeb",
+"geebddddddfbbddbfbbdddddddddddgeeb",
+"geebddddddbb`ddbb`ddddddddddddgeeb",
+"geebddddddbb`ddbb`ddddddddddddgeeb",
+"geebddddddbb`ddbb`ddddddddddddgeeb",
+"geebdddbaabb`aabb`aaaaaaadddddgeeb",
+"geebdddbbaab`aaab`aaaaaaaaddddgeeb",
+"geebdddbbbbbbbbbbbbbbbbbbbbdddgeeb",
+"geebdddbbb````````````````bdddgeeb",
+"geebd`ebbb````````````````beedgeeb",
+"geebd`ebbb`bb`bb`bb`bb`bb`b`edgeeb",
+"geebd`ebbb`bb`bb`bb`bb`bb`b`edgeeb",
+"geebd`ecbb`bb`bb`bb`bb`bb`b`edgeeb",
+"geebd`eccb````````````````b`edgeeb",
+"geebd`ecccccccccccccccccccc`edgeeb",
+"geebd`eccccccc`eeeecccccccc`edgeeb",
+"geebd`eccccccc``ee`cccccccc`edgeeb",
+"geebd`ecccccccc`eeccccccccc`edgeeb",
+"geebd`ecccccccc`eeccccccccc`edgeeb",
+"geebd`ecccccccc`eeccccccccc`edgeeb",
+"geebd`ecccccccc`eeccccccccc`edgeeb",
+"geebd`ecccccccc`eeccccccccc`edgeeb",
+"geebd`ecccccccc`eeccccccccc`edgeeb",
+"geebd`ecccccccc`eeccccccccc`edgeeb",
+"geebd`ecccccccc`eeccccccccc`edgeeb",
+"geebd`eccccccc`eeeecccccccc`edgeeb",
+"geebd`eccccccc`````cccccccc`edgeeb",
+"geebd`ecccccccccccccccccccc`edgeeb",
+"geebd`ecccccccccccccccccccc`edgeeb",
+"geebd`ecccccccccccccccccccc`edgeeb",
+"geebd`ecccccccccccccccccccc`edgeeb",
+"geebd`eeeeeeeeeeeeeeeeeeeeeeedgeeb",
+"geebd````````````````````````dgeeb",
+"geebddddddddddddddddddddddddddgeeb",
+"geebgggggggggggggggggggggggggggeeb",
+"geeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeb",
+"geeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeb",
+"gbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
+};
diff --git a/images/icnuc.xpm b/images/icnuc.xpm
new file mode 100644 (file)
index 0000000..dd54ff7
--- /dev/null
@@ -0,0 +1,62 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"42 42 13 1",
+/* colors */
+"# c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #BF7900",
+"f c #FF0000",
+"  c #FFFFFF",
+"h c #FFFF00",
+"i c #7F7F00",
+"j c #FF7700",
+"k c #BFBFBF",
+"l c #0000FF",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kaahhhhaaaahhhhaaaahhhhaaaahhhhaaaahhhhaac",
+"kaahhhhaaaahhhhaaaahhhhaaaahhhhaaaahhhhaac",
+"kaaccccccccccccccccccccccccccccccccccccaac",
+"kaac##################################kaac",
+"khhc# # # # # # # # f # # # # # f # ##khhc",
+"khhc## # # # # # # c#c # # # # #c# # #khhc",
+"khhc# # khccccccc c#c#c ccccc #c#c# ##khhc",
+"khhc## kkck#cccc c#c#c#c ccc #c#c#c# #khhc",
+"kaac# kakcccccc f#c#c#c#fcc fc#c#c#cf#kaac",
+"kaac##kkkcccc    c#c#c#c k   #c#c#c# #kaac",
+"kaac# kkkccc   kk c#c#c k  kk #c#c# ##kaac",
+"kaac##kakcc c kkkk c#c k  kkkk #c# a #kaac",
+"khhc# kkkcc  kkkkkc f c  kkkkka f a ##khhc",
+"khhc##kkkcc kkkkkaaaaac kkkkkaaaaac# #khhc",
+"khhc# kakcckakkkaaaaacckkckaaaaaccc ##khhc",
+"khhc##kkkccckkkaaacaccckkkaaaacaccc# #khhc",
+"kaac# kkkcccckacaaaccccckkacaaacccc ##kaac",
+"kaac##kakcccccaaaaccccccccaaacccccc# #kaac",
+"kaac# kkkck#ccc#c#c#cccccccccccck#c ##kaac",
+"kaac##kkahccckkkkkkkkkcccccccccccch# #kaac",
+"khhc# kaaaaaakaaaaaaakaaaaaaaaaaaa# ##khhc",
+"khhc##aaaaaakkachaccakcccccccccca# # #khhc",
+"khhc# # # #kkkcaacaahkccccchcccc# # ##khhc",
+"khhc## # # kkkcacacackcccchccccc # # #khhc",
+"kaac# # # #kkkacafacakccchcccccc# # ##kaac",
+"kaac## # # kkkcacacackcchhhccccc # # #kaac",
+"kaac# # # #kkkhaacaackccchccaaac# # ##kaac",
+"kaac## # # kkkaccahcakcchccccccaakjkk#kaac",
+"khhc# # # #kkkaaaaaaakchccccaaaaakkkk#khhc",
+"khhc## # # kkcacacacaccccccckkkkkkkkk#khhc",
+"khhc# # # #kaaaaaaaaaaaaaaackkkkkkkk##khhc",
+"khhc## # # aaacacacaaacacacakkkkkkkk #khhc",
+"kaac# # # # # # # # # # # aablkkkkkk##kaac",
+"kaac## # # # # # # # # # # # # # # # #kaac",
+"kaac# # # # # # # # # # # # # # # # ##kaac",
+"kaac## # # # # # # # # # # # # # # # #kaac",
+"khhc##################################khhc",
+"khhckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkhhc",
+"khhaaaahhhhaaaahhhhaaaahhhhaaaahhhhaaaahhc",
+"khhaaaahhhhaaaahhhhaaaahhhhaaaahhhhaaaahhc",
+"kccccccccccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icnuchi.xpm b/images/icnuchi.xpm
new file mode 100644 (file)
index 0000000..67e4494
--- /dev/null
@@ -0,0 +1,62 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"42 42 13 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #BF7900",
+"f c #FF0000",
+"g c #FFFFFF",
+"h c #FFFF00",
+"i c #7F7F00",
+"j c #FF7700",
+"k c #BFBFBF",
+"l c #0000FF",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kaahhhhaaaahhhhaaaahhhhaaaahhhhaaaahhhhaac",
+"kaahhhhaaaahhhhaaaahhhhaaaahhhhaaaahhhhaac",
+"kaaccccccccccccccccccccccccccccccccccccaac",
+"kaacggggggggggggggggggggggggggggggggggkaac",
+"khhcgeeeeeeieeeeeeegfgeeeeeeeeegfgeeegkhhc",
+"khhcgieeeeeeeeeeeegc`cgeeeeeeeg`c`geegkhhc",
+"khhcgeeekhcccccccgc`c`cgcccccg`c`c`gegkhhc",
+"khhcgeekkck`ccccgc`c`c`cgcccg`c`c`c`ggkhhc",
+"kaacgekakccccccgf`c`c`c`fccgfc`c`c`cfgkaac",
+"kaacgekkkccccggggc`c`c`cgkggg`c`c`c`ggkaac",
+"kaacgekkkcccgggkkgc`c`cgkggkkg`c`c`gegkaac",
+"kaacgekakccgcgkkkkgc`cgkggkkkkg`c`gaegkaac",
+"khhcgekkkccggkkkkkcgfgcggkkkkkagfgaeegkhhc",
+"khhcgekkkccgkkkkkaaaaacgkkkkkaaaaaceegkhhc",
+"khhcgekakcckakkkaaaaacckkckaaaaaccceegkhhc",
+"khhcgekkkccckkkaaacaccckkkaaaacaccceegkhhc",
+"kaacgekkkcccckacaaaccccckkacaaacccceegkaac",
+"kaacgekakcccccaaaaccccccccaaacccccceegkaac",
+"kaacgekkkck`ccc`c`c`cccccccccccck`ceegkaac",
+"kaacgekkahccckkkkkkkkkccccccccccccheigkaac",
+"khhcgekaaaaaakaaaaaaakaaaaaaaaaaaaieegkhhc",
+"khhcgeaaaaaakkachaccakccccccccccaiieegkhhc",
+"khhcgeeiiiikkkcaacaahkccccchcccciiieegkhhc",
+"khhcgeeeiiikkkcacacackcccchccccciiieegkhhc",
+"kaacgeeeeiikkkacafacakccchcccccciiieegkaac",
+"kaacgeeieeekkkcacacackcchhhcccccieeiegkaac",
+"kaacgeeeeeekkkhaacaackccchccaaacieeeegkaac",
+"kaacgeebdeekkkaccahcakcchccccccaakjkkgkaac",
+"khhcgeeieeekkkaaaaaaakchccccaaaaakkkkgkhhc",
+"khhcgeieebdkkcacacacaccccccckkkkkkkkkgkhhc",
+"khhcgeeeeiekaaaaaaaaaaaaaaackkkkkkkkegkhhc",
+"khhcgeeebdeaaacacacaaacacacakkkkkkkkegkhhc",
+"kaacgeeeieeeiiiiiiiiiiiiiiaablkkkkkkegkaac",
+"kaacgeeieeeeeiiiiiiiiiiiiiiieeeeeeeeegkaac",
+"kaacgeeeeeieeeeeeeeeeeeeeeeeeeeegkgeegkaac",
+"kaacgeeeeeeeeeeeeeeeeieeeeeeeeegkgkeegkaac",
+"khhcggggggggggggggggggggggggggggggggggkhhc",
+"khhckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkhhc",
+"khhaaaahhhhaaaahhhhaaaahhhhaaaahhhhaaaahhc",
+"khhaaaahhhhaaaahhhhaaaahhhhaaaahhhhaaaahhc",
+"kccccccccccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icpark.xpm b/images/icpark.xpm
new file mode 100644 (file)
index 0000000..4cfdf5b
--- /dev/null
@@ -0,0 +1,52 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 11 1",
+/* colors */
+"# c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #BF7900",
+"f c #FF0000",
+"  c #FFFFFF",
+"h c #7F7F00",
+"i c #FF7700",
+"j c #BFBFBF",
+/* pixels */
+"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj",
+"jeebbbbeeeebbbbeeeebbbbeeeebbbbeec",
+"jeebbbbeeeebbbbeeeebbbbeeeebbbbeec",
+"jeecccccccccccccccccccccccccccceec",
+"jeec##########################jeec",
+"jbbc# # # # #dbdbbbdbb# # # ##jbbc",
+"jbbc## # #bbbbbbbdbbdbbdbd # #jbbc",
+"jbbc# # #bdbbbdbbbbdbbdbbdb ##jbbc",
+"jbbc## bbbbbbbbbdbbbbdbdbbdd #jbbc",
+"jeec# #bdbbbbbdbbdbdbdbdbdbd##jeec",
+"jeec##bbbbbdbbbbdbdbdbdbdddbd#jeec",
+"jeec# dbbbbbdbdbbdbdbbdddbbdd#jeec",
+"jeec#bbbdbdbbbbdbdbbddbdbddbd#jeec",
+"jbbc#bbbbdbbdbbbdbdddbdbdbdd##jbbc",
+"jbbc#dbdbdbdbdbdbdbdbddddda# #jbbc",
+"jbbc#bbdbbdbdbdbdbdbddd # a ##jbbc",
+"jbbc##dbbdbdbdbdddddda # #a# #jbbc",
+"jeec# #dddddddddd # #a# # a ##jeec",
+"jeec## # # hhhccc# # a # #a# #jeec",
+"jeec# # # #hhhccc # #a# # a ##jeec",
+"jeec## # # hhhccc# # a ii#a# #jeec",
+"jbbc# # # #hhhccc # #a#ff#a ##jbbc",
+"jbbc## # # hhhccc# # a####a# #jbbc",
+"jbbc# # # hhhcccc # #a ff a ##jbbc",
+"jbbc## #hhhhcccccc # cffffc# #jbbc",
+"jeec# hhhhhcccccccc # # ### ##jeec",
+"jeec#hhhhhccccccceeeee#ee#eee#jeec",
+"jeec#eeehhecceeccceeeeececeee#jeec",
+"jeec#eehheeceeeecceeeececeeee#jeec",
+"jbbc##########################jbbc",
+"jbbcjjjjjjjjjjjjjjjjjjjjjjjjjjjbbc",
+"jbbeeeebbbbeeeebbbbeeeebbbbeeeebbc",
+"jbbeeeebbbbeeeebbbbeeeebbbbeeeebbc",
+"jccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icparkhi.xpm b/images/icparkhi.xpm
new file mode 100644 (file)
index 0000000..7e9905b
--- /dev/null
@@ -0,0 +1,52 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 11 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #BF7900",
+"f c #FF0000",
+"g c #FFFFFF",
+"h c #7F7F00",
+"i c #FF7700",
+"j c #BFBFBF",
+/* pixels */
+"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj",
+"jeebbbbeeeebbbbeeeebbbbeeeebbbbeec",
+"jeebbbbeeeebbbbeeeebbbbeeeebbbbeec",
+"jeecccccccccccccccccccccccccccceec",
+"jeecggggggggggggggggggggggggggjeec",
+"jbbcgggggggggdbdbbbdbbggggggggjbbc",
+"jbbcggggggbbbbbbbdbbdbbdbdggggjbbc",
+"jbbcgggggbdbbbdbbbbdbbdbbdbgggjbbc",
+"jbbcgggbbbbbbbbbdbbbbdbdbbddggjbbc",
+"jeecgggbdbbbbbdbbdbdbdbdbdbdggjeec",
+"jeecggbbbbbdbbbbdbdbdbdbdddbdgjeec",
+"jeecggdbbbbbdbdbbdbdbbdddbbddgjeec",
+"jeecgbbbdbdbbbbdbdbbddbdbddbdgjeec",
+"jbbcgbbbbdbbdbbbdbdddbdbdbddggjbbc",
+"jbbcgdbdbdbdbdbdbdbdbdddddagggjbbc",
+"jbbcgbbdbbdbdbdbdbdbdddgggagggjbbc",
+"jbbcggdbbdbdbdbddddddaggggagggjbbc",
+"jeecgggddddddddddggggaggggagggjeec",
+"jeecggggggghhhcccggggaggggagggjeec",
+"jeecggggggghhhcccggggaggggagggjeec",
+"jeecggggggghhhcccggggagiigagggjeec",
+"jbbcggggggghhhcccgggga`ff`agggjbbc",
+"jbbcggggggghhhcccgggga````agggjbbc",
+"jbbcgggggghhhccccggggagffgagggjbbc",
+"jbbcgggghhhhccccccgggcffffcgggjbbc",
+"jeecgghhhhhccccccccggg`gg`ggggjeec",
+"jeecghhhhhccccccceeeee`ee`eeegjeec",
+"jeecgeeehhecceeccceeeeececeeegjeec",
+"jeecgeehheeceeeecceeeececeeeegjeec",
+"jbbcggggggggggggggggggggggggggjbbc",
+"jbbcjjjjjjjjjjjjjjjjjjjjjjjjjjjbbc",
+"jbbeeeebbbbeeeebbbbeeeebbbbeeeebbc",
+"jbbeeeebbbbeeeebbbbeeeebbbbeeeebbc",
+"jccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icpol.xpm b/images/icpol.xpm
new file mode 100644 (file)
index 0000000..8666dab
--- /dev/null
@@ -0,0 +1,52 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 11 1",
+/* colors */
+"# c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #FF0000",
+"f c #4F4FFF",
+"  c #FFFFFF",
+"h c #FFFF00",
+"i c #BFBFBF",
+"j c #0000FF",
+/* pixels */
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"ijjbbbbjjjjbbbbjjjjbbbbjjjjbbbbjjc",
+"ijjbbbbjjjjbbbbjjjjbbbbjjjjbbbbjjc",
+"ijjccccccccccccccccccccccccccccjjc",
+"ijjc##########################ijjc",
+"ibbc# # # # # # # # # # # # ##ibbc",
+"ibbc## # # # # fcffcfffffff# #ibbc",
+"ibbc# # # # # j###########j ##ibbc",
+"ibbc## # # # jfaaaaaaaaaa#j# #ibbc",
+"ijjc# # jacccffahhhaahhaa#jca#ijjc",
+"ijjc## jfacccfjchcchchcha#jca#ijjc",
+"ijjc# jffaca#jfchhhcchcha#jca#ijjc",
+"ijjc##ffjacccffchccachcha#jca#ijjc",
+"ibbc# fjfacccfjchaaachcha#jca#ibbc",
+"ibbc##jffaca#jfchaaachhca#jca#ibbc",
+"ibbc# ffjacccffcaaaacccaa#jca#ibbc",
+"ibbc##fjfacccfjjjjjjjjjjjjcca#ibbc",
+"ijjc# jffaaaaj#j#j#j#j#j#aaaa#ijjc",
+"ijjc##ffjjjjjjj j###j jjjjjj #ijjc",
+"ijjc# fjj#j#j#aj#ccja#j#j#j ##ijjc",
+"ijjc##jjjjjjjaj#ccjajjjjjj # #ijjc",
+"ibbc# # # # #acaccaca # # # ##ibbc",
+"ibbc## # # #ccccccccccc# # # #ibbc",
+"ibbc# # # #aaacccccccccc# # ##ibbc",
+"ibbc## # #aa #aa # #a# aa# # #ibbc",
+"ijjc# # # aaaaaja##aajaaa # ##ijjc",
+"ijjc## # #aa a##a ea## aa# # #ijjc",
+"ijjc# # # aa#a ea##a e#aa # ##ijjc",
+"ijjc## # #aa a##aaaa## aa# # #ijjc",
+"ibbc##########################ibbc",
+"ibbciiiiiiiiiiiiiiiiiiiiiiiiiiibbc",
+"ibbjjjjbbbbjjjjbbbbjjjjbbbbjjjjbbc",
+"ibbjjjjbbbbjjjjbbbbjjjjbbbbjjjjbbc",
+"iccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icpolhi.xpm b/images/icpolhi.xpm
new file mode 100644 (file)
index 0000000..f86a6d3
--- /dev/null
@@ -0,0 +1,52 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 11 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #FF0000",
+"f c #4F4FFF",
+"g c #FFFFFF",
+"h c #FFFF00",
+"i c #BFBFBF",
+"j c #0000FF",
+/* pixels */
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"ijjbbbbjjjjbbbbjjjjbbbbjjjjbbbbjjc",
+"ijjbbbbjjjjbbbbjjjjbbbbjjjjbbbbjjc",
+"ijjccccccccccccccccccccccccccccjjc",
+"ijjcggggggggggggggggggggggggggijjc",
+"ibbcgbb`bbbbbbbbbcbbcbbbbbbbbgibbc",
+"ibbcgaibbbababbfcffcfffffffbbgibbc",
+"ibbcgaibbbbabbj```````````jbbgibbc",
+"ibbcgccbbbabajfaaaaaaaaaa`jbbgibbc",
+"ijjcgbbbjacccffahhhaahhaa`jcagijjc",
+"ijjcgcbjfacccfjchcchchcha`jcagijjc",
+"ijjcgbjffaca`jfchhhcchcha`jcagijjc",
+"ijjcgbffjacccffchccachcha`jcagijjc",
+"ibbcgbfjfacccfjchaaachcha`jcagibbc",
+"ibbcgbjffaca`jfchaaachhca`jcagibbc",
+"ibbcgbffjacccffcaaaacccaa`jcagibbc",
+"ibbcgbfjfacccfjjjjjjjjjjjjccagibbc",
+"ijjcgbjffaaaaj`j`j`j`j`j`aaaagijjc",
+"ijjcgbffjjjjjjjgj```jgjjjjjjbgijjc",
+"ijjcgbfjj`j`j`aj`ccja`j`j`jdbgijjc",
+"ijjcgbjjjjjjjaj`ccjajjjjjjddbgijjc",
+"ibbcgbbddddddacaccacadddddddbgibbc",
+"ibbcgbbbddddcccccccccccdddddbgibbc",
+"ibbcgbbbbbbaaaccccccccccdbbbbgibbc",
+"ibbcgbbbdbaabbaabbbbabbaabdbbgibbc",
+"ijjcgbbbbbaaaaaja``aajaaabbbdgijjc",
+"ijjcgbdbbbaaba``agea``baabbbbgijjc",
+"ijjcgbbbdbaabagea``agebaabbdbgijjc",
+"ijjcgbdbbbaaba``aaaa``baadbbbgijjc",
+"ibbcggggggggggggggggggggggggggibbc",
+"ibbciiiiiiiiiiiiiiiiiiiiiiiiiiibbc",
+"ibbjjjjbbbbjjjjbbbbjjjjbbbbjjjjbbc",
+"ibbjjjjbbbbjjjjbbbbjjjjbbbbjjjjbbc",
+"iccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icqry.xpm b/images/icqry.xpm
new file mode 100644 (file)
index 0000000..e7fc561
--- /dev/null
@@ -0,0 +1,49 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 8 1",
+/* colors */
+"# c #000000"
+"` c #7F7F7F",
+"a c #5D5D5D",
+"  c #FFFFFF",
+"c c #FFFF00",
+"d c #FF7700",
+"e c #BFBFBF",
+"f c #ff0000",
+/* pixels */
+"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+"edddddddddddddddddddddddddddddddda",
+"edddddddddddddddddddddddddddddddda",
+"eddaaaaaaaaaaaaaaaaaaaaaaaaaaaadda",
+"edda##########################edda",
+"edda## # # # # # # # # # # # #edda",
+"edda# # # # #cccccc # # # # ##edda",
+"edda## # # #cddddddf # # # # #edda",
+"edda# # # #cddddddddf # # # ##edda",
+"edda## # #cdddffffdddf # # # #edda",
+"edda# # #cdddf# # cdddf # # ##edda",
+"edda## # cddf# # # cddf# # # #edda",
+"edda# # #cddf # # #cddf # # ##edda",
+"edda## # #ff # # # cddf# # # #edda",
+"edda# # # # # # # cdddf # # ##edda",
+"edda## # # # # # cdddf # # # #edda",
+"edda# # # # # # cdddf # # # ##edda",
+"edda## # # # # cdddf # # # # #edda",
+"edda# # # # # cdddf # # # # ##edda",
+"edda## # # # #cddf # # # # # #edda",
+"edda# # # # # cddf# # # # # ##edda",
+"edda## # # # #cddf # # # # # #edda",
+"edda# # # # # #ff # # # # # ##edda",
+"edda## # # # # # # # # # # # #edda",
+"edda# # # # # cccc# # # # # ##edda",
+"edda## # # # cddddf# # # # # #edda",
+"edda# # # # #cddddf # # # # ##edda",
+"edda## # # # #ffff # # # # # #edda",
+"edda# # # # # # # # # # # # ##edda",
+"edda##########################edda",
+"eddaeeeeeeeeeeeeeeeeeeeeeeeeeeedda",
+"edddddddddddddddddddddddddddddddda",
+"edddddddddddddddddddddddddddddddda",
+"eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+};
diff --git a/images/icqryhi.xpm b/images/icqryhi.xpm
new file mode 100644 (file)
index 0000000..0e070a8
--- /dev/null
@@ -0,0 +1,49 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 8 1",
+/* colors */
+"# c #000000"
+"` c #7F7F7F",
+"a c #5D5D5D",
+"  c #FFFFFF",
+"c c #FFFF00",
+"d c #FF7700",
+"e c #BFBFBF",
+"f c #ff0000",
+/* pixels */
+"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+"edddddddddddddddddddddddddddddddda",
+"edddddddddddddddddddddddddddddddda",
+"eddaaaaaaaaaaaaaaaaaaaaaaaaaaaadda",
+"edda                          edda",
+"edda                          edda",
+"edda         cccccc           edda",
+"edda        cddddddf          edda",
+"edda       cddddddddf         edda",
+"edda      cdddffffdddf        edda",
+"edda     cdddf    cdddf       edda",
+"edda     cddf      cddf       edda",
+"edda     cddf      cddf       edda",
+"edda      ff       cddf       edda",
+"edda              cdddf       edda",
+"edda             cdddf        edda",
+"edda            cdddf         edda",
+"edda           cdddf          edda",
+"edda          cdddf           edda",
+"edda          cddf            edda",
+"edda          cddf            edda",
+"edda          cddf            edda",
+"edda           ff             edda",
+"edda                          edda",
+"edda          cccc            edda",
+"edda         cddddf           edda",
+"edda         cddddf           edda",
+"edda          ffff            edda",
+"edda                          edda",
+"edda                          edda",
+"eddaeeeeeeeeeeeeeeeeeeeeeeeeeeedda",
+"edddddddddddddddddddddddddddddddda",
+"edddddddddddddddddddddddddddddddda",
+"eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+};
diff --git a/images/icrail.xpm b/images/icrail.xpm
new file mode 100644 (file)
index 0000000..6332f56
--- /dev/null
@@ -0,0 +1,38 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"56 24 7 1",
+/* colors */
+"# c #000000",
+"a c #7F7F7F",
+"b c #5D5D5D",
+"c c #FF0000",
+"  c #FFFFFF",
+"e c #7F7F00",
+"f c #BFBFBF",
+/* pixels */
+"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"fbbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeb",
+"fbbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeb",
+"feebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbeeb",
+"feeb################################################feeb",
+"feeb# # # # # # # # # #fffffffffffffffffff# # # # ##fbbb",
+"fbbb## # # # # # # # ##                   ## # # # #fbbb",
+"fbbb# #ee #ee #ee #ef#a c               c #be #ee ##fbbb",
+"fbbb###ee##ee##ee##ffa#                   bbe##ee# #feeb",
+"fbbb# aaaaaaaaaaaaaff##                   #baaaaaa##feeb",
+"feeb###eeb#eeb#eeb#ff###ffbbffbbffbbffbbf##beb#eeb #feeb",
+"feeb# #ee #ee #ee #fff#aabbaabbaabbaabbaaaabe #ee ##feeb",
+"feeb###ee##ee##ee##ffaaaaaaaaaaaaaaaaaaaaabee##ee# #fbbb",
+"feeb# #ee #ee #ee #eeaabbbbaaaaaaaabbbbaab#ee #ee ##fbbb",
+"fbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa #fbbb",
+"fbbb# #eeb#eeb#eeb#eeb#eeb#eeb#eeb#eeb#eeb#eeb#eeb##fbbb",
+"fbbb###ee##ee##ee##ee##ee##ee##ee##ee##ee##ee##ee# #feeb",
+"fbbb# ### ### ### ### ### ### ### ### ### ### ### ##feeb",
+"feeb## # # # # # # # # # # # # # # # # # # # # # # #feeb",
+"feeb################################################feeb",
+"feebfffffffffffffffffffffffffffffffffffffffffffffffffeeb",
+"feebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbb",
+"feebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbb",
+"fbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
+};
diff --git a/images/icrailhi.xpm b/images/icrailhi.xpm
new file mode 100644 (file)
index 0000000..88d9779
--- /dev/null
@@ -0,0 +1,38 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"56 24 7 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #5D5D5D",
+"c c #FF0000",
+"d c #FFFFFF",
+"e c #7F7F00",
+"f c #BFBFBF",
+/* pixels */
+"ffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"fbbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeb",
+"fbbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeb",
+"feebbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbeeb",
+"feebddddddddddddddddddddddddddddddddddddddddddddddddfbbb",
+"feebdddddddddddddddddddfffffffffffffffffffddddddddddfbbb",
+"fbbbddddddddddddddddd``ddddddddddddddddddd`dddddddddfbbb",
+"fbbbdd`eed`eed`eed`ef`adcdddddddddddddddcd`bed`eedddfbbb",
+"fbbbdd`eed`eed`eed`ffa`dddddddddddddddddddbbed`eedddfeeb",
+"fbbbddaaaaaaaaaaaaaff``ddddddddddddddddddd`baaaaaaddfeeb",
+"feebdd`eeb`eeb`eeb`ff```ffbbffbbffbbffbbf``beb`eebddfeeb",
+"feebdd`eed`eed`eed`fff`aabbaabbaabbaabbaaaabed`eedddfeeb",
+"feebdd`eed`eed`eed`ffaaaaaaaaaaaaaaaaaaaaabeed`eedddfbbb",
+"feebdd`eed`eed`eed`eeaabbbbaaaaaaaabbbbaab`eed`eedddfbbb",
+"fbbbddaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddfbbb",
+"fbbbdd`eeb`eeb`eeb`eeb`eeb`eeb`eeb`eeb`eeb`eeb`eebddfbbb",
+"fbbbdd`eed`eed`eed`eed`eed`eed`eed`eed`eed`eed`eedddfeeb",
+"fbbbdd```d```d```d```d```d```d```d```d```d```d```dddfeeb",
+"feebddddddddddddddddddddddddddddddddddddddddddddddddfeeb",
+"feebddddddddddddddddddddddddddddddddddddddddddddddddfeeb",
+"feebfffffffffffffffffffffffffffffffffffffffffffffffffeeb",
+"feebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbb",
+"feebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbeeeebbbbb",
+"fbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
+};
diff --git a/images/icres.xpm b/images/icres.xpm
new file mode 100644 (file)
index 0000000..bb49b4c
--- /dev/null
@@ -0,0 +1,65 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 50 8 1",
+/* colors */
+"# c #000000",
+"a c #0000AF",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #BF7900",
+"  c #FFFFFF",
+"f c #BFBFBF",
+"g c #0000FF",
+/* pixels */
+"ffffffffffffffffffffffffffffffffff",
+"fbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc",
+"fbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc",
+"fbbccccccccccccccccccccccccccccbbc",
+"fbbc##########################fbbc",
+"fbbc# # # # # ### # # # # # ##fbbc",
+"fbbc## # # # #cc## # # # # # #fbbc",
+"fbbc# # # # #ccccc### # # # ##fbbc",
+"fbbc## # # #ccccc#####ccc# # #fbbc",
+"fbbc# # # #ccccc##gg##ccc # ##fbbc",
+"fbbc## # #ccccc##gggg##cc# # #fbbc",
+"fbbc# # #ccccc##gggggg##c # ##fbbc",
+"fbbc## #ccccc##gggaaggg### # #fbbc",
+"fbbc# ##cccc##gggggggggg### ##fbbc",
+"fbbc## ##cc##gggggggggggg### #fbbc",
+"fbbc# #aa###gaggagaagaggag####fbbc",
+"fbbc## aaa#gggggggggggggggg# #fbbc",
+"fbbc# #aaaagggggggggggggggg ##fbbc",
+"fbbc## aaaagggggggggggggggg# #fbbc",
+"fbbc# #aaaaggg####ggcc#ccgg ##fbbc",
+"fbbc## aaaaggg####ggcc#ccgg# #fbbc",
+"fbbc##baaaaggg####gg#####ggbb#fbbc",
+"fbbc##b#aaagggc###ggcc#ccgg#b#fbbc",
+"fbbc##b #aaggg####ggcc#ccgg#b#fbbc",
+"fbbc##b# #aggg####ggggggggg#b#fbbc",
+"fbbc##b # #ggg####ggggggggg#b#fbbc",
+"fbbc##b# # # # # # # # # # #b#fbbc",
+"fbbc##b # # #bbbbbbb# # # ##b#fbbc",
+"fbbc##b# # ###bb###bb# # # #b#fbbc",
+"fbbc##b # # ##bb# ##bb# # ##b#fbbc",
+"fbbc##b# # # #bb # #bb # # #b#fbbc",
+"fbbc##b # # ##bb# ##bb# # ##b#fbbc",
+"fbbc##b# # # #bb # bb# # # #b#fbbc",
+"fbbc##b # # ##bbbbbb# # # ##b#fbbc",
+"fbbc##b# # # #bb #bb # # # #b#fbbc",
+"fbbc##b # # ##bb###bb # # ##b#fbbc",
+"fbbc##b# # # #bb ###bb # # #b#fbbc",
+"fbbc##b # # #bbbb #bbbb # ##b#fbbc",
+"fbbc##b# # ##### ##### # # #b#fbbc",
+"fbbc##b # # # # # # # # # ##b#fbbc",
+"fbbc##b# # # # # # # # # # #b#fbbc",
+"fbbc##b # # # # # # # # # ##b#fbbc",
+"fbbc##b# # # # # # # # # # #b#fbbc",
+"fbbc##bbbbbbbbbbbbbbbbbbbbbbb#fbbc",
+"fbbc##########################fbbc",
+"fbbc##########################fbbc",
+"fbbcfffffffffffffffffffffffffffbbc",
+"fbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc",
+"fbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc",
+"fccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icreshi.xpm b/images/icreshi.xpm
new file mode 100644 (file)
index 0000000..99c0a87
--- /dev/null
@@ -0,0 +1,65 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 50 8 1",
+/* colors */
+"` c #000000",
+"a c #0000AF",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #BF7900",
+"e c #FFFFFF",
+"f c #BFBFBF",
+"g c #0000FF",
+/* pixels */
+"ffffffffffffffffffffffffffffffffff",
+"fbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc",
+"fbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc",
+"fbbccccccccccccccccccccccccccccbbc",
+"fbbceeeeeeeeeeeeeeeeeeeeeeeeeefbbc",
+"fbbceeeeeeeeee``eeeeeeeeeeeeeefbbc",
+"fbbceeeeeeeee`cc``eeeeeeeeeeeefbbc",
+"fbbceeeeeeee`ccccc``eeeeeeeeeefbbc",
+"fbbceeeeeee`ccccc````eccceeeeefbbc",
+"fbbceeeeee`ccccc``gg``ccceeeeefbbc",
+"fbbceeeee`ccccc``gggg``cceeeeefbbc",
+"fbbceeee`ccccc``gggggg``ceeeeefbbc",
+"fbbceee`ccccc``gggaaggg``eeeeefbbc",
+"fbbcee``cccc``gggggggggg``eeeefbbc",
+"fbbceee``cc``gggggggggggg``eeefbbc",
+"fbbceeeaa```gaggagaagaggag``eefbbc",
+"fbbceeeaaa`ggggggggggggggggeeefbbc",
+"fbbceeeaaaaggggggggggggggggeeefbbc",
+"fbbceeeaaaaggggggggggggggggeeefbbc",
+"fbbceeeaaaaggg````ggcc`ccggeeefbbc",
+"fbbceeeaaaaggg````ggcc`ccggeeefbbc",
+"fbbce`baaaaggg````gg`````ggbbefbbc",
+"fbbce`bdaaagggc```ggcc`ccgg`befbbc",
+"fbbce`bddaaggg````ggcc`ccgg`befbbc",
+"fbbce`bdddaggg````ggggggggg`befbbc",
+"fbbce`bddddggg````ggggggggg`befbbc",
+"fbbce`bdddddddddddddddddddd`befbbc",
+"fbbce`bddddddbbbbbbbddddddd`befbbc",
+"fbbce`bddddd``bb```bbdddddd`befbbc",
+"fbbce`bdddddd`bbdd``bbddddd`befbbc",
+"fbbce`bdddddd`bbddd`bbddddd`befbbc",
+"fbbce`bdddddd`bbddd`bbddddd`befbbc",
+"fbbce`bdddddd`bbdddbbdddddd`befbbc",
+"fbbce`bdddddd`bbbbbbddddddd`befbbc",
+"fbbce`bdddddd`bbd`bbddddddd`befbbc",
+"fbbce`bdddddd`bbd``bbdddddd`befbbc",
+"fbbce`bdddddd`bbdd``bbddddd`befbbc",
+"fbbce`bddddddbbbbddbbbbdddd`befbbc",
+"fbbce`bddddd````dd````ddddd`befbbc",
+"fbbce`bdddddddddddddddddddd`befbbc",
+"fbbce`bdddddddddddddddddddd`befbbc",
+"fbbce`bdddddddddddddddddddd`befbbc",
+"fbbce`bdddddddddddddddddddd`befbbc",
+"fbbce`bbbbbbbbbbbbbbbbbbbbbbbefbbc",
+"fbbce````````````````````````efbbc",
+"fbbceeeeeeeeeeeeeeeeeeeeeeeeeefbbc",
+"fbbcfffffffffffffffffffffffffffbbc",
+"fbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc",
+"fbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc",
+"fccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icroad.xpm b/images/icroad.xpm
new file mode 100644 (file)
index 0000000..1904010
--- /dev/null
@@ -0,0 +1,36 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"56 24 5 1",
+/* colors */
+"# c #000000",
+"a c #7F7F7F",
+"b c #5D5D5D",
+"  c #FFFFFF",
+"d c #BFBFBF",
+/* pixels */
+"dddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
+"dbbbb    bbbb    bbbb    bbbb    bbbb    bbbb    bbbb  b",
+"dbbbb    bbbb    bbbb    bbbb    bbbb    bbbb    bbbb  b",
+"d  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb  b",
+"d  b################################################d  b",
+"d  b# # # # # # # # # # # # # # # # # # # # # # # ##dbbb",
+"d  b##bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb #dbbb",
+"dbbb# b aad#bbbbbbbbbbbb aad#bbbbbb aad#bbbb aad#b##dbbb",
+"dbbb##b aad#bbbbbbbbbbbb aad#bbbbbb aad#bbbb aad#b #dbbb",
+"dbbb# b#####bbbbbbbbbbbb#####bbbbbb#####bbbb#####b##d  b",
+"dbbb##bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb #d  b",
+"d  b# bbbb# # bbbb# # bbbb# # bbbb# # bbbb# # bbbb##d  b",
+"d  b##bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb #d  b",
+"d  b# bb aad#bbbbb aad#bbbbbbbbb aad#bbbbbb aad#bb##dbbb",
+"d  b##bb aad#bbbbb aad#bbbbbbbbb aad#bbbbbb aad#bb #dbbb",
+"dbbb# bb#####bbbbb#####bbbbbbbbb#####bbbbbb#####bb##dbbb",
+"dbbb##bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb #dbbb",
+"dbbb# ##############################################d  b",
+"dbbb## # # # # # # # # # # # # # # # # # # # # # # #d  b",
+"d  b################################################d  b",
+"d  bddddddddddddddddddddddddddddddddddddddddddddddddd  b",
+"d  bbbb    bbbb    bbbb    bbbb    bbbb    bbbb    bbbbb",
+"d  bbbb    bbbb    bbbb    bbbb    bbbb    bbbb    bbbbb",
+"dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
+};
diff --git a/images/icroadhi.xpm b/images/icroadhi.xpm
new file mode 100644 (file)
index 0000000..c06c620
--- /dev/null
@@ -0,0 +1,36 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"56 24 5 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #5D5D5D",
+"c c #FFFFFF",
+"d c #BFBFBF",
+/* pixels */
+"dddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
+"dbbbbccccbbbbccccbbbbccccbbbbccccbbbbccccbbbbccccbbbbccb",
+"dbbbbccccbbbbccccbbbbccccbbbbccccbbbbccccbbbbccccbbbbccb",
+"dccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccb",
+"dccbccccccccccccccccccccccccccccccccccccccccccccccccdccb",
+"dccbccccccccccccccccccccccccccccccccccccccccccccccccdbbb",
+"dccbccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccdbbb",
+"dbbbccbcaad`bbbbbbbbbbbbcaad`bbbbbbcaad`bbbbcaad`bccdbbb",
+"dbbbccbcaad`bbbbbbbbbbbbcaad`bbbbbbcaad`bbbbcaad`bccdbbb",
+"dbbbccb`````bbbbbbbbbbbb`````bbbbbb`````bbbb`````bccdccb",
+"dbbbccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccdccb",
+"dccbccbbbbccccbbbbccccbbbbccccbbbbccccbbbbccccbbbbccdccb",
+"dccbccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccdccb",
+"dccbccbbcaad`bbbbbcaad`bbbbbbbbbcaad`bbbbbbcaad`bbccdbbb",
+"dccbccbbcaad`bbbbbcaad`bbbbbbbbbcaad`bbbbbbcaad`bbccdbbb",
+"dbbbccbb`````bbbbb`````bbbbbbbbb`````bbbbbb`````bbccdbbb",
+"dbbbccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccdbbb",
+"dbbbcc````````````````````````````````````````````ccdccb",
+"dbbbccccccccccccccccccccccccccccccccccccccccccccccccdccb",
+"dccbccccccccccccccccccccccccccccccccccccccccccccccccdccb",
+"dccbdddddddddddddddddddddddddddddddddddddddddddddddddccb",
+"dccbbbbccccbbbbccccbbbbccccbbbbccccbbbbccccbbbbccccbbbbb",
+"dccbbbbccccbbbbccccbbbbccccbbbbccccbbbbccccbbbbccccbbbbb",
+"dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
+};
diff --git a/images/icseap.xpm b/images/icseap.xpm
new file mode 100644 (file)
index 0000000..995e5e9
--- /dev/null
@@ -0,0 +1,62 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"42 42 13 1",
+/* colors */
+"# c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #BF7900",
+"f c #4F4FFF",
+"  c #FFFFFF",
+"h c #FFFF00",
+"i c #7F7F00",
+"j c #FF7700",
+"k c #BFBFBF",
+"l c #0000FF",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kaallllaaaallllaaaallllaaaallllaaaallllaac",
+"kaallllaaaallllaaaallllaaaallllaaaallllaac",
+"kaaccccccccccccccccccccccccccccccccccccaac",
+"kaac##################################kaac",
+"kllc# # # # # # # # # # #aaa# # # # ##kllc",
+"kllc## # # # # # # # # # aka # # # # #kllc",
+"kllc# # aaaaaaaaaaaaaa#aaaaa# # # # ##kllc",
+"kllc## #akakah#kakaka#c#akkkaaac # # #kllc",
+"kaac#aaaaaaaakkkaaakkk#akaackaaa# # ##kaac",
+"kaac#kakaka#kaacaakaachkkaaccaka # # #kaac",
+"kaac#aaaaaakkaacckkaacckkaaccaac# # ##kaac",
+"kaac## # # kckkkkkkkkkkkkkkkkaka # # #kaac",
+"kllc# # # #kkkaaaaaaaaaaaaaakaaa# # ##kllc",
+"kllc## # kkkckaaaaaaklaaaaaakaka # # #kllc",
+"kllc# # kccckcakcaaklklaakcakcaa# # ##kllc",
+"kllc## kkccakkaaaaaaklaaaaaakcka # # #kllc",
+"kaac# #kkccackaaaaaaklaaaaaakcaa# # ##kaac",
+"kaac## kkccakkaaaaaaklaaaaaakcka # # #kaac",
+"kaac# #kaaaakkakcaklklklakcakcaa# # ##kaac",
+"kaac## aa#aackaaaaaklllaaaaakckaaaaaa#kaac",
+"kllc# # # akkkkkkkkkkkkkkkkkkcaaakaak#kllc",
+"kllc## # #kckaaaaaaaaaaaaaaacckaaaaaa#kllc",
+"kllc# # # kkkccccccccccccccacaaa# # ##kllc",
+"kllc## # #kckccccccccccccccacaka # # #kllc",
+"kaac# # # ckaaaaaaaaaaaaaaaccaaa# # ##kaac",
+"kaac## # #kaaccaaccaaccaaaiccaka # # #kaac",
+"kaac# # # aaccacccaaccaaaiiccaaa# # ##kaac",
+"kaac## # # ccccccccccccccccccaka # # #kaac",
+"kllc# # # # # #aakckcaaaaakjaaaa# # ##kllc",
+"kllc## # # # # aaakakakakakckaka # # #kllc",
+"kllc# # # # # #aaaaaaaaaaakjaaaa# # ##kllc",
+"kllc## # # # # # akaa# # # # # # # # #kllc",
+"kaac# # # #aaaaaaaaaa # # # # # # # ##kaac",
+"kaac## # # akakakakaa# # # # # # # # #kaac",
+"kaac# # # #aaaaaaaaaa # # # # # # # ##kaac",
+"kaac## # # cka # # # # # # # # # # # #kaac",
+"kllc##################################kllc",
+"kllckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkllc",
+"kllaaaallllaaaallllaaaallllaaaallllaaaallc",
+"kllaaaallllaaaallllaaaallllaaaallllaaaallc",
+"kccccccccccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icseaphi.xpm b/images/icseaphi.xpm
new file mode 100644 (file)
index 0000000..e5990db
--- /dev/null
@@ -0,0 +1,62 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"42 42 13 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #BF7900",
+"f c #4F4FFF",
+"g c #FFFFFF",
+"h c #FFFF00",
+"i c #7F7F00",
+"j c #FF7700",
+"k c #BFBFBF",
+"l c #0000FF",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kaallllaaaallllaaaallllaaaallllaaaallllaac",
+"kaallllaaaallllaaaallllaaaallllaaaallllaac",
+"kaaccccccccccccccccccccccccccccccccccccaac",
+"kaacggggggggggggggggggggggggggggggggggkaac",
+"kllcgeeeeeeeeeeeeeeeeeeeeaaaeeeecjjeegkllc",
+"kllcgeeeieeeeeeeieeeeeeeeakaeeeceejjegkllc",
+"kllcgeeeaaaaaaaaaaaaaa`aaaaaeeeeee`jjgkllc",
+"kllcgeeeakakah`kakaka`c`akkkaaace`e`jgkllc",
+"kaacgaaaaaaaakkkaaakkk`akaackaaa`c`ejgkaac",
+"kaacgkakakaekaacaakaachkkaaccakac`cccgkaac",
+"kaacgaaaaaakkaacckkaacckkaaccaaceka`cgkaac",
+"kaacgeeeeeekckkkkkkkkkkkkkkkkakaekaacgkaac",
+"kllcgeeeeeekkkaaaaaaaaaaaaaakaaaaka`cgkllc",
+"kllcgeeeekkkckaaaaaaklaaaaaakakaakcccgkllc",
+"kllcgeeekccckcakcaaklklaakcakcaaecciigkllc",
+"kllcgeekkccakkaaaaaaklaaaaaakckaadiiigkllc",
+"kaacgeekkccackaaaaaaklaaaaaakcaabdeeegkaac",
+"kaacgeekkccakkaaaaaaklaaaaaakckaadadegkaac",
+"kaacgeekaaaakkakcaklklklakcakcaabdbdegkaac",
+"kaacgeeaaiaackaaaaaklllaaaaakckaaaaaagkaac",
+"kllcgeeeiiakkkkkkkkkkkkkkkkkkcaaakaakgkllc",
+"kllcgeefcikckaaaaaaaaaaaaaaacckaaaaaagkllc",
+"kllcgeeflekkkccccccccccccccacaaaeeeeegkllc",
+"kllcgeefcekckccccccccccccccacakaeekaagkllc",
+"kaacgeefleckaaaaaaaaaaaaaaaccaaaehkkkgkaac",
+"kaacgeefcekaaccaaccaaccaaaiccakahchchgkaac",
+"kaacgeefleaaccacccaaccaaaiiccaaachchcgkaac",
+"kaacgeeeeeeccccccccccccccccccakaechcegkaac",
+"kllcgeeeeeekcecaakckcaaaaakjaaaaeeieigkllc",
+"kllcgjjjjjjjjjjaaakakakakakckakaeekcegkllc",
+"kllcgeeeekceeeeaaaaaaaaaaakjaaaaeeeeegkllc",
+"kllcgeeekceeeeeeeakaaeeeekcceeeekcekcgkllc",
+"kaacgeeeieeaaaaaaaaaaecckcejeeeeeeeeegkaac",
+"kaacgeeeeieakakakakaaeckceeceeieiekcegkaac",
+"kaacge`eeeiaaaaaaaaaaececeejeeieieeeegkaac",
+"kaacgeeeeeeckaeeeeeeeeceeeeceeeeeeeeegkaac",
+"kllcggggggggggggggggggggggggggggggggggkllc",
+"kllckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkllc",
+"kllaaaallllaaaallllaaaallllaaaallllaaaallc",
+"kllaaaallllaaaallllaaaallllaaaallllaaaallc",
+"kccccccccccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icstad.xpm b/images/icstad.xpm
new file mode 100644 (file)
index 0000000..a9894f9
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"42 42 8 1",
+/* colors */
+"# c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #BF7900",
+"  c #FFFFFF",
+"g c #BFBFBF",
+/* pixels */
+"gggggggggggggggggggggggggggggggggggggggggg",
+"gaabbbbaaaabbbbaaaabbbbaaaabbbbaaaabbbbaac",
+"gaabbbbaaaabbbbaaaabbbbaaaabbbbaaaabbbbaac",
+"gaaccccccccccccccccccccccccccccccccccccaac",
+"gaac##################################gaac",
+"gbbc## # # # aaa # # # ggggggg # # # #gbbc",
+"gbbc# # # # #aaa# # #ggcccccccgg# # ##gbbc",
+"gbbc## aaaaaaaaa # # ccc#####cccg# # #gbbc",
+"gbbc# #aaaaaaaaa# #gcc##ccccc##ccg# ##gbbc",
+"gaac#aaaaaaaaaaa # gc#ccc###ccc#cg # #gaac",
+"gaac#aaacacacaca# gc#c###ccc###c#cg ##gaac",
+"gaac## aaaaaaaaa #g#c#c#c#c#c#c#c#g# #gaac",
+"gaac# #aaaaaaaaa#cgc###########cc#g ##gaac",
+"gbbc## acacacacacc #ccacccccccc#c#g# #gbbc",
+"gbbc# #aaaaaaaaac  #c#########c#c#g ##gbbc",
+"gbbc## aaaaaaaaa   #c#dddggdd#c#c#g# #gbbc",
+"gbbc# #acacacaca  g#c#bbbgbbb#c#c#g ##gbbc",
+"gaac## aaaaaaaaa cg#c#bdbbbdb#c#c#g# #gaac",
+"gaac# #aaaaaaaaaccg#c#bdbbbdb#a#c#g ##gaac",
+"gaac## acacacacacgg#c#bbbbbbb#c#c#g# #gaac",
+"gaac# #aaaaaaaaaggg#c#dbdbdbd#a#c#g ##gaac",
+"gbbc## aaaaaaaaaggg#c#bbbbbbb#c#c#g# #gbbc",
+"gbbc# #acacacacagcg#c#bdbbbdb#a#c#g ##gbbc",
+"gbbc## aaaaaaaaaccg#c#bdbbbdb#c#c#g# #gbbc",
+"gbbc# #aaaaaaaaacgg#c#bbbggbb#c#c#g ##gbbc",
+"gaac## acacacacaggg#c#dddgddd#c#c#g# #gaac",
+"gaac# #aaaaaaaaaggg#c#########c#c#g ##gaac",
+"gaac## aaaaaaaaaggg#ccccccccccc#c#g# #gaac",
+"gaac# #acacacacagggc###########cc#g ##gaac",
+"gbbc#aaaaaaaaaaagggc#cc#c#c#c#c#c#g# #gbbc",
+"gbbc#aaaaaaaaaaa#aag#ccc#####ccc#g# ##gbbc",
+"gbbc## #aaaaaaaa aagc##ccccccc##cg # #gbbc",
+"gbbc# # #aaaaaaa#aaagcc#######ccg # ##gbbc",
+"gaac## # # aaa # #acaggcccccccgg # # #gaac",
+"gaac# # # #aaa# # #aacaggggggg# # # ##gaac",
+"gaac## # # aaa # # #caacaaccc# # # # #gaac",
+"gaac# # # #aaa# # # cacaaccc# # # # ##gaac",
+"gbbc##################################gbbc",
+"gbbcgggggggggggggggggggggggggggggggggggbbc",
+"gbbaaaabbbbaaaabbbbaaaabbbbaaaabbbbaaaabbc",
+"gbbaaaabbbbaaaabbbbaaaabbbbaaaabbbbaaaabbc",
+"gccccccccccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icstadhi.xpm b/images/icstadhi.xpm
new file mode 100644 (file)
index 0000000..6657632
--- /dev/null
@@ -0,0 +1,58 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"42 42 9 1",
+/* colors */
+"# c #000000",
+"a c #7F7F7F",
+"b c #00FF00",
+"c c #5D5D5D",
+"d c #007F00",
+"e c #BF7900",
+"  c #FFFFFF",
+"g c #BFBFBF",
+"h c #7F7F00",
+/* pixels */
+"gggggggggggggggggggggggggggggggggggggggggg",
+"gaabbbbaaaabbbbaaaabbbbaaaabbbbaaaabbbbaac",
+"gaabbbbaaaabbbbaaaabbbbaaaabbbbaaaabbbbaac",
+"gaaccccccccccccccccccccccccccccccccccccaac",
+"gaac                                  gaac",
+"gbbc eeeebeebaaabebebeegggggggeeeeeee gbbc",
+"gbbc eeedeebeaaadeeeeggcccccccggeebee gbbc",
+"gbbc eeaaaaaaaaaeeedgccc#####cccgeeee gbbc",
+"gbbc ebaaaaaaaaaedbgcc##ccccc##ccgeee gbbc",
+"gaac aaaaaaaaaaaeeegc#ccc###ccc#cgeeb gaac",
+"gaac aaacacacacaeegc#c###ccc###c#cgee gaac",
+"gaac eeaaaaaaaaabeg#c#c#c#c#c#c#c#gee gaac",
+"gaac eeaaaaaaaaaecgc###########cc#gee gaac",
+"gbbc eeacacacacacc #ccacccccccc#c#gee gbbc",
+"gbbc ebaaaaaaaaac  #c#########c#c#gee gbbc",
+"gbbc edaaaaaaaaa   #c#dddggdd#c#c#gee gbbc",
+"gbbc eeacacacaca  g#c#bbbgbbb#c#c#gee gbbc",
+"gaac eeaaaaaaaaa cg#c#bdbbbdb#c#c#gbe gaac",
+"gaac eeaaaaaaaaaccg#c#bdbbbdb#a#c#gee gaac",
+"gaac eeacacacacacgg#c#bbbbbbb#c#c#gee gaac",
+"gaac eeaaaaaaaaaggg#c#dbdbdbd#a#c#gee gaac",
+"gbbc eeaaaaaaaaaggg#c#bbbbbbb#c#c#gee gbbc",
+"gbbc ebacacacacagcg#c#bdbbbdb#a#c#geb gbbc",
+"gbbc eeaaaaaaaaaccg#c#bdbbbdb#c#c#gee gbbc",
+"gbbc eeaaaaaaaaacgg#c#bbbggbb#c#c#gee gbbc",
+"gaac eeacacacacaggg#c#dddgddd#c#c#gee gaac",
+"gaac eeaaaaaaaaaggg#c#########c#c#gee gaac",
+"gaac eeaaaaaaaaaggg#ccccccccccc#c#gee gaac",
+"gaac eeacacacacagggc###########cc#gbe gaac",
+"gbbc aaaaaaaaaaagggc#cc#c#c#c#c#c#gee gbbc",
+"gbbc aaaaaaaaaaa#aag#ccc#####ccc#gcee gbbc",
+"gbbc ebeaaaaaaaaeaagc##ccccccc##cgdee gbbc",
+"gbbc eeebaaaaaaaeaaagcc#######ccgdhbe gbbc",
+"gaac edeeebaaaeebeacaggcccccccgghheee gaac",
+"gaac eebbeeaaaeeeebaacaggggggghhheeeb gaac",
+"gaac eedeeeaaaeeeebbcaacaaccchhheeeee gaac",
+"gaac ebeeeeaaaebededcacaaccchdhbebeee gaac",
+"gbbc                                  gbbc",
+"gbbcgggggggggggggggggggggggggggggggggggbbc",
+"gbbaaaabbbbaaaabbbbaaaabbbbaaaabbbbaaaabbc",
+"gbbaaaabbbbaaaabbbbaaaabbbbaaaabbbbaaaabbc",
+"gccccccccccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/icwire.xpm b/images/icwire.xpm
new file mode 100644 (file)
index 0000000..f34dc97
--- /dev/null
@@ -0,0 +1,47 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 6 1",
+/* colors */
+"# c #000000",
+"a c #5D5D5D",
+"  c #FFFFFF",
+"c c #FFFF00",
+"d c #7F7F00",
+"e c #BFBFBF",
+/* pixels */
+"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+"ecc####cccc####cccc####cccc####cca",
+"ecc####cccc####cccc####cccc####cca",
+"eccaaaaaaaaaaaaaaaaaaaaaaaaaaaacca",
+"ecca##########################ecca",
+"e##a# # # # # # # # # # # # ##e##a",
+"e##a## # # da# # # # # # # # #e##a",
+"e##a# #####aa###### # # # # ##e##a",
+"e##a## # # da# # # # # # # # #e##a",
+"ecca# # # #da # # # # # # # ##ecca",
+"ecca## # # da# # # # # # # # #ecca",
+"ecca# #####aa###### # # # # ##ecca",
+"ecca## # # da# # # # # # # # #ecca",
+"e##a# # # #da # # # a # # # ##e##a",
+"e##a## # # da# # ###a### # # #e##a",
+"e##a# # # #da # # # a # # # ##e##a",
+"e##a## # # da# # # #a# # # # #e##a",
+"ecca# # # #da # ####a#### # ##ecca",
+"ecca## # # da# # # #a# # # # #ecca",
+"ecca# # # #da # # # a ###a####ecca",
+"ecca## # # da# # # #a# # a # #ecca",
+"e##a# # # #da # # # a ###a####e##a",
+"e##a## # # da# # # #a# # a # #e##a",
+"e##a# # # #da # # # a # #a# ##e##a",
+"e##a## # # da# # # #a# # a # #e##a",
+"ecca# # # #da # # # a # #a# ##ecca",
+"ecca## # # da# # # #a# # # # #ecca",
+"ecca# # # #da # # # # # # # ##ecca",
+"ecca## # # # # # # # # # # # #ecca",
+"e##a##########################e##a",
+"e##aeeeeeeeeeeeeeeeeeeeeeeeeeee##a",
+"e##cccc####cccc####cccc####cccc##a",
+"e##cccc####cccc####cccc####cccc##a",
+"eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+};
diff --git a/images/icwirehi.xpm b/images/icwirehi.xpm
new file mode 100644 (file)
index 0000000..362bacf
--- /dev/null
@@ -0,0 +1,47 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"34 34 6 1",
+/* colors */
+"` c #000000",
+"a c #5D5D5D",
+"b c #FFFFFF",
+"c c #FFFF00",
+"d c #7F7F00",
+"e c #BFBFBF",
+/* pixels */
+"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+"ecc````cccc````cccc````cccc````cca",
+"ecc````cccc````cccc````cccc````cca",
+"eccaaaaaaaaaaaaaaaaaaaaaaaaaaaacca",
+"eccabbbbbbbbbbbbbbbbbbbbbbbbbbecca",
+"e``abbbbbbbbbbbbbbbbbbbbbbbbbbe``a",
+"e``abbbbbbbdabbbbbbbbbbbbbbbbbe``a",
+"e``abb`````aa`````bbbbbbbbbbbbe``a",
+"e``abbbbbbbdabbbbbbbbbbbbbbbbbe``a",
+"eccabbbbbbbdabbbbbbbbbbbbbbbbbecca",
+"eccabbbbbbbdabbbbbbbbbbbbbbbbbecca",
+"eccabb`````aa`````bbbbbbbbbbbbecca",
+"eccabbbbbbbdabbbbbbbbbbbbbbbbbecca",
+"e``abbbbbbbdabbbbbbbabbbbbbbbbe``a",
+"e``abbbbbbbdabbbb```a```bbbbbbe``a",
+"e``abbbbbbbdabbbbbbbabbbbbbbbbe``a",
+"e``abbbbbbbdabbbbbbbabbbbbbbbbe``a",
+"eccabbbbbbbdabbbb```a```bbbbbbecca",
+"eccabbbbbbbdabbbbbbbabbbbbbbbbecca",
+"eccabbbbbbbdabbbbbbbabb``a``bbecca",
+"eccabbbbbbbdabbbbbbbabbbbabbbbecca",
+"e``abbbbbbbdabbbbbbbabb``a``bbe``a",
+"e``abbbbbbbdabbbbbbbabbbbabbbbe``a",
+"e``abbbbbbbdabbbbbbbabbbbabbbbe``a",
+"e``abbbbbbbdabbbbbbbabbbbabbbbe``a",
+"eccabbbbbbbdabbbbbbbabbbbabbbbecca",
+"eccabbbbbbbdabbbbbbbabbbbbbbbbecca",
+"eccabbbbbbbdabbbbbbbbbbbbbbbbbecca",
+"eccabbbbbbbbbbbbbbbbbbbbbbbbbbecca",
+"e``abbbbbbbbbbbbbbbbbbbbbbbbbbe``a",
+"e``aeeeeeeeeeeeeeeeeeeeeeeeeeee``a",
+"e``cccc````cccc````cccc````cccc``a",
+"e``cccc````cccc````cccc````cccc``a",
+"eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+};
diff --git a/images/ind.xpm b/images/ind.xpm
new file mode 100644 (file)
index 0000000..e9cd035
--- /dev/null
@@ -0,0 +1,58 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"48 48 3 1",
+/* colors */
+"` c #000000",
+"a c #FFFF00 m #000000",
+"b c #CC7E66 m #ffffff",
+/* pixels */
+"`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"`a`````````````````````````````````````````````a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbb`aaaabbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbb``aa`bbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbb`aabbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbb`aabbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbb`aabbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbb`aabbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbb`aabbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbb`aabbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbb`aabbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbb`aabbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbb`aaaabbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbb`````bbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"````````````````````````````````````````````````"
+};
diff --git a/images/key.xpm b/images/key.xpm
new file mode 100644 (file)
index 0000000..9b9051c
--- /dev/null
@@ -0,0 +1,32 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"53 23 2 1",
+/* colors */
+"` c #B0B0B0 m #ffffff",
+"a c #FFFF00 m #000000",
+/* pixels */
+"`````````aaaa````````````````````````````````````````",
+"`````aaaaaaa`a```````````````````````````````````````",
+"````aaa`a```aaa``````````````````````````````````````",
+"````a``a`````aaaa````````````````````````````````````",
+"````a``````````aaaaa`````````````````````````````````",
+"```a````````````aaa`aa```````````````````````````````",
+"`aa``a``a```````aa`aaa```````````````````````````````",
+"aa``aa``````````aa``aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa```",
+"a`aaaa``````````aa``aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa``",
+"aaa`aa``a```````aa````````````````````````````````aa`",
+"aaa`aa``````````aa`````````````````````````````````aa",
+"aaa`aa``a```````aa``aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaa`aa``a```````aa``aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`",
+"aaa`aa``````````aa````````````````````````````````a``",
+"aa`aaa``a```````aa``````````aaaa``````aaaa````aaaa```",
+"a`a`aa``a```````aa``aaaaaaaa````aaaaaa````aaaa```````",
+"`a`aaa``````````aa``a`````a``````````````````````````",
+"``aa`a``a```````aa`aa````````````````````````````````",
+"````a```a```````aaa``````````````````````````````````",
+"````a``````````aa````````````````````````````````````",
+"````a``a`````aa``````````````````````````````````````",
+"`````aa`a```a````````````````````````````````````````",
+"`````````aaa`````````````````````````````````````````"
+};
diff --git a/images/key2city.xpm b/images/key2city.xpm
new file mode 100644 (file)
index 0000000..f6eca1a
--- /dev/null
@@ -0,0 +1,65 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"134 56 2 1",
+/* colors */
+"` c #B0B0B0",
+"a c #FFFF00 m #000000",
+/* pixels */
+"```````````````````````````````````````````````````````````````````````````````````````````````````````aaaaaaaa```````````````````````",
+"`````````````````````````````````````````````````````````````````````````````````````````````````````aa````````a``````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````a```````````aa`aaaaa``````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````a`````````````a`````aa````````````",
+"``````````````````````````````````````````````````````````````````````````````````````````````````aa`````````````````````a````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````aa```````````````````````a````````````",
+"``````````````````````````````````````````````````````````````````````````````````````````````aa`````````````````````````a````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````aa```````````````````````````a````````````",
+"``````````````````````````````````````````````````````````````````````````````````````````aa``````````````````````````````a```````````",
+"````````````````````````````````````````````````````````````````````````````````````````aa``a``````````````````a```````````a``````````",
+"``````````````````````````````````````````````````````````````````````````````````````aa````a``````````````````a````````````a`````````",
+"````````````````````````````````````````````````````````````````````````````````````aa```a``a``````````````````a`````````````a````````",
+"``````````````````````````````````````````````````````````````````````````````````aa`````a``a```````````````````````````a`````a```````",
+"`````````````````````````````````````````````````````````````````````````````````a```````a``a```````````````````````````aa`````a``````",
+"`````````````````````````````````````````````````````````````````````````````````a```````a``a```````````````````````````a`a`````a`````",
+"``````````````````````````````````````a``````````a```````````````a```````aaaaaaaa````````a``a```````````````````````````a``a`````a````",
+"`````````````````````````a```````````a`aaaaaaaaaa`a`````````````a`aa`````a```````````````a``a```````````````````````````a```aa````a```",
+"`````````````````aaaaaaaa`a`````````a``````````````aa``````````a```aaaaaa````````````````a``a``````````````````a````````aa````a````aaa",
+"````````````````a``````````a```````a`````````````````a````````a``````````````````````````a``a``````````````````a````````aaa````a```a`a",
+"```````````````a```````````aaaaaaaa``````````````````aaaaaaaaa```````````````````````````a``a```````````````````````````aa`aa```a``a`a",
+"```````aaaaaaaa``````````````````````````````````````````````````````````````````````````a``a```````````````````````````aa```a``a``a`a",
+"``````a``````````````````````````````````````````````````````````````````````````````````a``a```````````````````````````aa````a`a``a`a",
+"````aa```````````````````````````````````````````````````````````````````````````````````a``a```````````````````````````aa````a`a``a`a",
+"```aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa```````a``a```````````````````````````aa````a`a``a`a",
+"``a``````````````````````````````````````````````````````````````````````````````````````a``a``````````````````a````````aa````a`a``a`a",
+"aaa`a``a`a``a``a`a``a`a``a``a`a``a`a``a``a`a``a`a``a``a`a``a`a``a``a`a``a`a``a``a````````a``a``````````````````a````````aa````a`a``a`a",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa```````a``a```````````````````````````aa````a`a``a`a",
+"aa```````````````````````````````````````````````````````````````````````````````````````a``a```````````````````````````aa````a`a``a`a",
+"a`aa`````````````````````````````````````````````````````````````````````````````````````a``a```````````````````````````aa````a`a``a`a",
+"a```a````````````````````````````````````````````````````````````````````````````````````a``a```````````````````````````aa````a`a``a`a",
+"`a```a```````````````````````````````````````````````````````````````````````````````````a``a```````````````````````````aa````a`a``a`a",
+"``aa``aa`````````````````````````````````````````````````````````````````````````````````a``a``````````````````a````````aa````a`a``a`a",
+"````a```a````````````````````````````````````````````````````````````````````````````````a``a``````````````````a````````aa````aa```a`a",
+"`````a```aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa``````a``a```````````````````````````aa````a````a`a",
+"``````aa``````````````````````````````````````````````````````````````````````````a``````a``a```````````````````````````aa```a`````a`a",
+"````````a`````````````````````````````````````````````````````````````````````````a``````a``a```````````````````````````aa`aa`````a``a",
+"`````````a````````````````````````````````````````````````````````````````````````a``````a``a```````````````````````````aaaa`````a``a`",
+"````````aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa``a``````a``a```````````````````````````aaa`````a``a``",
+"```````````````````````````````````````````````````````````````````````````````a``a``````a``a```````````````````````````aa`````a``a```",
+"```````````````````````````````````````````````````````````````````````````````a``aa`````a``a``````````````````a````````a````aa``a````",
+"```````````````````````````````````````````````````````````````````````````````a````aa```a``a``````````````````a````````````a``aa`````",
+"```````````````````````````````````````````````````````````````````````````````aa`````aaa```a``````````````````````````````a``a```````",
+"`````````````````````````````````````````````````````````````````````````````````aa``````aa```````````````````````````````a``a````````",
+"```````````````````````````````````````````````````````````````````````````````````aa``````aa````````````````````````````a``a`````````",
+"`````````````````````````````````````````````````````````````````````````````````````aaa`````aaa`````````````````````````a`a``````````",
+"````````````````````````````````````````````````````````````````````````````````````````aa``````aa```````````````````````aa```````````",
+"``````````````````````````````````````````````````````````````````````````````````````````aaa`````aa`````````````````````aa```````````",
+"`````````````````````````````````````````````````````````````````````````````````````````````aa````a``````````````a``````aa```````````",
+"```````````````````````````````````````````````````````````````````````````````````````````````aa```a````````````a`a````a`a```````````",
+"`````````````````````````````````````````````````````````````````````````````````````````````````aa`a```````````a``aaaaa``a```````````",
+"``````````````````````````````````````````````````````````````````````````````````````````````````a``aa````````a``````````a```````````",
+"``````````````````````````````````````````````````````````````````````````````````````````````````a````aaaaaaaa```a`````aa````````````",
+"``````````````````````````````````````````````````````````````````````````````````````````````````a``````````````a`aaaaa``````````````",
+"```````````````````````````````````````````````````````````````````````````````````````````````````aa```````````a`````````````````````",
+"`````````````````````````````````````````````````````````````````````````````````````````````````````aa````````a``````````````````````",
+"``````````````````````````````````````````````````````````````````````````````````````````````````````aaaaaaaaa```````````````````````"
+};
diff --git a/images/leftdisabled.xpm b/images/leftdisabled.xpm
new file mode 100644 (file)
index 0000000..1c0858d
--- /dev/null
@@ -0,0 +1,113 @@
+/* XPM */
+static char *leftdisabled[] = {
+/* columns rows colors chars-per-pixel */
+"50 50 57 1",
+"  c #4B8CB6",
+". c #4C8EB9",
+"X c #4D90BD",
+"o c #508FB7",
+"O c #508EB8",
+"+ c #5591B6",
+"@ c #5392BC",
+"# c #5895BD",
+"$ c #4D93C1",
+"% c #5294C1",
+"& c #5399C5",
+"* c #549BC9",
+"= c #5997C0",
+"- c #5A9BC4",
+"; c #5A9EC9",
+": c #4FA9CF",
+"> c #4CA2D4",
+", c #4FA5D8",
+"< c #4EA9D5",
+"1 c #5FA0C7",
+"2 c #5DA1CA",
+"3 c #53A5D6",
+"4 c #54A5D9",
+"5 c #55A8D6",
+"6 c #55A8D8",
+"7 c #5BA5D3",
+"8 c #59A5DA",
+"9 c #5AA9D6",
+"0 c #5BAAD9",
+"q c #61A3CC",
+"w c #64A5D0",
+"e c #63A9D4",
+"r c #63AEDA",
+"t c #69A7D0",
+"y c #69ABD4",
+"u c #6AADDA",
+"i c #66B0DC",
+"p c #6AB2DD",
+"a c #6EB8DC",
+"s c #70AFD8",
+"d c #70B3D6",
+"f c #71B5DE",
+"g c #74B8DE",
+"h c #79B0DC",
+"j c #62AEE1",
+"k c #65B1E1",
+"l c #66B9E3",
+"z c #6CB4E1",
+"x c #6CB1E8",
+"c c #6CB9E0",
+"v c #70AFE2",
+"b c #72B6E0",
+"n c #75B8E0",
+"m c #7BBBE2",
+"M c #81BEE3",
+"N c #83C0E4",
+"B c #88C1E5",
+/* pixels */
+"mmmMMmMmmMmmMmmmnnzaapirr0rr00007965,,>>>>>>>>>>>>",
+"mmMMMMMmmMmmmmmnnnbapirrr000009e044<3>>>>>>>>>>>>>",
+"MMMMMmMmmmmmmmmnbbbzprr0090969968337,>>>>>>>>>>>>>",
+"MMMMMMMMMMMMmmnnbaazir009569886<>57*3>>>>>*>>>>>>>",
+"NMMNNMMMmMmmmmngbbppi0965535874<5w;373>>>>333>3>>,",
+"NNNNNMMMMMMmmmnnbpzii05533,7<344yq**4>>>>>>3>3>34,",
+"MNNNMMNMMMMmmnnnbppi095,44>3844ee7&*63>3>3>333334>",
+"NNNBMMMNMmMmmngzapur9r85<,>4450ue*$&64334>43433344",
+"BNNNNNMNmNmMmnnbaprr0883:>>470yy7$$*643,33333333>4",
+"BBNNMNMmmmmmnnbbpprr083373338yyw&$.&66673356555447",
+"NNNNMMmMmmmnnnbppprr06544,33ywq;$..&69447674476747",
+"BNNNNMMmmmmnbbbppui00568,47eww2;$. &96495655669666",
+"BNNNMMmmmnnnnxaziir9008657ew7w;%.X &06606969696696",
+"BNNNmMmmmnnnzbpprr006446euye;;&%X..*00009669000009",
+"BBNNNmmmnnxnffpzrur9896eutw2;;&$$..&00008000000000",
+"NNNMmMmmnnmcfapirr0069euyw;;;&$@$. *0000000000r000",
+"BMMMmmgmnnffapiirr008eyyt2;&$$$$X..&6000000e0000r0",
+"BMMmmmmmgzffzpirr060euywe;%$$$.$X. &00r000rr0ii00r",
+"BBMMmmbbnzfpziiij00eyyy2;&%$$$$$.. &0r0rr0rri0r0r0",
+"BBMmmbmmggfappp0jreryww;*@$$.$$.X  &9rrr0rrr0i0r0r",
+"MMMmmgggnfapppri0ryyyq;*$$.$$$$$X. &8rrriirrrrr00e",
+"MMmmmngbbffppiiiyyyyw2;%$$$$$$$.@X &0rzrriirrrr0r0",
+"MMMmmnnfffpppapuyttw;;%%$$$$$$$$XX.&0zirirrrrrrrr0",
+"NMmmnnffffzpifut22;;-=%%$$$$$$%$@@O&0ruripuirirr0r",
+"MMmmgggffppparp2-%==%%$$$$*$$$%%@X.-0prziiiiiirri0",
+"Nmmmnngzfffppfpi2==%O$O%%$$$$$%$X+o&0iprizipipirii",
+"NMmmnmnnffbpsizpu2=#=%$$%%%%$$%$@Xo;iiirizikppipri",
+"Nmmmmgznbzappzikpu-==O@$$%%%$&$&@@.*0pizripkippri0",
+"MMmmnggnbbfappripie;#O@$O%%%&%%%@Xo*rriizzrzpiiiir",
+"MMmmmgngbbffadpprxui1=@@%%$$%%%%@X@-rrzprziuppiprr",
+"MMMmmgngggffpppizrzru;OOO%%%%%%=@@@;ripiipzipiiiii",
+"BMmmmmmmgbbfzzppuprzvs;=OOO%%%%%@@o;riiippipipiiii",
+"MMMMMmmgnngfffaappppuuu1@@@@@&&=%@@;rpiippppppiirr",
+"BMMMmMmmmmnnfzpppppppvzp-#@#@&%=@@@;ipiiippppiirrr",
+"BMMMmmmmgmgngfbappppbzzza1#@====#ooqipiiidpippirrr",
+"MMMMMmmmmmnngffzfppfspixaa;##==#@#oqidiiiiiaiiirrr",
+"MMMMMmmMmmmnnbbbffpppbfzsbf1==#=##+qppiiipiiiiirir",
+"MMMMMmmmmmnmgmbbfffzabsgnbnf1=##@#+qpiipiiiiipiirr",
+"MNMMMmmmmmmgnnngbfffzfsbbzzfnq####oqrruipipppriirr",
+"MMMMmMMmmmnmnnnfbbpffffbbbbfvh1+@++qpuippiiiupiirr",
+"MMgMMmMmmmmnnnngbbzffpffbbbbbbu;++oqrppppiiipiiirr",
+"MNNmMMMmmgmnnnnnbzfffsfzzbbbpnbu-++qppppipiiipiir0",
+"MMMMmMmMmgmgbbbfapppupzfsbbfbbpba-+qppppppppipirrr",
+"MMMMMMMmmmnnbbaappppppzffzzbbazbpd=;pppppiipiiirrr",
+"MMMMMMMMmmnfaapppipzipppszffddfpzppyppppdpprpiirrr",
+"NNNNMMMMmmngapppppiizzuzuzzsaghmlaflbpbppiiuruirrr",
+"NNNNBMMMmmnffzzziiiirppuuppzpzzpzppaappppipriiirrr",
+"NNNNMBMmmgnbbppripipirrppufzffbababpapappppriirirr",
+"NNBNNNMMmmnngapppuiiiirizuzpappbfppbpppppzupruirrr",
+"NNNBNNMMmmnzfpapziirrirrrpipppbbbbappazppuiriirrr0"
+};
diff --git a/images/lefthilite.xpm b/images/lefthilite.xpm
new file mode 100644 (file)
index 0000000..1178914
--- /dev/null
@@ -0,0 +1,312 @@
+/* XPM */
+static char *lefthilite[] = {
+/* columns rows colors chars-per-pixel */
+"50 50 256 2",
+"   c #015C05",
+".  c #036508",
+"X  c #016D05",
+"o  c #016C0C",
+"O  c #056204",
+"+  c #016712",
+"@  c #04651B",
+"#  c #017206",
+"$  c #01720E",
+"%  c #007D07",
+"&  c #057B0B",
+"*  c #08770B",
+"=  c #087D00",
+"-  c #0A7E0C",
+";  c #027312",
+":  c #027C14",
+">  c #04791B",
+",  c #13770A",
+"<  c #117F01",
+"1  c #028402",
+"2  c #03830A",
+"3  c #028B04",
+"4  c #008F08",
+"5  c #0A8201",
+"6  c #0B820C",
+"7  c #0C8B01",
+"8  c #038411",
+"9  c #048119",
+"0  c #019503",
+"q  c #019509",
+"w  c #009903",
+"e  c #009C0A",
+"r  c #089401",
+"t  c #009D12",
+"y  c #049216",
+"u  c #108F00",
+"i  c #1B872F",
+"p  c #01A402",
+"a  c #00A50A",
+"s  c #01AA03",
+"d  c #00AA0A",
+"f  c #0BA000",
+"g  c #0BAC01",
+"h  c #02B301",
+"j  c #00B40C",
+"k  c #00BA02",
+"l  c #00BB0B",
+"z  c #08B200",
+"x  c #07B414",
+"c  c #16A82F",
+"v  c #1CA92F",
+"b  c #1BBA2A",
+"n  c #1DBB36",
+"m  c #229F27",
+"M  c #249A28",
+"N  c #23A42B",
+"B  c #24A92E",
+"V  c #28A52C",
+"C  c #29AE2C",
+"Z  c #24B929",
+"A  c #29B027",
+"S  c #2BB528",
+"D  c #28BA2A",
+"F  c #20B031",
+"G  c #35B927",
+"H  c #30B829",
+"J  c #25AC40",
+"K  c #01C101",
+"L  c #00C10B",
+"P  c #00CB01",
+"I  c #0BC300",
+"U  c #00C713",
+"Y  c #05CA1F",
+"T  c #00D103",
+"R  c #00D40C",
+"E  c #00DE02",
+"W  c #00D612",
+"Q  c #12DA00",
+"!  c #01EA00",
+"~  c #00EE0C",
+"^  c #0DE900",
+"/  c #00ED10",
+"(  c #00F30F",
+")  c #01FB03",
+"_  c #06FD0A",
+"`  c #01FF12",
+"'  c #00F81D",
+"]  c #0FF711",
+"[  c #10EA00",
+"{  c #16ED18",
+"}  c #10FF0F",
+"|  c #13FF11",
+" . c #16FF1A",
+".. c #18FF10",
+"X. c #19FF1F",
+"o. c #15FF20",
+"O. c #26CB2F",
+"+. c #28C12B",
+"@. c #2ECF33",
+"#. c #21FF0D",
+"$. c #20FD14",
+"%. c #25E338",
+"&. c #2CFF3D",
+"*. c #3AFF31",
+"=. c #25CA42",
+"-. c #31CF45",
+";. c #37FE4B",
+":. c #3EFF48",
+">. c #4CFF3F",
+",. c #55FF3F",
+"<. c #46C76B",
+"1. c #5CCF7F",
+"2. c #5FD37F",
+"3. c #40E24B",
+"4. c #46FF41",
+"5. c #43FF4E",
+"6. c #4CFF45",
+"7. c #4AFC49",
+"8. c #45FF50",
+"9. c #4CFF55",
+"0. c #48FF5D",
+"q. c #54F952",
+"w. c #5EEE6C",
+"e. c #55FE70",
+"r. c #57FD7D",
+"t. c #69DB78",
+"y. c #61FE5F",
+"u. c #6BFE5D",
+"i. c #71FE5D",
+"p. c #6DEC64",
+"a. c #63FE62",
+"s. c #61FE6C",
+"d. c #61FB70",
+"f. c #6AFE75",
+"g. c #7DF070",
+"h. c #55B58C",
+"j. c #56BF99",
+"k. c #4FB3BF",
+"l. c #54BFA7",
+"z. c #59BFA6",
+"x. c #53BCAC",
+"c. c #52B3BC",
+"v. c #6BBFBE",
+"b. c #4FA7CC",
+"n. c #4EA9CA",
+"m. c #4CA2D4",
+"M. c #4EAAD1",
+"N. c #51AFC6",
+"B. c #54ABCB",
+"V. c #58AECD",
+"C. c #52A5D5",
+"Z. c #54A5D8",
+"A. c #55A9D5",
+"S. c #56A9D9",
+"D. c #58A5D5",
+"F. c #59A5D9",
+"G. c #5AAAD5",
+"H. c #5BAAD9",
+"J. c #53B3C1",
+"K. c #58B5C1",
+"L. c #5AB2CC",
+"P. c #5DB9C2",
+"I. c #5CB8C9",
+"U. c #5DB1D1",
+"Y. c #61ACD6",
+"T. c #63AEDA",
+"R. c #69ADDA",
+"E. c #61B3CE",
+"W. c #64BCCA",
+"Q. c #6ABDC7",
+"!. c #6ABBCA",
+"~. c #64B4D3",
+"^. c #66B0DC",
+"/. c #66B8D8",
+"(. c #68B5D3",
+"). c #6AB2DD",
+"_. c #6BB8D4",
+"`. c #6CB8DB",
+"'. c #70AFD8",
+"]. c #74BECC",
+"[. c #78BECC",
+"{. c #70B3D6",
+"}. c #71B5DE",
+"|. c #77B9D3",
+" X c #73B8DD",
+".X c #79B0DC",
+"XX c #66BAE1",
+"oX c #6CB4E0",
+"OX c #6EB9E0",
+"+X c #72B6E0",
+"@X c #75B8E0",
+"#X c #7BBBE2",
+"$X c #5EC59C",
+"%X c #5DC99B",
+"&X c #56C2A4",
+"*X c #5DC6A0",
+"=X c #5CC3A9",
+"-X c #63C79A",
+";X c #65C99C",
+":X c #72DC8B",
+">X c #72D895",
+",X c #63C5AE",
+"<X c #65C9A2",
+"1X c #6AC4A8",
+"2X c #6ACBA3",
+"3X c #6ACCA9",
+"4X c #64C6B0",
+"5X c #68C7B0",
+"6X c #6DC9B3",
+"7X c #64C3B9",
+"8X c #6ED1A2",
+"9X c #72C6AC",
+"0X c #72CCA3",
+"qX c #73CCAA",
+"wX c #70C7BB",
+"eX c #71CBB5",
+"rX c #74D0A3",
+"tX c #76D0AA",
+"yX c #7AD0AC",
+"uX c #79D0B3",
+"iX c #6BFE80",
+"pX c #74E088",
+"aX c #7BE084",
+"sX c #7EE289",
+"dX c #7DE192",
+"fX c #77FB88",
+"gX c #78FD8C",
+"hX c #7FFB92",
+"jX c #6DC7C4",
+"kX c #6DC1CA",
+"lX c #6BC3D2",
+"zX c #70C2C7",
+"xX c #73C3CB",
+"cX c #71C1D0",
+"vX c #86F27D",
+"bX c #83FA7C",
+"nX c #8AFC7E",
+"mX c #95FC7D",
+"MX c #81BEE3",
+"NX c #81E38B",
+"BX c #82EB84",
+"VX c #82E391",
+"CX c #83F589",
+"ZX c #81FC86",
+"AX c #8DF48E",
+"SX c #88FC80",
+"DX c #88F792",
+"FX c #98F486",
+"GX c #91F491",
+"HX c #91F49D",
+"JX c #84FBA8",
+"KX c #8BFCAC",
+"LX c #8CFBB8",
+"PX c #92F4A6",
+"IX c #83C0E4",
+"UX c #88C1E5",
+/* pixels */
+"#X#X#X#X#X#X#X#X#X#X#X#X#X#X@X#X@X#X+XOX`.oXR.R.^.T.^.T.Y.T.H.H.G.H.F.A.D.C.C.m.m.m.m.m.m.m.m.m.m.m.",
+"#X#X#X#XIXMX#X#X#X#X#X#X#X#X#X#X@X@X@XoX`.^.^.T.T.T.T.H.Y.H.H.H.G.G.A.M.C.m.m.m.m.m.m.m.m.m.m.m.m.m.",
+"#X#XIXMXIX#XIX#X#XMXMX#X#X#X#X@X@X@X+XoX).^.^.^.H.H.T.H.H.G.H.H.H.G.N.k.B.m.m.m.m.m.m.m.m.m.m.m.m.m.",
+"#X#XIXMXIXIX#XIX#XMX#X#X#X#X#X@X@X+X+XoX^.^.H.H.H.F.H.H.S.H.F.F.M.k.&X%Xc.n.m.m.m.m.m.m.m.m.m.m.m.m.",
+"MXMXIX#XMXMX#XMX#XIX#XMX#X#X@X@X@X`.`.oX).T.H.G.F.A.A.S.S.F.A.M.k.$X:X<.x.n.m.m.m.m.m.m.C.m.m.m.m.m.",
+"MXIXMXIXMXMX#XIXIX#X#X#X#X@X#X@X+X`.`.`.T.H.F.S.A.S.C.C.Z.D.G.c.$Xt.-.-.l.n.M.m.m.m.m.m.m.m.m.C.m.m.",
+"IXMXIXIXIXIXIXIXIX#X#X#X#X@X@X@X+XoXR.).T.F.H.S.C.C.C.C.n.B.I.&X:Xp.{ @.&Xn.m.C.m.C.m.C.D.C.m.C.Z.C.",
+"MXMXIXIXIXIX#XIXMXMXMX#X#X#X@X@XoXoXR.R.T.F.Z.C.Z.S.C.M.G.k.%XaXvX7.Y O.&XB.m.C.m.C.C.C.C.C.C.C.Z.C.",
+"UXMXUXMXIXIX#X#XIX#X#X#X#X@X+X+XoXoX^.T.F.T.F.C.M.m.C.C.c.$XsXGXs._ d D x.V.C.C.C.Z.C.Z.Z.Z.C.Z.m.C.",
+"MXUXUXMXIXIXIXIX#XIX#X#X#X@X@X+XoX`.^.T.H.F.F.C.M.C.A.J.<XsXFXJX;.P q H =XV.C.C.C.A.C.C.A.C.C.A.Z.Z.",
+"UXUXMXMXIXIXIX#X#X#X#X#X#X@X+X+X}.R.^.T.H.S.Z.D.D.B.c.$XVXGXFXe.) g 8 D =XV.D.C.C.C.C.A.C.S.C.C.D.Z.",
+"UXUXMXUXIXIX#XIX#X#X#X#X@X+X+X+X`.R.^.H.H.Z.B.D.C.k.-X:XHXgXq.&.K 7 : A =XV.C.D.Z.D.Z.D.Z.D.D.Z.Z.Z.",
+"UXIXIXIXIX#X#X#X#X#X#X@X+X+XoXR.oXT.T.T.H.A.A.G.c.%XNXHXSXs.5.' p 3 & S =XL.A.A.A.A.A.F.S.S.Z.S.D.S.",
+"UXIXIXIXIXIX#X#X#X#X@X@X@X+XoXoXT.T.T.H.G.A.A.c.-XNXAXKXu.6.} U w 7 o S =XL.H.H.S.F.G.S.S.S.F.H.H.F.",
+"IXIXIXIX#XIX#X#X#X#X@X@XoX+XoX).R.T.H.H.G.H.J.<XsXPXLXu.5.X.Q h 7 < > b 4XU.G.S.H.S.S.F.S.H.H.H.S.H.",
+"UXIXIXIXIX#X#X#X#XOX@XoXoX+XoXoXT.R.Y.G.G.c.<XVXAXnXa.0. .( I d t 1 # D =XU.H.F.H.H.F.H.H.H.H.H.H.H.",
+"UXUXIXIX#X#X#X@X@X@X+X+X}.`.R.^.T.Y.T.H.K.<XVXGXhXa.4.| ! R z d t 1 # S ,XU.H.H.H.H.H.H.H.H.H.H.H.H.",
+"UXMXMXMX#X#X#X#X@X+X+XoXoXXX^.^.T.H.U.I.<XdXAXZXf.8...^ P L g d e 1 # S ,XL.U.H.H.T.H.H.H.H.^.H.T.H.",
+"UXMXIX#X#X#X@X@X+X+X+X`.oXR.^.R.^.U.P.<XVXGXZXi.,.X./ T K k s s e 1 # Z ,XE.H.H.T.H.T.T.^.H.^.H.H.T.",
+"UXMXIX#X#X#X#X+X@X@X+XoXoX`.^.R.^.P.2XVXGXDXiX>.#.~ W k k j g s q 5 # D 5XE.^.H.H.T.H.T.H.T.H.T.Y.H.",
+"UXIX#X#X#X@X@X#X+X+X+XR.}.(.(.W.7X8XVXGXSXs.5.o.( R K z s l g s 0 1 o Z ,XE.Y.T.T.T.T.T.T.T.H.H.H.H.",
+"UXIXIX#X@X#X@X+X+X+X+X`.).(.!.3XpXsXCXhXa.4. .~ W K s z j k g p 0 1 $ Z ,X~.^.T.T.T.T.T.T.T.^.H.T.H.",
+"IXIX#X#X@X@X@X+X+X+XoXR.`.!.5X:Xg.g.hXy.0...^ T k z z k k k g p 0 1 ; Z 6X(.^.^.^.^.T.T.T.T.T.T.T.H.",
+"IXIX#X#X#X@X@X.X+XoXoX`./.7X>Xp.q.r.9.*.} ! P K k h d L z l s s e = $ D eX(.^.^.R.^.^.T.T.T.T.H.T.T.",
+"IX#X#X#X@X+X+X@XoXoX}.R./.jX1.%.| $.` ) E P h h k k j h s l z s w = $ D 6X(.^.^.^.^.^.T.T.^.T.T.T.H.",
+"IX#X#X#X#X+X+X+XoX+X}.R.`.!.1X=.x g s j h h h k h j k h z l s d 0 = $ D 6X(.^.^.^.^.^.^.^.^.^.T.T.T.",
+"IXMXMX#X@X@X@X+X.X`.`.R.).{.Q.2Xn y w p p s s k h h h k s l z s e = $ D 6X(.T.^.^.^.^.oX^.oX^.^.T.T.",
+"IXcX#X#X@X@X@X+X+XoXoXoX}.^. XkX;XF 9 1 w s s s h h h z z l g d w = $ D 6X(.^.^.^.oX^.).R.^.^.^.T.H.",
+"MXMX#X#X#X#X X+X}.}.`.oX).).^./.Q.-XB 8 1 w s s s k h z z l s s e = $ D 6X).^.^.^.oXoX^.).).^.^.^.T.",
+"MXMX#X#X@X@X X@X}.+X+X`.).}.^.^.).Q.-Xv 6 1 w a d h h k z l z s w = $ Z 6XR.^.^.oX^.^.oX^.).^.^.T.T.",
+"MXMX#X#X@X X+X X@X}.oXoXoX).R.`.T.`.!.2Xm - 4 e d s s z z l s s w = ; D 6X(.^.oX^.^.oX^.).^.^.^.^.T.",
+"MXMXMX#X#X#X#X@X@X+X.XoX`.`.R.oXR.^.).Q.3XB * 5 e p p h s l z d w 5 X D 6X(.^.^.oX^.oX^.).^.).^.^.^.",
+"MXMXMXMX#X#X#X@X X@X+X+X}.oXR.oXR.oX^.).].2XN 8 5 0 a s s j h a w 5 # Z 6X_./.^.R.).^.).^.).^.).oXT.",
+"MXMXMX#X#X#X#X#X@X@X X}.}.`.R.oXoXR.^.).{.Q.qXB & 1 w p s j h a 0 = % D 6X_.^.^.).).).).).^.^.^.T.R.",
+"UXMXMXMX#X#X#X#X#X#X+X+X+X+X+X`.R.oX).R.(.}.kXqXN & 1 a f s p d w = X D 6X_.^.).^.).).).).).^.^.T.T.",
+"MXMXMXMXIX#X#X#X#X X@X@X+X+X+XR.oXoX`.oX+X).oXkXtXB 9 1 w d f a w = # D 6X_.).R.).^.).^.^.^.^.T.T.T.",
+"UXMXIX#X#XIX#X#X#X#X#X@X@X+X+X}.}.R.R.oX`.R.^.@XcXqXB & 3 e r a q = X D eX_.(.R.).^.).).^.R.^.^.T.T.",
+"MXMXIXIXIX#X#X#X#X#X@X@X@X@X X}.+XoX+X`.R.+X`. X}.xXyXB 6 1 r e 0 = X Z 6X_.).^.^.^.^.^.).^.^.^.T.T.",
+"MXIXMX#X#X#X#X#X#X@X#X@X@X@X@X}..X`.}.+XoX@XR. X X X[.qXN 8 5 4 3 = X D 6X(.^.^.^.).).T.^.^.^.^.^.T.",
+"MXIXIXMX#XIX#X#X#X#X#X@X@X@X@X XoX}.+X+XoX`.+X.X}.}. XzXeXB , = 1 : o G 3X(.^.^.^.^.).).R.^.^.^.T.H.",
+"MXMXIX#XIX#X#X#X#X#X@X#X+X@X@X+X+X+XoX}.}.'.oX+X+X+X.X X[.0XV > # % o G 6X(.R.^.).^.).).^.^.^.^.T.T.",
+"MXMXMXMX#X#XIX#X#X#X#X#X@X@X@X@X+X+X+X}.oXoXoX.X+X+X}. X|.xXqXc ; + O S 6X_.).oX).^.^.^.^.^.^.T.T.T.",
+"MXMXMXMXIX#XIX#X#X#X X@X X@X@X X+X+X`.`.'.+XoX+X+X+XoX+X`. XxXuXM .   D 6X_.`.).).).^.).^.^.^.^.T.T.",
+"MXMX#XIX#XIX#XIX#X@X#X X@X@X+X+XoXoXoXR.oXR.oX+XoX`.}.+X X X).|.0XM @ A eX_.R.`.).^.).^.^.^.^.^.T.T.",
+"MXMXMXMX#XMXMX#X#X#X@X@X`.+X+XoX).).).oXR.oXR.oXoXoX.X+X@X}. X`.xX0Xi F wX_.}.R.).).).).oXR.^.^.T.T.",
+"MXMXIXMXIXMX#X#X#X#X@X}.`.oX`.R.).R.oX^.oXoX`.oX}.R.R.}.}.{. X`.`.zXeXh.zX_.`.R.).).^.^.^.T.^.^.T.T.",
+"IXIXIXIXMXMXIX#X#X#X@X XoXoXoXoXoX^.oX^.R.oXR.oX}.oX+X`.R. X.X+XXX{.|.cX`.).oX`.^.^.R.).oX^.T.T.T.T.",
+"IXMXIXIXIXIXMX#X#X#X@X@X XR.oXR.^.^.^.).R.T.oXR.R.R.oXoX}.+XoX}.+X}.`.}.+X`.R.).).).R.T.T.^.T.T.T.T.",
+"IXIXIXIXIXIXIX#X#X#X X+X XR.`.oXT.).T.oXT.^.R.oXoXR.).oX`.+X}.oX`.oX`.`.oX}.R.oXR.`.oX^.R.^.^.T.T.T.",
+"IXIXIXIXIXIXIX#XMX X#X+X+X+X`.R.).T.oXT.T.^.T.T.R.oX).).oXoX}.oXoXoX.XoXoXoXoXR.oXR.T.R.^.^.T.T.T.T."
+};
diff --git a/images/legendmm.xpm b/images/legendmm.xpm
new file mode 100644 (file)
index 0000000..60e26a2
--- /dev/null
@@ -0,0 +1,31 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"93 14 10 1",
+/* colors */
+"` c #000000",
+"a c #B0B0B0",
+"b c #FF7f00 m #ffffff",
+"c c #FF0000 m #ffffff",
+"d c #FFFF00 m #ffffff",
+"e c #BFBFBF m #ffffff",
+"B c #FF7f00 m #000000",
+"C c #FF0000 m #000000",
+"D c #FFFF00 m #000000",
+"E c #BFBFBF m #000000",
+/* pixels */
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaa`````````````````````````````````````````````aaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaa`EEeEEEeEEE`DdDdDdDdDd`bbBbbbBbbb`cccccccccc`aaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaa`EeEeEeEeEe`dDdDdDdDdD`bBbBbBbBbB`cccccccccc`aaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aa`aaaaa`aa`aa`aaaa`aa`eEEEeEEEeE`DdDdDdDdDd`BbbbBbbbBb`cccccccccc`aa`aaaaa`aaaa`aaaa`aaaa`aa",
+"aa``aaa``aa`aa``aaa`aa`EeEeEeEeEe`dDdDdDdDdD`bBbBbBbBbB`cccccccccc`aa``aaa``aaa`a`aaaa`aa`aaa",
+"aa`a`a`a`aa`aa`a`aa`aa`EEeEEEeEEE`DdDdDdDdDd`bbBbbbBbbb`cccccccccc`aa`a`a`a`aa`aaa`aaaa``aaaa",
+"aa`aa`aa`aa`aa`aa`a`aa`EeEeEeEeEe`dDdDdDdDdD`bBbBbBbBbB`cccccccccc`aa`aa`aa`a```````aaa``aaaa",
+"aa`aaaaa`aa`aa`aaa``aa`eEEEeEEEeE`DdDdDdDdDd`BbbbBbbbBb`cccccccccc`aa`aaaaa`a`aaaaa`aa`aa`aaa",
+"aa`aaaaa`aa`aa`aaaa`aa`EeEeEeEeEe`dDdDdDdDdD`bBbBbBbBbB`cccccccccc`aa`aaaaa`a`aaaaa`a`aaaa`aa",
+"aaaaaaaaaaaaaaaaaaaaaa`EEeEEEeEEE`DdDdDdDdDd`bbBbbbBbbb`cccccccccc`aaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaa`EeEeEeEeEe`dDdDdDdDdD`bBbBbBbBbB`cccccccccc`aaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaa`````````````````````````````````````````````aaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+};
diff --git a/images/legendn.xpm b/images/legendn.xpm
new file mode 100644 (file)
index 0000000..485b699
--- /dev/null
@@ -0,0 +1,22 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"1 14 1 1",
+/* colors */
+"a c #B0B0B0",
+/* pixels */
+"a"
+"a"
+"a"
+"a"
+"a"
+"a"
+"a"
+"a"
+"a"
+"a"
+"a"
+"a"
+"a"
+"a"
+};
diff --git a/images/legendpm.xpm b/images/legendpm.xpm
new file mode 100644 (file)
index 0000000..3b27679
--- /dev/null
@@ -0,0 +1,31 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"93 14 10 1",
+/* colors */
+"` c #000000",
+"a c #B0B0B0",
+"b c #00E600 m #ffffff",
+"c c #007F00 m #ffffff",
+"d c #FF7F00 m #ffffff",
+"e c #FFFF00 m #ffffff",
+"B c #00E600 m #000000",
+"C c #007F00 m #000000",
+"D c #FF7F00 m #000000",
+"E c #FFFF00 m #000000",
+/* pixels */
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaa```````````````````````aaaaaaaaaaaaaaaa```````````````````````aaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaa`EEEEEEEEEE`DDdDDDdDDD`aaaaaa````aaaaaa`ccCcccCccc`bbbbbbbbbb`aaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaa`EEEEEEEEEE`DdDdDdDdDd`aaaaa``aa``aaaaa`cCcCcCcCcC`bbbbbbbbbb`aaaaaaa``aaaaaaa",
+"aaaaaaaaaaaaaaa`EEEEEEEEEE`dDDDdDDDdD`aaaa``aaaa``aaaa`CcccCcccCc`bbbbbbbbbb`aaaaaaa``aaaaaaa",
+"aaaaaaaaaaaaaaa`EEEEEEEEEE`DdDdDdDdDd`aaaa``aaa```aaaa`cCcCcCcCcC`bbbbbbbbbb`aaaaaaa``aaaaaaa",
+"aaa````````aaaa`EEEEEEEEEE`DDdDDDdDDD`aaa``aaa`aa``aaa`ccCcccCccc`bbbbbbbbbb`aaaa````````aaaa",
+"aaa````````aaaa`EEEEEEEEEE`DdDdDdDdDd`aaa``aa`aaa``aaa`cCcCcCcCcC`bbbbbbbbbb`aaaa````````aaaa",
+"aaaaaaaaaaaaaaa`EEEEEEEEEE`dDDDdDDDdD`aaaa```aaa``aaaa`CcccCcccCc`bbbbbbbbbb`aaaaaaa``aaaaaaa",
+"aaaaaaaaaaaaaaa`EEEEEEEEEE`DdDdDdDdDd`aaaa``aaaa``aaaa`cCcCcCcCcC`bbbbbbbbbb`aaaaaaa``aaaaaaa",
+"aaaaaaaaaaaaaaa`EEEEEEEEEE`DDdDDDdDDD`aaaaa``aa``aaaaa`ccCcccCccc`bbbbbbbbbb`aaaaaaa``aaaaaaa",
+"aaaaaaaaaaaaaaa`EEEEEEEEEE`DdDdDdDdDd`aaaaaa````aaaaaa`cCcCcCcCcC`bbbbbbbbbb`aaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaa```````````````````````aaaaaaaaaaaaaaaa```````````````````````aaaaaaaaaaaaaaaa",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+};
diff --git a/images/maphilite.xpm b/images/maphilite.xpm
new file mode 100644 (file)
index 0000000..8b83c90
--- /dev/null
@@ -0,0 +1,570 @@
+/* XPM */
+static char *maphilite[] = {
+/* columns rows colors chars-per-pixel */
+"396 338 226 2",
+"   c #1C526E",
+".  c #1B5172",
+"X  c #335D5D",
+"o  c #385C5E",
+"O  c #21536E",
+"+  c #235570",
+"@  c #205678",
+"#  c #265871",
+"$  c #215C7E",
+"%  c #285771",
+"&  c #2B5A73",
+"*  c #335E60",
+"=  c #385D60",
+"-  c #335C75",
+";  c #375F78",
+":  c #395E78",
+">  c #33605C",
+",  c #3C6279",
+"<  c #455F7E",
+"1  c #40667B",
+"2  c #45697D",
+"3  c #496B7E",
+"4  c #51737D",
+"5  c #3F558A",
+"6  c #3F5A86",
+"7  c #3E5A89",
+"8  c #3C5C94",
+"9  c #266286",
+"0  c #29698D",
+"q  c #256694",
+"w  c #256995",
+"e  c #296794",
+"r  c #2A6894",
+"t  c #2A739E",
+"y  c #326C95",
+"u  c #376B9D",
+"i  c #3E6398",
+"p  c #307296",
+"a  c #367098",
+"s  c #397097",
+"d  c #3D7599",
+"f  c #3D789B",
+"g  c #3D6DA1",
+"h  c #337AA7",
+"j  c #327EAA",
+"k  c #3A76AA",
+"l  c #3C7AB2",
+"z  c #445686",
+"x  c #44568A",
+"c  c #415886",
+"v  c #43598B",
+"b  c #485685",
+"n  c #48558B",
+"m  c #4A5887",
+"M  c #495A8D",
+"N  c #455690",
+"B  c #425A90",
+"V  c #465F98",
+"C  c #4B5590",
+"Z  c #495C90",
+"A  c #4B5998",
+"S  c #466089",
+"D  c #4C6783",
+"F  c #4C638D",
+"G  c #4B6D80",
+"H  c #49698C",
+"J  c #426294",
+"K  c #446399",
+"L  c #466B9B",
+"P  c #4C6293",
+"I  c #4C659D",
+"U  c #4E6D93",
+"Y  c #4F7081",
+"T  c #44759C",
+"R  c #43799C",
+"E  c #4A759E",
+"W  c #4A7B9E",
+"Q  c #506F81",
+"!  c #526494",
+"~  c #546498",
+"^  c #536995",
+"/  c #536B99",
+"(  c #5D6A97",
+")  c #586C9B",
+"_  c #517182",
+"`  c #54748B",
+"'  c #537198",
+"]  c #59719D",
+"[  c #5F7E96",
+"{  c #5B7C9C",
+"}  c #456CA1",
+"|  c #4868A3",
+" . c #4474AB",
+".. c #477BA2",
+"X. c #437AAD",
+"o. c #4A74A2",
+"O. c #4975A9",
+"+. c #4D7AA0",
+"@. c #497FB2",
+"#. c #5277A0",
+"$. c #5076AA",
+"%. c #517AA1",
+"&. c #5B71A0",
+"*. c #597EA3",
+"=. c #6275A4",
+"-. c #627CA5",
+";. c #637DAA",
+":. c #687FAB",
+">. c #399C3E",
+",. c #2EBA1D",
+"<. c #2FB722",
+"1. c #2FB920",
+"2. c #33A72F",
+"3. c #35AB31",
+"4. c #31B425",
+"5. c #34B12B",
+"6. c #31B923",
+"7. c #34B929",
+"8. c #3B914B",
+"9. c #24CE05",
+"0. c #25CB08",
+"q. c #28C70D",
+"w. c #28CC0C",
+"e. c #2AC414",
+"r. c #2DC219",
+"t. c #29C911",
+"y. c #24D503",
+"u. c #25DA04",
+"i. c #28D10B",
+"p. c #27E104",
+"a. c #3580B1",
+"s. c #3C81B3",
+"d. c #3B8BB7",
+"f. c #3C8ABA",
+"g. c #3796C4",
+"h. c #3796CE",
+"j. c #3897CF",
+"k. c #3B99CF",
+"l. c #3A97D0",
+"z. c #3C99D0",
+"x. c #58819F",
+"c. c #4F80A1",
+"v. c #4D83AC",
+"b. c #4786B8",
+"n. c #4B81B2",
+"m. c #4F85B9",
+"M. c #5481A2",
+"N. c #5B82A4",
+"B. c #5E84A8",
+"V. c #5F89A1",
+"C. c #548BB4",
+"Z. c #538DBE",
+"A. c #5790BF",
+"S. c #5993BB",
+"D. c #6185A3",
+"F. c #6582AB",
+"G. c #6589A3",
+"H. c #638AAA",
+"J. c #6984AD",
+"K. c #6B8DA5",
+"L. c #6D8CAA",
+"P. c #6E85B1",
+"I. c #6C8CB2",
+"U. c #6791AA",
+"Y. c #6892AD",
+"T. c #6790B1",
+"R. c #6A92B2",
+"E. c #6E9CB6",
+"W. c #7384AF",
+"Q. c #718CB3",
+"!. c #778EBA",
+"~. c #7290B6",
+"^. c #7694BA",
+"/. c #719AB7",
+"(. c #739BBC",
+"). c #7896BC",
+"_. c #7B9ABD",
+"`. c #4394C3",
+"'. c #449CCA",
+"]. c #4B92C3",
+"[. c #4E95C8",
+"{. c #4A9CCC",
+"}. c #429DD2",
+"|. c #499DD0",
+" X c #5494C3",
+".X c #5496C9",
+"XX c #549ACB",
+"oX c #5C96C7",
+"OX c #5A96C9",
+"+X c #5B9ECD",
+"@X c #549CD0",
+"#X c #47A0D4",
+"$X c #4CA2D4",
+"%X c #59A1C7",
+"&X c #5BA3CC",
+"*X c #51A3D5",
+"=X c #54A6D9",
+"-X c #51A8D4",
+";X c #56A9D8",
+":X c #5AA5D4",
+">X c #5AA8D5",
+",X c #5EACDA",
+"<X c #7F96C0",
+"1X c #7B9BC2",
+"2X c #63A7D3",
+"3X c #63ADDA",
+"4X c #66B0DC",
+"5X c #6AB2DD",
+"6X c #7BA3C4",
+"7X c #7AA8C4",
+"8X c #7EADCA",
+"9X c #849CC0",
+"0X c #85A3C9",
+"qX c #8CACCD",
+"wX c #83B0CD",
+"eX c #83B4D2",
+"rX c #87B8D6",
+"tX c #8AB9D6",
+"yX c #8BBDDB",
+"uX c #8DC0DE",
+"iX c #90C1DF",
+"pX c #8EC2E0",
+"aX c #91C6E5",
+"sX c #91C8E7",
+"dX c #94C9E8",
+"fX c #98CBEA",
+/* pixels */
+"$X$X$X$X$X$X$X$X*X*X;X+XA.n.O.~ P v v v Z Z v M M n M M Z Z M n M M n M M M M M v Z n M M M n v M M M M v M M Z Z Z N Z n N Z n M M M M M Z N M M n M n n M M n n M n n M M M F v M J M M M M M n M M M N M n Z M M n v M v Z M v Z Z Z n Z n v Z N Z n M Z Z M Z n n M M n M n n M M M M M M M M v v M M S v Z Z Z M M M v F M M M M J M v M J M M M M x n n M n M N M M N M Z v Z Z n v Z n v Z N Z n N Z M N Z M N Z N M Z n Z v Z N M Z N M M N n Z v Z M n Z Z N Z M N M Z n v M Z N Z N Z n v v v v M v v v S v v v V x v n v V v v B v v B B B v B v B B B V v v B v B B B 5 8 v 8 v v 7 B B v 8 B 8 v v 8 v x B B B B 8 B 8 v B B v B B 8 n B v v x 8 v v B V c v B B B V x M v v v v J v M v v B v V v v V v v M V x v v v v v v F v V x v F v v v v v S v v v S B v V v N V K O.@.].{.{.|.}.}.z.z.z.j.j.h.j.j.",
+"$X$X$X$X$X$X=X+Xb.g K Z v N n v 7 5 v N v v v c v v v v 5 5 v v v x x x v v v v v 5 n B v v v x v v x v 5 5 v v x v x 5 v v v v x n x v x v 5 x v x v v v 5 v v v x v v x c v c c x x c v x v v v v v v v v v n v v x v v v v v v v n v v v v 5 v x v v 5 5 v v v v x 5 v 5 v c 5 v v v n x v 5 x v v v c c v c v v x x v v v v m m c v v x c b c v c x v v v v v v v v v x x v 5 5 v v x v x v v x v v v 7 v v x v 5 x n v v v 5 5 v x x v 5 v v v v v 5 5 v v x v 5 5 v x x v x 8 x x v N x x N v x x x x M c x v x x x c c c m m c c v c v z c v x x n v c v x z z x n M n n x v x n x x n x v x x x v c x x x x x x n c x x x v x x c n x x x z x x n v x x n n x v n c x v x x c c c v x c x x c v v v c z z c c x c v c c c x x x c c v c c x x v M x v M v 7 c v c c c c z v x n v v B B i X.].$X}.}.z.z.j.j.j.j.",
+"$X$X$X$X$X=X@XO.K v Z n z c c c X X X X * X X X X X X X X X X X X X X X X X X X X X X * * X X X X X * X X X X X X X X X X X X * o o o o X X X X X X X X * X X X X X X X X X X X X X o o X X X X X X X X X X X * * X X X X X X X X X X X X X X X X X * X X X X X X X X X * X X X X X * * X X X X X o X o o o o X X > o o o o X o o o o o X > o o X X X o X X X X X X X X X X X X X X * * * * X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X * * = X X X X o X > * > = * X X * X * X o o o o o o X X o X o = * = = = = = o X X X X X X X * X X * X X X o X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X * = = = = = = * * * * * * o * X X o o = X X X X X o X X o X X o o o o * = * = * = X X * X o * X * = = * = X X * X X c b b c x v 7 L XX=X}.}.z.l.l.l.l.",
+"$X$X$X$X=X:X .B v M P ] J.1X<.e.9.y.y.y.y.i.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.9.9.y.y.y.y.9.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.i.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.i.y.y.y.y.u.y.u.y.y.y.y.y.y.y.y.9.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.i.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.u.y.y.y.y.y.u.y.y.y.y.y.y.y.u.y.y.y.u.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.9.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.9.y.y.y.i.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.9.y.y.y.y.y.y.y.y.y.y.y.u.u.y.y.u.u.y.y.y.u.y.y.i.y.y.u.y.y.y.u.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.u.y.y.y.y.u.u.u.u.u.y.y.y.y.y.y.y.u.y.y.u.u.u.y.y.i.y.y.y.u.u.y.y.y.u.y.y.y.y.y.y.y.u.y.y.y.y.y.y.e.4.).J.) M z 7 } .X=X}.}.z.l.z.l.",
+"$X$X$X$X-X XB v x M ( W.9X4.t.y.u.u.u.y.u.u.u.u.y.y.y.u.u.u.u.u.u.u.u.u.y.u.u.y.u.y.u.y.u.u.u.u.y.u.y.u.u.y.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.y.y.u.u.u.u.u.u.u.y.u.u.y.u.u.y.y.u.u.y.u.u.u.u.y.y.y.u.u.y.u.y.y.u.u.y.y.u.y.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.y.u.y.u.y.u.u.y.u.u.y.y.u.y.u.u.y.u.y.i.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.y.y.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.y.u.u.u.u.y.u.y.u.u.y.u.y.u.y.u.u.u.u.y.u.y.u.u.i.u.i.i.u.u.i.y.y.y.u.y.u.u.y.u.u.u.u.y.u.u.y.y.u.u.u.u.u.u.u.y.u.u.u.u.u.y.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.y.y.y.u.u.u.u.u.u.y.y.u.u.u.u.y.y.u.u.y.u.y.y.u.u.u.u.y.u.u.y.u.u.y.u.u.u.y.u.y.u.u.u.u.u.u.u.i.u.u.u.u.u.y.y.u.y.u.u.u.y.y.u.u.u.u.u.y.e.4.1XJ./ m M 7 L .X*X#X}.k.k.z.",
+"*X$X*X@XZ.L 6 v M #./.4.t.0.y.u.u.p.p.p.p.p.y.u.p.u.u.p.p.u.p.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.p.p.u.u.u.u.u.u.u.p.p.p.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.p.u.p.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.p.p.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.y.p.p.u.u.u.p.u.u.p.u.u.y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.p.u.u.p.u.u.u.u.u.p.u.u.u.u.u.u.p.p.p.p.p.p.p.p.u.p.u.u.u.p.u.p.p.p.u.p.p.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.y.u.u.u.u.y.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.y.u.u.u.u.u.y.y.u.y.u.y.u.u.u.u.y.i.e.3.J./ m n v } oX=X$X}.z.z.",
+"$X$XXX .V v 5 F ) ^.6.w.u.u.y.u.u.u.u.y.u.u.u.u.y.u.y.u.y.u.y.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.y.u.y.y.u.u.i.u.u.u.u.u.i.u.y.u.u.y.u.y.u.y.u.u.y.u.y.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.y.y.u.u.y.u.u.u.u.y.u.y.u.y.u.y.u.y.u.u.y.u.y.y.u.u.y.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.y.u.u.y.u.u.u.u.u.u.u.u.y.u.u.y.u.u.y.u.u.y.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.y.u.u.y.u.u.u.y.u.u.u.u.u.u.u.y.y.u.y.u.u.y.y.u.u.u.y.y.u.u.u.u.u.u.u.u.u.u.u.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.y.y.u.u.y.y.u.y.u.y.y.u.y.u.u.u.p.y.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.y.u.y.y.u.y.u.u.w.5.8./ x v x } XX$X#X}.z.",
+"=X.XO.v 7 v M ^ >.,.i.u.y.p.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.9.5.J./ M n 5 } oX$X}.z.",
+"$X@.B x 7 V ) ^.1.y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.i.4.Q.~ Z v v o..X$X}.",
+"$X} v M Z / !.<.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.5.J./ v x x X.XX$X",
+"$XV M M ^ J.4.i.y.u.y.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.q.3.F.P n n 8 X.@X",
+"'.n x ^ -.1Xe.y.u.u.u.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.y.r.^.) Z x n K :X",
+"`.N b *.~.<.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.0.5.P./ v n M 2X",
+"l C z Q.6Xe.y.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.p.y.r.1X*.Z x v &X",
+"k n z 0X1.i.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.y.y.7.F.~ c n %X",
+"I x z ,.w.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.y.e.I./ x v S.",
+"P n X e.y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.~.) b x S.",
+"B x X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.w.).] x x C.",
+"B x X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.i./.] n x n.",
+"V z X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] x x v.",
+"5 z X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.y.9.).&.x n c.",
+"v c X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.w.).] n n ..",
+"B x X 9.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.i.^.] x n ..",
+"v x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] x x W ",
+"B x X y.u.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] v v o.",
+"8 x X y.y.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n x W ",
+"v x X y.u.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n z W ",
+"B z X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] x x E ",
+"v n X y.y.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x v E ",
+"7 v X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x x W ",
+"8 x X y.u.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.9.^.&.x x +.",
+"v x X i.u.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x x W ",
+"v n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.c x E ",
+"8 n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x x W ",
+"v x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v x W ",
+"v x X u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.c x E ",
+"B x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0._.&.x v E ",
+"8 x X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).&.v v W ",
+"v x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.) v v E ",
+"B b X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.x c E ",
+"B x X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0./.&.n x W ",
+"v b X y.y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).] x x W ",
+"v n X y.y.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.x x W ",
+"B x X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] x x +.",
+"v z X y.u.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.x x %.",
+"v z X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.(.&.x x W ",
+"B x X y.y.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x x W ",
+"v x o y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.c x +.",
+"B x > u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.c x +.",
+"B x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.(.&.v n +.",
+"B x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.9.).&.v x +.",
+"V n = u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v x +.",
+"v x = u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.c n +.",
+"v x = y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x x +.",
+"B x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.c v +.",
+"v v = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.x 5 { ",
+"B v = y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x 6 +.",
+"B n = u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n 6 %.",
+"8 x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n c %.",
+"v x = u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.9.).&.x 6 %.",
+"v x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).] x 6 %.",
+"B x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).&.x 6 %.",
+"v x = u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.9.^.&.x 6 %.",
+"B x * y.y.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] n 6 %.",
+"B v * y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x c %.",
+"B c * y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x c %.",
+"B v X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n c %.",
+"S v * y.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] x 6 W ",
+"v x o y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.(.&.x c %.",
+"B x o y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.0.).] n c +.",
+"B c > y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.x c +.",
+"B x > y.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] x x +.",
+"v c o y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).] v v W ",
+"B v X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.(.&.n c ' ",
+"B c o y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] v c %.",
+"B c X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v c %.",
+"B c X y.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n b %.",
+"B c o y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] v z +.",
+"B x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] v v +.",
+"J c X y.y.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n 6 +.",
+"V c X y.y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] x c %.",
+"v x X y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x 6 W ",
+"v c X y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n 6 %.",
+"B c * y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] n c %.",
+"B c X y.y.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.y.0.).&.x c %.",
+"8 c X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.(.&.M 6 +.",
+"v v X y.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).] c 6 %.",
+"B n = u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] M v ' ",
+"B x = y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x x W ",
+"v x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v c %.",
+"B x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n v +.",
+"v v = y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] c 6 %.",
+"B n = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.w.(.] n 7 ' ",
+"B v = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] x 7 W ",
+"B x * y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] v c W ",
+"v x X y.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] b M W ",
+"V x X y.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).] n c W ",
+"v x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.(.] n b +.",
+"v n X y.y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] v v o.",
+"v n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n v E ",
+"B n X y.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x v +.",
+"v n X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v c W ",
+"v x X i.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x c W ",
+"B v o y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v n E ",
+"V x = u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v x W ",
+"c v = y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x b E ",
+"v v * y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.5 x E ",
+"B x * y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.5 x E ",
+"B x o y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.v v E ",
+"B x o y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.(.&.v c E ",
+"V x = y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.5 z E ",
+"v v * y.u.y.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.y.0.^.&.v x T ",
+"v c o y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).&.v v T ",
+"v x * y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] v v L ",
+"B v * y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n n T ",
+"S 7 * y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.y.0.^.] v c T ",
+"v v X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.(.] v x T ",
+"B x o y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] v x T ",
+"B v X y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n v T ",
+"v v * u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.) v v T ",
+"7 v X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.(.&.x v T ",
+"B v X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).&.x x T ",
+"v x X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.) v v T ",
+"5 z o y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.) v z T ",
+"B v X y.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n n T ",
+"7 v o y.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.9.^.] v v T ",
+"v v X y.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).&.c v T ",
+"B v o y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.n v E ",
+"M m o i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.) v v E ",
+"M m o u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.v v E ",
+"v n o i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x n T ",
+"v x o u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v v T ",
+"V x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.v n L ",
+"v x = y.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.(.&.v x T ",
+"v n o y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.) x x W ",
+"B x = u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] v v E ",
+"B x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v x E ",
+"v x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v n L ",
+"B c * y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v x E ",
+"B M = y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v x E ",
+"B n = u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] v n E ",
+"B v = y.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] v n E ",
+"v v = y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v n E ",
+"B x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] c x o.",
+"B n * y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.5 n E ",
+"S v = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.8 x E ",
+"B n = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v v E ",
+"v v = y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v n E ",
+"B x o y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] v n +.",
+"B x o y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] c x +.",
+"S v * y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v z ' ",
+"B x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v v %.",
+"v z X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x x +.",
+"B z X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x x +.",
+"x v X y.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x x +.",
+"v n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).&.x c +.",
+"B z X y.u.u.y.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).] v c %.",
+"B x X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.(.] c b +.",
+"v z X y.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v x M.",
+"x z X y.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.y.0.^.&.n c #.",
+"B n X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.(.] n 7 %.",
+"x v X y.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).] n 7 *.",
+"B v X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] n 7 %.",
+"B n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] n 7 +.",
+"x x * y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).] n 7 *.",
+"B x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n 7 %.",
+"B n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n 7 %.",
+"x v X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] N 7 *.",
+"B n X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n 7 *.",
+"B n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).] n 6 %.",
+"v n * y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v v *.",
+"x v X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v 6 *.",
+"8 n X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x c *.",
+"B x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n c N.",
+"B x X y.u.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.x c N.",
+"B n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.(.&.n c N.",
+"v x X y.y.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] n 6 N.",
+"v x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n c N.",
+"B n X y.y.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x 5 N.",
+"B v X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n v N.",
+"v n * y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n 5 N.",
+"B n * y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x 5 N.",
+"B n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] n c N.",
+"B x X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).&.n 7 N.",
+"B x X y.y.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.w.(.] n c N.",
+"v x X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n 7 N.",
+"B n X y.y.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n 5 N.",
+"8 x X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] x c N.",
+"v x X y.u.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x c *.",
+"8 c X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] n c N.",
+"v x X y.y.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x 5 N.",
+"B x X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v 5 N.",
+"v x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.w.^.&.v 6 *.",
+"8 x X y.y.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] v c N.",
+"v c o y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n 7 +.",
+"8 b X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n 7 +.",
+"v x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] x M #.",
+"J x = y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] x c +.",
+"v x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x c +.",
+"v v = y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n c +.",
+"B n = u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x 6 %.",
+"8 B = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x 6 +.",
+"v x = y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n c ' ",
+"v x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x 6 W ",
+"V x X y.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] x x +.",
+"v x X y.y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.c M +.",
+"v n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.x c +.",
+"v n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] x c +.",
+"B n X 9.y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n v o.",
+"v v X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] v v E ",
+"v x X y.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n x W ",
+"B x X i.y.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.) v v W ",
+"B x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.(.&.c x E ",
+"v x = u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.v n W ",
+"B x o u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.c n E ",
+"B x o y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] x x E ",
+"v x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).] v x E ",
+"B v = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.(.&.v v E ",
+"v x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] 5 z L ",
+"B x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] v v E ",
+"B M * y.y.u.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n v T ",
+"7 v X u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] v v T ",
+"v c o y.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] v v T ",
+"8 M X y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).&.v x L ",
+"v v o y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] x v T ",
+"v n o y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x x T ",
+"8 v o y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x x T ",
+"v c o y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.c v T ",
+"v v X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n c T ",
+"B v X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.v v T ",
+"v x X y.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v v L ",
+"5 z o y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.y.0.^.&.v c R ",
+"B v o y.y.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] v v T ",
+"7 v o y.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] v v L ",
+"v v X y.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n v T ",
+"7 v X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n v T ",
+"B v = y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] v n E ",
+"B n = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n v T ",
+"B x = u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.) v c E ",
+"v x = y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] v v E ",
+"B v * y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.5 x E ",
+"S v = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v x T ",
+"v x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v v L ",
+"B M = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.5 v E ",
+"B x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v x E ",
+"v x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v x E ",
+"B x = u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v x E ",
+"B x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.5 x E ",
+"B n * y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v x E ",
+"B n * y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x n E ",
+"B c = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v x E ",
+"8 n = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.5 x E ",
+"v x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.w.^.] v x E ",
+"v v = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] c n E ",
+"V x = u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.B n W ",
+"c v = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] v n E ",
+"B x = y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.v x E ",
+"v x o u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v n E ",
+"B x > y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.(.&.c n W ",
+"B x = u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).&.x v ' ",
+"v b X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n v +.",
+"B b X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] v v +.",
+"B x X y.y.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n c +.",
+"B b X y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n c +.",
+"B z X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x v %.",
+"B z X y.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x c +.",
+"v z X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.x c %.",
+"v z X y.u.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.(.] c v +.",
+"B x X y.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x v %.",
+"v n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n v %.",
+"B x X y.y.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).&.x v %.",
+"B x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.9.).&.x 6 %.",
+"v n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x 5 +.",
+"B v X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v c %.",
+"x v X u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n 7 *.",
+"B n o y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] n 7 %.",
+"x v X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x 7 *.",
+"B n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] N 7 %.",
+"x x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x 7 *.",
+"B x X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n c *.",
+"B n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.y.0.^.] n 7 *.",
+"B n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n c *.",
+"B x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.w.^.&.n 7 N.",
+"B n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] v v *.",
+"x v X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] n c N.",
+"B v X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.N v N.",
+"B n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] n 5 N.",
+"8 n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n 6 N.",
+"v n X y.y.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] x v *.",
+"B x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] N c N.",
+"v n X y.y.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n c N.",
+"B x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.N c N.",
+"B x X y.y.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n c N.",
+"B x X y.y.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] n c *.",
+"B x X y.u.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.0.^.&.v 5 N.",
+"B x X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n 6 N.",
+"8 c X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x 5 N.",
+"v 5 X y.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x c *.",
+"B x X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.x c N.",
+"B x > u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.x c *.",
+"7 x X y.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n c N.",
+"B n X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).&.n 6 N.",
+"v n X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.).) x 6 *.",
+"8 x X y.u.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.).&.x v N.",
+"v x X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.&.n 7 *.",
+"v x X y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.v 7 N.",
+"8 x o y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] v c N.",
+"v x o y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n c *.",
+"c v X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n 7 N.",
+"v v X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] N 7 N.",
+"7 v X y.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.] n c N.",
+"B N X y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.N 7 N.",
+"v v X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.^.] n c N.",
+"v v X y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.z c N.",
+"v n X y.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.9.^.&.x 6 N.",
+"v n X y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.0.^.&.n 6 B.",
+"v M X y.y.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.y.u.w.~.] n c B.",
+"v v X y.y.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.y.u.u.p.w.^.] x 6 B.",
+"V n X 0.u.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.^.] n c B.",
+"i x v r.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.i.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.t.~./ x c B.",
+"g n v 5.t.i.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.y.y.r.I.! n 7 H.",
+"k v v <XqXq.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.i.5.;.P n 5 T.",
+"a.5 c P._.e.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.y.,.^.) V n c T.",
+"f.8 c =.J.4.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.w.3.F.P x v v I.",
+"g.N Z ! =._.r.y.p.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.y.u.i.1.~./ x v n M (.",
+"'.v x v ~ :.2.q.y.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.r._.] F v n c L 7X",
+"'.P b v A ! H.4.w.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.y.t.3.-.P c v c U T.eX",
+"$XO.V n v v / I.4.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.t.3.P.P v x z F Y.8XpX",
+";X[.X.x n N Z ] Q.6.0.y.p.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.q.3.J./ v v x S x.7XuXsX",
+",X;X{.O.B n B v ) I.5.r.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.y.u.y.,.3.J.^ v v v c E 7XuXuXsX",
+"3X,X;X[.X.v c v Z ) P.3.,.t.y.y.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.p.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.y.t.1.1XF.! x c x c U R.tXsXdXdX",
+"4X3X3X;X{.o.C N x v ^ D.(.5.t.i.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.0.r.3.^.*.P c c M n P I.eXuXdXdXsX",
+"3X3X5X3X>X[.l J v n F / F.1X7.t.y.u.u.u.u.u.u.u.u.u.y.u.u.u.u.y.u.y.u.u.u.u.u.u.y.u.u.u.u.u.y.y.u.u.u.y.u.u.u.u.y.y.u.u.u.u.u.y.u.u.u.u.y.y.u.y.u.u.u.u.u.u.u.u.u.u.u.u.u.y.y.y.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.y.u.u.u.u.u.u.u.u.y.u.u.y.y.u.u.u.u.y.y.y.u.u.u.y.y.y.u.u.u.y.u.u.u.y.u.u.u.u.p.y.u.u.u.y.u.u.u.p.u.u.u.u.u.y.u.u.u.u.u.y.y.u.p.u.u.y.y.u.y.u.y.y.y.u.y.u.u.p.u.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.y.y.u.u.y.y.u.u.u.u.y.y.u.u.u.y.u.p.u.y.y.y.u.u.u.y.y.u.u.u.u.u.u.u.u.u.u.y.u.y.y.u.u.u.u.u.u.y.u.u.y.u.u.y.u.y.u.u.y.u.u.u.u.u.u.u.u.u.u.y.u.u.u.u.u.y.u.u.y.u.y.y.u.u.y.y.u.u.y.u.u.y.u.u.y.u.u.y.u.y.u.y.u.y.u.u.u.u.u.y.y.y.u.u.u.y.y.u.y.y.y.u.u.u.y.y.i.p.u.u.y.y.u.u.u.u.y.y.u.y.y.u.u.y.u.u.y.u.y.u.u.y.y.y.y.u.y.u.y.u.u.u.u.y.u.u.y.y.u.y.y.y.9.e.qX^.;.I v x b c H H.8XuXsXdXsXsX",
+"5X5X5X3X4X,X@XO.K v c 7 6 6 5 X X X X X X X > X X X X X X X X X * X X X X X X X X X o X X X X X X X X X X X X * X * X X X X X X X * X X X X X X X X X X o o o o X X X X X X X X X X X X * X * X X X X o X X X X X X X X X X X X X X X X X * * X X X X X o X X X X X X X X X X X > X X X X X X X X X X X X X = X * X X X X X X X > X > > X X X X > X X X X X > X X X X > > X > X > > > > X X X X X X X X > > > X X X X X X X > X > X > X > X X X X X > > > > X > X X X X X X X X X X X X X X X X X X X X X X X > X X X X X X X X * X X X * * * * X X X X > X * > > X X X X X X X X X X X X X X X X X X X X X X X X o X X * * * X * X * * X X * * X X * X X X X o X X * * * * X X * X X X o o o o * X X X X X X X X * * * X * * * X X X X X X X X X X X X X X X X > X X X X X X X X X X z v v c c b z F { Y.8XyXsXdXdXsXsX",
+"5X3X5X5X5X3X3X+Xm.| A C n n v x c v v c n v 5 x b x x x v v x v B 5 5 x v 5 v v z x x z c c v v c v c v x x x c x x x v v x v x v v c v v v v c c v x c x x M n c v c c v v v c v v c v x x x x x x x x c x b c c v c v c v n x v v v c x n x v v v v v v 5 v v v v v v 6 c v v v v 6 c v v c c v c x x v v v c c x x x x c x x n z 5 v z n z n c v x x v n v z z n x x c v n x x n 5 v x n x x b c x n x x 5 v n x z n v v x x v c x x x n 5 c n z n x 6 v c b b n n n n x b x n z n x z x x x x x x x n n 5 c n n n n b x x n x x n n n n v v n n x x 5 v n n v x n b n x b b x n n n n x n z x x x x n x v n x x x n n x n x n v n v n N N n n n n M n n m m n n N n n n n x n n x n n n m n x n n n n n x C n n v v n x n n v n n v v x x x v N n n n n N n n n v x n n n n v n z b x x x x M H -./.wXyXsXsXdXdXsXsX",
+"5X5X5X5X5X5X5X3X>X{.g.d.h u 8 7 7 c b x c b x x x n x n n n n v n N n v n n n x x n x x x v v n v n n n x v n n x x x N x x x n x n N n n N n v n c x x x x n b x x n z x x n x x x x n x n n z c x n x x x x x c n n v n x v x n n v n x x x N x x v n n n n n x n z x x v v n x v n c x x n x x x x x x n x n v n v v x M x x x v v c v v 5 c c v x v v v c c v v n 5 v v x z v v c v x x x x c x x b x z x c z 5 x v z c x z z v x z v c v v v 5 z z v c S 6 x c c v v c c c c z c c c c c c c c v c 7 c c v v c c c c c c v v v v c 5 v v 5 v x z z v v z z z c c c c c c c c c c x c c v v v v c 5 v v v v M x x x x x x x v x c c x c c c c b c c b x m D c z x v z z z z v 5 z x x z n m x v v v v v 5 x x v v v c v c c c v c v v v v v c c x x c c x x v x c v v x x v v c 5 z < < D ` [ Y.7XtXaXfXfXfXdXsXsXpX",
+"5X5X5X5X5X5X5X5X5X5X:X{.`.d.j p 0 9 . . . . . . . . . . . .   O     O O + O               .     .   .         O O O O O O O # + + + + + + + + % # # # O # # % % % % % % % # & & & & & & & & & - -                   . . .   . .   O O O O O O O + + + O + + + + O % % O % O % % # % % % % * # # & & & & & & & & & - - - - - - - - - - - - - - - - - - - - - , & , & - - ; - ; ; - : : : : : : : : , , , , , , , , , , , , , , , , , , & , , & - , - , , - , , , , , , , , 1 1 2 2 , 1 2 1 3 3 2 2 2 2 2 2 2 3 2 2 2 3 2 4 2 3 3 2 3 3 3 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 G 2 3 2 2 2 3 3 G 3 G Q G Y _ 4 Q Q 4 Q Q Y Y Y Y Y Q _ _ _ _ _ _ 4 [ 4 4 _ _ _ _ _ 4 _ _ 4 Q _ Q Q _ Q Q _ 4 4 4 4 4 4 4 4 4 _ _ 4 _ G Y Y G G Y Y 3 3 3 3 Y Y 3 Y 3 3 3 3 G G G 3 G G 3 3 4 4 Q ` { H./.9XtXiXiXfXfXfXfXfXsXsXsX",
+"5X5X5X5X5X5X5X5X5X5X5X3X>X*X'.b.h t t w w w r w r r e e w e r 0 e e 0 r r r r e e e w e w q q q q q q q q q q 0 r y r y y y y y r y y y y y u y y r y y y y y y y y y s s s s s s a d d d R d R d q q q q q q q q q q q q q e q q r y r y r y y y y y y y y y y y p p y y y y y y y y y y s a a s s s s d s T d T R f f f f f p T d f d T f d f d d f d f p f f f f T R R R R R R R R R R R R R R ....R W W R ..R W R c.c.R c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.M.M.x.M.M.M.M.M.V.x.M.M.x.x.M.V.x.N.N.N.x.N.N.G.x.G.N.B.x.B.B.B.N.D.V.D.D.D.G.V.V.G.V.V.V.V.G.G.D.H.D.B.N.B.x.N.x.G.B.B.B.G.G.H.D.D.G.G.G.G.G.L.K.G.G.K.L.G.G.L.K.K.K.K.K.Y.K.L.L.L.K.K.K.L.K.K.K.L.L.K.L.L.K.K.K.K.K.K.K.K.K.K.L.L.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.H.G.G.G.G.G.G.G.G.G.G.G.K.K.G.G.G.G.G.G.G.G.G.D.x.K.E.7XwXyXyXiXfXfXfXfXfXfXfXsXsXsX"
+};
diff --git a/images/micropolisg.xpm b/images/micropolisg.xpm
new file mode 100644 (file)
index 0000000..a77b2a1
--- /dev/null
@@ -0,0 +1,66 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"37 47 12 1",
+/* colors */
+"` c #BF0000 m #000000",
+"a c #FFFF7F m #ffffff",
+"b c #FFBF7F m #ffffff",
+"c c #BFBF3F m #000000",
+"d c #FF0000 m #000000",
+"e c #FFFF00 m #ffffff",
+"f c #7F7F00 m #000000",
+"g c #BFBFBF m #ffffff",
+"h c #FFBFFF m #ffffff",
+"i c #FFBB00 m #000000",
+"j c #0000FF m #000000",
+"k c #00CF00 m #ffffff",
+/* pixels */
+"ggggggggffffffffffffffffffffffffggggg",
+"gggggggfbbbbbbbbbbbbbbbbbbbbbbbbfgggg",
+"ggggggfbbbbbbfffffffbbbbbbbbiiiibfggg",
+"gggggfbbbbbffkkkkkkkffbbbbbiaaaaibfgg",
+"gggggfbbbbfkkkkkkkkkkkfbbbbiaaaaibfgg",
+"gggggfbbbfkkkkkkkkkkkkkfbbbiaaaaibfgg",
+"gggcccccccckkkkkkkkkkkkkfbbiaaaaibfgg",
+"ggggfbbbfkkkkkkkkkkkkkkkfbbiaaaaibfgg",
+"gggccccccckkkkkkkkkkkkkkkfbbiiiibbfgg",
+"ggggfbbfkkkkkkkkkkkkkkkkkfbbb``bbbfgg",
+"gggggfbfkkkkkkkkkkkkkkkkkfbb`dd`bbfgg",
+"ggggccbfkkkkkkkkkkkkkkkkkfb`dddd`bbfg",
+"gggfccbfkkkkkkkkkkkkkkkkkfbb````bbbfg",
+"gggfccbfkkkkkkkkkkkkkcccccccccccccccf",
+"gggfccbbfkkkkkkkkkkkkkkkfbbbbbbbbbbfg",
+"gggfccbbfkkkkkkkkkkkccccccccccccccccf",
+"gggfccbbbfkkkkkkkkkkkkkfbbbbbbbbbbbfg",
+"ggfbccbbbbfkkkkkkkccccccccccccccccccf",
+"gfbbbcbbbbbfkkkkkkkkkfbbbbbbbbbbbbbfg",
+"ccccccccccccccccccccccccccccccccccccf",
+"ccccccccccccccccccccccccccccccccccccf",
+"gfbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfg",
+"ggfbccbcccccccb`bbbbb`bb`bb`bb`bb`bbf",
+"gggfccbceceeec`d`bbb`d``d``d``h``d`bf",
+"gggfccbceceeec`d`bbb`d``d``d``h``d`bf",
+"gggfccbcccccccb`bbbbb`bb`bb`bb`bb`bbf",
+"gggfccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbf",
+"gggfccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbf",
+"gggfc`````ccccccccccccccccccccccccccf",
+"gggfc`ddd`ccccccbbbbbbb`````````bbbfg",
+"gggfc`ddd`ccccccbbbbbb`aaaaaaaaa`bfgg",
+"gggfcb`dd`cccccbbbbbb`aaaaaaa`aaa`fgg",
+"gggfcbb```cccccbbbbbb`aaaaaa`aaaa`fgg",
+"gggfbcbbbbccccbbbbbbb`aaaaaa`aaaa`fgg",
+"gggfbcbbbbbbbbbbbaabb`aaaaa`aaaaa`fgg",
+"gggfbcbbbbbbbbbbaaaabb```````````bfgg",
+"gggfbcbbbbbbbbbaa``aabbbbb``bbbbbbbfg",
+"ggggfbcbbbbbbbbb`dd`bbbbb`dd`beebbbfg",
+"gggggfbcbbbbbbbb````bbbbb````eeejjjcf",
+"gggggfbcbbbbbbbbbbbbbbbbbbbbeejjjjbfg",
+"gggggfbbcbbbbbbbbbbbbbbbbbbbjjjjeeccf",
+"ggggggfbcbbbbbbbbbbbbbbbbbbjjjeeebbfg",
+"gggggggfbcbbbbbbbbbbbbbbbbbbbbeebbbbf",
+"ggggfffbbcbbbbbbbbbbbbbbbbbbbbbbbbbfg",
+"gggfbbbbbbccccccccccccccccccccccccccf",
+"gggfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfg",
+"ggggfffffffffffffffffffffffffffffffgg"
+};
diff --git a/images/micropolism.xpm b/images/micropolism.xpm
new file mode 100644 (file)
index 0000000..74cf793
--- /dev/null
@@ -0,0 +1,85 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"58 67 11 1",
+/* colors */
+"` c #BF0000 m #000000",
+"a c #FFFF7F m #ffffff",
+"b c #BFBFBF m #ffffff",
+"c c #FFBF7F m #ffffff",
+"d c #BFBF3F m #000000",
+"e c #FF0000 m #000000",
+"f c #FFFF00 m #ffffff",
+"g c #7F7F00 m #000000",
+"h c #FFBFFF m #ffffff",
+"i c #FFBB00 m #000000",
+"j c #0000FF m #000000",
+/* pixels */
+"bbbbbbbbbbbbbbbbbbbgggggggggggggggggggggggggggggbbbbbbbbbb",
+"bbbbbbbbbbbbbbbggggccccccccccccccccccccccccccccgbbbbbbbbbb",
+"bbbbbbbbbbbbbggcccccccccccccccccccccccccccccccccggbbbbbbbb",
+"bbbbbbbbbbbggccccccccccccccccccccccccccccccccccccggbbbbbbb",
+"bbbbbbbbbbgcccccccccccgggggggccccccccccccccccccccccggbbbbb",
+"bbbbbbbbbgcccccccccgggggggggggggccccccccccciiiiiiiccgbbbbb",
+"bbbbbbbbbgcccccccgggggjjjjjjggggggcccccccciaaaaaaaicgbbbbb",
+"bbbbbbbbgcccccccggggjjjjjjjjjjjggggccccccciaaaaaaaicgbbbbb",
+"bbbbbbbbgccccccgggjjjjjjjjjjjjjjjgggcccccciaaaaaaaicgbbbbb",
+"bbbbbbbbgcccccggjjjjjjjjjjjjjjjjjjgggccccciaaaaaaaicgbbbbb",
+"bbbbbbdddddddddddjjjjjjjjjjjjjjjjjjgggcccciaaaaaaaicgbbbbb",
+"bbbbbdddddddddddddjjjjjjjjjjjjjjjjjjgggccciaaaaaaaicgbbbbb",
+"bbbbbbbbgcccggjjjjjjjjjjjjjjjjjjjjjjjggccciaaaaaaaicgbbbbb",
+"bbbbbbddddddddddjjjjjjjjjjjjjjjjjjjjjggccciiiiiiiiicgbbbbb",
+"bbbbbddddddddddddjjjjjjjjjjjjjjjjjjjjjggccccccccccccgbbbbb",
+"bbbbbbbgcccggjjjjjjjjjjjjjjjjjjjjjjjjjggccccc``cccccgbbbbb",
+"bbbbbbbbgccggjjjjjjjjjjjjjjjjjjjjjjjjjggcccc`ee`ccccgbbbbb",
+"bbbbbbbgggcggjjjjjjjjjjjjjjjjjjjjjjjjjggcccc`ee``ccccgggbb",
+"bbbbbggdcdcggjjjjjjjjjjjjjjjjjjjjjjjjjggcccce``eccccccccgb",
+"bbbbbgcdcdcggjjjjjjjjjjjjjjjjjjjjjjjjjggccccccccccccccccgb",
+"bbbbbgcdcdcgggjjjjjjjjjjjjjjjjjjjjjdddddddddddddddddddddcg",
+"bbbbbgcdcdccggjjjjjjjjjjjjjjjjjjjjdddddddddddddddddddddddb",
+"bbbbbgcdcdccggjjjjjjjjjjjjjjjjjjjjjjjggcccccccccccccccccgb",
+"bbbbbgcdcdcccggjjjjjjjjjjjjjjjjjddddddddddddddddddddddddcg",
+"bbbbbgcdcdcccgggjjjjjjjjjjjjjjjddddddddddddddddddddddddddb",
+"bbbbbgcdcdccccgggjjjjjjjjjjjjjjjjjgggcccccccccccccccccccgb",
+"bbbgggcdcdcccccggggjjjjjjjjjddddddddddddddddddddddddddddgg",
+"bbbgcccccdccccccgggggggggggddddddddddddddddddddddddddddddb",
+"bbggcccccdccccccccgggggggggggggggcccccccccccccccccccccccgb",
+"bdddddddddddddddddddddddddddddddddddddddddddddddddddddddgb",
+"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddg",
+"bbbgcccccdccccccccccccccccccccccccccccccccccccccccccccccgb",
+"bbbbgccccdccccccccccccccccccccccccccccccccccccccccccccccgb",
+"bbbbbgcdcdcdddddddddddc``ccccccc```cc```cc```cceeecc```cgb",
+"bbbbbgcdcdcdfffdfffffd`ee`ccccc`eee``eee``eee`ehhhe`eee`gb",
+"bbbbbgcdcdcdfffdfffffd`ee``cccc`eee``eee``eee`ehhhe`eee`gb",
+"bbbbbgcdcdcdfffdfffffde``eccccc`eee``eee``eee`ehhhe`eee`gb",
+"bbbbbgcdcdcdddddddddddccccccccc```````````````eeeee`````gb",
+"bbbbbgcdcdccccccccccccccccccccccccccccccccccccccccccccccgb",
+"bbbbbgcdcdccccccccccccccccccccccccccccccccccccccccccccccgb",
+"bbbbbgcdcdccccccccccccccccccccccccccccccccccccccccccccccgb",
+"bbbbbgcdc```````ddddddddddddddddddddddddddddddddddddddddbb",
+"bbbbbgcdc`eeeee`dddddddddccccccccccc````````````ccccgbbbbb",
+"bbbbbgcdc`eeeee`dddddddddcccccccccc`aaaaaaaaaaaa``ccgbbbbb",
+"bbbbbgcdcc`eeee`dddddddddccccccccc`aaaaaaaaaaaaaaa`cgbbbbb",
+"bbbbbgcdcc`eeee`ddddddddccccccccc`aaaaaaaaaaa`aaaaa`gbbbbb",
+"bbbbbgcdccc``ee`ddddddddccccccccc`aaaaaaaaaaa`aaaaa`gbbbbb",
+"bbbbbgcdccccc```dddddddcccccccccc`aaaaaaaaaa`aaaaaa`gbbbbb",
+"bbbbbgccdcccccccddddddccccccccccc`aaaaaaaaaa`aaaaaa`gbbbbb",
+"bbbbbbgcdcccccccdddddccccccccacccc`aaaaaaaa`aaaaaa`cgbbbbb",
+"bbbbbbgcdccccccccccccccccccaaaaacc`aaaaaaaa`aaaaa``cgbbbbb",
+"bbbbbbgccdcccccccccccccccaaaaaaaacc``````````````cccgbbbbb",
+"bbbbbbbgcdcccccccccccccccaaa``aaacccccccc``ccccccccccggbbb",
+"bbbbbbbgcdccccccccccccccaaa`ee`aaacccccc`ee`ccccfccccccgbb",
+"bbbbbbbgccdcccccccccccccccc`ee``cccccccc`ee``cffffccccggbb",
+"bbbbbbbbgccdccccccccccccccce``eccccccccce``efffffffjjjdgbb",
+"bbbbbbbbbgcdccccccccccccccccccccccccccccccccffffjddddjddbb",
+"bbbbbbbbbgcdcccccccccccccccccccccccccccccccffjjddjddjjgbbb",
+"bbbbbbbbbbgcdcccccccccccccccccccccccccccccjjjdddddjjcddggb",
+"bbbbbbbbbbgccdcccccccccccccccccccccccccccccddddjjfffddddbb",
+"bbbbbbbbbbbgcdcccccccccccccccccccccccccccccjdjffffffcccgbb",
+"bbbbbbggggggccdccccccccccccccccccccccccccccccffffffccddgbb",
+"bbbbbgcccccccccdccccccccccccccccccccccccccccccccccccddddgb",
+"bbbbbgccccccccccdccccccccccccccccccccccccccccccccccccccgbb",
+"bbbbbgcccccccccccddddddddddddddddddddddddddddddddddddddbbb",
+"bbbbggccccccccccccccccccccccccccccccccccccccccccccccccggbb",
+"bbbbgggggggggggggggggggggggggggggggggggggggggggggggggggbbb"
+};
diff --git a/images/micropoliss.xpm b/images/micropoliss.xpm
new file mode 100644 (file)
index 0000000..237cc59
--- /dev/null
@@ -0,0 +1,66 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"37 47 12 1",
+/* colors */
+"` c #BF0000 m #000000",
+"a c #FFFF7F m #ffffff",
+"b c #FFBF7F m #ffffff",
+"c c #BFBF3F m #000000",
+"d c #FF0000 m #000000",
+"e c #FFFF00 m #ffffff",
+"f c #7F7F00 m #000000",
+"g c #BFBFBF m #ffffff",
+"h c #FFBFFF m #ffffff",
+"i c #FFBB00 m #000000",
+"j c #0000FF m #000000",
+"k c #CF0000 m #000000",
+/* pixels */
+"ggggggggffffffffffffffffffffffffggggg",
+"gggggggfbbbbbbbbbbbbbbbbbbbbbbbbfgggg",
+"ggggggfbbbbbbfffffffbbbbbbbbiiiibfggg",
+"gggggfbbbbbffkkkkkkkffbbbbbiaaaaibfgg",
+"gggggfbbbbfkkkkkkkkkkkfbbbbiaaaaibfgg",
+"gggggfbbbfkkkkkkkkkkkkkfbbbiaaaaibfgg",
+"gggcccccccckkkkkkkkkkkkkfbbiaaaaibfgg",
+"ggggfbbbfkkkkkkkkkkkkkkkfbbiaaaaibfgg",
+"gggccccccckkkkkkkkkkkkkkkfbbiiiibbfgg",
+"ggggfbbfkkkkkkkkkkkkkkkkkfbbb``bbbfgg",
+"gggggfbfkkkkkkkkkkkkkkkkkfbb`dd`bbfgg",
+"ggggccbfkkkkkkkkkkkkkkkkkfb`dddd`bbfg",
+"gggfccbfkkkkkkkkkkkkkkkkkfbb````bbbfg",
+"gggfccbfkkkkkkkkkkkkkcccccccccccccccf",
+"gggfccbbfkkkkkkkkkkkkkkkfbbbbbbbbbbfg",
+"gggfccbbfkkkkkkkkkkkccccccccccccccccf",
+"gggfccbbbfkkkkkkkkkkkkkfbbbbbbbbbbbfg",
+"ggfbccbbbbfkkkkkkkccccccccccccccccccf",
+"gfbbbcbbbbbfkkkkkkkkkfbbbbbbbbbbbbbfg",
+"ccccccccccccccccccccccccccccccccccccf",
+"ccccccccccccccccccccccccccccccccccccf",
+"gfbbbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfg",
+"ggfbccbcccccccb`bbbbb`bb`bb`bb`bb`bbf",
+"gggfccbceceeec`d`bbb`d``d``d``h``d`bf",
+"gggfccbceceeec`d`bbb`d``d``d``h``d`bf",
+"gggfccbcccccccb`bbbbb`bb`bb`bb`bb`bbf",
+"gggfccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbf",
+"gggfccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbf",
+"gggfc`````ccccccccccccccccccccccccccf",
+"gggfc`ddd`ccccccbbbbbbb`````````bbbfg",
+"gggfc`ddd`ccccccbbbbbb`aaaaaaaaa`bfgg",
+"gggfcb`dd`cccccbbbbbb`aaaaaaa`aaa`fgg",
+"gggfcbb```cccccbbbbbb`aaaaaa`aaaa`fgg",
+"gggfbcbbbbccccbbbbbbb`aaaaaa`aaaa`fgg",
+"gggfbcbbbbbbbbbbbaabb`aaaaa`aaaaa`fgg",
+"gggfbcbbbbbbbbbbaaaabb```````````bfgg",
+"gggfbcbbbbbbbbbaa``aabbbbb``bbbbbbbfg",
+"ggggfbcbbbbbbbbb`dd`bbbbb`dd`beebbbfg",
+"gggggfbcbbbbbbbb````bbbbb````eeejjjcf",
+"gggggfbcbbbbbbbbbbbbbbbbbbbbeejjjjbfg",
+"gggggfbbcbbbbbbbbbbbbbbbbbbbjjjjeeccf",
+"ggggggfbcbbbbbbbbbbbbbbbbbbjjjeeebbfg",
+"gggggggfbcbbbbbbbbbbbbbbbbbbbbeebbbbf",
+"ggggfffbbcbbbbbbbbbbbbbbbbbbbbbbbbbfg",
+"gggfbbbbbbccccccccccccccccccccccccccf",
+"gggfbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbfg",
+"ggggfffffffffffffffffffffffffffffffgg"
+};
diff --git a/images/nuclear.xpm b/images/nuclear.xpm
new file mode 100644 (file)
index 0000000..456dacf
--- /dev/null
@@ -0,0 +1,84 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"64 64 13 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #0000E6",
+"c c #3F3F3F",
+"d c #007F00",
+"e c #FF0000",
+"f c #997E4C",
+"g c #00E600",
+"h c #FFFFFF",
+"i c #FFFF00",
+"j c #CC7E66",
+"k c #FF7B00",
+"l c #BFBFBF",
+/* pixels */
+"`iiiiiiiiiiiiiiiiiiiiiiiiiihhhehhhiiiiiiiiiiiiiiiihhhehhhiiiiiii",
+"`i```````````````````````hhaaaaaaahh````````````hhaaaaaaahh````i",
+"`ijjjjjjjjjfjjjjjjjjjjjjhac`c`c`c`cahjjjjjjjjjjhac`c`c`c`cahjj`i",
+"`ijfjjjjjjjjjjjjjjjjjjjhac`c`c`c`c`cahjjjjjjjjhac`c`c`c`c`cahj`i",
+"`ijjjjjliccccccccccccchac`c`c`c`c`c`cahcccccchac`c`c`c`c`c`cah`i",
+"`ijjjjllcccccccccccccchc`c`c`c`c`c`c`chcccccchc`c`c`c`c`c`c`ch`i",
+"`ijjjlllca`ccccccccccha`c`c`c`c`c`c`c`ahccccha`c`c`c`c`c`c`c`ahi",
+"`ijjllllca`cccccccccch`c`c`c`c`c`c`c`cahcccch`c`c`c`c`c`c`c`cahi",
+"`ijlllllcccccccccccclhc`c`c`c`c`c`c`c`ahccclhc`c`c`c`c`c`c`c`ahi",
+"`ijlalllcccccccccchhle`c`c`c`c`c`c`c`caechhle`c`c`c`c`c`c`c`caei",
+"`ijlllllcccccccchhhhlhc`c`c`c`c`c`c`c`ahlhhlhc`c`c`c`c`c`c`c`ahi",
+"`ijlllllccccccchhhhhlh`c`c`c`c`c`c`c`cahlhhlh`c`c`c`c`c`c`c`cahi",
+"`ijlalllcccccchhhhhhlha`c`c`c`c`c`c`c`ahlhhlha`c`c`c`c`c`c`c`ahi",
+"`ijlllllccccchlhhhhhllhc`c`c`c`c`c`c`chllhhllhc`c`c`c`c`c`c`ch`i",
+"`ijlllllccccchhhhhhlllhac`c`c`c`c`c`cahlhhlllhac`c`c`c`c`c`cah`i",
+"`ijlalllcccchhhhhhhllllhac`c`c`c`c`cchlhhhllllhac`c`c`c`c`cchj`i",
+"`ijlllllcccchhhhhhllllllhac`c`c`c`cahlhhhllllllhac`c`c`c`cahjj`i",
+"`ijlllllcccchhhhhllllllllhha`c`c`ahhlhhhllllllllhha`c`c`ahhjjj`i",
+"`ijlalllcccchlhhlllllllllaahhhehhhcllhhlllllllllaahhhehhhccjjj`i",
+"`ijlllllcccchhllllllllllaaaaaaaaacclhllllllllllaaaaaaaaacccjjj`i",
+"`ijlllllcccchlllllllllaaaaaaaaaaccchlllllllllaaaaaaaaaaccccfjj`i",
+"`ijlalllcccclllllllllaaaaaaaaaacccclllllllllaaaaaaaaaacccccfjj`i",
+"`ijlllllcccccllallllaaaaaaaaaaccccccllallllaaaaaaaaaaccccccfjj`i",
+"`ijlllllcccccllllllaaaaaaaaaaaccccccllllllaaaaaaaaaaaccccccfjj`i",
+"`ijlalllcccccclllllaaaaaaacaacccccccclllllaaaaaaacaacccccccfjj`i",
+"`ijlllllccccccclllaacaaaaaaacccccccccclllaacaaaaaaaccccccccfjj`i",
+"`ijlllllcccccccclaaaaaaaaaacccccccccccclaaaaaaaaaacccccccccfjj`i",
+"`ijlalllca`cccccccaaaaaaaccccccccccccccccaaaaaaacccccccccccfjj`i",
+"`ijlllllca`ccccccccccccccccccccccccccccccccccccccccccccca`cfjj`i",
+"`ijlllllcccccccccccc`c`c`ccccccccccccccccccccccccccccccca`cfjj`i",
+"`ijlalllccccccclllllllllllllllllllcccccccccccccccccccccccccfjj`i",
+"`ijlllllicccccclaaaaaaaaaaaaaaaaalccccccccccccccccccccccccifjf`i",
+"`ijllllaaaaaaaalaaaaaaaaaaaaaaaaalaacacacaaaaaaaaaaaaaaaaaafjj`i",
+"`ijlalaaaaaaaaalaaaaaaaaaaaaaaaaalaaaaaaaaaaaaaaaaaaaaaaaaffjj`i",
+"`ijllaaaaaaaaaalaaacccaaaaacccaaalccccccccccccccccccccaaafffjj`i",
+"`ijlaaaaaaaaaallaacaaaccaccaaacaalccccccccccccccccccccaaffffjj`i",
+"`ijaaaaaaaaaalalaacaaaaacaaaaacaalccccccccciccccccccccafffffjj`i",
+"`ijjfffffffflallaaiaaaaiacaaaacaalccccccccicccccccccccffffffjj`i",
+"`ijjjfffffffalalaaacaacaaacaacaaalccccccciccccccccccccffffffjj`i",
+"`ijjjjfffffflallaaacacaaeaacacaaalccccccicccccccccccccffffffjj`i",
+"`ijjjjjfffffalllaaaacaaeekaacaaaalccccciccccccccccccccffffffjj`i",
+"`ijjjjjjffffllllaaacacaakaacacaaalcccciiiiicccccccccccffffffjj`i",
+"`ijjjjjjjjjjlallaaacaacaaacaacaaalccciiiiiccccccccccccfjjjjjjj`i",
+"`ijjjjjjjjjjllllaacaaaacaiaaaaiaalccccccicccccccccccccfjjjjjjj`i",
+"`ijjjjjjjjjjlallaacaaaaacaaaaacaalcccccicccccaaaaaaacffjjjjjfj`i",
+"`ijjjjjfjjjjllllaacaaaccaccaaacaalcccciccccccaaaaaacfffjjjjjjj`i",
+"`ijjjjjjjjjjlallaaacccaaaaacccaaalcccicccccccccccccaaaallkklllll",
+"`ijjjgdjjjjjllllaaaaaaaaaaaaaaaaalcciccccccccaaaaaaaaaallkklllll",
+"`ijjjddjjjjjlallaaaaaaaaaaaaaaaaalcccccccccccaaaaaaaaaalllllllll",
+"`ijjfjjjjjjjllllacacacacacacacacaccccccccccccaaaaaaaaaalllllllll",
+"`ijfjjjjjjjjlalacacacacacacacacacccccccccccccaaaaaaaaaalllllllll",
+"`ijjjjjjjgdjlllccccccccccccccccccccccccccccccallllllllllllllllll",
+"`ijjjjjjjddjlalccccccccccccccccccccccccccccccalllllllllllllllj`i",
+"`ijjjjjjfjjjllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacalllllllllllllllj`i",
+"`ijjjjjfjjjjlaaacacacacaaaaaaaaaaaacacaacaacaalllllllllllllllj`i",
+"`ijjjjjgdjjjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaalllllllllllllllj`i",
+"`ijjjjjddjjjjfffffffffffffffffffffffffffffaaadglbblllllllllllj`i",
+"`ijjjjfjjjjjjjffffffffffffffffffffffffffffaaadglbblllllllllllj`i",
+"`ijjjfjjjjjjjjjfffffffffffffffffffffffffffaaaalllllllllllllllj`i",
+"`ijjjjjjjjjjjjjjffffffffffffffffffffffffffffffjjjjjjjjjjjjjjjj`i",
+"`ijjjjjjjjjfjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjlhlhjjj`i",
+"`ijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjfjjjjjjjjjjjjjjjjjjjjjhhlhfjjj`i",
+"`iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"````````````````````````````````````````````````````````````````"
+};
diff --git a/images/obj1-0.xpm b/images/obj1-0.xpm
new file mode 100644 (file)
index 0000000..5caa2ae
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char * obj1_0_xpm[] = {
+"32 32 7 1",
+"      c None",
+".     c #BFBFBFBFBFBF",
+"X     c #FFFFFFFFFFFF",
+"o     c #000000000000",
+"O     c #3F3F3F3F3F3F",
+"+     c #FFFF00000000",
+"@     c #7F7F7F7F7F7F",
+"                                ",
+"                                ",
+"                                ",
+"               ....             ",
+"              .XooOoo           ",
+"             .XXoXXXX.          ",
+"             ....XX+X.          ",
+"             ...OXXXX.          ",
+"             @.OOXXXX.          ",
+"             @.O.XXXX.          ",
+"             @...XXXX.          ",
+"             @..OXXXX.          ",
+"             ..OOXXXX.          ",
+"             ..O.XXXX.          ",
+"             ....XXXX.          ",
+"             ...OXXXX.          ",
+"             ..OOXXXX.          ",
+"             ..O.XXXX.          ",
+"             ....XXXX.          ",
+"             @..OXXXX.          ",
+"             @.OOXXXX.          ",
+"             @.O.XXXX.          ",
+"             @...XX+X.          ",
+"             ...oXXXX.          ",
+"             ..oooo@o           ",
+"             .@@oo@oo           ",
+"              @@@@@@            ",
+"              @@@@@             ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/images/obj1-1.xpm b/images/obj1-1.xpm
new file mode 100644 (file)
index 0000000..df6fee8
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char * obj1_1_xpm[] = {
+"32 32 7 1",
+"      c None",
+".     c #BFBFBFBFBFBF",
+"X     c #000000000000",
+"o     c #FFFFFFFFFFFF",
+"O     c #7F7F7F7F7F7F",
+"+     c #FFFF00000000",
+"@     c #3F3F3F3F3F3F",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"        ...................     ",
+"      XXoooooooooooooooooooX    ",
+"     .XOo+ooooooooooooooo+oX@   ",
+"    ..OXooooooooooooooooooo@@   ",
+"    ..XXoooooooooooooooooooX@   ",
+"    ..XXX..@@..@@..@@..@@.XX@   ",
+"    ...XOO@@OO@@OO@@OO@@OOOO@   ",
+"    ..OOOOOOOOOOOOOOOOOOOOO@    ",
+"      OO@@@@OOOOOOOO@@@@OO@     ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/images/obj1-2.xpm b/images/obj1-2.xpm
new file mode 100644 (file)
index 0000000..f11e691
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char * obj1_2_xpm[] = {
+"32 32 7 1",
+"      c None",
+".     c #BFBFBFBFBFBF",
+"X     c #FFFFFFFFFFFF",
+"o     c #000000000000",
+"O     c #3F3F3F3F3F3F",
+"+     c #FFFF00000000",
+"@     c #7F7F7F7F7F7F",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"        .....                   ",
+"       .XooXX.                  ",
+"      .XOOoX+X.                 ",
+"      .oooXXXXX.                ",
+"      ..oo.XXXXX.               ",
+"      @.@.@OXXXXX.              ",
+"       O.@OO.XXXXX.             ",
+"        O.O.@OXXXXX.            ",
+"         O.@OO.XXXXX.           ",
+"          O.O.@OXXXXX.          ",
+"           @.@OO.XXXXX.         ",
+"            @.O.@OXXXXX.        ",
+"             @.@OO.XXXXX.       ",
+"              @.O.@OXXX+X.      ",
+"               O.@OO.XXXXo      ",
+"                O.O.@OXXOo      ",
+"                 O.@.oooOo      ",
+"                  O.@.oooO      ",
+"                   @.@@@O       ",
+"                    OOOO        ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/images/obj1-3.xpm b/images/obj1-3.xpm
new file mode 100644 (file)
index 0000000..0a49af1
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char * obj1_3_xpm[] = {
+"32 32 7 1",
+"      c None",
+".     c #BFBFBFBFBFBF",
+"X     c #000000000000",
+"o     c #FFFFFFFFFFFF",
+"O     c #FFFF00000000",
+"+     c #7F7F7F7F7F7F",
+"@     c #3F3F3F3F3F3F",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                    ..X         ",
+"                   .oooXX       ",
+"                  .oOooXX+      ",
+"                 .oooooXX+      ",
+"                .ooooo+X++      ",
+"               .ooooo+++++      ",
+"              .ooooo+@++@       ",
+"             .ooooo++@+@        ",
+"            .ooooo+@++@         ",
+"           .ooooo++@+@          ",
+"          .ooooo+@+++           ",
+"         .ooooo++@++            ",
+"        .ooooo+@+++             ",
+"       XoOooo++@++              ",
+"      XXoooo+@++@               ",
+"     ..X+oo++@+@                ",
+"     ..+XXX+++@                 ",
+"     ...XX+++@                  ",
+"      ....+++                   ",
+"       ...+                     ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/images/obj1-4.xpm b/images/obj1-4.xpm
new file mode 100644 (file)
index 0000000..f931437
--- /dev/null
@@ -0,0 +1,36 @@
+/* XPM */
+static char * obj1_3_xpm[] = {
+"32 32 1 1",
+"      c None",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/images/obj2-0.xpm b/images/obj2-0.xpm
new file mode 100644 (file)
index 0000000..c860a6b
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char * obj2_0_xpm[] = {
+"32 32 10 1",
+"      c None",
+".     c #FFFF00000000",
+"X     c #7F7F7F7F7F7F",
+"o     c #BFBFBFBFBFBF",
+"O     c #000000000000",
+"+     c #3F3F3F3F3F3F",
+"@     c #00000000E6E6",
+"#     c #FFFFFFFFFFFF",
+"$     c #66666666E6E6",
+"%     c #FFFFFFFF0000",
+"             ......             ",
+"          ...      ...          ",
+"         .            .         ",
+"        .              .        ",
+"       .                .       ",
+"      .        XX        .      ",
+"     .        oOOX        .     ",
+"     .       XO+OO+       .     ",
+"    .      o oO@@O+ o      .    ",
+"    .      X oO+OO+ X      .    ",
+"    .      X+##ooXX+X      .    ",
+"    .      X ##++XX X      .    ",
+"    .      X ##++XX X      .    ",
+"    .      X X#ooX+ X      .    ",
+"    .      X+##ooXX+X      .    ",
+"     .     X ##ooXX X     .     ",
+"     .        #ooX        .     ",
+"     .        #ooX        .     ",
+"      .       $#o$       .      ",
+"       .       #o       .       ",
+"        .      #o      .        ",
+"         .     Xo     .         ",
+"          ...   o  ...          ",
+"             ......             ",
+"                o               ",
+"              % o               ",
+"              X oo              ",
+"              X oXo             ",
+"              %XoXo             ",
+"              X                 ",
+"              X                 ",
+"              %                 "};
diff --git a/images/obj2-1.xpm b/images/obj2-1.xpm
new file mode 100644 (file)
index 0000000..b524126
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char * obj2_1_xpm[] = {
+"32 32 10 1",
+"      c None",
+".     c #FFFF00000000",
+"X     c #BFBFBFBFBFBF",
+"o     c #3F3F3F3F3F3F",
+"O     c #7F7F7F7F7F7F",
+"+     c #FFFFFFFFFFFF",
+"@     c #000000000000",
+"#     c #00000000E6E6",
+"$     c #66666666E6E6",
+"%     c #FFFFFFFF0000",
+"                                ",
+"                                ",
+"               ......           ",
+"            ...      ...        ",
+"           .            .       ",
+"          .              .      ",
+"         .                .     ",
+"        .                  .    ",
+"       .                    .   ",
+"       .        X  ooo      .   ",
+"      .        O +o@@@o      .  ",
+"      .       Oo++@#@@o      .  ",
+"      .      O +++O@#@o      .  ",
+"      .     O O++ooO@@       .  ",
+"      .    O o++XooXOO       .  ",
+"      .      ++XXXXOO X      .  ",
+"      .     $+XXXOOOoO       .  ",
+"       .    +XXXOOo O       .   ",
+"       .    +XXOOo O        .   ",
+"       .   +XXO$  O         .   ",
+"        . +XX    O         .    ",
+"         .XX              .     ",
+"       % X.              .      ",
+"      O XX .            .       ",
+"     % XOX  ...      ...        ",
+"    O XOOX     ......           ",
+"   %   OOX                      ",
+"        X                       ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/images/obj2-2.xpm b/images/obj2-2.xpm
new file mode 100644 (file)
index 0000000..5a35956
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char * obj2_2_xpm[] = {
+"32 32 10 1",
+"      c None",
+".     c #FFFF00000000",
+"X     c #7F7F7F7F7F7F",
+"o     c #BFBFBFBFBFBF",
+"O     c #3F3F3F3F3F3F",
+"+     c #FFFFFFFF0000",
+"@     c #FFFFFFFFFFFF",
+"#     c #66666666E6E6",
+"$     c #000000000000",
+"%     c #00000000E6E6",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                 ......         ",
+"              ...      ...      ",
+"             .            .     ",
+"            .              .    ",
+"           .                .   ",
+"          .                  .  ",
+"         .                    . ",
+"         .      XXXXXXXo      . ",
+"        .        O   O         .",
+"+XX+XX+ .       @@X@@@XXX      .",
+"   X    .    #@@@@@@@@$$$X     .",
+"   ooooo.ooooooooooOOo$%$$X    .",
+"   XXo  .  ooooooooOOo$%$$X    .",
+"   oo   .    #XXXXXXXX$$$X     .",
+"        .       XXOXXXXXX      .",
+"         .       O   O        . ",
+"         .      XXXXXXXo      . ",
+"         .                    . ",
+"          .                  .  ",
+"           .                .   ",
+"            .              .    ",
+"             .            .     ",
+"              ...      ...      ",
+"                 ......         ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/images/obj2-3.xpm b/images/obj2-3.xpm
new file mode 100644 (file)
index 0000000..9cffdef
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char * obj2_3_xpm[] = {
+"32 32 10 1",
+"      c None",
+".     c #FFFFFFFF0000",
+"X     c #7F7F7F7F7F7F",
+"o     c #BFBFBFBFBFBF",
+"O     c #FFFF00000000",
+"+     c #FFFFFFFFFFFF",
+"@     c #66666666E6E6",
+"#     c #3F3F3F3F3F3F",
+"$     c #000000000000",
+"%     c #00000000E6E6",
+"                                ",
+"                                ",
+"                                ",
+"      .                         ",
+"       X                        ",
+"        .                       ",
+"       o X      OOOOOOO         ",
+"      XXo .  OOO       OO       ",
+"     oXXXo  O            O      ",
+"      oooooO              O     ",
+"          Oo+              O    ",
+"         O oo+    X         O   ",
+"        O   oo++@  X         O  ",
+"        O    ooo++# X        O  ",
+"        O    Xooo++X X       O  ",
+"       O     @Xooo+++#X       O ",
+"       O      XXooo+++ o      O ",
+"       O    X #XXo##+++       O ",
+"       O     X #Xo##X$#       O ",
+"       O      X XXoX$%$#      O ",
+"       O       X#XX$%$$#      O ",
+"        O       X X$$$$#     O  ",
+"        O        o  ###      O  ",
+"        O                    O  ",
+"         O                  O   ",
+"          O                O    ",
+"           O              O     ",
+"            O            O      ",
+"             OOO       OO       ",
+"                OOOOOOO         ",
+"                                ",
+"                                "};
diff --git a/images/obj2-4.xpm b/images/obj2-4.xpm
new file mode 100644 (file)
index 0000000..88108e3
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char * obj2_4_xpm[] = {
+"32 32 10 1",
+"      c None",
+".     c #FFFFFFFF0000",
+"X     c #7F7F7F7F7F7F",
+"o     c #BFBFBFBFBFBF",
+"O     c #FFFF00000000",
+"+     c #FFFFFFFFFFFF",
+"@     c #66666666E6E6",
+"#     c #3F3F3F3F3F3F",
+"$     c #000000000000",
+"%     c #00000000E6E6",
+"                   .            ",
+"                   X            ",
+"                   X            ",
+"               oXoX.            ",
+"               oXo X            ",
+"                oo X            ",
+"                 o .            ",
+"                 o              ",
+"               OOOOOO           ",
+"            OOO  o   OOO        ",
+"           O     oX     O       ",
+"          O      o+      O      ",
+"         O       o+       O     ",
+"        O       @o+@       O    ",
+"       O        Xoo+        O   ",
+"       O        Xoo+        O   ",
+"       O     X XXoo++ X     O   ",
+"      O      X#XXoo++#X      O  ",
+"      O      X #Xoo+X X      O  ",
+"      O      X XX##++ X      O  ",
+"      O      X XX##++ X      O  ",
+"      O      X#XXoo++#X      O  ",
+"      O      X #$$#$o X      O  ",
+"      O      o #$%%$o o      O  ",
+"       O       #$$#$X       O   ",
+"       O        X$$o        O   ",
+"        O        XX        O    ",
+"         O                O     ",
+"          O              O      ",
+"           O            O       ",
+"            OOO      OOO        ",
+"               OOOOOO           "};
diff --git a/images/obj2-5.xpm b/images/obj2-5.xpm
new file mode 100644 (file)
index 0000000..6447e8d
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char * obj2_5_xpm[] = {
+"32 32 10 1",
+"      c None",
+".     c #BFBFBFBFBFBF",
+"X     c #7F7F7F7F7F7F",
+"o     c #FFFFFFFF0000",
+"O     c #FFFF00000000",
+"+     c #FFFFFFFFFFFF",
+"@     c #66666666E6E6",
+"#     c #3F3F3F3F3F3F",
+"$     c #000000000000",
+"%     c #00000000E6E6",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                         .      ",
+"                        .XX   o ",
+"             OOOOOO     .XX. X  ",
+"          OOO      OOO  .X. o   ",
+"         O            O .. X    ",
+"        O              O. o     ",
+"       O              ..O       ",
+"      O         X    ..+ O      ",
+"     O         X  @X..+   O     ",
+"     O        X #XX..+    O     ",
+"     O       X #XX...+    O     ",
+"    O       X#XXX...+@     O    ",
+"    O      . XX....++      O    ",
+"    O       XX.##.++# X    O    ",
+"    O       $$X##++X X     O    ",
+"    O      #$%$X+++ X      O    ",
+"    O      #$$%$++#X       O    ",
+"    O      #$$$#+ X        O    ",
+"     O      ###  .        O     ",
+"     O                    O     ",
+"      O                  O      ",
+"       O                O       ",
+"        O              O        ",
+"         O            O         ",
+"          OOO      OOO          ",
+"             OOOOOO             ",
+"                                ",
+"                                "};
diff --git a/images/obj2-6.xpm b/images/obj2-6.xpm
new file mode 100644 (file)
index 0000000..2c90fce
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char * obj2_6_xpm[] = {
+"32 32 10 1",
+"      c None",
+".     c #FFFF00000000",
+"X     c #BFBFBFBFBFBF",
+"o     c #7F7F7F7F7F7F",
+"O     c #3F3F3F3F3F3F",
+"+     c #000000000000",
+"@     c #66666666E6E6",
+"#     c #00000000E6E6",
+"$     c #FFFFFFFFFFFF",
+"%     c #FFFFFFFF0000",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"         ......                 ",
+"      ...      ...              ",
+"     .            .             ",
+"    .              .            ",
+"   .                .           ",
+"  .                  .          ",
+" .                    .         ",
+" .      Xooooooo      .         ",
+" .        O   O       .         ",
+".      ooooooOoo       .        ",
+".     o+++oooooooo@    .   XX   ",
+".    o++#+XOOXXXXXXXX  .  Xoo   ",
+".    o++#+XOOXXXXXXXXXX.XXXXX   ",
+".     o+++$$$$$$$$@    .    o   ",
+".      ooo$$$o$$       . %oo%oo%",
+".         O   O        .        ",
+" .      Xooooooo      .         ",
+" .                    .         ",
+"  .                  .          ",
+"   .                .           ",
+"    .              .            ",
+"     .            .             ",
+"      ...      ...              ",
+"         ......                 ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/images/obj2-7.xpm b/images/obj2-7.xpm
new file mode 100644 (file)
index 0000000..2d54555
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char * obj2_7_xpm[] = {
+"32 32 10 1",
+"      c None",
+".     c #FFFF00000000",
+"X     c #3F3F3F3F3F3F",
+"o     c #BFBFBFBFBFBF",
+"O     c #000000000000",
+"+     c #7F7F7F7F7F7F",
+"@     c #00000000E6E6",
+"#     c #FFFFFFFFFFFF",
+"$     c #66666666E6E6",
+"%     c #FFFFFFFF0000",
+"                                ",
+"                                ",
+"             .......            ",
+"           ..       ...         ",
+"          .            .        ",
+"         .              .       ",
+"        .                .      ",
+"       .                  .     ",
+"      .                    .    ",
+"      .      XXX  o        .    ",
+"      .     XOOOO+ +       .    ",
+"     .      XOO@O++X+       .   ",
+"     .      XO@O+o++ +      .   ",
+"     .       XO+XXo+X +     .   ",
+"     .       ###XXo++X +    .   ",
+"     .      o ###ooo++      .   ",
+"     .       +X###ooo+$     .   ",
+"      .       + +##ooo+    .    ",
+"      .        + X##ooo    .    ",
+"      .         +  $##oo   .    ",
+"       .         +    #oo .     ",
+"        .              #o.      ",
+"         .              .ooooo  ",
+"          .            .  o+++o ",
+"           ..       ...  % o++  ",
+"             .......      + o   ",
+"                           %    ",
+"                            +   ",
+"                             %  ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/images/obj3-0.xpm b/images/obj3-0.xpm
new file mode 100644 (file)
index 0000000..044ecf0
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char * obj3_0_xpm[] = {
+"48 48 9 1",
+"      c None",
+".     c #3F3F3F3F3F3F",
+"X     c #FFFFFFFFFFFF",
+"o     c #BFBFBFBFBFBF",
+"O     c #000000000000",
+"+     c #7F7F7F7F7F7F",
+"@     c #66666666E6E6",
+"#     c #FFFF00000000",
+"$     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                       .                        ",
+"                      ...                       ",
+"                      XXo                       ",
+"                     oX...                      ",
+"                     o.Oo+                      ",
+"                     oXoo+                      ",
+"                     o@oo+                      ",
+"                     oOoo+                      ",
+"                     o@oo+                      ",
+"                     oOoo+                      ",
+"                     o@oo+                      ",
+"                     oOoo+                      ",
+"                     o@oo+                      ",
+"                     oOoo+                      ",
+"                     o@oo+                      ",
+"                     o@oo+                      ",
+"                    ..Ooo+.                     ",
+"                  .+oX@oo+o+.                   ",
+"                .+oXXXOoo+ooo+.                 ",
+"              .+oXXXXX@oo+ooooo+.               ",
+"            XXXXXXXXXXOoo+oXXXXXXXX             ",
+"          XXXXXXXXXXXX@oo+oXXXXXXXXXX           ",
+"        #XXXXXXXXXXXXXOoo+oXXXXXXXXXXX#         ",
+"        XXXXoXXXXXoXXX@oo+oXoXXXXoXXXXX         ",
+"        XXXXXXXXXXXXXXOoo+oXXXXXXXXXXXX         ",
+"        X+oooo+X+ooo+X@oo++ooo+X+oooo+X         ",
+"                     +Ooo+                      ",
+"                     +@oo+                      ",
+"                     +Ooo+                      ",
+"                     +@oo+                      ",
+"                     +Ooo+                      ",
+"                     +@oo+                      ",
+"                   Xo+Ooo+o                     ",
+"                   ##+@oo+#                     ",
+"                   Xo+@oo+o                     ",
+"                   Xo+Ooo+o                     ",
+"                   Xo+@oo+o                     ",
+"                      @oo                       ",
+"                      .oo                       ",
+"                      oo+o                      ",
+"                     oXXoooo                    ",
+"                   oXXXX+oXXoo                  ",
+"                  oXXXXXooXXXXo                 ",
+"                  XXXXXX+oXXXXo                 ",
+"                  o.+++.$.+++.o                 ",
+"                                                "};
diff --git a/images/obj3-1.xpm b/images/obj3-1.xpm
new file mode 100644 (file)
index 0000000..777e7ef
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char * obj3_1_xpm[] = {
+"48 48 9 1",
+"      c None",
+".     c #3F3F3F3F3F3F",
+"X     c #7F7F7F7F7F7F",
+"o     c #FFFFFFFFFFFF",
+"O     c #000000000000",
+"+     c #BFBFBFBFBFBF",
+"@     c #FFFF00000000",
+"#     c #66666666E6E6",
+"$     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                         ...    ",
+"                                       X.o..    ",
+"                                      XooOo.    ",
+"                                     Xoo+.X     ",
+"                                    Xoo+.+X     ",
+"                                   Xoo+++X      ",
+"               @o                 Xoo++#X       ",
+"              ooooo+             Xoo++OX        ",
+"             ooooooo+X.         Xoo++#X         ",
+"              Xooooooo+X..     Xoo++OX          ",
+"               +ooooooooo+X.. Xoo++#X           ",
+"                +oooooooooooXXoo++OX            ",
+"                 XooooooooooXoo++#X             ",
+"                  oooooooooXoo++OX              ",
+"                   XooooooXoo++#X               ",
+"                    +ooooXoo++OX+.              ",
+"                     +ooXoo++#X++.              ",
+"                      XXoo++OX++oX              ",
+"                      Xoo++#X++oo+.             ",
+"                     Xoo++OX++oooo.             ",
+"                    Xoo++#X++oooooX             ",
+"                 o Xoo++OXX+oooooo+.            ",
+"                @oXoo++#X  +oooooooX            ",
+"               ooXoo++#X    +oooooo+            ",
+"              ooXoo++#X      Xoooooo+           ",
+"              oXoo++oo        ooooooo           ",
+"     +++      Xoo++o@X         Xooooo           ",
+"    +ooo++   XXo++ooX           +ooooo          ",
+"     +oooo++++o.. oX             +ooo@          ",
+"      .ooooo++..                  Xoo           ",
+"       .oooXo+.                    o            ",
+"        .oXoo+                                  ",
+"         $oooo+                                 ",
+"          .ooo+                                 ",
+"           .ooo+                                ",
+"            .oo+                                ",
+"             +o+                                ",
+"              +                                 ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj3-10.xpm b/images/obj3-10.xpm
new file mode 100644 (file)
index 0000000..f5105c6
--- /dev/null
@@ -0,0 +1,58 @@
+/* XPM */
+static char * obj3_10_xpm[] = {
+"48 48 7 1",
+"      c None",
+".     c #FFFFFFFFFFFF",
+"X     c #FFFF00000000",
+"o     c #7F7F7F7F7F7F",
+"O     c #BFBFBFBFBFBF",
+"+     c #3F3F3F3F3F3F",
+"@     c #000000000000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                    ..X                         ",
+"                    o..                         ",
+"                    O..                         ",
+"                    O...                        ",
+"                    oO..+                       ",
+"                    ....o                       ",
+"         +OO        o...+                       ",
+"         o.O        OO..O+                      ",
+"         o.O        O....o                      ",
+"         +.OO@OOOOOOoOOOOO+OOOOOO+              ",
+"         oOoo....................+O+            ",
+"         +OO+O@O@@@O@@@@@O@@O@@@O@O+            ",
+"         o.O .oooooooOOOOO+OOOOOOO              ",
+"         +.O @OOO   oOOOOo+                     ",
+"         OO         OO..O+                      ",
+"                    O...o                       ",
+"                    o...+                       ",
+"                    o...+                       ",
+"                    OO..                        ",
+"                    O..                         ",
+"                    O..                         ",
+"                    o.X                         ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj3-2.xpm b/images/obj3-2.xpm
new file mode 100644 (file)
index 0000000..160a465
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char * obj3_2_xpm[] = {
+"48 48 9 1",
+"      c None",
+".     c #FFFFFFFFFFFF",
+"X     c #FFFF00000000",
+"o     c #7F7F7F7F7F7F",
+"O     c #BFBFBFBFBFBF",
+"+     c #3F3F3F3F3F3F",
+"@     c #FFFFFFFF0000",
+"#     c #000000000000",
+"$     c #66666666E6E6",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                    ...X                        ",
+"                    o...                        ",
+"                    O....                       ",
+"                    O....                       ",
+"                    O.....                      ",
+"                    O.O...                      ",
+"                    o.....+                     ",
+"                    ......o                     ",
+" OOO                o.....O+                    ",
+" +..O               O......o                    ",
+" o..O               O.O....O+                   ",
+" o...O              O.......o                   ",
+" o...O   OOOXO      o.......O+                  ",
+" +....O  OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO+     ",
+" @oOoOoO..................................+O+   ",
+" +OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#+O++  ",
+" o...OO+$$#$$#$#$#$#$#$#$#$#$#$$#$#$#$#$.+OO+   ",
+" o...O   oooooooooooOOOOOOOOO+OOOOOOOOOOOOO     ",
+" o..O    OOOXO      oOOOOOOOO+                  ",
+" +..O    ...X.      O.......o                   ",
+" OOO                O.O....O+                   ",
+"                    O......o                    ",
+"                    o.....O+                    ",
+"                    ......o                     ",
+"                    o.....+                     ",
+"                    O.....                      ",
+"                    O.O...                      ",
+"                    O....                       ",
+"                    O....                       ",
+"                    o...                        ",
+"                    ...X                        ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj3-3.xpm b/images/obj3-3.xpm
new file mode 100644 (file)
index 0000000..cf566e7
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char * obj3_3_xpm[] = {
+"48 48 9 1",
+"      c None",
+".     c #BFBFBFBFBFBF",
+"X     c #FFFFFFFFFFFF",
+"o     c #3F3F3F3F3F3F",
+"O     c #FFFFFFFF0000",
+"+     c #7F7F7F7F7F7F",
+"@     c #FFFF00000000",
+"#     c #66666666E6E6",
+"$     c #000000000000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                 .                              ",
+"                .X.                             ",
+"               oXX.                             ",
+"              oXXX.                             ",
+"             oXXX.                              ",
+"            OXXXX.                              ",
+"           oX+XX.                               ",
+"          oXXX+X.                               ",
+"         oXXXXX..                               ",
+"        .XXXX....+                  X           ",
+"       .XXX.. ooX++XX              +XX          ",
+"        ...    ooXX+XX            .XXX@         ",
+"                oXXX+X@          .XXXXX         ",
+"                 .XXX+XX        +XXXXX          ",
+"                XX.XXX+        .XXXXXX          ",
+"                +XX.XXX+      +XXXXXX.          ",
+"                 +@X.XXX+    .XXXXXX.           ",
+"                  +X#.XXX+  .XXXXXXX+           ",
+"                    +#.XXX++XXXXXXX.o           ",
+"                     +#.XXX+XXXXXXX+            ",
+"                      +$.XXX+XXXXXXo            ",
+"                       +#.XXX+XXXX.o            ",
+"                       ++$.XXX+XXX+             ",
+"                      .X.+#.XXX+XXo             ",
+"                     .XXX.+$.XXX++o             ",
+"                    +XXXXX.+#.XXX+              ",
+"                   .XXXXXXX.+$.XXX+             ",
+"                  +XXXXXXXXXX+#.XXX+            ",
+"                 .XXXXXXXXXXX.+$.XXX+           ",
+"                .XXXXXXXXX.+oo +#.XXX+          ",
+"               +XXXXXXX.+oo     +$.XXX+         ",
+"              XXXXXXX.+o         +#.XXX+        ",
+"               XXXXX.             +$.XXX+       ",
+"                @X                 +#.XXX+      ",
+"                                    +$.XXX+     ",
+"                                     +#.XXX+    ",
+"                                      +.oXXo    ",
+"                                       +.o$.o   ",
+"                                        ++.oo   ",
+"                                          ooo   ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj3-4.xpm b/images/obj3-4.xpm
new file mode 100644 (file)
index 0000000..30c9a22
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char * obj3_4_xpm[] = {
+"48 48 9 1",
+"      c None",
+".     c #BFBFBFBFBFBF",
+"X     c #3F3F3F3F3F3F",
+"o     c #7F7F7F7F7F7F",
+"O     c #FFFFFFFF0000",
+"+     c #FFFFFFFFFFFF",
+"@     c #66666666E6E6",
+"#     c #000000000000",
+"$     c #FFFF00000000",
+"                                                ",
+"                    .XoooXOXoooX.               ",
+"                    ++++++o.++++.               ",
+"                    .+++++..++++.               ",
+"                     .++++o.++..                ",
+"                       .++....                  ",
+"                        ..o.                    ",
+"                        X+.                     ",
+"                        @+.                     ",
+"                     +.o@+.o.                   ",
+"                     +.o#+.o.                   ",
+"                     +.o@+.o.                   ",
+"                     $$o@+.o$                   ",
+"                     +.o#+.o.                   ",
+"                       o@+.o                    ",
+"                       o#+.o                    ",
+"                       o@+.o                    ",
+"                       o#+.o                    ",
+"                       o@+.o                    ",
+"                       o#+.o                    ",
+"          +o....o+o...o+@+.oo...o+o....o+       ",
+"          ++++++++++++++#+.o.++++++++++++       ",
+"          ++++.+++++.+++@+.o.+.++++.+++++       ",
+"          $+++++++++++++#+.o.+++++++++++$       ",
+"            ++++++++++++@+.o.++++++++++         ",
+"              ++++++++++#+.o.++++++++           ",
+"                Xo.+++++@+.o.+++.oX             ",
+"                  Xo.+++#+.o.+.oX               ",
+"                    Xo.+@+.o.oX                 ",
+"                      XX#+.oX                   ",
+"                       .@+.o                    ",
+"                       .@+.o                    ",
+"                       .#+.o                    ",
+"                       .@+.o                    ",
+"                       .#+.o                    ",
+"                       .@+.o                    ",
+"                       .#+.o                    ",
+"                       .@+.o                    ",
+"                       .#+.o                    ",
+"                       .@+.o                    ",
+"                       .++.o                    ",
+"                       .X#.o                    ",
+"                       .+XXX                    ",
+"                        ++.                     ",
+"                        XXX                     ",
+"                         X                      ",
+"                                                ",
+"                                                "};
diff --git a/images/obj3-5.xpm b/images/obj3-5.xpm
new file mode 100644 (file)
index 0000000..7cac8bd
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char * obj3_5_xpm[] = {
+"48 48 9 1",
+"      c None",
+".     c #BFBFBFBFBFBF",
+"X     c #FFFFFFFFFFFF",
+"o     c #3F3F3F3F3F3F",
+"O     c #FFFFFFFF0000",
+"+     c #7F7F7F7F7F7F",
+"@     c #FFFF00000000",
+"#     c #66666666E6E6",
+"$     c #000000000000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                              .                 ",
+"                             .X.                ",
+"                             .XXo               ",
+"                             .XXXo              ",
+"                              .XXXo             ",
+"                              .XXXXO            ",
+"                               .XX+Xo           ",
+"                               .X+XXXo          ",
+"                               ..XXXXXo         ",
+"           X                  +....XXXX.        ",
+"          XX+              XX++Xoo ..XXX.       ",
+"         @XXX.            XX+XXoo    ...        ",
+"         XXXXX.          @X+XXXo                ",
+"          XXXXX+        XX+XXX.                 ",
+"          XXXXXXX        +XXX.XX                ",
+"          .XXXXXX+      +XXX.XX+                ",
+"           .XXXXXX.    +XXX.X@+                 ",
+"           +XXXXXXX.  +XXX.#X+                  ",
+"           o.XXXXXXX++XXX.#+                    ",
+"            +XXXXXXX+XXX.#+                     ",
+"            oXXXXXX+XXX.$+                      ",
+"            o.XXXX+XXX.#+                       ",
+"             +XXX+XXX.$++                       ",
+"             oXX+XXX.#+...                      ",
+"             o++XXX.$+...X.                     ",
+"              +XXX.#+...XXX+                    ",
+"             +XXX.$+...XXXXXX                   ",
+"            +XXX.#+...XXXXXXX+                  ",
+"           +XXX.$+...XXXXXXXXX.                 ",
+"          +XXX.#+ oo+.XXXXXXXXX.                ",
+"         +XXX.$+     oo+.XXXXXXX+               ",
+"        +XXX.#+         o+.XXXXXXX              ",
+"       +XXX.$+             .XXXXX               ",
+"      +XXX.#+                 X@                ",
+"     +XXX.$+                                    ",
+"    +XXX.#+                                     ",
+"    oXXo.+                                      ",
+"   oX$o.+                                       ",
+"   ooX++                                        ",
+"   ooo                                          ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj3-6.xpm b/images/obj3-6.xpm
new file mode 100644 (file)
index 0000000..a5dab9d
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char * obj3_6_xpm[] = {
+"48 48 9 1",
+"      c None",
+".     c #FFFF00000000",
+"X     c #FFFFFFFFFFFF",
+"o     c #7F7F7F7F7F7F",
+"O     c #BFBFBFBFBFBF",
+"+     c #3F3F3F3F3F3F",
+"@     c #FFFFFFFF0000",
+"#     c #000000000000",
+"$     c #66666666E6E6",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                         .XXX                   ",
+"                         XXXo                   ",
+"                        XXXXO                   ",
+"                        XXXXO                   ",
+"                       OXXXXO                   ",
+"                       XXXOXO                   ",
+"                      +XXXXXo                   ",
+"                      oXXXXXX                   ",
+"                     +OXXXXXo                OOO",
+"                     oXXXXXXO               OXX+",
+"                    +OXXXXOXO               OXXo",
+"                    oXXXXXXXO              OXXXo",
+"                   +OXXXXXXXo      O.OOO   OXXXo",
+"      +OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO  OXXXX+",
+"    +O+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOoOoOo@",
+"   ++X+#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOOOOOO+",
+"    +XX+X$#$#$#$#$$#$#$#$#$#$#$#$#$#$$#$$+OOXXXo",
+"      OOOOOOOOOOOOO+OOOOOOOOOooooooooooo   OXXXo",
+"                   +OOOOOOOOo      O.OOO    XXXo",
+"                    oXXXXXXXO      X.XXX    OXX+",
+"                    +OXXXXOXO                OXO",
+"                     oXXXXXXO                   ",
+"                     +OXXXXXo                   ",
+"                      oXXXXXX                   ",
+"                      +XXXXXo                   ",
+"                       XXXXXO                   ",
+"                       OXXOXO                   ",
+"                        XXXXO                   ",
+"                        XXXXO                   ",
+"                         XXXo                   ",
+"                         .XXX                   ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj3-7.xpm b/images/obj3-7.xpm
new file mode 100644 (file)
index 0000000..631debd
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char * obj3_7_xpm[] = {
+"48 48 9 1",
+"      c None",
+".     c #3F3F3F3F3F3F",
+"X     c #FFFFFFFFFFFF",
+"o     c #7F7F7F7F7F7F",
+"O     c #000000000000",
+"+     c #BFBFBFBFBFBF",
+"@     c #66666666E6E6",
+"#     c #FFFF00000000",
+"$     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"     ...                                        ",
+"     ..X.o                                      ",
+"     .XOXXo                                     ",
+"      o.XXXo                                    ",
+"      o+.XXXo                                   ",
+"       o++XXXo                                  ",
+"        o@+XXXo                 X#              ",
+"         oO+XXXo             +XXXXX             ",
+"          o@+XXXo         .o+XXXXXXX            ",
+"           oO+XXXo     ..o+XXXXXXXo             ",
+"            o@+XXXo ..o+XXXXXXXXX+              ",
+"             oO+XXXooXXXXXXXXXXX+               ",
+"              o@+XXXoXXXXXXXXXXo                ",
+"               oO+XXXoXXXXXXXXX                 ",
+"                o@+XXXoXXXXXXo                  ",
+"               .+oO+XXXoXXXX+                   ",
+"               .X+o@+XXXoXX+                    ",
+"               oXX+oO+XXXoo                     ",
+"              .+XXX+o@+XXXo                     ",
+"              .XXXXX+oO+XXXo                    ",
+"              oXXXXXX+o@+XXXo                   ",
+"             .+XXXXXXXooO+XXXo X                ",
+"             oXXXXXXX+  o@+XXXoX#               ",
+"             +XXXXXX+    o@+XXXoXX              ",
+"            +XXXXXXo      o@+XXXoXX             ",
+"            XXXXXXX        XX+XXXoX             ",
+"            XXXXXo         o#X+XXXo      +++    ",
+"           XXXXX+           oXX+XXoo   ++XXX+   ",
+"           #XXX+             oX .XX++++XXXX+    ",
+"            XXo                  ..++XXXXX.     ",
+"             X                    .+XoXXX.      ",
+"                                   +XXoX.       ",
+"                                  +XXXX$        ",
+"                                  +XXX.         ",
+"                                 +XXX.          ",
+"                                 +XX.           ",
+"                                 +X+            ",
+"                                  +             ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj3-8.xpm b/images/obj3-8.xpm
new file mode 100644 (file)
index 0000000..c52be87
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char * obj3_8_xpm[] = {
+"48 48 9 1",
+"      c None",
+".     c #FFFFFFFFFFFF",
+"X     c #FFFF00000000",
+"o     c #7F7F7F7F7F7F",
+"O     c #BFBFBFBFBFBF",
+"+     c #3F3F3F3F3F3F",
+"@     c #000000000000",
+"#     c #FFFFFFFF0000",
+"$     c #66666666E6E6",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                   ...X                         ",
+"                   o...                         ",
+"                   O....                        ",
+"                   O....                        ",
+"                   O.....                       ",
+"                   O.O...                       ",
+"                   o.....+                      ",
+"  OOO              o.....o                      ",
+"  +..O             O......o                     ",
+"  o..O             O.O....O                     ",
+"  o...O            O.......o                    ",
+"  o...O @OOOXO     o.......+                    ",
+"  +....O@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO+        ",
+"  #oOoOo...............................+O+      ",
+"  +OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@+O++     ",
+"  o...O+$$@$$@$@$@@$@$@$@$@@$$@$@$@$@$+OO+      ",
+"  o...O .ooooooooooOOOOOOOO+OOOOOOOOOOOO        ",
+"  o..O  @OOOXO     oOOOOOOO+                    ",
+"  +..O  @...X      O.......o                    ",
+"  OOO              O.O....O                     ",
+"                   O......o                     ",
+"                   o.....O                      ",
+"                   o.....+                      ",
+"                   O.....                       ",
+"                   O.O...                       ",
+"                   O....                        ",
+"                   O....                        ",
+"                   o...                         ",
+"                   ...X                         ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj3-9.xpm b/images/obj3-9.xpm
new file mode 100644 (file)
index 0000000..87f3c40
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char * obj3_9_xpm[] = {
+"48 48 9 1",
+"      c None",
+".     c #FFFFFFFFFFFF",
+"X     c #FFFF00000000",
+"o     c #7F7F7F7F7F7F",
+"O     c #BFBFBFBFBFBF",
+"+     c #3F3F3F3F3F3F",
+"@     c #000000000000",
+"#     c #FFFFFFFF0000",
+"$     c #66666666E6E6",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                       ..X                      ",
+"                       o..                      ",
+"                       O..                      ",
+"                       O...                     ",
+"                       OO..                     ",
+"                       o...+                    ",
+"                       ....o                    ",
+"       OOO             o...O+                   ",
+"       +.O             O....o                   ",
+"       o.O             OO...O+                  ",
+"       o..O  @OOXO     o.....o+                 ",
+"       +...O @OOOOOOOOOOOOOOOOOOOOOOOOOOO+      ",
+"       #ooOoO............................++     ",
+"       +OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@+++    ",
+"       o..OO+$@$$@@$@$@@$@$@@$@$@$@$@@$.+O+     ",
+"       o..O  ooooooooooOOOOOOO+OOOOOOOOOOO      ",
+"       o.O   @OOXO     oOOOOOO+                 ",
+"       +OO   @..X      OO...O+                  ",
+"                       O....o                   ",
+"                       o...O+                   ",
+"                       ....o                    ",
+"                       o...+                    ",
+"                       O...                     ",
+"                       OO..                     ",
+"                       O..                      ",
+"                       o..                      ",
+"                       ..X                      ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj4-0.xpm b/images/obj4-0.xpm
new file mode 100644 (file)
index 0000000..e704d06
--- /dev/null
@@ -0,0 +1,61 @@
+/* XPM */
+static char * obj4_0_xpm[] = {
+"48 48 10 1",
+"      c None",
+".     c #000000000000",
+"X     c #CCCC7F7F6666",
+"o     c #3F3F3F3F3F3F",
+"O     c #FFFF00000000",
+"+     c #00000000E6E6",
+"@     c #BFBFBFBFBFBF",
+"#     c #7F7F7F7F7F7F",
+"$     c #FFFFFFFFFFFF",
+"%     c #FFFF7F7F0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                         ..                     ",
+"                        .XX.                    ",
+"                       .oXXo                    ",
+"                      O.XoXX.                   ",
+"                      ..XXXX.                   ",
+"                     O.oXXXXo                   ",
+"                     ..XoXXoX.                  ",
+"                    O..XXXXXX.                  ",
+"                    O..XXXXXX. +                ",
+"                    O..XXXXXX.                  ",
+"                    O..@@@@@@@ +                ",
+"                  + O..o@@@@@@@  +              ",
+"                    O.#.o######                 ",
+"                  + O...o#$##$#  +              ",
+"                +   O...o##.###                 ",
+"                    O.#.o#...##   +             ",
+"                    O...o.....#     +           ",
+"                +   O...o....%.                 ",
+"                    O.#.oo..%...  +             ",
+"               +    O...o#..%.o.                ",
+"                +   O...o##.%.o.    +           ",
+"                    O.#.o###....                ",
+"              +     O...o##.#..      +          ",
+"                    O...o#...##         +       ",
+"             + +    O.#.o.....#                 ",
+"                    O...o....%.                 ",
+"                    O...oo..%...     +          ",
+"             +      O.#.o#..%.o.        +       ",
+"                    O...o##.%.o.                ",
+"                    O...o###....                ",
+"               +    O...o####..                 ",
+"                    O..oo######          +      ",
+"          +         O..o@@@@@@@       +         ",
+"                    O..@@@@@@@.                 ",
+"           +        O..XXXXXXX.                 ",
+"                    O..XXXXXXX.         +       ",
+"                     ..XXXXXXX.                 ",
+"                     O.oXXXXXo                  ",
+"        + +           ..XXXXX.            +     ",
+"                        .....          +        ",
+"                     +                          ",
+"     ++            +   +    +                   ",
+"                       +       +                ",
+"                                                "};
diff --git a/images/obj4-1.xpm b/images/obj4-1.xpm
new file mode 100644 (file)
index 0000000..49accd7
--- /dev/null
@@ -0,0 +1,61 @@
+/* XPM */
+static char * obj4_1_xpm[] = {
+"48 48 10 1",
+"      c None",
+".     c #000000000000",
+"X     c #3F3F3F3F3F3F",
+"o     c #CCCC7F7F6666",
+"O     c #00000000E6E6",
+"+     c #BFBFBFBFBFBF",
+"@     c #7F7F7F7F7F7F",
+"#     c #FFFF00000000",
+"$     c #FFFFFFFFFFFF",
+"%     c #FFFF7F7F0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                        ..      ",
+"                                      .Xoo.     ",
+"                                    .Xoooo.     ",
+"                                O .XoooXoo.     ",
+"                             O   .ooXooooX.     ",
+"                          O     .oooooooo..     ",
+"                               ++oooooXoX..     ",
+"                         O O  @+@+oooooo..#     ",
+"                   O         @@@+@+oooo...      ",
+"                     O      @@$@@+@+oo...#      ",
+"                         ....@@@@@++o....       ",
+"               O  O     ..X.%.@@$@XX....#       ",
+"                        .X..%..@@XX.@..#O       ",
+"          O  O          ...%..X@XX....#         ",
+"                       @X.%..X@XX.@..#  O       ",
+"      O               @@@X..X@XX....# O         ",
+"         O         ....@@@XX@XX.@..#            ",
+"                  ..X.%.@@@@XX....#             ",
+"    O             .X..%..@@XX.@..#   O          ",
+"                  ...%..X@XX....#               ",
+"                 @X.%..X@XX.@..#     O          ",
+"                +@@X..X@XX....#    O            ",
+"               .@+@@XX@XX.@..#   O              ",
+"              .@+@+@@@XX....#                   ",
+"              .oo+@+@XX.@..#      O             ",
+"             XXooo+@@.....#    O                ",
+"             .ooooo+@....#                      ",
+"             .oooooo....#        O              ",
+"             .Xooooo...#      O                 ",
+"            O .XoooX..#                         ",
+"               .....#       O O                 ",
+"        O  O                                    ",
+"               O O            O                 ",
+"                            O                   ",
+"                                                ",
+"     O        O                                 ",
+"                O          O                    ",
+"                         O                      ",
+"            O                                   ",
+"                                                ",
+"                        O                       ",
+"                                                ",
+"                                                "};
diff --git a/images/obj4-2.xpm b/images/obj4-2.xpm
new file mode 100644 (file)
index 0000000..15f7cd3
--- /dev/null
@@ -0,0 +1,61 @@
+/* XPM */
+static char * obj4_2_xpm[] = {
+"48 48 10 1",
+"      c None",
+".     c #00000000E6E6",
+"X     c #000000000000",
+"o     c #BFBFBFBFBFBF",
+"O     c #7F7F7F7F7F7F",
+"+     c #3F3F3F3F3F3F",
+"@     c #CCCC7F7F6666",
+"#     c #FFFF7F7F0000",
+"$     c #FFFFFFFFFFFF",
+"%     c #FFFF00000000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"   .        .                                   ",
+"         .                                      ",
+"       .   .                                    ",
+"                  .                             ",
+"                .                               ",
+"            .        .                          ",
+"                 .                              ",
+"                    .  .                        ",
+"                           . .                  ",
+"                        .                       ",
+"                             . .  .             ",
+"   .                             .              ",
+"      .          XXXX    XXXX        .          ",
+"      .   XXXooO+X++X+OO+X++X+OOOOO             ",
+"        X+@@@ooOXXXXX#+OXXXXX#+OO$OoXXXXX       ",
+"   .   X@@@@@ooOOX###XX+OX###XX+OOOoo@@@@+XX    ",
+"     . X@@@@@ooOOOXXXXXX+OXXXXXX+OOoo@@@+@@@+X  ",
+"       X@@@@@ooOOOOXXXX+OOOXXXX+OOOoo@@@@@@+@@X ",
+"       X@@@@@ooOOOOO+++OOOOO+++OO$Ooo@@@@@@@@@X ",
+"       X@@@@@ooOOOOOOOOOOOOOOOOOOOOoo@@@+@@@+X  ",
+"        X+@@@oXXXXXXXXXXXXXXXXXXXXXoo@@@@+XXX   ",
+"        XXXXXXXXOXXOXXOXXOXXOXXOXXXXXXXXXXXX    ",
+"         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX      ",
+"      .    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%        ",
+"    .                                           ",
+"       .                          . .           ",
+"                          .    .                ",
+"      .                .                        ",
+"             .   .          .                   ",
+"                    .  .                        ",
+"          .                                     ",
+"               .                                ",
+"                                                ",
+"            .                                   ",
+"        .                                       ",
+"    .                                           ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj4-3.xpm b/images/obj4-3.xpm
new file mode 100644 (file)
index 0000000..917f862
--- /dev/null
@@ -0,0 +1,61 @@
+/* XPM */
+static char * obj4_3_xpm[] = {
+"48 48 10 1",
+"      c None",
+".     c #00000000E6E6",
+"X     c #000000000000",
+"o     c #CCCC7F7F6666",
+"O     c #3F3F3F3F3F3F",
+"+     c #BFBFBFBFBFBF",
+"@     c #7F7F7F7F7F7F",
+"#     c #FFFF7F7F0000",
+"$     c #FFFF00000000",
+"%     c #FFFFFFFFFFFF",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                          .                     ",
+"           .                 .                  ",
+"                                                ",
+"                                                ",
+"             .               .  .               ",
+"              .                                 ",
+"                 XXXX                           ",
+"       .        XoooOXX       .                 ",
+"          .    Xoooooo++         .              ",
+"            . Xoooooo+@+@                       ",
+"              XOoooo+@+@@@                      ",
+"              XXooo+@+@@@XXX    .               ",
+"              XXoo+@+@@@XXOXX      .            ",
+"              XXX@@@@@@@XXXOX                   ",
+"               XXXOOO@@@#XXXX                   ",
+"               $XXXOXO@@X#XX$@       .          ",
+"                $XXXXXO@OX##X@XXX               ",
+"                 $XX@XXO@OXXXXXOXX              ",
+"    .             $XXXXXO@OXXXXXOX    .         ",
+"        .          $XX@XXO@@@#XXXX              ",
+"     .              $XXXXXO@@X#XX$@    .        ",
+"          .          $XX@XXO@OX##X@@            ",
+"              .       $XXXXXO@OXXX@@@    .      ",
+"                       $XX@XXO@OXX@@%@          ",
+"            .           $XXXXXO@@@@@@@+ .       ",
+"                         $XX@XXO@@%@@++         ",
+"               .  .       $XXXXXO@@@+@+X  .     ",
+"                           $XX@XXO@+@+ooX       ",
+"                     .      $XXXXX+@+ooooX      ",
+"                             $XX@X++oooooO      ",
+"                     .        $XXX+oooooOoX     ",
+"                        .      $XXXoooooooX     ",
+"                           .    $XXXooOoooO     ",
+"                                 $XXXooooOoX    ",
+"                             . .  $XXXOooooX    ",
+"                                 .  $XXXOooX    ",
+"                                      $XXXX     ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj4-4.xpm b/images/obj4-4.xpm
new file mode 100644 (file)
index 0000000..287e1a8
--- /dev/null
@@ -0,0 +1,61 @@
+/* XPM */
+static char * obj4_4_xpm[] = {
+"48 48 10 1",
+"      c None",
+".     c #00000000E6E6",
+"X     c #000000000000",
+"o     c #CCCC7F7F6666",
+"O     c #FFFF00000000",
+"+     c #3F3F3F3F3F3F",
+"@     c #BFBFBFBFBFBF",
+"#     c #7F7F7F7F7F7F",
+"$     c #FFFF7F7F0000",
+"%     c #FFFFFFFFFFFF",
+"                                                ",
+"                                                ",
+"                                                ",
+"       .                                        ",
+"                     .        .       .         ",
+"                                                ",
+"                      .      .               .  ",
+"      .                 XXXXX                   ",
+"                      XXoooooX                  ",
+"          .          OX+ooooo+             .    ",
+"      .              XXoooooooX        .        ",
+"                    OXXoooooooX                 ",
+"                    OXXoooooooX                 ",
+"                    OXX@@@@@@@X          .      ",
+"        .  .        OXX+@@@@@@@                 ",
+"                    OXX++######       .         ",
+"                    OXXX+####XX                 ",
+"                    OXXX+###XXXX                ",
+"          .  .      OXXX+##X$X+X                ",
+"                    OX#X+#XX$X+X   .  .         ",
+"            . .     OXXX++XX$XXX                ",
+"                    OXXX+XXXX$X                 ",
+"                    OX#X+XXXXX#      .          ",
+"              .     OXXX+#XXX##   .             ",
+"                    OXXX+##X#XX                 ",
+"             .      OX#X+###XXXX                ",
+"                    OXXX+##X$X+X   .            ",
+"                .   OXXX+#XX$X+X                ",
+"                    OX#X++XX$XXX                ",
+"                  . OXXX+XXXX$X    .            ",
+"               .    OXXX+XXXXX#                 ",
+"                    OX#X+#XXX##  .              ",
+"                 .  OXXX+##X###                 ",
+"                    OXXX+#%##%#   .             ",
+"                  . OX#X+######                 ",
+"                    OXX+@@@@@@@  .              ",
+"                    OXX@@@@@@@                  ",
+"                   .OXXooooooX                  ",
+"                    OXXooooooX  .               ",
+"                    OXXooooooX                  ",
+"                    .XXo+oo+oX                  ",
+"                     OX+oooo+                   ",
+"                      XXooooX                   ",
+"                      OXoo+oX                   ",
+"                       X+oo+                    ",
+"                        XooX                    ",
+"                         XX                     ",
+"                                                "};
diff --git a/images/obj4-5.xpm b/images/obj4-5.xpm
new file mode 100644 (file)
index 0000000..536a1e9
--- /dev/null
@@ -0,0 +1,61 @@
+/* XPM */
+static char * obj4_5_xpm[] = {
+"48 48 10 1",
+"      c None",
+".     c #00000000E6E6",
+"X     c #000000000000",
+"o     c #3F3F3F3F3F3F",
+"O     c #CCCC7F7F6666",
+"+     c #BFBFBFBFBFBF",
+"@     c #7F7F7F7F7F7F",
+"#     c #FFFF7F7F0000",
+"$     c #FFFF00000000",
+"%     c #FFFFFFFFFFFF",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                       .        ",
+"                        .                       ",
+"                                                ",
+"                        .                       ",
+"                    .                .          ",
+"                                                ",
+"                                                ",
+"                 .    .           .             ",
+"                                           .    ",
+"                   .         XXXX      .        ",
+"                           oXOOOOX              ",
+"                 .        ++OOOOOOX .           ",
+"                         @+@+OOOOOOX            ",
+"                  .     @@@+@+OOOOOX            ",
+"               .      XXX@@@+@+OOOXX            ",
+"                     XXoXX@@@+@+OXXX       .   .",
+"                     XoXX#@@@@++XXX$            ",
+"               .     XXX#X@@@oooXXX             ",
+"            .       @X##XX@@oXXXXX$             ",
+"                 XXX@XXXXo@oXXXXX$          .   ",
+"             .  XXoXXXXXo@oXX@XX$               ",
+"                XoXX#XXo@oXXXXX$        .       ",
+"           .    XXX#X@@@oXX@XX$                 ",
+"               @X##XX@@oXXXXX$       .          ",
+"           .  @@XXXXo@oXX@XX$          .        ",
+"             @@@XXXo@oXXXXX$     .              ",
+"          . @@%@XXo@oXX@XX$                     ",
+"            +@@@@@@oXXXXX$     .   .            ",
+"         . X@+@@%@oXX@XX$  .                    ",
+"          XO+@+@@oXXXXX$      .                 ",
+"         XOOO+@+oXX@XX$     .                   ",
+"        XOOOOO++oXXXX$ .                        ",
+"        oOOOOOO+o@XX$    .                      ",
+"       XOoOOOOOOoXX$                            ",
+"       XOOOOOOOXXX$   .                         ",
+"       oOOOoOOXXX$   .                          ",
+"      XOoOOOOXXX$ .                             ",
+"      XOOOOoXXX$                                ",
+"      XOOoXXX$ . .                              ",
+"       XXXX$                                    ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj4-6.xpm b/images/obj4-6.xpm
new file mode 100644 (file)
index 0000000..cae6d4a
--- /dev/null
@@ -0,0 +1,61 @@
+/* XPM */
+static char * obj4_6_xpm[] = {
+"48 48 10 1",
+"      c None",
+".     c #00000000E6E6",
+"X     c #000000000000",
+"o     c #7F7F7F7F7F7F",
+"O     c #3F3F3F3F3F3F",
+"+     c #BFBFBFBFBFBF",
+"@     c #FFFFFFFFFFFF",
+"#     c #FFFF7F7F0000",
+"$     c #CCCC7F7F6666",
+"%     c #FFFF00000000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                           .    ",
+"                                                ",
+"                                                ",
+"                                   .    .       ",
+"                                          .     ",
+"                              .      .          ",
+"                         .                      ",
+"                                 .              ",
+"                         .  .                   ",
+"                    .                           ",
+"                . .   .                         ",
+"                                                ",
+"              . .                               ",
+"            .        XXXX    XXXX              .",
+"               oooooXXOOXXooXXOOXXo+XXXX     .  ",
+"         XXXXO+o@ooX#XXXXXoX#XXXXXo++$$$OX .    ",
+"      XXO$$$$++oooXXX###XoXXX###Xoo++$$$$$X     ",
+"    XO$$$O$$$++ooXXXXXXXoXXXXXXXooo++$$$$$X     ",
+"   X$$O$$$$$$++oooXXXXXoooXXXXXoooo++$$$$$X     ",
+"   X$$$$$$$$$++o@ooXXOoooooXXOooooo++$$$$$X     ",
+"    XO$$$O$$$++oooooooooooooooooooo++$$$$$X     ",
+"     XXXO$$$$+OXXXXXXXXXXXXXXXXXXXX++$$$OX      ",
+"      %XXXXXXXXoXXoXXoXXoXXoXXoXXXXXXXXXXX .    ",
+"        %XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%     . ",
+"          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%         ",
+"            .                                   ",
+"                 .                              ",
+"               .     .  .                       ",
+"                                                ",
+"                    .     .   .        .        ",
+"                                 .              ",
+"                            .       .           ",
+"                                        .   .   ",
+"                                .               ",
+"                                         .    . ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj4-7.xpm b/images/obj4-7.xpm
new file mode 100644 (file)
index 0000000..6c5dfee
--- /dev/null
@@ -0,0 +1,61 @@
+/* XPM */
+static char * obj4_7_xpm[] = {
+"48 48 10 1",
+"      c None",
+".     c #000000000000",
+"X     c #CCCC7F7F6666",
+"o     c #00000000E6E6",
+"O     c #3F3F3F3F3F3F",
+"+     c #BFBFBFBFBFBF",
+"@     c #FFFF00000000",
+"#     c #7F7F7F7F7F7F",
+"$     c #FFFFFFFFFFFF",
+"%     c #FFFF7F7F0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"        ..                                      ",
+"       .XX..                                    ",
+"       .XXXX..   o                              ",
+"       .XXOXXX..     o                          ",
+"       .OXXXXOXX.  o                            ",
+"       ..XXXXXXXX.    o  o   o                  ",
+"       ..OXOXXXX+++               o             ",
+"       @..XXXXX+#+##       o                    ",
+"        ...XXX+#+##$#         o o  o  o         ",
+"        @...X+#+######                          ",
+"         ....++##$###O...          o        o   ",
+"        o@.....O####.%.O..                o     ",
+"          @..#..O##..%..O.            o         ",
+"        o  @.....O#O..%...               o      ",
+"            @..#..O#O..%.##                 o   ",
+"         o   @.....O#O.O####                    ",
+"              @..#..O#O####....                 ",
+"         o     @.....O####.%.O..                ",
+"           o    @..#..O##..%..O.                ",
+"                 @.....O#O..%...                ",
+"          o       @..#..O#O..%.##               ",
+"            o      @.....O#O..###+              ",
+"                    @..#..O#O###+#.             ",
+"           o o       @.....O###+#+X.            ",
+"                      @..#..O#+#+XX.            ",
+"                       @.....O#+XXXOO           ",
+"            o o         @....O+XXXXX.           ",
+"                         @....XXXXXX.           ",
+"                          @...XXXXXX.           ",
+"             o  o          @..OXXXX.  o         ",
+"                             @.....     o       ",
+"                                 o              ",
+"                o o                        o    ",
+"                                  o             ",
+"                                                ",
+"                o                               ",
+"                   o                o           ",
+"                                                ",
+"                  o                             ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj5-0.xpm b/images/obj5-0.xpm
new file mode 100644 (file)
index 0000000..1cbf74a
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char * obj5_0_xpm[] = {
+"48 48 6 1",
+"      c None",
+".     c #FFFF7F7F0000",
+"X     c #FFFF00000000",
+"o     c #FFFFFFFFFFFF",
+"O     c #FFFFFFFF0000",
+"+     c #000000000000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                      ....X     ",
+"                             o..    .O.....X    ",
+"                            o....  .OO...OX.    ",
+"                            ....  .o....OO.X    ",
+"                           ..... .o....XX.X.    ",
+"                           ....+......XX.X.     ",
+"                          ......o.......X.      ",
+"                         .o....o.......XX       ",
+"                         ..o..o.......XX        ",
+"                         ............XX         ",
+"                         ....o......X.X         ",
+"                            .........X.         ",
+"                           .........X.X         ",
+"                     o.   .........X.X.X        ",
+"                    o... .........X.X.X.        ",
+"                   ...o..o.........X.X.X        ",
+"                  ...o..o.........X.X.X.        ",
+"                  ..o............X.XXX.X        ",
+"                 ...............X.XXXXX.X.      ",
+"                 .....o........X.XX  XXX.X      ",
+"                 ...............XX   XXXX       ",
+"                  ...o.........XXX   XXX        ",
+"                   ............X.X   XX         ",
+"                   ...........X.XX              ",
+"     .             .o.....X..X.X.               ",
+"     .             .........X.X.X               ",
+"     ..           .........X.X.XX               ",
+"     ...         ........XXXX.X.X               ",
+"     ...         .o.....XX XXX.X                ",
+"      ...       .o.....XX  XX.XX                ",
+"      ....     .......XX   XXXX                 ",
+"       ....   .o.....XX   XXXXXXX               ",
+"       X...........XXX   XXXXXXXX               ",
+"        X.........XXX     XXXXXX                ",
+"         X.......XXX                            ",
+"          XX...XXXX                             ",
+"           XXXXX                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj5-1.xpm b/images/obj5-1.xpm
new file mode 100644 (file)
index 0000000..40c1b3b
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char * obj5_1_xpm[] = {
+"48 48 6 1",
+"      c None",
+".     c #FFFF7F7F0000",
+"X     c #FFFFFFFF0000",
+"o     c #FFFF00000000",
+"O     c #FFFFFFFFFFFF",
+"+     c #000000000000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                     .....      ",
+"                                   .......      ",
+"                                  .X....o.      ",
+"                                 .XO...X.o      ",
+"                        .O.     ..O...XXo.      ",
+"                      .O...    ........o.       ",
+"                     .................o.        ",
+"                     .........O......o.         ",
+"                     ...............ooo         ",
+"                     ......O.......ooo          ",
+"                      ............ooo           ",
+"                      ...........ooo            ",
+"                      ...O......o.o.o           ",
+"                   O...........o.o.o.oo         ",
+"                 .O...O.......o.o.o.o.          ",
+"           O..  .....O.........ooo.o.o          ",
+"          ....................ooooo.oo          ",
+"          O........O.........oooooooo           ",
+"         O..................ooooooooo           ",
+"         ..................o.oo  ooo            ",
+"         ...................oo                  ",
+"          ....  ...........o.o                  ",
+"               ........oo.o.oo                  ",
+"              ........oo.o.ooo                  ",
+"             ......o.oo.o.ooo                   ",
+"            ......o.o+oo.ooo                    ",
+"            .....o.o oo.o.                      ",
+"           .....o.o  ooo.o                      ",
+"          .....o.o  oooooo                      ",
+"         .....o.o    ooooo                      ",
+"         ....o.o      ooo                       ",
+"        ....o.o                                 ",
+"        ...o.o                                  ",
+"        ..o.o                                   ",
+"        ...o.                                   ",
+"        o...o  ..o                              ",
+"         o.....oo                               ",
+"          oooooo                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj5-10.xpm b/images/obj5-10.xpm
new file mode 100644 (file)
index 0000000..fa302d3
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char * obj5_10_xpm[] = {
+"48 48 6 1",
+"      c None",
+".     c #FFFF7F7F0000",
+"X     c #FFFF00000000",
+"o     c #FFFFFFFF0000",
+"O     c #FFFFFFFFFFFF",
+"+     c #000000000000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"       ....X                                    ",
+"       .....XX                                  ",
+"       ..X.XoXX                                 ",
+"       .XoX.XoXX                                ",
+"       .XoX...X.X     X.X                       ",
+"        .X......XX    .X.X.                     ",
+"         ........XXXX.X.X.XX                    ",
+"          ..O........X.X.X.X                    ",
+"          X.........X.X.X.XX                    ",
+"           X..O......XXXXXXX                    ",
+"            X..O......XXXXX                     ",
+"             X.........XXX                      ",
+"            ..O..O......XXX                     ",
+"          O..O...........XXXXX                  ",
+"           .......OO......XX.X.X                ",
+"           ....XX..........XX.X.X  .XX          ",
+"           ...X.XX..O......X.X.X.X.X.XX         ",
+"            .X.X.XX..O......XXX.X.X.X.X         ",
+"            X.XXXXXX.........XXXXX.X.X.X        ",
+"             XXX  XXX..O......XXXXXXX.XX        ",
+"                   ..X..O.....XXXXXXXXXX        ",
+"                   .O...........X  XXXX         ",
+"                   .....X......X.X              ",
+"                   O....XXX.....X.X             ",
+"                    ..X.XXXX.....X.X            ",
+"                     ..X.XX+X.....X.X           ",
+"                       .X.XX X.....X.           ",
+"                       X.X.X  X.....X.          ",
+"                       .X.XXX  X.....X.         ",
+"                       XXXXX    X.....X.        ",
+"                        XXX      X.....X        ",
+"                                  X...X.X       ",
+"                                   X...X.       ",
+"                                    ..X.X       ",
+"                                    .X.X.       ",
+"                               .O.  X.X.X       ",
+"                                X....X.X        ",
+"                                 XXXXXX         ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj5-11.xpm b/images/obj5-11.xpm
new file mode 100644 (file)
index 0000000..aaed0d1
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char * obj5_11_xpm[] = {
+"48 48 6 1",
+"      c None",
+".     c #FFFF7F7F0000",
+"X     c #FFFF00000000",
+"o     c #FFFFFFFFFFFF",
+"O     c #FFFFFFFF0000",
+"+     c #000000000000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"      ....                                      ",
+"     .....XX    o.o                             ",
+"     ...XXOXX  ...X.                            ",
+"     ..OXX.O..  ...X                            ",
+"     X.OXX..... ..X.X                           ",
+"      X.X.......+..X.                           ",
+"       X........X.X.X.                          ",
+"        ..o......X.X.X.                         ",
+"        X......X.XX.X.X                         ",
+"         X.o....X.XXXXX                         ",
+"         ........X.XXXX                         ",
+"         ...o.....X.                            ",
+"         o.........X.                           ",
+"        ......o.....X.   ..                     ",
+"        o...X..o.....X. ....                    ",
+"        ...XX.........X......                   ",
+"        ..XXX...o...........X.                  ",
+"        .X.XXX...............X                  ",
+"      ..X.XXXX....o.....X.X.X.X                 ",
+"      .X.XX  X.X.........X.X.XX                 ",
+"       .X.X   X.X...o....XXXXXX                 ",
+"        XXX   XX.X.......XXXXX                  ",
+"         XX   XXX.........XXX                   ",
+"              XX.X.........XX                   ",
+"               XX.X.......X.X             X     ",
+"               X.X.X.X.....X.             .     ",
+"               XX.XXX.X.....X.           o.     ",
+"               X.X.XXX.X.....X.         X.X     ",
+"                X.X.X X.X...X.X         oXX     ",
+"                .X.XX  X.X...X.X       .XX      ",
+"                 .X.X   X.X...X.X     .X.X      ",
+"               X.X.XXX   X.X...X.X   .X.X       ",
+"               .X.X.XXX   X.X...X..X.X.XX       ",
+"                XXXXXX     XX.X.X.X.X.X.        ",
+"                            XX.X.X.X.X.         ",
+"                             XXXX.X.X.          ",
+"                                XXXXX           ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj5-12.xpm b/images/obj5-12.xpm
new file mode 100644 (file)
index 0000000..17b048b
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char * obj5_12_xpm[] = {
+"48 48 6 1",
+"      c None",
+".     c #FFFF7F7F0000",
+"X     c #FFFF00000000",
+"o     c #FFFFFFFF0000",
+"O     c #FFFFFFFFFFFF",
+"+     c #000000000000",
+"                                                ",
+"                     ...                        ",
+"                    .XXXX                       ",
+"                   ....XX.                      ",
+"                   ...Xo..                      ",
+"                  ....XoX.                      ",
+"                  OO..XXX                       ",
+"                  ....X.XX                      ",
+"                  ......XX                      ",
+"              ... OO....X                       ",
+"             O... ......XX                      ",
+"             ..............                     ",
+"             O...+......X..XX.                  ",
+"              ....OO.....XXXX.X                 ",
+"              .............X...X .X             ",
+"               ............X...X..X             ",
+"              .O.........XXXXXXXXXX             ",
+"              .O...O.......XXXXXXXX             ",
+"               ..............X  XX              ",
+"                .. ........XXX   XX             ",
+"                    .......XXX                  ",
+"                   ........X.X                  ",
+"                   ........X.XX                 ",
+"                    O.......XX.X                ",
+"                O...O........X..                ",
+"                ..O..........XXXX               ",
+"                .............X....              ",
+"                ..O..O.....X.XX.XXX             ",
+"                ...........X.XX.XXX X           ",
+"                 ....O.......XXX..XXXX          ",
+"                 ...........XX XXXXXXX          ",
+"                  ...........X  XXXXX           ",
+"                     ..O....XX  XXXX            ",
+"                      ......XX  XXX             ",
+"                       ......X  XX              ",
+"                       ......X                  ",
+"                       .O...XX                  ",
+"                        O...XX                  ",
+"                       ....XXX                  ",
+"                        ....XX                  ",
+"                        O...XX                  ",
+"                       .....XX                  ",
+"            .          .....X                   ",
+"             ....     .....X                    ",
+"              .............X                    ",
+"               ...........X                     ",
+"                 . X..X.XX                      ",
+"                      X                         "};
diff --git a/images/obj5-13.xpm b/images/obj5-13.xpm
new file mode 100644 (file)
index 0000000..efdee40
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char * obj5_13_xpm[] = {
+"48 48 6 1",
+"      c None",
+".     c #FFFF7F7F0000",
+"X     c #FFFFFFFFFFFF",
+"o     c #000000000000",
+"O     c #FFFF00000000",
+"+     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"    .                                           ",
+"   .                            . ...           ",
+"  ...                        .........          ",
+"  ..              . .X      ..........          ",
+" ...            ........   ...XX....            ",
+" ...           ....X..X.    ......o.  .         ",
+" ...           ....X..X.     ...XXX..X.XX. .    ",
+" ...           .........X.....X..............   ",
+" ...           ....X....X.....................  ",
+" ..           ...X.X..........................O ",
+" ...        . X........................O+++O..  ",
+" .... .. .....X.........................O..O..  ",
+" O....XX.X.X......................O.OOOOOOOOO   ",
+" O.............................O.OO.O O  ..     ",
+" OO.................................            ",
+"  OOO.OO..........O......O.OO.OO.OO             ",
+"   O OOOOO.OO.OO........OO.OO.OOOOO             ",
+"      OO OOOOO OOOOOO.OO.OOOOOOO.O.             ",
+"                OO.OO.OO.O    OO.O              ",
+"               OOO......O    OOOO               ",
+"             OOOO..OOOO     OOOO                ",
+"             OOOOOOOOO     OOOOO.               ",
+"              OOOOO         O OOO               ",
+"              OOOO                              ",
+"               OOOO                             ",
+"                 O                              ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj5-14.xpm b/images/obj5-14.xpm
new file mode 100644 (file)
index 0000000..b8d3e93
--- /dev/null
@@ -0,0 +1,56 @@
+/* XPM */
+static char * obj5_14_xpm[] = {
+"48 48 5 1",
+"      c None",
+".     c #FFFF7F7F0000",
+"X     c #FFFF00000000",
+"o     c #FFFFFFFFFFFF",
+"O     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                 .......                        ",
+"               ............                     ",
+"              .X..XXXX......                    ",
+"             XXXX  X  X.....                    ",
+"            X          XXX..                    ",
+"                       X.X..X                   ",
+"                       XXX..X                   ",
+"                       XX...X                   ",
+"                       XX...X                   ",
+"                       X....X                   ",
+"                      XXX...X                   ",
+"                      XX....X                   ",
+"                       X....X  ..X              ",
+"                      ......X  ..X.             ",
+"                   o ...o...X  ..XX.            ",
+"                 o.o........X X.XXX.X           ",
+"                .................X..            ",
+"                ...X...o......XXXX .            ",
+"                ...X........X..XXX              ",
+"                ...X..o.....X..XX               ",
+"                .XXX..........XXX               ",
+"                XXXX........X.XX                ",
+"                XXXX........XXX                 ",
+"                   X........XXX                 ",
+"                   .........XXX                 ",
+"                   ...o.....XX                  ",
+"                   .........X                   ",
+"                .. ..o......X   XX              ",
+"               .o.o..........X ..X              ",
+"               .....o........X..XX              ",
+"              ...X........X.XXXXXX              ",
+"              ...X.......XX.XXXXXX              ",
+"              ..XXX.o....X..XXX X               ",
+"              ..XXX......XXXXX                  ",
+"             ..XX X.....XXX X                   ",
+"             ..XX X......X                      ",
+"              XX  X....XX                       ",
+"                  XX...XX                       ",
+"                  XXX..XX                       ",
+"                  XOX.XOX                       ",
+"                  XO..XO                        ",
+"                   X..XX                        ",
+"                  XX..XXX                       ",
+"                   XXXXX                        ",
+"                    X X                         ",
+"                                                "};
diff --git a/images/obj5-15.xpm b/images/obj5-15.xpm
new file mode 100644 (file)
index 0000000..d32abe1
--- /dev/null
@@ -0,0 +1,56 @@
+/* XPM */
+static char * obj5_15_xpm[] = {
+"48 48 5 1",
+"      c None",
+".     c #FFFF7F7F0000",
+"X     c #FFFFFFFFFFFF",
+"o     c #FFFF00000000",
+"O     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                          .     ",
+"          .X.                              .    ",
+"         .........                         ..   ",
+"          ......X..     X  ..              ...  ",
+"           .....X...   .X......            ...  ",
+"      .     .......     ..X.....            ... ",
+"    ...XX....XX...     ...X......           ..  ",
+"   .............X................          ...o ",
+"  ......................X........           ..o ",
+" o............................X...          ... ",
+" o..OOOo...........................        ...o ",
+" o.ooo.................................. .....o ",
+"  oooooooooo.........................X..X....oo ",
+"      .ooooo.oo...............................o ",
+"           ..................................o  ",
+"            .oo..oo.oo......o.........oo..ooo   ",
+"            .oooooo.oo.o.......oo.oo.oooooo     ",
+"            ..o.oooooooo.oooooo oooooooo o      ",
+"             .o.oo   ooo.oo..oo                 ",
+"              oooo    oo.....ooo                ",
+"              o.ooo      oo..oooooo             ",
+"             .o.oooo      oooooooooo            ",
+"              ooooo         o ooooo             ",
+"                              oooo              ",
+"                             oooo               ",
+"                               o                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj5-2.xpm b/images/obj5-2.xpm
new file mode 100644 (file)
index 0000000..fb3bc76
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char * obj5_2_xpm[] = {
+"48 48 6 1",
+"      c None",
+".     c #FFFF7F7F0000",
+"X     c #FFFFFFFF0000",
+"o     c #FFFF00000000",
+"O     c #FFFFFFFFFFFF",
+"+     c #000000000000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                     ....       ",
+"                                   .......      ",
+"                                  .X......      ",
+"                                 .XX..XXo.      ",
+"                                ......Xo.o      ",
+"                               .O.....o.o       ",
+"                              ..........o       ",
+"                             .O........o        ",
+"                           ..O........oo        ",
+"                        .............oo         ",
+"                    .......O........o.   .      ",
+"                  O....O...........o.   .ooo    ",
+"                 ....O............o.o.o.o.o     ",
+"                O...o...O........o.o.o.o.oo     ",
+"                .o.o.o..........ooo.o.oooo      ",
+"                oooo+.O........ooooo.oooo       ",
+"                    .O........ooooooooo         ",
+"                   ..........oooo  ooo          ",
+"                 ...........o.oo                ",
+"               ............o.o.oo               ",
+"          O. ....O........o.o.o.o               ",
+"         ................o.o.o.o.               ",
+"         O...OO.........o.o.o.o.oo              ",
+"        .O.O...........o.ooo.o.ooo              ",
+"        O.............o.ooooo.oooo              ",
+"        ...o.o.......o.oooooooooo               ",
+"        o.o.ooo.....o.oooooooooo                ",
+"         ooo  .....o.oooo  ooo                  ",
+"             .....o.ooo                         ",
+"           ......o.ooo                          ",
+"     ...........o.oo                            ",
+"    ...........o.oo                             ",
+"   .....ooooooooo                               ",
+"   ....   oooo                                  ",
+"   o...                                         ",
+"    oo..                                        ",
+"      o..                                       ",
+"       oo.                                      ",
+"         o                                      ",
+"                                                ",
+"                                                "};
diff --git a/images/obj5-3.xpm b/images/obj5-3.xpm
new file mode 100644 (file)
index 0000000..35e0da1
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char * obj5_3_xpm[] = {
+"48 48 6 1",
+"      c None",
+".     c #FFFFFFFFFFFF",
+"X     c #FFFF7F7F0000",
+"o     c #FFFF00000000",
+"O     c #000000000000",
+"+     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"         .XXXX                                  ",
+"        .XXXXXXoo                               ",
+"       XXXXXXXXXoo                              ",
+"      .XXXXXooXXXoo     XoXoXo                  ",
+"      XXoooooXoXXXoo   XXXoXoXo                 ",
+"     XXoo   oooXXXXoo   XXXoXoX                 ",
+"    XXoo     oooXXXXoo   XoXo                   ",
+"    Xoo       ooXXXXXoo  oXooo                  ",
+"   XXo         ooXXXXXoo Xoooo                  ",
+"   Xo          ooXXXXXXoXXoXooo                 ",
+"   Xo           ooXXXXXXoXXoXoo                 ",
+"   o             oX.XXXXXoXXooo                 ",
+"   o             XXXXXXXXXoXXoo                 ",
+"                 XXXX.XXXXXooooo                ",
+"                 XXXX.XXXXXXoooo   Xo           ",
+"                .XXXXXXXXXXXXooo   oXo          ",
+"               .XXXXXX.XXXXXXXoo   Xooo         ",
+"               .XXoXXXXXXXXXXXXoo  oXooo        ",
+"               XXXXoXXXXXXXXXXXXoXoXoooo        ",
+"                XXoXoXXX.XXXXXXXXoXoXo          ",
+"                XXXoXoXXXXXXXXXXXXoXoo          ",
+"                 XXooooXXX.XXXXXXoXooo          ",
+"                  Xooo XXXXXXXXXXXoXoo          ",
+"                   oo   XXX.XXXXXoXooo          ",
+"                         XXXXXXXXXooo           ",
+"                          XX.XXXXXXoo           ",
+"                       XX.XXX.XXXXoXo           ",
+"                       X.XXXXX.XXXXXo           ",
+"                       X.XoXXXXXXXXooo          ",
+"                       XXXXoooXXXXXXoo          ",
+"                        XXXooooXXXXXXoo         ",
+"                         XXXoOooXoXXXooo        ",
+"                         XXXoo oo+ooXoo+o       ",
+"                          XXoo  oo++XX++o       ",
+"                          XoXoo  ooXXXXXo       ",
+"                           Xoo    oooXXoo       ",
+"                                    oooo        ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj5-4.xpm b/images/obj5-4.xpm
new file mode 100644 (file)
index 0000000..0dd2b6b
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char * obj5_4_xpm[] = {
+"48 48 6 1",
+"      c None",
+".     c #FFFFFFFFFFFF",
+"X     c #FFFF7F7F0000",
+"o     c #FFFF00000000",
+"O     c #000000000000",
+"+     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"         ..XXXX                                 ",
+"        XXXXoooX                                ",
+"       X.XXo  ooo                               ",
+"       XXXXo                                    ",
+"       X.XXo                                    ",
+"       XXXXXo                                   ",
+"       XXXXXXo                                  ",
+"        XXXXXXo      ooo                        ",
+"        XX.XXXXo    oXooo                       ",
+"         XXXXXXXo  oXoXoo                       ",
+"          XXXXXXXo  oXoXo                       ",
+"           X.XXXXXo XoXoo                       ",
+"           XXXXXXXXoOXoXooo                     ",
+"            XX.XXXXXooXoXooo                    ",
+"             XXXXXXXXoooooooo                   ",
+"              XX.XXXXXooooooo                   ",
+"         ..XX  XXXXXXXXoooooo                   ",
+"        XXXX.XXXX.XXXXXXooooo                   ",
+"        XXXXXXXXXXXXXXXXXooooo  oXo             ",
+"        XXXXXXXXoXX.XXXXXoXoooooXoXo            ",
+"         XXXXXoooXXXXXXXXXoXoooXXXoo            ",
+"         XXXXoooooXX.XXXXXXoXoXoXoooo           ",
+"          XXX  ooooXXXXXXXXXoXoXoXooo           ",
+"                ooooXX.XXXXXXoXoXoXoo           ",
+"                  oooXX.XXXXXXoXoXoooo          ",
+"                     XXX.XXXXXXoXooo            ",
+"                      XXXXXXXXXXooo             ",
+"                     .XXXX.XXXXXXooo            ",
+"                    .XXXXoXXXXXXXXooo           ",
+"                    .XXXXooXXXXXXXXooo          ",
+"                    XXXXXoooXXXXXXXXoo          ",
+"                    XXXXXooooXXXXXXXXoo         ",
+"                     XXXXo    XXXXXXXXoo        ",
+"                       XXX     XXooXXoooo       ",
+"                                Xo+oXoo+o       ",
+"                                 Xo++X++o       ",
+"                                  XoXoXoX       ",
+"                                    oXoXo       ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj5-5.xpm b/images/obj5-5.xpm
new file mode 100644 (file)
index 0000000..8f9ab99
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char * obj5_5_xpm[] = {
+"48 48 6 1",
+"      c None",
+".     c #FFFF7F7F0000",
+"X     c #FFFFFFFFFFFF",
+"o     c #FFFF00000000",
+"O     c #000000000000",
+"+     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"          .                                     ",
+"        X.o                                     ",
+"       X.o                                      ",
+"     ...o                                       ",
+"    ...o                                        ",
+"    ....   ....                                 ",
+"    o.............                              ",
+"    oooo.....X......                            ",
+"      oooooo...X.....                           ",
+"            ..........o                         ",
+"              ..X....o.o                        ",
+"          .X.  .......o.o.  o.o                 ",
+"         .X......X.....o.o.o.o.o.               ",
+"         .........X.....o.o.o.o.o.              ",
+"         ......o.........o.o.o.o.o.             ",
+"         ......oo.........ooo.o.o.o             ",
+"          ...oo.o...X......oooooooo             ",
+"          ..oooooo..........oooooo              ",
+"           .o ooooo..X.......ooooo              ",
+"                oo............oooo              ",
+"                  .....X.......oo               ",
+"                    ............oo  o.o         ",
+"                     ....X.......o.o.o.o        ",
+"                 ....O....X.......o.o.o.o.      ",
+"                 ..X.X.............o.o.o.o.     ",
+"                 ............X......o.ooo.o.    ",
+"                  ........o..........ooooooo    ",
+"                   .......oo..........   oooo   ",
+"                     ooooooo...........   o     ",
+"                         oooo...........        ",
+"                            oo...........       ",
+"                              ...........       ",
+"                               o..........      ",
+"                                o...o....o      ",
+"                                 o.o+o..o+o     ",
+"                                  o.o++.o+o     ",
+"                                   o.ooooo.     ",
+"                                    o.o.o.o     ",
+"                                      oo.o      ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj5-6.xpm b/images/obj5-6.xpm
new file mode 100644 (file)
index 0000000..fdcecd8
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char * obj5_6_xpm[] = {
+"48 48 6 1",
+"      c None",
+".     c #FFFF7F7F0000",
+"X     c #FFFF00000000",
+"o     c #FFFFFFFFFFFF",
+"O     c #000000000000",
+"+     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                     ...        ",
+"                                      ...       ",
+"                                       ...X     ",
+"                                        .X.X    ",
+"                                 ....   X.X.    ",
+"                              ...o.....X.X.X    ",
+"                            ..o.....X.X.X.X     ",
+"                           ......X.XXX.X.X      ",
+"                         ...o...XXXX            ",
+"                        .......XXX              ",
+"                 o..  ...o....XXX  ...          ",
+"               .o............XXXX.....X         ",
+"              o........o.....XX.X.....X         ",
+"             .................XX..X.XXX         ",
+"             ...X.X..o.......X.X.X.X.XX         ",
+"             ..X.X..o.......X.X.X.X.XX          ",
+"              X.X..........X.X.X.XXXXX          ",
+"              XX..........X.XXXXX. XX           ",
+"              X...o......X.XXXXX                ",
+"               ..o......X.XXXX                  ",
+"         ...  .........X.XXX                    ",
+"        .......o......X.XXX                     ",
+"      o...............XXXXO....                 ",
+"     o.......o.......XXXXX....X                 ",
+"    o..X.X...........X.....X.X.                 ",
+"    ...XXXXo........X.X.X.X.X.                  ",
+"   ..X.   .........X.X.X.X.XX                   ",
+"     .   .........X.X.X.XXX                     ",
+"        .........X.XXXX                         ",
+"       .........X.XX                            ",
+"       ........X.X                              ",
+"      XX......X.X                               ",
+"      XX..X..X.X                                ",
+"     X+X.XX+X.X                                 ",
+"     .+.XX+XXX                                  ",
+"     ...X.XXX                                   ",
+"     X...XXX                                    ",
+"      XXXX                                      ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj5-7.xpm b/images/obj5-7.xpm
new file mode 100644 (file)
index 0000000..72ee328
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char * obj5_7_xpm[] = {
+"48 48 6 1",
+"      c None",
+".     c #FFFFFFFFFFFF",
+"X     c #FFFF7F7F0000",
+"o     c #FFFF00000000",
+"O     c #000000000000",
+"+     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                 .XXXXX         ",
+"                                XoooXXXo        ",
+"                               ooo  oXXXo       ",
+"                                    XXXoo       ",
+"                                    XXXXo       ",
+"                                   XXXXoo       ",
+"                                  XXXXXoo       ",
+"                        .Xo      XXXXXoX        ",
+"                       X.XXo    XX.XXoXo        ",
+"                       XXXooo  X.XXXoXo         ",
+"                       XXXXo  XXXXXoXo          ",
+"                       XXXoo .XXXXoXo           ",
+"                     .XXXXXOXXXXXoXoX           ",
+"                    .XXXXXXXXXXXoXoX            ",
+"                   oXoXXX.XXXXXoXoX             ",
+"                   ooooXXXXXXXoXoX              ",
+"                   oooX.XXXXXXXoX  oXoX         ",
+"                   XXX.XXXXXXXoXoXoXoXoo        ",
+"             .Xo  XXXXXXXXXXXoXoXoXoXoXo        ",
+"            XXXoooXX.XXXXXXXoXoXoXoXoXoX        ",
+"            .XXooXXXXXXXXXXoXoXoXoooXoo         ",
+"           XXXXXXX.XXXXXXXoXoXoXooooooo         ",
+"           oXoXXXXXXXXXXXoXoooooo  ooo          ",
+"           ooXXX.XXXXXXXoXoooooo                ",
+"          ooooXXXXXXXXXoXooooo                  ",
+"            ooXXXXXXXXoXooo                     ",
+"             XXXXXXXXoXoXo                      ",
+"            XXXXXXXXoXoXoXo                     ",
+"           XXXXXXXXoXoXoXoXo                    ",
+"          XXXXXXXXoXoXoXoXoo                    ",
+"         XXXXXXXXoXoooXoXoXo                    ",
+"        XoXXXXXXoooooooXoXoo                    ",
+"        XooXXoXooo    ooooo                     ",
+"       X+ooXo+ooo     ooo                       ",
+"       XX+Xo+ooo                                ",
+"       XXXXXooo                                 ",
+"       XXXXooo                                  ",
+"       ooooo                                    ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj5-8.xpm b/images/obj5-8.xpm
new file mode 100644 (file)
index 0000000..81afb4f
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char * obj5_8_xpm[] = {
+"48 48 6 1",
+"      c None",
+".     c #FFFF7F7F0000",
+"X     c #FFFFFFFFFFFF",
+"o     c #FFFF00000000",
+"O     c #000000000000",
+"+     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                  ..X..         ",
+"                               ...X.....        ",
+"                              ..X........       ",
+"                  X..ooo     ......o.o.o..      ",
+"                 X....o.o   ..X....oooo.o..     ",
+"                 ....o.o   .......oo   o.o.     ",
+"                   ...o   ..X....oo     o.oo    ",
+"                  ...oo  ..X....oo       ooo    ",
+"                  X.o.o .......oo         ooo   ",
+"                 ....o...X....ooo         ooo   ",
+"                 X......X....ooo           oo   ",
+"                 ...........ooo             o   ",
+"                 .....X....oooo             o   ",
+"                ............ooo                 ",
+"           .o   ....X........oo                 ",
+"          ..o   ............o.oo                ",
+"         X..o   ..X........o.o.oo               ",
+"        X...o  o.X........o.o.ooo               ",
+"        ....oo...........o.o.o.oo               ",
+"          ...oo.........o.ooo.oo                ",
+"          X....X.......o.ooo.ooo                ",
+"          ............o.ooo.ooo                 ",
+"          X..........o.oo oooo                  ",
+"          ..........o.oo   oo                   ",
+"           ........o.oo                         ",
+"           .......o.oo                          ",
+"           ......o.oooooo                       ",
+"           .....o.o.o.o.o                       ",
+"          .......o.o.o.oo                       ",
+"          ......o.ooo.ooo                       ",
+"         ......o.ooo.ooo                        ",
+"        ......o.ooO.ooo                         ",
+"       .oo...o.oo .oooo                         ",
+"       .+o..o+oo  oooo                          ",
+"       .+..o+oo  ooooo                          ",
+"       ...o.oo    ooo                           ",
+"        oooo                                    ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj5-9.xpm b/images/obj5-9.xpm
new file mode 100644 (file)
index 0000000..8b5d8c1
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char * obj5_9_xpm[] = {
+"48 48 6 1",
+"      c None",
+".     c #FFFF7F7F0000",
+"X     c #FFFF00000000",
+"o     c #FFFFFFFF0000",
+"O     c #FFFFFFFFFFFF",
+"+     c #000000000000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"      ....                                      ",
+"     ....X.X                                    ",
+"     ...XooXX                                   ",
+"     .oX.XoXXX                                  ",
+"     .oX..X.X.X                                 ",
+"      X......X.X                                ",
+"      X.......X.X                               ",
+"       ...O....X.X                              ",
+"       X........X.XX                            ",
+"        X........X...XX                         ",
+"     O   X..O.....X.......X                     ",
+"    O..   X...........X.....X                   ",
+"    .....O....O........X...X.X                  ",
+"    ........X..O.......XX.X.X.X                 ",
+"     X.X...X.X..........XXXX.X.                 ",
+"      X.X.X.X.X.O.......XX+XXXX                 ",
+"        .X.XXXXX.........XX                     ",
+"         XXX  XX..O.......XX                    ",
+"               .X.........XXX.                  ",
+"              ...X..O......X....                ",
+"              ..............X..... .X           ",
+"              .O......O..............X          ",
+"             O.....X................X.          ",
+"             ..X.X.XX.........XX...X.X.         ",
+"             .X.X.X.XX.........XX.X.X.X         ",
+"              .X.X.XXXX.X......XXX.X.X.         ",
+"               XXXXXXXXX.X......XXXXXXX         ",
+"                 XXX  XXX.X......  XXX          ",
+"                        XX.X......              ",
+"                         XX.X.......            ",
+"                           XX.X.X.........      ",
+"                            XXXX.X.........     ",
+"                              XXXXXXXXXX..X.    ",
+"                                 XXXX   .X.X    ",
+"                                        X.X.    ",
+"                                       X.X.     ",
+"                                      X.X       ",
+"                                     X.X        ",
+"                                     .          ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj6-0.xpm b/images/obj6-0.xpm
new file mode 100644 (file)
index 0000000..541101e
--- /dev/null
@@ -0,0 +1,56 @@
+/* XPM */
+static char * obj6_0_xpm[] = {
+"48 48 5 1",
+"      c None",
+".     c #3F3F3F3F3F3F",
+"X     c #7F7F7F7F7F7F",
+"o     c #000000000000",
+"O     c #BFBFBFBFBFBF",
+"                                                ",
+"         .XX o . ...    .o                      ",
+"   O     .O..XO. . oo... ... . .....            ",
+"     OX   XOXOO ..XXX..X..XX........            ",
+"     OOOO..X.OXOXX.XXXO...X.......o.            ",
+"    oO .X.XOOX..XXXX..X...XX.oO....             ",
+"    OX .OO...OO..X..........X.......            ",
+"     O   OO......XX.....X.ooooo.... .           ",
+"     .O  .....O.OOOXX.X....ooooo                ",
+"         .. O..OXOOX.O......oooo o              ",
+"       o     OOOOOXXXXXXX....oooo               ",
+"             OOOOOOXXXXX.X...oooo               ",
+"              OOOXOOOX..X....oooo               ",
+"                OOOOXXXXX...o.ooo               ",
+"                OOOOXXXX...XX..o.o              ",
+"                  OOOOOXXXX..o.oooo             ",
+"                  OOOOOXXXXXX...oooo            ",
+"                    OOOOOXX.XX...ooo            ",
+"                     OOOOOXXXXX.ooooo           ",
+"                      OOOOXXXX....ooo           ",
+"                      OOOOXXXX.Xooooo           ",
+"                       OOOOXXX.....oo           ",
+"                       OOOOXXXX..ooo            ",
+"                       OOOXXXX...ooo            ",
+"                        OOOXXXX...oo            ",
+"                        OOXXXXX..ooo            ",
+"                         OOOXX..o.oo            ",
+"                        OOXOXX....o             ",
+"                         OOOX....oo             ",
+"                         OOOXXXX.oo             ",
+"                         OOOXX.ooo              ",
+"                        OOXX...o                ",
+"                        OOXX..o                 ",
+"                       OOOXX..o                 ",
+"                       OOX..o                   ",
+"                      OOXXXoo                   ",
+"                      OXXX.o                    ",
+"                      OX...                     ",
+"                     OOXX.o                     ",
+"                     OXXX.o                     ",
+"                      X..o                      ",
+"                     OXXo                       ",
+"                     OXo                        ",
+"                     OX.                        ",
+"                     OX.                        ",
+"                     OX.                        ",
+"                      O                         ",
+"                      O                         "};
diff --git a/images/obj6-1.xpm b/images/obj6-1.xpm
new file mode 100644 (file)
index 0000000..27d30a4
--- /dev/null
@@ -0,0 +1,56 @@
+/* XPM */
+static char * obj6_1_xpm[] = {
+"48 48 5 1",
+"      c None",
+".     c #BFBFBFBFBFBF",
+"X     c #000000000000",
+"o     c #3F3F3F3F3F3F",
+"O     c #7F7F7F7F7F7F",
+"                                                ",
+"        .           Xoooo    o   X              ",
+"             X . Xoo o  oo   ooo                ",
+"          .o ooooOXOoXoO oo oX oooX  o          ",
+"        o..o.oo...OOOoOOOoooooooooooo           ",
+"       . ..oO.o..oooOooOOooooooXooooX           ",
+"         .OOOoOoOOooooOOooooo.oooooo            ",
+"      .   o.ooo.ooo.OoOooooOooo.ooooX           ",
+"       . o oXOo..O..O.oOOooooooXoXXXo           ",
+"            o  ....o..OOoooooooXXXX             ",
+"              X .....OOOOOOooooXXXX             ",
+"               ......OOOOOoOoooXXXX             ",
+"                 ...O...OooooooXXXX             ",
+"                  ....OOOOOoooXoXXX             ",
+"                  ....OOOoooOOooXoXX            ",
+"                   .....OOOOooXoXXXX            ",
+"                   .....OOOOOoooXXXX            ",
+"                    ....OOoOOoooXXX             ",
+"                    .....OOOOOoXXXXX            ",
+"                    ....OOOOooooXXX             ",
+"                    ....OOOOoOXXXXX             ",
+"                     ....OOOoooooXX             ",
+"                     ....OOOOooXXX              ",
+"                     ...OOOOoooXXX              ",
+"                      ...OOOOoooXX              ",
+"                      ..OOOOOooXXX              ",
+"                       ...OOooXoXX              ",
+"                      ..O.OOooooX               ",
+"                       ...OooooXX               ",
+"                       ...OOOOoXX               ",
+"                       ...OOOoXXX               ",
+"                       ..OOoooX                 ",
+"                       ..OOooX                  ",
+"                      ...OOooo                  ",
+"                       ..OooX                   ",
+"                      ..OOOXX                   ",
+"                      .OOOoX                    ",
+"                      .OOooo                    ",
+"                      ..OOoX                    ",
+"                       .OOOo                    ",
+"                       OooX                     ",
+"                      .OOX                      ",
+"                      .OXX                      ",
+"                       .Oo                      ",
+"                       .Oo                      ",
+"                      .Oo                       ",
+"                       .                        ",
+"                        .                       "};
diff --git a/images/obj6-2.xpm b/images/obj6-2.xpm
new file mode 100644 (file)
index 0000000..795fe05
--- /dev/null
@@ -0,0 +1,56 @@
+/* XPM */
+static char * obj6_2_xpm[] = {
+"48 48 5 1",
+"      c None",
+".     c #3F3F3F3F3F3F",
+"X     c #7F7F7F7F7F7F",
+"o     c #BFBFBFBFBFBF",
+"O     c #000000000000",
+"                                                ",
+"        .      .          .   .  . .            ",
+"          X.. ..  ...X ... ..  . .              ",
+"     .   ...o..XXX.o .o..............           ",
+"      o .oXo...o.X..o..............O            ",
+"        ooX.o.....X..X...X....XX..OO.           ",
+"      o  .. oo.X..X..X...X.......O....          ",
+"       ....oo..o..o..XX........O.  .            ",
+"           .oo....o.oo.XX....OOOO..             ",
+"        ..  o.o.o.X.oXX.......OOOO              ",
+"            oo oooooXXXXX....OOOO               ",
+"             ooooooXXXXX.X...OOOO               ",
+"              oooXoooX......OOOO                ",
+"               ooooXXXXX...O.OOO                ",
+"               ooooXX...XX..O.OO                ",
+"               oooooXXXX..O.OOOO                ",
+"               oooooXXXXX...OOOO                ",
+"                ooooXX.XX...OOO                 ",
+"                oooooXXXXX.OOOOO                ",
+"                ooooXXXX....OOO                 ",
+"               oooooXXXX.XOOOOO                 ",
+"                 ooooXXX.....OO                 ",
+"                 ooooXXXX..OOO                  ",
+"                 oooXXXX...OOO                  ",
+"                  oooXXXX...OO                  ",
+"                  oooXXXXX..OO                  ",
+"                    oooXX..O.O                  ",
+"                   ooXoX....O                   ",
+"                   oooo....OO                   ",
+"                   oooXXX.OO                    ",
+"                   ooXXX.OOO                    ",
+"                  ooXX...O                      ",
+"                  ooXX..O                       ",
+"                 oooXX...O                      ",
+"                  ooX..O                        ",
+"                  ooXXXOO                       ",
+"                  oXXX.O                        ",
+"                  oXX...                        ",
+"                 oooXX.O                        ",
+"                   oXXX.O                       ",
+"                   X..O                         ",
+"                  ooXXO                         ",
+"                   oXOO                         ",
+"                     oX.                        ",
+"                      oX.                       ",
+"                     ooX.                       ",
+"                        o                       ",
+"                          o                     "};
diff --git a/images/obj7-0.xpm b/images/obj7-0.xpm
new file mode 100644 (file)
index 0000000..895d2b8
--- /dev/null
@@ -0,0 +1,54 @@
+/* XPM */
+static char * obj7_0_xpm[] = {
+"48 48 3 1",
+"      c None",
+".     c #FFFF7F7F0000",
+"X     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                     .                          ",
+"                                                ",
+"                   XXXXXXX                      ",
+"                  XXXXXXX XX                    ",
+"                . XXXX XXX XX                   ",
+"                 X XXXXXX.XXX                   ",
+"                XXXXXXXXXXXXXX                  ",
+"                XXXXXXXXXXXXXX                  ",
+"                X XXXXXXXXXXXX                  ",
+"                XXXXXXXXXXXX X                  ",
+"                 XXXXXXXXXXX X                  ",
+"                  XXXXXXXXXX .                  ",
+"                 X.XXX  XXXX X                  ",
+"                  XXXXXXXX XX                   ",
+"                    XXX.XXXX                    ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj7-1.xpm b/images/obj7-1.xpm
new file mode 100644 (file)
index 0000000..ad91ed8
--- /dev/null
@@ -0,0 +1,55 @@
+/* XPM */
+static char * obj7_1_xpm[] = {
+"48 48 4 1",
+"      c None",
+".     c #FFFFFFFF0000",
+"X     c #FFFF7F7F0000",
+"o     c #FFFF00000000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                           ..                   ",
+"                          ...                   ",
+"                         .. .                   ",
+"                 XX      .  .   X               ",
+"                 .XX     .  X  ...              ",
+"                .. X  ..... . ...               ",
+"                  ..   ... .........            ",
+"             ........ X..X.. .....              ",
+"             .X  .... X.. ..... ..              ",
+"             .... .X .. ........ .              ",
+"               X ............X.  .              ",
+"                X ............. XXXXXX          ",
+"                   ............X                ",
+"             .X.  .................             ",
+"              X .. . ............  .            ",
+"             ...   .......o.... ......          ",
+"               X....... ..... ..XX  ...         ",
+"               X .... X........  XX   .         ",
+"                 .....  ......                  ",
+"              X . .X  .    X X                  ",
+"                .. X ...  XX.X                  ",
+"               X X    XX  X                     ",
+"                                                ",
+"                X                               ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj7-2.xpm b/images/obj7-2.xpm
new file mode 100644 (file)
index 0000000..4d78ab6
--- /dev/null
@@ -0,0 +1,55 @@
+/* XPM */
+static char * obj7_2_xpm[] = {
+"48 48 4 1",
+"      c None",
+".     c #FFFFFFFF0000",
+"X     c #FFFF7F7F0000",
+"o     c #FFFF00000000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"               ..              ..               ",
+"                .            ...                ",
+"                XXXX        .          X        ",
+"      X          XXXX       .                   ",
+"                  X X      . X                  ",
+"                  XX X    . XX                  ",
+"      ....         X. X  . XX                   ",
+"    ..   XXX       X .XX. X       XX......      ",
+"   . XXXXX .XXX      .XX.X  oo  XX..X     .     ",
+"         XXX  .XX    . XXX     XX.XX            ",
+"           XX  ..XX  .XoXo XX XXXXXX            ",
+"             XX  ..XX.X.XXXo .XXXX              ",
+"             .XX.... . .XXX .X X                ",
+"            .  XX  .. ..XXo  XX        XXX      ",
+"           XoXXoX    ..X.X.  ..   XXX     X     ",
+"           X    ......  ...... ..X.........     ",
+"              ..  oXX. ...X .X.XXX   XXXX       ",
+"       X     .     .....X....XXX                ",
+"            .  X....  ..XXX...XX   X            ",
+"           XX X.   XX...........XXXXX           ",
+"           .XXXXXXXX .. ....XX....  XXXX        ",
+"          . X.     ...X...  .X . ...            ",
+"          . X.   ..Xo.X..X.  .XX   .            ",
+"         .  . X.....XX.X.XX  .XXX   .           ",
+"        .   XX..  XX  .X. X   .XX    .      X   ",
+"        .  X...  o  XX.X .X    .X    ..         ",
+"          XX..   X XX. X .X X  .X               ",
+"         X ..   XXX  . X .X X   XX              ",
+"          . XXXXX X  . X .  X   .X              ",
+"         . .      X .  X .  X    X              ",
+"        .  .     X       .       X              ",
+"        .  .     X      .         .             ",
+"        .              .          .             ",
+"                                   .            ",
+"                                   .            ",
+"                                   .            ",
+"                          X        .            ",
+"            X                                   ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj7-3.xpm b/images/obj7-3.xpm
new file mode 100644 (file)
index 0000000..f2a25d6
--- /dev/null
@@ -0,0 +1,55 @@
+/* XPM */
+static char * obj7_3_xpm[] = {
+"48 48 4 1",
+"      c None",
+".     c #FFFF00000000",
+"X     c #FFFF7F7F0000",
+"o     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                   .          XXX XX            ",
+"         XXXXXX              X  XX  XXXX        ",
+"     X X   XX...X        .  X  ..      X        ",
+"                ..X         X... X              ",
+"                X..X       Xo.  XX   XXX        ",
+"      X          X..X      X.  XX     X         ",
+"                  X..      X.XX                 ",
+"                  XX.X    oX X                  ",
+"      oooo         X..X  o X              X     ",
+"    oo  XXXX     . X oXXo X       XXoooXXXXXX   ",
+"   X ........XX      oX      .   XooX X   o  X  ",
+"  XX     XX...oX         X  X  X...X XXXX       ",
+"   X       XX..  XX    .X   X XX.XXXX           ",
+"  X   X      XX               XX X              ",
+"      X XX   oX ooo     X                       ",
+"         XXXo   X    X.X   .      .    XXX      ",
+"      X    X.XX    X   X          XXX...  X     ",
+"           X       X     X  .X    oo.oX.XXo     ",
+"              o     X.  X            XXXX XXX   ",
+"       X     o     X        .       .       X   ",
+"          X o   o.           .     X         X  ",
+"     X XXX XX X        .X      o XXXX           ",
+"    .....  oXXXX     XX      X   o  XXXX        ",
+"    X     o Xo.   XXXX      .     oo            ",
+"   X  X   o Xo   o   o        .X   o            ",
+"       X o  o Xoooo       .   XXX   XX          ",
+"   X    o   XXoo  XX   Xo     o  .   XX     X   ",
+"        o  Xooo  .         .   oX    oX         ",
+"          XXXX.. X XXo      X. oX.    XX        ",
+"         X XX  XXXX  o X XX X   X.X    X        ",
+"          X XXXXX X  o X XX X   o.X    X        ",
+"         X..X X   X.o  X o. X    .X     X  .    ",
+"        X.XX     X .     o.      .X     X       ",
+"       X..Xo     X   .. o .       X  .  .X      ",
+"       X.XX            o .        X             ",
+"       X X              ..         o     X      ",
+"       X X              X    .     o            ",
+"     X     X            X         Xo            ",
+"         X              X X       Xo            ",
+"            X         X X       XX              ",
+"       X X X         X X   .    X               ",
+"     X                         X.   .           ",
+"                                                ",
+"                                                ",
+"                                                "};
diff --git a/images/obj7-4.xpm b/images/obj7-4.xpm
new file mode 100644 (file)
index 0000000..84afc67
--- /dev/null
@@ -0,0 +1,56 @@
+/* XPM */
+static char * obj7_4_xpm[] = {
+"48 48 5 1",
+"      c None",
+".     c #FFFF00000000",
+"X     c #FFFF7F7F0000",
+"o     c #99997F7F4C4C",
+"O     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                       ..                       ",
+"                   .          XXX XX            ",
+"         ...X X                        X        ",
+"     ....  ..   X        . o                    ",
+"    ..       ..  .X         X    X   ...        ",
+"          o       .        X . oXX   XX..       ",
+"      X      o            o    X    o X .       ",
+"                 o  o                   ...     ",
+"                  X      o   X    o     o       ",
+"      OOOO         X. o            o      X     ",
+"    OO    XX     . X      X   o    XO OoXo..X   ",
+"   X   ..     o                            ...  ",
+"  X.     XX  . X         X     X. .          .. ",
+"   .       X      X  o      X      X      o   . ",
+"  X.  X               o       XX              . ",
+" ..   X XX   O  OO                    o       . ",
+" . .     XX O   X          .      .    XXX    . ",
+"  ..  X o  X.   o      o o oo             X     ",
+"                 o X     X        O o  .XXO     ",
+"           o  O     X.  o o  o      oooXX XXX   ",
+"       o     O     X     o  .    o  .       X . ",
+"           o     .                      o    X. ",
+"        XX XX  o       .o      O    X         . ",
+"     ....  O X oo            o       XXX     .. ",
+"          O       X XX      .           o    .  ",
+"   X  X   O X    O  oO      o .  o              ",
+"  ...  X O       O     oo       X   X     o     ",
+"  ..      o   O               O      oX     X   ",
+"  ..                           O     OX         ",
+"  ..         X .   X o      X  O      XX   o    ",
+"  ..     X     XX o       X o  o  X    Xo       ",
+"             X    X    X     o    X    X        ",
+"             o         X O        X     X  .    ",
+"        X Xo       .     o       .X     X       ",
+"       X. X      X   .. O      o  X  .  .X      ",
+"       X  X            O .        X             ",
+"        .         o     ..         O    ..      ",
+"        .               X    .     O   ..       ",
+"     X ..  X        ... X         XO   .        ",
+"       ..X       oo .   X X       XO   .        ",
+"        .....       ..X Xo      XX  o           ",
+"       X.. ..        . X   .  . X               ",
+"     X ..  .                  ...   .           ",
+"        .           .                           ",
+"        .                                       ",
+"                                                "};
diff --git a/images/obj7-5.xpm b/images/obj7-5.xpm
new file mode 100644 (file)
index 0000000..2da0e87
--- /dev/null
@@ -0,0 +1,56 @@
+/* XPM */
+static char * obj7_5_xpm[] = {
+"48 48 5 1",
+"      c None",
+".     c #FFFF00000000",
+"X     c #FFFF7F7F0000",
+"o     c #99997F7F4C4C",
+"O     c #FFFFFFFF0000",
+"                                                ",
+"                                                ",
+"                                                ",
+"                   .          X X  X            ",
+"           .                           X        ",
+"     .          X        .                      ",
+"    .            .X                             ",
+"          o                             .       ",
+"      X                             o   .       ",
+"                    o                     .     ",
+"                         o   X                  ",
+"                                                ",
+"                                          .     ",
+"   X    .                                       ",
+"               X         X                      ",
+"                            X                   ",
+"  X                            X                ",
+"      X         O                               ",
+"          X                              X      ",
+"   .                     o o                    ",
+"                                                ",
+"                                     o    XXX   ",
+"                   X     o  .    o            . ",
+"                                                ",
+"         X              o      O                ",
+"       .                     o                  ",
+"                     X                       .  ",
+"      X             o       o                   ",
+"                 O                              ",
+"                              O             X   ",
+"                               O                ",
+"  .                         X          X        ",
+"                            o     X             ",
+"                             o    X             ",
+"                       X                X       ",
+"        X          .                            ",
+"                     .                          ",
+"                                  X             ",
+"                         .                      ",
+"                                                ",
+"     X     X                       O            ",
+"                 oo                    .        ",
+"                                                ",
+"            .        .        .                 ",
+"           .                        .           ",
+"        .                                       ",
+"        .                                       ",
+"                                                "};
diff --git a/images/obj8-0.xpm b/images/obj8-0.xpm
new file mode 100644 (file)
index 0000000..5caa2ae
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char * obj1_0_xpm[] = {
+"32 32 7 1",
+"      c None",
+".     c #BFBFBFBFBFBF",
+"X     c #FFFFFFFFFFFF",
+"o     c #000000000000",
+"O     c #3F3F3F3F3F3F",
+"+     c #FFFF00000000",
+"@     c #7F7F7F7F7F7F",
+"                                ",
+"                                ",
+"                                ",
+"               ....             ",
+"              .XooOoo           ",
+"             .XXoXXXX.          ",
+"             ....XX+X.          ",
+"             ...OXXXX.          ",
+"             @.OOXXXX.          ",
+"             @.O.XXXX.          ",
+"             @...XXXX.          ",
+"             @..OXXXX.          ",
+"             ..OOXXXX.          ",
+"             ..O.XXXX.          ",
+"             ....XXXX.          ",
+"             ...OXXXX.          ",
+"             ..OOXXXX.          ",
+"             ..O.XXXX.          ",
+"             ....XXXX.          ",
+"             @..OXXXX.          ",
+"             @.OOXXXX.          ",
+"             @.O.XXXX.          ",
+"             @...XX+X.          ",
+"             ...oXXXX.          ",
+"             ..oooo@o           ",
+"             .@@oo@oo           ",
+"              @@@@@@            ",
+"              @@@@@             ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/images/obj8-1.xpm b/images/obj8-1.xpm
new file mode 100644 (file)
index 0000000..df6fee8
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char * obj1_1_xpm[] = {
+"32 32 7 1",
+"      c None",
+".     c #BFBFBFBFBFBF",
+"X     c #000000000000",
+"o     c #FFFFFFFFFFFF",
+"O     c #7F7F7F7F7F7F",
+"+     c #FFFF00000000",
+"@     c #3F3F3F3F3F3F",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"        ...................     ",
+"      XXoooooooooooooooooooX    ",
+"     .XOo+ooooooooooooooo+oX@   ",
+"    ..OXooooooooooooooooooo@@   ",
+"    ..XXoooooooooooooooooooX@   ",
+"    ..XXX..@@..@@..@@..@@.XX@   ",
+"    ...XOO@@OO@@OO@@OO@@OOOO@   ",
+"    ..OOOOOOOOOOOOOOOOOOOOO@    ",
+"      OO@@@@OOOOOOOO@@@@OO@     ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/images/obj8-2.xpm b/images/obj8-2.xpm
new file mode 100644 (file)
index 0000000..f11e691
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char * obj1_2_xpm[] = {
+"32 32 7 1",
+"      c None",
+".     c #BFBFBFBFBFBF",
+"X     c #FFFFFFFFFFFF",
+"o     c #000000000000",
+"O     c #3F3F3F3F3F3F",
+"+     c #FFFF00000000",
+"@     c #7F7F7F7F7F7F",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"        .....                   ",
+"       .XooXX.                  ",
+"      .XOOoX+X.                 ",
+"      .oooXXXXX.                ",
+"      ..oo.XXXXX.               ",
+"      @.@.@OXXXXX.              ",
+"       O.@OO.XXXXX.             ",
+"        O.O.@OXXXXX.            ",
+"         O.@OO.XXXXX.           ",
+"          O.O.@OXXXXX.          ",
+"           @.@OO.XXXXX.         ",
+"            @.O.@OXXXXX.        ",
+"             @.@OO.XXXXX.       ",
+"              @.O.@OXXX+X.      ",
+"               O.@OO.XXXXo      ",
+"                O.O.@OXXOo      ",
+"                 O.@.oooOo      ",
+"                  O.@.oooO      ",
+"                   @.@@@O       ",
+"                    OOOO        ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/images/obj8-3.xpm b/images/obj8-3.xpm
new file mode 100644 (file)
index 0000000..0a49af1
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char * obj1_3_xpm[] = {
+"32 32 7 1",
+"      c None",
+".     c #BFBFBFBFBFBF",
+"X     c #000000000000",
+"o     c #FFFFFFFFFFFF",
+"O     c #FFFF00000000",
+"+     c #7F7F7F7F7F7F",
+"@     c #3F3F3F3F3F3F",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                    ..X         ",
+"                   .oooXX       ",
+"                  .oOooXX+      ",
+"                 .oooooXX+      ",
+"                .ooooo+X++      ",
+"               .ooooo+++++      ",
+"              .ooooo+@++@       ",
+"             .ooooo++@+@        ",
+"            .ooooo+@++@         ",
+"           .ooooo++@+@          ",
+"          .ooooo+@+++           ",
+"         .ooooo++@++            ",
+"        .ooooo+@+++             ",
+"       XoOooo++@++              ",
+"      XXoooo+@++@               ",
+"     ..X+oo++@+@                ",
+"     ..+XXX+++@                 ",
+"     ...XX+++@                  ",
+"      ....+++                   ",
+"       ...+                     ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/images/playhilite.xpm b/images/playhilite.xpm
new file mode 100644 (file)
index 0000000..a4ecfaf
--- /dev/null
@@ -0,0 +1,312 @@
+/* XPM */
+static char *playhilite[] = {
+/* columns rows colors chars-per-pixel */
+"180 50 256 2",
+"   c #055C05",
+".  c #115905",
+"X  c #006404",
+"o  c #006609",
+"O  c #016B01",
+"+  c #006A09",
+"@  c #096C00",
+"#  c #0D6808",
+"$  c #017402",
+"%  c #007509",
+"&  c #007B02",
+"*  c #007A0A",
+"=  c #097400",
+"-  c #097B00",
+";  c #007915",
+":  c #136A00",
+">  c #12700D",
+",  c #0A7B25",
+"<  c #018301",
+"1  c #00830A",
+"2  c #008C02",
+"3  c #008B0A",
+"4  c #0A8100",
+"5  c #0A8C00",
+"6  c #0B840C",
+"7  c #008717",
+"8  c #009201",
+"9  c #00940A",
+"0  c #009B02",
+"q  c #009B09",
+"w  c #099200",
+"e  c #0B9D00",
+"r  c #009213",
+"t  c #009C12",
+"y  c #039617",
+"u  c #108400",
+"i  c #009622",
+"p  c #05922D",
+"a  c #01A301",
+"s  c #00A309",
+"d  c #00AA01",
+"f  c #00AA0B",
+"g  c #0AA400",
+"h  c #0AAC00",
+"j  c #08A40E",
+"k  c #00A617",
+"l  c #01B401",
+"z  c #00B30A",
+"x  c #00B903",
+"c  c #00BA0B",
+"v  c #09B100",
+"b  c #0BBB00",
+"n  c #00B613",
+"m  c #00B518",
+"M  c #00BA12",
+"N  c #00BA1A",
+"B  c #13AB00",
+"V  c #18A300",
+"C  c #17BB00",
+"Z  c #00B623",
+"A  c #20BD00",
+"S  c #2BA31F",
+"D  c #3CAD6F",
+"F  c #02C502",
+"G  c #00C10A",
+"H  c #02C900",
+"J  c #08C500",
+"K  c #03CA09",
+"L  c #00C11B",
+"P  c #00C316",
+"I  c #02D100",
+"U  c #00DA02",
+"Y  c #0AD702",
+"T  c #04D511",
+"R  c #16CA00",
+"E  c #10DC04",
+"W  c #00D028",
+"Q  c #01E302",
+"!  c #00E60A",
+"~  c #00EA04",
+"^  c #00EC0D",
+"/  c #0AE400",
+"(  c #0FE800",
+")  c #00EA18",
+"_  c #01F401",
+"`  c #03FD03",
+"'  c #03FD0A",
+"]  c #0CFF0A",
+"[  c #06F905",
+"{  c #00FD10",
+"}  c #0CFF11",
+"|  c #08FB17",
+" . c #11EB00",
+".. c #1CE500",
+"X. c #13FF0C",
+"o. c #15FF15",
+"O. c #14FE19",
+"+. c #18FF15",
+"@. c #1AFF1C",
+"#. c #07FD24",
+"$. c #17FF28",
+"%. c #19FF36",
+"&. c #07F233",
+"*. c #24D500",
+"=. c #28CC37",
+"-. c #23E100",
+";. c #2FF009",
+":. c #29FE36",
+">. c #39FE2A",
+",. c #32FF33",
+"<. c #33FF3A",
+"1. c #3CFF34",
+"2. c #3BFF3B",
+"3. c #27FF27",
+"4. c #3BFF4B",
+"5. c #37FF45",
+"6. c #39FF59",
+"7. c #29FF53",
+"8. c #3CFF6B",
+"9. c #36FF72",
+"0. c #44B378",
+"q. c #4CE200",
+"w. c #44FF2E",
+"e. c #45FD37",
+"r. c #55FF31",
+"t. c #63FF35",
+"y. c #41FF42",
+"u. c #47FE49",
+"i. c #4AFF59",
+"p. c #56FF48",
+"a. c #56FD56",
+"s. c #5EFF62",
+"d. c #53FF69",
+"f. c #57FF74",
+"g. c #49FF6A",
+"h. c #60E35F",
+"j. c #6DFF6D",
+"k. c #63FF67",
+"l. c #6FFF72",
+"z. c #6AFF7B",
+"x. c #75FF6C",
+"c. c #7AFF6D",
+"v. c #73FF64",
+"b. c #71FE75",
+"n. c #71FE7D",
+"m. c #7AF87A",
+"M. c #6DE178",
+"N. c #5FB4B4",
+"B. c #549FD4",
+"V. c #4EA3D3",
+"C. c #4CA7D9",
+"Z. c #52A4D5",
+"A. c #54A5D9",
+"S. c #55A8D5",
+"D. c #55A8D8",
+"F. c #58A6D4",
+"G. c #59A5DA",
+"H. c #5AAAD6",
+"J. c #5BAAD9",
+"K. c #5DB0DA",
+"L. c #51A8CE",
+"P. c #62ADDB",
+"I. c #68AEDF",
+"U. c #65B0DB",
+"Y. c #6AB2DD",
+"T. c #6DB8DF",
+"R. c #71B5DE",
+"E. c #73B8DF",
+"W. c #7BBADE",
+"Q. c #6EB3E0",
+"!. c #6EB9E0",
+"~. c #73B6E0",
+"^. c #75B8E1",
+"/. c #79B6E1",
+"(. c #7ABBE2",
+"). c #7DBDE9",
+"_. c #69AFE0",
+"`. c #5CFF83",
+"'. c #76FF80",
+"]. c #71FF93",
+"[. c #74FFA0",
+"{. c #7ECDA6",
+"}. c #7EC2E5",
+"|. c #7DC8CE",
+" X c #85FE78",
+".X c #9AFF77",
+"XX c #80FF64",
+"oX c #C5FF7B",
+"OX c #81BEE3",
+"+X c #81BEE9",
+"@X c #91BFE0",
+"#X c #8AD4B1",
+"$X c #89FF8A",
+"%X c #87FE96",
+"&X c #9AFF9B",
+"*X c #97FC97",
+"=X c #96F68A",
+"-X c #98FFA6",
+";X c #91F8A8",
+":X c #ADFF8E",
+">X c #A1FF9B",
+",X c #A4FF94",
+"<X c #B2FF9A",
+"1X c #BBFF98",
+"2X c #A4FFA2",
+"3X c #A3FFAC",
+"4X c #ABFFA2",
+"5X c #ABFFAA",
+"6X c #A4FFB0",
+"7X c #AAFFB9",
+"8X c #B4FCA3",
+"9X c #B5FFB8",
+"0X c #80CA9A",
+"qX c #84C0E4",
+"wX c #86C1E9",
+"eX c #8BC4E5",
+"rX c #8BC4E9",
+"tX c #8CC8EB",
+"yX c #8FC8E5",
+"uX c #91C6E5",
+"iX c #91C6E8",
+"pX c #93C8E6",
+"aX c #92C8EA",
+"sX c #98C8EC",
+"dX c #9BFFC6",
+"fX c #A7FFC3",
+"gX c #BCFFC5",
+"hX c #93D4D8",
+"jX c #C1FF9C",
+"kX c #DAFF9B",
+"lX c #C3FFB7",
+"zX c #FBFF93",
+"xX c #ECFFA2",
+"cX c #C6FFC9",
+"vX c #CBFFD7",
+"bX c #D9FFCD",
+"nX c #D2FFD3",
+"mX c #D3FFDB",
+"MX c #D6FFE0",
+"NX c #F7DDFF",
+"BX c #F2FFD1",
+"VX c #E9FFE4",
+"CX c #EAFFE9",
+"ZX c #E4FFE5",
+"AX c #EAFFF7",
+"SX c #FFE4E9",
+"DX c #FFEAFA",
+"FX c #F5FDE5",
+"GX c #F5FFF5",
+"HX c #FFF3F6",
+"JX c #FFF5FB",
+"KX c #FAFFF5",
+"LX c #FDFDFC",
+"PX c #F1FFFA",
+"IX c #E3E5FF",
+"UX c #ECACE5",
+/* pixels */
+"Z.Z.S.S.A.D.D.S.S.G.G.D.G.P.G.J.D.A.S.A.A.S.D.F.G.H.G.H.J.J.H.H.P.J.J.H.H.J.J.K.K.H.J.J.H.K.K.J.J.K.J.J.K.J.K.U.P.U.U.U.Y.Y.Y.Y.Y.Y.Y.Y.U.Y.Y.Y.R.R.R.R.R.R.E.W.W.(.W.OXOXOXOXOXOXOXqX@XqX@XqXeXeXeXeXeXyXuXyXiXaXiXiXiXsXpXpXsXpXsXsXpXiXiXiXuXyXeXyXeXeXeXeXeXeXeX@XeXeXeXeXeXeXeXeXeXeXeXeXeXuXeXeXyXyXeXyXeXeXuXeXuXeXuXeXeXeXuXyXuXeXeX@XrXtXtXiXiXuXiXaXiXiXaXiXaX",
+"S.A.A.S.F.G.S.H.D.A.S.D.A.A.C.J.D.D.F.F.S.H.S.D.G.J.J.J.P.J.P.J.J.J.J.P.J.P.J.I.I.P.J.U.P.P.P.P.P.P.P.P.P.P.P.P.P.U.U.U.U.U.U.U.Y.U.Y.U.Q.T.Y.Y.Y.R.~.~././.~.).(.).).).qX).).OXqXqXqXqXrXqXrXqXrXqXrXrXrXiXrXiXiXaXaXsXsXaXaXpXsXpXaXiXaXaXiXrXrXiXrXrXrXrXrXOXrXqXwXrXeXeXeXwXqXeXeXeXrXrXrXrXrXeXrXrXrXwXrXOXqXrXqXrXrXrXrXrXeXqXeXqXrXrXtXrXaXqXrXiXiXyXaXaXaXaXsXaX",
+"S.A.S.A.D.H.G.H.J.G.G.J.Z.S.L.A.A.A.Z.A.A.A.A.S.H.G.S.H.H.J.J.J.J.P.J.J.J.J.P.J.P.J.J.J.J.P.P.P.P.P.P.P.P.P.U.U.P.U.U.U.Y.Y.U.U.U.U.Y.Y.U.Y.Y.Y.Y.Y.T.!.^.^.E.(.W.(.(.OX(.OXOXOXOXOXqXqXeXqXeXeXeXeXeXyXrXyXiXyXaXyXpXpXpXpXpXpXaXaXpXpXaXiXyXaXiXaXyXyXqXeXeX@XeXeXrXrXeXeXqXqXeXeXyXyXrXyXyXyXeXiXeXyXeXeXeXeXqXyXeXqXqXyXeXyXeXyXeXeXeXyXiXiXtXiXiXaXrXyXyXaXaXaXaXaX",
+"A.S.A.H.G.H.G.F.G.J.A.A.A.A.G.D.D.D.A.Z.Z.S.A.S.S.A.G.D.H.G.G.P.J.J.J.J.J.P.G.P.P.J.P.P.J.P.J.J.P.J.P.P.P.P.U.I.I.I.Q.Q.Y.Q.T.Q.Q.Q.T.Y.~.R.R.T.R.R.R.^.^.~.E.W.W.(.(.(.}.OXW.OXW.OXOXqXqXqXqXqXeXqXeXeXyXyXyXaXaXaXaXaXaXaXsXaXaXsXsXaXaXaXaXyXyXrXeXeXyXeXeXqXqXeXeXqXwXeXeXeXeXeXeXeXyXrXeXtXqXyXeXeXeXqXeXqXeXeXqXeXqXeXqXeXeXeXeXqXeXeXrXiXeXiXrXrXaXaXaXaXaXaXaXaX",
+"A.D.D.D.D.J.D.H.G.D.C.D.D.D.L.G.D.Z.Z.Z.Z.Z.Z.S.S.S.S.S.H.H.H.S.H.H.H.H.H.H.H.J.J.J.H.H.H.P.J.P.P.J.P.J.P.P.P.U.U.U.Y.Q.T.U.U.Q.Q.Y.Y.Y.Y.Y.Y.R.R.R.~.~.E.~./.(././.(.OXOX(.OXOXOXOXOXqXqXqXqXrXqXrXrXyXrXrXeXiXaXaXyXyXyXaXaXaXaXpXyXpXaXaXaXrXiXyXrXrXrXrXrXrXrXOXiXrXrXeXrXeXtXtXrXrXaXiXrXrXrXrXrXrXeXeXqXrXOXeXrXrXrXeX+XrXqXqXqXrXrXrXOX@XuXaXtXtXaXrXiXiXaXaXiXiX",
+"S.A.J.J.H.H.J.D.F.F.N.0X;X*X;Xb.b.b.l.j.b.j.l.n.n.'.'.b.b.n.n.l.b.b.b.b.b.b.b.b.n.n.b.b.b.b.b.l.b.l.n.b.b.b.l.x.j.x.x.c.c.x.c.c.x.x.b.j.j.x.x.c.XXx.x.c.l.x.x.x.x.x.x.x.j.x.l.x.x.v.x.x.j.b.j.j.j.x.x.x.l.j.b.j.l.b.b.n.l.l.b.l.x.b.n.b.l.b.j.l.l.b.l.l.l.l.b.c.c.x.c.x.c.x.x.x.x.j.l.j.l.j.j.c.c.c.c.x.x.x.x.c.x.x.c.c.x.c.c.l.j.x.l.l.j.a.a.e.h.#XhXtXtXyXsXiXiXaXaXaX",
+"S.D.J.D.J.D.D.D.H.D.0X0X=X%Xm.j.k.s.s.k.a.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.k.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.k.s.k.a.s.s.s.s.s.s.s.s.k.s.s.s.s.s.s.s.s.s.s.s.k.s.s.s.s.s.s.k.k.k.s.s.s.s.s.s.s.k.a.k.s.s.s.s.s.s.k.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.k.a.s.s.s.s.k.s.k.s.s.k.s.s.a.a.<.O.T =.#XtXuXpXaXiXiXiXiXrX",
+"S.F.D.J.D.D.J.D.F.P.M.m.m.'.k.u.y.e.5.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.e.5.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.u.y.y.y.y.y.y.y.4.u.5.y.y.e.<.@.` b t S wXuXiXrXiXrXuXiXuX",
+"A.F.A.G.D.D.F.Z.F.G.a.a.a.a.,.$.@.+.o.+.o.o.+.+.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.+.o.o.o.o.o.o.o.+.o.o.o.o.o.o.o.+.o.o.o.o.o.o.o.o.o.+.+.o.o.o.o.o.o.o.o.O.O.+.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.O.O.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.+.o.o.o.o.o.o.o.+.o.o.o.o.o.o.o.@.@.@.+.o.o.| ` H l w 6 tXiXyXrXiXuXrXuXiX",
+"S.A.S.D.G.D.D.G.H.G.:.,.3.$.` U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U H d a 8 & rXiXrXtXiXaXrXtXuX",
+"Z.Z.S.A.D.S.F.D.F.G.@.} ] _ I x z x l x l z x z l x x l l z l x x z x l l x x l x x l x z l x x x x l x x x x l x x x z x z x l l x l l x x x x l x x l z x l x x x x l l x x l x z x x x z x x x l l x x x l x z x l l x x x l x x l x x x l x x l l x x x x x x x x l x l x z x x x x x x x x x x x x x x x l x x x x x x x l x x x z x x f a 2 1 $ rXiXyXeXyXrXuXyXyX",
+"S.S.S.S.Z.S.A.Z.F.B.| [ ` ~ J x z x l x l l l l x x z l l x x x l x x l l x z l l z x l x l l l z x x l x l x l x l l l l x x l x x z x x l l l x l x z l x x l l x x l l l x z l l x l l l l l l l z x l x x l l x x l l x x l l z x l l z x l x z x l l l l z l x x l z l x x l z l l l z l l l l l z l x x l x l l z x l x l x z l l l l l a 9 2 = rXqXeXeXrXiXrXrXiX",
+"Z.Z.Z.A.S.Z.Z.A.Z.G.' ' ` ^ H l l l l l l l l l l h l l l l l l l v l l l l v l l l l l l l l l l l l l l l l l l d l l l l l l l l d l l l l l l l h l l l l l l l l l h l l l l l l l l l l l l l l l l l l l l l l l h l l l l l l l l l l l h l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l d l l l l l l l l l l l l l d a 3 & @ tXrXrXyXrXrXtXyXrX",
+"A.Z.Z.S.Z.Z.Z.A.Z.G.] ' _ ~ J l d l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l v l l l l l l l l l l l l l l l l l l l l x l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l b l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l v l l l x l l l l l d q 8 = : wXtXeXeXrXeXtXrXqX",
+"S.S.Z.F.S.Z.Z.A.Z.Z.` ` ` ~ J x l l l h l x l l l l l l l l l h l l h l x c x l l v h l l l x l l l l l v l l l l l l l l l l b l l x c f x l d l l l l l d l x M v l l l M x l l h l x c c x c l l B B h l c l l l l l l l l l l l l l l l l h l l l l v v h h h l x x l h h l l l l l l v l l l l l l l l l l l l l l l l l x l l l l x z z 0 9 * @ rXeXwXeXeXeXeXeXeX",
+"Z.Z.Z.Z.Z.Z.S.Z.L.Z.` ` ` ~ J z l l l l l z l f x x z x x c x x G f x l l l l l d d x l l l l l l l l l l l l l l l l l l l l l l G f x x l l x x x x c x x x h c l M M l c v x d l l x z l x c x l z P N G l l l l l l l l l l l l l l l l l c z c M M M n M x G c m m M x c x l h l l l l l l l l l l l v l l l l l l l l l l l l l l l l l 0 2 & @ rXeXrXeXrXeXwXeXqX",
+"Z.S.S.Z.A.Z.Z.A.L.A.` ` _ ~ J l l l l l l l l v v l v v v v v c c f c x d x l x l l l l l x l l l l l l l l l l l l l l l l l x l l l x d x l v v v v v l v v v x l c c x z v x x x x l l x l x h l z P c l B l l l l l l l l l l l l v l l b l l l l l l l l b l l F f l l v l l l l l d l l l l l l l l l l l b l l l l l l x x x l l l z d 0 3 & @ rXqXrXeXwXqXeXeXqX",
+"A.S.A.Z.A.Z.Z.A.S.F.` ` ` ! J x l l l h x x z l l l l l l l l l v l x x x d x l x x l l z l x l l l l l l l l l l b l l l l l c d x x h x x x l l l l l l l l l x v l l v x l l d x z x l l l v l x G l h B V l l l l l l l l l l l l l l l l c G z z x l l l z c z d x x f c l l l l l l l l l l l l l l l l l x l l l l l l l l z l l x x l 0 9 & @ rXeXwXeXeXeXqXqXeX",
+"S.S.A.S.Z.S.Z.A.S.Z.` ` _ ~ J l l l x l l d l c x x z c c x z l v h x c l l f x d z z G l l l l l b l l l l l l l l l l l l l c v l l h b f l x x z z x x x z v z h l l d l v x d K x l h l x c c M f x K d G l l b l l l l l l l l l l l l l l v l l v l l l l l l h b l l l l l l l l l l l l l b l l l l x l l l l l l l l x l l l l x x z 0 3 & @ rXwXeXeXwXqXqXwXqX",
+"A.Z.S.Z.S.Z.A.A.S.Z.` ' ` ~ J x x l l l x x ] LXLXLXLXLXLXLXGX%XU h c $.KXLXLXX.l x x l z l l l l l x l b l l l l l l l l l l x v K n v l x LXLXLXLXLXLXLXLXLXLXLXLXm m LXLXLXa.x f l l h l x l 2XLXLX3XN L M l l l l l l b l l b l l l l l l xXLXLXLXKX Xc f B  XLXLXLXLX5XB l l l l l x x x l l l l l l b l l l l l l l l l l l l l l x l d 0 2 & @ qXqXwXeXqXeXqXqXqX",
+"S.S.Z.Z.Z.Z.Z.A.L.Z.[ ` ` ~ J d l x z x l d o.LXLXLXLXLXLXLXLXLXCXJ f $.LXHXLXX.d d z x x l l l l l l l l l l l l l l l l l l G h c N h v c LXLXLXLXLXLXLXLXLXLXLXLXd d LXLXLXp.d c l h v x c h 8XLXHX5Xa x d d l l l l l l l l x l l l l l l >XLXLXLXLXnXn z x mXLXLXLXLX7Xd d d l z l l x z l l l l l l l l l l l l l l l l x l l l l x z d 0 3 & @ rXqXqXeXeXqXqXqX+X",
+"A.S.S.Z.L.Z.Z.Z.Z.Z.` ] ' ~ J l l x x l x l ] LXLXLXLXLXLXLXLXLXLXt.d #.LXHXLX] d d a l x h v l l l l l l l l l l l b l l x l z h x P h l c LXLXLXLXLXLXLXLXLXLXLXLXg g LXLXLXp.a z f h h f M c 4.f.i.2.g h h z d l l l l l l l l l l l l x l 9XLXLXJXLXLXR g I LXLXLXLXLX6Xa a d d l l z x x l l l l l x l l l l l l l l l l x l l l l z l l 0 9 & @ rXqXwX@XqXqXqXqXqX",
+"A.Z.G.Z.Z.Z.Z.A.L.S.` ` ` ^ J v l x l l x z ] LXLXLX3X0 l b.LXLXLX<Xq ' KXLXLX_ f a a b 3.i.d.d.e.Y l x F +.O.o.Q f B b -.%.$._ d x z l x l z d d a LXLXLXLX8 8 w 8 q q LXLXLXi.l >.u.u.U d h h _ #.] ) Z d a W %.a.a.a.5.K l x l x l l l l l 7XLXLXCXLXLX>.e :.LXLXCXLXLX>X0 0 g g  .s.g.`.f.$.N l b x ~ %.] E H >.f.r.K x c l l x l l l l z 0 2 & @ qXqXqXqXqXqXqXqXqX",
+"S.S.Z.S.Z.V.Z.A.V.F.` ] _ ^ J v l x d l x x ] LXLXLX&X8 < / LXLXLX&X8 ' LXLXLX[ 9 q w.FXLXJXJXLXLXLXk.h l CXLXKX5XN x f CXKXLXa.x d x l z x l d d 0 LXLXLXLX2 3 < 2 2 8 LXLXLX%XnXLXLXKXCXO.x h <XLXLX1Xq w 5.FXLXHXKXLXLXAX8.l z x z l x x l 3XLXLX$XLXLXx.2 x.LXLX=XLXLX>X2 q d 4XLXLXJXHXLXLXnX .G d 8XKXKX XnXLXLXKXVX..h l d l l l l l l 0 9 & @ qXqXwX+XqXqXqXqXqX",
+"Z.Z.Z.Z.Z.Z.Z.A.L.Z.` ` _ ^ H l z x l l z x ] LXLXLXgX^ ' gXHXLXLXx.& _ KXLXLX_ 3 K KXLXLXLXLXLXLXJXLX .a p.LXLXLXc N %.LXJXLXU d x z l l l a d a 0 LXLXLXLX- * < < 3 8 JXLXLXJXLXGXLXLXLXvXk d 7XLXJXjX0 J LXLXLXfXd.MXLXHXFXG x d l d l l l 3XLXLX5.MXLXnX< nXLXCXr.LXLX:X< i [.LXLXLXLXLXLXDXHX=Xm Z 4XLXDXLXLXKXLXJXLXcXd d d l l l l l l 0 2 & @ wXOXqXqXqXqXqXqX+X",
+"A.A.A.Z.Z.Z.V.B.V.B.` ` ` ^ J v l l l v x x ] LXLXLXLXLXLXLXLXLXLX/ & ~ LXLXLX-.2 #.2XSXLX<.s -.LXLXLXp.a I LXJXLX1.f '.JXJX$Xd d d a d l d l d a 0 LXLXLXLX$ * & < 3 8 LXLXLXSX3.O.mXJXLXKXs d fXLXLX>X8 ;.HXKXLXy.e g ` I a a a d l l d l l 3XLXLX8.%XLXLX^ LXLX;Xr.LXLX1X$ 5  X9XLXcXN k -XLXLXKXs z <XLXLXLX6.a '.LXLXKXQ d d d h l l l d 0 9 & @ qXqXqXqXqXqXqXqX+X",
+"Z.Z.Z.Z.Z.A.A.C.Z.F.` ` ` ^ J v l x l l x z ] LXLXLXLXLXLXLXKXLXz.% - Q LXLXLX&.y r 8 8 K %.e.9XLXLXLXe.0 q $XLXLX.X8 nXLXLX%.q a q a l d l d l a a LXLXLXLX& * & < 9 8 LXLXLXj.& 3 <.LXLXLX8 5 2XLXLX<X8 V FXLXLXLXLXCX&Xy.g q q a d d l x d 3XLXLXi.:.LXLX-XLXLX7.r.LXLX8X$ 1 2 w 0 ' i.[.GXLXHXKXe w kXLXLXgX8 e d LXLXHXp.q a a d l l l l 0 3 & @ qXqXqXOXqXqXqXOXOX",
+"Z.Z.Z.A.Z.C.A.B.L.L.] ` _ ^ H l x x d l x l ] LXLXKXCX-X6X-Xv.Y * * < Q LXLXLXq.- < r.BXLXLXLXnXLXLXLX5.9 9 O.LXLXSXQ LXLXAXk 9 0 a a 0 d l l d d a LXLXLXLX& ; & < 0 0 LXLXLX8.& & <.LXHXLX5 5 <XLXLX<Xt 2 &.nXLXLXLXLXLXLXgXz 8 q l d d l l 3XLXLX5.H LXJXLXLXLXK w.LXLX:X$ - *.oXHXHXLXKXBXLXLXLX2 9 1XLXLX3X0 4 9 LXLXLX4.8 0 a d d l l d 0 9 & @ qXqXqXOXqXqXqXOXOX",
+"B.V.B.V.Z.V.V.A.L.B.` ` _ ^ H v z x d l x z ] LXLXLX<X$ $ $ $ = $ * = / LXLXLX-.< <.LXLXAX7.f 0 LXLXLX4.& 2 8 bXLXLXdXLXPXd.9 2 2 w 0 d d f x z l d LXLXLXLX& 1 < 5 0 a LXLXLX9.& - 1.LXLXLX- 2 -XLXLX&Xy r i i Z %.6.7XLXLXLX2.a 2 a d l l l 3XLXLX4.< ZXHXLXLXVX; w.LXLX<X* y AXLXLX;X) i f.LXLXLX7 r >XLXLXMXr < L LXLXLX6.3 2 q a d x l l 0 2 & @ qXOXqXOXqX}.OX(.qX",
+"V.V.C.C.V.A.B.A.V.Z.` ` ` ^ H v l x l l x l ] JXLXLX*X& $ * $ = 1 1 5 / LXLXLX! 7 fXLXLXmXO.' 6XLXJXLX<.2 - r e.LXLXLXLXLXR 2 2 2 w 0 d l x c x x d LXLXLXLX< < < 5 a a LXLXLX8.4 = w.LXLXLX< < 2XLXHX1X< r.zXHXVX0 1 a LXLXLX5.2 0 a d h l l 6XLXLX5.<  XLXLXLX.X* <.LXLX,X& ..LXJXLXa.~ 2.IXHXLXLX= 4 1XKXHXLXv.-.3XLXLXLXR 2 8 0 a d l d d 0 9 & @ qXOXqXOXqXqXOXqXqX",
+"V.V.V.B.B.B.C.B.L.Z.` ` ` ^ H l l l l x l l } HXLXLXdX; * & = 1 1 < 2 ~ LXLXLX) < s.LXHXLXLXLXLXFXHXLX>.$ & 3 V KXHXHXLXgX* - 2 2 8 0 d l l h c x d LXHXLXLX* 7 < 8 f f KXHXLX4.& < 1.LXJXLX1 1 -XLXLX&X< ~ LXLXLXNXUXDXHXLXCXz 8 8 a a d l l 3XLXLX4.< ,.LXJXLX6.& >.LXJX-X1 h LXLXLXJXLXLXZXLXLXLX1 ; &XLXLXLXLXLXLXLXLX>X- < 2 8 s d z l d a 3 & @ wXqX}.OXqXqXOXqX(.",
+"V.B.V.V.C.C.C.B.Z.F.` ' _ ^ J l l x c d l x ' LXKXLX3X* % & - < 2 w 8 ` GXLXLX^ & a &XLXGXLXnX_ x.LXLX&X& * 5 y ].LXLXLX7.& - < 2 8 a d d l l l l h KXKXLXLX4 3 2 w s d KXKXLX1.3 & e.LXKXKX< 1 -XLXLX>X2 & ] mXGXKXLXLXLX&XG 2 & 2 0 a d d z 4XKXLXe.4 R LXLXLXG $ e.LXKX&X* < 3.MXLXLXLXa.K KXLXKX! * ,XLXLX9X&XLXKXLX&X0 - 2 < 8 a d l l d q 2 & @ wX).qXOXqX}.OX).qX",
+"V.V.V.C.B.C.B.C.V.B.` ] _ ^ J x l l l l x d x a 0 8 & < < < < w 0 e e 0 q q 9 2 < 2 < l _ H 4 < * O < $ - < < p dXLXLXPX0 $ & < 2 0 a l l l l z x z d q 9 3 < 1 < w a d g e 8 2 < < < 3 3 2 - 4 < 1 1 2 - < < 2 x ~  .~ 8 & & & < 8 q d d z l a f q 3 2 < < 1 7 & - = & < * - < 3 2 ^ ) s 2 * & : & & < &XLXLX-X$ d ~ l & & < < 2 8 a d l l l q 9 & @ eXOX}.qXqXOXOXOXOX",
+"V.V.V.C.C.B.C.B.V.A.` ` ` ^ J l l l l x x l d f a 8 2 < < 3 9 w 0 a a l d a 9 2 2 2 9 2 2 < < 1 < 1 & & 5 m.4X9XLXJXLXXX$ & 1 < 8 a d d l l l l l l d a 8 w < & 8 w d a a a 0 3 8 < 0 r t 5 u u 2 r r < 5 2 2 2 8 < 2 2 < & 1 < 2 2 0 a d z x d e e 0 < 5 & & 7 & = - & 3 < 5 2 8 9 8 8 < < < < < & & & *XLXLX2X* < & & < < < < 2 8 a d l l d a 3 & @ OXqXqXqX).).OX).OX",
+"V.V.V.B.B.C.B.A.V.Z.` ] _ ^ J l l l l l l l l z f 0 w < 2 8 a a d z l d a a 0 0 2 9 8 8 8 2 2 2 3 1 1 2 & a.LXHXHXLXCXh < $ & 2 8 a d z l l l l l l d d 0 8 2 5 8 0 a d l d q 0 8 w 2 k q 8 5 5 2 9 t 3 5 2 2 2 0 2 2 < 2 < 3 < 2 8 q d d z z l a a 8 8 2 w 2 r 2 5 5 9 3 8 5 q 2 8 2 8 2 < < < < * 8 < 6XLXLX3X< & & < < 2 < 2 w 0 d d l l d q 2 < = OX}.qXqXqXOX(.OXOX",
+"V.V.V.V.C.B.C.C.V.Z.` ` ` ^ J z l l l x l l l n f a 8 0 8 q q f l d l l d d 0 q q 8 q 0 8 0 3 2 9 9 2 2 2 _ $X<X2Xf.L 1 & & < 8 8 d d l l l l c c c c z f q q w a q l d f f a q 8 0 a 9 s 0 0 w 8 0 0 8 a 8 q a 0 0 0 8 2 9 3 8 8 q d d l d l c f f s q q q 9 q 0 < 8 8 q 8 8 8 0 0 8 0 2 2 2 8 3 9 w 5 :.i.2.$.& & & < < 2 2 0 0 a d d l l d a 3 & @ qX(.qXOXqXOX}.W.OX",
+"V.V.V.V.B.V.C.B.L.Z.` ' ` ^ H x l l l l d x l d l a a q d a d l d x l d l a d f q 0 e a a 0 q 0 8 q 0 q q a 0 a q t t & - 2 2 w a d z l l x l l l h l a a a 0 e f f d d z z a a a a a a d a s s a 0 g 0 q d 0 q a q a 8 a 0 8 0 q a a d l l l d h a g g w a a 0 q d q 0 a a a a a q a s 0 0 w 0 q q w g s 9 8 < < 2 2 2 < 0 0 a a d d l x x d q 2 < @ qX}.OXW.OXW.OX(.(.",
+"V.V.V.V.V.V.B.C.L.S.` ` _ ^ H x d l l v l l l l d l a d d d d d l l l d x l d a d d g g a d d e e a d a d a a a q q 2 4 4 < 9 0 a d l l l l l x d x l l z f z g d f l l x l h a z d d g g d z f a g g a d d d d d d a a a q d d d d l d l l d n z l d a l a d h a d l d g h a a z d f f f d a 0 f s d a q f 0 8 2 < 2 2 0 w a a d z l z x l z q 9 & @ +XqX).OX(.(.(.(./.",
+"V.V.V.C.V.V.V.V.V.B.` #.` ~ A x x z l l x x l z l l z l z l l l l l l l z l l l l l l d z d d d d d d d d d d f s 8 2 2 2 8 0 f d z l z x z x l l l l l l d d l z l l l l z l l z l l x l z l l l d l z d l l l d l d d d d d z z l d l l l z l l x l z d l d z l d d l d z l z l d z l d d d z z d d d d a a 8 8 8 8 a a d d d d l l l x z d 0 2 & ; wXOXqXOXqX(.(.(.E.",
+"V.V.B.B.C.B.B.V.B.A.` #.' ^ F z l x x l z l l l l d d l d l d l l l l l l l l d d l l d l l l z z l z l l z d d a q 0 w 8 0 0 d d z l l l l l l l l l h l d l l d l d l l l d l d l d l h l d l l l d l l l d z l z l z l z d l l l l l l l l l l l d l l l d l h l l l d l h l l l l d l l l d l l l l d d a 0 0 0 0 a d d l v l l z l l l d e 2 * ; }.OXOXOX(.(.(.E.E.",
+"V.V.V.V.B.C.B.B.C.C./ { / ! L l l l x l l x l l l l l l v l l l l l l l l l l l l l l l l v l l l l l l l l l z d a a 0 a a d l l l l l l l l l l l l l v l l h l l l l l v l l l l l l l l l l l l v l l l l l l l l l l l x l l l l l l l l l l l l l l l l v l l l l v l l l l l l l l l l l l l l l l d d d d a d d l l l l l l x z l l a w < & + W.qX(.OX(.(./.~.R.",
+"V.V.V.V.V.V.C.B.C.V.E K C l d d d a a d a d d d a d a d a d d d a d a d a d a d d d d d a d d d a d d d d a a a a 0 0 0 0 a a a d a d d d d a d d a a d d d d d d d d d d d d d d d h d d h d d d a d d d d d d d d d d d d d d d d d d d d d d d a d d a d d d a d d d d a d d d d a d d a d d a d d d d d d q a a a a a d a d d d d d a 0 8 5 O X X (.).).(.(.(.E.R.R.",
+"B.V.V.V.V.V.V.C.C.V.j k g w w 8 2 8 2 2 8 2 8 2 8 2 8 2 8 2 2 2 w 2 2 8 2 8 2 8 2 8 2 8 2 8 2 2 2 2 2 2 2 2 2 8 2 2 3 3 2 2 2 2 2 2 2 2 8 2 2 8 2 8 8 8 8 8 8 8 8 8 8 8 8 8 w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w 8 8 8 8 8 w 8 8 8 w 8 8 8 8 8 8 8 2 8 8 2 8 2 2 8 w 2 8 2 2 8 8 2 2 8 2 8 2 8 2 8 2 2 2 2 2 2 2 8 3 9 2 2 2 9 8 9 8 < & O o   . +X}.(.(.(.E.R.R.Q.",
+"B.V.B.C.B.V.B.V.B.V.p 7 < 3 & $ * $ $ % $ $ $ $ $ $ $ $ $ $ $ * $ * $ * $ * * $ $ $ $ $ $ $ $ $ * $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ * * * % * $ * * * * * * * * & & & < < < & < < & < < & < & < < < & < < < & < < < < < < & 1 < < & < & < < & & & & & & & & * & & $ & & $ $ & $ & & $ $ & $ & & $ & $ & * * * * & & $ & * 1 * * $ $ * * * $ $ X X   . S ).W.(.).E.E.R.T.Y.",
+"C.B.C.B.C.B.V.V.Z.C.D , + ,   o o X X X X X o X X X X X X X X o o o o o o o o X X X X X o X X o X o o o o X X   X X X o X X   X X o o X o o o o o o o X O X O = $ $ $ = = $ $ - = - & - $ - - * - & - & = $ = & $ * & & $ $ $ = = $ = $ $ $ $ @ = O @ O O O @ O O O X O O O O O O O O O O X O X X O X X + + + O O O X O + + X @ X O % O X + X X   S #X).(.(.~./.~.R.Q.Y.",
+"B.C.C.V.V.V.Z.C.V.C.N.0.>       X   X X X X X   X X X o X X   X o o X o X o o X X X o X X o X X X o o X o X X . X X X X X X   O X X X X o o X o o o O O $ $ $ $ $ - & 4 < 5 < < 5 < < < < < < < < < < < < < < < - < < < < < < < < < < & < & & & & & & * $ $ $ $ $ $ O $ O O $ X O O O O O O O O O @ @ @ O O + @ @ @ % X $ O O : @ @ O O O O O # =.#X|.).OXW.(.^.~.R.Y.Y.",
+"C.B.V.B.B.V.V.B.Z.V.Z.Z.Z.D.D.Z.F.D.F.G.A.S.S.Z.S.Z.S.S.Z.Z.A.V.Z.V.Z.Z.S.A.S.G.H.G.J.J.J.P.J.P.J.P.P.P.U.P.U.U.U.U.P.U.Y.Y.U.U.Y.Y.Y.Y.Y.Y.Y.Y.R.T.R.R.R.R.R.R.R.R.R.R.R.~.R.E.^.^.^.^.E././.^.E.(.(.(./.).(.(.(.(.).}.(.OX(.qX(.OX(.(.).(.(.(././.(.(.(.(.(.(.(.W.(.(.(.).OX(.(.(.(.(.(.OX}.(.(.(.(.W.(.(.E.^.~./.^.^.E.(.(.^./.~.E.(.(.(.).W.W.(.(.(.W.(.E.E.E.R.Y.U.",
+"V.V.C.B.Z.Z.C.V.V.Z.Z.Z.S.D.D.D.G.D.D.D.D.Z.G.Z.Z.S.S.Z.A.Z.A.Z.V.Z.Z.Z.Z.S.D.D.H.H.H.H.J.J.J.P.P.P.I.U.P.U.P.Y.U.U.Y.U.U.Y.U.Y.Y.U.Y.Y.Y.Y.Y.Y.Q.R.R.R.Y.~.R.R.R.R.R.R.R.~.~.~.R.~.R.E.E.E.^.^.E./.(.^.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(./.(.(.(.(.W.(.(.(.(.OX(.OX(.(.(.(.(.(.(.(.(.(.(.(.(.^.^.^.^.^.~.~.~.R.~.E.(.E.E.(.(./.(.(.(.(.(./.(.^.R.R.Y.U.",
+"C.V.V.C.V.C.A.V.V.B.Z.Z.S.A.G.S.G.G.D.D.G.D.S.D.S.Z.S.Z.A.Z.Z.A.A.V.Z.Z.S.S.S.D.G.H.J.J.P.J.P.J.P.P.P.U.U.P.P.U.P.U.P.P.U.P.U.Y.U.U.Y.Y.Y.Y.Y.Y.Y.R.Y.R.R.R.R.Q.R.R.R.~.~.~.R.R.R.R.R.R.R.~.R.^.^.^.E.(.(.(.(.(.(.(.(.(.(.(.(.(.W.(.W.(.(.(.(.(.(.(.(.(.^.(.(.(.(./.(.(.W.(.(.(.(.}.(.(.(.(.(.(.(.(.^.(././.^.^.^.~.~.~.~.R.R.R.~.R.R.E.E.E./.E.E.(.^.(.^.(.^.~.R.Y.Y.I.",
+"C.B.V.B.B.B.Z.C.Z.A.Z.A.S.D.A.D.G.D.H.H.G.D.D.S.A.S.Z.Z.Z.Z.Z.Z.V.A.Z.Z.Z.A.S.D.G.G.J.J.J.P.J.P.K.P.P.U.P.U.U.I.U.P.I.U.U.P.P.I.U.Y.Y.U.I.Y.Y.Y.Y.Y.R.R.Q.R.R.Y.Q.T.R.T.~.Y.R.Y.T.~.R.R.R.R.R.R.~.^.^.E.E./.E.(.E.(.(.(./.(./.E./.(.(.E.(./.E.(.(.E.^.(.(.^.(./.(./.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.^.^.^.~.^.~.~.T.Q.Q.~.Q.T.R.R.R.R.R.R.E.^.^.E.E.(.(.(.E.E.~./.Y.Y.Y."
+};
diff --git a/images/police.xpm b/images/police.xpm
new file mode 100644 (file)
index 0000000..5583291
--- /dev/null
@@ -0,0 +1,66 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"48 48 11 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #0000E6",
+"c c #3F3F3F",
+"d c #007F00",
+"e c #6666E6",
+"f c #FF0000",
+"g c #00E600",
+"h c #FFFFFF",
+"i c #FFFF00",
+"j c #BFBFBF",
+/* pixels */
+"`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
+"`e`````````````````````````````````````````````e",
+"`egggggggggggggggggggggcggcggggggggggggggggggg`e",
+"`eggg`ggggggggggggggggcggcgggggggggggggggggggg`e",
+"`eajjggggggagaggggeeeeeeeeeeeeeeeeeeeeeeeegggg`e",
+"`eajjgggggggaggggee``````````````````````bgggg`e",
+"`eajjggggggagaggebeaaaaaaaaaaaaaaaaaaaaa`bgggg`e",
+"`eajjgggggaggggebeeaaaaaaaaaaaaaaaaaaaaa`bgggg`e",
+"`ecccggeaccccccbeeeaaciiiiiiaaciiiiiaaaa`bccca`e",
+"`eggggeeacccccceebeaaciiiiiiiaciiiiiiaaa`bccca`e",
+"`eg`gebeaccccccebeeaaciiccciiaciicciiiaa`bccca`e",
+"`eggebeeaccccccbeeeaaciiaaciiaciiaaciiaa`bccca`e",
+"`egebeeeacca`cceebeaaciiaaciiaciiaaciiaa`bccca`e",
+"`egeeebeacca`ccebeeaaciiiiiiiaciiaaciiaa`bccca`e",
+"`egeebeeaccccccbeeeaaciiiiiicaciiaaciiaa`bccca`e",
+"`egebeeeacccccceebeaaciiccccaaciiaaciiaa`bccca`e",
+"`egeeebeaccccccebeeaaciiaaaaaaciiaaciiaa`bccca`e",
+"`egeebeeacca`ccbeeeaaciiaaaaaaciiaaiiiaa`bccca`e",
+"`egebeeeacca`cceebeaaciiaaaaaaciiiiiicaa`bccca`e",
+"`egeeebeaccccccebeeaaciiaaaaaaciiiiicaaa`bccca`e",
+"`egeebeeaccccccbeeeaacccaaaaaaccccccaaaa`bccca`e",
+"`egebeeeacccccceebeaaaaaaaaaaaaaaaaaaaaa`bccca`e",
+"`egeeebeaccccccebeebbbbbbbbbbbbbbbbbbbbbbbccca`e",
+"`egeebeeaccccccbeebbbbbbbbbbbbbbbbbbbbbbbcccca`e",
+"`egebeeeacccccceebb`bb`bb`bb`bb`bb`bb`bbccccca`e",
+"`egeeebeaaaaaaaebbbbbbbbbbbbbbbbbbbbbbbaaaaaaa`e",
+"`egeebeebbbbbbbbb`bb`bb`bbbbb`bb`bb`bbbbbbbbbb`e",
+"`egebeebbbbbbbbbbbbbbbbb`````bbbbbbbbbbbbbbbbg`e",
+"`egeeebbb`bb`bb`bb`bhbb`ccccbbbhb`bb`bb`bbbbdg`e",
+"`egeebbbbbbbbbbbbbbabb`ccccbbbabbbbbbbbbbbbddg`e",
+"`egebbbbbbbbbbbbbbabb`ccccbbbabbbbbbbbbbbbdddg`e",
+"`eggddddddddddddddacaccccccacaaddddddddddddddg`e",
+"`egggdddddddddddddaccccccccccadddddddddddddddg`e",
+"`eggggddddddddccccccccccccccccccccccdddddddddg`e",
+"`egggggggggggaaaaccccccccccccccccccccdddgggggg`e",
+"`eggggggggggaaaaaaccccccccccccccccccccddgggggg`e",
+"`egggggggggaaaaaaaaccccccccccccccccccccdgdgggg`e",
+"`eggggggggaaaaggggaaagggggggggaaggggaaaagggggg`e",
+"`eggggdgggaaaaggggaaagggggggggaaggggaaaaggggdg`e",
+"`eggggggggaaaaaaaaaabbaaaa``aaaabbaaaaaagggggg`e",
+"`egdggggggaaaaaaaaaabbaaaahfaaaabbaaaaaaggdggg`e",
+"`eggggggggaaaaaaaaaabbaaaa``aaaabbaaaaaagggggg`e",
+"`egggggdggaaaaggaaaaaaaaaaaaaaaaaaggaaaagggggg`e",
+"`eggggggggaaaagga``a``a``aaa``aaaaggaaaagggggg`e",
+"`egdggggggaaaaggahfahfahfaaahfaaaaggaaaagggggg`e",
+"`eggggggggaaaagga``a``a``aaa``aaaaggaaaagdgggg`e",
+"`eeeeeeeeeaaaaeeeeeeeeeeeeeeeeeeeeeeaaaaeeeeeeee",
+"``````````aaaa``````````````````````aaaa````````"
+};
diff --git a/images/res.xpm b/images/res.xpm
new file mode 100644 (file)
index 0000000..38b2617
--- /dev/null
@@ -0,0 +1,58 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"48 48 3 1",
+/* colors */
+"` c #000000",
+"a c #00E600 m #000000",
+"b c #CC7E66 m #ffffff",
+/* pixels */
+"`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"`a`````````````````````````````````````````````a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbaaaaaaabbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbb``aa```aabbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aabb``aabbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aabbb`aabbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aabbb`aabbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aabbbaabbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aaaaaabbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aa``aabbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aab``aabbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbb`aabb``aabbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbaaaabbaaaabbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbb````bb````bbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`a",
+"`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+"````````````````````````````````````````````````"
+};
diff --git a/images/rightdisabled.xpm b/images/rightdisabled.xpm
new file mode 100644 (file)
index 0000000..82beec9
--- /dev/null
@@ -0,0 +1,122 @@
+/* XPM */
+static char *rightdisabled[] = {
+/* columns rows colors chars-per-pixel */
+"50 50 66 1",
+"  c #5689AC",
+". c #5A8CAC",
+"X c #568CB0",
+"o c #5A8EB3",
+"O c #5C90B3",
+"+ c #5C94BB",
+"@ c #5D99BE",
+"# c #6391AF",
+"$ c #6492B2",
+"% c #6196BB",
+"& c #629ABE",
+"* c #6895B4",
+"= c #699ABC",
+"- c #5E96C0",
+"; c #5C98C1",
+": c #6097C0",
+"> c #639BC1",
+", c #6A9DC2",
+"< c #6A9FC8",
+"1 c #709FC5",
+"2 c #66A4CD",
+"3 c #6DA1C5",
+"4 c #6CA2C8",
+"5 c #6CABD2",
+"6 c #67B0DD",
+"7 c #6CB3DD",
+"8 c #6EB8DF",
+"9 c #71A2C6",
+"0 c #73A5C9",
+"q c #75A8CB",
+"w c #7BAACD",
+"e c #73AED4",
+"r c #7EACD0",
+"t c #73B0D4",
+"y c #71B5DE",
+"u c #73B9DE",
+"i c #79B3D6",
+"p c #7CB6D9",
+"a c #7BB8DD",
+"s c #6FB5E1",
+"d c #6DBAE8",
+"f c #72B6E0",
+"g c #75B8E1",
+"h c #79B6E2",
+"j c #7BBBE2",
+"k c #7EC0E3",
+"l c #81AFD2",
+"z c #85B2D4",
+"x c #80B7D8",
+"c c #84BADC",
+"v c #8BB7D5",
+"b c #8AB7D8",
+"n c #8ABBDC",
+"m c #93BDDB",
+"M c #98BFDE",
+"N c #81BEE3",
+"B c #85C1E5",
+"V c #8AC3E6",
+"C c #8CC4E8",
+"Z c #8FC8E6",
+"A c #8CC8EA",
+"S c #92C5E5",
+"D c #90C6E8",
+"F c #91C8E6",
+"G c #94C9E9",
+"H c #99CBEB",
+/* pixels */
+"DDDDDDDDDSDDGCGDGGDGGGGGGGHGHHHHHHHHHHHGGSGDDDDDZD",
+"DCDDDDDGDGGDAGGGGGGGGGGGGGGGHHHHHHHHHHHHGGGDDDCDVZ",
+"DZCCCZCZDDGCGGHHGGHGSGDHHGHGHHHHHHHHHHHHGGDDDDZACC",
+"ZZVZZGCZDDDDGHGHHHGGHGGSGHHHHHHHHHHHHHHHSDDDDCZCVC",
+"CDCCCCDZGDDGHHSSHHHHHGHHHHHHHHHHHHHHHHHGGDDDCCCVVV",
+"VVCCCCCZSCDGHHSMSHHHHHHHHHHHHHHHHHHHGHHHDDDACCVVVV",
+"VVCDCCCZZVGGHHSMmSGHHHHHHHHHHHHHHHHHHHHHGGCCCCVVVV",
+"VCVVZCCCVVZGFFnmmbmGGGHHHHHHHHHHHHHHHHHHGGDCZVBVVB",
+"VVVCVVCCCZZCCAnvnzrnFHGHHHHHHHHHHHHHHHHHHSDCVVVVBB",
+"VVVVVVVCVZCCCVczvvwqbZGHHHGHHHHHHHHHHHHHGGDZCVBBBV",
+"VVVVVVVCVVZCCBxlzvw04cZHHHHHHHHHHHHHHHHHHGGZZVVVBB",
+"BVVVBVVCVVVCCBxlllw030cGHHHHHHHHHHHHHHHHHGGCCVBVVB",
+"VVVVVVVVBVVVCBxwwlw0199nGGGGHHGGHHHHHHHHHGGDDVVVBB",
+"VBBVBBBVVBVVVBxwwlq4999qbDGGGGGGGHHGHHHHHGGGCCVVVB",
+"BVBBVVBVBBVVNVcrwwq999q90nAZZZGGHGGHHHHGHGGGDVVNBB",
+"VVVVVBVVBBVVNCpwww0<100q04cVAAZZAGHGHHHHGGGDDCVVBB",
+"GNNGNNNGBCNVVBpwwq11,109093pVVZZCGGHGGHHGHGGDZVVBB",
+"NGNNGGNNBNVNBVpqqq0<,,909933pBBVZCZGHGGHHGGDCVVNBB",
+"NGGNNGDNBBNVBNpwq0013390990,<pNVVZDDGGHGHGGGDVVBBB",
+"GNNGNNNDBBNNVNpqq09,=,119993,,aNBVVGZDGHGGGZAVVBNB",
+"NGNNVVNNBBNNNNpwq01<,,<11109<,<aBBVVASSGHGGCCVVkBN",
+"NNNGBVCNBNNNNBpqw0<,>>,,91314,,>cVNBVCGGGGGGAVVVNN",
+"NNNNBBVVBNNkjNiq00<,>>,,,,333>,,,aBNBVZDGGDCVVNNNN",
+"NNNMBBBBBNNjjjiq00<,&=,>,=,3,,,>&,ijNNVGDDDCVVVkNN",
+"NGNNNNNNBBjjjaiq00<>&>>>>==,3,===*%eNjBCCGAVVVkBka",
+"NNNNNNNABjjajjtq00<>@@>>:%@=,=**$$4NjNBVACCCVBNNBj",
+"NNNNjNNNNkjjjjt404,:&>>>:@@&=***$3BNjjBVDCCCBBBjjj",
+"NNNNNNNNjkjjggtq04,>@:>:-@%%*##*0BNjNNVVCCCCBBNNjj",
+"kjjjjjNNNajjgjtq442:@-::@@OO###<BBjNNBBVCCVVBBjjjk",
+"jjjjjjNdNuuagg5444,>@-:@@OOO##3jNBNNBNACCCVBBNNjjj",
+"jjjjjNNNajgggg5444>:@+++OO..#,aBkNBkNCVCCVVBBNjjjj",
+"jjhjhjhdjugfgu744<>:@++OO#.#>jjjjBBBVBVCVVBBNBjjjj",
+"jjhhajhjgggf8u5<<<:+@+OO...=jjkkNNBVVVVVVBVBNjNjjg",
+"djgjgggguggf7y502<-@++$ ..=jjjjNNNNBBAVVVBBNNjjjjg",
+"gggguufhjuggf853<>;+XO...&ajjjjNjNBBBBBBNBNNNjjjja",
+"gsgsfffjuusg785<<;++X.  >jgjjNjaNNNBBBBVBNNNjNNhau",
+"88fyyfyygsfhf753<-+o . -ugjjauNNjNNNNNBBNBBNNjNjgj",
+"7yy8y8yyuggyfs5>;+o .X;gyjgkukhjjjjNNNNNjkjjNjjjjj",
+"yyyfffs7uygyf85;;+X  @gggjguajdjjjjNjNkNBjkBjNjjjg",
+"7yyy7f8yy7y8ff5;+X. ;ghagugjaajjjjkjkNjNBjjkjjjjjj",
+"s7yyysssy8yyfy5+o  ;gggyhggagjjjjjjjjkkjjjNNjNjjjj",
+"y7yyyyss88uyyf2+O -gghgugygugghhjjjjjjjkjNjNjjjjjj",
+"7777777f788yff2oX@gghgdyfggggggjgjjjjNjBNNhjjjjjjg",
+"7777776s68t8ff2o>ggggg8uffgggggjgjjjkjjBNjjjgjajjj",
+"7777776e7y7ysf2@ggguayggfffggggaajjjjjkjjjjjjhjjgj",
+"7777777yy777fy5gggggfy7fffygggsgujjjjjBjjjjjjjjgjg",
+"7777777y77hf7fggfgg7hhdfsghggghyuaajjkkjjjjhjjgggg",
+"677677y77777788fffsfffffgfgggghgagjjjjjjjhaggggggg",
+"76767s667777777y7ysyhyyygfgggfjggajjjjjgggjggsgggg",
+"666767766y7777777yyy7hfhfhgfhdyggghjgggggggggggggg"
+};
diff --git a/images/righthilite.xpm b/images/righthilite.xpm
new file mode 100644 (file)
index 0000000..da7df62
--- /dev/null
@@ -0,0 +1,276 @@
+/* XPM */
+static char *righthilite[] = {
+/* columns rows colors chars-per-pixel */
+"50 50 220 2",
+"   c #035606",
+".  c #01560C",
+"X  c #025905",
+"o  c #045B0A",
+"O  c #095504",
+"+  c #0C5D00",
+"@  c #0B5F08",
+"#  c #025B14",
+"$  c #03591C",
+"%  c #026302",
+"&  c #016409",
+"*  c #006E00",
+"=  c #006C0B",
+"-  c #02631C",
+";  c #056E13",
+":  c #016B1C",
+">  c #017402",
+",  c #017709",
+"<  c #017C01",
+"1  c #007D0C",
+"2  c #0B7D00",
+"3  c #007311",
+"4  c #00701B",
+"5  c #097817",
+"6  c #016520",
+"7  c #016541",
+"8  c #008305",
+"9  c #018A04",
+"0  c #008D09",
+"q  c #088D0E",
+"w  c #038418",
+"e  c #008916",
+"r  c #009301",
+"t  c #009409",
+"y  c #009D05",
+"u  c #0F9F11",
+"i  c #118D00",
+"p  c #1E9526",
+"a  c #199629",
+"s  c #1E9D2A",
+"d  c #01A401",
+"f  c #00A20F",
+"g  c #00AB02",
+"h  c #09A201",
+"j  c #0BA708",
+"k  c #0FA512",
+"l  c #0FAF12",
+"z  c #00B401",
+"x  c #00BC03",
+"c  c #08B402",
+"v  c #0BBC05",
+"b  c #0EB313",
+"n  c #0FB913",
+"m  c #10AE12",
+"M  c #11B112",
+"N  c #298F24",
+"B  c #218E31",
+"V  c #229426",
+"C  c #249926",
+"Z  c #219C2C",
+"A  c #299E28",
+"S  c #22A32B",
+"D  c #2FB748",
+"F  c #00C203",
+"G  c #02C10D",
+"H  c #00CB02",
+"J  c #00CD0A",
+"K  c #0CC005",
+"L  c #0ACE00",
+"P  c #0FC114",
+"I  c #01D103",
+"U  c #00D00C",
+"Y  c #00D902",
+"T  c #18D50A",
+"R  c #13DC16",
+"E  c #03E302",
+"W  c #00E109",
+"Q  c #00E902",
+"!  c #09E100",
+"~  c #09EF0B",
+"^  c #00F302",
+"/  c #03F30A",
+"(  c #01FD04",
+")  c #02FE0A",
+"_  c #09FE0F",
+"`  c #06F314",
+"'  c #00FF15",
+"]  c #0AF412",
+"[  c #0DF319",
+"{  c #0CFF12",
+"}  c #08FE19",
+"|  c #18FE1D",
+" . c #0CF320",
+".. c #11FE23",
+"X. c #1AF421",
+"o. c #1EFF29",
+"O. c #2AC837",
+"+. c #2FD438",
+"@. c #31D538",
+"#. c #2CF52C",
+"$. c #2DFE31",
+"%. c #2EFF3A",
+"&. c #32EA30",
+"*. c #32F931",
+"=. c #33FE39",
+"-. c #38F640",
+";. c #59BE7D",
+":. c #41CD4F",
+">. c #43D94B",
+",. c #47D357",
+"<. c #4DD45B",
+"1. c #4BDB52",
+"2. c #50D55D",
+"3. c #54DC5D",
+"4. c #51D561",
+"5. c #56DD61",
+"6. c #5ADE64",
+"7. c #5CDE68",
+"8. c #4DF74F",
+"9. c #49FE51",
+"0. c #56ED56",
+"q. c #55FD56",
+"w. c #56F960",
+"e. c #60DF67",
+"r. c #61DF69",
+"t. c #63DA73",
+"y. c #65E06B",
+"u. c #6CE275",
+"i. c #64F76D",
+"p. c #7BE07E",
+"a. c #5CB98F",
+"s. c #67B0DD",
+"d. c #6EB2D5",
+"f. c #6CB3DD",
+"g. c #6EB8DC",
+"h. c #75BFC9",
+"j. c #7ABDC9",
+"k. c #70B7D7",
+"l. c #70B5DE",
+"z. c #71BBD5",
+"x. c #74BBDB",
+"c. c #79BADE",
+"v. c #6EB4E1",
+"b. c #6FBAE2",
+"n. c #6DBAE8",
+"m. c #73B6E0",
+"M. c #75B9E1",
+"N. c #7AB5E2",
+"B. c #7BBBE2",
+"V. c #7BCEAC",
+"C. c #75C7BA",
+"Z. c #76C8B1",
+"A. c #7ACEB5",
+"S. c #7DCEBB",
+"D. c #7DD0AB",
+"F. c #7ED0B9",
+"G. c #69E880",
+"H. c #75E480",
+"J. c #7DE689",
+"K. c #74F39F",
+"L. c #74C4C6",
+"P. c #75C3CA",
+"I. c #79C5CC",
+"U. c #71C3D0",
+"Y. c #7AC5D2",
+"T. c #7BC1DB",
+"R. c #7BC8D2",
+"E. c #7EC0E3",
+"W. c #81BEE3",
+"Q. c #8BBDE3",
+"!. c #84DB9B",
+"~. c #84CBB3",
+"^. c #82D1AC",
+"/. c #84D3B2",
+"(. c #83D2BC",
+"). c #8CD5B4",
+"_. c #8DD4BA",
+"`. c #90D7B4",
+"'. c #92D8B9",
+"]. c #80E08E",
+"[. c #85E492",
+"{. c #89E893",
+"}. c #88CECF",
+"|. c #83C5DD",
+" X c #82C9D1",
+".X c #82CAD8",
+"XX c #8BC5DE",
+"oX c #8ACFD6",
+"OX c #8CD4C2",
+"+X c #8CD1D7",
+"@X c #8FD0D9",
+"#X c #92CBDC",
+"$X c #93D6C6",
+"%X c #94D5C9",
+"&X c #95D8C3",
+"*X c #95D8C8",
+"=X c #98D7C7",
+"-X c #98D7CB",
+";X c #99DBC5",
+":X c #9BDCC9",
+">X c #96D1D5",
+",X c #95D1DA",
+"<X c #9AD3DD",
+"1X c #85C1E4",
+"2X c #86C8E0",
+"3X c #8AC3E6",
+"4X c #8CC4E8",
+"5X c #8CC9E3",
+"6X c #8DC9EB",
+"7X c #91C5E6",
+"8X c #90C6E8",
+"9X c #93CAE5",
+"0X c #94C9E9",
+"qX c #98CBE6",
+"wX c #99CBEB",
+"eX c #94D1E2",
+"rX c #9BD4E0",
+"tX c #9BD0EE",
+"yX c #A0D7E1",
+"uX c #A1D8E4",
+/* pixels */
+"8X8X8X8X8X8X8X0X0X8X8X8X4X8X8X8XwX6X8X0X0X0X0X0X0X0XwX0XwXwXwXwXwXwXwXwXwXwXwXwXQ.0X0X0X8X8X8X8X4X8X",
+"8X4X7X7X8X8X8X6X8X8X0X7X6X8X0X8X0X0X0X6X8X0X0X0X0X0X0X0XwXwXwXwXwXtXwXwXwXwXwXwXwXwX0X8X8X8X8X5X4X4X",
+"4X5X4X7X8X8X6X7X8X7X0X6X7X#X,XeX7X8XwX0X0X0X9X0XwX0XwXwX0XwXwXwXwXwXwXwXwXwXwXQ.0X0X8X7X8X4X6X4X4X4X",
+"4X7X4X4X6X4X5X5X8X8X8X4X9X>X_.-X,XqX6X0XwX0X9X0X0XwXwX0XwXwXwXwXwXwXwXwXwXwXwXwX0X8X7X7X8X8X4X3X4X4X",
+"4X4X4X4X4X8X4X5X0X8X7X8X#X=X^.K.'.<XqX0XwX0XwX0XqXwXqXwXwXwXwXwXwXwXwXwX0XwX0XwX0X7X8X4X8X4X3X5X3X3X",
+"7X4X4X4X4X4X4X4X7X4X4X8X7X=X{.u.[.'.,XeX7XwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwX8X7X8X4X4X4X3X3X3XXX",
+"3X3X4X4X4X4X4X7X4X5X6X4X#X=X{.K.0.p.;X<XqXwXwXwXwXwXwXwXtXwXwXwXwXwXwXwX0XwXwX0X8X8X8X4X4X4X3X3X3X3X",
+"3X4X4X5X4X4X4X4X4X4X4X8XXX=XJ.i.w.&.t.;X<XqXwXwXwXwXwXwXwXwXtXwXwXwXwXwXwXwXwXwX0X0X8X4X4X3X3X3X|.3X",
+"3X3X3X3X3X3X4X4X3X5X4X4XXX*Xp.9.q.*.R 4.:X<XrXwXwXwXwXwXwXtXtXwXwXwXwXwXwXwXwXwXwX0XqX4X4X4X1X1X1X3X",
+"3X3X3X3X3X3X3X4X3X6X4X8X5X$Xu.-.9.=./ P ,.:X<XwXwXwXqXwXwXwXtXwXwXwXwXwXtXwXwXwXwXqX4X4X4X1X4X1X3X1X",
+"3X3X3X3X3X3X3X4X3X3X4X7X5X$Xy.#.$.%.} G M <.:X<XqXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwX0X0X4X4X3X4X3X3X1X1X",
+"3X3X3X3X3X3X3X4X3X3X4X4X5X-Xr.X.| o.' Y c M 2.;XyXqXqXwXqXwXqXtXwXwXwXwXwXwXwXwXwX0XqX4X7X3X3X1X1X1X",
+"XX1X3X3X3X3X3X3X1XXX4X4X5X%X7.[ .._ ) W F v M 4.;XrXqX9XwXwXwXwXwXwXwXwXwXwXwXwXwX0X0X8X4X4X5X3X1X3X",
+"3X1X3X3X3X3X1X3X3X1XQ.4X2X$X7.[ _ ) E I I H F m 4.;XrXqXqX0XwXwX0XwX0XwX0XwXwX0X0XwX0X8X4X4X4X3X1X1X",
+"3X1X3X1X1X3X3X3X3X|.1X4X|.%X7.[ ) ^ ! L F H U v b 2.;X<XqX0X0XwX0XwX0XwXwXwXwXwX0XwX0X0X4X5X4X1X4X1X",
+"3X3X1X3X1X1X1X3X1X3X3X3X2XOX7.] ( ^ Y F F H J U x b <.:X,X0X0X6X0XwXwX0XwXwX0XwXwX0X0X8X4X4X4X4X1X1X",
+"Q.W.Q.6XW.6X6XQ.1X1X3X1X|.$Xe.] ( ^ Y F x x G J H v l <.-X,XwX9X0X0X0XtX0X0XwXwX0XwX0X8X8X4X3X1X3X1X",
+"6X6XW.W.Q.W.W.6X1X3XQ.Q.|._.e.] ( ^ Y F x x F H I H v n <.-X,X#X9X0X9X0XtX0X0XwXwX0X0X8X4X3X1X1X1XW.",
+"Q.6XQ.6X6XQ.W.Q.1X1X3X3X2XOXe.] ) ^ Y F x x z F F I I x n <.;X,X9XwX0X0XqX0XwX0XwX0X0X8X4X3X3X1X1X1X",
+"6XW.W.6XW.6X6XQ.E.6X3X3X2XOX7.] ) ^ Y x z x x z x U J I F M <.*X,XXX0XwX5X0X0XwX0XwX0X8X6X3X3X1X|.W.",
+"W.6XQ.6XW.4X4X4X1X6X1X1X|.OX7.] ) ^ Y x z z x z G x H I H K b 2.&X<X7X7XwX0X0XwXwX0X0X8X4X3X3X1XW.W.",
+"Q.W.W.W.4XW.W.Q.1X1X1X1X|.OX7.] ) ^ Y x x z x x z x F F J H x k <.&X,X9X4X7X0X0X0X0X0X6X4X3X1X1XW.W.",
+"Q.W.Q.W.1X4X1X4X1X1XQ.1X|._.6.] ) ^ Y x x z x z z z x F F x G c u <.&X#X9XqX0X0X0X0X8X4X4X3X1X3XW.W.",
+"W.W.W.6X1X1XW.1X1X1X1X1X|._.7.] ) ^ Y x z z z z z z z x x z z h d q :.=X#XqXwX8X8X8X8X4X3X3X3XB.W.W.",
+"W.6XW.W.6XW.W.W.1X1XE.3X.X(.6.[ ) ^ Y F z z z z z z z z z d d i 9 , 5 t.7X4X0X5X6X8X8X4X6X1X1XW.W.c.",
+"W.B.W.W.W.W.W.W.W.E.1XW.|.(.6.[ ) ^ Y x z z z z z z g g d y 0 > & & S ~.9X6X0X8X0X4X4X4X1X1XW.W.W.W.",
+"W.W.B.W.W.W.W.W.W.1XW.W.|.(.3.[ ) ^ Y x z v z z z z z d t 1 = 6 . A `.,X9X4XqX8X8X4X3X3X1X1X1XB.B.B.",
+"B.W.W.B.B.W.W.W.1XB.B.3Xc.(.6.[ ) ^ Y F z z z z z z d r 1 ; # 6 S ).+X7XqX4X5X4X8X4X6X4X1X1XW.W.B.B.",
+"W.B.B.B.B.W.B.W.W.c.c.W.T.(.5.[ ) ^ Y x g z z z z d 9 < % X X s _.oX2X8XQ.0X1X4X4X4X3X3X1X1XB.B.W.B.",
+"B.B.B.B.B.B.B.B.B.B.c.W.T.(.5.] ) ^ Y x z z g g d r < * O @ p ^.@X6X3X4XwX1X6X6X4X4X3X3X1XW.W.B.B.B.",
+"B.B.B.B.B.B.B.W.B.c.c.B.T.(.5.[ ) ^ Y F g z d d r 8 % % O p `.}.XXQ.3X3X3X4XQ.6X3X6X3XW.1XW.E.B.B.B.",
+"B.B.B.B.B.B.B.n.B.c.M.B.z.(.3.[ ( / Y x x g g t 2 % : # s ). XXX1X1X3X3X6X3X3X6X1X1X1XQ.W.1XB.B.N.B.",
+"n.N.B.n.B.B.M.B.M.c.M.B.x.F.5.[ ) ^ I g g d r 2 = - X V /. X2X1X3X3X1X3X3X3X4X3X3X1X4XW.W.W.B.B.B.N.",
+"N.B.M.B.M.M.M.M.M.c.m.B.T.F.5./ ) ^ L c g r < + - $ C /..XB.|.W.W.1XW.1X3X1X1X3X3X1XW.W.W.W.B.B.c.B.",
+"M.M.M.M.l.x.m.M.M.M.m.B.x.F.3.[ _ Q H d 9 8 & & O C ^. XE.B.B.W.B.3XW.3X1X6X1X1XW.3XW.W.W.W.B.B.c.B.",
+"m.m.m.M.m.m.m.M.M.x.m.B.x.F.5.[ ) W z t 1 = &   C /.R.c.E.1XB.B.B.B.W.W.1X1X1X1XW.W.W.W.B.W.B.B.B.M.",
+"m.v.l.l.l.m.m.m.M.g.m.B.T.F.3.` / J f e :   o C V.R.E.B.E.k.W.B.B.W.W.1XB.1X1X1XW.W.W.W.W.B.B.B.M.B.",
+"f.m.l.l.m.l.l.m.M.m.M.M.T.A.3./ Y z 9 , X @ V D.I.B.M.E.k.B.N.B.B.B.B.1XB.1X1XB.W.W.E.E.B.W.B.B.B.M.",
+"l.l.m.v.g.g.m.l.l.l.m.M.x.A.3.T c r > & O V ^.I.c.B.M.M.W.N.B.B.B.B.B.B.B.W.W.1XW.B.B.W.W.B.B.B.B.B.",
+"f.l.f.m.v.m.v.l.l.l.M.f.T.A.1.G d < & . a /.L.x.x.M.c.M.B.M.M.B.B.B.1XB.B.E.B.W.B.W.W.W.B.W.B.B.B.B.",
+"l.f.m.f.l.v.m.v.m.g.l.l.T.F.>.j 9 3   p V.I.x.M.m.c.M.M.m.B.M.B.B.B.B.B.E.B.1XB.W.B.W.B.B.W.B.B.c.B.",
+"f.l.f.m.l.f.l.f.g.g.l.m.z.A.@.0 , X V V.P.x.M.m.m.m.M.N.B.m.B.B.B.B.B.B.B.B.B.W.B.W.W.B.E.B.B.B.B.B.",
+"f.f.f.l.f.f.f.v.s.g.m.M.z.S.+.w o N D.Y.M.m.M.m.m.m.m.M.m.B.M.B.B.B.B.B.B.B.B.B.W.W.B.B.B.B.B.B.B.c.",
+"m.f.f.f.f.f.f.m.s.g.l.m.z.S.O.; s D.I.k.m.M.d.m.m.m.m.M.M.m.M.B.M.B.B.B.B.E.1XB.B.B.B.B.B.B.B.B.B.B.",
+"f.f.f.f.f.s.f.f.s.l.f.m.g.A.D B A.P.g.g.m.l.M.m.m.m.m.M.M.M.M.M.B.B.c.B.B.B.1XW.B.N.B.B.M.M.N.B.M.B.",
+"f.f.f.f.f.f.f.l.l.f.f.v.g.L.a.Z.h.k.g.B.l.m.l.m.m.m.m.M.M.m.m.B.x.M.B.B.E.B.E.B.B.B.B.M.B.B.B.M.B.M.",
+"f.f.f.f.f.f.f.l.l.f.m.m.d.z.j.z.k.k.m.v.N.l.n.m.m.m.N.M.N.m.M.M.M.M.c.B.B.1XB.B.B.B.B.B.B.M.B.m.M.M.",
+"s.s.f.f.f.f.f.f.l.f.l.g.s.l.l.g.l.l.m.m.m.m.m.m.M.m.M.M.M.m.M.M.M.B.B.B.B.B.B.B.B.B.M.B.M.B.M.M.M.M.",
+"s.f.f.f.f.f.v.s.f.f.f.f.f.f.m.l.m.l.m.m.m.m.m.m.m.N.m.M.m.B.M.M.N.M.M.W.B.B.M.M.M.M.M.M.M.M.M.M.M.M.",
+"s.s.s.s.s.s.s.f.f.f.f.f.f.f.f.l.f.l.l.m.l.m.m.m.m.m.m.M.N.m.m.m.c.B.B.M.M.M.N.M.M.M.M.M.M.M.N.m.M.M."
+};
diff --git a/images/scbern.xpm b/images/scbern.xpm
new file mode 100644 (file)
index 0000000..046de2c
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 7 1",
+/* colors */
+"` c #000000",
+"a c #00BF00",
+"b c #3F3F3F",
+"c c #3F3FFF",
+"d c #BF7F3F",
+"e c #585858",
+"f c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff``",
+"`f`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`e`",
+"`ff`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ee`",
+"`fff```````````````````````````````````````````````````````````eee`",
+"`fff`dddddddddddddddaaddddddcccddddddddddddccc`ddddddddddddddd`eee`",
+"`fff`dd`d`dd`d`ddddaaaadddddccc`cccddddddaadcccdddddddaadad``d`eee`",
+"`fff`dd`d`dd`d`ddddaaadddddddcccccccccdddaddcccdddddddaaaa`````eee`",
+"`fff`dd`d`dd`d`dddddddd`ddddddd`dddcccdddad`cccddcccddddddd````eee`",
+"`fff````````````dddaddddddddddddddddccdddaddcc`ccc`cddddddd``d`eee`",
+"`fff`ddbbbbbbb`dddaaaddddd`dddaaddddccdddaaddcccccccccccd`d``d`eee`",
+"`fff````````b``dddaaad`ddddaaaaaaaddccdddddddccccd`dcccccdd`dd`eee`",
+"`fff`ddddddddd`dddaddddddaaaaaddddddccdd`ddddcccdddddcdcc`d`dd`eee`",
+"`fff`dddddcccc`dddaaadddddddcccccdddcddd`dddd`ddddddddddcdd`dd`eee`",
+"`fff`dd`ccccdc`cddddaadddddc`cccccccc`dd`dddd`dddddddddcc`d`dd`eee`",
+"`fff`dcccc`ddd`ccdddddddddcc`dddcccc`bbb`b`````ddddddccccdd`dd`eee`",
+"`fff`cc`dddddd`cccdddddddccb`bbd`dddbb```bbbbb`ddddcccccddd`dd`eee`",
+"`fff`d`ddddddd`dccccddddcccb`db`dddddd`````````dddcccc`dddd`dd`eee`",
+"`fff`ddddddddd`ddcccccccccdb`d`ddbbbbddddd``ddddd`ccccddddd`dd`eee`",
+"`fff`d````dddd`ddddccccccdbb`````````````````cddcccccddddd`ddd`eee`",
+"`fff`ddddd`ddd`dddddddddbbbb`bbddbbbbcccccccccccccc`ddddd`dddd`eee`",
+"`fff`dddddd`dd`dddddddddddd``dbbbddccccccccccccccc`b``````dddd`eee`",
+"`fff`ddddddd`````````ddddb`b`bbbdcccccc`bbbbbbbcccbb`bbbb`daad`eee`",
+"`fff`dddddddd``ddddddd`bb`bb`bbccccc`b````````bb```b`bb`b`daad`eee`",
+"`fff`dd`dddddd`ddddddd```b`b`bdcccc`bbb`b```b`bbbbbb`bb`b`dddd`eee`",
+"`fff`ddddddadd``dddddd``bbbb`dcccc`bbbbbb```b`bbbb`b`bb`b`dd```eee`",
+"`fff`ddd`ddddd``````````b``b`cccc`b`bb`bb``bb```bb`bbbbbb`d````eee`",
+"`fff`ddddddddd`bbbbbb````````ccc`bbb```bbbbb```bbbbbbbbb```ddd`eee`",
+"`fff`ddaddaddd`bbb``b`````````````````bbbbbbbb````````````dddd`eee`",
+"`fff`daaaddddd`b`bb`b`bbbb```cccbbb````````````````bbbb```dddd`eee`",
+"`fff`daaaadadd`b`bb`b````````cccbbbbbbbbbbbbbb`bbbbbbbbbbaaddd`eee`",
+"`fff`daadddddd`b`bb`b`bbbb``b`cc`bb```bbb``````````````b`adaad`eee`",
+"`fff`dddd`dddd``bbb`b```bb``b`ccccbbbbbbbb`````````````b`adddd`eee`",
+"`fff`d`ddddddd``b`b`b``````b``cccc`````````````````bbbb`baaadd`eee`",
+"`fff`dddddddddbbbbb`b`b```bb`bbbcccccccbbbbbbb`bbb``````badadd`eee`",
+"`fff`dddddddddbbbbb`b`bbbbbb`bbbcccccccbbbb`b``b`b``````baaadd`eee`",
+"`fff`dddd````````````````````````````cccb`b`b``bbbb``b``b`dddd`eee`",
+"`fff`dddddd`ddbb``b````ddd`b`bbbbbbbb```bbb`b``b``b`bb``b`dddd`eee`",
+"`fff`dddddddddbbbbb````d`ddb`bbbbdbbb`bcbbb`b``bb`b`b```b`dddd`eee`",
+"`fff`ddddddddd`bbbb````d``````````````ccb`b`b````bb`bb``b`dddd`eee`",
+"`fff`ddddddddd`bbbb`a`ad`bbb`bbdc`ccccccb`bbb```bbb`bbbbb``````eee`",
+"`fff`ddddddddd`b`bbb`aab`bdb`b`cc`cccccbbb`b``bbbbb`bbbbb`dddd`eee`",
+"`fff`ddd`ddddd`b`bbb`aabbdbd`bccc`c`d`bbb`````bbbbbb`aaaaadddd`eee`",
+"`fff`dddd``````````````dbdbd`bccb`bbbbb`````b````bbaa``aaaaaad`eee`",
+"`fff`ddddddddd`bbbb``b`dbbbb`bccc`b````bbb``bbbbbbbaaaaaaaaaaa`eee`",
+"`fff`ddddddddd`bbbbb`b`abbdb`bcccbbb`bbbbb`bb`bb```bbb``aadddd`eee`",
+"`fff`ddddddddd``````````bbbb`cccccbb`bbbbbb`bbbbbbbbccccccccdd`eee`",
+"`fff`ddddddddddddddd`dddbdbbdccccc`b`bbbcccc``bbbbbccccccccccc`eee`",
+"`fff`ddddddddddddddd`ddbbddad`ccccccc`ccccccccccccccccdddcccc``eee`",
+"`fff`ddddddddddddddd`ddbdddaddddcccccccccccccccccccccdddddcccc`eee`",
+"`fff`ddddddddddddddd`dddddaaddddddccccdddddcccccccdddddddddddd`eee`",
+"`fff`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`eee`",
+"`fff```````````````````````````````````````````````````````````eee`",
+"`ff`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`ee`",
+"`f`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`e`",
+"``eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/scbernhi.xpm b/images/scbernhi.xpm
new file mode 100644 (file)
index 0000000..2db8446
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 7 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #FFBF7F",
+"c c #00FF00",
+"d c #585858",
+"e c #7F7FFF",
+"f c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd``",
+"`d`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`f`",
+"`dd`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`ff`",
+"`ddd```````````````````````````````````````````````````````````fff`",
+"`ddd`bbbbbbbbbbbbbbbccbbbbbbeeebbbbbbbbbbbbeee`bbbbbbbbbbbbbbb`fff`",
+"`ddd`bb`b`bb`b`bbbbccccbbbbbeee`eeebbbbbbccbeeebbbbbbbccbcb``b`fff`",
+"`ddd`bb`b`bb`b`bbbbcccbbbbbbbeeeeeeeeebbbcbbeeebbbbbbbcccc`````fff`",
+"`ddd`bb`b`bb`b`bbbbbbbb`bbbbbbb`bbbeeebbbcb`eeebbeeebbbbbbb````fff`",
+"`ddd````````````bbbcbbbbbbbbbbbbbbbbeebbbcbbee`eee`ebbbbbbb``b`fff`",
+"`ddd`bbaaaaaaa`bbbcccbbbbb`bbbccbbbbeebbbccbbeeeeeeeeeeeb`b``b`fff`",
+"`ddd````````a``bbbcccb`bbbbcccccccbbeebbbbbbbeeeeb`beeeeebb`bb`fff`",
+"`ddd`bbbbbbbbb`bbbcbbbbbbcccccbbbbbbeebb`bbbbeeebbbbbebee`b`bb`fff`",
+"`ddd`bbbbbeeee`bbbcccbbbbbbbeeeeebbbebbb`bbbb`bbbbbbbbbbebb`bb`fff`",
+"`ddd`bb`eeeebe`ebbbbccbbbbbe`eeeeeeee`bb`bbbb`bbbbbbbbbee`b`bb`fff`",
+"`ddd`beeee`bbb`eebbbbbbbbbee`bbbeeee`aaa`a`````bbbbbbeeeebb`bb`fff`",
+"`ddd`ee`bbbbbb`eeebbbbbbbeea`aab`bbbaa```aaaaa`bbbbeeeeebbb`bb`fff`",
+"`ddd`b`bbbbbbb`beeeebbbbeeea`ba`bbbbbb`````````bbbeeee`bbbb`bb`fff`",
+"`ddd`bbbbbbbbb`bbeeeeeeeeeba`b`bbaaaabbbbb``bbbbb`eeeebbbbb`bb`fff`",
+"`ddd`b````bbbb`bbbbeeeeeebaa`````````````````ebbeeeeebbbbb`bbb`fff`",
+"`ddd`bbbbb`bbb`bbbbbbbbbaaaa`aabbaaaaeeeeeeeeeeeeee`bbbbb`bbbb`fff`",
+"`ddd`bbbbbb`bb`bbbbbbbbbbbb``baaabbeeeeeeeeeeeeeee`a``````bbbb`fff`",
+"`ddd`bbbbbbb`````````bbbba`a`aaabeeeeee`aaaaaaaeeeaa`aaaa`bccb`fff`",
+"`ddd`bbbbbbbb``bbbbbbb`aa`aa`aaeeeee`a````````aa```a`aa`a`bccb`fff`",
+"`ddd`bb`bbbbbb`bbbbbbb```a`a`abeeee`aaa`a```a`aaaaaa`aa`a`bbbb`fff`",
+"`ddd`bbbbbbcbb``bbbbbb``aaaa`beeee`aaaaaa```a`aaaa`a`aa`a`bb```fff`",
+"`ddd`bbb`bbbbb``````````a``a`eeee`a`aa`aa``aa```aa`aaaaaa`b````fff`",
+"`ddd`bbbbbbbbb`aaaaaa````````eee`aaa```aaaaa```aaaaaaaaa```bbb`fff`",
+"`ddd`bbcbbcbbb`aaa``a`````````````````aaaaaaaa````````````bbbb`fff`",
+"`ddd`bcccbbbbb`a`aa`a`aaaa```eeeaaa````````````````aaaa```bbbb`fff`",
+"`ddd`bccccbcbb`a`aa`a````````eeeaaaaaaaaaaaaaa`aaaaaaaaaaccbbb`fff`",
+"`ddd`bccbbbbbb`a`aa`a`aaaa``a`ee`aa```aaa``````````````a`cbccb`fff`",
+"`ddd`bbbb`bbbb``aaa`a```aa``a`eeeeaaaaaaaa`````````````a`cbbbb`fff`",
+"`ddd`b`bbbbbbb``a`a`a``````a``eeee`````````````````aaaa`acccbb`fff`",
+"`ddd`bbbbbbbbbaaaaa`a`a```aa`aaaeeeeeeeaaaaaaa`aaa``````acbcbb`fff`",
+"`ddd`bbbbbbbbbaaaaa`a`aaaaaa`aaaeeeeeeeaaaa`a``a`a``````acccbb`fff`",
+"`ddd`bbbb````````````````````````````eeea`a`a``aaaa``a``a`bbbb`fff`",
+"`ddd`bbbbbb`bbaa``a````bbb`a`aaaaaaaa```aaa`a``a``a`aa``a`bbbb`fff`",
+"`ddd`bbbbbbbbbaaaaa````b`bba`aaaabaaa`aeaaa`a``aa`a`a```a`bbbb`fff`",
+"`ddd`bbbbbbbbb`aaaa````b``````````````eea`a`a````aa`aa``a`bbbb`fff`",
+"`ddd`bbbbbbbbb`aaaa`c`cb`aaa`aabe`eeeeeea`aaa```aaa`aaaaa``````fff`",
+"`ddd`bbbbbbbbb`a`aaa`cca`aba`a`ee`eeeeeaaa`a``aaaaa`aaaaa`bbbb`fff`",
+"`ddd`bbb`bbbbb`a`aaa`ccaabab`aeee`e`b`aaa`````aaaaaa`cccccbbbb`fff`",
+"`ddd`bbbb``````````````babab`aeea`aaaaa`````a````aacc``ccccccb`fff`",
+"`ddd`bbbbbbbbb`aaaa``a`baaaa`aeee`a````aaa``aaaaaaaccccccccccc`fff`",
+"`ddd`bbbbbbbbb`aaaaa`a`caaba`aeeeaaa`aaaaa`aa`aa```aaa``ccbbbb`fff`",
+"`ddd`bbbbbbbbb``````````aaaa`eeeeeaa`aaaaaa`aaaaaaaaeeeeeeeebb`fff`",
+"`ddd`bbbbbbbbbbbbbbb`bbbabaabeeeee`a`aaaeeee``aaaaaeeeeeeeeeee`fff`",
+"`ddd`bbbbbbbbbbbbbbb`bbaabbcb`eeeeeee`eeeeeeeeeeeeeeeebbbeeee``fff`",
+"`ddd`bbbbbbbbbbbbbbb`bbabbbcbbbbeeeeeeeeeeeeeeeeeeeeebbbbbeeee`fff`",
+"`ddd`bbbbbbbbbbbbbbb`bbbbbccbbbbbbeeeebbbbbeeeeeeebbbbbbbbbbbb`fff`",
+"`ddd`bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`fff`",
+"`ddd```````````````````````````````````````````````````````````fff`",
+"`dd`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ff`",
+"`d`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`f`",
+"``fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/scbos.xpm b/images/scbos.xpm
new file mode 100644 (file)
index 0000000..80e5696
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 7 1",
+/* colors */
+"` c #000000",
+"a c #00BF00",
+"b c #3F3F3F",
+"c c #3F3FFF",
+"d c #BF7F3F",
+"e c #585858",
+"f c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff``",
+"`f`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`e`",
+"`ff`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ee`",
+"`fff```````````````````````````````````````````````````````````eee`",
+"`fff``ccccccccc````ddddddddddddddddddddddddddddddddcccccdddddd`eee`",
+"`fff`d`cccccccccbb````dddddddddddddddddd``````dd`dcccccdddaddd`eee`",
+"`fff`dd``ccccccccbbb``````````dddddddd``````bb``bccccdddaadddd`eee`",
+"`fff`dd```ccccccccbbcccccccbd`ddddddd``````bbbbbbcccddaadddddd`eee`",
+"`fff`ddd`bbbcccccccccccccccbcdddddd``ddd``bbbccccccddd`````ddd`eee`",
+"`fff`addd``bbccccccccccccccbcccddddd`ddd`b`cbccccc`dd`dddddddd`eee`",
+"`fff`dddddddbd```ccccccccccbccc`ddddd``bb`ccbcccc``dd`dddddddd`eee`",
+"`fff`ddadddd`ddd``bb`b`````bcccccccd`b``ccccbccb````d`dddddddd`eee`",
+"`fff`dddaddd`d`dd`bbbbbbbbbb`cccccccccccccccb``bbbb```dddddddd`eee`",
+"`fff`dddaddd```dddbb`bb```bb``cccccccccccccdbd`b`bbbb`dddddddd`eee`",
+"`fff`dddaadd```dddd````````bbb`cccccccccccdd`dbb`bb`b`dddddddd`eee`",
+"`fff`ddaaadd```ddddd``bbbb```bbcccccccccccdd``b````bb```````dd`eee`",
+"`fff`dddaad````bbbbb``bbb`````bcccccccccc``d``bb```bbbdddddddd`eee`",
+"`fff`ddddddddd`bbbb```bb``````b`cccccccccb````bbbbbbbbdddddddd`eee`",
+"`fff`ddddddddd`bbb```````b```b``ccccccccc``````bb`bbb`dddddddd`eee`",
+"`fff`ddddddd```bb````````b````bcccccccccc``````bbbb`b`dddddddd`eee`",
+"`fff`dddddd``b`b`````b```bbb``bcccccccccccbbbbbbbbbbb`dddddddd`eee`",
+"`fff`aaddd``````````bbbb`````ccccccccccccccbbbb`bbb``````````d`eee`",
+"`fff`aad````````bb``b``bb```cccccccccccccccc````bbb```dddddddd`eee`",
+"`fff`aa`ddd`````b```````bbbcccccccbb`ccccccc````bbb```dadddddd`eee`",
+"`fff`aa`ddd``````````````ccccccbb`b```bccccc`bb`b`b```ddddaddd`eee`",
+"`fff`dd`ddd`bb```bb`b`b`dbbccbbbbbb````bbbbbbbb`b`bb``dddaaddd`eee`",
+"`fff`dd`ddd`bb```bb`bbb`dcbb`b``````b```ccccc```bbbb``dddadddd`eee`",
+"`fff`dd`ddd`bbbbbb```bb`ccccbb`b````b```ccccc```b`b`````dddddd`eee`",
+"`fff`dd`ddd`````````````ccccbbbb````bb``bccccc```````````ddddd`eee`",
+"`fff`dd`ddd`bbbbbb````b`cccbbbbb`bb`bb``bccccc```````bb``ddddd`eee`",
+"`fff`dd`ddd`bbbbb`````bbcccbbbbbbb`bbb``bccccccc``````b````ddd`eee`",
+"`fff`dd`ddd`bb```b````cccc`````````b````bbccccccc`````b`````dd`eee`",
+"`fff`dd`dddbbb``bb```ccccc```````````````bcccccccbb``````dd`dd`eee`",
+"`fff`dd````bbb``````ccccc````a``````````bbccccccccccdddddddddd`eee`",
+"`fff`dd`ddd``bb`````ccccbbbaaaa```b````bbcccccccccccccc`d`d`d``eee`",
+"`fff`dddddd```bbbb`cccccb`aaaa```bbbb``bbccccccccccccccccccbbb`eee`",
+"`fff`dddddd``bbbb`bbcbbbb`aaaa`````bb``bbccccccccccccccccccccc`eee`",
+"`fff`d```````bbb`cbbbbbbb`aaa`````bbb``bbccccccccccccccccccccc`eee`",
+"`fff`aaaaad`ccccccbcb`````````````bb``bbbccccccccccccccccccccc`eee`",
+"`fff`adaaa`cccccccbb``bbbbb``bb``bb```bb`ccccccccccccccccccccc`eee`",
+"`fff`daad`ccccccccdb`bbbb```bbbb``b```bb`ccccccccccccccccccccc`eee`",
+"`fff`d`dcccccccc`ddbb``bbbbbbb`b``bb``bb`ccccccccccccccccccccc`eee`",
+"`fff``ccccccdddddddd`bbbb`bbbb`bbb````bccccccccccccccccccccccc`eee`",
+"`fff`cccccc```````````````bbb``bbb```bbcccc`cccccb``cc`bcccccc`eee`",
+"`fff`cccccdaa`dddadd`````bbbbbbb```````cc`bb`bbbbbbbb``bb`cccc`eee`",
+"`fff`ccccddaaadddbb``bbbbbbbbb``dbdddddccbbbbb````bbb``bbbcccc`eee`",
+"`fff`ccddddaaaa```bb```````````dbdd````cc```````````b`bbbbbccc`eee`",
+"`fff`dd````adaddd`ddbbddbdddddaaadbddddd`dd```bbbbbbb`bbb``ccc`eee`",
+"`fff``````b`aa`````d`dddbdddddbddaaddddd`dddd`a````````bbb``cc`eee`",
+"`fff`ddd`dddaddddddddddddddaaddddddddddd`dddddaddddddddd````cc`eee`",
+"`fff`dddddddddddddddddddddddddddddddddddddddddddddddddddddd`bb`eee`",
+"`fff```````````````````````````````````````````````````````````eee`",
+"`ff`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`ee`",
+"`f`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`e`",
+"``eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/scboshi.xpm b/images/scboshi.xpm
new file mode 100644 (file)
index 0000000..aef1b4f
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 7 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #FFBF7F",
+"c c #00FF00",
+"d c #585858",
+"e c #7F7FFF",
+"f c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd``",
+"`d`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`f`",
+"`dd`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`ff`",
+"`ddd```````````````````````````````````````````````````````````fff`",
+"`ddd``eeeeeeeee````bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbeeeeebbbbbb`fff`",
+"`ddd`b`eeeeeeeeeaa````bbbbbbbbbbbbbbbbbb``````bb`beeeeebbbcbbb`fff`",
+"`ddd`bb``eeeeeeeeaaa``````````bbbbbbbb``````aa``aeeeebbbccbbbb`fff`",
+"`ddd`bb```eeeeeeeeaaeeeeeeeab`bbbbbbb``````aaaaaaeeebbccbbbbbb`fff`",
+"`ddd`bbb`aaaeeeeeeeeeeeeeeeaebbbbbb``bbb``aaaeeeeeebbb`````bbb`fff`",
+"`ddd`cbbb``aaeeeeeeeeeeeeeeaeeebbbbb`bbb`a`eaeeeee`bb`bbbbbbbb`fff`",
+"`ddd`bbbbbbbab```eeeeeeeeeeaeee`bbbbb``aa`eeaeeee``bb`bbbbbbbb`fff`",
+"`ddd`bbcbbbb`bbb``aa`a`````aeeeeeeeb`a``eeeeaeea````b`bbbbbbbb`fff`",
+"`ddd`bbbcbbb`b`bb`aaaaaaaaaa`eeeeeeeeeeeeeeea``aaaa```bbbbbbbb`fff`",
+"`ddd`bbbcbbb```bbbaa`aa```aa``eeeeeeeeeeeeebab`a`aaaa`bbbbbbbb`fff`",
+"`ddd`bbbccbb```bbbb````````aaa`eeeeeeeeeeebb`baa`aa`a`bbbbbbbb`fff`",
+"`ddd`bbcccbb```bbbbb``aaaa```aaeeeeeeeeeeebb``a````aa```````bb`fff`",
+"`ddd`bbbccb````aaaaa``aaa`````aeeeeeeeeee``b``aa```aaabbbbbbbb`fff`",
+"`ddd`bbbbbbbbb`aaaa```aa``````a`eeeeeeeeea````aaaaaaaabbbbbbbb`fff`",
+"`ddd`bbbbbbbbb`aaa```````a```a``eeeeeeeee``````aa`aaa`bbbbbbbb`fff`",
+"`ddd`bbbbbbb```aa````````a````aeeeeeeeeee``````aaaa`a`bbbbbbbb`fff`",
+"`ddd`bbbbbb``a`a`````a```aaa``aeeeeeeeeeeeaaaaaaaaaaa`bbbbbbbb`fff`",
+"`ddd`ccbbb``````````aaaa`````eeeeeeeeeeeeeeaaaa`aaa``````````b`fff`",
+"`ddd`ccb````````aa``a``aa```eeeeeeeeeeeeeeee````aaa```bbbbbbbb`fff`",
+"`ddd`cc`bbb`````a```````aaaeeeeeeeaa`eeeeeee````aaa```bcbbbbbb`fff`",
+"`ddd`cc`bbb``````````````eeeeeeaa`a```aeeeee`aa`a`a```bbbbcbbb`fff`",
+"`ddd`bb`bbb`aa```aa`a`a`baaeeaaaaaa````aaaaaaaa`a`aa``bbbccbbb`fff`",
+"`ddd`bb`bbb`aa```aa`aaa`beaa`a``````a```eeeee```aaaa``bbbcbbbb`fff`",
+"`ddd`bb`bbb`aaaaaa```aa`eeeeaa`a````a```eeeee```a`a`````bbbbbb`fff`",
+"`ddd`bb`bbb`````````````eeeeaaaa````aa``aeeeee```````````bbbbb`fff`",
+"`ddd`bb`bbb`aaaaaa````a`eeeaaaaa`aa`aa``aeeeee```````aa``bbbbb`fff`",
+"`ddd`bb`bbb`aaaaa`````aaeeeaaaaaaa`aaa``aeeeeeee``````a````bbb`fff`",
+"`ddd`bb`bbb`aa```a````eeee`````````a````aaeeeeeee`````a`````bb`fff`",
+"`ddd`bb`bbbaaa``aa```eeeee```````````````aeeeeeeeaa``````bb`bb`fff`",
+"`ddd`bb````aaa``````eeeee````c``````````aaeeeeeeeeeebbbbbbbbbb`fff`",
+"`ddd`bb`bbb``aa`````eeeeaaacccc```a````aaeeeeeeeeeeeeee`b`b`b``fff`",
+"`ddd`bbbbbb```aaaa`eeeeea`cccc```aaaa``aaeeeeeeeeeeeeeeeeeeaaa`fff`",
+"`ddd`bbbbbb``aaaa`aaeaaaa`cccc`````aa``aaeeeeeeeeeeeeeeeeeeeee`fff`",
+"`ddd`b```````aaa`eaaaaaaa`ccc`````aaa``aaeeeeeeeeeeeeeeeeeeeee`fff`",
+"`ddd`cccccb`eeeeeeaea`````````````aa``aaaeeeeeeeeeeeeeeeeeeeee`fff`",
+"`ddd`cbccc`eeeeeeeaa``aaaaa``aa``aa```aa`eeeeeeeeeeeeeeeeeeeee`fff`",
+"`ddd`bccb`eeeeeeeeba`aaaa```aaaa``a```aa`eeeeeeeeeeeeeeeeeeeee`fff`",
+"`ddd`b`beeeeeeee`bbaa``aaaaaaa`a``aa``aa`eeeeeeeeeeeeeeeeeeeee`fff`",
+"`ddd``eeeeeebbbbbbbb`aaaa`aaaa`aaa````aeeeeeeeeeeeeeeeeeeeeeee`fff`",
+"`ddd`eeeeee```````````````aaa``aaa```aaeeee`eeeeea``ee`aeeeeee`fff`",
+"`ddd`eeeeebcc`bbbcbb`````aaaaaaa```````ee`aa`aaaaaaaa``aa`eeee`fff`",
+"`ddd`eeeebbcccbbbaa``aaaaaaaaa``babbbbbeeaaaaa````aaa``aaaeeee`fff`",
+"`ddd`eebbbbcccc```aa```````````babb````ee```````````a`aaaaaeee`fff`",
+"`ddd`bb````cbcbbb`bbaabbabbbbbcccbabbbbb`bb```aaaaaaa`aaa``eee`fff`",
+"`ddd``````a`cc`````b`bbbabbbbbabbccbbbbb`bbbb`c````````aaa``ee`fff`",
+"`ddd`bbb`bbbcbbbbbbbbbbbbbbccbbbbbbbbbbb`bbbbbcbbbbbbbbb````ee`fff`",
+"`ddd`bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`aa`fff`",
+"`ddd```````````````````````````````````````````````````````````fff`",
+"`dd`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ff`",
+"`d`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`f`",
+"``fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/scdet.xpm b/images/scdet.xpm
new file mode 100644 (file)
index 0000000..7e56da7
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 7 1",
+/* colors */
+"` c #000000",
+"a c #00BF00",
+"b c #3F3F3F",
+"c c #3F3FFF",
+"d c #BF7F3F",
+"e c #585858",
+"f c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff``",
+"`f`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`e`",
+"`ff`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ee`",
+"`fff```````````````````````````````````````````````````````````eee`",
+"`fff`dddddddddddd````````````ddddddddddddddddddddddddddddddddd`eee`",
+"`fff`dddddddddddd``ddddddddd`dddadddddddddddd`dddddddddddaaddd`eee`",
+"`fff`d`dd````ddd``d`d`````dd`dd`addddddd````````dddaaaddddaadd`eee`",
+"`fff`dddd`ddddddddddd`dd`ddd`dddaddadddd````b`ddddaadaaaaadadd`eee`",
+"`fff`d`dd`ddddddd`dd`dd`dddd`dddadadd`d`````b`dddddaaaadddaddd`eee`",
+"`fff`d``dddddaad`d``dddddd```dddaaad`d``````b`ddddddddbddddddd`eee`",
+"`fff`d```ddddaddddddd`d`dd```dddbaabbbbbbbbb`bddddddd`bddddddd`eee`",
+"`fff```dddddaddddd`d`ddd`dd```bb`````d`bbbbb`bbbbbbb`ddbddaddd`eee`",
+"`fff``ddddd`aaaad`b`ddd```````bbbbb````b``````bb```b```bbddddd`eee`",
+"`fff`dddddaaadadd````````bb```bbbbb````b``bb````bbbbbbbbb`bddc`eee`",
+"`fff`dddddddddddd```````bbbbb`bbbbb````bbbb```bbbbbbbbbbbbbddc`eee`",
+"`fff`ddddd`ddddddd``bbbbbbbbb`bbb``````b`bbb`bbbb`bbb`bbbbbdcc`eee`",
+"`fff`ddddddddddddd`bbbbbbb``````````````````````````b`bbb`ddcc`eee`",
+"`fff`dd``````````````````````````````b`b``bb`bb```b````bbbddcc`eee`",
+"`fff`dddd`dddddddd`bbbbbbbbbb```bb```b`b``bb`bb```bbbbbbbbdccc`eee`",
+"`fff`dddd`ddaadddd`bb``bbb````bbbbbbbb````bb`bb```bb```bbbbccc`eee`",
+"`fff`ddad`ddaadddd`bb`````bbb`bbbb``bb`bbbb``bb```bb````bbcccc`eee`",
+"`fff`ddad`ddd``d`d`bb````bbbb`bbbbbbbb`bbbbbb`b```bb````b`cbcc`eee`",
+"`fff`dddd`ddd`dd```bb```bbbbb`bbbbbbbb`bbbb`b`b```b`b```b`cccc`eee`",
+"`fff``````b````````bb```b```````````````bbb```b```b`b`````bccc`eee`",
+"`fff`dddd`bb```b`b`bb```bbbbb`bbbbbbbb`bbb````b``bbbb`````bbcc`eee`",
+"`fff`dddd`b````b`bbbb```bbb```bbbbbbbb`bbb```````bbbb````bbbcc`eee`",
+"`fff`dddd`b`bbbb``bbb````bbb`bb``````````b````b``bbbb``bbbb`cc`eee`",
+"`fff`dddd``bbbbb`````````bb``bbbbbbbbb`bbb````bb``bb``bb``bccc`eee`",
+"`fff`d````````````````````````````````````````b``bbb``b```bccc`eee`",
+"`fff`dddd``b`b`````````````````````bbb``````b````bbb``b```bccc`eee`",
+"`fff`addd``b`b`````````````b```b`bb``b``````b`bbbb`b``bb``bccc`eee`",
+"`fff`dadd``b`b``b````````````b```bb```````````bbbbb```bb``bccc`eee`",
+"`fff`dadd``b`b``bb`bb``bb````b````b```````````````````````bccc`eee`",
+"`fff`dadd``b`b``bb`bb``bba```b```bb```b```bbb`bb``````b``bbccc`eee`",
+"`fff````````````````b`````````````b```b```b```bb``````b`bbcccc`eee`",
+"`fff`dddd`bb`b``bb`bb``bb`b```````b```bbb`b````bb`````abbbcccc`eee`",
+"`fff`dddd`bb`b`b`b`b``bbb`bb``````bbb```bbb````b```bbbb`bbcccc`eee`",
+"`fff`dddd`bb`b`b`b`b``bbb`bb``a````a```````````bababbbb`cccccc`eee`",
+"`fff`dddd`bb```````````````````a```````````````````b``cccccccc`eee`",
+"`fff`dddd`bb``bb````````````````a`babbb`bbbbbbbb`bbbcccc`dddcc`eee`",
+"`fff`dddd`````b```bbb````````bbb`bbbbbbbb`````bbcbbcccd`daadcc`eee`",
+"`fff`dddd`bb``b`````b````````bbb``````b``cccccbcccccdd``daddcc`eee`",
+"`fff`dddd`b```b``b`bb`bb```b`bbb``bbbbbcccccccccccccddaa`ddccc`eee`",
+"`fff`dddd`b``````````````````bbbbb`ccbcccccccccccccc`da``ccccd`eee`",
+"`fff````````````bb`bbb````bbbbbbbcccccccccccccccccccccccccccdd`eee`",
+"`fff`dd````````````b````bbbbbbcccccccccccccc`ccccccccc`ddd`ddd`eee`",
+"`fff`dddd`ddddd``````bbbbbbcccccccc`dddddddddddd``dddddd``dddd`eee`",
+"`fff`dadd`ddddd``d```bbbbbbcccccdddddddddd``dd`d``d```ddd`dddd`eee`",
+"`fff`ddaa`ddddd``d``bbbbbccccdddddddddad`ddad``ddddd```dd`dddd`eee`",
+"`fff`ddddadddddd`d`bbbbcccccdddd`aaada````dddaaaadddddd```dddd`eee`",
+"`fff`ddddddddddddd`bbcccccdddddddddddddddd````dddaddaadddddddd`eee`",
+"`fff```````````````````````````````````````````````````````````eee`",
+"`ff`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`ee`",
+"`f`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`e`",
+"``eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/scdethi.xpm b/images/scdethi.xpm
new file mode 100644 (file)
index 0000000..38370fc
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 7 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #FFBF7F",
+"c c #00FF00",
+"d c #585858",
+"e c #7F7FFF",
+"f c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd``",
+"`d`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`f`",
+"`dd`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`ff`",
+"`ddd```````````````````````````````````````````````````````````fff`",
+"`ddd`bbbbbbbbbbbb````````````bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`fff`",
+"`ddd`bbbbbbbbbbbb``bbbbbbbbb`bbbcbbbbbbbbbbbb`bbbbbbbbbbbccbbb`fff`",
+"`ddd`b`bb````bbb``b`b`````bb`bb`cbbbbbbb````````bbbcccbbbbccbb`fff`",
+"`ddd`bbbb`bbbbbbbbbbb`bb`bbb`bbbcbbcbbbb````a`bbbbccbcccccbcbb`fff`",
+"`ddd`b`bb`bbbbbbb`bb`bb`bbbb`bbbcbcbb`b`````a`bbbbbccccbbbcbbb`fff`",
+"`ddd`b``bbbbbccb`b``bbbbbb```bbbcccb`b``````a`bbbbbbbbabbbbbbb`fff`",
+"`ddd`b```bbbbcbbbbbbb`b`bb```bbbaccaaaaaaaaa`abbbbbbb`abbbbbbb`fff`",
+"`ddd```bbbbbcbbbbb`b`bbb`bb```aa`````b`aaaaa`aaaaaaa`bbabbcbbb`fff`",
+"`ddd``bbbbb`ccccb`a`bbb```````aaaaa````a``````aa```a```aabbbbb`fff`",
+"`ddd`bbbbbcccbcbb````````aa```aaaaa````a``aa````aaaaaaaaa`abbe`fff`",
+"`ddd`bbbbbbbbbbbb```````aaaaa`aaaaa````aaaa```aaaaaaaaaaaaabbe`fff`",
+"`ddd`bbbbb`bbbbbbb``aaaaaaaaa`aaa``````a`aaa`aaaa`aaa`aaaaabee`fff`",
+"`ddd`bbbbbbbbbbbbb`aaaaaaa``````````````````````````a`aaa`bbee`fff`",
+"`ddd`bb``````````````````````````````a`a``aa`aa```a````aaabbee`fff`",
+"`ddd`bbbb`bbbbbbbb`aaaaaaaaaa```aa```a`a``aa`aa```aaaaaaaabeee`fff`",
+"`ddd`bbbb`bbccbbbb`aa``aaa````aaaaaaaa````aa`aa```aa```aaaaeee`fff`",
+"`ddd`bbcb`bbccbbbb`aa`````aaa`aaaa``aa`aaaa``aa```aa````aaeeee`fff`",
+"`ddd`bbcb`bbb``b`b`aa````aaaa`aaaaaaaa`aaaaaa`a```aa````a`eaee`fff`",
+"`ddd`bbbb`bbb`bb```aa```aaaaa`aaaaaaaa`aaaa`a`a```a`a```a`eeee`fff`",
+"`ddd``````a````````aa```a```````````````aaa```a```a`a`````aeee`fff`",
+"`ddd`bbbb`aa```a`a`aa```aaaaa`aaaaaaaa`aaa````a``aaaa`````aaee`fff`",
+"`ddd`bbbb`a````a`aaaa```aaa```aaaaaaaa`aaa```````aaaa````aaaee`fff`",
+"`ddd`bbbb`a`aaaa``aaa````aaa`aa``````````a````a``aaaa``aaaa`ee`fff`",
+"`ddd`bbbb``aaaaa`````````aa``aaaaaaaaa`aaa````aa``aa``aa``aeee`fff`",
+"`ddd`b````````````````````````````````````````a``aaa``a```aeee`fff`",
+"`ddd`bbbb``a`a`````````````````````aaa``````a````aaa``a```aeee`fff`",
+"`ddd`cbbb``a`a`````````````a```a`aa``a``````a`aaaa`a``aa``aeee`fff`",
+"`ddd`bcbb``a`a``a````````````a```aa```````````aaaaa```aa``aeee`fff`",
+"`ddd`bcbb``a`a``aa`aa``aa````a````a```````````````````````aeee`fff`",
+"`ddd`bcbb``a`a``aa`aa``aac```a```aa```a```aaa`aa``````a``aaeee`fff`",
+"`ddd````````````````a`````````````a```a```a```aa``````a`aaeeee`fff`",
+"`ddd`bbbb`aa`a``aa`aa``aa`a```````a```aaa`a````aa`````caaaeeee`fff`",
+"`ddd`bbbb`aa`a`a`a`a``aaa`aa``````aaa```aaa````a```aaaa`aaeeee`fff`",
+"`ddd`bbbb`aa`a`a`a`a``aaa`aa``c````c```````````acacaaaa`eeeeee`fff`",
+"`ddd`bbbb`aa```````````````````c```````````````````a``eeeeeeee`fff`",
+"`ddd`bbbb`aa``aa````````````````c`acaaa`aaaaaaaa`aaaeeee`bbbee`fff`",
+"`ddd`bbbb`````a```aaa````````aaa`aaaaaaaa`````aaeaaeeeb`bccbee`fff`",
+"`ddd`bbbb`aa``a`````a````````aaa``````a``eeeeeaeeeeebb``bcbbee`fff`",
+"`ddd`bbbb`a```a``a`aa`aa```a`aaa``aaaaaeeeeeeeeeeeeebbcc`bbeee`fff`",
+"`ddd`bbbb`a``````````````````aaaaa`eeaeeeeeeeeeeeeee`bc``eeeeb`fff`",
+"`ddd````````````aa`aaa````aaaaaaaeeeeeeeeeeeeeeeeeeeeeeeeeeebb`fff`",
+"`ddd`bb````````````a````aaaaaaeeeeeeeeeeeeee`eeeeeeeee`bbb`bbb`fff`",
+"`ddd`bbbb`bbbbb``````aaaaaaeeeeeeee`bbbbbbbbbbbb``bbbbbb``bbbb`fff`",
+"`ddd`bcbb`bbbbb``b```aaaaaaeeeeebbbbbbbbbb``bb`b``b```bbb`bbbb`fff`",
+"`ddd`bbcc`bbbbb``b``aaaaaeeeebbbbbbbbbcb`bbcb``bbbbb```bb`bbbb`fff`",
+"`ddd`bbbbcbbbbbb`b`aaaaeeeeebbbb`cccbc````bbbccccbbbbbb```bbbb`fff`",
+"`ddd`bbbbbbbbbbbbb`aaeeeeebbbbbbbbbbbbbbbb````bbbcbbccbbbbbbbb`fff`",
+"`ddd```````````````````````````````````````````````````````````fff`",
+"`dd`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ff`",
+"`d`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`f`",
+"``fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/scdull.xpm b/images/scdull.xpm
new file mode 100644 (file)
index 0000000..1313ac5
--- /dev/null
@@ -0,0 +1,72 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 8 1",
+/* colors */
+"` c #000000",
+"a c #00BF00",
+"b c #3F3F3F",
+"c c #3F3FFF",
+"d c #BF7F3F",
+"e c #003F00",
+"f c #585858",
+"g c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg``",
+"`g`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`f`",
+"`gg`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`ff`",
+"`ggg```````````````````````````````````````````````````````````fff`",
+"`ggg`ddddddddddddddddddedcccdddddddddddddddddddddddddddddddddd`fff`",
+"`ggg`ddddddddddddedddddddcccdddddddddddddddddddddddddddddddddd`fff`",
+"`ggg`ddedddddddddddddddddcccdddddedddddddeddddddddddeddddddddd`fff`",
+"`ggg`dddddaaaaddddaadddddcccdddddddddddddddddddddddddddddddddd`fff`",
+"`ggg`dddddaadedddaaadddddcccddddddaaaddddddddddddddddddddddddd`fff`",
+"`ggg`dddddddddddaadadddd`ccccdddddaaaddddddddddddddddedddddddd`fff`",
+"`ggg`dddddaddddddddddddddccccdddddddddddddddddddeddddddddddddd`fff`",
+"`ggg`dddddddddddddddddddddcccc`dddddddddddddddddddddddddeddddd`fff`",
+"`ggg`ddeddddddddddddddddddd`ccccddddddddddddaddddddddddddddddd`fff`",
+"`ggg`dddddaaddddddddedadddddcccccddddddddaaaaddddddddddddddddd`fff`",
+"`ggg`ddddddaaaaaaddddadddddddccccdddddddaaaaadddddddddddddddcd`fff`",
+"`ggg`ddddddedadddadddedaaaddddccccddddddddaaadddddddddddddcccd`fff`",
+"`ggg`dddddddddddaadddddaaaadddccccddddddddddddddddddddddcccddd`fff`",
+"`ggg`dddddddddddddddddddddadddcccccddddddddddddddccccccccddddd`fff`",
+"`ggg`ddaddddddaddddddddddddcccccccccdddddddcccccccdddcccdddddd`fff`",
+"`ggg`ddddddaaaaddddddcccddcccccccccccd`dddccddddddaddddccddddd`fff`",
+"`ggg`ddeaaacccccccccccccccccccccddddcccccccdddddddaaddddcddddd`fff`",
+"`ggg`dddddccddcccccccccccccccc`ddddddddddddddddddddaaadddcdddd`fff`",
+"`ggg`dddcccdddc`cccccccccddddddddd``dddddddddddddedddadddccddd`fff`",
+"`ggg`ddccddddcccccdddddddddddddd`bb`d`bbbaaddaaaddddddddddcddd`fff`",
+"`ggg`dccdddddccccdddddddddd`dddd`bb`d`bbbddddaaaadddddddddcddd`fff`",
+"`ggg`ccdddddcccccdddddddd````````bb`bddbbdddddddddddddddaddddd`fff`",
+"`ggg`cddddddccccddddddddd`b`bbbb`bb`b`bb`dddddddddedddddaddedd`fff`",
+"`ggg`dddddddccccddddadddd`b`bbb```````b````dddadddddddaadddddd`fff`",
+"`ggg`dadddddcccddaaaaddd``b`bbbbb`bbbbbd`bbdddddaddaaddadadddd`fff`",
+"`ggg`daadddccccddadaaddd````````b`b````d`bbdddddaadddddadadddd`fff`",
+"`ggg`aaaaadccccddaaaaadddd`bb`bb`````b````````dddadedddaedaddd`fff`",
+"`ggg`dddaadccccdddddaddddd`bb`bb`bb`bb`d`dbbddddddddddddaddddd`fff`",
+"`ggg`ddddddcccccdddddddddd``b`bb`bb`bb`dddbbdddaddaddddddaaddd`fff`",
+"`ggg`dddddddccccddddddddddd``````bb`bb`ddddddddaaadddddddaaddd`fff`",
+"`ggg`dddddddcccccddddddddddddddddddddddddcccdddddaaddddddaaadd`fff`",
+"`ggg`ddddddddcccccdddddddddddd`d`ccccccccceccddddddddddddddddd`fff`",
+"`ggg`ddddeddddccccccc`ddd`cccccccccccccdddddcccdddddd`ddddeddd`fff`",
+"`ggg`ddddddddddccccccccdcccccccccccccccccdddddccddddcccdeddddd`fff`",
+"`ggg`dddddddddddccccccccccccccdededeccccccdddddccdccccccdddddd`fff`",
+"`ggg`ddddddddddddccccccccc`dddddddddedcccccdddddcccccccceddddd`fff`",
+"`ggg`dddddddddddddccc`dddddddddddddddddcccccdddddedecccedddddd`fff`",
+"`ggg`ddddaddddddddddcccc`dddddddddaaddddcccccdddddddededdedddd`fff`",
+"`ggg`ddddadddddddddddddcccddddddaddddddddccccddddddddddddddddd`fff`",
+"`ggg`ddadddddddddddddddddccdddddaeddaaddddcccdddddddddddddddad`fff`",
+"`ggg`ddaaaeddddddaddddddddcddddddddddddddddcccdeddddaddaaaddad`fff`",
+"`ggg`ddddddaaaeddaddddddddcdddddddddddedddeccccddddddddddddddd`fff`",
+"`ggg`ddddddddadadddddeddddccdddaaddddadddddcccccdddddddaeddddd`fff`",
+"`ggg`dddddddddddaaaadddddddcddddddadaddaddddcccccddaaddddddddd`fff`",
+"`ggg`ddddedadddddddddddddddcddddedaddeddaddddccccedddaddeddddd`fff`",
+"`ggg`ddddddddddddddaddddddccddddddddddddddddddcccccddddddddddd`fff`",
+"`ggg`dddddddddddddddddddddcedddddddddddddddddecccccedddddddddd`fff`",
+"`ggg```````````````````````````````````````````````````````````fff`",
+"`gg`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ff`",
+"`g`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`f`",
+"``fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/scdullhi.xpm b/images/scdullhi.xpm
new file mode 100644 (file)
index 0000000..2f3ffae
--- /dev/null
@@ -0,0 +1,72 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 8 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #FFBF7F",
+"c c #00FF00",
+"d c #007F00",
+"e c #585858",
+"f c #7F7FFF",
+"g c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee``",
+"`e`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`g`",
+"`ee`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`gg`",
+"`eee```````````````````````````````````````````````````````````ggg`",
+"`eee`bbbbbbbbbbbbbbbbbbdbfffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`ggg`",
+"`eee`bbbbbbbbbbbbdbbbbbbbfffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`ggg`",
+"`eee`bbdbbbbbbbbbbbbbbbbbfffbbbbbdbbbbbbbdbbbbbbbbbbdbbbbbbbbb`ggg`",
+"`eee`bbbbbccccbbbbccbbbbbfffbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`ggg`",
+"`eee`bbbbbccbdbbbcccbbbbbfffbbbbbbcccbbbbbbbbbbbbbbbbbbbbbbbbb`ggg`",
+"`eee`bbbbbbbbbbbccbcbbbb`ffffbbbbbcccbbbbbbbbbbbbbbbbdbbbbbbbb`ggg`",
+"`eee`bbbbbcbbbbbbbbbbbbbbffffbbbbbbbbbbbbbbbbbbbdbbbbbbbbbbbbb`ggg`",
+"`eee`bbbbbbbbbbbbbbbbbbbbbffff`bbbbbbbbbbbbbbbbbbbbbbbbbdbbbbb`ggg`",
+"`eee`bbdbbbbbbbbbbbbbbbbbbb`ffffbbbbbbbbbbbbcbbbbbbbbbbbbbbbbb`ggg`",
+"`eee`bbbbbccbbbbbbbbdbcbbbbbfffffbbbbbbbbccccbbbbbbbbbbbbbbbbb`ggg`",
+"`eee`bbbbbbccccccbbbbcbbbbbbbffffbbbbbbbcccccbbbbbbbbbbbbbbbfb`ggg`",
+"`eee`bbbbbbdbcbbbcbbbdbcccbbbbffffbbbbbbbbcccbbbbbbbbbbbbbfffb`ggg`",
+"`eee`bbbbbbbbbbbccbbbbbccccbbbffffbbbbbbbbbbbbbbbbbbbbbbfffbbb`ggg`",
+"`eee`bbbbbbbbbbbbbbbbbbbbbcbbbfffffbbbbbbbbbbbbbbffffffffbbbbb`ggg`",
+"`eee`bbcbbbbbbcbbbbbbbbbbbbfffffffffbbbbbbbfffffffbbbfffbbbbbb`ggg`",
+"`eee`bbbbbbccccbbbbbbfffbbfffffffffffb`bbbffbbbbbbcbbbbffbbbbb`ggg`",
+"`eee`bbdcccfffffffffffffffffffffbbbbfffffffbbbbbbbccbbbbfbbbbb`ggg`",
+"`eee`bbbbbffbbffffffffffffffff`bbbbbbbbbbbbbbbbbbbbcccbbbfbbbb`ggg`",
+"`eee`bbbfffbbbf`fffffffffbbbbbbbbb``bbbbbbbbbbbbbdbbbcbbbffbbb`ggg`",
+"`eee`bbffbbbbfffffbbbbbbbbbbbbbb`aa`b`aaaccbbcccbbbbbbbbbbfbbb`ggg`",
+"`eee`bffbbbbbffffbbbbbbbbbb`bbbb`aa`b`aaabbbbccccbbbbbbbbbfbbb`ggg`",
+"`eee`ffbbbbbfffffbbbbbbbb````````aa`abbaabbbbbbbbbbbbbbbcbbbbb`ggg`",
+"`eee`fbbbbbbffffbbbbbbbbb`a`aaaa`aa`a`aa`bbbbbbbbbdbbbbbcbbdbb`ggg`",
+"`eee`bbbbbbbffffbbbbcbbbb`a`aaa```````a````bbbcbbbbbbbccbbbbbb`ggg`",
+"`eee`bcbbbbbfffbbccccbbb``a`aaaaa`aaaaab`aabbbbbcbbccbbcbcbbbb`ggg`",
+"`eee`bccbbbffffbbcbccbbb````````a`a````b`aabbbbbccbbbbbcbcbbbb`ggg`",
+"`eee`cccccbffffbbcccccbbbb`aa`aa`````a````````bbbcbdbbbcdbcbbb`ggg`",
+"`eee`bbbccbffffbbbbbcbbbbb`aa`aa`aa`aa`b`baabbbbbbbbbbbbcbbbbb`ggg`",
+"`eee`bbbbbbfffffbbbbbbbbbb``a`aa`aa`aa`bbbaabbbcbbcbbbbbbccbbb`ggg`",
+"`eee`bbbbbbbffffbbbbbbbbbbb``````aa`aa`bbbbbbbbcccbbbbbbbccbbb`ggg`",
+"`eee`bbbbbbbfffffbbbbbbbbbbbbbbbbbbbbbbbbfffbbbbbccbbbbbbcccbb`ggg`",
+"`eee`bbbbbbbbfffffbbbbbbbbbbbb`b`fffffffffdffbbbbbbbbbbbbbbbbb`ggg`",
+"`eee`bbbbdbbbbfffffff`bbb`fffffffffffffbbbbbfffbbbbbb`bbbbdbbb`ggg`",
+"`eee`bbbbbbbbbbffffffffbfffffffffffffffffbbbbbffbbbbfffbdbbbbb`ggg`",
+"`eee`bbbbbbbbbbbffffffffffffffbdbdbdffffffbbbbbffbffffffbbbbbb`ggg`",
+"`eee`bbbbbbbbbbbbfffffffff`bbbbbbbbbdbfffffbbbbbffffffffdbbbbb`ggg`",
+"`eee`bbbbbbbbbbbbbfff`bbbbbbbbbbbbbbbbbfffffbbbbbdbdfffdbbbbbb`ggg`",
+"`eee`bbbbcbbbbbbbbbbffff`bbbbbbbbbccbbbbfffffbbbbbbbdbdbbdbbbb`ggg`",
+"`eee`bbbbcbbbbbbbbbbbbbfffbbbbbbcbbbbbbbbffffbbbbbbbbbbbbbbbbb`ggg`",
+"`eee`bbcbbbbbbbbbbbbbbbbbffbbbbbcdbbccbbbbfffbbbbbbbbbbbbbbbcb`ggg`",
+"`eee`bbcccdbbbbbbcbbbbbbbbfbbbbbbbbbbbbbbbbfffbdbbbbcbbcccbbcb`ggg`",
+"`eee`bbbbbbcccdbbcbbbbbbbbfbbbbbbbbbbbdbbbdffffbbbbbbbbbbbbbbb`ggg`",
+"`eee`bbbbbbbbcbcbbbbbdbbbbffbbbccbbbbcbbbbbfffffbbbbbbbcdbbbbb`ggg`",
+"`eee`bbbbbbbbbbbccccbbbbbbbfbbbbbbcbcbbcbbbbfffffbbccbbbbbbbbb`ggg`",
+"`eee`bbbbdbcbbbbbbbbbbbbbbbfbbbbdbcbbdbbcbbbbffffdbbbcbbdbbbbb`ggg`",
+"`eee`bbbbbbbbbbbbbbcbbbbbbffbbbbbbbbbbbbbbbbbbfffffbbbbbbbbbbb`ggg`",
+"`eee`bbbbbbbbbbbbbbbbbbbbbfdbbbbbbbbbbbbbbbbbdfffffdbbbbbbbbbb`ggg`",
+"`eee```````````````````````````````````````````````````````````ggg`",
+"`ee`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`gg`",
+"`e`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`g`",
+"``ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/scenario1hilite.xpm b/images/scenario1hilite.xpm
new file mode 100644 (file)
index 0000000..51ecc80
--- /dev/null
@@ -0,0 +1,450 @@
+/* XPM */
+static char *scenario_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"209 188 256 2",
+"   c #313632",
+".  c #172013",
+"X  c #1C3D68",
+"o  c #1A3D72",
+"O  c #233D65",
+"+  c #233D6B",
+"@  c #293C68",
+"#  c #243D72",
+"$  c #353C6D",
+"%  c #253556",
+"&  c #334337",
+"*  c #215C25",
+"=  c #1C426B",
+"-  c #1C4266",
+";  c #1C4674",
+":  c #18537B",
+">  c #364448",
+",  c #224165",
+"<  c #22426B",
+"1  c #28426A",
+"2  c #234271",
+"3  c #264776",
+"4  c #235579",
+"5  c #29587A",
+"6  c #3A5A72",
+"7  c #39587A",
+"8  c #38486D",
+"9  c #244862",
+"0  c #553831",
+"q  c #6F4A38",
+"w  c #585E32",
+"e  c #4E4D49",
+"r  c #41746A",
+"t  c #576469",
+"y  c #6D574D",
+"u  c #746453",
+"i  c #5F6668",
+"p  c #433C48",
+"a  c #1C5586",
+"s  c #1B6797",
+"d  c #1B74AD",
+"f  c #255687",
+"g  c #3C5684",
+"h  c #3B5988",
+"j  c #25538C",
+"k  c #276A95",
+"l  c #2C7091",
+"z  c #336E91",
+"x  c #266BA3",
+"c  c #2978A9",
+"v  c #2779B5",
+"b  c #327AAA",
+"n  c #3379B0",
+"m  c #285FA0",
+"M  c #197DC7",
+"N  c #44568A",
+"B  c #435886",
+"V  c #44598C",
+"C  c #465687",
+"Z  c #445990",
+"A  c #50558E",
+"S  c #54799B",
+"D  c #4D6E98",
+"F  c #4F72A5",
+"G  c #645EAC",
+"H  c #5D63ED",
+"J  c #5F69E2",
+"K  c #5A63F1",
+"L  c #5662F7",
+"P  c #6B67DB",
+"I  c #7A6AC9",
+"U  c #7268D3",
+"Y  c #7467D9",
+"T  c #696FCA",
+"R  c #6365E6",
+"E  c #6164E9",
+"W  c #6865E1",
+"Q  c #6D61E8",
+"!  c #5E6BDC",
+"~  c #353885",
+"^  c #36B22F",
+"/  c #01DC00",
+"(  c #0BDB05",
+")  c #0DD706",
+"_  c #17D70B",
+"`  c #00E300",
+"'  c #00EA00",
+"]  c #0AE204",
+"[  c #00F100",
+"{  c #13E308",
+"}  c #25CB09",
+"|  c #23CF03",
+" . c #2ACC14",
+".. c #24D404",
+"X. c #25DA04",
+"o. c #20D60F",
+"O. c #27D312",
+"+. c #37C91A",
+"@. c #32D117",
+"#. c #2ADC0D",
+"$. c #4BBD24",
+"%. c #58B92A",
+"&. c #6BAD33",
+"*. c #61B42E",
+"=. c #68B232",
+"-. c #77A939",
+";. c #76B535",
+":. c #679533",
+">. c #578F5A",
+",. c #41C51E",
+"<. c #48C222",
+"1. c #53C127",
+"2. c #73C735",
+"3. c #3EA147",
+"4. c #1986BC",
+"5. c #0E85B9",
+"6. c #2585BB",
+"7. c #3480AC",
+"8. c #3586BA",
+"9. c #2C89B2",
+"0. c #1583C4",
+"q. c #1A85C5",
+"w. c #1C89C4",
+"e. c #1B89C9",
+"r. c #1886C8",
+"t. c #198CCB",
+"y. c #228AC4",
+"u. c #238BCA",
+"i. c #2A8DCB",
+"p. c #2687C6",
+"a. c #278AD1",
+"s. c #2D91CC",
+"d. c #2793C8",
+"f. c #2A93D2",
+"g. c #378CC5",
+"h. c #3394CD",
+"j. c #3896CD",
+"k. c #3C99CE",
+"l. c #3495C7",
+"z. c #3494D0",
+"x. c #3A96D0",
+"c. c #3C99D0",
+"v. c #3499D5",
+"b. c #328DD1",
+"n. c #39A1D0",
+"m. c #4D8BB1",
+"M. c #679AB7",
+"N. c #6E94A8",
+"B. c #69919D",
+"V. c #4597CA",
+"C. c #429CD1",
+"Z. c #489ED3",
+"A. c #4497D5",
+"S. c #579BC6",
+"D. c #4BA1D4",
+"F. c #45A0D3",
+"G. c #51A4D6",
+"H. c #5CAAD9",
+"J. c #57A7D6",
+"K. c #52A2CD",
+"L. c #62ADDB",
+"P. c #66ACD6",
+"I. c #66B0DC",
+"U. c #6AB2DD",
+"Y. c #6BB3D7",
+"T. c #73ABCD",
+"R. c #71B5DE",
+"E. c #78B7DA",
+"W. c #6EAACD",
+"Q. c #73B6E0",
+"!. c #75B9E1",
+"~. c #7BBBE2",
+"^. c #7AB6E2",
+"/. c #69B2E0",
+"(. c #6198CB",
+"). c #7DC3E5",
+"_. c #945A35",
+"`. c #8F5649",
+"'. c #8F6654",
+"]. c #AE6D52",
+"[. c #BA787B",
+"{. c #B47566",
+"}. c #9E665D",
+"|. c #D37E5C",
+" X c #D97C5B",
+".X c #CF7A50",
+"XX c #CD7D62",
+"oX c #C77B6B",
+"OX c #C27973",
+"+X c #D27A64",
+"@X c #DB7669",
+"#X c #DA7964",
+"$X c #D87868",
+"%X c #D77768",
+"&X c #D17572",
+"*X c #E2726C",
+"=X c #E27866",
+"-X c #EA6E70",
+";X c #E17A59",
+":X c #C3432D",
+">X c #9D729D",
+",X c #896DB7",
+"<X c #9770A6",
+"1X c #916EAE",
+"2X c #AD758B",
+"3X c #A57395",
+"4X c #B47684",
+"5X c #B16F96",
+"6X c #826BC1",
+"7X c #C27382",
+"8X c #82A43E",
+"9X c #97993C",
+"0X c #8C9D43",
+"qX c #949C44",
+"wX c #9A9849",
+"eX c #8A9759",
+"rX c #88A141",
+"tX c #95A045",
+"yX c #AC8E53",
+"uX c #A2944D",
+"iX c #A9954A",
+"pX c #A99051",
+"aX c #A69250",
+"sX c #B28B55",
+"dX c #BC865A",
+"fX c #B98859",
+"gX c #B78957",
+"hX c #AE914E",
+"jX c #A98C6A",
+"kX c #C3825D",
+"lX c #C88259",
+"zX c #D48058",
+"xX c #C98060",
+"cX c #C78060",
+"vX c #D58266",
+"bX c #E18461",
+"nX c #D0B32F",
+"mX c #99A1A1",
+"MX c #84BBDB",
+"NX c #8AB4CB",
+"BX c #80BEE3",
+"VX c #8ABDE6",
+"CX c #90C4DB",
+"ZX c #84C1E5",
+"AX c #8AC3E5",
+"SX c #89C3E8",
+"DX c #97C7E5",
+"FX c #9ED0EE",
+"GX c #ABCED7",
+"HX c #A9D3E8",
+"JX c #B6D9E8",
+"KX c #A9D0EA",
+"LX c #BEE1EE",
+"PX c #C8E4EF",
+"IX c #CAE2F1",
+"UX c #A7C0A5",
+/* pixels */
+"L.L.I.I.I.U.I.I.I.U.I.I.I.I.L.U.L.L.L.L.L.L.L.L.L.L.L.H.L.H.H.H.H.H.H.H.H.H.H.H.H.H.L.L.L.L.I.I.I.U.U.U.U.R.R.R.Q.!.!.!.!.!.~.~.!.~.~.~.~.~.~.~.~.~.~.~.~.~.).E.BX~.~.~.~.~.~.~.!.R.!.!.Q.~.Q.!.Q.Q.Q.Q./.Q.Q.Q.Q.Q.Q.!.Q.Q.R.R.R./.R.R.R.U.R.U.R.R.R.R.R./.R.R.R./.U.R.R.R.R.R.Q.Q.R.R.Q.Q.Q.Q.Q.R.R.R.Q.R.R.Q.R.R.R.Q.R.Q.R.Q.Q.R.Q.Q.Q.Q.!.R.~.~.!.!.E.~.R.~.!.!.!.!.R.!.~.^.E.!.~.~.!.~.~.~.~.~.~.~.~.~.~.~.~.).BX).BXBXBXBX~.",
+"L.L.L.L.I.L.I.I.U.U.I.I.Y.I.L.L.L.I.I.L.L.L.U.I.P.L.L.L.H.L.L.H.H.H.H.H.H.H.H.H.L.H.L.H.L.L.I.I.U.I.U.U.U.U.U.R.R.R.Q.!.!.!.!.~.~.~.~.~.~.~.~.~.~.~.~.~.).~.~.).~.).BX~.).~.~.^.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.^.Q.^.Q.!.Q.!.Q.R.Q.R.R.R.R.R.U.U.R.R.R.R.R.!./.R.R.R.R.R.R.R.R.R.R.Q.Q.Q.Q.Q.Q.Q.Q.Q./.R.R.R.R.R.R.R.R.R.R.Q.Q.Q.Q.!.Q.R.Q.Q.R.Q.Q.!.~.~.Q.!.!.!.R.R.R.!.!.!.!.!.!.Q.~.!.~.~.R.E.~.~.~.).~.~.~.BX~.~.ZX~.~.~.~.~.BXBXBXBX",
+"I.L.I.L.I.I.I.U.U.U.U.U.L.I.L.U.L.I.I.L.U.L.L.L.L.L.L.L.L.H.L.H.H.H.L.H.H.H.H.H.L.H.H.L.L.L.L.I.I.I.I.U./.U.U.R.Q.Q.!.!.!.!.!.!.!.~.!.~.!.~.~.~.~.~.~.~.~.BX).BXZX~.~.~.~.~.E.~.!.!.!.!.!.Q.!.!.!.Q.Q.Q.Q.Q.!.Q.Q.Q.Q.Q.Q.Q.R.R.R.R.U.Q.R.R.R.R.R.R./.R.R.R.R././.R.R.R.R.R.!.!.Q.Q.Q.Q.Q.Q.Q.Q.R.R.!.Q.Q.Q.Q.Q.Q.Q.Q.!.Q.!.!.!.!.Q.Q.!.Q.!.Q.~.R.^.!.!.).R.~.R.!.R.!.!.!.Q.~.Q.~.!.~.E.~.~.E.~.~.E.~.~.~.ZX~.~.~.ZX~.BXBXBX~.BXBX",
+"L.L.L.L.I.I.I.I.L.I.U.U.U.U.Y.L.I.L.I.I.L.L.U.L.I.L.L.I.L.L.H.L.I.H.H.H.H.H.I.H.H.H.I.H.H.L.L.L.I.I.I.U.U.U.U.R.R.R.R.R.!.!.!.!.~.~.!.~.~.~.~.^.~.E.~.~.~.~.~.~.~.BX~.~.~.~.~.~.!.!.!.!.!.Q.Q.!.!.!.!.~.!.!.!.!.!.Q.Q.Q.Q.!.Q.Q.!.R.R.U.R.!.R.R.!.!.!.!.!.R.R.R.R.R.Q.R.!.!.!.!.!.!.!.^.!.Q.Q.Q.Q.R.Q.R.Q.Q.Q.Q.!.!.R.R.!.R.!.R.R.R.!.Q.Q.!.!.!.~.~.!.~.R.R.).R.!.!.!.!.!.~.!.~.~.~.~.~.~.~.~.~.~.~.).BX).~.~.~.~.BX~.~.BX~.BXBXBX",
+"L.L.L.U.L.L.U.U.L./.U.U.U.U.U.L.I.L.L.U.L.L.U.L.I.I.L.L.L.L.L.H.H.H.H.H.H.H.H.H.I.H.L.L.H.L.I.I.L.L.I.I.U.U.U.U.R.R.R.R.!.!.!.!.~.~.^.~.!.~.~.E.E.!.~.~.~.~.BX~.~.).~.~.~.~.~.~.~.!.!.!.~.Q.!.!.~.!.!.!.!.!.!.R.R.R.R.Q.Q.Q.Q.Q.!.Q.R.U.R.R.R.R./.!.!.!.!.R.R.R.Q.Q.Q.Q.Q.!.!.~.~.Q.~.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.Q.!.!.~.!.!.R.).!.R.R.R.Q.Q.!.!.!.~.!.~.!.!.~.R.R.~.!.!.!.!.!.~.~.~.^.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.BX~.~.BXBXBXBX",
+"L.L.I.L.L.I.I.L.I.I.U.U.U.U.L.I.L.U.L.U.U.L.L.L.H.H.I.I.L.L.L.L.L.L.I.H.L.H./.L.H.I.H.I.L.L.H.H.L.I.I.I.U.U.U././.R.R.R.Q.R.R.R.!.!.^.!.!.~.!.~.~.~.~.!.~.~.~.~.E.).BX~.~.~.~.~.!.~.!.!.!.!.!.!.!.!.!.^.!.!.!.!.!.Q.!.Q.Q.Q.Q.Q.Q.!.!.R.R.E.R.R.!.!.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.!.!.!.!.!.!.!.Q.!.Q.Q.Q.!.Q.Q.!.!.^.!.!.!.!.!.!.~.!.!.!.!.R.!.!.!.!.~.~.!.!.!.).).R.!.R.~.!.!.~.~.~.~.~.).~.~.~.~.~.~.~.~.BX~.~.~.~.~.BX~.BXBX~.BXBX~.",
+"L.L.L.L.L.L.I.U.I.I.U.U.L.U.I.I.U.U.L.L.L.L.L.L.I.H.I.L.L.L.L.L.H.I.H./.H./.L.H.L.L.L.H.L.L.H.L.L.I.I.I.I.U.U.R.U.R.R.R.R.Q.Q.Q.!.!.!.!.~.~.~.~.~.!.E.~.BXE.~.~.~.E.E.~.~.~.~.~.~.~.!.!.!.^.!.~.!.!.!.!.!.!.!.!.R.!.!.Q.Q.Q.!.Q.Q.Q.Q.R.!.R.!.~.!.).!.!.!.!.!.R.!.Q.Q.Q.!.Q.!.!.!.!.~.!.!.Q.Q.Q.!.Q.!.!.Q.!.!.!.!.!.~.!.!.!.~.^.!.!.!.!.~.^.!.!.!.~.!.~.~.!.).R.!.~.~.!.~.~.E.~.~.~.ZX~.~.).~.~.~.~.~.~.~.~.~.~.~.~.~.BXBX~.BXBXBX",
+"L.H.L.L.L.U.L.L.I.I.I.L.U.L.I./.L.L.L.U.U.L.L.L.L.I.H.I.L.L.L.H.H.L.H.H.H.H.L.H.L.H.L.H.L.L.L.L.L.L.I.I.I.U.U./.U./.R.R.R.R.Q.Q.Q.!.Q.!.!.!.!.!.~.!.~.~.~.~.~.~.~.~.ZX~.ZX~.~.~.~.!.~.~.!.!.^.!.~.~.!.!.~.!.Q.!.^.Q.Q.Q.Q.!.!.!.Q.!.R.!.!.!.~.R.!.R.).!.!.!.!.!.!.!.!.!.!.Q.!.!.!.!.!.!.!.~.!.!.!.!.!.!.!.!.!.!.!.!.^.!.~.~.!.~.~.~.~.!.R.~.~.E.~.!.~.!.~.~.~.!.~.!.^.~.!.~.BX~.~.~.~.~.~.~.BX~.~.BX~.BX~.E.~.~.~.^.BX~.BXBX~.BXBX",
+"L.L.L.L.L.I.L./.I.DXDXFXHXHXHXFXKXKXKXKXKXKXKXKXFXFXDXVXL.L.L.H.H.L.H.L.H.H.H.L.I.H.I.H.H.I.L.L.L.L.L.L.L.U.U.R.U.U.R.R./.Q.R.Q.R.!.R.R.!.!.!.!.!.!.!.^.^.~.~.~.~.BX~.BX~.~.).~.~.!.!.~.~.!.^.~.~.Q.!.!.~.!.!.!.R.!.!.!.Q.^.Q.R.Q.Q.!.~.!.~.~.~.).R.!.~.!.!.~.!.Q.~.Q.!.!.~.~.Q.~.!.~.~.!.!.!.!.!.Q.~.!.Q.!.!.!.~.~.!.~.~.!.~.!.~.!.~.!.~.~.~.!.~.!.~.~.~.~.~.~.~.~.~.~.G.Y.W.E.ZXMXBXMXMXCXZXMXBXCXE.E.Y.P.S.E.).~.BX~.BXBX~.~.BX",
+"H.L.L.L.L./.I.L.VXDXFXJXJXPXPXPXIXPXPXPXPXPXLXPXLXJXFXDXBXL.H.L.L.L.H.L.H.H.L.H.H.H.H.H.H.H.L.L.L.L.I.I.U.L.U./.U.R.U.R.R.R.R.R.Q.Q.!.Q.Q.Q.!.!.!.!.~.!.~.!.~.~.~.~.~.).~.BX~.~.~.~.~.!.~.~.~.~.~.~.~.~.!.^.!.!.!.!.!.!.!.!.R.!.E.!.~.~.~.^.~.~.).R.~.~.!.~.~.~.~.^.^.^.~.Q.Q.~.~.~.~.~.~.~.^.~.~.~.~.!.~.!.!.~.!.~.~.~.!.~.~.~.~.~.~.~.Q.Q.~.~.!.~.~.!.!.~.~.!.~.E.~.D.U.E.AXFXHXHXJXHXHXHXHXHXHXHXHXDXDXE.P.K.~.~.~.BX~.BXBXBX~.",
+"L.L.L.L.L.L.L.L.DXKX< + 1 , , 1 + < O + O < < < < X , FXDXH.L.H.L.H.H.H.H.H.L.H.H.H.H.I.I.H.I.L.L.L.L.U.U.U.L.U.U.U.R.U.Q.Q.R.Q.R.R.Q.Q.Q.Q.Q.Q.!.!.!.~.!.~.~.~.~.BX~.~.~.~.~.~.~.~.~.~.~.!.~.~.~.^.!.^.^.!.~.!.!.R.!.Q.!.~.~.!.!.!.~.~.~.~.~.~.E.~.E.R.~.E.!.~.~.~.!.!.^.!.~.!.Q.!.~.!.^.~.~.!.~.^.~.~.~.^.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.E.~.~.!.~.~.~.~.~.~.~.~.~.L.Y.- - , , + + = < < + + + O 1 2 X 2 E.L.~.BXBXBXBXBXBXBXBX",
+"/./.L.L.L.H./.L.FXJX- < O , 1 O < < < < = < < < < 2 , HXAXL.H.L.H.H.L.L.L.H.H.L.L.H.H.H.I.H.L.I.L.U.L.L.L.U.U.R.R.U.U.Q.U.Q.R.Q.R.R.R.R.R.Q.Q.Q.Q.Q.R.R.~.!.!.~.~.~.~.BXBX~.~.~.~.!.~.~.~.~.~.~.~.~.~.~.E.~.!.~.~.~.!.~.!.!.~.~.~.^.~.~.~.~.~.~.).~.~.~.~.!.~.~.!.~.~.~.~.!.~.~.~.^.~.!.~.!.!.~.!.~.~.Q.^.^.~.~.~.!.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.E.~.~.~.~.L.VX- 1 + + , + , + < < + - 1 < < < , CXP.BX~.BX~.~.~.BXBXZX",
+"L./.L.L.L.L.H.L.FXLX, < = 2 9 , = < < X + = + = < + X KXDXL.H.H.H.H.H.L.H.L.L.H.H.H.P.H.L.H.I.L.U.L.L.L./.U.L.U.U.U.U./.R.Q./.Q.Q.Q.Q.Q./.R.R.Q.R.!.R.!.E.!.!.^.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.!.!.Q.~.~.!.~.!.~.~.~.~.~.~.~.~.~.~.~.~.).~.~.~.~.~.!.!.).!.~.~.~.~.~.~.~.~.~.!.~.~.~.~.~.~.~.~.~.~.~.~.BX~.~.SX~.~.~.~.).~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.P.MX- < @ # < < < < < < < < - = = + , DXY.~.BXBXBX~.BX).BXBX",
+"L.L.L.L.L.L.L.L.FXIX, + = # 8 8 < < - < X X , < + O , FXSXL.L.L.H.H.L.H.H.H.H.H.H.H.H.H.H.H.L.L./.L.L././././.U././.Q.Q./.Q.Q.^.Q./././.Q.Q.Q./.Q.Q.R.!.!.Q.~.~.~.~.~.~.BX~.~.BX~.~.BX).BX~.BX~.~.~.~.^.~.~.~.~.~.^.^.~.^.~.~.~.~.~.~.~.~.BX~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.!.!.!.R.~.!.!.!.~.~.~.~.BX~.~.~.~.~.~.~.~.~.~.~.BX~.~.BX~.~.~.~.~.~.!.~.~.~.~.~.~.H.R.= = X 1 X , , < , , < = % + 2 < 1 GXE.BXBX~.BXBX~.~.ZXZX",
+"L.L.L.L.L.L.L.L.FXIX3 + - , IXIXIXIXIXIXIXIXIXLXLXJXHXAXZXL.L.H.L.H.L.H.H.H.H.H.H.H.H.H.H.L.L.L.L.L.P.Y.L.Y.U.R.U.U.Y.U.R.L.U.U.Y.U.R.U.U.Y.Y.U./.U.R.Y.R.R.!.!.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.E.~.~.!.E.~.!.~.~.).~.ZX~.BXE.~.BX~.MX~.~.~.~.).!.~.~.!.!.~.~.!.~.!.!.!.R.E.).E.~.!.!.~.~.~.~.~.~.SXSX~.~.~.BX~.~.~.BX~.~.~.~.~.~.~.~.E.~.~.~.~.~.~.~.~.D.P.MXCXHXHXJXHXJXGXHXJXPXIXIX1 = 2 X HXE.BX~.BXBXBXBX~.~.~.",
+"L.H.L.H.L.L.L.L.KXIXX 2 - , IXIXPXKXKXKXFXKXKXKXFXDXDXZXH.H.L.H.L.H.L.H.H.H.H.H.H.H.H.L.H.L.I.I././.L.L.L.U.U.L.U.U.R.R.Q.Q.^.Q.Q.Q.U.R.U.R.R.Q.!.R.Q.R.!.^.!.^.^.~.~.~.BX~.~.BXBX~.BXBXBX~.ZX~.~.).).BX~.~.~.).E.~.E.).~.).).E.ZX~.ZXZXVXBXBXBXBXBX).~.).~.).~.~.).~.~.~.~.~.~.~.~.~.~.!.~.~.~.~.!.~.~.~.~.BXBX~.~.~.BXBXBXVXBXBXBX~.BXBX~.BXBX~.~.).~.).E.).).BXBX).E.S.P.P.E.Y.E.E.^.E.MXZXDXJXIXO < < < HXE.ZXZXBXBXBXBXZXZX).",
+"L.I.I.H.H.I.L.I.HXPX, @ , 3 IXJXP.I.P.L.P.L.P.S.F D V V V V V h V V V B V V V C V V V V V V h V V V V Z Z Z Z Z Z V V V V V V V V V V V V V V V V V V V V V V V Z Z A V Z V Z V V Z Z Z Z C V V V V V V Z V V V V Z N V V V V V Z Z V V A V V V V V V Z Z V V Z Z Z C Z C Z Z A V N Z V V Z Z Z V V N V V V Z Z N Z Z N V V V V V V Z Z A V V V N N Z Z A N V V Z Z V N A V D F (.MXVXVXVXVX~.).DXJX2 < < < GXE.ZXVXBXBX).BX~.ZXVX",
+"L.H.H.H.H.H.H.H.HXPX2 # < 2 IXHXP.P.H.L.(.D h h N g C A V V C C C C V C C C C C C C V C C N V C C C N V N N N N N N N N C V C A N V C Z C V V B N V V N N V N N C C N C N N N N N N C C N A N N N N N B A C N N A N N N N A C C N N V V N N N N V g A C V C A C Z C C C C C C C C C N N N A C C V N N N N A C C N N N N g N N A N N C C V N V A N C Z N A N N N A C h N V g A Z g h D T.VX^.).SXE.JX, - , = HXE.ZXBXZXBXBXBXZXZX).",
+"H.L.H.I.I.H.I.H.FXPX, # < - LXHXL.L.U.S.F C g B N 8 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 6 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 6 6 7 6 6 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 r 6 6 6 6 6 6 6 6 6 6 6 g g h N F T.VXBX~.E.GX< < - + GXE.ZX).BXBXVX).ZXBXVX",
+"L.H.H.I.H.H.H.H.HXPX- 1 < < PXHXL.L.K.D C A A r 3. .X.X.X.X.X.X.X.X.X.X.X.....X...X.X.X.X...X.X...X.X...X.X.X.X.X.X.X.....X.X.X...X.......X.........X.X.............X.X.....X...X...X.X.X...X...X.......X...X.X...X.X...X...X...X.....X.X.X.X.X...X.....X.....X...X...X.....X.X.....X.X.....| X.....X.....X...X.X...X.X.X...X.X.X.X.....X...X...X.X.X.X...X...X.X...X...X.X.O.^ >.V C B D T.VXVXE.JX= = 1 # GXE.BXAXAX).VXBXZX).ZX",
+"H.H.L.H.H.H.H.H.HXPX, 3 X 1 PXDXP.K.D h N Z >. .X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...X.X. .3.7 V g D T.AXY.GX= ; < @ HXY.AXSXZXZXZXZX~.~.ZX",
+"H.H.H.L.L.H.H.P.HXLX@ + = , IXFXI.D A V h >.} X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...3.A N A D T.E.HX- < @ O HXE.VXZXZXZXZXZXZXZX~.",
+"H.H.H.H.H.L.H.H.HXPX+ 2 = , IXHXJ.Z V N >. .X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...3.Z N h S E.GX- 2 < , HXR.ZXVXZXZXZX~.ZXBXZX",
+"L.L.H.L.H.L.H.H.HXLX1 + o 1 LXDXM.h V D ^ { _ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.+.r N B h T.HX- 2 < X FXQ.SXSXZXZXZXZXBXZX~.",
+"L.L.H.H.L.H.H.L.FXLX+ 1 = + JXDXF N N 3...X.X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.) X._ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.3.A C B T.DX< , < < DXY.ZXSXZXZXZXZXBX~.BX",
+"L.L.L.H.H.L.H.H.FXJX2 @ < + JXCXF N g +.X.X.X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.0X9XqXqXqXwXqXwX8X*.;.iX9XqX9XtXqXqXqXqXtXtXqX9XqXqXqX9XwXwXtX9XB.m.m.B.m.B.m.-.9XqXqXqXwX9XtXwXqXqXqX9X9XqXqXqXwXqX9XwXwXqX;.wXuXwXqXqXqXqX9XtXwXqXqXqXqXqXqXqXqXqXqX9XqXqXqXwX9X9XqXqXqXqXqX9XqXqXqXqXqX9XqXtXqX;.qXwXqXqX9XqXwXqXtX9X9X9X9X9XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.@.A C B W.NX- - < , CXU.ZXZXZXZXZX).ZXBXZX",
+"L.L.H.H.H.L.L.L.DXKX, 9 - # FXMXh Z 6 _ ....X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.xX+XXX+X@XkXsX@X=.[ $.#XXXXXXXXX+XXXXXxXXXXXvX+XxXXXXX+XdXyXvXzX,XH R R E E W oXXXXX+XkXyX@XXXpX+XXX+X+X+X+XXXcXpX+XxXwXwX%.` -.9XwX@XXX+XxX+XkXiXxXXXXX#X%X%X%X%X@X@X#XXXXX+XaX%X+XXXXX+XXXXXXX+X+XXXXX+XXXXX+XkX_ $.wXxX+XXXXXzX+XzX[.2X2X4X2XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...D C B m.T.- = - < T.G.ZXSXAXZXAXBXBXZX~.",
+"H.L.L.L.L.H.L.H.AXDXFXHXKXFXDXE.Z N 6 X.X.X.X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXXX+XkXqX_ <.@XzXgXlX+XXXXXXXXXxX+XXX+X+XXX+X%X%XxX+X-X&._ +X|.3XH E R R E W 4X|.XXXX$./ rX$.{ +XXXpX+XxX+X*XqX' xXtX' ' ` / ` ' ' 0X+XxX+X%XyX_ dX+XxXwXqXqXwXqXwXqXwX%X@X-.` =.+XXXXXXXXXXXXXXXXXXXXXXXXXXX#X*XyX( ' wX+XXX+X[.4X3XR K R E J X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...D N V m.S.U.E.~.Y.J.C.SXSXZXAXZXZXZXBXZX",
+"I.H.I.H.L.L.H.L.I.ZXAXDXCXDXE.L.Z N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXXXfX .' _ kXoXOX X4XXXXXXXXXXXXXXX+XdXyX+XdXqXsX%XkXwX@._ +XxX+X<XE E R R H U XX@X0X` / ` ` ` 8X$.] lX@XXXuX$.( XXwX_ wXdXgXgXkX&.' dX%XxXXXXXxXXX%XsX] ' ' ' ' ` ` ` &.-.` ` ] sX%XXXXX+X+X#XXXXXXXXX%X@X@XaXqX+XkXgXzXzXzX2XR H E R <XvXOXcXo.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} S N V N.m.K.K.K.K.V.SXAXAXSXZXSXZXVXZX~.",
+"L.L.L.L.L.H.H.L.H.L.L.H.P.H.I.L.Z N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX@X<.` ` %.=X,XP 2XW [.zXXXXXXXXXXX@X%.O.-X-.' O.@X-.' / O.@X%XxXzX,XH R R H U +XXX,./ ` o.yX&._ wX-.-.wX%.' ) yX%XxXkX%X+X+X+X@XwX' kX@X@X+XxXpXxXXX%XcXdX0X( / ] / ` ` ' -.XXgXXXXXXXXX+XwXwX+X@XXXXXuXwX-.` ' 0X@X#X[.2X3XR >XoXOXOXXXxX+XlXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} r V B S T.NXMXAXAXSXAXZXAXSXAXZXZXZX).ZX",
+"L.L.H.I.L.L./.H.L.H.L.H.H.H.L.L.V B 6 _ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX@X,.` +.XX X,XK H E U [.XXXXXX+X+X@X%.] yX@X$.@.+X+X%.] ( 0XgX+X X>XH E R E W 4XqX` ) yXkX@X+XkX@X#X&.' ` _ yX@XXX+X+XXX+XXXxX@XwX' &.wXaX%XpXo.dX@XwXuX+X%XdXgXsXdX0X/ ` yX@X+XXXXXXX@XrX` ` *.uXXXkX_ ' ' / ` wX;X2XH H <XoXxXXXXXXXXXXXXXxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r A C S W.T.CXAXSXSXAXSXAXSXAXSXZXZXZXVX",
+"L.L.I.H.L.L.L.L.L.H.L.H.L.P.H.L.Z C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX#X%. .XX%X|.1XH E E K ,X XXX+XdXyX@X=.` _ sX+XcX+XXX+XfX%.' _ +XzX<XH R R R H U |.dX%.qX@XXXXX XXX4X4XmXjXjX#XXXXXXXxXXXXXXXXX@X*.qX-.' ' kX@XxX@X&.` ` dX@X+X+X+X+X*X0X' &.%XXXXXXX@X-.-.wX] ` ' pX%XfXfXwX_ -.#X2XH >XOXzX#XXX+X+X+XXXXXXXlXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r N C S M.E.E.AXSXSXAXAXAXAXSXZXSXZXZXSX",
+"I.L.I.I.L.L.L.L.L.L.I.L.H.H.I.I.Z N 6 ..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.lXvXkXxX+XXXoXU H R R H U 2XoX#X*.+.#X+X+.'  .%X+XXXxX+X+X%X%.O.+X|.3XH R R R E R 4X=X-.] xX+XXX[.,XH H E H R 2X.X+X+X+XXXXXXX+X*.` dX*XrX` &.uXuX=.' ` ` &.yXXXXXXXXX+XfX/ ` pX%XXX*X8X` =.8X/ ` &.@XXX+X+X+XXX X2XH >XzX+X+XsXcXXXyXXX+XxXxXxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...} r C B S M.T.MXAXAXSXAXAXAXAXAXAXAXZXAXZX",
+"I.I.I.I.L.L.L.L.L.L.H.L.L.I.H.I.Z N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.lXxX+X+XXX|.,XH R R R R H H U OXlXXX+X-X&.'  .@X%XXXXXXXXXXXXXkX+XxXXX,XH R R R E U #XrX_ xXzX,XH H R E R Q E R 5X{.|.XXXXXX%XaX' ) dX+X@X-.' ` ' ] 0XXX-.' ` yX%XxXXXXX%X0X' wX@X+X-.` ` ` ` / ` pX%XXXXXXXXX|.2XH >X|.xX%XkX' rX%X_ $.$X+XvXkXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N B B.M.NXMXAXSXAXSXAXAXAXAXZXSXSXZXSX",
+"Y.L.I.L.L.L.L.L.L.H.I.L.P.I.I.I.V B 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX+XxXxXXX X1XK R R R R R R H U OX+XkXwX+.` ) wXfX+XXXXXXXXXXX+XxX+X X3XH E R R E R 4XzXlXzX,XH R R R R R R R E H R 2X.XXXXXXXXXsXfXXXXX%XaX( qXdXdX%X@XsX] / sX+XXXXXXX+XfX{ yX$XfX( -.fXgXqX` -.*X@X@XXXXX|.2XE <X|.XXXXXXkX_ 0X@XaX` $.+XvXlXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r C C S M.E.MXSXDXAXSXAXAXSXAXAXAXSXSXZX",
+"I.Y.L.L.L.I.I.I.I.I.I.I.I.I.I.I.V B 6 X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.pXkX@X+XXXXXXX6XH R R R R R R K 6X#X-.' / / ` ' @.+XXXXXXX+X+XXXXXXXzX>XK E R R R E W 2X[.1XH R R R R E R E R R E E E 2X|.XXXXXX%X+XXXXXXXXXdX@XXXsXxXXXXXgXgX+X+XXXXXXXXXXXdXXXXXXXkX*X%X%X@XqX=.pXwXwXXXXXoXR <X.XXXXXXXXXXXkXXXXXXX) ' rXvXbXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r C B S M.T.MXSXSXSXAXSXDXAXSXAXAXSXSXSX",
+"I.I.I.I.I.I.I.I.U.L.I.U.L.L.L.Y.V V 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.%._ wXkX%XXXXXXXOXOXI H R R R H I  XXX$.` o.sX+.o.+XxX+X+XdXgX+X+XXXzX3XH E E R E R E E E E E R R R H E R R H H R R H W XXXXXXXXXXXXXXXXXXXX+X@XpX_ dX+XXX+X+XXXXXXXXXXXXXXX+X+X%X@XyXuX+X%X%X-XqX' ` ` uX+XoXJ 2X|.XX%XXXXXXX+XXX+XkX( ' 0X%XXXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r A B S NXT.MXVXDXSXAXSXAXSXAXAXAXSXSXSX",
+"I.I.I.I.I.I.I.I./.L.I.I.L.L.L.L.V B 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.fX+.'  .fXXX+XlXkX X<XL R R R H I |.XXXXsXXX-X%._ @X+XxX%X-._ @X+XXXXXoXOX1XH E R R R R R R R E R R P 4X&XOX>XH R R R E 2XXXXX+X%X+XXXXXXXXXxXyXxXdXXXXXXXXXXXXXXXXXXXXXXX+X%XpXaX-.` ` &.aXuXaXrX/ / &.$X+X2XK 2XzXXXsXxXXXXXXXXXXXcX_ *.+X+XyXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} r C C S M.T.MXVXVXSXDXDXDXAXAXAXSXSXAXZX",
+"Y.I.I.I.I.I.I./.L./.L.U.L.I.U.I.V C 6 X.X.X.X.X._ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXXX+.' $.@XkX ._ kX@X,XK R R H I +X$XXXfX+X@X%.] yX+XXX+X+X%.rXfX+XXXXXzX#X1XH E R R R R R R R E R 4X.XuXhX X<XH R R E P oX+XaXwXsXXXXXXX%XaX_ dX%XxXXXXXXXXXXXXXXXXXXXXX+X-.` ` ' -.wX` ` ` ` ` / ` aX#XoXP K 4X+XxX] rX%XXXXXXXXXXXkX+X+X+X_ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...F V B S T.NXMXAXAXSXSXAXAXAXAXSXSXAXSXVX",
+"I.I.I.Y.I.I.I.I.U.L.L.U.Y.I.U.I.V g 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX+XXXpXXX@X=.' ` o.gX+X[.I H K 6XlXaX+.+.%X@X-.' +.+X+XxXdX*X<._ yX@X%XxXfXzX1XH E R R E R R R H U @XqX` _ |.4XH E R E W &X&.` ` ] fX+XXXXXXXgXxX+XXXXXXXXXXXXXXXXXXXXX+XfX) ` / ` -.-.` ` / ` ` ` -.%X+XoXH <X|.%XqX' qX@XXXXXXXXXXX+XXX@XwX] X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} F C C S M.NXMXAXAXSXSXAXAXAXSXSXAXSXSXVX",
+"U.U.L./.I.I.I.I.L./.I.U.I.U.I.L.V C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXxX+X*X@X+XXXyX+.' <.@XzX<XK U &X&.' ) fX+XXXXXyXdX@X+X$._ wX<.` _ wXsX$._ XX|.1XH E R R R E H W [.*X%.` wX#X1XH R R R Q eX' / / ( dX+XXXXXXX+X+XXXXXXXXXXXXXXXXXXXXXXXXXXXsXyXrX] ' -.gXpXyXpXpXsX+X+XzX2XH [. XXX` *.@XXXXXXXXXXXXXXX+XqX*.sXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...F C V S M.T.MXAXSXAXAXAXAXSXSXAXSXSXAXZX",
+"I.L./.I.I.I.I.I.I.I.I./.I.I.U.U.V C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX+XkXuXuXkX+X+XxXpXdX+X|.oX[.XXzX .` +.@XXXXXXX%XXXyX$.` ` _ uX$.` ` ` ' O.XX+X|.1XH E R E H P OX#X%.' _ |.2XH R E R H Y eX` / / wX%XXXXX%X%X%XgXXXXXXXXXXXXX+XXXXXXXXXXXXX+X%X%XgXyX%X+X@X+X+X+X+XXX|.2XH <XXX+X0X` *.gXXXXXXXXXXXXX+XXX_ <.sXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| G C B B.M.NXMXAXSXSXSXAXAXAXAXSXSXSX).ZX",
+"L.I.U.I./.I.I.I.I.I.U.L.U.U.L.U.V C 6 ....X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX@X1.' `  .XX%X+X+X+XXXXXXX+X*X=.` _ XX+XXXXXXXXX$.' / _ wXkX*X-.` / ) wXdX+XXXXX|.1XH H P 4XoX+X%./ wXdX|.2XH R R E E 4X9X` ` ' 0X+XxXXXyXyX&.] sX+XXXXXXXXXgX+XXXXXXXXX+X%X%X+XdX+XXXXXXXXXXX+XXXzX4XH >X X|.XX_ ` ` ' qX%XXXXXXX+X%X@XaX( ' X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| G B C S M.E.MXAXZXSXSXAXAXAXSXZXAXSX).AX",
+"L.U./.I.I./.I.I.I.U.L.U.I.U.U.U.V B 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX@X$.` / / O.dX+X+XXXXXXX+XcXyX+.` _ fX+XXXXX@X=.` / ` ( gX%XXXXX%.` ) gX@XXXXXXXXX+XOX[.OX|.#XqX] uX@X+X|.2XH R R E P &XwX( qX-.( kX@XwX` ' ' / fX+XXXXX%XpX] rX@X%X%X%XsXuXyX-.( aX%XXXXXXXXXXXzX2XE <X|.XXXXXXfX0X( ' 0X@XXXXXXXsXaXuX+XdXuXX.X.X.X.X.X.X.X.X.X.X.#.X.X.X.X.X.X.X.X.X.X.X.X...F B C S M.T.MXAXAXSXSXAXAXAX).AXSXZXZXBX",
+"U.L.U././.U.I./.I.I.I.U.L.U.U.U.Z C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX+XkX ./ / ` <.@XXXXXXXXX#X&.' ` ` ` ,.%XXX+X@X=.' _ pX<. .+XXX+X+X$.` o.XXXXXXXXXXXXiXgX+X+XXXcXfX#XxXXX+X1XH R R H 2X+X+XsX@X+XsXXX@XwX' 0XyXyX+XXXXXXX@XwX` / -.sXsX-./ ] ` ' ` aX+XXXXXXXXXzX2XH <X|.XXXXXXXX+X%XsXyX+X%XXX+XXXO.' ' rX@X+XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} F N N S M.NXMXAXSXSXSXAXSXZXAXZXSXZXZXBX",
+"L.U.L.L.I.U./.I.U.U.I.I.U.U./.U.Z N 6 X.X.X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXXX@X<.` / / +.@XXXXXXXXXXXkXuXuXuXaXdX+XkXfX+XxXuXkX@XxXgX+X+X+X%X@X$._ XX+XXXXX@X8X' o.XX+XXX+X#XXX+X|.4XH R R H P XXlXdX@XXXXX+XXXXX@X=.0X*X%XXXXXXXXX+XsX` / ` ` ` ` ` ` -.yXyXXXXX|.|.|.OX3XH <X X+X+XXX+XXXXXXXXXdXpXpXXXXXXXgXqX( 8X$XxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} D N B S T.T.MXZXZXZXZXZXSXZXSXZXZXZX).BX",
+"L.U.U.L.I./.U.I.I.I.U.U.U.U.U.U.Z C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXXX@X%.` / / ,.@X%X+XxXXX+X+X%X%X%X+X+X@X=.+.+XXX%X+XXXXX+X+XxXyXfX+XXXfX+XXXXX+X*X-.] aX%XxX%XXXgX+XxX|.<XH R R E 2X#XuX{ wX%XXXXXXXXX@XwX' qX@XXXXXXXXXXX%X-.` / / / ` -.sX%X%X#XzX|.OX[.2XR H >XzXsXhXyX+X+X+XXX+XXX_ ` ' qX%XXX%X@XdX+X+XxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...S N B S M.T.MXZXZXZXZXZXSXVXZXBXAXZXZXZX",
+"U.L.U.U.I.U.I.U.I.U.U.I.U.I.U./.Z 7 6 _ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXXXXXkX+.` ` o.pXpXdX+XXXxX+XxXXXXXXXXXXXkXgX+XXXXXXXXXXX+X@X-.' @. X+X+XXXXXXXyXsX$.] yX@X+XsX%.o.XX|.<XH E R H P XX#X*.` / kX+XXXXXXX%XuX` / qX+XXXXXXXXX+XgX` ` ` -.sX#X#XzXzX[.[.2XW E H H >X XlX_ ' ' &.fXXXXX+XdX( / ` rX@X+XgXpXsXpX+XxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| G C N S M.T.MXZXZXZXZXZXZXBXAXZXBXBX).).",
+"U.L.I.I.I.U.U.U.U.U.U.I.U.U./.U.V V 6 ..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX+XXXXXcXuX+.` ' ' 1.@XXXXXXXXXXXXXXXXXXX+X+XXXXXXXXXXXXXXX XlXeX{.4X[.oX|.$X9X[ ' ` ` ( wX=.] rXsX X<XH R R E R 4X=XuX` ` ( dX+XXXXXXXXX%X&.` / fX+XXXXXXXXXXXpXuXpX#X X[.OXOX3XP H H R R R H >X X|.yXsX-.` ' uX@X+XcX] ` ` %.+XXXo.' ' ' 0X+XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} S A C S M.T.VXBXBXZXBXZXZXZXBXZXBX).BXBX",
+"U.U.L.U.U.U.U.U.U.U.U.U.U.U./.U.V V 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXzXXXXX+X@XxXwXwXuXfX+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX[.1XQ H E H U 4X[.{.iXiXiXhX$.' ` _ vX#X<XH E R E R 2X.XfX*.' rXsXxXXXXXXXXXXX%XpX` ` sX%XXXXXXXXXXX+X#X#XoX3XR R R H H R R R R R R E >XOX+X@XcX( / *.gXsXrX%.yX0X] wX@XgX0X) ' -.+XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} S N C S M.T.E.VXBX).BX~.ZXBXZXZXBXBXBXBX",
+"U.U.U.I.U.I.U.U.U.I.I.Y.U.U.R.U.V g 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX[.cXzXXXxX+X+X+X+X+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|.3XH H R E E E H R R P 4XOX&X=X8X( 0XgXxX1XH E R R R P %XwX` ` ( kX%X+XXXXXXXXXXXXX%X=.' yX+XXXXXXX+XzX|.oX3XW H R H R R H H H H H H H H H E 3XzX%XqX/ / ` ' *.@X@X%XsXXXcXXX*XpX' -.@XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} S N B G M.T.E.BXBXBXBXBXZX~.ZXBXE.ZXBXBX",
+"U.U.U.I.U.U.U.I.U.U.U.L.Y.U./.U.V V 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.<XL I [.[.XX|.+X+XXXXX+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|.|.,XK R R R R R R R R R R R P 4X{.jX&X<XE E E R R E R R 4X X*.` ( fX+XdX%XXXXXXXXXXX%XaX] sX+XXXXX|.OX[.3XE H H H H >X[.4X[.[.4X[.[.[.[.3XE K H >XzX@XqX] ` *.@XXXXXXX+XXXXXXXXXwX` -.+XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} D N B B.M.E.E.BXBXBXBXBX~.ZXBX~.ZXZX~.~.",
+"U.U.U.U.U.U.U.I.U.U.I.U.U.U./.U.V B 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.oX4XU K K I [.XX|.+XkXkX+XXXXXXX+XXXXXXXXXXXXXXXXXXXXX|.,XH R E R E R R R R R R R R H H Q Q R H R R R E E H H E W 4X=X%.' kXwX_ wX%XxXXXXXXXXXXXyXXXXXXXzX2XR R H E >X[.[.[.#XXX|.|.+X|.XX|.|.|.|.[.3XE K >X|.%XyXuX+XXXXXXXXXXXXXXXXX_ <.yXcXxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.r N B S M.T.E.BXBX~.BXBXBXBXBX~.ZXZX~.).",
+"U.U.U.U.U.U.U.U.L.U.U.U.U.U./.U.V B 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.gX.XoX4X4XI K I oX#X*.O.XXoXXXXXxXXXXXXX+XXXXXXXXX+X|.,XH E R R R E H E H H R R R R R R R R E R R R H R 3XOX1XH H P @XqX] kXwX' ( kX+X+XXXXXXXXX+XXX|.|.3XH H R <X[.|.|.#XgXgXXXXXXXXXXXXXXXXXXXXX|.zX2XE H 4XzX+X%X+X+X+XXXXXXXXX@XaX` *.*X+XxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} r N B S M.T.E.BXBX~.BXBXBX~.BXBXBX~.ZXBX",
+"U.U.R.U.U./.U.U.U.I.L.Y.U.U./.R.V N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.<. .XX X|.XX4XU U oXkX} o.XX@X+XXX+XxX+XXXdX+XXXXXXX1XH R R R E H P 2X4X4X,XK H H R R R R R R R R E R 4XzX|.|.1XH E 4XzXyXXXxXuXuX+XXXXXXXXXXX+X|.|.oX3XE H <X[.|. X+X@X0X` ] sX+XXXXXXXdX+XXXXXXXXXXXzX2XH <XzXXXdXsXsXsXXXXXXX%XyX_ / ` qX@XxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r C C S M.T.E.BXBX).BXBXE.BXBX~.BX~.).BX",
+"U.R././.U.U.U.I.U.U.U.U.U.U./.U.V V 6 _ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.<.' +.XX+XXX XoXY ,X XxXO.O.sXxX%XXX+XxX$.@.+XXX|.3XK H R R H P 2XOX X X X+X4X[.,XH H R R R R E H R 4XzXXX+X|.2XH E W [. XXX+X#X#XXXXXxXXXXX|.OXOX3XH H H 3XzX|.%XfXfX0X` =.aXXXXXXX+XdX) aX+XXXXXXXXX+XoXR E 4XzX_ ` ` ' wX%X%XpX_ / ` <.XXXXxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r C N S M.W.E.BXBXBXBXBX~.~.BX).~.~.ZX~.",
+"U.U.U.U.R.U.U.U./.U./.P.U.U.U.U.V N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.sX .' +.xX+XcXlXoX,XoX XXX .' +.sXkX@X-.'  .+XXXXX,XH R R E P [.bX|.gXsXsXsXlX XXX4X,XH H H H R 3X[.zXxX+X+XXXXX<XH K W 4XOXOXOXzXXXzXXX|..X3XR H H >X[.[.+X+X@X0X( ` ` =.*X%XXXXX+X*X0X' wX@XXXXXXX+XlXOXR L 2X X0X` %.uXcX+XXX_ ' ` ' tX@XvXxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...| r V B S M.W.E.BXBXBXBXBX~.BX~.).~.ZX~.BX",
+"U.R.U.R.U.U.U./.U.U.U.U.U.U./.U.Z N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.xXkX .' %.*X%.<.;X,XU oX+XkX+.' ' <.@XdXwXsXXX|.1XH R R H W [.bX`.:.' ' ' ' @.XXXX|.XX4X4X4X4XOX|.#X+X+XxXkX$XXXXX[.1XK E Q R P 4XOX[.OXoX3XH H H 3X|.|.zXXX@XqX] / / ` sX@XxXXX%XkX0X) ` wX+XXXXXXXXXXXOXW H >XzX%XyXXX%XXXXX+XpXwXwXwXcX+XxXlXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N C S M.T.E.E.BXBX).BXBX~.~.~.~.~.~.~.",
+"U.U./.R.U.U.U.U.U.U.U.U.R.U./.U.Z N 6 _ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX%XkX_ o.XXdXgXXXoXU U xX#X{.qXqXsXXX+X#X+XoX1XK H R R W [.zX`.. w rXtXqXwXyXXXXX+XXX|.zXzXzXXXXXgXkX*XwX_ aX+X+XzXzX1XH H H E R R R R E K H >X[.|.XXXXXX%X0X/ / / ` &.%XxXXX@XwX( ` / ` wX+XXXXXXXXX|.oXP H K 4X|.+XXXXX%XcX+X%X%X%X%XXXXXxXkXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N C S M.T.E.BXBXBX).BXBXBX~.ZX~.~.~.~.",
+"U.U./.U.U./.U.U.U.U.U.L.U.U./.R.Z 7 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXXX*X1.` +.dXdXXX|.XXU U OX+X;X#X#XxXzXzX1XR H R R R H I +X+X. . }.bX@X%XXXdXXX+X+X+X+XXXxXkX@XtX` _ pX%.' _ xX+XXXXX+X4X4X1XE H H H R 3X2X[. XXXXXXXXX+XyX/ / / / ' sX%XxX%XwX` ` / / ` wX@XXXXXXXXX|.4XH 1X>X<X|.XXXX+XaX_ -.@X+X+X+XXXXXvXvXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r N B S M.T.E.BXBX).~.~.~.BX~.~.~.ZX~.BX",
+"U.U./.R.U././.U.I.U.I.Y.I.U.L./.Z N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.lXvX+XdXO./ ` ] %.@X|.oXI K I oXOXOX[.oX1XK E R R R R H I +X+Xq 0 ].#X@X=.' ` o.pXdXgXkX*XrXo.@XrX' ` ] -.wXuXXXxXxX+XfXgXlX|.4X4X4X4X4X+X.XzXkX.X.X;X|.@XpX' ` ` &.aXXXXX+XdX( =.-.` ` ' uX%XXXXXXX|.oXR 1X XXXW 3X|.+XXX_ ` ` -.kXfXfX+X+X+XXXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N C D M.T.E.ZXE.BXBXBX~.BX~.BX~.ZX~.~.",
+"R.U.U.U.U./.U.I.I.I.I.U.Y.U.U.U.Z C 6 ..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.lXlXxX*X%.' ` ` o.gXXX+XoXI L E R P P R H K H E R R R H U XXXXvX XXX%X*./ 0X$.` / / ] O.sX*.rX@XvXuXwXhX*X=X#X X+X%XwX' ` _ lX#XlXxXzXzXXX.XeXmXhX.X.X XkX-.*.wXwX@X%XXXXX+XxXuX%X@XuXqXwXXXXXXXXXXX|.2X1X|.XX#X3XH 3X|.XXpX-./ ` ] / ] &.kXdXsXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r N C S M.W.E.ZXZX).~.BXBX).~.).~.~.~.~.",
+"U.U.R.U.U.U.I.U.U.I.U.I.U.U.U.R.Z C 6 X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXxXvX+XgXqXwX .` ` $.%X+XXX2XI K H H H P 4X4XI H R R H I XXXXXX#X-X-.` ) dX%.` / / / / ` _ '.`.y ].`.}.`.q y }.{.bXvXiX%.` wX;._ cXbXzXzX.XmX>X]..X+XsX( ' fX@X+XXXXX+XxXXXcX%XXXXXxX@X@XXXXXXXXXXX[.,X|.kX_ -.;X3XH >X|.+X@XqX/ / / / / / ] / X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N B S M.W.E.E.ZX).ZXBX~.BXBXBXBX~.BX~.",
+"L.U.U.U.U.U.U.U.U.U.R.U.U.U.U.U.Z C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.#.X.X.X.X.X.kXvXkXxX%X@X@XcXqX_ @.@XxX+XzXoX2X2X2X2XOXzXzX<XH R R H P oXzX+XvX`.:.rX,.' rX$.' ` / / / _ u >.  _.u >.&   mXmX_.|.'.`.`.^ { ;.uXvX].lX].].t e '.;XoX+X=.' 0X%XXXXXcXXX@XfX_ pX@XdX_ aX+XXXXXXXXX.X1X<X X+X-.` 8X=X[.<X3XoX|.=XqX/ ` ` / / ` ' X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N C S M.W.T.ZX~.~.~.~.BX~.~.~.~.~.~.~.",
+"U.U.U.I./.U./.R.U.U.R.U.R.U./.U.Z C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XX@X%.+.dXdXfXXX-X<.) XX+XXXXX+X|.|.|.|.+XXXzX<XK E R R H 6XzXXX+X. `.-X*.rX*XlXuX<./ ` ( 9X}.mX>.].{.UX>.e UXi 0 '.w >.e 0 _.`.].].].].]..X:X_..X.X.XXX@X*.) fX+X+XgX_ tX0X' wX-XqX' wX%XXXXXXX|.4X<XXXXX+XkX/ ` 8X#X X3XR 1X2X&XiX9X8X( [ ,.wXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N C D M.W.E.BX).~.BX).~.~.ZX~.~.BX~.).",
+"U.I.U.U.U.U.U.U./.U.U.U.U.U./.U.Z 7 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.dX+XsX_ ' ' ' $.@XXXo.<.%XXXXXXXXXXXXXXXXXXXzX<XK R R R E P oX+X+Xq q -._ vX+X{.{.}.:.:.>.oXy i e y e i >     w y e i UX>.  :._._.].vXpX{ wXlXbXvXXXXXXXXX+XwXXXXXXXxXwX=.` ' 0XuX) ` uX%XXXXXzX[.<X|.XXXXXX%X8X` ' uX%X|.4X<X,XP 1X5X#XiX9XxX#XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N N S M.T.E.~.~.BXBX~.BX~.~.ZX~.~.BXR.",
+"I.U.U.U.U.U./.U.U.Q./.U.R.U././.A N 6 _ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.dXXX@XfXtX0XrX<.gXXX+.O.@X+X+XXXXXXXXXXXXXXX+XoXI E R R E H 6X|. X#X. * { &X%Xu & p 0 e 0 0 0     e w e   mXmXw #.u   e e   2.0X_.vX$XqX[ ' { kX+XXXXXXXXXXX%XXXXXXXXX@X+XwX&.' ' ` *.+XXXXX+X4X<XXXXXXXXX+X+X$XuX0XlXXXXXzX|.zX4X<X,X<X3X5X XzXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N B S M.T.^.~.BX~.~.BX~.~.~.~.~.E.).).",
+"U.I.I.U.U.U./.U.U./.R.P.R.U.R.U.V N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X._ XXXXxX+X%X%X%XXXO.] /  .dXdXdXXXXXXXXXXXXXXX+XzX<XK R R E E P OX X Xq 8X:.XX#Xy e B.mX  $ A 0   mXmX_.y e GXy w { y > mXmX. 0 q `.+XvXvXiX2.[ hX+XXXXXXXXXXXXXXX+XXXXXXX+X%X0X%.wXqX+X+XXXzX4X<XXX+XXXXX+XkXdXkX@X@X+XXX+XXXXXXX|. X|.3XI ,X<X3XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r N B D M.T.E.~.~.~.BX~.~.~.~.~.~.~.~.~.",
+"I.I.I.I.U.U.U.U.Q.Q.L.U.U.U.U.U.V N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX+XxX+XXXXXXXxX+.` / / / ( { <.%XXXXXXXXXxXxXzX<XL E R R E K I oX|.vX#Xi '.}.e e i i 0 $ G t e GXe _.y       y 0Xy e UXi   i mX`..X_.].`.`.w ].lXxX+XXXXXXXXXXXcXXXXX+XgX_ ' 0X#X@XXXXXzX4XH 4X#XxXXX+XyXo.( ( 8XcXdXkXXXXXXXXXxX+X+X+X|. X3XI X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r N C S M.W.Y.~.~.~.~.~.~.~.~.~.~.BX~.~.",
+"I.I.I.I.I.U.U.R.U./.U.U.R.U.U.U.V V 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXxX+XxXXX%X*.] _ rX .' ` ` ' ( XX%.<.+X@X-.+.#XoXI H E R R R H I |.XXXXu   p e . .   & . %   .     '.}.e y u '.u e p p     i i '.].w q   & e `.vXXXcX%X+XXX@XgXo.sX+X%XyX' ` ` { yX#X|.4X<X2X@XhX_ pXXX_ / / / / ) ( ( wX%XXXXX+XkXkXkX+X+X+XzXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r N C S M.W.E.~.~.~.~.E.~.~.BX~.~.~.~.~.",
+"I.I.I.U.U.I.I.I././.Q.U.R.U.U.Y.V B 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX+X+X+X+X@X<.' +.-XdXrXrXtXqXrX .` _ dXkX@._ +X#XXXI H R R R H P XX|.+Xy > mXmX* :.0 0 p mX3X  mX3Xw #.u u ]._.|.}.y y e p     ].].w w 0 >.r q bXyXo.uXwXo.uX0X' aX+XXXXXqXqX*.' wX X4X<X|.zXwX] $.+XfX` ` ` / / / ` ' 0X#XXX+XxXO.' ( -.xXkXxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r C C D M.W.E.~.~.~.~.~.~.~.E.~.~.BX~.~.",
+"I.I.I.U.I.U.I.I.R.R./.R.R.U.U.U.V C 6 _ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXXXkXXXXX@X<.( yX+X+X%X%XXX%X-X%.` / ] _ 8XhX%XxXzXoXI H R R E H I XXXXy i UXe * UXe   t GXe e GXy _.2.y e S mXq ].`.].'.i '.e '.}.y e   . . q vX%X%.' / ` ' ` ' pX%XXXXX%X@X@XwXxX4X,X+XkX_ ' %.#X+X|.wXrX&.` ` ' <.qXlXXXXXXXXXuX&./ / ( { qXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N C S M.T.E.~.BX~.BX~.~.~.~.~.~.~.).~.",
+"L.L./.L.U.U.U.I.U.U.Q.U.R.U.U.Y.V N 6 _ X.X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX$.' *.@X+XsXyX%XXXXX@X&.] %.*X*.` / '  .@X$XxX+XXX|.>XK R R R H P +X|.y > >   . r * >   e &   p & y {.y p i i   >XmXy u y ].q     y y & UX>.q vX+X@X%.` *.0XrXqXXXXXXXXXXX+X+X%XzX3X,X XXXqX0XoXoXoXoX&X&X=XqXrXrXzX@XOXY 2XzXXX@XXX( / / ` %.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.....r N B S M.T.E.BX~.BX~.).~.~.ZX~.~.~.~.~.",
+"I.I.I.U.U.L.I.I.I.R.R.U.U./.U.U.V N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.%.) -.yXXXXX+X+XXXXXXX+XsXo._ cX<.' ) 8XyX@X;.+.+X+X|.,XH R R R H U XX+X'.u u u u y '.u u q q q e y `.`.i     &   i i & y e t >   i q _.e GX>.w @XXX%XpX' wX@X@X%XXXXXXX+XxXxXXXxXXXOXW 2X+X7XY P P P W P P 3X@X&X%X[.U R L 2X+XXXXX%X0X/ / / ` X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N B S M.T.E.BXBXZX~.E.).~.E.~.E.~.~.~.",
+"U.U.U./.U.I.U.U.U.U.U.U.R./.U.U.Z N 6 ..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.@.+.-X+XXXXXXXXXXXXXXXXX%XdXo./ ) -.sX@X%X@X%.( +XzX3XE E R R R R 4X|.XX#X+X@X-.{ X.sXXX+X:XnX:Xe `.{.}.y t i e       e '.'.i y e mX  p q q 0 '.vXkX@XpX' ` o.fX+X+XsXo.gX%XxX+X+XXXXX<XH P R E E E H E R E R P P P R H H ,XXX+X+XXXXX@X0X/ ] ] X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N C S M.W.E.ZX~.~.~.~.E.~.~.~.~.~.~.~.",
+"L.L.U.L.I.U.I.I.I.U.U./.R.U.U.U.V V 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.uXyX+XXXXXXXXXXXXXXXXXXXXX@XcX_ O.*X%XXXXX%X%.qX#XzX,XK R R E R 4X#XrX .kX@X0X' ` -.,.@.-X:X].:Xe > >.mX3 mXnX~ y u u e '.y         0   u XXvXsX_ o.yXrX%.%.` aX%X%XpX' -.+X%XxXXXXXXX|.<XH E R R R R R R R R R H R R H ,X+XxX+XXXXXXXXX+X( [ [ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.....r N C D M.T.E.~.~.ZX~.~.~.~.~.~.~.~.E.~.",
+"U.L.U.L.I.I.I.P.U.L.U.U.U.U.I.R.V B 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XX%XXXXXXXXXXXXXXXXX@X=.@.dX@XdXuX+XXXXX@X-.o.%XzX<XE R E R E U |.@X%.' +.+XdXrXwX@XkXqX;X_._.:Xe e i i ~ G A ~ }.vX].y &   e p y e   e   y  XiX` ` ` ' kXsX' pX+XXXxXqX%._ gX+X+XXXXXXXoXR R R R R E R R R R R R R R H 2XzX+XfXo.wX+XXX+XwXrX-.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r A B S M.T.MX).).BX~.~.).~.~.E.~.~.~.~.",
+"I.L.U.U.I.I.U.I.L.I./.U.U./.U.U.V g 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XX+XXXXXXXXXXXXXXXXX%X$.-.@.<.XX@XXXXXXX@X<.rX#X3XH E R R R E U @XrX` / rX%X+X@X@XXX+X%X#X+X].'.y       % o o > {.bXu i e   i p `.`.t e   i q 9X' *.rXrXXXxXwXxXxX+X+X*XsX' uX$XXXXXXXzX[.W R R R R R R R R E E R E H ,XXXXXXX_ +.cXXXXXXX+X@X%XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} r N C S M.T.E.BX~.~.~.~.E.E.~.~.~.~.~.~.",
+"I.I.L.U.U.L.I.L.I./.U.I.U.U.U.U.V B 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.dX$.%.@XXX+XXXXXXX%X*.o.@X<.` $.%XXX+X+X=.wX@XzX,XH R R R E R 2X=X=.' _ @X0X@.cX%XXXXXXXxX+X'.y u u u u y u '.e y `.y i e   i e _.'.t e p eX  w [ yX*X%XXXXX@XXXXXXXxX@XwX' uXkXO.sX+X+X[.R R R R R R R R R R E R E K 2X|.XXXXqXcX%XXXXXXXxXXXxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...D N B S M.T.E.BX).~.~.~.~.!.~.~.~.~.R.~.",
+"I.L.U.L.L.U.L.L.I.I.I.U.L.U.U.L.V C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.%.' +.@XXX+XXXXXXX%XyXo.( / ` O.%X+XcX-.wX@X|.3XH R R E R E U zX+XfX8XuX*X&.'  .dX+XXXXX+XxX#XtX]  .+X+XlXxXzXu i e   q q 0 y e ].`.e q 0 q q w [ ( kX+XXXXXXXXXXXxX+XdX] %.@XpX' 0X@XzXOXH H R R R E R R H K H H K ,XoXXXXX+X%XXXXXXXXX+X+XXXxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} r N C S M.T.E.BX~.~.~.~.~.~.~.).R.~.~.R.",
+"I.L.I.L.P.L.L.I.I.L.I.I././.I./.V N 6 X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.,.[ ,.bX@X%.%.+XXXXX*X%.' ' ) uX@X&.{ o.XX+X|.1XH R R R R H U XXXX+X@X%X*X-.` / ' +.XX%X0X .+XdX-.0XXX+XXXXX Xu i e u Y Y Y P I [.+X+X|.&X+X+XrX%.%.0X+X+XXXXXXXXXXXXXkX0X+X%XyX' ` uX@XXX2X1XH K H K H K ,X3X3X3X3X+XvXXXXXcX@.wX%X@.' rXXX@XxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...| r N N S M.P.E.BX~.~.~.!.~.^.!.^.~.!.!.!.",
+"I.I.I.L.I.L.L.I.L././.P.P.I.I.U.V C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.iX{  .vX%.` +.%XXXXX%X%.;.-.yX*X=.` / ` <.+X|.<XH R E R R R 2XzXXX%XrX .xX*.' / =.wXXX+XgX0X+X+X@X#XzXXXXX+X5XA 8 $ G L L K K K R P I [.vXsX{ ] yXtX' o.dX+XXXXXXXXXXX+X@XXXXXXX0X%./ wX@X X+X2X3X3X3X3X3XXX X|.#X|.xXxXXX+XdX' &.yX<.=.] _ -.+XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N B S M.W.E.~.~.~.~.!.~.~.~.!.~.!.!.!.",
+"I.P.L.L.I.L.L.L.L.I./.L.U.P.I./.V N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXyX_ ( / ' +.@XXX%X&.o.@X@X@X&./ / ) ;.wX+X|.1XK R R R E U +X|.XX+XdX .] ( =.wX@X+XXX+X+X%XXXoXXXXX2XP P U Q L Q L H 1X3X3X3X3X,XL L P OXzX$.` ` *.$.' pX+XXXXXXXXXXXXXXXXXXXXX$X@X%.` qX+X+X|.|.|.lX@.iX+XXX+XfXo.] aX%X+XkX] ` <.%XxX] ` / qXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N B D M.W.E.~.~.~.!.!.~.Q.~.!.!.R.!.!.",
+"I./.I.L.L.L.L./.I.L.L.L.P.I.I.U.Z 7 6 X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX*X<.] _ ;.pX+XXX@X<.` %.*X-.` / `  .*X@XXXXXoXU H R R R H 6XxXzXXX+XkX .( %X%X+X|.zX3XP P Y P P Y E H E H H 1X3X5X2X|.+XzX|.zXxX3X,XL P OXzX8XrX+X+XqXxX+X+XXXXXXX|.XXXXoXXXXXXX X%X0X%._ wX$XXX XsX' 0X$XXXXX_ +.-.cX+X%X+XwX%.-.kX_ +.&.` -.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r N B S M.W.E.~.~.!.!.!.!.R.E.!.R.R.^.!.",
+"I.I.L.L.L.L.L.L.I.L./.L./.I.I./.V C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX@X<.[ ,.*X+XXXXX@X$.] wX%XyX_ ' ) wX+XXXXXXXzX<XK R R R R H I oX+XxX%XdXqX+X|.XXXX3XH H E E E E E E R H H 3X|.|.zX|.XX+X+X+XXXXX|.|.,XL P [.#X#X+XXX+X+X|.XXXXXXXX[.U P P W P U 4X X#X@X%.` sX@X+XdX` qX$X+XdX' qX-XxX .0X%X%XXX( <.*.-.xX` -.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r C B D M.W.E.E.E.!.!.!.R.!.!.R.!.R.!.R.",
+"I.P.I.L.L.L.P.L.L.L.I.L.P.I.P.I.V C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX+XyX;.aX%XXXXXXX%XyXwX@XxX%XgX-.wX@XXXXXXXXX|.oXU H E R R H H P ,XoXXX+X+XXX3XP U R R R R R R E R R R R P oX|.XXXX+XXXxXxXxXxXXX+XXX|.,XL H U [.+XXXoXXX4XU W W P E L L ,X3X,XK E U 4X X@X%.-.+X+XaX` qX$XXXXX0XkX+XdX/ ] aX*XfX` -.XX( ] [ -.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N g D M.W.E.~.~.!.!.R.E.Q.R.R.R.Q.Q.R.",
+"I.I.I.I.L.L.L.L.L.L./.L.P.I.I.L.V B 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXXX%X@XxX+XXXXX+XxX+X+X+XXXXX+X@X%XxXXXXXXXXXXX|.oXU H R R R R H H P U U P U R H H R R R R E R R R R R R H U oXzX+XpX_ ( _ _ { o.cX+X+X+X3X3X6XR P P P P H L ,X3X<X>X>X5XXXzX#X3X,XL E [.|.#X&.{ _ ] ] 8X@XXXXX@X+X+XdX] ' =.XX .` ` ' +.-.-.dXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...| r N N S M.W.Y.E.~.Q.!.R.R.R.R.Q.R.Q.Q.R.",
+"I.I./.L.L.P.L.L.L.L.I.I.I.L.I.I.V B 6 _ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.dXXX%X*._ *.%X%X;.] _ _ %.XXXXXX+XXXXX+X+X+XXXXXXX X<XK R R R R R R E H H R H R R R R R R R R R R R R R R R H U oX#XdX-.+.` / $.8XXXXXXXXXzXzXXX3X>X<X>X>X>X3XzX X X X XhXO.o.aX;X|.3X,XE 4X|.@X*.` +.%.( wX%XXXO.uX%XXXrX-.*.( ` +.-.-.kX*X@XxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} r N B D M.W.P.!.!.Q.Q.Q.!.R.Q.U.R.R.Q.!.",
+"/.L./.L.L.L.L.H.L.L.L./.H.L./.L.Z N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX@X=.` ( wX+X#XaX&._ / ' %.%XXXXXXXXX%X&.<.+X+XXXXXOXU H E R E R R R R R R R R E R R R E E K K H H H E R R R H U oX X@XXX+.` cX@X+XXXXXXXXXXXXX|.|.|.zXzX|. X+XxX+XpXO./ ` / ) dX+XzXzX1XH [.|.+X0XXX@X*.` yXXX8XfX+XXX@X@X*X&.' tX-X@X+X+X+XxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} S A N D M.W.Y.R.!.!.R.R.R.R.R.R.R.R.R.R.",
+"I.L.L.L.I.H.L.L.L.L.L./.L.L.L.L.Z N 6 ..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX@X+.] uX@X+XlX%X-X<.] &.wX+XXXXXXX@XrX` ` $.XX+XXXzXoXU H R R R R R R R E R R R R E H E 1X3X>X>X>XI E R R R R H U oX|.@XwX` dX%XXXXXXXXXXXXXXXXX+X+X+X+XgX .dXdX@.( / $.$./ ' qX@XXXXX X1XH [.|.+X+XXX+X0XfXXX@X%X+X+XXX .0X-X&.&.@XkX+._ wX+XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.#.X.X.X.X.X.X.X.} S N N D M.(.Y.R.!./.Q.R.Q.R.R.R.R.R.!.!.",
+"I.L.L./.H.L.H.L.L.H.H.H.L.L.L.L.Z N 6 X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.xX+X<.wX=X X1X1XzX+XpXwX@X%XXXXX+XXX@X<./ / ` $.+XXXXX|.oXU H E R R R R R E R R R H E 1X2XzX+XzXzXzXXXI H R R R H K I oX#X0X' yX+XXX+XXXXXXX%X+X%XyX@.dX+XXX-.XXpX` ` ' gXfX` / ( gX%XXXXX.X1XH [.|.XXXXXX@X+XXX+XdX+.uX@X&.` wXcX_ _ ` ' [ =.@XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} S N N S M.W.P.!.R.!.Q.R.Q.R.R.R.R.R.R./.",
+"I.I.L.L.L.L.L.L.H.H.H.H.H.H.L.H.V B 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.=._ <.@X#X<XL 6XXXxX%X+XXXXXXX%X-.{ ( ` / / / _ +XXXXXXXzXOXU H H R R Q R E H K R 1X2X XzX+X+X+XXXXX+XXXI H R R R H P oX+XcX<.( o.@.cXXXXX@XwX+.kXkX-.cXXXXX@X@XwX' <.rX+XyX` / $.xXXXXXXXXX|.1XH [.|.XXXX .wXXX+.) ` -.@XgX' ` ) `  .-.-.%.( qXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} D N N S m.W.Y.E.R.Q.Q.R.U.U.R.R.R.R.R.!.",
+"U.U.I.L.I.H.L.H.H.H.H.H.L.H.H.L.V V 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.+.' +. X>XK H 6X+XXXXXXXXXXXXX%XaX=.=.;._ ` / 0X+XXXXXXXXX|.OX>XU H K K K R <X>X2X|.#XqX_ ,.kX+X+X+XXXzX2XK R R R J R [.|.@XwX` / ` yX+X+XsX) ' yX%X@XXX+X%XyX_ ` ` sX*X@XpX` ` wX@X+XxXXXxX+XzX1XR [.XX%X%.` ] / / ` / O.<.-.%.' ' 0X*X*X+X' *.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.S N C D M.W.W.R.R.R.R.R.R.R.R./.U.R.R.!.",
+"U.I.I.I.L.L.H.L.H.H.H.H.H.H.H.H.V C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.,.' ` =.,XH H 6XzXXXXXXXXXXXXXXX+X@X@X*XsX;.wX@XXXXXXX+X+XXX+XzXOX<X>X<X<X2X X|.|.XX+XdX .' ( o.<.xX%X+XoXI H R R R R I XX#X0X' / / o.XX@XwX' ` sX%XxX+XsXo.` <.$.' wX@X+XpX' ` _ fX+X+XXX+XXXXXoXK 2X X+X@X-.$.` / +.%.' rX-X#X8X&.dX+XXX+X-.] X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} S N 7 S m.W.Y.R.R.R.R.R.U.R.U.R.U.R.R./.",
+"I.I.I.L.L.L.I.H.H.H.H.H.H.H.H.H.V V 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.wX) ) 9X,XK E I zX+XXXzXXXXXXXXXXXXXXXXX@X@X@X+XXXXX%XrX<.xX@X+XlX XzXzX|.|.XX%XXXXXXX*X&.1.+.` ] dXqX,..X2XK R R R R R oX+XXX+./ / %.+XXXcX;.-.xXXXxX+XkX&.-.%X@X$.) dX%XxX-.<.' qX@XxX+X+X+XxXXX1XR [.|.XX#X@X=.' -.XX+.kX+XXX@X#X|.XXXX+X#X8XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...G C B D N.S.Y.R.R.R./.U.R.U.R.U.R.U.R.!.",
+"/./.I.I.L.H.H.P.H.H.H.H.L.H.H.H.V C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.+X,.@.-X4XW E E 1XxXXXXXXXXXXXXXXX+X+XvX-.o.%.+X+XXX@X%.` _ $.+X+XxX+XxX+X+X%X0Xo.o._ _ -.-XrX' ` ( ` ` lX5XK R R R H P [.|.@XwX' ` dX+XXXXX@X@X+XxX+X+XxX@X@X+X+XxX-.XX+X+X-XuX' ) dX@XgX+.yX+XXX|.1XH [.|.+X+X+X8X%.{ rX@XXX+X|.oXI P P P 2X XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...S C B S m.W.Y.R.U.U.R.Y.U.U.R.U.R.U.R.!.",
+"I.I.I.I.L.L.L.H.H.H.H.H.H.H.H.H.Z N 6 ..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XX+.` *.;X,XK R H U U U 1X|.XXXX@X-._ _ ` ` O.+XXX%XrX` / / ` $.%XXXXXXX%X0XO./ / ` <.rX@X@XdX&.=.*.=.rX+XoXI E R R R H I XX+XkX=.-.XXXXXXXXXXXX+XxX+XXX+X+XgX+.yX@X@XXX+XdXO.<.-.+.0XfX{ +.kX+XXXXX|.1XH I 4XzX|.@X+X-.fX+X|.oXI R U >X<X,XR mX#.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} } D V N z M.W.W.Y.R.U.U.U.U.U.U.U.R.R.R.R.",
+"I.I.I.I.I.L.L.L.I.H.I.H.H.H.H.H.Z C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.=.] / / =.7XW K R E H E K <XzXXX%XaX*.*.=._ _ +XXX%XyX_ ` ` ' ( XXXX%XqXo./ ' ` ` -.*X@XqX+.+X@X@X@X*X@XXXzX2XH R R R R R oXXX+X@X@XXXXXXXXXXXXXxX+X+XxXvXXXkX$._ gX+X+X+XkX-.xX-XfX` 1.-.xX+XXXXXXX+XzX1XL H I 4X|.+X@X|.oX,XR I <XoX X X.X2X,XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...D N g S m.K.W.Y.Y./.R.R.U.U.R.U.U.U.R.R.",
+"U.I.I.I.I.I.L.H.H.H.L.H.L.H.H.L.V N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.+.` / ` ` ;.OXP K H K K K P [.+XXX+X@X@X*XyX0X+XXXXX%XsX*.=.*.tX+XXX+XsX_ ` %.=.rX@X+X+XyX-.xX+X%XwX+.xXXX|.2XH R R R E W OX+X@X+XXXXXXXXXXX+X+X+XxXXXXXXXXX@XuX` ) O.O.fX+X@XXXxXxX-.kX@XXXXXXX+X+XXX+XXX3X,XL H U U U U W L I XX XXXXX+XXXzXcXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} S N N D m.W.Y.R.U.U.U.U.U.U.R.U.R.U.U.U.",
+"I.I.I.I.L.L.L.L.L.L.L.H.L.H.L.L.Z B 6 ..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.qX) ) *./  .=X[.<X<X<X<X<X<X1XlXXX@X-.%.+X$X@X+XXXXXXX+X@X@X@X%XXXXXXX%XsXrX@X@X%XXXXXXX+X@X+XxX+XsX-.XX+XzX3XH R R R E R oXhX+.XXXXXX+X+X#XgX . .kX+XXXXXoXkX_ ` ` ` $.xXXXXXXX+X+X@X@X+X+X+X+XgX . .uX@XzX|.>X<X1X<X1X1X1X<XoXXXXX+X+X+XXXvXbXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} D C g D m.K.W.I.U.U.I.U.L.U.L.U.U.U.R.U.",
+"U.U.I.I.I.L.L.L.I.H.L.I.L.H.L.H.Z N 6 _ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.bX@.O.-XwXqX+X|. X|.|.|.zX#X+X+XXX+XwXrX@X0Xo.*.%XxX+XXX+XXXXXXXXXXXXXXX+X%XXXXXXXXXXXXXxX+XxX+XXX+X#X+XzX4XP E R R R H 1X#XqX' dX@XyXO.+.cXqX' $.XXXXXXxX@XwX` $.$.` pX@XxX+X%X+X+XfX+.sXXX+.o.<.<.` _ pX@XXX|.|.|. XzX|.|.|.+XXXxX<.o.uX%X,.0X#.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X._ r C N D M.S.P.U.U.L.U.P.L.U.U.U.U.U.U./.",
+"L.L.I.I.I.I.I.L.L.L.L.L.L.I.H.L.Z N 6 ..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.vXwX( =.*X%XXXXXXXXXXXXX@X-.%.@X+XXX+X%X@X%.' _ XX+XxX+XXXXXXX%X+X%X%XXXXXXXXXXXXXXXXXXX+XxXXXXXXXXXXXzX[.R H R R R E R XX@X0X' fXyX_ ` / _ ) ` sX@X+XxX%XdX) ' yXyX' uX%X+XfX,.fXXXo.+.XXsX' +.XXcX] / ) aX@X+XXX+X+X+XXXXXXXXX+XcX` o.gX+X-.pXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N N S m.S.P.L.U.U.I.U.I.U.U.U.U.U.U./.",
+"U.I.U.I.I.I.I.L.L.L.L.L.L.L.L.P.V N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX@X,.[ %.%X%XXXXXXXXXXX@X$.' %.+X%XXXXXvXyX_ ` $.@XXXxX+X%X@XrXO.O.%.+XXXXX+X%X+XXXXX+XxX+XXXXXxX+XzX4XR H R E R E H 1X+XgX_ / _ / ` ` / / <.+._ +.kX+XXXkX;.+.( ( ' pX%X+XyX' uXfX[ wX@XXX-.kX@XsX` ` / ) @.sX+X<.o.pX+XXXXX+X+XXX-.fX+XXX%XXXX.X.X.X.X.X.X.X.X.X.#.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N h z m.S.W.L.I.I.I.Y.I.L.U.U.U.U.U.U.",
+"Y.I.I.I.I.I.I.I.I.I.L.I.L.L.L.L.Z N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXvXwX*.%.+.=.$X+XXXXXXX@X%.' ' _ *.%XXX+X@X=.1.rX+XXX+X@XrX ./ ` ` _ XXXX%XwX<.xX%XXXxX+XxX+XXXzX4XI R E R R R R H 1XzX*X8X` / <.%.*.+./ ` dXuX' ' yX%XxX+X@X+X=.%.&.kX%X@XwX' wXXX-.dXXXXX%XXXXXXX-.<.` ` ' rXkX`  .dX+XXXXX,.wX%X@X+XXXXXXXXXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r A N m.m.S.P.L.I.I.I.L.U.L.U.L.I.I.U.U.",
+"U.U.U.L.I.I.U.I.I.I.L.I.I.I.H.H.V C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXXX%X@X-X+.' *.@X+XXXXX@X%.1.%.%.rX+XXX@X-.o.@X@XXX%XqX ./ ' ` ` ` ) XXXX@X*.' { <.+XXXXXXXzX4XI W H H R R R H K 1X X#XpX_ / / kX@X-XwX` / o._ ,.-.cX+XXXXX+X%X*X*X@X%XkX+.1.&.cX+X@X+XXXXXXXXXXXXX@X%X-.<./ _ O.' -.*XoX$X+X&.sX+XXX%X+X+X+X+XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N N D m.M.K.L.I.I.I.I.I.I.I.I.I.I.U.U.",
+"U.L.U.U.U.U.U.I.U.I.L.I.Y.I.I.Y.V C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.cX%X+X@X-.) %.) *.@XXX@X-.O.*X@X@X%XxXXX@XuX( %.%XXX*X%.' / %.%.*.*._ ,.@XwX) %.%.-.+XXX+XzX4XW H R R R R E H ,X3X#XpX+.) ` ` ` gX@XfXo./ / / ' sX*XXXXXXX@XsXO.o.O.dX@XuX[ wX-XXXvXXXXXXXXXXXXXXXXXXXXX@XkX` ` '  .*.pXXX,.uX*X+XXXXX$. . .O.wXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N V D m.S.P.L.I.I.I.I.I.I.I.I.I.I.I.U.",
+"U.U.U.U.U.I.U.I.I.I.I.I.L.I.I.L.V V 6 _ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.&.o.&.*X+. .-X<.[ =.@X%XqXrX%XXXXXXXXXXXxX@XuX-.+X%XrX` ` -.@X@X@X*XyX-.*X=.` %X@X%XXXXX|.4XR E R R R R H L 1XzX#XpX( ` / / <.-.xX*X0X' / / / $.XXXXXXXX@XgX%.%.%.%.kX+XxX<._ dXoXXXXXXXXXXXXXXXXXXXXXXX+XxX&.%.*.xXkX( ) o.dX+XXX@XkX/ / ` _ yXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r V B B.m.K.W.L.I.I.L.I.I.L.I.I.I.L.L.U.",
+"U.U.I.U.U.U./.U.U.U.I.I.Y.L.I.L.V V 6 X.X.X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.rX1.0X*X+.+.*XwX1.rX+XXX@X@XXXXXXXXXXXXX+XXX+X%X%XtX` $.rX@X+XXXXXXX+X@X%XgX_ +.%XXXXX|.4XR E R R R R R ,X3X|.XX+XdX ./ / ] dX*X%XgX( ` ` / $.+X+XXX+XdX+.{ uX*X@X*X%XxX+XxX&.dX+XXXXXXX+X%X+XXXXXXXXXXX%X+X@X*X@X+X .o.*.dX+X+XXX<.O./ / ` rX%XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...| r N g z m.S.K.L.I.I.L.H.H.I.L.L.I.I.L.I.",
+"U.U.U.L./.U.U.U.U.U.I.I.U.I.I.I.V C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.xX@X*X-.' +.@X+X@X%XXX@X-.*.%XXXXXXXXXXXXXXXXXXX+XwX-.*X@XXXXXXXXXXXXXXXXX@XhX-.XXXXXX|.3XK R R R R E R oX|.+XXXXX@XqX' ` / +.XX+XfX%.%.%.=.+X+XXXXX%XwX[ ' o.kXkX+.fX%XXXXX@X+XXXXX%X@XdX<.sX+XXX%X+XcX<.yX+XXXXX+X<.rX-X@X+X+X+X%.` o.<.` -.+XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r A N D m.S.K.Y.Y.Y.L.P.L.L.L.L.L.I.L.I.",
+"L.U.U.U.U.U./.U.U.I.U.I.Y.I.L.I.V V 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXXX+XqX1.qX+X+XXXxX@X-./ -.%XXXXXXXXXXX+X%X%X%XXX+X@XoXXXXXXXXXXXXXXXXX+X+X+X*X+X%X+X X>XH R R R E E <X#X+X+X@XXX+XdX%.%. .' pX@X+X@X@X@X@XXXXX+X+X%XcX=.%.*.xXkX=.dX+XXXXXXXXX@XdX<.@._  .XX%XcX<.sXfX' rX*X@XXX+XkX_ O.+.yX+X%XkX@.dX@X' -.#XX.X.X.X.X.X.X.X.#.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r N C D m.S.P.L.L.L.L.I.H.H.I.L.L.I.I.I.",
+"U.U.U.U.U.U.U.U.U.U.I.I.I.I.I.Y.V C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.#.X.X.X.X.X.X.X.X.X.X.X.kX%X%X@X*X%XxXXXXX%XrX` @.@X%XXXXXXXXX%X0X@.@.%.+X%X#X%X@X+XXXXXXXXXXX+XqX<.+XwXO.O.%.4XW R R R R E P %XhX@.@.<.XXXX+X@X*XdX*.<.<.xX+X+XXXXXXX+XdX+.,.cX@X@X@X+X+X@X@XxXXXXX+XkX+.( ` ` ' wX@XcX .' _ O./ ) @. .sX@XfX .+.' -.*XXX+.8X@XXX-.pXXXX.X.X.X.#.X.X.X.X.X.#.X.X.X.X.X.X.X.X.X.X.X.X...| r N 7 z m.S.P.Y.Y.H.L.H.L.H.L.P.L.L.I.P.",
+"U.U.U.U.U.U.U.I.I.I.I.I.I.I.L.L.V B 6 ..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XX-.@.-.@X$X+XxXXX*X<.` / O.=.%XXXXXXX@X%.` ` -.@X0X@.@.%.+X@X+XXXXX+X+XpX$.,.( ,._ ] I L R R R E E P &X8X' ' ` fX+XXXXXXX+X-X0X' sX+XxXXXXX+X*XwX' ` pX%X%XxXxX%XyX<.kX+XXXXXcX%.1.%.%.+._ @.)  .,./ / ` `  .@.0XXXO.0X%X` ( yXcX' -.*X+X@X@X+XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X._ r N g D m.S.W.H.H.H.L.H.H.L.H.L.P.I.H.I.",
+"I.I.I.I.U.I.I.I.I.I.I.I.I.I.L.Y.V N 6 X._ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.+X+.` / @.-.@X@X%XrX( ` ` <.rX@XXXXXXX@X%.' -.*X%XwX) ` /  .*.+X@X+XXX+X@X-X=.%.-X;.%.OXY H R R R E W oXgX%.%.&.XXXX+XXXXXXX+XfX&.XXXX%XoX#XsX,._ / / sXdX$.kX%XfX%.@.wX%XXX%XXX@X@X@X*XdX' o.%.XXcX`  .<.` qXXX_ <.+._ _  .%.sX@X%._ +.aX+X$.O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.#.X.| r C B D m.S.J.H.L./.H.L.H.H.L.H.H.L.L.L.",
+"Y.I.I.I.L.U.I.I.I.I.I.L.Y.I.L.L.Z N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.+X+./ / / ' o.=.@X<./ <.rX@X+XxXXXXX%X*X%.&.@X+XXX*X=.` / ` `  .+.%.%XwX .O.o.@XwX_ XX X3XK E R R R E ,X|.@X@X$XXXXXXXXXXXXXXX+X%X%XyX<.XXdX_ ` / / ` gXuX' yXxXo.pXyXO.cXcX$.dX+XXXXXXXcX&.cX-XcX .' uXxX/ _ O. .dXXXO.@.rX-X+X+XxX/ ` ) _ ) 1.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.| r C B D m.S.P.H.L.H.H.H.H.L.H.L.L.L./.L.",
+"I.I.I.I.Y.I.I.I.I.L.L.I.L.I.L.L.V N 6 ..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.-.( ` ` / $.<.$.+./ @.-X*X%XxX%X%X@X0X@.@.@X@X+XXX@X*.` / / / / ` <.<.) +.<.-.@XpX&.+XXXOXU R E R R E H ,XXX+XXXXXXXXXXXXXXXXXXXXX+XdX .sXxX ./ / / ` fXpX' sXpX` o.o.' uXyX' wX%XXXXXXXXX@XxX$.<.+.' wXcX/ / ' 0X@XO.rXXXO.yX%XXX%X*.` _ 1.sX@XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r C B D m.S.(./.H./.H.H.L./.H.H.L.H.H.P.",
+"I.I.I.I.I.I.I.I.I.I.I.I.L.L.L.L.h B 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.@.` $.1.rX*X@X*XqX) / +.@.&.*X0X+.+./ / / +.+.%.%X@XpX_ / / ` / &.-X*.' %X-X@XXX+X@XXX+X X3XK R E R R R K ,XXX|.XXXX+X@XXXXXXXXXXXXX@XwX .@XwX` / ` ` yXcX=.xXaX' ` ` +.%.O.` wX+XXXXXXX+XcX+.' wXgX@.kXdX` `  .kXXX=.fXkX' -.@XxX@X%X;.sX*X+XxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r Z C z m.(.H.L.H.H.H.H.H.H.H.L.L.L.H.L.",
+"Y.I.I.I.I.I.I.I.I.I.L.L.L.H.L.H.Z V 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.8XrX*X@X@XXXXX%X*X<.` / +.-.*X%.' ` / / ` ` / <.+.%.*X=.` ) <.-.@X+XyX_ _ @.%.XX+X%X@XwX%.oXY E E R R E E H 6X+XXX+XyX$.XX@X+XXXXX+X*XqX' _ _ / +.%.%.XX+X@X+XkX%.1.%.+XyX' +.cX+XXXXXXX+XsX' / o.%.cX%XxX*.1.dX+XXX@XoXxX=.sX+X+X%.uX*X+XXXXXXXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.r C 7 D m.K.K.H.L.H.H.H.H.H.H.H.H.H.L.H.",
+"I.I.L.L.L.I.I.I.L.L.L.H.I.H.L.H.Z N 6 ..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.vX=XXXXXxX+X%XrX+.) `  .*X@X@X%.' ` ` / $.) O.*XwX<.<.) / _ @X@XXXXX%XyX<.<.=.@XwX%.@X-.' $.OXP H R R R E E K ,XXX+XgX_ _ <.xX@X@XgX+._ / +. .` gX@X@XXXXXXXxX+X-X*X*X@XpX' uX-X+XXX@XXX+XsX/ / ' 0X@XXX+X@X*X@X+X@X+XvX+X@X%X@XkX' -.@XXXXXXXcXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...r C B D m.M.P.L.L.H.H.H.H.H.H.H.H.H./.L.",
+"L.Y.Y.L.L.L.L.L.L.L.L.H.L.H.L.H.N N 6 X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.;.=.@XXXXXXX@X,.' ` / rX%X+XtX) <.$.1.-.-X%.' %.@X-X%.' / / %.%XXXXXXX+X@X@X%X+XyX_ @._ +.=. XOXY K E R R R H H ,XXX;XdX$._ _ @.@._  . .` cXwX' +.XXXX@X%X%X%XkX<.+.<.XXXX,.o.<.dXcX%.gX@XsX'  .%.dX+XXXXXxX%.yXxX<.pX+XXX+XXX%. .` -.@XXXXXXXcXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...G C B D m.K.K.L.L.H.H.H.H.H.H.H.H.H.H.H.",
+"Y.L.L.L.I.L.L.L.L.L.L.H.L.H.L.H.Z N 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.-.<.-.@X%X@X@XqX<./ @.*XXX@X,._ *X@X@X%X%XwX1.-.+X@X=.' / / *.+XXXXXXXXXXXXXXXXX@X-.' ( +X*XxXzXOX,XP H R E E J E U 1X+X=XdX<.<.,.O.kXuX' fXXX+.` sXdX+.+.<.xXuX' ` ' wX*XyX' / _ o.` O.kXXX,.0X-X@XXX@X@XdX` _ $.<.sX+X+X+X<.` ` ` ) yX+XXXXXXXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...S C B z m.S.K./.H.H.H.H.H.H.H.H.H.H.H.H.",
+"I.L.L.Y.L.L.L.H.H.L.H.H.P.H.H.L.V B 6 ..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.xX@X0X<.,.@.-.*X-XqX) -.+X%XwX) &.@XXXXXXX+X@X%X+X*XuX) ` &.@XXXXXXXXXXX+X@XXXXX+XyX<._ $.@X@X#XXX|.OXY K H R R R E H U 6X1X$X=X*XtX{ _ ` sX-XqX[ sXcX$.o.' sXpX`  .%.xX@XxX,.` O. ./ ` wX@XsX_ +.dX+X<.+. ./ ` rX*X+XXX+X<.` / _ $.<.yX%XXXXXxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...} D C 7 D m.S.K.Y.H.L.H.H.H.H.H.H.H.H.H.L.",
+"Y.L.L.L.L.H.L.L.L.H.L.H.H.L.L.H.V B 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXxX*X+.' +.) +.-.-X,._ %XXX@X<._ %X+XxXXX+XxX%XwX=.*XwX&.+XXXXXXXXXXX%XuX%.%X@XXX+X-X-.'  .@.%.+X@X XOX,XU H E R R E E H K U 1X+XlX1._ `  .<.1.%.xX+X*XwX' sXyX' pX-XdX<.kXsX' yXdX' ' tX-XsXO. .o.O._  .` / ' 0X@XXX%XkX' / o.fX*X@X+XXXXXXXxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} F C N z m.S.P.H.H.L.H.H.H.G.H.G.H.H.H.H.",
+"I.I.L.L.L.H.H.L.H.L.H.H.P.L.H.H.Z C 6 _ X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX@X8X` rX-X$.' @.@XrX-.+X%X-X<.O.#XxX+XXXXXXX@X%.' *.*X*XXX+XXXXXXXXX*X&.' @.=.+XXX+XyX_ ` @._  .,.%.#X;XOXU K H H R R R R E H I 1X@XkX .` ' yX*X@X+X+XkX*.xXaX' _ ,.<.1.kXkX*.dXXX%.$.$.<._ wXcX' _ xXxX] /  .fX+X+XXX=.+.` -.*XXXXXXXXXXXxXxXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} S C C D m.S.K.H.L.H.H.H.G.H.G.H.H.H.H.H.",
+"I.I.L.L.L.L.L.H.L.Y.E.BXE.E.R.L.Z C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kX+X8X-.@X*X<.] -.%X+X@X@XqX+.)  .@X+XxXXXXXXX*X%.' ` +.-.+XXXXXXX+X@XwX_ / / ] XXXXXX%XpX*.-X8X` / `  .%.#XOX,X,XY K R R R R R H L 6X%XlX1.%.xXkX<.,.XX+X@XxXO.O.<.<.kX@X%XxX@XXXXX@X@XkX<.<.dXXX*.gX%X+.` ' 0X@XXX+X+.-.+X@.sX+XXXXXXXXXXX#X+XX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...} S C C z m.W.W.Y.L.K.H.H.H.H.H.H.G.H.H.J.",
+"I.I.L.L.L.L.L.H.I.ZXCXDXDXAXMXT.Z C 6 X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.kXxX@X*XrX@.` @.*XXXXX%XtX` ' ` ` =.@XXXXXXXXX+XuX<.<.` ( +XXX+XXXXXwX` ' ` ` *.+XXX+XxX%X@XyX) ] ` `  .) +.+X|.|.[.1XU J R R J R R H U 1XOX&X@XqX[  .xXXX+XfX%.cX@X@X+X+XxX+XxXxX+XxX+XxX@X@XxXXX@X+XxX$.<.<.fX+X+XfX' { o.8X*XxXXXXXXXXXXX%.+.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...S A C S M.E.MXZXE.Y.H.H.J.G.H.H.H.J.H.J.",
+"Y.I.I.L.L.L.H.L.CXCX= = - 2 CXE.Z V 6  .X.X.X.X.X...X.X.X.X.X.X.X.X.X.X...X.X.X.X.X.X.X.gXkXkXkX8X+.,.-.oXkXkXxXrX+.,.,.,.;.kXkXkXkXkXkXkX+X+XrX=.kXkXkXXXXXwX+.,.<.*.lXkXkXkXkXkXcXuX,.,.,.%.XXuX%.dXcXkXlXlXdXT ! ! ! ! ! ! J ! T T {.hX%.dXxXXXkXkXXXcXdXdXXXkXkXcXkXkXkXkXkXkXkXkXxXkXkXkXlXXX+X+XkXXXdXkX%.,.,.pXlXkXkXkXkXkXkX%.+.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...D 7 C m.NX= O , - CXP.H.J.H.J.J.G.H.J.J.",
+"I.I.Y.L.L.L.L.L.ZXDX< < - < DXMXF N B ^ | X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.^ D B B B.NX2 < 2 < CXY.H.G.H.G.H.G.J.J.J.",
+"I.I.L.L.L.L.L.H.AXHX< @ , 2 KXMXS.V g >.} X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.} 3.V C h B.GX< + + = HXE.H.J.H.H.J.H.J.J.J.",
+"I.I.I.I.I.I.H.H.SXJX+ @ - < JXAXJ.g A A 3.X.X...X.X.X.X.X...X.X...X.X.X.X...X.X...X.X...X.X.X.X...X.X.....X.X.X...X.X.X...X.X.....X.X...X.X.X.X...X.X.....X.X...X.X.X...X.X.X.....X.X.X...X.X.X...X.X.X.X...X.X.X...X.X.X.X...X.X.X...X.X.X.X...X.X.X...X.X...X.X.X...X.X.X.X.X...X.X.X._ X...X.X...X.X.X...X.X.X...X.X.X...X.X.X...X.X.X...X.X...X.X...X.X.X...X.X.X.X.X.X.X.X.X._ ) ^ D C N h NXGX9 , O , HXE.J.J.H.H.H.G.H.H.G.",
+"I.Y.I.I./.H.I.L.AXLX1 1 - < JXAXJ.Z N N r ^ X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.^ >.B C B h N.GX, , + 1 JXE.J.H.J.J.J.G.G.G.G.",
+"I.I.I.I.I.I.I.H.AXJX, 2 < < JXCXH.S.D A N r ^ O.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.+.>.h N V 7 h N.GX+ < < < JXCXJ.J.J.J.J.H.J.G.G.",
+"U.I.I.I.I.I.I.L.AXJX< 1 < @ JXAXH.H.m.m h N r $. .X.X.X.X.X.X...X.X.X.X.X.X.X.X.X.X.X.| X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...X.X.X.X.X.X.X.X.X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...X.X.X.X.X.X.X.X.X.X.X.| ^ r h N V 7 5 l NXGX< = 2 O JXE.J.H.J.J.H.G.J.J.G.",
+"I.I.U./.I.L.H.L.AXJX= + - < JXAX(.H.L.F N A C D 3.^ } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } O.} } } } } ^ 3.S V V V g 5 h z NXGX, ; = , JXE.J.H.H.G.H.G.G.J.G.",
+"U.U.I.I.I.L.L.L.DXJX+ 1 2 , JXCXJ.J.G.G.F 7 A A N g V V B N C C N Z N N N N N g N N N N N N N N h V B N B N N N V V N N V N g N N N N N B g N N B B h N N N g N h V N N V N N g N N h N h V N N N Z N g N N N N N N N B V V N N B V N g g N V B g N V N N N N B V g N B g N N N N g N N C B N N N N N N g N N N g N N N N N N N N N N N B N N g N N N N N N B N N B Z Z N N Z N N V C 7 5 7 l m.NXGX, < , X JXCXG.G.G.J.J.G.H.G.G.",
+"U.I.I.U.L.L.L.L.AXJX1 X o 3 JXDXJ.J.J.H.m.z Z V h h Z V C C C C N N N N N N N N N N N N N N N N N N C N C N N N N N N N N N N N N N N N N N C N V N N Z N N Z Z N N N N N N N N N N C C C C B N N N N N N N N N N N C C N g N N B N N N V N V C N N C N N B N C N N N C N N N C N N C C C C N C C C C C N N C C N N N C N C C C N N N N N N N N N N N N C N N N N N N C N C C N C 7 7 7 6 7.7.m.CXJX, = < < JXCXJ.J.G.G.G.G.G.G.G.",
+"I.U.I.I.I.L.L.L.AXJX, 1 2 @ IXGXJ.J.G.J.J.J.m.m.F h h h g g B g g g g g N g g g g g C g N g g r g B g g g g g g g g h g g g h g h g g N g g N g g g g g g g g g h g g g g g h h h g g g g g h h g g g g h h g h g g g g g g g g g g g g g g g g g h g g g g g g g g g g g g g g g g g 7 g g g g 7 g g g g g g 7 g g g g g g g g g g h g g g g h g h g g g g g 7 g g g 7 g g 7 8 3 8 5 5 l 7.8.m.DXPX, 2 + @ JXMXG.H.G.H.H.G.J.G.G.",
+"Y.I.I.I.L.L.L.H.AXJX< X < , PXPXGXDXAXCXZXCXCXMXNXT.M.B.z z h f 5 h 5 5 5 5 7 z 5 7 5 5 7 5 5 5 7 5 5 5 5 5 5 5 4 4 5 5 4 4 4 4 4 5 4 5 5 4 5 4 5 5 5 5 4 4 5 5 4 4 4 4 5 5 4 4 4 4 4 4 5 4 4 4 4 4 4 5 4 4 5 5 4 4 4 4 4 4 4 4 : 4 4 4 : 4 : 4 4 : 4 4 4 : 4 4 4 4 4 4 4 4 4 4 4 4 : 4 4 4 4 4 4 4 4 : : 5 : 4 : 4 4 : : 4 5 : 4 4 5 4 5 5 4 4 4 4 4 5 5 5 5 4 4 4 5 5 i S B.B.N.mXmXNXNXNXNXGXLXIX9 , 1 # JXAXG.G.J.J.G.G.G.G.G.",
+"L.I.I.I.L.L.L.I.ZXJX< < - , PXPXPXJXJXLXJXJXJXGXGXCXT.M.B.b z l z z z z z z z z z z z 7.z z 7.z l l z z l z l l l l l l l l l l l l l l l l l z l l l l l l l l l l l z l l l l l l l l l l l l l l l l l l l l l l k l k k k k l k k k l k k k l k k l l l k k l k k l l k k l k k k l l k k l l k k l l l l k l l l l l k l k k k l l l l l l l l l l l l z z z l z B.M.NXmXGXGXGXGXGXGXGXJXPXPXIXO , < + JXMXJ.J.G.G.J.J.G.G.G.",
+"L.U.L.I.L.L.L.H.ZXJX= < < + 9 1 , < < O , 1 1 1 O , - NXW.m.m.m.7.m.m.m.m.m.7.m.8.m.m.m.7.8.m.7.8.m.b 7.7.7.b b 7.7.7.7.7.7.7.7.7.7.7.7.7.n 7.n 7.7.7.7.7.7.b 7.7.7.b 7.7.7.7.7.7.7.7.7.7.7.7.b 7.7.7.7.7.7.7.7.b b 7.7.7.7.7.c c 7.b b c b v 7.c c c v c c b c l c c 7.c 7.c c c 7.c 7.7.c 7.l 7.7.7.c c 7.c 7.7.c c 7.7.c c 7.c 7.7.7.7.7.7.7.7.7.7.7.b b 7.7.7.7.8.T.NX, + < , = < 2 2 < 1 9 @ 9 < < X 3 HXAXG.J.G.H.G.G.G.G.G.",
+"U.L.U.U.L.L.L.H.ZXGX< + < 1 1 @ 2 - = = , - - X - O O CXT.V.S.V.m.V.V.C.V.V.V.V.K.m.V.8.V.m.V.V.8.V.V.k.g.m.V.8.g.8.g.8.8.g.g.8.V.8.V.8.V.g.V.V.V.g.g.g.m.8.V.8.V.8.g.g.8.g.g.8.g.g.8.8.g.8.8.g.g.8.g.8.g.g.g.8.g.g.8.g.8.g.8.8.g.g.8.8.8.8.8.8.8.8.8.8.8.8.8.6.g.6.8.p.8.9.g.8.8.8.8.g.8.8.8.d.8.p.8.8.8.8.9.g.8.8.g.8.8.8.8.8.8.g.8.g.8.g.g.8.g.l.m.8.V.8.V.8.m.8.8.NXDX< 3 + , - = # + X O O < O = < , + HXCXG.G.G.G.G.H.G.G.G.",
+"L.L.U.L.L.I.L.L.~.GX2 < - - , 2 = < 2 + 2 X 2 X @ @ = AXE.D.K.A.D.D.D.K.Z.K.Z.K.K.F.D.Z.K.C.F.V.D.V.C.C.k.k.k.k.k.k.k.k.k.k.k.l.k.k.l.V.k.k.V.V.k.V.k.k.k.k.V.k.k.g.k.l.k.k.k.l.l.l.j.l.j.j.l.j.l.j.l.k.k.l.k.k.k.k.j.l.l.l.l.l.h.l.s.h.g.l.s.g.l.d.l.g.g.s.h.g.s.h.l.h.l.s.l.g.l.h.l.s.s.s.l.l.l.g.s.h.h.h.s.l.s.s.l.h.h.h.l.h.h.j.l.l.k.l.k.k.j.j.k.k.k.k.k.k.k.k.n.MXDX= 2 X , , O O 1 , - < < 2 2 = , < HXE.G.G.H.G.G.G.G.G.G.",
+"U.U.L.L.H.I.L.H.U.VX; = < , 1 @ < < @ 1 @ 1 1 = O , < MXQ.G.G.G.D.D.G.G.D.D.G.G.D.K.G.D.K.Z.F.D.D.F.F.C.C.C.V.k.k.c.k.c.k.n.C.C.C.C.C.C.C.F.F.C.C.C.k.C.c.C.k.C.C.C.k.C.V.k.c.k.k.j.k.k.j.j.x.x.k.k.c.k.c.c.k.k.k.k.c.x.j.j.h.j.x.x.x.h.h.z.z.h.h.h.z.z.z.z.z.z.h.l.h.s.h.h.z.z.h.h.j.j.k.h.j.h.j.h.j.j.h.l.j.h.h.k.j.h.h.h.h.j.v.j.k.z.k.k.C.k.C.C.C.C.C.V.C.C.F.c.C.MXDX- < 1 1 , 1 @ - < < - - , < + < = AXU.G.G.G.G.G.G.G.G.G.",
+"U.L.L.I.I.H.I.H.I.E.CXDXHXJXJXJXJXJXJXJXJXJXJXJXHXFXDXBXU.G.D.G.J.D.J.D.G.G.G.D.G.D.D.D.D.D.D.D.D.F.F.V.C.C.C.k.C.k.c.c.k.C.k.C.k.C.C.C.C.F.F.C.C.C.C.C.C.C.C.C.k.C.k.k.k.k.k.c.c.c.k.k.k.j.k.x.j.v.j.k.j.c.k.k.k.k.x.c.x.x.j.j.z.l.h.j.s.h.h.h.h.z.s.z.h.z.h.z.z.h.s.h.h.h.h.h.h.h.h.j.h.j.h.h.x.x.j.j.h.l.h.h.h.h.h.z.h.j.j.j.k.x.k.k.k.n.C.k.k.c.C.C.k.C.C.C.C.C.k.E.CXDXHXHXLXJXLXJXLXJXJXJXLXJXJXHXHXCX!.U.G.G.G.G.G.G.G.G.F.",
+"L.L.L.L.H.H.H.H.H.P.!.E.ZXAXCXAXCXAXAXDXAXAXDXCXMXMXBXP.D.D.G.D.G.D.G.G.G.D.G.G.G.G.G.D.D.D.D.D.F.D.F.F.C.C.C.C.C.C.c.c.c.k.k.C.C.C.C.C.C.C.C.F.C.C.C.C.C.k.C.k.C.k.V.C.k.C.c.c.c.c.k.k.j.j.c.c.k.k.j.j.j.c.c.x.c.k.x.x.x.j.v.h.z.z.v.s.v.s.s.z.s.s.s.z.b.s.s.h.s.h.s.h.s.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.h.z.h.h.h.h.h.h.j.h.j.j.j.k.k.z.k.c.k.C.C.C.C.C.C.C.C.V.C.C.C.F.E.CXMXDXDXDXDXDXDXDXDXDXDXCXCXCXE.E./.G.D.F.G.G.D.G.D.D.D.",
+"L.L.H.L.H.H.H.H.H.H.G.H.H.G.G.H.G.G.G.G.G.G.G.F.D.D.D.D.J.G.D.G.G.D.G.D.G.G.G.G.G.G.D.G.G.G.G.D.D.F.F.K.C.C.C.C.C.k.c.c.A.C.c.C.V.C.F.C.C.C.C.F.C.F.C.C.C.c.C.C.C.k.C.k.c.C.c.c.c.c.k.c.c.l.j.c.x.j.x.h.v.v.j.k.c.j.j.x.j.j.h.j.z.s.s.h.s.s.s.h.h.s.h.z.s.s.h.s.s.s.z.s.z.z.z.s.h.h.h.z.h.h.h.h.z.h.h.j.h.h.h.h.h.i.z.h.j.h.h.v.x.x.c.c.k.c.c.C.k.C.k.C.C.C.C.c.k.k.k.C.C.k.k.C.k.C.C.C.C.C.C.C.Z.C.F.Z.D.D.D.D.D.G.D.G.D.G.G.G.D.",
+"L.L.L.H.H.H.H.H.H.H.H.G.G.H.H.H.G.H.H.G.G.G.G.G.D.D.D.D.D.D.G.G.Z.D.G.G.G.G.G.G.G.G.G.D.D.D.G.D.D.D.F.C.Z.C.Z.C.c.C.C.c.k.k.k.A.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.k.k.C.k.C.C.c.C.C.F.c.k.k.c.c.x.j.v.j.j.j.l.j.j.j.v.j.v.j.j.v.h.z.z.s.s.h.s.s.i.i.s.s.s.s.h.s.s.s.s.z.s.s.s.s.s.h.h.h.x.h.h.z.h.z.x.h.x.h.h.h.h.h.z.z.h.h.z.l.j.j.v.x.x.k.c.c.C.k.C.k.C.k.C.C.C.C.C.V.k.C.k.C.k.C.k.C.k.C.C.C.C.C.C.C.Z.Z.D.F.D.D.D.D.F.D.D.G.D.D.D.",
+"L.L.H.H.H.H.H.H.H.G.G.H.H.G.H.G.H.H.F.H.H.F.G.G.G.F.F.D.D.D.G.D.Z.G.G.G.G.J.G.G.G.G.G.G.G.G.D.D.K.Z.C.D.Z.C.C.C.C.C.c.C.C.k.C.C.C.C.C.C.C.C.C.C.F.C.k.C.C.C.C.C.C.k.A.k.C.c.C.c.k.c.c.j.c.c.x.x.j.j.j.h.h.h.j.j.l.j.h.h.z.h.z.z.i.h.i.s.s.s.s.s.s.s.s.s.i.s.s.s.s.s.s.z.z.s.h.s.h.h.h.z.j.h.h.h.h.h.v.j.h.h.h.s.z.s.h.h.x.l.x.j.j.k.k.k.c.c.C.C.V.C.C.C.C.C.C.C.C.C.C.C.k.V.C.k.C.C.C.C.C.C.C.C.C.C.F.A.Z.F.D.D.D.D.D.D.D.D.D.D.D.",
+"H.H.H.H.H.H.H.H.H.G.H.H.G.H.G.H.G.G.H.F.G.G.G.G.K.D.D.D.D.D.G.D.G.G.G.G.J.G.G.G.G.G.G.G.G.D.G.D.D.D.Z.C.Z.Z.C.k.C.c.C.c.k.C.C.k.C.C.C.F.C.F.C.C.C.C.k.C.k.C.k.k.k.C.C.C.k.C.c.C.c.c.c.c.j.c.x.x.j.l.z.h.h.h.h.h.v.h.h.h.s.s.s.s.i.s.i.i.i.i.i.i.i.i.s.i.i.i.i.i.s.s.s.s.s.s.s.h.s.h.z.h.z.h.h.h.h.z.h.h.h.h.h.z.s.z.h.h.z.x.x.c.k.v.k.v.k.c.c.C.k.C.C.C.k.C.C.C.C.C.C.k.k.k.k.C.k.C.k.C.C.C.C.C.C.C.C.F.C.F.D.F.Z.Z.D.D.D.A.D.D.Z.",
+"H.H.H.J.H.H.J.H.G.H.G.G.H.G.G.G.H.G.G.G.F.G.G.G.D.D.D.D.D.D.D.K.G.G.J.G.G.G.G.G.D.G.G.G.G.D.D.D.D.F.D.Z.C.C.C.C.C.C.c.c.C.k.C.C.C.C.C.C.C.C.Z.C.C.k.k.C.k.C.c.C.C.k.C.C.V.C.C.c.c.C.c.c.k.j.x.z.j.j.h.h.h.h.h.h.z.h.s.s.s.s.s.i.i.i.i.i.i.i.i.i.i.d.i.i.i.i.i.l.i.s.s.f.s.s.h.s.h.h.h.h.z.z.h.h.h.z.h.h.h.h.h.f.h.z.h.h.j.v.x.c.k.v.k.k.c.c.c.k.C.C.C.C.C.F.c.C.C.C.C.k.V.k.k.k.C.k.C.C.C.C.C.C.C.C.F.F.Z.F.C.Z.Z.Z.D.F.D.Z.D.D.D.",
+"H.H.H.H.H.H.H.J.H.H.H.G.G.G.H.H.G.G.G.G.G.G.G.F.D.G.D.G.D.D.D.D.Z.G.Z.G.G.G.G.G.G.G.G.G.G.D.D.D.D.D.Z.Z.Z.C.F.Z.C.F.f < @ O 2 2 = @ = f 8.A.F.A.c.V.c.j.k.k.k.Z.A.C.k.k.C.k.k.v.V.k.c.v.v.V.V.x.v.z.d.i.z.l.l.d.b.z.f.g.s.s.b = X 2 v i.u.d.y.u.p.d.i.i.d.y.f.y.f.d.d.g.s.s.j.a.s.l.s.j.v.z.f.d.l.z.s.h.s.s.h.l.l.b.h.h.l.l.x.x.x.x.k.k.c.c.V.k.k.C.C.C.Z.C.C.C.C.C.C.C.F.k.k.V.k.C.k.k.k.C.C.C.C.C.C.F.C.C.C.Z.A.F.F.F.F.F.A.D.D.",
+"H.H.H.H.H.J.J.J.H.H.G.H.G.H.G.G.G.G.G.G.G.G.G.F.D.D.D.D.D.D.D.K.D.D.G.G.G.G.G.G.G.G.G.G.D.G.D.D.D.D.C.C.C.C.C.C.C.C.h = < < X , < < X X ; 8.C.c.Z.C.c.A.k.C.C.c.c.C.Z.k.A.C.v.c.k.c.g.c.l.j.l.j.v.d.b.A.b.i.s.s.h.b.z.s.f.b.c o 1 - c i.a.i.d.i.b.u.a.u.y.s.i.i.b.g.b.f.i.l.i.b.x.z.x.b.s.z.s.s.c.b.s.s.l.s.s.h.h.h.h.h.j.j.j.v.c.j.k.k.k.C.k.C.k.C.C.C.C.C.C.C.C.C.C.C.k.k.C.k.k.C.k.k.C.C.C.C.C.C.C.C.C.F.C.C.F.F.F.F.F.Z.D.F.D.",
+"J.H.J.J.J.J.J.J.G.H.G.G.G.G.G.G.G.D.G.F.G.G.F.G.D.D.D.D.D.D.D.D.G.G.G.G.G.G.Z.G.G.G.G.G.G.D.D.D.D.D.Z.Z.D.C.F.C.C.C.f = 2 @ - = 2 + < + @ h C.j.C.v.A.c.F.k.k.C.C.k.F.k.Z.k.c.v.C.l.n.s.v.z.v.b.x.l.l.s.h.v.s.s.d.d.i.g.y.i.v o , , v u.i.u.e.u.a.y.u.f.f.e.u.d.i.d.d.f.i.i.i.h.a.b.s.s.l.i.z.v.i.l.h.h.s.h.s.h.s.s.h.h.v.h.j.j.j.j.k.v.k.k.C.k.C.C.C.C.C.C.F.C.C.C.C.k.C.C.k.C.C.k.V.C.k.k.C.C.F.C.C.F.C.C.C.Z.F.A.F.F.Z.Z.Z.Z.D.",
+"J.J.J.H.H.G.G.G.H.H.G.G.G.G.G.G.D.G.D.D.D.D.D.D.D.F.D.D.D.D.D.D.D.G.G.G.D.G.G.G.G.G.D.G.G.Z.D.D.D.D.Z.Z.C.C.C.C.C.D.f < 1 = 7.D.V.b + < @ f Z.k.C.c.8.b z b b 8.C.k.c.n.m.n n V.n l n c.v.x.g.n x x k 8.l.d.g.z.s.i.c k x 9.b 3 < , v y.e.s.y.b s k s 6.i.a.a.i.v v v 6.9.c k x 8.z.l.c l x n l.d.v.s.z.s.s.h.z.z.z.s.h.j.h.j.j.c.x.k.k.k.k.c.c.c.A.C.C.C.C.C.C.C.C.k.C.C.k.k.k.k.C.C.k.C.C.C.C.C.C.C.F.C.C.C.C.C.C.F.F.Z.C.Z.Z.C.",
+"J.H.G.G.G.H.H.G.G.G.G.G.G.G.G.D.G.D.F.F.D.D.D.Z.F.D.D.D.F.D.D.D.G.A.D.G.D.G.G.D.G.G.G.Z.G.G.G.A.D.Z.Z.Z.D.F.Z.C.F.C.f < 1 - 7.F.V.b = O = c k.C.A.b 3 ; 2 < 1 ; l F.k.V.o j ; h ; < ; l.x.n : 1 @ @ + # f c s.i.g.k ; 2 2 # ; + O 2 v t.i.c : # + + @ ; k v i.y.j ; # k f o 2 2 o x k = @ 2 ; x h.i.s.s.z.s.s.z.s.z.h.h.h.v.v.j.j.x.j.v.c.x.c.c.C.C.C.C.C.C.C.C.C.C.C.C.V.C.C.C.C.k.C.k.k.V.C.k.C.C.C.C.C.C.C.C.C.F.C.C.F.Z.Z.Z.D.",
+"G.H.H.G.G.G.G.G.G.G.G.G.G.D.G.D.D.D.D.D.Z.D.Z.D.D.D.F.D.D.D.D.D.D.D.D.G.G.G.G.G.D.G.G.D.D.G.D.D.Z.Z.Z.Z.C.Z.Z.Z.F.C.5 = 3 < 1 < 2 # < < k k.k.A.n = 1 = 2 + < < ; b c.V.+ @ X < < 1 k l.n : @ , - ; ; @ < f 9.d.x ; @ + ; o ; , + o v d.v ; @ @ ; - 1 O ; s p.i.f @ O X 3 # - X < = + # < < O ; 8.s.h.s.s.z.s.h.z.s.h.s.h.h.h.j.j.k.x.x.v.k.c.c.C.k.C.C.Z.C.C.C.C.C.C.C.C.C.C.k.C.k.C.C.C.k.k.C.C.C.C.C.C.F.C.C.C.F.F.F.C.C.C.Z.Z.",
+"G.G.G.G.H.G.G.G.G.G.G.G.G.D.D.G.D.D.F.D.Z.Z.Z.Z.F.F.F.D.D.F.D.D.D.G.D.D.D.A.G.G.G.G.D.D.D.Z.D.D.Z.Z.Z.Z.Z.C.Z.Z.Z.Z.f < 2 < = = = = # @ h k.n.k.: 1 , 5 V.8.f < = ; c.c.2 X - - x b g.h.m + @ ; 9.8.c + X ; k d.j < < ; 6.8.4 X < + v w.k , X : c y.a O = = n u.a < @ ; k x : + < = a c a = , O 7.f.s.s.i.h.s.h.z.z.z.h.h.h.h.h.z.z.h.k.c.k.k.c.k.C.k.C.C.C.C.C.C.C.C.C.C.k.k.C.k.C.C.C.C.C.k.C.C.C.C.Z.C.C.C.C.C.C.F.V.C.Z.Z.Z.Z.",
+"H.G.G.G.G.G.G.G.G.G.G.G.D.D.D.D.D.D.D.F.F.Z.C.Z.F.F.F.D.F.D.D.D.D.G.D.D.D.D.G.G.D.G.G.G.D.Z.Z.Z.Z.Z.C.Z.Z.C.Z.Z.Z.C.h 2 O X z b z k + 2 O a k.m.< @ @ b l.v.n 2 @ O g.l.= < , f A.s.h.l.3 , < j c x x 3 - 2 j g.# , + k e.b.x - , < v p.; O = s e.a.p.# @ O x q.f X @ a 6.s.x # 1 + 6.s.n o , , b f.h.i.s.h.s.z.h.b.z.z.h.h.j.z.j.v.j.j.j.c.v.k.c.c.C.C.C.C.C.C.C.C.Z.C.C.C.k.k.C.k.C.C.C.C.C.C.C.C.C.C.C.C.C.C.Z.C.Z.F.C.Z.Z.Z.Z.",
+"G.G.G.G.G.G.D.G.G.D.F.G.D.D.D.D.F.F.A.F.A.A.C.C.Z.F.K.Z.D.D.D.K.F.D.D.D.D.D.D.D.G.G.D.D.D.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.C.Z.Z.f = , = F A.A.j.f + @ 2 8.8.; - ; F j.c.n 3 @ # n l.+ - O l x.j.f.k.= 1 < = ; < < , # ; a l.< < + k f.r.b o 1 - d u.; , = k a.e.i.- < - k p.f O 1 a u.d.k # , ; y.i.c 1 , O v a.i.s.s.i.s.s.s.s.s.h.h.h.h.s.h.s.h.h.l.x.x.k.j.c.k.c.c.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.k.V.k.C.c.C.c.C.C.Z.C.C.Z.F.C.F.F.C.Z.D.",
+"G.G.G.G.G.G.G.G.F.G.G.G.D.D.D.D.D.D.A.A.F.Z.Z.Z.Z.Z.Z.Z.F.D.D.Z.D.D.D.D.D.D.D.D.D.D.D.D.D.Z.Z.Z.Z.D.Z.Z.Z.Z.Z.C.C.Z.j = = ; n A.k.8.3 - + + 8.8.# @ = c C.c.k ; 1 , g.h.2 < + x f.c.f.8.: O < h c n v 7.b c v e.; 2 < s p.d.x ; + < v 6.; + < j e.w.v ; 1 + x e.a = - f a.i.k + - = i.i.v # ; < v i.i.i.s.s.s.s.s.h.s.s.h.h.s.h.s.v.z.h.j.c.x.k.c.c.k.C.C.C.c.F.C.C.C.C.C.k.C.C.C.C.C.C.C.k.C.C.C.C.C.C.C.C.C.C.C.Z.F.C.C.C.F.D.F.",
+"G.G.G.G.G.G.G.G.G.G.F.G.D.D.F.F.A.D.F.F.Z.Z.C.Z.C.Z.Z.Z.D.F.F.Z.D.D.D.A.D.D.D.D.G.D.D.D.D.D.Z.Z.Z.Z.Z.C.C.Z.Z.F.F.C.7 , 1 , 2 2 < X - < + ; 8.V.j # @ : x b j @ - 4 x.j.# O + b s.z.d.g.m + , ; c n s - 3 j v b.j @ < 3 k x ; ; < O c y.m 1 @ o x d a O @ 3 6.f.: + , a t.d.k + = 1 e.p.v o # = c i.u.d.i.i.s.i.s.s.s.l.i.h.h.s.h.s.z.z.j.l.j.x.x.c.c.k.C.k.C.C.C.c.C.C.C.k.C.C.C.C.C.k.C.C.k.C.C.c.k.C.k.C.C.C.C.F.C.F.F.C.C.C.D.",
+"G.G.G.G.G.D.G.G.G.G.D.D.D.Z.Z.Z.Z.C.F.V.C.F.F.C.F.C.C.D.Z.Z.Z.Z.D.A.F.F.F.D.D.F.D.D.D.F.D.D.D.F.D.D.C.Z.C.Z.Z.C.Z.C.h = < , = X o < 2 @ ; x V.v.n : @ = = , , < : 8.h.j.= + + z x.d.z.s.8.; - - 2 # , O - s d.d.6.# + X < X 3 + @ - d e.v : - O 1 < - - ; k w.e.4 , 1 a 4.y.k # - - e.6.c , O - c i.u.i.i.d.s.i.i.i.s.s.s.z.s.z.s.v.h.h.z.l.j.j.k.j.k.k.c.c.c.c.c.C.k.C.c.C.C.C.C.C.C.c.C.C.c.C.c.c.k.c.c.C.c.Z.C.C.F.F.D.C.C.C.D.",
+"G.G.G.G.D.D.G.G.D.G.D.D.D.Z.Z.Z.F.F.F.C.C.C.F.F.F.D.C.F.C.Z.Z.Z.A.D.D.F.D.D.D.D.D.D.D.D.D.D.D.D.F.C.Z.Z.Z.C.F.C.C.C.f 2 X < ; 2 < # : f b k.v.s.c.n f = = < + f n x.j.x.; ; # x b.l.i.z.f.v f = + < @ + k 8.y.y.u.x 2 ; = ; k ; X = v e.u.v s X = 2 2 3 d u.t.M a # @ j y.y.k o < < f.y.c ; # ; c d.u.u.i.u.u.u.i.d.i.s.i.s.s.s.z.s.h.h.h.z.j.j.j.j.k.F.c.c.k.F.C.c.C.k.C.C.c.C.C.Z.C.c.c.c.k.c.k.k.k.c.c.c.C.C.C.F.F.C.C.C.C.D.C.",
+"J.G.G.G.G.G.D.G.D.D.D.D.D.Z.Z.Z.C.C.F.C.F.C.F.C.C.F.F.C.F.Z.Z.Z.D.A.D.D.F.D.D.D.D.D.D.D.F.D.Z.Z.Z.Z.C.F.C.F.C.C.C.c.n.c.k.A.k.c.x.x.V.k.g.s.v.j.h.j.l.8.v 8.8.l.j.h.j.v.6.l.d.z.v.a.l.p.f.f.p.g.c c c i.q.i.f.w.d.p.u.v v t.u.q.t.a.M w.e.u.4.8.c d v q.e.e.e.u.w.6.e.q.r.t.u.a.u.p.q.w.t.y.p.6.d.u.u.d.u.u.i.i.i.u.i.i.i.s.s.s.s.s.z.h.z.z.h.j.x.j.c.j.n.k.c.k.k.k.k.c.C.c.F.A.c.C.c.c.k.c.k.c.k.c.k.k.c.k.c.C.C.F.F.A.C.F.F.C.Z.",
+"J.G.G.D.G.G.G.D.G.D.D.D.D.F.Z.C.F.V.C.Z.C.C.C.C.C.C.C.C.D.C.C.Z.F.D.D.D.D.D.F.F.D.C.F.Z.Z.Z.F.Z.F.F.D.C.F.C.C.C.F.c.C.k.A.c.j.j.j.j.x.d.l.s.s.j.h.f.f.h.s.f.s.s.s.h.h.b.k.k.b.l.a.d.b.d.d.f.a.e.e.d.i.a.d.p.w.d.d.w.w.y.p.u.q.y.w.w.p.e.q.u.e.e.e.r.M u.e.0.q.u.e.r.0.p.e.e.w.6.y.p.a.e.a.p.b.p.u.e.u.u.u.u.d.u.u.u.i.e.i.i.i.l.s.z.z.z.h.z.l.v.x.x.j.x.x.v.k.k.k.k.k.k.c.c.c.c.C.c.A.F.k.c.c.c.c.j.v.k.c.F.c.C.C.C.F.C.F.C.C.C.Z.",
+"G.J.G.G.D.G.G.K.D.D.D.D.D.F.Z.C.F.F.V.C.C.V.k.F.F.C.C.Z.C.F.C.C.Z.Z.D.F.F.Z.D.Z.D.Z.D.Z.Z.Z.Z.D.F.C.F.F.C.C.C.c.c.C.k.j.c.x.k.l.j.j.f.f.g.l.l.g.s.d.j.s.l.d.h.h.z.i.d.b.d.s.h.i.f.d.i.s.d.i.i.u.i.u.a.e.d.y.i.i.a.u.w.p.a.e.w.w.q.q.q.4.e.u.q.r.y.q.w.w.y.M w.5.e.t.r.u.r.0.u.u.t.e.p.u.e.i.e.u.e.u.u.u.u.y.u.y.u.u.u.u.i.p.i.i.s.s.h.s.h.h.j.j.j.v.l.j.j.j.j.j.k.v.c.c.c.c.C.C.A.c.c.F.C.c.c.c.j.c.k.j.k.c.A.C.C.C.C.C.Z.C.F.C.Z.",
+"J.G.G.G.G.G.D.G.G.D.D.D.D.Z.Z.Z.F.C.C.F.C.C.F.k.C.C.F.C.C.F.C.D.C.Z.Z.F.Z.Z.Z.Z.Z.C.C.F.Z.C.F.C.F.C.n.C.C.k.c.V.x.v.c.x.x.z.j.j.j.z.l.v.s.l.s.h.f.h.d.a.z.d.z.a.z.l.f.z.l.s.f.s.i.h.b.d.y.i.e.b.u.u.u.i.w.w.i.w.y.p.y.u.q.r.4.u.p.y.t.r.r.q.q.p.e.r.r.y.q.w.t.r.q.0.q.q.r.r.w.q.w.t.e.u.p.u.e.e.u.u.e.d.p.w.i.w.y.y.w.w.s.i.d.d.s.f.z.b.z.z.z.j.j.j.v.z.j.x.x.j.j.c.j.x.c.c.c.c.F.c.c.c.k.c.x.c.j.v.k.c.c.k.j.c.c.C.C.C.C.C.C.Z.C.",
+"J.J.G.G.G.G.D.G.D.D.D.D.D.Z.Z.C.F.C.C.C.C.C.C.C.k.C.C.C.C.C.C.C.C.Z.Z.C.F.F.A.F.D.C.C.Z.V.Z.Z.Z.Z.G.A.A.C.F.k.C.A.l.v.l.v.s.l.l.s.s.h.s.d.h.i.d.f.l.g.b.b.i.p.z.b.i.z.i.s.d.h.s.s.d.b.i.d.s.i.p.e.u.u.u.t.w.u.d.w.e.u.u.p.a.e.e.q.e.q.p.u.q.4.e.p.q.u.M w.w.0.r.0.p.q.r.M t.q.t.e.y.6.e.e.r.e.p.a.t.e.e.e.t.a.e.u.e.s.e.e.u.d.d.b.i.h.h.z.h.z.z.z.h.z.j.j.v.v.z.j.x.x.x.c.k.k.c.k.c.c.c.c.k.c.j.x.k.c.k.c.k.c.C.C.C.C.Z.C.C.C.C.Z.",
+"J.G.J.G.G.G.G.G.D.G.D.Z.F.Z.Z.C.F.C.F.F.C.C.C.k.C.C.C.C.C.C.C.F.C.C.C.C.c.F.A.F.C.C.C.Z.n.F.k.D.n.V.Z.A.V.k.n.j.C.l.v.l.l.j.l.v.h.h.s.j.i.f.f.g.h.i.i.d.s.l.i.s.s.d.d.d.d.d.i.s.s.s.d.i.a.u.a.i.d.u.t.v u.e.y.t.w.u.e.w.q.a.e.q.q.q.e.4.q.u.r.q.u.p.e.e.d d 4.q.q.r.r.d d v v 4.w.w.w.u.w.M v c 6.0.u.u.e.4.q.v d v 6.i.a.e.f.i.i.l.z.i.z.z.h.h.j.h.z.z.z.j.j.j.c.l.j.x.c.k.c.c.c.c.c.F.c.k.k.c.c.k.c.k.k.k.c.C.C.c.C.C.C.C.F.Z.Z.",
+"G.G.G.G.J.G.D.G.G.Z.Z.G.Z.Z.Z.C.C.C.C.C.C.C.C.k.F.c.c.F.c.F.k.C.C.C.C.C.C.F.C.C.C.c.C.Z.D.V.- = = 2 + 2 f b C.j.v.j.h.l.x.j.z.i.s.z.j X = g.g.; + f d.d.p.z.u.d.i.i.i.z.i.g.i.h.p.b.u.i.v < < x 4.j < 3 u.v 3 X f p.p.y.w.w.u.q.y.M r.w.0.w.u.e.e.t.e.c ; = s M t.0.k a o O + ; d u.a.M s o ; X ; k y.t.y.k a o 3 X a d d.a.a.p.i.d.l.h.s.z.z.h.h.h.h.h.z.h.x.j.z.x.x.j.c.c.c.k.c.C.c.c.c.c.c.C.c.c.c.c.c.k.C.c.k.C.C.C.C.C.C.C.Z.",
+"J.J.G.J.G.G.G.G.G.D.Z.Z.Z.Z.Z.C.C.C.C.C.C.k.C.k.c.F.k.c.c.k.C.C.C.C.C.C.C.C.C.C.C.F.n.A.C.F., 1 X 2 - X + 3 k A.x.V.h.s.z.s.s.h.s.i.f + ; u.a.= < f f.f.f.i.d.u.b.i.i.i.i.b.i.i.i.d.d.f.d - , k w.j < o r.a.2 X a e.p.w.e.e.e.y.u.r.q.t.w.e.u.e.w.4.c ; @ + k e.r.v < = + 4 3 + 3 q.t.a 1 < 3 a X + c t.v = + 3 3 , + a y.e.i.h.s.s.i.i.s.h.s.z.h.h.h.h.h.h.j.j.j.x.x.c.c.c.c.C.c.c.c.k.c.c.F.c.c.k.c.c.k.c.k.k.C.c.F.C.C.Z.C.Z.Z.",
+"G.G.J.G.G.G.G.D.D.G.D.F.Z.A.F.C.C.C.C.C.c.C.C.k.c.c.c.c.c.c.c.c.A.c.c.A.A.c.C.C.C.C.C.A.k.c.+ # ; n b z o O ; g.l.7.b g.v.g.n n i.f.f - - i.i.= - f d.6.6.k s k b 6.d.d n c s.t.y.c c v w.c d v d.a - , w.4.< , a 4.t.4.c s s s d t.t.r.q.a.r.u.v j < ; + = s r.0.d X 2 d t.d = = s 0.; O f v v o - j 5.k = < x 6.s @ = c d.i.a.u.s.s.i.s.s.s.h.s.z.h.h.h.z.v.j.j.x.c.c.c.c.c.c.C.c.k.C.k.C.c.c.C.C.C.k.C.c.C.A.k.C.C.C.C.C.C.Z.Z.",
+"J.G.G.G.G.G.G.G.G.D.D.D.Z.A.C.C.k.C.k.C.C.C.c.c.c.c.c.k.c.k.c.C.c.c.c.F.C.c.c.c.c.c.c.v.C.k.2 # 2 V.C.V.f @ O b n ; = x s.v ; o k s.j X + b.b.+ < j y.c = # ; # O s y.m # ; v u.k + # v c ; = x 6.f # 1 e.e.2 # j e.y.k < X ; X 3 m e.r.0.p.r.p.v o = j o ; k r.r.s X # x r.d 2 , f d + O k r.r.a @ 3 4.j X < a.u.d @ o x w.i.i.d.s.s.i.s.i.s.s.z.s.h.h.h.h.z.j.v.h.c.c.c.c.c.j.c.C.C.k.C.k.C.c.k.C.c.C.C.c.C.c.C.C.c.C.C.Z.C.Z.Z.",
+"J.J.J.G.G.D.G.G.D.G.Z.D.Z.C.C.C.C.C.k.C.C.k.c.c.c.k.k.k.c.c.n.c.c.C.c.k.k.k.k.k.c.c.k.v.C.k.- @ = l.c.v.x O 1 c n 1 1 x l.b = O k s.j 1 < d.d.O 1 f a.j @ < 8.m j k r.c O = x y.a 1 2 6.6.O X x y.a < O t.q.= @ f 4.s ; o j k 4 O # M q.0.q.u.q.d k 6.x - - s M t.d - X ; s : O 1 a d # X s t.5.f ; , 4.j ; X q.e.v X ; x u.i.i.i.i.i.i.i.d.s.s.s.z.h.h.h.z.h.j.j.j.x.v.c.c.c.c.k.c.k.C.k.C.k.k.k.C.C.k.C.C.C.k.k.C.k.C.C.C.C.Z.Z.",
+"G.G.G.G.G.G.D.D.D.D.D.A.Z.C.C.C.k.C.k.k.c.c.c.c.k.v.k.k.j.k.c.k.c.c.c.c.c.k.j.j.c.c.k.c.C.k., 1 = k.l.k.c @ 1 x 8.= 2 x b.v ; + s i.f @ , t.t.1 @ a a.s - - 4 j x d u.a.; , g y.# - m i.d < X x w.4 - @ r.a.= = f w.j = o m m a - = m 6.w.w.e.q.u.e.e.c 1 O s M 0.0.a o X ; 2 X 2 f d o ; s e.0.f < # 4.j ; X w.r.c X < x u.e.u.i.b.i.i.s.i.s.h.s.s.h.h.l.z.j.j.j.k.j.k.c.c.c.c.C.C.c.c.C.k.k.C.C.k.k.C.k.k.C.C.C.C.C.C.C.C.Z.Z.Z.",
+"G.J.G.G.D.G.D.G.D.D.Z.F.Z.C.C.C.C.k.c.c.c.c.c.c.x.x.j.j.k.k.k.k.k.c.c.c.k.c.c.c.j.j.k.v.l.l.= < o A.v.l.j 1 < c b 2 - k d.b X 1 k u.f - , i.i.X X a u.6.f 3 , , , = 6.u.k , ; s 2 = 6.d.c 2 < k y.f = 1 q.q.2 2 a w.j - % < ; @ < = d 4.e.r.u.q.u.0.q.d = ; d M 0.0.M d x d v ; ; a d @ O m r.r.a @ 3 4.j X < p.e.c O X k u.i.i.e.i.i.i.i.i.s.i.z.z.z.h.z.h.l.j.h.x.k.c.c.x.c.c.c.A.k.c.C.k.C.k.C.C.C.k.C.k.C.C.C.C.C.k.C.C.Z.Z.Z.",
+"J.J.G.G.G.G.D.D.D.D.D.F.Z.Z.C.C.C.k.c.j.c.c.x.j.x.j.c.x.x.c.j.k.c.v.c.c.v.c.c.j.x.x.l.v.k.k.< + 2 n n b ; O ; 8.n + < f g.k # + k f.a , + u.u., , a u.y.d d c f X 1 s e.w.: O 1 + j i.e.v + + x u.a < < r.4.2 2 a 0.j = 2 4.q.M d r.v u.q.q.q.p.e.q.p.c X + x p.M 0.s s s d s O - s 5.: - 3 4.d ; X a 0.x = - x 6.s @ ; v p.u.i.d.u.u.i.d.i.f.s.s.s.s.h.z.z.z.x.j.j.x.x.x.c.j.j.c.c.k.k.C.C.k.C.V.C.k.C.k.C.k.C.C.C.C.C.C.C.Z.D.Z.",
+"G.G.G.G.G.D.D.D.D.D.F.F.F.C.C.C.c.C.c.c.l.v.x.j.j.j.h.x.v.j.k.v.j.k.v.x.x.x.x.j.x.x.v.x.j.l.< @ O 2 2 , , 2 k x.8.; = + X = < = k y.f , - u.y.= X f 6.a @ # c s ; + d a.y.s 1 @ 1 d u.w.c # < s 4.j @ X r.q.< O 4 0.d ; X 2 4 , X 2 4.w.r.e.y.q.w.0.t.d = O s 0.0.0.; ; X 4 = % 3 5.r.s o X 3 f X , s t.v ; O 1 f + + a p.u.i.u.d.w.u.u.i.i.i.s.h.i.h.i.h.h.z.j.h.h.k.z.j.j.x.k.k.k.v.k.n.c.C.c.A.k.k.k.C.k.C.C.C.C.C.C.F.Z.F.F.n.",
+"G.G.G.D.Z.D.Z.D.D.Z.F.F.F.Z.C.c.c.n.c.j.x.x.j.x.j.j.z.x.h.k.j.h.j.j.j.x.x.x.j.j.x.x.z.x.V.l.2 # < + = ; f x j.f.i.k + # ; l ; # x y.a < < y.p.< + a 0.c ; 2 X + # s v e.u.d ; ; j w.p.u.v o ; x 4.j # ; 0.p.2 X a 0.t.s < = @ < a d q.0.q.e.e.q.q.w.0.d ; ; s q.4.q.d a ; = o a d M M 5.s o o X o s q.r.p.v : o 2 o a d d.u.i.e.i.y.i.i.d.s.i.s.i.h.s.h.h.h.z.h.h.x.k.z.j.k.v.j.j.k.k.k.j.c.c.C.C.c.k.C.k.C.c.C.c.C.C.C.C.F.F.D.C.",
+"G.G.D.D.D.D.D.D.Z.Z.C.F.C.C.C.c.k.k.j.k.x.x.x.l.x.z.x.h.k.h.j.h.h.j.x.j.j.x.j.v.h.j.h.j.s.v.g.l.l.l.x.V.g.l.j.a.h.l.g.v d.s.y.i.u.a.p.a.p.t.t.y.u.q.t.e.p.d d d 4.w.e.r.M p.p.4.y.p.t.r.e.4.6.q.t.4.e.M t.r.0.r.0.t.r.0.0.d d d 0.e.e.e.e.q.q.q.q.e.0.w.q.v r.0.0.0.M M d d d 0.M M 0.0.r.d x d v r.0.e.0.e.4.c c M v i.t.e.d.p.p.a.i.u.i.i.i.s.s.h.s.z.s.h.j.z.h.z.h.h.h.v.k.h.j.j.x.k.k.k.k.c.C.C.k.k.C.C.C.C.C.C.C.F.C.C.Z.D.F.",
+"G.G.G.D.D.D.F.D.Z.Z.C.Z.C.C.C.c.k.k.x.j.c.l.j.v.z.x.h.j.h.k.h.k.h.j.h.j.z.x.j.j.x.h.h.j.l.v.x.v.s.b.f.b.v.s.s.h.s.i.p.g.d.y.i.y.u.g.w.y.6.w.e.w.q.q.y.0.a.a.e.y.q.r.q.e.t.q.q.u.q.e.a.p.p.u.u.M r.y.q.6.5.0.0.0.q.0.0.0.0.t.r.t.M p.0.q.0.w.e.q.0.q.4.r.r.0.M q.0.M 4.0.0.0.0.0.0.M M 0.0.M 0.M M r.e.0.u.r.r.e.p.e.p.u.e.u.d.i.i.e.u.u.i.i.i.s.s.s.s.z.s.z.h.h.z.h.k.h.h.k.h.k.x.j.x.x.k.k.k.c.k.k.C.k.V.C.k.C.C.C.C.C.Z.C.Z.F.D.",
+"G.D.D.D.F.F.F.F.Z.Z.C.C.C.C.c.c.k.k.k.v.v.h.k.v.v.j.k.h.h.k.j.h.k.h.k.z.j.x.j.j.l.j.h.x.l.z.z.f.s.j.d.g.l.f.j.h.d.s.f.i.i.i.a.u.t.w.d.a.p.q.q.u.r.u.r.e.4.e.0.0.p.q.q.y.r.e.M M e.q.w.4.0.e.q.a.0.0.r.q.4.r.p.0.q.M 6.M q.0.4.4.e.0.e.e.q.0.r.0.0.q.4.r.r.r.M 4.0.r.4.0.0.M 0.0.0.0.0.M r.0.M 0.0.e.0.0.y.q.i.0.y.p.e.e.p.p.4.d.i.e.i.i.d.i.i.s.s.h.s.z.z.s.h.z.h.z.v.j.j.h.k.h.x.k.k.j.x.j.k.k.c.c.A.C.C.k.C.c.C.C.C.C.Z.C.Z.Z.D.",
+"G.D.D.D.D.D.D.A.C.C.C.C.c.c.c.k.z.k.z.k.k.k.j.z.j.j.z.k.k.h.z.x.z.h.v.z.z.z.j.j.v.z.h.z.j.h.z.h.s.s.h.s.s.s.s.s.i.s.s.i.u.i.i.u.u.u.u.u.y.y.q.e.q.e.q.e.q.q.e.e.q.u.q.q.q.e.e.r.0.q.q.q.e.q.q.q.r.r.r.q.0.0.0.0.q.0.0.M r.0.0.0.0.q.0.0.0.0.0.0.0.q.0.q.0.0.0.0.0.0.q.0.0.0.0.0.0.0.0.0.0.0.0.0.0.q.q.0.q.e.q.y.e.y.u.u.u.u.u.y.p.i.i.u.i.i.i.i.i.z.z.i.s.z.z.h.h.h.h.h.h.h.z.h.h.h.z.x.v.k.k.k.c.c.k.k.c.C.C.C.F.C.C.Z.C.Z.D.F.F.",
+"G.G.D.D.A.F.D.F.C.C.C.C.C.k.c.c.k.z.k.v.j.k.z.k.j.z.z.h.h.l.x.z.j.h.h.h.h.h.h.j.z.h.h.h.h.h.h.s.h.s.h.s.s.s.s.s.s.i.d.i.i.u.u.u.u.y.e.u.e.w.u.0.q.e.q.q.q.q.q.e.e.e.q.q.q.q.q.q.q.q.q.q.q.e.r.q.q.0.r.q.0.0.q.0.0.0.0.0.M q.0.0.0.q.q.0.0.q.0.0.q.M 0.0.r.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.q.0.q.q.q.0.y.e.u.u.u.u.u.y.u.u.p.i.u.u.i.i.i.h.b.s.s.s.s.s.i.h.h.h.h.z.j.k.h.k.j.h.x.j.v.k.k.k.c.c.k.C.C.C.C.C.C.C.F.C.C.Z.Z.Z.D.",
+"D.D.D.A.F.D.A.F.Z.C.C.C.c.k.c.c.k.k.j.h.k.h.z.k.z.k.l.k.h.v.h.h.h.h.h.h.h.l.b.s.h.h.h.h.h.h.s.s.s.s.s.s.s.s.i.i.i.i.i.i.u.i.u.u.u.u.u.u.y.q.q.e.q.0.q.q.q.q.e.q.q.q.q.e.e.q.q.q.q.q.q.q.e.q.q.q.0.w.q.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.q.0.0.0.0.q.0.0.M 0.0.0.0.r.r.0.0.0.0.0.0.M 0.0.0.0.0.0.0.e.0.q.q.q.q.u.q.y.u.y.u.u.u.i.u.u.u.i.u.i.i.i.i.i.s.s.h.i.z.h.h.h.h.h.z.z.z.l.h.k.j.j.k.k.c.k.c.c.C.c.c.C.k.C.c.C.C.C.Z.Z.C.Z.A.",
+"D.D.F.Z.Z.C.Z.Z.C.C.C.c.F.C.k.k.k.h.k.z.k.z.l.k.j.j.h.j.z.z.h.h.h.h.h.s.h.h.s.h.s.h.s.s.h.s.s.h.s.i.s.i.i.d.i.i.u.i.u.i.u.u.u.u.u.u.u.e.y.q.q.0.q.q.q.q.0.e.e.q.q.q.q.q.q.q.q.q.0.q.q.q.q.r.r.q.0.0.0.0.0.0.d 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.M q.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.q.q.q.q.e.y.e.u.w.u.y.u.u.u.i.u.d.u.i.u.u.i.i.i.i.i.s.h.i.s.z.s.h.h.h.z.j.h.x.k.h.x.c.k.v.k.k.c.C.c.c.C.C.C.C.C.C.F.Z.C.Z.D.A.D.",
+"D.D.D.D.Z.Z.Z.C.C.C.C.C.c.c.k.k.k.k.h.k.k.z.z.h.h.h.j.j.j.z.h.h.h.s.s.h.s.s.s.s.s.h.s.h.z.s.s.s.s.s.i.s.i.i.u.i.u.u.y.u.u.u.u.u.e.u.w.u.q.e.e.q.q.q.0.q.q.q.q.q.q.e.u.q.e.q.q.q.r.r.q.q.q.q.0.q.r.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.M 0.0.q.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.q.w.q.q.e.q.u.u.y.u.u.y.u.u.u.u.i.u.i.i.i.y.i.i.d.i.s.i.s.s.z.f.z.h.j.x.h.j.j.j.v.k.j.k.k.k.c.c.k.c.C.c.C.c.C.C.c.C.C.C.Z.Z.D.D.",
+"D.D.D.F.Z.Z.C.C.C.C.C.C.c.k.c.k.k.j.j.x.z.l.k.k.j.j.z.h.z.h.h.h.s.s.s.s.s.s.s.s.h.i.s.s.s.s.s.s.i.i.s.u.i.i.d.u.u.u.y.u.y.u.u.u.q.u.u.e.e.q.e.e.q.q.q.q.q.q.e.q.q.q.q.q.e.q.q.q.0.r.0.r.r.0.q.q.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.M 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.q.0.e.q.q.e.y.q.e.y.u.y.u.u.u.u.i.i.u.i.i.i.d.i.i.i.d.s.i.i.s.s.h.h.j.h.z.z.x.j.j.x.x.j.n.c.c.c.c.C.C.c.C.C.C.C.C.C.C.C.C.Z.D.F.F.",
+"G.D.F.Z.Z.Z.Z.Z.C.C.C.c.c.F.c.c.v.j.x.x.k.z.h.z.h.h.h.h.h.h.z.s.s.s.s.s.i.s.f.s.i.s.i.i.i.i.i.u.d.u.i.i.u.u.u.u.u.u.u.y.e.u.e.y.u.u.e.e.q.q.q.q.q.0.q.q.q.q.q.e.q.e.e.q.q.q.q.q.r.r.r.r.0.r.0.0.0.r.0.0.0.0.0.0.0.M 0.0.M 0.M 0.0.0.0.0.0.0.5.0.0.q.0.q.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.r.r.0.0.q.q.q.q.e.e.e.u.e.u.u.u.y.u.u.u.u.i.u.d.i.d.y.i.u.d.i.s.i.h.l.i.s.z.v.h.h.k.j.c.j.k.v.j.k.c.c.c.k.C.k.c.c.C.C.c.C.C.c.C.C.Z.A.F.D."
+};
diff --git a/images/scenario2hilite.xpm b/images/scenario2hilite.xpm
new file mode 100644 (file)
index 0000000..b313c21
--- /dev/null
@@ -0,0 +1,450 @@
+/* XPM */
+static char *scenario_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"209 188 256 2",
+"   c #182F16",
+".  c #2D2D1A",
+"X  c #383A38",
+"o  c #2E302D",
+"O  c #1D1928",
+"+  c #1C3D69",
+"@  c #1C3871",
+"#  c #393A44",
+"$  c #2E2E50",
+"%  c #233D6B",
+"&  c #263D67",
+"*  c #2D3571",
+"=  c #192054",
+"-  c #125014",
+";  c #0D6E0F",
+":  c #39443A",
+">  c #2D512C",
+",  c #316831",
+"<  c #28571D",
+"1  c #1D426B",
+"2  c #1B4267",
+"3  c #1C4571",
+"4  c #3C4342",
+"5  c #34524B",
+"6  c #22416B",
+"7  c #244268",
+"8  c #234271",
+"9  c #274876",
+"0  c #245579",
+"q  c #29577A",
+"w  c #3A5A72",
+"e  c #38587A",
+"r  c #354974",
+"t  c #2C5D58",
+"y  c #463A37",
+"u  c #563A36",
+"i  c #4D3329",
+"p  c #6F3732",
+"a  c #562217",
+"s  c #463B43",
+"d  c #4B394D",
+"f  c #533969",
+"g  c #46433A",
+"h  c #574539",
+"j  c #51512D",
+"k  c #526D2F",
+"l  c #674737",
+"z  c #764938",
+"x  c #6D5334",
+"c  c #6D6E34",
+"v  c #525E1C",
+"b  c #434443",
+"n  c #484947",
+"m  c #485448",
+"M  c #554A46",
+"N  c #58534A",
+"B  c #575755",
+"V  c #4E4D54",
+"C  c #4F506F",
+"Z  c #516B51",
+"A  c #41746B",
+"S  c #576568",
+"D  c #664A45",
+"F  c #67564A",
+"G  c #685954",
+"H  c #775549",
+"J  c #755C56",
+"K  c #714B4B",
+"L  c #695567",
+"P  c #796356",
+"I  c #6D6D4D",
+"U  c #666866",
+"Y  c #707270",
+"T  c #31338B",
+"R  c #2331A3",
+"E  c #3C5684",
+"W  c #365B88",
+"Q  c #2D5886",
+"!  c #286D92",
+"~  c #2C7091",
+"^  c #36638C",
+"/  c #366D94",
+"(  c #2677A8",
+")  c #377BA6",
+"_  c #3F43B0",
+"`  c #44568A",
+"'  c #44598C",
+"]  c #445786",
+"[  c #455A90",
+"{  c #4D4D90",
+"}  c #5052AE",
+"|  c #4D7199",
+" . c #477AA6",
+".. c #5374A8",
+"X. c #7767B9",
+"o. c #6A5C97",
+"O. c #585AD0",
+"+. c #5E6ED5",
+"@. c #5D6BDA",
+"#. c #5B6BCD",
+"$. c #5D63ED",
+"%. c #5D67E2",
+"&. c #5A63F2",
+"*. c #6569DA",
+"=. c #7969C9",
+"-. c #7269D2",
+";. c #6365E6",
+":. c #6165EA",
+">. c #6867E8",
+",. c #6567F0",
+"<. c #5B5BE0",
+"1. c #413EB7",
+"2. c #279D20",
+"3. c #00DB00",
+"4. c #0CDC05",
+"5. c #17DA09",
+"6. c #00E300",
+"7. c #05E701",
+"8. c #11E906",
+"9. c #25CB09",
+"0. c #23CF03",
+"q. c #24D404",
+"w. c #25DA04",
+"e. c #25D70C",
+"r. c #33CA18",
+"t. c #28DD0B",
+"y. c #558F30",
+"u. c #54B329",
+"i. c #6C8F35",
+"p. c #70AB35",
+"a. c #41981F",
+"s. c #498F50",
+"d. c #6B915F",
+"f. c #50C825",
+"g. c #52C626",
+"h. c #3C9F4C",
+"j. c #2A83B8",
+"k. c #3486B7",
+"l. c #2A8ECA",
+"z. c #298BC6",
+"x. c #2D91CC",
+"c. c #3193CD",
+"v. c #3B99CE",
+"b. c #3896CE",
+"n. c #3C9AD0",
+"m. c #3795D0",
+"M. c #2F90CB",
+"N. c #4F8B9B",
+"B. c #508E90",
+"V. c #4982A9",
+"C. c #4889B4",
+"Z. c #548BB6",
+"A. c #5693BA",
+"S. c #4F89B2",
+"D. c #6595B7",
+"F. c #779599",
+"G. c #4A97C7",
+"H. c #439DD2",
+"J. c #489ED3",
+"K. c #4A9FD8",
+"L. c #5799C7",
+"P. c #5793C7",
+"I. c #4BA1D4",
+"U. c #47A1D4",
+"Y. c #5AA2CC",
+"T. c #52A5D5",
+"R. c #55A6D8",
+"E. c #56A9D6",
+"W. c #56A8D8",
+"Q. c #5BAAD5",
+"!. c #5BAAD9",
+"~. c #5AA5D5",
+"^. c #56AAD5",
+"/. c #649AC5",
+"(. c #64A4CC",
+"). c #62ABD4",
+"_. c #63ADDB",
+"`. c #69AAD6",
+"'. c #65B1DB",
+"]. c #6BB2DD",
+"[. c #6BB6DB",
+"{. c #71B4DE",
+"}. c #73B8DE",
+"|. c #79B6D9",
+" X c #73ACD5",
+".X c #6CB4E0",
+"XX c #6AB7E1",
+"oX c #73B6E0",
+"OX c #74B9E1",
+"+X c #7BBBE2",
+"@X c #79B5E1",
+"#X c #6CAEE1",
+"$X c #58ACE0",
+"%X c #77C0E3",
+"&X c #913125",
+"*X c #8A5537",
+"=X c #8D6739",
+"-X c #AB6933",
+";X c #875A49",
+":X c #91584D",
+">X c #866557",
+",X c #976858",
+"<X c #916B4A",
+"1X c #90716C",
+"2X c #A66A57",
+"3X c #A9735B",
+"4X c #B8745B",
+"5X c #AE6B4D",
+"6X c #B27266",
+"7X c #98595E",
+"8X c #D0712E",
+"9X c #C7775A",
+"0X c #D37E5C",
+"qX c #D77D53",
+"wX c #CC774A",
+"eX c #CD7C62",
+"rX c #C57965",
+"tX c #D27D63",
+"yX c #D97868",
+"uX c #C8766E",
+"iX c #E37766",
+"pX c #8D3442",
+"aX c #886DB8",
+"sX c #9470AB",
+"dX c #AF758B",
+"fX c #936E94",
+"gX c #826CC2",
+"hX c #8D9739",
+"jX c #929246",
+"kX c #92A144",
+"lX c #B18C54",
+"zX c #9B986C",
+"xX c #C3835C",
+"cX c #D78158",
+"vX c #D88165",
+"bX c #CB8062",
+"nX c #E28467",
+"mX c #E48252",
+"MX c #D6BB3C",
+"NX c #8D8F90",
+"BX c #A4AAA5",
+"VX c #85BAD7",
+"CX c #80BEE3",
+"ZX c #8BBDE6",
+"AX c #90C4DB",
+"SX c #84C0E4",
+"DX c #8BC3E4",
+"FX c #97C7E5",
+"GX c #9ED0EE",
+"HX c #A9D3E8",
+"JX c #B6D9E8",
+"KX c #A9D0EA",
+"LX c #ACD0D8",
+"PX c #C8E4EF",
+"IX c #C7D6DF",
+"UX c #C2B9AB",
+/* pixels */
+"CXCXSXSXSXSXZXCXSXSXSXCXCXCXCXCXCXCXCX%X+X+X+X+X+X+XOXOXOXoX.X.X.X]._._._.!.!.!.!.!.W.~.R.R.R.T.R.R.T.R.I.T.I.I.I.I.J.I.J.K.H.H.H.H.H.H.H.H.H.v.v.v.v.n.n.n.n.n.v.H.H.v.H.n.n.n.H.n.H.H.v.H.H.H.H.H.v.H.H.U.H.H.H.H.H.H.J.I.I.I.J.I.I.I.E.T.I.I.E.I.I.U.T.I.I.U.J.U.H.H.H.H.H.n.H.H.H.v.n.H.v.n.v.n.v.n.b.n.v.n.n.n.n.v.v.b.n.b.b.b.b.n.m.v.n.n.H.K.I.I.T.I.I.T.I.I.I.I.T.I.I.I.I.I.I.I.I.I.I.I.I.U.I.I.I.I.I.I.I.I.I.J.I.I.I.I.J.",
+"CXCXCXCXCXSXCXCXSXCXCXCXCXCXCXCXCXCXCXCXCX+X+X+X+X+XOXOXoXoX].].]._._._.!._.!.Q.R.R.W.R.T.R.T.R.R.T.R.T.T.I.I.I.I.J.J.J.J.n.H.H.n.H.v.H.n.n.v.H.H.v.n.n.n.n.n.n.v.v.v.H.n.H.n.H.n.n.m.H.H.H.H.v.H.v.H.H.H.H.H.H.U.n.H.U.H.H.J.J.H.I.I.I.I.I.I.I.I.I.I.I.I.I.I.U.I.U.H.H.n.H.H.U.H.H.H.v.v.v.v.v.n.n.n.n.n.n.n.n.n.n.n.n.n.b.b.b.n.m.v.m.n.n.H.H.H.K.I.I.I.R.T.K.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.J.J.I.J.",
+"CXCXCX+XSXCXCXCXCXSXCXCXCXSXCXCXCXCXCXCXCXCXCX+X+X+X+XOX}.oX.X].]._.'._._.!.E.E.R.T.T.R.R.T.T.R.T.R.I.T.R.T.I.I.I.U.I.J.J.H.H.U.H.v.H.v.n.n.n.n.v.v.n.n.n.n.n.n.v.H.v.H.H.H.n.n.H.H.H.H.n.H.H.H.H.H.v.H.H.H.U.H.H.U.H.H.H.H.J.J.I.I.I.I.I.I.I.I.T.I.I.I.T.I.I.U.I.H.H.U.U.H.H.n.H.v.H.v.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.v.v.b.v.b.b.m.m.m.n.n.n.n.H.J.I.I.I.I.K.I.I.I.I.I.I.I.I.I.I.I.I.I.I.T.I.I.U.U.I.I.I.I.I.I.I.I.I.I.I.I.I.J.J.",
+"CXCXCXCXSXCXCXSXCXCXSXCXCX%XCXCXCXCXSXCX+XCXCXCX%X+X+XOXOXoX{.]..X_.!._.Q.!.R.R.T.T.R.I.I.T.T.I.T.T.R.I.I.I.I.T.I.I.J.J.K.n.H.n.H.H.v.H.n.n.n.n.n.n.n.n.n.n.n.n.v.v.H.H.n.H.H.n.b.H.m.H.H.H.H.n.H.H.H.H.n.H.H.H.H.H.U.H.H.U.U.H.U.H.I.I.I.I.I.I.I.I.T.I.U.I.I.U.J.U.U.H.H.H.H.n.H.H.H.v.n.m.n.n.n.m.n.n.b.n.n.n.n.n.n.n.n.b.b.b.b.m.m.n.n.n.n.U.K.H.I.T.R.R.I.T.I.I.I.I.I.I.I.I.U.U.I.I.I.G.U.I.I.I.I.H.U.I.I.I.I.I.J.I.I.J.J.J.J.",
+"CX|.CX+XSXCXCXCX+XSXSXCXCXCXCXSXCXCXCXSXCXSXSX+XCX+X+X+XOXoX{.].].'.!.!.Q.~.R.T.I.T.I.T.I.T.R.T.R.I.R.R.T.I.R.U.I.I.K.I.I.n.H.H.H.v.n.n.n.n.n.n.n.v.v.v.n.n.n.n.v.H.H.v.H.H.H.H.H.H.H.H.H.n.K.n.H.H.H.H.U.H.H.H.H.U.H.H.H.H.H.J.U.H.J.J.J.J.J.I.I.I.I.I.U.I.I.I.J.H.U.H.H.H.H.H.v.H.H.H.n.n.n.m.b.v.v.v.n.b.n.v.n.n.n.n.b.b.b.b.b.b.b.b.b.b.n.n.U.K.U.U.I.I.I.R.I.I.I.I.U.I.I.I.I.I.I.I.I.J.U.U.U.U.I.G.U.J.J.I.I.I.U.I.I.J.J.I.J.",
+"SXCX+XSX|.SXSXSXSXSXSXSXSXSXSXSXSXSXSXCX+XSX+XSXCXCX+X+XOX}.{.]._._.!.!.~.T.R.R.T.I.T.I.I.I.I.I.I.R.I.I.T.I.R.I.I.I.H.H.H.n.H.K.H.v.U.n.n.n.n.n.n.v.H.H.U.n.n.U.v.v.v.H.v.n.n.v.H.H.H.H.H.H.G.H.H.H.H.H.U.H.U.H.H.J.J.J.J.J.J.J.J.J.H.J.J.J.I.I.I.I.I.J.U.U.U.I.J.J.H.H.H.H.H.v.H.v.n.n.n.n.n.n.n.v.n.n.n.n.n.n.n.n.n.b.b.n.b.c.b.c.b.c.b.b.b.H.H.I.U.U.I.R.I.U.I.I.I.I.J.U.U.I.H.U.J.I.U.U.U.U.J.U.I.J.J.J.I.J.U.U.I.U.U.U.I.H.J.",
+"CX+X+XSXCXCXCXSX+XSXSXSXSXSXSXSXCXSXSXSXSXCXSXSXCXCX+X+XOXOX{.]._._.!.!.W.R.T.I.I.I.I.T.I.I.T.R.R.R.R.I.I.R.I.I.I.H.I.H.U.n.H.n.H.n.n.n.n.n.n.n.n.n.v.H.H.n.n.n.H.H.H.v.H.H.H.H.b.H.H.H.H.J.J.J.U.H.H.U.U.H.H.H.H.J.H.K.H.J.J.H.H.H.J.J.J.J.J.J.K.K.I.I.J.I.K.K.H.H.H.H.H.v.v.H.n.v.n.n.n.n.n.m.n.n.n.v.n.n.b.n.n.b.n.v.n.b.m.m.b.b.b.b.b.b.n.H.n.U.K.K.I.I.I.I.I.I.I.J.I.J.I.H.J.I.U.I.J.J.J.I.U.J.J.U.J.J.J.J.U.G.J.J.J.U.I.I.U.",
+"CXCX%XCXCXCXCXCXSXSXSXSXSXSXSXSXSXSXSXSXSXSXCXCXCX+X+X+X+X{.{._._._.!.E.R.T.T.T.T.I.I.I.T.I.I.I.I.I.R.I.T.I.R.I.I.I.J.I.H.I.U.n.v.v.n.n.n.n.n.U.v.U.H.v.H.n.v.U.v.H.v.H.H.v.H.v.H.H.H.H.J.H.H.J.J.H.U.H.H.U.H.U.H.H.H.G.H.J.J.H.J.J.J.J.J.J.J.J.J.J.H.J.J.H.I.n.H.H.H.H.H.H.H.n.n.v.n.n.n.n.n.n.n.n.v.n.b.v.v.n.n.n.n.v.n.b.v.m.b.b.b.b.b.v.n.n.H.H.K.U.I.I.I.I.I.I.I.J.I.J.I.I.J.J.H.J.I.J.G.I.G.U.I.J.U.J.J.J.I.U.G.J.U.J.I.H.J.",
+"CXCXSXSXSX+XSXSXSXDXFXGXHXHXHXGXKXKXKXKXKXKXKXKXKXGXFXZXOX}.].]._.!.R.R.R.T.R.I.T.I.K.T.I.I.I.R.R.T.I.I.I.T.I.I.I.I.I.K.J.K.n.H.H.H.H.v.v.H.H.v.H.v.v.H.H.v.H.v.H.v.H.H.H.H.H.H.H.H.n.H.H.H.J.J.I.J.H.I.I.H.J.J.H.H.H.J.H.G.K.J.H.J.J.J.J.J.J.J.J.J.J.J.H.H.H.H.H.H.H.H.H.v.H.n.n.n.n.n.n.n.n.n.n.n.n.v.v.v.n.v.v.v.v.v.v.m.v.m.b.b.b.b.m.b.n.v.n.H.n.J.I.I.J.I.I.U.J.J.T.).`.|.|.AXSX|.AXSXVXCXAX|.|.%X X).G.H.U.U.G.U.J.I.U.I.J.",
+"+X|.CX+X+XCXSXSXDXGXKXJXJXPXPXPXPXPXPXPXPXPXPXPXJXJXGXFXZX{.]._._.!.!.R.T.T.T.I.I.I.I.I.I.I.I.I.I.R.I.R.R.I.T.I.I.I.I.U.J.J.U.H.H.H.v.H.G.v.v.H.H.H.H.v.v.H.H.H.H.v.H.v.H.H.U.v.H.H.U.H.H.H.J.H.H.I.J.I.I.H.I.H.J.J.J.J.J.J.H.H.I.J.J.J.J.J.H.J.H.K.H.H.H.K.K.H.H.H.H.v.H.v.v.H.n.n.n.n.n.n.n.n.n.n.n.n.b.n.n.b.v.v.n.v.v.v.m.m.b.m.m.b.b.m.m.v.v.n.H.K.I.H.J.I.I.J.H.T.].|.FXFXHXHXJXHXHXHXHXHXHXJXHXFXFX|.[.Y.H.U.U.H.J.J.J.J.J.",
+"CXCXCXCXSXCXSXSXFXGX3 + 7 & & 7 & 6 & & + 7 6 & 8 2 7 GXFXoX].].!.!.W.R.T.T.I.I.I.I.K.K.I.R.R.I.U.T.R.I.I.R.I.R.I.I.I.I.H.J.U.H.H.v.H.v.v.v.H.v.v.v.H.H.H.v.H.v.H.H.H.H.H.H.H.U.H.n.H.U.H.H.J.J.H.U.I.H.H.I.J.H.I.H.G.U.H.J.H.J.J.J.J.J.J.J.H.J.H.H.H.H.H.H.n.n.H.v.v.H.v.H.v.v.n.n.n.v.n.n.n.n.n.n.n.n.n.b.n.n.n.v.v.v.v.m.v.b.b.c.b.c.b.c.b.m.n.n.n.H.J.J.H.J.H.J.I.). X1 2 7 7 6 % % 6 & % % 7 7 7 7 + 8 |.).U.U.H.U.J.J.J.J.G.",
+"CXCXCXCXSXSXSXDXGXJX7 6 & 7 7 + 6 1 6 1 6 2 1 6 8 8 2 HXDX}.]._._.!.W.R.I.T.T.I.T.I.R.I.I.K.I.I.R.R.I.R.R.U.R.U.I.I.I.I.I.J.H.H.H.H.v.H.H.v.v.H.H.H.H.v.H.H.H.H.v.H.H.H.H.H.H.H.H.U.H.U.I.H.H.H.I.I.I.I.I.I.I.I.J.I.H.H.J.J.J.J.J.J.J.J.J.J.J.J.H.H.H.H.H.H.H.n.H.H.v.H.H.v.v.v.v.n.n.v.n.n.n.n.n.n.n.n.n.n.n.n.v.v.n.v.v.v.m.b.m.m.c.b.b.b.b.b.n.n.n.H.H.H.J.J.I.I.H._.ZX2 7 6 6 6 6 & 6 1 6 & 7 7 6 3 6 7 DX`.U.U.H.H.J.J.H.J.U.",
+"CXCXCXSXSXCXSXSXGXJX2 6 6 8 % % 1 6 6 6 + 6 1 6 1 & 6 HXFX}.{.].'.!.!.R.T.T.T.I.I.T.I.I.I.I.R.I.I.R.W.R.U.R.I.T.I.I.I.I.K.H.H.H.H.H.H.v.v.n.n.H.H.v.H.H.v.H.H.H.n.U.H.H.n.H.H.H.J.H.I.U.H.H.J.K.I.I.I.U.J.J.J.I.I.H.J.J.J.H.J.J.J.H.I.J.K.H.H.H.J.n.v.H.H.n.H.H.n.H.v.v.n.v.n.n.n.v.v.n.n.n.n.n.n.n.n.n.n.n.n.n.v.v.n.b.b.n.b.b.m.m.c.b.c.c.b.b.b.n.n.v.H.I.H.H.H.H.H.).VX2 6 6 @ 6 6 6 7 6 6 6 7 2 2 3 6 7 FX[.H.H.J.H.I.H.H.H.H.",
+"CXSXSXSXSXSXDXSXKXPX& % 3 @ 5 C 6 6 & 1 7 + 6 6 6 & 7 FXDXOX{.]._.!.!.W.T.R.R.U.T.I.I.T.I.R.I.R.T.T.U.R.I.T.T.U.E.I.I.I.I.H.H.n.H.v.H.H.n.U.H.H.H.H.H.H.H.H.H.H.H.H.H.H.U.H.U.H.H.H.H.H.H.H.J.I.H.U.U.U.J.H.J.H.J.J.H.I.H.J.J.J.J.U.I.H.K.H.H.H.H.H.n.U.v.n.H.v.v.v.v.v.v.v.v.b.v.v.v.v.n.n.n.n.n.n.n.n.n.n.n.n.v.v.c.n.b.b.b.b.b.m.m.c.c.c.c.c.b.m.m.n.v.n.H.H.U.n.H.~.|.3 6 + 7 7 7 6 1 & 6 6 3 $ 6 8 6 7 LX|.H.H.H.H.I.H.H.H.H.",
+"SXSXSXSXSXSXDXDXGXPX9 % 2 7 PXPXPXPXPXPXPXPXPXPXPXKXGXFXSX@XoX{.'.'.!.!.W.W.R.R.R.I.R.R.R.I.R.R.I.R.R.R.R.W.R.R.T.I.I.R.I.H.K.H.H.H.H.H.n.H.n.v.v.H.H.H.H.H.H.H.K.n.H.K.K.H.K.H.J.H.J.J.K.K.K.K.J.K.J.K.I.I.I.U.J.I.K.H.J.J.H.J.H.K.K.H.H.H.J.H.H.H.n.n.H.H.H.v.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.H.n.n.n.n.n.n.n.n.n.n.n.n.n.m.m.v.n.m.m.c.c.b.c.c.c.m.b.v.n.H.n.H.H.H.H.I.).|.AXHXHXHXHXJXKXLXJXIXPXPX7 @ 6 + HX|.H.H.H.H.H.H.H.H.n.",
+"SXCXSXSXDXDXSXDXKXPX+ 9 2 7 PXPXIXKXKXKXFXKXKXKXGXFXFXDX|.OXoX].'.#X_.!.W.W.R.R.R.R.R.I.R.I.T.R.R.W.U.I.T.U.I.R.I.I.U.U.U.U.n.U.H.H.n.v.H.n.U.U.v.H.v.U.n.H.v.H.n.U.n.U.n.n.U.H.H.U.H.H.U.U.U.U.I.U.U.U.U.H.U.H.H.H.U.v.H.H.H.H.U.U.U.n.U.U.n.H.n.v.H.n.n.n.v.v.n.v.v.b.v.b.n.b.b.v.v.n.n.n.n.n.n.n.n.n.n.n.n.n.v.v.n.m.b.b.n.c.b.c.c.x.M.c.c.c.b.c.b.c.b.v.v.H.H.H.H.U.G.`.`.|.|.|.|.|.CX|.AXFXJXPX& 1 7 6 HX|.H.H.v.v.v.H.v.v.v.",
+"SXSXDXSXDXDXDXSXKXPX6 % 6 9 PXJXDXSXSXSXCXCX@X XA...[ [ [ [ ' ' ' ' ' ' ] ' ] ' ' ] [ ' ' ' W ' ' ' ' [ [ ' [ [ [ [ ] W ' ' ] ' W ' E ' E ' ' ' ' ' [ [ ' ' ' ' [ ' ' ' ' [ ` [ ' ' ` [ [ ' ' [ ' ' ' ' ' [ ' [ [ [ ` ' [ [ ` ' ' ' ' ' ' ' ' ' ' ' [ ' [ ` [ [ ' ' ' ' [ ` ' [ ' ` [ [ ' ' ' [ [ [ ' ' ` [ ' [ ' [ ' [ ' ' ' ' [ ' ' [ ' [ ' ' ' ' ' [ ' ' ' [ ' [ [ ` [ [ | S.P.R.R.K.K.K.I.I.FXIX7 6 2 1 LX|.n.n.n.n.b.n.b.b.v.",
+"SXSXSXDXSXDXSXSXHXPX9 % 1 9 PXHXSXSXCXSXZXVXD...| ' ] ` ] ] ] ] ] ] ] ] ] ] ] ` ] ` ] ' ' ] ` ] ` ` ] ` ` ` ' ] ] ' ] ' ' ] ' ` ' ] ` ' ' ' ] ' ` ] ] ` ` ` ` ` ` ` ` ` ' ` ` ` ] ] ` ` ` ` ` ] ` ` ` ` ` ` ` ] ` ` ` ` ` ` ` ] ` ` ' ` [ E ' ' ' E ` ` ` [ ` ] ` ] ` ` ] ` ` ` ] ] ` ] ` ` ' ] ` ` ` ] ` ` ` ] ` ' E E ' ' ] ] ' ' ' ] ` ` ` ` ] ] ] ' ` ` ` ` ` ` W ^ ' ` [ [  .) G.P.R.T.I.I.|.JX2 2 7 2 LX|.n.b.n.b.b.b.b.b.b.",
+"SXSXSXDXSXSXSXSXHXPX7 % 1 6 IXHXSXSXSXCX X..| [ ` w w w e e w e e e w w w w w w w e C e e e e e w e w w w w w e w w C e w e w e C w e w w w e w w w e w e w w w C w w w w w w w w w w w C w w w C w w w w w w w C w w w w w w w w w w w C w w w w w w w w w C w w w w w C w w w e C w e w e w w C e w w w w w w w w w C w w w w w w w w w w C w w w w w C w w w C w w C C w e ' / |  .C.T.K.I.K.%XLX7 6 7 6 HX}.n.b.b.c.m.c.b.c.c.",
+"SXSXSXDXSXSXSXSXGXPX2 6 7 6 PXHXSXCXZX(...[ | A h.r.q.q.w.w.w.w.w.w.w.w.w.q.q.q.w.w.w.w.q.w.w.w.w.w.w.q.w.w.w.w.w.w.w.q.q.w.w.w.w.w.w.w.e.w.q.w.w.q.w.w.w.q.q.q.w.w.q.w.w.q.q.q.q.w.q.w.w.5.w.q.w.w.q.q.w.q.w.w.w.w.w.q.w.q.w.w.w.q.w.q.q.w.q.w.w.w.q.q.q.w.q.w.q.w.w.w.w.q.w.q.w.q.q.w.q.q.w.w.q.w.q.w.q.w.q.q.w.q.w.w.w.q.q.w.q.q.w.q.q.w.w.w.w.w.w.w.w.w.5.w.w.w.w.q.w.w.w.h.s.[ [ | Z.T.T.I.}.HX2 + 9 % LX|.b.c.b.c.c.c.c.c.c.",
+"SXSXSXSXSXSXSXSXKXPX2 9 + 7 PXFXSXCX X..o.' s.r.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.5.w.e.s.w [ /  .T.T.[.HX2 8 7 & HX Xc.c.c.c.x.x.x.x.M.",
+"SXSXSXSXSXSXSXSXHXIX7 % 1 7 PXGXZX(...| ' s.9.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.h.| [ |  .Y.|.LX2 2 & 7 HX|.c.c.c.x.x.l.x.x.M.",
+"SXSXSXSXCXSXSXCXHXPX% 9 1 2 PXHX|...| [ s.r.e.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.e.s.[ [ | C.|.LX6 8 6 7 HX|.x.x.x.x.x.x.x.l.x.",
+"%XSXSXSXSXCXCX+XHXPX7 & 1 9 JXHX(.| [ | r.e.e.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.r.A [ [ /  XHX2 8 6 2 FX{.x.x.x.x.l.x.x.x.x.",
+"+X+XSX%X+XSX+XSXGXJX% 8 6 % JXFXZ.' E h.e.w.w.w.q.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.h.' ] '  XAX2 7 & 7 FX`.l.x.x.x.x.l.x.l.l.",
+"+XSX+XSX+XSX+XSXGXJX8 & 6 % KXAX..` ` r.q.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.#.+.+.+.+.+.+.*.+.+.+.+.+.@.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@.*.#.-.#.+.@.@.+.+.+.+.+.+.*.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.*.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@.*.@.+.+.+.+.+.@.+.+.+.B.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9.o.' ] /.VX+ + 6 7 VX'.c.l.l.l.x.x.x.x.x.",
+"SX+XSXSX+X+XSX+XFXJX2 7 7 @ KXVXW ` w q.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.>.;.;.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.>.;.;.;.;.;.;.;.;.>.;.;.&.aXuXuXbXbXaX,.>.:.;.;.:.>.;.;.;.;.$.;.;.;.:.:.:.$.&.$.$.$.,.;.;.;.:.;.,.&.$.$.&.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.%.;.;.;.;.;.:.;.;.;.;.;.;.;.;.;.;.;.$.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.| ` ` A. X2 t 6 2  X^.c.l.x.x.x.x.x.x.x.",
+"+XSXZX+XSXSX+XSXDXFXGXHXHXGXGX X[ ` w w.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.&.gXeXcXtXbXbXvXuX6X=.$.;.;.;.;.;.$.$.$.,.$.$.$.&.-.aXX.X.=.-.=.$.$.$.,.*.aXgXgXaXaX=.$.,.$.$.>.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9.| ] ' V.Y.[.|.|.[.Y.U.l.l.x.x.x.x.x.x.l.",
+"SX+XSX+X+XSX+X+XCXDXDXFXAXFX|.CX[ ` w q.q.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.+.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.&.aXeXtXyXyXeXeXeXvXcXdX&.$.$.$.$.:.-.X.X.=.X.=.=.aXrX3XN N N V >XsX=.X.=.6X0X0X9X0X9XrXsX=.X.X.@.>.&.&.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.| ] ' k.C.Y.Y.Y.E.G.l.l.x.x.c.x.x.x.x.l.",
+"SX+X+XSX+X+XSX+X+XCXCXCX+XCXSXCX[ ` w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.&.aXbXyXlXg.u.rXvX9XrXbX6XaX=.aX=.=.o.B D F N F F N N N m X N F X V N F F N N B B N N B F N N N m V C =.gX=.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.e.A ] ] k.k.z.x.x.x.x.x.x.x.x.l.l.c.l.x.l.",
+"SX+X%X+X+XZX+X+XCX+XCX|.SX+X+X|.' ' w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.&.aXbXiXxXr.7.6.lXyX>XN V M N M M F h N l j x y > ; a O u C O o.sX4 X x p u l p i G p l   ; 2.- 2.i . N >XcXqXsX$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] k.k.x.x.x.x.l.x.x.x.x.x.c.x.l.l.l.",
+"DXSXSXSX+X+X%X+X+XCX+X+X+X+XOX}.' E w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.&.aXtXiXlX9.3.3.4.xXyX>XX k z . B N O C a a g.i.u , NX:Xa 2XsX= * R $ h u.p.i y.p.u G v i.v 2.; ; NX,Xl ,XG 9XuXuXaX&.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] k.j.z.x.x.x.l.x.x.x.x.x.l.x.l.l.l.",
+"SXSXSXSX+X+X+X+X+X+XOX+X+X+XOX#X' E w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.:.&.gXyXxXu.9.6.3.6.6.lXtXJ j f.kX$ NXfX= O.1Xl v <XM > s.s.  &X1X- ; ; < g c l z j z u G z x j ; 2.- s.d.< 5XN C T { f R &.,.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.q.0.A ` ] k.j.z.x.l.l.l.x.x.x.l.l.x.l.l.l.l.",
+"SXSXSXSXSX+XSX+X+X+X+XOXOXOX@X.X' ' w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.&.aXyXiXp.7.3.6.6.e.u.vXvX>X: c =XO T R O T * < ; v ,X< ; ; ; - y m m : m m n K N G G B N G G N m 5 5 : N 5X,X3X* $ zXB * aX$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] V.j.z.x.l.l.l.l.x.x.x.x.l.x.l.l.l.",
+"DXSXSX+X+X+X+X+X+X+X+XOXOX@XOX_.' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.+.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.&.aXyXlXu.g.8.6.9.u.xXyXbX>XV g s 4 # # b b l l 4 m m M m : V a a s y y y M *X8X8Xp m y y h g X y u y y g 4 ..MXo.C C Y N * K sX$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] k.j.j.l.l.l.l.l.l.x.x.x.l.l.l.l.l.",
+"DXSX+XSXSX+X+X+X+X+XOX@XOX.XoX`.' ] w w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.$.aXyXlX9.6.bXjXg.>XG N G G B o B m . K D : V N N N X j < X # O.1Xi n X K $ . &X8XwXpX: z $ O M g j c i m h C o.MX{ * T { f @ D 0XsX$.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.;.;.;.;.>.>.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.0.A ` ] ) j.z.l.l.l.l.l.x.x.l.x.l.l.l.l.l.",
+"SXSXSXZX+XSX%X+XOX+X}.{.{.].oX(.' ' w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.*.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.&.aXeXiXkX7.4.xXiXiXP X n *Xx H c d.d.o 7XG b y K $ o > h.2.: # T T i x n 6Xo.# &X&X&X&Xb 6Xo.X x y u.p.l m h C R R R V L $ d s M D D f C ;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ]  .j.z.z.l.l.l.l.l.l.l.l.l.l.l.l.l.",
+"SXSXSXSX%X+X+X+X+X+X}.}.{.oX.X(.' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.$.aXtXyXlXe.6.f.uXlXp.J U NX4 g 3XF , Z   J u o N 6X{ # > k k o V # d : g n Y ;Xi j j v j n U <Xu l F j =Xy M x : < t - n i D u -Xd @ T * T f <.:.;.;.;.;.;.;.;.;.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9.A ] ` ) ( z.l.l.l.l.l.x.l.l.l.l.l.l.l.l.",
+"SXSXSX+XSXSX+X+X+XOXOX}.{.{.].).' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.>.;.;.>.$.&.X.tXtXlXe.7.r.rXyXkX7.I b b i X G n X # b X s n B U ;Xo X i i X y D J m 4 n X 4 4 y M D N V m 4 g : j G n G n b : d.d.> N j NXB g d * zXB = f <.&.:.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9...] ` | ( z.z.l.l.l.l.x.x.l.l.l.l.l.l.l.",
+"SXSX+XSX+X+X+X+X@XOXOX}.].{.].(.' E w w.w.w.w.w.5.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.;.;.;.;.%.$.$.,.:.$.,.$.$.$.;.$.$.$.;.$.-.aXtXtXyXjX5.u.9XeXyXjXf.J X 4 X X g H G X s V a i m 4 X j j m x m V g m M > < C a a X V a . ; k J y l M : o o X x # m s.: V u B y i d f Y B * D fX-.<.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.B.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9...` ` N.( j.z.l.l.l.l.x.l.l.x.x.l.l.l.l.",
+"SXCXCXCXCX+XOX+X@XOXoX}.[..X].(.' ' w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.>.;.;.$.-.=.-.=.=.=.=.-.=.=.=.=.=.=.-.aX0XtXtX>XG G G G G G -XzXdX8Xc Y V X h ,XP y r O.7Xs s X g y M X V a i m y h v - O.Y i y O.fX< 2.< i m 1XV b B Y M h B X : X V V g b g $ { C C T y D G * <.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.q...] ] ( ( z.l.x.x.l.x.x.x.x.x.x.x.x.l.l.",
+"SXSX+X+X+XOX+X@XOX@XoXOXoX.X].).' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.>.;.&.sX0XtX9XP G G F F G G G G G G G F G N F V - > . ;X4X4X4XNXzX4X*XV M y y p *Xg $ T r y b Y 1Xg M s O.7Xy n M 5 2.- T T y o T T . ; ; y BXLXX 4 > > o z J : : B > k ; J y s d d $ $ y U S u X.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.9...' ] ) ( z.l.l.l.x.l.x.l.x.x.x.x.l.l.l.",
+"SX+XSX+X@X+X+XOXOX@XoX{.}.{.{.(.' ] w q.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.;.&.sX0XJ G G V 3X4Xi j p 7XH u i b b y x i X c d.zXp =X5X5X-XF.1X3X8X,X5XF J -X<XH J ,X2XH X y y X M $ T T s M h 5 > j : # b : # # : , : i Y Z o n : : u h g : d.d.5 N =Xl b V . s M y i f V l X.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9...] ]  .( z.l.x.x.x.x.x.x.x.x.x.x.l.x.l.",
+"SXCX+X+X+X+X+X}.OXOX.X{.}.{.}.).' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.$.sXcX9XG h u i <X5Xk f.x -Xi.p.x n x l i.c y 4Xk F., =XlXkXwXF h <XmXvXvXP h *Xz g 2XnXvX,Xs : X j j X # # n M M 5 ; , o.zX{ n b n V X N > - i o o D -X8Xp g : Z s.: N ; i Y U o U U o d = * * R <.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9.o.] ]  .( l.l.x.x.x.l.x.x.l.x.l.l.x.l.x.",
+"CXSXCX}.+XOXOXoXOXOXoXOX[.oXXX).' ' w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.=.cXbXrXG z p.x 5X9Xx c l 5Xx c p n D z l l n 6X5X5X<XyXp.7.cXqXqXqX0XyX>XB l k c u S NXNXo.> : , : M o V a i V d , 2.t F.MXQ n n Y B o N > ; 6Xo.$ pX8XlXpXg y a . y : : l B B i n B u d = zXG * &.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9...' ] | ( ( l.x.x.l.l.x.x.x.l.x.l.l.l.l.",
+"+X+XCXCX+X+X+XOX}.OXoXOXoXoX{.`.' ] w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.sX0XtXeXG z j l F G b G U G s D G j : F F F m 2XvXtXyXyXjXr.eXeXeXeXvXvXP m G I x g { d.MXT < B.d.: x s O.7Xy M D - 2.t R R T M b B N y M < ; Y <Xy p &X&X&Xh : l # O m M F 4 X 4 X X o $ { Y N * <.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.0...` ] N.( j.l.x.l.x.x.x.x.x.l.x.x.x.x.x.",
+"CX%XCX+X+X+X+XOXOXOXOXOX}.}.}.`.' ' w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.*.rX0XtXrXG 4XrX4XG ,X3X;X2XN - > . g h , 5 H h G G 4XtXeXeXvX4Xz H K K K g M G N G F r R R T < v p > M X T { X M y : j > j j g y X o i y y x m b y n g v i   d g 3Xo.$ m ; : i 2Xn M b 8Xd T C f T -.<.;.;.;.;.;.;.;.;.:.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.0.o.` ]  .( j.z.x.x.x.x.x.x.x.x.x.l.l.l.l.",
+"+XCXCX+X+X+X+X+XOX+XoX@X@X}.OX(.' ] w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.#.P G G G M u =Xz b l =Xz 4XF s.zXp 4 M ; , u M O : 6XtXeXeXvXH 4 n m n n m K h u n g : g : : y o y n n s # # 4 V g j N 4 n N n V V N M g V G : : > > u 5Xo.# x m Y >Xl : d.:Xz <X4 NXB h u fX7Xd K f O.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.e.| ` ] | ( j.z.l.l.x.l.x.x.x.x.x.x.l.l.x.",
+"SX+XCXCX+X+X+X+X}.+XOXOXOXOX|.`.' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.V i d O m l u.=X# k f.<X5XG , NX, : M ; 5 H dX* b 6XtXeXvXtXH b -XzX1X8Xx M n 4 H P M . > # . , b o V a O V a a M , < , 5 o m Y zX] M o 4 ,   A d.5 b Y >Xu h X g i y o s.F.< 4Xm B M X h vX4XhXMX-XX.,.;.;.;.;.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.| ` ] ..( z.z.l.l.l.l.l.x.x.x.x.x.l.l.l.",
+"CXCX+XCX%X+X+X+X+X+XOXOXOX@XOX(.[ ] w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.#.5 :XfX$ m K c x s j hXz 5XG . 4   g M ; > B >XH X 3XvXz ;Xz y M <XNXF.lX*XV Y n z P D < g.U - h.I o O.7Xo O.7Xi N F j BXUX< { F.MX{ N v A F.- v p < V 4 g g b m C zXS N :X5Xx l : o i i u 3X5X=X8X:XO.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.q.o.` ] | ( ( z.l.l.l.l.l.x.x.x.x.l.l.l.l.",
+"CXCX+XCX+XCX+X+X+X}.+X+XOXOXOX`.[ ` w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.#.V U >XK n 4X2X:XB :X5X:X9XN &XdX{ g h ; m n b y m 6XvX*Xi.jXp N <XNX1X2X=X4 B M *X,XM < ; x   ; N o T { O T ` y h m , Y Z - C R R R N > v p - y y g y h $ O y S ..MXo.V P J y n n m m N n D 9X2X*Xo.&.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q...` ] | ( ( l.l.l.l.l.x.l.x.x.l.x.l.l.l.",
+"CXCXCXCXCX+X+X+X+X+X+X@XOX+XOX`.' ` w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.#.V # b : j J >XP N J P rXyXB a 2Xo.: H j g M M M 4 l ,X;Xi.=Xi m -XF h 5X<X4 X X N G 4 X X : o X X # $ d y $ # o j k > o > b V 5 t 5 m n X i g n h $   4Xo.o u C R R R B 3X<Xy u D u 3X,XV y J J G >.,.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9.| ` ] N.) ( l.l.l.l.l.l.l.x.l.l.l.l.l.l.",
+"CXCXCXCXCX+XCX+X+X+X+XOXOXOX|.`.' E w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.B 2X<X3XN ; ; o B : 4 J P B X y 4 m G m 4 n M n n n h X i i l N h x x -X<Xs n *X5X3XH n : n Y X V a u 4 m Y n y M : m Y V 5 ; ; ; , ; - h > o g 4Xo.= Y >Xh M j 5 5 5 G vX9Xi fXdX:X9XrXN : : b # 6X-.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] ) ( ( z.l.l.l.z.x.x.l.l.l.l.l.x.l.",
+"SX%XCX+X+XCX%X+X+XCX+XOX+X+X}.`.' W w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.#.B *X*Xz j c c Z d.Z 4 F l u u >XG ,X4X6XM 2X;Xu u b M :X3X-X9XP V Y b x J B NX: 5XvX:Xg n UXBXO O.:Xy n BXBXo l K 4 BXBX# < 2.; ; , Z < s.2.o n Y <Xu b g 4 m F 5X<X;Xp d i j 7X6X*X9X4XB i U U g 6X-.$.;.;.;.;.;.;.;.;.;.;.;.:.:.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] | ( z.z.l.l.l.l.l.x.x.l.x.l.x.x.l.",
+"SXCXCXCX|.CXSX|.+X+XOX+X+X+X}.`.' ' w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.#.L l i.x m , < , s., 4 l z i.x <XF l :Xz l -X*Xi.c u : G >XG P N n B M h N V B y z vX;XM m NXZ O _ C : n NXU . v , b NXU o > ; ,   BXUX  , i.> n b g b B m L ;Xp D j =X2Xo.$ y # X g J J B y B B l O.;.;.;.;.;.;.;.;.;.;.;.;.;.;.%.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] | ( j.l.l.l.l.l.x.l.x.l.x.l.x.x.x.",
+"CXCXCXCXCXSX%XCX+X+XOX+X+XOX|.`.' ` w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.B z j p n , , : o X m N *Xv p 5XJ j i.c u 4X:Xj x n l l y y 4 V U U & : >Xx *X5X4XvX;Xn b X : $ $ $ b n X b X > , g : : 4 b BXUX  NXY . X X X V m V n h > i *X2X{ d 5XY <Xh u M M M g n g u i i { ;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] | ( j.l.l.l.l.l.l.x.l.x.l.x.x.x.l.",
+"+XCXCX%XCX+X+X+XCX+X}.+XOX+XOX`.' ` w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.#.B 4XrXF m ,X6X3X3X3XB X F G K L G K j l X J J G J B h *Xi.c u { zXMXo.x n *X-XH -XmX,Xy y M M M g 4 n M h j b H >XF i D y b Y Z - # : 4 B B m : U V o s.2.j 5XU >XD G y s n G b X s n X g y M s *.:.>.;.;.;.;.;.;.;.;.;.;.%.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ] ] | ( j.z.l.x.x.x.x.l.l.x.x.x.x.x.x.",
+"+XCXCX+X+XCXCX+X+X+X}.+XOX+XOX`.[ ' w q.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.+.B P tX<XB rXvXvXvXuX6XD H <Xs.i.B F K F : 4 >X,Xi.G b z j x y E R R fX,XNXg F NXX 5XvX3X2X2X2X2XJ F i.I 5X5XH :X3XM u.kXD n X X n B m b y # O BXUXb > , c > G b y 4 g $ i a B ,XX U U X 4 U U # <.:.:.;.;.;.;.;.;.;.;.;.;.>.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] | ( j.z.x.x.x.x.x.x.x.x.x.c.x.x.x.",
+"CX+X+X+X+X+X+XCX+X+X}.%X+X}.|.(.' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.@.o.F ;Xz u 4XeXeXeXeXvXrXp p.8.t.3X2X3X3Xh >XyXkXr.J # M G J V 5 G 1X6X>XC y X U y ;XnXvXnXvXnX5XF P 8.p.pXz p :X3XM v jXi N k B 5 : S X X.O.O F.U o m > g : g d u i : } fXu B 9Xy B B y X B B M -.>.*.>.%.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.q.0.A ` ] / ( j.z.x.x.c.x.x.c.x.x.x.x.x.x.x.",
+"+XCX+X+XCX+X+X}.+X+X+X+X@XOX}.`.' E w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.X.G p i.x 4XeXeXeXeXtXtX:XK I H H ;X;X;Xh H H H ;XD M 2XK u u n J J J n o y X o y M P P P P P B m G jX5Xc i.i G F x M M N j h > > BXUXo R 1.o X g : B g : S X } 7Xu # T { # G 4Xi o . *XN # o s G K G C <.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.>.N.w.w.t.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ] ] | ( j.z.x.x.x.x.x.x.x.c.c.x.c.x.x.",
+"+XCX}.CX+X}.CX+X}.+XOX+XOXOX}.`.' ' w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.X.G l v p 4XyXyXyXyXyXxXkXy.i.k i.I 2X7X4X2X7X<Xy.c i.xX:Xc c s >X2X7X6X6X2X6X6Xh l y u u y u h i : ,XwXj x u M m m m G N g n j j NXY o :Xd i M M n P : NXIXo T { # N H ;XK J 4Xi NXS x M <X;X;X4 U S X O.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] N.! j.z.l.x.x.x.x.c.c.x.c.c.x.x.l.",
+"+X+X+X+X+X+X}.CXCX|.+X+XOX}.|.(.' ' w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.X.F 4X3XjXkXkXkXjXjXkXr.6.6.6.7.7.5.kXkXkXkXlXf.6.6.7.w.5Xj l b 3XlXkXkXkXjXkXlX:Xi.c p c jXp c =Xy G J J F g # J F b h D F =X<Xh X i g ;Xu y X o g D b NXY   $ $ : h 3XnX2Xn H y U h X N xXwX4Xn B Z M O.,.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.0.A { ]  .( j.x.l.x.c.x.c.x.x.c.c.c.c.c.x.",
+"+X+X}.}.|.+X+X}.+X|.+X+XOXOXoX`.' ] w w.w.w.w.w.5.w.w.w.w.w.w.w.t.w.w.w.w.w.t.w.w.w.w.w.@.X.I uXg.7.6.6.6.6.6.6.3.3.3.3.3.3.3.6.6.3.7.7.3.3.3.3.7.p.hXjXJ s.7.7.6.6.6.6.7.2Xj x p j l p j l u y u X P >Xy h :X,X2X,XI 8.kX9X5X=X2X;Xi } } $ N h X i X i N h b g l H M N <Xl i i i y z ;Xz n y *XL $.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] | ~ j.z.l.l.x.x.c.c.c.c.c.c.x.x.x.",
+"+X+X+X+XCX+X+X+X+X@X}.+XOXOX}.`.[ ] w w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.=.G lXe.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.6.7.5.>Xy.7.6.3.3.3.3.6.p.<XhXjXjXi.jXjXjX2Xx hXy ,XvX2X2XlXiXnX2XU t.i.7XP P ,XJ X 1.1.$ >X,Xn y i n o h : X i *XM B >XF i u y y y.g.;XX b ;XqXuX=.&.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.B.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] | j.j.z.x.x.x.c.x.c.c.x.c.c.c.x.x.",
+"|.}.+X}.+X+X+X+X+X+X+X+X+X+X|.(.' ` w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.*.dXJ u.6.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.5.J s.8.3.3.3.3.3.3.6.6.6.6.6.6.6.6.7.<Xj x i >XvXvXvXjXP P P G P B 4 # i i n X # # # G P B y :XsX$ h : NXB z x ;XF b y.g.*X# c hXz X NXB F wXsX&.,.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] ) ( j.z.x.x.x.x.x.c.c.c.x.x.x.c.x.",
+"CX+X+X+X+X+X+X+X+X+XOX+X+X+X}.`.' E w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.#.fXG 4Xr.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.7.5.G i.8.8.6.3.3.3.3.3.3.3.3.3.3.6.3.7.jXL K M G P P >XG # n   X G 3XK } 7Xi V u o # u i u s y pXdXf y g Y M o x wX4Xn c kXz b X g X g U N y 4XvXuX=.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] | ( j.z.x.c.x.x.x.c.c.x.m.x.c.x.x.",
+"+X+X}.+X+X+X+X+X+X+X+XOXOXOXOX`.[ ` w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.%.X.F yXu.6.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.7.8.t.P M c g a.6.3.3.3.3.3.3.3.3.3.3.3.6.y.i.d.i.I ,X>X,XP 4 B.w o P 9XK R { X G z k } 7Xp hXu # . a a M 4 o X X n P P j X s X B ,X,X,XN X y g ;XrX6X=.,.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] | ( z.z.x.x.x.x.x.c.x.m.x.x.x.x.x.",
+"+X+X+X+X+X+X+X+X+X+X+X+XOX+X|.`.' ` w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.%.X.F rXf.6.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.k j h M B d.V k 6.3.3.3.3.3.3.3.3.3.3.3.3.6.6.3.7.kXvXvXvX7X> 2.h.$ P xX5XK K K H x < T } j k u b } 7Xa h ,X1X,X>XM ,X>Xj y g =XG vXvXuXT * T T ,XaX$.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] | ( z.l.x.x.x.x.c.x.x.x.x.x.c.c.x.",
+"+X+X}.+X+X+X+X+X+X+X+X+XoX+X}.`.' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.X.G eXp.6.7.7.4.7.3.6.3.3.3.3.3.3.4.7.4.7.4.4.7.8.8.7.t.k BXL o B BXd.k 7.6.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.lXyXeXvX1X: < 4 # B >X,X>X;XP B D M $ $ s J G b T } # D nXyXtX4XK vXrXb NXB x F rXcX6X* Y Z * dX=.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] | ( ( z.x.x.x.x.x.x.x.x.x.c.c.c.x.",
+"}.CX|.+X+X+X+X+X+X+X+XOX+XOXOX`.[ E w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.X.G P >Xd.I I I lXxXf.6.3.3.3.3.5.lXI I I d.I I I Z I 4XI NXA : 4 S B F p.8.7.4.7.4.4.4.6.3.3.3.3.3.3.6.p.yXtXeXvX;X: C 4 : V n # # i i n u M n D x s b y $ O o i *XbXtX4Xx tX4X4 Y M X N eXcX6X* Y G * &.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] N.( j.z.x.x.x.x.c.x.x.x.x.x.x.c.c.",
+"+X+XCX+X+X+X+X+X+XOXoX+XOXOX|.`.[ ' w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.%.X.F >XX 4 > H N K :X&XjXu.6.3.3.5.lXK y u M u y b >XD J M 4 > b y y y 4 J I I I I k Z I y.3.3.3.3.3.3.6.lXyXxXxXvX;XBXUXo NXUX4 # } :Xa i o . : o . o N ,X2Xz } 7Xp 9XvX3XK tX6Xm o X X B 0XvXdX{ L C T &.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] | ( j.z.x.x.x.x.x.x.x.x.x.c.x.c.x.",
+"+X+X+XCX+XOX+X+X+XOXOX}.}.}.|.(.[ E w w.w.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.X.G 5Xt d.Z 5XD T o.p 5XvXu.6.3.7.r.:Xc c p c c g 6XJ X X a ;XG d NXo.j G : : B b n BXBXk 6.3.3.3.3.3.6.lXyXyXvXvX>XNXY O BXd.o # _ } o 2X{ = b C K i J yXnX2XR } D qXvX4XD vXbX,X,XZ B 2X3X:X7Xf * * T <.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.0.A ` ] | ( j.z.x.x.x.x.x.x.x.x.x.c.x.c.c.",
+"CX+X+X+X+X+X+XoX+XoXOXoXOXoX}.`.[ ` w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.X.J 5X, F < 2XF @ } C 5XyXtXr.3.3.e.:Xv x p k x b 5XH * o.pXH G $ } R *XP n BXBXo N BXS v 8.6.6.7.7.7.7.hX4X>X>X1XD X : X X : : N K K D 1X1Xn : u C # H 9X>XP $ $ X >X>X>Xl ;X:X,X;X4 n ;Xh o g i h <X:XuX-.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] N.( ( M.x.x.l.x.x.x.x.c.x.x.x.x.x.",
+"+X+X+X+X+X+X+XOX}.@XOXoX{.oX}.(.' ` w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.@.X.F 4Xv *X*X4XF O O O 5XvXyXp.7.3.4.3X:XK F J F m I N * } C # m M L K 4XP V BXZ X b X : D I d.I I I I I d.G G M g n n M N N n 4 F 2X2XH g i i y i y X G P 4 : > j ,X>XJ B G 4 n g g g m ;Xi U S X n >X,X<XaX$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] | ( k.z.x.l.c.l.x.x.x.x.x.x.x.x.x.",
+"+X%X+X+X+XOXOXOXOX}.oXOXOXOXOX`.[ E w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.X.I rXwXnXyXtXB m V S 2XyXtXtXr.3.3.e.d.I 7Xn y i b s o O O s J rXiXnXnX>X# s : b N b F I I I i.I I I J u y h H <X,X,Xl o . X b n n n M M M V M N n h j V > A d.k yXtX0X,X,X,X>XV m h ,XrXi U U u # T * T 1.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.0.A ` ] | ( j.M.l.x.x.l.x.x.x.c.c.x.x.x.c.",
+"+X+X+X+X}.OXOXoXoX+XXXoX{.{.{.).' ` w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.=.F H *Xz 9X,XM n Z : 2XyXeXyXp.8.3.3.6.9.lXf o.&XX C X.&Xs P eXnX2X;Xz h b , > s y # i.8.6.6.6.6.7.8.<Xx c i :XtXvXvX:Xb U s 4 4 V V g g s X B y h g F b : , K k yX9XH ;Xc eX>XF >X3XvX9Xh o o X f * Y V * &.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.>.N.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] B.( j.z.x.x.c.x.x.x.x.x.x.x.c.x.x.",
+"+X+X+X+X}.+XOX{.oXOX}.{.{.oXoX(.' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.-.M k p.;X2XG >     i rXeXeXeXtXr.3.3.3.6.9.f } C y * } ] : z :Xp M # U P g k v u.jXd d.8.6.6.3.3.3.6.jXj c i :XyXvXvX;XZ Z o b NXUXd X } o.o i.i.z l i.u g > i X 7XF t d.Z 4XV m ,X,X,X>Xh M B B C * Y J * &.$.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] | ( j.M.l.x.x.x.x.x.x.x.c.x.x.c.c.",
+"+X+X@X}.OX}.OXOXoX}.OXoX.XoX{.`.' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.@.%.B j y.p 5XN 2.J a 3XvXeXeXeXiXp.6.3.3.3.4.N $ $ V O = O X l 1X* X b B F X k v p.=Xy ;Xc c a.6.3.3.7.jXp p u =X9X<XjXk < - : b BXd.o 4 1.1.$ v k p x c u b s y i V j , K , H B J 4 : =Xm y D n X 5 { Y B * dX=.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] | ( j.l.x.x.c.c.c.x.x.c.x.c.x.x.x.",
+"+XOX@X@XOXOXOX.XOX{.oXOXOX{.{.(.' ] w 5.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.%.B K K D >Xn s.BXk 4XvXeXbXbXyXp.6.3.3.3.7.r.P M i ; p.m X S 1X>X# X o o # , > h y : K x =Xx 7.3.3.6.<Xx jXi *X9Xc Y UXzXd.s n o i . m $ * d H K J H K G X } 7Xi G 5Xc &Xo m ,X5XzXB z N i S B X n T T * T ,XaX$.:.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.0...` ] N.) j.c.x.x.x.c.c.x.x.x.x.c.x.x.c.",
+"+XoX}.}.oXOXOXoX{..XoX{..X{..X(.' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.*.<.V >X>X;X,XB < :   z rXbXtXvXiXp.3.3.3.3.6.w.P z c ; h.F g V V u 4 P ,XM s a o s X : H k j c 7.3.3.7.<Xv k i :XvXjXY UXg.c j Z i c i.g g u y X B b X g g y _ } 4 F vXvXP B ,XiX2Xo.m X 4 i U U h F M M x n h aX$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.B.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] | ( j.x.x.x.c.x.c.x.c.c.x.x.x.x.x.",
+"OXoXoX}.OXOXoXoX{.{.oX{.oX{.OX(.' ] w w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.+.*.S 9XtXx z X b K dX7X4XtXeX;X;Xz r.3.3.3.3.e.M p v .   X b 4 : > G rXcXL } pXa 7X{ o >X5X5Xi.7.6.3.6.p.<X<XH I 5.i.Y BXd.k l c p j c u : s.2.  B # Y fXb b $ $ # G rX>Xn <XwXBX8X*Xz z P h o o i h h y i -X:XrX-.$.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] | ( k.M.x.c.c.x.c.x.x.c.x.x.x.x.x.",
+"OX{.OXOXOX{.oX{.{.oX.X{.[.{.{.`.' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.*.B 9X9Xn n B X K dX:X5X9X5X1XIXB a.3.3.3.6.5.C o.&Xl V J ,X> S s.:XnXmXf } [ a -XsX$ ,XwX5X8.7.7.7.3.4.8.8.I H p.I k x : k H H l l p u > , i.> B # { O.$ n g g X G 5Xm H wXlXNX1X8XcXnX9Xl ;X:X<X;XD 1XV *XqXcXsX$.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.t.w.w.w.w.0.A ` ] ..( k.M.x.c.c.c.x.c.x.c.x.x.x.x.l.",
+"oXoXOXOXoX{.oXoXoXoX.X{..X{.{.`.' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.*.*.S 9X9XN Z : # X M y F ;Xx NXBXL a.6.3.3.3.w.f } C 4 P eXnXk U k j 3X2Xy $ $ . u u X H *Xz k k k a.7.3.3.7.y.:X,X$ V X : V N M o } ;Xi X . i . s d O = X s L fXn N x M 4XwXzXNX1XqX0X6X6XJ 3X3X2X,Xg d.B s 6XbX-.$.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] | ( j.z.c.c.c.c.c.c.x.x.x.x.x.x.x.",
+"oXoXoXoXoXoXoX].{.oX.X{.{.{.{.`.] ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.<.B rX0Xj j j P >Xy h g n 5 > s V a.6.3.3.4.c $ O $ n >X3X3X> i a 5 5 S o.U ,XM 4 n b s } { O d.V j 7.3.3.7.c :X;XNXUX. NXBXM x j _ o.# M k p.*Xk I hXi G o { } $ m B ,XyXqX>XB G wXaX,.>.*.V [ { [ [ C T $ @.>.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ` | ( k.M.c.c.c.c.c.x.c.x.x.x.l.x.l.",
+"oXoXoXoXoXoXoXoX{.oX.XOX.X{.{.`.' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.@.@.B ,X2X>X3XtXiX9Xc g.<Xb P >XI I u.6.3.3.e.f o.&Xu X b # 4 4 4 4 b { zXMXo.wXH NXBXX & O.1.X BXF.c 8.6.6.7.c :X,XBXd.  BXF.i j Z $ $ X K x k x v v y.u G g > * # 4 y *X;X0X8X-X-XdX,.,.,.O.L aXaX} X.} X.{ ;.$.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.t.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] B.( j.M.c.c.c.c.c.c.x.c.x.x.x.x.l.",
+"oXoXoXoXoXoX{.oX{.oXOXoX}.+X}.`.[ ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.*.%.V X s y V rXvX9Xc p.x s rXp.7.8.3.3.7.8.lXf } { y > Y Z o B U b X { } { o.wXJ UXU o # $ $ O U B N I i.I i.F D H b : o b X j D n : X X N H H F H K H M F x k N >XF : V M 9XtXyX-.&.&.=.fXY x 2X2XM X y =X-XdXdXdX=.$.;.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ] | ( k.M.c.c.b.c.m.c.c.x.x.x.l.x.x.",
+"oXoXoXOXoXoXoX{.{.oXoXOX}.OX{.`.' W w w.w.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.@.*.V j g.=X# 1X2X2Xu D K V i.6.3.3.3.4.y.d.6Xs $ $ b m d.s.X B Y N y t 2 + J 3XM # : : J P P I c I I I G I U F D N X M m F y u n > 2.Z X N M g g g b B B N H M G nX5XB S g 9XuX=.&.=.6XH y . j > m o Y B *X=XmXnXqXuX-.$.:.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.t.w.w.w.w.0.A ' ] | ( k.M.c.c.c.c.c.c.x.x.x.x.l.x.x.",
+"oXoX}.@XoXoXoX{.oXoX}.oX}.}.|.`.' E w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.e.@.%.V k p.;X> , > , , F N >Xr.6.3.3.6.e.>Xd b g : , m : > > b b # X g J I I I Z I I I I 3XwXjX5.7.7.4.8.4.8.w.I :X<XF.BX4 H x I u > 2.I g M c =Xx =Xh n g y 4 B G 3X>X  < x vXgX&.&.sXwX:X{ = g 5 Y < Y B y . x :XeXnXuXgX$.;.;.;.;.;.;.;.;.;.>.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9.A ] ] ..) k.M.c.c.c.c.c.c.x.x.x.x.x.x.x.",
+"oXOXOXOXOXoXoXoXoX@XoXoXOXOXoX`.[ ` w w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.*.*.V X u y ; ; ; , ; I G y.6.6.7.e.s.jXJ z c z ; ; . g F G X X X b J i.8.4.5.4.7.7.8.8.e.lXjX7.3.3.3.3.6.3.7.k ,X,XBXNXo N j c u g   . y d a.k c c u s y.hXp 4 s y g P N z 5XtX>.&.sX5XY 1XV X d.d., h j a B S X ;X,X3X1X=.&.>.>.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9.| { ] | ( k.M.m.x.x.m.c.c.c.x.c.c.x.x.l.",
+"oXoXOX@XoXoX@XoXoX@XOXoX{.OX|.`.' ' w q.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.%.L =XU U ;X>XV s u : J u.8.i.k c D X d p k k - X G F 5XJ : 4 B # d.7.7.6.6.6.p.u.6.6.y.;X*Xa.6.3.3.3.3.3.7.I :X:Xy , o 4 } pXi G x c b F ;XD G K M M a.kXD X y.i.*X2X4 Y b =X-.&.gX6XP ;Xz n o x j yXxX=XU U u D F V y H sX*.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q...] ] | ( j.M.x.x.x.x.c.x.x.x.x.x.x.x.x.",
+"oXoX}.}.OXOX@XoXoX@X}.oX}.OX{.(.' ` w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.&.gXwXBXzX8XqXV j p.=X5XxXlX:Xc z s j u.<X; I a X U F ,XP 4 U Z X 3XkXkXkXkXkXyXtXkXp.<Xx =Xc 7.6.3.3.3.3.6.y.:X4Xv c u # } o.: K x c u n # # n >XG U l K z s u.kX:X<Xg NXV n dXdX>.,.dXvXvXP B ,X<X3X2X,XX X y I <Xg Y B *XaX$.:.:.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.9.| ` E ..( z.l.x.x.x.m.c.c.x.x.x.x.x.x.l.",
+"{.oX{.oXoXoX}.}.{.}.OXoXoX{.}.`.' ] w w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.&.sX3XNX1XcXwXM k p.<X4XiXiX*Xy.x s j g.<Xk BXZ o o o H G o -   4 >XuXyXyXyXyXrXvXiXnX2Xv c x 7.7.7.7.6.6.7.c :X4XD z N # = $ X F x c u : 2.Z i 5XH o y M ;X4 i h u ,Xn X y i ,X5Xo.} o.2X,X,Xm 4 y X m J >XP N V m 4 Y G X 2XgX&.;.;.;.;.;.;.N.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9.| ` ] | ( z.c.c.c.x.m.x.x.x.x.x.x.x.x.x.",
+"{.OXOX}.oXoX}.}.}.OXOX{.oX}.oX`.[ ' w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.&.aX5XZ G 4X8XN X h g ;X3X1XH K D n o p i   Z - 4 P P J P B J J >XB ,XtXtXvXeXvX6X,X3X>Xl K H i.s.y.i.i.s.i.K H P B s y x P H G K j i.u > 2.I . k 2.  k 2.  G P H P n : 4 b P P { ] U P J P J b h 6Xh M eXtX:Xn g J J D M z 4XaX$.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.q.| ' ' | ) j.M.c.c.m.x.c.x.x.c.x.x.x.x.x.",
+"{.OXOXOXoXoXoXoXOX{.OX}.}.oX}.(.[ ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.&.aX8X-Xp -X*XN J F P J J J P P P N j u.=Xb G P J 4XtXtXcXP H *X<XF >X2X2X3X,X3XG N J P J I P G J J F J J J F M G x =Xi 1XcXlX6XG F G D :   >   s.i.- y.s.> N :X=X:Xb L B y 0XgX&.-.uXvX0XvXrXb >XUX;Xn 9X4XG B : wXsX>.*.*.>.:.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.q.| ] ] N.( k.M.c.c.c.c.c.c.x.x.x.x.x.x.x.",
+"oXoXOXOXoXoXoXoX{.OXOX{.oXoX}.`.' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.$.X.nX9XG S X b 9X5XcXnXtXtXtXbXcXF j p.<Xg 4XvXvXvXtXtXtXJ n U # X G J J J J G G 3XvXiXlX5.t.P I t.8.8.7.t.c ;X9Xv i.u G ;Xz D 4 y n I j B P M   g     n o : *XNX: 4 U U l =.&.-.rXbXeXeXtX9XV l >Xl N tX9XU U D 5XsX&.:.:.$.>.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.o.' ' | ( j.M.c.c.m.c.c.c.x.x.x.c.x.x.x.",
+"oXoXoXoXoXoXoXOXoXoX}.}.oXoXoX(.' ^ w w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.t.+.,.X.cX9XU U M n 4X*X<X;XeXtXtXvX5XN X h j g ,X3X,X3XrXtXvXJ B Y N X 3XvXeXbXeXvXvXtXeXyXkX6.7.I J i.y.y.p.p.;X;X2Xu p N 4 $ y . { pX&X6XJ I r.p.P G I P G J s p H l F u D r *.dXuXvXvXvXbXeX,XG -XvXrXB 3X,X# X y 0XaX$.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9.| ' ] | ( k.M.c.c.x.x.x.c.c.c.x.x.x.c.x.",
+"].oX{.OXoXoXOXoXOXoX{.}.{.oXOX).` ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.+.$.gXtX2Xb X X M 4Xa.j a >X3X6X3X<XN G G P j G J J m >X3X3XF X X X 4 3XvXeXeXeXeXeXtXuXlX3.3.8.I D z =X*X5X4X=X=Xx F.BXm X D L o 1.o.D 0XtXe.3.3.5.5.5.5.5.i.V z ;X*XrXcXgX&.sXmX9X:X,X2XvX4XN b z 2XrXN # : x B g :XdX,.,.&.&.&.&.;.;.;.;.;.;.N.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9.| ` ' | ( j.M.c.c.c.c.x.m.x.x.x.m.x.x.x.",
+"].oX{.{.{.oXoXoXoX.X{.{..XoX}.(.[ ] w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.,.aX0XB : b : V 5Xd.BXj M G b 4 4 m rXnXnXJ 2XvXyX,XG J P j F G J B 3XvXeXeXeXeXeXtXtXeXu.3.7.I K k k :XiXvX:X;X,XBXzXX D l M $ f f K vXtXp.6.6.3.6.3.6.7.y.J f.p.yXeXvXfX>.uXvX2XB B X 5X4Xn B B X 5Xn U B *Xh U N =XdXdXdXdXdX-.&.%.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9.| ' E | ( k.M.c.c.M.c.m.x.x.x.x.x.x.x.x.",
+"{.oX{.oXoXoXoXoXOXoX].{.oX.X].).[ ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.@.>.6X0XM B S X y <X< Z - H =XN S g : :X2X:XB 3XeXbXtXeXeXvXJ ;X*XwX>X,XeXtXeXeXeXeXyXbXiXjX6.6.i.>X:X:X5XtXtX:X:X2XG M x nXeXvX0X0X0XyXeXeXyXjXp.6.3.3.3.6.y.J 8.7.jXiXvXrXdXcXvX5XU U h 5X5Xn U U M -Xn zXC X o NXU X *X<X<X0XvXuX-.&.;.;.;.;.N.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.q.| ` ] | j.j.M.c.c.c.c.x.x.x.x.x.x.x.x.x.",
+"].].oX].XXoX{..X{..X}.{.oX.X.X(.[ ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.gXtX3XM S U h V C o.C J J n U U M X V U : : 6XeXvXeXeXtXvXJ m U x x ,XtXeXeXeXeXeXuXiXjX5.3.3.3.8.kXiXtXeXyX>X;XyX9XuXtXeXeXeX0XeXeXeXeXeXtXiXtX5.3.3.3.6.u.L i.y.<X2X3X3X3X6XvX,X# X y 3X,Xn X o y ,XN X X i 4 X i o ; x a >XbXvXuX-.%.;.;.>.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.e.o.` ` | j.k.k.c.c.c.c.x.m.x.x.x.x.x.x.x.",
+"].{.{.].oXOX{..X{.{.].{.oX.X.X(.[ ` w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.aX0XN X o l d O.$.$.-.yXeXN X X X X B U h X 6XeX6XbX4X3X6XF S Y : # >XeXvXeXtXtXyXtXjX5.3.3.3.7.u.tXtXeXeXvX:XH vXeXeXeXeXeXeXeXeXeXeXeXeXeXeXyXp.6.6.6.7.y.L P L G G G J G B <XN H U I x G J G J F I j m J F J P N D d.BXk 5 9XvXcXaX&.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` E  .~ j.c.c.c.c.c.x.x.m.x.c.x.c.x.x.",
+"].].{.{.oX.X{.].].].'.].]._..X(.' ` w q.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.aXxXM U N *X-.&.$.;.:.-.aXP C C G S f M l m 4XvXJ ;XF 4 N N X y l D B ,XtXbXbXyXjXe.3.6.3.3.6.u.yXuXtXeXeXvX;X;XtXeXeXeXeXeXeXeXeXeXeXeXeXtXeXuXyXkXu.3.7.y.J g.e.5.t.kXyX4XJ G ;XlXNXlX8XeXgXtXeX*X2Xn N 2Xx ,X:XG ,X< U < n =XvXfX,.>.;.;.;.N.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9.A ` ' | j.k.c.c.b.c.b.m.x.x.x.x.c.x.x.x.",
+"].].{.{.{.].].{.].].'.]..X#X].(.' ` w w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.@.=.xXg Y U X O.,.;.;.;.$.$.-.>.;.-.;.$.gXtXG 3XvXG > Y m :X1XB =X0XvXJ 3XlX5.8.5.4.3.3.3.3.6.u.yXeXeXeXeXeXvX>X;XtXeXeXeXeXeXeXeXeXeXeXeXeXeXeXyXeXyXyX4.7.u.L 5.3.6.7.p.yXeXtXbXqXzXNX1XwXsX&.sX5XB B X b n 2.j a 4 4 y X V B -XfX&.&.;.;.;.;.N.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A [ E | j.k.c.c.c.c.b.x.x.x.x.x.c.c.x.x.",
+"].].].].].].].].].].'.]..X_._.Y.[ ' w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.,.sXP M l d O.>.;.;.;.;.;.$.;.;.$.;.;.$.*.C 5XvXG Z d.s.*X0XJ x :X2XG 5XxXp.p.r.6.3.3.3.7.u.yXtXeXeXeXeXeXvX;X;XvXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXtXtXkXp.,XG e.6.3.6.u.iXtXeXtXqX<XS J wXgX$.,.fXU U y n m d.BXN : B S X b n x bXdX=.$.;.;.;.B.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.0.A ` ` / j.k.c.c.b.c.c.m.x.m.x.x.x.x.c.x.",
+"].].].].]..X].].]._..X]._.]._.(.' ] w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.$.=.0X9X0XaX$.;.;.;.:.$.,.:.;.;.;.;.$.&.$.C o.nXJ   >   x xXF m S b X -XNXNX8XlX7.3.4.3.u.iXtXeXtXeXeXeXeXvX>X;XeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXtXbXeXeXvXiX3XG i.4.3.3.3.p.yXuXtXvX8X*X<X8XuX>.$.<.V h u n n - Z - b U U b X G B =XwXsX$.;.;.;.N.w.w.w.w.w.t.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ` | ~ j.k.c.m.c.c.c.c.c.c.x.x.x.x.x.",
+".X.X.X_._.].]._.]._._.`..X#X].(.W ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.$.aX0XtX0XsX$.;.;.:.*.sXfX-.$.;.;.>.sXdX-.C #.gXU n B g :XnXH B Y N X <XNXNX2XhX5.6.6.7.lXyXbXeXeXeXeXeXeXvX:X;XbXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXvX3XV L e.6.3.3.3.e.kXyXeXqX4XBXlX8X6X:.&.$.sXqXJ G G H F V 4 M l j o.U X 5XsX$.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ] ' | j.k.c.b.c.c.c.c.c.c.c.m.x.c.x.m.",
+"]..X].]._.]._.]._..X'.'._._.].(.[ ' w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.$.gX0XtX0XaX$.;.;.$.=.0XqXuX*.:.,.-.4X5X2XV } &.C B Y n :XvXP X X X h jXU L ,XhX7.u.p.p.tXeXeXeXeXeXeXeXeXvX>X;XvXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXvX3XV P e.6.3.3.3.7.u.iXuXqXzXNX1XwXqXdXsX*.&.sXqXvXeX5Xx g N 4XeXI M h p 4XsX$.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A E ' / j.k.c.c.b.c.c.c.c.c.c.c.x.x.c.x.",
+"_..X_._..X_.].].].'.'._._.]._.Y.[ ] w 5.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.$.aX0X0X0XaX$.;.;.:.:.aXeX0XuXO.} X.*XH l y =.&.C h n l 5XvXP N G B 3XqX-X*X8XMXu.tXyXyXeXeXeXeXeXeXeXeXeXvX:X;XvXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXvX3XG tXkXu.3.6.3.3.3.p.yXqX3XY U wXqX0XqXgX&.:.sXcX4XX # b n rXtXtX9XeX9XdX$.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ' E B.j.j.k.c.b.c.c.x.x.x.x.c.x.c.x.m.",
+"_..X_._..X_.`._._.].'.!.'._._.Y.[ ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.$.aX0XeX0XsX&.%.:.;.;.$.aXeX0Xl c x p y.c s 6XsXL ,X<X5X6X4XG 2XtX9XeX0XvXvXvX9XyXeXeXeXeXeXeXeXeXeXeXeXeXtX:X;XvXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXrXvX3XG tXyXyXkX7.7.3.3.6.kXmX-X*X=X8X0XrXvXdX*.$.$.sXwXB Y m b 9XtXeXtXcXdX$.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.q.9.A ' E | ! j.c.c.c.c.c.c.x.c.x.c.c.c.c.x.",
+"_._.]._._._._._._._.'.#XQ.'._.Y.' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.$.gX0XtX0XaX$.;.:.;.;.>.$.sXnX*Xy.x l z l b ,X0XG b n n B G B 3XvXtXeXeXeXeXeX9X9XeXeXeXeXeXeXeXeXeXeXeXeXtX>X;XvXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXbXvX3XG tXeXrXyXkXu.3.7.7.u.iXtX0XvXcXyXeXeXqXdX>.&.$.sXj < o K rXeXeXeX0XaX&.;.;.;.;.;.N.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ] ] / j.k.c.c.b.c.c.x.c.x.c.x.x.c.c.m.",
+".X_._._..X_._.!._._._._._.!.'.Y.` ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.$.aXcXeXcXsX&.;.;.;.;.;.;.$.aX-X;X*XD B G G G B B > U m *XvXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXvX:XJ vXbXeXeXeXeXeXeXeXeXeXtXeXeXeXeXeXeXeXvXrX,XG eXeXeXeXyXyXkXp.u.lXyXeXeXeXeXeXeXeXeXcXdXsX*.&.fX9XfX-.sX0XeXeX0X6X>.,.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.q.q.A ] ] | ( j.c.c.c.c.c.c.c.c.c.x.c.m.c.x.",
+"_._.]._._._.)._.!.)._.!.Q._._.T.[ ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.@.;.$.sX0X0XaX&.;.;.;.;.;.;.;.$.aXyXiX5XG x 5X5XF 5XY d.s.;XvXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXvX;X;XvXtXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXvX6XN G 0XeXeXeXbXuXvXyXyXbXeXeXeXeXeXeXeXeXeXeX0XmXaX&.$.=.>.&.=.cX0XeXrXqXsX,.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.0.A ] E | ( k.c.c.c.c.x.x.x.c.x.m.x.c.c.x.",
+"_._._._._.).).!.~.).!._.Q._.!.T.[ ` w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.>.&.=.0X0XdX,.$.;.;.;.;.;.;.;.$.-.sX5XF X X b 4 <Xj k > 2XvXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXvXyXeXvXvXeXvXvX:X;XeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXtX3XP tXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXtX0XdX;.:.$.:.;.*.-.sX0XeXqXaX$.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.0.A ' ] N.j.x.c.c.c.c.x.x.x.c.x.x.c.c.x.x.",
+"_._._._.).~.Q.Y.~.!.!.!.Q.!.!.L.[ ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.;.$.aX0XtXcX6X*.$.;.;.;.;.;.;.:.&.,.>XN m Y S : 6XyX9X9X0XeXvXeXvXvXeXvXvXbXeXvXeXbXvXtXvXrX4X4X4X6X4X4X6XxXH ;XvXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXtXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXtXeXeXeXeX0XqXdX;.&.;.;.:.:.$.sX0XdX;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.A ` ' ~ z.x.x.m.c.c.x.x.m.x.c.c.x.c.c.m.",
+"_._._.).!.~.Q.~.~.Q.!.!.Q.!.~.T.' ` w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.+.;.$.=.tXeXeXqXsX&.;.;.;.;.;.;.;.;.,._ V . <   y 3XrX9XrX4X4X4XrX6X4X4X4X6X6X4X4X6XrX4X4X4XP m g N F n n n N M H vXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXbXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXtX0XdXsX*.;.:.;.;.$.=.:.:.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.0.A ` ` / j.x.x.c.m.c.c.x.m.c.x.x.m.x.x.x.",
+"_._._._.~.Y.Y.Y.~.~.!.!.!.~.~.T.' ` w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.;.$.aX0XeXeX0XsX$.;.;.;.;.;.;.;.;.&.{ C N V m j m n d s B V s b n n n N G G G N b n m S C B y U x =X4 S n K <XH vXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXtXeXeXeXeXeXeX9XyX0XqXaX$.;.;.;.;.:.:.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.0.A ` ] / j.x.x.c.x.c.c.c.x.c.c.c.x.c.c.x.",
+"_._.!.).T.Y.Y.Y.Y.Y.W.!.Q.R.E.Y.W ` w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.>.$.gX0XtXtXcXsX&.;.>.;.;.;.;.;.;.,._ %.dXF b M n y y.*X:Xc 8X;X  U , x nXeXeXJ B n $ NXlX{ N NX4 : V Y B u ;X6XvXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXtXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeX0XdX*.:.;.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] | ~ j.k.c.m.x.c.c.c.x.c.m.x.c.x.x.",
+"!.).~.Y.Y.Y.Y.I.~.R.W.W.R.E.R.T.[ ] w w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.;.;.$.fXvXrX0XdXaX;.;.;.;.;.;.;.;.,.{ @.,.K z l s c g.jX:X5XMX9Xg d.d.;XvXvXtX>XY B * F.zXT : X i y M M M i ;XvXtXeXeXtXeXeXeXeXeXeXeXeXeXeXeXeXeXeXtXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeX0XdX;.&.;.;.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.A ` ] | j.k.c.m.m.x.c.c.c.c.x.x.x.x.x.x.",
+"!.).~.Y.Y.Y.Y.Y.T.T.R.R.E.R.R.R.[ ] w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.;.;.$.=.0XeXeX0XqXdX>.$.;.;.;.;.;.$._ <.>.>Xy.c s y c l :Xz =XK   , 5 ;XrX4XrXF b g $ R R 2 g B l =XH 5X=Xx ;XiXvXrXeXeXeXeXeXeXeXtXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXqXdXsX*.:.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.| { ] | j.k.c.m.x.x.x.x.x.x.c.c.c.c.c.x.",
+"~.~.~.~.T.Y.I.T.I.T.T.R.R.T.T.T.[ ` w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.>.;.$.gXcXeXeXtXtXcX6X;.$.;.;.;.;.:.{ <.dX:Xz p n 4 X X n s # X g X 4 4 n n M b b m G > j j B NXg : n G N o P u.lXyXtXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXtXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeX0XqXaX&.;.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q...] ] / j.j.c.x.x.m.m.x.m.x.x.x.x.c.x.m.",
+"!.~.Y.R.T.Y.T.I.I.I.T.T.T.T.T.T.' ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.;.>.$.gX0XeXtXtXeXeXcXdX>.%.;.>.>.,.} -.tXP B J F g i.z . i.*X. o # . lX=X  U m o ,XcXH B x =XM p y V Y B o I 6.5.f.lXuXeXeXeXeXeXtXeXeXeXeXrXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXtXeXeXeXeXeXeX0XdX*.$.;.;.;.;.;.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.0...' ] | j.k.c.c.c.c.c.x.c.c.x.x.m.c.c.x.",
+"!.~.R.R.T.I.T.T.T.T.T.T.I.T.T.E.' ] w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.;.:.$.gX0XeXrX4XrXrXbXvX6X>.&.O.O.O.T fX5XG 2XrX9Xc f.jXj g.jXs Y Y i MXvXj d.d.> ;X5X>XNXX x r.r.I g V u i :Xf.3.6.jXiXyXyXyXyXyXyXyXyXyXyXtXyXtXrXeXeXeXeXeXeXeXeXeXeXeXeXtXeXeXeXeXtXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXcXdX*.;.;.;.;.;.;.;.N.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9.| ] ] / ~ k.c.c.c.x.c.c.x.x.x.x.x.x.c.x.",
+"~.~.R.T.T.J.T.T.T.I.I.I.I.I.R.R.' ] w q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.:.%.&.gXcXrXN n n B 4XxXcX6XaX4 X # i c z 4 6XyXtXl c z . x D O >   . -Xz . , > X >XeXH 4 i l u.r.I V 4 X M z <X7.3.5.r.f.f.r.r.r.f.r.r.f.r.f.f.lXyXeXeXeXeXeXeXeXeXtXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXrXqXsX$.:.;.;.;.;.:.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.q.| ] ' | j.j.k.c.c.x.c.x.c.x.x.x.c.c.c.m.",
+"~.R.E.T.T.T.T.J.I.{.|.SXVX|.].I.[ ] w w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.;.>.$.=.cX9XM B X : 2X5X5X5X-XB Y B < f.jXy 6XtXtXJ n M M V D M V D B d V D d V G G L G V f K 7XL J B 4 B B o I 8.3.3.6.6.3.3.3.3.3.3.3.3.6.6.7.p.yXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXtXbXeXeXeXeXeXeXeXeXeXeXvXcXaX$.;.;.;.;.;.%.N.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.w.w.w.9...] ] B.V./.).[.Q.^.x.x.m.x.x.x.x.c.c.m.",
+"~.~.T.T.I.I.I.I.[.|.AXFXFXDXVX(.[ ` w q.w.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.+.>.%.>.dXcX9XY Y g g 4XrXrXrX9XX < - . =Xx 4 3XtXeXeXrXrXeXjXr.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.>Xm Y G o c 8.3.6.3.3.4.3.4.3.6.7.6.6.6.6.7.p.iXeXeXeXeXbXeXeXeXeXeXeXeXeXvXrXeXeXeXeXeXeXeXeXeXrXeXeXeXeXeXeXeXeXxXvXeX0XdX;.;.>.;.:.;.;.N.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9...` ] N.D.|.|.CX|.[.Q.x.c.x.x.m.x.c.c.m.",
+"R.T.T.J.I.I.T.I.AXAX3 6 2 9 AX|.| ' w r.w.w.5.w.w.w.w.w.w.w.q.w.w.w.q.w.w.w.w.w.w.w.w.w.#.+.+.fXxXxX4Xm : g g Z N Z Z N j m m m m : m 3XxXxXxXxXxX9XlXf.r.r.r.r.r.f.r.r.r.r.r.r.r.r.r.r.r.r.f.I 4 g g i I g.r.f.r.f.f.r.r.r.f.r.r.u.u.r.r.lXbXxXxXxXxXxXxXxXxXxXxXbXxXxXlXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX-.@.+.+.+.+.+.B.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.9.| ` ] N.VX6 & 2 2 VX'.x.c.x.x.x.x.x.m.x.",
+"R.R.T.T.J.J.J.J.SXFX7 & 2 8 GXVX .' E h.0.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.e.w.w.w.w.w.w.w.9.e.w.w.w.w.w.w.w.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.w.w.w.w.w.w.w.w.w.r.| ` E F.VX8 6 7 2 FX[.c.x.c.x.x.x.m.x.m.",
+"R.T.T.T.J.T.J.J.DXHX6 & 7 8 HXDXG.' ] h.9.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.w.w.q.s.` ` W F.LX8 & 7 7 HX|.c.c.c.m.x.c.x.x.m.",
+"T.T.I.I.I.H.I.I.AXJX& 6 7 7 JXSXJ./ [ | h.q.w.w.w.w.w.w.w.w.w.5.w.w.w.w.q.w.q.w.w.w.w.q.w.w.w.q.w.w.w.q.w.q.w.w.q.q.w.w.q.w.w.q.w.q.w.w.q.w.w.w.w.q.w.w.w.w.q.w.w.q.w.w.w.w.q.w.w.w.q.w.w.w.w.q.w.w.q.w.q.w.w.q.w.w.w.w.q.w.w.q.w.q.w.w.q.w.w.w.w.q.w.w.w.q.w.w.q.w.w.w.w.w.q.w.w.w.w.q.w.w.q.w.w.w.q.w.w.w.w.q.w.w.w.q.q.w.w.q.w.w.w.q.w.w.w.q.q.w.w.q.w.w.w.q.w.w.w.w.w.w.w.w.w.w.9.h.| ] ] W  XLX7 7 & 7 HX}.b.b.b.b.c.c.c.c.c.",
+"T.T.I.I.U.U.H.J.DXJX7 9 2 & JXDXK. .[ [ A u.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.5.w.w.w.w.w.w.r.s.W ] ] ^ F.LX7 7 7 7 JXVXv.v.v.b.b.b.b.b.b.",
+"E.I.T.I.J.G.H.J.DXJX7 7 6 7 JXFXJ.G. .[ W A r.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.w.w.w.w.w.w.w.w.w.w.q.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.r.A ] ] ' e ^ F.LX6 1 6 & JX|.n.n.n.n.v.v.b.b.b.",
+"T.T.I.I.J.J.J.H.DXJX1 6 2 % JXAXH.J.G.) [ [ A h.9.w.w.w.w.w.w.e.w.w.w.w.w.w.w.w.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.e.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.q.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.h.s.^ ' ' e q / VXLX6 3 1 & HXAXH.H.n.H.n.v.v.v.b.",
+"T.I.I.I.I.H.J.H.DXJX6 % 6 1 JXDXH.I.I.P.| { ` | s.r.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.0.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.0.9.9.9.9.9.9.9.9.9.9.9.0.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.r.s...] ] ' C 9 / k.VXUX2 3 1 7 JXVXH.n.H.H.v.H.v.v.v.",
+"I.R.I.I.I.H.J.H.DXJX& 6 8 7 JXAXH.J.I.~. .| [ { { [ ` ` ` ` { 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 q ^ V.S.VXLX7 1 7 2 JXAXH.U.H.H.H.H.n.v.v.",
+"E.I.I.I.J.H.H.J.DXJX7 1 % 9 JXFXH.J.J.K.G.C.| ^ ^ W { [ ` ` ` ` ` ` [ { ` ` ` ` { ' ` ` ` ` ] ` ` [ ` ` ` ` ` ` ` ` [ ` ` ` ] ` ` ` { [ ` ' ] ` ' ` ` [ ` ' ' [ ` ` ` [ ` ' ` ' ` ` ] ` ` ` ] ` ` ` ` [ ` [ ` [ ` ` ` ` ] ` ' ] ` ` ] ` ` ` ` ` ` ` ` ` ] ` ] ] ` ` ] ] ` ` ` ` ` ] ` ] ` ` ] ] ` ` ` ] ` ] ] ] ] ] ` ` ` ` ` [ ` ] [ { ` ` ` ` ` ` ' { ` ` ] ` ] ] ` ` ` ` ` ] ] ] q e q V.k.A.AXJX7 + 1 7 JXSXU.H.H.H.H.H.v.H.v.",
+"I.T.I.I.H.H.H.H.DXJX& & 8 % PXLXH.n.K.H.J.J.G.Z. ./ ^ ' E E E C ] e E E E ` E E E W C E E E E W 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 E E E E E E E E E E W 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 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 C W E E E E W E E E E E E E E E ] w E ' E e E E e r r r q ~ V.C.G.I.FXPX7 8 & % JXVXH.U.H.H.H.H.H.v.v.",
+"I.T.I.I.H.H.H.H.DXJX% 2 6 7 PXIXLXFXAXDXAXSXAXVXVXD.D.B./ ^ ^ e q q q e e q q q q q q q e q q 0 q e q q q q 0 0 0 0 0 0 0 0 0 0 0 0 0 0 q 0 q 0 q q q q q q 0 q 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Q 0 0 0 q 0 0 0 0 0 0 Q 0 0 Q 0 0 0 0 0 0 3 Q 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 q 0 0 0 0 0 0 0 0 0 0 0 q q q q 0 0 0 0 | F.F.F.F.F.BXF.VXVXVXLXPXPX7 2 7 & JXVXI.H.I.H.I.H.H.H.n.",
+"E.I.I.J.H.H.H.v.DXJX8 6 2 7 PXPXPXJXJXJXJXJXJXLXLXLXVXF.N.U.k.k.k. .) V./ ) V.~ N.~ ~ N.~ / N.~ V.~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ! ! ! ! ! ! ! ~ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ~ ! ! ~ ~ ! ! ! ! ! ! ! ! ! ~ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ) k.C.S.C.F.F.D.BXAXLXLXLXLXLXJXIXIXPXPX7 7 6 & JXDXJ.H.U.H.U.H.U.H.n.",
+"I.T.I.J.H.H.H.H.SXJX1 1 7 6 7 7 & 7 2 & 7 7 7 6 7 2 7  X XI.G.G.G.C.k.C.C.C.C.C.C.V.C.C.C.C.S.C.k.C.C.S.S.S.C.S.Z.C.C.C.C.C.C.C.C.C.C.V.C.C.C.S.C.V.C.k.k.V.C.k.k.V.C.C.k.V.k.C.C.k.k.V.C.V.C.V.C.C.C.S.C.S.C.S.S.S.A.S.A.Z.C.A.Z.Z.Z.Z.C.A.A.Z.A.A.A.A.S.A.A.A.S.A.A.A.A.A.A.A.Z.A.A.A.A.A.A.S.Z.Z.A.Z.C.Z.S.A.C.A.A.S.S.Z.Z.A.A.C.Z.C.A.Z.C.A.Z.A.A.A.A.A.A.L.L.Y.(.D.VX7 & 6 7 8 8 9 6 6 7 7 & 7 6 6 + 9 HXDXJ.J.J.I.H.U.K.n.I.",
+"T.I.I.J.H.H.H.v.SXLX8 & 6 6 7 r 9 2 2 6 7 2 7 2 7 7 2 AX|.I.H.G.G.J.G.Y.G.G.G.L.G.G.G.G.G.G.L.G.A.L.G.L.G.Y.L.L.L.L.T.L.L.L.G.G.G.G.G.G.G.G.G.G.H.A.G.v.A.A.G.C.C.b.G.G.G.G.A.G.C.G.A.G.G.G.G.G.G.G.L.G.G.Y.Y.L.L.Y.L.Y.Y.Y.(.L.(.Y.(.(.~.Y.(.(.Y.Y.Y.Y.(.Y.(.Y.(.Y.(.(.(.(.(.(.(.(.Y.(.Y.Y.Y.Y.L.Y.Y.L.Y.Y.Y.Y.Y.Y.L.Y.Y.Y.L.L.L.Y.Y.Y.L.Y.Y.L.Y.Y.Y.Y.Y.Y.).(.).).`.VXAX7 9 % 7 2 2 6 1 7 2 7 7 7 1 6 7 % LXSXJ.J.J.J.J.J.I.n.U.",
+"T.I.I.I.n.U.H.H.VXFX8 6 2 2 7 6 1 6 % 8 % + 9 6 & & 7 AX|.I.I.J.U.I.I.I.Y.T.T.I.E.I.T.I.Y.Y.I.Y.I.T.Y.T.T.Y.T.T.Y.R.Y.T.E.T.I.Y.G.I.I.I.Y.I.T.I.I.U.Y.U.I.I.Y.J.I.Y.J.G.I.I.I.G.I.I.I.J.J.G.I.T.I.T.Y.T.Q.R.~.~.Y.).Q.Q.)._.).).).).).).Q.`.).`.'.`.`.`.`.`.`.`.[.`.`.`.`.[.`.`.`.`.`.).`.).).`.).Q.).).).).).Q.Q.).Q.).).Q.Q.).Q.Q.).).(.Q.).).).Q.Q.).Q.).Q.).).[.[.VXFX6 6 6 2 7 7 & 6 7 2 2 6 6 8 1 6 3 LX|.I.I.J.I.I.I.K.K.H.",
+"T.G.I.I.H.H.H.H.[.ZX1 2 7 7 6 6 6 6 6 & & 7 7 7 & 2 2 ZXoXJ.I.U.E.I.T.T.R.E.W.~.Q.Q.W.W.W.W.W.~.^.^.E.T.W.R.Q.!.!.!.!.W.E.E.E.I.R.T.Y.E.I.T.T.R.^.^.^.^.E.I.I.E.E.I.T.T.I.E.I.T.I.^.T.R.I.E.I.T.W.W.E.E.!.!.!._.!._._._._._._.].]._._.].].].].].{.].].[.].].].].[.[.}.}.{.{.{.].[.].].'.[.].]._.]._._._.'._._..X'.'._.).'._._._._._._._._._._._.'.)._.'.)._._.'.[.[.[.|.DX2 6 6 & 7 7 7 6 7 7 7 2 6 8 & 7 1 DX|.I.I.I.I.I.I.I.K.I.",
+"I.I.I.U.U.H.H.v._.SXVXHXHXJXJXJXJXJXJXJXJXJXJXJXJXGXDXCX].I.I.T.I.T.T.T.R.R.R.W.!.Q.!.W.W.R.R.R.E.R.E.E.R.~.R.!.W.!.!.R.~.E.E.T.T.T.T.T.E.T.R.E.T.E.I.Y.E.T.I.T.I.T.T.T.E.T.T.T.^.T.T.U.E.I.E.R.R.R.Q.!.!.!.!._.'._._.'._.].]._.].]._..X].].].].].].{.].].{.].].].].].].].{.{.].[.].].].'.]._.].]._._.'._.'._._.'._._.].'._.'.'._._._._._.]._._.)._._._.'._.].`.].].[.|.DXFXKXJXJXJXPXJXJXJXJXJXJXJXJXHXHXVX|.].I.I.I.T.I.I.I.I.I.",
+"I.I.H.H.I.n.H.H.H.).OX+XSXDXAXDXFXDXDXDXFXDXDXSXVXVXCX`.U.I.I.I.I.E.E.E.E.Q.Q.W.W.!.!.~.W.!.!.R.R.T.E.E.W.R.!.W.!.W.!.W.W.R.R.E.E.T.E.T.R.E.T.R.E.E.E.E.T.E.E.T.E.I.T.I.T.I.I.T.I.T.T.T.T.T.T.T.W.W.~.!.!._.!.!.!._._.'.#X_._.]._.].].].].].].].].].].].].].].].].].].].].].].].].].].`.].'.].).'.'.].'.].'.].'.].'.].'.'.'.'._.]._.`.'._._._._.'._.'.)._._._.'.].].].OX|.VXAXFXAXGXFXFXFXFXFXFXFXAXAXAXVX}.'.T.T.T.T.T.T.T.I.I.I.",
+"J.I.J.H.H.H.n.H.H.n.n.H.H.H.H.H.H.H.H.H.H.H.H.H.H.J.H.H.J.I.I.I.R.R.R.R.!.R.!.$X!.!.!.!.!.W.!.R.Q.E.W.!.W.W.!.R.E.!.!.R.W.!.R.R.R.R.R.E.W.R.R.E.R.R.R.R.T.T.E.E.W.T.T.T.T.T.T.T.R.I.R.R.R.R.R.R.W.~.!.!.!.!.!._._._._._.'.'._.].].].].]..X.X]..X].].].].].].].].[.].].].].].].].].].].].]._.].'.].].]._.'.].]._._..X].]._.]._.]._.`._.'._.'.'._._._._._._._._.].]..X].].oX].oX].{.{..X].]..X].'._._._._.!.!.!.R.W.R.R.T.T.I.I.I.I.",
+"I.J.J.J.I.H.U.H.H.n.H.n.H.H.H.H.H.H.H.H.H.H.H.H.H.H.J.I.I.I.I.T.I.R.R.R.~.!.~.~.!.!.!.!.!.!.W.W.R.!.!.E.Q.R.E.!.~.!.!.!.!.R.R.!.!.R.E.R.!.W.!.W.W.R.R.E.T.T.T.T.T.T.R.R.T.R.R.R.R.T.T.T.T.R.R.R.R.!.~.!.!.!._.!.Q.'._._._._._.].]._.]._.].].].].].].].].].oX{.].].].].].].].].].].].`.].].]._.].]._.'.].]._.'.].].].].'.'.].]._.]._.].'.]._.'.'._._.`._.]._.]._._.].].].].].].oX.X{.{.{.oX].].].]._._._._.!.!.!.!.!.R.R.T.T.T.I.T.",
+"I.J.J.J.J.H.H.n.H.n.H.n.H.n.H.H.H.H.H.H.H.H.H.H.n.J.J.I.I.I.T.T.R.R.~.!.!.R.~.!.!.!.!.!.!.~.!.!.!.W.!.W.W.!.!.E.W.!.!.!.!.W.~.W.W.R.W.!.W.R.~.R.~.R.R.T.T.E.T.T.T.T.T.T.R.T.R.R.R.T.T.E.E.R.R.!.!.!.!.Q.Q._.Q._.!.'._._.'._._._.'.]._.]..X].]._.].].].].].].].].[.].].].#X].].].].].].].].]._.'.]..X'.'._.].].]._..X].]..X].'..X].].].'.'.`.].).]._._._._._._.].].].].].].oX].oX{..XOX.X.X.X].]..X]._.]._._._.!.!.!.W.R.R.T.I.T.I.",
+"J.J.J.J.J.J.H.U.H.H.H.H.H.H.H.I.H.H.I.H.H.H.H.H.K.U.I.J.I.I.E.T.W.~.R.!.!.!.$X~.!._.!.!.!.!.!.!.W.!.!.W.W.Q.R.W.!.~.~.W.~.!.W.!.!.E.E.W.W.!.W.W.E.R.R.~.R.R.E.R.T.W.W.R.R.R.R.R.R.W.R.!.E.Q.!.!.!.!.!.!.!.!._.!.Q._._._._.]._.].].'.].]._.].].].].{.].].].].].].{.].].].].].].#X].].].]._.].]..X'.].].].].'.].'.].]._..X].]..X]..X]._.].].'._.'.]._.]._._.'.]._.'.].].].oX].oX].{.oX.X{.].[.[.].].].].].]._._._._.!.!.!.~.R.R.R.R.",
+"J.J.J.J.J.J.H.H.U.H.H.H.H.U.U.U.U.U.U.I.I.J.J.J.I.I.I.I.T.R.R.W.W.R.!.!.!.$X~._.~.!.!.!.Q.!.!.!.!.!.Q.!.Q.W.!.!.W.Q.~.!.!.!.!.R.W.E.W.E.!.R.W.W.E.R.R.R.R.R.R.E.W.W.R.R.T.R.R.I.E.R.R.W.!.!.!.!.!.!.!.!._._._.!.'.Q.'._._.'._._.].].].]..X].].].].].].].].].].].].]..X.X].].].].].].].`.].`.].].]..X]..X].'.].]..X].].].].].]..X].].'..X_.]._.].'._._.'._._.].].]._.].].oX].oXoX}.{.{..X{.].oX]..X].].].].].].'._._._.!.~.R.R.R.R.",
+"I.I.J.J.I.H.J.J.n.K.K.U.J.I.I.I.K.I.I.I.I.I.I.I.I.I.R.R.R.W.R.W.!.!.~.!._._._.$X_.!._.!.!.!.!.!.~.Q.~.~.!.~.!.!.~.W.!.R.$XR.!.R.W.Q.E.!.R.~.!.!.W.!.~.R.W.W.!.R.W.W.!.W.$XR.R.$XR.$X!.E.Q.~.$X!._._.!.#XE.Q.'.Q.'.$X_.]._.'.#X'._._.'.].#X{.#XoX{.oX].].[.].}.].].{.].[.].].`.].[.#X].].].#X.X].{..X_..X'.}.'.'.[..X_.].].{.{.].].].].].].].]._.'.].`.'..X_._._._.]._.].].].].]..XOX].{.oX]..X[.{.].].].]._.].'._._.!.Q.Q.!.E.R.R.",
+"J.I.U.H.U.U.J.J.K.U.I.I.I.I.I.I.I.I.I.I.T.I.E.T.T.R.R.R.R.W.!.!.!.!.!.!._.!.!.!._._._.~.!.!.!.~.A.@ 8 8 % 8 6 1 8 6 %  .E.R.~.!.T.~.!.Q.!.!.Q.!.E.Q.Q.E.R.R.R.E.Q.E.E.E.Y.Z./ T.Q.Q.W 1 1 ^ W._.Q..X_.!._._._.Q.'.'._.!.!.[.'._.`.'.'.[._.#X].].{.{.].].].{.].].OX]..X].[._.].{.]._. .1 8 @ {.{.].].]..X{.].}.].'..X]..X#X].{.].].].].].]._.].'.].'._.]._.'._..X].]..X].].].].oX.X{.{..X{..X.X].].]..X].].].'._._.!.!.!.W.R.!.E.R.",
+"U.J.I.U.U.U.G.J.I.I.I.I.I.I.I.R.I.T.I.R.E.T.T.E.R.W.R.W.!.!.!.!.!._.!._.!.!._._.~.!.$X_.!.!.!.~.C.3 1 6 7 1 2 6 2 6 7 ) E.W.E.R.Q.!.Q.T.!.!.W.!.Q.~.!.!.W.Q.E.W.Q.Q.E.C.Q 8 W Q.~.Y.W & 7 ^ !.!.!.!.!._._.].!.'.Q.Q.$X'._.!._._.#XXX].[.'..X.X].].].oX{.{.].}.XX]..XOX'.XXXX.X`.oX.X .& 7 9 [.}.].].].].].].{.{.#X#X.X#X]..X[.[.{.].].].].].].'.].'.].'.]._.]._.]._.].].].oXoX].].{.{.{.].{.].{.]..X].].]._.#X].'._._.!.!.!.W.R.R.",
+"U.G.I.I.U.U.I.I.I.I.I.I.I.T.R.I.E.R.R.E.!.E.!.!.!.!.!.!.!.'.!.!._.!._.!._._.!.'.!._.!.!.!.~.!.Q.G.1 % % % 9 & % % 8 @ ..R.R.$XR.~.E.W._.~.R.!.R.$X_.R.W.~.$X~._.R.!.(.^ @ % W W.Q.^.^ 1 1 Q _.$X!.Q.Q.!._.!.!.$X!._._.W.].Q.].'.!.$X].{.{.[.]..X.X}.{.{.].].OX'.}.[.[.{.{.].'..X.X]. .6 + 6  X]._.[.{.{.]..X.XQ.XX].[.{.|.[.'.].].].].].].].].].].]._._.]._..X_._.].]._.].].].].].{.{.{.].{..X].].].].]..X_._._._._.!.!.!.W.W.Q.Q.",
+"U.U.I.I.I.U.I.I.I.I.T.T.T.R.R.T.R.~.~.!.!.Q.!.!.!.!.!._.!.'.!.'.!._.!._._.!.$X!._.!.!._.!.!.Q.~.C.8 % 3 Q /.Q.T.Q.Q.(.~.$X$X~.I.C. .)  . .P._.!.$XG.G.Z.G.L. .) L.!.A.Q % % Q A.G.W.Q 6 8 W Q.C. . .L._.'.$X_.Q./. .V.C.).L.Z.P.~.#X(.Z.A.G.].{.].A.A.P.`.].oXoX`.Z.V.V...S.(.OX'..XV.6 1 7 }.]._.A.A.D.A.{.'.oX(.V. . .S.`.}.[.{.{.{.].].].].]..X].].].].]._.]._.].].].).].].].]..X{.]..X].].]._.].]._._.]..X_._.'.!.!.!.!.!.!.R.",
+"U.I.I.U.I.I.I.I.T.I.I.E.T.R.R.~.!.Q.!.!.!._._.!.!._._.'._._.'._._._._._.$X'.'.'.!._.~._.!.!.!.).C.& & 1 q  .) ) ) ) ) Q.W._. .9 & 6 6 6 1 3 / ).R. .1 6 Q q % 8  .^.1 7 7 7 1 + ^ Y.W 2 7 e W 1 & + 3  ._.!._. .8 6 @ 3 ^ Q 2 1  .]. .3 8 3 ].{.oX1 9 1 ..oX{.S.9 1 & 6 8 % 9 / }.oXV.% 7 1 OX/.9 8 @ 8 S.@X(. .8 & 7 7 + 1  .oX.X{.].]..X].].].].].].].'.'.].'.].].].`.].].].].].].{..X].].].].].'._.]..X]._._._.!.!._.!.!.!.!.Q.",
+"U.J.I.I.I.T.I.I.I.R.I.T.T.R.!.!.!.!.!.!.!._.!._._._.'.'._._._.]._.#X$X'.'.!._._._._._.!.!.!.!._.A.8 & % 7 1 1 3 7 8 1 Q.I.L.3 8 2 6 2 1 6 & 3 L.Q./ 6 7 7 2 @ 3 L.).3 1 2 6 6 8 Q Q.^ 2 6 & @ 6 8 6 % 1 (._.L.9 7 6 1 3 2 7 7 1  ._. .& % + }.{.].6 6 8  .CX/.3 % 8 1 2 8 6 7 1 D.oX .% 1 1  X9 * % 3 S.{.@X/ 1 & % 6 7 6 & 9  .].{.{.{.{.{..X.X].].].].].].].'._.].'.]._.].].'.].].].].].].].].'.].]._._._._._.'.'._._.!._._.!.!.",
+"I.U.I.I.I.I.T.I.R.R.T.T.R.W.!.!.!._._.!.'.!.!._._._._.#X_._._._._.'.].Q.'._._._._.Q._._.!.!.!.).C.1 6 + @ 1 6 & & % 8 ~.Q.C.^ 9 6 k.`.S.3 9 %  .[. .+ + 9 Q Z.C.!.!.C.Q 1 6 Q C.L.!.Q 3 & @  .Z.W 7 & 6 C.). .3 1 1 V. X/ @ 6 1 ..'. .7 7 6  X.X}.7 6 1 S.`.A.^ 9 % Z.|.D.3 1 1 ..XXV.1 7 8 q 2 6 7 S.}.[.L.1 6 6 V.{.|.^ 7 & 9 |.].{..X{.].{.].].].].].].]._.].]._.].].'.].].].].].].]._.]._.].]._.].]._.#X_._._._.!.'._._._.!._.",
+"J.I.I.I.I.I.I.I.T.I.T.R.R.E.!.!.!._.!.'.'.'.'.#X_.]._.].]._._.'._.'._.'.!.'._.Q.!._._._.!.!.!._.G.+ 6 7 9  .)  . . .) ).!.^.!.$XL.C. .Q % % 3 ) _. .% & 6 C.`.~._.!.Q.W 6 6 W ).!.#XW 7 + Q _._.Z.8 8 1 A.].W 1 2 Q !.$X(.8 & 1  .!. .6 2 1 {..X{.1 1 8 ..}.oX@X X(.Z. .Q 6 7 1 V.oX .7 & & 6 6 1 1 /.{.{.V.6 & 6 .. .V./ 6 7 2 /.{.OX{..X].].].].].{.].].].].].].].].].].].].]._.].].]..X].]._.'._._._._.]._._.'.'._._._._._._._.",
+"J.I.I.I.I.I.I.T.T.T.T.R.Q.W.!.!.!._._.!.!.'.'._._._..X_._.]._._.].'._.'._._.!._._._._._._.!.!._.G.8 1 + ^ !.!.R.R.$XR.!.R.~. .Q 6 8 + q & 7 2  .Q.V.+ 2 3 Q.!.!.Q.'.Q.^ 6 2 ^ E.!.!.^ 2 2 Q _._.C.3 1 1 C._.Q 1 1 W _._.].% 6 8  .$XV.@ 7 1 {.oX{.7 % 6 V.@X X .q % @ 3 q 7 6 3  .{. .1 7 1 1 & 6 7 W {.].V.8 & 2 8 9 6 7 8 6 8 D.oX.X{.{.{.{..X].].].].].].].].].].`.].].].].].]..X].]._.]._.]._.]._.]._.'.]._._.'._._._._._._._.",
+"I.J.I.I.I.T.T.T.R.T.W.W.W.!.!.!.!.'.!.'.'.!._._._.]._._._._.#X'._.'.'.'.'._._._.!._.$X_._.~.~._.C.@ 9 @ ^ (.!.~._.!.~.~._. .% & 8 V.(.Y.3 & %  .Q. .6 & 6 `._._._.!.Q.^ 8 1 Q '.!._.W & & ^ Q.'.A.1 6 6 Z._.^ 7 & q `._.(.+ & 3  .XX .% 8 6  X{.(.% & % V. XZ.& % 0 Z. X X2 6 + S.{. .7 & 1 9  .8 & 6 S.|.V.& & 6 A.A.A.P./.D.G.'.oXOX{..X{.{.].}..X{.{.].].].].].].].].].].].].].].].].].].'.].]._.]._.]._._._.]._.].].]._._._._.",
+"J.J.J.I.I.I.T.T.T.R.W.R.W.!.~._._.$X!._._._._._.'.'.#X_.'._.'.'.].'.'.'._._._._._.!.!._.!.!._._.C.7 7 7 + 6 2 2 7 6 6 Q ).! % 8 9 V.A.^ @ 9 %  ._.V.2 6 1 '.'.$X'.'.Q.^ + % 9 A.P.!.W & 7 W Q._.S.1 & 1 A.!.) 1 & 1 | A.Q & 6 3  .#X .6 % % W  .0 6 8 1  .{./ @ 9 r A.S.W & 7 6  . XV.6 & + /.|.9 6 6 9 [.(.3 + 6 / D.S.q + E  .OX{.{.{.{.{.{.{.].{.{.{.{..X{.].{.].]..X].].].].].].].].].].].]._.]._.]._.]._.].'._.].'.]._._._._.",
+"H.J.I.I.I.I.I.I.T.R.W.R.W.!.!.!.!._.'._._.'._.'._.'.'.]._.'.'.'._.'.'._.]._.'._.'.!._.'._.!.!.!.C.1 2 8 1 + 2 7 & 2 3 Q _./ @ % 3 6 1 1 7 & 7 ) Q.V.+ 6 1 '.E.W.'.'.!.| 8 7 3 2 | _.W 3 @ ^ _._.L.7 7 8 P.'.Q.0 8 % + 8 2 & 2 6  .].Y.2 & % 8 + 1 9 & 7 V..X| % & 7 6 1 1 r 8 2 V.OX .6 & 6 @X{.C.6 & 7  . X .9 % % + % + 8 @ /.}.{.oX{.{.{.{.{.OX{..X{.{.{.{..X.X{.{.}.].].}.].]..X].].].]..X_.].].].].'.].].'.].]._.].'._._._.].",
+"J.I.J.I.I.I.T.T.T.W.W.~.!.W.!._._.!.'._._._.`.'._.'._._._.#X].#X].'.'.].'.'.'.!._.'.!._.!.$X!.Q.G.% 6 6 8 8 6 % 7 % @ Q _.L.^ % % % 0 C./ 6 7 ^ ). .8 @ 9 Y..X'.!.!._.L.0 1 2 1 W _.^ 1 3 ^ _._.A.3 % + A._.].D.Q & 9 1  .& 7 &  .[.{. .8 6 + 0 Z.^ 6 1  .]. X^ 1 1 1 0 Z.| 6 8 W OXV.1 1 3 }.].%XQ 6 6 2 (.@X..9 6 % % + q A.+X{.oXoXoX{..X{..X{.].{.{..X}..X{.{..X{..X[..X].oX].].{.].].].].].]..X].].].].'.].].].].'.].'._.]._.",
+"H.J.I.I.I.I.I.T.T.R.W.R.R.!.!.!.!.'._.!.'.!._._._._._._.!.'._._._.'.'._._._._._._._.!._.!.'.!.$XY.)._.!.~.!.!.~.).).)._.!.!.(.(.A.L.!.'.Q.]._._._.'. X].)._.'.!.$X_.#X_.].Z.Z.L. X_.`.].'.).'.'._._.]. X_._.'.'.`.P.A.(.`.8 7 + V.].].{.(.A./. X X].[.}.XX'.XX`.(.A.(.[.oX'.'.{.}.OX X|.}.{.oXoX[.[.}.|.[.[.XX{.|./.D./.`.oXoX].}.oXoX{.}.OX{.OX}.].OX].OX{.{.}.OXOX{.OXoXoX].].]..X{.].oX].].].].].].].].].].].].'.].].]._.]._._.",
+"J.J.I.I.I.I.T.Y.R.T.E.R.!.W.!.!.!._.!.'._.!.'._._._._._._._.#X_.'.'.'.'._._._.!.!.'.!._._.!.!._._.!.$X!.W.W.$X!.!.!.^.$X!.!.'.!.'.)._.'.Q.`.]._.#X_._._.]._.`._.!.'.Q.$X!._.#X'.].#X]._.[._.'._._.#X'.'..X.X_.].]..X'.'.].3 % 9 k.{.].].].].]..XXX.X].{.#X{..XoX|.{.{. X.X.XXX.XoX.X@X.X'.}.@XoXXXXXoX}.OX+XoXOX}.OX.X}.oXoX.XOXoXoXoXoXoXoXoX{.{.{.OXOX{.{.{.oX.XOX.X{.{.oX].]..X{.{..X{.{..X{..X.X].].].].].].].].#X_.]._.'._.'.",
+"J.I.I.I.J.T.I.I.T.T.R.E.E.W.!.!.!._._.!._.!.Q._._.!._._._._.'.!._._.'.$X_._._.]._.'._.Q._.!.Q.!._.!.~._.!.W.W.!.Q.).!.'.!.!.#X!.Q.'.'._.[.]._.'._._..X]._.].`.Q.'.'.).#X_._._.].].].].].'._.].].#XoX#X'.'.#X.X].{.oX[.{.{.3 @ 6 | {.[.'.].{.{.`.]..X{.{. X{.].].].].{.{.].].{.oXoXoXOX{.{.{.}.].OXXX.X+X@X{.OX@XOX}.OXoXOX+XoX+X{.{.oX}.}.oXXXoX.X{..X{.{.oXoXoXOX{.oX{.}..X{.].{.{.{.{.{.].{.{.{.{.{.].{.].].].].].].].].].].'.].",
+"I.H.J.I.I.I.I.T.T.R.R.R.Q.!.!.!.W._.!.!._._._._._._._._._._._._._._.'.W.).'.Q.!.[.!.!._.!._.~.$XR.$X~.$X_.$X_.!.!.!.!.W.$X$X$X_.$X).'.'.$X[.'.'.#X]._._._._._.].'.[.].'.!.#X_..X_.'.XX'.'.'._..X_.'.'.XX'.XX'.XX].].{.{.[.V. .../.[.'.[.].].].{.XXXX'.[.[.[.'.XXXX].]..XoX.X].{.{.{.{.oX{.@XXX'.[.{.OX'.%XOXOX}.OX}.OXXX%XXXoX}.}.@X}.{.+X}.+XoXOX{.{.{.{.oXoXoX{.oX{.oX.X{.{.OXOX.X{.{..XOX{.{.{.{.{.].oX{.].].].].].].]._.].].'.",
+"H.I.J.I.I.I.T.T.R.W.Y.R.R.W.W.!.!.!.!.'.!._.Q.!.).!._._._._.!.'.!._.W._._.Q.'.$XE.!.!.!.!.!._.!.!._.~.W.W.R.~.W.W._._.'.Q.'.!.'._._.'.'.'.`.'.]..X].].`..X'..X_._.'.'.].`.#X]..X.X.X'..X_.'._..X.X'..X].].`.oX.X.X[.[.[.XX[.}.[.].].].{.{.{.].].].].XX[.'.XX'.].].].oX.X.X].{.}.{.XXoXOX@X|.[.OX}.{.}.+X[.+X+X}.}.+X}.|.}.}.}.].OX{.}.}.{.{.}.{.{..XOXOX{.oXoXoX}.OXOXOX{.OX{.{.{.{.OX}.{.oX{.{.oX{.{.oXoXoXoX_.].]..X]..X]..X_.].",
+"I.I.I.I.I.I.T.T.T.E.E.R.R.E.W.!.!.!.!.!.!._._.!._.!._.!._.!.'.!._.!.!._._.!.Q.!.Q. .Q ^ ^ ) Y.R.E.E.!.W.!.Q.!.^.$X'._._.(._._._._._._.!.[. . ... .V. .L.].'._.].[.].'.].].].'.'.'.[._..X`.{.].].#X_.].`.oX XOX].].oX....P.oX{.].'.].OX{.]..XoX'.{. X.X[.OX`..X{.{.].].oX.X.XoX].@XXX].}. .^ Z.@X{.}.V.[ / | /.+X+X}./.| ^ ^ /.|.].|.`.) ^ | Z.oXOX{.{.{.oXoXoXoX.XoXOXoXoX{.OXOXOX{.oXoXoXoXoXoXOXoXoXOXoXoXoXoX{.{.{.].].].].].].",
+"H.J.I.I.I.T.T.T.T.R.R.R.R.E.W.!.!.!.!.!.!.!.!.!.Q._.!._.!._.!._.!._.Q.!.'.!.'.(.Q 8 & % @ 3 Q ).E.$XW.T.$X_.!.$X_.^.$X)._._._._.'.!.'.'._.8 8 + 3 3 1  .].].].`.'.].[.'.[.XX'.[.[.$X[.].'.).].].XX.X].[._.[.'.].{.}.3 3  .oX@X}.XXXX].]..X].[.'.[.[.'.'..X{.].].[.{.{.{..XXX{.]. X@X}...+ +  .{.+X .8 6 ^ 1 9 /.CXA.+ + W 6 8 /.OX/.8 6 W + @ A.].{.oX{.].oXoX{.oXOXoXOXoX{.OXoXOXOXOXOXoXoXoXoXoXOXoXoXoXOXoXoX.X.X{..X].].}.].].",
+"I.I.I.I.I.I.I.E.T.E.R.E.R.~.W.W.W.!.!.!.!.!.!.!.!.!.!.!._.!._.!.!._.!.!.!.$XQ.A.@ % / C.Q @ @ P.W.Y. .V.) V.Y.^.~.Z.C.(.)  .L._.'.'.#X#X].+ 3 q  . . .L./.A./.Z. .`.(.S. . ...`._._.L.S.`.V. .Y._.'.].L. . .Z.{..X'./.D._.XX(.V.V...(.{.oX.X`.V... . X].oX]. XS. .S.(.{.{.]..XOXoXA.q 1 8 @ V.%XoX9 1 Z.|.S.6 | |.W 6  .|.V.1 / |./ 2  .VX..| S.}.OX{..XoX{.oXOXoXOXOXOXOXOXoXoXOXOXOXOXOX@XoXoXOXoXOXOXOXOXoXoX{.}.{.{.OX].oX].].",
+"J.I.I.I.T.T.I.T.T.R.R.T.E.E.R.Q.W.W.W.W.R.Q.!.!.!.Q.!.!.!.!.!.!.!.!.Q.!.!.!.!.L.3 & 0 ) V.(._.!.W.Q * + 6 6 Q Q.G.+ 3 Q 3 + 9  X'.'._.'.[.6 6 q .. .V.(.^ @ q 8 3 ).W & 8 9 % Q ].A.3 8 Q 3 8 9 {.OX/ % 1 1 1 W ].{.+ 7  .L.r % Q % 9 (.[.L.9 & % % + Z.].Y.9 + 1 + 0 /.}.].oX].]. .3 | & 7  .}.oX1 1 D.|.Z.8 3 +X6 6 L.}.D.6 9 }.9 2 V./ ^ S.].}.].{.{.oXoXoXOXoXoXOXOXOXOXOXOXoX}.oX}.oX}.}.oXOXOX+X@XoXoXoXoX{.{.{.OX].OXoX[.{.",
+"J.I.I.I.I.I.T.T.T.E.T.E.E.R.R.E.R.Q.R.E.R.R.!.~.!.~.!.!.!.!.!.!.!.Q.~.!.!.~.W.Q. .9 6 6 6 1  .~.I.k.q N. .6 3 A.A.% 6 / | 6 3 A.'.'.'..X].% 6 6 7 6 3 |.^ + 9  .A.)...^ S.V.3 8 Z.A.+ 8 | | 7 @ L.A.8 % V.D.9 Q L.{.+ 7  .V.7 6 /.V.S.).{.^ @ Q (.^ 9 / {./ 1 '  XW 1 ^  X+X].oX.XL.(.VX1 6 ..@XCX^ 7 ^ D.Q 8 3 |.% % D.+X/.* + }.7 % 7 ' 6 @ S.[.].{.{.OX{.OXOX}.OXOXOXOXOX+XOXOXOXOXOX}.}.OX+XOX+XOX}.}.@XOXOX}.oXoXoXoXoXoXoX}.",
+"I.I.T.I.T.T.I.E.T.T.T.E.W.W.E.R.R.R.R.R.R.Q.W.W.R.E.!.!.!.W.!.!.!.E.!.!.R.W.W.~.).Y. .) Q % 8  .Q.C.| Q 1 6 1 C.A.1 6 C.A.3 @ A.#X`.XXXX{.6 6 9 V. .V. X^ 8 Q }.{.}.D. .Q 1 1 8 A.P.& 1 L.G.6 1 P.V.@ 8 @X].].oX.X{.8 &  .A.1 7 6 6 ^ (.}.1 1 V.[.[.}..X{.1 7 ..[.V.8 8 {.XX.X{.]..X[.[.1 1 V.OX@X/.q & 9 q % 8 }.& 7 /.}.A.8 3 |.6 7  .[.Z.% 9  X].].OXOX{.}.}.}.@XOX+X+XOXoX+XOX+XOXOX+XOXOXOXOX+X+X+X@X}.}.OXOXOXOXoXoXoXoXoX{.",
+"I.I.I.T.T.I.T.T.E.T.T.R.R.R.E.~.R.R.E.R.W.R.R.W.R.E.W.!.!.W.W.!.!.Q.W.!.$X!.~...1 3  .Y.V.1 +  .C.8 @  .V.6 8 S.C.7 3 A.A.6 1 A._.oX_..X X6 & ^  X}.].}.' & W {.}.A.+ 1 N.N.% @ D.A.& 6 A.A.6 7 A.V.1 1 {.[.A.`.@X}.1 + S.|. X| ^ 2 @ / `.+ r | [.(./.].{.3 6  .[.V.% @ }.].].oX}.oX].|.8 7  .OXoX+X XS./.V.6 Q +X^ 6 Z.|.A.@ W [.e 3 A.[.A.8 3 |.[..X].].{.}.OXOX@XOX+XOX@X+X@X+XOXOX+X+XOX+X+X}.+X+X+X@XOXOX@XOX+X|.OXOXoXoXoXoX",
+"I.I.I.I.T.T.I.T.T.T.E.T.R.R.T.T.T.R.R.R.W.W.E.R.W.W.Q.W.W.!.!.E.W.E.!.E.!.!._.P.8 & 3 W 9 + 1 Z.) 6 6 S.^ 6 6 Z.G.% 3 Z.A.6 2 A.].].'.].{.+ 1 W oX].[.{.W % ^ }.oXV.3 + S./ % + A.L.& 1 A.L.& 2 L.D.8 7 V. .3 + S.{.1 6  .S./ / |.q + |  X/ & q A.W 1 Q [./ 2 r A.q + | {.{.}.{.'.}.].@X% 8  .oX+X/ 9 q D.W 8 V.|. .2 W D.W +  .|.V.2 W D.W 7 ^ |.].{.{.OX{.}.}.@X}.+X+X+X+XOXOX+X+XOX+X+X+X+X+X+X+X+X+X@X+X+XOX+X@XOX@XOX+XoXoX}.",
+"I.I.T.I.I.R.R.R.I.R.R.R.R.R.R.R.R.T.R.R.W.W.E.R.W.!.R.E.Q.E.E.~.R.~.!.~.W.R.E.!.k.0 8 @ & 9 V.Y.T.8 8 @ / 7 3 V.P.& 8 A.P.& 8 A.].].]..X'.3 3 ^ }.].XX}./ + ^ {.oX(.9 8 1 | 6 9 S.A.6 8 D.A.8 7 D.[.S.8 6 7 6  .|.oX6 &  ./.9 * 3 1 q /.].`.Q 3 1 & e /.[.).^ 1 3 1 ^  X[.XX{.@X{.oXOX{.3 1 V.}.oX@XW % 8 3  .VX@X X^ 3 3 1 ^  XOXoX| 8 + + 0 /.].{.{..X{.oX|.OXOX+XOX+X+XOX+XOX+XOX+X+X+X+X}.+X+X+X+X+XOX+X+X+XOX+X+XOX}.+XoXoXOX",
+"J.I.I.I.I.R.I.R.I.R.I.R.I.R.I.R.R.E.E.R.T.E.W.E.W.R.R.R.T.R.R.R.R.R.!.!.W.!.W.!.Y.Q.C.A.A.Q.E.!.~.).Z.L.'.Q.!.'._.'.!.'.'.].[.'.'.].'.{.oX X{.{.].{.OX[.+X|.{.}.}.OX`.L.(.{.].].OXoX].]..X].].].XXXXoX X/.A. X}..X.X[.|.OXoX}.L.L./.oXoX{.].oX/./.L.]..X].oX X`.A.`.{.].[.oXoX}.].OX'.%X{.|.|.}.OXOX X(.D.(.|.@X{.}.}././.L.+XOXoXXXOX/.L.Y.].OX.X]..XOX{.oX}.OX@X+X+X+X+X+XOX+X+X+X+X+X+X+X+XCX+X+X+X+X+X+X+X+X+XOX+X+X+X|.+XOXOX",
+"J.I.I.T.I.I.T.T.T.T.T.T.I.T.R.R.E.R.T.E.W.E.T.R.R.E.R.R.R.R.R.W.R.W.T.~.!.!.~.!.!.'.!.E.T.W.!.!._.!.'.'._.]._.'.#X_.'..X#X{.].].{.].].{.[.OX'.].@XoXOX}.oXXXOXXX}.@X{.oX{.oXoX.XoXoX].{.oXoX{..X@XoX.XoX{.{.OXoXoXOXoX|.{..X}.}.[.oXXX].]..X.X].oX.X'.XX.X].oX].{.{.}.[._.oX{.OX{.@XOXoX}.}.}.OXoX+X%XXXXX{.OX].+X}.@X}.{.+X}.].OXOXoXoXOX[..X.XoXoX{.{.{.oXoXOXOX+XOX+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X}.OX+X+X+X+X}.OX",
+"J.I.I.I.I.I.I.I.I.T.I.T.R.R.I.R.T.T.R.T.T.R.W.R.R.R.E.R.E.R.R.R.W.!.T.!.!.!.!.!.~.)._.!._.!._._.W._.!.XX_.`.].'.#X'.'.'.].].#X{.].].}.{.[..XXXOXoXoXoX+XOXOX.X+XoX@XoXOXoX].+XOX@X@XoXoXoXoXoX}.oXoXoXoX@X+XoX.X{..X@X@XXXXX}.[.XX[.'.OX@X.X.X{.{.oX{..XoXoX.XXX X].].XX].oXoXoX{.OXOXoX}.oXOX+XOX@X+XOXoX].+X.X{.|.}.}.+X{.}.}.oX.XoXoX{.oX{.OX]..X.X{.OX{.OXoX@XOX+X+X+X+X+X+X+X+X+X+X+XCX+XCX+XSX+X+X%X+X+X+X+X+X+X+X@X+XOX@X@X",
+"J.I.I.I.I.I.I.T.I.T.T.I.T.T.R.R.T.T.T.T.E.T.T.T.E.T.E.R.E.T.E.E.W.!.~.W.W.W.!.!.!.!.!.!.Q._.!._.'.)._._.#X_.).[.]..X].].].{.].].'.{.{.oX{.oX.XOX{.{.@X@X@X@X+X@XOXOX}.}.oX+X{.@X{.|.OXOX|.}.}.oXoX{.}.XX%X].OXoX{.XX}.}.}.oXoX}.oX{.].].}.].oX{.[..X{.{.{.[.oX'.XX].+X].OXoXoXOX.X@XOX@X}.}.}.OXoXOXOXOXoX+X].}.@XoX[.XX[.oX.XOX].oX].{.oX.XOX.X}.oXoX}.oXoX}.+X+X|.+X+XCXCX+X+XCX+XCX+XCXCX+XCX+X+X+XSX+X+X+X+XOX@X+XOX|.+X+XOXOX",
+"I.J.J.I.I.I.I.I.I.I.I.I.I.T.R.I.T.T.T.E.T.T.T.T.T.T.T.R.R.Q.R.E.R.E.R.!.!.W.!.!.!.!.!.!.!._.!._.'.'.'.'.'.'.].].].].].].].{.{.{.OX{.}.].oX.XOXoXoXOXOXoXOX+XOX@X}.@XOX}.oX+XOXOX}.@XOXoX@XOXOXOX}.}.}.|.}.OX{.OX{.oX].{.oX{.{.oX{.{.{.{.]..X{.}.].{.{..X}.}.{.}.{..X{.{.].oXOXOXOXOXOXoXOXOX@X}.OXOXOXOXOX}.{.OX{.{.OX{.oXoX{.{.oXoX{.{.{.{.].{.].].{.].oXoX}.}.OX+X|.+X+XCX%XCX+X+XCXCXCXCXCXCX+XSX%XSX+X+X+X+X+X+X+X+X+X+XOXOXOX",
+"J.I.I.I.I.I.I.I.I.I.I.R.T.I.I.R.T.T.T.T.T.R.T.R.T.T.T.E.R.E.R.E.R.R.R.!.W.!.$X!.!.!.!._._.!._.)._.'.'.'.'..X'.].].]..X].{.].{.{..X{.{.oXoXoXOXoXoXOXOXOX+X@XOXOXOX}.OX@X+XoX+X+X+XOXOX}.|.OXOX}.@XOXOXOX}.{.{.OX{.{..X{.{.{.oX{.OX].{.{..X].]..X].{..XOX{.{.OX].{.].}..X{.oXoXOXOXOXoXoXoXOX+XOXOXoX}.oXoX.XOX].{.{.oX{..X}.].{.{.{..X{.].{..X{.{.{.OX.X.XoXOXOX+XOXOX+X%X+XCXCXCXCX|.CXCXSXCX+XSX+X+XSXSX+XSX+X+X+X+X+X}.+XOX+X+X",
+"J.I.I.I.I.I.I.T.I.I.I.I.T.T.I.R.T.T.T.T.T.T.R.R.T.E.T.T.T.T.T.T.R.R.R.R.!.!.!.!.!.!.!.!.!.!._._._.'.'.#X[.'..X].].{..X{.{.{.{.{.oX{.oXoXoXoXoXOXOXoXOXOXOX+X+X+X@X+X+X@XOX+X+X+X+X@X@X+X@XOXOX+X@XOX+X}.OXOXOX.XOX{.OX{.{.{.{.{.{.OX]..X].OX}..X{.{.{.{.}.{..X{.{.{.{.OXoXoXoXOXOXOXOXoXOXOXoXOXOX+X}.@XoXoX].OX{..X{..X]..X{.]..X].{.].{.].{.{.].].{.{.oX{.oXOX}.+X+X+X+X+X+XCX+XCXCXCXCX}.CXCXSX%X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X",
+"J.I.J.J.J.T.I.I.I.R.I.R.I.T.I.T.T.T.T.I.R.R.R.R.R.R.R.R.R.R.R.R.R.T.E.R.Q.!.E.!.W.!.!.$X!._._._._.]._..X].].]..X].{..XOX{.oXOX{.}.OXOXOXOXOXOXOXoXOXOXOXOX+X+X+X+X+X+X+X+X+X+X+XOX+X+XoXOXOX|.+XOX+X+X}.OXoX{.OX.X{.OX].OXOX].OX.XOX{.{..X.X].].].].].{.{.OXoXoX.XOX@X#X@XOXOXOX@XOXoXoXoXOXoXOXoX}.}.OX{.oX.X{.{.{.].{.].].].].].].{.].].].].].].{.{.{.{.oXoXOXOX+X+XCX+X+X+X+X%XSXCXCXCXCX|.CX+XSX+X+XSX+X+X+XCX+X+X+X+XSX+X+X+X",
+"J.J.T.J.J.I.I.I.I.I.I.I.I.T.T.I.I.T.T.T.T.T.T.R.I.R.R.R.T.I.T.R.R.T.T.R.R.E.E.W.!.~.!.!._.!.Q._._._._._.].].].].].{.{.{.oXoXOXoXOX|.oX}.oXOXOX}.{.oXOX}.}.+XOXOX+X+X+X+X+X+X+X+X+XOX@X+XOX@X@XOXOX+XOXOXOXoXoX{.{.OX{.].{.{.OX].{.{.{..XOX]..X].]..X{.{.{.oXoX}.OX@XOXOXoXOXOXOXoXOXOXOXOXoX@X#XoXoX}.@XOX{.OX{.{.].].].].{.].].].].].].].].{.].].{.{.{.{.{.{.OXOX+X}.%X+X+X+XCXSX|.CXCXCX+XCXCX+X%XSX+X+X+X+XSX+X+XSX+X+X+X+X+X+X",
+"I.I.I.T.J.T.I.I.I.I.I.R.I.T.T.J.T.T.T.R.I.T.T.T.R.R.R.I.I.T.I.W.R.T.T.E.R.~.R.!.!.!.!.!.!._.!._.#X'.].]..X].].].{.{.{.OXOXOXOXOXOX}.OXOX+X}.+X}.oXoXoXOX}.+X+X+X+X+XCX%X+X+X+X+X+X+X+X+X@X@X+XOX+XOXOX}.OX{.{.OXOX{.OX}.].OX{.].].OXOX{.].OX].}.].{..X}.{.OX}.oXOX@X@XOXoXOXOXOXOXoX@XoXOXOXOXOXOXoX}.}.oXoXoX{.{.].].].].].].].].].].].].].].].].].{.{.oX.X{.{.OX}.+X}.|.+XCX+X%XCXCXCXCXCXCX+X+XCXCX+XSX+X+X%XCXCX+X%X+XCXSX+X+X",
+"J.J.J.J.J.J.I.I.I.I.W.I.I.J.T.T.I.R.I.I.T.T.I.T.R.I.R.I.R.R.T.R.T.E.R.T.T.R.R.E.!.!.!.!.!._._._.'._._.]..X].]..X{.{.OX{.@XOXOX+X@XOXOXOX}.OXoX}.oXoXOXOX+XOX+X+X+X+X+XCXCXCX+X+X+X+XOXOX+XOX+XOX+X}.OX}.}.OXOXOX.XOX.XOXOX{.{.OXOX{..X{..X].].].].].]..X.X{.|.{.OXOXOXOXOXOXOX@XoXOXOXOX#XOXOXOXOXOX}.}.{.{.{..X}.].{.].].].`.[.].{.].].].].].].].{..X.X.XOXOXOX+XOX|.+X+X+X+XCXSXCX|.SX}.CXCXCXCXCX+XSX+XSXSX+X+X%XCX+XCX+X+X+X+X"
+};
diff --git a/images/scenario3hilite.xpm b/images/scenario3hilite.xpm
new file mode 100644 (file)
index 0000000..82b9540
--- /dev/null
@@ -0,0 +1,450 @@
+/* XPM */
+static char *scenario_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"209 188 256 2",
+"   c #302C19",
+".  c #373937",
+"X  c #2E312B",
+"o  c #1A2420",
+"O  c #1C3D68",
+"+  c #142F70",
+"@  c #33334D",
+"#  c #233D6B",
+"$  c #253C66",
+"%  c #2C346F",
+"&  c #181E51",
+"*  c #105311",
+"=  c #0C6F0E",
+"-  c #394439",
+";  c #30512E",
+":  c #2D682E",
+">  c #226221",
+",  c #1C426B",
+"<  c #1C4267",
+"1  c #1C4572",
+"2  c #054D6F",
+"3  c #3B4443",
+"4  c #344E4F",
+"5  c #22416B",
+"6  c #244268",
+"7  c #224271",
+"8  c #264775",
+"9  c #325C7C",
+"0  c #2C5378",
+"q  c #316976",
+"w  c #2B6351",
+"e  c #463A37",
+"r  c #4D352D",
+"t  c #673930",
+"y  c #5A2718",
+"u  c #463B43",
+"i  c #513C4E",
+"p  c #4F3766",
+"a  c #474439",
+"s  c #574539",
+"d  c #505130",
+"f  c #516D2E",
+"g  c #674838",
+"h  c #725134",
+"j  c #6F6E33",
+"k  c #526118",
+"l  c #474746",
+"z  c #495848",
+"x  c #554847",
+"c  c #57544A",
+"v  c #575655",
+"b  c #4D4D54",
+"n  c #42587B",
+"m  c #50506E",
+"M  c #516A4E",
+"N  c #52696D",
+"B  c #674844",
+"V  c #685648",
+"C  c #675955",
+"Z  c #764A44",
+"A  c #775547",
+"S  c #765A57",
+"D  c #6A4B54",
+"F  c #6C5769",
+"G  c #786357",
+"H  c #6E6B4E",
+"J  c #666767",
+"K  c #716F71",
+"L  c #2E3495",
+"P  c #3B5785",
+"I  c #305688",
+"U  c #376285",
+"Y  c #3B6995",
+"T  c #3A7795",
+"R  c #2E678B",
+"E  c #3B77A5",
+"W  c #3644A9",
+"Q  c #415585",
+"!  c #44568A",
+"~  c #415883",
+"^  c #43588A",
+"/  c #495589",
+"(  c #4E5190",
+")  c #4F51AD",
+"_  c #436C97",
+"`  c #447798",
+"'  c #566D99",
+"]  c #466684",
+"[  c #467AA7",
+"{  c #4E70AB",
+"}  c #6D578F",
+"|  c #655BB3",
+" . c #6F6D8F",
+".. c #726CB1",
+"X. c #5457CC",
+"o. c #5558E7",
+"O. c #5B66D3",
+"+. c #5D63EA",
+"@. c #5C63F3",
+"#. c #6A5DF1",
+"$. c #6D67D3",
+"%. c #6264E6",
+"&. c #6265E9",
+"*. c #6768EB",
+"=. c #6666F5",
+"-. c #7469EC",
+";. c #615DCB",
+":. c #4338A0",
+">. c #008302",
+",. c #0E8516",
+"<. c #37BA1D",
+"1. c #34A326",
+"2. c #00DB00",
+"3. c #0BDC04",
+"4. c #17D909",
+"5. c #1CC90E",
+"6. c #00E300",
+"7. c #00EA00",
+"8. c #0BE503",
+"9. c #10E804",
+"0. c #26CB0A",
+"q. c #25CC09",
+"w. c #24D404",
+"e. c #25DA04",
+"r. c #26D70B",
+"t. c #26D312",
+"y. c #37C819",
+"u. c #2CCE13",
+"i. c #29D317",
+"p. c #539330",
+"a. c #51B329",
+"s. c #6C8F36",
+"d. c #79A93A",
+"f. c #68B230",
+"g. c #4FAD1B",
+"h. c #718B47",
+"j. c #719173",
+"k. c #559C55",
+"l. c #42C61C",
+"z. c #4AC423",
+"x. c #74C836",
+"c. c #3EA261",
+"v. c #3B84B2",
+"b. c #3B829E",
+"n. c #258CC9",
+"m. c #298ECA",
+"M. c #238CC6",
+"N. c #2C90CC",
+"B. c #2B96CB",
+"V. c #3293CE",
+"C. c #3B98CE",
+"Z. c #3896CD",
+"A. c #3D9AD0",
+"S. c #3695D0",
+"D. c #2F93CD",
+"F. c #4E809B",
+"G. c #4786AC",
+"H. c #4A8AB3",
+"J. c #5693B9",
+"K. c #528BB6",
+"L. c #7194A2",
+"P. c #4A97C5",
+"I. c #439DD2",
+"U. c #489ED4",
+"Y. c #569AC6",
+"T. c #539DD0",
+"R. c #4BA1D4",
+"E. c #4AA3D6",
+"W. c #58A3CC",
+"Q. c #53A5D5",
+"!. c #55A6D8",
+"~. c #55A8D6",
+"^. c #55A9D8",
+"/. c #5AA5D2",
+"(. c #5BAAD5",
+"). c #5BAAD9",
+"_. c #5AA5D9",
+"`. c #56ACD8",
+"'. c #64A3CC",
+"]. c #62ADDB",
+"[. c #65AAD6",
+"{. c #65B0DC",
+"}. c #6AB2DD",
+"|. c #6AB5D9",
+" X c #71B4DE",
+".X c #76B7DB",
+"XX c #75ADD3",
+"oX c #6AB4E1",
+"OX c #73B6E0",
+"+X c #75B8E1",
+"@X c #7ABAE1",
+"#X c #79B6E2",
+"$X c #66ACE0",
+"%X c #62A0CE",
+"&X c #74C0E3",
+"*X c #8C302E",
+"=X c #8B5536",
+"-X c #9E6732",
+";X c #875848",
+":X c #8F574D",
+">X c #866657",
+",X c #976858",
+"<X c #8E6C4B",
+"1X c #91716E",
+"2X c #A45A4C",
+"3X c #A76957",
+"4X c #B87659",
+"5X c #AD6F51",
+"6X c #B07168",
+"7X c #88596E",
+"8X c #D97731",
+"9X c #D67C5B",
+"0X c #C97755",
+"qX c #CD7C62",
+"wX c #C67863",
+"eX c #D27C64",
+"rX c #DA7868",
+"tX c #C57570",
+"yX c #E3756B",
+"uX c #E27A50",
+"iX c #8C3945",
+"pX c #9070B1",
+"aX c #AE748E",
+"sX c #996E9B",
+"dX c #886ACE",
+"fX c #C27C83",
+"gX c #83A538",
+"hX c #969333",
+"jX c #929748",
+"kX c #8F8772",
+"lX c #8CA242",
+"zX c #A4944B",
+"xX c #B78957",
+"cX c #AD8F51",
+"vX c #A89568",
+"bX c #C9845B",
+"nX c #D88166",
+"mX c #CB8465",
+"MX c #E58A64",
+"NX c #DEC13A",
+"BX c #8F8F8F",
+"VX c #ACAEAB",
+"CX c #A09B99",
+"ZX c #85BAD8",
+"AX c #84BAE4",
+"SX c #9091E5",
+"DX c #90C4DB",
+"FX c #92C6E4",
+"GX c #A9D3E8",
+"HX c #B6D9E8",
+"JX c #A9D0EA",
+"KX c #ACD0D8",
+"LX c #CC989C",
+"PX c #C8E4EF",
+"IX c #CDD4D5",
+"UX c #9CC698",
+/* pixels */
+"R.R.R.I.E.I.E.I.E.I.C.I.I.C.I.C.I.I.I.C.I.I.I.I.I.I.I.I.I.I.I.I.E.I.E.I.U.R.R.Q.Q.Q.Q.R.Q.Q.R.Q.E.Q.Q.Q.Q.Q.R.R.R.R.R.R.R.R.E.Q.E.E.Q.E.R.R.R.R.R.R.E.Q.R.R.E.R.R.Q.U.Q.Q.Q.!.!.T.^.^._.~._.^.(.^.^.!.!.~./.~.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.^._.^.^.).).).].).).].].(.].{.).].].{.{.{.{.{.{.}.}.}.}.oX}. X}.OXOXOX XOXOX.X+X+X.X XOXOXOXOX XOX XOX}.OX}.}.}.}.}.}.].}.{.{.].{.{.].].[.{.).{.).].).].).].(.].).].",
+"R.U.I.R.I.I.I.I.I.A.I.C.I.I.C.I.C.I.C.I.I.A.C.I.I.A.I.I.I.I.I.I.I.I.I.I.U.R.R.E.R.Q.R.Q.Q.R.Q.Q.Q.Q.R.Q.R.Q.R.R.R.R.R.U.R.R.E.E.E.Q.Q.R.R.R.R.R.R.Q.E.R.R.R.R.E.Q.U.Q.Q.Q.Q.!.!.!._.^.!._.^.^._.~._.!.!.!.!.!.Q.Q.!.!.!.!.E.Q.Q.R.Q.U.Q.E.!.Q.!.Q.Q.!.Q.Q.^.^.!._.~.(.^.).^.).).].).(.{.).{.).{.{.).].].].{.}.].{.{.{.}.}.}.OXOXOXOXOXOX+XOXOX.X+X XOXOXOXOXOXOXOXOXOX}.}.}.}.}.{.].}.].{.[.].].].].].].).{.{.).).).(.).)._.].).).",
+"U.R.I.I.E.I.I.I.E.I.I.A.C.C.C.C.C.I.I.C.A.I.A.A.C.I.I.I.I.I.I.I.I.I.I.I.U.R.R.E.R.Q.Q.R.R.Q.R.Q.R.Q.Q.Q.R.R.R.R.R.U.U.U.R.R.R.U.E.R.E.R.R.R.R.R.R.R.R.R.R.R.R.Q.R.Q.Q.Q.E.Q.Q.!.!._._.^._._.!.~.~.!.!.!.~.Q.Q.Q.Q.!.!.Q.Q.Q.Q.R.Q.Q.T.Q.!.!.!.!.Q.E.Q.!.Q.Q.!.!.~.^.!.!.~.^.^.).].).).).].).].).).{.].].].}.].}.]. X}.oX}.}. X}.OX XOXOX+XOXOX+X+XOXOXOXOXOX XOX X}. X}.}.}.}.}.{.}.{.].].].{.{.].].].].).{.).).].(.).(.).].(.).).",
+"U.I.E.I.I.I.I.I.A.I.I.I.I.I.I.I.A.A.I.C.A.I.A.A.A.A.C.A.I.I.I.I.I.I.E.R.R.U.R.E.R.R.R.R.Q.R.R.R.R.R.R.R.R.R.R.U.U.U.E.E.U.U.R.U.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.U.T.U.U.Q.Q.Q.!.~.~.!.~.~.~.!.!.^.!.!.!.Q.Q.Q.!.!.E.!.!.Q.E.R.Q.U.Q.E.Q.Q.E.!.!.Q.!.!.Q.Q.Q.Q.Q.Q.Q.!.Q.~._.^.).^.].).).).).).].).).).].}.].].].].}.{.{.}. X X X}.OX XOXOXOXOX XOX X+XOX XOXOX X XOX}. X}.}.}.}.}.{.}.].].].].{.{.].(.].).).{.).).).).).).).).).).",
+"E.R.E.I.I.I.I.I.I.I.A.I.I.A.A.A.A.C.C.C.C.S.C.C.C.A.C.I.I.I.C.I.I.I.I.I.U.U.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.U.U.A.U.U.U.U.U.U.U.U.U.U.U.R.R.R.R.R.R.Q.R.R.U.R.R.E.Q.Q.Q.E.Q.Q.!.!.~.!.~.!.!.~.!.!.!.^.Q.!.^.Q.Q.!.!.E.Q.Q.R.R.Q.Q.U.Q.Q.Q.Q.Q.Q.E.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.^.!.).^.).).).).).).).).).).].].].].].{.}.}.}.[.}.}. X XOXOX}.OXOX+X+X+XOX+XOXOXOX X X X X}.}.}.}.{.}.}.}.{.].].].{.).].].].).{.).).).).).).).).).).).).",
+"I.I.I.I.I.I.I.I.I.I.A.I.I.A.A.S.A.C.C.C.C.C.C.V.C.A.C.C.C.I.C.I.I.I.I.E.E.U.U.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.U.U.E.U.U.U.U.U.U.U.U.U.U.U.U.U.R.R.R.R.R.R.R.R.U.R.E.E.U.Q.Q.Q.Q.!.~._.~.~.~.Q.Q.!.!.Q.Q.Q.Q.Q.!.!.!.Q.!.Q.Q.Q.Q.Q.Q.Q.U.Q.Q.R.E.Q.!.!.Q.Q.E.Q.U.Q.Q.Q.Q.Q.Q.!.!.!.^._.).).).).).).).].(.]._.[.].].].}.}.{.}.}. X X X}.OXOXOXOX+XoXOXOXOX+X+XOX X X X}.}.}.}.}.}.}.{.].{.].].{.).{.].].].].].].].).).^.).).)._.).).).",
+"E.I.R.I.I.I.I.C.I.A.I.A.A.A.A.C.C.C.C.C.A.C.C.C.C.C.C.A.C.A.I.I.I.I.E.I.I.U.U.U.R.R.R.R.R.U.R.U.E.I.R.I.R.U.U.U.A.U.E.U.U.U.U.U.U.U.U.U.U.P.E.R.R.R.R.R.R.U.U.R.U.T.Q.E.Q.Q.!.!.~.!.!.!.Q.Q.~.Q.E.!.Q.Q.Q.Q.Q.Q.!.Q.Q.Q.R.Q.Q.E.U.U.T.R.U.U.T.Q.Q.!.Q.R.R.Q.R.R.R.Q.Q.E.Q.Q.!.!.^.^.(.).!.~.).).(.~.^.).).).].].$X{.].}.}.}.oX}.}. X}.OXOX XoX+XOXOX XOXOX+XOX X X X X}.}.}.}.{.}.{.{.].{.].].{.].].].].].).).).)._._.^._._.).).).",
+"U.I.I.I.I.I.I.I.I.A.A.A.A.A.C.C.C.C.C.C.C.C.C.C.C.S.A.A.A.C.C.I.I.I.I.I.I.E.U.U.U.U.U.U.R.R.R.U.E.R.R.R.U.U.U.U.E.E.A.A.E.U.U.U.I.U.I.U.U.U.R.R.E.R.R.R.R.R.R.R.E.Q.U.T.Q.E.!.Q.^.!.!.!.Q.Q.Q.~.^.Q.^.Q.Q.Q.^.Q.Q.Q.Q.Q.R.Q.E.R.R.Q.R.Q.Q.Q.Q.Q.E.Q.Q.Q.W.R.R.Q.R.Q.R.Q.Q.Q.Q.!.^._.^.^.~._._.).).)._.].).[.].}.}.].}.}.].}.}.}.oX}.}.OX X X+XOXOXOXOXOXOXOXOXOX X X}.}.}.}.{.{.}.[.|.].].}.{.].].).].).].].).).).^.^.(._.~.).).).",
+"U.U.I.I.I.I.A.I.C.I.C.C.A.A.S.S.C.C.Z.Z.S.S.Z.Z.C.S.S.S.A.S.A.A.C.I.I.I.I.U.U.U.U.R.R.U.R.R.U.U.I.U.U.U.U.U.U.U.U.U.U.I.U.U.A.A.U.I.I.U.U.U.U.U.R.E.E.Q.R.R.R.E.U.Q.U.Q.E.Q.Q.Q.Q.!.~.~.Q.Q.Q.Q.^.Q.Q.Q.~.Q.Q.~.Q.Q.Q.R.R.Q.R.R.R.R.R.R.R.R.R.Q.E.Q.!.E.Q.Q.E.E.U.Q.Q.Q.Q.Q.Q.!.~._.~._._.(.^.^.).(.^.).).].).{.$X{.{.{.{.}.[.}.}.}.}.}.OX}. X}. X XOXOX+XOXOXOX X XoX}.}.}.{.{.{.{.{.{.{.$X{.{.{.).$X).].).).(.^.^._.^._._._.).).",
+"I.U.I.I.I.A.I.C.C.A.FXFXJXGXGXGXJXJXJXJXJXJXJXJXJXJXJXFXFXA.A.I.I.I.I.I.I.U.U.U.U.U.I.U.U.I.U.U.I.I.U.U.I.U.I.U.I.I.I.U.U.U.U.U.I.U.U.U.U.U.R.E.E.Q.E.E.R.R.R.Q.Q.Q.!.Q.!.T.Q.!.Q.Q.!.Q.~.!.~.!.Q.Q.Q.~.Q.Q.Q.Q.Q.Q.Q.Q.Q.R.U.R.R.R.R.E.E.Q.E.R.E.Q.T.Q.U.E.Q.U.U.Q.Q.U.Q.Q.Q.Q.^.~.^.^.^.^.).^._._.).(.).].{.].{.{.].{.}.{.}.}.}.}.OX}.OX X XOX XOXOX+X XOX.XOX X X}.}.}.Q.{.XX.X.XDXZX@X@XDXZX&XDXZX.X.X X[.Y.^._.^.(.(.).).).].",
+"R.P.I.I.A.I.A.A.S.FXGXGXHXHXPXPXPXPXPXPXPXPXPXPXPXHXHXJXFXAXA.A.I.I.C.I.I.I.U.U.I.U.U.U.I.U.I.I.I.I.I.U.U.U.I.I.I.I.I.U.A.U.U.U.U.U.U.U.U.R.U.Q.R.E.Q.R.R.R.R.E.Q.U.Q.R.E.Q.T.!.Q.Q.Q.Q.Q.~.Q.~.Q.Q.Q.Q.Q.Q./.Q.!.Q.R.Q.Q.R.R.R.Q.R.R.R.Q.R.Q.R.E.U.E.E.E.E.Q.U.Q.U.U.Q.U.Q.Q.!.!.!.^._.(.~.(.^.).^.).).].).).$X].].{.].{.}.{.}.}.}.}.OX}.}.OX X XOXOXOXOXOXOX X X}.}.}.T.oX.XFXGXGXGXGXGXHXGXGXGXGXGXGXFXFXZX[.Q.^.~._.~.).).].].",
+"I.I.I.I.I.A.A.A.S.FXJX, 6 6 $ $ 7 # 5 # 5 # 5 5 O # 5 6 JXFXI.A.Z.I.I.I.I.I.I.I.U.I.U.I.U.I.E.I.I.I.E.I.I.U.I.I.A.I.I.U.U.U.U.U.U.U.U.U.R.U.U.E.R.R.R.R.R.R.Q.E.Q.E.Q.Q.!.E.!.E.~.Q.Q.!.~.!.!.!.~.Q.^.~.~.Q.!.Q.Q.Q.R.Q.Q.R.R.R.R.R.E.R.R.R.R.R.E.Q.Q.U.U.U.!.T.U.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.~.!.~.~._.^._.).).).).).).).].{.].].{.{.}.}.oX}.}.OX}.}. X X XOXOXOX XOX X XoX X X[.XX, < < 6 # # 6 , # # 6 6 6 8 5 O 5 .X{._.~.~._.)._.)._.",
+"I.I.I.I.C.C.C.C.S.JXJX6 5 O 6 6 $ 5 5 5 , 5 5 5 5 5 5 , JXFXA.A.I.I.C.I.I.I.I.I.I.U.I.U.U.I.U.I.I.I.I.I.U.I.I.I.U.A.U.I.U.U.U.U.U.U.U.R.U.U.U.E.Q.E.Q.E.R.Q.E.E.E.Q.Q.Q.R.Q.Q.Q.Q.Q.Q.Q.Q.^.!.!.!.~.~.!.Q.Q.Q.Q.Q.Q.Q.U.Q.U.R.R.U.U.R.R.R.R.R.R.R.R.R.E.Q.U.Q.U.E.E.Q.E.R.Q.Q.E.Q.Q.Q.Q.!.!.~.~.).).).).).).).].].).).{.{.{.{.{.{.oX}.oX X}.oXOX X X X XOX X X X X}.}.oX].ZX< 6 # 7 # 6 # 6 O 5 6 6 $ # , 5 $ DX[.~._.~.).).).).).",
+"I.I.C.I.I.C.C.C.D.JXPX< 5 7 8 6 5 , 5 5 7 O O 5 , 7 # , JXFXA.A.C.I.I.I.I.I.I.U.I.U.E.I.I.I.I.I.I.I.I.I.I.U.I.I.I.E.I.U.U.U.E.U.U.U.U.U.U.U.Q.U.U.E.U.U.R.E.E.Q.Q.Q.R.Q.Q.Q.Q.Q.Q.Q.Q.Q.~.!.!.!.!.^.!.!.Q.Q.Q.Q.!.Q.Q.Q.Q.R.R.U.R.R.R.U.U.R.I.U.I.R.R.R.U.Q.E.T.R.R.R.Q.Q.R.Q.Q.R.Q.Q.Q.^.T.!._.).).).).).).).).).].{.).{.{.{.oX}.}.oX}.}.}. X}. X X X X X X X XoXoX X}.[.AX< 6 5 # 5 5 6 6 5 5 6 , < 6 , 6 6 FX.X~.~.(.!.).).).).",
+"I.I.A.C.C.S.S.S.D.JXPX, # , 1 $ 6 6 , $ O O 6 5 5 6 # 5 FXFXA.A.I.Z.A.C.C.I.I.U.I.U.I.I.I.R.I.I.E.I.I.I.A.I.I.I.I.I.U.I.U.U.U.U.R.R.R.R.U.Q.U.E.R.R.E.R.R.E.R.E.E.Q.Q.R.R.Q.E.E.W.Q.~.W.~.~.^.^.~.~.~.Q.W.Q.Q.~.E.Q.E.R.R.R.R.U.U.U.U.R.U.I.I.E.R.I.E.R.R.U.E.E.R.U.R.R.U.R.R.R.R.U.Q.Q.Q.!.~.~._._.^.).).).).).).).].{.].).{.{.}.}.}. XoXoXoXOX XOX+XOXOXOX XoXOXOXoXOX(..X1 6 O # O 5 $ < < 6 , O $ # # 5 8 KX.X~.~.~.).^.^.~._.",
+"A.A.C.C.C.C.C.S.S.JXPX1 # < 5 PXPXPXPXPXPXPXPXPXHXPXHXJXFXFXA.A.C.I.I.A.I.I.I.I.I.I.U.I.I.U.I.E.I.I.I.I.I.I.I.I.I.I.I.I.I.U.U.U.U.U.R.U.R.U.Q.U.T.Q.Q.U.T.Q.T.Q.!.!.T.!.T.Q.Q.Q.Q.Q.Q.~.!._._.!._._.!.!.!.!.~.!.!._.!.!.T.Q.Q.Q.R.Q.R.R.Q.U.R.R.U.R.T.U.E.T.U.Q.Q.E.R.Q.E.Q.U.T.Q.Q.Q.Q./.!._._.].(.].].[.).).[.(.[.(.].{.|.{.|.{.|.}.{.|.|.|.|.|.|.|. X|.|.XX}.|.|.}.|.R.XXXXDXGXGXHXGXHXGXGXHXPXPXPX5 , 7 O GX.X~.~.~._.(.^.).).",
+"C.C.Z.Z.Z.Z.Z.N.B.JXPXO 6 $ 8 PXPXHXHXJXJXJXJXJXJXFXAXJXAXS.S.S.A.I.A.I.A.A.I.I.I.I.I.I.E.C.I.I.I.I.A.A.I.I.I.I.I.I.I.I.E.I.E.R.U.E.R.R.I.E.E.E.U.E.E.!.E.E.E.!.!.E.E.^.E.^.E.E.R.Q.Q.E.^.^.Q.Q.^.^.^.E.^.^.E.^.E.Q.E.R.^.E.E.E.R.R.U.E.R.R.R.R.E.E.U.E.E.!.E.E.U.U.U.E.E.E.E.E.E.E.!.!.E.!.Q.!.^.).^.^.).).).).).].].].{.{.{.}. X}.OX}. X XOXOX}.OXOXOXOXoXOX}.OXOXOXOX}.T.[.|. X.XXX.XAXZXAXZXDXIXPX< , 6 $ GX.X!.!.!._._.~.!.!.",
+"Z.Z.Z.Z.Z.N.Z.Z.V.GXPX6 $ $ 0 PXPXS.Z.S.S.S.S.Z.{ { Y P Y ( ^ ^ ^ ~ P ^ ^ P ^ ^ ^ ^ P P ^ ^ ^ ^ ^ ^ ^ ^ P ^ ^ ^ P ^ P ^ P ^ P ^ / Q ^ ^ ^ ^ ^ ^ ^ ^ ! ! ^ ( ^ ^ ^ P ! ! ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ~ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ! P ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ^ ^ ^ ^ ! ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ P ^ ^ { J.'. X]._.).).).FXHX6 6 , 6 KX.X!.~.~.~.^.~.~.!.",
+"S.Z.Z.V.m.D.V.N.N.JXPX6 % 6 O PXJXS.S.S.S.E Y ( P ! ! ! / / ^ ^ ! ^ Q / ^ ^ ^ ^ ! ^ / ^ ^ ^ ^ ~ ^ ! / ! ^ ^ ^ ^ ^ ^ / / ^ / ^ / Q Q / / / / ^ / / ^ ^ ^ ^ ! ! ! ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ P ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ! ! ^ ^ ! ~ / Q ^ ! ! ! ^ ^ ^ ^ Q ! ^ / ^ ^ ^ ! ^ ! ^ ! ^ ^ ^ / ! ! ~ / ^ ^ Q Q ^ ^ ^ / / ^ / / / ^ / ^ / / ! ^ / ^ ^ / ! ^ / ! ! ! ! ^ ^ ~ ^ ^ ^ ^ ! _ Y.[._.).)..XHXO , $ 5 GX.XQ.~.!.~.!.!.!.!.",
+"V.V.N.Z.N.m.N.N.N.JXPX6 8 6 6 HXJXN.D.V.m.Y ! n P ! P ! Q ! ! ! ~ ~ ! ~ ~ ~ ^ ~ ~ ^ ~ ^ ~ ~ ~ P ^ P ~ ^ ~ ^ ~ P ~ ^ ^ ~ ~ P ~ P ~ ^ ~ ~ P ^ ~ P ! ! Q Q ! ! ! ! ^ ^ ( ^ ! ! ! ^ ! ^ / Q ^ / ! ! ^ ^ Q / Q ^ Q Q ! ! / ^ Q ~ Q Q ~ ~ ! ! ~ ! Q ~ ! ! ! ! ! P ( ^ ! ^ / Q / ! ! ! ! ! ! ! / / Q Q ~ ! Q ^ ~ ^ ^ ^ P ^ ~ ~ P ~ 9 P P Q ~ ~ P P ^ ^ ~ Q P ~ ! ^ P Q P ^ ~ ! ~ ~ ~ ~ P / ( / _ Y.$X^.(.@XKX6 5 O O GX.XQ.Q.Q.Q.~.~.~.!.",
+"N.V.N.N.B.m.m.N.N.GXPX< # 5 6 PXJXB.V.v.Y P Q ! k.c.y.e.e.w.w.e.w.w.w.e.w.e.w.e.w.w.e.e.w.w.e.e.w.w.w.w.e.e.w.e.w.e.w.w.e.w.w.w.e.w.w.e.w.w.w.w.w.w.w.w.w.w.w.4.w.w.w.w.r.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.e.w.w.w.w.e.w.w.4.w.w.w.w.w.e.w.w.w.w.w.w.w.w.w.q.w.w.w.w.4.e.w.w.w.w.r.r.q.w.w.w.4.w.e.e.e.e.w.e.w.e.e.e.e.w.e.w.e.e.e.w.w.w.w.w.w.w.w.w.e.w.w.w.e.e.e.w.e.w.w.e.w.w.w.a.q ] ! ( _ P.%X^..XGX6 # 8 # KX.X~.~.~.Q.Q.~.Q.!.",
+"N.N.N.N.m.m.m.m.N.JXPX, 8 O # PXJXD.m.Y ( ( ( c.<.w.w.w.e.w.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.e.e.e.e.e.e.e.e.w.e.w.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.w.e.w.e.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.q.c.N ! ( _ Y._.|.GX, , 6 # GXXX~.~.Q.!.~.!.Q.!.",
+"V.N.m.N.m.m.m.m.n.GXPX$ # , # PXFXD._ P ^ ( c.u.4.w.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.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.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.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.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.4.k./ ! ! _ J..XKX< 6 5 $ GX.X~.~.Q.Q.Q.Q.Q.!.",
+"m.m.N.m.m.m.m.m.m.GXPX< 8 , $ PXGXN.( P ^ c.<.w.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.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.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.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.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.r.c.( ! P _ XXGX< < $ $ GX XQ.Q.Q.~.Q.Q.~.!.",
+"N.m.m.m.N.m.m.m.n.JXPX# # 1 8 HXFXm.! ~ { <.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.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.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.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.w.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.e.e.e.e.e.e.e.e.e.e.e.e.e.e.y.c.( ^ P .XKX# 5 7 $ GX.XQ.Q.!.Q.Q.Q.Q.Q.",
+"N.m.m.m.m.m.m.m.n.JXHX1 7 O # HXKXE / ! k.w.w.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.4.e.e.e.e.e.e.e.e.e.e.w.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.w.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.e.w.e.e.e.e.e.4.e.e.e.w.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.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.c.( ! ^ XXDX< 5 # 6 FX[.Q.Q.Q.Q.~.Q.Q.Q.",
+"N.m.m.m.m.m.m.m.N.JXJX1 # 6 # JXZXY Q Q <.r.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.jXzXcXzXcXcXcXzXzXzXzXzXzXzXzXzXzXzXzXcXcXzXzXcXzXzXjXf.f.f.f.f.f.f.f.f.f.f.f.f.f.d.cXzXhXL.G.K.K.K.J.w k k j cXcXzXzXcXcXzXzXzXzXzXzXzXzXzXzXzXzXzXzXs.H zXzXzXzXzXzXzXzXzXzXzXzXh.f ; k j.> k k k hXj.hXhXhXj.hXNXhXj.hXhXcXjXM d.f.f.f.f.f.f.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.u.] / ! %XZX< 6 6 6 ZX{.~.~.Q.Q.Q.Q.~.!.",
+"N.m.m.m.N.m.m.D.V.FXJX1 6 < , JXAX^ / Q 4.r.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.eXcXd.d.d.d.d.zXrXcXzXeXqXqXwXrXrXrXxXd.gXd.d.d.zXrXf.7.6.7.7.6.6.6.2.7.6.7.7.6.7.6.d.rX9X} ) ( W ) W D NXbX2XmXgXd.d.d.d.lXwXmXqXqXqXqXmXeXrXrXrXrXrX>X>XnXrXeXrXrXeXrXqXmXqX9XrX3Xc a LXF u NXNX=XK BXkX8XcXBXzX8X<XBXvX8XzXzXS w.7.7.6.7.7.6.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.r.u.' / ! J.XX< 8 < < XXQ.Q.Q.Q.Q.~.Q.Q.Q.",
+"N.m.m.m.m.m.N.N.N.FXFXJXJXJXJXFXXXQ ^ Q 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.zX4.6.7.6.6.6.a.yXa.8.zXqXeXxXd.d.d.u.7.6.6.6.7.r.yXd.7.6.2.2.2.2.2.2.2.2.2.2.2.2.2.3.bX9X..X.;.X.O.o.m 8X5XiXzX7.7.7.6.6.6.xXeXqXqXqXqXqXgXd.d.d.lXlX>X>XjXd.d.d.gXd.lXwX9XnXlXd.,Xx r ,XkXr -XbX=XjXBX,X8XvXBX1X8XkXBX,X0X9.p.S t.2.2.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.w.q _ ^ v.J. X.X.X XW.I.~.!.Q.Q.Q.Q.!.Q.",
+"m.m.m.m.N.N.N.N.N.N.DXFXFXDXFX.XV.! / Q 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.a.6.2.3.4.2.u.yXxX5.8.y.yXyXf.7.6.6.6.2.2.2.2.2.3.d.y.6.2.2.2.2.2.2.2.2.2.2.2.2.2.2.8.>XB m m X.=.=.q * r y :XzX7.2.6.2.2.6.cXeXqXeXqXeXxX7.6.6.6.6.7.H H 7.6.6.6.6.6.7.jXaXtXt.9.h.l g 2Xj g X r 8X=Xs ;X8X-Xx A 8X2Xs h 8Xr.1.S t.2.2.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.N ^ ^ b.H.Q.W.W.~.P.Q.Q.Q.!.Q.!.~.~.~.",
+"m.m.m.m.m.m.m.N.N.N.N.N.V.N.N.N.B.^ ! n w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.mXu.i.rXrXy.4.d.5.t.eXa.d.d.z.qXrXa.6.2.2.2.2.2.2.6.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.8.y.H b J l ; [ =.X.D s.s.2XzX6.2.2.2.2.4.xXeXqXqXqXqXf.2.3.3.2.2.6.h.H 6.3.4.3.2.2.2.jXdXaXzXH 6Xc ;XxX7.p.CXb h h h -X8XhXgXgXhXgXgXhXgX6.a.F t.2.2.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.N ^ ^ ` H.P.Q.^.Q.~.~.Q.Q.~.~.Q.Q.Q.!.",
+"m.m.m.m.m.N.N.N.N.N.N.N.N.N.N.N.N.^ / ~ e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.eX<.3.lXlXt.6.6.6.4.lXt.6.6.3.lXlXu.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.4.u.xXrXS l M D * = { =.sXd h 2XlX6.2.2.2.6.zXrXeXeXeXrXzX6.6.p.p.3.2.6.p.H 7.jXdXkX8.2.3.a.aXpXgXa.3Xv x h i.s.J a . - K C A 9.8.7.7.9.7.6.7.7.p.S t.2.2.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' P ^ ` H.J.Q.~.~.Q.Q.Q.Q.Q.Q.Q.Q.Q.~.",
+"m.m.m.m.N.N.N.n.N.N.m.N.N.N.N.V.N.P ! ~ e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.mXz.6.6.6.2.2.2.2.2.6.2.2.2.2.6.6.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.4.cX,XC S S v 3 . . a : m ] x Z D F jX3.2.2.2.6.<XF S G G F h.6.8.p.p.2.2.6.H H 7.a.j.f.2.2.6.6.a.f.8.8.<.>Xl Z MX:X  y o e A 1Xs y.4.2.2.2.2.2.2.6.a.D u.2.2.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ^ _ H.P.W.!.Q.Q.Q.Q.~.Q.Q.Q.Q.Q.!.",
+"m.m.n.m.n.B.N.N.m.N.m.m.m.N.N.N.N.^ ! ~ 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.nXa.6.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.mXg s e e : > j k : : q | | w = : 3XlX2.2.6.t.H ; > X g >XH 7.2.<.a.2.2.6.s.H 6.6.7.6.2.2.6.4.8.7.p.p.7.p.b x S D - s a d 3 - l C >XbXu.6.2.6.4.9.h.S 4.2.2.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ! ^ Y G.J.T.!.!.Q.!.Q.Q.Q.Q.~.Q.!.^.",
+"m.n.n.m.n.n.m.m.m.m.m.m.m.N.N.V.B.^ ! n w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.cX4.2.3.2.u.eXl.8.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.8.y.eXh z.cXu > >.j 1.: > T =.=.q >.: 3XxX4.t.cXrX>X: j.t =X,XH r.2.2.6.2.2.7.M H 7.p.p.9.2.3.jXaXaXzXu.g.3.h.l g h.A g g e a l s -XX v h mXy.9.p.h ;Xg C a.4.3.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ! ~ Y G.P.T.!.Q.!.Q.Q.Q.Q.Q.Q.Q.~.^.",
+"m.m.n.n.m.n.n.m.m.m.m.m.m.N.N.m.N.^ ! ~ e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.y.7.u.rXy.4.lXa.mXz.6.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.6.u.xXmXnXh d.j . f w c f z > : { #.w >.: S G J G S >XC ; UXk.h ,Xv G h.r.2.2.2.7.s.H 7.<.1.3.4.lXsX@.@.aX4.6.d.6Xl A 9.p.NXMXs 3 CXb r k.K k 5X5X5X=Xg.f.Z 3 h j h 5.6.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ~ T H.P.W.!.Q.~.^.!.^.!.~.Q.~.!.Q.",
+"m.m.n.m.n.m.n.m.n.m.m.n.m.m.N.N.N.P ^ ~ e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.a.6.q.lXu.6.7.4.lXu.6.2.3.3.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.4.bXf.4.xXmXrX9X,Xl u V b b e s g l : >.U =.w >.: @ 3 y   x X @ X o o X e . . D G h.r.8.4.H H 8.6.8.1.H yX-.@.+.pXcX7.lX6Xl V 9.p.-X8Xt 3 J a   M k.d 0XwX0X2Xj lXg . p.f.:X5.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ~ ` G.P.W.`.~.~.~.Q.~.~.~.~.Q.^.~.",
+"n.m.m.n.m.n.n.m.m.m.m.m.m.V.N.N.N.^ ^ Q w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.mXy.7.t.mXa.8.2.6.2.2.t.wXwXwXz.6.2.2.2.2.2.2.2.2.2.2.2.2.2.3.lXa.xXrX=XD B x - X X g v d z.j l > >.T =.w >.: p | ;Xy 6XL . z v K X K <Xe & . C G H 3X3XH r.9.8.<.f.jXtX$.%.@.aX8.lX6Xl A 9.: e H . b . a - X X 3 G G >XC . u 3 - j hX=X5.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ^ _ H.P.W.`.^.(.!.^.Q.~.!.!.Q.!.!.",
+"m.m.m.n.n.n.n.n.n.n.m.m.m.m.m.N.B.^ / n e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.qXz.6.5.xXrXqXeXl.2.2.4.cXyXyXf.6.2.2.2.2.2.2.2.2.2.2.2.2.2.2.7.6.jXqX*X6X( . x v J -XS r gX=Xs > >.T =.q > d @ :./ . >X<Xe - d : o l d D ( o a e . C C v H C h.e.9.7.z.zXaXdXkX8.a.3Xl h 7.p.LXK b l x =X=X; c - l - s e v 6X,Xl . x 2Xt.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ^ _ H.J.W.~._._.^.~.~._.^.Q.~.!.~.",
+"m.m.m.n.n.n.n.n.n.n.n.m.m.m.V.m.N.^ / 9 w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.qXz.6.6.5.lXjXjXu.2.2.2.4.lXjXu.2.2.2.2.2.2.2.2.2.2.8.3.3.3.4.3.8.y.eX*X2X .@ - z ; ( J / / } m n { O.=.w : i @ & & ) ) ) m e e   y X - C ,XX sXBXX a s . S S C G C h.e.9.s.f s.u.9.h.b A i.s.6XvXa 3 J J d J j.; e p.x.g V eXqX>Xe h ;Xu.2.2.8.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.q.' ^ / Y H.P.W.~.^.(.~._._.~.!.^.~.!.^.",
+"m.m.m.m.n.n.n.n.n.n.n.n.N.N.N.n.m.^ ^ ~ 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.eXz.6.2.2.2.6.6.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.5.5XG H H H H H G G r r - b e ; m o.( ;.) o.( | -.-.=.w = K IXkXP =.=.=.U : Z j jXe b l u X :.W r z.gXB c A J V S C G H M : z G H C l ;X4XV e a l l G 1Xo M k.; a j gXg C eXMX5Xp.f.:X5.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' / ~ _ H.P./.^.^.(._.^.(.^.^.^.~.~.~.",
+"m.m.n.n.n.n.n.n.n.n.n.n.n.N.N.N.m.^ ! P w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.cX5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.t.eXD . x r X @ y u . : . * = ] =.R : p m i i w w { =.{ m M CXJ ( =.&.=.q > ;Xd h e - a - X % F @ s.jXr - LXv x V 3 o - x - l 3 l . V Z B a g s a . r k       r e r r   x h =X=Xj gXh 5.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ^ ~ ` H.J./.^._._._.(.^.^.)._.^._.~.",
+"m.m.N.n.n.n.n.n.n.n.n.n.n.m.m.m.N.^ ^ n w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.z.7.6.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.t.qXC B LX3X% | *X. z IXk.= w +.Y = > p | =Xe ; * X ) =.' X . l b ;.=.Y ,.> C S D D ; k.,.% BXNX, * - l e 6X1X. J v o J K ; l K v X f w ( m | | ( v } ( ..| ..} b | | | ) ) | ..:.} 2Xl.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ^ ! _ G.P.W._._.).^.).)._._.(.~._._.",
+"n.B.N.n.n.n.n.n.n.n.n.n.n.m.m.m.N.^ ! n e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.y.t.qXy.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.u.eXD e aX:X& ) m - b sXp.0 @.pXzX,.; % ) n e @ ( X ) =.;.N - l o ( =.w > M X s e e > f s.7 W W 2 >.> v . r r X J C   k.k.; u N v r 4 { ;.v ( ' n v ( m ) ' ( n m ' ( } ( ' '  .| -.pXwX4.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' / Q ` G.Y./.).).).).(.).).^.).^.^.^.",
+"N.m.m.n.m.n.n.n.n.n.m.n.N.m.m.m.N.^ ^ ~ w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.l.4.zX<.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.zXS . a e . @ @ x l X X / ' G ,Xz z @ @ @ l @ W L D $.=.( c L.M ( =.( VXCX  z.jXi l * * * 4 & * ; k <Xu aXfXr @ . . X X . B ;X:Xh | +.q ; > d * a o s r   t r s h c h d r r r jXF.pXsXl.6.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! / _ H.J.W.).).].(.).).).^.^.).^._.",
+"n.N.n.n.n.m.n.n.n.m.n.n.n.N.m.m.n.^ ! P 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.y.6.6.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.6.5.S e x e X d a * : n ;.: j ,Xs.G : j f : z @ & = k sX@.;.D UXj.^ =.( CXJ   d.hX- 4 : >.> 1Xv o BXi B e 1X6Xt z : = f G J jXMXfX .z : = - k.=Xr iXy f gXt d gXg C H 5Xh gXt h t.7.d.pXbXy.8.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ! Q _ G.W./.).).).).).].).{.^.).)._.",
+"m.B.B.n.n.n.m.n.n.n.n.m.m.m.m.m.N.! / n w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.a.6.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.6.y.C i aX3Xo   h = w *.) d h s.7.9.k s y = > w > >.k m n | ) | ) ) =.0 * - X i e ; z > >.* 6XG X J r . l a e u : = > ; r H u.kXdXX.: >.: ; j.j.M j.d g k g h f t 3 a :Xh d r B y.6.y.tXpXpXxXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ! Q ` G.J./.].).].].].].).].(.{.^.(.",
+"N.m.m.m.n.m.m.m.n.N.m.m.m.m.m.m.N.^ ^ 9 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.bXu.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.4.cXbXC B aX:Xy B h 0 *.{ d d.=Xp.7.9.m ) =X* >.z = = M IXK % =.=.*.*.-.{ 4 l v . l y e z : ; X r y h X . l 3 l l ; * 1XJ X V <XJ ) m k : 4 z ; 4 - - a G r p.gX;Xx e p.f.=X5X3XZ 5Xt.6.y.kXsXpXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ~ ` H.W./.].].].].).).].).].).].(.",
+"n.N.N.n.n.m.m.m.m.n.n.N.m.m.m.N.N.W ! ~ 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.eXz.6.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.cX,Xv e l e . h ( #.T z d p.g j 9.e.m ) ( k s.d f j H CXJ ) =.=.%.%.%.=./ VXCX& ;.iX- : : : v BXx h b K v X c K v o ,X>X. m )  .s.;Xd N sXn l @ . v b b e s.lXg v A f lX;XqXxX,XZ 3X4.2.7.l.tXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ^ Q _ G.Y.'.].`.{.).{.).].).{.].].).",
+"m.N.m.m.m.m.m.m.m.N.m.m.m.N.N.N.N.^ ^ n w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.nXa.6.2.6.2.6.2.2.6.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.y.C . s e l z >X} ( 4 z e V V <XH >Xx @ @ B >Xb D ;Xa . X w Q ) *.%.%.*./ CXH o :.( * >.= : b K a . l N v e l J V . ( ( @ ( -.j.9.s./  .NX8 K J X a - t X u e . C S e e s eXr.d.2XZ i.2.2.6.y.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ^ / _ K.J.[.|.{.{.{.$X$X).].).).].].",
+"m.m.m.m.N.m.m.m.m.m.m.m.m.N.N.m.N.^ ! n e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.qXqXxXxXxXxX4Xy.u.xXa.6.6.6.2.2.2.2.2.2.2.2.2.6.t.xXC d z.<Xe | { >Xh p.f i r @ . u : : = > > > > > = > : l UXkX0 =.%.%.*.) ( ! L :.:.: >.>.> l X e a d X X a ; > :.X.O.q D K fXe.8.s.L W ( L ,X1X. e p.gXg v H h.>Xl C ,X6XrX9.f.tXZ t.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' / ! ` H.W.(.{.{.{.].{.).).].{.].].].",
+"N.m.m.N.N.N.m.N.m.N.m.m.N.N.N.N.m.^ ! ~ w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.s.<XjXjXwXeXeXwXbXeXmXcXxXxXxXy.2.2.2.2.2.2.5.cXqXeXV d f.-Xa O.dXMXh f h l y 6X( @ = = * : = = >.>.= >.: b BXp.I *.%.%.%.*.=.=.=.;.%.O.T R N m | | N v ;.| } w O.O.q _ h.K x ;XH j 6X- * < o   e X u s.gXt G r.7.z.G G xXzXjX9.f.6XZ t.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ^ / _ H.Y.'.{.{.].].].$X[.].).).{.$X",
+"N.N.N.N.N.N.m.N.N.m.N.N.N.N.N.N.B.^ / 9 w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.4.k.LXUXh.xXeX9XeXeXnXeXrXeXeXyXf.6.2.2.2.2.2.4.xXeXqXC Z 2Xm i m g h r r r 3 y 3XsX@ f f VXCX* = = > ; = : X o o L *.*.%.%.%.%.%.*.) ) @.=.=.' | O.q M M q q w v q > ; BXNX! 3 J b g 6X; J j.* J K ; 3 a a . C 4.2.7.s.S y.7.6.2.z.3XZ t.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.' ! n ` K.Y.[.].].].}.].].}.].].].].].",
+"N.N.N.N.N.N.N.N.N.m.N.N.N.V.N.V.N.^ / n e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.M VXx.p.5X5X5X4X5X5X5X4XmXeXbXy.6.2.2.2.2.2.2.u.eXnXC 4XaX#.( = k.; . M J @       . f c VXz ; j d BXVXd f i $.( P =.*.%.%.%.%.%.*.) |  .q q M q = = ; w > : : 4 > * 2 W ( L l J C h ,X. k.k.o k.k.; C ,X,X<X6Xu.8.f.6XC xX4.2.2.6.a.Z t.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' / n ` K.Y.(.].].{.].].].}.].[.}.].{.",
+"m.N.N.N.N.N.N.N.N.N.N.N.N.V.N.N.D.^ ^ ~ e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.p.vX1Xf 5X5X0X4X4X4X4X-XmXrXf.6.2.2.2.2.2.2.2.t.mXeXC sX+.pXF * 1.H X M z X 1.h.*X- : - u - x A s v v k f % X.:.& { =.%.%.%.%.%.=.o.N 1.= > ; d : ; r s ; ; - . u : : < < 4 d . . t C @ . f h h s . G eX>XH ,XV f =X0XC cX3.2.2.6.a.iXt.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' / / ` K.Y.[.].{.}.].}.].{.].}.}.].{.",
+"m.N.N.N.N.N.N.N.N.V.N.V.N.N.V.N.D.^ ^ 9 e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.H jXH j mXMXnX9XnXnXMX5XqXrXa.6.2.2.2.2.2.2.2.5.qXeXC X.) Z t o o     o o @ M UXM l v : : : : 4 - X u ; 4 X o . ; ^ =.%.%.%.&.{ 9 ( 4 * > a > 3 @ a NXbX; = 1.J . S ,X,X>Xd z v l e e . H e.d.3X>Xx C G 3 . a =XBXz g S u.2.2.2.2.g.Z t.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' / / _ J.Y.'.].].].].].}.].$X].].].{.",
+"N.N.N.m.N.N.V.V.N.V.N.V.N.N.V.N.D.^ ^ P 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.mXnXeXnX,X>X>X>X>XA S g 4XyXf.7.7.6.2.2.2.2.6.y.eXmXC 6XC % } iXe b BXK u D   o   o l = >.>.>.: z : > : 4 > > VXCX4 { *.%.%.#.w > IXsX  M - VXUXo e NXMX  = ,.H e C ,X,X>Xa X X X 1XfXr H e.p.D G a - s =XBXx h K x X C t.6.2.2.6.f.Z t.6.2.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.w.' ! / ' H.W.[.].].].].].}.].{.{.{.].{.",
+"N.m.N.N.N.V.N.N.V.N.V.N.V.N.N.V.V.^ / ~ 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.bXqXqXwXv >X,X>Xl v K X 5XeXnXcXxXa.7.7.7.8.t.xXnXnXC f c % ) m - % | L l Z j 4 J > . > * * * - = >.,.>.: > : VXJ * R =.&.%.=.' f VXK k f l BXk.> . > * = > h h =XG - * ; X l J X sX6Xs J <XV S 0X3 BXl h K l . h =Xg C 4.6.6.7.a.5Xh u.8.8.9.z.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ! ~ ` H.Y./.].].}.}.].].].{.{.{.oX{.",
+"N.N.m.N.N.N.N.N.V.V.V.V.V.V.N.V.V.^ ^ P e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.bXnXnX0Xc A ;XuXd x vXa 3XqXh ,X;X0XzXj f d 5X2X;Xh x = z @ @ @ x @ @ @ l Z k ; j.f . j : VXm . > > * = : 4 ; . - > _ =.&.%.+.-.V ; b ; z l . X . z : : : f ,X<X1XS ; c.*Xo z M X 2XA . s z m kXsX3 K a X X . l ,X,XC S t.a.cXzXeXsX..pXL.L. .pXw.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ! n ` K.J.[.].{.[.}.].}.}.[.{.}.{.{.",
+"N.N.m.N.N.N.V.V.V.V.V.V.D.N.V.N.V.^ / 9 e.e.w.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.4XA >Xs e K N g c Z =X=XwX0XM K : =X4XiXsX& ;Xf a.* u >.= : M x r e . x u :X4Xh ;X=Xl f : CXj.X v kXz * : - l v . l @ ) *.%.%.*.sXf : ; > . X l b l l d . e u e - b - UXj.X ; X a 3XH d k q  .NXP b j =X;X,X1X>X3 X X s xXmXtXsXdX*.pXpXsX.. .L.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! / ` H.'./.{.{.{.].[.}.].}.{.{.}.{.",
+"N.N.N.N.V.N.N.V.m.V.D.D.D.N.N.D.N.^ ! ~ e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.4XJ v . . K v . l mX5XeXrX0XM j.M 2X5XG 1XG =X: h.: e : > > c h a.h r hXh 3XnXmXnXyX>X= = * ; 3 m VXL.k c 3 VXCX. j.z :.*.%.%.%.#.K 1.* UXUXo CXVX@ a 3XL r h hXt C e k 3 ; g c b b z d V K W ) :.5Xr.lX6X,X,X>Xl 3 J D 9XwXpX&.pXsXg 9Xy.6.8.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.w.' ! n ` K.J.[.|.{.{.}.[.{.}.{.}.{.}.{.",
+"N.N.N.N.N.N.N.V.N.V.V.N.V.N.V.N.V.^ / 9 e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.xXC J s l . X . d >XA >X,X>X; ; ; >X,Xx l e >X; a ; a v v : > d x.<Xt k d 2XmXeX6X>Xv : : = = z > >Xf : f b VXM . VXj.( =.%.%.%.%.-.M * BXk.* VXK X z 1X1Xg d f =X,Xv H x c d H S - 3 . C G 6 < b 5XH H 3 l e a 3 4 M e sXpX@.aX9X5XB xX3.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ~ ' K.Y.'.|.{.{.{.{.}.{.{.{.{.}.{.",
+"V.V.N.N.N.N.V.N.V.V.N.V.N.N.N.N.m.! ! n e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.<X- . . c >X,X>Xs z H G l l h a l l l l x x l x x x x x x > > . r g h :X3X4XeXeXC H h.H C ; > f > k ,.>.: l u - X J M ( =.%.%.%.%.=.K z B e X a - - a x a s A V G A d 3 j A @ s t K v X >X>Xe r a e e u r h hXr s d 0 I =.pXaXeXbX4XZ u.2.2.2.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.w.' ! ~ _ H.Y.[.{.{.{.}.}.{.{.}.{.}.{.{.",
+"N.N.N.N.V.N.N.V.V.N.V.N.V.N.N.N.B.^ ! P 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.- l 3 G v wXnXnX>Xl =XZ X s r - A :Xz J F e h =Xr e X > ; r r =X<X;X;XB 4XnXnXeXS h.7.r.h.H H H M > > = : a - b - . X ( =.%.%.%.%.%.&.-.-.sXx - X r d - b z z n K m h A 5X<XJ v o 1X1Xt MX0Xh jXr . s.jXt k f t ..pX-.pXsX9XrXxX4.p.Z u.2.2.2.6.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.q.' ^ ~ ` H.W.[.{.{.|.{.}.}.}.}.}.{.}.|.",
+"N.N.D.N.N.N.N.D.V.V.V.N.N.N.N.m.N.^ ! n w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.4.v J . 5XC wX0X:XA a =X5XM F.: - wXeX| NXkX0 C V V K . k f J K g 0XnXnXV 3XrX9XnXS a.7.2.6.8.9.e.h.G C : 4 3 VXCX. j.z :.*.%.%.%.%.%.&.+.&.*.G j.M X - CXVX. Q  .NX! v A H s 1X1X  =X;X;X9X0Xd j r s k f h } sX| #.pXsX9XrXbXzXa.zX5XV xXr.7.7.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.q.' / ] ] G.'.[.].].}.{.{.oX}.oX}.}.{.{.",
+"N.S.N.N.N.S.N.D.N.N.N.N.N.N.N.N.N.^ ! ~ w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.M J s 3XC 3XA A A c <X9XH k.M - qXrX) ) W p vXv . LXs k k J J - ,XMXnXA 5XnX9XrXS s.7.2.3.1.p.<.7.e.h.G V b VXM . VXj.( &.%.%.%.%.%.%.%.%.*.} UXkXa l CXj.  n ( ( :.<X<XA s =X=X2XMXMX9X9XqX} } }  .} } | *.pXpXsXuXbXxXzXq.7.f.yX3Xs ,XA s.j jXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ^ ~ ` K.Y.[.}.].}.}.oXoX}.}.}.{.}.{.",
+"N.S.S.N.N.S.m.D.N.V.N.V.N.N.N.m.n.^ ! n 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.h h h wXC s 3XnXx . h =XX ; X c >X,X4 < < . x . X a . = > ; . e >X3X>Xx S ,X,X,XC G H a.9.p.f H g.6.6.e.G 3 3 ; X M J ) =.%.%.%.%.%.%.%.%.*.) | | 4 m ! ( b m W W ' sXpXsXF pXsXpXpXpXsXpXdX%.pXpXpXpXpXpXaXyXbXxXzXt.6.6.2.6.f.3XZ ;X;X:X:XZ ;Xw.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ^ ! ` H.Y.'.].oX}.}.}.}.}.{.}.{.}.oX",
+"N.N.N.N.D.N.S.N.N.N.N.N.N.N.N.m.N.^ ! n w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.xX3X-X<Xl x nXnXl k f.;X3 e x . l . e X X . X z >X>X,X1X>Xu e a . - h g 3 3 3 l l c D S h.z.9.p.1.6.8.s.C G ,XS >XA sX=.%.%.%.%.%.%.%.%.%.*.$.pXpX} K pXdX} K SXpXpXpXpX .F pXpXpXpXpXpXpXpXaXnX9XnXrXrX9XmXzX4.6.2.2.2.2.2.7.d.3X6XnXrXmXmXrX3Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ^ Q ` K.Y.[.].}.[.{.oX}.}.}.{.}.}.{.",
+"D.N.D.D.D.N.S.D.V.V.N.N.m.m.N.N.m.^ ^ ^ w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.d e =X=Xa B <XZ u ; p.g - b aXC . h sX& - b v u 4XnX2X;X8XA zXr l K g 5X:Xs V j A ;Xx v D >Xa.6.2.2.3.H S H xX4X0XMX6X+.%.%.%.%.%.%.%.%.%.=...2X5XC c =X,XS g 2X;X=X=X2XV >XMX9XbXxX9XeX9XrX9XrXxXxXxXxXzX5.6.3.2.2.2.2.2.7.z.wX5XeXmXcXi.a.mXeXr.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' / Q _ H.Y.[.].].}.{.{.}.}.}.{.}.{.{.",
+"S.m.N.S.N.S.N.N.N.N.V.N.V.m.N.m.B.P ! ~ w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.a C v h s v K X . k d.=X. 8 | L . G 1XV - k.- @ wXnX>XJ s g LX. l K . 3XMX>Xh.9.t.jXA ;XC v S a.6.7.8.H ;X,.k =X=X4XaX+.%.%.%.%.%.%.%.%.=.;.n C >XG - BXVX. @ } ( o L.VX@ v 4XqX4.7.d.xXxXxXxXzXr.6.2.6.6.2.2.2.2.2.6.6.z.zXnX4Xx eXy.7.2.7.d.rXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' / ~ _ J.J.[.].$X}.}.}.}.{.}.}.{.}.{.",
+"V.V.N.N.V.N.N.V.V.N.N.m.V.m.V.m.N.^ ( P 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.a D vXb . V CXe X f d.<Xl x p D x l l e X * X d >X<XK J . o x . . . . S ,XC p.7.6.7.r.5X;XD D S H lXxX>X= >.; aX,X=XaX=.%.%.%.%.%.%.%.*.O.m d h 2XA l VXj.X i o.W X CXj.r C c 4XcXd.2.3.6.3.2.2.2.2.2.2.2.2.2.2.6.a.jXzX3X,X2X;XZ mXt.6.2.6.z.rXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' / ~ ] G.W.(.].{.}.{.}.}.{.|.{.}.{.{.",
+"N.N.V.V.N.N.V.N.N.N.N.N.m.m.m.m.n.^ / P w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.a . x . u   r =Xc   t   l :X2X=Xv . e r . b u d S u r t h A l l - S >X>Xb S a.7.p.<.6.3.zX;Xe c C S 6XS > >.- aX6XS -.%.&.%.%.%.%.%.%.;.m C >Xh j a . X   X X & @ o X   g qXv x 4XyXlX2.2.2.2.6.6.2.2.2.2.6.6.6.l.nXyXwXB A ;XA 6XrXt.y.jX3.f.rXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' / ^ ` J.J.[.{.{.{.}.{.oX}.{.}.[.{.{.",
+"N.V.V.N.N.V.N.N.N.N.N.N.N.m.V.m.N.^ ^ ~ e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.d @ a . l K F h x g kXc . % } y a m } y > j.: @ 4XG v A bXrXG J - 2XMXMXS h.7.3.p.1.7.2.4.cX:XZ C f 3 4 * = o t ;X7X=.&.&.&.%.%.%.%.*.} V 6X0Xk j e l ) iXr 3 BXVX. ) iX*XmX4XV b 4XnX3.6.2.6.a.lX3.2.2.6.a.jXzXnXeX5X;Xs mXMXrXqXcX3.a.xX8.a.rXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ~ T H.Y.'.{.{.{.{.}.{.}.[.{.{.{.{.",
+"N.N.N.V.N.N.N.N.m.N.N.m.m.m.m.m.m.^ / P 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.a C G X . j.v . 3 t ;X;X- L | J e L ) m z j.M a 4XA aXJ 2X9XC N x t :X;XD p.7.2.4.a.<.6.6.4.mXwXZ f M > : j.a ;XMXaX=.&.&.&.*.*.*.=.;.J G 3X>XZ 2X>X@ ) } a l VXj.o ) ' A rXnXwXC x 4XxXd.3.7.lXrX4.6.2.6.lXyX4X:X,X:XA A Z ,XwXl.7.6.6.y.zXbXqXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ! / ` J.J.(.|.{.{.{.{.}.}.{.{.].[.{.",
+"V.V.m.N.N.N.N.N.m.N.n.N.m.m.m.m.m.^ ^ P e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.a V CXe l . X e a e g e x @ $ @ x @ @ @   ; X l G n N s 5X9X;Xg t y 0X,Xe p.6.2.4.p.3XzXlXzX9XeXqX=XD v v VXj.h 7XX.X.X.) X.X.X.X.X.( - ; ; . G ,X>X@ & @ i i l - o & @ x ,X,X,XS 3 c 6XyXlX6.d.rXcXd.3.<.,X<XV A ,XyXeXeX3XB A zXjXlX8.a.rXeXqXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ! ^ _ H.W.(.{.{.].[.{.].}.{.}.[.}.{.",
+"N.V.V.N.m.N.N.n.N.m.N.N.m.m.m.m.n.^ ( P w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.d   B e 3 z  .N d a e - X X . X ; - . e u S >Xv ^ NXlXaX9XwXeXeX9X2XLXCXx k.6.2.2.u.qXrXrXrXeX<X;X>Xs C 3 G M j % ) ) ) ) ) ) ) :.n m ; j.BXX l 3 . ; : : : : : 3 b i - x G >X>XA >Xc v 4XrXcXmXrXrXrXzX,X;XA 4XmXxXxXeXeXnXeX:XZ eXyXt.7.d.rXqXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ^ _ H.J.[.{.).|.}.].}.].{.|.}.].{.",
+"V.N.N.N.N.N.m.m.m.n.N.N.n.m.N.n.N.^ ^ ~ w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.- >XBX3 m _ NXkX% Z aX=XX l b = j y   f.<X5XMXH W  .W aXMXnXnXeXMX:X=X=Xi s.7.6.6.8.mXqXqXqXeXC CXCX. c C B j k } =.*.+.=.*.=.%.F z : c VXj.> 4 F.@ X ,.= * * = = s 3XL r yXwXkXmXaX0XC G nX6X,X,X4XeX4X3XrXnXu.6.3.6.f.bXqXqXeX:XA eXcXlXxXrXqXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ] ` G.'.(.].{.{.}.}.}.}.}.}.}.{.{.",
+"V.N.m.m.m.m.N.m.N.B.n.n.B.n.n.B.n.P ( n 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.- ,XLXx b W  .W @ D LX:X- J - k.VXd d x.h g uXH & & + S <X<X<X,X:X2Xh <XC ,Xf.p.<.8.xXeXeXeXeX>XVXN h :XV v K F | &.%.%.+.=.%.m z = > e   o X ; <.c.D hX* v G   : v 1X1XZ yX1X .NX} rX,Xc :Xg ;XA 5XxXu.8.d.rXjX3.2.2.2.8.gXrXmX4XB 4XnXyXnXnXnXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ^ ~ ] K.Y.'.{.{.{.}.].[.].[.}.].{.{.",
+"N.N.m.N.m.m.m.m.N.n.m.B.n.m.n.n.n.^ ! P w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.d g =Xh b m n m b e i r X * o * v > X t J J h s s 6XM X ; N : . h 7X& - G xXH > 1.8.bXnX6X3X<Xa l - A 3Xg V | =.=.=.&.&.@.O.m l ; * ; . p.= X - > 3 D f * F ;Xu x . .   r 2XF ) ' ) 3Xa l :X0XxXu.3.2.2.2.6.d.bX4.2.2.2.6.f.yXeXnX,XA 2X,X,X,X3Xw.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ^ _ H.Y.~.{.$X{.].}.{.].].].].{.{.",
+"N.m.N.N.m.m.m.m.n.m.n.n.m.n.n.n.n.^ / P 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.s qXeXwXC =X-X2Xc u e - b 7XG i e r S l K J . 3 g =X;X@ : F f - J 1XF a h.9.i.p.<.8.5X6XC l u a . u u 3 l a / | ) ) | ) | m : - } ! X ; k.p.- l i X c C u o o   X 6X% o ) *Xr m P b A 3X,XxXt.2.2.2.2.2.2.2.2.2.2.2.2.2.6.a.mXeXqXqX2XV A A A A e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ^ ^ _ H.Y./.].{.{.].}.].].].].{.].].",
+"N.N.N.N.m.m.m.m.m.n.N.n.N.n.N.n.n.^ ! P 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.d mXnXwXl B aXZ . f f.=X3 4X0Xm } *X2XC X o   u . r r . * y   - b b r 3 >Xp.h.z.7.3.H - 3 B j h r | % X V s K L. . . . .J >Xj 3 X.W @ - ; a . 3 ' 4 g 6XS i ) iXy 1X1XX W | Z 4X:Xh wXmXu.8.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.7.lXrXwXmXeXeXeXnXeXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ^ ! ` G.J._.].$X].].].].].].].].].$X",
+"N.N.N.m.m.m.n.m.m.m.n.n.n.n.n.n.n.^ ! ~ e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.g wXmXmXx S LX:X@ f x.<Xu 5X-XL | v =Xc h NX:XB S S S S S S S a . . l S H S C G <.9.S 3 VXCX: h @ o.:.. A s  .SXBXSXBXSXK ;X6XD % % u l - r l ; <.c.i nXMXS )  .l G A t p @ e h A wXrXxX3.2.2.2.2.2.2.2.2.6.2.2.2.2.2.2.2.6.y.mXrXl.8.gXyXqXqXqXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' / ! _ G.W.'.].).{.$X].$X].].].].].].",
+"m.N.m.m.m.m.m.n.n.n.n.n.m.n.n.n.n.^ ^ P e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.c wX9X,Xv r x r a r g a s ,X3X@ & @ >Xx h NX3X2XnXrXeXeXnXnX9XZ aX:Xu h.9.y.>Xc >XjXD v VXH : <Xo & o a F ( n b m n } d ; l e . e u u @ ) *Xr d k t *XeXnXZ & & g eXeXnX4XV ;XwXeXeXeXqX3.2.2.2.2.2.2.2.z.d.3.2.2.6.2.2.2.6.a.wXxX4.2.z.mXqXqXqXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ^ ! T G.Y./.).).].{.{.].].).].].].].",
+"N.N.m.m.m.m.n.n.n.n.n.n.n.n.n.n.m.^ ^ ~ e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.d wXwXv e u . C d G V G d C H H A H G b e -X=X5XnXeXqXqXqXqXwX;XaX6Xu a.6.6.u.S 4 : 4 3 z - f j a j.. 2XpX@.=.&.&.=.=.w > h h a } p X @ )  .3 *X8X8X2XnXnX:X( *X*XmXnX4XA B nXeXeXmXbXzX3.2.2.2.2.2.2.6.f.qX4.2.y.lX3.2.2.2.2.3.3.2.2.2.8.d.rXqXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' / ! T H.J.W.).).].].).).].$X].).].].",
+"m.N.m.m.m.m.m.n.n.n.n.n.n.n.n.n.m.P ^ P 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.d mXqXc d f.=X5XC :X=X:XD f.3.4.3.4.l.>Xv 4XnXnXmXnXmXeXqXqXqXh ;X;Xx p.6.2.4.G * = a s e l S Z C UXj.S dXO.O.*.*.O...q ; :Xf 4 o.:.u . & & . *X8X2X*XmXnXF W } A nX2XB A Z ;X3XbXt.7.6.6.6.2.2.2.2.2.2.2.3.2.2.f.qX4.2.2.2.2.2.2.2.2.2.u.xXeXqXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ! _ G.P.W.`.).{.].).).].).).].).).",
+"m.N.N.m.m.n.n.n.n.n.n.n.n.n.n.n.m.P ( P e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.g wXwXx f x.<X2Xx d f.h x a.6.2.2.2.6.l.F ,X3X6X3X3XqXeXeXnXnX5X3X3XD p.7.6.4.H e <Xh t h d l l l K c ) O.,.q =.O.,.: h h =Xt   & & @ l j.VX- d t h 3XrXrX2X@ & g 2XV wXnXqX;Xg ,XzXd.d.lXf.3.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.2.2.2.2.6.z.yXeXeXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ^ ~ _ G.Y.W.].).{.).].).].).].).).].",
+"N.m.N.N.m.n.n.n.n.n.n.n.n.n.n.n.n.^ ^ n w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.d wXwXx e =Xh 4XD f x.<Xi a.6.2.2.2.7.q.c : . u 3 b ;X=X2X=X:X=Xc F G a.7.2.4.J t k f y f k h d c ;Xc ' w : v.O.w > ; :X;X} Q o } / X b VXj.X m L.NX} nXeX3Xh A g g 4XcXu.lXyX3Xs 6XrXyXrXqX3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.6.u.d.d.mXl.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ^ ~ _ G.P.W.).^.).).).).).].).).).).",
+"N.m.N.m.m.n.n.n.n.n.n.n.n.n.n.n.m.^ ! ~ w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.s qXnX>Xv <XeXeXc r t y x a.6.2.2.3.1.zX,.= ; f.=X. s aX;Xr aX:Xe d.9.3.2.2.3.S = k.d & ( k.f k 7XaX ./ v ( o.w k B x g p o.W & o.W . c S B g } ) K ) MX3XZ 4XnX3XH t.8.2.3.lXeX:XB ;X3XeXmX3.6.2.2.2.2.2.2.2.2.2.2.2.2.2.2.6.2.2.2.6.a.rX5.8.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ^ ^ _ G.J.~.(.).(.).).).).).).).).).",
+"N.m.N.N.n.n.n.n.n.n.n.n.n.n.n.n.n.^ ^ ~ 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.d :X2X2Xv h 3X:Xc d j g b a.7.6.6.u.H 0X,.= k x.<X- D LX3Xe LX6Xe p.9.6.7.8.lX7X= 1.H & D q v 7X;.$.dXdXm J N c a ; z x r % @ X % @ X A 3X3X6XC O + m 4XZ G r.9.H :Xd.2.2.2.2.4.jXrX:Xs ,XnXzXf.2.2.2.2.2.2.2.2.2.2.2.2.2.y.d.3.2.2.2.6.3.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' / ! _ G.P.W.).~.].(._.^.).(.(.).).).",
+"N.N.m.n.n.n.n.n.n.n.n.n.n.n.n.n.n.^ ^ ^ e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.a h NXh @ k s.h x t p.g z <Xp.p.p.jX4X4X: = ; g s 3 e i r r i e u >Xp.p.p.h.6XC X o - o r = Q O.;.1X4X=Xr ..sXr t > > V g y   r y g c x A Z A A h h A V A 4XlXz.p.2XbX3.2.2.2.6.8.jXyX3XB 3XrXyXlX6.2.2.2.2.2.2.2.2.2.2.6.a.eX4.2.2.u.d.3.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ^ ! T G.J.T.^._.~.(.^._.~._.^.).^.).",
+"N.N.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.P ^ ~ e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.a -XNX:X. f x.<Xx :XZ g x b x v x i x b x D l l 3 V S C C D C C H C S S S S v x l x . 3 l D F l l . m N m ) aX;X( m . @ } *X  ( t *X,X,XcXu.cXcXt.4.4.r.xXrXyXcX9.xXxX3.2.2.2.2.2.3.lXrX<XB ;XqXrXlX6.2.2.2.2.2.2.2.2.6.y.d.3.6.2.6.f.rXt.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.w.' / ~ Y G.P.T.).~.~.^._.^._.^._._.^.).",
+"N.N.n.n.n.n.n.n.n.n.n.n.M.M.n.n.n.P ( ~ 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.s r h r a r h r a A d d d e r e e X r r ; d - B Z Z gX9.9.9.3.9.4.4.4.4.9.l.G h h h - BXBX-XdX/ K BX( SXJ ^ sXp o.W . % ) } & X.} ;X,XH 3.7.6.6.6.2.2.6.lXxX4.8.<.4XbX3.2.2.2.2.2.2.6.jXeXeXA ;XeXrXgX2.2.2.2.2.2.2.2.7.f.qXz.d.3.2.2.3.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.w.' ^ ^ Y G.P.T.!.!.!._.~.^.!.~._.).^.).",
+"N.N.n.N.n.n.n.n.n.n.n.n.M.n.M.n.n.P ^ ~ 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.-XV A h ; a d l - f ,.>.= o d g u = k.- = ,.z xXnXZ H f.p.p.p.f.u.6.2.3.<.lXG t : k x IXM A -.n J K ) / g S c i p p u u p p r p p 2X,X>XlXgXlXa.6.6.8.2.3.z.a.7.h.;XxX6.2.2.2.2.2.2.2.2.4.lXrXA ;XeXyXlX6.2.2.2.2.2.<.d.3.3.f.rX5.2.2.2.2.2.2.2.r.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.' ^ ~ T G.J.W.!.!.^.!.~.!.!.~.!.^.^.).",
+"N.N.N.N.n.n.n.n.n.n.n.n.M.M.M.M.m.P ( P w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.cXCXkX8X=XJ G h c > = = = r d h u ,.k.H * = z 3X6X,Xx B x B i Z ,Xu.6.4.f 5XS $ H ;   m 4 ) -.b r x { } 5XuX>X>X5X4XA >X4X4X6X5X5X6XS G 4X6X6XeXgXgXz.2.7.zXxX7.f :XrXf.6.2.2.2.2.2.2.2.2.6.zXrXA ;X3X3XlX6.7.2.2.6.f.rX4.2.2.3.2.2.2.2.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.' / ^ Y G.P.T.^.Q.^.^.^.^.^.^.!.^.^.).",
+"N.n.N.N.n.n.n.n.n.n.n.n.n.n.M.n.n.! ! n e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.jXBX1X8X0XBXvX8XV @ e u b - b 3 l o o   l l l 3 ; - u . . a 3 . b s.7.7.9.z.S @  .f . ) -.dX,X-X4X=XpX .6XCXS - - . d d l l x G v 3 l c G S c G 6X6X6Xa.7.7.8.7.s.,XrXbX7.6.6.2.2.2.2.2.2.6.d.yXeX:XB B :XjXf.2.6.2.2.4.2.2.2.6.2.2.2.2.2.2.2.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' / ~ _ H.J.T.!.^.~.!.!.!.Q.!.!.!.!.^.",
+"N.n.n.@.n.n.n.n.n.n.n.n.n.n.n.n.n.^ ! Q e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.zXN F 4XxXBX1XxXg t aXh 4 I NXvX% > j.; . = f y = d 7X&   p.* r u >Xa.a.p.d.C X f k . $.aX5X5X<XZ :XpX{ kXNXL - . b . A h h ;XMX5Xh h h mXnX3XC C S C G h.p.a.s.6X3X6X4Xh.d.a.2.2.2.2.2.2.2.3.lXeXmXrXeX;X:XrXzXf.2.2.2.2.2.2.2.2.2.2.2.6.6.6.2.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ( ~ T v.P.T.!.^.~.!.~.~.Q.~.~.!.!.^.",
+"N.N.N.N.N.N.n.N.N.n.n.n.n.n.n.n.n.P ( P e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.cXA =X-X-XN S 5Xg S LX3Xl ) L.( @ M j.M X k.VXc = M 6XF = h.1.Z s X r e r r X ; y r . ..N   s s :X5X..o. . .% l J J X Z f f 2X0X=Xf j e G 2X2X4XrX0XA 3 l b u l . u S v >XyXwX8.2.2.6.2.2.2.2.2.t.4.lXrXeXA ;X6XyXlX2.6.2.2.2.2.2.2.7.0.d.d.f.3.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ^ Y G.P.Q.Q.~.~.Q.~.!.!.!.~.Q.~.!.",
+"N.N.N.n.N.n.N.n.n.n.n.n.n.n.n.n.n.W ( P e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.O.-.>Xr -X=Xh -Xh e D e l , + L b X : ; i > M > = z c r o s ; =XC - BXsX; BXBXX BXBX- | m BXBXX BXBX( L & + 6 a ; ; a @ } *X=X=X;XG t x e ,X& s MXj ,.t X ; 1.t   :XnX,XS rXeXf.6.y.f.6.6.2.2.2.2.6.2.t.lXrX:Xg ;XrXjXf.6.6.6.2.6.u.d.xXrXrXyXt.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ! ~ _ G.P.W.~.~.!.~.!.Q.^.~.Q.~.!.!.",
+"N.N.N.N.N.n.N.n.n.N.n.n.n.n.n.n.n.^ ! P w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.%.%.L $.wXs l j d . . h a a a - h V z u l @ l e u a a u e a - 4XS J IXz l IXc a IXJ . ! / IXv . IXJ % n UXH X 3XrXMX<X@ X. .h =X,Xb h >Xc 6X .g 4Xj UX>X- - UX1X; ;XnX,XG 9X0XmXgX0XrXlXa.6.6.6.2.2.2.2.6.lXrXeXA A rXyXjXf.f.2.6.f.yXrXqXqXeXjXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ! ^ Y G.J.T.!.~.Q.Q.~.Q.~.!.!.~.!.!.",
+"N.N.N.N.N.N.N.N.N.N.N.N.n.N.n.n.M.^ ! n w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.O.%.( -.4XG b -Xs J v =XV J o - V =Xg ; p.* . c <Xr g j & / : ;XC - z ; X b ; X l ; a | m s ; X l . P ..IXK - >X4X4XS & + @ A B i r B >X- v s h tXd M z ; X : : o :XnX,X>X8XvXCX4X8XnXrXrXlXd.a.2.2.2.2.2.3.lXyXqX;X;XmXrXyXrXt.7.6.4.lXrXqXqXrXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ^ Y G.P.T.Q.~.~.!.!.^.!.Q.~.Q.^.!.",
+"N.N.n.N.N.n.N.N.N.N.n.n.N.n.n.n.M.P ! ~ r.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.%X%.W %.6XBXJ . . K K X g CX. x kXJ . > k.1.r A LXX   g.& F q @ m m m m m 3 x m m m d z m m m C C c x ; - c . v v C C G H A C C V J S d h C C C G C C C S t g h r ;XnX,XG uXkXBX,X8XnXmXqXrXrXrXd.6.2.2.2.2.6.lXeXeXA ;X5XqXeXjXf.f.6.a.rXrXwXnXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ^ ^ Y G.P.T.!.^.!.~.Q.~.~.~.!.!.!.~.",
+"N.N.N.N.n.N.n.N.n.N.N.N.N.n.n.n.n.! ! ~ 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.$.%.:.%.O.% u i p b l u @ S i u F @ b ; b l 7Xb F l D D @ ; > ) =.=.*.&.) /  .%.*.&.m } @.%.@.sXtXK m m m m m 1XG <XtX6XaXxXr.9.4.4.t.H H e.e.4.4.e.9.4.e.<Xk s.y :XbX<XS bXK K >XbXnXqXqXqXqXqXrXd.2.2.2.2.2.2.t.zXrX:Xx ;XqXyXrXrXlX6.9.d.rXeXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' / ~ T G.J./.!.~.!.!.!.!.Q.Q.!.~.~._.",
+"D.N.N.N.N.N.N.n.N.N.n.N.n.n.n.n.n.P ( ~ w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.O.*.W %.%.+.+.+.&.o.+.%.+.o.+.#.o.+.%.#.o.%.%.+.o.%.*.*.*.@.=.%.&.%.%.+.) O.=.%.%.%.'  .%.%.%.%.+.%.%.%.%.%.%.=.'  .%.%.&.pXk.k.a.k.f.1XK k.k.a.k.a.k.a.k.1X7X7Xx ;XsXm J uX-X=X-X8XnX9XqXqXqXqXqXrXd.6.6.2.2.2.6.f.rXeXqX;X;X6XqXeXrXjXa.2.lXrXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ^ Y v.P.T.!.Q.~.^.~.!.!.~.!.^.~._.",
+"D.N.N.N.N.n.N.N.N.N.N.N.n.n.n.n.n.! ! P e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.O.&.( %.%.%.%.%.&.&.&.%.%.%.%.&.&.&.&.%.&.%.%.%.%.&.%.&.&.&.&.%.%.%.%.%.) X.*.%.%.%.%.*.&.%.%.%.%.%.%.%.%.%.%.%.+.*.*.%.%.%.#.-.=.#.=.O.O.-.#.#.#.=.=.=.-.%.*.*.' } @.} / ..1X$.dX$.$.aX9XqXqX9XqXqXrXlXa.2.2.2.2.2.lXrXeXqX:Xs ;X4XqXyXyXlXjXeXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ! ^ Y G.J.T.!.~.!.Q.!.~.~.!.!.^.(.^.",
+"D.N.N.N.N.N.N.N.N.N.N.N.N.n.n.n.m.^ ^ ~ w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.O.+.:.%.%.%.%.&.%.&.%.%.%.%.%.%.%.%.&.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.=.) O.;.%.%.%.%.&.%.%.%.%.%.%.%.%.&.%.%.%.%.&.#.%.%.%.%.&.&.&.&.} ' &.&.&.%.%.+.*.*.&.%.+.-.SX=.( } X.W *.@.@.+.$.$.$.$.aX9XqXqXrXrXd.6.7.2.2.2.t.t.t.lXrX:Xg ;X4XmXrXrXwXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ^ ^ _ G.P.T.!.!.~.!.!.~.!.).~._.^.^.",
+"N.N.N.N.N.N.N.N.n.N.N.N.N.N.N.n.n.^ / ~ 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.O.+.:.%.%.%.%.&.=.@.@.*.*.*.%.%.%.%.&.*.*.&.*.*.=.%.%.%.%.%.o.o.o.o.X.) L ( / %.*.%.*.O.+.=.&.%.+.+.+.&.%.&.&.&.&.O.O.%.%.%.%.&.&.%.&./ ( =.%.%.%.%.%.%.%.%.%.+.SXSX@.| ] X.) *.+.%.%.%.%.%.@.$.aXbXnXqXeXrXlXa.2.2.2.6.2.6.2.i.t.lX:XB ;XqXeXeXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ^ ~ Y G.J.T.!.Q.!.~.!.~.!.~.^.(._.).",
+"N.N.S.N.D.N.N.N.N.N.N.N.N.N.N.N.N.^ / ~ w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.O.%.( %.%.%.%.+.) dX..) X.X.O.%.%.+.X.X.) ;.X.) X.O.%.O.%.o.L p m + % J . . } ) X.o.;.i ) X.O.&.$.$.dX%.+.$.$.$.O.m O.&.%.%.&.*.&.*.&.( ' =.%.%.%.%.%.%.%.%.%.#.$XSX@.( } o.) *.&.&.%.%.%.%.%.&.*.6XnXqXqXwXrXrXd.2.2.2.2.2.2.6.2.2.u.h.:X;X4XqXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ^ ~ Y G.P.W.!.~.~.~.^.!._.(.^._.).^.",
+"S.N.S.N.D.N.N.N.N.N.N.N.N.N.N.N.m.^ / 9 w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.*.%.) %.%.%.#.O.m h =XV v - X.=.&.O.v <Xr   c J . % :.W :.:.L J K @ p vXv . x C . F J l J X :.=.BXy.l.pXo.sXuX9XG ) &.%.%.%.%.$.;.) $.K ( =.%.%.%.%.=.=.*.*.&.#.SXSX@.) } X.) *.*.%.%.%.%.%.%.%.@.sXuXqXqXqXqXeXeXr.2.2.2.2.2.2.2.2.6.8.gX:XB ;Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' / ^ T G.P.T.^.~._.^.^._.~.^.^._.(.).",
+"N.S.S.N.N.N.N.N.N.N.N.V.N.N.N.N.m.! ( P w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.) X.% %.X.+.o.X.G 1Xv v K x X.+.&.X.F vXX y V CXs ) =.#.*.@.X.H K @ @ ;Xg a x CXv =XV l vXv ( =.j.6.8...@.n V h =X) +.%.%.$.aXbX;XJ g -X/ %.o.o.o.X.) X.;.;.) X.$.SX;.} / X.W o.@.+.%.%.*.&.&.%.&.%.aX9X9X9X9XqXqX8.6.6.2.7.6.6.6.6.6.2.2.i.lX:Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ^ Y G.P.W.`.~.~._.^.~.).^.)._.).(.",
+"N.N.N.N.S.S.D.N.N.N.N.N.N.N.N.N.B.P ^ P e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.d ,Xl L ) :.( ( @ K X . . e | +.&.+.p 7X- r r ;Xi X.=.%.%.&.:./ p :.7X=X2XC . Z r :XG e ;Xg ) =.j.6.8.L.@.} 1XK a m ) W :.F 5X5XG BX. @ ;XF % } % + G h X a -X2Xr -X5X<X% + ( % :.sXpX&.&.%.%.%.%.&.%.$.aXnX9XbX9XgXf.a.f.a.f.f.f.a.6.2.2.8.z.wXw.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ! ~ _ G.P.Q.~.^.~._.~.^._.^.).).!.(.",
+"S.D.D.D.D.N.N.D.N.N.N.V.N.N.S.N.V.P ^ ^ w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.H LX,XX.*.*.*.=.+.X.B g A 1Xz ;.%.%.+.+.G ;X. g ;.%.%.%.%.+.$.pXtX0Xc j.BXu v c z l l h 5X9X$.@.j.7.3...=.% x a   { =.%.%.%.$.nX:Xa g e ,X} i kX@ % vXG o d NXMXr h wX,X% @ BXl p 5X0XsX+.%.%.%.%.%.&.&.%.$.$.$.aXuXyXrXyX9XuXrX9XyXgX3.2.2.3.s.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ^ ~ _ G.J.R.!.~.(.).^.).).).).).).).",
+"S.D.D.D.N.N.N.S.N.N.V.N.N.N.N.N.V.P / ! 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.d ,Xs X.*.*.&.+.+.*.aXr ,XVXC X.%.O.%.;.m v . r ;.&.%.%.%.%.@.@.pX0X>XIXJ . 1XtXG e ,XH t bXpX@.j.7.9...=.D S & X | %.%.%.%.&.$.wX0X9X>X:XsXm K i % ;XD . X =X-Xr x C D 0 J 1Xb + K s 8XpX@.&.%.%.%.%.*.%.%.%.%.%.dX$.$.dXdX$.$.aX9XrXt.6.2.6.a.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' / ^ _ G.P.W.!._.~._.(.).).).(._.(.).",
+"V.D.V.N.V.N.V.N.D.D.D.D.N.V.N.N.N.^ / Q w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.c - % o.o.o.*.%.%.%.%.l r g s % ) W ( L N K x r | @.%.&.%.%.%.%.+.$.m N l 8 vXvXI g =XG y bXsX#.j.7.a.pX+.} 6XK e { *.%.%.%.*.&.$.tXeX<XH } Q n % ( 4X4X:X3 c d =XA mX,X% I L % % CX3 B nXsX=.%.%.%.%.%.%.%.%.%.%.+.+.+.&.@.+.o.%.dXaXr.2.2.6.a.4.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ^ Q Y G.P.W.^._.~.).^.)._.).)._._.).",
+"D.D.D.V.N.N.D.V.S.D.D.D.V.N.V.V.V.^ / Q e.e.4.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.4Xv L Q p L o.%.%.%.%.x l b . X.=.%.*.*.v l t d ;.+.%.%.%.%.&.%.%.&.%.X.+.X.1XK I y t t g pX*.kX4.7...@.%./ H h X | @.&.*.&.*.*.@.*.$.7Xm b @ @ v x i l b l 1X1X3 ;XMX3Xv b F F i a e s wX4XpX@.%.%.%.%.%.%.%.%.&.+.=.%.%.%.%.%.%.@.pXgX3.2.6.a.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' / / T G.J.T._.^.~.(.)._.).).^.^._._.",
+"D.D.D.N.D.N.N.V.V.V.S.V.V.B.N.N.D.^ ^ Q w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.bXm + K H % o.%.%.&.%.u C J l ) =.&.&.&.3X=X2Xg ;.&.%.%.%.%.*.*.%.&.%.&.*.) % L 4 e zXh ) @.aX0Xz.f.pX@.@.sX0XS l | *.O.X.X.;.%.%.%.&.+.=.p *XG h h v x . . B v o A wXwX>XH a.cX3X4 - 3 c c A pX&.%.%.%.%.%.%.+.%.$.dX+.@.%.%.%.%.+.%.aXu.6.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.w.' ! ^ Y G.P.T._.^.^.).)._.(.).).)._.).",
+"N.D.N.V.N.V.V.V.S.N.N.V.S.D.V.V.S.P ^ n e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.4Xb ( H J % o.%.%.%.%.x a x t b ;.&.%.+.m v a e ;.&.&.%.%.&.X.X.X.%.%.%.+.1X5X5Xc B NX0X) =.6XvXCX8XsX@.+.aXnX<X) +.@.p >X:X:XsX%.&.%.%.#.} MXLX1X>XK v . v c c x x C C v H 7.5.<Xl V h t 6Xz S $.&.%.%.%.%.=.$.tXa.jXaXdX+.&.*.%.%.@.sXw.2.6.a.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' / ^ Y G.P.T.!.^._.~._._.)._.(.)._.).",
+"D.V.N.V.V.N.V.V.V.S.D.N.V.V.V.V.V.^ ! ~ w.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.bXv L Q % L o.%.%.%.%.7XZ 3X5XV O.&.&.o.J J x r ;.&.&.%.%.+.m <Xr ) =.%.#.4 X a a r =Xg ( =.1XCXBX5X>XW :.>X5Xj Q :.:.p aXfX;X0XpX@.=.%.&.( ;X:X:X2Xx s e G 4X6X>XV 5X5X;XH 3.6.lX2XkX1XX rX3XC -.%.%.&.%.&.#.aXz.8.3.l.hXaXdX%.%.%.&.pXgX8.6.a.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ^ _ G.J.T.!.!.^.(.(.).(.).).).).).",
+"N.N.N.D.N.V.N.S.D.V.S.S.V.V.Z.V.V.^ / ~ e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.5Xx l b @ m ;.%.%.%.%.%.x b v m ;.&.%.+.b a e a ;.&.%.%.+.o.F vXa ( -.*.@.( J J . r hXh ( =.1XK F 3XaX%.%.aX<Xz | =.=.m D Z e h sXX.O.%.%.+...4XrX4X<.y.<X9  .NX( X v N X H 8.6.lX2XB V r 0X,XC $.%.%.%.%.%.$.a.6.2.2.2.3.l.zX-.@.%.%.-.fXr.7.g.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ! Y v.P.T.Q.!.!._.!._._.).).).).).",
+"N.N.V.V.V.V.V.V.V.V.S.N.Z.V.S.V.S.P ! ~ w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.d G   - V 1Xb O.=.%.%.%.x c ;.+.%.%.&.&.S t s | *.&.%.%.%.%.p S @ h -X| ... ; * . g NX0X:.#.6X=Xh -XuXwXqXqXG ) %.%.*.' l x b V g t ( =.%.&.=.sXl.q.6.7.s.0 } vX:.k j.j.; H 4.6.s.7X0X;Xv v X G -.%.%.%.&.&.$.4.6.2.2.2.2.7.f.aX#.&.%.&.$.h.9.a.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ~ T G.J.T.!.~.~.~.~._.^.).).).).).",
+"S.S.S.V.V.V.V.V.S.V.S.S.V.Z.V.V.V.^ ! ~ 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.H LXo . 6XVXb X.*.%.%.+.x b O.=.%.%.+.sXV 3XtX$.&.&.&.%.%.%.O.m B v B g h . x b D s -X=X) =.aXMXMXuXyXrXrXnX;X) =.%.%.o.pX9X>XZ k hX( =.&.%.+.sXu.7.6.7.H < L L % r : : - G 3.6.p.S wX:XK M . J $.%.%.%.&.+.pXw.2.2.2.2.2.2.3.zX$.+.%.%.@.sXi.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.r.' ! Q T v.P.W.^._.~._.(.^.).).).).).].",
+"N.S.N.V.V.V.V.V.S.B.S.S.V.V.V.V.S.^ ^ n e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.s >Xe 3 r =XA X.%.%.%.%.x b O.&.%.%.%.6Xh 4X$.&.%.%.%.%.%.%.&.kXa.G h p.j u <XzXy.<.<.g.$.@.aXxXl.y.y.y.z.bXH ) *.%.%.&.+.aX,Xc t t F &.%.%.&.$.qXf.y.7.h.b ; a ; l c l ,X4X8.6.h.D C l l a e C -.+.%.%.%.+.$.4.2.2.2.2.2.2.6.f.dX+.&.*.@.sXe.<.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! / Y G.P.W.Q.^.~.(.^.^.).).).).$X).",
+"N.N.V.V.V.V.V.V.C.V.S.V.V.C.Z.V.S.P ! ~ w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.<X=X0Xx x . -X$.&.%.%.+.x x O.&.%.+.#.aXh ;.&.&.&.&.&.%.%.%.#.k.7.G Z Z t x <X4.6.6.6.8...@.BX4.6.2.2.6.8.H b | *.%.%.%.@.sX,Xe s.<Xr ) =.%.%.=.$.pXtXx.H X z N   ;XeXqXa.u.2.2.4.xX3Xl - . a S $.&.%.%.%.+.dXf.3.2.2.2.2.2.6.d.$.+.%.%.*.pXgXjXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ! ~ Y v.J.W.^.^.~._.).).).).).).).).",
+"V.N.V.V.V.V.V.S.V.S.S.V.V.V.V.V.S.P ^ n w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.V x -Xs BXJ @ X.=.*.&.+.x c O.=.&.&.$.tXA ;.&.&.%.%.$.*.*.%.#.k.3.G D F >Xv p.7.2.2.2.4...#.j.7.2.2.2.2.3.H ) &.%.%.%.&.@.sX<Xe z.s.r ' *.%.%.%.%.@.$.rX,X3 j.j.; :XnXy.6.2.2.2.7.lX6X3 v z o G -.#.#.&.%.%.@.aXw.2.2.2.2.2.2.f.dX@.%.%.+.pXyX6Xw.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.' ! ^ Y G.P./.~.^.).).).).).).).).).].",
+"S.V.V.V.V.S.V.V.S.V.V.S.S.S.S.V.S.^ ^ P e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.j.J . - l . e X.O.%.O.O.x b ;.%.O.sXwX9XV ;.=.-.6XmXqX$.%.%.#.k.7.t.i.i.a.G p.7.6.6.6.9...@.j.7.6.6.6.6.6.j | =.*.&.&.*.=.aX,X. j 2Xd | =.&.%.*.&.%.@.dX1X- f : X >Xl.6.2.2.2.2.6.lX6X3 1X .X S $.#.#.%.%.+.+.sX4.6.6.6.6.6.8.f.dXo.#.+.@.sX9X4Xw.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ! ^ Y G.J.T.).^.(.).).).).).).].).).",
+"V.V.V.V.S.V.S.V.V.Z. XoXAXZX.X}.S.^ ^ ^ w.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.z s r c x l c v m m m m - v v v b v 4XwXB 3XpX6XmXwX0X..*.-.-.kXz.y.<.y.a.S <Xa.<.<.<.f.pX=.BXa.y.<.a.<.a.<X) +.O.%.O.%.sX0X>Xl S wX<X/ %.O.O.$.O.%.;.&.( ;X5X5X;Xh 7.2.2.2.2.2.6.jX6Xl V A X S $.*.$X-.$X-.=.sXf.<.<.<.<.<.<.zXdX*.*.*.-.CXeX3Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.' ^ P T J.J.[.{.]./.).(.).(.).).(.].).",
+"V.V.Z.Z.Z.Z.Z.Z.C.|.ZXDXFXFXFX@XXXP ^ ~ e.r.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.4X4X4X4XqXwXwX0X6XO.+.O.c 3X0X;Xs a s s s s g s g x g c SXSXSXJ g B B B B e e B B B B g pXSXJ t B B B B g a a x s i x x x s s e s s s e x x i x x x x x u a V Z Z <X7.6.6.2.6.6.6.4.cXqX:Xr s x 7XSXSXSXSXSXSXSXh Z g Z Z D Z F AXSX-.SXSXSXD g e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.' ^ ~ F.L.XXZXDX.X[.~.].).].].).].).).",
+"S.V.V.S.Z.V.V.Z.C..XDX7 5 < # DXXX_ / n i.4.e.e.e.e.e.e.e.e.e.e.w.e.e.e.e.w.w.e.e.e.e.e.e.xXbXbXbXbXbXbXbXbXBXpXpXG g d H 4XH 4 z z z z z z z z z M M v z z z z z z c z z z z z z M J M z z z z z z z z c z z z z z z z z z z z z z c z z z z z z z >XxX4XxXbXz.y.z.l.l.l.z.l.zXwXbXbXxX4XkXT.$.-.-.$.%X..0X4X4XxX4XxXxX6X*.%.O.%X$.O...xXw.w.e.e.w.e.w.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.w.q.' ! ~ L.ZX$ $ 8 5 ZX[.(.).].(.).].).].",
+"Z.V.Z.V.S.S.Z.Z.V.ZXGX5 5 < 7 GXAX_ / ~ a.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.4.e.e.r.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.w.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.r.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.e.e.r.e.e.r.e.e.w.e.e.e.e.e.r.e.r.u.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.r.e.r.4.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.w.e.e.e.e.e.e.w.e.<._ ! P L.ZX5 5 6 5 FX X].).(.).).(.).).",
+"V.Z.S.Z.Z.Z.Z.S.Z.FXGX5 5 < 7 GXDXv.P ! K.y.e.e.e.e.e.e.e.e.w.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.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.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.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.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.4.e.r.e.r.c.Q / n L.KX6 O $ 5 GX X{.).].].).).).).",
+"Z.V.S.Z.Z.Z.S.S.V.FXHX6 5 6 7 HXDXZ.I ( ] k.e.e.e.e.e.e.e.e.e.e.e.w.w.e.e.e.e.w.w.e.e.w.w.e.e.e.e.w.e.e.e.e.w.e.w.e.e.e.w.e.w.w.e.w.w.e.e.w.e.w.w.e.w.e.w.e.e.e.e.w.w.e.e.e.w.e.w.e.e.e.w.e.e.e.w.w.w.e.e.w.e.w.e.e.w.e.e.e.w.w.w.e.e.w.e.e.e.w.e.w.e.e.w.e.e.e.w.w.w.e.e.w.e.w.e.e.e.w.e.w.w.e.e.e.w.w.e.e.e.w.e.w.e.e.w.e.w.e.w.e.e.e.w.e.w.e.e.e.e.w.e.e.e.w.w.w.e.w.e.e.e.e.e.e.r.4.a.{ ! ! 9 ZXKXO 6 $ 6 GX.X).).`.).).).].].",
+"V.Z.S.Z.Z.C.C.C.C.FXGX6 # $ 5 HXFXS.Y ( / N 1.e.e.e.e.w.w.e.e.w.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.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.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.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.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.a.N Q Q P q L.KX< , # 5 GXZX].(.).].).).).].",
+"Z.S.S.C.C.Z.Z.C.Z.FXHX< 7 6 7 HXFXA.[ _ Q Q c.c.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.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.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.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.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.y.c.] Q Q 0 ] L.KX$ 5 7 $ HXZX^.(.{.).).].].].",
+"Z.Z.S.C.C.A.C.A.C.FXHX5 # 6 5 HXAXA.I.E Y P P ] 1.y.r.e.e.e.e.w.e.e.e.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.r.e.e.e.w.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.w.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.w.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.e.e.w.w.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.e.e.e.e.e.e.w.e.e.e.e.e.e.e.r.i.a.N / ^ ^ 9 0 U ZXKX< , , O HXDX^.).).).).].].).",
+"Z.Z.A.C.C.C.A.A.A.FXHX6 # 6 # HXFXI.Z.C.{ Y ^ ! ' c.<.u.q.r.q.q.0.0.0.0.q.q.q.q.0.0.q.q.0.0.0.0.q.q.0.q.q.q.0.0.0.q.q.0.q.q.q.q.0.0.0.0.0.0.q.q.q.q.0.0.0.0.0.0.q.q.q.0.0.0.0.0.0.0.0.0.0.0.0.0.q.q.0.0.0.0.0.0.0.0.0.0.q.q.0.q.0.0.q.q.0.0.q.q.q.q.0.0.0.0.0.0.q.q.0.0.0.0.0.0.q.q.q.0.q.q.0.q.0.0.q.q.0.0.0.0.q.q.0.0.0.0.0.0.0.0.0.0.q.q.q.q.0.0.q.q.q.q.q.0.q.w.q.q.0.w.0.<.c.' U / / P 0 U ` XXIX< , 5 $ HXZX^.).).).).).).].",
+"C.S.C.C.I.A.C.A.A.FXHX# 6 7 # HXDXI.S.A.Z.Y P ( ! ^ / ! ^ ^ P ^ ^ Q Q ~ ^ ~ P Q ! ! ^ ! ^ ^ ^ ^ P ^ ^ P ^ ^ ^ ^ Q ^ ^ ^ ^ P Q ^ Q ^ ^ ^ / ^ ^ ^ ~ ^ ^ ^ Q ^ Q Q ~ ^ ! ! Q ! ^ ^ ^ ^ ^ ^ / ^ ^ Q ^ Q ^ ^ Q / ^ Q ! ^ P ! Q ^ ^ Q ^ ! ^ ^ / ^ ! ~ ~ ^ ^ ^ ^ P ^ ! ~ ^ ^ ^ ^ / ^ Q / ^ ! ^ / ^ ^ Q ! ! ^ ! ^ ^ ! ! ^ P ^ P ^ P ! ! ^ ^ P ! ! ! ^ ^ ! ! ! / ^ Q ^ / ^ P ^ ^ ^ P ^ P ^ ( / n 9 9 U T G.ZXHX6 # , # HXDX^.).).$X).{.{.].",
+"C.I.C.A.C.A.A.A.V.FXHX5 $ # 8 HXFXI.A.S.I.[ Y P ^ ^ ^ ! ^ / / Q / / ^ / / / / / ! ! ! ! ! ! ! ! ! ! ! ( ! / ! ! / / ^ / / / / / ^ ^ / / ^ / / / ! ! / ^ / ^ ! / ^ ^ ^ ! ^ ^ Q ^ ^ ^ ^ ^ / ^ / ^ / ^ / / / ^ ^ ! ! ! ! ^ ^ ^ ^ / ! Q ^ Q ^ ^ ^ ^ ! ! / ! / / ! / ^ ! ! ! ! ! ! ! ! Q ! ! Q ! ^ / ! ! ! ! ! ! ! ! ^ / / / / / / / ! ! ( ! ! ! ! ! ! ! ! ! ! ! ! / / / ! / / / / / ^ P n 9 9 9 Y G.H.ZXHX8 O 5 5 GXDX^.).^.).^.).).].",
+"C.C.C.I.I.C.I.A.A.FXHX6 6 8 O PXKXI.Z.I.I.P.Z.v.[ Y Y 9 P P P I P P P P P P P P P P P P P P P P P I P P P Q P P P P P Q P Q P Q P P Q ~ Q Q Q Q Q ~ P n P ~ n P P ~ ~ P ~ ~ ~ ~ P ~ ~ ~ P ~ ~ ! ! ^ ^ ~ ~ 9 ~ ~ P 9 ] P ~ P ~ ~ ] ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ^ P ^ P ~ Q P 9 P P P P P P P P P n Q P P P Q P Q P P Q P P P ~ ~ ^ ~ P P P P ~ P ~ ~ ~ P P P ~ P ~ P Q Q n P ~ n P 0 9 0 q q R T b.K.P.GXPX$ 5 6 # HXZX^._.).).).(.).].",
+"I.I.I.I.I.I.A.A.S.FXHX5 < < 6 PXPXKXFXAX@XDXFXDXZXZXL.L.F.R 0 R 0 0 0 0 0 q 0 0 9 9 9 0 0 q 0 9 I 9 9 9 9 9 0 9 9 9 9 9 9 9 9 9 U 9 9 9 9 9 9 q 9 9 9 q 9 P 9 q 9 n ] 9 U 9 9 ] 9 ] ] U ] n ] q n q ] q ] n U U n ~ ] n n ] ] 9 ] n ] U U n Y N U ] 9 9 9 q 9 9 9 9 9 9 9 9 9 9 9 9 9 0 9 9 9 9 U U 9 9 9 9 9 9 9 9 9 q U 9 9 9 P 9 9 9 U 9 9 U U U 9 9 9 9 U U 9 9 P q q `  .L.L.L.L.CXVXXXZXZXKXIXPX< , 6 # HXDX_.).).).(.].).`.",
+"I.C.I.C.C.I.I.I.I.&XHX7 6 < 6 PXPXPXHXHXHXHXHXIXHXKXDXZX'.L.T R T R T R T R R T T T T R T T T T T T T T T T T T T T T T T T T T T T T T T b.` b.` b.b.` F.T F.b.F.` ` F.F.` F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.b.F.F.` ` ` T T ` T T T T T T T T T T T T T T T T T T T T T T F.T T T ` T b.` ` ` b.` F.` F.T ` F.F.b.F.` ` T ` ` L.L.CXZXKXKXVXKXKXKXIXHXPXPXPX6 < 6 # HXDX^.).~._.(.).].].",
+"I.I.I.I.I.I.I.U.I.DXHX7 6 6 $ 6 6 6 6 5 6 5 6 6 # O < 6 XX'.v.v.v.v.v.v.v.v.v.v.v.G.v.v.v.v.v.v.G.G.G.H.H.G.H.H.H.H.H.H.H.H.H.H.H.H.H.G.H.H.H.H.H.K.H.J.H.H.K.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.H.K.J.H.K.H.G.H.H.H.H.G.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.J.H.H.H.K.H.H.J.H.H.H.H.K.H.H.H.H.'.ZX6 # $ 6 , 8 8 # 5 5 5 6 6 7 5 O 8 HXFX^._.).).).).).).",
+"U.I.I.I.I.R.I.U.R.@XKX7 6 6 7 5 # 8 , , , 6 O < O 5 5 O FXXXP.H.B.Z.v.P.C.P.P.Z.Z.H.P.P.Z.J.P.P.P.P.P.Y.Y.P.Y.Y.P.Y.P.Y.Y.Y.P.Y.Y.Y.Y.Y.Y.Y.T.Y.W.Y.Y.Y.Y.W.Y.Y.W.W.W.W.W.'.W.'.W.W.W.'.'.'.'.[.[.[.'.[.'.'.'.'.'.'.'.'.XX'.'.'.'.'.'.'.'.'.'.'.'.'.'.W.T.Y.'.Y.W.Y.Y.Y.Y.P.Y.P.P.Y.P.P.P.P.Y.P.Y.Y.Y.Y.P.Y.Y.Y.Y.Y.T.Y.Y.T.Y.Y.Y.Y.Y.Y.W.Y.Y.Y.T.Y.Y.Y./.Y.Y.T.W.Y.Y.T.XXFX6 8 5 6 , 7 # # , , , 5 $ # , 6 O GX@X_.^.).).(.).).].",
+"I.U.I.I.I.I.I.I.I.#XKX7 5 < , 6 7 , # # 5 5 # 8 # # # 6 AX.XU.I.C.P.C.P.I.I.R.P.I.R.R.P.P.U.W.R.U.U.R.R.R.W.T.R.Q.W.R.Q.R.Q.Q.R.R.W.R.W.Q.Q.W.Q.W.~.W.~.W.~.].[.'.'.[.[.[.'.[.'.[.[.[.XXXX{.XX}.|.XXXX|.}.XX}.XX|.[.|.|.|.|.XX|.[.XX|.[.[.[.|.[.[.[.[.'.[.(.[.~.W.(.~.W.R.W.E.Q.W.R.T.W.T.T.Q.W.Q./.Q.Q.T.W.Q.~.Q.W.W.Q.W./.!./.W.(.W.~.!.[.(.W.W.~.W.(./.(././.~.(././.ZXFX6 5 , 6 6 6 6 6 6 < 6 7 5 # < < # GXZX^.).).).).].(.).",
+"U.U.U.U.I.I.I.R.U.}.DX1 < < 6 6 5 7 6 5 # $ < 6 6 < $ < FXOXU.U.R.R.R.R.R.R.R.R.R.R.R.E.E.E.~.E.R.Q.W.Q.!.!.!.!.!.!.~._.!._.Q.~.^.!./.Q.!.!._.).).).).).).{.).{.{.{.).{.{.{.{.}.|.}.}.}.}.}.}.oX}.}.|. X X}. X}.}.}.}. X}.}.}.}. X}.}.}.|.}.}.}.{.}.{.{.].{.$X].).).^.(.^._.^.!.!.T.!.!.!.!.!.!.^.).^.(._.^.^.).^.(.!.^._.).(.].].].).].].).]._.).).).).].).).).].).).).AXFX1 7 5 $ 5 5 6 6 6 , 5 5 5 5 # 6 < FX X^.).).).).).).).",
+"R.U.U.U.U.U.R.I.R.{..X.XGXGXHXHXHXHXHXHXHXHXHXHXHXGXGXFXAX}.U.U.R.I.R.R.R.R.R.R.R.R.R.Q.R.R.E.R.Q.Q.Q.Q.!.~.~.!.!.!._.~.!.(.!.~.~.~.!.!.!.!.).).^.).).).).{.).].{.{.{.{.{.{.{.{.}.}.{.}.{.oX}.OX}.OX}. X X X X X}. X}.}. X X}.}.}.}. X}.}.|.{.|.}.{.|.{.{.{.].].).].).^._.~._.~._.^.!.!.!._.!._.).^.^.^.^._.).^.^._._.^.).(.).).].).].(.].(.(.).].).].).].).).].).].).].@XFXFXJXHXHXHXPXHXHXHXHXHXHXHXGXJXGXDX.X|._._.).).).).{.).",
+"R.U.R.E.E.I.U.U.U.U.[.#XAXDXFXZXFXFXDXFXFXFXFXFXDXAXZXAX].R.R.U.Q.E.E.U.E.T.Q.U.W.R.R.R.Q.Q.R.Q.Q.Q.Q.Q.!.~.^.~.~._.(.^.^.^.(.^.~.^.~.!.!.!._._.^.^.).{.).].).].].}.oX].{.{.{.{.}.{.{.}.}.oX$X}.+X}.oX XoX+X}.OX|. XoXoX XoX X}.}.}.}.}. X}.{.|.}.{.{.{.$X{.].].$X).).).^.^.)._._.^._._.~.^.)._.^.).).(.^.^.).^.^.).^.).(.).).).].).).].].).).).).).^.].).{.).].].).].).)..XDXDXFXDXFXFXKXFXFXFXFXFXDXDXDXZX.X|.(.).).).).).).).].",
+"R.R.R.R.I.E.R.R.E.R.R.U.E.A.E.I.R.A.U.I.I.U.I.I.R.R.R.R.U.R.R.R.E.E.E.T.!.Q.U.Q.Q.R.Q.Q.R.R.Q.R.R.Q.Q.Q.^.Q.!.!.~._.).^.).^.^.)._.^.!.!.!.!.^._._.^.).^.).].].].].].].{.}.{.}.}.}.}.}.}.}.oX X}. X X X XOX}. X XoX X|. X X|.}.}. X}.}.}.}.|.}.}.}.{.}.].{.].].].).].).).).).).^.).^.^.^._.~.^.^.).^.^.).^.).^.).).^.).^.).(.(.].).).].).].).].).{.).{.$X).).{.).).].).].).).^._.(.(.(.]._.).].[.).).[.).).(.).)._.^._.).).^.).).).",
+"R.R.R.P.U.R.E.U.R.U.E.U.R.I.E.U.R.I.U.I.U.U.U.E.U.U.E.E.R.E.Q.Q.Q.U.Q.E.E.Q.Q.R.R.Q.Q.R.Q.Q.Q.Q.U.Q.Q.Q.Q.~.~._.^.^.).).^.).).).^.~._.!./.!.!.~._.^.^.).).).).).].].].}.{.}.{.}.{.}.{.}.}.}.oX XoXoX+X.XOX}. XoX}. X X X X}.}.}.}.}.}. X}.}.}.{.{.}.{.{.{.].].).].).).).).).).^.^.).(._.~.~.^.^.^.).^.^.).^.).^.^.).^.).).).).).(.].).].).].).].).).].).{.).).{.].].].).].).].).).).).).(.).(.].).).].).).).).).).^.(._.).).).).).",
+"Q.R.R.R.R.U.U.U.U.U.Q.U.U.U.U.U.U.R.R.I.U.R.U.R.Q.U.E.U.R.E.E.E.Q.!.Q.E.T.Q.Q.Q.R.Q.R.Q.Q.R.R.Q.Q.Q.Q.Q.~.~._.~.^.).).^.).^.).^._._.^.!.~.^.~._._.^._.).).(.].].[.].].].}.}.}.}.{.}.}.}.}.}.oX X}.}.}.}. X+X}.OXoX XoXOXoXoX}.}.}.}.}.|.}.}.}.|.}.{.}.{.].].].].).).).).).).).).).^.^._._._.(.^.).^.).(.(.).^.).(.^.).^.).).(.).).].].).].).{.).).{.).].).{.{.).).).].].).].).).{.).).).].].).).{.).).).(.).).).).).^.).).).).`.).",
+"Q.E.R.Q.R.R.R.R.U.E.E.E.E.U.U.E.U.E.U.U.R.E.E.E.U.Q.T.Q.Q.R.R.Q.Q.Q.Q.!.!.Q.Q.Q.Q.R.Q.Q.Q.R.Q.R.!.Q.Q.Q.!.^.^.)._.)._.).).).).).).)._.!.!.^.!._.~.^.^.^.).).).].].].].oX{.}.{.{.}.}.}.}.oX}.}.$X|. X}. X X X X XOX}.OX}. X}.}.{.[.}.}.}.}.{.}.|.{.}.{.{.].].].).].).).).].).].).).).).)._._.^.).).^.^.^.^.).^.).).).^.).).(.(.).).].).].].).].).].).].{.].].).{.{.].{.).).{.{.).].).).].).].).).{.`.(.(.).).).^.).].).).].).].].).",
+"!.Q.Q.E.R.R.R.R.E.T.!.U.E.U.Q.U.Q.U.E.!.R.U.E.Q.Q.Q.!.E.R.Q.Q.Q.Q.Q.Q.Q.!.!.!.Q.Q.Q.R.Q.~.R.Q.Q.E.!.Q.!.!.~.^.^.!.).).).).).).).).)._.^.!.!.^._.^.~._._.).).).].[.].].].}.{.}.}.$X}.}.}.oX$X}.}.oX}. X}. X X XoX}. X}.}.}.}.}.|. X}.}.}.|.}.}.}.}.{.{.{.].].).].].].).).).).).).).).)._._._.).^.^.(.^.~.~.^.(.^.^.^.).^.).).).).].).).].].).].].].].].].].].{.].].].).{.).).).(.).).].).].).).].).).).).).).).].).).).).).).).].].",
+"!.Q.Q.R.Q.Q.Q.R.E.Q.!.U.!.T.Q.E.T.E.Q.U.!.U.Q.Q.Q.U.Q.R.Q.Q.E.!.T.!.Q.!.!.(.!.~.Q.!.Q.Q.Q.Q.Q.E.!.!.!.!.!._._.^.).(.^.].~.R 6 # 5 5 # 5 7 O R H.).~.^.~.].).].].[.[.oX}.}.[.[.$X{.{.$X$XXXoX|.}.oXOX}.|.+X|.oX X X5 # 6 [ .XOX}.[.OX[.}.}.R $ % I |.{.[.{.$X$X).(.^.).].).).].).].).(.].~.[.Q.`.^.).~._.).~.).(.(.^._.).).).(.].).).].).].].].].].].].].].{.].].].{.).).{.(.{.].{.].].].].).].].].`.).].).).].).].).].).].).].).{.",
+"!.!.!.Q.R.Q.R.Q.E.!.U.!.E.!.E.Q.U.Q.U.!.E.!.E.!.Q.E.Q.Q.R.Q.Q.Q.!.!.!.!.!.~.!.!.~.~.Q.Q.Q.Q.Q.Q.!.!.!.!.^._.^.^.).(.^.[.~.I 6 , # # 5 O 6 5 , # K.^.~.).).!.).~.).).].].}.}.{.}. X].oXOXOX}.{.oX$X}.}.|.}.+X|.oX|.O 8 # [ }.}.}. X[. X}.[.R < 7 R [.{.[.].).).{.).].).$X^.$X).).].).]._.).(.).^.).).).~.!._._.~._._.).)._.(.).).].].).].).].].].}.].].].].{.[.{.{.].).{.).{.).{.].].).].].].].).).].].).).{.).).].).).].].).].].).",
+"!.!.~.!.!.Q.Q.Q.R.R.Q.Q.Q.E.Q.E.Q.Q.Q.Q.Q.Q.R.Q.Q.E.Q.Q.Q.!.Q.~.!._._._.^._.^._.!.!.!.Q.Q.Q.~.~.~.!.!.~.^.^.^.).).]._.)._.I 6 6 5 7 , < 6 < 6 , Y `.Q.].^._.].~.].$X].$X$X{.oX{.].{.}.{.}.[.}.}.|.{. X.X.XOXOX}.+X5 O < [  XOXoX]. X].$X$XK.[ [ H.{.$X].`.{.].).]._.].].`.`.].{.).).).).(.^.^.$X/.~._.~._.^.~._.^.).).).).).).).).].).].].{.).{.].[.].[.].].].[.|.`.].{.{.).{.).].].].].].$X].).).].].).].).].].].].].).).).].].{.",
+"!.^.~.!.Q.!.E.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.U.U.!.Q.Q.Q.Q.Q.Q.Q.Q.!.!.!.!.^.^.).^.^.).^.^.^._.!.Q.Q.~.~.Q.!.~._.^.).^.).).).(._.[.~.R , 5 5 H.Q.Q.E 7 7 $ I ^.^._.).W.[ [ E G.'.[.$X{.[.Y.Y.J.'.XXG.G.[ [.|.}.K.[ G.'.OX}.|.7 5 , [ '.[ { P.[.].$X].J.J.J.J.].$XK.J.H.[.W.H.[ [ Y.{.].~.).(.G.[ G.Y.W.J.H.K.)._.~.^._.).).).^.).).].).).].).).).].).].].].].].].].].].].].].].].`.).{.).].{.).].].].].].{.{.).).].].].).].$X).].).{.).$X].].",
+"~._.^._.~.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.~.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.^.!.~.^._.).^.^.).^.^.).^.!.!.!.~.~.!.!.!.!._.^.^._.).).).(.^.].!.R 6 , 1 H.).T.[ # O 6 [ !.).).E 0 7 5 1 # 1 G.}.$X[.7 O 8 ' 7 O # O 8 J.I O 5 , 1 J.OX X7 6 6 9 , O 5 5 I W.oX[.R , , Y ).].1 6 5 { 0 O < # 7 H.(.{.Y.0 5 # # 8 _ 7 7 1 W.).).).^.).!.^.)._.).).).).).].(.].).].).).].].].].].].].].(.].].`.{.{.].].].].].].{.].].].].).{.].].].].].].].].].].].).].].].",
+").^._.~.!.~.Q.!.Q.Q.Q.Q.~.!.~.~.Q.!.!.!.Q.Q.Q.!.!.^.!.^.~.~._.(.^.^.).).).).^.).).^._.!.!.!.!.~.~._.^._.).).).).).).).).~.I 5 6 # # # # # # 1 T _.).).G.8 O 7 O < 7 6 < [ oX X# 5 5 8 8 6 # 8 # 6 , , 7 6 6 9 +X.X7 6 O 6 1 6 5 # O ` ].|.I # 5 I ).].O $ O , 8 5 6 6 # I ].].I 6 5 $ 5 5 O 6 5 1 (.)._.).^._.).).^.).).).).].].).].).].).].].].].{.[.].].[.].[.(.].].].].].].].].].{.].{.{.].].{.].].].).].].).{.).].].{.{.].].].",
+").^.).^.^.^.!.!.Q.!.!.!.!.!.~._.!.!.^.^.!.!.!.!.^.Q.~.(._.~.^.).).).).).).).).).).).).!.).^.^._._.^.).^.).).].).).]._._.~.U , 6 # # 7 O 5 5 6 ^ /.~.(.I $ 6 I '.%X0 6 6 8 ].[.7 6 , 1 G.G.O 6 , 5 [ K.I O $ 8 }.+XO 6 5 8 J.XXI 6 6 # /.].R 6 O I `.).7 $ , 1 [ H.0 6 # 7 (./., O < R '.J.0 O 5 5 (.^.$X^.^._.^.^.).).).).).).).).).).].].).{.$X|.].].].].].].[.].].`.|.].{.].{.].].].{.{.{.].].{.].].].{.].].].{.].].].].}.}.].{.",
+"{.].).^.^.).^.^.!.!.~._.~._._._._._._._.!.!.!._.^.!._.^.^.^.).).).).).).).)._.).).).).).(.^.^.).^.).^.].).).).).$X).).].~.I , 6 O Y E [ Y , , 7 I Q.J.O 5 < G.].$XK., 6 # Y.].5 6 5 [ [.XXY # 6 P  XOXG.# $ , OX X# 6 < [ +X XJ.# 7 O Y.}.I $ 8 P {.}.1 6 < Y [.).[ 5 5 O }.H.# 6 O P.).).E , # $ (.).]._.^.).).).^.).).).).).).).].).).).].).].].].].|.].].].].].(.].{.].].{.].].].}.].{.].}.].].].}.].].].].].].].].].].].[.].].",
+").).{.).].^.(.(.!.!.!.~._.).).).^.).).).(.).)._._._.^.(.].).).).).).).).).).^.).).).).^.^.^.).).(.).).].).).].).^.].[.).[.I # 6 , P.^.^./.0 5 5 1 P.K.# 5 < Y.$X).K.< 5 # J.|.# 5 5 [ oX$XI # 6 I |. X{ < 6 , OX X5 $ 5 G.}.|.J.5 # 5 J.].I 5 # I `.).# $ < [ ].].[ O < # ).Y.# 6 < H.^.).[ O $ 6 (.^.).].[.).^.).).).).).).).$X].].).].].).{.).].].].].].].(.].].].].].].].].].}.].].}.}.].}.}.].].].}.].{.}.].}.].].{.].{.].].{.",
+"{.).).).(.).^._.~.~.)._.^.).).).).).).).).).).).).).).).(.).].).).).).).).).].).).].).).).].).).).(.].).).].).].^.$X).)./.R , , 1 H._.).H.1 , # 5 H.T.# $ , { ].).H., 5 O W.(., < 1 [ {.{.R 6 < U |.oX[ < 6 5 OX+X< $ 5 _ [.oXH.< 5 5 Y./.R , 5 R ~.).8 < < b.].].[ 6 < 7 ).%X# $ 5 Y W.T.I O $ 5 ~.].^.).).).^.^.).).).).).).).).).).{.).{.).{.].`.|.].].].].].].].].].[.}.}.}.].].].].}.{.].[.}.].].].].}.].].].].].].].].{.{.].",
+"{.).{.).).^.).).^._.).^.).).).).).).).).).).).).).).].(.).].].].].].].].].).).).).].).).).)._.).].).].].$X].).].).].).^.].I < < $ # , O 1 O 6 , O '.(.0 , 5 8 H.H.8 1 O I ].}.5 6 7 [ }. XP 5 5 P }.OX[ 6 # 5  X#X7 $ O # K.K.8 < < I ].$XU O , P ).).# 6 # [ {.(.G.6 6 # ).).T 1 # # # O $ 5 , # ~.).).(.).^.).).).^.$X).).).).].).].).].].].].(.].].].].].|.].].|.].].}.].}.}.].].].}.].}.].}.{.].].{.{.{.{.{.].].{.{.{.].].{.).",
+"{.{.).).].{.).).).).).).].).).].].).].).].].).).].].).].].].].].].].].].].].).$X).].].).].].).].).].).].].].].).].).).{.[.R # 6 5 7 # , 6 7 # 7 [ ~.].P.8 6 6 < 5 $ # 8 Y.[.XX7 # # [ {.{.I O # I  X X[ 5 # # .X#XO 6 5 8 , 5 6 $ 6 E ).].I 7 7 R ).).# 5 7 E (.].E # O 7 ].^.W.I # 8 1 1 Y 5 # 7 [._.(.(.).~.].).).)._.).).$X).).].).).].).].].].`.(.].].(.`.].].].{.].].}.[.].[.}.}.].}.].].].].].].).).).].].{.{.].{.{.].{.].{.",
+"].].].].].).).^.).)._.).).].].).).{.).].$X).].].).].].].].].].{.{.{.{.{.].].{.].).].[.].).).].].).[.].].].].].[.).(.].)./.Y 7 5 6 6 6 < 6 8 R [ ].^.^.].Y.I , 6 , , R Y.{.{.].O 5 1 [ [. XY , # Y  X XG.1 O 8  XXX8 O 7 ' I 5 7 7 ` [.oX).R , 1 I ).).1 O 7 E {./.[ 1 , , ).].[.(.K.{ E W.[ , , # [.).].(.).^.).^.).).).).).).).).).].].].].].`.].].].(.].(.|.].}.].].{.{.}.}.{.{.{.|.[.{.].}.].].].).{.{.).{.{.{.{.{.).$X].].].{.",
+"].].].{.).].].).].].].).).].].].].].].].].].].].].].].}.{.{.}.{.{.}.}.{.{.{.{.].].].].].}.[.].].].].].].].].].].].].[._.{./.'.[.).~.(.].[.[._.$X].$X].).).[.'.J.J.'.[.}.{.oX{.}.|.}. X].}.{.|.|.[.|.|.OX[.AXOXoX{.OX X.X X.XY.J.'.|.].).].}.'.].].^.^.'.].'.~.~.).].(.[.'.].).1 8 I [ [.].R 8 $ , ~.).(.(.).).).^.).).).).).$X).].).).].).].).].(.].].].].].`.{.].{.{.{.{.}.{.{.{.{.}.}.{.].].].].].{.).).{.).{.].].].{.].).].].).",
+"{.].].].].].$X].).).).{.].].[.].{.].].].].[.].].].{.{.{.{.}.}.{.}.oXOX}.}.oX{.{.{.{.].{.].].{.].].].].].].].].].].{.{.).).$X).`.).).).`.^.^.).^.).$X[.).].$X(.{.{.].oX{.{.|.}.{.oXoX]. X.X}.}.}.OXOX{.}.OXOX}.}.+X}.OX{.+X}. X}.oX].].oX[.].(.).~.).)./.~.).).].(.)._.).).^.].8 6 O , I I # # O Y E.).)._.).).).).).).).).).).).).`.].].].`.].).].(.].].).].].].].{.{.}.}.{.oX{. X[.].}.{.].].].{.).{.{.{.).{.).).].].).].).].).).",
+"].{.}.].].].$X].{.{.].].].].].].].{.{.].].}.].].{.{.].}.}.{.oX}.}.}.}.}.}.}.}.}.].}.{.{.oX].oX{.}.].].[.{.].].].].].{.{.).].$X).).$X].(.$X).{.].].].].].).{.oX{.$XoX{.{.|.{.OX$X$XOXoX X XOX}.}.oX X.X+X}.|.&XOX|.OX}.OX}.}.}.{.$X{.}.[.].].).$X].].).].].).^.].]._.$X_.$X^.~.K.6 8 < < 6 6 , 0 %X^.).].).^.).).).`.).).).).].).$X].).].].].].].].(.].].{.{.{.].{.{.{.}.}.}.}.}.}.}.}.}.oX].].].).].).).).].).{.).].].).).].].).{.",
+"{.{.}.[.].].].{.{.{.{.{.].[.].].].].].{.].}.].}.].}.}. X}.}. X}.}. X}.}.}.}.}.}.}.}.}.].}.}.{.{.].}.}.}.}.}.}.[.{.|.].{.].].).$X).].{.{.{.(.].].).{.(.[.].{.{.{.oXoX[.}.OX$X X X X$X].oXOX{.oX}.}.OXoX X}.&X}.+X.X XOXoX|.}.}.}.oX].].].].].].].].).).)./.`.(.`._.~.).).)._.].).Y.[ Y I R Y E Q._._._._.^.).).`.).$X).).).).).).).].`.).$X`.].).].].].].{.{.}.}.}.{.}.}.}.}.}.}.}.}.}.].oX].].].{.).).).).].].).].].).].).].).].).",
+"}.{.{.].{.{.{.{.].{.$X{.}.].].].{.].].{.}.].}.]. X}.}.}.}. X}.OX XOXOXOXOX X X X}.}. X}.}.}.oXoX}.}.].}.}.].}.}.].|.{.$X].].{.).$X`.`.$X^.].).$X].].}.}.{.{.{.{. X{.}.oXOX].}.}.OX}.OX X}.OX X XOXoX X.X XoX+X.X}.oXoX X}.{.].oX$XoX].].{.{.).).].).].(.}.E.]._.^.~.Q.)._.).^.`.E.^././.W.~.^.).^.(.~.].!.).^.].).).).).].).).(.).`.].).).].].].[.].].].].].].[.{.}.}.{.}.{.}.}.}.}.}.}.].].].].).].].{.).).).).].).].).].).].).{.",
+"}.}.}.}.{.}.oX].{.oX{.oX].{.{.{.oX].].}.}.$X}.}.OX}.}.oX}.OXOX}.OX}.OXOXOXOX}. X}.|.}.}.}.}.}.}.].}.}.}.{.}.{.}.G.[ [ $XoXJ.[ [ T.).$X[.).$X).[.$XoX].].).oXoXoX].{. X{.}.OX[ [ Y.}.}.+X X&X|.OX XoXOXOXOX}.OXOX.XOXOX XOX XoX$X}.].).{.{.].).{.^.oXJ.I I ^._.).W.Y I R E !._.~.).^.~.E I R ~.[.!.).!.E I P ^.].).{.).).).).).].$X`.).].).].).).].].].].{.oX].}.{.{.}.{.{.oX}.}.}.}.}.}.].].].].).].).].).).].).).].].).).).).).).",
+"}.}.oX}.}.}.}.}.}.}.{.{.{.{.{.{.].}.}.].}.}.}.}.}.}.OX+XOXOXOXOXOXOXOXOXOXOXOX XOX X X X}.}.}.}.}.}.].].}.}.oX{.I 6 1 $X].[ 7 # P.].{.].).$X[.].{.$X).{.oX{.).|.{.}.[. X}. X# O [ .X X.X|.oX X.X+X{.#X.XOXoXOX X.X.XoXoX[. X}.}.XX[.{.{.{.).{.).[.Y.I $ O {.].R.8 8 8 0 O Y [.Q.T.~.[ , # % ].^.).(.E O 7 # (.).).].).].).{.).].).].].).].).).].].].}.].].].}.}.{.{.}.}.{.}.}.}.}.{.].oX].}.].].].].].).].).).).).).).].{.).$X).].",
+" X}. X}.}.}.oX}.}.{.}.oX}.}.{.oX}.{.}.}.}.].}.}.OX}.OXOX}.+XOXOX+XOXOXOXOX X+X X X X X X}.}.}.{.}.}.}.oX}.}.}.}.U < , ].{.[ O 7 Y.'.{.H.G.[ [ '.}.(.J.Y.'.H.{ J. Xv.G.J..X X5 6 ' G.G.'..X+XY.Y.'.OXJ.Y.'.+XJ.%X'.{ H.|.'.[ [ '.J.J./.{.].).].).R 1 5 5 8 Q.[.E # 0 ~.W.8 8 H.^.R.H.# # 5 7 ~.^.(.H.# # O 5 (.).).).).].).).].).).).).].{.).).{.].].[.].{.{.].[.}.{.{.}.}.}.{.}.}.}.}.{.{.$X].].].).].(.).).).].{.).).).).).).).^.",
+"|. X X}.}. X}.oX{.oX}.|.}.{.}.}. X}.}. X X X X XOX}.OXOX+X+XOX+XOXOXOXOXOXOX+X XoXOX+XoXOXOXOX}.}. X}. X}.}. X}.P 5 , G.[ U 5 5 J. XY # , 1 O 8 '.|.1 , I , 7 , I 1 % 1 Y.}.7 < # < # 8 '.XXO 1 K. X8 # K. X# # 9 8 I XX1 # 8 I 7 1 K.{.].].{.].< 8 Y O # ^./.E 6 I ~.~.I 1 E !.P.# I R 7 # ~.^.J.8 I Y < 6 ].].{.).{.).{.).).].].].).].).].$X).].].{.].].].}.}.{.}.{.}.}.{.}.{.{.{.].{.{.].].$X).].).].].(.).(.).).).).).).$X).).",
+"}. XOX}.OX}.}.}.}.}.}.}.}.}.|.oX|.oX}. X X X XOXOXOX+X+X@X+X+X+X+XOX+X+X+X+X+X+X+X+XOXOXOX}.}.OX X X}. X X}. X}.P 6 O 8 , 6 6 # P.].[ Y [ J.8 # [ XX# O R K.$ # I J.# 5 G. X8 # Y XX8 8 Y AX5 O [ @X# , ' ZX# 7 8 K.'.G.1 1 K.G.# 1 K.].).).].].G.%X[ , 7 _.).H.5 7 G.E O # E T.I O H.b.O 8 /./.0 7 J.[ < 7 [.[.).].).{.).].).).).].`.].].].].{.}.].].].].}.}.}.{.{.}.}.}.{.{.{.{.{.{.{.].].].).{.).).).)._.).).).$X).).).).).).).",
+"+X+X XOX X XoX XoX|.}. XoX}. X X X X X}. XOX}.OXOXOXOX+X+X+X#X+X+X+X+X@X#X+X#X+X+X+X+X+X+XOXOXOX X X X X X}.}. XY O , [ [ U O 7 Y.].W.[ U 7 O 5 b. X# 8 T XX# < b.XX5 6 [ .X# 5 [ .XI # R XX6 5 G. X7 , G..X5 5 [ .X|.{ 8 O XXK.# # J.}.{.{.(.].].$XE < # ).).!.T , 1 1 8 5 [ R # I E 9 , # T R < 0 E I 5 , E ].{.(.{.(.(.(.].{.].).].].].].$X].].}.}.].].].}.].{.}.{.{.{.oX{.}.{.{.{.{.].).].].).].].).).)._.).).).).)._.).).).).",
+"OX XOX X X X X X XoXOX}.}.OX XoX XoXOX+XOX.X.XOX.X+X+X+X#X@X@X@X+X+X+X+X+X+X@X+XOX+XOX+X+XOX+XOXOX XoX X X X XoXP 5 O }.{.G.5 # J.'.7 7 Y J.7 5 [ |.O # [ {.5 $ G.|.$ , [  X5 $ G.ZXP 7 R ZXO 7 F.ZX# 5 G..X# # G.#XoXH.O 1 %XK.# O K.}.].].].].).).[ 6 < ~.~._._.{ v.P.I 1 G.I # # 5 5 # 7 , P , , , 7 $ 6 1 [.).].).].{.).).).).).].].$X].{.].].].{.].}.}.$X}.}.].}.}.{.{.{.{.{.{.].].].].).].].).).).).).).).^.^.).).).$X_.).).",
+"OX+X}.OX XOX X X X.X X+X X X X X+X+XOX+XOX+X XOX#X+X#X@X+X@X@X@X@X+X@X+X+X+X+X+X+X+X+X+X+XOXOXOXOXOXOX X X}. XOXU # # .X|.[ , # J.J.8 5 [ F.7 1 [ {.5 1 K.}., $ [ }.5 O G..X5 6 0 J.# O K.ZX8 # I Y O 6 G..XO 7 {  X X/.8 # 0 8 # 7 J.].$X].).[.]._.[ 5 7 '.!.U.7 1 T E % 8 T.E [ T [ I # O [ v.T [ [ P , O [ ).].).].).].).{.).].].].].].{.].{.].].].}.].].].].}.].oX{.oX{.$X{.{.{.$X$X].].].).).].].].).).).).).).^.).).).).).).",
+"OXOXOXOX X+X XOXOXOXOXOXOXOXOXOXOX+XOX+X+X+X+X@X+X+X#X@X@X@X@X@X@X@X@X+X+XOX+X+X#X+X+XoXOX+X+X+XOXOX+X X X X X}.Y O 8 XXOX[ # , Y..XP # 1 I I 1 _ }.7 7 [ OX1 # {  X# 5 G.OX8 # _ 5 5 I .X.X[ , O I I 8 K.XX7 1 G.#X X[.J._ Y G.# , J.[.].$X].].`.].[ 1 1 W.).!.b.5 8 , 1 J.E.`.E.E.W.E 1 1 %X^.).).[.[ 1 1 /.].).).].).).).{.).).{.).{.{.].].{.].].].}.}.].].].].}.$X}.$XoX].}.}.].].].].].].].).{.).).(.).).(._._.^.^.).).).).).",
+"+XOX+XOX X+X+XOXOXOXOX+XOXOXOXOX+X+X+X#X#X@X@X+X@X@X@X@X@X@X&X@X@X+X+X+X+X+X+X+X+X+X+X#X+X+X+X#XOXOXoX+X X XoX+X X.X.X&XoXoX XOX}.|.}.J.Y. X+X|.OXoXXX}. XoX}.|. X|..X X#XoX.X.X.X'.'.@X@X.X.X'.%X.X+X.X}.@X@X X.X[. X%XI F.J.G.# , Y.[.).).`.$X`.^._.(.~.^.E.^.^.T.H.H.~.R.`.E.E.`.!.(./._.$X!.^.).).!._.!.oX).).].].).).).).].).).].).(.].].{.].}.].].].].}.}.].}.].$X}.}.}.].}.].].].{.].].].).{.).).).).)._._._.).^._.).).).).",
+"+X.X X.X.X+X.X+X+X+X+X.X+X+X+X+X+X+X+X#X@X@X@X#X@X+X+X@X@X@X@X@X&X+X+X+X+X+X+X+X+X#XoX#XOXOXOX+XOXOX+XOX X XOXOX.X+X+XOX}.OXOX X+X{.OX#X.X X XoX+XoX|.}.OX{.}.oXOX+X X+XOX+XOX@X.X@X@X.X.X@X+X.X@X+XOXOX+X@X XoX+X{.OX[.8 # 5 , , R [.{.].].).^.(._._.Q.Q.^.Q.Q._.^.!.!.^.!./.!.~.~.Q.~.^.).Q.[.).).^.^.).(.~.).).].).).).$X).).(.).].].].).{.).}.].}.}.].].].].].oX{.}.oX].].}.].].].].{.$X).$X{.).].).(.).).(.^._.(.^._.).).).).",
+"+X+X+X+X+X+X+X&X+X+X@X@X@X.X@X+X+X+X@X@X@X@X@X@X@X@X#X@X+X@X@X@X+X+X+X.X+X+X+X+X#X+X#X+X#X+XOXOXOXOXOXOXOXOX+XOX.XoX+X+X+X X}.}.{.oX+XOX X X XoX X|.}.}. X|.}.|.+XoXoX+X+XoXoX+X&X@X+X&X+X@X+X.X+X+XOX+XoX+X+XoX XOX{.+X'.K.[ { K.'.{.^.].^.].).(._.)./.(._.!.Q.!._.T.!.Q._.T.!.~.~.!.~.^.!.!.!.~.).]./.]._.~.).).).).).).).).$X].).).).).{.).].].].].].].}.].].].].].].].].oX].].}.}.[.{.).$X).).].).).).).).!.^.).^.^.[.).).).).",
+"+X+X+X+X&X+X.X@X@X@X@X@X@X@X@X@X+X@X@X@X@X@X@X@X@X@X@X@X@X@X+X@X+X+X.X&XoX+X+X+XoX+X+X+X+X+X+X#X X.X.XoX+X.X+X.X#X+X#XOXOXOX+XOXOX+XOX[.OX#XOXOXOX X+XOX X X XoXOX X+XOX#X#X#XOXOX#X@X+XOX#X+X+X#XOX#X#X+X.XOXOXOXoX}.{.|.|.].{.].{._.).].].).).(.).^.(.~._.!.!.!.E.^.E.`.E.~.~.!.!.^._.^.!.).^.(.~.]._._.!.$X~.).).).).).$X).).).).).).).].$X).].].{.{.].].].}.].}.].}.].oX}.$X{.{.{.{.].).$X].).].).).(._._.)._.^.~.).).).).).).",
+"@X+X@X@X+X+X@X@X@X@X@X@X@X@X@X@X@X@X+X@X@X@X@XAX@X@X+X@X@X+X@X@X.X+X.X X#XoX+X+X+X+X+X+X+X+X+XOX+X+X+X.X+X+X+X.X.X+X+X+X+XOXOXOXoX+X X+XOX}. XOX|.OX}. X X}.oX+XOX XoX}.#X XOX@X+X#X+X+X@X}.oX+XoX+X+X}.+XOX+X+X|.oXOXoX}.{.{.].$X).].]._.].(.).(.).^.~.Q.^.~.Q.E._._._.Q.Q.E.Q.Q.Q.^.Q.^.^.Q.^.(.~.!.~.^.)._.[.).).).).).).).).).].).].].].].$X].[.[.].].].}.].].].].}.].].].].{.{.].{.].].].].].).[._.).).)._.(.^.).~.).).).).$X",
+"@X@X+X@X@X+X@X@X&XDX@X&X@X@X@X@X@X@XAX@X@X@X@X@X@X@X@X@X+X+X+X.X+XOX+XOX+X#XoX#X+X+X#X+X+X+XOX+X+XOX.X X.XoX.X+X+X#X+X+X+XOX+X+XOX+XOX+XOXOXOXOXOXOXOXOXOX X X XOX}. XOXOXOXOX+X+X+X+X+X+XOX X X X X X+X+XOX X X X}.}.}.}.{.{.{.].(.].).).).).).^.^.(.~.Q.Q.Q.~.!.!.!.!.Q.^.Q.^.~.Q.!.!.!.^.^.).~.^.).^.^.).^.^.).).^.).).).).].).{.).{.).).].].{.{.{.].{.}.].].].].].].}.].}.].].].{.{.{.{.].).].).).).).(.).(.).).)._.)._.).).).",
+"@X@X@X@X@X@X@X@X@X@X@X@XDX@X@X@X@X@X@X@X@X@X@X@X@X@X@X@X@X+X+X+XOX+X+X+X+X+X#X+X+X+X+X+X+XoX+XOX+XOX+X+X+X.X+X@X@X+X#X+X+X+X+XOX+XOXOXOXOX+XOXOXOXOXOXOXOX X X X X X XOXOX+XOX+X+X+X+X+XOXOXOXOX X XoX+XOXOX X X}. X}.oX}.}.{.].].).].).).).^.).)._._.~.Q.Q.Q.Q.!.!.!.E.Q.Q.^.Q.Q.^.~.!._.^._.^.(.^._.^.^.^.~._.).).).^.).).).).).).).).).[.[.$X$X{.{.].].].].].}.[.$X].].].}.].].{.).{.).{.).).).].).(.].).).(._.~.).).).).).).).",
+"@X@X@X@X@X@XAX&X@X@X@X&XFX@X@X@X@X@X@X@X@X@X@X@X@X@X@X@X@X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+XOX+X+XOXOX+X+X+X+X+X@X@X@X@X+X+X+X+X+X+X+X+XOX+XOXOXOX XOX XOX+X}. XOX XoXoXOXOXOXOXOX+XOXOXOXOXOX X X X X X XOXOXOX XOX}.}.}.}.{.{.{.).].(.).).).^.).~.!.!.!.Q.Q.Q.Q.Q.Q.!.Q.Q.!.Q.!.!.~.!.Q.~.!.~.).^.).^.^.(._._.^.^.).^.^.).).).(.).).^.{.).].].].oX].].].{.].].].].].].$X].].{.].).{.].].).].).].).].).).).].).(.).).).).).).).).).",
+"@X@X@X@XFX@X@X@X&XAX@X@X@X@X&X@X@X@X@X@X@X@X@XDX@X@X+X@X@X+X+X+X+X+X+X#X#X+X+X+X+X+X+X+XOX+XOXOX+X+X+X+X+X@X@X@X@X@X@X@X@X+X+X+X+X+X+X+X+X+XOXOX+XOXOXOX+X+X X X XOX+X+X+X+XOXOXOXOX+XOXOX XOX X X+XoX X XOX}.OXOX}.}.{.}.{.{.{.].].].(.)._.).^.~.!.~.Q.Q.Q.Q.Q.Q.Q.Q.~.Q.Q.Q.~.^.Q.!.!.!.~.~._.^.(.(._.^.^.~.!._.~.~._.~.).).).).).{.).{.].].].].].].].{.].].].].].].`.).].].].{.).$X).].].).].).].(.).).(.).(.).).).).).].).).).",
+"&XAX@X@X@X@X+X@XFXFX@XFXFX&XDX@X@X@X@X@X@X@X@X@X@X@X+X@X+X+X+X+X+X+X@X+X#X#X+X+X+X#X+X+XOXOX+XOXOX+X+X@X#X#X+X@X@X@X@X+X@X+X+X+X+X.X+X+X+X+X+X+XOX+X+XOX X+X}.OX}. X XoXOXOXOXOX+X+X+XoXOX+X X X XoX X X}.OXOX}.}.OX}.}.{.{.{.{.].(.].(._.).~.^._.~.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.~.Q.Q.!.!.Q.~.!.^.(._.^.).^._.~.~._.!.!.~.~._.~._.~._.^.(.].).).].}.].{.].{.].].].{.).].].].].].].].].).).{.).{.].].].).).(.].(.).).).).).).).).).].].).).",
+"@X&XFX@X&X@XFX@X@X@X@X@X@XAX@X@X@X@X@X@X@X@X@X@X@X@X@X@X+X+X+X+X+X+X+X+X+X+X+X#X+X+XOXOXOX+XOXOX+X+X#X+X@X@X@X@X@X@X@X@X@X@X+X+X#X.X+X.X#X+XOX.X+XOX X+X+XoX X XOX X X XOX XOXOXoX XOX+XOX}.OX XoX X X}.OX}.}. X}.}.}.}.{.oX{.].].].).).).~._.(.^.~.!.!.Q.R.^.^.Q.Q.~.Q.Q.Q.!.~.!.~.!.!.^._.^.(.^.^.~._.^.~.~.!.~.!.~.~.~._._.~.).).].{.].].].{.{.].{.{.{.].{.{.].].].].].].].].{.).{.).`.].).].].).).).].].].).).].].).].).).].)."
+};
diff --git a/images/scenario4hilite.xpm b/images/scenario4hilite.xpm
new file mode 100644 (file)
index 0000000..f765918
--- /dev/null
@@ -0,0 +1,450 @@
+/* XPM */
+static char *scenario_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"209 188 256 2",
+"   c #283629",
+".  c #3B3C3B",
+"X  c #363736",
+"o  c #2F2F2E",
+"O  c #1D321F",
+"+  c #1D3E69",
+"@  c #123976",
+"#  c #393A43",
+"$  c #2D2E50",
+"%  c #233E6B",
+"&  c #253D67",
+"*  c #30346E",
+"=  c #1E1D5F",
+"-  c #155015",
+";  c #137415",
+":  c #0C730C",
+">  c #394437",
+",  c #30502D",
+"<  c #306730",
+"1  c #23601F",
+"2  c #1C426C",
+"3  c #1A4267",
+"4  c #1C4571",
+"5  c #0C446C",
+"6  c #3A4443",
+"7  c #34504F",
+"8  c #22416B",
+"9  c #254268",
+"0  c #244472",
+"q  c #335075",
+"w  c #335D6F",
+"e  c #463A37",
+"r  c #503730",
+"t  c #6C3734",
+"y  c #692616",
+"u  c #443B43",
+"i  c #513A4C",
+"p  c #5B3261",
+"a  c #4A4A2B",
+"s  c #464637",
+"d  c #574739",
+"f  c #50532F",
+"g  c #516C32",
+"h  c #6D4E35",
+"j  c #736C34",
+"k  c #62491A",
+"l  c #434343",
+"z  c #484948",
+"x  c #485647",
+"c  c #57544A",
+"v  c #575654",
+"b  c #514C4E",
+"n  c #525470",
+"m  c #53654C",
+"M  c #675748",
+"N  c #675855",
+"B  c #745859",
+"V  c #70504A",
+"C  c #6E576B",
+"Z  c #786554",
+"A  c #6E6F4C",
+"S  c #706C6E",
+"D  c #506E73",
+"F  c #1F348F",
+"G  c #375586",
+"H  c #386284",
+"J  c #3B6B95",
+"K  c #3C7DA3",
+"L  c #3942AA",
+"P  c #425684",
+"I  c #44568A",
+"U  c #415983",
+"Y  c #44598B",
+"T  c #48598B",
+"R  c #475C91",
+"E  c #50518E",
+"W  c #5152AB",
+"Q  c #446684",
+"!  c #467C99",
+"~  c #536B99",
+"^  c #4A6695",
+"/  c #477CA4",
+"(  c #5078A5",
+")  c #67578C",
+"_  c #716B8D",
+"`  c #7666B4",
+"'  c #6357AF",
+"]  c #5355C9",
+"[  c #5D63ED",
+"{  c #5C63E4",
+"}  c #5C63F1",
+"|  c #7668D1",
+" . c #6364E6",
+".. c #6264EA",
+"X. c #6B66E6",
+"o. c #6365F2",
+"O. c #7264E5",
+"+. c #5D5FD7",
+"@. c #4A3EA6",
+"#. c #289B1C",
+"$. c #00DC00",
+"%. c #0BDB05",
+"&. c #17D80A",
+"*. c #1ED00F",
+"=. c #00E300",
+"-. c #00EA00",
+";. c #0BE303",
+":. c #00F200",
+">. c #13E306",
+",. c #26CB0A",
+"<. c #28CB0E",
+"1. c #23CF03",
+"2. c #2ACB14",
+"3. c #24D503",
+"4. c #25DA04",
+"5. c #24D60C",
+"6. c #25D311",
+"7. c #37C71A",
+"8. c #34D215",
+"9. c #2CD510",
+"0. c #568E34",
+"q. c #48B924",
+"w. c #57B929",
+"e. c #53A72F",
+"r. c #65B52D",
+"t. c #68B231",
+"y. c #78A938",
+"u. c #70AC31",
+"i. c #699D2D",
+"p. c #568D4B",
+"a. c #6A8545",
+"s. c #6E936F",
+"d. c #58A15E",
+"f. c #44C61E",
+"g. c #48C222",
+"h. c #53C324",
+"j. c #6ED331",
+"k. c #3EA843",
+"l. c #55859D",
+"z. c #4E809B",
+"x. c #4A82A6",
+"c. c #5584A9",
+"v. c #5795BA",
+"b. c #508EB7",
+"n. c #6499BC",
+"m. c #6D92A9",
+"M. c #709AAA",
+"N. c #459DD3",
+"B. c #489ED4",
+"V. c #589CC9",
+"C. c #4F99C8",
+"Z. c #4BA1D4",
+"A. c #46A1D4",
+"S. c #5AA1CB",
+"D. c #53A5D6",
+"F. c #55A6D8",
+"G. c #56A8D8",
+"H. c #5CAAD9",
+"J. c #59A8D7",
+"K. c #4EA8D2",
+"L. c #649AC3",
+"P. c #64A4CD",
+"I. c #62AEDB",
+"U. c #66AAD4",
+"Y. c #66B0DC",
+"T. c #6AB2DD",
+"R. c #6CB5DB",
+"E. c #73ACD3",
+"W. c #71B5DD",
+"Q. c #73B8DE",
+"!. c #7BB9DC",
+"~. c #78B4D9",
+"^. c #75AACA",
+"/. c #6DB6E0",
+"(. c #73B6E0",
+"). c #74B9E1",
+"_. c #7BBBE2",
+"`. c #79B6E1",
+"'. c #7BC0E4",
+"]. c #75C0DF",
+"[. c #3F9DD1",
+"{. c #982924",
+"}. c #8C5036",
+"|. c #8D6C37",
+" X c #AB5F30",
+".X c #8A5650",
+"XX c #866558",
+"oX c #976859",
+"OX c #8E6C4C",
+"+X c #8B6D6F",
+"@X c #B7755C",
+"#X c #AB6F51",
+"$X c #B3756B",
+"%X c #9C575B",
+"&X c #C7241F",
+"*X c #CE672C",
+"=X c #D47D5C",
+"-X c #C67859",
+";X c #CD7C62",
+":X c #C87763",
+">X c #D37A65",
+",X c #DB7569",
+"<X c #D97868",
+"1X c #D77965",
+"2X c #C47977",
+"3X c #E2736C",
+"4X c #EC6E71",
+"5X c #E27A4F",
+"6X c #9F3B42",
+"7X c #8C718D",
+"8X c #8E6DB3",
+"9X c #AE748F",
+"0X c #A86CA2",
+"qX c #8667C8",
+"wX c #C47583",
+"eX c #84A43B",
+"rX c #91A03E",
+"tX c #969437",
+"yX c #979947",
+"uX c #8D974B",
+"iX c #958A73",
+"pX c #88A241",
+"aX c #91A144",
+"sX c #AC8D53",
+"dX c #A3954C",
+"fX c #A89151",
+"gX c #B78957",
+"hX c #B38E4D",
+"jX c #AE9A66",
+"kX c #D69B2D",
+"lX c #C3825D",
+"zX c #C68459",
+"xX c #D38654",
+"cX c #C98060",
+"vX c #D68567",
+"bX c #E58251",
+"nX c #CFCE43",
+"mX c #8F908D",
+"MX c #ABAFAB",
+"NX c #9FA399",
+"BX c #83BBDB",
+"VX c #8BB5C8",
+"CX c #80BDE3",
+"ZX c #85B8E3",
+"AX c #90C4DB",
+"SX c #83C0E4",
+"DX c #8BC4E4",
+"FX c #97C7E5",
+"GX c #9ED0EE",
+"HX c #A9D3E8",
+"JX c #B6D9E8",
+"KX c #A9D0EA",
+"LX c #ACD0D8",
+"PX c #C8E4EF",
+"IX c #C6D1D9",
+"UX c #B7BFA5",
+/* pixels */
+"H.I.H.I.I.H.Y.Y.I.Y.I.T.I.T.T.T.T.T.T.W.W.W.R.W.W.W.(./.W.T.T.(.T.T.T.Y.T.Y.Y.T.U.I.I.H.H.H.H.J.J.G.D.D.D.D.D.D.D.D.D.F.F.D.D.F.F.D.D.F.J.F.H.H.H.H.H.H.H.H.H.H.H.I.H.H.H.I.H.I.H.I.H.H.H.H.I.H.J.G.G.H.G.H.G.H.H.J.J.F.F.D.D.D.D.D.D.Z.D.D.Z.Z.D.D.D.B.F.Z.F.D.D.D.D.D.D.Z.D.D.D.D.D.D.G.G.G.H.G.H.H.H.H.H.I.H.H.I.H.H./.I.Y.Y.Y.T.I.T.Y.Y.T.T.Y.T.T.T.T.W.T.T.T.(.(.(.R.).(.).).).(.(.(.(.`.(.).(.W.).).).).Q.).).).).).`.).).).",
+"H.I.Y.H.I.H.Y.H.I.I.Y.I.T.U.T.T.T.T.T.T.T.W.T.W.W.W.W.(.T./.T.T.W.T.T.T.T.Y.Y.Y.Y.I.I.H.H.J.J.J.G.D.D.D.D.D.D.D.D.D.D.B.D.F.D.F.F.D.F.F.J.H.H.H.H.H.H.H.H.Y.H.Y.H.H.H.H.I.H.I.H.I.H.I.H.H.H.H.J.G.J.G.G.H.G.H.G.G.G.F.J.D.D.F.D.D.D.Z.D.C.D.D.D.F.Z.F.B.B.F.D.B.D.Z.B.F.Z.D.Z.D.D.D.D.D.F.F.G.H.H.H.H.G.H.H.H.H.I.H.I.H.H.I.Y.Y.I.I.Y.Y.T.Y.Y.Y.T.Y.Y.T.T.T./.(.W.T.T.(.W.W.(.)./.)._.(.(.).).(.).).).).W.Q.Q.Q.)._.).).Q.).).`.).",
+"H.H.Y.Y.I.H.H.Y.I.I.I.Y.Y.Y.T.T.T.T.T.T.W.T.T.R.(.W.(././.T.T.W.T.T.T.T.Y.Y.T.Y.I.U.H.H.H.H.H.J.J.F.G.D.D.D.D.D.D.D.F.Z.D.F.D.D.F.F.F.F.H.H.H.H.I.H.H.I.H.H.H.H.H.H.H.H.H.H.I.I.I.H.H.H.H.J.H.H.G.J.G.J.G.H.G.H.G.G.G.G.F.F.F.D.B.D.D.Z.D.K.Z.D.B.D.Z.Z.D.B.B.D.D.D.C.K.D.D.D.D.D.D.D.J.F.J.G.G.G.F.H.H.H.H.I.H.H.I.I.H.I.I.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.T.T.T.T.T.T././.(.T.(.(.(.(.(.(.(.(.(.(._.W.).(.(.(.(.W.W.(.(.(.).).`.).).).",
+"H.Y.H.H.I.I.I.Y.I.I.I.Y.I.Y.U.Y.T.T.T.T.T.T.T.T.T.W.T.T.W./.T.T.T.W.T.T.R.Y.T.U.I.I.I.I.H.H.J.J.F.F.G.D.D.D.D.D.D.D.D.D.B.F.D.D.F.F.F.F.H.H.H.H.H.I.H.I.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.J.H.D.D.J.J.G.J.G.G.G.H.G.H.F.F.F.F.D.D.D.D.Z.D.Z.D.Z.D.D.Z.Z.Z.Z.Z.Z.Z.Z.Z.D.Z.B.F.Z.D.F.F.F.F.J.G.J.G.H.H.H.H.H.H.I.H.I.H.I.I.I.I.I.Y.Y.T.I.Y.Y.Y.Y.Y.Y.T.Y.T.T.T.T.T./.(.T.T.W.T.R.W.W.T.(.(.(.(.(.).(.(.(.(.(.(.).W.(.(.(.).).).).).W.",
+"H.I.I.I.H.I.I.I.I.I.Y.I.Y.I.Y.Y.Y.Y.R.Y.Y.R.T.T.T././.Y.T.T.T.T.T.T.T.Y.Y.Y.T.I.I.I.H.H.H.H.H.J.H.F.F.D.D.D.D.D.F.D.D.F.D.D.D.F.F.F.J.F.H.H.H.H.H.I.I.H.H.H.H.G.G.H.H.H.H.H.H.H.H.H.H.J.G.G.G.D.D.J.G.J.G.G.G.J.F.F.F.F.D.D.D.D.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.B.Z.Z.Z.Z.Z.Z.D.Z.D.D.D.D.F.F.D.K.F.F.H.H.H.H.H.H.H.H.I.I.I.I.Y.I.Y.Y.Y.Y.Y.Y.Y.Y.I.Y.Y.Y.T.Y.T.T.T.T.T./.W.T.R.T.R.W.W.W.(.).(.)./.(.).(.).).(./.W./.(.W.(.W.).).Q.`.",
+"H.H.H.H.I.H.I.I.I.Y.I.Y.I.Y.Y.Y.Y.Y.Y.Y.Y.T.T.T.T.T.Y./.T././.T.R.T.T.T.Y.Y.I.I.I.I.I.I.H.H.H.J.F.F.F.D.D.D.D.D.F.D.F.Z.D.D.F.F.F.F.F.F.H.H.H.H.I.H.H.H.H.H.H.G.H.G.G.H.H.H.H.H.H.H.H.J.J.J.G.G.F.J.D.D.G.G.G.G.F.F.F.F.D.D.B.D.D.Z.Z.D.Z.D.A.Z.A.Z.Z.Z.A.Z.A.Z.A.B.Z.Z.B.Z.D.D.D.D.F.F.D.D.D.G.H.H.G.H.H.H.H.I.I.H.I.H.I.I.I.I.H.Y.Y.I.I.Y.I.Y.Y.Y.Y.T.T.Y.T.T.T.T.T.T.T.T.T.E.T.T.W.W.).W.W.).(.(.)./.W.(./.(.W.(.W./.W.).W.).).",
+"H.I.I.I.H.I.I.H.Y.I.I.I.I.I.Y.Y.Y.Y.Y.Y.Y.Y.R.T.Y.T.Y.T./.T.T./.R.Y.U.T.Y.Y.Y.I.H.H.I.H.H.H.J.H.F.F.F.F.F.F.D.D.D.D.D.D.D.D.F.G.F.G.H.H.H.H.H.H.H.H.H.H.H.H.G.G.G.G.G.G.F.H.H.J.H.H.J.J.G.G.F.G.F.F.G.D.K.G.K.J.F.D.D.D.D.Z.Z.Z.B.Z.Z.Z.B.Z.Z.Z.Z.Z.B.Z.B.B.B.B.N.Z.Z.Z.D.D.Z.D.D.D.D.D.D.D.G.G.F.G.J.G.H.H.I.H.H.I.I.I.I.I.I.I.Y.I.I.Y.I.I.Y.I.Y.Y.Y.Y.T.T.T.T.T.T.W.T.T.T.T.T.T.T.W.W.W.(.W./.W.(.).W.(.(.(.W.W.(.W.W.).W.`.).).",
+"H.H.H.I.I.H.I.I.Y.I.I.I.I.Y.I.I.T.Y.Y.Y.Y.Y.Y.Y.Y.T./.T.T.T.T.T.Y.Y.Y.T.Y.Y.T.H.I.I.H.H.H.H.H.J.F.H.D.D.D.F.D.F.D.D.D.D.D.D.D.G.J.F.J.H.H.H.H.H.H.H.H.H.H.H.G.G.J.G.G.H.G.F.J.J.H.D.D.J.G.K.F.J.F.F.F.F.D.G.K.J.F.Z.D.D.D.Z.Z.Z.B.Z.B.A.Z.Z.Z.Z.Z.Z.B.B.B.B.B.B.B.B.B.B.B.B.D.D.D.Z.D.D.D.D.D.D.G.H.H.G.H.H.Y.H.I.I.I.I.U.I.I.I.Y.I.I.I.I.I.I.I.I.I.Y.Y.Y.T.T.T.T.T.E.T.T.T.T.T.T.T.T.T.T.W.T.W./.T.W./.T.W./.W.W.W.).Q.).`.W.Q.W.",
+"H.H.I.I.H.I.H.I.I.H.I.I.Y.Y.Y.Y.I.T.Y.I.Y.T.I.I.Y.Y.Y.T.Y.T.Y.T./.I.I.Y.Y.Y.I.I.I.I.I.I.H.H.G.H.F.G.G.J.D.D.F.D.F.F.F.D.F.F.F.J.F.J.J.H.H.U.H.H.H.H.H.H.G.G.H.G.J.F.F.J.J.F.D.J.F.F.F.D.D.D.D.F.F.D.D.D.F.D.D.F.D.D.D.Z.B.B.D.Z.B.Z.B.B.B.Z.A.Z.Z.Z.Z.C.N.B.N.B.N.B.B.N.Z.Z.D.Z.B.D.Z.D.D.D.F.D.G.D.J.H.H.H.I.I.H.I.I.H.I.I.I.Y.I.I.I.I.I.I.I.I.I.Y.I.Y.Y.Y.T.T.R.T.Y.T.Y.T.Y.T.T.R.Y.R.T.R.T.T.W.Q.R.R.W.W.W.W.W.R.).Q.W.`.).W.Q.",
+"H.H.H.H.I.H.I.I.I.R.DXFXGXHXHXHXKXKXKXKXKXKXKXHXKXKXGXFXZXY.Y.I.Y.I.Y.Y.T.H.I.I.H.H.H.H.H.H.G.G.F.G.J.D.D.D.D.F.F.D.D.F.F.J.D.G.H.H.H.H.H.H.H.H.H.H.H.G.H.G.G.G.D.J.F.G.D.F.J.D.F.D.D.F.F.F.Z.D.D.D.D.Z.B.D.D.B.B.Z.Z.B.B.B.B.B.Z.Z.A.B.A.Z.Z.Z.Z.B.A.N.N.N.A.N.B.B.B.C.A.A.Z.C.F.Z.D.D.D.D.D.D.G.G.G.H.H.H.H.H.I.H.I.I.I.I.I.H.I.I.H.I.I.I.H.I.I.Y.Y.T.T.T.Y.T.T.T.T.T.T.K.I.E.!.BXBXSXBXCXCXBXCXZX!.BX!.R.U.C.W.W.).Q.).W.).).).",
+"H.I.I.H.H.I.H.I.I.DXGXHXJXJXPXPXPXPXPXPXPXPXPXPXPXJXJXGXFXBXI.I./.I./.I.Y.Y.Y.I.I.H.H.H.H.G.G.H.G.J.J.F.D.D.D.D.D.D.F.J.J.J.J.H.H.H.H.H.H.H.J.H.H.H.H.H.H.G.G.G.J.D.F.F.J.D.D.D.F.D.F.F.Z.D.F.F.F.F.Z.D.F.D.Z.D.Z.Z.Z.B.B.N.C.N.N.N.B.A.Z.Z.Z.A.B.B.A.B.N.N.N.B.B.B.B.B.A.Z.Z.K.B.D.Z.D.Z.D.D.D.G.G.G.H.H.H.H.H.I.H.I.H.H.I.I.H.H.I.I.I.I.I.H.I.I.I.Y.Y.Y.T.T.T.T.T.R.I.D.Y.`.FXFXHXHXHXJXJXHXJXHXHXJXHXGXDX~.E.D.).R.`.).).`.).W.",
+"H.H.I.H.I.H.I.I.H.FXHX3 9 9 & 9 0 8 8 % % & 8 % & + % 9 FXFXI.I.H.H.H.I.H.Y.I.I.H.I.H.I.H.H.G.H.J.G.G.F.J.J.D.F.J.F.J.F.G.G.G.G.F.H.J.H.H.H.H.H.H.H.H.G.G.H.G.G.J.J.D.D.D.D.D.D.B.D.Z.F.Z.F.Z.D.B.B.Z.Z.Z.Z.B.B.Z.B.B.B.N.N.N.N.B.N.B.B.Z.A.Z.A.B.B.A.B.N.N.N.N.A.N.B.B.Z.A.Z.Z.B.D.D.Z.D.D.F.D.D.D.G.G.H.H.H.H.H.I.H.H.I.H.I.I.H.I.H.I.I.H.I.I.I.Y.Y.Y.T.Y.T.Y.Y.R.Y.T.U.E.2 3 9 9 % % % + 2 % 8 & & 8 8 + 2 BXI.R.(.).).).).).).",
+"H.I.H.I.H.I.H.I.I.GXJX3 2 3 9 9 & 8 8 8 8 8 2 8 8 8 9 3 KXFXH.H.I.I.H.I.H.I.I.H.I.I.H.H.H.G.H.H.H.G.H.F.F.F.F.F.D.J.F.J.J.G.F.H.H.H.H.H.H.J.H.H.H.H.H.G.H.H.G.G.F.F.F.D.D.D.D.D.D.D.Z.F.Z.Z.D.Z.D.Z.Z.Z.Z.B.B.B.B.B.N.N.N.N.N.N.B.N.A.A.B.B.B.Z.B.B.B.N.N.N.N.N.B.B.B.B.B.B.B.Z.D.D.D.B.Z.D.D.Z.D.D.F.F.G.H.H.H.H.H.I.H.I.H.I.H.H.I.I.H.I.I.H.H.H.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.R.I.BX2 9 9 % 8 % 8 & 8 & 9 9 9 & + 8 & BXU.R.(.(.(.).).).W.",
+"H.H.H.I.H.I.H.I.H.GXPX3 0 8 0 & 2 + 8 8 + & 8 2 2 8 % 9 GXFXY.H.H.H.H.I.H.I.I.I.H.H.H.H.I.G.G.H.H.H.F.H.F.H.F.F.J.F.J.J.G.G.J.H.F.H.H.J.H.H.J.J.F.H.H.H.G.G.H.G.D.F.F.D.Z.D.Z.Z.Z.Z.B.Z.Z.D.Z.A.Z.Z.B.B.B.Z.B.B.B.B.N.N.N.N.N.N.N.N.N.A.N.B.N.A.B.B.B.B.N.N.A.N.B.N.N.B.B.N.B.Z.B.B.B.D.D.Z.Z.D.D.D.F.J.G.G.J.J.H.H.H.H.H.H.H.H.I.H.H.I.H.I.I.I.Y.H.Y.Y.Y.Y.Y.Y.Y.Y.I.I.U.BX3 9 8 % 8 8 % 9 8 8 8 8 9 2 2 2 9 FX~.W.R.(.(.(.).).).",
+"G.H.H.H.H.I.I.I.Y.HXPX9 & 2 4 9 9 9 8 3 + 3 8 8 8 8 & 9 GXDXH.J.J.J.J.J.H.J.H.H.H.H.Y.H.I.J.H.G.H.F.G.F.H.F.F.F.D.J.J.D.G.G.G.J.J.J.F.F.F.F.F.F.G.H.F.F.G.G.F.F.F.D.D.D.D.Z.Z.Z.A.Z.D.A.Z.Z.Z.Z.A.B.B.B.B.N.N.N.N.N.N.N.N.N.[.N.N.N.N.N.B.B.B.Z.B.B.B.B.B.N.N.N.N.N.N.N.N.A.B.B.Z.C.D.B.D.D.K.Z.K.K.D.F.J.J.J.F.F.F.J.J.U.F.J.J.H.H.I.H.H.H.U.H.H.I.I.U.Y.Y.T.I.Y.Y.I.I.S.`.4 3 & 9 & 9 % 2 3 & 3 2 & & 8 8 0 LX~.R.(.(.(.(.(.R.).",
+"G.I.H.H.H.H.H.I.H.GXPX4 % 3 9 PXPXPXPXPXPXPXPXPXJXPXHXHXFXSXH.H.I.H.J.H.U.H.H.H.I.I.H.H.H.H.H.H.U.H.I.H.I.H.H.H.J.J.J.H.H.H.H.H.H.H.H.H.H.H.I.H.H.H.H.H.H.H.F.F.J.F.D.F.D.D.D.D.F.D.B.D.B.D.B.B.B.B.B.B.N.N.B.N.N.N.N.N.N.N.N.N.N.N.N.B.N.B.B.B.B.B.N.N.B.B.B.N.N.B.B.B.B.B.B.B.D.B.B.D.B.Z.D.D.D.C.F.F.F.H.H.H.I.I.H.H.H.I.H.I.H.I.H.I.I.H.I.H.U.H.U.H.U.I.U.I.U.U.H.U.D.T.BXAXGXHXHXHXJXLXHXJXPXPXPX& + 0 + HXQ.R.T.(.(.(.(.(.W.",
+"G.G.H.H.H.H.H.I.H.KXPX+ 9 & q PXPXJXJXKXKXKXKXKXKXFXFXFXCXF.G.G.H.G.G.G.H.G.J.H.H.H.H.H.H.H.H.H.G.G.G.G.G.G.F.F.F.F.G.G.F.H.F.G.F.F.F.F.G.H.G.G.F.F.H.G.G.D.F.D.D.D.D.D.Z.D.Z.Z.Z.Z.Z.B.Z.Z.Z.A.A.N.A.N.A.N.N.N.[.[.[.N.[.N.[.N.N.N.[.A.N.[.[.B.N.N.N.N.N.N.N.[.N.A.[.A.[.A.N.B.A.B.A.A.Z.A.Z.D.Z.D.D.D.G.G.F.G.G.G.G.H.G.H.G.G.G.H.H.H.H.G.G.H.I.H.H.H.I.I.Y.H.I.I.H.I.H.C.Y.E.W.`.~.!.BX`.ZXBXAXIXPX& 2 9 & HX!.T.T.W.R.(.(.).W.",
+"G.H.H.H.H.H.H.H.H.HXPX9 & & q PXPXY.I.H.H.U.V.U.L.( R I R E E T T T Q T Y Y T T Y Y Y Y P T Y Y T Y T P T U Y T Y Y Y P Y Y Y Y I E Y I Y U Y Y Y P Y Y U Y U Y R G U Y G R R R I I T R I R I T Y Y Y Y Y I Y Y Y I I Y I Y Y Y U I I Y I T Y Y Y Y T T Y Y Y Y I T Y Y Y Y T T T Y T Y I T T Y Y T G Y T U Y Y Q Y Y T Y T T Y Q H Y Y J Y Y R Y Y R Y G R Y Y G J Y Y Y H G R ~ C.V.J.H.I.H.I.I.FXJX9 8 3 8 LX~.T.W.R.(./.(.Q.).",
+"J.G.G.H.H.H.H.H.G.HXPX0 % + % PXKXI.H.H.F.C.~ G E E I P T T G T I I I P Y T I I P T P T I I I I Y Y I I Y Y P I Y Y Y I Y Y I I I I I I I I Y U I Y I Y I I I Y T I I I T G G T I I I I I I G T I Y I I P I I I I I I I I I I I I I I I I I Y P Y Y Y I I Y Y Y I I I P I I I I I I Y T I I I Y Y R T I Y I I I I I Y P U Y Y I T T T I I I T P P P P T T I P T I P P T P U T I I I R J C.I.F.I.H.!.JX+ 2 9 8 HX~.T.(.T.R.(./.(.W.",
+"F.H.J.G.J.H.H.H.F.KXPX& % 8 9 JXKXH.H.H.C.( R T I G G P n q H Y P P P P U U P G U U U U U U P T I I I I I I I P P P P P P P P T I I I I I Y Y P P P P U U I P P P I I I I I I I I P I T I I I P U G P P U U U H Y P I U G Y U U P U U G U P U U G U P U P I U U U P P U G U P P P I Y G G I P I I I P P P P P P P P Y P P P P P G T G I U Y P G U U U G U U P P P U P U U U G P I I G R ~ b.Y.I.U.].LX9 2 & % HX!.T.T.T.(.(.).(.).",
+"J.F.F.F.G.H.G.G.H.HXPX3 % 0 9 PXGXH.H.V.W G G P Q k.7.3.&.4.4.4.3.3.3.3.3.3.4.4.4.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.4.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.4.4.3.3.3.3.4.3.3.3.3.3.3.3.4.4.3.3.3.3.4.4.3.3.4.3.3.3.3.3.3.3.3.3.4.4.3.4.4.4.3.4.3.3.3.3.3.3.3.3.&.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.4.3.4.3.3.4.4.4.3.4.3.4.4.4.4.4.3.3.4.4.4.4.3.q.p.R E R ^ V.F.I.Q.LX2 + 0 % LX!.T.T.T.W.(./.Q.(.",
+"F.J.H.F.J.J.H.J.G.HXPX2 % + 8 PXGXH.C.^ R T H D g.3.3.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.3.4.4.4.3.3.4.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.3.3.5.k.Y R R ^ C.J.R.HX2 8 9 % HXE.R.R.R.W.(.(.(.(.",
+"F.F.J.F.J.D.G.J.G.HXPX& % 2 + PXHXG.^ I I U d.2.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.k.w R W ( S.~.LX2 2 & & HX~.T.T.R.T.(.(.).(.",
+"F.F.J.F.G.J.D.D.G.HXPX9 0 + & PXHXb.J I I D 7.*.>.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.6.k.^ R ~ S.~.HX3 2 & & KX~.T./.W.(.W.W.W.R.",
+"F.G.G.G.D.J.D.J.F.KXJX0 % + 0 PXFXJ T I ^ e.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.2.d.L ^ b.E.LX9 8 0 3 FXW.T.T.T.T.W.(.(.).",
+"D.D.D.G.J.D.D.D.F.GXPX+ 8 2 % JXFXI T U d.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.&.4.4.4.4.4.4.4.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.5.q.H ^ / U.FX9 8 8 9 FXU.E.T.T.T.W.W.W.).",
+"D.D.G.D.J.D.J.D.F.GXJX0 & 9 % KXAXE E T k.&.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.aXyXyXeXr.r.eXyXyXyXrXy.g y.r.r.r.y.yXyXyXaXr.eXdXyXaXr.r.y.yXyXrXr.r.r.r.r.r.u.l.c.l.l.l.l.l.s.u.r.r.r.t.r.r.r.t.yXrXu.yXyXyXyXyXdXyXrXy.s.b.l.l.x.l.l.l.x.s.u.r.t.aXyXyXu.r.t.rXyXu.r.yXyXu.t.rXyXyXyXyXyXy.r.r.r.t.r.r.uXyXyXyXyXyXyXyXdXy.r.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.3.4.4.H R J L.BX3 9 9 9 AXT.T.T.T.T.`.T.W.R.",
+"D.D.D.G.D.J.D.D.F.FXKX4 9 3 8 GXBXT I ^ 2.&.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.;X;X<Xr.-.-.w.1X<XgX*.2.C i.-.-.-.h.>X>XlX2.-.%.yX3Xt.-.-.5.<X,XaX-.=.;.=.=.=.&.0X........X.O.uX-.=.=.-.-.;.;.-.3.xXhX;.gX,X;X>XzXyX>XdX-.iXo...{  . .{ ....iX-.-.:.fX4XgX&.-.-.dX;X&.-.fX;X;.-.yX3X1X=X1XpX$.=.=.-.;.-.:.pX,X;X<X3XdXzX<XyX%.-.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.U R ^ v.^.5 0 2 3 ^.F.U.Y.T.T.T.W.W.W.",
+"D.G.D.G.D.F.F.D.D.DXFXGXKXKXGXFX~.I P ~ 2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cXcX;XcXcXcX;X1XgX6.=.<.N @X>XcXcXcX>X3Xw.-.$.$.6.,Xt.=.$.%.yX,X,X>Xr.=.$.$.$.%.rX9Xo... . . .9XrX%.$.*.hX9XmX9X9X9X9XrXr.dX<X3XsX&.lXdX:.iX . . . . . . .X.iX-.$.$.q.yXzX;XyX-.yX1X-XzX1Xy.$.=.f.aXaX;X>X%.$.$.$.%.%.%.$.7.cX<XfXy.=.u.,X6.$.$.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.D R J b.v.W.~.ZXR.S.N.U.T.T.T.T./.W.W.",
+"D.D.G.D.F.F.F.J.F.D.AXDXFXAXDX!.C.Y P ~ 6.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cX>X>X;X>X>X;X1Xt.;.;.q.C #XaXsX,X;X;X,Xy.;.$.$.7.3Xr.=.$.$.%.y.aXuXg.;.%.%.%.$.$.rX0X[ .. ...o.9XeX3.hX8X[ o.[ [ [ { 0XrX=.r.yX<XcX<XdX-.iXX. . . . . . .X.iX4.&.>.;.;.dX3XzX3.fX=X=X=XxX5.%.>.;.-.=.q.y.$.$.=.r.cXcXgX%.=.pX3X&.-.=.u.,X&.-.w.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H Y R x.b.D.S.K.K.C.I.T.T.T./.T.T.W.T.",
+"D.G.J.G.D.J.D.J.D.F.D.F.J.D.D.D.C.P T ~ 8.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cXsXgX>XsXsX>X>XcXgXlX:XB q.:.%.dX>X;X;X>XlXw.2.cX,XpX=.$.$.$.$.=.;.sXlXlXgXcXy.;.=.rX8X} .. ... .0X9X8X} .. . ...[ [ ..0XrX=.-.y.3X>XfX-.iX.. . . . . . .[ 8X$X9X9XiX9X9X9X9X9X9X9X9X9X9X9XmX9X7XhX9.-.;.;.;.;.yX,XsXy.%.$.7.pX$.$.=.y.,X7.;.pX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.Q Y R K b.K.J.H.H.I.I.T.Y.Y.T./.T.(.W.",
+"J.D.D.J.D.D.D.D.D.F.D.D.D.D.D.F.C.I T ~ 6.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.;X7.7.4Xw.g.<X;X;X>X>X:XN e.;.;.g.<X;X>XcX>X>XcX>X;X>Xt.;.%.%.$.$.%.yX<X;X>X>X>XcXu.;.jXo... . ...[ [ }  .O.O.O.O.O.X... .0XrX;.$.y.4XfX:.+X.. . . . . . .[ } } } [ [ [ [ [ [ [ [ [ [ [ [ .. ...o.8X9XiX7X9XgXzX>X>X&.-.;.%.$.=.$.$.=.t.,XcXlX;X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.Q Y ^ K b.S.J.H.H.R.Y.E.T.T.Y.T.T.T.T.",
+"G.D.G.D.J.J.K.K.D.D.D.D.D.D.D.D.C.I T ~ 2.3.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cX7.&.sX>XcX;X;X;XcX<X;XN @XgXgXcX>X;X>X;X;X:X>X;X;X;X;XlXcX>Xw.=.$.2.>X;X,X1X:X;X<Xy.rX0X....[ o.o.o.O.2Xj < 0.#.g S o.....0XrX=.$.t.w.-.iXO... . . . . . . . . . . . . . . . . . . . . . . . . .{ ..o.} [ | 0X=XaX$.w.;XgXfX%.$.$.;.pX>X;X>X>X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.Q R ^ K C.C.S.H.Y.Y.Y.U.R.Y.Y.T.R.T./.",
+"G.G.J.G.J.D.G.D.G.D.D.D.D.Z.Z.D.C.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.vXr.-.w.,X>XcX>X<X2XsXfXN @X<X>X:X>X;XcX;X;X;X;X;X;X>X>XcXaXyXg.-.&.gX>X:XaXdX,X1X;X<Xr.rX0XO.O.O.O.O.$XhXA 1 1 1 < < _ o...X.uX-.$.=.;.$.y.wX . . . . . . . . . . . . . . . . . . . . . . . . . .[  . . ...[ | =X5.-.pX,X,X,X2.=.w.cX>X;X;X1X>X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H Y R K b.K.J.H.H.Y.I.T.Y.Y.T.T.W.T.R.",
+"G.G.G.D.D.D.D.D.D.D.D.D.D.D.D.D.C.I I ~ <.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cX>XcX>X,X>X>XgXsX3Xt.7.B @X>X;X>X,X>X<X<X>XvX>X>X:X>X3Xy.-.%.sXw.&.;XcXq.-.%.eXfX>X,XeX-.y.uXuXs.uXuXw.;.Z b i r b ; p.o...X.iX&.yXlXlXpX=.u.wX . ... . . . . . . . . . . . . . . . . . . . . . . . . . . . .} 8XhX5.pX,XdXcXgX6.pX,X;X>X<XfXlX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.U Y Y K b.C.J.J.H.I.U.U.Y.R.T.T.T.T.Y.",
+"D.D.G.G.D.J.D.D.D.D.D.D.Z.D.Z.D.C.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.fXyXyXyXaXgX4Xg.8.,XcX:XN @X>X;XgXyXyXyXuXsX,XcXsX,X;XuX7.=.&.,Xy.%.,XaX-.$.$.-.&.=X,XyX;.;.:.;.-.-.-.=.;.A V j |.r ; A o... .2XzX,X1X<Xt.$.$.u.9X ..... ......... ............... ... . .[ .. . . . ... . . ...[ 8X;X;X;X6.pX4XcXcX;X;XsXpX;.7.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.G ^ R K b.Z.J.H.H.H.I.T.R.I.T.T.T.T./.",
+"D.J.G.G.D.D.D.D.F.D.D.D.D.D.D.Z.C.P T ~ 6.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.g.:.-.=.=.*.uX*.8.<X>X:Xv @XvX,Xt.-.=.-.-.&.uX7.%.uX7.-.$.$.8.3Xy.;.dX,Xw.$.$.$.5.xX=XxXgXiX$X+X9X+XlXy.3.B V g h d ; A o.} ..2X1XvX1XgX>.>.;.>.zXwXX.X.O.O.X.X.X.X.| X.X.X.O.X.O.O.X. .X.O.o.X.X.X.O.O.o..... . .} 8XcXvXcX;XfXlX;X>X,X&.7.gX>.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.4.U R R K b.Z.D.J.H.I.I.T.Y.Y.Y.T.T.T.Y.",
+"D.G.G.J.J.D.D.G.F.F.D.D.D.Z.D.D.C.P I ~ <.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.7.$.$.$.$.$.-.-.q.>X>X;XN $X>XlX2.$.$.$.$.$.=.$.$.-.=.%.;.%.cX<X7.=.&.,XyX=.%.yX9X9X9X9X8X} } o...o.o.9XxXZ V V h c f m E T ) Z XXZ XXXXA m A A Z Z C S B S C C +XS C C S Z S +XiXuX$X$XdXuX$X$X:XiXuXuX$XO.o. . .[ } 9XhXcX>X&.y.4XgXpX=.pX4X5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.U R R K b.C.D.J.H.Y.I.U.Y.Y.Y.Y.T.Y.Y.",
+"D.D.J.D.G.J.K.D.D.D.D.D.D.D.D.B.C.I R ~ <.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.w.;.$.$.$.%.7.gX;X;XgXfXN @X4Xr.-.$.$.$.$.$.$.$.$.2.sXgXlXt.pXg.=.$.%.yX,Xw.;.9X} ..[ [ [ o.[ .. .....X.9X+X_ +X_ S ' ' ~ ' ~ b r e > 7 Q +Xn t  X Xd c r r . .   o X > - > X A >.-.fX1X&.:.aX3X;X5.-.=.w.$XX... . .} 7X>.y.3XsXw.pX%.-.t.<XyX&.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H Y R K b.B.S.J.H.H.I.U.Y.Y.Y.Y.Y.T.Y.",
+"G.D.D.G.D.D.G.G.D.D.D.D.D.D.D.F.C.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.gXgXgX7.*.lX;X>X;X<Xr.7.B #XdX2.$.$.;.;.;.%.;.=.&.lX,X3X<X7.:.$.$.$.$.6.,XpX4.0X[ ......X.X.X.O....... .[ ..o.o.X...X.o.o.o.wX}.u.|.e E iXnXG {.kX#Xt V i.tXM l x S e , UXUXO A >.$.w.,XfX&.yXvX<XcXfX%.;.pXO... . .} 0X%.g.;X,XgX&.=.t.3X,X6.:.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y ^ K b.C.G.J.H.H.I.U.I.I.I.I.I.Y.Y.",
+"D.F.F.F.F.G.F.F.G.F.D.G.D.D.D.D.C.I I ~ 2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.lX>X<X;Xg.yXgX>X;XvXcX@XB q.:.$.2.gXiXiX+X$XiXg.&.<XlXyXw.fXr.=.6.sXt.$.yX>XzX0X} [ ..X.+XC C N 7Xo.o...} } o.....o.} o. .$X3X%X< h d G L L F {.&X&Xt d g tXo u x g o b 7Xp.- Z ;.$.=.dX4X;X>X;XfXyXpX$.=.uXO... . .[ 7X&.-.eX<X>XcXgX,XgXpX%.$.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U T R K b.C.F.H.H.H.I.U.Y.I.I.I.Y.Y.Y.",
+"G.F.F.F.J.G.G.F.F.F.D.D.D.D.D.D.C.T T ~ 2.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cX>XcX,Xw.:.w.<X;X>X,X>XN e.;.8.:XqXo.o.o.o.qXy.&.,XeX:.$.fX<XgXcX3X3Xw.&.,X5X9X[  .[ | c . y X c C n ' W E p ' W n p * C oX.XXXV h h , 7 3 > g f f f M d c c e     > s X o 6 A ;.%.=.q.fXyX>XcX5.-.-.;.u.9XX. . . .[ 9X&.-.u.,X;X>XgXuX%.-.$.$.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H Y Y K b.Z.J.J.J.H.I.U.I.I.I.I.I.I.I.",
+"J.J.F.J.J.F.J.J.F.F.F.D.D.F.D.D.C.I I ~ <.3.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cX>XcX;X;XgX;X<X<XlXyXgXN #XiX$XqX} ..X. ...X.2Xr.yX<XgXw.2.1X>X:XdXfXq.$.pXhX0X[  ...X.n ' 6XX a h.tXb n ' {.d n ' }.X MXNXX > 1 o   s z r r a l r o s 6 r r x n m.v > 1 l . A ;.=.y.uX-.-.yX,XgXgXhXzX9XX. . . .[ 0X>X2.-.aX,X;XcX6.-.$.$.$.$.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.Q T Y K b.C.D.J.H.I.H.U.I.H./.H.I.I.I.",
+"F.J.J.F.J.F.J.G.F.F.G.D.F.F.F.G.C.I I ~ <.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.gXgX,X<XcXfXyXdXdX2.-.q.B | o.o.[ ........ ...O.2Xt.yX3X>XcX<X3Xy.-.-.$.$.-.&.7X[  . .| p L n u s y.|.r * L n . $ @.T > NXv o < d.{.X * ' 6Xe 7 ' 6Xr # ' 6Xe I iXnXE , NXUX  A :.y.3XcX;.$.w.;X>X1X=X$X . . . .[ 8XxX>XgXgX;X;X>X<X%.w.sX*.$.$.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.&.4.H T R K b.V.F.J.H.H.H.U.H.I.H.I.H.I.I.",
+"G.G.G.H.J.F.F.F.J.F.F.J.F.F.F.F.C.I T ~ 9.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.f.*.yXdX2.-.-.-.-.;.f.@XN +.[  ... .....X.[ { [ O.$Xu.eXdXdXdXfX7.$.$.$.$.$.5.9X}  ...| b $ $ a a i s a X $ $ , X $ $ X . > l < NXp., $ @.n . $ @.E X $ L E s P L L F l mXp.- Z >.dX3XpX$.$.=.dX1XxX9X........[ 0X=X<X>X,XgXcX;XgXpX=.q.,XgX6.=.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.4.H Y R K b.Z.F.J.H.H.H.U.H.H.H.H.I.I.I.",
+"G.H.H.G.J.J.G.J.F.F.J.F.F.F.G.F.C.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.f.=.=.=.=.7.sXiXiXiXiX` n +.o...| $X2X$X$X8X}  .[ | 2Xh.-.$.=.$.-.$.&.fXr.&.hX8Xo.[ ..O.V s . s t  X}.f x _ S v , > v B oXS +Xn H R 7 n F p C C n C V > $ $ u z 9 3 7 6 X o $ XXcX>XaX%.$.$.y.9XcX9XX.......[ 8XhXdXdXdXaX;.pX,X&.w.fX=.y.,XlXsX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.P T R K b.C.J.J.J.H.H.H.I.I.H.I.H.H.H.",
+"H.H.H.G.G.G.J.F.J.F.F.F.G.G.G.F.V.I T ~ 2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.g.$.$.$.7.:XqXo.X. ...{ n +...| 2XxX;X3X1X=X8X[ ..[ X.2Xw.$.$.&.fXq.;.fX<XzX9X[  . .[ O.#.k.m > &XkX#Xi I jXnXF z MXNX}.0Xo...o.o.o.) ~ ] ] o.o.X.o.7X+XoXOXa.a.a.oXoXoXa.a.a.uX,XgX%.$.$.u.wX .[ { .... ...} 9X&.-.-.-.$.$.q.pXt.,X,X>.t.,X>X<X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U R J K b.Z.J.J.H.H.H.U.I.H.H.H.I.H.I.",
+"H.H.H.H.H.G.F.F.J.F.F.F.G.G.G.G.V.I T ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.f.$.=.7.:XqX[ .... . .{ n #XiXfXgX,X:XdXgX>X>X8X[  .[ O.2Xw.-.*.,Xy.-.*.<X=X0X[  . . .| 1 < c # &X X&Xh @.L L * M MXc v o.X.X. . .o.E W ] W o...X.....o.9XxX>.;.:.hX<XcX&.=.=.$.sXcX;.$.y.wX........ . . .[ 0XtX;.r.gXyX&.-.-.w.,XgXyX=.u.,XgXcX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H Y T K b.S.J.H.G.I.H.H.H.H.I.H.I.I.I.",
+"H.I.H.H.H.I.H.F.F.H.F.F.F.H.G.G.F.E I W 2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.h.-.7.;XqX} ........[ | N e.=.=.&.dXf.:.8.>XzXzX8X[ ....O.2Xh.<.,Xy.=.%.aXgX0X[ {  ...O.b   . s f f f f 7 7 9 f > # h _ o. . . . .o.E ) W ] } .... . .....0XtX;.;.hX=X<XyX$.$.$.r.eX=.y.9XO. . . . . ...[ 0XdX;.w.,X>X>XcXsXgX,XfX%.=.$.y.,X&.t.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H R R K b.Z.D.H.J.H.H.H.H.I.H.H.H.Y.H.",
+"I.I.H.H.H.H.H.H.F.H.H.F.F.H.H.H.B.I R ~ 2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.7XiXjXqX} ......X.o.qX:XB q.$.*.fX7.=.$.6.,Xt.&.gX8X[  .[ O.$XzX=X<Xq.$.=.4.9X[  .....| M e r s < < < f , 6 o > Z oX7Xo. . .{ ..[ o.T W ] ] o.X. ... . ...[ 0XiXiX$X=X>XrX$.$.$.$.;.y.9XO. . ...[ .. .[ 0XdX%.=.pX,X>X>X3XgXsXaXr.fX&.-.t.<X6.t.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U T R K b.S.D.H.H.H.H.I.H.U.H.I.H.Y.H.",
+"H.I.I.H.I.H.H.H.H.H.H.H.I.F.I.F.C.I I ~ 2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.{ X...[ [ | $X$X$XiXfX@XV q.-.7.4Xt.$.$.6.3Xr.-.&.gX8X[ [ [ X.2XvX,Xy.;.$.&.7X[  . .[ O.p ' {.# 1 : #.< v s.v X #X0Xo.....[  .9XvX9XC +X+X+XiXiX9X.... . . .[ ....o.0XzX%.-.;.=.;.u.wX .[  . .} { ..o.0XyX%.$.=.pX4XgXfXyX&.=.-.q.3XgX&.y.,XlXcX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y R / b.C.G.H.J.H.H.U.H.H.I.I.H.H.Y.",
+"I.I.I.H.I.I.H.H.H.H.H.H.F.I.H.G.V.E I ~ 2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.X.X. .} | gXzX3Xw.-.-.7.C q.-.&.dX7.$.$.7.4Xt.$.$.*.hX8X[  .[ X.$X5XeX-.-.9.9X}  . ...| q W n o : #.: < N MXs.c 7X.. . . . .9X@XXXoXM V #XtX;.%.rX9X ... . . . . .....9XiXiX+XiXiX9XX.[  . .[ 0XwX$X$X>X&.$.$.$.w.yX&.-.=.$.$.$.$.w.,XgXcX>X<X<X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U T R K b.K.J.H.J.H.H.U.H.H.H.I.I.I.I.",
+"I.Y.I.I.H.I.H.H.H.H.H.H.F.H.H.H.C.T I ~ 2.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.X.O.o.qXvXh.h.4Xh.;.:.f.B w.:.-.:.$.$.*.gX>Xf.$.$.$.8.0X}  .....| 9X$XiXiXgX8X[  . ...O.b = $ a < < < x . v M _ X... ... .9XbXXX# 6 . $ V tX-.=.=.rX9X.... . . . . ...[ ..O...o.X... . . .[ 0XzX=X=X=X>XdX%.$.$.$.=.$.$.$.$.$.$.$.$.w.<X3XgXfXfX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y R K b.C.J.J.G.H.H.U.H.I.H.H.I.I.I.",
+"I.I.I.I.I.H.I.H.I.H.H.H.H.H.H.H.D.I I ~ 2.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.~ C C XXoXXXZ oXXXA A Z f Z A A A 7.*.gX3Xy.-.=.=.&.sX>X8X[ ......o...X...} [  . . .[ | V e r a e u r r Z oX7Xo.[ .... .9X=X;XXX7 S x o .Xy.y.gXy.-.eX9X.... . . . . . ........... . . .[ 0X=X;X;X;X1X,XyX-.$.$.$.$.=.w.dX&.$.$.$.$.=.w.fX*.$.-.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H T R K b.S.J.J.H.H.H.U.H.H.I.Y.H.I.I.",
+"Y.I.I.I.I.I.H.I.H.H.H.H.H.I.H.H.V.I Y ~ <.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.A A 0.Z b b XXZ A A a.Z h XXoXXXb Z lX,X;XcXfXsXgXh.sX<X=X8X}  . ..... . . . . . .[ X.+Xp ' }.e * _ {.. #X0X.. . . .{ 9XxX1XvXXXz S N X A -.eX,XgX=.=.@X9X..o...O..... . . . ... . . .[ 0XgX;X;X;X>XgXpXr.sXfXuX%.$.=.w.4XsX;.$.=.$.$.=.=.$.$.$.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H Y ^ K b.V.J.H.H.H.I.U.H.H.H.I.H.I.H.",
+"Y.Y.I.I.I.H.I.H.H.H.I.H.H.H.H.H.V.I Y ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.h.:.:.8.XXv oXt.-.-.:.q.C XXoXgXXXb XX;X;X>XcXgXgXf.&.dXhXzX8X[  . . . . . . . .[ X.2XZ * W n e * W ) > 7Xo.o.o...o.O.$XoXoXoXh > X X . oXeX>.gX>XsXsX1X=X2X2XiXiX0XX..... ... . . .o.0XdX%.yX>X;X;X&.-.aX3X,X4XfX%.$.$.w.dXw.sXyX&.$.$.$.$.$.=.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H ^ Y x.b.V.D.H.G.I.H.P.I.I.H.H.I.I.I.",
+"Y.Y.Y.I.I.U.H.H.I.H.H.I.H.H.I.I.S.T I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.g.*.fX6.2.XXv B <.&.dXgXN Z v w.h.#Xv XX;XvXeX:.-.-.-.=.$.&.hX8Xo... . . . .o...X.+XoXh o $ $ a X = $ a C W E ~ E ~ S N . > 6 > a . h Z XX3XgX;X>X,X,XgXsXhXeX;.;.y.gX9X........o...0XdX%.-.uX,X;X>XuX-.pX,XgXgXyX%.$.$.$.:.y.4X,XfX&.$.%.=.g.fX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y Y K b.S.J.H.J.H.H.U.H.H.I.H.I.H.I.",
+"Y.Y.Y.Y.I.U.I.I.I.H.I.H.I.H.H.I.S.G I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.sXcX>X2.-.q.oXN q.7.4X>XN @XN Z A oXb 7 XXoXXXA p.A A q.-.:.8.3X8Xo.X.o.X...X.O.2XB , f 7 S Q b t  X}.f v ) E ) E ) oXN x S z o v mXd h oXgXgXsXfXgXeX%.$.=.$.$.$.$.%.eX2X9X$X2XiXiXaX%.$.=.t.<X;X;X;X=.pX<X&.=.=.$.w.uX&.-.y.,X:X,XsX%.-.q.>X<X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H Y Y x.b.S.D.H.H.H.I.P.H.I.H.I.H.I.H.",
+"Y.Y.Y.I.I.I.I.I.I.H.H.I.I.H.I.H.V.R I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cX,Xw.=.$.7.,XN A A oXXXv @XXXv B a.Z XXXXA XXXXZ Z N B a.A A oXXXS +X_ +X+XS +XoXN : < R jXnXG &XnX Xr 7Xo.X.o.o.` #XN z S v e v S > . A >.-.-.-.:.-.-.-.-.$.=.$.-.=.:.y.,X1X;X&.;.=.$.$.$.$.dX>X;X>XpXr.yX%.$.$.w.<X3XdX;.y.3X>X<XfXw.fX<X>X>X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U R Y / b.K.G.H.H.H.H.P.I.H.I.H.H.I.I.",
+"T.Y.Y.I.I.I.I.I.I.H.I.H.H.I.H.I.S.G I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cX<X7.=.6.gX:XXXXXXXA Z N e.8.B u.:.f.4Xu.8.3X3Xy.5.a.A A A A b B M e r e u e e e e : < L W L * &X X&Xh _ .. .X.o.E 6 x >   X s s X # a Z a.a.a.a.a.A A a.a.a.a.a.a.a.A e.eX,X<XeX$.$.=.=.$.w.>X>X;X>X;X&.=.$.$.-.pX,XlX>XuXw.gXgXdX&.q.lXsXcXcX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.4.U R Y K b.V.G.H.H.H.H.U.I.H.H.H.I.H.H.",
+"Y.Y.Y.I.Y.I.I.I.H.I.H.I.H.I.I.I.S.I G ~ 2.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.zX,Xw.:.g.3X>X<XvXg.:.q.B 7.*.N N A q.dX7.&.gX,XlXdX7.-.;.;.8.B oX.Xj j t j |.k |.j : < w 9 3 v d , k n ` [  .o.W 7 h h f _ S b a  X}.f > X o 6 u u h V 6 , . # l u z u A -.y.,XlX;.r.sXpX-.yX,X>X>X;X>XyX$.$.$.-.pX,X&.uX<X&.=.$.=.$.$.-.-.pX<X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U G R x.b.V.G.H.H.H.H.U.H.H.H.H.H.I.I.",
+"Y.Y.Y.Y.Y.I.I.Y.H.I.U.I.H.I.H.I.D.I Y ~ 2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.zXcXcXdXg.sXgXgXg.&.yX@XB q.&.A B v XX7.-.$.<.gX>X4Xu.$.$.%.%.A N h g h t g j t g h   s r d d e N oXS +.o. . .} ) S M h P iXnXG &XkX@Xt # T o o b mXe j , NXmX  l S MXb A ;.$.dX,XsX<XcXyX$.t.gXgXgX;X>XcX&.-.$.$.r.yXw.<XsX;.=.$.$.$.f.dXyXcX<X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.n J Y K b.D.G.H.H.H.H.J.J.H.H.I.H.I.H.",
+"Y.Y.Y.Y.I.I.I.I.I.I.I.I.I.H.I.I.S.T I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.h.8.gXcX2.=.$.$.=.7.3X:XB q.$.-.8.OXv XX2.$.=.8.1X3Xr.-.$.$.$.2.B V V V V .XV .XV V .X|.j t j j  XwX|  . . .o.] n S s X I W W F &X*X&Xt * L F . v S s X z NXs.1 u N D u A >.:.dX<XvXvX&.:.-.-.:.:.:.dX,X>XgXpX%.$.=.w.3XgX&.q.yX%.$.-.y.4X;XgXgX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.G R Y ! b.V.H.G.H.F.J.H.H.G.H.H.H.H.H.",
+"Y.Y.I.Y.I.Y.I.Y.I.I.Y.I.I.I.I.I.S.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.f.:.:.-.-.=.-.-.-.g.vX=XB e.-.-.-.g.oXN e.:.-.9.vX3Xy.-.=.-.-.5.B < < < 1 < 1 < 1 f h g j t g f +X| [  . ...qXS . . s a 7 5 + 7 d f k f i = = > s . e e s o   > s o . s Z a.a.oXoXoXoXa.a.a.a.a.a.a.OXoX$X<X,XyX%.=.r.sX&.-.r.gX&.$.$.w.gX6.=.;.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U R ^ x.b.S.H.H.H.H.G.G.G.H.H.H.H.H.H.",
+"Y.Y.Y.I.I.Y.I.I.I.I.I.I.I.I.I.I.S.I T ~ <.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.A A p.p.A 0.A a.a.Z oXXXv Z a.a.p.A oXv B a.a.A oXoXOXa.a.0.a.A N < ; ; 1 ; 1 ; 1 x V V V B V }.` } ....[ | 2XOX6 . h j a e h |.> 6 6 s s > h |.a . h |., D _ v e u > e > , > 6 6 . X # u e # # z e # o B >XcX,XyX%.$.$.$.$.$.-.=.-.$.$.=.$.$.$.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.n Y Y / v.V.J.H.F.J.G.J.J.G.J.I.H.H.H.",
+"/.Y.Y.Y.Y.I.Y.Y.I.I./.I.I.H.I.I.S.I T ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.Z XXXXB A A A A B XXZ B XXZ Z .X%XXXXXA A Z b t }.h x b D ) n e e i z l > u b 6 z b 7 > l o n 8XO.} ......$X3XXXb _ h M v S M h z S z X c mXd V z mXe }.P iXnXE , p.: o l s.NXO z W E X u ' E X e ) W o Z >X;X>X,XyX;.$.$.=.g.dXdXuX%.$.$.-.$.$.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H R Y x.b.V.J.H.G.F.F.J.H.J.H.H.H.J.H.",
+"Y.Y.Y.Y.I.Y.Y.I./.I.I.I.I.H.I.I.V.R I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.zX>X3Xr.-.;.;.:.w.3XvX<X3Xt.8.gXlXzXw.;.;.7.B &XnX6Xb I nXjX* f r.OXi - p.s . x MXmXX x s.s W o.} } } X.9X5X3XB v s.e X v S e . b S v e v S s X v _ s X P W R L - p.0., z NXs.1 i ] ] $ i ] L $ l ] ] = Z >X>XgX:X,XgXpX%.-.y.3X<X3XfX$.f.fXaX%.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U T Y x.v.D.J.J.F.J.G.G.F.H.J.H.H.H.H.",
+"Y.Y.Y.Y.Y.I.I.Y.I.I.I.I.I.I.I.H.V.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.zXcXcXgX6.-.*.yXgX;XgXgXzX7.-.:.-.-.:.-.-.2.B &X*X&Xc L ' L * f t.|.e : k.A e S MXm o S NXs.W o.} } ] ' +X) %XV s X e s s 6 s s s X . s s X s a s > e s 7 + @ # a , a X s .   , s = $ s e $ = X e = $ X Z >XcX6.yX<XcXsX%.-.pX3XlXgXfXw.>X;XgX&.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.G T H x.b.V.J.H.J.J.F.H.J.J.I.H.H.H.J.",
+"Y.Y.Y.Y.I.Y.I.I.I.I.I.I.I.I.I.I.S.Y G ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cXw.7.<XlXyXgX,XlXq.;.;.;.%.a.a.a.p.a.a.a.A M f k k d 7 3 2 z a c V d     a s s 6 > s s S n ] o. .o.L b D $ F f s l 6 s a . M j > l 6 s s 6 6 a s 6 6 e h  X}.f s u . s s l 6 s a s x s f D S n a e u 6 Z <X>XfXcX>X2.$.$.$.w.gX2.-.g.;X>X7.-.$.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U T Y / v.S.J.H.H.J.H.F.H.H.H.H.H.H.J.",
+"Y.Y.Y.Y.Y.I.Y.Y.I.I.I.I.I.I.I.H.S.Y R ~ <.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.;Xg.-.f.>X,X3Xr.;.$.-.-.-.7.N , 1 z , , < 1 f c u l f , > , a s s s a s e . a s . r f , X i ]  . .} L v 7Xi * c c S z X v S h h z S x X b S z X b S b o {.kXhXt e $X* o z S b o s %X+Xo n S nXE e E E o B cXgXlXgXdX;.$.$.$.$.-.$.=.w.3X>X&.$.$.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H T R / b.S.J.H.H.H.H.H.H.H.H.H.H.G.H.",
+"Y.Y.Y.Y.Y.Y.I.Y.I.I.I.I.I.I.H.I.V.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.;Xg.$.$.7.lXlX2.$.&.yXyXyXsXN : : g : #.#.#.m V |.h u < 0.y # O r h e 7 7XC . * ) {.. x s.> W o. . .] N D $ * x b S c r v _ e . b S M e b S v e z S v . {.*X&Xt b +X+Xl z S N e l }..Xd n W ~ L 6 ] ] $ Z 6.;.=.=.=.$.$.$.$.q.pX%.=.$.t.gX&.$.7.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.w R Y x.v.D.H.H.H.H.H.H.H.H.H.H.H.G.H.",
+"Y.Y.Y.Y.Y.Y.Y.Y.I.I.I.I.I.H.Y.I.V.I R ~ 9.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cXgX6.=.$.$.%.$.*.sX<X>X,X>Xv : #.> m $XvXA 7 h g k u p.MXg . r M h e * ` E s * ] n X S MXs.E o. ...' C ) E n c u . X l z > r u z . X > . X X e z > X s h a k h z v r e s . X e l e r . 7 @ @ 9 e = $ X m ;.=.q.yXy.%.$.$.-.t.3XsXy.%.-.=.=.-.y.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.Q R Y x.b.J.U.H.I.J.H.J.H.H.H.I.H.H.H.",
+"Y.Y.Y.Y.I.Y.Y.Y.I.I.I.I.I.H.H.Y.S.G I ~ 2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.gX>XgX6.-.$.$.$.7.4Xr.g.1X:XN : #.7 c iXUXj m V V V d , m , s s e X s $ = $ s # = $ a s S x W o. ...| wX1X1XXX, < < < <   , , > < < 7 B XXoXm < , s z a s s 6 s a e > > g < f m f N A A A Z OXA A A Z N OX;.q.>X<X3XuX;.$.$.$.aX3X,XfXuXuXaXaXlX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U T Q x.b.J.I.I.I.H.H.H.H.H.H.H.H.G.F.",
+"Y.Y.I.Y.Y.Y.Y.Y.Y.Y.Y.I.I.I.I.H.S.R I ~ <.3.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.w.w.3XlXuX6.$.$.8.3Xg.6.<X;Xv : : g m iX$Xj s l i s f X o X f > s e f a s > f d s d r , . z E  ... . .[ | 2XXX1 ; ; ; ; O - O - ; : , XX#X$Xg ;   #XS X , 0.: o > p.;   x oXUXjXm Z 5.&.>.fX>X5.>.>.a.B 3XfXcX>XcX>X<X&.$.$.=.w.cXlXcXlX<X>X1X>X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y Y / v.S.I.I.I.I.I.H.H.H.J.J.H.F.J.",
+"Y.Y.Y.Y.Y.Y.Y.Y.Y.I.Y.I.I.I.H.I.S.G R ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.8.*.lXlX<XgX2.-.7.,XgXsX1X:XN : : < x A < < z f t.|.# 6 s v # h XXN . i 7XC l V i.|.e x NXmX. ` [  . . .[ | C n E S Z S Z S B C Z +Xh s b l l z r .X.Xr , p.0.X 1 p.0., x XXUXtXg A %.$.=.yX,Xy.%.=.p.B >X>X>X>X6.y.sX%.$.$.$.=.%.%.%.;.rX5XvXxX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U T R x.b.S.H.Y.Y.Y.I.I.H.J.J.J.G.J.J.",
+"Y.Y.Y.Y.Y.Y.Y.Y.Y.I.Y.I.I.I.I.H.S.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.g.-.-.;.w.3XgXaXsX>X>X;Xq.g.N : : 1 < < < < z f j.OXe x D x > V oXl > 7 ` L l V g j e S MXm o @X8X}  . . ...E ' o...O.O.O.X.X.| X.O.+Xg 7 b S NXX r r # 6   ,   > , a X g S NX%X< A >.-.$.y.,X-X%.-.0.XX1XcXcXfX$.$.;.$.$.$.7.eX$.$.$.-.u.vXmXNX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.G I R x.b.J.H.Y.Y.Y.I.I.H.H.J.J.D.J.F.",
+"Y.Y.Y.Y.Y.Y.Y.Y.I.I.Y.Y.I.I.I.H.S.G R ~ <.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.fXpXpX&.7.<X>X<X<X<Xw.;.=.2.N 1 ; ; ; ; ; ; f e V e s   ,   s e z r a $ = = a V V V c e l > > XX#X8X.. . .o.n ' }  ... . . ... .[ [ O.A g 6 S S l c }.}.x n D v a u 6 l x g m < < B a.e.$.$.dX,XpX-.0..XgX6.%.;.$.$.$.=.=.:.pX3X&.$.$.;.eXgXNXMX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.&.4.4.4.4.4.U R R K v.S.Y.Y.R.T.Y.I.I.J.D.J.D.G.K.",
+"Y.Y.Y.Y.Y.Y.Y.Y.I.I.Y.I.I.I.I.I.S.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.:X<X,XgXsX>X;X;X>Xw.$.$.$.2.N u i r c z u e f , X o a s . . a > > > a s e d a e . r r > D D d f e V ` o. .[ ) ~ o. . . . . . . . . .[ O.+XX O . 6 {.kXhXp mXnXE l S b X z > d V u d V Z -.q.cX,XgX-.0.B 6.$.$.$.$.$.f.aXaXpXlX,XyX;.$.=.u.$X+XmX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.n J R x.v.S.I.Y.T.T.Y.Y.I.J.J.J.D.D.F.",
+"I.Y.Y.Y.Y.I.Y.Y.I././.I.I.I./.I.S.R R ~ <.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cXw.w.,X;X;X;X,Xt.=.$.$.$.2.V * ) y e n ) y i > z v # s v j u ; 0.y # f r.OXs * ) y e J jXnX@.h |.h V ` o.o.n ' o. . . . . . . . . . .O.S l l u 7 {.*X Xp W _ F x S v r s iXd }.S d |.Z dXcX,XgX&.-.0.Z >.$.$.=.-.g.>X,X>X,X>XcX,XuX%.-.eX*X X*X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.G T R x.b.H.I.T.T.T.T.I.I.G.F.G.F.D.F.",
+"Y.I.I.Y.I.Y.I.Y.I.I.I.I.I.I.H.H.V.I G ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cXfXfX>X>X;X;X,Xg.=.$.%.eXsXM F ` n . F ' n . x S x X b S V $ p.MXm # f j.|.e * ' S . W ) W * h g j e #XmXqX) W .. . . . . . . . . . .X.S l S NXe h k {.i 5 F b s . X e b m.l X mXl X XX3X>XsX&.$.;.p.B %.-.g.aXpX:X;X;X;X:X>X2.pX,X&.-.j.vXmXNX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U R Y x.b.S.I./.T.R.Y.Y.I.J.J.G.G.K.G.",
+"I.I.I.I.I.I.I.Y.Y.I.I.I.I.H.I.I.V.Y G ~ 2.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cXvXvX;XlX;X>X<Xw.:.&.fX3X;Xv $ = # f $ * $ f   -   s X o o s - m , > e h M d X = $ f 7 @ @ z M V V b a.9.vXZ W o...[ ..o. .[ ......[ X.+X. C S l 6 < 7 > < > a a s l z l X r o . e . XXvX5.-.$.$.-.0.XXdXpXcX,X<X>XcX;X>XcX>XyXgX>X&.-.eXmXNXMX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Q ^ K b.J.I.Y.T.W.T.Y.I.H.J.D.D.D.G.",
+"Y.I.I.I.I.I.I.Y.Y.I.I.I.H.I.I.H.V.Y R ~ 6.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.xX;X<Xt.>.q.cX>XsXpXsX,X;X:XN > s z a   r X f s u e f 6 p 6 a l # e a > u z a > , e a r e > a d }.}.v OXa.$XM C 7X_ 7X7X7X_ 7X| o...o.o._ -   > , > s.s.O s.mX  s oX+XX z 6 6 . > > l M $XiXk.;.$.=.0.B <X>X>X;X>XcX>X;X;X;X;X>X>X<XuX-.u.$X+XmX8.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y Y x.v.S.I.T.T.R.T.T.I.H.J.D.D.D.G.",
+"I.H.I.I.I.I.I.I.I.I.I.I.H.I.H.H.S.I R ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.lX;X<Xg.-.=.-.w.3X,X>X;X;X;Xc x NXS # > > b e * _ {.X = p {.. * ) {.# f i.OXi < NXS , = @.{.6 &XkX#Xr 6 > z f s > l z . X l z T ' ' ' ] n < g g < i MXs.- MXs.1 r }..Xr z S x o S b   D _ nX_ >.$.:.0.B 7.%.yX,XcX6.uX<X;X;X;X>X;XcX<XdXxX*XtX*X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.w Y J x.b.J.I.T.T.R.T.T.I.H.J.D.D.D.G.",
+"H.I.H.I.H.I.I.I.I.I.I.I.I.H.H.I.V.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.lX;X,Xg.%.pXy.fX>X;X;X>X>X:Xb S IXx . c S x > P ' n X y .Xc . q ' C # f j.|.o D MXp., y .XN . &X*X6Xh , NXmX. x mXNX# > mXNX> N n n n D h a e X b > , - -   - , > , a , z S N o S N e P W _ E ;.g.aXoXZ -.7.cX>X>XyXgX;X;X;X;X>X7.&.y.=X5XzXiXjX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.&.4.Y ^ Y x.v.P.I./.W.(.T.T.Y.I.J.J.D.D.F.",
+"I.H.I.I.H.I.I.H.I.H.I.I.H.H.I.I.S.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.lXcXcXg.fX3X;XcXcXcX-XzXcX:Xv u l > s       s $ * $ s r o o s $ = $ s e h V d > X   > r o o a k k k d v IXN   v UXS   v UXS X +Xo.[ [ O.+X$ i e X < ; ; ; : ; < , ; ; < l . . o u . s b q 0 D :.aX4XoXN yX>XgX6.uX,X>X;X;X;X>X;X&.-.-.:.rX$XNXMX3.3.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.4.G Y T / v.S.Y.R.T./.T.T.I.I.H.J.D.J.F.",
+"H.I.H.H.H.I.I.H.H.I.H.H.H.H.H.H.V.I G ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.r.>.%.7.>Xr.&.%.&.%.;.>.;.w.N , M < f < < < f , f < a < A f a f < < f s X e d s s e a > > z f > 6 z x . X   > X X   X > X O   7X......o.C e M C e x , # 6 x z , X z b e X l x > > d M Z 8.>.h.aXlXvXoXZ 3XgXw.y.lX>XcX;X;X;X;X;XyXeXy.eXxX+X$XNX6.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y Y / v.J.I.Y.W.R.T.T.Y.I.H.J.J.J.F.",
+"H.H.H.I.I.I.I.I.H.H.F.I.H.H.H.H.D.P Y ~ <.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.yX&.-.=.=.=.-.$.$.%.0.e.e.j M ; |.1 f 1 ; ; f 1 ; ; f 1 j 1 f 1 : : x * ) y e * ) {.X x mXmXX x mXmX. 7 mXmX6 7 s.. X x s.6 X ) O. ...X.+XX r $ # > s.m.- g 6 d.iXo > m #.o < 1 S d }.A -.f.<X,XgX8.a.B vX&.y.3X>X;X;X;X;XvX:X;X<X>X>X>X5X*XtX X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U R ^ x.b.S.I.T.R.T.T.T.Y.I.H.H.J.G.F.",
+"H.H.H.I.H.H.H.H.I.H.I.H.H.H.H.H.V.Y I ~ 6.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cXgXy.pXy.y.y.*.-.7.N b ) D f l # 6 f s z > f s i z a x n D f d .Xh x * ' S a * ] S X v IXN o v IXS o N UXS o N MXs.. v MXs.> +X.. ...X.S > > . l z MXuX1 j x MXM.1 , p.e.> XXN mXl X Z yX;XgX2.;.-.0.B >XaXcX>X;X;X;X>X;X>X;X>X7.&.&.>.tXvXiXNX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H Y Y / b.D.H.R././.W.T.Y.I.I.H.H.H.H.",
+"I.H.H.H.H.I.H.H.H.H.H.H.H.H.H.H.S.I T ~ 2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.lX>X,X>X1X<X,XgX&.2.C L nXiX* s N h e z +Xv # f i.}.z I jXjXq &XkX Xd $ * $ e $ = $ z z b > l z b > l 6 z > > s S v > # S v , S X. .{ X.+X> s.s.O z . > - < u #   > > , a d @XV X r o XX3X:X*.$.$.-.0.XX>X<X;X;X>X>X>XcXcXcX>XcX>.$.$.-.eXgXNXNX5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H T Y / b.P.I.T.T.T.R.T.Y.I.I.I.H.H.H.",
+"H.H.H.I.I.H.I.I.I.H.H.H.H.H.H.H.V.P I ~ 2.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cX3Xu.;.%.>.r.3XsXyXN L iXW * c S M X P 8XE # g j.|.6 W _ ) q &XxX&Xb < c f a g b > < < > 7 < < , > < m N B g v v N N B v N B 7Xo. . .X.S x MXs., z e e x z u # l z l e u x n n v v v Z >X;Xt.$.%.-.0.B >X;X;X;X>XgX7.&.&.&.yX,XyXt.%.-.u.+X$XNX3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U T R x.v.J.I.Y.W.W.T.T.T.I.I.H.I.H.H.",
+"H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.H.D.P R ~ 2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.#X$XuX0.e.e.uX$X$X@XM 3 @ @ x .   o f = @ = r e V V d 9 @ F 7 k k k d ; x ; x < < 1 ; ; ; ; : : : : #.+XO.| n ' X.| O.| | | |  . . ...X.C > . > , > 0.: o > 0.; o > 0.: O n _ nXE OX#XZ vX>X:X;.-.-.0.XX1X;X>XvX8.=.-.=.=.-.u.,X,X<X&.:.u.*X|.*X3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.U T R x.v.P.I.T.T.W.T.T./.Y.I.I.I.H.H.",
+"H.H.H.H.H.H.I.H.H.H.H.H.H.H.F.I.V.I G ~ 2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.x 7 z i i u b > . . a s s a f > > > a f f < a s e x a a > a a s l s a x < : 1 < f d u e u s d b : : +XX.} o.) ~ o...[ ..[ [ .. . . . .o.+Xl > u b 1 p.0.> 1 p.0.> , p.0., P W m.F .XOXB =X-X:XeXu.u.OXB :X-X-X-Xa.u.u.i.u.u.hX:X-X:XpXu.kXvXmXNX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.Q Y R x.v.P.Y.T.T.W.W.T.T.Y.Y.Y.Y.I.I.",
+"H.H.H.H.H.H.H.H.I.H.H.I.H.H.H.P.S.Y I ~ 8.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.g : 6 g i.}.# > > z u f i.}.# #.f y 7 : #.#., a j t u > v h . > 0.- s < : ; : ; < * C y $ ) {.X 1 iX........) W o. . ..... . .[ ......8XV s N b X > - f s s 1 , a   O X   7 p $ 9 Z .XM #X#X#X#X#X-XOXM #X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X*XiXNXNX3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y R x.v.P.I.T.W.T./.T.T.Y.Y.Y.Y.I.Y.",
+"F.H.H.H.H.H.H.I.H.H.I.H.I.H.F.H.V.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.m #.6 g j.|.. v S b # g j.OXX s.NXf l : : : 7 g j.j s v S Z e 1 d.< u 7 m : < x x * ] C = ] _ . $Xo.} ....o.D ' o.o.[ o.o.o.o.o.o.o.8X#.1 v S M X OXj |.oXoXOXa.#Xe %X= o {.kXkXt XX$XA f.>.;.>.5.5.A Z f.&.5.5.5.4.3.>.>.&.4.>.yX,X;XvXbX$XmXNX3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U T ^ x.v.P.I.T.W.W./.T.T.T.Y.T.T.Y.T.",
+"F.F.H.H.H.H.H.I.I.H.I.H.H.H.I.I.S.G Y ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.m : > e V r s   - O l s h d e 1 D - d : ; ; f r V V d . o   s - f , s ; 7 1 x 1 g $ * # o = $ s _ ] ` ' ] +.n ) ` 7X_ 7X_ _ 7X7X` 7Xg : x z # s e h #X@XZ B @X$XXXz $X+X6 {.*X#Xt XXoXA -.8.y.q.$.-.0.A ;.$.$.$.$.$.2.y.t.t.u.t.gX<X>X;X=X X|. X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.Q R ^ x.V.S.I.T.T.T.T.T.T.T.T.T./.T.T.",
+"H.H.F.H.H.H.H.H.I.H.H.H.I.H.H.I.S.I Y ~ 5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.x > a > . 6 a g 7 < f > 6 6 k > . 6 f s u l a > X > f s > 6 a d u u a d l z s l s . X X b l e e b n n n D n f s z > b c n n v s a s z x l l z 7 n n n x h h x b x 6 x d e t k y y Z oXA :.yX4XvX;.:.0.B >.=.$.$.$.=.y.4X,X1X3X,XzXg.y.1X>Xh.9.8.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H Y ^ x.v.U.Y.T.T.W.W./.T.T.T.W./.W.T.",
+"F.H.H.H.F.H.H.H.H.I.H.I.H.H.H.I.X.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.x : > # v d x : : : > #.k y # ; g y 7 h i.h u > > z > s v h u a 0.- u - p.> $ ) y O X b # $ E {.p { +.+.+.+.E s s.mXu G mXnXG r %XS X z N x X n m.nXG {.kX-Xt c Z N N N N Z N m S oXoXB i.#X@X@X0.e.Z M a.q.$.=.=.=.%.6.*.&.5.*.&.$.$.uX<X%.-.:.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.H R Y x.V.P.Y.Y.R.Y.T.W./.T./.T.W.(.T.",
+"F.F.H.F.H.H.H.H.H.H.I.H.H.I.H.I.D.T I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.g #., b +XM > : #.: , s.NXf # s.NXf # g j.h e v S v . b S Z . 1 d.1 u #.p.g $ ' C X S N o n ' S * W W @.W L n s S S z E _ _ F r }.XXe c S N . I ~ +XF &X*X Xt Z @X@X@X@X@X@X@X@X@X:XXXx n n n z }.6Xl g N B i.e.e.e.=.-.$.$.$.$.=.-.2.gX<XaXu.u.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y ^ x.v.P.R.R.R.W.W.T./.T.T.T.).(.W.",
+"H.H.H.H.H.H.H.H.H.H.I.H.I.H.I.I.D.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.m ; f X o   d ; ; : s 1 D - d 1 D 1 s s h V c   - O l X o o e - f , r O - a = * $ O , - l $ * $ C o.o...o.o.) o o l z 7 @ F q e d h e l l X e 7 F F 9 t k {.h b 6 6 b N x l > 6 e . l w _ nXR {.*XkXt XX@XN B B N N a.q.%.$.$.-.6.t.gX<X;X,X,X3X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U R ^ c.v.U.Y.T.T.T.T.T.T.T.W.T.W.(.(.",
+"F.F.F.F.H.H.H.U.H.I.H.H.H.I.H.I.V.I I ~ 6.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.x 7 a > 6 6 f s l s f 6 X # a > . > f s . s 7 f 7 c b l l z x n n < g e X l s s b u e u f s e X 7Xo...{ ..O.Z > > . f f h h k s > # a f > f h f s > s f m x c 6 N z h oXX %X= O .X= o T ' iXF {.*X#Xt c #X1X=X1X@XN N C i.=.6.u.lX3X<X<XcXh.5.aX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y T x.v.U.Y.T.R.T.T.T.T.T./.T.W.W.(.",
+"F.H.H.F.F.H.H.H.I.H.I.I.I.I.I.I.V.T I ~ 2.3.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.m : > = p t > q N y u > . 6 u ; g y 6 * C y - : : < t h k z G jXjX; < * ) y - : < , 0.- e $ ) {.p o... . .O.B , s.A   {.kX*Xp x v z X b S h |.u N z o oXvX XXXb S v V oXx $X7X. $X7Xu b G G 0 h {.{.h M #XvX7.&.fX,X@Xv B pXgX3X>X;X:Xh.&.$.-.r.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.4.U R ^ x.v.P.Y.T.T.T.T.T.T.T.T./.W.T.(.",
+"H.F.F.P.H.H.H.H.H.H.I.H.H.H.H.I.V.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.m #.> p %Xh > @.` C X m S v X s.NXf > E ' N : #.: x V i.h z W +X^ 5 < * ` S - #.> 1 d.#.X * ] S C o.....o.O.S z IXs.1 &X*X Xt v S N . v mX6 # v S N X XX8.8.A 6 6 e V oX6 v c o v d e Z @X@XOXM gXgXOXM #X$Xi.e.uX#X#X.XZ <X>X;X>X;Xg.=.$.$.=.u.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.U R ^ x.v.U.E.T.T.T.T.T.T.T.T./.(.W.T.",
+"F.H.F.F.H.I.I.H.I.I.I.I.I.H.H.I.S.I T ~ 6.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.x ; x y o o 6 = = $ . O - O u 1 D - s = * $ - : : x V V h b 9 F F ; f $ * $ - : g   f , s # * $ N | ] ] ` +.n > # , , h k {.d 6 6 e e l > r e 6 6 e u a.-.-.a.z > d Z M f > l z c 6 6 l b N M f 6 c h > b M v B 6 v v o N >X;X;X;Xg.=.$.$.$.-.t.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.G R T x.v.U.T.T.W.T.T.T.T.T.Y.T.T.W.(.",
+"H.F.H.H.H.H.H.I.H.I.I.I.H.I.I.I.S.T I ~ <.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.M N N V i N N M M N M N N M N N M V f < v n x V V h c b b z s f h V f , x s s . a e . . a a n n D v n n n n f > > 6 s s 7 , f a # > s a # 6 a f # 6 z A -.;.a.u S d *XoX  m v f $X, m m f 1XoX> S d }.S d  Xc j 6 S C X Z ;X;X>Xq.=.$.$.-.*.t.jX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.>.n T T x.v.P.Y.T.T.W.T.T.T.Y.T.T./.T.W.",
+"F.H.H.H.H.H.I.H.I.I.H.I.I.I.I.I.V.I T ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.t.6.6.2.6.u.1X;X2X1X>X>X;X1XpX6.6.r.C G jXiXn &XkX}.l r i.h z &XkX Xi : < = p y $   g > . P jXjX'  . .{ { X.S   d.S   a g : X r %X= X r oXS X , j - o a.;.=.a.b mX6 h OX> s.s.f OX> s.s.f #XOXz mX6 o mX6 # < ; n z i r B cX>XcX%.-.-.*.t.gX,X>X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U T T x.v.P.U.R.T.T.W.T.T.T.T.T.T.W.T.",
+"H.H.H.H.I.H.I.I.I.I.I.I.I.I.I.I.V.I T ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.uX$.-.$.=.2.,X<Xy.>.t.>X>X,Xw.-.=.<.N W iX~ * &XkX6Xi g j.|.u &XzX6Xd ; < p %XV i #.k.A s W _ _ ' X. . .{ O.B b IXs.< < d.#.X N iXS # d }.XXi 1 d.#.X A -.-.a.u # e V oX> < < h oX> , < d -XoXz b d r c t o n ~ nX_ :X#XB 1X>Xf.*.t.t.gX3X>X;X;X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U T Y x.v.P.T.T.R.R./.T.T.T.T.T.T.T.W.",
+"H.H.I.H.H.I.I.U.I.I.I.I.I.Y.Y.I.P.T T ~ <.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.;XyXt.r.r.yX>X>XdXw.pX,X>X,Xq.$.$.2.B 4 F F x {.k {.f s j h s k k {.h 1 < y o o u O - X s 5 F F ) X. . .{ O.Z . . - s , > a e z N h e e t h e > , f o a.-.:.a.z # > b M a # . b d f . s z B c B @X$X@X@XoXx n W iX' vXoXB h.*.-.y.4X,X>X;X;X;X;X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.w T U x.v.P.Y.T.T.(.T.T.T.Y.T.Y.T.T.T.",
+"H.H.H.I.I.I.I.I.Y.I.Y.I.I.Y.I.Y.P.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.lX<X,X<X,X<X>X>X,X3X3Xy.5.6.%.$.$.2.N l d , a , > 7 k 6 # x f f 7 , f M N v v N N V b N N M j g 7Xo.[  . .O.S > n n f a u u a s u # a s 6 6 a s . d c Z t.d.+Xl v b h oXe .X$ r $X. .X= r vXoXz e u z l l z b F F * bX#XN >.=.2.gX>X;X;X;X<X>X>X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.&.4.Q T Y x.v.S.Y./.(.T.T.T.T.T.Y.T.T.W./.",
+"H.H.H.I.I.I.I.I.Y.Y.Y.Y.Y.Y.Y.Y.S.I T ~ <.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cX;X;X;X<X<Xy.6.2.2.8.%.q.%.-.$.-.<.c f j t u a i.h u : f y # ; g y u a.6.6.6.*.6.6.6.6.g.>X#X-X9X}  . . .X.Z q mXnXF   j - X > g - X e OXS o b S h |.q 7XnXE z S v h OXz $X_ V OXz $X_ c #XOX6 v v O v v   . f j Z vX$XN &.-.y.3X>X<X<X2Xw.8.2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.4.G T T x.v.P.Y.T.T.(.W.T.T.T.Y.T.T.T.W.",
+"H.H.H.H.H.I.Y.Y.Y.I.Y.Y.Y.I.Y.Y.P.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cX;X>X,Xy.8.$.=.=.$.=.7.4XfXw.r.w.uXN g h.h u g j.#X. s.NXd . p.NXc l uXq.q.#.q.#.q.q.q.e.@X|.|.$X| o. . .X.Z G 7X+X@.1 d.#.. < d.#.. d .XXXr v mX. > E ` iXF s c d .XoXz B V .XoXz Z }.}.h.uXz S N X S N o C d }.N -XoXm &.$.%.8.2.8.dX>X&.=.-.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.U R Y z.v.S.Y.R.(./.W.T.T.Y.T.T.T.T.W.",
+"H.H.H.I.I.I.Y.Y.Y.Y.Y.I.Y.Y.Y.Y.V.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.t.6.6.&.$.$.$.$.$.$.$.7.<X>X,X<X,X>Xv r h h l a h d e - s.1 # - s.- # N B B N B B N N B v g oXjXuXs.o. .[ X.XX9 F F 9 - , a X , , a   . t h e # # r o 7 F F @ B #X#X-XXXB @X#X@XXXV #X#X#Xe.A # u e o 7 e o NXz > x v N XXu.$.$.-.=.=.r.<X&.*.r.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.n J Y / v.U.R.T.R.W.W./.T.T.Y.T.T.T.W.",
+"H.H.H.I.I.I.Y.Y.Y.Y.E.I.I.Y.Y.Y.P.I I ~ 9.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.pXh.w.w.%.=.=.$.$.$.$.2.>X<X;XvX;X>Xv v N B N v b c f M b b N N i N v oX,X,X,XuXq.:X:X;XZ 7 $XUXtXS o. . .{ qXXXj x c N M M M M M c M M c b b N V c N N c M M N N B B N N N N B d f C B B B B N M c c v c 6 l r r v N xX:X<Xy.w.w.g.=.$.6.=.t.4X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.G R ^ z.v.P.Y.T.R.W.W././.T.T.Y.T.T.T.",
+"H.H.I.H.I.I.T.U.Y.I.I.T.T.I.T.Y.P.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cX<X,X3XyXw.w.&.$.$.=.$.&.t.>X>X,X@XN @X;X>X>X;X;X=XN #X>X>X,XuXw.>XN #XfX7.8.%.w.1X>XvXZ x +XNX XS o. . . .[ | | ` | | | ` | | | ` | ` vXZ B gX8.2.2.2.8.7.gX>X-X7.2.2.2.2.2.6.OXZ g.<.2.2.2.7.fX>X;X1X@XN c M |.V c @X<X<X3X,X,X,XpXg.$.-.t.,X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y Y / v.P.T.T.W.W.W.W.T.T.T.Y.T.T.T.",
+"H.H.H.I.Y.Y.I.Y.Y.Y.T.T.Y.T.T.I.P.I P ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.;X>X;XvX<X,X4Xq.=.%.q.w.w.$.6.2.y.N b :XyX8.t.>X>X;XN @XdX8.7.$.;.;XN $Xy.:.$.&.>X:X:X@XB < a.A < A | .. . . . .o..... ...o.[ X. .o.[ } qXoXv XX7.=.=.-.=.:.dX3XsX-.=.=.$.=.*.q.A A ;.=.=.-.;.:.eX,X;Xq.6.8.a.N B B V #Xw.8.8.dX>X>X3X<X*.$.%.8.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y Y x.v.P.T.T././.T.T.W.T.T.T.Y.T.T.",
+"H.I.I.I.I.Y.Y.Y.Y.Y.T.I.T.T.T.T.P.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.t.u.,X>X<X;X,Xq.-.7.3X,X3XyXh.%.*.N @XaX-.=.&.>X;XvXN $Xt.-.-.=.u.1XB $XsXw.*.&.vXZ 7 z l b x m n c 7X} X.{ .. . . . .X. . . .X.{ [  . .[ | +Xv A :.2.q.e.e.#X@X@Xe.q.q.q.w.XXN N XXu.h.r.w.w.r.gX>XxXr.h.w.q.2.7.2.dX#X;.$.-.y.,Xw.uX;X%.$.$.=.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.G ^ Y x.v.P.T.T./.T.W.T.T.T.T.Y.T.T.T.",
+"H.H.I.I.I.Y.I.Y.Y.Y.T.I.Y.T.T.T.P.P Y ^ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.y.pX,Xy.t.,X3Xg.=.7.>X;X;X>X4Xq.&.B $XdXw.g.pX;X;X;XN @XsXw.h.y.1X-XN #XvX4Xy.=.cXB     l l w mXjX* oX| } [ [ [ [ [  .[ { } [ [ {  . . . . .| Z Z u.XXN C N N N N C B B C b c XXqX| qXqXqXqXqXqX| 8XqXqXqXqX2Xw.=.=.u.#X&.$.$.y.<X;.=.g.w.$.$.$.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.>.n Y Y x.v.U.T.T.W.T.W.T.T.T.Y.T.Y.Y./.",
+"H.I.Y.H.I.I.Y.Y.Y.I.T.T.T.T.T.T.U.I I ~ ,.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.vX,X3X7.$.2.7.%.$.7.<X;X;X;X<XyXy.N @X<X,X3X<XvXvX1XN #XvX,X1X<XcXZ b @X>X,Xy.-.cXN x S S . W iX+X* #XvX8X8X8X8X8X8X8X8X8X8X8X8XqX[  . . . ...+Xb %XXXA q.gX:X:X@Xf.2.gXXXx XXqX[ [ [ X...[ [ [ [ [ [ ....} X.wXu.-.i.#X4.=.-.y.,Xy.h.fX<X&.$.$.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y ^ z.v.U.T.T.T.W.W.T.T.T.Y.Y.T.T.T.",
+"I.H.H.Y.U.I.I.Y.Y.Y.T.I.Y.Y.T./.P.I P ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.eX8.7.%.%.g.$.$.=.7.<X;X;X;XcX1X:XN #X:X@X@X@X@X@X@Xv oX:X;XvX>X>XZ oX>X>X,XsXy.>XB   - - s 0 F F q oXcX@X-XzX-X-X-X-XzX@X-X-X-X@X| [  . . ...| XXv b A :.dX,X,XhX-.2.Z c XXqX[  . .{ ...... .[ ..[  . . . .[ +.2Xu.hX X>.=.:.u.,X<X,X>X;X&.;.=.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y Y x.v.P.T.T.W.T.W.T.T.T.T.Y.T.Y.T.",
+"I.H.Y.H.I.I.I.I.I.Y.I.T.Y././.T.P.Y Y ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.f.=.-.-.7.4Xg.-.-.7.<X;XcX;X;X;XN v N N N N N N N v v N v oXcX@X:XN $XvXyXw.>X3X>XZ b b v f a 7 x a f z z c v z z c m b V c M B c XX| [  . . .} | oXb Z 7.&.g.lXfX8.XXb XX| [ .. . .X.| | | | | | | qX[  . . .[ X.2X-X#XeXh.h.hX>XxXxX;X=XeXh.w.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.w R R x.v.U.T.T.W./.T.T.T.T.T.Y.Y.T.T.",
+"H.I.I.I.I.I.I.Y.Y.Y.U.T.T.T.Y.T.P.Y I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.8.$.g.h.uX,XuXg.g.g.<X<X<X<X>X:Xv #X:X:X:X:X:X:X-XN #X;XB v N N v b #X3Xy.:.6.w.>X;X:X:X>XB r j r s V h h e M t h s {.*X*Xd A h.XXb XX| .. . .X.[ | XXc XX7.:.&.h.XXb XXqX[  ...[ | 2X2X5X*X#X-X X}.*X8X[  . .X.o.O.` E qXqXqX8X| qXqXqX| 8XqXqX4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.Q R Y x.v.P.T.T.W.T.T.T.T.T.Y.Y.T.Y.T.",
+"H.I.I.H.I.I.I./.Y.T.I.Y.Y.R././.P.I G ~ 2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.pXpX3X<X,X<X>X<X3Xw.8.7.7.y.:Xv v :X,XpX8.8.r.<XvXN #X>XcX:X>X:X:XN oX:XfXq.g.6.lX>X;X>X>XZ h 0.j z V g j i V j j > &XkX#Xt p.:.hXoXz XX| } .. . .[ | oXb XXq.q.Z b XX| .. . .[ | 2XxXvX*Xd b c b z *X=X8X[ {  . ...+.L } [ [ [ [ } } [ [ } } [ 4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y ^ x.v.U.Y.T.R.R.T.T.T.Y.Y.Y.T.T.Y.",
+"H.I.H.I.I.I.I.I.I.T.R.I.Y.Y.T.T.P.T T ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cX>X;X,Xy.y.<X;X,Xg.-.$.=.2.B v @XyXg.g.g.7.y.:X@XN @X>X,XaX8.r.>XZ v c $X,X4Xy.7.>X;XvX>XZ V t h c V h h z V h h z t y {.t a.=.7.:XoXc XXqX}  . . .[ | +Xv C C b S qX}  . .[ | cX:X#X@X-X$XmXS N V kX=X=X8X[  . ...] W o... . . . ... .{ [ [ ..4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y Y x.v.E.Y.T.W.T.T.T.T.T.Y.T.T.T./.",
+"H.H.I.I.I.I.I.I.Y.I.Y.Y.R.T.T.W.U.I I ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.lX;X;X,X7.6.,X;X>XuXh.%.-.2.N @X3Xg.;.<X<X<X<XN v v @X<XyXg.g.r.>X:X-XN #XvX>XfX6.cX>X:X>XZ v M Z v N Z N N N B B B c x m v a.=.$.8.zXoXx XXqX[  . . .{  .+.+.+.+.X. . . .} | cXvX}.m N k $XiXmXZ V bX:X=X=X8X} } } +.W } } } [ } } } [ [ } } [ 4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y ^ x.v.P.T.T./.T.T.T.T.Y.Y.Y.T.T.T.",
+"I.H.I.H.I.I.H./.I.T.Y.R.Y.T.T.W.P.I Y ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.gX;X;X3Xg.$.y.<X;X<X3XyX7.a.N :XyX$.u.>X;XcX:XN #X:X1XyX5.>X,X<X>X>X>XZ oX;X>X,Xy.8.>X,XcX:X:X@X-X:X:X-X:XsX7.7.7.q.-X:X:X:XyX-.$.7.cX>XXXx XXqX[  . . ........... . . .} | :X>XvXOXs.d.j iX+XMXS V bX;X;X;X;X8X` 8X` E qX8X8X8X8X8X` 8X8X8X8X8X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U T Q x.V.U.T.T.T.T.T.T.Y.Y.Y.T.T.T.T.",
+"H.I.H.I.I.I.I.I.I.Y.~.Q.CX!.!.W.P.Y Y ~ <.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.lX>X,XpX%.=.8.<X;X>X,X,XN N v :XaXy.<X;X;X;XN v $XvX1XyX%.w.>XcX;X;X>XZ x $X>X>XsXg.g.r.;X;X>XcX>X>XcX>X,XpX-.$.=.f.cX>X>X>XlX2.=.gX<XvX;XXXb XXqX} [ } } } } o.} } [ o.| cX=X;XvX.X< < k #X#X#X X|.*X|.#X|.#X X#X X|.#XxX=XxXxX=X=X=XcX=X=X=X=X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.&.4.4.4.4.4.U ^ Q x.c.V.U.T.U.S.Y.Y.Y.Y.Y.Y.T./.T.",
+"H.H.I.H.H.H.I.I.I.R.BXSXFXFXDX_.E.Y I ~ 2.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.cX>XeX=.=.=.8.<X>XpX8.u.N @X:X;X>X>XcX;X;X;XN #XcXcX;X3Xr.=.;X>X;X>XcX:XN oXvX;X>X3Xu.:.cX;X;X>XcXcX>XcX>XgX6.=.=.gX>X;X>XcX<XyX:.sX>X;X;X>XXXx oX8X| ` 8X` 8X` 8X8X` ` :X;X-X-X:XOXz z c M M V M M Z vX=XvX>XvXcXxXvX>X;X>X>X;X;X;XcX;X;X;X;X;X4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.U Y ^ x.n.~.BXZX!.T.J.Y.Y.I.Y.Y.T.(.T.",
+"I.I.I.I.I.I.Y.Y.I.!.AX0 9 3 % AX~.G G ^ q.6.4.4.4.4.4.4.4.4.4.4.4.3.4.3.4.4.4.3.5.4.4.4.4.gXcXy.f.g.g.y.cXcXpX7.t.N @XcXcXgXlXlXcXcXcXm #XcXlXcX;XyXr.cXlXlXlXlXzXA oXcXcXlXcXdXw.lXcXlXlXlXlXlXcXlXcXsX7.w.cXcXlXlXlXcXsXw.gXlXlXlXlXlXXXx g M c m m g M m m c m m c v c m x Z zXgXgX@XgXOX7 Z xXlXlXlXlXlXzXlXlXlXlXlXcXlXlXlXlXlXlXlX;X3.4.3.4.4.4.4.4.4.4.4.4.3.4.3.4.4.4.4.4.4.4.4.4.4.Q R H m.VX3 & 8 2 BXI.Y.I.Y.Y.Y./.T.W.",
+"H.H.H.I.Y.Y.I.I.I.BXHX8 & 3 0 HXBXR I Q k.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.&.4.4.4.4.4.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.2.U R Y m.VX8 9 9 8 FX/.Y.Y.Y.Y.Y.T.W.W.",
+"I.I.H.I.Y.I.I.I.I.'.JX4 9 3 0 HXAXI T I D 2.4.4.4.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.3.3.3.k.J R Q M.LX+ & & 8 GX!.I.Y.Y.Y.Y.Y./.W.",
+"I.I.I.I.I.I.I.Y./.DXJX8 9 3 0 JXZX( I T H d.4.4.4.5.4.4.4.4.4.4.3.4.4.4.3.4.3.4.3.4.4.4.4.3.3.4.4.3.3.4.4.4.4.3.4.4.4.3.4.3.4.4.4.4.3.4.3.4.4.4.3.4.3.4.4.3.3.4.3.4.4.4.3.4.3.4.3.4.4.4.4.3.3.4.4.4.4.3.4.4.4.3.4.4.4.3.4.3.3.4.4.4.3.4.3.4.4.4.3.4.3.4.3.4.4.4.3.4.3.4.4.4.3.4.4.3.3.4.4.3.3.4.4.3.4.3.4.4.4.3.4.3.4.4.3.4.4.4.4.3.3.4.4.4.4.3.4.4.3.4.3.4.4.4.3.4.3.4.3.4.4.4.4.3.,.*.q.D I R H VXLX+ 9 & 9 HX!.I.Y.Y.Y.Y.T.R.(.",
+"H.I.I.I.I.Y.Y.I.Y.DXJX3 9 3 9 JXDXL.^ T I D k.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.4.2.d.I R G Q M.LX9 2 8 & HX!.I.I.Y.I.Y.Y././.",
+"I.I.I.I.Y.I.Y.Y.Y.DXJX4 0 9 9 JXFX).P.^ G I D k.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.2.d.R I R H ! M.LX9 2 8 9 JXBXY.Y.H.Y.Y.T./.W.",
+"I.H.I.I.I.R.I.Y.T.DXJX8 % 8 8 JXDX/.).L.^ T G D k.7.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.3.4.4.4.4.4.4.4.4.3.4.4.4.3.4.4.4.4.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.,.k.d.T G I G Y z.VXLX9 2 8 3 JXBXY.I.I.I.Y.Y././.",
+"I.I.I.I.I.I.Y.Y.T.DXJX8 % 8 % JXDXR.).`.V.I I T ^ d.k.2.1.&.<.<.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.<.,.,.,.,.,.<.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.<.,.,.,.,.<.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.<.<.,.,.,.,.<.,.,.,.<.,.,.,.<.,.,.,.,.<.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.7.k.( G T E G q Q l.^.LX9 % 2 9 JXBXY.I.I.I.Y./.R.W.",
+"I.I.I.I.I.I.I.Y.T.DXJX% % % & JXAXW.(._.E.^ T I G G E I P I P I I P I I I P P I I I I I Y I Y Y Y I Y P I I I G I P P I I I I I I Y I Y Y Y Y Y I I G I I Y G I I U I I I I I I P I I I Y Y I I I P I I P I I P P I I I P I Y I I I I I I P I I I I I I I I I I I P I I I I I P P I I I I I Y Y I I I I I I I G I T I R T I I I P Y I Y P T Y G I Y I I I G Y Y I U I I Y P I T T E T Y q w Q x.c.VXJX9 @ 9 & JXAXI.I.I.I.Y.Y.R.T.",
+"I.H.I.H.I.R.I./.Y.DXJX8 % + q JXGX`.).(.CXL.~ I R R G I I I P I Y I I Y P T P I I I I T I I Y T I I I I I T I I I Y I Y I I I I I Y G I I I Y Y T T T R I I R T I I I T G I I I I I I P I I T T I I I I Y I I I I T I I I I I I I I I I I I I I I P I P I I T I I I I I Y P I I I I I I I G I T I I I T I I T T I I I I I I I I I I I I I I I I I I I T T T T T I I I I I I I P G n Y q Q H ! c.v.AXJX9 2 8 9 HXAXI.I.I.I.Y.Y.R.T.",
+"I.H.I.I.I.Y.I.Y.Y.DXJX9 9 8 & PXLX~.`.Q.)._.~.^.n.l.^ H Y n P Y P T P P U I P U T D P P Q U U T U P U Q U U n U G P D P P P P U Q U U U U U T n U U U U U U U U P P q P P G P T P P G P U U G T P P P P P T U G P P P P P P P n Y U U G U P G U P G P G P P G G U U U Y n G U Y U P U P G G Y P T Y U U P P Y P Y T U G I T P G P I P P G G U U I G Y P G Y I G Y Y Y T P T q n q q w H J Q l.v.P.HXPX9 9 3 + JXBXI.U.Y.I.Y.T.T./.",
+"H.I.H.H.I.U.Y.Y.Y.DXJX8 + 3 9 PXPXLXFXDXDXDXDXBXVX^.^.M.l.~ ! D Q Q Q Q Q D Q Q Q Q ~ Q Q Q Q Q Q Q Q Q Q Q J Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q D Q Q Q Q H D Q w Q Q Q w G D Q w Q Q w Q Q w Q Q H D H D Q H H H Q w Q Q Q Q H D w Q Q D Q H Q D w Q H w H Q H w H H Q w w Q H w w w H H H w H w w H w H w w H H w H H H H H w H w H w H H w w H w w H w w D l.l.M.M.M.NXVXVXVXAXLXIXPX3 9 9 * JXAXT.Y.Y.Y.Y.Y.T.T.",
+"I.H.I.I.I.I.I.Y.Y.DXJX8 9 3 9 PXPXPXJXJXJXJXJXIXJXLXFXVX^.l.m.c.m.l.m.l.l.m.l.m.m.l.l.l.l.l.l.c.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.m.m.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.z.! l.z.z.c.z.z.z.z.z.z.z.l.! z.z.z.z.! ! ( z.z.l.x.z.l.l.z.l.z.l.l.l.c.l.l.l.z.z.c.z.l.x.z.! ! z.! z.! ! ! ! ! z.z.! ! ! ! ! z.! ! ! x.! ! z./ z.( / ! z.! z.! ! ! ! K ! ! ! ! ! ! ! x.! ! ! m.M.VXVXLXUXLXLXLXLXJXIXPXPXPX8 3 9 + JXZXT.Y.Y.T.Y.T.T.T.",
+"H.I.I.I.I.I.U.T.Y.SXJX8 9 9 3 9 9 9 9 8 9 9 9 9 9 & 3 3 ^.^.n.n.n.M.^.n.n.^.M.n.n.n.^.M.M.^.n.n.n.n.n.n.n.n.n.v.n.n.n.n.n.n.n.n.n.n.n.n.n.^.n.n.^.n.n.n.n.n.v.n.n.n.v.n.v.n.n.v.v.n.v.v.v.v.v.v.v.v.v.v.v.v.v.v.n.V.n.v.v.v.n.v.v.n.v.n.v.n.v.n.n.n.n.v.v.v.v.v.v.v.v.b.v.v.v.v.v.v.v.b.b.b.b.v.v.b.b.v.v.b.b.v.v.v.b.b.v.v.( L.b.b.b.b.b.b.v.b.b.v.b.b.b.b.v.b.b.v.b.b.^.VX9 & & & 2 2 9 0 2 9 9 & 9 8 8 + 0 JXAXT.T.Y.T.T.T.T.T.",
+"Y.Y.H.Y.I.Y.I.Y.Y.BXHX0 9 3 0 8 % 0 4 2 2 9 3 3 3 8 9 + FXE.~.~.R.~.E.~.~.~.~.~.~.~.~.^.E.E.E.E.~.E.E.E.E.E.U.E.U.^.E.E.~.^.E.E.^.E.E.^.E.^.E.~.^.E.E.E.E.E.U.U.P.E.P.E.P.P.P.P.P.P.P.P.P.S.P.P.P.U.P.P.P.P.P.U.P.U.U.U.P.U.P.P.P.P.E.P.P.P.U.P.P.P.E.P.P.P.U.P.P.P.S.P.P.S.S.P.P.S.P.S.S.S.S.S.P.S.L.V.V.P.V.P.L.P.V.L.V.P.V.V.S.S.S.L.S.P.L.P.P.V.V.V.P.V.V.P.S.V.P.V.~.FX9 8 8 9 0 2 0 8 2 + 8 8 & % 4 9 + HXSXT.T.T.Y.T.T.T.W.",
+"H.H.H.H.I.Y.Y.Y.Y.BXFX2 9 9 2 9 % 2 % % 8 % 8 0 % % % 8 FX!.~.!.!.!.!.BXBXBXBXCXBXBX!.BX!.!.!.`.BX~.~.E.~.W.~.~.~.~.~.!.!.!.!.!.!.!.!.!.BX!.!.`.!.!.~.~.!.Q.~.~.R.E.R.~.E.~.R.T.E.W.E.T.E.Y.U.T.E.U.U.U.E.Y.Y.E.T.E.U.R.E.R.Y.E.R.W.E.W.W.~.W./.E.W.R.E.~.T.E.U.E.U.I.U.U.I.T.U.U.U.U.U.U.U.U.U.U.U.I.I.U.I.U.U.H.I.U.I.I.H.I.U.U.H.J.U.H.H.H.U.U.U.U.H.H.U.P.U.H.U.H.U.BXFX+ 8 8 3 9 9 9 9 3 9 8 0 9 2 3 8 & HX!.T.T.T.T.Y.Y.T.T.",
+"H.I.Y.Y.I.I.Y.Y.Y.R.DX4 3 3 9 9 8 0 9 8 & & 2 9 + + 9 3 ZX`._.SXAXSXSXDXBXSXDXSXDXSXSXSXCXCXBX_._.!.].!._.).).!.].!._._.BX!.!.SX_._._.CXCXCXCX_.'._.BX_.).!._._.!.!.).).Q./.(./.T.T.T.T.T.T.T.R./.T.T.T.T.W.T.`.T.T././.R./.R.W.T./.W.).W.`.).).(._.W./.T./.T./.T.T.R.T.T.T.T.T.T.T.R.Y.R.I.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.R.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y./.T.Y.I.Y.Y.Y.Y.Y._.FX4 0 9 9 8 2 9 9 9 9 8 2 & 8 & 9 2 DXW.T.T.T.T.Y.Y.T.T.",
+"H.I.H.H.I.I.Y.Y.R.Y.!.VXGXHXJXJXJXJXJXJXJXJXJXJXJXJXKXAXCXW.SXZX'.SXSXSXDXDXSXSXSXSXSXSXSXBX_._._._.!.Q.)._.!.!.!.'._._._.'.!.'._.SX_.CXCXCXCXSXCX_._.)._._./.).).).).).).).(.(.T.R.T.W.T.T.T.Y.T./.R.T.W.T.W.T.W.W.T.T.T.W.W./.(.(.W.W./.).(.`._._.W.W.(.(.W.T.R.T.T.T.T.T.Y.T.T.T.Y.Y.Y.I.Y.Y.Y.Y.T.T.Y.T.Y.R.Y.Y.I.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.T.Y.Y.Y.Y.Y.Y.I.Y.Y.Y.Y.Y.!.FXFXKXKXJXJXPXJXJXJXJXJXJXJXHXHXHXAX!.Y.W.T.T.Y.Y.T.T.T.",
+"H.H.I.H./.I.I.Y.T.T.I.`.CXDXFXBXDXDXDXDXFXDXDXFXDXZXBXSXY.BXCX'._.SXCXDXSXDXSXSXSXSXSXSXCXCXCX_._._.!.).).`.).(._._._._._._._._.CX_._.CX_.SX_.'.CX_._._._.).)._.Q.`.W._.).(.W.(.W.R.T.T.T.T.Y.I.T.T.T.W.T.T.T.T.T.T.R.`.W.`.W./.R.R.W.CXW.T.`.).).W._.R.W.W.).W.W.T.T.T././.T.Y.T.Y.T.Y.Y.Y.Y.Y.Y.T.T.T.T.T.T.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.I.`.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.~.ZXZXFXAXFXFXFXFXFXFXZXFXFXAXBXBX!.Y.R./.T.T.Y.Y.T.Y.T.",
+"H.Y.I.I.H./.I.Y.T.T.T.T.T.R.(.).).!._.).`.!._.!.CX'._._._.CXCXCXSXSXCXSXSXSXSXDXSXSXSXSXSX'.CX_._._._.!._._._._._.).(._._._._.CX_._.SX_._._.BXCXCX_._._.CX_._.).).Q.(././.(./.W.W.T.W.T.T.T.T./.T.T.T.T.T.W.T.(.(.T.W.W./.(.Q./.)._._.W.`._._.)./.).R.).).R.T.(.W.T.T.T.T.T.T.T.T.Y.Y.T.Y.T.T.Y.T.Y.T.T.T.T.T././.T.T.T.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.T.Y.Y.Y.Y.Y.Y.E.Y.I.U.Y.U.U.Y.Y.~.T.T.~.T.(.R.W.T.T.T.Y.Y.T.T.",
+"H.H.H.I.I.T./.I.Y.T.T./.W.W.W.W.).).!._.!._._._._._.CXCX_.SXCX'.CXSXSXSXSXSXSXSXSXDXCXSXCXCXCX_._._._.)._.).)._.`._._._._._._._._._._._._.CX_.CX_._.SX`._.).`.).).).).(.).R.T.(.W./.T.T.T.Y./.Y.T.T.T.T.T.W.(.T.(./.(.(.T.R./.)././.).).).).).(.(._.W.).`.W._.W.W.W.T./.T.T.T.T./.T.T.Y.T.T.Y.Y.Y.T.T.T.T.T.T.T./.T.T.T.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.T.T.T.Y.Y.Y.Y.Y.Y.Y.I.I.I.I.I.I.T.Y.Y.Y.T.T.W.W.T.T.T.T.T.T.Y.Y.Y.T.",
+"H.Y.Y.H.I.I.I.I.Y.T.T.T.W.W.).).Q.!.)._._.).!._._._._.CX_.SXBX_.CX_.SXCXSXSXSXSXZXCXSXSXCXCXCXCX_._._._.)._._.).)._.)._._._._._._._._._._._._._._.!.Q._.].Q.Q.).).`.`.`.W.W.(.(./.T.T.T.T.T.Y./.T.T.T.T.T.T.T.(.R.T.T.T.T.T.R.(.T.(.)././.(.).(.W._.R.(.(././.W.W.W.W.W.T.T.T.T.U.T.T.T.T.T.T.T.T.T.T.T.W.T.T.T.T.T.T.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.I.Y.Y.I.I.I.I.I.Y.I.I.Y.Y.T.T.T.R.T.(.T.Y.T.T.Y.Y.Y.Y.T.",
+"H.I.U.I.I.I.I.Y.Y.T.T.T.T.(.).W.).).)._.`._._._._.SX_.CX_.BX_.CXCX_.SXSXSXSXSXDXDXSXSXCXCXCX_.CX_._._._._._._.).)._._.)._.`.`._._._._._._._._._._._._._.`.`.`.`.`.).Q.Q.W.W.).W.T.W.T.T.T.T.T./.T.T.T.T.T.T.T.W.W.(.T.T.`.U.P.n.n.U.`.T._.W.L.V.V.~.`.`.!.W.W.W.W.R.(.T.T.T.T.T.T.T.T.T.T.T.T./.T.T.T.T.T.W.T.(.T.T.T.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.I.Y.Y.Y.Y.Y.Y.Y.T.Y.T.I.Y.Y.Y.I.I.I.I.I.I.I.I.Y.Y.Y.Y.Y.Y.W./.T.T.R.T.T.T.T.I.Y.T.T.Y.",
+"I.H.H.I.I.I.Y.T.T.T.T./.(.(.W.W.R.).).!._.!._._._._.'.'._._.CXCXCXSX_.SX_.DXSXCXSXSXSXCXCXCXCX'._.'._._._._._.).)._.(._.)._.`.).)._._._._._._.)._._.ZX4 2 8 % % 8 2 8 8 2 % 8 W.T.T.T.W.T.T.T.T.T.T.T.T.T.W./.`.Y.T.T.).T./ % % + 2 / `.L.0 + 8 % 0 n.& 2 8 L.T.(./.(.(.W.T.T.W.T.T.T.T.T.T.T.T./.(.T.T.T.W.W././.T.T.T.T.Y.Y.Y.Y.Y.Y.Y.I.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.T.T.Y.Y.Y.Y.Y.I.I.I.I.I.U.T.Y.Y.Y.Y.Y.Y.T./.W.T.T.T.I.T.T.I.Y.Y.Y.",
+"H.Y.I.I.I.Y.Y.Y././.T./.(.(.(.).`.)._.).!._._._._._._.BX_._.CXCXSX_.SXSXCXSXCXCX'.CXCXSXCXCXCX'.SXSX_._._._.)._._._.)._.)._.).!.).`._.).)._._._.).).BX2 % & 8 + 9 3 0 + 0 & 9 /.T.(.T.T.Y.(.Y.T.T.~.T.T.T.T.T./.I./.`.T.n.+ 9 & % 0 v.~.H + 8 8 8 J L.0 + 2 n.W.).(.(.T./.(.W.Y./.T.Y./.T./.T.T.W.W.W.W.T.T.T.T.T.T.T.Y.Y.T.Y.Y.Y.Y.Y.I.Y.I.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.I.I.T.T.I.I.I.I.I.I.I.I.I.Y.I.Y.Y.Y.Y.Y.T.T./.T.T.T.Y.Y.I.T.Y.Y.T.",
+"Y.H.I.I.I.I.Y.T.T.T.T.T.W./.(.W.Q.).)._.).)._._._._._.SX_._._.CX_.SXCX_.CXCXCXSXCXCXCXCXCXCXCXCX_._._._.)._._.)._.(._.)._._.).).)._.`._.)._._.`.).'.R.4 2 4 2 0 2 8 & 4 2 4 2 Y.~.T.T.`./.W.T.(.Y.T.Y./.(.Y./.T./.Y./.T.x.+ 9 9 / V.T.T.4 % + H v.L.E.( x.x.U._.W.T.T.).T.T.T.E.T./.T./.Y.`.W.T.W.T.T.T.(.T.T.T.T.T.T.T.T.Y.Y.T.Y.Y.Y.Y.Y.I.Y.Y.Y.Y.Y.Y.Y.Y.T.T.T.T.I.I.Y.I.I.I.I.I.I.I.Y.I.Y.Y.I.Y.Y.Y.Y.T./.T.T.T.T.I.Y.Y.Y.Y.Y.",
+"H.H.I.I.I.Y.T.T.T.T.T.T.W.W.W.W.Q.).`.`._._._._._._._._._._.BXCX_.CXCXCXCXCXCXCXCXCXCXCXCXCX'.SX_._._._._._._.)._.(.(._.(.(._._._.)._._.)._._._.).(._.`.ZX`.W.0 8 3 0 W.~.W.W.U.V.n.v.W.x.( V.E.(.).V./ / / / V.E.`.T.L.J 2 8 5 v.L.W.v.8 9 8 ^ L.T.U.L.V.v.T.R.`._.`.v.x./ x.v.E.E.(.T./.T.).W.W.W.T.W.T.W.T./.T.T.Y.T.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.I.T.Y.Y./.I.I./.Y.I.H.I.I.H.H.I.I.Y.I.Y.Y.I.I.Y.Y.T.T.T.T.T.T.I.Y.Y.Y.Y.Y.",
+"Y.Y.Y.I.I.T.I.T.T.Y.T.T.T.W.T.`.Q.).).).)._.)._._._._._._.CX_._.CXCX_.CX_.CXCX_.CXCX_.CXCX_.'._._._._._.`._.)._._.`._.(.`._.).)._.`.).`.`.).`.`.R.(.).(.W.`.R.% 8 9 8 R./.T./.v.% % + ~ 4 % H T.P.G % 0 & 8 4 4 G v./.G 2 8 & 2 % J V.% 8 8 & % 4 V.C.% 3 0 n.(.Q.n.G + 8 9 % + 4 b.W.R.Q./.W.W.W.T.T.W.W.T.(./.T.T.T.T./.Y.T.Y.I.`.Y.I.Y.Y.Y.Y.Y.Y.Y.I.I.Y.Y.Y.I./.I.I.I.H.I.I.I.I.I.I.I.I.Y.I.Y.Y.Y.Y.Y.T.T.T.Y.T.I.I.I.I.I.Y.Y.",
+"Y.I.Y.I.Y.U.Y.T.T.Y.Y.T.T.T.W.(.).).Q.!.)._._._._._._.`._.'.CXCXCX_.CXCXSX_._._.'.'._._._._._._.'._._._._._._._.).).`._._.(.)._._.).`.`.).).`._.!.).`._.`.W.(.8 9 + + R././.T.v.% % 8 + 0 % b.W.J 4 & 9 8 8 8 8 % J /.G 4 9 8 & * J v.8 & 8 8 8 2 n.n.* 8 % n.Q.Y.G 2 & 9 9 0 % 2 4 L.Q.T.).W.W.W.W.W.T.W.T.W.T.T.T.T.T.Y.T.Y.Y.Y.Y.Y.`.Y.Y.Y.Y.Y.Y.Y.Y.I.Y.Y.Y.I.I.I.I.I.I.H.I.H.I.I.H.I.I.I.Y.Y.Y.I.Y.Y.T.T.T.Y.I.I.I.I.I.Y.Y.T.",
+"I.I.Y.Y.Y.T.Y.Y.Y.T.T.T././.W.W.).).).).).).)._._.)._.!._._._.'._._._._._._._.SXSX_.SXSX_.SXSX_._._._._._._._._._._._.).W._.).).).).).).).).).T._.).W.W.`.W._.+ 8 8 8 T.(./.).v.+ 0 8 0 b.b.~.T.J G 4 G E.E.J 2 8 4 T.S.^ + 2 8 v.L.T.n.% 9 8 ^ v.U.v.+ 8 8 v.).x.2 + 4 ( ~.v.0 2 4 / W.T./.).W./.W./.W.T.T.T.T.T./.T.(./.T.T./.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.I.Y.Y.Y.Y.Y.I.I.I.I.I.H.I.I.I.I.I.I.I.I.I.Y.I.H.Y.Y.Y.Y.Y.T.T.Y.I.I.U.Y.Y.Y.Y.",
+"Y.I.Y.Y.Y.T.Y.T.T.T.T.T.R.T./.W.(./.).).).).)._.)._._._._._._.'._._._.'._._._.SX_._._._._._.CX_._._._._._._._._._.)._.)._.`.).).`.).).(.(.).)._./.(.).(.).).W.8 & % % W./.(.Y.v.2 8 + ! /.(.T.W./.`.~.V./ J 0 2 0 @ W.T.( 0 2 0 W.W./.R.8 0 2 / !.T.V.% 2 2 v.Q.H + + G I././.L.E.T._.W.(.(.W.).`.T.(.W./.T.T.T.T.T.T.(.Y.T.Y.Y.Y.Y.Y.Y.`.Y.Y.Y.Y.Y.Y.Y.I.Y.Y.Y.I./.I.I.H.I.I.I.I.H.H.I.I.I.I.I.Y.I.H.Y.I.Y.Y.T.Y.I.Y.I.Y.I.I.I.Y.",
+"Y.Y.Y.Y.T.Y.Y.T.Y.T.T.T.T.W.W.W.W.).).).).).).).)._._.!._._._._._.SX_._._._._._._.CX_._._._._._._._._._._._._._._._._._._._.)._.).)./.).(.).).(._._.(.).(.R.R.% 8 % % R.Y./.W.n.8 & 9 n.T.)./.T.V.J + % % % q 9 & 0 W.(.( % 8 8 `.W.].R.8 & + b.T.W.n.% % % v.!.J % + H `.T.(.T.R.).W.W.(.).W.(.(.T.(.T./.T.T.W./.T.T.T.T.T.T.T.(.Y.(.Y.I.I.I.`.Y.I.Y.Y.Y.I.I.I.I.I.I.I.I.I.I.H.H.I.I.H.I.I.I.I.H.I.I.H.I.H./.Y.I.Y.H.Y.H.I./.I.Y.",
+"I.Y.Y.T.Y.T.Y.T.T.Y.T.T.T.R.W.W.W.(.(.(.W.`.!.!._._._._._._._._._._._._._._._.SXSX'._._._._._._._._._._._._.CX_._._._._._._._._._.).`.(.).(.(._.(.(.(.(.W.W.T.9 8 & + W.T.W.T.C.4 & & V././.~.T.4 % % J n.T.K 2 % % _.T.b.8 2 % R.ZX`.).% 8 2 ( `./.V.& & 8 n.W.J * % G W.Q.R.v.( v.v.`.).)./.(.(.(.(././.T.T.T.T.T.T.T.T.T.T.T.Y.Y.(.Y.Y.I.Y.Y.Y.T.I.Y.I.I.I.Y.I.I.I.I.I.H.I.I.I.I.I.I.I.I.I.I.I.H.I.H.I.I.Y.T.I././.I.Y.I.Y.Y.Y.",
+"Y.I.Y.Y.Y.T.T.Y.T.T.T.T.T.W.T.W.(.(.(.).).`._.).)._.).`._._._._._._._._._._._._._._._._._._._._._._._.CXCX_._._._._._._._.)._.).`.).).).).).(.(.(.(.(.W.W.W.R.8 2 % % T.T.Y.T.L.% & + L././.~.L.2 0 0 / n.( 0 8 % 8 `.(.( 2 9 % Q.R.R.Q.0 8 8 x.W.).V.3 & 2 V.T.b.+ % + J v.c.q 0 4 H !.W.W.).W.(.(.(.(./.T.T.T.Y.T.Y.T.(.Y.T.T.Y.(.Y.Y.Y.`.Y.Y.T.I.T.T.I.T.I.I.I.I.I.H.I.I.H.I.I.I.H.I.H.H.I.H.I.H.H.I.Y.I.I.Y.I.H.I.I.H.Y.T.Y.Y.",
+"I.Y.Y.Y.Y.T.Y.T.Y.T.T.T.R.T.T.W.W.(.(.(.).)._.).)._.)._.!._._._._._._._._._._._._.CX'.'.CX_._._._._._.CX_.CX_.SX_._._._._._._._._.(.).(.).).(.).(.(.(.(.(.W.(.% % 0 2 W.T.W./.v.2 0 & V.W.T.`.L.4 2 & & 2 2 0 9 9 4 E.]./ 8 % % Q.Q.).T.% % % ( `.(.L.+ 9 @ L.).T.H 2 8 + % 8 8 + 2 P._.`.`.).).(.(.(.(.W.T./.W.T.T.T.T.T.T.R.T.Y.Y.Y.Y././.Y.Y.Y.Y.Y.Y.Y.Y.I.I.I.I.H.I.H.I.I.H.I.I.I.H.I.H.I.I.I.H.I.I.I.I.I.I.I.I.I.I.I.I.T.T.Y.",
+"I.I.Y.I.U.Y.Y.Y.T.Y.T.W.T.T.T.W.W.).(.(.).)._.!._.!._._._.)._._._._._._._._._._._._.CX_.CX_._._._._._._._.CXCX_.'._._._._._._._._.)._.).)._.).).`.).(.(.T./.W.% 4 + 4 `.W.W.Y.L.4 + 4 v.`.W.T.T.b.0 0 0 3 ^ S.0 & 2 L.W.( 0 % 2 !.W._.).0 + 0 c.`.(.L.2 0 0 V./.Q.E./ 0 8 8 2 4 H ^.`.(.).).).).(.(.(.T.W.T.T.R.E.T.T.Y.T.R.Y.Y.Y./.Y./.Y.Y./.Y.Y.T.Y.Y.I.Y.Y.I.U.I.I.H.I.I.I.I.I.H.I.I.H.I.I.H.H.I.I.H.I.I.I./.I.I.I.I.I.Y.T.T.T.",
+"U.I.I.Y.Y.Y.Y.T.T.Y.T.T.T.T.T.W.(.(.(.).).`.!.)._.).).!.)._._._._._._._._._._._._.CX_._._.CX_._._._.'.CX_.CX'._._._._._._._.)._.)._._._.).).).).`.(.(.(.(.(.(.`.R.!.W.R.T.T.Y.`.T.~.~.(./.T._.`.W.E.V.v.~.W./.R._.W.).).).(._.).R._.T.(.(.`.T.R././.).!.!.~.).`.R.`._.`.E.L.L.E._._.).)._.)._.).).(.(.W.W.T.R.T.T.R.Y.R.T.T.Y.T.Y.Y.(.Y.Y.T.Y.T.T.Y.Y.Y.Y.I.I.U.I.I.I.I.I.H.H.I.I.I.I.I.I.H.H.I.I.H.H.I.I.I.I.I.Y.I.I.I.I.T.T.T./.",
+"H.I.Y.I.Y.Y.Y.Y.Y.T.T.T.T.W.T.W.T.W.W.W.).).).!._._._.!.!.]._._._.SX_._.SX_._._._.CX_.'._.'.CX_._.CX_._._.CXCXCX_.CX_._.).)._._._._.).)._.).(.).).).).(.(.(.(./.(.T.W.T.).W./.T././.(.(.(.W.T.)./.(.)./.(.T./.).W.W.W.R._.).).`./.Q.).`.(././.)./.T.R.`.W._.).(._.).)._.W.)._._._._.(._.)._._.).).).W.(.T.W.T.(.T.T.T.T.T.E.Y.T./.Y.Y.Y.T.Y.T.Y.Y.Y.Y.Y.I.Y.Y.I.I.I.H.U.I.I.H.I.I.H.I.H.H.I.I.H.H.I.I.I.I.I.Y.Y.I.I.I.Y.I.Y.T.(./.",
+"H.I.I.I.Y.I.Y.Y.Y./.T.T.T.T.T.T.(.(.(.(.).).`.Q.Q.Q._._.)._._._.SX_._._._._.'.'._.CX_._._.CX_._._.CXCX_._.SX_.'._._._._._._.)._._.`.!._._.(.).).(.).).).(.).).(.(.(.`.).W.`.W.T./././.(.W.W./.W.R.(.R.(.).(./.R.)._.)._._.)./.)._.)._.W.W.W.).`.).W._.`._._.).)._.)._._._._._._._.`.`.SX)._.).).).).).(.R.W.T.T.T.T.R.W.T.T.T.T./.Y.Y.T.T.T.Y.Y.Y.T.Y.Y.I.Y.I.Y.I.I.I.I.I.I.H.I.H.I.I.H.I.H.I.I.I.I.I.H.Y.H.Y.Y.Y.I.I.I.Y.Y.T.T.T.",
+"I.I.I.I.I.Y.Y.Y.T.Y.T.T.T.T.T.T.T.(.W.W.).`.`.)._.Q._.Q._._._._._._._.SX_._.CX'._._._.CX_._._._._.CX'._.'._.CX'._._._._._._._._.`.).!.).(._.).).(.).).`.(.(.).)./.(.).T.W.W.(.`./.)./.).`._./.).W.!.Q.Q.T._.`.`.(.R.(.).Q.)._./.]./.).Q._.W.`.).W._.)./.).).).)._.`._._._._.CX_._._.CX_._._.)._.`.).(.(.(.(.(.W.T.T.T.T.R.T.Y.R.Y.Y.(.Y.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.U.I.I.Y.I.I.I.I.I.I.I.I.I.I.H.I.I.I.I.I.H.Y.Y.Y.Y.I.I.Y.Y./.T./.(.",
+"H.I.I.I.I.Y.Y.Y.Y.Y.Y.T.T.T.T.T.T.(.(.(./.).Q.Q._.).Q._._._._._._._._._._._.CX_.CX_._.CXSX_.CXCXCXCXCXCXCXCXCX_._._._._._._._._._.`._._._.`._.).`.).).(.(.).).).W.).T.W.(._./.W._./.W.`.W.(.T.W.(.)./._.`._./.Q.(.).`.W._./._.(.R.R.`._.`.).Q.Q.W.`.!.)._.).`.`.!.!._.CXCXCX_._.Q.ZXZXCX).)._.).).).).(.(.W.(.(.(.T.W.T.T.T.T.T.Y.Y.Y.T.Y.Y.Y.Y.Y.Y.I.E.Y.Y.Y.Y.Y.I.Y.Y.I.I.Y.I.I.I.I.H.H.I.I.I.I.I.I.I.Y.H.Y.Y.Y.I.I.Y./.I././.T.",
+"I.H.I.I.Y.I.Y.Y.Y.T.Y.Y.T.T.T.T.T./.(.(.).Q.Q.Q.Q.Q._.)._._._._._._.CX_._._._._._._._.CXCXCX_.CX_.CXCXCXCX_._._._._._._._._._._._._.)._.)._.).).`._.Y.( ( ( c./ b.`./.).`.T.)._.W./.).W.)./.(.`.(.).)._._.T._.Q.).W.`.).).W.~.`.P.J H '.).!.U.^ J J / _._.ZX_.b.G J ( `.'._.L.x.c.b.( x.].'._._._.).).).(.(.(.R.(.(.(.T.T.T.T.T.Y.(.Y.Y.Y.Y.Y.Y.I.Y.Y.Y.Y.Y.Y.I.Y.Y.Y.I.I.Y.Y.I.I.I.I.I.I.I.I.I.I.I.I.I.I.Y.H.Y.Y.Y.Y.Y.Y././.T.T.",
+"I.H.I.I.I.I.I.Y.Y.Y.Y.R.Y.Y.T.T.T.R.(.(.(.(.Q.).).)._._.W._._._._._._._._._._._._._._.CXCX_.CXCXCXCXCXCX_.CXCX_.'._._.'.CX_._._._._._._._._._._.(.`.n.4 & + 4 9 % G /.).W.`.W.).W.).(./.`.`.T.W.).R.(.T.!.)._.Q.!.)._._./.).`.L.G + 0 Q._.~.4 0 q q 2 / ~._.! + G q 4 H /.SXJ 9 & + 8 2 ZXQ.ZX_._._.).).).W.).W.(.(./././.Y.T.T.T.Y.T.Y.Y.Y.I.Y.Y.I.Y.Y.Y.Y.Y.Y.I.Y.I.H.Y.I.Y.I.I.I.I.I.Y.I.Y.I.I.I.I.I.I.I.Y.Y.Y.Y.T.T.Y./.T.W.T.",
+"I.H.I.H.I.I.Y.Y.Y.Y.Y.Y.T.R.Y.T.T.T.T.(.(.(.Q.).)._._.).!.`._._._._._._._._.)._._._._._.CX_._.CXCXCX_._.CX_.CX_._._._.CX_._._.CX_.CX_._._._._._._._.n.3 3 H c.0 % 8 )./.W.v.( ( n.T.W.T.V.L.E./ V.T.V.L.E.x.( E.`.).).).)._.J + 8 + 2 _.).c.2 q !.~.0 + P.P.0 2 ~.R.^ c.U.SXH 2 ! c.c.c.!._._._._.).`.).).).`.W.(.(.W.(.T./.T.T.(.Y.T.Y.I.Y.I.I.I.Y.Y.Y.Y.Y.I.Y.I.Y././.Y.Y.I.I.I.I.I.I.I.I.Y.I.I.I.H.I.I.I.I.Y.Y.T.T.T.T.T.T.T./.",
+"H.I.H.I.I.I.I.I.Y.Y.Y.Y.T.T.Y.T.T.T./.(.R.).).Q.).)._.W._.!._.).)._._._.).)._.`._.CX_._._.'._.CXCX_._.BX_.CX_._.'.'.CX_.CX_.'.CX_._._._._._._._._._.n.2 9 H c.0 & ( R.)./ + 2 + + ! ~.n.4 + G % ( n.% 2 G 0 9 0 !._.R.)._.`.2 G H 8 2 '._.( 8 J BX!.G 0 c.x.& H c.J ^ E.'.ZX% 0 ( c.v.E.SX_._._._._._._._.)._.).).(.(.W.T.W.W.T.T.T.T.Y.I.I.I.I.I.I.I.Y.Y.Y.Y.Y.I././.H.Y.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.Y.Y.T.E.T./.(.T.T.T.T.",
+"H.H.I.H.I.I.I.I.Y.Y.R.Y.T.Y.T.T.T.(.T.).W.(.).).).(._._.`.).!._._._._._._.`._._._.CX_._._.CX'.CXCXCXCX_.CX_.CXCXCX_.CX_.'._.CXCXCXCXCX_._._._._._._.n.9 & 2 2 3 0 c._.v.% 0 v.n.+ + L.n.+ + G v.~.L.+ % / ( 8 4 L.)._._.).CXb.!.c.0 + Q._.L.+ + b.c.0 8 c.c.& % q q + 0 ~.E.4 & 8 0 & G E.CX_._._._._.`.`._._.)._.).(.W.W.W.W.T.(.T.T.Y.Y.I.I.I.I.I.I.Y.Y.Y.Y.Y.I.I.I./.H./.Y.Y.I.I.I.I./.I.I.I.Y.I.I.I.I.I.Y.Y.Y.W.T.T./.T.T.T.T.",
+"H.H.I.H.H.Y.I.I.I.Y.T.Y.Y./.T.T.T./.W.R.W.(./.`.).)._._.)._._._._._.)._.)._._._._._.`._._._._.CX_.BX_._._.SX_.CXCXCXCXCX_.CXCXCXCXCX_.CX'._._._._._.L.8 % J ( J 0 2 v.x.9 % J H + @ ( n.% % c.`.T.n.2 2 v.v.2 2 n._.W._._.Q.ZX_.( 8 0 CX_.!.x.8 4 0 q 0 c.c.% 0 ZX_.q 0 x.~.x.c.E.E.0 4 b.!._._.'.SX_._.`._._.).(.`.(.(.W.(./.(.T.T.Y.Y.Y.Y.Y.I.I.I.H.I.Y.Y.Y.Y./.Y.Y.Y.Y.Y.Y.Y.I.R.R.I.I.I.I.I.I.I.I.I.I.I.Y.Y.Y.E.T.W.T.T.T.T.T.",
+"H.H.H.H.I.H.I.I.I.Y.Y.Y./.T.T.T./.T.T.(.).W.).).)._._.).!.!.)._._._._._.)._.)._._._._._._._.CXCXCX_._.CX_._._.CX_._.CXCX_.CXCXCXDX_.CXCXCX_.BXSX_._.L.2 0 ( `.v.0 & ( c.2 0 ( x.( ( V.V.4 + L.W.R.V.0 8 n.n.0 0 L.!._.`._._._._.c.8 % _._._.).n.L.!.0 4 n.n.& H _._.J + c._.E.U.W._.H 0 c.SX_.BX!._._._.!._.!._._._.(.(.(.(.W.T.T./.T.Y.Y.Y.I.I.I.I.I.I.I.Y.Y.Y.I.Y.Y.Y.Y.Y.Y.Y.I.I.I.I.Y.Y.I.Y.I.I.I.I.I.I.Y.I.T.T.T.T.W.T.T.T.Y.",
+"H.H.H.I.Y.H.H.Y.I.I.I.Y.I.Y.T.Y.T.T./.T.T.W.(.(.).(.).`.)._.).).).)._._.`.).)._._._.)._._._.'._.CX'._.CXCXCX_._.CXCXCXCXSXCXCXCX_.SXCXCXCXCX_._.!._.L.+ % 9 & 8 & 0 V.P.2 % ( / H ( T.v.% 0 V.`.R.n.0 % v.n.% 8 L._.).CXCX_._._.c.0 2 CX`.E.2 % c.( 8 0 BX~.4 0 ( m.8 8 n.L.+ 8 m.m.2 0 L.ZXSX_.SX_._.SX_._._.).).).).W.(.W.W./.T.T.T.T.Y.Y.Y.I.I.H.I.I.I.I.Y.Y.T.Y.Y.Y.Y./.Y.Y.R.I.Y.Y.Y.I.I.I.I.Y.I.I.I.I.Y.Y.Y.E.T./.T.T.T.T.T.",
+"H.H.I.H.H.H.Y.H.I.Y.Y.T.Y.Y.T.T.T.T.T.T.T.(.T.(.).W.).).).)._.)._.)._._._._._.)._.)._._._._._._.CX'._._.CX_._.CXCXCXCXCX_.CXCX_._.CXCXSX_._.SX_._.`.V.4 2 2 4 4 0 c.W.W.c.0 4 4 0 c.W.L.% % V.W.).V.2 2 V.V.+ 4 n._.)._._.SX_._.x.2 4 !.BXBXv.2 4 4 q ^.ZXZXE.0 4 5 2 ( SXZX/ 2 4 5 4 c.ZXBX_._._.BX_._._._._.).).).(.).(./.W.T.T.T.T.Y.Y.Y.Y.I.I.I.I.I.I.Y.I.Y.Y.Y.Y.Y.Y.Y.Y.R.I.R.Y.Y.I.I.I.I.I.I.I.I.I.I.Y.I.Y.T.T./.T.T.T.T.Y.",
+"I.H.H.H.H.I.I.I.I.I.Y.Y.R.Y.R.Y.T.T.T.T.T.T./.(.(.(.(.`.W.`.`.!.)._._._._._._._._._._._._.SXCX'.CXCX_._._._._._.SX_.CXCX_.CXCXCXCX_.CX'.CXCX_.CX_._._.W.ZX`.W.~.`.`.`.`.`.E.v.V.I.].R./.`.W./.(.T.`.~.~.)._.ZX~.ZX)._.CXZX!._._.DXZX!.DX!._._.!.L.L.DXSXDXCX_.SXL.L.ZXCX_.`.SX~.n.L.~.CXSX_.'._._.SX_._._._._.).).).).).(.W.W./.T.Y.T.Y.Y.Y.Y.I.I.Y.I.Y.I.Y.Y.Y.Y.Y.Y.Y.Y./.Y.Y.Y.Y.I.Y.Y.I.I.I.I.I.I.I.I.I.I.Y.Y.T.T.T.T.T.T.T.T.",
+"H.H.H.I.H.I.H.I.I.I.I.Y.I.Y.Y.R.Y.T.T.T.T.T.T./.W.(.`.W.).).).).)._._.)._._._._._._._.CX'._.CX_._._._._._.SX_.SX'._.CXCXCX_._.CXCXCXCX_.'._._._._._._.`.).(.).(.(.T.T./.Y.T.W.W././.R.(.W.W.T.(.W.W.).)./.).(._.W._._._.`.`.'._._._._._.SX'.'.SXBXZXSX!.DXZXSXSXCXSX_.`.SX'.)._.!.SX_.`.`.!.'.SXSX_._.SX_.CX!.).).).).).).(.(.T.T.`.Y.T.Y.Y.Y.I.Y.I.I.I.I.I.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.I.I.I.I.I.I.I.I.I.I.Y.Y.T.T.T.W.T.W.T.Y.T.",
+"H.H.H.I.H.I.I.I.I.I.Y.Y.Y.Y.Y.Y.T.Y.T.T.T.T.T.`.W.W./.W.).(.).`.).`._._._._._._._._._.'.'.CXCXCXSX_.'.CX'._._.SX'.CX_.'._._._.CXCXCX_._.CX_._._._.W.).).(._.(.(././.`./././.(.`.W.T.(.`.W.`.`./._.).).R.(.(.W.(.).).W._._._.)._._._._.SXSX`.SX_.!.SX'.SXCXSXSX'.CXCX'._.CXCX'._._._.!.SXSXCX_.'.CX_.'._._._.!.).).`.(.(.).W.W.W.`.Y.T.Y.T.Y.Y.Y.Y.U.Y.I.Y.Y.I.Y.Y.Y.I.T.Y.Y.Y.Y.Y.Y.Y.I.I.I.I.I.U.I.I.I.Y.I.U.Y.T.T.T.T.T.T.W.Y.T.",
+"H.H.H.I.I.I.I.I.I.I.Y.I.I.Y.I.Y.Y.Y.Y.T.T.T.(.T.T.W./.`.(.(.).).)._._.)._._._._.CX_._.CXCXCXCX_._._.CX_._._._._.CXCXCX_.'.CX_.CXSX'._._._._._.)._._._.).(.(.`.W././.T.T./././.T.(.)./.W./.T./.(.W.W.)._.)._.).).)._._._._._._.SX_._.SXSX!.CXSX_.SX_.SXSX'.BXCX_.CXBX'.'.SX_.'._._._._.`._.CXSX_.CXCX'._._._.!.).).).(.(.(.)./.W.(.T.T.T.T.Y.Y.Y.Y.I.Y.I.Y.I.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.I.I.I.H.I.I.I.I.I.I.I.T.T.Y.E.T.W.T.T.Y.T.T.",
+"H.I.H.I.I.I.I.I.Y.I.I.I.I.I.I.I.Y.Y.Y.T.T.T.T.W./.`.T.`.(.`.).).).).`._._._._._._.'._.CXCXCXCX_._._._._._._._._.SX_._._.CXCX_.CX_._._._._._._._._.`.`.R.).(.W._./.Q.(.T././.W./.T.T._.T.(./.(.(.(.).`.`.`.).).).).).)._._._.CX_._.CXCXBXCXSX_.SXSX_.SXCX_._.SXSXSXCX_.SXBX_.SX_.'._.!.SX_.)._._._._._._._._.`.).).(.(.(.(.(.(./.T.(.Y.T.T.Y.Y.Y.Y.Y.Y.Y.Y.I.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.I.I.I.H.I.I.I.I.I.Y.I.Y.Y./.T.E.T.R.T./.Y.Y.Y.",
+"H.H.I.I.Y.H.I.I.H.I.Y.Y.I.I.I.I.Y.Y.Y.Y.T.T.T./.W.T.W./.(.(.).).`._.)._._._._._._.CX_.CXCXCX_.CXSX_._.SX_._._._._._._.SX_._._._._._._._._._.).).`._.`././.R.).W.T.T.R.(./.W.W.R.W.W.W.W.).W.W.W.(.).W.`.).Q.).`._._._.).!.'.SX_.SXCXCX_._._.CX_._.'._.SX_.SX_.SX_.BXSX_._._._._._.'._._._._._._._._._._.)._.!.).).(.(.(.(.(.T.(.(.T.T.T.T.Y.T.Y.Y.Y.Y.Y.Y.I.Y.I.Y.Y.Y.Y.Y.Y.Y.Y.Y.I.Y.I.I.H.I.H.I.H.H.I.H.Y.H.H.Y.W.T.T.T./.T.T./.",
+"H.I.I.I.I.I.I.I.Y.Y.I.I.I.I.I.Y.Y.Y.Y.Y.Y.T.T./.T./.`.(.(.W._.(.).)._._._._._.CXCXCXSX_.CXCX_._._._._._._._._.SX_._._._._._._.CX_._.!.`.)._.)._.).).(.(.).R.(./.T././.T./.T./.W.T.(.(.W./.W.W.(.W.(.).(.).).).).(._._._._._.SX_.CXCXSXCX'.CXCXCXSXSX_.SXSX_.SX_.CXSX_.SXSX_.SX_.'.CX_._._._._._._._._._._.).W.W.W.(.).).(./.(./.(.T.T.T.T.T.Y.T.Y.Y.Y.T.Y.Y.I.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.I.I.H.I.I.H.I.Y.I.H.H.Y.Y.I./.Y.E.T.T././.T.T.I.",
+"H.U.I.H.I.I.I.I.Y.I.Y.I.I.Y.I.I.I.I.Y.T.Y.T.T.T.T./.W.W.T.(.W.(.).).`._._._._._.CXCX_.SXCXCXSX_._._._._._._._._._._._._.CXCX'._._._._.`.)._._.).).).(.W.(.(.(.R.(.R.(.T.T.(.T.T.T.T.(.W.W.W.(.T.(.).(.).).).Q.Q.).)._._._.SXSX_.SXCXCXCXCX'.CXCXSX_.SX_._.SXBX_._._.SX_.SX_._.SX_.CX_._._._.!._._.)._._.`.).).).(.(.(.(.(.(.W.(.(.(.T.(.T.T.T.E.Y.Y.Y.Y.Y.Y.Y.Y.Y.I.I.Y.Y.Y.Y.Y.I.Y.I.I.H.I.H.H.H.H.Y.H.I.I.H./.Y.T././.T.T.Y.Y.I.",
+"H.H.I.I.I.I.Y.I.Y.H.I.I.I.I.I.I.I.I.Y.Y.Y.Y.Y.T.T.T./././.(.).(.).).)._._._._._._._.CXCXCXCXCX_._._._._._._._._._.SX_._._._.SX'._._.)._.(._._.W._.(.(.W.(.(.(.(.T./.(.T.T.W.T.T.T.T.W.T.W.(.W.(.W.(.(.(.W.).).Q.)._.)._._._.SXSXSXCX'.SXCXCXCXCX_.SX_.SX_.SXSX!.SX_._._._._._.'.CX_._._._._._._.`.`._.)._.).).W.(.`.(.(./.W././.(.T.T.(.T.T.T.T.Y.T.Y.T.Y.Y.I.I.I.Y.Y.I.Y.Y.Y.I.Y.I.H.I.H.I.I.H.Y.H.I.I.I.H.I.I.T.T.T.T.T.T.Y.Y.Y.",
+"H.I.H.I.I.Y.I.Y.Y.Y.I.I.I.I.Y.U.I.Y.Y.Y.Y.E.T.T.T.W.W././.(.(.(.)._.)._._._._._.CXCXCXCXCXCXCX_._._._._._.CXCX_._._._._._.SX'.CX_._._.(._.(.).).(.(.W.W.T.W.R.T.T.(./.T./.T.T.T.T./.T.W.(.W.W.`.W.W.).(.W.W.W.Q.).)._._._._._._.'.BXCXCXCXSXSXCXSX_.SX_.SXSX_.SX_.SX_.BXSXSX_._._._._.SX_._._._.)._._._.)._.).).(.(.(.T.W.W.`.`.T.(.(.T.T.T.W.T.T.Y.Y.Y.Y.Y.Y.Y.I.Y.I.Y.I.I.Y.Y.I.I.I.I.I.H.H.I.H.H.I.I.Y.H.I.H.Y.T.Y.T.Y.T.T.Y.I.",
+"I.H.I.I.I.T.T.I.Y.Y.Y.Y.I.Y.Y.I.I.I.Y.I.Y.T.Y.T.T.T.T.(.(.(.).).)._.`._._._._._.'.CXCXCX_._.'._._._._._._.CX_._._._._.'._._._._._._._._.W.).).W.(.T.).R.(.T.T././.R.W.W.T.T.T.T.T.T././.W.W.T.(./.W.W.(.(.(.Q.Q.).!._._._._.SX_.CXSX_.SXCXCXSXCXSX_._.SXBX_.SX_.SX_.SXSXBX_._._.'._._._._._._._.)._.(._._.`.).)._.).(.(.`.T.W.T.`.T.T.(.T.W.Y.T.T.T.T.Y.T.Y.Y.I.Y.I.Y.I.Y.Y.Y.I.I.I.I.H.I.H.I.H.I.H.I.I.I.I.I.I.Y.U.Y.T.T.Y.Y.Y.I.",
+"I.I.I.I.I.I.Y.Y.Y.Y.Y.I.Y.I.Y.I.Y.Y.Y.Y.Y.Y.T.T.T././.(.(./.).`.).).)._._._._._._._.'.CX_._.CX_._._._._._.'.'.CX'._._.SX_.CX_._._._.`.`.).W.W.W.W.(.R.T.(.(.(.(.T./.T.T.T.T.W.T.T.T.T././.T.W.T.W./.W.(.W.W.).Q.).`._._._._.SX_.SX_.SXSX'.CXCXSX_.SXSX_.SX_.SX!._.SXSX_._._._._._.CXCX_._._._._._._._._._.).)._._.(.(.`./.`.(.(.T.`.(.(.(.(.T.T.T.Y.T.Y.Y.Y.Y.I.I.Y.Y.I.Y.I.I.I.I.I.I.I.I.I.I.I.I.I.I.H.I.I.I.I.I.E.Y.Y.Y.Y.I.Y.Y."
+};
diff --git a/images/scenario5hilite.xpm b/images/scenario5hilite.xpm
new file mode 100644 (file)
index 0000000..7a0d4c6
--- /dev/null
@@ -0,0 +1,450 @@
+/* XPM */
+static char *scenario_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"209 188 256 2",
+"   c #302E1B",
+".  c #2A3728",
+"X  c #37362A",
+"o  c #3B3C3B",
+"O  c #373836",
+"+  c #2F2D2D",
+"@  c #171E18",
+"#  c #1C3D69",
+"$  c #193D74",
+"%  c #31324C",
+"&  c #233D6B",
+"*  c #263D67",
+"=  c #2B376E",
+"-  c #212458",
+";  c #0D550B",
+":  c #007C00",
+">  c #047907",
+",  c #0C6F0E",
+"<  c #2F5217",
+"1  c #36462A",
+"2  c #394538",
+"3  c #2E522D",
+"4  c #307417",
+"5  c #2F672E",
+"6  c #1A5F25",
+"7  c #1C426B",
+"8  c #1A4267",
+"9  c #1C4571",
+"0  c #1B5177",
+"q  c #3B4443",
+"w  c #314C4E",
+"e  c #22426B",
+"r  c #254268",
+"t  c #244573",
+"y  c #3C5C75",
+"u  c #3A5A79",
+"i  c #2D5678",
+"p  c #35637C",
+"a  c #215851",
+"s  c #48362A",
+"d  c #463A37",
+"f  c #553A36",
+"g  c #502F29",
+"h  c #6A3830",
+"j  c #59261A",
+"k  c #463C43",
+"l  c #4F3C4C",
+"z  c #533B60",
+"x  c #48492C",
+"c  c #474437",
+"v  c #57463A",
+"b  c #51522F",
+"n  c #4E6F2B",
+"m  c #674637",
+"M  c #764939",
+"N  c #6D5334",
+"B  c #706D33",
+"V  c #4C5A19",
+"C  c #464746",
+"Z  c #465747",
+"A  c #564745",
+"S  c #575755",
+"D  c #52514F",
+"F  c #505371",
+"G  c #4C6B4B",
+"H  c #4A6F71",
+"J  c #675648",
+"K  c #665955",
+"L  c #71524A",
+"P  c #716653",
+"I  c #6E6D6C",
+"U  c #6F5166",
+"Y  c #3036A2",
+"T  c #3A5886",
+"R  c #2E5887",
+"E  c #376487",
+"W  c #386993",
+"Q  c #387398",
+"!  c #3A78A5",
+"~  c #3745A9",
+"^  c #0F7EC3",
+"/  c #3B42D7",
+"(  c #425684",
+")  c #45558A",
+"_  c #425886",
+"`  c #42588A",
+"'  c #4A568A",
+"]  c #445991",
+"[  c #514F8D",
+"{  c #5454AE",
+"}  c #46789A",
+"|  c #576D9B",
+" . c #466B8C",
+".. c #467AA6",
+"X. c #5174A7",
+"o. c #6459B4",
+"O. c #716990",
+"+. c #7063A4",
+"@. c #5E6CD8",
+"#. c #5A61DB",
+"$. c #5C6ACA",
+"%. c #5D63ED",
+"&. c #5C63F2",
+"*. c #7368D4",
+"=. c #6365E6",
+"-. c #6164E9",
+";. c #6967E8",
+":. c #6466F3",
+">. c #7668E2",
+",. c #5958D0",
+"<. c #453A9C",
+"1. c #008200",
+"2. c #078207",
+"3. c #13850F",
+"4. c #359D24",
+"5. c #00DC00",
+"6. c #0BDB05",
+"7. c #15D90A",
+"8. c #00E300",
+"9. c #07E801",
+"0. c #0DE804",
+"q. c #27CD0B",
+"w. c #24D304",
+"e. c #25DA04",
+"r. c #27D10A",
+"t. c #30CC16",
+"y. c #2AD517",
+"u. c #4F8C2A",
+"i. c #55B529",
+"p. c #6C9033",
+"a. c #6EAF33",
+"s. c #408C1D",
+"d. c #519050",
+"f. c #6F8D71",
+"g. c #629B5E",
+"h. c #4DCB23",
+"j. c #49C722",
+"k. c #36995B",
+"l. c #3A86B2",
+"z. c #0E80C4",
+"x. c #1483C4",
+"c. c #1985C5",
+"v. c #1A87C7",
+"b. c #238BC9",
+"n. c #2A8ECA",
+"m. c #228BC6",
+"M. c #2C91CB",
+"N. c #2690C8",
+"B. c #3393CD",
+"V. c #3997CC",
+"C. c #3A99D0",
+"Z. c #308ECC",
+"A. c #39A2D1",
+"S. c #52839B",
+"D. c #4884AB",
+"F. c #498AB4",
+"G. c #5383A7",
+"H. c #5893B8",
+"J. c #528CB6",
+"K. c #738B90",
+"L. c #6397BA",
+"P. c #6C92A8",
+"I. c #76A7AC",
+"U. c #4997C6",
+"Y. c #449DD2",
+"T. c #489ED3",
+"R. c #569BC6",
+"E. c #5596CA",
+"W. c #4BA1D4",
+"Q. c #4BA4D8",
+"!. c #59A2CC",
+"~. c #53A5D6",
+"^. c #55A6D8",
+"/. c #56A8D6",
+"(. c #55A8D8",
+"). c #59A5D4",
+"_. c #5BAAD5",
+"`. c #5BAAD9",
+"'. c #5BA5D9",
+"]. c #58ADD7",
+"[. c #649AC2",
+"{. c #67A5CC",
+"}. c #62ADDB",
+"|. c #67AAD6",
+" X c #66B0DB",
+".X c #6AB2DC",
+"XX c #69B4D9",
+"oX c #72B5DD",
+"OX c #77B7DC",
+"+X c #74ABD0",
+"@X c #6BB5E0",
+"#X c #73B6E0",
+"$X c #75B9E1",
+"%X c #7BBBE2",
+"&X c #79B7E1",
+"*X c #67ACE0",
+"=X c #5CACE0",
+"-X c #7AC1E4",
+";X c #78C0DD",
+":X c #97302E",
+">X c #895137",
+",X c #8D6639",
+"<X c #AB6430",
+"1X c #8D554B",
+"2X c #8E6953",
+"3X c #8F716D",
+"4X c #AF6F54",
+"5X c #B0726C",
+"6X c #9A575C",
+"7X c #D3722D",
+"8X c #D47D5B",
+"9X c #C97756",
+"0X c #CD7C62",
+"qX c #C67A68",
+"wX c #D27B64",
+"eX c #DA7868",
+"rX c #C67875",
+"tX c #E37666",
+"yX c #CA2D1C",
+"uX c #926E8F",
+"iX c #8E6EB1",
+"pX c #AE758F",
+"aX c #9C6698",
+"sX c #856ACB",
+"dX c #C57F8B",
+"fX c #9D9B2F",
+"gX c #959748",
+"hX c #8E8777",
+"jX c #8DA246",
+"kX c #A4934C",
+"lX c #B38B54",
+"zX c #A2986D",
+"xX c #C4835C",
+"cX c #D88359",
+"vX c #D88165",
+"bX c #C88263",
+"nX c #E2945B",
+"mX c #D3C63B",
+"MX c #8D8E8D",
+"NX c #A1A59F",
+"BX c #85BAD8",
+"VX c #80BEE3",
+"CX c #86B9E4",
+"ZX c #BDBEC0",
+"AX c #90C4DB",
+"SX c #82C0E4",
+"DX c #8CC4E4",
+"FX c #97C8E5",
+"GX c #A9D3E8",
+"HX c #B6D9E8",
+"JX c #A9D0EA",
+"KX c #ACD0D8",
+"LX c #CC9491",
+"PX c #C8E4EF",
+"IX c #C8D9E2",
+"UX c #ABC7A5",
+/* pixels */
+"W.Q.W.W.Y.Y.Y.Y.Y.Y.V.Y.V.Y.Y.V.C.V.C.V.C.B.C.B.V.B.B.B.B.M.B.M.n.B.n.M.n.n.n.n.M.n.n.n.n.n.n.n.b.n.n.b.n.b.b.b.b.b.b.v.m.b.m.m.v.v.m.c.v.c.c.c.v.c.v.c.c.c.c.c.v.v.v.v.v.v.c.c.c.c.c.v.c.c.^ c.x.^ c.c.^ c.x.x.x.x.^ x.x.^ z.z.z.x.x.z.z.x.x.x.x.c.c.c.x.x.x.x.x.x.x.x.z.x.x.x.c.c.c.c.v.c.c.m.c.c.v.v.v.v.m.m.v.m.n.b.b.b.b.n.b.M.b.b.n.n.b.n.b.n.n.n.n.M.M.B.M.B.B.A.B.A.B.C.C.C.B.C.V.C.C.C.Y.C.Y.Y.C.C.Y.C.C.Y.Y.Y.Y.Y.W.W.Y.",
+"~.W.W.W.W.Y.Y.Y.C.Y.Y.C.C.C.C.A.V.C.C.C.V.B.B.V.B.C.B.B.B.M.M.n.M.n.n.n.n.M.n.n.n.n.n.n.n.b.n.b.b.b.b.n.b.n.b.b.b.m.v.m.v.v.v.m.v.m.m.c.c.c.c.c.c.c.v.v.c.c.c.v.c.c.v.v.v.v.c.c.c.c.c.c.x.c.c.c.x.c.^ c.c.^ x.^ x.^ z.z.^ ^ ^ ^ z.z.z.x.x.x.x.x.x.c.c.c.c.c.x.x.c.x.x.x.x.z.x.x.c.x.c.c.c.v.v.v.c.c.v.v.c.N.m.v.b.b.b.m.N.m.b.b.n.b.M.b.b.n.n.b.n.n.n.b.n.M.M.B.B.M.B.B.B.B.C.C.C.C.C.C.C.Y.Y.C.Y.Y.V.Y.Y.Y.Y.Y.Y.Y.C.Y.Y.Y.Y.Y.Y.",
+"W.Q.W.W.W.W.Y.Y.Y.Y.C.Y.C.C.C.V.C.C.C.V.C.C.C.V.B.C.B.B.B.M.B.n.n.M.n.n.n.n.n.n.M.M.n.n.n.n.n.b.b.b.n.b.n.b.b.v.b.v.m.v.m.m.v.m.c.m.c.c.c.c.c.c.c.c.c.v.c.c.c.c.c.c.c.v.c.v.v.c.c.c.c.c.c.c.c.c.x.c.^ c.x.x.x.x.^ ^ x.x.^ ^ ^ ^ z.z.x.z.x.x.x.x.c.x.c.c.c.c.x.x.x.x.x.^ x.x.x.c.x.x.c.c.v.c.c.v.m.m.c.c.m.v.v.m.v.m.b.b.b.m.b.n.n.b.n.n.n.b.n.b.n.M.n.n.n.M.M.M.B.B.B.B.B.C.C.C.C.V.C.C.C.Y.Y.V.C.V.Y.C.Y.C.Y.Y.Y.Y.C.Y.Y.Y.Y.Y.W.",
+"W.W.W.W.C.Y.Y.Y.Y.Y.C.A.Y.C.V.C.C.C.C.B.V.B.B.B.B.B.B.B.M.B.M.M.n.n.M.n.n.n.n.n.n.n.n.n.b.b.b.b.b.b.b.b.b.b.b.b.m.v.b.m.v.v.v.v.v.c.v.c.c.c.c.c.c.c.c.c.x.c.x.c.c.c.c.c.c.c.c.c.c.c.c.x.c.^ c.^ c.^ c.^ x.x.^ x.x.^ ^ ^ ^ z.z.^ z.z.x.x.x.x.c.x.c.m.c.c.x.x.c.c.x.x.x.x.z.x.x.x.x.m.c.c.c.v.v.v.c.c.c.N.v.m.m.m.m.m.b.v.b.b.N.b.b.n.b.n.b.n.b.n.n.b.M.M.M.M.M.M.B.B.B.B.B.B.B.C.V.V.C.C.C.C.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.W.Y.",
+"W.W.T.W.W.C.Y.Y.Y.V.C.C.C.C.C.C.C.C.B.C.B.V.B.B.B.B.B.M.B.M.M.n.n.M.n.n.n.n.n.n.n.n.n.n.n.m.m.b.m.b.b.b.v.b.b.v.m.v.v.v.v.v.v.v.c.v.v.c.v.v.c.c.c.c.x.c.c.c.x.c.^ v.c.c.v.c.c.c.c.c.c.x.c.x.x.c.x.x.z.x.x.x.^ z.^ z.^ z.z.^ ^ z.z.z.z.^ x.x.c.c.x.m.c.c.c.c.x.c.x.x.x.x.^ c.c.c.c.c.c.c.c.m.v.v.v.v.b.v.m.v.m.v.v.b.b.b.b.m.b.n.n.b.n.b.n.b.n.b.n.n.n.n.M.n.M.M.M.B.B.B.B.B.V.B.B.C.C.C.Y.C.Y.V.Y.C.Y.Y.Y.Y.Y.C.Y.Y.Y.Y.Y.Y.Y.Y.Y.",
+"W.W.T.A.Y.W.Y.Y.Y.C.Y.C.C.C.C.C.B.C.C.C.C.B.C.B.B.B.B.B.M.M.n.M.n.n.n.n.b.n.n.n.n.n.n.n.n.b.b.b.v.m.v.m.b.v.v.b.v.v.v.v.v.v.v.c.m.c.v.c.v.c.c.c.c.c.c.c.x.c.c.x.c.c.c.c.c.c.^ c.x.x.c.x.x.c.c.c.x.x.x.x.z.x.x.z.z.^ x.z.z.^ ^ z.^ ^ z.x.x.x.x.c.c.c.c.c.c.c.c.x.x.x.x.^ c.c.^ ^ x.c.c.x.c.c.v.m.b.b.v.v.m.m.b.N.b.n.b.b.b.b.b.b.n.b.b.n.b.n.n.b.n.n.M.M.n.M.n.M.M.B.B.B.B.B.B.V.V.C.C.C.C.Y.C.Y.Y.W.C.Y.Y.Y.Y.T.T.Y.T.Y.Y.Y.Y.Y.Y.",
+"W.W.W.W.W.C.Y.C.C.Y.Y.C.C.A.C.C.C.C.B.B.B.B.B.B.B.M.B.M.B.n.B.n.n.M.n.n.n.n.n.n.n.m.Z.n.n.n.m.b.m.b.m.v.v.b.b.v.v.m.c.v.v.v.c.v.v.v.c.c.c.c.c.c.c.c.x.x.c.c.x.c.v.c.v.^ c.^ x.c.c.x.c.c.c.x.c.^ x.c.x.x.x.x.^ z.z.z.z.z.^ ^ ^ ^ ^ z.x.z.x.x.x.x.c.m.c.c.c.x.x.x.c.x.x.x.x.c.c.c.x.x.c.m.c.v.v.v.v.m.b.b.v.N.m.b.b.v.b.m.b.m.M.b.b.n.b.b.n.n.n.n.b.n.n.n.M.M.M.B.B.B.B.B.B.B.B.V.B.C.C.C.C.C.C.C.A.Y.Y.C.Y.Y.Y.Y.T.Y.T.T.Y.Y.Y.Y.Y.",
+"W.W.W.Y.W.W.Y.W.Y.Y.C.C.C.C.C.C.C.B.C.B.B.B.B.B.B.B.M.B.M.B.M.n.M.M.M.n.M.n.n.M.n.M.M.n.b.b.b.m.m.m.v.v.b.v.v.v.v.c.v.v.v.v.v.v.v.c.c.c.c.c.c.c.x.x.c.x.x.x.x.x.^ c.c.c.c.c.c.x.x.c.x.x.x.c.x.c.x.x.z.x.x.^ ^ ^ z.z.z.z.z.z.z.z.x.z.x.x.x.x.x.c.c.x.c.c.c.x.m.c.c.x.x.c.c.^ c.^ m.x.c.c.c.N.v.v.b.v.v.v.b.v.b.v.b.b.m.b.b.N.m.b.b.b.n.b.b.n.n.n.n.n.n.n.n.n.M.n.M.B.M.M.B.B.B.V.V.B.V.C.C.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.T.Y.Y.Y.Y.Y.C.",
+"T.W.W.W.Y.Y.Y.C.Y.DXFXGXGXGXGXJXJXJXJXJXJXJXJXJXJXFXFXDXM.M.Z.M.M.M.n.n.M.n.b.M.M.n.n.M.n.b.b.b.m.^ b.m.v.b.v.v.v.c.c.c.v.v.v.v.v.v.v.x.v.v.v.x.x.x.x.x.x.x.x.x.v.c.c.c.x.x.x.c.c.x.c.x.x.c.c.x.x.x.x.x.x.z.^ z.z.z.z.x.z.z.z.^ z.z.x.z.x.x.x.v.c.c.x.c.c.c.x.c.v.x.x.x.v.x.v.c.^ m.^ m.v.v.v.b.m.b.v.b.b.m.v.b.b.b.m.b.b.m.b.b.b.b.b.b.n.n.n.n.n.n.b.M.M.M.M.M.B.B.M.M.!. XXXBXSXOXVXBXSXBXVXBXBXSX;XOXoX|.R.T.T.Y.T.T.T.Y.Y.Y.Y.",
+"W.W.W.W.Q.Y.Y.Y.DXFXGXHXHXPXPXPXPXPXPXPXPXPXPXPXHXHXJXFXVXM.M.M.M.M.B.M.M.n.n.M.M.n.M.n.n.b.b.b.m.m.m.m.m.v.c.v.m.c.l.c.v.v.c.c.c.v.v.v.c.c.v.c.c.c.x.c.x.c.x.c.^ v.x.x.x.x.x.c.x.x.x.v.c.x.c.x.x.x.^ x.^ x.x.z.x.z.x.z.z.z.z.^ x.x.z.x.z.x.x.v.x.c.m.x.c.c.c.c.v.v.v.v.c.v.v.^ v.^ m.^ v.v.m.b.v.m.v.b.v.m.n.m.b.b.m.m.m.m.N.m.b.b.b.M.b.b.n.n.n.n.M.M.b.B.n.n.M.M.M.~. XOXDXFXGXHXGXGXGXHXGXGXGXGXGXFXAXOX|.~.T.Y.W.T.Y.T.Y.Y.W.",
+"W.W.C.W.Q.W.Y.Y.DXJX9 7 r * * r * e & & # & & e t & r FXDXB.Z.M.M.M.M.B.n.M.M.B.n.M.M.N.b.b.b.v.b.b.v.v.v.^ v.v.v.v.z.z.v.z.^ v.x.v.v.x.x.v.x.x.c.c.x.x.x.c.x.x.x.x.x.x.x.x.x.^ c.x.z.x.v.z.v.z.x.x.x.^ z.z.z.z.z.^ z.z.z.z.z.z.z.z.z.x.x.x.z.x.x.x.x.x.c.x.x.x.^ v.v.^ ^ v.v.v.v.v.m.b.v.b.b.^ v.b.b.b.b.b.b.b.b.b.b.n.m.n.b.b.b.b.M.b.n.b.n.n.n.n.n.b.M.M.B.B.B.B.M.}.+X7 8 r r r # e e e & & e * r r # 7 OX}.T.Y.Y.Y.Y.Y.Y.Y.Y.",
+"W.Y.W.W.C.W.W.W.FXHXr 7 & r r # e e e e e 8 e e t $ e GXFXM.M.M.M.M.M.M.M.M.M.b.M.M.n.n.n.N.m.b.m.^ m.m.m.m.v.c.c.c.v.v.x.v.v.v.v.x.x.v.x.x.v.x.x.x.c.x.c.x.x.c.c.^ x.c.x.c.c.c.c.c.v.x.c.x.x.z.x.x.z.z.z.z.z.z.^ z.z.^ z.z.z.z.x.z.x.x.x.x.x.c.m.c.c.m.c.c.c.m.c.v.m.v.b.v.m.c.^ m.^ m.b.^ m.m.m.m.v.c.v.v.b.b.m.m.m.m.m.m.m.b.b.b.b.b.b.b.b.n.n.M.M.M.M.M.M.M.M.M.M. XSX7 r r & r & r & r e & r & e r e r AX|.T.W.Y.Y.T.Y.Y.T.W.",
+"W.W.Y.W.W.Y.W.C.JXPX8 & e e & & 7 e 7 & # t # 7 e & e JXDXM.B.Z.B.Z.Z.Z.Z.Z.Z.n.n.Z.n.n.b.b.b.b.b.b.v.v.v.v.c.c.x.x.z.x.x.x.^ x.x.c.c.c.x.v.v.c.v.x.v.x.x.x.c.c.v.v.^ c.x.c.^ c.c.c.c.c.v.v.x.v.x.x.^ x.^ x.z.^ ^ ^ ^ ^ ^ ^ z.^ z.x.x.x.x.x.c.x.c.c.c.c.c.c.c.c.v.v.v.v.v.b.b.b.b.m.m.v.b.b.v.b.m.m.m.b.^ Z.b.n.b.n.b.b.n.b.n.b.b.b.b.M.n.n.b.n.b.B.n.n.B.B.B.B.M.B.B.|.BX8 e e & & r e e e e e e 8 7 7 & r FXXXT.T.Y.T.Y.T.Y.Y.Y.",
+"W.W.W.Y.C.W.Y.W.JXPXr # e $ w F e r & 7 7 7 e e e * r FXFXM.M.M.M.M.M.M.M.B.M.M.M.n.b.b.N.N.b.v.v.v.v.b.c.c.c.c.x.z.v.v.x.x.v.z.x.x.x.x.x.v.x.x.x.c.x.x.x.x.x.z.^ v.^ c.x.x.c.c.x.x.x.x.x.x.x.x.z.z.^ z.^ z.^ ^ z.z.z.z.z.z.z.z.x.x.z.z.x.x.x.x.x.c.x.x.c.x.c.c.v.v.v.v.v.v.^ b.v.v.v.v.v.b.v.v.v.c.m.m.b.b.b.b.b.n.N.m.b.b.m.m.b.b.b.b.M.n.n.n.n.n.n.M.M.B.B.n.B.B.B.!.OX9 7 # e & r e e e r 7 9 % & t r t KXOXT.T.T.T.T.T.T.T.Y.",
+"W.W.W.W.W.Y.W.W.JXPX9 t 8 r PXPXPXPXPXPXPXPXPXHXHXHXGXDX-XM.M.M.M.M.M.M.M.M.M.n.M.M.M.n.n.m.n.b.m.m.^ ^ v.v.^ ^ v.c.x.z.x.^ ^ v.z.v.x.x.x.x.x.x.x.x.x.v.x.c.c.c.^ ^ ^ ^ x.v.c.c.v.c.x.c.v.x.v.x.x.^ ^ x.^ z.z.z.z.z.^ ^ ^ ^ ^ z.x.x.x.x.c.c.c.c.c.c.c.v.v.v.c.N.n.b.b.b.v.b.b.^ b.^ b.^ ^ n.m.v.m.m.v.m.b.b.n.b.n.b.n.N.n.n.b.n.b.b.b.b.b.b.M.n.B.n.b.B.n.B.B.M.B.B.B.W.|.OXAXGXGXHXGXHXJXKXHXPXPXPXt # e # GXOXT.T.T.T.T.T.T.T.Y.",
+"W.W.W.W.W.W.W.W.JXPX$ 9 8 r PXPXIXJXJXJXJXJXJXJXJXFXFXSXB.B.B.M.M.M.M.M.M.M.M.n.M.M.b.b.N.m.m.v.b.c.b.m.v.v.v.v.c.x.v.z.x.x.v.z.v.x.x.x.x.x.v.x.x.v.v.x.c.x.x.x.v.v.v.v.x.x.c.c.c.c.x.x.x.x.x.x.x.x.^ x.z.x.z.z.z.z.z.z.z.z.z.z.z.z.x.x.x.c.x.x.c.x.c.x.c.c.v.c.^ b.^ b.^ v.b.^ b.b.b.n.b.v.b.b.v.b.b.n.b.b.b.Z.b.n.n.n.n.n.n.n.M.M.b.M.n.b.n.n.n.n.B.B.B.B.B.B.B.V.M.B.R.|.|.+XOXOXOXOXOXBXBXAXHXPX* # e & KXOXY.T.T.T.T.T.T.T.Y.",
+"W.W.W.W.W.T.W.T.GXPXr & r t PXHXC.V.V.B.Z.Z.Z.! ! ~ T ] ] ` ] T ) T ] ] ` ` ) ` ` ` ` ` ) ] ` ] T ] ` ` ` ) ` ` T ) ` ) ` ` ` ` T ] ) ) ` ) ` ) T ) ) T ] ) ` ` ` ` ` ` T ) ) ` ) ` ` ) ` ) ) ) ) ) T ) ) ] ) T ] ) ` ` ) T ) ` _ ` ` ` ` ` ` ` _ ` ` ` ` ) T ] T ] ` ` ) ` ` ` ` ` ) ) ` ` ` ` ` ) T ] T ] ] T ] ` ] ` ] ) ] T W ~ ] ) ] ] ` ` ) ` ) ] ] ) ) ` ` ] ' ) ] ` ] ! l.F.C.V.C.Y.Y.Y.FXHXr e r 7 KXOXT.T.T.T.T.T.T.T.Y.",
+"~.W.~.W.~.W.W.T.JXPXr = t t PXGXY.C.A.V.U.] ) ) ] ] ) ` ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) [ ) ) ) ) ) ) ) ) ) ) ) ) ' ` ] ) ] ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ` ) ) ) ` ) ) ) ) ) ) ) T _ ` ' ` ) ` ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ' ) ) ) ) ) ) ` ) ) ) ) ) ' ] ) ) ) ) ) ) ) ) ) ) ` ] ] ) ' ) ) ) ) ) ) ) ) ) ) ) ) ) ) T ` ` ) ) ' ) [ ] V.C.U.T.V.BXHX8 7 r 7 KXOXC.T.T.T.T.T.T.T.T.",
+"~.W.W.~.T.W.~.T.JXPX8 t e 7 HXGXV.Y.V.l.W ] ) ) ` H F u y y u u y y u H u y y y y y u u y y y y u u y y y y y y u u y y u y u y u y y y y y u u y y E F u u y y u y y y y y u y y y y u y y y y u u y y u y y y u y y y u u y y y y y y y y y y y y y y y y u y y y y y u y y y y y y y y y y y u y y y u u y y y y y y u y y y y p y y y y u y y y y y u y y y u y y y u H u ` ' ) ] W Z.Y.V.V.OXKXr e # e GXOXT.T.T.T.T.T.T.T.Y.",
+"~.~.~.W.W.~.T.Q.GXHXr & e r PXGXC.Y.U.W T ) ) H k.y.e.e.e.w.e.e.e.e.w.e.e.e.w.e.w.e.e.e.e.w.e.e.e.e.e.e.w.e.e.w.e.e.e.e.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.w.e.e.w.e.e.e.e.e.w.e.e.w.e.e.e.w.e.e.w.e.w.e.e.w.e.e.w.e.e.w.e.e.e.w.e.e.e.w.e.w.e.w.e.e.e.e.e.w.e.e.e.e.w.e.w.e.e.e.w.e.e.e.e.w.e.w.e.e.e.w.e.e.w.e.e.e.w.e.e.e.e.w.e.e.e.e.e.e.w.e.e.w.e.e.e.e.e.e.e.y.4.k.` ) ] W F.C.V.$XKX7 7 r & KXOXT.T.T.T.T.T.T.T.W.",
+"~.~.W.~.W.~.T.T.GXPX7 t # e PXFXY.F.W ] [ [ k.t.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.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.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.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.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.t.d._ F R { F.U.XXKX9 e e & GX+XT.T.T.T.T.T.T.T.T.",
+"~.W.~.~.~.Q.~.~.GXPX& e 8 r PXJXY.W T ) [ k.y.e.e.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.e.e.e.e.w.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.e.e.e.e.w.e.e.e.w.e.e.e.e.e.e.w.e.e.e.w.e.e.e.e.e.e.e.w.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.w.e.e.e.e.e.e.e.w.e.e.e.w.e.e.e.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.k.H ) ) W Z.OXGX7 7 & * GXOXT.T.T.T.T.T.T.T.T.",
+"~.~.~.~.~.~.~.~.GXPX& t 7 r HXGXU.T ) ) d.y.e.e.w.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.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.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.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.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.w.k.' ' T ! +XKX7 e & r JX#XT.Y.T.T.T.T.T.T.T.",
+"~.'.W.~.~.~.W.W.GXPXe & $ t PXGXU.) ) | 4.y.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.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.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.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.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.e.e.e.t.H _ [ T oXGXe e t # FX@XY.T.T.T.T.T.T.T.Y.",
+"~.~.~.~.~.~.~.~.JXHXt t # t HXFX! [ ] d.q.e.e.e.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.w.e.w.e.e.e.e.e.e.e.e.e.e.e.e.7.7.e.r.e.e.e.e.e.e.e.0.e.e.7.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.e.w.w.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.w.w.e.e.w.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.e.e.e.e.e.e.e.i.T ) ] +XAXe r r r FX XY.Y.T.T.Y.T.T.T.W.",
+"'.~.~.~.~.~.~.~.FXHXt & e & JXAX| T T t.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.7XfX7XfX<XfXkXjXi.a.a.i.a.i.jXkXlXfXzXjXfXfXfXzXjXfXfXa.7XjXzXfXfXa.fXjXzXfXfXjXjXfXfXa.a.kXkXkXkXi.a.kXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXa.i.a.i.gXkXkXkXkXkXkXkXkXkXkXa.a.a.i.gXkXkXkXkXkXkXkXa.i.i.a.i.a.a.i.a.i.i.i.i.a.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.| ] ] L.AX8 r r r AXXXY.Y.Y.Y.T.T.T.T.W.",
+"~.~.~.^.~.^.~.Q.FXJX7 r # # JXBX] T u r.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.<Xb S J 1 ,XlX6.8.8.9.9.8.8.6.a.fX4XMXf.cX7X4XMX3X9XfXt.lXMXhX9XfXh.4XMXhXlX7XMXhX4XfX9.8.xXeXbXj.8.8.xXwX0X0X0X0X0X0X0XeX0X0X0X0X0X0X0X0X0X0XwX4XK P K K 3XlX5.8.8.7.kXwX0X0X0XqX0X0X0X0X0Xt.8.9.9.gXeX0XeXeXgXlXwXj.7.6.5.8.5.9.8.0.9.6.9.9.8.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.p ) ) H.+X8 8 7 7 +XW.Y.T.Y.T.T.T.T.T.W.",
+"'.^.'.^.^.~.^.~.DXFXJXKXJXJXFXoX] ] u 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.<Xf.3XP v 4XfX9.5.5.5.5.5.5.5.8.t.9XMX3X4X8XlXMX3X4X8XwX4XK.3X4X7X<XlXK.uX4X7XK.uX4XfXe.t.xXtXjX9.5.8.lXwX0X0X0X0X0XeXlXjXwXeXvX0X0X0X0X0X0XwXwX3X. 2 3 . 2X8Xy.7.gXwXvX0X0XeX0X0X0X0X0X0XwXlXy.8.a.tXqXwXgXa.8.a.eXwX0XlXy.5.5.0.a.0X0X0X0Xy.5.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ] ) F.R.XXOXOXXX!.Y.Y.T.Y.Y.T.T.T.Q.W.",
+"(./.`.(.'.^.^.^.~.CXFXFXAXFXOXT.) T T 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.lXhXMX3XD 7X8Xa.5.5.5.5.5.5.5.5.r.<Xv v <X7X<XN b 4X7X4XlXN b <XcX8XxXN v <X7XP b <XcXxX0X0XeXkX7.7.t.xX0X0X0X0X0X0XeXkX8.i.jXeX0X0X0X0X0X0X0XwX3X3  .g.2 2XvX0XbXwXwXwXeXwXgX9XwXqXeXtXeX0XeXlX5.t.0XeXeX7.8.8.a.eXwXeXjX5.5.a.0XwXwXwXwXkX6.5.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.H ] ) Q D.).!._.!.U.A.Y.T.Y.Y.C.W.W.W.W.",
+"`._.(.`.^.^.~.~.~.W.Q.W.W.W.~.W.] ) F 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.lX3XMXMXD 9X8XeXj.8.5.5.5.5.5.5.r.>Xm 7X<X4XcX<X,X9XlXgX8X9X1XN P K L N M B 1XL B L 4XvX0X0X0XwXbXbX0XwX0X0X0X0X0X0XeXgX8.8.8.i.wXwX0X0X0XwXwXcX2X3 V h . 2XwXwXwXvXwXgXjXi.8.j.bXwXgXa.a.0X0XeXj.0.t.jXa.5.7.7.jXeX0XwXj.7.a.eXwX0X0XqXeXt.8.5.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.p ] ] Q l.V.V.Y.Y.Y.W.Y.Y.Y.T.W.Y.W.W.W.",
+"`.`.'.`.(.^.^.~.~.W.W.~.W.W.W.W.` ` T 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.fX3X5X4XM 7X8XeXi.5.5.5.5.5.5.8.j.3XI C S 4XvX4XD 5Xa.9.fXeX4X5X4X4X5X4XK P u.p.5X4X5XvXwXeXwXeXeXeXeXeXwX0X0X0X0X0XeXgX9.5.5.8.lXwX0XwX4XK K P J x O d 2 b K P P 2XxX8.8.8.5.8.gXeX6.8.8.gXeX0XqXlX6.8.9.a.0XqXwX0X0X0X0XqXwX0X0X0X0XeXgX6.5.5.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.H T ' W l.B.U.W.C.C.W.W.Y.Y.Y.Y.Q.Y.W.W.",
+"`.`.'.'.(.^.^.~.~.~.~.~.Q.~.~.W.` T u e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.,X<X8X7X8X8X0XtXh.5.5.5.5.6.7.i.9XI A s 2 J L <XB 4Xt.6.5.gXtXbXjXjXjXgX2Xd.9.0.xXtXvXtXB s.4 s.4 s.4 s.2XwX0X0X0X0XeXlX7.7.5.5.i.wX0XwX3XO l + X 1 Z S 1 c f - + 2XxX8.5.5.5.5.j.a.5.5.jXeX0X0XeXa.a.0X0XeXwX0X0X0X0X0X0XwXwX0X0X0X0XeXt.5.5.7.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.H T ' R ! l.U.Y.W.C.W.Y.T.Y.T.T.Y.W.W.Y.",
+"`.}.`.`.`.(.(.).^.~.~.W.Q.~.T.R.` ) u 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.G v J 7X9XM 1XL 4.8.5.8.j.L P m 4Xf + >Xm I I c K i.8.5.5.5.a.j.9.8.8.7.P d.9.6.wXp.4 s.2.: : : : : : : gXwX0X0X0X0X0XwXxX0XkX7.7.lXwXeX2Xk 5X[ % 2 f.I 3 c 5X[ % 6XlX6.5.5.5.5.5.8.5.a.tX0X0X0X0Xt.jXeXwX0X0X0X0X0X0X0XeXqXwX0X0X0XeXgX6.0.a.vXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.w.H ` ' E l.l.l.Y.Y.Y.Y.Y.W.W.W.Y.Y.W.W.~.",
+"`.`.`.`.'.(.(.(.~.~.~.W.~.T.~.W.` ` F 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.2 MXI A 4XJ bX3Xu.0.6.j.4XU I q <XMXI A s S S s k p.8.5.5.5.6.xXa.8.5.7.L p.0.t.eX4 > : : : : : : : : : 3.2XeX0X0X0X0X0X0XwXwXxXbXeXvXtX2XZ I 2Xd q d.d.O D I 2Xd P xX6.5.5.5.5.5.5.5.j.qXeX0X0X0XbXwXeX0X0X0X0X0X0X0XeXkXlXwXqX0X0XeXy.j.bX0XwXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ) _ Q x.l.A.W.Y.Y.Y.W.Y.A.W.W.W.W.W.T.",
+"`.`.`.`.'.(.^.(.~.~.~.~.Q.~.W.W.` ` y 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.c S C d 1X1XbX1XJ lX0XeX9XS S v v K D d s 1X6X>Xf qXi.8.5.6.j.tXa.8.5.7.P 5XxXqXtXs.: 1.: : 1.: : : : : 2.gX8X9XvXvXvX0XvXvXwX8X0X1XL 1XL c f f J q O 2 2 b q k q 2XjX8.5.5.6.6.7.7.6.0.gXeX0X0XqXeXeXkXlX0X0X0X0XwXeXgX8.a.eXeXeXtXkX8.i.tXbXbXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.p ` ` E l.l.Y.Y.Y.Y.Y.Y.Q.A.W.T.Q.C.Q.W.",
+"}.`.`.`.(.(.^.^.~.~.~.~.~.W.~.W.) ) u 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.Z +   <X9XO N >XJ x 2XA 4Xd O @ 2 r I H l N L A f 4Xj.8.7.2Xh 1Xp.9.5.7.K n 2XgXgX, : : > > > : : : 2.> 2.< L 3XJ M v m J v N J f 3 , , , 6 5 b 1Xb 6 v 1 s d C o P 8.5.8.a.vXxXlXqXxXxX0X0X0X0XwXgXa.8.jXeX0X0X0XeXgX6.8.a.tXkXjXa.7.5.i.eXnXnXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.H ` ` W l.l.Y.Y.Y.Y.W.Y.Y.W.W.T.Y.T.T.T.",
+"`.}.`.`.'.(.^.^.~.~.~.~.Q.~.~.T.' ` u e.e.e.e.e.7.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.2 MXS J <XI I P c G I G >XI I q C { mXMX- S I q d u.9.9.t.1Xp.B L i.5.e.K 5 MXUXg.3.2.: : > 1.: : 1.2.> : 6 ZXNX  d I 2Xd 6 4.H O 5 3.> 1.> 2.3.b b g.1Xc g 6XiX% P y.0.7.kXeXwXeXwX0X0X0X0X0X0X0Xt.9.8.t.9XwXwXeXgX6.5.8.a.tXy.9.5.8.8.i.eXeXqXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.p _ _ E l.l.A.W.Y.A.Y.Y.Y.Y.T.Y.Y.T.T.T.",
+"`.`.`.`.`.`.(.^.~.~.^.~.~.Q.~.T.` ` u 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.Z I D O < v hXC 2 a g.n <XK S v C Y Y Y l D S A g p.0.t.vX1XV M l p.7.t.P G MXUXp., 2.> : : : : > 1.: : 2.3 MXS + d Z v + 6 , P f 6 , > : > : 1.6 2 g.f.3 j :XuX% P cXxXxXvXvXeXeXvXeXvXvXeXeXeXeXeXlX6.8.jXeXwXgX6.5.5.8.t.jX7.6.6.0.0.a.tXeXeXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ` ` R l.l.U.Y.Y.Y.Y.Y.Y.Y.Y.T.T.Y.T.T.",
+"`.`.`.`.^.'.(.^.~.~.Q.~.~.W.~.T.` ` y 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.P X g s 3 X g   C X   s L d j s c 2 2 2 v s s X A 2XP P 2XL L K b P P P S 5 lXhXJ 1.: 1.> : : : n V 3 < 4 5 n G 1 d O O x x O X f 5 2.> : : : 1.< d 2 2 2 x s C % 2XvXeXlXn u.n s.n s.n n s.n s.s.B vXt.a.eXwX0X7.5.5.i.qX8.t.qXxXlXbXxXqXeXkXlXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ) ` E l.c.A.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.T.T.T.",
+"`.`.`.^.^.^.^.^.~.~.~.~.~.~.~.W.` ` u 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.b c v X s f d 2X4Xf h h k . J 1 c d K S k . J x A J f g w O v f c O c O c . < . 3 < 3   3 6 5 G v X C U b MXUXzXn O A A c 2 d v f n 2.2.: : : 1.4 d A A c 1 6 o 2 L >X1X< : : : : : : : 1.: : : : 4 vXbXwXqXwXwXt.0.8.jXtXt.jXeXeXtXlX4XtXkX7.a.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ) ` Q l.l.l.W.Y.Y.Y.Y.C.Y.T.T.T.T.T.W.",
+").(.(.).'.^.'.(.^.^.^.~.~.~.~.T.` ` u w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.x I K + f LX1X  4X<XmX6X2 G f.G . 2XNXC C G f.G 2 L p.,Xk b h.gXd = pXO.2 D F I d z o.1Xd D ZXMXg D ZXMX3 uXUXi.n h 6XI k +   M c 6 2.3.> 2.> : 6 f 1XI C 2 g.1Xc K N jX1 1.: : : : : : : : : : : 4 wXwX0X0X0X0X0XlXxXwXeXwXqXeXlXjX6.t.jXa.lXeXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ) T W ! V.U.Y.W.Y.W.Y.Y.Y.Y.T.T.T.Q.W.",
+"(.'.(.^.~.~./.~.^.'.~.~.Q.Q.W.W.) _ u 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.x K S d M LX1Xm 9X,XmX1X% Z d.G % M LXL O q d.G C L V m k b jX,Xd % [ Y o 2 G 3 O = <.[ O D NXZ   J NXD 6 hXzXP V f 3Xx O d L N c 5 > , > > > : 5 g 2Xv O 2 g.f.3 L b N < 2.: : > 1.: > : : : : 2.s.vXbXwXwX0X0XwXeXeXeXlXlXeXkX6.8.5.8.j.eXeX0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ) ` E l.l.V.Y.W.C.C.Y.Q.T.Y.T.T.W.T.W.",
+"(.(.'./.(.~.'.(.'.(.^.~.~.Q.~.T.` ) u 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.d + + @ @ g   L U c d % b 1 . 2 b c o k b 1 . O b K L L b d d 2 b o - % b 2 . . b 2 % % x 2 O O d < ; , , > : : 3 d C C x x o O A 5 : : 1.1.: : 4 d k C c x 2 2 3 N L L b 5 5 w 5 5 3 6 n n 3 3 3 b 1X1XL 1XqXwX0XkXgXjX0.a.eXy.8.5.5.5.t.gXjXqXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.w.H T ` W l.l.U.Y.Y.Y.W.T.T.Y.T.W.W.W.W.W.",
+"(.).~./.'.(.(.).^.(.^.~.Q.W.~.T.' ) u 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.x P K.+ U LX6X; Z X S 2 x d A d c 1 Z 1 3 :X<X>Xb . D 2 c c v x v Z O.f.D d v v c O . + c g k k f 6 1.1.1.s.u.4 V A A J P 2 v 1 % 2 3 ; < 6 6 G 2 s C g s b c A c c  .3X[ C k g f C C U D f l j g Z 6 , X   L wX0Xr.8.8.9.p.tXt.6.6.5.5.5.8.8.t.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ) T R ! V.U.W.Y.T.W.T.T.T.W.W.W.W.W.W.",
+"(.^.~.'.~.(.(.(.~.~.~.~.Q.~.T.T.` ` u 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.x J 5XO m pX1X, 2 G K.5 O U LX6XO G f.G + yXmX1Xk Z f.G O b h.4Xk { kXzXY V h.gXd D S I % j 5X{ X P p.s.: p.h.u.4 4 , x A 3 a.3.O w S.y   m NXZXs % o.6Xd d i.jXv ( O.mX[ % { 6Xg q NXZXd s { 6Xf w : g.>Xg m 0XvX9.j.lXxXqX0X9XlXlX7.5.5.5.5.5.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ) ` W l.l.V.T.T.Y.T.T.W.W.W.W.W.W.Q.T.",
+"'.(.~./.'.(.(.'.'.~.~.~.Q.Q.~.T.` ` u 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.c ; ; ; ; ; ; : 2 G g.G O A pX1X2 Z g.G k yX<XyXA Z g.G O b a.2Xd W ~ Y = x fX2Xk 2 G 2 o j 4XuX+ p.h.u.: 4 s.4 : : 1.< A 3 G u.O 3 q.p + f MXI   % Y [ C s p.gXf F ~ { Y % <.] C 2 MXI X g Y { l 5 ; g.K.< L wX0Xt.jXtXwXqX0XwXeXtXt.5.5.5.5.j.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H T ` E c.l.U.W.Y.W.W.W.W.Y.W.W.W.W.W.~.",
+"/.'.~.'.^.(.^.'.~.~.^.~.T.~.T.T.` ` u 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.c 5 5 5 5 5 5 5 b 1 1 . b 2 d d S 2 2 . A C x b b 1 3 . b c d k b w a w b s l c x 1 . 3 x x d c f n u., : : : > > s.u.B C q X c x x 3 w k d s O d d + + O d g d d q 3 w 2 o + + o D o c 2 o % - c b w 2 2 2 L vXeXbXvXvX0XxX0XwXlXjX7.5.5.5.8.i.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.7.w.H ) ` p l.l.Y.Y.W.T.W.W.W.W.W.W.~.Q.Q.W.",
+"^.(.~.(.'.(.^.^.~.'.^.'.Q.T.~.T.` ` u 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.v 5 4 5 5 m l d x H I O.A d A d 6 6 5 5 6 o v A c d A c c O D 2 x x A v b v f f c d A k c d C c f 6 : 2.: s.p.4 : p.h.P D k k % o c O + d d k j g k g v O o o j g o 1 + d f :X<Xm C O O o d c c 1 b 6 d C o v M 1XM P I LXuX0XwXy.8.5.5.5.5.9.i.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.w.H ) T E l.V.U.Y.Y.W.W.W.W.W.~.W.~.~.W.W.",
+"^.~.(.(.(.(.).(.~.~.'.~.Q.Q.T.T.) ) F 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.b > : : 2.N jXm C [ mXhX= n a.,X: 1.> 1.: n h.,Xk b h.2Xc n f.G 2 A pX5Xd L B B d b h.4Xd % MXuXd 6 : > : u.h.u.: 4 u.b C z o.{ O C z L g d o.1Xd O   N f % o.6Xs 3 4.H 3 :X7XzXM 2 I I b s I NXD 5 ; :XiX% g u.a.h F | mXO.qXwXj.8.5.5.5.5.5.i.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H T ` E l.l.T.W.T.W.W.W.W.^.W.^.^.^.W.^.",
+").(././.).(.(.^.^.'.^.~.~.W.~.T.) ) u w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.b > : : > N n h D Y ~ Y = b jX,X> 1.: : : V p.m k b jX,XC w g.G 2 A pX6Xc L B N l x a.2Xc * { Y s 6 1.1.: s.u.3.1.1.1.6 A % / Y % d v F s O ~ [ q d L N v % ~ [ k 3 3.G c :XyXyX:Xw C J g s <.<.- 5 ; :XNXC j p.jXM r Y { Y wXwX5XlX7.5.5.5.9.i.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.H T ) E l.l.V.W.W.W.W.W.W.W.~.W.^.^.W.^.",
+"'.'./.(.(.).'./.^.~.~.!.Q.~.T.~.` T u 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.b > : : 2.N L M C 2 w w c s f s < 5 < V < s >XM C d g d c X X   c d g s o J >X>XC s g s d + + % g x < 3 < 5 < < 5 < < x A O O d d O g s d v - % x c q d x c % - c x X O c b b b b x o O O o % - c b 3 g l d C d A x c a a w 2XwXeXlX7.5.5.5.5.t.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ` _ E l.l.A.W.W.W.W.T.^.~.^.^.^.W.~.~.",
+"(.(.(.).(.(.(.~.~.~.Q.~.Q.T.T.T.) ) u 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.b > : > < f g X x f     +   f s f + + + A . v X o d f g c d f f d g d o 2 . x   2 O k g % . < g O d k j g s 3 d d c A A o O < X O O < x d P H uXF x v 3 O N v v c c c 3 1 c o c c x A f s d O O 2 b 5 A f c C . + o c d v s K 8XwXy.5.5.5.5.5.8.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ` ` E l.l.A.W.W.Q.Q.~.T.~.^.^.^.^.^.W.",
+"`.(.`.`.(.`.(./.~.~.~.Q.T.~.T.W.` ` u 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.c : > : b jXm V a.1Xc K S @ s N s Z S S o G f.G 2 v p.,XC V h.4Xd j 5X<.o 5 g.h l - [ :Xd 5 g.:X  l o.>Xg c UXMX. C K.NXC C UXNX. 2 UXNX. ( hXmX) 3 d.3.. J p.B v 3 H g.2 o   m v c p.gXM d Z I C 3 4 N gXf C C I C o 3XdXM S wXeXt.8.5.5.5.5.5.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.H ` _ E l.l.U.R.W.Q.~.Q.~.~.Q.^.~.~.~.~.",
+"(.`.`.'.'.).~.~.~.~.Q.R.Q.T.W.T.` ` u 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.N < 5 B >XV M x u.h q G O g J N X Z G 2 o w g.G c L n m A b p.2XX j 4XaXO G UXG w j :XC o G UXd.s % { ' X C MXd.3 k D S C C MXd.6 D MXd.< [ Y ~ Y < n p.1 m n jXf 2 n L 3 d J N s D V B g d w G O Z 4 N n h c Z G . o 6XpXm S 0XvX4Xy.5.5.5.8.5.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ` ` W l.U.U.W.W.Q.Q.~.^.~.~.~.^.~.Q.~.",
+"`.`.'.(.(.(.~.~.~.W.~.W.T.T.T.T.] ) y e.e.e.7.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.N l g M ,Xb n n n 4 ; ; ; ; v + m O 1 . Z 2 3 O D P 1XL v P f c o s f l x 1 w 3 c s + O b 1 2 3 d k % % d 2 2 . x c + k c x . . 2 c + . X Z a w w s . 1 O J v v v 1 O g 1 c q o c N L L J O . 1 1 5 n L P J C . . 2 D d c c J wXeXeXlX7.5.i.lXlXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H T ` W l.l.T.T.W.~.~.Q.^.^.^.^.^.~.^.^.",
+"`.(.(.(.(.(.~.~.Q.~.T.T.Q.Q.Q.T.] _ u e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.V jXN x u.2.1.1.1.1.1.1.1.1.b s >Xl 5 5 v f d 3 6 , 6 6 b o C o d % k j x d v f x c A k c d C + c 2 q 3 O d C % c 1 5 2 1 L O.{ o.{ o.{ { { { o.{ o.o.{ o.{ { O.2Xd C D c x d q c 2 l f o O c A d b 3 % g f P P v l f d A A 6XlXqXtXlX6.j.wXwXwXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ` ` W ! U.U.~.~.Q.~.~.~.~.Q.^.~.~.~.~.",
+"(.(.(.'.'.~.~.~.W.W.Q.T.Q.T.T.T.] ) y 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.N n m m 3 < 5 < < 5 < < 5 < J v p.B , 1.b gXN b G p.> : 3 D pXI   = +.:Xo A pX4Xk l pX5Xo m pX= O - { H x l o.[ O C UXMX< +.sXO.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.sXO.2 2XhXO g 1Xo.% A B p.h s   m h 5 ; { 6Xh y.u.p.fXh u.a.>XlX7.i.gXr.j.eXeXeXwXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ` ) W l.l.T.W.W./.~.~.~.~.~.^.~.~.~.^.",
+").`.`.).^.~.~.Q.W.~.W.T.T.T.~.T.) ` u 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.4X3X4Xf   + X A A . C A X g h >XV m , : h V N uX:.sXP > 2 = o.Y s % { F d A pX5Xd l pX4XO S 3X2Xd - c k.s l / ~ % C MXd.< { K.9.0.0.0.0.0.0.0.0.0.0.0.0.9.9.9.K.o.c h 1Xv g :XLX= L b B h g J N v a , <.{ J cX2Xn B j u.n >Xt.5.5.5.8.t.lXkXkXkXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.H ` ` E l.F.W.~.W.~.~.~.~.(.~.~.~.~.~.~.",
+"`.'.(.(.~.~.~.~.~.W.W.W.Q.T.~.T.) ) u 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.*.:.+.D S Z S ZXI Z ZXI = +.:X< n 2XI G 2X5X3XiX:.:.>.n Z % - % 2 O - % x c k d x x k d x C Z d c d X < X o % % c c O . 2 o.K.9.i.s.s.s.s.s.s.s.u.4.s.s.u.u.9.K.o.c x v C C g l x N L L v 2 2 o o b 3 - - d 5X9X6X9X1X1X4X2X6.5.5.5.5.5.8.8.9.8.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| ` _ W l.V.W.!.Q.~.Q.~.~.~./.~./.~.~.~.",
+"`.(.(.(.~.~.Q.~.W.W.W.R.T.T.W.W.) ) u 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.;.:.+.b G . P NX. S NX1 - { D n G iX;.;.;.=.:.-.-.:.*.K o b O P A w I O.D 1 2 3 x d v O x M :X>Xb C C + O s v c c c Z Z C { K.9.s., > > > > : > > : : : : s.0.K.o.C l + o c % g s x 2 q O o C s s b 5 3 D C A L >X>XvXeXlXy.8.8.5.5.5.5.8.8.9.0.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.| ' _ W l.F.U.W.Q.~.~.~.(./.^.(.~././.^.",
+"`.`.(.'./.~.~.Q.~.T.T.R.Q.Q.W.T.` ` u 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.'.;.*.A D D U K D U U m @ D U sX;.%.=.=.%.=.=.=.=.-.;.6Xb i.; <X,X[ kXmX<.6 f.d.k 5 d., O :XmX<Xf w K.r   f pX5Xd C O.NXc { K.0.s.: : : : 1.1.1.: : : : : s.9.K.,.O S.y + g { 1Xg 3 t.I x s { 1Xg w , hXZXA 2 ~ 1Xh eXeXt.9.j.lX7.5.t.lXlXkXy.5.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| ' _ W l.U.W.W.].(.~.(.^.).(.(.(.'.).~.",
+"`.`.(.(.~.~.~.Q.Q.~.Q.E.T.T.~.T.) ` u e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.;.-.;.:.;.;.;.;.=.:.sXp.*.;.%.=.=.=.=.=.=.=.=.=.=.-.sX4 g.5 1X>X~ ~ ~ = 6 K b o 6 p.s.q yXyXyXm 6 t.Q g h pX5Xc C S P d o.K.0.s.: : 1.; < < , 1.1.: : : 4.9.f.o.1 q.k.k s ~ +.k 2 2.G m s <.{ C 5 ; MXMX1 % <.{ L 4XqXlX0.i.kX7.8.a.tXwXeXlXy.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.| ` _ W D.l.!./.W.(.W./.(.'.(.'.(.(.(.'.",
+"`.'.).(./.~.^.~.W.T.T.W.Q.T.~.T.` ` F 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.@.;.;.-.;.-.=.=.=.=.=.-.:.%.=.=.=.=.=.=.=.=.=.=.=.=.=.*.X   @ A m w 8 a q 1 j j c X X s O b c x c 1 < o d d l d x O . 2 s { K.0.s.: : 1.< B ,X< 1.: : > : s.0.K.o.2 6 q d d - % % C + O o O % - o b 3 q 2 1 b - % A t.jXtXt.9.t.lXkXqXwX0X0XeXlXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.| ` ) W D.F.W.~.~.(.(.(.'.).(.(.(.(.(.^.",
+"`.(.(./.~.~.~.~.~.~.~.W.Q.Q.T.~.` ` u 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.@.;.-.=.;.-.=.=.=.=.=.=.%.=.=.=.=.=.=.=.=.=.=.=.=.=.:.*.U o.F h 2Xf f + O O N P d d f d d X N >Xm O d j s d 2 S c B O.{ | ,.MX0.s.> : : n b B < 1.4 u.s.s.u.8.K.,.d k g s c 2 D D C C g s o c s X b 5 O D Z x d O A B N 1XN d.i.wXwX0X0XwXqXeXeXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| ` _ E l.U.W.!.~.~.].(.(.(.(.).`.`.(.~.",
+"`.).^.~.(.~.~.~.Q.~.Q.R.Q.T.~.T.] ` u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.;.5XF / Y 1XtXP I q O K NXC Z f 5XI . S I J L * +.:Xs C NXNXO O.sXMXP.MXa.8.u.> : : 5 L L 5 : u.e.0.0.0.fXiXO.q { 1Xj x MXZXs g { 1Xj s { 6Xg q > hXZXZ 2 S 3Xb O S I x L 7.a.eX0X0X0X4XlXlXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| ` _ W l.U.~.~.~.~.^.(.`.(.(.(.`.`.'.(.",
+"`.(.'.'.~.~.~.~.~.Q.~.~.~.~.~.~.] ` u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.=.qX8XD U L 4X8XM MXD + L LX2Xc l >X1Xo c zXI 2 % { [ s A NXI . { K.6.0.0.0.e.u.: : : 5 J L 5 1.s.9.i.hXK.iXaXP q ~ +.s f NXK.  f ~ [ l g <.{ C 5 ; MXMX. % D P c % D K c K y.a.tX0X0XeXj.9.9.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ) _ W D.U.W.~.~.^.(.(.(.`.`.`.`.`.`.`.",
+"`.(.^.(.^.~.~.^.Q.^.~.~.Q.~.~.~.) ` y 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.*.pXjX9.t.nXcX8X1X>X>XA o f k c x d s q o l o x % - % x c C 2 o o.P.9.4.s.s.s.4 : : : 6 2X2X5 1.s.9.hX*.{ +.P J l - % d d d O 1 d - % d d - % o Z 6 % q 2 b O + O c O . + B 2X2X4X0XwXxX7.8.5.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| ) ` W D.U.R.~.~./.(.`.(.(.`.`.`.`.`.(.",
+"`.(.(.^.^.^.~.~.~.Q.~.~.T.~.T.~.] ) y 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.%.-.-.-.;.iXxXgXlXrXrXrXdXrXeX3XP 2X2XN P 2XP 2XA C O x c c N N O C d 3 | K.9.s.s.s.4.s.s.s.s.G 1XL G u.4.9.K.o.1 X C A g s j g k + j s o s s d c C s f D 3 O d s x 3 q 1 N d A c x % O f 0X0Xt.5.8.t.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| ) T W D.U.R.~.~.(.)./.`.`.`.`.`.`.`.'.",
+"`.`.`.(.^.~.~.~.~.W.~.~.~.Q.~.~.) ` u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.=.pX5X5XMXrXiX5XrXeXiX%.=.=.=.=.=.sXwXvX6X[ [ [ 6XvXP I l + S MXv M C I D ; E K.9.9.0.0.9.0.9.0.e.P ,X1XP e.9.9.K.o.1 MXZXd s { 1Xj s { 1Xf 3 4.G X g { 1Xj 2 6 { 6Xg 5 k.>Xs A B a.>Xq ) 6Xh qXeXt.5.8.j.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.| ) _ Q D.U.W.~.).(.(.(.(.`.`.`.`.`.`.`.",
+"`.(.`.`./.'./.~.~.~.~.~.Q.~.~.W.) ) u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.*.wXwXi.t.tXaX&.=.=.%.=.%.=.%.%.-.;.5XvX<.z O.- 6XtXL zXS O F I o   C I J ; p sXK.K.K.K.K.K.K.K.K.I S K I K.K.MXsX+.C NXI   v ~ +.v s { | C 5 3.P m s ~ +.C x , <.o.w 3 zXMX3 c n jXh % Y { S 9XxX7.5.5.5.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.| ) `  .D.U.!.).~.^.(.`.`.`.`.`.`.`.`.`.",
+"`.`.`.(.'.~.'.~.~.~.W.~.Q.~.~.Q.) ` u w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.sXa.9.7.xXpX&.=.=.-.;.pX5XpXiX&.%.*.8XF K 3X% uXcX1X1X>Xv o O d v s s X 3 2XO.o.{ o.o.{ o.{ o.,.F D F ' $.] W p B q C 2 X O - - o % % - % x . . s O % - O c 5 - - O 1 3 Z < J J A L A l z M eXt.6.5.5.5.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| ] _ W D.U.R.~.(.(.(._.'.`._.'._.}.`.`.",
+"`.`.`.'.~.'.~.~.~.~.~.~.Q.~.~.~.] ) u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.sXa.9.8.t.wXsX&.=.-.*.cXxXxXwXiX:.;.aX{ I K % aXcXcX0XvX2XO q q L f s >X,Xc s c c C O 1 b 2 . 3 x v O + c 5 5 4.a C 2 D C o 2 A D D c 3 1 b H I F X 2 o d 2 3 C g g c O + o x d k o P eXtXeXlX7.5.5.5.8.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| ' _ Q D.U.W.).`.(.`.`.`._.`._.`._.`.`.",
+"`.`.`.`.).(././.).~.(.~.~.~.~.~.] ) u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.>.5XgXgXkXwX0XiX%.-.>.gX8.y.lXpX&.%.%./ ~ / ~ o.bXuX*.vXP C I C O S K.m N g pX5Xd 2 MXI + Z I 5 2 3 MXI @ F MXmX[ 2 MXUXf s MXUXC 3 H d.3 F O.mXF g S 2Xx 3 ; { 1Xj q q K C d s.a.m K 9XlXt.8.5.5.8.y.kXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.r.| ) _  .D.U.R.).).`.`.`.`._.`.`.`._.`.`.",
+"`.`.`.'.`.`.(.(.~.~.~.~.~.~.~.Q.] ) u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.sXrXrXrXqXiX%.-.sXa.8.5.r.aX&.%.=.;.-.;.:.%.&.%.pXcXU Z I J O S I o s m pX5Xf 3 NXK.1 S MXn 2 6 NXMXO [ { | Y C NXK.  f NXhX+ 3 G K < [ { | <.x F P f < ; ~ o.C q S H . k p.jXM K t.9.8.5.5.5.8.a.tXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| ) _ Q D.U.!.(.(.`.`.`.`.`.`.`.`._.}.`.",
+"`.}._.`.(.`.).(.'.~.^.~.~.~.~.~.] ` u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.=.;.*.=.=.%.=.*.a.9.9.7.0XiX&.=.=.=.=.=.=.:.pXkXy.2Xo + X l C d d f g f f o d x V O o c 1 X d f x x S 8 # w c C q O d C q 1 c 1 j X A 8 9 r s O + X x < - - o c 1 . 1 c f A O K lXkXfX7.5.5.t.bXvXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ) _ W D.U.R.(.`.(.`.`.`.`.`.`.`.`.}.}.",
+"`.}.'.`.`.`.`.`.(.^.^.'.(.^.^.~.] ) u w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.=.=.=.=.=.=.=.%.=.=.=.=.=.=.=.=.=.=.=.=.=.-.-.-.-.=.=.=.%.>.5XjXgXkXcXaX%.=.=.=.=.=.=.;.4XB i.P w F O.Z 5 5 Z P f d X o O x s O O < 1 d o < s d A 2 A b x 3 o O o d k c x o C Z x c x d 2 c c o 2 V <X>Xv x 3 C 1 b d f k J 1X6X6Xy.8.8.a.vXvXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ) _ Q D.R.W.).(.(.`.`.`.'.`.}.`.}.`.}.",
+"_.}._._.`.`.`.`.`.`.(.'.(.(.^.~.] ` u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.=.=.=.=.=.-.-.sXrXeXaX%.=.=.=.=.=.=.%.;.s., ; 1 ( zXmX0 1.2.6 w D I l + D 3XC O q NXMX. 2 I.zX  x MXUXk 2 g.UX  g 3X5Xf q f.ZXk . p.3.  g 3X5Xh 3 < 7XmXh 2 4.M g % u.a.M O n a.h q.6.8.j.wX0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.| ` T W D.U.R.(./.^.(.`._.`.`.`._._.}.`.",
+"`.`.'.}.`.`.`.`.`.`.`.`.(.(.^./.] T F w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.=.;.&.=.=.=.=.=.=.=.;.pXs.b >XB = { o.a 1.> 2.5 C zXI O o zXP O D NXf.6 l ZXg.< m NXK.. D NXK.4 g aXdXm q NXMX+ 3 d.p.3 g uXdXM 6 < yX<X:X3 I.MX3 d p.jXL % p.a.M q.8.5.8.a.eXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ) _ Q D.R.W.)./.(.(.(.`.`.`.`.}.`.`.}.",
+"`.`.`.}.`._.`.}.`.`.`.`.`.(.^.(.] ` y 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.qXs.V n B . a a , 2., > 5 l A f A f d g O k     X d + . X d c d O 2 X + X s h f d o c 2 2 O < b X d h f g c 4 b h N x 3 G 3 v d m d x d L 1XkXjX7.8.i.eXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ) T  .D.U.!.(.).).(.`._.`.`.`.`.`.`.`.",
+"_.}.}.`.`.`.`.'.`.`.`.`.(.`.(./.' _ u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.;.=.*.H S 6X6X4 : 2.> > 2.3.5 C o q J s m N v 2 K I F d d   d d g X d o s s d v X X X o s s X % g g d c s X X A A c k O x d d c x 2 C 2 b c d A eXeXy.t.lXwXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.| ' _ Q D.R.~.).).(.(.(.).`.`.`._._.}.}.",
+"`.`. X`.}._._.`.`.`.`.`.`.(.(./.] ) u 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.[.;.;.%.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.:.{ ,.>.I n 3.: 1.> : 5 D 2XJ   A I K N F MXmX) O | w + 1 d.2.+ 1 d.3.+ 3 H d.3 d 6X<.+ d 6X5Xl 3 y d.3 m c 6X<.+ k >XMXd O G I 3 % >XhXd 0XwXkX5XwX0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ' _ Q D.U.W.(.).(.`.(._./.(.`._.`.}.}.",
+"`.`. X`.=X`.`.`.`.}.`.`._.`.`.).` ) F 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.>.;.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.&.&.&.=.=.=.=.=.:.{ ,.-.=.sXI 4 ; ; 4 b A zXK   b 3X3X2 ( { | Y < 4.k.% 3 d.p.2 3 d.u.1 3 G P 3 D 3X3XC 2 aXLXm 2 G P 3 m C 3X3XA % >X1XA O f.g.Z d M 1X1X9XwXwXwX0X0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ) T  .F.R.!.'.(.'.(.).(.`./.(.'.`.}.}.",
+"}.`.`.`.`.`.`.`.`.`.`._._.(.`._.W _ u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.aXpXiX&.&.&.=.=.:.~ ,.=.-.%.>.J s.G x P O c d g s A q O Z 7 $ w 1 6 a o 1 1 c . c 1 c 1 x 1 j 1 C S v d c f A d 2 < j 1 c q 5 < 1 c < V . q ; 6 ; q < x V 9X0XwXwX0X0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.w.| ` _  .D.U.!.'.'.`.`.`.(.`./.`.`.`.}.}.",
+"}.}.`.}. X`.}.`.`.`.}.`.`.`./._.] T F e.7.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.*.0XcXxXuXpXiX&.#.%.{ ,.-.;.=.&.F jXgX; 5 D v A J J o m B c C d x x J P N x o A B c o d c c C C c x o C x b 2 o x b k k o C Z , , 5 G , , 6 Z , 6 6 Z 1.1.4 j.i.wXwX0X0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.| ` _ Q F.U.R.(.`.`.`.`.(.`.`.(._._.}.}.",
+"`.}.`.`.}.`.}.`.`.}.}.`.`.`.`._.` ` u 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.@.=.=.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.=.eXkX0.0.t.cXiX&.:.{ ,.;.@.-.:.<.3X6XL N c % . k D I m ,Xq I A + D I v ,XC I J 1Xq 2XL + C S S O k 1XhXO k 6X5Xv o 4X<.@ v D d c d d k k K K A 2X1Xc ; ; 5 gX6.a.eX0X0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.| ) _  .F.R.R._.`.`.`.`.`.`.`.`.`. X}.}.",
+"}.}.}.}.}.}.].`.}.`.}.`.}.`.`._.] ' u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.*.wXa.8.8.0.bXwXuXuX[ { ' { :.-.$.2X4X4XP w O.w + S MXq o C hXI + C 3X3Xq D MXk 2 c zX3X@ D I I d c M 1Xv o aXdXm C 3X3Xk v 2 2X2X@ I S @ K 4XS J B C ,XnX:X9X7.i.eX0X0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ) _ W F.U.~._.`.`.`.`.`.`._.`.`.}.`.}.",
+"`.}.}.=X}.`.}.}.}.}.`.}.`.`.`._.] _ y 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.>.gX8.5.a.B 1X4XL d o o [ ;.=.:.o.F S P K 3 t.H O q + s x + h N m O X S + %     + C d C O C O O 2 c f h d c f J d c D A d c C 3X3X@ 3XhXO J 1XP hXD 2 lXmX6Xt.9.i.tX8X0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ) _  .D.U.!._.`.`.`.`.}.}.=X}.`.}.}.}.",
+"}. X}.}.=X}.}.}.=X}.`.}.`.`.`._.] _ u e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.=.%.;.5XjXkXtX:X<XP k j <X2X[ :.=.=.-.&.>.rX2Xa a t u S S K P D J J ,X% LXZ Z d 6X= + J P L P S c L N x q v B x q 2 2 b 2 d o c % X K @ X f   K 2Xf A   x b N v P a.lXbXcX8Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.w.| ) _ Q F.R.R.'.`.`.}.`. X}.}.}. X`. X}.",
+"}.}.}.}.}.}.}.`._.`.`.}.`.`.}._.] ` u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.=.sXrX8X>XLXLXw A LXLXO.;.:.=.=.=.%.;.[ { :.=.:.{ O.*.bX2X3XhXo c LXI C D 3X3X% 3XwX8XvX2XK N ,X% I v ,XC I D + d 6X5Xm v d hXI o K S + P J S F I x c c 2XL L 4XMXlX7Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ` _  .F.U.!.'.`.}.`.}.`.}.=X}.}.}.}.}.",
+" X X X X}.}.}.}.}. X}.`.`.`.`._.` ) u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.*.*.L 1X1Xb 2 N J 1XO.#.-.=.=.%.:.' O.:.=.;.:.:.%.>.U L L v J >X1XA L P L [ :.*.pXvX1X2XMXq D MXA o c 3X3XO % uXdXN m o LXMXX I hXd 8X5X| mXO.% I C <X4XP hXNX3X9Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ) _ Q D.U.!.`.}.`.}.`..X X}. X}. X}. X",
+" X}.}.}._. X`.}._.}._._.`.`.`.`.] ) u e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.-.%.*.*.*.3XD C o N N { :.=.;.=.:.[ [ -.;.=.=.-.=.%.=.*.5XvXqXqXqXwXwX5X*.&.-.%.=.>.U L L c 2 % D q C C J O d v J s d 2 h 1Xh M 1XM vXpX{ K.Y q MXS d 2XJ 2XI K 9Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| _ _  .F.R.!.`.`.`.*X.X`..X X X X}. X}.",
+" X}.}.}. X_.`.}.}._.}._.}.}.`.`.` ' y 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.=.%.%.%.sXP D I N >X{ %.=.-.:.:.O.o.:.:.;.:.,.,.-.-.-.=.*.*.*.*.*.*.;.%.%.-.-.-.=.;.*.pX<Xy | mX[ C % 2 c x q o o c K K 4X5X4X5X5X4X2X$ $ 9 c @   g 4XL <X,X<X7Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| ' _ } D.R.).}. X`.*X*X X*X X}.`. X X X",
+"_. X_.}.}.}.}.}.`.}.`.`.}.(.'.}.] ` u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.;.K S MXO O { ,.,.{ [ O.S H { ~ { { F #.;.%.-.-.&.=.%.=.-.%.=.=.=.=.=.=.;.=.%.;.O.[ | f.Y c I S + C I D g 1XJ C B J Z 2 C 2 C 2 c 2 o <XxX1X4XN kXNXlX7Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.P.' _ Q D.!.!.|.}.}.}.}.}.}.}..X X X}. X",
+" X_.`.}.}. X}.}.}.`.}.`.}._._._.` ' u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.>.P O X s d ) { ~ l 5X6Xd 6 , g.f.@ 3XsX%.;.-.-.-.=.=.=.=.=.=.=.=.%.%.=.;.=.=.=.%.,.Y Y i c 3X3X+ 2 3X3XA 9XO K J ,XO Z I 3 C S S O O lXmX1X4XP hXMXhX7Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.| ' _  .D.!.!.}.}.}..X.X.X.X.X.X}.}..X X",
+"`. X}.`. X`. X`.}.`. X`.}.`.`.}.] ` H 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.@.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.=.3XJ F F S o.:.:.[ pXrXf 5 G ZXf.6 4XcXiX&.:.&.%.:.=.=.-.=.-.-.%.iXiX=.=.=.=.=.=.=.-.*.3XO v v O q A v v 2Xd 2XhXC o f.f.5 C I K c C M <X1X4XN 2XH L 9Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.| ' _ } D.R.!.|.}.}..X.X}..X}..X}..X}. X",
+"}.}.`.}.`.}.`. X`.}.`.`.}.`.`._.` ` p 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.*.*.=.:.' | -.:.z b b 2 B N 2 ; 3 3XvXbXpXaXpXiX*.&.&.&.:.:.&.iXcXnXiX:.:.:.=.;.-.-.&.uXL S D P S c N J C X l S O o 3 5 1 v % O d K wX9XeX5XL 7X,X<X7Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| _ _  .J.R._.}..X}.}..X.X X X.X.X X X.X",
+"`.}.}.`.}.}.].}.}.`.}.`.}.`.`._.] ` H w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.-.-.-.;.[ | :.:.p , , 5 3 n n , 5 2X4X5X4X4X9X9X2X3XpXuXO.[ uX4X4X4X4XuX[ { ,.;.%.=.=.@.*.3XP tX1XK N ,XL k q % b b o v N b 2 C C S 4X4X4X5XB 4XNXkX7Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.p ) _ } D.!.!.XX X X X.X*XXX X X}.*XXX}.",
+" X`.`.}.`.}.`.`.`.}.`.}.}.]. X_.] _ u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.:.F { :.:.F d k S K C C q x J D 2 C q 3X1XI m 9X1XP l h 1XS D A N G d.w :.=.=.=.-.:.O.I rX4X2XK.K 4Xd S S O C I C <X2 Z I 3 O q I 3 4XL hXNX3XcXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ' ` } F.!.|.XX XXX X}.@X.X.X@X.X}.XX*X",
+"`.=X}.`.}.`. X`.}.`.=X`.`.}.`.}.] ) u w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.:.' { &.;.J d., 1X6X3 H G 3 2X1XS D O 2X2XMXc o c hXI O C I K d 1 H P y :.;.=.=.;.:.{ F :.3Xm P m 4Xc I K d q MXD % 2 f.f.5 O f.g.n 1XN 2XH P 7Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ' _  .H.!.{. X X X X}..X@X X}.*X*X XXX",
+" X`._.}.`.}.`.}.`. X`.`.`.=X=X_.] _ u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.-.*.I O.sXaXB d.s.1X2X3 H G 3 2X2XI S O P v O s O o J m d C q 2 d 1 V j w :.:.;.;.=.-.o.F &.;.pX9XwX4XO o o O C O s X k < 5 . d < 3 x 5XP <X,X<XnXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.p ' _ } G.R.{..X X.XXX.X.X X@X@X}.XX*X*X",
+"=X`.}.`.}.`.`.}.`.}._.`._.=X}._.` ) u e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.[.;.=.=.=.=.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.&.&.iX8X2X2X5X9Xb 3 x N 2X3 s j 1 2XL q c d K P P K P D o C c x O 2 x x % 2 J uX/ { ,.=.:.o.F -.%.=.pX8X0X1Xm L A 2 v v c c m f C v v m J 6XK cXcXvX0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.p _ _ } H.!.|.|. X XXX.X X@X X X.X.X}.XX",
+" X X`. X`. X_.}._.}.'._.`.}.`._.) _ u 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.@.:.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.iXpX8X4XJ % c D C o 2 S b x v J N b S o % Z P 4X4X4XvX1X1XI O d 6X= + 3 G G 3 C P C - :.;.o. .-.=.=.=.pX8XwX0XwX4XC C C C o c q D K % C C K P 8X8X0X0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.H _ _  .G.R.|. X.X.X.X X.X@X*X@X X*X.X}.",
+"}._.}.`.`.}.`. X`.}.`.]._.`.`._.] _ F 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.=.0X8XvXh + K C O d 7X4X>X2Xq K L B 3X1XP M + C S D m vX1X>X2Xc C 5XuX% < H I 5 k 3X3XD :.:.o.F :.=.=.%.=.pX8XwXvX2XJ 2X% o L 5Xh K 2X5 I 1 9X0X0X0X0X0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.p ) ) } H.R.|. X X.XXX.X.X*X.X}.*X.X}.*X",
+"}. X}.}.}.}.`.`.`.`.`.`.`.`.`._.] ) u 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.@.;.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.&.aX0X0X8X8XI I S O A mXcX>XP Z 3XI O 4X6XzXP @ D I S h 4Xm g M s Z K m d 2 V j 1 k A A g O.#.o.F -.=.=.=.%.aX8X8XeX<X4XLXL + aXLXL J ,Xf.f.n 9XwX0X0X0XwXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.H ) ( } G.R.|..XXX*XXX X.X X X X.X*X}..X",
+"}._.}.}.`.}.`. X`.`.`.`._.`.}._.) _ u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.aXcX0X0X0XvXL c d c s ,XM 1XP O J v + 2XL N c O c d x m L L v s x f J 2 Z Z Z w Z b Z o 1X3X= o.F -.=.=.=.%.=.pXvXwX4XL 2XA C f L s L 1X3 5 d 0X0X0X0XwXi.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.p ) ` } F.!.{..X X XXX*X X*XXX.X}..X@X.X",
+"}. X}.}. X`.`.`.`.`.`._._.=X=X_.] _ u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.%.aXbX0X0X0X0XwXM X c o O s s m v 2 v J k v f h N m d g g v 5XwX>X1X- + 5 : : 4 5 > 2.2., C >X2X1X3XF -.=.=.=.=.&.pXcXqXwX0X0X4XD K J S b K J A P 0XwX0X0XwXjXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.H ) _ } P.{.|..X.X.X*XXX XXX*X.X}.}..X X",
+"}.}.}.}.`.}.}.`.`.`.`.`.`.`.`._.] ) u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.;.;.bXvX0X0X0X0XvXK P v + 3 P G N 2Xt MXmXR 2X1XS B ,Xq K Z m vXvX2X3XuXd < , , 3 5 > > , 6 d x h m 1XK >.%.=.=.=.%.aXcX8X9X4X4X2XJ 4X0X4XK 9X4X,X4X0X0X0X0X0XwXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| _ _ } G.!.{..X.X.X*X.X.X*X.X X X.X}..X",
+" X X X}. X X`.`.`.`.`.`.`.`.}._.] _ p 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.*.bX8X0X0X0X0X1XbXS @ G K.d.N L [ | O.Y 4X2X3X3X% D I S 1XvX0X1XS J g . 3.h + 5 4 h N d 5 4 h N x P uX:.=.=.=.%.@.*.pX2XJ 1X+ q 2XI q P ,Xw I 2 9X0XwX0X0X0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ` ( } H.{.|..X.X.X.X X}..X X.X X.X.X.X",
+" X X}.}. X`.`.`.}.`.`.}.].`.`.].] _ y 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.@.=.=.=.=.=.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.*.0X0X0X0XvXh f m d C n b 1X2Xr R Y 8 2XL J A O C C o L 9X2XC o w C 2 UX2XC 6 4 B p.f 5 4 N p.f w 4 uX+.:.-.-.-.%.>.3X3XhX@ d LXMXA S ,Xf.f.G 9X0X0X0X0X0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.| ) T } P.{.{.XXXX.X X.X.X.X X X.X.X.X.X",
+" X X X}.}. X X`.`.}.`.`.`.`.`._.] _ F w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.;.@.qX8XwX0XwXL G M P 1X,X<X8X3Xc b 1 c P D 2 % D A 2 A J K K 1 G n 1 . u.G < w 5 >X>XA w n M >XL 5 > , s.iX&.;.=.=.:.[ M L O q m L d K 1X3 5 1 0X0X0XwXwXeXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ) _ } H.{.XXoX X.X.X.X X.X*X.X}. X.X X",
+" X}. X X}._. X`.`.`.`.`._.`.`._.] ` u 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.@.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.*.*.iXwX8X3XK.o 2 D I N 8X2Xj :XP >XvXL S Z L 1XI m 9X0XeXB H I b A g g o c v h N d o x f v P Z C c C P uX:.=.=.;.;.*.5X4XK D A D K J o 2 L 0X0X0XwXa.a.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.q.| ) _ } H.{.|.XX.X@X.X.X X X}..X.X.X X.X",
+" X X X X X}._. X}.`.`.`._.`.`._.] T u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.&.-.qXcXL v f s S MX% N 1Xc LXLX3XvX2XI D >X3XK.2 L cX8XB V h c 1 3.h . S o B M d c n ,Xg < ; n ,Xf 5 4 >.&.&.=.=.-.=.pX8X8XwX0XwX4XK C 7XvX0XwXwXa.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.w.| ) ` } P.{.{.oX.X#X.X.X.X@X@X.X X X@X@X",
+"}..X}. X}. X}.}.}.`.`.`.`.`.`._.] _ u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.@.qXcXqX9X0X2Xo 2 s L 2Xs 1X2X1XvX1XC v 1X2Xc f >XwX0X0X9X0X2Xq UX2X; , A s.p.f C i.jXM 5 ; i.jXL 5 s.uX+.+.=.=.=.&.aXcX0XcX0XvX4XMXD c 9X0X0X0XeXjXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ` _ } H.{.+XoX@X@X.X.X.X.X.X.X.X.X.X.X",
+".X X X}. X}.}.`.`.`.`.`.].`.`._.] _ u w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.sX0XrXqXwXP D D A K S 2XqX4X0XvX0X9X9X0X9X9XqX0X0X0X0XwXwX3X3 d.G ; a K M M A c N L s 3 ; N N c 5 , : 1.s.>.%.=.=.;.pX8XxX0XbX4Xv f m 0X0X0X0X0XeXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ) _ | H.{.XXOX#X#X#X.X@X.X.X.X.X.X@X@X",
+"}..X}..X`. X`.}.`.`.`.`._.`.`._.] ` F 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.%.*.iXrXcXP 1X2X4X9XqX0XvXwX0X0X0XwXqX0XvX0X0X0X0X0X0X0XwX6XS A C C 2 Z S A C 2 % 2 b Z 5 4 N 6 5 : : : 4 uX%.=.=.%.=.pXcX8X8XcX9X9X9X0X0X0XwX0X0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| ' _ } P.{.+X#X#X#X@XoX.X.X.X.X.X.X.X.X",
+".X}. X}. X`.}. X}.`.`.`._.`.`._.] T u 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.@.=.=.=.=.=.=.=.%.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.;.5X0XvX2XC K o M vX0XbX0X0X0X0X0X0X0XvX0X0X0X0X0X0X0X0X8X8X2Xo L 6Xf 2 . 2 + 1X= @ 4 D C A D 5 : , : : s.>.%.=.=.=.*.*.iX*.*.sX*.pX8X8X0X8X9X0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| ) ` } H.{.XX&X$X#X#XoX&XoX#X#XXX.X@X@X",
+"}.*X}.}.*X`.}.`._._.`.`._.`.`._.] _ u 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.[.;.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.=.qX0XwXU q MXK >XvXbXvXvXbX0XwXvXvXwXeXwXwXcXwXwX0X0X0X0XvX2Xc pXdXm C S f.O 5XO.v B o B M l 5 n h >X< 4 uX-.&.=.=.%.%.&.%.%.%.&.=.*.sXsX*.pX8Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.| ] _ | L.+XXXOX#X$X$X#X#X#XoXoXXX#XoX.X",
+"}..X}. X}.}.`.`.`.`.`.`.`.}.].`.] _ u 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.@.;.=.=.=.=.=.=.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.-.;.qX8XcX2XO P m M qX5X9X5X9XqXlX4X4X4XlXlX5XxX4XlX9X0X0XvXvX5X% L U f d . 6 + S L < 5 l u.a.m J ,XN p.x 2.4 aXo.-.;.=.=.%.=.=.=.=.=.=.=.%.=.*.*.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ` _ } P.+X+X%X$X$X$X#XoX#X#X#XoX#X.X@X",
+" X}.*X`.`.}.}.`.`.(.`.`.`.`._._.] ` F e.7.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.:.;.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.*.cXcX2Xq % c D K S K K K 6 , , : > , , 5 5 , , n vXqX4X4XP C O o c b Z C Z c c Z Z L M M f 5 4 M M N ,Xh N M ;.&.=.=.=.=.=.=.=.=.=.%.=.=.=.%.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.| ` ` } L.{.OX%X%X$X$X%X$X$X$XoX#X#XoX#X",
+"}. X}.}. X`.`.`.`.`.`.`._.`.`._.] _ u e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.;.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.%.=.=.=.=.=.=.=.=.=.%.=.=.=.=.=.=.=.=.=.=.=.%.*.iXwXj @ @ M wXqX9X0X2XX n ,X; 4 h N s d B m M nX1XG K 2 3 Z n 2 5 : : : : : : , D D D S Z D S D D L N a.M uX+.%.&.%.%.%.%.&.%.%.&.-.%.=.=.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ) ` | L.{.OX%X%X%X%X%X$X%X%X%X$XoX#X#X",
+"}.}.}.}.`.}.`.`.`.`.`.(._.`.`.}.] _ u 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.;.=.=.=.=.=.=.=.=.&.-.rX9Xg @ >XvX0XvXwX2Xc h.jX< n B p.d c i.p.>XvX,Xf.f.2 3 H f.2 5 : : : : : 1.4 M M g 5 2.4 h M g J M 1XN , 4 pXiXiXiXiXiXiXiXiXiXiX-.=.@.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.| ' _ S.P.+XOX;XOXSX%X%X%X%X%X&X&X&X$X#X",
+"}.`.`.`.}.`.`.`.`._.`.}.`.`.=X].' _ y 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.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.@.rXf M 0X9XqX0X0XwX3XO N M N ,Xm M A L m M N 4Xm 5 5 2 3 V j 1 Z 2.: : : : : 4 N a.l Z , 4 N a.f Z P 0XlX9XxXcXvX8X8XwX8XwX0X8XcXvXaX-.%.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.H ' T S.L.+X+XBX;X%X%XVXOX%X%X%X%X%XOX$X",
+"}.`.}. X`.'.`.`._.'.(._.`._.`._.' ` y e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.:.%.rX9X0X0X0X0X0X0X0X2XD D Z Z S D S D D J D D S Z C % c Z C q C 3 1.: : : : : 4 M M v Z Z J N N V > : > 4 eX0X0X0XbXeXeXeX0X0X0X0XbXcXpX*.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.p ' _ } P.+XOXSXOXSX%X%XVXVX%X%X%X%X%X%X",
+"`.`.`.`.`._.}.}._.oXOXVXSXOXoX`.] ' u e.e.w.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.@.=.@.%.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.&.iXvX0X0X0X0X0X0X0X0X9XqXwXB 1.n h m < ; M h < 2.; L M < 2.; N M < 1.: : : : 1.1.3.3.> : > > > 3.2.1.: : s.wX0X0X0X0Xa.j.t.gXeX0X0X0XbXcXnXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.H ) _ S.H.[.XXXX}._.SXSXVXVX%X-X%X%XOX$X",
+"`.`.`.`.}.`._.`.XXSXAXFXFXDX;X+X` ' F 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.@.;.;.%.=.=.=.=.=.=.=.=.=.=.=.=.=.;.=.=.=.=.=.=.-.=.=.=.=.=.=.=.=.=.=.=.;.-.=.=.=.=.=.=.=.=.=.=.-.&.iXbXbX0X0X0X0X0X0X0XcXbX0XeXG 3.n B p.< 4 n p.< 2.5 B p.< 1.4 b p.< 1.: : 1.: : : 1.: : : : : : : : : : : 4 vX0X0X0XvX6.8.9.i.eX0X0X0X0X0X0Xe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.w.p ' _ S.P.+XOXCXOXXX).SXSX-XVX%XVX%X%X%X",
+" X`._._._._._.}.OXAX7 e 8 r AX+XW ] T y.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.$.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.;.+.xXxXxXxXxXxXxXxXxXxXxXxXxXvXp.1.n N >X< n >XN n 3.n N >X4 3.n 1XM V 2.1.2.1.1.2.1.2.1.2.1.1.1.1.2.2.1.1.1.s.xXxXxXxXbXa.j.j.gXbXxXxXxXxXxXxXe.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.q.H ] ` S.BXt & r 7 BX|.SXDXSXVXSXVX-X%X%X",
+"`.`.}._.`._._.'.SXGXr & 8 e GXSX..[ ` 4.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.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.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.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.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.j.] T F P.AXt r & e FXoXSXOXVXVXVXOXOXSX%X",
+"`.`.`.`._.`._.`.DXGXe r r e GXCXE.] ] k.t.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.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.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.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.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.w.k.] ] F I.AXr r & 8 GXOXSXVXSXVXVXSX-X%X%X",
+"`.`.`.`.`.`.`.`.FXHX& r r e HXDXE.) ) ] i.7.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.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.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.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.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.4.} ` ] ' I.KX# & & r GX;XSXBXSXVXVX%X%XOX-X",
+"`.}.'.`.`.`.`.}.DXHX& * 8 & HXAX'.W [ T  .4.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.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.e.e.e.e.e.e.e.e.w.e.w.e.e.e.e.e.e.e.e.7.w.e.e.e.e.w.e.e.e.e.e.w.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.w.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.e.e.e.e.e.e.e.e.e.e.e.e.e.e.t.H ] ] F  .I.KX& e e r GXBXDX-XSXVXVXVXSXVXVX",
+"`.`.`.`.`.`.`.`.DXHXe t r e HXFX|.E.] )  .H j.e.e.e.e.e.w.e.e.e.e.w.e.w.e.e.e.w.w.e.w.w.e.e.e.w.e.e.e.e.e.e.w.w.e.e.e.w.e.e.e.e.e.e.w.w.e.e.e.e.w.e.e.e.e.e.w.e.e.e.e.e.e.w.e.e.e.e.w.w.e.e.w.e.e.w.e.e.e.e.e.w.w.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.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.e.e.e.e.e.e.e.w.e.e.e.e.y.k.] T ] E | I.ZX& 7 e r GXSXSXSXSX%XVX%XVXVXVX",
+"`.`.`.`.`.`.`.`.DXHXe r 7 & HXDX'.'.J.W T ) p k.q.e.e.e.e.e.e.w.e.e.e.e.e.e.e.e.e.e.e.q.e.e.e.e.e.e.e.e.e.e.e.q.e.e.e.e.e.e.e.e.e.e.e.q.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.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.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.e.e.e.e.e.e.e.e.e.e.e.e.e.r.4.H ] ] ` F H S.BXKXe 9 & & HXBXSXSXVXVXVXVX%X%X%X",
+"`.`.`.`.`.`.'.`.DXHXe & 7 7 HXDX(.^.{.F.T ) ' | d.t.q.q.q.q.q.q.q.q.q.q.q.q.q.t.q.q.t.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.r.q.q.q.q.t.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.t.q.t.q.q.t.q.q.q.q.q.q.t.q.t.q.r.r.r.r.r.r.q.r.r.r.r.r.r.r.r.r.r.r.r.r.q.r.r.r.q.q.q.r.q.q.q.q.q.q.r.r.q.q.q.q.q.r.q.r.r.r.r.r.q.r.q.q.q.q.r.q.q.q.w.r.r.r.q.q.q.q.q.q.q.q.r.r.q.q.r.t.t.d.| _ ] T _ F } P.NXKX7 9 7 r HX;XSXSXVXVXVXVX%XSXSX",
+"`.`.`.`.'.`.'.(.DXHXe & e r HXAXQ.(.(.R.X.) ' ) ] T _ ) ( ) ( ) ) ) [ ( ' _ ) ) ( ) ( ( ) ' _ _ ' _ ) ) ' ) ) ) ) ) ) ( _ _ ) ) ( ) ( ) ' ) ) ( ' _ ) ' ' ) ) ) ) ' ) ) ) ) ) ' ) ) _ ) _ ) ) _ ' ' ) ) ` ) T ) ` ) T ` _ ` ` _ T ` ` ` ` T ` ` _ T _ ) ` _ ] T ) T _ ) ' _ ) ) _ ) ( ) T T T F T ` T T T _ T _ T T T T F T _ T T T T ` T _ T T _ ` _ _ _ _ ` ` _ T ` ` ` ` ) _ ' ] ` F T  .S.I.BXHX8 7 r 8 HXAXSX-XVXSXVXVXVXVX%X",
+"`.`.`.}.`.(.(.(.DXHX& r & t HXFX(.(.Q.^.U.] ] T ] ) ) ) ' ' ) ) ) ( [ ( ) ) ) ) ) ) ) ( ) ) ` ` ) ( ) ) ) ) ) ) ) ) ( ) ) ) ) ) ) ) ( ) ( ) _ ) ) ) ) ) ) ) ) ) ) ) _ ) _ ) ) ) ( ) ) ( ) ) _ _ ) ) ) ) ` _ ) T ` ` T ) ) ) ) _ ` ` ) ) ) ) ` ) ) ) ) _ ) ) ) T ) ) _ _ ) T ) ` ` _ ) ) ) ) ` ] ) ) ) ) ' ) ' ) ' ' ' ) ] ' ) ) ' ' ) ) ) ' ' ' ) ) ) ) ) ) ] ] ) ) ) ) ) ) ' ' ' F E _  .S.P.+XAXKXt # r e KXDXSXSXVXVXSXSXVXVXSX",
+"`.`.`.`.'.(.(.(.DXHX& & t & PXKX~.~.^.~.'.E.R.D.! W ) T T T ( ( T u T T T T T F ) u ( ( T ( u p ( T ( ( ( T F T ( ( ( ( ( u ( ( u ( ( ( ( ( T u F T T T ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( T u _ _ u ( ( ( T F F T F T T T F ( T F T T T F T F F T T T u ( ( F T ( ( ( F T _ _ ( ( T ( ( ( _ T ( ( ( _ ( _ T ` ( ( ( _ T _ ` _ ( ( ( ( ( T _ _ ( ( T ( T T T F _ T ( _ _ T u u u E H | S.L.I.+XFXPXr r & & HXAXSXSXSXSXSX%XSX%X%X",
+"`.`.`.`.'.'.(.(.DXHXe & 8 8 PXIXKXAXDXAXDXDXAXBXBXI.P.S.E p E p i i i i i i i p i p i p p i i i i p i p i p p i i u i p i p p p p p p p p i p p p 0 p p p p p p p p y p i p p i p i p p p p p p p p p p p p p E E p E p p E p p p p E p E p p E E p p p E p E p p E p E p p  .p p u  .p p H _  . .H E H T  .H _  .p y  . .p  .u p  .H T p  .H  .y p H  .H  .H p  .H H  . .| K.K.I.MXNXI.BXBXZXFXIXPXr r e e HXCXSXSXSXSXSXSXSXVX-X",
+"`.`.`.`.(.(.(.(.DXHXe e r r PXPXPXHXHXHXHXHXKXHXKXFX+XI.H.l.Q Q Q } Q Q Q Q Q Q Q Q Q Q Q Q l.E Q Q Q Q Q Q Q Q Q ! ! Q Q Q Q Q } Q Q Q Q ! Q S.S.S.Q S.Q } Q } } ! Q Q S.} Q S.l.Q Q S.Q S.S.Q Q S.} } S.} S.} } } S.} } } } S.} S.S.} } S.S.} } S.} S.} S.} S.} S.S.} } S.} } S.G.} S.S.G.S.} S.S.G.S.S.} } S.} G.S.S.} S.S.S.S.S...S.S.G.} G.G.S.S.X.S.G.G.G.S.G.G.K.I.NXBXKXKXKXKXKXKXKXHXIXPXPXr r & & HXBXVXVXSXSXVXSX%XVXVX",
+"`.(.`./.(.(.~.).SXHX7 & e & w r r r r & r r r r * # 8 BXI.F.F.F.F.F.F.F.F.F.F.F.D.F.l.l.F.l.F.l.l.l.l.D.l.F.D.F.F.F.F.F.F.F.F.F.F.F.F.F.F.D.F.F.l.F.D.F.F.J.F.F.F.F.F.J.F.F.J.F.F.F.D.D.D.H.J.F.H.J.H.H.J.J.J.H.H.H.H.H.J.H.H.H.H.H.J.J.H.H.H.H.H.H.H.H.H.H.H.H.H.H.J.H.H.H.H.H.H.H.H.H.L.H.L.L.L.L.L.L.L.L.L.H.L.L.H.H.L.L.L.L.H.L.L.L.L.L.L.L.L.H.L.L.L.L.L.L.L.L.L.+XBXw & & 8 e e t t 7 r * r r e e # t HXDXVXSXSXVXSX%XVX%X%X",
+"(.`.`.'.(.).~./.SXKXt # e t t t t 8 8 e r 8 r # r * 8 AXOXW.U.U.H.R.U.U.U.U.U.U.U.U.U.V.Y.F.U.F.U.U.U.Y.H.U.U.U.U.U.R.U.R.U.U.R.U.R.R.R.!.!.!.U.U.R.R.!.U.!.R.R.!.R.H.!.R.R.R.R.!.R.R.!.!.R.R.!.!.!.!.!.!.!.{.R.!.!.R.{.!.{.!.{.R.{.!.{.R.!.{.R.!.{.{.!.!.!.{.R.{.!.{.!.{.{.{.{.{.{.|.{.{.{.{.|.|.{.{.{.{.|.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.|.{.+X{.{.+X{.+X+X+X+X+XAX# t e r 8 e & # # # r r * 9 e r e GXSXVXVXSX%XVXVX-X%X%X",
+"`.`.(.(./.~./.~.BXFXt e r # r e 7 & & e e 7 t & & * r AXOX~.~.~.W.W.~.W.T.~.W.R.W.W.W.W.W.U.U.~.W.W.U.~.~.R.W.~.R.~.~.~.~.~.!.~.).).).)./._.).).]._._./._.~.).).~.~.~.~.).).).'.].!._._._.)._.|._._.`.|.|.`.}.|.}.|.}.|.}.}.|. X|.|.}.}.`.|.}.|.`.}.}.|.|.|.|. X}. X|. X}.|. X.X.X X.X.X.XXXoXXX.XoXoXoXoX.XoX.XXXXX.X|..X.X.X.XoXXXXX.XoX.X.XoXoXXXoXoXoXoXOXoXOXOXOXBXFX# e e 8 r r r & r 8 8 e r 9 7 e & KXOX%XSXVX%XVXVX%XSX%X",
+"`.(.`./././.~.~.XXCX9 8 e & r & e e & & & r & 7 & 8 r CX&X(.~.'.~.~.~.~.~.!.~.~.~.~./.W.~.~.W.~.~.~.~.~.~.~.^.^.^.~.~.(./.).'.(.`.`.`.`.`.`.`.`.]._._._.}._.'.`._./.`.`._.(.`.`.].].}.`.`.}.}. X}. X X.X}..X.X.X.X.X X.X.X.X.XXX.X}. X.X.X.X X.X.X.X.XXX.X X.X.X.X.X.XoX@X.XOX.XoXoXoXoXOX$XOX&X$XOXOX$XOXoXOXoXoXoXoXoX@XoXoXOX#XOX#X#X&XOX$X#X$XOXOX$X%XOX%XVX%X%XOX%XFX8 e & r e e r r e r r r r e & e 7 DXoX%X%XVX%X%X-X%X%X%X",
+"(.`.(././.~.~.~. XSXBXGXGXHXHXHXHXHXHXHXHXHXHXHXGXJXAXVX.X).(././.~./.~.^.~.~.~.~.!.W.~.~.~.~.~.~.~.~.~././.).~.^.~.).)._.(.'._.'._.}.}.`.`.`.}._.}._._._.`.`._._._.).)._.`._._.]._.}._.}.}.}.}.}.|. X}.|..X.X.X XXX.X|..X.X.X X|.oX}..X.X.X.X}..X X.XXX.XoX.XoX.XoXoXoXoXoXoXoXoX.XXX$XXX$XoXOXOX$XoXOXOX#XoXoXoXoXoXoXoXoXoXXXoXoXOX#XoXOX&X$X&XOX%XOXOXOXOXOXOXVX%X-XAXFXGXGXHXPXIXHXHXHXHXHXHXHXGXGXGXCXVX.XVX%X%X%X%X%X%X%X%X",
+"`./.`.(./.~.~.~.~.|.$XOXSXDXAXDXDXFXDXDXDXFXAXDXDXOXSX|.(.)./.^.(././.^.~.^.~.).~.~.~./.~.~.~.~.~./.!.~.'.~.(.^.(.^.(.).(.`.`.`._._._.`.`.`.`.}.`.`.}.`.`.`.`.`.`.`._.`.).'.`.`._._.`. X_.}.}. X}.}. X X.X}..X}..X.XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XoX.X.XoX.XoXoX.XoX.XoXoXoXoXoX#X#X$XOX$X$XOX$X$X&X&X#X#X&XoX#XoXoX#XoX#XoXoXoX#XOXoX$X#X$X$X$X$X%X%X%X-X%X%XOXVXOXOXSXAXFXAXFXFXFXFXFXFXFXAXAXAXAXAXOX}.%XOX%X%X%X%X%X%X%X%X",
+"`.(.(.(././.~.~.~.~.~.(.~.~.~.~.W.~.W.~.~.~.~.~.~.~.~./././.(.(.(.^.(.(.(.^.^.^.(.(.(.^.~.~.(./.(.~.(.(.(.(.(.(.(.(.(.(.(.(.(.`.(.`.=X(.=X`.=X`.=X}.=X`.=X}.(.(.`.`.(.(.`.`.`.`.=X`.}.`.}.}.}.=X}.}. X X.X.X.X.X.X.X@X.X.X.X.X.X@X.X.X.X.X.X.X.X.X.X.X.XXX#X.X#XXX#X@X@X#X@X#X#X#X#X@X$XoX$X$X$X$X$X#X$X$X#X#X#X#X#X#X#X@X#X#X#X#X#X#X$X#X#X$X$X$X$X&X%X%X%X%X-X%XOX%X%X%X%X-X$X$X$X&X#X$X$X$X&X&X$X&X$X&X%X&X%X%X%X%X%X%X%X&X%X%X",
+"(.`.`././.~.~.~.~.~.~./.~.Q.W.~.~.W.~.~.T.~.~.~.~.~.~._.'.).(.'.=X`.(.=X=X^.(.^.(.Q.(.^.=X~.(.~./.(.(.(.(.`.'.(.(.(.(.(.(.}.`.'.}._.`.}.`._.}.}.`.}.`._.'.'.=X_.'.}.'.}.(./.=X'.`.(. X`.`.`.`.XX}..X}.@X`..X@X.X|..X@X.X.X@X.X.X}.#X.X X.X.X.X@X XoX#X.X.X#X#X.XXX@X@X#X#X#X$XOXoX#X$X@X#X$X%X#X#X%X$X&X&X&X%X$XOX$X@X$X$X$XoX#X$X$X$XXX#X#X%X#X%X$X%X&X%X%X$X$X%XVX%X%X$XOX$X$X$X%X$X$X$X#X$X#X#X$X&X#X$X$X$X%X$X%X%X%X%X$X&X%X%X",
+"`.(./._./.~.~.~.~.~.~.~.~.W.~.~.~.W.~.T.Q.~.~.~.~./.W.Q.(.R.W./.~./.).`.T.(.).)._.!.!.'.^.^.'.).'.`./.`.`./.`.`.(.^.(.(.`.(.`.`.`.`.`.`.`. X`.`.}.]._.`.`.'.`.`.(.`.}.)._._.`.}.}.=X].].}.=X X`.`.}.XX`..X.X X X@X.X.X.X.X.X.X.X.XoXoX@X}.#XoXoX.XOXoXoX&X#X#X#X$X#X@XoX%X#X@X%X&X.XoX&X$XVX&X#X$X$X#X#X$X#X#X$X#X#X$X$XoXOX$X#X%X$X&X#X$X$X#X$X#XCX&XVX&X%X-X-XOXVX&X&X-X%XoX$X$X$X$X$X$X#X#X#X$X#X$X$X$X&X$X&X$X%X$X%X%X&X%X%X%X",
+"`.`.(././.(.~.(.~.~.~.~.~.~.~.Q.W.~.W.~.~.~.~.~.~.~.].'.).W 9 7 9 = W '.`.`.W 9 7 8 9 R ).`._.`.`.Q.`.~.(.`.(.~.`.`.`.'.`.'.}.`./.`.}./.]._._.}.].}.].`.*X}.}.'.`.=X/.{.Q F.'.}._.(.`.`.XX}.`.}. X XXX}..X}. X@X.X#X@X.X#X@X.X.X#X}.oX*X#X|.0 # 9 & $ Q $XoX.XoX$X#XOX+X! H.-X.X&X$XOX|.! H.$X$X$X@X$X%X$X%X$X$X$X$X&X#X%X$X#X$X@X$X%X#X$X$X$X$X[.9 & $ {.%XOXOX%X$X%X%X$X$X%X$X$X%X$X$X#X$X#X$X#X#X#X#X&X$X&X$X%X%X$X%X$X%X$X%X%X",
+"(.`.^./.(.~.(.~.~.~.~.~.W.~.~.~.^.T.T.~.~.~.~.~.^.~.W.^.(.R 8 r 7 * 0 _.(.W.i # e e e R ).^.~.`.). X).}.(.(.'.`.'.'.`.=X`.=X~.`.`.`._.}.`.].}._.`.].`.}.}.).*X}.`.~.Q 0 9 J.'.`.}._. X`.`.}. XXX|..X.X}.@X*X@X*X.X@X.X X.XoX.X#X@X.X#XXX.X[.# # & r * i oX@X#X&XOX|.X.i $ R.#XOX&X.X..i 8 [.$XOX$X$X%X%X$X%X%X&XOX&X%X$X#X$X$XOX&X$X#X$X%X#X$X#X[.# e 7 L.%X$X%X%X-XOX%X%X%X$X$X$X#X#X#X$X#X#X#X#X#X#X#X$X$X%X$X$X%X%X%X&X$X%X%X%X",
+"`.`.)./.(./.~./.~.~.W.~.~.~.W.Q.~.~.~.Q.~.~.~.~.^.~./.~.(.E e & e & e E.=XR.t & * r e E '.=X(.`.`.'.'.}.`.`.~.^.`.`.^.`.^.(.`.'.`.)._.`.=X`./._.}.}.'.`._.`./.`. XF.t r # J.(.=X`.`.`.}.}.}.`.}.*X.X}.`.}..X.X X XoXoXOX#X}.#XoX X@X@XoXOX} # t & * r & H.#X@X#XoXR.7 & & L.oX#X%X[.e e 9 L.oX%X$X$X$X$X$X%X$X$X%X$X&X%X#X$X&X&X$XOX%X&X&X%X#X-X[.e & 7 [.OX$X$X%X%XVXOXOX$X#X$X%X&X$X&X#X&X$X#X$X#X#X$X$X$X%X%X$X%X$X&X$X%X%X%X%X",
+"(.`././.^.(.(.~.~.~.~.~.W.~.~.~.~.~.~.~.~.^.^.~.~.~.~.Q.(.R e # t # & ..^...e e t e & R }.^.(.`.!.l...! F.E.}.'.(.(.F.J.F.E.).! ! ! E.}.}.'.|.!.D.....! D.{.`.`.R...* r 7 ..J.W.`.}.}.{.........{.}..XXX*XH.H.R.|.H.D.D..XoX@XoXoX#X#X.XoXR e # p 7 & t Q %X@X-X+X..& & e G.H.OX+XX.# & # G.[.oX%X$XVX[.G...D.G.L.OX%X$XOX-XOX+XJ.D...D.[.OX$X#X[.7 * t [.OXoX[.R.H.R.oXOX%X%X%XOX%X%X$X$X$X$X$X%X$X$X$X%X%X%X%X%X$X%X%X%X%X$X%X%X",
+"(.`././.'./.~.(.~.~.Q.~.W.~.~.~.~.~.^.Q.^.'.Q.~.~.~.'.'.~.R e t E 9 e Q (.W 8 7 E 9 9 R `.=X}...i # # 9 # 0 ..|.`.`.t $ t ..i 9 # t 9 J.`.}.! 0 7 7 9 9 & t l.|...t * r 7 7 9 H.`.'...t t # e r & W |.}. X9 & 7 } e # R |.@X@X&X$XXX.XOX[.e & 7 X.W r # 7 +X$XoXD.e e r t e 9 H.D.t r # & t 9 H.OXoXT t # t e # e R [.OX%X$XG.t # t t 7 7 W +X%X[.t # 8 [.+XR # t 7 ..oX%X$X$X%X&X%X&X$X&X%X&X$X$X%X$X$X$X$X$X%X%X%X%X$X%X%X%X%X%X",
+"`.(.`./.~.^./.(.~.~.~.Q.~.~.~.~.~.~.^.^.^.^.^.~.~.~.~.Q.Q.T 7 e ! t r i ).R # r X.# * R }._.F.t # 8 r r & e 9 ..`._.& r & 8 e r & * * R /.R.9 & r T } t = & 0 !...& e 8 7 r * E.|.l.& 7 r r r 8 & t W }.|.t * e 7 * t W $X X#X.XoX#X$XOX..& * t L.D.& & t J.&X&XX.& e 7 # = 7 [.D.* & e e & 7 [.OX} # & & & = t # e W OX%XD.e & = & & r e 7 } oXL.& & t L.E # t & } &X%XoX%X&X%X%X#X$X%X%X$X%X%X%X$X$X$X$X%X%X%X%X%X%XOX%X-X%XOX%X",
+"`.`.(.(.^./.~.~.~.~.~.~.~.~.~.(.^.^.^.~.^.Q.Q.~.~.^.Q.~.'.R 7 r } W & $ F.& * W ..$ r R `._.t r 7 i !.!.R 7 9 t }.'.# & r t ..D.i e & e (.F.7 = e ! `._.F.).}.(.!...* * r ..F.!.}.t & 9 W !. X..7 & 8 R.|.# r = 7 D.H.R..X#XoXoX$X#X$XXXi e e 7 &X.Xe * & W OX%X+XD.& e t G.R.OX+XD.* & r ..[.&X&X .R $ T OXOX .& & r OXOX7 7 e R +XoXQ & * i oXH.e e t T # & e } #X#X$X#X%X$X%X%X$X%X$X$X%X&X&X&X&X&X%X%X$X$X%X%X%XOXVXVXOXSXVX-X",
+"`.(.(.(.'./.).~.~.~.~./.~./.^./.(.^.^.^.^.^.~.~.~.^.Q.~.~.R e 7 Q ! # 9 R r # Q ! & # W `.R.7 r 7 F.'.'.D.# t # H.(.9 t 7 W _./.! * 7 7 ~.{.9 $ 8 r t 9 E Q !.]./.U.7 # # J.`.`.U.t e * W ....X.e t e X..Xt 8 & R oX.XoXoX.X.X#X#X#X$X{.& & & i D.X.i & # e +X$X%X[.r r 7 L.%X$X&X[.7 e e {.&X#X@XOXOXSXH.G.} t t # & OX[.t & & J.$X$X+X{.OXoX#X[.& 7 e & t # r X.&X%X#X-X#X$X%XOX$X%X%X%X%X&X%X%X&X%X%X%X$X%X%X%X%X%XOX%X%X%X-X%X",
+"'.'.'.(.(.(.(.~.~.~.~.~.~.~.(.(.(.^.^.(.^.~.^.~.^.~.^.~.~.R e e ! U.# # r e 7 U...& = R `.J.e 8 t J.=X`.J.e = & F.(.7 e e ! ].Q.! = e * W._.U.R & r = & r 7 R R.).J.& t t U.}.`.J.& 7 & t 9 & $ & # 9 D..X& & e X. X.X.X.X.XoXoX#X#X@X..e * e 7 7 e e & & 7 H.$X%XH.& e 9 [.OXOX&X[.t * t H.%XoX-X{. .7 t 9 7 i e * t VX[.9 = t L.XX&X@XOXoX$X@X[.e e e $ & & & t +X$X%X$X$X%X%X%X$X$X%X$XOX$X%X%X%X%X%X%X%X%X%X-X%XVX%X%X%X%X%X%X",
+"_.'.(.(.(.(.(.(./.~.~.~./.(.).(.(.^.'./.~.(.^.~.Q.Q.~.~.~.R 7 & ! ~.t & # r t `.! & t R _.R.& & 9 ..(.`.D.# e 9 U.`.r * & ! ^.(.! & # 9 (.!.!.~.R.G.! R & & $ ..|.F.* & # U.|.`.H.& 9 7 } J.J.R.H.U.F._.}.& r 8 D..X X.XoXoX#X.XoX#X-Xi e * & # r * & e * e R $XOX[.t e 7 L.OX-X&XR.t * e H.CXCX+Xi e e  .{.VXX.# e e OX{.9 & t D.$X&XoXD.D.H.|.[.& & e 7 X.e & 7 ..&X&X$X$X$X%X%X$X$X%X%X%X&X%X%X%X%X%X%X%X%X%XVX%XVX%X%X%X%X%X%X",
+"(._.(.).(.'.(.(.(./.~.(./.(.(.(.(.(.(.~.(.~.^.Q.~.~.Q.Q.Y.R e r ! Q.W e 8 r W =XD.e # E `.'.R # e t F.D.t r 7 i ).^.r * 7 ..(.(.! # & t W.l.R & 0 R.}.E.7 t t ! /.F.r r 7 ..F.}.~.R 7 # R D.J.T = i E |.XXe 8 e ..oX.XoX.XoX.XoX#X.XH.7 e * 9 W W E W t * t # +XVX[.# & t G.H.%XSXL.# t 7 G.H.VX[.# 7 r X.L.G.t = & e OXOX0 r & i G.L.W & * 9 L.[.# e e D.%XQ t # 7 [.&X$X#X%X%X%XoX%X&X$X%XOX%X%X%X%X%X%XVX%XVX%X%X-X%X%X%X%X%XOX",
+"`.(.).(.'.`.(.).^.(.'.(.^.(.(.(.^.(.~.^.~.~.~.~.~.T.W.~.!.R * = ! ^.! & r & ..).! r & R `. X[.t * * e t & e 7 R.~.`.& t # ..'.~...* r 8 ).F.# t 8 t R i * & t R.~.!.8 & & = t !.`.H.& * & e 7 7 t 9 D. X.X& r e ..oX.X.X.X.X#X&X#X.X} & e # Q %X&X%XoXW r * & G.%XXXt & & & t +XCXBX& & e e 7 OX+X9 e r e r 9 t e 7 e %XOXH.t # * * e e = & } OXL.t * e [.oX{.r & t R oX%XOX$XOX%X$X$X%X$X%X%X%XVX%X%X%X-XVX-X%X%XVXVX%X%XOXOX%X%X",
+"(./.(.'.)./.(.(./.(./.).(.(.).(.).(.).(.~.~.~.~.~.~.'.~.R.W # 9 ! ~.J.t 9 7 J.}.! e 7 E =X].).R.R t & 9 # R R._.(.(.$ $ 9 ! '.'.! 8 8 t ~.).F.i 8 7 # e t R H.`.`.}.! t 9 t $ J..X|.J.i r 8 e & # X.|.].|.$ 7 t ..#X.X@X#X@X.X.X.X$XR = e t G.CXCX&X%XJ.9 8 t R SX-XG.9 t # 8 {.VXVXX.t e # t [.%XJ.t t = t } [.9 e t H.$XOXH.E t & 7 t 9 X.&XoXR.8 & # E.oX&XX.7 7 9 D.OX$X&X%X$X$X%X$X%X%X%X%X-XVX%XVX%X%XVX%X%X%X%X%X%X%X%X%X%X",
+"(.).`.).).(./.`.(./.`.(.).(./././.(.~.~.~.~.~.~.~.~.(.Q.Q.W.~.!.~.Q.(.'.(.!.`.(.}.|.`.|.`.}.`.=X}.R.J.F.!././.~.`.)._.~.!.~.~.(.~.~.~.|.Q.'./.(.R.U.F.F.E.`.=XQ.].`.(.[.F.H.R.].}. X`..X!.H.H.R..X}. X X*X&X+X.X@X X X.X.X.X@XoXoXoX@X@X$X.X%X@X%X$X%X%XOXSX%X%X%XVXSX+X[.L.+X%X-X%X-X+X[.[.+XVXSXBX;XL.L.OX%XVXOXOX&X$X@X$X$XXX+XR.[.H.OXOX#X$X@X&XOXOX@X@XoXOX%XXXCXOXOX%XoX$X%X$X$X%X$X%X%X%X%XSX%X%X%XOX%X%XOXOX%X%X%X%X%X%X%X",
+"(.(.`.`.(._.(.).`.`.`.`.`.`./.(./.).(.~.~.~.~.~.~./.Q.~.(.Q.!.~.~.'.~.^.(.'.`.(.`.`.`.`.`.`.`.`.`.(.`.(.`.)./././././.(././.(.(.(.~.(.(.(.(.`.).(.(.Q.=X~.`.(.`.=X(._.=X*X}.XX=X X X.X.X@X*X}..X.X}. X*X*X}.@X.XXX XoXoX.XoX@X}.@X@X#X#X$X#X#X$X%XCX&XVXVX%X-X%X%XVXSXSXSXSXVXVX-X%XBXDXCXSXOXVX%X-X-XVX%X-XOX%X%X%X$X&X$X#XOX#X&X&X$X$X$X$X#X#X$X@X#X#X#X$X#X#X#X#X$X%X$X%X%X$X%X%X%XOX%X%X%X%X%XSX-XVXSXSXVX-XSX%X%X%X%X%X$X%X$X",
+"(.(.'.`.'._.(.'.`.`.`.(.(.(._./.(.(./.^.~.~.~.~.~.~.(.~.(.(.~.~.^.^.^.^.`.(.(.`.`.`.`.`.`.}.`.}.`.`.(.`.(.(.(.^./.(.(.(.~.~.(.~.^./.~.(.`./.).~.(.~.(.(.(.`.}.`.(.`.}.`.}.}.=XXX X}. X X}. X}. X.X X XXX@X*X.X X@X.XoX X#X@X#X#X.X$X.X&XOX$X$X-X#X$X-X$XVXOXoXSXVX%XOXSXSXVXVXCXSXSXSXOXSXSX%XVX%XSX%X-X%X%X%XOX%X%X$X$X%X$X$XOX#X&X#X$X$X#X#X$X#X#X#X#X#X#X#X#X#X&X$X$X$X&X%X$X$X%X%X%X%X%X%X-X%X%X%XSX%XSX%X%X%X%X%X%XOX%X%XOX%X",
+"(.(.(.(.`.`.`.`.`./.`.`.(.`.(.(.`.).(./.~.~.~.~.~.~.~.~.(.W.~.~.^.^.^.'.(.`.(.`.`.`.}.`.`.`.`.`.`.`.(.(././.'.~./.~.~.~.(.(.~.(./.(.(./.'.'.`.`.`.~.~.^.}.'.'.`.(.`.`./.=X}.}.*X.X]. X X}..XXX X X XXX X`.oX X.XoX.XoX@X.X.X@X.X$X.X%X.X&X$XOX&X$X$X%X%X%XDX%X%X&X-XSX%X%XSXDXVXVX-X-X;XSX;XSXVX%X%X%X%XSX%X%X%X%X$X%X&X$X%X$X$X$X$X#X#X$X$X#X#X#X#X#X$X#X#X#X#X#X#X$X$X$XOX$X%X&X$X%X$X%X%XVX%X-XSX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"~.(.(.(.'.`.`.`./.`._.(.(.`.).`.`.`.(.(.~.~.~.~.~.~.~.~./.^.~.^.(.(.`.(.`.(.`.`.`.}.`.}.`.`.`.'.`.(./.).(.(.~.(.~.~.~.~.~.^./.~.~.(.(.(.`.(.~.^.(.(.'.).'.).`.`.}.'.'.}.`.=X}. X X.X}..X.X}.}..X X}. X.X.X.X}.#X.X#X.X$X@X@X@X@XoXoXOX&X%X#X%XOX-X&XCX%XOXBX%XCXCXCX%XVXSXVXVXCXSXVXCXVXOXVXVXVX%X%X%X%X-XVX%X%X%X%X$X%X%X$X&X&X$X$X&X&X$X$X$X#X#X#X#X#X#X#X$X#X#X#X#X$X$X$X$X&X&X$X%X%X%X%X%X-X%X%XSX%X%XSX%X%X%X%X%X%XVXOX%X%X%X",
+"/.~.).'.(.(.(.(.(.(.`.(./.`.(.`.`.(.(./.~.(.(.~.~.~.~./.~.(.~./.(.(.`.`.(.`.(.`.`.`.`.`.`.`.`.(./.(./.(.(././.~.~.~.~./.~./.~.(.^.(...! ! ! ! ! ! ! U.'.'.=X`.(.'.'.J.....}.=X].`.*X X}.}.*X.X X X.X.X.X.X.XoX.X@X@X#X@X.X#XoX&X+XW E [.#X%XoXG.W W X.OXVXVX%X[. .W } +XDX+XD.G.G.G.G.X.J.VXVX%X%XVXOX%XOX-X%X%XOX%X%X%X&X$X%X$X&X$X$X$X$X$X$X#X#X#X#X#X$X#X#X#X#X#X$X#X&X&X&X$X$X$X%X%X%X%X%XVX%X-X%X%X%X%X%X%X%X%X%X%XVX-X%X%X%X",
+"^.(.(.(.(.(.(.(.(.(././.(.(.(.`.).(.(.(.).(.'.~.~.~./.~.(.).(._.(.(.`.`.`.`.`.`.}.`.`.`.`.`.(.`.(._.(././.~.(.~.^.^.~.~.~./.~.(.(.(.T t e 8 7 e & & ! '.).).).).'.'...t 7 |. XXX|.}.`.}. X XXX X}.}. XXX.XoX}..X@X@X#X#X.X.X&X+XW 9 7 R.$X$XW & i R t R OXCXJ.7 t T # t +X[.9 7 # # t # W VX-X%X%X%XOXSX%X%X%X%X%X$XOX%X%X&X%X$X&X&X$X&X$X%X$X$X#X#X#X&X#X#X$X$X#X$X#X#X#X$XOX&X%X&X$X%X%XSX%XSX%XSX%X%X%X%X%XSX%X%X%X%X%X%X%X%X%X",
+"~.^.(.).'.(.'.^.).~./././._.(.(.(./.'.(.~.~.~.^.~.(./.(.(.(./.).).'.'.(.`.'.`.`.`.`.}.`.}.`.`._.(./.(.(.~.(.~.^.~.~.~.~.~.~.(.(.(.~.D.Q } e # i } ! U.!.F.! ! R.`.(...8 7 |.R.J.F.|.R.H.{. X|.R.E.{..X!...D.J.oX@X.X.X.X.X#XD.0 # e e L.&X{.# * +XCXE & G.CXi e L.CXX.X.[.+XD.X.J.| # i G.SX%XOX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X$X%X%X$X%X$X%X$X$X#X#X#X#X$X$X$X#X#X$X$X#X$X$X&X$X%X%X%X%X%X%X%XSX-X%XSX%XSX%X%X%X%X-X%X%X%XVX%X%X",
+"~.~.^.^.^.^.^.'.~.~.~.).(.(.(.).`./.(.).^.~.).(.~.).^.(.~.(.(.'.`.(.`.`.'.`.`.`.`.'.`.}.`.`.`.`./.).(.(.^./.^.^.~.~.~.~.~.~./.(.(.(.(.'.{.9 9 R (.(.R.R # = e 9 ..`...r 8 ..9 e R ).E t T XX!.9 & [.G.9 # t # R +X&X.XoX#XOXR t  .* 8 [.VX[.* r BX-X..& W +X& e H.E Q L.SX-X%XSXBXR e X.SX-X%X%X%XVX%X%XVX%X%X%X%X%X%X%X%X%X%X%X%X&X%X$X$X%X$X%X$X$X#X#X#X$X#X$X$X#X#X#X#X#X%X$X%X%X%X%X%X%X-XVX%X%XSXSX%X-X-XSX-X%X%XVX-X-XCX-X%X",
+"^.^.~.^.^.(./.~.(.~.(.(.(.(./.'.(./.~.'.~.^.(.^.(.(.(.(.(.(.(.(.(.`.(.`.}.`.`.'.`.}.`.`.`.`.(.`.(.(././.^.(.~.^.~.(.(.~.~.(././.(.(.(.`.'.& t R './...e 0 ~...e t _...e & t e R _.}.U.r r |.F.e i .X0 & X.}.t * D..X.X.X#X.XR.}.[.& 7 [.%XoXt & X.H.i * E [.& = t R 7 7 [.CXVXVXJ.7 E %XSXOXSX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%XOX%X%X%X%X%X$X$X#XOX#X$X#X$X$X$X$X$X#X#X$X&X&X&X$X%X%X%X%X%X%XVXVXVX%X%X%XSXSXOXVX%XVX%XVXCX-XVXSX",
+"^.~.~.~.~./.~./.^./.~.(.).(.(.^.(./.^.~.~.^.~././.(./.(.(.'.(.(._.(.'.`.`.`.`.}.`.`.`.`.`.(.`.(.(.(.).(.(.(.~./.(.~.(.~.~.~./.(.(.(.`.`.~.t 8 R /.(.E & R `.F.7 # U...8 7 7 e R _.*X|.i 8 D.W # X.R.# * R.XXE 8 R @X#X.X#X&X*X#XH.t # [.OXOXJ.t & t R t W L.= & [.SX} e W %X%XSXi t H.VXVX%X%XOX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%XOX%XOX%X%X$X$X$X$X$X$X$X$X#X#X$X$X$X&X&X$X&X$X&X%X%X%X%XVX%X-XVXVXVX%XVX%XSX%X%X%X%X%XVX%XVXVXVX%X",
+"^.Q.~.~.~.~.~.~./.~././.(./.~.(.^.'./.^.~.~.(.~.~.(.~./.).(.'.(.(.`.`.`.`.`.'.`.`.(.=X`.`.`.(._.).`.(.).(.~.^./.~.~.Q.~.~.~.~.^.`.`.`.`.~.7 8 E ).`.R t i }.F.# & J...& # R = e J.|.*X..$  .# 7 [.R.* * H.XXE & E &XoX$X.X#X$X%X[.& 9 H.OX-XSX{.L.+XW # } OXt & OX-XS.& W SX%XL.r t OXSXOXSX%X-X&X%X%X%X%X%X%XSXVX-X%XVX%X%X%X%X%X%X%X%X%X%X%X$X$X$X$X$XOX$X$X$X$X$X$XOX$X&X$X%X%X%X%X%X%X%XVX%X%XVXVXVXSX%XSXVXVXVXVX%XVXVXVXVXSX",
+"~.~.~.~.~.~.~.~.~.~.~.~.~.~.(.)./.'.^./.(.~./.~.~.~.~.~.~.).^.^.(.`.`.`.`.`.`.'.`.`.`.`.`.`.(.(.`./././.~.(./.~./.~.~.~.~.~.~.)./.`.(.`.}.# t E  X].F.# 7 D.W & i '.! r & !.! # i }..X|.t & * W |..Xi &  .J.= t J.XXoX.X@X#X#X&XL.t e L.VXVXi # } L.t = [.VXT t X.H.i t X.OXVXG.& T %X%X%XVX&XVXVX%X%X%X%X%XVX%X%X%X%X%X%X%XCX%X%X%X%X%X%X&X$X%X$X$X$X%XOX$XOX$X$X$X$X$X$X%X&X$X%X%X%X%X-X%X%XVXVXVX%XOX%XSXVXSXVX%XVXVXVXVXVXVXSX",
+"~.(.~.~.~.~.~.~.~./.~.~.~.~.~.~.^.(.(.'.'./.~.~.~.~.~.~.~.~.~.(.).`.`.`.`.`.`.`.`.`.`.`.`.(.`.).(.`.(.).(.(.~.(.~.~.Q.~.~.~.~.(.(.`._.`.).9 7 R '.}.).! 0 9 t i J.*X! & t }.!.t # ..].`.Q 7 # E. X|.R.i 9 9 $ ..OXXXOX.X#X.X#X$X[.9 7 [.%XOX[.i & & t L.VX;XoXR # 7 8 ] BXVXSX .t D.%X%X%XVXOXOXOXOX%XOX-XVX%X%X%XVX%X%X-X%X-X-X%X%XOX%X%X%X&X%X%X%X$X$X$X$X$X#X$X#XOX&X%X$X%X%X%X%X%X%XVX%X%X%XOXVXVXVXSX%XVX%XVXSXVXSXSXSXSXVXSX",
+"~.~.~./.~.~.~.~.~.~.~.~.~.(.(.^.^.'./.^.^.~.~.~./.~.~.~.~.~.~.'.(.(.`.`.`.`.`.`.'.'.(.(./.(._.`.(.`./.(././.~./.~.~.~.~.~.~.~.'./.`.`.(.}.{.XX{.`.`._._.!.J.H.|._.(.(.XX{.=X}. X}.}.|.|.} & t |.*X.X.X.X[.R.{..X XXX$XXXoX$X&X#X%X&X%X$X$X-X%XOX{.L.OXOXSXXXSXOX{.[.oXBX%X-X#XVXVX%X%X%X%X%X%X&XVXOX%X%X%XVXSX%X%X%X%XVXCX-XSX%X-X%X%X%XOX%X$X$X$X$X%X$X$X$X&XOXOX$X#X$X$X%X%X%X%X%X%X%X-X%XVX-XVX%XSXOXVXVXSXSXVXVXSXSXSXSXSXCXSX",
+"^.(.(.~.(././.~.~.~.~.~./.~.~./.^./.'.(.~./.~.~.~.~.~.~.~.~.~./.`.`.`.`.`.`.}.`.`.(.(.(.(.(.(.(./.(./._./././.~.~.~.~./.~.(.~.~./.`./.*X`.(._.`.`.}.`.}._.`.].`.(.}.`.`.).`.`. X}._...9 $ # ..#X XXX.XoX X.X.X.XoX#X@XoX@X#X%X$X&X%X$XCX&XCXOX%X;X%X%XSXOX-X%XSXVX%XSXOX-X-X%X%X$X$X%X%X&X%XVX%X%X-XVX%X%X-X%X%X%X%X%X-X%X%X%X-XSX-X%X%X%X%X&X%X%X%X$X%X%X$X$X%X$X%X$X&X%X$X%X%X%X%X%X%XVXVX%XVXVXVXSX-XSXSXSXSXSXSXSXSXSXSXDXDXSX",
+"^.^.~.(./.~.(.~.~.~.~.~././.(.'.(.(.(.^.~.~.~.~.~.~.).~.~.~.~.'./.`.'.'.`.`.`.`.`.(.).(._.(.`.(.`.(./.(.^.(.~./.~.~.~.~.(.~.^.(.(.`.].`.`.`.=X`.`.`. X`.}.`.}.`.}.}.`.`. X].}.`. X_.!.D.X.J.}..X.XXX*X X.X.X.X@X#X.X#X@X#XOXoX$XoX-X%X$X-X$X&X&X%X$X%X&XOX&X%XOXCX%XSX%X-XVXCXCX%X%X$X%X%X%X%X%X-X%XSX%X%X-XSX%X%X%X%X%X-X%X%X%X%XCX%X%X%X%X$X%X%X$X&X$X%X$X$X%X&X&X$X%X$XOX%XOX%X%X%X%X%X%XSX%XSXSX%XSX%XSXSXSXSX-XSXDXSXDXSXSXSX",
+"^.(.^.~.~./.~.~.~.~.~.~.~.(./.~.~.~.~.).).^.~.~.~.~.~.~.~./.(./.(.(.`._.`.`.`.'.).(.(./.(././.`./._.(.(.^./.~.~.~.~.~.^.~.(.(.(.`.}.`.}.`.}.}.`.`. X'.}.`.=X`.=X`.`. X}.}.}.}.}.`.}._. X X}.}.}.*X.X X.X.X.X.X.X.XoXoX.X#X$X&X&X%X%X%X%X$X%X%X$X%X$X&X&X%X%X%X%X&X%X-X%X%XSX-X%X%X%X%X%X%X&X%X%XOX-XOXSXVXVXOXVXVXSXVXSX%XCXCX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X$X%X$X%X$XOX%X%X$X%X%XVX%X%XSXSX%X%XSXSXSXSXSXSXSXSXSXDXSXSXSXSXSXSX",
+"~.(.(.~.~./.~.~.~.~.~.~.~.~./.~.~.(.~.(.(.(.~.~.~.~.~.~.~./././.(.(.(.(./.(.(.(.`./.(.(./.(.(.).(.`.(./.(.~./.~.~.~.^.^.(.).(.'.`.}.`.`.}.`.}.`.`.`.`.`.}.}.}.}.'.`. X`.}.=X}.}. X}. X`.}.}.}..X X.X.X X.X.X.X.X.XoXoX#X#X$X$X$X%X$X%X%X%X%X$X$X$X%X&X&X$XOX%X%X%X%XVX%X%X%X%X%X$X$X%X&X%X%X%X%X%XSXOXVXVXVXVXVX%XVX%XVX-X%XCX%X%X%X%X%X%X%X%X&X%X$X%X$X%X$X%X%X%XOX$X%X%X%X%X%X-X%XVX%X%XVX%X%X%XSXVXSXSXSXSXSXSXSXSXSXSXSXSXVXSX",
+"(.~.~.(././.~.~.~.~.~.~.~.(.~.(./.~.(.~.~.~.~.~.~.~.~./.~.~.~./.).(.(.(.(.).^.(.(.(./.`.(.(.(.`.`.`.`.(.(.(.~././.~.~./.(.(.`.`.`.`. X X}.}.}.}. X X`. X`.=X}.=X}.}.`.`.}.=X`..X}.}.`. X}.}..X}..X X X.X.X.XXX.X.X.XoX#X$X#X#XOX$X%X$X$X%X$X%X&X&X$X&X$X&X$X%X%X%XVX%X%X%X%X%X%X%X%X%X$X&X%X%X%X%XVXVX%XOXVXVXOXVX%XVXVX%XCX%X%XVX%X%X%X%X%X%X%X%X%X%X&X%X%X%X%X%X$X%X%X%XOX%XSXOX-XVX%XVXVX-XSXVXVX%XSX%XSXSX%XSXSXSXSXVXDXSXDXSX",
+"~.~.~.~.~.~.~.~.~.~.~.~.~.~./.~.~.(.~./.~.~.~.~.~.~.~.~.~.~.~.(.(.'.~.~.)./.~.)./.^.(.(.(.(.(.`.(.`.`.(.`.(.(./.~.~././.(.(.'._._.`. X`.*X`. X`.`. X}.}.}.}.}.}.}.}.`.}.}.}.}.}.}. X}.}.}.}..X.X X.X.X X.X.X.X.X.XoX#XoX#X#X$X$X$X$X$X$X$X$X$X$X$XOX$X$X&X$X$X%X%X-X%X-XVX%X%X$X%X$X%XOX%X$X%X%X%X%XVXVXVXVXVX%XVX%XVX%XVX%XVX%XVXVX%X%X%X%X%XVX%XOX%X%X%X%X%X%X%X%X%X%X%X%X%XOX%X%XVX%X%X%XVXVXVX%XSX%XVXSXVXSX-XSXSXSXSXSXSXSXDX",
+"~.~.~.~.~.~.~.~.~.~./.~.~./.~.^.(.~.(.~.~.~.(.~./.~.~.~.~.(.~././.~.~.~.~.~.~.~./.~.(.(.(.(.`.`./.(.(.`.(.(././.(./.'.`._.'.`.`.}._.`. X}.`. X}.}.`.}.=X}.}.}.}.}.}. X*X}.}.}. X X X}. X}..X}.}. X X X X X.X.X.X.X.X.XoX#X#X#X#X$XOX$X$X$X$X$X#X$X$X$X$X%X&X%X%X%X%X%X%X%X%X%X%X%X%X$X&XOX%X%X-XSXOXOXSX%X%XVXVXVXVXVXVXVXVXVX%X%XVX%XVX%X%X-X%X%X%X%X%X%X%XSX%X%X%X%X%XVX-XSXOXVXVX%XVXSXVXVX%XVXSXVXVXVX%XVXVXSXSXSXSXSXVXSXSXSX",
+"~.Q.W.~.~.!.~.~.~.~.~.~.~.~./.~.~.~.~.~.~.~.~.~.~.~.~.~.W./.W.~.~.~.~.~.W.~.~.~.~./.).(.(.'.(.(.`.(.`.`._.`.).(.(.)._.`.`.`. X`.}.}.}.`.}.}.}.`. X`. X}.=X}. X}.}..X X X X}. X X X}. X X}.}..X}. X X X X X.X.X.X.XXX#X@X#X.X#X#X#X#XoX$XOX$X#X&XOX$X$X$X$XOX%X$X%X%X%X%X%X%X%X%X$X$XOX%XOX%X%X%X%XVXOXVXVXVX%XSX%XVXVXVX%X%XVXVXCX%XVX%X%XSX%X%X%X%X-X%X%X%X%X%X-X%XSX%X%X%XVXVXSXVX%XVX%XSXVXVXVX%XVXVX%XSXSXSX%XSX%XSXVXSXSXSXSX",
+"~.~.~.~.~.~.~.~.~.~.~.~./.~.(.~.~.~.~.~.~.~.~.~.~.~.~.~.(./././.~.~.~.~.~.~.~.~.~.~.~.(.~.'.(.^./.(.).(.(.(.(.`.`.`.'.`.}.`.`. X`. X}.}. X X.X}.}.}.}.}. X X XXX.X}..X.X X X X X X X X*X.X}.}. X X X X X.X X X.X@X#X#X.X#X#X#XoX#X#X$X#X$X#X#X&X#X$X$X$X$X$X$X%X&X%X%X%X%X%X$X&X$X$X&X%X%X%X-X%XVX-XSXSXOXVXVXVXVX%XVX%XVXVXVX%X%XVX%XVXSX%XSXSX%XSX%XSXSX%X%XSXVX%X%X%XVXVXVXVXSXVXSXSXSXVXSXVXVXSX%XSX%XSX%XSXSXSXSXSXVXSXSXSXSX",
+"~.~.Q.~.~.Q.~.~.~.~.~.~.(./.~.~.~.~.~.~.~.~.~.~.~.~.Q.~.~.~.~.~.~.~.~.~.W.~.~.~.Q.(.^.(.~.^.^.^.(.(.(.(./././.(.`.(.).`.`.`. X}.}.}..X}.}..X}.}. X}.`. X}..X}..X X.X X.X X.X}..X X.X X X X X X}. X X.X X XXX.X X.X.XoX#X@X@XoX#X#X#X#X#X#X#X#X#X$X$X$X$X$X$X$X&X%X$X%X%X%X%X%X$X%X$X$X&X%X%X%X%XVX%XVXVX%XVX%XSXVX%X-XCXCXVX%X-XCX-X%XVXVX%XVXVXVX-XVXVX-XSX%X%X-X%XVX%X%XVXVXVXVXSXVXSXSXSXVXVXSXVXVXVXVXSXSXVXSXSXSX%XSXSXSXSXSX",
+"~.~.~.~.~.~.(.~.~.~./.~.~.~.~.^.~.~.~.Q.~.~.^.^.~./.~.~.~.~.~.~./.W.~.~.~.~.~.~.^.^.~.~.(.^.~.~./.(._.).(.`.`.`._.`.}.`.}.}.}.}.}.}.}..X@X}.@X}. X X X|.}. X X X.X X.X.X.X.X X.X.X X X.X X X X}. X X X.X X*X.X.X@X@X.XoXoXoX.XoX.X#X#X#X.XoX#X#X$X$X$X$X$X&X&X&X%X%XOX%X%X$XOX%XOX%X%X$XOX%XSX-X-X%XVX%XVXVXVXSXVXVX-X%X%X-X%X%X-XCXVXVXVXVXVXVXSXSXVXVXSX%XVX%XVXVXVXVXVXVXSXVXSXSXSXSXSXSXSXSXSXSXSXVXVXVXSX%X-XVXSXSXSXSX%XSXSX",
+"Q.~.~.Q.~.~.~.~.~.~./.^.(.^.~.~.~.Q.~.~.~.^.^.~.~.(.~.~.~.~.~.~.~.~.~.~.~.~.~.Q.~.~.~.^.^.~.~.(.(.(./.(.'.`.`.`.`.`.}.}.}.}. X}..X}..X}.}..X}..X.X}.}..X X.X.X.X.X.X.X.X.X.X.X.X X X X X XXX}.XX X X X X.X.X.X.X.X@X.XoXoXoX#X.X#X#X#X#X#X#XoX#X$X#X$X$X$X%X$X$X$X%X%X$X%X$X%XOX$X%X%X%X%X%X%X%XVXCX%XVX%XVXVX%X%XVXCX-X%X-XVXCX%X-XCXVX-XSXVXVXVXSXVXSXVXSXVXSXVXVX%XSXSXVXVXSXVXSXSXSXSXVXSXSXSXSXSXVXSX%XSXSXVXSXSXVX%XSXSXSXSX",
+"~.~.~.~.~.(.~.(././.(.~.~.~.~.~.~.~.~.Q.~.^.^.Q.(.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.^.~.~.~.(.(.~.^.(.`._.'.`.`._.`.`.`.}.=X}.}. X}.}. X.X.X}..X}.}. X.X X X.X.X.X.X.X.X.X.X.X.X X X XXX X X X X X X X X X.X.X.X.X.X.X.X.X.X.X.X.X@X.X.X.X#X.XoXoX#X#X$X$X$X$X&X&X$X%XOX%X%X%X$X%X%XOX$X%X%X%XSX%X%XVXVXVXVXVXVXVX%XVX-X%XSX%X%XVXCX-X-XSXVXVXVXSXVXVXVXVXSX%XSX%XSXSXSXSXSXSXSXSXSXSXVXSXSXDXSXSXCXSXVXSXVXSXSXVXVXVXSX%XSXSXSXSXSX"
+};
diff --git a/images/scenario6hilite.xpm b/images/scenario6hilite.xpm
new file mode 100644 (file)
index 0000000..8e902ce
--- /dev/null
@@ -0,0 +1,450 @@
+/* XPM */
+static char *scenario_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"209 188 256 2",
+"   c #162C14",
+".  c #2E2C17",
+"X  c #282A28",
+"o  c #283729",
+"O  c #38342A",
+"+  c #3B3C3B",
+"@  c #363835",
+"#  c #312E2F",
+"$  c #1B1C20",
+"%  c #1C3D69",
+"&  c #183D73",
+"*  c #31324A",
+"=  c #233D6A",
+"-  c #253D67",
+";  c #2D3570",
+":  c #181D52",
+">  c #104E10",
+",  c #037A05",
+"<  c #0C6F0F",
+"1  c #394439",
+"2  c #31502F",
+"3  c #316A30",
+"4  c #26601C",
+"5  c #1C426B",
+"6  c #1B4267",
+"7  c #1C4572",
+"8  c #3B4442",
+"9  c #35514A",
+"0  c #22426B",
+"q  c #254169",
+"w  c #234371",
+"e  c #254874",
+"r  c #3E5A7D",
+"t  c #37547A",
+"y  c #2D4F78",
+"u  c #3A667C",
+"i  c #2C5B4E",
+"p  c #4B2C19",
+"a  c #46362A",
+"s  c #463B38",
+"d  c #553936",
+"f  c #513029",
+"g  c #69382F",
+"h  c #622418",
+"j  c #463C43",
+"k  c #523B4E",
+"l  c #4E3668",
+"z  c #474339",
+"x  c #56463A",
+"c  c #504F2F",
+"v  c #516C2F",
+"b  c #674737",
+"n  c #754838",
+"m  c #775637",
+"M  c #6A502F",
+"N  c #6E6D32",
+"B  c #4F5918",
+"V  c #434343",
+"C  c #484947",
+"Z  c #495548",
+"A  c #554945",
+"S  c #57534A",
+"D  c #575756",
+"F  c #4D4F53",
+"G  c #50506F",
+"H  c #526E4F",
+"J  c #4F6973",
+"K  c #664A44",
+"L  c #675548",
+"P  c #685A55",
+"I  c #754B44",
+"U  c #775548",
+"Y  c #735A54",
+"T  c #724D56",
+"R  c #776257",
+"E  c #6D6C4F",
+"W  c #666867",
+"Q  c #727370",
+"!  c #6B526B",
+"~  c #293399",
+"^  c #395A86",
+"/  c #2D5985",
+"(  c #37638A",
+")  c #376894",
+"_  c #3D6EA4",
+"`  c #425585",
+"'  c #44558B",
+"]  c #415885",
+"[  c #43588B",
+"{  c #48578C",
+"}  c #455690",
+"|  c #514F90",
+" . c #5151B0",
+".. c #476A81",
+"X. c #536A97",
+"o. c #49739A",
+"O. c #477BA6",
+"+. c #557BB3",
+"@. c #6F619C",
+"#. c #5757CE",
+"$. c #5E6CD8",
+"%. c #5D65D8",
+"&. c #586DC6",
+"*. c #5D63EA",
+"=. c #5C63F2",
+"-. c #7168D4",
+";. c #6365E6",
+":. c #6265EA",
+">. c #6A67E6",
+",. c #6366F2",
+"<. c #736DE7",
+"1. c #5C5DE3",
+"2. c #4637A3",
+"3. c #0B850B",
+"4. c #309A26",
+"5. c #00DB00",
+"6. c #0BDC05",
+"7. c #16D60A",
+"8. c #00E300",
+"9. c #03E901",
+"0. c #0AEF03",
+"q. c #27CE0A",
+"w. c #29CE0E",
+"e. c #25CD07",
+"r. c #24D604",
+"t. c #25DA04",
+"y. c #27D20C",
+"u. c #2FCB16",
+"i. c #2ED11A",
+"p. c #53912B",
+"a. c #52B727",
+"s. c #6C8E34",
+"d. c #6CAC33",
+"f. c #499C1B",
+"g. c #529251",
+"h. c #738873",
+"j. c #659A5C",
+"k. c #42C71D",
+"l. c #4EC624",
+"z. c #69D22F",
+"x. c #37A245",
+"c. c #3C99CF",
+"v. c #4D809E",
+"b. c #53829D",
+"n. c #4A83AA",
+"m. c #5584A6",
+"M. c #578AB4",
+"N. c #5A94B8",
+"B. c #4B8BB6",
+"V. c #628BA2",
+"C. c #679ABB",
+"Z. c #6C93B1",
+"A. c #73A1BD",
+"S. c #70A0BB",
+"D. c #758D8A",
+"F. c #439DD2",
+"G. c #489ED4",
+"H. c #5699C5",
+"J. c #4E97C7",
+"K. c #4BA1D4",
+"L. c #4BA3D7",
+"P. c #52A4D5",
+"I. c #54A5D8",
+"U. c #5BAAD9",
+"Y. c #58A8D6",
+"T. c #5BACD4",
+"R. c #669BC2",
+"E. c #6F9DC9",
+"W. c #63A4CC",
+"Q. c #69A6CB",
+"!. c #63ADDB",
+"~. c #69ADDA",
+"^. c #66AAD4",
+"/. c #65B0DB",
+"(. c #6BB2DD",
+"). c #68B4D9",
+"_. c #75A8C9",
+"`. c #74ACD3",
+"'. c #71B5DE",
+"]. c #74B8DE",
+"[. c #7AB9DD",
+"{. c #79B3D6",
+"}. c #78B0CE",
+"|. c #6CB3E0",
+" X c #67B5E1",
+".X c #73B6E0",
+"XX c #75B9E1",
+"oX c #7BBBE2",
+"OX c #7AB7E1",
+"+X c #67ADE0",
+"@X c #5EAAE1",
+"#X c #7BC0E4",
+"$X c #912D28",
+"%X c #895535",
+"&X c #8C6B39",
+"*X c #AB6934",
+"=X c #A25520",
+"-X c #875848",
+";X c #91554B",
+":X c #876658",
+">X c #976757",
+",X c #916B49",
+"<X c #8F716A",
+"1X c #A76957",
+"2X c #AF6F52",
+"3X c #AE726B",
+"4X c #9C5956",
+"5X c #D16E2E",
+"6X c #C87655",
+"7X c #CC7C63",
+"8X c #D67B66",
+"9X c #C37876",
+"0X c #E5736D",
+"qX c #E07F42",
+"wX c #BB312C",
+"eX c #8A6D91",
+"rX c #8A6DB0",
+"tX c #A57197",
+"yX c #856DC5",
+"uX c #847DE5",
+"iX c #889339",
+"pX c #9E9B2C",
+"aX c #999949",
+"sX c #8E9145",
+"dX c #8E8977",
+"fX c #90A648",
+"gX c #A99150",
+"hX c #B08C54",
+"jX c #A79F6B",
+"kX c #C88359",
+"lX c #D48165",
+"zX c #E08960",
+"xX c #D3B338",
+"cX c #8E8F8E",
+"vX c #ACADAE",
+"bX c #98A29D",
+"nX c #82B9D9",
+"mX c #8AB4CA",
+"MX c #81BDE3",
+"NX c #87BCE4",
+"BX c #9193EB",
+"VX c #8EC3DB",
+"CX c #84C0E5",
+"ZX c #8BC4E5",
+"AX c #8CC5E8",
+"SX c #89C5E7",
+"DX c #90C6E8",
+"FX c #93C8E7",
+"GX c #9ED0EE",
+"HX c #A9D3E8",
+"JX c #B6D9E8",
+"KX c #A9D0EA",
+"LX c #ACD0D8",
+"PX c #C8E4EF",
+"IX c #C9D9E3",
+"UX c #A8C9A3",
+/* pixels */
+"K.G.G.K.K.K.K.K.K.P.L.P.P.G.P.P.P.P.P.K.P.G.P.P.P.P.K.I.I.P.I.P.Y.P.P.P.P.P.P.U.I.U.U.U.U.!.!.U.!.)./.(.(.(.|.(.'..X.XXXXXOXXXOXoXXXXXXXXXXXXXXXXXXXXXXXOXoXoXoXoXoXoXoXCXoXoXoXOXoXXXOXOXXX[.OXXX[.].XX]..XXX.X].]..X.X.X|..X(.'.].|.'.|.(..X(.(.|.(..X(.]..X.XXXXXOX.XOXXXXX|.XX.X.XXXXXXXXXOXXX.X.X.X.X.X|..X'.(.|.(.(.(.(.(.(.|.(.|.(.(.|.).|.|.(..X'.].]..X.XXXoXoXoXOXoXoXoXMXoXMX[.CXMXoXCX[.[.CXoXoX#XCXMX[.#XoXoX#X#XCX#X",
+"F.K.K.G.K.K.K.K.K.L.L.K.K.P.J.P.K.P.I.K.P.P.P.I.P.P.P.I.I.I.I.I.I.I.P.U.I.Y.U.I.U.U.U.U.U.!.!./.!.)./.(.(.(.(..X.X.X.XXXXXXXoXXXoXoXXXoXXXoXXXOXOXXXXXXXoXXXoXoXoXoXoX#XoXoXCXoXoXoXoX[.].XXXXOXXXXXOX].XX[.XX.X.X'.]..X.X].].|.'.|.|.'.(..X'.(.(.].(..X].]..XXXOXXXXXXXXXXXXXOX.XXX.X.X.X.X.XXXXXXX.XXX.X|..X|.|.(.(.(.(.(.(.(.(.(.(.(.|.(.(..X.X(.(.|..X(.]..X].oXXXoXoXoXoXCX#XMXMXMXCXoXoXCXCXoX#XoXoXCX[.#X#X#XnXoX[.CXoXoX[.",
+"F.G.G.K.c.K.K.K.P.K.L.L.K.K.K.P.K.P.P.P.K.I.I.I.P.P.P.P.I.I.P.P.I.P.P.P.P.I.Y.U.U.+XU.U.!.U.U./.!.!.(./.(.(.'.]..X.X.XXXOXOXoXoXoXoXoXoXoXXXXXXX.X.XXXoXXXoXXXoXoXoXoXoXCX#XoXoXoXoXoX[.XXoXoXXXXXOX].]..X[.XX.X.XXXXX.X.X.X.X.X].(.'.'.(..X.X(.'.(.(.|..X.X.XXXOXXXXXXXXXXX.X.X.X.XOX.X.XXXXXXXXXXX.X.X.X.X.X(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.|.|.(.(.|..X|..X|..XXXXXoXoXoXoX#XoXoXMXoXCXoXCXCXoX[.oXCXoXCXoXoXCXoXoX#XCX#XoXCXoX#X",
+"G.F.G.G.K.K.K.K.K.G.G.L.P.K.P.K.P.P.P.K.I.K.I.K.P.P.P.I.I.P.P.P.I.I.P.Y.I.Y.U.I.U.U.U.U.U.U./.!.!.(.~.(.(.(.(..X].XX.X].XXOXXXoXoXoXoXXXoXOXXXoX.XOXOXXXoXoXoXoX[.CXoXoX#XoXMXoXoXoXoXoXoXoXoXoXoXXXOXoXOX.XXXXXXX.XXX.X.X.X].|..X.X'.|.'..X(.'.(.].].].'..X.XXX.X.XXXXXXXOXXX.XXXXXXXXXXX.XXXXX.XOXOX.X'.].|..X'..X'.|.'.|..X'.'.|.'..X'..X'.|..X.X.X].]..XXXXXXXoXXXXXoXoX#XoXoXoXMXoXMXCX[.CXCX[.[.CXoXoXnX#XCXnX[.#XnXoX#XnXnX",
+"K.c.K.c.K.K.K.c.G.K.K.K.K.K.P.K.P.P.P.P.P.P.P.P.P.P.P.I.P.Y.P.Y.Y.P.I.Y.Y.I.U.U.U.U.U./.U./.!.!.!.!.!.(.(.(.'.]..X.X.XXXXXoXoXXXoXoXoXoXXXoXoXXXXXOXoXoXoXoXoXoXoXoXoX#XCXoXCXoXoXoX[.#X[.oX[.oXXXoXoXXXOXXX[.].XXXXXX.X]..X]..X(.].(..X.X(..X(.'.(.(.'..X.X.XXX.XXXXXXX.XXXXXOXXX.XOXXXXXXXXXOX.X]..X.X.X.X'..X|..X(.(.)..X.X.X.X'..X(..X'.|.]..X|..X]..X.X].XXXXXXoXoXoXoXCXoXCXoXMXoXMX[.MX[.[.MX[.CXCX[.CX[.oXCXoXoXCXoXoXCXCX",
+"c.K.c.K.c.K.K.K.G.G.G.L.K.K.K.K.P.G.P.G.P.P.I.P.P.I.P.P.P.P.Y.I.Y.I.I.I.Y.Y.U.U.U.U.U.U.!.U.!./.(.(.(.(.(.'.(..X.X.X.XXXOXXXoXoXXXoXoXXXXXXXoXOXoXXXXXoXoXoXoXoXoXCXCXCXoXnX#XoXoXCXCX[.CXoXoXoXoXOXXXoXXXOXXXXXXXXXXX.X.X].|.'.|..X.X(.(..X(..X.X'.'.'.(..X.X].XX.XXX.XXXXX.X.XXX.XOXOXXXOXOXXX[.XX].]..X.X.X.X.X].]..X.X.X.XXX.X.X]..X.X]..X.X.X.X.X].].].XXXX[.oXoXoXoX[.#X#X[.MXoXCXoXCXoXMXCXoXCXoXoXCXoXCXCXCXCXCXoXCXCXoXoX",
+"K.c.K.c.K.c.F.F.G.G.K.K.K.K.L.L.G.K.P.P.P.P.I.K.P.P.Y.P.P.P.P.Y.I.Y.I.U.U.U.U.U.U./.U./.!.!.!.~./.~.(.(.(.(.'..X'..XXX].XXOXOXoXXXoXoXoXoXoXoXOXXXoX#XoXoXoXoXoX#XnXCXoXCXoX[.CXCXoXoX#XoXCXoXoXoXoXXXOXOXXXXXXXXXXXXX.X.X.X.X'..X(.]..X.X'.'.|..X'.'..X|.]..XXXXXXXXXXXOX.X.XXX.XXX.XXXOXoXOXXXOXXX].XXXX.X.X.X.X.X].].]..X]..X.XXX.X.X]..X.X.X].].].].].OXOXOXoXoXoXoXoXCXoXoXCXoXnXoXMXoXMXoXMXCXoXCX[.CXCXCXCXoXCXCXCXCXCXCXCX",
+"c.K.c.K.c.K.F.F.G.K.G.K.L.K.L.L.P.P.P.P.P.P.P.P.P.P.P.P.P.Y.P.P.I.U.I.U.U.U./.U./.U.+XU.!.!.!.~./.(.(.(.'..X(..X.XXX.XXXXX].XXOXoXXXoXoXXXOXXXXXOXoXoXoXoXoXoXCX#XCXoXCXoXCXCXoXoXCXCX#X[.oXoXoXoXXXoXoXXXoXXXXXXXXXXX.X]..X.X'.'..X.X'.'..X.X]..X.X.X.X'.'..X].XXXXXXXXXX.X.XXXXXOXOXOXoXXXoXXXXX].XXXXXXXX.XXXXX.X.XXX.X].[.XXXXXXXX].].].XXXX.X].[.XXXXXXXXoXoXCXoXoXoX[.oX[.oXCX#XMXnX#XMXMXCXoXCX[.CXoXCXoXCXCX#XCX#XCXCXCXCX",
+"F.F.F.F.F.F.F.F.F.SXFXGXHXHXHXGXHXKXKXKXKXKXKXKXKXFXFXNXP.P.Y.Y.Y.Y.U.U.U.U.U./.U.U.!.!./.U./.~. X|.|.|.(..X.X.X.X.XXXXX.XXX.XOXXXoXXXoXoXoXoXoXoXoXoXoXMXoXoXoXoXCXoX#XnXCXoXCXCX#X[.#XCXoXoXoXoXXXOXoXXXOXXXXXXXXXXXXX.X.XXX'.'.'.'..X.X.X.X.XXX.X.X.X.X'..X'.XXXX.X.X.XXX.X.XXXXXoXXXoXXXoXXXOXXXXX[.[.].XXXXXXXXXXXXXXXXoXXXXXXXXXXX].].XXXXXXXXXXoXoX].oXoXoXoXoXoXP.~.`.[.[.nXCXnXCXnXCXnXnX[.[.[.`.^.J.#XCX#XCXCXCXCXCXCXCX",
+"K.c.F.F.F.F.F.F.SXGXHXJXJXPXPXPXPXPXPXPXPXPXPXPXPXJXKXFXNXY.Y.Y.Y.!.U.U.T.T.T./././././.!.+X+X~.~.+X|.~.|.]..X.X.X.XOX.X].].OXXXOXOXXXoXXXoXoXoXoXoXoXoXoXMXoXMXoXCXCXCXMXMXCXCXoXnXCXCXoXoXoXoXOXoX].oX[.XXOXOXXXOXXXXX.X.X.X.X.X'.'.'.]..X.X]..XXXXX]..X].[..X.XXXXXOXOX.XXXXXOXoXXXXXOXoXoX[.OXoXXXXXXXXXXXoXOXOXoXoXXXXXoXXXOXXXoXXXOXXXoXXXXXOX[.oXoXoXoXoX#XMXMXI./.[.VXGXHXJXHXHXHXJXHXHXHXJXHXGXFX{.).P.CXVXCXCXCXCXCXCXCX",
+"L.F.F.F.F.F.F.F.FXKX6 6 q - - = = = - = % 0 = = = % q GXDXU.I.I.U.U.U.U.+X X@XU./.U.!.!././.).~.).(.(.(.(.(.(.(. X.X.X.X]..X.X].XXXXoXXXoXXXXXoXoXoX#XoX#XoX#XoXoXoX#XoXoX#XCXoXoXoXoXoXoX#XXXoX].].[.XX].].XXXXXXXX].].].|.]..X].].]..X'.].]..XXX].XX].].].]..X].].].].].].].].XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#XoXoXoX[.[.XXXXXXXXXXXXXXXXoXXXoXoXoXoXoXoXoX#XU.`.5 6 q q 0 = = q 0 5 = 6 - q 6 % e {.T.CXCXCXSXCXCXSXNXCX",
+"F.F.F.F.F.F.F.F.GXJX6 q = q q % 0 0 0 0 6 0 6 0 = 0 6 HXAXY.I.U.U.U.U.!.@XT.U././.!.!.!.!.)./././.~.'.(.(.'.].'.]..X.X].XXXX].OXXXXXOXXXOXXXoXoXoXoXoXMXMXMXMXMXMXnX#XCXoX[.#XnXoXCXoXCXoXoXoXoXoXOXOXXXOXXXXXOXXXOX.X.X.X'..X.X.X].OX.X.XXXOXXXXXOXXXXX.X.X.XXXXX.X.X.XXX.X.X.X].XXOXXX[.XXOXoXoXoXOXoXOXoXoXoXoXoXoXOX[.oXoXoXoXoXOXoXoXoXoXOXoXoXoXoXoXoX#XoXoXCXCX^.MX0 q q 0 q 0 % q q - - - q 0 0 0 6 FX^.CXCXCXCXSXSXCXSXZX",
+"K.c.F.F.F.F.F.F.GXPX6 q 0 0 = = 5 0 0 5 % 0 6 0 6 - q GXVXU.T.^./.!.T.!.^.^.!.).!./.!././././. X).(.(.|.'.|.(..X]..X]..X|.].XX.XXXXXXXoXXXoXoXoXoXoXMXoXoXoXMXMXCXoXoXoXoXoXoXoXoXoXoXoXoXoXXXXXXXoXXXXXXXXXXXXXXXXXXX.X.X.X.X.X.X.X.X.XXX.X.XXX.XXXXXXX.X.X.X.XXX.X.X.X.X.X.XXX.XXXXXXXXXXXXXXXXX[.XX[.oXoX[.oXoXoXoXoX[.oXoX[.oXoXoX[.[.oX[.oXoXoXoXoXoXoXoXoXoXoXoX^.nX6 q = w 0 0 0 q q 0 0 q 6 5 5 0 q FX{.CXCXSXCXSXNXSXSXZX",
+"K.F.F.F.F.F.F.F.GXPXq = 5 & 9 G 0 0 % 0 q % q 0 = - q KXFXY.Y.I.U.U.U.U.U.U.U.U.U././.!./.~./. X(.~.|.+X~.'.'.|..X|.|..X.X.XXXOXOXXXOXXXXXoX#XoXMXoXoXoXMXoXMXoX#XoXoXoXoXoXoXoXoXoXoXoXoXXXOXoXoXoXoXoXXXoXXXXXXXXXOX.XOX.X.XOX.X.XXXOXOX.XOXXXOXOXXXXXXXXXXXOXOXXXXXOXXXXXOXXXXXXXXXOXXXoXoXoXoXoX[.oXoXoXoXoXoXoX[.oXMXoXoXoXoXoXoXoXoX[.oXoXCXoXoXnXoXoXoXMXoX[.#XT.{.7 6 % q - q 6 6 % q 6 6 q = w % e LX].SXZXCXZXCXZXZXAXZX",
+"c.F.F.F.c.F.F.F.HXPX7 = 6 q PXPXPXPXPXPXPXPXPXJXPXKXKXAXnXU.U.U.U.U.U.U.U.+X!.!.!.!.!.!.(.~.). X X(.(.(.|.|.|..X|.(.].].|.'.].].XXXXoXXXXXXXoXoXoXoXoX#XMXoX#XoXoXoX#X].oXoXXX[.#X].oX[.[.].XXXXXX].].].XX].].]..X].].XX].].XX'.'..X.XXX].].].XX.X.X].].].].XXXXXX'.].]..XXX].].].XXXX.XXXXXXXXXXXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX[.[.XXoXoXoXoXoX#X#X[.[.#XoX#X#X[.nXP.~.{.FXHXHXHXHXJXKXJXJXPXIXPXq = q % HX[.SXSXCXCXZXZXZXAXDX",
+"K.F.F.F.F.F.F.F.KXPX& e 6 q PXPXIXKXKXKXGXKXKXKXKXFXFXCXU.T.U.U.!./.U.!.U.!.!.T.T.^.).!././.(.).(.(.(.'.(.'.'.~..X(.].(.].].'.].XXOXOXXXoXoXoXoXoXoXoXoXoXoX#XoXoXoXoXoXoXoX[.[.[.#X].[.oXXX[.XXXX].#X].].].XX].XXOX.XXXXX.X[.].[.].[.].].].[.XXXXoXoX].oXOXXXOX[.].XX[.].OX[.].].XXXXXXXX[.oXXX[.oXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX[.oXoXoX[.#X[.#X#XCX[.#XoXCXoXCXJ.^.Q.'.[.}.[.[.OXnXnXFXJXPX- 0 0 = LX{.CXAXAXZXSXZXAXDXDX",
+"L.F.L.F.F.F.F.F.KXPXq = = y PXJXP.G.L.L.G.G.H.J.O.} } ^ } [ [ [ { [ [ [ [ [ ' ' ' { [ [ ^ } } [ } } } ^ [ } } ' } } ^ ' [ } [ [ } } } } [ } } { [ [ [ } } [ } } [ } ' } } } } { [ { { { [ [ ' { [ } [ ' [ [ } [ } } } [ } [ [ [ { ' } [ { { [ } [ [ } } } [ } [ [ } } [ } [ ' ' } } } [ [ ' [ { { } { } { } } { } } { { { } { ' [ { } { } } { { } [ [ [ [ [ ' [ [ } [ [ { ^ } +.Z.{.NXNXSXMXCXSXVXJXq 0 6 0 LX{.SXZXAXAXAXDXDXAXFX",
+"G.F.F.F.F.F.F.F.KXPXw = 6 e PXHXJ.G.K.K.J.o.} ' } } ' ' } { { { ' ' [ { ' ' ' ' ' ' { } ' ' } { { ' } ' ' ' ' ' { } } ' { { } [ } [ ' { { { { { ' ' { ' { { ' ' { { ' ' { { ' { ' ' ' { ' ' ' ' ' { ' ' { ' { ' [ { ' ' { { ' ' ' ' ' { ' ' [ { { } ' ' { ' ' { ' { { { ' { ' ' ' ' ' { ' ' { { { ' ' ' { ' { ' { ' ' { ' ' ' ' ' { ' ' { ' { } ' { { { { { { ' ' { ' ` ' { ' ' } ' } `.SXMXSXCXnXJX6 6 0 7 LX'.SXAXAXAXAXAXDXFXDX",
+"F.G.F.F.F.F.F.F.HXPX6 = 0 0 JXHXG.G.F.J._ ^ | ^ ^ ^ G ..r r ^ r r r ^ G ^ r r r r r r r r r r r r r r r r r r r r r r r r r t r r r r r r r r r r r r t r r r r r r r r r r r r r r ^ G ^ r r r r r r r r r r r r r r r r r r r r r ^ r r r r r r r r r r r r r r r r ] r r r r r r ^ r r r r r r r r r r r r r r r r r r r J ^ r r r r r r r r r r r r r r r r r r r r ^ G J ^ ^ ` [ o.E.DXMXCX#XLX0 e q = LX'.ZXAXAXAXAXDXFXAXDX",
+"G.F.F.F.F.F.F.F.HXPXq = 0 0 IXGXF.P.B._ } } { ..x.u.7.t.t.t.t.t.t.t.t.t.t.t.r.t.t.t.t.t.t.r.r.r.r.r.t.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.t.t.r.t.t.t.t.r.t.t.t.t.t.t.r.t.t.t.r.t.t.r.t.t.t.t.t.r.r.t.t.t.t.t.r.t.r.t.t.t.r.r.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.t.t.t.r.t.r.t.t.r.t.t.t.r.t.t.r.t.r.r.y.t.t.t.t.t.r.t.t.t.r.t.r.t.t.t.t.r.t.t.t.r.t.t.r.x.g.X.^ [ X.E.AXAXXXLX6 0 0 = LX].SXAXAXAXDXDXFXAXFX",
+"G.G.F.G.F.F.F.F.HXPX0 e % q PXKXL.B.O.^ | ' g.u.r.t.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.w.g.u { ^ X.E.NX'.HX6 0 q = HX{.ZXAXDXAXDXAXFXFXDX",
+"G.F.F.F.F.F.F.F.HXJX- = 6 q PXGXG.o.' { ..J u.t.t.t.t.t.t.t.r.t.t.r.t.r.t.t.t.t.r.t.t.t.r.t.t.t.t.r.t.t.t.t.t.t.r.t.r.t.t.t.t.t.r.t.t.t.r.t.r.t.t.t.t.r.t.r.t.r.t.r.t.t.t.t.t.r.r.t.t.t.t.t.r.t.t.r.t.t.t.t.t.r.t.t.t.r.r.t.t.t.r.t.t.t.r.t.t.t.r.t.t.t.r.t.t.r.t.t.t.r.t.r.t.r.t.r.r.t.t.t.r.t.t.r.t.t.t.t.r.t.t.r.t.t.t.t.t.t.t.r.t.t.t.t.t.r.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.r.t.r.x...| } X.NX].LX6 0 - q LX].ZXZXAXAXDXAXDXFXDX",
+"G.F.G.F.F.F.F.F.HXPX= w 5 q PXKXJ.} ' ' J i.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.t.t.t.t.t.t.7.g.{ ' ^ nX`.LX6 e = - KX].ZXAXAXDXAXFXDXDXDX",
+"G.G.G.F.F.F.F.F.HXPX0 = 0 w JXGX_ | ` { x.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.r.7.u.g.' } Z.`.KX5 0 0 6 GX.XZXAXAXAXAXDXDXDXDX",
+"G.G.G.G.G.G.G.F.KXJX= q 0 0 JXFX^ [ ) g.y.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.t.r.e.r.e.t.r.e.r.r.7.r.r.t.t.t.y.t.t.t.t.t.t.t.t.y.r.r.t.t.r.r.t.t.r.t.r.t.r.r.t.t.t.t.t.t.r.r.r.t.t.t.t.t.r.t.t.t.r.r.t.t.t.r.t.r.t.r.r.t.t.r.t.t.t.t.t.t.t.t.t.t.r.r.r.y.r.r.t.t.t.t.t.t.t.r.r.t.y.t.t.t.r.r.t.t.t.t.t.r.r.r.t.t.t.t.t.t.t.t.y.t.t.t.t.r.t.r.t.t.t.t.t.t.t.r.t.t.t.t.t.t.r.r.t.a.^ ` O.`.VXq 6 0 q FX).ZXDXZXAXZXDXFXFXDX",
+"G.G.G.G.G.G.G.G.GXJXw - 0 = JXVX} } [ x.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.aXgXgXgX3 2 pXv v v 3 H Z 3 v 3 3 H H 3 3 Z H 3 3 v v i aXE 2 3 4 o v 2 N N 4 &XpXE v Z 3 3 sXhXgXgXgXgXgXgXgXgXgXgXgXhXE 2 2 > B B N d.d.a.a.gXgXgXgXgXgXgXhXgXD.+.&.+.+.+.+.&.+.M.+.+.+.M.&.+.M.+.+.+.+.+.+.+.+.&.+.M.+.+.&.M.+.+.+.+.+.+.+.+.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.` ' ' Q.mX6 q q q mX).ZXZXDXDXZXZXZXDXDX",
+"G.G.G.G.G.G.F.F.FXKX0 q 6 = GXnX} [ X.u.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.x P x 2XcXQ V V A * *XK 8 F + V C 1 *XM b a ,XP 8 F + 8 2XP D Q C V Q C M <XcX+ 2X:Xs c b @ D P P 1X8X7X7X8X7X7X7X7X7X8X:XQ D # xXzXm 9.9.9.6.E D $X$XlX8X7X7X7X;.;.>.;.;.;.;.;.:.:.;.;.:.:.;.;.:.:.;.;.:.:.:.;.;.;.:.:.;.;.;.;.:.:.:.;.;.;.,.:.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.` ' { N.}.6 7 6 5 }.L.ZXZXZXSXFXAXDXFXDX",
+"G.G.G.L.G.G.G.G.ZXGXGXHXKXGXGX`.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.y.H W z 4XR z a @ dXQ z z W W z @ <X@.1 M bX@ %XL D Q C + P S C D A + D x *XR F s ;XR c z.gX$ X # * >X8X7X7X7X7X8X7X7X7XzX-XD A . xX2XN 8.5.8.s.k #.! -X,X4 b M tX;.;.;.;.;.;.;.;.:.:.;.;.;.:.;.;.;.;.;.;.:.:.;.;.;.;.:.:.;.;.;.;.:.:.;.;.;.;.;.:.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ' ^ n.H.).'.OX`.T.L.ZXZXFXFXZXFXAXFXFX",
+"K.K.K.G.G.G.G.G.K.VXSXVXmXFX[.J.^ { X.y.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.Z D x L z + V C D C a * F D x s D C a O 3XO %XY C D z 1 c Z 1 @ V j + z S C s V S D a s.&X@ W Q @ P b -X* -XlXkX6X6X7X7X2X1XI X * @ c y.5.9.s.* ~ 2.f c h.;XK >.*.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.( ' ' Z.B.H.T.Y.K.J.SXDXSXFXSXFXAXAXFXFX",
+"K.K.K.K.G.G.G.L.G.G.G.L.K.L.L.J.' } X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.-Xz 1 C 2 D 1 8 # 1 X C 1 @ 1 c 1 + z + + z P S # # =Xm C 2 D 9 E s.,XM L F V >X3X3X2X%Xx o 3 2 @ F x 3Xl -XsX,XaXdXsX8X7XzX>XC Q D U kX7.9.s.* # j # 1 j.H i ,.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ' ' Z._.nXVXAXAXSXFXSXSXSXFXAXAXFXAXFX",
+"K.K.K.G.K.G.G.K.K.K.L.K.L.P.P.J.^ { X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.L C *Xx H D.H # W W z 1 x V *XM V V *Xx Z + ;XS Q D.V 4XP Z h.H f.0.n k * + A D cXjX9X>XD V 1 @ C Z F Q Y ;Xs.eXUXj.,X8X7XlX:X8 D S -X0XhXi.E * eXcX9 1 2 H G =.:.;.*.:.:.*.:.;.;.;.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.^ [ { V._.nXVXZXDXZXAXSXFXAXAXFXAXFXFXFX",
+"K.K.K.G.K.K.G.K.K.K.L.K.K.P.G.J.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.h.W x V 2 g.3 s D D x + D.Q z z eXQ s D Q V 1XY F Z f 1XY 1 g.H 4.6.! -.| @ A | jXgX- 3 O @ s K : @ Z 1 s L N cXUXa.,XlXlX3XD C + b 2X8X8XlX1X* ~ ~ * Z vXvXK -.-.<.-.-.-.-.-.-.-.;.:.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.G { ^ V.A.nXVXZXSXAXDXSXAXAXAXAXFXAXFXFX",
+"K.K.K.K.K.K.K.K.K.P.G.I.P.P.G.J.' ' X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.H C a C @ o 1 c 1 @ + V D C a * D A a @ D d 1XR X + O A D -X*X4XfXk.G ~ ~ + A y ~ ~ u j.$X8 K 3XG I I A X * v h.dXH v I U A V ,XU P P >XlXlX>X@ O f O 8 eXW . %X-Xa a s f -X:XA @.jX-.>.*.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.:.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.` ` ` V.A.nXVXAXFXAXAXZXAXFXZXFXAXFXFXFX",
+"K.F.K.K.K.K.P.K.P.J.L.L.L.P.P.J.[ ' X.y.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.o z X V C S 1 z z j *XL # o =Xm # # =Xa @ . 1XL D Q C + F P Y Y P Y   > . + V 9 i i 4 bXH 1 D W Y %X;X3XG * Z 2 2 v C C C C K m m Y F S 1XlX<Xs l.fXg S p.N O >XW @ D Q # %X<X; D.xX@.3X-.-.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.>.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.^ [ ' V._.mXZXAXAXAXAXDXZXFXAXAXFXDXZXFX",
+"K.K.K.K.P.K.K.K.K.J.P.L.G.P.P.J.' ' X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.W W s + W W + @ cXQ z s cXQ C z D.Q z P Q V 4XY F D x z >Xx v d @ j g.dX$X+ A b k d   <   2 a b s n :XQ Y s j C C * V C V X S A O C :XR F 1X1X@ N iXs R k.s.j R b $ 9 3   g %XF ~ ~ ~ m -XI >.*.;.;.;.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.,.,.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.] ' ' V.A.nXZXDXDXAXDXAXZXDXAXAXDXDXAXFX",
+"K.K.K.K.K.K.P.K.K.P.P.G.P.G.P.J.[ ' X.w.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.Z D x 8 F D x z D A s + D S O + D A a 1 D A 2XP 8 + @ Z 3XN l.,Xj F 4 bX3 @ M m d.,X3 jX$X* d 1XQ ;XR J <Xy S Q S @ F Q D # Q D X C >XlXR D P C j j + S Y L C * @ @ 1 + + j j 8 i i @ f.d.4X@.-.>.:.*.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.<.E.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.' ' ' V.A.nXVXAXDXDXDXZXDXAXAXAXFXDXFXFX",
+"K.K.K.P.P.L.G.P.P.K.P.K.P.P.P.J.^ { X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.o # $ z V @ * c 1 1 1 c @ + V c 1 + s * + + P S F D >XP 2Xm s.&Xz F U ,X,XL S b v ,X> bX3 2 d n %X;XeXcXxX; Z D A s C D A O W S a z x U L z s A b b d z s + C x x b * O D V o # x ,Xj N aXg I I qX-.>.,.=.=.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.] { ' V.mXnXCXAXFXAXDXDXDXDXDXFXDXFXFXFX",
+"K.K.J.P.P.P.P.P.P.P.L.P.P.K.P.J.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.E cX@ 1 z Z o x 1X3X2Xx z 8 *Xm >Xx x d C >XC C + C 3XR P x s * c Z R R :XD + S A s + 1 9 9 C V z S | ~ ~ ~ R %X%XR @ @ # f a # d K Y 1X2XR + g # . c M O + c M f 3X| * F C D Q 2 4 9 > > > bXC P @.i ~ 2.2.2.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.' { ' V.A.mXZXFXAXDXDXAXDXDXDXDXFXFXFXFX",
+"K.K.P.K.P.P.P.P.P.P.P.P.K.P.P.J.' ' X.w.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.c 3Xs * 3 a.4 A kXlXlXA Q Q z S 2X:XjXa z 2XR Q C 1 2XP + F V ;XL O x d 8 >X-XM x A Y 2Xb K X * >XE R :X9 9 K %X%XA C Q D # ;X2X2X>X:XzXzX>XV 3X| $ a.fXK s a.fXg Q ,Xs F z 3 9   v Z 3 3 2 W s * E S * @.v ~ ;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.^ ' ' V.S.mXZXFXFXAXDXDXDXDXDXDXDXDXFXDX",
+"K.K.K.K.L.P.P.P.P.P.P.P.K.P.P.J.[ ' X.y.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.o O =Xx < E 4 C 3X:XR A W F a * P x dXs 8 3XP D x z 3XP D W z 1XR c z.sXj P R S S C x 2X;XtX; @ 3X:XD K z F C Z F C C D L O D R R L S R Y P Z Q :XO N sXd s N sXf C V j S O X   8 X s D o Z + + V v i G Q D ~ =.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ' ' V.mXmXVXFXFXFXFXDXDXDXDXDXDXDXDXFX",
+"P.P.P.K.P.P.P.P.P.P.I.L.I.P.I.H.' { X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.dXW S A X X =XL 2XD j * =X. V 1 8 1 s 1 F P V @ 1 C 3XY Z D S 1XY c iX&Xs :Xz X X V C 1X:XQ -Xs 1X7X1XK Y 6X<XdX*X&X@ X h %XO x F @ L f d + Z C + @ j s 1 c C j C Z 4 p.s.I 1 h.h.> j.h.2 + 1 D @ 3 > | W F ~ yX=.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ^ ' V.A.nXZXGXFXAXGXFXAXFXDXDXDXGXSXDX",
+"L.J.K.P.P.P.K.P.P.H.I.L.P.P.P.J.' ' X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.H F @ @ cXW x A 2XS Q Q a H h.H + C C + @ C + C $X*X=XS 1 @ + L D s j 1 C R S ! Q @ A 1X2X&X%XY D R :XK S *XcXcX2X*XF bXZ M g >X<X+ Y N s.d R 3X2X3X1X3X>X2 < 3 3 , > s.iXd 1 H g.o H g.2 * j.h.2 * i ; : ; l qX-.1.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ' ' V.A.mXVXAXFXFXFXFXFXFXFXDXDXAXAXFX",
+"L.K.K.P.K.P.P.L.P.P.K.P.P.Y.P.J.^ { X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.=XQ ,X=XR F O C 7XS W A O 2 g.3 + W W z C W z s wXxX4Xd >X3Xz F 1 C o D 1 * 1 3 2 + V L :XY R P S d d @ :X*XcXdX2X,XC W z a f n %Xs L M M d >X2XR R :X:XY 9 3 9 3 3 2 1 J dXy > 2 > < > -X8 H g.2 C Q W . cXC n rX=.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.[ ^ ' V.A.VXVXAXGXAXFXFXGXAXAXDXDXFXAXSX",
+"K.K.K.P.K.P.P.P.P.P.P.P.K.L.K.H.' ' X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.aXcXdXkX%XO @ + Y F X X =X. 1   @ F D z V W A V wX=XwXK 3Xn 2 h.H o Z h.H 2 z 2 @ C V 9 X.h.G Z I N s.f 1XkXL c ,X%X@ O a d x z s 8 P P P x S P S d d 4 4 k # @ k k # - D.xXy < z 2 > o R 8 o 1 j C D H a W A d 9XyX,.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.^ { ' V.A.nXAXFXAXAXGXFXFXAXFXDXDXDXDXDX",
+"P.K.K.K.P.P.P.P.P.P.P.P.K.P.K.H.' { X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.,XcX<X6X*XY W j M m <XQ a H h.H + # $ %Xa # X j c c c Z 3X. X j.H + 9 g.g.@ o D z 8 A | jXjX^ S I M M O >XzX1XM m L 8 A A S P 8 2 + @ R 1XM R :XI N iX. > 3X| * s 3X| * ~ #.~ < k 2X| * 8 x P 1 4 C + * + # O s n N ; 1.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.' ' ' V.A.VXVXAXGXSXDXDXDXFXFXDXFXDXDXDX",
+"K.K.K.P.K.P.P.K.P.P.L.I.P.P.K.J.^ ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.sXA K 6X6XD ! d 2X6XW S X 2 j.3 @ Q Q x P W V 8 x d C C I a . . c L X   h m 9 h.g.o b ~ ~ ~ ; D S L Y 1 S -XD :X3X1XU o 3 V s B x.W 1 :X&Xb c z L M M 4 < <X,Xs C Q >X@ < < < < C Q >Xx V ;XdX. 4 D 2 4 < 4 C 8 x.4.2 rX=.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.^ ' ' V.A.nXVXAXGXFXFXGXFXFXAXDXDXDXDXDX",
+"H.P.K.P.K.P.K.P.L.P.K.P.K.Y.L.H.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.kX*XpXpXfXp.v v sXhX4X;X4X;X-X%XA W D s 8 D A + >X1X1X>X>X1X1X1Xn C W cXc S 1 j.H + z E E :XP :X3X>X3XL U >X1Xs.fXzX4X+ UXUXB N 3.v s :XN j.3.o D Y P S 2 C z V C 8 z z 3 3 3 c C C z V V g -Xp J h.> > 3 > x o 4 E v 7X-.;.>.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.` ^ ' V.A.mXFXFXDXDXDXSXFXFXFXDXDXAXAXAX",
+"P.P.K.K.P.P.P.P.P.K.K.P.K.L.K.J.' { X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.hXy.8.8.9.9.0.9.9.7.fXaXaXaXfXaXs.v v v N ;X%X>X7XlXlX8XlXlXlXlXI 8 D W a 1 1 o 2 C S I &X%XS L -X-X-Xn 2X0Xd.0.6.hXI s eXH 3 K # 1 * 1XN 3 v 2 R I z 2 X x K L U x * X x 1 X j x * Z 3 C s A # H g.2 W eX2 x + . $ $ 6X8X-.*.;.;.;.;.;.;.;.:.>.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.y.^ ' ' V.S.nXVXFXDXDXDXAXFXAXFXDXAXFXAXZX",
+"P.K.P.K.P.P.K.P.G.P.L.P.G.P.K.J.{ ' X.y.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.l.9.5.5.6.6.6.6.5.5.8.8.5.8.9.9.9.9.9.9.7.gXlXlX7X7X7X7X7X7X7X8XU C 1 @ z C F V 8 %X,Xs x @ @ V U 1X4X3XaXd.fXkXkX1Xd s @ o 8 P s.>XR D S c %Xb <X&Xg.4.  a.d.%X%X1X| $ g.4.  @.cXk 2 < 1 > 3 A s 1 X g.g.2 x C 1X@.j 8X8X8XuX=.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.` { ' V.A.nXVXZXFXAXFXFXFXFXDXAXFXFXAXAX",
+"P.P.P.P.P.P.P.P.P.P.L.I.G.P.K.J.' ' X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.8.5.k.kXhXhXlXk.5.5.5.5.y.hXkX7Xl.5.5.8.y.8X8X7X7X7X7X7X7X7X8X-XL P V C %Xm W D.x x F Q F @ A 1XlXgXa.0.sX8XgX8X8X;XK <X1X3X1Xi.,XT p @ P :XR P c 3 s.  N M %X4XQ <X. 3 s.  ^ 2.* 3 j.;XO , 4 < 3 S o z g m C Q >Xb Y 2.! | 2.*.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.^ ' ' V.A.}.VXZXFXAXDXSXFXAXFXAXAXAXAXAX",
+"P.P.P.P.P.Y.K.P.G.P.G.P.K.K.K.J.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.8.u.7X8X8X7XaXu.5.5.5.5.i.0X7XaXu.5.5.5.6.gX0X8X8X8X7X8X8X8X7XkXI C W Q x x D P s @ F W S z C 4Xd.8.5.8.lXgX9.d.aXgX4X-X2X-X%X1X:X .:Xs 8 X X + V @ s 1 A Y Y P V s s o z @ * * + @ j.h.4 %X=Xp 2 j O D A E c j s z - * Q Z ; =.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.' ' ' V.A.nXZXAXDXFXAXSXFXSXFXFXDXAXAXAX",
+"P.P.P.K.P.K.K.K.P.P.G.P.P.P.K.H.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.8.k.0X8X7Xi.8.5.5.5.5.5.7.aXu.9.5.5.5.5.5.6.fXaXaXhX0X7XaXgX8XlXI V D W s 1 8 @ z C V @ @ V A s.9.5.5.5.d.d.5.5.9.9.d.-XI N N %XT 2.| 1 8 F Q V z s - z 1 s x # x 2 X d * X @ * s V 1 2 $X5XfXh 1X| * U c 4 z 1 F 1 ; l Q L ~ =.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.^ ' ' V.A.mXZXAXDXFXFXFXDXFXDXAXAXAXDXAX",
+"P.P.I.J.P.K.K.P.L.P.L.P.P.P.K.J.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.8.7.aXaXu.5.5.5.5.5.5.5.5.8.5.5.5.5.7.hXa.8.8.8.8.7.fXa.9.6.aX8XU C 8 @ z 8 R A C A A C A V d sX8.5.5.5.8.8.5.5.5.5.9.E I c N b A * * C z Z Z 2 f ;X@.* s a.fXp g.4.  3X| $ W <Xx 2 v N B wXwX$X<X<Xx z 4.< + H Q 3 G | W D ~ =.*.*.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t...{ { V.S.{.VXFXFXAXAXFXSXFXFXSXDXSXDXAX",
+"P.P.P.P.P.K.K.P.P.K.P.P.K.L.P.H.^ ' X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.5.5.8.9.5.5.5.5.5.5.5.5.6.5.5.5.5.5.u.0Xd.8.5.5.5.5.8.5.5.5.6.gX;Xz C A x C K ;X4X>Xs.4X>X>X2Xa.8.8.8.8.5.5.5.8.5.5.8.&XK n n I S z z V #   o X d wXtX8 a s.sX. 3 s.> Q >Xf C M s Z 4 m 4 4 > p O . b b 3 9 8 g.g.Z * : ~ : @.u u $.:.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t...^ ' V._.mXVXFXAXFXAXFXDXDXDXDXDXDXAXSX",
+"P.P.P.P.P.P.P.P.P.P.K.Y.P.P.I.K.{ ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.l.5.5.5.5.5.5.5.5.8.i.hXhXa.5.5.5.5.7.7X8Xk.5.5.5.5.5.5.8.8.5.5.7.8X>X>X>X4X>X1XlXzXgX7.kX8XzXd.8.sXhXkXlXd.9.aXfX9.9.aX2X1 # 4 a k eXeX1 C eXeX8 @ p p a C s A @ @ z @ C A @ # o @ T M d.d S B 2X| * c 3 V D X   o   1 H h.v B 3., ;.:.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.{ } ' V.A.{.ZXAXFXFXAXSXDXDXDXDXDXAXAXAX",
+"P.Y.Y.P.K.P.K.P.P.Y.L.L.P.Y.I.H.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.5.5.5.5.5.5.5.y.hX7X0X0X8Xk.8.5.5.u.0Xd.9.5.5.5.5.5.7.gXkXa.8.6.aX0X8XlXlXlX8X7X7XlX2X7X8XgX8.6.kX8XgXgXd.8.kXhX9.iX0X>X: 2.X.a * | 2.* * |  .* 8 #.;Xp 1 + o x 1 X 1 + 1 J h.@.R L M aXn Z v Q >Xb M B H Q > H cX2 1 H j.3 , , , ;.*.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.( [ ' V.A.mXZXFXAXFXFXFXDXSXDXFXSXAXAXSX",
+"P.P.P.P.P.P.P.P.P.P.P.I.P.I.I.J.[ ' X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.5.5.5.5.5.5.5.k.0X7XgXaXgXi.5.5.5.7.aXu.5.5.8.8.5.7.hX8X8XfX8.5.6.fXhX8X8X8X8X8X8X8X8X8X8Xa.5.5.kXgX8.8.8.5.d.d.6.hX0X:X: d x.o X : $ O 1   $ o * 2.{ o 4.E   g.4.  4.H 9 @.xX@.hXC b h O 9 2 C A g ;X*Xg.j.2 H g.2 j X .     3.J ;.;.;.;.$.>.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.' ' ' V.A.mXZXAXDXDXDXAXDXAXDXZXDXDXAXFX",
+"P.I.Y.I.P.I.P.P.P.I.I.I.P.I.I.H.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.8.5.5.5.5.5.5.7.gXu.8.8.8.5.5.5.5.5.8.5.5.7.hXkXa.6.gX0X0Xd.8.5.5.8.6.fXgXaXgXgXsXgXaXgXd.5.5.8.fXd.8.5.5.5.8.9.fX8X8X:XX p . O C @.;Xd i x.$Xz 8 * G   3.H . p.s.> 3.H k 2. .2.hXA M s.x Z 3 3 Y b %Xd   . $     o + z 2X@.: J -.*.*.;.:.:.:.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.^ ' ' V.A.{.VXAXDXAXDXAXAXAXAXAXAXAXSXSX",
+"P.I.I.P.P.P.P.I.I.I.I.I.P.I.I.K.[ ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.8.5.5.8.5.5.5.5.8.5.5.5.5.5.5.5.5.5.5.5.5.7.aXhXa.8.7.sXgXa.8.5.5.5.5.8.8.8.5.8.8.8.8.8.8.5.5.5.8.8.5.5.5.5.5.6.hX8X8X:Xa l.iXg @ 2.| j 2 bXj.2 8 H H o # @ @ o s o o @ 8 i 6 D R P M N d i 3.v m 4 4X| $ 4X| : H D.2 V Q <XK G Q @.1.:.;.:.:.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.^ { ' V.S.nXVXSXAXAXDXDXAXAXDXAXAXZXAXCX",
+"Y.I.I.I.I.I.I.I.I.I.I.I.I.Y.I.H.^ ' X.w.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.a.8.i.gXhXu.5.5.5.5.5.8.5.5.5.5.5.5.5.5.5.5.5.8.8.8.5.5.5.9.8.5.5.5.5.5.8.5.5.6.gXd.8.5.5.5.5.5.5.5.5.5.5.5.5.6.aX8X8XzX:X1 s.M g s * : + @ c E x + o o o 4 9 # C f # 8 f p s s + C D Y -XL c 3 g H < <X<Xd Q 3Xa H j.3 * C x . h.vXP -.,.,.<.<.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.` ^ ' V._.}.VXAXDXAXAXAXAXAXAXZXAXCXNXSX",
+"P.I.P.Y.P.P.I.I.I.U.I.U.I.I.I.K.{ ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.xXi.k.0X0Xa.8.5.5.5.w.hXa.8.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.7.hXa.5.6.aXd.5.5.5.5.5.5.5.5.5.5.5.5.fXkX8X3X:X>XL + K Y Y L A A C C A *XkX@.*X,X2 bXUX   .4Xp  .;Xp @.tX1 x i 4 4 3 S T k Z 3 V j # 8 V @ o o   A z S a D.cXO I { ; @.*.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.` ' ' V.A.mXVXSXSXZXAXAXAXZXZXAXSXZXCXCX",
+"P.Y.P.I.I.Y.I.I.I.I.I.I.Y.I.U.H.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.lXl.k.8X0Xl.5.5.5.5.7.kX0Xk.8.5.5.5.5.5.5.5.5.5.5.5.5.5.5.8.5.5.5.5.6.hX0XfX9.5.8.5.5.5.5.5.5.5.5.5.fXd.9.sX8X8X8X:X2 1 F O * p s V s j K R V %XjXcXgX*X9 eXh.> 2. .: 2. .# | 2.* x 1 4 4 H D b I d j D <X<XQ >X>X>Xk p.d.n C + j j o %X@.$ F 1.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.' ' ' V.A.}.CXSXSXAXAXZXAXSXSXZXCXCXCXSX",
+"Y.I.Y.Y.Y.I.Y.I.Y.Y.I.I.I.I.I.J.' ' X.y.r.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.kXlXlX7XgXu.5.5.5.5.8.w.gXi.8.5.5.5.5.5.5.5.5.5.5.5.5.8.6.hXa.8.5.5.6.sXhXa.8.5.5.5.5.5.5.5.5.5.5.6.lXhX9.kX8X8X8X:X8 bXvX:  .%Xs f ;X .U 3XV %XcXcX3X*XS x o . # * X * * X * : a K V L -XK V -XM iXd D -.,.,.rXzX7XV N fXM F z 4 3 C Q <XK F 1.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.^ ^ ' V.A.mXVXSXAXSXAXSXZXSXZXSXCXCXZXCX",
+"Y.I.I.P.P.Y.Y.Y.U.Y.U.I.I.Y.U.H.' { X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.hXhXgXu.8.5.5.5.5.8.5.5.6.gXa.5.5.5.5.5.5.5.5.5.8.8.6.gXd.aXa.8.5.5.5.8.8.5.5.5.5.5.5.5.5.8.5.5.5.5.fX0Xd.d.hXhXhX:XF bXQ $ 2.@.* f *XtXT U + *XR A R *XR 2XV d f . s h p + h p s K @ Y 2XM n 2XM N f G =.1.=.=.rX2XZ @ A + c 2 4 4 c Z x s G %.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.' { ` V.A.mXCXSXDXAXAXSXSXSXCXCXCXCXCXCX",
+"Y.I.U.I.Y.I.Y.I.I.U.U.U.I.U.U.H.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.l.9.5.5.5.5.5.5.5.5.5.5.7.9X8Xa.9.5.5.5.5.5.5.7.gXa.0.hXa.0.8.5.5.5.5.5.5.5.5.5.5.5.5.5.6.aXd.8.5.5.6.kX8Xd.9.8.6.E @ O   O k * z s f A z s F ,X%Xm &Xm Z L o g.3.$  .;X$  .4Xp ! tX8 L ,Xx M &X%Xn T -.BXBX<.@.BXyXA A A c c z F F c 9 s 2 + %.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.' ' ' V.A.}.VXSXAXNXAXZXZXZXZXCXCXCXCXCX",
+"Y.Y.Y.I.Y.I.U.U.U.I.I.U.I.I.U.K.' { X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.5.5.5.5.8.5.5.5.5.5.5.5.7.kX8XhXk.9.5.5.5.5.7.gXa.5.5.6.aXa.8.5.5.5.5.5.5.5.5.5.5.5.5.6.7XaX9.5.5.5.sX0X0Xd.5.9.E Z h.Z d %X1 z z V k + s z x m 8 * x <XR 2 x.s.o 2.X.* 2. .# ' #.* S d C A f g a D BXuXE.J v @.+X! a a *X=X6X*X*X%X=Xv x.o 1.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.^ ' ' V.S.nXZXZXAXAXAXCXZXNXCXCXCXMXCXCX",
+"I.U.Y.I.U.Y.Y.I.I.!.U.I.U.U.U.H.^ { X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.5.5.u.gXhXu.5.5.5.5.5.5.5.w.gXhXa.aXhXa.8.5.5.8.5.5.5.7.0XfX9.8.8.5.5.5.5.5.8.5.5.5.5.6.7X8Xd.8.5.5.6.fXhXd.5.5.E F vXdXp 2X4Xa z 3X3Xf V cXx M W x p qX5Xf o z o - : # * * # : : j F s F I b s.d T tXyX@.h.UX1 =.@.dXF =X*X:X:X-XA =X3 s.4 1.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.` ^ ' V.A.nXnXAXSXAXSXZXCXZXCXCXCXCXMXoX",
+"Y.U.Y.Y.Y.Y.I.U.Y.U.U.U.Y.Y.U.H.' { X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.8.i.7X8XkXu.5.5.5.5.5.5.5.6.8.9.7.hXkXu.5.5.5.5.5.5.5.6.gXa.5.aXgXa.5.5.5.6.aXa.8.5.5.6.aX8XaX8.5.5.5.8.8.6.5.9.j.# C A . 5X@.* z tX3Xf A Q V o W D $X5XhX$X:Xs k z Y P A A F A z S A L Z I M N d K ,X3XI eXdX3 :. .<Xx f %XP P D Z %X  m y *.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.' { { V.A.}.NXSXSXZXZXAXCXCXCXCXCXCXCXCX",
+"U.I.U.U.I.U.U.I.Y.U.I.!.Y.U.Y.P.^ ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.8.k.0Xa.9.5.5.5.8.5.5.5.5.5.5.5.5.8.8.5.5.5.5.5.5.5.5.5.8.5.6.hX0XaX8.5.5.7.8XaX8.5.5.5.6.8XaX8.5.5.5.5.5.5.5.8.E z bXvXa $Xg 1 s z C s O $ g h . p wX5XwXwX6XM iXf S b f d a d + a x K V O f f n I O . $ $ O t *.%.; | %X2XbXcXR L 6Xl tX<.*.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t...{ ' V.S.}.nXZXSXSXSXZXCXCXCXCXMXoXoXoX",
+"U.U.U.U.U.U.U.U.U.U.I.!.T.T.Y.H.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.9.k.0Xl.8.5.5.y.hXi.9.5.5.5.5.5.5.5.5.5.5.8.5.5.5.5.5.5.5.5.5.7.gXa.8.5.5.6.7XfX8.5.5.5.5.aXd.8.5.5.5.5.5.5.6.6.E Z vXW m 6XL * + P E L s cXx M cXx m p B 2X7XM v d S m m iXf A + . c x 8 V W @ %XR s 1 W V Y -.=.,.,.,.tX2X<XcXdXS 6X<.=.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t...^ ' V.S.nXnXCXSXSXNXCXCXCXCXCXCXCXMXCX",
+"U.U.U.U.I.U.I.!.U.U.U.!.U.!.U.H.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.8.u.hXi.5.5.5.w.hXa.aXu.9.8.5.5.5.5.5.5.6.aXa.5.5.5.5.5.5.5.5.5.5.5.5.5.5.7.7XsX9.5.5.5.5.8.8.5.5.5.6.5.8.0.9.0.E z 1 8 P g 4X@.# E t.N j eXz o h.s # V s Y >XY U S A m x N d A 1 K m x 1 Z H X :XY X Z H o L <.,.,.,.,.-.hX<XcX3XK 6X-.*.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] [ ' V.S.}.nXZXCXZXCXZXCXCXCXCXMXnX#XoX",
+"U.U.U.U.!.U.U.U.U.U.I.!.T.U.U.P.{ { X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.k.5.5.8.5.5.5.5.5.8.y.8X8XgXhXu.8.5.5.5.5.u.0Xd.9.8.8.8.8.5.8.9.8.8.8.5.5.5.8.aXd.9.8.5.6.fXd.8.5.5.5.d.gXgXs.E s.R 8 1 # * h *XrX* s.0.s.k O x p m W %XU C x j s V F S n %Xn x A C s @ s C 2 o X + z # o 2 o A @.X.| @.| X.*X&X%X*X=X,X;.*.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.[ [ ' V.S.nXnXCXCXNXZXCXCXCXCXMXCX#XCXCX",
+"^.I.U.!.!.U.U.U.U.T.Y.U.T.U.U.H.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.l.9.8.8.5.5.5.5.5.5.8.u.hXkXkXk.5.5.5.9.9.7.hXqXfXaXpXpXfXjXpXpXfXfXpXa.8.5.5.8.8.fXa.5.5.gXd.8.5.5.fX8X8XzX3X! A s + h.Z 1 1 p C @ E 9.fX,XI A %XjXcXhX*Xz I M s.d S K n M :XU x C @ s + z 1 o 8 D 1 1 C D R | | | { | { { | ,X:XY @ | $.:.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ' ` V.Z.}.nXCXCXCXNXCXCXCXCXoXCXCXoXoX",
+"U.U.U.U.U.Y.U.U.U.!.U.U.U.!.!.H.' ' X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.hXfXaXaXu.8.9.8.8.8.5.5.5.8.5.5.5.5.7.aXgXu.r.6XbXdXqX5XcXcXqX5XbXdX6XpX8.5.5.5.6.7X0Xa.8.5.6.5.5.fX0XlX2X;X4XL I M H vXdXz 8 P :X>X,X0.0.0.E + m cXcX3X*X1 I M N d P M N %XlX4XA V D Q . v 4.  h.vXz Q vXR yX,.,.*.<.>.<.,.<.tXzX2X; *.:.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ' { m.S.}.oXSXCXCXCXCXCXoXCXCXoXoXCXoX",
+"U.U.U.U.U.U.U.U.!.U.Y.!.U.U.U.P.^ { X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.kX8X8X0XkXaXaXaXaXaXu.8.0.9.8.8.8.9.7.hX8Xk.t.2XcXeXhX5XZ.eX6X5XcXdX6XpX9.5.5.5.6.aX7Xd.9.5.5.5.5.aXhXkX1Xm m d Y N B A j.B d E dX9X3XN v s.>X@ m <XH -X*XC U n g s Y M v -X2XI 1X8 D R . 4.s.o cXbX  cXcXz -.,.;.;.;.;.;.;.:.>.tXtX,.:.;.;.:.:.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.` { ' V.S.}.CXCXCXCXCXCXCXCXCXoXCX#XoXoX",
+"U.!.U.U.U.U.U.!.U.U.U.U./.+X!.W.' } X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.kX7X8X7X7X8X0X8XlX0XlXaXaXaXgXaXaXgXk.0.9.8.t.2XJ D *X5XD D 2X5XJ Z 1XpX9.8.9.9.8.9.9.fXd.8.9.8.9.9.0.t.&X3 N x A d I f v N d ` dXxX| n &X%X1X1 N =X,XhX>XC K M &Xd P M ,Xg ;XT >XC o @ X 2 z o j 1 o * 1 z -.*.;.;.;.;.;.;.;.;.*.,.;.;.;.;.<.<.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ` { V.C.}.nXoXCXMXCXoXMXoX#X[.oX[.oXoX",
+"/.U.U.U.^.U.!.U.U./.U./.+X!.!.W.^ ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.kXlXlX8X7X7X1X>X>X>X1X1X4X4X1X1X1X4X:Xs.aXaXd.zX*X*X5XkX*X=X5XkX2X=X5X*XiXiXiXiXiXiXpX6X2XiXiXiXs.N v N S bXbXj 8 bXbXA n m x `  .X.2.B N ;X1XV E P @.xX} Z n c s.d P M v a f K 8 1 1 @ 8 * # 1 C S Y F J @.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.` ` { m.S.}.[.#XMXMXCXoXCXoXnX[.oXoXoX[.",
+"U.U./.U.U.!.U.U.U.+X/./.+X+X!.H.{ ' X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.kX2X>X1X>Xb O O %Xx # O %Xb s O # %Xx I 1X4X6X4X>X;X5XbXjXxX5XcXdX6X5XpX2X6X2X*X,X2X2X2X2XgX2X6X4Xm &Xs F vXW # D vXQ o F Z z 9 6 & F -XU -X-XC U !  .X.~ x A I I A S U f  .I h 2 4.W X Q H $ h.vXY 6X<X;.=.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ` ' V.C.}.[.oXCXnXoXoXCX#X[.oXoXoXoXoX",
+"U./.U.+XU.+X!.!.U.~.+X/.U./.!.W.{ ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.2XU O s %Xa Q W m M Q ! %X2Xf W W m L A . %XM A W 8 m bX<X6X*XbXcX2XpX0.i.8XaX0.0.0.i.8XgX9.7.kX1XB N x z c 3 # z z 3 p C j z M s x x C V 8 V z m Z 6 6 q A A <X:X:XS z s  .@.C 2 3.j.p bXbXz cXcXc 7X-.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.` ] ' b.S.`.[.CXoXoXCXCX[.#XoXoXoXoXoXoX",
+"!.!.!.!.!.!.!.U.+X/.U././. X~.Y.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.b -XQ D &Xh Q P @ f Q P @ 2Xb Q W @ @ W W m M D W b &XW L 2XqXW P ,XqXiXaXkXhXiXiXiXiX7XfX9.fX8X>XI n S U B N F U v N g m N d Y m N g m N b L z c S Z S A C U 2X2X4Xx S K : - j V o O X 1 D 2 U L L -.*.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ' ' V.Z.}.{.oXCX[.oXoX[.[.oXoXoXoXoXoX",
+"!./.U./.U.U./.!.!.!.U.).+X+X/.^.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.E 2XcXP + d s @ s s + + s m m + @ n z Q W s f c O a %XM M =X=XM M =X%X%X%Xm m %X;X%X-Xm ,XsX0XlX:X9 J X.! m v V P I I I v N s U v N g c N %X2X@ O M n a O X f O # I >XZ j f a 3 3 2 3 2 W vXY 7X-.<.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.( ] ' b.C._.].#XMXoXMXoXoX[.oXoXoXoXoXoX",
+"U.~.+X/./././.!.!.!././. X/./.W.' { X.w.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.N 2Xs @ s C 1 C + X C 8 F O g &XL :XP 1 @ s s A A A x m -XY -X-X-X-X-XU -XY U E L U U %Xm >X1X1XR ' jXxXl B N f s s j P I I S Y n -X1X1X4X2X1Xs cXx %XP D   g.3.$ ;X2X*  .T . 3., 3.3.> bXcXc -.=.;.;.;.;.;.;.;.;.;.;.;.;.:.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ' ' V.C.}.{.oXoX[.oXOX[.oXoX[.oX[.oX[.",
+"U.!././.+X/././.~./.U.).~.+X/.^.^ { X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.c %XA 8 F L Z Q 2 2 Q 3 # Q W n L P V z * U z s z 1 C 2XzX8XlXkXkX8XlXlXlXlXgX9.9.9.y.hX7X:XC z z ^ |  .@.k | $XM &Xf + f s 9 4 O a 1XzXlXzX;XA D.j X Q P . g.s.2 -X3X8  .@.4 3.3., 3.< 2 I S >.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.] ` ' b.Z.`.[.oXoX[.oXoXoXXXXXoXXXXXoXOX",
+"+X/./. X~.!./.U./.~.).~./.|. XH.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.z i Q 2 A 2Xj.j.3 H j.H @ Q W + V 2XP W z 4Xm 2 p.> s 3X8X8Xd.0.i.hX7X8X7X7XkXfXfXk.9.*X6XR K m m * & & T T  .@.3 N #  .$Xa Z j.cX$ -X1X1X-XI K @ s # 1 + X > c X U <X8 * :   4 > < < < 3 yX;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.] ' ' V.C.`.].oXoXoXoXXXoXOX[.oX[.oXoXoX",
+"/.+X/./.+X/.+X X/./././.+X+X~.W.{ ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.z H j.H C :Xo 2 o o 2 2 8 @ @ O C ,XW W K %X%X4 j.3 1 2XlXfX0.9.9.0.i.lX8X7X7X8X8X7XgX2X6XR I v N s H S D * ; * b ;Xk #.@.1 C vXh.4 x z C K Y F Z F P L 1 j C C @ @ @ + s o h.vX* Q vX3 3.yX*.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.] ' ' b.S.}.].[.[.[.oX].oXXXoXXXoXoXoXoX",
+"!./.~.~././.~./.(././././. X~.Y.^ ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.c   2   C R R S @ @ # F R R D F C 1Xx s a :XA   z 2 8 >X1X>Xs.g.g.p.sXlX7X8X7X7X7X7XlX2X6X:XL U I S 1 1 s @ + V 9 >XK : : z A s o O S V 2 8 1 @ C C >X;X| | # V W <XX D E O vXcXX vXbX  4 uX*.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.` ' { b.C._.].oXXX].oXXXXXoXOXoXXXoXXXXX",
+"!.~./.!./.~.~.~./.(./.~.!.+X~.W.' ' X.w.r.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.a v d.n F d.a.P 2 V F k d.l.Y P R l ; ; y ! A + L :XR E Y k d + A F :X1X6XlX7X7X7X7XlX2X2X1XS z C C 9 h.V o cXbX@ 8 P :XS 8 K K A L Y 2 x.g . dXvX8 :X4X#.#.* * @.#.* D :XO s O   + o > v -.*.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.r.` ' ^ m.C.Q.].oXoXXXXXXXOXOXXX[.XXXXOXOX",
+"/.)./.).).!.)./.!. X+X(./.+X!.W.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.z N z.-XC v N 1 Z W Z C E s.D 6X8X~ G W ; 3X2XI I 2XfXi.8Xv p.> * Y R F :XkXlX7X7X7X7XkX&X6X1Xm m s D vXh.C vXQ M c :X2Xs A ;X:X8 1 C 1 UXE o vXh.X U x : : z * : ; $ X X X v 3.X + Q vXY -.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.>.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.] ' ' V.C._.].XXoXOXoXXXoXOX].XXOX].XXOX",
+"!.(./.(.(.~.(.!.!.~.!.)./././.^.} } X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.c s b z * 4.M h O o   C Y Y P 7X8X; W Q : tX8X8X2XI ,XaX8Xv j.4.* 2XzX>XF :X7X7X7X7X7X8X2X6X1XB N z S 3X<X2 C z 4 N ;X,X8 <XzX>X1 cXvX. E H * G G q F 2 C + 9 1 z S :X:XY 2 g.g.2 z vXcXz -.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.] ` ' m.C._..XXXXXoXOXXXXXXXXXXXXXXX|..X",
+"!./.!./.!. X!.~.!.~.!.)./.~.~.Y.^ ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.x z j z V j.vXv ,XD P R rX>.>.rX3X@.E E ; 3X8X6X7X2XL 7X8X. .   + 2X8XlX>XF R 7XlX7X7XlX2XkX1XL I x :X2X2XL * K g g -X-XC >X7XY F vXD.k -.:.=.;.;.,. .S W # 1 Q vXK ;X,X-X1   c 2 8 o # z -.*.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ' { o.C.E..XXXoXoXOXXXXXXXoXXXXXXXOX.X",
+"!./.~.+X(.+X!. X~.+X+X).~.(.~.W.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.a v d.n * 4 W > 8 R tX>.:.*.,.:.>.2.2.2.2.3X8X8X8XlXm 2XzXc p.> + 3X8X7X8X>XZ 1X8X7X7XlX2X6XU V V c c s V 1 cXbX@ bXbXO C :XR 9 o # 1 ^ ,.:.;.;.;.>. .2 c z C vXcX$ 1X; X F j s z 2 E vXY tX:.*.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ' ' b.C.`.'.XXXXOXXXXXXXXXXX.XXXXXXX.X",
+"!.~.!./././.(.!./.~./.!./.~.!.W.' [ X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.z N z.-XV A + A R 6XrX=.;.:.:.:.=.,.:.>.-.-.>.rX9XkXK 2X8Xv j.4.8 2XlX7X7XlXP :X3X7XkXlX2X6Xm p.,Xj U m m d UXQ o vXQ O A C S x h.1 k <.:.:.;.;.;.;.,.tXlX1X@ 2 o X 3X<Xj * | ;X. < bXbXa 8X-.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ' [ b.C.^..XXXOXOXXXXXXXXXOXXX.XXXXXOX",
+"/.!.!.(.~.!.+X(./.~./././. X(.^.[ ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.c a I s S n m z 6XrX*.;.;.;.;.;.;.;.;.;.1.:.:.:.>.-.@.-.<.X . . @ 3XlXlXlX8X<XY D s.0.i.*XkX&Xl.aXk U v N a F 1 o C 1 @ z z x L UXdX| ,.:.;.;.;.;.;.:.;.lX>X@ j.bX  D c z *  .@.2 , 2 L M -.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t...' ' b.N.Q.{..XXXXXXXXX.X.XXX.X.XXX.X.X",
+"!.(.!.!. X!.(.!./.).U.~././.~.Y.[ [ X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.c F @ V A n f.M eX,.:.;.;.;.;.;.;.;.;.;.;.;.;.;.*.:.BX<.%.2.G $Xs ;X1X4X2X8X6X2XY :Xp.sX2X2XK b x a Y I I S 1 @ C A R A c L x X W F y <.:.;.;.;.;.;.;.=.tX1X8 vXbX< @ V 1 o : : > 3.3 rX>.;.;.;.;.;.;.;.;.;.;.;.;.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t...' ' b.C.Q.'..X.XOXXXXX.X.XXXXXXXOXXX.X",
+"~.!.(.!. X~.~. X X(.+X)./.~.~.W.{ { o.y.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.x C 2 Q 2 -X4X! 1.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.BXuX*.~ &.Q + d -XP N i.R * * j C 3XhXE V s * c c A C C 9 cXbX-X2Xb P >X4X1 W 2 ; ,.;.;.;.;.;.;.:.:.,.<Xo X     h.vXO Q vXc 4 f.H <.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.{ { ' b.N.Q.'.XX.X.XXXXX.XOX.XXXXXXX.X.X",
+"/.!.~. X!.~. X~. X!./.(./.(.(.W.[ [ X.i.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.c 8 h.j.H #.,.,.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.BX<. .: : : 8 U <XA f.0.E > p.9 @ <X*XR a p.&Xs z p.&Xs D vXQ m -XC D 1X,XC UXh.| :.;.;.;.;.;.;.:.,.=.eXc W z $ vXbX  vXcXs yX-.<.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t...{ ' b.C.Q.'..X|.OX.XXX.XXXXX.X.XXX.X[.",
+"(.!. X~.!.+X(.+X+X X/.(.~. X(.Y.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.x Z   4   #.,.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.>.:.,.,.BX<.3 v h 1 k # f p c N Y < x.E x D N U z z.aXj z z.aXd A Y z c U L :XzX>XX W Z y ,.,.:.:.>.;.;.;.;.;.>.:XbXh.c P D * G F y ,.*.*.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] { ^ b.N.Q.).]..X.X.X.X]..X.X.XXX.X.X.X",
+"!.(././. X~././.(.+X/.|.~.(.!.W.` ' X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.x C c s.I #.:.;.;.;.;.;.;.;.;.;.;.;.;.;.,.,.,.<.,.<.BX<.h.UXL 1 s p.%X* | $Xs .   . %XL m L O b b + O b b @ :X4Xx x P D 3XzX4X1 W O l ,.>.:.;.;.;.;.;.;.>.,. .@.@.W yX-.,.1.=.*.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.;.;.;.;.;.;.;.;.,.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.` { ' v.Z.Q.`.|.].'.XX.X.X.X.XXX.X.X.X|.",
+"/.!.~.+X(.!. X(.(.(./.(.)./.(.^.' ' X.w.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.x C N z.>X#.=.:.;.;.;.;.;.;.;.;.;.;.;.;. .#. . . .#.yX&.> i 2 z c z.pX: &.! z * <XD d x x c V A z d z z s 8 1 A P D P 1XhXi.E C UXj.X.,.;.;.;.;.;.;.;.;.;.;.;.1.1.*.*.*.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.,.>.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.` { ' v.N.Q.{.|.].'.].]..X.X]..XXX.X.X|.",
+" X~.(./.(.(.!.(.(. X/.(.~.(.(.^.' { X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.c Z z M a  . .=.:.;.;.;.;.;.;.;.;.;.*.;.x &XM M %XM a B s.m -XY @ m c : ; * s t @. .# P Y c c V V c L Y R P Y Y P 1X0X2X2Xs.%Xx Q S - #.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.<.E.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.` ] { b.N.Q.)..X'.'..X|..X.X.X.X.X.X.X'.",
+"!.(.!.(./.(./.(.(.~.~.).~.'.(.W.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.c A * C c &Xg eX<.,.;.;.;.;.;.;.;.;.,.yX%Xp.m g p.M f M z.sXj c x 8 8 L U L Y j ; l a 4X2XR U m m z >X2X1X7XgXw.t.i.>XA A k K 1XM W 1 l ,.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.` ` ^ b.N.Q.~.(.'.]..X].|..X.X.X]..X'.|.",
+"~.!.(.(. X(./.(.(.(.).).(.(.|.^.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.v s.n F M p.M 2X4X#.1.;.;.;.;.;.;.;.,.-.1Xn n n K n + O L x V P m m b N l.8XgXy.k.1Xf # f c U v N V L n n N 7.5.9.l.-Xz C * j C F UXh.W :.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.' ' ' b.N.R.).|.].'.(.|.'.(..X|.(.|..X.X",
+"/././. X(.(.(./.(.(./.(.(.(.(.W.' ' X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.p.z.&XC I n m g %XM #.:.;.;.;.;.;.;.;.*.rX:XP R E R z S V * V S I v M p.9.8XfX9.9.L @ dXcXV m c M Z U v N N 0.9.0.,XK j > p.Z @ 1 Q P M rX,.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.] ] ' o.N.Q.~..X(.(.].|.'.'.(.'.(.'.(.'.",
+"!.(./.~.(. X/.(.(.~.(.~.(.|.'.^.` ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.M %Xb @ C z P n p.M 3X<.,.;.;.;.;.;.;.;.=.rX8X7X7XlXI 1Xm s.%XC -X;X;Xs.9.hX1Xa.d.b S IXQ + 3 3.< v U I n -Xa.f.p.n C D < x.E z O M c b 6X@.,.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.' ] ] b.N.Q./.|..X(.'.(.(.(..X(.(.(.'.(.",
+" X!.(.(.~./.(.(.(.~.(.(.)..X.XW.' { X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.2X7X2X3 E 4 F U I n M >X .1.;.;.;.;.;.;.*.=.-.rXlX7XU 1XM l.&Xj s.z.7XgXd.! j k C s @ j o 1 C z C c c C F C k Q bXd A T . > . M L N 3 h.1 k <.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.:.>.:.;.:.:.>.;.;.;.;.;.;.;.;.:.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ] ' v.N.W.Q.(.].(.'.(.(.(.(.(.(.(.(.'.",
+"(.(.(.(.(.(./. X(.|.(.(.(.|.(.W.' { X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.kX7X7Xv @.p.8 V C k < N p #.,.;.;.;.;.;.;.;.,.*.-.rXU 2X2Xn m C E d.P V k C d 4X: X f U L z d >XW @ U v &X+ C Q Q c L U v N g v p.;Xb bXh.:XrX=.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.,.,.:.:.>.:.:.;.;.;.;.;.;.;.;.;.;.:.>.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.` { ' o.C.Q.).|.'.(.(.).|.(.(./.(.~.(.(.",
+"|.+X(.~.~.|.(.|.(.(./.(.)..X(.Q.` { X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.jX8X2X> h   8 n | $ j.vXb 1X<.*.;.;.;.;.;.;.;.;.,.-.I s.l.2XL @ A k C d >XD x dX! O n <XA * d -X:Xs c z.s.d + X * s C T n n n %XA :X,X@.h.m 0X:.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.,.,.:.+.+.#. .#.#.;.;.;.;.;.;.;.;.;.;.;.>.:.,.,.,.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.` ' ^ b.N.Q.).(.(.(.'.(.(.(.(.(.(.(.(.~.",
+"(.~. X X(.|.|.|.(.(.(.'.)..X(.^.' ' X.w.r.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.y.:.tX6X@ O V * :X<XF > H > M <X-.,.;.;.>.;.;.;.;.,.-.I E d.2XS c s.m + x -XR + P U s O K d z s b b s s m U A D P A n I A J G W A C 1 z + @ L 1X@.#.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;. .rXJ < 4 Y M m k ;.;.;.;.;.;.;.;.;.*.&.#. .#. .#.;.:.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.` ` ' o.N.R.).(.'.(.(.(.(.~.(.(.~.).(.(.",
+"(.(.(.(.(.|.].).(.|.(.'.(.(.(.Q.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.-.6XL Q S + D L c < 1 g ,Xg :X>.:.;.:.;.;.;.;.:.-.S V k + C c z.sXk a n b + C I x x s x P V 1 8 c c + V F >XlXwXqX5Xk D.xX` a v &Xp v N O Q bX{ :.;.;.;.*.>.:.;.;.;.;.;.;.;.;.;.;.,.@.g m h z V L c p.n -.;.;.;.;.;.;.;.,.&.4 m f c %Xb  .#.$.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] ] ' b.N.Q.^.(.(.(.(.).(.(. X(.(.(.~.(.",
+"(.(.(.(.(.(.(.(.'.'.(.(.)..X(.^.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.;.-.@ >   + z 9 < 3.9 =X3X! z 3X-.#. .*.;.;.;.*.-.n a s.%X* x m b b A M x z z I P C + # 8 x U P s # O b s <XlX5XqX4X! @.dX~ c l.fXf l.fXg vXdX; =.,.*.,.,.,.,.,.=.*.,.=.=.=.;.;.,.=.tXM f.4.Z @ V @ z A <X:.>.;.;.;.1.#.#.3XM d.n M p.U m g #.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.{ ` ' b.N.Q./..X(.'.(.(.(.). X(./. X/.~.",
+"(.(.(.(.(.(.|.(.(.'.|.'.(.|.(.Q.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.;.=.yX*X9 cXQ V < < 9 h $X; V 2X;Xn b  .,.;.;.:.tXn c z.sXj Y a # b L 1 V V 9 Z F z m M s K <XF V s x m s >X7XwXh =Xj ~ ~ 6 1 m m . m m O W 2 F rXrX@.@.rX@.rXrX@.rX@.rXeXrX,.;.,.-.gXx 2 4.j.c V P Q 1 B cX>.:.:.,.#.M m M g g m U b D d.%X-.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.` ] ^ o.N.Q.). X(.'.(.(. X(./.(./././.~.",
+"(.(.(.(.(..X'.|.(.|.|.'.(..X|.^.^ ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.;.;.,.eX<XLXx @ z Z S t jXdXF A g p.N @.,.,.,.<.6Xb 1 m b V z C P V + F D C > , 3 I p.N A z c a # O z . O V C S Z 2 2 3 S D P Z + 8 * * V + V Z A z A S c z c x A A A C n 2X#.,.=.@.3.3 1   o s + 2 > o M *XeX#.#.#.3XM d.n %XM p.Z D C F L tXt.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.` ' { b.N.Q.`.(.(.(.(.~./.~.~.~./.(.~.!.",
+"(.'.(.'.'.(.'..X'.|.(.(.(.(.'.^.{ ' X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.;.;.:.%.G E O * T h F | h.@.; 4 g.1 g >X@.@.@.eXg s a # p O a L Q A @ D Q F 1 S K %Xg g s F < , > v > $ o 8 1 3X$XT G 1 :X3X6XM 3.h   N c n Y x m . M m . W bXF + M m . W bX! @.rX<XF Z Z 1 z * A S c P m a M m g g M Z P b d.m n d D f E b 2Xt.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.` ` ^ o.C.Q.~..X(.'.(. X X~.~.!.(.!./.).",
+"|.(.(.(.(.'.(.(..X.X.X'.(.'.'.^.{ ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.;.;.;.;.#.-.;X2.#.T j & ~ ~ F 3.j.c * <XA O K c . s.n p <X: f z C a z @ @ g z $XqX5Xh 1XW + 4 , , j.f.@ Q Q o <X$X1XrX* C z A Z UX>XO z.f.>XD v p.g M s.f vXbXX Y c d.d vXvXX S Z c 3 , , < G l j 3XA p.d.b M d.n M d.d C P D D S P E M p.n eXt.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.' ` { b.N.Q.~.|.'.~.(.)././.~.~.!.(.!.!.",
+"|.(.(.|.'.|.|..X|..X|..X'..X(.W.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.;.;.;.;.;.,.1.; ; j s 1 2 Z S > > a F rX| + <X-XB z.&XK tX! a A 8 G G A D %XU wXxXwXh -XY j 4 <   2 1       X F p h Y . ;X: # 2 g.H   m a A d $ Q bXI n c H Z 2 I M d C C 1 o 2 < < < < , > #.#.k 2XL f g d P n I n n x S :X2.} G v f.n %XT ;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.` ] ' b.N.Q./.|.'.'.~.(.(. X(.~.+X/./.~.",
+"(.(.(.'.(..X.X.X.X'.(..X(.'..X^.' { X.w.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.;.;.;.;.;.:.*.1.tX*X< v p V V j j Z : ~ : X # X O N M j P b @ Z ^ jXfXX.dX1 * $Xh $X. f %Xx s ;X: $ 4X-X$ ! P @ 2 3 O + 3X@.8 C @ * S S I M n f vXbXo A d.p.A o 3.g O s -X: X z v < a sX3.> % ~ s &XV M iXb Z Z S H P R G ;.:.*.-.T I T 3X<.:.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] { ] b.N.Q.~.|.(.(.(./.(././.)././.!./.",
+"].(.].'..X(.].(.'.'.|..X|..X.XW.' ' X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.E.>.;.;.;.;.;.;.;.,.eXj.cXb 8 2 Q 2 8 9 Z z 9 Z C 9 8 9 c 9 9 Z F  .dX@.: # f + 9 H 9 # D n %XS 3XX.# tX3X* rX@.* 4 x.j.@ D b a s ;XQ p m g p.iXd R c 1 + M m s Z UX:Xz V 3X@.j 2 g.p.4 < 3.3., C G G j f.z.g 9 3., < %XeX;.:.;.;.;.<.>.<.>.;.;.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.[ { ] v.N.W.^. X+X'.(.(.(././././.!./.!.",
+"|.'.(.'.'.'..X.X.X.X(..X|..X'.Q.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.>.;.;.;.;.;.;.;.:.1.i h.3 s H h.g.1 3 , 3.3.< Z < 3.< 3.< , , v & ~ & * >XD # D Q A C cX+ z S R %Xa -X;X# ~ ; s 2 > O $ G h a x -X<X. N M K I ! -.-.@.D F C F 2 3 H > C W &Xd 1 4 L > , , 3.3 o.xX..* M ,Xx Z 3 < , M # *.;.;.;.;.;.;.:.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.{ { ^ b.N.W.`.(.(.~.(./.(./.(.~././.!.!.",
+".X.X]..X'..X.X.X.X.X].]..X.X].Q.' ' X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.:.;.;.;.;.;.;.;.;.;.1.#.rXL o 3 2 Z < , < , , 2 < 3., , , , , 3 f U H p -XR z C A x a x d %XzX2X6X6X6X2X6X6X6X>XA K b * #.eXs @ f g . a.s.! ,.>.*.*.;.*.tX1XC S j 9 D C L 2X>XP 2X&X, , 3.f.<X .fX/ < C S D P 2X,XbX<XF 1.:.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.' ' ' v.M.W.^. X(.~.|././.(.!././.~.!.!.",
+"].].].(.|..X.X.X.XXX.X.X]..X].Q.} ' X.w.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.:.;.;.;.;.;.;.;.;.;.>.:.:.G Z z 1 S Z Z Z < 3.Z V z Z F Z C C C x -XU p n %X;X7X6X6X6X6X3XrX-.yXyXyXyXyXrXyXyXrX4Xv &X$ ; : s s n U . &Xg l *.;.;.;.;.:.-.3XB p.g s R a C A C C C Z 9 3 ,X, 4 ~ ~ ~ Z 3 < &XZ D 8 4.W > #.:.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.^ ` ' v.N.Q.).(.~.(. X/.~.(././.+X/.!.!.",
+".X.X.X'.'.'..X.XXX.X].XX.X.X.X^.{ [ X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.;.;.;.;.;.;.;.;.;.;.;.;.;.*.rXf., f x b V < 3.2 g ! $ + 2 W 2 + x n %X1X6X6X3XyXyXyXyXyX-.=.*.,.*.*.*.1.,.*.*.=.eXI I I g a C A >XD U 2Xn n G ,.;.;.:.;.=.-.%X%X%XM p.p o * X G g p F C S C Z Z Z Z c < 4 N < 3 Z + g l : #.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.' ' { b.M.W.).).).).~./.~././.~././.!.!.",
+"XXXX].]..X.X.X.XXX].].XX.XOXXX`.' [ X.w.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.;.;.;.;.;.;.;.;.;.;.;.;.;.:.*.tX< M p.M C < , 1 Y tXG @ H D.g.@ >X6X2X3X-.rX-.=.,.=.*.*.*.:.;.;.;.:.;.;.;.;.;.:.:.>.<.4Xv s.s s L d b 4XN s.-XyX,.:.>.;.;.>.-.rXrXn U k D h.#  .eXx U x S n f Z C F C S Z C 2 3.< Z >XeXA -.;.;.;.;.;.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.` ^ ^ o.N.C.)././.~./.+X/. X/././.!.!.!.",
+"OXXXOX].XX.X.XXXXX'.].].XXOX.XQ.' [ X.u.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.-.f.M g M A Z V C Z S M + o 3 2 C 3X8X8XtX=.:.:.:.;.;.;.:.;.;.;.;.;.;.;.;.;.;.;.>.:.,.=.eXI %Xb C + 8 D P Z C A -X@.1.:.;.;.;.:.=.:.<.<.} 2 4 $ ~ ~ # v d.c d.g b M b f E . 3.M . Z C D L M eX1.;.;.;.;.;.;.:.:.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.G ' ' v.N.R.^.).!.!.~././././.+X+X/.!.!.",
+"OXXXXXXXOX.X.XXX].'.].NXoX[.(.^.{ ^ X.w.t.t.t.7.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.>.-.tXf.&XS f <XF X F @ + j C @ ;X9XrXrX-.:.;.;.:.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.:.:.1.>.,.yX<X* G h $X%Xd G X m n G ,.;.;.;.;.;.:.:.>.*.1.1.%.#.#. .n I I I n M d.n M d.p bX<Xx F D 8 A g n A 1.;.;.;.;.;.<.<.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.^ { ^ v.M.W.T./.^.Y./.@X/.+XU.U.!.U.!.!.",
+"oXoXOXXXOX].XXXX).CXVXAXFXVX#XQ.} ' X.i.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.$.>.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.,.*.-.tXR b :XI C Q A @ W Q A :X<.=.*.;.;.;.;.;.;.;.;.;.;.;.;.>.;.;.;.;.;.;.>.;.;.;.;.:.*.,.X.8  .@.m $X4XrXk v s.%XyX*.:.;.;.;.;.;.;.:.>.:.:.;.;.>.<.>.-.>.yXm I U U I d 4.h.4 D m $ P M d.K *.:.;.>.;.;.;.;.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.] { ] v.C.}.nXCX[.~.Y./.!.U.!.U.!.U.!.U.",
+"oXoXXXoXXXOXXXXX[.VX5 0 6 e VX{.{ ' X.k.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.&.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.&.$.$.&.M M M 2 Z z z 1 9 c :X-.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.%.$.$.$.$.$.*.X.+ ; q %X%X$XQ x m U &XkX@.$.$.$.$.$.$.$.$.$.$.$.$.$.$.*.$.$.$.$.$.-.-.$.-.%.#.<X>Xz     E m M L &.$.$.$.$.$.$.$.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.` } ^ b.mX7 - q % nX^.!.U.!.U.!.!.U.U.U.",
+"oXXXXXoXoXXXXXXXCXLX0 q 6 q HX[.} [ ^ g.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.e.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.w.{ [ ^ Z.mXw 0 0 q FX{.U.!.U.U.Y.U.!.T.U.",
+"oXoX[.oXoXOXOX].ZXHX0 q q w HXZX[ { ( u k.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.r.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.x.[ [ J V.LX6 q q q GX[.U.!.U.^.U.U.U.U.U.",
+"oXoXoXoXoXoXXXXXZXJX0 q 6 = JXZXX.} ' ` x.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.7.u.X.} } [ bXLX6 q q 6 HX[.T.U.U.U.U.U.U.U.U.",
+"#XoXoXoXXXoXXXXXAXJXq = 6 q JXFX^.X.^ | ..x.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.r.r.t.r.t.t.r.t.t.t.r.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.t.t.t.t.t.r.t.r.t.t.r.r.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.u.g.} } ^ ( Z.LX6 q q q JXCXT.U.U./.U.U.U.U.@X",
+"CXoXCXoXXXoXXXXXAXJXq = 0 = JXVX'.E.X.` { J x.t.t.t.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.t.t.t.r.r.t.r.r.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.r.t.t.t.r.t.r.t.t.r.t.t.t.r.r.t.t.t.t.r.r.t.t.r.t.t.t.t.t.t.r.t.r.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.y.t.t.r.t.r.t.t.t.t.t.r.r.r.i.u X.' ] r ( S.LX0 0 0 q HXnXU.+XU.U.U.U.U.U.U.",
+"oXoXoXoXoXOXOXXXZXJXq q 0 - JXZX.X'.H.[ { { J x.u.t.t.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.t.r.r.t.t.r.t.t.t.t.t.t.t.t.t.t.t.r.t.t.r.t.t.r.t.t.t.r.t.t.r.t.t.r.t.t.t.r.r.t.t.r.t.t.t.r.t.t.r.t.t.t.t.r.t.t.t.t.t.t.r.t.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.r.r.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.u.4.j.( ^ ] r ^ o.mXLX0 5 0 - JXnXU.U.U.U.U.U.I.U.U.",
+"#XoXoXoXoXoXXX].AXJX5 = 6 6 JXFX]..X'.H.^ ' | X.g.k.u.w.e.q.w.q.q.q.q.w.y.q.w.w.w.q.q.q.q.q.q.q.t.y.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.r.e.e.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.w.w.w.w.w.w.w.q.e.q.q.q.q.q.q.q.w.u.w.q.q.q.q.q.q.q.q.q.q.y.r.q.q.q.q.q.q.q.q.r.q.q.q.q.q.q.q.e.w.w.w.y.w.w.w.w.w.w.w.w.w.w.w.y.e.q.q.q.q.q.q.q.q.q.e.q.e.q.q.e.e.q.q.q.e.q.q.r.r.q.q.q.w.k.x.+.{ ^ ( G t ( v.mXLXq 6 0 6 JXnX!.Y.U.U.U.U.U.P.I.",
+"oXCXoXoXoXoXoXXXAXJX= q e - JXVX|.'.(.`.o.{ ' ' ^ ^ { ' ] ] ^ ^ [ ' ^ ' ^ ] ] ` ` ` ` ] ] ] ' ^ ] [ ] ] ' ^ ` ^ ' ` ' ^ ` ^ ` ' ^ ' ' ` ] { ^ [ ' ^ ' ^ ] ] ` ` ] ' ^ ^ ^ ' ] ` ' ^ ] ' ] ] ' ] ' ^ ] ` ' ^ ` ' ^ ` ` ^ ^ ^ ' ' ` ' ] ^ ' ^ ' [ ^ ' ' ` ] ] ' ` ^ ^ ^ ^ ] ] ` ^ ^ ` ` ` ] ] ` ` ' ^ ` ` ` ` ^ ` ^ ^ ` ^ ^ ] ^ ] ` ^ ` ` ^ ] ^ ` ` ` ` ` ` ` ` ` ` ^ ^ ' [ ' ' ` G { { t t ( v.n.mXLX6 q q 6 JXCXU.U.U.U.U.I.Y.Y.I.",
+"oXCX[.CXoXoXoXoXZXJX= 0 = w JXFX.X'..X~.W.) ^ } } } } ' ' ' { ' ' { ^ } { ' { } ' ' { { { } [ } { [ } { { { ' { ' ' { ' { { } } { ' ' { } } [ } ' { ' ' { { ' { { { ' { ' ' { ' { ' } { } } } } ' } } } { { ' } } } { ' } } ' ' { ' } } { ' [ } ' } } } } ' } } } { { { { { ' ' ' { ' ' { ' [ ' ' ' ' ' ` ' ' ' { { { ' ' ' ' { { { ' { { { ' ' ' ' { { ' { ' { { ` ' ' { ` ' ' [ ^ u y u v.v.N.VXJXq 6 q q JXVXU.U.U.Y.I.U.P.P.P.",
+"CXoXoX[.oX[.oXXXZXJXq - w = PXLX|.OX|..X~.'.E.C.O.} [ ^ ] ] ` G ` ^ G ^ ` ^ ` ^ ^ ` ^ ] ] ^ ^ ( ] ] ^ ] ] ] ^ ` ` ^ ` ` ^ ` ^ ` ` ` ^ ] ] ` ] [ ^ ` ` ] ] ] ^ ] ] ` ] ] ] ] ] ] ] ] ] ] ] ] ' ..^ ` ` ] ` ] ^ ` ` ] ] ] ` ` ` ^ ` ^ ` ` ` ^ ] ] ` ` ^ ` ^ ` ^ ` ` ` ` ` ^ ` ` ` ` ` ` ` ` ^ ` ` ` ` ` ` ` ` ` ^ ] ` ^ ` ` ` ` ` ` ^ ^ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ' ` t J ^ ^ t t t u u v.v.B.T.FXPXq 0 q = JXnXY.Y.I.Y.P.I.P.P.P.",
+"MXoXoXCXoXoXoXoXVXJX0 6 0 q PXIXLXFXVXVXZXZXVXmX}.A.S.b.o.) ..( J J ( J J ( J u J J ( J J ....J ......J ..J ..J J ..J ....J ....J ....J ........J ......X.....................X.J ....X.............J ........J ..........J ....J ..J ....J J ..J ......( J ( J ( J ( J J u ( J ( J u J ( u u ..u u u J u ( ( J r ..u ..u u ( J u ..J ..J ( u J ( u u J u u u u u u ( ....b.V.D.D.A.bXmXmXmXmXLXIXPXq 6 q = JXCXU.U.Y.I.I.I.P.P.P.",
+"oXoXoXoXoXoXOXoXCXJX= 0 6 q PXPXPXJXJXJXJXJXJXLXLXLXA.S.V.m.m.m.O.m.v.n.m.m.m.m.m.m.m.m.m.b.m.b.b.m.m.b.m.m.m.m.m.m.b.b.m.V.m.m.m.m.M.m.V.V.V.m.V.V.Z.V.V.V.V.V.V.V.V.Z.V.V.V.V.V.V.V.V.V.m.V.V.V.V.V.m.V.V.m.m.m.V.V.m.V.m.m.V.V.m.m.m.m.m.b.b.m.b.m.b.b.b.m.v.v.v.v.b.n.m.v.v.O.O.v.v.v.v.v.O.v.O.b.O.v.v.v.v.m.b.O.b.O.m.v.b.O.o.O.n.v.b.O.b.O.v.v.v.v.O.v.v.o.v.v.V.bXbXmXLXUXLXLXLXLXLXIXIXPXPXq q q = JXnXY.Y.I.I.I.I.K.P.L.",
+"oXoXoXoXoXoXoXoXCXJX5 0 0 = 9 = - 6 q - q q q q 6 6 6 mXS.W.C.N.N.C.N.C.C.C.C.C.C.C.N.C.C.C.C.C.C.C.C.C.R.C.C.C.C.C.C.C.C.C.S.C.C.S.R.S.Q.S.S.S.Q.A.A.A.A.A.A.A.A.A.A.A._.A.A._.A.A.A.S.S.R.S.S.Q.A.S.R._.S.S.S.A.S.C.S.S.S.S.S.C.C.C.C.C.C.C.C.C.R.C.C.C.N.N.C.C.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.C.N.N.N.N.N.N.C.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N._.nX6 0 0 q 0 e w = w 0 q - q 0 0 6 e JXVXY.I.I.P.I.K.P.P.P.",
+"oXoXoXoXoXoXoXoXCXLXw = 0 w w w e 6 6 0 q 6 q 6 q q 6 VX}.T.Q.Q.Q.Q.^.Q.Q.Q.^.Q.Q.Q.).`.`.`.`.}.`.`.`.`.`.`.}.`.`.`.`.`.}.`.`.}.{.}.}.}.}.{.}.}.}.}.}.}.{.mX}.{.}.{.}.}.}.}.}.}.}.{.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.`.`.`.`.).`.`.}.Q.}.`.}.).Q.).`.Q.Q.`.Q.W.Q.Q.W.W.W.W.W.Q.Q.W.Q.W.W.W.W.Q.W.W.W.W.W.R.T.W.W.W.W.W.W.Q.W.Q.Q.W.W.W.W.W.Q.W.Q.W.W.W.W.W.W.W.W.Q.H.mXFX% w = e 0 5 = = 6 6 6 0 q 5 0 q = HXNXY.I.P.P.P.I.P.P.G.",
+"oXoXoXoXoXoXoXoX[.HX7 q 6 6 q 0 5 = = w = % e = q q q FX[.~.`.~.~.'.(.(.{.'.(.{.].'.].].{.].[.[.[.[.[.].OXOX[.OX[.[.{.[.].[.[.[.[.oX[.[.oXnX[.CXCX[.nXCXMXMXNXCXNXnXNXMXoXnXMXoXoXnXoXnXMX[.[.[.#X[.nXoX{.oX#X[.[.[.[.[.[.[.[.].OX'.{.OX'.[.[.[.[.{.'.'.'.'.~.{././.~.~./.~.~./.(.~.~.~.^.~.~.~.~.~.~.~.~./.~.).).).~.~./.~.~.~.^.).).~.~.^.~.~./././.`.).!.~.~.^.!.~.[.FXq q q 6 q = q 0 q 6 6 e 0 w 6 0 7 LXnXY.I.I.P.P.P.K.K.L.",
+"oXMXoXoXMXoXCXoX/.NX5 6 q q q = 0 q = q q - q 6 q 6 q nXOX.X'.].].].XX.X].].].[.[.[.oXoXCXoXoX[.oXCXoXCXMXMXoXMXCXoXCX[.oXoX#XCXoXMXCXCXCXCXCXCXCXCXCXCXCXCXCXCXSXCXCXNX#XSXNXSX#XSX#XCXCXCXoXCXCXCXCXCXCXMXCXMXCXoXCXoXoXoX[.#XoXMXoXMXoXoXOXoX#X[.[.[.].].].].].].XX].'.'.'.'.(..X'.~.(.(.'.~.'.(.).(.(.(.(.'.(.(.(.(.'.(.'.).(.~.(.'.(.(.(.'.'.'.'.(.(.(.(.(.).)./.MXFX6 0 q q q 0 q 0 0 q 0 q q = 0 0 5 AX~.Y.I.P.P.P.K.P.K.G.",
+"oXoXoXCXoX#XoXoX~.{.nXHXHXJXJXJXJXJXJXJXJXJXJXJXHXGXFXMX(.|.|..X].].[.OX].].[.].#X[.[.oX[.[.CXCXCXMXCXMXoXMXMXMXMXoXCXCXnXCXnXCXMXMXCXCXCXCXCXNXCXNXCXCXSXNXSXCXCXMXSXMXSXSXMXMXSXNXCXCXMXNXCXCXCXCXCXNXMXCXCX[.CXCXCXnX[.MX[.CXoXOXoXoXoXMXoXoXoX[.[.[.].[.XXXX].'.].'.'.(.'.(.(.'.(.'.'.~.~.'.(.'.(.'.(.'.(.(.(.(.'.`.'.~.~.(.'.(./.(.{.(.'.'.'.'.(.'.(.(./.~.~.~.~.[.ZXFXKXJXJXJXIXJXJXJXJXJXJXJXJXHXHXnX[.~.Y.P.P.P.P.P.P.K.L.",
+"oXMXoXoXMXoXCXMXoX~.XX[.CXAXVXZXVXZXZXFXAXAXZXVXVX[.CX^.'.'.'.'.'..X'..XOX].OXOX[.[.oXoXoXCXCXoXMXoXCXMXCXMXMXCXMXMXoXCXoXoXCXoXMXCXCXCXCXCXCXCXZXnXCXCXCXCXCXCXSXCXMXSXMXMXNXCXNXCXCXCXCXCXCXoXMXCXCXCXMXCXCXCXCX[.oXCXCXMXoXoXoXoXoXoXoXOXoXXXoXXXoXXXOXXXXX.X].'..X'.'.(.'.'.(.(.(.(.(.(.(.(.(.'.(.(.(.~.(.(.(.(.(.(.(.(.|.(.).`.~.(.(.(.(.(.(.(.(.(.(.(.(.(.(./.)./.{.nXVXFXVXGXFXFXLXFXFXFXVXVXVXVXnX[.`.Y.Y.T.P.P.P.K.L.K.G.",
+"oXoXMXoXMXMXoXMXCXoXoXoX[.XXXXXXOXXXXXXX.X]..X.X'.|.'.(.]..X|..X|..X.X.XXXXXXXoXoXoXoXoXMX#XoXMX#XoXCXCXCXMXCXoXCXCXnX#XMXCXCXoX#XMX#X#XCXCXCXCXCXCXCXMXCXCXCXCXCXCXCXCXCXCXNXMXCXoXCXCXCXoXCXCXCXCXCXCXoXoXCXoXMXMXoXoXCXoXMXoXoXOXoXoXXXXXoXXXXXXXXXXXXXXXXXXX.X.X]..X|.|.(.(. X|.).(.(. X(.|. X|.|.|.(.|.(.(. X|.(.(.(. X|.~./.).~.~.|.~. X|.(.'.|. X X(. X(.(.).).!.!.(.!.+X+X!.!./.!.!.!.U./.U.U.U.U.Y.Y.I.Y.Y.P.L.K.P.K.K.K.",
+"oXCXoXMXoXMXMXoXoXoXoXoXXXoXoXOXXX].XX[.(.XX.X.X.X.X(.XX].(.'.XX.X]..X].XXoXoXoXXXoX#XoXoX#XoX#XoXCXCX[.CXMXoXCXoX#X#XCXCXoXCXSXNXCXNXSXMXSXSXCXCXCXCX#XSXNXNXSXCXCXSXCXCXCXCXMXCX#XCXCX#XoXCXMX#XCXCXoXCXCXCXCXMXOXCXXXoXMXoXoXoXoXoXXXoXXXXXXXXX].XX.XOXOX.X.X].].(.].].(.'.(.).(.|.(.|.|.(.(.'.(.|.~.(.(.(.).)./.|.(. X|.|.!.)./. X(.~.'.|.|.|./.'.(.~.~.|.|./.(.!./.~.!. X(.U.~.~.!./.T.U.U.U.U.U.U.U.I.Y.Y.L.Y.Y.Y.P.P.K.K.K.",
+"oXCXoXoXMX#XMXoXoXoXoXoXoXXXOXXXXX]..XXX.X.X.X.X.X].XX].'.W.N.H.~.[.XXXXXXoXXXoXoXoXOXoXMXoXoXMXnX#XCX#XCXCXMXMXCX#XCXCXCXCXoXCXMX#XCXSXNXCXCX#XCXCXSXMXMXnXNXCX#XAXCXoXCXoXMXSXCX#XCXnX#XCXNXZXNXoXCXCXCXoX#XnXNXCX{.CX#XoXoXoXXXoX[.#X].XXXXOXOX[.|.oXOX.XXX X'.OX.X X(.'.'..X).~.(.(.(.'.~.|.).|.|.'.(.!.|.~.(.).`.~.~.(.~.).(.~.~.).(.). X(.'.(.(.(.(..X~.!.).!. X^.).!.!.!.!.).+X!.!.!./.U.U.U.U.Y.U.I.I.L.P.P.P.P.P.K.P.G.K.",
+"oXoXoXCXoXoXCXoXoXoXoXoXoXoXXXoXXX[.(.XX.X.X]..X].'.`.O.7 6 e 5 5 7 m.OXXX.X#X].MXoXoXoXCXCXMXoXCXCXCXCXoXCXMXMXCXCXCXCXNXNXCXSXMXMX#X#XCXCXCXSXSXCXNXNXC.O.MXCXoXSXSXCXAXCXCXoXnX#XMXNXZXR.7 6 q Q.CX[.oXoXoXCXoXC.e w = w - = w w = ( {.'.7 7 = n.XX.X.XXX XXX'.'..X.X.XOX~.(.|.).).~.'.'.~.~.)..X~.~.).~. X(. X)./ = 7 / ).).5 = 5 O.(.(.|.~.~.|.|.). X~.).(.(.).!.~.!.).!././.U.U. XU./.U.U.U.U.I.Y.Y.I.Y.Y.Y.P.P.K.P.K.L.P.K.",
+"#XoXMX#XMXMXoXMXoXoXoXoXoXoXoXoXXXOX'.XX.X.X(.XXXX_./ % e = q q - 0 0 ) [.{.].oXoXoXoXCXoX[.MXCXoXCXCX[.CXCXoXSXNXMXCXCXCXCXoXCXMXMXCXoXCXCXCXNXCXSXC.( % ) CXCXCX#XAX#XMXSXoXMXCXCXoXCXCXR.6 = 6 R.MX[.oX#X[.CXoXR.6 5 % 6 0 0 = - = ) [.].w e 6 +.'.].XX X.X|..X.X.X(.|.(.XX(.(.~.|.|./.~.).~./.(. X). X). X!.(.(.^ % q ( `.~.7 e 7 O.|.(.~.'.(.(.|.~.).(.).!. X!.(.!.!.+X/.U./.U.U.U.U.+XU.U.U.Y.Y.I.Y.Y.I.I.P.P.P.P.G.K.G.G.K.",
+"MXoXoXoXoX#XoXoX#XoXoXoXoXXXoXXXoX.XXX.X.X.X(.XX'.( % e - 7 t ( 6 5 0 w +.OXXXoXXXoXMXoXMXMXMXoXCXoXoXCXCXCXMXSXNXCXCX#XoXCXCXMXMXMXNXSXCXMXCXCXCXMX) 6 = ( NXZXSX#XMXAXMX[.AXNXCXoXZXoXCXR.0 - 6 R.ZXCX#XCX[.oXoXR.w = = = e 5 7 0 e / [.oX= - = M.{.).(..X.X X.X].|.XX(.).|.).(.+X|.~.). X~.).+X~. XU.T. X^..X(.).) 6 = / ).).+._ O.H././.|.|.).|.(. X).(.~. XU.+XU.@X(.!.~.!./.^.!.!.U.U.U.U.U.I.U.I.Y.L.Y.I.P.Y.P.P.P.K.P.G.F.",
+"oXoXMXoXoXoXoXoXoXoXoXoXXXoXOXoXXXOXXXXX'.XX].].H.6 = % e R.].'.W.e 7 5 ) {..X].oX_.B.+.m.Q.NX[.#XoXCXNX{.N.M.m.M.N.`.nXAX[.NXNX`.m.m.O.M._.CXZXNXE./ 0 - ^ R.Q.SXCXSX{.C.M.n.m.M.}.CXCX#XR.0 = q R.[.[.oX#X[.oXoXR.5 0 = ( [.[.[.].{.#XXX(.w % 0 n.).(..XXXE.n.O.n.B.`.(.(.!.).(.~.^.O.O.n.B.). X!././.!.^.n.O.n.^.^ w 7 / (.).M.N.M.W.(.~.M.H.N.~.R.O.O.n.^.~.).~.(.H.O.O.B.Y.H.N.B.J./.U.U.U.Y.U.I.P.P.I.P.I.P.P.P.P.L.P.G.L.K.",
+"MXoXoXoXoXMX#XoXoXoXoXoXXXOXoX].XXXXOX.XXX].].[.O.0 0 % O.[.#XXX].M.R.{.[.[.oX`.) 6 5 % 7 5 ( `.NX[.CXM.y 6 0 6 % = 5 m.[.CX[.( 6 5 e e % 6 ( {.SX5 0 q = 0 q ) CXNXM.e 6 e % e 6 7 o.CXCXR.0 - 5 R.CXCXoXoXoXoXXXR.5 e 6 / S.H.R.C.H..XXXOX= w = O.{.'.(.O.5 5 0 5 5 y C.'.|.).~.O.& 5 w = 7 e M.(.!.~.N.e w 5 5 e y = = ) ^.).w 5 7 O.^.J.e e 5 B.7 5 & 5 / R.!.~.n./ & 5 % y _ 5 7 ) T.U.@XU.Y.Y.I.Y.P.Y.P.P.P.P.L.L.K.G.L.G.F.",
+"oXoXoXoXoX[.oXoXoXoXoXoXXXoXoXOXXXOXXXXXXX].XX[.( = = 0 C.OX.XXXOXOXOXoX.X#XXX/ = - - q - 0 5 ^ nXMX`.7 - w - = q - w 6 Q.MXo.5 w e +.X.w - 6 M.NXq = 6 0 q 6 ( CX}.5 5 w = = - = 6 e Q.CXC.% w 6 W.[.[.oXOXoXoXoXC.5 q - q q = = ; 0 [.OX'.% 0 - O.XX~.O.= w = q 0 - % e H.'.~._ w = q q q q q e H.~.~./ % - q q 6 6 q w ^ ).).w = e O./.N.% - 6 6 % = = = & O.).Q.7 5 = = = 5 6 - 0 / ~.U.U.U.U.Y.Y.I.I.I.P.P.P.P.K.P.L.L.L.L.G.",
+"oXoXoXoXOX[.oX[.oXoX[.#XoX[.XXXX].].XXOXXX.XXX[.( % 0 6 R.OX'.XXOXOX#X.XXXoXM.7 q 6 M.MXM.0 = 6 O.NXN.( e w M.NXQ.0 % = m.NX( 6 5 y }.nXQ.R.CXCXCXC./ e 6 y Q.Q.SXN.( y 0 M.CXQ.w = 0 +.NXE.5 = 0 R.MXoXoXoXOXoX[.H.0 6 q - 5 6 = q 6 [.'.'.w % 6 O.).W.7 - = o.(.R.e 6 w ) ~.^.= = 5 o./.H.7 q q ( ~.B.0 0 = _ ).n.6 0 = ^ (.(.= = = O.U.H.5 q - / M.n.7 - 7 ^ !.B.q q = O.^.n.6 0 6 ( Y.U.I.I.I.I.I.I.P.I.P.P.K.K.K.L.L.K.K.G.K.",
+"oXoXoXOXoXoXoXoXoXoXoX[.oXXXoXXXoXXXOXOXXX.XXXOX) q % 5 N.OX#XXXXX`.OXoXoX[.) q q ^ [.XXCXt = w X.XXoXCXMX`.N.m./ 6 % e m.MXm.w = w 0 q ^ o.R.NXCXNX( 0 w ..NXCXoXNXCXoX`.R.m.^ w = 5 m.CXC.6 e 6 R.MX[.oXoXoX#XoXH.= q = e ( ) ^ ( ) ].'.OX% 5 0 O.'.n.= = = _./.~.O.q = 7 )._ e 6 7 ^.U./._ 5 6 e T.O.% 0 = ^./.~./ 6 5 (  X X0 e = O. XM.% q 0 B.^.~.^ = 5 ^ U.n.- - 7 T.~././ 0 0 / U.U.Y.Y.I.I.I.I.P.I.P.P.K.P.K.K.K.K.K.G.K.",
+"oXoXXXoX[.oXoXoXoXoXoXoXoXXXOXoXXX.XOXXXXXXXoXOXO.= w 7 M.XX].OXoX( 7 o.M.NX( 5 0 ^ MX#XXXo.% = ( [.nX+.y % 0 % t e = = +.#XCXO.5 - 6 e - w q M.SXCX^ 0 5 ( NXCXCXNXm.t % 5 7 y 0 = & m.nXW.6 % q R.MXoXoXoX[.OXoXR.5 6 w ( {.OX].XX]. XOX.X= = = +.^.m.= 7 7 |. XU.n.q 6 e ).n.% w 5 ~. XU._ e = w T.O.7 = w !.(././ w 0 / ~.~.0 6 6 O.!.H.7 0 % H.!.~./ w e ^ U.O.= - w ~./.!.( 0 0 / Y.U.Y.U.Y.Y.P.P.I.P.P.P.K.K.K.K.K.K.K.G.K.",
+"oXXXOXXXoXoXoXoXoXoXoXoXoX[.XXXXoXXXoXoXXXXXXXOXR.= e = e `.NX{.M.q 5 5 / nXo.6 q y [.#X].y 0 5 o.oXn.e w e M.}.{.- = w n.oXCXnXMXR.m.) e 0 q e MX#X( 6 0 ^ AX].#Xm.= = y M.{.{.5 - 0 m.{.C.0 = - R.oXMXoXoXMXOXOXH.= 6 6 ( OX].XXXX). X'.'.w e 0 O.XXn.5 0 6 W. X/.) 0 0 / ^.n.- - e N.U.U._ % - e !.O.7 0 7 H.).^.y = = ( .X!.0 - = O.~.H.% - = H.!.U.( = = ^ T.B.6 7 = O.~.B.5 0 0 / U.U.U.I.I.Y.I.P.P.P.P.K.K.G.P.G.K.F.K.G.F.",
+"oXoXoXXXXXoXoXoXoXoXoXoXoXoX#XXX#XXXXXoXoXXXoXoXoX( 6 5 % 6 ( / e - = 7 M.[.M.6 - % o.R.o.q 0 5 N.XX( 6 w y N.C.( 0 0 6 m.`.( t 6 m.nXCXO.0 q e NXCX) 0 - ^ C.`.CX( 5 5 y C.C.( % 0 5 M.#XW.7 = 0 R.MXMXOXMX#XoXXXC.q q = ( OXXX].'.oXXX(.'.5 0 0 O. XH.5 6 0 / B.n.0 0 q _ (.H.5 q % / B.n.5 = q _ U.W.% % 7 / M.) 7 = 0 / !.!.6 q e O.U.H.6 - = J.U.!./ 0 0 ^ T.)./ 6 q 5 & 5 0 0 6 / U.U.Y.Y.I.I.P.P.K.K.P.P.P.P.K.G.K.G.G.G.G.",
+"oXXXoXoXoXoXXXoXCXoX[.[.oXoXXXoXoXXXXXXXoXoXoXXXoX{.y 5 0 6 0 0 % q % o.[.oX[.o.w q 5 % 0 q = o.oXMXo.= = = w % = e 0 q O.NX/ 7 w q / t q q % O.NXNXO.q = = = O.MXO.7 e = = = = e = = +.nXC.5 w = R.oX#XoXCXoXoXXXR.- 6 = ( XX].].(.XX).].).6 6 q O.(..X+.0 - = 0 - - 0 y T.).).n.6 q w 0 = = e y T.T.!.) q = - q w e % e ( ^.+Xq 0 % O./.B.6 q = M.^.+X( w 6 / ).U.N.e 5 % 0 / t 0 5 ( U.U.Y.Y.I.I.P.K.P.K.L.P.K.K.K.K.G.G.F.F.F.",
+"XXoXXXoXoXoXoXoX[.oXoXoX[.oXoXoXoXoXoXoXoXoXoXoXoXMX{.o.e 5 6 5 0 e m.OXoXOX#XOXn.e 5 w 5 e m.nXoXoX`.) % = e y N.o.0 e ( [.].o.5 6 e 5 6 e M.NXNXNX{.y 0 0 = ) NXnX^ w = = ^ M.o.7 e ( nXE.% 0 5 R.[.oXoXoXoXoXoXH.e 6 5 [ OX.X'.(..X X'.).7 5 w n.!.(.'.M.y 5 5 7 5 ) T.!.U.T.!.B.y % e = = ) T.T./.+XR./ e w 0 ) o.7 % ^ (.~.5 5 w O.!.M.e 6 & H.~.^.) 5 7 ( +XU.~.W.v.n.B././ 0 6 ( U.U.Y.Y.Y.P.P.P.P.P.P.P.K.K.K.G.G.G.F.K.F.",
+"oXoXoXXXoXoXoXXXoXoX[.oXXXoXoXoXoX[.oXoXoXOXoXoXXX.XMXoXNXE.R.R.Q.oXoX#XOXoX].oXXX[.E.R.R.OXXX#XoXOXoXoXQ.W.W.[.[.[.oXoXOXXXoXMXMXR.H.E._.oXoXoXCX].#XCXQ.C.R.MXoXCX[.}.H.Q.[.#X#X[.[.#X].].CXnX[.MXSXoXMX#XMXoXXX#XoX].].XX X#X|.|.'..X].(.{.(./.{.U. X X@X).H.H.B.^./.@X!.+X~./.+X!.H.B.B.^.U.U.!.U.@XU.!.R.B.H.@XT.^.).T. X@X^.U.^./.U.+X^.).U.U.U.@X^.).T.(.U.H.= / ( B.~.^./ % 6 / Y.@XY.Y.U.I.P.P.L.P.P.G.G.P.G.G.G.G.J.G.F.",
+"oXoXoXoXXXXXOXoXXXoXXXOXoXoXoXoXoXoX#XoXoXoXoXoXoXoXMXoX[.oXoXoXoXoXCXoXOXoXoXXXOXoXXXXXXXOX#XoXOXMXoX.XoX].[.[.].XXoXXXoXOXMXoXoXoXMXoXCXoXMXCXCXCXMXnXNXNXNXoX[.MXCXCXCXoX#X#XoXoXoX[.#X].oX#XoXMX[.oXoXoXoXoXoX[.[.XXoXXX].OX{.OX'..X(.(./.(.].|. X(.|.+X!.+X/.+XU./.U.+XU.U.+XT.!.!./.T.!.T.U.!.U.!.U.!.!.!.T. XU.T.!.+X@X/.).T.^.!. XU.!.!./.~.!.+XU.U.U.U./.H.& % = 5 / y = = & n.T.U.U.I.I.I.P.I.P.P.P.G.K.G.G.L.G.G.G.F.F.",
+"XXoXXXoXoXoXoXoXoXoX].oXoXoX[.[.oXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXMXoXoXoXoXoXXXoXOXXXOXoXoXXXoXoXoXoX#XXXXXXX].oXXXoXXXOXOXoXoX#XoXoXMX[.[.MXoXCXoXCXoX#X#XoXoXCXoXCXoX#XCX#XnXoXoXXXoX#XoXCXoXoXoX#XCXoXCXCXoXoXoXoX.X(.XXXX|..XOX.X(.(.).(..X!.(.).).~./.!./././.!.T.T././.U.U.T.T.U.U.U.Y.!.!.@X!.~./.U.!.Y. XU.!.^.T.U.U.U.T. XU. XU.@X/.U.U.U.U.!.U.U.U.!.U.^._ e = 0 e w = & _ W.!.U.Y.U.I.P.P.P.L.L.P.L.G.K.K.G.G.G.F.F.F.",
+"oXXXOXoXoXXXoX[.XXoXoXoXoXXX#XoXoXoXoXoXoXoXoXoX#XoXoXCXoXoXCXoXoXoXoXoXoXoXoXoXOXXXOXOXoXoXOXoXXXXXXXoXOXoX[.].XXoXOXoXoXoXoXOXOX#XoXOXNXCXoXoXoX#X#X#XCXoXCXMXMXCXoXoX#XoXoXoXoXoX#XOX#XoX[.[.oX#XoXoXoXMXoXoXXX#XXXXX#X[.]..X.X|..X X.X].~.(.(.).~.).~./././.!.!.!. X).U.!.!.T.).!.T.!. X@X X XU.U. X/.U.@X/.U. XU.).!.U. XU.T./.+XU.+X/.!.U. XU.U.Y./.!./.U.U.U.W.B._ / / ( O.O.Y.!.I.I.U.Y.P.P.P.L.P.L.L.L.K.K.K.G.G.F.K.F.F.",
+"#XoXoXoXoXoXoX#XoXoXoXoXoXoXoXoXoXoXoXoXoXoXMXMXoXMXoXMXoX#XMXoX#XoXoXoXoXoXoXoXoXXXXXoXOXoX[.[.oX#XXX.X.XoXoX#X#XXXXXoXoXXXoXoXoXoXMXoX#XOX#XoXCXCXMX[.MXoXoXNXMXoXCX[.oXoXoXoXoXoX{.MXCX].#XCXoXoXoXMXMX[.oXoXoXXXoXoX].OXoX]..XXX.X(.|.|.(.(./.(.~..X(.!.(.~.(./.!.!.!.~.~.!.).U.U.).!.!.U.@XT.T.U./.T.).T.!.T. XT./.Y./.U.Y.).U.!.T.T.T.!.!.!.^.Y.!.U.U.+XU.U.U.U.U.T./.!.T.T.U.U.I.I.U.Y.I.P.P.P.P.P.P.P.P.K.K.G.K.K.F.G.F.F.",
+"oXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXMX#X#XoXoX#X#XMXMXoXCXoXoXMX#XoXoXoXoXoXoXXXoX^.n.m.n.m.O.m.Q.].`.m.M.~.(.oX(..X#XXXXX#XoXXXoXOXoXOX#XoX`.m.m.`.CXNXoXMXCXoXCXCX[.CXMXoXCXoXOXMXM.m.m.[.#X].CXoXoXOXXXXXoXOXoXXXOXCXoX].XX].XX.XXX.X'.'.H.O.m. X!.(.!.(.(.~.!./. X/.!.!.!./. X+XU.U.!.n.( / ) n.!.U.T.O.) / ) H.).U.@XU.!.n./ / H.N.n.n._ O.O.O.n.U.U.@XU.U.T.@XP. X!.U.).U.U.!.U.U.U.Y.I.I.P.P.P.P.P.P.G.G.K.K.F.K.K.K.G.F.F.",
+"oXoXoXoXoXoXoXoX[.CXoXoXoXoXoXoXoXCXoXCXoXCXMX#X#XoXMXoXCX[.MXoXNXoXoXoXoXoXoXoXOXR.w = 6 5 6 % y Q.E.6 & R.OX[.oXXX|.OX#XoXXXoXoXNXMXMXoXMXE.5 % Q.nXoXCXOXoX#X[.oXoXoX#XoXoXoXoXMX( % 7 oX].#X[.oXoXoX#XXX[.OX].OXoX.XoX#X(.OX].].'.'.XX'.O.7 7  X/.~.~.|.!.!. X)./.U.!. XU. X@X!.).).O.7 5 / = % n.!.O.= e / 6 7 W.I.U.U.B.= 7 & N.M.5 e 6 7 5 & ) T.U.U.U.U.U.U.U.U.U.@X/.U.U.U.U.U.U.Y.U.I.P.P.P.P.P.P.K.P.K.K.G.K.F.G.F.G.F.",
+"oXCXoXoXoXoXCXoXoXoXoXoXoXoXCXoXoXoXMXoXMXMXMXMXMXMXMXMXCX[.MXMXMXoXoXoXoXXXoXoXOXR.= = ..O.X.w % n.`.R.R.`.oX'.W.m.M.R.OXoXXXoXoXoXoX{.m.m.V.6 0 H.CXNXE.m.n.R.nXoXMXoXMXoXoXoXoXXX( e 5 nX[.`.+.m.n.N.].oXQ.R.Q.`.n.M.{.].oXOXm.n.m.H.].(.T.N.N.~.T.N.R.N.O.~.!.R.n.O.N.^.).U. X/./.~.e 7 _ `._ % ) ^.% = B.^./ 5 n.U.U.J.7 % 0 e B.P._ _ n.) 7 7 n.T.U.@XU.Y.!.U.U.U.U.Y.I.U.U.U.U.U.Y.I.Y.G.P.P.P.P.P.G.P.L.K.K.G.K.K.F.G.F.F.",
+"oX#XoXoXMXoX#XMXoX[.oXoXCX#XoXoX#XMXMXCXoXCXoXCXMXMXoXMXMXoXCX[.oXoXoXoXoXoXXXoXXXR.7 5 _ R.O.0 7 n.C.e 5 C.NXo.7 = % 7 o.[.oX].oXoX]./ 6 0 q q % W.nXO.% e = 5 O.MX[.MXoXoXoXoXoXoX) 5 = NXQ.7 0 q 5 5 O.nX+.5 y e 7 6 ) NX'./ w - = 7 M.OXO.0 0 '.O.5 y y 7 M.B.- % 0 % / W.|./.(.U./.~.B.^.W./ q ) B.0 6 !.U._ 6 ) Y.P./ = o.5 = B.Y.U./.T./ q O.W.Y.U.I. XY.I.Y.Y.U.U.U.U.U.U.I.I.Y.Y.L.Y.I.P.P.P.P.P.G.P.L.K.K.G.G.K.G.G.F.F.",
+"CX#XMX#XMXoXMXoXCXoXoXoXoX[.oXCXoXMXoXCXCXoXCXMXCXCXCXMXMXMX[.MXoXMXoXoXoX[.oXoXoXC.0 = 6 q q q 7 ].N.0 = R.E.w 0 R.E.= 7 R.[.[.oXNXM.= = W.B.0 - R.R.5 7 R.R.w = Q.nX[.oX].XX#XoXoX( q = oXC.n.( _.o.6 e ].n.0 = n.) ; 6 #Xm.; e {.O.5 e (.n.= 6 XXO.q 7 o.M.{.0 e O.`.y = O.^.+X/./.).).T.H./ = e P.J.q 6 T.U.n.0 ) Y.( 6 O.B.5 = B.U.U.U.n.& ( Y.U.Y.U.U.I.U.U.U.U.U.U.I.U.Y.Y.Y.Y.Y.P.P.Y.I.Y.K.K.P.K.P.K.L.K.K.L.K.G.K.G.G.F.",
+"MXoXMXMXMXoXoXMXMXoXCXoXoXCXoXoXCXNXCXoXoXMXCXCXCXCXCXMXoXoXMX[.oXMXoXoXoXoXoX[.XXC.5 0 y e = y C.OXH.0 = R.n.% 0 #X[.7 = m.oX#XoXCXn.w q CXC.0 q C.M.; = ( ^ = w n.oXoXOXCXOXnXE.[.( 0 5 [.oXM.o.t 5 = = oXn.w - oXm.= 6 {.( = e ^ / = = N.m.= q  Xn.0 % Q..XN.5 6 H.)./ % ( (.@X!.!. X XH.e & / H.U.B.= = U.@X_ q / n.6 e O._ 6 q ) K.U.T.y 7 O.U.T.U.U.U.U.I.I.Y.I.U.I.U.I.I.Y.I.Y.P.Y.Y.L.Y.P.P.P.K.P.P.G.P.K.K.G.L.G.G.K.F.F.",
+"MXMXMXMXMXMXMXMXoXCXoXoXCXoX#XMXoX#XoXCXCXCXMXCXCXNXCXCXCXMXoXMXMX[.oXoX[.oXoX[.OXR.5 0 n.`.e 6 e `.R.0 = H.n.= 0 ].nX5 7 m.MXoX#XCXn.0 = NXC.5 q R.O.7 = m.M.O.M.R.oXoXOXoX( 7 - {.^ % 5 nXO.% w M.O.q = [.m.= w oXn.= e [.( = y B.n.m.n.T.O.% q ).O.; 5 ].+XH.5 6 N.).( q ( ~. X X!.).H.e & o.W.^.!.^.5 w H.U.) 0 _ _ 6 0 = & q - w J.K.B.6 e ^.T.U.U.U.I.Y.Y.I.I.Y.I.I.I.Y.Y.I.I.I.I.Y.L.P.P.P.P.K.P.K.P.P.G.K.K.K.G.K.G.F.F.F.",
+"CXMXMXMXCXCXCXoXCXoXoXoXMX[.CXoXoXCXCXCXCXCXCXCXSXMXMXNX#XoXMXMXnXoXoXoXoX[.oX#XoXR.7 = O.nXm.7 = B.R.- e R._.= 5 m.+.e = _.MXoXoXCXQ.= = m.o.- 0 C.`.5 = m.m.( m.{.OXXXCXoXm.5 = ^ = = ) nX) % t C./ 5 % oXm.w 6 oXm.= % MXn.w - N.o.o.+.OXO.w - .XO.= = '.).OX/ - ) M.5 6 n.(. X+X/.^.^ - w = % = / W.( - o.O.7 0 B.B._ O.O.) q q ) F.I.O.- ^ Y.U.U.U.I.U.Y.I.U.L.Y.Y.Y.P.I.P.P.Y.P.P.P.P.P.P.P.K.P.P.K.L.L.K.K.K.K.F.G.G.F.G.K.",
+"oXoXCXMXCXoXCXCXCXoXCXCXCXCXoXCXoXCXoXoXCXCXCXCXCXMXSXMXCXMXMXMXCXoXCXoXoXoXoXoXoXH.5 0 m.OX'.7 0 7 M.e 5 N.OXM.e 0 % y M.MXMX[.CX[.nXO.0 6 ) e 6 Q.nXM.w w 7 5 m.].#XoX[.oXCX( % 7 % ^ }.[.N.5 % % o.q w E.+.= 0  Xn.5 0 ].].o.= & = e R.{.M.0 6 ].O.7 7 .X].(.E.y 5 e 7 _ )..X(././.N.6 0 % = 7 % ) Y.B./ % 7 5 _ T.Y.Y.Y.Y.B.5 0 B.P.I.( = O.Y.U.I.U.U.I.Y.Y.I.Y.Y.L.I.I.P.Y.P.P.P.P.K.P.P.K.P.Y.K.K.K.K.K.K.K.K.K.K.G.G.G.F.c.",
+"CXCXCXCXCXCXCXCXCXCXCXoX[.CXCX[.CXCXnXCXCXCXCXCXMXSXCXCXCXMXoX#XoX#XCXoXoXoXoXoXoXoX[.MXOX].XX].NXOXoXnXXX#X#XoXoXR.R.oXoX#XOXCXnXoX#XOX_.Q.NXoXoX[.oXoX{.H.R.{.[.oXOXoX(.XXoX{.`.R.Q.nXoX#X#X`.R.(.].].(.#XXX].].#XoX{.'.XXoX].Q.H.W.}.#X|.~..X'.'..XOX.X'.].].(.~.H.N.^.|.).~.~.!./.U.U.^.^.^.U.!.!.U.Y.Y.J.B.H.U.Y.P.P.P.I.U.P.T.P.L.L.P.T.P.I.U.U.U.I.I.I.I.I.Y.I.I.P.I.K.Y.P.P.P.P.L.P.K.P.L.L.K.K.K.K.K.K.F.K.K.F.G.G.G.F.K.",
+"CXCXCXCXCXCXCXCXCXCXCXCXCXoXoXCXoXMXCXNXCXCXCXCXSXCXCXCXCXMXMXMXoXoX[.oXoXoXoXoXoXoXoXXXOXoXoX#XXXXXOX[.#X).#XoXoXoXoXoX#X#XoXMXNX#XoX#XoXOXoXoX#X#XXXCXoXoXOXNXOXoX[.OX#XoXoXoXoXXXMX].#X].XXXXoXOXoX[.XXXX].XX]..X].].XX'.XXoX'.XXXXoX(..X.X'.].(.|.).].'.].(.].)..X'.|.).~.).(./.+X+X XU.~.!.!.U.!.!.Y.I.L.U.I.I.P.I.P.I.Y.H.P.K.P.P.P.I.P.P.U.I.P.P.I.I.I.P.P.I.I.L.Y.K.Y.P.P.P.P.P.P.K.K.K.K.K.K.K.K.K.K.F.K.F.K.K.G.G.G.G.F.",
+"CXCXCXNXZXCXCXCXCXCXNXCXoXMXoXCXMXMXCXCXCXCXSXCXSXCXSXMXNXCXoXMXMXoXMX#XoXoXoXOXoXXXoXOXOXoXXXXXoXoXOX[.oX#XoXOXMXoXMXoXMXMXMXOX#XoXSXOXoXoXoXMXoXoXXXOXoXXXoXOX#XXXXXoXOXoXXXXXoXoXoX[.oXOXOXoX#XXXXXoXOX].oX|.XX.XOX.X.XOXOX|.[.XXOX.X.X.XOX|.|..X|.XX|.XX'.'..X|.OX|.|.(.(.(.!.!.T.~.!. XU.U.!.U.Y.Y.!.Y.Y.^.L.I.I.Y.P.P.K.P.I.L.Y.H.L.P.L.L.T.P.P.P.Y.K.K.K.L.P.P.P.P.P.K.P.L.P.P.G.P.P.L.L.L.K.K.K.K.K.L.G.G.G.L.G.G.G.G.G.G.",
+"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXMXCXoXMXCXCXCXCXCXMXCXSXMXCX#XMXoXoX#XoXoXXXoXoXoXXXoXoXoXOXXXoXoXoXoXoXoXoXoXoXoXoXoXoXCXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXOXoXoXoXoXXXOXoXoXXXoXoXoXoXXXXXoXoXoXOX[.].XXXXOXXXoX.XoXXXXXXX.X.X.X.X.X.X].XX]..XXX.X]..X.X.X.X.X.X'.'.|.|.(.'.(. X(.!.).!.!.!.U.U.U.@XU.U.U.U.Y.I.Y.Y.I.I.P.I.K.P.P.P.K.P.P.P.P.P.P.P.P.P.P.P.P.P.P.L.L.Y.P.P.P.K.P.P.P.L.P.P.G.L.G.G.K.G.K.G.G.G.G.G.G.G.G.G.G.G.G.G.G.",
+"CXCXCXCXCXCXZXCXCXCXCXCXCXCXMXNXCXMXMXCXoX#XCX#XCXCXNXCXCXMX#XoXMXoXoXoXoXoXoXXXoXoXoXOXoXoXoXoXoXoXoXoXoXoXoXoXOXoXoXoXoXMXoXMXMXoXoXoXoXoXoXoXoXoXoXXXoXXXoXoX#XXXoXXXoXoXXXoXXXXXXXXXXXoXoX].oXOXoXoXoXXXXXXXXXXXXX.X.X.XXX.X.XXX]..X.X.X.X|.|.'.'..X.X.X(..X.X(.(.(./. X~./.).!.^.!.U.U.+XU.U.U.U.U.Y.U.I.I.I.I.P.P.K.P.P.P.Y.K.K.P.P.K.K.P.P.K.P.P.P.K.K.K.L.L.L.K.L.L.K.L.G.P.G.K.K.K.P.G.K.G.F.K.G.K.G.G.G.G.G.G.G.L.G.F.G.",
+"CXCXCXZXCXCXCXCXCXCXCXCXCXCXCXCXCXoXCXMXCXCXMXCX#XCXCXMXMXCXMXMXMXoXoXoXoXoX#XoXoXXXXXXXoXXXoXXXoXoXoXoXoXoXCXoXoXoXoXoXoXoXoXoX#XoXoXoXoXoXoXoX].oXoXoXoXoXXXOXXXXXXXoXOXXXOXOXoXXXXXXXXXXXOXXXXXXXoXXXOXOXXX.XOXXXXX.XOX.X.XXX.XXX].XX.X.X.X]..X'..X.X]..X]..X'.(.(.|./.).~./.!.!.!.U./. XU.U.U.U.U.U.Y.U.I.I.P.I.P.P.P.P.P.G.K.K.P.P.L.L.K.K.P.K.K.K.K.K.K.K.L.K.K.K.K.K.K.L.L.K.G.K.G.G.G.G.G.G.G.K.G.G.G.G.G.G.G.G.G.G.G.G.G.",
+"CXCXCXCXCXCXCXCXSXCXCXNXCXCXCXCXCXCXCXMXCXCXCXoXMXCXCXMXMXMXMXoXoX[.oXoXoXoXoXXXoXXXoXXXXXoXoXXXoXoXoX#XoXoXMXoXoXMXoXoXoXoXCXoXoXoXoXoXoXoXoXXXoXoXoXXXoXXXoXXXXXoXXXXXXXXXXXXXXXXXXXXXXXXXoXoXoXoXXXoXoXXX].XX.XXX.X.XXX.X.X.XXXXX'..X.X.X.X]..X'.].].].|.'.'.(.(. X(.~.~.)./././.!.!.U.U.@XU.U.U.Y.U.I.Y.Y.Y.P.Y.P.P.P.G.P.P.K.L.K.K.K.K.K.K.K.K.K.K.K.K.K.L.K.G.K.G.K.G.K.G.G.G.F.K.G.G.G.G.c.K.K.F.G.G.G.G.G.G.G.G.G.G.G.G.F.",
+"CXCXCXCXCXCXCXCXCXCXCXSXCXCXCXCXCXoXCX#XoXoXCXCXMXMXMX#XMXMXMXMXCXoXoXoXoXoXoXXXXXoXOXXXoXoXoXoXXXoXXXoXoXoXoX#XoXoX#XoXoXoXoXoXoXoXoXoXXXoXoXoX[.oXoX[.XX[.XXOXXXXXXXXX.X].XXXX]..X.XXXXXXXXXXXOXXXOXoXOXXXXXXX.X.XOXXX.XXXXXXX.XXXXX.X.X].|.].].'.(..X.X|.(.(.(.(.~.).~.)./.+X/.T.!.!./.U./.U.U.I.I.I.U.Y.I.P.P.P.P.P.P.P.K.L.Y.L.K.K.K.K.K.K.K.G.G.G.K.L.F.K.K.F.F.G.G.G.G.G.G.K.F.F.G.G.G.G.K.K.c.K.G.G.F.F.K.G.G.F.G.F.F.F.G.",
+"CXCXCXCXCXCXCXCXCXCXMXMXSXCXCXCXCXCX#XCXCXoXoXCX#XMXMXMXoXoX#X#XCXoXCXoXoXoXoXXXOXoXoXoXoXoXXXoXXXoXoXoXCXoXoXoXoXCXoXCXCXoXoXoXoXXXoXoXoXoXoXoXoXoXoXoXOXOXXX].XX.X]..X.X'..X.X.X]..X]..X.X.X].XXoXoXXXXXXX].XX.X.X.XXXXXXX.XXX.X].]..X.X.X.X(.|.'.(.].|.(.(.(.(.(.!.!././.+X~./.!./.!.+XU.U.U.U.Y.U.Y.I.I.P.I.P.P.P.P.K.P.K.P.L.K.L.L.G.G.G.G.G.F.G.G.K.F.K.K.F.F.F.F.F.F.G.F.K.c.F.K.F.K.G.G.F.K.K.F.F.F.F.F.c.F.F.L.F.L.F.F.F.",
+"MXCXNXCXnXCXZXCXSXCXSXCXMXCXCXCXCXCXCXCXCXCXCXCXMXMXMXMXMXoXMXoXoXoXoXoXoXoXoXoXOXOXoXXXXXOXoXoX#XoXoXoXoXoXCX#XoXoXoX#XoXoXoXoXoXoXoXoXXXoXoXXXXXoX].oXoXXXOX].].].|..X.X'.'..X|.|..X.X].].XX].XXXXXX[.OXoXXXXX.XXXOXXX.X.XXX.X.X.X]..X.X.X].(.'.(.|.(.|.(.(.(.!.(.(.~./././.U./.!.!.!.U.U.U.U.Y.I.I.Y.I.I.I.I.P.P.P.P.P.G.K.K.K.K.K.K.G.G.G.F.G.F.G.F.F.F.c.c.F.F.c.F.F.F.F.F.c.K.K.c.K.G.F.G.F.F.F.F.F.F.F.c.K.c.F.F.F.F.F.F.F.",
+"#XNXMXMXCXCXCXCXNXCXCXCXCXCXCXMXnXCXCX#XCXCXMXoXCXMXnXMXCXoXoXoXoXCXoXoX#XoXoX[.oXoXOXXXOXoXoXoX#XoXoXoXMXMX#X#XCXoXCXoX#XoXoXoXoXoXOXoXoXXXoXXXXXoX[.XXOXOXOX].'.(..X(..X.X'.|..X(.'.'..X.X].].XXXXOXXXOXXXXXXXXX.X.XXX.XXXXXOX.X.X]..X.X.X].'.'.(.|.|.(.).).~.!.).!.~.)././././.!.!.U.!.U.U.Y.Y.Y.P.P.P.P.P.P.P.Y.P.T.K.K.K.K.K.G.K.c.G.K.c.K.c.K.c.K.c.K.c.c.c.c.c.c.K.F.c.c.c.K.F.K.c.c.K.c.F.F.F.F.F.F.F.F.c.F.F.F.F.F.F.F.c.",
+"CXNXSXSXMXCXCXCXMXCXMXCXCXNXCXCXCXCXCXCXCXoXCXoXoXMX#XoXoX#XoXCXoXoXoXoX[.[.oXoXoXoXoXoXXXoXoXoXoXoXoXCXoXMX#XoXCXoX#XoXoXoXOXoXoX].XXoXXXoXoXXXoXXX[.XXXX]..X.X]..X'.|.(.(.|.|.|.'.(..X|..X.X.X.X.XXXXXXXOXXX.XXXXXXXXXXXXX|.XX'.'..X.X'.XX|..X.X|.|.~.(./.+X/.~.!././.+XU.U. XU.!./.U.U.U.U.I.P.Y.P.P.P.P.P.L.P.K.K.K.K.K.K.K.G.K.K.K.K.c.c.c.K.c.c.c.c.c.c.c.c.c.c.c.c.c.F.K.c.c.c.K.c.K.c.K.F.F.c.F.c.F.F.F.F.F.F.F.F.F.c.F.F.",
+"CXCXCXMXCXCXCXMXCXNXCXCXCXNXCXMXCXCXCXoXCX#XCXCXMXoXoXMXoXoXoXoXoXCXoXoXoX[.oX[.oXoXoXoXoXoXoXoXoXoXoXoXoXMXoXoX#XoXoXCXoXoXoXoXoXXXoXXXoXoXoXoXXX[.].[.OX[..X.X.X.X).(.(.(.(.|.(.(.|.(.'..X|..X.X.X.X.XXXXX.XXXOXXXXXXXXXXXOX|.]..X.X.X.X].|..X(.(. X(./././././.!.!.U.U.U.+XU./.U./.U.U.Y.I.Y.P.P.P.P.P.P.P.P.K.P.P.K.P.K.K.K.G.G.L.c.F.c.K.c.K.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.K.c.c.K.c.c.F.c.F.c.F.c.F.c.c.F.F.c.F.c.F.c.c.",
+"NXCXMXSXMXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXoXCXMXCXoXoXCXoXoX#XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXXXoXoX[.OXXXoXOXXXXXOXXXOX[.XXXX]..X.X|.'.|.(.(.(.(.(.|.(.(. X(..X'.]..X.X.X]..X]..X.X.X.X.XXX.XXXXXXX.X.X(..X'..X(.'.'.(.(.(.(.!.~.!.!.U./.U.U./.U.U.U.U.U.U.U.Y.Y.I.Y.P.P.P.P.P.P.P.K.P.K.K.K.K.F.K.G.F.c.K.F.K.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.F.c.c.c.c.c.K.c.F.c.F.c.F.c.F.c.F.F.c.F.F.c.F.c."
+};
diff --git a/images/scenario7hilite.xpm b/images/scenario7hilite.xpm
new file mode 100644 (file)
index 0000000..3dedae5
--- /dev/null
@@ -0,0 +1,450 @@
+/* XPM */
+static char *scenario_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"209 188 256 2",
+"   c #0F0F0C",
+".  c #12310F",
+"X  c #332C19",
+"o  c #3B3C3B",
+"O  c #363836",
+"+  c #30302C",
+"@  c #1F2022",
+"#  c #1D3D69",
+"$  c #1B3570",
+"%  c #32344C",
+"&  c #233D6B",
+"*  c #253D66",
+"=  c #263C73",
+"-  c #313270",
+";  c #1A1E57",
+":  c #0F560D",
+">  c #007D00",
+",  c #097607",
+"<  c #0F700F",
+"1  c #137427",
+"2  c #3A433A",
+"3  c #30532E",
+"4  c #2B7412",
+"5  c #316A31",
+"6  c #254E1E",
+"7  c #1C426B",
+"8  c #1C4367",
+"9  c #1C4573",
+"0  c #1D5374",
+"q  c #3C4342",
+"w  c #38504A",
+"e  c #22416B",
+"r  c #244267",
+"t  c #234272",
+"y  c #264777",
+"u  c #265678",
+"i  c #3E5A7D",
+"p  c #34587A",
+"a  c #384671",
+"s  c #2D6464",
+"d  c #4D2E15",
+"f  c #463529",
+"g  c #463B38",
+"h  c #543B36",
+"j  c #513128",
+"k  c #69362E",
+"l  c #681F14",
+"z  c #483A46",
+"x  c #4E376E",
+"c  c #46433B",
+"v  c #564439",
+"b  c #4E502C",
+"n  c #526D2E",
+"m  c #674736",
+"M  c #754939",
+"N  c #785639",
+"B  c #6A4F2F",
+"V  c #6F6D35",
+"C  c #594B16",
+"Z  c #424443",
+"A  c #484947",
+"S  c #485748",
+"D  c #554946",
+"F  c #57534B",
+"G  c #575654",
+"H  c #4E4F53",
+"J  c #52536E",
+"K  c #506C4E",
+"L  c #516C6E",
+"P  c #674945",
+"I  c #685549",
+"U  c #675955",
+"Y  c #775648",
+"T  c #765957",
+"R  c #6F4A4D",
+"E  c #6C546C",
+"W  c #786258",
+"Q  c #6E654E",
+"!  c #6E6D6D",
+"~  c #34358B",
+"^  c #3033A9",
+"/  c #383ACA",
+"(  c #285887",
+")  c #3B5686",
+"_  c #2F568D",
+"`  c #266A95",
+"'  c #357398",
+"]  c #316892",
+"[  c #2A78A8",
+"{  c #3678A7",
+"}  c #2F74AC",
+"|  c #1F598E",
+" . c #425685",
+".. c #44558A",
+"X. c #44598C",
+"o. c #465788",
+"O. c #4F548F",
+"+. c #5455AD",
+"@. c #48749A",
+"#. c #556D99",
+"$. c #496993",
+"%. c #4974AB",
+"&. c #716E91",
+"*. c #716BAF",
+"=. c #6A5699",
+"-. c #5254CF",
+";. c #5A65CF",
+":. c #5E63EB",
+">. c #5B63F3",
+",. c #6567DA",
+"<. c #7569CF",
+"1. c #6364E6",
+"2. c #6264EA",
+"3. c #6868EA",
+"4. c #6565F3",
+"5. c #756EEA",
+"6. c #5757E2",
+"7. c #453DB1",
+"8. c #018201",
+"9. c #0F8612",
+"0. c #33A222",
+"q. c #05DB02",
+"w. c #16D80A",
+"e. c #01E500",
+"r. c #0DE905",
+"t. c #28CC0F",
+"y. c #26CE0A",
+"u. c #24D305",
+"i. c #25DA04",
+"p. c #26D10A",
+"a. c #2FCB16",
+"s. c #2FCF1A",
+"d. c #53B526",
+"f. c #698E31",
+"g. c #6AB030",
+"h. c #549227",
+"j. c #5F9262",
+"k. c #5ECE2B",
+"l. c #42AD56",
+"z. c #2C86BA",
+"x. c #3686B7",
+"c. c #3884AF",
+"v. c #258CCA",
+"b. c #2A8ECA",
+"n. c #2A8CC4",
+"m. c #2D91CC",
+"M. c #2994C7",
+"N. c #358DC5",
+"B. c #3293CD",
+"V. c #3A95CC",
+"C. c #3B99CD",
+"Z. c #3598C8",
+"A. c #3595D1",
+"S. c #3C9AD1",
+"D. c #3997D2",
+"F. c #2D91D2",
+"G. c #3CA1D2",
+"H. c #4789B6",
+"J. c #5592B4",
+"K. c #498AB2",
+"L. c #6192A2",
+"P. c #4598CA",
+"I. c #429CD2",
+"U. c #499DD3",
+"Y. c #4599D6",
+"T. c #569AC6",
+"R. c #4C95CC",
+"E. c #4BA2D4",
+"W. c #48A3D6",
+"Q. c #53A5D5",
+"!. c #54A5D8",
+"~. c #55A8D5",
+"^. c #5BAAD5",
+"/. c #5BAAD9",
+"(. c #58A6D7",
+"). c #55A7D0",
+"_. c #63A3C7",
+"`. c #62ADDB",
+"'. c #66ABD6",
+"]. c #65B0DC",
+"[. c #6BB2DD",
+"{. c #66B1D6",
+"}. c #70B5DE",
+"|. c #76B8DB",
+" X c #75AED1",
+".X c #72B6E0",
+"XX c #75B8E1",
+"oX c #7ABBE1",
+"OX c #7CB5E2",
+"+X c #68B1E0",
+"@X c #63A1DE",
+"#X c #7EC0E3",
+"$X c #875436",
+"%X c #8F6B35",
+"&X c #AC6A35",
+"*X c #875746",
+"=X c #90574B",
+"-X c #876558",
+";X c #966958",
+":X c #906C47",
+">X c #8F6E6E",
+",X c #A56A59",
+"<X c #B87459",
+"1X c #AE7051",
+"2X c #B37470",
+"3X c #955A5F",
+"4X c #CB6F35",
+"5X c #D47E5C",
+"6X c #C87753",
+"7X c #CD7C62",
+"8X c #C67966",
+"9X c #D27C64",
+"0X c #D97867",
+"qX c #C47A75",
+"wX c #E37761",
+"eX c #9E251F",
+"rX c #8F6F8E",
+"tX c #8F6EAE",
+"yX c #B0768B",
+"uX c #9E6898",
+"iX c #856ECA",
+"pX c #C47E85",
+"aX c #8D9D3B",
+"sX c #979B44",
+"dX c #8D9144",
+"fX c #8FA742",
+"gX c #AF8D53",
+"hX c #AF8873",
+"jX c #928F74",
+"kX c #C5835D",
+"lX c #D78453",
+"zX c #D78165",
+"xX c #C98468",
+"cX c #E5885B",
+"vX c #E1AA38",
+"bX c #8E908E",
+"nX c #A8A19F",
+"mX c #85B9D7",
+"MX c #81BDE3",
+"NX c #8ABDE6",
+"BX c #9897EB",
+"VX c #90C4DB",
+"CX c #84C0E4",
+"ZX c #8BC4E5",
+"AX c #8CC5E8",
+"SX c #94C9E9",
+"DX c #95C8E8",
+"FX c #9ED0EE",
+"GX c #A9D3E8",
+"HX c #B6D9E8",
+"JX c #A9D0EA",
+"KX c #ACD0D8",
+"LX c #C8909B",
+"PX c #C8E4EF",
+"IX c #C8D2DB",
+"UX c #ABC1AA",
+/* pixels */
+"oXMXoXCXoX#XCXCXCX#XMXCXoXoXoXoXoXoXoXoXoXoXXXXXoXoXoXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXX.X.X.XXX.XXXoXoXoXXXOXoXoXoXoXoXoXoXXXXXXXXXXXOXoXXXoXOXXXXXOX.X.X.X}..X}.}.}.[.}.[.XX}.}.}.}.XX}.}.}.}.+X}.+X[.}.[.}.[.[.[.].[.[.].].`.`./.`./.^.~.~.~.!.~.!.!.E.!.Q.Q.!.Q.Q.Q.Q.).~.~.!.!.!.Q.^.(./.!.!././.~.!.~.!.~.!.Q.~.!.!.^.~.!.`./.`.`.`.`.`.].].].].[.`.`.`.`.`.`.`./.].`.`./.]././.]././.].^./././././.`.`./.]./.`././.`.`./.`.`.",
+"MXoXoX#XZXCXCXCXMXCXCX#XCXCXMXMXMXoXoXoXoXoXoXoXoXXXOXXXoXXXXXXXXX.X.X.XXXXXXXoXXXXX.X.X.XXX.X.XXXXXXXoXoXoXoXXXoXoXoXXXoXoXXXXXOXXXXXoXoXXXXX.XXXXXXX.X.X.X}.+X+XXXXX}.}.}.}.[.}.}.XX}.}.XX}.}.[.}.[.}.[.[.[.[.[.[.[.[.].].`.`.`././.^./.~.~.!.Q.Q.!.!.!.E.E.Q.Q.Q.Q.Q.Q.!.~.Q.~.!.!.!.!.~./.!.~.!.!.~.!.~.!.!.Q.Q.!.^.~./././.`././.`.`.`.'.].].`.`.`.[.`.+X`.`./.`././.`./././././././.]./.].`.^.`.^.`./././.`././.`.`./.`./.`.",
+"oXoXCXCXCXCXCXCXCXCXCXCXCXCXoXoXoXoXoXoXoXXXXXoXoXXXoXXXXXoXXXXXXXXXXX.XXXXXXXXXXXXXXXXX.XXXXXXXXXoXXXXXoXXXoXoXoXoXoXoXXXXXoXoXoXoXXXXXoX|.OXXX.XXXXX.XXX}.}.}.}.[.}.[.[.[.[.XX}.+X+X}.[.}.}.[.}.}.[.[.[.[.[.[.].[.[.].].].{.`./././././.!.!.Q.!.Q.E.Q.!.Q.!.Q.E.Q.Q.Q.Q.~.Q.!.!.!.!.^.!.^.!.~.!.~.!.!.Q.Q.!.Q.Q.Q.!.^././.!././.`.]./.].`.].].].].].`.[.`.`.`.].`.`.`.`.`./././././././././././.`./.`./.].`./.`.`.`.`./.`.`.`.`.",
+"oXCXoXZXCXCXCXCXCXAXCXCXCXoXCXoXMXMXoXMXoXoXoXoXXXoXXXoXoXOXXXXXXXoXXXXXXXXXXXoXXXXXXXXXXXXXXXXXXXXXXXoXOXoXoXoXoXoXoX#XoXoXXXoXoXXXXXOXXXXXXXXXXX.X.X.X}.}.}.}.}.[.[.[.}.}.[.XX}.}.}.}.}.[.}.}.[.[.+X}.[.}.{.[.[.[.].[.].].'.`.`.`./././.!.Q.Q.Q.!.!.!.!.Q.!.Q.Q.Q.Q.Q.Q.Q.Q.~.Q.~.!.!.!.!.^.~.!.~.~.!.Q.Q.Q.Q.Q.!.!.~.!././././././.]./.].`.+X+X`.[.`.`.`.`.[.`.`.`.`./././././.`././././.^.].`./.`././././.]./.`././.`.`.`.+X+X",
+"#XCXCXCXCXZXCXZXCXAXAXCXCXCXCXMXMXMXoXoXoXoXoXoXoXoX|.oXoXoXoX.XoXoXXXoXXXXXXXoXXXoXXXoX.XXXXXoXXXXXoXoXXXoXoXoXoXoXoXoXXXOXoXoXOXXXoXOXXXXXXXXXXXXX.X.X}.}.}.[.[.}.+X}.[.[.}.}.}.}.}.}.[.[.}.{.[.[.[.[.[.[.[.[.[.[.].[.].]./.`.`./././.!.!.Q.Q.Q.!.E.!.E.!.!.E.Q.Q.Q.Q.Q.Q.!.!.~.!.Q.~.!.~.Q.Q.!.~.Q.Q.Q.Q.Q.Q.!.!.~.~./.!././.`./././.].].].].[.`.+X`.`.`.`.[.].`./.`./.^././.^./.^./././././.`.^./.`././.`./.`./.`.`.`.`.`.[./.",
+"#X#XCXCXCXVXCXZXAXZXCXZXAXCXCXMXMXMXMXoXoXoXoXoXoXoXoXoXoXoXoXXXXXoXoXoXoXXXXXoXoXoXoXoX.XoXXXXXoXoXoXoXoXoXoXoXoXoXoXoXoXoXXXXXXXXXXXXX|.oXXXoX.X.X.X}.}.}..X[.[.}.}.[.XXXX+X[.}.+X[.[.[.{.[.[.[.[.[.[.}.{.{.[.[.].].].].].].`.`././././.!.Q.Q.E.~.!.!.~.!.!.Q.Q.~.Q.Q.Q.Q.Q.~.^.Q.~.Q.Q.!.Q.Q.Q.Q.Q.Q.!.^.!.~.~.!.!.!././.!./././.`././.].`.].`.[.[.`.`.[.`.`.'.`.]./.].]./././.^./.^.]././.]./.`././.]./.]././.`.`./.`.@X`.`.+X",
+"CXCXCXCXZXZXZXZXAXAXAXAXCXAXCXCXCXCXMXMXMX|.oX|.oXoXMXoXoXoXoXoXoXoXoXoXoXoXoXXXXXOXXXXXoXoXoXXXXXoXoXoXMXoXoXoXoXoXoXoXoXoXXXoXXXoXOXoXXXXXoX.X.X.X}.}.}.}.}.[.[.}.XX+X[.[.}.}.[.}.[.}.[.[.[.[.}.[.[.[.[.[.[.[.].].].'.`.`./.].`././././.!.!.!.~.!.Q.!.!.Q.!.Q.Q.Q.Q.Q.Q.~.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.~.Q.!.!.~.!.~.~./.~.~.!./././.`.`.].`.].].+X[.`.[.`.[.`.[.]./.]././././.^.^.^././.^./././.`././.`.]././././.].`.`./.`.`.`.].",
+"CXCXCXCXZXZXZXZXZXSXZXAXAXCXZXCXCXCXoXCXMXMXCX#XoXoX|.MX|.MXMXoX#XoXoXXXoXoXoXXXXXXXoXoXoXoXXXoXoXoXoXoXoXoX#XoXoXoXoXoXoXXXoXXXoXXXXXXXOXXX|..X.XXX}.}.}.}.[..X}.[.[.XX[.[.+X[.+X}.[.+X[.[.[.[.[.[.[.[.].[.].[.].].].`.`.`.].]././././.~.!.~.!.!.!.!.Q.!.!.!.Q.Q.!.~.!.~.!.~.!.!.!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.~.!.(./.~.!.~.!.!././.`./.`./.`.].].+X`.+X+X[.`.`.`.`.].]./.]././././././.^./././.].^./.`.`././.^.]././.`./.`./.`.`.`.].",
+"CXCXAXAXAXAXSXZXSXAXSXZXAXAXAXAXZXCXCXMXMXMXMXXXCXMX|.MXMXMXMXoXoXoXoXoXoXoXoXXXXXoXXXoXoXoXoX#XoXCXoXoXoXoXMXMXoXoXoXoXXXoXXXOXXXXXXX|.XXXXXXXX.X.X[.}.[.}.}.}.[.}.[.}.}.+X}.[.[.[.[.}.}.}.[.[.[.[.[.].].+X[.[.].].].`.`.`././././.!.^.~.!.Q.!.!.!.!.Q.!.!.Q.Q.!.!.!.!.~.!.!.!.!.!.!.Q.!.E.!.Q.Q.Q.Q.Q.Q.Q.Q.~.!.^.!.^./././././././.].`.].].+X[.`.[.`.`.`.`.[.].`././.`./.'.^././.'.^././.^.'.`.^././.'./././.].]./.].`.`.`.+X].",
+"CXCXAXCXAXAXSXZXZXZXDXFXGXGXGXFXJXJXJXGXJXJXGXJXGXDXDXNXMXoXMXoX#XoXMXoXoXoXXXoX|.oX|.oXoXoXoX|.#XoXMXMXMXCXoXoXoXoXoXoXoXoXoXXXXX#XXXXXXXXXXX+X.X}.XX[.[.[.}.+X}.[.}.+X}.[.[.+X}.}.+X+X[.[.[.[.[.}.+X].].].].].].].].`.]././././.^./.^.~.~.!.!.E.!.Q.Q.!.!.!.Q.!.~.!.~.!.(.!.!.!.!.!.!.Q.!.Q.Q.Q.Q.Q.Q.Q.Q.~.!.(.!./.!././././././.]./.`.`.].].[.+X[.`.`.[.`.`.]./.`./.E.].{.mXmXVX|.CXNXVX|.CX|.VX#X|.{.'.T./././.`./.`.`.`.`./.",
+"CXZXAXAXAXAXAXSXZXFXGXHXHXPXPXPXPXPXPXPXPXPXPXPXPXHXFXDXNXCXNX#XoXoX#X|.oXoXXXoX#XoX#XoXoXCXCX#XCXoXMXoXoXoXCXoXoX|.oXoXoXXXoXXXXXXXXXXXXXXXXXXX.X}.}.}.}.}.}.+X}.}.}.[.}.[.[.[.[.[.[.}.}.}.[.[.[.[.[.[.+X].+X`.].].`.{.`./.`./.^.~.(.Q.!.~.!.~.!.~.Q.Q.E.Q.Q.!.!.!./.!.~.!.!.~.Q.Q.Q.E.E.~.E.E.E.Q.~.W.!.!.!.~.!.!./.^./.~./.`.`.`.`.`.`.].].].`.`.[.`.+X+X[.`.`.`./.Q.].|.DXDXGXGXGXGXGXGXGXGXGXHXGXDXZXmX'.).`.`./.{.`.`.`.].].",
+"ZXCXAXAXSXAXAXAXDXJX8 8 r r r r & e & & e & e e * # r FXDXCXoXoX#XCX#XoXoXoXoXXXoXoXXXoXoX#X|.#X#X#X#XCX#XoX#X|.#X#XoXoXoXXXXXXXXXXXXXXX}.XXXXXX+XXX+X}.{.[.}.}.}.}.[.[.[.[.[.].[.].].[.].+X[.[.[.[.].[.].].].`.`.`.]./.`.`././.`././.(.(.!.(.Q.Q.Q.Q.Q.~.Q.Q.Q.(.~.!.!.(.(.(.(.!.!.!.Q.!.!.!.!.Q.Q.).Q.Q.(.!.(./././.!.!.`./././././.`.`.`.`.].+X+X`.+X`.`.`.`.`./././. X7 8 r r e & e e r & 7 e * r r # r |.`.`./.`.`.`.`.].`.].",
+"ZXZXAXAXSXAXSXSXFXHXr * # r r * e e e e e e 7 t e e & JXVXCXCXNXNXMXoXMXoXMXoXoXoXoXoXMXMXMXMXNXMXMXCXoXCXNXMXMXoXCXMXoXoXoXOXXXXXXXXXXXXXXXXX.XXX}.}.}.XX[.}.}.}.}.[.[.{.[.].[.[.[.[.[.[.[.[.[.{.].].].].].`.+X+X`.`.+X/.`.`./././.!.!.!.!.!.!.!.!.E.!.Q.!.!.!.!.!.!.!.!.!.!.!.!.Q.!.!.!.!.!.E.!.!.!.!.!.!.~./.!././././././././././.+X`.+X`.+X+X+X`.+X+X`.`.`.`.`.`.'.NX8 r & e & e & r & e * e r & # t e VX'.`././.{.`.].`.].].",
+"ZXZXSXAXSXSXSXSXFXHX8 e t e r r 7 e t & e # e # t & 8 GXVXCX#XCX#XoXMXoXoXoXoXoXoXoXoXoXMXMXMXoXoXMXoXCXoXoXMXoXoXoXoXoXoXoXoXXXXX|.XXXXXX}..XXXXX}.}.XX+XXX+X[.[.[.[.[.[.[.[.].].].[.{.].[.{.].[.[.+X+X].].+X].].`.]./.]././././.^.^.^.~.~.Q.!.W.!.!.!.!.!.E.!.Q.Q.!.!.!.!.!.!.!.Q.Q.W.E.!.E.!.E.!.Q.Q.!.!.!./././.^./.'./././.].`.'.`.`.+X+X`.`.].].+X`.`.`.`.`.].`.'.mX# r & t e e e r r e e r 8 8 7 r r DX|.{.`.`.{.`.].`.].].",
+"DXSXAXSXSXSXSXSXGXPXr & 7 9 * a r r # # # 7 e e e * r DXAXAXCXCXCXCXCXoXMXoX#XMXMXoXoXCX|.CXMXNXMXCXCXoXCXMXMXCXCXoXCXMXoXoXoXXXXXXXoXXXXXXXXXXXXX+XXX}.}.}.}.[.[.[.[.+X].].].+X].+X[.].+X`.`.+X].].].`.].`.`.`.`.].`.`./.`.`.`./././.!.!.~.!.!.!.E.E.Q.Q.!.~.~.~.~.~.).!.!.E.!.W.!.Q.Q.E.!.!.Q.Q.Q.~.Q.).~.~.!./.!./././.!./.`./.`././.`./.`.`./.].`.`./.`.`.`.]./.'.^.|.9 8 & r r r r 8 8 r r 7 * * t 8 = KX|.`.`.`.`.].].].].].",
+"DXSXSXSXSXSXSXSXFXPXt e 8 r PXPXPXPXPXPXPXPXPXPXHXHXGXDXoXCXCXCXCXCXCXCXMXoXoX#XoXoX#XoX#X#XoXoX#X#X#X#X#X#XoX#X#X#XoXoXoXoXXXXXXX.XXX.XXX}.}.XXXX}.[.[.[.[.[.[.[.}.+X+X].[.+X[.].[.[.].+X[.].[.].[.+X+X+X+X`.`./.`.`.`.`.`././././././.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.Q.(.!.(.^.(././././.^././.`.`././.`.`./.`./.+X/.`./.+X@X/././././.Q.'.|.VXJXGXGXGXJXGXGXHXPXPXPXr & e # GX|.`.`.].].].`.].+X].",
+"AXSXSXSXSXSXDXDXGXPX* y * * PXPXIXJXJXGXFXGXGXJXKXNXSXCXAXAXCXCXCXAXMXMXMXMXCX#XoX#X#XoXMXoXCXMXoXMXCXMXCXCX#X|.#X#X#X#XoXoXoX.X|.}.XX|.}.|.|..X.X.X[..X.X}.}.[.[.[..X+X+X+X+X].`.`.[.[.`.[.`.'.{.{.[.].].].].'.'.`.'.`.`.`.'.^./././.~.^.~.~.!.!.!.!.!.!.!.!.!.!.Q.!.!.!.E.!.!.!.!.Q.W.!.Q.Q.!.!.!.!.!.(./.!././.^.^./.^././././././././././.].`./.`.`./.^./.{.`.'.`.`.R.{.{.|.|.|.mXOX|.MX#XVXHXPX* 8 e 8 KX|.{.].{.[.].[.].].].",
+"SXAXSXSXSXSXSXDXGXPXr & r i PXHXSXSXAXSXAXNXAX_.*.#.X.X.X.X.X.X.X.O...X.X.X.X.X.X.X.O.X.X.X.X.X.X...X.X.X.X.X.o.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.) X.) X.X.X.X.X.X.X...X.X.X.X.X.X.X.X.X.X.X.X.) X.X.) ......X.X.X.) X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...X.X.X.X.X.X.X.X.X.] $.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.o.%.K.@X'.`.(.`.`./.DXHXr e r e KX|.`.`.{.].{.].{.[.+X",
+"SXSXSXSXSXSXDXDXGXPXr = 8 7 PXHXAXAXAXSXmX#.o...X.....) X.) O.X...) ......o.......X.X.X.............o...........O...) X.O...o...X.X.X.....X.X.X.o..... ...o.......o...) ....X.X.........O.o.....X...) X.........o...........o...X.X.........) ..X.....) X.o.X.X...............) X.) X.X.....) ..X...) X.....) ..o.X.o.X.X.........X.X.) ....o...o.....) X.X.X.X.X.....o.....X.......X.T.{.`.@X+XmXHX8 8 r y GX|.].].].].].].].].].",
+"SXSXSXSXFXSXSXSXFXPXr = 8 e HXFXSXAXSX X#.X...$.X. .) J ) J ) ) i i i i  .i i i J i i  .i i i ) ) J i i i  .i i i ) i ) J ) p p  .i i i i ) J ) i i i i )  .i i  .i J ) J i i  .i i i p ) i i i i ) i ) J ) i i i i i i i i p p i ) J  .i i  .p ) i J ) J i  .) i i i i i i ) J ) ) J ) i i  .i i ) i ) J  .i i i i i ) ) J i i J ) ) J i i i i i i  .i J ) ) i i i  .i ) i i ) ......%.T.'.`.!.|.KXr r # e KX|.`.+X].].].].].{.].",
+"SXSXSXSXSXSXFXFXGXHX8 & r r PXGXSXSXmX#.) ..] s l.s.i.i.i.i.i.i.i.i.u.i.i.i.p.i.w.i.i.i.i.u.u.i.i.i.i.i.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.u.i.i.i.i.i.i.u.i.i.i.i.i.i.w.i.i.w.i.i.i.i.i.i.i.i.i.u.i.i.i.i.i.i.u.i.i.i.i.i.i.i.u.i.i.i.i.i.u.i.i.i.i.i.i.i.w.w.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.i.i.u.i.i.i.i.i.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.0.L  .o.) +.T.'.`.|.KXr 7 t * KX|.].].].].].[.].].[.",
+"SXSXSXSXSXSXSXDXGXPX& y # r PXFXAXmX#.....X.j.s.u.i.i.w.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.w.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.t.l.L ....$.T.}.[.GX9 # & & GX X].+X].].[.].[.].[.",
+"SXSXSXSXDXFXFXDXGXPX& & 7 r PXGXDX#.X...O.L w.i.i.i.i.i.i.i.i.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.w.i.u.i.i.u.i.i.i.i.i.i.i.u.i.i.i.i.i.i.u.u.i.i.i.u.i.i.u.i.u.i.u.i.i.i.i.i.u.i.i.i.u.i.i.i.i.i.i.i.i.u.i.i.i.u.i.i.i.i.u.i.i.i.i.i.i.u.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.i.u.i.i.i.u.i.i.u.i.i.i.i.i.u.i.i.i.i.u.i.i.u.i.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.u.l. .....$.T.|.KX8 e & r GX|.].].].+X[.[.[.[.[.",
+"SXSXSXSXDXDXDXDXGXPX* y 7 & HXGXNX .X.X.j.a.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.u.y.l.X. .X.@. XGX8 t 8 * GX}.[.].[.[.[.[.[.{.].",
+"SXSXSXSXDXSXFXSXJXPX7 & 7 t PXDXmX..) #.s.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.s.s o.o.X.|.KXe e t 8 GX[.[.].[.[.[.[.[.[.[.",
+"ZXDXSXDXSXSXDXFXJXHXe e 7 e HXDXJ.) O.j.t.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.i.i.i.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.u.i.i.i.i.u.i.i.u.i.u.i.i.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.u.u.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.u.w.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.i.i.i.i.u.i.i.i.i.i.i.p.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.l.$.o.o. XVXe 8 e e DX'.].[.[.[.[.[.[.[.[.",
+"SXZXSXSXSXSXDXDXFXHXr * e = JXVX*... .s.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.fXdXh.dXsXsXsXsXaXsXsXsXsXsXsXsXsXdXL.K.c.L.K.L.L.c.c.L.c.L.L.c.K.L.sXsXsXsXfXg.g.g.g.g.g.g.g.g.g.g.g.g.g.g.d.g.g.g.g.d.g.g.sXsXsXL.L.L.K.dXsXsXg.g.sXsXsXsXf.5 5 h.h.5 5 h.5 h.5 h.5 5 5 f.sXsXsXsXsXsXsXsXsXsXg.g.g.g.g.fXsXsXsXsXsXsXsXsXsXaXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.s.$...X._.mX# r r r VX{.{.[.[.[.[.[.[.[.[.",
+"DXDXSXSXDXSXFXSXDXJXe r r # GXmXX... .y.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.9X<XG W 7X7X7X7X7X7X7X7X7X7X7X7X5XuX>.:.;.:.:.;.1.,.,.1.;.1.,.,.1.yX7X7X5XxXd.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.r.e.e.e.e.e.r.q.kX5X2X4.;.6.uX7X9Xg.e.r.kX9X7X0X-XT >X;XP Z v Z Z v D + A P q W -XW -X1X9XxX5X7X9XkXq.e.e.e.e.gX9X7X7X7XgXsX7X7X7X7Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.L X.) J. X8 7 8 8  XQ.}.[.[.+X[.}.[.[.[.",
+"ZXDXSXSXSXSXFXDXZXDXJXGXJXFXSX X.... .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X;XF 8X9X7X7X7X7X7X7X7X7X7X7X7X7XiX:.,.1.1.1.1.1.1.1.,.1.2.>.<.5X7X9X7Xd.q.q.q.q.q.q.gXg.e.q.q.q.e.q.gXgXgXgXgXg.e.q.q.w.kX5XtX:.3.3.xX0XgXe.w.sX0X7XzX,XG ;XzXzX*Xd.sXh g d.sXj d.sXP 2 g h O U -X-XW W T <XgXr.r.e.g.0X9X9X7XxXw.e.d.0X9XkXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.L ..) K.T.|. XOX'._.W.+X}.}.}..X}..X[.[.",
+"SXSXSXSXSXSXSXSXDXZXAXDXVXZX#XDXX.X.) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X8XU 6X7X7X7X7X7X7X7X7X7X7X7X7XlXtX:.1.1.1.1.1.1.1.1.1.1.:.<.8X5X7XkXd.e.q.q.q.sXkXd.fXd.q.q.w.gXg.w.8X0X0X9XzXg.e.q.q.gX9XtX:.1.1.,.8X7Xd.e.sX0X8X9X<XG U <X9XzXN f.dXg g f.dXd f.dXh z d.fXj g + % T ,XW G ;XQ dXkX0XzX9X9X7XzXgXq.r.d.9XkXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.$.....K.H.T.^.Q.).P.[.}.}.XX}.}.}.}..XXX",
+"SXSXSXSXSXSXFXDXDXDXDXFXFXDXFXSXX.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X8XG W 7XzX7X7X7X7X0X0X7X7X7X7X5XtX>.1.1.1.1.1.1.1.1.1.:.<.qX5X7X7Xd.e.q.q.r.s.9X0XfXe.e.q.q.gX0X0X<X7X7X7X0XfXe.q.q.gX5XyX>.1.1.1.yX9XgXr.sX0X7XzX,XG U 8XwX7X7X1X*X=XI q z g + g c q o f.dXd 2X~ + Q *XM c P T G 3XT ,XzX7X7X7X0XgXw.e.sX7Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#.) X.@.J.{.'.[.}.}.}.}.}..X.X.X.X}.}.}.",
+"SXSXSXSXSXSXFXDXFXDXFXDXFXDXDXFXX. . .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X8X;XG <X7X7X7X0X7XsXgXgX7X7X5X5XtX>.1.1.1.1.1.1.1.1.2.,.qX5X7X0XaXe.e.w.sXgX8X7X7X0Xd.e.q.e.fXgX0X9X7X7X7X9XsXe.q.gX0X5XtX:.1.1.3.8XkX8XkX0XzX<X-XF U 2XsXgX0X7XzXzXzX<X-X;X;X;X;X;X;X=X$X=XR ! >XY W O uX2Xk Y g v Q G ,XzX7X7X7X9XgXgX9X8Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.X.o.%.J._.{.[.}.}..X.X.X.X.XXX.XXX}.XX",
+"SXSXSXDXSXSXDXDXFXSXSXDXFXSXDXFXX.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kXlXxXxXU 6X7X7X9XgXs.e.e.s.0X9X7X7X7XtX:.1.1.1.1.1.1.1.:.<.lX7X7X7X7XgXgXkX0X0X9X7X7X0XfXe.q.q.e.q.sX0X7X7X7X7X7XgXgX0X5XyX2.1.1.1.3.8XzX9X0XzX,XG U ;X<XgXe.e.aX0X0X9XxX5XzXlXqXyXxXzXzXcXzXcX<Xm f f h g 2XyXd =X! Y 7XT F -X;X9X7X7XzXzXxXkXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#...o.@.J._. X}.[..XXX|..XXXXXXXXXXXXXXX",
+"SXSXDXSXDXSXFXDXDXDXFXDXDXFXDXSXX.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kXxX9X6XG -X7X7X0Xg.e.e.q.w.gX9X7X7X5X5XiX:.1.1.1.1.1.1.tX8X5XzX5X5X5X0X9X5X5X9X5X7X9X9X7Xg.e.e.q.q.w.sX9X7X7X7X7X9X0X0XlXtX:.1.1.2.,.2XkX7X9X,XF Y 6XzXzX0XaXq.e.g.0X9XzXzXqXuX2.3.2.uXyX2X2XyXwX%X2X~ O O + D @ 3XD h zX8X-X-X,X7X7X7XxXkXzXkXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#...) #.J._.].}.[.}.|..XXXXXXXXXXXXXXXXX",
+"SXSXSXSXSXDXDXDXFXDXFXFXSXFXSXSXX.X. .i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X7X7X-XG 6X7X0XxXgXd.e.q.s.wX7X7X7XzXuX>.1.1.1.1.1.1.tXyX2XyXyX2X2XyX2XyXyX2XqX5X9X5X7X9XgXgXgXg.r.i.7X7X7X7X7X7X7X7XtX:.1.1.1.2.,.qXzXzXzX-X .rXpX2XyXqXwXfXq.e.gX9X2XuX2.2.1.1.1.>.:.2.3.2.uX>X! -Xg A bXUXv Q $X=XxXgX9XzXzX7X7X7X5X7XxXkXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#...o.@.J._.'.}.}..X.XXXXXXXXX|.|.|.XXOX",
+"SXSXSXSXDXDXFXDXSXDXSXDXSXSXSXSXo.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X7X9X8XG -X8X9X0X0XzXgXs.k.0X7X7X7X9X8XtX>.1.1.1.1.1.1.3.2.2.2.2.2.1.2.1.1.1.,.yXyX2XqX5X5X0X9X9XgXkX9X5X9X5X5X5XlXyX>.1.1.1.1.1.2.yX2X2X2XW +.4.:.:.3.1.uXqXaXw.gXqX2.:.2.1.1.1.1.1.2.2.2.2.2.;.E N H z nXL b i.gXwXkXw.sXwX7X7X7X7X7X7XcXcXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.o. .@.J._.'.}.}..X.XXXXXXXXX#XXXXXXXXX",
+"SXSXDXSXDXDXSXSXDXSXFXDXSXSXSXSXX.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X7X7X7X;XG 8X9XV Y N =X=XN 6X9X7X0XkX<XwXiX2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.2.2.:.,.yX2X2X2XyXqXyXyX2XyX2X2XyXqXtX:.1.1.1.1.1.1.:.3.2.4.O.#.4.1.1.1.1.:.1.yXgX5XuX:.2.1.1.1.1.1.1.1.1.1.1.1.4.*.=.*.D E U -XkXlXzXwXfXd.zX7X7XzX9X5X9XqXyXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#...o.$.J._.'.|.}..X.X.XXXXXXXoXoXXXXXXX",
+"SXSXSXSXSXDXSXFXFXDXSXSXSXSXSXSXX.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X7X7X9X6XG -X<X0.Q k m V M 1X9X7X0Xd.w.gXuX>.4.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.2.2.2.4.2.2.2.2.3.1.3.2.2.2.2.2.1.1.1.1.1.1.1.1.1.1.5.O.+.3.1.1.1.1.1.:.:.yXyX4.1.1.1.1.1.1.1.1.1.1.1.1.2.3.-./ +.O.4.4.3.tXhX2X2XhXw.sX5X5XqX2X2XyX1.;.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#. . .@.J._. X}.}..XXXXXXXXXXXXXXXXXXXXX",
+"SXSXAXSXSXSXSXSXDXDXSXSXSXSXAXSXX.X.) u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X7X7XzXzX;XG R j.nX5 k n B <X0XzX0Xg.r.s.0XLXtX4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.2.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.J =.2.1.1.1.1.1.1.1.:.>.:.1.1.1.1.1.1.1.1.1.1.1.1.2.2.-.+.=.O.4.1.2.2.2.2.:.<.rXuXyXtX,.2.2.:.:.,.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.o. .@.J._.'..X}..X.X.X.XXXXXXXXXXXXX.X",
+"SXSXSXSXSXSXSXSXSXSXSXSXDXSXSXAXo.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X7X7X6X=X=Xc 2 + q 3 I T Y -X;X-X*X*XV 1X5X$X$XO.;.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.O.#.4.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.3.+.-.#.o.3.1.1.1.1.1.3.:.>.:.2.2.:.1.1.:.:.,.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#...o.@.L._.{.[..X}.}..X.X.XXXXXXXXXXX.X",
+"SXSXSXSXSXDXSXSXSXSXSXSXAXSXSXZXX.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kXxX7X9X<XV f.m *XU -Xh v O O A O g n g.=X&X6Xn d.B +.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.2.4.O.#.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.4.4.*.=.*.o.4.1.1.1.1.1.1.1.1.1.1.1.1.2.:.tX2X2Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.o. .@.J._.'.[.}.}.}..X.XXX.X.XXX.X.X.X",
+"SXSXAXAXSXSXSXSXSXSXSXSXAXZXZXZXX.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kXxX7XkX6Xb h.m 8XU =Xn k.$Xb g.=X% n g.N v Y b fXV *.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.3.3.J +.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.2.uX2X1X1X>XE 3.:.:.,.:.1.1.1.1.1.2.2.1.:.tXlX5X5Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.o. .@.J._. X[.}.}.}.}..X}..X.XXX.X.XOX",
+"SXAXSXSXSXSXAXSXSXSXSXSXDXZXZXAXX.) X.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X0Xd.d.8X1Xj m O % n g.$Xb g.$Xq g j m h Z g j M $X*.>.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.4.O.=.>.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.:.uXqXxXcX6X6X,X-XqXqX2XLXyX1.3.2.1.1.1.:.2.tXlXzX0XgXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.X.X.@.J._.'.[..X}.}.+X}..X}..X.X.X.X.X",
+"SXAXSXSXSXAXSXSXSXSXSXAXAXAXZXAXX... .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX9X7Xp.w.7X6XS H G q g =Xd d j B Q G b k.N T G b g.$X=.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.o.! ,.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.uXlXzXzX,XY Y P U ;X;X;X;X;X>XrX,.4.2.5.yX2X7XxX0XsXw.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#. ...@.J._.'.[.}.[.}..X}.}.}.}..X.X.X.X",
+"SXDXAXDXSXAXSXAXDXDXZXSXAXAXAXAXX.X.o.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kXxXa.q.q.s.1XS K 2 Y G T V g.=Xh.s.U n h.m <XU b g.V =.4.1.1.1.1.1.2.2.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.*.*.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.>X;X;X<X=XL H + w O g + g g O T 2XT T 3X5X7X7X0XsXw.e.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.o. .@.J._.{.}.+X[.}.}.}.}.}.}.}.|.}..X",
+"AXAXAXAXZXSXAXSXZXZXZXZXZXCXCXNXX.X.J i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.7Xd.e.q.q.e.d.N b b 6X;Xz n g.:X1XkXU g R R =XF B *X&X5XiX:.1.1.2.1.2.2.1.1.1.3.1.1.1.1.3.2.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.:.>.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.+.P 2 % -X;X! G g g d.sXj h.sXh -X<XV V $X9X9X9XxXw.e.e.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.....#.J.T. X[.[.[.}.}.[.}.[.}.[..X}.}.",
+"AXAXAXAXZXSXSXZXZXDXZXAXCXAXAXCXX.X.L i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kXkXa.q.q.e.i.xXzX1XkX5XF g =XB $X=Xv O D g T U g.k.$X$XE 6.5.3.3.3.4.4.4.4.4.4.2.2.1.1.3.3.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.2.2.1.1.1.1.1.1.1.1.1.4.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.x 4XhXg ;X*X@ d N g g.sXj f.fXh -X=Xh.n k zX9X9XkXr.d.gXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#. .o.@.J._.{.[.[.[..X[.[..X}.}.}.}..X.X",
+"AXAXDXAXAXAXAXSXZXZXAXCXAXCXCXNXX.X.o.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7XkXa.e.e.e.d.0X6X$X<X;XH -X6Xn d.m C g.*X,XW b b b g.%Xh E E E E 3XJ ~ O.x ;.4.5.4.4.4.4.2.1.1.1.1.1.1.1.1.1.1.1.4.4.4.3.3.1.1.1.1.1.1.1.1.2.+.;.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.O.xXLXG T Y bXD N q g h + h h o T I Y 6X6X0XzXzX8XgXzXzXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.....@.J.T. X}.{.}.[.[.}.[.[.}.}.}.[.[.",
+"AXAXAXAXZXAXAXAXAXAXAXCXCXCXCXMXX.X.J w.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX9X9XkXsXgXsXhX9X9X6X%XzX-XH T V g.m b g.:X1XQ     6 g.=X< j.3 2 @ d C % &.eXG E E x - ~ - ;.4.3.1.1.2.:.1.2.1.:.>.+.- - -.4.4.1.>.2.2.1.2.2.+.J 3.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.+.k j H Z A j.z + W I g D + g v o w m =XM $X=X=X9X9X8X-Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#. ...@.J._.{.{.{.[.[.+X}.[.}.}.}.}.[.}.",
+"AXAXZXAXZXAXAXZXAXAXCXCXCXNXMXCXX.X. .u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7XxXzX0X9X0X9X9X7XzX1X7X9X;XH g m I g m c -XG @   X =X$X< 5 V Z v N N ; -.J 2 x =.eXX d   =XpXyXqXyXqXyX2XLXyXpXpXX X ; ^ 6./ / -./ / 6.:.4.J +.4.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.E LXG H A z g o ;X=Xh.dXj h.aXh c h.fXj h.dX$X7X0X,XS i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.X. .@.L._.'.[.[.[.[.[.[.}.[.}.[.}.}.[.",
+"ZXZXNXZXAXAXNXAXMXAXCXCXoXMXoX#XX.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7XkXgXkX9X7X8X7X7X7X&X7X7X8XD A A A F A A Z I G + S -X;X+ . g D 2 2 + + ; % c - -.J B :XO R ,X:X;X:X;X;X:X;X;X;X,XX j - H ! % ^ % ! % +.;.&.U +.4.:.:.2.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.4.*XLXjXc A g B Y -X=Xg.fXj f.fXP g f.fXj f.fX*XzX8XQ Q i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.o.o.@.J.J.'.'.}.[.'.[.}.[.[.+X}.+X+X[.",
+"ZXAXZXZXCXCXNXAXAXAXCXCXCXoXMXoXX... .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX0Xg.e.d.0X9X9X7XzXzX:X7X6XY Y A *X*Xf j j Y Y A A U -X-X3X>Xg + q O I 2 I ;XU + ; % z O g O + c O % Z + g @ 6 + O @ @ ; U ! % ^ G jX% rX-X2 c R >X2XLXuX2.3.1.1.1.1.1.1.1.1.1.1.1.1.1.4.z d f + A bXv N W Y g h + h D Z Z h v + g c v ,XW G ;Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.#... .@.J._. X}.[.[.[.+X[.[.[.[.[.[.[.[.",
+"AXAXAXCXCXNXCXCXAXoXCXCX#X#XXX#XX...) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX9XgXsXgXzX7X7X7X7X7X&X7X8XP <XU -X5Xn g.:X<X7X*X=X*X=X<XzXwXX   o @ $XC $X=XD D 5 1 5 b d.:X@ d M z N g.:X4 j.l I ;XU 7.E ! - ^ J ! - =.=XA gXv z uXyXyX<.:.1.1.1.1.1.1.1.1.1.1.1.1.1.4.R 4X2Xz H &.c 2 q v V N q q O g g O g z D -XW q O 2XkXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#... .@.J.T.'.[.}.`.}.[.[.[.[.[.[.[.+X}.",
+"AXCXAXCXCXAXCXCXCXCXoXNXoX#XoX#XX... .u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.xX9X9X0X9X0Xd.s.0X7X6XhXgXlXm <X;XH *XV g.:Xm =X4X1Xm $XM *X$Xk   @ U F Y I U Z g 6 : : b g.:XX m N Z v f.%X3 UXK $X5XW ; - ; - ~ - ; ~ 3XY c hXU ~ 4.>.>.:.1.1.1.1.1.1.2.1.1.1.1.1.1.1.:.3XxXLXG O X D + H ! U M L G @ h.fXj h.aX$X6X,Xb $XcXlXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#...o.@.J._.'.+X`.[.`.[.].].[.].[.[.+X+X",
+"CXZXAXNXCXCXNXCXCXCXCXoXoXoXoXXXo.X...i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.gXa.s.gX7X0Xd.s.9XlXgXbXjX4XM <X0X>XS O v O U L B W L M B U L Y B c D hXL o ! P o v g.1X  h h O 2 O A Y h h . S 3 v 1XT b d.:Xv F ! q m T F % A g J +.*.tXtX2.1.1.1.1.1.1.1.1.1.1.:.1.1.4.>XM =XD Z LXK H Z ;XjX+ ! T X g.fXj f.fX$X1XF N hXbXbXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#.O.X.@.J._.'.'.[.[.`.[.[.[.[.[.].+X[.[.",
+"CXAXCXCXCXCXCXMXoXCXoX#XoX#XXX#XO.X.) i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.d.w.sXs.d.0XgXgX7XzX1XbX>X4X$X1X<X<X*XI Y A ! ! + U ! g d ! U g 1XU O F O + + O Z b k.:Xd D 5 2 c j w L ! G S 5 5 S ,X-Xb g.dXz Z hXU O A % N N - - a E 2XyX:.1.1.1.1.1.1.1.1.1.1.2.1.1.6.4.pXwX,Xo LXjXg g Z z + g O + h v + v v v W J &XhXnXUXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#.o.o.$.J._.'.[.[.[.[.].[.].].[.[.+X[.+X",
+"AXCXCXCXCXCXCXNXoXCXoXoXoXoXoXXXo.X.X.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.a.d.wXgXgX9X9X9X7X5X1XG U 1X$X&X<X1X6X6X<XU O O g + O g g o O O Y D + + m -X;XU S o v h -XU , w =.k a jXgX) 9.9.8.5 ;XT 2 v v Z P P g O E j.B N ~ H ! % +.3.2.1.1.1.1.1.1.1.1.1.1.1.1.1.:.-.W =XU q h v Z A 2 2 O + q A q A q q A W H ,XlX-XjXjXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.#.o...@.J.T.{.].+X].].[.[.[.].[.}.[.[.}.",
+"CXAXCXCXCXCXoXCXoXoXCXoXoXoXXXXXo.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.a.s.0X0X0X9X8X9X7X5X4X%X&X4XY :X,X;X,X:X,XD A A D F F A g 2 B N b m d   m &X*XD N v Z g Z S 6 * -.! ~ %.+.) C C C 3 2 A % + + Z -XU U U G ! o O ~ G &.o =.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.O.! H + A q o Z A ! G     ! H + A ! G f W W zX6X&X&XgXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.o.) @.J._._.+X].[.[.].].].[.[.`.[.[.+X",
+"CXCXAXCXCXoXCXoXNXoXoXoXoXoXoX.X....) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.gXgX7XxXgX9X9X9X7X7XzX1X9X0X<XY *XY D D c c Z Y g g + g g G U Y Q G Q $XvX=XH ! N d X B Z W U % % % + ; ; w eXvX&Xh nXbX; D h 2 W -X8X-XD m M v _ G ! z 7.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.O.Q G o A ! S + q >X>X@ @ ! G g 2 >X>XO F ,XzX6X&XxXxXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.X. .@.J.T.'.`.].].].].].].[.[..X[.[.[.",
+"AXCXCXCXCXoX#XCXoXoXoXoXXXoXXX.XX...) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.8X9X0Xg.r.s.8X9X7XkXzX&XxX9Xs.d.0XzXG w L E G <XW ! + Z c D hXG O hXQ d vX,XH ! O X I B o ;Xv o g D x &.eXO eX4XeXR UXL X P E q Y =X6X%X-X:X1XQ ^ / ^ / 6.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.+.a P m o 2X>X+ D =Xm c W m m m D *XN + W zX7XgX1XcXxXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.X. .@.J.T._.`.].].].].].].[.`.[.[.[.[.",
+"CXCXCXCXCXoX#XoXoXoXOXoXXXXXXX.XX...) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.xXcX9XgXt.e.s.9X0X7X5X:X0Xg.e.w.xX7XU X.vXfX) ,XR hXA q v m T D h T D P *XR D D B m R P U G j >XJ O - +.L c B d l 6 3 . @ d @ 2 G ! k x - ~ ~ G tX:.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.4.pX,Xq A v o W -Xv v -X;X:X-XU ,X-XI 1XlXwX4X4X4XlXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#. . .' J._._.`.+X].].[.`.`.[.[.[.[.`.[.",
+"CXCXCXoXoX#XoXCXoXoXoXXXXXXX.X}.X...) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kXxXzXzXhXsXw.s.xX9XzX:X0XgXsXa.p.8XU ^ #./ a &XY =X*XA v uX4.5.5.3.5.5.2.3.5.5.E <.4.5.4.J l 8X*.q % ; % A M V :X: 8.b uX2X: 3 U ! g ; J ! ; =.iX:.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.>XN 2 O 2 v $XA A A O z g O z z % -X4X&X;X1X*Xm 4Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.X. .@.K.T.'.`.].].].`.[.[.[.`.[.[.[.[.",
+"CXCXCX#XCX#XoXoXoXoXoXoX.X.X.X}.O...) u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.dX;X;X,X9XwXk.r.d.0X0X1X9X0XwXxXp.d.U L J a H <X=X*X$XF P -X=.+.+.+.+.+.+.*.+.+.O.=.+.+.+.H j l m c S D D H Y V V : 8.3 yX2Xv J J - R - H jX% / 4.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.4.E :X;X+ >XD %XF j O j h.aXd h.dXh T 4X$XG U F S 4Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.o. .@.L.J._.`.+X].`.`.[.`.`.[.[.[.].[.",
+"CXCX#XCXMXoXoXoXoXoXXXXX.X.X}.+XX.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.W W W G ;X,X;Xf.dX;X2X*X,X;X,X,X-Xf.G ;X<X:XG ;X+   @ b T D v v N *X*X$Xj d $Xj C f g v v z g % d g O h I O m V $X6 , X h h c ;.4.>.uXrXL ! % -.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.>.O.kXLXh L.Z o @   @ v g.fXj g.fXh *XcXbXbXjXQ I lXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#... .@.K.).^.`.`.].`.`.[.`.}.[.].].[.`.",
+"#XMXMXMXoXoXoXoX#XXXXXXXXX}.}.}.X...) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX9X7Xv z g g g z w w 5 b n 5 S W -X-XH 3 2 2 w z D v b c c c S ;X<X,X,XW ! B I ! q o Z Z O A ! o O F nXS F P 5 f.b yX,Xo w 5 #.4.:.yXrX^ ^ / -.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.+.E =Xh + o o 2 + h + j j   j =Xv W wX:X;XnX! I lXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.....@.K.T.'.`.`.`.`.`.`.`.[.[.`.`.[.].",
+"CX#XMXMX#XoXoXoXXXXXXXXX}.}.}.[.X.X.) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX0X<XV dXm B dXm S 4 h.hXUXj.S *X:X*XA 1 V l q n g.$X% H gXf O % A 2 q ! ! O Z ! F o H ! O X LXF + P LXW 2 T k 6 b yX2Xg n 8.] 4.1.3.,.3.4.4.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.3.2X*XG -X-XQ -X,Xf h.dXX g 8X3XU 4XjX>XnX-XN 4Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#... .@.J.T.'.[.`.`.[.[.`.[.[.[.[.}.{.[.",
+"#XNXMXoXoXoXXXoXXXXXXXXX}.}.[.[...X.L i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X7Xb h.j n g.B Z V K nXfXf.w 9.Q l 2 j.UXS 2 n g.:XO D LX2 + 3 ! 5 2 % O g + O O c D LXG . I x E R *XY R n 3 A h P h 2 %XV #.4.1.1.1.2.1.2.1.1.1.1.4.4.4.3.1.1.1.1.1.2.1.3.3.1.1.2.1.1.1.1.1.2.! G ;X2XnXW -X,Xf h.fXP q + + q N dXaX%X&X4X4Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.o.X.$.J._._.`.`.[.{.`.`.`.`.`.[.[.[.`.",
+"MXoXMXoXoXoXoXoXXX#XXXXX}.}.}.[.X.X.$.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.zXd.d.,X,X$XM =X=XS > K nXnXK 2 j.nXS q . S . 2 X h X z g D O 2 K j.j.q z g z g c c A g v z 5 #.4.5.,.,.3.5.` 3 R E H G E -X*.3.1.1.1.1.1.1.1.1.2.4.4.%.@.' ;.4.2.4.2.2.3.2.3.4.4.1.;.2.1.1.1.4.tXW Q E &.vX) ;X,Xh $XB + O     @ 5 Q LXjXf.kX1Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.#.....@.K.T.'.[.`.`.`.[.`.[.`.[.`.`.[.[.",
+"oXoXMXoXoXoXoXXXXXXXXX|.}.}.[.[.O.X.) u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kXgXgX9X5X0X0X0X0XG 1 5 f.K 5 S . 3 . o n dXm Z l rXa Z 2 O O D @ + . 2 z yX=Xj yX3Xc 3 5 3 +.+.+.3.2.1.2.2.4.=.*.5.O.=.4.+.-.:.1.1.1.1.1.6.4.3.;.=.rXK 4 < K rXrX>X+.+.*.+.+.+.*.O.+.3.1.*.&.=.W F U  .+.&.^ W Y I <Xv + Z h.sXv S >XUXk.f.<X&Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#.o.o.@.J.T._.[.`.`.`.`.`.`.[.].].].{.].",
+"MXMXoXoXXXoXXXoXXXXX.X|.}.}.[.[.X.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX0X7X7X7X7XkXkXgX-XT F % g g A 2 o H O n d.m q l qX=.o 2 Z H % b g.:Xo R LX,Xj LX,Xc , 9.Q E J F O.1.3.1.:.4.BX5.4.L +.>.+.-.2.1.1.1.:.4.iX*.*.T c 3 D z z g g o I :XW O.J J L J O.1.2.4.;.G S G <X,Xw ; # F G m o q Z Z z g.fXP w j.nXj.Q 6X1Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#.X.o.$.J.T.{.[.`.`.`.`.[.`.[.].].].{.[.",
+"CXoXoX#X#XoXXXXXXXXXXX.X}.[.[.[...X.) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X7X7X0Xg.r.q.w.d.0XD b g.N o A ! F % j Y Y S d k f O H ! S O n k.:Xg o D h + z h A n rX5.3.4.#.F O.,.4.1.4.BX@X>.O.*.4.+.-.3.1.1.>.4.4.yXY 3 S c bXj.+ z uX,X% =.rX3X,.2.2.1.2.4.2.2.1.2.+.2 I ,XI c j.m N Q &Xb K ! 6 o X f + K f.:XV :XkXdXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#.O.o.@.J._._.`.`.`.`.[.`.`.[.].].[.].`.",
+"oXCXoXoX#X|.XXXX|.XXXX.X|.}.[.[.X.X. .u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X7X7X9Xa.q.q.q.s.0XP n k.:Xz : : : 3 H g z O k T G z . . . z h P v Z W c 2 A I S 5 &.3.2.1.1.4.+.F O.1.2.4.BXiX:.J +.4.=.;.4.4.;.*.+.+.E S , 1 H UXj.6 D yX0X; * =.% / 3.1.1.1.:.2.2.1.4.=.c ! A + H bXc O ;X,X2 j.j.2 Z O G o *X0XxXzXzX6X1Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#.o.o.$.J.T.'.`.[.`.+X`.`.[.`.].].'.].[.",
+"#XoXMXoXoXoXXXXXXX|..X.X.X}.}.[.X... .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X7X0Xg.e.q.e.w.gX0XU + m h S 1 4 4 < A k >X- v >Xg % 4 j.2 c q g o H <XQ nXbX,X4 1 ;.4.1.1.1.1.>.=.S O.,.3.BXiX4.O.>XyX;XW j.&.E 2 O O O 6 : 3 o @   O + v f ; H bXO / 4.3.1.1.1.4.:.1.2.=.A ! U g A + f o W :X+ . + @ A K ! + W gXp.fX0X6X1Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#...X.@.J.T._.{.`.{.].`.].[.].[.].[.].].",
+"CXoXoXoXoXoXoXoXXXXX|..X}.}.[.[.X.X.) u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X7X7XgXfXg.fXgX=X=Xz U H % h g % z g A l 2X=.j *Xk A < 0.I c $ x eXq :X>XUXJ B n &.4.3.1.1.1.1.1.:.+.D +.>.BXJ.%.O.$X%X:Xn < b F 3 bXG @ L.; O % z h o 3 L K $ ! ! Z / 4.1.:.1.:.4.>.:.:.;.q @ @ f G A H F A A j 3X2Xv 2 6 6 + W s.e.q.sX6XdXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.....@.K._.'.[.`.{.].[.`.+X].`.[.].].].",
+"oXoXoXoXoXoXXXXXXX|.|..X}.}.}.+XX.X...i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.8X7X7X7X7X0X0X0X6Xc q H 1XR b g.$X6 g.$X% k $X-X<XcXzXU O b B A l =XG + % @ 3 6 4 >X3.1.1.1.1.1.1.1.2.4.J +.4.BX5 3 D F F A G F 5 A 3 UXL.: l.l.O Z D E o A j.j.- ~ - - ~ <.iX@X5.@XiXiX5.BX<.a @   f m Z D A Z c k yXLXh A % z Z Q r.e.a.7X<X&Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.o...@.J.J._.].[.].].`.[.[.[.[.[.[.[.[.",
+"oXoXoX#XoXoXXXXXXX}.XX.X}.}.}.[.O.X. .u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kXkX7X7XxX7X7XzX8XK ! F <XD V k.=Xb k.1XA ,X2X,X,X,X,XI ;X2X<XG @ X   w j.+ : > jX1.:.2.1.1.1.1.1.1.2.3.J +.rX%Xb c O b h O P n < 3 A g :   : w z o h % q 2 3 b m m 3 H E <.BXBXBXBXBXBXBXBX*.D X O h B g k $XF %   h D g f h.dXh W fXaX6XLXkXvXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#... .@.K._.{.+X].].].[.`.+X[.[.[.[.].[.",
+"oXoXoXoXoXXXoXXX|.XX}..X}.}.}.+XO.X.) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X7X7X8X7X5X=X=XX . . R D g P f O m h D A % g o g q b 3 2 3 q x E eXE UXj.< 0.&.2.1.1.1.1.1.1.1.1.1.2.O.W 4 8.8.5 A bXbXq W F D c v c jXj.% D z g A A c Z A R B 4 > ] 4.4.1.1.1.1.1.1.:.:.4.O.X X 4XgXeX4X4Xk U W o g A Z d.fXm W 0XwX,XbXgX4Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#...o.@.J._.'.].].[.[.+X[.`.`.[.+X+X].[.",
+"oXoXoXoXoXoXoXXXXXXX.X.X}.}.[.[.X._ J u.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7X7X7X9X9X6Xn g.k < V d w D o o 2 q 2 F B f.N j -XU o 5 ! 5 2 ~ -.E @ U 2 : ! 4.1.1.1.1.1.1.1.1.1.1.2.O.4 1 < 1 3 E UX! O A Z A H v F UXj.3 h 3X$ O g >X3Xg D 4 > 8.s ,.4.1.1.1.1.1.1.:.:.>.tXLXT vXlXeX4X1Xk W ,XV %XP O j k + W kX4XjXbX>XlXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#. ...@.J.J.'.[.+X[.[.[.[.}.[.[.[.}.[.[.",
+"oXoXoXXXXXoXXXXXXX.X.X.X+X[.}.`.X.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.gX9X8X7X7X0X6XV k.*Xj.nXn A Y %XB l E x O V k.:Xm -XZ o 5 &.K b @ 8 @ 3 K O 4 &.4.2.1.1.1.1.1.1.1.1.2.3.L 2 O z c S c A 3 2 c bXbXo B h % 6 2 U 2X! o D yXpXv A 3 < 9.< s +.2.1.1.1.1.1.1.1.:.:.>.+.Y $Xl C l C w Z g.fXh g B N f T 1X4XW U W 4Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.o.o.@.J._.'.[.[.[.[.[.[.[.[.[.[.[.[.[.",
+"oXoXXXoXoXXXXX.XXXXX.X.X}.[.+X[.X.X.) u.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.xX9XzXzX9X<X,Xh R g : K 6 q V k.*Xl LX=.q X m d j P O q 6 l + w 1 < < ! nX! rX4.2.2.1.1.1.1.1.1.1.2.1.rX4 4 bXD : 5 Z 2 % o G UX! O Z 3 3 2 o + c d + + v P c A g A A D 5 ] 4.1.1.1.1.1.1.1.1.1.3.>.<.,X4X%XK ! + O f m g T n f.h W zXlX&X%X&XlXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.#... .@.J._.'.[.[.[.[.[.}.[.[.[.[.[.[.[.",
+"oXXXoXXXXXXXXX.XXXXX.X}.+X[.[.].O.X.) u.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.lXzX,X1X=XF q Z q S g g z A X k X l j g q @ f m 1XU % g z o z Z H 2 3 + L K -.:.2.1.1.1.2.1.1.1.1.:.5.4 , 1 UXj.: 5 2 bXbXO z H 2 2 D 4 8.6 z g X rX3XC 3 S F D j ,X! + +.4.3.1.1.1.1.1.1.1.1.1.<.tXiXrX6X=Xj.j.3 2 K ! 3 U M R v W zX8XlXzXzXkXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.o. .@.J._.{.[.+X}.[.[.[.[.[.[.[.[.[.[.",
+"oXXXXXXXXXXXXXXX.X.X}.}.+X[.].].X.X. .u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.xXgXn f.m z < K 3 % M W F o b f.$Xm V k Z f v Y 1XI b g.N d g.$Xz 3 UXK : &.4.2.2.1.1.1.2.2.1.1.2.3.uXn < q H 2 < 3 G IX! O c o 2 D A 6 1 3 R E g yXqXk z b j m M Y *Xv L ;.4.1.1.1.1.1.1.1.1.>.tX1X<X,X1XI 3 3 O S j.j.2 G T W W -X9X7XzXxX9XkXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.o. .#.J._. X[.[.[.[.[.[.[.[.[.[.[.[.[.",
+"XXoXOXXXOX.XXXXX.X.X.X.X[.[.].]...X. .u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX7Xn h.m Z 8.j.N O Y -Xc % n k.=Xb d.B A m I k $XU b k.:Xb k.V o E IXh.E 4.4.4.4.3.2.2.3.3.4.4.4.! Q A g g % O % D O Z + 3 A =.- O F D G O f % @ m h f D g ,X!   j j f 5 ' 4.1.1.1.1.1.1.1.1.3.+.- - a a L J E U c 3 3 + W cX8X<.,.2X7XzX7XkX7Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.X.) #.J._. X}.[..X`.[.[..X[.}.[.[.[.[.",
+"oXoXOXXX.XXXXX.X.X.X.X+X[.].[.{.o... .i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.,X,XN M m q 6 + g c g F f A v Y h M M P H ,X<X<X:XF o N h M P m A o + . O.;.+.*.*.+.;.+.;.+.*.+.*.5 3 z =.x @ A f g 3 ! K + - 6.+.O Q b o g g D D D h P U v M -Xd >X;Xg o.%.;.2.1.1.1.1.1.1.1.3./ * &.% / 4.4.tX;Xa - - J ;X7X<.>.4.yX5XkXa.w.sXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#... .@.J._.[.[.}.}.[.[.[.[..X[.[.[.[.[.",
+"oXoXXXoXXX.X.X.X.X.XXX[.[.[.[.[.O.X...i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.Q T Q W T T A z A b U z 2 g w 2 2 3 w Z 2 2 3 S A g A z g Z U W W T D J L J J J J J J J J J J J F S 5 - 6.7.X U E O S j.j.2 + ; ; + 5 8.5 z 2 2 A w 5 S S g v m j yXqXk w 1 ' 4.1.1.1.1.1.1.1.4.-.% jXw ^ -.6.rX3X$ =.% x zXpX2.1.:.yX5X0Xg.r.g.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.#.o. .@.J._. X}.+X}.[.}.[.}.[.[.[.[.[.[.",
+"oXoXoXoXXX.X.X.X.X.X[.[.[.[.[.].X.X.) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.xXg.w.w.w.g.N f.m D 1XR yXN : 6 ! 5 : 1 ! 5 5 K N V N M V N ,XwX<X1XI ;.4.2.4.2.:.2.4.4.2.2.4.5.W : : . $ ; X h % Z 2 3 6 O q H V g 5 < 3 D c bXnX: 8.8.6 z o % o x x % +.>.2.1.1.1.1.1.1.1.1.2.6.U ! b ^ +.+.E E w bX% x zX<.3.:.:.yX7X9X7Xq.q.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.o.) #.J._. X}..X}.}.[.}.[.}.}.[.}.[.[.",
+"XXoXXXXXXX.X.X.X[.[.[.[.[.[.].[.....i u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.xXs.e.q.q.t.V d.m A :X-XLX;X: 1 &.5 : 1 ! K B v n k.%Xb k.:X=X<XG U J ;.3.2.1.1.1.1.1.1.1.1.3.rXI c uX=Xg U D o c Z o O F G q ! -XO T h + f U UX! . , , 6 3X; z U $ - O.% / 3.1.1.1.1.1.1.1.1.3./ ^ 7.^ / 4.>.iX=.E ! D x <.6.6.;.tX6XkX8X0Xg.q.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#... .L.J._. X+X}.}.[.}.[.[.[.}.[.[.[.[.",
+"XXXXXXXXXX.X.X}.[.}.[.[.[.[.].{.X...) u.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kXgXw.e.w.dX$X=X=XR H k D f , , d C > , C . < S m =XM j Y m A U J *.3.2.1.2.1.1.1.1.1.1.2.2.<.9.3 P LX2Xg ,X*XO.% ; z f =X-XO + + o v % z h X w 3 + =.- g hX>XY -X- H jX2 / 4.1.1.1.1.1.1.1.1.1.4.4.:.2.4.1.1.3.-.^ 7.^ ^ 7._ +.=.1X%X1XzX9X7Xr.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#...X.@.J._. X}.+X}.}.[.}..X[..X[..X}.+X",
+".XXXXXOXXX.X}.}.}.[.[.[.[.[.[.[.O.X...i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX0XgXg.gX0X0X9Xg.d.U ;X> > 8.1 9.B : : > > S U 8X9X<X1XH U W rX1.2.2.1.1.1.1.1.1.1.1.1.1.1.<.0.5 g R v q <X=.6.^ j R x =X-XA A F H A h R E : 8.6 x 6.+.+ 5 b X g O.E ! z 7.<.4.3.1.1.1.1.1.1.1.1.1.1.1.3.3.1.1.1.4.4.>.2.3.4.3.>.yXlX%X1XzXkXr.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.o. .#.J._. X[.}.[.XX}.[..X[..X}.}..X}.",
+"XXXXXXXX.X|.}.[.[.[.[.[.[.[.].].X.X.) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kXzX9X0X0X9Xg.w.e.s.F S 1 : , : < c 2X*X, < S 8X<X,XG U T rX<.1.2.1.2.1.1.1.1.1.1.1.1.1.1.:.5.4 6 2 O 2 S *Xz ; % X j % D P c c b O P v h % : 1 S % $ - 6 < . rX3X; ~ ~ ^ =.tX4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.>.yXzX8X1X7X0Xg.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.....@.J._.{.}.}.}.[.[..X+X}.}.[.+X.X}.",
+"XX.XXX.X.X.X}.}.[.[.[.[.[.[.].[.X...) u.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kXzX9X9Xg.r.r.0.d.f.1 S < % z f : T LX3X, 8.c ;XG I J <.<.2.:.2.1.1.1.1.1.1.1.1.1.1.1.1.4.>.*.4 , 5 S 5 o z >X=Xm v z h R U S < 8.5 S S A o Z Z 2 2 c A q z z LXqXc S =.iX,.:.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.>.yXzX6X1XzX0X7Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#...o.@._._.|.[.}.}.[.}.}.}.}..X.X}.}.}.",
+"XXXX.X.X.X[.}.}.[.[.[.}.[.[.].{.o.X. .u.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.xXg.w.w.e.d.f.< > , , O A D U G B b v b < < b J T rX1.:.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.4.;.1 , , K L.n O D LX2Xf F S S 5 S < 1 1 1 8.5 h >X3X@ z O O h >X;   B m O J >XqXtX>.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.>.yXlX4X4XwX5X6Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.#...o.@.L._.{.}.}.[.}.[.}.}.[.+X}.}.XX}.",
+"XX.X.X.X[.}.[.[.[.[.[.[.[.[.].[.O.X.X.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.g.r.d.a.f.: : : 4 % z X z O b ; 6 , , , S U E ;.,.3.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.:.2.;.1 > 4 > 3 T v Z g R P + D 4 > > > 1 %.>.5 > 5 z LXqXj G E o F 2X! : 8.1 U &.,.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.iX5X4X1X&X%XN 4Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.L...X.#.L._.[.}.{.XX}.}.}.+X}.XX}.}.}.}.",
+"XX.X}..X.X|.[.[.[.].[.].[.[.].{.X.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.g.n : : 4 P >X$XB P T U 3 H , b U U U U J 2X,.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.3.4.4.4.;.;.1 > 1 rX0.%X8X<XT F A A g S 1 > > 8.s ,.1 > > 3 g v m @ h % o F G m 3 1 w ;X0XtX>.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.>.yX4Xm G F H v gXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.&...o.L.J._. X[.XXXX}.}.}.}..X}..X.X.X}.",
+".X.X}..X[.[.}.[.[.[.[.[.].].].{.X.X.o.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i., n bX3 C 3XLX;X: + g ; 1 S U J <.<.<.<.:.:.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.+.%.%.1 8.1 1 ;.5.n :XU G H Y F H I 4 > > > > 8.> 9.> > 5 5 > 3 G A b b c q q % c 2 =XyX3.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.iX7X6XhXbX>XW T 4Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#.o...#.J._.}.}.[.XX}.}..XXX}..X.X+X}..X",
+".X.X}..X}.}.[.[.].[.[.].[.].].{.X.X.o.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.> ! IX0., 2 R h S G U U R F rX1.:.2.2.>.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.4.;.1 > 1 1 1 %.4.>.&.6XW G Y b B <.4.s , > > > > > > > > > 5 S S w Y 4 , 3 z j.nX+ #.O R <.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.>.2X5XlX-XjXbX! I lXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.#.o...#.J._.[.}.}.}.+X.X.X}.+X.X}.}.XX.X",
+"}.}.+X}.}.}.[.+X].[.].].].].].].X.X.) u.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.< o O 6 1 : c F L <.<.<.*.E ;.3.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.4.;.%.1 1 1 +.4.4.>.;.rXX =XW R N 4 8.i 3.4.s 8.8.> > > > > > > 5 3 : , . O.x + G IX! . l.l.~ 4.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.iX8XxX6XjX>XnX! I 4Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#. ...#.J._. X[.}.}..X.X.X.X}..X.X.X}.}.",
+"}..X}.}.}.[.[.+X[.[.[.].].'.].]...X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.L I F I I G J <.3.1.2.2.6.J -.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.2.;.%.1 9.1 %.4.4.4.&.&.5 9.3 R 2 m 4 8.8.8.i 4.s 8.8.> > > 8.> > > 3 g >X3X% 6.7.O o Z O X 4 s ^ 4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.yXlX5XlX4X<X&X4X&XvXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.....#.J._.}.}.}..X}..X.X.X.X.X}.}.}.}.",
+"}.}.}.}.[.[.[.[.[.].].].]./.+X/.X. .o.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.,.<.-XiX<.<.1.:.1.1.1.1.,.J -.:.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.1.;.%.< 1 1 ;.4.3.*.&.rX4 3 F z g O A 1 1 < < , > c.4.s 9.8.> > > > > 8.5 G yXqX+ = - o 2 K O R iX,.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.,.<.2X5X5XwXcX7XcXkXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.....L.K._.].[.|..X}..X.X}..X}.}.}.}.}.",
+".X}.}.}.[.'.[.[.[.].].].`.]./.`.X.....i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.,.4.~ 1.2.1.2.1.1.1.1.1.,.J ,.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.;.< 1 1 ;.:.>.;.rX4 9.< . Z % E l f F A % Z H 1 8.8.s 3.' < > > > > > , 5 z R k O F I G G UXj.O.>.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.:.3.<.<.2X5X7XxXcXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.o. .@.L._. X|.[..X}.|.}.}.}.}.}.}.}.}.",
+"}.}.}.}.[.[.[.}.[.[.].].+X/.+X/.X.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.@X,.~ 4.1.1.1.1.1.1.1.4.6.G ;.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.5 1 %.4.4.2.&.9.< 2 A c A D - ;.! f H h >X=Xg 1 > 8.8.i ;.1 , 8.> 8.8.3 U U D P Q <XcX;X2 jX! X.4.1.1.1.1.3.3.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.:.1.<.yX5XlXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#. ...@.J._. X[.}..X}..X}.}..X}.}.}.[.+X",
+"}.}.[.[.[.}.+X[.+X].[.]./.+X/./.X. ...i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.,.3.O.1.1.1.1.1.1.1.1.1.,.J ;.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.>.1.4.4.*.rX4 , S P x E l c % - - f A P LX2XZ 5 , 9., 8.8.> > 8.> , < 3 ,X0XT &XxXhXbX! N <X,.>.2.2.4.4.4.4.4.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.:.2.1.<.2Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.....@.J._.[.[.|.}.}..X[..X[.[.}.}.[.[.",
+"}.[.[.[.[.[.[.[.].].+X`.`.`./.+XX.X. .i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.,.1...1.1.1.1.1.1.1.1.3.,.J ,.2.1.1.1.1.1.1.1.1.1.1.1.1.1.3.:.2.3.*.rX9.> S Q G ;XJ *.! c A g z o A O P k o H c c H < 8.8.> , , 5 E D *X<XR :XbXnXnX%X>X5.4.4.4.*.&.&.&.&.*.:.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.>.,.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#...o.@.L._.'.}.}.}.}.}.}.}.}.}.}.}.[.[.",
+"}.[.[.[.[.`.[.[.+X].+X+X/.+X`./.X.o. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.,.1.^ 1.1.1.1.1.1.1.1.1.;.J ;.3.1.1.1.1.1.1.1.1.1.1.1.2.4.>.4.4.2X9., , S A =XP A ; ; ; o f f.N f H X d v o z E - g 1 , < < 5 H q *XP O.eX+ :XbXnXnX%XE ,.-.;.tXn 4 < < 8.Q yX<.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.3.;.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.....@.J._.{.[.[..X+X[.}.[.[.[.[.[.[.[.",
+"+X[.[.'.`.}.`.[.[.[.{.`.`.`./.`.X.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.,.4.O.:.4.2.1.1.1.1.1.2.1.G ;.4.1.1.1.1.1.1.1.1.1.1.4.;.&.&.&.>Xh., b U S h -XI o % T F O b k.V B F + v N b a 6.+.+ 1 3 H Z Z j 3X; ; -.! 2 &X$Xv eX$XJ G J G Z Z z Z F F T qXtX6.6.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.,.r.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.....@.J._. X[.[.}.[.}.[.}.[.[.[.[.[.[.",
+"[.[.+X[.[.`.[.`.`.[.`.[.`.`.`.`.X.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.jX&.:XrX&.3.>.4.4.4.2.2.,.J ;.2.1.3.1.1.1.4.2.1.>.3.*.9., , 9.< S A D =XF Y -XD O J bXO.c c V *Xh F g D f c % ~ - 2 U H j %XM g bX! @ - - g ,X$XgX&XE 4.1.4.R eX-XX ! M %X~ - O.; / 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.;.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#...o.@.J._.'.[.[.[.[.[.[.}.[.}.[.}.[.+X",
+"`.`.[.[.[.`.[.`.[.[.`.`.`.`.`.`.X. . .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i., 4 %X< , >X*.&.&.uX5.4.4.J 6.4.4.4.4.4.2.,.;.;.*.rX4 , w S 2 2 H Y N m A X z X o ; ^ ; m h + g Y I 2 O o z g A S w :XQ l 6X>Xz W $Xc c g q ,X=XvXvXO.4.1.3.3XLXLXG bXo g - H jXz / 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.,.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#... .@.J._._.[.[.].[.[.[.[.[.[.[.[.[.[.",
+"}.[.'.[.+X[.`.[.`.`.[.`.`.`.`./.X.X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.K A A A S 4 , < < gX>X&.&.G &.&.&.*.&.&.&.1 8.8., n F A A 3 K 5 o b k.V z b V N Z D k P O + ! 3 O + f B % E l g S s 9.w j eXz R <X<XW @     $X$X%X$XO.4.1.3.z k :Xf o f O O.L ! Z / 3.1.1.1.3.1.3.1.1.1.1.1.1.1.1.:.3.1.1.1.1.1.1.1.1.1.1.1.1.,.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#. . .@.K._.'.`.[.].].].].[.].`.[.[.`.[.",
+"`.`.[.[.{.`.`.`.[.`.`.`.`./././.X. . .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.1XB V h A A H A S < , , < S < , , , , , , , , , , S M N C 3 &.n 2 Y m N A n k.1Xz eXvX4Xj K bXj.O O v N ; <.! z  .jXgX) c 2 2 A A q G @     k &X,X,.:.2.>.tXT G B %XA G F ~ ) x ~ / 3.1.1.:.6.6.6.>.:.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.,.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#...X.@.J._.'.`.'.].].'.].].[.].].].[.`.",
+"`.[.`.[.+X[.[.`.`.`.+X/./.`.`./. .X. .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.1Xf.g.B 2 B %Xj A Z Z Z Z A c F U I F F I A w A A U Y h.B . d X 2 H z D H + B j q eXlXeXh @ 5 6 2 v v f @ - % c O.rXjX~ 6 K 4 X -X; % +   X ! M 2X>.2.2.2.xX;XbXq % -X7X-XH R <XtX>.1.1.3./ - O.% / 2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.;.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#... .@.K._._.`.].`.`.].].`.].[.].[.].`.",
+"[.[.'.`.`.`.[.[.`.`.`.`.`./././.X. .X.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.1Xh k k Z n k.B Z k W D + ! 3 B %XG V 1X&X3 K 4 Z :X$XB B l E - q b f.N c h >XP 3 eXeXeXv .   2 A c O z % z z A # ~ ~ a 5 &.j.c 2X! % ,XzX;XbXO O.4.2.3.4.xX*XO f o F Z c A Y 6XuX4.3.1.4./ A jX2 / 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.,.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#... .@.J.T.^.`.`.`.].`.+X].].`.].].[.[.",
+"{.[.`.`.[.`.`.`.`.`.`.`././././.X... .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.<Xb f.M q f B k q *XW Z K j.j.  , b < gX<X5 &.K Z < 8.8.9.l yX=.O n k.:XO U LX<Xc Q 3 5 B 4 > w h 3X*X; E l g g -XN B U 6 d d + U P o ;X9XI O f a ,.,.6.*.8XW H D c c Q m + Q &XrX6.-.-.<.-.L ! b / 4.1.1.2.3.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.,.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#.o.X.$.K._.)./.`./.].`./.`.`.`.].`.`.`.",
+"].].].].`.].`.`./.`.`././././.(.o... .i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.1Xf.k.:Xz z >XM o g I f 2 n 6 , 8.S 1 8.1 : l f v < , , , d Y G z g N N A h T m q D : , , 1 , 5 R LX2X; <.! o D LX2Xc A o g % g O Z A c A A F H J G J J K S w ,Xm   @ hXW @ A L F + ! % B =.~ x - / 1.1.2.>.>.6.6.6.1.1.1.1.1.1.1.1.1.1.1.1.1.,.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.#. .) @.K.T._./.]./.`.`././.+X`.`.`.`.`.",
+"].].`.`.`.`.`.].+X`./././.(.^.(.X.X. .u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.<XB :Xm % 3XLX=XA F D $X1X=X< > 8.S , < S A q 3 b Z Z Z Z q O 2 A 2 o G A 2 O q G o F U S Z A H h R k @ $ ; g f R k o h 3X; X rX*X2 A I O + rX2.,.:.:.tXn > 5 ,Xm   @ T D + H ! G X hX! + G J G H =.4.1.3./ $ O.- / 3.1.1.1.1.1.1.1.1.1.1.1.2.;.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.....@.K.T.)././.^.^./.`././.`.'.`.`.`.",
+"].+X].`.]././.]././././.^.!.!.!.X.)  .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.<X<X%X1XD h -XM <X7XG h 3XM , 1 , S 1 , w 3 Q 1 z h >Xk . W n 2 z 3XY o 6 K 5 q *Xh I <XM T P Z k k k ; x l % h E R O I >X=.j yXqXg c nXG R <.>.4.2.5.n 8.> 5 H Z q o O v G c A g X U m O -X5X9X1X>X:.6.3./ A jXc ^ 4.3.1.1.1.1.1.1.1.1.3.2.3.,.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#. .X.$.K.T.)././.`././.`./.]./.`./.`.`.",
+"`.`.].`.].].]./.`./././.(.(.Q.!.X... .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.G H A A S q A ,X7X:XZ T LX,Xc S S G S S S 5 &.K o E LX,XS L.j.+ E LX<XO 5 #.j.2 D   + <X=X-XG Z M f.dX@ 3X*Xz z LX8Xc H Q B X T P o O T m ..1.;.;.6.tXn , 9.6 o Y T + U M %Xw o o A o % Z T 6X<X1XU ^ +.7.7.E j.Z 7.4.1.1.1.3.1.3.1.1.1.:.2.2.;.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.o.X.$.K.T.(.^./././././.`././.`.`.`.`.",
+"`.[.`.`.`./././././.^./.!.Q.Q.!.X.X. .i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.gXB V B , , S D z A A h E k A 1 > :X5 8.S : l d w v T m + 5 3 z h T M z 6 l X b T h P 2Xm U j o Y N Y l j + % h T R O Z O A F S D I I A H J J G J J 4 6 jXG A g xXxXH bX2 2 Z W m X G S O Z G A X rX5.,.,./ ~ - - / 3.1.1.6.>.6.6.:.:.2.1.1.1.;.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#...X.' K.T.)././././././.`./.`./.`.`./.",
+"`.`.`.].+X/.]././././.!.Q.!.!.Q.X.)  .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.1Xf.k.:X< , Z b f.M % g o A S , > 8.8.8.w H % z w c % % 2 o o A A o o % z % w b I D A z A O A D G ;XT G z H Z o O q 6 G 5 *XzX5X1X,X<.E +.1.,.6.1.=.< 6 IXU H h >X-Xf H h O A hXW @ &.U g Z hX! d <XzX;XA H U U +.>.1.1.3.-.$ O.- / 2.2.1.1.3.,.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#.o. .$.K.T._./././.`.`.^./.`./.`./././.",
+"]./.`././.`././././.(.!.!.!.!.Q.X...) i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.1XB :Xm <XkXD n k.:Xf f.m A , > 1 > 8.< > S v 3XM 2 h 3Xm X f.N % h 3XP j 3XY Z 1XM 3XR k n N ,XR Z A =X6XY g 3X*Xg 5 &.K %XqXiX>X*.>.O.+.4.4.4.tXW 1 6 $X*Xo -X<X,X<X<X1XN o U A @ A g g o I R f 1XkX;Xw Q B 4XuX4.1.4.:.-.% bXv ^ 5.,.:.>.3.;.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.#.X.X.] K.T.)././.`.^./.^.`./.`././.`./.",
+"].]./.].`././.^./.!.^.!.!.E.!.U.X. . .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.kX6X<X,X<X1XF f N d n k.:Xq > 1 > > > > < 3 E LX,X2 T LX,Xb k.%XO E LX,Xz LX<Xg ,X-XLX2Xf k.sXk M m X f.M % H LXqXc 6 C d W 5.4.+.;.4.J ! <.1.3.W A Z Z z z D Z D F F H H b b c m S o o A o H Z S c D H Z >X! *XyX3.<.,.,.-.E ! H x 9X7XbX<.:.:.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.#.O.o.$.K.T.)././././.`.`./.`./.`././.`.",
+"/.`./.]./././././.~.!.!.!.!.!.!.X. .) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.8X9X<XB V k % b n m f %XB A , < 8.8.> > 8.2 h T m % g 3Xm X Q N c c -Xk f T P q ,XM T Y h B N k f.V b k.V Z g T R o A ;X2X,.2.4.>X=.tXU ,XpX>.iXW q G A O ;X*XG w M *XG O + Z U N N Q M X ;XL A w H o + 2 I G f &X:X:X%X&XJ ~ - - O.wX5XlXzXuXtXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.@.o...$.K.T.).^./.^.]./.`./.`././././.(.",
+"]./.]././././.^.!.!.~.!.E.!.U.!.X. . .i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.gX0X<Xf.k.m z n k.%XO O % A G , 1 1 , , > S F A D H q q q z 2 F D q Z q o O g A Z H 2 o D D H Y m k f V N D H F D F G ;X<.:.>.tXY U g + ,XyX>.yX-XH ! F O :XW ! H M $XbX! + A >X! O hX!   IXW v Z hX! O G D H G J G G E J G J J J E qX8XqX8X9XbXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.L o.) ' K.T.).^.^./.^.^.`.`./.^.'./././.",
+"/./.]././././././.!.~.Q.!.!.U.W.o.X.) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.7X7X<Xj V m A b N v O b f.m q A 2 S Z H S G 2X7X6X3 ! 2 X f.M d N j Z c f.N . + o q h Y I *XT S F W I D U F ,X9X0X7X5XyX>.:.tXzX*XbXU + >X<.*.8X-Xo w v O ;XY A g *XY T M b v W Q @ I F   $X-Xc o Y R + W 8X2X;.,.,.,.,.:.;.,.,.6.,.3.,.,.1.3.,.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.L ..X.$.K.J.)././.{././././././././././.",
+"]./././.~././.~.!.!.!.~.U.E.E.Y.o. .) i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.xX9X6Xb V M H D D H H n k.:XX V m X f.M A <XzXzX6XQ j.K 6 k.:Xb k.N z n k.:XD ! ! + I -XG X N m % ;X%X1X8XU ,XgXa.g.qX,.:.2.qX6Xh I h + A H D G b b A 2 q H F A % A A Z &XhXjXhXW Z o o z z % q q o z G F A Z H -X,X1XuX3.1.:.2.3.:.2.1.1.1.3.@Xi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.w.i.w.L  ...$.K.T.)./.`.'./.`.`./.`./././././.",
+"/.`././.^.!.~./.^.|.|.|.|.|.[.E.X.o.J i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.gX6X<Xn d.m H 8X7X8X<Xm :Xk n k.$Xn k.:XA 8X7X7X7Xb 5 3 d :X$Xj :XM A v :XN @ 3 + 2 v W j 3 k.N Z 6 5 d :XW ,XfXe.q.rX3.1.tX7X$X%XM + V h X Q k + ;XT G w O ;XN %X%Xc ;XlXjXbXnX:XO n %XX V V X *X3Xh %XB dX%Xg g &X&XM 7XyX1.,.,.3.2.3.2.1.2.,.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#. .X.$.J._.'.[.{.^.'./.`./././.@X(././.",
+"]././././.~.!.!.{.mXZXDXDXDX|. X] O.) w.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.9.4 1XN N M R f.g.wX7X8X6X,Xb %Xm b :XB A 2X5X7X9X6X<X8Xf.0.a.d.9X9XU ;X6X<X<X<X<XU ;X6X<XM N M v L UXM ;X-X-Xw.q.r.*.4.,.xX9X*XvXlXf LXF @ LXG @ :XT ! F O ,X=XvXcXc ;XlXbXLXUX:Xg k.fXj d.fXk yXLXd   X vXcXv % vXcX*XzX7XqX8X9X8XtX,.,.,.,.,.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.#.....c._. XMXoX|.'.Q.`././././././././.",
+"/././.!.~.~.Q.Q.|.VXe e 8 e VX X] o. .s.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.9.9.gX<XkXgXU g.g.kXkXkXkXkXgX1X1X<X1X1XK 1XkX7XkXkXxXzXsXs.s.g.7XgXQ 1XkXkXkXkXkXQ ,XkXkXgXkXlXQ < j.5 %XW f.d.a.k.tX1.,.rXlXN aX%XX Q v . V c + gXQ Z c 2 ;X%X%X%X2 -X4X%XV &X&X3 n N X V N X I Y X     %X%X2 3 %X%XB kXkXkXkXkXkXkX2X8XgXkXhXi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.a.#.o.X.L.nX& & e 7 mX X`././.(./././././.",
+"/././.!.!.Q.!.Q.CXFXe r r t GXmX{ X.J l.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.p.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.r.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.s.$.o.X.L. Xt r e 8 DX}./.`./././././././.",
+"/././.~.!.Q.Q.Q.CXGXe & r t GXVXH.....j.0.w.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.i.w.s.l.O.X...L.KXr r r r GX|.^.'./.^./././././.",
+"/./.!.~.Q.Q.E.E.ZXHXr & r e HXZXR.O...$.0.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.w.0.$.) ...._.KXr r * r GX|./././././././././.",
+"/.!.!.!.!.!.E.!.AXHXr r * r HXZXU.] ..X.$.0.w.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.i.i.i.i.i.i.i.i.i.u.u.i.i.i.i.i.i.i.u.i.i.i.i.i.i.i.u.i.i.i.u.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.u.i.p.s.j.o.o.) ) bXKX& # r r HXCX]././././.`./././.",
+"/.!.!.~.!.Q.E.U.AXHXr e 8 & HXZXU.R.X.) X.j.l.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.i.i.u.i.i.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.u.i.i.i.u.i.i.i.i.i.i.u.u.u.i.i.u.u.i.u.i.i.i.u.i.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.i.i.i.i.i.i.i.i.i.u.i.s.L X. . .i ] _.KXe 7 t r GXmX^.^./././././././.",
+"/.!.Q.~.!.Q.U.!.ZXHXe = r e HXZXY.C.H.$.) X.L l.p.i.i.u.u.i.i.i.i.i.i.i.i.u.i.i.u.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.u.i.i.i.u.i.i.i.i.u.i.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.u.i.i.u.i.i.i.u.i.i.u.i.i.i.i.i.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.y.t.l.j.X.)  .p p @.nXKX8 7 8 * GXVX/./././.].^./.^.(.",
+"!.Q.E.!.!.E.!.E.DXHXe & 8 8 HXZXU.I.C.%.O.) J #.j.s.t.p.y.p.t.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.p.p.p.p.p.p.p.p.y.y.y.y.y.y.y.y.p.p.y.y.y.y.y.t.y.y.y.y.y.y.y.y.y.y.y.y.y.y.p.t.t.t.t.t.p.t.t.t.t.p.t.t.t.p.t.t.t.t.t.t.t.t.p.p.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.t.y.t.t.t.t.t.t.t.t.t.t.t.t.t.t.a.t.t.t.t.t.t.t.t.t.t.a.p.t.t.t.p.p.y.y.t.t.a.a.a.l.@...X.X.i p p @.mXKX7 9 # r HX|./././.^./././.^./.",
+"~.Q.Q.Q.E.E.E.E.ZXHX# r r & HXVXI.I.V.P.%. .o.o._ X...)  .o.....o.o...o.....o...o.o... .o.o... . . .o.o.o.o.o. ...o.....o.o.)  .....o.o. .o.o.o.....o...o.o.o.o.o.o......... . ... . ...o.o. .X.X.X...o.X.X.o... .o... . . . .X.o.o. .X... ... .X. . .o. . . .o. . . ... . . . . . ... . . . . ... . ...X. .o.o. .o. .o...o. ...o. ... . ... .o.o.o.o.X.o.o.X.X.o.o.o. .....o...) ) J i p i c.K.mXKXe # r e HXVX/././.]./.^.^.^./.",
+"E.~.E.Q.E.!.E.E.ZXHXr & = r HXJXS.V.R.R.R.] ] ..X...X.O.....O.......X.X.X.) X...X.X.o.........) X. . .o.o. .o.X.X.o.) X...X...o.) ....X.X...X.) ..) o.X...........o.X.X.X.X.) ....X...X.........X.X...) X.X.....X.X.X...X...X.X.) ............o.X...o.......o.......o.......o.................o...o.o.o.X.o.X.) o...o.........o...o...o.o.X.o.o.....X.o.X.o.X.X.................X. .p p i ' K.J.VXHXr 8 e t GXVX]./././.^./././.(.",
+"E.Q.E.Q.E.E.E.W.ZXHXr e t # PXKXZ.C.U.P.Z.P.H.%.@.] ) ) ) ) ) )  .)  . .p ) )  .) ) )  .p ) ) ) ) ) ) ) ) ) ) p  .) ) ) ) i ) ) p ) ) )  .) i ) ) ) ) i  .) )  .)  ...) ) ..)  .)  .) ) ) ) )  .) i ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) J _ ) )  ._ J ) i )  ._ J )  .) )  . .) i  . . . . .) X.)  .) ) ) ) ) J )  .) ) i ) )  . .) ) ) J L ) ) )  .)  .i  . . . .) X. .)  . .) J u y i ' K.c.J.J.KXPX8 r # r HXmX`./././.^.(./.(./.",
+"E.Q.E.E.E.E.U.U.VXHXe 8 r r PXHXKXDXVXZXCXZXmXmX X XL.L.` u 0 u 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 9 0 0 0 9 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 u 0 0 0 0 0 0 0 0 0 0 u 0 u y u u 0 u u u u u u u u u u u 0 u u u u u 0 u u u u u u u u u u u u u u u u u u s u u u u u u u u u s p u s u u p p u u p u u u s u p u p p p p ( p p p p p p s p s p p p p s p p #.&.L.L.L.bXL.nXUX XmXKXPXPX* # r = HXZX/./.`././.`.(././.",
+"E.Q.E.E.E.E.E.U.ZXGXr r 8 r PXPXPXHXPXHXHXIXHXHXKXVXmXL.L.` ` ` ` ` ` | ` ` ` ` ` ` ` ` | ` ` ` ` ` ` ` ` | ` ` ` ` ` | ` ` ` | | ` ` ` ` | ` ` ` ` ` ` ` ` ` ` ` ` ` ` ' ` ` ` ` ` ` ` ` ` ` ' ` ] ` ` ] ` ] ` ` ] ` ` ` ` ` ] ` ` ` ' ` ] ' ` ' ' ] ] ' ' ' ] ' ' ' ' ' ' ' ' ' ] ] ] ' ' ' ' ' ' ' ' ' ] ' ' ' ' ] ' ' c.' ' ' ' ' c.@.c.' @.@.' K.' @.c.' @.@.c.@.L.L.UXmXUXKXKXKXKXKXHXIXPXPXPXe 8 e & HXmX/././././././././.",
+"E.E.E.E.E.E.E.E.CXHXe e r r r a r r # * r r r r r * 8  X_.c.[ [ c.[ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ } } [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ } [ [ [ [ [ [ c.[ c.[ [ c.[ [ [ c.{ c.c.c.c.c.c.{ c.c.c.{ c.{ c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.H.c.K.c.K.c.H.c.H.K.c.c.K.c.K.c.c.c.K.K.c.K.K.c.K.K.K.K.K.K.K.K.K.K.J.K.J.K.J.K.K.K.J.L._. X8 & r r r r y e t e r r r r e # y HXZX/././.`././.(././.",
+"E.U.E.E.E.W.I.E.oXKXt r r e e = t 7 7 8 r # 8 8 r r * DX XN.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.x.z.N.z.z.z.z.z.z.z.z.z.z.x.z.z.z.z.z.x.n.z.z.z.z.z.z.z.x.x.n.z.x.z.x.x.N.N.x.N.x.x.x.Z.x.x.N.N.x.N.x.N.x.x.x.N.x.x.x.P.x.Z.x.P.x.x.x.P.P.x.P.V.P.H.V.H.P.x.P.H.x.P.H.P.H.P.P.H.P.P.H.P.P.x.P.H.P.H.P.H.P.J.P.P.T.J.T.R.T.T.T.T.T.).T.T.T.T.T.T.T.T.T.T. XDX# t & e t # e e 8 8 # e * 7 t r # KXZX@X`././././././.@X",
+"U.U.E.E.E.W.E.I.|.DXt e 8 8 e e 7 & e t t & t e e & r NX|.m.Z.m.n.M.b.n.b.b.b.b.v.n.b.b.n.n.b.b.v.v.M.v.n.N.b.B.N.b.b.N.M.M.n.n.n.M.b.N.b.b.b.n.n.n.N.b.b.b.b.N.n.b.m.b.B.m.B.m.Z.m.B.Z.B.Z.V.V.C.V.C.C.V.V.C.P.C.P.C.Z.C.C.C.G.C.Z.C.P.P.P.C.I.I.I.C.I.P.I.P.P.U.P.I.P.P.P.W.W.W.I.I.U.E.P.E.W.P.E.P.I.E.W.U.R.E.E.E.Q.U.U.).U.E.~.Q.Q.Q.E.(.).Q.).Q.Q.Q.Q.(.(.).).).VXDX# e e r e e e r r # e = t # 7 r # GX|.`././././.^.^././.",
+"U.U.U.E.E.U.E.I.|.AX8 8 8 r r & t r r e * e r 8 * 8 r NXXXV.A.B.m.B.m.m.B.m.m.B.M.m.b.B.b.B.b.b.B.B.m.B.B.B.B.B.B.B.B.B.B.B.F.b.N.m.b.Z.m.m.m.Z.m.F.m.B.m.B.m.Z.B.B.B.V.Z.B.V.V.V.B.A.V.C.C.C.C.S.C.C.C.S.S.C.C.P.I.C.I.I.I.U.I.I.I.C.I.W.I.I.I.I.E.U.E.U.U.W.U.E.E.E.E.E.E.I.E.W.E.I.E.E.E.E.E.E.E.E.E.).Q.Q.Q.E.Q.Q.Q.Q.Q.Q.Q.).~.Q.^.Q.(.^.(.~.^.(.^.^./././././.^.oXSX8 t t * r 8 e e 8 r 8 8 & e * 8 7 SX}.`./.`././././././.",
+"U.E.I.E.U.W.U.U.].mXmXFXGXHXHXHXHXHXHXHXHXHXHXHXKXJXZXMX[.V.B.Z.B.B.B.B.N.B.B.m.M.M.m.b.b.b.b.B.b.m.b.B.B.B.B.B.B.B.B.b.B.B.B.b.m.m.b.b.N.b.m.m.b.Z.m.m.B.b.B.m.B.B.B.V.V.V.B.V.V.V.C.V.C.A.C.C.S.S.C.C.C.S.S.I.S.C.I.C.I.I.I.I.I.I.I.I.I.I.I.U.I.I.U.I.U.W.U.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.W.).Q.E.Q.E.E.E.E.E.Q.Q.E.).Q.Q.Q.Q.Q.Q.~.Q.(.(.(.(.^.(.(.(.^.(.^.(.^.^.'.|.AXDXJXHXHXHXPXHXHXPXHXHXHXHXHXGXGXZX|.]././.`./.`././.`./.",
+"E.U.E.I.U.E.I.I.U.'.oXNXNXZXmXDXVXZXZXDXZXZXZXVXCX|.CX'.Z.B.Z.F.A.B.B.B.F.B.B.m.m.m.m.m.m.b.b.B.B.B.m.B.B.V.B.A.A.B.B.B.B.B.B.m.m.m.m.m.B.b.m.m.B.m.B.m.F.m.B.B.B.A.B.B.A.A.A.A.C.A.C.C.V.V.S.V.S.S.V.S.S.S.S.S.Y.S.S.I.U.I.I.I.I.I.G.I.I.W.C.U.U.U.I.E.U.E.E.E.E.E.U.E.E.E.E.E.E.E.!.E.E.!.!.U.!.U.Q.E.Q.Q.E.!.!.!.E.Q.Q.Q.Q.Q.~.!.~.!.!.~.~.!.!.~.~././.!.!.^.^./.(./.}.mXVXDXVXDXDXDXVXVXDXDXDXVXVXVX|.|.].`./.`./././.`./././.",
+"U.U.U.U.I.U.I.U.I.I.S.S.C.I.S.C.I.I.S.S.P.S.S.S.S.D.D.A.A.V.A.F.m.F.A.B.m.m.m.F.m.m.m.m.m.m.B.b.b.m.m.B.B.B.B.B.V.m.m.F.B.F.B.F.A.b.b.b.b.b.m.M.b.m.m.m.m.m.m.F.F.F.A.B.A.D.A.A.A.A.D.A.S.S.S.D.S.C.D.B.S.S.S.S.D.D.W.S.S.Y.U.I.U.I.Y.W.U.I.I.W.I.E.E.E.W.E.E.E.E.E.!.!.W.E.Y.!.U.E.U.E.W.U.W.!.!.!.E.Q.!.E.!.!.E.!.!.!.!.E.!.!.!.!.!.!.!.~.!.~.!.!.!.!.~./.!./.~././.!././././.~.'./.(.'.(.(._.!./././.^.{./.`.`./.^.`././.]./.`.",
+"W.W.I.I.I.I.I.I.I.S.I.I.S.I.I.I.C.P.S.P.V.Y.S.C.D.C.Z.M.V.D.F.A.B.N.V.b.F.B.b.B.F.b.B.F.F.m.b.m.b.B.B.B.m.A.D.B.Z.V.B.M.D.b.m.B.B.B.n.b.F.m.F.m.M.M.F.F.v.A.F.m.Z.D.F.D.A.S.Z.A.A.C.C.C.A.Y.S.Y.D.V.D.Y.C.C.C.G.S.Y.S.G.I.I.Y.E.I.W.S.Y.W.G.I.I.I.U.U.W.I.!.U.!._.U.E.R.!.U.!.!.I.Q.!.W.W.E.E.!.!.E.E.~.Q.E.W.Q.W.!.Q.E.W.~.!.E.!.!.!.!.!.!.~.!.~.~.!.W.!./.(.!.!./.(./.(./.`./.`.(.(././.Q././.Q.^.`.!.^./.]././.`.`.`./.]./.`.].",
+"U.U.I.I.I.I.W.I.I.P.C.C.S.Y.C.R.z.t e e _ R.S.C.Y.' = 9 = } A.F.M.M.M.F.M.F.m.M.B.B.b.b.b.b.b.b.m.B.b.A.V.B.F.( 9 9 _ B.B.B.B.Z.b.B.F.b.m.m.v.n.b.B.b.b.V.m.Z.D.A.V.V.Z.Z.B.S.G.V.V.C.A.C.V.V.D.Z.C.Z._ # & = 7 ] Y.S.Y.] 9 & $ t ( !.S.Z.I.W.E.U.Y.Q.P.E.E.!.U.] 9 7 ` E.E.W.!.(.] x.~.U.!.E.E.E.E.W.~.{ = = 9 E.Q.Q.!./.E.(.!.!.!.Q.).Q./.!.!.(.(.!././.Q.!.^.(./.(././.(.(./.).`.(.^.(./.(././.~././.^.]././././.`./.]./.].`./.",
+"U.I.U.I.U.I.I.I.I.I.C.I.S.S.S.Y.z.* 8 r 8 [ V.M.D.' = r & N.N.A.B.F.B.B.b.v.A.m.M.n.b.b.F.m.m.F.m.m.B.F.D.A.V.u 8 r ( x.b.A.F.m.b.A.F.F.F.b.Z.B.B.A.F.m.M.M.Z.F.A.D.Z.Z.D.S.A.A.V.I.D.D.A.V.G.S.Z.G.S.( 8 r r r u C.C.S.u 8 r r r ( U.W.).E.U.U.E.U.U.E.Q.U.~.Q._ r r ( ).U.R.{ 9 9 H.Q.Q.!.E.~.U.!.!.Q.@.7 8 * Q.E.Q.(.!.!.!.Q.!.~.~.~./.(.!.!.Q./.!.(.~.!./././././.~././.`.`./././.(./.(.(.(./.@X/.`.~.].]./.`.`.`./.].`.`.].+X",
+"E.E.I.I.I.I.I.I.I.C.I.C.Y.S.S.S.c.r 8 e # 9 x.S.D.` # # & } B.B.b.M.b.F.m.m.v.v.b.m.m.b.M.m.F.F.F.m.F.F.A.B.N.( 8 y ( M.D.F.A.F.F.A.b.F.B.B.b.m.m.m.F.A.m.A.Z.C.b.D.D.D.A.S.D.D.S.C.B.S.S.C.S.D.A.D.Z.( 8 r e r 9 x.S.H.e 8 8 8 r _ P.Y.U.I.W.C.I.U.P.E.E.E.W.E._ e e ( Q.Q.R.t # & H.E.!.Q.~.W./.!.!.!.{ 7 r r !.!.Q.Q.!.Q.E.(.!.!.!.!./.!.E./.Q.!.!././.!.~.!.~.!././.].].(.(.+X!.`.'.`.`.`.`.(./././.`./.^./.`././.`.`.`.`.].].",
+"I.U.I.I.I.I.I.I.I.I.I.Y.S.S.S.C.{ = r = = = u Y.S.[ t r = } D.N.x.} } F.b.b.} } } z.b.F.m.M.} ` ` ` } N.B.m.A.( e e ( Z.D.A.Z.z.[ ` { ` z.N.F.m.v.M.Z.} [ ` } ` } R.Y.b.V.{ x.} P.c.{ [ A.G.D.C.D.S.C.( e & y & = } S.} & r y t & _ U.G.W.Q.S.{ { ' { P.U.!.E.W.] * * ( ).P.' * * e @.R.U.Q.E.Q.%.} { J.{ t & 8 ~.!.Q.^.R.c.{ { %.R././.Q.H.K.H.T.(.Q.Q.J.H.J.^././.R.K.K.J.(.J.J.R.'.T.%.{ %._.+X`././.`././.]././.+X`.`.].].].].",
+"U.E.I.W.I.W.I.I.I.I.I.S.P.S.V.V.x.= r # & t e ` C.` e 8 9 [ F.` 9 # t b.b.z.( = 9 ` F.F.[ ( 9 # y r 7 0 ` D.F.( 8 r ` M.M.Z.` t 9 7 & * 8 | v.F.A.x.( 9 r * & # 9 | { C.Z.9 e 9 ] 9 # y x.G.D.C.C.A.C.( 8 7 ( r # ` S.] e 8 ( 8 e ( I.W.R.' y r & e # 8 ] R.Q.!.) * # ] ).' # & * $ & y H.Q.Q.) = y 8 7 p y # e E.!.).c.y r & & t u { /.Q.] r = ] (.(.{ 9 $ = H.Q./.] t 9 ' R.# 8 7 K.0 9 # = ( T.`.`.`.`./././.`.]./.`.`.'.`.].].",
+"W.U.I.W.I.W.I.I.I.I.I.G.S.S.I.I.c.r r 8 y # * & { { & # 7 x.m.` 8 e r m.M.N.e & # ` A.v.| * # 8 # t * * 9 } A.( & r ( m.V.` # * e = # t # 7 ] F.N.` 7 * * e 9 e # 7 ] V.C.= * * t 7 t | C.A.B.A.C.V.C.( * r ' y e u P.( * r ' 8 r ( C.E.%.7 & * # 9 t r e ] T.E.( r r ( Q.%.e & t r 8 # H.(.] e & t e e & & 8 e Q.!.H.# & & t t 8 r 7 { ].%.e e ( T.(.y & e = ] ^.^.y * 8 K.T.r # * # # # r r 7 @.^.^.`./.+X/.].`.`.`.`.`.`.`.[.[.",
+"U.U.U.I.I.W.I.I.I.I.I.I.I.S.V.D.z.# e 9 ] y & * | ` = r 9 } m.} # r # F.v.F.# t 9 ` n.` & * # [ B.} 9 r 8 [ M.u e & ( A.R.| & & | N.C.` 9 r $ } P.` y = 0 P.V._ e e $ R.V.y # r 7 ' } R.C.C.Y.D.V.Y.V.( & 8 ] _ t 7 c.$ e _ } 9 = ) E.I.0 & 8 ] T.U.{ & * 7 P.U._ r r ( (.U.{ e # 7 %.H.).).= 7 e ( (.J.y e r e Q.(.0 & * 0 T.Q.( e & 0 ~._.y 8 # T.P.& r 8 e y ^.T.= = 8 '.H.e e 9 ( J.%.t e e ( {./.{./.`././.`.`.`.`.`.].`.`.[.",
+"U.W.U.W.P.I.I.I.I.I.C.I.S.S.S.S.[ r # 9 ` c.$ & 8 y t 8 7 } F.[ r e 8 F.M.n.t 7 r ` b.| * 8 9 b.B.n.z.n.B.m.M.( r e ( Z.z.t 8 = ] ` [ ] y r 7 [ b.b.B.V.[ ` ] t 9 & 8 C.A.r & & | V.S.C.C.C.D.C.D.V.C.( * 8 ` ` * = ( 8 # } ' = # ) P.N.e 8 * ] ' { ' = & 9 { Q._ 8 r _ !./.H.# r r K.~.(.H.8 & = H.(./.' e r r ~.R.# e 7 H.!.@XH.7 * t J.(.{ & = @.' r e u 8 9 K.@.& & ' '.J.9 e 7 K.'.{.) t e ] ]././.+X`.`.`.`.[.`.`.[.[.`.}.[.",
+"U.U.U.I.E.W.I.E.I.I.I.C.S.S.S.D.c.& r t } Z.] & r & = t = } F.[ r # 9 F.v.N.t t t ` b.| * 8 ( F.b.B.B.B.m.Z.F.0 t e ( Z.} = r r r 7 8 y # r r } D.{ ` t t 9 = a 7 t t I.I.e e r ' I.G.S.I.G.S.I.V.Y.I.( r 9 } z.e * # 8 t x.{ = e ( E.x.& r e * t # e & r 8 @.W.] 8 y ( ~.~.H.& r y H.~.`.K.& 8 7 H.Q.~.%.e # t E.H.e e # P.!.!.H.8 = & P.^.H.& r p ( & t %.8 9 ] ( # 7 T.`.H.# 7 & K.].]._ 8 e ( ].+X].`.`./.].'.`.`.`.`.[.[.[.[.",
+"U.I.I.E.I.I.I.I.C.I.I.C.C.C.C.A.z.* r & [ Z.N.( 8 e t e = [ F.` e e 7 n.B.[ $ = # ` v.| * r y M.m.A.[ [ [ } m.| e * ( B.N.$ * t ` x.} } x.} z.N.N.0 t = ( x.I.] 7 & e S.G.8 r # ' C.S.S.P.V.I.S.C.D.C._ = & ] Y.y # & r t R.{ = 8 ( P.P.& * # { R.H.H.K.K.c.R.Q.) 8 r ( ^.'.R.* 8 8 H.@X/.P.= * t K.^.^.] r 8 t Q.T.7 * * %.(._.%.8 * = T.Q.^.y r r 8 r ] ^.u & y & * u `.@XT.& & & J./.[.) r r ] {.].].'.+X`.`.`.`.[.`.].[.[.[.[.",
+"I.U.E.I.W.I.I.I.I.I.C.I.S.S.D.A.c.e r t ` m.A.c.9 # & 8 r [ F.` * * r | ] ( 8 8 = ` v.[ t 8 9 | } ` 9 = = | A.( # & ( B.C.( 8 & ( { [ ( 9 9 ( V.{ 7 * t ' c.} = 8 r 8 Y.U.# r r ' Z.D.Y.V.C.V.V.C.A.C.( & e } F.| 8 # r ( G.] * 0 u I.I.0 e # ( %.{ ( t 7 ' T.Q.( r r ( ~.Q.H.e 8 9 %.H./.^.u r # 9 c.%.# & e e /.Q.0 & & 0 K.K.0 & * ] ).Q.!.%.# r r & %./.' r * r e @.`.@XJ.7 & 9 T././.] e r ) '.'.].'.}.`.[.`.[.[.[.[.[.[.[.[.",
+"U.I.I.I.I.I.I.I.C.C.I.C.C.C.D.S.c.e 8 = } m.F.B.[ # r 8 e c.v.z.# t * # 7 # 8 r # } F.n.( t r 8 e e = # u [ m.u r * ( D.A.{ 9 e # 9 7 a * # ' A.x.7 r r * 8 = 9 e & # Y.I.e * # { C.S.D.Y.I.G.Y.G.Z.C.( e e ] D.' & r = } S.} * r ( Y.I.H.9 e & # t & & 9 { (.~.) e r _ ).^.Q.& & e & t ).^.%.r * y = # p # & 8 ^./.T.9 & # r t # 7 9 H.`././.(.8 8 & 7 (./.T.r e r t _./.`.T.r & & J.`.^.) r * _ }.[.[.`.`.+X`.`.[.[.[.[.[.[.[.[.",
+"W.I.I.I.I.I.I.I.I.I.C.I.C.C.D.P.} 9 9 = } N.A.A.x.( & # = } A.m.} t 8 = y { ( 7 9 ` F.F.} ] y 7 t = 9 | } D.F.( 7 e ( V.B.C.[ y t # e e y ` V.P.I.{ y & t 7 ] H.# t = x.I.9 t 9 ' Y.Y.I.Y.C.Y.D.G.C.P._ 9 9 ' D.x.9 9 9 c.P.} & 9 _ E.P.R.%.( 8 8 e * y ' ^.^.^._ 9 7 ] ).(.!.%.9 7 & 8 K.^./.' # t & ) @.= $ 8 ^.~.^.T._ t e e $ ] J.`.Q.(.(.(.| 9 # ] /.@X/.y 9 t ( '.+X[.H.9 # t J.[.'.] 7 9 ] '.`.`.`.`.`.`.[.`.[.[.[.[.[.}.}.",
+"W.I.I.I.I.I.I.I.I.Y.S.C.C.D.A.C.G.Z.Z.N.M.B.m.F.Z.Z.M.M.Z.M.F.F.n.z.[ } v.F.v.z.M.b.v.v.m.m.z.z.} } x.m.M.A.D.Z.M.P.B.B.B.B.C.Z.N.{ { N.C.C.Y.S.S.S.W.N.x.C.I.I.P.I.P.G.G.P.P.R.I.I.I.P.S.C.I.D.A.B.D.I.Z.C.C.B.C.N.C.V.Z.G.U.P.U.U.C.G.W.U.E.R.H.H.R.Q.!.!.!.~.~.^.^.(././.~.~.).H.J.T.~.`././.).H.T.~.~.^.Q.'./.!.).`.(.).J.J.T.^.`.!./././.`.^.'.'.'.Q./.`.'.'.`.'././.+X/./.{.{.{././.].[.].`.}.`.`.[.[.`.[.[.[.[.[.+X[..X.X[.",
+"I.I.I.I.I.C.I.I.I.I.S.I.D.S.C.A.C.S.M.I.V.B.B.B.B.b.A.F.B.m.M.b.B.v.v.F.F.v.F.v.v.v.F.M.F.F.F.F.m.m.M.F.m.b.m.F.F.B.D.N.D.m.B.Z.F.A.Y.S.A.G.S.I.D.Y.C.I.P.I.Y.W.C.G.U.I.I.Q.S.G.G.G.I.I.Y.S.P.I.C.I.S.D.A.D.D.V.C.Y.A.Y.C.C.S.C.I.U.E.E.E.W.U.Q.E.E.E.!.!.Q.~.Q.`.W.~./././.`.~./.`.!.`././.@X/.`.(.~./.^.(.`./.!./.~.~.@X!.@X~./.^.!././././././.(.(.^.^./.`./.(./.{.^.`././.+X`.{./.`.].+X].{.+X`.+X}.[.[.+X[.[.}.[.}.}.+X[..X.X",
+"I.I.I.I.I.I.I.I.I.C.S.Y.S.C.C.D.A.V.A.A.V.B.B.B.A.m.m.m.B.b.m.m.m.m.M.v.v.v.v.v.b.v.v.m.b.b.F.m.m.m.m.Z.B.B.B.B.B.B.B.B.B.B.B.Z.D.V.S.A.C.I.S.Y.C.U.S.Y.W.C.E.S.G.I.W.G.I.I.U.I.C.U.U.S.G.C.W.S.I.C.C.S.D.S.P.Y.S.A.Y.C.S.S.G.U.I.E.C.~.P.!.U.!.!.~.~.!.(.(.(./.Q.^././././.~.'.`././.]./.`./.^.(.`.(.`./.^.!./././././.^././././.^././././././.^.^.^.`./././.`.`././.`./.].].].`.`.].'.{.].].].[.[.`.}.[.}.[.[.}.[.[.}.}..XXX}.}.",
+"I.I.I.I.I.I.I.C.C.I.S.S.S.A.A.C.A.V.A.Z.A.B.B.B.B.B.A.m.m.B.m.m.m.v.b.v.v.v.v.v.b.v.b.b.b.b.b.m.m.m.m.F.B.B.B.B.B.B.B.B.B.B.B.D.B.D.S.S.C.S.Y.G.I.C.W.Y.Y.U.G.Y.E.P.I.W.E.P.I.U.Y.I.Y.U.G.C.I.U.I.C.C.S.I.C.I.C.C.C.S.S.Y.U.C.U.U.I.W.W.!.E.Q.E.!.Q.!./.E.!.Q.(.^./.!./.`.~.].^./.`.!.`.`.!.^.(./.Q.`.(./././././././././.~.!./././././././././.'.(./.(.^././././.`./.`./.]././.`.`.`.].].].{.].`.[.[.}.[.[.[.[.[.[.}.+X}..X}.}.}.",
+"I.I.I.I.I.P.I.I.I.C.I.C.S.D.A.A.V.Z.D.B.B.B.m.B.b.m.m.m.m.b.m.b.m.b.M.v.v.F.v.v.v.v.v.v.v.v.v.v.m.m.m.B.F.B.B.B.B.B.B.B.B.B.B.D.m.C.C.Y.P.C.C.G.C.W.Z.U.R.U.I.I.C.W.E.I.I.W.U.U.I.I.C.P.I.S.U.A.S.Y.I.I.C.C.G.C.G.I.C.I.C.I.I.G.P.W.U.Y.!.!.E.^.E.~.Q.Q./.Q.)._./.`.`.@X'.'.'.{.+X/.`.~.].^.^.^.].~./.~././././././././././.!./.!././././././.(./.^././././././././.]./.]./.].].]./.].].].{.].].[.[.[.`.[.}.[.[.[.}.+X.X}..X}.}..X",
+"I.I.I.I.I.I.I.I.I.I.C.I.C.S.A.C.V.A.A.B.V.m.m.m.B.m.B.m.m.m.m.F.m.b.b.v.v.v.v.v.F.v.v.v.v.v.v.v.m.m.m.m.B.B.B.B.B.B.B.B.D.B.B.m.Z.[ ' ` ` { ' P.E.C.U.E.I.S.P.E.W.I.Y.E.P.W.W.G.Y.I.W.P.x.G.W.S.I.Y.Y.C.C.I.I.W.I.Y.C.W.C.S.E.Y.W.G.E.R.{ ( ( ] H.Q./.T.%._ ] c.T././.+X~.T.( ( /./.!.'.%._ ) K.T.]././.`.@X@X/./././.!.!././.!.!././.(././././.^././.^./.^.^././././././.]./.`.].].].].].].].].`.[.[.[.[.[.[.[.}.+X}.}.}..X}.}.}.",
+"I.I.I.I.I.I.I.I.I.I.I.C.S.S.C.V.A.A.A.B.B.B.B.m.m.m.b.m.m.m.m.b.b.b.m.v.v.v.v.v.v.v.v.v.v.v.v.v.m.m.m.m.m.m.B.B.B.B.B.B.D.B.B.V.Z.= t = 9 e & 9 P.W.I.N.W.I.I.C.I.I.U.I.P.I.G.W.G.P.` 9 [ C.I.I.S.C.Z.C.C.G.I.C.U.I.I.C.G.W.I.Y.W.U.T._ e y u & 7 T.^.( 8 u y 8 _ `.~.`.T.( e t /.`.'.( # ( ( 9 ] {.{././././././././././.!./.!./.!.^././.(././.^././.^././.]./././.`.].`.`.`.`.].`.].{.].].].].[.{.[.[.[.}.[..X}.}.}.}..X}.}..XXX",
+"I.I.I.I.I.I.I.I.I.Y.S.S.C.C.A.A.V.A.B.B.F.B.m.m.B.m.b.m.b.m.b.b.b.b.v.v.v.v.v.F.v.v.v.v.v.v.v.v.m.v.m.m.m.B.B.B.N.B.B.B.B.B.B.B.C.- & u ] u e e c.S.U.R.} } %.I.W.W.P.{ ' { c.I.P.H.= r ] H.I.I.H.{ { x.I.W.C.c.c.R.[ { H.W.Y.W.I.E.H.9 9 H.Q.p t { H.= e T.'.r 8 T.`.] t # r t /.`.J.7 = _.).t 9 J.`././././././././.!.~./.!.!.!./.(./.(.(.`.^./.^./.`.^./././.]./.`./.`.`.`.].`.].].[.[.].].[.[.[.[.[.[.[.[..X}.}.}..X+X.X.X.XXX",
+"I.I.I.I.I.I.I.I.I.S.Y.C.C.C.A.A.A.Z.V.F.B.Z.F.m.m.m.m.m.m.b.F.b.b.b.b.v.v.v.v.v.v.v.v.v.v.v.v.v.v.b.b.m.B.b.B.B.b.B.B.B.B.B.B.D.Z.y 8 0 ' ( 8 ( V.S.{ e 9 9 & ( R.R.( & y 9 t } U.9 t # e _ I.] = $ r y ] P.H.& = ( $ = y T.U.E.I.W.W.P.H.Q.T.y $ { { y p ^./.] 7 %.'.= y ] 8 8 ]./.K.8 ) ^.`.) 7 %.{././.+X/.~./.!././.!.!.!./.!.!./.~.~./.`././././././././././.`./.`.`.`.`.].].].].{.`.[.[.[.`.}.[.[.[.}.}.}.}.}..X}..X.X.X.X}.",
+"I.I.I.I.I.I.I.I.I.S.I.I.C.C.C.A.A.B.B.B.F.m.m.B.m.m.b.b.b.m.b.b.v.b.b.v.v.v.v.v.v.v.v.v.v.v.v.v.v.b.b.F.b.B.b.B.B.B.N.B.B.B.B.D.Z.r r 7 # = & ' G.I.t 8 [ H.y # [ { = # ' c.%.P.I.' e r ( { N.r r c.c.# t x.x.r # ] { e 9 x.W.U.E.Q.!.!.!.H.9 # _ _.{ t _ './.( y { `.x.{.%.= e /.+X@.8 ) ].@Xp 8 { /././././././.!.!.!.!.^.!.!.^.!.!.(./.~.~.`././././././././././.`.`.`.`.].].].].].].[.[.[.`.[.[.[.[.}.[.}.[.}.}.}.}.}..X.XXXXX",
+"I.I.E.I.I.G.I.I.Y.V.Y.I.C.D.V.V.A.V.B.m.F.m.F.m.m.F.b.m.b.v.v.b.b.b.v.b.v.v.v.v.v.v.v.v.v.v.v.v.v.b.b.b.b.A.B.F.B.B.B.B.B.A.B.F.x.y y y [ ` y r ] H.9 e c.C.( * ( P.9 7 t e y H.Y.U.# e ' S.{ t 8 W.I.8 & { H.# 8 H.H.e e R.U.R.~.W.W.(.%.8 e ` (.Q.{ & ( ^.`.) 9 %.`.`.^.K.e = {.].%.t _ {.!.) 0 { ~././.`./././././.(.~.!.!.^.!././.!./././././././././././.`./.`.`./.`.`.`.].].].].].`.].[.}.[.[.`.}.[.[..X.X}..X.X.X.X.X.XXX|.",
+"I.I.I.I.I.I.P.G.S.I.S.S.D.D.D.A.A.A.B.B.Z.B.F.Z.m.m.m.m.m.v.M.b.b.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.b.b.b.b.b.B.F.B.B.B.B.B.A.D.C.& 8 ( Z.H.t & ` { 7 8 c.P.( 7 ( R.P.{ _ y y 9 !.Q.= r ' U.} = 8 U.U.r * { c.* # x.H.r & x.E.(.E.Q.!.{ 9 8 @.^.'./.J.& p './.p 8 J.`./.'.%.e 7 {.^.K.r p {.].p # H.].].!.^.^./.!./.!.!./.!.!.^./.~.~./././.~././.`./././././.@X/./.`./.`.`.`.].+X`.+X`.[.[.].[.[.}.}.}.}..X.X[.[..X.X.X.X.X.XXXXX",
+"E.I.I.I.I.I.I.C.S.Y.S.I.C.S.C.A.A.B.B.B.F.F.B.m.m.m.m.b.m.M.m.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.b.b.b.b.F.B.B.b.B.B.B.B.A.D.Z.& r - 7 7 * = } V.( & ] { # * } x.' _ H.` 8 y I.P.t r ] H.H.9 & ' { * 9 P.H.& 7 c.x.e # H.W.!.W.!.R.u * r 7 7 = %.T.u r %.%.8 y T.`./.{.@.& e {.{.).y & ' %.& 0 ^./././././././.!.!.!./.~.!.!.~.!.^.!././.!./././.^././././././././.`.].+X/.].].`.'.].`.].[.[.[.}.[.'.[.}.[.}..X.X.X.XXX.XXXXXXX",
+"I.I.I.I.I.I.I.I.I.I.I.V.S.S.C.C.A.V.A.B.m.B.F.Z.F.b.b.b.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.b.v.b.b.F.m.b.b.F.m.B.B.B.B.B.Z.y 7 = # 8 t ] R.D.{ y = = y [ P.V.( r t y t { I.W.` 9 $ | U.{ t = = y %.U.H.= 9 H.H.= = R.~.!./._.{ 7 e e = 8 t { `.c.t 7 7 0 K.].`./.^.K.9 e {./.[.K.y 9 9 u %.{./././.`.!.!./.!.!.^.!.!././.!.^.!.~.!.!./././././././././././.`./.`./.`.`.].`.].].].[.[.].[.[.[.[.[.[.`.}.}.[..X.X.XXXXXXXXXXX",
+"I.I.E.I.I.I.I.C.I.S.S.S.A.C.A.A.A.V.B.B.m.F.m.B.m.m.v.m.v.m.m.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.b.v.v.M.n.b.b.b.B.b.B.B.F.N.B.F.A.M.Z.B.S.S.D.Z.S.D.G.I.x.x.P.S.W.Y.G.x.H.{ E.U.E.E.P.K.%.x.W.W.).c.x.).W.W.E.).E.E.W.T.E.W.!.W.!.~.~.).^.~./.^.`./.`./._.T.H.^.'.'./.+X`.[.{.'.+X/.`.`.'.J.J.T.].{././.!.`.`.!./.!.!.~.!././.!./.~./.~././.~././.~./././././.(././.`./.`.`.`.`.`.].].].].].[.[.[.[.[.[.[.[.}.}.}..X.X.X.X.X.X.XXX",
+"W.I.I.I.I.I.I.I.S.I.S.C.C.D.C.A.A.B.B.B.B.Z.F.m.m.m.m.m.M.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.b.b.b.B.F.b.B.b.F.B.B.A.D.Z.S.A.D.Y.D.D.Y.S.Y.I.C.G.P.I.E.S.!.I.U.E.W.E.E.E.I.~.U.W.W.W.W.P.Q.E.W.W.U.Q.U.E.!.!.).Q.~./.~.!.!.~.~.~.@X(.^././././.`.~././././.`.`.`.].`.`.[.[./.[./.].[.[.^.~././.`.!./.~.(.!./.!./.!.!./.!./.!./././.!././././.^./././././././.`./.].`.`.`.`.].'.].[.].].[.[.[.[.[.[.}.}.}..X.X.X.XXX.XXX.X",
+"P.I.I.I.I.I.G.I.C.C.S.I.V.V.V.A.V.B.B.B.m.m.F.m.m.m.b.b.m.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.n.b.b.b.b.m.m.m.m.B.A.F.A.Z.A.Z.C.V.M.C.I.M.W.D.U.C.I.W.C.U.P.E.C.!.G.I.W.W.W.U.Y.!.E.U.U.W.E.Q.Q.Q.!.U.Q.Q.E.W.!.!.!.~.!.!.!.!./.!.(././././.^.^./.].'.`.^.`.+X+X'.`.].[./.[.'.`.[.`.+X`./.]././.`./.!./.!./.!.!.!./.!.!./.!./.!.!.!./././.~.~././././././././.].`./.+X].`.`.`.`.[.[.`.[.[.[.[.[.[.}.[..X.X.X.X.X.X.X.XOXXX",
+"G.E.I.I.U.I.I.I.I.I.S.S.Z.D.V.A.A.B.B.B.m.B.B.m.m.m.m.b.v.v.v.m.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.b.b.b.F.b.A.b.m.m.A.m.B.V.A.D.D.V.S.S.A.A.C.U.Y.V.I.P.D.U.G.U.I.U.Y.W.W.U.W.E.U.W.U.Q.W.Q.E.!.!.E.E.Q.Q.E.!.Q.~.!.~.~.~.^././././.^.^.!.@X/./.`./././.+X/.].+X^./.{.'.].].[.{.[.`.`.[.+X@X`.`./.`.(.`.!././.!./.!.!.!././././././.`./.!.!.~.!./.!.!.!./././././././.`./.].`.].`.`.{.`.`.{.[.[.[.[.}.[..X[..X.X[..XXX[.}..X.X",
+"P.W.W.I.U.I.I.I.C.S.S.C.A.C.A.V.B.B.B.B.F.B.m.m.m.m.m.b.b.b.m.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.b.F.b.m.m.A.B.B.B.V.A.Z.A.Z.S.C.C.C.S.S.C.C.C.I.I.U.W.I.I.U.U.U.U.W.W.U.E.!.E.!.E.!.E.!.!.!.E.!.!.!.Q.!.!.~.!.~.!./.!././.!.^././././././.`./.]./.`.].`.].{.].].].].`.[.`.[.[.`.`.`.].`.`././././.(.^.!.!.!.(././.(./.!././.!././.!./././././.!././././.]././.+X].].].`.[.+X[.`.[.`.].[.[.[.[.[.[.XX.X.XXX.XXX.X[..X.X",
+"I.I.I.I.I.I.C.I.C.S.S.C.V.A.A.B.A.B.B.B.B.m.m.B.m.m.m.b.b.F.b.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.F.v.v.b.b.F.B.m.B.F.A.Z.Z.V.A.S.D.C.D.C.C.S.C.S.I.G.I.I.I.I.U.U.U.W.W.U.W.E.E.U.!.U.!.!.!.!.!.!.!.!.!.!.Q.!.~.!.~./.!.!./.!.!./.(././././././.`.]./.`.`./.].].].].].].[.[.[.[.`.`.`.[.`.`./.`./.`./.(.(.(.!.!./.!.!./././././.!./././././.~././.!./.^./.`././.].`.`.`./.`.].[.].[.{.[.[.[.'.[.[.[.}.[.|.[.|.[..X.XXX}..X.X",
+"W.I.I.I.I.G.C.I.I.S.C.C.A.A.A.A.A.B.F.B.A.m.F.B.B.m.b.b.b.m.b.v.v.v.v.v.v.v.v.v.v.v.v.v.v.b.v.m.b.v.v.v.v.b.v.b.m.b.B.F.B.B.A.B.A.A.V.A.V.D.V.S.S.C.C.P.I.I.I.I.W.I.W.I.W.U.W.U.E.E.E.E.E.!.!.!.!.!.!.!.!.!.!.~.!././.!././.~.!.!.!./././././././.`././.].].].`.].].].].].].[.].[.[.+X`.[.[.`.`.`.`././././././.!.(.!.!.!.^./.(.!./././././././././././././.^./././.]./.].].].].`.[.}.`.[.[.`.[.[.[.[.}.[.[.}.}..X}..X.X.X.X.XOX.X",
+"G.P.I.I.G.P.I.I.C.C.C.C.V.V.S.V.B.Z.Z.B.m.F.Z.m.B.b.m.b.m.b.m.b.v.v.v.v.v.v.v.M.v.v.v.v.v.b.m.v.b.v.v.v.v.v.v.b.b.m.m.m.A.B.B.B.Z.V.S.S.S.C.C.S.S.S.C.I.I.I.I.I.I.I.I.U.U.U.U.W.U.E.E.!.!.Q.!.E.Q.E.Q.~.~.Q.!.(.!.!.!././.!./././.(././././.`././././.]././.`.`.`.].].].].[.].].`.`.[.[.`.`.[.`.`.`.`./././.(.!./.!.^.!.!.(.!./././.^.~.!./././././././././.^././././././.].`.[.[.[.`.}.`.[.[.[.[.}.[.}.|..X}..X.X.X.X.X.X.X.X.X.X",
+"I.I.I.I.I.I.C.I.I.S.C.A.A.V.A.Z.V.A.B.B.A.m.B.m.m.m.m.B.b.m.b.m.v.v.v.v.v.v.v.b.m.m.F.v.b.b.b.b.b.b.b.v.b.n.b.b.b.m.m.B.B.B.B.Z.V.A.D.C.D.S.C.S.S.Y.I.I.I.I.I.W.W.I.U.U.W.E.Y.E.E.E.!.E.E.!.!.Q.Q.Q.Q.!.!.!.~.(.~././.!./././.~./.(./././././.`./.`././.].`.`.].].].+X[.[.].].'.[.[.[.`.[.`.`.`.`./.`././././.!.!./.!.!.!.(.!./.(.(.~././././././././././././.^.]././.].].`.].].`.[.}.`.[.[.[.[.}.}.}.[..X.X[..X.X.X.XOX.X.X.X.X.X",
+"I.I.I.I.I.C.I.C.I.S.C.C.A.A.A.A.A.A.A.B.Z.F.F.Z.B.m.m.m.m.m.m.m.M.n.v.v.b.b.m.m.v.v.m.M.m.b.m.m.b.b.b.b.b.b.b.b.b.F.m.m.B.B.B.B.B.V.V.D.S.S.S.S.S.S.C.I.I.I.U.I.I.U.I.E.Y.E.E.E.E.E.E.!.Q.Q.Q.!.Q.Q.!.~.!.~.~.(.!./.!././././././././././.`./.`.`.`.`.`.`.`.`.`.`.].].].].[.[.[.[.`.[.`.[.[.`.`.`.`.`././././././.!.!././.!.(.^././.(.(./././././././././././././.].].].`.].].].`.[.'.[.[.[.[.}.[.}.}.}..X[..X.XXXXXXX.X.X.XXX.XXX",
+"I.I.I.I.S.I.S.I.C.C.C.V.A.V.B.B.V.A.B.B.m.m.A.m.B.b.m.m.m.b.m.b.v.M.b.b.b.b.F.b.b.B.b.b.b.b.F.b.m.b.b.b.b.b.b.b.b.m.m.A.B.B.B.B.B.A.C.C.S.S.S.S.S.C.I.I.S.U.S.W.W.I.U.W.I.U.W.U.E.E.!.Q.!.Q.Q.~.!.~.!.!.!.~.!.!./.!./././././././././././.`.`././.`./.`.`.`.`.`.`.[.`.[.[.[.[.[.[.[.[.[.].].].`.`.`.`./././././.!././.!.!.(.(.(.(.(.(././.(././.^././.`.^././.]./.]./.].`.+X+X[.[.[.}.[.}.+X}.}.}..X.X[.XX.XXX.X|.XXXXXXXXXXXX.X.X",
+"I.I.C.I.Y.I.S.C.S.P.C.V.V.V.D.B.A.A.B.B.F.B.F.B.B.B.m.B.m.B.m.m.m.b.m.b.m.m.m.b.b.b.b.A.b.F.b.b.b.m.F.b.m.b.b.b.b.m.b.A.B.B.B.B.Z.B.S.D.S.S.S.S.S.S.I.I.I.I.I.I.W.I.U.I.U.W.E.E.W.Q.E.Q.E.!.Q.!.!.!.!././.!././.!./.`.!././.!./././././.`././.`.`./.`.`.`.`.`.].`.`.[.].].].[.[.[.`.].+X[.].].`.`./.`./././././././.!./.^.(.!.(.(./.(./.(.`./.(././././.`./././.]./.].].].[.].[.[.[.+X[.[.}.+X}..X.X.X.X.X.X.XXXXXXXXXXXXXXXXX.X.X",
+"C.I.I.S.S.S.I.S.C.S.D.D.C.A.D.A.A.B.A.A.V.B.B.B.B.m.m.m.A.m.m.m.m.m.m.m.m.b.b.m.m.F.B.m.B.m.m.m.m.m.b.m.m.b.m.b.m.m.m.m.m.A.B.V.V.V.A.C.C.S.S.S.U.I.I.I.I.I.W.I.I.W.U.U.E.E.E.E.W.E.~.W.Q.Q.!.Q./.!.!.!./.~.!././.!./././././.`././././././.`././.]./.]./.`.`.].[.`.].[.[.[.[.[.}.[.[.[.[.].[.+X+X`.+X/.`./././././.(.!.!./.^.^./.(./.(.(./././.`./.^.`./.`./.^./.].'.].].[.[.[.}.}.[.[.[.}..X.X.X.X.XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"S.S.S.I.S.S.C.C.C.C.C.D.A.A.A.A.A.B.V.B.Z.B.B.F.B.B.A.m.m.A.A.m.B.m.B.m.B.m.m.B.B.m.m.m.m.B.A.b.B.F.A.m.b.F.b.b.m.m.B.B.A.B.V.B.A.A.C.C.S.S.S.I.I.I.I.I.I.U.I.I.U.U.U.W.E.Y.!.E.W.Q.W.W.E.!.E.!.!././.~./././././././././././.!./.`./././.`././././.`./.`.`.].].`.[.].].+X[.[.[.`.}.[.+X[.].[.`.`.`.`.`.`././././././././.~.(.(.(./././.`./.(.`././././.]./.`.].^.].].].[.[.[.[.[.[.[.}.}.}.}..X.X.XXXXXXXXXXX|.XXXXXXoX.X.XXXXX.X"
+};
diff --git a/images/scenario8hilite.xpm b/images/scenario8hilite.xpm
new file mode 100644 (file)
index 0000000..d391216
--- /dev/null
@@ -0,0 +1,450 @@
+/* XPM */
+static char *scenario_hilite[] = {
+/* columns rows colors chars-per-pixel */
+"209 188 256 2",
+"   c #070707",
+".  c #3B3C3B",
+"X  c #373736",
+"o  c #2F312D",
+"O  c #2A221A",
+"+  c #1D3D68",
+"@  c #1C396E",
+"#  c #383944",
+"$  c #323352",
+"%  c #233E6B",
+"&  c #253D66",
+"*  c #31386E",
+"=  c #1B1756",
+"-  c #017C04",
+";  c #136E15",
+":  c #3A4338",
+">  c #2E4F2C",
+",  c #2B682D",
+"<  c #1E631D",
+"1  c #1C426B",
+"2  c #1B4267",
+"3  c #1C4571",
+"4  c #3B4343",
+"5  c #334D4F",
+"6  c #22416B",
+"7  c #244267",
+"8  c #244472",
+"9  c #3E5A7D",
+"0  c #305A7C",
+"q  c #29577A",
+"w  c #38667B",
+"e  c #235655",
+"r  c #48352A",
+"t  c #463B38",
+"y  c #553B37",
+"u  c #4F3128",
+"i  c #6A362D",
+"p  c #5A291A",
+"a  c #463B43",
+"s  c #513B47",
+"d  c #513967",
+"f  c #4A492C",
+"g  c #444334",
+"h  c #4B4932",
+"j  c #484438",
+"k  c #564639",
+"l  c #535230",
+"z  c #526B2A",
+"x  c #664838",
+"c  c #6F5034",
+"v  c #716D34",
+"b  c #574F1B",
+"n  c #474646",
+"m  c #564947",
+"M  c #575249",
+"N  c #585655",
+"B  c #4D4F50",
+"V  c #4D4B6D",
+"C  c #516A4E",
+"Z  c #496978",
+"A  c #664A44",
+"S  c #675647",
+"D  c #675855",
+"F  c #774846",
+"G  c #755B56",
+"H  c #72544B",
+"J  c #6F6553",
+"K  c #6D6C6C",
+"L  c #725668",
+"P  c #3535A1",
+"I  c #3B5885",
+"U  c #2C5785",
+"Y  c #376288",
+"T  c #377398",
+"R  c #326892",
+"E  c #3A78A4",
+"W  c #425684",
+"Q  c #44568A",
+"!  c #405983",
+"~  c #44598C",
+"^  c #48598D",
+"/  c #455890",
+"(  c #4C4A8D",
+")  c #477B9C",
+"_  c #536B98",
+"`  c #47668D",
+"'  c #4B7AA7",
+"]  c #6259A3",
+"[  c #5D63ED",
+"{  c #5C63F1",
+"}  c #7267D4",
+"|  c #6364E6",
+" . c #6164E9",
+".. c #6A67E4",
+"X. c #6766EF",
+"o. c #5358D9",
+"O. c #3B3DC1",
+"+. c #07850A",
+"@. c #34A62A",
+"#. c #00DC00",
+"$. c #0BDA05",
+"%. c #18D80A",
+"&. c #1DCE0D",
+"*. c #00E300",
+"=. c #00EA00",
+"-. c #0BE304",
+";. c #0AEA03",
+":. c #26CE0A",
+">. c #28CC0E",
+",. c #21C707",
+"<. c #2ACB15",
+"1. c #25DA04",
+"2. c #25D407",
+"3. c #26D312",
+"4. c #37C91A",
+"5. c #34D313",
+"6. c #2CD11D",
+"7. c #57B929",
+"8. c #4BB325",
+"9. c #6F8F32",
+"0. c #68B232",
+"q. c #77AA39",
+"w. c #69B131",
+"e. c #53992C",
+"r. c #5C955A",
+"t. c #42C51D",
+"y. c #48C322",
+"u. c #56C527",
+"i. c #6ECB31",
+"p. c #34995B",
+"a. c #3B85AF",
+"s. c #1483C4",
+"d. c #1985C6",
+"f. c #1D88C7",
+"g. c #238BC9",
+"h. c #298ECA",
+"j. c #228AC7",
+"k. c #2D91CC",
+"l. c #3394CD",
+"z. c #3896CD",
+"x. c #3B98CE",
+"c. c #3D91C2",
+"v. c #3C99D0",
+"b. c #3796D0",
+"n. c #3C8FC1",
+"m. c #3FA2CB",
+"M. c #528499",
+"N. c #4984A9",
+"B. c #4789B2",
+"V. c #5584A5",
+"C. c #5895B9",
+"Z. c #538BB5",
+"A. c #6598B8",
+"S. c #729AAB",
+"D. c #4797C8",
+"F. c #429CD1",
+"G. c #489ED3",
+"H. c #449CD9",
+"J. c #579AC5",
+"K. c #5192C5",
+"L. c #4BA1D4",
+"P. c #47A3D5",
+"I. c #5DA2CC",
+"U. c #52A4D5",
+"Y. c #54A5D8",
+"T. c #5BAAD9",
+"R. c #58A8D6",
+"E. c #57ADD6",
+"W. c #659AC5",
+"Q. c #64A5CD",
+"!. c #63ADDB",
+"~. c #68ABD7",
+"^. c #66B0DC",
+"/. c #6BB2DD",
+"(. c #6AB6DA",
+"). c #71B5DE",
+"_. c #73B8DE",
+"`. c #79B6DA",
+"'. c #74ACD1",
+"]. c #6CB4E0",
+"[. c #69B6E1",
+"{. c #73B6E0",
+"}. c #75B9E1",
+"|. c #7BBBE2",
+" X c #78B6E1",
+".X c #65ADE0",
+"XX c #51AAE0",
+"oX c #7CC0E4",
+"OX c #A02C23",
+"+X c #8B5436",
+"@X c #8F6939",
+"#X c #AA642B",
+"$X c #8C564B",
+"%X c #906A51",
+"&X c #906F6D",
+"*X c #A76957",
+"=X c #B06F4F",
+"-X c #B0746B",
+";X c #A6595C",
+":X c #CD682E",
+">X c #CF7A59",
+",X c #CD7C62",
+"<X c #C87864",
+"1X c #D37B65",
+"2X c #DB7569",
+"3X c #D87867",
+"4X c #C57773",
+"5X c #E2736C",
+"6X c #EB6E70",
+"7X c #E77754",
+"8X c #BE2D27",
+"9X c #95708E",
+"0X c #916EAE",
+"qX c #AC748E",
+"wX c #AA6EA3",
+"eX c #8468C6",
+"rX c #C37882",
+"tX c #8A943C",
+"yX c #84A83D",
+"uX c #B1882C",
+"iX c #979948",
+"pX c #8F9346",
+"aX c #88A342",
+"sX c #AC8D52",
+"dX c #A6924D",
+"fX c #A99150",
+"gX c #B78957",
+"hX c #AE8F4E",
+"jX c #B18871",
+"kX c #9A946A",
+"lX c #D6A532",
+"zX c #C3835D",
+"xX c #C98459",
+"cX c #D48754",
+"vX c #C88060",
+"bX c #D38367",
+"nX c #E89B54",
+"mX c #E6CB41",
+"MX c #92908C",
+"NX c #A79B9D",
+"BX c #85BAD8",
+"VX c #81BDE3",
+"CX c #86BBE5",
+"ZX c #8C8EE8",
+"AX c #90C4DB",
+"SX c #83C0E4",
+"DX c #8CC4E3",
+"FX c #97C8E5",
+"GX c #A9D3E8",
+"HX c #B6D9E8",
+"JX c #A9D0EA",
+"KX c #ACD0D8",
+"LX c #CFA495",
+"PX c #C8E4EF",
+"IX c #CAE2F1",
+"UX c #ABCEA8",
+/* pixels */
+"!.!./.!.!.^.^.^./.!.!.!.!.].!.].!.!././.^./././.[.].).{.{.{.{.}.}.|.|.|.|.|.|.oXoX|.VX|.`.oXoX|.|.|.`.oXoXVXoXVXoXCX|.|.oX|. X|.|. X|.{.{.).).).).)./.{.{.)./.{.)./././.).(./.[./.]./.)././.)._./.{.]._.).)._.}.|.|.|.|.|.oXVXVXVX|.SXSXoXVXVXoXVXVXSXVXVXSXVXoXoXVXVXVX`.oX|.|.|.|.oX|.|.|.|.|.`.|.}.|.|.}.|.|.}.}.}.}.{.}.{.{.{._.{./.).)./.(./.!./.!.^.^.!.^.[.!.!.!.!./.!.!.!.!.T.!.^.T.^.T.^.T.T.T.^.T.^..X~..X!.!.!.!.!.!.!.",
+"^.!.!.!./.^./.!.^.!.!.!.!.!.!.!.!.!./.!./././.[.].].].{.).{.}.}.}.|.|.|.|.|.|.|.|.oXVX|.oX|.|.|.|.oXoX|.oXVXVXoX|.oX|.|.|.|.|. X}.}.}.{.{.{.).{.{.).).)./.].{./././././././.]././.]./././././.{./.).{._.{.{._.}.|.|.|.|.|.|.|.VX|.SX|.SXSXVXVXSXSXVXSXSXVXVXVXoXoXSXVXVXVX`.|.|.SX|.oXVX|.|.|.|.|.|.|.|.|.}.|.}.|.`.}.{.{.{.}.}.{./.)._.)././././.(././.^.^.^.!.!.!.!.!.!.!.!.!.!.!.T..X!.^.T.^.T..X^.E.T.^.!.^.~.!.T.!.!.!.T.^.!.",
+"^.!.!./.^./.!.!.!.^.^.!.!.!.!.!.!.].!.!./.^././.).).).{.].{.{.{.}. X|.|.|.|.oX|.oX|.|.|.|.|.|.|.|.oXSXVXVXVXVXVXSXCXSX|.|. X|.}.|.}.}.{.).{.).).).)./.).{.].).{.)././././.)./././././.)./.).{./.{.)._./.{.{._.}.}.|.|.|.|.oXVXVX|.VXSXSXVXSXDXVXSXSXSXVXVXVXVXVXVX`.oXoXoXoX|.oXVXVX|.|.|.|.|.|.|.|.|.|.oX}.}.}.}.}._.|.}.{.{.{.{.).{./.).)./.)./.(./.!.!.!./.!.!.^.!.^..X!.!.!.!./.!.!.!.!.!.!.^.^.!.!..XT.E.!.T.!.!.!.!.!.!.^.^.",
+"!.!.!.!.^.!.!./.!.^.^.!.!.].!.].!.!.!.]././././.)./.).].{.{.{.{.}.}.}.|.`.|.|.|.|.|.|.|.|.`.|.|.VX`.VXVX|.VXVXVX|.SX|.|.|.|.|.|.}.}._.{.{. X).).).).).{.).{._.].).)././././.]./.)././././._./.).{./.{.{.{.{._._.}.}.|.|.|.oX|.|.SXSX|.SXSXVXVXSXSXSXSXVXSXVXoXVXVXVXVXoX`.oXSX|.|.|.VX|.|.|.|.|.|.|.|.}.}.|.}.|.}.}.}._.{.}.{.{.{.)._.).).).).)././././././.^././.!./.!./.!.!./.!.!.!.!.!.!.!.!.^.T.!.T.T.^.T.T.~..XT.!.T.T.T.T.^.",
+"!.!.!./.!.!.^.^.^.[.!.^.!.!./.!.].!././.!./././././.).)./.).).}.}.}. X}.|.|.|.|.|.|.|.|.`.|.|.|.|.oXSXVXVXoXoXVX|.|.|.|.|.|.}.|.|.}._._.}.{.).).{./.).).{._./.{.)././././././././././.)./.)./.{./._.).{.{.{._.}. X|.|.|.|.oX|.oXVXSXoXCXDXVXVXSXSXVXSXSXSXCXoXVXVXVXVX`.VXVX|.oXVX|.|.|.VX|.|.|.|.|. X|.|.|.|.}.}.}._.}.{.{.}.{.{.{.{.{.{.).).).)././././.!./.!.!./.!.!.^.^.^.^.!.!.!.!.!.~.^.!.!.!.!.T.T.T.!.T.!.T.!.T.T.!.T.!.T.",
+"!.!.!.!.!.^.^.^.^.!./.^././.^.!./.!.!./././././././.{.).{.)./.{.{.}. X|.}.|.`.|.|.|.|.|.|.|.|.|.|.|.|.|.VXVXVXVXVX|.|.|.|. X|.}.}.}.}._.}.).{.{._._.).{.].{./.{.).)./././././././././././.).{.).).).{.{.{._.}.}.|. X|.|.VX|.|.VXSX|.SXSXoXDXVXDXDXSXSXSXVXSXSXVXVXSXVXoX|.oXVX|.|.|.VXoX|.|.VX|.`. X|.}.}.}.|.}.}. X}._.}.{.{.{.{.).{.{.).).}.).).)./././././././.!.^.^.T.^.^.^.!.!.!.!.!.!.^.T.E.!.T.E.T.T.T.T.T.T.T.T.T.T.T.T.T.",
+"!.!.!.!.!./.^././.^./.^./.^././././.!.!.!.^./.^./././.{.{.{.{.).{.{.}. X}.|.|.}.`.|.|.|.}.}.|.|.|.|.|.oXVXVX|.VXoX|.|.|.|. X|.|.|.}.}._.{.}.{.{.].)._.]./.{._./.)./.)././././.(././.).).).).).).{.{._._.}._._. X|.|.|.|.|.VXVXVXVXVXSXCXVXSXSXSXVXSXDXoXSXSXoXSXVXoX|.SX|.SX|.SXoX|.oX|.oX|.|.|.oX|.}.}.}.|.}.}.}.}.}.}.}. X{.{.{.{.}.{.).{.{.).).).)./././.!./.!./.^.^.!.[.^.^.!.!.!.!.!.!.!.~.!.T.!.T.T.T.T.T.T.T.T.T.T.T.T.T.T.",
+"!.!.!.!.!.!.!.!.!./.^./.^./.!.!.~././././././.^.(././.]./._./.{.{.}.}.}.`.}.|.}.|.|. X|.|.|.`.|.|.|.VX|.|.oX|.|.|.|.|.|.|.|. X}.}.}.}.}.{.{.{.{.{._.{./.{.).).{.)././././././.~./././.(./.).{._._.{._.}._.}. X|.|.|.|.|.VXVX|.VXVXoXoXCXSXSXSXSXSXDXSXCXSXCXVXVXVXSXSX|.SX|.oXoXVX|.VX|.VX|.oXVX|.|.|.}.|.|.}.}.}.}.}.}.}.}.{.}.}.}.}.{.{.{.). X_.{.).)./.^././././.^././.!.^.^.!.^.!.!.!.!.^.!.^.T.T.T.T.T.T.T.T.T.T.!.T.T.T.!.T.",
+"!./.!.!.!.].!.~././.].!.^.^.(.[./././.!./.^.^.^././.{.].]./.{.)._.{.{.}._. X`. X X}.}.|.}.}.|.}.VXoX|.|.|.oX|.CXoX|.|.|.|.|.|.|. X X}.}.}.}.{.}.{./.).)././.).).)././.)././././././.].(.].].{.{.{.{.}.}.}.}.|.}.|.|.|.|.VX|.VXVXVXVXoXSXCXSXSXSXSXSXSXSXSXDXSXSXSXSXoXVXVX`.`.oX|.SX|.oX|.oX|.oX|.|.`.|.|.}.}.}.|.}.}.}.}.}.}.}.}.}.}.}._.}. X X X}.{.].)./././././././.!./.^.^.^.^.^.!.!.!.!.!.T.!.E.E.R.R.R.E.T.T.E.T.T.T.T.T.T.",
+"!.!.!./.!.!.!./.!.DXFXFXGXGXGXGXGXJXJXJXJXJXJXJXJXFXFXDX]././.).{.{.{.{. X_.}._.}.|. X}. X}.}.|.`.|.|.|.|.oXoX|.|.|.|.|.}.|.|.}.|.}.}.}.}.}.{.}.{.{.).{.{.{./.{.{././././.!.^././././.].{.{.}.{.{.}._.}.}.}.|.|.|.|.|.SXoX|.VX|.oXVXVXVXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXVXVXoXoXoXoX|.oXoXVXSX|.|.|.|.|.|.}.|.}.}.}.}._.}.}.}.}._.|.}.}.}.}.|. X}.}._.}.]._./././././.!./.L.^.'.`.BXVXBXVXBXVXBXSXVX`.AX`.(.~.J.R.R.Y.T.T.T.T.T.T.~.",
+"!.!.!.].!./././.DXFXGXHXPXPXIXIXPXPXPXPXPXPXPXPXPXHXJXFXVX).).).{.}.`.)._.}. X|. X`.`. X X X}.}.`.|.VX`.|.|.|.|.|.|. X|.}.|.|. X X|.}.|.}. X}.}._._._._.{.{.).).{././.).)./.).).(.).].{.{.{.{.}.`.}.`.|.}.oX|.|.|.|.|.|.|.CXVXVXVXVXVXCXVXVXSXSXSXSXSXSXSXSXSXSXSXSXoXBXVX`.VXoXVXVXoXVXVX|.oX|.|.|.oX|.}.|.|. X`.}._.|._.|. X|.|.|.|.|.|.|.}.}.`.}.}.{.)./.).).)././.L.^.`.FXFXGXGXHXGXGXGXGXGXGXHXFXFXDXBX~.U.T.Y.Y.T.T.T.T.T.E.",
+"].].!.!.!./.!.!.FXJX6 6 7 7 7 7 % 6 & % 7 6 6 % & 2 1 FXFX{.(./.(.].{._._._.}._.}.}.}._.}.}.}.}.|.}.|.oX|.|.oX|.|.|.|.|.oX|.|.|.}.}.}.}.}.}.}._._.]._./.(.{.(.].]./.).!./.(.^.^.(./.(.(.(.{.{.{._.}.}.}.|.}.oX|.|.oXoX|.oX|.|.|.VXVX|.VXoXVXoXVXVXSXSXSXSXSXSXSXSXoXoXoXVXoXoX`.oX`.`.VXVXoXoX`.|.oX|.}.|.|.}.}.}._.{._.}.}.}. X}.}.|.}.}.}.|.}.}.}.{.}.{._.]./.]././.~.'.3 2 7 7 6 6 6 6 7 % % 7 & 8 6 + 1 BX!.T.T.Y.E.Y.T.T.T.E.",
+"!.].!.].!.].!./.JXJX& 2 + 7 7 7 6 + 6 6 6 1 6 6 6 6 + JXDX).{.{.{.{.{.}.}.}. X{.}. X X}. X X X|.|.|.|.}.|.|.|.|.|.|.|.|.|. X}.|.|.|.|.}.|.|.}.|. X X{.).{.{.].{.).]./.]..X)././.)./.).).{.{. X{.}.}.}.|.|.|.CXCX|.|.VXVXVXVX|.VX|.VX|.VXoXVXVXSX|.CXSXSXSXDXSXSXSXSXSXSXBXSXoXVXoXVXVXVXVXVXCXVXoXVXVXVXVXBX|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|. X|. X X X).{.).)./.~.VX1 7 % 6 6 % 6 7 % 6 % 7 7 6 3 % 6 BX'.R.R.E.T.Y.T.T.T.T.",
+"!.!.!.].!..X/./.JXPX2 8 6 6 7 8 1 8 6 1 % 1 1 6 8 % 1 JXAX{.)./.).{.).}. X{.{.}.}.}.}.}.}.}.|.|.}.}.|.|.|.|.|.|.|.|.}.|.}.}.}.}.}.|.}.|.|._.}.}.}.}.}.{.{.].].].)./.].).).)./././././.).{.{.}. X}.}.}.}.|.|.|.|.|.|.|.|.VX|.|.|.|.VX|.|.|.VX|.|.VXCXSXSXSXSXSXSXVXVXVXVX`.VX`.`.VXVXVXVXVXVXVXVX|.VX|.|. X X|.|.|.|.|.`.|.}.|.|.|.}.}.|.`.oX|.|. X|.}. X}.).}.{.{././.~.BX7 7 6 % 6 6 6 2 7 6 6 7 2 1 1 7 7 FX(.R.R.T.Y.Y.T.T.T.R.",
+"].~.!.!.].!.].!.JXPX3 + 6 @ 7 7 7 7 % 2 + 1 6 6 1 & 7 FXDX{.).).{.).{.{. X}.}. X}.}.}. X X|.|.|.|.|.|.|.|. X|.|.}.|.}.}.|.|.|. X|.|.|.oX|.|.}.|. X}. X}.).)./.).)./././././.)./.).).).).{.}.|.}.}. X|.|.|.|.|.|.VX|.VX|.|.VX|.VX|.|.VX|.|.|.VXVXVXVXoXSXSXSXSXSXSXSXVXVXoX|.`.SXVXVXVXVXVXVXSXoXoX|.|.|.|.|.|.|.|.|.oXVXVX|.|.|.|.|.|.oX|.|.|.|.|.|.|.|. X X}.{.}.{.).T.`.1 7 6 % & 7 6 2 7 & % 1 & & 6 2 8 KX`.E.T.R.Y.T.T.T.T.T.",
+"!.].!.].!.]././.JXPX3 3 2 7 IXIXPXIXIXIXPXPXPXIXHXHXGXFXSX(././.).).).}.{.}.).{.}.}.}.}.}.}.}.}.}.}.|.}. X|.|.|.|.}.|.}.}.}.}.}._.|.|.`._.|.}.|.}.}._.)._./._./.).).)./.).)./././.)./.).{.}.}.}.|.}.}.|. X|.|.|.|.|.|.|.|.|.|.|.oX|.|.|.}.}.|.|.|.oXoXoXSXSXSXSXVXoXVXoXoXVXoXoXoXVX`.VXoXSX|.VX|.SXVXoX|.|.oXoX|.oXoXoX|.|.|.|.|.|.`.|.oX`.|.|.|.|.}.|._.}.{.}.).).).U.~.`.AXFXGXGXGXHXGXGXHXPXIXIX7 6 6 + GX`.T.Y.E.T.E.Y.E.Y.R.",
+".X!.!./././.!./.JXPX& 8 2 % IXPXHXHXJXJXJXJXJXJXFXFXFXVX].(.{._.).)._._.`._.).).`.}.}.`.{. X`.}. X X{. X`. X X_. X|.|.|. X}.`. X|.|.|.|.|.|.|.}. X`. X}._._./.)./.)./.)./.).).).].{.).{.}.}.|.}.`.|.}.{.|.|. X|.|.|.|.|.|.|.|.|.|.|.|.|.|. X X|.|.oX|.|.VX|.oXSXVXVXVX|.|.oXVX|.VX|.|.VX|.VXVXoXVX|.VX XVX|.|.|.|.|.|.|.|.|.|. XoX`.|.|.|.`.oXoX}.|.|.|.|.|.}._.`._.}.{.G.~.~.`.BX'.VXCXBXCXAXAXHXIX& 1 6 7 GX'.T.T.T.T.R.T.Y.T.T.",
+"/./.!.^.!.!././.JXPX7 % 7 0 IXPX`.(.)./.].{./.W.' _ / Q / / ~ ~ / Q ^ / ^ ~ / Q ~ / ~ ~ / / ~ ~ ^ / / Q / ^ ~ Q ~ ~ ~ / ~ ~ ~ / ~ ~ ~ ~ ~ / ^ ~ Q Q ~ ~ ^ ~ / / / Q / / Q / ~ Q Q Q ~ ~ ^ / ~ ~ / / / Q ^ ^ ~ ^ ~ / Q / ~ ~ ^ Q / / / / ^ Q ~ / ^ ~ ^ ^ ^ ^ ^ ^ / Q Q ^ ^ ^ Q Q ^ ^ ^ ^ ^ Q / ^ ~ ~ Q Q ~ ^ ^ Q ^ ^ ^ / ^ Q ^ / ^ ` ^ ^ ^ ^ ^ ^ ~ Q / / / ~ ~ ~ ~ ~ ~ Q Q Q / _ K.~././.!.~.!.!.FXHX7 6 2 2 KX_.T.T.T.T.T.T.T.R.Y.",
+"^./.^.^././././.JXPX8 % 2 % PXHX{.).]./.Q._ ~ / / Q Q Q W Q Q / Q Q Q W Q Q Q Q Q Q / Q ( I Q Q Q Q Q Q ~ ^ Q Q Q ^ Q Q Q Q Q Q ~ Q Q Q Q Q Q Q Q Q Q Q Q Q ^ Q Q ( I Q Q Q Q Q Q Q Q Q Q Q Q ^ ^ Q ( Q Q Q W Q Q Q Q Q / ^ Q Q ( Q ^ Q Q Q Q Q Q Q ^ Q Q Q Q Q Q Q I ( Q Q Q Q I ( ^ Q Q ( Q W ^ Q Q Q ^ Q Q Q ^ Q ( I ^ Q Q Q Q Q ^ Q Q Q Q Q Q Q Q Q Q Q Q ^ ^ Q Q Q Q Q ~ I / / / W./.!.!.!.`.HX2 1 7 7 KX_.R.T.T.T.T.T.R.R.R.",
+"/.!.^././.^./.!.FXPX& 8 7 2 HXGX/./. XQ.) ~ / I Q 9 9 9 Z I 9 9 9 9 9 9 Z I 9 9 9 9 I Z 9 9 Z 9 I Z 9 9 9 Z 9 9 9 9 9 9 9 ! 9 9 9 9 9 9 9 9 I Z 9 9 9 9 9 9 Z I Z 9 I 9 9 9 I Z 9 9 9 9 9 9 9 9 I Z 9 9 9 Z 9 9 I Z 9 9 9 9 9 9 9 9 I Z 9 9 9 9 9 9 9 9 9 9 9 Z 9 9 9 Z Z I 9 9 I 9 9 Z 9 9 9 Z I Z 9 9 I Z 9 9 I Z 9 9 9 Z 9 Z 9 9 9 9 9 9 9 Z 9 9 9 9 9 9 9 9 9 9 ! 9 9 9 9 ~ I / / _ W.~.].!.`.KX7 6 7 8 KX`.T.T.T.T.R.R.R.R.R.",
+"/././.^././././.GXPX2 + 7 7 PXGX).).Q._ I I I ` p.<.1.1.2.1.%.1.1.1.2.2.1.2.1.1.2.2.1.1.1.2.1.1.2.2.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.1.%.1.2.2.2.1.1.1.1.1.1.1.2.1.1.1.1.%.2.2.2.1.2.1.1.1.1.1.1.1.2.2.1.1.1.1.1.2.2.2.1.1.1.2.2.1.2.1.1.1.1.1.1.1.1.1.%.1.2.2.2.1.1.1.%.1.1.1.2.2.2.1.1.1.2.1.1.%.2.2.2.1.1.1.1.1.2.2.2.1.1.1.2.1.2.1.1.1.2.2.1.1.2.1.1.1.1.2.1.1.2.1.1.2.1.1.1.@.r.` ^ I _ W..X~.|.GX7 1 8 % KX`.!.T.T.T.R.R.R.Y.Y.",
+"!././.[./././.].GXPX6 8 + 6 IXFX XQ._ Q Q / r.6.1.1.1.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.p.Z Q / / W..X(.KX1 6 % % GX`.T.T.T.T.R.R.Y.R.Y.",
+"!./././././././.GXPX% 6 1 7 PXJX X' I Q Q r.@.1.1.1.1.2.2.2.1.1.1.1.1.1.%.1.2.1.2.1.1.2.1.1.1.%.1.1.2.2.2.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.%.1.1.2.1.1.1.1.2.1.1.1.2.1.1.1.1.2.1.1.1.1.1.1.2.2.1.1.%.1.1.1.1.2.1.1.1.1.2.%.1.1.1.1.2.2.1.1.1.2.1.1.1.2.2.1.1.1.2.1.1.1.1.1.2.2.1.1.1.2.1.1.2.1.1.%.2.1.1.1.1.2.1.1.1.1.2.1.1.1.1.1.2.%.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.r.Z I / ' Q.`.KX1 1 & & JX`.T.T.T.T.R.U.Y.Y.Y.",
+"/./././.)././.).GXPX% 8 1 7 HXGXW.Q ( W Z 6.%.1.1.1.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.p./ / / W.'.GX1 6 % & GX/.T.T.T.Y.U.U.U.U.Y.",
+"/././././.)./.).JXHX8 % 1 8 IXFX/ / I ' @.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.%.1.1.1.4.p.( / K._.KX1 6 8 2 FX_.I.T.T.Y.L.Y.U.U.Y.",
+"/./././././.{./.JXPX1 6 1 6 HXFX/ Q / r.5.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.2.2.2.2.%.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.2.1.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.2.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.2.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.2.1.y.! / ' '.AX7 7 6 7 FX~.R.Y.Y.Y.Y.U.U.U.Y.",
+"/./.].].].].).{.FXHX8 7 6 % JXAXQ / / @.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.dXdXfXhXhXdXC dXhXgXgXhXsXhXfXfXsXsXgXhXfXfXhXtXq.gXgXhXC pXhXgXgXgXsXfXhXgXhXhXfXfXfXdXq.fXhXfXgXhXdXJ J dXu.0.dXhXdXhXhXhXdX0.0.dXdXfXsXgXsXhXdXfXsXsXhXhXhXw.0.7.7.0.iXhXgXsXfXfXdXgXq.iXsXsXhXhXq.u.tXhXfXfXhXgXsXgXgXhXhXq.7.7.u.aXsXhXhXhX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.I / _ W.AX2 2 7 2 AX!.R.U.U.U.L.L.Y.U.U.",
+"/.]./.]./.].).].FXJX1 7 2 6 JXBX/ I _ 4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.,X,X2XdXiX2XD D iXw.w.q.q.iX1X,X1XsXw.iX2X3X2X0.=.0.aX1XJ *XzXw.q.w.aX3XgXw.tX,X,X<X3Xq.=.gX3XzXaXbXcXG *XdX=.3.zX,X,X,XvX3XdX=.=.dX3XvXaXw.q.zX,X,X,X,X,X1Xw.*.=.*.*.*.fX1XaXgX1X,X1Xq.=.q.5XpXpX$Xy.-.aX5X2X5XiXw.q.w.w.gX3X7.$.$.%.q.2X3XiXiX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.%.1.1.1.1.I / / C.'.2 2 6 3 '.I.R.Y.U.U.Y.U.U.U.U.",
+"/././././.].).).DXFXJXGXJXJXFX'./ Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zX1XfX$.$.w.J L w.%.-.;.=.<.,X3X5XyX=.#.w.iX6Xw.*.-.3.1XG *Xq.=.=.=.-.,XaX=.-.zX,X,X3XdX4.vX,X4.*.w.3XG %Xy.dX2X,X,X,X3X,X1XgX3.3.gX2XsX=.*.%.sX1X,X,X,X3XzX#.#.#.#.3.iX2XzX=.q.3X1X1X$.=.q.5Xt.9.D 2X2X5XiXq.0.#.=.*.-.=.7.6X3X,X,X,X,X,X2X<.0.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.w / _ B.I./.).|.~.I.P.R.Y.U.U.U.L.U.U.L.",
+")._.{./.{.).{.).).CXDXFXAXFXoXQ.^ Q _ 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zX2Xt.*.#.=.5.G F i c @.=.3.3XsXiX5Xq.*.*.#.0.<.%.2Xw.q.G -XiX1.#.=.4.5XaX=.%.zX1X,X,X,X3XzX4.-.$.*.0.%Xr.=.7.,X,X5X,XyXzX1X1X,X,X2X5XgX6.dX5X5X3X3X,X,X,X0.#.#.$.iX1X1X3X<X%.iX5XiX0.$.#.iX1X1X-XD aXq.0.#.=.*.#.*.7.,X3.&.q.gX2X,X,X,X3XiXy.3X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.W / / B.B.J.Q.I.L.D.E.R.U.U.U.U.L.U.L.L.",
+"{._._.).).)./.{.{.).{.{.].{.).'./ I _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zX2Xy.#.#.*.4.G x 9.+X8.=.7.6Xu.*.pX6X7.*.#.*.*.#.w.4.$.H *X3X1XyX4.,X,X4.*.$.zX1X2X2X2X5XdX<.zXaX*.*.J J 1.3.gXvXaXy.$.zXvXvX1XvXyXq.vX1X,XyXq.q.q.gX3XgX*.#.*.q.2X,X2XiXu.q.5Xq.*.*.*.yX;XF $Xy G 4.=.=.#.#.%.%.%.w.6X<.*.=.&.gX5X,X3XiX*.8.5X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.Y ` ` N.J.I.T.T.T.E.E.R.U.U.L.U.L.Y.U.Y.",
+"{.{.].{._.)./.{.{.).{. X{.]. X~.Q I _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zX2Xy.*.#.*.<.L c v +Xe.3.,X2Xq.%.y.5X0.*.#.%.%.%.*.*.4.G N -X3X3X1XzX<.*.#.$.zXzXq.q.q.aX2X,X2XiX*.$.J *XbX,X2XdX=.=.dX5XvX1X3XsX=.#.gX3XvX$.=.=.%.gX2XgX$.#.$.sX3X3Xw.*.=.aX,X$.#.#.#.yX$X9XLXx D bXy.%.%.q.1X,XgXy.q.$.#.#.*.&.q.gX5X4.=.y.3X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! / ^ B.C.R.T.T.T.R.R.R.Y.U.U.U.U.L.U.L.",
+"{.{.}.{.{.].{.{.{.{.{.{.}.{. X~.Q Q _ 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.xX3Xy.=.#.*.7.D M o l c =XbX5X3XvX,X2X0.*.%.zX>XvXq.4.zX-XN h +X+X=XiX$.%.%.4.3XaX=.*.=.*.q.3X3XaX=.=.J %X1X1X,X7.%.3.&XG D D D %X5.dX5X2X5XsX=.yX3X,X3XgX#.=.q.5X1X>X>.-.;.yX,X%.#.#.*.aX;X$X&Xf M =X>X>X,X3X,X1X3X3.=.#.#.#.#.*.=.6.q.$.=.q.3X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! / ^ N.C.I.T.T.T.Y.Y.I.Y.U.U.G.U.H.Y.L.",
+"{.{.{.{.{.{.].{.{.{.{. X{.{. XQ.Q Q _ 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.bX5Xy.*.#.u.1X*XD x 7.c %Xq.q.dX1X>X5X7.=.3.,X1X,X3X1X1X1XG y 7.v ;XbX>XvXvX,X2XyX=.#.*.#.*.gX3XsX%.5.G %X1X1XxXv c c l r p n X %XbXbXq.q.q.7.$.gX3X,X1XgX*.=.iX5X%XS G z t.dX>X$.*.*.*.5.q.@X;X$XJ @Xh G x ,X<X,X1X3.*.#.%.%.%.%.w.bX%.*.0.3X1X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.%.1.1.1.1.1.! ` ` N.C.I.!.T.R.R.Y.U.U.U.G.U.U.U.U.Y.",
+"}.{.}.}.}.].}. X{.{.{.{.{.{. X'.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.fXq.3.*.<.1XbX<XD c @X+X9.=.;.u.3XbX5XyX%.y.1XbXbX1X1X1X7XJ F v c *X1X1X,X1X,X3XiX%.%.%.%.5.zX1X3XxXcX%X;XbX1XbX$XkXD O y 3XLXm %X5XgX3.-.-.%.iX5X,X1X>XvX<.%.fX3X%Xr.K l bX1XbX4.%.%.%.%.;.dX5X-XN k r.r.h <XvX,X1X8.-.w.1XvXzX1X5X6X<.4.2X1XvX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.` ^ / N.C.I.E.T.R.Y.Y.U.U.U.U.G.Y.U.G.U.",
+"}.}.}.{. X].}. X{.{.{.{.{.{.{.~.Q ~ _ 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.%.2X4.4.5X1X<XN M a N J J D J D G G G J J G G G G D J G l S n M H G -XbX,X,X,X3XbX%XD D J G G G G K l M J G J y &XN o n -X-Xn N J G J J D K $XG G G $XG G J G J k C p.: G G G G J J J J J G G D B 4 C r.: %X<X,X,XbXvX1X3X,X1XdXq.q.#.q.2X3XnX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! / ` N.C.I.~.T.T.R.R.I.U.U.U.U.G.Y.U.U.",
+"}.}.}.]. X}.}.].{.{.}.{.{.{. X~.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.$.yX%.$.dX1X<X=X*X-X*X*X*X*X*X*XD j g y a > : o 4 o O o j n t a X . o *X3X,X,XbXi t . n o $ . n 4 X k g 4 c @Xo m N 5 r p O o 4 k k X m , - - ; ; - < M # j k @XX O u o . k y t a t u 5 X j t A t : O u O D >X,X,X,X1X,X,X1X3X<.=.*.0.2X2X2XsX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.Y ` / N.C.Q.E.T.T.R.U.Y.U.U.U.U.Y.Y.U.L.",
+"}. X}.}. X]. X].}.{.{.{. X}.).'.Q W _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.0.-.-.$.-.7.3X,XbX1XbXbXbXvX1XbXbXN v u.%Xt +.r.C . B K K 4 c V o.I X O O =XbX,X3Xu o N kXB o N K B u M N MXj m m LXN B y 5XLXy t -XjXu S c uXuX#Xb v @Xn B MXn A j u.yXx m z tXi A r $X0X$ t %XK n t e.i.c N bX1X,X,X,X,X,X1X1X<.*.t.2XfXyXq.$.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! / ` N.J.Q.T.T.R.R.U.U.U.U.G.U.H.Y.L.L.",
+"}.}.}. X}.}.].}.{.{.{.{.}.}.{.'.^ ~ _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zX<XzXzXvX3X,X,XvX,X,X,X,X,X,X,X,XM f tXc a ; < l a 4 , > a x $ O.P . O   O *XbXx   X j -XS X B N N u M B K t X t -X&Xt j -XjXB t -XjXu B +X$XD @Xm m #Xm n K t X t 9.tXy D x c u A t OXMXB t G A o a v iXi D 3X1X,X,X,X,X,X,X,X6.*.q.6X4.*.#.#.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! / ` N.C.I.E.T.R.T.U.U.Y.U.U.U.U.U.U.U.",
+" X}.}.].]. X X}.}. X}.}.}.}. XQ.^ ^ _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zX2X3X1XsXdX3X,X,X,X,X,X,X,X,X,X,XD 4 a D l : X : l : o : f g . # . f : X X A %X: . h : . : h g X X : f : X j f h . 4 h h . j : h 4 : t 4 +X%X&XJ D H #Xn n X t j f a t f l D D M g h . s n n # m h f t a : l K G %X,X,X,X,X,X3X3.t.2XfX%.#.#.#.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.W ~ / N.C.I.E.T.R.R.R.I.U.U.U.G.G.U.U.U.",
+" X].}.}.{.}.}.}.}.}.{.}.}.}. X.XQ Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.fXaXsX5X7.7.3X,X,X,X,X,X,X,X,X,XxXS OX#X+Xj t x k l A y k h j r A k t : j > 4 . m o X g m j g B _ kXV n r i n t r c k j j n c @X: h k X n @XjXMXMXJ G :Xn n k M : j h x t t g x X h g O O u $XO O o h g x t j O o =X,X1X<X3XbX1X3.7.6X4.*.#.#.#.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! / ` N.C.I.T.T.T.R.Y.Y.U.U.U.G.U.U.U.U.",
+"}.}.}.}.}.{.}.}.}. X}.{.}.}. X~.^ Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.t.=.%.fX1X,X2X,X,X,X,X,X,X1XvX1XzXS 8XmX$Xs z u.%Xt S q.%Xn x x wX-Xa , _ r.: A -XP X j -X-X. ( kXmXd k u 5XLXn y mXcXt N MXn A n jXG O B @X&X&XNXJ G #Xn g &XbXn t 7.yXA a 8.yXi m X     O *X    O a e.i.$XX     i =X+X$Xc ,X3X3.3.aX$.#.#.-.7.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.` ~ ` N.J.I.!.T.T.Y.Y.U.U.G.U.U.U.U.G.U.",
+"]. X}.}.{.}. X X X X}. X X X X'.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.y.*.*.7.5XgXaXgX1X,X,X,XvX1X,X,X,XD 8XOX8Xk l q.@X# l q.@X# k y qX%Xt < c b > N K %X. k LX*Xt I O.P @ M k -XjX4 y lX=Xt B J t . j &XD O B @XdX&XjX%X+X:Xn t -XjXy t 9.tXk t 9.iXi k :     O ;X      a v pXx #     O *XuXnX$X-X3X3.*.=.-.-.7.vX5X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ` / N.C.I.I.T.T.T.Y.I.U.U.U.U.U.U.U.U.",
+"}.}. X X}.{.{.}.}.}.}.}.}.{. X~.^ Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.*.5.1XgX3.=.4.3X,X,X,X,X,X,X,X,XM > f p g X u r : r i u X m r u r t X u u o X x u . r r o a : e > # n X r r . g u u # . o r t : u r g j x +X+Xi +X+Xc n t r u X # u u r X u u X m . o o y c o o X t u x r # O o g $X#XcX+X<X7X8.-.7.vX<X5XgXaX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.w ^ ` N.C.I.T.T.R.Y.Y.Y.U.U.U.U.G.U.U.U.",
+"].{.{.{.{.{.{.}.{.{.{.{.}. X X~.^ Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.y.*.4.6Xy.*.#.4.2X1X<X3XbX,X,X,X,XM B m B f n m B f M m M h g m M B l k B B h s x M h M y n f l n n n f k B B h h M M l h B B l k M M n : h n B B n n B l h B M m h B M l l B M m : l M m N m B B M f B k M f B M B . t g g G %X,XzX3X3XhXaX%.*.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I ~ _ N.C.I.E.T.T.Y.U.U.U.U.Y.L.L.Y.Y.U.",
+"{.{.{.{.{.{.{.).{.{.{.{.{. X{.Q.W ^ _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.7.;.7.5Xy.*.*.4.3X1Xi A x <X,X>X,XD X x k l k y k g g k k f j X X X h M t y j u 4 4 g c #X#Xk t S K X M g M K j j n 4 : g x k j g k k X l g n 4 : n k k : g k K j j 4 : o j k x X j g f x t n g x g h ; : o c y y r j B h k o t $XF sXbX7.=.#.#.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.W ~ / Z.C.Q.T.T.Y.U.U.U.Y.U.Y.Y.Y.Y.L.Y.",
+"{.{.{.]./._.{.).).{.).).).{.{.~.^ W _ 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zXgX,X2Xy.*.*.4.3X=Xi 9X( =XbX1X,XM z i.=Xa v u.%Xs l u.%Xm x m K %X. c u.dXa p -X( X 8XmX%Xy M LXB x l m LXB B B K B o k lXcXj t lXnXi l B K N X a lXnXm t LXK B 4 &XK o . lXnXi x a e.yXF t e.yXH , r.+Xr N c yX+Xx s e.i.c A bXH pXc @Xc 4.#.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! / ` N.C.Q.R.T.Y.U.U.U.U.U.Y.Y.Y.Y.Y.U.",
+"{.].{.{.{.{.].{.).).).{./.{.).Q.^ ^ _ 5.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.vX2X2X5X0.*.*.4.5X,XOX-XL A 1XbX>XG f 9.c a l 9.@Xn l 9.v a l j B l t f yXc a p ;X9X# OX8X8XA n jX&Xu M y jX&Xj B K M t t lX>Xt t lX>Xu m 4 K N y t uXcXt t jX&Xj # %X&XX g uXcXx k a 9.yXr : v aXx 5 r.MX< D x tXu k n z tXi $XLXH +X#XnX$X<XzX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.Y / ` N.C.Q.T.T.Y.U.U.U.Y.U.Y.Y.U.Y.L.U.",
+"].).).{.{.).].).).)././.).).).Q.Q Q _ ,.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.hXiXaXgX3X4.*.4.%XH t t : h J &X%Xk J s S l J n j l S s S l g . X X f g s S l r r 4 f l : l l g t g . h h t j g j X X h g a j : h t j . h h . X h f # g g h t n j g t a n B t m a g f n m S f a t j f : n : N H s D g f n t t : . 4 j @XnX+X%XxX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ` / N.J.I.T.!.Y.U.U.U.Y.U.Y.Y.U.U.U.U.",
+").).).).].).].].)././.)./././.Q.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.t.=.=.y.6X0.*.<.D X X # 4 h < ; ; h > 4 X j r n # h t k j j j t k m j j A y g t k k h n k j g g x l X k j j t t g k k g j x v @X: j k r k j k n : j k k g j 4 . X z ; < , < < ; , j S r x t g g m t l < < < < ; < < j S k y t N *X*X*Xv e.$Xt.7.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! / ` N.C.Q.!.E.Y.U.U.L.E.Y.R.Y.U.U.U.U.",
+"].).].)./.).).{././././././.].Q.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.t.*.#.&.gX3Xy.4.D y +.r.h n ; - +.4 +.r.j # i &XV . x &XD n x b u.=Xm k 9.v a l u.pXa B jXm o k mX7Xu M B jXS o m mXcXy B K J S n jXG O S # &XjX# t lXnXk n &XC o , +.+.- - - - < s m 9.yXF a e.yXc 5 - +.+.- - +.- m N c tXx n H $X$X8.t.5X1X1X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! / / N.C.I.T.T.Y.U.U.U.U.Y.Y.U.L.U.L.L.",
+"].].]./.].).)./.)./././././.].Q.Q Q _ 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.t.*.#.*.&.gX,X<XN s - z x n - - - n ; , x s p <X] . m %Xt 4 k l q.v a F v v a f q.@Xt t jXB o k lX=Xu M : -XN O y lX=Xt n %XK X j &XD O S t jXbXy X lXxXy # &X&Xt , +.- - - - - ; m m z yXu X 9.pXA , +.- +.+.- - ; m G c z y 4 D vXH =XbXgXiXiX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.w / ` V.I.Q.T.T.Y.U.U.U.L.U.Y.E.U.U.U.U.",
+"/./././././././././././.!./.!.Q.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.*.-.;.;.5.bX3XN k X o : f , , , l : X t h r t n f : j t f g t k M l S y S k g s j h : . . h g j j . l : . : h t . t f g 4 . : h 4 4 . h h : a : f t t g f n j X h , , , , , , , h c D m S f t n g z , , , , , , , t l H H D 4 %XLX$X>X5Xu.*.*.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.Y ^ ` N.C.I.T.~.Y.Y.U.U.U.Y.U.U.Y.U.L.U.",
+"/.)./.).).).)././.^./.^.].].!.Q.Q W _ :.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.7.,.z z b > S z B y a n u x m y k h o X o k A y t h f > X g j X : X g X n t j : : # h j k y j j m a . k g M K j u u n g j j c @X: j k X j g 4 c @Xg n K j g n x #Xt s s a s a s . h : ; g o g > o X h < t o D t y r t j r k X n O f O c $Xc &.#.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.w / ^ V.C.Q.^.R.Y.Y.U.U.Y.R.R.Y.U.U.U.U.",
+"/././././.)././././././././.~.Q.Q Q _ ,.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.gX=Xp.%Xp = ] B 4 r ( ] i a v u.%Xn B N K n F 9.v s ; r.C . i ; r.C X x %XK a ; r.C . h u.pXt t -X&Xf M N LXn B i 2XjXa N MXk c 4 jXH O S B MXn c n LXK n n MXB c s 8.yXA # &XMXt x 5 r.+Xr 4 B K n : r.+Xu s 9.yX+Xk 4 uXnXF X uXnXi m jXH 4.#.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.Y ^ ` N.W.Q.T.T.Y.U.U.U.Y.U.R.R.Y.U.Y.U.",
+"/././././.)./././././././.!./.I.Q W _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.%.>X<Xr.NX> = @.e n i * ] V a l 9.@X. > C > n F z x s ; , l t y ; @.c a k %Xt a ; , z t h q.@Xa k bXjXu M k jX&X4 n jXLXB B K t X . -XJ O S B K j . t jX&Xj 4 K j . t 9.tXy $ ( O.$ x B r.MX> a n C o : r.MX> a z yXc k . uXnXF # uXnXi $XLX$X,.<.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ` ^ N.C.I.T.~.Y.Y.U.U.Y.R.E.Y.U.U.L.U.",
+"/././././.)././.(.(./.^.!././.Q.Q Q _ 2.%.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.vX<Xv 5 o # o > l h # $ # l H s j h : o o l H H H l > o : h j X o : h : j t h X o : h g y a j . # # X l j t n h h y t j j : : g g n j . h h X j h h t n j h X X t f r t g f $ $ X g g > : > f o o : f : 4 > h : t t j l : t g l X g X X n v -.u.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ~ ` N.C.Q.T.~.Y.U.Y.U.Y.Y.E.Y.Y.U.Y.Y.",
+"/././.)././././././././././..XQ.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.vX3X,X*XK 9.9.J x . . k X h m y t l k y k g . k t g j S a l y t n X h g # $ f n n o h j 4 o g i #X#Xj k f n t t : < 4 r c t A g c X k X j g k k t h j y t g y y t : t m t S y y . j c o A j h j x t l OX#Xx l Z M.L t h u j X x &X%XJ %X-Xy.t.9X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! / / V.I.I.^.T.Y.E.U.Y.R.Y.R.R.Y.Y.U.Y.",
+"/././././.^.[./././.^.^./.!..XI.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.sXgXbX2X7.=.=.y.D y V 9XV a c 9.c s v 7.%Xn z u.%Xt l yXc n x m } V o V } V X 5 M.5 X 5 M.5 o 8XlX*Xi M s qX-Xt 5 UXMX> A e.tXt S e.pXi M t 7.tXy t 7.yXy t 8.yXy t 8.yXx m 9.tXc x m 9.yXH t e.yXH i :XhXi V ] mX_ m n 8XLXH N 1XbXuXLX,X:XbX..1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! / ` V.J.Q.^.^.Y.Y.Y.Y.Y.R.R.U.Y.Y.Y.Y.",
+"~././.~.(./././././.^./..X]..XI.Q I _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.y.3.vX6Xu.*.*.4.D r * ] P m +Xz c s f q.c . l yXv a l z c n x * O.P r * O.P t < 6.w X > 6.w o 8X:X8Xi M y qX-Xr 4 9Xr.< y q.v t t w.pXi S j 9.tXs a 9.tXk t 9.tXA t 9.tXy s z aXi k N z v y m z yXr +X8X:XOXV P ^ P x . *XLXK m =X:X-XMX%XcXeXX.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ~ ~ N.C.Q.T.T.R.Y.Y.T.Y.R.Y.Y.Y.Y.R.R.",
+"/./.~././.~./././././././.!..XQ.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.u.;.3.dX<.#.#.4.D . = $ X l J H H l c s S l t y S l G H H l g # $ # h : $ # k > > 4 f : > 5 j l h l h l g n j f g o o : j m S S g t y t j h s t f f t t g h t m g h y y g c D n . g c G H c l D m S l l l l k e e 5 t f t k X N =X>XkXMX&X=X} [ 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ` ` V.J.Q.E.!.E.Y.Y.R.E.Y.R.Y.Y.Y.U.Y.",
+"^././.^./.(./.!.!./.(.^.^./..XI.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.1.fX3.*.#.#.4.D t r # . l m y t h : X X f t n X g g t # g j t a X g g k t h a s o f n X o g n 4 o X h . X o g h n 4 h h 4 # g h 4 4 : j h : . X : t t t h s t j f . 5 g g o o X j M y t t c t y g l n y : x k y t : x k y t N 1XcX%XB S >X} ..1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ~ ^ V.C.Q.!.T.R.R.R.R.T.R.T.R.R.Y.Y.R.",
+"/.^./././.^././././.^.^././..XQ.Q Q _ >.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.4.6X7.=.#.#.<.D t i 9Xd M c v c s ; r.h X V MXK X B 9XK 4 x m } * X m qX-X. 5 M.5 X $ d x t 5 M.5 u M $ N x t d ] ( X < @.C . p ;X] r S > @.C : # &X9X: t 9.9.y y $X] $ n j K j k D c 9.y N v tXk J c tXy D c 9.i l G c tXk D gXhXuX:X=X9X .[ 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ~ ~ V.J.Q.!.T.T.Y.T.Y.T.R.Y.Y.Y.R.R.R.",
+"^././.^././.!././.^.^.^.!.^.!.Q.Q ~ _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.t.5XbXsX4.=.t.D t OX-X^ a H yX@Xn - p.S t * ] P g * ] P n c * O.P X A qX*Xa < 6.w . j x V t < 6.w r A t A V : * O.O.# > +.J t p ;X0X# A , +.J k $ _ O.$ j 9.pXA t 8XqX5 : C C o x H c yXy M z z y m @Xz u D c aXc k D c z u D 4.=.t.bX} [ ..[ 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.w ^ ~ B.C.Q.(.!.T.R.E.T.R.Y.Y.Y.R.Y.E.Y.",
+"/././././././.!./.!././.!.]..XQ.Q ~ _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.t.%.fXsX1XxXfX=XN j p i y . r y r a O o o g o = o t o $ o t j X $ X t r u r a o > r # X u X . o > o t n o u X . X X t t X O r : X p y t m X O o X t = $ o X u y X t p y t . O o o h m i x A m F F x . y F x M x y r t m F F x D <.4.1X} { | | | 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I ~ ~ N.C.Q.~.T.T.T.R.R.R.Y.R.Y.T.T.Y.R.",
+"!./.!./.!./.!.]././.!.!.].!..XI.Q W _ 5.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.y.*.*.*.<.bXbX,XN t 4 m j f n m B f M s M f M M m f n S M u . m m M n n B n f m H l f M m M h k m m n r l M M h j A S t k M l h k B B n t h M M h f x M k f M M k j M n j h M M M g g B m n g m M j f m m m g n m m m t B B B D gX<X} [ | | | | 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.Z ~ ~ Z.C.Q.~.T.T.T.T.R.T.T.R.R.Y.T.T.T.",
+"^.^./.!./.!.~.!.~.!..X/.!.].~.Q.Q Q _ 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.t.*.#.#.*.y.3X,X%Xn %X%X%XS a t j h u a 4 l k y t l k y a j j o o o H y o o h > > 4 h g m t h h t # X l n j o t S y t j > 5 N h g n u r h y j u r : X > f j : # : g : X . f g j X j l , , , l < , , l , < , l , < , , l ; , , D ,X} [ | | | | [ 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ~ ^ N.C.Q.!.!.T.T.R.T.R.T.T.T.T.T.Y.R.",
+"^././.!././.].!.!./.].!.].!..XI.Q ^ _ 5.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.y.*.*.*.=.y.3X,X,XF >XbXxXD v 0.@Xa i &XV j H 9.%XM F v @Xm x O     $Xu     X n UXr.X k v v a n ] ( r M 5 M.5 X H c tXs 5 NXNX: $ ] F p M $ ] F u $ P _ : > @.C X > @.K . a K qX: t C ; < , C < ; , B < < , C < ; ; < M , < < N }  .| | | | | | 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 ^ ^ V.C.Q.!..XT.T.T.R.T.Y.R.T.R.T.T.T.",
+"/././././.!./.!./.!.].!.!.]..XI.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.&.fXfXfXvX1X,X<Xx -XbX<XD f w.%X. p 4X] # l e.c t F 9.v X x O     $Xu     o N MXr.> F v tXa * o.P u S > 6.w # $Xb v t B NXK o $ ] ] h c $ O._ k $ s p.4 > +.C k > +.J f # ^ O.# f 4 a X n n a B t t t t y X V ( d P * a a t V [ | [ | | | | | 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I ~ ^ N.C.Q.(.!.T.T.T.T.R.R.T.T.T.T.T.T.",
+"/.^./.^.!./.!.].!.].!.].!.]..XI.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.t.&.gXgXgXgXsXzX<XA =XbX<XD H k j h u y j l G H H x H m H l g o O o H t o o g g o > h H k H l . $ $ X k > < 5 g S G G c n s 4 4 $ = $ a h j = $ g t t < > h o : g f o > r X = * t u K N   K N X n J kX  H jXy * $ _ B = 8XbXA B | | | | | | | | 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.w ~ ~ ) C.Q.^..XT.T.T.R.T.T.R.Y.T.T.T.T.",
+"^././.!.].!.!.!.].!.].!.!.!.!.I.Q ^ _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.gX<.*.*.*.#.=.y.3XA -XbXvXD n y t h k m t l k t t f : t t h g a n o n j n # f g a # h g X o f h a n X f t X o h o o o g z , , , , , , > j f k m f f : a g h : a g r : B k z < @.> o &XkXo K N y . %X&X  *XLXc d * r.N = *XLX&X( | | | | | | | | 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.Z Q ~ V.C.Q.~.!.!.T.T.T.T.E.T.T.T.T.T.T.",
+"/./././.].!.].].!.].].!.].!.!.I.Q ^ _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zX5.#.#.#.#.*.4.3Xc =XvX,XG F v c m l v c B F v c n x %XD 4 x n M.$ X B ] V o d ] ( X $ d y : s ] ( r M $ d y . A O   o , - - - - - +.< N n $XJ a > @.C . > @.C X t S.UXB ` e e w d d ( * V * V ^ V ( d H G c ] ( J n P ( V ( [ | | | | | | | | 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I I Q N.C.I.^.!.T.T.T.T.T.Y.R.R.T.T.T.T.",
+"^./.^./.^.^./.^.^..X/.!.!./..XQ.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.u.*.#.#.#.#.=.4.1XA <XbX1XJ x z x M c 9.v B c z c 4 A %Xj # x < 6.w X * o.P X * o.P . j A V t * o.O.u M t x V a G O   o , - - - +.+.+.< m t %Xm . > +.J k > +.r.h 4 NXr.$ { X.X.X.| ] { X.X.X.X.X.[ X.X.X.....| O.O.O.O.{ { X. .| | | |  . .....1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! Q ! M.C.Q.~.E.!.T.T.E.T.T.R.T.T.T.T.T.",
+"/.^././././.[.[./.!.!./.!.!.!.I.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.gX<.=.*.=.*.=.y.*Xm %X*X&Xc H $XH l A y S k H $XH l : M t g t > > 5 j a $ $ g . $ $ k g y # h : $ $ X l g j $ j X O o r , , , , , , , > m j n k g : > X g : O o t B ( ( / X.X. .| o.P X.[ | | | | | [ |  . . . .X.X. .X.X. ... .| | | | |  . .X.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 ~ ^ N.C.Q.!.^.T.T.E.T.T.R.Y.Y.T.R.T.T.",
+"^./.!.^.!./././.^././.!.!.!..XI.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.xXzXv v v v z c B n n t X f > > : f c +X+Xh M a a f : o o h j s a # f g n . f n a o l > > . g g t . t k : o X f j # . g h 5 B n i OX+Xk j f n j g f y a : c &X&XN K } {  .| | | { o.]  . . .| | | | | | | | ..| | | | | | |  .| | | | | | | ....1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 ^ W ) C.I.Q.^.T.T.T.T.R.R.R.Y.T.T.T.T.",
+"/.^./.^./././.!././.!./.!./..XQ.Q Q _ >.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zX,X@X9.x c pXx n c c v x # @.J p 4 8XmX$Xm c v c a 4 B N 4 l s ] d X B ] d X 5 _ $ X : UXr.o s ] ( O N O     o $ B y g 4 MXNX4 OXlXgXi M j $XJ n r $X;Xr $XqX} } ] }  .| | [ ..9X*X=X..[  .| | | | | | | | | | | | | | | | | | | | | | | | ....1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ^ ^ ) Z.W.E.!.^.T.T.T.R.R.Y.Y.E.T.T.T.",
+"(.^./././././.^.!./.!.!.!./.!.J.Q Q _ :.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.vX,Xl e.i b 0.x B c c z x t r.NXz a 8X:X8XM c 9.v a n C B . c * o.P o * o.P X < 6.w X N NXr.> * o.P o M O     o a A V t B UXK > OX:X8XOXM j &Xm X f :X;X$ _ [ [ [ | | |  .{ 0X-X#XhXhX-XqX..[ | [ [ [ | | | | | | | | | | | | | | | | | | | | | 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ~ W ) C.Q.~.T.T.T.R.R.Y.R.Y.U.R.R.R.T.",
+"[./.^.^./.!./.^./.!./.!.!.!..XQ.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zX*XH A S A k S k j H $XH m < B > k b b p c H A H l > o > j j # * $ k # * $ t > , 4 t t # o : . & $ t m o O O g : t $ : j a : : c u b k k j j y . X p F ]  ...| | [ [ | { 0XbX>X=X5.;.iXbX4XqX| { 0XqX..[ | | | | | | | | | | ..| | | | | |  .| 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 ~ W ) C.C.T.^.E.T.R.E.Y.Y.Y.Y.R.E.T.Y.",
+"/.[.^././.^.^.^.!./.!.!.!.!..XQ.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zXN G %XG %XG %Xl : 5 , , l s r a f e _ ` k k a a f g g . f j t t X f g X o f M a a h M k s f g . X . l : n n j f n j h j a # g f . . . k f g : s $X&X..{ { | | [ } ] { 0XvX<X%X%X9.9.&X-X1XcX-XqXbXcX} [ | | | | | | | | [ { | [ | | | | | | | 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ~ W M.Z.Q.~.!.T.T.Y.Y.U.Y.R.Y.Y.R.R.Y.",
+"/./././.^././.!././.!.!./.!.~.I.Q Q _ ,.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.J h b ,XbXbXbX1XD l ; +.+.B c w.$XB / mXfX( c 9.c n O u c n x > e.; a $ m y j H c @Xm F v v j $ s f r M a ] ( o y *XK . u $X] X > @.C o A y @X%X+XLX..[ | [ | ..o.V 0XqX1X<X%XB , n C > D eX0XbX4X-X>X}  .| | | [ { [ [ { eXqXqX} [ | | | | | | 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 Q W N.Z.J.I.!.E.R.Y.Y.R.L.R.Y.Y.Y.R.Y.",
+"!./.!./.!./.^.^.^.^.!.^.!.^.^.I.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1., r.5 -XvX1X1X,XN k +.+.+.B l i.v a P ] O.V b 0.v n t A c n x < r.e.. k A V j F 9.tXX F z v t k x V u c * o.O.X y +X$Xn p ;X0Xa ; @.J i M f :XL L ..[ | | | | X.] N *X*X*XG B 5 r.LXkXr.D ..[ [ } qX,X..| [ | [ 0XqXqXqXqXzX5.7.-X} | | | | | | 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.Y Q Q T C.I.I.T.T.R.U.R.U.U.L.Y.Y.U.U.U.",
+"/./.^./././.^.^.^.(.^.!.!.^.^.I.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.@.L z =XbX1XvX<XN g , < , l H k H l e @ 3 l H y H k g j X h j o f o g X k $ h H k H m H F F M X k # X n $ $ $ g t k k j u i N t o o > X l t OXF P { | | | | X.{ ] %XC D J J G , &XUXi.C J -X| eXcX,X} | | | | [ 0X>X,X<X7Xt.=.=.yXeX[ | | | | | 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 Q Q M.B.W.E.!.R.Y.U.U.U.U.U.U.U.R.U.U.",
+"/.^./.!.!.!.(.^.!.^.!.^.^.~.^.Q.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.z OXx <X3X3X8.8.D j m s j f : a 4 f j y g f g a . l g n j l : t g X g j t j f : 4 4 h f a # f n a X g S k t X f f . n g h , > , f : . . t x 9Xo. .| | | | { { 0XhX3.-.%.%.;.9.B K NXkX, G bX-X1X,X} [ ..| | | | [ ....| 0XfXpXpXjX} [ | | | |  .1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I W Q N.Z.I.I.T.T.R.U.U.U.L.U.L.U.U.Y.Y.",
+"/./.^././.!.^.!.!.(.^.^.^.!.!.Q.Q ~ _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zX,X3X,XgXy.=.<.D s c v x a l w.+X# l w.@X# l 0.+X# x $XD j k f e.; X y qX$Xa x &X= X s ] V X 5 _ 4 u @Xc ] ( X s &X;Xt > ; < > B r.n o A &X..[  .| |  .} 0X0XsX%.*.#.*.#.=.e.5 z C , > G ,XbXvX} [ | | [ [ [ [ | [ |  . .......} | | | | | | | 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.Z Q W T Z.J.E.T.T.U.U.U.L.L.L.L.U.U.U.U.",
+"/.^././.!./.!./.^.^./.!.^.!.(.Q.W Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.gXzXxX8.&.yX&.<.D y z i.c t z i.%Xt z i.%X# l i.%X# H %Xj # c < q., X A wX-X. D &X&XX * o.P X < 6.w f c d o.O.o s qX4Xy H c @Xt B UXr.m &X..{ | | | | { 0X7XzX%.#.#.#.#.#.*.9.%XJ G G G %X-X} ..[ | [ } qXqXqXqX..{  .| [ [ | [ [ | | | | | | | 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 Q ~ ) B.J.E.R.R.Y.U.U.L.L.P.L.U.U.U.L.",
+"[./.!./.!././.!././././.(.(.!.Q.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.7.$.-.$.sX6Xy.3.D t t c A B t k y a t x f h g x h h . m r g n o j > # t A k 4 n N y n # & $ a : < 5 < > X * $ # o r y X $Xz v t m &X&XL ..| | | | | [ 0XcX3XgX-.#.#.#.#.#.*.aX5X3XbX} ..} X. .| | [ eX>X>X7X5.0.jXqXqX| { [ {  .[ | | | | | | ..1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! W W M.B.C.E.R.Y.U.L.G.L.L.L.L.L.L.L.L.",
+"/./././.[./././././././././.(.Q.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.=.%.sX3X3Xy.<.D a j 4 B M M n 4 B M n M f n B B b M M B l : m B B B B M n m m M m m M x B B S N B B j t t t n : @.C o D A $XH &X..} ....| | | | { 0X>X4X} jX-.#.#.#.#.*.y.vX} ..| [ | X.[ | | [ } >XbX1XzX$.#.$.-.yX4XqXqXqX9XqX..{ [ { { {  .1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! Q Q T B.J.U.Y.Y.L.L.G.D.L.D.L.G.L.L.L.",
+"/././.]././././.(././.(./././.Q.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.fXyXgX3X,X2Xy.<.D A c +Xj o r +Xk j r t r t r u o g X u r . r r r t X t o . o r b t X r o r X u u t j M x 9X;Xt j kX9.k %XG 9XeX| [ [ [ ..| | | { 0X1XqX .{ &X$.#.#.#.#.y.4X} { | | | | [ | | [ } cX>X3XvX4.#.#.*.>.zX1X>XcXu.;.q.rXqXqXqXqXMX} 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 ^ ! N.N.C.E.R.U.U.L.L.L.F.F.P.L.L.L.L.",
+"(././.].]./.)././.^././././.).Q.Q W _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.xX2X3XvX,X2Xy.3.N N S $XM K N +Xc y B K 4 4 p >X$X: x lX*X. m qX$X: x &X= X k 9X;Xg k &X= X n ] ( o m N k wX-Xt k &XL $XrX} ..{ | | | | | | | [ 0X>X4X0XqXqXvX*.=.*.=.8.4X}  .| | | | | | [ { eX,X<X1XvX<.*.#.#.*.w.2X,X1X,XdXq.gXbXbX>X1XcX>XqX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ~ Q T B.C.L.U.U.L.L.G.G.F.P.G.F.P.G.P.",
+"{.{./.]./././././.^././././.).Q.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1X7.7.3XvX2Xy.3.m S MXN X K K t 5 l D K m X $XLXNX4 c mX=Xt A wX-X. D -X&XX A qX-XX D &X&Xt * o.P o M k r c $XA 9X} } } | [ | | | | | | | | | [ qX>X<X1X,X1X4XpXq.aXaXjX} [ | | | | | [ [ { eX,X,X1XvX4.#.#.#.*.*.w.2X1X,X<X3X3X,X,X,XzXzX1X3X1X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 ~ W T B.C.U.U.U.L.G.G.D.F.F.F.G.G.G.P.",
+"{.{.)./.{././././.).).).)./.).Q.Q ^ _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.,X6.<.3X<X1XsXdXN X S X j : X t k j : : r j y x k j g c h : y A k g B B k g j A k g n B y : $ d m u N M N ] eX} | [ | | | | | | | | | | | | | | ..} } ......} } ..} } ..[ | | [  .{ { { eXqXgX5.aX2X4.#.#.#.4.yX*.0.2X1XvXbX,X,X1X2X7.%.$.0.xXt.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 Q Q ) B.D.U.U.U.L.P.D.P.G.F.G.F.P.G.P.",
+"_.].).].{./././.).(./.).).).{.Q.^ ^ _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.vXsXfX3X1X,X3X,XN a # . l t . : l : 4 n 4 h j . : l : x c c : 4 : f : X : l j # : f S G G G S 9X} ] } ^ _ | | | | | | | | | | | | | | | | | | | [ [ { X.| | | [ X. . .X.| [ [ { eXqXwXqX,Xt.$.=.q.3X%.#.#.*.7.,Xt.gX1X8.%.q.2X,XzX2XiX$.*.#.5.q.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I W Q T a.K.L.L.Y.L.G.G.D.F.F.F.F.G.F.F.",
+"{.{./.].]././.]./.]./._.).).{.Q.Q ^ _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zXxX,XvXvXvX,X<Xm c lX+X: p <XF n k m N 4 . M %Xy X B D @XS > K C o , K , 4 x &X= # *XbX>XqX} | [ ZXZXo.] ..| | | | | | | | | | |  .[ [ [ { { [ { { { X.{ { { { { { { { { eXqXqXgX5.tX2XzX%.#.*.q.2X&.*.#.#.*.=.0.5X1X3.=.u.5X7.%.w.1X<.#.*.7.5X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.` W Q T a.C.P.L.L.G.F.D.F.F.F.v.F.G.F.F.",
+"/.{./._._./.{.(.{.).{.{.).).{.Q.Q ^ _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.w.%.%.%.%.%.7.<Xm $XmX*XX G LXNXn x D K m . m LX: o N jXK X K r.r.X , K C > G &XL # v xXqX..[ | X.ZXeX{ ..| | ..| | | | [ [ [ { { { 0XqXwXqXwX9XqX9X9XMX9XwX9XqXwXqXwX9XqXgX<.%.-.4.xX1XzX$.*.*.q.2X%.=.*.=.<.q.gX1X1XiXq.gX2X3.*.#.$.#.*.&.sX1X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.Z ^ W T B.C.L.L.L.G.G.D.F.v.v.F.F.F.F.P.",
+"{./.{./././.].]./.{.{./.{.].{.Q.^ Q _ 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.t.*.*.=.*.*.*.7.D r c k j t +Xy h j # X r j : A . j t D . j > > > g > p u : n B k : @X-X..| | | [ ZXZX{ ..[ X.X.....{ { 0XwXwX9X9XqXdX5.dX5XxX1.%.1.1.%.1.dX1X7X>X5.$.2.%.-.=.*.*.q.3X3X3XyX#.*.0.zXy.q.q.q.vX5X<X1X1X1X2X1X3X<.*.*.#.#.*.7.6X0.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 Q ^ T a.B.P.L.L.F.F.G.v.F.F.F.F.F.F.x.",
+"_.{.{././._./././._.)._./.{.{.Q.^ ` _ 5.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.$.q.q.q.&.*.<.D . . : l j . . f j . B N f : : 4 f , : > l j # : : : : : f v D D G $X} [ | | | | ZXZX{ o...X.o.( ] 9XqXdX1.1.1.%.2.$.*.$.gXgX=.#.#.*.*.t.bX,X>X1XaX7.*.*.4.yX0.#.#.%.aX2X,X%.#.#.-.q.6X2X5X1X4.;.q.2X<X,X,X1X3.%.q.%.#.&.sX3X3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I Q W T a.B.P.P.L.F.H.D.F.v.F.v.v.F.x.F.",
+"_.].)./././././.).)./.).).).{.Q.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.iXsX5X2X6XsX%.3.m B N # # N K O a k G MX4 B m J o 4 ; +.+.h < K , # y &X= # tXt.cXqX/ o. .| |  .| ZX} ] n L ] k lX#X+XxX-.=.#.#.*.*.#.#.*.dX2X0.#.#.#.*.iX3X<.%.iX2X5XaXq.vX5X2Xq.#.#.#.iX5XaX#.#.*.q.2X1XvX4.3.q.#.aX3X,X1X1XiXgX5X3.*.7.6Xu.=.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.Z Q Q T B.D.G.L.F.F.F.D.v.v.F.v.v.F.F.x.",
+")./.{./.(.{././././.)./.'./.{.Q.Q ^ _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.vX2X7.7.1X2XgXpXN D K m X S NXj n b %XLXD # S NXB 4 ; +.+.5 , K C > L -XL # pXyXqXX.O.o.X.| | X.[ Z h D a %X$Xr mX>X$XxXq.8.*.*.8.7.*.#.*.pX5XgX*.#.#.*.iXzX*.#.#.3.iX5X3X1XbX,XgX%.#.*.w.5X2XaX#.*.0.2X1Xy.=.0.3X$.7.2X,XvX<X3X1Xy.*.*.7.5XiX%.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I Q Q T a.B.P.L.P.F.F.F.v.v.v.v.F.F.x.F.",
+"{./.).{./.)./././././././././.Q.Q I _ 5.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.xX0.=.*.%.7.2X1XN . 4 t k t S r n t r c m j g S t j < , ; h > p r : B B y k <XqX..X.O.] X.[  .0XqX$Xn *X$XbXLXO @X+X$X3X2X1Xq.q.bX2X7.#.#.%.dX2X0.*.*.y.,XvX-.#.#.#.#.3.%.&.%.&.%.#.#.#.#.aX3X<X%.#.#.iX3X%.#.#.%.*.0.2X7.%.%.3.%.#.#.*.y.5X5Xt.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.9 Q Q T a.D.F.L.F.F.x.D.v.v.v.v.v.v.F.x.",
+"/.{././././.)././././././.)./.Q.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zXdXq.w.$.*.0.1XN . . 4 f : # . l g # . g l g . H b t y 5 l g 5 4 b c D N -XqX..X.X.P o.{ 0XqXhX5.c n %XA D m X %X>X1XbX,XbX2X3X,X3XfX*.#.#.%.gXgX=.8.vX2XsX*.#.#.#.#.*.#.#.#.#.#.#.#.#.#.#.3.$.#.*.=.0.2X%.#.#.#.*.0.5X3.#.*.=.*.*.*.#.#.0.bX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I I Q T a.C.F.L.P.F.F.F.m.v.v.v.H.F.v.F.",
+"/./././.)./././././././././.[.Q.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.cXbX2X6Xy.*.4.1XB c lXc # x lX+Xa f M %Xu X N N c S p =XH j > K > : -XbX>X0X{ { | X.] 9XqXcXbXcXtX$Xn 4 . X M G J 5.%.3.&.&.%.%.-.%.#.#.*.*.=.iX3XaXzX2XgX<.*.*.*.*.*.*.#.#.#.#.#.*.*.#.#.#.#.#.*.<.q.gX2XaX*.#.*.3.gX2X3.*.&.q.w.q.0.$.*.#.5.q.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.Z I Q T a.B.G.G.G.x.F.D.v.v.v.x.F.x.F.F.",
+"/.)././././.)./././.!.]././.[.Q.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.vXbX,X2Xy.*.4.1Xm @XmX;X# @XmX;Xn x S LXX o _ K . 4 $XLXNXj K r.r.X *XcXqX..[ [  .o.L p #XMXkXuXnX$Xn f &X;Xv 3.=.=.*.*.#.*.t.0.0.w.y.*.t.q.q.vX,X3X3XzX%.=.4.q.w.q.q.7.#.*.*.*.#.<.0.#.#.#.*.*.<.zX5X,X<X2XaX$.*.7.2X2XaX*.7.6X2X2X2XiX$.*.y.6X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.%.1.I Q Q T a.D.P.L.F.F.F.F.v.v.v.x.x.x.F.x.",
+"/.)./././././././.!.!././.]./.Q.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.vXbXbX1XsX$.4.1XM h +Xy t h v y j t X S X g k j r j y H m j > > > . =XqX| [ | | { N uX@X+XMXMX=XcX$Xn m wX-X@Xq.0.q.4.#.#.*.gX5X2X2X,XaX<X5X2X1X1X1X1XvXq.q.vX5X2X2X3X3XaXw.w.7.=.aX2X%.#.*.<.q.gX3X,X,X,X1X1X&.*.*.&.aX5XiXfX3X1X<X,X5X<.$.fX1X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 Q Q T a.D.L.P.G.F.x.D.v.v.x.x.F.x.F.F.",
+"/./././.]./././././././././.^.Q.Q Q _ <.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.vX0.7.3X2XdXiX<XD B 4 n b B n B b : B 4 B b M M B f l n 4 l S N S J 9X| [ | |  .wX#XmX>X#X_ K ;X:X@Xl k $X$X$X5X2X6XsX=.*.*.fX3X<X3X1X2X,X,X,X,XvX<.sX1X3X2X,X,X,X,X,X,X2X2X2X2XaXgX3Xq.#.*.w.6X1X,X,X1Xy.%.%.#.3.0.*.7.5X2X1X,X,X1X1X2XiXfX2X1X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 Q I T N.B.G.G.L.F.F.D.v.x.x.x.F.F.x.F.",
+"/././.!./././.!./././././.^./.Q.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1X4.=.0.3X1X2X<XN r c c t r r r . n r r c j X b c y X y M n -XbX7XqX| | | | } 9X;Xi c c +Xc b #X>Xx 4 %X<X<XgX&.5.gX<Xq.y.*.fX3X3XgX5.3.3.3.gX3X<Xq.gX1X,X,X,X,X,X,X,X,X,X,X,X,X3X1X,X2Xq.*.$.3.iX2X,X1XaX7.#.&.gX5X%.7.5X7.&.3.3.3.3.q.5X2X7.0.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.w Q ~ T a.C.F.G.G.F.F.D.m.b.v.F.x.F.F.x.",
+"/./././.!./.!././.!./.!.^././.Q.Q ~ _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.vXiX%.3.3X2Xw.7.D B S @Xx B %Xr n y D N +Xc N K +Xc m kXn B =XcXqX| [ | | ..] c uX+XX M G G %XH J n n &X2X1X,X4.=.%.<X6XiXy.,X1XgX%.#.*.=.t.vX,X1X2X1X,X1X1X,X,X,X,X,X1XbX1X1X,X1X3X,X,X2Xq.#.=.0.2X,X1X5X2X-.0.6X7.=.7.6XaX#.*.#.#.=.y.5X0.*.#.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! Q W T a.B.P.L.G.F.F.D.x.v.v.x.x.F.x.F.",
+"/.!.!././.^.!.[.^./.!.!./.^.].I.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.zX5Xy.=.7.2XiXaXm D &XK . S LXo . b kXK 4 . K K . # $XLXD n =XqX| [ | [ [ rXu u mX>X. *XhX4.,XfX4.J j J t.gX2X,Xw.w.,XgX%.hX2X3X,X8.*.4.y.iX2X,XzX4.3.3.3.dX3X,X,X1X1X<X4.%.fX1Xy.iX2X,X,X,X%.#.#.iX2Xy.aX5Xq.7.,X%.#.#.yX2X3.#.#.#.%.sX2X<.*.$.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ~ ~ T a.D.P.L.P.F.F.F.v.z.v.x.F.F.x.F.",
+"/././.!.!./.!.!.^.!.!././..X.XI.Q Q _ 5.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.vX2XiX0.#.0.5X1XB . J . g . D o n a # . t g n . r a t G x l 9X..[ ..| [ 0XcXbX+X@Xx : $XyX=.zXgXq.$Xm 9.=.-.6.zX2X5XgX$.=.fXsX6.gX3Xq.3XsX%.gX2XgX=.#.<.y.#.sX1X,XvX1XvXq.y.q.vX*.#.iX3X1XvX%.#.*.0.6Xw.#.iX5XaX3.#.#.*.#.3.#.*.*.%.sX5X7.#.%.dX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! ~ W R a.D.L.L.P.P.F.D.v.x.b.v.x.F.F.x.",
+"!.!.!.!./.!.!.!.!.!.!.!.!./.^.I.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.0.0.2X5XiXpX3X<XN 4 . 4 l : # : l g : . : l j t : l M M x 9X..[ |  .| } 4X1XsXpXH n J c @Xe.=X1XbX$Xk J 8.@.<.gX1X1XzXw.y.%.8.0.zX1X5XzX3.=.iX2X1X7.=.dX2Xq.gX3X1X3X,X,X5X<X%.&.#.#.$.fX3X<X-.*.#.$.iX3X=.y.2X5Xq.*.*.#.#.#.%.0.0.dX6X7.=.=.8.5X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I ~ I T a.D.L.L.G.x.F.D.v.v.z.v.v.F.x.F.",
+"!./.!.!.!.!.T.^.!.!.!.!.!.!..XQ.Q Q _ 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.5.=.7.3X2X2X1X<XM t %Xn . c uX$Xn t h %Xu a t %XM 4 -XcXqX| [ |  .{ wXiXy.,X1XG N -XbXc uX;X+X=X=X+XM t ;X;X$X3X,X,X1X6XdX=.sX5X1X,XgX3.#.*.iX3X,X1Xq.gX,X2X<Xy.3.dX2X1X,X4.#.#.#.#.=.q.2X1XaXu.#.#.#.y.0.7.<.iX5XaX7.*.*.=.7.6X2X,X1XaX0.7.dX2X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 Q Q T a.B.G.L.G.P.D.D.v.v.v.v.v.F.F.x.",
+"!./.!.!.^.^.^.^.!.!.!.!.!.!.!.I.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.aX0.7.4.&.3.%.0.m F LX*Xo @XmX*Xn x c LXX o S LX-X: =XrX| | | [ [ wXdX*.$.zX1XG $X>X=X$XmX7Xv 3.t.@Xn m wX-X$X3X,X1XgX4.%.*.fX3X3X2XfX=.#.*.dX3X,X,X5X1X,X1XgX-.#.$.6.gX<X*.#.#.#.#.*.q.2X,X5X5Xw.#.*.0.6X2X-.8.5X5X5XtX7.0.fX3X3X2X,X3X3X2X5X0.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 Q Q T a.B.G.L.G.G.F.F.v.v.v.v.F.F.v.F.",
+"!.!.!.!.!.T.T.T.T.!.T.^.^.!..XQ.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.<X2X5XiXu.7.u.aXN y &Xk 4 f @Xi j t X G X 4 k G A k 9XX.[ | | [ wXdX*.*.-.zX1XG r uX$XO @Xc S 8.7.S n k $X$X$X5X3X3XdX*.#.*.sXzX4.gXbX8.*.*.iX3X,XzXy.gX,X3XgX*.*.#.=.q.5X0.#.#.#.#.=.q.5X,X8.iX3X%.*.$.iX5Xq.$.6.aX2X2X2X2X2X1X7.q.3X,XbX3Xw.*.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 Q Q T a.D.G.G.G.F.F.D.v.v.v.z.v.v.F.D.",
+"!.!.!.T.T.^.T.T.T.^.^.T..XT.^.I.Q Q _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.<X1X1X5X2X2X2X,XN n i s l : # x b : n n n B n n l 9X..[ | | { 9X1XsX7.7.q.1XbXG x mX>Xa # X 4 D $Xn B J <.&.%.3.4.vXdX*.#.*.dX,X0.zX1X1X0.0.zX3X3XsX=.aX5XvX5.<.y.*.#.%.gX,X-.#.#.#.2.gX1X8.=.0.6XyX8.*.*.iX5X3.*.#.aX2X,X1X7.%.=.y.5X,XvX3X<.*.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I ~ I T a.D.G.P.D.P.F.D.v.v.v.v.v.F.F.x.",
+"!.^.E.!.T.T..XT.T.T.T.^.T.T.^.I.Q Q _ :.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.,Xq.5.0.2X3X,X<XS 8XlX+Xj D B @XH k m k k A m c qX| [ ..| [ wXcX,X3X6X2X3X<X-XH r @Xx : y &X$Xc u.v %X%.#.4.7.>.=.gXfX=.#.#.3.zX3X1X>X1X2X6XgXy.gXgX=.&.gX,Xw.zX2X7.#.*.q.5X7.#.#.<.xX5XzX$.*.$.iX5X3XyXu.fX1X%.#.#.-.tX2X1XyXu.7.dX1XxX,X3X4.*.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I ~ Q T a.B.G.L.P.F.F.F.v.v.v.x.x.F.v.F.",
+"T.!.T..XT.T.T..XT.T.T.T.^.T..XI.~ Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.eX4.*.#.5.w.3X1XH 8XlXOX. M.K t M k <X*Xh *Xx +X0XX.| | [ } vX,X3XiXu.<X1XJ N D S N N M s wX-Xz =.J 9.=.*.gX6X,Xq.bXdX=.#.*.=.fX3XbX3XbXgX4.%.=.dXvX=.=.iX2X5X3XbXxX*.*.*.sX5Xw.=.yXbX1XbX$.*.=.#.iX3X5X5X2X8.=.*.*.*.*.iX3X5X5X5XbX>X1XbX5X4.=.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.V Q Q T a.D.D.P.L.F.F.D.v.v.x.v.F.F.F.m.",
+"E.T.T.T.T..XT.T.T.!.T.^.T.^..XI.Q ^ _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.} t.=.#.#.#.>.q.A OXb OXk y X u 9XN ] 0X*Xx k 9X.. .| | | wX,X,X3X0.=.<XbXD *X5XdX<.8.G y $X$Xe.=.S H 8.7.-X<X=X>X-X-Xe.8.8.8.=X>X-X=X-X-X8.8.8.=X-X7.e.sX-X-X=X<X-Xe.8.8.=X-X<Xw.%X<X-X-Xe.8.8.8.pX<X-X<X-Xw.@.8.8.8.@.tX<X-X<X=X-X>X-X-X-X9.8.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.Z Q Q T a.c.D.P.G.H.F.F.v.v.v.v.v.v.F.v.",
+"T.T.T.T.T.T.T.T.T.T.T.^.!.T.!.J.~ Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.NXr.7.$.#.#.*.<.D 4 4 5 b N S 9X[ m o.{ } 0X+X]  ...|  .} 1X,X,X3XsXq.,XbXG 9.6.$.*.-.C ;X<X<XsXq.=XF F F x A x A F F F F F F F F A A A A F F F A x F F F A F A x x F F F F F A F A A S c $XF F F F x A x F F F F F F F A A A x x F F x c H F F :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.w W Q R a.a.P.P.G.F.v.F.v.z.v.v.v.F.H.v.",
+"T.T.T.T.T.T.T.T.T.T.T.T.T.!..XI.Q Q _ >.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.wXeXwXdX$.#.*.4.N 4 N # m =XqX| wXc &X0X0X..} ..| | | [ } ,X,X1XxX2X5X3X2XG %Xu.%.*.%.J *X1X1X3X5X3X<XsX8.<X<X,XsX4.<.<.<.<.4.4.4.gX<X<XvX$XH bX<XzX4.3.4.<.4.sX,X<X<X<X8.4.<.4.sX<X,X<X8.<.<.dX<X4X<X<X7.<.4.4.<.iX2X<X1X0.pX<X=X;X*X*X*X=X=X=X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I Q Q T a.a.F.P.P.v.F.D.v.v.z.v.v.F.v.v.",
+"T.T.T.T.T.T.T.T.T.T.T.!.T.T.!.J.~ Q _ <.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.aXq.X.wXiX-.=.<.A K K y B =X0X} %Xx x x +X&X..{ | | |  .} 1X2XvX3XfX4.4.u.G *X5XgX<.=.J &XbX7XgX4.y.3XiX=.gX3X1XvX<.=.=.*.#.#.#.=.dX3X1XbX$X$X3X3XxX0.<.*.#.=.iX3X1X,XgX*.*.#.=.yX2X1X8.#.#.=.w.6X2X3X3X0.*.#.#.=.7.6X3X3X%.7.<XO O   O O O O O 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I Q Q T a.D.F.F.F.H.m.F.v.z.x.v.v.v.H.v.",
+"T.T.R.T.T.XXE.T.XXE.T.T.T.T.T.I.I / _ 3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.5.qX{ wXtXu.tXM n n f M >X0X} x *Xk *Xx x 9X{ | | | [ ..iX7.,X2Xq.=.=.7.G *X1X3XsXq.G J u.3XaX=.=.vXiX=.gX5X3X3XvX7.7.7.4.#.#.*.dX1X,XbX%X$Xu.sX3X2X1X8.#.*.aX5XvX3XzX-.#.#.*.q.5XzX$.#.#.#.%.4.4.iX5X5Xw.#.#.#.$.4.3.3.*.8.2X=X*X=X*X*X*X;X=X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.Z I Q R a.a.F.F.G.v.v.D.x.x.z.v.v.F.v.v.",
+"T.T.T.Y.T.Y.T.T.T.R.T.T.T.T.T.J.Q ~ _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.yXaX3XqX..eXeX} V ] ( ] N } ..} c x A M F &X.. .| |  .X.wXw.*.vX5Xq.*.%.vXG *X5X2X3X2XG e.=.vXiX*.-.gXvX<.3.4.y.vX3X2X2X6XfX*.#.*.dX2X3X1X>XfX=.3.gX1X3XgX-.#.&.gX2X,X1X7.*.3.t.$.sXbX5.t.*.*.#.#.*.$.4.iX6Xq.y.*.#.$.y.y.7.dX>XO   O O O O O O 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.! Q Q T a.x.F.F.F.F.v.x.x.x.x.x.v.v.v.v.",
+"T.T.T.Y.Y.T.T.Y.T.R.R.T.T.T.T.J.Q ^ _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.,X5X>XcXqXeX0X0XD ;X( } N ] ..} c %Xx %Xi ] X.| | | { X.dX%.$.<X5Xq.=.$.bXG 9.4.7.bX5X%Xe.=.vXiX=.*.<.3XiX=.#.*.4.vX1X,XgX<.#.#.#.&.y.4.y.%XJ -.*.iX5X3XgX*.*.*.%.y.sX5XzX<.gX2X8.$.3.q.6Xq.4.*.#.#.#.#.$.iX6X5Xw.-.0.6X7XbXbXbX>X1X<XvX>X,X>XxX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.9 Q W R E a.x.F.F.F.v.D.x.x.z.v.v.m.v.v.",
+"T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.J.Q Q _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.q.q.3X,XcX3XyXq.D H &XM M xX0X} *Xk m k $XwX{ | | | { eXw.=.#.7.5Xq.=.7.3XG 9.u.$.6.7.L r.*.vXgX7.y.7.,XdX=.#.#.=.3.<X,XzX<.*.#.#.#.*.#.=.v v -.#.&.y.gX3X0.y.4.*.*.%.y.3.aX2X,X3X7.*.%.fX5X2X0.#.#.#.#.#.$.4.dX5X%.7.7XnXMXNXsXnXMXbXjXcXkXNXjX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.! Q Q T a.a.b.H.v.v.v.D.x.x.x.b.x.v.x.F.",
+"T.T.R.T.T.Y.T.T.T.T.T.T.T.R.Y.U.^ W _ :.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.<.2X,X,X5Xt.2.m &XNXM B zX0X} cXx F >XqX.. .| | | { eXq.=.*.-.,XsX0.3X2XG *X6Xq.;.=.G e.=.gX1X2X2X3X3XiX=.*.<.y.7.zX,X1X,X4.*.*.*.*.#.=.z S =.*.*.*.%.gX2X2X1X0.4.*.=.=.yX2X,X1XxX$.=.q.2X,X,X%.*.*.#.#.*.*.#.<.*.7.7XjXMXMXcXgXMXNXgX-XMXNXnX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.w W ~ R a.k.m.F.F.v.x.x.x.b.x.b.x.b.v.v.",
+"T.T.T.T.T.T.T.T.R.`._.|.oX`.(.I.^ Q _ 2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.4.5X,X3XaX*.4.M y $XA : @XwX} 0XS ] 0X....| | {  . .eXhXy.y.w.1X1X3X1XxXJ *XcXgXt.0.J J w.>X,X1X,X,XbXgXy.7.xX5X2XbX>X1X1XxX8.y.8.y.y.u.%XH 0.t.y.y.8.gXvXbXbX3XbX0.y.y.gX,XcX,X,Xw.t.fX3X,X1Xw.y.y.u.y.t.8.t.t.y.iX7XkXNXNXnX-XNXUXcXgXNXUXbX1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.` W Q R Z.Q.~.(.~.I.z.D.z.b.b.z.b.z.v.v.",
+"T.T.T.T.T.T.T.Y.(.SXDXAXFXAX`.~.Q W _ >.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.=.q.3X2Xt.=.<.D B m n D %X%X=X%Xc =XW I P ( P I U P %X#X=X=X=X=X@X@X=X=XS J =X#X=X=XJ %X=X#X=X@X=X=X#X#X=X=X=X=X@X@X=X@X=X=X=X=X#X=X=X=X@X@X=X=X=X=X#X=X#X=X@X=X@X=X=X#X=X=X%X=X#X=X=X=X@X@X=X=X=X=X#X=X=X=X=X=X=X=X#X#Xv $X:X#X+Xc :X#Xc +X>X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.! Q Q M.A.'.VXVX`.~.Y.x.b.b.z.m.z.z.x.b.",
+"T.T.T.T.T.T.T.T.BXAX6 6 2 6 AX'.Q ^ ` t.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.q.t.q.vX,XaX4.q.J =X-XgXgXvXzXzXzXc sX} | | | } | } | jXxXzXzXzXzXzXxXzXbXJ %XvXzXzXbXJ %XvXgXzXzXzXzXzXzXzXzXzXzXzXxXzXzXzXzXzXzXzXzXzXxX%Xv ,XzXzXzXzXgXzXzXzXzXzXxX>XzXzXzXzXzXzXzXzXzXzXxXzXzXzXzXzX>X=XzXzXzXzXzXzXxXxXcXxXcXcXcXxXxXxXcX>X1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.I ~ I V.BX6 % 6 1 AX~.c.x.b.x.b.b.v.z.b.",
+"T.T.T.T.T.T.T.T.SXFX6 7 2 8 KXSXQ ^ ^ p.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.%.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.%.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.:.Q ~ I V.UX8 6 6 7 AX(.x.b.b.b.b.b.b.b.b.",
+"T.T.T.T.T.Y.~.Y.CXJX6 % 7 8 GXAXR / ( Z 4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.p./ I I S.KX7 7 & 7 GX_.c.z.l.l.z.l.b.z.z.",
+"T.T.Y.T.T.T.Y..XDXHX% 6 2 6 HXDX_ I I / p.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.y.r.I Q I S.KX2 7 % 7 GX`.x.l.z.l.b.l.b.z.z.",
+"T..XT.T.T.T.Q.T.DXHX% * 7 % HXDXJ._ Q Q Z 8.3.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.Z I Q I U S.HX6 3 6 7 GXBXz.z.l.l.z.z.z.b.z.",
+"Y.T.T.T.T.T.T.T.DXHX8 % 7 % HXDXI.J./ / ` Z @.3.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.1.1.%.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.4.p.^ Q Q I U S.KX% 1 6 6 HXSXc.z.l.l.l.l.b.l.z.",
+"T.T.T.T.T.T.T.T.FXHX8 % 2 6 HXDXT.T.K.Q Q Z Z p.6.1.1.2.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.2.1.1.1.1.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.:.@.r.^ Q Q W q U NXKX2 1 1 & GXAXz.z.l.b.l.b.b.z.b.",
+"T.T.Y.T.T.T.T.T.DXHX6 % 2 6 HXDXY.T.~.Z.I ^ ~ _ p.y.<.>.2.2.:.:.:.2.2.2.2.:.:.2.2.2.:.:.:.:.2.:.>.2.:.2.>.2.2.2.:.:.2.2.:.:.>.>.>.>.>.>.>.>.:.2.,.2.:.>.:.:.2.:.2.:.,.>.:.:.2.,.2.>.:.:.:.>.2.:.:.,.:.2.:.:.:.:.2.:.:.:.1.2.:.3.:.:.2.:.:.:.:.>.,.2.:.>.:.:.:.:.:.:.:.:.2.2.>.>.5.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.<.>.>.>.>.>.>.<.4.p.' ^ Q W I 8 U T BXKX1 1 6 2 HXSXc.l.l.b.l.b.l.z.l.",
+"T.T.T.T.T.T.~.T.DXHX% 7 7 7 HXAX.XY.R.R._ Q Q Q / / Q Q I I W W Q I ! ~ Q Q Q I W Q I W Q Q Q I I Q Q I ~ ! Q ~ Q Q Q Q Q Q W W I W ! I W W W Q W W Q I Q Q I W W W Q I Q I W Q I Q Q I W Q W W W Q W Q I W Q W Q W Q I W Q ! I I W W I ! ! W W ! W W W ! W Q Q W Q W Q Q Q W Q W Q Q W ^ Q W Q W W Q W W Q W Q W Q W W Q W W W Q W W W W W ( W W ^ ^ W W ^ W W V ~ Q Q W W W Q / / Y U 3 q R T BXKX6 1 7 + HXAXx.b.l.l.b.l.l.b.l.",
+"T.T.T.T.T.T.T.T.DXHX7 % % 8 HXFXT.T.R.P.K._ Q ^ / Q Q Q Q ^ Q Q ^ Q ^ Q Q Q Q Q Q ^ ~ Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q I Q Q Q Q Q Q Q ~ ~ Q / Q / / Q Q / Q / / / / / / / Q Q ~ ( / / / Q Q ^ ^ ^ Q ~ Q Q / Q / Q Q Q / ~ Q ^ ^ ^ ^ ~ ^ ^ ^ ^ ^ Q ~ ^ ^ ^ Q W Q Q Q ~ Q Q Q Q Q Q Q Q Q W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q ^ Q Q ^ Q Q ^ Q ^ Q ^ W ^ ^ W ~ Q Q Q Q Q ~ ~ ~ Q q q q R E a.AXHX7 + 7 6 KXSXc.l.l.b.b.b.b.l.z.",
+"T.T.T.T.T.T.^.T.DXHX6 7 8 + IXKXI.!.E.!.I.I.A.Z.' ` ` W Z ~ ! ! ! W Z I Z I I I 9 ! ! Z ! Z I 9 I W W Z I 9 W Z ! Z Z W W W W W W W W W W W I I I ! I I ! ! ! ! W I Z I ` Z I 9 ! Z I W Z W ! ! I Z ! 9 I 9 I I I I I I ! 9 I W V I I Z I W W W W W W W W Q W W W W I Z V I I 9 W ! 9 I Z I W W I ! ! I W W I I ! I I I ! I ! I V I I ! I I I I ! ! I ! I I I I I 9 9 9 W ! V 8 8 q 0 U T T a.a.KXPX7 7 7 % HXBXv.l.b.l.b.b.b.l.l.",
+"T.T..XT.T.T.T.T.DXHX6 + 2 7 PXHXKXFXDXDXSXSXAXBX'.A.S.M.` Y ! Y Y w I 9 w w 9 9 9 0 0 I w w 9 I w w I w w I 9 Y 0 I Y ! 9 w ! w w ` Z w w ! ! Z Z w ` Z ` ` Z Z ` Z Z ! Z ` Z ` Z ` ` Z ` Z Z ` ` ` Z ` Z ` Z Z ` Z Z Z Z ` Z 9 ` w Y ` Z I w w w w Z Y I Z w w 9 w 0 w Y w w w 0 w 0 w 0 0 0 0 0 0 0 0 0 0 0 0 0 q 0 q 0 q 0 q U 0 q 0 0 0 0 q q q q q q q q q q q q w _ _ S.S.S.S.S.NX'.BXAXKXPXIX2 2 7 % HXAXb.b.l.b.b.b.l.l.z.",
+"T.T.T.T.^.T.^.T.DXHX6 6 7 7 PXIXPXHXHXHXHXHXHXHXKXFX'.S.Z.N.M.) ) ) ) ) ) ) ) ) ) ) ) ) ) ) N.M.) ) ) ) ) ) ) ) ) ) M.) ) ) M.N.M.) ) M.V.) M.' V.M.V.V.M.V.V.V.V.V.V.V.V.V.V.S.V.V.V.V.V.V.V.V.M.V.V.V.V.M.V.V.V.M.V.V.V.) V.N.M.V.M.) ) ' ) M.) ' ) M.M.) ) N.) ) M.T T N.N.T ) ) ) ) T T T T T E T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T R R M.S.NXBXUXUXKXKXKXKXHXKXPXPXPX7 1 % % HXCXz.l.l.l.l.l.b.l.l.",
+"T.T.^.T.T.^.T.^.SXHX% 6 6 8 5 7 7 7 7 & 7 7 7 7 & & e BXQ.C.C.C.C.C.C.C.C.C.C.C.C.C.Z.C.Z.C.C.C.Z.C.Z.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.A.A.A.C.A.A.A.A.A.A.A.S.S.'.W.A.A.A.A.S.A.A.A.A.W.A.A.A.A.A.A.A.A.A.A.A.A.A.C.A.A.C.A.C.A.A.A.C.A.A.C.C.A.C.C.C.C.C.C.C.C.C.B.Z.Z.Z.Z.Z.B.B.B.C.Z.B.Z.B.B.B.B.N.a.a.B.N.B.N.a.B.a.a.N.B.a.B.B.a.B.B.a.N.a.B.a.a.a.a.a.a.a.a.'.`.2 % 6 7 8 % % 7 1 7 7 & 7 6 1 + 8 HXDXc.l.l.l.l.l.l.l.l.",
+"T.T.^.T.T..X^.T.oXKX8 1 6 6 6 % 8 1 1 6 6 2 2 2 7 % & FX'.Q.Q.Q.Q.I.J.Q.J.Q.J.I.I.J.J.I.Q.J.Q.J.Q.J.Q.J.I.Q.J.Q.Q.Q.I.I.Q.I.I.Q.Q.Q.Q.Q.Q.Q.Q.Q.~.Q.'.Q.~.'.Q.Q.'.'.'.'.'.'.'.'.'.'.'.'.~.Q.'.'.'.'.'.'.'.'.'.'.'.Q.~.'.'.Q.Q.'.~.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.J.Q.I.J.J.I.J.J.J.J.J.J.J.J.J.J.J.J.D.J.C.D.D.C.D.D.D.D.D.B.D.D.D.D.D.D.D.B.D.D.D.C.D.B.c.D.a.F.D.a.c.B.a.c.n.`.FX+ 8 % 6 1 1 6 6 2 + 1 8 & + 8 7 + KXSXz.l.l.l.l.l.l.l.l.",
+".XT.T..X!.!.^.T.VXFX% 1 2 + 8 8 1 % 6 8 6 % 6 1 6 % % DX`.~.!.!.~.~.~.~.!.!.~.~.~.~.~.~.!.^.!.~.~.~.^./.~.!.~.~.~.~.~.~.~.~.~.~.~.~.!.~././.'.)././.).`.{.{.`.`.`.`.`.|.`.BX`.VX`.oX`.|.`.oX`.`.`.`.).).`.`.).).`.`.(. X(.`.(.(.'.).)./.'./././.~.~.^.~.~.~.!.!.~.R.T.T.E.Y.T.R.U.Y.Y.R.U.U.L.L.U.U.L.G.L.J.L.D.F.G.G.L.G.G.D.D.G.P.D.F.F.F.D.F.F.F.D.G.P.P.x.D.m.v.x.BXFX1 8 % 7 7 7 7 7 7 7 1 % 8 @ 1 7 % GXVXc.l.k.l.l.l.b.k.k.",
+"T.T.^.T.!.!.~.^.(.CX2 2 7 7 % % 8 % 7 6 % 7 7 7 & 2 7 CX{.!././.^.^././././././.(.~./.^.(.^./.^.(././.!././././.!./././.~./.~./././././.).).).)._._.).`.|.}.|.|.VX|.|.|.BXVX|.|.oX`.SXSXoXVXVX|.VXVXVX|.|.|.|._.`.`.}.}. X}.`._._._.}.).{.{.).).(./././.!././.^.^.!.!.!.^.!.T.T.T.T.T.T.T.T.Y.Y.Y.U.U.L.U.U.L.U.U.U.L.L.L.L.L.U.L.L.L.L.L.L.L.L.G.G.G.F.F.F.F.F.F.x.x.VXDX1 6 8 7 7 7 3 7 6 1 7 1 % 7 1 1 2 DX(.c.k.l.k.l.l.l.k.k.",
+"^.T.^.^.!.!./.^.^.BXAXFXGXHXHXHXHXHXHXHXHXHXHXHXGXJXAXVX)./.^.~.^.(././././././.^.(.^.^.^./.(.~.^./.^././.!.~./.!./././.^./.^.^.~./.)./.)./.(.)._._. X X|. X}.oX|.}.|.oXoX|.|.|.SXSX|.|.SX|.`.VX|.`.VX`.|.oX_.|.oX{._.}.}.{._.`._._.).{.`.).`.`.).).)./././.!.!.!.!.!.T.T.T.~.Q.T.E.R.T.I.E.U.R.Y.Y.U.I.U.U.U.U.L.L.U.L.U.L.L.L.L.L.L.L.L.L.L.L.L.G.G.F.F.P.F.F.F.x.D.`.DXFXGXJXPXHXHXHXPXHXHXHXHXHXHXGXJXAX`./.b.l.k.l.l.l.l.l.l.",
+"T.^.!.^.!.^.[./.!.~. XVXCXFXBXFXDXDXDXDXAXDXDXDXAX`.oX~.~.!.^././././././././././.~./././././.~././././././.~./.~././.!./.^./.!./././././.{._.).{.{.}.}.}.}.}.}._.|.|.oX'.W.W.W.`.VXSX|.oX}.|.|.|.|.|.|.|.|.|.VX|.).|.}._.{.{.{._.{.{.{.{.{.}.{.).)././.^.^.!.!.!.!.!.T.T.^.E.E.T.R.R.T.Y.T.Y.Y.Y.R.Y.L.U.U.L.Y.U.L.U.U.G.G.L.L.L.L.L.G.L.L.L.P.P.G.P.F.F.F.v.F.x.F.x.x.'.AXAXAXAXFXFXFXFXFXFXAXCXCXFXBXBXBX!.l.l.k.k.l.b.k.l.l.l.",
+"^.T.!.!.!.^.!././.!.].!.^.!.!./.^.^./.!.!.].!.!.!./././././././././././././.{.].]././././.].!.].^./././.].!./././././.^./././././.]./.].].].]./.{.{.{.{.{.{.|._.|.`.W.I 8 6 % 6 8 I Q.VX|.|.|. X|. X|.|.}.|.I 3 2 R `.`.).}.}.{.{.{.{.}.{.{.{.).{.]././.^.^..X.X!.!.T.^.E.^.T.T.T.R.T.R.Y.Y.T.Y.Y.Y.U.Y.L.U.Y.L.L.L.U.G.L.L.G.U.G.G.G.P.G.G.P.G.G.G.F.F.F.F.F.v.x.v.v.b.b.z.l.l.v.v.l.b.b.b.z.z.b.k.D.b.l.l.l.k.l.l.k.k.k.k.k.l.l.",
+"^.^.^.^.!./././.].]././.^.^.~.^.^.^.^./.~././././././.).]./.).).).).)././.).(././././././.!.].~.]./././.]././././.!././././.!././.].(.{.].{.(.)._.{.{.{._.}.|. X|.V.6 & 8 1 + 8 % % 8 A.|._.|. X|.|.}.|.|.}.I 3 + Y |.}.`._.).{.{.}._.(.}.}.].{.}.{./.^./.!.^.!.~.T.^.^.T.!.T.T..XY.!.Y.T.E.Y.Y.Y.Y.L.Y.L.U.L.L.L.L.L.L.L.U.G.G.U.G.H.G.G.G.G.G.F.F.F.F.F.H.v.v.x.x.b.b.z.l.z.l.b.l.b.b.b.b.z.b.b.b.b.k.l.l.l.l.l.k.k.l.k.l.l.l.l.",
+"^.^.^.^././././.!././././.^.^./././.(./././.~./././././././.)./.)././.).)././././././.)././././.!.~./././.]./.]././././.!.!./././.].]./.)./.{.)././.{.{._.}.}.|.C.3 % % + q Y 0 % 8 + q '.|.}.}.|.}.oX XoX|.Z.V.V.Z.}._.VX)._.}._._._._.}.[.(.{.~.)./././.~.[.T.T.^.E.E.E.!.!.U.Y.T.T.I.Y.R.T.Y.Y.E.Y.L.U.U.L.U.L.L.L.L.U.G.G.L.H.G.P.G.G.G.P.G.P.F.P.x.F.v.v.v.v.b.b.b.l.z.l.l.b.l.l.l.b.b.z.l.b.k.b.b.l.h.k.l.l.l.k.k.l.k.k.l.k.",
+"!.!.!././.]./././.]././.!./.!././.^./.)././././././.)./././.).).)./.).{./.{./.).).{./././.~./.]././.].]./.]./.!./.^././.[././.].]./././.{.{./._.{.{.{.{.}.}.|.).I 8 1 6 )  X X`.) + 6 3 W. XA.A.W.'.W.V.C.).Q.A.A.W.}.).W.W.W.'.'.Z.N.N.~.{.'.Z.' N.Q.).(././.(.R.' ' ' ' J.I.!.Y.XXT.R.R.T.Y.Y.U.Y.U.U.L.U.L.L.G.L.L.L.G.L.G.L.U.G.G.G.P.F.G.G.G.F.F.v.F.v.z.v.z.b.z.l.l.l.l.l.l.l.l.l.l.l.l.l.b.b.k.b.k.b.k.b.l.k.k.l.k.l.l.k.k.",
+"]././.].]././././././././././././././././././.)././././././././.).{.).].{._._./.)./.{././.]./.!././.~./.~.]././././.^./././.].]././.).)././._.)._.{.{.}._._.}.'.8 1 6 1 |. X|.}.'.Z.Q.`.{.|.1 8 + ' % % q ~.Y + 1 R }._.% + 2 ' 8 + 6 6 8 W.I 1 % + 8 J.^.!.~.a.8 % 8 1 1 1 R I.!.T.T.R.T.R.Y.Y.U.Y.L.U.L.L.L.L.P.G.G.G.P.G.P.G.G.G.G.H.H.P.G.G.F.F.F.F.F.x.v.v.b.b.l.z.l.l.l.l.l.l.k.l.l.l.l.l.k.k.b.k.k.k.k.k.l.k.k.k.k.k.k.l.l.",
+"!.]./.!./.).).)././././././././././././././.)./././././.)./.).).{.{.{.{.{.].{./.).]./././.~./././././.].].].]./.(././././././.)./.).).).).).).).(.{.{.{._.}.).C.+ % % `  X|.|.|.`.|.VX X|. X7 & 6 6 % 8 ) |.I 8 6 Y  XVX% % % 6 3 1 % % 1 1 3 + * % 6 U ~.(.' 8 1 8 + & 6 % 2 R !.R.E.T.U.Y.Y.U.Y.U.U.L.L.L.L.L.P.G.G.P.G.G.G.G.G.P.H.G.F.F.F.F.G.F.x.F.x.x.b.z.z.z.l.l.l.l.l.l.l.l.l.l.l.l.l.l.b.k.b.k.k.b.k.k.k.l.k.l.k.k.k.k.k.",
+"/./././.)./.)./.)./././././.(.^././././.)./.).).{.).{.).).).).).]./._.{.{.{.).{.).{.{.(./.]./.!.!./.~.].].~././././.)./././.{././.)././.).).).).{.{.{.{._._.{.W.8 % 6 Y |.|. XVX|. X).`._.|.1 6 6 + ' C.Q.oXI 8 8 I _.).8 6 + q Z.V.6 & 8 + N.Z.q 7 + 8 (.(.8 6 % R Q.(.T 3 8 3 Z.T.T.Y.E.Y.U.U.U.L.U.L.L.G.P.P.G.G.G.F.G.F.F.F.F.F.F.H.F.F.G.F.F.F.x.x.x.x.b.b.z.l.l.l.l.l.l.l.l.k.k.l.l.l.h.l.k.k.k.k.k.k.k.k.k.k.k.k.l.k.l.k.k.",
+"/./././.).).).).)././././././././././././._.).).)./.{.)./.{.).)._.).{.{.{.{.{.).).].).]./.]./.]./.]./.!././././././././.).)./.{.).).).).{.)._.).}.{.{.{.{._.|.J.& % 6 Y |. X}.|.`.'. XVX|.(.2 6 8 U `._.|.{.R % + Y |.{.6 2 6 ` |.`.I 6 1 U (.{.' 3 7 6 /.J.6 % 3 T ' E ' 3 % 3 E !.T.L.E.U.Y.U.U.L.U.L.L.L.L.G.G.G.H.F.F.F.F.G.F.F.G.x.F.F.F.F.F.x.F.x.x.z.l.z.b.l.l.l.l.l.l.l.l.h.l.l.k.l.k.k.k.k.k.k.k.k.k.k.l.k.k.k.k.k.k.k.k.",
+"].]./././.)./.).).).{././././.)./.).).(.).)./.).).)._./.).).).).).{.{.{.).{.{.{.{.].).)./.]./.]./././././././.(./.).).)././.{./.).).).).{.).).).{.{.}.{._.}.}.).6 6 2 6 _.|.|.}.W.3 U ' '.}.6 % % ' |._.}. XI 6 8 I }.|.% 7 6 Z.{.).R 8 6 I {./.' 6 8 % '.J.2 7 % % 8 6 % % * 1 E Y.R.R.U.Y.U.U.L.U.L.L.L.L.G.P.G.G.P.F.F.F.F.F.F.F.F.x.F.F.F.F.F.F.v.x.x.z.z.z.b.b.l.l.k.l.l.k.l.l.l.l.k.k.k.k.k.k.k.k.k.k.k.g.k.k.k.k.k.k.k.k.k.",
+"/./.).)./.{.).).).)._./.)././.)./.).).).{./._./._.{.).{./.).).{.).{.{.{.{.).{.{.{.).).).).)././.]./././././././././.).).).].).).).).).{.)._.)._.{.{.}.{.{.}.{._.I 6 % 7 ) BX|.).U 6 & 8 Z.|.6 + 7 N.`._.}. XY 1 6 Y }.|.2 7 7 N.{.}.Y 6 6 Y ).(.' 2 % * ).J.& % % ' C.B.B.Z.Z.a.D.T.T.Y.T.L.L.U.U.L.L.L.L.L.L.G.P.G.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.x.v.v.z.b.b.l.l.l.b.k.l.b.l.k.h.k.l.k.k.k.k.k.k.k.k.k.k.k.g.k.k.k.k.k.k.k.k.k.k.",
+"/.)./.).{./._./.{._.{.).).).)./.)./.).).).)./.{.]./._.).{.).)._.).{.{.}.{.).{.{.).).].).).).]././././././././././././.(.{.{.{.).).{.{.{.).)._.).{.{.{.{.{.{.]._.J.6 % % 8 U Y 8 + & @ q VX/.% % % N._.{.}.{.I 8 6 Y _.|.1 & 7 N.{.{.Y & 1 I ].(.N.+ 1 6 /.^.q + 8 U B.Z.R @ U R I.XXY.T.L.E.U.U.L.U.L.L.L.L.G.L.G.G.F.F.F.F.F.F.F.F.F.F.F.F.F.x.v.v.v.x.x.z.z.z.l.l.l.l.l.k.l.l.l.l.k.k.l.k.k.k.k.k.k.k.k.k.k.k.h.h.h.k.k.k.k.h.k.",
+"/.).].).).).{.{.{.]._.].)./.).).).).{.{.).{.{.{.)._._./.{.{./.{.{.{.{.{.).).{.].).).).].).)././././././././.]././.{./.].].{.].{.{.{.{.{._._.}.{.{.{.}.{.{.{.{.}.`.Z.+ 1 8 % @ % % 6 q W.}.{.8 % + ' `./._.|.Y 8 + Y }.`.3 % 6 ' }.).Y 6 6 I ]./.' 7 % % ).!.C.3 + 8 1 1 6 % 8 ' R.T.Y.Y.U.U.U.L.U.U.L.L.L.L.L.G.G.G.P.F.F.F.x.F.v.x.x.F.x.x.F.F.H.v.x.x.z.l.z.b.l.l.l.l.l.b.l.k.l.k.b.k.k.k.k.k.k.k.k.k.k.g.k.h.h.h.h.h.k.h.h.h.h.",
+"/./.).).).{.{.{.{._.{.).)._.{.).).).).{.{.{.(.{.).).{././._.{._._.{.].{.{.).).{.)./.).).).).)././././././.]._.].].(.{.)._.{._.{.{.{. X}.}._.}.}.}.{.{.{.{.{./.{.`.`.C.U + 3 8 8 1 Y W.`.}.].1 1 1 N. X}.{.{.Y 1 8 I |.VX1 % % N.CX XR 1 8 Y /.{.' 8 3 % /.].^.Z.U + 1 8 1 8 E Q.T.Y.R.U.R.U.U.L.U.G.U.G.L.L.G.P.G.G.F.F.F.v.F.F.F.D.F.F.F.F.F.x.v.v.v.x.z.z.l.l.l.l.l.b.k.k.k.l.l.b.k.k.k.k.k.k.k.k.k.h.k.k.g.g.h.h.h.h.h.h.h.h.h.",
+").).).).{.{.{.{.{.{.{.{.{.).{.{.{.{.{.{.).{.{.{.{._./._.{.{.{.{.(.{.{._.).{.{./.).).).).)././.)././././.(.{.{.(././.]._.{.{.{.{.{.{.}.}.}._.}.}.}.{.{.{.).).}./._.(. X`.`.W.C.A.(.`.}. X{.{.`.|.|.{.).).{.}.{._.{.|.[.[.}._.`._./.[./._.].).].!.)./.).).!.Q.[.[.Q.Q.Z.Z.J.!.R.E.U.T.R.R.R.L.U.U.U.G.G.L.L.L.L.L.G.G.H.F.F.F.F.x.x.F.F.x.x.F.x.F.v.v.v.b.z.z.l.z.l.l.l.l.l.b.k.l.k.l.b.k.k.k.k.k.k.k.k.k.k.h.h.g.g.h.h.h.g.k.k.g.g.",
+").).).).).{.{.{.{.}.}.{.}.).{.{.{.{.{.{.{.{.{.{.{.]._.{._./._./.{.{.]._.)._./.{.).)./.).).).).)././././.{./.].]./.{./.].{.(._.].{.{.{.}._. X}.}.{.}.}. X{.).).).].{./.}.`.).].{.}.].{.{.}.}.(._.}.{.).}.{.{.{.}. X`._.}.`.).}._.).{././.)./.!.{.!.[.^.~./.].E.!.!.~.!.!.T..XE.Y.R.T.T.Y.L.E.U.L.G.U.L.U.U.L.L.L.P.G.F.F.F.F.v.F.x.F.x.F.F.x.F.x.v.v.b.b.z.z.l.b.l.l.l.l.k.b.k.k.l.k.k.k.k.k.k.k.k.k.k.k.k.g.h.g.h.g.g.h.k.g.g.k.g.",
+").).).).{.).{._._._._.}.}.}.{.{.}. X{.}.{.{.{.{.{.].{.).{.].{.).(.{._.).)._.)./.{._.]./.{.)././._././././.].{.{././.].).).{.).{.`.{.}.}. X}.}.}.}.{.{.{.{.{.{. X).].).{.}.).].}./.}.{.}.{.).{./.{.{.{.{.).}.}._.). X X).{.{.{.).).).]./.)././.).].].!./.!.~.!.~.].!..X.X^.T.U.^.T.T.T.U.L.L.U.U.L.L.L.L.L.L.L.L.L.G.F.P.F.F.F.F.F.F.x.F.x.D.v.v.x.x.z.b.z.b.l.z.l.l.l.l.l.h.l.k.k.l.l.k.k.k.k.k.k.k.h.k.h.h.g.g.h.g.h.g.h.h.g.g.g.",
+").).).).).)._._.}.}.}._.}.}.{.{.{.{.{.{.}.}.{.{.{.{._.{.{.{.).)._././.).)./.).{./.).).).).].).)./.).).).).).].(.].{./.).{././._.).).{.{.}.}.}.}.}.}.{.}.{.{.).].{. X X).{.}. X{. X).{.{._._.{.{.{.).).{.{.].{.].). X X{.}.[.{.).`.).]./.].]./.!..X.X/.!.!.^.!.!..X.XXXT.T.T.T.Y.Y.T.Y.Y.R.R.L.U.L.U.L.L.L.L.L.L.P.P.P.F.F.F.v.F.F.x.F.F.F.x.v.v.x.x.z.z.b.b.z.z.l.l.l.l.l.l.l.l.k.k.k.k.k.k.k.h.h.k.k.h.h.h.g.h.g.g.g.g.g.h.g.g.g.",
+").{.{.{.{.{.}.{.`.}.|._. X X}.}.}.{.{.{.{.{.{.{.{.}.{.{.{.].).)./.{./.{./.{.]././.{.).).).].)./.)._.).).).).)./._./.).).).).].}.).).].{.).BX`. X}.{.}.|.].{.[.`.{.[.)./.]. X].}.).{.].`.).{._.).{.}.{.'.).{.{.].`.(. X.X X X X!.].)./.).]./././.!.(.!..X.X!..X~.!.!.!..XT.E.R.E.T.Y.Y.U.U.L.L.L.U.U.P.L.U.H.L.P.G.G.F.F.F.F.F.v.F.F.x.v.v.v.v.v.x.z.z.z.l.l.l.l.l.l.l.b.k.l.l.k.l.k.k.k.h.h.h.h.h.h.h.k.g.h.h.g.g.g.g.g.g.g.g.g.g.",
+").{.{.). X).`._.|. X X}.|. X{.}.}.{.{.}.{.{.{. X}.{.].{.{.{.{.{.{.).{./.{.{./.{.{./.{.).).).).)././.).)./.).).{./.)./._.).{././.)._.{.{.Z.' ' N.B.V.`.).}.).{.{.).].). X!.}.}.'.I.{.{.(._.).).).{.!.{.{.}.[.(.{.Z.' Z.{.].(.Q.Q.!.).{.!./.]./.~.B.I ) !.!.(.K.` U R N.~.T.N.E ' E ' E E C.U.D.R U U T K.G.Y.L.L.G.G.G.P.x.F.v.F.x.x.v.v.v.v.v.z.z.b.z.l.l.l.l.l.l.l.k.l.l.k.k.k.k.k.h.h.h.h.h.h.k.h.h.g.h.g.g.f.g.g.g.g.g.g.g.g.g.",
+"{.{.{.}.{.{.{.}.}. X`.}.|.}.}.}.{.{. X{.{.{.{.{.{.{.{./.].).{.].{.].].{././.).{.)./.{.].).).{./.).{.{./.).).{.{.).{.)././.).{.).).)./.).R 1 7 3 @ 3 I './.}.).`.).).(.(.{.).) 8 ' {.{.).{.{.).).].}./.]./.{. X).Y @ R  X'.R 3 C.{././.)././.'.B.8 % I ~.!.Z.3 & U 8 1 B.R.R @ @ @ 3 7 8 B.D.3 8 q q @ U L.L.L.L.G.F.F.F.F.x.x.v.v.z.v.v.v.v.v.b.z.b.b.z.l.l.l.l.l.l.k.k.k.k.k.k.k.k.k.k.h.h.h.h.h.h.g.k.h.g.g.g.f.g.g.g.g.f.g.g.g.",
+"{.{.{.}.}.}. X X X}.}.|. X}.}.{.{. X{.}.}.{.}.{.}.{.{.{.).].).)._._._.(._.).{./.{./.).).].]./.{.]./././././.(.)./././._.).].)./.)._.{.}.Y 7 7 ' / % & T {. X(.Z.' N.I.~./.J.1 6 ` J.~.J.C.Q.' J.].~.Z.' Z.'.).].Q.C.C.~.' 7 % ' Q.)./.!.!.Q.U 3 3 % Y .X.XR 3 T ~.Z.2 3 .X' E ' ) 8 & U K.E 8 8 G.J.@ @ a.m.P.F.F.H.P.F.F.x.x.x.z.z.b.b.b.b.v.v.b.b.b.l.l.l.k.k.k.k.k.k.k.k.h.k.k.k.g.h.h.h.h.j.h.k.g.h.g.g.f.g.f.f.f.f.g.g.g.f.f.",
+"{.{.}.}.}.}.}.}. X}.|.}. X|.{.{.].}.}.}.}.}.{.}.{.{._.].).).).)./.{.{.{.{./.{.{.{.).{.(.)./.{./._././._././.)./././.)././.).{.}.).].[.{.Y % 7 _. Xq % U }./.U 7 8 % 8 Z.).+ + 7 + R J.1 + U 8 ' W.q @ @ 6 8 W./.R + / C.% % % 8 ' ~.).!./.K.1 Y 0 2 U !.!.Y 8 E [.Q.6 2 K.Y.T.U.B.8 q K.Y.U.K.K.x.E % 8 D.H.P.F.F.F.F.v.x.v.x.x.z.z.b.z.b.b.b.b.b.l.l.l.k.k.k.k.k.k.k.h.k.h.h.k.h.h.k.h.h.h.g.h.g.g.h.g.g.g.g.g.f.f.f.g.f.g.f.g.g.",
+"{.}.}.}.}.|. X|.`.}.|. X X X}.{. X{.}.{.{.{.{.{.).{._.{.).).).)._.{.{.{.{.{.{.).].{.{.].{././.)./././././././././././.]./././.)./.].].{.I + 1 }.).Y % % /.N.2 8 '.N.1 3 (.N.7 & I B.W.% 8 U Z.'.Y % Y ).R & U !.R 8 I Q.T 6 8 R K./.].!.].J.C.).U 2 R !..X' % q ' T 7 8 Z.Y.T.G.U @ B.XXXXH.v.G.T 2 % T F.G.F.F.F.v.F.v.x.x.z.b.z.z.z.z.b.b.b.b.b.l.l.l.k.l.k.k.h.h.h.h.k.h.g.g.h.h.g.h.g.g.g.j.g.g.g.g.g.g.f.f.g.f.g.f.g.f.g.g.f.",
+"}.}.}.}.`.|.}.}.}.}. X}._.`.{.}.{.}.{.{.{.{.{.{.{. X).).].{.{. X{.).{.{.{.}.{.{.{.{.].]./././././././././././././././././././._.).).}. XI + % ].}.I % % }.Y % 8 I U % 8 C.'.8 % ' /.J.& % C.).'.1 + ' ].E 6 % ).U 6 I /.W.+ + C././.[.!..X^.!.~.U 8 Y !.T.Q.I 1 3 U + % Z.R.Y.' 1 U Y.Y.U.P.G.T 7 2 E F.H.G.F.D.v.v.v.x.x.x.z.x.z.b.z.l.z.l.z.z.l.z.k.l.k.k.k.k.h.h.h.h.h.g.h.g.j.h.g.h.g.g.g.g.g.g.f.g.g.f.f.f.f.f.f.f.f.f.f.f.f.",
+"}.}.|.}.|.}. X X|.|. X|. X}.}.}.].}.{.{.{.{.{.{.{.).).).].).).).).).{.}.{.}.{.{.{.{.{./.)./././.)././.].]./././././././.].]././.{./.]. XR + % (.Q.6 6 9 _.I + U N.) ' ' I./.1 6 ) /.C.8 7 J.)./.3 8 ' ~.N.% % /.U 8 R !.Z.6 + C./.!.[.^.!.^.E.^.R 1 I T.^.^.T.N.K.K.1 % I.XXT.U 1 E R.G.L.L.R @ q a.v.H.F.x.v.v.v.v.v.v.x.v.b.b.v.b.z.l.l.z.l.l.l.h.k.k.l.k.k.h.h.h.h.g.g.g.g.h.j.j.g.g.g.g.g.g.g.g.g.f.f.f.d.d.f.f.f.f.f.f.f.f.f.",
+"}.}.}.}.|._.|.|.|.}.}.|. X}.}.{. X{. X{.{.{.{. X{.{. X).). X).).).{.{.{._._. X{.{.).)./././.]./.]./.]./.].].^.[.].]./.[./././.(././.^.).U 7 % 6 % % 6 Z.`.Z.1 1 Z.' R B.~.].3 % ` A.J.+ @ C.)./.) 3 q A.q 1 T '.U % Y ~.J.% % ' W.!..X^.!.!.!.^.U @ U ~.T.' @ 3 V.` @ R !.XXU.% 8 B.P.U.R.E % 3 6 7 7 3 E F.v.F.v.x.x.v.b.v.z.b.l.z.b.l.l.l.l.l.l.k.l.k.k.k.h.h.h.g.h.g.h.g.g.g.j.j.g.g.g.g.g.g.g.g.f.f.f.f.d.f.f.f.f.f.f.f.d.d.f.",
+"}. X}.|._.}.}.}.}. X`. X|.}.}.{.{.].{.{.{.{.{.{.).{.).).).).).).{.{.{.{._._._._.{.).).)././.].].]././.]./.!././././.]./././.(././.{./.~.R 6 6 8 3 U Z.).)./.` 8 % 8 8 W. X/.) 8 @ 3 C.% % C./.].Q.U @ 3 3 Y Q.~.R 3 R ^.~.U 1 3 R ~..XT./.!./.E.R 3 R I.[.!.E 3 3 + R G.T.Y.D.@ 3 J.R.U.D.R 8 8 1 % % 3 E G.x.x.v.x.b.z.v.b.z.l.z.b.b.l.l.l.l.l.k.l.k.k.k.k.h.g.g.h.g.h.g.f.f.g.f.j.g.f.f.g.g.g.f.g.f.f.f.f.d.d.f.d.d.d.d.d.d.d.f.",
+"}.}.}.}.}.}.|.|. X}. X}._. X{.{.{.{.).{.{.).{.{. X).).).).{.{.{.{.{.{.{. X}._._.{.{._.]././.]./.~.].].~.!.]./././.[.^.[./.[./././.].].{./.'.`.(./.`. X{.).(.{.Q.J.Z.~._.{.!.^.C.K.J.[.).).^.].~.)./.Q.K.I.~.].~.~.~./.^././.C.K.J.[..XT.!.Q.T.[.T.~.~..XT.T.!.J.Z.C.R.Y.Y.U.Y.R.I.P.P.P.L.L.P.F.D.G.P.v.H.H.b.b.x.z.b.b.z.l.b.b.z.l.l.l.l.l.k.l.k.k.k.k.k.k.h.h.h.h.g.g.g.f.g.f.f.f.f.f.f.f.g.f.f.f.f.d.d.d.d.d.d.d.d.d.d.d.d.d.f.",
+"}.}.}.}.}.}.}._. X}.}._._._.{.{.).).).).{.{.{.{.).).).).{.{.{.{.{.{.{.{._.}.}._.{.{.).).)./././.].~..X]./././././././././.^.(.^./.].!.!./.).^.].{.).^./.(././.]././.).^.^.(././.^././.].^.{./.).!.].~.!.!.].!.!.(.!.!.!.!.!.!.[.!.!..X!.!.T.T.E.!.!.!.T.E.T.!.T.Y.R.R.T.U.Y.Y.Y.U.L.L.P.P.D.F.F.x.F.F.F.v.v.v.b.z.v.x.b.z.b.b.b.b.l.l.l.l.l.l.l.l.k.k.k.k.k.h.h.g.g.g.g.f.f.f.f.f.f.f.f.f.f.f.f.f.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.",
+"}.}.}.|.}.}.}.}.}.{.{.}.{.{.{.).).{.].).{.{.). X).).).).).{.{.{.{. X{.}.}._.}._.{.).).]././.]./.].!././././././.^.[././.(././.^.]./.(.[././.].]./.~._.).!./.].{./. X~.{.^./.!.!.]././.!.).].!.]./.!.[.[..X!.!./.!.!.^.^.~.E.^.!.T..X/.!.T.T.^.E.XXT..X.XT.Y.Y.E.Y.Y.G.Y.Y.Y.Y.Y.P.P.U.L.P.L.G.P.m.v.v.v.x.x.v.b.b.z.m.l.z.b.b.b.l.l.b.l.l.l.k.h.k.k.k.k.h.h.h.h.h.g.g.f.f.f.f.f.f.f.f.d.f.d.f.d.d.d.d.d.s.d.d.s.d.s.d.s.s.s.s.s.d.",
+"}.}.}.}.}.}.}.}.}.{.}.}. X{.{.{.).).{.{.{.{.).).).).`.).{.{.{.}.{.{.}.{._.}._._.{.{.).)./.)./.]./.].].~.!././.!././././.!./.^.~.].[.[.^././.[.!.].).)./. X)././.{.!././.(.!.[.!.!.^.[.^.!././.~./.^.!.!.!.!.!./.T.(.~.^.(.T.T.T.^..XT.T.!.T.~.T.T.T.T.T.T.T.E.T.U.Y.Y.U.Y.L.U.H.P.P.P.P.P.D.H.H.v.H.v.H.v.v.v.b.z.z.l.l.b.b.b.b.l.l.l.l.k.k.k.k.k.k.k.k.k.h.h.g.g.f.g.g.f.f.f.d.d.d.d.d.d.d.d.d.d.d.d.s.d.d.s.d.s.s.s.d.s.s.s.s.s.",
+"}.{.}.{.}.}.{.}.}. X X{.{.{.{.).(.{.{.).)._.).).).).). X{.{.{.{.{.{.}.{.}._._._.{.{.).)././.]./././././././.!./.!.]././././././.[./././.).^./.'.)./.{./.[./.[.!.^.(.^.^.].!./.!.!.!.(.^.(.^./.!.!.[.!..X^.^.^.^.!.!.T.!.!..XT.^.T.~.!.^.R.T.T.T.R.!.R.R.T.R.Y.U.Y.L.Y.U.L.Y.L.U.L.D.L.D.G.L.F.F.F.m.b.x.x.m.v.b.b.b.b.b.l.b.b.l.l.l.l.l.k.l.l.k.k.h.k.h.h.h.k.g.g.g.f.f.f.d.f.d.d.d.d.d.d.d.d.d.d.d.s.s.s.d.s.s.s.s.s.s.s.s.s.s.s.",
+"{.}.}.}.}.{. X}.}.}.).{.{.).{.{.{.{._.].).].).).{.).).{.{.{.{.{.}.}.{.{._.)._._.).)./.)./.)./.]./..X).~././././.!./.!./.!./.]..X!.[./.~.)././.^./.!.[./././.~./.^.(.(.^.[.[.!./.~.^.^.^.!.!.^.!.!.~.!.!.!.T.!.!..XQ.^.T.E.^.^.T.^.T.E.T.T.T.Y.!.T.T.Y.Y.R.U.U.U.Y.Y.L.G.L.L.P.G.L.L.F.F.P.x.F.F.F.F.F.b.H.z.v.z.z.b.b.b.z.z.b.l.l.l.k.l.k.l.k.k.k.k.k.k.k.k.g.g.g.g.g.f.f.f.d.d.s.d.d.s.s.s.s.s.s.d.d.s.d.s.s.s.s.s.s.s.s.s.s.s.s.",
+"{.{.{.{. X}.{. X].{.{.{.{.{.{.).).{.).).)./././.).{.).).).).{.{.{.{.{._.{.{.{.).).).)./.)./././././.!././.!././././.!././.!././.[./././.^././././././.!./.!.[.!.^.^./.!.!.^.^.!.!.!.^.!.!.~.!.!.!.!.!.!.!.!.T.^.T..XT.^.^.T.T.^.!.T.T.T.T.T.T.T.T.R.Y.Y.E.U.U.U.L.Y.L.L.L.L.L.P.L.L.F.F.F.F.F.F.F.v.v.v.z.x.x.z.z.b.b.z.z.l.l.b.l.l.l.l.l.k.k.k.k.k.h.h.h.g.g.g.g.f.f.f.f.d.f.s.d.d.s.s.s.s.d.s.s.d.s.s.s.d.s.s.s.s.s.s.s.s.s.s.s.",
+"{.{. X{.{.{.{.{.{.].).).).).{.{.{.{.).)./.)./.)./.{.).).).).).).{.].].{.{.{.{.{.)./.)./.)./.)./././././././.!.!./././././././.!.^././.[././.!.^.!./.!./.^./././.(.^.!./.!.!.^.!.!./.!.!.^.!.!.!.!.~.!..X!.^.T..X^.T.^.T.T.!.T.T.T.T.T.T.T.T.T.T.Y.R.Y.Y.U.U.U.U.U.L.L.L.L.L.G.G.P.F.F.G.F.F.F.F.F.v.v.v.x.z.z.x.z.z.b.z.b.z.l.l.l.l.l.k.l.k.k.k.k.h.k.h.g.h.g.g.g.g.f.f.f.f.s.s.s.s.s.s.s.s.s.d.s.s.s.s.d.s.s.s.s.s.s.s.s.s.s.s.s.",
+"{.{. X).{.{.].{.).{.{.).).).{.{.).).).).).)./.]./.).{.).)./.).)./.).).).{./.{.{.)./.)./././.)./././././././.!././.^./.^././.^././././.^.[.^./.!.!./.^.^.~.^./.!.!.!.!./.T.^.^.T.!.!.!.!.!.T.!.~.T.!.!.T.T.^.T.T.T.T.T.T.T.^.T.T.T.T.T.T.E.T.R.R.Y.Y.U.U.U.L.L.L.L.L.G.G.G.L.P.G.P.F.F.F.F.F.P.F.P.v.v.v.x.x.b.l.z.z.b.b.l.l.l.l.l.l.k.k.k.l.k.k.h.h.h.g.g.g.g.g.f.f.f.d.d.s.s.f.d.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.",
+").{.).).).).).).{.).].).).{.).{.).).).)./././.!./././.).)._.(.).)././.).{.{.{./.).).)./.)./.]././././././.!./.].^./.[././.^./.^.^./.^./././.!.!.^.^.^.^.^.^.!./.!.~.!.!.^.!.^.^.!.!.!.!.!.T.!.R.T.T.!.T.T.T.T.T.T.T..XT.T.T.E.T.T.T.T.Y.Y.E.Y.Y.U.U.U.U.U.U.L.L.L.L.P.G.G.G.P.F.F.P.F.F.F.F.P.x.v.v.v.v.x.b.b.m.z.l.z.z.z.l.l.z.l.k.k.k.k.k.h.k.k.h.h.h.g.g.g.f.f.f.f.f.f.s.s.f.d.s.s.s.s.s.d.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.",
+"{.).).{.).).{.)./.{.).].)./.).).)./.).)././././././.{.{./././././.{./.)././._.]._././.].].].)././.)./././././.!./..X/./.^./.^.[./.^./.^.^.^.^.^.^.!.!.!.^.!.^.!.!.!.!.!.^.!.T.^.^..X!.!.!.!.!.T.!.T.T.T.T.!.T.T.T.T.T.T.T.T.T.T.T.E.T.Y.Y.Y.Y.Y.U.U.L.L.L.L.L.P.L.G.G.P.G.P.F.G.F.F.F.F.F.H.m.v.v.v.v.v.b.b.l.b.z.z.l.l.l.l.k.k.k.k.k.k.h.k.h.h.h.h.g.g.g.f.f.f.g.f.f.d.s.s.d.s.s.s.s.s.s.s.s.d.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.",
+"{.).).).).{. X]./.).).).).).).].).)././././././.{./././.).)./././././././././././././.).).).).).)./././././.~.].[.]././././././././.!./.^.^.^.[.!.!./.!.!.^.~.!.^.T.^.^.^.T..XT.T.T.!.T.T.!.R.!.T.T.T.!.T.T.T.T.T.T.T.Y.T.E.R.R.Y.Y.E.Y.R.R.R.U.U.U.L.L.L.L.G.G.G.G.G.G.H.F.F.F.F.F.F.F.x.F.v.F.v.v.v.x.x.b.b.l.l.z.z.l.l.l.l.k.k.l.k.l.k.k.h.h.h.h.g.g.g.g.f.f.f.f.d.d.d.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.",
+").).).).).{.).).{.).{./.{.].)./.)././././././././././.(./.^./.[./././././.^.(././././.).).).].).).).].).].~./././././.].!././.!./.^./.^.!./.^.^.!.^.!.!.!.!.T.!.^.!.^.!.!.!.T.!.!.T.!.T.~.T.T.T.R.!.T.!.T.T.T.Y.T.E.R.Y.R.Y.R.Y.Y.R.U.R.U.U.U.L.U.L.L.P.G.G.G.G.G.G.F.P.F.G.v.F.F.F.F.x.F.F.x.F.H.b.m.v.b.b.b.l.l.b.b.b.l.l.k.l.k.k.k.h.k.k.h.g.h.g.g.g.g.f.f.f.d.d.d.d.s.d.d.s.s.s.s.d.s.s.d.d.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.",
+").).).).).).).).{././.{.).)./.).)././././.!./././././././././.(././.[.^././././.].]./.].).].).).).).].!.].]././.!.].].).]././.]./.!.!./.!.!.T.^.^.^.!.!.!.!.^.!.!.T.T.^.E.E.T.E.T.R.R.R.T.R.T.T.R.T.Y.T.T.T.T.T.T.XXR.Y.Y.Y.R.R.Y.Y.Y.U.Y.Y.U.U.L.L.L.L.G.G.F.F.G.F.P.F.G.F.F.F.F.x.F.x.x.F.F.x.v.v.b.b.b.b.b.b.b.l.b.b.l.l.l.l.k.k.k.k.h.h.h.h.g.g.g.f.g.g.f.d.d.s.d.s.s.s.s.s.s.s.s.s.s.s.d.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.",
+").{.).)./.).)././.)./.).).)./././.~.!././././././././././././.^./././././.^././.!.)././.].).].).].].).).)././././././.!.].)./.!.!./.!.^.!.^.^.^.!.E.!.!.T.!..XT.T.T..XT.T.~.T.T.!.R.!.T.!.R.!.T.T.R.T.Y.Y.Y.R.R.R.Y.R.Y.R.Y.Y.U.Y.L.U.L.L.Y.P.L.L.U.L.P.G.G.G.F.v.F.F.F.v.G.v.H.x.v.x.v.v.F.x.F.v.b.m.b.m.b.b.b.l.b.b.l.l.l.l.k.l.l.k.h.k.k.g.g.g.g.f.s.f.f.d.f.d.d.d.s.d.d.d.s.s.s.s.s.d.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.E s.s.",
+"{.{.{.).]./.)././.)./.)././.)./././././.!././.!./.!.^.^.^././././.!.^./.!././.!././.]./././.].].)./.).).)././.).)././.].!.!./././.!.!.^.!.^.T.^.T.^.!.!.!.T.T.T.T.T.T.T.T.T.T.T.T.R.Y.T.R.T.T.T.R.T.R.Y.Y.T.Y.Y.R.Y.Y.Y.U.U.Y.U.U.U.U.Y.U.Y.P.L.L.L.L.P.G.G.F.F.F.F.F.F.H.v.v.v.x.F.F.v.x.z.F.z.v.v.b.b.b.b.b.b.b.b.l.l.l.k.l.k.k.k.k.k.g.g.k.g.g.f.f.a.f.d.f.d.d.d.d.s.s.s.s.s.s.s.s.s.s.d.s.d.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s."
+};
diff --git a/images/scham.xpm b/images/scham.xpm
new file mode 100644 (file)
index 0000000..a8438e5
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 7 1",
+/* colors */
+"` c #000000",
+"a c #00BF00",
+"b c #3F3F3F",
+"c c #3F3FFF",
+"d c #BF7F3F",
+"e c #585858",
+"f c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff``",
+"`f`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`e`",
+"`ff`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ee`",
+"`fff```````````````````````````````````````````````````````````eee`",
+"`fff`dddddddddddd`dd`cddddccccdddddddd`d`ddddddd`ddddddddddddd`eee`",
+"`fff`dddddddddddd`dddcddddccccddd`ddd`dd`ddddd`d`ddddddddddddd`eee`",
+"`fff`dddaaaaddddd`dd`c`ddd`ccdd`dd`bbb`ddddddd`d`ddddddddddddd`eee`",
+"`fff`daaaaaaddddd`dddccddddcc`ddd`cbbbdddddddddd`dd`dd`ddddddd`eee`",
+"`fff`daaaadd`dd```dddccd`ddccddd`ccccbbd````d`````````bbd`dddd`eee`",
+"`fff`daaaaddddd`b`d`ddccdddcc`dbbcccc``d`bbbbbbbbbbbbbbbdddddd`eee`",
+"`fff`daaaaddddd`b`dddd`ccd`ccb`bbcc``````b```bbbbbbb`````ddddd`eee`",
+"`fff`ddaaadd`ddbb`ddd`b`ccccbbbbbcc``````b````bb`````````ddddd`eee`",
+"`fff`ddaad`ddd`b````ddbb`cccbbbb`cc`b````bb```bb````````dddccc`eee`",
+"`fff`dddddd`````b`ddd`bbb`cccbbb`cc```````b`bbb````````dddccc``eee`",
+"`fff`ddddd`b````bb```ccccccccbbbcccccccbbbbb`bbddddddcccccbb`d`eee`",
+"`fff``dd```b````b`bccccccccccbb`ccccccccbbbbbbccccccccc`d`bbdd`eee`",
+"`fff`````````````bbccbbccccccbbbcccccccccccccccccbbd`d`d`d`ddd`eee`",
+"`fff`ddd```````ccccc`bb``bbcccbbcccccccbbbbbbbbbbbbddddddddadd`eee`",
+"`fff`dddddcccccccccbbbbbbbbbccccccccbbbbb````````b`dddaaaadadd`eee`",
+"`fff`dd`d`d`d`d`dd```b`bb``bbcccccccbbbbbbbbbbbbbb`d`dddaaaadd`eee`",
+"`fff`ddd`dddddddd``````````bbbcccccc`b````bb````bb`d`dd`dddadd`eee`",
+"`fff`ddaddddd``````````````bbbbcccccc```````bbbbbb`d`ddddddadd`eee`",
+"`fff`daaaaadd`bbb``````bbbbbbb`cccccc`````bbbb`bbb`d`dd```dddd`eee`",
+"`fff`daaadd```b`bbb````bbb```b``cccccc````b````bbb`d`ddddddddd`eee`",
+"`fff`daaddddd`b`bbbbb``b`````bb`ccccccbb``b`````bbb``dddd`dddd`eee`",
+"`fff`daaddbbb`b`bbb````b````bbb`ccccccbb``bbb```bbbb`d`ddddddd`eee`",
+"`fff`ddd`bbbbbbbbbb````b````bbbbccccccbb``bbb```bb`b```````ddd`eee`",
+"`fff`d``bbbbbbbbbb````bb`````bbcccccccbbb``bb```bb`bbddddddddd`eee`",
+"`fff``````````````````b``````bbcccccccbbb``bb```bb`bbdddaddddd`eee`",
+"`fff``dd`b`````````````bbbb``bbcccccccb`b```b``bbb`b``dddadddd`eee`",
+"`fff`ddd``````````````bbbbbbbb`cccccccbbb````b``bb`b`dddaaaa`d`eee`",
+"`fff`ddd`dddddd`bbbbb`bbbbbb``cccccccbb``````b``bbbbbddaaaaadd`eee`",
+"`fff`ddd`dddddd`bb```````````c`cccccbb```````b`bbb`bbddaaadadd`eee`",
+"`fff`ddd`ddd````````````bbbbbccccccbb````````b```b`bb```daaadd`eee`",
+"`fff`ddd`ddddddddd`bbbb`bbbbbcccccbbb````bb``b```b`bbddddaaddd`eee`",
+"`fff`ddd`dddddddddbbbbbbbbbbbccccc````b``bb``b```b`bbddddaa`dd`eee`",
+"`fff`ddd``dddddaad`bbb``bbbbcccccc````b``b```b```b`bb````ddddd`eee`",
+"`fff`ddd`d`ddddaaa`bb`b```b`cc`ccc````bb`b```bbb`bbbbbbdd`dddd`eee`",
+"`fff`ddd`dd`dddaaa`bbbbbbbb`cc`cc`bb``bbb``````````````ddddddd`eee`",
+"`fff`dad`ddd`ddaaa`bbbb`bb`cc`cc`bbb``b`````````````dd`ddddadd`eee`",
+"`fff`add`dddd`dddd`bbbb`bbbcb`ccbbbb``bb`bbb````bbaadd`daaaadd`eee`",
+"`fff`add`dd`````````bb````cc``ccbbbb`bbbbbb``bbbbaaa`d`````ddd`eee`",
+"`fff`dddddddddd`bbbbbb````cdd`c`bbbb`b`bbbb```bbbaabaaaaaad``d`eee`",
+"`fff`ddddddddddd`bbb```````dd`b`bbbbbb`bb`````baabaaaaaddaddd``eee`",
+"`fff`cccddd`ddd````b```dddddd`bbb```bbbbbbbbbbbaaaaaaaaadaaadd`eee`",
+"`fff`ccccdddd`````bb````````d`bbb```bbbb`````b``bbb``aaaaddadd`eee`",
+"`fff`cccccccccccccbb`cccccccc`bcccccccccccc``bbb``````aaaadadd`eee`",
+"`fff`ccccccccccccccccccccccccccccccccccccccccccccccddddaaaaddd`eee`",
+"`fff`cccccccccccccccccccccccccccccccccccccbccccccccccddddadddd`eee`",
+"`fff``b`d`b`d`d`ddcccc`ccccbb`bbbbbbbbbbbbbbbbbcccccccdddddddd`eee`",
+"`fff`bbddd`dddddddddd```bbdddddddddddddddddddddddccccccddddddd`eee`",
+"`fff```````````````````````````````````````````````````````````eee`",
+"`ff`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`ee`",
+"`f`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`e`",
+"``eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/schamhi.xpm b/images/schamhi.xpm
new file mode 100644 (file)
index 0000000..045e2db
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 7 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #FFBF7F",
+"c c #00FF00",
+"d c #585858",
+"e c #7F7FFF",
+"f c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd``",
+"`d`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`f`",
+"`dd`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`ff`",
+"`ddd```````````````````````````````````````````````````````````fff`",
+"`ddd`bbbbbbbbbbbb`bb`ebbbbeeeebbbbbbbb`b`bbbbbbb`bbbbbbbbbbbbb`fff`",
+"`ddd`bbbbbbbbbbbb`bbbebbbbeeeebbb`bbb`bb`bbbbb`b`bbbbbbbbbbbbb`fff`",
+"`ddd`bbbccccbbbbb`bb`e`bbb`eebb`bb`aaa`bbbbbbb`b`bbbbbbbbbbbbb`fff`",
+"`ddd`bccccccbbbbb`bbbeebbbbee`bbb`eaaabbbbbbbbbb`bb`bb`bbbbbbb`fff`",
+"`ddd`bccccbb`bb```bbbeeb`bbeebbb`eeeeaab````b`````````aab`bbbb`fff`",
+"`ddd`bccccbbbbb`a`b`bbeebbbee`baaeeee``b`aaaaaaaaaaaaaaabbbbbb`fff`",
+"`ddd`bccccbbbbb`a`bbbb`eeb`eea`aaee``````a```aaaaaaa`````bbbbb`fff`",
+"`ddd`bbcccbb`bbaa`bbb`a`eeeeaaaaaee``````a````aa`````````bbbbb`fff`",
+"`ddd`bbccb`bbb`a````bbaa`eeeaaaa`ee`a````aa```aa````````bbbeee`fff`",
+"`ddd`bbbbbb`````a`bbb`aaa`eeeaaa`ee```````a`aaa````````bbbeee``fff`",
+"`ddd`bbbbb`a````aa```eeeeeeeeaaaeeeeeeeaaaaa`aabbbbbbeeeeeaa`b`fff`",
+"`ddd``bb```a````a`aeeeeeeeeeeaa`eeeeeeeeaaaaaaeeeeeeeee`b`aabb`fff`",
+"`ddd`````````````aaeeaaeeeeeeaaaeeeeeeeeeeeeeeeeeaab`b`b`b`bbb`fff`",
+"`ddd`bbb```````eeeee`aa``aaeeeaaeeeeeeeaaaaaaaaaaaabbbbbbbbcbb`fff`",
+"`ddd`bbbbbeeeeeeeeeaaaaaaaaaeeeeeeeeaaaaa````````a`bbbccccbcbb`fff`",
+"`ddd`bb`b`b`b`b`bb```a`aa``aaeeeeeeeaaaaaaaaaaaaaa`b`bbbccccbb`fff`",
+"`ddd`bbb`bbbbbbbb``````````aaaeeeeee`a````aa````aa`b`bb`bbbcbb`fff`",
+"`ddd`bbcbbbbb``````````````aaaaeeeeee```````aaaaaa`b`bbbbbbcbb`fff`",
+"`ddd`bcccccbb`aaa``````aaaaaaa`eeeeee`````aaaa`aaa`b`bb```bbbb`fff`",
+"`ddd`bcccbb```a`aaa````aaa```a``eeeeee````a````aaa`b`bbbbbbbbb`fff`",
+"`ddd`bccbbbbb`a`aaaaa``a`````aa`eeeeeeaa``a`````aaa``bbbb`bbbb`fff`",
+"`ddd`bccbbaaa`a`aaa````a````aaa`eeeeeeaa``aaa```aaaa`b`bbbbbbb`fff`",
+"`ddd`bbb`aaaaaaaaaa````a````aaaaeeeeeeaa``aaa```aa`a```````bbb`fff`",
+"`ddd`b``aaaaaaaaaa````aa`````aaeeeeeeeaaa``aa```aa`aabbbbbbbbb`fff`",
+"`ddd``````````````````a``````aaeeeeeeeaaa``aa```aa`aabbbcbbbbb`fff`",
+"`ddd``bb`a`````````````aaaa``aaeeeeeeea`a```a``aaa`a``bbbcbbbb`fff`",
+"`ddd`bbb``````````````aaaaaaaa`eeeeeeeaaa````a``aa`a`bbbcccc`b`fff`",
+"`ddd`bbb`bbbbbb`aaaaa`aaaaaa``eeeeeeeaa``````a``aaaaabbcccccbb`fff`",
+"`ddd`bbb`bbbbbb`aa```````````e`eeeeeaa```````a`aaa`aabbcccbcbb`fff`",
+"`ddd`bbb`bbb````````````aaaaaeeeeeeaa````````a```a`aa```bcccbb`fff`",
+"`ddd`bbb`bbbbbbbbb`aaaa`aaaaaeeeeeaaa````aa``a```a`aabbbbccbbb`fff`",
+"`ddd`bbb`bbbbbbbbbaaaaaaaaaaaeeeee````a``aa``a```a`aabbbbcc`bb`fff`",
+"`ddd`bbb``bbbbbccb`aaa``aaaaeeeeee````a``a```a```a`aa````bbbbb`fff`",
+"`ddd`bbb`b`bbbbccc`aa`a```a`ee`eee````aa`a```aaa`aaaaaabb`bbbb`fff`",
+"`ddd`bbb`bb`bbbccc`aaaaaaaa`ee`ee`aa``aaa``````````````bbbbbbb`fff`",
+"`ddd`bcb`bbb`bbccc`aaaa`aa`ee`ee`aaa``a`````````````bb`bbbbcbb`fff`",
+"`ddd`cbb`bbbb`bbbb`aaaa`aaaea`eeaaaa``aa`aaa````aaccbb`bccccbb`fff`",
+"`ddd`cbb`bb`````````aa````ee``eeaaaa`aaaaaa``aaaaccc`b`````bbb`fff`",
+"`ddd`bbbbbbbbbb`aaaaaa````ebb`e`aaaa`a`aaaa```aaaccaccccccb``b`fff`",
+"`ddd`bbbbbbbbbbb`aaa```````bb`a`aaaaaa`aa`````accacccccbbcbbb``fff`",
+"`ddd`eeebbb`bbb````a```bbbbbb`aaa```aaaaaaaaaaacccccccccbcccbb`fff`",
+"`ddd`eeeebbbb`````aa````````b`aaa```aaaa`````a``aaa``ccccbbcbb`fff`",
+"`ddd`eeeeeeeeeeeeeaa`eeeeeeee`aeeeeeeeeeeee``aaa``````ccccbcbb`fff`",
+"`ddd`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeebbbbccccbbb`fff`",
+"`ddd`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeaeeeeeeeeeebbbbcbbbb`fff`",
+"`ddd``a`b`a`b`b`bbeeee`eeeeaa`aaaaaaaaaaaaaaaaaeeeeeeebbbbbbbb`fff`",
+"`ddd`aabbb`bbbbbbbbbb```aabbbbbbbbbbbbbbbbbbbbbbbeeeeeebbbbbbb`fff`",
+"`ddd```````````````````````````````````````````````````````````fff`",
+"`dd`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ff`",
+"`d`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`f`",
+"``fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/sclcty.xpm b/images/sclcty.xpm
new file mode 100644 (file)
index 0000000..9d2ca26
--- /dev/null
@@ -0,0 +1,69 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 5 1",
+/* colors */
+"` c #000000",
+"a c #585858",
+"b c #FFFF00",
+"c c #DFDFDF",
+"d c #0000FF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc``",
+"`c`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`a`",
+"`cc`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`aa`",
+"`ccc```````````````````````````````````````````````````````````aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`dddddddddbbbdddddddddddddddddddddddddddddddddbbbddddddddd`aaa`",
+"`ccc`dddddddddbbbdddddddddddddddddddddddddddddddddbbbddddddddd`aaa`",
+"`ccc`dddddddddbbbdddddddddddddddddddddddddddddddddbbbddddddddd`aaa`",
+"`ccc`dddddddddbbbddddddddbbbbbddddbbbbbbddddddbbbdbbbddddddddd`aaa`",
+"`ccc`dddddddddbbbdddddddbbbbbbbdddbbbbbbbddddbbbbbbbbddddddddd`aaa`",
+"`ccc`dddddddddbbbddddddbbbbdbbbbddbdddbbbdddbbbbddbbbddddddddd`aaa`",
+"`ccc`dddddddddbbbddddddbbbdddbbbdddbbbbbbdddbbbdddbbbddddddddd`aaa`",
+"`ccc`dddddddddbbbddddddbbbdddbbbdbbbbbbbbdddbbbdddbbbddddddddd`aaa`",
+"`ccc`dddddddddbbbddddddbbbdddbbbdbbbddbbbdddbbbdddbbbddddddddd`aaa`",
+"`ccc`dddddddddbbbddddddbbbbdbbbbdbbbddbbbdddbbbddbbbbddddddddd`aaa`",
+"`ccc`dddddddddbbbbbbbbddbbbbbbbddbbbbbbbbbdddbbbbbbbbddddddddd`aaa`",
+"`ccc`dddddddddbbbbbbbbdddbbbbbddddbbbddbbbddddbbbdbbbddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`dddddddddddddddbbbbbbbdbbbddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddbbbbbbbbdbbbdddddbbdddddddddddddddddddddddd`aaa`",
+"`ccc`dddddddddddddbbbbddddbddddddddbbbdddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddbbbbdddddddbbbdddbbbbbbbbbdddddbbdddddddddddd`aaa`",
+"`ccc`ddddddddddddbbbddddddddbbbdddbbbbbbdbbbdddbbddddddddddddd`aaa`",
+"`ccc`ddddddddddddbbbddddddddbbbddddbbbdddbbbdddbbddddddddddddd`aaa`",
+"`ccc`ddddddddddddbbbddddddddbbbddddbbbdddbbbbdbbdddddddddddddd`aaa`",
+"`ccc`ddddddddddddbbbddddddddbbbddddbbbddddbbbdbbdddddddddddddd`aaa`",
+"`ccc`ddddddddddddbbbbdddddddbbbddddbbbddddbbbbbddddddddddddddd`aaa`",
+"`ccc`dddddddddddddbbbbddddbdbbbddddbbbdddddbbbbddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddbbbbbbbbdbbbddddbbbbbdddbbbdddddddddddddddd`aaa`",
+"`ccc`dddddddddddddddbbbbbbddbbbdddddbbbbdddbbbdddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddbbddddddddddddddddd`aaa`",
+"`ccc`dddddddddddddddddddddddddddddddddddddbbbddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddbbbdddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc```````````````````````````````````````````````````````````aaa`",
+"`cc`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`aa`",
+"`c`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`a`",
+"``aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/sclctyhi.xpm b/images/sclctyhi.xpm
new file mode 100644 (file)
index 0000000..c5ce548
--- /dev/null
@@ -0,0 +1,69 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 5 1",
+/* colors */
+"` c #000000",
+"a c #00FFFF",
+"b c #585858",
+"c c #FFFF00",
+"d c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb``",
+"`b`bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`d`",
+"`bb`bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`dd`",
+"`bbb```````````````````````````````````````````````````````````ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaacccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaccc`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccc`aaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaccc`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccc`aaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaccc`aaaaaaacccccaaaaccccccaaaaaacccaccc`aaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaccc`aaaaaacccccccaaacccccccaaaacccccccc`aaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaccc`aaaaacccc`ccccaac```ccc`aacccc``ccc`aaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaccc`aaaaaccc``accc`aacccccc`aaccc``accc`aaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaccc`aaaaaccc`aaccc`cccccccc`aaccc`aaccc`aaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaccc`aaaaaccc`aaccc`ccc``ccc`aaccc`aaccc`aaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaccc`aaaaaccccacccc`ccc`accc`aaccc`acccc`aaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaccccccccaaccccccc``cccccccccaaacccccccc`aaaaaaaa`ddd`",
+"`bbb`aaaaaaaaacccccccc`aaccccc``aaccc``ccc`aaaccc`ccc`aaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaa````````aaa`````aaaa```aa```aaaa```a```aaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaacccccccacccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaacccccccc`ccc`aaaaccaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaacccc````c`a```aaaccc`aaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaacccc``aaaa`cccaaacccccccccaaaaaccaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaccc``aaaaaaccc`aacccccc`cccaaacc``aaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaccc`aaaaaaaccc`aaaccc```ccc`aacc`aaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaccc`aaaaaaaccc`aaaccc`aaccccacc``aaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaccc`aaaaaaaccc`aaaccc`aaaccc`cc`aaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaccccaaaaaaaccc`aaaccc`aaaccccc``aaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaccccaaaacaccc`aaaccc`aaaacccc`aaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaacccccccc`ccc`aaacccccaaaccc``aaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaacccccc``ccc`aaaacccc`aaccc`aaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaa``````aa```aaaaa````aacc``aaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccc`aaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccc``aaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa```aaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb```````````````````````````````````````````````````````````ddd`",
+"`bb`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`dd`",
+"`b`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`d`",
+"``ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/scncty.xpm b/images/scncty.xpm
new file mode 100644 (file)
index 0000000..a970286
--- /dev/null
@@ -0,0 +1,69 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 5 1",
+/* colors */
+"` c #000000",
+"a c #585858",
+"b c #FFFF00",
+"c c #DFDFDF",
+"d c #0000FF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc``",
+"`c`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`a`",
+"`cc`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`aa`",
+"`ccc```````````````````````````````````````````````````````````aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`dddddddddddbbbdddddbbdddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`dddddddddddbbbdddddbbdddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`dddddddddddbbbbddddbbdddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`dddddddddddbbbbbdddbbddddbbbbbdddbbbdddbbdddbbddddddddddd`aaa`",
+"`ccc`dddddddddddbbbbbbddbbdddbbbbbbbddbbbddbbbbddbbddddddddddd`aaa`",
+"`ccc`dddddddddddbbdbbbddbbddbbbdddbbbddbbddbbbbddbbddddddddddd`aaa`",
+"`ccc`dddddddddddbbddbbbdbbddbbbdddbbbddbbddbbbbdbbdddddddddddd`aaa`",
+"`ccc`dddddddddddbbddbbbbbbddbbbbbbbbbddbbbdbdbbdbbdddddddddddd`aaa`",
+"`ccc`dddddddddddbbdddbbbbbddbbbbbbbbbddbbbbbdbbbbbdddddddddddd`aaa`",
+"`ccc`dddddddddddbbddddbbbbddbbbdddddddddbbbbdbbbbbdddddddddddd`aaa`",
+"`ccc`dddddddddddbbdddddbbbdddbbbbbbbbdddbbbdddbbbddddddddddddd`aaa`",
+"`ccc`dddddddddddbbdddddbbbdddddbbbbbbdddbbbdddbbbddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`dddddddddddddddbbbbbbbddbbbdddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddbbbbbbbbddbbbddddbbdddddddddddddddddddddddd`aaa`",
+"`ccc`dddddddddddddbbbbddddbddddddddbbbdddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddbbbbddddddddbbbddbbbbbbbbbdddddbbdddddddddddd`aaa`",
+"`ccc`ddddddddddddbbbdddddddddbbbddbbbbbbdbbbdddbbddddddddddddd`aaa`",
+"`ccc`ddddddddddddbbbdddddddddbbbdddbbbdddbbbdddbbddddddddddddd`aaa`",
+"`ccc`ddddddddddddbbbdddddddddbbbdddbbbdddbbbbdbbdddddddddddddd`aaa`",
+"`ccc`ddddddddddddbbbdddddddddbbbdddbbbddddbbbdbbdddddddddddddd`aaa`",
+"`ccc`ddddddddddddbbbbddddddddbbbdddbbbddddbbbbbddddddddddddddd`aaa`",
+"`ccc`dddddddddddddbbbbddddbddbbbdddbbbdddddbbbbddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddbbbbbbbbddbbbdddbbbbbdddbbbdddddddddddddddd`aaa`",
+"`ccc`dddddddddddddddbbbbbbdddbbbddddbbbbdddbbbdddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddbbddddddddddddddddd`aaa`",
+"`ccc`dddddddddddddddddddddddddddddddddddddbbbddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddbbbdddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`aaa`",
+"`ccc```````````````````````````````````````````````````````````aaa`",
+"`cc`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`aa`",
+"`c`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`a`",
+"``aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/scnctyhi.xpm b/images/scnctyhi.xpm
new file mode 100644 (file)
index 0000000..ba7ac4d
--- /dev/null
@@ -0,0 +1,69 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 5 1",
+/* colors */
+"` c #000000",
+"a c #00FFFF",
+"b c #585858",
+"c c #FFFF00",
+"d c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb``",
+"`b`bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`d`",
+"`bb`bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`dd`",
+"`bbb```````````````````````````````````````````````````````````ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaacccaaaaaccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaccc`aaaacc`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaccccaaaacc`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaacccccaaacc`aaacccccaaacccaaaccaaaccaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaccccccaacc`aacccccccaaccc`accccaacc`aaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaacc`ccc`acc`accc```cccaacc`acccc`acc`aaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaacc`acccacc`accc`aaccc`acc`acccc`cc``aaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaacc`acccccc`accccccccc`acccac`cc`cc`aaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaacc`aaccccc`accccccccc`accccc`ccccc`aaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaacc`aaacccc`accc```````aacccc`ccccc`aaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaacc`aaaaccc`aaccccccccaaaccc``accc``aaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaacc`aaaaccc`aaa`cccccc`aaccc`aaccc`aaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaa``aaaaa```aaaaa``````aaa```aaa```aaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaacccccccaacccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaacccccccc`accc`aaaccaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaacccc````c`aa```aaccc`aaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaacccc``aaaa`acccaacccccccccaaaaaccaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaccc``aaaaaaaccc`acccccc`cccaaacc``aaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaccc`aaaaaaaaccc`aaccc```ccc`aacc`aaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaccc`aaaaaaaaccc`aaccc`aaccccacc``aaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaccc`aaaaaaaaccc`aaccc`aaaccc`cc`aaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaccccaaaaaaaaccc`aaccc`aaaccccc``aaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaccccaaaacaaccc`aaccc`aaaacccc`aaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaacccccccc`accc`aacccccaaaccc``aaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaacccccc``accc`aaacccc`aaccc`aaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaa``````aaa```aaaa````aacc``aaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccc`aaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccc``aaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa```aaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`ddd`",
+"`bbb```````````````````````````````````````````````````````````ddd`",
+"`bb`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`dd`",
+"`b`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`d`",
+"``ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/scrio.xpm b/images/scrio.xpm
new file mode 100644 (file)
index 0000000..3ffd22b
--- /dev/null
@@ -0,0 +1,72 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 8 1",
+/* colors */
+"` c #000000",
+"a c #00BF00",
+"b c #3F3F3F",
+"c c #3F3FFF",
+"d c #BF7F3F",
+"e c #003F00",
+"f c #585858",
+"g c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg``",
+"`g`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`f`",
+"`gg`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`ff`",
+"`ggg```````````````````````````````````````````````````````````fff`",
+"`ggg`ddd`dddddddddd``bbbbbbbbbb`dd`d```bbbbbbbbbbbbbbbbbbbbbbd`fff`",
+"`ggg`ddd`ddddbbddddbbbbbb`ddddb`dd`ddd```bbbbbbbbbbbbbbbbbbbdd`fff`",
+"`ggg`d`d`d`bbbbbbbbbbe`bb`dddbbbbd`ddd```````bbbbb``````bbbddc`fff`",
+"`ggg`ad```ebe`ebbbbbbbbbb`bb`bd`db`ddddd`bbbbb```b`bb```bbbdcc`fff`",
+"`ggg`aad`eebbbbbbbb`bbbbb`dd`bd`ddb`````````````````bb``bb`ccc`fff`",
+"`ggg`aad`eeeeeeeeee`bbbbb`bb`bbbbb`bb`bb`````````b`b```bbbbccc`fff`",
+"`ggg`daa````eeeeeee`````````````````dbbb``````bbbb`bbb`bbb`dcc`fff`",
+"`ggg`dadaaad`````eebbddbdbbb`bbbbbb`bb`bbbbbb`bbbb`bbb`bbdddcc`fff`",
+"`ggg`daddd`adaaad``bbddbbbbb`dddbbb```````````````````bbbdddcc`fff`",
+"`ggg`daaddda`aaaddddbbbbbbbd`bbbbbbbbb``bbbb`bbbbb````bbbdd`cc`fff`",
+"`ggg`aaaaaadd`ddadddd`dddddd`dddd``bbb`bbbbb`bbbbb`b``bb`d`bcc`fff`",
+"`ggg`adadaddd`ddaaaadd`dddddddddbbbbbb`bbbbb`bbbbb`bbbbb`ddbcc`fff`",
+"`ggg`adadaadd`ddaadaddd```a`````bbbbbb`bbbb```bbbb`bbbbb`d`bcc`fff`",
+"`ggg`aaadaadd``dddaadddd`daddd`bbbbbbb`bbbb```bbbb`bbb```dd`cc`fff`",
+"`ggg`aaddaaadd``ddaadddd`aaddb`bbbbbbb`bbbbb```bb``````````ccc`fff`",
+"`ggg`aaddaddadd`dd`dddaddaadbb`bb````````````````````````bcccc`fff`",
+"`ggg`daadaddda``bbb```aaaaa`bb`bbbbb`b`bbbbb`bbbbb`ddd`d`ccccc`fff`",
+"`ggg`ddaaaaaaaabbbbbbbbbbbb`bb`bbbbbbb`bbbbb`bbbbb`ddd`ddccccc`fff`",
+"`ggg`ddadadddaabbbbbbbbb````````````````bbbb`bbb`b`ddd```bcccc`fff`",
+"`ggg`d`daadddd``bbbbbbbbbbbbbb`bb`bbbb`bb``b`bbbb`````````cccc`fff`",
+"`ggg`d``````````bbbbbbbbbbbbbb`b`bbbb``bb````bbbbbaaaa`````ccc`fff`",
+"`ggg`d`bbb`bbb``bbbbbbbbbbbbbb`b`bbb````b````bbbbbaaaa`aaaaccc`fff`",
+"`ggg`d`bbb`bbb````````````b``````````````````````````````a`ccc`fff`",
+"`ggg`d`bbb`bbbddddddddd`dd```b`b`bb`````b````bbcc`aaaaaaa`cccc`fff`",
+"`ggg`d`bbb`bbbdddd`dddddddd`bb`bbbb`````b````bbbcc`a`a`a`ccccc`fff`",
+"`ggg`d`bbb`bbbd`d`ccd`ddddddbb`b`bb`````b````bbbbcc`bbb`cccccc`fff`",
+"`ggg`d````````dd`ccc`ddddddd`b`bbbb`````b`````bbbbcccccccccccc`fff`",
+"`ggg```dddddddd`ccccccddd`dd`b`bbbbbbbbbb`b````bbbbbbccccccccc`fff`",
+"`ggg`b`ddd`d`d`ccccccdddd`dd`b``bbbbbbbbb`b`````bbbbbbcc``cccc`fff`",
+"`ggg`b``d`ccccccccccc`d`d`dd`b`bbbbbbb``b`bb``````bbbb````cccc`fff`",
+"`ggg`b``ddcccccd`ccc`d`dd`d```````````````````bbb```bbbb```ccc`fff`",
+"`ggg`b``dddccccdd`d`ddddd`d`bb`bbb```bbbb`bbbbbbbbbbbbbbdd`ccc`fff`",
+"`ggg`b```ddccccdddddd``dd``bbb`bb`bbbbbbb`bbbbbbbbbbbbbbbdcccc`fff`",
+"`ggg`bb```ddd`ddddddd``dd`bbbbb`bbbbbbbbb`bbbbbbbbbbbbbbb`cccc`fff`",
+"`ggg`bb`d``d`````dd````````````````````````bbbbbbbb```````cccc`fff`",
+"`ggg`bb``````````d`````````````bbbddccccd`bbbbbb`d`dd`ddd`cccc`fff`",
+"`ggg`c``````````````````bb`bbbbddddcccccc`ddbbbb`d`dddddddcccc`fff`",
+"`ggg`cc```bbbbbb`bbbbb`bbb`bbdddbccccccccccddd`d`dddd`dddddccc`fff`",
+"`ggg`cccc`bbbbbb`bbbbb`bbb`ddccccccccccccccccc`d`dddcccdddddcc`fff`",
+"`ggg`cccc``bb````bbbbb`bdd`cccccccccccccccccccdd`dddccccddddcc`fff`",
+"`ggg`ccccddbbbbb`bbbbb`ddccccccccccccccccccccddd`ddcccccccdccc`fff`",
+"`ggg`ccccc``bbbd`dbbbb`dccccccccccccccccccccc`dd`ddcccccccdccc`fff`",
+"`ggg`cccccc`bbdccddddddccccccccccccccccccccccddddddccccccccccc`fff`",
+"`ggg`cccccccccccccccddbcccccccccccccccccccccddddddddcccccccccc`fff`",
+"`ggg`ccccccccccccccccccccccccccccccccccccccccddddd`dcccccccccc`fff`",
+"`ggg`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`fff`",
+"`ggg`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`fff`",
+"`ggg```````````````````````````````````````````````````````````fff`",
+"`gg`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ff`",
+"`g`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`f`",
+"``fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/scriohi.xpm b/images/scriohi.xpm
new file mode 100644 (file)
index 0000000..23f36c0
--- /dev/null
@@ -0,0 +1,72 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 8 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #FFBF7F",
+"c c #00FF00",
+"d c #007F00",
+"e c #585858",
+"f c #7F7FFF",
+"g c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee``",
+"`e`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`g`",
+"`ee`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`gg`",
+"`eee```````````````````````````````````````````````````````````ggg`",
+"`eee`bbb`bbbbbbbbbb``aaaaaaaaaa`bb`b```aaaaaaaaaaaaaaaaaaaaaab`ggg`",
+"`eee`bbb`bbbbaabbbbaaaaaa`bbbba`bb`bbb```aaaaaaaaaaaaaaaaaaabb`ggg`",
+"`eee`b`b`b`aaaaaaaaaad`aa`bbbaaaab`bbb```````aaaaa``````aaabbf`ggg`",
+"`eee`cb```dad`daaaaaaaaaa`aa`ab`ba`bbbbb`aaaaa```a`aa```aaabff`ggg`",
+"`eee`ccb`ddaaaaaaaa`aaaaa`bb`ab`bba`````````````````aa``aa`fff`ggg`",
+"`eee`ccb`dddddddddd`aaaaa`aa`aaaaa`aa`aa`````````a`a```aaaafff`ggg`",
+"`eee`bcc````ddddddd`````````````````baaa``````aaaa`aaa`aaa`bff`ggg`",
+"`eee`bcbcccb`````ddaabbabaaa`aaaaaa`aa`aaaaaa`aaaa`aaa`aabbbff`ggg`",
+"`eee`bcbbb`cbcccb``aabbaaaaa`bbbaaa```````````````````aaabbbff`ggg`",
+"`eee`bccbbbc`cccbbbbaaaaaaab`aaaaaaaaa``aaaa`aaaaa````aaabb`ff`ggg`",
+"`eee`ccccccbb`bbcbbbb`bbbbbb`bbbb``aaa`aaaaa`aaaaa`a``aa`b`aff`ggg`",
+"`eee`cbcbcbbb`bbccccbb`bbbbbbbbbaaaaaa`aaaaa`aaaaa`aaaaa`bbaff`ggg`",
+"`eee`cbcbccbb`bbccbcbbb```c`````aaaaaa`aaaa```aaaa`aaaaa`b`aff`ggg`",
+"`eee`cccbccbb``bbbccbbbb`bcbbb`aaaaaaa`aaaa```aaaa`aaa```bb`ff`ggg`",
+"`eee`ccbbcccbb``bbccbbbb`ccbba`aaaaaaa`aaaaa```aa``````````fff`ggg`",
+"`eee`ccbbcbbcbb`bb`bbbcbbccbaa`aa````````````````````````affff`ggg`",
+"`eee`bccbcbbbc``aaa```ccccc`aa`aaaaa`a`aaaaa`aaaaa`bbb`b`fffff`ggg`",
+"`eee`bbccccccccaaaaaaaaaaaa`aa`aaaaaaa`aaaaa`aaaaa`bbb`bbfffff`ggg`",
+"`eee`bbcbcbbbccaaaaaaaaa````````````````aaaa`aaa`a`bbb```affff`ggg`",
+"`eee`b`bccbbbb``aaaaaaaaaaaaaa`aa`aaaa`aa``a`aaaa`````````ffff`ggg`",
+"`eee`b``````````aaaaaaaaaaaaaa`a`aaaa``aa````aaaaacccc`````fff`ggg`",
+"`eee`b`aaa`aaa``aaaaaaaaaaaaaa`a`aaa````a````aaaaacccc`ccccfff`ggg`",
+"`eee`b`aaa`aaa````````````a``````````````````````````````c`fff`ggg`",
+"`eee`b`aaa`aaabbbbbbbbb`bb```a`a`aa`````a````aaff`ccccccc`ffff`ggg`",
+"`eee`b`aaa`aaabbbb`bbbbbbbb`aa`aaaa`````a````aaaff`c`c`c`fffff`ggg`",
+"`eee`b`aaa`aaab`b`ffb`bbbbbbaa`a`aa`````a````aaaaff`aaa`ffffff`ggg`",
+"`eee`b````````bb`fff`bbbbbbb`a`aaaa`````a`````aaaaffffffffffff`ggg`",
+"`eee```bbbbbbbb`ffffffbbb`bb`a`aaaaaaaaaa`a````aaaaaafffffffff`ggg`",
+"`eee`a`bbb`b`b`ffffffbbbb`bb`a``aaaaaaaaa`a`````aaaaaaff``ffff`ggg`",
+"`eee`a``b`fffffffffff`b`b`bb`a`aaaaaaa``a`aa``````aaaa````ffff`ggg`",
+"`eee`a``bbfffffb`fff`b`bb`b```````````````````aaa```aaaa```fff`ggg`",
+"`eee`a``bbbffffbb`b`bbbbb`b`aa`aaa```aaaa`aaaaaaaaaaaaaabb`fff`ggg`",
+"`eee`a```bbffffbbbbbb``bb``aaa`aa`aaaaaaa`aaaaaaaaaaaaaaabffff`ggg`",
+"`eee`aa```bbb`bbbbbbb``bb`aaaaa`aaaaaaaaa`aaaaaaaaaaaaaaa`ffff`ggg`",
+"`eee`aa`b``b`````bb````````````````````````aaaaaaaa```````ffff`ggg`",
+"`eee`aa``````````b`````````````aaabbffffb`aaaaaa`b`bb`bbb`ffff`ggg`",
+"`eee`f``````````````````aa`aaaabbbbffffff`bbaaaa`b`bbbbbbbffff`ggg`",
+"`eee`ff```aaaaaa`aaaaa`aaa`aabbbaffffffffffbbb`b`bbbb`bbbbbfff`ggg`",
+"`eee`ffff`aaaaaa`aaaaa`aaa`bbfffffffffffffffff`b`bbbfffbbbbbff`ggg`",
+"`eee`ffff``aa````aaaaa`abb`fffffffffffffffffffbb`bbbffffbbbbff`ggg`",
+"`eee`ffffbbaaaaa`aaaaa`bbffffffffffffffffffffbbb`bbfffffffbfff`ggg`",
+"`eee`fffff``aaab`baaaa`bfffffffffffffffffffff`bb`bbfffffffbfff`ggg`",
+"`eee`ffffff`aabffbbbbbbffffffffffffffffffffffbbbbbbfffffffffff`ggg`",
+"`eee`fffffffffffffffbbafffffffffffffffffffffbbbbbbbbffffffffff`ggg`",
+"`eee`ffffffffffffffffffffffffffffffffffffffffbbbbb`bffffffffff`ggg`",
+"`eee`fffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ggg`",
+"`eee`fffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ggg`",
+"`eee```````````````````````````````````````````````````````````ggg`",
+"`ee`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`gg`",
+"`e`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`g`",
+"``ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/scsfo.xpm b/images/scsfo.xpm
new file mode 100644 (file)
index 0000000..e644d2a
--- /dev/null
@@ -0,0 +1,72 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 8 1",
+/* colors */
+"` c #000000",
+"a c #00BF00",
+"b c #3F3F3F",
+"c c #3F3FFF",
+"d c #BF7F3F",
+"e c #003F00",
+"f c #585858",
+"g c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg``",
+"`g`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`f`",
+"`gg`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`ff`",
+"`ggg```````````````````````````````````````````````````````````fff`",
+"`ggg`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`fff`",
+"`ggg`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`fff`",
+"`ggg`ccccccccccccccccccaaaaaccccc`bbbccccccccccccccccccccccccc`fff`",
+"`ggg`ccccccccccccccaaaaaaaadaaddbb`b`b`ccccccccccccccccccccccc`fff`",
+"`ggg`cccccccccccccaaaadadadadaaad``````````````````bcccccccccc`fff`",
+"`ggg`cccccccccccccaaaadabaaadddad`bb`````bb`bb`b````cccccccccc`fff`",
+"`ggg`ccccccccccaaaaadaaabbaaaaaad`dd`bb````````b`b```bcccccccc`fff`",
+"`ggg`ccccccccccaaaaaaaaaaaaaaaadd`db`bbb`b```````b```bcccccccc`fff`",
+"`ggg`ccccccccaaaaaaaaaaaaaaabaaad`````````````````````cccccccc`fff`",
+"`ggg`cccccccaaaadddd`dddddddddbdd`b`````````b````b````bccccccc`fff`",
+"`ggg`cccccaaaaaaaad```````````````````````````````````bbcccccc`fff`",
+"`ggg`cccccdddddddddd`db``b`b````````````````````b``````b`b`ccc`fff`",
+"`ggg`ccccc```````````b``b``bb`dd`bb```b`````bb`````````b`bcccc`fff`",
+"`ggg`cccd`ddd`````````b`b``bb`bb`b`b`bb``b``b``````b```b`bcccc`fff`",
+"`ggg`cccd```````````````````````````````````````b````````bcccc`fff`",
+"`ggg`cccd`bbb`bdb`bb`bb`b``bb`bb`dd`b``b`bd````bb````````bcccc`fff`",
+"`ggg`cccd`bbb`bbb`bb`bb`bbbbb`bb``dd`b`b````bb`````b``b``bcccc`fff`",
+"`ggg`cccd``````````````````````````d```b```````````b``b``bcccc`fff`",
+"`ggg`cccd`aaaaaaaaaaaaaaa`b```bb`ddbdd`b`bb`bb`b``````b``bcccc`fff`",
+"`ggg`cccd`aaaaaaaaaaaaaaa```````````d`bb`bb`db```````````bcccc`fff`",
+"`ggg`ccdd`aaaaaaaaaaaaaaa`b```ddddaadd```````````b````b```cccc`fff`",
+"`ggg`ccdd`aaaaaaaaaaaaaaa`bb``ddaaaaddddddddd````b````bb`bcccc`fff`",
+"`ggg`ccdd`````````````````````ddddadaaddbbbd``b```````bd`bcccc`fff`",
+"`ggg`cccd`dbb`bb`bb`bb`bb`d``aaeeeaadaaddbb`b````````````bcccc`fff`",
+"`ggg`cccd`dbb`bb`bb`bb`b``dddadddaeaaddddde`bb`b`b````b```cccc`fff`",
+"`ggg`cccd`````b```b```````dddeeadaadadaaddd`bb```b``b`b````ccc`fff`",
+"`ggg`cccd`bbb`bb`dd`bb`bd`dddaaaddaaddaaddd`bb`b````b````bbccc`fff`",
+"`ggg`cccd`bbd`b``b``b``bd`ddeaaddddaadaadbd`````````````bb`ccc`fff`",
+"`ggg`cccd`````````````````daaaaadeadaddaddd`b``b```````bb`bccc`fff`",
+"`ggg`cccd`bbb`bb`b``b```b`daaadaaaadaaaaddb`b``b`b````bb`bbccc`fff`",
+"`ggg`cccd`bbb``b`b``b``bb``addddedddaddaabb`b``b`b````b`bbcccc`fff`",
+"`ggg`ccdd````````````b````dadadddddddedaddd`b``````````bbccccc`fff`",
+"`ggg`ccdd`ddb`bb`bb````bb`daadadddedadadddd`b``b`d``````bccccc`fff`",
+"`ggg`ccdd`ddb`dd`bb`bb`bd``aaa`aaaaaadddd``````b``````bbb``ccc`fff`",
+"`ggg`ccdd`````````````````daaaddaaddddddddd`bb`b`b`bb``````ccc`fff`",
+"`ggg`cccd`bdb`bb`bb`db`bb`daadddddddddddddd`bb```b`bb`ddd``ccc`fff`",
+"`ggg`cccd`````````````````aaad`b`````````````````b`bb`ddd``ccc`fff`",
+"`ggg`cccedddd`dd`bd`dbbbddaaad`bbb`bbb`bbb`b`bb``b`bb``dd``ccc`fff`",
+"`ggg`cccddccddddddd`dbbddaaadd```````````````````b`bbb`dd``ccc`fff`",
+"`ggg`cccedcdcdddbddddddddaabad``db``bb`bbb`bb``b```````dcccccc`fff`",
+"`ggg`cccddccccdddbddeddddddaad`ddb`````bbb`bb`b``d`ddd`dcccccc`fff`",
+"`ggg`cceedcccccddddddddddddddd```````````````````ddddd`dcccccc`fff`",
+"`ggg`ccedddcccceddddeddddddddd`ddd```d`bbb`bbbbb`ddddd`ddccccc`fff`",
+"`ggg`cccdddcccccddddeddddddddd`ddd`ddd`bbb`bbbbb`ddddd`ddccccc`fff`",
+"`ggg`cccdddcccccdddddddddedddddd`````````````````ddddd`ddccccc`fff`",
+"`ggg`cccdddddccceddddddddddddddddddddddddddddddddddddd`dddeccc`fff`",
+"`ggg`cceddddddddddddddeddedddddddddddddddddddddddddddd`ddddccc`fff`",
+"`ggg```````````````````````````````````````````````````````````fff`",
+"`gg`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ff`",
+"`g`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`f`",
+"``fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/scsfohi.xpm b/images/scsfohi.xpm
new file mode 100644 (file)
index 0000000..a53ce0c
--- /dev/null
@@ -0,0 +1,72 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 8 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #FFBF7F",
+"c c #00FF00",
+"d c #007F00",
+"e c #585858",
+"f c #7F7FFF",
+"g c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee``",
+"`e`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`g`",
+"`ee`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`gg`",
+"`eee```````````````````````````````````````````````````````````ggg`",
+"`eee`fffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ggg`",
+"`eee`fffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ggg`",
+"`eee`ffffffffffffffffffcccccfffff`aaafffffffffffffffffffffffff`ggg`",
+"`eee`ffffffffffffffccccccccbccbbaa`a`a`fffffffffffffffffffffff`ggg`",
+"`eee`fffffffffffffccccbcbcbcbcccb``````````````````affffffffff`ggg`",
+"`eee`fffffffffffffccccbcacccbbbcb`aa`````aa`aa`a````ffffffffff`ggg`",
+"`eee`ffffffffffcccccbcccaaccccccb`bb`aa````````a`a```affffffff`ggg`",
+"`eee`ffffffffffccccccccccccccccbb`ba`aaa`a```````a```affffffff`ggg`",
+"`eee`ffffffffcccccccccccccccacccb`````````````````````ffffffff`ggg`",
+"`eee`fffffffccccbbbb`bbbbbbbbbabb`a`````````a````a````afffffff`ggg`",
+"`eee`fffffccccccccb```````````````````````````````````aaffffff`ggg`",
+"`eee`fffffbbbbbbbbbb`ba``a`a````````````````````a``````a`a`fff`ggg`",
+"`eee`fffff```````````a``a``aa`bb`aa```a`````aa`````````a`affff`ggg`",
+"`eee`fffb`bbb`````````a`a``aa`aa`a`a`aa``a``a``````a```a`affff`ggg`",
+"`eee`fffb```````````````````````````````````````a````````affff`ggg`",
+"`eee`fffb`aaa`aba`aa`aa`a``aa`aa`bb`a``a`ab````aa````````affff`ggg`",
+"`eee`fffb`aaa`aaa`aa`aa`aaaaa`aa``bb`a`a````aa`````a``a``affff`ggg`",
+"`eee`fffb``````````````````````````b```a```````````a``a``affff`ggg`",
+"`eee`fffb`ccccccccccccccc`a```aa`bbabb`a`aa`aa`a``````a``affff`ggg`",
+"`eee`fffb`ccccccccccccccc```````````b`aa`aa`ba```````````affff`ggg`",
+"`eee`ffbb`ccccccccccccccc`a```bbbbccbb```````````a````a```ffff`ggg`",
+"`eee`ffbb`ccccccccccccccc`aa``bbccccbbbbbbbbb````a````aa`affff`ggg`",
+"`eee`ffbb`````````````````````bbbbcbccbbaaab``a```````ab`affff`ggg`",
+"`eee`fffb`baa`aa`aa`aa`aa`b``ccdddccbccbbaa`a````````````affff`ggg`",
+"`eee`fffb`baa`aa`aa`aa`a``bbbcbbbcdccbbbbbd`aa`a`a````a```ffff`ggg`",
+"`eee`fffb`````a```a```````bbbddcbccbcbccbbb`aa```a``a`a````fff`ggg`",
+"`eee`fffb`aaa`aa`bb`aa`ab`bbbcccbbccbbccbbb`aa`a````a````aafff`ggg`",
+"`eee`fffb`aab`a``a``a``ab`bbdccbbbbccbccbab`````````````aa`fff`ggg`",
+"`eee`fffb`````````````````bcccccbdcbcbbcbbb`a``a```````aa`afff`ggg`",
+"`eee`fffb`aaa`aa`a``a```a`bcccbccccbccccbba`a``a`a````aa`aafff`ggg`",
+"`eee`fffb`aaa``a`a``a``aa``cbbbbdbbbcbbccaa`a``a`a````a`aaffff`ggg`",
+"`eee`ffbb````````````a````bcbcbbbbbbbdbcbbb`a``````````aafffff`ggg`",
+"`eee`ffbb`bba`aa`aa````aa`bccbcbbbdbcbcbbbb`a``a`b``````afffff`ggg`",
+"`eee`ffbb`bba`bb`aa`aa`ab``ccc`ccccccbbbb``````a``````aaa``fff`ggg`",
+"`eee`ffbb`````````````````bcccbbccbbbbbbbbb`aa`a`a`aa``````fff`ggg`",
+"`eee`fffb`aba`aa`aa`ba`aa`bccbbbbbbbbbbbbbb`aa```a`aa`bbb``fff`ggg`",
+"`eee`fffb`````````````````cccb`a`````````````````a`aa`bbb``fff`ggg`",
+"`eee`fffdbbbb`bb`ab`baaabbcccb`aaa`aaa`aaa`a`aa``a`aa``bb``fff`ggg`",
+"`eee`fffbbffbbbbbbb`baabbcccbb```````````````````a`aaa`bb``fff`ggg`",
+"`eee`fffdbfbfbbbabbbbbbbbccacb``ba``aa`aaa`aa``a```````bffffff`ggg`",
+"`eee`fffbbffffbbbabbdbbbbbbccb`bba`````aaa`aa`a``b`bbb`bffffff`ggg`",
+"`eee`ffddbfffffbbbbbbbbbbbbbbb```````````````````bbbbb`bffffff`ggg`",
+"`eee`ffdbbbffffdbbbbdbbbbbbbbb`bbb```b`aaa`aaaaa`bbbbb`bbfffff`ggg`",
+"`eee`fffbbbfffffbbbbdbbbbbbbbb`bbb`bbb`aaa`aaaaa`bbbbb`bbfffff`ggg`",
+"`eee`fffbbbfffffbbbbbbbbbdbbbbbb`````````````````bbbbb`bbfffff`ggg`",
+"`eee`fffbbbbbfffdbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`bbbdfff`ggg`",
+"`eee`ffdbbbbbbbbbbbbbbdbbdbbbbbbbbbbbbbbbbbbbbbbbbbbbb`bbbbfff`ggg`",
+"`eee```````````````````````````````````````````````````````````ggg`",
+"`ee`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`gg`",
+"`e`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`g`",
+"``ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/sctkyo.xpm b/images/sctkyo.xpm
new file mode 100644 (file)
index 0000000..c85f5fe
--- /dev/null
@@ -0,0 +1,72 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 8 1",
+/* colors */
+"` c #000000",
+"a c #00BF00",
+"b c #3F3F3F",
+"c c #3F3FFF",
+"d c #BF7F3F",
+"e c #3C00BF",
+"f c #585858",
+"g c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg``",
+"`g`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`f`",
+"`gg`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`ff`",
+"`ggg```````````````````````````````````````````````````````````fff`",
+"`ggg`dddd`ddddddd`ddadddddddadddddd`dddddadddddddaaadddd`ddddd`fff`",
+"`ggg`ddddd`dddddd`dddddd`ddadaddddd`dddddddddadddddaaddd`ddddd`fff`",
+"`ggg`ddddd`adaddd`ddd```b``ddddadda`dad`d```dddaddaaddd``ddddd`fff`",
+"`ggg`daddd`dddddd`dd`bbbbb`dddddd`d`d`````````daddddddd``ddddd`fff`",
+"`ggg`ddddd`dddddd`dd`bb`````dddd`dd`ddddbb``dddd`ddddd`ddddddd`fff`",
+"`ggg`ddddd`dddddd`d``bb```aaadd`ddd`dddd`b`ddddd`ad```ddddaadd`fff`",
+"`ggg```````ddd``````dbbd`daaaaaddd```ddd`bb`dddd`dd``dddddadad`fff`",
+"`ggg`d`ddd`ddd`dd````ddd``aaaaadd`b```dd``bbbdbb`bd`dddddddddd`fff`",
+"`ggg`dd`dd`dd`ddd``bb``daaaaaaddd`````bbbbbbb`bb`bd`aadddddddd`fff`",
+"`ggg`ddd`d```dd`b`bbbb``adaa`````b`bbbbbbbbbb`bb`b```````ddddd`fff`",
+"`ggg`dddd`bbbb``b`bbbbbaaaadbb`bbb`````````bbbbb`b``ddbbbbdddd`fff`",
+"`ggg`ddd```bb`bbb`bbbbbb```bbb`bbbb`bbbbbbb`````````b`bbbbdddd`fff`",
+"`ggg````````bbbbb`bbb``````bbb`bbbb`bbbbbbbb`bb``bb`bbbbbbdddd`fff`",
+"`ggg`b`bb`````````bbbb`bbb`bbb`bbbb`bbb``bbb`bbb`bb`bbbbbbdddd`fff`",
+"`ggg`b``bb`bbbbbb`bbbb`bbb`bbb`bbbb`bbb````````````````````````fff`",
+"`ggg`bbb``bbbbbbb```````````````````bbb``bbb`bbb`bb`bbbbb`bbdd`fff`",
+"`ggg`bbbbb`bbbbbb`bbbb`bbb`bbb`bbb``bbb``bbb`bbb`bb`bbbbb`bbdd`fff`",
+"`ggg`bbbbbb``bbbb`bbbb`bbb``bb``````b````````bbb`bb`bbbbb`bbdd`fff`",
+"`ggg`cbbcbbb``````bbbb`bbb``bb`b````cccc``````````````````bbdd`fff`",
+"`ggg`ccbcbbbbbbbb`bbbb`bbb`b```bbccccaaccc`b`bbbbbb`bbb`b`b`dd`fff`",
+"`ggg`cccb`````````bbbb`bbb`bbb``bcaaaaaaacbb`bbbbbb`bbb`b`b`dd`fff`",
+"`ggg`ccccbbbb`bbb`bbbb`bbb`b`b``bcaaaaaaacb`bbbb``````````b`dd`fff`",
+"`ggg`ccccbbbb`bbb```````````````bcaaaaaaccb`bbbb`bb`bbb`b`b`dd`fff`",
+"`ggg`ccccb````````bb`bb`````b``bbccccaaacbb``````bb`bbb`b`b`dd`fff`",
+"`ggg`cccccbbb`bbbbbb``bb```bb``bbb`bcccccb``bbb`bbb`bbb`b```dd`fff`",
+"`ggg`cccccbbb`bbbbbb`bbbbb`bb``bbbbb``bbbbbbbbb`bbb`bbb`bbbbdd`fff`",
+"`ggg`cccccbccccbc`bb`bb`b`````````b``````bbbbbb`bbb`bbb`bbbbd``fff`",
+"`ggg`cccccbccc`ccccc`bbbb``bb``b`bb`````b`bbbbb`bbb``````````b`fff`",
+"`ggg`ccccccccccccccccccc`b``````````````````````````bb``bb`b`b`fff`",
+"`ggg`ccccccccccccccccccccbccbb`bbbbb``bbbbbbbbbbbbbbbbb`bbb``b`fff`",
+"`ggg`ccccccccccccccccccccbcbbb`````bbbb```````````bbbbb`b`bb`b`fff`",
+"`ggg`cccccccccccccccccccccccccbbb``bcccccc`ccc`bbb`bbbb`b`bbb``fff`",
+"`ggg`cccccccccccccccecccccccccbbc`ccccbbbcccccc``bb`bbb`bbbbb``fff`",
+"`ggg`cccccccccccccccccccccccccccc`cccccccccccbcc`cbb`````bbbb``fff`",
+"`ggg`cccccccccccccccccccccccccccc`cc`c````c`cccccccbb`b`b``````fff`",
+"`ggg`ccceccccccccccccccccccccc```````````````bbbcccbbb``bb``bb`fff`",
+"`ggg`cccccccccccccccccccccccccc``bbb````bbbbbb`bcccccbb`bbb`bb`fff`",
+"`ggg`cccccccccccccecccccccccccc``bbb`````````````ccccccb`bbbbb`fff`",
+"`ggg`ccccccccccccccccccccccccc``bbbb``abbb``d``bbbbcc`ccccbbbb`fff`",
+"`ggg`ccccccccccccccccccccccccc`bbbbb``bbbb``d``bbbbbcc`cccbcbb`fff`",
+"`ggg`cccccccccccccccccccccccccbbbbbb``bbbb``d```````d`d`ccbccb`fff`",
+"`ggg`ccccccccecccccccccccccccc``````````````````dd`ddddd`d`ccc`fff`",
+"`ggg`ccccccccccccccccceccccccccc```b`bbbbbb`ddddd``ddddd`dd`d``fff`",
+"`ggg`cccccccccccccccccccccccccccbb`b``bbbbb`aaad`b`ddddd`ddddd`fff`",
+"`ggg`ccccccccccccccccccccceccccc```bb````````````a````````dddd`fff`",
+"`ggg`cccceeccccccccccccccccccccc`b`bb```dddddddddd`ddddddddddd`fff`",
+"`ggg`cccccccccccccccccccccccccccbb`bb`dddddddddddddddddddddddd`fff`",
+"`ggg```````````````````````````````````````````````````````````fff`",
+"`gg`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`ff`",
+"`g`fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`f`",
+"``fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/sctkyohi.xpm b/images/sctkyohi.xpm
new file mode 100644 (file)
index 0000000..c8596a4
--- /dev/null
@@ -0,0 +1,72 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"67 57 8 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #FFBF7F",
+"c c #00FF00",
+"d c #585858",
+"e c #7F7FFF",
+"f c #7B00FF",
+"g c #DFDFDF",
+/* pixels */
+"```````````````````````````````````````````````````````````````````",
+"``ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd``",
+"`d`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`g`",
+"`dd`ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`gg`",
+"`ddd```````````````````````````````````````````````````````````ggg`",
+"`ddd`bbbb`bbbbbbb`bbcbbbbbbbcbbbbbb`bbbbbcbbbbbbbcccbbbb`bbbbb`ggg`",
+"`ddd`bbbbb`bbbbbb`bbbbbb`bbcbcbbbbb`bbbbbbbbbcbbbbbccbbb`bbbbb`ggg`",
+"`ddd`bbbbb`cbcbbb`bbb```a``bbbbcbbc`bcb`b```bbbcbbccbbb``bbbbb`ggg`",
+"`ddd`bcbbb`bbbbbb`bb`aaaaa`bbbbbb`b`b`````````bcbbbbbbb``bbbbb`ggg`",
+"`ddd`bbbbb`bbbbbb`bb`aa`````bbbb`bb`bbbbaa``bbbb`bbbbb`bbbbbbb`ggg`",
+"`ddd`bbbbb`bbbbbb`b``aa```cccbb`bbb`bbbb`a`bbbbb`cb```bbbbccbb`ggg`",
+"`ddd```````bbb``````baab`bcccccbbb```bbb`aa`bbbb`bb``bbbbbcbcb`ggg`",
+"`ddd`b`bbb`bbb`bb````bbb``cccccbb`a```bb``aaabaa`ab`bbbbbbbbbb`ggg`",
+"`ddd`bb`bb`bb`bbb``aa``bccccccbbb`````aaaaaaa`aa`ab`ccbbbbbbbb`ggg`",
+"`ddd`bbb`b```bb`a`aaaa``cbcc`````a`aaaaaaaaaa`aa`a```````bbbbb`ggg`",
+"`ddd`bbbb`aaaa``a`aaaaaccccbaa`aaa`````````aaaaa`a``bbaaaabbbb`ggg`",
+"`ddd`bbb```aa`aaa`aaaaaa```aaa`aaaa`aaaaaaa`````````a`aaaabbbb`ggg`",
+"`ddd````````aaaaa`aaa``````aaa`aaaa`aaaaaaaa`aa``aa`aaaaaabbbb`ggg`",
+"`ddd`a`aa`````````aaaa`aaa`aaa`aaaa`aaa``aaa`aaa`aa`aaaaaabbbb`ggg`",
+"`ddd`a``aa`aaaaaa`aaaa`aaa`aaa`aaaa`aaa````````````````````````ggg`",
+"`ddd`aaa``aaaaaaa```````````````````aaa``aaa`aaa`aa`aaaaa`aabb`ggg`",
+"`ddd`aaaaa`aaaaaa`aaaa`aaa`aaa`aaa``aaa``aaa`aaa`aa`aaaaa`aabb`ggg`",
+"`ddd`aaaaaa``aaaa`aaaa`aaa``aa``````a````````aaa`aa`aaaaa`aabb`ggg`",
+"`ddd`eaaeaaa``````aaaa`aaa``aa`a````eeee``````````````````aabb`ggg`",
+"`ddd`eeaeaaaaaaaa`aaaa`aaa`a```aaeeeecceee`a`aaaaaa`aaa`a`a`bb`ggg`",
+"`ddd`eeea`````````aaaa`aaa`aaa``aeccccccceaa`aaaaaa`aaa`a`a`bb`ggg`",
+"`ddd`eeeeaaaa`aaa`aaaa`aaa`a`a``aecccccccea`aaaa``````````a`bb`ggg`",
+"`ddd`eeeeaaaa`aaa```````````````aecccccceea`aaaa`aa`aaa`a`a`bb`ggg`",
+"`ddd`eeeea````````aa`aa`````a``aaeeeeccceaa``````aa`aaa`a`a`bb`ggg`",
+"`ddd`eeeeeaaa`aaaaaa``aa```aa``aaa`aeeeeea``aaa`aaa`aaa`a```bb`ggg`",
+"`ddd`eeeeeaaa`aaaaaa`aaaaa`aa``aaaaa``aaaaaaaaa`aaa`aaa`aaaabb`ggg`",
+"`ddd`eeeeeaeeeeae`aa`aa`a`````````a``````aaaaaa`aaa`aaa`aaaab``ggg`",
+"`ddd`eeeeeaeee`eeeee`aaaa``aa``a`aa`````a`aaaaa`aaa``````````a`ggg`",
+"`ddd`eeeeeeeeeeeeeeeeeee`a``````````````````````````aa``aa`a`a`ggg`",
+"`ddd`eeeeeeeeeeeeeeeeeeeeaeeaa`aaaaa``aaaaaaaaaaaaaaaaa`aaa``a`ggg`",
+"`ddd`eeeeeeeeeeeeeeeeeeeeaeaaa`````aaaa```````````aaaaa`a`aa`a`ggg`",
+"`ddd`eeeeeeeeeeeeeeeeeeeeeeeeeaaa``aeeeeee`eee`aaa`aaaa`a`aaa``ggg`",
+"`ddd`eeeeeeeeeeeeeeefeeeeeeeeeaae`eeeeaaaeeeeee``aa`aaa`aaaaa``ggg`",
+"`ddd`eeeeeeeeeeeeeeeeeeeeeeeeeeee`eeeeeeeeeeeaee`eaa`````aaaa``ggg`",
+"`ddd`eeeeeeeeeeeeeeeeeeeeeeeeeeee`ee`e````e`eeeeeeeaa`a`a``````ggg`",
+"`ddd`eeefeeeeeeeeeeeeeeeeeeeee```````````````aaaeeeaaa``aa``aa`ggg`",
+"`ddd`eeeeeeeeeeeeeeeeeeeeeeeeee``aaa````aaaaaa`aeeeeeaa`aaa`aa`ggg`",
+"`ddd`eeeeeeeeeeeeefeeeeeeeeeeee``aaa`````````````eeeeeea`aaaaa`ggg`",
+"`ddd`eeeeeeeeeeeeeeeeeeeeeeeee``aaaa``caaa``b``aaaaee`eeeeaaaa`ggg`",
+"`ddd`eeeeeeeeeeeeeeeeeeeeeeeee`aaaaa``aaaa``b``aaaaaee`eeeaeaa`ggg`",
+"`ddd`eeeeeeeeeeeeeeeeeeeeeeeeeaaaaaa``aaaa``b```````b`b`eeaeea`ggg`",
+"`ddd`eeeeeeeefeeeeeeeeeeeeeeee``````````````````bb`bbbbb`b`eee`ggg`",
+"`ddd`eeeeeeeeeeeeeeeeefeeeeeeeee```a`aaaaaa`bbbbb``bbbbb`bb`b``ggg`",
+"`ddd`eeeeeeeeeeeeeeeeeeeeeeeeeeeaa`a``aaaaa`cccb`a`bbbbb`bbbbb`ggg`",
+"`ddd`eeeeeeeeeeeeeeeeeeeeefeeeee```aa````````````c````````bbbb`ggg`",
+"`ddd`eeeeffeeeeeeeeeeeeeeeeeeeee`a`aa```bbbbbbbbbb`bbbbbbbbbbb`ggg`",
+"`ddd`eeeeeeeeeeeeeeeeeeeeeeeeeeeaa`aa`bbbbbbbbbbbbbbbbbbbbbbbb`ggg`",
+"`ddd```````````````````````````````````````````````````````````ggg`",
+"`dd`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`gg`",
+"`d`ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`g`",
+"``ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg``",
+"```````````````````````````````````````````````````````````````````"
+};
diff --git a/images/seaport.xpm b/images/seaport.xpm
new file mode 100644 (file)
index 0000000..66e2138
--- /dev/null
@@ -0,0 +1,83 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"64 64 12 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #997D4C",
+"c c #0000E6",
+"d c #3F3F3F",
+"e c #007F00",
+"f c #6666E6",
+"g c #00E600",
+"h c #FFFF00",
+"i c #CC7E66",
+"j c #FF7700",
+"k c #BFBFBF",
+/* pixels */
+"fffffffffffffffffffffffffffffffffffffff`aaaaaaffffffffffffffffff",
+"fffffffffffffffffffffffffffffffffffffff`aaaaaaffffffffjjffffffff",
+"ffffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiaaaaaaiiiiiiidijjiiiiiff",
+"fff`iiibibiiiiiiiiiiiiibiiibiiibiiiiiiiiaaaaaaiiiiiidiiijjiiiiff",
+"ffc`iiiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiiiii`iiiiijjiiiff",
+"ffc`iiaaaaaaaaaaaaaaaaaaaaaaaaaaaa`aaaaaaaaaaaiiiiiiiiiii`jjiiff",
+"ffc`iiaaaaaaaaaaaaaaaaaaaaaaaaaaa`d`aaaaaaaaaaaaaaaaaaii`i`jjiff",
+"ffc`iiaakaakaakahh`akaakaakaakaaaa`aaaakaakaaaaaaaaadai`i`ijiiff",
+"ffc`iiaaaaaaaaaahh`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad`d`iiiiiff",
+"ffc`iiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakkkkkkaaaaaaa`d`iiiiiiff",
+"aaaaaaaakaaaaaakkkkkkkaaaaakkkkkkahdhahkkaaaadaaaaaaad`diiiiiiff",
+"aaaaaaaaaaaiiikkaaaaadaaaakkaaaadaaaaakkkaaaadaaaaaadaiidiiiiiff",
+"aaaaaaaaaaaiikkkaaaaaddaakkkaaaaddaaakkkkaaaaddkaakaaaiiibiiiiff",
+"aakaakaakaaikkkkaaaaaddakkkkaaaaddaaakkkkaaaaddaaaaaaaiiiibiiiff",
+"aaaaaaaaaaakkkkkaaaaaddakkkkaaaaddaaakkkkaaaaddaaaaaaaiikddddiff",
+"aaaaaaaaaaakkkkkaaaaaddakkkkaaaaddaaakkkkaaaaddaaakaaaikkaaadiff",
+"aaaaaaaaaaikkdkkakkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkaaaaaaakka`adiff",
+"````iiiiiiikkkkkkkdddddddddddddddddddddddddddddkaaaaaaakkaaadiff",
+"ffc`iiiiiiikkdkkkkaaaaaaaaaaaaaaaaaaaaaaaaaaaadkaakaaaakkaaadbff",
+"ffc`iiikkkkkkkkkkkaaaaaaaaaaaakffaaaaaaaaaaaaadkaaaaaaakka`adbff",
+"ffc`iikkdddddkkkkkaakdaaaaaaakfakfaaaaaaaakdaadkaaaaaaikkaaadbff",
+"ffc`ikkkdddddkdkkkaakdaaaaaaakfakfaaaaaaaakdaadkdakaaaikkddddbff",
+"ffc`ikkkdddddkkkkkaaaaaaaaaaaakfcaaaaaaaaaaaaadkdaaaaaikddddbbff",
+"ffc`ikkkdddaakkkkkaaaaaaaaaaaakfcaaaaaaaaaaaaadkdaaaaaageebbbbff",
+"ffc`ikkkdddaakkkkkaaaaaaaaaakfffcffaaaaaaaaaaadkdakaaaggeeiiiiff",
+"ffc`ikkkdddaakkkkkaaaaaaaaaaaakfcaaaaaaaaaaaaadkdaaaaaggeeiiiiff",
+"ffc`ikkkdddaakkkkkaaaaaaaaaaaakfcaaaaaaaaaaaaadkdaaaaageeaaaiiff",
+"ffc`ikkkdddaadkkkkaaaaaaaaaaaakfcaaaaaaaaaaaaadkdakaaaageeageeff",
+"ffc`ikkkdddaakkkkkaaaaaaakfffakfcakfffaaaaaaaadkdaaaaaggeeggeeff",
+"ffc`ikkkdddaakkkkkaakdaaaakfcakfcakcfaaaaakdaadkdaaaaaggeeggeeff",
+"ffc`ikkaaaaaakkkkkaakdaaaaakfccfcccfaaaaaakdaadkdakaaageeageeaff",
+"ffc`ikaaaabaakkkkkaaaaaaaaaakffffffaaaaaaaaaaadkdaaaaaaaaaaaaaaa",
+"ffc`iaaaabbakdkkkkaaaaaaaaaaaaaaaaaaaaaaaaaaaadkdaaaaaaaaaaaaaaa",
+"ffc`iibbbbbakkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdakaakaakaakaaka",
+"ffc`iiibbbbakkkkkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddaaaaaaaaaaaaaaa",
+"ffc`ifddbbbkkkkkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadddaaaaaaaaaaaaaaa",
+"ffc`ifddiiikkkkkdddddddddddddddddddddddddddddadddakaaaaaaaaaaaaa",
+"ffc`ifcciiikkdkkdddddddddddddddddddddddddddddaddaaaaaaiiiiiiii``",
+"ffc`iiiiiiikdkkkdddddddddddddddddddddddddddddaddaaaaaaiiiikaaaff",
+"ffc`ifddiiikkkkkdddddddddddddddddddddddddddddaddaakaaaiiihkaaadf",
+"ffc`ifddiiikkkkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddaaaaaaiihdkaaaff",
+"ffc`ifcciiikkkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadddaaaaaaihdikkkkdf",
+"ffc`iiiiiiikkaaa````aaaa````aaaa````aaaaaaaabdddaakaaaiiihdihdff",
+"ffc`ifddiiikaaa`dddaaaa`dddaaaa`dddaaaaaaaabbdddaaaaaaiihdihdiff",
+"ffc`ifddiiiaaaddddaaaaddddaaaaddddaaaaaaaabbbdddaaaaaaihdihdiiff",
+"ffc`ifcciiiibbdddddbbbddddddddddddddddddddddddddaakaaaiibiibiiff",
+"ffc`iiiiiiiiibbdddddddddddkiidddddddddddddddddddaaaaaaiiibiibiff",
+"ffjjjjjjjjjjjjjjjjkkdddddkkiiddkiiddddddddddjdddaaaaaaiiiiaibiff",
+"ffjjjjjjjjjjjjjjjjddaaaaakkddakkiiaakaakaakkdjakaakaaaiiikadiiff",
+"ffc`iiiiiiiik`diikddaaaaakddaakkddaaaaaaaakdjdaaaaaaaaiiiiaiiiff",
+"ffc`iiiiiiik`diiidddaaaaaaaakakddaaaaaaaaadddjaaaaaaaaiiaiiiaiff",
+"ffc`iiiiiik`diiiiiiaaaaaaaaaaaaaaaaaaaaaaaaajdaaaaaaaaikadikadff",
+"ffc`iiiiik`diiiiiiiiiiiiiiaaaaaaiiiiiiiiiiikdjiiiiiiiiiiaiiiaiff",
+"ffc`iiiik`diiiiiiiiiiiiiiiaakaaaiiiiiiiiiik`jdiiiiiiiiiiiiaiiiff",
+"ffc`iiik`diaaaaaaaaaaaaaaaaaaaaaiiiiiiiiik`ddjiiiiiibibiikadiiff",
+"ffc`iiiidiiaaaaaaaaaaaaaaaaaaaaaiidddddik`dijdiiiiiiiiiiiiaiiiff",
+"ffc`iiiiibiaakaakaakaakaakaakaaaiidiiiik`diidjiiiiiibibiiiiiiiff",
+"ffc`iiiiiibaaaaaaaaaaaaaaaaaaaaaiidiiik`diiijdiiiiiiiiiiiiiiiiff",
+"ffc`i`iiiiidaaaaaaaaaaaaaaaaaaaaiidiik`diiiidjiiiiiiiiiiiiiiiiff",
+"ffc`iiiiiiiadkdaaiiiiiiiiiiiiiiiiidiiidiiiiijdiiibiiiiiiiiiiiiff",
+"ffc````````ddddda```````````````````````````dj````````````````ff",
+"ffcccccccc`aaaaaacccccccccccccccccccccccccccjdcccccccccccccccfff",
+"ffffffffff`aakaaafffffffffffffffffffffffffffdfffffffffffffffffff",
+"ffffffffff`aaaaaafffffffffffffffffffffffffffffffffffffffffffffff"
+};
diff --git a/images/spacer.xpm b/images/spacer.xpm
new file mode 100644 (file)
index 0000000..da83be8
--- /dev/null
@@ -0,0 +1,11 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"126 2 2 1",
+/* colors */
+"+ c #3f3f3f",
+"# c #bfbfbf",
+/* pixels */
+"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#",
+"+#############################################################################################################################",
+};
diff --git a/images/stadium.xpm b/images/stadium.xpm
new file mode 100644 (file)
index 0000000..755dc61
--- /dev/null
@@ -0,0 +1,80 @@
+/* XPM */
+static char *noname[] = {
+/* width height ncolors chars_per_pixel */
+"64 64 9 1",
+/* colors */
+"` c #000000",
+"a c #7F7F7F",
+"b c #3F3F3F",
+"c c #007F00",
+"d c #997E4C",
+"e c #00E600",
+"f c #FFFFFF",
+"g c #CC7E66",
+"h c #BFBFBF",
+/* pixels */
+"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
+"cgggggggggggggegaaaaagegggegggeggggggghhhhhhhhhggggggggggggggggc",
+"cgggggeeggggggggaaaaagceggggggeggggghhhbbbbbbbhhhggggggggggggggc",
+"cggggccgggggggggaaaaaggggggggggggghhbbbbbbbbbbbbbhhggggggggggggc",
+"cgggggggggggeggeaaaaagggggggegeghhbbbbbbbbbbbbbbbgbhhggggggggggc",
+"cgggaaaaaaaaaaaaaaaaaggggggccgehbbbbbb````````bbbbbbbhgggggggggc",
+"cgegaaaaaaaaaaaaaaaaaggggggggghbbbbb``bbbbbbbb``bbbbbbhgggeggggc",
+"cgegaaaaaaaaaaaaaaaaaggeggegghbbbb``bbbbbbbbbbbb``bbbbbhgggggggc",
+"aaaaaaaaaaaaaaaaaaaaaggggcgghbbbb`bbbb```````bbbbb``bbbhgggggggc",
+"aaaaaaaaaaaaaaaaaaaaaggggggh`bbb`bbb``bbbbbbb``bbbb``bbbhggggggc",
+"aaaaaaaabaabaabaabaaagggggghbbb`bb``bbbbbbbbbbb``bbb`bbbhggggegc",
+"aaaaaaaaaaaaaaaaaaaaagggggh`bb````bbbb``````bbbbb`bb``bbbhgggggc",
+"aaaaaaaaaaaaaaaaaaaaagggghh`b```abb```bbbbbb``bbbb`````bbhgggggc",
+"cgggaaaaaaaaaaaaaaaaagegghhbb`b`bb``bbbbbbbbbb``bbb`a``bbhgggggc",
+"cgggaaaaaaaaaaaaaaaaaggghfhb`bb`b`bb`b`b`b`b`bbb`bb``bb`bbhggggc",
+"cgggaaaaaaaaaaaaaaaaaggghfhb`b`b`bbbbbbbbbbbbbbbb`bb`bb`bbhggggc",
+"cgggaaaaaaaaaaaaaaaaaggbffhb`b`b```````````````````b`bb`bbhggggc",
+"cgggaaaabaabaabaabaaagbbffhbbb``baabbbbbbbbbbbbbbb`b`bbb`bhggggc",
+"cgggaaaaaaaaaaaaaaaaa`bbffhbb`b`bbbbbbbbbbbbbbbbbb`bb`bb`bhggggc",
+"cgggaaaaaaaaaaaaaaaaaabfffhbb``b`````````````````bb`b`bb`bhdgggc",
+"cgegaaaaaaaaaaaaaaaaa`ffffhbb``b`cccccccchchcccc`bb`b`bb`bhdgggc",
+"cgcgaaaaaaaaaaaaaaaaafhfffhbb``b`ccccccchhhccccc`bb`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaafffffhbb``b`ccccccchccccccc`bb`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaafhfhfhbb``b`ceeeeeeeeeeeeec`bb`b`bb`bhdgggc",
+"cgggaaaabaabaabaabaaafhfffhbb``b`ceeeeeeeeeeeeec`bb`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaafffhhhbb``b`ceecceeeeecceec`bb`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaafhbhhhbb``a`ceeeeeeeeeeeeec`bb`b`bb`bhdeggc",
+"cgggaaaaaaaaaaaaaaaaafbbhfhbb``b`ceeeeeeeeeeeeec`ab`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaa`bbhhhbb``b`ceecceeeeecceec`bb`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaaabhhhhbb``b`ceeeeeeeeeeeeec`bb`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaa`hfhhhbb``a`ceeeeeeeeeeeeec`bb`b`bb`bhdgggc",
+"cgggaaaabaabaabaabaaaghhhhhbb``b`ccececececececc`ab`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaaghhhhhbb``b`ceeeeeeeeeeeeec`bb`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaaghhhhhbb``b`ceeeeeeeeeeeeec`bb`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaaghhhhhbb``a`ceecceeeeecceec`bb`b`bb`bhdgggc",
+"cgegaaaaaaaaaaaaaaaaaghhhhhbb``b`ceeeeeeeeeeeeec`ab`b`bb`bhdggec",
+"cgggaaaaaaaaaaaaaaaaaghbhhhbb``b`ceeeeeeeeeeeeec`bb`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaagbbhhhbb``b`ceecceeeeecceec`bb`b`bb`bhdgggc",
+"cgggaaaabaabaabaabaaa`bbhhhbb``b`ceeeeeeeeeeeeec`bb`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaaabhhhhbb``b`ceeeeeeeeeeeeec`bb`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaa`hhhhhbb``b`cccccccchchcccc`bb`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaaghhhhhbb``b`ccccccchhhccccc`bb`b`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaaghhhhhbb`b``ccccccchccccccc`b`bb`bb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaaghhhhhbbb```````````````````b`b`bbb`bhdgggc",
+"cgggaaaaaaaaaaaaaaaaaghhhhhb`b``bbbbbbbbbbbbbbbbbb`b`bbb`bhdeggc",
+"cgggaaaabaabaabaabaaaghhhhha`bbb```````````````````b`bb`b`hdgggc",
+"cgggaaaaaaaaaaaaaaaaaghhhhaa`bbbb`bbbbbbbbbbbbbb``b`bbb`bhddgggc",
+"cgggaaaaaaaaaaaaaaaaaghhhaaaf``bbb``b`b`b`b`b```bbb``b`bbhddgggc",
+"aaaaaaaaaaaaaaaaaaaaagahaaaaf````bb````bbbbb```bb``a```bhdddgggc",
+"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaf``b``bbb``````bbbb``b```bbhdddgggc",
+"aaaaaaaaaaaaaaaaaaaaagaaa`aaahbbbb``bbbbbbbbbbb``bbb`bbhddddgggc",
+"aaaaaaaaaaaaaaaaaaaaag`aaaaaah```bbb``bbbbbbb``bbbb``bhdddcdgggc",
+"aaaaaaaabaabaabaabaaaggaaa`aaah```bbbb```````bbbbb``bhbddddgeggc",
+"cggggaaaaaaaaaaaaaaaagggaaaaabah`b``bbbbbbbbbbbb``bbhbbdcddggggc",
+"cgggegaaaaaaaaaaaaaaagggaaaabaaahhbb``bbbbbbbb``bbbhbbddddgggggc",
+"cgggggeaaaaaaaaaaaaaaggggaabaaabaahhbb````````bbbhhbbdddddgggegc",
+"cgggggggaaaaaaaaaaaaaggggeaaaabaaaaahhbbbbbbbbbhhfbddddddggggggc",
+"cgccggggggegaaaaaagggegggeeaabaaaabaaahhhhhhhhhabbbddcddgggggggc",
+"cgggeggggeegaaaaaagggggggceeaaaaabaaabaabbbbbbbbbbdddddggggggggc",
+"cgggeeggggggaaaaaaggggggggeeeaaabaaabaababbb`bbbddddddgggggggggc",
+"cggccgggggggaaaaaaggggggggcgcgdaaaabaabababbbbbddddcdggggggggggc",
+"cggeggggggggaaaaaaggggggggggggdgbabaabababbbbdddccddeeggeegggggc",
+"cgggggggggggaaaaaageggggggggeggdgbbbbbbbbbbdddddddddegggeggggggc",
+"ccccccccccccaaaaaacccccccccccccccccccccccccccccccccccccccccccccc"
+};
diff --git a/images/tiles-0.xpm b/images/tiles-0.xpm
new file mode 100644 (file)
index 0000000..1508ed3
--- /dev/null
@@ -0,0 +1,115 @@
+/* XPM */
+static char *tiles__[] = {
+/* columns rows colors chars-per-pixel */
+"96 96 13 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c #00007F7F0000",
+"o c gray50",
+"O c #00000000E6E6",
+"+ c #66666666E6E6",
+"@ c #99997E7E4C4C",
+"# c red",
+"$ c #FFFF7B7B0000",
+"% c #CCCC7E7E6666",
+"& c yellow",
+"* c gray75",
+"= c gray100",
+/* pixels */
+"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
+"&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%#%#%#%#%#%#%%%%%%%%%%%%&",
+"&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.............%%%%%%%%%%%%&",
+"&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.*.*.*.*.*.*.%%%%%%%%%%%%&",
+"&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   %%%%%%%%%%%%%%%%ooooooooo.*.*.*.*.*.*.%%%%%%%%%%%%&",
+"&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.% ..%%%%%%%%%%%%%%@%oooooooooo.............+%%%%%%%%%@%&",
+"&%%%%%@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%.% %%%%%%%%%%%%%%%%%%oooooo*oooo....ooo.o....%%%%%%%%%%%%&",
+"&%oooooooooooooooooooooooo%%%%%%%%%%%.% %*%%%%%%%%%%%%%%%%oooo*ooooooo....o.o.o....%%%%%%%%%%%%&",
+"&%%%%%%%%%%%%%%%%%%%%%%%@o%%%%%%%%%%.%  %%%%%%%%%%%%%%%%%ooooooooooooo....ooo.o....%%%%%%%%%%%%&",
+"&%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%  %%%%%%%%%%%%%%%%oooo*oooo%%%%%....o.o.oo...%%%%%%%%%%%%&",
+"&%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%% %%%%%%%%%%%%%%%%%oooooooo%%%%%%....ooo.o....%%%%%%%%%%%%&",
+"&%%%%+%%%%%%%+%%%%%%%+%%%%%%+%%%%%%+%%%%%%+%%%%%%+%%%%%+oooooooo+%%%%+.............+%%%%%+%%%%%&",
+"&#............................................................................................#&",
+"&%.**......................................................................................**.%&",
+"&#..........................................................................*.................#&",
+"&%.**.......................................................................*........ooo...**.%&",
+"&#..........................................................................*........o..oo....#&",
+"&%.**.o.ooo..........................................................................o.....**.%&",
+"&#....o.o.o...****...****...****...****...****...****...****...****...****....****............#&",
+"&%.**.ooooo..........................................................................ooo.o.**.%&",
+"&#...................................................................................o.o.o....#&",
+"&%.**.......................................................................*........o.ooo.**.%&",
+"&#..........................................................................*.................#&",
+"&%.**.......................................................................*..............**.%&",
+"&#..........................................................................*.................#&",
+"&%%%%+oooooooo+%%%%%%+%%%%%%+%%o%%%+%%%%%%+%%%%%%+%%%%%+oooooooo+%%%%+.............+%%%%%+%%%%%&",
+"&%%%%%oooooooo%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%oooooooo%%%%%%.............%%%%%%%%%%%%&",
+"&%%%%%ooo*oooo%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%ooo*oooo%%%%%%.............%%%%%%%%%%%%&",
+"&%%%%%oooooooo%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%@%%%%%%%%%oooooooo%%%%%%......*......%%%%%ooo%%%%&",
+"&%%%%%oooooooo%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%oooooooo%%%%%%......*......%%%%%%%o%%%%&",
+"&%%%%%ooo*oooo%%%%%%%%%%%%%%%%%oooooooooooooo%%%%%%%%%%%ooo*oooo%%%%%%......*......%%%*..%o%%%%&",
+"&%%%%%oooooooo%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%o%%%%%%%%%%%oooooooo%%%%%%......*......%%%*..%o%%%%&",
+"&%%%%%oooooooooooooooooooooooooo%%%%%%%%%%%%o%%%%%%%%%%%oooooooo%%%%%+.............+%%*oo%o%%%%&",
+"&%%%%%ooo*oooo%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%oooooooo%%%%%%.............%%%%%%%o%%%%&",
+"&%%%%%oooooooo%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%**************ooo%%%%%%.............%%%%%%%o%%%%&",
+"&%%%%oooooooooo%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%**************ooo%%%%%%......*......%%%%%%%o%%%%&",
+"&%%%ooooo*ooooooo=====oooooooooooooooooooooooo **********.***ooo%%%%%%......*......%%%%%%%o%%%%&",
+"&%%%oooooooooooooo===ooooooooooooooooo=ooooooo **************ooo%%%%%%......*......%%%%%%@o%%%%&",
+"&%%%ooooooo*ooooooo=ooooooooooooooo=oo=oooooo  ******#*******ooo%%%%%%......*......%%%%%%%o%%%%&",
+"&%%%oooooooooooooo*=ooooooooooooooo=====ooooo  *****.********ooo%%%%%+.............+%%%%%%o%%%%&",
+"&%%%oooooooooooooo==ooooooooooooooooo.*ooooo.  ****.*********ooo%%%%%%.............%%%%%%%o%%%%&",
+"&%%%ooooooooo===@=*===@==ooo*oooo*oooo=oooo.o  *****o****#***ooo%%%%%%.............%%%%%%%o%%%%&",
+"&%%%oooooooooo*=@=*===@*oooooooooooooooooo.o. .******o**.****ooo%%%%%%......*......%%%%%%%o%%%%&",
+"&%%%oooooooooooo*=*==*oo****************o.o.o. **********o***ooo%%%%%%......*......%%%%%%%o%%%%&",
+"&%%%oooooooooo*********.*#**************.o.o.  **************ooo%%%%%%......*......%%%%%%%o%%%%&",
+"&%%%*********.*#*******.***=o**=o**=o***o.o.o  **********.***ooo%%%%%%......*......%%%%%%%o%%%%&",
+"&%%.*#*******.***=o*=o*.***=o**=o**=o***.o.o.  **************ooo%%%%%+.............+%%%%%%o%%%%&",
+"&%..***=o*=o*.***=o*=o*.****************o.o.o  **************ooo@%%%%%.............%%%%%%%o%%%%&",
+"&%..***=o*=o*.*********.****************.o.o.       .      ooooo%%%%%%.............%%%%%%%o%%%%&",
+"&%..*********.*********.****************o.o.o      .     ooooooo%%%%%%......*......%%%%%%%o%%%%&",
+"&%..*********.*********.****************.o.o............oooooooo%%%%%%......*......%%%%%%%o%%%%&",
+"&%..*********.*********.***=o**=o**=o***o.o............ooo*ooooo%%%%%%......*......%%%%%%%o%%%%&",
+"&%..*********.***=o*=o*.***=o**=o**=o***.o............oooooooooo%%%%%%......*......%%%ooooo%%%%&",
+"&%..***=o*=o*.***=o*=o*.*#**************o...............oooooooo%%%%%+.............+%%o%%%%%%%%&",
+"&%..***=o*=o*.*#*******.****************................oooooooo%%%%%%.............%%%o%%%%%%%%&",
+"&%..*#*******.*********.OOOOOOOOOOOOOOO**ooooooooooo....oo*ooooo%%%%%%.............%%%o%%%%%%%%&",
+"&%..*********.OOOOOOOOOOOOOOOOOOOOOOOO+***oooooooooo....oooooooo%%%%%%......*......%%%o%%%%%%%%&",
+"&%.OOOOOOOOOOOOOOO   OOOO  OOOO   OOO++***=ooooooooo....oooooooo%%%%%%......*......%%%o%ooo%%%%&",
+"&%.OOOOOO...OOOOOO...OOOO..OOOO...OO+++***oooooo..oo....oooooooo%%%%%%......*......%%%o%...%%%%&",
+"&%%@@@@@....@@@@@ ...@@@ ..@@@ ...  +O+*****oooooooo....oo*ooooo%%%%%+......*......+%%o%%%%%%%%&",
+"&%%%%%oooooooo....................  +++******ooooooo....oooooooo%%%%%%.............%%%o%%%%%%%%&",
+"&%%%%o. oooo@@@oooooooooo..   ...... ++******ooooooo..oooooooooo%%%%%%.............%%%o%ooo%%%%&",
+"&%%%o.   ooo@@@oooooooooooo   oooooo O+***==****==**..oooooooooo%%%%%%.............%%%o%...%%%%&",
+"&%% o   oooooooooooooooooooooooooo  +++***oo****oo**..o=oo*ooooo%%%%%%......*......%%%o%%%%%%%%&",
+"&%.*oo ooooooooooooooooooooooooooo@ +O+*************..*=oooooooo%%%%%%......*......%%%o%%%%%%%%&",
+"&%..oooooooo.............ooooooooo@ +++*************..==oooooooo%%%%%%......*......%%%o%ooo%%%%&",
+"&%..ooooooo...o..o..o.....oooooooo@ +++*************..==oooo=ooo%%%%%+......*......+%%o%...%%%%&",
+"&%.*oooooo..............o..ooooooo  +++***==****==**.o==ooo==ooo%%%%%%.............%%%o%%%%%%%%&",
+"&%..oooooo.@@@@@@@@@@@@....ooooooooo O+***oo****oo**oo=======ooo%%%%%%.............%%%o%%%%%%%%&",
+"&%..oooooo.@@@@@@@@@@@@@...o++oooooo ++*************oo=====o=ooo%%%%%%.............%%%o%%%%%%%%&",
+"&%.*oooooo.........%%%%%.o.o++oooooo+++*#*********#*.o==oooooooo%%%%%%......*......%%%o%%%%%%%%&",
+"&%..oooXXo.........%%%%@...o++oooo  +++*************..==oooooooo%%%%%%......*......%%%o%%%%%%%%&",
+"&%..oooXXo.........%%%%%...ooooooo@ ++................==ooooooooo%%%%+......*......+%%o%%%%%%%%&",
+"&%.*oooXXo.........%%%%%.o.ooooooo@ +O*oooooooooooo..o*=oo*ooooooooooo......*......%%%o%%%%%%%%&",
+"&%..oooooo.........%%%%@...ooooooo@ ++***==****==**.ooo=oooooooooooooo.............oooo%%%%%%%%&",
+"&%..oooooo.........%%%%%...ooooXXo@ ++***oo****oo**.oooooooooooooooooo.............%%%%%%%%%%%%&",
+"&%..oooooo.........%%%%%.o.ooooXXo@ O+*************.ooooooooo*oo*oo*oo.............%%%%%%%%%%%%&",
+"&%..oooooo.........%%%%@...ooooXXo@ ++*************.oooooooooooooooooo......*......%%%%%%%%%%%%&",
+"&%.*oooooo.........%%%%%...ooooooo  ++***==****==**.oooooo*ooooooooooo......*......%%%%%%%%%%%%&",
+"&%..oooooo.       %%%%%%.o.ooooooooo +***oo****oo**.oooooooooooooooooo......*......%%%%%%%%%%%%&",
+"&%..oooooo.      %%%%%%%...ooooooooo +*#*********#*.ooooooooooooo%%%%+......*......+%%%%%%%%%%%&",
+"&%.*ooooooo.%%%%%%%%%%%...oooooooo  ++*************.oooooo*ooooo%%%%%%.............%%%%%%%%%%%%&",
+"&%..oooooooo.............ooooooooo@ +...............oooooooooooo%%%%%%.............%%%%%%%%%%%%&",
+"&%..oooooooooooooooooooooooooooooo@ +*oooooooooooo..oooooooooooo%%%%%%.............%%%%%%%%%%%%&",
+"&%.*ooooooooooooooo@@@oooooooooooo@ +*************.ooooooooooooo%%%%%%...ooo.ooo...%%%%%@%%%%%%&",
+"&%..ooooooooooooooo@@@oooooooooooo  +***==****==**.ooooooooooooo%%%%%%.....o.o.....%%%%%%%%%%%%&",
+"&%...ooooooooooooooooooooooooooooooo ***oo****oo**.ooooooooooooo%%%%%%....oo.ooo...%%%%%%%%%%%%&",
+"&%....oooooooooooooooooooooooooooooo *#*********#*.ooooooooooooo%%%%%+.....o.o.o...+%%%%%%%%%%%&",
+"&%%...*...*..*...*...*..*.oooooooo  +*************@%%%%%%%%%%%%%%%%%%%...ooo.ooo...%%%%%%%%%%%%&",
+"&%%%.......................oo$$ooo@ +............@@%%%%%%%%%%%@%%%%%%%.............%%%%%%%%%%%%&",
+"&%%%%@@@@@@@@@@@@@@@@@@@...oo$$ooo% ............@@@%%%%%%%%%%%%%%%@%%%.*.*.*.*.*.*.%%%%%%%%%%%%&",
+"&%%%%%%@@@@@@@@@@@@@@@@@@..oo$$ooo%%%@@@@@@@@@@@@@@%%%%%%%%%%%%%%%%%%%.*.*.*.*.*.*.%%%%%%%%%%%%&",
+"&%%@%%%%%%%%%%%%%%%%%%%%.. ooooooo%%%%@@@@@@@@@@@@@%%%%%%%%%%%%%%%%%%%.............%%%%%%%%%%%%&",
+"&%%%%%%%%%%%%%%%%%%%%%%%.. oooooo%%%%%%%%%%%%%%%%%%%%%@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&",
+"&%%%%%%%%%%%%%%%%%%%%%%%..ooooooo%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%#%#%#%#%#%#%%%%%%%%%%%%&",
+"&&&&&&&&&&&&&&&&&&&&&&&&&.oooooo&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"
+};
diff --git a/images/tiles-1.xpm b/images/tiles-1.xpm
new file mode 100644 (file)
index 0000000..9e1776e
--- /dev/null
@@ -0,0 +1,84 @@
+/* XPM */
+static char *tiles__[] = {
+/* columns rows colors chars-per-pixel */
+"64 64 14 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c #00007F7F0000",
+"o c gray50",
+"O c #00000000E6E6",
+"+ c #66666666E6E6",
+"@ c #0000E6E60000",
+"# c #99997E7E4C4C",
+"$ c red",
+"% c #FFFF7B7B0000",
+"& c #CCCC7E7E6666",
+"* c yellow",
+"= c gray75",
+"- c gray100",
+/* pixels */
+"&&&&&&&&&&&&&&&&&===============&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
+"&&&&&&&&&&&&&&&&==$oooooooooooo$.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
+"&&&&&&&===========ooooooooooooooo.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
+"******==%ooooo====oooooooooooooooo.*****************************",
+"*&&&&===ooooo=====oooooooooooooo.oo.&&&&&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&&====ooooo=====ooooooooooooo.  oo.&&&&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&=====ooooo=====oooooooooooo.  oooo.&&&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&=====ooooo=====ooooooooooo.  ooooo.&&&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&=====o-.oo=====oooooooooo+  oooooo.&&&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&=o===o-.oo===-=ooooooooo++Oooooooo.&&&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&oo===ooooo==-o=oooooooo.+Ooooooooo.&&&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&o====ooooo=-o==ooooo.o.  ooooooooo.&&&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&=====ooooo=o===oooooo.  ooooo.oooo.&&&&&&&&&&&.&&.&&.&&.&&.&*",
+"*&&=====ooooo=====oooooo  ooooo.  ooo.&&&&&&&&&&.&&.&&.&&.&&.&&*",
+"*&&=o===ooooo=====ooooo.oo.ooo.  oooo.&&&&&&&&&&&#&&#&&#&&#&&#&*",
+"*&&=====ooooo=====ooooooooooo.  ooooo.#&&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&=o===ooooo=====oooooooooo+  oooooo.##&&&&&&&&&.&&&&&&&&&&&.&*",
+"*&&=====ooooo=====ooooooooo++Oooooooo.##&&&&&&&&.&&&&&&&&&&&.&&*",
+"*&&=o===ooooo=====oooooooo.+Ooooooooo.##&&&&&&&&&#&&&&&&&&&&&#&*",
+"*&&=====ooooo=====ooooo.o.  ooooooooo.##&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&=o===ooooo===-=oooooo.  ooooo.oooo.##&&&&&&&&&.&&&&&&&&&&&.&*",
+"*&&=====ooooo==-o=oooooo  ooooo.  ooo.##&&&&&&&&.&&&&&&&&&&&.&&*",
+"*&&====-.oooo=-o==ooooo.oo.ooo.  oooo.##&&&&&&&&&#&&&&&&&&&&&#&*",
+"*&&===-oooooo=o===ooooooooooo.  ooooo.##&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&==-o=ooooo=====o oooooooo+  oooooo.##&&&.&&.&&.&&&&&&&&&&&.&*",
+"*&&=-o==ooooo=====ooooooooo++Oooooooo.##&&.&&.&&.&&&&&&&&&&&.&&*",
+"*&&-o===ooooo=====oooooooo.+Ooooooooo.##&&&#&&#&&#&&&&&&&&&&&#&*",
+"*&&o===-.oooo=====ooooo.o.  ooooooooo.##&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&===-oooooo=====o oooo.  ooooo.oooo.##&&&.&&&&&&&&&&&&&&&&&.&*",
+"*&&==-o=ooooo=====oooooo  ooooo.  ooo.##&&.&&&&&&&&&&&&&&&&&.&&*",
+"*&&=-o==ooooo=====ooooo.oo.ooo.  oooo.##&&&#&&&&&&&&&&&&&&&&&#&*",
+"*&&-o===ooooo===-=ooooooooooo.  ooooo.##&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&o====ooooo==-o=o oooooooo+  oooooo.##&&&.&&&&&&&&&&&&&&&&&.&*",
+"*&&=====ooooo=-o==ooooooooo++Oooooooo.##&&.&&&&&&&&&&&&&&&&&.&&*",
+"*&&=====ooooo=o===oooooooo.+Ooooooooo.##&&&#&&&&&&&&&&&&&&&&&#&*",
+"*&&===o=ooooo=====ooooo.o.  ooooooooo.##&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&==oo=o-.-.=====o oooo.  oooooooooo.##&&&.&&&&&&&&&&&&&&&&&.&*",
+"*&&=o=o=o-.-.=====oooooo  oooooooooo.###&&.&&&&&&&&&&&&&&&&&.&&*",
+"*&&o==o=ooooo=====ooooo.oo.oooooooo.####&&&#&&&&&&&&&&&&&&&&&#&*",
+"*&&==oo=o-.-.=====oooooooooooooooo..####&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&=o=o=ooooo===o=ooooooooooooooo.o.####&&&.&&.&&.&&.&&.&&.&&.&*",
+"*&&o==o=o-.-.=====$oooooooooooo$.oo.####&&.&&.&&.&&.&&.&&.&&.&&*",
+"*&&==oo=ooooo=o==o..............ooo.####&&&#&&#&&#&&#&&#&&#&&#&*",
+"*&&=o=o=o-.-.===o..............oooo.####&&&&&&&&&&&&&&&&&&&&&&&*",
+"*&&o==o=o-.-.==o..............ooooo.#...oooXXooooooooooooooo&&&*",
+"*&&==o==ooooo=o..............ooo oo.#...oooXXooooooooooooooo&&&*",
+"*&&=o===oooooo..............ooooooo.#...oooXXooooooooooooooooooo",
+"*&&o====oooooooooooooooooooooooo oo.#..ooooooooooooooooooooooooo",
+"*&&=====ooooooooooooo*ooooooooooooo.#.oooooooooooooooooooooooooo",
+"*&&=====oo.ooooooo*o*oooo.oooooo oo..ooooooooooooooooooooooooooo",
+"*&&=====ooooooooo***ooooooooooooooo.#ooooooooooooooooooooooo&&&*",
+"*&&=====oo.ooooo***oooooo.oooooo oo.#ooooooooooooooooOOooooo&@&*",
+"*&&=====ooooooo*o*ooooooooooooooooo.#ooooooooooooooooOOooooo@&&*",
+"*&&=====oo.ooo*oooooooooo.oooooo oo.#ooooooooooooooooOOooooo&&&*",
+"*&&=====%ooooooooooooooooooooooooo%.#ooooooooooooooooooooooo&&&*",
+"*&&=====............................#ooooooooooooooooooooooo&@&*",
+"*&&====............................##ooooooooooooooooooooooo&&&*",
+"*&&===............................###oo##ooooooooooooooooooo&@&*",
+"*&&==.... .. ............ ... ...####oo##oooOOoXXooooooooooo&&&*",
+"*&&=............................#####oo##oooOOoXXooooooooooo@@&*",
+"*&&&#################################oooooooOOoXXooooooooooo&&&*",
+"*&&&&##########################X##X##@&&@&&@&&@&&@&oooo&&&&&&&&*",
+"*&&&&&###############################&&&&&&&&&&&&&&oooo&&@&@&&&*",
+"***************************************************oooo*********"
+};
diff --git a/images/tiles-10.xpm b/images/tiles-10.xpm
new file mode 100644 (file)
index 0000000..816c9c3
--- /dev/null
@@ -0,0 +1,53 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 15 1",
+"  c black",
+". c #00003F3F0000",
+"X c #3F3F3F3F0000",
+"o c #3F3F3F3F3F3F",
+"O c #7F7F3D3D0000",
+"+ c #727272727272",
+"@ c gray50",
+"# c #3C3C0000BFBF",
+"$ c #3C3C0000FFFF",
+"% c #0000BFBF0000",
+"& c #FFFF3C3C0000",
+"* c yellow",
+"= c gray75",
+"- c #DFDFDFDFDFDF",
+"; c gray100",
+/* pixels */
+"                                ",
+"  ----------------------------  ",
+" - -------------------------- + ",
+" -- ------------------------ ++ ",
+" ---                        +++ ",
+" --- ###################### +++ ",
+" --- ###################### +++ ",
+" --- #$#$#$#$#$#$#$#$#$#$#$ +++ ",
+" --- $#$#$#OOOOO#$#$#$#$#$# +++ ",
+" --- #$$$#$OXXXX$#$$$#$$$#$ +++ ",
+" --- $$$$$$OoXoX$$$$$$$$$$$ +++ ",
+" --- $$$$$$OXXXX$$$$$$$$$$$ +++ ",
+" --- $$$$$$OoX@@@@@@@$$$$$$ +++ ",
+" --- $$$$$$OXX;=======$$$$$ +++ ",
+" --- $$*@@@@oX;=o=o=o=$$$$$ +++ ",
+" --- $$*&&&&&X;=======$$$$$ +++ ",
+" --- $$*&&&&&X;=o=o=o=$$$$$ +++ ",
+" --- $$*&@&@&X;=======$$$$$ +++ ",
+" --- ..*&&&&&X;=o=o=o=..... +++ ",
+" --- ..*&&&&&X;=======..... +++ ",
+" --- ..*&@&@&X;=o=o=o=..... +++ ",
+" --- ..*&&&&&X;=======..... +++ ",
+" --- ..*&&&&&.;=o=o=o=...%. +++ ",
+" --- .%*&@&@&.;=======%.%.% +++ ",
+" --- %.%&&&&&%;=o=o=o=.%.%. +++ ",
+" --- %%%%%%%%%%=======%%%%% +++ ",
+" --- %%%%%%%%%%%%%%%%%%%%%% +++ ",
+" ---                        +++ ",
+" -- ++++++++++++++++++++++++ ++ ",
+" - ++++++++++++++++++++++++++ + ",
+"  ++++++++++++++++++++++++++++  ",
+"                                "
+};
diff --git a/images/tiles-100.xpm b/images/tiles-100.xpm
new file mode 100644 (file)
index 0000000..555d466
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++++++++++++++++++XXX++++++++++++++++++++++++",
+"++++++++++++++++++++X....+++++++++++++++++++++++",
+"+++++++++++++++++++XXXX..X++++++++++++++++++++++",
+"+++++++++++++++++++XXX.oXX++++++++++++++++++++++",
+"++++++++++++++++++XXXX.o.X++++++++++++++++++++++",
+"++++++++++++++++++OOXX...+++++++++++++++++++++++",
+"++++++++++++++++++XXXX.X..++++++++++++++++++++++",
+"++++++++++++++++++XXXXXX..++++++++++++++++++++++",
+"++++++++++++++XXX+OOXXXX.+++++++++++++++++++++++",
+"+++++++++++++OXXX+XXXXXX..++++++++++++++++++++++",
+"+++++++++++++XXXXXXXXXXXXXX+++++++++++++++++++++",
+"+++++++++++++OXXX XXXXXX.XX..X++++++++++++++++++",
+"++++++++++++++XXXXOOXXXXX....X.+++++++++++++++++",
+"++++++++++++++XXXXXXXXXXXXX.XXX.+X.+++++++++++++",
+"+++++++++++++++XXXXXXXXXXXX.XXX.XX.+++++++++++++",
+"++++++++++++++XOXXXXXXXXX..........+++++++++++++",
+"++++++++++++++XOXXXOXXXXXXX........+++++++++++++",
+"+++++++++++++++XXXXXXXXXXXXXX.++..++++++++++++++",
+"++++++++++++++++XX+XXXXXXXX...+++..+++++++++++++",
+"++++++++++++++++++++XXXXXXX...++++++++++++++++++",
+"+++++++++++++++++++XXXXXXXX.X.++++++++++++++++++",
+"+++++++++++++++++++XXXXXXXX.X..+++++++++++++++++",
+"++++++++++++++++++++OXXXXXXX..X.++++++++++++++++",
+"++++++++++++++++OXXXOXXXXXXXX.XX++++++++++++++++",
+"++++++++++++++++XXOXXXXXXXXXX....+++++++++++++++",
+"++++++++++++++++XXXXXXXXXXXXX.XXXX++++++++++++++",
+"++++++++++++++++XXOXXOXXXXX.X..X...+++++++++++++",
+"++++++++++++++++XXXXXXXXXXX.X..X...+.+++++++++++",
+"+++++++++++++++++XXXXOXXXXXXX...XX....++++++++++",
+"+++++++++++++++++XXXXXXXXXXX..+.......++++++++++",
+"++++++++++++++++++XXXXXXXXXXX.++.....+++++++++++",
+"+++++++++++++++++++++XXOXXXX..++....++++++++++++",
+"++++++++++++++++++++++XXXXXX..++...+++++++++++++",
+"+++++++++++++++++++++++XXXXXX.++..++++++++++++++",
+"+++++++++++++++++++++++XXXXXX.++++++++++++++++++",
+"+++++++++++++++++++++++XOXXX..++++++++++++++++++",
+"++++++++++++++++++++++++OXXX..++++++++++++++++++",
+"+++++++++++++++++++++++XXXX...++++++++++++++++++",
+"++++++++++++++++++++++++XXXX..++++++++++++++++++",
+"++++++++++++++++++++++++OXXX..++++++++++++++++++",
+"+++++++++++++++++++++++XXXXX..++++++++++++++++++",
+"++++++++++++X++++++++++XXXXX.+++++++++++++++++++",
+"+++++++++++++XXXX+++++XXXXX.++++++++++++++++++++",
+"++++++++++++++XXXXXXXXXXXXX.++++++++++++++++++++",
+"+++++++++++++++XXXXXXXXXXX.+++++++++++++++++++++",
+"+++++++++++++++++X+.XX.X..++++++++++++++++++++++",
+"++++++++++++++++++++++.+++++++++++++++++++++++++"
+};
diff --git a/images/tiles-101.xpm b/images/tiles-101.xpm
new file mode 100644 (file)
index 0000000..8a13752
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++X+++++++++++++++++++++++++++++++++++++++++++",
+"+++X++++++++++++++++++++++++++++X+XXX+++++++++++",
+"++XXX++++++++++++++++++++++++XXXXXXXXX++++++++++",
+"++XX++++++++++++++X+XO++++++XXXXXXXXXX++++++++++",
+"+XXX++++++++++++XXXXXXXX+++XXXOOXXXX++++++++++++",
+"+XXX+++++++++++XXXXOXXOX++++XXXXXX X++X+++++++++",
+"+XXX+++++++++++XXXXOXXOX+++++XXXOOOXXOXOOX+X++++",
+"+XXX+++++++++++XXXXXXXXXOXXXXXOXXXXXXXXXXXXXX+++",
+"+XXX+++++++++++XXXXOXXXXOXXXXXXXXXXXXXXXXXXXXX++",
+"+XX+++++++++++XXXOXOXXXXXXXXXXXXXXXXXXXXXXXXXX.+",
+"+XXX++++++++X+OXXXXXXXXXXXXXXXXXXXXXXXX.ooo.XX++",
+"+XXXX+XX+XXXXXOXXXXXXXXXXXXXXXXXXXXXXXXX.XX.XX++",
+"+.XXXXOOXOXOXXXXXXXXXXXXXXXXXXXXXX.X.........+++",
+"+.XXXXXXXXXXXXXXXXXXXXXXXXXXXXX.X..X.+.++XX+++++",
+"+..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX++++++++++++",
+"++...X..XXXXXXXXXX.XXXXXX.X..X..X..+++++++++++++",
+"+++.+.....X..X..XXXXXXXX..X..X.....+++++++++++++",
+"++++++..+.....+......X..X.......X.X+++++++++++++",
+"++++++++++++++++..X..X..X.++++..X.++++++++++++++",
+"+++++++++++++++...XXXXXX.++++....+++++++++++++++",
+"+++++++++++++....XX....+++++....++++++++++++++++",
+"+++++++++++++.........+++++.....X+++++++++++++++",
+"++++++++++++++.....+++++++++.+...+++++++++++++++",
+"++++++++++++++....++++++++++++++++++++++++++++++",
+"+++++++++++++++....+++++++++++++++++++++++++++++",
+"+++++++++++++++++.++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-102.xpm b/images/tiles-102.xpm
new file mode 100644 (file)
index 0000000..33945ab
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++++++++++++++XXXXXXX++++++++++++++++++++++++",
+"+++++++++++++++XXXXXXXXXXXX+++++++++++++++++++++",
+"++++++++++++++X.XX....XXXXXX++++++++++++++++++++",
+"+++++++++++++....++.++.XXXXX++++++++++++++++++++",
+"++++++++++++.++++++++++...XX++++++++++++++++++++",
+"+++++++++++++++++++++++.X.XX.+++++++++++++++++++",
+"+++++++++++++++++++++++...XX.+++++++++++++++++++",
+"+++++++++++++++++++++++..XXX.+++++++++++++++++++",
+"+++++++++++++++++++++++..XXX.+++++++++++++++++++",
+"+++++++++++++++++++++++.XXXX.+++++++++++++++++++",
+"++++++++++++++++++++++...XXX.+++++++++++++++++++",
+"++++++++++++++++++++++..XXXX.+++++++++++++++++++",
+"+++++++++++++++++++++++.XXXX.++XX.++++++++++++++",
+"++++++++++++++++++++++XXXXXX.++XX.X+++++++++++++",
+"+++++++++++++++++++O+XXXOXXX.++XX..X++++++++++++",
+"+++++++++++++++++OXOXXXXXXXX.+.X...X.+++++++++++",
+"++++++++++++++++XXXXXXXXXXXXXXXXX.XX++++++++++++",
+"++++++++++++++++XXX.XXXOXXXXXX....+X++++++++++++",
+"++++++++++++++++XXX.XXXXXXXX.XX...++++++++++++++",
+"++++++++++++++++XXX.XXOXXXXX.XX..+++++++++++++++",
+"++++++++++++++++X...XXXXXXXXXX...+++++++++++++++",
+"++++++++++++++++....XXXXXXXX.X..++++++++++++++++",
+"++++++++++++++++....XXXXXXXX...+++++++++++++++++",
+"+++++++++++++++++++.XXXXXXXX...+++++++++++++++++",
+"+++++++++++++++++++XXXXXXXXX...+++++++++++++++++",
+"+++++++++++++++++++XXXOXXXXX..++++++++++++++++++",
+"+++++++++++++++++++XXXXXXXXX.+++++++++++++++++++",
+"++++++++++++++++XX+XXOXXXXXX.+++..++++++++++++++",
+"+++++++++++++++XOXOXXXXXXXXXX.+XX.++++++++++++++",
+"+++++++++++++++XXXXXOXXXXXXXX.XX..++++++++++++++",
+"++++++++++++++XXX.XXXXXXXX.X......++++++++++++++",
+"++++++++++++++XXX.XXXXXXX..X......++++++++++++++",
+"++++++++++++++XX...XOXXXX.XX...+.+++++++++++++++",
+"++++++++++++++XX...XXXXXX.....++++++++++++++++++",
+"+++++++++++++XX..+.XXXXX...+.+++++++++++++++++++",
+"+++++++++++++XX..+.XXXXXX.++++++++++++++++++++++",
+"++++++++++++++..++.XXXX..+++++++++++++++++++++++",
+"++++++++++++++++++..XXX..+++++++++++++++++++++++",
+"++++++++++++++++++...XX..+++++++++++++++++++++++",
+"++++++++++++++++++.o.X.o.+++++++++++++++++++++++",
+"++++++++++++++++++.oXX.o++++++++++++++++++++++++",
+"+++++++++++++++++++.XX..++++++++++++++++++++++++",
+"++++++++++++++++++..XX...+++++++++++++++++++++++",
+"+++++++++++++++++++.....++++++++++++++++++++++++",
+"++++++++++++++++++++.+.+++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-103.xpm b/images/tiles-103.xpm
new file mode 100644 (file)
index 0000000..933c5d8
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++X+++++",
+"++++++++++XOX++++++++++++++++++++++++++++++X++++",
+"+++++++++XXXXXXXXX+++++++++++++++++++++++++XX+++",
+"++++++++++XXXXXXOXX+++++O++XX++++++++++++++XXX++",
+"+++++++++++XXXXXOXXX+++XOXXXXXX++++++++++++XXX++",
+"++++++X+++++XXXXXXX+++++XXOXXXXX++++++++++++XXX+",
+"++++XXXOOXXXXOOXXX+++++XXXOXXXXXX+++++++++++XX++",
+"+++XXXXXXXXXXXXXOXXXXXXXXXXXXXXXX++++++++++XXX.+",
+"++XXXXXXXXXXXXXXXXXXXXXXOXXXXXXXX+++++++++++XX.+",
+"+.XXXXXXXXXXXXXXXXXXXXXXXXXXXXOXXX++++++++++XXX+",
+"+.XXooo.XXXXXXXXXXXXXXXXXXXXXXXXXXX++++++++XXX.+",
+"+.X...XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+XXXXX.+",
+"++..........XXXXXXXXXXXXXXXXXXXXXXXXXOXXOXXXX..+",
+"++++++X.....X..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.+",
+"+++++++++++XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.++",
+"++++++++++++X..XX..X..XXXXXX.XXXXXXXXX..XX...+++",
+"++++++++++++X......X..X.XXXXXXX..X..X......+++++",
+"++++++++++++XX.X........X......+........+.++++++",
+"+++++++++++++X.X..+++...X..XX..+++++++++++++++++",
+"++++++++++++++....++++..XXXXX...++++++++++++++++",
+"++++++++++++++.X...++++++..XX......+++++++++++++",
+"+++++++++++++X.X....++++++..........++++++++++++",
+"++++++++++++++.....+++++++++.+.....+++++++++++++",
+"++++++++++++++++++++++++++++++....++++++++++++++",
+"+++++++++++++++++++++++++++++....+++++++++++++++",
+"+++++++++++++++++++++++++++++++.++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-104.xpm b/images/tiles-104.xpm
new file mode 100644 (file)
index 0000000..47963d4
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++++++++++++++++++++++++++++++++++XXXXX++++++",
+"+++++++++++++++++++++++++++++++++++XXXXXXX++++++",
+"++++++++++++++++++++++++++++++++++XoXXXX.X++++++",
+"+++++++++++++++++++++++++++++++++XoOXXXoX.++++++",
+"++++++++++++++++++++++++XOX+++++XXOXXXoo.X++++++",
+"++++++++++++++++++++++XOXXX++++XXXXXXXX.X+++++++",
+"+++++++++++++++++++++XXXXXXXXXXXXXXXXX.X++++++++",
+"+++++++++++++++++++++XXXXXXXXXOXXXXXX.X+++++++++",
+"+++++++++++++++++++++XXXXXXXXXXXXXXX...+++++++++",
+"+++++++++++++++++++++XXXXXXOXXXXXXX...++++++++++",
+"++++++++++++++++++++++XXXXXXXXXXXX...+++++++++++",
+"++++++++++++++++++++++XXXXXXXXXXX...++++++++++++",
+"++++++++++++++++++++++XXXOXXXXXX.X.X.+++++++++++",
+"+++++++++++++++++++OXXXXXXXXXXX.X.X.X..+++++++++",
+"+++++++++++++++++XOXXXOXXXXXXX.X.X.X.X++++++++++",
+"+++++++++++OXX++XXXXXOXXXXXXXXX...X.X.++++++++++",
+"++++++++++XXXXXXXXXXXXXXXXXXXX.....X..++++++++++",
+"++++++++++OXXXXXXXXOXXXXXXXXX........+++++++++++",
+"+++++++++OXXXXXXXXXXXXXXXXXX.........+++++++++++",
+"+++++++++XXXXXXXXXXXXXXXXXX.X..++...++++++++++++",
+"+++++++++XXXXXXXXXXXXXXXXXXX..++++++++++++++++++",
+"++++++++++XXXX++XXXXXXXXXXX.X.++++++++++++++++++",
+"+++++++++++++++XXXXXXXX..X.X..++++++++++++++++++",
+"++++++++++++++XXXXXXXX..X.X...++++++++++++++++++",
+"+++++++++++++XXXXXX.X..X.X...+++++++++++++++++++",
+"++++++++++++XXXXXX.X. ..X...++++++++++++++++++++",
+"++++++++++++XXXXX.X.+..X.X++++++++++++++++++++++",
+"+++++++++++XXXXX.X.++...X.++++++++++++++++++++++",
+"++++++++++XXXXX.X.++......++++++++++++++++++++++",
+"+++++++++XXXXX.X.++++.....++++++++++++++++++++++",
+"+++++++++XXXX.X.++++++...+++++++++++++++++++++++",
+"++++++++XXXX.X.+++++++++++++++++++++++++++++++++",
+"++++++++XXX.X.++++++++++++++++++++++++++++++++++",
+"++++++++XX.X.+++++++++++++++++++++++++++++++++++",
+"++++++++XXX.X+++++++++++++++++++++++++++++++++++",
+"++++++++.XXX.++XX.++++++++++++++++++++++++++++++",
+"+++++++++.XXXXX..+++++++++++++++++++++++++++++++",
+"++++++++++......++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-105.xpm b/images/tiles-105.xpm
new file mode 100644 (file)
index 0000000..99fb8f8
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++++++++++++++++++++++++++++++++++XXXX+++++++",
+"+++++++++++++++++++++++++++++++++++XXXXXXX++++++",
+"++++++++++++++++++++++++++++++++++XoXXXXXX++++++",
+"+++++++++++++++++++++++++++++++++XooXXoo.X++++++",
+"++++++++++++++++++++++++++++++++XXXXXXo.X.++++++",
+"+++++++++++++++++++++++++++++++XOXXXXX.X.+++++++",
+"++++++++++++++++++++++++++++++XXXXXXXXXX.+++++++",
+"+++++++++++++++++++++++++++++XOXXXXXXXX.++++++++",
+"+++++++++++++++++++++++++++XXOXXXXXXXX..++++++++",
+"++++++++++++++++++++++++XXXXXXXXXXXXX..+++++++++",
+"++++++++++++++++++++XXXXXXXOXXXXXXXX.X+++X++++++",
+"++++++++++++++++++OXXXXOXXXXXXXXXXX.X+++X...++++",
+"+++++++++++++++++XXXXOXXXXXXXXXXXX.X.X.X.X.+++++",
+"++++++++++++++++OXXX.XXXOXXXXXXXX.X.X.X.X..+++++",
+"++++++++++++++++X.X.X.XXXXXXXXXX...X.X....++++++",
+"++++++++++++++++.... XOXXXXXXXX.....X....+++++++",
+"++++++++++++++++++++XOXXXXXXXX.........+++++++++",
+"+++++++++++++++++++XXXXXXXXXX....++...++++++++++",
+"+++++++++++++++++XXXXXXXXXXX.X..++++++++++++++++",
+"+++++++++++++++XXXXXXXXXXXX.X.X..+++++++++++++++",
+"++++++++++OX+XXXXOXXXXXXXX.X.X.X.+++++++++++++++",
+"+++++++++XXXXXXXXXXXXXXXX.X.X.X.X+++++++++++++++",
+"+++++++++OXXXOOXXXXXXXXX.X.X.X.X..++++++++++++++",
+"++++++++XOXOXXXXXXXXXXX.X...X.X...++++++++++++++",
+"++++++++OXXXXXXXXXXXXX.X.....X....++++++++++++++",
+"++++++++XXX.X.XXXXXXX.X..........+++++++++++++++",
+"++++++++.X.X...XXXXX.X..........++++++++++++++++",
+"+++++++++...++XXXXX.X....++...++++++++++++++++++",
+"+++++++++++++XXXXX.X...+++++++++++++++++++++++++",
+"+++++++++++XXXXXX.X...++++++++++++++++++++++++++",
+"+++++XXXXXXXXXXX.X..++++++++++++++++++++++++++++",
+"++++XXXXXXXXXXX.X..+++++++++++++++++++++++++++++",
+"+++XXXXX.........+++++++++++++++++++++++++++++++",
+"+++XXXX+++....++++++++++++++++++++++++++++++++++",
+"+++.XXX+++++++++++++++++++++++++++++++++++++++++",
+"++++..XX++++++++++++++++++++++++++++++++++++++++",
+"++++++.XX+++++++++++++++++++++++++++++++++++++++",
+"+++++++..X++++++++++++++++++++++++++++++++++++++",
+"+++++++++.++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-106.xpm b/images/tiles-106.xpm
new file mode 100644 (file)
index 0000000..e08e62b
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++++++OXXXX++++++++++++++++++++++++++++++++++",
+"++++++++OXXXXXX..+++++++++++++++++++++++++++++++",
+"+++++++XXXXXXXXX..++++++++++++++++++++++++++++++",
+"++++++OXXXXX..XXX..+++++X.X.X.++++++++++++++++++",
+"++++++XX.....X.XXX..+++XXX.X.X.+++++++++++++++++",
+"+++++XX..+++...XXXX..+++XXX.X.X+++++++++++++++++",
+"++++XX..+++++...XXXX..+++X.X.+++++++++++++++++++",
+"++++X..+++++++..XXXXX..++.X...++++++++++++++++++",
+"+++XX.+++++++++..XXXXX..+X....++++++++++++++++++",
+"+++X.++++++++++..XXXXXX.XX.X...+++++++++++++++++",
+"+++X.+++++++++++..XXXXXX.XX.X..+++++++++++++++++",
+"+++.+++++++++++++.XOXXXXX.XX...+++++++++++++++++",
+"+++.+++++++++++++XXXXXXXXX.XX..+++++++++++++++++",
+"+++++++++++++++++XXXXOXXXXX.....++++++++++++++++",
+"+++++++++++++++++XXXXOXXXXXX....+++X.+++++++++++",
+"++++++++++++++++OXXXXXXXXXXXX...+++.X.++++++++++",
+"+++++++++++++++OXXXXXXOXXXXXXX..+++X...+++++++++",
+"+++++++++++++++OXX.XXXXXXXXXXXX..++.X...++++++++",
+"+++++++++++++++XXXX.XXXXXXXXXXXX.X.X....++++++++",
+"++++++++++++++++XX.X.XXXOXXXXXXXX.X.X.++++++++++",
+"++++++++++++++++XXX.X.XXXXXXXXXXXX.X..++++++++++",
+"+++++++++++++++++XX....XXXOXXXXXX.X...++++++++++",
+"++++++++++++++++++X...+XXXXXXXXXXX.X..++++++++++",
+"+++++++++++++++++++..+++XXXOXXXXX.X...++++++++++",
+"+++++++++++++++++++++++++XXXXXXXXX...+++++++++++",
+"++++++++++++++++++++++++++XXOXXXXXX..+++++++++++",
+"+++++++++++++++++++++++XXOXXXOXXXX.X.+++++++++++",
+"+++++++++++++++++++++++XOXXXXXOXXXXX.+++++++++++",
+"+++++++++++++++++++++++XOX.XXXXXXXX...++++++++++",
+"+++++++++++++++++++++++XXXX...XXXXXX..++++++++++",
+"++++++++++++++++++++++++XXX....XXXXXX..+++++++++",
+"+++++++++++++++++++++++++XXX. ..X.XXX...++++++++",
+"+++++++++++++++++++++++++XXX..+..o..X..o.+++++++",
+"++++++++++++++++++++++++++XX..++..ooXXoo.+++++++",
+"++++++++++++++++++++++++++X.X..++..XXXXX.+++++++",
+"+++++++++++++++++++++++++++X..++++...XX..+++++++",
+"++++++++++++++++++++++++++++++++++++....++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-107.xpm b/images/tiles-107.xpm
new file mode 100644 (file)
index 0000000..6aa57c2
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++++++OOXXXX+++++++++++++++++++++++++++++++++",
+"++++++++XXXX...X++++++++++++++++++++++++++++++++",
+"+++++++XOXX.++...+++++++++++++++++++++++++++++++",
+"+++++++XXXX.++++++++++++++++++++++++++++++++++++",
+"+++++++XOXX.++++++++++++++++++++++++++++++++++++",
+"+++++++XXXXX.+++++++++++++++++++++++++++++++++++",
+"+++++++XXXXXX.++++++++++++++++++++++++++++++++++",
+"++++++++XXXXXX.++++++...++++++++++++++++++++++++",
+"++++++++XXOXXXX.++++.X...+++++++++++++++++++++++",
+"+++++++++XXXXXXX.++.X.X..+++++++++++++++++++++++",
+"++++++++++XXXXXXX.++.X.X.+++++++++++++++++++++++",
+"+++++++++++XOXXXXX.+X.X..+++++++++++++++++++++++",
+"+++++++++++XXXXXXXX. X.X...+++++++++++++++++++++",
+"++++++++++++XXOXXXXX..X.X...++++++++++++++++++++",
+"+++++++++++++XXXXXXXX........+++++++++++++++++++",
+"++++++++++++++XXOXXXXX.......+++++++++++++++++++",
+"+++++++++OOXX++XXXXXXXX......+++++++++++++++++++",
+"++++++++XXXXOXXXXOXXXXXX.....+++++++++++++++++++",
+"++++++++XXXXXXXXXXXXXXXXX.....++.X.+++++++++++++",
+"++++++++XXXXXXXX.XXOXXXXX.X.....X.X.++++++++++++",
+"+++++++++XXXXX...XXXXXXXXX.X...XXX..++++++++++++",
+"+++++++++XXXX.....XXOXXXXXX.X.X.X....+++++++++++",
+"++++++++++XXX++....XXXXXXXXX.X.X.X...+++++++++++",
+"++++++++++++++++....XXOXXXXXX.X.X.X..+++++++++++",
+"++++++++++++++++++...XXOXXXXXX.X.X....++++++++++",
+"+++++++++++++++++++++XXXOXXXXXX.X...++++++++++++",
+"++++++++++++++++++++++XXXXXXXXXX...+++++++++++++",
+"+++++++++++++++++++++OXXXXOXXXXXX...++++++++++++",
+"++++++++++++++++++++OXXXX.XXXXXXXX...+++++++++++",
+"++++++++++++++++++++OXXXX..XXXXXXXX...++++++++++",
+"++++++++++++++++++++XXXXX...XXXXXXXX..++++++++++",
+"++++++++++++++++++++XXXXX....XXXXXXXX..+++++++++",
+"+++++++++++++++++++++XXXX.++++XXXXXXXX..++++++++",
+"+++++++++++++++++++++++XXX+++++XX..XX....+++++++",
+"++++++++++++++++++++++++++++++++X.o.X..o.+++++++",
+"+++++++++++++++++++++++++++++++++X.ooXoo.+++++++",
+"++++++++++++++++++++++++++++++++++X.X.X.X+++++++",
+"++++++++++++++++++++++++++++++++++++.X.X.+++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-108.xpm b/images/tiles-108.xpm
new file mode 100644 (file)
index 0000000..b62068c
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++X+++++++++++++++++++++++++++++++++++++",
+"++++++++OX.+++++++++++++++++++++++++++++++++++++",
+"+++++++OX.++++++++++++++++++++++++++++++++++++++",
+"+++++XXX.+++++++++++++++++++++++++++++++++++++++",
+"++++XXX.++++++++++++++++++++++++++++++++++++++++",
+"++++XXXX+++XXXX+++++++++++++++++++++++++++++++++",
+"++++.XXXXXXXXXXXXX++++++++++++++++++++++++++++++",
+"++++....XXXXXOXXXXXX++++++++++++++++++++++++++++",
+"++++++......XXXOXXXXX+++++++++++++++++++++++++++",
+"++++++++++++XXXXXXXXXX.+++++++++++++++++++++++++",
+"++++++++++++++XXOXXXX.X.++++++++++++++++++++++++",
+"++++++++++XOX++XXXXXXX.X.X++.X.+++++++++++++++++",
+"+++++++++XOXXXXXXOXXXXX.X.X.X.X.X+++++++++++++++",
+"+++++++++XXXXXXXXXOXXXXX.X.X.X.X.X++++++++++++++",
+"+++++++++XXXXXX.XXXXXXXXX.X.X.X.X.X+++++++++++++",
+"+++++++++XXXXXX..XXXXXXXXX...X.X.X.+++++++++++++",
+"++++++++++XXX..X.XXXOXXXXXX........+++++++++++++",
+"++++++++++XX......XXXXXXXXXX......++++++++++++++",
+"+++++++++++X.+.....XXOXXXXXXX.....++++++++++++++",
+"++++++++++++++++..XXXXXXXXXXXX....++++++++++++++",
+"++++++++++++++++++XXXXXOXXXXXXX..+++++++++++++++",
+"++++++++++++++++++++XXXXXXXXXXXX..++.X.+++++++++",
+"+++++++++++++++++++++XXXXOXXXXXXX.X.X.X.++++++++",
+"+++++++++++++++++XXXX XXXXOXXXXXXX.X.X.X.X++++++",
+"+++++++++++++++++XXOXOXXXXXXXXXXXXX.X.X.X.X+++++",
+"+++++++++++++++++XXXXXXXXXXXXOXXXXXX.X...X.X++++",
+"++++++++++++++++++XXXXXXXX.XXXXXXXXXX.......++++",
+"+++++++++++++++++++XXXXXXX..XXXXXXXXXX+++....+++",
+"+++++++++++++++++++++.......XXXXXXXXXXX+++.+++++",
+"+++++++++++++++++++++++++....XXXXXXXXXXX++++++++",
+"++++++++++++++++++++++++++++..XXXXXXXXXXX+++++++",
+"++++++++++++++++++++++++++++++XXXXXXXXXXX+++++++",
+"+++++++++++++++++++++++++++++++.XXXXXXXXXX++++++",
+"++++++++++++++++++++++++++++++++.XXX.XXXX.++++++",
+"+++++++++++++++++++++++++++++++++.X.o.XX.o.+++++",
+"++++++++++++++++++++++++++++++++++.X.ooX.o.+++++",
+"+++++++++++++++++++++++++++++++++++.X.....X+++++",
+"++++++++++++++++++++++++++++++++++++.X.X.X.+++++",
+"++++++++++++++++++++++++++++++++++++++..X.++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-109.xpm b/images/tiles-109.xpm
new file mode 100644 (file)
index 0000000..5227ff4
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++++++++++++++++++++++++++++++++++XXX++++++++",
+"++++++++++++++++++++++++++++++++++++++XXX+++++++",
+"+++++++++++++++++++++++++++++++++++++++XXX.+++++",
+"++++++++++++++++++++++++++++++++++++++++X.X.++++",
+"+++++++++++++++++++++++++++++++++XXXX+++.X.X++++",
+"++++++++++++++++++++++++++++++XXXOXXXXX.X.X.++++",
+"++++++++++++++++++++++++++++XXOXXXXX.X.X.X.+++++",
+"+++++++++++++++++++++++++++XXXXXX.X...X.X.++++++",
+"+++++++++++++++++++++++++XXXOXXX....++++++++++++",
+"++++++++++++++++++++++++XXXXXXX...++++++++++++++",
+"+++++++++++++++++OXX++XXXOXXXX...++XXX++++++++++",
+"+++++++++++++++XOXXXXXXXXXXXX....XXXXX.+++++++++",
+"++++++++++++++OXXXXXXXXOXXXXX..X.XXXXX.+++++++++",
+"+++++++++++++XXXXXXXXXXXXXXXXX..XX.X...+++++++++",
+"+++++++++++++XXX.X.XXOXXXXXXX.X.X.X.X..+++++++++",
+"+++++++++++++XX.X.XXOXXXXXXX.X.X.X.X..++++++++++",
+"++++++++++++++.X.XXXXXXXXXX.X.X.X.....++++++++++",
+"++++++++++++++..XXXXXXXXXX.X.....X+..+++++++++++",
+"++++++++++++++.XXXOXXXXXX.X.....++++++++++++++++",
+"+++++++++++++++XXOXXXXXX.X....++++++++++++++++++",
+"+++++++++XXX++XXXXXXXXX.X...++++++++++++++++++++",
+"++++++++XXXXXXXOXXXXXX.X...+++++++++++++++++++++",
+"++++++OXXXXXXXXXXXXXXX.... XXXX+++++++++++++++++",
+"+++++OXXXXXXXOXXXXXXX.....XXXX.+++++++++++++++++",
+"++++OXX.X.XXXXXXXXXXX.XXXXX.X.X+++++++++++++++++",
+"++++XXX....OXXXXXXXX.X.X.X.X.X++++++++++++++++++",
+"+++XX.X+++XXXXXXXXX.X.X.X.X..+++++++++++++++++++",
+"+++++X+++XXXXXXXXX.X.X.X...+++++++++++++++++++++",
+"++++++++XXXXXXXXX.X....+++++++++++++++++++++++++",
+"+++++++XXXXXXXXX.X..++++++++++++++++++++++++++++",
+"+++++++XXXXXXXX.X.++++++++++++++++++++++++++++++",
+"++++++..XXXXXX.X.+++++++++++++++++++++++++++++++",
+"++++++..XX.XX.X.++++++++++++++++++++++++++++++++",
+"+++++.o.X..o.X.+++++++++++++++++++++++++++++++++",
+"+++++XoX..o...++++++++++++++++++++++++++++++++++",
+"+++++XXX.X...+++++++++++++++++++++++++++++++++++",
+"+++++.XXX...++++++++++++++++++++++++++++++++++++",
+"++++++....++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-11.xpm b/images/tiles-11.xpm
new file mode 100644 (file)
index 0000000..bd2f867
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 8 1",
+"  c black",
+". c #3F3F3F3F0000",
+"X c #3F3F3F3F3F3F",
+"o c #7F7F00000000",
+"O c #7F7F3D3D0000",
+"+ c gray50",
+"@ c red",
+"# c gray75",
+/* pixels */
+"                                ",
+"  oooooooooooooooooooooooooooo  ",
+" o oooooooooooooooooooooooooo @ ",
+" oo oooooooooooooooooooooooo @@ ",
+" ooo                        @@@ ",
+" ooo ###################### @@@ ",
+" ooo ###################### @@@ ",
+" ooo ###################### @@@ ",
+" ooo ##XX#X      #######X## @@@ ",
+" ooo ###   XXXXXXXXXXXXX ## @@@ ",
+" ooo ###   X   X         ## @@@ ",
+" ooo ###   X   X ########## @@@ ",
+" ooo ###         #######+## @@@ ",
+" ooo ##..  #X# #######+X### @@@ ",
+" ooo ##... #X# #####+XX+### @@@ ",
+" ooo #....#   ####+XX+X#### @@@ ",
+" ooo #.O..#######+XX+X+#### @@@ ",
+" ooo #....######+XX+XX##### @@@ ",
+" ooo #....## ###XX+XX+##### @@@ ",
+" ooo #######+ #+X+XX+###### @@@ ",
+" ooo ########+ X+XX+####### @@@ ",
+" ooo #########+ X+######### @@@ ",
+" ooo ########..+ ########## @@@ ",
+" ooo #######.O.#+ ######### @@@ ",
+" ooo ######.O.###+ ######## @@@ ",
+" ooo ######..############## @@@ ",
+" ooo ###################### @@@ ",
+" ooo                        @@@ ",
+" oo @@@@@@@@@@@@@@@@@@@@@@@@ @@ ",
+" o @@@@@@@@@@@@@@@@@@@@@@@@@@ @ ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+"                                "
+};
diff --git a/images/tiles-110.xpm b/images/tiles-110.xpm
new file mode 100644 (file)
index 0000000..6b0312d
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++++++++++++++++++++++++++++++OXXXXX+++++++++",
+"++++++++++++++++++++++++++++++++X...XXX.++++++++",
+"+++++++++++++++++++++++++++++++...++.XXX.+++++++",
+"++++++++++++++++++++++++++++++++++++XXX..+++++++",
+"++++++++++++++++++++++++++++++++++++XXXX.+++++++",
+"+++++++++++++++++++++++++++++++++++XXXX..+++++++",
+"++++++++++++++++++++++++++++++++++XXXXX..+++++++",
+"++++++++++++++++++++++++OX.++++++XXXXX.X++++++++",
+"+++++++++++++++++++++++XOXX.++++XXOXX.X.++++++++",
+"+++++++++++++++++++++++XXX...++XOXXX.X.+++++++++",
+"+++++++++++++++++++++++XXXX.++XXXXX.X.++++++++++",
+"+++++++++++++++++++++++XXX..+OXXXX.X.+++++++++++",
+"+++++++++++++++++++++OXXXXX XXXXX.X.X+++++++++++",
+"++++++++++++++++++++OXXXXXXXXXXX.X.X++++++++++++",
+"+++++++++++++++++++.X.XXXOXXXXX.X.X+++++++++++++",
+"+++++++++++++++++++....XXXXXXX.X.X++++++++++++++",
+"+++++++++++++++++++...XOXXXXXXX.X++.X.X+++++++++",
+"+++++++++++++++++++XXXOXXXXXXX.X.X.X.X..++++++++",
+"+++++++++++++OX.++XXXXXXXXXXX.X.X.X.X.X.++++++++",
+"++++++++++++XXX...XXOXXXXXXX.X.X.X.X.X.X++++++++",
+"++++++++++++OXX..XXXXXXXXXX.X.X.X...X..+++++++++",
+"+++++++++++XXXXXXXOXXXXXXX.X.X.X.......+++++++++",
+"+++++++++++.X.XXXXXXXXXXX.X......++...++++++++++",
+"+++++++++++..XXXOXXXXXXX.X......++++++++++++++++",
+"++++++++++....XXXXXXXXX.X.....++++++++++++++++++",
+"++++++++++++..XXXXXXXX.X...+++++++++++++++++++++",
+"+++++++++++++XXXXXXXX.X.X.++++++++++++++++++++++",
+"++++++++++++XXXXXXXX.X.X.X.+++++++++++++++++++++",
+"+++++++++++XXXXXXXX.X.X.X.X.++++++++++++++++++++",
+"++++++++++XXXXXXXX.X.X.X.X..++++++++++++++++++++",
+"+++++++++XXXXXXXX.X...X.X.X.++++++++++++++++++++",
+"++++++++X.XXXXXX.......X.X..++++++++++++++++++++",
+"++++++++X..XX.X...++++.....+++++++++++++++++++++",
+"+++++++Xo..X.o...+++++...+++++++++++++++++++++++",
+"+++++++XXoX.o...++++++++++++++++++++++++++++++++",
+"+++++++XXXXX...+++++++++++++++++++++++++++++++++",
+"+++++++XXXX...++++++++++++++++++++++++++++++++++",
+"+++++++.....++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-111.xpm b/images/tiles-111.xpm
new file mode 100644 (file)
index 0000000..fa0bd10
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++XXOXX+++++++++",
+"+++++++++++++++++++++++++++++++XXXOXXXXX++++++++",
+"++++++++++++++++++++++++++++++XXOXXXXXXXX+++++++",
+"++++++++++++++++++OXX...+++++XXXXXX.X.X.XX++++++",
+"+++++++++++++++++OXXXX.X.+++XXOXXXX....X.XX+++++",
+"+++++++++++++++++XXXX.X.+++XXXXXXX..+++.X.X+++++",
+"+++++++++++++++++++XXX.+++XXOXXXX..+++++.X..++++",
+"++++++++++++++++++XXX..++XXOXXXX..+++++++...++++",
+"++++++++++++++++++OX.X.+XXXXXXX..+++++++++...+++",
+"+++++++++++++++++XXXX.XXXOXXXX...+++++++++...+++",
+"+++++++++++++++++OXXXXXXOXXXX...+++++++++++..+++",
+"+++++++++++++++++XXXXXXXXXXX...+++++++++++++.+++",
+"+++++++++++++++++XXXXXOXXXX....+++++++++++++.+++",
+"++++++++++++++++XXXXXXXXXXXX...+++++++++++++++++",
+"+++++++++++X.+++XXXXOXXXXXXXX..+++++++++++++++++",
+"++++++++++XX.+++XXXXXXXXXXXX.X..++++++++++++++++",
+"+++++++++OXX.+++XXOXXXXXXXX.X.X..+++++++++++++++",
+"++++++++OXXX.++.XOXXXXXXXX.X.X...+++++++++++++++",
+"++++++++XXXX..XXXXXXXXXXX.X.X.X..+++++++++++++++",
+"++++++++++XXX..XXXXXXXXX.X...X..++++++++++++++++",
+"++++++++++OXXXXOXXXXXXX.X...X...++++++++++++++++",
+"++++++++++XXXXXXXXXXXX.X...X...+++++++++++++++++",
+"++++++++++OXXXXXXXXXX.X..+....++++++++++++++++++",
+"++++++++++XXXXXXXXXX.X..+++..+++++++++++++++++++",
+"+++++++++++XXXXXXXX.X..+++++++++++++++++++++++++",
+"+++++++++++XXXXXXX.X..++++++++++++++++++++++++++",
+"+++++++++++XXXXXX.X......+++++++++++++++++++++++",
+"+++++++++++XXXXX.X.X.X.X.+++++++++++++++++++++++",
+"++++++++++XXXXXXX.X.X.X..+++++++++++++++++++++++",
+"++++++++++XXXXXX.X...X...+++++++++++++++++++++++",
+"+++++++++XXXXXX.X...X...++++++++++++++++++++++++",
+"++++++++XXXXXX.X.. X...+++++++++++++++++++++++++",
+"+++++++X..XXX.X..+X....+++++++++++++++++++++++++",
+"+++++++Xo.XX.o..++....++++++++++++++++++++++++++",
+"+++++++XoXX.o..++.....++++++++++++++++++++++++++",
+"+++++++XXX.X..++++...+++++++++++++++++++++++++++",
+"++++++++....++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-112.xpm b/images/tiles-112.xpm
new file mode 100644 (file)
index 0000000..72ea236
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++XXXX++++++++++++++++++++++++++++++++++++++",
+"+++++XXXX.X.++++++++++++++++++++++++++++++++++++",
+"+++++XXX.oo..+++++++++++++++++++++++++++++++++++",
+"+++++Xo.X.o...++++++++++++++++++++++++++++++++++",
+"+++++Xo.XX.X.X.+++++++++++++++++++++++++++++++++",
+"++++++.XXXXXX.X.++++++++++++++++++++++++++++++++",
+"++++++.XXXXXXX.X.+++++++++++++++++++++++++++++++",
+"+++++++XXXOXXXX.X.++++++++++++++++++++++++++++++",
+"+++++++.XXXXXXXX.X..++++++++++++++++++++++++++++",
+"++++++++.XXXXXXXX.XXX..+++++++++++++++++++++++++",
+"+++++O+++.XXOXXXXX.XXXXXXX.+++++++++++++++++++++",
+"++++OXX+++.XXXXXXXXXXX.XXXXX.+++++++++++++++++++",
+"++++XXXXXOXXXXOXXXXXXXX.XXX.X.++++++++++++++++++",
+"++++XXXXXXXX.XXOXXXXXXX..X.X.X.+++++++++++++++++",
+"+++++.X.XXX.X.XXXXXXXXXX....X.X+++++++++++++++++",
+"++++++.X.X.X.X.XOXXXXXXX.. ....+++++++++++++++++",
+"++++++++X.X.....XXXXXXXXX..+++++++++++++++++++++",
+"+++++++++...++..XXOXXXXXXX..++++++++++++++++++++",
+"+++++++++++++++X.XXXXXXXXX...X++++++++++++++++++",
+"++++++++++++++XXX.XXOXXXXXX.XXXX++++++++++++++++",
+"++++++++++++++XXXXXXXXXXXXXX.XXXXX+X.+++++++++++",
+"++++++++++++++XOXXXXXXOXXXXXXXXXXXXXX.++++++++++",
+"+++++++++++++OXXXXX.XXXXXXXXXXXXXXXX.X++++++++++",
+"+++++++++++++XX.X.X..XXXXXXXXX..XXX.X.X+++++++++",
+"+++++++++++++X.X.X.X..XXXXXXXXX..X.X.X.+++++++++",
+"++++++++++++++X.X.X....X.XXXXXX...X.X.X+++++++++",
+"+++++++++++++++.........X.XXXXXX.......+++++++++",
+"+++++++++++++++++...++...X.XXXXXX++...++++++++++",
+"++++++++++++++++++++++++..X.XXXXXX++++++++++++++",
+"+++++++++++++++++++++++++..X.XXXXXXX++++++++++++",
+"+++++++++++++++++++++++++++..X.X.XXXXXXXXX++++++",
+"++++++++++++++++++++++++++++....X.XXXXXXXXX+++++",
+"++++++++++++++++++++++++++++++..........XX.X++++",
+"+++++++++++++++++++++++++++++++++....+++X.X.++++",
+"++++++++++++++++++++++++++++++++++++++++.X.X++++",
+"+++++++++++++++++++++++++++++++++++++++.X.X+++++",
+"++++++++++++++++++++++++++++++++++++++.X.+++++++",
+"+++++++++++++++++++++++++++++++++++++.X.++++++++",
+"+++++++++++++++++++++++++++++++++++++X++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-113.xpm b/images/tiles-113.xpm
new file mode 100644 (file)
index 0000000..424a8d6
--- /dev/null
@@ -0,0 +1,59 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 5 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c gray75",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOO.XXO O.O...OOOO. OOOOOOOOOOOOOOOOOOOOOO",
+"OOOoOOOOO.o..Xo.O.O  ...O...O.O.....OOOOOOOOOOOO",
+"OOOOOoXOOOXoXooO..XXX..X..XX........OOOOOOOOOOOO",
+"OOOOOoooo..X.oXoXX.XXXo...X....... .OOOOOOOOOOOO",
+"OOOO oO.X.XooX..XXXX..X...XX. o....OOOOOOOOOOOOO",
+"OOOOoXO.oo...oo..X..........X.......OOOOOOOOOOOO",
+"OOOOOoOOOoo......XX.....X.     ....O.OOOOOOOOOOO",
+"OOOOO.oOO.....o.oooXX.X....     OOOOOOOOOOOOOOOO",
+"OOOOOOOOO..Oo..oXooX.o......    O OOOOOOOOOOOOOO",
+"OOOOOOO OOOOOoooooXXXXXXX....    OOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOooooooXXXXX.X...    OOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOoooXoooX..X....    OOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOooooXXXXX... .   OOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOooooXXXX...XX.. . OOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOoooooXXXX.. .    OOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOoooooXXXXXX...    OOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOoooooXX.XX...   OOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOoooooXXXXX.     OOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOooooXXXX....   OOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOooooXXXX.X     OOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOooooXXX.....  OOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOooooXXXX..   OOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOoooXXXX...   OOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOoooXXXX...  OOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOooXXXXX..   OOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOoooXX.. .  OOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOooXoXX.... OOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOoooX....  OOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOoooXXXX.  OOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOoooXX.   OOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOooXX... OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOooXX.. OOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOoooXX.. OOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOooX.. OOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOooXXX  OOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOoXXX. OOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOoX...OOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOooXX. OOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOoXXX. OOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOX.. OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOoXX OOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOoX OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOoX.OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOoX.OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOoX.OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOoOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOoOOOOOOOOOOOOOOOOOOOOOOOOO"
+};
diff --git a/images/tiles-114.xpm b/images/tiles-114.xpm
new file mode 100644 (file)
index 0000000..84c60b4
--- /dev/null
@@ -0,0 +1,59 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 5 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c gray75",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOoOOOOOOOOOOO ....OOOO.OOO OOOOOOOOOOOOOO",
+"OOOOOOOOOOOOO OoO ..O.OO..OOO...OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOo.O....X X. .XO..O. O... OO.OOOOOOOOOO",
+"OOOOOOOO.oo.o..oooXXX.XXX............OOOOOOOOOOO",
+"OOOOOOOoOoo.Xo.oo...X..XX...... .... OOOOOOOOOOO",
+"OOOOOOOOOoXXX.X.XX....XX.....o......OOOOOOOOOOOO",
+"OOOOOOoOOO.o...o...oX.X....X...o.... OOOOOOOOOOO",
+"OOOOOOOoO.O. X.ooXooXo.XX...... .   .OOOOOOOOOOO",
+"OOOOOOOOOOOO.OOoooo.ooXX.......    OOOOOOOOOOOOO",
+"OOOOOOOOOOOOOO OoooooXXXXXX....    OOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOooooooXXXXX.X...    OOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOoooXoooX......    OOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOooooXXXXX... .   OOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOooooXXX...XX.. .  OOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOoooooXXXX.. .    OOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOoooooXXXXX...    OOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOooooXX.XX...   OOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOoooooXXXXX.     OOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOooooXXXX....   OOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOooooXXXX.X     OOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOooooXXX.....  OOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOooooXXXX..   OOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOoooXXXX...   OOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOoooXXXX...  OOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOooXXXXX..   OOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOoooXX.. .  OOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOooXoXX.... OOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOoooX....  OOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOoooXXXX.  OOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOoooXXX.   OOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOooXX... OOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOooXX.. OOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOoooXX...OOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOooX.. OOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOooXXX  OOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOoXXX. OOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOoXX...OOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOooXX. OOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOoXXX.OOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOX.. OOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOoXX OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOoX  OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOoX.OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOoX.OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOoX.OOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOoOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOoOOOOOOOOOOOOOOOOOOOOOOO"
+};
diff --git a/images/tiles-115.xpm b/images/tiles-115.xpm
new file mode 100644 (file)
index 0000000..11e222e
--- /dev/null
@@ -0,0 +1,59 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 5 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c gray75",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOO.OOOOOO.OOOOOOOOOO.OOO.OO.O.OOOOOOOOOOOO",
+"OOOOOOOOOOX..O..OO...XO...O..OO.O.OOOOOOOOOOOOOO",
+"OOOOO.OOO...o..XXX.oO.o..............OOOOOOOOOOO",
+"OOOOOOoO.oXo...o.X..o.............. OOOOOOOOOOOO",
+"OOOOOOOOooX.o.....X..X...X....XX..  .OOOOOOOOOOO",
+"OOOOOOoOO..Ooo.X..X..X...X....... ....OOOOOOOOOO",
+"OOOOOOO....oo..o..o..XX........ .OO.OOOOOOOOOOOO",
+"OOOOOOOOOOO.oo....o.oo.XX....    ..OOOOOOOOOOOOO",
+"OOOOOOOO..OOo.o.o.X.oXX.......    OOOOOOOOOOOOOO",
+"OOOOOOOOOOOOooOoooooXXXXX....    OOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOooooooXXXXX.X...    OOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOoooXoooX......    OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOooooXXXXX... .   OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOooooXX...XX.. .  OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOoooooXXXX.. .    OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOoooooXXXXX...    OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOooooXX.XX...   OOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOoooooXXXXX.     OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOooooXXXX....   OOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOoooooXXXX.X     OOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOooooXXX.....  OOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOooooXXXX..   OOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOoooXXXX...   OOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOoooXXXX...  OOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOoooXXXXX..  OOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOoooXX.. . OOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOooXoX.... OOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOoooo....  OOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOoooXXX.  OOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOooXXX.   OOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOooXX... OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOooXX.. OOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOoooXX... OOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOooX.. OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOooXXX  OOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOoXXX. OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOoXX...OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOoooXX. OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOoXXX. OOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOX.. OOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOooXX OOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOoX  OOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOoX.OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOoX.OOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOooX.OOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOoOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOOOOOOOOOOOOOOOOO"
+};
diff --git a/images/tiles-116.xpm b/images/tiles-116.xpm
new file mode 100644 (file)
index 0000000..34388cb
--- /dev/null
@@ -0,0 +1,58 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 4 1",
+"  c black",
+". c #FFFF7F7F0000",
+"X c yellow",
+"o c None",
+/* pixels */
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"ooooooooooooooooooooo.oooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooXXXXXXXoooooooooooooooooooooo",
+"ooooooooooooooooooXXXXXXXoXXoooooooooooooooooooo",
+"oooooooooooooooo.oXXXXoXXXoXXooooooooooooooooooo",
+"oooooooooooooooooXoXXXXXX.XXXooooooooooooooooooo",
+"ooooooooooooooooXXXXXXXXXXXXXXoooooooooooooooooo",
+"ooooooooooooooooXXXXXXXXXXXXXXoooooooooooooooooo",
+"ooooooooooooooooXoXXXXXXXXXXXXoooooooooooooooooo",
+"ooooooooooooooooXXXXXXXXXXXXoXoooooooooooooooooo",
+"oooooooooooooooooXXXXXXXXXXXoXoooooooooooooooooo",
+"ooooooooooooooooooXXXXXXXXXXo.oooooooooooooooooo",
+"oooooooooooooooooX.XXXooXXXXoXoooooooooooooooooo",
+"ooooooooooooooooooXXXXXXXXoXXooooooooooooooooooo",
+"ooooooooooooooooooooXXX.XXXXoooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo"
+};
diff --git a/images/tiles-117.xpm b/images/tiles-117.xpm
new file mode 100644 (file)
index 0000000..0bdec33
--- /dev/null
@@ -0,0 +1,59 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 5 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOooOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOoooOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOooOoOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOXXOOOOOOoOOoOOOXOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOoXXOOOOOoOOXOOoooOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOooOXOOoooooOoOoooOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOooOOOoooOoooooooooOOOOOOOOOOOO",
+"OOOOOOOOOOOOOooooooooOXooXooOoooooOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOoXOOooooOXooOoooooOooOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOooooOoXOooOooooooooOoOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOXOooooooooooooXoOOoOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOXOoooooooooooooOXXXXXXOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOooooooooooooXOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOoXoOOoooooooooooooooooOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOXOooOoOooooooooooooOOoOOOOOOOOOOOO",
+"OOOOOOOOOOOOOoooOOOooooooo.ooooOooooooOOOOOOOOOO",
+"OOOOOOOOOOOOOOOXoooooooOoooooOooXXOOoooOOOOOOOOO",
+"OOOOOOOOOOOOOOOXOooooOXooooooooOOXXOOOoOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOoooooOOooooooOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOXOoOoXOOoOOOOXOXOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOooOXOoooOOXXoXOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOXOXOOOOXXOOXOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
+};
diff --git a/images/tiles-118.xpm b/images/tiles-118.xpm
new file mode 100644 (file)
index 0000000..518b34b
--- /dev/null
@@ -0,0 +1,59 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 5 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOooOOOOOOOOOOOOOOooOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOoOOOOOOOOOOOOoooOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOXXXXOOOOOOOOoOOOOOOOOOOXOOOOOOOO",
+"OOOOOOXOOOOOOOOOOXXXXOOOOOOOoOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOXOXOOOOOOoOXOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOXXOXOOOOoOXXOOOOOOOOOOOOOOOOOO",
+"OOOOOOooooOOOOOOOOOXoOXOOoOXXOOOOOOOOOOOOOOOOOOO",
+"OOOOooOOOXXXOOOOOOOXOoXXoOXOOOOOOOXXooooooOOOOOO",
+"OOOoOXXXXXOoXXXOOOOOOoXXoXOO..OOXXooXOOOOOoOOOOO",
+"OOOOOOOOOXXXOOoXXOOOOoOXXXOOOOOXXoXXOOOOOOOOOOOO",
+"OOOOOOOOOOOXXOOooXXOOoX.X.OXXOXXXXXXOOOOOOOOOOOO",
+"OOOOOOOOOOOOOXXOOooXXoXoXXX.OoXXXXOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOoXXooooOoOoXXXOoXOXOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOoOOXXOOooOooXX.OOXXOOOOOOOOXXXOOOOOO",
+"OOOOOOOOOOOX.XX.XOOOOooXoXoOOooOOOXXXOOOOOXOOOOO",
+"OOOOOOOOOOOXOOOOooooooOOooooooOooXoooooooooOOOOO",
+"OOOOOOOOOOOOOOooOO.XXoOoooXOoXoXXXOOOXXXXOOOOOOO",
+"OOOOOOOXOOOOOoOOOOOoooooXooooXXXOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOoOOXooooOOooXXXoooXXOOOXOOOOOOOOOOOO",
+"OOOOOOOOOOOXXOXoOOOXXoooooooooooXXXXXOOOOOOOOOOO",
+"OOOOOOOOOOOoXXXXXXXXOooOooooXXooooOOXXXXOOOOOOOO",
+"OOOOOOOOOOoOXoOOOOOoooXoooOOoXOoOoooOOOOOOOOOOOO",
+"OOOOOOOOOOoOXoOOOooX.oXooXoOOoXXOOOoOOOOOOOOOOOO",
+"OOOOOOOOOoOOoOXoooooXXoXoXXOOoXXXOOOoOOOOOOOOOOO",
+"OOOOOOOOoOOOXXooOOXXOOoXoOXOOOoXXOOOOoOOOOOOXOOO",
+"OOOOOOOOoOOXoooOO.OOXXoXOoXOOOOoXOOOOooOOOOOOOOO",
+"OOOOOOOOOOXXooOOOXOXXoOXOoXOXOOoXOOOOOOOOOOOOOOO",
+"OOOOOOOOOXOooOOOXXXOOoOXOoXOXOOOXXOOOOOOOOOOOOOO",
+"OOOOOOOOOOoOXXXXXOXOOoOXOoOOXOOOoXOOOOOOOOOOOOOO",
+"OOOOOOOOOoOoOOOOOOXOoOOXOoOOXOOOOXOOOOOOOOOOOOOO",
+"OOOOOOOOoOOoOOOOOXOOOOOOOoOOOOOOOXOOOOOOOOOOOOOO",
+"OOOOOOOOoOOoOOOOOXOOOOOOoOOOOOOOOOoOOOOOOOOOOOOO",
+"OOOOOOOOoOOOOOOOOOOOOOOoOOOOOOOOOOoOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOXOOOOOOOOoOOOOOOOOOOOO",
+"OOOOOOOOOOOOXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
+};
diff --git a/images/tiles-119.xpm b/images/tiles-119.xpm
new file mode 100644 (file)
index 0000000..1a6f1a2
--- /dev/null
@@ -0,0 +1,59 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 5 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOO.OOOOOOOOOOXXXOXXOOOOOOOOOOOO",
+"OOOOOOOOOXXXXXXOOOOOOOOOOOOOOXOOXXOOXXXXOOOOOOOO",
+"OOOOOXOXOOOXX...XOOOOOOOO.OOXOO..OOOOOOXOOOOOOOO",
+"OOOOOOOOOOOOOOOO..XOOOOOOOOOX...OXOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOX..XOOOOOOOXo.OOXXOOOXXXOOOOOOOO",
+"OOOOOOXOOOOOOOOOOX..XOOOOOOX.OOXXOOOOOXOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOX..OOOOOOX.XXOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOXX.XOOOOoXOXOOOOOOOOOOOOOOOOOO",
+"OOOOOOooooOOOOOOOOOX..XOOoOXOOOOOOOOOOOOOOXOOOOO",
+"OOOOooOOXXXXOOOOO.OXOoXXoOXOOOOOOOXXoooXXXXXXOOO",
+"OOOXO........XXOOOOOOoXOOOOOO.OOOXooXOXOOOoOOXOO",
+"OOXXOOOOOXX...oXOOOOOOOOOXOOXOOX...XOXXXXOOOOOOO",
+"OOOXOOOOOOOXX..OOXXOOOO.XOOOXOXX.XXXXOOOOOOOOOOO",
+"OOXOOOXOOOOOOXXOOOOOOOOOOOOOOOXXOXOOOOOOOOOOOOOO",
+"OOOOOOXOXXOOOoXOoooOOOOOXOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOXXXoOOOXOOOOX.XOOO.OOOOOO.OOOOXXXOOOOOO",
+"OOOOOOXOOOOX.XXOOOOXOOOXOOOOOOOOOOXXX...OOXOOOOO",
+"OOOOOOOOOOOXOOOOOOOXOOOOOXOO.XOOOOoo.oX.XXoOOOOO",
+"OOOOOOOOOOOOOOoOOOOOX.OOXOOOOOOOOOOOOXXXXOXXXOOO",
+"OOOOOOOXOOOOOoOOOOOXOOOOOOOO.OOOOOOO.OOOOOOOXOOO",
+"OOOOOOOOOOXOoOOOo.OOOOOOOOOOO.OOOOOXOOOOOOOOOXOO",
+"OOOOOXOXXXOXXOXOOOOOOOO.XOOOOOOoOXXXXOOOOOOOOOOO",
+"OOOO.....OOoXXXXOOOOOXXOOOOOOXOOOoOOXXXXOOOOOOOO",
+"OOOOXOOOOOoOXo.OOOXXXXOOOOOO.OOOOOooOOOOOOOOOOOO",
+"OOOXOOXOOOoOXoOOOoOOOoOOOOOOOO.XOOOoOOOOOOOOOOOO",
+"OOOOOOOXOoOOoOXooooOOOOOOO.OOOXXXOOOXXOOOOOOOOOO",
+"OOOXOOOOoOOOXXooOOXXOOOXoOOOOOoOO.OOOXXOOOOOXOOO",
+"OOOOOOOOoOOXoooOO.OOOOOOOOO.OOOoXOOOOoXOOOOOOOOO",
+"OOOOOOOOOOXXXX..OXOXXoOOOOOOX.OoX.OOOOXXOOOOOOOO",
+"OOOOOOOOOXOXXOOXXXXOOoOXOXXOXOOOX.XOOOOXOOOOOOOO",
+"OOOOOOOOOOXOXXXXXOXOOoOXOXXOXOOOo.XOOOOXOOOOOOOO",
+"OOOOOOOOOX..XOXOOOX.oOOXOo.OXOOOO.XOOOOOXOO.OOOO",
+"OOOOOOOOX.XXOOOOOXO.OOOOOo.OOOOOO.XOOOOOXOOOOOOO",
+"OOOOOOOX..XoOOOOOXOOO..OoO.OOOOOOOXOO.OO.XOOOOOO",
+"OOOOOOOX.XXOOOOOOOOOOOOoO.OOOOOOOOXOOOOOOOOOOOOO",
+"OOOOOOOXOXOOOOOOOOOOOOOO..OOOOOOOOOoOOOOOXOOOOOO",
+"OOOOOOOXOXOOOOOOOOOOOOOOXOOOO.OOOOOoOOOOOOOOOOOO",
+"OOOOOXOOOOOXOOOOOOOOOOOOXOOOOOOOOOXoOOOOOOOOOOOO",
+"OOOOOOOOOXOOOOOOOOOOOOOOXOXOOOOOOOXoOOOOOOOOOOOO",
+"OOOOOOOOOOOOXOOOOOOOOOXOXOOOOOOOXXOOOOOOOOOOOOOO",
+"OOOOOOOXOXOXOOOOOOOOOXOXOOO.OOOOXOOOOOOOOOOOOOOO",
+"OOOOOXOOOOOOOOOOOOOOOOOOOOOOOOOX.OOO.OOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
+};
diff --git a/images/tiles-12.xpm b/images/tiles-12.xpm
new file mode 100644 (file)
index 0000000..20feff1
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 8 1",
+"  c black",
+". c #3F3F3F3F0000",
+"X c #3F3F3F3F3F3F",
+"o c #7F7F3D3D0000",
+"O c #727272727272",
+"+ c gray50",
+"@ c gray75",
+"# c #DFDFDFDFDFDF",
+/* pixels */
+"                                ",
+"  ############################  ",
+" # ########################## O ",
+" ## ######################## OO ",
+" ###                        OOO ",
+" ### @@@@@@@@@@@@@@@@@@@@@@ OOO ",
+" ### @@@@@@@@@@@@@@@@@@@@@@ OOO ",
+" ### @@@@@@@@@@@@@@@@@@@@@@ OOO ",
+" ### @@XX@X      @@@@@@@X@@ OOO ",
+" ### @@@   XXXXXXXXXXXXX @@ OOO ",
+" ### @@@   X   X         @@ OOO ",
+" ### @@@   X   X @@@@@@@@@@ OOO ",
+" ### @@@         @@@@@@@+@@ OOO ",
+" ### @@..  @X@ @@@@@@@+X@@@ OOO ",
+" ### @@... @X@ @@@@@+XX+@@@ OOO ",
+" ### @....@   @@@@+XX+X@@@@ OOO ",
+" ### @.o..@@@@@@@+XX+X+@@@@ OOO ",
+" ### @....@@@@@@+XX+XX@@@@@ OOO ",
+" ### @....@@ @@@XX+XX+@@@@@ OOO ",
+" ### @@@@@@@+ @+X+XX+@@@@@@ OOO ",
+" ### @@@@@@@@+ X+XX+@@@@@@@ OOO ",
+" ### @@@@@@@@@+ X+@@@@@@@@@ OOO ",
+" ### @@@@@@@@..+ @@@@@@@@@@ OOO ",
+" ### @@@@@@@.o.@+ @@@@@@@@@ OOO ",
+" ### @@@@@@.o.@@@+ @@@@@@@@ OOO ",
+" ### @@@@@@..@@@@@@@@@@@@@@ OOO ",
+" ### @@@@@@@@@@@@@@@@@@@@@@ OOO ",
+" ###                        OOO ",
+" ## OOOOOOOOOOOOOOOOOOOOOOOO OO ",
+" # OOOOOOOOOOOOOOOOOOOOOOOOOO O ",
+"  OOOOOOOOOOOOOOOOOOOOOOOOOOOO  ",
+"                                "
+};
diff --git a/images/tiles-120.xpm b/images/tiles-120.xpm
new file mode 100644 (file)
index 0000000..8f275a6
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c #99997F7F4C4C",
+"X c red",
+"o c #FFFF7F7F0000",
+"O c yellow",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++++++++++++++++++++XX+++++++++++++++++++++++",
+"+++++++++++++++++++X++++++++++ooo+oo++++++++++++",
+"+++++++++XXXo+o++++++++++++++++++++++++o++++++++",
+"+++++XXXX++XX+++o++++++++X+.++++++++++++++++++++",
+"++++XX+++++++XX++Xo+++++++++o++++o+++XXX++++++++",
+"++++++++++.+++++++X++++++++o+X+.oo+++ooXX+++++++",
+"++++++o++++++.++++++++++++.++++o++++.+o+X+++++++",
+"+++++++++++++++++.++.+++++++++++++++++++XXX+++++",
+"++++++++++++++++++o++++++.+++o++++.+++++.+++++++",
+"++++++OOOO+++++++++oX+.++++++++++++.++++++o+++++",
+"++++OO++++oo+++++X+o++++++o+++.++++oO+O.o.XXo+++",
+"+++o+++XX+++++.++++++++++++++++++++++++++++XXX++",
+"++oX+++++oo++X+o+++++++++o+++++oX+X++++++++++XX+",
+"+++X+++++++o++++++o++.++++++o++++++o++++++.+++X+",
+"++oX++o+++++++++++++++.+++++++oo++++++++++++++X+",
+"+XX+++o+oo+++O++OO++++++++++++++++++++.+++++++X+",
+"+X+X+++++oo+O+++o++++++++++X++++++X++++ooo++++X+",
+"++XX++o+.++oX+++.++++++.+.+..+++++++++++++o+++++",
+"+++++++++++++++++.+o+++++o++++++++O+.++XooO+++++",
+"+++++++++++.++O+++++oX++.+.++.++++++...oo+ooo+++",
+"+++++++.+++++O+++++o+++++.++X++++.++X+++++++o+X+",
+"+++++++++++.+++++X++++++++++++++++++++++.++++oX+",
+"++++++++oo+oo++.+++++++X.++++++O++++o+++++++++X+",
+"+++++XXXX++O+o+..++++++++++++.+++++++ooo+++++XX+",
+"++++++++++O+++++++o+oo++++++X+++++++++++.++++X++",
+"+++o++o+++O+o++++O++.O++++++.+X++.++++++++++++++",
+"++XXX++o+O+++++++O+++++..+++++++o+++o+++++.+++++",
+"++XX++++++.+++O+++++++++++++++O++++++.o+++++o+++",
+"++XX+++++++++++++++++++++++++++O+++++Oo+++++++++",
+"++XX+++++++++o+X+++o+.++++++o++O++++++oo+++.++++",
+"++XX+++++o+++++oo+.+++++++o+.++.++o++++o.+++++++",
+"+++++++++++++o++++o++++o+++++.++++o++++o++++++++",
+"+++++++++++++.+++++++++o+O++++++++o+++++o++X++++",
+"++++++++o+o.+++++++X+++++.+++++++Xo+++++o+++++++",
+"+++++++oX+o++++++o+++XX+O++++++.++o++X++Xo++++++",
+"+++++++o++o++++++++++++O+X++++++++o+++++++++++++",
+"++++++++X+++++++++.+++++XX+++++++++O++++XX++++++",
+"++++++++X+++++++++++++++o++++X+++++O+++XX+++++++",
+"+++++o+XX++o++++++++XXX+o+++++++++oO+++X++++++++",
+"+++++++XXo+++++++..+X+++o+o+++++++oO+++X++++++++",
+"++++++++XXXXX+++++++XXo+o.++++++oo++.+++++++++++",
+"+++++++oXX+XX++++++++X+o+++X++X+o+++++++++++++++",
+"+++++o+XX++X++++++++++++++++++XXX+++X+++++++++++",
+"++++++++X+++++++++++X+++++++++++++++++++++++++++",
+"++++++++X+++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-121.xpm b/images/tiles-121.xpm
new file mode 100644 (file)
index 0000000..5775ef5
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c #99997F7F4C4C",
+"X c red",
+"o c #FFFF7F7F0000",
+"O c yellow",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++++++++++++++++X++++++++++o+o++o++++++++++++",
+"+++++++++++X+++++++++++++++++++++++++++o++++++++",
+"+++++X++++++++++o++++++++X++++++++++++++++++++++",
+"++++X++++++++++++Xo+++++++++++++++++++++++++++++",
+"++++++++++.+++++++++++++++++++++++++++++X+++++++",
+"++++++o+++++++++++++++++++++++++++++.+++X+++++++",
+"++++++++++++++++++++.+++++++++++++++++++++X+++++",
+"+++++++++++++++++++++++++.+++o++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++X+++++",
+"+++o++++X+++++++++++++++++++++++++++++++++++++++",
+"+++++++++++++++o+++++++++o++++++++++++++++++++++",
+"++++++++++++++++++++++++++++o+++++++++++++++++++",
+"++o++++++++++++++++++++++++++++o++++++++++++++++",
+"++++++o+++++++++O+++++++++++++++++++++++++++++++",
+"++++++++++o++++++++++++++++++++++++++++++o++++++",
+"+++X+++++++++++++++++++++.+.++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++++++++++++++++++++++++++++++++++.++++ooo+++",
+"+++++++++++++++++++o+++++.++X++++.++++++++++++X+",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++++++o++++++++++++++.++++++O++++++++++++++++",
+"+++++++X+++++++++++++++++++++.++++++++++++++++++",
+"+++++++++++++++++++++o+++++++++++++++++++++++X++",
+"++++++o+++++++++++++.+++++++.+++++++++++++++++++",
+"+++++++++++++++++O++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++O+++++++++++++o+++",
+"+++++++++++++++++++++++++++++++O++++++++++++++++",
+"++X+++++++++++++++++++++++++o++++++++++o++++++++",
+"++++++++++++++++++++++++++++.+++++o+++++++++++++",
+"+++++++++++++++++++++++++++++.++++o+++++++++++++",
+"+++++++++++++++++++++++o++++++++++++++++o+++++++",
+"++++++++o++++++++++X++++++++++++++++++++++++++++",
+"+++++++++++++++++++++X++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++o+++++++++++++",
+"+++++++++++++++++++++++++X++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++o+++++o+++++++++++++++++++++++O++++++++++++",
+"+++++++++++++++++..++++++++++++++++++++X++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++X++++++++X++++++++X+++++++++++++++++",
+"+++++++++++X++++++++++++++++++++++++X+++++++++++",
+"++++++++X+++++++++++++++++++++++++++++++++++++++",
+"++++++++X+++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-122.xpm b/images/tiles-122.xpm
new file mode 100644 (file)
index 0000000..1a2dce7
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 7 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c red",
+"O c gray75",
+"+ c gray100",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@OOOO@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@O+  .  @@@@@@@@@@@",
+"@@@@@@@@@@@@@O++ ++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OOOO++o+O@@@@@@@@@@",
+"@@@@@@@@@@@@@OOO.++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XO..++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XO.O++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XOOO++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XOO.++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OO..++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OO.O++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OOOO++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OOO.++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OO..++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OO.O++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OOOO++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XOO.++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XO..++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XO.O++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XOOO++o+O@@@@@@@@@@",
+"@@@@@@@@@@@@@OOO ++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OO    X @@@@@@@@@@@",
+"@@@@@@@@@@@@@OXX  X  @@@@@@@@@@@",
+"@@@@@@@@@@@@@@XXXXXX@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@XXXXX@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/images/tiles-123.xpm b/images/tiles-123.xpm
new file mode 100644 (file)
index 0000000..52a2f86
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 7 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c red",
+"O c gray75",
+"+ c gray100",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@OOOOOOOOOOOOOOOOOOO@@@@@",
+"@@@@@@  +++++++++++++++++++ @@@@",
+"@@@@@O X+o+++++++++++++++o+ .@@@",
+"@@@@OOX +++++++++++++++++++..@@@",
+"@@@@OO  +++++++++++++++++++ .@@@",
+"@@@@OO   OO..OO..OO..OO..O  .@@@",
+"@@@@OOO XX..XX..XX..XX..XXXX.@@@",
+"@@@@OOXXXXXXXXXXXXXXXXXXXXX.@@@@",
+"@@@@@@XX....XXXXXXXX....XX.@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/images/tiles-124.xpm b/images/tiles-124.xpm
new file mode 100644 (file)
index 0000000..8b2f4ab
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 7 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c red",
+"O c gray75",
+"+ c gray100",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@OOOOO@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@O+  ++O@@@@@@@@@@@@@@@@@@",
+"@@@@@@O+.. +o+O@@@@@@@@@@@@@@@@@",
+"@@@@@@O   +++++O@@@@@@@@@@@@@@@@",
+"@@@@@@OO  O+++++O@@@@@@@@@@@@@@@",
+"@@@@@@XOXOX.+++++O@@@@@@@@@@@@@@",
+"@@@@@@@.OX..O+++++O@@@@@@@@@@@@@",
+"@@@@@@@@.O.OX.+++++O@@@@@@@@@@@@",
+"@@@@@@@@@.OX..O+++++O@@@@@@@@@@@",
+"@@@@@@@@@@.O.OX.+++++O@@@@@@@@@@",
+"@@@@@@@@@@@XOX..O+++++O@@@@@@@@@",
+"@@@@@@@@@@@@XO.OX.+++++O@@@@@@@@",
+"@@@@@@@@@@@@@XOX..O+++++O@@@@@@@",
+"@@@@@@@@@@@@@@XO.OX.+++o+O@@@@@@",
+"@@@@@@@@@@@@@@@.OX..O++++ @@@@@@",
+"@@@@@@@@@@@@@@@@.O.OX.++. @@@@@@",
+"@@@@@@@@@@@@@@@@@.OXO   . @@@@@@",
+"@@@@@@@@@@@@@@@@@@.OXO   .@@@@@@",
+"@@@@@@@@@@@@@@@@@@@XOXXX.@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@....@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/images/tiles-125.xpm b/images/tiles-125.xpm
new file mode 100644 (file)
index 0000000..5e8744d
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 7 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c red",
+"O c gray75",
+"+ c gray100",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@OO @@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@O+++  @@@@@@@",
+"@@@@@@@@@@@@@@@@@@O+o++  X@@@@@@",
+"@@@@@@@@@@@@@@@@@O+++++  X@@@@@@",
+"@@@@@@@@@@@@@@@@O+++++X XX@@@@@@",
+"@@@@@@@@@@@@@@@O+++++XXXXX@@@@@@",
+"@@@@@@@@@@@@@@O+++++X.XX.@@@@@@@",
+"@@@@@@@@@@@@@O+++++XX.X.@@@@@@@@",
+"@@@@@@@@@@@@O+++++X.XX.@@@@@@@@@",
+"@@@@@@@@@@@O+++++XX.X.@@@@@@@@@@",
+"@@@@@@@@@@O+++++X.XXX@@@@@@@@@@@",
+"@@@@@@@@@O+++++XX.XX@@@@@@@@@@@@",
+"@@@@@@@@O+++++X.XXX@@@@@@@@@@@@@",
+"@@@@@@@ +o+++XX.XX@@@@@@@@@@@@@@",
+"@@@@@@  ++++X.XX.@@@@@@@@@@@@@@@",
+"@@@@@OO X++XX.X.@@@@@@@@@@@@@@@@",
+"@@@@@OOX   XXX.@@@@@@@@@@@@@@@@@",
+"@@@@@OOO  XXX.@@@@@@@@@@@@@@@@@@",
+"@@@@@@OOOOXXX@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@OOOX@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/images/tiles-126.xpm b/images/tiles-126.xpm
new file mode 100644 (file)
index 0000000..5cb3040
--- /dev/null
@@ -0,0 +1,65 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 11 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c #00007F7F0000",
+"o c gray50",
+"O c #00000000E6E6",
+"+ c #66666666E6E6",
+"@ c #0000E6E60000",
+"# c red",
+"$ c yellow",
+"% c gray75",
+"& c gray100",
+/* pixels */
+" +++++++++++++++++++++++++++++++++++++++++++++++",
+" +                                             +",
+" +@@@@@@@@@@@@@@@@@@@@@.@@.@@@@@@@@@@@@@@@@@@@ +",
+" +@@@ @@@@@@@@@@@@@@@@.@@.@@@@@@@@@@@@@@@@@@@@ +",
+" +o%%@@@@@@o@o@@@@++++++++++++++++++++++++@@@@ +",
+" +o%%@@@@@@@o@@@@++                      O@@@@ +",
+" +o%%@@@@@@o@o@@+O+ooooooooooooooooooooo O@@@@ +",
+" +o%%@@@@@o@@@@+O++ooooooooooooooooooooo O@@@@ +",
+" +...@@+o......O+++oo.$$$$$$oo.$$$$$oooo O...o +",
+" +@@@@++o......++O+oo.$$$$$$$o.$$$$$$ooo O...o +",
+" +@ @+O+o......+O++oo.$$...$$o.$$..$$$oo O...o +",
+" +@@+O++o......O+++oo.$$oo.$$o.$$oo.$$oo O...o +",
+" +@+O+++o..o ..++O+oo.$$oo.$$o.$$oo.$$oo O...o +",
+" +@+++O+o..o ..+O++oo.$$$$$$$o.$$oo.$$oo O...o +",
+" +@++O++o......O+++oo.$$$$$$.o.$$oo.$$oo O...o +",
+" +@+O+++o......++O+oo.$$....oo.$$oo.$$oo O...o +",
+" +@+++O+o......+O++oo.$$oooooo.$$oo.$$oo O...o +",
+" +@++O++o..o ..O+++oo.$$oooooo.$$oo$$$oo O...o +",
+" +@+O+++o..o ..++O+oo.$$oooooo.$$$$$$.oo O...o +",
+" +@+++O+o......+O++oo.$$oooooo.$$$$$.ooo O...o +",
+" +@++O++o......O+++oo...oooooo......oooo O...o +",
+" +@+O+++o......++O+ooooooooooooooooooooo O...o +",
+" +@+++O+o......+O++OOOOOOOOOOOOOOOOOOOOOOO...o +",
+" +@++O++o......O++OOOOOOOOOOOOOOOOOOOOOOO....o +",
+" +@+O+++o......++OO OO OO OO OO OO OO OO.....o +",
+" +@+++O+ooooooo+OOOOOOOOOOOOOOOOOOOOOOOooooooo +",
+" +@++O++OOOOOOOOO OO OO OOOOO OO OO OOOOOOOOOO +",
+" +@+O++OOOOOOOOOOOOOOOOO     OOOOOOOOOOOOOOOO@ +",
+" +@+++OOO OO OO OO O&OO ....OOO&O OO OO OOOOX@ +",
+" +@++OOOOOOOOOOOOOOoOO ....OOOoOOOOOOOOOOOOXX@ +",
+" +@+OOOOOOOOOOOOOOoOO ....OOOoOOOOOOOOOOOOXXX@ +",
+" +@@XXXXXXXXXXXXXXo.o......o.ooXXXXXXXXXXXXXX@ +",
+" +@@@XXXXXXXXXXXXXo..........oXXXXXXXXXXXXXXX@ +",
+" +@@@@XXXXXXXX......................XXXXXXXXX@ +",
+" +@@@@@@@@@@@oooo....................XXX@@@@@@ +",
+" +@@@@@@@@@@oooooo....................XX@@@@@@ +",
+" +@@@@@@@@@oooooooo....................X@X@@@@ +",
+" +@@@@@@@@oooo@@@@ooo@@@@@@@@@oo@@@@oooo@@@@@@ +",
+" +@@@@X@@@oooo@@@@ooo@@@@@@@@@oo@@@@oooo@@@@X@ +",
+" +@@@@@@@@ooooooooooOOoooo  ooooOOoooooo@@@@@@ +",
+" +@X@@@@@@ooooooooooOOoooo&#ooooOOoooooo@@X@@@ +",
+" +@@@@@@@@ooooooooooOOoooo  ooooOOoooooo@@@@@@ +",
+" +@@@@@X@@oooo@@oooooooooooooooooo@@oooo@@@@@@ +",
+" +@@@@@@@@oooo@@o  o  o  ooo  oooo@@oooo@@@@@@ +",
+" +@X@@@@@@oooo@@o&#o&#o&#ooo&#oooo@@oooo@@@@@@ +",
+" +@@@@@@@@oooo@@o  o  o  ooo  oooo@@oooo@X@@@@ +",
+" +++++++++oooo++++++++++++++++++++++oooo++++++++",
+"          oooo                      oooo        "
+};
diff --git a/images/tiles-127.xpm b/images/tiles-127.xpm
new file mode 100644 (file)
index 0000000..fbb5bd2
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 3 1",
+"  c black",
+". c #0000E6E60000",
+"X c #CCCC7E7E6666",
+/* pixels */
+" ...............................................",
+" .                                             .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX.......XXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXX  ..   ..XXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX ..XX  ..XXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX ..XXX ..XXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX ..XXX ..XXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX ..XXX..XXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX ......XXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX ..  ..XXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX ..X  ..XXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX ..XX  ..XXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX....XX....XXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXX    XX    XXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" ...............................................",
+"                                                "
+};
diff --git a/images/tiles-128.xpm b/images/tiles-128.xpm
new file mode 100644 (file)
index 0000000..f538373
--- /dev/null
@@ -0,0 +1,70 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 7 1",
+"  c black",
+". c #585858585858",
+"X c gray50",
+"o c #7F7F7F7FFFFF",
+"O c green",
+"+ c #FFFFBFBF7F7F",
+"@ c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  ...............................................................  ",
+" . ............................................................. @ ",
+" .. ........................................................... @@ ",
+" ...                                                           @@@ ",
+" ... +++++++++++++++OO++++++ooo++++++++++++ooo +++++++++++++++ @@@ ",
+" ... ++ + ++ + ++++OOOO+++++ooo ooo++++++OO+ooo+++++++OO+O+  + @@@ ",
+" ... ++ + ++ + ++++OOO+++++++ooooooooo+++O++ooo+++++++OOOO     @@@ ",
+" ... ++ + ++ + ++++++++ +++++++ +++ooo+++O+ ooo++ooo+++++++    @@@ ",
+" ...            +++O++++++++++++++++oo+++O++oo ooo o+++++++  + @@@ ",
+" ... ++XXXXXXX +++OOO+++++ +++OO++++oo+++OO++ooooooooooo+ +  + @@@ ",
+" ...        X  +++OOO+ ++++OOOOOOO++oo+++++++oooo+ +ooooo++ ++ @@@ ",
+" ... +++++++++ +++O++++++OOOOO++++++oo++ ++++ooo+++++o+oo + ++ @@@ ",
+" ... +++++oooo +++OOO+++++++ooooo+++o+++ ++++ ++++++++++o++ ++ @@@ ",
+" ... ++ oooo+o o++++OO+++++o oooooooo ++ ++++ +++++++++oo + ++ @@@ ",
+" ... +oooo +++ oo+++++++++oo +++oooo XXX X     ++++++oooo++ ++ @@@ ",
+" ... oo ++++++ ooo+++++++ooX XX+ +++XX   XXXXX ++++ooooo+++ ++ @@@ ",
+" ... + +++++++ +oooo++++oooX +X ++++++         +++oooo ++++ ++ @@@ ",
+" ... +++++++++ ++ooooooooo+X + ++XXXX+++++  +++++ oooo+++++ ++ @@@ ",
+" ... +    ++++ ++++oooooo+XX                 o++ooooo+++++ +++ @@@ ",
+" ... +++++ +++ +++++++++XXXX XX++XXXXoooooooooooooo +++++ ++++ @@@ ",
+" ... ++++++ ++ ++++++++++++  +XXX++ooooooooooooooo X      ++++ @@@ ",
+" ... +++++++         ++++X X XXX+oooooo XXXXXXXoooXX XXXX +OO+ @@@ ",
+" ... ++++++++  +++++++ XX XX XXooooo X        XX   X XX X +OO+ @@@ ",
+" ... ++ ++++++ +++++++   X X X+oooo XXX X   X XXXXXX XX X ++++ @@@ ",
+" ... ++++++O++  ++++++  XXXX +oooo XXXXXX   X XXXX X XX X ++   @@@ ",
+" ... +++ +++++          X  X oooo X XX XX  XX   XX XXXXXX +    @@@ ",
+" ... +++++++++ XXXXXX        ooo XXX   XXXXX   XXXXXXXXX   +++ @@@ ",
+" ... ++O++O+++ XXX  X                 XXXXXXXX            ++++ @@@ ",
+" ... +OOO+++++ X XX X XXXX   oooXXX                XXXX   ++++ @@@ ",
+" ... +OOOO+O++ X XX X        oooXXXXXXXXXXXXXX XXXXXXXXXXOO+++ @@@ ",
+" ... +OO++++++ X XX X XXXX  X oo XX   XXX              X O+OO+ @@@ ",
+" ... ++++ ++++  XXX X   XX  X ooooXXXXXXXX             X O++++ @@@ ",
+" ... + +++++++  X X X      X  oooo                 XXXX XOOO++ @@@ ",
+" ... +++++++++XXXXX X X   XX XXXoooooooXXXXXXX XXX      XO+O++ @@@ ",
+" ... +++++++++XXXXX X XXXXXX XXXoooooooXXXX X  X X      XOOO++ @@@ ",
+" ... ++++                            oooX X X  XXXX  X  X ++++ @@@ ",
+" ... ++++++ ++XX  X    +++ X XXXXXXXX   XXX X  X  X XX  X ++++ @@@ ",
+" ... +++++++++XXXXX    + ++X XXXX+XXX XoXXX X  XX X X   X ++++ @@@ ",
+" ... +++++++++ XXXX    +              ooX X X    XX XX  X ++++ @@@ ",
+" ... +++++++++ XXXX O O+ XXX XX+o ooooooX XXX   XXX XXXXX      @@@ ",
+" ... +++++++++ X XXX OOX X+X X oo oooooXXX X  XXXXX XXXXX ++++ @@@ ",
+" ... +++ +++++ X XXX OOXX+X+ Xooo o + XXX     XXXXXX OOOOO++++ @@@ ",
+" ... ++++              +X+X+ XooX XXXXX     X    XXOO  OOOOOO+ @@@ ",
+" ... +++++++++ XXXX  X +XXXX Xooo X    XXX  XXXXXXXOOOOOOOOOOO @@@ ",
+" ... +++++++++ XXXXX X OXX+X XoooXXX XXXXX XX XX   XXX  OO++++ @@@ ",
+" ... +++++++++          XXXX oooooXX XXXXXX XXXXXXXXoooooooo++ @@@ ",
+" ... +++++++++++++++ +++X+XX+ooooo X XXXoooo  XXXXXooooooooooo @@@ ",
+" ... +++++++++++++++ ++XX++O+ ooooooo oooooooooooooooo+++oooo  @@@ ",
+" ... +++++++++++++++ ++X+++O++++ooooooooooooooooooooo+++++oooo @@@ ",
+" ... +++++++++++++++ +++++OO++++++oooo+++++ooooooo++++++++++++ @@@ ",
+" ... +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@@ ",
+" ...                                                           @@@ ",
+" .. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ ",
+" . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+"                                                                   "
+};
diff --git a/images/tiles-129.xpm b/images/tiles-129.xpm
new file mode 100644 (file)
index 0000000..936a07f
--- /dev/null
@@ -0,0 +1,70 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 7 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c #585858585858",
+"o c #3F3F3F3FFFFF",
+"O c #0000BFBF0000",
+"+ c #BFBF7F7F3F3F",
+"@ c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+" @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ X ",
+" @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ XX ",
+" @@@                                                           XXX ",
+" @@@ +++++++++++++++OO++++++ooo++++++++++++ooo +++++++++++++++ XXX ",
+" @@@ ++ + ++ + ++++OOOO+++++ooo ooo++++++OO+ooo+++++++OO+O+  + XXX ",
+" @@@ ++ + ++ + ++++OOO+++++++ooooooooo+++O++ooo+++++++OOOO     XXX ",
+" @@@ ++ + ++ + ++++++++ +++++++ +++ooo+++O+ ooo++ooo+++++++    XXX ",
+" @@@            +++O++++++++++++++++oo+++O++oo ooo o+++++++  + XXX ",
+" @@@ ++....... +++OOO+++++ +++OO++++oo+++OO++ooooooooooo+ +  + XXX ",
+" @@@        .  +++OOO+ ++++OOOOOOO++oo+++++++oooo+ +ooooo++ ++ XXX ",
+" @@@ +++++++++ +++O++++++OOOOO++++++oo++ ++++ooo+++++o+oo + ++ XXX ",
+" @@@ +++++oooo +++OOO+++++++ooooo+++o+++ ++++ ++++++++++o++ ++ XXX ",
+" @@@ ++ oooo+o o++++OO+++++o oooooooo ++ ++++ +++++++++oo + ++ XXX ",
+" @@@ +oooo +++ oo+++++++++oo +++oooo ... .     ++++++oooo++ ++ XXX ",
+" @@@ oo ++++++ ooo+++++++oo. ..+ +++..   ..... ++++ooooo+++ ++ XXX ",
+" @@@ + +++++++ +oooo++++ooo. +. ++++++         +++oooo ++++ ++ XXX ",
+" @@@ +++++++++ ++ooooooooo+. + ++....+++++  +++++ oooo+++++ ++ XXX ",
+" @@@ +    ++++ ++++oooooo+..                 o++ooooo+++++ +++ XXX ",
+" @@@ +++++ +++ +++++++++.... ..++....oooooooooooooo +++++ ++++ XXX ",
+" @@@ ++++++ ++ ++++++++++++  +...++ooooooooooooooo .      ++++ XXX ",
+" @@@ +++++++         ++++. . ...+oooooo .......ooo.. .... +OO+ XXX ",
+" @@@ ++++++++  +++++++ .. .. ..ooooo .        ..   . .. . +OO+ XXX ",
+" @@@ ++ ++++++ +++++++   . . .+oooo ... .   . ...... .. . ++++ XXX ",
+" @@@ ++++++O++  ++++++  .... +oooo ......   . .... . .. . ++   XXX ",
+" @@@ +++ +++++          .  . oooo . .. ..  ..   .. ...... +    XXX ",
+" @@@ +++++++++ ......        ooo ...   .....   .........   +++ XXX ",
+" @@@ ++O++O+++ ...  .                 ........            ++++ XXX ",
+" @@@ +OOO+++++ . .. . ....   ooo...                ....   ++++ XXX ",
+" @@@ +OOOO+O++ . .. .        ooo.............. ..........OO+++ XXX ",
+" @@@ +OO++++++ . .. . ....  . oo ..   ...              . O+OO+ XXX ",
+" @@@ ++++ ++++  ... .   ..  . oooo........             . O++++ XXX ",
+" @@@ + +++++++  . . .      .  oooo                 .... .OOO++ XXX ",
+" @@@ +++++++++..... . .   .. ...ooooooo....... ...      .O+O++ XXX ",
+" @@@ +++++++++..... . ...... ...ooooooo.... .  . .      .OOO++ XXX ",
+" @@@ ++++                            ooo. . .  ....  .  . ++++ XXX ",
+" @@@ ++++++ ++..  .    +++ . ........   ... .  .  . ..  . ++++ XXX ",
+" @@@ +++++++++.....    + ++. ....+... .o... .  .. . .   . ++++ XXX ",
+" @@@ +++++++++ ....    +              oo. . .    .. ..  . ++++ XXX ",
+" @@@ +++++++++ .... O O+ ... ..+o oooooo. ...   ... .....      XXX ",
+" @@@ +++++++++ . ... OO. .+. . oo ooooo... .  ..... ..... ++++ XXX ",
+" @@@ +++ +++++ . ... OO..+.+ .ooo o + ...     ...... OOOOO++++ XXX ",
+" @@@ ++++              +.+.+ .oo. .....     .    ..OO  OOOOOO+ XXX ",
+" @@@ +++++++++ ....  . +.... .ooo .    ...  .......OOOOOOOOOOO XXX ",
+" @@@ +++++++++ ..... . O..+. .ooo... ..... .. ..   ...  OO++++ XXX ",
+" @@@ +++++++++          .... ooooo.. ...... ........oooooooo++ XXX ",
+" @@@ +++++++++++++++ +++.+..+ooooo . ...oooo  .....ooooooooooo XXX ",
+" @@@ +++++++++++++++ ++..++O+ ooooooo oooooooooooooooo+++oooo  XXX ",
+" @@@ +++++++++++++++ ++.+++O++++ooooooooooooooooooooo+++++oooo XXX ",
+" @@@ +++++++++++++++ +++++OO++++++oooo+++++ooooooo++++++++++++ XXX ",
+" @@@ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ XXX ",
+" @@@                                                           XXX ",
+" @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX ",
+" @ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X ",
+"  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
+"                                                                   "
+};
diff --git a/images/tiles-13.xpm b/images/tiles-13.xpm
new file mode 100644 (file)
index 0000000..2488459
--- /dev/null
@@ -0,0 +1,47 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 9 1",
+"  c black",
+". c #00003F3F0000",
+"X c #3F3F3F3F0000",
+"o c #3F3F3F3F3F3F",
+"O c #7F7F3D3D0000",
+"+ c #3C3C0000FFFF",
+"@ c #FFFF3C3C0000",
+"# c #BFBFBFBF0000",
+"$ c yellow",
+/* pixels */
+"                                ",
+"  ############################  ",
+" # ########################## $ ",
+" ## ######################## $$ ",
+" ###                        $$$ ",
+" ### ++++++++++++++OXXXXX++ $$$ ",
+" ### ++++++++++++XXXXOXOX+X $$$ ",
+" ### ++++++++++++OXOX+X XX+ $$$ ",
+" ### ++++++++++XOXXXOXXX+X+ $$$ ",
+" ### +++++++++XXXOX+XXX+X++ $$$ ",
+" ### +++++++++XXX XXXXX++++ $$$ ",
+" ### +++++++OOXX+XXOX+++X++ $$$ ",
+" ### ++++++XXX++OXX++++++X+ $$$ ",
+" ### ++++++XX++XX+++++++O++ $$$ ",
+" ### ++++OX+ XXX+++X+++XX+X $$$ ",
+" ### ++++XX+OXX++++++++OXOX $$$ ",
+" ### +++X++X++++++++++OXX++ $$$ ",
+" ### ++X++X++++++++++OOXXX+ $$$ ",
+" ### ++ + +++++++++++X+X+++ $$$ ",
+" ### ++ + ++++++++++X+X++++ $$$ ",
+" ### ++ + +++++++++o+o+++++ $$$ ",
+" ### ++ + +++++++++o+o+++++ $$$ ",
+" ### +        +++ooooo+++++ $$$ ",
+" ### .  o o   ...o o o..... $$$ ",
+" ### .        .......@..... $$$ ",
+" ### .........@...@........ $$$ ",
+" ### ...................... $$$ ",
+" ###                        $$$ ",
+" ## $$$$$$$$$$$$$$$$$$$$$$$$ $$ ",
+" # $$$$$$$$$$$$$$$$$$$$$$$$$$ $ ",
+"  $$$$$$$$$$$$$$$$$$$$$$$$$$$$  ",
+"                                "
+};
diff --git a/images/tiles-130.xpm b/images/tiles-130.xpm
new file mode 100644 (file)
index 0000000..a3c2823
--- /dev/null
@@ -0,0 +1,70 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 7 1",
+"  c black",
+". c #585858585858",
+"X c gray50",
+"o c #7F7F7F7FFFFF",
+"O c green",
+"+ c #FFFFBFBF7F7F",
+"@ c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  ...............................................................  ",
+" . ............................................................. @ ",
+" .. ........................................................... @@ ",
+" ...                                                           @@@ ",
+" ...  ooooooooo    ++++++++++++++++++++++++++++++++ooooo++++++ @@@ ",
+" ... + oooooooooXX    ++++++++++++++++++      ++ +ooooo+++O+++ @@@ ",
+" ... ++  ooooooooXXX          ++++++++      XX  Xoooo+++OO++++ @@@ ",
+" ... ++   ooooooooXXoooooooX+ +++++++      XXXXXXooo++OO++++++ @@@ ",
+" ... +++ XXXoooooooooooooooXo++++++  +++  XXXoooooo+++     +++ @@@ ",
+" ... O+++  XXooooooooooooooXooo+++++ +++ X oXooooo ++ ++++++++ @@@ ",
+" ... +++++++X+   ooooooooooXooo +++++  XX ooXoooo  ++ ++++++++ @@@ ",
+" ... ++O++++ +++  XX X     Xooooooo+ X  ooooXooX    + ++++++++ @@@ ",
+" ... +++O+++ + ++ XXXXXXXXXX oooooooooooooooX  XXXX   ++++++++ @@@ ",
+" ... +++O+++   +++XX XX   XX  ooooooooooooo+X+ X XXXX ++++++++ @@@ ",
+" ... +++OO++   ++++        XXX ooooooooooo++ +XX XX X ++++++++ @@@ ",
+" ... ++OOO++   +++++  XXXX   XXooooooooooo++  X    XX       ++ @@@ ",
+" ... +++OO+    XXXXX  XXX     Xoooooooooo  +  XX   XXX++++++++ @@@ ",
+" ... +++++++++ XXXX   XX      X oooooooooX    XXXXXXXX++++++++ @@@ ",
+" ... +++++++++ XXX       X   X  ooooooooo      XX XXX ++++++++ @@@ ",
+" ... +++++++   XX        X    Xoooooooooo      XXXX X ++++++++ @@@ ",
+" ... ++++++  X X     X   XXX  XoooooooooooXXXXXXXXXXX ++++++++ @@@ ",
+" ... OO+++          XXXX     ooooooooooooooXXXX XXX          + @@@ ",
+" ... OO+        XX  X  XX   oooooooooooooooo    XXX   ++++++++ @@@ ",
+" ... OO +++     X       XXXoooooooXX ooooooo    XXX   +O++++++ @@@ ",
+" ... OO +++              ooooooXX X   Xooooo XX X X   ++++O+++ @@@ ",
+" ... ++ +++ XX   XX X X +XXooXXXXXX    XXXXXXXX X XX  +++OO+++ @@@ ",
+" ... ++ +++ XX   XX XXX +oXX X      X   ooooo   XXXX  +++O++++ @@@ ",
+" ... ++ +++ XXXXXX   XX ooooXX X    X   ooooo   X X     ++++++ @@@ ",
+" ... ++ +++             ooooXXXX    XX  Xooooo           +++++ @@@ ",
+" ... ++ +++ XXXXXX    X oooXXXXX XX XX  Xooooo       XX  +++++ @@@ ",
+" ... ++ +++ XXXXX     XXoooXXXXXXX XXX  Xooooooo      X    +++ @@@ ",
+" ... ++ +++ XX   X    oooo         X    XXooooooo     X     ++ @@@ ",
+" ... ++ +++XXX  XX   ooooo               XoooooooXX      ++ ++ @@@ ",
+" ... ++    XXX      ooooo    O          XXoooooooooo++++++++++ @@@ ",
+" ... ++ +++  XX     ooooXXXOOOO   X    XXoooooooooooooo + + +  @@@ ",
+" ... ++++++   XXXX oooooX OOOO   XXXX  XXooooooooooooooooooXXX @@@ ",
+" ... ++++++  XXXX XXoXXXX OOOO     XX  XXooooooooooooooooooooo @@@ ",
+" ... +       XXX oXXXXXXX OOO     XXX  XXooooooooooooooooooooo @@@ ",
+" ... OOOOO+ ooooooXoX             XX  XXXooooooooooooooooooooo @@@ ",
+" ... O+OOO oooooooXX  XXXXX  XX  XX   XX ooooooooooooooooooooo @@@ ",
+" ... +OO+ oooooooo+X XXXX   XXXX  X   XX ooooooooooooooooooooo @@@ ",
+" ... + +oooooooo ++XX  XXXXXXX X  XX  XX ooooooooooooooooooooo @@@ ",
+" ...  oooooo++++++++ XXXX XXXX XXX    Xooooooooooooooooooooooo @@@ ",
+" ... oooooo               XXX  XXX   XXoooo oooooX  oo Xoooooo @@@ ",
+" ... ooooo+OO +++O++     XXXXXXX       oo XX XXXXXXXX  XX oooo @@@ ",
+" ... oooo++OOO+++XX  XXXXXXXXX  +X+++++ooXXXXX    XXX  XXXoooo @@@ ",
+" ... oo++++OOOO   XX           +X++    oo           X XXXXXooo @@@ ",
+" ... ++    O+O+++ ++XX++X+++++OOO+X+++++ ++   XXXXXXX XXX  ooo @@@ ",
+" ...      X OO     + +++X+++++X++OO+++++ ++++ O        XXX  oo @@@ ",
+" ... +++ +++O++++++++++++++OO+++++++++++ +++++O+++++++++    oo @@@ ",
+" ... ++++++++++++++++++++++++++++++++++++++++++++++++++++++ XX @@@ ",
+" ...                                                           @@@ ",
+" .. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ ",
+" . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+"                                                                   "
+};
diff --git a/images/tiles-131.xpm b/images/tiles-131.xpm
new file mode 100644 (file)
index 0000000..011759b
--- /dev/null
@@ -0,0 +1,70 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 7 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c #585858585858",
+"o c #3F3F3F3FFFFF",
+"O c #0000BFBF0000",
+"+ c #BFBF7F7F3F3F",
+"@ c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+" @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ X ",
+" @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ XX ",
+" @@@                                                           XXX ",
+" @@@  ooooooooo    ++++++++++++++++++++++++++++++++ooooo++++++ XXX ",
+" @@@ + ooooooooo..    ++++++++++++++++++      ++ +ooooo+++O+++ XXX ",
+" @@@ ++  oooooooo...          ++++++++      ..  .oooo+++OO++++ XXX ",
+" @@@ ++   oooooooo..ooooooo.+ +++++++      ......ooo++OO++++++ XXX ",
+" @@@ +++ ...ooooooooooooooo.o++++++  +++  ...oooooo+++     +++ XXX ",
+" @@@ O+++  ..oooooooooooooo.ooo+++++ +++ . o.ooooo ++ ++++++++ XXX ",
+" @@@ +++++++.+   oooooooooo.ooo +++++  .. oo.oooo  ++ ++++++++ XXX ",
+" @@@ ++O++++ +++  .. .     .ooooooo+ .  oooo.oo.    + ++++++++ XXX ",
+" @@@ +++O+++ + ++ .......... ooooooooooooooo.  ....   ++++++++ XXX ",
+" @@@ +++O+++   +++.. ..   ..  ooooooooooooo+.+ . .... ++++++++ XXX ",
+" @@@ +++OO++   ++++        ... ooooooooooo++ +.. .. . ++++++++ XXX ",
+" @@@ ++OOO++   +++++  ....   ..ooooooooooo++  .    ..       ++ XXX ",
+" @@@ +++OO+    .....  ...     .oooooooooo  +  ..   ...++++++++ XXX ",
+" @@@ +++++++++ ....   ..      . ooooooooo.    ........++++++++ XXX ",
+" @@@ +++++++++ ...       .   .  ooooooooo      .. ... ++++++++ XXX ",
+" @@@ +++++++   ..        .    .oooooooooo      .... . ++++++++ XXX ",
+" @@@ ++++++  . .     .   ...  .ooooooooooo........... ++++++++ XXX ",
+" @@@ OO+++          ....     oooooooooooooo.... ...          + XXX ",
+" @@@ OO+        ..  .  ..   oooooooooooooooo    ...   ++++++++ XXX ",
+" @@@ OO +++     .       ...ooooooo.. ooooooo    ...   +O++++++ XXX ",
+" @@@ OO +++              oooooo.. .   .ooooo .. . .   ++++O+++ XXX ",
+" @@@ ++ +++ ..   .. . . +..oo......    ........ . ..  +++OO+++ XXX ",
+" @@@ ++ +++ ..   .. ... +o.. .      .   ooooo   ....  +++O++++ XXX ",
+" @@@ ++ +++ ......   .. oooo.. .    .   ooooo   . .     ++++++ XXX ",
+" @@@ ++ +++             oooo....    ..  .ooooo           +++++ XXX ",
+" @@@ ++ +++ ......    . ooo..... .. ..  .ooooo       ..  +++++ XXX ",
+" @@@ ++ +++ .....     ..ooo....... ...  .ooooooo      .    +++ XXX ",
+" @@@ ++ +++ ..   .    oooo         .    ..ooooooo     .     ++ XXX ",
+" @@@ ++ +++...  ..   ooooo               .ooooooo..      ++ ++ XXX ",
+" @@@ ++    ...      ooooo    O          ..oooooooooo++++++++++ XXX ",
+" @@@ ++ +++  ..     oooo...OOOO   .    ..oooooooooooooo + + +  XXX ",
+" @@@ ++++++   .... ooooo. OOOO   ....  ..oooooooooooooooooo... XXX ",
+" @@@ ++++++  .... ..o.... OOOO     ..  ..ooooooooooooooooooooo XXX ",
+" @@@ +       ... o....... OOO     ...  ..ooooooooooooooooooooo XXX ",
+" @@@ OOOOO+ oooooo.o.             ..  ...ooooooooooooooooooooo XXX ",
+" @@@ O+OOO ooooooo..  .....  ..  ..   .. ooooooooooooooooooooo XXX ",
+" @@@ +OO+ oooooooo+. ....   ....  .   .. ooooooooooooooooooooo XXX ",
+" @@@ + +oooooooo ++..  ....... .  ..  .. ooooooooooooooooooooo XXX ",
+" @@@  oooooo++++++++ .... .... ...    .ooooooooooooooooooooooo XXX ",
+" @@@ oooooo               ...  ...   ..oooo ooooo.  oo .oooooo XXX ",
+" @@@ ooooo+OO +++O++     .......       oo .. ........  .. oooo XXX ",
+" @@@ oooo++OOO+++..  .........  +.+++++oo.....    ...  ...oooo XXX ",
+" @@@ oo++++OOOO   ..           +.++    oo           . .....ooo XXX ",
+" @@@ ++    O+O+++ ++..++.+++++OOO+.+++++ ++   ....... ...  ooo XXX ",
+" @@@      . OO     + +++.+++++.++OO+++++ ++++ O        ...  oo XXX ",
+" @@@ +++ +++O++++++++++++++OO+++++++++++ +++++O+++++++++    oo XXX ",
+" @@@ ++++++++++++++++++++++++++++++++++++++++++++++++++++++ .. XXX ",
+" @@@                                                           XXX ",
+" @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX ",
+" @ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X ",
+"  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
+"                                                                   "
+};
diff --git a/images/tiles-132.xpm b/images/tiles-132.xpm
new file mode 100644 (file)
index 0000000..e856fe2
--- /dev/null
@@ -0,0 +1,70 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 7 1",
+"  c black",
+". c #585858585858",
+"X c gray50",
+"o c #7F7F7F7FFFFF",
+"O c green",
+"+ c #FFFFBFBF7F7F",
+"@ c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  ...............................................................  ",
+" . ............................................................. @ ",
+" .. ........................................................... @@ ",
+" ...                                                           @@@ ",
+" ... ++++++++++++            +++++++++++++++++++++++++++++++++ @@@ ",
+" ... ++++++++++++  +++++++++ +++O++++++++++++ +++++++++++OO+++ @@@ ",
+" ... + ++    +++  + +     ++ ++ O+++++++        +++OOO++++OO++ @@@ ",
+" ... ++++ +++++++++++ ++ +++ +++O++O++++    X ++++OO+OOOOO+O++ @@@ ",
+" ... + ++ +++++++ ++ ++ ++++ +++O+O++ +     X +++++OOOO+++O+++ @@@ ",
+" ... +  +++++OO+ +  ++++++   +++OOO+ +      X ++++++++X+++++++ @@@ ",
+" ... +   ++++O+++++++ + ++   +++XOOXXXXXXXXX X+++++++ X+++++++ @@@ ",
+" ...   +++++O+++++ + +++ ++   XX     + XXXXX XXXXXXX ++X++O+++ @@@ ",
+" ...  +++++ OOOO+ X +++       XXXXX    X      XX   X   XX+++++ @@@ ",
+" ... +++++OOO+O++        XX   XXXXX    X  XX    XXXXXXXXX X++o @@@ ",
+" ... ++++++++++++       XXXXX XXXXX    XXXX   XXXXXXXXXXXXX++o @@@ ",
+" ... +++++ +++++++  XXXXXXXXX XXX      X XXX XXXX XXX XXXXX+oo @@@ ",
+" ... +++++++++++++ XXXXXXX                          X XXX ++oo @@@ ",
+" ... ++                              X X  XX XX   X    XXX++oo @@@ ",
+" ... ++++ ++++++++ XXXXXXXXXX   XX   X X  XX XX   XXXXXXXX+ooo @@@ ",
+" ... ++++ ++OO++++ XX  XXX    XXXXXXXX    XX XX   XX   XXXXooo @@@ ",
+" ... ++O+ ++OO++++ XX     XXX XXXX  XX XXXX  XX   XX    XXoooo @@@ ",
+" ... ++O+ +++  + + XX    XXXX XXXXXXXX XXXXXX X   XX    X oXoo @@@ ",
+" ... ++++ +++ ++   XX   XXXXX XXXXXXXX XXXX X X   X X   X oooo @@@ ",
+" ...      X        XX   X               XXX   X   X X     Xooo @@@ ",
+" ... ++++ XX   X X XX   XXXXX XXXXXXXX XXX    X  XXXX     XXoo @@@ ",
+" ... ++++ X    X XXXX   XXX   XXXXXXXX XXX       XXXX    XXXoo @@@ ",
+" ... ++++ X XXXX  XXX    XXX XX          X    X  XXXX  XXXX oo @@@ ",
+" ... ++++  XXXXX         XX  XXXXXXXXX XXX    XX  XX  XX  Xooo @@@ ",
+" ... +                                        X  XXX  X   Xooo @@@ ",
+" ... ++++  X X                     XXX      X    XXX  X   Xooo @@@ ",
+" ... O+++  X X             X   X XX  X      X XXXX X  XX  Xooo @@@ ",
+" ... +O++  X X  X            X   XX           XXXXX   XX  Xooo @@@ ",
+" ... +O++  X X  XX XX  XX    X    X                       Xooo @@@ ",
+" ... +O++  X X  XX XX  XXO   X   XX   X   XXX XX      X  XXooo @@@ ",
+" ...                X             X   X   X   XX      X XXoooo @@@ ",
+" ... ++++ XX X  XX XX  XX X       X   XXX X    XX     OXXXoooo @@@ ",
+" ... ++++ XX X X X X  XXX XX      XXX   XXX    X   XXXX XXoooo @@@ ",
+" ... ++++ XX X X X X  XXX XX  O    O           XOXOXXXX oooooo @@@ ",
+" ... ++++ XX                   O                   X  oooooooo @@@ ",
+" ... ++++ XX  XX                O XOXXX XXXXXXXX XXXoooo +++oo @@@ ",
+" ... ++++     X   XXX        XXX XXXXXXXX     XXoXXooo+ +OO+oo @@@ ",
+" ... ++++ XX  X     X        XXX      X  oooooXooooo++  +O++oo @@@ ",
+" ... ++++ X   X  X XX XX   X XXX  XXXXXooooooooooooo++OO ++ooo @@@ ",
+" ... ++++ X                  XXXXX ooXoooooooooooooo +O  oooo+ @@@ ",
+" ...            XX XXX    XXXXXXXooooooooooooooooooooooooooo++ @@@ ",
+" ... ++            X    XXXXXXoooooooooooooo ooooooooo +++ +++ @@@ ",
+" ... ++++ +++++      XXXXXXoooooooo ++++++++++++  ++++++  ++++ @@@ ",
+" ... +O++ +++++  +   XXXXXXooooo++++++++++  ++ +  +   +++ ++++ @@@ ",
+" ... ++OO +++++  +  XXXXXoooo+++++++++O+ ++O+  +++++   ++ ++++ @@@ ",
+" ... ++++O++++++ + XXXXooooo++++ OOO+O    +++OOOO++++++   ++++ @@@ ",
+" ... +++++++++++++ XXooooo++++++++++++++++    +++O++OO++++++++ @@@ ",
+" ...                                                           @@@ ",
+" .. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ ",
+" . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+"                                                                   "
+};
diff --git a/images/tiles-133.xpm b/images/tiles-133.xpm
new file mode 100644 (file)
index 0000000..738a58f
--- /dev/null
@@ -0,0 +1,70 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 7 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c #585858585858",
+"o c #3F3F3F3FFFFF",
+"O c #0000BFBF0000",
+"+ c #BFBF7F7F3F3F",
+"@ c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+" @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ X ",
+" @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ XX ",
+" @@@                                                           XXX ",
+" @@@ ++++++++++++            +++++++++++++++++++++++++++++++++ XXX ",
+" @@@ ++++++++++++  +++++++++ +++O++++++++++++ +++++++++++OO+++ XXX ",
+" @@@ + ++    +++  + +     ++ ++ O+++++++        +++OOO++++OO++ XXX ",
+" @@@ ++++ +++++++++++ ++ +++ +++O++O++++    . ++++OO+OOOOO+O++ XXX ",
+" @@@ + ++ +++++++ ++ ++ ++++ +++O+O++ +     . +++++OOOO+++O+++ XXX ",
+" @@@ +  +++++OO+ +  ++++++   +++OOO+ +      . ++++++++.+++++++ XXX ",
+" @@@ +   ++++O+++++++ + ++   +++.OO......... .+++++++ .+++++++ XXX ",
+" @@@   +++++O+++++ + +++ ++   ..     + ..... ....... ++.++O+++ XXX ",
+" @@@  +++++ OOOO+ . +++       .....    .      ..   .   ..+++++ XXX ",
+" @@@ +++++OOO+O++        ..   .....    .  ..    ......... .++o XXX ",
+" @@@ ++++++++++++       ..... .....    ....   .............++o XXX ",
+" @@@ +++++ +++++++  ......... ...      . ... .... ... .....+oo XXX ",
+" @@@ +++++++++++++ .......                          . ... ++oo XXX ",
+" @@@ ++                              . .  .. ..   .    ...++oo XXX ",
+" @@@ ++++ ++++++++ ..........   ..   . .  .. ..   ........+ooo XXX ",
+" @@@ ++++ ++OO++++ ..  ...    ........    .. ..   ..   ....ooo XXX ",
+" @@@ ++O+ ++OO++++ ..     ... ....  .. ....  ..   ..    ..oooo XXX ",
+" @@@ ++O+ +++  + + ..    .... ........ ...... .   ..    . o.oo XXX ",
+" @@@ ++++ +++ ++   ..   ..... ........ .... . .   . .   . oooo XXX ",
+" @@@      .        ..   .               ...   .   . .     .ooo XXX ",
+" @@@ ++++ ..   . . ..   ..... ........ ...    .  ....     ..oo XXX ",
+" @@@ ++++ .    . ....   ...   ........ ...       ....    ...oo XXX ",
+" @@@ ++++ . ....  ...    ... ..          .    .  ....  .... oo XXX ",
+" @@@ ++++  .....         ..  ......... ...    ..  ..  ..  .ooo XXX ",
+" @@@ +                                        .  ...  .   .ooo XXX ",
+" @@@ ++++  . .                     ...      .    ...  .   .ooo XXX ",
+" @@@ O+++  . .             .   . ..  .      . .... .  ..  .ooo XXX ",
+" @@@ +O++  . .  .            .   ..           .....   ..  .ooo XXX ",
+" @@@ +O++  . .  .. ..  ..    .    .                       .ooo XXX ",
+" @@@ +O++  . .  .. ..  ..O   .   ..   .   ... ..      .  ..ooo XXX ",
+" @@@                .             .   .   .   ..      . ..oooo XXX ",
+" @@@ ++++ .. .  .. ..  .. .       .   ... .    ..     O...oooo XXX ",
+" @@@ ++++ .. . . . .  ... ..      ...   ...    .   .... ..oooo XXX ",
+" @@@ ++++ .. . . . .  ... ..  O    O           .O.O.... oooooo XXX ",
+" @@@ ++++ ..                   O                   .  oooooooo XXX ",
+" @@@ ++++ ..  ..                O .O... ........ ...oooo +++oo XXX ",
+" @@@ ++++     .   ...        ... ........     ..o..ooo+ +OO+oo XXX ",
+" @@@ ++++ ..  .     .        ...      .  ooooo.ooooo++  +O++oo XXX ",
+" @@@ ++++ .   .  . .. ..   . ...  .....ooooooooooooo++OO ++ooo XXX ",
+" @@@ ++++ .                  ..... oo.oooooooooooooo +O  oooo+ XXX ",
+" @@@            .. ...    .......ooooooooooooooooooooooooooo++ XXX ",
+" @@@ ++            .    ......oooooooooooooo ooooooooo +++ +++ XXX ",
+" @@@ ++++ +++++      ......oooooooo ++++++++++++  ++++++  ++++ XXX ",
+" @@@ +O++ +++++  +   ......ooooo++++++++++  ++ +  +   +++ ++++ XXX ",
+" @@@ ++OO +++++  +  .....oooo+++++++++O+ ++O+  +++++   ++ ++++ XXX ",
+" @@@ ++++O++++++ + ....ooooo++++ OOO+O    +++OOOO++++++   ++++ XXX ",
+" @@@ +++++++++++++ ..ooooo++++++++++++++++    +++O++OO++++++++ XXX ",
+" @@@                                                           XXX ",
+" @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX ",
+" @ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X ",
+"  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
+"                                                                   "
+};
diff --git a/images/tiles-134.xpm b/images/tiles-134.xpm
new file mode 100644 (file)
index 0000000..108212d
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 8 1",
+"  c black",
+". c #00007F7F0000",
+"X c #585858585858",
+"o c gray50",
+"O c #7F7F7F7FFFFF",
+"+ c green",
+"@ c #FFFFBFBF7F7F",
+"# c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
+" X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # ",
+" XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ## ",
+" XXX                                                           ### ",
+" XXX @@@@@@@@@@@@@@@@@@.@OOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ### ",
+" XXX @@@@@@@@@@@@.@@@@@@@OOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ### ",
+" XXX @@.@@@@@@@@@@@@@@@@@OOO@@@@@.@@@@@@@.@@@@@@@@@@.@@@@@@@@@ ### ",
+" XXX @@@@@++++@@@@++@@@@@OOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ### ",
+" XXX @@@@@++@.@@@+++@@@@@OOO@@@@@@+++@@@@@@@@@@@@@@@@@@@@@@@@@ ### ",
+" XXX @@@@@@@@@@@++@+@@@@ OOOO@@@@@+++@@@@@@@@@@@@@@@@.@@@@@@@@ ### ",
+" XXX @@@@@+@@@@@@@@@@@@@@OOOO@@@@@@@@@@@@@@@@@@@.@@@@@@@@@@@@@ ### ",
+" XXX @@@@@@@@@@@@@@@@@@@@@OOOO @@@@@@@@@@@@@@@@@@@@@@@@@.@@@@@ ### ",
+" XXX @@.@@@@@@@@@@@@@@@@@@@ OOOO@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@ ### ",
+" XXX @@@@@++@@@@@@@@.@+@@@@@OOOOO@@@@@@@@++++@@@@@@@@@@@@@@@@@ ### ",
+" XXX @@@@@@++++++@@@@+@@@@@@@OOOO@@@@@@@+++++@@@@@@@@@@@@@@@O@ ### ",
+" XXX @@@@@@.@+@@@+@@@.@+++@@@@OOOO@@@@@@@@+++@@@@@@@@@@@@@OOO@ ### ",
+" XXX @@@@@@@@@@@++@@@@@++++@@@OOOO@@@@@@@@@@@@@@@@@@@@@@OOO@@@ ### ",
+" XXX @@@@@@@@@@@@@@@@@@@@@+@@@OOOOO@@@@@@@@@@@@@@OOOOOOOO@@@@@ ### ",
+" XXX @@+@@@@@@+@@@@@@@@@@@@OOOOOOOOO@@@@@@@OOOOOOO@@@OOO@@@@@@ ### ",
+" XXX @@@@@@++++@@@@@@OOO@@OOOOOOOOOOO@ @@@OO@@@@@@+@@@@OO@@@@@ ### ",
+" XXX @@.+++OOOOOOOOOOOOOOOOOOOOO@@@@OOOOOOO@@@@@@@++@@@@O@@@@@ ### ",
+" XXX @@@@@OO@@OOOOOOOOOOOOOOOO @@@@@@@@@@@@@@@@@@@@+++@@@O@@@@ ### ",
+" XXX @@@OOO@@@O OOOOOOOOO@@@@@@@@@  @@@@@@@@@@@@@.@@@+@@@OO@@@ ### ",
+" XXX @@OO@@@@OOOOO@@@@@@@@@@@@@@ oo @ ooo++@@+++@@@@@@@@@@O@@@ ### ",
+" XXX @OO@@@@@OOOO@@@@@@@@@@ @@@@ oo @ ooo@@@@++++@@@@@@@@@O@@@ ### ",
+" XXX OO@@@@@OOOOO@@@@@@@@        oo o@@oo@@@@@@@@@@@@@@@+@@@@@ ### ",
+" XXX O@@@@@@OOOO@@@@@@@@@ o oooo oo o oo @@@@@@@@@.@@@@@+@@.@@ ### ",
+" XXX @@@@@@@OOOO@@@@+@@@@ o ooo       o    @@@+@@@@@@@++@@@@@@ ### ",
+" XXX @+@@@@@OOO@@++++@@@  o ooooo ooooo@ oo@@@@@+@@++@@+@+@@@@ ### ",
+" XXX @++@@@OOOO@@+@++@@@        o o    @ oo@@@@@++@@@@@+@+@@@@ ### ",
+" XXX +++++@OOOO@@+++++@@@@ oo oo     o        @@@+@.@@@+.@+@@@ ### ",
+" XXX @@@++@OOOO@@@@@+@@@@@ oo oo oo oo @ @oo@@@@@@@@@@@@+@@@@@ ### ",
+" XXX @@@@@@OOOOO@@@@@@@@@@  o oo oo oo @@@oo@@@+@@+@@@@@@++@@@ ### ",
+" XXX @@@@@@@OOOO@@@@@@@@@@@      oo oo @@@@@@@@+++@@@@@@@++@@@ ### ",
+" XXX @@@@@@@OOOOO@@@@@@@@@@@@@@@@@@@@@@@@OOO@@@@@++@@@@@@+++@@ ### ",
+" XXX @@@@@@@@OOOOO@@@@@@@@@@@@ @ OOOOOOOOO.OO@@@@@@@@@@@@@@@@@ ### ",
+" XXX @@@@.@@@@OOOOOOO @@@ OOOOOOOOOOOOO@@@@@OOO@@@@@@ @@@@.@@@ ### ",
+" XXX @@@@@@@@@@OOOOOOOO@OOOOOOOOOOOOOOOOO@@@@@OO@@@@OOO@.@@@@@ ### ",
+" XXX @@@@@@@@@@@OOOOOOOOOOOOOO@.@.@.OOOOOO@@@@@OO@OOOOOO@@@@@@ ### ",
+" XXX @@@@@@@@@@@@OOOOOOOOO @@@@@@@@@.@OOOOO@@@@@OOOOOOOO.@@@@@ ### ",
+" XXX @@@@@@@@@@@@@OOO @@@@@@@@@@@@@@@@@OOOOO@@@@@.@.OOO.@@@@@@ ### ",
+" XXX @@@@+@@@@@@@@@@OOOO @@@@@@@@@++@@@@OOOOO@@@@@@@.@.@@.@@@@ ### ",
+" XXX @@@@+@@@@@@@@@@@@@OOO@@@@@@+@@@@@@@@OOOO@@@@@@@@@@@@@@@@@ ### ",
+" XXX @@+@@@@@@@@@@@@@@@@@OO@@@@@+.@@++@@@@OOO@@@@@@@@@@@@@@@+@ ### ",
+" XXX @@+++.@@@@@@+@@@@@@@@O@@@@@@@@@@@@@@@@OOO@.@@@@+@@+++@@+@ ### ",
+" XXX @@@@@@+++.@@+@@@@@@@@O@@@@@@@@@@@.@@@.OOOO@@@@@@@@@@@@@@@ ### ",
+" XXX @@@@@@@@+@+@@@@@.@@@@OO@@@++@@@@+@@@@@OOOOO@@@@@@@+.@@@@@ ### ",
+" XXX @@@@@@@@@@@++++@@@@@@@O@@@@@@+@+@@+@@@@OOOOO@@++@@@@@@@@@ ### ",
+" XXX @@@@.@+@@@@@@@@@@@@@@@O@@@@.@+@@.@@+@@@@OOOO.@@@+@@.@@@@@ ### ",
+" XXX @@@@@@@@@@@@@@+@@@@@@OO@@@@@@@@@@@@@@@@@@OOOOO@@@@@@@@@@@ ### ",
+" XXX @@@@@@@@@@@@@@@@@@@@@O.@@@@@@@@@@@@@@@@@.OOOOO.@@@@@@@@@@ ### ",
+" XXX                                                           ### ",
+" XX ########################################################### ## ",
+" X ############################################################# # ",
+"  ###############################################################  ",
+"                                                                   "
+};
diff --git a/images/tiles-135.xpm b/images/tiles-135.xpm
new file mode 100644 (file)
index 0000000..de679de
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 8 1",
+"  c black",
+". c #00003F3F0000",
+"X c #3F3F3F3F3F3F",
+"o c #585858585858",
+"O c #3F3F3F3FFFFF",
+"+ c #0000BFBF0000",
+"@ c #BFBF7F7F3F3F",
+"# c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  ###############################################################  ",
+" # ############################################################# o ",
+" ## ########################################################### oo ",
+" ###                                                           ooo ",
+" ### @@@@@@@@@@@@@@@@@@.@OOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ooo ",
+" ### @@@@@@@@@@@@.@@@@@@@OOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ooo ",
+" ### @@.@@@@@@@@@@@@@@@@@OOO@@@@@.@@@@@@@.@@@@@@@@@@.@@@@@@@@@ ooo ",
+" ### @@@@@++++@@@@++@@@@@OOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ooo ",
+" ### @@@@@++@.@@@+++@@@@@OOO@@@@@@+++@@@@@@@@@@@@@@@@@@@@@@@@@ ooo ",
+" ### @@@@@@@@@@@++@+@@@@ OOOO@@@@@+++@@@@@@@@@@@@@@@@.@@@@@@@@ ooo ",
+" ### @@@@@+@@@@@@@@@@@@@@OOOO@@@@@@@@@@@@@@@@@@@.@@@@@@@@@@@@@ ooo ",
+" ### @@@@@@@@@@@@@@@@@@@@@OOOO @@@@@@@@@@@@@@@@@@@@@@@@@.@@@@@ ooo ",
+" ### @@.@@@@@@@@@@@@@@@@@@@ OOOO@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@ ooo ",
+" ### @@@@@++@@@@@@@@.@+@@@@@OOOOO@@@@@@@@++++@@@@@@@@@@@@@@@@@ ooo ",
+" ### @@@@@@++++++@@@@+@@@@@@@OOOO@@@@@@@+++++@@@@@@@@@@@@@@@O@ ooo ",
+" ### @@@@@@.@+@@@+@@@.@+++@@@@OOOO@@@@@@@@+++@@@@@@@@@@@@@OOO@ ooo ",
+" ### @@@@@@@@@@@++@@@@@++++@@@OOOO@@@@@@@@@@@@@@@@@@@@@@OOO@@@ ooo ",
+" ### @@@@@@@@@@@@@@@@@@@@@+@@@OOOOO@@@@@@@@@@@@@@OOOOOOOO@@@@@ ooo ",
+" ### @@+@@@@@@+@@@@@@@@@@@@OOOOOOOOO@@@@@@@OOOOOOO@@@OOO@@@@@@ ooo ",
+" ### @@@@@@++++@@@@@@OOO@@OOOOOOOOOOO@ @@@OO@@@@@@+@@@@OO@@@@@ ooo ",
+" ### @@.+++OOOOOOOOOOOOOOOOOOOOO@@@@OOOOOOO@@@@@@@++@@@@O@@@@@ ooo ",
+" ### @@@@@OO@@OOOOOOOOOOOOOOOO @@@@@@@@@@@@@@@@@@@@+++@@@O@@@@ ooo ",
+" ### @@@OOO@@@O OOOOOOOOO@@@@@@@@@  @@@@@@@@@@@@@.@@@+@@@OO@@@ ooo ",
+" ### @@OO@@@@OOOOO@@@@@@@@@@@@@@ XX @ XXX++@@+++@@@@@@@@@@O@@@ ooo ",
+" ### @OO@@@@@OOOO@@@@@@@@@@ @@@@ XX @ XXX@@@@++++@@@@@@@@@O@@@ ooo ",
+" ### OO@@@@@OOOOO@@@@@@@@        XX X@@XX@@@@@@@@@@@@@@@+@@@@@ ooo ",
+" ### O@@@@@@OOOO@@@@@@@@@ X XXXX XX X XX @@@@@@@@@.@@@@@+@@.@@ ooo ",
+" ### @@@@@@@OOOO@@@@+@@@@ X XXX       X    @@@+@@@@@@@++@@@@@@ ooo ",
+" ### @+@@@@@OOO@@++++@@@  X XXXXX XXXXX@ XX@@@@@+@@++@@+@+@@@@ ooo ",
+" ### @++@@@OOOO@@+@++@@@        X X    @ XX@@@@@++@@@@@+@+@@@@ ooo ",
+" ### +++++@OOOO@@+++++@@@@ XX XX     X        @@@+@.@@@+.@+@@@ ooo ",
+" ### @@@++@OOOO@@@@@+@@@@@ XX XX XX XX @ @XX@@@@@@@@@@@@+@@@@@ ooo ",
+" ### @@@@@@OOOOO@@@@@@@@@@  X XX XX XX @@@XX@@@+@@+@@@@@@++@@@ ooo ",
+" ### @@@@@@@OOOO@@@@@@@@@@@      XX XX @@@@@@@@+++@@@@@@@++@@@ ooo ",
+" ### @@@@@@@OOOOO@@@@@@@@@@@@@@@@@@@@@@@@OOO@@@@@++@@@@@@+++@@ ooo ",
+" ### @@@@@@@@OOOOO@@@@@@@@@@@@ @ OOOOOOOOO.OO@@@@@@@@@@@@@@@@@ ooo ",
+" ### @@@@.@@@@OOOOOOO @@@ OOOOOOOOOOOOO@@@@@OOO@@@@@@ @@@@.@@@ ooo ",
+" ### @@@@@@@@@@OOOOOOOO@OOOOOOOOOOOOOOOOO@@@@@OO@@@@OOO@.@@@@@ ooo ",
+" ### @@@@@@@@@@@OOOOOOOOOOOOOO@.@.@.OOOOOO@@@@@OO@OOOOOO@@@@@@ ooo ",
+" ### @@@@@@@@@@@@OOOOOOOOO @@@@@@@@@.@OOOOO@@@@@OOOOOOOO.@@@@@ ooo ",
+" ### @@@@@@@@@@@@@OOO @@@@@@@@@@@@@@@@@OOOOO@@@@@.@.OOO.@@@@@@ ooo ",
+" ### @@@@+@@@@@@@@@@OOOO @@@@@@@@@++@@@@OOOOO@@@@@@@.@.@@.@@@@ ooo ",
+" ### @@@@+@@@@@@@@@@@@@OOO@@@@@@+@@@@@@@@OOOO@@@@@@@@@@@@@@@@@ ooo ",
+" ### @@+@@@@@@@@@@@@@@@@@OO@@@@@+.@@++@@@@OOO@@@@@@@@@@@@@@@+@ ooo ",
+" ### @@+++.@@@@@@+@@@@@@@@O@@@@@@@@@@@@@@@@OOO@.@@@@+@@+++@@+@ ooo ",
+" ### @@@@@@+++.@@+@@@@@@@@O@@@@@@@@@@@.@@@.OOOO@@@@@@@@@@@@@@@ ooo ",
+" ### @@@@@@@@+@+@@@@@.@@@@OO@@@++@@@@+@@@@@OOOOO@@@@@@@+.@@@@@ ooo ",
+" ### @@@@@@@@@@@++++@@@@@@@O@@@@@@+@+@@+@@@@OOOOO@@++@@@@@@@@@ ooo ",
+" ### @@@@.@+@@@@@@@@@@@@@@@O@@@@.@+@@.@@+@@@@OOOO.@@@+@@.@@@@@ ooo ",
+" ### @@@@@@@@@@@@@@+@@@@@@OO@@@@@@@@@@@@@@@@@@OOOOO@@@@@@@@@@@ ooo ",
+" ### @@@@@@@@@@@@@@@@@@@@@O.@@@@@@@@@@@@@@@@@.OOOOO.@@@@@@@@@@ ooo ",
+" ###                                                           ooo ",
+" ## ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oo ",
+" # ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o ",
+"  ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo  ",
+"                                                                   "
+};
diff --git a/images/tiles-136.xpm b/images/tiles-136.xpm
new file mode 100644 (file)
index 0000000..045f960
--- /dev/null
@@ -0,0 +1,70 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 7 1",
+"  c black",
+". c #585858585858",
+"X c gray50",
+"o c #7F7F7F7FFFFF",
+"O c green",
+"+ c #FFFFBFBF7F7F",
+"@ c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  ...............................................................  ",
+" . ............................................................. @ ",
+" .. ........................................................... @@ ",
+" ...                                                           @@@ ",
+" ... ++++++++++++ ++ o++++oooo++++++++ + +++++++ +++++++++++++ @@@ ",
+" ... ++++++++++++ +++o++++oooo+++ +++ ++ +++++ + +++++++++++++ @@@ ",
+" ... +++OOOO+++++ ++ o +++ oo++ ++ XXX +++++++ + +++++++++++++ @@@ ",
+" ... +OOOOOO+++++ +++oo++++oo +++ oXXX++++++++++ ++ ++ +++++++ @@@ ",
+" ... +OOOO++ ++   +++oo+ ++oo+++ ooooXX+    +         XX+ ++++ @@@ ",
+" ... +OOOO+++++ X + ++oo+++oo +XXoooo  + XXXXXXXXXXXXXXX++++++ @@@ ",
+" ... +OOOO+++++ X ++++ oo+ ooX XXoo      X   XXXXXXX     +++++ @@@ ",
+" ... ++OOO++ ++XX +++ X ooooXXXXXoo      X    XX         +++++ @@@ ",
+" ... ++OO+ +++ X    ++XX oooXXXX oo X    XX   XX        +++ooo @@@ ",
+" ... ++++++     X +++ XXX oooXXX oo       X XXX        +++ooo  @@@ ",
+" ... +++++ X    XX   ooooooooXXXoooooooXXXXX XX++++++oooooXX + @@@ ",
+" ...  ++   X    X XooooooooooXX ooooooooXXXXXXooooooooo + XX++ @@@ ",
+" ...             XXooXXooooooXXXoooooooooooooooooXX+ + + + +++ @@@ ",
+" ... +++       ooooo XX  XXoooXXoooooooXXXXXXXXXXXX++++++++O++ @@@ ",
+" ... +++++oooooooooXXXXXXXXXooooooooXXXXX        X +++OOOO+O++ @@@ ",
+" ... ++ + + + + ++   X XX  XXoooooooXXXXXXXXXXXXXX + +++OOOO++ @@@ ",
+" ... +++ ++++++++          XXXoooooo X    XX    XX + ++ +++O++ @@@ ",
+" ... ++O+++++              XXXXoooooo       XXXXXX + ++++++O++ @@@ ",
+" ... +OOOOO++ XXX      XXXXXXX oooooo     XXXX XXX + ++   ++++ @@@ ",
+" ... +OOO++   X XXX    XXX   X  oooooo    X    XXX + +++++++++ @@@ ",
+" ... +OO+++++ X XXXXX  X     XX ooooooXX  X     XXX  ++++ ++++ @@@ ",
+" ... +OO++XXX X XXX    X    XXX ooooooXX  XXX   XXXX + +++++++ @@@ ",
+" ... +++ XXXXXXXXXX    X    XXXXooooooXX  XXX   XX X       +++ @@@ ",
+" ... +  XXXXXXXXXX    XX     XXoooooooXXX  XX   XX XX+++++++++ @@@ ",
+" ...                  X      XXoooooooXXX  XX   XX XX+++O+++++ @@@ ",
+" ...  ++ X             XXXX  XXoooooooX X   X  XXX X  +++O++++ @@@ ",
+" ... +++              XXXXXXXX oooooooXXX    X  XX X +++OOOO + @@@ ",
+" ... +++ ++++++ XXXXX XXXXXX  oooooooXX      X  XXXXX++OOOOO++ @@@ ",
+" ... +++ ++++++ XX           o oooooXX       X XXX XX++OOO+O++ @@@ ",
+" ... +++ +++            XXXXXooooooXX        X   X XX   +OOO++ @@@ ",
+" ... +++ +++++++++ XXXX XXXXXoooooXXX    XX  X   X XX++++OO+++ @@@ ",
+" ... +++ +++++++++XXXXXXXXXXXooooo    X  XX  X   X XX++++OO ++ @@@ ",
+" ... +++  +++++OO+ XXX  XXXXoooooo    X  X   X   X XX    +++++ @@@ ",
+" ... +++ + ++++OOO XX X   X oo ooo    XX X   XXX XXXXXX++ ++++ @@@ ",
+" ... +++ ++ +++OOO XXXXXXXX oo oo XX  XXX              +++++++ @@@ ",
+" ... +O+ +++ ++OOO XXXX XX oo oo XXX  X             ++ ++++O++ @@@ ",
+" ... O++ ++++ ++++ XXXX XXXoX ooXXXX  XX XXX    XXOO++ +OOOO++ @@@ ",
+" ... O++ ++         XX    oo  ooXXXX XXXXXX  XXXXOOO +     +++ @@@ ",
+" ... ++++++++++ XXXXXX    o++ o XXXX X XXXX   XXXOOXOOOOOO+  + @@@ ",
+" ... +++++++++++ XXX       ++ X XXXXXX XX     XOOXOOOOO++O+++  @@@ ",
+" ... ooo+++ +++    X   ++++++ XXX   XXXXXXXXXXXOOOOOOOOO+OOO++ @@@ ",
+" ... oooo++++     XX        + XXX   XXXX     X  XXX  OOOO++O++ @@@ ",
+" ... oooooooooooooXX oooooooo Xoooooooooooo  XXX      OOOO+O++ @@@ ",
+" ... oooooooooooooooooooooooooooooooooooooooooooooo++++OOOO+++ @@@ ",
+" ... oooooooooooooooooooooooooooooooooooooXoooooooooo++++O++++ @@@ ",
+" ...  X + X + + ++oooo ooooXX XXXXXXXXXXXXXXXXXooooooo++++++++ @@@ ",
+" ... XX+++ ++++++++++   XX+++++++++++++++++++++++oooooo+++++++ @@@ ",
+" ...                                                           @@@ ",
+" .. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ ",
+" . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+"                                                                   "
+};
diff --git a/images/tiles-137.xpm b/images/tiles-137.xpm
new file mode 100644 (file)
index 0000000..c353a64
--- /dev/null
@@ -0,0 +1,70 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 7 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c #585858585858",
+"o c #3F3F3F3FFFFF",
+"O c #0000BFBF0000",
+"+ c #BFBF7F7F3F3F",
+"@ c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+" @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ X ",
+" @@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ XX ",
+" @@@                                                           XXX ",
+" @@@ ++++++++++++ ++ o++++oooo++++++++ + +++++++ +++++++++++++ XXX ",
+" @@@ ++++++++++++ +++o++++oooo+++ +++ ++ +++++ + +++++++++++++ XXX ",
+" @@@ +++OOOO+++++ ++ o +++ oo++ ++ ... +++++++ + +++++++++++++ XXX ",
+" @@@ +OOOOOO+++++ +++oo++++oo +++ o...++++++++++ ++ ++ +++++++ XXX ",
+" @@@ +OOOO++ ++   +++oo+ ++oo+++ oooo..+    +         ..+ ++++ XXX ",
+" @@@ +OOOO+++++ . + ++oo+++oo +..oooo  + ...............++++++ XXX ",
+" @@@ +OOOO+++++ . ++++ oo+ oo. ..oo      .   .......     +++++ XXX ",
+" @@@ ++OOO++ ++.. +++ . oooo.....oo      .    ..         +++++ XXX ",
+" @@@ ++OO+ +++ .    ++.. ooo.... oo .    ..   ..        +++ooo XXX ",
+" @@@ ++++++     . +++ ... ooo... oo       . ...        +++ooo  XXX ",
+" @@@ +++++ .    ..   oooooooo...ooooooo..... ..++++++ooooo.. + XXX ",
+" @@@  ++   .    . .oooooooooo.. oooooooo......ooooooooo + ..++ XXX ",
+" @@@             ..oo..oooooo...ooooooooooooooooo..+ + + + +++ XXX ",
+" @@@ +++       ooooo ..  ..ooo..ooooooo............++++++++O++ XXX ",
+" @@@ +++++ooooooooo.........oooooooo.....        . +++OOOO+O++ XXX ",
+" @@@ ++ + + + + ++   . ..  ..ooooooo.............. + +++OOOO++ XXX ",
+" @@@ +++ ++++++++          ...oooooo .    ..    .. + ++ +++O++ XXX ",
+" @@@ ++O+++++              ....oooooo       ...... + ++++++O++ XXX ",
+" @@@ +OOOOO++ ...      ....... oooooo     .... ... + ++   ++++ XXX ",
+" @@@ +OOO++   . ...    ...   .  oooooo    .    ... + +++++++++ XXX ",
+" @@@ +OO+++++ . .....  .     .. oooooo..  .     ...  ++++ ++++ XXX ",
+" @@@ +OO++... . ...    .    ... oooooo..  ...   .... + +++++++ XXX ",
+" @@@ +++ ..........    .    ....oooooo..  ...   .. .       +++ XXX ",
+" @@@ +  ..........    ..     ..ooooooo...  ..   .. ..+++++++++ XXX ",
+" @@@                  .      ..ooooooo...  ..   .. ..+++O+++++ XXX ",
+" @@@  ++ .             ....  ..ooooooo. .   .  ... .  +++O++++ XXX ",
+" @@@ +++              ........ ooooooo...    .  .. . +++OOOO + XXX ",
+" @@@ +++ ++++++ ..... ......  ooooooo..      .  .....++OOOOO++ XXX ",
+" @@@ +++ ++++++ ..           o ooooo..       . ... ..++OOO+O++ XXX ",
+" @@@ +++ +++            .....oooooo..        .   . ..   +OOO++ XXX ",
+" @@@ +++ +++++++++ .... .....ooooo...    ..  .   . ..++++OO+++ XXX ",
+" @@@ +++ +++++++++...........ooooo    .  ..  .   . ..++++OO ++ XXX ",
+" @@@ +++  +++++OO+ ...  ....oooooo    .  .   .   . ..    +++++ XXX ",
+" @@@ +++ + ++++OOO .. .   . oo ooo    .. .   ... ......++ ++++ XXX ",
+" @@@ +++ ++ +++OOO ........ oo oo ..  ...              +++++++ XXX ",
+" @@@ +O+ +++ ++OOO .... .. oo oo ...  .             ++ ++++O++ XXX ",
+" @@@ O++ ++++ ++++ .... ...o. oo....  .. ...    ..OO++ +OOOO++ XXX ",
+" @@@ O++ ++         ..    oo  oo.... ......  ....OOO +     +++ XXX ",
+" @@@ ++++++++++ ......    o++ o .... . ....   ...OO.OOOOOO+  + XXX ",
+" @@@ +++++++++++ ...       ++ . ...... ..     .OO.OOOOO++O+++  XXX ",
+" @@@ ooo+++ +++    .   ++++++ ...   ...........OOOOOOOOO+OOO++ XXX ",
+" @@@ oooo++++     ..        + ...   ....     .  ...  OOOO++O++ XXX ",
+" @@@ ooooooooooooo.. oooooooo .oooooooooooo  ...      OOOO+O++ XXX ",
+" @@@ oooooooooooooooooooooooooooooooooooooooooooooo++++OOOO+++ XXX ",
+" @@@ ooooooooooooooooooooooooooooooooooooo.oooooooooo++++O++++ XXX ",
+" @@@  . + . + + ++oooo oooo.. .................ooooooo++++++++ XXX ",
+" @@@ ..+++ ++++++++++   ..+++++++++++++++++++++++oooooo+++++++ XXX ",
+" @@@                                                           XXX ",
+" @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX ",
+" @ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X ",
+"  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
+"                                                                   "
+};
diff --git a/images/tiles-138.xpm b/images/tiles-138.xpm
new file mode 100644 (file)
index 0000000..9cdf6c9
--- /dev/null
@@ -0,0 +1,68 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 5 1",
+"  c black",
+". c #585858585858",
+"X c cyan",
+"o c yellow",
+"O c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  ...............................................................  ",
+" . ............................................................. O ",
+" .. ........................................................... OO ",
+" ...                                                           OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXoooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooXXXXXXXXX OOO ",
+" ... XXXXXXXXXooo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo XXXXXXXX OOO ",
+" ... XXXXXXXXXooo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo XXXXXXXX OOO ",
+" ... XXXXXXXXXooo XXXXXXXoooooXXXXooooooXXXXXXoooXooo XXXXXXXX OOO ",
+" ... XXXXXXXXXooo XXXXXXoooooooXXXoooooooXXXXoooooooo XXXXXXXX OOO ",
+" ... XXXXXXXXXooo XXXXXoooo ooooXXo   ooo XXoooo  ooo XXXXXXXX OOO ",
+" ... XXXXXXXXXooo XXXXXooo  Xooo XXoooooo XXooo  Xooo XXXXXXXX OOO ",
+" ... XXXXXXXXXooo XXXXXooo XXooo oooooooo XXooo XXooo XXXXXXXX OOO ",
+" ... XXXXXXXXXooo XXXXXooo XXooo ooo  ooo XXooo XXooo XXXXXXXX OOO ",
+" ... XXXXXXXXXooo XXXXXooooXoooo ooo Xooo XXooo Xoooo XXXXXXXX OOO ",
+" ... XXXXXXXXXooooooooXXooooooo  oooooooooXXXoooooooo XXXXXXXX OOO ",
+" ... XXXXXXXXXoooooooo XXooooo  XXooo  ooo XXXooo ooo XXXXXXXX OOO ",
+" ... XXXXXXXXXX        XXX     XXXX   XX   XXXX   X   XXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXoooooooXoooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXoooooooo ooo XXXXooXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXoooo    o X   XXXooo XXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXoooo  XXXX oooXXXoooooooooXXXXXooXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXooo  XXXXXXooo XXoooooo oooXXXoo  XXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXooo XXXXXXXooo XXXooo   ooo XXoo XXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXooo XXXXXXXooo XXXooo XXooooXoo  XXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXooo XXXXXXXooo XXXooo XXXooo oo XXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXooooXXXXXXXooo XXXooo XXXooooo  XXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXooooXXXXoXooo XXXooo XXXXoooo XXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXoooooooo ooo XXXoooooXXXooo  XXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXoooooo  ooo XXXXoooo XXooo XXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXX      XX   XXXXX    XXoo  XXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo XXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo  XXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX   XXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ...                                                           OOO ",
+" .. OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OO ",
+" . OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO O ",
+"  OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO  ",
+"                                                                   "
+};
diff --git a/images/tiles-139.xpm b/images/tiles-139.xpm
new file mode 100644 (file)
index 0000000..58c7642
--- /dev/null
@@ -0,0 +1,68 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 5 1",
+"  c black",
+". c #585858585858",
+"X c blue",
+"o c yellow",
+"O c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO  ",
+" O OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO . ",
+" OO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO .. ",
+" OOO                                                           ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXoooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooXXXXXXXXX ... ",
+" OOO XXXXXXXXXoooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooXXXXXXXXX ... ",
+" OOO XXXXXXXXXoooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooXXXXXXXXX ... ",
+" OOO XXXXXXXXXoooXXXXXXXXoooooXXXXooooooXXXXXXoooXoooXXXXXXXXX ... ",
+" OOO XXXXXXXXXoooXXXXXXXoooooooXXXoooooooXXXXooooooooXXXXXXXXX ... ",
+" OOO XXXXXXXXXoooXXXXXXooooXooooXXoXXXoooXXXooooXXoooXXXXXXXXX ... ",
+" OOO XXXXXXXXXoooXXXXXXoooXXXoooXXXooooooXXXoooXXXoooXXXXXXXXX ... ",
+" OOO XXXXXXXXXoooXXXXXXoooXXXoooXooooooooXXXoooXXXoooXXXXXXXXX ... ",
+" OOO XXXXXXXXXoooXXXXXXoooXXXoooXoooXXoooXXXoooXXXoooXXXXXXXXX ... ",
+" OOO XXXXXXXXXoooXXXXXXooooXooooXoooXXoooXXXoooXXooooXXXXXXXXX ... ",
+" OOO XXXXXXXXXooooooooXXoooooooXXoooooooooXXXooooooooXXXXXXXXX ... ",
+" OOO XXXXXXXXXooooooooXXXoooooXXXXoooXXoooXXXXoooXoooXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXoooooooXoooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXooooooooXoooXXXXXooXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXooooXXXXoXXXXXXXXoooXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXooooXXXXXXXoooXXXoooooooooXXXXXooXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXoooXXXXXXXXoooXXXooooooXoooXXXooXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXoooXXXXXXXXoooXXXXoooXXXoooXXXooXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXoooXXXXXXXXoooXXXXoooXXXooooXooXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXoooXXXXXXXXoooXXXXoooXXXXoooXooXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXooooXXXXXXXoooXXXXoooXXXXoooooXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXooooXXXXoXoooXXXXoooXXXXXooooXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXooooooooXoooXXXXoooooXXXoooXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXooooooXXoooXXXXXooooXXXoooXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO                                                           ... ",
+" OO ........................................................... .. ",
+" O ............................................................. . ",
+"  ...............................................................  ",
+"                                                                   "
+};
diff --git a/images/tiles-14.xpm b/images/tiles-14.xpm
new file mode 100644 (file)
index 0000000..299efb2
--- /dev/null
@@ -0,0 +1,47 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 9 1",
+"  c black",
+". c #00003F3F0000",
+"X c #3F3F3F3F0000",
+"o c #3F3F3F3F3F3F",
+"O c #7F7F3D3D0000",
+"+ c #727272727272",
+"@ c #3C3C0000FFFF",
+"# c #FFFF3C3C0000",
+"$ c #DFDFDFDFDFDF",
+/* pixels */
+"                                ",
+"  $$$$$$$$$$$$$$$$$$$$$$$$$$$$  ",
+" $ $$$$$$$$$$$$$$$$$$$$$$$$$$ + ",
+" $$ $$$$$$$$$$$$$$$$$$$$$$$$ ++ ",
+" $$$                        +++ ",
+" $$$ @@@@@@@@@@@@@@OXXXXX@@ +++ ",
+" $$$ @@@@@@@@@@@@XXXXOXOX@X +++ ",
+" $$$ @@@@@@@@@@@@OXOX@X XX@ +++ ",
+" $$$ @@@@@@@@@@XOXXXOXXX@X@ +++ ",
+" $$$ @@@@@@@@@XXXOX@XXX@X@@ +++ ",
+" $$$ @@@@@@@@@XXX XXXXX@@@@ +++ ",
+" $$$ @@@@@@@OOXX@XXOX@@@X@@ +++ ",
+" $$$ @@@@@@XXX@@OXX@@@@@@X@ +++ ",
+" $$$ @@@@@@XX@@XX@@@@@@@O@@ +++ ",
+" $$$ @@@@OX@ XXX@@@X@@@XX@X +++ ",
+" $$$ @@@@XX@OXX@@@@@@@@OXOX +++ ",
+" $$$ @@@X@@X@@@@@@@@@@OXX@@ +++ ",
+" $$$ @@X@@X@@@@@@@@@@OOXXX@ +++ ",
+" $$$ @@ @ @@@@@@@@@@@X@X@@@ +++ ",
+" $$$ @@ @ @@@@@@@@@@X@X@@@@ +++ ",
+" $$$ @@ @ @@@@@@@@@o@o@@@@@ +++ ",
+" $$$ @@ @ @@@@@@@@@o@o@@@@@ +++ ",
+" $$$ @        @@@ooooo@@@@@ +++ ",
+" $$$ .  o o   ...o o o..... +++ ",
+" $$$ .        .......#..... +++ ",
+" $$$ .........#...#........ +++ ",
+" $$$ ...................... +++ ",
+" $$$                        +++ ",
+" $$ ++++++++++++++++++++++++ ++ ",
+" $ ++++++++++++++++++++++++++ + ",
+"  ++++++++++++++++++++++++++++  ",
+"                                "
+};
diff --git a/images/tiles-140.xpm b/images/tiles-140.xpm
new file mode 100644 (file)
index 0000000..bd6b75e
--- /dev/null
@@ -0,0 +1,68 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 5 1",
+"  c black",
+". c #585858585858",
+"X c cyan",
+"o c yellow",
+"O c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  ...............................................................  ",
+" . ............................................................. O ",
+" .. ........................................................... OO ",
+" ...                                                           OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXoooXXXXXooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXooo XXXXoo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXooooXXXXoo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXoooooXXXoo XXXoooooXXXoooXXXooXXXooXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXooooooXXoo XXoooooooXXooo XooooXXoo XXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXoo ooo Xoo Xooo   oooXXoo Xoooo Xoo XXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXoo XoooXoo Xooo XXooo Xoo Xoooo oo  XXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXoo Xoooooo Xooooooooo XoooXo oo oo XXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXoo XXooooo Xooooooooo Xooooo ooooo XXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXoo XXXoooo Xooo       XXoooo ooooo XXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXoo XXXXooo XXooooooooXXXooo  Xooo  XXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXoo XXXXooo XXX oooooo XXooo XXooo XXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXX  XXXXX   XXXXX      XXX   XXX   XXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXoooooooXXoooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXoooooooo Xooo XXXooXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXoooo    o XX   XXooo XXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXoooo  XXXX XoooXXoooooooooXXXXXooXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXooo  XXXXXXXooo Xoooooo oooXXXoo  XXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXooo XXXXXXXXooo XXooo   ooo XXoo XXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXooo XXXXXXXXooo XXooo XXooooXoo  XXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXooo XXXXXXXXooo XXooo XXXooo oo XXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXooooXXXXXXXXooo XXooo XXXooooo  XXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXooooXXXXoXXooo XXooo XXXXoooo XXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXoooooooo Xooo XXoooooXXXooo  XXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXoooooo  Xooo XXXoooo XXooo XXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXX      XXX   XXXX    XXoo  XXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo XXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooo  XXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX   XXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX OOO ",
+" ...                                                           OOO ",
+" .. OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OO ",
+" . OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO O ",
+"  OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO  ",
+"                                                                   "
+};
diff --git a/images/tiles-141.xpm b/images/tiles-141.xpm
new file mode 100644 (file)
index 0000000..ec675f1
--- /dev/null
@@ -0,0 +1,68 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 5 1",
+"  c black",
+". c #585858585858",
+"X c blue",
+"o c yellow",
+"O c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO  ",
+" O OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO . ",
+" OO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO .. ",
+" OOO                                                           ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXoooXXXXXooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXoooXXXXXooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXooooXXXXooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXoooooXXXooXXXXoooooXXXoooXXXooXXXooXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXooooooXXooXXXoooooooXXoooXXooooXXooXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXooXoooXXooXXoooXXXoooXXooXXooooXXooXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXooXXoooXooXXoooXXXoooXXooXXooooXooXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXooXXooooooXXoooooooooXXoooXoXooXooXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXooXXXoooooXXoooooooooXXoooooXoooooXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXooXXXXooooXXoooXXXXXXXXXooooXoooooXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXooXXXXXoooXXXooooooooXXXoooXXXoooXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXooXXXXXoooXXXXXooooooXXXoooXXXoooXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXoooooooXXoooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXooooooooXXoooXXXXooXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXooooXXXXoXXXXXXXXoooXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXooooXXXXXXXXoooXXoooooooooXXXXXooXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXoooXXXXXXXXXoooXXooooooXoooXXXooXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXoooXXXXXXXXXoooXXXoooXXXoooXXXooXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXoooXXXXXXXXXoooXXXoooXXXooooXooXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXoooXXXXXXXXXoooXXXoooXXXXoooXooXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXooooXXXXXXXXoooXXXoooXXXXoooooXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXooooXXXXoXXoooXXXoooXXXXXooooXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXooooooooXXoooXXXoooooXXXoooXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXooooooXXXoooXXXXooooXXXoooXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoooXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ",
+" OOO                                                           ... ",
+" OO ........................................................... .. ",
+" O ............................................................. . ",
+"  ...............................................................  ",
+"                                                                   "
+};
diff --git a/images/tiles-142.xpm b/images/tiles-142.xpm
new file mode 100644 (file)
index 0000000..8a970ff
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 8 1",
+"  c black",
+". c #00007F7F0000",
+"X c #585858585858",
+"o c gray50",
+"O c #7F7F7F7FFFFF",
+"+ c green",
+"@ c #FFFFBFBF7F7F",
+"# c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
+" X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # ",
+" XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ## ",
+" XXX                                                           ### ",
+" XXX @@@ @@@@@@@@@@  oooooooooo @@ @   oooooooooooooooooooooo@ ### ",
+" XXX @@@ @@@@oo@@@@oooooo @@@@o @@ @@@   ooooooooooooooooooo@@ ### ",
+" XXX @ @ @ oooooooooo. oo @@@oooo@ @@@       ooooo      ooo@@O ### ",
+" XXX +@   .o. .oooooooooo oo o@ @o @@@@@ ooooo   o oo   ooo@OO ### ",
+" XXX ++@ ..oooooooo ooooo @@ o@ @@o                 oo  oo OOO ### ",
+" XXX ++@ .......... ooooo oo ooooo oo oo         o o   ooooOOO ### ",
+" XXX @++    .......                 @ooo      oooo ooo ooo @OO ### ",
+" XXX @+@+++@     ..oo@@o@ooo oooooo oo oooooo oooo ooo oo@@@OO ### ",
+" XXX @+@@@ +@+++@  oo@@ooooo @@@ooo                   ooo@@@OO ### ",
+" XXX @++@@@+ +++@@@@ooooooo@ ooooooooo  oooo ooooo    ooo@@ OO ### ",
+" XXX ++++++@@ @@+@@@@ @@@@@@ @@@@  ooo ooooo ooooo o  oo @ oOO ### ",
+" XXX +@+@+@@@ @@++++@@ @@@@@@@@@oooooo ooooo ooooo ooooo @@oOO ### ",
+" XXX +@+@++@@ @@++@+@@@   +     oooooo oooo   oooo ooooo @ oOO ### ",
+" XXX +++@++@@  @@@++@@@@ @+@@@ ooooooo oooo   oooo ooo   @@ OO ### ",
+" XXX ++@@+++@@  @@++@@@@ ++@@o ooooooo ooooo   oo          OOO ### ",
+" XXX ++@@+@@+@@ @@ @@@+@@++@oo oo                        oOOOO ### ",
+" XXX @++@+@@@+  ooo   +++++ oo ooooo o ooooo ooooo @@@ @ OOOOO ### ",
+" XXX @@++++++++oooooooooooo oo ooooooo ooooo ooooo @@@ @@OOOOO ### ",
+" XXX @@+@+@@@++ooooooooo                oooo ooo o @@@   oOOOO ### ",
+" XXX @ @++@@@@  oooooooooooooo oo oooo oo  o oooo         OOOO ### ",
+" XXX @          oooooooooooooo o oooo  oo    ooooo++++     OOO ### ",
+" XXX @ ooo ooo  oooooooooooooo o ooo    o    ooooo++++ ++++OOO ### ",
+" XXX @ ooo ooo            o                              + OOO ### ",
+" XXX @ ooo ooo@@@@@@@@@ @@   o o oo     o    ooOO +++++++ OOOO ### ",
+" XXX @ ooo ooo@@@@ @@@@@@@@ oo oooo     o    oooOO + + + OOOOO ### ",
+" XXX @ ooo ooo@ @ OO@ @@@@@@oo o oo     o    ooooOO ooo OOOOOO ### ",
+" XXX @        @@ OOO @@@@@@@ o oooo     o     ooooOOOOOOOOOOOO ### ",
+" XXX   @@@@@@@@ OOOOOO@@@ @@ o oooooooooo o    ooooooOOOOOOOOO ### ",
+" XXX o @@@ @ @ OOOOOO@@@@ @@ o  ooooooooo o     ooooooOO  OOOO ### ",
+" XXX o  @ OOOOOOOOOOO @ @ @@ o ooooooo  o oo      oooo    OOOO ### ",
+" XXX o  @@OOOOO@ OOO @ @@ @                   ooo   oooo   OOO ### ",
+" XXX o  @@@OOOO@@ @ @@@@@ @ oo ooo   oooo oooooooooooooo@@ OOO ### ",
+" XXX o   @@OOOO@@@@@@  @@  ooo oo ooooooo ooooooooooooooo@OOOO ### ",
+" XXX oo   @@@ @@@@@@@  @@ ooooo ooooooooo ooooooooooooooo OOOO ### ",
+" XXX oo @  @     @@                        oooooooo       OOOO ### ",
+" XXX oo          @             ooo@@OOOO@ oooooo @ @@ @@@ OOOO ### ",
+" XXX O                  oo oooo@@@@OOOOOO @@oooo @ @@@@@@@OOOO ### ",
+" XXX OO   oooooo ooooo ooo oo@@@oOOOOOOOOOO@@@ @ @@@@ @@@@@OOO ### ",
+" XXX OOOO oooooo ooooo ooo @@OOOOOOOOOOOOOOOOO @ @@@OOO@@@@@OO ### ",
+" XXX OOOO  oo    ooooo o@@ OOOOOOOOOOOOOOOOOOO@@ @@@OOOO@@@@OO ### ",
+" XXX OOOO@@ooooo ooooo @@OOOOOOOOOOOOOOOOOOOO@@@ @@OOOOOOO@OOO ### ",
+" XXX OOOOO  ooo@ @oooo @OOOOOOOOOOOOOOOOOOOOO @@ @@OOOOOOO@OOO ### ",
+" XXX OOOOOO oo@OO@@@@@@OOOOOOOOOOOOOOOOOOOOOO@@@@@@OOOOOOOOOOO ### ",
+" XXX OOOOOOOOOOOOOOO@@oOOOOOOOOOOOOOOOOOOOOO@@@@@@@@OOOOOOOOOO ### ",
+" XXX OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@ @OOOOOOOOOO ### ",
+" XXX OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ### ",
+" XXX OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ### ",
+" XXX                                                           ### ",
+" XX ########################################################### ## ",
+" X ############################################################# # ",
+"  ###############################################################  ",
+"                                                                   "
+};
diff --git a/images/tiles-143.xpm b/images/tiles-143.xpm
new file mode 100644 (file)
index 0000000..da2cb49
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 8 1",
+"  c black",
+". c #00003F3F0000",
+"X c #3F3F3F3F3F3F",
+"o c #585858585858",
+"O c #3F3F3F3FFFFF",
+"+ c #0000BFBF0000",
+"@ c #BFBF7F7F3F3F",
+"# c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  ###############################################################  ",
+" # ############################################################# o ",
+" ## ########################################################### oo ",
+" ###                                                           ooo ",
+" ### @@@ @@@@@@@@@@  XXXXXXXXXX @@ @   XXXXXXXXXXXXXXXXXXXXXX@ ooo ",
+" ### @@@ @@@@XX@@@@XXXXXX @@@@X @@ @@@   XXXXXXXXXXXXXXXXXXX@@ ooo ",
+" ### @ @ @ XXXXXXXXXX. XX @@@XXXX@ @@@       XXXXX      XXX@@O ooo ",
+" ### +@   .X. .XXXXXXXXXX XX X@ @X @@@@@ XXXXX   X XX   XXX@OO ooo ",
+" ### ++@ ..XXXXXXXX XXXXX @@ X@ @@X                 XX  XX OOO ooo ",
+" ### ++@ .......... XXXXX XX XXXXX XX XX         X X   XXXXOOO ooo ",
+" ### @++    .......                 @XXX      XXXX XXX XXX @OO ooo ",
+" ### @+@+++@     ..XX@@X@XXX XXXXXX XX XXXXXX XXXX XXX XX@@@OO ooo ",
+" ### @+@@@ +@+++@  XX@@XXXXX @@@XXX                   XXX@@@OO ooo ",
+" ### @++@@@+ +++@@@@XXXXXXX@ XXXXXXXXX  XXXX XXXXX    XXX@@ OO ooo ",
+" ### ++++++@@ @@+@@@@ @@@@@@ @@@@  XXX XXXXX XXXXX X  XX @ XOO ooo ",
+" ### +@+@+@@@ @@++++@@ @@@@@@@@@XXXXXX XXXXX XXXXX XXXXX @@XOO ooo ",
+" ### +@+@++@@ @@++@+@@@   +     XXXXXX XXXX   XXXX XXXXX @ XOO ooo ",
+" ### +++@++@@  @@@++@@@@ @+@@@ XXXXXXX XXXX   XXXX XXX   @@ OO ooo ",
+" ### ++@@+++@@  @@++@@@@ ++@@X XXXXXXX XXXXX   XX          OOO ooo ",
+" ### ++@@+@@+@@ @@ @@@+@@++@XX XX                        XOOOO ooo ",
+" ### @++@+@@@+  XXX   +++++ XX XXXXX X XXXXX XXXXX @@@ @ OOOOO ooo ",
+" ### @@++++++++XXXXXXXXXXXX XX XXXXXXX XXXXX XXXXX @@@ @@OOOOO ooo ",
+" ### @@+@+@@@++XXXXXXXXX                XXXX XXX X @@@   XOOOO ooo ",
+" ### @ @++@@@@  XXXXXXXXXXXXXX XX XXXX XX  X XXXX         OOOO ooo ",
+" ### @          XXXXXXXXXXXXXX X XXXX  XX    XXXXX++++     OOO ooo ",
+" ### @ XXX XXX  XXXXXXXXXXXXXX X XXX    X    XXXXX++++ ++++OOO ooo ",
+" ### @ XXX XXX            X                              + OOO ooo ",
+" ### @ XXX XXX@@@@@@@@@ @@   X X XX     X    XXOO +++++++ OOOO ooo ",
+" ### @ XXX XXX@@@@ @@@@@@@@ XX XXXX     X    XXXOO + + + OOOOO ooo ",
+" ### @ XXX XXX@ @ OO@ @@@@@@XX X XX     X    XXXXOO XXX OOOOOO ooo ",
+" ### @        @@ OOO @@@@@@@ X XXXX     X     XXXXOOOOOOOOOOOO ooo ",
+" ###   @@@@@@@@ OOOOOO@@@ @@ X XXXXXXXXXX X    XXXXXXOOOOOOOOO ooo ",
+" ### X @@@ @ @ OOOOOO@@@@ @@ X  XXXXXXXXX X     XXXXXXOO  OOOO ooo ",
+" ### X  @ OOOOOOOOOOO @ @ @@ X XXXXXXX  X XX      XXXX    OOOO ooo ",
+" ### X  @@OOOOO@ OOO @ @@ @                   XXX   XXXX   OOO ooo ",
+" ### X  @@@OOOO@@ @ @@@@@ @ XX XXX   XXXX XXXXXXXXXXXXXX@@ OOO ooo ",
+" ### X   @@OOOO@@@@@@  @@  XXX XX XXXXXXX XXXXXXXXXXXXXXX@OOOO ooo ",
+" ### XX   @@@ @@@@@@@  @@ XXXXX XXXXXXXXX XXXXXXXXXXXXXXX OOOO ooo ",
+" ### XX @  @     @@                        XXXXXXXX       OOOO ooo ",
+" ### XX          @             XXX@@OOOO@ XXXXXX @ @@ @@@ OOOO ooo ",
+" ### O                  XX XXXX@@@@OOOOOO @@XXXX @ @@@@@@@OOOO ooo ",
+" ### OO   XXXXXX XXXXX XXX XX@@@XOOOOOOOOOO@@@ @ @@@@ @@@@@OOO ooo ",
+" ### OOOO XXXXXX XXXXX XXX @@OOOOOOOOOOOOOOOOO @ @@@OOO@@@@@OO ooo ",
+" ### OOOO  XX    XXXXX X@@ OOOOOOOOOOOOOOOOOOO@@ @@@OOOO@@@@OO ooo ",
+" ### OOOO@@XXXXX XXXXX @@OOOOOOOOOOOOOOOOOOOO@@@ @@OOOOOOO@OOO ooo ",
+" ### OOOOO  XXX@ @XXXX @OOOOOOOOOOOOOOOOOOOOO @@ @@OOOOOOO@OOO ooo ",
+" ### OOOOOO XX@OO@@@@@@OOOOOOOOOOOOOOOOOOOOOO@@@@@@OOOOOOOOOOO ooo ",
+" ### OOOOOOOOOOOOOOO@@XOOOOOOOOOOOOOOOOOOOOO@@@@@@@@OOOOOOOOOO ooo ",
+" ### OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@ @OOOOOOOOOO ooo ",
+" ### OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ooo ",
+" ### OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ooo ",
+" ###                                                           ooo ",
+" ## ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oo ",
+" # ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o ",
+"  ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo  ",
+"                                                                   "
+};
diff --git a/images/tiles-144.xpm b/images/tiles-144.xpm
new file mode 100644 (file)
index 0000000..5d746a6
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 8 1",
+"  c black",
+". c #00007F7F0000",
+"X c #585858585858",
+"o c gray50",
+"O c #7F7F7F7FFFFF",
+"+ c green",
+"@ c #FFFFBFBF7F7F",
+"# c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
+" X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # ",
+" XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ## ",
+" XXX                                                           ### ",
+" XXX OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ### ",
+" XXX OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ### ",
+" XXX OOOOOOOOOOOOOOOOOO+++++OOOOO oooOOOOOOOOOOOOOOOOOOOOOOOOO ### ",
+" XXX OOOOOOOOOOOOOO++++++++@++@@oo o o OOOOOOOOOOOOOOOOOOOOOOO ### ",
+" XXX OOOOOOOOOOOOO++++@+@+@+@+++@                  oOOOOOOOOOO ### ",
+" XXX OOOOOOOOOOOOO++++@+o+++@@@+@ oo     oo oo o    OOOOOOOOOO ### ",
+" XXX OOOOOOOOOO+++++@+++oo++++++@ @@ oo        o o   oOOOOOOOO ### ",
+" XXX OOOOOOOOOO++++++++++++++++@@ @o ooo o       o   oOOOOOOOO ### ",
+" XXX OOOOOOOO+++++++++++++++o+++@                     OOOOOOOO ### ",
+" XXX OOOOOOO++++@@@@ @@@@@@@@@o@@ o         o    o    oOOOOOOO ### ",
+" XXX OOOOO++++++++@                                   ooOOOOOO ### ",
+" XXX OOOOO@@@@@@@@@@ @o  o o                    o      o o OOO ### ",
+" XXX OOOOO           o  o  oo @@ oo   o     oo         o oOOOO ### ",
+" XXX OOO@ @@@         o o  oo oo o o oo  o  o      o   o oOOOO ### ",
+" XXX OOO@                                       o        oOOOO ### ",
+" XXX OOO@ ooo o@o oo oo o  oo oo @@ o  o o@    oo        oOOOO ### ",
+" XXX OOO@ ooo ooo oo oo ooooo oo  @@ o o    oo     o  o  oOOOO ### ",
+" XXX OOO@                          @   o           o  o  oOOOO ### ",
+" XXX OOO@ +++++++++++++++ o   oo @@o@@ o oo oo o      o  oOOOO ### ",
+" XXX OOO@ +++++++++++++++           @ oo oo @o           oOOOO ### ",
+" XXX OO@@ +++++++++++++++ o   @@@@++@@           o    o   OOOO ### ",
+" XXX OO@@ +++++++++++++++ oo  @@++++@@@@@@@@@    o    oo oOOOO ### ",
+" XXX OO@@                     @@@@+@++@@ooo@  o       o@ oOOOO ### ",
+" XXX OOO@ @oo oo oo oo oo @  ++...++@++@@oo o            oOOOO ### ",
+" XXX OOO@ @oo oo oo oo o  @@@+@@@+.++@@@@@. oo o o    o   OOOO ### ",
+" XXX OOO@     o   o       @@@..+@++@+@++@@@ oo   o  o o    OOO ### ",
+" XXX OOO@ ooo oo @@ oo o@ @@@+++@@++@@++@@@ oo o    o    ooOOO ### ",
+" XXX OOO@ oo@ o  o  o  o@ @@.++@@@@++@++@o@             oo OOO ### ",
+" XXX OOO@                 @+++++@.+@+@@+@@@ o  o       oo oOOO ### ",
+" XXX OOO@ ooo oo o  o   o @+++@++++@++++@@o o  o o    oo ooOOO ### ",
+" XXX OOO@ ooo  o o  o  oo  +@@@@.@@@+@@++oo o  o o    o ooOOOO ### ",
+" XXX OO@@            o    @+@+@@@@@@@.@+@@@ o          ooOOOOO ### ",
+" XXX OO@@ @@o oo oo    oo @++@+@@@.@+@+@@@@ o  o @      oOOOOO ### ",
+" XXX OO@@ @@o @@ oo oo o@  +++ ++++++@@@@      o      ooo  OOO ### ",
+" XXX OO@@                 @+++@@++@@@@@@@@@ oo o o oo      OOO ### ",
+" XXX OOO@ o@o oo oo @o oo @++@@@@@@@@@@@@@@ oo   o oo @@@  OOO ### ",
+" XXX OOO@                 +++@ o                 o oo @@@  OOO ### ",
+" XXX OOO.@@@@ @@ o@ @ooo@@+++@ ooo ooo ooo o oo  o oo  @@  OOO ### ",
+" XXX OOO@@OO@@@@@@@ @oo@@+++@@                   o ooo @@  OOO ### ",
+" XXX OOO.@O@O@@@o@@@@@@@@++o+@  @o  oo ooo oo  o       @OOOOOO ### ",
+" XXX OOO@@OOOO@@@o@@.@@@@@@++@ @@o     ooo oo o  @ @@@ @OOOOOO ### ",
+" XXX OO..@OOOOO@@@@@@@@@@@@@@@                   @@@@@ @OOOOOO ### ",
+" XXX OO.@@@OOOO.@@@@.@@@@@@@@@ @@@   @ ooo ooooo @@@@@ @@OOOOO ### ",
+" XXX OOO@@@OOOOO@@@@.@@@@@@@@@ @@@ @@@ ooo ooooo @@@@@ @@OOOOO ### ",
+" XXX OOO@@@OOOOO@@@@@@@@@.@@@@@@                 @@@@@ @@OOOOO ### ",
+" XXX OOO@@@@@OOO.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@.OOO ### ",
+" XXX OO.@@@@@@@@@@@@@@.@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@OOO ### ",
+" XXX                                                           ### ",
+" XX ########################################################### ## ",
+" X ############################################################# # ",
+"  ###############################################################  ",
+"                                                                   "
+};
diff --git a/images/tiles-145.xpm b/images/tiles-145.xpm
new file mode 100644 (file)
index 0000000..f016128
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 8 1",
+"  c black",
+". c #00003F3F0000",
+"X c #3F3F3F3F3F3F",
+"o c #585858585858",
+"O c #3F3F3F3FFFFF",
+"+ c #0000BFBF0000",
+"@ c #BFBF7F7F3F3F",
+"# c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  ###############################################################  ",
+" # ############################################################# o ",
+" ## ########################################################### oo ",
+" ###                                                           ooo ",
+" ### OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ooo ",
+" ### OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ooo ",
+" ### OOOOOOOOOOOOOOOOOO+++++OOOOO XXXOOOOOOOOOOOOOOOOOOOOOOOOO ooo ",
+" ### OOOOOOOOOOOOOO++++++++@++@@XX X X OOOOOOOOOOOOOOOOOOOOOOO ooo ",
+" ### OOOOOOOOOOOOO++++@+@+@+@+++@                  XOOOOOOOOOO ooo ",
+" ### OOOOOOOOOOOOO++++@+X+++@@@+@ XX     XX XX X    OOOOOOOOOO ooo ",
+" ### OOOOOOOOOO+++++@+++XX++++++@ @@ XX        X X   XOOOOOOOO ooo ",
+" ### OOOOOOOOOO++++++++++++++++@@ @X XXX X       X   XOOOOOOOO ooo ",
+" ### OOOOOOOO+++++++++++++++X+++@                     OOOOOOOO ooo ",
+" ### OOOOOOO++++@@@@ @@@@@@@@@X@@ X         X    X    XOOOOOOO ooo ",
+" ### OOOOO++++++++@                                   XXOOOOOO ooo ",
+" ### OOOOO@@@@@@@@@@ @X  X X                    X      X X OOO ooo ",
+" ### OOOOO           X  X  XX @@ XX   X     XX         X XOOOO ooo ",
+" ### OOO@ @@@         X X  XX XX X X XX  X  X      X   X XOOOO ooo ",
+" ### OOO@                                       X        XOOOO ooo ",
+" ### OOO@ XXX X@X XX XX X  XX XX @@ X  X X@    XX        XOOOO ooo ",
+" ### OOO@ XXX XXX XX XX XXXXX XX  @@ X X    XX     X  X  XOOOO ooo ",
+" ### OOO@                          @   X           X  X  XOOOO ooo ",
+" ### OOO@ +++++++++++++++ X   XX @@X@@ X XX XX X      X  XOOOO ooo ",
+" ### OOO@ +++++++++++++++           @ XX XX @X           XOOOO ooo ",
+" ### OO@@ +++++++++++++++ X   @@@@++@@           X    X   OOOO ooo ",
+" ### OO@@ +++++++++++++++ XX  @@++++@@@@@@@@@    X    XX XOOOO ooo ",
+" ### OO@@                     @@@@+@++@@XXX@  X       X@ XOOOO ooo ",
+" ### OOO@ @XX XX XX XX XX @  ++...++@++@@XX X            XOOOO ooo ",
+" ### OOO@ @XX XX XX XX X  @@@+@@@+.++@@@@@. XX X X    X   OOOO ooo ",
+" ### OOO@     X   X       @@@..+@++@+@++@@@ XX   X  X X    OOO ooo ",
+" ### OOO@ XXX XX @@ XX X@ @@@+++@@++@@++@@@ XX X    X    XXOOO ooo ",
+" ### OOO@ XX@ X  X  X  X@ @@.++@@@@++@++@X@             XX OOO ooo ",
+" ### OOO@                 @+++++@.+@+@@+@@@ X  X       XX XOOO ooo ",
+" ### OOO@ XXX XX X  X   X @+++@++++@++++@@X X  X X    XX XXOOO ooo ",
+" ### OOO@ XXX  X X  X  XX  +@@@@.@@@+@@++XX X  X X    X XXOOOO ooo ",
+" ### OO@@            X    @+@+@@@@@@@.@+@@@ X          XXOOOOO ooo ",
+" ### OO@@ @@X XX XX    XX @++@+@@@.@+@+@@@@ X  X @      XOOOOO ooo ",
+" ### OO@@ @@X @@ XX XX X@  +++ ++++++@@@@      X      XXX  OOO ooo ",
+" ### OO@@                 @+++@@++@@@@@@@@@ XX X X XX      OOO ooo ",
+" ### OOO@ X@X XX XX @X XX @++@@@@@@@@@@@@@@ XX   X XX @@@  OOO ooo ",
+" ### OOO@                 +++@ X                 X XX @@@  OOO ooo ",
+" ### OOO.@@@@ @@ X@ @XXX@@+++@ XXX XXX XXX X XX  X XX  @@  OOO ooo ",
+" ### OOO@@OO@@@@@@@ @XX@@+++@@                   X XXX @@  OOO ooo ",
+" ### OOO.@O@O@@@X@@@@@@@@++X+@  @X  XX XXX XX  X       @OOOOOO ooo ",
+" ### OOO@@OOOO@@@X@@.@@@@@@++@ @@X     XXX XX X  @ @@@ @OOOOOO ooo ",
+" ### OO..@OOOOO@@@@@@@@@@@@@@@                   @@@@@ @OOOOOO ooo ",
+" ### OO.@@@OOOO.@@@@.@@@@@@@@@ @@@   @ XXX XXXXX @@@@@ @@OOOOO ooo ",
+" ### OOO@@@OOOOO@@@@.@@@@@@@@@ @@@ @@@ XXX XXXXX @@@@@ @@OOOOO ooo ",
+" ### OOO@@@OOOOO@@@@@@@@@.@@@@@@                 @@@@@ @@OOOOO ooo ",
+" ### OOO@@@@@OOO.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@.OOO ooo ",
+" ### OO.@@@@@@@@@@@@@@.@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@OOO ooo ",
+" ###                                                           ooo ",
+" ## ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oo ",
+" # ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o ",
+"  ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo  ",
+"                                                                   "
+};
diff --git a/images/tiles-146.xpm b/images/tiles-146.xpm
new file mode 100644 (file)
index 0000000..b45c463
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 8 1",
+"  c black",
+". c #585858585858",
+"X c gray50",
+"o c #7B7B0000FFFF",
+"O c #7F7F7F7FFFFF",
+"+ c green",
+"@ c #FFFFBFBF7F7F",
+"# c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  ...............................................................  ",
+" . ............................................................. # ",
+" .. ........................................................... ## ",
+" ...                                                           ### ",
+" ... @@@@ @@@@@@@ @@+@@@@@@@+@@@@@@ @@@@@+@@@@@@@+++@@@@ @@@@@ ### ",
+" ... @@@@@ @@@@@@ @@@@@@ @@+@+@@@@@ @@@@@@@@@+@@@@@++@@@ @@@@@ ### ",
+" ... @@@@@ +@+@@@ @@@   X  @@@@+@@+ @+@ @   @@@+@@++@@@  @@@@@ ### ",
+" ... @+@@@ @@@@@@ @@ XXXXX @@@@@@ @ @         @+@@@@@@@  @@@@@ ### ",
+" ... @@@@@ @@@@@@ @@ XX     @@@@ @@ @@@@XX  @@@@ @@@@@ @@@@@@@ ### ",
+" ... @@@@@ @@@@@@ @  XX   +++@@ @@@ @@@@ X @@@@@ +@   @@@@++@@ ### ",
+" ...       @@@      @XX@ @+++++@@@   @@@ XX @@@@ @@  @@@@@+@+@ ### ",
+" ... @ @@@ @@@ @@    @@@  +++++@@ X   @@  XXX@XX X@ @@@@@@@@@@ ### ",
+" ... @@ @@ @@ @@@  XX  @++++++@@@     XXXXXXX XX X@ ++@@@@@@@@ ### ",
+" ... @@@ @   @@ X XXXX  +@++     X XXXXXXXXXX XX X       @@@@@ ### ",
+" ... @@@@ XXXX  X XXXXX++++@XX XXX         XXXXX X  @@XXXX@@@@ ### ",
+" ... @@@   XX XXX XXXXXX   XXX XXXX XXXXXXX         X XXXX@@@@ ### ",
+" ...        XXXXX XXX      XXX XXXX XXXXXXXX XX  XX XXXXXX@@@@ ### ",
+" ... X XX         XXXX XXX XXX XXXX XXX  XXX XXX XX XXXXXX@@@@ ### ",
+" ... X  XX XXXXXX XXXX XXX XXX XXXX XXX                        ### ",
+" ... XXX  XXXXXXX                   XXX  XXX XXX XX XXXXX XX@@ ### ",
+" ... XXXXX XXXXXX XXXX XXX XXX XXX  XXX  XXX XXX XX XXXXX XX@@ ### ",
+" ... XXXXXX  XXXX XXXX XXX  XX      X        XXX XX XXXXX XX@@ ### ",
+" ... OXXOXXX      XXXX XXX  XX X    OOOO                  XX@@ ### ",
+" ... OOXOXXXXXXXX XXXX XXX X   XXOOOO++OOO X XXXXXX XXX X X @@ ### ",
+" ... OOOX         XXXX XXX XXX  XO+++++++OXX XXXXXX XXX X X @@ ### ",
+" ... OOOOXXXX XXX XXXX XXX X X  XO+++++++OX XXXX          X @@ ### ",
+" ... OOOOXXXX XXX               XO++++++OOX XXXX XX XXX X X @@ ### ",
+" ... OOOOX        XX XX     X  XXOOOO+++OXX      XX XXX X X @@ ### ",
+" ... OOOOOXXX XXXXXX  XX   XX  XXX XOOOOOX  XXX XXX XXX X   @@ ### ",
+" ... OOOOOXXX XXXXXX XXXXX XX  XXXXX  XXXXXXXXX XXX XXX XXXX@@ ### ",
+" ... OOOOOXOOOOXO XX XX X         X      XXXXXX XXX XXX XXXX@  ### ",
+" ... OOOOOXOOO OOOOO XXXX  XX  X XX     X XXXXX XXX          X ### ",
+" ... OOOOOOOOOOOOOOOOOOO X                          XX  XX X X ### ",
+" ... OOOOOOOOOOOOOOOOOOOOXOOXX XXXXX  XXXXXXXXXXXXXXXXX XXX  X ### ",
+" ... OOOOOOOOOOOOOOOOOOOOXOXXX     XXXX           XXXXX X XX X ### ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOXXX  XOOOOOO OOO XXX XXXX X XXX  ### ",
+" ... OOOOOOOOOOOOOOOoOOOOOOOOOXXO OOOOXXXOOOOOO  XX XXX XXXXX  ### ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOXOO OXX     XXXX  ### ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOO OO O    O OOOOOOOXX X X      ### ",
+" ... OOOoOOOOOOOOOOOOOOOOOOOOO               XXXOOOXXX  XX  XX ### ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOO  XXX    XXXXXX XOOOOOXX XXX XX ### ",
+" ... OOOOOOOOOOOOOoOOOOOOOOOOOO  XXX             OOOOOOX XXXXX ### ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOO  XXXX  +XXX  @  XXXXOO OOOOXXXX ### ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOO XXXXX  XXXX  @  XXXXXOO OOOXOXX ### ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOXXXXXX  XXXX  @       @ @ OOXOOX ### ",
+" ... OOOOOOOOoOOOOOOOOOOOOOOOO                  @@ @@@@@ @ OOO ### ",
+" ... OOOOOOOOOOOOOOOOOoOOOOOOOOO   X XXXXXX @@@@@  @@@@@ @@ @  ### ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOXX X  XXXXX +++@ X @@@@@ @@@@@ ### ",
+" ... OOOOOOOOOOOOOOOOOOOOOoOOOOO   XX            +        @@@@ ### ",
+" ... OOOOooOOOOOOOOOOOOOOOOOOOOO X XX   @@@@@@@@@@ @@@@@@@@@@@ ### ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOXX XX @@@@@@@@@@@@@@@@@@@@@@@@ ### ",
+" ...                                                           ### ",
+" .. ########################################################### ## ",
+" . ############################################################# # ",
+"  ###############################################################  ",
+"                                                                   "
+};
diff --git a/images/tiles-147.xpm b/images/tiles-147.xpm
new file mode 100644 (file)
index 0000000..cfc58a3
--- /dev/null
@@ -0,0 +1,71 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"67 57 8 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c #585858585858",
+"o c #3C3C0000BFBF",
+"O c #3F3F3F3FFFFF",
+"+ c #0000BFBF0000",
+"@ c #BFBF7F7F3F3F",
+"# c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                   ",
+"  ###############################################################  ",
+" # ############################################################# X ",
+" ## ########################################################### XX ",
+" ###                                                           XXX ",
+" ### @@@@ @@@@@@@ @@+@@@@@@@+@@@@@@ @@@@@+@@@@@@@+++@@@@ @@@@@ XXX ",
+" ### @@@@@ @@@@@@ @@@@@@ @@+@+@@@@@ @@@@@@@@@+@@@@@++@@@ @@@@@ XXX ",
+" ### @@@@@ +@+@@@ @@@   .  @@@@+@@+ @+@ @   @@@+@@++@@@  @@@@@ XXX ",
+" ### @+@@@ @@@@@@ @@ ..... @@@@@@ @ @         @+@@@@@@@  @@@@@ XXX ",
+" ### @@@@@ @@@@@@ @@ ..     @@@@ @@ @@@@..  @@@@ @@@@@ @@@@@@@ XXX ",
+" ### @@@@@ @@@@@@ @  ..   +++@@ @@@ @@@@ . @@@@@ +@   @@@@++@@ XXX ",
+" ###       @@@      @..@ @+++++@@@   @@@ .. @@@@ @@  @@@@@+@+@ XXX ",
+" ### @ @@@ @@@ @@    @@@  +++++@@ .   @@  ...@.. .@ @@@@@@@@@@ XXX ",
+" ### @@ @@ @@ @@@  ..  @++++++@@@     ....... .. .@ ++@@@@@@@@ XXX ",
+" ### @@@ @   @@ . ....  +@++     . .......... .. .       @@@@@ XXX ",
+" ### @@@@ ....  . .....++++@.. ...         ..... .  @@....@@@@ XXX ",
+" ### @@@   .. ... ......   ... .... .......         . ....@@@@ XXX ",
+" ###        ..... ...      ... .... ........ ..  .. ......@@@@ XXX ",
+" ### . ..         .... ... ... .... ...  ... ... .. ......@@@@ XXX ",
+" ### .  .. ...... .... ... ... .... ...                        XXX ",
+" ### ...  .......                   ...  ... ... .. ..... ..@@ XXX ",
+" ### ..... ...... .... ... ... ...  ...  ... ... .. ..... ..@@ XXX ",
+" ### ......  .... .... ...  ..      .        ... .. ..... ..@@ XXX ",
+" ### O..O...      .... ...  .. .    OOOO                  ..@@ XXX ",
+" ### OO.O........ .... ... .   ..OOOO++OOO . ...... ... . . @@ XXX ",
+" ### OOO.         .... ... ...  .O+++++++O.. ...... ... . . @@ XXX ",
+" ### OOOO.... ... .... ... . .  .O+++++++O. ....          . @@ XXX ",
+" ### OOOO.... ...               .O++++++OO. .... .. ... . . @@ XXX ",
+" ### OOOO.        .. ..     .  ..OOOO+++O..      .. ... . . @@ XXX ",
+" ### OOOOO... ......  ..   ..  ... .OOOOO.  ... ... ... .   @@ XXX ",
+" ### OOOOO... ...... ..... ..  .....  ......... ... ... ....@@ XXX ",
+" ### OOOOO.OOOO.O .. .. .         .      ...... ... ... ....@  XXX ",
+" ### OOOOO.OOO OOOOO ....  ..  . ..     . ..... ...          . XXX ",
+" ### OOOOOOOOOOOOOOOOOOO .                          ..  .. . . XXX ",
+" ### OOOOOOOOOOOOOOOOOOOO.OO.. .....  ................. ...  . XXX ",
+" ### OOOOOOOOOOOOOOOOOOOO.O...     ....           ..... . .. . XXX ",
+" ### OOOOOOOOOOOOOOOOOOOOOOOOO...  .OOOOOO OOO ... .... . ...  XXX ",
+" ### OOOOOOOOOOOOOOOoOOOOOOOOO..O OOOO...OOOOOO  .. ... .....  XXX ",
+" ### OOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOO.OO O..     ....  XXX ",
+" ### OOOOOOOOOOOOOOOOOOOOOOOOOOOO OO O    O OOOOOOO.. . .      XXX ",
+" ### OOOoOOOOOOOOOOOOOOOOOOOOO               ...OOO...  ..  .. XXX ",
+" ### OOOOOOOOOOOOOOOOOOOOOOOOOO  ...    ...... .OOOOO.. ... .. XXX ",
+" ### OOOOOOOOOOOOOoOOOOOOOOOOOO  ...             OOOOOO. ..... XXX ",
+" ### OOOOOOOOOOOOOOOOOOOOOOOOO  ....  +...  @  ....OO OOOO.... XXX ",
+" ### OOOOOOOOOOOOOOOOOOOOOOOOO .....  ....  @  .....OO OOO.O.. XXX ",
+" ### OOOOOOOOOOOOOOOOOOOOOOOOO......  ....  @       @ @ OO.OO. XXX ",
+" ### OOOOOOOOoOOOOOOOOOOOOOOOO                  @@ @@@@@ @ OOO XXX ",
+" ### OOOOOOOOOOOOOOOOOoOOOOOOOOO   . ...... @@@@@  @@@@@ @@ @  XXX ",
+" ### OOOOOOOOOOOOOOOOOOOOOOOOOOO.. .  ..... +++@ . @@@@@ @@@@@ XXX ",
+" ### OOOOOOOOOOOOOOOOOOOOOoOOOOO   ..            +        @@@@ XXX ",
+" ### OOOOooOOOOOOOOOOOOOOOOOOOOO . ..   @@@@@@@@@@ @@@@@@@@@@@ XXX ",
+" ### OOOOOOOOOOOOOOOOOOOOOOOOOOO.. .. @@@@@@@@@@@@@@@@@@@@@@@@ XXX ",
+" ###                                                           XXX ",
+" ## XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX ",
+" # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X ",
+"  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
+"                                                                   "
+};
diff --git a/images/tiles-148.xpm b/images/tiles-148.xpm
new file mode 100644 (file)
index 0000000..0b06c0b
--- /dev/null
@@ -0,0 +1,82 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"64 64 12 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c #00007F7F0000",
+"o c gray50",
+"O c #00000000E6E6",
+"+ c #66666666E6E6",
+"@ c #0000E6E60000",
+"# c #99997D7D4C4C",
+"$ c #FFFF77770000",
+"% c #CCCC7E7E6666",
+"& c yellow",
+"* c gray75",
+/* pixels */
+"+++++++++++++++++++++++++++++++++++++++ oooooo++++++++++++++++++",
+"+++++++++++++++++++++++++++++++++++++++ oooooo++++++++$$++++++++",
+"++++%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%oooooo%%%%%%%.%$$%%%%%++",
+"+++ %%%#%#%%%%%%%%%%%%%#%%%#%%%#%%%%%%%%oooooo%%%%%%.%%%$$%%%%++",
+"++O %%%ooooooooooooooooooooooooooooooooooooooo%%%%% %%%%%$$%%%++",
+"++O %%oooooooooooooooooooooooooooo ooooooooooo%%%%%%%%%%% $$%%++",
+"++O %%ooooooooooooooooooooooooooo . oooooooooooooooooo%% % $$%++",
+"++O %%oo*oo*oo*o&& o*oo*oo*oo*oooo oooo*oo*ooooooooo.o% % %$%%++",
+"++O %%oooooooooo&& oooooooooooooooooooooooooooooooooo. . %%%%%++",
+"++O %%oooooooooooooooooooooooooooooooooo******ooooooo . %%%%%%++",
+"oooooooo*oooooo*******ooooo******o&.&o&**oooo.ooooooo. .%%%%%%++",
+"ooooooooooo%%%**ooooo.oooo**oooo.ooooo***oooo.oooooo.o%%.%%%%%++",
+"ooooooooooo%%***ooooo..oo***oooo..ooo****oooo..*oo*ooo%%%#%%%%++",
+"oo*oo*oo*oo%****ooooo..o****oooo..ooo****oooo..ooooooo%%%%#%%%++",
+"ooooooooooo*****ooooo..o****oooo..ooo****oooo..ooooooo%%*....%++",
+"ooooooooooo*****ooooo..o****oooo..ooo****oooo..ooo*ooo%**ooo.%++",
+"oooooooooo%**.**o*******************************ooooooo**o o.%++",
+"    %%%%%%%*******.............................*ooooooo**ooo.%++",
+"++O %%%%%%%**.****oooooooooooooooooooooooooooo.*oo*oooo**ooo.#++",
+"++O %%%***********oooooooooooo*++ooooooooooooo.*ooooooo**o o.#++",
+"++O %%**.....*****oo*.ooooooo*+o*+oooooooo*.oo.*oooooo%**ooo.#++",
+"++O %***.....*.***oo*.ooooooo*+o*+oooooooo*.oo.*.o*ooo%**....#++",
+"++O %***.....*****oooooooooooo*+Oooooooooooooo.*.ooooo%*....##++",
+"++O %***...oo*****oooooooooooo*+Oooooooooooooo.*.oooooo@XX####++",
+"++O %***...oo*****oooooooooo*+++O++ooooooooooo.*.o*ooo@@XX%%%%++",
+"++O %***...oo*****oooooooooooo*+Oooooooooooooo.*.ooooo@@XX%%%%++",
+"++O %***...oo*****oooooooooooo*+Oooooooooooooo.*.ooooo@XXooo%%++",
+"++O %***...oo.****oooooooooooo*+Oooooooooooooo.*.o*oooo@XXo@XX++",
+"++O %***...oo*****ooooooo*+++o*+Oo*+++oooooooo.*.ooooo@@XX@@XX++",
+"++O %***...oo*****oo*.oooo*+Oo*+Oo*O+ooooo*.oo.*.ooooo@@XX@@XX++",
+"++O %**oooooo*****oo*.ooooo*+OO+OOO+oooooo*.oo.*.o*ooo@XXo@XXo++",
+"++O %*oooo#oo*****oooooooooo*++++++ooooooooooo.*.ooooooooooooooo",
+"++O %oooo##o*.****oooooooooooooooooooooooooooo.*.ooooooooooooooo",
+"++O %%#####o************************************.o*oo*oo*oo*oo*o",
+"++O %%%####o*****oooooooooooooooooooooooooooooo..ooooooooooooooo",
+"++O %+..###*****oooooooooooooooooooooooooooooo...ooooooooooooooo",
+"++O %+..%%%*****.............................o...o*ooooooooooooo",
+"++O %+OO%%%**.**.............................o..oooooo%%%%%%%%  ",
+"++O %%%%%%%*.***.............................o..oooooo%%%%*ooo++",
+"++O %+..%%%*****.............................o..oo*ooo%%%&*ooo.+",
+"++O %+..%%%****ooooooooooooooooooooooooooooooo..oooooo%%&.*ooo++",
+"++O %+OO%%%***ooooooooooooooooooooooooooooooo...oooooo%&.%****.+",
+"++O %%%%%%%**ooo    oooo    oooo    oooooooo#...oo*ooo%%%&.%&.++",
+"++O %+..%%%*ooo ...oooo ...oooo ...oooooooo##...oooooo%%&.%&.%++",
+"++O %+..%%%ooo....oooo....oooo....oooooooo###...oooooo%&.%&.%%++",
+"++O %+OO%%%%##.....###..........................oo*ooo%%#%%#%%++",
+"++O %%%%%%%%%##...........*%%...................oooooo%%%#%%#%++",
+"++$$$$$$$$$$$$$$$$**.....**%%..*%%..........$...oooooo%%%%o%#%++",
+"++$$$$$$$$$$$$$$$$..ooooo**..o**%%oo*oo*oo**.$o*oo*ooo%%%*o.%%++",
+"++O %%%%%%%%* .%%*..ooooo*..oo**..oooooooo*.$.oooooooo%%%%o%%%++",
+"++O %%%%%%%* .%%%...oooooooo*o*..ooooooooo...$oooooooo%%o%%%o%++",
+"++O %%%%%%* .%%%%%%ooooooooooooooooooooooooo$.oooooooo%*o.%*o.++",
+"++O %%%%%* .%%%%%%%%%%%%%%oooooo%%%%%%%%%%%*.$%%%%%%%%%%o%%%o%++",
+"++O %%%%* .%%%%%%%%%%%%%%%oo*ooo%%%%%%%%%%* $.%%%%%%%%%%%%o%%%++",
+"++O %%%* .%ooooooooooooooooooooo%%%%%%%%%* ..$%%%%%%#%#%%*o.%%++",
+"++O %%%%.%%ooooooooooooooooooooo%%.....%* .%$.%%%%%%%%%%%%o%%%++",
+"++O %%%%%#%oo*oo*oo*oo*oo*oo*ooo%%.%%%%* .%%.$%%%%%%#%#%%%%%%%++",
+"++O %%%%%%#ooooooooooooooooooooo%%.%%%* .%%%$.%%%%%%%%%%%%%%%%++",
+"++O % %%%%%.oooooooooooooooooooo%%.%%* .%%%%.$%%%%%%%%%%%%%%%%++",
+"++O %%%%%%%o.*.oo%%%%%%%%%%%%%%%%%.%%%.%%%%%$.%%%#%%%%%%%%%%%%++",
+"++O        .....o                           .$                ++",
+"++OOOOOOOO ooooooOOOOOOOOOOOOOOOOOOOOOOOOOOO$.OOOOOOOOOOOOOOO+++",
+"++++++++++ oo*ooo+++++++++++++++++++++++++++.+++++++++++++++++++",
+"++++++++++ oooooo+++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-149.xpm b/images/tiles-149.xpm
new file mode 100644 (file)
index 0000000..9398981
--- /dev/null
@@ -0,0 +1,65 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"37 47 12 1",
+"  c #7F7F7F7F0000",
+". c blue",
+"X c #0000CFCF0000",
+"o c #BFBF00000000",
+"O c red",
+"+ c #BFBFBFBF3F3F",
+"@ c #FFFFBBBB0000",
+"# c #FFFFBFBF7F7F",
+"$ c yellow",
+"% c #FFFFFFFF7F7F",
+"& c gray75",
+"* c #FFFFBFBFFFFF",
+/* pixels */
+"&&&&&&&&                        &&&&&",
+"&&&&&&& ######################## &&&&",
+"&&&&&& ######       ########@@@@# &&&",
+"&&&&& #####  XXXXXXX  #####@%%%%@# &&",
+"&&&&& #### XXXXXXXXXXX ####@%%%%@# &&",
+"&&&&& ### XXXXXXXXXXXXX ###@%%%%@# &&",
+"&&&++++++++XXXXXXXXXXXXX ##@%%%%@# &&",
+"&&&& ### XXXXXXXXXXXXXXX ##@%%%%@# &&",
+"&&&+++++++XXXXXXXXXXXXXXX ##@@@@## &&",
+"&&&& ## XXXXXXXXXXXXXXXXX ###oo### &&",
+"&&&&& # XXXXXXXXXXXXXXXXX ##oOOo## &&",
+"&&&&++# XXXXXXXXXXXXXXXXX #oOOOOo## &",
+"&&& ++# XXXXXXXXXXXXXXXXX ##oooo### &",
+"&&& ++# XXXXXXXXXXXXX+++++++++++++++ ",
+"&&& ++## XXXXXXXXXXXXXXX ########## &",
+"&&& ++## XXXXXXXXXXX++++++++++++++++ ",
+"&&& ++### XXXXXXXXXXXXX ########### &",
+"&& #++#### XXXXXXX++++++++++++++++++ ",
+"& ###+##### XXXXXXXXX ############# &",
+"++++++++++++++++++++++++++++++++++++ ",
+"++++++++++++++++++++++++++++++++++++ ",
+"& ###+############################# &",
+"&& #++#+++++++#o#####o##o##o##o##o## ",
+"&&& ++#+$+$$$+oOo###oOooOooOoo*ooOo# ",
+"&&& ++#+$+$$$+oOo###oOooOooOoo*ooOo# ",
+"&&& ++#+++++++#o#####o##o##o##o##o## ",
+"&&& ++############################## ",
+"&&& ++############################## ",
+"&&& +ooooo++++++++++++++++++++++++++ ",
+"&&& +oOOOo++++++#######ooooooooo### &",
+"&&& +oOOOo++++++######o%%%%%%%%%o# &&",
+"&&& +#oOOo+++++######o%%%%%%%o%%%o &&",
+"&&& +##ooo+++++######o%%%%%%o%%%%o &&",
+"&&& #+####++++#######o%%%%%%o%%%%o &&",
+"&&& #+###########%%##o%%%%%o%%%%%o &&",
+"&&& #+##########%%%%##ooooooooooo# &&",
+"&&& #+#########%%oo%%#####oo####### &",
+"&&&& #+#########oOOo#####oOOo#$$### &",
+"&&&&& #+########oooo#####oooo$$$...+ ",
+"&&&&& #+####################$$....# &",
+"&&&&& ##+###################....$$++ ",
+"&&&&&& #+##################...$$$## &",
+"&&&&&&& #+####################$$#### ",
+"&&&&   ##+######################### &",
+"&&& ######++++++++++++++++++++++++++ ",
+"&&& ############################### &",
+"&&&&                               &&"
+};
diff --git a/images/tiles-15.xpm b/images/tiles-15.xpm
new file mode 100644 (file)
index 0000000..986002b
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 8 1",
+"  c black",
+". c #00003F3F0000",
+"X c #00005F5F0000",
+"o c #00007F7F0000",
+"O c #0000BFBF0000",
+"+ c red",
+"@ c yellow",
+"# c gray75",
+/* pixels */
+"                                ",
+"  XXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
+" X XXXXXXXXXXXXXXXXXXXXXXXXXX o ",
+" XX XXXXXXXXXXXXXXXXXXXXXXXX oo ",
+" XXX                        ooo ",
+" XXX ###################### ooo ",
+" XXX ###################### ooo ",
+" XXX ######OOOOOO####  #### ooo ",
+" XXX ####OOO.O..O####  #### ooo ",
+" XXX ####OO..O.OO##      ## ooo ",
+" XXX #####OOOOOO###      ## ooo ",
+" XXX ######OOOO.#####  #### ooo ",
+" XXX #####OO@OOO.####  #### ooo ",
+" XXX ###.OO@@@OOO.######### ooo ",
+" XXX ##OOO@.@.@OOO.######## ooo ",
+" XXX ##OOO@O@O.OOO..####### ooo ",
+" XXX ##OOO.@@@OOOO..####### ooo ",
+" XXX #.OOOO.@.@OOO..####### ooo ",
+" XXX #OOOO@O@O@OOO..####### ooo ",
+" XXX #OOOO.@@@.OOO..####### ooo ",
+" XXX ##OOOO.@.OOOO..####### ooo ",
+" XXX ##.OOOO.OOOO..######## ooo ",
+" XXX ###.OOOOOOO..##+++++## ooo ",
+" XXX ####........###+++++## ooo ",
+" XXX ###################### ooo ",
+" XXX ###################### ooo ",
+" XXX ###################### ooo ",
+" XXX                        ooo ",
+" XX oooooooooooooooooooooooo oo ",
+" X oooooooooooooooooooooooooo o ",
+"  oooooooooooooooooooooooooooo  ",
+"                                "
+};
diff --git a/images/tiles-150.xpm b/images/tiles-150.xpm
new file mode 100644 (file)
index 0000000..3abd8cb
--- /dev/null
@@ -0,0 +1,39 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"123 30 3 1",
+"  c #000040407F7F",
+". c #00000000BFBF",
+"X c gray69",
+/* pixels */
+"XXX             XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX            XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"XX ............. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ............ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"X ............... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  .............. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+" ................. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ................. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+" ................. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ................. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+" ....       ...... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .....       ..... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+" .... XXXXX ...... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ..... XXXXX ..... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+" .... XXXXX ...... XX      XXX       XXXXXXXX       XXXX ..... XXXXX ..... XX      XX                   XX      XXXX       ",
+" .... XXXXX ...... XX .... XXX ..... XXXXXXXX ..... XXXX ..... XXXXX ..... XX .... XX ................. XX .... XXXX ..... ",
+" .... XXXXX        XX .... XXX ...... XXXXXX ...... XXXX ..... XXXXX       XX .... XX ................. XXX .... XXX .... X",
+" .... XXXXXXXXXXXXXXX .... XXX ...... XXXXXX ...... XXXX ..... XXXXXXXXXXXXXX .... XX ................. XXX .... XX ..... X",
+" .... XXXXXXXXXXXXXXX .... XXX ...... XXXXXX ...... XXXX ..... XXXXXXXXXXXXXX .... XX       .....       XXX ..... X .... XX",
+" ....         XXXXXXX .... XXX ....... XXXX ....... XXXX ..... XXXXXXXXXXXXXX .... XXXXXXXX ..... XXXXXXXXXX .... X .... XX",
+" ............. XXXXXX .... XXX ....... XXXX ....... XXXX ..... XXXXXXXXXXXXXX .... XXXXXXXX ..... XXXXXXXXXX .... X ... XXX",
+" ..............  XXXX .... XXX ....... XXXX ....... XXXX ..... XXXXXXXXXXXXXX .... XXXXXXXX ..... XXXXXXXXXXX .... .... XXX",
+"X ............... XXX .... XXX ........ XX ........ XXXX ..... XXXXXXXXXXXXXX .... XXXXXXXX ..... XXXXXXXXXXX .... .... XXX",
+"XX ............... XX .... XXX ........ XX ........ XXXX ..... XXXXXXXXXXXXXX .... XXXXXXXX ..... XXXXXXXXXXX ........ XXXX",
+"XXX         ...... XX .... XXX ........ XX ........ XXXX ..... XXXXXXXXXXXXXX .... XXXXXXXX ..... XXXXXXXXXXXX ....... XXXX",
+"XXXXXXXXXXX ...... XX .... XXX ..... ...  ... ..... XXXX ..... XXXXXXXXXXXXXX .... XXXXXXXX ..... XXXXXXXXXXXX ...... XXXXX",
+"       XXXX ...... XX .... XXX ..... ...  ... ..... XXXX ..... XXXXX       XX .... XXXXXXXX ..... XXXXXXXXXXXX ...... XXXXX",
+" ..... XXXX ...... XX .... XXX .....  ......  ..... XXXX ..... XXXXX ..... XX .... XXXXXXXX ..... XXXXXXXXXXXXX .... XXXXXX",
+" ..... XXXX ...... XX .... XXX .....  ......  ..... XXXX ..... XXXXX ..... XX .... XXXXXXXX ..... XXXXXXXXXXXXX .... XXXXXX",
+" ..... XXXX ...... XX .... XXX .....  ......  ..... XXXX ..... XXXXX ..... XX .... XXXXXXXX ..... XXXXXXXXXXXXX .... XXXXXX",
+" .....      ...... XX .... XXX .....  ......  ..... XXXX .....       ..... XX .... XXXXXXXX ..... XXXXXXXXXXXXX .... XXXXXX",
+" ................. XX .... XXX ..... X .... X ..... XXXX ................. XX .... XXXXXXXX ..... XXXXXXXXXXXXX .... XXXXXX",
+" ................ XXX .... XXX ..... X .... X ..... XXXX ................. XX .... XXXXXXXX ..... XXXXXXXXXXXXX .... XXXXXX",
+" ............... XXXX .... XXX ..... X .... X ..... XXXXX ................ XX .... XXXXXXXX ..... XXXXXXXXXXXXX .... XXXXXX",
+"X ............. XXXXX .... XXX ..... X .... X ..... XXXXXX .............. XXX .... XXXXXXXX ..... XXXXXXXXXXXXX .... XXXXXX",
+"X ............ XXXXXX .... XXX ..... XX .. XX ..... XXXXXXX ............ XXXX .... XXXXXXXX ..... XXXXXXXXXXXXX .... XXXXXX",
+"XX            XXXXXXX      XXX       XX    XX       XXXXXXXX            XXXXX      XXXXXXXX       XXXXXXXXXXXXX      XXXXXX"
+};
diff --git a/images/tiles-151.xpm b/images/tiles-151.xpm
new file mode 100644 (file)
index 0000000..4f8664d
--- /dev/null
@@ -0,0 +1,84 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"58 67 11 1",
+"  c #7F7F7F7F0000",
+". c blue",
+"X c #BFBF00000000",
+"o c red",
+"O c #BFBFBFBF3F3F",
+"+ c #FFFFBBBB0000",
+"@ c #FFFFBFBF7F7F",
+"# c yellow",
+"$ c #FFFFFFFF7F7F",
+"% c gray75",
+"& c #FFFFBFBFFFFF",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%                             %%%%%%%%%%",
+"%%%%%%%%%%%%%%%    @@@@@@@@@@@@@@@@@@@@@@@@@@@@ %%%%%%%%%%",
+"%%%%%%%%%%%%%  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  %%%%%%%%",
+"%%%%%%%%%%%  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  %%%%%%%",
+"%%%%%%%%%% @@@@@@@@@@@       @@@@@@@@@@@@@@@@@@@@@@  %%%%%",
+"%%%%%%%%% @@@@@@@@@             @@@@@@@@@@@+++++++@@ %%%%%",
+"%%%%%%%%% @@@@@@@     ......      @@@@@@@@+$$$$$$$+@ %%%%%",
+"%%%%%%%% @@@@@@@    ...........    @@@@@@@+$$$$$$$+@ %%%%%",
+"%%%%%%%% @@@@@@   ...............   @@@@@@+$$$$$$$+@ %%%%%",
+"%%%%%%%% @@@@@  ..................   @@@@@+$$$$$$$+@ %%%%%",
+"%%%%%%OOOOOOOOOOO..................   @@@@+$$$$$$$+@ %%%%%",
+"%%%%%OOOOOOOOOOOOO..................   @@@+$$$$$$$+@ %%%%%",
+"%%%%%%%% @@@  .......................  @@@+$$$$$$$+@ %%%%%",
+"%%%%%%OOOOOOOOOO.....................  @@@+++++++++@ %%%%%",
+"%%%%%OOOOOOOOOOOO.....................  @@@@@@@@@@@@ %%%%%",
+"%%%%%%% @@@  .........................  @@@@@XX@@@@@ %%%%%",
+"%%%%%%%% @@  .........................  @@@@XooX@@@@ %%%%%",
+"%%%%%%%   @  .........................  @@@@XooXX@@@@   %%",
+"%%%%%  O@O@  .........................  @@@@oXXo@@@@@@@@ %",
+"%%%%% @O@O@  .........................  @@@@@@@@@@@@@@@@ %",
+"%%%%% @O@O@   .....................OOOOOOOOOOOOOOOOOOOOO@ ",
+"%%%%% @O@O@@  ....................OOOOOOOOOOOOOOOOOOOOOOO%",
+"%%%%% @O@O@@  .......................  @@@@@@@@@@@@@@@@@ %",
+"%%%%% @O@O@@@  .................OOOOOOOOOOOOOOOOOOOOOOOO@ ",
+"%%%%% @O@O@@@   ...............OOOOOOOOOOOOOOOOOOOOOOOOOO%",
+"%%%%% @O@O@@@@   .................   @@@@@@@@@@@@@@@@@@@ %",
+"%%%   @O@O@@@@@    .........OOOOOOOOOOOOOOOOOOOOOOOOOOOO  ",
+"%%% @@@@@O@@@@@@           OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%",
+"%%  @@@@@O@@@@@@@@               @@@@@@@@@@@@@@@@@@@@@@@ %",
+"%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO %",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+"%%% @@@@@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %",
+"%%%% @@@@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %",
+"%%%%% @O@O@OOOOOOOOOOO@XX@@@@@@@XXX@@XXX@@XXX@@ooo@@XXX@ %",
+"%%%%% @O@O@O###O#####OXooX@@@@@XoooXXoooXXoooXo&&&oXoooX %",
+"%%%%% @O@O@O###O#####OXooXX@@@@XoooXXoooXXoooXo&&&oXoooX %",
+"%%%%% @O@O@O###O#####OoXXo@@@@@XoooXXoooXXoooXo&&&oXoooX %",
+"%%%%% @O@O@OOOOOOOOOOO@@@@@@@@@XXXXXXXXXXXXXXXoooooXXXXX %",
+"%%%%% @O@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %",
+"%%%%% @O@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %",
+"%%%%% @O@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %",
+"%%%%% @O@XXXXXXXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%",
+"%%%%% @O@XoooooXOOOOOOOOO@@@@@@@@@@@XXXXXXXXXXXX@@@@ %%%%%",
+"%%%%% @O@XoooooXOOOOOOOOO@@@@@@@@@@X$$$$$$$$$$$$XX@@ %%%%%",
+"%%%%% @O@@XooooXOOOOOOOOO@@@@@@@@@X$$$$$$$$$$$$$$$X@ %%%%%",
+"%%%%% @O@@XooooXOOOOOOOO@@@@@@@@@X$$$$$$$$$$$X$$$$$X %%%%%",
+"%%%%% @O@@@XXooXOOOOOOOO@@@@@@@@@X$$$$$$$$$$$X$$$$$X %%%%%",
+"%%%%% @O@@@@@XXXOOOOOOO@@@@@@@@@@X$$$$$$$$$$X$$$$$$X %%%%%",
+"%%%%% @@O@@@@@@@OOOOOO@@@@@@@@@@@X$$$$$$$$$$X$$$$$$X %%%%%",
+"%%%%%% @O@@@@@@@OOOOO@@@@@@@@$@@@@X$$$$$$$$X$$$$$$X@ %%%%%",
+"%%%%%% @O@@@@@@@@@@@@@@@@@@$$$$$@@X$$$$$$$$X$$$$$XX@ %%%%%",
+"%%%%%% @@O@@@@@@@@@@@@@@@$$$$$$$$@@XXXXXXXXXXXXXX@@@ %%%%%",
+"%%%%%%% @O@@@@@@@@@@@@@@@$$$XX$$$@@@@@@@@XX@@@@@@@@@@  %%%",
+"%%%%%%% @O@@@@@@@@@@@@@@$$$XooX$$$@@@@@@XooX@@@@#@@@@@@ %%",
+"%%%%%%% @@O@@@@@@@@@@@@@@@@XooXX@@@@@@@@XooXX@####@@@@  %%",
+"%%%%%%%% @@O@@@@@@@@@@@@@@@oXXo@@@@@@@@@oXXo#######...O %%",
+"%%%%%%%%% @O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@####.OOOO.OO%%",
+"%%%%%%%%% @O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##..OO.OO.. %%%",
+"%%%%%%%%%% @O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...OOOOO..@OO  %",
+"%%%%%%%%%% @@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOO..###OOOO%%",
+"%%%%%%%%%%% @O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.O.######@@@ %%",
+"%%%%%%      @@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@######@@OO %%",
+"%%%%% @@@@@@@@@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOO %",
+"%%%%% @@@@@@@@@@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %%",
+"%%%%% @@@@@@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%",
+"%%%%  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  %%",
+"%%%%                                                   %%%"
+};
diff --git a/images/tiles-152.xpm b/images/tiles-152.xpm
new file mode 100644 (file)
index 0000000..ec34dde
--- /dev/null
@@ -0,0 +1,65 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"37 47 12 1",
+"  c #7F7F7F7F0000",
+". c blue",
+"X c #BFBF00000000",
+"o c #CFCF00000000",
+"O c red",
+"+ c #BFBFBFBF3F3F",
+"@ c #FFFFBBBB0000",
+"# c #FFFFBFBF7F7F",
+"$ c yellow",
+"% c #FFFFFFFF7F7F",
+"& c gray75",
+"* c #FFFFBFBFFFFF",
+/* pixels */
+"&&&&&&&&                        &&&&&",
+"&&&&&&& ######################## &&&&",
+"&&&&&& ######       ########@@@@# &&&",
+"&&&&& #####  ooooooo  #####@%%%%@# &&",
+"&&&&& #### ooooooooooo ####@%%%%@# &&",
+"&&&&& ### ooooooooooooo ###@%%%%@# &&",
+"&&&++++++++ooooooooooooo ##@%%%%@# &&",
+"&&&& ### ooooooooooooooo ##@%%%%@# &&",
+"&&&+++++++ooooooooooooooo ##@@@@## &&",
+"&&&& ## ooooooooooooooooo ###XX### &&",
+"&&&&& # ooooooooooooooooo ##XOOX## &&",
+"&&&&++# ooooooooooooooooo #XOOOOX## &",
+"&&& ++# ooooooooooooooooo ##XXXX### &",
+"&&& ++# ooooooooooooo+++++++++++++++ ",
+"&&& ++## ooooooooooooooo ########## &",
+"&&& ++## ooooooooooo++++++++++++++++ ",
+"&&& ++### ooooooooooooo ########### &",
+"&& #++#### ooooooo++++++++++++++++++ ",
+"& ###+##### ooooooooo ############# &",
+"++++++++++++++++++++++++++++++++++++ ",
+"++++++++++++++++++++++++++++++++++++ ",
+"& ###+############################# &",
+"&& #++#+++++++#X#####X##X##X##X##X## ",
+"&&& ++#+$+$$$+XOX###XOXXOXXOXX*XXOX# ",
+"&&& ++#+$+$$$+XOX###XOXXOXXOXX*XXOX# ",
+"&&& ++#+++++++#X#####X##X##X##X##X## ",
+"&&& ++############################## ",
+"&&& ++############################## ",
+"&&& +XXXXX++++++++++++++++++++++++++ ",
+"&&& +XOOOX++++++#######XXXXXXXXX### &",
+"&&& +XOOOX++++++######X%%%%%%%%%X# &&",
+"&&& +#XOOX+++++######X%%%%%%%X%%%X &&",
+"&&& +##XXX+++++######X%%%%%%X%%%%X &&",
+"&&& #+####++++#######X%%%%%%X%%%%X &&",
+"&&& #+###########%%##X%%%%%X%%%%%X &&",
+"&&& #+##########%%%%##XXXXXXXXXXX# &&",
+"&&& #+#########%%XX%%#####XX####### &",
+"&&&& #+#########XOOX#####XOOX#$$### &",
+"&&&&& #+########XXXX#####XXXX$$$...+ ",
+"&&&&& #+####################$$....# &",
+"&&&&& ##+###################....$$++ ",
+"&&&&&& #+##################...$$$## &",
+"&&&&&&& #+####################$$#### ",
+"&&&&   ##+######################### &",
+"&&& ######++++++++++++++++++++++++++ ",
+"&&& ############################### &",
+"&&&&                               &&"
+};
diff --git a/images/tiles-153.xpm b/images/tiles-153.xpm
new file mode 100644 (file)
index 0000000..f1d46e8
--- /dev/null
@@ -0,0 +1,10 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"126 2 2 1",
+"  c #3F3F3F3F3F3F",
+". c gray75",
+/* pixels */
+"                                                                                                                             .",
+" ............................................................................................................................."
+};
diff --git a/images/tiles-154.xpm b/images/tiles-154.xpm
new file mode 100644 (file)
index 0000000..52adf1d
--- /dev/null
@@ -0,0 +1,79 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"64 64 9 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c #00007F7F0000",
+"o c gray50",
+"O c #0000E6E60000",
+"+ c #99997E7E4C4C",
+"@ c #CCCC7E7E6666",
+"# c gray75",
+"$ c gray100",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"X@@@@@@@@@@@@@O@ooooo@O@@@O@@@O@@@@@@@#########@@@@@@@@@@@@@@@@X",
+"X@@@@@OO@@@@@@@@ooooo@XO@@@@@@O@@@@@###.......###@@@@@@@@@@@@@@X",
+"X@@@@XX@@@@@@@@@ooooo@@@@@@@@@@@@@##.............##@@@@@@@@@@@@X",
+"X@@@@@@@@@@@O@@Oooooo@@@@@@@O@O@##...............@.##@@@@@@@@@@X",
+"X@@@ooooooooooooooooo@@@@@@XX@O#......        .......#@@@@@@@@@X",
+"X@O@ooooooooooooooooo@@@@@@@@@#.....  ........  ......#@@@O@@@@X",
+"X@O@ooooooooooooooooo@@O@@O@@#....  ............  .....#@@@@@@@X",
+"ooooooooooooooooooooo@@@@X@@#.... ....       .....  ...#@@@@@@@X",
+"ooooooooooooooooooooo@@@@@@# ... ...  .......  ....  ...#@@@@@@X",
+"oooooooo.oo.oo.oo.ooo@@@@@@#... ..  ...........  ... ...#@@@@O@X",
+"ooooooooooooooooooooo@@@@@# ..    ....      ..... ..  ...#@@@@@X",
+"ooooooooooooooooooooo@@@@## .   o..   ......  ....     ..#@@@@@X",
+"X@@@ooooooooooooooooo@O@@##.. . ..  ..........  ... o  ..#@@@@@X",
+"X@@@ooooooooooooooooo@@@#$#. .. . .. . . . . ... ..  .. ..#@@@@X",
+"X@@@ooooooooooooooooo@@@#$#. . . ................ .. .. ..#@@@@X",
+"X@@@ooooooooooooooooo@@.$$#. . .                   . .. ..#@@@@X",
+"X@@@oooo.oo.oo.oo.ooo@..$$#...  .oo............... . ... .#@@@@X",
+"X@@@ooooooooooooooooo ..$$#.. . .................. .. .. .#@@@@X",
+"X@@@oooooooooooooooooo.$$$#..  .                 .. . .. .#+@@@X",
+"X@O@ooooooooooooooooo $$$$#..  . XXXXXXXX#X#XXXX .. . .. .#+@@@X",
+"X@X@ooooooooooooooooo$#$$$#..  . XXXXXXX###XXXXX .. . .. .#+@@@X",
+"X@@@ooooooooooooooooo$$$$$#..  . XXXXXXX#XXXXXXX .. . .. .#+@@@X",
+"X@@@ooooooooooooooooo$#$#$#..  . XOOOOOOOOOOOOOX .. . .. .#+@@@X",
+"X@@@oooo.oo.oo.oo.ooo$#$$$#..  . XOOOOOOOOOOOOOX .. . .. .#+@@@X",
+"X@@@ooooooooooooooooo$$$###..  . XOOXXOOOOOXXOOX .. . .. .#+@@@X",
+"X@@@ooooooooooooooooo$#.###..  o XOOOOOOOOOOOOOX .. . .. .#+O@@X",
+"X@@@ooooooooooooooooo$..#$#..  . XOOOOOOOOOOOOOX o. . .. .#+@@@X",
+"X@@@ooooooooooooooooo ..###..  . XOOXXOOOOOXXOOX .. . .. .#+@@@X",
+"X@@@oooooooooooooooooo.####..  . XOOOOOOOOOOOOOX .. . .. .#+@@@X",
+"X@@@ooooooooooooooooo #$###..  o XOOOOOOOOOOOOOX .. . .. .#+@@@X",
+"X@@@oooo.oo.oo.oo.ooo@#####..  . XXOXOXOXOXOXOXX o. . .. .#+@@@X",
+"X@@@ooooooooooooooooo@#####..  . XOOOOOOOOOOOOOX .. . .. .#+@@@X",
+"X@@@ooooooooooooooooo@#####..  . XOOOOOOOOOOOOOX .. . .. .#+@@@X",
+"X@@@ooooooooooooooooo@#####..  o XOOXXOOOOOXXOOX .. . .. .#+@@@X",
+"X@O@ooooooooooooooooo@#####..  . XOOOOOOOOOOOOOX o. . .. .#+@@OX",
+"X@@@ooooooooooooooooo@#.###..  . XOOOOOOOOOOOOOX .. . .. .#+@@@X",
+"X@@@ooooooooooooooooo@..###..  . XOOXXOOOOOXXOOX .. . .. .#+@@@X",
+"X@@@oooo.oo.oo.oo.ooo ..###..  . XOOOOOOOOOOOOOX .. . .. .#+@@@X",
+"X@@@oooooooooooooooooo.####..  . XOOOOOOOOOOOOOX .. . .. .#+@@@X",
+"X@@@ooooooooooooooooo #####..  . XXXXXXXX#X#XXXX .. . .. .#+@@@X",
+"X@@@ooooooooooooooooo@#####..  . XXXXXXX###XXXXX .. . .. .#+@@@X",
+"X@@@ooooooooooooooooo@#####.. .  XXXXXXX#XXXXXXX . .. .. .#+@@@X",
+"X@@@ooooooooooooooooo@#####...                   . . ... .#+@@@X",
+"X@@@ooooooooooooooooo@#####. .  .................. . ... .#+O@@X",
+"X@@@oooo.oo.oo.oo.ooo@#####o ...                   . .. . #+@@@X",
+"X@@@ooooooooooooooooo@####oo .... ..............  . ... .#++@@@X",
+"X@@@ooooooooooooooooo@###ooo$  ...  . . . . .   ...  . ..#++@@@X",
+"ooooooooooooooooooooo@o#oooo$    ..    .....   ..  o   .#+++@@@X",
+"ooooooooooooooooooooooooooooo$  .  ...      ....  .   ..#+++@@@X",
+"ooooooooooooooooooooo@ooo ooo#....  ...........  ... ..#++++@@@X",
+"ooooooooooooooooooooo@ oooooo#   ...  .......  ....  .#+++X+@@@X",
+"oooooooo.oo.oo.oo.ooo@@ooo ooo#   ....       .....  .#.++++@O@@X",
+"X@@@@oooooooooooooooo@@@ooooo.o# .  ............  ..#..+X++@@@@X",
+"X@@@O@ooooooooooooooo@@@oooo.ooo##..  ........  ...#..++++@@@@@X",
+"X@@@@@Ooooooooooooooo@@@@oo.ooo.oo##..        ...##..+++++@@@O@X",
+"X@@@@@@@ooooooooooooo@@@@Ooooo.ooooo##.........##$.++++++@@@@@@X",
+"X@XX@@@@@@O@oooooo@@@O@@@OOoo.oooo.ooo#########o...++X++@@@@@@@X",
+"X@@@O@@@@OO@oooooo@@@@@@@XOOooooo.ooo.oo..........+++++@@@@@@@@X",
+"X@@@OO@@@@@@oooooo@@@@@@@@OOOooo.ooo.oo.o... ...++++++@@@@@@@@@X",
+"X@@XX@@@@@@@oooooo@@@@@@@@X@X@+oooo.oo.o.o.....++++X+@@@@@@@@@@X",
+"X@@O@@@@@@@@oooooo@@@@@@@@@@@@+@.o.oo.o.o....+++XX++OO@@OO@@@@@X",
+"X@@@@@@@@@@@oooooo@O@@@@@@@@O@@+@..........+++++++++O@@@O@@@@@@X",
+"XXXXXXXXXXXXooooooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/images/tiles-155.xpm b/images/tiles-155.xpm
new file mode 100644 (file)
index 0000000..a998ade
--- /dev/null
@@ -0,0 +1,15368 @@
+/* XPM */
+static char *tiles____[] = {
+/* columns rows colors chars-per-pixel */
+"16 15360 2 1",
+"  c black",
+". c gray100",
+/* pixels */
+"................",
+"................",
+"... ....... ....",
+"................",
+"................",
+"................",
+".. .............",
+"............ ...",
+"................",
+"......... ......",
+"................",
+".... ...........",
+"................",
+"............ ...",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+" ...............",
+" ...............",
+" ...... ........",
+" ...............",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"                ",
+"                ",
+"                ",
+"         . .    ",
+"                ",
+"                ",
+"  . .           ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"      . .       ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"       ...      ",
+"       .        ",
+"       ...      ",
+"                ",
+"         .      ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"         . .    ",
+"                ",
+"                ",
+"  . .           ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"      . .       ",
+"                ",
+"                ",
+"                ",
+"................",
+"..... ......   .",
+" .      .... .  ",
+"    ..      .  .",
+"  ..        .  .",
+".               ",
+"     .          ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"    . .         ",
+"                ",
+"                ",
+"                ",
+"................",
+". .....   ......",
+"        .  .....",
+"     ...     . .",
+"   .      .    .",
+"               .",
+"                ",
+"               .",
+"   . .          ",
+"                ",
+"                ",
+"               .",
+"                ",
+"                ",
+"                ",
+"                ",
+"................",
+"................",
+".. .............",
+"................",
+"  ..............",
+" .  ............",
+" ..  ...........",
+"     ...........",
+"     . .........",
+"     .  ........",
+"     . .........",
+"    . . ........",
+"          ......",
+"          ... ..",
+"           . ...",
+"            . ..",
+"................",
+"................",
+" ...............",
+" ...............",
+".  .. .  .......",
+"    .  .........",
+"    .. . .......",
+"       ..  .....",
+"        ........",
+"     .. . ......",
+"         .......",
+"           .....",
+"          . ....",
+"    .        ...",
+"   .  .    .  ..",
+"              ..",
+"             ...",
+"           . ...",
+"               .",
+"           . . .",
+"       .       .",
+"       .     ...",
+"         . .....",
+"         ... ...",
+"          ......",
+"  . .        ...",
+"             ...",
+"         .   ...",
+"           . ...",
+"         ..  ...",
+"            ....",
+"           .. ..",
+"        .     ..",
+"             ...",
+"         .  ....",
+" . .   .   .....",
+"            ....",
+"              ..",
+"           .  ..",
+"             ...",
+"        .  . ...",
+"           .  ..",
+"              ..",
+"          . ....",
+"             ...",
+"           . ...",
+"         .    ..",
+"              ..",
+"             ...",
+"     .    ...  .",
+"          . ....",
+"      ..  ......",
+"         ... ...",
+"        . . ....",
+"        . . ....",
+" .        . ....",
+"   .  ..   .....",
+"     .... ......",
+" .    ..........",
+"    . ..........",
+" ..   ..........",
+"  ..............",
+" ...............",
+"................",
+"               .",
+"             .. ",
+"   .      .  . .",
+"         ..  ...",
+"        .. .   .",
+"    .   ........",
+"        ..  ....",
+"    ... ........",
+"     . . .......",
+"      .. .......",
+"     . .  ......",
+"   .  ..........",
+"....  ..........",
+". . .  .........",
+"................",
+"................",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"     . .        ",
+"                ",
+"                ",
+"                ",
+"                ",
+"  .    .   . .. ",
+"               .",
+"       ...   .  ",
+"    .     ...   ",
+"...   .. .......",
+"................",
+"                ",
+"                ",
+"                ",
+"         . .    ",
+"                ",
+"                ",
+"                ",
+"  .        .    ",
+"                ",
+"    .    ... .  ",
+"                ",
+".     ....  .   ",
+"  ...       ..  ",
+" .....  ......  ",
+"................",
+"................",
+"                ",
+".               ",
+"..        . .   ",
+"..              ",
+"..              ",
+".... .    .     ",
+".... . ..       ",
+"......   ..     ",
+"......     ..   ",
+"......     .    ",
+".......  .. ..  ",
+"............   .",
+".............   ",
+"..............  ",
+"..............  ",
+"................",
+"                ",
+".               ",
+"...      . .    ",
+"....            ",
+"...             ",
+".  .. .         ",
+".  . .      .   ",
+"...   ..   .    ",
+".....  .        ",
+"...... ..  .    ",
+"......     ..   ",
+"..........  ..  ",
+"...........  .  ",
+"...........   . ",
+"............   .",
+"............... ",
+"..              ",
+"...             ",
+".... .          ",
+"..   .          ",
+".. ..           ",
+"..  .    . .    ",
+"...    .        ",
+".... . ..       ",
+"....   .        ",
+"..      .       ",
+".  .    .       ",
+".  .            ",
+"...             ",
+"... .           ",
+"... .           ",
+"..              ",
+"...             ",
+"...  ..         ",
+"... .           ",
+".....  .        ",
+".....           ",
+".. ..           ",
+".....           ",
+"....     . .    ",
+"....  .         ",
+".....  .        ",
+"....            ",
+"....            ",
+"...             ",
+"... ..          ",
+"..              ",
+"..              ",
+"................",
+".............. .",
+"............ .  ",
+"..............  ",
+".............   ",
+".......   .     ",
+"......   ..     ",
+"..... .  ..     ",
+"....            ",
+"... . .  ..     ",
+".... .. ..      ",
+"......          ",
+".. ..           ",
+".          . .  ",
+"     .          ",
+"                ",
+"................",
+".............. .",
+"............. ..",
+"............... ",
+".........       ",
+"......... ..    ",
+".........       ",
+"........        ",
+"..... .  . .    ",
+".....    .      ",
+"......          ",
+"....       . .  ",
+" .    .         ",
+"..              ",
+"    .           ",
+"                ",
+"...... .........",
+". . . . ... ....",
+" . ... . . .. ..",
+". . . ..... . . ",
+" . . . ... . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . ..",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"................",
+"................",
+"....... ........",
+". ... .. .......",
+".. . . . .......",
+". . ..... ......",
+" . . . ... .....",
+". . . . ... ....",
+".... . . ... ...",
+". . . . ........",
+" . . . . . . ...",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . ......",
+" . . . . . . . .",
+". . . . . . . ..",
+" . . . . . . . .",
+". . . . . . . ..",
+" . . . . . . . .",
+". . . . . ... . ",
+" . . . . ... ...",
+". . . . . . . . ",
+" . . . . . . ...",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . ... . ",
+" . . . . . . ...",
+". . . . . . . . ",
+" . . . . . ... .",
+". . . . . ... . ",
+" . . . . . ... .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . ... ..",
+" . . . . . . ...",
+". . . . . ......",
+" . . . . .......",
+". . . ... ......",
+" . . ...........",
+". ..... ... ....",
+" ... . ... .....",
+". ..... ........",
+" ... . . .......",
+". . . ..........",
+" . .............",
+"... ............",
+" ...............",
+"................",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . ... ",
+" ..... . ... . .",
+". . ... ....... ",
+".. . . . ..... .",
+"... ....... ... ",
+" . .............",
+". ..............",
+" ...............",
+"................",
+"...... ... . . .",
+"... . ... . . . ",
+".. . . . . . . .",
+"....... ... . . ",
+".......... . . .",
+"......... . . . ",
+".... ..... . . .",
+"............... ",
+"........ . . ...",
+"......... . . ..",
+".......... ... .",
+"............... ",
+"........ ..... .",
+"................",
+"................",
+"................",
+".... ... . . . .",
+"....... . . . . ",
+".. . . . . . . .",
+"... ... . . . . ",
+".. . . . . . . .",
+"... . . . . . . ",
+".... . . . . . .",
+"... ... . . . . ",
+".. ... . . . . .",
+". . . . . . . . ",
+" ..... . . . . .",
+". . . . . . . . ",
+".... ... . . . .",
+"..... . . . . . ",
+"...... . . . . .",
+"... . ... . . . ",
+"................",
+"............. ..",
+"............ . .",
+"......... . ....",
+"...... .........",
+"..... . ... ... ",
+".... ... . . . .",
+"........... . ..",
+".... ... . . . .",
+"..... . . . . . ",
+"...... . . . . .",
+"... . . . . . . ",
+".... . . . . . .",
+"..... . . . . . ",
+".... . . . . . .",
+"..... . . . . . ",
+"................",
+". ...... ... ...",
+".. . .... . . ..",
+". . . ... .. .. ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"................",
+" ...............",
+" .. ... ........",
+". ...... . ... .",
+" . ... .........",
+". . . . ........",
+" . . . . . .. ..",
+". . . . ... ....",
+" . . . . . . ...",
+". . . . . . . ..",
+" . . . . . . ...",
+". . . . . . .  .",
+" . . . . . . ...",
+". . . . . . .  .",
+" . . . . . . ...",
+". . . . . . .  .",
+" . . . . . . ...",
+". . . . . . ....",
+" . . . . . .. ..",
+". . . . . .. ...",
+" . . . . . . ...",
+". . . . . . .  .",
+" . . . . . . ...",
+". . . . . . ....",
+" . . . . . .....",
+". . . . . .. ...",
+" . . . . . .....",
+". . . . . .  ...",
+" . . . . . .....",
+". . . . . . . ..",
+" . . . . . . ...",
+". . . . . . ....",
+" . . . . . . ...",
+". . . . . . . ..",
+" . . . . . . ...",
+". . . . . . . ..",
+" . . . ..... ...",
+". . . ... ......",
+" . . . . .......",
+". . . . ........",
+" . . . .........",
+". . . ..........",
+" . . . . .......",
+". . . ..........",
+".. . . .........",
+". . ............",
+" ...............",
+"................",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" ..... . ... . .",
+". . . . ... ... ",
+" . ... . ..... .",
+". ............. ",
+" . ..... .......",
+". ..... . ... ..",
+"........ .......",
+"................",
+".. . . . . . . .",
+". . . . . . . . ",
+".. . . . . . . .",
+"... . . . . . . ",
+".. . ... . . . .",
+"..... ... . . . ",
+"........ . . . .",
+"......... . . . ",
+"...... . . . . .",
+"..... . ... . . ",
+"...... ... . . .",
+"........... . . ",
+"........ . . ...",
+"............... ",
+".............. .",
+"................",
+".... ... . . . .",
+"... . . . . . . ",
+".... . . . . . .",
+"....... . . . . ",
+"...... . . . . .",
+"... . . . . . . ",
+"...... . . . . .",
+"..... . . . . . ",
+"...... . . . . .",
+"..... . . . . . ",
+"........ . . . .",
+"... . . . . . . ",
+".. . ... . . . .",
+"... ... . . . . ",
+".. . . . . . . .",
+". . . . . . . . ",
+"................",
+"................",
+"........ ... . .",
+"......... . . . ",
+"...... ... . . .",
+"..... ..... . . ",
+"............ . .",
+"....... ... . . ",
+".... . ... . . .",
+"....... . . . . ",
+".. ... . . . . .",
+"... . . . . . . ",
+".. . . . . . . .",
+"... . . . . . . ",
+".. . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"................",
+"................",
+"..... ... ......",
+".. ... . .......",
+"... . . . . ....",
+".... . . . .....",
+"... . . . . ....",
+".... . . . . ...",
+"... . . . ......",
+".... . . . . ...",
+"..... . . . ....",
+".... . . . . ...",
+"... . ... ......",
+"................",
+"................",
+"................",
+"                ",
+"  . . . . . . . ",
+" . . . . . . .  ",
+"  . . ..... . . ",
+" . . . . ... .  ",
+"  . ... . . . . ",
+" . . ..... . .  ",
+"  . ....... . . ",
+" . . ... . . .  ",
+"  ... ..... . . ",
+" . . . . . . .  ",
+"  . ... . . . . ",
+" . . . . . . .  ",
+"  . . . . . . . ",
+" . . . . . . .  ",
+"                ",
+".. . ... . . . .",
+". . . . . . . . ",
+".. . ... . . . .",
+"... ... . . . ..",
+"...... ... . . .",
+". ... . . . . . ",
+".. ..... . . . .",
+". ..... ... . . ",
+"...... ... ... .",
+". . . . . ... . ",
+".. . . ... . ...",
+". . . . ... . ..",
+".... . ... . . .",
+". . ... ... . . ",
+".... ..... . . .",
+"................",
+".. . . . ... . .",
+"... . ..... . . ",
+".. . . . . . . .",
+". . . . . . . ..",
+".... ... . . . .",
+". ... . ..... . ",
+".. . . . . . . .",
+". . ... . . . ..",
+".. . ..... . ...",
+". . . . . . ... ",
+".. . . . . . . .",
+". . . ... ... . ",
+".. . . ... . . .",
+". . . . . . . . ",
+".. . . . . . . .",
+"................",
+".. . . ... . . .",
+". . . . . . . ..",
+".. . . . . ... .",
+". . . ... . . ..",
+".. . . . . . . .",
+". . ... . . . . ",
+".. . ... . ... .",
+". . . . . . . . ",
+".. . . . . ... .",
+"... ... ....... ",
+".. . . . . . . .",
+". . . . . . . ..",
+".. ... ..... . .",
+". . . . ... ....",
+".. ... . ... . .",
+"................",
+".. . . ... . . .",
+". . . . . . . ..",
+".. . . . . ... .",
+". . . ... . . ..",
+".. . . . . . . .",
+". . ... . . . . ",
+".. . ... . ... .",
+". . . . . . . . ",
+".. . . . . ... .",
+"... ... ....... ",
+".. . . . . . . .",
+". . . . . . . ..",
+".. ... ..... . .",
+". . . . ... ....",
+".. ... . ... . .",
+"................",
+"... . ...  .....",
+".  .... ..... ..",
+".. ...  ..  ..  ",
+". . ... ... ... ",
+". . ....    . ..",
+"  .....   ......",
+". ..   ..  .. ..",
+". .. ..  ..   . ",
+" .  . . ..  ..  ",
+"... . .. .. . ..",
+".. ...  ... ..  ",
+"...  .  . .  .. ",
+"  .    .. . ....",
+" .......  . ... ",
+".. .. . ........",
+"....  .. .... ..",
+"..  . ..  ......",
+"... .... ... .. ",
+"... .   .   .  .",
+"..   ..    .  ..",
+". . ..  .   ..  ",
+"  . . . . .   ..",
+". ..  . ....... ",
+" ... ... .... ..",
+"    .  ..   ..  ",
+"..   .. . . ... ",
+"......  ... .. .",
+"....  ... . ... ",
+". ....... ....  ",
+" ... .. .... ...",
+"..    ...  .. ..",
+".... .......  ..",
+"... ... ........",
+" . .  ..... .. .",
+".  ...  .. .....",
+". ..  ....  . . ",
+" .. ... . ..... ",
+". .. ....... .. ",
+"....... .  .... ",
+". ... .. ...  ..",
+". . .  ........ ",
+". . . ... . . ..",
+"..  ..  .. .....",
+".... .. ..... ..",
+". ... . ... ... ",
+"  .. ..  ... ...",
+"... .. ..   ....",
+"..... ... ... ..",
+".. ........ ....",
+"....  ..  ... ..",
+"..  ... ..  .  .",
+"   .. .. ..   ..",
+"... ..... . . ..",
+". ..  .  .. . . ",
+".   . ...   ..  ",
+"  . . .   .   . ",
+".....  ..   .  .",
+"  .  ..  ..   . ",
+". . ..  .  .. ..",
+"  .. ... ..   . ",
+".. ..   .   ..  ",
+"....  ..  ..  ..",
+"..  ..  ..  .  .",
+"..... . . . ....",
+"...    ..     ..",
+" .  .          .",
+".      . ... .  ",
+"   ...        ..",
+" .      .       ",
+"           ..   ",
+"... . ...       ",
+"           .  ..",
+"  .    .        ",
+".         .  .  ",
+"  .  ...        ",
+"         .  ... ",
+"..              ",
+"     .  ...     ",
+"  .          .  ",
+"..  .  .       .",
+"..       .   . .",
+".  .       .  ..",
+"      ..        ",
+" ...       ..   ",
+"         .     .",
+"      .       . ",
+"  .  ...   .    ",
+"             .  ",
+"  ..            ",
+"      .  ..   . ",
+"                ",
+" ..  .   .   . .",
+"                ",
+"  .     ..  ..  ",
+".     .        .",
+".  ..     .     ",
+".             ..",
+"    ..          ",
+".       ...    .",
+"  ..         .  ",
+"         .      ",
+".    ..         ",
+" ...       ...  ",
+"       ..      .",
+"           ..   ",
+"  ..            ",
+".    .  ..      ",
+"            ..  ",
+"   ..     .    .",
+"                ",
+" .      ..  .   ",
+".   .         ..",
+"..   .        ..",
+"..        ..    ",
+".               ",
+" ...   ..   ..  ",
+"                ",
+"          ..    ",
+"     ..     .   ",
+" ..      .      ",
+"     .     ..   ",
+"        .       ",
+"   ...          ",
+"           ...  ",
+" ...            ",
+"               .",
+".. . . ...  ....",
+".              .",
+"................",
+"..... ....... ..",
+"........ .......",
+". .......... ...",
+".....  .  ......",
+".... .. .. .. ..",
+".... . . . .....",
+"..... . . ......",
+". .. . . . .. ..",
+".... .. .. .....",
+"... .  .  ......",
+"........... ....",
+"................",
+".. ..... ... ...",
+"...... .........",
+"................",
+"..  . ..  ......",
+"... .... ... .. ",
+"... .   .   .  .",
+"..   ..    .  ..",
+". . ..  .   ..  ",
+"  . . . . .   ..",
+". ..  . ....... ",
+" ... ... .... ..",
+"    .  ..   ..  ",
+"..   .. . . ... ",
+"......  ... .. .",
+"....  ... . ... ",
+". ....... ....  ",
+" ... .. .... ...",
+"..    ...  .. ..",
+".... .......  ..",
+"... ... ........",
+" . .  ..... .. .",
+".  ...  .. .....",
+". ..  ....  . . ",
+" .. ... . ..... ",
+". .. ....... .. ",
+"....... .  .... ",
+". ... .. ...  ..",
+". . .  ........ ",
+". . . ... . . ..",
+"..  ..  .. .....",
+".... .. ..... ..",
+". ... . ... ... ",
+"  .. ..  ... ...",
+"... .. ..   ....",
+"..... ... ... ..",
+".. ........ ....",
+"....  ..  ... ..",
+"..  ... ..  .  .",
+"   .. .. ..   ..",
+"... ..... . . ..",
+". ..  .  .. . . ",
+".   . ...   ..  ",
+"  . . .   .   . ",
+".....  ..   .  .",
+"  .  ..  ..   . ",
+". . ..  .  .. ..",
+"  .. ... ..   . ",
+".. ..   .   ..  ",
+"....  ..  ..  ..",
+"..  ..  ..  .  .",
+"..... . . . ....",
+"................",
+".. .......... ..",
+"........ . .  . ",
+"... .......  ...",
+".   ... ..    ..",
+".  ...  .  . .. ",
+".. ...  .    ...",
+".    . . .  . . ",
+".. . .    .  . .",
+".. .      .. . .",
+"    .    .  .   ",
+".. .. .  .. . . ",
+".. .    ..  ... ",
+".   .  ..... . .",
+". ..  ......  ..",
+".. .. .. .......",
+"................",
+" ..... . .... ..",
+" .... .. . .. ..",
+"   ..    .. ....",
+".   . ..  ..  ..",
+".  .     . ..  .",
+"     . .   .    ",
+"  .  . .  .  .  ",
+"  ..    .     . ",
+"   ...   .  .   ",
+"  . ... .. .... ",
+"  . .... .  . . ",
+" .. .. . .......",
+"..... .. . .....",
+". ... . ... ....",
+"...... ... .....",
+" ...............",
+".. ....... .....",
+".. .............",
+". . ... ... ... ",
+" .  ....  . ..  ",
+"   . .        . ",
+"..     .  .  .  ",
+"          .    .",
+"     . .    .   ",
+". ...  .   ..  .",
+"  .  ...  .     ",
+" ... . . .. .   ",
+".. ...... . .  .",
+".... .... ..  ..",
+" ........... ...",
+".. ......... ...",
+"........... ....",
+"... ............",
+" ..... ..... ...",
+" .... .. ...  ..",
+".. ..  ..  ..  .",
+"..  .. ..  .. . ",
+"..  .. ..   .. .",
+" .         . .  ",
+"         . . .  ",
+"  .    . .      ",
+" . .     . . . .",
+" . . .  .. . ...",
+"   . ...... .  .",
+".  ... . .. .. .",
+" ..... ... .....",
+" .... ..........",
+".... ...........",
+"..  ............",
+".. ..... . .....",
+".   ...... .....",
+" .   .. ..  ..  ",
+".. . ..  .  ... ",
+" ..  ..      .. ",
+".    . .  .   . ",
+".... . .  .  . .",
+".. .  .   .. . .",
+"  ..  .  .... . ",
+". .....  . .  . ",
+".  . .. ..  ... ",
+".   . . .. .. . ",
+". .... ...... ..",
+"..... ........ .",
+"................",
+" ..... ...... ..",
+" ...  ... ... ..",
+".   . ..........",
+".    . .. ......",
+"   .   ..  .... ",
+".    . .   . .. ",
+"     . .   . .. ",
+"  .       .   . ",
+"  ... .     .   ",
+"  . ... .. .... ",
+"  . .. .  ..  . ",
+" .. . .. .... . ",
+" .... .. ..... .",
+"  ... ... ... ..",
+".. ... .........",
+" ...............",
+".......... .... ",
+"....... ...... .",
+".... ...... ....",
+" ..  ... .. ... ",
+"...  ..  ..  .  ",
+"...       .  .  ",
+" .. .  .. . . ..",
+"    . ..    . . ",
+". .....    ..   ",
+"   . . .  ..    ",
+" ... ........ . ",
+". . .... .. . ..",
+" ...  ... . . ..",
+" ... ... .......",
+"........ .......",
+"........... ....",
+"... ............",
+"............ ...",
+" .... ..... ... ",
+".. ... ...  ....",
+"... .. ..  ... .",
+"... .  ..   . ..",
+" .   . . ...   .",
+"       . . .    ",
+"  ..   . . .    ",
+" ...     . . . .",
+" . . .  .... . .",
+".. . .... . ... ",
+".....  ..  .....",
+".. ...... ......",
+" ...... ...... .",
+"                ",
+"                ",
+"    ..      ..  ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+"    ..      ..  ",
+"   ..      ..   ",
+"                ",
+"                ",
+"    . . . . .   ",
+"     . . . .    ",
+"   .. . . . ..  ",
+"  .. . ... . .  ",
+"  . . . . . .   ",
+"     . ... .    ",
+"    . . . . .   ",
+"     . . . .    ",
+"    . . . . .   ",
+"     . . . .    ",
+"   .. . . . ..  ",
+"  .. . ... . .  ",
+"  . . . . . .   ",
+"     . ... .    ",
+"    . . . . .   ",
+"     . . . .    ",
+"................",
+"................",
+"                ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+"                ",
+"                ",
+"................",
+"................",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . .  .",
+"..   . . . . .  ",
+"..  . . . . . . ",
+"...  . . . . . .",
+"...   . . . . . ",
+"...  . . ... . .",
+"....  . . ... . ",
+"....   . . . . .",
+".....   . . . . ",
+"......   . . . .",
+".......   . . . ",
+"........     . .",
+"..........      ",
+".............   ",
+"................",
+"................",
+"................",
+"................",
+".............   ",
+"..........   . .",
+"........  . . . ",
+".......  . . . .",
+"......  . . . . ",
+".....  . . . . .",
+"....  . . . . . ",
+"...  . . ... . .",
+"...   . ... . . ",
+"...  . . . . . .",
+"..  . . . . . . ",
+"..   . . . . .  ",
+"..  . . . . .  .",
+"..   . . . .  ..",
+"................",
+"................",
+"    ............",
+" . .   .........",
+". . . .  .......",
+" . . . .  ......",
+". . . . .  .....",
+" . . . . .  ....",
+". . ... . . ....",
+" . . ... . . ...",
+". . . . . .  ...",
+" . . . . . . ...",
+"  . . . . . . ..",
+"   . . . . .  ..",
+".   . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+".  . . . . .  ..",
+"  . . . . . . ..",
+" . . . . . . ...",
+". . . ... .  ...",
+" . . ... . . ...",
+". . . . . . ....",
+" . . . . .  ....",
+". . . . .  .....",
+" . . . .  ......",
+". . . .  .......",
+" . .    ........",
+"       .........",
+"    ............",
+"................",
+"................",
+"..  . . . . . ..",
+"..   ... ...  ..",
+"    . . . . .   ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+"                ",
+"                ",
+"................",
+"................",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . .   ",
+"..   . ... . . .",
+"..  . . . . . . ",
+"..   . ... . ...",
+"..  . . . . . . ",
+"..   . . . . . .",
+"..  . . . . . . ",
+"..   . . . . ...",
+"..  . . . . . . ",
+"..   . ... . . .",
+"..  . . . . .   ",
+"..   . ... .    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"................",
+"................",
+"                ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+"    . . . . .   ",
+"     ... ...    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"    . . . . . ..",
+" . . . ... .  ..",
+". . . . . . . ..",
+" ... . ... .  ..",
+". . . . . . . ..",
+" . . . . . .  ..",
+". . . . . . . ..",
+" ... . . . .  ..",
+". . . . . . . ..",
+" . . . ... .  ..",
+"    . . . . . ..",
+"     . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   .......  ..",
+"    . . . . .   ",
+" . . . . . . . .",
+". . . . . . . . ",
+" ... . . . . ...",
+". . . .   . . . ",
+" ... .  .  . ...",
+". . . .   . . . ",
+" ... . . . . ...",
+". . . . . . . . ",
+" . . . . . . . .",
+"    . . . . .   ",
+"     .......    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"........ .. ....",
+"........ .. ....",
+"                ",
+" . . . . .   . .",
+". . . .   . . . ",
+" . . . . .   . .",
+". . . .   . . . ",
+" ..... . .. .. .",
+". . . .   . . . ",
+" . . . . .   . .",
+". . . .   . . . ",
+" . . . . .   . .",
+"                ",
+"                ",
+"........ .. ....",
+"........ .. ....",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"                ",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"                ",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"                ",
+"                ",
+"                ",
+"         . .    ",
+"                ",
+"                ",
+"  . .           ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"      . .       ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"    ..      ..  ",
+"     . . . . . .",
+".     . . . . . ",
+"     . . . . . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . . . . .     .",
+". . . . .     . ",
+" . . . . .     .",
+"    ..      ..  ",
+"   ..      ..   ",
+"                ",
+"                ",
+"    . . .       ",
+"     . . .      ",
+"   .. . .    .  ",
+"  .. . ...   .  ",
+"  . . . . . .   ",
+"     . ... .    ",
+"    . . . . .   ",
+"     . . . .    ",
+"    . . . . .   ",
+"       . . .    ",
+"   .    . . ..  ",
+"  ..   ... . .  ",
+"  .     . . .   ",
+"     . ... .    ",
+"    . . . . .   ",
+"     . . . .    ",
+"................",
+"................",
+"                ",
+"     . . . . . .",
+".     . . . . . ",
+"     . . . . . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . . . . .     .",
+". . . . .     . ",
+" . . . . .     .",
+"                ",
+"                ",
+"................",
+"................",
+"..  . . .     ..",
+"..   . . .    ..",
+"..  . . .     ..",
+"..   . ...    ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..     . . .  ..",
+"..      . . . ..",
+"..     ... .  ..",
+"..      . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . .      .",
+"..   . . .   .  ",
+"..  . . .     . ",
+"...  . . .   . .",
+"...   . . . . . ",
+"...  . . ... . .",
+"....  . . ... . ",
+"....   . .   . .",
+".....   .     . ",
+"......   .     .",
+".......   .   . ",
+"........     . .",
+"..........      ",
+".............   ",
+"................",
+"................",
+"................",
+"................",
+".............   ",
+"..........   . .",
+"........  . . . ",
+".......  . . . .",
+"......  . . . . ",
+".....  . . . . .",
+"....  . . . . . ",
+"...  .   ...    ",
+"...      ..     ",
+"...      . .    ",
+"..  .   . . . . ",
+"..   . . . . .  ",
+"..  . . . . .  .",
+"..   . . . .  ..",
+"................",
+"................",
+"    ............",
+" . .   .........",
+". .   .  .......",
+" .     .  ......",
+". .     .  .....",
+" . .   . .  ....",
+". . ... . . ....",
+" . . ... . . ...",
+". . . . . .  ...",
+" . .   . . . ...",
+"  .     . . . ..",
+"   .   . . .  ..",
+".       . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+".  . . . . .  ..",
+"  . . . .   . ..",
+"     . .     ...",
+".     ..     ...",
+"     ...   . ...",
+". . . . . . ....",
+" . . . . .  ....",
+". . . . .  .....",
+" . . . .  ......",
+". . . .  .......",
+" . .    ........",
+"       .........",
+"    ............",
+"................",
+"................",
+"..  . . . . . ..",
+"..   ... ...  ..",
+"    . . . . .   ",
+"     . . . . . .",
+".     . . . . . ",
+"     . . . . . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . . . . .     .",
+". . . . .     . ",
+" . . . . .     .",
+"                ",
+"                ",
+"................",
+"................",
+"..  . . .     ..",
+"..   . . .    ..",
+"..  . . .       ",
+"..   . ...   . .",
+"..  . . . . . . ",
+"..   . ... . ...",
+"..  . . . . . . ",
+"..   . . . . . .",
+"..  . . . . . . ",
+"..     . . . ...",
+"..      . . . . ",
+"..     ... . . .",
+"..      . . .   ",
+"..   . ... .    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"................",
+"................",
+"                ",
+"     . . . . . .",
+".     . . . . . ",
+"     . . . . . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . . . . .     .",
+". . . . .     . ",
+" . . . . .     .",
+"    . . . . .   ",
+"     ... ...    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . .     ..",
+"..   . . .    ..",
+"    . . .     ..",
+" . . . ...    ..",
+". . . . . . . ..",
+" ... . ... .  ..",
+". . . . . . . ..",
+" . . . . . .  ..",
+". . . . . . . ..",
+" ...   . . .  ..",
+". .     . . . ..",
+" . .   ... .  ..",
+"        . . . ..",
+"     . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . .     ..",
+"..   .....    ..",
+"    . . .       ",
+"     . . .   . .",
+".     . . . . . ",
+"     . . . . ...",
+". . . .   . . . ",
+" ... .  .  . ...",
+". . . .   . . . ",
+" ... . . . .    ",
+". . . . . .     ",
+" . .   . . .    ",
+"        . . .   ",
+"       .....    ",
+"..      . . . ..",
+"..   . . . .  ..",
+"........ .. ....",
+"........ .. ....",
+"                ",
+"     . . .   . .",
+".     .   . . . ",
+"     . . .   . .",
+". . . .   . . . ",
+" ..... . .. .. .",
+". . . .   . . . ",
+" . . . . .     .",
+". . . .       . ",
+" . . . . .     .",
+"                ",
+"                ",
+"........ .. ....",
+"........ .. ....",
+"..  . . .     ..",
+"..   . . .    ..",
+"..  . . .     ..",
+"..   . ...    ..",
+"..  . . . . . ..",
+"                ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"                ",
+"..     . . .  ..",
+"..      . . . ..",
+"..     ... .  ..",
+"..      . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"                ",
+"                ",
+"                ",
+"         . .    ",
+"                ",
+"                ",
+"  . .           ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"      . .       ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"    ..      ..  ",
+" . .     . . . .",
+". . .     . . . ",
+" . .     . . . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . . .     . . .",
+". . .     . . . ",
+" . . .     . . .",
+"    ..      ..  ",
+"   ..      ..   ",
+"                ",
+"                ",
+"    . . . . .   ",
+"     . . . .    ",
+"   .. . . . ..  ",
+"  .. . ... . .  ",
+"  . . . .       ",
+"       ...      ",
+"        .       ",
+"       . .      ",
+"        . . .   ",
+"     . . . .    ",
+"   .. . . . ..  ",
+"  .. . ... . .  ",
+"  . . . . . .   ",
+"     . ... .    ",
+"    . . . . .   ",
+"     . . . .    ",
+"................",
+"................",
+"                ",
+" . .     . . . .",
+". . .     . . . ",
+" . .     . . . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . . .     . . .",
+". . .     . . . ",
+" . . .     . . .",
+"                ",
+"                ",
+"................",
+"................",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . .     ..",
+"..     ...    ..",
+"..      .     ..",
+"..     . .    ..",
+"..      . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . .  .",
+"..   . . . . .  ",
+"..  . . . .   . ",
+"...  . . .     .",
+"...   . . .     ",
+"...  . . ...   .",
+"....  .   ... . ",
+"....       . . .",
+".....       . . ",
+"......     . . .",
+".......   . . . ",
+"........     . .",
+"..........      ",
+".............   ",
+"................",
+"................",
+"................",
+"................",
+".............   ",
+"..........   . .",
+"........  . . . ",
+".......  . . . .",
+"......    . . . ",
+".....      . . .",
+"....      . . . ",
+"...  .   ... . .",
+"...   . ...   . ",
+"...  . . .     .",
+"..  . . .     . ",
+"..   . . .   .  ",
+"..  . . . . .  .",
+"..   . . . .  ..",
+"................",
+"................",
+"    ............",
+" . .   .........",
+". . . .  .......",
+" . . .    ......",
+". . .      .....",
+" . . .      ....",
+". . ...   . ....",
+" .   ... . . ...",
+".     . . .  ...",
+" .     . . . ...",
+"  .   . . . . ..",
+"   . . . . .  ..",
+".   . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+".  .   . . .  ..",
+"  .     . . . ..",
+" .     . . . ...",
+". .   ... .  ...",
+" . . ...   . ...",
+". . . .     ....",
+" . . .      ....",
+". . . .    .....",
+" . . . .  ......",
+". . . .  .......",
+" . .    ........",
+"       .........",
+"    ............",
+"................",
+"................",
+"..  . . . . . ..",
+"..   ... ...  ..",
+"    . . . . .   ",
+" . .     . . . .",
+". . .     . . . ",
+" . .     . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . .     . . .",
+". . .     . . . ",
+" . . .     . . .",
+"                ",
+"                ",
+"................",
+"................",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . .   ",
+"..   . ... . . .",
+"..  . . .     . ",
+"..     ...   ...",
+"..      .     . ",
+"..     . .   . .",
+"..      . . . . ",
+"..   . . . . ...",
+"..  . . . . . . ",
+"..   . ... . . .",
+"..  . . . . .   ",
+"..   . ... .    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"................",
+"................",
+"                ",
+" . .     . . . .",
+". . .     . . . ",
+" . .     . . . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . . .     . . .",
+". . .     . . . ",
+" . . .     . . .",
+"    . . . . .   ",
+"     ... ...    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"    . . . . . ..",
+" . . . ... .  ..",
+". . . . .     ..",
+" ...   ...    ..",
+". .     .     ..",
+" . .   . .    ..",
+". .     . . . ..",
+" ... . . . .  ..",
+". . . . . . . ..",
+" . . . ... .  ..",
+"    . . . . . ..",
+"     . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..    .... .  ..",
+"        .       ",
+" .     . .   . .",
+". .   . .     . ",
+" ... . . .   ...",
+". . . .   . . . ",
+" ... .  .  . ...",
+". .   .   . . . ",
+" ..    . . .    ",
+". .     . .     ",
+" . .   . . .    ",
+"    . . . . .   ",
+"     .......    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"........ .. ....",
+"........ .. ....",
+"                ",
+" . .     .   . .",
+". . .     . . . ",
+" . .     .   . .",
+". . . .   . . . ",
+" ..... . .. .. .",
+". . . .   . . . ",
+" . . .       . .",
+". . .     . . . ",
+" . . .       . .",
+"                ",
+"                ",
+"........ .. ....",
+"........ .. ....",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . .     ..",
+"                ",
+"..      .     ..",
+"..     . .    ..",
+"                ",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"    ..      ..  ",
+" . . . .     . .",
+". . . . .     . ",
+" . . . .     . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" .     . . . . .",
+".     . . . . . ",
+" .     . . . . .",
+"    ..      ..  ",
+"   ..      ..   ",
+"                ",
+"                ",
+"    . . . . .   ",
+"       . . .    ",
+"   .    . . ..  ",
+"  ..   ... . .  ",
+"  .     . . .   ",
+"     . ... .    ",
+"    . . . . .   ",
+"     . . . .    ",
+"    . . .       ",
+"     . . .      ",
+"   .. . .    .  ",
+"  .. . ...   .  ",
+"  . . . . . .   ",
+"     . ... .    ",
+"    . . . . .   ",
+"       . .      ",
+"................",
+"................",
+"                ",
+" . . . .     . .",
+". . . . .     . ",
+" . . . .     . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" .     . . . . .",
+".     . . . . . ",
+" .     . . . . .",
+"                ",
+"                ",
+"................",
+"................",
+"..  . . . . . ..",
+"..     . . .  ..",
+"..      . . . ..",
+"..     ... .  ..",
+"..      . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . .     ..",
+"..   . . .    ..",
+"..  . . .     ..",
+"..   . ...    ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..     . .    ..",
+"..  . . . . .  .",
+"..   . . . . .  ",
+"..  .   . . . . ",
+"...      . .   .",
+"...     . .     ",
+"...      ...    ",
+"....    . ...   ",
+"....   . . . . .",
+".....   . . . . ",
+"......   . . . .",
+".......   . . . ",
+"........     . .",
+"..........      ",
+".............   ",
+"................",
+"................",
+"................",
+"................",
+".............   ",
+"..........   . .",
+"........      . ",
+".......        .",
+"......  .     . ",
+".....  . . . . .",
+"....  . . . . . ",
+"...  . . ... . .",
+"...   . ... . . ",
+"...  . . .   . .",
+"..  . . .     . ",
+"..   . .     .  ",
+"..  . . .   .  .",
+"..   . . . .  ..",
+"................",
+"................",
+"    ............",
+" . .   .........",
+". . . .  .......",
+" . . . .  ......",
+". . . . .  .....",
+" . . . . .  ....",
+".   ... .   ....",
+"     ...     ...",
+".     . .    ...",
+" .   . .     ...",
+"  . . . .   . ..",
+"   . . . . .  ..",
+".   . . . . . ..",
+"..   . . . .  ..",
+"..  .   . . . ..",
+".  .     . .  ..",
+"  .     . . . ..",
+" . .   . . . ...",
+". . . ... .  ...",
+" . . ... . . ...",
+". . . . . . ....",
+" . . . . .  ....",
+". .     .  .....",
+" .        ......",
+". .      .......",
+" . .    ........",
+"       .........",
+"    ............",
+"................",
+"................",
+"..  . . . . . ..",
+"..   ... ...  ..",
+"    . . . . .   ",
+" . . . .     . .",
+". . . . .     . ",
+" . . . .     . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" .     . . . . .",
+".     . . . . . ",
+" .     . . . . .",
+"                ",
+"                ",
+"................",
+"................",
+"..  . . . . . ..",
+"..     . . .  ..",
+"..      . . .   ",
+"..     ... . . .",
+"..      . . . . ",
+"..   . ... . ...",
+"..  . . . . . . ",
+"..   . . . . . .",
+"..  . . .     . ",
+"..   . . .   ...",
+"..  . . .     . ",
+"..   . ...   . .",
+"..  . . . . .   ",
+"..   . ... .    ",
+"..  . . . . . ..",
+"..     . .    ..",
+"................",
+"................",
+"                ",
+" . . . .     . .",
+". . . . .     . ",
+" . . . .     . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" .     . . . . .",
+".     . . . . . ",
+" .     . . . . .",
+"    . . . . .   ",
+"     ... ...    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..     . . .  ..",
+"        . . . ..",
+" . .   ... .  ..",
+". .     . . . ..",
+" ... . ... .  ..",
+". . . . . . . ..",
+" . . . . . .  ..",
+". . . . .     ..",
+" ... . . .    ..",
+". . . . .     ..",
+" . . . ...    ..",
+"    . . . . . ..",
+"     . ... .  ..",
+"..  . . . . . ..",
+"..     . .    ..",
+"..      . . . ..",
+"..     .....  ..",
+"        . .     ",
+" . . . . .     .",
+". . . . . .     ",
+" ... . . . .   .",
+". . . .   . . . ",
+" ... .  .  . ...",
+". . . .   . . . ",
+"     . . .   ...",
+"    . . .     . ",
+"     . .     . .",
+"    . . .   .   ",
+"     ..... .    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"........ .. ....",
+"........ .. ....",
+"                ",
+" . . . .     . .",
+". . . .       . ",
+" . . . .     . .",
+". . . .   . . . ",
+" ..... . .. .. .",
+". . . .   . . . ",
+" .     . .   . .",
+".     .   . . . ",
+" .     . .   . .",
+"                ",
+"                ",
+"........ .. ....",
+"........ .. ....",
+"..  . . . . . ..",
+"..     . . .  ..",
+"..      . . . ..",
+"..     ... .  ..",
+"..      . . . ..",
+"                ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"                ",
+"..   . . .    ..",
+"..  . . .     ..",
+"..   . ...    ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..     . .    ..",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"    ..      ..  ",
+" . . . . . .    ",
+"  . . . . . .   ",
+" . . . . . .    ",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+"   . . . . . .  ",
+"  . . . . . .   ",
+"   . . . . . .  ",
+"    ..      ..  ",
+"   ..      ..   ",
+"                ",
+"                ",
+"        . . .   ",
+"     . . . .    ",
+"   .. . . . ..  ",
+"  .. . ... . .  ",
+"  . . . . . .   ",
+"     . ... .    ",
+"    . . . . .   ",
+"     . . . .    ",
+"    . . . . .   ",
+"     . . . .    ",
+"   .. . . . ..  ",
+"  .. . ... . .  ",
+"  . . . .       ",
+"       ...      ",
+"        .       ",
+"       . .      ",
+"................",
+"................",
+"                ",
+" . . . . . .    ",
+"  . . . . . .   ",
+" . . . . . .    ",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+"   . . . . . .  ",
+"  . . . . . .   ",
+"   . . . . . .  ",
+"                ",
+"                ",
+"................",
+"................",
+"..      . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . .     ..",
+"..     ...    ..",
+"..      .     ..",
+"..     . .    ..",
+"..      . . .  .",
+"..   . . . . .  ",
+"..  . . . . . . ",
+"...  . . . .    ",
+"...   . . . .   ",
+"...  . . ...    ",
+"....  . . ... . ",
+"....   . . . . .",
+".....   . . . . ",
+"......   . . .  ",
+".......   . .   ",
+"........     .  ",
+"..........      ",
+".............   ",
+"................",
+"................",
+"................",
+"................",
+".............   ",
+"..........      ",
+"........  . .   ",
+".......  . .    ",
+"......  . . . . ",
+".....  . . . . .",
+"....  . . . . . ",
+"...  . . ... .  ",
+"...   . ... .   ",
+"...  . . . . .  ",
+"..  . . .     . ",
+"..     . .   .  ",
+"..      .      .",
+"..     . .    ..",
+"................",
+"................",
+"    ............",
+" . .   .........",
+"  . . .  .......",
+" . . . .  ......",
+". . . . .  .....",
+" . . . . .  ....",
+". . ... . . ....",
+"   . ... . . ...",
+"    . . . .  ...",
+"   . . . . . ...",
+"  . . . .     ..",
+"   .   . .    ..",
+".       .     ..",
+"..       .    ..",
+"..      . . . ..",
+".  . . . . .  ..",
+"  . . . . . . ..",
+" . . . . . . ...",
+"  . . ... .  ...",
+" . . ... . . ...",
+". . . . . . ....",
+" . . . . .  ....",
+". . . . .  .....",
+"   . . .  ......",
+"  . . .  .......",
+"   .    ........",
+"       .........",
+"    ............",
+"................",
+"................",
+"..  . . . . . ..",
+"..   ... ...  ..",
+"    . . . . .   ",
+" . . . . . .    ",
+"  . . . . . .   ",
+" . . . . . .    ",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+"   . . . . . .  ",
+"  . . . . . .   ",
+"   . . . . . .  ",
+"                ",
+"                ",
+"................",
+"................",
+"..      . . . ..",
+"..   . . . .  ..",
+"..  . . . . .   ",
+"..   . ... . . .",
+"..  . . . . . . ",
+"..   . ... . ...",
+"..  . . . . . . ",
+"..   . . . . . .",
+"..  . . . . . . ",
+"..   . . . . ...",
+"..  . . . . . . ",
+"..   . ... . . .",
+"..  . . .       ",
+"..     ...      ",
+"..      .     ..",
+"..     . .    ..",
+"................",
+"................",
+"                ",
+" . . . . . .    ",
+"  . . . . . .   ",
+" . . . . . .    ",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+"   . . . . . .  ",
+"  . . . . . .   ",
+"   . . . . . .  ",
+"    . . . . .   ",
+"     ... ...    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..      . . . ..",
+"..   . . . .  ..",
+"    . . . . . ..",
+" . . . ... .  ..",
+". . . . . . . ..",
+" ... . ... .  ..",
+". . . . . . . ..",
+" . . . . . .  ..",
+". . . . . . . ..",
+" ... . . . .  ..",
+". . . . . . . ..",
+" . . . ... .  ..",
+"    . . .     ..",
+"       ...    ..",
+"..      .     ..",
+"..     . .    ..",
+"..      . . . ..",
+"..   . .....  ..",
+"    . . . . .   ",
+" . . . . . .    ",
+"  . . . . . .   ",
+" ... . . . .    ",
+". . . .   . . . ",
+" ... .  .  . ...",
+". . . .   . . . ",
+"   . . . . . .  ",
+"  . . . . . .   ",
+"   . . . . . .  ",
+"    . . .       ",
+"       ...      ",
+"..      .     ..",
+"..     . .    ..",
+"........ .. ....",
+"........ .. ....",
+"                ",
+" . . . . .      ",
+"  . . .   . .   ",
+" . . . . .      ",
+". . . .   . . . ",
+" ..... . .. .. .",
+". . . .   . . . ",
+"   . . . .   .  ",
+"  . . .   . .   ",
+"   . . . .   .  ",
+"                ",
+"                ",
+"........ .. ....",
+"........ .. ....",
+"..      . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"                ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"                ",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . .     ..",
+"..     ...    ..",
+"..      .     ..",
+"..     . .    ..",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"    ..      ..  ",
+"     . .     . .",
+".     . .     . ",
+"     . .     . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" .     . .     .",
+".     . .     . ",
+" .     . .     .",
+"    ..      ..  ",
+"   ..      ..   ",
+"                ",
+"                ",
+"    . . .       ",
+"       . .      ",
+"   .    .    .  ",
+"  ..   ...   .  ",
+"  .     . . .   ",
+"     . ... .    ",
+"    . . . . .   ",
+"     . . . .    ",
+"    . . .       ",
+"       . .      ",
+"   .    .    .  ",
+"  ..   ...   .  ",
+"  .     . . .   ",
+"     . ... .    ",
+"    . . . . .   ",
+"     . . . .    ",
+"................",
+"................",
+"                ",
+"     . .     . .",
+".     . .     . ",
+"     . .     . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" .     . .     .",
+".     . .     . ",
+" .     . .     .",
+"                ",
+"                ",
+"................",
+"................",
+"..  . . .     ..",
+"..     . .    ..",
+"..      .     ..",
+"..     ...    ..",
+"..      . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . .     ..",
+"..     . .    ..",
+"..      .     ..",
+"..     ...    ..",
+"..      . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . .    .",
+"..     . .      ",
+"..      . .     ",
+"...    . . .   .",
+"...     . . . . ",
+"...  . . ... . .",
+"....  .   ... . ",
+"....       . . .",
+".....       . . ",
+"......     .    ",
+".......   .     ",
+"........        ",
+"..........      ",
+".............   ",
+"................",
+"................",
+"................",
+"................",
+".............   ",
+"..........   . .",
+"........  . . . ",
+".......    . . .",
+"......      . . ",
+".....      . . .",
+"....  .   . . . ",
+"...  . . ... . .",
+"...   . ... .   ",
+"...    . . .    ",
+"..      . .     ",
+"..     . . .    ",
+"..      . . .  .",
+"..   . . . .  ..",
+"................",
+"................",
+"    ............",
+"       .........",
+".     .  .......",
+"     . .  ......",
+". . . .    .....",
+" . . .      ....",
+". . ...     ....",
+" .   ...   . ...",
+".     . . .  ...",
+" .     . . . ...",
+"  .   . . . . ..",
+"   . . . . .  ..",
+".   . . . . . ..",
+"..   . . . .  ..",
+"..  . . .     ..",
+".    . . .    ..",
+"      . .     ..",
+"     . . .   ...",
+".   . ... .  ...",
+" . . ... . . ...",
+". . . . . . ....",
+" . . .   .  ....",
+". . .      .....",
+" . .      ......",
+". . .    .......",
+" . .    ........",
+"       .........",
+"    ............",
+"................",
+"................",
+"..  . . . . . ..",
+"..   ... ...  ..",
+"    . . . . .   ",
+"     . .     . .",
+".     . .     . ",
+"     . .     . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" .     . .     .",
+".     . .     . ",
+" .     . .     .",
+"                ",
+"                ",
+"................",
+"................",
+"..  . . .     ..",
+"..     . .    ..",
+"..      .       ",
+"..     ...   . .",
+"..      . . . . ",
+"..   . ... . ...",
+"..  . . . . . . ",
+"..   . . . . . .",
+"..  . . .     . ",
+"..     . .   ...",
+"..      .     . ",
+"..     ...   . .",
+"..      . . .   ",
+"..   . ... .    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"................",
+"................",
+"                ",
+"     . .     . .",
+".     . .     . ",
+"     . .     . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" .     . .     .",
+".     . .     . ",
+" .     . .     .",
+"    . . . . .   ",
+"     ... ...    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . .     ..",
+"..     . .    ..",
+"        .     ..",
+" .     ...    ..",
+". .     . . . ..",
+" ... . ... .  ..",
+". . . . . . . ..",
+" . . . . . .  ..",
+". . . . .     ..",
+" ...   . .    ..",
+". .     .     ..",
+" . .   ...    ..",
+"        . . . ..",
+"     . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   .......  ..",
+"    . . . . .   ",
+"     . .     . .",
+".     . .     . ",
+"     . .     ...",
+". . . .   . . . ",
+" ... .  .  . ...",
+". . . .   . . . ",
+" .     . .     .",
+".     . .     . ",
+" .     . .     .",
+"    . . . . .   ",
+"     .......    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"........ .. ....",
+"........ .. ....",
+"                ",
+"     . .     . .",
+".     .       . ",
+"     . .     . .",
+". . . .   . . . ",
+" ..... . .. .. .",
+". . . .   . . . ",
+" .     . .     .",
+".     .       . ",
+" .     . .     .",
+"                ",
+"                ",
+"........ .. ....",
+"........ .. ....",
+"..  . . .     ..",
+"..     . .    ..",
+"..      .     ..",
+"..     ...    ..",
+"..      . . . ..",
+"                ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"                ",
+"..     . .    ..",
+"..      .     ..",
+"..     ...    ..",
+"..      . . . ..",
+"..   . ... .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"    ..      ..  ",
+" .     . .     .",
+". .     . .     ",
+" .     . .     .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+"     . .     . .",
+"    . .     . . ",
+"     . .     . .",
+"    ..      ..  ",
+"   ..      ..   ",
+"                ",
+"                ",
+"        . . .   ",
+"       . . .    ",
+"   .    .    .  ",
+"  .. . ...   .  ",
+"  . . . .       ",
+"     . ...      ",
+"    . . . . .   ",
+"       . . .    ",
+"        . . .   ",
+"       . . .    ",
+"   .    .    .  ",
+"  .. . ...   .  ",
+"  . . . .       ",
+"     . ...      ",
+"    . . . . .   ",
+"       . . .    ",
+"................",
+"................",
+"                ",
+" .     . .     .",
+". .     . .     ",
+" .     . .     .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+"     . .     . .",
+"    . .     . . ",
+"     . .     . .",
+"                ",
+"                ",
+"................",
+"................",
+"..      . . . ..",
+"..     . . .  ..",
+"..      .     ..",
+"..   . ...    ..",
+"..  . . .     ..",
+"..   . ...    ..",
+"..  . . . . . ..",
+"..     . . .  ..",
+"..      . . . ..",
+"..     . . .  ..",
+"..      .     ..",
+"..   . ...    ..",
+"..  . . .     ..",
+"..   . ...    ..",
+"..  . . . . . ..",
+"..     . . .  ..",
+"..      . . .  .",
+"..     . . .    ",
+"..      . .     ",
+"...  . . . .    ",
+"...     . . .   ",
+"...      ... . .",
+"....      ... . ",
+"....     .   . .",
+".....   .     . ",
+"......   .     .",
+".......   .   . ",
+"........     . .",
+"..........      ",
+".............   ",
+"................",
+"................",
+"................",
+"................",
+".............   ",
+"..........   . .",
+"........      . ",
+".......      . .",
+"......  .   . . ",
+".....  . . . . .",
+"....    . . . . ",
+"...      ... . .",
+"...     ... . . ",
+"...    . . .   .",
+"..  . . . .     ",
+"..   . . .      ",
+"..  . . . .    .",
+"..     . . .  ..",
+"................",
+"................",
+"    ............",
+" .     .........",
+". .      .......",
+" .     .  ......",
+". . . . .  .....",
+" . . . .    ....",
+". . ...     ....",
+"     ...     ...",
+"    . . .    ...",
+"     . . . . ...",
+"  . . . . . . ..",
+"   . . . . .  ..",
+".   . . . . . ..",
+"..     . . .  ..",
+"..      . . . ..",
+".      . .    ..",
+"  .   . .     ..",
+" . . . . .   ...",
+". . . ...    ...",
+" . . ... .   ...",
+". . . . . . ....",
+" . . . . .  ....",
+". .   . .  .....",
+" .     .  ......",
+".        .......",
+" .      ........",
+"       .........",
+"    ............",
+"................",
+"................",
+"..  . . . . . ..",
+"..   ... ...  ..",
+"    . . . . .   ",
+" .     . .     .",
+". .     . .     ",
+" .     . .     .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+"     . .     . .",
+"    . .     . . ",
+"     . .     . .",
+"                ",
+"                ",
+"................",
+"................",
+"..      . . . ..",
+"..     . . .  ..",
+"..      .       ",
+"..   . ...   . .",
+"..  . . .     . ",
+"..   . ...   ...",
+"..  . . . . . . ",
+"..     . . . . .",
+"..      . . . . ",
+"..     . . . ...",
+"..      .     . ",
+"..   . ...   . .",
+"..  . . .       ",
+"..   . ...      ",
+"..  . . . . . ..",
+"..     . . .  ..",
+"................",
+"................",
+"                ",
+" .     . .     .",
+". .     . .     ",
+" .     . .     .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+"     . .     . .",
+"    . .     . . ",
+"     . .     . .",
+"    . . . . .   ",
+"     ... ...    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..      . . . ..",
+"..     . . .  ..",
+"        .     ..",
+" . . . ...    ..",
+". . . . .     ..",
+" ... . ...    ..",
+". . . . . . . ..",
+" . .   . . .  ..",
+". .     . . . ..",
+" ...   . . .  ..",
+". .     .     ..",
+" . . . ...    ..",
+"    . . .     ..",
+"     . ...    ..",
+"..  . . . . . ..",
+"..     . . .  ..",
+"..  . . . . . ..",
+"..   .......  ..",
+"    . . . . .   ",
+" . .     . .    ",
+"  . .     . .   ",
+" ...     . .    ",
+". . . .   . . . ",
+" ... .  .  . ...",
+". . . .   . . . ",
+"   . .     . .  ",
+"  . .     . .   ",
+"   . .     . .  ",
+"    . . . . .   ",
+"     .......    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"........ .. ....",
+"........ .. ....",
+"                ",
+" .     . .     .",
+". .       .     ",
+" .     . .     .",
+". . . .   . . . ",
+" ..... . .. .. .",
+". . . .   . . . ",
+"     . .     . .",
+"    . .     . . ",
+"     . .     . .",
+"                ",
+"                ",
+"........ .. ....",
+"........ .. ....",
+"..      . . . ..",
+"..     . . .  ..",
+"..      .     ..",
+"..   . ...    ..",
+"..  . . .     ..",
+"                ",
+"..  . . . . . ..",
+"..     . . .  ..",
+"                ",
+"..     . . .  ..",
+"..      .     ..",
+"..   . ...    ..",
+"..  . . .     ..",
+"..   . ...    ..",
+"..  . . . . . ..",
+"..     . . .  ..",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"    ..      ..  ",
+" . .     . .    ",
+"  . .     . .   ",
+" . .     . .    ",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+"   . .     . .  ",
+"  . .     . .   ",
+"   . .     . .  ",
+"    ..      ..  ",
+"   ..      ..   ",
+"                ",
+"                ",
+"        . . .   ",
+"     . . . .    ",
+"   .. . . . ..  ",
+"  .. . ... . .  ",
+"  . . . .       ",
+"       ...      ",
+"        .       ",
+"       . .      ",
+"        . . .   ",
+"     . . . .    ",
+"   .. . . . ..  ",
+"  .. . ... . .  ",
+"  . . . .       ",
+"       ...      ",
+"        .       ",
+"       . .      ",
+"................",
+"................",
+"                ",
+" . .     . .    ",
+"  . .     . .   ",
+" . .     . .    ",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+"   . .     . .  ",
+"  . .     . .   ",
+"   . .     . .  ",
+"                ",
+"                ",
+"................",
+"................",
+"..      . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . .     ..",
+"..     ...    ..",
+"..      .     ..",
+"..     . .    ..",
+"..      . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . .     ..",
+"..     ...    ..",
+"..      .     ..",
+"..     . .    ..",
+"..      . . .  .",
+"..   . . . . .  ",
+"..  .   . . .   ",
+"...      . .    ",
+"...       . .   ",
+"...  .   ... .  ",
+"....  . .  .. . ",
+"....   .     . .",
+".....         . ",
+"......       .  ",
+".......   . .   ",
+"........     .  ",
+"..........      ",
+".............   ",
+"................",
+"................",
+"................",
+"................",
+".............   ",
+"..........      ",
+"........    .   ",
+".......  . .    ",
+"......    . . . ",
+".....      . . .",
+"....      . . . ",
+"...  .   ... .  ",
+"... . . ... .   ",
+"...  . . . . .  ",
+"..  . . . .   . ",
+"..     . .      ",
+"..      .      .",
+"..     . .    ..",
+"................",
+"................",
+"    ............",
+" . .   .........",
+"  . .    .......",
+" . .      ......",
+". . .      .....",
+" . . .   .  ....",
+". . ... . . ....",
+"   . ... .   ...",
+"  . . . .    ...",
+"   . . . .   ...",
+"  . . . .     ..",
+"   .   . .    ..",
+".       . . . ..",
+"..     . . .  ..",
+"..      . . . ..",
+".  . . . . .  ..",
+"  . . . . . . ..",
+" . . . . . . ...",
+"  . . ...    ...",
+" . . ...     ...",
+". . . .     ....",
+" . . . .    ....",
+". . . . .  .....",
+"   . . .  ......",
+"  . . .  .......",
+"   .    ........",
+"       .........",
+"    ............",
+"................",
+"................",
+"..  . . . . . ..",
+"..   ... ...  ..",
+"    . . . . .   ",
+" . .     . .    ",
+"  . .     . .   ",
+" . .     . .    ",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+"   . .     . .  ",
+"  . .     . .   ",
+"   . .     . .  ",
+"                ",
+"                ",
+"................",
+"................",
+"..      . . . ..",
+"..   . . . .  ..",
+"..  . . . . .   ",
+"..   . ... . . .",
+"..  . . .     . ",
+"..     ...   ...",
+"..      .     . ",
+"..     . .   . .",
+"..      . . . . ",
+"..   . . . . ...",
+"..  . . . . . . ",
+"..   . ... . . .",
+"..  . . .       ",
+"..     ...      ",
+"..      .     ..",
+"..     . .    ..",
+"................",
+"................",
+"                ",
+" . .     . .    ",
+"  . .     . .   ",
+" . .     . .    ",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+"   . .     . .  ",
+"  . .     . .   ",
+"   . .     . .  ",
+"    . . . . .   ",
+"     ... ...    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..      . . . ..",
+"..   . . . .  ..",
+"    . . . . . ..",
+" . . . ... .  ..",
+". . . . .     ..",
+" ...   ...    ..",
+". .     .     ..",
+" . .   . .    ..",
+". .     . . . ..",
+" ... . . . .  ..",
+". . . . . . . ..",
+" . . . ... .  ..",
+"    . . .     ..",
+"       ...    ..",
+"..      .     ..",
+"..     . .    ..",
+"..      . . . ..",
+"..   . .....  ..",
+"    . . . . .   ",
+" . . . . . . . .",
+". . . . .     . ",
+" ...   . .   ...",
+". .           . ",
+" ...    .    ...",
+". .       . . . ",
+" ... . . . . ...",
+". . . . . . . . ",
+" . . . . . . . .",
+"    . . .       ",
+"       ...      ",
+"..      .     ..",
+"..     . .    ..",
+"........ .. ....",
+"........ .. ....",
+"                ",
+" . .     .      ",
+"  . .     . .   ",
+" . .     .      ",
+". . . .   . . . ",
+" ..... . .. .. .",
+". . . .   . . . ",
+"   . .       .  ",
+"  . .     . .   ",
+"   . .       .  ",
+"                ",
+"                ",
+"........ .. ....",
+"........ .. ....",
+"..      . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . .     ..",
+"                ",
+"..      .     ..",
+"..     . .    ..",
+"                ",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . ... .  ..",
+"..  . . .     ..",
+"..     ...    ..",
+"..      .     ..",
+"..     . .    ..",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"    ..      ..  ",
+"   . .     . .  ",
+"    . .     . . ",
+"   . .     . .  ",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . .     . .    ",
+". .     . .     ",
+" . .     . .    ",
+"    ..      ..  ",
+"   ..      ..   ",
+"                ",
+"                ",
+"    . . .       ",
+"     . . .      ",
+"   .. . . . ..  ",
+"  ..   ... . .  ",
+"  .     . . .   ",
+"       ... .    ",
+"        .       ",
+"     . . .      ",
+"    . . .       ",
+"     . . .      ",
+"   .. . . . ..  ",
+"  ..   ... . .  ",
+"  .     . . .   ",
+"       ... .    ",
+"        .       ",
+"     . . .      ",
+"................",
+"................",
+"                ",
+"   . .     . .  ",
+"    . .     . . ",
+"   . .     . .  ",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . .     . .    ",
+". .     . .     ",
+" . .     . .    ",
+"                ",
+"                ",
+"................",
+"................",
+"..  . . .     ..",
+"..   . . .    ..",
+"..  . . . . . ..",
+"..     ... .  ..",
+"..      . . . ..",
+"..     ... .  ..",
+"..      .     ..",
+"..   . . .    ..",
+"..  . . .     ..",
+"..   . . .    ..",
+"..  . . . . . ..",
+"..     ... .  ..",
+"..      . . . ..",
+"..     ... .  ..",
+"..      .     ..",
+"..   . . .    ..",
+"..  . . .      .",
+"..     . .   .  ",
+"..      . . . . ",
+"...      . . .  ",
+"...     . . . . ",
+"...  . . ... .  ",
+"....  .   ... . ",
+"....       . . .",
+".....       . . ",
+"......     .    ",
+".......   .     ",
+"........        ",
+"..........      ",
+".............   ",
+"................",
+"................",
+"................",
+"................",
+".............   ",
+"..........      ",
+"........    . . ",
+".......    . .  ",
+"......      . . ",
+".....      . . .",
+"....  .   . . . ",
+"...  . . ... . .",
+"... . . ... .   ",
+"...    . . .    ",
+"..      . .     ",
+"..     . . .    ",
+"..      .      .",
+"..   . . .    ..",
+"................",
+"................",
+"    ............",
+"   .   .........",
+"    . .  .......",
+"   . .    ......",
+". . .      .....",
+" . . .      ....",
+". . ...   . ....",
+" . . ... . . ...",
+". .   . . .  ...",
+" .     . . . ...",
+"  .     . . . ..",
+"   .   . . .  ..",
+".   . . .     ..",
+"..   . . .    ..",
+"..  . . .     ..",
+".  . . . .    ..",
+"  . . . . . . ..",
+"   . . . . . ...",
+"    . ... .  ...",
+"   . ... . . ...",
+". . . .   . ....",
+" . . .      ....",
+". . .      .....",
+" . . .    ......",
+". . . .  .......",
+" . . .  ........",
+"       .........",
+"    ............",
+"................",
+"................",
+"..  . . . . . ..",
+"..   ... ...  ..",
+"    . . . . .   ",
+"   . .     . .  ",
+"    . .     . . ",
+"   . .     . .  ",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . .     . .    ",
+". .     . .     ",
+" . .     . .    ",
+"                ",
+"                ",
+"................",
+"................",
+"..  . . .     ..",
+"..   . . .    ..",
+"..  . . . . .   ",
+"..     ... . . .",
+"..      . . . . ",
+"..     ... . ...",
+"..      .     . ",
+"..   . . .   . .",
+"..  . . .     . ",
+"..   . . .   ...",
+"..  . . . . . . ",
+"..     ... . . .",
+"..      . . .   ",
+"..     ... .    ",
+"..      .     ..",
+"..   . . .    ..",
+"................",
+"................",
+"                ",
+"   . .     . .  ",
+"    . .     . . ",
+"   . .     . .  ",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . .     . .    ",
+". .     . .     ",
+" . .     . .    ",
+"    . . . . .   ",
+"     ... ...    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . .     ..",
+"..   . . .    ..",
+"    . . . . . ..",
+" . .   ... .  ..",
+". .     . . . ..",
+" ...   ... .  ..",
+". .     .     ..",
+" . . . . .    ..",
+". . . . .     ..",
+" ... . . .    ..",
+". . . . . . . ..",
+" . .   ... .  ..",
+"        . . . ..",
+"       ... .  ..",
+"..      .     ..",
+"..   . . .    ..",
+"..  . . .     ..",
+"..     ...    ..",
+"        .       ",
+" . .   . .   . .",
+". .     . . . . ",
+" ... . . . . ...",
+". . . .   . . . ",
+" ... .  .  . ...",
+". . . .       . ",
+" ...   . .   ...",
+". .     .     . ",
+" . .   . .   . .",
+"        . . .   ",
+"     . .....    ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"........ .. ....",
+"........ .. ....",
+"                ",
+"   . .       .  ",
+"    . .     . . ",
+"   . .       .  ",
+". . . .   . . . ",
+" ..... . .. .. .",
+". . . .   . . . ",
+" . .     .      ",
+". .       .     ",
+" . .     .      ",
+"                ",
+"                ",
+"........ .. ....",
+"........ .. ....",
+"..  . . .     ..",
+"..   . . .    ..",
+"..  . . . . . ..",
+"..     ... .  ..",
+"..      . . . ..",
+"                ",
+"..      .     ..",
+"..   . . .    ..",
+"                ",
+"..   . . .    ..",
+"..  . . . . . ..",
+"..     ... .  ..",
+"..      . . . ..",
+"..     ... .  ..",
+"..      .     ..",
+"..   . . .    ..",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"        .  .    ",
+"                ",
+"        .  .    ",
+"                ",
+"        .  .    ",
+"                ",
+"        .  .    ",
+"                ",
+"        .  .    ",
+"                ",
+"        .  .    ",
+"                ",
+"        .  .    ",
+"                ",
+"        .  .    ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+". . . . . . . . ",
+"                ",
+"                ",
+". . . . . . . . ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"                ",
+"........ .......",
+"........  ......",
+"                ",
+"...... .........",
+"..... ..........",
+"................",
+"................",
+"................",
+"................",
+"................",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........  . ....",
+"........    ....",
+"........ .. ....",
+".......  .. ....",
+"...... . .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ ..     ",
+"........ .  ....",
+"........   .....",
+"........        ",
+"....... ........",
+"...... .........",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+".........       ",
+"........  ......",
+"........   .....",
+"........        ",
+"........ .. ....",
+".......  .. ....",
+"...... . .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"................",
+"................",
+"................",
+"................",
+"................",
+"           .....",
+"..........  ....",
+".........   ....",
+"          . ....",
+".......  .. ....",
+"...... . .. ....",
+"..... .. .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"         .. ....",
+"........  . ....",
+"........    ....",
+"           .....",
+"...... .........",
+"..... ..........",
+"................",
+"................",
+"................",
+"................",
+"................",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"                ",
+"........ .. ....",
+"........  . ....",
+"                ",
+"...... .........",
+"..... ..........",
+"................",
+"................",
+"................",
+"................",
+"................",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........  . ....",
+"........        ",
+"........ .. ....",
+".......   . ....",
+"...... . .      ",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"................",
+"................",
+"................",
+"................",
+"................",
+"                ",
+"......... ......",
+".........  .....",
+"                ",
+".......  .. ....",
+"...... . .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"            ....",
+"........ .  ....",
+"........  . ....",
+"            ....",
+".......  .. ....",
+"...... . .. ....",
+"..... .. .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"                ",
+"........ .  ....",
+"........  . ....",
+"                ",
+".......  .. ....",
+"...... . .. ....",
+"..... .. .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+".  ..  .    .  .",
+".  ..  .    .  .",
+"                ",
+".  ..  .    .  .",
+".  ..  .    .  .",
+".  ..  .    .  .",
+".  ..  .    .  .",
+"                ",
+".  ..  .    .  .",
+".  ..  .    .  .",
+"........ .. ....",
+"........ .. ....",
+"........ .. ....",
+"..... .... .....",
+"...          ...",
+"...          ...",
+"..... .... .....",
+"..... .... .....",
+"                ",
+"...          ...",
+"..... .... .....",
+"                ",
+"...          ...",
+"...          ...",
+"..... .... .....",
+"..... .... .....",
+"...          ...",
+"...          ...",
+"..... .... .....",
+".               ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+".               ",
+"                ",
+"                ",
+"                ",
+"  ....    ....  ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"  ....    ....  ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"    .      .    ",
+"    .      .    ",
+"    .      .    ",
+"    .      .    ",
+"                ",
+"                ",
+"                ",
+"                ",
+"    .      .    ",
+"    .      .    ",
+"    .      .    ",
+"    .      .    ",
+"                ",
+"                ",
+"                ",
+"................",
+"................",
+"................",
+".  ..  ..  ..  .",
+".  ..  ..  ..  .",
+"                ",
+".  ..  ..  ..  .",
+".  ..  ..  ..  .",
+".  ..  ..  ..  .",
+".  ..  ..  ..  .",
+"                ",
+".  ..  ..  ..  .",
+".  ..  ..  ..  .",
+"................",
+"................",
+"................",
+"..... .... .....",
+"...          ...",
+"...          ...",
+"..... .... .....",
+"..... .... .....",
+"...          ...",
+"...          ...",
+"..... .... .....",
+"..... .... .....",
+"...          ...",
+"...          ...",
+"..... .... .....",
+"..... .... .....",
+"...          ...",
+"...          ...",
+"..... .... .....",
+"..... ....  ....",
+"..... ....   ...",
+"...... ..   ....",
+"......    . .  .",
+".....    ...   .",
+"......  .....   ",
+"........ ...  ..",
+"......... ..  ..",
+"..........   ...",
+"..........    ..",
+"..........  ..  ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+".......... ...  ",
+".........     ..",
+"..........   ...",
+"......... .  ...",
+"........ ...  ..",
+"....... ....    ",
+".....   .....  .",
+".....    ...    ",
+"......      .. .",
+"..... ...    ...",
+"..... ....   ...",
+"................",
+"................",
+"................",
+"................",
+"................",
+"  ... ..........",
+"..     .........",
+"....  ..........",
+"...    .........",
+"..   .. ........",
+"    .... .......",
+".  .....   .....",
+".   ...    .....",
+"....      ......",
+"...    ... .....",
+"...   .... .....",
+"... . .... .....",
+"..   ..... .....",
+"...    ... .....",
+"  . .     ......",
+".  ....   ......",
+"   .....   .....",
+"..  ... . ......",
+"..  .. .........",
+"...   ..........",
+"...   ..........",
+"   .  ..........",
+"................",
+"................",
+"................",
+"................",
+"................",
+"..... .... .....",
+"....   ...  ....",
+".... . .. . ....",
+"... .. .. .. ...",
+".  ... .. ...  .",
+"                ",
+".......  .......",
+"......    ......",
+"....  ....  ....",
+".   ........   .",
+"                ",
+"................",
+"......   .......",
+"........ .......",
+"........  ......",
+"........ .......",
+".....  ...  ....",
+".....  ...  ....",
+".....  ... . ...",
+"..... . .. .. ..",
+"..... . .. ...  ",
+".  .. .. . .... ",
+".. .. ...  ..   ",
+".. .. ....   ...",
+".. .. ....   ...",
+".   . ...  ..   ",
+"..... .. . .... ",
+"..... . .. ...  ",
+"..... . .. .. ..",
+".....  ... . ...",
+".....  ...  ....",
+".....  ...  ....",
+"........ .......",
+"........  ......",
+"........ .......",
+"......   .......",
+"................",
+"                ",
+".   ........   .",
+"....  ....  ....",
+"......    ......",
+".......  .......",
+"                ",
+".  ... .. ...  .",
+"... .. .. .. ...",
+".... . .. . ....",
+"....   ...  ....",
+"..... .... .....",
+"....  ...  .....",
+"....  ...  .....",
+"... . ...  .....",
+".. .. .. . .....",
+"  ... .. . .....",
+" .... . .. ..  .",
+"   ..  ... .. ..",
+"...   .... .. ..",
+"...   .... .. ..",
+"   ..  ... .   .",
+" .... . .. .....",
+"  ... .. . .....",
+".. .. .. . .....",
+"... . ...  .....",
+"....  ...  .....",
+"....  ...  .....",
+"................",
+"...          ...",
+"...          ...",
+".  .. .... ..  .",
+".  .. .... ..  .",
+"                ",
+".  .. .... ..  .",
+".  .. .... ..  .",
+".  .. .... ..  .",
+".  .. .... ..  .",
+"                ",
+".  .. .... ..  .",
+".  .. .... ..  .",
+"...          ...",
+"...          ...",
+"..... .... .....",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..  ......... ..",
+"..  . . . . . ..",
+"                ",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"                ",
+"..   . . . .  ..",
+"..  ......... ..",
+"..   . . . .  ..",
+"..  . . . . . ..",
+"..   . . . .  ..",
+"..... .... .....",
+"..... .... .....",
+"                ",
+" ...   . . ... .",
+". . . . .   . . ",
+" ...   . . ... .",
+". . . . .   . . ",
+" ...   . . ... .",
+". . . . .   . . ",
+" ...   . . ... .",
+". . . . .   . . ",
+" ...   . . ... .",
+"                ",
+"                ",
+"..... .... .....",
+"..... .... .....",
+".               ",
+" ...............",
+" ...............",
+" ...............",
+" ....       ....",
+" ...         ...",
+" ..   .   .   ..",
+" .   ... ...   .",
+" .. .. ... .. ..",
+" .. ......... ..",
+" .. . . . . . ..",
+" .. .... .... ..",
+" .. . .. .... ..",
+" ..           ..",
+" ...............",
+" ...............",
+"                ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"................",
+"................",
+"..       .......",
+"...  ...  ......",
+"...  ....  .....",
+"...  ....  .....",
+"...  ....  .....",
+"...  ...  ......",
+"...      .......",
+"...  ..  .......",
+"...  ...  ......",
+"...  ....  .....",
+"..    ..    ....",
+"................",
+"................",
+"................",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"                ",
+"................",
+"......... ......",
+".... ...........",
+"........... ....",
+"..        . ....",
+".  ... .. ......",
+".  . .... ......",
+".       . ......",
+".      .. ......",
+".....  .. ......",
+".....     ......",
+" ....    .......",
+"..........  ....",
+".........   ....",
+"... ............",
+"................",
+"...... .........",
+".............. .",
+".. ........ ....",
+"......  ........",
+"....  .  .......",
+".... ..   .. ...",
+"...  ..   ......",
+". .  ..   ......",
+"...  .    ......",
+"...   .   .. ...",
+"... .  . .......",
+"...     .... ...",
+"................",
+" ...... .. .....",
+".. .. ........ .",
+"................",
+"................",
+"................",
+"..... ... ......",
+"............. ..",
+".. ..    .......",
+"....  ..      ..",
+"...   . .  .  ..",
+"...   ......  . ",
+" ..           ..",
+"...  .. .. . ...",
+"...         ....",
+".............. .",
+".. ..... .. ....",
+"..... ..........",
+"................",
+"................",
+".. .. .. .. .. .",
+" ...............",
+".....  ........ ",
+"...  .   .......",
+" .  .. . .......",
+"..  .. . ..  .. ",
+"..  .. . .. ....",
+" .  .  . .. ....",
+"..  .. . ...... ",
+"..  .. . .. ....",
+" .  .  . .......",
+"..   ..  .. ... ",
+"..  . . ........",
+" .     .........",
+"............... ",
+". .. .. .. .. ..",
+". .... .... ... ",
+"................",
+"...          ...",
+" .   ......  ...",
+"..  .      . .. ",
+"..  .  ....  ...",
+"..  . .      ...",
+" .  . . ........",
+"..  ... ........",
+"..      ... ....",
+"..     ... . .. ",
+" ............ ..",
+"... . .... . ...",
+"................",
+" .............. ",
+"... ... .... ...",
+". . . . . . . . ",
+" ...............",
+".....        .. ",
+" ..  .        ..",
+"... ..  ..... . ",
+" .  .. .      ..",
+"..  .  . ... .. ",
+" .  .. .    ....",
+"..  .. . ...... ",
+" .  .. . ... ...",
+"..  .  . ...... ",
+" .   ..  . . ...",
+"..  . . ....... ",
+" .     ... . ...",
+"............... ",
+" . . . . . . . .",
+" . . . . . . . .",
+"............... ",
+" .......      ..",
+".......  .. . . ",
+" ..... . .. . ..",
+"......   .  . . ",
+" ..... . .. . ..",
+"......   .. . . ",
+" ....    .. . ..",
+"....  .     . . ",
+" ..   ....... ..",
+"... .         . ",
+" ..  .. .. . ...",
+"...         ... ",
+" ...............",
+". . . . . . . . ",
+". .. .. .. .. ..",
+"............... ",
+" ....        ...",
+"....  .  ... ...",
+"... ... . .. .. ",
+" .  ... .    ...",
+"..  ... .   ....",
+"..  . . . ..... ",
+" .  ... . ......",
+"..  ..  . ......",
+"..    .   ..... ",
+" .  ..... .. ...",
+".. . . . .. . ..",
+"..      .... .. ",
+" ...............",
+".. .. .. .. .. .",
+"................",
+"................",
+"........     ...",
+".. ..... ..  ...",
+"........ ..  ...",
+"...      ..  ...",
+"..  .        ...",
+".   ... ...  ...",
+".   .......  ...",
+".        ..  .. ",
+".  ....  ..  ...",
+".        ... ...",
+"......       ...",
+"......  ... ....",
+"......     .....",
+"................",
+"................",
+"....           .",
+"...   .......  .",
+".. . .       . .",
+". .  . ...  .   ",
+". ..  ...  ..   ",
+". .   .......   ",
+". ..        .   ",
+". . ....... .  .",
+".  .. . .   .  .",
+".           .. .",
+".... .... .    .",
+".........  .. ..",
+".........    ...",
+"............... ",
+"................",
+"................",
+". ..............",
+"....            ",
+"...    . . . .  ",
+".. .  .         ",
+". .  .  ......  ",
+". ..   ........ ",
+". .   ......... ",
+". ..           .",
+". . .. .. .. . .",
+".  . ..  .. . ..",
+".            ...",
+"...... .. ......",
+"............... ",
+"................",
+"................",
+" ..........  .. ",
+"...        .  ..",
+"..  . . .  . .  ",
+"  .  .... ..  . ",
+". .      ... .  ",
+".  ... . ...  . ",
+"      .. ... .  ",
+".....  . ..   . ",
+".....  .   ..   ",
+" .... .. .. ..  ",
+"..... . . .. .  ",
+".....  ...... ..",
+".....        ...",
+"............... ",
+"................",
+"................",
+"                ",
+" . ... ... ...  ",
+" ... ... ...... ",
+" . ... ... ...  ",
+" ... .        . ",
+" . ..  ......   ",
+" ...   ...... . ",
+" .     ......   ",
+" ..    .....  . ",
+" .     ......   ",
+" .. .  ...... . ",
+" .     ......   ",
+" ..    .....  . ",
+" ..    ......   ",
+" .. .  ...... . ",
+" .     ......   ",
+"                ",
+"... .. . ... . .",
+"...  ... ... ...",
+"... .. . ... ...",
+"...  ... ... ...",
+"....    .... .  ",
+"............ .  ",
+". .......... .  ",
+"...... . ... .  ",
+". ....... .. .  ",
+".. .....  .. .  ",
+"... ...    . .  ",
+". .....   .. .  ",
+".. ..... ... .  ",
+"... ... .... .  ",
+". ....... .. .  ",
+"                ",
+".. ... ... ...  ",
+" ... ... ... .. ",
+".           ..  ",
+"  .. ... ..  .. ",
+"  ......... ..  ",
+".  .. .....  .. ",
+"  ......... ..  ",
+". .......... .. ",
+"  ......... ..  ",
+". .....  ..  .. ",
+"  ......... ..  ",
+". .........  .. ",
+"  ......... ..  ",
+". .........  .. ",
+"  .     ... ..  ",
+" ..    .....   .",
+" .     ...... ..",
+" .. .  ...... ..",
+" .     ......  .",
+" ..    .....  . ",
+" .     ......   ",
+" .. .  ...... . ",
+" ..    ......   ",
+" ..    .....  . ",
+" .     ......   ",
+" .. .  ...... . ",
+" .     ......   ",
+" ..    .....  ..",
+" .     ......  .",
+" .. .  ...... ..",
+" .     ......  .",
+".. ..... . . .  ",
+"... ..  .... .  ",
+". ....... .. .  ",
+".. ..... ... .  ",
+".   ... .... .  ",
+".   ..... .. .  ",
+".. ..... ... .  ",
+"... ... .... .  ",
+"............ .  ",
+"........   . .  ",
+".   ....   . .  ",
+".   ........ .  ",
+"             .  ",
+".. ... ... ... .",
+" ... ... ... ...",
+".. ... ... ... .",
+". .  ..  ..  .. ",
+"  .  ..  .. ..  ",
+". .     ...  .. ",
+"  .    .... ..  ",
+". .  .  ...  .. ",
+"  .  ..  .. ..  ",
+". .........  .. ",
+"  ......... ..  ",
+". .........  .. ",
+"            ..  ",
+" ... ... . . .. ",
+".. ... ..  ...  ",
+"         ... .. ",
+".. ... ... ...  ",
+" ... ... ... .. ",
+".. ... ... ...  ",
+" ..    .....    ",
+" .     .........",
+" .. .  .........",
+" ..    .........",
+" ..    ..... ...",
+" .     .........",
+" .. .  .........",
+" .     .........",
+" ..    .........",
+" .              ",
+" .. .  . . . . .",
+" .   .     ...  ",
+" ..             ",
+" . ... ... ... .",
+" ... ... ... ...",
+"                ",
+"              ..",
+"........... .. .",
+"...........  ...",
+"........... .. .",
+" ... ... ..  ...",
+"........... .. .",
+"...........  ...",
+"........... .. .",
+"...........  ...",
+"            .. .",
+" . . . . . . ...",
+" . ..  ..  ... .",
+"         ...... ",
+".. ... ... ... .",
+" ... ... ... ...",
+"                ",
+" ... ... ..  .. ",
+".. ....... ...  ",
+" ....... ... .. ",
+". ........ ...  ",
+" ... ... ...... ",
+"...... ....  .  ",
+".... ......  .. ",
+".. ....... ...  ",
+" ... .... .. .. ",
+"...... ... ...  ",
+" ........... .. ",
+".. ... ... ...  ",
+" ... ... ...... ",
+".. ... ... ...  ",
+" ... ... ... .. ",
+"                ",
+"                ",
+" . ... ... ... .",
+" ... ..         ",
+" .....          ",
+" ...    ... ... ",
+" . .    ..... ..",
+" ..  .  ..... . ",
+" .      ........",
+" ..  .  ....... ",
+" .      ... ....",
+" ..  .  ....... ",
+" .      .  .....",
+" ..  .  .  .... ",
+" .      .  ... .",
+" ..     ....... ",
+" ..     ........",
+"                ",
+".. ... ... ... .",
+"  .. ... ...  ..",
+"                ",
+"                ",
+"  .... .........",
+"  . ............",
+"  .......... ...",
+"  ... ... ...   ",
+"  ........    ..",
+"  ..... ....  ..",
+"   ....... .....",
+"  ..............",
+"                ",
+"  . . . . . . . ",
+"   . . . . . . .",
+"                ",
+".. ... ... ...  ",
+" ... ..  ... .. ",
+"           ...  ",
+"           . .. ",
+".........  ...  ",
+".........  . .. ",
+".. . ....  ...  ",
+"...... ..  . .. ",
+".... ....  ...  ",
+"....  ...  . .. ",
+"... .....  ...  ",
+"... .  ..  . .. ",
+"           ...  ",
+". . . . . .. .. ",
+" . . . . . ...  ",
+" ..  .  ....... ",
+" .      ........",
+" ..  .  ....... ",
+" .      ........",
+" ..  .  ....... ",
+" .      ...  ...",
+" ..     ...  .. ",
+" .      ........",
+" ..  .  ....... ",
+" .      ........",
+" ..  .  ....... ",
+" ..     ........",
+" ..  .  ....... ",
+" .      ..... ..",
+" ..  .  ... ... ",
+" .              ",
+"  .             ",
+"   ... . . ... .",
+"  .. ... ... ...",
+"   . . .........",
+"  .. . . .     .",
+"     . ...  ..  ",
+"  ..  .. .  ..  ",
+"   ... ...     .",
+"  .. ... .    ..",
+"   ..  ...  .  .",
+"  .. ... .  ..  ",
+"   ... .........",
+"  .. .   ... .. ",
+"   ... ... ...  ",
+"  .. ... ... .. ",
+"                ",
+"         ... .. ",
+".. ... ... . .  ",
+" ... ... ... .. ",
+".. ... ... ...  ",
+".... ... ... .. ",
+".. ...  .. ...  ",
+".... ... ... .. ",
+".. ... ... ...  ",
+".... ... . . .. ",
+".........  ...  ",
+".... ....... .. ",
+".. . . . . ...  ",
+"         ... .. ",
+"  ...... .....  ",
+"  ...    ... .. ",
+"  . .    . ...  ",
+" ..  .          ",
+" .     . .......",
+" ..      .......",
+" .   . . .......",
+" ..      ..... .",
+" .   . . .......",
+" ..      .......",
+" ..  . .        ",
+" ..      . . . .",
+" .   .  . .   . ",
+" ..    . . . . .",
+" .    . .   . . ",
+" ..             ",
+" . ... ... ... .",
+" ... ... ... ...",
+"                ",
+"                ",
+"..............  ",
+"..............  ",
+"..............  ",
+".... ........   ",
+"..............  ",
+"..............  ",
+"                ",
+" . . . . . . . .",
+"  . .   .   .  .",
+" . . . . . . ...",
+". .   . . . .. .",
+"           . ...",
+".. ... ... ... .",
+" ... ... ... ...",
+"                ",
+".... ... ... .. ",
+".....    .....  ",
+".....    ...  . ",
+". ...... .....  ",
+"... . ..  .. .. ",
+".........   ..  ",
+"...  .... .. .. ",
+"...  ....  ...  ",
+"     . ...   .. ",
+"..  ......  ..  ",
+" ... ......  .. ",
+".. .. ...... .  ",
+" ... . ..... .. ",
+".. ... ....  .  ",
+" ... . ..... .. ",
+"                ",
+"                ",
+" ..... ... ... .",
+" ... ...        ",
+" .....          ",
+" ... .   .......",
+" . ..    .......",
+" ... . . . .....",
+" .       ....   ",
+" ..    . ..... .",
+" .       ....  .",
+" ..  . . . . .  ",
+" .       .......",
+" ..  .   .......",
+" .       .......",
+" ..  . .        ",
+" .      ........",
+"                ",
+".. ... ... ... .",
+"   . ... ... ...",
+"   ... ... ... .",
+".               ",
+".  .............",
+".  .............",
+".  ...... ......",
+".  ...... .... .",
+".  ..... . .....",
+".  .............",
+".               ",
+".  . . . . . . .",
+".   . . . . . . ",
+"                ",
+".  ... ... ...  ",
+"                ",
+".. ... ... ...  ",
+".... ... ... .. ",
+".           ..  ",
+"  .. ... ..  .. ",
+"  ......... ..  ",
+"  .........  .. ",
+"  ......... ..  ",
+"  ........  ... ",
+"  ......... ..  ",
+"  .........  .. ",
+"  ......... ..  ",
+"  .. ......  .. ",
+". ........  ..  ",
+"  . .......  .. ",
+". ......... ..  ",
+" ..  .          ",
+" .     .........",
+" ..  . .........",
+" .     .........",
+" ..  . ..... ...",
+" .     .........",
+" ..  . .........",
+" .     ... .....",
+" ..  . . ... ...",
+" .     .........",
+" ..    .........",
+" .     .........",
+" ..  . .        ",
+" .              ",
+" ..  . . .......",
+" .       .......",
+" ... ... ... .  ",
+" .............  ",
+" ...     ... .  ",
+" . .  ..  ....  ",
+" ...  ..  .. . .",
+" . .     .....  ",
+" ...    .... . .",
+" . .  .  .....  ",
+" ...  ..  .. .  ",
+" . ...........  ",
+" ... ... ...    ",
+" . ... ... .    ",
+"                ",
+"                ",
+"................",
+"................",
+"  ... .....  .. ",
+". ......... ..  ",
+"  ... ....   .. ",
+"  .. . .... ..  ",
+"  ..... ...  .. ",
+"  ......... ..  ",
+"  .........  .. ",
+"             .  ",
+"             .. ",
+" ..........  .  ",
+" ..........  .. ",
+" .....    .  .  ",
+"  ..... ...  .. ",
+"  .... ....  .  ",
+"  .........  .. ",
+"  .........  .. ",
+" ..  . . .......",
+" ..      .......",
+" ..  .   ... ...",
+" .       ...... ",
+" ..  . . ... ...",
+"         .......",
+"       . .......",
+" .              ",
+" ..  .   . . . .",
+" .      .   . . ",
+" ..    . . . . .",
+" .    . . .   . ",
+" ..             ",
+" . ... ... ... .",
+" ......... . ...",
+"                ",
+"......... ......",
+".......... .....",
+"............ ...",
+"........   .....",
+"........ . .....",
+"........   .....",
+"................",
+"                ",
+" . . . . . . . .",
+"  . .   .   . . ",
+" . . . . . . . .",
+"...   .   . . . ",
+"                ",
+".. ....... ... .",
+" ... ... ... ...",
+"                ",
+"  .........  .. ",
+"  .........  .  ",
+"  .........  .. ",
+"  ..... ...  .  ",
+"  ..... ...  .. ",
+"  .... ....  .  ",
+"  .........  .. ",
+"  .........  .  ",
+"             .. ",
+".   . .   . ..  ",
+"   . . . . . .. ",
+"  . .   .  ...  ",
+"         ...... ",
+"...  . ... ...  ",
+" ..  ... ... .. ",
+"                ",
+"                ",
+" . ... ..       ",
+"   . ...        ",
+" . ...    ......",
+" ... .  . ......",
+" . ..     ......",
+"  ..  .   .. .. ",
+" .        ..    ",
+" ..    .  ... . ",
+" .        .. ...",
+" ..   .   ......",
+" .  .     ......",
+" ..       ......",
+" .      . . .. .",
+" ..   .   ......",
+" .              ",
+"                ",
+"    .. ....     ",
+"     ... .      ",
+"..  .. ..   ....",
+"..       .  ....",
+"..  ....    ....",
+"..  ....    ... ",
+"..    ..    ....",
+"..  ....    ....",
+"..  ....        ",
+"..  .  . .......",
+"..        . .. .",
+"..  ............",
+" .              ",
+"..  ... ... ... ",
+"    . . . ..    ",
+"                ",
+"              . ",
+"              . ",
+"............  . ",
+"............  . ",
+"............  . ",
+". . .   ....  . ",
+"....  ......  . ",
+"............  . ",
+"    ........  . ",
+"... ... ....  . ",
+".   .... ...  . ",
+".   ........  . ",
+"                ",
+"                ",
+"   ...........  ",
+" ..     ........",
+" .     .......  ",
+"  . .  ......   ",
+"       ....    .",
+" ..  . . .. .  .",
+" .     ...     .",
+" ..    .  .    .",
+" .     .       .",
+" ..     .   .  .",
+" .   .         .",
+" ..       .    .",
+" .             .",
+"  .     .   .  .",
+" .             .",
+" ..  . .  .    .",
+" .             .",
+". . ........    ",
+"                ",
+"                ",
+"..... ... ....  ",
+"..............  ",
+".....     ....  ",
+".....  ..  ...  ",
+".....  ..  ...  ",
+".....     ....  ",
+".....    .....  ",
+".....  .  ....  ",
+".. ..  ..  ...  ",
+"..............  ",
+"... ..........  ",
+"....... ......  ",
+"......... ....  ",
+".. ...........  ",
+".  ...........  ",
+"..............  ",
+". ............  ",
+".......... ...  ",
+". ......... ..  ",
+".......... . .  ",
+". ....... ....  ",
+".... .........  ",
+". ............  ",
+"..............  ",
+"   ...........  ",
+"...... .......  ",
+"....... ....    ",
+"...... . ..  .  ",
+"..... .....     ",
+"  .  .  .   .  .",
+"                ",
+"  .   .   .    .",
+" .           .. ",
+" ..  .  .    . .",
+" .         .. ..",
+" ..    .   . . .",
+" .       .. ... ",
+" ..  .   . . . .",
+" .     .. ... ..",
+" ..    . . . . .",
+" .   .. ...  .. ",
+" ..             ",
+" . ... ... . .  ",
+" ... ... ... .. ",
+"                ",
+"..........  ..  ",
+"                ",
+" . . . . . . . .",
+"... ..... ... ..",
+" . . . . . . ...",
+". ... . ...     ",
+" . . . . . . . .",
+"..... ... . . ..",
+" . . . . . . . .",
+". . ... . ... . ",
+" . . . . . . .  ",
+" .... ... .   ..",
+"                ",
+" . ... ...  .. .",
+" ... ... ..  ...",
+"                ",
+"........... .   ",
+"..............  ",
+" .............  ",
+"  ............  ",
+"..............  ",
+"                ",
+" . . . . . . . .",
+".   . ... . .  .",
+" . . . .   . . .",
+". ... . . . .. .",
+" . . . . . . . .",
+". .   ..   ... .",
+"         ... . .",
+"..  .. ... . . .",
+" ..  ...   . . .",
+"               .",
+"                ",
+" ...............",
+" . ... ... ... .",
+" ...............",
+" ... .          ",
+" ....           ",
+" . . . .........",
+" .. .  .........",
+" ..  . .........",
+" .. .  .........",
+" .   . .........",
+" .. .  .........",
+" ..  . .........",
+" .. .  .........",
+" .   . .........",
+" .. .  .........",
+"                ",
+"................",
+".. ... ... ... .",
+"............    ",
+"       . ..     ",
+"       ...   ...",
+".....  .. .  ...",
+".....  ..  . ...",
+".....  .  .  ...",
+".....  ..  . ...",
+".....  .. .  ...",
+".....  ..  .    ",
+".....  .  . ....",
+".....  ..  .... ",
+".....  ..      .",
+"       .......  ",
+"                ",
+"............... ",
+".. ... ... ...  ",
+"            ... ",
+"             .. ",
+"..........  ... ",
+"..........  ..  ",
+"..........  ... ",
+"..........   .. ",
+"..........  ... ",
+"..........  ..  ",
+"  ........  ... ",
+"  ........   .. ",
+". ........  ... ",
+"  ........  ..  ",
+". ........  ... ",
+" ..  . ........ ",
+" .. .  ........ ",
+" .   . ........ ",
+" .. .  ........ ",
+" ..  . ........ ",
+" .. .  ........ ",
+" .   . ........ ",
+" .. .  ........ ",
+" ..  . ........ ",
+" .. .  ........ ",
+" .   . ........ ",
+" .. .  ........ ",
+" ..  . ........ ",
+" .. .  ........ ",
+" .   . ........ ",
+" .. .  ........ ",
+" . .  .. ... . .",
+"  .  .........  ",
+"    .. ... ... .",
+" .............  ",
+" ... ... .     .",
+" ......... ...  ",
+" .     ... .   .",
+" .  ..  .. . .  ",
+" .  ..  .. . . .",
+" .     ... . .  ",
+" .    .... . . .",
+" .  .  ... . .  ",
+" .  ..  .. . .  ",
+" ......... . ...",
+" . ... ... . . .",
+" ....      .    ",
+"  ........   .. ",
+". ........  ... ",
+"  ........  ..  ",
+". ........  ... ",
+"  ........   .. ",
+". ........  ... ",
+"  ........  ..  ",
+". ........  ... ",
+"  ........   .. ",
+".           ... ",
+" . . . . . ...  ",
+"......... ..... ",
+"         ... .. ",
+"............... ",
+".. ... ... ...  ",
+"            ... ",
+" ..  . ........ ",
+" .. .  ........ ",
+" .   . ........ ",
+" .. .  ........ ",
+" ..  . ........ ",
+" .. .  ........ ",
+" .   . ........ ",
+" .. .  ........ ",
+" ..  . ........ ",
+" .. .           ",
+" .     . . . .  ",
+" ..  ......... .",
+" ..           ..",
+" ...............",
+" . ... ... ... .",
+"                ",
+" ...  . ...... .",
+"      .. .... ..",
+" ........ .. .. ",
+"      ..........",
+" ...  ..........",
+" .... ..........",
+" . .. ..........",
+" .... ..........",
+" ...  .... .... ",
+" .... ... ......",
+".. .. .. .......",
+".....      ...  ",
+" ... ... . ... .",
+".......... ... .",
+".. ... ... ... .",
+"                ",
+". .. .. ..   .. ",
+" .. .. .. .     ",
+".. .. .. ...... ",
+"............... ",
+"............... ",
+"...........     ",
+"........... ..  ",
+"........... ... ",
+".. .. .. ..  .. ",
+" .. .. .. . ... ",
+". .. .. ..  ..  ",
+"            ... ",
+" ... ... ... .. ",
+"............... ",
+".. ... ... ...  ",
+"                ",
+"                ",
+" ...............",
+" . . . ... ... .",
+" ...............",
+" ... .          ",
+" ....           ",
+" . . . .........",
+" .. .  .........",
+" ..  . ........ ",
+" ..    .........",
+" .   . .........",
+" .. .  .........",
+" ..  . ........ ",
+" .. .  ........ ",
+" .   . .... ... ",
+" ..    .... ... ",
+"                ",
+".... ...........",
+".. ... ... ... .",
+"............ ...",
+"           . ...",
+"           ...  ",
+".........  ... .",
+".........  ...  ",
+".........  . . .",
+".........  ...  ",
+".........  ... .",
+"           ...  ",
+" ........ .. .  ",
+"     . . .....  ",
+"        .. ... .",
+" .............  ",
+"                ",
+"............... ",
+".. ... ... ...  ",
+".           ... ",
+"  .. ... ..  .. ",
+". ......... ... ",
+"  ......... ..  ",
+". ......... ... ",
+"  .. ... ..  .. ",
+". ......... ... ",
+"  ......... ..  ",
+". ......... ... ",
+"  .. ... ..  .. ",
+". ......... ... ",
+"  ......... ..  ",
+". ......... ... ",
+" ..  . ........ ",
+" .. .  ........ ",
+" .   . ........ ",
+" .. .  ........ ",
+" ..  . ........ ",
+" .. .  ........ ",
+" .     .... ... ",
+" .. .  ....  .. ",
+" ..  . ........ ",
+" .. .  ........ ",
+" .   . ........ ",
+" ..    ........ ",
+" ..  . ........ ",
+" .. .  ........ ",
+" .   . ........ ",
+" .. .  ........ ",
+" ... ... ... . .",
+" .............  ",
+" ..     .. ... .",
+" ..  ..  .. ..  ",
+" ..  ..  .....  ",
+" ..     ......  ",
+" ..    ... ... .",
+" ..  .  ......  ",
+" ..  ..  ... .  ",
+" ............. .",
+" . ... ... .. . ",
+" ........... . .",
+" ... ... ...  . ",
+" ........... . .",
+"                ",
+"                ",
+"  .. ... .. ... ",
+". ......... ... ",
+"  ......... ... ",
+". ......... ..  ",
+"  .. ... ..  .. ",
+". ......... ... ",
+"  ......... ..  ",
+"             .. ",
+"             .. ",
+" ..........  .. ",
+" ..........  .  ",
+" ..........  .. ",
+" ..........  .. ",
+" ..........   . ",
+" ..........  .. ",
+" ..........  .. ",
+" ..  . .........",
+" .. .  .........",
+" .   . .........",
+" ..    .........",
+" ..  . .........",
+" .. .  ...... ..",
+" .     .........",
+" .. .  .........",
+" ..  . .........",
+" .. .           ",
+" .    .... .. ..",
+" ..  ... .. ....",
+" ..             ",
+" ......... ... .",
+" . .............",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"... ........... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"                ",
+".. .... .. ... .",
+". ...  .... . ..",
+"                ",
+"................",
+"...... .....  ..",
+"                ",
+" ..........  .. ",
+" ...... ...  .. ",
+" ..........  .. ",
+" ..........  .. ",
+" ...... ...  .. ",
+" ..........  .. ",
+" ..........  .  ",
+" ..........  .. ",
+"             .. ",
+".. . . . .. ... ",
+".......... .. . ",
+" . . . .. ..... ",
+"         ...... ",
+" .............. ",
+"...... ... ...  ",
+"                ",
+"                ",
+" ... ...........",
+" ... ...........",
+" ........... ...",
+" ... ...        ",
+" ......   . . . ",
+" .....   .......",
+" ....  . .......",
+" ...  .  .... . ",
+" . . . . .......",
+" ...     ..... .",
+" ... . . .......",
+" . .  .         ",
+" . .            ",
+" ...  .  . . .  ",
+" ... .  . . . . ",
+"                ",
+"...... .........",
+"................",
+"................",
+"      .. ... ...",
+". . . .. .....  ",
+"....   .   ..  .",
+"..... ...... . .",
+"....  .. .. .  .",
+"..... ....   . .",
+"....      . .  .",
+"..... .....  . .",
+"     .    . .  .",
+"    ..... .  . .",
+"   ... .. . .  .",
+"  ..... . .  . .",
+"                ",
+"............... ",
+". ........  ..  ",
+"............... ",
+" ...       . .. ",
+"      . . . ... ",
+" .   .....  ..  ",
+"..   ...... ... ",
+"..   .....   .. ",
+"..   ...... ... ",
+"..   .....  ..  ",
+"..   ...... ... ",
+"..  .        .. ",
+"..         .... ",
+"..         ...  ",
+".........  .... ",
+" ...  .  . . .  ",
+" ... .  . . . . ",
+" ...  .  . . .  ",
+" ... .  . . . . ",
+" ...  .  .      ",
+" ...    .   . . ",
+" ...  .  . .....",
+" ... .     .....",
+" ...  .  . .....",
+" . . .  .  .....",
+" ...   . . .....",
+" ...  .    .....",
+" ... . . . .....",
+" ...    .  .....",
+" ... . . . ... .",
+" ...  .    .....",
+" ... ...  . .  .",
+"......... .  . .",
+".. ... ...  .  .",
+"...........  . .",
+"   .     .. .   ",
+".  .  ..  .   . ",
+".. .  ..  .  ...",
+".  .     ..     ",
+".. .    .... ...",
+".  .  .  .......",
+".. .  ..  .... .",
+".  .............",
+"..              ",
+". . . . . . . . ",
+"................",
+".......  . .... ",
+".......... . .. ",
+".........  .... ",
+".......... ...  ",
+".........  .... ",
+"           . .. ",
+" ........ ..... ",
+"..  .  . . ...  ",
+"        ....... ",
+" ...   . ... .. ",
+"..           .. ",
+".    . . . . .  ",
+".   .......  .. ",
+"    ........ .. ",
+" .  .......  .. ",
+"    ........ .  ",
+"    .......  .. ",
+" ... . . . ... .",
+" . .    .  .....",
+" ... . . . .....",
+" ...  .    .....",
+" ... . . .      ",
+" ...    . .. .. ",
+" ... . . .......",
+" ..   . .. .. ..",
+" ... . .........",
+" ...  .. .. ..  ",
+" ...            ",
+" ............ ..",
+" ... ....... ...",
+" .............. ",
+" ...... ........",
+"                ",
+"....... ........",
+"............... ",
+"..... . . ......",
+"............... ",
+"                ",
+"........ .. ... ",
+".. .. ........ .",
+". . .. .. ... ..",
+"............ ...",
+".  . .. ... . ..",
+"           .. ..",
+".............   ",
+"........ ... ...",
+"................",
+"...... .........",
+"                ",
+" .  ........ .. ",
+"    .......  .. ",
+"    ........ .  ",
+" .  .......  .. ",
+"             .. ",
+".           ... ",
+".   . .  . ...  ",
+"........... ... ",
+" . . . . ..  .. ",
+" . . . . .. ... ",
+"........... ..  ",
+"      ..... ... ",
+" ...  .....  .. ",
+"..... ..... ... ",
+"..... ..... ..  ",
+"                ",
+".............   ",
+"           .    ",
+" . ... .... . ..",
+" ......... .  . ",
+" ........ . . . ",
+" ....... . .  ..",
+" . .... . . . ..",
+" ..... . . .  ..",
+" .... . . . . ..",
+" ... . .   .  ..",
+" .  . . . . . ..",
+" ..  . . . .  ..",
+" .. . . . . . ..",
+" ..    . . .  ..",
+" .  . . . . . . ",
+" ..  . . . .  . ",
+"              ..",
+"              ..",
+"............    ",
+" ...........  ..",
+" ...........  ..",
+"............  ..",
+"............  ..",
+".. ....       ..",
+"......  .. .....",
+"......  . ..    ",
+"......   .. ....",
+"......  .. .. . ",
+"......  . .. ...",
+"......   .. ... ",
+"    ..          ",
+" ..  .  ......  ",
+"................",
+"................",
+"             ...",
+"............ ...",
+"............ ...",
+"............ ...",
+". ... .. ... ...",
+"............ ...",
+"............ ...",
+"    ........ ...",
+" .. .. ..... ...",
+".   .. ..... ...",
+".   ...... . ...",
+"    ........ ...",
+"               .",
+"               .",
+" .. . . . . . . ",
+" ..  . .   .  . ",
+" .  . . . . . . ",
+" ..  . . . .  . ",
+" .. . . . . . . ",
+" ..    . . .  ..",
+" .  . .   . . ..",
+" ..  . . . .    ",
+" .. . . . . .. .",
+" ..  . .    . . ",
+" .  . . . .. ...",
+" ..  . .        ",
+" .. . . . ......",
+" ..    .  ......",
+" .  . . . ......",
+" ..  . .  ......",
+" ..  .  .... .  ",
+"    ..  ......  ",
+"   ...  .. ..  .",
+" .  ..  ....  . ",
+" ..  .  .... . .",
+"......  ....  . ",
+"......  .. . . .",
+"        ....  . ",
+".. ... . ... . .",
+". . . ......  . ",
+" ... . ... . . .",
+"    ........  . ",
+"..              ",
+". .             ",
+"................",
+"................",
+". ...........  .",
+". ...........  .",
+"  ...........  .",
+". ...........  .",
+"  .....  ....  .",
+". .... .. ...  .",
+"  ...  .. ...  .",
+". ...    ....  .",
+"  ....  .....  .",
+". ...........  .",
+"  ...........  .",
+". ...........  .",
+"  ...........  .",
+" ......... ..  .",
+".............  .",
+".............  .",
+" .. . . . ......",
+" ..  . .  ......",
+" .  . . . ......",
+" ..  . .  ...  .",
+" .. . . . ......",
+" ..    .  ......",
+" .  . . .       ",
+" ..  . . .......",
+" .. . .  . . . .",
+" ..  . .........",
+" .  .  . . . . .",
+" ..  ....  .... ",
+" ..             ",
+" ...............",
+" ...............",
+"                ",
+"...... .........",
+"................",
+"................",
+"........ ...... ",
+"........ .......",
+"................",
+"                ",
+"................",
+" . . . . . . . .",
+"................",
+" . . . . . . . .",
+"................",
+"                ",
+"................",
+"................",
+"                ",
+".............  .",
+".............  .",
+"..... .......  .",
+".... ........  .",
+"... .........  .",
+".............  .",
+"               .",
+"............. ..",
+" . . . . . . . .",
+"........... .. .",
+" . . . . . ... .",
+".  ...... .... .",
+"         ... . .",
+".............. .",
+".............. .",
+"               .",
+"                ",
+" ...............",
+" ...............",
+" ...............",
+" .....          ",
+" ....           ",
+" ... . ........ ",
+" .. .. ........ ",
+" ..  . ........ ",
+" .. .  ........ ",
+" ..  . ........ ",
+" .. .. ........ ",
+" ..  . ........ ",
+" .. .           ",
+" ..             ",
+" .. . ......... ",
+"                ",
+"................",
+"...... .........",
+"..... . . ......",
+" ... . . .......",
+" .... . . ..... ",
+" ... . . ..... .",
+" .. . . . ....  ",
+" ... . . ..... .",
+"             . .",
+"  ..  .  ... . .",
+"  ..  .  ...    ",
+" ...  .  .....  ",
+"  ..........   .",
+". .......... . .",
+".   ........ .  ",
+"                ",
+"............... ",
+"............... ",
+".           ... ",
+"            ... ",
+". ........  ... ",
+"  ........  ... ",
+". ........  ... ",
+"  ........  ... ",
+". ........  ... ",
+"  ........  ... ",
+". ........  ... ",
+"  ........  ... ",
+". ........  ... ",
+"  .     ..  ... ",
+". .  ..  .  ... ",
+" ..   ......... ",
+" .. . ......... ",
+" ..   ......... ",
+" .. . ......... ",
+" ..   ......... ",
+" .. . ......... ",
+" ..   ......... ",
+" .. . ......... ",
+" ..   ......... ",
+" .. . ......... ",
+" ..   ......... ",
+" .. . ......... ",
+" ..             ",
+" ..  .. .. ... .",
+" ..           ..",
+" ...............",
+".   .....    . .",
+". .......    . .",
+".   ........ . .",
+".   ........    ",
+". ............  ",
+"  ..........   .",
+"............ . .",
+"       ....  .  ",
+"...... .... .. .",
+"...... .... .. .",
+".... . .... .. .",
+"... . ..... ..  ",
+".. . . .... ..  ",
+"... . . ... ....",
+".. . . .... ....",
+"... . ..... ....",
+"  .  ..  .  ... ",
+". .     ..  ... ",
+"  .    ...  ... ",
+". .  .  ..  ... ",
+"  .  ..  .  ... ",
+". ........  ... ",
+"  ........  ... ",
+". ........  ... ",
+"  ........  ... ",
+".           ... ",
+" ......... .... ",
+".. . . .. ..... ",
+"         ...... ",
+"............... ",
+"............... ",
+"............... ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ... . .........",
+" .. . ..........",
+" ... . .........",
+" .. . . . ..... ",
+" ..  . . .......",
+" .  . . ........",
+" . . . .....    ",
+" .......... ....",
+" .........      ",
+" ........ .... .",
+" ...............",
+"                ",
+".. . . .... ....",
+".   .. .... ... ",
+". .... .... ....",
+"...... .... ....",
+"...... .... ....",
+".....  .... ....",
+".... . .... ....",
+". . . ... . ....",
+" . . . . .. ....",
+". . . . ... ....",
+"   . . .... ....",
+"  . . . ... ....",
+".. . . .... ....",
+".....  .... ....",
+"...... .... ....",
+"                ",
+"........ ...... ",
+"............... ",
+"............... ",
+"............... ",
+"........ ...... ",
+"....... . ..... ",
+".... . . . . .. ",
+"... . . . . ... ",
+".... . . . . .. ",
+"... . . . ..... ",
+".... . . . .... ",
+"..... . . ..... ",
+"...... . . .... ",
+"....... . ..... ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" ... . .........",
+" .. . . ........",
+" ... . . ... ...",
+" .. ...         ",
+" . . .          ",
+" .. .    ...... ",
+" ...   . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+" .... .  ...... ",
+" ...   . ..  .. ",
+" .... .. ... .. ",
+" ....  . ...... ",
+" .... .  ...... ",
+"                ",
+"................",
+"................",
+"................",
+"                ",
+"                ",
+" ...............",
+" ...........   .",
+" ...............",
+" ..... .........",
+" ...............",
+"                ",
+" ... . ..... ...",
+" .............. ",
+" . . ... . . . .",
+"              . ",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"             .. ",
+"             .. ",
+"...........  .. ",
+"...........  .. ",
+"...........  .. ",
+"...... ....  .. ",
+"...........  .. ",
+"  .........  .. ",
+"  .........  .. ",
+". .........  .. ",
+"  .........  .. ",
+". .........  .. ",
+" ...   . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+" .... .  ...... ",
+" ...   . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+" .... .  ...... ",
+" ...   . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+" .... .  ...... ",
+" ...   . ...... ",
+" .... .. ..  .. ",
+" ....  . ... .. ",
+" .... .  ...... ",
+" ............  .",
+" ............ ..",
+" ....     ...  .",
+" ....  ..  .. . ",
+" ....  ..  ..  .",
+" ....     ... ..",
+" ....    ....  .",
+" ....  .  ... . ",
+" ....  ..  ..   ",
+" ............  .",
+" ............   ",
+"       .........",
+" ...... ........",
+"      . ........",
+" .... . ........",
+"               .",
+"  .........  .. ",
+". .........  .. ",
+"  ..... ...  .. ",
+". .........  .. ",
+"  .........  .. ",
+". .........  .. ",
+"             .. ",
+" ........... .. ",
+".. . . . ..  .. ",
+".......... .... ",
+"          ..... ",
+"..... .. ...... ",
+"..... .. ... .. ",
+".     ..     .. ",
+". .......... .. ",
+". . ...... .    ",
+" ...   . ...... ",
+" .... .. .......",
+" ....  . .......",
+" .... .  .......",
+" ...   . ...... ",
+" .... .. .......",
+" ....  . .......",
+" .... .         ",
+" ...     ... ...",
+" ....  ... ... .",
+" ....           ",
+" ...............",
+" ... ... ... ...",
+" ...............",
+" ...............",
+"                ",
+"               .",
+".............   ",
+".............  .",
+".............  .",
+"............    ",
+".............  .",
+".............  .",
+"               .",
+" ... ... ...  ..",
+".. ... ... . ...",
+"            ... ",
+"................",
+" ... ... ... .. ",
+"................",
+"................",
+"                ",
+". .. .... ..... ",
+"  ... .. ...... ",
+"... ...... .... ",
+".... .... ..    ",
+"  ... .. ... .. ",
+". . ...... . .. ",
+". .. .... .. .. ",
+". ... .. ... .. ",
+"  .......... .. ",
+"  .......... .. ",
+". .......... .. ",
+"       ...   .. ",
+". ..   ... .... ",
+" ..... ... .... ",
+".....  ... .... ",
+"                ",
+"                ",
+" ...............",
+" ...............",
+" ...............",
+" ... ...        ",
+" ......   . . . ",
+" ..... . .......",
+" .... .  .......",
+" ... . . .......",
+" ...  .. .......",
+" ... . . .......",
+" ... ..  .......",
+" ...   .        ",
+" ...  ..        ",
+" ... .   . . .  ",
+" ... .. . . . . ",
+"                ",
+"................",
+"................",
+"........... ....",
+"      ..........",
+". . . .. .....  ",
+"....  .......  .",
+"..... ...... . .",
+"....  ..... .  .",
+"..... .....  . .",
+"....        .  .",
+"..... ..... .. .",
+"     .      .  .",
+"    .......  . .",
+"   ........ .. .",
+"  .. .... .  . .",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+" ...       . .. ",
+"      . . . ... ",
+" .   .....  ... ",
+".. . ...... ... ",
+"..   .....   .. ",
+"..   ...... ... ",
+".. . .....  ... ",
+"..   ...... ... ",
+"..          ... ",
+"..  ...... .... ",
+"..         .... ",
+".........  .... ",
+" ... .   . . .  ",
+" ...  . . . . . ",
+" ... .   . . .  ",
+" ... .. . . . . ",
+" ... .   .      ",
+" ...  . .   . . ",
+" ... .   . .....",
+" ...  . .. .....",
+" ... . . . .....",
+" ...  ...  .....",
+" ... . . . .....",
+" ... .. .. .....",
+" ... . . . .....",
+" ...  ...  .....",
+" ... . . . .....",
+" ... .. .. .....",
+".... ...... .  .",
+"...... ....  . .",
+"........... .  .",
+"........... .. .",
+"   .     .. .   ",
+".  .  ..  .   . ",
+".. .  ..  .  ...",
+".  .     ..     ",
+".. .    ........",
+".  .  .  .......",
+".. .  ..  ......",
+".  .............",
+"..              ",
+". . . . . . . . ",
+"................",
+"............... ",
+".......... . .. ",
+".........  .... ",
+".......... .... ",
+".........  .... ",
+"           . .. ",
+" ........ ..... ",
+"..  .  . ...... ",
+"        ....... ",
+".....  . ... .. ",
+"..           .. ",
+".    . . . . .. ",
+".   .......  .. ",
+"  . ........ .. ",
+" .  .......  .. ",
+"    ........ .. ",
+"  . .......  .. ",
+" ... . . . .....",
+" ...  . .  .....",
+" ... . . . .....",
+" ... .. .. .....",
+" ...   . .      ",
+" ...  ... ......",
+" ... . . .. . . ",
+" ... .. ........",
+" ... . .. . . . ",
+" ...  ......  ..",
+" ...            ",
+" ...............",
+" ... ... ... ...",
+" ...............",
+" ...............",
+"                ",
+"................",
+"............... ",
+"................",
+"............... ",
+"                ",
+"............... ",
+"..  .. . . . . .",
+"............. ..",
+".... . . . . ...",
+".  .......  . ..",
+"           .. ..",
+".............   ",
+" ... ... ... ...",
+"................",
+"................",
+"                ",
+" .  ........ .. ",
+"  . .......  .. ",
+"    ........ .. ",
+" .  .......  .. ",
+"  .          .. ",
+".           ... ",
+".   . .  . .... ",
+"........... ... ",
+" . . . . ..  .. ",
+" . . . . .. ... ",
+"........... ... ",
+"      ..... ... ",
+" ...  .....  .. ",
+"..... ..... ... ",
+"..... ..... ... ",
+"                ",
+"..........      ",
+"        .       ",
+" ....... . .....",
+" ...... .. .....",
+" ..... . . ...  ",
+" .... ...  .. . ",
+" ... . . . ..  .",
+" .. ... .. ...  ",
+" .. .. . . .....",
+" ..   ...  .....",
+" ..  . . . .....",
+" .. . . .. .....",
+" .. .. . . .. . ",
+" .. . ...       ",
+" ..  . . .......",
+" .. ... ........",
+"    ............",
+"                ",
+"..  .......     ",
+"..  ......  ....",
+"..      .   ....",
+" .  ....  . ....",
+" .  .... .. ....",
+"..  ....    ....",
+"..  ....    ....",
+"..  ....  . ....",
+"..  .... .. ....",
+"..  ....  . ....",
+"..  .... .  ....",
+"    ....    ....",
+".. .....  .     ",
+". ...... . .....",
+"................",
+"                ",
+"                ",
+"..............  ",
+"..  ..........  ",
+"..............  ",
+"..............  ",
+"........... ..  ",
+"... ...... ...  ",
+".. ...... ....  ",
+". ............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"                ",
+"..............  ",
+" .. ..          ",
+" .. .  .........",
+" ..  . .........",
+" ..  . ........ ",
+" .. .. .......  ",
+" .. .  .. ... . ",
+" ..  . ..... .. ",
+" .. .. .... ... ",
+" .. .. ... . .  ",
+" .. .  .. ... . ",
+" ..  . . . . .. ",
+" .. ..  ... ... ",
+" .. .. . . . .  ",
+" .. . ... . . . ",
+" ..  . . . . .. ",
+" .. ... ... ... ",
+" .......  ......",
+"         .......",
+" ...............",
+"                ",
+"                ",
+"................",
+".......     ....",
+".......  ..  ...",
+".......  ..  ...",
+".......     ....",
+".......    .....",
+".......  .  ....",
+".......  ..  ...",
+"................",
+"................",
+"................",
+"............. . ",
+".            .. ",
+"  .......... .. ",
+"    ........ .. ",
+"    ........ .. ",
+"..  ........ .. ",
+"..  ........ .. ",
+"..  ........ .. ",
+"..  ........ .. ",
+"..  ........ .. ",
+"..              ",
+"..  ..........  ",
+"..  ..........  ",
+"..  ........ .  ",
+"..  ..........  ",
+"..  ..........  ",
+" .. .. . . . .  ",
+" ..   ... ...  .",
+" ..  . . . .  ..",
+" .. ... . .  ...",
+" .. .. . .  ... ",
+" .. . ...  .....",
+" ..  . .  . . . ",
+" ..  ..  .......",
+" .. ..  . .. . .",
+" .. .  .........",
+" ..   .... . . .",
+" ..  ......  ...",
+" ..             ",
+" ...............",
+" ...............",
+"                ",
+"                ",
+"................",
+" . . . . . . . .",
+"................",
+". . . .  .  . . ",
+".............. .",
+". . .........   ",
+".....  . . .....",
+". .......... .. ",
+"...... . ..... .",
+" . . ........ . ",
+".......  ... ...",
+"                ",
+"................",
+"................",
+"                ",
+"    .. .......  ",
+"..   . .......  ",
+". .. . .......  ",
+" . . . .......  ",
+"..............  ",
+"..............  ",
+"              . ",
+" ... ... ...  . ",
+". . . . . . ... ",
+".. ... ...  ... ",
+". . . . . ..... ",
+" ... ...  ..... ",
+"        .... .. ",
+"............... ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" ...............",
+" .......        ",
+" ......   . . . ",
+" .....   .......",
+" ..... . .......",
+" ..... . .......",
+" ..... . .......",
+" . ... . .......",
+"  . .. . .......",
+" . ... .        ",
+"  . ..  ........",
+" . . .          ",
+" .. ............",
+" . . .        ..",
+"                ",
+"................",
+"................",
+"  ..            ",
+". .             ",
+"   . ...........",
+".  . .. ........",
+"     ...........",
+".  . ...........",
+"     .. ........",
+".  . ...........",
+"   .            ",
+" .  ... .... ...",
+"..              ",
+"................",
+"             ...",
+"                ",
+"............... ",
+"............... ",
+"          ..... ",
+"          ..... ",
+"........  .. .. ",
+".... ...  . . . ",
+"........  .. .. ",
+"........  ... . ",
+".... ...  ..... ",
+"........  ..... ",
+"          ..... ",
+" . ... . ...... ",
+"        ....... ",
+".. . .......... ",
+".. .      ..... ",
+" .. .. .....  ..",
+" ..... .... .   ",
+" ..... ... .....",
+" ..... ......   ",
+"       .....  ..",
+" .......... . ..",
+" ......... .. ..",
+" ............ ..",
+" ...........  ..",
+" .......... . ..",
+" ......... .. ..",
+" ............ ..",
+"       .....  ..",
+" ..... .... .   ",
+" ..... ... .....",
+" ..... ......   ",
+" ..... ..... ...",
+" ...     ... ...",
+"...  . .  .. ...",
+" .  .   .  . ...",
+" . . . . . . ...",
+" .  . . .  . .  ",
+" . . . . . . .  ",
+" .  . . .  . .  ",
+" . . . . . . .  ",
+" .  . . .  . .  ",
+" . . . . . . .  ",
+" .  . . .  . .  ",
+" ..  . .  .. ...",
+" ...     ... ...",
+"............ ...",
+"             ...",
+"..  ..... ..... ",
+".. . .... ..... ",
+".. .. ... ..... ",
+".. ...... ..... ",
+".........       ",
+"   ............ ",
+"..  . ......... ",
+"..  ........... ",
+"   ............ ",
+"  ............. ",
+".  .. ......... ",
+"..  ........... ",
+".........       ",
+".. . .... ..... ",
+".. .. ... ..... ",
+".. ...... ..... ",
+" ..... ...... ..",
+" .....      . ..",
+" .......... . ..",
+" .. ....... . ..",
+" . . ...        ",
+" .. ...  . . . .",
+" . . ..  .......",
+" .. .... .......",
+" ......  .......",
+" ......  .......",
+" ....... .......",
+" ......  .......",
+" ......         ",
+" ......    .    ",
+" ...............",
+"                ",
+"......... . ....",
+"........ . .....",
+"........  . ....",
+"................",
+"              ..",
+" . . . . . .  . ",
+".............   ",
+"............  ..",
+".............   ",
+"............  . ",
+"............. . ",
+"............  . ",
+"              . ",
+"  .          .. ",
+"................",
+"                ",
+".. ...... ..... ",
+"..        ..... ",
+"............... ",
+".          .... ",
+"  . . . .  .... ",
+"  ........ .... ",
+"  .......  .... ",
+"  ........ .... ",
+"  .......  .... ",
+"  ........ .... ",
+"  .......  .... ",
+"           .... ",
+"          ..... ",
+"  .  .   ...... ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" ... . .........",
+" .. . . ........",
+" ... . .........",
+" .. ...         ",
+" . . . .        ",
+" .. .  . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+"                ",
+"................",
+"................",
+"................",
+"                ",
+"                ",
+" ...............",
+" ...............",
+" .............. ",
+" .............. ",
+" ...............",
+"                ",
+" ... . ..... ...",
+" .............. ",
+" . . ... . . . .",
+"               .",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"             .. ",
+"             .. ",
+"...........  .. ",
+"...........  .. ",
+"...........  .. ",
+"....... ...  .. ",
+"...... ....  .. ",
+"  ... .....  .. ",
+"  .. ......  .. ",
+". .........  .. ",
+"  .... ....  .. ",
+". .........  .. ",
+" .... .. ...... ",
+" ....  . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+" .... .. ...... ",
+" ....  . ...... ",
+" ............ ..",
+" ............  .",
+" ....     ... ..",
+" ....  ..  ..  .",
+" ....  ..  .. ..",
+" ....     ...  .",
+" ....    .... ..",
+" ....  .  ...  .",
+" ....  ..  .. . ",
+" ............  .",
+" ............   ",
+"       .........",
+" ...... ........",
+"      . ........",
+" .... . ........",
+"               .",
+"  .........  .. ",
+". .........  .. ",
+"  ..... ...  .. ",
+". .........  .. ",
+"  .........  .. ",
+". .........  .. ",
+"             .. ",
+" ........... .. ",
+".. . . . .. ... ",
+".......... .... ",
+"          ..... ",
+"..... .. ...... ",
+"..... .. ...... ",
+"....      ..... ",
+"...  ....  .... ",
+".. ..    .. ... ",
+" .... .. ...... ",
+" ....  . .......",
+" .... .. ....  .",
+" ....  . ..... .",
+" .... .. ....  .",
+" ....  . .......",
+" .... .. .......",
+" ....  .        ",
+" .... .  ... ...",
+" ....  ... ... .",
+" ....  .        ",
+" ...... . ......",
+" ..... . . .....",
+" .... . . ......",
+" ...............",
+"                ",
+"               .",
+".............   ",
+".............  .",
+".............  .",
+".............   ",
+".............  .",
+".............  .",
+"               .",
+" ... ... ...  ..",
+".. ... ... . ...",
+"            ... ",
+"................",
+"............... ",
+"................",
+"................",
+"                ",
+".  . .. . .  .. ",
+"  . .. ... . .. ",
+". .  .   . . .. ",
+". . .   .  . .. ",
+"  . ... .. . .. ",
+".  . . .. .  .. ",
+".. ..    .. ... ",
+"...  ....  .... ",
+"....      ..... ",
+" .............. ",
+". ....... ..... ",
+" ..... . . .... ",
+". ... . . ..... ",
+" ..... . . .... ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" .. . ..        ",
+" . . ..  .......",
+" .. .. . .......",
+" ....  . .......",
+" ... ... ...... ",
+" .. .. . ..... .",
+" ..  ... .......",
+" .. .. . .......",
+" ..  ... .......",
+" .. .. . .......",
+" ..  ... .......",
+" .. .. . .......",
+" ..  ...        ",
+" .. ..  . . . . ",
+"                ",
+"........... ....",
+"   ....... . ...",
+".. ...... . ....",
+"..              ",
+".. .............",
+".. .............",
+".. .............",
+".. .............",
+".. .............",
+".. .............",
+"..              ",
+".. .............",
+".. ..... . .... ",
+"        . .     ",
+". ...... . ... .",
+"                ",
+"............... ",
+"............... ",
+".           ... ",
+"  ......... ... ",
+". ......... ... ",
+". ......... ... ",
+". ......... ... ",
+". .... .... ... ",
+". ... ..... ... ",
+". ......... ... ",
+"  ......... ... ",
+"  ......... ... ",
+"  ......... ... ",
+"  ......... ... ",
+". ......... ... ",
+" ..  . .........",
+" .. .. .........",
+" ..  . .........",
+" .. .. .... ....",
+" ..  . .........",
+" .. .. .........",
+" ..  . .........",
+" .. .. .... ....",
+" ..  . .........",
+" .. .. .........",
+" ..  . .........",
+" .. .. .........",
+" ..  . .        ",
+" .. ..          ",
+" ..  . . .......",
+" .. .. . .......",
+" ........ . .. .",
+" ........... . .",
+" .......... .  .",
+" ...     ... . .",
+" ...  ..  .... .",
+" ...  ..  .... .",
+" ...     ..... .",
+" ...    ...... .",
+" ...  .  .....  ",
+" ...  ..  ....  ",
+" ............ . ",
+" ...........    ",
+"                ",
+"                ",
+"................",
+"................",
+"  ......... ... ",
+". ......... ... ",
+"  ......... ... ",
+". ......... ... ",
+"  ......... ... ",
+". ......... ... ",
+"  ......... ... ",
+"             .. ",
+" ........... .. ",
+" ........... .. ",
+" ........... .. ",
+" ........... .. ",
+"  .......... .. ",
+"  .......... .. ",
+"  .......... .. ",
+"  .......... .. ",
+" ..  ... .......",
+" .. .. . ... . .",
+" ..  ... .......",
+" .. .. . .......",
+" ..  ... .......",
+" .. .. . .......",
+" ..  ... .......",
+" .. .. .        ",
+" ..  ..  ... ...",
+" .. .. .........",
+" ..    ... ... .",
+" ..  ...........",
+" ..             ",
+" ...............",
+" ...............",
+"                ",
+"................",
+" ...............",
+"................",
+"................",
+"................",
+"................",
+"................",
+"                ",
+" ... ... ... ...",
+"............... ",
+".. ... ... ... .",
+"............. ..",
+"                ",
+"................",
+"................",
+"                ",
+"  .......... .. ",
+"  ....   ... .. ",
+"  .... . ... .. ",
+"  .... . ... .. ",
+"  ....   ... .. ",
+"  .......... .. ",
+"  .......... .. ",
+"  .......... .. ",
+"             .. ",
+"........... ... ",
+".. ... ... .... ",
+"......... ... . ",
+"         ... .. ",
+"........... . . ",
+"............... ",
+"                ",
+"..........      ",
+"         . .....",
+" ........  .....",
+" . . ... . .....",
+"  . ...  . .....",
+" . . . ... .....",
+" .. .  . . .....",
+" ... ..... .....",
+" .. .. . . .....",
+" .. ...... .... ",
+" ..  . . . .....",
+" .. ...... .....",
+" .. .. . .      ",
+" .. . ... ......",
+" ..  . . . ... .",
+" .. ... ........",
+"     .......    ",
+"....      .  ...",
+".... ..... . ...",
+".... .... .  ...",
+"....     . . ...",
+".... ...  .. ...",
+".... ... . . ...",
+".... ... ..  ...",
+".... ... . . ...",
+".... ...  .     ",
+".... ... . .....",
+"....      ......",
+"     ...........",
+"... ........... ",
+"..             .",
+". ............ .",
+"               .",
+".............  .",
+".............  .",
+"... .........  .",
+".. ..........  .",
+".............  .",
+"......... ...  .",
+".............  .",
+"......... ...  .",
+"    .........  .",
+"..  ..... ...  .",
+". . .........  .",
+" ..             ",
+"..              ",
+". . ..........  ",
+"  . ..........  ",
+" .. ..          ",
+" .. .. .........",
+" ..  . ... ... .",
+" .. .. .........",
+" .. .. . ... ...",
+" .. .  .........",
+" ..  . ... ... .",
+" .. .. .........",
+" .. .. . .......",
+" .. .. ....     ",
+" ..  . ...      ",
+" .. .. .. . ....",
+" .. .. . .. ....",
+" .. .   ... ....",
+" ..  ... .. ....",
+" .. ....... ....",
+"           ...  ",
+" ......... ... .",
+" ..     .. .. ..",
+" .  . .  . . ...",
+" . .   . . . . .",
+" .  . .  . .  ..",
+" . . . . . . . .",
+" .  . .  . . ...",
+" . . . . . . . .",
+"      .  . . ...",
+"     . . . . . .",
+"...   .  . . ...",
+"...             ",
+"...             ",
+"................",
+"................",
+"... ..........  ",
+"... ..........  ",
+" .. ..........  ",
+"... ..........  ",
+" .. ..........  ",
+"... ..     ...  ",
+" .. ..  ..  ..  ",
+"... ..  ..  ..  ",
+" .. ..     ...  ",
+"... ..    ....  ",
+" .. ..  .  ...  ",
+"... ..  ..  ..  ",
+"    ..........  ",
+"   ...........  ",
+"..............  ",
+"..............  ",
+" .. .. . .. ... ",
+" .. ....... ....",
+" ..  . . .. ....",
+" .. ....... ....",
+" .. .. . ..    .",
+" .. . .... ..   ",
+" ..  . .. ..  ..",
+" .. .... ..  .  ",
+" .. ... ..  ....",
+" .. .. ..  .  . ",
+" .. . ..  .... .",
+" ..  ..  .  . ..",
+" .. .   ....    ",
+" .....      ....",
+" ...............",
+"                ",
+"................",
+".......... .....",
+"................",
+"................",
+"...        .... ",
+"    .....       ",
+".. .. ..  .... .",
+". .....  .  . ..",
+" .. ..  .... .. ",
+".....  .  . ....",
+". ..  .... .. ..",
+"...  .  . ..... ",
+"    ....    .   ",
+"..      ......  ",
+"................",
+"                ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"       ....     ",
+".....       .. .",
+". ..  .... ..  .",
+"...  .  . .. . .",
+"..  .... .. .. .",
+".  .  . .. ... .",
+"  .... .. .... .",
+" .  . .. .. .. .",
+"....    .. . . .",
+"    ....... .. .",
+".......... ... .",
+"               .",
+"................",
+"................",
+"                ",
+" ...............",
+" ...............",
+" ......... . ...",
+" ... . .... . ..",
+" .. . .... . .. ",
+" ... . ...  .. .",
+" ...  ... ....  ",
+" .. .......... .",
+" .........      ",
+" ........       ",
+" .......   .....",
+" ......  . .....",
+" .....  .  ... .",
+"......          ",
+".....           ",
+"     . .........",
+"... .  .........",
+".. . . .. .... .",
+". . .  .........",
+" . . . .........",
+". . .  .........",
+" . . . .........",
+". . .  .........",
+" . . . .........",
+"       .........",
+"      ....     .",
+"......... ..... ",
+"........ ..   ..",
+"....... ...   ..",
+"   .............",
+"   .............",
+".             ..",
+".  .......... ..",
+".  .......... ..",
+".  .......... ..",
+".  .......... ..",
+".  .......... ..",
+".  .......... ..",
+".  .......... ..",
+".  .......... ..",
+".               ",
+".               ",
+"..............  ",
+" .............  ",
+". ......... ..  ",
+" ....  . . .....",
+" ...  . .  .....",
+" ..  . . . .....",
+" .  . . .  .....",
+" . . . . . ... .",
+" .  . . .  .....",
+" . . . . . .....",
+" .  . . .       ",
+" . . . .  ......",
+" .  . .  . . . .",
+" . . .  ........",
+" .  .  . . . . .",
+" . .  ..........",
+" .   . . . . . .",
+" .  ...  ...... ",
+" .              ",
+"....... .       ",
+"....... .       ",
+"....... .       ",
+"....... ...   ..",
+"........ ..   ..",
+"......... ..... ",
+"..........     .",
+"       .........",
+".....  .........",
+" . .   .........",
+"...  . .........",
+" .  .  .........",
+".  . . .........",
+"  . .  .........",
+" . . . .........",
+". . .  .. .... .",
+". ............  ",
+". ............  ",
+". ............  ",
+". ............  ",
+" .......... ..  ",
+"..............  ",
+"..............  ",
+"..              ",
+".  ........... .",
+".   . . . . . ..",
+".  .........  ..",
+".   . . . . . ..",
+".  ....... .. ..",
+".   . . . ... ..",
+".  ..... .... ..",
+".  .    ..... ..",
+" ..... . ..... .",
+" ..    .    ..  ",
+" .. .......    .",
+" .. .  .......  ",
+" .. .......    .",
+" .. .  .... ..  ",
+" .. .....   .. .",
+"    ....... ..  ",
+" .......... .. .",
+"    ....... ..  ",
+" .. .  .  . ..  ",
+" .. ....... ....",
+" .. .  .  . ....",
+" ..         ....",
+" ...............",
+"                ",
+" . . . .........",
+". . .  .........",
+" . . .          ",
+". . . ..........",
+" . . . . . . . .",
+". . ........... ",
+" . . . . . . . .",
+". ........... ..",
+" . . . . . . ...",
+".....  .... ....",
+"           .....",
+".. ..... .......",
+".. ..... .......",
+". .     . ......",
+" . ..... . .....",
+"                ",
+".  .......... ..",
+".  .......... ..",
+"   ... . .... ..",
+". ... . ..... ..",
+" ....  . .... ..",
+"....  ....... ..",
+".... ........ ..",
+"............. ..",
+"............. ..",
+"........ .... ..",
+"....... . ... ..",
+"...... . .... ..",
+".....   . ... ..",
+"..... ....... ..",
+"............. ..",
+"              ..",
+"                ",
+" ...............",
+" ... ...........",
+" .. . . .....   ",
+" ... . . ...  ..",
+" .... . ... . ..",
+" ... . ... .. ..",
+" ........ ... ..",
+" . ..... .... ..",
+" .. ... .. .. ..",
+" . ... ..  ..   ",
+"  . .. ..  .    ",
+" . ... .. .. ...",
+"  . .. ..... ...",
+" . ... ... . ...",
+" .. .. ..  . ...",
+"                ",
+"............. . ",
+"............ . .",
+"      ..........",
+".....           ",
+"..... ..........",
+"..... ..........",
+"..... ..........",
+"..... ..........",
+"..... ..........",
+"      ...... . .",
+"     ...........",
+"................",
+"................",
+"................",
+".. .............",
+"                ",
+"............... ",
+".......... . .. ",
+"........... . . ",
+"             .. ",
+"............ .. ",
+"......... .. .. ",
+"............ .. ",
+"......... .. .. ",
+"............ .. ",
+" ........ .. .. ",
+"............ .. ",
+"............ .. ",
+"............ .. ",
+"............ .. ",
+"......... .. .. ",
+" ... . ..  . ...",
+" .. .. .. .. ...",
+" . ... ..... ...",
+" .. .. ... . ...",
+" . ... ..  . ...",
+" .. .. ..  . ...",
+" . . . .. .. .. ",
+" .. .. ..... ...",
+" . ... ... . .. ",
+" .. .. ..  . ...",
+" . ... ..  . ...",
+"  .... .. .. ...",
+" . ... ..... ...",
+" ..... ... . ...",
+" . ... ..  . ...",
+" .. .. ..  . ...",
+"................",
+"................",
+".. .............",
+"................",
+"................",
+".. .............",
+"............... ",
+" . ..........  .",
+". . . ......  ..",
+".. . . .... . . ",
+"... . . .. ..  .",
+".. . . .  . .   ",
+"... . .  . . ...",
+".... .  . . ..  ",
+"..... .  . ..   ",
+"......  . ..   .",
+"........ ... .. ",
+".....     .. .. ",
+"...... ..... .. ",
+"..... ...... .. ",
+"...   ...... .. ",
+".   . ...... .. ",
+" . .. ...... .. ",
+". ... ...... .. ",
+" .... ...... .. ",
+"..... ...... .. ",
+"..... ...... .. ",
+"      ...... .. ",
+".... ....... .. ",
+"... ........ .. ",
+".. ......... .. ",
+". .......... .. ",
+" . ... .. .. ...",
+" .. .. .....    ",
+" . ... .... ....",
+" ..... ... ...  ",
+" . ... .. ...   ",
+" ..... . .......",
+" .....  ........",
+" .....          ",
+" ...............",
+" . . . ........ ",
+" .. . ........ .",
+" . . . ........ ",
+" .. . ..........",
+" ... . .........",
+" ...............",
+"                ",
+".......  .......",
+"        ....... ",
+"..........   ...",
+" .......     ...",
+".......  . . ...",
+"......  . . ....",
+".....  . . .....",
+".               ",
+" . .............",
+". ............. ",
+" . ........... .",
+". ............. ",
+" ............. .",
+"................",
+"................",
+"                ",
+" ........... .. ",
+"             .. ",
+"...........  .. ",
+"...   ....  ... ",
+"..   ....  .... ",
+"........  ..... ",
+".......  ...... ",
+"        ....... ",
+"............... ",
+"............... ",
+" ..... ........ ",
+". ... . ....... ",
+" ... . . ...... ",
+"..... . ....... ",
+".... . ........ ",
+"                ",
+"                ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"................",
+"................",
+".....      .....",
+"....  ...   ....",
+"...  .....  ....",
+"...  ...........",
+"...  ...........",
+"...  ...........",
+"...  ...........",
+"...  ...........",
+"...  .....  ....",
+"....  ...  .....",
+".....     ......",
+"................",
+"................",
+"................",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"                ",
+"                ",
+" . ... ... ... .",
+" ... ... ... ...",
+" . ..  ...      ",
+" ... ...  ......",
+" . ...  ........",
+" ... . .........",
+" . ... .........",
+" . . . ......   ",
+" . ... ..... ...",
+" ... . ..... ...",
+" . . . ..... ...",
+" ... . ..... ...",
+" . ... ......   ",
+" ... . .......  ",
+" . ... ..... . .",
+"                ",
+".. . . ... ... .",
+" ... ... ... ...",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"                ",
+".               ",
+"  ..............",
+"  .....    .....",
+"  ....  ..  ....",
+"  ....  ........",
+"  ....  ........",
+". ....  ........",
+"                ",
+".. ... ... ...  ",
+" ... ... ... .. ",
+"       ... ..   ",
+"......   ... .. ",
+"........ . ...  ",
+"......... .. .. ",
+".........  ...  ",
+"   ...... .  .. ",
+" .. .....  ...  ",
+"  . ..... .. .. ",
+" .. .....  ...  ",
+" .. ..... ..  . ",
+"   ......  ...  ",
+"   ...... .. .. ",
+"  . .....  ...  ",
+" ..  . . ....   ",
+" . ...   ..... .",
+" ... . . ... .  ",
+" . .. .  ....  .",
+" ...   . .....  ",
+" .  . .  ... . .",
+" ...   . ....   ",
+" . .. .  ..... .",
+" ...   . ... .  ",
+" . .. . .....  .",
+" ...   .......  ",
+" . . . ..... . .",
+" ..  . ......   ",
+" . ... ....... .",
+" ... . ..... .  ",
+" . ... ......  .",
+"  ....  ..  ....",
+". .....    .....",
+"  ..............",
+".               ",
+"     ..  ..     ",
+"...          ...",
+"    ........    ",
+"...          ...",
+"    . . . .     ",
+"...  . ... . ...",
+"    . . . .     ",
+"...  . . . . ...",
+"    . . . .     ",
+"... .. . . . ...",
+"    . . . .     ",
+"...  . . . . ...",
+"  ....... .. .. ",
+"   ......  ...  ",
+"  . ..... .. .. ",
+". .......  ...  ",
+"   ...... .. .. ",
+". . .....  . .  ",
+"  ....... .  .. ",
+".  ......  ...  ",
+"  . ..... .. .. ",
+". .......  ...  ",
+"   ...... .. .. ",
+". . .....  ...  ",
+"  ....... .. .. ",
+".  ......  ...  ",
+"  . ..... .. .. ",
+". .......  ...  ",
+" ... . ....     ",
+" . ... ... . . .",
+" ... . ...  . . ",
+" . ... ...      ",
+"       .........",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+" . ... ... ... .",
+" ... ... ... ...",
+" .  .. ... ... .",
+" ... ... ... ...",
+"                ",
+"    . . . .     ",
+".  . . ... . .  ",
+". . . . . . . . ",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"                ",
+".. ... ... ... .",
+" ... ...  .. ...",
+".. ... ... ... .",
+" ... ... ... . .",
+"                ",
+"    ..... ..  . ",
+".. . ....  ..   ",
+". .  .... .. .. ",
+"     ....  ...  ",
+".........       ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"                ",
+".. ... ... ...  ",
+" ... ..  ... .. ",
+".. ... ... . .  ",
+" ... ... ... .. ",
+"                ",
+"                ",
+" . ... ... ... .",
+" ... ....... ...",
+" ..... ... ... .",
+" ... ... ... ...",
+" . ...         .",
+" ... .  ..... ..",
+" . .. . . . .  .",
+" ...  . ..... ..",
+" . .. . .....  .",
+" ...  . . . . ..",
+" . .. . .....  .",
+" ...  .       ..",
+" . ..  .. .. . .",
+" ...         ...",
+" . ...  .. ..  .",
+"                ",
+".. ... ... ... .",
+" ... ... ... ...",
+".. ... ....... .",
+" .     .  .. .. ",
+".. ... . . ..  .",
+" ... ..  ... ...",
+".. ... ...  ....",
+"..   ... . .....",
+". . .. .. .. ...",
+"     ... . .....",
+".. ...  . ......",
+" ... . .........",
+".. .. .... .. ..",
+" ... .... ......",
+" . .  ..........",
+"                ",
+".. ... ... ...  ",
+" ... ...     .. ",
+".. ... ... ...  ",
+"      .. ... .. ",
+"......  .. ...  ",
+"........ ...... ",
+".........  ...  ",
+"...    ... . .. ",
+"..  ..  ... ..  ",
+"..  .......  .. ",
+"..  ........ .  ",
+"..  ........ .. ",
+"..  ..  .... .  ",
+"...    ..... .. ",
+"............ .  ",
+" ..... . ... .. ",
+" . ... ... ... .",
+" ... ..  ... ...",
+" . ... ... ... .",
+" ... ... ... .. ",
+" . ...  .. ...  ",
+" ... . . ....  .",
+" . ... ... .  ..",
+" ... ..  ..  ...",
+" . ... ... ... .",
+" ... ... ... .. ",
+" .....  .. ...  ",
+" ... . . ....  .",
+" . ... ... .  ..",
+" ... ..  ..  ...",
+" . ... ... ... .",
+" ..  ...... ....",
+"..   ..... .....",
+".  . ...........",
+"  ...  ...... ..",
+" ...  ...... ...",
+".. .   .........",
+" ..  . ........ ",
+"..  ..  ........",
+".  . ... . .....",
+"  .... .. ......",
+" ... ...    ....",
+".. ....  . .    ",
+" ... .   ....  .",
+".. ..  ... .   .",
+" ...  .. ..  .. ",
+"...  . ...  ..  ",
+"............ .. ",
+" ........... .  ",
+"...........  .. ",
+".... ... .. ..  ",
+".......... . .. ",
+" ........  ...  ",
+".... ..  ... .. ",
+"... ..  .. ...  ",
+"...... . ... .. ",
+".....  ... ...  ",
+" ..  ... ... .. ",
+"    .. ... ...  ",
+"   . ... .   .. ",
+"   ... ...  ..  ",
+" . . ... .   .. ",
+".  .......  ..  ",
+" ... ... ... ...",
+" . ...  .. .....",
+" ..  . . ... ...",
+" . ... ..   ..  ",
+" ... ..   .  ...",
+" . ... ..   .. .",
+" ... ... ... ...",
+" . ...  .. ..  .",
+" ..  . .  .. .. ",
+" . ... ... ... .",
+" ... ... ... ...",
+" . ....... ... .",
+" ... ... ... ...",
+" . ... ... ... .",
+" ... ... ... ...",
+"                ",
+" .  .....  ..  .",
+".  ... .  ..   .",
+"  .. ..  ..  ...",
+" . ...  ..  .. .",
+" ...   . ... ...",
+".. ... ... ... .",
+" ... ... ... ...",
+" .  .. ..  . .  ",
+" . .  .. ..  . .",
+".. ... ... ... .",
+" ... ....... ...",
+".. ... ...   .  ",
+" ... ...  .     ",
+".. ... ... ... .",
+" ... ... ... ...",
+"                ",
+" ... ... . . .. ",
+".. ... ... ...  ",
+"  .. ... ... .. ",
+".. ... ... ...  ",
+" . . ...  .. .. ",
+".  ... . . ...  ",
+" ... ..  ...... ",
+".. ... ... ...  ",
+"  ..  .. ... .. ",
+".. ... ... ...  ",
+" ..  ....... .. ",
+" . ... ... ...  ",
+" ... ... ... .. ",
+".. ... ... ...  ",
+" ... ... ... .. ",
+"                ",
+"                ",
+" . ... ... ... .",
+" ... ..         ",
+" . ...  . ... ..",
+" ...    ... ... ",
+" . .  . . ... ..",
+" ..  .  ... ... ",
+" .    . . ... ..",
+" ..  .  ... ... ",
+" .  .   ..... ..",
+" ..  .  ... ... ",
+" .    . . ... ..",
+" ..  .  ... ... ",
+" .  .   . ......",
+" ..  .  ... ... ",
+" .    . . ... ..",
+"                ",
+".. ... ... ... .",
+"  .. ... ... ...",
+".               ",
+". ..............",
+". ..............",
+". ............ .",
+". ....... .. ...",
+". .......  .  ..",
+". ..............",
+". ..............",
+". ..... ........",
+". ..............",
+".               ",
+". . . . . . .   ",
+".  . . . . .    ",
+"                ",
+".. ... ... ...  ",
+" ... ... ... .. ",
+"           ...  ",
+"..........   .. ",
+".......... ...  ",
+".......... . .. ",
+".......... ...  ",
+".......... . .. ",
+".......... ...  ",
+".......... . .. ",
+".......... ...  ",
+".......... . .. ",
+"           ...  ",
+"              . ",
+"                ",
+" ..  .  ... ... ",
+" .  .   . ... ..",
+" ..  .  ... ... ",
+" .    . . ... ..",
+" ..  .  ... ... ",
+" .  .   . ... ..",
+" ..  .  ... ... ",
+" .    . . ... ..",
+" ..  .  ... ... ",
+" .  .   . ... ..",
+" ..  .  ... ... ",
+" .    . . ... . ",
+" ..  .  ... ..  ",
+" .  .   . ..... ",
+" ..  .  ..  ..  ",
+" .    .         ",
+".              .",
+".  ... ...   . .",
+". ..  .. .  .  .",
+".   .   .  . . .",
+". .  ...  . .  .",
+".  ..    . . . .",
+".  .  . . . .  .",
+".  ..    . . . .",
+". ..  . . . .  .",
+".  ...   . . . .",
+". ..  . . . .  .",
+".  ...   . . . .",
+"  ..  . . . .  .",
+"   ...   . . . .",
+"  .. .. . . .  .",
+"   .            ",
+"............  . ",
+"............    ",
+"............  . ",
+"..  ........    ",
+"............  . ",
+"..  ........    ",
+"............  . ",
+"....    ....    ",
+"...  ..  ...  . ",
+"...  .......    ",
+"...  .......  . ",
+"...  .......    ",
+"...  ..  ...  . ",
+"....    ....    ",
+"............  . ",
+"..  ........    ",
+" ..  .          ",
+" .  .  . .......",
+" ..   .  .......",
+" .   ... .......",
+" .. . .  ..... .",
+" .  .... .......",
+" .. . .  .......",
+" .  ....        ",
+" .. . . .. . . .",
+" .  .. .........",
+" .. . .. . . . .",
+" .   ...........",
+" ..             ",
+" . ... ... ... .",
+" ....... ... ...",
+"                ",
+"                ",
+"..............  ",
+"..............  ",
+"..............  ",
+".... ...... ..  ",
+".......... ...  ",
+"..............  ",
+"                ",
+" . . . . . ...  ",
+"............. ..",
+" . . . . ...  . ",
+"........... ....",
+"                ",
+".. ... ... ... .",
+" ... ....... ...",
+"                ",
+". .. .......  . ",
+"  .. .. . ..    ",
+"    ........  . ",
+".  .........    ",
+"............  . ",
+"                ",
+". . .. . . . .. ",
+"........... ..  ",
+". .. . . . . .. ",
+".........  ...  ",
+".  . . . ... .. ",
+"  ..... .. ...  ",
+"       . . . .. ",
+".. ... ... . .  ",
+" ... ... ... .. ",
+"                ",
+"                ",
+" . ... ... ... .",
+" ... ... ... ...",
+" . ... ... ...  ",
+" ... ... ...   .",
+" . ... ... .   .",
+" ... . . ..  . .",
+" . ... ...  .  .",
+" ... ...   . . .",
+" . ... .  .    .",
+" ... ..  . . . .",
+" . ...  .   .  .",
+" ... . . . . . .",
+" . ...    .    .",
+" . . . . . . . .",
+" . ...  .   .  .",
+"                ",
+".. ... ... ... .",
+" ... ... ... ...",
+"               .",
+" . . . . . . . .",
+".............   ",
+".....   ......  ",
+".... ... ....  .",
+"...  ... ..... .",
+"...  ... ....  .",
+"...     .. ... .",
+"....   ......  .",
+"........ .....  ",
+"..... .......  .",
+"........... .. .",
+".............  .",
+"                ",
+".. ... ... ...  ",
+" ... ... ... .. ",
+".. ... ... ...  ",
+" ... ... ... .. ",
+"            ..  ",
+". . . . . .  .. ",
+"..........  ..  ",
+"...........  .. ",
+"..........  ..  ",
+"...........  .. ",
+"..........  ..  ",
+"             .. ",
+". ........ ...  ",
+"...... .. .. .. ",
+". ...... . ...  ",
+" ... . . . .   .",
+" . ...    . .  .",
+" . . . . .   . .",
+" . ...  . . .  .",
+" ... . .   .   .",
+" . ...  . . .  .",
+" . . .   .   . .",
+" . ...  . . .  .",
+" ... . .   .   .",
+" . ...  . . .  .",
+" . . .   .   . .",
+" . ...  . . .  .",
+" ... . .   .   .",
+" . ...  . . .  .",
+" . . .   .   . .",
+" . ...  . . .  .",
+".............. .",
+"....    .....   ",
+"...  ..  .....  ",
+"...  ........  .",
+"...  ......... .",
+"...  ........  .",
+" ..  ..  ..... .",
+"....    .....  .",
+" ............. .",
+".............  .",
+" ... ......... .",
+"... ..... ...  .",
+"........ ..... .",
+".............  .",
+".............. .",
+"......... ...  .",
+".... ..  ... .. ",
+"            ..  ",
+". . . . . .  .. ",
+"..........  ..  ",
+" ..........  .. ",
+"..........  ..  ",
+".. ........  .. ",
+"..........  ..  ",
+".... ......  .. ",
+"..........  ..  ",
+"...... ....  .. ",
+"..........  ..  ",
+"....   ....  .. ",
+"...  . ...  ..  ",
+". .  . ....  .. ",
+". .    ...  ..  ",
+" ... . .   .   .",
+" . ...  . . .   ",
+" . . .   .   . .",
+" . ...  . . .   ",
+" ... . .   .  ..",
+" . ...  . .  .. ",
+" ... .   .  ....",
+" . ...  .  .. . ",
+" ... . .  ......",
+" . ...   .. . . ",
+" . . .  ...... .",
+" . ...          ",
+" ... ... ... ...",
+" . ... ...      ",
+" ... ... .......",
+"                ",
+"........ ..... .",
+".............  .",
+".............. .",
+"               .",
+"............  ..",
+". . . . . .. ...",
+"........... ....",
+". . . . ..      ",
+".........  . . .",
+"  .   .. .......",
+".... .. .. ... .",
+"                ",
+" ... ........ . ",
+"              . ",
+"................",
+"                ",
+"...   .....  .. ",
+"..........  ..  ",
+".. ... ....  .. ",
+"..........  ..  ",
+"...........  .. ",
+"..........  ..  ",
+"...........  .. ",
+"            ..  ",
+" . . . . . . .. ",
+".........  ...  ",
+".. ... . . . .. ",
+"        .. ...  ",
+"........ ... .. ",
+"   ... ... ...  ",
+"........ ... .. ",
+"                ",
+"..........      ",
+"           .....",
+" ... ...   .....",
+" . . .     .. ..",
+" ... .  .  .....",
+"   ..    . .. ..",
+" ...  . .  .....",
+" .     .   .. ..",
+" .. . . .  .....",
+" .   .   . .....",
+" .. . . .       ",
+" .     .  ......",
+" .. . .  . ..  .",
+"     .   .......",
+" .. . .  .. ... ",
+" .     . .......",
+"      ..........",
+".....           ",
+".....    ... ...",
+".  .. . .  . . .",
+" .. . .  .   .  ",
+" .. . . .. ...  ",
+".  .. .   ..  . ",
+"..... . .. .    ",
+"..... .  .. . . ",
+"..... . ..      ",
+"      .   . . . ",
+".... ..         ",
+" .  ..  . . . . ",
+"......          ",
+"  . .   . . . . ",
+"......          ",
+"................",
+"                ",
+" ... ... ... .. ",
+"                ",
+"              . ",
+" ...........    ",
+" ...........  . ",
+" .......  ..    ",
+" ...... . ..  . ",
+" ...... . ..    ",
+" .......  ..  . ",
+" ...........    ",
+" ...........  . ",
+" ...........    ",
+" ... .......  . ",
+" ..  .......    ",
+" .. . .  ...    ",
+" .   .   ..  ...",
+" .. . .  .   ...",
+" .     .   . ...",
+" .. . .   .  ...",
+" .   .   .   ...",
+" .. . . . .  ...",
+" .     .   . ...",
+" .. . . . .  ...",
+" .   .   .   ...",
+" .. . . . .  ...",
+"       .   . ...",
+"  . . . . .  ...",
+" .   .   .   . .",
+" .. . . . .  ...",
+" .     .   . .. ",
+"          . . . ",
+".........       ",
+"......... . . . ",
+"... .....       ",
+".... .... . .  .",
+".........     ..",
+".    .... .  . .",
+"  ..  ...   ....",
+"  .......  . . .",
+"  ....... ..... ",
+"  .......  . . .",
+"  ..  ...     . ",
+".    ....  .   .",
+".........     . ",
+" . . ....      .",
+".. ......  .  . ",
+" .. ........  . ",
+" ...........    ",
+"              . ",
+"............ .  ",
+" . . . . .   .. ",
+".......... ...  ",
+" . . . .  .. .. ",
+".               ",
+"  ............. ",
+". ............. ",
+"  ...         . ",
+". ..  ..... . . ",
+"  ...... . .  . ",
+". .. .. . ..... ",
+"  ... .. ..  .. ",
+"  ........ .... ",
+" .. . . . .  ...",
+" .   .   .   ...",
+"  . . . . .  ...",
+" .     .   .    ",
+" .. . . . . ....",
+"     .   . .. . ",
+" .. . . . ......",
+" .     . ... . .",
+" .. . . ........",
+" .   . .... ....",
+" .. . ..  .. .  ",
+" .   ...........",
+" ..             ",
+" . ... ...  .. .",
+" ... ... ... ...",
+"                ",
+".........      .",
+"......... ..  . ",
+"......... .    .",
+"              . ",
+"........    .  .",
+".. .. .   .   . ",
+"......         .",
+".. ..         ..",
+". ..............",
+".......... .....",
+".  . . .....  ..",
+"..... ..........",
+"                ",
+".. ... ... ... .",
+" ... . . ... . .",
+"                ",
+"  .. ..  ...... ",
+". .... ........ ",
+"  .. .......... ",
+".              .",
+" .............  ",
+". ...... ....   ",
+"....  .... . .. ",
+"..  .... .. ..  ",
+".......... . .. ",
+" ...... .  ...  ",
+". . .... ... .. ",
+" ...... .. . .  ",
+"       . . . .. ",
+".. ... ...   .  ",
+" ... ... ... .. ",
+"                ",
+"                ",
+" ...............",
+" . ... ... ... .",
+" . ..           ",
+" ...   . . . . .",
+" ...  . . . . . ",
+" . .  ..        ",
+" ...  .. .      ",
+" ...  .. . ...  ",
+" ...  .. . ...  ",
+" . .  .. . ...  ",
+" ...  .. . ...  ",
+" ...  .. . ...  ",
+" . .  .. . ...  ",
+" . .  .. . ...  ",
+" ...  .. .      ",
+"                ",
+"................",
+".. ... ... ... .",
+"   .            ",
+"   . . . .. .. .",
+"   . ... .. .. .",
+" . . . . .. .. .",
+".  . . .........",
+" . . ...........",
+".  . ...........",
+" . . ....    ...",
+".  . ...  ..  ..",
+" . . ...  ......",
+".  . ...  ......",
+" . . ...  ......",
+".  . ...  ..  ..",
+"                ",
+"............... ",
+".. ... ... ...  ",
+"        . ..... ",
+". .. ..  ... .. ",
+". .. .. ....... ",
+". .. .. .. ...  ",
+"....... ...  .. ",
+".......  ... .. ",
+"....... ....... ",
+"..  . . .. ...  ",
+"..  . . ....... ",
+".......  ... .. ",
+"....... ....... ",
+"....... .. ...  ",
+"....         .. ",
+" ...  ..  ..... ",
+" ...  ..        ",
+" . .  . ........",
+" ...   .........",
+" ...            ",
+" ....           ",
+" . ... ... ... .",
+"                ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"        ......  ",
+" ....... .... . ",
+" . ... . .....  ",
+" ....... .......",
+" . . ....    ...",
+".  . ...........",
+" . . ...........",
+".  . ...........",
+"   . ...........",
+"  ..   .....    ",
+".. ... ..... ...",
+"       .....    ",
+"................",
+"................",
+"................",
+"................",
+"                ",
+". . . . . . . . ",
+"                ",
+"... .   ........",
+"... .......  .. ",
+".. ....... .... ",
+".           ..  ",
+"....  . ....... ",
+"...  ..  ... .. ",
+"        ....... ",
+".  ... ... ...  ",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+" ......         ",
+". .... ........ ",
+" ..... ... ...  ",
+"...... ........ ",
+" ... ... .......",
+" ....... .......",
+" . ... .. ......",
+" .. ......      ",
+" ..  ... ... ...",
+" ...............",
+" . ...  .. ... .",
+" ... ...........",
+" ... ... . . ...",
+" ...............",
+" .  .. ... ... .",
+" ..... .... ....",
+" ... ... ... ...",
+" ...............",
+" . ... ... ... .",
+"                ",
+"... .   ........",
+"................",
+"....  ..  ......",
+"  .      ...    ",
+"    .... ... ...",
+".   ....        ",
+"  ..............",
+"  ..............",
+"  ..............",
+"  ..............",
+"  ..............",
+"  ..............",
+"                ",
+"                ",
+".. ... ... ... .",
+"                ",
+"...... . ... .. ",
+"...... .... ... ",
+".....  ... ...  ",
+"     .......... ",
+" ... ... ... .. ",
+"  .. ... ...... ",
+".  ... ... ...  ",
+". ...  ........ ",
+". .. ...  .. .. ",
+". ............. ",
+".  ...  .. ...  ",
+". ............. ",
+"  .. ... ... .. ",
+" .............. ",
+".. ... ... ...  ",
+"                ",
+"                ",
+" ...............",
+" . . . . . . . .",
+" .. . . . . . . ",
+" ... ... ... ...",
+" .. ..... .. .. ",
+" . . . . .  .. .",
+" .. ....  .. .  ",
+" ... ... .   ...",
+" .. ....... .   ",
+" . . . ... .. ..",
+" .. ......... ..",
+" ... ... ...  ..",
+" .. ..  .. .. ..",
+" . . . .   .. ..",
+" .. ...... .. ..",
+"                ",
+"................",
+" . . . . . . . .",
+". . . . . . . . ",
+" ... ...        ",
+".  ....  .......",
+"   ... . .......",
+".  .  .. .......",
+" ...  .. ... . .",
+"      .  ...    ",
+"....     ... . .",
+"....   . .......",
+".     .. .......",
+". ..  .. .......",
+".  .. ..        ",
+". ... . ........",
+"                ",
+"............... ",
+" . . . . . . .  ",
+". . . . . . ... ",
+"             .. ",
+"........... ... ",
+"...........  .  ",
+"........... ... ",
+" ..........  .. ",
+" .......... ... ",
+" ..........  .  ",
+"........... ... ",
+"...........  .. ",
+"........... ... ",
+"           . .  ",
+"......... . ... ",
+" ... ...  ..  ..",
+" .. .... .... ..",
+" . . . ... .. ..",
+" .. ......... ..",
+" ... ... ...  ..",
+" .. ......... ..",
+" . . . ..       ",
+" .. ....        ",
+" ... .. .   . . ",
+" .. .. ..       ",
+" . .  ...   . . ",
+" .. . . .       ",
+" ...   ..   . . ",
+" .. . ...       ",
+" . .  . .   . . ",
+" .. . ...       ",
+". ..   .........",
+". ...           ",
+".  ... ... ... .",
+". ..............",
+". .. ... ... ...",
+". ......        ",
+"       . .......",
+"       . ..    .",
+". . .  . .  ..  ",
+"       . .  ....",
+". . .  . .  ....",
+"       . .  ....",
+". . .  . .  ..  ",
+"       . ..    .",
+". . .  . .......",
+"       . .......",
+"........ ... .. ",
+"        ... ... ",
+".. ... ... . .  ",
+"........... ... ",
+" ... ... ... .. ",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"......          ",
+"......   ... .  ",
+"......   ..  .. ",
+" ...  . .   . . ",
+" .. .  ..       ",
+" . .  ...   . . ",
+" .. . . .       ",
+" ...  ...   . . ",
+" .. . . .       ",
+" . .  ...       ",
+" .. . . .       ",
+" ...  .. .......",
+" .. . . .. .. ..",
+" . .   ........ ",
+" .. .           ",
+" ... . . . . . .",
+" .... . . . . . ",
+" . ... ... ... .",
+"                ",
+". . .  . .......",
+"       . .......",
+". . .  . .......",
+"       . .......",
+". . .  . .......",
+"       . .. ... ",
+"       . .. ... ",
+"       . .. ... ",
+"..... ..        ",
+" ... ...........",
+"... .. ... ... .",
+"   .............",
+" . . . . . . . .",
+". . . . . . . . ",
+".. ... ... ... .",
+"                ",
+"......   ... .. ",
+"......       .. ",
+"......     . .  ",
+"...... .... ... ",
+"...... . ... .. ",
+"... .. .... ... ",
+"... .. ... . .  ",
+"... .. .... ... ",
+"       . ... .. ",
+"........... ... ",
+".. ... ... . .  ",
+"........... ... ",
+" . . . . . . .. ",
+". . . . . . ... ",
+".. ... ... ...  ",
+"                ",
+"                ",
+" ...............",
+" . ... ... ... .",
+" ...............",
+" ... ... ... ...",
+" ......         ",
+" . ...   . . . .",
+" .... . ........",
+" ... .   . . . .",
+" .. . . ........",
+" .   .   . . . .",
+" .. . . ........",
+" ..  .   . . . .",
+" .. . . ........",
+" .   .   . . . .",
+" .. . . ........",
+"                ",
+"................",
+".. ... ... ... .",
+"........        ",
+" ... ..         ",
+"     .   .......",
+" . .   . .......",
+"....  .  .......",
+" .   . . .......",
+"..  . .  .......",
+"   . . . ...... ",
+". . . .  ...... ",
+"   . . . ...... ",
+". . . .  ...... ",
+"   . . . ...... ",
+". . . .  .......",
+"                ",
+"............... ",
+".. ... ... ...  ",
+"            ... ",
+"             .. ",
+"..........  ... ",
+"..........  ..  ",
+"..........  ... ",
+"..........   .. ",
+"    ......  ... ",
+" ..  .....  ..  ",
+" .........  ... ",
+" .........   .. ",
+" .........  ... ",
+" ..  .....  ..  ",
+"    ......  ... ",
+" ..  .   . . . .",
+" .. . . ........",
+" .   .   . . . .",
+" .. . . ........",
+" ..  .   . . . .",
+" .. . . ........",
+" .   .   . . . .",
+" .. . . ........",
+" ..  .   . . . .",
+" .. . . ........",
+" .   .   . . . .",
+" .. . . ........",
+" ..  .   . . . .",
+" .. . . ........",
+" .   .   . . . .",
+" .. . . ........",
+"   . . . .......",
+". . . .  .......",
+"   . . . .......",
+". . . .  .......",
+"   . . . .......",
+". . . .         ",
+"   . .  .. .....",
+". . .  .........",
+"   .  .. . . ...",
+". .  ...........",
+"    .. . . ... .",
+".  .............",
+"  .. . . . . . .",
+". ............. ",
+"  ... .. .. .. .",
+". .. .. .. .. . ",
+"..........   .. ",
+"..........  ... ",
+"..........  ..  ",
+"..........  ... ",
+"..........   .. ",
+"            ... ",
+"...... ... ...  ",
+"......... . ... ",
+" . . ... . . .. ",
+"....... . . ... ",
+" . ... .   ...  ",
+"..... ... . ... ",
+"     . .   . .. ",
+" ........ . ... ",
+" . . . .   ...  ",
+" ........ . ... ",
+" ..  .   . . . .",
+" .. . . ........",
+" .   .   . . . .",
+" .. . . ........",
+" ..  .   . . . .",
+" .. . . ........",
+" .   .          ",
+" .. .  .........",
+" ..   .. . .. . ",
+" ..  .. . .. . .",
+" .             .",
+" ...............",
+" . . . . . . . .",
+"  . . . . . . . ",
+" ...............",
+"                ",
+"             . .",
+". . ... . ..  . ",
+"   . . ... . . .",
+". . ... . ..  . ",
+"  .. . ... . . .",
+". . ... . ..  . ",
+"   . . ... . . .",
+" .. ... . ..  . ",
+" ... . ... . . .",
+"... ... . ..  ..",
+".. . . ... .    ",
+"... ... . ......",
+" . . . . . . . .",
+". . . . . . . . ",
+"................",
+"                ",
+" . . . .   . .. ",
+" ........ . ... ",
+" . . . .   ...  ",
+" ........ . ... ",
+" . . . .   . .. ",
+" ........ . ... ",
+"           ...  ",
+"........ .. ... ",
+". . . . .. . .. ",
+" . . . .... ... ",
+"      .... ...  ",
+"........... ... ",
+" . . . . . . .  ",
+". . . . . . . . ",
+".......... .... ",
+"                ",
+"................",
+"................",
+"                ",
+" ...............",
+" ..   .. . . ...",
+" ... .......... ",
+" . ... ... ...  ",
+" ............   ",
+" ... ... ...   .",
+" ..........   . ",
+" . ... ...   .  ",
+" ........   .   ",
+" ... ...   .   .",
+" ......   .   . ",
+" . ...   .   .  ",
+" .....  .   .   ",
+"....            ",
+"...             ",
+" .  ............",
+".   ............",
+"     ... ... ...",
+"  . ............",
+" .  ............",
+".   ............",
+"     ... ... ...",
+"  . ............",
+" .  ............",
+".   ............",
+"     ... ... .. ",
+"  . ........... ",
+" .  ........... ",
+".   ........... ",
+"                ",
+"                ",
+"..............  ",
+"..............  ",
+" ... ... ... .  ",
+"..............  ",
+"..............  ",
+"..............  ",
+" ... ... ... .  ",
+"..............  ",
+"..............  ",
+"    ..........  ",
+" ..  ... ... .  ",
+" .............  ",
+" .............  ",
+" .............  ",
+" ... ..    .   .",
+" ......   .   . ",
+" . ...   .   .  ",
+" .. ... .   .   ",
+" .   ..    .   .",
+" .  ...   .   . ",
+" . ...   .   .  ",
+" ...... .   .   ",
+" ... ..    .   .",
+" ......   .   . ",
+" . ...   .   .  ",
+" ...... .   .   ",
+" . . ..    .   .",
+" ......   .   . ",
+" . ...   .   .  ",
+" ...... .   .   ",
+"     ... ... .. ",
+"  . ............",
+" .  ............",
+".   ............",
+"     ... ... ...",
+"  . ............",
+" .  ............",
+".   ............",
+"     ... ... ...",
+"  . ............",
+" .  ............",
+".               ",
+"    ... ... ... ",
+"   . . . . . . .",
+"  ... ... ... ..",
+" . . . . . . ...",
+" ..  ... ... .  ",
+"    ..........  ",
+"..............  ",
+"..............  ",
+" ... ... ... .  ",
+"..............  ",
+"..............  ",
+"..............  ",
+" ... ... ... .  ",
+"..............  ",
+"..............  ",
+"                ",
+"... ... ... .. .",
+".. . . . . .  ..",
+". ... ... .. ...",
+" . . ... .  . ..",
+" ... ..    .    ",
+" ......   .    .",
+" . ...   .    ..",
+" ...... .    . .",
+" ... ..     ... ",
+" ... ..    . .  ",
+" . ...    ... . ",
+" ......      .  ",
+" ... ... ...  . ",
+" ..  ....... . .",
+" .   . ... .  . ",
+" .   .......    ",
+" .   ... ... ...",
+" ...............",
+" . ... ... ... .",
+"                ",
+"... ... ... ... ",
+" . . . ... ... .",
+". ... ... ... ..",
+" . . . . ... . .",
+"    ... ... ... ",
+"...  .   . . . .",
+". . .   . ... ..",
+"...             ",
+"    .....    ...",
+".. . ... ..... .",
+".  . ... . ... .",
+" ... ... ...... ",
+" ... ... ... ...",
+"... ..... ......",
+".. ....... ... .",
+"                ",
+"... ... .. .  ..",
+".. . . .. ... ..",
+". ... .. . .. ..",
+" . . .  ..... ..",
+"... .. . ...  ..",
+" . .  ....... ..",
+". .. . ... .. ..",
+"    ......... ..",
+" ... ... ...  ..",
+" . . . . .... ..",
+".. ... ...    ..",
+". . . . .. .. ..",
+" ... ... . .. ..",
+".......... .. ..",
+".. ... ... .. ..",
+"              ..",
+"........        ",
+".......  .......",
+"     . . . ... .",
+" .... .  .......",
+" ... . . .......",
+" .. . .  . ... .",
+" ..  . . ...... ",
+" .. . .      .  ",
+" ..  .  .. .. . ",
+" .. .  .. .. .  ",
+" ..   .. .. . . ",
+" ..  .. ..      ",
+" ..     . . . . ",
+" ....... .   .  ",
+" ...... . . . . ",
+" .....          ",
+" ....           ",
+" ...            ",
+"    . ..........",
+" .    ..........",
+". . . ..........",
+" .    ..........",
+". . . ..........",
+"      ..........",
+". . . ..........",
+" .    ..........",
+". . . ......... ",
+"      ......... ",
+". . . ......... ",
+" .    ......... ",
+". . . ......... ",
+"      ..........",
+"                ",
+"                ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"    ..........  ",
+" ..  .........  ",
+" .............  ",
+" .............  ",
+" .............  ",
+" ..  .........  ",
+"    ..........  ",
+" .... . . . . . ",
+" ... .   .   .  ",
+" ...  . . . . . ",
+" . .            ",
+" ...  . . . . . ",
+" ... .   .      ",
+" . .  . . . . . ",
+" . .            ",
+" ...  . . . . . ",
+" ... .   .   .  ",
+" ...  . . . . . ",
+" ...            ",
+" . .  . . . . . ",
+" ...     .   .  ",
+" ...  . . . . . ",
+" ...            ",
+". . . ..........",
+" .    ..........",
+". . . ..........",
+"      ..........",
+". . . ..........",
+" .    ..........",
+". . . ..........",
+"      ..........",
+". . .           ",
+" .    ... ... ..",
+". .  . . . . . .",
+"    ... . . ... ",
+".  . . . . . . .",
+"  ... ... ... ..",
+" . . . . . . . .",
+"... . . ... . . ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"                ",
+". ... ... ...  .",
+" . . . . . .  ..",
+". . ... . .  ...",
+" . . . . .  . ..",
+". ... ...  .. ..",
+" . . . .  ... ..",
+"... . .  .... ..",
+" ...  . . . .  .",
+" ... .   .    ..",
+" ...  . . .  . .",
+" . .        ... ",
+" ...  . .  . . .",
+" ... .    ... ..",
+" . .  .  . . . .",
+" ...    ... . . ",
+" ...   . . . . .",
+" ...            ",
+" . ....... .. ..",
+" ...............",
+" ...............",
+" ...............",
+" . ... ... ... .",
+"                ",
+" . . . . . . . .",
+". ... ... ... ..",
+" . . . . . . . .",
+". . ... . . ... ",
+" . . . . . . . .",
+". ... ... ... ..",
+" . . . . . . . .",
+"... .   ... . . ",
+" . .   . . . .  ",
+"               .",
+".. .. .... .. ..",
+"................",
+"................",
+"................",
+".. ... ... ... .",
+"                ",
+" . . .  ..... ..",
+". ...  . .... ..",
+" . .  .. .... ..",
+". .  ... .... ..",
+" .       .... ..",
+".  . .  ..... ..",
+"       .. ..  ..",
+" .... .. .. . ..",
+".... .. .. .. ..",
+"............. ..",
+".. .. ....... ..",
+".. .. ....... ..",
+"........ ...  ..",
+"............. ..",
+".. ... ... .. ..",
+"              ..",
+"                ",
+" ...............",
+" .............  ",
+" ...           .",
+" ..  ........  .",
+" . . . . . .   .",
+" . .  .......  .",
+" . . . . . .   .",
+" . . ........  .",
+" . . . . . .   .",
+" . . .... ...  .",
+" . . . . . .   .",
+" . . ........   ",
+" . .            ",
+" .  ...  ...... ",
+" .              ",
+"                ",
+"................",
+"      ..........",
+".....           ",
+"..... ......  ..",
+".....  . . . ...",
+"..... ...... ...",
+".....  . . . ...",
+"..... ...... ...",
+".....  . . . ...",
+"..... ... .. ...",
+".....  . . . .  ",
+"     .......  ..",
+"                ",
+" ......  ...... ",
+"                ",
+"                ",
+"............... ",
+"............... ",
+"             .. ",
+"  .  ....... .. ",
+" . . . . . . .. ",
+"  .   ...... .. ",
+" . . . . . . .. ",
+"  .  ....... .. ",
+" . . . . . . .. ",
+"  .  .... .. .. ",
+".  . . . . . .. ",
+"...  ....... .. ",
+"             .. ",
+" ....   ... ... ",
+"           .... ",
+" ... . . ..... .",
+" .     .       .",
+" .  ... ... ... ",
+" . . ... ... ...",
+" . .. ... ... ..",
+" . .............",
+" . .............",
+" . ... ... .... ",
+" . .. ... ... . ",
+" . . ... ... .. ",
+" . ............ ",
+" . ............ ",
+" .  ... ........",
+" . . ... .......",
+" . .. ... ......",
+" .          ....",
+" ..... . ..... .",
+"       .       .",
+"... ... ... ....",
+" ... ... ... ...",
+". ... ... ... ..",
+"................",
+"    ............",
+" ..  . ...... ..",
+" ............. .",
+" .............. ",
+" .........  ....",
+" ..  .....  . ..",
+"    ......  .. .",
+".............   ",
+"..... ........  ",
+"..    .. .... . ",
+"     ..  ... .. ",
+"....... ....... ",
+"       ........ ",
+" .............. ",
+" ... ... ... .. ",
+" ...        ... ",
+" ..  ...... ... ",
+" ..  .    . ... ",
+" ..  . .. .  .. ",
+" ..  . .. . ... ",
+" ..  . .. . ... ",
+"   . . .. . ... ",
+"...  .    .  .. ",
+"     ...... ... ",
+" ..  ...... ... ",
+" ..         ... ",
+" ... ... ... ...",
+" .......... ....",
+" ......... .....",
+"          ......",
+" ...............",
+" .....   ...... ",
+" .....   ..... .",
+"              ..",
+" ... ... ... .. ",
+" ....       ....",
+" ... ..... .... ",
+" .. ..... ......",
+" .       ... ...",
+" . .... ........",
+" ...............",
+"                ",
+".. .  . ...... .",
+".. ..  ........ ",
+".. .. ..........",
+". ... .. .... ..",
+" ...  . ...... .",
+".....    ...... ",
+".....   ........",
+".....  . .... ..",
+"  ..  . ...... .",
+" . ..  ........ ",
+". ...           ",
+" . .............",
+" ... ... ... ...",
+"................",
+"................",
+"                ",
+" ..        . .. ",
+" .............. ",
+" ...     ...... ",
+" ..  ... ...... ",
+" ..  ... ... .. ",
+" ..  ... ...... ",
+"   . ... ...... ",
+"...  ... ...... ",
+"         ... .. ",
+" ..     ....... ",
+" .............. ",
+"............... ",
+" ... ... ... .. ",
+"............... ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" ...............",
+" ........     ..",
+" ......   .     ",
+" ..... . . .    ",
+" .... . . . .   ",
+" ....  . .      ",
+" ...  . .  ...  ",
+" ... .   . ...  ",
+" ..    . ... .  ",
+" ..  . ... ...  ",
+" ..  ... ... .. ",
+" .. .  ... ...  ",
+" .. . .. ... ...",
+" ... . ... ... .",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"                ",
+"  ... . ..... . ",
+"   . . . . . . .",
+"   .............",
+"   . . . . . . .",
+"    ..... . ....",
+"   . . . . . . .",
+"   .............",
+"   . . . . . . .",
+"  ... . ..... . ",
+" . . . . . . . .",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"             .. ",
+"..... ...... .. ",
+" . . . . . . .. ",
+"............ .. ",
+" ...    .. . .. ",
+". .  ..  ... .. ",
+" ..  ..... . .. ",
+"...  ....... .. ",
+" ..  ..... . .. ",
+"...  ..  ... .. ",
+" ...    .. . .. ",
+" ... ..  ... .  ",
+" .... ...      .",
+" . ...  ..... ..",
+"  . ....        ",
+" ...............",
+"                ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+" ..... . .......",
+" .... . ........",
+" . . . .. ..    ",
+" .. . .  .. ....",
+"                ",
+"..  ....  ..... ",
+".  ..  ....  . .",
+"              ..",
+"............. ..",
+"         ....  .",
+"......... ...  .",
+".......... .. ..",
+"......          ",
+"...... .......  ",
+"...... ....... .",
+"    .. ....... .",
+".... . ....... .",
+".... . ....... .",
+".... .         .",
+" ... .. ... . . ",
+" ........... .. ",
+" . . . . . . .. ",
+"  ....... .. .. ",
+" . . . . . . .. ",
+" ........... .. ",
+" . . . . . . .. ",
+" .... ...... .. ",
+" . . . . . . .. ",
+" ........... .. ",
+" . . . . . . .. ",
+"  ....... .. .. ",
+" . . . . . . .. ",
+" ........... .. ",
+" . . . . . . .. ",
+" .... ...... .. ",
+" . . . . . . .. ",
+" ... .  .. .  . ",
+" .. . ...  ... .",
+" ........  .. . ",
+" ........  .... ",
+" .........  ....",
+" ...... ..      ",
+" ...........   .",
+" ... ...........",
+" ............. .",
+" ........ ... . ",
+" ............. .",
+" ...... ..... . ",
+" ... ......... .",
+" ...............",
+" ...............",
+"                ",
+". .. ...... . . ",
+". .. ...  . . . ",
+". .. ...  . . ..",
+". .. ...  . .  .",
+" ... ...... .  .",
+".... ...... .  .",
+".... ...... . . ",
+". .. ...... . . ",
+" ... ...... . . ",
+".... ...... . . ",
+" ... ...... .  .",
+".... ...... .   ",
+" ... ...... ....",
+".... ...... ....",
+".... ...... ....",
+"                ",
+" ........... .. ",
+" . . . . . . .. ",
+"  ....... .. .. ",
+" . . . . . . .. ",
+" ........... .. ",
+" . . . . . . .. ",
+" .... ...... .. ",
+" . . . . . . .. ",
+"             .. ",
+"........... ... ",
+".......... .... ",
+"          . . . ",
+"............ .. ",
+"........... . . ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" .............. ",
+" .............  ",
+" ... ... ...  . ",
+" ...........  . ",
+" .......... ... ",
+" .........  . . ",
+" ... ...  ..... ",
+" .......  . . . ",
+" ...... ....... ",
+" .....  . . . . ",
+" ...  ......... ",
+" ...  . . . . . ",
+" .. ........... ",
+" .. . . . . . . ",
+"                ",
+"................",
+"           .....",
+"           .....",
+".........  . ...",
+".........  .....",
+".........  .... ",
+".........  ...  ",
+".........  .  ..",
+".........  .  . ",
+".........   ....",
+"...    ..   . . ",
+"..  ..  .  .....",
+"..  .....   . . ",
+"..  .....  .....",
+"..  .....   . . ",
+"                ",
+"............... ",
+"...             ",
+"..              ",
+"  . .........   ",
+"  . .........   ",
+"... .........   ",
+". . .........   ",
+"... .........   ",
+". . .........   ",
+"... .........   ",
+". . .........   ",
+"... .........   ",
+". . .........   ",
+"... .........   ",
+". . .........   ",
+" .. ........... ",
+" .. . . . . . . ",
+" .. ........... ",
+" .. . . . . . . ",
+" .. ........... ",
+" .. . . . . . . ",
+" .. ........... ",
+" .. . . . . . . ",
+" .. ........... ",
+" .. . . . . . . ",
+" .. ........... ",
+" .. . . . . . . ",
+" .. ........... ",
+" .. . . . . .  .",
+" .. ......... ..",
+" .. . . . .  ...",
+"..  ..  .  .....",
+"...    ..   . . ",
+".........  .....",
+".........   . . ",
+".........  .....",
+".........   . . ",
+".........  .....",
+".........   . . ",
+".........  .....",
+".........   . . ",
+".........  .....",
+".........   . . ",
+"           .....",
+"......... . . . ",
+" . . ... .. ....",
+"....... ... . . ",
+"... .........   ",
+". . .........   ",
+"... .........   ",
+". . .........   ",
+"... .........   ",
+". . .........   ",
+"... .........   ",
+". . .........   ",
+"... .........   ",
+". . .........   ",
+"... .........   ",
+". . .........   ",
+"...             ",
+".  .......... . ",
+". .. . . ... .. ",
+" .......... ... ",
+" .. ....... .. .",
+" .. . . .  .....",
+" .. ..... .. . .",
+" .. . .  .......",
+" .. ...         ",
+" .. . . ........",
+" .. ... ........",
+" .. . . ........",
+" .. ...         ",
+" .. .  .........",
+" .. . ......... ",
+" ..  ......... .",
+" ..           ..",
+" ...............",
+" ...............",
+"                ",
+" . ... .... ... ",
+"..... ..... .  .",
+" ... ...... . ..",
+"... .......  ...",
+"                ",
+"....  .  . .....",
+"...  .  ... ....",
+"..  .  ..... ...",
+"  .   .......   ",
+" ..... ..... ...",
+"....... ... ....",
+"........ . .....",
+" ... ...        ",
+"................",
+"................",
+"                ",
+".. . . ... . .. ",
+"......... ..... ",
+" . . ... ...... ",
+"....... ....... ",
+"       . ... .. ",
+"...... ........ ",
+"...... ........ ",
+"...... ........ ",
+"       . ... .. ",
+"..... ......... ",
+".... .......... ",
+"... ........... ",
+"   . ... ... .. ",
+"............... ",
+"............... ",
+"                ",
+"................",
+"................",
+"                ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ......         ",
+" .....   . . . .",
+" .... . ........",
+" ... ..  . . . .",
+" .. ... ........",
+" .. ...  . . .  ",
+" .. . . ......  ",
+" .. ...  . .    ",
+" .. ... .....   ",
+"...........     ",
+"..........      ",
+"        .   ....",
+"........    ....",
+".......     ....",
+"......    . ....",
+".....    .  ....",
+"   .    .   ....",
+" .     .    ....",
+"..    .   . ....",
+"     .   .  ....",
+"    .   .   ....",
+"   .   .    ....",
+"  .   .   . ....",
+" .   .   .  ....",
+".   .   .   ....",
+"               .",
+"               .",
+".............  .",
+".............  .",
+".............  .",
+".............  .",
+".............  .",
+"..    .......  .",
+".  ..  ......  .",
+".  ..........  .",
+".  ..........  .",
+".  ..........  .",
+".  ..  ......  .",
+"..    .......  .",
+".............  .",
+".............  .",
+" .. . .  . .   .",
+" .. ... ..... . ",
+" .. ...  . .    ",
+" ..   . .....   ",
+" ..  ..  . .   .",
+" .. ... ..... . ",
+" .. ...  . .    ",
+" .. . . .....   ",
+" .. ...  . .   .",
+" .. ... ..... . ",
+" .. ...  . .    ",
+" .. . . .....   ",
+" .. ...  . .   .",
+" .. . . ..... . ",
+" .. ...  . .    ",
+" .. ... .....   ",
+"   .   .    ....",
+"  .   .   . ....",
+" .   .   .      ",
+".   .   .       ",
+"   .   .    ..  ",
+"  .   .    ..  .",
+" .   .    ... ..",
+".   .    ..  .. ",
+"   .    ..  ..  ",
+"  .    ... ... .",
+" .    ..  ..  ..",
+".    ..  ..  .. ",
+"    ... ... ... ",
+"   ..  ..  ..  .",
+"  ..  ..  ..  ..",
+" ... ... ... ...",
+".............  .",
+".............  .",
+"               .",
+"              ..",
+"..  ..  ..   . .",
+".  ..  ..   .. .",
+". ... ...  . . .",
+" ..  ..   .. . .",
+"..  ..   . . . .",
+".. ...  .... . .",
+"  ..   . . . . .",
+" ..   ...... . .",
+"...  . . . . . .",
+".   ........ . .",
+"   . . . . . . .",
+"  .......... . .",
+" .. ...  . .    ",
+" .. . . ........",
+" .. ...  . . . .",
+" .. ... ........",
+" .. ...  . . . .",
+" .. . . ........",
+" ..  ..  . . . .",
+" .. ...         ",
+" .. .. .........",
+" .. . ..  ....  ",
+" ..  ...........",
+" ..             ",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+"                ",
+"................",
+" . . . . . . . .",
+"................",
+" . . . . . . . .",
+"................",
+" . . . . . . . .",
+"                ",
+"................",
+"...... .....  ..",
+"..  ............",
+"                ",
+"................",
+"................",
+"................",
+"                ",
+" . . . . . . . .",
+"............ . .",
+" . . . . . . . .",
+"............ . .",
+" . . . . . . . .",
+"............ . .",
+" . . . . . . . .",
+"             . .",
+"........... .. .",
+"  .... ... ... .",
+"......... .... .",
+"         ..... .",
+".............. .",
+".............. .",
+".............. .",
+"               .",
+"................",
+"................",
+"................",
+"                ",
+" ....... ... ...",
+" ..      ...    ",
+" .. ............",
+" .. . ... . ....",
+" .. . ... . ... ",
+"   ........... .",
+" ............  .",
+" .... . . .. .. ",
+" .... . . .  . .",
+"    ...... .. ..",
+" .. .....  . . .",
+" .. .... .. ... ",
+".......         ",
+"......          ",
+".....   ........",
+"     .. ........",
+"...  .  ........",
+" . .. . .. .....",
+".  . .  ........",
+" .. ... ........",
+" . . .  ........",
+". ..... ........",
+" . . .  ........",
+"... ... ........",
+" . . .  ........",
+"..... . ........",
+" . . .  ........",
+"... ... ........",
+"                ",
+"                ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..............  ",
+".    .........  ",
+"  ..  ........  ",
+"  ............  ",
+"  ............  ",
+"  ............  ",
+" .. ...  . . . .",
+" ..  . .. ......",
+" ....  . . . . .",
+" .... . ... ... ",
+" ....    . . . .",
+" ....  ...... ..",
+" ....  . . . . .",
+" .... . ... ... ",
+" ....  . . . . .",
+" .... ... ......",
+" ....  . . . . .",
+" .... . ... ... ",
+" ....  . . . . .",
+" .... ....... ..",
+" ....  . . . . .",
+" .... . ... ... ",
+" . . .  ........",
+". ..... ........",
+" . . .  ........",
+"... ... ........",
+" . . .  ........",
+"..... . ........",
+" . . .  ........",
+"... ... .. .....",
+" . . .  ....... ",
+". .....         ",
+" . . . ... ... .",
+"... . ..........",
+" . . ... ... ...",
+"... ............",
+" . ... ... ... .",
+". ..............",
+"  ..  ........  ",
+".    .........  ",
+"..............  ",
+"..............  ",
+"..............  ",
+"..  ..........  ",
+". .  .........  ",
+" ........ ....  ",
+"..............  ",
+"                ",
+".. ... ... ... .",
+"............. ..",
+" ... ... ... ...",
+"...........  ...",
+".. ... ... . ...",
+"......... .. ...",
+" ....  . . . . .",
+" .... ... ..... ",
+" ....  . . . . .",
+" .... . ... . ..",
+" ....    . . ...",
+" ....  .... ....",
+" ....  . . ... .",
+" .... . . ......",
+" ....  . ... ...",
+" .... . ........",
+" . ..  ... . . .",
+" ....           ",
+" ....... ... ...",
+" .. ............",
+" ...............",
+"                ",
+" ... ... ... ...",
+"................",
+".. ... ... ... .",
+"................",
+" ... ... ... ...",
+"................",
+".. ... ... ... .",
+"................",
+" ....... ... ...",
+"...  .......... ",
+"..  .. ... ... .",
+"                ",
+"................",
+"................",
+"................",
+"                ",
+" ... ... ... ...",
+"....... . .. ...",
+".. ... .. .. ...",
+"..... ... .. ...",
+" ... .. . .. ...",
+"... ..... .. ...",
+".. .. . . .. ...",
+". ....... .. ...",
+"          .. ...",
+"........ ... ...",
+". . . . .... ...",
+"       ....  ...",
+"............ ...",
+"........ . . ...",
+"............ ...",
+"             ...",
+"                ",
+" ...............",
+" . .............",
+" ...............",
+" ...............",
+" ...............",
+" .............. ",
+" ...............",
+" ..             ",
+" .   . . . . .  ",
+" .  ..... ..... ",
+" .   . . . . .  ",
+" .  ........... ",
+" .   . . . . .  ",
+" .  . ....... . ",
+" .              ",
+"                ",
+"................",
+".....           ",
+"....   . . . . .",
+"....  ..........",
+"....   . . . . .",
+"....  ....... ..",
+"....   . . . . .",
+"....            ",
+"....   ...  ... ",
+"....            ",
+"     ...........",
+"................",
+"................",
+".....  .  .  .  ",
+".....  .........",
+"                ",
+"............... ",
+"            ... ",
+" . . . . .  . . ",
+"........... ... ",
+" . . . . .  ... ",
+"..... ..... ... ",
+" . . . . .    . ",
+"            . . ",
+" ...  ...  .. . ",
+"          ... . ",
+"............. . ",
+"............. . ",
+"............. . ",
+".  .  .  .  . . ",
+".  .  .  .  . . ",
+" .            ..",
+" . .............",
+" . .............",
+"              . ",
+" .    ..  ... . ",
+" . . .     . ...",
+" .   ..  ...  . ",
+" .          ....",
+" . ... . .......",
+" . .. . ........",
+" . . . .........",
+" .      ........",
+" ....... ...... ",
+"         ...... ",
+" ...............",
+" ...............",
+".....  ...    ..",
+".........  ..  .",
+".....  ..  .....",
+" ........  .....",
+" ........  .....",
+".....  ..  ..  .",
+" ....  ...    ..",
+"................",
+".....  .  .  .  ",
+"................",
+"................",
+"                ",
+"................",
+"                ",
+"................",
+"................",
+".  .  .  .  . . ",
+"............. . ",
+".  .  .  .  . . ",
+"............. . ",
+"............. . ",
+".  .  .  .  . . ",
+".  .  .  .  . . ",
+"............. . ",
+".  .  .  .  . . ",
+"............. . ",
+"............. . ",
+"              . ",
+"............... ",
+"             .. ",
+"............. . ",
+"..............  ",
+" ...............",
+" ...............",
+"                ",
+" ...............",
+" ...............",
+" ...............",
+" . .............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ... ...........",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+"................",
+"................",
+"                ",
+"................",
+".........       ",
+"........   . . .",
+"........  . . . ",
+"........   . . .",
+"........  . . . ",
+"........        ",
+"........        ",
+"................",
+"................",
+"................",
+"................",
+"                ",
+"............... ",
+"............... ",
+"             .. ",
+"............. . ",
+"      ........  ",
+" . .  ......... ",
+". . . ......... ",
+" . .  ......... ",
+". . . ......... ",
+"      ......... ",
+"    ........... ",
+"..... ......... ",
+"............... ",
+"............... ",
+"........... ... ",
+"                ",
+"............    ",
+"          .  . .",
+" ......... . ...",
+" ........ .. . .",
+" ....... ... ...",
+" ...... .. . . .",
+" ...... .  . ...",
+" ...... . .. . .",
+" ...... .. . ...",
+" .....  .  . ...",
+" ...... . .. .. ",
+" ...... .. . .  ",
+" . .... .  . .  ",
+" ...... . .. .  ",
+" ...... .. . .  ",
+" ...... .  . .  ",
+"                ",
+" . . . . . . .. ",
+".............   ",
+" . . . . ..  .. ",
+".........  .... ",
+" . . ..  ...... ",
+"...... ........ ",
+" . .  ......... ",
+"..... ......... ",
+"..... ......... ",
+"   .. ......... ",
+"..  . ......... ",
+"..... ......... ",
+"..... ......... ",
+"..... ......... ",
+"..  . ......... ",
+"             ...",
+".. . . . . .    ",
+" ........... .. ",
+". .. . . . . .. ",
+".  ......... .. ",
+" .   . . . . .. ",
+". . ........ .. ",
+" .   . . . . .. ",
+". . ........ .. ",
+" .   . . . . .. ",
+". . ........ .. ",
+" .   . . . . .. ",
+". . ........ .. ",
+" .   . . . . .. ",
+". . ........ .. ",
+" .   . . . . .. ",
+" .... . . .. .. ",
+" ...... .. . ...",
+" ...... .  . ...",
+" ...... . .. . .",
+" .. ... .. . ...",
+" ...... .  . . .",
+" ...... . ..    ",
+" ...... ... .  .",
+" ...... .. .  ..",
+" ...... . .  . .",
+" ......  .  ....",
+" ......         ",
+" ...............",
+" .. ....  ......",
+" ....... . .....",
+" .... . . . ....",
+"   .. ......... ",
+"..... ......... ",
+"..... .......   ",
+" . .  .....  . .",
+"..... ..   .. . ",
+" . .     ..... .",
+"                ",
+".... .  . .. ...",
+"... .  .    ....",
+".. .       .... ",
+". .         .. .",
+"                ",
+" .              ",
+" . ............ ",
+" .             .",
+"  ............ .",
+"  . ........ .. ",
+" .   . . . . .. ",
+"  . ........ .. ",
+"     . . . . .. ",
+".   ........ .. ",
+"..  .. . . . .. ",
+"              . ",
+". .  ... .  ... ",
+" .  ... .  .... ",
+".  ... .  ..... ",
+"  ... .  ...... ",
+"        ....... ",
+" .............. ",
+"..  ........... ",
+".. . . .... ... ",
+". . . ......... ",
+" . . ... . . ...",
+"  . . ... . ....",
+" . . . ..  .....",
+" .. . . ....... ",
+" ..  .  ...... .",
+" ............ ..",
+" ........... ...",
+" .. ... .... ...",
+" ... . . . . ...",
+" .. . . . .. . .",
+" ... . . . . . .",
+" .. . .  ... . .",
+" ..  . ..... ...",
+" ........... ...",
+" ........... ...",
+"                ",
+"              ..",
+" ............ ..",
+"               .",
+".......   ..... ",
+"...... ... .....",
+"..... ..... ....",
+"..... ..... ....",
+"..... ..... ....",
+".....  ... .....",
+"......    ......",
+"................",
+"................",
+"................",
+"................",
+"................",
+"                ",
+".  . . ........ ",
+". . .  ........ ",
+"...   ......... ",
+"..... . . ..... ",
+" ..... . ...... ",
+". ... . . ..... ",
+".. .. . .... .. ",
+".. ............ ",
+".. ... .  ..... ",
+" . .... . ..... ",
+" . ... . . .... ",
+" . .... .  .... ",
+".. .......... . ",
+".. ............ ",
+".. ............ ",
+"                ",
+"                ",
+" ...............",
+" ...........    ",
+" ... . ....  . .",
+" .. . ....  ....",
+" . . . ..   ....",
+" .. . .. .  ....",
+" . . ..  .  ....",
+" ..... . .  ....",
+" ....  . .  ....",
+" ... . . .  ....",
+" ..  . . .  ....",
+" ..  . . .  ....",
+" ..  . . .  ....",
+" ..  . .    ....",
+" ..  . . .  ....",
+"                ",
+"................",
+"            ....",
+" . . . . .  ....",
+"...........     ",
+"..........   . .",
+"........... ....",
+"..........  ....",
+"........... ....",
+"..........  ....",
+"........... ....",
+"...... . .      ",
+".......     . . ",
+"......     . ...",
+".......   . . . ",
+"......   . . . .",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"             .. ",
+" . . . . . . .. ",
+"...........  .. ",
+"............ .. ",
+"...........  .. ",
+"............ .. ",
+"...........  .. ",
+"             .. ",
+". . . . . . ... ",
+" . ... . . .... ",
+". . . . . ..... ",
+" . . . . ...... ",
+" ..  .   .  ....",
+" ..  . . .  ....",
+" ..    . .  ... ",
+" ..  . . .  ... ",
+" ..  . . .  ... ",
+" ..  . . .  ... ",
+" ..  . . .  ... ",
+" ..  . . .  ....",
+" ..  . . .  ....",
+" ..  . . .  ....",
+" ..  . .    ....",
+" ..  . . .  ....",
+" ..  .   .  ....",
+" ..  . . .  ....",
+" ..    . .  ....",
+" ..  . . .  ....",
+".......         ",
+"    ..     . . .",
+" ..  ..  .......",
+" .....   ... ...",
+" ......  .......",
+" .....   . ... .",
+" ..  ..  .......",
+"    ..   ... ...",
+".......  .......",
+"......   . ... .",
+".......  .......",
+"......   ... ...",
+".......  .......",
+"......          ",
+".......   . . . ",
+"......   . . . .",
+"           .... ",
+" . . . . . .... ",
+".........  .... ",
+" ... ... . .... ",
+".........  .... ",
+".. ... ... .... ",
+".........  .... ",
+" ... ... . .... ",
+".........       ",
+".. ... ... .... ",
+".........  .... ",
+" ... ... .      ",
+".........  .... ",
+"           .... ",
+". . . . . ..... ",
+" . . . . ...... ",
+" ..  . . .  ....",
+" ..  . . .  ....",
+" ..  . . .  ....",
+" ..  . . .  ....",
+" ..  . . .      ",
+" ..  . .  ......",
+" ..  . .        ",
+" ..  .  ........",
+" ..  .          ",
+" ..   ..........",
+" ..             ",
+" ..  ...........",
+" ..             ",
+" ...............",
+" ...............",
+"                ",
+".......         ",
+"......          ",
+"....... . . . . ",
+"......  ........",
+"        ........",
+"...... .........",
+"      ..........",
+".... ...........",
+"                ",
+".. .............",
+"                ",
+" ...........    ",
+"                ",
+"........... ... ",
+"........... ... ",
+"                ",
+"        .... .. ",
+"        ... . . ",
+". . . . .. . .. ",
+"......  ... . . ",
+"....... .... .. ",
+"......  ....... ",
+"....... ....... ",
+"......  .. .... ",
+"       ........ ",
+"..... ......... ",
+"     ..... . .. ",
+"..  ..... . ... ",
+"   ....... . .. ",
+"......... . ... ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" ...............",
+" ...... ........",
+" ...............",
+" ....           ",
+" ...  . . . . . ",
+" ..    . . . . .",
+" .. . . . . . . ",
+" ..    . . . .  ",
+" .. .          .",
+" ..  .....   . .",
+" ..        . . .",
+" ....... . . . .",
+" ....... . . . .",
+" ....... . . . .",
+"                ",
+"................",
+"............    ",
+" .........   ...",
+"........   . . .",
+"         . . ...",
+". .    . . . . .",
+" .   . . . . ...",
+"   . . . . . . .",
+" . . . . . . ...",
+" . . . . . . . .",
+" . . . . . . ...",
+" . . . . . . . .",
+" . . . . . . ...",
+" . . . . . . . .",
+" . . . . . . ...",
+"                ",
+"............... ",
+"            ... ",
+"........... ... ",
+" . . . . .  ... ",
+"........... ... ",
+" . . . . .  ... ",
+"........... ... ",
+"........ .  ... ",
+"..    ..... ... ",
+".  ..  . .  ... ",
+".  ........ ... ",
+".  ..... .  ... ",
+".  ........ ... ",
+".  ..  . .  ... ",
+"..    ..... ... ",
+" ....... . . . .",
+" ... ... . . . .",
+" ....... . . . .",
+" ....... . . . .",
+" ....... . . . .",
+" ....... . . . .",
+" ....... . . . .",
+" ....... . . . .",
+" ....... . . . .",
+" ....... . . . .",
+" ....... . . . .",
+" ... ... . . . .",
+" ....... . . . .",
+" .......        ",
+" ......  .......",
+" .....   . . . .",
+" . . . . . . . .",
+" . . . . . . ...",
+" . . . . . . . .",
+" . . . . . . ...",
+" . . . . . . . .",
+" . . . . . . ...",
+" . . . . . . . .",
+" . . . . . .    ",
+" . . . . .      ",
+" . . . . .  ....",
+" . . . . .      ",
+" . . . . . .....",
+" . . . .        ",
+"     . .  ......",
+".... . .        ",
+" . . . . .......",
+"........ .  ... ",
+"........... ... ",
+" . . . . .  ... ",
+"........... ... ",
+" . . . . .  ... ",
+"........... ... ",
+" . . . . .  ... ",
+"            ... ",
+"           .... ",
+".........  .... ",
+"           .... ",
+"......... ..... ",
+"          ..... ",
+"......... ..... ",
+"         ... .. ",
+"........ ... .. ",
+" ....    .......",
+" ...  .  . . . .",
+" ...     .......",
+" ...  .  . . . .",
+" ...     .......",
+" ...  .  . . . .",
+" ...     .......",
+" ...  .  . . . .",
+" ...            ",
+" ...  . ........",
+" ...   ... .....",
+" ...  ..........",
+" ...            ",
+" ...............",
+" ...............",
+"                ",
+".... .          ",
+" . . .  ........",
+".... .          ",
+" . . . .........",
+"....            ",
+" . .  ..........",
+"....            ",
+" . . ...........",
+"                ",
+"................",
+".. ....... .....",
+"................",
+"                ",
+"................",
+"................",
+"                ",
+"         ...... ",
+"....... ....... ",
+"        ....... ",
+"....... ....... ",
+"       ........ ",
+"...... ... .... ",
+"       ........ ",
+"..... ......... ",
+"      .. ...... ",
+".... .......... ",
+"..  ........... ",
+".. ............ ",
+"  .......... .. ",
+"......... ..... ",
+"............... ",
+"                ",
+"................",
+"................",
+"......          ",
+"    .  .........",
+" ...   . . . . .",
+" ..  . .........",
+" .  .  . .     .",
+" .     ... . . .",
+" .  .  . .     .",
+" .     .........",
+" .  .  .   . . .",
+" .     ... .....",
+" .  .  . . . . .",
+" .   . ........ ",
+" .  .  . . . .  ",
+" .     ......   ",
+"..............  ",
+"............  ..",
+"            ....",
+"......... ......",
+" . . . . ... ...",
+"....... ........",
+" . . .  ...... .",
+".....  .........",
+" . .   . ... ...",
+"...   ..........",
+" .    .... .....",
+".     ..........",
+"      .. ... ...",
+"      ..........",
+"       .........",
+"      ..........",
+"      ..........",
+".....   ........",
+".. ....   ......",
+".........  .....",
+" ... ... .. ....",
+"............ ...",
+"...... ...... ..",
+"............. ..",
+"........ ... . .",
+".    ......... .",
+"  ..  .... .... ",
+"  ............. ",
+"  ...... ... .. ",
+"  ............. ",
+"  ..  ........  ",
+".    .......... ",
+" .  .  . . .    ",
+" .     ....     ",
+" .  .  . .      ",
+" .     ..       ",
+" .  .  .        ",
+" .   .          ",
+" .  .           ",
+" .             .",
+" .            . ",
+" .           .  ",
+" .          .  .",
+" .         .  . ",
+" .        .  .  ",
+" .       .  .  .",
+" .      .  .    ",
+" .        .  . .",
+"      .. ... ...",
+"     . .........",
+"    .   .. .....",
+"   .  . ........",
+"  .  .   ... ...",
+" .  .  .  ......",
+"   .  . . .... .",
+"  .  . . . .....",
+" .  .   . .  ...",
+".  . . . .  .  .",
+"  . . . .  .  . ",
+" . . . .  .  .  ",
+". . . .  .  .   ",
+" . . .  .  .    ",
+". .    .  .     ",
+" . .  .  .      ",
+"........ ... .. ",
+"............... ",
+".. ....... ... .",
+".............. .",
+" ... ... ...  ..",
+"............. ..",
+"...... ....  ...",
+"........... . ..",
+" ... ...    . ..",
+"........    . ..",
+"         .  . ..",
+"        ... . ..",
+"       . .  . ..",
+"      ..... . ..",
+"     . . .  . ..",
+"    ....... . ..",
+" .    .  .  . . ",
+" .   .  .  . . .",
+" .  .  .  . . . ",
+" . .  .  .   . .",
+" ..  .  . . . . ",
+" .. .  . . . .  ",
+" ..   . . . .  .",
+" ... .   . .  . ",
+" . ..   . .  .  ",
+" ..... .    .  .",
+" .  ...    .  . ",
+"  .  ...  .  .  ",
+"   . ....   .   ",
+" .  .. .....    ",
+" ...............",
+"                ",
+". .  .  .       ",
+" .  .  .        ",
+".  .            ",
+"  .  .          ",
+" .  .          .",
+".  .           .",
+"  .          . .",
+" .          ..  ",
+".          ..  .",
+"           .  . ",
+"         .   . .",
+"        ..      ",
+"      ..........",
+"    ...... .....",
+"................",
+"                ",
+"   . .   .  . ..",
+"  ......... . ..",
+" . . .   .  . ..",
+"........... . ..",
+" . . . . .  . ..",
+"........... . ..",
+" . . . . .  . ..",
+"            . ..",
+" . . . . . .. ..",
+". . . . . ... ..",
+" . . . . .... ..",
+"        ... . ..",
+".......... .. ..",
+" ............ ..",
+"............. ..",
+"              ..",
+"                ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"................",
+"......    ......",
+".......  .......",
+".......  .......",
+".......  .......",
+".......  .......",
+".......  .......",
+".......  .......",
+".......  .......",
+".......  .......",
+".......  .......",
+"......    ......",
+"................",
+"................",
+"................",
+"................",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" ..........   ..",
+" ........... ...",
+" ....   ...   ..",
+" ...     .......",
+" ..... .........",
+" ....  .........",
+" ... . .........",
+" .. . ...... ...",
+" ... ...... ....",
+" .. ............",
+" ...............",
+" ...............",
+" ...............",
+" .......... ... ",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"...    .........",
+".. .... ........",
+".  .... ........",
+".  .... ....... ",
+".  .... ...... .",
+".      ....... .",
+"..    ...... ...",
+".......... ... .",
+"............ ...",
+".............. .",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"....... ....... ",
+"...... ........ ",
+". .... .. . ... ",
+".... ... ...... ",
+".. ... ... .... ",
+" ... ... ...... ",
+".. ... ... .... ",
+" ... ... ... .. ",
+".. ... ... .... ",
+" ... ... ... .. ",
+".. ... ... .... ",
+" ...............",
+" ...............",
+" ...............",
+" ............. .",
+" ... ... ... ...",
+" . ... ... ... .",
+" ... ... ... ...",
+" . ... ... ... .",
+" ... ... ... ...",
+" ......... .....",
+" ...............",
+" ...............",
+" ...............",
+" ............   ",
+" ..........   ..",
+" .........  ....",
+"......    .. ...",
+".......  .......",
+".......  .......",
+".. ....  .......",
+" ......  .......",
+".. ....  .......",
+" ......  .......",
+".. ...    ......",
+" ...............",
+"................",
+"..............  ",
+".............  .",
+".............  .",
+"               .",
+".... ........   ",
+"...  .......  ..",
+" ... ... ...    ",
+".. ...  ....... ",
+"............... ",
+"...      ...... ",
+"...      ...... ",
+".... .. ....... ",
+".... .. ..... . ",
+".... .. ....... ",
+"            ... ",
+"  .  .......... ",
+"            ... ",
+". .. ...... ... ",
+". .. ...... ... ",
+". .. ...... ... ",
+"            ... ",
+". .. ..... .... ",
+" ........ . ....",
+" .........  ....",
+" .......... ....",
+" ..........   ..",
+" ......... ... .",
+" ........ ..... ",
+" .......  ..... ",
+" ...... . ..... ",
+" ...... .. ... .",
+" ...... . .   ..",
+" ....... ... ...",
+" ........   ....",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+".. . ...... .   ",
+"...  .......  ..",
+".... ........ ..",
+"....   ......   ",
+"... ... .... ...",
+".. ..... .. ....",
+".  ..... .  ....",
+" . .....  . ....",
+" .. ... . .. ...",
+" . .   .. . .   ",
+". ... .... ... .",
+"..   ......   ..",
+"................",
+"................",
+"................",
+"                ",
+"          ..... ",
+"............... ",
+"............... ",
+"............... ",
+" .............. ",
+". ...... . .... ",
+". ............. ",
+". ...... . .... ",
+" .............. ",
+"........ . .... ",
+"............... ",
+"......... ..... ",
+"............... ",
+"............... ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" ...............",
+" ...............",
+" ....           ",
+" ...            ",
+" ..   ..........",
+" .  . ... ......",
+" . .  ..........",
+" .  . ... ......",
+" . .  ..........",
+" .  . ... ......",
+" . .  ........  ",
+" .  . ......... ",
+" . .  ......... ",
+" .  . ......... ",
+"                ",
+"................",
+"................",
+"................",
+"        ........",
+"        ........",
+"......  .. .....",
+"......  ....... ",
+"......  .. .... ",
+"......  ....... ",
+"......  ........",
+"......  ........",
+"  ....  ......  ",
+" .....  ...   ..",
+" .....  ..  ....",
+" .....  .   ....",
+"                ",
+"............... ",
+"............... ",
+"......     .... ",
+".....  ... .... ",
+"     . ... .... ",
+" .. .  ... .... ",
+" ..  .     .... ",
+"    . . . ..... ",
+".. ..... ...... ",
+"....   ........ ",
+".   . .  ...... ",
+" .... ...  .... ",
+"..... .....   . ",
+"..... ....... . ",
+"..... ....... . ",
+" . .  ......... ",
+" .  . ......... ",
+" . .  ......... ",
+" .  . ........  ",
+" . .  ..........",
+" .  . ..........",
+" . .  ..........",
+" .  .           ",
+" . . ...........",
+" .  ..  ..  ..  ",
+" .              ",
+" ... ..... . ...",
+" ... ..... . ...",
+" ... ..... . ...",
+" ... ..... . ...",
+" ... ..... . ...",
+" .....  .   ....",
+" .....  . . ....",
+" .....  .   ....",
+"  ....  . . ....",
+"......  .   .. .",
+"......  . . ....",
+"......  .   ....",
+"        . . ....",
+"...... ..   ....",
+"..  . ... . ....",
+"     ....   ....",
+". . . ... . .. .",
+". . . ...   ....",
+". . . ... . ....",
+". . . ...   ....",
+".  .. ... . ....",
+"..... ....... . ",
+"..... ....... . ",
+"..... ....... . ",
+". ... .. .... . ",
+"..... ..... . . ",
+"..... ....... . ",
+"..... ....... . ",
+"..... ....... . ",
+"..... ....... . ",
+"..... ....... . ",
+". ... .. .... . ",
+"..... ..... . . ",
+"..... ....... . ",
+"..... ....... . ",
+"..... ....... . ",
+"..... ....... . ",
+" ... .....  ....",
+" ... .....  ....",
+" ... ...........",
+".   ............",
+" ...............",
+"................",
+" ...............",
+".               ",
+" ...............",
+" ...............",
+" ....       ....",
+" ... . . . .....",
+" ..       ......",
+" . ..... .......",
+" ...............",
+"                ",
+".  .. ...   ....",
+"..... ... . ....",
+"..... ...   .. .",
+"..... ... . ....",
+".... ....   ....",
+"... ..... . ....",
+".. ......   ....",
+"  ....... . ....",
+".........   ....",
+".    .... . ....",
+". .  ....   ..  ",
+".    .... .   ..",
+".........  .....",
+".........       ",
+"................",
+"                ",
+"..... ....... . ",
+". ... .. .... . ",
+"..... ..... . . ",
+"..... ....... . ",
+"..... ....... . ",
+"..... ....... . ",
+"..... ....... . ",
+"..... ....... . ",
+"....   ...... . ",
+".   ...  .... . ",
+" ........  .. . ",
+".        ..   . ",
+"  ..    .... .. ",
+" .....      ... ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" ......         ",
+" .....  ........",
+" ....   ........",
+" ...  . ........",
+" ... .  ........",
+" ...  . ...   ..",
+" ... .  ........",
+" ...  . ...   ..",
+" ... .  ........",
+" ...  . ........",
+" ... .  ........",
+" ...  . ........",
+" ... .  ........",
+" ...  . ........",
+"                ",
+"................",
+"  ..............",
+".. ....         ",
+".. ...  ........",
+"..    . ........",
+"......  ..     .",
+".. .... ........",
+"......  ..     .",
+"....... ........",
+".. ...  ..     .",
+"....... ........",
+"......  ........",
+".. .... ........",
+"......  ........",
+"....... ........",
+"                ",
+"............... ",
+"............... ",
+"              . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"... ......... . ",
+"..   ........ . ",
+" . . .  ........",
+" ...  . ........",
+" . . .          ",
+" ...   .........",
+" . .  ..  ..  ..",
+" ...            ",
+" ..... .  ..  ..",
+" ..... .  ..  ..",
+" ..    .  ..  ..",
+" .. ....  ......",
+" .. ....  ......",
+" .. ............",
+" .. ............",
+" .. ............",
+" .. .. ... .....",
+" .. ............",
+".. ...  ........",
+"....... ........",
+"    ..  ....... ",
+".... .  ......  ",
+".....   .....   ",
+"   .  . ....   .",
+" ..  .  ....  ..",
+" ...  . ........",
+" ... .  ........",
+"        ........",
+"....    ........",
+"....  . ........",
+".... .  ....... ",
+"....    ......  ",
+"....    .....   ",
+"....  . ....   .",
+".   ......... . ",
+"   .......... . ",
+"  ........... . ",
+" ............ . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"... ......... . ",
+"..   ........ . ",
+".   ......... . ",
+"   .......... . ",
+"  ........... . ",
+" ............ . ",
+"............. . ",
+"............. . ",
+" .. ............",
+" .. ............",
+" .. .. ... .....",
+"    ............",
+" ...............",
+" ...............",
+" ..... ... .....",
+"    ............",
+" .. ............",
+" .. ............",
+" .. ............",
+" .. ............",
+" ..       ......",
+" ........ ......",
+" ........ ......",
+"                ",
+".... .  ....  ..",
+"....  . ........",
+"     .  ........",
+" ...  . ........",
+" ... .          ",
+" ...   .........",
+" ...  ....  ....",
+" ...            ",
+" ...............",
+" ........ .     ",
+" . . . . . .....",
+" ........ ..... ",
+" .......       .",
+" ....... .... ..",
+" ...............",
+"                ",
+"............. . ",
+"........ . .. . ",
+"............. . ",
+"............. . ",
+"              . ",
+"............ .. ",
+"  ......... ... ",
+"           .... ",
+"............ .. ",
+"  ............. ",
+" ........... .. ",
+". . . . . . ... ",
+"............... ",
+"............... ",
+"............... ",
+"                ",
+".....           ",
+"      ..........",
+" ..   ..........",
+" .  . .   ......",
+"   .  . . ......",
+"  . . . . ......",
+"   .  ..........",
+"  . . ..........",
+" .    ..........",
+"  . . ..........",
+"   .  ..........",
+"  . . ..........",
+" . .  ..........",
+"  . . ..........",
+" . .  ..........",
+"  . . ......... ",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+".. ....... .....",
+".   .....   ....",
+"   .....   .....",
+"  .....   ..... ",
+"              ..",
+".............   ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+".. .......... . ",
+".   ......... . ",
+"   .......... . ",
+"  ........... . ",
+" . .  ........  ",
+"  . . .......   ",
+" .    ......   .",
+"  . . .....   ..",
+"   .  .. .   ...",
+"  . . ...   ....",
+" . .  ..   .....",
+"  . . ..  ......",
+" .    ..........",
+"  . . .. .......",
+"   .  ..........",
+"  . .           ",
+" . . . . . . . .",
+"  . .           ",
+" . .  ..........",
+"  . . .... .....",
+" .....   .....  ",
+".....   .....   ",
+"....   .....   .",
+"...   .....   ..",
+" .   ... .   ...",
+".   .....   ....",
+"   .....   .....",
+"  ......  ......",
+"................",
+" ....... .......",
+"................",
+"                ",
+" . . . . . . . .",
+"                ",
+"................",
+". ..... ........",
+" ............ . ",
+"............. . ",
+"............. . ",
+"..            . ",
+".. ......... .. ",
+".. ........ ... ",
+".. . .. .. ...  ",
+"..   . .. .. .. ",
+"..          ..  ",
+".. ......... .. ",
+".. ..........   ",
+"   ............ ",
+"  ............. ",
+"         ...... ",
+"........ ...... ",
+".     .. ...    ",
+"   .. ..........",
+" . .  ..........",
+" . .. ..........",
+" . .  ..........",
+" . .. ..........",
+" . .. ...  .  ..",
+" . .  .... . ...",
+" . .. ..........",
+" . .  ..........",
+" . .. ..........",
+" . ..           ",
+" . . ...........",
+" .  ....... ....",
+" .              ",
+" ...............",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+". ...  .........",
+"................",
+"                ",
+"................",
+".... ........ ..",
+"                ",
+"................",
+"                ",
+"  ... .. ... .. ",
+"  ... .. ... .. ",
+"      .. ... .. ",
+" . . ... ... .. ",
+"........ ... .. ",
+"........ ... .. ",
+"........ ... .. ",
+"........     .. ",
+". . . .. ...... ",
+"........ ...... ",
+"         .. ... ",
+"....... .. . .. ",
+"...... .. . ... ",
+"      .... . .. ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ........ . ....",
+" ....... . .....",
+" .....          ",
+" ..... .........",
+" ..... ...      ",
+" ..... ..  .....",
+" ..... . . .....",
+" ..... . . .....",
+" ..... . .      ",
+" ..... .  ......",
+"                ",
+"................",
+"................",
+"...      .......",
+"...      ...... ",
+".... .. ....... ",
+".... .. ..... . ",
+".... .. ....... ",
+"            ... ",
+"  .  .......... ",
+"            ... ",
+". .. ...... ... ",
+". .. ...... ... ",
+". .. ...... ... ",
+"            ... ",
+". .. ..... .... ",
+"                ",
+". .. .......... ",
+". .. .......... ",
+". .. .......... ",
+"  ..         .. ",
+"............ .. ",
+"............ .. ",
+"..........   .. ",
+"............ .. ",
+"  .......... .. ",
+"............ .. ",
+"............ .. ",
+"............ .. ",
+"... .. .. .. .. ",
+"... .. .. .. .. ",
+"             .. ",
+" ..... .        ",
+" ..... .........",
+" ..... .........",
+" ..... .........",
+" ..... .........",
+" ..... .........",
+" ..... ...... ..",
+" ..... .........",
+" ..... .........",
+" ..... .........",
+" .....          ",
+" ........ ......",
+" .... . . .... .",
+" ........ ......",
+" .... . . . .. .",
+" ........   ....",
+"          ......",
+". .. ...........",
+". .. ...........",
+". ..............",
+". ..............",
+".  ..    ..     ",
+"......  ...... .",
+"......  ...    .",
+"......  .....  .",
+"......  ...... .",
+"   ...  ... ... ",
+".. ..    .. ....",
+" . ........ ....",
+".. ........ ....",
+" . . .. . . . ..",
+"..   ......   ..",
+"............... ",
+"............... ",
+"............... ",
+".   ........... ",
+" ... .......... ",
+" . . .......... ",
+" ... ..... .... ",
+".   ........... ",
+".. ............ ",
+". ............. ",
+" .............. ",
+"............... ",
+"............... ",
+"............... ",
+".....     ..... ",
+"....  ... ..... ",
+" ........ . ....",
+" .......... ....",
+" .......... ....",
+" ..........   ..",
+" ......... ... .",
+" ........ ..... ",
+" .......  ..... ",
+" ...... . ..... ",
+" ...... .. ... .",
+" ...... . .   ..",
+" ....... ... ...",
+" ........   ....",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+".. . ...... . ..",
+".... ........ ..",
+".... ........ ..",
+"....   ......   ",
+"... ... .... ...",
+".. ..... .. ....",
+".  ..... .  ....",
+" . .....  . ....",
+" .. ... . .. ...",
+" . .   .. . .   ",
+". ... .... ... .",
+"..   ......   ..",
+"................",
+"................",
+"................",
+"                ",
+"...   ... ..... ",
+"... . ... ..... ",
+"...   ... ..... ",
+"... . ... ..... ",
+" ..   ... ..... ",
+". . . ... ..... ",
+". .   ... ..... ",
+". . .     ..... ",
+" ..  ... ...... ",
+"...     ....... ",
+"............... ",
+"......... ..... ",
+"............... ",
+"............... ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+" ... . . .....  ",
+" ..  . . .......",
+" ... . . .......",
+" ... . . .......",
+" ... . . .......",
+" ... . . ...... ",
+" ... . . .....  ",
+" ... . . ....  .",
+" ...      ..   .",
+" .. ...  ... . .",
+" .......... . ..",
+"                ",
+"................",
+"................",
+".........       ",
+".....           ",
+"....      ......",
+" ..  ...........",
+".. .............",
+". ...... ....  .",
+" ...............",
+" ....... .......",
+"............ ...",
+".... .... ..... ",
+"............ ...",
+"................",
+"........ .......",
+"                ",
+"............... ",
+"............... ",
+" .............. ",
+"    ........... ",
+".     ......... ",
+"....   ...  ... ",
+".....   ....... ",
+"......   ...... ",
+".......   ..... ",
+" ... ...   .... ",
+"........   .... ",
+" . . ....   ... ",
+"..........  ... ",
+"..........  ... ",
+"...........  .. ",
+" ..........   ..",
+" .......... . ..",
+" ......... .  ..",
+" .........    ..",
+" .........    ..",
+" ...... ..  . ..",
+" ......... .  ..",
+" .........     .",
+" .........   . .",
+" .........  .  .",
+" ..........  .  ",
+" .......... . . ",
+" ..........  . .",
+" ... .......  . ",
+" ...........   .",
+" ............ . ",
+".... . . ..    .",
+".... ... ...  ..",
+"............  ..",
+"........ ...  ..",
+"... . . ....  ..",
+" ....... ...  ..",
+"...........    .",
+"........ .......",
+".......  .......",
+".... ...........",
+"........ ... ...",
+" ...............",
+" ..... .. .  . .",
+". .......... ...",
+" . .............",
+". .  ...........",
+".. . ......  .. ",
+"...........  .. ",
+".... ... ..  .. ",
+"...........  .. ",
+"..  .  .. .  .. ",
+"...........  .. ",
+".... ......  .. ",
+"........... ... ",
+".... ... .. ... ",
+"........... ... ",
+" ... ..... .... ",
+"......... ..... ",
+".. .. ... ..... ",
+"........  ..... ",
+".......  ...... ",
+".....   ....... ",
+" ............. .",
+" .............. ",
+" ..  ...........",
+" .   ...........",
+" ..  ...........",
+" ..        ... .",
+" . ....... .....",
+" ........ ......",
+" ...............",
+" ...............",
+" ..... . . .....",
+" .... . . ......",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+" . .  ....... ..",
+". . .    .......",
+"   . . .        ",
+".   . . . . . . ",
+"...      . . .  ",
+".....         ..",
+".....   ........",
+".... .. ........",
+"................",
+"................",
+"................",
+".............. .",
+"................",
+"................",
+"................",
+"                ",
+"....   ........ ",
+".     ......... ",
+" .  ........... ",
+".  ............ ",
+" ......    .... ",
+"......     .... ",
+"..... .    .... ",
+"..... .    .... ",
+"..... .    .... ",
+"..... .    .... ",
+".....  .. ..... ",
+".....    ...... ",
+"............... ",
+"............... ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" ....           ",
+" ...  ..........",
+" ..   ..........",
+" .  . ..........",
+" . .  ..........",
+" .  . ..........",
+" . .  ..........",
+" .  . ..........",
+" . .  ......... ",
+" .  . ........  ",
+" . .  .......   ",
+" .  . ......   .",
+" . .  .....   ..",
+" .  . ....   ...",
+"                ",
+"................",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+" ......... .....",
+"  .......   ....",
+" .......   .....",
+".......   ......",
+"......   .......",
+".....   ........",
+"....   ........ ",
+"                ",
+"............... ",
+"       ........ ",
+"...... ........ ",
+"......        . ",
+"...... ...... . ",
+"...... ...... . ",
+"...... ...... . ",
+"...... . ...  . ",
+"...... ...... . ",
+"...... ...... . ",
+"...... ...... . ",
+"...... . ...  . ",
+"...... ...... . ",
+"...... ...... . ",
+". . .. ...... . ",
+" . .  ...   ....",
+" .  . ...  .....",
+" . .  ..........",
+" .  . ..........",
+" . .  ..........",
+" .  . ..........",
+" . .            ",
+" .   ...........",
+" .  ... .. .. ..",
+" .              ",
+" ...............",
+" .. .           ",
+" . .. ..........",
+" .. . ..........",
+" .... ..........",
+" .. . ..........",
+"...   ......... ",
+"...  .......... ",
+"............... ",
+"............... ",
+"................",
+"................",
+"                ",
+"................",
+" ..  ... ....   ",
+"           .  ..",
+"...........   ..",
+"   .......  . ..",
+".. ..  ... .  ..",
+"..          . ..",
+"..........    ..",
+"......      . ..",
+". . .. . ...  . ",
+". . .. ...... . ",
+". . .. ...... . ",
+". . .. ...... . ",
+"...... . ...  . ",
+"...... ...... . ",
+"       ...... . ",
+"..... ....... . ",
+"     ... ...  . ",
+"............. . ",
+"............. . ",
+"............. . ",
+" ...........  . ",
+"....    ..... . ",
+".....  ...... . ",
+".....  ...... . ",
+" .... ..........",
+" .... ..........",
+" .... ..........",
+"      ..........",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"      ..........",
+" .... ..........",
+" .. .          .",
+" ............. .",
+" .. .......... .",
+" ...... ...... .",
+" .... .... ... .",
+"                ",
+"....       .  ..",
+"....        . ..",
+"..........    ..",
+"..........  . ..",
+".......... .  ..",
+"..........  . ..",
+"....          ..",
+".  .        . ..",
+".          .    ",
+".. ... . .   ...",
+"..          .. .",
+".. .......      ",
+".. ..... .... ..",
+".. ............ ",
+".. ......... ...",
+"                ",
+" ....  .....  . ",
+".....  ...... . ",
+".....  ...... . ",
+"....    ..... . ",
+" ...........  . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"              . ",
+"............ .. ",
+".  .. .. .. ... ",
+"           .... ",
+"............... ",
+"............... ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" .........     .",
+" ........       ",
+" ... ... . ...  ",
+" ...... .  . . .",
+" ..... . . .....",
+" .... . .  . . .",
+" ... . . . .....",
+" .. . . .  . . .",
+" ..  . . . .....",
+" .. . . .  . . .",
+" ..  . . . .....",
+" ..   . .  . . .",
+" ..  .   . .....",
+" .. . . .  . . .",
+"                ",
+"................",
+"................",
+"              . ",
+"             .  ",
+" . . . . . .    ",
+"............   .",
+" . . . . .    ..",
+"..........   ...",
+" . . . .    . ..",
+"........   .  ..",
+" . . .     .  ..",
+"......   ...  . ",
+" . .     . . .  ",
+"....   ......   ",
+" . .   . . .   .",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+" ........... .. ",
+"           .... ",
+".......... .... ",
+".......... .... ",
+".......... . .. ",
+".......... .... ",
+".......... .... ",
+".......... .... ",
+".......... . .. ",
+" ......... .... ",
+".......... .... ",
+".......... .... ",
+" ..  . . . .....",
+" .. . . .  . . .",
+" ..  . . . .....",
+" .. . . .  . . .",
+" ..  . . . .....",
+" .. . . .  . . .",
+" ..  .   . .....",
+" .. . . .  . . .",
+" ..  . . . .....",
+" .. . . .  . . .",
+" ..  . . . .....",
+" ..   . .  . . .",
+" ..  . . . .....",
+" .. . . .  . . .",
+" ..  . . . .....",
+" .. . . .  .. . ",
+"...........   ..",
+" . . . . .   ...",
+".........   . ..",
+" . . . .   .  ..",
+".......   ..  ..",
+" . . .   . .  . ",
+".....   .... .  ",
+" .     . . .    ",
+"...   ......   .",
+" . . . . .    ..",
+"..........   ...",
+" . . . .    . ..",
+"........   .  ..",
+" . . .     .  ..",
+"......   ...  ..",
+". .      . .  ..",
+".......... . .. ",
+".......... .... ",
+".......... .... ",
+".......... .... ",
+".......... . .. ",
+".......... .... ",
+" ......... .... ",
+".......... .... ",
+".......... . .. ",
+".......... .... ",
+".......... .... ",
+"...    ... .... ",
+"....  .... . .. ",
+"....  .... .... ",
+"....  .... .... ",
+"....  .... .... ",
+" ..  .   . .....",
+" .. . . .  .. . ",
+" ..  . . . .....",
+" .. . . .  .. . ",
+" ..  . . . .....",
+" .. . . .       ",
+" ..  . .  ......",
+" ..   .  .......",
+" ..  .  .. . . .",
+" .. .  .........",
+" ..   . ..  . ..",
+" ..  ....  .... ",
+" ..             ",
+" ...............",
+" ...............",
+"                ",
+"....   .....  ..",
+". . . . . .   ..",
+"............  ..",
+". . . . . .   ..",
+"............  ..",
+"                ",
+"............. ..",
+"............ .. ",
+" . . . . .      ",
+".......... .....",
+"  .. . .  ..... ",
+" ....... .......",
+"        ........",
+"................",
+"................",
+"                ",
+" ...  .... . .. ",
+" ..    ... .... ",
+" ......... .... ",
+" ......... .... ",
+".......... . .. ",
+"           .... ",
+"......... ..... ",
+". ...... ...... ",
+"        .... .. ",
+"............... ",
+". . . ......... ",
+"............... ",
+"..... .. ... .. ",
+"............... ",
+"............... ",
+"                ",
+"                ",
+"                ",
+"     ...........",
+"   . .. . ......",
+"  .. ..         ",
+"   . .. ... .. .",
+"   . .. ...  .  ",
+"   . .. ........",
+"  .. .. ........",
+"   . .. ........",
+"        ..    . ",
+".......... ...  ",
+".......... .. . ",
+".......... . .  ",
+".......... .  . ",
+"           . .  ",
+"                ",
+"                ",
+"................",
+"....... ... ... ",
+"                ",
+". ..............",
+".  .............",
+"................",
+"................",
+"................",
+"      .   .     ",
+"..... ....  ....",
+"..... ... . ....",
+"..... .. .  ....",
+"..... ..  . ....",
+"..... .. .  ....",
+"         ....   ",
+"         ....   ",
+"........ .... ..",
+"........ .... ..",
+"         .... ..",
+".. .......... ..",
+". . .........   ",
+".. .............",
+"................",
+"........      ..",
+" .    .  .... . ",
+" ..... . .... ..",
+" .... .  .... ..",
+" ....  . .... ..",
+" .... .  .... ..",
+" ....  . .... ..",
+"                ",
+"      . . . .   ",
+".... . . . . .  ",
+"..... . . .  .  ",
+".... .... . ..  ",
+"..  .... . ...  ",
+" .  ... . ....  ",
+"...... . .....  ",
+"..... . ......  ",
+"..............  ",
+"  ... ........  ",
+". ... ........  ",
+". ... ........  ",
+". ... ........  ",
+". ... ..     .  ",
+". ... .  ... .  ",
+"   .  .... .  . ",
+"  ..  .... . .  ",
+"   .  .... .  . ",
+"   .  .... . .  ",
+"  ..  .... .   .",
+"   .  .... .  . ",
+"   .  .... . .  ",
+"   .  .... .    ",
+"  ..  . .. . .  ",
+"   .  .... .    ",
+"   .  .... . .  ",
+"   .  .... .    ",
+"  ..  . .. . .  ",
+"   .  .... .    ",
+"   .  .... . .  ",
+"   .  .... .    ",
+".               ",
+"  . .. .. .. .. ",
+"  ..............",
+". ............. ",
+"  ............ .",
+". .. ......... .",
+"  ............. ",
+". ............. ",
+"  ...........   ",
+". ............. ",
+"  ............. ",
+". ............. ",
+"  ........   .. ",
+". .. ...... ... ",
+"  ..........    ",
+". ...........   ",
+"                ",
+".. .. .. .. ..  ",
+"............... ",
+" .............. ",
+". ........ ...  ",
+". ............. ",
+" .............. ",
+" .............  ",
+"   ............ ",
+" .............. ",
+" .............  ",
+" .............. ",
+" ..   ......... ",
+" ... ..... ...  ",
+"    ........... ",
+"   ............ ",
+". ...    . . .  ",
+". .....  ... .  ",
+". .....  ... .  ",
+". ...    . . .  ",
+". ... .  ... .  ",
+". ... .      .  ",
+". ... .     ..  ",
+". ... ........  ",
+". ... ........  ",
+". ... ........  ",
+". ...       ..  ",
+". .....  .  ..  ",
+". ....  . . ..  ",
+". ....      ..  ",
+". ....    . ..  ",
+". .........     ",
+"  ..  . .. . . .",
+"   .  .... .  . ",
+"   .  .... . . .",
+"   .  .... .  . ",
+"  ..  . .. . .  ",
+"   .  .... .  . ",
+"   .  .... . .  ",
+"  ..  .... .  . ",
+"   .  . .. . .  ",
+"   .  .... .   .",
+"  ..  .... .   .",
+"   .  .... .    ",
+"   .  .... .....",
+"  ..  ....      ",
+"   .  ..........",
+"                ",
+"  ..............",
+".               ",
+"      ..       .",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"                ",
+".  .. ...  .. ..",
+"   . . .   . . .",
+"                ",
+"................",
+"                ",
+"..........   ...",
+"    .....  . .. ",
+"..............  ",
+"                ",
+"      .    . . .",
+"              ..",
+"............. ..",
+"............. ..",
+"............. ..",
+"............. ..",
+"              ..",
+".  .. ...  . ...",
+"   . . .    ....",
+"           .....",
+"................",
+"                ",
+"................",
+"  ..........   .",
+". ..............",
+". ..............",
+". ..............",
+". ..............",
+". ...           ",
+". ... ........  ",
+". ... ....      ",
+". ... ...  .. . ",
+". ... .. . ..   ",
+". ... . ..    . ",
+". ... ... .. .  ",
+". ... .. .. ..  ",
+". ... . .. ...  ",
+"  ... ........  ",
+"..... ........  ",
+"..... .... ...  ",
+"  . . . . . . . ",
+"                ",
+"   .  ..... .. .",
+"   .  ....      ",
+"   .  ... .. ...",
+"  ..  ..    ....",
+"   .  .  .      ",
+"   .  ..  . ....",
+"  ..  .. .. ....",
+"   .  ..... ....",
+"   .  ..... ....",
+"  ..        ....",
+"   ........ ....",
+"     .  .   ....",
+"            ....",
+"            ....",
+". . .....    .  ",
+"    .....   ..  ",
+" . ...........  ",
+"           .... ",
+".......... .... ",
+".......... .... ",
+"           .... ",
+"............... ",
+".. ............ ",
+".... ...   .... ",
+"........   . .. ",
+"                ",
+" ...............",
+" .              ",
+"                ",
+"                ",
+". .. ......  . .",
+"  ........ .   .",
+" .........   . .",
+"          ..   .",
+"...........  . .",
+".......... .   .",
+".........  . . .",
+"..     . .     .",
+".. ....  . . . .",
+".. ... .  ..   .",
+".. ..    ... . .",
+".. .... ....   .",
+".. ......... . .",
+"                ",
+"             .  ",
+"                ",
+"..... ... . ..  ",
+"..... .... ...  ",
+"..... .. ... .  ",
+"      . . . .   ",
+"........ ... .  ",
+".......... ...  ",
+".... . .. . ..  ",
+".......... ...  ",
+".... . .......  ",
+"..............  ",
+"............ .  ",
+". .........  .  ",
+"..............  ",
+"                ",
+"                ",
+"                ",
+"                ",
+" ...............",
+" ........... ...",
+" ...............",
+" ...............",
+" ...............",
+" ... ....... ...",
+" ...............",
+" ....... .......",
+" . . ...........",
+" . . ....... ...",
+" ...............",
+" .              ",
+" .  . . . . . . ",
+" . ..... . . . .",
+" .  . . . . . . ",
+"                ",
+"................",
+"............ ...",
+"................",
+" ....... .......",
+"................",
+".... ...........",
+"................",
+"........ .......",
+"................",
+".... ....... ...",
+"................",
+"                ",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"                ",
+"................",
+"................",
+"...........   ..",
+"..........   ...",
+"....... . ......",
+"...... . .......",
+"..... . . ......",
+".... . ... .....",
+"... .  .........",
+".....  .........",
+"..... ..........",
+"                ",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"                ",
+"................",
+".... ...........",
+"................",
+" ....... .......",
+"................",
+"............ ...",
+"................",
+"........ .......",
+"................",
+".... ....... ...",
+"................",
+"                ",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"                ",
+"................",
+"...  .          ",
+"......  . . . . ",
+" ..  . ... ... .",
+"......  . . . . ",
+"...... . . . . .",
+"......  . . . . ",
+"...... . . ... .",
+"......  . . . . ",
+".... . . . ... .",
+"......  . . . . ",
+"       . . . . .",
+". . . . . . . . ",
+" . . . . . ... .",
+". . . . . . . . ",
+"                ",
+"............... ",
+"   .  ......... ",
+".  ............ ",
+".. .  .. ...... ",
+".  ............ ",
+" . ......... .. ",
+".  ............ ",
+" . ............ ",
+".  ....... . .. ",
+" . . ..... . .. ",
+".  ............ ",
+" .            . ",
+". . . . . . . . ",
+" . . . . ...  . ",
+". . . . . . . . ",
+" . ..... . . . .",
+" .  . . . . . . ",
+" . ..... ..... .",
+" .  . . . . . . ",
+" . ..... . . . .",
+" .  . . . . . . ",
+" . ..... . . . .",
+" .  . . . . . . ",
+" .              ",
+" ..... ... ... .",
+" . . . . ... . .",
+" . . . ....... .",
+" ..... . ... . .",
+" ..... ... ... .",
+" ... . . ... . .",
+" ..... ....... .",
+" . . . . . . . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"                ",
+"................",
+".... ....... ...",
+"................",
+" ....... .......",
+"................",
+"................",
+"................",
+" . . . . . . . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"                ",
+"................",
+".... ....... ...",
+"................",
+"........ .......",
+"................",
+".... ....... ...",
+"................",
+" . . . . . . . .",
+". . . . . . . . ",
+" ..... . ..... .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"                ",
+"....... .. ...  ",
+".... ..  ... .. ",
+"....... .. ...  ",
+".......  ... .. ",
+"....... .. ...  ",
+".... ..  ... .. ",
+"....... .. ...  ",
+" . . . . . ... .",
+". . . . . . . . ",
+" ..... . .......",
+". . . . . . . . ",
+" . . . . . ... .",
+". . . . . . . . ",
+" . . . . . ... .",
+". . . . . . . . ",
+"       . . . . .",
+"......  . . . . ",
+".... . . . ... .",
+"......  . . . . ",
+" ..... . . ... .",
+"......  . . . . ",
+".... . . . . . .",
+"......  . . . . ",
+" . . . . ...  . ",
+". . . . . . . . ",
+" . ..... ...  . ",
+". . . . . . . . ",
+" . . . . ...  . ",
+". . . . . . . . ",
+" . . . . ...  . ",
+". . . . . . . . ",
+" .            . ",
+".  ............ ",
+" . . ..... . .. ",
+".  ....... . .. ",
+" . ..... ...... ",
+".  ............ ",
+" . . .......... ",
+".  ............ ",
+" ..... . ... . .",
+" ..... ... ... .",
+" ... . . ... . .",
+" ..... ....... .",
+" ...   . ... .  ",
+" ... . ... ... .",
+" ... ... ... ...",
+" ... . ....... .",
+" ... ... ...    ",
+" ... . ... ..  .",
+" ... ... ... .. ",
+" ... . ... ... .",
+" ... ... ... .  ",
+" ...           .",
+" ..  ........  .",
+" .   ........  .",
+" ....... .......",
+"................",
+".... ....... ...",
+"..     .........",
+"   ...          ",
+"..  .  ... ... .",
+" ... ... ... ...",
+"..  .  ... ... .",
+"    .        ...",
+"... . ....  ....",
+" .. . ..  .. ...",
+".   .           ",
+"         .......",
+".......  .......",
+".......  .......",
+"  .....  .......",
+" ...............",
+"................",
+".... ....... .. ",
+"............... ",
+"                ",
+".. ... ... ...  ",
+" ... ... ...    ",
+".. ... ... .    ",
+" ... ... ..     ",
+".. .......  .   ",
+" ... ...   .    ",
+"          . .   ",
+" . . . . . .    ",
+"........  . .   ",
+" . . . . . .    ",
+"........  . .   ",
+" ......  ... .. ",
+"....... .. ...  ",
+"             .. ",
+"............ .  ",
+"......... .. .. ",
+"............ .  ",
+"..... ...... .. ",
+".... ....... .  ",
+"... ........ .. ",
+"......... .. .  ",
+"....  .. ... .. ",
+"... ........ .  ",
+".. ......... .. ",
+"......... .. .  ",
+"............ .. ",
+"             .  ",
+" ..... . . . . .",
+"......  . . . . ",
+".... . . . ... .",
+"......  . . . . ",
+" ..... . . ... .",
+"......  . . . . ",
+".... . . . . . .",
+"......  . . . . ",
+" ..... . . . . .",
+"......  . . . . ",
+".... . . . ... .",
+"......  . . . . ",
+" ..... . . ... .",
+"......  . . . . ",
+".... . . . . . .",
+"......  . . . . ",
+" . ............ ",
+".  ............ ",
+" . . ....... .. ",
+".  ............ ",
+" . ..... ...... ",
+".  ............ ",
+" . . .......... ",
+".  ............ ",
+" . ..... ...... ",
+".  ............ ",
+" . . ....... .. ",
+".  ............ ",
+" . ............ ",
+".  ............ ",
+" . . ....... .. ",
+".  ............ ",
+" . . ........  .",
+" .   ........  .",
+" . . ........  .",
+" .   ........  .",
+" . . ........  .",
+" .   ........  .",
+" . . ........  .",
+" .   ........   ",
+" . .          ..",
+" .  ..... . ....",
+" .              ",
+" ....... .. ....",
+" .....   ..     ",
+" .... . ....   .",
+" ... .   ...   .",
+" ..     ........",
+". .....  .......",
+" ......  .......",
+". .....  .......",
+" ......  .......",
+"  .....  .......",
+".......  .......",
+".......         ",
+"        ........",
+"............ . .",
+".. . ....  .... ",
+"               .",
+". .. ... . ... .",
+"  ..     .     .",
+"...........   ..",
+"...........   ..",
+"................",
+".. . . . . .   .",
+"........  . .   ",
+".... . . . . ...",
+"........  . ....",
+"...... . . .....",
+"........  ......",
+"     ...        ",
+"..... ..........",
+".... . .........",
+" .. . . ........",
+" .   .  ... ... ",
+".     . ........",
+"..   .  ........",
+"... . . ........",
+"...  .  ........",
+".     . ........",
+".........  . .. ",
+"         . ...  ",
+".......  ... .. ",
+"...... ... ...  ",
+"..... ...... .. ",
+".... . ... ...  ",
+"     ... ... .. ",
+"... .. ... ...  ",
+"...  ....... .. ",
+"... .. ... ...  ",
+"...  ... ... .. ",
+"... .. ... ...  ",
+"...  ..  ... .. ",
+"... ..   . ...  ",
+"...  . . ... .. ",
+"... .. . . ..   ",
+" ..... . . . . .",
+"......  . . . . ",
+".... . . . ... .",
+"......  . . . . ",
+" ..... . . ... .",
+"......  . . . . ",
+".... . . . . . .",
+"......  . . . . ",
+" ..... . . . . .",
+"......  . . . . ",
+".... . . . ... .",
+"......  . . . . ",
+" ..... . . ... .",
+"......  . . . . ",
+".... . . . . . .",
+"......  . . . . ",
+" . ..... ...... ",
+".  ............ ",
+" . . .......... ",
+".  ............ ",
+" . ..... ...... ",
+".  ............ ",
+" . . ....... .. ",
+".  ............ ",
+" . ..... ...... ",
+".  ............ ",
+" . . ....... .. ",
+".  ............ ",
+" . ............ ",
+".  ............ ",
+" . . ....... .. ",
+".  ............ ",
+" .   . .........",
+" . . .......    ",
+" . . ...... . ..",
+" .   ..... .    ",
+" . . ..... . .. ",
+" . . ..... .....",
+" . . .....      ",
+" .   ..  . .....",
+" . . ..  . .....",
+" . . ..  . .....",
+" . . ..... .....",
+" .   ..... .....",
+" . . ..... .....",
+" . . ..... .....",
+" . . .....      ",
+" .   ..... .....",
+"................",
+"         .......",
+" .. .. .. ......",
+"       . . .....",
+".. .. . .. .....",
+"...... . . .  ..",
+"   .....   .  ..",
+".. ....  . .  ..",
+".. ..... . .....",
+".. .....   .....",
+".. ....  . .....",
+".. ..... . .... ",
+".. .....   .... ",
+".. ....  . .... ",
+"   ..... . .....",
+". ......   .....",
+". .  .  ........",
+". . . . ........",
+". .  .  ........",
+".     . ........",
+"...  .  ........",
+"...   . ........",
+"...  .  ........",
+".   . . ........",
+". .  .          ",
+". . .           ",
+". .  . .........",
+"  . .  .........",
+"  .  . .........",
+"  . .  .........",
+".    . ... . .  ",
+"...    ...  . . ",
+"...   .. ... .  ",
+"...          .  ",
+"... ......   .  ",
+"...        ..   ",
+"...   .. ... .. ",
+"... .. . . ...  ",
+"...  . . ... .. ",
+"... ..   . ...  ",
+"     ..  ... .. ",
+"   ... ... ...  ",
+".. . ....... ...",
+".. ... ... ... .",
+".. . ... ... ...",
+".. ... .........",
+".. . ... ... ...",
+".. ... ... ... .",
+" ..... . . . . .",
+"......  . . . . ",
+".... . . . ... .",
+"......  . . . . ",
+" ..... . . ... .",
+"......  . . . . ",
+".... . . . . . .",
+"......  . . . . ",
+" ..... . . . . .",
+"        . . . . ",
+" ... . . . ... .",
+".. ...  . . . . ",
+" ... . . . ... .",
+"......  . . . . ",
+" ... . . . . . .",
+".. ...  . . . . ",
+" . ..... ...... ",
+".  ............ ",
+" . . .......... ",
+".  ............ ",
+" . ..... ...... ",
+".  ............ ",
+" . . ....... .. ",
+".  ............ ",
+" . ..... ...... ",
+".  ............ ",
+" . . ....... .. ",
+".  ............ ",
+" . ..... ...... ",
+".  ............ ",
+" . . .......... ",
+".  ............ ",
+" . . ..... .    ",
+" . . ...... ....",
+" . . .......    ",
+" .   ...........",
+" . . ...........",
+" . . ...........",
+" .  . ..........",
+" . ...          ",
+" .. ... ... ... ",
+" ...            ",
+" ... ....... ...",
+" ...............",
+" ....... .......",
+" ...............",
+" ... ....... ...",
+"                ",
+" ......  . .....",
+"....... . ......",
+"         .......",
+"................",
+"...   ..........",
+"...   ..........",
+"................",
+"          ......",
+"... ... .. .....",
+"        ... .  .",
+".... ... .  .  .",
+"......... . .  .",
+" .......    ....",
+".........  .....",
+".... ....  .....",
+"                ",
+"...  . .........",
+".   .           ",
+". .             ",
+". . . ..........",
+". .   ..........",
+".     ..........",
+"...   ..........",
+"... . ..........",
+".               ",
+". .  ...........",
+". .             ",
+". ..............",
+". ...... .......",
+" ...............",
+" ... ....... ...",
+"                ",
+".. . ....... .. ",
+"   ... ... ...  ",
+"  .. ... ... .. ",
+".  ... ... ...  ",
+". .. ....... .. ",
+".  ... ... ...  ",
+". .. ... ... .. ",
+".               ",
+"  ...... .......",
+" ...............",
+".....    ... ...",
+"....  .. .......",
+" ...     .......",
+"....    ........",
+"............ ...",
+"                ",
+"       . . . . .",
+"......  . . . . ",
+".... . . . ... .",
+"......  . . . . ",
+" ..... . . ... .",
+"......  . . . . ",
+".... . . . . . .",
+"......  . . . . ",
+".   .. ... ... .",
+". . ..  . . . . ",
+"...... ... ... .",
+"......  . . . . ",
+" .....          ",
+"................",
+".... .. . .   . ",
+"                ",
+" . ..... ...... ",
+".  ............ ",
+" . . ....... .. ",
+".  ............ ",
+" . ............ ",
+".  ............ ",
+" . . ....... .. ",
+".  ............ ",
+".. ..   ....... ",
+".  .. . ....... ",
+".. ......... .. ",
+".  ............ ",
+"   ..... ...... ",
+"............... ",
+". .. ....... .. ",
+"                ",
+"................",
+"................",
+".......       . ",
+"     .  ......  ",
+" ....   . . .  .",
+" ...  . ..... . ",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+" ..  .  . . .  .",
+" .. . . .. .. . ",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+".               ",
+"                ",
+"  ..............",
+". ..    ........",
+"  ...  .........",
+". ............. ",
+"  ............  ",
+". ..    .....   ",
+"  ...  .....   .",
+". .........   ..",
+"  ........   ...",
+". ..... .   ....",
+"  ......   .....",
+". ......  ..... ",
+"  ..... .. ...  ",
+". ...........   ",
+"................",
+" ...............",
+"  ..............",
+".  .            ",
+" .  ............",
+"  .  ...........",
+" ...  ..........",
+"....  ..........",
+"....  ..........",
+"....  ..........",
+"....  ..........",
+"....  ..........",
+" ...  ..........",
+"  ..  ..........",
+" ...  ..........",
+"....  ......... ",
+"................",
+"................",
+"................",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+". .. .. .. .. . ",
+" .. .. .. .. .. ",
+".. .. .. .. .. .",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+" ..  .  . . .  .",
+" .. . . .. .. . ",
+" ..  .  . . .  .",
+" .. . . .. .. . ",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+"  ..........   .",
+". .........   ..",
+"  ........   ...",
+". ..... .   ....",
+"  ......   .....",
+". ......  ..... ",
+"  ..... .. ...  ",
+". ...........   ",
+"  . ........   .",
+". .........   ..",
+"  ........   ...",
+". ..... .   ....",
+"  . ....   .....",
+". ......  ..... ",
+"  ..... .. ...  ",
+". ...........   ",
+"....  ..........",
+"....  ......... ",
+"....  ..........",
+"....  ..........",
+" ...  ..........",
+"  ..  ......... ",
+" ...  ..........",
+"....  ..........",
+"....  ..........",
+"....  ......... ",
+"....  ..... ....",
+"....  .... ... .",
+" ...  ... ... ..",
+"  ..  ..... ... ",
+" ...  .... .....",
+"....  ... ......",
+" ............ ..",
+"............... ",
+".............. .",
+". ........... ..",
+" .............. ",
+".............. .",
+"............. ..",
+". ............. ",
+" ............. .",
+"............. ..",
+"............... ",
+". ............ .",
+" ............ ..",
+"............... ",
+".............. .",
+"............. ..",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+" ..  .  . . .  .",
+" .. . . ..... . ",
+" ..  .  ... .   ",
+" .. . . .....  .",
+" ..  .  .....   ",
+" .. . . ........",
+"  . ........   .",
+". .........   ..",
+"  ........   ...",
+". ..... .   ....",
+"  . ....   .....",
+". ......  ......",
+"  ..... .. .....",
+". ..............",
+"  ..............",
+". ..............",
+"                ",
+" ............. .",
+".. ... ... .. ..",
+". ... ... .. ...",
+"            ....",
+"................",
+"....  ..... ....",
+"....  .... .....",
+"....  ... ......",
+"....  ..... ....",
+"....  .... .....",
+".... .... ......",
+"... ....... ....",
+".. ....... .....",
+". . ..... ..... ",
+" .. ....... .. .",
+"... ...... ... .",
+"... ..... ....  ",
+"... .   ... ..  ",
+" .. ... .. .....",
+"... ... . ......",
+" .. ... ... .. .",
+"............... ",
+".............. .",
+"............. ..",
+"............. . ",
+"............ . .",
+"........... ... ",
+".  .  ....... . ",
+"   . . ..... .. ",
+" . . . .... ... ",
+" . . . ...... . ",
+"   .   ..... .. ",
+". . . ..... ... ",
+" .   ........ . ",
+"............ .. ",
+"............... ",
+". .. .. .. .. . ",
+" ..  .  ........",
+" .. . . .. .....",
+" ..  .  ........",
+" .. . . .. .....",
+" ..  .  ....... ",
+" .. . . .. ... .",
+" ..  .  ........",
+" .. . .         ",
+" ..  . .........",
+" .. . ...... .. ",
+" ..  ... . ...  ",
+" ..             ",
+" ...............",
+" ..... .........",
+" .... .. .......",
+"                ",
+"................",
+".... .... ......",
+". . ............",
+"   ...... ......",
+". ..............",
+"......... ......",
+"................",
+"                ",
+"................",
+"  ....... ... ..",
+" ... . .... ....",
+"                ",
+"................",
+"................",
+"................",
+"                ",
+"... ... .. .. ..",
+" .. ... . .. .. ",
+"... ... ........",
+" .. ...         ",
+"... ....  ..  . ",
+" .. ....  ..  . ",
+"... ....  ..  . ",
+"    ............",
+".. .............",
+". ...........   ",
+" ............   ",
+"..     ....     ",
+"...... .... ....",
+"...... .... ....",
+"...... .... ....",
+"       .  .     ",
+" .. .. .. .. .. ",
+".. .. .. .. ... ",
+"............... ",
+"              . ",
+" .  ....  ... . ",
+" .  ....  ... . ",
+" .  ....  ... . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"............. . ",
+"     ....     . ",
+".... .... ..... ",
+".... .... ..... ",
+".... .... ..... ",
+"     .  .       ",
+"                ",
+" ...............",
+" ........ ......",
+" ... . .........",
+" .. . ..........",
+" ... . .........",
+" .. . ..        ",
+" ......         ",
+" . . . . .......",
+" .... .  ... ...",
+" . . ... .. . ..",
+" ...  .  ... ...",
+" . . ... .......",
+" ...  .  .......",
+" . . ... ...    ",
+" ...  .  ..  ...",
+"                ",
+"................",
+"....... ........",
+"........ . .....",
+"....... . ......",
+"........ .......",
+"                ",
+"                ",
+"............... ",
+".. ............ ",
+". . ... .  .... ",
+".. ....... .... ",
+"............... ",
+"............... ",
+"                ",
+"................",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+".           ... ",
+". ......... ... ",
+"     ...    ... ",
+" .   ...    ... ",
+" .......... ... ",
+" .......    ... ",
+" .......    ... ",
+" .......... ... ",
+" .  ....... ... ",
+" .  ....... ... ",
+"     ...... ... ",
+".... ... ..     ",
+" . . ... . . .  ",
+" ...  .   .  .  ",
+" . . ... . . . .",
+" ...  . . .  . .",
+" . . . . . . . .",
+" ...  . . .  . .",
+" . .   . . . . .",
+" ...  . . .  . .",
+" . . . . . . . .",
+" ...  . . .  . .",
+" . . . . . . . .",
+" ...  . . .  . .",
+" . . . . . . . .",
+" ...    . .  . .",
+" . .   . . . . .",
+" ...    . .  . .",
+"                ",
+". . . . . . . . ",
+"................",
+"       ..    ...",
+"       ..     ..",
+"  .......  ..  .",
+"  .......  ...  ",
+"  .......  ...  ",
+"      ...  ...  ",
+"      ...  ...  ",
+"  .......  ...  ",
+"  .......  ...  ",
+"  .......  ..  .",
+"  .......     ..",
+"  .......    ...",
+"................",
+"   . .......... ",
+".  . .......... ",
+".. . ......     ",
+".  . ...... ... ",
+".. . ...... ... ",
+".  . ...... ... ",
+".. . ...... ... ",
+".  .          . ",
+".. .          . ",
+".  . .......  . ",
+".. . .. ....  . ",
+".  . ..... .  . ",
+".. . .... ..  . ",
+".  . ... ...  . ",
+".. . .. ....  . ",
+".  . .......  . ",
+" . .   . . . .  ",
+" ...  . . .  ...",
+" . . . . . .    ",
+" ...  . . . ....",
+" . . . . . .....",
+" ...  . . ......",
+" . . . . ....   ",
+" ...  . .... . .",
+" . . . ....     ",
+" ...  .... . . .",
+" ...            ",
+" ........ ..... ",
+" ........ ..... ",
+" .. ..... ..... ",
+" ........ ..... ",
+"                ",
+"                ",
+"................",
+"                ",
+".....    .......",
+".... .. ........",
+"....   .........",
+"    ...       ..",
+" . ... . . . ...",
+"  ...       ....",
+" ... . . . .... ",
+"                ",
+". . ..... ..... ",
+"... ..... ......",
+". . ..... ......",
+"... ..... ......",
+"                ",
+"   . .......  . ",
+".... .......  . ",
+"     .......  . ",
+"... .... ...  . ",
+".. ... .....  . ",
+". ..........  . ",
+"              . ",
+"............ .. ",
+"  .. .. ... ... ",
+" ......... .... ",
+"          ..... ",
+"............... ",
+"............... ",
+"............... ",
+"............... ",
+"                ",
+"                ",
+" ...............",
+" ...............",
+" .... ..........",
+" .   ...... . ..",
+" . . ....... ...",
+" . . ...... . ..",
+" . . ..... .... ",
+" .   ..        .",
+" .....  .       ",
+"  . .   . . .  .",
+" ...  . .       ",
+"  .  .  . . .  .",
+" .. . . .       ",
+"  .  .  . . .  .",
+" .. . . .       ",
+"                ",
+"................",
+"....... .. .....",
+"...... .. ......",
+"..              ",
+".               ",
+" . .............",
+".  .............",
+" . ...      ... ",
+".  ...       .. ",
+" . ...  ...  .. ",
+".  ...  ...  .. ",
+" . ...  ...  .. ",
+".  ...       .. ",
+" . ...      ... ",
+".  ...  ....... ",
+"                ",
+"............... ",
+"............... ",
+"............... ",
+"          ..... ",
+"          ..... ",
+"........  ..... ",
+"........  ..... ",
+"   .....      . ",
+"    ....      . ",
+" ..  ...  . . . ",
+" ...  ..      . ",
+" ...  ..  . . . ",
+" ...  ..      . ",
+" ...  ..  . . . ",
+" ...  ..      . ",
+"  .  .  . . .  .",
+" .. . . .       ",
+"  .  .  . . .  .",
+" .. . . .       ",
+"  .  .  . . .  .",
+" .. . . .       ",
+"  .  .  . . .  .",
+" .. . . .       ",
+"  .  .  .      .",
+" .. . . ......  ",
+"  .  .         .",
+" .. .  .........",
+"  .   ... .. .. ",
+" ..  ...........",
+" ..             ",
+" ...............",
+" . ...  ....... ",
+".  ...  ....... ",
+" . ...  ....... ",
+".  ...  ....... ",
+" . .............",
+".  .............",
+" .              ",
+". ..............",
+" .. .. .. .. .. ",
+"................",
+". .. .. ..... ..",
+"........     ...",
+".. .. . ... .. .",
+".... . ... .. ..",
+"                ",
+".. ........... .",
+" ...  ..  . . . ",
+" ..  ...      . ",
+"    ....  . . . ",
+"   .....      . ",
+"........  . . . ",
+"........      . ",
+"          . . . ",
+"........ .    . ",
+".. .. . .   . . ",
+"...... ...... . ",
+" .. .         . ",
+"............ .. ",
+". .. .. ... ... ",
+".......... .... ",
+"          ..... ",
+"............... ",
+" ...............",
+" .... . .....   ",
+" ... . ..... ...",
+" .... . ... . ..",
+" ..... ... .   .",
+" .........    . ",
+" ........ .. .  ",
+" .... . . ......",
+" ... . .. ......",
+" .... . . ...   ",
+" ........ ... . ",
+" ........ ... . ",
+" . ...... ... . ",
+" ........ ... . ",
+" . ...... ... ..",
+"                ",
+"...           ..",
+"                ",
+"................",
+"................",
+"   .           .",
+".. . ......... .",
+"   .           .",
+"........  .  ...",
+"........  .  ...",
+"........  .  ...",
+".  .  ..........",
+".  .  ......... ",
+".  .  ......... ",
+"                ",
+"................",
+"                ",
+"............... ",
+"     .... . . . ",
+"..... .... . .. ",
+"...... .. . ... ",
+"  ..... .. . .. ",
+" . .... ... ... ",
+"    .... ...... ",
+"........ ...... ",
+"........ ...... ",
+"..   ... ...... ",
+".. . ... .. ... ",
+"   . ... . . .. ",
+"   . ... .. ... ",
+"   . ... . . .. ",
+".... ... ...... ",
+"                ",
+"                ",
+" . ... ... ... .",
+" ....... ... .. ",
+" . ... ... ... .",
+" ....... ... .. ",
+" . .            ",
+" ... ...........",
+" . . ...........",
+"     ...........",
+"................",
+"........ .. .. .",
+"................",
+"     ...........",
+" . . ...........",
+" ... ...........",
+" . . ...........",
+" ...            ",
+" ... . ... ... .",
+" ... ... ... ...",
+" ... . ... ... .",
+" ... ... ... ...",
+" ... ..... ...  ",
+".... ... ..... .",
+".... . ... .. ..",
+".... ... ... ...",
+".... . ....  ...",
+". .. ... .. ... ",
+".... . ...  ..  ",
+".... ....   .   ",
+".... . ..  .. . ",
+".... ... . . .. ",
+".... ... . . . .",
+"                ",
+".. ...         .",
+" ...   .......  ",
+"..  ............",
+"  ..............",
+"......        ..",
+"....  ........  ",
+"..  ............",
+". ....       ...",
+" ...  .......  .",
+"..  ........... ",
+"  ....      ....",
+" ..   ......  ..",
+"..  ..........  ",
+". .. . . . . ...",
+" ...............",
+"                ",
+".. ... ... ...  ",
+" ... ....... .. ",
+".  ... ... ...  ",
+"...  ... ... .. ",
+".....  ... ...  ",
+"...... . ... .. ",
+"  ..... .. ...  ",
+"..  ...  ...... ",
+"...  ... . ...  ",
+" ... ... ... .. ",
+". ..  ...  ...  ",
+"..     .. .. .. ",
+"...    ..  ...  ",
+" ..  .. .. . .. ",
+". .. .. .. ...  ",
+" ... ...........",
+" . . ... .. .. .",
+" ... ...........",
+" . . ...........",
+" ... ...........",
+" . . ...........",
+" ... ...........",
+" . . ...........",
+" ... ... .. .. .",
+" . . ...........",
+" ... ...........",
+" . . ...........",
+" ... ...........",
+" . . ...........",
+" ... ...........",
+" . . ... .. .. .",
+".... .. ..   . .",
+". .. .  ..  ..  ",
+"....    ..  . . ",
+".......  .  .  .",
+"....   . .  .  .",
+".... . ...  .  .",
+".... . . .  .  .",
+".... . . .  .  .",
+".... . ...  .  .",
+".... . . .  .  .",
+".... . . .  .  .",
+".... . ...  .  .",
+"....   . .  .  .",
+".......  .  .  .",
+"....   ...  .  .",
+". .. . . .  .  .",
+"                ",
+"................",
+"................",
+"                ",
+"  . . . . . . . ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . ....... . .",
+"   . .. .. . .. ",
+".. . ... . ...  ",
+".. .. .. . . .. ",
+" .. . .. . ...  ",
+" .. . .. . . .. ",
+" .. . .. . ...  ",
+" .. . .. . . .. ",
+" .. . .. . ...  ",
+" .. . .. . . .. ",
+" .. . .. . ...  ",
+" .. . .. . . .. ",
+" .. . .. . ...  ",
+" .. . .. . . .. ",
+" .. . .. . ...  ",
+" .. . .. . . .. ",
+" .. . .. . ...  ",
+" ... ...........",
+" ... ...........",
+" ... ...........",
+" . . ...........",
+" ... ...........",
+" . . ...........",
+" ... ... .. .. .",
+" . . ...........",
+" ... ...........",
+" . . ...........",
+" ... ...........",
+" . . ...........",
+" ... ...........",
+" . . ... .. .. .",
+" ... ...........",
+" . . ...........",
+".... . . .  .  .",
+".... . ...  .  .",
+".... . . .  .  .",
+".... . . .  .  .",
+".... . ...  .  .",
+".... . . .  .  .",
+". ..   . .  .  .",
+"....... ..  .  .",
+"....   . .  .  .",
+".... . . .  .  .",
+".... . ...  . . ",
+".... . . .  ..  ",
+".... . . .   .  ",
+". .. . ...   ...",
+".... . ...   ...",
+".... . .. . .  .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  . . . . . . . ",
+"                ",
+"................",
+"                ",
+". ..............",
+"..  . . . . .   ",
+" .. . .. . . .. ",
+" .. . .. . ...  ",
+" .. . .. . . .. ",
+" .. . .. . ...  ",
+" .. . .. . . .. ",
+" .. . .. . ...  ",
+" .. . .. . . .. ",
+" .. . .. . ...  ",
+" .. . .. . . .. ",
+" .. . .. . ...  ",
+" . .. .. . . .. ",
+" . . ... . ...  ",
+".. . ... . . .. ",
+"   . .. .  ...  ",
+"  . ... . .. .. ",
+"...  . .. ....  ",
+"     ...........",
+"................",
+"................",
+"................",
+"     ... .. .. .",
+" . .. ..........",
+" ... . .........",
+" . ...  ........",
+" ... ...     ...",
+" . ... ... . ...",
+" ...         ...",
+" . .  ..  .  ...",
+" .. .   .  . ...",
+" .           ...",
+" ..  ..  ..  ...",
+"             ...",
+".... . . .. .   ",
+".... .  .... .  ",
+".... .  . ... ..",
+".... .  .....   ",
+". .. .. .. ...  ",
+".... ... ...... ",
+".... ... ... ...",
+".... . .. ......",
+".    .... .  . .",
+". ...  ..    ...",
+". . ..   ..  ...",
+". ........ .  ..",
+". . .     ....  ",
+". .... ... .....",
+". . .... ... ...",
+".               ",
+" ..    .....   .",
+".  ...      ....",
+"..  ........... ",
+" ...  .......  .",
+"  ....       ...",
+" .  ............",
+"  ..  ........  ",
+"..  ..        ..",
+"....   .......  ",
+"......         .",
+". ..............",
+".... ....... .. ",
+"........ ....  .",
+"   .......   ...",
+"..         .....",
+"                ",
+".      . ... .. ",
+"  .   .. . ...  ",
+" ... ..  ... .. ",
+"...  .  .. ...  ",
+"..  .  ..... .. ",
+"  ..   ... ...  ",
+"...   .. ... .. ",
+".    ..... ...  ",
+" .   ... ...... ",
+".  ... ... ...  ",
+"  .. ... ... .. ",
+" ......... ...  ",
+".... ... ... .. ",
+".. ... .......  ",
+" ... ... ... .. ",
+"                ",
+"                ",
+" . ... ... ... .",
+" ....... ... .. ",
+" . ... ... ... .",
+" ....... ... .. ",
+" . .            ",
+" ... ...........",
+" . . .......   .",
+"     .......   .",
+"................",
+".......  ..  .  ",
+".......  ..  .  ",
+"     ..  ..  .  ",
+" . . ...........",
+" ... ...  .  .  ",
+" . . ...  .  .  ",
+" ...            ",
+" ... . ... ... .",
+" ... ... ... ...",
+" ... . ... ... .",
+" ... ... ... ...",
+" ... . ... ...  ",
+".... ......... .",
+".... . ... .. ..",
+".... ... ... .  ",
+".... . ....     ",
+".  .  .. .. ... ",
+".  . . ...   .  ",
+".  . ....   .   ",
+".... . ..  ..   ",
+".  . ... . .  . ",
+".  .  .. . . . .",
+"                ",
+".. ...         .",
+" ...    .. ...  ",
+"..   .   .  .  .",
+"  .. . .. .   ..",
+".   .         . ",
+". ..  . . .. . .",
+"    ..  . . .. .",
+". .. .        . ",
+"  ..  ..  . .  .",
+"..  . ... .     ",
+"   ..       .. .",
+" ..   . ....    ",
+".   ... . ....  ",
+". ..   . .   ...",
+" ........ ......",
+"                ",
+".. ... ... ...  ",
+" ... ....... .. ",
+"   ... ... ...  ",
+".    . . ... .. ",
+" . ..  ... ...  ",
+"    .  . ... .. ",
+"   .... .. ...  ",
+"     .   ...... ",
+" ..    . . ...  ",
+"  .  ..  ... .. ",
+". ..   ..  ...  ",
+"       .  .. .. ",
+"...     .  ...  ",
+" ..     .. . .. ",
+". .  .. .. ...  ",
+" ... ...  .  .  ",
+" . . ...........",
+" ... ...........",
+" . . ...  .  .  ",
+" ... ...  .  .  ",
+" . . ...  .  .  ",
+" ... ...........",
+" . . ..  .  ..  ",
+" ... ..  .  ..  ",
+" . . ..  .  ..  ",
+" ... ...........",
+" . . ....... ...",
+" ... ..  .  . . ",
+" . . ..  .  . . ",
+" ... ..  .  . . ",
+" . . ...........",
+".  . .  ..   . .",
+"....    ..   .  ",
+"....    ..  . . ",
+".  .. .  .  .  .",
+".  .   . .     .",
+".  . . ...  .  .",
+".... . . .  .  .",
+".  . . . .     .",
+".  .   ...  .  .",
+".  . . . .     .",
+"....   . .  .  .",
+".... . ...     .",
+" . .   . .  .  .",
+" . ...   .     .",
+" . .   ...     .",
+".... . . .  .  .",
+"                ",
+"..... ..........",
+".. ....  ....  .",
+"                ",
+"  . . . . . . . ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . ....... . .",
+"   .    .  . .. ",
+".. . ... . ...  ",
+".  ..  .   .... ",
+" .. . .  . ...  ",
+" .. .  . . . .. ",
+"  . .  . . ...  ",
+" .. .  . . . .. ",
+" .. .    . ...  ",
+"  . . .. . . .. ",
+" .. .    . ...  ",
+" .. . .. . . .. ",
+" .. . .  . ...  ",
+" .. . .  . . .. ",
+"  . .  . . ...  ",
+" .. . .  . . .. ",
+" .  .    . .... ",
+" ... ..  .  .  .",
+" ... ..  .  .  .",
+" ... ..  .  .  .",
+" . . ...........",
+" ... ...........",
+" . . ...  .  .  ",
+" ... ...  .  .  ",
+" . . ...  .  .  ",
+" ... ...........",
+" . . ..  .  .   ",
+" ... ..  .  .  .",
+" . . ..  .  .  .",
+" ... ...........",
+" . . ...........",
+" ... ..  ..  .  ",
+" . . ..  ..  .  ",
+"  .. . . .  .  .",
+"  .. . ...     .",
+"  .. . . .  .  .",
+"...  . . .  .  .",
+".... . ...  .  .",
+".  . . . .     .",
+".  .     .  .  .",
+".  ...  ..  .  .",
+"....   . .  .  .",
+".  . . . .     .",
+".  . . ...  . . ",
+".  . . . .  ..  ",
+".... . . .   .  ",
+".... . ...   . .",
+".  . . ...      ",
+".  . . .. . .  .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  . . . . . . . ",
+"                ",
+"................",
+"                ",
+". ....  ........",
+"..  . . . . .   ",
+" .. .  . . . .. ",
+" .. . .. . ...  ",
+" .. . .  . . .. ",
+" .. .  . . ...  ",
+" .. .    . . .. ",
+" .. .    . ...  ",
+" .. .  . . . .. ",
+" .. .  . . ...  ",
+" .. . .    . .. ",
+" .. .  . . ...  ",
+" . ..    . . .. ",
+" . . ..  . ...  ",
+" . . ... . . .. ",
+"   . .  .  ...  ",
+"  . ..  . .. .. ",
+". .  . .. ....  ",
+"     ..  ..  .  ",
+"................",
+"........  .  .  ",
+"........  .  .  ",
+"     ...  .  .  ",
+" . .. ..........",
+" ... . .... ....",
+" . ...  ........",
+" ... ...     ...",
+" . ... ... . .. ",
+" ...         .. ",
+" . .  ..  .  .. ",
+" .. .   .  . ...",
+" .           ...",
+" ..  ..  ..  ...",
+"             ...",
+".  . . . .. .   ",
+".... .  .... .  ",
+".  . .  . ... ..",
+".  . .  .....   ",
+".  . .. .. ...  ",
+".... ... ...... ",
+". .. ... ... ...",
+".... . .. ......",
+".    .... .  . .",
+"  ...  ..    ...",
+"  . ..   ..  ...",
+"  ........ .  ..",
+". . .     ....  ",
+". .... ... .....",
+". . .... ... ...",
+".               ",
+" ..    .....    ",
+".   .        .  ",
+".   .. .  ..... ",
+"   .    ..     .",
+"  ...        ...",
+" .  . . . .. .  ",
+"  ..  ..  . ..  ",
+"..  ..        . ",
+"....   .. ....  ",
+"......         .",
+". ..............",
+".... ....... .. ",
+"........ ....  .",
+"   .......   ...",
+"..         .....",
+"                ",
+".      . ... .. ",
+"  .   .. . ...  ",
+" . . ..  ... .. ",
+"  .  .  .. ...  ",
+" .  .  ..... .. ",
+"   .   ... ...  ",
+"...   .. ...... ",
+".    ..... ...  ",
+" .   ... ... .. ",
+".  ... ... ...  ",
+"  .. ... ... .. ",
+" ......... ...  ",
+".... ... ... .. ",
+".. ... .......  ",
+" ... ... ... .. ",
+"                ",
+"................",
+"................",
+"................",
+". . . ..........",
+" ......         ",
+".. . .  ........",
+" .... .         ",
+".. .    ........",
+" ..   .         ",
+"..  .   ........",
+" ..   .  .      ",
+"..  .   ........",
+" ..   .    .    ",
+"..  .   .....  .",
+" ..   .        .",
+"..  .   .... ...",
+"............    ",
+"..........      ",
+"........   . ...",
+"......   . ... .",
+"         ... ...",
+"...... ....... .",
+"       . ... ...",
+".....  ... .....",
+"      .. ... ...",
+"....   ... ... .",
+"      ...... ...",
+"  . .  ... ... .",
+" . .  .. .......",
+"...... ... ... .",
+" . . . . ... ...",
+"....... ...... .",
+"  ..............",
+"    ............",
+" .    ........  ",
+".. .   ......  .",
+" ...          ..",
+"......  .... . .",
+" ... .  .    ...",
+".. ...   .. ....",
+" ... ..  .   ...",
+"......   .  .. .",
+" ... ..      ...",
+".. ...    . ....",
+" ... ..  .   ...",
+"......   ... . .",
+" ... .   . . ...",
+".. ... ......  .",
+"..       .......",
+"           .....",
+" ... ...    ....",
+".. ... ...   ...",
+" ... ... ..  ...",
+".. ....... .  . ",
+" ... ... ...  ..",
+"...... ......   ",
+" ... ... ...   .",
+".. ... ... .. . ",
+" ....... ...   .",
+".. ... ... .. . ",
+" ... .......   .",
+"...... ... ..   ",
+" ... ... ...  ..",
+".. ....... . .  ",
+" ..   .      ...",
+"..  .   ... . ..",
+" ..   .  .  ....",
+"... .   ... ....",
+" ..   .     ....",
+". . .   ... ....",
+" ..   .     ....",
+". . .   .... . .",
+" ..   . .    ...",
+". . .   ..... ..",
+" ..   .        .",
+".   .   ......  ",
+" ..   .     .   ",
+". . .   ........",
+" ..   .       . ",
+".   .   ....... ",
+".. ....  ... ...",
+"........   ... .",
+"..........   ...",
+".... .......    ",
+".............   ",
+"........ ..  . .",
+"..............  ",
+"............. ..",
+".............   ",
+"............ ...",
+"...........     ",
+"... .....   ....",
+"  ......      . ",
+"..      ........",
+"         .      ",
+"................",
+"....   . ....  .",
+".. .  ........  ",
+" .   ...........",
+"  ........ .....",
+"  ..............",
+". ............ .",
+"  ..............",
+".. . ...........",
+"   .............",
+"... ............",
+".    ...........",
+"....  ... ..... ",
+"        ......  ",
+"........      ..",
+"  .    .        ",
+". ..............",
+" ... ... ..  ...",
+".. ... ...  ..  ",
+"  .. ...   . ...",
+"..      .. .... ",
+"...        . ...",
+".  . ..... .... ",
+"....    .  . . .",
+"... ...... .... ",
+"...        ... .",
+".. ....... ...  ",
+".    .     . ...",
+"  ........ .... ",
+"        .  . ...",
+".......... .... ",
+"     .     ... .",
+".......... .... ",
+" ..   .         ",
+".   .  .......  ",
+" ..   .. . .. . ",
+".    ....... .  ",
+" ..           . ",
+".  ... ... . .  ",
+" . . ... ...  . ",
+". ........ . .  ",
+" . ..... ...  . ",
+". ........ . .  ",
+" . .........  . ",
+". ........ . .  ",
+" . .........  . ",
+". ........ . .  ",
+" . .........  . ",
+". ........ . .  ",
+"................",
+"................",
+"...   .....   ..",
+".. ...  .  ... .",
+".   .... ..... .",
+".. .... . ...  .",
+"... .. ... ..  .",
+"... . .. .. . ..",
+".... ..   .. ...",
+"... . .. .. . ..",
+"... .. ... .. ..",
+".. .... . .... .",
+".. ..... ..... .",
+".. ...  .  ... .",
+"...   .....   ..",
+"................",
+".               ",
+". ..............",
+".               ",
+". ..............",
+". ..............",
+". ........... ..",
+". ........ . ...",
+". .......   ....",
+". ...... . .....",
+". ..... ........",
+". ..............",
+". ..........    ",
+". .......... ...",
+". ..........    ",
+". .......... . .",
+". .......... ...",
+"           .....",
+".........  .... ",
+"      .. .......",
+"..... . .. .... ",
+".....  . .......",
+".....  ... .... ",
+"..... .. ..... .",
+".....  ........ ",
+"..... ..........",
+".....  ........ ",
+"..... ..........",
+"       ........ ",
+" ... .........  ",
+"    ........... ",
+"..              ",
+"............... ",
+" . .........  . ",
+". . ...... . .  ",
+" ...........  . ",
+". . ...... . .  ",
+" ............ . ",
+". . ...... .. . ",
+" . . ........  .",
+". . .........   ",
+" . ....         ",
+". .... ... .... ",
+" . .. .. .. .  .",
+"....          ..",
+" .. ........ ...",
+". ... ......... ",
+" . . . . . . . .",
+". . . . . . . . ",
+"................",
+"                ",
+"                ",
+"................",
+"................",
+"                ",
+". .  . . . . . .",
+"                ",
+"................",
+"................",
+"................",
+"................",
+" . .............",
+". . . . ... . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+". .......... ...",
+"  .......... ...",
+" ........... .  ",
+"............ .  ",
+"............ .  ",
+"             ...",
+" .. . . .    ...",
+"..         .....",
+" . ....... .....",
+". . . . .  .....",
+".. . . . .      ",
+"................",
+"................",
+"... ... . ..... ",
+" . . . . . . . .",
+". . . . . . . . ",
+"............... ",
+"............... ",
+".  ............ ",
+".  ........     ",
+".  .....    ... ",
+"........    ... ",
+"........... ... ",
+".  .  ..    ... ",
+".  .  ..    ... ",
+".  .  ..... ... ",
+"            ... ",
+". . ........... ",
+" . . . ... .... ",
+"..... . . . . . ",
+" . . . . . . .. ",
+". . . . . . . . ",
+".....      .....",
+"...  ......  ...",
+".. .......... ..",
+". .......... . .",
+". ..... ... .. .",
+" .. ...  . .... ",
+" ... ..   ..... ",
+" .... .  . .... ",
+" .....   .. ... ",
+" .....   ... .. ",
+" .... .. ...... ",
+". .. ......... .",
+". . .......... .",
+".. .......... ..",
+"...  ......  ...",
+".....      .....",
+"   . . . . .    ",
+"  . ... . .     ",
+" . . . . .      ",
+"  . . . .       ",
+" ... . .        ",
+"  . . .         ",
+" . . .          ",
+"  . .           ",
+" . .            ",
+"  .             ",
+" .              ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"               .",
+"              ..",
+"             . .",
+"            . ..",
+"           . . .",
+"          . . ..",
+"         . . . .",
+"        . ... ..",
+"       . . . . .",
+"      . . . . . ",
+"     . ... . .  ",
+"    . . . . .   ",
+"  ..........    ",
+" . ... ...      ",
+"..........      ",
+" ... ...   . . .",
+"........  . . . ",
+".. ...   . . . .",
+"......  . . . . ",
+" ...   . ..... .",
+"....  . . . . . ",
+"..   . . . . . .",
+"..  . . . . . . ",
+"   . . . . . . .",
+"    ..      ..  ",
+"   ..      ..   ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"               .",
+"              ..",
+"             . .",
+"            ....",
+"           . ...",
+"          ......",
+"         . ... .",
+"        ........",
+"       . ... ...",
+"      ..........",
+"     . ... ...  ",
+"    ..........  ",
+"   . ... ...    ",
+"                ",
+"................",
+"................",
+"...........   ..",
+"..........   ...",
+"....... . ......",
+"...... . .......",
+"..... . . ......",
+".... . ... .....",
+"... .  .........",
+".....  .........",
+"..... ..........",
+"                ",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"....... ........",
+"....       .....",
+"... .     . ....",
+".. . .. .. . ...",
+". . ... ... ....",
+"................",
+"................",
+"                ",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"                ",
+"................",
+"................",
+".   ............",
+"     ...........",
+"...   . ........",
+"....   .........",
+".....   ........",
+".... .   .......",
+"... ...   ......",
+"........  ......",
+"........  ......",
+"                ",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+" .   .          ",
+"... . ..........",
+".... . .........",
+".....  .........",
+".....  .........",
+"...     ........",
+".....  .........",
+".....  .........",
+"....   .........",
+"... . ..........",
+".... ...........",
+"... ............",
+"                ",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"        . .     ",
+"........  ......",
+".... ... .......",
+"..... . ........",
+"...... .........",
+"..... . ........",
+".... . .........",
+".   . ..........",
+"   . ...........",
+" .. ............",
+"................",
+"................",
+"                ",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"                ",
+"................",
+".. .... .... ...",
+". . ... ... ....",
+".. .       .....",
+"...       ......",
+"...... .........",
+"..... ..........",
+".... ...........",
+"... ............",
+"................",
+"................",
+"                ",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"  .  .          ",
+"...  ...........",
+"...  ...........",
+"... . ... ......",
+".... . . .......",
+"..... . ........",
+"...... . .......",
+"..... . . ......",
+".... ... .   ...",
+"... .....   ....",
+"................",
+"................",
+"                ",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"                ",
+"......... ......",
+"........ .......",
+".......  .......",
+".......  .......",
+".......    .....",
+"......   .......",
+"..... .  .......",
+".... ..  .......",
+"... ... . ......",
+"........ . .....",
+"......... ......",
+"                ",
+". . . . . . . . ",
+" . . . . . . . .",
+". . . . . . . . ",
+"                ",
+" .............. ",
+" .............. ",
+" .....  ....... ",
+" .......  ..... ",
+" ...... . ..... ",
+" .......  ..... ",
+" ...... ... ... ",
+" .......... ... ",
+" ...  .... .... ",
+" ...  . ....... ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .............. ",
+"                ",
+"                ",
+" .............. ",
+" .............. ",
+" .....  . ..... ",
+" .... .... .... ",
+" ..... . ...... ",
+" .......   .... ",
+" ........ ..... ",
+" ..... .... ... ",
+" ...  .... .... ",
+" ...  ......... ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .............. ",
+"                ",
+"                ",
+" .............. ",
+" .............. ",
+" ..... . ...... ",
+" ....... ...... ",
+" ....... . .... ",
+" .... ...  .... ",
+" ...... ... ... ",
+" ..... .. ..... ",
+" ...  .... .... ",
+" ...  ......... ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .............. ",
+"                ",
+"                ",
+" .............. ",
+" .............. ",
+" ...... ....... ",
+" .... .. ...... ",
+" ....... ...... ",
+" ....... . .... ",
+" ... .. ... ... ",
+" ..... .... ... ",
+" ... ... ...... ",
+" ...  ......... ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .............. ",
+"                ",
+"                ",
+" .............. ",
+" .............. ",
+" .............. ",
+" ......  .. ... ",
+"...... ..  .....",
+" ....  .. ..... ",
+" ... ..  ...... ",
+" .. ........... ",
+" . ............ ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .............. ",
+"                ",
+"                ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .......  ..... ",
+"......  ..  ... ",
+" ....   .. .... ",
+" ...  ..  ..... ",
+" .. ........... ",
+" . ............ ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .............. ",
+"                ",
+"                ",
+" .............. ",
+" .............. ",
+" .............. ",
+" ........  .... ",
+"......   .. ... ",
+" .... .  . .... ",
+" ...   .. ..... ",
+" .. ........... ",
+" . ............ ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .............. ",
+"                ",
+"                ",
+" .............. ",
+" .............. ",
+" .............. ",
+" ...... ..  ... ",
+"...... .   .....",
+" .... ..  ..... ",
+" ... .  ....... ",
+" .. ........... ",
+" . ............ ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .............. ",
+"                ",
+"                ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .....  ....... ",
+" .... ..  ..... ",
+" ... .......... ",
+" .. ........... ",
+" ....... .. ... ",
+" ......    .... ",
+" ..... ........ ",
+" .... ......... ",
+" .............. ",
+" .............. ",
+" .............. ",
+"                ",
+"                ",
+" .............. ",
+" .............. ",
+" .............. ",
+" ......  ...... ",
+" ....  .. ..... ",
+" ... .......... ",
+" .. ........... ",
+" .......  ..... ",
+" ......  .  ... ",
+" ..... ........ ",
+" .... ......... ",
+" .............. ",
+" .............. ",
+" .............. ",
+"                ",
+"                ",
+" .............. ",
+" .............. ",
+" .............. ",
+" .......  ..... ",
+" ....   ....... ",
+" ... .......... ",
+" .. ........... ",
+" .......   .... ",
+" ......  .. ... ",
+" ..... ........ ",
+" .... ......... ",
+" .............. ",
+" .............. ",
+" .............. ",
+"                ",
+"                ",
+" .............. ",
+" .............. ",
+" .............. ",
+" ..... .. ..... ",
+" .... .  ...... ",
+" ... .......... ",
+" .. ........... ",
+" ....... .  ... ",
+" ......   ..... ",
+" ..... ........ ",
+" .... ......... ",
+" .............. ",
+" .............. ",
+" .............. ",
+"                ",
+"                ",
+" ...............",
+" ..........   ..",
+" ........... ...",
+" ....   ...   ..",
+" ...     .......",
+" ..... .........",
+" ....  .........",
+" ... . .........",
+" .. . ...... ...",
+" ... ...... ....",
+" .. ............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+" ...............",
+" ..........   ..",
+" ........... ...",
+" ....  ....   ..",
+" ...  ..........",
+" ..    .........",
+" ..    .........",
+" ..  . ...... ..",
+" .. . ...... ...",
+" ... ...... ....",
+" .. ............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+" ...............",
+" ..........   ..",
+" ........... ...",
+" ..........   ..",
+" ... ...........",
+" ..  . .........",
+" ..    .........",
+" ..  . ...... ..",
+" ..   ...... ...",
+" ... ...... ....",
+" .. ............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+" ...............",
+" ..........   ..",
+" ........... ...",
+" ..........   ..",
+" ...............",
+" ..... .........",
+" ..    ....... .",
+" ..    ...... ..",
+" ..   ...... ...",
+" ...   .... ....",
+" .. ............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+" ...............",
+" ..........   ..",
+" ........... ...",
+" ..........   ..",
+" ...............",
+" ..... .........",
+" ....  ....... .",
+" ... . ...... ..",
+" ..      ... ...",
+" ...    ... ....",
+" .. ............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+" ...............",
+" ..........   ..",
+" ........... ...",
+" ..........   ..",
+" ...............",
+" ..... .........",
+" ....  .. ......",
+" ... .    ... ..",
+" .. . .  ... ...",
+" ... .  ... ....",
+" .. ............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+" ...............",
+" ..........   ..",
+" ........... ...",
+" ..........   ..",
+" ....... .......",
+" ..... .  ......",
+" ....     ......",
+" ... . .  ... ..",
+" .. . .. ... ...",
+" ... ...... ....",
+" .. ............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"                ",
+" ...............",
+" ..........   ..",
+" ........... ...",
+" .....  ...   ..",
+" ......  .......",
+" .....    ......",
+" ....  .. ......",
+" ... . .........",
+" .. . ...... ...",
+" ... ...... ....",
+" .. ............",
+" ...............",
+" ...............",
+" ...............",
+" ...............",
+"................",
+"................",
+"................",
+"................",
+"................",
+"....... ........",
+"......   .......",
+".....     ......",
+"......   .......",
+"....... ........",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"...... .........",
+"....... ........",
+".... .   . .....",
+".....  .  ......",
+"....  . .  .....",
+".... .  . ......",
+"....   .  ......",
+"......   .......",
+"..... . ........",
+"................",
+"................",
+"................",
+"................",
+"......... ......",
+"................",
+".... ... ... ...",
+" ......  .. ....",
+".  .  ..   .....",
+"... ..  .. .....",
+"...   ..  .. ...",
+". .   . . ......",
+"...  . .. . ....",
+".... .. ... ....",
+".. ..  ..   ....",
+". ....    . ....",
+"..... ...... ...",
+"..... ....... ..",
+"......... ......",
+".... ...........",
+". .... ...... ..",
+"......... ......",
+"... .  .  . ....",
+".... .. .... ...",
+".. .. . .. .....",
+". . .    .    ..",
+".   . ..... . ..",
+".. ...... . ....",
+"..  ... . .  ...",
+"... .  ...... ..",
+". . .  .. .. ...",
+"...  .       ...",
+"... ... ...  ...",
+"...... .........",
+".........  .....",
+".. .............",
+"...... . .. . ..",
+"...   .. . ..  .",
+" . ... ...  ..  ",
+"..  ... .. . ...",
+"...   .... . .. ",
+" . .   . ..   ..",
+"... ......   .  ",
+". ..  . .... .. ",
+".. ...... ..... ",
+" .. .. ...     .",
+"...  . .  .. .. ",
+" . .  ...   ....",
+" .. . ..   .. ..",
+". .... ....... .",
+" . . .. . . . ..",
+"... .  .  . ....",
+"....... ........",
+"...... .. .. ...",
+".. . ... . .. ..",
+"... . . .  .. ..",
+"............ . .",
+".. .. .... .....",
+"... .. ... . ...",
+" ...............",
+".. ......... . .",
+". . ...  .... ..",
+".. . ...... ....",
+"......... ......",
+"... . ..... . ..",
+".... .. . ......",
+"................",
+"................",
+"... ... ........",
+" . .  ..... .. .",
+".  ...  .. .....",
+". ..  ....  . . ",
+" .. ... . ..... ",
+". .. ....... .. ",
+"....... .  .... ",
+". ... .. ...  ..",
+". . .  ........ ",
+". . . ... . . ..",
+"..  ..  .. .....",
+".... .. ..... ..",
+". ... . ... ... ",
+"  .. ..  ... ...",
+"... .. ..   ....",
+"..... ... ... ..",
+"... ... ........",
+" . .  ..... .. .",
+".   .. . .  ....",
+". ..  ..... . . ",
+" ..     . . ... ",
+". .. ...  .  .. ",
+"....... .   ... ",
+".  .. . ....  ..",
+". . .  .. . ... ",
+". .   ... . . ..",
+"..  ..  .  .....",
+".... .. ........",
+". ... . .. .... ",
+"  .  .   ... .. ",
+"..  .  ..   ....",
+"..... ... ... ..",
+"                ",
+"  . . ......... ",
+" . .  ......... ",
+" .. . ....... . ",
+" . .  ......... ",
+"  . . ......... ",
+" . .  ....... . ",
+" .. . ......... ",
+" . .  ......... ",
+"  . . ....... . ",
+" . .  ......... ",
+" .. . ......... ",
+" . .  ....... . ",
+"  . . ......... ",
+" . .  ......... ",
+"                ",
+"                ",
+"  . . ......... ",
+" . .  ......... ",
+" .. . ..... ... ",
+" . .  ......... ",
+"  . . ......... ",
+" . .  ..... ... ",
+" .. . ......... ",
+" . .  ......... ",
+"  . . ..... ... ",
+" . .  ......... ",
+" .. . ......... ",
+" . .  ..... ... ",
+"  . . ......... ",
+" . .  ......... ",
+"                ",
+"                ",
+"  . . ......... ",
+" . .  ......... ",
+" .. . ... ..... ",
+" . .  ......... ",
+"  . . ......... ",
+" . .  ... ..... ",
+" .. . ......... ",
+" . .  ......... ",
+"  . . ... ..... ",
+" . .  ......... ",
+" .. . ......... ",
+" . .  ... ..... ",
+"  . . ......... ",
+" . .  ......... ",
+"                ",
+"                ",
+"  . . ......... ",
+" . .  ......... ",
+" .. . . ....... ",
+" . .  ......... ",
+"  . . ......... ",
+" . .  . ....... ",
+" .. . ......... ",
+" . .  ......... ",
+"  . . . ....... ",
+" . .  ......... ",
+" .. . ......... ",
+" . .  . ....... ",
+"  . . ......... ",
+" . .  ......... ",
+"                ",
+" .. . . .. . .. ",
+" ..  . ... . .. ",
+" .. . .... . .. ",
+"     ..... . .. ",
+" .. ...... . .. ",
+" .. ... .. . .. ",
+" .. ..  .. . .. ",
+" .. . . .. . ...",
+"     .  .. . ...",
+" ..   . .. . ...",
+" ..  .  .. .    ",
+" ..   . .. .....",
+" ..  . ...      ",
+" ..   ... . . . ",
+"     ... . . . .",
+" .. ...         ",
+" .. . . .. . .. ",
+" ..  . ... . .. ",
+" .. . .... . .. ",
+"     ..... . .. ",
+" .. ...... . .. ",
+" .. ... .. . .. ",
+" .. ..  .. . .. ",
+" .. . . .. . ...",
+"        .. . ...",
+" .. . . .. . ...",
+" .. .   .. .    ",
+" .. . . .. .....",
+" .. .  ...      ",
+" .. . ... . . . ",
+"     ... . . . .",
+" .. ...         ",
+" .. . . .. . .. ",
+" ..  . ... . .. ",
+" .. . .... . .. ",
+"     ..... . .. ",
+" .. ...... . .. ",
+" .. ... .. . .. ",
+" .. ..  .. . .. ",
+" .. .   .. . ...",
+"     .  .. . ...",
+" .. ..  .. . ...",
+" .. ..  .. .    ",
+" .. ..  .. .....",
+" .. .. ...      ",
+" .. . ... . . . ",
+"     ... . . . .",
+" .. ...         ",
+" .. . . .. . .. ",
+" ..  . ... . .. ",
+" .. . .... . .. ",
+"     ..... . .. ",
+" .. ...... . .. ",
+" .. ... .. . .. ",
+" .. ..  .. . .. ",
+" .. . . .. . ...",
+"     .. .. . ...",
+" .. ..  .. . ...",
+" .. ..  .. .    ",
+" .. ..  .. .....",
+" .. .. ...      ",
+" .. . ... . . . ",
+"     ... . . . .",
+" .. ...         ",
+" .. . . .. . .. ",
+" ..  . ... . .. ",
+" .. . .... . .. ",
+"     ..... . .. ",
+" .. ...... . .. ",
+" .. ... .. . .. ",
+" .. ..  .. . .. ",
+" .. . . .. . ...",
+"     .. .. . ...",
+" ..     .. . ...",
+" ..     .. .    ",
+" ..     .. .....",
+" .. .. ...      ",
+" .. . ... . . . ",
+"     ... . . . .",
+" .. ...         ",
+" .. . . .. . .. ",
+" ..  . ... . .. ",
+" .. . .... . .. ",
+"     ..... . .. ",
+" .. ...... . .. ",
+" .. ... .. . .. ",
+" .. ..  .. . .. ",
+" .. . . .. . ...",
+"     .. .. . ...",
+"        .. . ...",
+"        .. .    ",
+"        .. .....",
+" .. .. ...      ",
+" .. . ... . . . ",
+"     ... . . . .",
+" .. ...         ",
+" .. . . .. . .. ",
+" ..  . ... . .. ",
+" .. . .... . .. ",
+"     ..... . .. ",
+" .. ...... . .. ",
+" .. ... .. . .. ",
+" .. ..  .. . .. ",
+" .. . . .. . ...",
+"     .. .. . ...",
+"      . .. . ...",
+"      . .. .    ",
+"      . .. .....",
+" .. .. ...      ",
+" .. . ... . . . ",
+"     ... . . . .",
+" .. ...         ",
+" .. . . .. . .. ",
+" ..  . ... . .. ",
+" .. . .... . .. ",
+"     ..... . .. ",
+" .. ...... . .. ",
+" .. ... .. . .. ",
+" .. ..  .. . .. ",
+" .. . . .. . ...",
+"     .. .. . ...",
+"    ... .. . ...",
+"    ... .. .    ",
+"    ... .. .....",
+" .. .. ...      ",
+" .. . ... . . . ",
+"     ... . . . .",
+" .. ...         ",
+" .. . . .. . .. ",
+" ..  . ... . .. ",
+" .. . .... . .. ",
+"     ..... . .. ",
+" .. ...... . .. ",
+" .. ... .. . .. ",
+" .. ..  .. . .. ",
+" .. .   .. . ...",
+"     .  .. . ...",
+" .. ..  .. . ...",
+" .. ..  .. .    ",
+" .. ..  .. .....",
+" .. .. ...      ",
+" .. . ... . . . ",
+"     ... . . . .",
+" .. ...         ",
+" .. . . .. . .. ",
+" ..  . ... . .. ",
+" .. . .... . .. ",
+"     ..... . .. ",
+" .. ...... . .. ",
+" .. ... .. . .. ",
+" .. ..  .. . .. ",
+" .. . . .. . ...",
+"        .. . ...",
+" .. . . .. . ...",
+" .. .   .. .    ",
+" .. . . .. .....",
+" .. .  ...      ",
+" .. . ... . . . ",
+"     ... . . . .",
+" .. ...         ",
+" .. . . .. . .. ",
+" ..  . ... . .. ",
+" .. . .... . .. ",
+"     ..... . .. ",
+" .. ...... . .. ",
+" .. ... .. . .. ",
+" .. ..  .. . .. ",
+" .. . . .. . ...",
+"     .  .. . ...",
+" ..   . .. . ...",
+" ..  .  .. .    ",
+" ..   . .. .....",
+" ..  . ...      ",
+" ..   ... . . . ",
+"     ... . . . .",
+" .. ...         ",
+" .. . . .. . .. ",
+" ..  . ... . .. ",
+" .. . .... . .. ",
+"     ..... . .. ",
+" .. ...... . .. ",
+" .. ... .. . .. ",
+" .. ..  .. . .. ",
+" .. . . .. . ...",
+"     .  .. . ...",
+" .. . . .. . ...",
+" ..  .  .. .    ",
+" .. . . .. .....",
+" ..  . ...      ",
+" ..   ... . . . ",
+"     ... . . . .",
+" .. ...         ",
+"                ",
+"............... ",
+"............... ",
+"              . ",
+".............   ",
+"............. . ",
+"............  . ",
+"........... .   ",
+"......... ..  . ",
+"........ .. .   ",
+"........ . .. . ",
+"...... .  . . . ",
+"....... ..... . ",
+"..... .......   ",
+"... ........    ",
+"..   ........ . ",
+"                ",
+"............... ",
+"............... ",
+"              . ",
+"............. . ",
+".............   ",
+"............. . ",
+"............  . ",
+"..........    . ",
+"............    ",
+"........ . .. . ",
+"....... .. .  . ",
+"....... . ... . ",
+"....  ....... . ",
+"... ... .....   ",
+"..   ........ . ",
+"                ",
+"............... ",
+"............... ",
+"              . ",
+"........... . . ",
+".............   ",
+".......... .. . ",
+"..........  .   ",
+".......... .. . ",
+".........  .  . ",
+"...... . . .. . ",
+".........  .. . ",
+"......   .... . ",
+".....  ...... . ",
+"... ......... . ",
+"..   ........ . ",
+"                ",
+"............... ",
+"............... ",
+"              . ",
+".............   ",
+"............    ",
+"........... . . ",
+".............   ",
+".......... .  . ",
+"............. . ",
+"........  . . . ",
+"....... ... .   ",
+"...... . . .. . ",
+"..... . ... . . ",
+"... ......... . ",
+"..   ........   ",
+".   ......    . ",
+"   .......... . ",
+"  ....... . .   ",
+" ........ ..  . ",
+"........ .. . . ",
+"......    ... . ",
+"...... . .... . ",
+"....  ....... . ",
+"... ......... . ",
+"..   ........ . ",
+".   ......... . ",
+"   .......... . ",
+"  ........... . ",
+" ............ . ",
+"............. . ",
+"............. . ",
+".   ....... .   ",
+"   ....... .. . ",
+"  ......  ..    ",
+" .........  . . ",
+"...... . . .. . ",
+"....... . ... . ",
+".....  ...... . ",
+"............. . ",
+"... . ....... . ",
+"..   ........ . ",
+".   ......... . ",
+"   .......... . ",
+"  ........... . ",
+" ............ . ",
+"............. . ",
+"............. . ",
+".   .........   ",
+"   .......... . ",
+"  ......... ..  ",
+" ......... .. . ",
+"......... . . . ",
+"...... . ..   . ",
+"...... .. ... . ",
+"......  ..... . ",
+"... . ....... . ",
+"..   ........ . ",
+".   ......... . ",
+"   .......... . ",
+"  ........... . ",
+" ............ . ",
+"............. . ",
+"............. . ",
+".   ........    ",
+"   ....... .  . ",
+"  .......  ..   ",
+" ........  .. . ",
+"........ .. . . ",
+"...... .. ... . ",
+"....... ..... . ",
+"..... ....... . ",
+"...   ....... . ",
+"..   ........ . ",
+".   ......... . ",
+"   .......... . ",
+"  ........... . ",
+" ............ . ",
+"............. . ",
+"............. . ",
+"                ",
+"................",
+"..............  ",
+"............ ...",
+".......... ... .",
+"...........   . ",
+"........ ... ...",
+"......... .. ...",
+"......  .....   ",
+"...... ..  ... .",
+".... . . ... .  ",
+"...  .. ... ....",
+".. ....... . ...",
+".   .....   ....",
+"   .....   .....",
+"  .....   ..... ",
+"                ",
+"............... ",
+"............. ..",
+".......... . .. ",
+"............   .",
+".........  .....",
+".......... . ...",
+"........ ... ...",
+"......  .....   ",
+"...... .. ......",
+"....  ........  ",
+"... . . .... ...",
+".. ....... .....",
+".   .....   ....",
+"   .....   .....",
+"  .....   ..... ",
+"                ",
+"............... ",
+".............   ",
+".......... .. . ",
+"...........    .",
+".........  .....",
+".........  . .  ",
+"........ ...... ",
+"......  ..... ..",
+"....... . ... . ",
+"....   ...... . ",
+".....   ....  ..",
+".. . ..... . ...",
+".   .....   ....",
+"   .....   .....",
+"  .....   ..... ",
+"                ",
+"..............  ",
+"................",
+"..........  ..  ",
+"............. ..",
+"......... . ....",
+"........  .  .  ",
+".......... .....",
+"......    ... ..",
+".....  .. ...   ",
+".... . ..... .  ",
+"... .. ..... ...",
+".. .  ....   ...",
+".   .....   ....",
+"   .....   .....",
+"  .....   ..... ",
+"              ..",
+"..... .. . ..   ",
+"... ...   ... . ",
+".... . .... .   ",
+". ....  . ..  . ",
+"... .   ... . . ",
+" . ...... . . . ",
+"..... .. .  . . ",
+". ... . . ... . ",
+" .. ... ..... . ",
+".....  . .... . ",
+"...   ....... . ",
+".. .......... . ",
+".   ......... . ",
+"   .......... . ",
+"  ........... . ",
+"              ..",
+" ... ... . ..   ",
+"..... .  ...  . ",
+". .... . .... . ",
+" ... .    ..  . ",
+"... . ...  .  . ",
+" . ... ..   . . ",
+" . ... ...... . ",
+". .. ...  ... . ",
+" .....  . ... . ",
+"....   ...... . ",
+"... ......... . ",
+".. . ........ . ",
+".   ......... . ",
+"   .......... . ",
+"  ........... . ",
+"         .    ..",
+" ... ...... .   ",
+"   ..    ...  . ",
+". . . .  .. . . ",
+" ... .    ..  . ",
+"... . ..  ..  . ",
+" .....  ..  . . ",
+" . ...  ..... . ",
+" ...  ... ... . ",
+" ... . .. ... . ",
+".... ........ . ",
+"...   ....... . ",
+".. . ........ . ",
+".   ......... . ",
+"   .......... . ",
+"  ........... . ",
+"              ..",
+".. . ..   ...   ",
+".    .   ...  . ",
+".  .. .. .... . ",
+".... .    .   . ",
+" .. . ......  . ",
+" . ..... .  . . ",
+".... .  ..... . ",
+" ....  .. ... . ",
+". ... ... ... . ",
+"...  ........ . ",
+"... . ....... . ",
+".. . ........ . ",
+".   ......... . ",
+"   .......... . ",
+"  ........... . ",
+"                ",
+"......... .. . .",
+"                ",
+"............ ...",
+"....... .  ...  ",
+".... ..  .....  ",
+"....... . ..... ",
+". .. ......... .",
+"... ... .... . .",
+" ......... .....",
+"  .......   ....",
+" .......   .....",
+".......   ......",
+"......   .......",
+".....   ........",
+"....   ........ ",
+"                ",
+"............   .",
+"                ",
+"......... ......",
+"......  .. . .. ",
+"...... .. ....  ",
+".... .. . ..... ",
+". ... .. ...  ..",
+"... ............",
+" . .......   ...",
+"  .......   ....",
+" .......   .....",
+".......   ......",
+"......   .......",
+".....   ........",
+"....   ........ ",
+"            .   ",
+"......... .  . .",
+"                ",
+".........  .....",
+".....    ... ...",
+"....... ... ..  ",
+"..    . . ..... ",
+"... . .. ...  . ",
+"................",
+" . .......   ...",
+"  .......   ....",
+" .......   .....",
+".......   ......",
+"......   .......",
+".....   ........",
+"....   ........ ",
+"            .   ",
+"......... .. . .",
+"                ",
+"........ .......",
+"..... ...... ...",
+"..... ..... ..  ",
+"...   . . ..... ",
+"..  .... ...  . ",
+"... ............",
+" .........   ...",
+"  .......   ....",
+" .......   .....",
+".......   ......",
+"......   .......",
+".....   ........",
+"....   ........ ",
+"                ",
+".... .. ....... ",
+"       ........ ",
+".....  ........ ",
+"  ....        . ",
+"... .. ...... . ",
+" ..... ...... . ",
+"...... ...... . ",
+"...... . ...  . ",
+"...... ...... . ",
+"...... ...... . ",
+"...... ...... . ",
+"...... . ...  . ",
+"...... ...... . ",
+"...... ...... . ",
+". . .. ...... . ",
+"                ",
+"...   . ....... ",
+"   .   ........ ",
+"   ..  ........ ",
+" ... .        . ",
+"... .. ...... . ",
+"  .... ...... . ",
+"...... ...... . ",
+"...... . ...  . ",
+"...... ...... . ",
+"...... ...... . ",
+"...... ...... . ",
+"...... . ...  . ",
+"...... ...... . ",
+"...... ...... . ",
+". . .. ...... . ",
+"    .           ",
+"..... ......... ",
+"       ........ ",
+" .. .. ........ ",
+"..  ..        . ",
+". .... ...... . ",
+"...... ...... . ",
+"...... ...... . ",
+"...... . ...  . ",
+"...... ...... . ",
+"...... ...... . ",
+"...... ...... . ",
+"...... . ...  . ",
+"...... ...... . ",
+"...... ...... . ",
+". . .. ...... . ",
+"    .           ",
+"..... ......... ",
+"   .   ........ ",
+"  . .. ........ ",
+"..  ..        . ",
+". .... ...... . ",
+"...... ...... . ",
+"...... ...... . ",
+"...... . ...  . ",
+"...... ...... . ",
+"...... ...... . ",
+"...... ...... . ",
+"...... . ...  . ",
+"...... ...... . ",
+"...... ...... . ",
+". . .. ...... . ",
+"        .       ",
+"... .. .. ..... ",
+". .    . ...... ",
+" ... ....... .. ",
+"  . ........  . ",
+".          .. . ",
+"..... .... .. . ",
+"..... ...  . .. ",
+".. ... . . . .  ",
+"....   ..  .... ",
+"... .... . . .  ",
+" . . . ..  .  . ",
+". ..  .... .  . ",
+" ........  .... ",
+".......... .  . ",
+"...... .   .... ",
+"                ",
+".......   ..... ",
+"..  . .  ...... ",
+". .  .. . .. .. ",
+"  .......... .. ",
+".          .. . ",
+".......... .. . ",
+".........    .. ",
+"....... .     . ",
+".... ..    .... ",
+"...... ... .... ",
+"...  ..... . .. ",
+".. ....... .  . ",
+" . ............ ",
+"........ ...... ",
+"........ . .  . ",
+"                ",
+"..... ... ... . ",
+".. . .   .  . . ",
+"..  .  ... . .. ",
+"  .... ..... .. ",
+".          ...  ",
+". ........ ..   ",
+".........     . ",
+".......  . . .. ",
+"..... .. . . .. ",
+"...... ..  .. . ",
+".. .. ...  . .. ",
+".  . ..... .  . ",
+" ......... .... ",
+"..........  .   ",
+".......... ..   ",
+"                ",
+".........  .... ",
+".. . .   . .... ",
+"... . . .... .. ",
+"  .. ... ... .. ",
+"           .... ",
+".......... ...  ",
+".........     . ",
+"....... .. . .  ",
+"......  ..   .. ",
+".... .. .  .... ",
+"..  . . .  . .. ",
+". . . .... .  . ",
+"  ........ .... ",
+".......... .... ",
+".......... .. . ",
+".........  .  . ",
+".... .. ..   .. ",
+"..... .. . .  . ",
+".... . ... .... ",
+".. .. .. . . .. ",
+". . . .... .... ",
+" ......... .... ",
+".......... .... ",
+".......... . .. ",
+".......... .... ",
+".......... .... ",
+"...    ... .... ",
+"....  .... . .. ",
+"....  .... .... ",
+"....  .... .... ",
+"....  .... .... ",
+"...... .   . .  ",
+".....    .   .. ",
+".... ... . .  . ",
+".. .. .... .... ",
+"  ...  ... . .. ",
+".   . .... .... ",
+" ......... .... ",
+".......... .... ",
+".......... . .. ",
+".......... .... ",
+".......... .... ",
+"...    ... .... ",
+"....  .... . .. ",
+"....  .... .... ",
+"....  .... .... ",
+"....  .... .... ",
+"...... . . .  . ",
+"..... .. . . .. ",
+".....         . ",
+".... .. .. .... ",
+". . .. ... . .. ",
+".  ....... .... ",
+" ......... .... ",
+".......... .... ",
+".......... . .. ",
+".......... .... ",
+".......... .... ",
+"...    ... .... ",
+"....  .... . .. ",
+"....  .... .... ",
+"....  .... .... ",
+"....  .... .... ",
+"..........   .  ",
+".........  . .  ",
+"....... .  .  . ",
+".... . . . ..   ",
+"..  ..  .  . .. ",
+". .. ..... .... ",
+" ......... .... ",
+".......... .... ",
+".......... . .. ",
+".......... .... ",
+".......... .... ",
+"...    ... .... ",
+"....  .... . .. ",
+"....  .... .... ",
+"....  .... .... ",
+"....  .... .... ",
+"................",
+" .... .... . . .",
+"  .. .. . . ... ",
+".               ",
+" .  . . . .. ...",
+"  .  ...........",
+" ...  ........ .",
+"....  ....... ..",
+"....  .. .  . . ",
+"....  ...  .. ..",
+"...     ...... .",
+"....  ... . ....",
+" . .   .........",
+"  .   ...... . .",
+" ...  ...  ... .",
+"....  ..... . . ",
+"............. . ",
+" ....... .. ... ",
+"  . .. .. ... ..",
+".  .            ",
+"    . .. . . . .",
+"  .  ...........",
+" ...  ......... ",
+"....  ..... ..  ",
+"....  ...    . .",
+"....  .  ... ...",
+"....   ..  .. ..",
+"...   .. .. ....",
+" ...  ..........",
+"   .  ........ .",
+" ...  .... .. ..",
+"....  ..   .  . ",
+"......... ... ..",
+" ...... .. .. . ",
+"  .. . .. . .. .",
+".               ",
+" .  .. . .. ... ",
+"  .  ...........",
+" ...  ......  ..",
+"....  .... .....",
+"....  .. .. .. .",
+"....   . . .. ..",
+".. .   . . . .. ",
+"...   ..........",
+"   .  ..........",
+"  ..  ..........",
+" ...  .... ... .",
+"....  .....  .. ",
+"................",
+" .........  . . ",
+"  ... .  ... . .",
+".               ",
+"    . . ... . . ",
+"  .  ..... .....",
+" ...  ........ .",
+"....  ....... ..",
+"....  .. .. .. .",
+"....  ...   ....",
+"...     .. .. . ",
+".. .  .. ...... ",
+"   .  ..........",
+"  ..  ........ .",
+" ...  ...... . .",
+"....  ...  .. . ",
+" .. ..... ..... ",
+"...... ..... ...",
+"...  . .........",
+"                ",
+".. ........ ... ",
+" ... ...  ... . ",
+". . . ... ..... ",
+".  . . ........ ",
+" ..... ........ ",
+"  . .... ...... ",
+"...... ... .... ",
+".  ............ ",
+"....  .   . ... ",
+"....  . .. .. . ",
+"    .. .. .. .. ",
+".  .. .   .... .",
+".....  .. .. .. ",
+".  ... .. ......",
+".. . . . . .....",
+"                ",
+". ..... ... . . ",
+"... .. . ... .. ",
+".    . . . .. . ",
+"..  .... ... .. ",
+"  . .  ........ ",
+" ......... .... ",
+"......... ..  . ",
+"..   .. .. .. . ",
+"  ............. ",
+"  ..  .  . .. . ",
+" .. ..  . ..  . ",
+".. .. .. .. .. .",
+" ..... ........ ",
+". .. ... .......",
+". ... ... .. ...",
+"                ",
+".. . .......... ",
+"....... ... ... ",
+" . . .  .. .... ",
+". .......... .. ",
+" . . . ... .. . ",
+". . ........... ",
+"............... ",
+"...... . .  . . ",
+".....  .. ..... ",
+".    .. .. .. . ",
+" .. .. .. .. .. ",
+".  .. .. .. .. .",
+"..... .. ...... ",
+"... . ... ... ..",
+".  .... ... ....",
+"                ",
+"..... ... . ... ",
+". . ........... ",
+".. .  .    .  . ",
+" .. . ......  . ",
+". ....   . .... ",
+"...... . .. . . ",
+"... . .. ...... ",
+"......... ..... ",
+" ..   ..... ... ",
+"  .. .  .  .  . ",
+"  . .. .. .. .. ",
+".. .  .. .. .  .",
+"....  . . . ....",
+"....  . .   . . ",
+"...   . ........",
+".. .   . ... ...",
+" . .  ..........",
+"  ..  ......... ",
+" ...  .... ... .",
+"....  .. . . ...",
+"....   .. . .. .",
+"....  . . ..... ",
+"....   .... ....",
+".     .... ... .",
+" . .  ... ... ..",
+"  ..  ..... ... ",
+" ...  .... .....",
+"....  ... ......",
+"....  .  .. ....",
+"....  .  ...... ",
+"...    ....... .",
+".. .  ...... ...",
+"   .  ..... .. .",
+"  ..  ...... .. ",
+" ...  ...  .....",
+"....  . . . .. .",
+"....   .. ......",
+"....   ........ ",
+"...   ..... ....",
+".. .  .... ... .",
+" . .  ... ... ..",
+"  ..  ..... ... ",
+" ...  .... .....",
+"....  ... ......",
+"....  .  .  . . ",
+"...   ... ..... ",
+"....   .........",
+". .   ..........",
+" . .  ..........",
+"  ..  .... .  . ",
+" ...  .... .... ",
+"....  ...... . .",
+"....  ..   . ...",
+"....  . . ..... ",
+"...   .  .. ....",
+"....  .... ... .",
+" . .  ... ... ..",
+"  ..  ..... ... ",
+" ...  .... .....",
+"....  ... ......",
+"....   ...... ..",
+"....   .  . ..  ",
+"....  . ........",
+"...   ..........",
+" . .  ......   .",
+"  ..  ......... ",
+" ...  .....  ...",
+"....  ... . ..  ",
+"....   . . . ...",
+"....   . .... . ",
+"...   ..... ....",
+".. .   ... ... .",
+" ..   ... ... ..",
+"  ..  ..... ... ",
+" ...  .... .....",
+"....  ... ......",
+" .. . ..... . . ",
+"....  ....... . ",
+"...   ... .... .",
+"  ... . ..... ..",
+" . . ... . . .. ",
+".... ...  .... .",
+" ...  ....... ..",
+".  ............ ",
+" ............. .",
+"............. ..",
+"............... ",
+". ............ .",
+" ............ ..",
+"............... ",
+".............. .",
+"............. ..",
+" .... .... .. ..",
+" . . .... .. .. ",
+" ... .  .. ... .",
+". ........... ..",
+" . . .... ..... ",
+"....... ...... .",
+". ........... ..",
+". ............. ",
+" ............. .",
+"............. ..",
+"............... ",
+". ............ .",
+" ............ ..",
+"............... ",
+".............. .",
+"............. ..",
+" .. .. . .. . ..",
+".. ...... ..... ",
+".... ..... ... .",
+". ... ......  . ",
+" ..  ...   . .  ",
+".. .... ...... .",
+"...  . . .... ..",
+". ........ .... ",
+" ............. .",
+"............. ..",
+"............... ",
+". ............ .",
+" ............ ..",
+"............... ",
+".............. .",
+"............. ..",
+" ..  . . .... ..",
+".  ...... . ... ",
+"..... .  . ... .",
+".   ........  ..",
+" . ..  . .. ... ",
+" ... .... ...  .",
+"   .. ..... . ..",
+". .. .  .  .. . ",
+" ........... . .",
+".. .......... ..",
+"............... ",
+". ............ .",
+" ............ ..",
+"............... ",
+".............. .",
+"............. ..",
+"                ",
+"..... ..........",
+".. ....  ....  .",
+"                ",
+"  . . . . . . . ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . ... . . . .",
+"  ... . . . ... ",
+" . . ....... . .",
+"                ",
+"..... ..........",
+".. ....  ....  .",
+"                ",
+"  . . . . . . . ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . ... . . . .",
+"  ... . . ..... ",
+" . . . ... . . .",
+"  ... . . . ... ",
+" . . ....... . .",
+"                ",
+"..... ..........",
+".. ....  ....  .",
+"                ",
+"  . . . . . . . ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . ... . .",
+"  ....... . ... ",
+" . . . . .   . .",
+"  ..... . . ... ",
+" . . .   . . . .",
+"  ... . .   ... ",
+" . . . ..... . .",
+"                ",
+"..... ..........",
+".. ....  ....  .",
+"                ",
+"  . . . . . . . ",
+" . . ... . . . .",
+" ...............",
+" . . ... . . . .",
+"  ... .   ..... ",
+" . .   . . . . .",
+"  ... ... . ... ",
+" . . . .   . . .",
+"  ...   . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . ....... . .",
+"                ",
+"..... ..........",
+".. ....  ....  .",
+"                ",
+"  . . . . . . . ",
+" . . . . . . . .",
+" ...............",
+" . . . ... . . .",
+"  ... . . ..... ",
+" . . ... . . . .",
+"  ... . .   ... ",
+" . .   ... . . .",
+"  ... . .   ... ",
+" . . .   . . . .",
+"  ... . . . ... ",
+" . . ....... . .",
+"                ",
+"..... ..........",
+".. ....  ....  .",
+"                ",
+"  . . . . . . . ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... ... . ... ",
+" . . . . ... . .",
+"  ... .   . ... ",
+" . . ... . . . .",
+"  ... . ..  ... ",
+" . . ..... . . .",
+"                ",
+"..... ..........",
+".. ....  ....  .",
+"                ",
+"  . . . . . . . ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . ... . . . .",
+"  ... . ... ... ",
+" . . ....... . .",
+"                ",
+"..... ..........",
+".. ....  ....  .",
+"                ",
+"  . . . . . . . ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . ....... . .",
+"  ... . . ..... ",
+" . . ... . . . .",
+"  ... . ... ... ",
+" . . . . . . . .",
+"  ...   .   ... ",
+" . . . . . . . .",
+"  ... .   .  .. ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  . . . . . . . ",
+"                ",
+"................",
+"                ",
+". ....  ........",
+"..  . . . . .   ",
+"  ..  . ... ... ",
+" . . .   .   . .",
+"  ... . . . ... ",
+" . . . .   . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  . . . . . . . ",
+"                ",
+"................",
+"                ",
+". ....  ........",
+"..  . . . . .   ",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  . . . . . . . ",
+"                ",
+"................",
+"                ",
+". ....  ........",
+"..  . . . . .   ",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  . . . . . . . ",
+"                ",
+"................",
+"                ",
+". ....  ........",
+"..  . . . . .   ",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  . . . . . . . ",
+"                ",
+"................",
+"                ",
+". ....  ........",
+"..  . . . . .   ",
+"  ... . .   ... ",
+" . . .   . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  . . . . . . . ",
+"                ",
+"................",
+"                ",
+". ....  ........",
+"..  . . . . .   ",
+"  ... . .   ... ",
+" . . ... . . . .",
+"  ... . ... ... ",
+" . . .   .   . .",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ... .   . ... ",
+" . . . . . . . .",
+" ...............",
+" . . . . . . . .",
+"  . . . . . . . ",
+"                ",
+"................",
+"                ",
+". ....  ........",
+"..  . . . . .   ",
+"  ... . . . ... ",
+" . . . . . . . .",
+"  ..... ... ... ",
+" . . . . . . . .",
+"  ... ... ..... ",
+" . . . .   . . .",
+"  ...   . . ... ",
+" . . . . .   . .",
+" ...............",
+" . . . .   . . .",
+"  . . . . . . . ",
+"                ",
+"................",
+"                ",
+". ....  ........",
+"..  . . . . .   ",
+"    . . . . .   ",
+"     . . . .    ",
+"   .. . ... .   ",
+"  .. . . . .    ",
+"  . . . ... .  .",
+"     . . . .  . ",
+"    . . . .   ..",
+"     . . .  ... ",
+"    . . .  .. ..",
+"     . .  . ... ",
+"   .. .   ... ..",
+"  .. .  ... ... ",
+"  . .  .. ... ..",
+"      . ... ... ",
+"      ... ... ..",
+"    ... ... ... ",
+"                ",
+"  ...........   ",
+"  ... ... ..    ",
+"... ... ...     ",
+". ... ...       ",
+"... ... .       ",
+". ... ..        ",
+"... ...         ",
+". ...           ",
+"... .           ",
+". ..            ",
+"...             ",
+".               ",
+".               ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"               .",
+"              . ",
+"             . .",
+"            . . ",
+"           . . .",
+"          . . . ",
+"         . . ...",
+"        . . . . ",
+"       . . . . .",
+"      . . ... . ",
+"     . . . . . .",
+"    . . . . . . ",
+"                ",
+"                ",
+" ...........    ",
+". . . . . .     ",
+" . ... . .      ",
+". . . . .       ",
+" . . . .        ",
+"... . .         ",
+" . . .          ",
+". . .           ",
+" . .            ",
+". .             ",
+" .              ",
+".               ",
+"                ",
+"                ",
+"                ",
+"................",
+"................",
+"...   .....   ..",
+".. ...  .  ... .",
+".   .... ..... .",
+".. .... . ...  .",
+"... .. ... ..  .",
+"... . .. .. . ..",
+".... ..   .. ...",
+"... . .. .. . ..",
+"... .. ... .. ..",
+".. .... . .... .",
+".. ..... ..... .",
+".. ...  .  ... .",
+"...   .....   ..",
+"................",
+"................",
+"................",
+"...   .....   ..",
+".. ...     ... .",
+".. ....  ..... .",
+".. ....   .... .",
+"... .. ... .. ..",
+"... . .. .. . ..",
+".... ..   .. ...",
+"... . .. .. . ..",
+"... .. ... .. ..",
+".. .... . .... .",
+".. ..... ..... .",
+".. ..   .  ... .",
+"...    ....   ..",
+"................",
+"................",
+"................",
+"...   .....   ..",
+".. ...  .  ... .",
+".. ..... ..... .",
+".. .... . .... .",
+"... .. ... .. ..",
+"... . .. .. . ..",
+".... ..   .. ...",
+"... . .. .. . ..",
+"..  .. ... ..  .",
+"..  ... . ...  .",
+".. ..... ..... .",
+".. ...  .  ... .",
+"...   .....   ..",
+"................",
+"................",
+"................",
+"...   .....   ..",
+".. ...     ... .",
+".. .....  .... .",
+".. .... . .... .",
+"... .. ... .. ..",
+"... . .. .. . ..",
+".... ..   .. ...",
+"... . .. .. . ..",
+"... .. ... .. ..",
+".. ....   .... .",
+".. .....  .... .",
+".. ...     ... .",
+"...   .....   ..",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................"
+};
diff --git a/images/tiles-156.xpm b/images/tiles-156.xpm
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/images/tiles-16.xpm b/images/tiles-16.xpm
new file mode 100644 (file)
index 0000000..0ac0a43
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 8 1",
+"  c black",
+". c #00003F3F0000",
+"X c #727272727272",
+"o c #0000BFBF0000",
+"O c red",
+"+ c yellow",
+"@ c gray75",
+"# c #DFDFDFDFDFDF",
+/* pixels */
+"                                ",
+"  ############################  ",
+" # ########################## X ",
+" ## ######################## XX ",
+" ###                        XXX ",
+" ### @@@@@@@@@@@@@@@@@@@@@@ XXX ",
+" ### @@@@@@@@@@@@@@@@@@@@@@ XXX ",
+" ### @@@@@@oooooo@@@@  @@@@ XXX ",
+" ### @@@@ooo.o..o@@@@  @@@@ XXX ",
+" ### @@@@oo..o.oo@@      @@ XXX ",
+" ### @@@@@oooooo@@@      @@ XXX ",
+" ### @@@@@@oooo.@@@@@  @@@@ XXX ",
+" ### @@@@@oo+ooo.@@@@  @@@@ XXX ",
+" ### @@@.oo+++ooo.@@@@@@@@@ XXX ",
+" ### @@ooo+.+.+ooo.@@@@@@@@ XXX ",
+" ### @@ooo+o+o.ooo..@@@@@@@ XXX ",
+" ### @@ooo.+++oooo..@@@@@@@ XXX ",
+" ### @.oooo.+.+ooo..@@@@@@@ XXX ",
+" ### @oooo+o+o+ooo..@@@@@@@ XXX ",
+" ### @oooo.+++.ooo..@@@@@@@ XXX ",
+" ### @@oooo.+.oooo..@@@@@@@ XXX ",
+" ### @@.oooo.oooo..@@@@@@@@ XXX ",
+" ### @@@.ooooooo..@@OOOOO@@ XXX ",
+" ### @@@@........@@@OOOOO@@ XXX ",
+" ### @@@@@@@@@@@@@@@@@@@@@@ XXX ",
+" ### @@@@@@@@@@@@@@@@@@@@@@ XXX ",
+" ### @@@@@@@@@@@@@@@@@@@@@@ XXX ",
+" ###                        XXX ",
+" ## XXXXXXXXXXXXXXXXXXXXXXXX XX ",
+" # XXXXXXXXXXXXXXXXXXXXXXXXXX X ",
+"  XXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
+"                                "
+};
diff --git a/images/tiles-17.xpm b/images/tiles-17.xpm
new file mode 100644 (file)
index 0000000..552b7ad
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 10 1",
+"  c black",
+". c #00003F3F0000",
+"X c #3F3F00000000",
+"o c #3F3F3F3F0000",
+"O c #3F3F3F3F3F3F",
+"+ c #7F7F3D3D0000",
+"@ c #7F7F7F7F3F3F",
+"# c #3C3C0000BFBF",
+"$ c #3C3C0000FFFF",
+"% c #0000BFBF0000",
+/* pixels */
+"                                ",
+"  XXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
+" X XXXXXXXXXXXXXXXXXXXXXXXXXX @ ",
+" XX XXXXXXXXXXXXXXXXXXXXXXXX @@ ",
+" XXX                        @@@ ",
+" XXX ########+ooo###+o##o## @@@ ",
+" XXX #######oooo###+ooo#### @@@ ",
+" XXX #$#$#+oo#$#$+oo$o$#$#$ @@@ ",
+" XXX $#$#+oo#$#+ooo$#$#$#$# @@@ ",
+" XXX #$$+o$$$+oo$$$#$$$#$$$ @@@ ",
+" XXX $$$o$$$+oo$$$$$$$$$$$$ @@@ ",
+" XXX $$O $$O $$$$$$$$$$$$$$ @@@ ",
+" XXX $$O $$O $$$$$$$$$$$$$$ @@@ ",
+" XXX $$O $$O $$$$$$$$$$$$$$ @@@ ",
+" XXX $$O $$O $$$$$$$$$$$$$$ @@@ ",
+" XXX $$O $$O $$$$$$$$$$$$$$ @@@ ",
+" XXX $$O $$O $$$$$$$$$$$$$$ @@@ ",
+" XXX $                  $$$ @@@ ",
+" XXX .OOOOOOOOOOOOOOOOOO... @@@ ",
+" XXX .                  ... @@@ ",
+" XXX . O  O  O  O  O    ... @@@ ",
+" XXX % O  O  O  O  O    ... @@@ ",
+" XXX .                  .%. @@@ ",
+" XXX .%.%.%.%.%.%.%.%.%.%.% @@@ ",
+" XXX %.%.%.%.%.%.%.%.%.%.%. @@@ ",
+" XXX %%%%%%%%%%%%%%%%%%%%%% @@@ ",
+" XXX %%%%%%%%%%%%%%%%%%%%%% @@@ ",
+" XXX                        @@@ ",
+" XX @@@@@@@@@@@@@@@@@@@@@@@@ @@ ",
+" X @@@@@@@@@@@@@@@@@@@@@@@@@@ @ ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+"                                "
+};
diff --git a/images/tiles-18.xpm b/images/tiles-18.xpm
new file mode 100644 (file)
index 0000000..4863967
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 10 1",
+"  c black",
+". c #00003F3F0000",
+"X c #3F3F3F3F0000",
+"o c #3F3F3F3F3F3F",
+"O c #7F7F3D3D0000",
+"+ c #727272727272",
+"@ c #3C3C0000BFBF",
+"# c #3C3C0000FFFF",
+"$ c #0000BFBF0000",
+"% c #DFDFDFDFDFDF",
+/* pixels */
+"                                ",
+"  %%%%%%%%%%%%%%%%%%%%%%%%%%%%  ",
+" % %%%%%%%%%%%%%%%%%%%%%%%%%% + ",
+" %% %%%%%%%%%%%%%%%%%%%%%%%% ++ ",
+" %%%                        +++ ",
+" %%% @@@@@@@@OXXX@@@OX@@X@@ +++ ",
+" %%% @@@@@@@XXXX@@@OXXX@@@@ +++ ",
+" %%% @#@#@OXX@#@#OXX#X#@#@# +++ ",
+" %%% #@#@OXX@#@OXXX#@#@#@#@ +++ ",
+" %%% @##OX###OXX###@###@### +++ ",
+" %%% ###X###OXX############ +++ ",
+" %%% ##o ##o ############## +++ ",
+" %%% ##o ##o ############## +++ ",
+" %%% ##o ##o ############## +++ ",
+" %%% ##o ##o ############## +++ ",
+" %%% ##o ##o ############## +++ ",
+" %%% ##o ##o ############## +++ ",
+" %%% #                  ### +++ ",
+" %%% .oooooooooooooooooo... +++ ",
+" %%% .                  ... +++ ",
+" %%% . o  o  o  o  o    ... +++ ",
+" %%% $ o  o  o  o  o    ... +++ ",
+" %%% .                  .$. +++ ",
+" %%% .$.$.$.$.$.$.$.$.$.$.$ +++ ",
+" %%% $.$.$.$.$.$.$.$.$.$.$. +++ ",
+" %%% $$$$$$$$$$$$$$$$$$$$$$ +++ ",
+" %%% $$$$$$$$$$$$$$$$$$$$$$ +++ ",
+" %%%                        +++ ",
+" %% ++++++++++++++++++++++++ ++ ",
+" % ++++++++++++++++++++++++++ + ",
+"  ++++++++++++++++++++++++++++  ",
+"                                "
+};
diff --git a/images/tiles-19.xpm b/images/tiles-19.xpm
new file mode 100644 (file)
index 0000000..a5a6322
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 10 1",
+"  c black",
+". c #3F3F3F3F0000",
+"X c #3F3F3F3F3F3F",
+"o c gray50",
+"O c #3C3C0000BFBF",
+"+ c #3C3C0000FFFF",
+"@ c #0000DFDF0000",
+"# c green",
+"$ c gray75",
+"% c gray100",
+/* pixels */
+"                                ",
+"  @@@@@@@@@@@@@@@@@@@@@@@@@@@@  ",
+" @ @@@@@@@@@@@@@@@@@@@@@@@@@@ # ",
+" @@ @@@@@@@@@@@@@@@@@@@@@@@@ ## ",
+" @@@                        ### ",
+" @@@ OOOOOOOOOOOOOOOOOOOOOO ### ",
+" @@@ O+O+O+O+O+O+O+O+O+O+O+ ### ",
+" @@@ +O+O+O+O+O+O+O+O+O+O+O ### ",
+" @@@ ++O+ +OX++O+++O+++O+++ ### ",
+" @@@ ++++ +X  +++++++++++++ ### ",
+" @@@ O+++ X    XXXXXX++++O+ ### ",
+" @@@ ++++X      X     +++++ ### ",
+" @@@ +++X        X     ++++ ### ",
+" @@@ ++X          X     +++ ### ",
+" @@@ +++%%%%%%%%%$$$$$$++++ ### ",
+" @@@ +++%oo%%oo%%$o$o$$++++ ### ",
+" @@@ @@@%oX%%oX%%$$$$$$@@@@ ### ",
+" @@@ @@@%%%%%%%%%$$$$$$@@@@ ### ",
+" @@@ @@@%%oo%oo%%$o$o$$@@@@ ### ",
+" @@@ @@@%%oX%oX%%$$$o$$@@@@ ### ",
+" @@@ @@@%%oX%%%%%@@@@@@@@@@ ### ",
+" @@@ @@@@@..@@@@@@@@@@@@@@@ ### ",
+" @@@ @@@@@...@@@@@@@@@@@@@@ ### ",
+" @@@ @@@@@....@@@@@@@@@@@@@ ### ",
+" @@@ @@@@@@......@@@@@@@@@@ ### ",
+" @@@ @@@@@@@........@@@@@@@ ### ",
+" @@@ @@@@@@@@@.........@@@@ ### ",
+" @@@                        ### ",
+" @@ ######################## ## ",
+" @ ########################## # ",
+"  ############################  ",
+"                                "
+};
diff --git a/images/tiles-2.xpm b/images/tiles-2.xpm
new file mode 100644 (file)
index 0000000..557c241
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char *tiles__[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 3 1",
+"  c black",
+". c #66666666E6E6",
+"X c #CCCC7E7E6666",
+/* pixels */
+" ...............................................",
+" .                                             .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXX .....XXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXX ..   ..XXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX .. XXX ..XXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX ..XXXXX  XXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX ..XXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX ..XXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX ..XXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX ..XXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX ..XXXXX..XXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXX  ..XXX.. XXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXX  ..... XXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXX      XXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .",
+" ...............................................",
+"                                                "
+};
diff --git a/images/tiles-20.xpm b/images/tiles-20.xpm
new file mode 100644 (file)
index 0000000..0cc5660
--- /dev/null
@@ -0,0 +1,49 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 11 1",
+"  c black",
+". c #3F3F3F3F0000",
+"X c #3F3F3F3F3F3F",
+"o c #727272727272",
+"O c gray50",
+"+ c #3C3C0000BFBF",
+"@ c #3C3C0000FFFF",
+"# c #0000DFDF0000",
+"$ c gray75",
+"% c #DFDFDFDFDFDF",
+"& c gray100",
+/* pixels */
+"                                ",
+"  %%%%%%%%%%%%%%%%%%%%%%%%%%%%  ",
+" % %%%%%%%%%%%%%%%%%%%%%%%%%% o ",
+" %% %%%%%%%%%%%%%%%%%%%%%%%% oo ",
+" %%%                        ooo ",
+" %%% ++++++++++++++++++++++ ooo ",
+" %%% +@+@+@+@+@+@+@+@+@+@+@ ooo ",
+" %%% @+@+@+@+@+@+@+@+@+@+@+ ooo ",
+" %%% @@+@ @+X@@+@@@+@@@+@@@ ooo ",
+" %%% @@@@ @X  @@@@@@@@@@@@@ ooo ",
+" %%% +@@@ X    XXXXXX@@@@+@ ooo ",
+" %%% @@@@X      X     @@@@@ ooo ",
+" %%% @@@X        X     @@@@ ooo ",
+" %%% @@X          X     @@@ ooo ",
+" %%% @@@&&&&&&&&&$$$$$$@@@@ ooo ",
+" %%% @@@&OO&&OO&&$O$O$$@@@@ ooo ",
+" %%% ###&OX&&OX&&$$$$$$#### ooo ",
+" %%% ###&&&&&&&&&$$$$$$#### ooo ",
+" %%% ###&&OO&OO&&$O$O$$#### ooo ",
+" %%% ###&&OX&OX&&$$$O$$#### ooo ",
+" %%% ###&&OX&&&&&########## ooo ",
+" %%% #####..############### ooo ",
+" %%% #####...############## ooo ",
+" %%% #####....############# ooo ",
+" %%% ######......########## ooo ",
+" %%% #######........####### ooo ",
+" %%% #########.........#### ooo ",
+" %%%                        ooo ",
+" %% oooooooooooooooooooooooo oo ",
+" % oooooooooooooooooooooooooo o ",
+"  oooooooooooooooooooooooooooo  ",
+"                                "
+};
diff --git a/images/tiles-21.xpm b/images/tiles-21.xpm
new file mode 100644 (file)
index 0000000..0669a39
--- /dev/null
@@ -0,0 +1,76 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"58 58 12 1",
+"  c black",
+". c #00007F7F0000",
+"X c #7F7F7F7F0000",
+"o c #5D5D5D5D5D5D",
+"O c gray50",
+"+ c blue",
+"@ c #4F4F4F4FFFFF",
+"# c #BFBF79790000",
+"$ c red",
+"% c #FFFF77770000",
+"& c gray75",
+"* c gray100",
+/* pixels */
+"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
+"&OO####OOOO####OOOO####OOOO####OOOO####OOOO####OOOO####OOo",
+"&OO####OOOO####OOOO####OOOO####OOOO####OOOO####OOOO####OOo",
+"&OOooooooooooooooooooooooooooooooooooooooooooooooooooooOOo",
+"&OOo**************************************************&OOo",
+"&##o*###X################ ##############$#$#$#$######*&##o",
+"&##o*OOOOOOOOOOOO######## o&#####X#OOOOOo&o&o&o@#####*&##o",
+"&##o*##########XO########  o######OO&O&OoOOoOoo######*&##o",
+"&##o*###########O########o   #####OOOOOOoOOoOoo######*&##o",
+"&OOo*#@#####@###O@####@#oXX@####@OO&O@#@oOOoOOo@###@#*&OOo",
+"&OOo*$oooooooooooooooooooooooooooooooooooooooooooooo$*&OOo",
+"&OOo*#&oooooooooooooooooooooooooooooooooooo&ooooOOo&#*&OOo",
+"&OOo*$ooOoooooooooooooooooooooooooooooooooo&ooooOoOo$*&OOo",
+"&##o*#&OoOo&&o&&o&&o&&o&&o&&o&&o&&o&&o&&o&&o&&ooooo&#*&##o",
+"&##o*$oOOoooooooooooooooooooooooooooooooooo&oooooOOo$*&##o",
+"&##o*#&oooooooooooooooooooooooooooooooooooo&ooooOoO&#*&##o",
+"&##o*$oooooooooooooooooooooooooooooooooooooooooooooo$*&##o",
+"&OOo*##@O&OO@####@####@O###@####@OOOO@#@ooo&ooo@###@#*&OOo",
+"&OOo*###OOOO###########O######X##O&OO###ooo&ooo######*&OOo",
+"&OOo*###O&OO###########OOOOO#####OOOO###ooooooo##OOO#*&OOo",
+"&OOo*###OOOOOOOOOOOOOOOO###O#####O&OO###ooo&ooo#&o#O#*&OOo",
+"&##o*###O&OO###############O#####OOOO###ooo&ooo#&O#O#*&##o",
+"&##o*###OOOOO##############O#&&&&&&&O##@ooooooo@###O#*&##o",
+"&##o*##OOO&OO***OOOOOO*O*OOO &&&$&o&O###ooo&ooo####O#*&##o",
+"&##o*##OOOOO&O*O&O&O&O****Oo &&o&&&&O###ooo&ooo###XO#*&##o",
+"&OOo*##OOOO**o*o**OOOOOo*OoO &o&&&$&O###ooooooo####O#*&OOo",
+"&OOo*##OOOOO*****O$&&&&&&oOo &&O&o&&O###ooo&ooo####O#*&OOo",
+"&OOo*##$&&&&o$&&&o*O*O*O&OoO &&&O&O&O##@ooo&ooo@###O#*&OOo",
+"&OOo*#o&*O*Oo*O*Oo&&&&&&&oOo &&&&&o&OX##ooooooo####O#*&OOo",
+"&##o*#o&&&&&o&&&&o&&&&&&&OoO       OO###ooo&ooo####O#*&##o",
+"&##o*#o&&&&&o&&&&o*O*O*O&oOooooooO&OO###ooo&ooo####O#*&##o",
+"&##o*#o&*O*Oo*O*Oo$&&&&&&OoooooooOOOO###ooooooo#OOOO#*&##o",
+"&##o*#o$&&&&o$&&&o+++++++&OOOOOooO&OO##@ooo&ooo@O####*&##o",
+"&OOo*#o+++++++  ++ ++ ++@&&OO&OooOOOO###ooo&ooo#O#OO#*&OOo",
+"&OOo*##XXXXooXooXXoX o @@&oOOoOooO&OO###ooooooo#O#oo#*&OOo",
+"&OOo*###OOOOooooooo oo  @&*&O*OoOOOOO###ooo&ooo#O#OO#*&OOo",
+"&OOo*##Oo OXXOOOOOO OOO @&O&&O&oO*&OO###ooo&ooo#O#oo#*&OOo",
+"&##o*# O  OoooooooOOOO @@&*&&*&o**OO*##@ooooooo@O#OO#*&##o",
+"&##o*o&OOOoOoOoOoOoOOOO @&O&&O&**O&**###ooo&ooo#O#oo#*&##o",
+"&##o*ooOOOoXXXXXXoo@OOO @$&&&&$******###ooo&ooo#O####*&##o",
+"&##o*o&OO.ooooo##Oo@OO @oooooooo*OOOO##@ooooooo@O####*&##o",
+"&OOo*ooOO.ooooo#XooOOO @&O*OO*Oo**&OOOOOooo&ooo#O####*&OOo",
+"&OOo*o&OOOooooo##OoOO. @&&O&&O&oO*OOOOOOooo&oooOO####*&OOo",
+"&OOo*ooOOOooooo#XooOO.O &&*&&*&oOO&O&O&Oooooooo######*&OOo",
+"&OOo*o&OOOo   ###OoOOOO $&O&&O$oOOOOOOOOooo&ooo######*&OOo",
+"&##o*ooOOOO#####XoOOOO @ooooooooOO&OO##@ooo&ooo@#####*&##o",
+"&##o*o&OOOOOOOOOOOOOOO @&OOOOOoOOOOOO###ooooooo######*&##o",
+"&##o*ooOOOOOOOOXOOOOOOO &*&&*&oOOOOOO###oOOooOo###X##*&##o",
+"&##o*o&oOOOOOOOOOOOOOOO &O&&O&oOOOOOO###ooOoOoo######*&##o",
+"&OOo*#oo&o&o&o&o&o&O%O @$&&&&$X#####X##@oOOoOOo@#####*&OOo",
+"&OOo*##ooooooooooooO%O#ooooooXX#######X#o&o&o&o######*&OOo",
+"&OOo*#X##XXXXXXXXo OOO##XXXXXXX#X####################*&OOo",
+"&OOo*############oOOO###################$#$#$#$######*&OOo",
+"&##o**************************************************&##o",
+"&##o&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&##o",
+"&##OOOO####OOOO####OOOO####OOOO####OOOO####OOOO####OOOO##o",
+"&##OOOO####OOOO####OOOO####OOOO####OOOO####OOOO####OOOO##o",
+"&ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo"
+};
diff --git a/images/tiles-22.xpm b/images/tiles-22.xpm
new file mode 100644 (file)
index 0000000..247c180
--- /dev/null
@@ -0,0 +1,76 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"58 58 12 1",
+"  c black",
+". c #00007F7F0000",
+"X c #7F7F7F7F0000",
+"o c #5D5D5D5D5D5D",
+"O c gray50",
+"+ c blue",
+"@ c #4F4F4F4FFFFF",
+"# c #BFBF79790000",
+"$ c red",
+"% c #FFFF77770000",
+"& c gray75",
+"* c gray100",
+/* pixels */
+"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
+"&OO####OOOO####OOOO####OOOO####OOOO####OOOO####OOOO####OOo",
+"&OO####OOOO####OOOO####OOOO####OOOO####OOOO####OOOO####OOo",
+"&OOooooooooooooooooooooooooooooooooooooooooooooooooooooOOo",
+"&OOo                                                  &OOo",
+"&##o * * * * * * * * * *   * * * * * * * * * * * * *  &##o",
+"&##o  * * * * * * * * * * o&* * * *OOOOOo&o&o&o * * * &##o",
+"&##o * * * * * * * * * *   o * * *OO&O&OoOOoOoo* * *  &##o",
+"&##o  * * * * * * * * * *o    * * OOOOOOoOOoOoo * * * &##o",
+"&OOo * * * * * * * * * *oXX@ * * OO&O* *oOOoOOo* * *  &OOo",
+"&OOo  oooooooooooooooooooooooooooooooooooooooooooooo* &OOo",
+"&OOo *&oooooooooooooooooooooooooooooooooooo&ooooOOo&  &OOo",
+"&OOo  ooOoooooooooooooooooooooooooooooooooo&ooooOoOo* &OOo",
+"&##o *&OoOo&&o&&o&&o&&o&&o&&o&&o&&o&&o&&o&&o&&ooooo&  &##o",
+"&##o  oOOoooooooooooooooooooooooooooooooooo&oooooOOo* &##o",
+"&##o *&oooooooooooooooooooooooooooooooooooo&ooooOoO&  &##o",
+"&##o  oooooooooooooooooooooooooooooooooooooooooooooo* &##o",
+"&OOo * *O&OO * * * * * * * * * * OOOO* *ooo&ooo* * *  &OOo",
+"&OOo  * OOOO* * * * * * * * * * *O&OO * ooo&ooo * * * &OOo",
+"&OOo * *O&OO * * * * * * * * * * OOOO* *ooooooo* * *  &OOo",
+"&OOo  * OOOO* * * * * * * * * * *O&OO * ooo&ooo * * * &OOo",
+"&##o * *O&OO * * * * * * * * * * OOOO* *ooo&ooo* * *  &##o",
+"&##o  * OOOOO * * * * * * * *&&&&&&&O * ooooooo * * * &##o",
+"&##o * OOO&OO***OOOOOO*O*OOO &&&$&o&O* *ooo&ooo* * *  &##o",
+"&##o  *OOOOO&O*O&O&O&O****Oo &&o&&&&O * ooo&ooo * * * &##o",
+"&OOo * OOOO**o*o**OOOOOo*OoO &o&&&$&O* *ooooooo* * *  &OOo",
+"&OOo  *OOOOO*****O$&&&&&&oOo &&O&o&&O * ooo&ooo * * * &OOo",
+"&OOo * $&&&&o$&&&o*O*O*O&OoO &&&O&O&O* *ooo&ooo* * *  &OOo",
+"&OOo  o&*O*Oo*O*Oo&&&&&&&oOo &&&&&o&O * ooooooo * * * &OOo",
+"&##o *o&&&&&o&&&&o&&&&&&&OoO       OO* *ooo&ooo* * *  &##o",
+"&##o  o&&&&&o&&&&o*O*O*O&oOooooooO&OO * ooo&ooo * * * &##o",
+"&##o *o&*O*Oo*O*Oo$&&&&&&OoooooooOOOO* *ooooooo* * *  &##o",
+"&##o  o$&&&&o$&&&o+++++++&OOOOOooO&OO * ooo&ooo * * * &##o",
+"&OOo *o+++++++  ++ ++ ++@&&OO&OooOOOO* *ooo&ooo* * *  &OOo",
+"&OOo  * XXXooXooXXoX o @@&oOOoOooO&OO * ooooooo * * * &OOo",
+"&OOo * *OOOOooooooo oo  @&*&O*OoOOOOO* *ooo&ooo* * *  &OOo",
+"&OOo  *Oo OXXOOOOOO OOO @&O&&O&oO*&OO * ooo&ooo * * * &OOo",
+"&##o * O  OoooooooOOOO @@&*&&*&o**OO** *ooooooo* * *  &##o",
+"&##o o&OOOoOoOoOoOoOOOO @&O&&O&**O&** * ooo&ooo * * * &##o",
+"&##o ooOOOoXXXX* oo@OOO @$&&&&$******* *ooo&ooo* * *  &##o",
+"&##o o&OO.ooooo *Oo@OO @oooooooo*OOOO * ooooooo * * * &##o",
+"&OOo ooOO.ooooo* ooOOO @&O*OO*Oo**&OOOOOooo&ooo* * *  &OOo",
+"&OOo o&OOOooooo *OoOO. @&&O&&O&oO*OOOOOOooo&ooo * * * &OOo",
+"&OOo ooOOOooooo* ooOO.O &&*&&*&oOO&O&O&Oooooooo* * *  &OOo",
+"&OOo o&OOOo   * *OoOOOO $&O&&O$oOOOOOOOOooo&ooo * * * &OOo",
+"&##o ooOOOO* * * oOOOO @ooooooooOO&OO* *ooo&ooo* * *  &##o",
+"&##o o&OOOOOOOOOOOOOOO @&OOOOOoOOOOOO * ooooooo * * * &##o",
+"&##o ooOOOOOOOOXOOOOOOO &*&&*&oOOOOOO* *oOOooOo* * *  &##o",
+"&##o o&oOOOOOOOOOOOOOOO &O&&O&oOOOOOO * ooOoOoo * * * &##o",
+"&OOo *oo&o&o&o&o&o&O%O @$&&&&$ * * * * *oOOoOOo* * *  &OOo",
+"&OOo  *ooooooooooooO%O*oooooo * * * * * o&o&o&o * * * &OOo",
+"&OOo * * * * * * o OOO * * * * * * * * * * * * * * *  &OOo",
+"&OOo  * * * * * *oOOO * * * * * * * * * * * * * * * * &OOo",
+"&##o                                                  &##o",
+"&##o&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&##o",
+"&##OOOO####OOOO####OOOO####OOOO####OOOO####OOOO####OOOO##o",
+"&##OOOO####OOOO####OOOO####OOOO####OOOO####OOOO####OOOO##o",
+"&ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo"
+};
diff --git a/images/tiles-23.xpm b/images/tiles-23.xpm
new file mode 100644 (file)
index 0000000..ed7bd99
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 2 1",
+"  c black",
+". c #7E7E7E7E7E7E",
+/* pixels */
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"........ . . . . . . . ..... . . .",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+".................................."
+};
diff --git a/images/tiles-24.xpm b/images/tiles-24.xpm
new file mode 100644 (file)
index 0000000..9552905
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 2 1",
+"  c black",
+". c #7E7E7E7E7E7E",
+/* pixels */
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"........ . . . . . . . ..... . . .",
+"..................................",
+"..................................",
+"..................................",
+".................................."
+};
diff --git a/images/tiles-25.xpm b/images/tiles-25.xpm
new file mode 100644 (file)
index 0000000..00c4e3b
--- /dev/null
@@ -0,0 +1,62 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"42 42 14 1",
+"  c black",
+". c #00007F7F0000",
+"X c #7F7F7F7F0000",
+"o c #5D5D5D5D5D5D",
+"O c gray50",
+"+ c blue",
+"@ c #4F4F4F4FFFFF",
+"# c green",
+"$ c #BFBF79790000",
+"% c red",
+"& c #FFFF77770000",
+"* c yellow",
+"= c gray75",
+"- c gray100",
+/* pixels */
+"==========================================",
+"=OO****OOOO****OOOO****OOOO****OOOO****OOo",
+"=OO****OOOO****OOOO****OOOO****OOOO****OOo",
+"=OOooooooooooooooooooooooooooooooooooooOOo",
+"=OOo----------------------------------=OOo",
+"=**o-$$$$$$$$========$$XO$o$$$o$o$$$$-=**o",
+"=**o-$$$======%OOOOO%OXOOXo$XOOo$$$o$-=**o",
+"=**o-$$==&OO==OOOOOOo oo$$$XO$$O$$o$$-=**o",
+"=**o-$===OOO==OOOOO@ OOo$OoO$$XXo$X$$-=**o",
+"=OOo-$=O=-oO=-OOOOo@OOOXXoX$$$o$$$oo$-=OOo",
+"=OOo-$O==OOO-OOOOo OOoX$$$$$$O$$ooo$$-=OOo",
+"=OOo-$===OOOO=OOO OOo Oo$O$$OoXXo$$X$-=OOo",
+"=OOo-$=O=OOO==OOOOO@ OOoXoO$oX$$$$$$$-=OOo",
+"=**o-$===OOO==OOOOo@OOOXXooO$o$$$$$o$-=**o",
+"=**o-$=O=OOO=-OOOo OOOooX$$$$$oOXOXo$-=**o",
+"=**o-$===oOO-OOOO OOo OoX$$$ooOo$$$o$-=**o",
+"=**o-$==-OOOO=OOOOO@ OOoX$oOOXoo$$$$$-=**o",
+"=OOo-$=-=OOO==OOOOo@OOOXoOoXXo$$$$$o$-=OOo",
+"=OOo-$-==oOO==OOOo OOoXoXo$$$$$$$$$$$-=OOo",
+"=OOo-$==OOOO==OOO OOo OoX$o$$$$$$$$o$-=OOo",
+"=OOo-$=O=OOO=-OOOOO@ OOoX$$$$$$$$$$$$-=OOo",
+"=**o-$O==OOO-OOOOOo@OOOoX$o$$$$$$$$o$-=**o",
+"=**o-$===o-oO=OOOo OOOOoX$$$$$$$$$$$$-=**o",
+"=**o-$=O=o-o==OOO OOOOOoX$o$$$$$$$$o$-=**o",
+"=**o-$OO=OOO==OOOOOOOOoXX$$$$$$$$$$$$-=**o",
+"=OOo-$=O=o-o==%OOOOO%ooXX$o$$o$$o$$o$-=OOo",
+"=OOo-$OO=o-o=OoooooooOoXX$$$$$$$$$$$$-=OOo",
+"=OOo-$=O=OOOOooooooo OoXoOO.OOOOOOO$$-=OOo",
+"=OOo-$O==OoOOOOOO*OOOOoXoOO.OOOOOOOOO-=OOo",
+"=**o-$===OOOOO***OoO OooOOOOOOOOOOOOO-=**o",
+"=**o-$===OoOO***OOOOOOoXOOOOOOOO+OO$#-=**o",
+"=**o-$===&OO*OOOOOoO &oXOOOOOOOO+OO#$-=**o",
+"=**o-$===ooooooooooooooXOOOOOOOOOOO$#-=**o",
+"=OOo-$==oooooooooooooooXOoO+O.OOOOO$$-=OOo",
+"=OOo-$=ooooooooooooooooXOXO+O.OOOOO#$-=OOo",
+"=OOo-$$XXXXXXXXXXXXX.X.X#$#$#$#OO$$$$-=OOo",
+"=OOo-$$$XXXXXXXXXXXXXXXX$$$$$$$OO$#$#-=OOo",
+"=**o----------------------------------=**o",
+"=**o===================================**o",
+"=**OOOO****OOOO****OOOO****OOOO****OOOO**o",
+"=**OOOO****OOOO****OOOO****OOOO****OOOO**o",
+"=ooooooooooooooooooooooooooooooooooooooooo"
+};
diff --git a/images/tiles-26.xpm b/images/tiles-26.xpm
new file mode 100644 (file)
index 0000000..0b9bac7
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"42 42 12 1",
+"  c black",
+". c #00007F7F0000",
+"X c #7F7F7F7F0000",
+"o c #5D5D5D5D5D5D",
+"O c gray50",
+"+ c blue",
+"@ c #4F4F4F4FFFFF",
+"# c red",
+"$ c #FFFF77770000",
+"% c yellow",
+"& c gray75",
+"* c gray100",
+/* pixels */
+"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
+"&OO%%%%OOOO%%%%OOOO%%%%OOOO%%%%OOOO%%%%OOo",
+"&OO%%%%OOOO%%%%OOOO%%%%OOOO%%%%OOOO%%%%OOo",
+"&OOooooooooooooooooooooooooooooooooooooOOo",
+"&OOo                                  &OOo",
+"&%%o * * * * &&&&&&&&* XO*o* *o*o* *  &%%o",
+"&%%o  * &&&&&&#OOOOO#OXOOXo XOOo* *o* &%%o",
+"&%%o * &&$OO&&OOOOOOo oo * XO* O *o*  &%%o",
+"&%%o  &&&OOO&&OOOOO@ OOo*OoO* XXo X * &%%o",
+"&OOo *&O&*oO&*OOOOo@OOOXXoX* *o* *oo  &OOo",
+"&OOo  O&&OOO*OOOOo OOoX * * *O* ooo * &OOo",
+"&OOo *&&&OOOO&OOO OOo Oo O *OoXXo* X  &OOo",
+"&OOo  &O&OOO&&OOOOO@ OOo*oO oX* * * * &OOo",
+"&%%o *&&&OOO&&OOOOo@OOOXXooO o * * o  &%%o",
+"&%%o  &O&OOO&*OOOo OOOoo* * * oOXOX * &%%o",
+"&%%o *&&&oOO*OOOO OOo Oo * *ooOo * *  &%%o",
+"&%%o  &&*OOOO&OOOOO@ OOo* oOOXoo* * * &%%o",
+"&OOo *&*&OOO&&OOOOo@OOOXoOoXXo * * *  &OOo",
+"&OOo  *&&oOO&&OOOo OOoXo* * * * * * * &OOo",
+"&OOo *&&OOOO&&OOO OOo Oo * * * * * *  &OOo",
+"&OOo  &O&OOO&*OOOOO@ OOo* * * * * * * &OOo",
+"&%%o *O&&OOO*OOOOOo@OOOo * * * * * *  &%%o",
+"&%%o  &&&o*oO&OOOo OOOOo* * * * * * * &%%o",
+"&%%o *&O&o*o&&OOO OOOOOo * * * * * *  &%%o",
+"&%%o  OO&OOO&&OOOOOOOOo * * * * * * * &%%o",
+"&OOo *&O&o*o&&#OOOOO#oo* * * * * * *  &OOo",
+"&OOo  OO&o*o&OoooooooOo * * * * * * * &OOo",
+"&OOo *&O&OOOOooooooo Oo*oOO.OOOOOOO*  &OOo",
+"&OOo  O&&OoOOOOOO%OOOOo oOO.OOOOOOOOO &OOo",
+"&%%o *&&&OOOOO%%%OoO OooOOOOOOOOOOOOO &%%o",
+"&%%o  &&&OoOO%%%OOOOOOo OOOOOOOO+OO * &%%o",
+"&%%o *&&&$OO%OOOOOoO $o*OOOOOOOO+OO*  &%%o",
+"&%%o  &&&oooooooooooooo OOOOOOOOOOO * &%%o",
+"&OOo *&&ooooooooooooooo*OoO+O.OOOOO*  &OOo",
+"&OOo  &oooooooooooooooo OXO+O.OOOOO * &OOo",
+"&OOo * * * * * * * * * * * * * * * *  &OOo",
+"&OOo  * * * * * * * * * * * * * * * * &OOo",
+"&%%o                                  &%%o",
+"&%%o&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%o",
+"&%%OOOO%%%%OOOO%%%%OOOO%%%%OOOO%%%%OOOO%%o",
+"&%%OOOO%%%%OOOO%%%%OOOO%%%%OOOO%%%%OOOO%%o",
+"&ooooooooooooooooooooooooooooooooooooooooo"
+};
diff --git a/images/tiles-27.xpm b/images/tiles-27.xpm
new file mode 100644 (file)
index 0000000..caddb57
--- /dev/null
@@ -0,0 +1,67 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 50 11 1",
+"  c black",
+". c #00007F7F0000",
+"X c #7F7F7F7F0000",
+"o c #5D5D5D5D5D5D",
+"O c #00000000AFAF",
+"+ c blue",
+"@ c #4F4F4F4FFFFF",
+"# c green",
+"$ c #BFBF79790000",
+"% c gray75",
+"& c gray100",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o",
+"%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o",
+"%@@oooooooooooooooooooooooooooo@@o",
+"%@@o&&&&&&&&&&&&&&&&&&&&&&&&&&%@@o",
+"%@@o&&&&&&XXXXXXXXXXXXX&&&&&&&%@@o",
+"%@@o&&&&&&XXXXXXXXXXXXXX&&&&&&%@@o",
+"%@@o&&&&&&XXooooooooooooo&&&&&%@@o",
+"%@@o&&&&&&XXo     o     o&&&&&%@@o",
+"%@@o&&&&&&XXo     oOOOOOOO&&&&%@@o",
+"%@@o&&&&&&XXoooooooO+++++++&&&%@@o",
+"%@@o&&&&&&XXo     oO+OO+OO+&&&%@@o",
+"%@@o&&&&&&XXo     oO+OO+OO+&&&%@@o",
+"%@@o&&&&&&XXoooooooO+++++++&&&%@@o",
+"%@@o&&&&&&XXo     oO+OO+OO+&&&%@@o",
+"%@@o&&&.......... oO+OO+OO+&&&%@@o",
+"%@@o&&&.##########oO+++++++&&&%@@o",
+"%@@o&&&.#oo#oo#oo#oO+OO+OO+&&&%@@o",
+"%@@o&&&.#oo#oo#oo#oO+OO+OO+&&&%@@o",
+"%@@o&&&.##########oO+++++++&&&%@@o",
+"%@@o&&&.#oo#oo#oo#oO+OO+OO+&&&%@@o",
+"%@@o& @.#oo#oo#oo#oO+OO+OO+@@&%@@o",
+"%@@o& @.##########oO+++++++ @&%@@o",
+"%@@o& @.#oo#oo#oo#oO+OO+OO+ @&%@@o",
+"%@@o& @.#oo#oo#oo#$O+OO+OO+ @&%@@o",
+"%@@o& @$##########$$+++++++ @&%@@o",
+"%@@o& @$$$$$$$$$$$$$$$$$$$$ @&%@@o",
+"%@@o& @$$$$$$$ @@@@@$$$$$$$ @&%@@o",
+"%@@o& @$$$$$$ @@   @@$$$$$$ @&%@@o",
+"%@@o& @$$$$$ @@ $$$ @@$$$$$ @&%@@o",
+"%@@o& @$$$$$ @@$$$$$  $$$$$ @&%@@o",
+"%@@o& @$$$$$ @@$$$$$$$$$$$$ @&%@@o",
+"%@@o& @$$$$$ @@$$$$$$$$$$$$ @&%@@o",
+"%@@o& @$$$$$ @@$$$$$$$$$$$$ @&%@@o",
+"%@@o& @$$$$$ @@$$$$$$$$$$$$ @&%@@o",
+"%@@o& @$$$$$ @@$$$$$@@$$$$$ @&%@@o",
+"%@@o& @$$$$$  @@$$$@@ $$$$$ @&%@@o",
+"%@@o& @$$$$$$  @@@@@ $$$$$$ @&%@@o",
+"%@@o& @$$$$$$$      $$$$$$$ @&%@@o",
+"%@@o& @$$$$$$$$$$$$$$$$$$$$ @&%@@o",
+"%@@o& @$$$$$$$$$$$$$$$$$$$$ @&%@@o",
+"%@@o& @$$$$$$$$$$$$$$$$$$$$ @&%@@o",
+"%@@o& @$$$$$$$$$$$$$$$$$$$$ @&%@@o",
+"%@@o& @@@@@@@@@@@@@@@@@@@@@@@&%@@o",
+"%@@o&                        &%@@o",
+"%@@o&&&&&&&&&&&&&&&&&&&&&&&&&&%@@o",
+"%@@o%%%%%%%%%%%%%%%%%%%%%%%%%%%@@o",
+"%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o",
+"%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o",
+"%ooooooooooooooooooooooooooooooooo"
+};
diff --git a/images/tiles-28.xpm b/images/tiles-28.xpm
new file mode 100644 (file)
index 0000000..c35898d
--- /dev/null
@@ -0,0 +1,66 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 50 10 1",
+"  c black",
+". c #00007F7F0000",
+"X c #7F7F7F7F0000",
+"o c #5D5D5D5D5D5D",
+"O c #00000000AFAF",
+"+ c blue",
+"@ c #4F4F4F4FFFFF",
+"# c green",
+"$ c gray75",
+"% c gray100",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o",
+"$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o",
+"$@@oooooooooooooooooooooooooooo@@o",
+"$@@o                          $@@o",
+"$@@o % % %XXXXXXXXXXXXX% % %  $@@o",
+"$@@o  % % XXXXXXXXXXXXXX% % % $@@o",
+"$@@o % % %XXooooooooooooo% %  $@@o",
+"$@@o  % % XXo     o     o % % $@@o",
+"$@@o % % %XXo     oOOOOOOO %  $@@o",
+"$@@o  % % XXoooooooO+++++++ % $@@o",
+"$@@o % % %XXo     oO+OO+OO+%  $@@o",
+"$@@o  % % XXo     oO+OO+OO+ % $@@o",
+"$@@o % % %XXoooooooO+++++++%  $@@o",
+"$@@o  % % XXo     oO+OO+OO+ % $@@o",
+"$@@o % .......... oO+OO+OO+%  $@@o",
+"$@@o  %.##########oO+++++++ % $@@o",
+"$@@o % .#oo#oo#oo#oO+OO+OO+%  $@@o",
+"$@@o  %.#oo#oo#oo#oO+OO+OO+ % $@@o",
+"$@@o % .##########oO+++++++%  $@@o",
+"$@@o  %.#oo#oo#oo#oO+OO+OO+ % $@@o",
+"$@@o  @.#oo#oo#oo#oO+OO+OO+@@ $@@o",
+"$@@o  @.##########oO+++++++ @ $@@o",
+"$@@o  @.#oo#oo#oo#oO+OO+OO+ @ $@@o",
+"$@@o  @.#oo#oo#oo#%O+OO+OO+ @ $@@o",
+"$@@o  @%########## %+++++++ @ $@@o",
+"$@@o  @ % % % % % % % % % % @ $@@o",
+"$@@o  @% % % % @@@@@ % % %  @ $@@o",
+"$@@o  @ % % % @@   @@ % % % @ $@@o",
+"$@@o  @% % % @@  %  @@ % %  @ $@@o",
+"$@@o  @ % %  @@ % %   % % % @ $@@o",
+"$@@o  @% % % @@% % % % % %  @ $@@o",
+"$@@o  @ % %  @@ % % % % % % @ $@@o",
+"$@@o  @% % % @@% % % % % %  @ $@@o",
+"$@@o  @ % %  @@ % % % % % % @ $@@o",
+"$@@o  @% % % @@% % %@@ % %  @ $@@o",
+"$@@o  @ % %   @@% %@@ % % % @ $@@o",
+"$@@o  @% % %   @@@@@ % % %  @ $@@o",
+"$@@o  @ % % %       % % % % @ $@@o",
+"$@@o  @% % % % % % % % % %  @ $@@o",
+"$@@o  @ % % % % % % % % % % @ $@@o",
+"$@@o  @% % % % % % % % % %  @ $@@o",
+"$@@o  @ % % % % % % % % % % @ $@@o",
+"$@@o  @@@@@@@@@@@@@@@@@@@@@@@ $@@o",
+"$@@o                          $@@o",
+"$@@o                          $@@o",
+"$@@o$$$$$$$$$$$$$$$$$$$$$$$$$$$@@o",
+"$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o",
+"$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o",
+"$ooooooooooooooooooooooooooooooooo"
+};
diff --git a/images/tiles-29.xpm b/images/tiles-29.xpm
new file mode 100644 (file)
index 0000000..bf58e80
--- /dev/null
@@ -0,0 +1,49 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 9 1",
+"  c black",
+". c #5D5D5D5D5D5D",
+"X c gray50",
+"o c blue",
+"O c #BFBF79790000",
+"+ c red",
+"@ c #FFFF77770000",
+"# c gray75",
+"$ c gray100",
+/* pixels */
+"##################################",
+"#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"#OO............................OO.",
+"#OO.$$$$$$$$$$$$$$$$$$$$$$$$$$#OO.",
+"#OO.$$$$$$$$$$$$$$$$$$$$$$$$$$#OO.",
+"#OO.$$$$$$$$$$$$$$$$$$$$$$$$$$#OO.",
+"#OO.$$$$$$$$$$$$$$$$$$$$$$$$$$#OO.",
+"#OO.$$$$@@+++++@$$$$$$$$$$$$$$#OO.",
+"#OO.$$$$+@@@@@@@$$$$$$$$$$$.$$#OO.",
+"#OO.$$$$++@@$$$$$$$$$$$$$$X.$$#OO.",
+"#OO.$$$$++@@@$$$$$$ $$$$$X.$$$#OO.",
+"#OO.$$$$++@@oo$$$$$ $$$$XX.$$$#OO.",
+"#OO.$$$$++@@o$ $$$$ $$$$  .$$$#OO.",
+"#OO.$$$$++@@@@@++++ +++$  .$$$#OO.",
+"#OO.$$$$++@@@@@@@@@@@@@$  .$$$#OO.",
+"#OO.$$$$++@@@@@@@@@@@@@.  .$$$#OO.",
+"#OO.$$$$$ . @. @. @. XXX  .$$$#OO.",
+"#OO.$$$. ............ .X  .$$$#OO.",
+"#OO.$$ ....  .  .  ....   .$$$#OO.",
+"#OO.$$....   .  .   ....  .$$$#OO.",
+"#OO.$$ .. ..  ..  .. ..   .$$$#OO.",
+"#OO.$$ .. ..  ..  .. .. XX.$$$#OO.",
+"#OO.$$....   .  .   ....$X.$$$#OO.",
+"#OO.$$ ....  .  .  .... $$X.$$#OO.",
+"#OO.$$$. ............ .$$$$.$$#OO.",
+"#OO.$$$$$ . $. $. $. $$$$$$$$$#OO.",
+"#OO.$$$$$$$$$$$$$$$$$$$$$$$$$$#OO.",
+"#OO.$$$$$$$$$$$$$$$$$$$$$$$$$$#OO.",
+"#OO.$$$$$$$$$$$$$$$$$$$$$$$$$$#OO.",
+"#OO.###########################OO.",
+"#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"#................................."
+};
diff --git a/images/tiles-3.xpm b/images/tiles-3.xpm
new file mode 100644 (file)
index 0000000..12fcb95
--- /dev/null
@@ -0,0 +1,58 @@
+/* XPM */
+static char *tiles__[] = {
+/* columns rows colors chars-per-pixel */
+"39 47 5 1",
+"  c black",
+". c #00007F7F0000",
+"X c red",
+"o c gray81",
+"O c gray100",
+/* pixels */
+"                                       ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" O.....OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOO                                OO ",
+" OO  oooooooooooooooooooooooooooooo OO ",
+" OO  oooo   ooooooo   ooooooo ooooo OO ",
+" OO  oooo oo ooooo ooo oooooo ooooo OO ",
+" OO  oooo oo ooooo oooooooooo ooooo OO ",
+" OO  oooo   oooooo oooooooooo ooooo OO ",
+" OO  oooo oo ooooo ooo oooooo ooooo OO ",
+" OO  oooo oo oooooo   ooooooo ooooo OO ",
+" OO  oooooooooooooooooooooooooooooo OO ",
+" OO                                 OO ",
+" OO                                OOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OXXXXXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ",
+"                                       "
+};
diff --git a/images/tiles-30.xpm b/images/tiles-30.xpm
new file mode 100644 (file)
index 0000000..a246363
--- /dev/null
@@ -0,0 +1,49 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 9 1",
+"  c black",
+". c #5D5D5D5D5D5D",
+"X c gray50",
+"o c blue",
+"O c #BFBF79790000",
+"+ c red",
+"@ c #FFFF77770000",
+"# c gray75",
+"$ c gray100",
+/* pixels */
+"##################################",
+"#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"#OO............................OO.",
+"#OO.                          #OO.",
+"#OO. $ $ $ $ $ $ $ $ $ $ $ $  #OO.",
+"#OO.  $ $ $ $ $ $ $ $ $ $ $ $ #OO.",
+"#OO. $ $ $ $ $ $ $ $ $ $ $ $  #OO.",
+"#OO.  $ @@+++++@$ $ $ $ $ $ $ #OO.",
+"#OO. $ $+@@@@@@@ $ $ $ $ $ .  #OO.",
+"#OO.  $ ++@@$ $ $ $ $ $ $ X.$ #OO.",
+"#OO. $ $++@@@$ $ $   $ $ X.$  #OO.",
+"#OO.  $ ++@@oo$ $ $ $ $ XX. $ #OO.",
+"#OO. $ $++@@o$ $ $   $ $  .$  #OO.",
+"#OO.  $ ++@@@@@++++ +++   . $ #OO.",
+"#OO. $ $++@@@@@@@@@@@@@$  .$  #OO.",
+"#OO.  $ ++@@@@@@@@@@@@@.  . $ #OO.",
+"#OO. $ $  . @. @. @. XXX  .$  #OO.",
+"#OO.  $. ............ .X  . $ #OO.",
+"#OO. $ ....  .  .  ....   .$  #OO.",
+"#OO.  ....   .  .   ....  . $ #OO.",
+"#OO. $ .. ..  ..  .. ..   .$  #OO.",
+"#OO.   .. ..  ..  .. .. XX. $ #OO.",
+"#OO. $....   .  .   .... X.$  #OO.",
+"#OO.   ....  .  .  .... $ X.$ #OO.",
+"#OO. $ . ............ .$ $ .  #OO.",
+"#OO.  $ $ . $. $. $.  $ $ $ $ #OO.",
+"#OO. $ $ $ $ $ $ $ $ $ $ $ $  #OO.",
+"#OO.  $ $ $ $ $ $ $ $ $ $ $ $ #OO.",
+"#OO.                          #OO.",
+"#OO.###########################OO.",
+"#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"#................................."
+};
diff --git a/images/tiles-31.xpm b/images/tiles-31.xpm
new file mode 100644 (file)
index 0000000..ae82706
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 2 1",
+"  c black",
+". c #7E7E7E7E7E7E",
+/* pixels */
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"............. . . . . . . ... ....",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"......... . . . . . . . . . . ....",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+".................................."
+};
diff --git a/images/tiles-32.xpm b/images/tiles-32.xpm
new file mode 100644 (file)
index 0000000..fac648d
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 2 1",
+"  c black",
+". c #7E7E7E7E7E7E",
+/* pixels */
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"............. . . . . . . ... ....",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"......... . . . . . . . . . . ....",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+".................................."
+};
diff --git a/images/tiles-33.xpm b/images/tiles-33.xpm
new file mode 100644 (file)
index 0000000..5e5919b
--- /dev/null
@@ -0,0 +1,53 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 13 1",
+"  c black",
+". c #00007F7F0000",
+"X c #7F7F7F7F0000",
+"o c #5D5D5D5D5D5D",
+"O c gray50",
+"+ c blue",
+"@ c green",
+"# c #BFBF79790000",
+"$ c red",
+"% c #FFFF77770000",
+"& c yellow",
+"* c gray75",
+"= c gray100",
+/* pixels */
+"**********************************",
+"*$$@@@@$$$$@@@@$$$$@@@@$$$$@@@@$$o",
+"*$$@@@@$$$$@@@@$$$$@@@@$$$$@@@@$$o",
+"*$$oooooooooooooooooooooooooooo$$o",
+"*$$o==========================*$$o",
+"*@@o=@@.@@@@@.@@@@@@@@.@@@@@.=*@@o",
+"*@@o=@.@@.@@@@@@@.@@O@@@@@@@@=*@@o",
+"*@@o=@@.@@$$$$O$$$$O$$OOOOO@@=*@@o",
+"*@@o=@@.@$   O    O  $%%O++@@=*@@o",
+"*$$o=.@@$$ooOooooOooo$oOOOO@@=*$$o",
+"*$$o=@@$#$oOooooooooo$o O##@@=*$$o",
+"*$$o=@@$$$oo$$$$$$$$$$$$OOO@@=*$$o",
+"*$$o=@@$$#o$ooooooooooo$O OOO=*$$o",
+"*@@o=@@#$$$#OOOOOOOOOOo$OOOOO=*@@o",
+"*@@o=@@$#$$$O&&&&O&&OOo$oOO@@=*@@o",
+"*@@o=@@$$$#$o&ooOo&o&Oo$oOO@@=*@@o",
+"*@@o=.@#$$$$o&&&Oo&o&Oo$XXXXX=*@@o",
+"*$$o=@@$$$#$o&oOOo&o&Oo$    X=*$$o",
+"*$$o=@@$#$$#o&OOOo&o&Oo$O oOX=*$$o",
+"*$$o=@@$$#$$o&OOOo&&OOo$ooO X=*$$o",
+"*$$o=@@#$$$$ooOOOoooOOo$oOo X=*$$o",
+"*@@o=@@$$#$$OOOOOOOOOOo$ooo $=*@@o",
+"*@@o=.@$$$#$$$$$$$$$$$$ O O $=*@@o",
+"*@@o=@@$#$$$    $    $ooooo $=*@@o",
+"*@@o=@@$$$$ ooo$ ooo$$$$$$$$$=*@@o",
+"*$$o=.@#$$ ooo$ ooo$ $ $ $ $@=*$$o",
+"*$$o=@@$$ ###$ ###$$$$$ $$$.@=*$$o",
+"*$$o=@@@..ooo..ooo..........@=*$$o",
+"*$$o=@@.@.ooo..ooo.....@@@.@@=*$$o",
+"*@@o==========================*@@o",
+"*@@o***************************@@o",
+"*@@$$$$@@@@$$$$@@@@$$$$@@@@$$$$@@o",
+"*@@$$$$@@@@$$$$@@@@$$$$@@@@$$$$@@o",
+"*ooooooooooooooooooooooooooooooooo"
+};
diff --git a/images/tiles-34.xpm b/images/tiles-34.xpm
new file mode 100644 (file)
index 0000000..d0e0979
--- /dev/null
@@ -0,0 +1,50 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 10 1",
+"  c black",
+". c #7F7F7F7F0000",
+"X c #5D5D5D5D5D5D",
+"o c gray50",
+"O c green",
+"+ c #BFBF79790000",
+"@ c red",
+"# c yellow",
+"$ c gray75",
+"% c gray100",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$@@OOOO@@@@OOOO@@@@OOOO@@@@OOOO@@X",
+"$@@OOOO@@@@OOOO@@@@OOOO@@@@OOOO@@X",
+"$@@XXXXXXXXXXXXXXXXXXXXXXXXXXXX@@X",
+"$@@X                          $@@X",
+"$OOX  % % % % % % % % % % % % $OOX",
+"$OOX % % % % % % % % % % % %  $OOX",
+"$OOX  % % @@@@o@@@@o@@% % % % $OOX",
+"$OOX % % @   o    o  @ % % %  $OOX",
+"$@@X  % @@XXoXXXXoXXX@% % % % $@@X",
+"$@@X % @+@XoXXXXXXXXX@ % % %  $@@X",
+"$@@X  %@@@XX@@@@@@@@@@@@% % % $@@X",
+"$@@X % @@+X@XXXXXXXXXXX@ % %  $@@X",
+"$OOX  %+@@@+ooooooooooX@% % % $OOX",
+"$OOX % @+@@@o####o##ooX@ % %  $OOX",
+"$OOX  %@@@+@X#XXoX#X#oX@% % % $OOX",
+"$OOX % +@@@@X###oX#X#oX@..... $OOX",
+"$@@X  %@@@+@X#XooX#X#oX@    . $@@X",
+"$@@X % @+@@+X#oooX#X#oX@o Xo. $@@X",
+"$@@X  %@@+@@X#oooX##ooX@XXo . $@@X",
+"$@@X % +@@@@XXoooXXXooX@XoX . $@@X",
+"$OOX  %@@+@@ooooooooooX@XXX @ $OOX",
+"$OOX % @@@+@@@@@@@@@@@@ o o @ $OOX",
+"$OOX  %@+@@@    @    @XXXXX @ $OOX",
+"$OOX % @@@@ XXX@ XXX@@@@@@@@@ $OOX",
+"$@@X  %+@@ XXX@ XXX@ @ @ @ @% $@@X",
+"$@@X % @@ +++@ +++@@@@@ @@@%  $@@X",
+"$@@X  % % % % % % % % % % % % $@@X",
+"$@@X % % % % % % % % % % % %  $@@X",
+"$OOX                          $OOX",
+"$OOX$$$$$$$$$$$$$$$$$$$$$$$$$$$OOX",
+"$OO@@@@OOOO@@@@OOOO@@@@OOOO@@@@OOX",
+"$OO@@@@OOOO@@@@OOOO@@@@OOOO@@@@OOX",
+"$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/images/tiles-35.xpm b/images/tiles-35.xpm
new file mode 100644 (file)
index 0000000..f1ad2ab
--- /dev/null
@@ -0,0 +1,64 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 50 8 1",
+"  c black",
+". c #7F7F7F7F0000",
+"X c #5D5D5D5D5D5D",
+"o c gray50",
+"O c #BFBF79790000",
+"+ c yellow",
+"@ c gray75",
+"# c gray100",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@++++++++++++++++++++++++++++++++X",
+"@++++++++++++++++++++++++++++++++X",
+"@++XXXXXXXXXXXXXXXXXXXXXXXXXXXX++X",
+"@++X##########################@++X",
+"@++X#############..###....####@++X",
+"@++X############.XX#XX..XXXX##@++X",
+"@++X#########..XXXXX..XXX.X..#@++X",
+"@++X#########..XXXXX..XXX.X..#@++X",
+"@++X#########.XX.XXXXXX.XXX###@++X",
+"@++X########.XXX#XX.XXXX..####@++X",
+"@++X#######X.XX##...X...######@++X",
+"@++X#######X.XX#....XXX#######@++X",
+"@++X######.XX##X.XX###########@++X",
+"@++X######XX ##XX ############@++X",
+"@++X######XX ##XX ############@++X",
+"@++X######XX ##XX ############@++X",
+"@++X###XooXX ooXX ooooooo#####@++X",
+"@++X###XXooX oooX oooooooo####@++X",
+"@++X###XXXXXXXXXXXXXXXXXXXX###@++X",
+"@++X###XXX                X###@++X",
+"@++X# +XXX                X++#@++X",
+"@++X# +XXX XX XX XX XX XX X +#@++X",
+"@++X# +XXX XX XX XX XX XX X +#@++X",
+"@++X# +OXX XX XX XX XX XX X +#@++X",
+"@++X# +OOX                X +#@++X",
+"@++X# +OOOOOOOOOOOOOOOOOOOO +#@++X",
+"@++X# +OOOOOOO ++++OOOOOOOO +#@++X",
+"@++X# +OOOOOOO  ++ OOOOOOOO +#@++X",
+"@++X# +OOOOOOOO ++OOOOOOOOO +#@++X",
+"@++X# +OOOOOOOO ++OOOOOOOOO +#@++X",
+"@++X# +OOOOOOOO ++OOOOOOOOO +#@++X",
+"@++X# +OOOOOOOO ++OOOOOOOOO +#@++X",
+"@++X# +OOOOOOOO ++OOOOOOOOO +#@++X",
+"@++X# +OOOOOOOO ++OOOOOOOOO +#@++X",
+"@++X# +OOOOOOOO ++OOOOOOOOO +#@++X",
+"@++X# +OOOOOOOO ++OOOOOOOOO +#@++X",
+"@++X# +OOOOOOO ++++OOOOOOOO +#@++X",
+"@++X# +OOOOOOO     OOOOOOOO +#@++X",
+"@++X# +OOOOOOOOOOOOOOOOOOOO +#@++X",
+"@++X# +OOOOOOOOOOOOOOOOOOOO +#@++X",
+"@++X# +OOOOOOOOOOOOOOOOOOOO +#@++X",
+"@++X# +OOOOOOOOOOOOOOOOOOOO +#@++X",
+"@++X# +++++++++++++++++++++++#@++X",
+"@++X#                        #@++X",
+"@++X##########################@++X",
+"@++X@@@@@@@@@@@@@@@@@@@@@@@@@@@++X",
+"@++++++++++++++++++++++++++++++++X",
+"@++++++++++++++++++++++++++++++++X",
+"@XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/images/tiles-36.xpm b/images/tiles-36.xpm
new file mode 100644 (file)
index 0000000..b362075
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 50 7 1",
+"  c black",
+". c #7F7F7F7F0000",
+"X c #5D5D5D5D5D5D",
+"o c gray50",
+"O c yellow",
+"+ c gray75",
+"@ c gray100",
+/* pixels */
+"++++++++++++++++++++++++++++++++++",
+"+OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOX",
+"+OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOX",
+"+OOXXXXXXXXXXXXXXXXXXXXXXXXXXXXOOX",
+"+OOX                          +OOX",
+"+OOX @ @ @ @ @ @ ..@ @.... @  +OOX",
+"+OOX  @ @ @ @ @ .XX XX..XXXX@ +OOX",
+"+OOX @ @ @ @ ..XXXXX..XXX.X.. +OOX",
+"+OOX  @ @ @ @..XXXXX..XXX.X.. +OOX",
+"+OOX @ @ @ @ .XX.XXXXXX.XXX@  +OOX",
+"+OOX  @ @ @ .XXX@XX.XXXX..@ @ +OOX",
+"+OOX @ @ @ X.XX@ ...X... @ @  +OOX",
+"+OOX  @ @ @X.XX ....XXX @ @ @ +OOX",
+"+OOX @ @ @.XX@ X.XX@ @ @ @ @  +OOX",
+"+OOX  @ @ XX  @XX @ @ @ @ @ @ +OOX",
+"+OOX @ @ @XX @ XX  @ @ @ @ @  +OOX",
+"+OOX  @ @ XX  @XX @ @ @ @ @ @ +OOX",
+"+OOX @ XooXX ooXX ooooooo@ @  +OOX",
+"+OOX  @XXooX oooX oooooooo@ @ +OOX",
+"+OOX @ XXXXXXXXXXXXXXXXXXXX@  +OOX",
+"+OOX  @XXX                X @ +OOX",
+"+OOX  OXXX                XOO +OOX",
+"+OOX  OXXX XX XX XX XX XX X O +OOX",
+"+OOX  OXXX XX XX XX XX XX X O +OOX",
+"+OOX  O XX XX XX XX XX XX X O +OOX",
+"+OOX  O@ X                X O +OOX",
+"+OOX  O @ @ @ @ @ @ @ @ @ @ O +OOX",
+"+OOX  O@ @ @ @ OOOO@ @ @ @  O +OOX",
+"+OOX  O @ @ @   OO  @ @ @ @ O +OOX",
+"+OOX  O@ @ @ @  OO @ @ @ @  O +OOX",
+"+OOX  O @ @ @ @ OO@ @ @ @ @ O +OOX",
+"+OOX  O@ @ @ @  OO @ @ @ @  O +OOX",
+"+OOX  O @ @ @ @ OO@ @ @ @ @ O +OOX",
+"+OOX  O@ @ @ @  OO @ @ @ @  O +OOX",
+"+OOX  O @ @ @ @ OO@ @ @ @ @ O +OOX",
+"+OOX  O@ @ @ @  OO @ @ @ @  O +OOX",
+"+OOX  O @ @ @ @ OO@ @ @ @ @ O +OOX",
+"+OOX  O@ @ @ @ OOOO@ @ @ @  O +OOX",
+"+OOX  O @ @ @       @ @ @ @ O +OOX",
+"+OOX  O@ @ @ @ @ @ @ @ @ @  O +OOX",
+"+OOX  O @ @ @ @ @ @ @ @ @ @ O +OOX",
+"+OOX  O@ @ @ @ @ @ @ @ @ @  O +OOX",
+"+OOX  O @ @ @ @ @ @ @ @ @ @ O +OOX",
+"+OOX  OOOOOOOOOOOOOOOOOOOOOOO +OOX",
+"+OOX                          +OOX",
+"+OOX                          +OOX",
+"+OOX+++++++++++++++++++++++++++OOX",
+"+OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOX",
+"+OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOX",
+"+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/images/tiles-37.xpm b/images/tiles-37.xpm
new file mode 100644 (file)
index 0000000..80d4164
--- /dev/null
@@ -0,0 +1,61 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"42 42 13 1",
+"  c black",
+". c #00007F7F0000",
+"X c #7F7F7F7F0000",
+"o c #5D5D5D5D5D5D",
+"O c gray50",
+"+ c blue",
+"@ c green",
+"# c #BFBF79790000",
+"$ c red",
+"% c #FFFF77770000",
+"& c yellow",
+"* c gray75",
+"= c gray100",
+/* pixels */
+"******************************************",
+"*OO&&&&OOOO&&&&OOOO&&&&OOOO&&&&OOOO&&&&OOo",
+"*OO&&&&OOOO&&&&OOOO&&&&OOOO&&&&OOOO&&&&OOo",
+"*OOooooooooooooooooooooooooooooooooooooOOo",
+"*OOo==================================*OOo",
+"*&&o=######X#######=$=#########=$=###=*&&o",
+"*&&o=X############=o o=#######= o =##=*&&o",
+"*&&o=###*&ooooooo=o o o=ooooo= o o =#=*&&o",
+"*&&o=##**o* oooo=o o o o=ooo= o o o ==*&&o",
+"*OOo=#*O*oooooo=$ o o o $oo=$o o o o$=*OOo",
+"*OOo=#***oooo====o o o o=*=== o o o ==*OOo",
+"*OOo=#***ooo===**=o o o=*==**= o o =#=*OOo",
+"*OOo=#*O*oo=o=****=o o=*==****= o =O#=*OOo",
+"*&&o=#***oo==*****o=$=o==*****O=$=O##=*&&o",
+"*&&o=#***oo=*****OOOOOo=*****OOOOOo##=*&&o",
+"*&&o=#*O*oo*O***OOOOOoo**o*OOOOOooo##=*&&o",
+"*&&o=#***ooo***OOOoOooo***OOOOoOooo##=*&&o",
+"*OOo=#***oooo*OoOOOooooo**OoOOOoooo##=*OOo",
+"*OOo=#*O*oooooOOOOooooooooOOOoooooo##=*OOo",
+"*OOo=#***o* ooo o o oooooooooooo* o##=*OOo",
+"*OOo=#**O&ooo*********oooooooooooo&#X=*OOo",
+"*&&o=#*OOOOOO*OOOOOOO*OOOOOOOOOOOOX##=*&&o",
+"*&&o=#OOOOOO**Oo&OooO*ooooooooooOXX##=*&&o",
+"*&&o=##XXXX***oOOoOO&*ooooo&ooooXXX##=*&&o",
+"*&&o=###XXX***oOoOoOo*oooo&oooooXXX##=*&&o",
+"*OOo=####XX***OoO$OoO*ooo&ooooooXXX##=*OOo",
+"*OOo=##X###***oOoOoOo*oo&&&oooooX##X#=*OOo",
+"*OOo=######***&OOoOOo*ooo&ooOOOoX####=*OOo",
+"*OOo=##@.##***OooO&oO*oo&ooooooOO*%**=*OOo",
+"*&&o=##X###***OOOOOOO*o&ooooOOOOO****=*&&o",
+"*&&o=#X##@.**oOoOoOoOooooooo*********=*&&o",
+"*&&o=####X#*OOOOOOOOOOOOOOOo********#=*&&o",
+"*&&o=###@.#OOOoOoOoOOOoOoOoO********#=*&&o",
+"*OOo=###X###XXXXXXXXXXXXXXOO@+******#=*OOo",
+"*OOo=##X#####XXXXXXXXXXXXXXX#########=*OOo",
+"*OOo=#####X#####################=*=##=*OOo",
+"*OOo=################X#########=*=*##=*OOo",
+"*&&o==================================*&&o",
+"*&&o***********************************&&o",
+"*&&OOOO&&&&OOOO&&&&OOOO&&&&OOOO&&&&OOOO&&o",
+"*&&OOOO&&&&OOOO&&&&OOOO&&&&OOOO&&&&OOOO&&o",
+"*ooooooooooooooooooooooooooooooooooooooooo"
+};
diff --git a/images/tiles-38.xpm b/images/tiles-38.xpm
new file mode 100644 (file)
index 0000000..8455604
--- /dev/null
@@ -0,0 +1,58 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"42 42 10 1",
+"  c black",
+". c #5D5D5D5D5D5D",
+"X c gray50",
+"o c blue",
+"O c green",
+"+ c red",
+"@ c #FFFF77770000",
+"# c yellow",
+"$ c gray75",
+"% c gray100",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$XX####XXXX####XXXX####XXXX####XXXX####XX.",
+"$XX####XXXX####XXXX####XXXX####XXXX####XX.",
+"$XX....................................XX.",
+"$XX.                                  $XX.",
+"$##. % % % % % % % %+% % % % % %+% %  $##.",
+"$##.  % % % % % % %. .% % % % % . % % $##.",
+"$##. % %$#.......%. . .%.....% . . %  $##.",
+"$##.  %$$.$ ....%. . . .%...% . . . % $##.",
+"$XX. %$X$......%+ . . . +..%+. . . .+ $XX.",
+"$XX.  $$$....%%%%. . . .%$%%% . . . % $XX.",
+"$XX. %$$$...%%%$$%. . .%$%%$$% . . %  $XX.",
+"$XX.  $X$..%.%$$$$%. .%$%%$$$$% . %X% $XX.",
+"$##. %$$$..%%$$$$$.%+%.%%$$$$$X%+%X%  $##.",
+"$##.  $$$..%$$$$$XXXXX.%$$$$$XXXXX. % $##.",
+"$##. %$X$..$X$$$XXXXX..$$.$XXXXX...%  $##.",
+"$##.  $$$...$$$XXX.X...$$$XXXX.X... % $##.",
+"$XX. %$$$....$X.XXX.....$$X.XXX....%  $XX.",
+"$XX.  $X$.....XXXX........XXX...... % $XX.",
+"$XX. %$$$.$ ... . . ............$ .%  $XX.",
+"$XX.  $$X#...$$$$$$$$$............# % $XX.",
+"$##. %$XXXXXX$XXXXXXX$XXXXXXXXXXXX %  $##.",
+"$##.  XXXXXX$$X.#X..X$..........X % % $##.",
+"$##. % % % $$$.XX.XX#$.....#.... % %  $##.",
+"$##.  % % %$$$.X.X.X.$....#.....% % % $##.",
+"$XX. % % % $$$X.X+X.X$...#...... % %  $XX.",
+"$XX.  % % %$$$.X.X.X.$..###.....% % % $XX.",
+"$XX. % % % $$$#XX.XX.$...#..XXX. % %  $XX.",
+"$XX.  % % %$$$X..X#.X$..#......XX$@$$ $XX.",
+"$##. % % % $$$XXXXXXX$.#....XXXXX$$$$ $##.",
+"$##.  % % %$$.X.X.X.X.......$$$$$$$$$ $##.",
+"$##. % % % $XXXXXXXXXXXXXXX.$$$$$$$$  $##.",
+"$##.  % % %XXX.X.X.XXX.X.X.X$$$$$$$$% $##.",
+"$XX. % % % % % % % % % % %XXOo$$$$$$  $XX.",
+"$XX.  % % % % % % % % % % % % % % % % $XX.",
+"$XX. % % % % % % % % % % % % % % % %  $XX.",
+"$XX.  % % % % % % % % % % % % % % % % $XX.",
+"$##.                                  $##.",
+"$##.$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$##.",
+"$##XXXX####XXXX####XXXX####XXXX####XXXX##.",
+"$##XXXX####XXXX####XXXX####XXXX####XXXX##.",
+"$........................................."
+};
diff --git a/images/tiles-39.xpm b/images/tiles-39.xpm
new file mode 100644 (file)
index 0000000..0368cae
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 11 1",
+"  c black",
+". c #00007F7F0000",
+"X c #7F7F7F7F0000",
+"o c #5D5D5D5D5D5D",
+"O c gray50",
+"+ c green",
+"@ c #BFBF79790000",
+"# c red",
+"$ c #FFFF77770000",
+"% c gray75",
+"& c gray100",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%@@++++@@@@++++@@@@++++@@@@++++@@o",
+"%@@++++@@@@++++@@@@++++@@@@++++@@o",
+"%@@oooooooooooooooooooooooooooo@@o",
+"%@@o&&&&&&&&&&&&&&&&&&&&&&&&&&%@@o",
+"%++o&&&&&&&&&.+.+++.++&&&&&&&&%++o",
+"%++o&&&&&&+++++++.++.++.+.&&&&%++o",
+"%++o&&&&&+.+++.++++.++.++.+&&&%++o",
+"%++o&&&+++++++++.++++.+.++..&&%++o",
+"%@@o&&&+.+++++.++.+.+.+.+.+.&&%@@o",
+"%@@o&&+++++.++++.+.+.+.+...+.&%@@o",
+"%@@o&&.+++++.+.++.+.++...++..&%@@o",
+"%@@o&+++.+.++++.+.++..+.+..+.&%@@o",
+"%++o&++++.++.+++.+...+.+.+..&&%++o",
+"%++o&.+.+.+.+.+.+.+.+.....O&&&%++o",
+"%++o&++.++.+.+.+.+.+...&&&O&&&%++o",
+"%++o&&.++.+.+.+......O&&&&O&&&%++o",
+"%@@o&&&..........&&&&O&&&&O&&&%@@o",
+"%@@o&&&&&&&XXXooo&&&&O&&&&O&&&%@@o",
+"%@@o&&&&&&&XXXooo&&&&O&&&&O&&&%@@o",
+"%@@o&&&&&&&XXXooo&&&&O&$$&O&&&%@@o",
+"%++o&&&&&&&XXXooo&&&&O ## O&&&%++o",
+"%++o&&&&&&&XXXooo&&&&O    O&&&%++o",
+"%++o&&&&&&XXXoooo&&&&O&##&O&&&%++o",
+"%++o&&&&XXXXoooooo&&&o####o&&&%++o",
+"%@@o&&XXXXXoooooooo&&& && &&&&%@@o",
+"%@@o&XXXXXooooooo@@@@@ @@ @@@&%@@o",
+"%@@o&@@@XX@oo@@ooo@@@@@o@o@@@&%@@o",
+"%@@o&@@XX@@o@@@@oo@@@@o@o@@@@&%@@o",
+"%++o&&&&&&&&&&&&&&&&&&&&&&&&&&%++o",
+"%++o%%%%%%%%%%%%%%%%%%%%%%%%%%%++o",
+"%++@@@@++++@@@@++++@@@@++++@@@@++o",
+"%++@@@@++++@@@@++++@@@@++++@@@@++o",
+"%ooooooooooooooooooooooooooooooooo"
+};
diff --git a/images/tiles-4.xpm b/images/tiles-4.xpm
new file mode 100644 (file)
index 0000000..29acc6b
--- /dev/null
@@ -0,0 +1,65 @@
+/* XPM */
+static char *tiles__[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 11 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c #00007F7F0000",
+"o c gray50",
+"O c #00000000E6E6",
+"+ c #0000E6E60000",
+"@ c #99997E7E4C4C",
+"# c red",
+"$ c #FFFF7B7B0000",
+"% c #CCCC7E7E6666",
+"& c yellow",
+/* pixels */
+" ###############################################",
+" #                                             #",
+" #++X++++++++++++++++++++++++++++++++++++++++X #",
+" #+X+++++++++++X+++++++++++X++++++++++++++++++ #",
+" #++XX++X++++++++++++++X+++++++++ooooooooooo++ #",
+" #X+XX+X+++++++++++++++++o+++++++ooooooooooo++ #",
+" #+X++++################o######## $$$oooOOOo++ #",
+" #+X+++##              o        #o$$$oooOOOo++ #",
+" #++++###.......o.....o........ #ooooooooooo++ #",
+" #+++####......o............... #.oooooo%%%o++ #",
+" #++##@##.....o................ #.oooooo%%%o++ #",
+" #++##@##....o................. #.oooooooooo++ #",
+" #++#####...................... #.  oooooooo++ #",
+" #++#####...................... #.  oooooooo++ #",
+" #++#@#@#...#########################ooooooo++ #",
+" #++#@#@#..##.......................#ooo ooooooo",
+" #++#####.###oooooooooooooooooooooo.#ooooooooooo",
+" #X+##@####@#oooooooooooooooooooooo.#ooooooooooo",
+" #++##@#@##@#oooooooooooooooooooooo.#ooooooooooo",
+" #++####@####oo.&&&&&&&o.&&&&&ooooo.#.oooooo++ #",
+" #++#@#######oo.&&&&&&&o.&&&&&&oooo.#.oooooo++ #",
+" #++#@####@##oo.&&.....o.&&..&&&ooo.#.oooooo++ #",
+" #++###@##@##oo.&&oooooo.&&oo.&&ooo.#.oooooo++ #",
+" #++###@#####oo.&&oooooo.&&oo.&&ooo.#@@@@@@@@@ #",
+" #++#@###@###oo.&&&&&&oo.&&oo.&&ooo.#        @ #",
+" #++#@###@#@#oo.&&&&&&oo.&&oo.&&ooo.#....... @ #",
+" #++#######@#oo.&&....oo.&&oo.&&ooo.#..o ... @ #",
+" #++###@#####oo.&&oooooo.&&oo.&&ooo.#.....o. @ #",
+" #X+###@#####oo.&&oooooo.&&oo&&&ooo.#....o.. @ #",
+" #++#@#######oo.&&oooooo.&&&&&&.ooo.#...o... @ #",
+" #++#@###@###oo.&&oooooo.&&&&&.oooo.#..o.... @ #",
+" #++###@#@###oo...oooooo......ooooo.#....... @ #",
+" #++###@#####oooooooooooooooooooooo.#....... # #",
+" #++######@##oooooooooooooooooooooo.#....... # #",
+" #++#@####@##########################....... # #",
+" #++#@#@############################..o o .. # #",
+" #++###@###########################...o o .. # #",
+" #++##############################.......... # #",
+" #++#@#######       ###       ################ #",
+" #++#@###### @.@.@.### @.@.@.################+ #",
+" #++####### @.@.@.### @.@.@.###.##.######.##X+ #",
+" #X+###### @.@.@.### @.@.@.### .# .#  ## .#XX+ #",
+" #++##### @%@%@%### @%@%@%#########  #####XXX+ #",
+" #+++XXXXX.....XXXXX.....XXXXXXXXXXXXXXXXXXXX+ #",
+" #++++XXXX.....XXXXX.....XXXXXXXXXXXXXXXXXXXX+ #",
+" #++X++XXX.....XXXXX.....XXXXXXXXXX++++++X++++ #",
+" #######@@.....@@@@@.....@@@@@@@@@@#############",
+"          .....     .....                       "
+};
diff --git a/images/tiles-40.xpm b/images/tiles-40.xpm
new file mode 100644 (file)
index 0000000..6869bd0
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 11 1",
+"  c black",
+". c #00007F7F0000",
+"X c #7F7F7F7F0000",
+"o c #5D5D5D5D5D5D",
+"O c gray50",
+"+ c green",
+"@ c #BFBF79790000",
+"# c red",
+"$ c #FFFF77770000",
+"% c gray75",
+"& c gray100",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%@@++++@@@@++++@@@@++++@@@@++++@@o",
+"%@@++++@@@@++++@@@@++++@@@@++++@@o",
+"%@@oooooooooooooooooooooooooooo@@o",
+"%@@o                          %@@o",
+"%++o & & & & .+.+++.++ & & &  %++o",
+"%++o  & & +++++++.++.++.+.& & %++o",
+"%++o & & +.+++.++++.++.++.+&  %++o",
+"%++o  &+++++++++.++++.+.++..& %++o",
+"%@@o & +.+++++.++.+.+.+.+.+.  %@@o",
+"%@@o  +++++.++++.+.+.+.+...+. %@@o",
+"%@@o &.+++++.+.++.+.++...++.. %@@o",
+"%@@o +++.+.++++.+.++..+.+..+. %@@o",
+"%++o ++++.++.+++.+...+.+.+..  %++o",
+"%++o .+.+.+.+.+.+.+.+.....O & %++o",
+"%++o ++.++.+.+.+.+.+...& &O&  %++o",
+"%++o  .++.+.+.+......O& & O & %++o",
+"%@@o & ..........& & O & &O&  %@@o",
+"%@@o  & & &XXXooo & &O& & O & %@@o",
+"%@@o & & & XXXooo& & O & &O&  %@@o",
+"%@@o  & & &XXXooo & &O&$$ O & %@@o",
+"%++o & & & XXXooo& & O ## O&  %++o",
+"%++o  & & &XXXooo & &O    O & %++o",
+"%++o & & &XXXoooo& & O&##&O&  %++o",
+"%++o  & XXXXoooooo& &o####o & %++o",
+"%@@o &XXXXXoooooooo& & &   &  %@@o",
+"%@@o XXXXXooooooo@@@@@ @@ @@@ %@@o",
+"%@@o @@@XX@oo@@ooo@@@@@o@o@@@ %@@o",
+"%@@o @@XX@@o@@@@oo@@@@o@o@@@@ %@@o",
+"%++o                          %++o",
+"%++o%%%%%%%%%%%%%%%%%%%%%%%%%%%++o",
+"%++@@@@++++@@@@++++@@@@++++@@@@++o",
+"%++@@@@++++@@@@++++@@@@++++@@@@++o",
+"%ooooooooooooooooooooooooooooooooo"
+};
diff --git a/images/tiles-41.xpm b/images/tiles-41.xpm
new file mode 100644 (file)
index 0000000..7827c18
--- /dev/null
@@ -0,0 +1,51 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 11 1",
+"  c black",
+". c #00007F7F0000",
+"X c #5D5D5D5D5D5D",
+"o c gray50",
+"O c blue",
+"+ c #4F4F4F4FFFFF",
+"@ c green",
+"# c red",
+"$ c yellow",
+"% c gray75",
+"& c gray100",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%OO@@@@OOOO@@@@OOOO@@@@OOOO@@@@OOX",
+"%OO@@@@OOOO@@@@OOOO@@@@OOOO@@@@OOX",
+"%OOXXXXXXXXXXXXXXXXXXXXXXXXXXXXOOX",
+"%OOX&&&&&&&&&&&&&&&&&&&&&&&&&&%OOX",
+"%@@X&@@ @@@@@@@@@X@@X@@@@@@@@&%@@X",
+"%@@X&o%@@@o@o@@+X++X+++++++@@&%@@X",
+"%@@X&o%@@@@o@@O           O@@&%@@X",
+"%@@X&XX@@@o@oO+oooooooooo O@@&%@@X",
+"%OOX&@@@OoXXX++o$$$oo$$oo OXo&%OOX",
+"%OOX&X@O+oXXX+OX$XX$X$X$o OXo&%OOX",
+"%OOX&@O++oXo O+X$$$XX$X$o OXo&%OOX",
+"%OOX&@++OoXXX++X$XXoX$X$o OXo&%OOX",
+"%@@X&@+O+oXXX+OX$oooX$X$o OXo&%@@X",
+"%@@X&@O++oXo O+X$oooX$$Xo OXo&%@@X",
+"%@@X&@++OoXXX++XooooXXXoo OXo&%@@X",
+"%@@X&@+O+oXXX+OOOOOOOOOOOOXXo&%@@X",
+"%OOX&@O++ooooO O O O O O oooo&%OOX",
+"%OOX&@++OOOOOOO&O   O&OOOOOO@&%OOX",
+"%OOX&@+OO O O oO XXOo O O O.@&%OOX",
+"%OOX&@OOOOOOOoO XXOoOOOOOO..@&%OOX",
+"%@@X&@@......oXoXXoXo.......@&%@@X",
+"%@@X&@@@....XXXXXXXXXXX.....@&%@@X",
+"%@@X&@@@@@@oooXXXXXXXXXX.@@@@&%@@X",
+"%@@X&@@@.@oo@@oo@@@@o@@oo@.@@&%@@X",
+"%OOX&@@@@@oooooOo  ooOooo@@@.&%OOX",
+"%OOX&@.@@@oo@o  o&#o  @oo@@@@&%OOX",
+"%OOX&@@@.@oo@o&#o  o&#@oo@@.@&%OOX",
+"%OOX&@.@@@oo@o  oooo  @oo.@@@&%OOX",
+"%@@X&&&&&&&&&&&&&&&&&&&&&&&&&&%@@X",
+"%@@X%%%%%%%%%%%%%%%%%%%%%%%%%%%@@X",
+"%@@OOOO@@@@OOOO@@@@OOOO@@@@OOOO@@X",
+"%@@OOOO@@@@OOOO@@@@OOOO@@@@OOOO@@X",
+"%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/images/tiles-42.xpm b/images/tiles-42.xpm
new file mode 100644 (file)
index 0000000..8b0b113
--- /dev/null
@@ -0,0 +1,50 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 10 1",
+"  c black",
+". c #5D5D5D5D5D5D",
+"X c gray50",
+"o c blue",
+"O c #4F4F4F4FFFFF",
+"+ c green",
+"@ c red",
+"# c yellow",
+"$ c gray75",
+"% c gray100",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$oo++++oooo++++oooo++++oooo++++oo.",
+"$oo++++oooo++++oooo++++oooo++++oo.",
+"$oo............................oo.",
+"$oo.                          $oo.",
+"$++. % % % % % % % % % % % %  $++.",
+"$++.  % % % % %O.OO.OOOOOOO % $++.",
+"$++. % % % % %o           o%  $++.",
+"$++.  % % % %oOXXXXXXXXXX o % $++.",
+"$oo. % %oX...OOX###XX##XX o.X $oo.",
+"$oo.  %oOX...Oo.#..#.#.#X o.X $oo.",
+"$oo. %oOOX.X oO.###..#.#X o.X $oo.",
+"$oo.  OOoX...OO.#..X.#.#X o.X $oo.",
+"$++. %OoOX...Oo.#XXX.#.#X o.X $++.",
+"$++.  oOOX.X oO.#XXX.##.X o.X $++.",
+"$++. %OOoX...OO.XXXX...XX o.X $++.",
+"$++.  OoOX...Ooooooooooooo..X $++.",
+"$oo. %oOOXXXXo o o o o o XXXX $oo.",
+"$oo.  OOooooooo%o   o%oooooo% $oo.",
+"$oo. %Ooo o o Xo ..oX o o o%  $oo.",
+"$oo.  oooooooXo ..oXoooooo% % $oo.",
+"$++. % % % % X.X..X.X% % % %  $++.",
+"$++.  % % % ........... % % % $++.",
+"$++. % % % XXX.......... % %  $++.",
+"$++.  % % XX% XX% % X %XX % % $++.",
+"$oo. % % %XXXXXoX  XXoXXX% %  $oo.",
+"$oo.  % % XX%X  X%@X  %XX % % $oo.",
+"$oo. % % %XX X%@X  X%@ XX% %  $oo.",
+"$oo.  % % XX%X  XXXX  %XX % % $oo.",
+"$++.                          $++.",
+"$++.$$$$$$$$$$$$$$$$$$$$$$$$$$$++.",
+"$++oooo++++oooo++++oooo++++oooo++.",
+"$++oooo++++oooo++++oooo++++oooo++.",
+"$................................."
+};
diff --git a/images/tiles-43.xpm b/images/tiles-43.xpm
new file mode 100644 (file)
index 0000000..693b185
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 2 1",
+"  c black",
+". c #7E7E7E7E7E7E",
+/* pixels */
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+".................   ......... ....",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+".................................."
+};
diff --git a/images/tiles-44.xpm b/images/tiles-44.xpm
new file mode 100644 (file)
index 0000000..693b185
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 2 1",
+"  c black",
+". c #7E7E7E7E7E7E",
+/* pixels */
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+".................   ......... ....",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+"..................................",
+".................................."
+};
diff --git a/images/tiles-45.xpm b/images/tiles-45.xpm
new file mode 100644 (file)
index 0000000..a9a2b4f
--- /dev/null
@@ -0,0 +1,37 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"56 24 7 1",
+"  c black",
+". c #7F7F7F7F0000",
+"X c #5D5D5D5D5D5D",
+"o c gray50",
+"O c red",
+"+ c gray75",
+"@ c gray100",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
+"+XXXX....XXXX....XXXX....XXXX....XXXX....XXXX....XXXX..X",
+"+XXXX....XXXX....XXXX....XXXX....XXXX....XXXX....XXXX..X",
+"+..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..X",
+"+..X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+XXX",
+"+..X@@@@@@@@@@@@@@@@@@@+++++++++++++++++++@@@@@@@@@@+XXX",
+"+XXX@@@@@@@@@@@@@@@@@  @@@@@@@@@@@@@@@@@@@ @@@@@@@@@+XXX",
+"+XXX@@ ..@ ..@ ..@ .+ o@O@@@@@@@@@@@@@@@O@ X.@ ..@@@+XXX",
+"+XXX@@ ..@ ..@ ..@ ++o @@@@@@@@@@@@@@@@@@@XX.@ ..@@@+..X",
+"+XXX@@ooooooooooooo++  @@@@@@@@@@@@@@@@@@@ Xoooooo@@+..X",
+"+..X@@ ..X ..X ..X ++   ++XX++XX++XX++XX+  X.X ..X@@+..X",
+"+..X@@ ..@ ..@ ..@ +++ ooXXooXXooXXooXXooooX.@ ..@@@+..X",
+"+..X@@ ..@ ..@ ..@ ++oooooooooooooooooooooX..@ ..@@@+XXX",
+"+..X@@ ..@ ..@ ..@ ..ooXXXXooooooooXXXXooX ..@ ..@@@+XXX",
+"+XXX@@oooooooooooooooooooooooooooooooooooooooooooo@@+XXX",
+"+XXX@@ ..X ..X ..X ..X ..X ..X ..X ..X ..X ..X ..X@@+XXX",
+"+XXX@@ ..@ ..@ ..@ ..@ ..@ ..@ ..@ ..@ ..@ ..@ ..@@@+..X",
+"+XXX@@   @   @   @   @   @   @   @   @   @   @   @@@+..X",
+"+..X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+..X",
+"+..X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+..X",
+"+..X+++++++++++++++++++++++++++++++++++++++++++++++++..X",
+"+..XXXX....XXXX....XXXX....XXXX....XXXX....XXXX....XXXXX",
+"+..XXXX....XXXX....XXXX....XXXX....XXXX....XXXX....XXXXX",
+"+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/images/tiles-46.xpm b/images/tiles-46.xpm
new file mode 100644 (file)
index 0000000..5f7764e
--- /dev/null
@@ -0,0 +1,37 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"56 24 7 1",
+"  c black",
+". c #7F7F7F7F0000",
+"X c #5D5D5D5D5D5D",
+"o c gray50",
+"O c red",
+"+ c gray75",
+"@ c gray100",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
+"+XXXX....XXXX....XXXX....XXXX....XXXX....XXXX....XXXX..X",
+"+XXXX....XXXX....XXXX....XXXX....XXXX....XXXX....XXXX..X",
+"+..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..X",
+"+..X                                                +..X",
+"+..X @ @ @ @ @ @ @ @ @ +++++++++++++++++++ @ @ @ @  +XXX",
+"+XXX  @ @ @ @ @ @ @ @  @@@@@@@@@@@@@@@@@@@  @ @ @ @ +XXX",
+"+XXX @ ..@ ..@ ..@ .+ o@O@@@@@@@@@@@@@@@O@ X.@ ..@  +XXX",
+"+XXX   ..  ..  ..  ++o @@@@@@@@@@@@@@@@@@@XX.  .. @ +..X",
+"+XXX @ooooooooooooo++  @@@@@@@@@@@@@@@@@@@ Xoooooo  +..X",
+"+..X   ..X ..X ..X ++   ++XX++XX++XX++XX+  X.X ..X@ +..X",
+"+..X @ ..@ ..@ ..@ +++ ooXXooXXooXXooXXooooX.@ ..@  +..X",
+"+..X   ..  ..  ..  ++oooooooooooooooooooooX..  .. @ +XXX",
+"+..X @ ..@ ..@ ..@ ..ooXXXXooooooooXXXXooX ..@ ..@  +XXX",
+"+XXX  oooooooooooooooooooooooooooooooooooooooooooo@ +XXX",
+"+XXX @ ..X ..X ..X ..X ..X ..X ..X ..X ..X ..X ..X  +XXX",
+"+XXX   ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  .. @ +..X",
+"+XXX @   @   @   @   @   @   @   @   @   @   @   @  +..X",
+"+..X  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ +..X",
+"+..X                                                +..X",
+"+..X+++++++++++++++++++++++++++++++++++++++++++++++++..X",
+"+..XXXX....XXXX....XXXX....XXXX....XXXX....XXXX....XXXXX",
+"+..XXXX....XXXX....XXXX....XXXX....XXXX....XXXX....XXXXX",
+"+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/images/tiles-47.xpm b/images/tiles-47.xpm
new file mode 100644 (file)
index 0000000..8b610ac
--- /dev/null
@@ -0,0 +1,64 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 50 8 1",
+"  c black",
+". c #5D5D5D5D5D5D",
+"X c #00000000AFAF",
+"o c blue",
+"O c green",
+"+ c #BFBF79790000",
+"@ c gray75",
+"# c gray100",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"@OO............................OO.",
+"@OO.##########################@OO.",
+"@OO.##########  ##############@OO.",
+"@OO.######### ..  ############@OO.",
+"@OO.######## .....  ##########@OO.",
+"@OO.####### .....    #...#####@OO.",
+"@OO.###### .....  oo  ...#####@OO.",
+"@OO.##### .....  oooo  ..#####@OO.",
+"@OO.#### .....  oooooo  .#####@OO.",
+"@OO.### .....  oooXXooo  #####@OO.",
+"@OO.##  ....  oooooooooo  ####@OO.",
+"@OO.###  ..  oooooooooooo  ###@OO.",
+"@OO.###XX   oXooXoXXoXooXo  ##@OO.",
+"@OO.###XXX oooooooooooooooo###@OO.",
+"@OO.###XXXXoooooooooooooooo###@OO.",
+"@OO.###XXXXoooooooooooooooo###@OO.",
+"@OO.###XXXXooo    oo.. ..oo###@OO.",
+"@OO.###XXXXooo    oo.. ..oo###@OO.",
+"@OO.# OXXXXooo    oo     ooOO#@OO.",
+"@OO.# O+XXXooo.   oo.. ..oo O#@OO.",
+"@OO.# O++XXooo    oo.. ..oo O#@OO.",
+"@OO.# O+++Xooo    ooooooooo O#@OO.",
+"@OO.# O++++ooo    ooooooooo O#@OO.",
+"@OO.# O++++++++++++++++++++ O#@OO.",
+"@OO.# O++++++OOOOOOO+++++++ O#@OO.",
+"@OO.# O+++++  OO   OO++++++ O#@OO.",
+"@OO.# O++++++ OO++  OO+++++ O#@OO.",
+"@OO.# O++++++ OO+++ OO+++++ O#@OO.",
+"@OO.# O++++++ OO+++ OO+++++ O#@OO.",
+"@OO.# O++++++ OO+++OO++++++ O#@OO.",
+"@OO.# O++++++ OOOOOO+++++++ O#@OO.",
+"@OO.# O++++++ OO+ OO+++++++ O#@OO.",
+"@OO.# O++++++ OO+  OO++++++ O#@OO.",
+"@OO.# O++++++ OO++  OO+++++ O#@OO.",
+"@OO.# O++++++OOOO++OOOO++++ O#@OO.",
+"@OO.# O+++++    ++    +++++ O#@OO.",
+"@OO.# O++++++++++++++++++++ O#@OO.",
+"@OO.# O++++++++++++++++++++ O#@OO.",
+"@OO.# O++++++++++++++++++++ O#@OO.",
+"@OO.# O++++++++++++++++++++ O#@OO.",
+"@OO.# OOOOOOOOOOOOOOOOOOOOOOO#@OO.",
+"@OO.#                        #@OO.",
+"@OO.##########################@OO.",
+"@OO.@@@@@@@@@@@@@@@@@@@@@@@@@@@OO.",
+"@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"@................................."
+};
diff --git a/images/tiles-48.xpm b/images/tiles-48.xpm
new file mode 100644 (file)
index 0000000..8bb4f40
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 50 7 1",
+"  c black",
+". c #5D5D5D5D5D5D",
+"X c #00000000AFAF",
+"o c blue",
+"O c green",
+"+ c gray75",
+"@ c gray100",
+/* pixels */
+"++++++++++++++++++++++++++++++++++",
+"+OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"+OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"+OO............................OO.",
+"+OO.                          +OO.",
+"+OO. @ @ @ @ @   @ @ @ @ @ @  +OO.",
+"+OO.  @ @ @ @ ..  @ @ @ @ @ @ +OO.",
+"+OO. @ @ @ @ .....   @ @ @ @  +OO.",
+"+OO.  @ @ @ .....     ... @ @ +OO.",
+"+OO. @ @ @ .....  oo  ...@ @  +OO.",
+"+OO.  @ @ .....  oooo  .. @ @ +OO.",
+"+OO. @ @ .....  oooooo  .@ @  +OO.",
+"+OO.  @ .....  oooXXooo   @ @ +OO.",
+"+OO. @  ....  oooooooooo   @  +OO.",
+"+OO.  @  ..  oooooooooooo   @ +OO.",
+"+OO. @ XX   oXooXoXXoXooXo    +OO.",
+"+OO.  @XXX oooooooooooooooo @ +OO.",
+"+OO. @ XXXXoooooooooooooooo@  +OO.",
+"+OO.  @XXXXoooooooooooooooo @ +OO.",
+"+OO. @ XXXXooo    oo.. ..oo@  +OO.",
+"+OO.  @XXXXooo    oo.. ..oo @ +OO.",
+"+OO.  OXXXXooo    oo     ooOO +OO.",
+"+OO.  O XXXooo.   oo.. ..oo O +OO.",
+"+OO.  O@ XXooo    oo.. ..oo O +OO.",
+"+OO.  O @ Xooo    ooooooooo O +OO.",
+"+OO.  O@ @ ooo    ooooooooo O +OO.",
+"+OO.  O @ @ @ @ @ @ @ @ @ @ O +OO.",
+"+OO.  O@ @ @ OOOOOOO @ @ @  O +OO.",
+"+OO.  O @ @   OO   OO @ @ @ O +OO.",
+"+OO.  O@ @ @  OO @  OO @ @  O +OO.",
+"+OO.  O @ @ @ OO@ @ OO@ @ @ O +OO.",
+"+OO.  O@ @ @  OO @  OO @ @  O +OO.",
+"+OO.  O @ @ @ OO@ @OO @ @ @ O +OO.",
+"+OO.  O@ @ @  OOOOOO @ @ @  O +OO.",
+"+OO.  O @ @ @ OO@ OO@ @ @ @ O +OO.",
+"+OO.  O@ @ @  OO   OO@ @ @  O +OO.",
+"+OO.  O @ @ @ OO@   OO@ @ @ O +OO.",
+"+OO.  O@ @ @ OOOO@ OOOO@ @  O +OO.",
+"+OO.  O @ @     @     @ @ @ O +OO.",
+"+OO.  O@ @ @ @ @ @ @ @ @ @  O +OO.",
+"+OO.  O @ @ @ @ @ @ @ @ @ @ O +OO.",
+"+OO.  O@ @ @ @ @ @ @ @ @ @  O +OO.",
+"+OO.  O @ @ @ @ @ @ @ @ @ @ O +OO.",
+"+OO.  OOOOOOOOOOOOOOOOOOOOOOO +OO.",
+"+OO.                          +OO.",
+"+OO.                          +OO.",
+"+OO.+++++++++++++++++++++++++++OO.",
+"+OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"+OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.",
+"+................................."
+};
diff --git a/images/tiles-49.xpm b/images/tiles-49.xpm
new file mode 100644 (file)
index 0000000..c18dbb1
--- /dev/null
@@ -0,0 +1,35 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"56 24 5 1",
+"  c black",
+". c #5D5D5D5D5D5D",
+"X c gray50",
+"o c gray75",
+"O c gray100",
+/* pixels */
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
+"o....OOOO....OOOO....OOOO....OOOO....OOOO....OOOO....OO.",
+"o....OOOO....OOOO....OOOO....OOOO....OOOO....OOOO....OO.",
+"oOO..................................................OO.",
+"oOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOO.",
+"oOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo...",
+"oOO.OO............................................OOo...",
+"o...OO.OXXo ............OXXo ......OXXo ....OXXo .OOo...",
+"o...OO.OXXo ............OXXo ......OXXo ....OXXo .OOo...",
+"o...OO.     ............     ......     ....     .OOoOO.",
+"o...OO............................................OOoOO.",
+"oOO.OO....OOOO....OOOO....OOOO....OOOO....OOOO....OOoOO.",
+"oOO.OO............................................OOoOO.",
+"oOO.OO..OXXo .....OXXo .........OXXo ......OXXo ..OOo...",
+"oOO.OO..OXXo .....OXXo .........OXXo ......OXXo ..OOo...",
+"o...OO..     .....     .........     ......     ..OOo...",
+"o...OO............................................OOo...",
+"o...OO                                            OOoOO.",
+"o...OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOO.",
+"oOO.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOO.",
+"oOO.oooooooooooooooooooooooooooooooooooooooooooooooooOO.",
+"oOO....OOOO....OOOO....OOOO....OOOO....OOOO....OOOO.....",
+"oOO....OOOO....OOOO....OOOO....OOOO....OOOO....OOOO.....",
+"o......................................................."
+};
diff --git a/images/tiles-5.xpm b/images/tiles-5.xpm
new file mode 100644 (file)
index 0000000..57c7220
--- /dev/null
@@ -0,0 +1,38 @@
+/* XPM */
+static char *tiles__[] = {
+/* columns rows colors chars-per-pixel */
+"69 26 6 1",
+"  c black",
+". c #727272727272",
+"X c blue",
+"o c cyan",
+"O c yellow",
+"+ c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                     ",
+"  .................................................................  ",
+" . ............................................................... + ",
+" .. ............................................................. ++ ",
+" ...                                                             +++ ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO +++ ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO +++ ",
+" ... OOOOOOOoXXOOOOOoXXOOOOOOoXXXOOOoXXXXXXXXOOOOoXXXXOOOOOOOOOO +++ ",
+" ... OOOOOOOOoXOOOOoXOoXOOOOOOoXXOOOoXOoXOOoXXOOoXOOoXOOOOOOOOOO +++ ",
+" ... OOOOOOOOoXOOOoXOOOoXOOOOOOoXXOoXOOoXOOOoXOOoXOOoXOOOOOOOOOO +++ ",
+" ... OOOOOOOOoXOOOoXOOOoXOOOOOOOoXXXOOOoXOOOoXOOoXXOOOOOOOOOOOOO +++ ",
+" ... OOOOOOOOoXOOOoXOOOoXOOOOOOOoXXOOOOoXOOoXXOOOoXXOOOOOOOOOOOO +++ ",
+" ... OOOOOOOOoXOOOoXOOOoXOOOOOOOOoXOOOOoXXXXXOOOOOoXXOOOOOOOOOOO +++ ",
+" ... OOOOOOOOoXOOOoXOOOoXOOOOOOOOoXOOOOoXoXXOOOOOOOoXXOOOOOOOOOO +++ ",
+" ... OOOOOOOOoXOOOoXOOOoXOOOOOOOOoXOOOOoXOoXXOOOoXOOoXOOOOOOOOOO +++ ",
+" ... OOOOOOOOoXOOOOoXOoXOOOOOOOOOoXOOOOoXOOoXXOOoXOOoXOOOOOOOOOO +++ ",
+" ... OOOOOOOoXXXOOOOoXXOOOOOOOOOoXXXOOoXXXOOoXXXoXXXXOOOoXOOOOOO +++ ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO +++ ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO +++ ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO +++ ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO +++ ",
+" ...                                                             +++ ",
+" .. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ ",
+" . +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ",
+"  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  ",
+"                                                                     "
+};
diff --git a/images/tiles-50.xpm b/images/tiles-50.xpm
new file mode 100644 (file)
index 0000000..6040ada
--- /dev/null
@@ -0,0 +1,35 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"56 24 5 1",
+"  c black",
+". c #5D5D5D5D5D5D",
+"X c gray50",
+"o c gray75",
+"O c gray100",
+/* pixels */
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
+"o....OOOO....OOOO....OOOO....OOOO....OOOO....OOOO....OO.",
+"o....OOOO....OOOO....OOOO....OOOO....OOOO....OOOO....OO.",
+"oOO..................................................OO.",
+"oOO.                                                oOO.",
+"oOO. O O O O O O O O O O O O O O O O O O O O O O O  o...",
+"oOO.  ............................................O o...",
+"o... O.OXXo ............OXXo ......OXXo ....OXXo .  o...",
+"o...  .OXXo ............OXXo ......OXXo ....OXXo .O o...",
+"o... O.     ............     ......     ....     .  oOO.",
+"o...  ............................................O oOO.",
+"oOO. O.... O O.... O O.... O O.... O O.... O O....  oOO.",
+"oOO.  ............................................O oOO.",
+"oOO. O..OXXo .....OXXo .........OXXo ......OXXo ..  o...",
+"oOO.  ..OXXo .....OXXo .........OXXo ......OXXo ..O o...",
+"o... O..     .....     .........     ......     ..  o...",
+"o...  ............................................O o...",
+"o... O                                              oOO.",
+"o...  O O O O O O O O O O O O O O O O O O O O O O O oOO.",
+"oOO.                                                oOO.",
+"oOO.oooooooooooooooooooooooooooooooooooooooooooooooooOO.",
+"oOO....OOOO....OOOO....OOOO....OOOO....OOOO....OOOO.....",
+"oOO....OOOO....OOOO....OOOO....OOOO....OOOO....OOOO.....",
+"o......................................................."
+};
diff --git a/images/tiles-51.xpm b/images/tiles-51.xpm
new file mode 100644 (file)
index 0000000..1499623
--- /dev/null
@@ -0,0 +1,61 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"42 42 13 1",
+"  c black",
+". c #00007F7F0000",
+"X c #7F7F7F7F0000",
+"o c #5D5D5D5D5D5D",
+"O c gray50",
+"+ c blue",
+"@ c #4F4F4F4FFFFF",
+"# c green",
+"$ c #BFBF79790000",
+"% c #FFFF77770000",
+"& c yellow",
+"* c gray75",
+"= c gray100",
+/* pixels */
+"******************************************",
+"*OO++++OOOO++++OOOO++++OOOO++++OOOO++++OOo",
+"*OO++++OOOO++++OOOO++++OOOO++++OOOO++++OOo",
+"*OOooooooooooooooooooooooooooooooooooooOOo",
+"*OOo==================================*OOo",
+"*++o=$$$$$$$$$$$$$$$$$$$$OOO$$$$o%%$$=*++o",
+"*++o=$$$X$$$$$$$X$$$$$$$$O*O$$$o$$%%$=*++o",
+"*++o=$$$OOOOOOOOOOOOOO OOOOO$$$$$$ %%=*++o",
+"*++o=$$$O*O*O& *O*O*O o O***OOOo$ $ %=*++o",
+"*OOo=OOOOOOOO***OOO*** O*OOo*OOO o $%=*OOo",
+"*OOo=*O*O*O$*OOoOO*OOo&**OOooO*Oo ooo=*OOo",
+"*OOo=OOOOOO**OOoo**OOoo**OOooOOo$*O o=*OOo",
+"*OOo=$$$$$$*o****************O*O$*OOo=*OOo",
+"*++o=$$$$$$***OOOOOOOOOOOOOO*OOOO*O o=*++o",
+"*++o=$$$$***o*OOOOOO*+OOOOOO*O*OO*ooo=*++o",
+"*++o=$$$*ooo*oO*oOO*+*+OO*oO*oOO$ooXX=*++o",
+"*++o=$$**ooO**OOOOOO*+OOOOOO*o*OO.XXX=*++o",
+"*OOo=$$**ooOo*OOOOOO*+OOOOOO*oOO#.$$$=*OOo",
+"*OOo=$$**ooO**OOOOOO*+OOOOOO*o*OO.O.$=*OOo",
+"*OOo=$$*OOOO**O*oO*+*+*+O*oO*oOO#.#.$=*OOo",
+"*OOo=$$OOXOOo*OOOOO*+++OOOOO*o*OOOOOO=*OOo",
+"*++o=$$$XXO******************oOOO*OO*=*++o",
+"*++o=$$@oX*o*OOOOOOOOOOOOOOOoo*OOOOOO=*++o",
+"*++o=$$@+$***ooooooooooooooOoOOO$$$$$=*++o",
+"*++o=$$@o$*o*ooooooooooooooOoO*O$$*OO=*++o",
+"*OOo=$$@+$o*OOOOOOOOOOOOOOOooOOO$&***=*OOo",
+"*OOo=$$@o$*OOooOOooOOooOOOXooO*O&o&o&=*OOo",
+"*OOo=$$@+$OOooOoooOOooOOOXXooOOOo&o&o=*OOo",
+"*OOo=$$$$$$ooooooooooooooooooO*O$o&o$=*OOo",
+"*++o=$$$$$$*o$oOO*o*oOOOOO*%OOOO$$X$X=*++o",
+"*++o=%%%%%%%%%%OOO*O*O*O*O*o*O*O$$*o$=*++o",
+"*++o=$$$$*o$$$$OOOOOOOOOOO*%OOOO$$$$$=*++o",
+"*++o=$$$*o$$$$$$$O*OO$$$$*oo$$$$*o$*o=*++o",
+"*OOo=$$$X$$OOOOOOOOOO$oo*o$%$$$$$$$$$=*OOo",
+"*OOo=$$$$X$O*O*O*O*OO$o*o$$o$$X$X$*o$=*OOo",
+"*OOo=$ $$$XOOOOOOOOOO$o$o$$%$$X$X$$$$=*OOo",
+"*OOo=$$$$$$o*O$$$$$$$$o$$$$o$$$$$$$$$=*OOo",
+"*++o==================================*++o",
+"*++o***********************************++o",
+"*++OOOO++++OOOO++++OOOO++++OOOO++++OOOO++o",
+"*++OOOO++++OOOO++++OOOO++++OOOO++++OOOO++o",
+"*ooooooooooooooooooooooooooooooooooooooooo"
+};
diff --git a/images/tiles-52.xpm b/images/tiles-52.xpm
new file mode 100644 (file)
index 0000000..dd82918
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"42 42 9 1",
+"  c black",
+". c #7F7F7F7F0000",
+"X c #5D5D5D5D5D5D",
+"o c gray50",
+"O c blue",
+"+ c #FFFF77770000",
+"@ c yellow",
+"# c gray75",
+"$ c gray100",
+/* pixels */
+"##########################################",
+"#ooOOOOooooOOOOooooOOOOooooOOOOooooOOOOooX",
+"#ooOOOOooooOOOOooooOOOOooooOOOOooooOOOOooX",
+"#ooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooX",
+"#ooX                                  #ooX",
+"#OOX $ $ $ $ $ $ $ $ $ $ ooo $ $ $ $  #OOX",
+"#OOX  $ $ $ $ $ $ $ $ $ $o#o$ $ $ $ $ #OOX",
+"#OOX $ $oooooooooooooo ooooo $ $ $ $  #OOX",
+"#OOX  $ o#o#o@ #o#o#o X o###oooX$ $ $ #OOX",
+"#ooX oooooooo###ooo### o#ooX#ooo $ $  #ooX",
+"#ooX #o#o#o #ooXoo#ooX@##ooXXo#o$ $ $ #ooX",
+"#ooX oooooo##ooXX##ooXX##ooXXooX $ $  #ooX",
+"#ooX  $ $ $#X################o#o$ $ $ #ooX",
+"#OOX $ $ $ ###oooooooooooooo#ooo $ $  #OOX",
+"#OOX  $ $###X#oooooo#Ooooooo#o#o$ $ $ #OOX",
+"#OOX $ $#XXX#Xo#Xoo#O#Ooo#Xo#Xoo $ $  #OOX",
+"#OOX  $##XXo##oooooo#Ooooooo#X#o$ $ $ #OOX",
+"#ooX $ ##XXoX#oooooo#Ooooooo#Xoo $ $  #ooX",
+"#ooX  $##XXo##oooooo#Ooooooo#X#o$ $ $ #ooX",
+"#ooX $ #oooo##o#Xo#O#O#Oo#Xo#Xoo $ $  #ooX",
+"#ooX  $oo ooX#ooooo#OOOooooo#X#oooooo #ooX",
+"#OOX $ $ $o##################Xooo#oo# #OOX",
+"#OOX  $ $ #X#oooooooooooooooXX#oooooo #OOX",
+"#OOX $ $ $###XXXXXXXXXXXXXXoXooo $ $  #OOX",
+"#OOX  $ $ #X#XXXXXXXXXXXXXXoXo#o$ $ $ #OOX",
+"#ooX $ $ $X#oooooooooooooooXXooo $ $  #ooX",
+"#ooX  $ $ #ooXXooXXooXXooo.XXo#o$ $ $ #ooX",
+"#ooX $ $ $ooXXoXXXooXXooo..XXooo $ $  #ooX",
+"#ooX  $ $ $XXXXXXXXXXXXXXXXXXo#o$ $ $ #ooX",
+"#OOX $ $ $ $ $ oo#X#Xooooo#+oooo $ $  #OOX",
+"#OOX  $ $ $ $ $ooo#o#o#o#o#X#o#o$ $ $ #OOX",
+"#OOX $ $ $ $ $ ooooooooooo#+oooo $ $  #OOX",
+"#OOX  $ $ $ $ $ $o#oo $ $ $ $ $ $ $ $ #OOX",
+"#ooX $ $ $ oooooooooo$ $ $ $ $ $ $ $  #ooX",
+"#ooX  $ $ $o#o#o#o#oo $ $ $ $ $ $ $ $ #ooX",
+"#ooX $ $ $ oooooooooo$ $ $ $ $ $ $ $  #ooX",
+"#ooX  $ $ $X#o$ $ $ $ $ $ $ $ $ $ $ $ #ooX",
+"#OOX                                  #OOX",
+"#OOX###################################OOX",
+"#OOooooOOOOooooOOOOooooOOOOooooOOOOooooOOX",
+"#OOooooOOOOooooOOOOooooOOOOooooOOOOooooOOX",
+"#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/images/tiles-53.xpm b/images/tiles-53.xpm
new file mode 100644 (file)
index 0000000..d69e152
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"42 42 9 1",
+"  c black",
+". c #00007F7F0000",
+"X c #7F7F7F7F0000",
+"o c #5D5D5D5D5D5D",
+"O c gray50",
+"+ c green",
+"@ c #BFBF79790000",
+"# c gray75",
+"$ c gray100",
+/* pixels */
+"##########################################",
+"#OO++++OOOO++++OOOO++++OOOO++++OOOO++++OOo",
+"#OO++++OOOO++++OOOO++++OOOO++++OOOO++++OOo",
+"#OOooooooooooooooooooooooooooooooooooooOOo",
+"#OOo$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#OOo",
+"#++o$@@@@+@@+OOO+@+@+@@#######@@@@@@@$#++o",
+"#++o$@@@.@@+@OOO.@@@@##ooooooo##@@+@@$#++o",
+"#++o$@@OOOOOOOOO@@@.#ooo     ooo#@@@@$#++o",
+"#++o$@+OOOOOOOOO@.+#oo  ooooo  oo#@@@$#++o",
+"#OOo$OOOOOOOOOOO@@@#o ooo   ooo o#@@+$#OOo",
+"#OOo$OOOoOoOoOoO@@#o o   ooo   o o#@@$#OOo",
+"#OOo$@@OOOOOOOOO+@# o o o o o o o #@@$#OOo",
+"#OOo$@@OOOOOOOOO@o#o           oo #@@$#OOo",
+"#++o$@@OoOoOoOoOoo$ ooOoooooooo o #@@$#++o",
+"#++o$@+OOOOOOOOOo$$ o         o o #@@$#++o",
+"#++o$@.OOOOOOOOO$$$ o ...##.. o o #@@$#++o",
+"#++o$@@OoOoOoOoO$$# o +++#+++ o o #@@$#++o",
+"#OOo$@@OOOOOOOOO$o# o +.+++.+ o o #+@$#OOo",
+"#OOo$@@OOOOOOOOOoo# o +.+++.+ O o #@@$#OOo",
+"#OOo$@@OoOoOoOoOo## o +++++++ o o #@@$#OOo",
+"#OOo$@@OOOOOOOOO### o .+.+.+. O o #@@$#OOo",
+"#++o$@@OOOOOOOOO### o +++++++ o o #@@$#++o",
+"#++o$@+OoOoOoOoO#o# o +.+++.+ O o #@+$#++o",
+"#++o$@@OOOOOOOOOoo# o +.+++.+ o o #@@$#++o",
+"#++o$@@OOOOOOOOOo## o +++##++ o o #@@$#++o",
+"#OOo$@@OoOoOoOoO### o ...#... o o #@@$#OOo",
+"#OOo$@@OOOOOOOOO### o         o o #@@$#OOo",
+"#OOo$@@OOOOOOOOO### ooooooooooo o #@@$#OOo",
+"#OOo$@@OoOoOoOoO###o           oo #+@$#OOo",
+"#++o$OOOOOOOOOOO###o oo o o o o o #@@$#++o",
+"#++o$OOOOOOOOOOO OO# ooo     ooo #o@@$#++o",
+"#++o$@+@OOOOOOOO@OO#o  ooooooo  o#.@@$#++o",
+"#++o$@@@+OOOOOOO@OOO#oo       oo#.X+@$#++o",
+"#OOo$@.@@@+OOO@@+@OoO##ooooooo##XX@@@$#OOo",
+"#OOo$@@++@@OOO@@@@+OOoO#######XXX@@@+$#OOo",
+"#OOo$@@.@@@OOO@@@@++oOOoOOoooXXX@@@@@$#OOo",
+"#OOo$@+@@@@OOO@+@.@.oOoOOoooX.X+@+@@@$#OOo",
+"#++o$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#++o",
+"#++o###################################++o",
+"#++OOOO++++OOOO++++OOOO++++OOOO++++OOOO++o",
+"#++OOOO++++OOOO++++OOOO++++OOOO++++OOOO++o",
+"#ooooooooooooooooooooooooooooooooooooooooo"
+};
diff --git a/images/tiles-54.xpm b/images/tiles-54.xpm
new file mode 100644 (file)
index 0000000..48e004a
--- /dev/null
@@ -0,0 +1,55 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"42 42 7 1",
+"  c black",
+". c #00007F7F0000",
+"X c #5D5D5D5D5D5D",
+"o c gray50",
+"O c green",
+"+ c gray75",
+"@ c gray100",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++",
+"+ooOOOOooooOOOOooooOOOOooooOOOOooooOOOOooX",
+"+ooOOOOooooOOOOooooOOOOooooOOOOooooOOOOooX",
+"+ooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooX",
+"+ooX                                  +ooX",
+"+OOX  @ @ @ @ooo@ @ @ @+++++++@ @ @ @ +OOX",
+"+OOX @ @ @ @ ooo @ @ ++XXXXXXX++ @ @  +OOX",
+"+OOX  @ooooooooo@ @ @XXX     XXX+ @ @ +OOX",
+"+OOX @ ooooooooo @ +XX  XXXXX  XX+ @  +OOX",
+"+ooX ooooooooooo@ @+X XXX   XXX X+@ @ +ooX",
+"+ooX oooXoXoXoXo @+X X   XXX   X X+@  +ooX",
+"+ooX  @ooooooooo@ + X X X X X X X + @ +ooX",
+"+ooX @ ooooooooo X+X           XX +@  +ooX",
+"+OOX  @oXoXoXoXoXX@ XXoXXXXXXXX X + @ +OOX",
+"+OOX @ oooooooooX@@ X         X X +@  +OOX",
+"+OOX  @ooooooooo@@@ X ...++.. X X + @ +OOX",
+"+OOX @ oXoXoXoXo@@+ X OOO+OOO X X +@  +OOX",
+"+ooX  @ooooooooo@X+ X O.OOO.O X X + @ +ooX",
+"+ooX @ oooooooooXX+ X O.OOO.O o X +@  +ooX",
+"+ooX  @oXoXoXoXoX++ X OOOOOOO X X + @ +ooX",
+"+ooX @ ooooooooo+++ X .O.O.O. o X +@  +ooX",
+"+OOX  @ooooooooo+++ X OOOOOOO X X + @ +OOX",
+"+OOX @ oXoXoXoXo+X+ X O.OOO.O o X +@  +OOX",
+"+OOX  @oooooooooXX+ X O.OOO.O X X + @ +OOX",
+"+OOX @ oooooooooX++ X OOO++OO X X +@  +OOX",
+"+ooX  @oXoXoXoXo+++ X ...+... X X + @ +ooX",
+"+ooX @ ooooooooo+++ X         X X +@  +ooX",
+"+ooX  @ooooooooo+++ XXXXXXXXXXX X + @ +ooX",
+"+ooX @ oXoXoXoXo+++X           XX +@  +ooX",
+"+OOX ooooooooooo+++X XX X X X X X + @ +OOX",
+"+OOX ooooooooooo oo+ XXX     XXX + @  +OOX",
+"+OOX  @ oooooooo@oo+X  XXXXXXX  X+@ @ +OOX",
+"+OOX @ @ ooooooo ooo+XX       XX+@ @  +OOX",
+"+ooX  @ @ @ooo@ @ oXo++XXXXXXX++@ @ @ +ooX",
+"+ooX @ @ @ ooo @ @ ooXo+++++++ @ @ @  +ooX",
+"+ooX  @ @ @ooo@ @ @ XooXooXXX @ @ @ @ +ooX",
+"+ooX @ @ @ ooo @ @ @XoXooXXX @ @ @ @  +ooX",
+"+OOX                                  +OOX",
+"+OOX+++++++++++++++++++++++++++++++++++OOX",
+"+OOooooOOOOooooOOOOooooOOOOooooOOOOooooOOX",
+"+OOooooOOOOooooOOOOooooOOOOooooOOOOooooOOX",
+"+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/images/tiles-55.xpm b/images/tiles-55.xpm
new file mode 100644 (file)
index 0000000..dcbf3f2
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 6 1",
+"  c black",
+". c #7F7F7F7F0000",
+"X c #5D5D5D5D5D5D",
+"o c yellow",
+"O c gray75",
+"+ c gray100",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"Ooo    oooo    oooo    oooo    ooX",
+"Ooo    oooo    oooo    oooo    ooX",
+"OooXXXXXXXXXXXXXXXXXXXXXXXXXXXXooX",
+"OooX++++++++++++++++++++++++++OooX",
+"O  X++++++++++++++++++++++++++O  X",
+"O  X+++++++.X+++++++++++++++++O  X",
+"O  X++     XX     ++++++++++++O  X",
+"O  X+++++++.X+++++++++++++++++O  X",
+"OooX+++++++.X+++++++++++++++++OooX",
+"OooX+++++++.X+++++++++++++++++OooX",
+"OooX++     XX     ++++++++++++OooX",
+"OooX+++++++.X+++++++++++++++++OooX",
+"O  X+++++++.X+++++++X+++++++++O  X",
+"O  X+++++++.X++++   X   ++++++O  X",
+"O  X+++++++.X+++++++X+++++++++O  X",
+"O  X+++++++.X+++++++X+++++++++O  X",
+"OooX+++++++.X++++   X   ++++++OooX",
+"OooX+++++++.X+++++++X+++++++++OooX",
+"OooX+++++++.X+++++++X++  X  ++OooX",
+"OooX+++++++.X+++++++X++++X++++OooX",
+"O  X+++++++.X+++++++X++  X  ++O  X",
+"O  X+++++++.X+++++++X++++X++++O  X",
+"O  X+++++++.X+++++++X++++X++++O  X",
+"O  X+++++++.X+++++++X++++X++++O  X",
+"OooX+++++++.X+++++++X++++X++++OooX",
+"OooX+++++++.X+++++++X+++++++++OooX",
+"OooX+++++++.X+++++++++++++++++OooX",
+"OooX++++++++++++++++++++++++++OooX",
+"O  X++++++++++++++++++++++++++O  X",
+"O  XOOOOOOOOOOOOOOOOOOOOOOOOOOO  X",
+"O  oooo    oooo    oooo    oooo  X",
+"O  oooo    oooo    oooo    oooo  X",
+"OXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/images/tiles-56.xpm b/images/tiles-56.xpm
new file mode 100644 (file)
index 0000000..a939474
--- /dev/null
@@ -0,0 +1,46 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"34 34 6 1",
+"  c black",
+". c #7F7F7F7F0000",
+"X c #5D5D5D5D5D5D",
+"o c yellow",
+"O c gray75",
+"+ c gray100",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"Ooo    oooo    oooo    oooo    ooX",
+"Ooo    oooo    oooo    oooo    ooX",
+"OooXXXXXXXXXXXXXXXXXXXXXXXXXXXXooX",
+"OooX                          OooX",
+"O  X + + + + + + + + + + + +  O  X",
+"O  X  + + +.X + + + + + + + + O  X",
+"O  X +     XX      + + + + +  O  X",
+"O  X  + + +.X + + + + + + + + O  X",
+"OooX + + + .X+ + + + + + + +  OooX",
+"OooX  + + +.X + + + + + + + + OooX",
+"OooX +     XX      + + + + +  OooX",
+"OooX  + + +.X + + + + + + + + OooX",
+"O  X + + + .X+ + + +X+ + + +  O  X",
+"O  X  + + +.X + +   X   + + + O  X",
+"O  X + + + .X+ + + +X+ + + +  O  X",
+"O  X  + + +.X + + + X + + + + O  X",
+"OooX + + + .X+ +    X    + +  OooX",
+"OooX  + + +.X + + + X + + + + OooX",
+"OooX + + + .X+ + + +X+   X    OooX",
+"OooX  + + +.X + + + X + +X+ + OooX",
+"O  X + + + .X+ + + +X+   X    O  X",
+"O  X  + + +.X + + + X + +X+ + O  X",
+"O  X + + + .X+ + + +X+ + X +  O  X",
+"O  X  + + +.X + + + X + +X+ + O  X",
+"OooX + + + .X+ + + +X+ + X +  OooX",
+"OooX  + + +.X + + + X + + + + OooX",
+"OooX + + + .X+ + + + + + + +  OooX",
+"OooX  + + + + + + + + + + + + OooX",
+"O  X                          O  X",
+"O  XOOOOOOOOOOOOOOOOOOOOOOOOOOO  X",
+"O  oooo    oooo    oooo    oooo  X",
+"O  oooo    oooo    oooo    oooo  X",
+"OXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+};
diff --git a/images/tiles-57.xpm b/images/tiles-57.xpm
new file mode 100644 (file)
index 0000000..814581e
--- /dev/null
@@ -0,0 +1,57 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 3 1",
+"  c black",
+". c #CCCC7E7E6666",
+"X c yellow",
+/* pixels */
+" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+" X                                             X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X................... XXXX.................... X",
+" X...................  XX .................... X",
+" X.................... XX..................... X",
+" X.................... XX..................... X",
+" X.................... XX..................... X",
+" X.................... XX..................... X",
+" X.................... XX..................... X",
+" X.................... XX..................... X",
+" X.................... XX..................... X",
+" X.................... XX..................... X",
+" X................... XXXX.................... X",
+" X...................     .................... X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" X............................................ X",
+" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
+"                                                "
+};
diff --git a/images/tiles-58.xpm b/images/tiles-58.xpm
new file mode 100644 (file)
index 0000000..9310825
--- /dev/null
@@ -0,0 +1,64 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"134 56 2 1",
+"  c yellow",
+". c gray69",
+/* pixels */
+".......................................................................................................        .......................",
+".....................................................................................................  ........ ......................",
+".................................................................................................... ...........  .     ..............",
+".................................................................................................... ............. .....  ............",
+"..................................................................................................  ..................... ............",
+"................................................................................................  ....................... ............",
+"..............................................................................................  ......................... ............",
+"............................................................................................  ........................... ............",
+"..........................................................................................  .............................. ...........",
+"........................................................................................  .. .................. ........... ..........",
+"......................................................................................  .... .................. ............ .........",
+"....................................................................................  ... .. .................. ............. ........",
+"..................................................................................  ..... .. ........................... ..... .......",
+"................................................................................. ....... .. ...........................  ..... ......",
+"................................................................................. ....... .. ........................... . ..... .....",
+"...................................... .......... ............... .......        ........ .. ........................... .. ..... ....",
+"......................... ........... .          . ............. .  ..... ............... .. ........................... ...  .... ...",
+".................        . ......... ..............  .......... ...      ................ .. .................. ........  .... ....   ",
+"................ .......... ....... ................. ........ .......................... .. .................. ........   .... ... . ",
+"............... ...........        ..................         ........................... .. ...........................  .  ... .. . ",
+".......        .......................................................................... .. ...........................  ... .. .. . ",
+"...... .................................................................................. .. ...........................  .... . .. . ",
+"....  ................................................................................... .. ...........................  .... . .. . ",
+"...                                                                               ....... .. ...........................  .... . .. . ",
+".. ...................................................................................... .. .................. ........  .... . .. . ",
+"   . .. . .. .. . .. . .. .. . .. . .. .. . .. . .. .. . .. . .. .. . .. . .. .. ........ .. .................. ........  .... . .. . ",
+"                                                                                  ....... .. ...........................  .... . .. . ",
+"  ....................................................................................... .. ...........................  .... . .. . ",
+" .  ..................................................................................... .. ...........................  .... . .. . ",
+" ... .................................................................................... .. ...........................  .... . .. . ",
+". ... ................................................................................... .. ...........................  .... . .. . ",
+"..  ..  ................................................................................. .. .................. ........  .... . .. . ",
+".... ... ................................................................................ .. .................. ........  ....  ... . ",
+"..... ...                                                                          ...... .. ...........................  .... .... . ",
+"......  .......................................................................... ...... .. ...........................  ... ..... . ",
+"........ ......................................................................... ...... .. ...........................  .  ..... .. ",
+"......... ........................................................................ ...... .. ...........................    ..... .. .",
+"........                                                                        .. ...... .. ...........................   ..... .. ..",
+"............................................................................... .. ...... .. ...........................  ..... .. ...",
+"............................................................................... ..  ..... .. .................. ........ ....  .. ....",
+"............................................................................... ....  ... .. .................. ............ ..  .....",
+"...............................................................................  .....   ... .............................. .. .......",
+".................................................................................  ......  ............................... .. ........",
+"...................................................................................  ......  ............................ .. .........",
+".....................................................................................   .....   ......................... . ..........",
+"........................................................................................  ......  .......................  ...........",
+"..........................................................................................   .....  .....................  ...........",
+".............................................................................................  .... .............. ......  ...........",
+"...............................................................................................  ... ............ . .... . ...........",
+".................................................................................................  . ........... ..     .. ...........",
+".................................................................................................. ..  ........ .......... ...........",
+".................................................................................................. ....        ... .....  ............",
+".................................................................................................. .............. .     ..............",
+"...................................................................................................  ........... .....................",
+".....................................................................................................  ........ ......................",
+"......................................................................................................         ......................."
+};
diff --git a/images/tiles-59.xpm b/images/tiles-59.xpm
new file mode 100644 (file)
index 0000000..ae12e80
--- /dev/null
@@ -0,0 +1,31 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"53 23 2 1",
+"  c yellow",
+". c gray69",
+/* pixels */
+".........    ........................................",
+".....       . .......................................",
+"....   . ...   ......................................",
+".... .. .....    ....................................",
+".... ..........     .................................",
+"... ............   .  ...............................",
+".  .. .. .......  .   ...............................",
+"  ..  ..........  ..                              ...",
+" .    ..........  ..                               ..",
+"   .  .. .......  ................................  .",
+"   .  ..........  .................................  ",
+"   .  .. .......  ..                                 ",
+"   .  .. .......  ..                                .",
+"   .  ..........  ................................ ..",
+"  .   .. .......  ..........    ......    ....    ...",
+" . .  .. .......  ..        ....      ....    .......",
+". .   ..........  .. ..... ..........................",
+"..  . .. .......  .  ................................",
+".... ... .......   ..................................",
+".... ..........  ....................................",
+".... .. .....  ......................................",
+".....  . ... ........................................",
+".........   ........................................."
+};
diff --git a/images/tiles-6.xpm b/images/tiles-6.xpm
new file mode 100644 (file)
index 0000000..afd3e51
--- /dev/null
@@ -0,0 +1,38 @@
+/* XPM */
+static char *tiles__[] = {
+/* columns rows colors chars-per-pixel */
+"69 26 6 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c #727272727272",
+"o c #FFFFBBBB0000",
+"O c yellow",
+"+ c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                     ",
+"  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  ",
+" + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ X ",
+" ++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ XX ",
+" +++                                                             XXX ",
+" +++ ........................................................... XXX ",
+" +++ ........................................................... XXX ",
+" +++ .......Ooo.....Ooo......Oooo...Ooooooooo....Ooooo.......... XXX ",
+" +++ ........Oo....Oo.Oo......Ooo...Oo.Oo..Ooo..Oo..Oo.......... XXX ",
+" +++ ........Oo...Oo...Oo......Ooo.Oo..Oo...Oo..Oo..Oo.......... XXX ",
+" +++ ........Oo...Oo...Oo.......Oooo...Oo...Oo..Ooo............. XXX ",
+" +++ ........Oo...Oo...Oo.......Ooo....Oo..Ooo...Ooo............ XXX ",
+" +++ ........Oo...Oo...Oo........Oo....Oooooo.....Ooo........... XXX ",
+" +++ ........Oo...Oo...Oo........Oo....OoOoo.......Ooo.......... XXX ",
+" +++ ........Oo...Oo...Oo........Oo....Oo.Ooo...Oo..Oo.......... XXX ",
+" +++ ........Oo....Oo.Oo.........Oo....Oo..Ooo..Oo..Oo.......... XXX ",
+" +++ .......Oooo....Ooo.........Oooo..Oooo..OoooOoooo...Oo...... XXX ",
+" +++ ........................................................... XXX ",
+" +++ ........................................................... XXX ",
+" +++ ........................................................... XXX ",
+" +++ ........................................................... XXX ",
+" +++                                                             XXX ",
+" ++ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX ",
+" + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X ",
+"  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
+"                                                                     "
+};
diff --git a/images/tiles-60.xpm b/images/tiles-60.xpm
new file mode 100644 (file)
index 0000000..d2073a2
--- /dev/null
@@ -0,0 +1,26 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"93 14 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray69",
+"+ c gray75",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO                                             OOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO ++++++++++ oooooooooo XXXXXXXXXX .......... OOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO ++++++++++ oooooooooo XXXXXXXXXX .......... OOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OO OOOOO OO OO OOOO OO ++++++++++ oooooooooo XXXXXXXXXX .......... OO OOOOO OOOO OOOO OOOO OO",
+"OO  OOO  OO OO  OOO OO ++++++++++ oooooooooo XXXXXXXXXX .......... OO  OOO  OOO O OOOO OO OOO",
+"OO O O O OO OO O OO OO ++++++++++ oooooooooo XXXXXXXXXX .......... OO O O O OO OOO OOOO  OOOO",
+"OO OO OO OO OO OO O OO ++++++++++ oooooooooo XXXXXXXXXX .......... OO OO OO O       OOO  OOOO",
+"OO OOOOO OO OO OOO  OO ++++++++++ oooooooooo XXXXXXXXXX .......... OO OOOOO O OOOOO OO OO OOO",
+"OO OOOOO OO OO OOOO OO ++++++++++ oooooooooo XXXXXXXXXX .......... OO OOOOO O OOOOO O OOOO OO",
+"OOOOOOOOOOOOOOOOOOOOOO ++++++++++ oooooooooo XXXXXXXXXX .......... OOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO ++++++++++ oooooooooo XXXXXXXXXX .......... OOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOO                                             OOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
+};
diff --git a/images/tiles-61.xpm b/images/tiles-61.xpm
new file mode 100644 (file)
index 0000000..9d6aec1
--- /dev/null
@@ -0,0 +1,21 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"1 14 1 1",
+"  c #0D080C9F0CAE",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
diff --git a/images/tiles-62.xpm b/images/tiles-62.xpm
new file mode 100644 (file)
index 0000000..866a7a9
--- /dev/null
@@ -0,0 +1,26 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"93 14 6 1",
+"  c black",
+". c #00007F7F0000",
+"X c #0000E6E60000",
+"o c #FFFF7F7F0000",
+"O c yellow",
+"+ c gray69",
+/* pixels */
+"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++++++++++++                       ++++++++++++++++                       ++++++++++++++++",
+"+++++++++++++++ OOOOOOOOOO oooooooooo ++++++    ++++++ .......... XXXXXXXXXX ++++++++++++++++",
+"+++++++++++++++ OOOOOOOOOO oooooooooo +++++  ++  +++++ .......... XXXXXXXXXX +++++++  +++++++",
+"+++++++++++++++ OOOOOOOOOO oooooooooo ++++  ++++  ++++ .......... XXXXXXXXXX +++++++  +++++++",
+"+++++++++++++++ OOOOOOOOOO oooooooooo ++++  +++   ++++ .......... XXXXXXXXXX +++++++  +++++++",
+"+++        ++++ OOOOOOOOOO oooooooooo +++  +++ ++  +++ .......... XXXXXXXXXX ++++        ++++",
+"+++        ++++ OOOOOOOOOO oooooooooo +++  ++ +++  +++ .......... XXXXXXXXXX ++++        ++++",
+"+++++++++++++++ OOOOOOOOOO oooooooooo ++++   +++  ++++ .......... XXXXXXXXXX +++++++  +++++++",
+"+++++++++++++++ OOOOOOOOOO oooooooooo ++++  ++++  ++++ .......... XXXXXXXXXX +++++++  +++++++",
+"+++++++++++++++ OOOOOOOOOO oooooooooo +++++  ++  +++++ .......... XXXXXXXXXX +++++++  +++++++",
+"+++++++++++++++ OOOOOOOOOO oooooooooo ++++++    ++++++ .......... XXXXXXXXXX ++++++++++++++++",
+"+++++++++++++++                       ++++++++++++++++                       ++++++++++++++++",
+"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-63.xpm b/images/tiles-63.xpm
new file mode 100644 (file)
index 0000000..2d895a4
--- /dev/null
@@ -0,0 +1,52 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"58 39 7 1",
+"  c black",
+". c blue",
+"X c #0000BFBF7F7F",
+"o c red",
+"O c #BBBB0000FFFF",
+"+ c #FFFFBBBB0000",
+"@ c gray69",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@         @@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@             @@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@                  @@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@                      @@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@         @@@@@@@@@       @@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@      @@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@    @@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@@    @@@@@@@@@@@@",
+"@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@@@@@   @@@@@@@@@@@",
+"@@@@@@@@@@@@      @@@@@@@@@@@@@@@@@@@@@@@@@@@   @@@@@@@@@@",
+"@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@  @@@@@@@@@@",
+"@@@@@@@@@@@@    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@",
+"@@@@@@@@@@@    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  @@@@@@@@@",
+"@@@@@@@@@@@    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@",
+"@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@",
+"@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@",
+"...@@@...@    @@@@@+++@@@@@@@OOO@@OOO@@@@@@oo@@@@@@@XXXXX@",
+"...@@@...@    @@@@++++@@@@@@@@OO@OOO@@@@@@@oo@@@@@@XXXXXXX",
+"....@....@    @@@@++++@@@@@@@@OOOOO@@@@@@@@oo@@@@@@XX@@@XX",
+"....@....@    @@@@+++++@@@@@@@@OOOO@@@@@@@@oo@@@@@@XX@@@@@",
+"....@....@    @@@++@@++@@@@@@@@@OO@@@@@@@@@oo@@@@@@@XXXXX@",
+"..@...@..@    @@@++++++@@@@@@@@OOOO@@@@@@@@oo@@@@@@@@@@@XX",
+"..@...@..@    @@@+++++++@@@@@@OOOOO@@@@@@@@oo@@@@@@XX@@@XX",
+"..@...@..@    @@++@@@@++@@@@@@OO@OOO@@@@@@@oo@@@@@@XXXXXXX",
+"..@@.@@..@@   @@++@@@@++@@@@@OOO@@OOO@@@@@@oo@@@@@@@XXXXX@",
+"@@@@@@@@@@@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/images/tiles-64.xpm b/images/tiles-64.xpm
new file mode 100644 (file)
index 0000000..bbb1595
--- /dev/null
@@ -0,0 +1,83 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"64 64 13 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c #00007F7F0000",
+"o c gray50",
+"O c #00000000E6E6",
+"+ c #0000E6E60000",
+"@ c #99997E7E4C4C",
+"# c red",
+"$ c #FFFF7B7B0000",
+"% c #CCCC7E7E6666",
+"& c yellow",
+"* c gray75",
+"= c gray100",
+/* pixels */
+" &&&&&&&&&&&&&&&&&&&&&&&&&&===#===&&&&&&&&&&&&&&&&===#===&&&&&&&",
+" &                       ==ooooooo==            ==ooooooo==    &",
+" &%%%%%%%%%@%%%%%%%%%%%%=o. . . . .o=%%%%%%%%%%=o. . . . .o=%% &",
+" &%@%%%%%%%%%%%%%%%%%%%=o. . . . . .o=%%%%%%%%=o. . . . . .o=% &",
+" &%%%%%*&.............=o. . . . . . .o=......=o. . . . . . .o= &",
+" &%%%%**..............=. . . . . . . .=......=. . . . . . . .= &",
+" &%%%***.o ..........=o . . . . . . . o=....=o . . . . . . . o=&",
+" &%%****.o ..........= . . . . . . . .o=....= . . . . . . . .o=&",
+" &%*****............*=. . . . . . . . o=...*=. . . . . . . . o=&",
+" &%*o***..........==*# . . . . . . . .o#.==*# . . . . . . . .o#&",
+" &%*****........====*=. . . . . . . . o=*==*=. . . . . . . . o=&",
+" &%*****.......=====*= . . . . . . . .o=*==*= . . . . . . . .o=&",
+" &%*o***......======*=o . . . . . . . o=*==*=o . . . . . . . o=&",
+" &%*****.....=*=====**=. . . . . . . .=**==**=. . . . . . . .= &",
+" &%*****.....======***=o. . . . . . .o=*==***=o. . . . . . .o= &",
+" &%*o***....=======****=o. . . . . ..=*===****=o. . . . . ..=% &",
+" &%*****....======******=o. . . . .o=*===******=o. . . . .o=%% &",
+" &%*****....=====********==o . . o==*===********==o . . o==%%% &",
+" &%*o***....=*==*********oo===#===.**==*********oo===#===..%%% &",
+" &%*****....==**********ooooooooo..*=**********ooooooooo...%%% &",
+" &%*****....=*********oooooooooo...=*********oooooooooo....@%% &",
+" &%*o***....*********oooooooooo....*********oooooooooo.....@%% &",
+" &%*****.....**o****oooooooooo......**o****oooooooooo......@%% &",
+" &%*****.....******ooooooooooo......******ooooooooooo......@%% &",
+" &%*o***......*****ooooooo.oo........*****ooooooo.oo.......@%% &",
+" &%*****.......***oo.ooooooo..........***oo.ooooooo........@%% &",
+" &%*****........*oooooooooo............*oooooooooo.........@%% &",
+" &%*o***.o .......ooooooo................ooooooo...........@%% &",
+" &%*****.o .............................................o .@%% &",
+" &%*****............ . . ...............................o .@%% &",
+" &%*o***.......*******************.........................@%% &",
+" &%*****&......*ooooooooooooooooo*........................&@%@ &",
+" &%****oooooooo*ooooooooooooooooo*oo.o.o.oooooooooooooooooo@%% &",
+" &%*o*ooooooooo*ooooooooooooooooo*oooooooooooooooooooooooo@@%% &",
+" &%**oooooooooo*ooo...ooooo...ooo*....................ooo@@@%% &",
+" &%*oooooooooo**oo.ooo..o..ooo.oo*....................oo@@@@%% &",
+" &%oooooooooo*o*oo.ooooo.ooooo.oo*.........&..........o@@@@@%% &",
+" &%%@@@@@@@@*o**oo&oooo&o.oooo.oo*........&...........@@@@@@%% &",
+" &%%%@@@@@@@o*o*ooo.oo.ooo.oo.ooo*.......&............@@@@@@%% &",
+" &%%%%@@@@@@*o**ooo.o.oo#oo.o.ooo*......&.............@@@@@@%% &",
+" &%%%%%@@@@@o***oooo.oo##$oo.oooo*.....&..............@@@@@@%% &",
+" &%%%%%%@@@@****ooo.o.oo$oo.o.ooo*....&&&&&...........@@@@@@%% &",
+" &%%%%%%%%%%*o**ooo.oo.ooo.oo.ooo*...&&&&&............@%%%%%%% &",
+" &%%%%%%%%%%****oo.oooo.o&oooo&oo*......&.............@%%%%%%% &",
+" &%%%%%%%%%%*o**oo.ooooo.ooooo.oo*.....&.....ooooooo.@@%%%%%@% &",
+" &%%%%%@%%%%****oo.ooo..o..ooo.oo*....&......oooooo.@@@%%%%%%% &",
+" &%%%%%%%%%%*o**ooo...ooooo...ooo*...&.............oooo**$$*****",
+" &%%%+X%%%%%****ooooooooooooooooo*..&........oooooooooo**$$*****",
+" &%%%XX%%%%%*o**ooooooooooooooooo*...........oooooooooo*********",
+" &%%@%%%%%%%****o.o.o.o.o.o.o.o.o............oooooooooo*********",
+" &%@%%%%%%%%*o*o.o.o.o.o.o.o.o.o.............oooooooooo*********",
+" &%%%%%%%+X%***..............................o******************",
+" &%%%%%%%XX%*o*..............................o***************% &",
+" &%%%%%%@%%%**oooooooooooooooooooooooooooooo.o***************% &",
+" &%%%%%@%%%%*ooo.o.o.o.oooooooooooo.o.oo.oo.oo***************% &",
+" &%%%%%+X%%%oooooooooooooooooooooooooooooo.ooo***************% &",
+" &%%%%%XX%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@oooX+*OO***********% &",
+" &%%%%@%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@oooX+*OO***********% &",
+" &%%%@%%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@oooo***************% &",
+" &%%%%%%%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%%%%%%%%% &",
+" &%%%%%%%%%@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*=*=%%% &",
+" &%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@%%%%%%%%%%%%%%%%%%%%%==*=@%%% &",
+" &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
+"                                                                "
+};
diff --git a/images/tiles-65.xpm b/images/tiles-65.xpm
new file mode 100644 (file)
index 0000000..9b17a7e
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 7 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c red",
+"O c gray75",
+"+ c gray100",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@OOOO@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@O+  .  @@@@@@@@@@@",
+"@@@@@@@@@@@@@O++ ++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OOOO++o+O@@@@@@@@@@",
+"@@@@@@@@@@@@@OOO.++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XO..++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XO.O++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XOOO++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XOO.++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OO..++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OO.O++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OOOO++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OOO.++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OO..++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OO.O++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OOOO++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XOO.++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XO..++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XO.O++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@XOOO++o+O@@@@@@@@@@",
+"@@@@@@@@@@@@@OOO ++++O@@@@@@@@@@",
+"@@@@@@@@@@@@@OO    X @@@@@@@@@@@",
+"@@@@@@@@@@@@@OXX  X  @@@@@@@@@@@",
+"@@@@@@@@@@@@@@XXXXXX@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@XXXXX@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/images/tiles-66.xpm b/images/tiles-66.xpm
new file mode 100644 (file)
index 0000000..0aca553
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 7 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c red",
+"O c gray75",
+"+ c gray100",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@OOOOOOOOOOOOOOOOOOO@@@@@",
+"@@@@@@  +++++++++++++++++++ @@@@",
+"@@@@@O X+o+++++++++++++++o+ .@@@",
+"@@@@OOX +++++++++++++++++++..@@@",
+"@@@@OO  +++++++++++++++++++ .@@@",
+"@@@@OO   OO..OO..OO..OO..O  .@@@",
+"@@@@OOO XX..XX..XX..XX..XXXX.@@@",
+"@@@@OOXXXXXXXXXXXXXXXXXXXXX.@@@@",
+"@@@@@@XX....XXXXXXXX....XX.@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/images/tiles-67.xpm b/images/tiles-67.xpm
new file mode 100644 (file)
index 0000000..87d917f
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 7 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c red",
+"O c gray75",
+"+ c gray100",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@OOOOO@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@O+  ++O@@@@@@@@@@@@@@@@@@",
+"@@@@@@O+.. +o+O@@@@@@@@@@@@@@@@@",
+"@@@@@@O   +++++O@@@@@@@@@@@@@@@@",
+"@@@@@@OO  O+++++O@@@@@@@@@@@@@@@",
+"@@@@@@XOXOX.+++++O@@@@@@@@@@@@@@",
+"@@@@@@@.OX..O+++++O@@@@@@@@@@@@@",
+"@@@@@@@@.O.OX.+++++O@@@@@@@@@@@@",
+"@@@@@@@@@.OX..O+++++O@@@@@@@@@@@",
+"@@@@@@@@@@.O.OX.+++++O@@@@@@@@@@",
+"@@@@@@@@@@@XOX..O+++++O@@@@@@@@@",
+"@@@@@@@@@@@@XO.OX.+++++O@@@@@@@@",
+"@@@@@@@@@@@@@XOX..O+++++O@@@@@@@",
+"@@@@@@@@@@@@@@XO.OX.+++o+O@@@@@@",
+"@@@@@@@@@@@@@@@.OX..O++++ @@@@@@",
+"@@@@@@@@@@@@@@@@.O.OX.++. @@@@@@",
+"@@@@@@@@@@@@@@@@@.OXO   . @@@@@@",
+"@@@@@@@@@@@@@@@@@@.OXO   .@@@@@@",
+"@@@@@@@@@@@@@@@@@@@XOXXX.@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@....@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/images/tiles-68.xpm b/images/tiles-68.xpm
new file mode 100644 (file)
index 0000000..a3a29a4
--- /dev/null
@@ -0,0 +1,45 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 7 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c red",
+"O c gray75",
+"+ c gray100",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@OO @@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@O+++  @@@@@@@",
+"@@@@@@@@@@@@@@@@@@O+o++  X@@@@@@",
+"@@@@@@@@@@@@@@@@@O+++++  X@@@@@@",
+"@@@@@@@@@@@@@@@@O+++++X XX@@@@@@",
+"@@@@@@@@@@@@@@@O+++++XXXXX@@@@@@",
+"@@@@@@@@@@@@@@O+++++X.XX.@@@@@@@",
+"@@@@@@@@@@@@@O+++++XX.X.@@@@@@@@",
+"@@@@@@@@@@@@O+++++X.XX.@@@@@@@@@",
+"@@@@@@@@@@@O+++++XX.X.@@@@@@@@@@",
+"@@@@@@@@@@O+++++X.XXX@@@@@@@@@@@",
+"@@@@@@@@@O+++++XX.XX@@@@@@@@@@@@",
+"@@@@@@@@O+++++X.XXX@@@@@@@@@@@@@",
+"@@@@@@@ +o+++XX.XX@@@@@@@@@@@@@@",
+"@@@@@@  ++++X.XX.@@@@@@@@@@@@@@@",
+"@@@@@OO X++XX.X.@@@@@@@@@@@@@@@@",
+"@@@@@OOX   XXX.@@@@@@@@@@@@@@@@@",
+"@@@@@OOO  XXX.@@@@@@@@@@@@@@@@@@",
+"@@@@@@OOOOXXX@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@OOOX@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/images/tiles-69.xpm b/images/tiles-69.xpm
new file mode 100644 (file)
index 0000000..71e7cf2
--- /dev/null
@@ -0,0 +1,40 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 2 1",
+"  c black",
+". c None",
+/* pixels */
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................"
+};
diff --git a/images/tiles-7.xpm b/images/tiles-7.xpm
new file mode 100644 (file)
index 0000000..e988b76
--- /dev/null
@@ -0,0 +1,38 @@
+/* XPM */
+static char *tiles__[] = {
+/* columns rows colors chars-per-pixel */
+"69 26 6 1",
+"  c black",
+". c #727272727272",
+"X c blue",
+"o c cyan",
+"O c yellow",
+"+ c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                     ",
+"  .................................................................  ",
+" . ............................................................... + ",
+" .. ............................................................. ++ ",
+" ...                                                             +++ ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO +++ ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO +++ ",
+" ... OOOoXXOOOOoXXXOOOOoXXOOOOOOoXXXOOOoXXXXXXXXOOOOoXXXXOOOOOOO +++ ",
+" ... OOOOoXOOOoXOOoXOOoXOoXOOOOOOoXXOOOoXOoXOOoXXOOoXOOoXOOOOOOO +++ ",
+" ... OOOOoXOOOoXOOoXOoXOOOoXOOOOOOoXXOoXOOoXOOOoXOOoXOOoXOOOOOOO +++ ",
+" ... OOOOoXOOOOOOOoXOoXOOOoXOOOOOOOoXXXOOOoXOOOoXOOoXXOOOOOOOOOO +++ ",
+" ... OOOOoXOOOOOOOoXOoXOOOoXOOOOOOOoXXOOOOoXOOoXXOOOoXXOOOOOOOOO +++ ",
+" ... OOOOoXOOOOOOoXOOoXOOOoXOOOOOOOOoXOOOOoXXXXXOOOOOoXXOOOOOOOO +++ ",
+" ... OOOOoXOOOOOOoXOOoXOOOoXOOOOOOOOoXOOOOoXoXXOOOOOOOoXXOOOOOOO +++ ",
+" ... OOOOoXOOOOOoXOOOoXOOOoXOOOOOOOOoXOOOOoXOoXXOOOoXOOoXOOOOOOO +++ ",
+" ... OOOOoXOOOOoXOOoXOoXOoXOOOOOOOOOoXOOOOoXOOoXXOOoXOOoXOOOOOOO +++ ",
+" ... OOOoXXXOOoXXXXXOOOoXXOOOOOOOOOoXXXOOoXXXOOoXXXoXXXXOOOoXOOO +++ ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO +++ ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO +++ ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO +++ ",
+" ... OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO +++ ",
+" ...                                                             +++ ",
+" .. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++ ",
+" . +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ",
+"  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  ",
+"                                                                     "
+};
diff --git a/images/tiles-70.xpm b/images/tiles-70.xpm
new file mode 100644 (file)
index 0000000..a9394d5
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c #66666666E6E6",
+"+ c red",
+"@ c yellow",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%++++++%%%%%%%%%%%%%",
+"%%%%%%%%%%+++%%%%%%+++%%%%%%%%%%",
+"%%%%%%%%%+%%%%%%%%%%%%+%%%%%%%%%",
+"%%%%%%%%+%%%%%%%%%%%%%%+%%%%%%%%",
+"%%%%%%%+%%%%%%%%%%%%%%%%+%%%%%%%",
+"%%%%%%+%%%%%%%%XX%%%%%%%%+%%%%%%",
+"%%%%%+%%%%%%%%#  X%%%%%%%%+%%%%%",
+"%%%%%+%%%%%%%X .  .%%%%%%%+%%%%%",
+"%%%%+%%%%%%#%# oo .%#%%%%%%+%%%%",
+"%%%%+%%%%%%X%# .  .%X%%%%%%+%%%%",
+"%%%%+%%%%%%X.$$##XX.X%%%%%%+%%%%",
+"%%%%+%%%%%%X%$$..XX%X%%%%%%+%%%%",
+"%%%%+%%%%%%X%$$..XX%X%%%%%%+%%%%",
+"%%%%+%%%%%%X%X$##X.%X%%%%%%+%%%%",
+"%%%%+%%%%%%X.$$##XX.X%%%%%%+%%%%",
+"%%%%%+%%%%%X%$$##XX%X%%%%%+%%%%%",
+"%%%%%+%%%%%%%%$##X%%%%%%%%+%%%%%",
+"%%%%%+%%%%%%%%$##X%%%%%%%%+%%%%%",
+"%%%%%%+%%%%%%%O$#O%%%%%%%+%%%%%%",
+"%%%%%%%+%%%%%%%$#%%%%%%%+%%%%%%%",
+"%%%%%%%%+%%%%%%$#%%%%%%+%%%%%%%%",
+"%%%%%%%%%+%%%%%X#%%%%%+%%%%%%%%%",
+"%%%%%%%%%%+++%%%#%%+++%%%%%%%%%%",
+"%%%%%%%%%%%%%++++++%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%#%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%@%#%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%X%##%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%X%#X#%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%@X#X#%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%X%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%X%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%@%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-71.xpm b/images/tiles-71.xpm
new file mode 100644 (file)
index 0000000..f6a5eea
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c #66666666E6E6",
+"+ c red",
+"@ c yellow",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%++++++%%%%%%%%%%%",
+"%%%%%%%%%%%%+++%%%%%%+++%%%%%%%%",
+"%%%%%%%%%%%+%%%%%%%%%%%%+%%%%%%%",
+"%%%%%%%%%%+%%%%%%%%%%%%%%+%%%%%%",
+"%%%%%%%%%+%%%%%%%%%%%%%%%%+%%%%%",
+"%%%%%%%%+%%%%%%%%%%%%%%%%%%+%%%%",
+"%%%%%%%+%%%%%%%%%%%%%%%%%%%%+%%%",
+"%%%%%%%+%%%%%%%%#%%...%%%%%%+%%%",
+"%%%%%%+%%%%%%%%X%$.   .%%%%%%+%%",
+"%%%%%%+%%%%%%%X.$$ o  .%%%%%%+%%",
+"%%%%%%+%%%%%%X%$$$X o .%%%%%%+%%",
+"%%%%%%+%%%%%X%X$$..X  %%%%%%%+%%",
+"%%%%%%+%%%%X%.$$#..#XX%%%%%%%+%%",
+"%%%%%%+%%%%%%$$####XX%#%%%%%%+%%",
+"%%%%%%+%%%%%O$###XXX.X%%%%%%%+%%",
+"%%%%%%%+%%%%$###XX.%X%%%%%%%+%%%",
+"%%%%%%%+%%%%$##XX.%X%%%%%%%%+%%%",
+"%%%%%%%+%%%$##XO%%X%%%%%%%%%+%%%",
+"%%%%%%%%+%$##%%%%X%%%%%%%%%+%%%%",
+"%%%%%%%%%+##%%%%%%%%%%%%%%+%%%%%",
+"%%%%%%%@%#+%%%%%%%%%%%%%%+%%%%%%",
+"%%%%%%X%##%+%%%%%%%%%%%%+%%%%%%%",
+"%%%%%@%#X#%%+++%%%%%%+++%%%%%%%%",
+"%%%%X%#XX#%%%%%++++++%%%%%%%%%%%",
+"%%%@%%%XX#%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%#%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-72.xpm b/images/tiles-72.xpm
new file mode 100644 (file)
index 0000000..09bb590
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c #66666666E6E6",
+"+ c red",
+"@ c yellow",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%++++++%%%%%%%%%",
+"%%%%%%%%%%%%%%+++%%%%%%+++%%%%%%",
+"%%%%%%%%%%%%%+%%%%%%%%%%%%+%%%%%",
+"%%%%%%%%%%%%+%%%%%%%%%%%%%%+%%%%",
+"%%%%%%%%%%%+%%%%%%%%%%%%%%%%+%%%",
+"%%%%%%%%%%+%%%%%%%%%%%%%%%%%%+%%",
+"%%%%%%%%%+%%%%%%%%%%%%%%%%%%%%+%",
+"%%%%%%%%%+%%%%%%XXXXXXX#%%%%%%+%",
+"%%%%%%%%+%%%%%%%%.%%%.%%%%%%%%%+",
+"@XX@XX@%+%%%%%%%$$X$$$XXX%%%%%%+",
+"%%%X%%%%+%%%%O$$$$$$$$   X%%%%%+",
+"%%%#####+##########..# o  X%%%%+",
+"%%%XX#%%+%%########..# o  X%%%%+",
+"%%%##%%%+%%%%OXXXXXXXX   X%%%%%+",
+"%%%%%%%%+%%%%%%%XX.XXXXXX%%%%%%+",
+"%%%%%%%%%+%%%%%%%.%%%.%%%%%%%%+%",
+"%%%%%%%%%+%%%%%%XXXXXXX#%%%%%%+%",
+"%%%%%%%%%+%%%%%%%%%%%%%%%%%%%%+%",
+"%%%%%%%%%%+%%%%%%%%%%%%%%%%%%+%%",
+"%%%%%%%%%%%+%%%%%%%%%%%%%%%%+%%%",
+"%%%%%%%%%%%%+%%%%%%%%%%%%%%+%%%%",
+"%%%%%%%%%%%%%+%%%%%%%%%%%%+%%%%%",
+"%%%%%%%%%%%%%%+++%%%%%%+++%%%%%%",
+"%%%%%%%%%%%%%%%%%++++++%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-73.xpm b/images/tiles-73.xpm
new file mode 100644 (file)
index 0000000..ec69b50
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c #66666666E6E6",
+"+ c red",
+"@ c yellow",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%@%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%X%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%@%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%#%X%%%%%%+++++++%%%%%%%%%",
+"%%%%%%XX#%@%%+++%%%%%%%++%%%%%%%",
+"%%%%%#XXX#%%+%%%%%%%%%%%%+%%%%%%",
+"%%%%%%#####+%%%%%%%%%%%%%%+%%%%%",
+"%%%%%%%%%%+#$%%%%%%%%%%%%%%+%%%%",
+"%%%%%%%%%+%##$%%%%X%%%%%%%%%+%%%",
+"%%%%%%%%+%%%##$$O%%X%%%%%%%%%+%%",
+"%%%%%%%%+%%%%###$$.%X%%%%%%%%+%%",
+"%%%%%%%%+%%%%X###$$X%X%%%%%%%+%%",
+"%%%%%%%+%%%%%OX###$$$.X%%%%%%%+%",
+"%%%%%%%+%%%%%%XX###$$$%#%%%%%%+%",
+"%%%%%%%+%%%%X%.XX#..$$$%%%%%%%+%",
+"%%%%%%%+%%%%%X%.X#..X .%%%%%%%+%",
+"%%%%%%%+%%%%%%X%XX#X o .%%%%%%+%",
+"%%%%%%%+%%%%%%%X.XX o  .%%%%%%+%",
+"%%%%%%%%+%%%%%%%X%X    .%%%%%+%%",
+"%%%%%%%%+%%%%%%%%#%%...%%%%%%+%%",
+"%%%%%%%%+%%%%%%%%%%%%%%%%%%%%+%%",
+"%%%%%%%%%+%%%%%%%%%%%%%%%%%%+%%%",
+"%%%%%%%%%%+%%%%%%%%%%%%%%%%+%%%%",
+"%%%%%%%%%%%+%%%%%%%%%%%%%%+%%%%%",
+"%%%%%%%%%%%%+%%%%%%%%%%%%+%%%%%%",
+"%%%%%%%%%%%%%+++%%%%%%%++%%%%%%%",
+"%%%%%%%%%%%%%%%%+++++++%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-74.xpm b/images/tiles-74.xpm
new file mode 100644 (file)
index 0000000..a8cc14a
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c #66666666E6E6",
+"+ c red",
+"@ c yellow",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%@%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%X%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%X%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%#X#X@%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%#X#%X%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%##%X%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%#%@%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%#%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%++++++%%%%%%%%%%%",
+"%%%%%%%%%%%%+++%%#%%%+++%%%%%%%%",
+"%%%%%%%%%%%+%%%%%#X%%%%%+%%%%%%%",
+"%%%%%%%%%%+%%%%%%#$%%%%%%+%%%%%%",
+"%%%%%%%%%+%%%%%%%#$%%%%%%%+%%%%%",
+"%%%%%%%%+%%%%%%%O#$O%%%%%%%+%%%%",
+"%%%%%%%+%%%%%%%%X##$%%%%%%%%+%%%",
+"%%%%%%%+%%%%%%%%X##$%%%%%%%%+%%%",
+"%%%%%%%+%%%%%X%XX##$$%X%%%%%+%%%",
+"%%%%%%+%%%%%%X.XX##$$.X%%%%%%+%%",
+"%%%%%%+%%%%%%X%.X##$X%X%%%%%%+%%",
+"%%%%%%+%%%%%%X%XX..$$%X%%%%%%+%%",
+"%%%%%%+%%%%%%X%XX..$$%X%%%%%%+%%",
+"%%%%%%+%%%%%%X.XX##$$.X%%%%%%+%%",
+"%%%%%%+%%%%%%X%.  . #%X%%%%%%+%%",
+"%%%%%%+%%%%%%#%. oo #%#%%%%%%+%%",
+"%%%%%%%+%%%%%%%.  . X%%%%%%%+%%%",
+"%%%%%%%+%%%%%%%%X  #%%%%%%%%+%%%",
+"%%%%%%%%+%%%%%%%%XX%%%%%%%%+%%%%",
+"%%%%%%%%%+%%%%%%%%%%%%%%%%+%%%%%",
+"%%%%%%%%%%+%%%%%%%%%%%%%%+%%%%%%",
+"%%%%%%%%%%%+%%%%%%%%%%%%+%%%%%%%",
+"%%%%%%%%%%%%+++%%%%%%+++%%%%%%%%",
+"%%%%%%%%%%%%%%%++++++%%%%%%%%%%%"
+};
diff --git a/images/tiles-75.xpm b/images/tiles-75.xpm
new file mode 100644 (file)
index 0000000..6cccb7e
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c #66666666E6E6",
+"+ c red",
+"@ c yellow",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%#%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%#XX%%%@%",
+"%%%%%%%%%%%%%++++++%%%%%#XX#%X%%",
+"%%%%%%%%%%+++%%%%%%+++%%#X#%@%%%",
+"%%%%%%%%%+%%%%%%%%%%%%+%##%X%%%%",
+"%%%%%%%%+%%%%%%%%%%%%%%+#%@%%%%%",
+"%%%%%%%+%%%%%%%%%%%%%%##+%%%%%%%",
+"%%%%%%+%%%%%%%%%X%%%%##$%+%%%%%%",
+"%%%%%+%%%%%%%%%X%%OX##$%%%+%%%%%",
+"%%%%%+%%%%%%%%X%.XX##$%%%%+%%%%%",
+"%%%%%+%%%%%%%X%.XX###$%%%%+%%%%%",
+"%%%%+%%%%%%%X.XXX###$O%%%%%+%%%%",
+"%%%%+%%%%%%#%XX####$$%%%%%%+%%%%",
+"%%%%+%%%%%%%XX#..#$$.%X%%%%+%%%%",
+"%%%%+%%%%%%%  X..$$X%X%%%%%+%%%%",
+"%%%%+%%%%%%. o X$$$%X%%%%%%+%%%%",
+"%%%%+%%%%%%.  o $$.X%%%%%%%+%%%%",
+"%%%%+%%%%%%.   .$%X%%%%%%%%+%%%%",
+"%%%%%+%%%%%%...%%#%%%%%%%%+%%%%%",
+"%%%%%+%%%%%%%%%%%%%%%%%%%%+%%%%%",
+"%%%%%%+%%%%%%%%%%%%%%%%%%+%%%%%%",
+"%%%%%%%+%%%%%%%%%%%%%%%%+%%%%%%%",
+"%%%%%%%%+%%%%%%%%%%%%%%+%%%%%%%%",
+"%%%%%%%%%+%%%%%%%%%%%%+%%%%%%%%%",
+"%%%%%%%%%%+++%%%%%%+++%%%%%%%%%%",
+"%%%%%%%%%%%%%++++++%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-76.xpm b/images/tiles-76.xpm
new file mode 100644 (file)
index 0000000..37d6e74
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c #66666666E6E6",
+"+ c red",
+"@ c yellow",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%++++++%%%%%%%%%%%%%%%%%",
+"%%%%%%+++%%%%%%+++%%%%%%%%%%%%%%",
+"%%%%%+%%%%%%%%%%%%+%%%%%%%%%%%%%",
+"%%%%+%%%%%%%%%%%%%%+%%%%%%%%%%%%",
+"%%%+%%%%%%%%%%%%%%%%+%%%%%%%%%%%",
+"%%+%%%%%%%%%%%%%%%%%%+%%%%%%%%%%",
+"%+%%%%%%%%%%%%%%%%%%%%+%%%%%%%%%",
+"%+%%%%%%#XXXXXXX%%%%%%+%%%%%%%%%",
+"%+%%%%%%%%.%%%.%%%%%%%+%%%%%%%%%",
+"+%%%%%%XXXXXX.XX%%%%%%%+%%%%%%%%",
+"+%%%%%X   XXXXXXXXO%%%%+%%%##%%%",
+"+%%%%X  o #..########%%+%%#XX%%%",
+"+%%%%X  o #..##########+#####%%%",
+"+%%%%%X   $$$$$$$$O%%%%+%%%%X%%%",
+"+%%%%%%XXX$$$X$$%%%%%%%+%@XX@XX@",
+"+%%%%%%%%%.%%%.%%%%%%%%+%%%%%%%%",
+"%+%%%%%%#XXXXXXX%%%%%%+%%%%%%%%%",
+"%+%%%%%%%%%%%%%%%%%%%%+%%%%%%%%%",
+"%%+%%%%%%%%%%%%%%%%%%+%%%%%%%%%%",
+"%%%+%%%%%%%%%%%%%%%%+%%%%%%%%%%%",
+"%%%%+%%%%%%%%%%%%%%+%%%%%%%%%%%%",
+"%%%%%+%%%%%%%%%%%%+%%%%%%%%%%%%%",
+"%%%%%%+++%%%%%%+++%%%%%%%%%%%%%%",
+"%%%%%%%%%++++++%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-77.xpm b/images/tiles-77.xpm
new file mode 100644 (file)
index 0000000..4368b2b
--- /dev/null
@@ -0,0 +1,48 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c #66666666E6E6",
+"+ c red",
+"@ c yellow",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%+++++++%%%%%%%%%%%%",
+"%%%%%%%%%%%++%%%%%%%+++%%%%%%%%%",
+"%%%%%%%%%%+%%%%%%%%%%%%+%%%%%%%%",
+"%%%%%%%%%+%%%%%%%%%%%%%%+%%%%%%%",
+"%%%%%%%%+%%%%%%%%%%%%%%%%+%%%%%%",
+"%%%%%%%+%%%%%%%%%%%%%%%%%%+%%%%%",
+"%%%%%%+%%%%%%%%%%%%%%%%%%%%+%%%%",
+"%%%%%%+%%%%%%...%%#%%%%%%%%+%%%%",
+"%%%%%%+%%%%%.    X%X%%%%%%%+%%%%",
+"%%%%%+%%%%%%.  o XX.X%%%%%%%+%%%",
+"%%%%%+%%%%%%. o X#XX%X%%%%%%+%%%",
+"%%%%%+%%%%%%%. X..#X.%X%%%%%+%%%",
+"%%%%%+%%%%%%%$$$..#XX.%X%%%%+%%%",
+"%%%%%+%%%%%%#%$$$###XX%%%%%%+%%%",
+"%%%%%+%%%%%%%X.$$$###XO%%%%%+%%%",
+"%%%%%%+%%%%%%%X%X$$###X%%%%+%%%%",
+"%%%%%%+%%%%%%%%X%.$$###%%%%+%%%%",
+"%%%%%%+%%%%%%%%%X%%O$$##%%%+%%%%",
+"%%%%%%%+%%%%%%%%%X%%%%$##%+%%%%%",
+"%%%%%%%%+%%%%%%%%%%%%%%$#+%%%%%%",
+"%%%%%%%%%+%%%%%%%%%%%%%%+#####%%",
+"%%%%%%%%%%+%%%%%%%%%%%%+%%#XXX#%",
+"%%%%%%%%%%%++%%%%%%%+++%%@%#XX%%",
+"%%%%%%%%%%%%%+++++++%%%%%%X%#%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%@%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%X%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-78.xpm b/images/tiles-78.xpm
new file mode 100644 (file)
index 0000000..f5ce2dd
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 9 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #66666666E6E6",
+"O c red",
+"+ c yellow",
+"@ c gray75",
+"# c gray100",
+"$ c None",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$.$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$...$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$##@$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@#...$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@. @X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@#@@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@o@@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@ @@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@o@@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@ @@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@o@@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@ @@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@o@@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@ @@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@o@@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@o@@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$.. @@X.$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$.X@#o@@X@X.$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$.X@### @@X@@@X.$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$.X@#####o@@X@@@@@X.$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$########## @@X@########$$$$$$$$$$$$$",
+"$$$$$$$$$$############o@@X@##########$$$$$$$$$$$",
+"$$$$$$$$O############# @@X@###########O$$$$$$$$$",
+"$$$$$$$$####@#####@###o@@X@#@####@#####$$$$$$$$$",
+"$$$$$$$$############## @@X@############$$$$$$$$$",
+"$$$$$$$$#X@@@@X#X@@@X#o@@XX@@@X#X@@@@X#$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$X @@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$Xo@@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$X @@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$Xo@@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$X @@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$Xo@@X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$#@X @@X@$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$OOXo@@XO$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$#@Xo@@X@$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$#@X @@X@$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$#@Xo@@X@$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$o@@$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$.@@$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$@@X@$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@##@@@@$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$@####X@##@@$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$@#####@@####@$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$######X@####@$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$@.XXX.+.XXX.@$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
+};
diff --git a/images/tiles-79.xpm b/images/tiles-79.xpm
new file mode 100644 (file)
index 0000000..e26bcfe
--- /dev/null
@@ -0,0 +1,61 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 7 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c red",
+"O c gray75",
+"+ c gray100",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@++o@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@X++@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@O++@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@O+++@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@XO++.@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@++++X@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@.OO@@@@@@@@X+++.@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@X+O@@@@@@@@OO++O.@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@X+O@@@@@@@@O++++X@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@.+OO OOOOOOXOOOOO.OOOOOO.@@@@@@@@@@@@@@",
+"@@@@@@@@@XOXX++++++++++++++++++++.O.@@@@@@@@@@@@",
+"@@@@@@@@@.OO.O O   O     O  O   O O.@@@@@@@@@@@@",
+"@@@@@@@@@X+O@+XXXXXXXOOOOO.OOOOOOO@@@@@@@@@@@@@@",
+"@@@@@@@@@.+O@ OOO@@@XOOOOX.@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@OO@@@@@@@@@OO++O.@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@O+++X@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@X+++.@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@X+++.@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@OO++@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@O++@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@O++@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@X+o@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/images/tiles-8.xpm b/images/tiles-8.xpm
new file mode 100644 (file)
index 0000000..5367f2e
--- /dev/null
@@ -0,0 +1,38 @@
+/* XPM */
+static char *tiles__[] = {
+/* columns rows colors chars-per-pixel */
+"69 26 6 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c #727272727272",
+"o c #FFFFBBBB0000",
+"O c yellow",
+"+ c #DFDFDFDFDFDF",
+/* pixels */
+"                                                                     ",
+"  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  ",
+" + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ X ",
+" ++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ XX ",
+" +++                                                             XXX ",
+" +++ ........................................................... XXX ",
+" +++ ........................................................... XXX ",
+" +++ ...Ooo....Oooo....Ooo......Oooo...Ooooooooo....Ooooo....... XXX ",
+" +++ ....Oo...Oo..Oo..Oo.Oo......Ooo...Oo.Oo..Ooo..Oo..Oo....... XXX ",
+" +++ ....Oo...Oo..Oo.Oo...Oo......Ooo.Oo..Oo...Oo..Oo..Oo....... XXX ",
+" +++ ....Oo.......Oo.Oo...Oo.......Oooo...Oo...Oo..Ooo.......... XXX ",
+" +++ ....Oo.......Oo.Oo...Oo.......Ooo....Oo..Ooo...Ooo......... XXX ",
+" +++ ....Oo......Oo..Oo...Oo........Oo....Oooooo.....Ooo........ XXX ",
+" +++ ....Oo......Oo..Oo...Oo........Oo....OoOoo.......Ooo....... XXX ",
+" +++ ....Oo.....Oo...Oo...Oo........Oo....Oo.Ooo...Oo..Oo....... XXX ",
+" +++ ....Oo....Oo..Oo.Oo.Oo.........Oo....Oo..Ooo..Oo..Oo....... XXX ",
+" +++ ...Oooo..Oooooo...Ooo.........Oooo..Oooo..OoooOoooo...Oo... XXX ",
+" +++ ........................................................... XXX ",
+" +++ ........................................................... XXX ",
+" +++ ........................................................... XXX ",
+" +++ ........................................................... XXX ",
+" +++                                                             XXX ",
+" ++ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX ",
+" + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X ",
+"  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
+"                                                                     "
+};
diff --git a/images/tiles-80.xpm b/images/tiles-80.xpm
new file mode 100644 (file)
index 0000000..4327d93
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 9 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #66666666E6E6",
+"O c red",
+"+ c yellow",
+"@ c gray75",
+"# c gray100",
+"$ c None",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$...$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X.#..$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X## #.$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X##@.X$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X##@.@X$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X##@@@X$$$$$$",
+"$$$$$$$$$$$$$$$O#$$$$$$$$$$$$$$$$$X##@@oX$$$$$$$",
+"$$$$$$$$$$$$$$#####@$$$$$$$$$$$$$X##@@ X$$$$$$$$",
+"$$$$$$$$$$$$$#######@X.$$$$$$$$$X##@@oX$$$$$$$$$",
+"$$$$$$$$$$$$$$X#######@X..$$$$$X##@@ X$$$$$$$$$$",
+"$$$$$$$$$$$$$$$@#########@X..$X##@@oX$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$@###########XX##@@ X$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$X##########X##@@oX$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$#########X##@@ X$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$X######X##@@oX$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$@####X##@@ X@.$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@##X##@@oX@@.$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$XX##@@ X@@#X$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$X##@@oX@@##@.$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$X##@@ X@@####.$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$X##@@oX@@#####X$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$#$X##@@ XX@######@.$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$O#X##@@oX$$@#######X$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$##X##@@oX$$$$@######@$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$##X##@@oX$$$$$$X######@$$$$$$$$$$$",
+"$$$$$$$$$$$$$$#X##@@##$$$$$$$$#######$$$$$$$$$$$",
+"$$$$$@@@$$$$$$X##@@#OX$$$$$$$$$X#####$$$$$$$$$$$",
+"$$$$@###@@$$$XX#@@##X$$$$$$$$$$$@#####$$$$$$$$$$",
+"$$$$$@####@@@@#..$#X$$$$$$$$$$$$$@###O$$$$$$$$$$",
+"$$$$$$.#####@@..$$$$$$$$$$$$$$$$$$X##$$$$$$$$$$$",
+"$$$$$$$.###X#@.$$$$$$$$$$$$$$$$$$$$#$$$$$$$$$$$$",
+"$$$$$$$$.#X##@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$+####@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$.###@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$.###@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$.##@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$@#@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
+};
diff --git a/images/tiles-81.xpm b/images/tiles-81.xpm
new file mode 100644 (file)
index 0000000..a857849
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 9 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #66666666E6E6",
+"O c red",
+"+ c yellow",
+"@ c gray75",
+"# c gray100",
+"$ c None",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$###O$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$X###$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$@####$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$@####$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$@#####$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$@#@###$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$X#####.$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$######X$$$$$$$$$$$$$$$$$$$$$",
+"$@@@$$$$$$$$$$$$$$$$X#####@.$$$$$$$$$$$$$$$$$$$$",
+"$.##@$$$$$$$$$$$$$$$@######X$$$$$$$$$$$$$$$$$$$$",
+"$X##@$$$$$$$$$$$$$$$@#@####@.$$$$$$$$$$$$$$$$$$$",
+"$X###@$$$$$$$$$$$$$$@#######X$$$$$$$$$$$$$$$$$$$",
+"$X###@$$$@@@O@$$$$$$X#######@.$$$$$$$$$$$$$$$$$$",
+"$.####@$$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.$$$$$",
+"$+X@X@X@##################################.@.$$$",
+"$.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .@..$$",
+"$X###@@.oo oo o o o o o o o o oo o o o o#.@@.$$$",
+"$X###@$$$XXXXXXXXXXX@@@@@@@@@.@@@@@@@@@@@@@$$$$$",
+"$X##@$$$$@@@O@$$$$$$X@@@@@@@@.$$$$$$$$$$$$$$$$$$",
+"$.##@$$$$###O#$$$$$$@#######X$$$$$$$$$$$$$$$$$$$",
+"$@@@$$$$$$$$$$$$$$$$@#@####@.$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$@######X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$X#####@.$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$######X$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$X#####.$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$@#####$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$@#@###$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$@####$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$@####$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$X###$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$###O$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
+};
diff --git a/images/tiles-82.xpm b/images/tiles-82.xpm
new file mode 100644 (file)
index 0000000..12a907b
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 9 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #66666666E6E6",
+"O c red",
+"+ c yellow",
+"@ c gray75",
+"# c gray100",
+"$ c None",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$@#@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$.##@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$.###@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$.###@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$+####@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$.#X##@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$.###X#@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$.#####@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$@####@@@@X$$$$$$$$$$$$$$$$$$#$$$$$$$$$$$",
+"$$$$$$$@###@@$..#XX##$$$$$$$$$$$$$$X##$$$$$$$$$$",
+"$$$$$$$$@@@$$$$..##X##$$$$$$$$$$$$@###O$$$$$$$$$",
+"$$$$$$$$$$$$$$$$.###X#O$$$$$$$$$$@#####$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$@###X##$$$$$$$$X#####$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$##@###X$$$$$$$$@######$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$X##@###X$$$$$$X######@$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$XO#@###X$$$$@######@$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$X#o@###X$$@#######X$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$Xo@###XX#######@.$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$Xo@###X#######X$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$X @###X######.$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$Xo@###X####@.$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$XX @###X###X$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$@#@Xo@###X##.$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@###@X @###XX.$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$X#####@Xo@###X$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$@#######@X @###X$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$X##########Xo@###X$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$@###########@X @###X$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$@#########@X..$Xo@###X$$$$$$$$$$",
+"$$$$$$$$$$$$$$$X#######@X..$$$$$X @###X$$$$$$$$$",
+"$$$$$$$$$$$$$$#######@X.$$$$$$$$$Xo@###X$$$$$$$$",
+"$$$$$$$$$$$$$$$#####@$$$$$$$$$$$$$X @###X$$$$$$$",
+"$$$$$$$$$$$$$$$$O#$$$$$$$$$$$$$$$$$Xo@###X$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X @###X$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$Xo@###X$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X@.##.$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X@. @.$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$XX@..$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$...$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
+};
diff --git a/images/tiles-83.xpm b/images/tiles-83.xpm
new file mode 100644 (file)
index 0000000..75ec28a
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 9 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #66666666E6E6",
+"O c red",
+"+ c yellow",
+"@ c gray75",
+"# c gray100",
+"$ c None",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$@.XXX.+.XXX.@$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$######X@####@$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$@#####@@####@$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$@####X@##@@$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@##@@@@$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$@@X@$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$.#@$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$o#@$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$#@Xo#@X@$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$#@X #@X@$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$#@Xo#@X@$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$OOXo#@XO$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$#@X #@X@$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$Xo#@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$X #@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$Xo#@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$X #@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$Xo#@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$X #@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$#X@@@@X#X@@@X#o#@XX@@@X#X@@@@X#$$$$$$$",
+"$$$$$$$$$$############## #@X@############$$$$$$$",
+"$$$$$$$$$$####@#####@###o#@X@#@####@#####$$$$$$$",
+"$$$$$$$$$$O############# #@X@###########O$$$$$$$",
+"$$$$$$$$$$$$############o#@X@##########$$$$$$$$$",
+"$$$$$$$$$$$$$$########## #@X@########$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$.X@#####o#@X@###@X.$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$.X@### #@X@#@X.$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$.X@#o#@X@X.$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$.. #@X.$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@o#@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@o#@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@ #@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@o#@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@ #@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@o#@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@ #@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@o#@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@ #@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@o#@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@##@X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@. @X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@#...$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$##@$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$...$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$.$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
+};
diff --git a/images/tiles-84.xpm b/images/tiles-84.xpm
new file mode 100644 (file)
index 0000000..9f495e8
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 9 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #66666666E6E6",
+"O c red",
+"+ c yellow",
+"@ c gray75",
+"# c gray100",
+"$ c None",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@#@$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@##.$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@###.$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@###.$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@####+$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@##X#.$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@#X###.$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@@#####.$$$$$$$$$",
+"$$$$$$$$$$$#$$$$$$$$$$$$$$$$$$X@@@@####@$$$$$$$$",
+"$$$$$$$$$$##X$$$$$$$$$$$$$$##XX#..$@@###@$$$$$$$",
+"$$$$$$$$$O###@$$$$$$$$$$$$##X##..$$$$@@@$$$$$$$$",
+"$$$$$$$$$#####@$$$$$$$$$$O#X###.$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$#####X$$$$$$$$##X###@$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$#######$$$$$$$$X###@##$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$@######X$$$$$$X###@##X$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$@######@$$$$X###@#OX$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$X#######@$$X###@o#X$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$.@#######XX###@oX$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$X#######X###@oX$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$.######X###@ X$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$.@####X###@oX$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$X###X###@ XX$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$.##X###@oX@@@$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$.XX###@ X@@@#@$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$X###@oX@@@###X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$X###@ X@@@######$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$X###@oX@@@#######X$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$X###@ X@@@#########@$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$X###@oX$..X@#########@$$$$$$$$$$$$$$$$",
+"$$$$$$$$$X###@ X$$$$$..X@#######X$$$$$$$$$$$$$$$",
+"$$$$$$$$X###@oX$$$$$$$$$.X@#######$$$$$$$$$$$$$$",
+"$$$$$$$X###@ X$$$$$$$$$$$$$@#####$$$$$$$$$$$$$$$",
+"$$$$$$X###@oX$$$$$$$$$$$$$$$$$#O$$$$$$$$$$$$$$$$",
+"$$$$$X###@ X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$X###@oX$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$.##.@X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$.# .@X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$..#XX$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$...$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
+};
diff --git a/images/tiles-85.xpm b/images/tiles-85.xpm
new file mode 100644 (file)
index 0000000..6d13a01
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 9 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #66666666E6E6",
+"O c red",
+"+ c yellow",
+"@ c gray75",
+"# c gray100",
+"$ c None",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$O###$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$###X$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$####@$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$####@$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@####@$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$###@#@$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$.#####X$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$X######$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$.@#####X$$$$$$$$$$$$$$$$@@@",
+"$$$$$$$$$$$$$$$$$$$$$X######@$$$$$$$$$$$$$$$@##.",
+"$$$$$$$$$$$$$$$$$$$$.@####@#@$$$$$$$$$$$$$$$@##X",
+"$$$$$$$$$$$$$$$$$$$$X#######@$$$$$$$$$$$$$$@###X",
+"$$$$$$$$$$$$$$$$$$$.@#######X$$$$$$@O@@@$$$@###X",
+"$$$$$$.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$$@####.",
+"$$$$.@.##################################@X@X@X+",
+"$$$..#. #################################@@@@@@.",
+"$$$$.##.#o o o o oo o o o o o o o o oo oo.@@###X",
+"$$$$$$@@@@@@@@@@@@@.@@@@@@@@@XXXXXXXXXXX$$$@###X",
+"$$$$$$$$$$$$$$$$$$$.@@@@@@@@X$$$$$$@O@@@$$$$###X",
+"$$$$$$$$$$$$$$$$$$$$X#######@$$$$$$#O###$$$$@##.",
+"$$$$$$$$$$$$$$$$$$$$.@####@#@$$$$$$$$$$$$$$$$@#@",
+"$$$$$$$$$$$$$$$$$$$$$X######@$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$.@#####X$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$X######$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$.#####X$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$#####@$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@##@#@$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$####@$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$####@$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$###X$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$O###$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
+};
diff --git a/images/tiles-86.xpm b/images/tiles-86.xpm
new file mode 100644 (file)
index 0000000..781102c
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 9 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #66666666E6E6",
+"O c red",
+"+ c yellow",
+"@ c gray75",
+"# c gray100",
+"$ c None",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$...$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$..#.X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$.# ##X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$X.###X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$X@.###X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$X@@###X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$Xo@###X$$$$$$$$$$$$$$$$$#O$$$$$$$$$$$$$$",
+"$$$$$$$$$X @###X$$$$$$$$$$$$$@#####$$$$$$$$$$$$$",
+"$$$$$$$$$$Xo@###X$$$$$$$$$.X@#######$$$$$$$$$$$$",
+"$$$$$$$$$$$X @###X$$$$$..X@#######X$$$$$$$$$$$$$",
+"$$$$$$$$$$$$Xo@###X$..X@#########@$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$X @###XX###########@$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$Xo@###X##########X$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$X @###X#########$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$Xo@###X######X$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$.@X @###X####@$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$.#@Xo@###X##@$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$X##@X @###XX$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$.@###@Xo@###X$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$.#####@X @###X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$X######@Xo@###X$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$.@#######XX @###X$#$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$X#######@$$Xo@###X#O$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$@######@$$$$Xo@###X##$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$@######X$$$$$$Xo@###X##$$$$$$$$$$$$$",
+"$$$$$$$$$$$$#######$$$$$$$$##@###X#$$$$$$$$$$$$$",
+"$$$$$$$$$$$$#####X$$$$$$$$$XO#@###X$$$$$$@@@$$$$",
+"$$$$$$$$$$$#####@$$$$$$$$$$$X##@##XX$$$@@###@$$$",
+"$$$$$$$$$$$O###@$$$$$$$$$$$$$X#$.##@@@@####@$$$$",
+"$$$$$$$$$$$$##X$$$$$$$$$$$$$$$$$$..@@#####.$$$$$",
+"$$$$$$$$$$$$$#$$$$$$$$$$$$$$$$$$$$.@#X###.$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@##X#.$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@####+$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@###.$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@###.$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@##.$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@#@$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
+};
diff --git a/images/tiles-87.xpm b/images/tiles-87.xpm
new file mode 100644 (file)
index 0000000..1eee167
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 9 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #66666666E6E6",
+"O c red",
+"+ c yellow",
+"@ c gray75",
+"# c gray100",
+"$ c None",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$###O$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$X###$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$@####$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$@####$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$@#####$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$@#@###$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$X#####.$$$$$$$$$$$$$$$$$$$$$$",
+"$$@@@$$$$$$$$$$$$$$X#####X$$$$$$$$$$$$$$$$$$$$$$",
+"$$.##@$$$$$$$$$$$$$@######X$$$$$$$$$$$$$$$$$$$$$",
+"$$X##@$$$$$$$$$$$$$@#@####@$$$$$$$$$$$$$$$$$$$$$",
+"$$X###@$$$$$$$$$$$$@#######X$$$$$$$$$$$$$$$$$$$$",
+"$$X###@$ @@@O@$$$$$X#######.$$$$$$$$$$$$$$$$$$$$",
+"$$.####@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.$$$$$$$$",
+"$$+X@X@X###############################.@.$$$$$$",
+"$$.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .@..$$$$$",
+"$$X###@.oo oo o o  o o o o  oo o o o o.@@.$$$$$$",
+"$$X###@$#XXXXXXXXXX@@@@@@@@.@@@@@@@@@@@@$$$$$$$$",
+"$$X##@$$ @@@O@$$$$$X@@@@@@@.$$$$$$$$$$$$$$$$$$$$",
+"$$.##@$$ ###O$$$$$$@#######X$$$$$$$$$$$$$$$$$$$$",
+"$$@@@$$$$$$$$$$$$$$@#@####@$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$@######X$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$X#####@$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$X#####.$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$@#####$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$@#@###$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$@####$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$@####$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$X###$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$###O$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
+};
diff --git a/images/tiles-88.xpm b/images/tiles-88.xpm
new file mode 100644 (file)
index 0000000..9ac0edb
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 9 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #66666666E6E6",
+"O c red",
+"+ c yellow",
+"@ c gray75",
+"# c gray100",
+"$ c None",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$##O$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$X##$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@##$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@###$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@@##$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$X###.$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$####X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$@@@$$$$$$$$$$$$$X###@.$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$.#@$$$$$$$$$$$$$@####X$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$X#@$$$$$$$$$$$$$@@###@.$$$$$$$$$$$$$$$$$$",
+"$$$$$$$X##@$$ @@O@$$$$$X#####X.$$$$$$$$$$$$$$$$$",
+"$$$$$$$.###@$ @@@@@@@@@@@@@@@@@@@@@@@@@@@.$$$$$$",
+"$$$$$$$+XX@X@############################..$$$$$",
+"$$$$$$$.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...$$$$",
+"$$$$$$$X##@@.o oo  o o  o o  o o o o  o#.@.$$$$$",
+"$$$$$$$X##@$$XXXXXXXXXX@@@@@@@.@@@@@@@@@@@$$$$$$",
+"$$$$$$$X#@$$$ @@O@$$$$$X@@@@@@.$$$$$$$$$$$$$$$$$",
+"$$$$$$$.@@$$$ ##O$$$$$$@@###@.$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@####X$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$X###@.$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$####X$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$X###.$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@###$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@@##$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$@##$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$X##$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$##O$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
+};
diff --git a/images/tiles-89.xpm b/images/tiles-89.xpm
new file mode 100644 (file)
index 0000000..01d1f26
--- /dev/null
@@ -0,0 +1,64 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c red",
+"+ c #FFFF7F7F0000",
+"@ c #CCCC7F7F6666",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%% @@ %%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%% .@@.%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%O @.@@ %%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%  @@@@ %%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%O .@@@@.%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%  @.@@.@ %%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  @@@@@@ %%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  @@@@@@ %o%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  @@@@@@ %%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  #######%o%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%o%O  .#######%%o%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O X .XXXXXX%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%o%O   .X$XX$X%%o%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%o%%%O   .XX XXX%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O X .X   XX%%%o%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O   .     X%%%%%o%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%o%%%O   .    + %%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O X ..  +   %%o%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%o%%%%O   .X  + . %%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%o%%%O   .XX + . %%%%o%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O X .XXX    %%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%o%%%%%O   .XX X  %%%%%%o%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O   .X   XX%%%%%%%%%o%%%%%%%",
+"%%%%%%%%%%%%%o%o%%%%O X .     X%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O   .    + %%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O   ..  +   %%%%%o%%%%%%%%%%",
+"%%%%%%%%%%%%%o%%%%%%O X .X  + . %%%%%%%%o%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O   .XX + . %%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O   .XXX    %%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%o%%%%O   .XXXX  %%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  ..XXXXXX%%%%%%%%%%o%%%%%%",
+"%%%%%%%%%%o%%%%%%%%%O  .#######%%%%%%%o%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  ####### %%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%o%%%%%%%%O  @@@@@@@ %%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  @@@@@@@ %%%%%%%%%o%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%  @@@@@@@ %%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%O .@@@@@.%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%o%o%%%%%%%%%%%  @@@@@ %%%%%%%%%%%%o%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%     %%%%%%%%%%o%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%oo%%%%%%%%%%%%o%%%o%%%%o%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%o%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-9.xpm b/images/tiles-9.xpm
new file mode 100644 (file)
index 0000000..5619937
--- /dev/null
@@ -0,0 +1,53 @@
+/* XPM */
+static char *tiles__[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 15 1",
+"  c black",
+". c #00003F3F0000",
+"X c #3F3F3F3F0000",
+"o c #3F3F3F3F3F3F",
+"O c #000000007F7F",
+"+ c #7F7F3D3D0000",
+"@ c gray50",
+"# c #3C3C0000BFBF",
+"$ c blue",
+"% c #3C3C0000FFFF",
+"& c #0000BFBF0000",
+"* c #FFFF3C3C0000",
+"= c yellow",
+"- c gray75",
+"; c gray100",
+/* pixels */
+"                                ",
+"  OOOOOOOOOOOOOOOOOOOOOOOOOOOO  ",
+" O OOOOOOOOOOOOOOOOOOOOOOOOOO $ ",
+" OO OOOOOOOOOOOOOOOOOOOOOOOO $$ ",
+" OOO                        $$$ ",
+" OOO ###################### $$$ ",
+" OOO ###################### $$$ ",
+" OOO #%#%#%#%#%#%#%#%#%#%#% $$$ ",
+" OOO %#%#%#+++++#%#%#%#%#%# $$$ ",
+" OOO #%%%#%+XXXX%#%%%#%%%#% $$$ ",
+" OOO %%%%%%+oXoX%%%%%%%%%%% $$$ ",
+" OOO %%%%%%+XXXX%%%%%%%%%%% $$$ ",
+" OOO %%%%%%+oX@@@@@@@%%%%%% $$$ ",
+" OOO %%%%%%+XX;-------%%%%% $$$ ",
+" OOO %%=@@@@oX;-o-o-o-%%%%% $$$ ",
+" OOO %%=*****X;-------%%%%% $$$ ",
+" OOO %%=*****X;-o-o-o-%%%%% $$$ ",
+" OOO %%=*@*@*X;-------%%%%% $$$ ",
+" OOO ..=*****X;-o-o-o-..... $$$ ",
+" OOO ..=*****X;-------..... $$$ ",
+" OOO ..=*@*@*X;-o-o-o-..... $$$ ",
+" OOO ..=*****X;-------..... $$$ ",
+" OOO ..=*****.;-o-o-o-...&. $$$ ",
+" OOO .&=*@*@*.;-------&.&.& $$$ ",
+" OOO &.&*****&;-o-o-o-.&.&. $$$ ",
+" OOO &&&&&&&&&&-------&&&&& $$$ ",
+" OOO &&&&&&&&&&&&&&&&&&&&&& $$$ ",
+" OOO                        $$$ ",
+" OO $$$$$$$$$$$$$$$$$$$$$$$$ $$ ",
+" O $$$$$$$$$$$$$$$$$$$$$$$$$$ $ ",
+"  $$$$$$$$$$$$$$$$$$$$$$$$$$$$  ",
+"                                "
+};
diff --git a/images/tiles-90.xpm b/images/tiles-90.xpm
new file mode 100644 (file)
index 0000000..b674e06
--- /dev/null
@@ -0,0 +1,64 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c red",
+"+ c #FFFF7F7F0000",
+"@ c #CCCC7F7F6666",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .@@ %%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .@@@@ %%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o% .@@@.@@ %%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%% @@.@@@@. %%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%% @@@@@@@@  %%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##@@@@@.@.  %%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%o%o%%X#X#@@@@@@  O%%%%%",
+"%%%%%%%%%%%%%%%%%%%o%%%%%%%%%XXX#X#@@@@   %%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%o%%%%%%XX$XX#X#@@   O%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%    XXXXX##@    %%%%%%%",
+"%%%%%%%%%%%%%%%o%%o%%%%%  . + XX$X..    O%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%% .  +  XX.. X  Oo%%%%%%%",
+"%%%%%%%%%%o%%o%%%%%%%%%%   +  .X..    O%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%X. +  .X.. X  O%%o%%%%%%%",
+"%%%%%%o%%%%%%%%%%%%%%%XXX.  .X..    O%o%%%%%%%%%",
+"%%%%%%%%%o%%%%%%%%%    XXX..X.. X  O%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%  . + XXXX..    O%%%%%%%%%%%%%",
+"%%%%o%%%%%%%%%%%%% .  +  XX.. X  O%%%o%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%   +  .X..    O%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%X. +  .X.. X  O%%%%%o%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%#XX.  .X..    O%%%%o%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%% X#XX..X.. X  O%%%o%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%% X#X#XXX..    O%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%% @@#X#X.. X  O%%%%%%o%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%..@@@#XX     O%%%%o%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%% @@@@@#X    O%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%% @@@@@@    O%%%%%%%%o%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%% .@@@@@   O%%%%%%o%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%o% .@@@.  O%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%     O%%%%%%%o%o%%%%%%%%%%%%%%%%%",
+"%%%%%%%%o%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%o%o%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%o%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%o%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-91.xpm b/images/tiles-91.xpm
new file mode 100644 (file)
index 0000000..251d042
--- /dev/null
@@ -0,0 +1,64 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c red",
+"+ c #FFFF7F7F0000",
+"@ c #CCCC7F7F6666",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%o%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%o%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%o%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%o%%o%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%o%o%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%o%%o%%%%%%%%%%%%%",
+"%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%",
+"%%%%%%o%%%%%%%%%%    %%%%    %%%%%%%%o%%%%%%%%%%",
+"%%%%%%o%%%   ##X. .. .XX. .. .XXXXX%%%%%%%%%%%%%",
+"%%%%%%%% .@@@##X     +.X     +.XX$X#     %%%%%%%",
+"%%%o%%% @@@@@##XX +++  .X +++  .XXX##@@@@.  %%%%",
+"%%%%%o% @@@@@##XXX      .X      .XX##@@@.@@@. %%",
+"%%%%%%% @@@@@##XXXX    .XXX    .XXX##@@@@@@.@@ %",
+"%%%%%%% @@@@@##XXXXX...XXXXX...XX$X##@@@@@@@@@ %",
+"%%%%%%% @@@@@##XXXXXXXXXXXXXXXXXXXX##@@@.@@@. %%",
+"%%%%%%%% .@@@#                     ##@@@@.   %%%",
+"%%%%%%%%        X  X  X  X  X  X            %%%%",
+"%%%%%%%%%                                 %%%%%%",
+"%%%%%%o%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%",
+"%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%o%o%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%o%%%%%%%%%%%%%%%%",
+"%%%%%%o%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%o%%%o%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%o%%o%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-92.xpm b/images/tiles-92.xpm
new file mode 100644 (file)
index 0000000..0e4f30b
--- /dev/null
@@ -0,0 +1,64 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c red",
+"+ c #FFFF7F7F0000",
+"@ c #CCCC7F7F6666",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%o%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%o%%%%%%%%%%%%%%%o%%o%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%    %%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%o%%%%%%%% @@@.  %%%%%%%o%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%o%%%% @@@@@@##%%%%%%%%%o%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%o% @@@@@@#X#X%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%% .@@@@#X#XXX%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%  @@@#X#XXX   %%%%o%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%  @@#X#XXX  .  %%%%%%o%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%   XXXXXXX   . %%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%   ...XXX+    %%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%O   . .XX +  OX%%%%%%%o%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%O     .X. ++ X   %%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%O  X  .X.     .  %%%%%%%%%%%%%%",
+"%%%%o%%%%%%%%%%%%%O     .X.     . %%%%o%%%%%%%%%",
+"%%%%%%%%o%%%%%%%%%%O  X  .XXX+    %%%%%%%%%%%%%%",
+"%%%%%o%%%%%%%%%%%%%%O     .XX +  OX%%%%o%%%%%%%%",
+"%%%%%%%%%%o%%%%%%%%%%O  X  .X. ++ XX%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%o%%%%%%%O     .X.   XXX%%%%o%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%O  X  .X.  XX$X%%%%%%%%%%",
+"%%%%%%%%%%%%o%%%%%%%%%%%O     .XXXXXXX#%o%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%O  X  .XX$XX##%%%%%%%%%",
+"%%%%%%%%%%%%%%%o%%o%%%%%%%O     .XXX#X# %%o%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%O  X  .X#X#@@ %%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%o%%%%%%O     #X#@@@@ %%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O  X ##@@@@@.%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%O   #@@@@@.@ %%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%O   @@@@@@@ %%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%O   @@.@@@.%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O   @@@@.@ %%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%o%%O   .@@@@ %%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%O   .@@ %%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O    %%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-93.xpm b/images/tiles-93.xpm
new file mode 100644 (file)
index 0000000..c2941f0
--- /dev/null
@@ -0,0 +1,64 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c red",
+"+ c #FFFF7F7F0000",
+"@ c #CCCC7F7F6666",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%o%%%%%%%o%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%o%%%%%%o%%%%%%%%%%%%%%%o%%",
+"%%%%%%o%%%%%%%%%%%%%%%%%     %%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%  @@@@@ %%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%o%%%%%%%%%%O .@@@@@.%%%%%%%%%%%%%o%%%%",
+"%%%%%%o%%%%%%%%%%%%%%  @@@@@@@ %%%%%%%%o%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  @@@@@@@ %%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  @@@@@@@ %%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  ####### %%%%%%%%%%o%%%%%%",
+"%%%%%%%%o%%o%%%%%%%%O  .#######%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  ..XXXXXX%%%%%%%o%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O   .XXXX  %%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O   .XXX    %%%%%%%%%%%%%%%%",
+"%%%%%%%%%%o%%o%%%%%%O   .XX + . %%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O X .X  + . %%%o%%o%%%%%%%%%",
+"%%%%%%%%%%%%o%o%%%%%O   ..  +   %%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O   .    + %%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O X .     X%%%%%%o%%%%%%%%%%",
+"%%%%%%%%%%%%%%o%%%%%O   .X   XX%%%o%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O   .XX X  %%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%o%%%%%%O X .XXX    %%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O   .XX + . %%%o%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%o%%%O   .X  + . %%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O X ..  +   %%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%o%O   .    + %%%%o%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%o%%%%O   .     X%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O X .X   XX%%o%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%o%%O   .XX XXX%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O   .X$XX$X%%%o%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%o%O X .XXXXXX%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  .#######%%o%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  #######%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%oO  @@@@@@ %%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  @@@@@@ %%o%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  @@@@@@ %%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%o  @.@@.@ %%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%O .@@@@.%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%  @@@@ %%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%O @@.@ %%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%% .@@.%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%% @@ %%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-94.xpm b/images/tiles-94.xpm
new file mode 100644 (file)
index 0000000..39c2928
--- /dev/null
@@ -0,0 +1,64 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c red",
+"+ c #FFFF7F7F0000",
+"@ c #CCCC7F7F6666",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%o%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%o%%%%o%%%%%%%%%%%o%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%",
+"%%%%%%%%%%%%%%%%%%%o%%%%%%%%%    %%%%%%o%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%. @@@@ %%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%o%%%%%%%%##@@@@@@ %o%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%X#X#@@@@@@ %%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%o%%%%%XXX#X#@@@@@ %%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%o%%%%%%   XXX#X#@@@  %%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%  .  XXX#X#@   %%%%%%%o%%%o",
+"%%%%%%%%%%%%%%%%%%%%% .  +XXXX##   O%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%o%%%%%   + XXX...   %%%%%%%%%%%%%",
+"%%%%%%%%%%%%o%%%%%%%X ++  XX.     O%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%   X    .X.     O%%%%%%%%%%o%%%",
+"%%%%%%%%%%%%%o%%  .     .X.  X  O%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%% .  +  .X.     O%%%%%%%%o%%%%%%%",
+"%%%%%%%%%%%o%%%%   + XXX.  X  O%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%X ++  XX.     O%%%%%%%o%%%%%%%%%%",
+"%%%%%%%%%%%o%%XX    .X.  X  O%%%%%%%%%%o%%%%%%%%",
+"%%%%%%%%%%%%%XXX   .X.     O%%%%%o%%%%%%%%%%%%%%",
+"%%%%%%%%%%o%XX$X  .X.  X  O%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%#XXXXXX.     O%%%%%o%%%o%%%%%%%%%%%%",
+"%%%%%%%%%o% X#XX$X.  X  O%%o%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%% @#X#XX.     O%%%%%%o%%%%%%%%%%%%%%%%%",
+"%%%%%%%%% @@@#X#.  X  O%%%%%o%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%% @@@@@##.    O%o%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%.@@@@@@#.X  O%%%%o%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%% @.@@@@@@.  O%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%% @@@@@@@   O%%%o%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%.@@@.@@   O%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%% @.@@@@   O%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%% @@@@.   O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%% @@.   O%o%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%    O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-95.xpm b/images/tiles-95.xpm
new file mode 100644 (file)
index 0000000..6d264c3
--- /dev/null
@@ -0,0 +1,64 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c red",
+"+ c #FFFF7F7F0000",
+"@ c #CCCC7F7F6666",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%o%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%o%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%o%%o%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%o%o%%%o%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%o%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%o%%%%%%%%    %%%%    %%%%%%%%%%%%%%o",
+"%%%%%%%%%%%%%%%XXXXX  ..  XX  ..  X#    %%%%%o%%",
+"%%%%%%%%%    .#X$XX +     X +     X##@@@. %o%%%%",
+"%%%%%%  .@@@@##XXX   +++ X   +++ XX##@@@@@ %%%%%",
+"%%%% .@@@.@@@##XX       X       XXX##@@@@@ %%%%%",
+"%%% @@.@@@@@@##XXX     XXX     XXXX##@@@@@ %%%%%",
+"%%% @@@@@@@@@##X$XX  .XXXXX  .XXXXX##@@@@@ %%%%%",
+"%%%% .@@@.@@@##XXXXXXXXXXXXXXXXXXXX##@@@@@ %%%%%",
+"%%%%%   .@@@@#.                    ##@@@. %%%%%%",
+"%%%%%%O        X  X  X  X  X  X           %o%%%%",
+"%%%%%%%%O                               O%%%%%o%",
+"%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%",
+"%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%o%%%%%o%%o%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%o%%%%%o%%%o%%%%%%%%o%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%o%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%o%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%o%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-96.xpm b/images/tiles-96.xpm
new file mode 100644 (file)
index 0000000..7b22b06
--- /dev/null
@@ -0,0 +1,64 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 10 1",
+"  c black",
+". c #3F3F3F3F3F3F",
+"X c gray50",
+"o c #00000000E6E6",
+"O c red",
+"+ c #FFFF7F7F0000",
+"@ c #CCCC7F7F6666",
+"# c gray75",
+"$ c gray100",
+"% c None",
+/* pixels */
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%% @@  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%% @@@@  %%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%% @@.@@@  %%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%% .@@@@.@@ %%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%  @@@@@@@@ %%%%o%%o%%%o%%%%%%%%%%%%%%%%%%",
+"%%%%%%%  .@.@@@@###%%%%%%%%%%%%%%%o%%%%%%%%%%%%%",
+"%%%%%%%O  @@@@@#X#XX%%%%%%%o%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%   @@@#X#XX$X%%%%%%%%%o%o%%o%%o%%%%%%%%%",
+"%%%%%%%%O   @#X#XXXXXX%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%    ##XX$XXX.   %%%%%%%%%%o%%%%%%%%o%%%",
+"%%%%%%%%oO     .XXXX + .  %%%%%%%%%%%%%%%%o%%%%%",
+"%%%%%%%%%%O  X  .XX  +  . %%%%%%%%%%%%o%%%%%%%%%",
+"%%%%%%%%o%%O     .X.  +   %%%%%%%%%%%%%%%o%%%%%%",
+"%%%%%%%%%%%%O  X  .X.  + XX%%%%%%%%%%%%%%%%%o%%%",
+"%%%%%%%%%o%%%O     .X. .XXXX%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%O  X  .X.XXXX    %%%%%%%%%%%%%%%%%",
+"%%%%%%%%%o%%%%%O     .XXXX + .  %%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%o%%%%O  X  .XX  +  . %%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%O     .X.  +   %%%%%%%%%%%%%%%%",
+"%%%%%%%%%%o%%%%%%%O  X  .X.  + XX%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%o%%%%%%O     .X.  XXX#%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%O  X  .X.XXX#X %%%%%%%%%%%%%",
+"%%%%%%%%%%%o%o%%%%%%%O     .XXX#X#@ %%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%O  X  .X#X#@@ %%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%O     .X#@@@..%%%%%%%%%%%",
+"%%%%%%%%%%%%o%o%%%%%%%%%O    .#@@@@@ %%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%O    @@@@@@ %%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%O   @@@@@@ %%%%%%%%%%%",
+"%%%%%%%%%%%%%o%%o%%%%%%%%%%O  .@@@@ %%o%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O     %%%%%o%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%o%o%%%%%%%%%%%%%%%%%%%%%%%%o%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%o%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
+};
diff --git a/images/tiles-97.xpm b/images/tiles-97.xpm
new file mode 100644 (file)
index 0000000..d44bad4
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++XXXX.+++++",
+"+++++++++++++++++++++++++++++OXX++++XoXXXXX.++++",
+"++++++++++++++++++++++++++++OXXXX++XooXXXo.X++++",
+"++++++++++++++++++++++++++++XXXX++XOXXXXooX.++++",
+"+++++++++++++++++++++++++++XXXXX+XOXXXX..X.X++++",
+"+++++++++++++++++++++++++++XXXX XXXXXX..X.X+++++",
+"++++++++++++++++++++++++++XXXXXXOXXXXXXX.X++++++",
+"+++++++++++++++++++++++++XOXXXXOXXXXXXX..+++++++",
+"+++++++++++++++++++++++++XXOXXOXXXXXXX..++++++++",
+"+++++++++++++++++++++++++XXXXXXXXXXXX..+++++++++",
+"+++++++++++++++++++++++++XXXXOXXXXXX.X.+++++++++",
+"++++++++++++++++++++++++++++XXXXXXXXX.X+++++++++",
+"+++++++++++++++++++++++++++XXXXXXXXX.X.+++++++++",
+"+++++++++++++++++++++OX+++XXXXXXXXX.X.X.++++++++",
+"++++++++++++++++++++OXXX+XXXXXXXXX.X.X.X++++++++",
+"+++++++++++++++++++XXXOXXOXXXXXXXXX.X.X.++++++++",
+"++++++++++++++++++XXXOXXOXXXXXXXXX.X.X.X++++++++",
+"++++++++++++++++++XXOXXXXXXXXXXXX.X...X.++++++++",
+"+++++++++++++++++XXXXXXXXXXXXXXX.X.....X.X++++++",
+"+++++++++++++++++XXXXXOXXXXXXXX.X..++...X.++++++",
+"+++++++++++++++++XXXXXXXXXXXXXXX..+++....+++++++",
+"++++++++++++++++++XXXOXXXXXXXXX...+++...++++++++",
+"+++++++++++++++++++XXXXXXXXXXXX.X.+++..+++++++++",
+"+++++++++++++++++++XXXXXXXXXXX.X..++++++++++++++",
+"+++++X+++++++++++++XOXXXXX.XX.X.X+++++++++++++++",
+"+++++X+++++++++++++XXXXXXXXX.X.X.+++++++++++++++",
+"+++++XX+++++++++++XXXXXXXXX.X.X..+++++++++++++++",
+"+++++XXX+++++++++XXXXXXXX....X.X.+++++++++++++++",
+"+++++XXX+++++++++XOXXXXX..+...X.++++++++++++++++",
+"++++++XXX+++++++XOXXXXX..++..X..++++++++++++++++",
+"++++++XXXX+++++XXXXXXX..+++....+++++++++++++++++",
+"+++++++XXXX+++XOXXXXX..+++.......+++++++++++++++",
+"+++++++.XXXXXXXXXXX...+++........+++++++++++++++",
+"++++++++.XXXXXXXXX...+++++......++++++++++++++++",
+"+++++++++.XXXXXXX...++++++++++++++++++++++++++++",
+"++++++++++..XXX....+++++++++++++++++++++++++++++",
+"+++++++++++.....++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-98.xpm b/images/tiles-98.xpm
new file mode 100644 (file)
index 0000000..2c2fc82
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"+++++++XXXX.++++++++++++++++++++++++++++++++++++",
+"+++++++XXXXX..++++++++++++++++++++++++++++++++++",
+"+++++++XX.X.o..+++++++++++++++++++++++++++++++++",
+"+++++++X.o.X.o..++++++++++++++++++++++++++++++++",
+"+++++++X.o.XXX.X.+++++.X.+++++++++++++++++++++++",
+"++++++++X.XXXXXX..++++X.X.X+++++++++++++++++++++",
+"+++++++++XXXXXXXX....X.X.X..++++++++++++++++++++",
+"++++++++++XXOXXXXXXXX.X.X.X.++++++++++++++++++++",
+"++++++++++.XXXXXXXXX.X.X.X..++++++++++++++++++++",
+"+++++++++++.XXOXXXXXX.......++++++++++++++++++++",
+"++++++++++++.XXOXXXXXX.....+++++++++++++++++++++",
+"+++++++++++++.XXXXXXXXX...++++++++++++++++++++++",
+"++++++++++++XXOXXOXXXXXX...+++++++++++++++++++++",
+"++++++++++OXXOXXXXXXXXXXX.....++++++++++++++++++",
+"+++++++++++XXXXXXXOOXXXXXX..X.X.++++++++++++++++",
+"+++++++++++XXXX..XXXXXXXXXX..X.X.++X..++++++++++",
+"+++++++++++XXX.X..XXOXXXXXX.X.X.X.X.X..+++++++++",
+"++++++++++++X.X.X..XXOXXXXXX...X.X.X.X.+++++++++",
+"++++++++++++.X......XXXXXXXXX.....X.X.X.++++++++",
+"+++++++++++++...++...XXOXXXXXX.......X..++++++++",
+"+++++++++++++++++++XX.XXOXXXXX..........++++++++",
+"+++++++++++++++++++XOXXXXXXXXXXX.++....+++++++++",
+"+++++++++++++++++++XXXXX.XXXXXX.X.++++++++++++++",
+"+++++++++++++++++++OXXXX...XXXXX.X.+++++++++++++",
+"++++++++++++++++++++XX.X....XXXXX.X.++++++++++++",
+"+++++++++++++++++++++XX.X.. .XXXXX.X.+++++++++++",
+"+++++++++++++++++++++++X.X..+.XXXXX.X+++++++++++",
+"+++++++++++++++++++++++.X.X.++.XXXXX.X++++++++++",
+"+++++++++++++++++++++++X.X...++.XXXXX.X+++++++++",
+"+++++++++++++++++++++++.....++++.XXXXX.X++++++++",
+"++++++++++++++++++++++++...++++++.XXXXX.++++++++",
+"++++++++++++++++++++++++++++++++++.XXX.X.+++++++",
+"+++++++++++++++++++++++++++++++++++.XXX.X+++++++",
+"++++++++++++++++++++++++++++++++++++XX.X.+++++++",
+"++++++++++++++++++++++++++++++++++++X.X.X+++++++",
+"+++++++++++++++++++++++++++++++XOX++.X.X.+++++++",
+"++++++++++++++++++++++++++++++++.XXXX.X.++++++++",
+"+++++++++++++++++++++++++++++++++......+++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles-99.xpm b/images/tiles-99.xpm
new file mode 100644 (file)
index 0000000..def38b2
--- /dev/null
@@ -0,0 +1,60 @@
+/* XPM */
+static char *tiles___[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 6 1",
+"  c black",
+". c red",
+"X c #FFFF7F7F0000",
+"o c yellow",
+"O c gray100",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++XXXX++++++++++++++++++++++++++++++++++++++",
+"+++++XXXXX..++++OXO+++++++++++++++++++++++++++++",
+"+++++XXX..o..++XXX.X++++++++++++++++++++++++++++",
+"+++++XXo..XoXX++XXX.++++++++++++++++++++++++++++",
+"+++++.Xo..XXXXX+XX.X.+++++++++++++++++++++++++++",
+"++++++.X.XXXXXXX XX.X+++++++++++++++++++++++++++",
+"+++++++.XXXXXXXX.X.X.X++++++++++++++++++++++++++",
+"++++++++XXOXXXXXX.X.X.X+++++++++++++++++++++++++",
+"++++++++.XXXXXX.X..X.X.+++++++++++++++++++++++++",
+"+++++++++.XOXXXX.X.....+++++++++++++++++++++++++",
+"+++++++++XXXXXXXX.X....+++++++++++++++++++++++++",
+"+++++++++XXXOXXXXX.X++++++++++++++++++++++++++++",
+"+++++++++OXXXXXXXXX.X+++++++++++++++++++++++++++",
+"++++++++XXXXXXOXXXXX.X+++XX+++++++++++++++++++++",
+"++++++++OXXX.XXOXXXXX.X+XXXX++++++++++++++++++++",
+"++++++++XXX..XXXXXXXXX.XXXXXX+++++++++++++++++++",
+"++++++++XX...XXXOXXXXXXXXXXX.X++++++++++++++++++",
+"++++++++X.X...XXXXXXXXXXXXXXX.++++++++++++++++++",
+"++++++XX.X....XXXXOXXXXX.X.X.X.+++++++++++++++++",
+"++++++X.X..++.X.XXXXXXXXX.X.X..+++++++++++++++++",
+"+++++++X.X.+++.X.XXXOXXXX......+++++++++++++++++",
+"++++++++...+++..X.XXXXXXX.....++++++++++++++++++",
+"+++++++++..+++...XXXXXXXXX...+++++++++++++++++++",
+"++++++++++++++..X.XXXXXXXXX..+++++++++++++++++++",
+"+++++++++++++++..X.XXXXXXX.X.+++++++++++++.+++++",
+"+++++++++++++++.X.X.X.XXXXX.X+++++++++++++X+++++",
+"+++++++++++++++..X...X.XXXXX.X+++++++++++OX+++++",
+"+++++++++++++++.X.X...X.XXXXX.X+++++++++.X.+++++",
+"++++++++++++++++.X.X.+.X.XXX.X.+++++++++O..+++++",
+"++++++++++++++++X.X..++.X.XXX.X.+++++++X..++++++",
+"+++++++++++++++++X.X.+++.X.XXX.X.+++++X.X.++++++",
+"+++++++++++++++.X.X...+++.X.XXX.X.+++X.X.+++++++",
+"+++++++++++++++X.X.X...+++.X.XXX.XX.X.X..+++++++",
+"++++++++++++++++......+++++..X.X.X.X.X.X++++++++",
+"++++++++++++++++++++++++++++..X.X.X.X.X+++++++++",
+"+++++++++++++++++++++++++++++....X.X.X++++++++++",
+"++++++++++++++++++++++++++++++++.....+++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++",
+"++++++++++++++++++++++++++++++++++++++++++++++++"
+};
diff --git a/images/tiles.xpm b/images/tiles.xpm
new file mode 100644 (file)
index 0000000..f9db51d
--- /dev/null
@@ -0,0 +1,16337 @@
+/* XPM */
+static char * tiles_xpm[] = {
+"16 15360 14 1",
+"      c #CCCC7F7F6666",
+".     c #3F3F3F3F3F3F",
+"X     c #000000000000",
+"o     c #66666666E6E6",
+"O     c #00000000E6E6",
+"+     c #99997F7F4C4C",
+"@     c #7F7F7F7F7F7F",
+"#     c #0000E6E60000",
+"$     c #00007F7F0000",
+"%     c #FFFFFFFFFFFF",
+"&     c #FFFF00000000",
+"*     c #FFFFFFFF0000",
+"=     c #FFFF7F7F0000",
+"-     c #BFBFBFBFBFBF",
+
+"                ",
+"                ",
+" .              ",
+"                ",
+"          .     ",
+"                ",
+"    .           ",
+"                ",
+"                ",
+"                ",
+"             .  ",
+"                ",
+"     .          ",
+"                ",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"X               ",
+"X               ",
+"X      X        ",
+"X               ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"oooooooooooooooo",
+"oooOooooooOooooo",
+"oooooooooooooooo",
+"oooooooooooooOoo",
+"oooooooooooooooo",
+"oooooooOoooooooo",
+"oooOoooooooooooo",
+"oooooooooooOoooO",
+"oooooooooooooooo",
+"OoooOooooooooooo",
+"oooooooooooooooo",
+"ooooooooooOoooOo",
+"ooooOOoooooooooo",
+"oooooooooooooooo",
+"oooOoooooooOoooo",
+"oooooooooooooooO",
+
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooOoooooooOoo",
+"oOOoooooOooooooo",
+"oooooooooooooooO",
+"oooooooooooooooo",
+"ooooOooooooooOoo",
+"oooooooooooooooo",
+"ooooooOooooooooo",
+"oooooooooooooooo",
+"oooooooooOoooooo",
+"oooooooooooooOoo",
+"oooooooooooooooO",
+"oooooOoooooooooo",
+"ooOooooooooooooo",
+"ooooooooooooOooo",
+
+"oooooooooooooooo",
+"oooOooooooOooooo",
+"oooooooooooooooo",
+"oooooooooooooOoo",
+"oooooooooooooooo",
+"oooooooOoooooooo",
+"oooOoooooooooooo",
+"oooooooooooOoooO",
+"oooooooooooooooo",
+"OoooOooooooooooo",
+"oooooooooooooooo",
+"ooooooooooOoooOo",
+"ooooOOoooooooooo",
+"oooooooooooooooo",
+"oooOoooooooOoooo",
+"oooooooooooooooO",
+
+"O               ",
+"     o++    o+++",
+"o++++++o++++++oo",
+"++@+ooOOo++ooO@o",
+"oOoOoOooOooOoOOo",
+"oOooooooooOooooo",
+"ooooo@oooooooooo",
+"ooooooooooooOooo",
+"oooooooOoooooooo",
+"oooooooooooooooo",
+"ooooOooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooOoooooOoooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+
+"O               ",
+"+o  +++ooo      ",
+"+++++oo+++++++  ",
+"Oo+ooOOo++ooo+++",
+"OoooOooooooOOoo+",
+"oooOoOoOoOooooO+",
+"ooooooooooooooo ",
+"oOooooooooooooOO",
+"ooooooooOoooOooo",
+"ooooOooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"ooOooooooooooooo",
+"oooooooOOoooooOo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+
+"O               ",
+"                ",
+"                ",
+"                ",
+"o++             ",
+"++++o           ",
+"+oo++           ",
+"ooOo++++        ",
+"ooooO  +        ",
+"oooOoo++        ",
+"oooOoO++        ",
+"ooooooo++       ",
+"oooooOOo+++     ",
+"ooOooooO++++    ",
+"oooooooOooo+    ",
+"ooooooooOOo++   ",
+
+"O               ",
+"                ",
+"+               ",
+"+   ++          ",
+"++O+++          ",
+"oOoo++o         ",
+"oooO++o         ",
+"oOooo++         ",
+"oooOOo++        ",
+"oooOoOO+++      ",
+"ooooooooo+      ",
+"ooooooOoO++     ",
+"oOoooooooo++    ",
+"ooooooooOoOo+   ",
+"ooooOoooOOoo+o  ",
+"oooooooooooO++  ",
+
+" oooooo.oOoo+   ",
+"ooooooooooOo+   ",
+"ooooooooOoo++   ",
+"ooOooooooOo+    ",
+"oooooooOooo++ O ",
+"ooooooooo o++   ",
+"ooooooooO+++    ",
+"oooOoo.Oo++     ",
+"ooooooOoOo+++   ",
+"oooooooooOo++   ",
+"ooooooooOo++o   ",
+"ooooooooOo++    ",
+"oooooooooOo++   ",
+"oooooooOooo++   ",
+"oooooooooOO+    ",
+"ooooooooooo+    ",
+
+"ooooooooooOo++  ",
+"oooooooooOoO++  ",
+"oooooooooooo++  ",
+"oooooooooOo++   ",
+"ooOOoooOOoo ++  ",
+"oooooooooOo O+O ",
+"ooooooooooo+++  ",
+"ooooooooOOo+o   ",
+"oooooooooo +++  ",
+"ooooOoooO   o+  ",
+"oooooooooo++++  ",
+"oooooOooOo+     ",
+"oooooooooOo++   ",
+"ooooooooooO ++  ",
+"oooooooooOooo+  ",
+"ooooooooooOOo+  ",
+
+"ooooooooooooo + ",
+"oooooooooO ++++ ",
+"oooooooooO++    ",
+"oOooooOoo++     ",
+"ooooooooo+      ",
+"oooooooOo+      ",
+"oooooOooo+      ",
+"ooOooo oo+  +   ",
+"oo.ooO++++      ",
+"oooOo++  O      ",
+"oooo@o+         ",
+"oOoOoo+         ",
+"oO ++++    O    ",
+"Oo++            ",
+"+++             ",
+"++              ",
+
+"oooooooooooooo++",
+"oooooooooooo+++ ",
+"oooooOoooO ++   ",
+"ooooooooo+++    ",
+"oooOoooOO+  OOO ",
+"oooooooo+       ",
+"ooOooo..+       ",
+"ooooooo++       ",
+"oooo@.++        ",
+"ooooo++         ",
+"ooOo++o   +     ",
+"O++++           ",
+"++.             ",
+"     OO         ",
+"                ",
+"                ",
+
+"oooooooooooooooo",
+"ooooOooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooOoo",
+"oooooooooooooooo",
+"oOoooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oo ooooOoooooooo",
+"ooooooooooooooOo",
+"oooooo@ooooooooo",
+"ooo@oooooooooooo",
+"oo++ o  ++++oooo",
+"+++++oo+o  +++++",
+"   oo++ o       ",
+"                ",
+
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooOoooooooooooo",
+"oooooooooooooooo",
+"ooooooooooooOooo",
+"ooooooOooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"ooooooooooOooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"++++++ooo++++++o",
+"+o   +oo++o++ ++",
+"+     +++     o+",
+"                ",
+"                ",
+
+"+ooooooooooooooo",
+"++oooooooooooooo",
+" ++OoooOooooOooo",
+"  +@oooooooooooo",
+"  ++++oooooooooo",
+"   ++++ooooooooo",
+"    o +ooooOoooo",
+" +   ++oooooooOo",
+"     ++OoOo@oooo",
+"      +oo+++oooo",
+"       +++ ++ooo",
+"            +oo.",
+"    +       ++@o",
+"             ++o",
+"              +o",
+"                ",
+
+"oooooooooooooooo",
+"++oooooooooooooo",
+" ++O.ooOoooooOoo",
+" +++oooooooooooo",
+"  ++oooooooooooo",
+"   ++Oooo@ooOooo",
+"    ++oooooooooo",
+"    ooOoo@oooooo",
+"     .+oooooooOo",
+"      ++ooOooooo",
+"      ++oOo@oooo",
+"       ++++oo@oo",
+"          ++ooOo",
+"           ++ooo",
+"            ++o ",
+"             ++ ",
+
+"  O+oooooooooooo",
+"   +oooooooooooo",
+"   +++OooooOoooo",
+"  OOO+oooooooooo",
+"  O..+oooooooooo",
+"   +++ooOooooooo",
+"   +oOoooooooooo",
+"   +oooooooooooo",
+"   +oOoooooooooo",
+"  o++oooooooOooo",
+"  ++oooooooooooo",
+" O+.oooOooOooooo",
+"  +ooooooooooooo",
+"  ++.Ooooooooooo",
+"   ++oooooooooOo",
+"  o++ooooooooooo",
+
+"   +oooooooooooo",
+"   +oOoooooooooo",
+"   ++ooooooooooo",
+"    ++Oooooooooo",
+"     +ooooooooOo",
+"     +ooooOooooo",
+"     +oooooooooo",
+"    ++oooooooooo",
+"    +ooooooooooo",
+"    +ooOoooooooo",
+"    ++oooooooooo",
+"    ++OoooooOooo",
+"   ++ooooooooooo",
+"   +oo@ooooooooo",
+"  o+oOoooooooooo",
+"  o+oooooooooooo",
+
+"                ",
+"              ++",
+"             ++o",
+"             +oo",
+"             +oo",
+"        oo o++oo",
+"      o++++++ooo",
+"     +++o +ooooo",
+"    o+o@oooOoooo",
+"    o+ oooooOooo",
+"     ++oOooooooo",
+"    +++ooooooooo",
+"  o++ooooooOooOo",
+" o++oooooooooooo",
+"+++oooOooooooooo",
+"oooooooooooooooo",
+
+"                ",
+"               +",
+"               +",
+"              ++",
+"         o+++++o",
+"         + oo@oo",
+"        ++oOoOoo",
+"        +oO@oooo",
+"     o+++ooooooo",
+"     ++ooooooooo",
+"     +ooOooooooo",
+"    ++oooooooooo",
+"o o++ooooooooooo",
+"@+++oooooOooOooo",
+"++o@OOoooooooooo",
+"oooooooooooooooo",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+" # #    #    ## ",
+"  #  # ### #    ",
+"###+####+# #### ",
+"###### #####+###",
+"###+#####$####$$",
+"#####$###$##$###",
+"###$###$#+##$###",
+"###$#####$#$####",
+"##############$$",
+"##$#####$#######",
+
+"                ",
+" # #            ",
+"           #    ",
+"     #  #       ",
+"    #+  ##      ",
+"# # ++ #+ #     ",
+"####+##++ # $   ",
+" #### +$ #  #   ",
+"######## ###    ",
+"##########  #   ",
+"$$###$#$$### #  ",
+"###$##### # +   ",
+"###$####$### #  ",
+"$#############+ ",
+"#########$###++ ",
+"####$###$$##++#+",
+
+"#####$##+++     ",
+"####$#### #+    ",
+"#$$$##$## +     ",
+"##$$##$# +  +   ",
+"$##$$$#++ #     ",
+"$#$###$+$       ",
+"######++ #+    $",
+"$$###$##+# +    ",
+"#$###+###     + ",
+"######$++ #     ",
+"$#$#$#$#+# +    ",
+"$##$#$##+ +     ",
+"$$$$+##+#++  +  ",
+"######$++#+     ",
+"#$####++#       ",
+"##$$##$+ ++     ",
+
+"##########@$$#  ",
+"##$$#$####$#$@# ",
+"$#######$###$#  ",
+"#$###$$$##$++#  ",
+"#####$#$# # ++  ",
+"#$##$##$#### #  ",
+"####$#$###++#+  ",
+"#$######+###++  ",
+"$$$##++#+#++#   ",
+"+###+##+++# ++  ",
+"+++++++#++# ++  ",
+"### # ++##++    ",
+" ++++#++#++     ",
+"#  ++++++  # +  ",
+" # # +   +      ",
+"                ",
+
+"###$#$#$##$##$##",
+"#$#######$######",
+"###$$#$####$#$$#",
+"######$$$+####$#",
+"##$$######$##$$#",
+"#$# #$#$$#$$#$##",
+"##$###+$#$## $$#",
+"###+#### # #### ",
+"++#++#+###+#++++",
+" #+# ++ #++++##+",
+"+ +++ ++++++++++",
+"+++++++ +++++ + ",
+"    + +    +    ",
+" +            + ",
+"    +   +       ",
+"                ",
+
+"  #@#@###$###$##",
+" ###$$#$##$#####",
+" $#+$####$$###$#",
+"$ #+##$$########",
+"  +  #+##$#$##$#",
+"  # $###$$##$#$#",
+"   #+$$#####$#$#",
+"   +### ##$#$#$#",
+"   #+ #+$ $####$",
+"    ++++ $#$$@##",
+"   + #  # ++$## ",
+"      #  + #+$$#",
+"     + # +#++++#",
+"    #   + + #+  ",
+"      +   + #+# ",
+"             +  ",
+
+"        ####$###",
+"     # #$#$###$#",
+"       ##+##$#$#",
+"        ##$$#$##",
+"     #  +#$##$$#",
+"       #$$#$$#$#",
+"      #  +######",
+"      # $$$$###$",
+"       ###$##$#$",
+"    +#  ++$##$#$",
+"      #$#$##$###",
+"        ###$###$",
+"       #+$#$#$##",
+"     +#++$#$$$##",
+"   +   # +##$#$ ",
+"         #####$#",
+
+"             #  ",
+"                ",
+"             #  ",
+"        # # #  #",
+"          +  ##+",
+"          # + # ",
+"       #    ##  ",
+"    # ###$ ##++#",
+"      ##$###$###",
+"     ##$###$#$##",
+"   ##++$########",
+"    ####$##$##$$",
+"    ###$+#######",
+" # # # ###$#$$##",
+"    # #$$##$#$##",
+"  #  ##$########",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+" # #    #    +# ",
+"  #+ # ### #    ",
+"$##+####+# ####$",
+"$#$### ####$$##$",
+"+$# $$#$######$$",
+"##$####$$##+##$#",
+"$########+#$##$#",
+"###$##$###$##$##",
+"#$##$###$####$##",
+"###########$#$##",
+
+"                ",
+" # #            ",
+"#  #       #    ",
+"   # #  #       ",
+"#+++$   ##      ",
+" ##+$  #  #     ",
+"#$#$+$#++ #     ",
+"#####++# # +#   ",
+"##$##$## $## +  ",
+"$$########  #   ",
+"##$##$#$####+#  ",
+"###$##@## #++ + ",
+"$$#$$#$$#$#++#+ ",
+"###$$$######+#++",
+"########$#@###++",
+"#######$###++ # ",
+
+"####$###++ + +  ",
+"#$$####$#+#+    ",
+"#$##$# ##+++    ",
+"#$#$$### +++ +  ",
+"####### $+#++   ",
+"#####$$$$++ + + ",
+"#$#$##   #+++   ",
+"#####$## # +++  ",
+"#$#$# ###++++   ",
+"#$##$$+++ #+   +",
+"$##### #+# +    ",
+"$#$#####++ +    ",
+"#### $#+#+++    ",
+"$###$$#+ #++ +  ",
+"#$#$##++#++ +   ",
+"#######+++ +    ",
+
+"#########$$ #+# ",
+"#$##$$$$$$###+++",
+"###$###$#@$# #++",
+"#$#####$$$## # +",
+"##$#$$##$ #+$  +",
+"##$#########+#++",
+"#@$##@#$## +# + ",
+"#$###### ### ++ ",
+"#$#@#+++ #  #+  ",
+"##$# ##+++#+++ +",
+"@#$ $+ # +#+++  ",
+"@## #+++##+++++ ",
+"#++#+#++#+++ +  ",
+"++##++++++ # +  ",
+"+# #++++++      ",
+"++++++    ++    ",
+
+"######$###$$$###",
+"#$######$$##$###",
+"#$##############",
+"####$#### #####$",
+"$#$$#$#$$##$####",
+"#$$ #$######$$$#",
+"#$####$$##$# ###",
+"##$ #### $$####+",
+"++#++#+###+$++++",
+"+#+#++++#++++## ",
+"+ + +++++++++ ++",
+"+++++ ++++  ++++",
+"+    + ++  + +++",
+" +           +  ",
+"   +   +        ",
+"                ",
+
+"     ####$$#####",
+" # ####$##$$$$$#",
+"  ##@$#@#$$###$#",
+"  # #$#####$##$#",
+"   ++# $$##$$$##",
+"  #+#$####$$##$#",
+"   #++$##$######",
+"    ###+##$$#$#$",
+"   #  #$$+$#####",
+"     #++$#$ ####",
+"     # +#$$+ ## ",
+"    + ##++ # # +",
+"       #+ # #+++",
+"    #     +++#+#",
+"        +   #+# ",
+"              ++",
+
+"        ########",
+"     # ##$#$#$##",
+"       ##+####$#",
+"       +#$$$#$##",
+"     # $ #$$$###",
+"       #  $##$##",
+"$     #+ +#$#$##",
+"      # ###$####",
+"   +   ##$ ###$#",
+"     # +++$####$",
+"      #$# #$#$##",
+"        ######$#",
+"     + $+##+#$$#",
+"      #++$##$#$#",
+"       # $##$###",
+"         #######",
+
+"             #  ",
+"                ",
+"             # #",
+"        # # #   ",
+"             ## ",
+"              # ",
+"       #  + ## +",
+"    # ## #+$#  #",
+"      ##$$$@$###",
+"    +##$####$###",
+"   #$$+####$#$##",
+"    #######$$##$",
+"    ##@#+$###$##",
+" # #$# ######$#$",
+"#  +# ##$##$####",
+" # ++###########",
+
+"###$##$$##$#####",
+"##$###$#$###$###",
+"###$#$$#######$#",
+"#$$####$$$$#$#$$",
+"##$##$$####$####",
+"##$#$$###$##$$##",
+"########$##$##$#",
+"###$###$$$######",
+"$####$$$$#####$#",
+"####$######$##$#",
+"#$$#$$#####$####",
+"$$##$$$#$$#####$",
+"##$##$######$###",
+"##$$####$$#$$###",
+"##$#$$###$######",
+"$###############",
+
+"                ",
+"                ",
+"     X   X      ",
+"  X   X X       ",
+"   X X%X%X X    ",
+"    X%X%X%X     ",
+"   X%X%X%X%X    ",
+"    X%X%X%X X   ",
+"   X%X%X%X      ",
+"    X%X%X%X X   ",
+"     X%X%X%X    ",
+"    X%X X%X X   ",
+"   X X   X      ",
+"                ",
+"                ",
+"                ",
+
+"XXXX$$XXXXXXXXXX",
+"XX%X%X%X%X%X%X%X",
+"X%X%X%X%X%X%X%XX",
+"XX%X%X%%%%%X%X%X",
+"X%X%X%X%X%%%X%XX",
+"XX%X%%%X%X%X%X%X",
+"X%X%X%%%%%X%X%XX",
+"XX%X%%%%%%%X%X%X",
+"X%X%X%%%X%X%X%XX",
+"XX%%%X%%%%%X%X%X",
+"X%X%X%X%X%X%X%XX",
+"XX%X%%%X%X%X%X%X",
+"X%X%X%X%X%X%X%XX",
+"XX%X%X%X%X%X%X%X",
+"X%X%X%X%X%X%X%XX",
+"XXXXXXXXXXXXXXXX",
+
+"############$#$#",
+"######## $######",
+"#####$### #$####",
+"######## $## $#$",
+"### $ ## ###+##$",
+"#####$#    # ###",
+"###$###+  ######",
+"##   #        # ",
+" # ##$+ # #  # #",
+"## ####   ### # ",
+"### $ $###$#$##$",
+"####$###  ###$##",
+"########+#######",
+"####$### ###$$#$",
+"##########$##$#$",
+"################",
+
+"################",
+"$### # ##$######",
+"#$###########$##",
+"#####  ##$######",
+"##$#########$###",
+"###### ########+",
+"#   # ## # #$ # ",
+"  #  # $  ## #  ",
+"#####$ #########",
+"##$### ####$# # ",
+"#$#### ####### #",
+"##$##+# ########",
+"####$ ######$###",
+"###$######$##$##",
+"#$#### #########",
+"############$#$#",
+
+"######### ######",
+"$#$### # # #####",
+"#### ### $ # ###",
+"## ########### $",
+"#######  $ #####",
+"# $####$# ## $##",
+"#######  # ##  #",
+"# # # $#### ####",
+"# ##$## # #### $",
+" ######### # ###",
+"# #$### ## #####",
+"### ### $# #####",
+"##### $   ## ##$",
+"$###### #  ##$ #",
+"$#$#### ###$####",
+"######### ######",
+
+"################",
+"$#$#### ########",
+"####$+#  ###$###",
+" #####$######$##",
+"## #$ #  #######",
+"+########$#$####",
+"# $ ##  ########",
+" #######  # # ##",
+" $ ## ## #######",
+"######+$########",
+"##+#+##  #######",
+"######$#####$###",
+"# ## # # ####+##",
+"#+#$#$#####$####",
+"#######+#+##+###",
+"##+#############",
+
+"   X X   XX     ",
+" XX    X     X  ",
+"  X   XX  XX  XX",
+" X X   X   X   X",
+" X X    X+XX X  ",
+"XX     XX+ +    ",
+"+X  +X+  XX  X  ",
+"+X  X  XX  XXX +",
+"X XX X X+ XX  XX",
+"   X X  X  + X  ",
+"  X   XX   X  XX",
+"   XX XX X XX  X",
+"XX XXXX  + X    ",
+"X       XX X   X",
+"  X  X X        ",
+"    XX  X    X  ",
+
+"  XX X  XX      ",
+"   +    X   X  X",
+"   X X++ X+X  X ",
+"  X+X  ++X+     ",
+" X X  XX ++X  X+",
+"XX X X + X X++  ",
+" X  X+ X       X",
+"X   X   X    +  ",
+"++XX XX  +XX  XX",
+"+ X+X  X X ++  X",
+"+     XX   +  X ",
+"    XX   X X   X",
+" X       X    XX",
+"X   X  X    X   ",
+"  XXXX   XX  X  ",
+"    X       XX  ",
+
+"   X   X    +   ",
+"X X XX     X  X ",
+" XX   XX  X     ",
+" X  XX    XX X X",
+"X  X   X X     X",
+" X  X     + X  X",
+"    +  X XX    +",
+" X   X  +   XX  ",
+" X X XX  +     X",
+"+X X X+  X X X  ",
+"  XX+ X+  X     ",
+"    X  X     X  ",
+" X   X X+  X   X",
+"XX  X  XX   X   ",
+"   X  X  XXX    ",
+"     X   X   X  ",
+
+"  X        X    ",
+"    XX  XX   X  ",
+"  XX   X  XX XX ",
+"XXX  X  X  XXX  ",
+"   X     X + X  ",
+" X  X+ XX  ++X X",
+" XXX X   +XX+ XX",
+"XX X X XXX+X+X X",
+"  +  XX  X+X XX ",
+"XX XX  XX  XXX X",
+" X X  XX XX  X  ",
+"XX  X+++X+++XX X",
+"  X  XXX ++X  XX",
+"    XX  XX  XX  ",
+"  XX  XX  XX@   ",
+"     X X        ",
+
+"++ oooo  ooooo  ",
+"X oo%oooooooooo ",
+".oooooo%o%%%o%oo",
+"ooo%%%oooooooo%%",
+"o%oooooo%ooooooo",
+"ooooooooooo%%ooo",
+"...o%o%%%ooooooo",
+"ooooooooooo%oo%%",
+"oo%oooo%oooooooo",
+".ooooooooo%oo%oo",
+"oo%oo%%%oooooooo",
+"ooooooooo%oo%%%o",
+"..oooooooooooooo",
+"ooooo%oo%%%ooooo",
+"oo%oooooooooo%oo",
+"..oo%oo%ooooooo%",
+
+"  ooooooo ooo X ",
+" oo%ooooooo%oo  ",
+"oooooo%%oooooooo",
+"o%%%ooooooo%%ooo",
+"ooooooooo%ooooo%",
+"oooooo%ooooooo%o",
+"oo%oo%%%ooo%oooo",
+"ooooooooooooo%oo",
+"oo%%oooooooooooo",
+"oooooo%oo%%ooo%o",
+"oooooooooooooooo",
+"o%%oo%ooo%ooo%o%",
+"oooooooooooooooo",
+"oo%ooooo%%oo%%oo",
+"%ooooo%oooooooo%",
+"%oo%%ooooo%ooooo",
+
+" ooooooooooooo  ",
+"oooo%%oooooooooo",
+"%ooooooo%%%oooo ",
+"oo%%ooooooooo%oo",
+"ooooooooo%oooooo",
+"%oooo%%ooooooooo",
+"o%%%ooooooo%%%oo",
+"ooooooo%%oooooo%",
+"ooooooooooo%%ooo",
+"oo%%oooooooooooo",
+"%oooo%oo%%oooooo",
+"oooooooooooo%%oo",
+"ooo%%ooooo%oooo%",
+"oooooooooooooooo",
+"o%oooooo%%oo%ooo",
+" ooo ooooooooo  ",
+
+"  ooo%oooooooo  ",
+"  oooooooo%%oooo",
+" ooooooooooooooo",
+"o%%%ooo%%ooo%%oo",
+"oooooooooooooooo",
+"oooooooooo%%oooo",
+"ooooo%%ooooo%ooo",
+"o%%oooooo%oooooo",
+"ooooo%ooooo%%ooo",
+"oooooooo%ooooooo",
+"ooo%%%oooooooooo",
+"ooooooooooo%%%oo",
+"o%%%oooooooooooo",
+"ooooooooooooooo ",
+"  o%o%o%%%oo    ",
+" oooooooooooooo ",
+
+"                ",
+"                ",
+"    &&&   &&&   ",
+"   X   & X   &  ",
+"   &    &    &  ",
+"+  &   & &   &  ",
+"    & & * & &   ",
+"     & *** &    ",
+"    & & * & &   ",
+"   &   & &   &  ",
+"   &    &    &  ",
+"   &   X &   X  ",
+"    &&&   &&&   ",
+"  +            +",
+"         +      ",
+"                ",
+
+"  XX%X%%XX      ",
+"   X%%%%X   X  X",
+"   X%XXX%XXX%XX%",
+"  XXX%%XXXX%XX%%",
+" X%X%%XX XXX%%XX",
+"XX%X%X X X XXX  ",
+" X%%XX X       X",
+"X%%%X   X    X  ",
+"XXXX%XX  XXX  XX",
+"  XXX  X X X   X",
+"      XX   X  X ",
+"    XX   X X   X",
+" X       X    XX",
+"X   X  X    X   ",
+"  XXXX   XX  X  ",
+"    X       XX  ",
+
+"   X   X        ",
+"X X XX     X  X ",
+"%XX   XX  X     ",
+"%X  XX    XX X X",
+"X  X   X X     X",
+" X  X       X  X",
+"       X XX    X",
+" X   X  X   XX  ",
+" X X XX        X",
+" X X X   X X X  ",
+"  XX  XX  X     ",
+"    X  X     X  ",
+" X   X X   X   X",
+"XX  X  XX   X   ",
+"   X  X  XXX    ",
+"     X   X   X  ",
+
+"  X        X    ",
+"    XX  XX   X  ",
+"  XX   X%%XX XX ",
+"XXX  X  X%%XXX  ",
+"%%%X     X%X%X  ",
+"%X%%XX XX%%X%X X",
+"%XXX X   XXX%%XX",
+"XX X X XXX%XXX%X",
+"     XX%%XXX%XX ",
+"XX XX%%XX%%XXX%X",
+" X X%%XX%XX%%X%%",
+"XX  X%%%X%%XXX%X",
+"  X  XXX%XXX%%XX",
+"    XX%%XX%%XX  ",
+"  XX  XX%%XX XX ",
+"     X%X%X%X    ",
+
+"                ",
+"      *       * ",
+"  *  *  * * *   ",
+"  *&   *       *",
+" **   **  &** * ",
+" **  **  &**  **",
+" **  ** *&****  ",
+" ******=**&*** *",
+"  =====&&* **&*=",
+"===&  =  * =&===",
+" ==&+&=&  =&=== ",
+" &==&&=&=&&+=&=&",
+"&&&&=&&&=+&&&&&&",
+"&&&=&&&&=&&=&=&&",
+"&&=&&  &&=& &  &",
+"  &  &   & &   &",
+
+"                ",
+"         *  *   ",
+"   **    *    * ",
+"  **     *    * ",
+"  **   *** * ** ",
+" *** & *** ****&",
+" * *  ** **=*=& ",
+"*  &&=** *==== &",
+"*=&========&=&&=",
+"=& &===== =&= &=",
+"& &==&=&&&&& &&&",
+"&&== &&&&&& & =&",
+"=& &&&&+&&& & = ",
+" =&&&&&= &=& &+=",
+" &=& == &&  ==  ",
+"        +& &    ",
+
+"                ",
+"                ",
+"   **  ** **   *",
+" ****  ** * *   ",
+"  ** ***  * * * ",
+"***   ** ****  &",
+"**  ***  * *&* *",
+"==*** **===* *&*",
+"=*=  =====&&**==",
+"= &=&===&&= *==&",
+"==== ==&&& &=&=&",
+" &&& &&  = & &  ",
+" &+&=&&=&&&&&& &",
+"& = & &=&&& & + ",
+"& && &    & & &&",
+"    & & &     & ",
+
+"                ",
+"                ",
+"    * *  *      ",
+"*  **   **      ",
+"  ****  ** *  **",
+"****    *&   **&",
+"**& * ******** &",
+"***  == *&* ==&&",
+"&&  = * **====+ ",
+"**=&&&&==== =&&&",
+"=&& + &  & &=&&=",
+"&+&+&=&&&&  && &",
+"=& &&&=&& &&+ = ",
+"=   && &=&=&&+=&",
+"&&& &  && &  &&&",
+" &    &       & ",
+
+"                ",
+" *              ",
+"         *      ",
+"****  *   *   **",
+"* ** **   *  ***",
+"  * ***  ** ** *",
+"&*==********* **",
+" &&=****==** =**",
+"&== **&&==  ==&=",
+"&== &+====+== &=",
+"&=&  &&&= &= & =",
+"&&&&&= =&&== && ",
+"&+==&&& =&&+&+&&",
+"&=&+ &  & &&&&= ",
+" &&&& &  &= & & ",
+"    & & &   &  &",
+
+"                ",
+"  *       *     ",
+" *        *     ",
+"**   *    *   **",
+"*   **   **   **",
+"   **   ***  * *",
+" *==* **==  ****",
+"=== *&====  ==*=",
+"== =&=  =&*=====",
+"= &=&+===*&&= &+",
+"&=&&&=& &&=====&",
+"  &+=&=&&=&& &&=",
+"&&&&& && &&&&+&&",
+"&=& &&&+=&&&=&  ",
+"&&  & &&&&   & &",
+"  &    &  & & & ",
+
+"  *             ",
+"               &",
+" *    **   *    ",
+"**   **    *   &",
+"*  ****   **   *",
+"   * **=  *=  &*",
+"  * &*== **= **&",
+"***  ===***=*&  ",
+"=  &==&* =*&****",
+"&&=&==* = =&*&=&",
+"=&==&&& &=&=&&&+",
+"& =&&+&=&=&&=&  ",
+" && &&=&&&+&+ &=",
+"& =+ &&  &   & &",
+" = & & &   & & &",
+"& && & & =      ",
+
+"         *      ",
+"       *        ",
+" **   **        ",
+"**    **    *&  ",
+"**    *    ***  ",
+"*  =  *== *&*&  ",
+"*=== *=== &**=  ",
+"==  &&==***&==  ",
+"=*&&*==*& **&=**",
+"&& ==&=& &&&==  ",
+"&=&= &=  =&&=& +",
+"&= & ==&=& ==&=&",
+"&&&&+&&&  &+ &  ",
+" & = =&=+ & &= &",
+"    &   &    &  ",
+" & &          & ",
+
+"oooooooooooooooo",
+"ooooXXooooooXXoo",
+"................",
+"................",
+"................",
+"................",
+"................",
+"..%%%%....%%%%..",
+"................",
+"................",
+"................",
+"................",
+"................",
+"@@@@XX@@@@@@XX@@",
+"OOOXXOOOOOOXXOOO",
+"OOXXOOOOOOXXOOOO",
+
+"oo@...........Oo",
+"oo@...........Oo",
+"ooX.....%.....Xo",
+"oXX.....%.....Xo",
+"XX@.....%.....OO",
+"Xo@.....%.....OO",
+"oo@...........Oo",
+"oo@...........Oo",
+"oo@...........Oo",
+"oo@...........Oo",
+"ooX.....%.....Xo",
+"oXX.....%.....Xo",
+"XX@.....%.....OO",
+"Xo@.....%.....OO",
+"oo@...........Oo",
+"oo@...........Oo",
+
+"                ",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"..%%%%....%%%%..",
+"................",
+"................",
+"................",
+"................",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X...........  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X...........  ",
+"  X...........  ",
+"  X...........  ",
+"  X...........  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X...........  ",
+"  X...........  ",
+
+"  X............ ",
+"  X.............",
+"  X.............",
+"   X.....%......",
+"   X......%.....",
+"   X.......%....",
+"    X...........",
+"    X...........",
+"     X..........",
+"      X.........",
+"       X........",
+"        XX......",
+"          XXX...",
+"             XXX",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"              ..",
+"           .....",
+"         .......",
+"        X.......",
+"       X........",
+"      X.........",
+"     X..........",
+"     X.......%..",
+"    X.......%...",
+"    X......%....",
+"    X...........",
+"   X............",
+"   X............",
+"   X............",
+
+"                ",
+"                ",
+"....            ",
+".......         ",
+".........       ",
+"..........      ",
+"...........     ",
+"............    ",
+"............    ",
+".....%.......   ",
+"......%......   ",
+".......%.....   ",
+"..............  ",
+"X.............  ",
+" X............  ",
+"  X...........  ",
+
+" X............  ",
+"X.............  ",
+"..............  ",
+".......%......  ",
+"......%.......  ",
+".....%.......   ",
+".............   ",
+".............   ",
+"............    ",
+"...........X    ",
+"..........X     ",
+"........XX      ",
+".....XXX        ",
+"XXXXX           ",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X.%.%.%.%.%.  ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"...%%%%...%%%%..",
+"................",
+"................",
+"................",
+"................",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X...........  ",
+"  X.....%.......",
+"  X.....%.....%.",
+"  X.....%.......",
+"  X.....%.....%.",
+"  X.............",
+"  X...........%.",
+"  X.............",
+"  X...........%.",
+"  X.....%.......",
+"  X.....%.....%.",
+"  X.....%.......",
+"  X.....%.....XX",
+"  X...........  ",
+"  X...........  ",
+
+"                ",
+"                ",
+"................",
+"................",
+"................",
+"................",
+"................",
+"..%%%%....%%%%..",
+"................",
+"................",
+"................",
+"................",
+"................",
+"XXX.%.%.%.%.%.XX",
+"  X...........  ",
+"  X...........  ",
+
+"  X...........  ",
+"  X...........  ",
+"........%.....  ",
+"..%.....%.....  ",
+"........%.....  ",
+"..%.....%.....  ",
+"..............  ",
+"..%...........  ",
+"..............  ",
+"..%...........  ",
+"........%.....  ",
+"..%.....%.....  ",
+"........%.....  ",
+"XXX.....%.....  ",
+"  X...........  ",
+"  X...........  ",
+
+"  X.-.-.-.-.-.  ",
+"  X.-.-.-.-.-.  ",
+".--...........--",
+"................",
+".--...........--",
+"........#.......",
+".--....&X&....--",
+"........#.......",
+".--...........--",
+"................",
+".--...........--",
+"................",
+".--...........--",
+"XXX-.-.-.-.-.-XX",
+"  X-.-.-.-.-.-  ",
+"  X...........  ",
+
+"      .  .      ",
+"      .  .      ",
+"......@..@......",
+"......@..@......",
+"......@..@......",
+"......@..@......",
+"......@..@......",
+"..%%%%@..@%%%%..",
+"......@..@......",
+"......@..@......",
+"......@..@......",
+"......@..@......",
+"......@..@......",
+"XXXXXX@XX@XXXXXX",
+"      .  .      ",
+"      .  .      ",
+
+"  X...........  ",
+"  X...........  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"..@@@@@@@@@@@@..",
+"  X...........  ",
+"  X...........  ",
+"..@@@@@@@@@@@@..",
+"  X...........  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X...........  ",
+"  X...........  ",
+
+"oooooooooooooooo",
+"oooOooooooOooooo",
+"oooooooooooooooo",
+"oooooooooooooOoo",
+"oooooooooooooooo",
+"oooooooOoooooooo",
+"oooOoooooooooooo",
+"oooooooooooOoooO",
+"oooooooooooooooo",
+"OoooOooooooooooo",
+"oooooooooooooooo",
+"ooooooooooOoooOo",
+"ooooOOoooooooooo",
+"oooooooooooooooo",
+"oooOoooooooOoooo",
+"oooooooooooooooO",
+
+"oooooooooooooooo",
+"ooooXXooooooXXoo",
+"................",
+"...........%@@-X",
+"...........%@@-X",
+"...........XXXXX",
+"................",
+"..%%%%....%%%%..",
+"................",
+"%@@-X...........",
+"%@@-X...........",
+"XXXXX...........",
+"................",
+"@@@@XX@@@@@@XX@@",
+"OOOXXOOOOOOXXOOO",
+"OOXXOOOOOOXXOOOO",
+
+"oo@.%%X.......Oo",
+"oo@.@@X.......Oo",
+"ooX.@@X.%.....Xo",
+"oXX.--X.%.....Xo",
+"XX@.XXX.%.....OO",
+"Xo@.....%.....OO",
+"oo@...........Oo",
+"oo@...........Oo",
+"oo@...........Oo",
+"oo@...........Oo",
+"ooX.....%.....Xo",
+"oXX.....%.%%X.Xo",
+"XX@.....%.@@X.OO",
+"Xo@.....%.@@X.OO",
+"oo@.......--X.Oo",
+"oo@.......XXX.Oo",
+
+"                ",
+"                ",
+"................",
+"...........%@@-X",
+"...........%@@-X",
+"...........XXXXX",
+"................",
+"..%%%%....%%%%..",
+"................",
+"%@@-X...........",
+"%@@-X...........",
+"XXXXX...........",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X.%%X.......  ",
+"  X.@@X.......  ",
+"  X.@@X.%.....  ",
+"  X.--X.%.....  ",
+"  X.XXX.%.....  ",
+"  X.....%.....  ",
+"  X...........  ",
+"  X...........  ",
+"  X...........  ",
+"  X...........  ",
+"  X.....%.....  ",
+"  X.....%.%%X.  ",
+"  X.....%.@@X.  ",
+"  X.....%.@@X.  ",
+"  X.......--X.  ",
+"  X.......XXX.  ",
+
+"  X.X--........ ",
+"  X.X@@.........",
+"  X.X@@.........",
+"   XX%%..%..XXXX",
+"   X......%.X-@@",
+"   X.......%.-@@",
+"    X...........",
+"    X...........",
+"     X..........",
+"      X.........",
+"       X........",
+"        XX......",
+"          XXX...",
+"             XXX",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"              ..",
+"           .....",
+"         ....XXX",
+"        X....%@@",
+"       X.....%@@",
+"      X.........",
+"     X..........",
+"     X.......%..",
+"    X.......%...",
+"    X......%....",
+"    X.......XX..",
+"   X.......--X..",
+"   X.......@@X..",
+"   X.......@@X..",
+
+"                ",
+"                ",
+"....            ",
+".......         ",
+".........       ",
+"..........      ",
+"...........     ",
+"............    ",
+"............    ",
+"%@@-.%.......   ",
+"%@@-X.%......   ",
+"XXXXX..%..%%X   ",
+"..........@@X.  ",
+"X.........@@X.  ",
+" X........--X.  ",
+"  X.......XXX.  ",
+
+" X...X@@......  ",
+"X....X@@......  ",
+".....X--......  ",
+".....XX.......  ",
+".......%......  ",
+"......%......   ",
+".....%.......   ",
+".............   ",
+"............    ",
+".X-@@%.....X    ",
+".X-@@%....X     ",
+".XXXXX..XX      ",
+".....XXX        ",
+"XXXXX           ",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X.%.%.%.%.%.  ",
+"................",
+"...........%@@-X",
+"...........%@@-X",
+"...........XXXXX",
+"................",
+"..%%%%....%%%%..",
+"................",
+"%@@-X...........",
+"%@@-X...........",
+"XXXXX...........",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X.%%X.......  ",
+"  X.@@X.......  ",
+"  X.@@X.%.......",
+"  X.--X.%.....%.",
+"  X.XXX.%.......",
+"  X.....%.....%.",
+"  X.............",
+"  X...........%.",
+"  X.............",
+"  X...........%.",
+"  X.....%.......",
+"  X.....%.%%X.%.",
+"  X.....%.@@X...",
+"  X.....%.@@X.XX",
+"  X.......--X.  ",
+"  X.......XXX.  ",
+
+"                ",
+"                ",
+"................",
+"...........%@@-X",
+"...........%@@-X",
+"...........XXXXX",
+"................",
+"..%%%%....%%%%..",
+"................",
+"%@@-X...........",
+"%@@-X...........",
+"XXXXX...........",
+"................",
+"XXX.%.%.%.%.%.XX",
+"  X...........  ",
+"  X...........  ",
+
+"  X.%%X.......  ",
+"  X.@@X.......  ",
+"....@@X.%.....  ",
+"..%.--X.%.....  ",
+"....XXX.%.....  ",
+"..%.....%.....  ",
+"..............  ",
+"..%...........  ",
+"..............  ",
+"..%...........  ",
+"........%.....  ",
+"..%.....%.%%X.  ",
+"........%.@@X.  ",
+"XXX.....%.@@X.  ",
+"  X.......--X.  ",
+"  X.......XXX.  ",
+
+"  X.-.-.-.-.-.  ",
+"  X.%%X.-.-.-.  ",
+".--.@@X.......--",
+"....@@X......%@@",
+".--.--X......%@@",
+"....XXX.#....XXX",
+".--....&X&....--",
+"........#.......",
+".--...........--",
+"%@@-X.....%%X...",
+"%@@-X.....@@X.--",
+"XXXXX.....@@X...",
+".--.......--X.--",
+"XXX-.-.-.-XXX-XX",
+"  X-.-.-.-.-.-  ",
+"  X...........  ",
+
+"      .  .      ",
+"      .  .      ",
+"......@..@......",
+"......@..@.%@@-X",
+"......@..@.%@@-X",
+"......@..@.XXXXX",
+"......@..@......",
+"..%%%%@..@%%%%..",
+"......@..@......",
+"%@@-X.@..@......",
+"%@@-X.@..@......",
+"XXXXX.@..@......",
+"......@..@......",
+"XXXXXX@XX@XXXXXX",
+"      .  .      ",
+"      .  .      ",
+
+"  X.%%X.......  ",
+"  X.@@X.......  ",
+"  X.@@X.%.....  ",
+"  X.--X.%.....  ",
+"  X.XXX.%.....  ",
+"..@@@@@@@@@@@@..",
+"  X...........  ",
+"  X...........  ",
+"..@@@@@@@@@@@@..",
+"  X...........  ",
+"  X.....%.....  ",
+"  X.....%.%%X.  ",
+"  X.....%.@@X.  ",
+"  X.....%.@@X.  ",
+"  X.......--X.  ",
+"  X.......XXX.  ",
+
+"oooooooooooooooo",
+"oooOooooooOooooo",
+"oooooooooooooooo",
+"oooooooooooooOoo",
+"oooooooooooooooo",
+"oooooooOoooooooo",
+"oooOoooooooooooo",
+"oooooooooooOoooO",
+"oooooooooooooooo",
+"OoooOooooooooooo",
+"oooooooooooooooo",
+"ooooooooooOoooOo",
+"ooooOOoooooooooo",
+"oooooooooooooooo",
+"oooOoooooooOoooo",
+"oooooooooooooooO",
+
+"oooooooooooooooo",
+"ooooXXooooooXXoo",
+"................",
+".......%@@-X....",
+".......%@@-X....",
+".......XXXXX....",
+"................",
+"..%%%%....%%%%..",
+"................",
+"....%@@-X.......",
+"....%@@-X.......",
+"....XXXXX.......",
+"................",
+"@@@@XX@@@@@@XX@@",
+"OOOXXOOOOOOXXOOO",
+"OOXXOOOOOOXXOOOO",
+
+"oo@...........Oo",
+"oo@...........Oo",
+"ooX.....%.....Xo",
+"oXX.....%.....Xo",
+"XX@.%%X.%.....OO",
+"Xo@.@@X.%.....OO",
+"oo@.@@X.......Oo",
+"oo@.--X...%%X.Oo",
+"oo@.XXX...@@X.Oo",
+"oo@.......@@X.Oo",
+"ooX.....%.--X.Xo",
+"oXX.....%.XXX.Xo",
+"XX@.....%.....OO",
+"Xo@.....%.....OO",
+"oo@...........Oo",
+"oo@...........Oo",
+
+"                ",
+"                ",
+"................",
+".......%@@-X....",
+".......%@@-X....",
+".......XXXXX....",
+"................",
+"..%%%%....%%%%..",
+"................",
+"....%@@-X.......",
+"....%@@-X.......",
+"....XXXXX.......",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X...........  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.%%X.%.....  ",
+"  X.@@X.%.....  ",
+"  X.@@X.......  ",
+"  X.--X...%%X.  ",
+"  X.XXX...@@X.  ",
+"  X.......@@X.  ",
+"  X.....%.--X.  ",
+"  X.....%.XXX.  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X...........  ",
+"  X...........  ",
+
+"  X............ ",
+"  X..........X..",
+"  X.........-@.X",
+"   X..X..%..-@@%",
+"   X..-X..%..@@%",
+"   X.-@@X..%....",
+"    X.@@%X......",
+"    X..%........",
+"     X..........",
+"      X.........",
+"       X........",
+"        XX......",
+"          XXX...",
+"             XXX",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"              ..",
+"           .....",
+"         .......",
+"        X..-....",
+"       X..@@-X..",
+"      X..%@@X...",
+"     X....%X....",
+"     X....X..%..",
+"    X.......%...",
+"    X......%....",
+"    X........--.",
+"   X........@@@X",
+"   X........@@..",
+"   X........%%X.",
+
+"                ",
+"                ",
+"....            ",
+".......         ",
+".........       ",
+"..........      ",
+"...........     ",
+".........%..    ",
+".......X%@@.    ",
+".....%..X@@-.   ",
+".%@@..%..X-..   ",
+".%@@-..%..X..   ",
+".X.@-.........  ",
+"X..X..........  ",
+" X............  ",
+"  X...........  ",
+
+" X...@@.......  ",
+"X..X@@@.......  ",
+"....--........  ",
+".......%......  ",
+"......%.......  ",
+".....%..X....   ",
+".......X%....   ",
+"......X@@%...   ",
+".....X-@@...    ",
+".......-...X    ",
+"..........X     ",
+"........XX      ",
+".....XXX        ",
+"XXXXX           ",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X.%.%.%.%.%.  ",
+"................",
+".......%@@-X....",
+".......%@@-X....",
+".......XXXXX....",
+"................",
+"..%%%%....%%%%..",
+"................",
+"....%@@-X.......",
+"....%@@-X.......",
+"....XXXXX.......",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X...........  ",
+"  X.....%.......",
+"  X.....%.....%.",
+"  X.%%X.%.......",
+"  X.@@X.%.....%.",
+"  X.@@X.........",
+"  X.--X...%%X.%.",
+"  X.XXX...@@X...",
+"  X.......@@X.%.",
+"  X.....%.--X...",
+"  X.....%.XXX.%.",
+"  X.....%.......",
+"  X.....%.....XX",
+"  X...........  ",
+"  X...........  ",
+
+"                ",
+"                ",
+"................",
+".......%@@-X....",
+".......%@@-X....",
+".......XXXXX....",
+"................",
+"..%%%%....%%%%..",
+"................",
+"....%@@-X.......",
+"....%@@-X.......",
+"....XXXXX.......",
+"................",
+"XXX.%.%.%.%.%.XX",
+"  X...........  ",
+"  X...........  ",
+
+"  X...........  ",
+"  X...........  ",
+"........%.....  ",
+"..%.....%.....  ",
+"....%%X.%.....  ",
+"..%.@@X.%.....  ",
+"....@@X.......  ",
+"..%.--X...%%X.  ",
+"....XXX...@@X.  ",
+"..%.......@@X.  ",
+"........%.--X.  ",
+"..%.....%.XXX.  ",
+"........%.....  ",
+"XXX.....%.....  ",
+"  X...........  ",
+"  X...........  ",
+
+"  X.-.-.-.-.-.  ",
+"  X.-.-.-.-.-.  ",
+".--...........--",
+"..........%%X%@@",
+".--.......@@X%@@",
+"........#.@@XXXX",
+".--.%%X&X&--X.--",
+"....@@X.#.XXX...",
+".--.@@X.......--",
+"%@@---X.........",
+"%@@-XXX.......--",
+"XXXX............",
+".--...........--",
+"XXX-.-.-.-.-.-XX",
+"  X-.-.-.-.-.-  ",
+"  X...........  ",
+
+"      .  .      ",
+"      .  .      ",
+"......@..@......",
+"......@%@@-X....",
+"......@%@@-X....",
+"......@XX@XX....",
+"......@..@......",
+"..%%%%@..@%%%%..",
+"......@..@......",
+"....%@@-X@......",
+"....%@@-X@......",
+"....XX@XX@......",
+"......@..@......",
+"XXXXXX@XX@XXXXXX",
+"      .  .      ",
+"      .  .      ",
+
+"  X...........  ",
+"  X...........  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.%%X.%.....  ",
+"..@@@@@@@@@@@@..",
+"  X.@@X.......  ",
+"  X.--X...%%X.  ",
+"..@@@@@@@@@@@@..",
+"  X.......@@X.  ",
+"  X.....%.--X.  ",
+"  X.....%.XXX.  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X...........  ",
+"  X...........  ",
+
+"oooooooooooooooo",
+"oooOooooooOooooo",
+"oooooooooooooooo",
+"oooooooooooooOoo",
+"oooooooooooooooo",
+"oooooooOoooooooo",
+"oooOoooooooooooo",
+"oooooooooooOoooO",
+"oooooooooooooooo",
+"OoooOooooooooooo",
+"oooooooooooooooo",
+"ooooooooooOoooOo",
+"ooooOOoooooooooo",
+"oooooooooooooooo",
+"oooOoooooooOoooo",
+"oooooooooooooooO",
+
+"oooooooooooooooo",
+"ooooXXooooooXXoo",
+"................",
+"...%@@-X........",
+"...%@@-X........",
+"...XXXXX........",
+"................",
+"..%%%%....%%%%..",
+"................",
+"........%@@-X...",
+"........%@@-X...",
+"........XXXXX...",
+"................",
+"@@@@XX@@@@@@XX@@",
+"OOOXXOOOOOOXXOOO",
+"OOXXOOOOOOXXOOOO",
+
+"oo@...........Oo",
+"oo@...........Oo",
+"ooX.....%.....Xo",
+"oXX.....%.%%X.Xo",
+"XX@.....%.@@X.OO",
+"Xo@.....%.@@X.OO",
+"oo@.......--X.Oo",
+"oo@.......XXX.Oo",
+"oo@.%%X.......Oo",
+"oo@.@@X.......Oo",
+"ooX.@@X.%.....Xo",
+"oXX.--X.%.....Xo",
+"XX@.XXX.%.....OO",
+"Xo@.....%.....OO",
+"oo@...........Oo",
+"oo@...........Oo",
+
+"                ",
+"                ",
+"................",
+"...%@@-X........",
+"...%@@-X........",
+"...XXXXX........",
+"................",
+"..%%%%....%%%%..",
+"................",
+"........%@@-X...",
+"........%@@-X...",
+"........XXXXX...",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X...........  ",
+"  X.....%.....  ",
+"  X.....%.%%X.  ",
+"  X.....%.@@X.  ",
+"  X.....%.@@X.  ",
+"  X.......--X.  ",
+"  X.......XXX.  ",
+"  X.%%X.......  ",
+"  X.@@X.......  ",
+"  X.@@X.%.....  ",
+"  X.--X.%.....  ",
+"  X.XXX.%.....  ",
+"  X.....%.....  ",
+"  X...........  ",
+"  X...........  ",
+
+"  X........X-.. ",
+"  X........-@@..",
+"  X.........@@%.",
+"   X.....%...%..",
+"   X......%.....",
+"   X.....X.%....",
+"    X...X-X.....",
+"    X...-@@X....",
+"     X...@@.....",
+"      X...%.....",
+"       X........",
+"        XX......",
+"          XXX...",
+"             XXX",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"              ..",
+"           .....",
+"         .......",
+"        X.......",
+"       X........",
+"      X.........",
+"     X...-X.....",
+"     X..@@-X.%..",
+"    X..%@@X.%...",
+"    X....X.%...-",
+"    X.........@@",
+"   X.........%@@",
+"   X..........%.",
+"   X............",
+
+"                ",
+"                ",
+"....            ",
+".......         ",
+".........       ",
+"......%...      ",
+".....%@@...     ",
+".....X@@-...    ",
+"......X-X...    ",
+".....%.X.....   ",
+"......%......   ",
+"...%...%.....   ",
+"..%@@.........  ",
+"X..@@-........  ",
+" X..-X........  ",
+"  X...........  ",
+
+" X..%.........  ",
+"X..@@%........  ",
+"..-@@.........  ",
+"..X-...%.X....  ",
+"......%.X@@%..  ",
+".....%.X-@@..   ",
+"........X-...   ",
+".............   ",
+"............    ",
+"...........X    ",
+"..........X     ",
+"........XX      ",
+".....XXX        ",
+"XXXXX           ",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X.%.%.%.%.%.  ",
+"................",
+"...%@@-X........",
+"...%@@-X........",
+"...XXXXX........",
+"................",
+"..%%%%....%%%%..",
+"................",
+"........%@@-X...",
+"........%@@-X...",
+"........XXXXX...",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X...........  ",
+"  X.....%.......",
+"  X.....%.%%X.%.",
+"  X.....%.@@X...",
+"  X.....%.@@X.%.",
+"  X.......--X...",
+"  X.......XXX.%.",
+"  X.%%X.........",
+"  X.@@X.......%.",
+"  X.@@X.%.......",
+"  X.--X.%.....%.",
+"  X.XXX.%.......",
+"  X.....%.....XX",
+"  X...........  ",
+"  X...........  ",
+
+"                ",
+"                ",
+"................",
+"...%@@-X........",
+"...%@@-X........",
+"...XXXXX........",
+"................",
+"..%%%%....%%%%..",
+"................",
+"........%@@-X...",
+"........%@@-X...",
+"........XXXXX...",
+"................",
+"XXX.%.%.%.%.%.XX",
+"  X...........  ",
+"  X...........  ",
+
+"  X...........  ",
+"  X...........  ",
+"........%.....  ",
+"..%.....%.%%X.  ",
+"........%.@@X.  ",
+"..%.....%.@@X.  ",
+"..........--X.  ",
+"..%.......XXX.  ",
+"....%%X.......  ",
+"..%.@@X.......  ",
+"....@@X.%.....  ",
+"..%.--X.%.....  ",
+"....XXX.%.....  ",
+"XXX.....%.....  ",
+"  X...........  ",
+"  X...........  ",
+
+"  X.-.-.-.@@X.  ",
+"  X.-.-.-.@@X.  ",
+".--.......--X.--",
+".......%@@-XX...",
+".--....%@@-X..--",
+".......X&XXX....",
+".--....#X#....--",
+"........&.......",
+".--.%@@-X.....--",
+"....%@@-X.......",
+".--.XXXXX.....--",
+"....@@X.........",
+".--.@@X.......--",
+"XXX---X-.-.-.-XX",
+"  X-XXX-.-.-.-  ",
+"  X...........  ",
+
+"      .  .      ",
+"      .  .      ",
+"......@..@......",
+"...%@@@X.@......",
+"...%@@@X.@......",
+"...XXX@X.@......",
+"......@..@......",
+"..%%%%@..@%%%%..",
+"......@..@......",
+"......@.%@@-X...",
+"......@.%@@-X...",
+"......@.X@XXX...",
+"......@..@......",
+"XXXXXX@XX@XXXXXX",
+"      .  .      ",
+"      .  .      ",
+
+"  X...........  ",
+"  X...........  ",
+"  X.....%.....  ",
+"  X.....%.%%X.  ",
+"  X.....%.@@X.  ",
+"..@@@@@@@@@@@@..",
+"  X.......--X.  ",
+"  X.......XXX.  ",
+"..@@@@@@@@@@@@..",
+"  X.@@X.......  ",
+"  X.@@X.%.....  ",
+"  X.--X.%.....  ",
+"  X.XXX.%.....  ",
+"  X.....%.....  ",
+"  X...........  ",
+"  X...........  ",
+
+"oooooooooooooooo",
+"oooOooooooOooooo",
+"oooooooooooooooo",
+"oooooooooooooOoo",
+"oooooooooooooooo",
+"oooooooOoooooooo",
+"oooOoooooooooooo",
+"oooooooooooOoooO",
+"oooooooooooooooo",
+"OoooOooooooooooo",
+"oooooooooooooooo",
+"ooooooooooOoooOo",
+"ooooOOoooooooooo",
+"oooooooooooooooo",
+"oooOoooooooOoooo",
+"oooooooooooooooO",
+
+"oooooooooooooooo",
+"ooooXXooooooXXoo",
+"................",
+"@@-X...........%",
+"@@-X...........%",
+"XXXX...........X",
+"................",
+"..%%%%....%%%%..",
+"................",
+"X...........%@@-",
+"X...........%@@-",
+"X...........XXXX",
+"................",
+"@@@@XX@@@@@@XX@@",
+"OOOXXOOOOOOXXOOO",
+"OOXXOOOOOOXXOOOO",
+
+"oo@.XXX...@@X.Oo",
+"oo@.......@@X.Oo",
+"ooX.....%.--X.Xo",
+"oXX.....%.XXX.Xo",
+"XX@.....%.....OO",
+"Xo@.....%.....OO",
+"oo@...........Oo",
+"oo@...........Oo",
+"oo@...........Oo",
+"oo@...........Oo",
+"ooX.....%.....Xo",
+"oXX.....%.....Xo",
+"XX@.%%X.%.....OO",
+"Xo@.@@X.%.....OO",
+"oo@.@@X.......Oo",
+"oo@.--X...%%X.Oo",
+
+"                ",
+"                ",
+"................",
+"@@-X...........%",
+"@@-X...........%",
+"XXXX...........X",
+"................",
+"..%%%%....%%%%..",
+"................",
+"X...........%@@-",
+"X...........%@@-",
+"X...........XXXX",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X.XXX...@@X.  ",
+"  X.......@@X.  ",
+"  X.....%.--X.  ",
+"  X.....%.XXX.  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X...........  ",
+"  X...........  ",
+"  X...........  ",
+"  X...........  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.%%X.%.....  ",
+"  X.@@X.%.....  ",
+"  X.@@X.......  ",
+"  X.--X...%%X.  ",
+
+"  X.......X@@.. ",
+"  X.......X@@@..",
+"  X........X....",
+"   X.....%......",
+"   X......%.....",
+"   X.......%....",
+"    X...........",
+"    X...........",
+"     X.....XXXXX",
+"      X....X-@@%",
+"       X....-@@%",
+"        XX......",
+"          XXX...",
+"             XXX",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"              ..",
+"           .....",
+"         .......",
+"        X.......",
+"       X........",
+"      X.........",
+"     X..........",
+"     X.......%..",
+"    X.......%..X",
+"    X..XX..%..X@",
+"    X.--X......@",
+"   X..@@X......@",
+"   X..@@X.......",
+"   X..%%X.......",
+
+"                ",
+"                ",
+"....            ",
+".......         ",
+"%@@-.....       ",
+"%@@-X.....      ",
+"XXXXX......     ",
+"............    ",
+"............    ",
+".....%.......   ",
+"......%......   ",
+".......%.....   ",
+"...%%X........  ",
+"X..@@@X.......  ",
+" X..@@X.......  ",
+"  X.--X.......  ",
+
+" X........X@@.  ",
+"X..@......X@@.  ",
+".-@@......X--.  ",
+".-@@X..%..XX..  ",
+".XXX..%.......  ",
+".....%.......   ",
+".............   ",
+".............   ",
+"............    ",
+"...........X    ",
+"..........X     ",
+"........XX      ",
+".....XXX        ",
+"XXXXX           ",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X.%.%.%.%.%.  ",
+"................",
+"@@-X...........%",
+"@@-X...........%",
+"XXXX...........X",
+"................",
+"..%%%%....%%%%..",
+"................",
+"X...........%@@-",
+"X...........%@@-",
+"X...........XXXX",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X.XXX...@@X.  ",
+"  X.......@@X.  ",
+"  X.....%.--X...",
+"  X.....%.XXX.%.",
+"  X.....%.......",
+"  X.....%.....%.",
+"  X.............",
+"  X...........%.",
+"  X.............",
+"  X...........%.",
+"  X.....%.......",
+"  X.....%.....%.",
+"  X.%%X.%.......",
+"  X.@@X.%.....XX",
+"  X.@@X.......  ",
+"  X.--X...%%X.  ",
+
+"                ",
+"                ",
+"................",
+"@@-X...........%",
+"@@-X...........%",
+"XXXX...........X",
+"................",
+"..%%%%....%%%%..",
+"................",
+"X...........%@@-",
+"X...........%@@-",
+"X...........XXXX",
+"................",
+"XXX.%.%.%.%.%.XX",
+"  X...........  ",
+"  X...........  ",
+
+"  X.XXX...@@X.  ",
+"  X.......@@X.  ",
+"........%.--X.  ",
+"..%.....%.XXX.  ",
+"........%.....  ",
+"..%.....%.....  ",
+"..............  ",
+"..%...........  ",
+"..............  ",
+"..%...........  ",
+"........%.....  ",
+"..%.....%.....  ",
+"....%%X.%.....  ",
+"XXX.@@X.%.....  ",
+"  X.@@X.......  ",
+"  X.--X...%%X.  ",
+
+"  X.-.-.-.@@X.  ",
+"  X.-.-.-.--X.  ",
+".--.......XXX.--",
+"@@-X............",
+"@@-X..........--",
+"XXXX....&.......",
+".--....#X#....--",
+"........&.......",
+".--...........--",
+"..........%@@-X.",
+".--.......%@@-X-",
+"..........XXXXX.",
+".--.%%X.......--",
+"XXX-@@X-.-.-.-XX",
+"  X-@@X-.-.-.-  ",
+"  X.--X...%%X.  ",
+
+"      .  .      ",
+"      .  .      ",
+"......@..@......",
+"@@-X..@..@.....%",
+"@@-X..@..@.....%",
+"XXXX..@..@.....X",
+"......@..@......",
+"..%%%%@..@%%%%..",
+"......@..@......",
+"X.....@..@..%@@-",
+"X.....@..@..%@@-",
+"X.....@..@..XXXX",
+"......@..@......",
+"XXXXXX@XX@XXXXXX",
+"      .  .      ",
+"      .  .      ",
+
+"  X.XXX...@@X.  ",
+"  X.......@@X.  ",
+"  X.....%.--X.  ",
+"  X.....%.XXX.  ",
+"  X.....%.....  ",
+"..@@@@@@@@@@@@..",
+"  X...........  ",
+"  X...........  ",
+"..@@@@@@@@@@@@..",
+"  X...........  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.%%X.%.....  ",
+"  X.@@X.%.....  ",
+"  X.@@X.......  ",
+"  X.--X...%%X.  ",
+
+"oooooooooooooooo",
+"oooOooooooOooooo",
+"oooooooooooooooo",
+"oooooooooooooOoo",
+"oooooooooooooooo",
+"oooooooOoooooooo",
+"oooOoooooooooooo",
+"oooooooooooOoooO",
+"oooooooooooooooo",
+"OoooOooooooooooo",
+"oooooooooooooooo",
+"ooooooooooOoooOo",
+"ooooOOoooooooooo",
+"oooooooooooooooo",
+"oooOoooooooOoooo",
+"oooooooooooooooO",
+
+"oooooooooooooooo",
+"ooooXXooooooXXoo",
+"................",
+"...%@@-X...%@@-X",
+"...%@@-X...%@@-X",
+"...XXXXX...XXXXX",
+"................",
+"..%%%%....%%%%..",
+"................",
+"%@@-X...%@@-X...",
+"%@@-X...%@@-X...",
+"XXXXX...XXXXX...",
+"................",
+"@@@@XX@@@@@@XX@@",
+"OOOXXOOOOOOXXOOO",
+"OOXXOOOOOOXXOOOO",
+
+"oo@.%%X.......Oo",
+"oo@.@@X.......Oo",
+"ooX.@@X.%.....Xo",
+"oXX.--X.%.%%X.Xo",
+"XX@.XXX.%.@@X.OO",
+"Xo@.....%.@@X.OO",
+"oo@.......--X.Oo",
+"oo@.......XXX.Oo",
+"oo@.%%X.......Oo",
+"oo@.@@X.......Oo",
+"ooX.@@X.%.....Xo",
+"oXX.--X.%.%%X.Xo",
+"XX@.XXX.%.@@X.OO",
+"Xo@.....%.@@X.OO",
+"oo@.......--X.Oo",
+"oo@.......XXX.Oo",
+
+"                ",
+"                ",
+"................",
+"...%@@-X...%@@-X",
+"...%@@-X...%@@-X",
+"...XXXXX...XXXXX",
+"................",
+"..%%%%....%%%%..",
+"................",
+"%@@-X...%@@-X...",
+"%@@-X...%@@-X...",
+"XXXXX...XXXXX...",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X.%%X.......  ",
+"  X.@@X.......  ",
+"  X.@@X.%.....  ",
+"  X.--X.%.%%X.  ",
+"  X.XXX.%.@@X.  ",
+"  X.....%.@@X.  ",
+"  X.......--X.  ",
+"  X.......XXX.  ",
+"  X.%%X.......  ",
+"  X.@@X.......  ",
+"  X.@@X.%.....  ",
+"  X.--X.%.%%X.  ",
+"  X.XXX.%.@@X.  ",
+"  X.....%.@@X.  ",
+"  X.......--X.  ",
+"  X.......XXX.  ",
+
+"  X.%%X........ ",
+"  X.@@X....%X...",
+"  X.@@X...%@-X..",
+"   X--X..%.-X%@-",
+"   XXXX...%..%@-",
+"   X.......%.XXX",
+"    X...........",
+"    X....%X.....",
+"     X..%@@X....",
+"      X..@@-X...",
+"       X..-X....",
+"        XX......",
+"          XXX...",
+"             XXX",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"              ..",
+"           .....",
+"         ...X-@@",
+"        X...X-@@",
+"       X....XXXX",
+"      X.........",
+"     X..%.......",
+"     X.@@%...%..",
+"    X.-@@X..%.%.",
+"    X.X-X..%.-@%",
+"    X..X.....X-X",
+"   X.......X%%X.",
+"   X.......X@@..",
+"   X.......X--..",
+
+"                ",
+"                ",
+"....            ",
+".......         ",
+"%....X-..       ",
+"%...X-@@..      ",
+"X....X@@%..     ",
+"......X%....    ",
+"............    ",
+".XXX.%.......   ",
+".-@%..%...XXX   ",
+".-@%X-.%..X--   ",
+"...X-@%...X@@.  ",
+"....X%....X@@.  ",
+" X........X%%.  ",
+"  X...........  ",
+
+" X...--X......  ",
+"X....@@X......  ",
+"....X%%X......  ",
+"...X-X.....X..  ",
+"...%@-.%..X-X.  ",
+"....%.%..X@@-   ",
+".....%...%@@.   ",
+"..........%..   ",
+"............    ",
+"..XXXXX....X    ",
+"..%@@-X...X     ",
+"..%@@-X.XX      ",
+".....XXX        ",
+"XXXXX           ",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X.%.%.%.%.%.  ",
+"................",
+"...%@@-X...%@@-X",
+"...%@@-X...%@@-X",
+"...XXXXX...XXXXX",
+"................",
+"..%%%%....%%%%..",
+"................",
+"%@@-X...%@@-X...",
+"%@@-X...%@@-X...",
+"XXXXX...XXXXX...",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X.%%X.......  ",
+"  X.@@X.......  ",
+"  X.@@X.%.......",
+"  X.--X.%.%%X.%.",
+"  X.XXX.%.@@X...",
+"  X.....%.@@X.%.",
+"  X.......--X...",
+"  X.......XXX.%.",
+"  X.%%X.........",
+"  X.@@X.......%.",
+"  X.@@X.%.......",
+"  X.--X.%.%%X.%.",
+"  X.XXX.%.@@X...",
+"  X.....%.@@X.XX",
+"  X.......--X.  ",
+"  X.......XXX.  ",
+
+"                ",
+"                ",
+"................",
+"...%@@-X...%@@-X",
+"...%@@-X...%@@-X",
+"...XXXXX...XXXXX",
+"................",
+"..%%%%....%%%%..",
+"................",
+"%@@-X...%@@-X...",
+"%@@-X...%@@-X...",
+"XXXXX...XXXXX...",
+"................",
+"XXX.%.%.%.%.%.XX",
+"  X...........  ",
+"  X...........  ",
+
+"  X.%%X.......  ",
+"  X.@@X.......  ",
+"....@@X.%.....  ",
+"..%.--X.%.%%X.  ",
+"....XXX.%.@@X.  ",
+"..%.....%.@@X.  ",
+"..........--X.  ",
+"..%.......XXX.  ",
+"....%%X.......  ",
+"..%.@@X.......  ",
+"....@@X.%.....  ",
+"..%.--X.%.%%X.  ",
+"....XXX.%.@@X.  ",
+"XXX.....%.@@X.  ",
+"  X.......--X.  ",
+"  X.......XXX.  ",
+
+"  X.-.-.-.-.-.  ",
+"  X.-.-.-.-.-.  ",
+".--...........--",
+"...%@@-X...%@@-X",
+".--%@@-X...%@@-X",
+"...XXXXX&..XXXXX",
+".--....#X#....--",
+"........&.......",
+".--...........--",
+"%@@-X...%@@-X...",
+"%@@-X...%@@-X.--",
+"XXXXX...XXXXX...",
+".--...........--",
+"XXX-.-.-.-.-.-XX",
+"  X-.-.-.-.-.-  ",
+"  X...........  ",
+
+"      .  .      ",
+"      .  .      ",
+"......@..@......",
+"...%@@@X.@.%@@-X",
+"...%@@@X.@.%@@-X",
+"...XXX@X.@.XXXXX",
+"......@..@......",
+"..%%%%@..@%%%%..",
+"......@..@......",
+"%@@-X.@.%@@-X...",
+"%@@-X.@.%@@-X...",
+"XXXXX.@.X@XXX...",
+"......@..@......",
+"XXXXXX@XX@XXXXXX",
+"      .  .      ",
+"      .  .      ",
+
+"  X.%%X.......  ",
+"  X.@@X.......  ",
+"  X.@@X.%.....  ",
+"  X.--X.%.%%X.  ",
+"  X.XXX.%.@@X.  ",
+"..@@@@@@@@@@@@..",
+"  X.......--X.  ",
+"  X.......XXX.  ",
+"..@@@@@@@@@@@@..",
+"  X.@@X.......  ",
+"  X.@@X.%.....  ",
+"  X.--X.%.%%X.  ",
+"  X.XXX.%.@@X.  ",
+"  X.....%.@@X.  ",
+"  X.......--X.  ",
+"  X.......XXX.  ",
+
+"oooooooooooooooo",
+"oooOooooooOooooo",
+"oooooooooooooooo",
+"oooooooooooooOoo",
+"oooooooooooooooo",
+"oooooooOoooooooo",
+"oooOoooooooooooo",
+"oooooooooooOoooO",
+"oooooooooooooooo",
+"OoooOooooooooooo",
+"oooooooooooooooo",
+"ooooooooooOoooOo",
+"ooooOOoooooooooo",
+"oooooooooooooooo",
+"oooOoooooooOoooo",
+"oooooooooooooooO",
+
+"oooooooooooooooo",
+"ooooXXooooooXXoo",
+"................",
+".%@@-X...%@@-X..",
+".%@@-X...%@@-X..",
+".XXXXX...XXXXX..",
+"................",
+"..%%%%....%%%%..",
+"................",
+"..%@@-X...%@@-X.",
+"..%@@-X...%@@-X.",
+"..XXXXX...XXXXX.",
+"................",
+"@@@@XX@@@@@@XX@@",
+"OOOXXOOOOOOXXOOO",
+"OOXXOOOOOOXXOOOO",
+
+"oo@...........Oo",
+"oo@.......%%X.Oo",
+"ooX.....%.@@X.Xo",
+"oXX.%%X.%.@@X.Xo",
+"XX@.@@X.%.--X.OO",
+"Xo@.@@X.%.XXX.OO",
+"oo@.--X.......Oo",
+"oo@.XXX.......Oo",
+"oo@...........Oo",
+"oo@.......%%X.Oo",
+"ooX.....%.@@X.Xo",
+"oXX.%%X.%.@@X.Xo",
+"XX@.@@X.%.--X.OO",
+"Xo@.@@X.%.XXX.OO",
+"oo@.--X.......Oo",
+"oo@.XXX.......Oo",
+
+"                ",
+"                ",
+"................",
+".%@@-X...%@@-X..",
+".%@@-X...%@@-X..",
+".XXXXX...XXXXX..",
+"................",
+"..%%%%....%%%%..",
+"................",
+"..%@@-X...%@@-X.",
+"..%@@-X...%@@-X.",
+"..XXXXX...XXXXX.",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X.......%%X.  ",
+"  X.....%.@@X.  ",
+"  X.%%X.%.@@X.  ",
+"  X.@@X.%.--X.  ",
+"  X.@@X.%.XXX.  ",
+"  X.--X.......  ",
+"  X.XXX.......  ",
+"  X...........  ",
+"  X.......%%X.  ",
+"  X.....%.@@X.  ",
+"  X.%%X.%.@@X.  ",
+"  X.@@X.%.--X.  ",
+"  X.@@X.%.XXX.  ",
+"  X.--X.......  ",
+"  X.XXX.......  ",
+
+"  X.......%%X.. ",
+"  X.%%X...@@X...",
+"  X.@@X...--X...",
+"   X@@X..%XX%@-.",
+"   X--X...%.%@-.",
+"   XXXX....%XXX.",
+"    X...........",
+"    X...........",
+"     X.....%X...",
+"      X...%@@X..",
+"       X...@@-X.",
+"        XX..-X..",
+"          XXX...",
+"             XXX",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"              ..",
+"           .....",
+"         ...-@@%",
+"        X..X-@@%",
+"       X...XXXXX",
+"      X.........",
+"     X..........",
+"     X.......%..",
+"    X..%....%X-@",
+"    X.@@%..%.X-@",
+"    X-@@X..X%%XX",
+"   X.X-X...X@@..",
+"   X..X....X--..",
+"   X............",
+
+"                ",
+"                ",
+"....            ",
+"...X-..         ",
+"..X-@@...       ",
+"...X@@%...      ",
+"....X%.....     ",
+"............    ",
+"............    ",
+"..XXX%....XX.   ",
+"%.-@%.%...--X   ",
+"%.-@%XX%..@@X   ",
+"X...--X...@@X.  ",
+"X...@@X...%%X.  ",
+" X..-%X.......  ",
+"  X...........  ",
+
+" X............  ",
+"X....--X....X.  ",
+".....@@X...X-X  ",
+"..XXX%%X..X@@-  ",
+"..%@-X.%..%@@.  ",
+"..%@-X%....%.   ",
+".....%.......   ",
+".............   ",
+"............    ",
+"...XXXXX...X    ",
+"...%@@-X..X     ",
+"...%@@-.XX      ",
+".....XXX        ",
+"XXXXX           ",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X.%.%.%.%.%.  ",
+"................",
+".%@@-X...%@@-X..",
+".%@@-X...%@@-X..",
+".XXXXX...XXXXX..",
+"................",
+"..%%%%....%%%%..",
+"................",
+"..%@@-X...%@@-X.",
+"..%@@-X...%@@-X.",
+"..XXXXX...XXXXX.",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X.......%%X.  ",
+"  X.....%.@@X...",
+"  X.%%X.%.@@X.%.",
+"  X.@@X.%.--X...",
+"  X.@@X.%.XXX.%.",
+"  X.--X.........",
+"  X.XXX.......%.",
+"  X.............",
+"  X.......%%X.%.",
+"  X.....%.@@X...",
+"  X.%%X.%.@@X.%.",
+"  X.@@X.%.--X...",
+"  X.@@X.%.XXX.XX",
+"  X.--X.......  ",
+"  X.XXX.......  ",
+
+"                ",
+"                ",
+"................",
+".%@@-X...%@@-X..",
+".%@@-X...%@@-X..",
+".XXXXX...XXXXX..",
+"................",
+"..%%%%....%%%%..",
+"................",
+"..%@@-X...%@@-X.",
+"..%@@-X...%@@-X.",
+"..XXXXX...XXXXX.",
+"................",
+"XXX.%.%.%.%.%.XX",
+"  X...........  ",
+"  X...........  ",
+
+"  X...........  ",
+"  X.......%%X.  ",
+"........%.@@X.  ",
+"..%.%%X.%.@@X.  ",
+"....@@X.%.--X.  ",
+"..%.@@X.%.XXX.  ",
+"....--X.......  ",
+"..%.XXX.......  ",
+"..............  ",
+"..%.......%%X.  ",
+"........%.@@X.  ",
+"..%.%%X.%.@@X.  ",
+"....@@X.%.--X.  ",
+"XXX.@@X.%.XXX.  ",
+"  X.--X.......  ",
+"  X.XXX.......  ",
+
+"  X.-.-.-.-.-.  ",
+"  X.-.-.-.-.-.  ",
+".--...........--",
+".%@@-X...%@@-X..",
+".%@@-X...%@@-X--",
+".XXXXX..&XXXXX..",
+".--....#X#....--",
+"........&.......",
+".--...........--",
+"..%@@-X...%@@-X.",
+".-%@@-X...%@@-X-",
+"..XXXXX...XXXXX.",
+".--...........--",
+"XXX-.-.-.-.-.-XX",
+"  X-.-.-.-.-.-  ",
+"  X...........  ",
+
+"      .  .      ",
+"      .  .      ",
+"......@..@......",
+".%@@-X@..@@@-X..",
+".%@@-X@..@@@-X..",
+".XXXXX@..@XXXX..",
+"......@..@......",
+"..%%%%@..@%%%%..",
+"......@..@......",
+"..%@@-@..@%@@-X.",
+"..%@@-@..@%@@-X.",
+"..XXXX@..@XXXXX.",
+"......@..@......",
+"XXXXXX@XX@XXXXXX",
+"      .  .      ",
+"      .  .      ",
+
+"  X...........  ",
+"  X.......%%X.  ",
+"  X.....%.@@X.  ",
+"  X.%%X.%.@@X.  ",
+"  X.@@X.%.--X.  ",
+"..@@@@@@@@@@@@..",
+"  X.--X.......  ",
+"  X.XXX.......  ",
+"..@@@@@@@@@@@@..",
+"  X.......%%X.  ",
+"  X.....%.@@X.  ",
+"  X.%%X.%.@@X.  ",
+"  X.@@X.%.--X.  ",
+"  X.@@X.%.XXX.  ",
+"  X.--X.......  ",
+"  X.XXX.......  ",
+
+"oooooooooooooooo",
+"oooOooooooOooooo",
+"oooooooooooooooo",
+"oooooooooooooOoo",
+"oooooooooooooooo",
+"oooooooOoooooooo",
+"oooOoooooooooooo",
+"oooooooooooOoooO",
+"oooooooooooooooo",
+"OoooOooooooooooo",
+"oooooooooooooooo",
+"ooooooooooOoooOo",
+"ooooOOoooooooooo",
+"oooooooooooooooo",
+"oooOoooooooOoooo",
+"oooooooooooooooO",
+
+"oooooooooooooooo",
+"ooooXXooooooXXoo",
+"................",
+"@@-X...%@@-X...%",
+"@@-X...%@@-X...%",
+"XXXX...XXXXX...X",
+"................",
+"..%%%%....%%%%..",
+"................",
+"X...%@@-X...%@@-",
+"X...%@@-X...%@@-",
+"X...XXXXX...XXXX",
+"................",
+"@@@@XX@@@@@@XX@@",
+"OOOXXOOOOOOXXOOO",
+"OOXXOOOOOOXXOOOO",
+
+"oo@.--X...@@X.Oo",
+"oo@.XXX...@@X.Oo",
+"ooX.....%.--X.Xo",
+"oXX.....%.XXX.Xo",
+"XX@.....%.....OO",
+"Xo@.%%X.%.....OO",
+"oo@.@@X.......Oo",
+"oo@.@@X...%%X.Oo",
+"oo@.--X...@@X.Oo",
+"oo@.XXX...@@X.Oo",
+"ooX.....%.--X.Xo",
+"oXX.....%.XXX.Xo",
+"XX@.....%.....OO",
+"Xo@.%%X.%.....OO",
+"oo@.@@X.......Oo",
+"oo@.@@X...%%X.Oo",
+
+"                ",
+"                ",
+"................",
+"@@-X...%@@-X...%",
+"@@-X...%@@-X...%",
+"XXXX...XXXXX...X",
+"................",
+"..%%%%....%%%%..",
+"................",
+"X...%@@-X...%@@-",
+"X...%@@-X...%@@-",
+"X...XXXXX...XXXX",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X.--X...@@X.  ",
+"  X.XXX...@@X.  ",
+"  X.....%.--X.  ",
+"  X.....%.XXX.  ",
+"  X.....%.....  ",
+"  X.%%X.%.....  ",
+"  X.@@X.......  ",
+"  X.@@X...%%X.  ",
+"  X.--X...@@X.  ",
+"  X.XXX...@@X.  ",
+"  X.....%.--X.  ",
+"  X.....%.XXX.  ",
+"  X.....%.....  ",
+"  X.%%X.%.....  ",
+"  X.@@X.......  ",
+"  X.@@X...%%X.  ",
+
+"  X.XXX...--X.. ",
+"  X.......XXX...",
+"  X.........%X..",
+"   X.%X..%.%@-X%",
+"   X%@@X..%.-X.%",
+"   X.@@-X..%...X",
+"    X.-X........",
+"    X...........",
+"     X..........",
+"      X.....%@@-",
+"       X....%@@-",
+"        XX..XXXX",
+"          XXX...",
+"             XXX",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"              ..",
+"           .....",
+"         ...%...",
+"        X..@@%..",
+"       X..-@@X..",
+"      X...X-X...",
+"     X.....X....",
+"     X.......%..",
+"    X.......%..X",
+"    X......%.%.X",
+"    XX%%....-@%X",
+"   X.X@@....X-X.",
+"   X.X@@.....X..",
+"   X.X--...X%%..",
+
+"                ",
+"                ",
+"....            ",
+".XXXX..         ",
+"X-@@%....       ",
+"X-@@%.....      ",
+"X..........     ",
+"............    ",
+".........X-.    ",
+".X...%..X-@@.   ",
+"-%.X-.%..X@@%   ",
+"-%X-@%.%..X%.   ",
+"X..X%.........  ",
+"X...XXX.......  ",
+" X..--X...XXX.  ",
+"  X.@@X...--X.  ",
+
+" X...X.....@@X  ",
+"X...X-X....@@X  ",
+"..XX%@-....%%X  ",
+"..-X.%.%......  ",
+"..-X..%.......  ",
+".....%.......   ",
+".......X.....   ",
+"......X-X....   ",
+"..X..X@@-...    ",
+"..X..%@@...X    ",
+"..X...%...X     ",
+"........XX      ",
+".....XXX        ",
+"XXXXX           ",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X.%.%.%.%.%.  ",
+"................",
+"@@-X...%@@-X...%",
+"@@-X...%@@-X...%",
+"XXXX...XXXXX...X",
+"................",
+"..%%%%....%%%%..",
+"................",
+"X...%@@-X...%@@-",
+"X...%@@-X...%@@-",
+"X...XXXXX...XXXX",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X.--X...@@X.  ",
+"  X.XXX...@@X.  ",
+"  X.....%.--X...",
+"  X.....%.XXX.%.",
+"  X.....%.......",
+"  X.%%X.%.....%.",
+"  X.@@X.........",
+"  X.@@X...%%X.%.",
+"  X.--X...@@X...",
+"  X.XXX...@@X.%.",
+"  X.....%.--X...",
+"  X.....%.XXX.%.",
+"  X.....%.......",
+"  X.%%X.%.....XX",
+"  X.@@X.......  ",
+"  X.@@X...%%X.  ",
+
+"                ",
+"                ",
+"................",
+"@@-X...%@@-X...%",
+"@@-X...%@@-X...%",
+"XXXX...XXXXX...X",
+"................",
+"..%%%%....%%%%..",
+"................",
+"X...%@@-X...%@@-",
+"X...%@@-X...%@@-",
+"X...XXXXX...XXXX",
+"................",
+"XXX.%.%.%.%.%.XX",
+"  X...........  ",
+"  X...........  ",
+
+"  X.--X...@@X.  ",
+"  X.XXX...@@X.  ",
+"........%.--X.  ",
+"..%.....%.XXX.  ",
+"........%.....  ",
+"..%.%%X.%.....  ",
+"....@@X.......  ",
+"..%.@@X...%%X.  ",
+"....--X...@@X.  ",
+"..%.XXX...@@X.  ",
+"........%.--X.  ",
+"..%.....%.XXX.  ",
+"........%.....  ",
+"XXX.%%X.%.....  ",
+"  X.@@X.......  ",
+"  X.@@X...%%X.  ",
+
+"  X.--X.-.@@X.  ",
+"  X.XXX.-.@@X.  ",
+".--.......--X.--",
+"@@-X......XXX..%",
+"@@-X..........-%",
+"XXXX%%X.#......X",
+".--.@@X&X&....--",
+"....@@X.#.%%X...",
+".--.--X...@@X.--",
+"X...XXX...@@X@@-",
+"X--.......--X@@-",
+"X.........XXXXXX",
+".--...........--",
+"XXX-%%X-.-.-.-XX",
+"  X-@@X-.-.-.-  ",
+"  X.@@X...%%X.  ",
+
+"      .  .      ",
+"      .  .      ",
+"......@..@......",
+"@@-X..@%@@-X...%",
+"@@-X..@%@@-X...%",
+"XXXX..@XX@XX...X",
+"......@..@......",
+"..%%%%@..@%%%%..",
+"......@..@......",
+"X...%@@-X@..%@@-",
+"X...%@@-X@..%@@-",
+"X...XX@XX@..XXXX",
+"......@..@......",
+"XXXXXX@XX@XXXXXX",
+"      .  .      ",
+"      .  .      ",
+
+"  X.--X...@@X.  ",
+"  X.XXX...@@X.  ",
+"  X.....%.--X.  ",
+"  X.....%.XXX.  ",
+"  X.....%.....  ",
+"..@@@@@@@@@@@@..",
+"  X.@@X.......  ",
+"  X.@@X...%%X.  ",
+"..@@@@@@@@@@@@..",
+"  X.XXX...@@X.  ",
+"  X.....%.--X.  ",
+"  X.....%.XXX.  ",
+"  X.....%.....  ",
+"  X.%%X.%.....  ",
+"  X.@@X.......  ",
+"  X.@@X...%%X.  ",
+
+"oooooooooooooooo",
+"oooOooooooOooooo",
+"oooooooooooooooo",
+"oooooooooooooOoo",
+"oooooooooooooooo",
+"oooooooOoooooooo",
+"oooOoooooooooooo",
+"oooooooooooOoooO",
+"oooooooooooooooo",
+"OoooOooooooooooo",
+"oooooooooooooooo",
+"ooooooooooOoooOo",
+"ooooOOoooooooooo",
+"oooooooooooooooo",
+"oooOoooooooOoooo",
+"oooooooooooooooO",
+
+"oooooooooooooooo",
+"ooooXXooooooXXoo",
+"................",
+"-X...%@@-X...%@@",
+"-X...%@@-X...%@@",
+"XX...XXXXX...XXX",
+"................",
+"..%%%%....%%%%..",
+"................",
+"@-X...%@@-X...%@",
+"@-X...%@@-X...%@",
+"XXX...XXXXX...XX",
+"................",
+"@@@@XX@@@@@@XX@@",
+"OOOXXOOOOOOXXOOO",
+"OOXXOOOOOOXXOOOO",
+
+"oo@.@@X...--X.Oo",
+"oo@.@@X...XXX.Oo",
+"ooX.--X.%.....Xo",
+"oXX.XXX.%.....Xo",
+"XX@.....%.....OO",
+"Xo@.....%.%%X.OO",
+"oo@.......@@X.Oo",
+"oo@.%%X...@@X.Oo",
+"oo@.@@X...--X.Oo",
+"oo@.@@X...XXX.Oo",
+"ooX.--X.%.....Xo",
+"oXX.XXX.%.....Xo",
+"XX@.....%.....OO",
+"Xo@.....%.%%X.OO",
+"oo@.......@@X.Oo",
+"oo@.%%X...@@X.Oo",
+
+"                ",
+"                ",
+"................",
+"-X...%@@-X...%@@",
+"-X...%@@-X...%@@",
+"XX...XXXXX...XXX",
+"................",
+"..%%%%....%%%%..",
+"................",
+"@-X...%@@-X...%@",
+"@-X...%@@-X...%@",
+"XXX...XXXXX...XX",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X.@@X...--X.  ",
+"  X.@@X...XXX.  ",
+"  X.--X.%.....  ",
+"  X.XXX.%.....  ",
+"  X.....%.....  ",
+"  X.....%.%%X.  ",
+"  X.......@@X.  ",
+"  X.%%X...@@X.  ",
+"  X.@@X...--X.  ",
+"  X.@@X...XXX.  ",
+"  X.--X.%.....  ",
+"  X.XXX.%.....  ",
+"  X.....%.....  ",
+"  X.....%.%%X.  ",
+"  X.......@@X.  ",
+"  X.%%X...@@X.  ",
+
+"  X.@@X...XXX.. ",
+"  X.--X....%X...",
+"  X.XXX...%@-X..",
+"   X.....%.-X.%@",
+"   X......%...%@",
+"   X...%X..%..XX",
+"    X.%@@X......",
+"    X..@@-X.....",
+"     X..-X......",
+"      X.......%@",
+"       X......%@",
+"        XX....XX",
+"          XXX...",
+"             XXX",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"              ..",
+"           .....",
+"         .....X-",
+"        X.....X-",
+"       X..%...XX",
+"      X..@@%....",
+"     X..-@@X....",
+"     X..X-X..%..",
+"    X....X..%.%.",
+"    X......%.-@%",
+"    X........X-X",
+"   X..........X.",
+"   X.X%%...X%%..",
+"   X.X@@...X@@..",
+
+"                ",
+"                ",
+"....            ",
+".XX....         ",
+"@@%......       ",
+"@@%.......      ",
+"X......-X..     ",
+"......-@@X..    ",
+".......@@%X.    ",
+".XX..%..%X...   ",
+"X@%...%......   ",
+"X@%.-X.%.....   ",
+"X..-@@X...XXX.  ",
+"X...%X....--X.  ",
+" X..XXX...@@X.  ",
+"  X.--X...--X.  ",
+
+" X...%%X...%%X  ",
+"X...X.........  ",
+"..XX-X........  ",
+"@-X%@-.%......  ",
+"@-X.%.%.......  ",
+"XXX..%...-X..   ",
+"........@@-X.   ",
+".......%@@X..   ",
+"........%X..    ",
+".-@-X...X..X    ",
+".-@-X.....X     ",
+".XXXX...XX      ",
+".....XXX        ",
+"XXXXX           ",
+"                ",
+"                ",
+
+"  X...........  ",
+"  X.%.%.%.%.%.  ",
+"................",
+"-X...%@@-X...%@@",
+"-X...%@@-X...%@@",
+"XX...XXXXX...XXX",
+"................",
+"..%%%%....%%%%..",
+"................",
+"@-X...%@@-X...%@",
+"@-X...%@@-X...%@",
+"XXX...XXXXX...XX",
+"................",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+
+"  X.@@X...--X.  ",
+"  X.@@X...XXX.  ",
+"  X.--X.%.......",
+"  X.XXX.%.....%.",
+"  X.....%.......",
+"  X.....%.%%X.%.",
+"  X.......@@X...",
+"  X.%%X...@@X.%.",
+"  X.@@X...--X...",
+"  X.@@X...XXX.%.",
+"  X.--X.%.......",
+"  X.XXX.%.....%.",
+"  X.....%.......",
+"  X.....%.%%X.XX",
+"  X.......@@X.  ",
+"  X.%%X...@@X.  ",
+
+"                ",
+"                ",
+"................",
+"-X...%@@-X...%@@",
+"-X...%@@-X...%@@",
+"XX...XXXXX...XXX",
+"................",
+"..%%%%....%%%%..",
+"................",
+"@-X...%@@-X...%@",
+"@-X...%@@-X...%@",
+"XXX...XXXXX...XX",
+"................",
+"XXX.%.%.%.%.%.XX",
+"  X...........  ",
+"  X...........  ",
+
+"  X.@@X...--X.  ",
+"  X.@@X...XXX.  ",
+"....--X.%.....  ",
+"..%.XXX.%.....  ",
+"........%.....  ",
+"..%.....%.%%X.  ",
+"..........@@X.  ",
+"..%.%%X...@@X.  ",
+"....@@X...--X.  ",
+"..%.@@X...XXX.  ",
+"....--X.%.....  ",
+"..%.XXX.%.....  ",
+"........%.....  ",
+"XXX.....%.%%X.  ",
+"  X.......@@X.  ",
+"  X.%%X...@@X.  ",
+
+"  X.@@X.-.--X.  ",
+"  X.@@X.-.XXX.  ",
+".--.--X.......--",
+"-X..XXX......%@@",
+"-X-..........%@@",
+"XX......#.%%XXXX",
+".--....&X&@@X.--",
+"....%%X.#.@@X...",
+".--.@@X...--X.--",
+"@-X.@@X...XXX.%@",
+"@-X.--X.......%@",
+"XXX.XXX.......XX",
+".--...........--",
+"XXX-.-.-.-%%X-XX",
+"  X-.-.-.-@@X-  ",
+"  X.%%X...@@X.  ",
+
+"      .  .      ",
+"      .  .      ",
+"......@..@......",
+"-X...%@@-@...%@@",
+"-X...%@@-@...%@@",
+"XX...X@XX@...XXX",
+"......@..@......",
+"..%%%%@..@%%%%..",
+"......@..@......",
+"@-X...@@@@X...%@",
+"@-X...@@@@X...%@",
+"XXX...@XX@X...XX",
+"......@..@......",
+"XXXXXX@XX@XXXXXX",
+"      .  .      ",
+"      .  .      ",
+
+"  X.@@X...--X.  ",
+"  X.@@X...XXX.  ",
+"  X.--X.%.....  ",
+"  X.XXX.%.....  ",
+"  X.....%.....  ",
+"..@@@@@@@@@@@@..",
+"  X.......@@X.  ",
+"  X.%%X...@@X.  ",
+"..@@@@@@@@@@@@..",
+"  X.@@X...XXX.  ",
+"  X.--X.%.....  ",
+"  X.XXX.%.....  ",
+"  X.....%.....  ",
+"  X.....%.%%X.  ",
+"  X.......@@X.  ",
+"  X.%%X...@@X.  ",
+
+"oooooooooooooooo",
+"oooOooooooOooooo",
+"oooooooooooooooo",
+"oooooooooooooOoo",
+"oooooooooooooooo",
+"oooooooOoooooooo",
+"oooOoooooooooooo",
+"oooooooooooOoooO",
+"oooooooooooooooo",
+"OoooOooooooooooo",
+"oooooooooooooooo",
+"ooooooooooOoooOo",
+"ooooOOoooooooooo",
+"oooooooooooooooo",
+"oooOoooooooOoooo",
+"oooooooooooooooO",
+
+"oooooo-oo-oooooo",
+"oooooooooooooooo",
+"oooooo@oo@oooooo",
+"oooooooooooooooo",
+"oooooo-oo-oooooo",
+"oooooooooooooooo",
+"oooooo@oo@oooooo",
+"oooooooooooooooo",
+"oooooo-oo-oooooo",
+"oooooooooooooooo",
+"oooooo@oo@oooooo",
+"oooooooooooooooo",
+"oooooo-oo-oooooo",
+"oooooooooooooooo",
+"oooooo@oo@oooooo",
+"oooooooooooooooo",
+
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"@o-o@o-o@o-o@o-o",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"@o-o@o-o@o-o@o-o",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"........X.......",
+"        X       ",
+"       XX       ",
+"................",
+"      X         ",
+"     X          ",
+"      +         ",
+"       +        ",
+"        ++      ",
+"         +      ",
+"         +      ",
+
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .X .      ",
+"      .XX.      ",
+"      .  .      ",
+"     X.  .      ",
+"    X .  .      ",
+"     +.  .      ",
+"      .  .      ",
+"      .+ .      ",
+"      . +.      ",
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .  X......",
+"      . X       ",
+"      .X        ",
+"      ..........",
+"     X          ",
+"    X           ",
+"     +          ",
+"      +         ",
+"       + +      ",
+"        +       ",
+"       +        ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"      X.........",
+"      .X        ",
+"      . X       ",
+"     X.  .......",
+"    X .  .      ",
+"     +.  .      ",
+"      .  .      ",
+"      .+ .      ",
+"      . +.      ",
+"      .  .      ",
+"      .  .      ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+".........X      ",
+"        X.      ",
+"       X .      ",
+".......  .      ",
+"     X.  .      ",
+"    X .  .      ",
+"     +.  .      ",
+"      .  .      ",
+"      .+ .      ",
+"      . +.      ",
+"      .+ .      ",
+
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"......X  .      ",
+"       X .      ",
+"      X X.      ",
+"..........      ",
+"    X           ",
+"   X            ",
+"    +           ",
+"     +          ",
+"      +         ",
+"       +        ",
+"        +       ",
+
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"......X.........",
+"       X .      ",
+"       XX.      ",
+".........X......",
+"     X          ",
+"    X           ",
+"     +          ",
+"      +         ",
+"       +        ",
+"        +       ",
+"                ",
+
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      X.........",
+"      .X .      ",
+"      .XX.      ",
+"      .  X......",
+"     X.  .      ",
+"    X .  .      ",
+"     +.  .      ",
+"      .  .      ",
+"      .+ .      ",
+"      . +.      ",
+"      .  .      ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"......X.........",
+"      .X        ",
+"      .XX       ",
+".........X......",
+"     X.  .      ",
+"    X .  .      ",
+"     +.  .      ",
+"      .  .      ",
+"      .+ .      ",
+"      . +.      ",
+"      .  .      ",
+
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"......X  .      ",
+"      .X .      ",
+"      .XX.      ",
+".........X      ",
+"     X.  .      ",
+"    X .  .      ",
+"     +.  .      ",
+"      .  .      ",
+"      .+ .      ",
+"      . +.      ",
+"      .  .      ",
+
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"......X.........",
+"      .X .      ",
+"      .XX.      ",
+".........X......",
+"     X.  .      ",
+"    X .  .      ",
+"     +.  .      ",
+"      .  .      ",
+"      .+ .      ",
+"      . +.      ",
+"      .  .      ",
+
+"      .  .      ",
+"      .  .      ",
+"      .  .      ",
+"X++ X+. X.+ X++ ",
+"X++ X+. X.+ X++ ",
+"@@@@@@.@@.@@@@@@",
+"X++.X+..X.+.X++.",
+"X++ X+. X.+ X++ ",
+"X++ X+. X.+ X++ ",
+"X++ X+. X.+ X++ ",
+"@@@@@@.@@.@@@@@@",
+"X++.X+..X.+.X++.",
+"X++ X+. X.+ X++ ",
+"XXX XX. X.X XXX ",
+"      .  .      ",
+"      .  .      ",
+
+"     @.   @.    ",
+"  X++@++++@++   ",
+"  X++@++++@++   ",
+"  XXX@XXXX@XX   ",
+"     @.   @.    ",
+"................",
+"  X++@++++@++   ",
+"  XXX@XXXX@XX   ",
+"................",
+"  X++@++++@++   ",
+"  X++@++++@++   ",
+"  XXX@XXXX@XX   ",
+"     @.   @.    ",
+"  X++@++++@++   ",
+"  X++@++++@++   ",
+"  XXX@XXXX@XX   ",
+
+" XXXXXXXXXXXXXXX",
+" %%%%%%%%%%%%%%X",
+" %%%%%%%%%%%%%%X",
+" %%%%%%%%%%%%%%X",
+" %%%%%%%%%%%%%%X",
+" %%%%%%%%%%%%%%X",
+" %%%%%%%%%%%%%%X",
+" %%%%%%%%%%%%%%X",
+".%%%%%%%%%%%%%%X",
+" %%%%%%%%%%%%%%X",
+" %%%%%%%%%%%%%%X",
+".%%%%%%%%%%%%%%X",
+" %%%%%%%%%%%%%%X",
+" %%%%%%%%%%%%%%X",
+" %%%%%%%%%%%%%%X",
+" XXXXXXXXXXXXXXX",
+
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oo@@@@oooo@@@@oo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oo@@@@oooo@@@@oo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+
+"oooooooooooooooo",
+"oooo@oooooo@oooo",
+"oooo@oooooo@oooo",
+"oooo@oooooo@oooo",
+"oooo@oooooo@oooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooo@oooooo@oooo",
+"oooo@oooooo@oooo",
+"oooo@oooooo@oooo",
+"oooo@oooooo@oooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+
+"                ",
+"                ",
+"                ",
+"X++ X++ X++ X++ ",
+"X++ X++ X++ X++ ",
+"@@@@@@@@@@@@@@@@",
+"X++.X++.X++.X++.",
+"X++ X++ X++ X++ ",
+"X++ X++ X++ X++ ",
+"X++ X++ X++ X++ ",
+"@@@@@@@@@@@@@@@@",
+"X++..++.X++.X++.",
+"X++ X++ X++ X++ ",
+"XXX XXX XXX XXX ",
+"                ",
+"                ",
+
+"     @.   @.    ",
+"  X++@++++@++   ",
+"  X++@++++@++   ",
+"  XXX@XXXX@XX   ",
+"     @.   @.    ",
+"  X++@++++@++   ",
+"  X++@++++@++   ",
+"  XXX@XXXX@XX   ",
+"     @.   @.    ",
+"  X++@++++@++   ",
+"  X++@++++@++   ",
+"  XXX@XXXX@XX   ",
+"     @.   @.    ",
+"  X++@++++@++   ",
+"  X++@++++@++   ",
+"  XXX@XXXX@XX   ",
+
+"     @.   @.    ",
+"     @.    @++  ",
+"     @.   +@+X +",
+"      @  ++.@ ++",
+"      @+++X .@@X",
+"      +@+X   ++@",
+"    X++.@   ++X.",
+"     X+X.@  ++X ",
+"      X  .@++X  ",
+"          +@@   ",
+"         +++.@@@",
+"         X+X ...",
+"          X     ",
+"                ",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"          +     ",
+"        X+++ @@@",
+"         X+@@...",
+"          @.+   ",
+"         @.++   ",
+"     ++ @. X++  ",
+"    X++@.   ++ @",
+"     X@.++  X@@.",
+"      @X+++ @.+ ",
+"     @.  X+@.X++",
+"     @.   X@++  ",
+"     @.   @.X+  ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"     +          ",
+"@@@ +++         ",
+"...@@+X         ",
+"   ..@          ",
+"   ++.@         ",
+"  ++X .@++      ",
+"@++X   .@++     ",
+".@@   +++@      ",
+" +.@+++X @      ",
+"++X.@+X   @     ",
+" X++@X    @.    ",
+" X+X @    @.    ",
+
+"  +  @.   @.    ",
+"  ++@.    @.    ",
+"++X+@++   @.    ",
+"X+ @.X+++@.     ",
+" @@.  X++@+     ",
+"@.++   X@+++    ",
+".X++   @.X+     ",
+"  X++ @.        ",
+"   X+@.         ",
+"   @@++         ",
+"@@@..+++        ",
+"...  X+         ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"    @@.   @@    ",
+"    @@.   @@    ",
+"   @. @  @. @   ",
+"  @.  @. @   @  ",
+"@@.    @@.    @@",
+"@@@@@@.@@.@@@@@@",
+"......@..@......",
+"     @.   @     ",
+"    @.     @    ",
+"  @@.       @@  ",
+"@@@@@@@@@@@@@@@@",
+"................",
+"                ",
+"     .@@        ",
+"     ...        ",
+"                ",
+
+"     @.   @@    ",
+"     @.   @@    ",
+"     @@   @.@   ",
+"     @@   @..@  ",
+"     @.@  @. .@@",
+" .@  @. @ @.  @@",
+" .@  @.  @..@@..",
+" ..  @.   @@.   ",
+"     @.   @@    ",
+"     @.  @..@@  ",
+"     @. @.@. .@@",
+"     @.@. @.  @@",
+"     @@.  @. @. ",
+"     @@   @.@.  ",
+"     @.   @@.   ",
+"     @.   @@    ",
+
+"                ",
+"     .@@        ",
+"     ...        ",
+"                ",
+"                ",
+"@@@@@@@@@@@@@@@@",
+"..@@........@@..",
+"    @      @.   ",
+"     @    @.    ",
+"      @  @.     ",
+"@@@@@@.@@.@@@@@@",
+"@@.....@@.....@@",
+"  @   @. @   @. ",
+"   @  @  @  @.  ",
+"    @@.   @@.   ",
+"    @@.   @@.   ",
+
+"    @@.   @.    ",
+"    @@.   @.    ",
+"   @.@.  @@.    ",
+"  @. @.  @@.    ",
+"@@.  @. @.@.    ",
+"@@   @.@. @. .@ ",
+"..@@ .@.  @. .@ ",
+"   .@@.   @. .. ",
+"    @@.   @.    ",
+"  @@..@   @.    ",
+"@@.  @.@  @.    ",
+"@@   @. @ @.    ",
+"  @  @.  @@.    ",
+"   @ @.  @@.    ",
+"    @@.   @.    ",
+"    @@.   @.    ",
+
+".@   @.   @.    ",
+"..   @.   @.    ",
+"     @.   @.    ",
+"     @.   @.    ",
+"     @.   @.    ",
+"@@@@@.@@@@.@@@@@",
+".....@....@.....",
+"     @.   @.    ",
+"     @.   @.    ",
+"     @.   @.    ",
+"@@@@@.@@@@.@@@@@",
+".....@....@.....",
+"     @.   @     ",
+"     @.   @     ",
+"     @.   @     ",
+"     @.   @     ",
+
+"  X...........  ",
+"  X...........  ",
+"  X*.*.*.*.*.*  ",
+"  X...........  ",
+"  X...........  ",
+"@@@@@@@@@@@@@@@@",
+"...XXXXXXXXXXX..",
+"  X...........  ",
+"  X...........  ",
+"  X...........  ",
+"@@@@@@@@@@@@@@@@",
+"...XXXXXXXXXXX..",
+"  X...........  ",
+"  X...........  ",
+"  X*.*.*.*.*.*  ",
+"  X...........  ",
+
+"     @.   @.    ",
+"     @.   @.    ",
+"..*..@X...@X..*.",
+".....@X...@X....",
+"..*..@X...@X..*.",
+".....@X...@X....",
+"..*..@X...@X..*.",
+".....@X...@X....",
+"..*..@X...@X..*.",
+".....@X...@X....",
+"..*..@X...@X..*.",
+".....@X...@X....",
+"..*..@X...@X..*.",
+"XXXXX@.XXX@.XXXX",
+"     @.   @.    ",
+"     @.   @.    ",
+
+"  X...........  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"XXXXXXXXXXXXXXXX",
+"  X...........  ",
+"  X...........  ",
+"XXXXXXXXXXXXXXXX",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X.....%.....  ",
+"  X...........  ",
+"  X...........  ",
+
+"X###############",
+"X#XXXXXXXXXXXXXX",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+
+"################",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"################",
+"XXXXXXXXXXXXXXX#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+
+"                ",
+"                ",
+"  #######       ",
+" XX##XXX##      ",
+"  X##  XX##     ",
+"  X##   X##     ",
+"  X##   X##     ",
+"  X##   ##      ",
+"  X######       ",
+"  X##XX##       ",
+"  X## XX##      ",
+"  X##  XX##     ",
+"  ####  ####    ",
+" XXXX  XXXX     ",
+"                ",
+"                ",
+
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X#              ",
+"X###############",
+"XXXXXXXXXXXXXXXX",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"################",
+"XXXXXXXXXXXXXXXX",
+
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"              X#",
+"################",
+"XXXXXXXXXXXXXXXX",
+
+"                ",
+"                ",
+" +      +       ",
+"            +   ",
+"    @XXXXX      ",
+"   @@XXXXX      ",
+"   @@XXXXX  $   ",
+" + @@.....   +  ",
+"   @..X..+      ",
+"    ++++++  $   ",
+" @@       @XXXX ",
+" @@@@@@  @@XXXX ",
+" +@@@@@  @@.... ",
+"  @@@@@  @..X.  ",
+"  @       +     ",
+"  @             ",
+
+"                ",
+"+        #..... ",
+"   +   +##.XXXX ",
+"        ##$$$$$ ",
+"        #$$$$$++",
+"         +++++++",
+"    @@@   ++++++",
+"   O@@.         ",
+"  O+@@.    @@@@@",
+"  +O@@.@@@ @@@  ",
+" +O+@@.... @@@  ",
+"  +O@..... @@@  ",
+"  O+XXXXX+ @@@  ",
+"  +XXXXX++  +   ",
+"   +++++++      ",
+"    +++++       ",
+
+"@ @ @  @ @ @ @ @",
+"                ",
+"@  ....   .... @",
+"  &.XXX@ #.XXX  ",
+"@ &.XXX  #.XXX @",
+"  &++++@ #$$$+  ",
+"@  ++++   ++++ @",
+"  +    +        ",
+" @ @ @ @ @ @ @ @",
+"   ....   ....  ",
+"@ o.XXX @-.XXX @",
+"  o.XXX  -.XXX  ",
+"@ oOOO+ @-@@@+ @",
+"   ++++   ++++  ",
+"@+   +  @      @",
+"  @ @ @   @ @ @ ",
+
+"                ",
+" $ $ $ $ $ $ $ $",
+"                ",
+" $#$ $ $ $ $ $ $",
+"     oXXXX@@@@@@",
+" $ $o@XXXX@@ $ $",
+"    @oXXXX@@    ",
+" $ $o@XXXX@@ # $",
+"    @oXXXX+     ",
+" $ $o@XXXX+$#$#$",
+"    @oXXXX+     ",
+" # $o@O.O.+$ $ $",
+"    @O.O.++     ",
+" $ $ $+$+$+$ $ $",
+"             #  ",
+" $ $ $ $ $ $ $ $",
+
+"                ",
+" $ $ $ $ $ $ $ $",
+"                ",
+" $ $ $ $ $ $ $ $",
+"    &.......    ",
+" $ &&..XXXXX $ $",
+"   &&.XXXX.X    ",
+" $ .&XXXXXXX+$ $",
+"   &&+.++.+++   ",
+" $ &+++X+++$+$ $",
+"    +++++++++   ",
+" $ $ $@@@@@$ $ $",
+"      @@@@@     ",
+" $ $ $@@@@@$ $ $",
+"         @@     ",
+" $ $ $ $ @@$ $ $",
+
+"                ",
+" # # # # # # # #",
+"                ",
+" # # # # # # # #",
+"                ",
+" # # @X......# #",
+"    @@..XXXXX   ",
+" # #.@.XXXXXX$ #",
+"    @@XXXXXXX+  ",
+" # #.@.......$ #",
+"    @...X...++  ",
+" # # $+$.$+$+$ #",
+"       @@@@@@@@ ",
+" # # # @@@@@@@@#",
+"             @@ ",
+" # # # # # # @@#",
+
+" #$#############",
+" ##=..........X#",
+" #==.........XX#",
+" #@=..XXXXXX.XX#",
+" #==.XXXXXX..XX#",
+" #=++++++++..XX$",
+" #++.+.++++..XX$",
+" ##$$$$$$+=..XX$",
+" #.......==..XX$",
+" #.OOOOO.==..XX$",
+" @@@oooO.@=..XX$",
+" #.ooooO.==.XXX$",
+" #.......=++++$$",
+" ########++.+$$#",
+" #########$$$$$$",
+" $#$#$#$#$######",
+
+"################",
+"#$$$$&$$$$$$$$$#",
+"#$$$$$$&$$.....#",
+"#$$...$$$*...XX#",
+"#$*..Xo$**.XX.X#",
+"#**..X$$**=*..X#",
+"#**..X$$*=**..X#",
+"#**..X$$$$**..X#",
+"# *...........X#",
+"#**...........X#",
+"# *..XXXXXXXXXX#",
+"#**============#",
+"#*==++=+=+=+==$#",
+"#$$$$$$$$$$$$$$#",
+"#$$$$$$$$$$$$$$#",
+"################",
+
+"#$#$#$#$#$#$#$#$",
+"##########@#####",
+"$#########@@###$",
+"###o@........###",
+"$#oo.@......X##$",
+"##oo..XXXXXXX###",
+"$#oo..XXXXXXX$#$",
+"##oo..XOOO..O$##",
+"$#oo..XOO..O$$#$",
+"##oo..X$$@@$$$##",
+"##oo...$@@@@###$",
+"$#ooOOO$@@@@####",
+"##oOOO$$@@@@#$#$",
+"$##$$$$$#@@#####",
+"#########@@#$##$",
+"$#$#$#$##@@###$#",
+
+"################",
+"#$########$#####",
+"###%@@@@@@@@@@.#",
+"##%%@@@........#",
+"#%-%@@.........#",
+"#%%%@..........#",
+"#--%----@--@---#",
+"#%%-@-@---@-@-$#",
+"#%------.----$$#",
+"##$$$$$---$$$$$#",
+"###$$$.....$$$##",
+"#$##@@@@@@@@@###",
+"###@@@#####@@@$#",
+"###@@#$#####@@##",
+"#$#@@###$###@@##",
+"###@@#######@@##",
+
+" # # # # # # # #",
+"# # # # # # # # ",
+" # %...........#",
+"# %%..........X ",
+" %@%...XX.XX.XX#",
+"#%%%..-X.-X.-XX ",
+" %@%XXXXXXXXXXX#",
+"#%%%.-@---@--.- ",
+" %%..X--@--%..X#",
+"#%%..X-@-@%%..X ",
+" @%..X # #@%..X#",
+"#%%.XX#oo %%.XX ",
+" %@--- oo#%@---#",
+"#@--- #oo @---# ",
+" # # # # # # # #",
+"# # # # # # # # ",
+
+"#$######$#######",
+"##%%%%%%%%%%%%-#",
+"#%%@@@@@@@@@@@-#",
+"#%%@@@@@@@@@@@-#",
+"#@%@@@@@-@-----$",
+"#%%@@@@@-@----$$",
+"#@%@@@@@-$$$$$$$",
+"#%------$$$$$$$$",
+"#-@-%@@@$#o%---#",
+"##$$%@@@$o#%@@-#",
+"###o%@@@oo#%@@-#",
+"#$oo%%%%%%%%@@-$",
+"##o#%%@@@@@@@@-$",
+"####%%@@@@@@@@-$",
+"##$#%---------$$",
+"####--@-@-@--$$$",
+
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$              ",
+"$$              ",
+"$$ +   $   +.   ",
+"$$              ",
+"$$              ",
+"$$             .",
+"$$   .   $    ..",
+"$$  $        ...",
+"$$    @     ....",
+"$$          ....",
+"$$     .    ....",
+"$$        $ ....",
+"$$       $  ....",
+"$$          ....",
+
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"                ",
+"    $       $   ",
+"                ",
+" ...............",
+"..@@@@@@@@@@@@@@",
+"..@@@@@@@@@@@@@@",
+"..@@@@@@@@@@@@@@",
+"..@@@@@@@@@@@@@.",
+"..@@@@@@@@@@@@.@",
+"..@@@@@@@@@@@@@@",
+"..@@@@@@@@@@@@@@",
+"..@@@@@@@@@@@@@@",
+"..@@@@@@@@@@@@@@",
+"..XXXXXXXXXXXXXX",
+
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"              $$",
+"              $$",
+"              $$",
+"............. $$",
+"@@@@@@@@@@@@X $$",
+"@@@@@@@@@@@@X $$",
+"@@@@@@@@@@@@X $$",
+"@@@@@.@@@@@@X $$",
+"@@@@.@@@@@@@X $$",
+"@@@@@@@@@@@@X $$",
+"@@@@@@@@@@@@X $$",
+"@@@@@@@@@@@@X $$",
+"@@@@@@@@@@@@X+$$",
+"XXXXXXXXXXXXX+$$",
+
+"$$     +    ....",
+"$$  +       ....",
+"$$          ...@",
+"$$         ...XX",
+"$$      +   .XXX",
+"$$    @      +++",
+"$$$ .        @++",
+"$$     @ @@@ @@+",
+"$$      @@@@@@@ ",
+"$$     @@@@@@@@@",
+"$$+   @@@@@@@@@@",
+"$$    @@@@@@@@@@",
+"$$     @ @@@@@@@",
+"$$     @@@ @@@@@",
+"$$    @@@@@@@@@@",
+"$$     @@@@@@@@@",
+
+".XX@XXX@XXX@XXX@",
+"X@XXX@XXX-XXX@X.",
+"XXX@XXX@XXX@XX..",
+"X@XXX@XXX@XXX...",
+"XXXXXXXXXXXX....",
+"++++++.+++++....",
+"+$++..++.+++....",
+"........++++....",
+"........++++....",
+"@@@@@@@@@   ....",
+"@@@@@@@@ @  ....",
+"@@@@@@@@@   ....",
+"@@@@@@@@@@  ....",
+"@@@@@@@@@@  ....",
+"@@@@@@@@@   ....",
+"@@@@@@@@@@  ....",
+
+"XXX@XXX@XXXX++$$",
+"..........X+++$$",
+"@@@@@@@@@@X+++$$",
+"@@@@@@@@@@X+++$$",
+"@@$$$$$@@@X+++$$",
+"@@$$@@$$@@X+++$$",
+"@@$$@@$$@@X+++$$",
+"@@$$$$$@@@X+++$$",
+"@@$$$$@@@@X+++$$",
+"@@$$@$$@@@X+  $$",
+"@@$$@@$$@@X+  $$",
+"@@@@@@@@@@X+$ $$",
+"@@@@@@@@@@X+  $$",
+"@@@@@@@@@@X+  $$",
+"@@@@@@@@@@X+  $$",
+"@@@@@@@@@@X+$ $$",
+
+"$$+    @@@@@@@ @",
+"$$     @@@@@@@@@",
+"$$     @ @@@@@@@",
+"$$       @ @@@@@",
+"$$     @   @ @@@",
+"$$           @@@",
+"$$         @@@@@",
+"$$          @ @@",
+"$$       $   @ @",
+"$$   +      @@@@",
+"$$   +       @@@",
+"$$      .     @@",
+"$$          @ @@",
+"$$          @ @ ",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+
+"@@@ @@@@@@  ....",
+"@@@@@@@     ...X",
+" @@@@   @   ..X@",
+"@    @   $  .XXX",
+"@            +++",
+"@@   + $      ++",
+"@         +    +",
+"@@ @            ",
+"@@        .     ",
+" @ @            ",
+"@@@             ",
+"@@@@  $  +     @",
+"                ",
+"@@             $",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+
+"XXXXXXXXXXX+  $$",
+"X@XXX@XXXX++  $$",
+"XXX@XXX@X+++  $$",
+"XXXXXXXX++++  $$",
+"++++++++++++  $$",
+"++++++++++++  $$",
+"++++++++++++  $$",
+"              $$",
+"      .       $$",
+"              $$",
+"$        +    $$",
+"    +         $$",
+"              $$",
+"             .$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$    +         ",
+"$$      ........",
+"$$+    ..XXXXXXX",
+"$$    ...+++++++",
+"$$   .@..+++++++",
+"$$  .....+++++++",
+"$$ .@....+++++++",
+"$$ ...@..+++++++",
+"$$ ......+++++++",
+"$$ .@....+++++++",
+"$$ ...@..XXXXXXX",
+"$$ .....XXXXXXXX",
+"$$ .@..XXX.XX.XX",
+"$$ ...XXXXXXXXXX",
+
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"                ",
+"................",
+"XXXXXXXXXXXXXXXX",
+"++++++++++++++++",
+"++++++++++++++++",
+"++++++++++++++++",
+"++++++++++++++++",
+"++++++++++++++++",
+"++++++++++++++++",
+"++++++++++++++++",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+".XX.XX.XX.XX.XX.",
+"XXXXXXXXXXXXXXXX",
+
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"              $$",
+".... +   +    $$",
+"XXXX          $$",
+"+++X       +  $$",
+"+++X          $$",
+"+++X   @@@@@@@$$",
+"+++X   oOO@@@@$$",
+"+++X + oOO@@@@$$",
+"+++X   @@@@@@@$$",
+"+++X   @@@@@@@$$",
+"XXXX+  *=*@@@@$$",
+"XXX++  *=*@@@@$$",
+"XX+++  @@@@@@@$$",
+"X++++  @@@@@@@$$",
+
+"$$ ..XXX.XX.XX.X",
+"$$ .XXXXXXXXXXXX",
+"$$  ++++++++++++",
+"$$+  +++++++++++",
+"$$    ++++++++++",
+"$$  #  +++++++++",
+"@@@@@@@@........",
+"@@@@@@@@@.......",
+"@--@@@--@@@--@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"$$ @@@@@        ",
+"$$ @@@@@  +#  @@",
+"$$ @@@@@ $   @@+",
+"$$$@@@@@    @@@+",
+"$$ @@@@@   @@@@+",
+
+"X.XX.XX.XX.XX.XX",
+"XXXXXXXXXXXXXXX+",
+"++++++++++++++++",
+"++++++++++++++++",
+"++++++++++++++++",
+"++++++++++++++++",
+"................",
+"................",
+"--@@@--@@@--@@@-",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"                ",
+"@@@@@@@@@@@@@@@@",
+"++++++++++++++++",
+"+@++++++++++++++",
+"+.++++++++++$$$$",
+
+"+++++  @@@@@@@$$",
+"+++++  @@@@@@@$$",
+"+++++  @@@@@@@$$",
+"+++++  @@@@@@@$$",
+"+++++  @@@@@@@$$",
+"+++++ #@@@@@@@$$",
+".....@@@@@@@@@@@",
+".....@@@@@@@@@@@",
+"-@@@--@@@--@@@--",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"              $$",
+"@@@@@@@@@@@@@ $$",
+"++++++++++++. $$",
+"++++++++++@+. $$",
+"$+++++++++++. $$",
+
+"$$ $#$@@  @@@@@+",
+"$$ $#$@@ @@@.@@+",
+"$$ @@@@@ @@@@@@+",
+"$$#@@@@@ @.@@@@+",
+"$$ @@@@@ @@@.@@+",
+"$$ @@@@@ @@@@@@+",
+"$$ &&&@@ @.@@@@+",
+"$$ &&&@@ @@@.@@.",
+"$$$@@@@@ @@@@@..",
+"$$       @.@@...",
+"$$       @@@....",
+"$$    +  @@...X.",
+"$$       @......",
+"$$+       ++++++",
+"$$         +++++",
+"$$$$$$$$$$$$$$$$",
+
+"++++++++++++$$++",
+"++++++++++++$$++",
+"++++++++++++$$$$",
+"++++++++++++$$$$",
+"++++++++++++$$+$",
+"+@++++++++++$$++",
+"++++++++++++++++",
+"................",
+"................",
+"X..X..X..X..X..X",
+"................",
+".X..X..X..X..X..",
+"................",
+"++++++++++++++++",
+"++++++++++++++++",
+"$$$$$$$$$$$$$$$$",
+
+"$$++++++++++. $$",
+"$$++++++++++. $$",
+"$+++++++++++. $$",
+"++++++++++++.+$$",
+"$+++++++++++.+$$",
+"$$++++++++@+.+$$",
+"++++++++++++.+$$",
+".............+$$",
+"............++$$",
+"..X..X..X..+++$$",
+"..........++++$$",
+"X..X..X..+++++$$",
+"........++++++$$",
+"++++++++++++++$$",
+"++++++++++++++$$",
+"$$$$$$$$$$$$$$$$",
+
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$ ##   --------",
+"$$###  @-X.X.X.X",
+"$$##  @@-.......",
+"$$   @@@-.......",
+"$$  @@@@-.......",
+"$$ @.@@@-.......",
+"$$ @@@@@-.......",
+"$$ @.@@@-......@",
+"$$ @@@@@-.....@.",
+"$$ @.@@@-.......",
+"$$ .@@@@-.......",
+"$$ @.@@@-.......",
+"$$ @@@@@--------",
+"$$ @.@@@........",
+
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"---          $  ",
+".X-  $          ",
+"..-.............",
+".X-.............",
+"..-.............",
+".X-.............",
+"..-.............",
+".X-.............",
+"..-.............",
+".X-.............",
+"..-@@@@@@@@@@@@@",
+".X-@.@.@.@.@.@.@",
+"---.@.@.@.@.@.@X",
+"..++++++++++++..",
+
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"              $$",
+" @@@@@@@@@@@  $$",
+".@.........@  $$",
+".@++++++++.@  $$",
+".@++++++++.@  $$",
+".@++++++++.@  $$",
+".@+++ ++++.@  $$",
+".@++ +++++.@  $$",
+".@++++++++.@  $$",
+".@++++++++.@  $$",
+"@@++++++++.@  $$",
+".@++++++++.@  $$",
+".@++++++++.@  $$",
+".@++++++++.@  $$",
+
+"$$ @@@@.X.X.X.X.",
+"$$ @.@..........",
+"$$ @@@@.........",
+"$$ @.@..........",
+"$$ @@@@.........",
+"$$ @.@..........",
+"$$ @@@@.........",
+"$$ @.@..........",
+"$$ @@@@.........",
+"$$ @.@..........",
+"$$ @@@@.........",
+"$$ @.@...-------",
+"$$ @@@@.@-XXXXXX",
+"$$ @.@@@@-......",
+"$$ @@@@.@-......",
+"$$ @.@.@@-......",
+
+"X+++++++++++++X.",
+".+++++++++++++..",
+".++           X.",
+".++    $  $   ..",
+".++         $ X.",
+".++           ..",
+".++      $    X.",
+".++  $        ..",
+".++           .@",
+".++    $      @@",
+".++          @@@",
+"----------------",
+"XXXXXXXXXXXXXXXX",
+"................",
+".......$$$$$....",
+".......$$..$$...",
+
+".@++++++++.@  $$",
+".@++++++++.@ $$$",
+".@++++++++.@  $$",
+".@++++++++.@  $$",
+".@++++++++.@  $$",
+".@++++++++.@  $$",
+".@++++++++.@  $$",
+"@@@@@@@@@@@@@ $$",
+"@XXXXXXXXXXX@ $$",
+"@......+...X@ $$",
+"@..+++..+..X@+$$",
+"--.+..@@@@.X@+$$",
+"X-..+..@.+.X@+$$",
+"X-..+.@.+..X@+$$",
+"X-...++....X@+$$",
+"X-....+.+..X@+$$",
+
+"$$ @@@@@.-......",
+"$$ @.@.@@-......",
+"$$ @@@@@.-.... .",
+"$$ @.@.@@-......",
+"$$ @@@@@.-.... .",
+"$$ @@@.@@-......",
+"$$ @.@@@@-......",
+"$$ .@@.@@-------",
+"$$ @.@@@..+.....",
+"$$ @@@@.........",
+"$$ @.@......$...",
+"$$ @@...........",
+"$$ @....X......X",
+"$$  ++++++++++++",
+"$$   +++++++++++",
+"$$$$$$$$$$$$$$$$",
+
+".......$$..$$...",
+".......$$$$$....",
+" . ....$$$$.....",
+".......$$.$$....",
+" . ....$$..$$...",
+"................",
+"................",
+"----------------",
+"................",
+"................",
+"$...$...$...$...",
+"................",
+"......X.....X...",
+"++++++++++++++++",
+"++++++++++++++++",
+"$$$$$$$$$$$$$$$$",
+
+"X-++++.++++X@+$$",
+"X-++..++.++X@+$$",
+"X-+.++..+.+X@+$$",
+"X-+.+.+@+++X@+$$",
+"X-+++++@+.+X@+$$",
+"X-++++@+..+X@+$$",
+"X-++.+..+++X@+$$",
+"--+++++++++X@+$$",
+".@@@@@@@@@@@@+$$",
+"............++$$",
+"...........+++$$",
+"..........++++$$",
+"...X.....+++++$$",
+"++++++++++++++$$",
+"++++++++++++++$$",
+"$$$$$$$$$$$$$$$$",
+
+"$$$$$$$$$$$$$$$$",
+"$        OOOOOOO",
+"$       OO@@@@@@",
+"$      O.O@@@@@@",
+"$     OOOO@@@@@@",
+"$    O.O.O@@@.@@",
+"$   OOOOOO@@@@@@",
+"$  O.O.O.O@@@@@@",
+"$  OOOOOOO@@@.@@",
+"$  O.O.O.O@@@@@@",
+"$  OOOOOOO@@@@@@",
+"$  O.O.O.O@@@@@@",
+"$  OOOOOOO@@@@@@",
+"$  O.O.O.O@@@@@@",
+"$  OOOOOOO@@@@@@",
+"$  O.O.OOOXOXOXO",
+
+"$$$$$$$$$$$$$$$$",
+"OOOO       &XXXX",
+"@@@X      &&@@@@",
+"@@@O     &.&@@@@",
+"@@@X.....&&&@@@@",
+"@@@O.....&.&@@@@",
+"@@@X.....&&&@@@@",
+"@@@O.....&.&@@@@",
+"@@@X.....&&&@@@@",
+"@@@O.....&&XXXXX",
+"@@@X.....&XXXXXX",
+"@@@OXXXXXXXXXXXX",
+"@@@XXXXXXXXXXXXX",
+"@@@OXXXXXXXXXXXX",
+"@@@X+++++++++++X",
+"XOXO++++++++++XX",
+
+"$$$$$$$$$$$$$$$$",
+"XXXXXXXXXXXXXX $",
+"@@@@@@@@@@@@@X $",
+"@@@@@@@@.@@@@X $",
+"@@@@@@@@..@@@X $",
+"@@@@@@@@@@@@@X $",
+"@@@@@@@@@@@@@X $",
+"@@@@@@@@@@@@@X $",
+"@@@@@@@@@@@@@X $",
+"XXXX@@@@@@@@XX $",
+"XXXX@@@@@@@@XX $",
+"XXXX@@@@@@@@XX $",
+"XXXX@@@@@@@@XX $",
+"XXXXXXXXXXXXXXXX",
+"@@@@@@@@@@@@@@@X",
+"@@@@@@@@@@@@@@@X",
+
+"$  OOOOOOXOXOXOX",
+"$  O.O.OXOXOXO&&",
+"$  OOOO......&&X",
+"$  O.O......&&&@",
+"$  OOOO....&&&&@",
+"$  O.O....&&.&&@",
+"$  OOOO..&&&&&&@",
+"$  O.OO.&&.&&&&@",
+"$  OOOO&&&&&.&&@",
+"$  OOO&&.&&&&&&@",
+"$  OO&&&&&.&&&&@",
+"$  O&&.&&&&&.&&@",
+"$  &&&&&.&&&&&&@",
+"$  &.&&&&&.&&&&@",
+"$  &&&.&&&&&.&&@",
+"$  &&&&&.&&&&&&@",
+
+"OXO++++++++++XXX",
+"&&&&&&&&&&&&&&&&",
+"XXXXXXXXXXXXXXXX",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@.@@@@@@@@@@@@@",
+"@.@@@@@@@$$$$$@@",
+"@@@@@@@@@$$@@$$@",
+"@@@@@@@@@$$@@$$@",
+"@@@@@@@@@$$$$$@@",
+"@@@@@@@@@$$$$@@@",
+"@@@@@@@@@$$@$$@@",
+"@@.....@@$$@@$$@",
+"@.@@@.@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+
+"@@@@@@@@@@@@@@@X",
+"&&&&&&&&&&@@@@@X",
+"XXXXXXXXX.@@@@@X",
+"@@@@@@@@X.@@@@@X",
+"@@@@@@@@X.@@@@@X",
+"@@-.@@@@X.@@@@@X",
+"@@-.@@@@X.@@@@@X",
+"@@@@@@@@X.@@@@@X",
+"@@@@@@@@X.@@@@@X",
+"@@@@@@@@X.@@@@@X",
+"@@-.@@@@X.@@@@@X",
+"@@-.@@@@X.@@@@@X",
+"@@@@@@@@X.@@@@@X",
+"@@@@@@@@X.@@@@@X",
+"@@@@@@@@X.@@@@@X",
+"@@@@@@@@X.@@@@@X",
+
+"$  &.&&&&&.&&&&@",
+"$  &&&.&&&&&.&&.",
+"$  &&&&&.&&&&&..",
+"$  &.&&&&&.&&..X",
+"$  &&&.&&&&&....",
+"$  &&&&&.&&..X@.",
+"$  &.&&&&&......",
+"$  &&&.&&..X@..X",
+"$  &&&&&........",
+"$  &.&&..X@..X@.",
+"$  &&&..........",
+"$  &&..X@..X@..X",
+"$  &............",
+"$   ++++++++++++",
+"$    +++++++++++",
+"$$$$$$$$$$$$$$$$",
+
+"@@@@@@@@@@@@@@@@",
+"................",
+"................",
+"@..X@..X@..X@..X",
+"................",
+".X@..X@..X@..X@.",
+"................",
+"@..X@..X@..X@..X",
+"................",
+".X@..X@..X@..X@.",
+"................",
+"@..X@..X@..X@..X",
+"................",
+"++++++++++++++++",
+"++++++++++++++++",
+"$$$$$$$$$$$$$$$$",
+
+"@@@@@@@@X.@@@@@X",
+"..........@@@@@X",
+".........@@@@@@X",
+"@..X@...@@@@@@@X",
+".......@@@@@@@@X",
+".X@.............",
+"...............%",
+"@..X@..X@..X@.$%",
+".............+$%",
+".X@..X@..X@.++$%",
+"...........+++$%",
+"@..X@..X@.++++$%",
+".........+++++$%",
+"++++++++++++++$%",
+"++++++++++++++$%",
+"$$$$$$$$$$$$$$$%",
+
+"################",
+"#               ",
+"#           #   ",
+"#               ",
+"#     &&&&&&&&&&",
+"#    &&.........",
+"#   &&&@@@@@@@@@",
+"#  &&&&@@@@@@@@@",
+"#  &&&&@@@@@@@@@",
+"#  &&&&@@.@@@@@@",
+"#  &&&&@@@@@@@@@",
+"#  &&&&@@@@@@@@@",
+"#  &&&&@@@@@@@@@",
+"#  &&&&@@@@@@@@@",
+"#  &&&&@@@@@@@@@",
+"#  &&&&@@@@@@@@@",
+
+"################",
+"  #             ",
+"         #      ",
+"            oooo",
+"&&&&&&&    oo...",
+"......&   ooo@@@",
+"@@@@@.&  oooo@@@",
+"@@@@@.&  o.oo@@@",
+"@@@@@.&  oooo@@@",
+"@@@@@.&  oooo@@@",
+"@@@@@.&  o.oo@@@",
+"@@@@@.&  ooooOOO",
+"@@@@@.&+ oooOOOO",
+"@@@@@.&+ ooOOOOo",
+"@@@@@.&+ oOOOOoo",
+"&&&&&&&+  ++++oX",
+
+"################",
+"               #",
+"               #",
+"oooooooooooo   #",
+"...........o   #",
+"@@@@@@@@@@.o   #",
+"@@@@@@@@.@.o   #",
+"@@@@@@@@@@.o   #",
+"@@@@@@@@@@.o   #",
+"@@@@@@@@@@.o   #",
+"@@@@@@@@@@.o+  #",
+"Oo@@@@@@@@.o+  #",
+"oo@@@@@@@@.o+  #",
+"oo@@@@@@@@.o+  #",
+"oo@@@@@@@@.o+  #",
+"oo@@@@@@@@.o+  #",
+
+"#  &&&&@@@@@@@@X",
+"#  &&&&@@@@@@@@X",
+"#  &&&&@@@@@@@@X",
+"#  &&&&@@@@@@@@X",
+"#  &&&&@@@.@@@@X",
+"#  &&&&@@@@@@@@X",
+"#  &&&&@$$$$$@@X",
+"#  &&&&@$$@@$$@X",
+"#  &&&&@$$@@$$@X",
+"#  &&&&@$$$$$@@X",
+"#  &&&&@$$$$@@@X",
+"#  &&&&@$$@$$@@X",
+"#  &&&&@$$@@$$@X",
+"#  &&&&@@@@@@@@X",
+"#  &&&&@@@@@@@@X",
+"#  &&&&@@@@@@@@X",
+
+"&&&&&&++   +++oo",
+"&&&&&+++      oo",
+"&&&&++++      oo",
+"&+++++++      Xo",
+"&+++++++  ----Xo",
+"&+        ----oo",
+"&+        --  oo",
+"&+      # --  oX",
+"&+   #  # --  oo",
+"&+        --  oX",
+"&+   #  # --  oo",
+"&+        --  oo",
+"&+    #   --  oO",
+"&+        --   +",
+"&+        --    ",
+"&+## -----------",
+
+"oo@@@@@@@@.o+  #",
+"oo@@@@@@@@.o+  #",
+"oo@@@@@@@@.o+  #",
+"oo@@@@@@@@.o+  #",
+"oo@@@@@@@@.o+  #",
+"oo@@@@@@@@.o+  #",
+"oo@@@@@@.@.o+  #",
+"oo@@@@@@@@.o+  #",
+"oo@@@@@@@@.o+  #",
+"ooOOOOOOOOOO+  #",
+"oOOOOOOOOOO++  #",
+"OOOOOOOOOO+++  #",
+"OOOOOOOOO++++  #",
+"+++++++++++++  #",
+"+++++++++++++  #",
+"------------   #",
+
+"#  &&&&@@@@@@@@X",
+"#  &&&&@@@@@@@@X",
+"#  &&&&@@@@@@@@X",
+"#  &&&&@@@@@@@@X",
+"#  &&&&@@@@@@@@X",
+"#  &&&&@@@@@@@@X",
+"#  &&&&@@@@@@@@X",
+"#  &&&&@@@@@..@X",
+"#  &&&&@@@@@@@@X",
+"#  &&&&&&&&&&&&&",
+"#  &&&&&&&&&&&&&",
+"#  &&&&&&&&&&&&+",
+"#  &&&&&&&&&&&++",
+"#   ++++++++++++",
+"#    +++++++++++",
+"################",
+
+"&+   --@------@-",
+"&@------@----@--",
+"&@-------@--@--@",
+"&+   -----------",
+"&+ # -----------",
+"&+   -----------",
+"&+ # -----------",
+"&+ ##-----------",
+"&+   -----@----@",
+"&+   ----@------",
+"++   ---@-------",
+"++   -----------",
+"++    #   ----- ",
+"++        ----- ",
+"++        ----- ",
+"##########-----#",
+
+"-@--@--@--@-   #",
+"@--@--@--@------",
+"--@--@--@-------",
+"----------------",
+"----------------",
+"----------------",
+"------------   #",
+"------------   #",
+"--@--@--@---   #",
+"@--@--@--@--   #",
+"-@--@--@--@-   #",
+"------------   #",
+"     #         #",
+"     #  #      #",
+" #             #",
+"################",
+
+"################",
+"#               ",
+"#               ",
+"#   #           ",
+"#     oooooooooo",
+"#    oo.........",
+"#   ooo@@@@@@@@@",
+"#  oooo@@@.@@@@@",
+"#  oooo@@@@@@@@@",
+"#  oooo@@@.@@@@@",
+"#  oooo@@@@@@@@@",
+"#  o=oo@@@@@@@@@",
+"#  oooo@@@@@@@@.",
+"#  oooo@@@@@@@@.",
+"#  oooo@@@@@@@@.",
+"#  oooo@@@@@@@@.",
+
+"##########@@@###",
+"          @@@   ",
+"          @@@   ",
+"          @@@   ",
+"ooooooooooo@@   ",
+"..........o@@  o",
+"@@@@@@@@@.o@@ oo",
+"@@@@@@@@@.o@@ oo",
+"@@@@@@@@@.o@@ oo",
+"@@@@@@@@@.o@@ oo",
+"@@@@@@@@@.o.@ oo",
+"oOOOOOOOOOO.@ oo",
+"oOOOOOOOOO..@ oo",
+"oOOOOOOOO+..@ oo",
+"oOOOOOOO++..@ oo",
+"o+++++++++..@ oo",
+
+"################",
+"               #",
+"               #",
+" ooooooooooo   #",
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O  ##",
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O   #",
+
+"#  oooo@@@@@@@@.",
+"#  oooo@@@@@@@@.",
+"#  oooo@@@@@@@@.",
+"#  o=oo@@@@@@@@.",
+"#  oooo@@@@@@@@.",
+"#  oooo@$$$$$@@.",
+"#  oooo@$$@@$$@.",
+"#  oooo@$$@@$$@.",
+"#  oooo@$$$$$@@.",
+"#  o=oo@$$$$@@@.",
+"#  oooo@$$@$$@@.",
+"#  oooo@$$@@$$@.",
+"#  oooo@@@@@@@@.",
+"#  oooo@@@@@@@@.",
+"#  oooo@@@@@@@@.",
+"#  oooo@@@@@@@@.",
+
+"o...........@#oo",
+"o...........@ oo",
+"o.@@@@@@@@@@@ oo",
+"o.@@@@@@@@@@@ oo",
+"o.@-@@@-@@@@@ oo",
+"o.@@@@@@@@@@@ oo",
+"o.@@@@@@@@@@@ oo",
+"o.@-@@@-@@@@@ oo",
+"o.@@@@@@@@@@@ oO",
+"o.@@@@@@@@  # Oo",
+"o.@-@@@-@@   ooo",
+"o.@@@@@@@@  oooo",
+"o.@@@@@@@@  oooo",
+"o+  #  # #  oooo",
+"oooooooooooooooo",
+"................",
+
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O   #",
+"oo@@@@@@@@@O   #",
+"oO@@@@@@@@@O   #",
+"OooooooooooOO  #",
+"o...........O  #",
+"o@@@@@@@@@@.O  #",
+"o@@@@@@@@@@.O  #",
+"o@@@@@@@@@@.O  #",
+"o@@@@@@@@@@.O  #",
+"o@@@@@@@@@@.O  #",
+"o@@@@@@@@@@.O  #",
+"o@@@@@@@@@@.O  #",
+
+"#  oooo@@@@@@@@@",
+"#  o=oo@@@@@@@@@",
+"#  oooo@@@@@@@@@",
+"#  oooo@@@@@@@@@",
+"#  oooo@@@@@@@@@",
+"#  oooo@@@@@@@@@",
+"#  oooo@@@@@@@@@",
+"#  oooo@@@@@@@@@",
+"#  o=oo@@@@@@@@@",
+"#  ooooOOOOOOOOO",
+"#  oooOOOOOOOOOO",
+"#  ooOO&OO&OO&OO",
+"#  oOOOOOOOOOOOO",
+"#   ++++++++++++",
+"#    +++++++++++",
+"######$$$$$$$$$$",
+
+"@@@@@@@@@@@@@@@.",
+"@@@@@@@@@@@@@@@.",
+"@@@@@@@@@@@@@@@.",
+"@@@@@@@@@@@@@@@.",
+"@@@@@@@@@@@@@@@.",
+"@@@@@@@+@+@@@@@.",
+"@@@@@@@@@@@@@@@.",
+"@@@@@@@@@@@@@@@.",
+"@@@@@@@@@@@@@@@O",
+"OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOO",
+"O&OO&OOO&OOOOOOO",
+"OOOOOOOOOOOOOOOO",
+"++++++++++++++++",
+"++++++++++++++++",
+"$$$$$$$$$$$$$$$$",
+
+"o@@@@@@@@@@.O+ #",
+"o@@@@@@@@@@.O+ #",
+"o@@+ +@@@@@.O+ #",
+"o@@   @@@@@.O+ #",
+"o@@+++@@@@@.O+ #",
+"o@@@@@@@@@@.O+ #",
+"o@@@@@@@@@@.O+ #",
+"o@@@@@@@@@@.O+ #",
+"oOOOOOOOOOOOO+ #",
+"OOO&OO&OOOOO++ #",
+"OO&OO&OOOOO+++ #",
+"O&OO&OOOOO++++ #",
+"OOOOOOOOO+++++ #",
+"++++++++++++++ #",
+"++++++++++++++ #",
+"$$$$$$$$$$$$$$##",
+
+"################",
+"#         $     ",
+"#       $$$     ",
+"#   $$  +$      ",
+"#  $$  +        ",
+"#  +$           ",
+"# +      #######",
+"#       ##......",
+"#      ###@@@@@@",
+"#     ##.#@@@@@@",
+"#    #####@@@@@@",
+"#   ##.#.#@@@@@@",
+"#  #######@@@.@@",
+"#  #.#X#.#@@.@@@",
+"#  #######@@@@@@",
+"#  #.#.#.#@@@@@@",
+
+"################",
+"                ",
+"                ",
+"       $        ",
+"     $$         ",
+"     $    #$$$$$",
+"##  +    ##@@@@@",
+".#      ###@@@@@",
+".#     ####@@@@@",
+".#    #####@@@@@",
+".#$$$$$$$$$@@@@@",
+".#@@@@@@@@@@@@@@",
+".#..@@@@@@@@@@@@",
+".#..@@@@@@@@@.@@",
+".#..@@@@@@@@@..@",
+".#..@@@@@@@@@@@@",
+
+"################",
+"               #",
+"               #",
+"               #",
+"               #",
+"$$$$$$$$$$$$$  #",
+"@@@@@@@@@@@@$  #",
+"@@@@@@@@@.@@$  #",
+"@@@@@@@@@@@@$  #",
+"@@$$$$$@@@@@$  #",
+"@@$$@@$$@@@@$  #",
+"@@$$@@$$@@@@$  #",
+"@@$$$$$@@@@@$  #",
+"@@$$$$@@@@@@$  #",
+"@@$$@$$@@@@@$+ #",
+"@@$$@@$$@@@@$+ #",
+
+"#  #######@@@@@@",
+"#  #.#X#.#@@@@@@",
+"#  #######@@@@@@",
+"#  #.#.#X#@@@@@@",
+"#  #######@@@@@@",
+"#  #X#.#.#@@@@@@",
+"#  #######@@@@@@",
+"#  #.#X#.#@@@@@@",
+"#  #######@@@@@@",
+"#  #.#.#X#@@@@@@",
+"#  #######@@@@@@",
+"#  #.#.#.#@@@@@@",
+"#  #######@@@@@@",
+"#  #X#.#.#@@@@@@",
+"#  #######@@@@@@",
+"#  #X#X#.#@@@@@@",
+
+".#..@@@@@@@@@@@@",
+".#..@@@@@@@@@@@@",
+".#..@@@@@@@@@@@@",
+".#..@@@@@@@@@@@@",
+".#$$$$$$$$$$$$$$",
+".#$+$+$+$+$+$+$+",
+".#$$$$$$$$$$$$$$",
+".#$+$+$+$+$+$+$+",
+".#$$$$$$$$$$$$$$",
+".#++++++++++++++",
+".#++++++++++++++",
+".#++++++++++++++",
+".#++            ",
+".##############$",
+"...............$",
+"@@@@@@@@@@@@@@.$",
+
+"@@@@@@@@@@@@$+ #",
+"@@@@@@@@@.@@$+ #",
+"@@@@@@@@@@@@$+ #",
+"@@@@@@@@@@@@$+ #",
+"$$$$$$$$$$$$$+ #",
+"$+$+$+$+$+$$++ #",
+"$$$$$$$$$$$+++ #",
+"$+$+$+$+$$++++ #",
+"$$$$$$$$$+++++ #",
+"+++..+++++++++ #",
+"++...........+ #",
+"++...........+ #",
+"  @@@@@@@@@@@  #",
+"  &&@-@@@-@@@  #",
+"  &&@@@@@@@@@  #",
+"  @@@@@@@@@@@  #",
+
+"#  #######@@@@@@",
+"#  #.#.#.#@@@@@@",
+"#  #######@@@.@@",
+"#  #X###X#@@.@@@",
+"#  #######@@@@@@",
+"#  #.#####$$$$$$",
+"#  ######$$$$$$$",
+"#  #.###$$$$$$$$",
+"#  ####$$$$$$$$$",
+"#  #X#$$$$$$$$$$",
+"#  ##$$+$+$+$+$+",
+"#  #$$$$$$$$$$$$",
+"#   ++++++++++++",
+"#    +++++++++++",
+"#     ++++++++++",
+"#######$$$$$$$$$",
+
+"@@@@@@@@@@@@@@.$",
+"@@@@@@@@@@@@@@.$",
+"@@@@@@@@@@@@@@.$",
+"@@@@@@@@@@@@@@.$",
+"@@@@@@@@@@@@@@.$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$+$+$+$+$+$ ",
+"$$$$$$$$$$$$$$+ ",
+"$$$+$+$+$+$+$+++",
+"$$$$$$$$$$$$++++",
+"$+$+$+$+$+$+++++",
+"$$$$$$$$$$++++++",
+"++++++++++++++++",
+"++++++++++++++++",
+"++++++++++++++++",
+"$$$$$$$$$$$$$$$$",
+
+"  @@@@@@@@@@@@@@",
+"  @@@-@@@-@@@@@@",
+"  @@@@@@@@@@@@@@",
+"  @@@@@@@@@@@@@@",
+"  @@@@@@@@@@@  #",
+"  @@@-@@@-@OO  #",
+"  @@@@@@@@@OO  #",
+"  @@@@@@@@@@@  #",
+"  OO@@@@@@@@@  #",
+"+ OO@-@@@-@@@  #",
+"+ @@@@@@@@@@@  #",
+"+ @@@@@@@@@@@  #",
+"+     @@@@     #",
+"+     @@@@     #",
+"+     @@@@     #",
+"$#####@@@@######",
+
+"             ooo",
+"############oo..",
+"#          ooo@@",
+"#   #     oooo@&",
+"#     #  oo.oo@@",
+"#  #    oo.ooo@@",
+"#      oooo.oo@@",
+"#  #  oo.o.ooo@@",
+"#    oo.ooo.oo@@",
+"#   oooo.o.ooo@@",
+"#  oo.o.ooo.oo@@",
+"#  o.ooo.o.ooo@@",
+"#  oo.o.ooo.oo@@",
+"#  o.ooo.o.ooo@@",
+"#  oo.o.ooo.oo@@",
+"#  o.ooo.o.ooo@@",
+
+"oooooooooooooo  ",
+".............O##",
+"@@@@@@@@@@@@.O&&",
+"@@@@@@@@@@@@.O@@",
+"@@@@@@@@@@@@.O@@",
+"@@@@@@@@@@@@.O@@",
+"@@@@@@@@@@@@.O@@",
+"@@@@@@@OOOOOOO@@",
+"@@@@@@.OOOOOO@@@",
+"@@@@@@.OOOOO&&&&",
+"@@@@@@.OOOO&&&&&",
+"@@@@@@.OOO&&&&&&",
+"@@@@@@.OO&&&&&&&",
+"@@@@@@.O&&&&&&&&",
+"@@@@@@.O&&&&&&&&",
+"@@@@@@.O++++++&&",
+
+"               %",
+"###############%",
+"&&&&&&&&&&&&& #%",
+"@@@@@@@@@@@@& #%",
+"@@@@@@@@@@@@& #%",
+"@@@@@@@@@@@@& #%",
+"@@@@@@@@@@@@& #%",
+"@@@@@@@@@@@@& #%",
+"@@@@@@@@@@@@& #%",
+"&&&&@@@@@@@@& #%",
+"&&&&@@@@@@@@& #%",
+"&&&&@@@@@@@@& #%",
+"&&&&@@@@@@@@& #%",
+"&&&&@@@@@@@@& #%",
+"&oooooooooooooo%",
+"oo............O%",
+
+"#  oo.o.ooo.oo@@",
+"#  o.ooo.o.ooo@@",
+"#  oo.o.ooo.oo@@",
+"#  o.ooo.o.ooo@@",
+"#  oo.o.ooo.oo@@",
+"#  o.ooo.o.ooo@@",
+"#  oo.o.oooooo@@",
+"#  o.ooo.oooooOO",
+"#  oo.o.oooooOOO",
+"#  o.oooooooOOOO",
+"#  oo.oooooOOOOO",
+"#  o.ooo.oOOOOOO",
+"#  oooo.oo@@@@@@",
+"#  ooooo.o@@@@@@",
+"#  oo.o.oo@@@@@@",
+"#  o.ooo.o@@@@@@",
+
+"@@@@@@.O++++++&o",
+"@@@@@@.O++++++oo",
+"@@@@@@.O++   ooo",
+"@@@@@@.O++  oooo",
+"@@@@@@.O++  oooo",
+"@@@@@@.O++# oooo",
+"@@@@@@.O++  oooo",
+"OOOOOOOO++ #oooo",
+"OOOOOOO+++  oooo",
+"OOOOOO++++ #oooo",
+"OOOOO+++++  oooo",
+"OOOO++++++  oooo",
+"@@@@oooooooooooo",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+
+"oo@@@@@@@@@@@.O%",
+"oo@@@@@@@@@@@.O%",
+"oo@@@@@@@@@@@.O%",
+"oo@@@$$$$$@@@.O%",
+"oo@@@$$@@$$@@.O%",
+"oo@@@$$@@$$@@.O%",
+"oo@@@$$$$$@@@.O%",
+"oo@@@$$$$@@@@.O%",
+"oo@@@$$@$$@@@.O%",
+"oo@@@$$@@$$@@.O%",
+"oo@@@@@@@@@@@.O%",
+"oo@@@@@@@@@@@.O%",
+"oo@@@-...@@@@.O%",
+"@@@@@-...@@@@.O%",
+"@@@@@-...@@@@.O%",
+"@@@@@.@@.@@@@.O%",
+
+"#  oo.o.oo@@@@@@",
+"#  o.ooo.o@@@@@@",
+"#  oo.o.oo@@@@@@",
+"#  o.ooo.o@@@@@@",
+"#  oo.o.oo@.@.@.",
+"#  o.ooooo@@@@@@",
+"#  oo.oooOOOOOOO",
+"#  o.oooOOOOOOOO",
+"#  ooooOXOXOXOXO",
+"#  oooOOOOOOOOOO",
+"#  ooOXOXOXOXOXO",
+"#  oOOOOOOOOOOOO",
+"#  OXOXOXOXOXOXO",
+"#   ++++++++++++",
+"# #  +++++++++++",
+"######$$$$$$$$$$",
+
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOO",
+"XOXOXOXOXOXOXOXO",
+"OOOOOOOOOOOOOOOO",
+"XOXOXOXOXOXOXOXO",
+"OOOOOOOOOOOOOOOO",
+"XOXOXOXOXOXOXOXO",
+"++++++++++++++++",
+"++++++++++++++++",
+"$$$$$$$$$$$$$$$$",
+
+"@@@@@@@@@@@@@.O%",
+"@@@@@@@@@@@@@.O%",
+"@@@@@@@@@@@@@.O%",
+"@@@@@@@@@@@@@.O%",
+"@@@@@@@@@@@@@.O%",
+"@@@@@@@@@@@@@.O%",
+"OOOOOOOOOOOOOOO%",
+"OOOOOOOOOOOOOO$%",
+"XOXOXOXOXOXOO+$%",
+"OOOOOOOOOOOO++$%",
+"XOXOXOXOXOO+++$%",
+"OOOOOOOOOO++++$%",
+"XOXOXOXOO+++++$%",
+"++++++++++++++$%",
+"++++++++++++++$%",
+"$$$$$$$$$$$$$$$%",
+
+"################",
+"#               ",
+"#               ",
+"#               ",
+"#     oooooooooo",
+"#    ooXXXXXXXXX",
+"#   ooo........X",
+"#  oooo........X",
+"#  oooo........X",
+"#  oooo........X",
+"#  oooo........X",
+"#  oooo........X",
+"#  oooo........X",
+"#  ooooOOOOOOOOO",
+"#  oooOOOOOOOOOO",
+"#  ooo@@@@@@@@@O",
+
+"################",
+"                ",
+"                ",
+"                ",
+"o               ",
+"O              #",
+"O             ##",
+"O             ##",
+"O             #$",
+"O@@@@@@@@@@@@ $#",
+"O@@@OO@XX@@@@ ##",
+"O@@@OO@XX@@@@@##",
+"O@@@OO@XX@@@@@$#",
+"O@@@@@@@@@@@@@##",
+"+@@@@@@@@@@@@ ##",
+"+@XX@@@@@@@@@ $#",
+
+"################",
+"               #",
+"               #",
+" ###########   #",
+"##XXXXXXXXX$   #",
+"##........X$   #",
+"##........X$   #",
+"##........X$   #",
+"##........X$   #",
+"$#........X$   #",
+"##........X$+  #",
+"##........X$+  #",
+"##........X$+  #",
+"$#........X$+  #",
+"##........X$+  #",
+"##........X$+  #",
+
+"#  ooo@@@@@@@@@O",
+"#  ooo@@$$$$$@@O",
+"#  ooo@@$$@@$$@O",
+"#  ooo@@$$@@$$@O",
+"#  ooo@@$$$$$@@O",
+"#  ooo@@$$$$@@@O",
+"#  ooo@@$$@$$@@O",
+"#  ooo@@$$@@$$@O",
+"#  ooo@@@@@@@@@O",
+"#  ooo@@@@@@@@@O",
+"#  ooo@@@@@@@@@O",
+"#  ooo@@@@@@@@@O",
+"#  oooOOOOOOOOOO",
+"#  ooOOOOOOOOOO+",
+"#  oOOOOOOOOOO++",
+"#   ++++++++++++",
+
+"+@XX@@@@@$$$@ ##",
+"+@@@@@@@@$$$@ ##",
+"+&&&@@@@@@@@@ $#",
+"+&&&@@@@@@@@@ ##",
+"+@@@@@@@@@@@@@##",
+".@@@@@@@@@@@@@$#",
+".@@@@@@@@@@@@@##",
+".@@@@@@@@@@@@ ##",
+"+      @@@@@  $#",
+"+      @@@@@  ##",
+"+  ### @@@@@  ##",
+"+ ####$@@@@@  ##",
+"+ ####$@@@@@  #$",
+"+ ###$$#@@@@   +",
+"+ #$$$#@@@@@    ",
+"+ #$$$#@@@@@    ",
+
+"$#........X$+  #",
+"##........X$+  #",
+"##........X$+  #",
+"$#........X$+  #",
+"##........X$+  #",
+"##........X$+  #",
+"$#........X$+  #",
+"##........X$+  #",
+"##........X$+  #",
+"##$$$$$$$$$$+  #",
+"#$$$$$$$$$$++  #",
+"$$$$$$$$$$+++  #",
+"$$$$$$$$$++++  #",
+"+++++++++++++  #",
+"+++++++++++++  #",
+" ++++++++++++  #",
+
+"#    +++++++++++",
+"#               ",
+"#               ",
+"#               ",
+"#  #### $       ",
+"#  #####$$      ",
+"#   $$$## $     ",
+"#  #$##$$$$    #",
+"# #$$#$$$$      ",
+"# #$$$$$+++     ",
+"# ##$$$$+++ %%=%",
+"#    +++++ %==%=",
+"#    ++++ %%=%=%",
+"#        X    X ",
+"#         +    +",
+"################",
+
+"+##$$# @@@@@    ",
+"$#$$+  @@@@@    ",
+"$$$+++ @@@@@    ",
+"++++++ @@@@@    ",
+"  ++++ @@@@@    ",
+"     # @@@@@    ",
+"    ####@@@@    ",
+"## ####$$#@@    ",
+"####$$#$$@@@    ",
+" ##$#$$$$@@@    ",
+"%%#$#$##$.@@    ",
+"% ##$$$$$.@@    ",
+"  #$$$#...@@    ",
+"   +$$$..@@@    ",
+"   ++++.@@@@    ",
+"################",
+
+"               #",
+"               #",
+"               #",
+"               #",
+"      $##      #",
+"     #######$  #",
+"    #$##$$##$  #",
+"   #$$##$$##$  #",
+"   ###$$$$##$  #",
+"   ###$#$$##$+ #",
+"   $$$$####$++ #",
+"    #$#$$$$$++ #",
+"     #$$###+++ #",
+"      ##+#++   #",
+"       +#++    #",
+"################",
+
+"$$$$$$$$$$$$$$$$",
+"$###############",
+"$###############",
+"$######$########",
+"$###$###########",
+"$#$#####O&O&O&O&",
+"$######O&XXXXXXX",
+"$#####O&O......X",
+"$####O&O&......X",
+"$####&O&O......X",
+"$###$O&O&......X",
+"$##$#&O&O......X",
+"$####O&O&......X",
+"$####&O&O......X",
+"$####O&O&......X",
+"$####&O&O......X",
+
+"$$$$$$$$$$$$$$$$",
+"################",
+"################",
+"################",
+"oooooooooooooooo",
+"O...............",
+"&@@@@@@@@@@@@@@@",
+"O@@@@@@@@@@@...@",
+"&@@@@@@@@@@@@@@@",
+"O@@@@@.@@@@@@@@@",
+"&@@@@@@@@@@@@@@@",
+"OOOOOOOOOOOOOOOO",
+"&OOO.O.OOO.OO.OO",
+"OOOOOOOOOOOOOOOO",
+"&O.O.OOO.OO.OOOo",
+"OOOOOOO.OOOOOOoo",
+
+"$$$$$$$$$$$$$$$$",
+"###############$",
+"###############$",
+"###############$",
+"ooooooooooooo##$",
+"............o##$",
+"@@@@@@@@@@@.o##$",
+"@@@@@@@@@@@.o##$",
+"@@@@@@@@@@@.o##$",
+"@@@@$$$$$@@.o##$",
+"@@@@$$@@$$@.o##$",
+"OO@@$$@@$$@.o##$",
+"Oo@@$$$$$@@.o##$",
+"oo@@$$$$@@@.o$#$",
+"oo@@$$@$$@@.o$#$",
+"+o@@$$@@$$@.o$#$",
+
+"$####O&O&......X",
+"$####&O&O......X",
+"$$###O&O&......X",
+"$####&O&O......X",
+"$#$##O&O&......X",
+"$####&O&O......X",
+"$####O&O&......X",
+"$####&O&O......X",
+"$##$#O&O&......X",
+"$####&O&O......X",
+"$#$##O&O&......X",
+"$####&O&O......X",
+"$####O&O&......X",
+"$####&O&O......X",
+"$####O&O&......X",
+"$####&O&O......X",
+
+"&$$$$$$.$$$$$oo+",
+"O$$$$$$.$$$$$o+o",
+"&$$$$$$.$$$$$oo+",
+"O######@#####o+o",
+"&######@#####Xo+",
+"O@@@@@@@@@@@@o+o",
+"&######@#####oo+",
+"O######@#####o+o",
+"&######@#####ooo",
+"O######@#####ooO",
+"&######@#####oOO",
+"O######@######$$",
+"&######@#######$",
+"O######@@@@@@@##",
+"&############@##",
+"O&O&O&O&O&O&O&&#",
+
+"oo@@@@@@@@@.o$#$",
+"+o@@@@@@@@@.o$#$",
+"oo@@@@@.@@@.o$#$",
+"+o@@@@@@@@@.o$#$",
+"oo@@@@@@@@@.o$#$",
+"+o@@@@@@@@@.o$#$",
+"ooOOOOOOOOOOO$#$",
+"oOOOOOOOOOOO$$#$",
+"OOOOOOOOOOO$$$#$",
+"OOOOOOOOOO$$$$#$",
+"OOOOOOOOO$$$$$#$",
+"$$$$$$...$$$$$#$",
+"$$$$$$...$$$$$#$",
+"$............$#$",
+"#@@@@@@@@@@@@##$",
+"#@@X@@@@@@X@@@@@",
+
+"$####O&O&......X",
+"$####&O&O.......",
+"$####O&O&.......",
+"$#$##&O&O.......",
+"$$$##O&O&.......",
+"$####&O&O.......",
+"$####O&O&.......",
+"$####&O&O&&&&&&&",
+"$#$##O&O&&&&&&&&",
+"$####&O&&&&&&&&&",
+"$$###O&&&&&&&&&&",
+"$#####$$$$$$$$$$",
+"$#$####$$$$$$$$$",
+"$###############",
+"$###############",
+"$$$$$$$$$$$$$$$$",
+
+"XXXXXXXXXXXXXX&#",
+".............X&@",
+".............X&@",
+".............X&@",
+".............X&@",
+".............X&$",
+".............X&$",
+"&&&&&&&&&&&&&&&$",
+"&&&&&&&&&&&&&&$$",
+"&&&&&&&&&&&&&$$$",
+"&&&&&&&&&&&&$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"################",
+"################",
+"$$$$$$$$$$$$$$$$",
+
+"#@@@X@@@@X@@@@@@",
+"@@@@@X@@X@@@@@@@",
+"@@@X@@@@@@X@@@@@",
+"@@@@X@@@@X@@@@@@",
+"@@@@@X@@X@@@@##$",
+"#@@X@@@@@@X@@##$",
+"#@@@X@@@@X@@@##$",
+"#@@@@X@@X@@@@##$",
+"#@@@@@@@@@@@@##$",
+"#@@@@@@@@@@@@##$",
+"#@@@@@@@@@@@@##$",
+"#@@@@@@@@@@@@##$",
+"######@@@@@####$",
+"######@@@@@####$",
+"######@@@@@####$",
+"$$$$$$@@@@@$$$$$",
+
+"################",
+"#               ",
+"#               ",
+"#  #            ",
+"#       ========",
+"#      ==.......",
+"#     =@=@@@@@@@",
+"#    =@==@@@@@@@",
+"#   =@=@=@@@@@@@",
+"#   @=@==@@@@@@@",
+"#   =@=@=@@@@@@@",
+"#   @=@==@@@@@@@",
+"#   =@=@========",
+"#   @=@=........",
+"#   =@=@........",
+"#   @=@=........",
+
+"################",
+"                ",
+"        #       ",
+"   #            ",
+"======          ",
+".....=        ==",
+"@@@@.=       ==.",
+"@@@@.=      =@=.",
+"@@@@.=     =@==.",
+"@@@@.=     @=@=.",
+"@@@@.=@@@@@=@==.",
+"@@@@.=+@@@@@=@=.",
+"======+@@@@=@==.",
+"=.=.=++    @=@=.",
+".=.=+++    =@==.",
+"=.=++++    @=@=.",
+
+"################",
+"               #",
+"          ##   #",
+"               #",
+"    -------@   #",
+"===o-@@@@@@@   #",
+"X.oo-@@@@@@@   #",
+"..oo-@@@@@@@   #",
+"..oo-@@@@@@@   #",
+"..oo-@@@@@@@   #",
+"..oo-@@@@@@@   #",
+"..oo-@@@@@@@   #",
+"..oo@@@@@@@@   #",
+"..ooOOOOOOO    #",
+"..oOOOOOOO=    #",
+".........X=  # #",
+
+"#   =@=@........",
+"#   @=@=........",
+"#   =@=@........",
+"#   @=@=........",
+"# # =@=@..======",
+"#   @=@=.==.....",
+"#   =@=@=@=@@@@@",
+"#   @=@=@==@@@@@",
+"#   =@=@=@=$$$$$",
+"#   @=@=@==$$@@$",
+"#   =@=@=@=$$@@$",
+"#   @=@=@==$$$$$",
+"#   =@=@=@=$$$$@",
+"#   @=@=@==$$@$$",
+"#   =@=@=@=$$@@$",
+"#   @=@=@==@@@@@",
+
+"+++++++    =@==.",
+"+++++++    @=@=.",
+"+++++++ #  =@==.",
+"++         @=@=.",
+"===        =@===",
+"..=@@@@@@@@@==.=",
+"@.=   @@@  ==.=.",
+"@.=  #  @  =.=.=",
+"@.=  #  @   ++++",
+"$.=     @    +++",
+"$.=+    @     ++",
+"@.=+    @ #     ",
+"@.==============",
+"@...............",
+"$@@@@@@@@@@@@@@.",
+"@@@@@@@@@@@@@@@.",
+
+"..........=+   #",
+".........X=+   #",
+"..........=+   #",
+".........X=+   #",
+"===========+   #",
+".=.=.=.=.=++   #",
+"=.=.=.=.=+++   #",
+".=.=.=.=++++   #",
+"++++++++++++   #",
+"+++oooooooooo  #",
+"++ooX.X.X.X.O  #",
+" ooo.......XO  #",
+"=ooo........O  #",
+"=ooo.......XO  #",
+"=ooo........O+ #",
+"=ooo.......XO+ #",
+
+"#   =@=@=@=@@@@@",
+"# + @=@=@==@@@@@",
+"#   =@=@=@=@@@@@",
+"#   @=@=@==@@@@@",
+"#   =@=@=@======",
+"#   @=@=@==.=.=.",
+"#   =@=@==.=.=.=",
+"#   @=@==.=.=.=.",
+"# + =@==.=.=.=.=",
+"#   @==.=.=.=.=.",
+"#   ==.=.=.=.=.=",
+"#    +++++++++++",
+"#  #  ++++++++++",
+"#      +++++++++",
+"# +     ++++++++",
+"#########$$$$$$$",
+
+"@@@@@@@@@@@@@@@.",
+"@@@@@@@@@@@@@@@.",
+"@@@@@@@@@@@@@@@.",
+"@@@@@@@@@@@@@@@.",
+"================",
+"=.=.=.=.=.=.=.=.",
+".=.=.=.=.=.=.=..",
+"=.=.=.=.=.=.=...",
+".=.=.=.=.=.=....",
+"=.=.=.=.=.=.+...",
+".=.=.=.=.=.++...",
+"+++++++++++++...",
+"++++++++++++++++",
+"++++++++++++++++",
+"++++++++++++++++",
+"$$$$$$$$$$$$$$$$",
+
+"=ooo........O+ #",
+"=ooo.......XO+ #",
+"=ooo........O+ #",
+"=ooo.......XO+ #",
+"=oooOOOOOOOOO+ #",
+"@ooOOOOOOOOO++ #",
+".oOOOOOOOOO+++ #",
+"............++ #",
+"..@.........++ #",
+"..@@@@@@@@@@   #",
+"..@@@@@@@@@@   #",
+"..@@@@@@@@@@   #",
+"++   @@@@@@@   #",
+"++   @@@@@@@   #",
+"++   @@@@@@@   #",
+"$$###@@@@@@@####",
+
+"          %%%%%%",
+"#########-%.....",
+"#       --%@@@@@",
+"#      ---%@@@@@",
+"#     ----%@@@OO",
+"#    -@-@-%@@OOO",
+"#   ------%@@OOO",
+"#  -@-@-@-%@@@OO",
+"#  -------%@@@@@",
+"#  -@-@-@-%@@@@@",
+"#  -------%@@@@@",
+"#  -@-@-@-%@@@@@",
+"#  -------%@@&@&",
+"#  -@-@---%%%%%%",
+"#  ------@@@@@@@",
+"#  -@-@-@@@@@@@@",
+
+"%%%%            ",
+"...%########%%%%",
+"@@.%       -%...",
+"@@.%      --%@@@",
+"@@.%     ---%@@@",
+"O@.%....----%@@@",
+"O@.%....----%@@@",
+"@@.%....----%@@@",
+"@@.%....----%@@@",
+"@@.%....----%@@@",
+"@@.%....----%@@@",
+"@@.%....----%@@@",
+"@@.%....----%@@@",
+"%%%%....----%%%%",
+"@@@.....---@@@@@",
+"@@......--@@@@@@",
+
+"                ",
+"%%%%%%%%%%%%%%%%",
+"...............%",
+"@@@@@@@@@@@@@@.%",
+"@@OO@@@@@@@@@@.%",
+"@@@@@@@@@@@@@@.%",
+"@@@@@@@@@@@@@@.%",
+"@@@@@@@@@@@%@@.%",
+"@@@%@@@@@@%@@@.%",
+"@@%@@@@@@%@@@@.%",
+"@%@@@@@@@@@@@@.%",
+"@@@@@@@@@@@@@@.%",
+"@@@@@@@@@@@@@@.%",
+"%%%%%%%%%%%%%%%%",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@$",
+
+"#  ----@@@@@@@@@",
+"#  -@-@.........",
+"#  ----.........",
+"#  -@-@........%",
+"#  ----.......-%",
+"#  -@-@..%...--%",
+"#  ----.....---%",
+"#  -@-@....-@-@%",
+"#  ----...-----%",
+"#  -@-@..-@-@-@%",
+"#  ----.-------%",
+"#  -@-@-@-@-@-@%",
+"#  ------------%",
+"#  -@-@-@-@-@-@%",
+"#  ------------%",
+"#  -@-@-@-@-@-@%",
+
+"@.......-@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"%%%%%%%%%%%%%%%%",
+"................",
+"----------------",
+"----------------",
+"-----$$$$$------",
+"-----$$--$$-----",
+"-----$$--$$-----",
+"-----$$$$$------",
+"-----$$$$-------",
+"-----$$-$$------",
+"-----$$--$$-----",
+"----------------",
+"----------------",
+
+"@@@@@@@@@@@@@@+$",
+"@-..........@++$",
+"--..........+++$",
+"%%%%........+++$",
+"...%........+++$",
+"--.%........+++$",
+"--.%........++ #",
+"--.%........++ #",
+"--.%........++ #",
+"--.%........++ #",
+"--.%........++ #",
+"--.%@@@@@@@@@@@#",
+"--.%..........@#",
+"--.%..........@#",
+"--.%..........@#",
+"--.%..........@#",
+
+"#  ------------%",
+"#  -@-@-@-@-@--@",
+"#  -----------@@",
+"#  -@-@-@-@--@@.",
+"#  ---------@@@@",
+"#  -@-@-@--@@.@.",
+"#  -------@@@@@@",
+"#  -@-@--@@.@.@.",
+"#  -----@@@@@@@@",
+"#  -@--@@.@.@.@.",
+"#  ---@@@@@@@@@@",
+"#  --@@.@.@.@.@.",
+"#  -@@@@@@@@@@@@",
+"#   ++++++++++++",
+"#    +++++++++++",
+"######$$$$$$$$$$",
+
+"%%%%%%%%%%%%%%%%",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@.@.@.@.@.@.@.@.",
+"@@@@@@@@@@@@@@@@",
+"@.@.@.@.@.@.@.@.",
+"@@@@@@@@@@@@@@@@",
+"@.@.@.@.@.@.@.@.",
+"@@@@@@@@@@@@@@@@",
+"@.@.@.@.@.@.@.@.",
+"@@@@@@@@@@@@@@@@",
+"@.@.@.@.@.@.@.@.",
+"@@@@@@@@@@@@@@@@",
+"++++++++++++++++",
+"++++++++++++++++",
+"$$$$$$$$$$$$$$$$",
+
+"%%%%..........@#",
+"@@@...........@#",
+"@@............@#",
+"@.............@#",
+"..............@$",
+"..............@$",
+"@@@@@@@@@@@@@@@$",
+"@.@.@.@.@.@@@@+$",
+"@@@@@@@@@@@@@++$",
+"@.@.@.@.@.@@+++$",
+"@@@@@@@@@@@++++$",
+"@.@.@.@.@@+++++$",
+"@@@@@@@@@++++++$",
+"+++++++++++++++$",
+"+++++++++++++++$",
+"$$$$$$$$$$$$$$$$",
+
+"$$$$$$$$$$$$$$$$",
+"$###############",
+"$###############",
+"$#######&&&&&&&&",
+"$######&&.......",
+"$#####&&&@@@@@@@",
+"$#####&&&@@@@@@@",
+"$#####&&&@@@@@@@",
+"$#####&&&@@@@@@@",
+"$#####&&&@@@@@@@",
+"$#####&&&@@@@@@@",
+"$#####&&&&&&&&&&",
+"$#####&&&&&&&&&&",
+"$#####&&&&&&&&&&",
+"$######$$$$$$$$$",
+"$######@......$$",
+
+"$$$$$$$$$$$$$$$$",
+"################",
+"################",
+"&&##oooooooooooo",
+".&#oo...........",
+".&ooo@@@@@@@@@@@",
+".&ooo@@X@@@@@@@@",
+".&oOo@@@@@@@@@@@",
+".&ooo@@@@@@@@@@@",
+".&ooo@@X@@@@@@@@",
+".&oOo@@@@@@@@@@@",
+"&&oooOOOOOOOOOOO",
+"&$ooOOOOOOOOOOOO",
+"$$oOOOOOOOOOOOOO",
+"$$#$$$$$$$$$$$$$",
+"@@@@.........$$$",
+
+"$$$$$$$$$$$$$$$$",
+"###############$",
+"###############$",
+"oooooooooo#####$",
+".........O#####$",
+"@@@@@@@@.O#####$",
+"@@@@X@@@.O#####$",
+"@@@@@@@@.O#####$",
+"@@@@@@@@.O#####$",
+"@@@@X@@@.O$####$",
+"@@@@@@@@.O$####$",
+"OOOOOOOOOO$####$",
+"OOOOOOOOO$$####$",
+"OOOOOOOO$$$####$",
+"$$$..$$$$$$####$",
+"$$$..$$$$$$####$",
+
+"$######@@@@@.@##",
+"$######@@@@.@@@@",
+"$######@@@.@@@@@",
+"$######@@@@@@@##",
+"$######@@@@@.@##",
+"@@@@@@@@@@@.@@##",
+"@@@@@@@@@@.@@@##",
+"@@@@@@@@@@@@@@##",
+"@@@@@@@@@@@@.@##",
+"@@@@@@@@@@@.@@##",
+"@@@@@@@@@@.@@@##",
+"@@@@@@@@@@@@@@##",
+"$######@@@@@.@##",
+"$######@@@@.@@##",
+"$######@@@.@@@@@",
+"$######@@@@@@@@@",
+
+"@@@@@@%@@@@@@###",
+"@@@@--%--@@@@###",
+"@@@-OO%OO-@@@###",
+"#@-ooo%oOO-@@@@@",
+"#@-ooooooO-@$$$$",
+"#@-ooooooO-@$$@@",
+"#@-ooooooO-@$$@@",
+"#@-ooooooO-@$$$$",
+"#@-ooooooO-@$$$$",
+"#@-ooooooO-@$$@$",
+"#@-ooooooO-@$$@@",
+"#@-ooooooO-@@@@@",
+"#@@-ooooo-@@@###",
+"#@@@-----@@@@###",
+"@@@@@@@@@@@@@###",
+"@@@@@@@@@@@@@###",
+
+"##@@@@@@@@#####$",
+"##@@@@@@@@#####$",
+"##@@@.@@@@#####$",
+"@@@@.@@@@@#####$",
+"$@@.@@@@@@#####$",
+"$$@@@@@@@@@@@@@@",
+"$$@@@.@@@@@@@@@@",
+"$@@@.@@@@@@@@@@@",
+"@@@.@@@@@@@@@@@@",
+"$@@@@@@@@@#####$",
+"$$@@@.@@@@#####$",
+"@@@@.@@@@@#####$",
+"##@.@@@@@@#####$",
+"##@@@@@@@@#####$",
+"##@@@.@@@@#####$",
+"##@@.@@@@@#####$",
+
+"$######@@@@@@@##",
+"$##########@@@##",
+"$##########@@@##",
+"$##########@@@##",
+"$#######oooooooo",
+"$######oo.......",
+"$######oo@@@@@@@",
+"$######Oo@@@@@@@",
+"$######oo@@@@@@@",
+"$######oo@@@@@@@",
+"$######Oo@@@@@@@",
+"$######oo@@@@@@@",
+"$######ooOOOOOOO",
+"$######oOOOOOOOO",
+"$#######$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+
+"################",
+"################",
+"################",
+"################",
+"oooooooooooooo##",
+".............O# ",
+"@@@@@@@@@@@@.O@ ",
+"@@@@@@@@@@@@.O@ ",
+"@@@@@@@@@@@@.O@ ",
+"@@@@@@@@@@@@.O# ",
+"@@@@@@@@@@@@.O# ",
+"@@@@@@@@@@@@.O$ ",
+"OOOOOOOOOOOOOO$ ",
+"OOOOOOOOOOOOO$$ ",
+"$$$$$$$$$$$$$$$#",
+"$$$$$$$$$$$$$$$$",
+
+"##@.@@@@@@#####$",
+"##@@@@@@@@#####$",
+"###############$",
+"#          ####$",
+"  @@@@@@@@+####$",
+"  -------@+####$",
+"  -------@+####$",
+"  -------@+####$",
+"  -------@+####$",
+"  -------@+####$",
+"  -------@+$###$",
+"  +++++++++$###$",
+" +++++++++$$###$",
+"+++++++++$$$###$",
+"$$$$$$$$$$$$###$",
+"$$$$$$$$$$$$$$$$",
+
+"$$$$$$$$$$$$$$$$",
+"$###############",
+"$##.############",
+"$#..############",
+"$#####.#########",
+"$####..#oooooooo",
+"$######ooXXXXXXo",
+"$#..##ooo@@@@@@o",
+"$####oOoo@@@@@@o",
+"$####oooo@@@@@@o",
+"$####ooOo@@@@@@o",
+"$####oooo@@@@@@o",
+"$####oooo@@@@@@o",
+"$####oOoo@@@@@@X",
+"$####oooo@@@@@@X",
+"$####ooOo@@@@@@X",
+
+"$$$$$$$$$@@@$$$$",
+"#########@@@####",
+"#########@@@####",
+"#########@@@####",
+"oooooooooooooooo",
+"oXXXXXXXXXXXXXXX",
+"o@@@@@@@@@@@@@@@",
+"o@@@@@@@@@@@@@@@",
+"o@@@@@@@@@@@@@@X",
+"o@@@@@@@@@@@@@@X",
+"o@@@@@@@@@@@@@@@",
+"oOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOo",
+"OOOOOOOOOOOOOOoo",
+"OOOOOOOOOOOOOooo",
+
+"$$$$$$$$$$$$$$$$",
+"###############$",
+"###############$",
+"###############$",
+"ooooooooooooo##$",
+"XXXXXXXXXXXXO##$",
+"@@@@@@@@@@@XO##$",
+"@@@@@@@@@@@XO##$",
+"@@@$$$$$@@@XO##$",
+"@@@$$@@$$@@XO##$",
+"@@@$$@@$$@@XO##$",
+"Oo@$$$$$@@@XO##$",
+"oo@$$$$@@@@XO##$",
+"oo@$$@$$@@@XO##$",
+"oo@$$@@$$@@XO$#$",
+"Oo@@@@@@@@@XO$#$",
+
+"$####oooo@@@@@@X",
+"$####oooo@@@@@@X",
+"$####oOoo@@@@@@X",
+"$####ooOo@@@@@@X",
+"$####oooo@@@@@@X",
+"$####oooo@@@@@@X",
+"$####oooo@@@@@@X",
+"$####oOoo@@@@@@X",
+"$##$#ooOo@@@@@@X",
+"$####oooo@@@@@@X",
+"$####oooo@@@@@@X",
+"$####oooo@@@@@@X",
+"$####oOoo@@@@@@X",
+"$####oooo@@@@@@X",
+"$####ooOo@@@@@@X",
+"$####oooo@@@@@@X",
+
+"O$$$$$$$$$$$$ooo",
+"O.........$$$oOo",
+"O.@@@@@@@@###ooo",
+"O.@@OOOO@@##$ooo",
+"O.@oooooO@###oOo",
+"O.--ooooO@###ooo",
+"O.@oooooO@#$#ooo",
+"O.@@oooo@@###oOo",
+"O.@@@@@@@@###ooo",
+"O$###########ooO",
+"O$###########oOO",
+"O.@@@@@#######$$",
+"O.@@@@@@##$####$",
+"O.@@@@@@########",
+"O$###@@@########",
+"ooooooooooooooo#",
+
+"oo@@@@@@@@@XO$#$",
+"oo@@@@@@@@@XO$#$",
+"Oo@@@@@X@@@XO$#$",
+"oo@@@@@@@@@XO$#$",
+"oo@@@@@@@@@XO$#$",
+"Oo@@@@@@@@@XO$#$",
+"ooOOOOOOOOOOO$#$",
+"oOOOOOOOOOOO$$#$",
+"OOOOOOOOOOO$$$#$",
+"OOOOOOOOOO$$$$#$",
+"OOOOOOOOO$$$$$#$",
+"$$$$$....$$$$$#$",
+"$$$$$....$$$$$#$",
+"$$$$......$$$$#$",
+"###@@@@@@@@####$",
+"##@@@....@@@###$",
+
+"$#$##oooo@@@@@@X",
+"$####oooo@@@@@@@",
+"$####oOoo@@@@XX@",
+"$####oooo@@@@@X@",
+"$####oooo@@@@XX@",
+"$##$#ooOo@@@@@@@",
+"$####ooOo@@@@@@@",
+"$####oOooOOOOOOO",
+"$####oooOOOOOOOO",
+"$####ooOOOOOOOOO",
+"$####oOOOOOXXXXO",
+"$#####$$$$$...$$",
+"$######$$$$...$$",
+"$##########@@@##",
+"$##########@@@##",
+"$$$$$$$$$$$@@@$$",
+
+"XXXXXXXXXXXXXXO#",
+"@@@@@@@@@@@@@XO@",
+"@@@@@@@@@@@@@XO@",
+"@@@@@@@@@@@@@XO@",
+"@@@@@@@@@@@@@XO@",
+"@@@@@@@@@@@@@XO#",
+"@@@@@@@@@@@@@XO$",
+"OOOOOOOOOOOOOOO$",
+"OOOOOOOOOOOOOO$$",
+"OOOOOOOOOOOOO$$$",
+"OOOOOOOOOOOO$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"################",
+"################",
+"$$$$$$$$$$$$$$$$",
+
+"#@@@-Oooo.@@@#$$",
+"@@@-oooOoo.@@##$",
+"@@@-ooo-Oo.@@##$",
+"@@@-oOoooo.@@##$",
+"@@@-oooOoo.@@##$",
+"#@@@-ooOo-@@@##$",
+"##@@@----@@@###$",
+"###@@@@@@@@####$",
+"####@@@@@@##$##$",
+"###############$",
+"#####$#########$",
+"###############$",
+"###$###########$",
+"#########$#####$",
+"###############$",
+"$$$$$$$$$$$$$$$$",
+
+"$$$$$$$$$$$$$$$$",
+"$###############",
+"$####$##########",
+"$##############-",
+"$#########$###-@",
+"$############--@",
+"$###########@-@@",
+"$####$#####%@-@@",
+"$#$#######@%%-@@",
+"$########%@%--@@",
+"$#######@%%---@@",
+"$######%@%-----@",
+"$#####@%%---@--@",
+"$####%@%-----@--",
+"$###@%%--------@",
+"$###@%---@----@@",
+
+"$$$$$$$$$$$$$$$$",
+"##-----#########",
+"--.....--######$",
+"@@@@@@@..-#####$",
+"@@@@@@@@@.-####$",
+"@@@@@@@@@.-##@@@",
+"@@@@@@@@@@.-#@#$",
+"@@@@@@@@@@.-#@#$",
+"@@@@@@@@@@.-#@#$",
+"@@@@@@@@@@.-#@#$",
+"@@@@@@@@@@.-#@##",
+"@@@@@@@@@@-@@@@@",
+"@@@@@@@@@@-@@@-@",
+"@@@@@@@@@-#@@O-O",
+"--@@@@@--##@@ooo",
+"@@------###@@ooo",
+
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$########$",
+"-@@%@@-$#######$",
+"@@@%@@@$#######$",
+"-@@%@@-$###$###$",
+"$@$@$@$$#######$",
+"@$@$@$@$#######$",
+"-@@%@@-$#### ##$",
+"@@@%@@@$#######$",
+"-@@%@@-$#######$",
+"$$$$$$$##$#####$",
+"@@@############$",
+"@@@#########$##$",
+"O@@###$########$",
+"O@@###### #####$",
+"O@@###### #####$",
+
+"$##%%-----@--@@-",
+"$##%--------@@@@",
+"$##---@----@@-@@",
+"$##----@--@@@@..",
+"$##------@@-@@@@",
+"$###----@@@@..@@",
+"$$##---@@-@@@@@.",
+"$####-@@@@..@@..",
+"$#####@@@@@@@..$",
+"$######...@@...$",
+"$######@..$$$$..",
+"$##$###@@.$$$$$.",
+"$######@@@$$$+$$",
+"$######@@@#$$$$$",
+"$######@@@##$$$$",
+"@@@@@@@@@@@@@.$$",
+
+"@@@@@..@@@@@@ooo",
+"..@@..#####@@ooo",
+"@@@..######@@ooo",
+"@@..#######@@@@@",
+"@..#### ###@@@@@",
+"..###########@##",
+".$$##########@##",
+"$$$$####$####@##",
+"$$$$$########@##",
+"$$+$$$#######@#@",
+"$$$$$$$######@%@",
+".$$$$$$######@%%",
+"..$$$$$#####%@%-",
+"$..$$$$####@%%--",
+"$$..$$####%@%---",
+"$$...$###@%%---@",
+
+"O@@#$### ####$#$",
+"O@@############$",
+"O@@#######$####$",
+"@@@############$",
+"@@@##-----#####$",
+"###--.....--###$",
+"##-@@@@@@@..-##$",
+"#-@@@@@@@@@@.-#$",
+"--@@@$$$$$@@.-#$",
+"-@@@@$$@@$$@@.-$",
+"-@@@@$$@@$$@@.-$",
+"-@@@@$$$$$@@@.-$",
+"-@@@@$$$$@@@@.-$",
+"-@@@@$$@$$@@@.-$",
+"--@@@$$@@$$@@-#$",
+"--@@@@@@@@@@@-#$",
+
+"@@@@@@@@@@@@@@..",
+"@@@@@@@@@@@@@@@$",
+"@@@@@@@@@@@@@@@#",
+"$###########@@@#",
+"$###########@@@#",
+"$##### ###$#@@@#",
+"$##$########@@@#",
+"$###########@@@#",
+"$###$#####$#@@@@",
+"$###########@@@@",
+"$#######$####@@@",
+"$###############",
+"$#$$###$########",
+"$###########$###",
+"$###############",
+"$$$$$$$$$$$$$$$$",
+
+"...$@@##%@%-----",
+"$$$##@@@%%------",
+"######@@%---@---",
+"#$####%%-----@--",
+"######%--------@",
+"**#&##---@----@@",
+"##o###----@--@@@",
+"&*####------@@-@",
+"@@@@@@..---@@@@.",
+"@@@@@@@.--@@-@@@",
+"@@@@@@@#-@@@@..@",
+"#########@@@@@@@",
+"#######$##$@@@@.",
+"## ########$$$$$",
+"############$$$$",
+"$$$$$$$$$$$$$$$$",
+
+"@--@@@@@@@@@-##$",
+"--@--@@@@@--###$",
+"-@@@@------### $",
+"@@-@@@@@..#####$",
+"@@@..@@..######$",
+"-@@@@@..#######$",
+"@..@@..########$",
+"@@@@..#########$",
+".@@..#### #####$",
+"@@..$$#########$",
+"@..$$$$########$",
+"..$$$$$$## ####$",
+"$$$$$$$$$######$",
+"$$$$$$+$$$#####$",
+"+$$$$$$$$$#####$",
+"$$$$$$$$$$$$$$$$",
+
+"          %%%%%%",
+"$$$$$$$$$-%-----",
+"$#######--%-----",
+"$#$$$##---%-----",
+"$$$$$#----%-----",
+"$$$$$-----%-----",
+"$$$$------%-----",
+"$##-------%-----",
+"$##-------%-----",
+"$##-------%----+",
+"$##-------%-----",
+"$##-------%-----",
+"$##-------%%%%%%",
+"$##-------@@@@@@",
+"$##------@@@@@@@",
+"$##-----@@@@@@@@",
+
+"%%%%%       -...",
+"----%$$$$$$--@@@",
+"----%#####---@@@",
+"----%####----@@@",
+"----%....----@@@",
+"----%@@@.----@@@",
+"----%@@@.----@@@",
+"----%@@@.----@@@",
+"----%@@@.----@@@",
+"----%@@@.-------",
+"----%@@@.--@@@@@",
+"----%....-@@@@@@",
+"%%%%%..@@@@@@@@@",
+"@@@@..@@@@@@@@@-",
+"@@@..@@@@@@@@@--",
+"@@$$$$$$$#####--",
+
+"............... ",
+"@@@@@@@@@@@@@@. ",
+"@@@@@@@@@@@@@@. ",
+"@@@X@@@@@@@@@@. ",
+"@@X@@@@@@@@@@@. ",
+"@@@@@@@@@@@@@@. ",
+"@@@@@@@@@@@@@@. ",
+"@@@@@@@@@@@@@@. ",
+"@@@@@@@@@@@@@@. ",
+"----@@@@@@@@@@. ",
+"@@--@@@@@@@@@@. ",
+"@---@@@@@@@@@@. ",
+"---%%%%%%%%%%%%%",
+"--@%...........%",
+"-@@%----------.%",
+"@@@%----------.%",
+
+"$##----@@@@@@@@@",
+"$##----.........",
+"$##----.........",
+"$##----.........",
+"$##----.........",
+"$##----.........",
+"$##----.........",
+"$##----.........",
+"$##----.........",
+"$##----....%%%%%",
+"$##----...-%....",
+"$##----..--%----",
+"$##----.---%----",
+"$##--------%----",
+"$##--------%----",
+"$##--------%----",
+
+"@$$$$$$$$#####-@",
+".@@@@@@@@--###@@",
+".@@@@-@@@--##@@@",
+".@@@O-O@@--#@@@@",
+".@@OO-OO@--#@@X@",
+".@@OOOOO@--#@@@@",
+".@-ooooO---#@@X@",
+".@-ooooO---#@@@@",
+".@-ooooO---#@@X@",
+"%%%%%ooO---#@@@@",
+"....%ooO---#@@X@",
+"---.%oo----#@@@@",
+"---.%%%%%%%%%%%%",
+"---.............",
+"----------------",
+"----------------",
+
+"@@@%----------.%",
+"@@@%----------.%",
+"X@@%--$$$$$---.%",
+"@@@%--$$--$$--.%",
+"X@@%--$$--$$--.%",
+"@@@%--$$$$$---.%",
+"X@@%--$$$$----.%",
+"@@@%--$$-$$---.%",
+"X@@%--$$--$$--.%",
+"@@@%----------.%",
+"X@@%----------.%",
+"@@@%----+-----.%",
+"%%%%---+------.%",
+"...---+-------.%",
+"--------------.%",
+"--------------.%",
+
+"$##--------%---+",
+"$##--------%----",
+"$##--------%----",
+"$##--------%----",
+"$##--------%%%%-",
+"$##-------@@@-%%",
+"$##------@@@-%-%",
+"$##-----@@@-%-..",
+"$##----@@@-%-%%%",
+"$##---@@@-%-..%-",
+"$##--@@@-%-%%%-@",
+"$##-@@@-%-..%-@@",
+"$##@@@-%-%%%-@@.",
+"$###$$%-----$$$$",
+"$####$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+
+"----------------",
+"----------X-----",
+"----------------",
+"----------------",
+"---%%%%%%%%----%",
+"%%%%@@%@@-%%%%%%",
+"%%-@@.@@-%-%%%-@",
+"%-@@%@@-%-..%-@@",
+"-@@.@@-%-%%%-@@.",
+"@@%@@-%-..%-@@%@",
+"@@@@-%-%%%-@@@@@",
+"%@@-%-..%-@@%@@-",
+"@@-%-%%%-@@.@@-%",
+"$$%-----$$$$$$%-",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+
+"--------------.%",
+"--------------.%",
+"--------------.%",
+"--------------.%",
+"%%%%%%%----%%%%%",
+"@@@@@-%%%%%%@@@ ",
+"@.@@-%-%%%-@@@$ ",
+"%@@-%-..%-@@@#$ ",
+"@@-%-%%%-@@@$#$ ",
+"@-%-..%-@@@$$#$ ",
+"-%-%%%-@@@$$$#$ ",
+"%-..%-@@@$$$$#$ ",
+"-%%%-@@@$$$$$#$ ",
+"----$$$$$$$$$#$ ",
+"$$$$$$$$$$$$$#$ ",
+"$$$$$$$$$$$$$$$ ",
+
+"XXXXXXX@@@XXXXXX",
+"X######@@@######",
+"X######@@@######",
+"X###@@@@@@@@@@@#",
+"X###@@@@@@@@@@@#",
+"X###@@@@@@@@@@@#",
+"X###@@@@@@@@@@@#",
+"X###@@@@@@@@@@@#",
+"X###@@@@@@@@@@@#",
+"@@@@@@@@@@@@@@@#",
+"@@@@@@@@@@@@@@@#",
+"@@@@@@@@@@@@@@@#",
+"X###@@@@@@@@@@@-",
+"X###@@@@@@@@@@--",
+"X###@@@@@@@@@-@-",
+"X###@@@@@@@@--@-",
+
+"XXXXXXXXXXXXXXXX",
+"#### ###########",
+"##########XXXXXX",
+"#########-......",
+" #######--......",
+"#######---......",
+"######----......",
+"#####-----......",
+"####------......",
+"##XXXXXXXX......",
+"#-............%%",
+"--..........%%%%",
+"@-..........%%%&",
+"@-.........%%%%&",
+"@-.........%%&&&",
+"--.........%%&&&",
+
+"XXXXXXXXXXXXXXXX",
+"###############X",
+"XXXXXX#########X",
+".....X#########X",
+".....X#### ####X",
+".....X#########X",
+".....X#########X",
+".....X###### ##X",
+".....X#########X",
+".....XXXXXXXXX#X",
+"%%...........X#X",
+"%%%%.........X#X",
+"&%%%.........X#X",
+"&%%%%........X#X",
+"&&&%%........X#X",
+"&&&%%........X#X",
+
+"X###@@@@@@@-@-@-",
+"X#########--@---",
+"X########-@-@---",
+"X#######--@---@-",
+"X######-@-@---@-",
+"X# ###--@---@-@-",
+"X####-@-@---@---",
+"X####-@---@-@--@",
+"X## #-@---@---@@",
+"X## #---@-@--@@@",
+"X####---@---@@@@",
+"X####-@-@--@@@@@",
+"X####-@---@@@@@@",
+"X  ##-@--@@@@@@@",
+"X####---@@@@@@@@",
+"X####--@@@@@@@@-",
+
+"--.........%%%%&",
+"@-..........%%%&",
+"@-..........%%%%",
+"@-............%%",
+"--..............",
+"-@@@@@@@@-......",
+"@@@@@@@@--......",
+"@@@@@@@---......",
+"@@@@@@----......",
+"@@@@@-----......",
+"@@@@------......",
+"@@@-------......",
+"@@-------@@@@@@@",
+"@-------@@...@@@",
+"-------@@@@@@@@@",
+"------@@...@@@..",
+
+"&%%%%........X#X",
+"&%%%.........X#X",
+"%%%%.........X#X",
+"%%...........X#X",
+".............X#X",
+".....X@@@@@@@##X",
+".....X@@@@@@###X",
+".....X@@@@@####X",
+".....X@@@@### #X",
+".....X@@@$#####X",
+".....X@@$$$####X",
+".....X@$$$$$###X",
+"@@@@@@$$$$$$$##X",
+"...@@$$$$$$$$$#X",
+"@@@@$$$$$$$$$$$X",
+".@@$$$$$$$$$$$$X",
+
+"X####-@@@@@@@@--",
+"X####@@@@@@@@---",
+"X#####$$$$$$$---",
+"X###@@@.....$---",
+"X###@@@@....$---",
+"X###@@@@@...$---",
+"@@@@@@@@@@..$--@",
+"@@@@@@@@@@@.$-@@",
+"@@@@@@@@@@@@$@@@",
+"X###@@@@@@@@##$$",
+"X###@@@@@@@@###$",
+"X## @@@@@@@@####",
+"X## @@@@@@@@## #",
+"X#######@@@#####",
+"X#######@@@#####",
+"XXXXXXXX@@@XXXXX",
+
+"-----@@@@@@@@@@@",
+"----@@...@@@...@",
+"---@@@@@@@@@@@@@",
+"--@@...@@@...@@$",
+"-@@@@@@@@@@@@@$$",
+"@@...@@@...@@$$$",
+"@@@@@@@@@@@@$$$$",
+"...@@@...@@$$$$$",
+"@@@@@@@@@@$$$$$$",
+"$$$$$$$$$$$$$$$+",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"#$$$$$$$$$$$$$$$",
+"##$+$$$$$$$$+$$$",
+"###$$$$$$$$$$$$$",
+"XXXXXXXXXXXXXXXX",
+
+"@@$$$$$$$$$$$$$X",
+"@$$$+$$$$+$$$$$X",
+"$$$$$$$$$$$$$$$X",
+"$$$$$$$$$$$$$$$X",
+"$$$$$$$+$$$+$$$X",
+"$$$$$$$$$$$$$$$X",
+"$$$$$$$$$$$$$$$X",
+"$$$$$$$$$$$$$$$X",
+"$$$$$$$$$$$$$$$X",
+"$$$$$$$$$$$$$$$X",
+"$$$$$$$$$$$$$$$X",
+"$$$$$$$+$######X",
+"$$$$$$$$$# # ##X",
+"$$$$$$$$$### ##X",
+"$$$$$$$$$######X",
+"XXXXXXXXXXXXXXXX",
+
+"XXXXXXXXXXXXXXXX",
+"X###############",
+"X###############",
+"X############@@@",
+"X###########-@..",
+"X##########--@..",
+"X#########---@..",
+"X########----@..",
+"X#######-----@..",
+"X######---X--@..",
+"X#####---XX--@@@",
+"X#####---@X-@XXX",
+"X#####--@@--@...",
+"X#####--@---@...",
+"X#####----X-@...",
+"X#####---XX-@...",
+
+"XXXXXXXXXXXXXXXX",
+"################",
+"################",
+"@@@@@@##########",
+".....@@@@@@@@@@@",
+".....@..........",
+".....@..........",
+".....@..........",
+".....@..........",
+".....@..........",
+"@@@@@@......X.X.",
+"XXXXX...........",
+"................",
+"................",
+"................",
+"..X.............",
+
+"XXXXXXXXXXXXXXXX",
+"###############X",
+"###############X",
+"###############X",
+"@@@@@@@@@@@@@##X",
+"............@##X",
+".........X..@##X",
+"............@##X",
+".........X..@##X",
+"............@##X",
+"X........X..@$#X",
+"............@$#X",
+"............@$#X",
+"............@$#X",
+"............@$#X",
+".........%..@$#X",
+
+"X#####---@X-@...",
+"X#####--@@--@...",
+"X#####--@---@...",
+"X#####----X-@...",
+"X#####---XX-@...",
+"X#####---@X-@...",
+"X#####--@@--@...",
+"X#####--@---@...",
+"X#####----X-@...",
+"X#####---XX-@...",
+"X#####---@X-@...",
+"X#####--@@--@...",
+"X#####--@---@...",
+"X#####----X-@...",
+"X#####---XX-@...",
+"X#####---@X-@...",
+
+"................",
+"................",
+"..X.............",
+"................",
+"................",
+"..X.............",
+"...............%",
+".............%%%",
+"............-%%%",
+"...........--%%-",
+"..........---%--",
+".........-------",
+"........----@@@@",
+".......----@@@XX",
+".......---@@@X..",
+".......--@@@X..@",
+
+"........%...@$#X",
+".....%%%%%..@$#X",
+"......%.....@$#X",
+".....%......@$#X",
+"...%%X......@$#X",
+".%%--.......@$#X",
+"%%---.......@$#X",
+"%----.......@$#X",
+"-----.......@$#X",
+"-----.......@$#X",
+"-----.......@$#X",
+"-----.......@$#X",
+"@@@@........@$#X",
+"@@@.........@$#X",
+"@@..........@$#X",
+"@...........@$#X",
+
+"X#####--@@--@...",
+"X#####--@---@@@@",
+"X#####-----@@@@@",
+"X#####----@@@@XX",
+"X#####---@@@@X..",
+"X#####--@@@@X..@",
+"X#####-@@@@@@@@@",
+"X#####@@@@@@@@@@",
+"X######$$$$$$$$$",
+"X#######$$$$$$$$",
+"X########$$$$$$$",
+"X#########$$$$$$",
+"X##########$$$$$",
+"X###############",
+"X###############",
+"XXXXXXXXXXXXXXXX",
+
+".......-@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@+@@+@@+@",
+"X@@@@@@@@@@@@@@@",
+"@@@@@@@XXXXXX@@@",
+"@@@@@@X+++++@@@@",
+"@@@@@X+++++@@@@@",
+"@@@@X+++++@@@@@@",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"########$$$$$$$#",
+"#########$$$$$$$",
+"XXXXXXXXXXXXXXXX",
+
+"............@$#X",
+"@@@@@@@@@@@@@$#X",
+"@@@@@@@@@@@@$$#X",
+"@@@XXX@@@@@$$$#X",
+"@@X..@@@@@$$$$#X",
+"@X..@@@@@$$$$$#X",
+"@@@@@@@@$$$$$$#X",
+"@@@@@@@$$$$$$$#X",
+"$$$$$$$$$$$$$$#X",
+"$$$$$$$$$$$$$$#X",
+"$$$$$$$$$$$$$$#X",
+"$$$$$$$$$$$$$$#X",
+"$$$$$$$$$$$$$$#X",
+"###############X",
+"###############X",
+"XXXXXXXXXXXXXXXX",
+
+"Xooooooooooooooo",
+"XoXXXXXXXXXXXXXX",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+
+"oooooooooooooooo",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"oooooooooooooooo",
+"XXXXXXXXXXXXXXXo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+
+"                ",
+"                ",
+"    Xooooo      ",
+"   XooXXXoo     ",
+"  XooX   Xoo    ",
+"  Xoo     XX    ",
+"  Xoo           ",
+"  Xoo           ",
+"  Xoo           ",
+"  Xoo           ",
+"  Xoo     oo    ",
+"  XXoo   ooX    ",
+"   XXoooooX     ",
+"    XXXXXX      ",
+"                ",
+"                ",
+
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xo              ",
+"Xooooooooooooooo",
+"XXXXXXXXXXXXXXXX",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"oooooooooooooooo",
+"XXXXXXXXXXXXXXXX",
+
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"              Xo",
+"oooooooooooooooo",
+"XXXXXXXXXXXXXXXX",
+
+"oooooooooooooooo",
+"o###############",
+"o#########$#####",
+"o###############",
+"o#########@@@@@@",
+"o#######@@@@@@@@",
+"o#####$@@@@@@@@@",
+"o######@@@@@@@@@",
+"o##$###@@@@@@...",
+"o######@@@@@.%%%",
+"o######@@@@@.%%%",
+"o######@@@@@.%%%",
+"o######@@@@@.%%%",
+"o######@@@@@@...",
+"o######@@@@@@@..",
+"o#$####@%@@@.@.%",
+
+"oooooooooooooooo",
+"################",
+"################",
+"################",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"................",
+"%@@@@@@@@@@@@@@@",
+".@..............",
+"+@..............",
+"+@..............",
+"+@..............",
+".@..............",
+"+@..............",
+
+"oooooooooooooooo",
+"###############o",
+"################",
+"################",
+"@@@@@@##$######o",
+"@@@@@@@@###$###o",
+"@@@@@@@@@######o",
+"@@@@@@@@@#$####o",
+"...@@@@@@######o",
+"@%%.@@@@@######o",
+"@X%.@@@@@######o",
+"@%%.@@@@@####$#o",
+"@%%.@@@@@######o",
+"@..@@@@@@######o",
+"@..@@@@@@######o",
+"@.@.@@@@@######o",
+
+"o######%+@@@@...",
+"o#####%+%@@@@@.%",
+"o####%+%%@@@.@..",
+"o###%+%%%@@@@..%",
+"o##%+#%%%@@@@@..",
+"o##+##%%%@@@.@.%",
+"o#####%%%@@@@...",
+"o#####%%%@@@@@.%",
+"o#####%%+@@@.@..",
+"o#####%+@@@@@..%",
+"o####%+@@@@@@@..",
+"o###%+#@@@@@.@.%",
+"o##%+##@@@@@@...",
+"o##+###@@@@@@@.%",
+"o######@@@@@.@..",
+"o###$##@@@@@@..%",
+
+".@..............",
+"+@..............",
+".@..............",
+"+@@@@@@@@@@@@@@@",
+".....++..+++++++",
+"+.+.........++++",
+"....++++++++....",
+"%.%..........%.%",
+"....$$$$$$$$....",
+".%%.$------$.%%%",
+"....$------$....",
+"%.%.$------$.%%+",
+"....$------$....",
+".%%.$------$.+%%",
+"....$------$....",
+"%.%.$------$.%%%",
+
+"@.@@@@@@@######o",
+"@..@@@@@@######o",
+"@.@.@@@@@######o",
+"@.@@@@@@@######o",
+"...@@@@@@######o",
+"%.@.@@@@@#####$o",
+"..@@@@@@@######o",
+"%..@@@@@@######o",
+"..@.@@@@@######o",
+"%.@@@@@@@##$###o",
+"...@@@@@@##$###o",
+"%.@.@@@@@######o",
+"..@@@@@@@######o",
+"%..@@@@@@######o",
+"..@.@@@@@######o",
+"%.@@@@@@@######o",
+
+"o######@@@@.....",
+"o#$####@@@$$$$$$",
+"o######@@@$@----",
+"o######@@@$$$$$$",
+"o######@@@@@@@@@",
+"o@@@@@@@@@@@@@@@",
+"o@@@@@@@@@@@@@@@",
+"o@@@@@@@@@@@@@@@",
+"o@@@@@@@@@@@@@@@",
+"o@@@@@@@@@@@@@@@",
+"o###############",
+"o########$######",
+"o###$###########",
+"o############$##",
+"o###############",
+"oooooooooooooooo",
+
+"....$------$....",
+"$$$$$$$$$$$$$$$$",
+"----$-----------",
+"$$$$$$$$$$$$$$$$",
+"@@@@@@@@@@@@@@@@",
+"@@@@@oooo@@@@@@@",
+"@@@@oo@@oo@@@@@@",
+"@@@@oo@@@@@@@@@@",
+"@@@@oo@@@@@@@@@@",
+"@@@@oo@@@@@@@@@@",
+"@@@@oo@@oo@@@@##",
+"#@@@@oooo@@@@###",
+"#$#@@@@@@@@##$$#",
+"##@####$########",
+"################",
+"oooooooooooooooo",
+
+"....@@@@@######o",
+"$$$$$@@@@####$#o",
+"----$@@@@######o",
+"$$$$$@@@@######o",
+"@@@@@@@@@######o",
+"@@@@@@@@@@@@@@@o",
+"@@@@@@@@@@@@@@@o",
+"@@@@@@@@@@@@@@@o",
+"@@@@@@@@@@@@@@@o",
+"@@@@@@@@@@@@@@@o",
+"##############$o",
+"###########$###o",
+"#$$$#$$$#######o",
+"###############o",
+"###############o",
+"oooooooooooooooo",
+
+"oooooooooooooooo",
+"o               ",
+"o               ",
+"o               ",
+"o               ",
+"o  @XXXXXX      ",
+"o @@XXXXXX      ",
+"o @@XXXXXX      ",
+"o @@XXXXXX   .  ",
+"o @@XXXXXX  .   ",
+"o @@XXXXXX .   .",
+"o @@XXXXXX  +   ",
+"o @..=....   .  ",
+"o @......   .   ",
+"o  @@      .    ",
+"o  @@       +   ",
+
+"oooooooooooooooo",
+"                ",
+"                ",
+"                ",
+"               %",
+"             %%-",
+"            %%--",
+"           %%---",
+" .   .    %%----",
+".   .    %%-X---",
+"   .    %%X-----",
+"+   +  %%X------",
+"      %%--------",
+"     %%---X--X--",
+"    %%---X-----@",
+"    %X--------@@",
+
+"oooooooooooooooo",
+"               o",
+"               o",
+"               o",
+"%%%%--         o",
+"----%--@       o",
+"-----%-@@      o",
+"--------@@     o",
+"-------&@@@    o",
+"-----@@@.@@    o",
+"---@@@@@.@@@   o",
+"--@@@@@@@.@@.  o",
+"-@@@@@@@@..@.  o",
+"@@@@@@@@@....  o",
+"@@@@@@@@@....  o",
+"@@@@@@@@@....  o",
+
+"o  @@   .    .  ",
+"o  @@  .    .   ",
+"o  @@ .    .    ",
+"o  @@  +    +   ",
+"o  @@   .      X",
+"o  @@  .      XX",
+"o  @@ .      XX ",
+"o  @@  +    XX  ",
+"o  @@      XX   ",
+"@@@@@@  .   +   ",
+"@@@@@@ .     + X",
+"@@@@@@.       XX",
+"o      +     XX+",
+"o       .   XX  ",
+"o      .   XX   ",
+"o     .     +   ",
+
+"   XX------X-@@@",
+"  XXX-----X-@@@@",
+" XX X------@@@@@",
+"XX   -X---@@@X@@",
+"X    X---@@@X@@@",
+"    XXX-@@@@@@@@",
+"   XX X@@@@@@@@X",
+"  XX  XX@@@@@@@@",
+" XX+    X@X@@@@@",
+"XX  +    .@@@@@@",
+"X    +  XX..@@@.",
+"      +XX   ....",
+"      XX   ++XX ",
+"+    XX  +++XX++",
+" +  XX ++++XX++X",
+"  +XX ++++XX++XX",
+
+"@@@@@@@@@....  o",
+"X@@@@@@@.....  o",
+"@@@@@@@....X.  o",
+"@@@@X@..X...   o",
+"@@@@@......    o",
+"X@@@......  .  o",
+"@@@.X..X.  .   o",
+"@@.X..X.  .    o",
+"@......    +   o",
+"......      .  o",
+"X..X.      .   o",
+"....      .    o",
+" XX        +   o",
+"XX          .  o",
+"X++        .   o",
+"++++      .    o",
+
+"o      +     +  ",
+"o       .     + ",
+"o      .  oooo +",
+"o     .  oo  oo ",
+"o      + oo     ",
+"o       .oo     ",
+"o      . oo     ",
+"o     .  oo  oo ",
+"o      +  oooo  ",
+"o       .   .   ",
+"o      .   .   .",
+"o     .   .   . ",
+"o      +   +   +",
+"o               ",
+"o               ",
+"oooooooooooooooo",
+
+"  XX+++++XX++XX+",
+" XX ++++XX++XX++",
+"XX  +++XX++XX+++",
+"+   ++XX++XX++++",
+" +  +XX+++++++++",
+"  + ++++++++++++",
+"   +++++++++++++",
+"    ++++++++++++",
+"     +++++++++++",
+".   . ++.+++.+++",
+"   .   .+++.+++.",
+"  .   .  +.+++.+",
+"   +   +   + +++",
+"                ",
+"                ",
+"oooooooooooooooo",
+
+"+++++      +   o",
+"++++++      .  o",
+"+++++++    .   o",
+"+++++++   .    o",
+"+++++++    +   o",
+"+++++++     .  o",
+"+++++++    .   o",
+"+++++++   .    o",
+"++++++     +   o",
+".+++.+  .   .  o",
+"+++.+  .   .   o",
+"++.+  .   .    o",
+"++ +   +   +   o",
+"               o",
+"               o",
+"oooooooooooooooo",
+
+"oooooooooooooooo",
+"o               ",
+"o      $$$$$$$$$",
+"o     $$@@@@@@@@",
+"o    $$$@@@@@@@@",
+"o   $$$$@@@@@@@@",
+"o  $$$$$@@@@@@@@",
+"o  $$$$$@@@@@@@@",
+"o  $X$$$@@@@@@@@",
+"o  $$$$$@@@@@@@@",
+"o  $X$$$@@@@@@@@",
+"o  $$$$$@@@@@@@@",
+"o  $X$$$@@@@@@@@",
+"o  $$$$$@@@.@@@@",
+"o  $X$$$@@@@@@@@",
+"o  $$$$$@@@@@@@@",
+
+"oooooooooooooooo",
+"                ",
+"$$              ",
+"@$$$$$$$$$$$$$$$",
+"@$@@@@@@@@@@@@@@",
+"@$@@@@@@@@@@@@@@",
+"@$@@@@@@@@@@@@@@",
+"@$@@@@@@@@@@@@@@",
+"@$@@@@@.@.@@@@@@",
+"@$@@@@@.@.@@@@@@",
+"@$@@@@@@@@@@@@@@",
+"@$@@@@@@@@@@@@@@",
+"@$@@@@@@@@@@@@@@",
+"@$$$$$$$$$$$$$$$",
+"@$$$$$$$$$$$$$oo",
+"@$$$$$$$$$$$$OoX",
+
+"oooooooooooooooo",
+"               o",
+"               o",
+"$$$$$$$$$$$    o",
+"@@@@@@@@@@$    o",
+"@@@@@@@@@@$    o",
+"@@@@@@@@@@$    o",
+"@@@@@@@@@@$    o",
+"@@@@@@@@@@$++  o",
+"@@@@@@@@@@$++  o",
+"@@@@@@@@@@$++  o",
+"@@@@@@@@@@$++  o",
+"@@@@@@@@@@$++  o",
+"$$$$$$$$$$$++  o",
+"oooooooooooooO o",
+"XXXXXXXXXXXXXO o",
+
+"o  $$$$$@@@@@@@@",
+"o  $$$$$@@@@@@@@",
+"o  $$$$$@@@@@@@@",
+"o  $$$$$@@@@@@@@",
+"o  $$$$$@@@@@@@@",
+"o  $$$$$@@@@@@@@",
+"o  $X$$$@@@@@@@@",
+"o  $$$$$@@@@@@@@",
+"o  $X$$$@@@.@@@@",
+"o  $$$$$@@@@@@@@",
+"o  $X$$$@@@@@@@@",
+"o  $$$$$@@@@@@@@",
+"o  $X$$$@@@@@@@@",
+"o  $$$$$@@@@@@@@",
+"o  $.$$$@@@@@@@@",
+"o  ..$$$&&&&&&&&",
+
+"@$$$$$$$$$$$Ooo@",
+"@$$$$$$$$$$OOoo@",
+"@$++++++++OOooo@",
+"@$+++++++OOOooo@",
+"@$++++++OOOoooo@",
+"@$+++++OOOOoooo@",
+"@$+++++OOOooooo@",
+"@$+++++OOOooooo@",
+"@$+++++OOoooooo@",
+"@$+++++OOoooooo@",
+"@$+++++Oooooooo@",
+"@$+++++Oooooooo@",
+"@$++   oooooooo@",
+"@$++   oooooooo@",
+"@$++   oooooooo@",
+"&&&&&&&&&&&&&&&&",
+
+"@@@@@@@@@@@@XO o",
+"@@@@@@@@@@@@XO o",
+"@@@@@@@@@@@@XO o",
+"@@@@@@@@.@@@XO o",
+"@@@@@@@@@@@@XO o",
+"@@oooo@@@@@@XO o",
+"@oo@@oo@@@@@XO o",
+"@oo@@@@@.@@@XO+o",
+"@oo@@@@@@@@@XO+O",
+"@oo@@@@@@@@@XO+O",
+"@oo@@oo@@@@@XO+O",
+"@@oooo@@.@@@XO+O",
+"@@@@@@@@@@@@XO+O",
+"@@@@@@@@@@@@XO+O",
+"@@@@@@@@@@@@XO+O",
+"@@@@@@@@@@@@XO+O",
+
+"o  .$$$&&XXXXXXX",
+"o  $$$&&&.......",
+"o  $$&&X&.......",
+"o  $&&&&&.......",
+"o  &&X&X&.....X.",
+"o  &&&&&&.......",
+"o  &&X&X&.......",
+"o  &&&&&&&&&&&&&",
+"o  &&X&&&&X&X&X&",
+"o  &&&&&&&&&&&&&",
+"o  &&&&&X&X&X&X&",
+"o  &&&&&&&&&&&&&",
+"o  &&&&&&&&&&&&&",
+"o   ++++++++++++",
+"o    +++++++++++",
+"ooooooOOOOOOOOOO",
+
+"XXXXXXXXXXXXXXX&",
+"..............X&",
+"..............X&",
+"..............X&",
+"....X......X..X&",
+"..........X...X&",
+"..............X&",
+"&&&&&&&&&&&&&&&&",
+"X&X&X&X&X&X&&&&O",
+"&&&&&&&&&&&&&&OO",
+"X&X&X&X&X&&&&OOO",
+"&&&&&&&&&&&&OO.O",
+"&&&&&&&&&&&OOOOO",
+"++++++++++++++++",
+"++++++++++++++++",
+"OOOOOOOOOOOOOOOO",
+
+"@@@@@@@@@@@@XO+O",
+"@@@@@@@@@@@@XO+O",
+"@@@@@@@@@@@@XO+O",
+"@@@@@@@@@@@@XO+O",
+"@@@@@@@@@@@@XO+O",
+"OOOOOOOOOOOOOO+O",
+"OOOOOOO.OOOOO++O",
+"OOOOOOOOOOOO+++O",
+"..O.OOOOOOO++++O",
+"OOOOOO.OOO+++++O",
+"OOOOOOOOO++++++O",
+".OO.OOOO+++++++O",
+"OOOOOOO++++++++O",
+"+++++++++++++++O",
+"+++++++++++++++O",
+"OOOOOOOOOOOOOOOO",
+
+"oo@@oooooooooooo",
+"o#@@############",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@oo",
+"o#@@#########oo@",
+"o#@@########ooo@",
+"o#@@#######oooo@",
+"o#@@######oooOo@",
+"o#@@#####oooOoo@",
+"o#@@####oooOoOo@",
+"o#@@###oooOoOoo@",
+"o#@@##oooOoOooo@",
+"o#@@##ooOoOoooo@",
+"o#@@##oOoOooooo@",
+"o#@@##OoOoooooo@",
+"o#@@##oOooooooo@",
+
+"oooooooooooooooo",
+"################",
+"@@@@@@@@@@@@@@@@",
+"ooooooooooooooo@",
+"@@@@@@@@@@@@@@O#",
+"@@@@@@@@@@@@@@OO",
+"@@@@@@@@@@@@@@O@",
+"@@@@@@@@@@@@@@O@",
+"@@.@@@@@@@@@@@O@",
+"@@@@@@@@@@@@@@O@",
+"@@@@@@@@@@@@@@O@",
+"@@@@@@@@@@@@@@O@",
+"@@.@@@@@@@@@@@OO",
+"@@@@@@@@@@@@@@O.",
+"@@@@@@@@@@@@@@O.",
+"@@@@@@@@@@@@@@O.",
+
+"oooooooooooo@@oo",
+"############@@#o",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"############@@#o",
+"OOOOOOOOOOOO@@#o",
+"@@@@@@@@@@@O@@#o",
+"@@@@@@@@@@@O@@#o",
+"@@@@@@@@@@@O@@#o",
+"@@@@@@@@@@@O@@#o",
+"@@@@@@@@@@@O@@#o",
+"@@@@@@@@@@@O.@#o",
+"OOOOOOOOOOOO.@#o",
+"...........$.@#o",
+"..........$$.@#o",
+".........$$$.@#o",
+
+"o#@@##OooooooOo@",
+"o#@@##ooooooOoo@",
+"o#@@##oooooOooo@",
+"o#@@##ooooOooOo@",
+"o#@@##oooOooOoo@",
+"o#@@##ooOooOooo@",
+"o#@@##oOooOoooo@",
+"o#@@##OooOooooo@",
+"o#@@##ooOoooooo@",
+"o#@@##oOooooooo@",
+"o#@@##Ooooooooo@",
+"o#@@##ooooooooo@",
+"o#@@##ooooooooo@",
+"o#@@##ooooooooo@",
+"o#@@##ooooooooo@",
+"o#@@##oooooooOo@",
+
+"@@oooo@@@@@@@@O.",
+"@oo@@oo@@@@@@@OO",
+"@oo@@@@@@@@@@@O@",
+"@oo@@@@@@@@@@@O@",
+"@oo@@@@@@@@@@@O@",
+"@oo@@oo@@@@.@@O@",
+"@@oooo@@...@@@O@",
+"@@@@@@@@@.@@@@O@",
+"@@@@@@@@.@@@@@O@",
+"@@@@@@@.@@@@@@O@",
+"@@@@@@.@@@@@@@O@",
+"@@@@@@@@@@@@@@O@",
+"@@@@@@@@@@@@@@O@",
+"@@@@@@@@@@@@@@O@",
+"@@@@@@@@@@@@@@O@",
+"@@@@@@@@@@@@@@O@",
+
+"........$$$$.@#o",
+"OOOOOOOOOOOO.@#o",
+"@@@@@@@@@@@O@@#o",
+"@@@@@@@@@@@O@@#o",
+"@@@@@@@@@@@O@@#o",
+"@@@@@@@@@@@O@@#o",
+"@@@@@@@@@@@O@@#o",
+"@@@@@@@@@@@O@@#o",
+"@@@@@@@@@@@O@@#o",
+"@@@@@@@@@@@O.@#o",
+"@@@@@@@@@@@O.@#o",
+"@@@@@@@@@@@O.@#o",
+"@@@@@@@@@@@O.@#o",
+"@@@@@@@@@@@O.@#o",
+"@@@@@@@@@@@O.@#o",
+"@@@@@@@@@@@O.@#o",
+
+"o#@@##ooooooOoo@",
+"o#@@##oooooOoOo@",
+"o#@@##ooooOoOoo@",
+"o#@@##oooOoOoooO",
+"o#@@##ooOoOoooOO",
+"o#@@##oOoOoooOOO",
+"o#@@##OoOoooOOOO",
+"o#@@##oOoooOOOOO",
+"o#@@##OoooOOOOOO",
+"o#@@##oooOOOXOOO",
+"o#@@##ooOOOOOOOO",
+"o#@@##oOOOOOOOOO",
+"@@@@@@@.........",
+"@@@@@@@@........",
+"o#@@#####$$$$$$$",
+"oo@@oooooooooooo",
+
+"@@@@@@@@@@@@@@O@",
+"@@@@@@@@@@@@@@O@",
+"@@@@@@@@@@@@@@O@",
+"OOOOOOOOOOOOOOO@",
+"OOOOOOOOOOOOOO@@",
+"OXOOOXOOOXOOO@@@",
+"OOOOOOOOOOOO@@@@",
+"OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOO",
+"XOOOXOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOO",
+"OOOOOOOXOOOOOOOO",
+"................",
+"................",
+"$$$$$$$$$$$$$$$$",
+"oooooooooooooooo",
+
+"@@@@@@@@@@@O.@#o",
+"@@@@@@@@@@@O.@#o",
+"@@@@@@@@@@@O.@#o",
+"@@@@@@@@@@@O.@#o",
+"@@@@@@@@@@@O.@#o",
+"@@@@@@@@@@@O.@#o",
+"@@@@@@@@@@@O.@#o",
+"OOOOOOOOOOOO.@#o",
+"OOOOOOOOOOO$.@#o",
+"OOOOOOOOOO$$.@#o",
+"OOOOOOOOO$$$.@#o",
+"OOOOOOOO$$$$.@#o",
+".............@@@",
+".............@@@",
+"$$$$$$$$$$$$.@$o",
+"oooooooooooo.@oo",
+
+"          OOOOOO",
+"ooooooooo&O@@@@@",
+"o       &OO@@@@@",
+"o      &X&O@@@@@",
+"o     &O&OO@@@@@",
+"o    &O&O&O@@@@@",
+"o   &O&O&OO@@@@@",
+"o  &O&O&O&O@@@@@",
+"o  O&O&O&OO@@@@@",
+"o  &O&O&O&O@@@@@",
+"o  O&O&O&OOOOOOO",
+"o  &O&O&O&OOOOOO",
+"o  O&O&O&OOOOOOO",
+"o  &O&O&O.......",
+"o  O&O&O&.......",
+"o  &O&O&O.......",
+
+"OOOOOO          ",
+"@@@@@Ooooooooooo",
+"@@@@@O          ",
+"@@@@@O          ",
+"@@@@@O         .",
+"@@@@@O        &.",
+"@@@@@O       .&.",
+"@@@@@O      &...",
+"@@@@@O     .&.&.",
+"@@@@@O    &...&.",
+"OOOOOO   .&.&.&.",
+"OOOOO   &...&...",
+"OOOO + .&.&.&.&.",
+"...+++&...&...&.",
+"...+++&.&.&.&.&.",
+"...+++..&.&.&...",
+
+"                ",
+"oooooooooooooooo",
+"               o",
+"&&&&&&&&&&&&&& o",
+"&............& o",
+"&@@@@@@@@@@@.& o",
+"&@@@@@@@@@@@.& o",
+"&@@@@@@@@@@@.& o",
+"&@@@@@@@@@@@.& o",
+"&@@@@@@@@@@@.& o",
+"&@@@@@@@@@@@.& o",
+"&@@@@@@@@@@@.& o",
+"&@@@@@@@@@@@.& o",
+"&@@@@@@@@@@@.& o",
+"&@@@@@@@@@@@.& o",
+"&@@@@@@@@@@@.& o",
+
+"o  O&O&O&...&OOO",
+"o  &O&O&O..&O...",
+"o  O&O&O&.&O&@@@",
+"o  &O&O&O&O&O@@@",
+"o  O&O&O&O&O&@@@",
+"o  &O&O&O&O&O@@@",
+"o  O&O&O&O&O&@@@",
+"o  &O&O&O&O&O@@@",
+"o  O&O&O&O&O&@@@",
+"o  &O&O&O&O&O@@@",
+"o  O&O&O&O&O&@@@",
+"o  &O&O&O&O&O@@@",
+"o  O&O&O&O&O&@@@",
+"o  &O&O&O&O&O@@@",
+"o  O&O&O&O&O&@@@",
+"o  &O&O&O&O&O@@@",
+
+"OOOOOOOOOO&.&.&.",
+".........O&...&.",
+"@@@@@@@@.O&.&.&.",
+"@@@@@@@@.O..&...",
+"@@@@@@@@.O&.&.&&",
+"@@@@@@@@.O&...&&",
+"@oooo@@@.O&.&&&&",
+"oo@@oo@@.O&.&&&&",
+"oo@@@@@@.O&&&&&&",
+"oo@@@@@@.O&&&&&o",
+"oo@@@@@@.O&&&&oo",
+"oo@@oo@@.OXXXooo",
+"@oooo@@@.OXXXooo",
+"@@@@@@@@.OXXXooo",
+"@@@@@@@@.OXXXooo",
+"@@@@@@@@.OXXXooo",
+
+"&@@@@@@@@@@@.& o",
+"&@@@@@@@@@@@.& o",
+"&&&&&&&&&&&&&& o",
+"&&&&&&&&&&&&&  o",
+"&&&&&&&&&&&&   o",
+"&&&&&&&&&&&++  o",
+"&&&&&&&&&&+++  o",
+"&oOOOOOOOOOOOOOo",
+"oo@@@@@@@@@@@@Oo",
+"oo@@@@@@@@@@@@Oo",
+"oo@@@@@@@@@@@@Oo",
+"oo@@@@@@@@@@@@Oo",
+"oo@@@@@@@@@@@@Oo",
+"oo@@@.@.@@@@@@Oo",
+"oo@@@@@@@@@@@@Oo",
+"oo@@@.@.@@@@@@Oo",
+
+"o  O&O&O&O&O&@@@",
+"o  &O&O&O&O&O@@@",
+"o  O&O&O&O&O&@@@",
+"o  &O&O&O&O&OOOO",
+"o  O&O&O&O&OOOOO",
+"o  &O&O&O&OOOXOX",
+"o  O&O&O&OOOOOOO",
+"o  &O&O&OOOOXOXO",
+"o  O&O&OOOOOOOOO",
+"o  &X&OOOOOXOOOO",
+"o  O&OOOXXOOXOXX",
+"o  &OOOOOOOOOOOO",
+"o  OOOOOOOOOOOOO",
+"o   ++++++++++++",
+"o    +++++++++++",
+"ooooooOOOOOOOOOO",
+
+"@@@@@@@@.OXXXooo",
+"@@@@@@@@.OXXXooo",
+"@@@@@@@@.OXXXooo",
+"OOOOOOOOOOXXXooo",
+"OOOOOOOOOXXXXooo",
+"OOXOOXOOXXXXXooo",
+"OOOOOOOXXXXXXooO",
+"OOXOOOXXXXXXXoOO",
+"OXOOOOOOOOOOOOOO",
+"OOOOOOOOOOXOOOOO",
+"OXXOXOXOOOOOXXOO",
+"OOOOOXOOOOOOOOOO",
+"OOOOOOOOOOOOOOOO",
+"++++++++++++++++",
+"++++++++++++++++",
+"OOOOOOOOOOOOOOOO",
+
+"oo@@@@@@@@@@@@Oo",
+"oo@@@@@@@@@@@@Oo",
+"oo@@@@@@@@@@@@Oo",
+"ooOOOOOOOOOOOOOo",
+"oOOOOOOOOOOOOO o",
+"OXOOOOOOXOOOO+ o",
+"OOOOXXOOOOXO++ o",
+"OOXXOOOOXOO+++ o",
+"OOOOOOOOOO++++ o",
+"XOOOOOOXO+++++ o",
+"OXOXOOOO++++++ o",
+"XOOOOOO+++++++ o",
+"OOOOOO++++++++ o",
+"++++++++++++++ o",
+"++++++++++++++ o",
+"OOOOOOOOOOOOOOoo",
+
+"oooooooooooooooo",
+"o###############",
+"o###############",
+"o#$##+++++++++++",
+"o###o++         ",
+"o##oo+ +        ",
+"o##oo+  ++++++++",
+"o##oo+  + +    +",
+"o##oo+  + ++++++",
+"o##oo+  + + ++.+",
+"o##oo+  + + ++.+",
+"o##oo+  + + ++.+",
+"o##oo+  + + ++.+",
+"o##oo+  + + ++.+",
+"o##oo+  + ++++++",
+"o##oo+  + +....+",
+
+"oooooooooooooooo",
+"##$#############",
+"################",
+"+++#@@@@@@@@@@@@",
+"  +#@@@@@@@@@@@@",
+" ++#@@@@@@@@@@@@",
+"+++#&&&@@@@@@@@@",
+".++#&&&@@@@@@@@@",
+".++#@@@@@@@@@@@@",
+".++$@@@@@@@@@@@@",
+".++$@@@@@@@@@@@@",
+".++$@@@@@@@@@@@@",
+".++$OOO@@@@@@@@@",
+".++$OOO@@@@@@@@@",
+".++$@@@@@@@@@@@@",
+".++$%%%@@@@@@@@@",
+
+"oooooooooooooooo",
+"###############o",
+"###############o",
+"@@@@@@@@#######o",
+"@@@@@@@@#$#####o",
+"@@@@@@@@#######o",
+"@@@@@@@@####$##o",
+"@@@@@@@@#######o",
+"@@@@@@@@#######o",
+"@@@@@@@@#######o",
+"@@OOOX@@#######o",
+"@@OOOX@@##$####o",
+"@@@@@@@@###$###o",
+"@@@@@@@@#######o",
+"@@@@@@@@#######o",
+"@@@@=========##o",
+
+"o##oo+  ++++++++",
+"o##oo+  ........",
+"o##oo+  ++++++++",
+"o##oo+ +++++++++",
+"o##oo+++++++++++",
+"o##ooOOOOOOOOOOO",
+"o##oOOOOOOOOOOOO",
+"o###$$$$$$$$$$$$",
+"@@@@@...........",
+"@@@@@@@@@@@@@@@@",
+"@@@-@@@-@@@-@@@-",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"o########@@@@###",
+"o########@@@@@@@",
+"o########@@@@@@@",
+
+".++$%%%@@@@@@@@@",
+"+++$@@@@@@@@@@@@",
+"+++$ooo@@oooo@@@",
+"+++$ooo@oo@@oo@@",
+"+++$@@@@oo@@@@@@",
+"OO$$@@@@oo@@@@@@",
+"O$$$##@@oo@@@@##",
+"$$$$##@@oo@@oo@@",
+"....@@@@@oooo@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@-@@@-@@@-@@@-",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"################",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+
+"@@@=%%%%%%%=###o",
+"@@=%%%%%%%=####o",
+"@=========#####o",
+"@@@@--@@#######o",
+"@@@--@@@#######o",
+"@@--@@@@#######o",
+"#--###########$o",
+"@@.@@@@@@@@@@@@@",
+"@@@.@@@@@@@@@@@@",
+"@@@@.@@@@@@@@@@@",
+"@@.@...@.@@-@@@@",
+"@@@.......@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"##@@@@#########o",
+"@@@@@@#########o",
+"@@@@@@#########o",
+
+"o########@@@@@@@",
+"o#####$##@@@@@@@",
+"o#########@@@@@@",
+"o###############",
+"o##$############",
+"o###############",
+"o###############",
+"o##########$####",
+"o#######$#######",
+"o#######$#######",
+"o###############",
+"o###############",
+"o####$##########",
+"o###############",
+"o###############",
+"oooooooooooooooo",
+
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"################",
+"##@@@@@@@@@@@@@@",
+"#&XXXXXXXXXXXXXX",
+"&&..............",
+"&&..............",
+"&&..............",
+"&&..............",
+"&&..............",
+"&&@@@@@@@@@@@@@@",
+"&&&&&&&&&&&&&&&&",
+"&&&&&&&&&&&&&&&&",
+"#$$$$$$$$$$$$$$$",
+"oooooooooooooooo",
+
+"@@@@@@##$######o",
+"@@@@@##########o",
+"@@@@#######$###o",
+"###############o",
+"@@@############o",
+"XX@############o",
+".X@######$#####o",
+".X@############o",
+".X@############o",
+".X@$###########o",
+".X@$####$######o",
+"@@@$###########o",
+"&&$$###########o",
+"&$$$###########o",
+"$$$$###########o",
+"oooooooooooooooo",
+
+"oooooooooooooooo",
+"o               ",
+"o               ",
+"o           $   ",
+"o $  $          ",
+"o               ",
+"o               ",
+"o         $     ",
+"o               ",
+"o $   $      ...",
+"o            .##",
+"o            .##",
+"o       $    .##",
+"o            .##",
+"o            .##",
+"o    $     $ .##",
+
+"oooooooooooooooo",
+"                ",
+"              $ ",
+" $              ",
+"        oooooooo",
+" $     oo.......",
+"      oOo.......",
+"     oooo.......",
+"     OoOo...X.X.",
+".... oooo...XXXX",
+"#### OoOo...X.X.",
+"#### oooo.......",
+"#..  OoOo.......",
+"#.   oooo.......",
+"#.   OoOoooooooo",
+"#.   oooOO.O.O.O",
+
+"oooooooooooooooo",
+"               o",
+"            $  o",
+"               o",
+"oooooooooooo   o",
+"...........o   o",
+"...........o   o",
+"...........o   o",
+"X..........o   o",
+"X..........o   o",
+"X..........o+  o",
+"...........o+  o",
+"...........o+  o",
+"...........o+  o",
+"oooooooooooo+  o",
+".O.O.O.O.OO++  o",
+
+"o            .##",
+"o            .##",
+"o $     $    .##",
+"o            .##",
+"o            .##",
+"o            .##",
+"o   $    .......",
+"o       %.......",
+"o      %%...%.%.",
+"o $   %%%.......",
+"o    %%%%...%.%.",
+"o    %%%%.......",
+"o    %%%%...%.%.",
+"o    %%%%.......",
+"o    %%%%...%.%.",
+"o    %%%%.......",
+
+"#.  .OoOOOOOOOOO",
+"#.   oOO.O.O.O.O",
+"#.    ++++++++++",
+"#.     +++++++++",
+"#.      ++++++++",
+"#.      @@@@@@@@",
+"....... @@@@@@@@",
+"....... @@@oooo@",
+"%.%.%.. @@oo@@oo",
+"....... @@oo@@@@",
+"%.%.%.. @@oo@@@@",
+"....... @@oo@@@@",
+"%.%.%..+@@oo@@oo",
+".......+@@@oooo@",
+"%.%.%..+@@@@@@@@",
+".......+@@@@@@@@",
+
+"OOOOOOOOOO+++  o",
+".O.O.O.OO++++  o",
+"+++++++++++++  o",
+"+++++++++++++  o",
+"+++++++++++++  o",
+"@@@@@@         o",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@         o",
+"@@@@@@         o",
+"@@@@@@         o",
+
+"o    %%%%...%.%.",
+"o    %%%%.......",
+"o  $ %%%%...%.%.",
+"o    %%%%.......",
+"o    %%%%...%.%.",
+"o    %%%%.......",
+"o $  %%%%.......",
+"o    %%%%.......",
+"o    %%%%@@@@@@@",
+"o    %%%@@X@@X@@",
+"o    %%@@@@@@@@X",
+"o $  %@@@@@@@@X@",
+"o     ++++++++++",
+"o      +++++++++",
+"o       ++++++++",
+"oooooooooooooooo",
+
+"%.%.%..+@@@@@@@@",
+".......+@@@@@@@@",
+"%.%.%..+@@@@@@@@",
+".......+@@@@@@@@",
+"%.%.%..+@@@@@@@@",
+".......+@@@X@@@X",
+".......+@@@X@@@X",
+".......+@@@X@@@X",
+"@@@@@@++@@@@@@@@",
+"X@@@@+++        ",
+"@@@@++++  X   $ ",
+"@@@+++++        ",
+"++++++++        ",
+"++++++++        ",
+"++++++++     $  ",
+"oooooooooooooooo",
+
+"@@@@@@ $    $  o",
+"@@@@@@         o",
+"@@@@@@    $    o",
+"@@@@@@         o",
+"@@@@@@         o",
+"@@@X@@ $       o",
+"@@@X@@      $  o",
+"@@@X@@    $    o",
+"@@@@@@         o",
+"               o",
+"  $   $        o",
+"               o",
+"       $    $  o",
+"               o",
+"               o",
+"oooooooooooooooo",
+
+"oooooooooooooooo",
+"o               ",
+"o               ",
+"o               ",
+"o               ",
+"o      #........",
+"o     ##@@@@@@@@",
+"o    ###@@@@@@@@",
+"o   ##.#@@@@@@@@",
+"o  #####@@@@@@@@",
+"o  #.###@@@@@@@@",
+"o  ###.#@@@@@@@@",
+"o  #####@@@@@@@@",
+"o  #.###@@@@@@@@",
+"o  ###.#@@@@@@@@",
+"o  #####@@@@@@@@",
+
+"oooooooooooooooo",
+"                ",
+"                ",
+"        #XXXXXXX",
+"       ##.......",
+"......###.......",
+"@@@@@##.#.......",
+"@@@@#####.......",
+"@@@##.###.......",
+"@@#####.#.......",
+"@.#######......o",
+"@.#.#.###......o",
+"@.#####.#......o",
+"@.#######......o",
+"@.#.#.###......o",
+"@.#####.#.......",
+
+"oooooooooooooooo",
+"               o",
+"               o",
+"XXXXXXXXXXXX   o",
+"...........X   o",
+"...........X   o",
+"...........X   o",
+"...........X   o",
+"...........X   o",
+"oooo.......X   o",
+"o..oo......X   o",
+"o..........X   o",
+"o..........X   o",
+"o..........X   o",
+"o..oo......X   o",
+"oooo.......X   o",
+
+"o  #.###@@@@@@@@",
+"o  ###.#@@@@@@@@",
+"o  #####@@@@@@@@",
+"o  #.###@@@@@@@@",
+"o  ###.#@@@@@@@@",
+"o  #####@@@@@@@@",
+"o  #.###@@@@@@@@",
+"o  ###.#@@@@@@@@",
+"o  #####@@@@@@@@",
+"o  #.###@@@@@@@@",
+"o  ###.#@@@@@@@@",
+"o  #####@@@@@@@@",
+"o  #.###@@@@@@@@",
+"o  ###.#@@@@@@@@",
+"o  #####@@@@@@@@",
+"o  #.###@@@@@@@@",
+
+"@.#######.......",
+"@.#.#.###.......",
+"@.#####.#.......",
+"@.#######.......",
+"@.#.#.###.......",
+"@.#######$$$$$$$",
+"@.######$$X$$$$$",
+"@.#.###$$$$$$$$$",
+"@.####$$X$X$X$$$",
+"@.###$$$$$$$$$$$",
+"@.##$$$$$$$$$$$$",
+"@.#$$$$$$$$$$$$$",
+"@.$$X$$$$$$$X$$$",
+"@.$$$$$$$$$$$$$#",
+"@.$$$X$$X$$$$$##",
+"@.$$X$$X$$X$$#$#",
+
+"...........X   o",
+"...........X   o",
+"...........X   o",
+"...........X   o",
+"...........X   o",
+"$$$$$$$$$$$$   o",
+"$$$$$$X$$$$    o",
+"$$$$$$$$$$+    o",
+"X$$$X$$$$.+    o",
+"$$$$$$$$@X+    o",
+"$$X$$$$@@X+    o",
+"$$$$$$@@@X+    o",
+"#@@@@@@@@X+    o",
+"#@@@@@@@@X+    o",
+"#@@@@@@@@X+    o",
+"#@@@@@@@@X+    o",
+
+"o  ###.#@@@@@@@@",
+"o  #####@@@@@@@@",
+"o  #.###@@@@@@@@",
+"o  ###.#@@@@@@@@",
+"o  #####@@@@@@@@",
+"o  #.###@@@@@@@@",
+"o  #####$$$$$$$$",
+"o  ####$$.$$.$$.",
+"o  ###$$$$$$$$$$",
+"o  ##$.$$.$$.$$+",
+"o  #$$$$$$$$$$++",
+"o   ++++++++++++",
+"o    +++++++++++",
+"o     ++++++++++",
+"o               ",
+"oooooooooooooooo",
+
+"@...........#$##",
+"@.++++++++++$###",
+"@.++++++++++#$##",
+"@.++++++++++$###",
+"@.++++++++++#$##",
+"@.++++++++++$###",
+"$$+ ++++++++####",
+"$ +  +++++++$###",
+"+++   ++++++###$",
+"+++    +++++$#$$",
+"+++     ++++#$$$",
+"+++          +++",
+"+++           ++",
+"+++            +",
+"                ",
+"oooooooooooooooo",
+
+"#@@@@@@@@X+    o",
+"#@@@@@@@@X+    o",
+"#@@@@@@@@X+    o",
+"#@@@@@@@@X+    o",
+"#@@@@@@@@X+    o",
+"#@@@@@@@@X+    o",
+"#$$$$$$$$$+    o",
+"$$$.$$$$$++    o",
+"$$$$$$$$+++    o",
+"$.$$.$$++++    o",
+".$$$$$+++++    o",
+"+++++++++++    o",
+"+++++++++++    o",
+"+++++++++++    o",
+"               o",
+"oooooooooooooooo",
+
+"                ",
+"                ",
+"oooooooooooooooo",
+"o@@--@@@@@@@@@@@",
+"o@@--@@@@@@@@@@o",
+"o@@--@@@@@@@@@oo",
+"o@@--@@@@@@@@ooo",
+"o@@--@@@@@@@oooo",
+"o@@--@@@@@@oooo%",
+"o@@--@@@@@oooo%o",
+"o@@--@@@@oooo%oo",
+"o@@--@@@oooo%ooo",
+"o@@--@@oooo%ooo%",
+"o@@--@@ooo%ooo%o",
+"o@@--@@oo%ooo%oo",
+"o@@--@@o%ooo%ooo",
+
+"   ooooooooooooo",
+"  ooXXXXXXXXXXXX",
+"oooo............",
+"oooo............",
+"oooo............",
+"oo%o............",
+"o%oo............",
+"%ooo............",
+"oooo..........oo",
+"oo%o.........oo.",
+"o%oo.........oo.",
+"%ooo.........oo.",
+"oooo.........oo.",
+"oo%o.........oo.",
+"o%oo..........oo",
+"%ooo............",
+
+"oooooooooooooooo",
+"XXXXXXXXXXXXXXXO",
+"..............XO",
+"..............XO",
+"..............XO",
+"..............XO",
+"..............XO",
+"..............XO",
+"oo............XO",
+".oo...........XO",
+"..............XO",
+"..............XO",
+"..............XO",
+".oo...........XO",
+"oo............XO",
+"..............XO",
+
+"o@@--@@oooo%ooo%",
+"o@@--@@ooo%ooo%o",
+"o@@--@@oo%ooo%oo",
+"o@@--@@o%ooo%ooo",
+"o@@--@@oooo%ooo%",
+"o@@--@@ooo%ooo%o",
+"o@@--@@oo%ooo%oo",
+"o@@--@@o%ooo%ooo",
+"o@@--@@oooo%ooo%",
+"o@@--@@ooo%ooo%o",
+"o@@--@@oo%ooo%oo",
+"o@@--@@o%ooo%ooo",
+"o@@--@@oooo%ooo%",
+"o@@--@@ooo%ooo%o",
+"o@@--@@oo%ooo%oo",
+"o@@--@@o%ooo%ooo",
+
+"oooo............",
+"oo%o............",
+"o%oo............",
+"%ooo............",
+"oooo............",
+"oo%o............",
+"o%oo............",
+"%ooo............",
+"oooo............",
+"oo%o............",
+"o%oo............",
+"%oooOOOOOOOOOOOO",
+"oooXOOOXOOOXOOOX",
+"ooXOOOXOOOXOOOXO",
+"oXOOOXOOOXOOOXOO",
+"XOOOXOOOXOOOXOOO",
+
+"..............XO",
+"..............XO",
+"..............XO",
+"..............XO",
+"..............XO",
+"..............XO",
+"..............XO",
+"..............XO",
+"..............XO",
+"..............XO",
+"..............XO",
+"OOOOOOOOOOOOOOOO",
+"OOOXOOOXOOOXOOO ",
+"OOXOOOXOOOXOOO  ",
+"OXOOOXOOOXOOOo  ",
+"XOOOXOOOXOOO@o  ",
+
+"o@@--@@oooo%oooX",
+"o@@--@@ooo%oooXO",
+"o@@--@@oo%oooXOO",
+"o@@--@@o%oooXOOO",
+"o@@--@@ooooXOOOo",
+"o@@--@@oooXOOOoo",
+"o@@--@@ooXOOOooo",
+"o@@--@@oXOOOoooo",
+"o@@--@@@....oooo",
+"o@@--@@@@...oooO",
+"o@@--@@@@@..ooOO",
+"o@@--@@@@@@.oOOO",
+"o-----------@@@@",
+"o------------@@@",
+"o@@--@@@@@@@@@..",
+"oooooooooooooooo",
+
+"OOOXOOOXOOOXOOOX",
+"OOXOOOXOOOXOOOXO",
+"OXOOOXOOOXOOOXOO",
+"XOOOXOOOXOOOXOOO",
+"....OOOXOOOXOOOX",
+"....OOXOOOXOOOXO",
+"....OXOOOXOOOXOO",
+"....XOOOXOOOXOOO",
+"OOOO............",
+"OOO.............",
+"OO..............",
+"O...............",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"................",
+"oooooooooooooooo",
+
+"OOOXOOOXOOO@@o  ",
+"OOXOOOXOOO.@@o  ",
+"OXOOOXOOO..@@o  ",
+"XOOOXOOO...@@o  ",
+"OOOXOOO....@@o  ",
+"OOXOOO.....@@o  ",
+"OXOOO......@@o  ",
+"XOOO.......@@o  ",
+"...........@@o  ",
+"...........@@o  ",
+"...........@@o  ",
+"...........@@o  ",
+"@@@@@@@@@@@--o  ",
+"@@@@@@@@@@@--o  ",
+"...........@@o  ",
+"oooooooooooooo  ",
+
+"        #XXXXXXX",
+"       ##.......",
+"oooooo###.......",
+"o----####.......",
+"o---#####.......",
+"o--######.......",
+"o--######......#",
+"o--######$$$$$##",
+"o--#####$$$$$###",
+"o--####$$$$$####",
+"o--###$$$$$###%#",
+"o--##$$$$$######",
+"o--#$$$$$###%###",
+"o-------########",
+"o------###%###%#",
+"o-----##########",
+
+"X    ###########",
+"X   ##..........",
+"Xoo###..........",
+"X-####..........",
+"X###%#..........",
+"######..........",
+"##%###..........",
+"######..........",
+"%###%#..........",
+"######..........",
+"##%###.........o",
+"######.........o",
+"%###%#.........o",
+"######.........o",
+"##%###.........o",
+"######..........",
+
+"################",
+"...............#",
+"...............#",
+"...............#",
+"...............#",
+"...............#",
+"...............#",
+"...............#",
+"...............#",
+"oooo...........#",
+"o..oo..........#",
+"o..............#",
+"o..............#",
+"o..............#",
+"o..oo..........#",
+"oooo...........#",
+
+"o----###%###%###",
+"o---############",
+"o---##%###%###%#",
+"o---############",
+"o---####%###%###",
+"o---############",
+"o---##%###%###%#",
+"o---############",
+"o---####%###%###",
+"o---############",
+"o---##%###%###%#",
+"o---############",
+"o---####%###%###",
+"o---############",
+"o---##%###%###%#",
+"o---###########$",
+
+"%###%#..........",
+"######..........",
+"##%###..........",
+"######..........",
+"%###%#..........",
+"######..........",
+"##%###..........",
+"######..........",
+"%###%#$$$$$$$$$$",
+"#####$$$$$$$$$$$",
+"##%#$$$$$$$$$$$$",
+"###$$$$$$$$$$$$$",
+"%#$$$$$$$$$$$$$$",
+"#$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+
+"...............#",
+"...............#",
+"...............#",
+"...............#",
+"...............#",
+"...............#",
+"...............#",
+"...............#",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$ ",
+"$$$$$$$$$$$$$$  ",
+"$$$$$$$$$$$$$o  ",
+"$$$$$$$$$$$$-o  ",
+"$$$$$$$$$$$--o  ",
+"$$$$$$$$$$---o  ",
+"$$$$$$$$$----o  ",
+
+"o---####%###%#$$",
+"o---#########$$$",
+"o---##%###%#$$$$",
+"o---#######$$$$$",
+"o---####%#$$$$$$",
+"o---#####$$$$$$$",
+"o---##%#$$$$$$$$",
+"o---###$$$$$$$$$",
+"o---##$$$$$$$$$$",
+"o---#$$$$$$$$$$$",
+"o---------------",
+"o---------------",
+"o---------------",
+"o---------------",
+"o---------------",
+"oooooooooooooooo",
+
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$-",
+"----------------",
+"----------------",
+"----------------",
+"----------------",
+"----------------",
+"oooooooooooooooo",
+
+"$$$$$$$$-----o  ",
+"$$$$$$$.#----o  ",
+"$$$$$$..#----o  ",
+"$$$$$...#----o  ",
+"$$$$#####----o  ",
+"$$$%#%##-----o  ",
+"$$#####--X--Xo  ",
+"$----#--X--X-o  ",
+"----X--X--X--o  ",
+"-------------o  ",
+"-------------o  ",
+"-------------o  ",
+"-------------o  ",
+"-------------o  ",
+"-------------o  ",
+"oooooooooooooo  ",
+
+"oooooooooooooooo",
+"o               ",
+"o             XX",
+"o   oXXXXXXXXXX.",
+"o  oo........XX.",
+"o oOo........XX.",
+"o ooo........XX.",
+"o oOo........XX.",
+"o ooo........XX.",
+"o oOo........XX.",
+"o ooo........XX.",
+"o oOo........XX.",
+"o ooo........XXO",
+"o oOoOOOOO====OO",
+"o oo.O.OO====O@@",
+"o oOOOOO====OOOO",
+
+"oooooooooooooooo",
+"                ",
+"XXXXXX          ",
+".....XXXXXXXXX--",
+".....X......----",
+".....X......----",
+".....X......----",
+".....X......----",
+".....X......----",
+".....X......----",
+".....X......----",
+".....X......----",
+"OOOOOO......--..",
+"OOOOO&&@@@@@$$&$",
+"@@@@&&@.@.@$$$$$",
+"OOO&&@@@@@$$$.$$",
+
+"oooooooooooooooo",
+"               o",
+"-@             o",
+"-@@XXXXXXXXXX  o",
+"-@@@@.......X  o",
+"-@@@@.......X  o",
+"-@@@@.......X  o",
+"-@@@@.......X  o",
+"-@@@@.......X  o",
+"-@@@@.......X  o",
+"-@@@@.......X  o",
+"..@@@.......X  o",
+"....@.......X  o",
+"&$&$$@@@@@@@@  o",
+"$$$$@@.@.@.@   o",
+".$$@@.@@@@@+   o",
+
+"o  XXXXXXXXXXXXX",
+"o   +..+++++..++",
+"o  @...@...@...@",
+"o  .@...@...@...",
+"o  ..@...@...@..",
+"o  .............",
+"o# .............",
+"o  ...@...@...oo",
+"o  ..@...@...oo.",
+"o  .@...@....oo.",
+"o  ..........oo.",
+"o  ..........oo.",
+"o  @...@.....oo.",
+"o  .@...@.....oo",
+"o  ..@...@......",
+"o           ....",
+
+"XXXXXXXXXXXXXXXX",
+"+++++..+++++..++",
+"...@...@...@....",
+"@...@...@...@...",
+".@...@...@...@..",
+"................",
+"................",
+"oo....@...@..@..",
+".oo..@...@....@.",
+"....@...@......@",
+"................",
+".............@..",
+".oo....@......@.",
+"oo....@........@",
+".....@..........",
+"...   ..@....@..",
+
+"XXXXXXXXXX++   o",
+"++++++++++++   o",
+"++++++++++++   o",
+"               o",
+"    X   X      o",
+"    oOOOOOOO   o",
+"   oo......O   o",
+"   oo......O   o",
+"   oo......O   o",
+"   oo......O   o",
+"   oo......O   o",
+"...oo......O   o",
+"...oo......O   o",
+"...oo......O   o",
+"   oo......O   o",
+"   ooOOOOOOO   o",
+
+"o   # ###   ...*",
+"o       #  .....",
+"o         ......",
+".............*..",
+"................",
+"..........*.....",
+"............... ",
+"..............  ",
+"o               ",
+"o               ",
+"o               ",
+"o               ",
+"o               ",
+"o               ",
+"o               ",
+"oooooooooooooooo",
+
+"...   .@......@.",
+"...   @........@",
+"...   ..........",
+"..    ..@....@..",
+".     .@......@.",
+"      @........@",
+"      ..@.......",
+"      .@.....@..",
+"    # @.......@.",
+"    # .........@",
+"                ",
+"                ",
+"                ",
+"           #    ",
+"                ",
+"oooooooooooooooo",
+
+"   oOOOOOOO+   o",
+"    ++++++++   o",
+"    oOOOO      o",
+"   oo...O      o",
+"   oo...O      o",
+"   oo...O      o",
+"...oo...O      o",
+"...oo...O      o",
+"...ooOOOO      o",
+"   oOOOO+      o",
+"    +++++ #    o",
+"               o",
+"#  #           o",
+"#       ##     o",
+"               o",
+"oooooooooooooooo",
+
+"oooooooooooooooo",
+"o###############",
+"o###############",
+"o$###$###--@@@##",
+"o######----@@@..",
+"o##$##------@...",
+"o####-------@.-X",
+"o####-------@-XX",
+"o###------@@@XXX",
+"o###---@@@@@@.XX",
+"o##o-@@@@@@@..XX",
+"o##o@@@@@@@@..XX",
+"o##o@@@@@@@....X",
+"o##oo@@@@@@.....",
+"o##Xo@@@@@......",
+"o###oo@@@@......",
+
+"oooooooooooooooo",
+"#$##########$###",
+"################",
+"######$#####$###",
+"################",
+"X@@@@@@@@@@@@@@@",
+"XX..............",
+"XXX.............",
+"XXX....@X@X.....",
+"XXX....@X@X.....",
+"XXX....@X@X.....",
+"XXX....@X@X.....",
+"XXX.............",
+"XXX.............",
+".XX.............",
+"..X.............",
+
+"oooooooooooooooo",
+"###############o",
+"####$##########o",
+"########$##$###o",
+"###############o",
+"@@@@@@@@@@@@@##o",
+"............@##o",
+"............@##o",
+"............@##o",
+"....@X......@##o",
+"....@X......@##o",
+"....@X......@##o",
+"............@$#o",
+"............@$#o",
+"............@$#o",
+"............@$#o",
+
+"o###ooo@@.......",
+"o#$##XoOO......O",
+"o$$$##oOOOOOOOOO",
+"o$$$###$OXOOXOOO",
+"o#######$$$$$$$$",
+"@@@@@@@@@.......",
+"@@@@@@@@@@@.....",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"oXXXXXXXXXXXXXXX",
+"o####$$$$#######",
+"o###$$$$#$######",
+"o#$$$$$$$$$#@...",
+"o##$$$$$$$#@OOOO",
+
+".O.OOOOOOOOOOOOO",
+"O.OXOOXOOXOOXOOo",
+"O.OOOOOOOOOOOOoo",
+".OOOOOXXOOXXOooo",
+"$$$$$$$$$$$$$ooX",
+".........$$$$ooo",
+"..........$$$ooo",
+"@@@@@@@@@@@##ooX",
+"@@@@@@X========o",
+"@@@@@@X========o",
+"@@@@@@X========o",
+"XXXX@@X========o",
+"####X@X========o",
+"####X@X========o",
+"####X@XXXXXXXXoX",
+".###X@@@@@@@@ooo",
+
+"o....oooo...@$#o",
+"o...oo..oo..@$#o",
+"o...oo......@$#o",
+"o...oo......@$#o",
+"o...oo......@$#o",
+"o...oo..oo..@$#o",
+"o....oooo...@$#o",
+"o...........@$#o",
+"o...........@$#o",
+"o...@X......@$#o",
+"o...@X......@$#o",
+"o...........@$#o",
+"o...........@$#o",
+"o...@X......@$#o",
+"o...@X......@$#o",
+"o...........@$#o",
+
+"o##$$$$$$#@ooooO",
+"o##$$$$$#@@ooooo",
+"o###$####@@ooooo",
+"o########@@ooooo",
+"o#########@@oooo",
+"o######$##@....X",
+"o###########...#",
+"o###$###########",
+"o#############$#",
+"o########$#$#$$$",
+"o############$$$",
+"o######$###$$$$$",
+"o###$#######$$$$",
+"o###############",
+"o###############",
+"oooooooooooooooo",
+
+"O.##X@@@@@@@@ooo",
+"O.##X@@@@@@@@XoX",
+"O.##X@@@@@@@@Xoo",
+"OX##X@@@@@@@@ooo",
+"X###X@@@@@@@@ooX",
+"####X@@@@@@@@ooo",
+"####X@@@@@@@@Xoo",
+"#$##X@@@@@@@@XoX",
+"$$##X@@@@@@@@ooo",
+"####X@@@@@@@@ooo",
+"$###X@@@@@@@@ooO",
+"$###X@@@@@@@@oOO",
+"$###X@@@@@@@@#$$",
+"####X@@@@@@@@##$",
+"####X@@@@@@@@###",
+"ooooo@@@@@@@@ooo",
+
+"o...........@$#o",
+"o...@X......@$#o",
+"o...@X......@$#o",
+"o...........@$#o",
+"o...........@$#o",
+"o...........@$#o",
+"o...........@$#o",
+"o...........@$#o",
+"oOOOOOOOOOOOO$#o",
+"OOOOOOOOOOOO$$#o",
+"OOOOOOOOOOO$$$#o",
+"OOOOOOOOOO$$$$#o",
+"$$$$$$$$$$$$$$#o",
+"$$$$$$$$$$$$$$#o",
+"###############o",
+"oooooooooooooooo",
+
+"oooooooooooooooo",
+"o@-@@@@@@@@@@@$@",
+"o@-@@$@@$@@@@@@o",
+"o@-@@@@@@@@@@@oo",
+"o------#$----ooo",
+"o-----#$$---oXoo",
+"o@-@@@$$@@@ooooo",
+"o@-@@+@@@@oXoXoo",
+"o$-@+##@#ooooooo",
+"o@-@@@@@oXoXoXoo",
+"o@-@#@@ooooooooo",
+"o@-@@@oXoXoXoXoo",
+"o$-@#ooooooooooo",
+"o@-@oXoXoXoXoXoo",
+"o@-ooooooooooooo",
+"o@-ooXoXoXoXoXoo",
+
+"oooooooooooooooo",
+"$@@@@@@@@$@$$@@@",
+"OOOOOOOOOOO@@@@@",
+"XXXXXXXXXXO@@@@@",
+".........XO-----",
+".........XO-----",
+".........XO#@@@o",
+".........XO@@#oX",
+"..oooo...XO@#ooo",
+".oo..oo..XO@oXoX",
+".oo......XOooooo",
+".oo......XOXoXoX",
+".oo......XOooooo",
+".oo..oo..XOXoXoX",
+"..oooo...XOooooo",
+".........XOXoXoX",
+
+"oooooooooooooooo",
+"@@@@@@@$$@$@@@@o",
+"@@@oOOOOOOOOOOOo",
+"@@ooXXXXXXXXXXOo",
+"-ooo.........XOo",
+"oXoo.........XOo",
+"oooo.........XOo",
+"oXoo.........XOo",
+"oooo.........XOo",
+"oXoo.........XOo",
+"oooo.........XOo",
+"oXoo.........XOo",
+"oooo.........XOo",
+"oXoo.........XOo",
+"oooo.........XOo",
+"oXoo.........XOo",
+
+"o@-ooooooooooooo",
+"o@-ooXoXoXoXoXoo",
+"o@-ooooooooooooo",
+"o$-ooXoXoXoXoXoo",
+"o@-ooooooooooooo",
+"o@-ooXoXoXoXoXoo",
+"o$-ooooooooooooo",
+"o@-ooXoXoXoXoXoo",
+"o@-ooooooooooooo",
+"o@-ooXoXoXoXoXoo",
+"o@-ooooooooooooo",
+"o@-ooXoXoXoXoXoo",
+"o$-ooooooooooooo",
+"o@-ooXoXoXoXoXoO",
+"o@-oooooooooooOO",
+"o$-ooXoXoXoXoOOO",
+
+".........XOooooo",
+".........XOXoXoX",
+".........XOooooo",
+".........XOXoXoX",
+".........XOooooo",
+".........XOXoXoX",
+".........XOooooo",
+".........XOXoXoX",
+".........XOooooo",
+".........XOXoXoX",
+".........XOooooo",
+".........XOXoXoX",
+"OOOOOOOOOOOooooo",
+"OOOOOOOOOO@ooXoX",
+"XOXOXOOOO@@ooooo",
+"OOOOOOOO@@@ooXoX",
+
+"oooo.........XOo",
+"oXoo.........XOo",
+"oooo.........XOo",
+"oXoo.........XOo",
+"oooo.........XOo",
+"oXoo.........XOo",
+"oooo.........XOo",
+"oXoo.........XOo",
+"oooo.........XOo",
+"oXoo.........XOo",
+"oooo.........XOo",
+"oXoo.........XOo",
+"ooooOOOOOOOOOOOo",
+"oXoOOOOOOOOOOO.o",
+"ooOOXOXOXOOOO@.o",
+"oOOOOOOOOOOO@@.o",
+
+"o@-oooooooooOOXO",
+"o@-ooXoXoXoOOOOO",
+"o@-oooooooOOXOXO",
+"o@-ooXoXoOOOOOOO",
+"o@-oooooOOOOOOOO",
+"o$-ooXoo@@@@@@@@",
+"o@-ooooo@@@@@@@@",
+"o@-ooXoo@@@@@@@@",
+"o$-ooooooooooooo",
+"o$-ooXoOOOOOOOOO",
+"o@-oooOOOOOOOOOO",
+"o@-ooOOOOOOOOOO.",
+"o@-oOOOOOOOOOO..",
+"o---@@@@@@@@@@@@",
+"o@-@$...........",
+"oooooooooooooooo",
+
+"XOXOOOO@@@@ooooo",
+"OOOOOO@@@@@ooXoO",
+"XOOOO@@@@@@oooOO",
+"OOOO@@@@@@@ooOOO",
+"OOOoooooooooOOOO",
+"@@@@$$&$$OO@@@@@",
+"@@@$$&$$OOOO@@@@",
+"@@$$&$$OOOOOO@@@",
+"oo$&$$OOOOOOOooo",
+"O.....OOOOOOOOOO",
+"....$..OOOOOOOOO",
+"..$.....OOOOOOOO",
+".........OOOOOOO",
+"@@@@@@@@@@@@@@@@",
+"................",
+"oooooooooooooooo",
+
+"OOXOXOXOOOO.@@.o",
+"OOOOOOOOOO..@@.o",
+"XOXOXOOOO...@@.o",
+"OOOOOOOO..$.@@.o",
+"OOOOOOO.$$..@@.o",
+"@@@@@@o.$.$.@@.o",
+"@@@@@@o...$.@@.o",
+"@@@@@@o.$$..@@.o",
+"ooooooo.$$..@@.o",
+"OOOOOO......@@.o",
+"OOOOO.......@@.o",
+"OOOO........@@.o",
+"OOO@@@@@@@@@@@@o",
+"@@@@@@@@@@@@@@@o",
+"...............o",
+"oooooooooooooooo",
+
+"                ",
+"                ",
+"oooooooooooooooo",
+"o#-#############",
+"o---------------",
+"o#-#############",
+"o#-#############",
+"o#-#############",
+"o#-#############",
+"o#-####@-@@@@.-@",
+"o#-###@@--@@..--",
+"o#-##@@@----..-@",
+"o#-#@@@@---@..@%",
+"o#-@@@@@--@@@.%%",
+"o#-@@@@@-@@@@@%-",
+"o#-@@@@@-@@@@.%%",
+
+"           %%%%%",
+"          %%....",
+"ooooooooo%%%....",
+"########%%%%....",
+"-------%%-%%....",
+"######%%-%%%....",
+"#####%%%%%%%....",
+"####%%-%%-%%....",
+"###%%-%%-%%%....",
+"@@%%%%%%%%%%....",
+"@%%-%%-%%-%%....",
+"%%-%%-%%-%%%....",
+"%%%%%%%%%%%%....",
+"-%%-%%-%%-%%....",
+"%%-%%-%%-%%%....",
+"%%%%%%%%%%%%....",
+
+"%%%%%%%%%%%%%%%%",
+"..............@%",
+"..............@%",
+"..............@%",
+"..............@%",
+"....oooo......@%",
+"...oo..oo.....@%",
+"...oo.........@%",
+"...oo.........@%",
+"...oo.........@%",
+"...oo..oo.....@%",
+"....oooo......@%",
+"..............@%",
+"..............@%",
+"..............@%",
+"..............@%",
+
+"o#-@@@@@--@@..%%",
+"o#-@@@@@----..%-",
+"o#-@@@@@---@..%%",
+"o#-@@@@@--@@@.%%",
+"o#-@@@@@-@@@@@%-",
+"o#-@@@@@-@@@@.%%",
+"o#-@@@@@--@@..%%",
+"o#-@@@@@----..%-",
+"o#-@@@@@---@..%%",
+"o#-@@@@@--@@@.%%",
+"o#-@@@@@-@@@@@%-",
+"o#-@@@@@-@@@@.%%",
+"o#-@@@@@--@@..%%",
+"o#-@@@@@----..%-",
+"o#-@@@@@---@..%%",
+"o#-@@@@@--@@@.%%",
+
+"-%%-%%-%%-%%....",
+"%%-%%-%%-%%%....",
+"%%%%%%%%%%%%....",
+"-%%-%%-%%-%%@@@@",
+"%%-%%-%%-%%@@.@@",
+"%%%%%%%%%%@@.@@.",
+"-%%-%%-%%@@@@@@@",
+"%%-%%-%%@@.@@.@@",
+"%%%%%%%@@.@@.@@.",
+"-%%-%%@@@@@@@@@@",
+"%%-%%@@.@@.@@.@@",
+"%%%%@@.@@.@@.@@.",
+"-%%@@@@@@@@@@@@@",
+"%%@@.@@.@@.@@.@@",
+"%@@.@@.@@.@@.@@.",
+"@@@@@@@@@@@@@@@@",
+
+"..............@%",
+"..............@%",
+"..............@%",
+"@@@@@@@@@@@@@@@%",
+".@@.@@.@@.@@.@o%",
+"@@.@@.@@.@@.@$o%",
+"@@@@@@@@@@@@.$o%",
+".@@.@@.@@.@..$o%",
+"@@.@@.@@.@...$o%",
+"@@@@@@@@@.@..$o%",
+".@@.@@.@.@@@.$o%",
+"@@.@@.@.@@@..$o%",
+"@@@@@@--@@...$o%",
+".@@.@.----...$o%",
+"@@.@..---@...$o%",
+"@@@...--@@@..$o%",
+
+"o#-@@@@@-@@@@@--",
+"o#-@@@@@-@@@@.-@",
+"o#-@@@@@--@@..--",
+"o#-@@@@@----..--",
+"o#-@@@@@---@..--",
+"o#-@@@@@--@@@.--",
+"o#-@@@@@-@@@@@-@",
+"o#-@@@@@........",
+"o#-@@@@.X.X.X.X.",
+"o#-@@@..........",
+"o#-@@..X.X.X.X.X",
+"o#-@............",
+"o#-#$$$$$$$$$$$$",
+"o----@@@@@@@@@@@",
+"o#-###$$$$$$$$$$",
+"oooooooooooooooo",
+
+"----------------",
+"@@@.%@@@@.%@@@@.",
+"@@..%%@@..%%@@..",
+"--..%%%%..%%%%..",
+"-@..%%%@..%%%@..",
+"@@@.%%@@@.%%@@@.",
+"@@@@%@@@@@%@@@@@",
+"................",
+"X.X.X.X..X.X.X.X",
+"................",
+".X.X.XX.X.X.X.X.",
+"....XX..........",
+"$$$$$$$$$$$$$$$$",
+"@@@@@@@@@@@@@@@@",
+"$$$$$$$$$$$$$$$$",
+"oooooooooooooooo",
+
+"--....-@@@@@.$o%",
+"%@@@@.-@@@@..$o%",
+"%%@@..--@@...$o%",
+"%%%%..----...$o%",
+"%%%@..---@...$o%",
+"%%@@@.--@@@..$o%",
+"%@@@@@-@@@@@.$o%",
+".............$o%",
+".X.X.X.X.X..@$o%",
+"...........$@$o%",
+"X.X.X.X.X.$$@$o%",
+".........$$$@$o%",
+"$$$$$$$$$$$$@$o%",
+"@@@@@@@@@@@@@@o%",
+"$$$$$$$$$$$$@$o%",
+"ooooooooooooooo%",
+
+"        @@@@@   ",
+"        @@@@@   ",
+"        @@@@@   ",
+"oooooooo@@@@@ooo",
+"o-------@@@@@---",
+"o--==@##@@@@$$@@",
+"o--==@##@@@@$$@@",
+"o--==@##@@@@$$@@",
+"o--@@@@@@@@@@@@.",
+"o@@@@@@@@@@@@@..",
+"o@@@@@@**@@@@...",
+"o@@@@@@**@@@...@",
+"o@@@@@@**@@...@.",
+"o@@@@@@@@@...@..",
+"o--@@@@@@...@..@",
+"o--OO@@@...@..@.",
+
+"       @@@@@@@@@",
+"      .@........",
+"     ..@--------",
+"oooo...@--------",
+"---...@@--------",
+"@@...@.@--------",
+"@...@..@--------",
+"...@..@@--------",
+".@..@..@--------",
+"@..@..@@--------",
+"..@..@.@--------",
+".@..@..@--------",
+"@..@..@@--------",
+"..@..@.@--------",
+".@..@..@--------",
+"@..@..@@--------",
+
+"@@@@@@@@@@@@@@@@",
+"...............@",
+"--------------.@",
+"--------------.@",
+"--------------.@",
+"--------------.@",
+"--------------.@",
+"--------------.@",
+"--oooo--------.@",
+"-oo--oo-------.@",
+"-oo-----------.@",
+"-oo-----------.@",
+"-oo-----------.@",
+"-oo--oo-------.@",
+"--oooo--------.@",
+"--------------.@",
+
+"o--OO@@..@..@..@",
+"o--@@@..@..@..@.",
+"o----.....@..@..",
+"o----..@.@..@..@",
+"o----.@.@..@..@.",
+"o----@....@..@..",
+"o----..@.@..@..@",
+"o----.@.@..@..@.",
+"o----..@.@..@..@",
+"o----.@.@..@..@.",
+"o----@....@..@..",
+"o----..@.@..@..@",
+"o----.@.@..@..@.",
+"o----@....@..@..",
+"o----..@.@..@..@",
+"o----.@.@..@..@.",
+
+".@..@..@--------",
+"@..@..@@--------",
+"..@..@.@--------",
+".@..@..@--------",
+"@..@..@@--------",
+"..@..@.@--------",
+".@..@..@--------",
+"@..@..@@--------",
+".@..@..@--------",
+"@..@..@@@@@@@@@@",
+"..@..@....X..@X.",
+".@..@....@......",
+"@..@..@.X..@X.@.",
+"..@.............",
+".@..@.X..@X.@.X.",
+"@...............",
+
+"--------------.@",
+"--------------.@",
+"--------------.@",
+"--------------.@",
+"--------------.@",
+"--------------.@",
+"--------------.@",
+"--------------.@",
+"--------------.@",
+"@@@@@@@@@@@@@@@@",
+"..X..@X...X..@. ",
+".@.......@....  ",
+"X..@X.@.X..@.   ",
+"............o   ",
+".@X.@.X..@.-o   ",
+"..........--o   ",
+
+"o----..@.@..@..@",
+"o----.@.@..@..@.",
+"o----@....@..@..",
+"o----..@.@..@...",
+"o----.@.@..@..@.",
+"o----@....@.....",
+"o----..@.@..@.X.",
+"o----.@.@.......",
+"o----..@....X..@",
+"o----.@....@....",
+"o-X--@....X.X@X.",
+"o----...........",
+"o-------X---X---",
+"o--X------------",
+"o---------------",
+"oooooooooooooooo",
+
+".......@X...X..@",
+"...@.......@....",
+"..X..@X...X..@X.",
+".@.......@......",
+"X..@X.@.X..@X.@.",
+"................",
+".@X.@.X..@X.@.X.",
+"................",
+"X......@X...X..@",
+"...XX......@....",
+"..XX.@X...X..@..",
+".XX.............",
+"----------------",
+"----------------",
+"----------------",
+"oooooooooooooooo",
+
+"X...X..@..--o   ",
+"...@....X.--o   ",
+"..X..@.XX.--o   ",
+".@....XXX.--o   ",
+"X..@.XXXX.--o   ",
+"....XXXXX.--o   ",
+".@.XXXXXX.--o   ",
+"..XXXXXXX.--o   ",
+"..........--o   ",
+".........---o   ",
+"........----o   ",
+".......----Xo   ",
+"------------o   ",
+"--------X-X-o   ",
+"------------o   ",
+"ooooooooooooo   ",
+
+"oooooooooooooooo",
+"o               ",
+"o X             ",
+"o               ",
+"o               ",
+"o               ",
+"o              X",
+"o               ",
+"o  #############",
+"o ##@@@@@@@@@@@#",
+"o ##@@@@@@@@@@@#",
+"o ##@@@@@@@@@@@#",
+"o ##@@@@@@@@@@@#",
+"o ##@@@@@@@@@@@#",
+"o ##@@@@@@@@@@@#",
+"o ##############",
+
+"oooooooooooooooo",
+"                ",
+"     ooooooooooo",
+"    oo@@@@@@@@@@",
+"   ooo@@@@@@@@@@",
+"   ooo@@@@@@@@@@",
+"   ooo@@@@@@@@@@",
+"   ooo@@@@@@@@@@",
+"   ooooooooooooo",
+"   ooOOOOOOOOOOO",
+"   oOOOOXOOOXOOO",
+"................",
+"...&&&..........",
+"...&&&..........",
+"................",
+"................",
+
+"oooooooooooooooo",
+"               o",
+"oooooooooooo   o",
+"@@@@@@@@@@@o X o",
+"@@@@@@@@@@@o   o",
+"@@@@@@@@@@@o   o",
+"@@@@@@@@@@@o   o",
+"@@@@@@@@@@@o.. o",
+"oooooooooooo.. o",
+"OOOOOOOOOOO... o",
+"OOOOOOXOOO.... o",
+".............. o",
+"..........###. o",
+"..........###. o",
+".............. o",
+".............. o",
+
+"o #$$$$$$$$$$$$.",
+"o ..............",
+"o ..............",
+"o...............",
+"o...............",
+"o...............",
+"o...............",
+"o.............OO",
+"o.............OO",
+"o.............OO",
+"o...............",
+"o...............",
+"o...............",
+"o...............",
+"o...............",
+"o...............",
+
+"..........oooo..",
+".........oo..oo.",
+".........oo.....",
+".........oo.....",
+".........oo.....",
+".........oo..oo.",
+"..........oooo..",
+".&&.............",
+".&&.............",
+".&&.............",
+"................",
+"................",
+"                ",
+"................",
+"................",
+"................",
+
+".............. o",
+"........$$$... o",
+"........$$$... o",
+".............. o",
+"..........OOO. o",
+"..........OOO. o",
+".............. o",
+".............. o",
+".....$$....... o",
+".....$$....... o",
+".....$$....... o",
+".............. o",
+"               o",
+".............  o",
+".............. o",
+"...............o",
+
+"o...............",
+"o...............",
+"o...............",
+"o               ",
+"o               ",
+"o               ",
+"o X             ",
+"o               ",
+"o               ",
+"o               ",
+"o               ",
+"o   X           ",
+"o               ",
+"o               ",
+"o               ",
+"oooooooooooooooo",
+
+"................",
+"................",
+"................",
+"                ",
+"         -------",
+"        --@@@@@@",
+"        --@@@@@@",
+"        --@@@@@@",
+"        --@@@@@@",
+"        --------",
+"        -@@@@@@@",
+"         +++++++",
+"          ++++++",
+"                ",
+"                ",
+"oooooooooooooooo",
+
+"...............o",
+"...............o",
+"...............o",
+"             ..o",
+"------        .o",
+"@@@@@-         o",
+"@@@@@-         o",
+"@@@@@-+        o",
+"@@@@@-+        o",
+"------+        o",
+"@@@@ ++        o",
+"+++++++        o",
+"+++++++        o",
+"               o",
+"           X   o",
+"oooooooooooooooo",
+
+"            #---",
+"ooooooooooo##-@@",
+"o         ###-@@",
+"o        ####-@@",
+"o  #    #####-@@",
+"o      ###X##-@@",
+"o  #   ##XX##-@@",
+"o  #   ##X###-@@",
+"o      ###X##-@@",
+"o      ##XX##-@@",
+"o      ##X###-@@",
+"o      ###X##-@@",
+"o     ###XX##-@@",
+"o      ##X###-@@",
+"o      ###X##-@@",
+"o      ##XX##-@@",
+
+"----------------",
+"@@@@@@@@@@@@@@@.",
+"@@@@@@@@@@@@@--.",
+"@@@@@@@@@@@----.",
+"@@@@@@@@@------.",
+"@@@@@@@--------.",
+"@@@@@@---------.",
+"@@@@@----------.",
+"@@@@@---oooo---.",
+"@@@@@--oo--oo--.",
+"@@@@@--oo------.",
+"@@@@@--oo------.",
+"@@@@@--oo------.",
+"@@@@@--oo--oo--.",
+"@@@@@---oooo---.",
+"@@@@@----------.",
+
+"-------------   ",
+"@@@@@@@@@@@@-ooo",
+".@@@@@@@@@@@-  o",
+"..@@@@@@@@@@-  o",
+"...@@@@@@@@@-  o",
+"....@@@@@@@@-  o",
+"....@@@@@@@@-  o",
+"....@@@@@@@@-  o",
+"....@@@@@@@@-  o",
+"....@@@@@@@@-  o",
+"....@@@@@@@@-  o",
+"....@@@@@@@@-  o",
+"....@@@@@@@@-  o",
+"....@@@@@@@@-  o",
+"....@@@@@@@@-  o",
+"....@@@@@@@@-  o",
+
+"o      ##X###-@@",
+"o      ###X##-@@",
+"o      ##XX##-@@",
+"o      ##X###-@@",
+"o  #   ###X##-@@",
+"o      ##XX##---",
+"o   #  ##X###$$$",
+"o      #####$$$$",
+"o      ####$$$$$",
+"o      ###$$$$$$",
+"o      ##$$$$$$$",
+"o  #   #$$$$$$$$",
+"o       +++$$+++",
+"o        +++++++",
+"o         +++$++",
+"o          +++++",
+
+"@@@@@----------.",
+"@@@@@----------.",
+"@@@@@--------@@@",
+"@@@@@------@@%%%",
+"@@@@@----@@%%%%%",
+"------X@@%%%%%%%",
+"$$$$$@@..*@..*@.",
+"$$$$$%..*@..*@..",
+"$$$$%..*@..*@..*",
+"$$$%..*@..*@..*@",
+"$$.@.*@..*@..*@.",
+"$..@*@@@*@@@*@@@",
+"...@@@@@@@@@@@@@",
+"...@@@@@@@@@@@@@",
+"................",
+"..@@@@@@@@@@@@@+",
+
+"....@@@@@@@@-  o",
+"....@@@@@@@@-  o",
+"....@@@@@@@@-  o",
+"@...@@@@@@@@-  o",
+"%@..@@@@@@@@-  o",
+"%%@.---------  o",
+".*@.$$$$$$$$$  o",
+"*@.$$$$$$$$$   o",
+"@.$$$$$$$$$+   o",
+".$$$$$$$$$++   o",
+"$$$$$$$$$+++   o",
+"$$$$$$$$++++   o",
+"+++++++++++$   o",
+"++++++++++++   o",
+"++++++$+++++ # o",
+"+++$$+++++++   o",
+
+"o       #   ++++",
+"o            #  ",
+"o            #  ",
+"o              -",
+"o             --",
+"o    #       ---",
+"o  # #$      ---",
+"o     $$ #   ---",
+"o  # #       ---",
+"o  #$ $      -X-",
+"o            -X-",
+"o            -X-",
+"o       #    ---",
+"o            ---",
+"o            ---",
+"oooooooooooooooo",
+
+"...............+",
+".@@@@@@@@@@@@@  ",
+"..............- ",
+"-------XXX------",
+"------XOOOX-----",
+"-----Xoo%OOX----",
+"-----Xo%o%OX----",
+"-----Xoo%oOX----",
+"-----XXoooX-----",
+"------XXXX------",
+"----------------",
+"----------------",
+"----------------",
+"----------------",
+"----------------",
+"oooooooooooooooo",
+
+"++++++++++++   o",
+"               o",
+"               o",
+"          #    o",
+"-  #           o",
+"--     ##      o",
+"--    # $$     o",
+"--      #$     o",
+"--    ##$      o",
+"X-     #$      o",
+"X-    #$#      o",
+"X-      #      o",
+"--             o",
+"--             o",
+"--             o",
+"oooooooooooooooo",
+
+"oooooooooooooooo",
+"o###############",
+"o###########----",
+"o##########--@@@",
+"o####$####-X-...",
+"o$#######--.-...",
+"o###$###-X-X-...",
+"o######--.-X-...",
+"o#####-X-X---...",
+"o####--.-X-X-...",
+"o###-X-X---X-...",
+"o##-XX-X-X-.-...",
+"o##-XX---X-X-...",
+"o##-XX-X-.-X-...",
+"o##-X--X-X---...",
+"o##--X-.-X-X-...",
+
+"oooooooooooooooo",
+"################",
+"------------####",
+"@@@@@@@@@@@-####",
+"..........@-@@@@",
+"..........@-XXXX",
+"..........@-....",
+"..........@-....",
+"..........@-....",
+"..........@-....",
+"..........@-....",
+".......-----@@@@",
+"......@-@@@.@@..",
+"......@-@@.@@@@@",
+"......@-@.@@...@",
+"......@-.@@@@@@@",
+
+"oooooooooooooooo",
+"###############o",
+"###############o",
+"#####$#######$#o",
+"@@@@@@@@@@@@@##o",
+"XXXXXXXXXXXX@##o",
+"...........X@##o",
+"...........X@##o",
+"...........X@##o",
+"...........X@##o",
+"...........X@##o",
+"@@@@@@@@@@@@@##o",
+".@@...@@...@###o",
+"@@@@@@@@@@@####o",
+"@...@@...@$$###o",
+"@@@@@@@@@$$$$##o",
+
+"o##-XX-X---X-...",
+"o##-X.-X-X-.-...",
+"o##-.X---X-X-..o",
+"o##-XX-X-.-X-..o",
+"o##-X--X-X-X-..o",
+"o##--X-.-X---..o",
+"o##-XX-X-X-X-..o",
+"o##-XX-X---X-...",
+"o##-X.-X-X-.-...",
+"o##-.X---X-X-...",
+"o##-XX-X-.-X-...",
+"o##-X--X-X---...",
+"o##--X-.-X-X-...",
+"o##-XX-X---X-...",
+"o##-X.-X-X-X-...",
+"o##-.X---X-.-...",
+
+"......@-$$$$$$$$",
+"oooo..@-$@OO@@@@",
+"o..oo.@-$@OO@@@@",
+"o.....@-$@OO@@@@",
+"o.....@-$@@@@@@@",
+"o.....@-$@@@@-%-",
+"o..oo.@-$@@@----",
+"oooo..@-$XX.----",
+"......@-$XX.----",
+"......@-$@@---%-",
+"......@-$@@-----",
+"......@-$@@-&&--",
+"......@-$@@-&&--",
+"......@-$@@-&&--",
+"......@-$$$#####",
+"......@-$$$#####",
+
+"$$$$$$$$$$$$$##o",
+"@@@@@@@&&@@$$##o",
+"@@@@@@@&&@@$$##o",
+"@@@@@@@&&@@$$##o",
+"@@@@@@@@@@@$$##o",
+"%-%-%-%----####o",
+"-----------####o",
+"-----------####o",
+"----------------",
+"%-%-%-%---------",
+"---------%--%--%",
+"-++-------------",
+"-  -------------",
+"-++--------####o",
+"###############o",
+"############$$#o",
+
+"o##-XX-X-X-X-...",
+"o#$-X--X-.-X-...",
+"o##--X-X-X-X-...",
+"o##-XX-.-X-X-...",
+"o##-XX-X-X--@@@@",
+"o##-X.-X---@@XXX",
+"o##-.X-X--@@@@@@",
+"o##-XX---@@XXXX@",
+"o##-XX--@@@@@@@@",
+"o##-X--@@XXXX@XX",
+"o##---@@@@@@@@@@",
+"o##--@@XXXX@XX.@",
+"o##-@@@@@@@@@@@@",
+"o###$$$$$$$$$$$$",
+"o####$$$$$$$$$$$",
+"ooooooOOOOOOOOOO",
+
+"......@-@@@@@@@@",
+"......@-XXXXXXXX",
+"......@-........",
+"......@-........",
+"@@@@@@@@........",
+"X@XX.@@.........",
+"@@@@@@..........",
+"XX.@@...........",
+"@@@@@@@@@@@@@@@@",
+".@@XXX.@XXXX@XXX",
+"@@@@@@@@@@@@@@@@",
+"@XXX.@XXXX@@XXXX",
+"@@@@@@@@@@@XXXX@",
+"$$$$$$$$$$$@@@@$",
+"$$$$$$$$$$$@@@@$",
+"OOOOOOOOOOO@@@@O",
+
+"@@@@@@@@####$$#o",
+"XXXXXXX@#$#+###o",
+"......X@##+####o",
+"......X@#######o",
+"......X@#####$#o",
+"......X@###$$$#o",
+"......X@###$$##o",
+"......X@###$$##o",
+"@@@@@@@@##+####o",
+"X@XXX@@##+#####o",
+"@@@@@@######$##o",
+"@@@@@$#########o",
+"@@@@$$$########o",
+"$$$$$$$$#######o",
+"$$$$$$$$#######o",
+"OOOOOOOOoooooooo",
+
+"Xooooooooooooooo",
+"XoXXXXXXXXXXXXXX",
+"Xo##############",
+"Xo##############",
+"Xo##############",
+"Xo###-XXXXXXXXXX",
+"Xo##--..........",
+"Xo#---..........",
+"Xo#---..........",
+"Xo#---........@@",
+"Xo#---@@@@@@@@@-",
+"Xo#--@@@@@@@@-@-",
+"Xo#-@@@@@@@-@-@-",
+"Xo##$$$$@-@-@-@-",
+"Xo###$$$@-@-@-@-",
+"Xo####$$@-@-@-@-",
+
+"oooooooooooooooo",
+"XXXXXXXXXXXXXXXX",
+"############@@@@",
+"##########@@@...",
+"########@@@-@...",
+"XXXXXX@@@-@-@...",
+"....@@@-@-@-@...",
+"..@@@-@-@-@-@...",
+"@@@-@-@-@-@-@...",
+"@-@-@-@-@-@-@...",
+"@-@-@-@-@-@-@...",
+"@-@-@-@-@-@-@...",
+"@-@-@-@-@-@-@...",
+"@-@-@-@-@-@-@...",
+"@-@-@-@-@-@-@...",
+"@-@-@-@-@-@-@...",
+
+"oooooooooooooooo",
+"XXXXXXXXXXXXXXXo",
+"@@@@@@@@@@@@##Xo",
+"...........@##Xo",
+"X.X.X.X.X.X@##Xo",
+"...........@##Xo",
+"..........X@##Xo",
+"...........@##Xo",
+"..........X@##Xo",
+"..oooo.....@##Xo",
+".oo..oo...X@##Xo",
+".oo........@##Xo",
+".oo.......X@##Xo",
+".oo........@##Xo",
+".oo..oo...X@$#Xo",
+"..oooo.....@$#Xo",
+
+"Xo######@-@-@-@-",
+"Xo######@-@-@-@-",
+"Xo######@-@-@-@-",
+"Xo######@-@-@-@-",
+"@@@@@@##@-@-@-@-",
+"@@@@@@@#@-@-@-@-",
+"@@@@@@@#@-@-@-@-",
+"@@@@@@@#@-@-@-@-",
+"Xo##@@@#@-@-@-@-",
+"Xo##@@@#@-@-@-@-",
+"@@@@@@@#@-@-@-@-",
+"@@@@@@@#@-@-@-@-",
+"@@@@@@@#@-@-@-@-",
+"@@@@@@##-.......",
+"Xo#####--.......",
+"Xo####---.X.X.X.",
+
+"@-@-@-@-@-@-@...",
+"@-@-@-@-@-@-@...",
+"@-@-@-@-@-@-@...",
+"@-@-@-@-@-@-@...",
+"@-@-@-@-@-@-@...",
+"@-@-@-@-@-@-@...",
+"@-@-@-@-@-@-@...",
+"@-@-@-@-@-@-@@@@",
+"@-@-@-@-@-@-....",
+"@-@-@-@-@-@-@@@@",
+"@-@-@-@-@-@.....",
+"@-@-@-@-@-@@@@@@",
+"@-@-@-@-@-@.....",
+"....@-@-@-@@@@@@",
+"....@-@-@.......",
+"X.X.@-@-@@@@@@@@",
+
+"..........X@$#Xo",
+"...........@$#Xo",
+"X.X.X.X...X@$#Xo",
+"...........@$#Xo",
+"..........X@$#Xo",
+"...........@$#Xo",
+"...........@$#Xo",
+"@@@@@@@@@@@@$#Xo",
+"............$#Xo",
+"@@@@@@@@@@.$$#Xo",
+"...........$$#Xo",
+"@@@@@@@@@@.$$#Xo",
+"..........$$$#Xo",
+"@@@@@@@@@.$$$#Xo",
+"..........$$$#Xo",
+"@@@@@@@@.$$$##Xo",
+
+"Xo###----.......",
+"Xo##-----.......",
+"Xo##-----.......",
+"Xo##-----.......",
+"Xo##-----.......",
+"Xo##-----.X.X.X.",
+"Xo##-----.......",
+"Xo##-----.......",
+"Xo##-----@@@@@@@",
+"Xo##----@@@@@@@@",
+"Xo##---@@@X@@@@@",
+"Xo##--@@@@@@@@@@",
+"Xo##-@@@@@@@@@@@",
+"Xo###$$$$$$$$$$$",
+"XoooooOOOOOOOOOO",
+"XXXXXXXXXXXXXXXX",
+
+"....@-@-........",
+"..X.@-@-@@@@@@@@",
+"....@-@.........",
+"..X.@-@@@@@@@@@@",
+"....@-..........",
+"X.X.@-@@@@@@@@@@",
+"....@...........",
+"....@@@@@@@@@@@@",
+"@@@@............",
+"@@@@@@@@@@@@@@@@",
+"@@X@@@@@@@X@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"$$$$$$$$$$$$$$$$",
+"OOOOOOOOOOOOOOOO",
+"XXXXXXXXXXXXXXXX",
+
+".........$$$##Xo",
+"@@@@@@@.$$$$##Xo",
+"........$$$###Xo",
+"@@@@@@@.$$$###Xo",
+".......$$$$###Xo",
+"@@@@@@.$$$####Xo",
+".......$$$####Xo",
+"@@@@@.$$$$####Xo",
+"......$$$#####Xo",
+"@@@@@$$$$#####Xo",
+"@@@@$$$$$#####Xo",
+"@@@$$$$$######Xo",
+"@@$$$$$$######Xo",
+"$$$$$$$$######Xo",
+"OOOOOOOOoooooooo",
+"XXXXXXXXXXXXXXXX",
+
+"                ",
+"                ",
+"      %---------",
+"ooooo%%.@.@.@.@.",
+"o$$$%%%@@@@@@@@@",
+"o$$%%%%.@.@.@.@.",
+"o$%%%%%@@@@@@@@@",
+"o$%%%%%.@.@.@.@.",
+"o$%%%%%@@@@@@@@@",
+"o$%%%%%.@.@.@.@.",
+"o$%%%%%@@@@@@@@@",
+"o$%%%%%.@.@.@.@.",
+"o$%%%%%@@@@@@@@@",
+"o$%%%%%.@.@.@.@%",
+"o$%%%%%@@@@@@@%%",
+"o$%%%%%.@.@.@%%%",
+
+"              %%",
+"            %%XX",
+"----------%%....",
+"@.@.@.@.@-......",
+"@@@@@@@@-.......",
+"@.@.@..-........",
+"@@@@@@-.........",
+"@.@.@--.........",
+"@@@@%-..........",
+"@.@%%-.........o",
+"@@%%-.........oo",
+"@%%%-.........oo",
+"%%%%-.........oo",
+"%%%%-.........oo",
+"%%%%-.........oo",
+"%%%%-..........o",
+
+"%%%%%%          ",
+"XXXXXX%%        ",
+"......XX%%      ",
+"........XX%     ",
+"..........X%    ",
+"...........X%   ",
+"............X%  ",
+"............X%  ",
+".............X% ",
+"ooo..........X% ",
+"..oo..........X%",
+"..............X%",
+"..............X%",
+"..............X%",
+"..oo..........X%",
+"ooo...........X%",
+
+"o$%%%%%@@@@@%%%%",
+"o$%%%%%.@.@%%%%%",
+"o$%%%%%@@@%%%%%%",
+"o$%%%%%.@%%%%%%%",
+"o$%%%%%.%%%%%%%%",
+"o$%%%%%%%%%%%%%%",
+"o$%%%%%%%%%%%%%%",
+"o$%%%%%%%%%%%%-%",
+"o$%%%%%%%%%%%%%%",
+"o$%%%%%%%%%%-%%-",
+"o$%%%%%%%%%%%%-%",
+"o$%%%%%%%%-%%-%-",
+"o$%%%%%%%%%%-%-%",
+"o$%%%%%%-%%-%-%-",
+"o$%%%%%%%%-%-%--",
+"o$%%%%-%%-%-%---",
+
+"%%%%-...........",
+"%%%%-...........",
+"%%%%%%..........",
+"%%-%%%..........",
+"%%%%-%%.........",
+"-%%-%-%.........",
+"%%-%-%-%........",
+"%-%-%---%.......",
+"-%-%---@-%%.....",
+"%-%---@-@@@%%...",
+"-%---@-@@@@-@%%%",
+"%---@-@@@@@@@@.@",
+"---@-@@@@-@@@.@.",
+"--@-@@@@@@@@.@..",
+"-@-@@@@-@@@.@...",
+"@-@@@@@@@@.@....",
+
+"..............X%",
+"..............X%",
+"..............% ",
+"..............% ",
+".............%  ",
+".............%  ",
+"............%o  ",
+"...........%$o  ",
+".........%%X$o  ",
+".......%%X@X$o  ",
+"%%%%%%%XX@@X$o  ",
+".....X.X@.@X$o  ",
+"....X.X@@@@X$o  ",
+"...X.X@.@.@X$o  ",
+"..X.X@@@@@@X$o  ",
+".X.X@.@.@.@X$o  ",
+
+"o$%%%%%%-%-%---@",
+"o$%%-%%-%-%---@-",
+"o$%%%%-%-%---@-@",
+"o$-%%-%-%---@-@@",
+"o$$%-%-%---@-@@@",
+"o$$-%-%---@-@@@@",
+"o$$%-%---@-@@@@-",
+"o$$$%---@-@@@@@@",
+"o$X$$--@-@@@@-@@",
+"o$$$$$@-@@@@@@@@",
+"o$XX$$$@@@@-@@@.",
+"oX%XX$$$@@@@@@.@",
+"oXX%X$$$$-@@@.@.",
+"o$XX$$X$$$$$.@..",
+"o$$$$$$$$$$$$$$$",
+"oooooooooooooooo",
+
+"-@@@@-@@@.@.....",
+"@@@@@@@@.@.....X",
+"@@@-@@@.@.....X.",
+"@@@@@@.@.....X.X",
+"@-@@@.@.....X.X@",
+"@@@@.@.....X.XX.",
+"@@@.@.....X.XXX@",
+"@@.@.....X.XXXXX",
+"@.@.....X.XXXX..",
+".@.....X.XXXX...",
+"@.....X.X$XX..o.",
+".....X.X$$X.....",
+"....XX$$$$$$$$$$",
+"...X$$$$$$X$$$$$",
+"$$$$$$$$$$$$$$$$",
+"oooooooooooooooo",
+
+"X.X@@@@@@@@X$o  ",
+".X@.@.@.@.@X$o  ",
+"X@@@@@@@@@@X$o  ",
+"@.@.@.@.@.@X$o  ",
+"@@@@@@@@@@@X$o  ",
+"@.@.@.@.@.@X$o  ",
+"@@@@@@@@@@@X$o  ",
+"XXXXXXXXXXXX$o  ",
+"...........$$o  ",
+"..........$$$o  ",
+".o..o....$$$$o  ",
+"........$$$X$o  ",
+"$$$$$$$$$$X$$o  ",
+"X$$$$$$$$$$$$o  ",
+"$$$$$$$$$$$$$o  ",
+"oooooooooooooo  ",
+
+"X***************",
+"X*XXXXXXXXXXXXXX",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+
+"****************",
+"XXXXXXXXXXXXXXXX",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"****************",
+"XXXXXXXXXXXXXXX*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+
+"                ",
+"     X****      ",
+"     XX**X      ",
+"      X**       ",
+"      X**       ",
+"      X**       ",
+"      X**       ",
+"      X**       ",
+"      X**       ",
+"      X**       ",
+"      X**       ",
+"     X****      ",
+"     XXXXX      ",
+"                ",
+"                ",
+"                ",
+
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X*              ",
+"X***************",
+"XXXXXXXXXXXXXXXX",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"****************",
+"XXXXXXXXXXXXXXXX",
+
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"              X*",
+"****************",
+"XXXXXXXXXXXXXXXX",
+
+"****************",
+"*      %#     %#",
+"*     %-@    %-@",
+"*  &&%-@. &&%-@.",
+"* -&%-@. -&%-@. ",
+"* -&-@.+ -&-@.+ ",
+"* -&X.X+ -&X.X+ ",
+"* -&&&&+ -&&&&+ ",
+"* -....%#-....%#",
+"*  +++%-@ +++%-@",
+"*  &&%-@. &&%-@.",
+"* -&%-@. -&%-@. ",
+"* -&-@.+ -&-@.+ ",
+"* -&X.X+ -&X.X+ ",
+"* -&&&&+ -&&&&+ ",
+"* -....+ -....+ ",
+
+"********@@@*****",
+"        @@@     ",
+"        @@@     ",
+"       @@@      ",
+"      @@@@      ",
+"     @@@@       ",
+"     @@@    -@@@",
+"     @@    --@-@",
+"     @@   ---@@@",
+"     @@   -X-@@@",
+"     @@@@@XX-@@@",
+"    @@@@@@X.-@-@",
+"    @@@@@@X.-@@@",
+"    @@@   .-@...",
+"    @@@   -@....",
+"    @@@   @...-@",
+
+"****************",
+"               *",
+"               *",
+"               *",
+"               *",
+"               *",
+"@@@@@          *",
+"@@@-@          *",
+"@@@@@          *",
+"@@@@@+         *",
+"@@@@@+         *",
+"@@@-@+         *",
+"@@@@@+         *",
+".....+         *",
+"....@@@@       *",
+"@@@@@@@@       *",
+
+"*  +++++  ++%%% ",
+"*          %X..%",
+"*         %XXX..",
+"*        %%XXXX.",
+"*       %%-XXXX.",
+"*      %%---XX.%",
+"*     %%---@@@@ ",
+"*    %%---@@..  ",
+"*    %---@@..   ",
+"*    ---@@..@@@@",
+"*     -@@..+++++",
+"*      @..++++  ",
+"*       +++++++ ",
+"*        +++++++",
+"*         ++++++",
+"*          +++++",
+
+".   @@@      --@",
+"    @@@      --@",
+"%   @@@      --@",
+"%   @@@@     -@.",
+"%   @@@@@    @..",
+"  @@@@@@@     ++",
+" @@@@  @@@      ",
+"  @@    @@@     ",
+"         @@@    ",
+"@@@@@+   @@@   %",
+"++++@+   @@@  %%",
+"    @+    @  %%-",
+"    @+      %%--",
+"    @+     %%---",
+"    @+    %%---@",
+"    @+    %---@@",
+
+"@@@@@@@@       *",
+"-@@@@@@@+      *",
+"@@@@@@@@+      *",
+"........+      *",
+".......++      *",
+"+++++++++      *",
+"               *",
+" %%%           *",
+"%X..%          *",
+"XXX..%         *",
+"XXXX.%         *",
+"XXXX.%         *",
+"-XX.%          *",
+"@@@@           *",
+"@..  %%%       *",
+"..  %X..%      *",
+
+"*           +++ ",
+"*               ",
+"*               ",
+"*               ",
+"*               ",
+"*              -",
+"*              -",
+"*              -",
+"*              -",
+"*              -",
+"*              @",
+"*               ",
+"*               ",
+"*               ",
+"*               ",
+"****************",
+
+"    +@    -@-@@.",
+"     +@   @-@@..",
+"      +@ @+ @..+",
+"       +@+   +++",
+"-@@@@   @+    +%",
+"-@@.@   @+    %%",
+"-@@@@@@@@@@@@@@@",
+"-@.@@+++++++++--",
+"-@@@@          -",
+"@....+          ",
+"....++          ",
+"++++++          ",
+" +++++          ",
+"                ",
+"                ",
+"****************",
+
+".  %XXX..%     *",
+"++%%XXXX.%     *",
+"+%%-XXXX.%     *",
+"%%---XX.%      *",
+"%---@@@@       *",
+"---@@..        *",
+"--@@..         *",
+"-@@..          *",
+"@@..++         *",
+"@..++++        *",
+" +++++++       *",
+"  +++++++      *",
+"   ++++++      *",
+"    +++++      *",
+"     +++       *",
+"****************",
+
+"****************",
+"*               ",
+"*    +          ",
+"*               ",
+"*    @XXXXXXXXXX",
+"*   @@++++++++++",
+"*  @@@++++++++++",
+"* @@-@++++++++++",
+"* @@@@++++++++++",
+"* -@@@++++++++++",
+"* @@@@++++++++++",
+"* @@@@++++++++++",
+"* @@@@++++++++++",
+"* @@@@++++++++++",
+"* @@@@++++++++++",
+"* @@@@++++++++++",
+
+"****************",
+"                ",
+"                ",
+"                ",
+"XXXXXXXX        ",
+"+++++++X        ",
+"+++++++X  +    @",
+"+++++++X  +    @",
+"+++++++X  +    @",
+"+++++++X       @",
+"+++++++X        ",
+"+++++++X        ",
+"+++++++X      ..",
+"+++++++X   .....",
+"+++++++X  -.....",
+"+++++++X --.....",
+
+"****************",
+"               *",
+"               *",
+"      @@@@@    *",
+"     @@....    *",
+"@@@@ @@....    *",
+"@... @@....    *",
+"@... @@....    *",
+"@... @....+    *",
+"...+  +++++    *",
+"++++.XX        *",
+" ....XXXX      *",
+".....XXXXXX    *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+
+"* @@@@++++++++++",
+"* @@@@++++++++++",
+"* @@@@++++++++++",
+"* @@@@++++++++++",
+"* @@@@++++++++++",
+"* @@@@++++++++++",
+"* @@-@++++++++++",
+"* @@@@..........",
+"* -@@...........",
+"* @@..XX..XX..XX",
+"* @...X..XXXXX$.",
+"*  ++++++++++$$+",
+"*   .........$$.",
+"*   @........$$.",
+"*   @@@@@@@@@##@",
+"*   @@@@@@@@@##@",
+
+"+++++++X --.....",
+"+++++++X --.....",
+"+++++++X --.....",
+"+++++++X %-.....",
+"+++++++X --...X.",
+"+++++++X --.....",
+"+++++++X --.....",
+"........ --.....",
+".......  --.....",
+"..XX..+  --.....",
+".XXX.++  --.....",
+"+++++++  %-...X.",
+"......+  --.....",
+"......+  --.....",
+"@@@@@@   --.....",
+"@@@@@@   --.....",
+
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+".X...XXX.XXXXX *",
+".....XXXXXX.XX *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+".X...XXX.XXXXX *",
+".....XXXXXX.XX *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+
+"*   @@@@@@@@@==@",
+"*   @@@@@@@@@@@@",
+"*   @@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@+++@@@@@@",
+"@@@@@@@+++@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"*               ",
+"*               ",
+"*    o%%%%%%    ",
+"*   %%o%oo%     ",
+"*  %oo%o%%      ",
+"* .     .       ",
+"*.     .        ",
+"****************",
+
+"@@@@@@   --.....",
+"@@@@@@   --.....",
+"@@@@@@   %-...X.",
+"@@@@@@   --.....",
+"@@@@@    --.....",
+"@@@@     --.....",
+"@@@      --.....",
+"@@      +--.....",
+"         --.....",
+" OOOO    %-.....",
+" OOOO    --.....",
+" OOOO    --...@@",
+"+        -@@@@@@",
+"         @@@@@@@",
+"          ++++++",
+"****************",
+
+".....XXXXXXXXX *",
+".X...XXX.XXXXX *",
+".....XXXXXX.XX *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+".....XXXXXXXXX *",
+"....@@.XXXXXXX *",
+".@@@@@@@.XXXXX *",
+"@@.......@.XXX *",
+"@.++XXX.@@@@@+ *",
+".+++++.@@@@@++ *",
+"++++++++++++++ *",
+"****************",
+
+"****************",
+"*               ",
+"*      ---------",
+"*     --@@@@@@@@",
+"*    ---@@@@@@@@",
+"*   ----@@@@@@@@",
+"*   ----@@@@@@@@",
+"*   ----@@@---@@",
+"*   ----@@@...@@",
+"*   ----@@@---@@",
+"*   ----@@@...@@",
+"*   ----@@@@@@@@",
+"*   ----@@@@@@@@",
+"*   ----@@@@@@@@",
+"*   ----@@@@@@@@",
+"*   ----@@@@@@@@",
+
+"****************",
+"                ",
+"---             ",
+"@@-    ---------",
+"@@-   --=@@@@@@@",
+"@@------@@@@@@@@",
+"@--@@@@@@@-.-.-@",
+"@..@@@@@@@.....@",
+"@@@@@-.@@@-.-.-@",
+"@--@@@@@@@.....@",
+"@..@@-.@@@-.-.-@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@-.@@@@@@@@@",
+"@@.@@@@@@@@@@@@@",
+"@@@@@-.@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+
+"****************",
+"               *",
+"               *",
+"-------------- *",
+"@@@@@@@@@@@@=. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@.+*",
+"@@@@@@@@@@@@@.+*",
+"@@@@@@@@@@@@@.+*",
+"@@.X@@@@@@@@@.+*",
+"@.XXX@@@@@@@@.+*",
+
+"* X ----@@@@@@@@",
+"*   ----@@@@@@@@",
+"* X ----........",
+"*   ---.........",
+"* X --...XX@.XX@",
+"*   -...XX@.XX@.",
+"*    +..&&..XX..",
+"*     ..&&..XX..",
+"*  .....&&..XX..",
+"*  .@@@@&&@@@@@@",
+"*  .@@@@&&@@@@@@",
+"*  .@@@@@@@@@@@@",
+"*  .@@@@@@@@@@@@",
+"*  .@@@@@@@@@@@@",
+"*  .@@X@@@X@@@@@",
+"*  .@@@@@@@@@@@@",
+
+"@-.@@-.@@@@@@@@@",
+"@@@@@@@@@@@@@@@&",
+"........@@@@@@.&",
+".......-@@@@@.XX",
+"......@-@@@@.XXX",
+".....@-@@@@@XXX@",
+"++++@-@-@@@@XX@@",
+"++++-@--@@@@@@@@",
+"++++@---@@@@@@@@",
+"....----@@@@@@@@",
+"@@@@----@@@@@@@@",
+"@@@@----@@@@@@@&",
+"@@@@----@@@@@@.&",
+"@@@@-X--@@@@@.XX",
+"@@@@X@--@@@@.XXX",
+"@@@@@@--@-@@XXX@",
+
+".XXX@@@@@@@@@.+*",
+"XXX@@@@@@@@@@.+*",
+"&X@@@@@@@@@@@.+*",
+"X@@@@@@@@@@@@.+*",
+"@@@@@@@@@@@@@.+*",
+"@@@@@@@@@@@@@.+*",
+"@@@@@@@@@@@@@.+*",
+"@@@@@@@@@@@@@.+*",
+"@@.X@@@@@@@@@.+*",
+"@.XXX@@@@@@@@.+*",
+".XXX@@@@@@@@@.+*",
+"XXX@@@@@@@@@@.+*",
+"&X@@@@@@@@@@@.+*",
+"X@@@@@@@@@@@@.+*",
+"@@@@@@@@---@@.+*",
+"@@@@@@@@...@@.+*",
+
+"*  .@@@@@@@@@@@@",
+"*  .@@@@@@@@@@@@",
+"*  .@@X@@@X@@@@@",
+"*...@@@@@@@@@@@@",
+"*@@@@@@@@@@@@@@@",
+"*@@@@@@@@@@@@@@@",
+"*@@@@@X@@@X@@@@@",
+"*...@@@@@@@@@@@@",
+"*  .@@@@@@@@@@@@",
+"*  .@@@@@@@@@@@@",
+"*  .@@@@@@@@@@@@",
+"*  .@@@@@@@@@@@@",
+"*  .......@@@@@@",
+"*        .@@@@@@",
+"*        .@@@@@@",
+"****************",
+
+"@@@@@---@@@@XX@@",
+"@@@@----@@@@@@@@",
+"....----@@@@@@@@",
+".   ----=@@@@@@@",
+".   ---.........",
+".   --..........",
+".   -...........",
+".   ............",
+".    +++++++++++",
+".     +++++OOOOO",
+".      +++O%=%=%",
+".        O%=%=%O",
+".       OOOOOOO ",
+".       O    O  ",
+".               ",
+"****************",
+
+"@@@@@@@@---@@.+*",
+"@@@@@@@@...@@.+*",
+"@@@@@@@@@@@@@.+*",
+"@@@@@@@@@@@@=.+*",
+"..............+*",
+".............++*",
+"............+++*",
+"...........++++*",
+"+++++++++++++++*",
+"OO+++++++++++++*",
+"O++++++++++++++*",
+"               *",
+"               *",
+"               *",
+"               *",
+"****************",
+
+"     -..........",
+"****--@@@@@@@@@@",
+"*  ---@@@@@@@@@@",
+"* ----@-.-.-.-@@",
+"*-----@-.-.-.-@@",
+"*-----@-.-.-.-@@",
+"*-----@@@@@@@@@@",
+"*-----@@@@@@@@@@",
+"*-@---@@@@@@@@@@",
+"*@@---@@@@@@@@@@",
+"*@@---@@@@@@@@@@",
+"*@----@@@@@@@@@@",
+"*-----@@@@@@@@@@",
+"*-----@@@@@@@@@@",
+"*-----@@@@@@@@@.",
+"*-----@@@@@@@@oX",
+
+"................",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@..@@@@@@..@@@@",
+"@.X@.@@@@.X@.@@@",
+"oXXX.@@@oXXX.@@@",
+"oXX.@@@.oXX.@@@.",
+"XOO@@@oXXOO@@@oX",
+
+"..............  ",
+"@@@@@@@@@@@@@.**",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@..@@@@@@@@@. *",
+"@.X@.@@@@@@@@. *",
+"oXXX.@@@@@@@@. *",
+"oXX.@@@@@@@@@. *",
+"XOO@@@@@@@@@@. *",
+
+"*-----@@@@@@@.oX",
+"*-----@@@@@@.XXO",
+"*-----@@@@@.XXX.",
+"*-----@@@@.XXX.@",
+"*-----@@@.XXX.@@",
+"*-@---@@.XXX.@@@",
+"*-----@@XXX.@@@@",
+"*-----@@.X.@@@@@",
+"*-@---@@@@@@@@@@",
+"*-----@@.@@@@@@@",
+"*-@---@@@@@@@@@@",
+"*-----..........",
+"*-@--...........",
+"*---.-----------",
+"*--.--@@@@@@@@@@",
+"*-.---@@@-.@@@@@",
+
+"X.@@@.oXX.@@@.oX",
+"O@@@.XXOO@@@.XXO",
+"@@@.XXX.@@@.XXX.",
+"@@.XXX.@@@.XXX.@",
+"@.XXX.@@@.XXX.@@",
+".XXX.@@@.XXX.@@@",
+"XXX.@@@@XXX.@@@@",
+".X.@@@@@.X.@@@@@",
+"@@@@@@@@@@@@@@@@",
+".@@@@@@@.@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"................",
+"................",
+"----------------",
+"@@@@@@@@@@@@@@@@",
+"-.@@@@-.@@@@@@@@",
+
+"X.@@@@@@@@@@@. *",
+"O@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@............ *",
+"@@...........  *",
+"@@..........+  *",
+"@@...XXX...++  *",
+"@@..XXX...+++  *",
+"@@.@.@.@+++++  *",
+"@@..@.@.+++++  *",
+"@@.@.@.@.@.@.  *",
+"....@@@@@@@@@  *",
+"..@@.@@@@@@@@  *",
+"---------@@@@  *",
+"@@@@@@@@-@@@@  *",
+"@-----@@-@@@@  *",
+
+"*X----@@@@@@@@@@",
+"* ----@@@@@@@@@@",
+"* ----@@@@@@@@@@",
+"* ----@@@@@@@@@@",
+"* -@--@@@@@@@@@@",
+"* ----@@-..-..@@",
+"* -@--@@-..-..@@",
+"* ----@@-..-..@@",
+"* -@--@@@@@@@@@@",
+"* ----@@@@@@@@@@",
+"* -@--..........",
+"* ---.........@.",
+"* --...@.@.@....",
+"* -.............",
+"*               ",
+"****************",
+
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@-.@@@@@@",
+"@@@@@@@@-.@@@@@@",
+"@@@@@@@@-.@@@@@@",
+"@@@@@@@@-.@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"-.@@-..@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"................",
+"@.@.............",
+".....@.@.@..@.@.",
+"................",
+"                ",
+"****************",
+
+"--@@@-@@-@@@@  *",
+"--@@@-@@-@@@@@@@",
+"-.....@@-@@@@@@@",
+".....@@@-@@@@@@@",
+"@@@@@@@@-@@@@@@@",
+"@@@@@@@@-@@@@  *",
+"@@@@@@@@-@@@@  *",
+"@@@@@@@@-@@@@  *",
+"-.-.-.@@-@@@@  *",
+"@@@@@@@@- @@@  *",
+"......... @@@  *",
+"........  @@@  *",
+"@.@.@..   @@@  *",
+"......    @@@  *",
+"          @@@  *",
+"**********@@@***",
+
+"****************",
+"*               ",
+"*               ",
+"*               ",
+"*               ",
+"*       +   +   ",
+"*               ",
+"*               ",
+"*               ",
+"*               ",
+"*         @@@@@@",
+"*        -@@@@@@",
+"*       --@@@@@@",
+"*       @-@@@@@@",
+"*       @-@@@@@@",
+"*       -.......",
+
+"****************",
+"                ",
+"                ",
+"                ",
+"               @",
+"     +         @",
+"               @",
+"               @",
+"        +      @",
+"               @",
+"@@@@@@@@@@@@   @",
+"@@@@@@@@@@@@   @",
+"@@@@@@@@@@@@   @",
+"@@@@@@@@@@@@+  @",
+"@@@@@@@@@@@@+  @",
+"...........++  @",
+
+"*@@@@***********",
+" @@@@          *",
+" @@@@          *",
+" @@@@          *",
+"@@@@@@@@@@@@@  *",
+"@@@@@@@@@@@@@  *",
+"@@@@@@@@@@@@@  *",
+"@@--@@@--@@@@  *",
+"@@@@@ooo@@@@@  *",
+"@@@@@oOO@@@@@  *",
+"@@@@@@@@@@@@@  *",
+"@@--@@@--@@@@  *",
+"@@@@@@@@@@@@@  *",
+"@###@@@@@@@@@  *",
+"@#$$@@@@@@@@@  *",
+"@@--@@@--@@@@  *",
+
+"*       ...X.X..",
+"*        +++++++",
+"*   +           ",
+"*               ",
+"*               ",
+"*               ",
+"*        +      ",
+"*               ",
+"*               ",
+"*        +      ",
+"*               ",
+"*               ",
+"*               ",
+"* +             ",
+"*         @---  ",
+"*         @---@@",
+
+"..X.X.X...+++  @",
+"+++++++++++++  @",
+"               @",
+"               @",
+"               @",
+"     %--       @",
+"    %%---      @",
+"   %%%%&-@      ",
+"  %%--@@.@      ",
+" %%---@@..      ",
+" %---@@@.      +",
+" ---@@@.        ",
+"  -@@@.+        ",
+"   @..+++       ",
+"   +.+++++      ",
+"@@@@@+++++      ",
+
+"@@@@@@@@@@@@@  *",
+"@@@@@+++@@@@@  *",
+"@@@@@+++@@@@@  *",
+"@@--@@@--@@@@  *",
+"@@@@@@@@@@@@@  *",
+"@@@@@@@@@@@@@  *",
+"@@@@@@@@@@@@@  *",
+"               *",
+"               *",
+"               *",
+"               *",
+"               *",
+"               *",
+"               *",
+"     %@@@@     *",
+"    %%@@@@     *",
+
+"*         @...  ",
+"*               ",
+"*     +         ",
+"*          %--  ",
+"*         %%--- ",
+"*        %%%%&-@",
+"*       %%--@@.@",
+"*      %%---@@..",
+"*      %---@@@.@",
+"*      ---@@@.++",
+"*       -@@@.++ ",
+"*        @@.++++",
+"*         ++++++",
+"*          +++++",
+"*           ++++",
+"****************",
+
+"   +@ +++       ",
+"   +@           ",
+"   +@           ",
+"   +%--      %--",
+"   %%---    %%--",
+"  %%%%&-@  %%%%&",
+" %%--@@.@ %%--@@",
+"%%---@@..%%---@@",
+"@---@@@.@@---@@@",
+"---@@@.  ---@@@.",
+" -@@@.++  -@@@.+",
+"  @@.++++  @@.++",
+"+  +++++++  ++++",
+"+   ++++++   +++",
+"     ++++     ++",
+"****************",
+
+"   %%%@@@@     *",
+"   %%%@@@@     *",
+"   %%%@@@@     *",
+"   %%%@@@@+    *",
+"-  %%%@@@@+    *",
+"-@ %%%@@@@+    *",
+".@ %%%@@@@+    *",
+".. %%@....+    *",
+".  %@....++    *",
+"   @....+++    *",
+"+   +++++++    *",
+"++   ++++++    *",
+"+++            *",
+"+++            *",
+"++             *",
+"****************",
+
+"****************",
+"*               ",
+"*               ",
+"* $          +  ",
+"*  -@@@@@@      ",
+"* --@@@@@@   $  ",
+"* --@@@@@@  +   ",
+"* --@@@@@@      ",
+"* --......      ",
+"* -......       ",
+"* ..@.@.       -",
+"*   @ @       -X",
+"*   @ @      %-.",
+"*   @ @  +  %%.X",
+"*   @ @    %%-..",
+"*  @---+  %%%-.X",
+
+"****************",
+"                ",
+"                ",
+"                ",
+"        --------",
+"     ---.X.X.X.X",
+"   --...........",
+"  --.X.X.X.X.X.X",
+" -..............",
+"-X.X.X.X.X.X.X.X",
+"................",
+".X.X.X.X.X.X.X.X",
+"................",
+".X.X.X.X.X.X.X.X",
+"................",
+".X.X.X.X.X.X.X.X",
+
+"****************",
+"               *",
+"           $   *",
+"               *",
+"      $        *",
+"---      +     *",
+"...--          *",
+".X.X--         *",
+"......-       $*",
+".X.X.X.-       *",
+"........-      *",
+".X.X.X.X.-     *",
+".........-     *",
+".X.X.X.X.X-    *",
+"..........-    *",
+".X.X.X.X.X-    *",
+
+"*  @---@@@@%%...",
+"*  @...+ %%%%X.X",
+"*   ++++ %%%%...",
+"*        %%%-X.X",
+"*       %%%-%...",
+"*       %%-%%X.X",
+"*       %-%-%...",
+"*       -%-%-%.X",
+"*       %-%--%..",
+"*       -%---%.X",
+"*       %-----%.",
+"*        -----%X",
+"*        ------%",
+"*        -------",
+"*         -----@",
+"*         ----@-",
+
+"................",
+".X.X.X.X.X.X.X.X",
+"................",
+".X.X.X.X.X.X.X.X",
+"................",
+".X.X.X.X.X.X.X.X",
+"................",
+".X.X.X.X.X.X.X.X",
+"................",
+".X.X.X.X.X.X.X.X",
+"................",
+".X.X.X.X.X.X.X.X",
+"................",
+"%X.X.X.X.X.X.X.X",
+"--..............",
+"@--@.X.X.X.X.X.X",
+
+"...........@   *",
+".X.X.X.X.X.@   *",
+"...........@   *",
+".X.X.X.X.X.@   *",
+"...........@+  *",
+".X.X.X.X.X.@+  *",
+"...........@+  *",
+".X.X.X.X.X@++  *",
+"..........@++  *",
+".X.X.X.X.X@++$ *",
+".........@+++  *",
+".X.X.X.X.@+++  *",
+"........@+++   *",
+".X.X.X.@++++   *",
+"......@+++++   *",
+".X.X@@+++++    *",
+
+"*   +      --@-@",
+"*       +   @-@-",
+"*            @-@",
+"*             @@",
+"*              @",
+"*               ",
+"*               ",
+"*               ",
+"*     @.        ",
+"*    @.     +   ",
+"*   @.  @.      ",
+"*      @.      $",
+"*     @.        ",
+"*               ",
+"*               ",
+"****************",
+
+"-@@--...........",
+"@@@@@--@.X.X.X.X",
+"@@@@@@@@-@@@@@@@",
+"@@@@@@@@@.@.@...",
+"@@@@@@@@.@.@....",
+"+@@@@@@.@.@....+",
+" +++@@......++++",
+"  +++.+.+.++++++",
+"   ++.+.+.++++++",
+"     @+@+@++++++",
+"     @ @ @      ",
+"     -----------",
+"     -----......",
+"     +++++      ",
+"                ",
+"****************",
+
+"...@@++++++    *",
+".@@@+++++++    *",
+"@@.++++++$     *",
+"..+++++++      *",
+".+++++++   $   *",
+"+++++++        *",
+"++++++         *",
+"+++++          *",
+"+++    -@@@@@  *",
+"+     --@@@@@  *",
+"      --@@@@@  *",
+"--------.....+ *",
+"......-.....++ *",
+"       +++++++ *",
+"               *",
+"****************",
+
+"****************",
+"*               ",
+"*    -----------",
+"*   --@@@@@@@@@@",
+"*  ---@-@@@@@@@@",
+"* --%-@@@@@@@@@@",
+"* ----@@@@@@@@@@",
+"* ----@@@@@@@@@@",
+"* --%-@@@@@@@@@@",
+"* ----@@@@@@@@@.",
+"* ----@@@@@@@@.X",
+"* --%-@@@@@@@.XX",
+"* %---@@@@@@oXXX",
+"* ----@@@@@.oXX.",
+"* --%-@@@@oXXOO@",
+"* ----@@@.oXX.@@",
+
+"****************",
+"                ",
+"----------------",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"..@@@@@@@@..@@@@",
+"X@.@@@@@@.X@.@@@",
+"XX.@@@@@.XXX.@@@",
+"X.@@@@@.XXX.@@@@",
+".@@@@@oXXX.@@@@@",
+"@@@@@.oXX.@@@@@@",
+"@@@@oXXOO@@@@@@@",
+"@@@.oXX.@@@@@@@.",
+
+"****************",
+"               *",
+"-------        *",
+"@@@@@@.        *",
+"@@@@-@.@@@@@@@ *",
+"@@@@@@.@@@@@-@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@.@.@@.@@@@@@@ *",
+
+"* %---@@@XXOO@@@",
+"* --%-@@@XX.@@@@",
+"* ----@@@@.@.@@@",
+"* %---@@@@@.@.@@",
+"* --%-@-@@@@.@.@",
+"* ----@@@@@@@.@.",
+"* ---@..........",
+"* --@...........",
+"* -@.......X..X.",
+"* @....XX.......",
+"*  +++++++++++++",
+"*   +...........",
+"*    ...........",
+"*    @..........",
+"*    @@@-@@-@@-@",
+"*    @@@@@@@@@@@",
+
+"@@@XXOO@@@@@@@@.",
+"@@@XX.@@@@@@@@@.",
+"@@@@.@.@@@@@@@@.",
+"@@@@@.@.@@@@@@@.",
+"@@@@@@.@.@@@@@@@",
+"@@@@@@@.@.@@@@@@",
+"................",
+"................",
+".X..X..X..X..@..",
+"............@@@@",
+"+++++++++++@@-@-",
+".......+++@@--@@",
+".......+++@---@@",
+"..........----@@",
+"@@@@@@@@@@----@@",
+"@@@@@@@---X---@@",
+
+"@.@.@@.@@@@@@@ *",
+"@.@.@@.@@@@@@@ *",
+"@.@.@@.@@@@@@@ *",
+"@.@.@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+".......@@@@@@@ *",
+"......@@@@@@@@ *",
+".............. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@-@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@.@.@.@@@@@@. *",
+"@@@@@@@@@@@@@.+*",
+"@@.@.@.@@@@@@.+*",
+
+"* $$ @@@@@@@@@@@",
+"*   $@@@+@@@@@@@",
+"*    @@+++@@@@@@",
+"@@@@@@+++@@@@@@@",
+"@@@@@@@+@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@-@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"*    @@@@@@@@@@@",
+"*    @@@@@@@@@@@",
+"*          %%%@@",
+"*     $   %%% @@",
+"*$   $        @@",
+"*             @@",
+"**************@@",
+
+"@@@@@XOOOOX---@@",
+"@@@@@XOOOO----@@",
+"@@@@@@@-------@@",
+"@@@@@@@@@@--.-@@",
+"@@@@@@@@@@----@@",
+"@@@@@@@---X-.-@@",
+"@@@@@X&&&&X---@-",
+"@@@@@X&&&&--.-@@",
+"-@@@@@@------@..",
+"@@@@@@@@@@--@...",
+"@@@@@@@@@@-@..X.",
+"@@@       @.....",
+"@@@  $$    +++++",
+"@@@  $$     ++++",
+"@@@          +++",
+"@@@*************",
+
+"@@@@@@@@@@@@@.+*",
+"@@.@.@.@@@@@@.+*",
+"@@@@@@@@@@@@@.+*",
+"@@@@@@@@@@@@@.+*",
+"@@@@@@@@@@@@@.+*",
+"@@@@@@@@@@@@@.+*",
+"@@@@@@@@@@@-@.+*",
+"@@@@@@@@@@@@@.+*",
+"..............+*",
+".............++*",
+"X.X...X.X.X.+++*",
+"...........++++*",
+"+++++++++++++++*",
+"+++++++++++++++*",
+"+++++++++++++++*",
+"****************",
+
+"****************",
+"*               ",
+"*         ----- ",
+"*        @-...--",
+"*       @@-@@@..",
+"*      @@@-@@@@@",
+"*     @@@@-@@@@@",
+"*    @@@@@-@@@@@",
+"*   @@@@@@-@@@@@",
+"*  @@@@@@@-@-@@@",
+"*  @@@@@@@-@.@@@",
+"*  @@@@@@@-@.@@@",
+"*  @@-@@@@-@.@@@",
+"*  @--@@@@-@.@@@",
+"*  -@-@@@@-@.@@@",
+"* -@@-@@@@-@.@@@",
+
+"****************",
+"                ",
+"               .",
+"--------------.X",
+"..............XX",
+"@@@@@@@@@@@@.XXX",
+"@.....@@@@@&XXX@",
+"@@@@@@@@@@&&&&@@",
+"@...@@@@@.&&&-@@",
+"@@@@@@@@.XXX.-@@",
+"@.@@@@@.XXX@.-@@",
+"@@@@@@.XXX@@.-@.",
+"@@@@@.XXX@@@.-.X",
+"@@@@.XXX@@@@..XX",
+"@@@@XXX@@@@@.XXX",
+"@@@@XX@@@@@&XXX@",
+
+"****************",
+"               *",
+"               *",
+".       +      *",
+"X              *",
+"...........    *",
+"@@@@@@@@@@.    *",
+"@@@@@@@-@@.    *",
+"@@@@@@@@@@.    *",
+"@@@@@@@@@@.    *",
+"@@@@@@@@@@.    *",
+"@@@@@@@@@@.+   *",
+".@@@@@@@@@.+   *",
+"X@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+
+"* @@.-@@@@-@.@@@",
+"* @.@-@@@@-@.@@@",
+"* .@.-@@@@-@.@@@",
+"*  .@-@@@@-@.@@@",
+"*  @.-@@@@-@.@@@",
+"*  .@-@@@@-@.@@@",
+"*  @.-@@@@-@.@@@",
+"*  .--@@@@-@.@@@",
+"*  -@-@@@@-@.@@@",
+"* -@@-@@@@-@.@@@",
+"* @@@-@@@@-@.@@@",
+"* @@.@@@@@-@.@@@",
+"* @.@@@@@@-@.@@@",
+"* .@@@@@@@-@.@@@",
+"*  @@@-@@@-@.@@@",
+"*  @@--@@@-@...@",
+
+"@@@@@@@@@@&&&&@@",
+"@@@@@@@@@.&&&-@@",
+"@@@@@@@@.XXX.-@@",
+"@@@@@@@.XXX@.-@@",
+"@@@@@@.XXX@@.-@.",
+"@@@@@.XXX@@@.-.X",
+"@@@@.XXX@@@@..XX",
+"@@@@XXX@@@@@.XXX",
+"@@@@XX@@@@@&XXX@",
+"@@@@@@@@@@&&&&@@",
+"@@@@@@@@@.&&&-@@",
+"@@@@@@@@.XXX.-@@",
+"@@@@@@@.XXX@.-@@",
+"@@@@@@.XXX@@.-@@",
+"@@@@@.XXX@@@.-@@",
+"@@@@.XXX@@@@.-@@",
+
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+".@@@@@@@@@.+   *",
+"X@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+
+"*  @-@-@@@-@.@.@",
+"*  -@@-@@@-@.@.@",
+"* -@@@-@@@-@.@.@",
+"* @@@@-@@@-@-@-@",
+"* @@@@.@@@-@@@@@",
+"* @@@.@@@@------",
+"* @@.@@@@@......",
+"* @.@@@@@..X....",
+"* .@@@@@........",
+"*  @@@@.........",
+"*  @@@..........",
+"*  @@......XX...",
+"*  @......XX....",
+"*   ++++++++++++",
+"*    +++++++++++",
+"****************",
+
+"@@@@XXX@@@@@.-@@",
+"@@@@XX@@@@@@.-@@",
+"@@@@@@@@@@@@.-@@",
+"@@@@@@-@-@-@.-@@",
+"@@@@@@@@@@@@.-@@",
+"--------------X.",
+".............X..",
+".........X..X...",
+"...........X....",
+"..........++++++",
+".........+++++++",
+"........++++++++",
+".......+++++    ",
+"++++++++++++    ",
+"++++++++++++    ",
+"****************",
+
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@-@@.+   *",
+"@@@@@@@@@@.+   *",
+"...........+   *",
+"..@@@X@@@X++   *",
+".@..X@..X+++   *",
+"@..X@..X++++   *",
+"++++++++++++   *",
+"++++++++++++   *",
+"++++++++++++   *",
+"               *",
+"   +           *",
+"               *",
+"****************",
+
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooo            ",
+"oooX   + +      ",
+"ooOX   @@@@@@@@@",
+"ooOX  @@@@@@@@@@",
+"ooOX  @@@@@@@@@@",
+"ooOX  @@-@@-@@-@",
+"ooOX  @@@@@@@@@@",
+"ooOX  @@@@@@@@@@",
+"@@@@@@@@-@@@@@@-",
+"@@@@@@@@@@@   --",
+"@@@@@@@@@@@  ---",
+"@@-@@-@@-@@ ----",
+"@@@@@@@@@@@-----",
+"@@@@@@@@@@@-----",
+
+"oooooooooooooooo",
+"oooooooooooooooo",
+"                ",
+"       +   +   +",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"**X@-@@-@@-@@-@@",
+"**X@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"------@@@@@-----",
+"@@@@@.@@@@--@@@@",
+"@@@@@..@@---@@@@",
+"@@@@@..@----@@@@",
+"@@@@@..@----@@@@",
+"@@@@@..@----@@@@",
+
+"oooooooX@@@@@@oo",
+"oooooooX@@@@@@oo",
+"        @@@@@@  ",
+"        @@@@@@  ",
+"@@@@@@@@@@@@@@  ",
+"@@X@@@@@@@@@@@  ",
+"@X.X@@@@@@@@@@@@",
+"@@X@@@@-@@-@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@------@@",
+"-@*.*@*--@@@@.@@",
+".@@@@@---@@@@.@@",
+"..@@@----@@@@..-",
+"..@@@----@@@@..@",
+"..@@@----@@@@..@",
+"..@@@----@@@@..@",
+
+"oooooooooooooooo",
+"oooooo==oooooooo",
+"     . ==     oo",
+"    .   ==    oo",
+"   X     ==   oo",
+"         X==  oo",
+"@@@@@@  X X== oo",
+"@@@@.@ X X =  oo",
+"@@@@@.X.X     oo",
+"@@@@@X.X      oo",
+"@@@@@.X.      oo",
+"@@@@.@  .     oo",
+"@@-@@@   +    oo",
+"@@@@@@    +   oo",
+"@@@@@@  -.... oo",
+"@@-@@@ --@@@. oo",
+
+"@@@@@@@@@@ --.--",
+"XXXX       -----",
+"ooOX       --.--",
+"ooOX   ---------",
+"ooOX  --.....---",
+"ooOX ---.....-.-",
+"ooOX ---.....---",
+"ooOX ---...@@---",
+"ooOX ---...@@---",
+"ooOX ---...@@---",
+"ooOX ---...@@---",
+"ooOX ---...@@.--",
+"ooOX ---...@@---",
+"ooOX ---...@@---",
+"ooOX --@@@@@@---",
+"ooOX -@@@@+@@---",
+
+"@---------------",
+"--..............",
+"--@@@@@@@@@@@@@@",
+"--@@@@@@@@@@@@-o",
+"--@@-.@@@@@@@-o@",
+"--@@-.@@@@@@@-o@",
+"--@@@@@@@@@@@@-o",
+"--@@@@@@@@@@@@-o",
+"--@@@@@@@@@@-ooo",
+"--@@@@@@@@@@@@-o",
+"--@@@@@@@@@@@@-o",
+"--@@@@@@@@@@@@-o",
+"--@@@@@@@-ooo@-o",
+"--@@-.@@@@-oO@-o",
+"--@@-.@@@@@-oOOo",
+"--@@@@@@@@@@-ooo",
+
+"----------------",
+"...............-",
+"@@@@@@@@@@@@@@.-",
+"o@@@@@@@@@@@@@.-",
+"-o@@@@@@@@-.@@.-",
+"-o@@@@@@@@-.@@.-",
+"O@@@@@@@@@@@@@.-",
+"O@@@@@@@@@@@@@.-",
+"Ooo@@@@@@@@@@@.-",
+"O@@@@@@@@@@@@@.-",
+"O@@@@@@@@@@@@@.-",
+"O@@@@@@@@@@@@@.-",
+"O@-ooo@@@@@@@@.-",
+"O@-Oo@@@@@-.@@.-",
+"OOOo@@@@@@-.@@.-",
+"ooo@@@@@@@@@@@.-",
+
+"@@@@@@@--@X@. oo",
+"@@@@@@@--@@@. oo",
+"@@-@@@@--@@@.+oo",
+"@@@@@@@--@X@.+oo",
+"@@@@@@ --@@@.+oo",
+".@-@@@ --....+oo",
+".@@@@@ -....++oo",
+".@@@@@@#$$++++oo",
+".@-@@@##$$    oo",
+".@@@@@##$$    oo",
+".@@@@@#$$@@@  oo",
+".@-@@@@#$$@#$$oo",
+".@@@@@##$$##$$oo",
+".@@@@@##$$##$$oo",
+".@-@@@#$$@#$$@oo",
+".@@@@@@@@@@@@@@@",
+
+"ooOX @@@@++@-.--",
+"ooOX  +++++@----",
+"ooOX   ++++@----",
+"ooOX o..+++-----",
+"ooOX o..   -----",
+"ooOX oOO   --.--",
+"ooOX       -.---",
+"ooOX o..   -----",
+"ooOX o..   ----@",
+"ooOX oOO   ---@@",
+"ooOX       --@@@",
+"ooOX o..   -@@@X",
+"ooOX o..   @@@..",
+"ooOX oOO    ++..",
+"ooOX         ++.",
+"oo==============",
+
+"--@@@@@@@@@@@@@@",
+"----------------",
+"-@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"................",
+"................",
+"................",
+"................",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"XXXX@@@@XXXX@@@@",
+"...@@@@X...@@@@X",
+"..@@@@....@@@@..",
+"...+++..........",
+"..........-  ...",
+"==--.....--  ..-",
+
+"@@@@@@@@@@@@@@.-",
+"----------------",
+"@@@@@@@@@@@@@@@.",
+"@@@@@@@@@@@@@@..",
+".............@..",
+".............@..",
+".............@..",
+".............@..",
+"@@@@@@@@@@@@@@..",
+"@@@@@@@@@@@@@...",
+"XXXX@@@@@@@@+...",
+"...@@@@@@@@++...",
+"..@@@@@@@@+++...",
+"................",
+"................",
+"  ..........=...",
+
+".@@@@@@@@@@@@@@@",
+".@-@@-@@-@@-@@-@",
+".@@@@@@@@@@@@@@@",
+".@@@@@@@@@@@@@@@",
+".@-@@@@@@@@@@@@@",
+"@@@@@@        XX",
+"@@@@@@    -@@@oo",
+"@@-@@@   *-@@@.o",
+"@@@@@@  *.-@@@oo",
+"@@@@@@ *. ----.o",
+"@@-@@@   *. *.oo",
+"@@@@@@  *. *. oo",
+"@@@@@@ *. *.  oo",
+"@@-@@@  +  +  oo",
+"@@@@@@   +  + oo",
+"@@@@@@    @ + oo",
+
+"oo==============",
+"ooOX        -X. ",
+"ooOX       -X.  ",
+"ooOX      -X.   ",
+"ooOX     -X.    ",
+"ooOX    -X.     ",
+"ooOX   -X. @@@@@",
+"ooOX    .  @@@@@",
+"ooOX     + @@-@@",
+"ooOX      +@@@@@",
+"ooOX X     .@@@@",
+"ooOX       @.-.@",
+"ooOXXXXXXXX.....",
+"ooOOOOOOOOX@@@@@",
+"ooooooooooX@@-@@",
+"ooooooooooX@@@@@",
+
+"==..@@@@@--..@--",
+" -..@@@@@-..@@--",
+" ...@@@@@@@@-@-.",
+"   @@@@@@@@@@@@@",
+"          @@@@@@",
+"          @@-@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"-@@-@@-@@-@@-@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@               ",
+"@XXXXXXXXXXXXXXX",
+"@OOOOOOOOOOOOOOO",
+"@ooooooooooooooo",
+"@ooooooooooooooo",
+
+"  @@-@@-@@--.=@-",
+"..@@@@@@@@-.=.@@",
+".@@@@@@@@@...=@@",
+"@@@@@@@@@@@@=.@@",
+"           -.=  ",
+"          -X=.  ",
+"         -X..=  ",
+"  ..... -X. =.  ",
+"  .    -X.  .=  ",
+"  .   -X.   =.  ",
+"  .  -X.    .=  ",
+"  .   .     =.  ",
+"XXXXXXXXXXXX.=XX",
+"OOOOOOOOOOOO=.OO",
+"oooooooooooo.ooo",
+"oooooooooooooooo",
+
+"@@-@@@   -@.  oo",
+"@@@@@@    @   oo",
+"@@@@@@  @   @ oo",
+"@@@@@@ -@. -@.oo",
+"        @   @ oo",
+"          @   oo",
+"    + +  -@.  oo",
+"          @   oo",
+"    + +       oo",
+"              oo",
+"              oo",
+" +            oo",
+"XXXXXXXXXXXXXXoo",
+"OOOOOOOOOOOOOooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+
+"****************",
+"*               ",
+"*               ",
+"*               ",
+"*               ",
+"*               ",
+"*     +         ",
+"* @@@@@@@@@@@@@@",
+"*               ",
+"*               ",
+"*               ",
+"*    o       o  ",
+"*&..............",
+"* .--...........",
+"*&..............",
+"* .--...........",
+
+"****************",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"@@@@@@@@@@      ",
+"        +@      ",
+"         @      ",
+"         @      ",
+"     o      o   ",
+"................",
+"................",
+"................",
+"................",
+
+"****************",
+"                ",
+"                ",
+"                ",
+"          XXX   ",
+"       . X..    ",
+"      . X       ",
+"     . X -      ",
+"    . XX        ",
+"      XX        ",
+"      X         ",
+"   o      o     ",
+"................",
+"................",
+"................",
+"................",
+
+"****************",
+"                ",
+"                ",
+"                ",
+"             @@@",
+"          + @@@@",
+"           @@@@@",
+"          @@@@-@",
+"         @@@@@@@",
+"        @@@@-@@@",
+"        @@@@@@@@",
+" o     o@@@@@@@@",
+"................",
+"................",
+"................",
+"................",
+
+"****************",
+"      & & & & & ",
+"      ..........",
+"      .-.-.-.-.-",
+"@@@@@@.-.-.-.-.-",
+"@@@@@@..........",
+"@-@@@@....@@@.@.",
+"@@@@@@....@.@.@.",
+"@@@@@@....@@@.@.",
+"@     ....@.@.@@",
+"      ....@@@.@.",
+"o    o..........",
+"................",
+"................",
+"............-...",
+"............-...",
+
+"****************",
+"& &            *",
+"...            *",
+".-.            *",
+".-.            *",
+"...o         + *",
+"...            *",
+"...            *",
+"...            *",
+"...            *",
+"...            *",
+"...o     o     *",
+"..............&*",
+"...........--. *",
+"..............&*",
+".....@@@...--. *",
+
+"*&..............",
+"* .--.@.@@@.....",
+"*&....@.@.@...--",
+"* .--.@@@@@.....",
+"*&..............",
+"* .--...........",
+"*&..............",
+"* .--...........",
+"*&..............",
+"*    o@@@@@@@@o ",
+"*     @@@@@@@@  ",
+"*     @@@-@@@@  ",
+"*     @@@@@@@@  ",
+"*     @@@@@@@@  ",
+"*     @@@-@@@@  ",
+"*     @@@@@@@@  ",
+
+"................",
+"................",
+"--...----...----",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"     o      o  @",
+"               @",
+"               @",
+"               @",
+"               @",
+"               @",
+"               @",
+
+"................",
+"................",
+"...----...----..",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+"   o      o     ",
+"                ",
+"                ",
+"              + ",
+"                ",
+"@@@@@@@@@@@@@   ",
+"            @   ",
+
+"................",
+"................",
+".----...----...-",
+"................",
+"................",
+"................",
+"................",
+"................",
+"................",
+" o     o@@@@@@@@",
+"        @@@@@@@@",
+"        @@@-@@@@",
+"        @@@@@@@@",
+"        @@@@@@@@",
+"        @@@-@@@@",
+"        @@@@@@@@",
+
+"............-...",
+"................",
+"---...----....--",
+"................",
+"................",
+"............-...",
+"............-...",
+"............-...",
+"............-...",
+"o    o..........",
+"      ..........",
+"      ..........",
+"      ......-...",
+"      ......-...",
+"      ......-...",
+"      ......-...",
+
+".....@..@@....&*",
+".....@.....--. *",
+"--............&*",
+".....@@@.@.--. *",
+".....@.@.@....&*",
+".....@.@@@.--. *",
+"..............&*",
+"...........--. *",
+"..............&*",
+"...o     o     *",
+"...            *",
+"...            *",
+"...     @@@    *",
+"...       @    *",
+"...   -.. @    *",
+"...   -.. @    *",
+
+"*     @@@@@@@@@@",
+"*     @@@-@@@@  ",
+"*     @@@@@@@@  ",
+"*    @@@@@@@@@@ ",
+"*   @@@@@-@@@@@@",
+"*   @@@@@@@@@@@@",
+"*   @@@@@@@-@@@@",
+"*   @@@@@@@@@@@@",
+"*   @@@@@@@@@@@@",
+"*   @@@@@@@@@%%%",
+"*   @@@@@@@@@@-%",
+"*   @@@@@@@@@@@@",
+"*   @@@@@@@@@@--",
+"*   ---------.-&",
+"*  .-&-------.--",
+"* ..---%@-%@-.--",
+
+"@@@@@@@@@@@@@@@@",
+"                ",
+"                ",
+"                ",
+"@%%%%%@@@@@@@@@@",
+"@@%%%@@@@@@@@@@@",
+"@@@%@@@@@@@@@@@@",
+"@@-%@@@@@@@@@@@@",
+"@@%%@@@@@@@@@@@@",
+"+%-%%%+%%@@@-@@@",
+"+%-%%%+-@@@@@@@@",
+"-%-%%-@@--------",
+"-------.-&------",
+"-------.---%@--%",
+"-%@-%@-.---%@--%",
+"-%@-%@-.--------",
+
+"            @   ",
+"            @   ",
+"            @  -",
+"            @  -",
+"@@@@@@@@@@@@@@X-",
+"@@@@@@%@@@@@@@X-",
+"@@@%@@%@@@@@@XX-",
+"@@@%%%%%@@@@@XX-",
+"@@@@@.-@@@@@.XX-",
+"@-@@@@%@@@@.@XX-",
+"@@@@@@@@@@.@.X.-",
+"--------@.@.@.X-",
+"--------.@.@.XX-",
+"@--%@---@.@.@XX-",
+"@--%@---.@.@.XX-",
+"--------@.@.@XX-",
+
+"        @@@@@@@@",
+"        @@@@@@@@",
+"-------------@@@",
+"-------------@@@",
+"---------.---@@@",
+"-------------@@@",
+"-----&-------@@@",
+"----.--------@@@",
+"---.---------@@@",
+"----@----&---@@@",
+"-----@--.----@@@",
+"---------@---@@@",
+"-------------@@@",
+"---------.---@@@",
+"-------------@@@",
+"-------------@@@",
+
+"     o..........",
+"      ..........",
+"      ..........",
+"      ......-...",
+"      ......-...",
+"      ......-...",
+"      ......-...",
+"     o..........",
+"      ..........",
+"      ..........",
+"      ......-...",
+"      ......-...",
+"      ......-...",
+"      ......-...",
+"     o..........",
+"+     ..........",
+
+"...o  -@@ @    *",
+"...       @    *",
+"...       @    *",
+"...       @    *",
+"...       @    *",
+"...      +@    *",
+"...       @    *",
+"...o      @    *",
+"...       @    *",
+"...       @    *",
+"...       @    *",
+"...       @    *",
+"...       @    *",
+"...       @    *",
+"...o      @    *",
+"...       @    *",
+
+"* ..---%@-%@-.--",
+"* ..---------.--",
+"* ..---------.--",
+"* ..---------.--",
+"* ..---------.--",
+"* ..---%@-%@-.--",
+"* ..---%@-%@-.-&",
+"* ..-&-------.--",
+"* ..---------.OO",
+"* .OOOOOOOOOOOOO",
+"* .OOOOOO...OOOO",
+"*  +++++....++++",
+"*     @@@@@@@@..",
+"*    @.X@@@@+++@",
+"*   @.XXX@@@+++@",
+"*  X@XXX@@@@@@@@",
+
+"-------.--------",
+"-------.--------",
+"-------.--------",
+"-------.---%@--%",
+"-%@-%@-.---%@--%",
+"-%@-%@-.-&------",
+"-------.--------",
+"-------.OOOOOOOO",
+"OOOOOOOOOOOOOOOO",
+"OOXXXOOOOXXOOOOX",
+"OO...OOOO..OOOO.",
+"+X...+++X..+++X.",
+"................",
+"@@@@@@@@@..XXX..",
+"@@@@@@@@@@@XXX@@",
+"@@@@@@@@@@@@@@@@",
+
+"--------.@.@.XXX",
+"--------@.@.@XXX",
+"--------.@.@....",
+"@--%@---@.@.....",
+"@--%@---.@......",
+"--------@.......",
+"--------........",
+"OOOOOOO--@@@@@@@",
+"OOOOOOo---@@@@@@",
+"XXOOOoo---%@@@@@",
+"..OOooo---@@@@@@",
+"..XXoOo-----@@@@",
+"..XXooo------@@@",
+"....Xoo------@@@",
+"@@@@XOo---%%----",
+"@@XXooo---@@----",
+
+"XXXX.XXXXXX@@@@@",
+"XXX.XXXXX@@@@@@@",
+"........@@@@@@@@",
+".......@@@-@@@@@",
+"......@@@@@@@@@@",
+"........@@@@@@@@",
+"........@@@@@@@@",
+"@@@@....@@-@@@@@",
+"@@@@....@@@@@@@@",
+"@@@@....@@@@@@@@",
+"..@@....@@@@@@@@",
+"@@@@....@@-@@@@@",
+"@@@@....@@@@@@@@",
+"@@@@..@@@@@@@@@@",
+"%%--..@@@@@@@@@@",
+"@@--..@%@@-@@@@@",
+
+"      ..........",
+"      ......-...",
+"      ......-...",
+"      ......-...",
+"      ......-...",
+"     o..........",
+"      ..........",
+"      ..........",
+"      ......-...",
+"      ......-...",
+"      ......-...",
+"     o......-...",
+"      ..........",
+"      ..........",
+"      ..........",
+"      ......-...",
+
+"...       @    *",
+"...       @    *",
+"...       @    *",
+"...       @    *",
+"...   @@@@@    *",
+"...o  @        *",
+"...   @        *",
+"...   @        *",
+"...   @        *",
+"...   @ @@@    *",
+"...   @ ...    *",
+"...o  @        *",
+"...   @        *",
+"...   @ @@@    *",
+"...   @ ...    *",
+"...   @        *",
+
+"* .-@@X@@@@@@@@@",
+"* ..@@@@@@@@....",
+"* ..@@@@@@@...@.",
+"* .-@@@@@@......",
+"* ..@@@@@@.+++++",
+"* ..@@@@@@.+++++",
+"* .-@@@@@@......",
+"* ..@@@$$@......",
+"* ..@@@$$@......",
+"* .-@@@$$@......",
+"* ..@@@@@@......",
+"* ..@@@@@@......",
+"* ..@@@@@@......",
+"* ..@@@@@@......",
+"* .-@@@@@@......",
+"* ..@@@@@@.XXXXX",
+
+"@@@@@@@@@@@@@@@@",
+".........@@@@@@@",
+".@..@.....@@@@@@",
+"........@..@@@@@",
+"+++++++....@@@@@",
+"++++++++...@oo@@",
+"...     .@.@oo@@",
+"...    +...@oo@@",
+"...     ...@@@@@",
+"...     .@.@@@@@",
+"...    +...@@@@@",
+"...     ...@@@@$",
+"...     .@.@@@@$",
+"...    +...@@@@$",
+"...     ...@@@@@",
+"XX      .@.@@@@@",
+
+"@@+XoOo---------",
+"@@+Xooo---------",
+"@@+Xooo---------",
+"@@XXooo---%%----",
+"@@@@XOo---@@----",
+"@@@@Xoo---------",
+"@@@@ooo-&-------",
+"@@XXooo---------",
+"@@+Xoo..........",
+"@@+XoO-@@@@@@@@@",
+"@@+Xoo---%%----%",
+"$@+Xoo---@@----@",
+"$@+XOo----------",
+"$@+Xoo----------",
+"@@XXoo---%%----%",
+"@@@@Xo---@@----@",
+
+"----..-%@@@@@@@@",
+"----..%%@@@@@@@@",
+"----..%%@@@@%@@@",
+"%%--.@%%@@@%%@@@",
+"@@--@@%%%%%%%@@@",
+"----@@%%%%%@%@@@",
+"--&-.@%%@@@@@@@@",
+"----..%%@@@@@@@@",
+"......%%@@@@@@@@",
+"@@@..@-%@@-@@@@@",
+"%--.@@@%@@@@@@@@",
+"@--.@@@@@@@@@@@@",
+"---.@@@@@@@@@-@@",
+"---.@@@@@@@@@@@@",
+"%--.@@@@@@-@@@@@",
+"@--.@@@@@@@@@@@@",
+
+"      ......-...",
+"      ......-...",
+"     o......-...",
+"      ..........",
+"      ..........",
+"      ..........",
+"      ......-...",
+"      ......-...",
+"@    o......-...",
+"@@@@@@......-...",
+"@@@@@@..........",
+"@@@@@@..........",
+"-@@-@@..........",
+"@@@@@@......-...",
+"@@@@@@......-...",
+"@@@@@@......-...",
+
+"...   @        *",
+"...   @ @@@    *",
+"...o  @ ...    *",
+"...   @        *",
+"...   @        *",
+"...   @        *",
+"...   @        *",
+"...   @        *",
+"...o  @        *",
+"...   @        *",
+"...@@@@        *",
+"...            *",
+"...            *",
+"...            *",
+"...            *",
+"...            *",
+
+"* ..@@@@@@.XXXXX",
+"* .-@@@@@@@.    ",
+"* ..@@@@@@@@....",
+"* ..@@@@@@@@@@@@",
+"* .-@@@@@@@@@@@@",
+"* ..@@@@@@@@@@@@",
+"* ...@@@@@@@@@@@",
+"* ....@@@@@@@@@@",
+"*  ...-...-..-..",
+"*   ............",
+"*    +++++++++++",
+"*      +++++++++",
+"*  +            ",
+"*               ",
+"*               ",
+"****************",
+
+"X       ...@@@@@",
+"       ...@@@@@@",
+".........@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@+++@@@@@@@@@@",
+"@@@+++@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+".-...-..-.@@@@@@",
+"...........@@==@",
+"++++++++...@@==@",
+"+++++++++..@@==@",
+"        ..X@@@@@",
+"        ..X@@@@@",
+"        ..@@@@@@",
+"*********.@@@@@@",
+
+"@@@@Xo-&--------",
+"@@XXoo----------",
+"@@+Xo...........",
+"@@+Xo-@@@@@@@@@@",
+"@@+Xo-----------",
+"@@XXo---%%----%%",
+"@@@@X---@@----@@",
+"@@@@X-&---------",
+"@@XXo-----------",
+"@@+Xo...........",
+"@@ X............",
+"@@   +++++++++++",
+"@@    ++++++++++",
+"@               ",
+"@               ",
+"****************",
+
+"-&-.@@@@@@@@@@@@",
+"---.@@@@@@-@@@@@",
+"....@@@@@@@@@@@@",
+"@@..@@@@@@@@@@@@",
+"--.@@@@@@@@@@@@@",
+"--.@@@@@@@@@@@@@",
+"--.@@@@@@@@@@@@@",
+"&-.@@@@@@@@@@@@@",
+"--+             ",
+".++           + ",
+"+++             ",
+"+++             ",
+"+++             ",
+"      +         ",
+"                ",
+"****************",
+
+"@    o......-...",
+"      ..........",
+"      ..........",
+"      ..........",
+"      ...@@@.@@@",
+"      .....@.@..",
+"      ....@@.@@@",
+"     o.....@.@.@",
+"      ...@@@.@@@",
+"      ..........",
+"  +   .-.-.-.-.-",
+"      .-.-.-.-.-",
+"      ..........",
+"                ",
+"      & & & & & ",
+"****************",
+
+"...o           *",
+"...            *",
+"...            *",
+"...            *",
+"...     +      *",
+"...            *",
+"...            *",
+"...o           *",
+"...            *",
+"...            *",
+".-.            *",
+".-.            *",
+"...            *",
+"               *",
+"& &            *",
+"****************",
+
+"                ",
+"                ",
+"       ---------",
+"******--=@@@@@--",
+"*    ---@@@@@---",
+"*   ----@@@@@---",
+"*  -----@@@@@---",
+"*  -----@@@@@---",
+"*  -----@%.@@---",
+"*  -@---@%.@@---",
+"*  @@---@@@@@--%",
+"*  @----@@@@@-%@",
+"*  -----@@@@@-@-",
+"*  -----@@@@@---",
+"*  -@---@@@@@---",
+"*  -----@@@@@---",
+
+" ---------------",
+"--&@@@@@@@@@@@@&",
+"--@@@@@@@@@@@@@@",
+"--@@@@@@@@@@@@@@",
+"--@@@@@@@@@@@@@@",
+"--@@@@@@@@@@@@@.",
+"--@@@@@@@@@@@@.X",
+"--@@@@@@@@@@@.XX",
+"--@@@@@@@@@@oXX@",
+"%-@@@@@@@@@ooO@@",
+"@-@@@@@@@@.oO@@@",
+"--@@@@@.@.XX@@@@",
+"--@@@@@@.XX@@@@@",
+"--@@@@@@XX@@@@@.",
+"--@@@@@.@@.@@@.X",
+"--@@@@@@@@@@@.XX",
+
+"                ",
+".               ",
+"@.              ",
+"@@.*************",
+".@@.            ",
+"XX@@.           ",
+"X@@@@.          ",
+"@@@@@.          ",
+"@@@@@.          ",
+"@@@@@.          ",
+"@@@@@.          ",
+"@@@@@.          ",
+".@@@@.          ",
+"XX@@@.          ",
+"X@@@@.          ",
+"@@@@@.+         ",
+
+"                ",
+"                ",
+"                ",
+"****************",
+"               *",
+"               *",
+"               *",
+"               *",
+"               *",
+"               *",
+"               *",
+"               *",
+" .  .  .  .  . *",
+".  .  .  .  .  *",
+" +  +  +  +  + *",
+"               *",
+
+"*  -@---@@@@@---",
+"*  -----@@@@@---",
+"*  -@---@@@@@---",
+"*  -----@@@@@---",
+"*  -@---@@@@@---",
+"*  -----@@@@@--%",
+"*  ----%.@@@@-%@",
+"*  ---%@@@@@@-@-",
+"*  --%@-@@@@@---",
+"*  -%@--@@@@@---",
+"*  %@---@@@@@---",
+"*  @---%.@@@@---",
+"*  ---%@@@@@@---",
+"*  --%@-@@@@@---",
+"*  -%@--@@@@@---",
+"*  %@---@@@@@---",
+
+"--@@@@@@@@@@oXX@",
+"--@@@@@@@@@ooO@@",
+"--@@@@@@@@.oO@@@",
+"--@@@@@.@.XX@@@@",
+"%-@@@@@@.XX@@@@@",
+"@-@@@@@@XX@@@@@.",
+"--@@@@@.@@.@@@.X",
+"--@@@@@@@@@@@.XX",
+"--@X@@@@@@@@oXX@",
+"--@@@@@@@@@ooO@@",
+"--@@@@@@@@.oO@@@",
+"--@@@@@.@.XX@@@@",
+"--@X@@@@.XX@@@@@",
+"--@@@@@@XX@@@@@.",
+"--@@@@@.@@.@@@.X",
+"%-@@@@@@@@@@@.XX",
+
+"@@@@@.++        ",
+"@@@@@.++        ",
+"@@@@@.++        ",
+"@@@@@.++        ",
+".@@@@.++        ",
+"XX@@@.++        ",
+"X@@@@.++        ",
+"@@@@@.++        ",
+"@@@@@.++   .  . ",
+"@@@@@.++  .  .  ",
+"@@@@@.++   +  + ",
+"@@@@@.++        ",
+".@@@@.++   .    ",
+"XX@@@.++  .     ",
+"X@@@@.++   +    ",
+"@@@@@.++        ",
+
+" .           . *",
+".           .  *",
+" +           + *",
+"               *",
+" .           . *",
+".           .  *",
+" +           + *",
+"               *",
+" .           . *",
+".           .  *",
+" +           + *",
+"               *",
+"             . *",
+"            .  *",
+"             + *",
+"               *",
+
+"*  @----@@@@@--%",
+"*  -----@@@@@-%@",
+"*  -----@@@@@-@-",
+"*  ---@-@@@@@---",
+"*  --@@-@%.%.---",
+"*  -@-@-@%.%.---",
+"*  @--@-@@@@@---",
+"*  --@@-@%.%.---",
+"*  -@-@-@@@@@---",
+"*  @--@-@%.%.---",
+"*  --@@-@@@@@-@-",
+"*  -@-@-@%.%.---",
+"*  @--@-@%.%.--@",
+"*  --@--@@@@@-@.",
+"*  -@---@@@@@@..",
+"*  @----@@@@@@@@",
+
+"@-@X@@@@@@@@oXX@",
+"--@@@@@@@@@ooO@@",
+"--@@@@@@@@.oO@@@",
+"--@@@@@.@.XX@@@@",
+"--@X@@@@.XX@@@@@",
+"--@@@@@@XX@@@@@@",
+"--@@@@@.@@.@@@@@",
+"--@@@@@@@@@@@@@@",
+"@-@@@@@@@@@@@@@@",
+"--&@@@@@@@@@@@@&",
+"-@..............",
+"@..............@",
+"..............@@",
+".............@@@",
+"............@@@@",
+"@@@@@@@@@@@@@@@@",
+
+"@@@@@.++   .    ",
+"@@@@@.++  .     ",
+"@@@@@.++   +    ",
+"@@@@@.++        ",
+"@@@@@.++   .    ",
+"@@@@.+++  .     ",
+"@@@.++++   +    ",
+"@@..++++        ",
+"@.@.++++   .  . ",
+".@@.++++  .  .  ",
+"@@@.++++   +  + ",
+"@@@.++++        ",
+"@@@.+...@@@$$@@@",
+"X@@.+...@@@$$@@@",
+"@@@.+...@@@$$@@@",
+"X@@.+..@@@@@@@@@",
+
+"             . *",
+"            .  *",
+"             + *",
+"               *",
+"             . *",
+"            .  *",
+"             + *",
+"               *",
+" .  .  .  .  . *",
+".  .  .  .  .  *",
+" +  +  +  +  + *",
+"               *",
+"@@@@@@@@@@@@   *",
+"@@@@@@@@@@@@   *",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+
+"*  -----@@@@@@@@",
+"*  -----@@.@@@@@",
+"*  -----@@@@@@@@",
+"*  -----@@.@@@@@",
+"*  -----@@@@@@@*",
+"*  -----@@.@@@*@",
+"*  -----=@@@@@@@",
+"*  -----........",
+"*  ----.........",
+"*  ---..........",
+"*  --....X..X...",
+"*  -............",
+"*   ++++++++++++",
+"*    +++++++++++",
+"*     ++++++++++",
+"****************",
+
+"@@@@@*@@@@@@@@@@",
+"@@*@*@@@@.@@@@@@",
+"@***@@@@@@@@@@@@",
+"***@@@@@@.@@@@@@",
+"@*@@@@@@@@@@@@@@",
+"@@@@@@@@@.@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"................",
+"................",
+"................",
+".........X...X..",
+"................",
+"++++++++++++++++",
+"+++++++++++++++$",
+"++++++++++++++++",
+"****************",
+
+"@@@.+.@@@@@@@@@@",
+"X@@..@@@@@@@@@@@",
+"@@@.+@@@@@@@@@@@",
+"X@@.+@@@@@@@@@@@",
+"@@@.+@@@@@@@@@@@",
+"X@@.+@@@@@@@@@@@",
+"@@=.+@@@@@@@@@@@",
+"....+@@@@@@@@@@@",
+"...++@@@@@@@@@@@",
+"..+++@@++@@@@@@@",
+".++++@@++@@@OO@$",
+"+++++@@++@@@OO@$",
+"+++++@@@@@@@OO@$",
+"++$++#  #  #  # ",
+"+++++           ",
+"****************",
+
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@   *",
+"@@@@@OO@@@@@ # *",
+"@@@@@OO@@@@@#  *",
+"@@@@@OO@@@@@   *",
+"@@@@@@@@@@@@   *",
+"@@@@@@@@@@@@ # *",
+"@@@@@@@@@@@@   *",
+"@@@@@@@@@@@@ # *",
+"$@@@@@@@@@@@   *",
+"$@@@@@@@@@@@## *",
+"$@@@@@@@@@@@   *",
+" # @@@@        *",
+"   @@@@  # #   *",
+"***@@@@*********",
+
+"X&&&&&&&&&&&&&&&",
+"X&XXXXXXXXXXXXXX",
+"X&##$###########",
+"X&#$###########$",
+"X&##$$##$#######",
+"X&$#$$#$########",
+"X&#$####&&&&&&&&",
+"X&#$###&&XXXXXXX",
+"X&####&&&.......",
+"X&###&&&&......@",
+"X&##&&+&&.....@.",
+"X&##&&+&&....@..",
+"X&##&&&&&.......",
+"X&##&&&&&.......",
+"X&##&+&+&...&&&&",
+"X&##&+&+&..&&...",
+
+"&&&&&&&&&&&&&&&&",
+"XXXXXXXXXXXXXXXX",
+"################",
+"###########$####",
+"#######$########",
+"#########@######",
+"&&&&&&&&@&&&&&&&",
+"XXXXXXX@XXXXXXXX",
+"@.....@........X",
+"...............X",
+"...............X",
+"...............X",
+"...............X",
+"...............X",
+"&&&&&&&&&&&&&&&&",
+"................",
+
+"&&&&&&&&&&&&&&&&",
+"XXXXXXXXXXXXXXX&",
+"#############$X&",
+"##############X&",
+"#@@@@@@@@@@@##X&",
+"#@@@@@@@@@@@##X&",
+"&X===@@@OOO@##X&",
+"&@===@@@OOO@##X&",
+"&@@@@@@@@@@@##X&",
+"&.@@@@@@   @##X&",
+"&.@@@@@@   @##X&",
+"&.@@@@@@@@@@##X&",
+"&.XX@@@@@@@@##X&",
+"&.XX@@@@@@@@##X&",
+"&&&&&@@@@@@@##X&",
+"....&@@@X@@@@@@@",
+
+"X&##&&&&&.&&&@@@",
+"X&$#&&+&&&&+&@@@",
+"X&##&&+&+&&+&@@@",
+"X&##&&&&+&&&&@@.",
+"X&##&+&&&&&&&@@.",
+"X&##&+&&&&+&&@@.",
+"X&##&&&+&&+&&@@.",
+"X&##&&&+&&&&&@@.",
+"X&##&+&&&+&&&@@.",
+"X&##&+&&&+&+&@@.",
+"X&##&&&&&&&+&@@.",
+"X&##&&&+&&&&&@@.",
+"X&$#&&&+&&&&&@@.",
+"X&##&+&&&&&&&@@.",
+"X&##&+&&&+&&&@@.",
+"X&##&&&+&+&&&@@.",
+
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"*******@.*****@@",
+"*******@.******@",
+"**.....@.**..***",
+"**@@@@@@.**@@.**",
+"**@@@@@@.**@@.**",
+"******@@.**@@.**",
+"******@@.**@@.**",
+"**....@@.**@@.**",
+"**@@@@@@.**@@.**",
+"**@@@@@@.**@@***",
+"**@@@@@@.******.",
+"**@@@@@@.*****.@",
+"..@@@@@@......@@",
+
+"@@@.&@@@@@@@@@@@",
+"@@@.&@@@@@@@@@@@",
+"@@@.&@@@@@@@@@@@",
+"@@@.&.@@@@@@##X&",
+"@@@.&.@@@@@@##X&",
+"@@@.&.@@@@@@##X&",
+"@@@.&.@@@@@@##X&",
+"@@@.&+++++++++X&",
+"@@@.&XXXXXXXX+X&",
+"@@@.&.......X+X&",
+"@@@.&..@X...X+X&",
+"@@@.&.....@.X+X&",
+"@@@.&....@..X+X&",
+"@@@.&...@...X+X&",
+"@@@.&..@....X+X&",
+"@@@.&.......X+X&",
+
+"X&##&&&+&&&&&@@@",
+"X&##&&&&&&+&&@@@",
+"X&##&+&&&&+&&&&&",
+"X&##&+&+&&&&&&&&",
+"X&##&&&+&&&&&&&&",
+"X&##&&&&&&&&&&&&",
+"X&##&+&&&&&&&XXX",
+"X&##&+&&&&&&X+.+",
+"X&##&&&&&&&X+.+.",
+"X&$#&&&&&&X+.+.+",
+"X&##&&&&&X+ + + ",
+"X&###$$$$$.....$",
+"X&####$$$$.....$",
+"X&##$##$$$.....$",
+"X&&&&&&&++.....+",
+"XXXXXXXXXX.....X",
+
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"&&&&&&&&&&&&&&&&",
+"&&&&&&&&&&&&&&&&",
+"&&&&&&&&&&&&&&&&",
+"&&&&&&&&&&&&&&&&",
+"XXXX&&&XXXXXXX&&",
+".+.&&&X+.+.+.&&&",
+"+.&&&X+.+.+.&&&.",
+".&&&X+.+.+.&&&X.",
+"&&&X+ + + &&&&&&",
+"$$$$.....$$$$$$$",
+"$$$$.....$$$$$$$",
+"$$$$.....$$$$$$$",
+"++++.....+++++++",
+"XXXX.....XXXXXXX",
+
+"@@@.&.......X&X&",
+"@@@.&.......X&X&",
+"&&&&&.......X&X&",
+"&&&&..@X@X..X&X&",
+"&&&...@X@X..X&X&",
+"&&..........X&X&",
+"&&&&&&&&&&&&&&X&",
+"&&&&&&&&&&&&&#X&",
+"&&.&&&&&&.&&$#X&",
+"&X.&XX&&X.&$$#X&",
+"&&&XX&&&&&$$$#X&",
+"$$$$$$$$$$$$$#X&",
+"$$$$$$$$$$$$$#X&",
+"$$$######$####X&",
+"+++&&&&&&&&&&&&&",
+"XXXXXXXXXXXXXXXX",
+
+"Xooooooooooooooo",
+"XoXXXXXXXXXXXXXX",
+"Xo##############",
+"Xo###X##########",
+"Xo@--######@#@##",
+"Xo@--#######@###",
+"Xo@--######@#@##",
+"Xo@--#####@####o",
+"Xo...##o@......O",
+"Xo####oo@......o",
+"Xo#X#oOo@......o",
+"Xo##oOoo@......O",
+"Xo#oOooo@..@X..o",
+"Xo#oooOo@..@X..o",
+"Xo#ooOoo@......O",
+"Xo#oOooo@......o",
+
+"oooooooooooooooo",
+"XXXXXXXXXXXXXXXX",
+"#######.##.#####",
+"######.##.######",
+"##oooooooooooooo",
+"#ooXXXXXXXXXXXXX",
+"oOo@@@@@@@@@@@@@",
+"Ooo@@@@@@@@@@@@@",
+"ooo@@.******@@.*",
+"oOo@@.*******@.*",
+"Ooo@@.**...**@.*",
+"ooo@@.**@@.**@.*",
+"oOo@@.**@@.**@.*",
+"Ooo@@.*******@.*",
+"ooo@@.******.@.*",
+"oOo@@.**....@@.*",
+
+"oooooooooooooooo",
+"XXXXXXXXXXXXXXXo",
+"##############Xo",
+"##############Xo",
+"oooooooooo####Xo",
+"XXXXXXXXXO####Xo",
+"@@@@@@@@XO####Xo",
+"@@@@@@@@XO####Xo",
+"****@@@@XO...@Xo",
+"*****@@@XO...@Xo",
+"*..***@@XO...@Xo",
+"*@@.**@@XO...@Xo",
+"*@@.**@@XO...@Xo",
+"*@@.**@@XO...@Xo",
+"*@@.**@@XO...@Xo",
+"*@@.**@@XO...@Xo",
+
+"Xo#oooOo@......o",
+"Xo#ooOoo@..@X..O",
+"Xo#oOooo@..@X..o",
+"Xo#oooOo@......o",
+"Xo#ooOoo@......O",
+"Xo#oOooo@......o",
+"Xo#oooOo@......o",
+"Xo#ooOoo@......O",
+"Xo#oOooo@......o",
+"Xo#oooOo@@@@@@@o",
+"Xo#ooOooOOOOOOOO",
+"Xo#oOooOOOOOOOOO",
+"Xo#oooOOOXOOXOOX",
+"Xo#ooOOOOOOOOOOO",
+"Xo#oOOOOOOOOOOOO",
+"Xo##$$$$$$$$$$$$",
+
+"Ooo@@.**@@@@@@.*",
+"ooo@@.**@@@@@@.*",
+"oOo@@.**@@@@@@.*",
+"Ooo@@.**@@@@@@.*",
+"ooo@@...@@@@@@..",
+"oOo@@@@@@@@@@@@@",
+"OooOOOOOOOOOOOOO",
+"ooOOOOOOOOOOOOOO",
+"oOOXOOXOOXOOXOOX",
+"OOOOOOOOOOOOOOOO",
+"OXOOXOOXOOOOOXOO",
+"OOOOOOOOXXXXXOOO",
+"OOXO%OOX....OOO%",
+"OOO@OOX....OOO@O",
+"OO@OOX....OOO@OO",
+"$$@.@......@.@@$",
+
+"*@@.**@@XO...@Xo",
+"*@@***@@XO...@Xo",
+"*****.@@XO...@Xo",
+"****.@@@XO...@Xo",
+"....@@@@XO...@Xo",
+"@@@@@@@@XO...@Xo",
+"OOOOOOOOOO...@Xo",
+"OOOOOOOOO....@Xo",
+"OOXOOXOO.....@Xo",
+"OOOOOOO@@@@@@@Xo",
+"XOOXOOOOOOOOOOXo",
+"OOOOOOOOOOOOO#Xo",
+"OXOOXOOXOOOO$#Xo",
+"OOOOOOOOOOO$$#Xo",
+"OOOOOOOOOO$$$#Xo",
+"$$$$$$$$$$$$$#Xo",
+
+"Xo###$$$$$$$$$$$",
+"Xo####$$$$$$$$..",
+"Xo###########@@@",
+"Xo##########@@@@",
+"Xo#########@@@@@",
+"Xo########@@@@##",
+"Xo####$###@@@@##",
+"Xo########@@@@@@",
+"Xo#$######@@@@@@",
+"Xo########@@@@@@",
+"Xo#####$##@@@@##",
+"Xo########@@@@##",
+"Xo#$######@@@@##",
+"Xo########@@@@##",
+"Xooooooooo@@@@oo",
+"XXXXXXXXXX@@@@XX",
+
+"$$@..........@$$",
+"................",
+"@...............",
+"@@..............",
+"@@@.............",
+"##@@@#########@@",
+"##@@@#########@@",
+"@@@@OO@@@@XX@@@@",
+"@@@@OO@@@@%&@@@@",
+"@@@@OO@@@@XX@@@@",
+"@@@@@@@@@@@@@@@@",
+"@XX@XX@XX@@@XX@@",
+"@%&@%&@%&@@@%&@@",
+"@XX@XX@XX@@@XX@@",
+"oooooooooooooooo",
+"XXXXXXXXXXXXXXXX",
+
+"$$$$$$$$$$$$$#Xo",
+"....$$$$$$$$$#Xo",
+".....$$$######Xo",
+"......$$######Xo",
+".......$#$####Xo",
+"####@@@@######Xo",
+"####@@@@####$#Xo",
+"OO@@@@@@######Xo",
+"OO@@@@@@##$###Xo",
+"OO@@@@@@######Xo",
+"@@##@@@@######Xo",
+"@@##@@@@######Xo",
+"@@##@@@@######Xo",
+"@@##@@@@#$####Xo",
+"oooo@@@@oooooooo",
+"XXXX@@@@XXXXXXXX",
+
+"$$$$$$$$$$$$$$$$",
+"$             # ",
+"$     ##        ",
+"$    $$         ",
+"$           #  #",
+"$   @@@@@@@@@@@@",
+"$ # @@@@@@@@@@@@",
+"$ # @@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@.@@.@@.@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+
+"$$$$$$$$$$$$$$$$",
+"@@@@@ #   #   # ",
+"@@@@@ $#      # ",
+"@@@@@           ",
+"@@@@@       # # ",
+"@@@@@      $$ #-",
+"@@@@@         -.",
+"@@@@@  #  #  -..",
+"@@@@@    $  -...",
+"@@@@@      -X...",
+"@.@@@      -...X",
+"@@@@@     -X..XX",
+"@@@@@    --X.XXX",
+"@@@@@ #  --..X.X",
+"@@@@@   -%-.X..X",
+"@@@@@   -%-.X.X.",
+
+"$$$$$$$$$$$$$$$$",
+"      --------- ",
+"    ---.......--",
+"  --............",
+"--..............",
+"......XXXXXXXX..",
+"....XX........XX",
+"..XX............",
+".X....XXXXXXX...",
+"X...XX.......XX.",
+"..XX...........X",
+"XX....XXXXXX....",
+"@..XXX......XX..",
+"..XX..........XX",
+".X..X.X.X.X.X...",
+"X...............",
+
+"$$$$$$$$$$$$$$$$",
+"               $",
+"-              $",
+".--            $",
+". .--          $",
+".....-         $",
+"......-   #    $",
+"XX.....-       $",
+"..XX...-       $",
+"...XX...-      $",
+"X...X...-    # $",
+".X..XX...-     $",
+"..XXXXX..-     $",
+"...X@XX..-     $",
+"X..XX..X..-    $",
+".X..X..X..-    $",
+
+"$   @@@@@@@@@@@@",
+"$   @@@@.@@.@@.@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$ # @@@@@@@@@@@@",
+"$ $ @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@.@@.@@.@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@.@@.@@.@",
+
+"@@@@@  .%%-.X.X.",
+"@.@@@ ..%%-...XX",
+"@@@@@X..%%-..X.X",
+"@@@@@@.%%%-..XX.",
+"@@@@@X%%%%-..XX.",
+"@@@@@%-%%%-..XX.",
+"@@@@@%%%%%-..XX.",
+"@@@@@%-%-%-..XX.",
+"@.@@@%-%%%-..XX.",
+"@@@@@%%%---..XX.",
+"@@@@@%-.---..XX@",
+"@@@@@%..-%-..XX.",
+"@@@@@X..---..XX.",
+"@@@@@@.----..XX.",
+"@@@@@X-%---..XX@",
+"@.@@@ -----..XX.",
+
+"XXXXXXXXXXXXXXXX",
+".@@.............",
+"................",
+"XXXXXXXXXXXXXXXX",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$$#$#$#$#$#$#$$",
+
+"XXX.X..X..-    $",
+"..X.X...X.-    $",
+"..X..X..X.-    $",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+#  $",
+"X@.X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X@.X.X..X.-+   $",
+
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$ # @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@.@@.@@.@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@.@@.@@.@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+
+"@@@@@ -----..XX.",
+"@@@@@ -----..XX.",
+"@@@@@ -----..XX@",
+"@@@@@ -----..XX.",
+"@@@@@ -.---..XX.",
+"@@@@@ ..---..XX.",
+"@.@@@X..---..XX.",
+"@@@@@@.----..XX.",
+"@@@@@X-----..XX.",
+"@@@@@ -----..XX.",
+"@@@@@ -----..X.X",
+"@@@@@ -----...XX",
+"@@@@@ -----.X.XX",
+"@.@@@ -----@X...",
+"@@@@@ ----@@X...",
+"@@@@@ ---@@@%XX.",
+
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"XXXXXXXXXXXXXXXX",
+"................",
+"XXXXXXXXXXXXXXXX",
+".X..............",
+"..XX.X.X.X.X.XXX",
+
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X@.X.X..X.-+  #$",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X..X.X..X.-+   $",
+"X.X..X..X.-+   $",
+"X.X.X...X.-+   $",
+"..X.X...X.-+#  $",
+"XXX.X..X.X-+   $",
+"XX.X...X.-++   $",
+"...XX.X..-++   $",
+
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@.@@.@@.@",
+"$    @@@@@@@@@@@",
+"$   # @@@@@@@@@@",
+"$     #@@@@@@@@@",
+"$       @@@@@@@@",
+"$ $$      # @@@@",
+"$   #    ## @@@@",
+"$   ##      @@@@",
+"$  $$       @@@@",
+"$  #        @@@@",
+"$           @@@@",
+"$$$$$$$$$$$$@@@@",
+
+"@@@@@ @-@@@@%XXX",
+"@@@@@@@@@@@@@%XX",
+"@@@@@ @@@X@@@-..",
+"@@@@@ X@@@@@@-XX",
+"@.@@@  @@@X@@@-X",
+"@@@@@   @@@@@.@-",
+"@@@@@   @@@@.@@@",
+"@@@@@    @@.@@@.",
+"@@@@@    #@@@@.@",
+"@@   #   ##@@.@@",
+"@@       $##@@@@",
+"@@        ###@@@",
+"@@        $ $ +@",
+"@@            + ",
+"@@ #        #  +",
+"@@$$$$$$$$$$$$$$",
+
+"X..XXXX.....XXX.",
+".XX...XXXXXX....",
+"..XX...........X",
+"X...XX.......XX.",
+"XX....XXXXXXX...",
+"X.XX............",
+"--..XX........XX",
+"@@--..XXXXXXXX..",
+"@@@@--.........-",
+"@@.@@@---------@",
+"@.@@@.@@........",
+".@@@.@@.@...X...",
+"@@@.@@.@.@.....+",
+".@.@@.@.@....+++",
+" ..........+++++",
+"$$$$$$$$$$$$$$$$",
+
+".XX@XXX.-+++   $",
+"XX.XXX..-+++   $",
+"X...X..-++++   $",
+"...XX.-+++$+   $",
+"..XX.-.++++ #  $",
+"XX..-..+$++    $",
+"...-..++++     $",
+".--..+++++   # $",
+"-%.++++++      $",
+"...++$++       $",
+"..+++++        $",
+"++++++         $",
+"+++$+          $",
+"$$++##  ##     $",
+"++++#   #      $",
+"$$$$$$$$$$$$$$$$",
+
+"$$$$$$$$$$$$$$$$",
+"$             # ",
+"$     ##        ",
+"$    $$         ",
+"$           #  #",
+"$   @@@@@@@@@@@@",
+"$ # @@@@@@@@@@@@",
+"$ # @@@@@@@@@@@@",
+"@@@@@@@@&&@@OO@@",
+"@@@@@@@@&&@@OO@@",
+"@@@@@@@@##@.@@.@",
+"@@@@@@@@##@==$$@",
+"@@@@@@@@@@@==$$@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@@**@%%##",
+
+"$$$$$$$$$$$$$$$$",
+"@@@@@ #   #   # ",
+"@@@@@ $#      # ",
+"@@@@@           ",
+"@@@@@       # # ",
+"@@@@@      $$ #-",
+"@@@@@         -.",
+"@@@@@  #  #  -..",
+"%%@@@    $  -..o",
+"%%@@@      -X.&.",
+"@.@@@      -...X",
+"++@@@     -X..XX",
+"++@@@    --X#XXX",
+"@@@@@ #  --..X.X",
+"@@@@@   -%-.X.&X",
+"@@@@@   -%-.X.X.",
+
+"$$$$$$$$$$$$$$$$",
+"      --------- ",
+"    --=.....oO--",
+"  --....O.O.....",
+"--....o...#....O",
+"......XXXXX&X#..",
+"..o&XX&.o.....XX",
+"*.XX..O.&.#..&.#",
+".X.o#OOXXXooX..=",
+"o..&XX.O.*...XX.",
+"..XX&..#.=.#...X",
+"XX.o.OXXXXXX..#.",
+"@#.XXX.#...&XX..",
+"..XX.........*XX",
+".X..X.X.X.X.X..O",
+"X......=........",
+
+"$$$$$$$$$$$$$$$$",
+"               $",
+"-              $",
+".--            $",
+". .--          $",
+".....-         $",
+".#....-   #    $",
+"XX..&..-       $",
+".&XXO..-       $",
+"...XXO..-      $",
+"X.&#X...-    # $",
+"oo..#X.#.-     $",
+"o.XXXXo..-     $",
+"&..X@XX..-     $",
+"X.oXX#.X.#-    $",
+".X.*X..X..-    $",
+
+"$   @@@@@**@%%##",
+"$   @@@@.@@.@@.@",
+"$   @@@@@&&@@XX@",
+"$   @@@@@&&@@XX@",
+"$ # @@@@@@@@@@@@",
+"$ $ @@@@@@@@@@@@",
+"$   @@@@@**@@$$@",
+"$   @@@@@**@@$$@",
+"$   @@@@.@@.@@.@",
+"$   @@@@==++@  &",
+"$   @@@@==++@  &",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@..@@@@$$",
+"$   @@@@..@@@@$$",
+"$   @@@@.@@.@@%%",
+
+"@@@@@  .%%-.#.o.",
+"@.@@@ ..%%-...*X",
+"@@@@@X..%%-..X.X",
+"@@@@@@.%%%-.oXX.",
+"@@@@@X%%%%-..XX.",
+"@@@@@%-%%%-..XX.",
+"@@@@@%%%%%-.*XX.",
+"@@@@@%-%-%-..XX.",
+"@.@@@%-%%%-..#X.",
+"&@@@@%%%---..XX.",
+"&@@@@%-.---*.XX@",
+"@@@@@%..-%-.oXX.",
+"@@@@@X..---..XX.",
+"@@@@@@.----..Xo.",
+"@@@@@X-%---..XX@",
+"@.@@@ -----..XX.",
+
+"XXXXXXXXXXXXXXXX",
+".@@.............",
+"O.....O.........",
+"XXXXXXXXXXXXXXXX",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$$#$#$#$#$#$#$$",
+
+"XXX.o..*..-    $",
+"..X.X..oX.-    $",
+"..X..O..X.-    $",
+"X..X.X..&.-+   $",
+"XOOX.X.OX.-+   $",
+"X..XoX.oX.-+   $",
+"X..XoX.&X.-+   $",
+"X..X.X#.X.-+   $",
+"X..X#o..X*-+   $",
+"X..X#X..X.-+   $",
+"X..X.#..X.-+#  $",
+"X@.o.X*.O.-+   $",
+"X..X.X=oX.-+   $",
+"X..=.X#.X.-+   $",
+"X..X.X..X.-+   $",
+"X@.X.Xo.&.-+   $",
+
+"$   @@@@@@  @@%%",
+"$   @@@@@@  @@@@",
+"$   @@@@@@@@@@@@",
+"$ # @@@@@@@@@@@@",
+"$   @@@@##@**@@=",
+"$   @@@@##@**@@=",
+"$   @@@@.@@.@@.@",
+"$   @@@@@@@@@@##",
+"$   @@@@@@@@@@##",
+"$   @@@@@@@@@@@@",
+"$   @@@@@@@@@@@@",
+"$   @@@@&&@@@$$+",
+"$   @@@@&&@@@$$+",
+"$   @@@@.@@.@@.@",
+"$   @@@@%%@==@@@",
+"$   @@@@%%@==@@@",
+
+"@@@@@ -----..XX.",
+"@@@@@ -----..oX.",
+"@@@@@ -----..XX@",
+"@@@@@ -----..XX.",
+"=@@@@ -.---.#XX.",
+"=@@@@ ..---..XX.",
+"@.@@@X..---.*X&.",
+"@@@@@@.----..XX.",
+"@@@@@X-----..XX.",
+"@@@@@ -----.O&*.",
+"@@@@@ -----..X.X",
+"+@@@@ -----...XX",
+"+@@@@ -----.X.XX",
+"@.@@@ -----@Xooo",
+"@@@@@ ----@@X..*",
+"@@@@@ ---@@@%XX.",
+
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"XXXXXXXXXXXXXXXX",
+"................",
+"XXXXXXXXXXXXXXXX",
+".X.#.O........*.",
+"..XX.X.X.X.X.XXX",
+
+"X..XoO.#X.-+   $",
+"XO=XoXOOX.-+   $",
+"X..X.Xo.O*-+   $",
+"X@.X.#.oX.-+  #$",
+"X..X.X..o.-+   $",
+"X..X.*.#Xo-+   $",
+"X.OX.X..X.-+   $",
+"X..X.X*.X.-+   $",
+"X..X*Xo=X.-+   $",
+"X..X.X..o.-+   $",
+"X.X.#Xo.X.-+   $",
+"X.X.X.#.X.-+   $",
+"..X.Xo..o.-+#  $",
+"XXX.O.&X.X-+   $",
+"XX.Xo..X.-++   $",
+"..=XXoX..-++   $",
+
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@**@@@@@@@XX@@$",
+"@@**@@@@@@@XX@@$",
+"@@@@@@@@.@@.@@.@",
+"$    @@@@@@@@@@=",
+"$   # @@@@@@@@@=",
+"$     #@@@@@@@@@",
+"$       @@@@@@@@",
+"$ $$      # @@@@",
+"$   #    ## @@@@",
+"$   ##      @@@@",
+"$  $$       @@##",
+"$  #        @@##",
+"$           @@@@",
+"$$$$$$$$$$$$@@@@",
+
+"@@@@@ @-@@@@%XXX",
+"@@@@@@@@@@@@@%XX",
+"$@@@@ @@@X@@@-..",
+"$@@@@ X@@@@@@-XX",
+"@.@@@  @@@X@@@-X",
+"=@@@@   @@@@@.@-",
+"=@@@@   @@@@.@@@",
+"@@@@@    @@.@@@.",
+"@@@@@    #@@@@.@",
+"@@   #   ##@@.@@",
+"@@       $##@@@@",
+"@@        ###@@@",
+"@@        $ $ +@",
+"@@            + ",
+"@@ #        #  +",
+"@@$$$$$$$$$$$$$$",
+
+"X#*XXXX*....XXX.",
+".=X.=.oXXXXX.*..",
+".oXX...O..&.##.=",
+"X..oo=..O....XX.",
+"XX.o..XX#XX&X...",
+"X.XX..*o.O.=.O..",
+"--..XX....o.o.OX",
+"@@--..XX*XXX#XOO",
+"@@@@--.........-",
+"@@.@@@---------@",
+"@.@@@.@@........",
+".@@@.@@.@...X...",
+"@@@.@@.@.@.....+",
+".@.@@.@.@....+++",
+" ..........+++++",
+"$$$$$$$$$$$$$$$$",
+
+".XXooXX.-+++   $",
+"*X=XXX..-+++   $",
+"X.o.X..-++++   $",
+"..OXX.-+++$+   $",
+"o.XX.-.++++ #  $",
+"OX..-..+$++    $",
+"...-..++++     $",
+".--..+++++   # $",
+"-%.++++++      $",
+"...++$++       $",
+"..+++++        $",
+"++++++         $",
+"+++$+          $",
+"$$++##  ##     $",
+"++++#   #      $",
+"$$$$$$$$$$$$$$$$",
+
+"X***************",
+"X*XXXXXXXXXXXXXX",
+"X*         +    ",
+"X* +            ",
+"X*     -*.......",
+"X*    --........",
+"X*   ---.@X.....",
+"X*  ----.@X.....",
+"X* -----........",
+"X* -@---........",
+"X* -----........",
+"X* -----.......%",
+"X* -@---......%%",
+"X* -----.....%-%",
+"X* -----.....%%%",
+"X* -@---....%%%%",
+
+"***********%%%&%",
+"XXXXXXXXX%%@@@@@",
+"        %@.X.X.X",
+"       %@.X.X.X.",
+"......%@.X.X.X.X",
+"......%.X.X.X.X.",
+".....%@X.X.X.X.X",
+".....%X.X.X.X.X.",
+"....-%.X.X.X.X.X",
+"..%%-&X.X.X.X.X.",
+"%%%%-%.X.X.X.X.X",
+"%%%%-%X.X.X.X.X.",
+"%%%%-%@X.X.X.X.X",
+"%%%%--%.X.X.X.X.",
+"%%%---%@.X.X.X.X",
+"%%%----%@.X.X.X.",
+
+"%%**************",
+"@@%%XXXXXXXXXXXX",
+".X.@%          %",
+"X.X.@%        %@",
+".X.X.@%......%@.",
+"X.X.X.%......%.X",
+".X.X.X@%....%@X.",
+"X.X.X.@%....%X.X",
+".X.X.X@%...-%.X.",
+"X.X.X.@&.%%-&X.X",
+".X.X.X@%-%%-%.X.",
+"X.X.X.@%-%%-%X.X",
+".X.X.X@%-%%-%@X.",
+"X.X.X.%--%%--%.X",
+".X.X.@%-%%---%@.",
+"X.X..%-%%%----%@",
+
+"**%%%&%%%*******",
+"%%@@@@@@@%%XXXX*",
+"@.X.X.X.X.@%  X*",
+".X.X.X.X.X.@% X*",
+"X.X.X.X.X.X.@%X*",
+".X.X.X.X.X.X.%X*",
+"X.X.X.X.X.X.X@%*",
+".X.X.X.X.X.X.@%*",
+"X.X.X.X.X.X.X@%*",
+".X.X.X.X.X.X.@&*",
+"X.X.X.X.X.X.X@%*",
+".X.X.X.X.X.X.@%*",
+"X.X.X.X.X.X.X@%*",
+".X.X.X.X.X.X.%X*",
+"X.X.X.X.X.X.@%X*",
+".X.X.X.X.X..% X*",
+
+"X* -----....%%%%",
+"X* -----....%%%%",
+"X* -@---....%-%%",
+"X* -----....%%--",
+"X* -----....%---",
+"X* -@---....----",
+"X* -----.....--@",
+"X* -----.....---",
+"X* -@---......--",
+"X* -----.......-",
+"X* -----........",
+"X* -@---.@X.....",
+"X* -----.@X.....",
+"X* -----........",
+"X* -@---.......-",
+"X* -----*......-",
+
+"%%------%@.X.X.X",
+"%--------%%@X.X.",
+"---------@@%%%&%",
+"--------@@@@@@@@",
+"------@@@@@@@@@@",
+"-----@@@@@@@@@@.",
+"----@@@@@@@@@@..",
+"---@@@@@@@@@@@..",
+"---@@@@@@@.@@...",
+"--@@.@@@@@@@....",
+"-@@@@@@@@@@.....",
+"..@@@@@@@.......",
+"................",
+"....X.X.X.......",
+"----------------",
+"@@@@@@@@@@@@@@@@",
+
+".X.@%-%%%------%",
+"X@%%-%%%--------",
+"%%.--%%---------",
+"@..-%----------@",
+"...%---------@@@",
+"...---------@@@@",
+"....--@----@@@@@",
+"....------@@@@@@",
+".....-----@@@@@@",
+"......---@@.@@@@",
+".......-@@@@@@@@",
+".........@@@@@@@",
+"................",
+"................",
+"--..............",
+"@-..............",
+
+"@.X.X.X.X.@%  X*",
+"%%@X.X.X@%%   X*",
+"@@%%%&%%%..   X*",
+"@@@@@@@@...   X*",
+"@@@@@@@....+  X*",
+"@@@@@@.....+  X*",
+"@@@@@......+  X*",
+"@@@@@......+  X*",
+"@.@@.......+  X*",
+"@@@........+  X*",
+"@@.........+  X*",
+"...........+  X*",
+"........@X.+  X*",
+"........@X.+  X*",
+"...........+  X*",
+"..........*+ +X*",
+
+"X* ----@@@@@@@@-",
+"X* -@-@@@@@@@@@-",
+"X* --@@@@@@@@@@-",
+"X* -@@@@@@@@@@--",
+"X* @@@@@@@@@@-@-",
+"X*  ++++++++-@--",
+"X*   +++++++@-@-",
+"X*    ++++++-@--",
+"X*     +++++@---",
+"X*      ++++----",
+"X*          -@--",
+"X*          ----",
+"X*          -@--",
+"X*     +    ----",
+"X*          -@--",
+"X*   #$     ----",
+
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@...@@@@@...@@",
+"@@.@@@..@..@@@.@",
+"@@.@@@@@.@@@@@.@",
+"@@*@@@@*@.@@@@.@",
+"@@@.@@.@@@.@@.@@",
+"@@@.@.@@&@@.@.@@",
+"@@@@.@@&&=@@.@@@",
+"@@@.@.@@=@@.@.@@",
+"@@@.@@.@@@.@@.@@",
+"@@.@@@@.@*@@@@*@",
+"@@.@@@@@.@@@@@.@",
+"@@.@@@..@..@@@.@",
+"@@@...@@@@@...@@",
+"@@@@@@@@@@@@@@@@",
+
+"@-@@.@.@.@@@@@@@",
+"@-@@@@@@@@@@@@@@",
+"@-..............",
+"@-..............",
+"@-.........*....",
+"@-........*.....",
+"@-.......*......",
+"@-......*.......",
+"@-.....*........",
+"@-....*****.....",
+"@-...*****......",
+"@-......*.......",
+"@-.....*.....@@@",
+"@-....*......@@@",
+"@-...*..........",
+"@-..*........@@@",
+
+"@@@@@@@@@@@+  X*",
+"@@@@@@@@@@++  X*",
+"......@@@+++  X*",
+"......@@++++  X*",
+"......@+++++  X*",
+"......++++++  X*",
+"......++++++  X*",
+"......++++++  X*",
+"......++++++  X*",
+"......++++++  X*",
+"......+       X*",
+"......+       X*",
+"@@@@.++     + X*",
+"@@@.+++       X*",
+"...@@@@--==-----",
+"@@@@@@@--==-----",
+
+"X*   $$     -@--",
+"X*  +       ----",
+"X* +        -@-@",
+"X*       #$ ---.",
+"X*       $$ -@-.",
+"X*      +   --@@",
+"X*     +    -@@@",
+"X*     #$   @@@@",
+"X*     $$    +++",
+"X*    +       ++",
+"X*   +         +",
+"X*              ",
+"X*         +    ",
+"X*              ",
+"X***************",
+"XXXXXXXXXXXXXXXX",
+
+"@@@@@@@@@@@@@@@@",
+"@.@.@.@.@.@.@.@.",
+".@.@.@.@.@.@.@.@",
+"................",
+"................",
+"@@@@@@@@@@@@@@@@",
+".@.@.@.@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"++++++++++++++++",
+"++++++++++++++++",
+"++++++++++++++++",
+"++++++++++++++++",
+"                ",
+"                ",
+"****************",
+"XXXXXXXXXXXXXXXX",
+
+"@-...........@@@",
+"@............@@@",
+".............@@@",
+".............@--",
+".............@--",
+"@@@@@@@@@@@@.@--",
+"@@@.@.@@.@@.@@--",
+"@@@@@@@@@@.@@@--",
+"++++++++++@@@$#-",
+"++++++++++@@@$#-",
+"++++++++++@@@@--",
+"++++++++++++++  ",
+"                ",
+"+               ",
+"****************",
+"XXXXXXXXXXXXXXXX",
+
+"@@@@@@@---------",
+"@@@@@@@---------",
+"@@@@@@@---------",
+"----------------",
+"------------- X*",
+"------------- X*",
+"------------- X*",
+"------------- X*",
+"OO----------- X*",
+"OO----------- X*",
+"------------- X*",
+"              X*",
+"       -%-%   X*",
+"      %%-%+   X*",
+"****************",
+"XXXXXXXXXXXXXXXX",
+
+"&&&&&&&&&&&&&&&&",
+"&&.............&",
+"&.&@@@@@@@@@@@.&",
+"&.@&@@@@@@@@@*.&",
+"&.@@&@@@@@@@*@.&",
+"&.@@@&@@*@@*@@.&",
+"&.@@@@&**@*@@@.&",
+"&.@@@@*&**@@@@.&",
+"&.@@@***&@@@@@.&",
+"&.@@*@**@&@@@@.&",
+"&.@*@@*@@@&@@@.&",
+"&.*@@@@@@@@&@@.&",
+"&.@@@@@@@@@@&@.&",
+"&.@@@@@@@@@@@&.&",
+"&.............&&",
+"&&&&&&&&&&&&&&&&",
+
+"oo.........@oooo",
+"o....%....@ooooo",
+"....%....@oooooo",
+"...%....@oooooOo",
+"..%....@oooooooo",
+"......@oOOoooooo",
+".....@OOOOoooooo",
+"....@OOOOOoooooo",
+"...@OOOOOOoooooo",
+"..@OOOOOOOooOooo",
+".@OOOOOOOOoooooo",
+"@OOOOOOOoooooooo",
+"OOOOOOoooOoooooo",
+"OOOOoooooooooOoo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+
+"oooooooooooooooo",
+"ooooooooOooooooo",
+"ooOooooooooooooo",
+"ooooooooooooooo@",
+"oooooooooooOoo.@",
+"ooooooOoooooo..@",
+"oooooooooooo...@",
+"ooooOoooooo....@",
+"oooooooooo.....@",
+"ooooooooo......@",
+"ooOooooo....%..@",
+"ooooooo....%...@",
+"oooooo....%....@",
+"ooooo....%....@o",
+"oooo.........@oo",
+"ooo.........@ooo",
+
+"oo@@@@@@@@@-oooo",
+"o@@@@@@@@@-ooooo",
+"@.@@@@@.@-ooXXoo",
+"@@@@@@@@-.......",
+"@@@@@@@-........",
+"@@@@@@-.........",
+"@@@@@-..........",
+"@@@@-.....%%%%..",
+"@.@-............",
+"@@-.............",
+"@-..............",
+"-...............",
+"OOOOXXOOOOOOXXOO",
+"OOOXXOOOOOOXXOOO",
+"oooooOOooooooOOo",
+"oooooooooooooooo",
+
+"ooooooooOooooooo",
+"oooooooooooooooo",
+"oooOoooooooooooo",
+"ooooooooooooooo-",
+"oooooooooooOoo@-",
+"ooooooOoooooo@@-",
+"oooooooooooo@.@-",
+"ooooOoooooo@@@@-",
+"oooooooooo@@@@@-",
+"ooooooooo@@@@@@-",
+"ooOooooo@@@@@@@-",
+"ooooooo@@@@@@@@-",
+"oooooo@.@@@@@.@-",
+"ooooo@@@@@@@@@-o",
+"oooo@@@@@@@@@-oo",
+"ooo@@@@@@@@@-ooo",
+
+"****************",
+"                ",
+"                ",
+"                ",
+"          XXX   ",
+"       . X..    ",
+"      . X       ",
+"     . X -      ",
+"    . XX        ",
+"     +XX +      ",
+"      X +       ",
+"   o   +  o     ",
+"................",
+"................",
+"................",
+"................",
+
+"****************",
+"                ",
+"                ",
+"                ",
+"                ",
+"       .        ",
+"     XXXXX      ",
+"    X.....X     ",
+"   X.  -   X    ",
+"     +          ",
+"      +         ",
+"   o +++++o     ",
+"................",
+"................",
+"................",
+"................",
+
+"****************",
+"                ",
+"                ",
+"                ",
+"  XXX           ",
+"  ...X .        ",
+"     .X         ",
+"     -.X        ",
+"    .  .X       ",
+"     + .X       ",
+"     ++.X       ",
+"   o   +  o     ",
+"................",
+"................",
+"................",
+"................",
+
+"****************",
+"    X           ",
+"    .X          ",
+"     .X         ",
+"     .X         ",
+"    -.X.        ",
+"     .X         ",
+"     .X         ",
+"    .X +        ",
+"    X+ +        ",
+"      ++        ",
+"   o   +  o     ",
+"................",
+"................",
+"................",
+"................",
+
+"********X*******",
+"       .X       ",
+"       .X       ",
+"     - X        ",
+"      X         ",
+"   XXX .        ",
+"  XXX .         ",
+"     .          ",
+"    .    +      ",
+"     +   +      ",
+"      + +       ",
+"   o   +  o     ",
+"................",
+"................",
+"................",
+"................",
+
+"****************",
+"                ",
+"   X       X    ",
+"   XX  -  XX    ",
+"    XXXXXXX     ",
+"     XX.XX      ",
+"      .         ",
+"     .          ",
+"    .           ",
+"     +          ",
+"      +         ",
+"   o +++++o     ",
+"................",
+"................",
+"................",
+"................",
+
+"******X*********",
+"      X.        ",
+"      X.        ",
+"      XX.-      ",
+"       XX.      ",
+"       .XX...   ",
+"      .  XXXX   ",
+"     .          ",
+"    .           ",
+"     ++         ",
+"      +         ",
+"   o   +  o     ",
+"................",
+"................",
+"................",
+"................",
+
+"****************",
+"          X     ",
+"         X.     ",
+"        X.      ",
+"        X.      ",
+"       .X.-     ",
+"      . X.      ",
+"     .  X.      ",
+"    .   +X.     ",
+"     + +  X     ",
+"      ++        ",
+"   o   +  o     ",
+"................",
+"................",
+"................",
+"................",
+
+"$$$$$$@@$$$$$$$$",
+"$#####@@#######$",
+"$#####@@#######$",
+"$#####@@#######$",
+"$#####@@%#%####$",
+"$#####@%###%###$",
+"$####@@@@%##%##$",
+"$###-oooo@#%###$",
+"@@@@-oo%o@@@@@@@",
+"@@@@-oooo@@@@@@@",
+"$##@-oooo@@####$",
+"$###@....@#####$",
+"$####@@@@######$",
+"$#####@@#######$",
+"$#####@@#######$",
+"$$$$$$@@$$$$$$$$",
+
+"$$$$$$@@$$$$$$$$",
+"$#####@@#######$",
+"$#####@@#######$",
+"$#####@@#%#####$",
+"$#####@@##%####$",
+"$#####@%##%####$",
+"$####@@@@###%##$",
+"$###-ooo%@#%###$",
+"@@@@-ooXo@%@@@@@",
+"@@@@-oooo@@@@@@@",
+"$##@-oooo@@####$",
+"$###@....@#####$",
+"$####@@@@######$",
+"$#####@@#######$",
+"$#####@@#######$",
+"$$$$$$@@$$$$$$$$",
+
+"$$$$$$@@$$$$$$$$",
+"$#####@@#######$",
+"$#####@@#######$",
+"$#####@@#%#####$",
+"$#####@@%#%####$",
+"$#####@@###%###$",
+"$####@@@@%#####$",
+"$###-oooo@#%###$",
+"@@@@-oo%o@%@@@@@",
+"@@@@-oooo@@@@@@@",
+"$##@-oooo@@####$",
+"$###@....@#####$",
+"$####@@@@######$",
+"$#####@@#######$",
+"$#####@@#######$",
+"$$$$$$@@$$$$$$$$",
+
+"$$$$$$@@$$$$$$$$",
+"$#####@@#######$",
+"$#####@@#######$",
+"$#####@@#%#####$",
+"$#####@@%######$",
+"$#####@%##%%###$",
+"$####@@@@###%##$",
+"$###-ooo%@#####$",
+"@@@@-oo%o@%@@@@@",
+"@@@@-oooo@@@@@@@",
+"$##@-oooo@@####$",
+"$###@....@#####$",
+"$####@@@@######$",
+"$#####@@#######$",
+"$#####@@#######$",
+"$$$$$$@@$$$$$$$$",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"          XXX   ",
+"       . X..    ",
+"      . X       ",
+"     . X -      ",
+"    . XX        ",
+"     +XX +      ",
+"      X +       ",
+"   o   +  o     ",
+"................",
+"................",
+"................",
+"................",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"       .        ",
+"     XXXXX      ",
+"    X.....X     ",
+"   X.  -   X    ",
+"     +          ",
+"      +         ",
+"   o +++++o     ",
+"................",
+"................",
+"................",
+"................",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"  XXX           ",
+"  ...X .        ",
+"     .X         ",
+"     -.X        ",
+"    .  .X       ",
+"     + .X       ",
+"     ++.X       ",
+"   o   +  o     ",
+"................",
+"................",
+"................",
+"................",
+
+"                ",
+"    X           ",
+"    .X          ",
+"     .X         ",
+"     .X         ",
+"    -.X.        ",
+"     .X         ",
+"     .X         ",
+"    .X +        ",
+"    X+ +        ",
+"      ++        ",
+"   o   +  o     ",
+"................",
+"................",
+"................",
+"................",
+
+"      X         ",
+"       .X       ",
+"       .X       ",
+"     - X        ",
+"      X         ",
+"   XXX .        ",
+"  XXX .         ",
+"     .          ",
+"    .    +      ",
+"     +   +      ",
+"      + +       ",
+"   o   +  o     ",
+"................",
+"................",
+"................",
+"................",
+
+"                ",
+"                ",
+"   X       X    ",
+"   XX  -  XX    ",
+"    XXXXXXX     ",
+"     XX.XX      ",
+"      .         ",
+"     .          ",
+"    .           ",
+"     +          ",
+"      +         ",
+"   o +++++o     ",
+"................",
+"................",
+"................",
+"................",
+
+"      X         ",
+"      X.        ",
+"      X.        ",
+"      XX.-      ",
+"       XX.      ",
+"       .XX...   ",
+"      .  XXXX   ",
+"     .          ",
+"    .           ",
+"     ++         ",
+"      +         ",
+"   o   +  o     ",
+"................",
+"................",
+"................",
+"................",
+
+"                ",
+"          X     ",
+"         X.     ",
+"        X.      ",
+"        X.      ",
+"       .X.-     ",
+"      . X.      ",
+"     .  X.      ",
+"    .   +X.     ",
+"     + +  X     ",
+"      ++        ",
+"   o   +  o     ",
+"................",
+"................",
+"................",
+"................",
+
+"****************",
+"*      %&       ",
+"*     %-@       ",
+"*  ++%-@. ++++  ",
+"* -+%-@. -+%#+  ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....+ -....%&",
+"*  +++++  +++%-@",
+"*  ++++   ++%-@.",
+"* -+%#+  -+%-@. ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....+ -....+ ",
+
+"****************",
+"*               ",
+"*     %#        ",
+"*  ++%-@  ++%#  ",
+"* -+%-@. -+%-@  ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....+ -....+ ",
+"*  +++++  +++%# ",
+"*  ++++   ++%-@ ",
+"* -+%#+  -+%-@. ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....+ -....+ ",
+
+"****************",
+"*               ",
+"*            %# ",
+"*  ++%#   ++%-@ ",
+"* -+%-@  -+%-@. ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....+ -....+ ",
+"*  +++++  +++++ ",
+"*  ++%#   ++%#  ",
+"* -+%-@  -+%-@  ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....+ -....+ ",
+
+"****************",
+"*             %&",
+"*            %-@",
+"*  ++++   ++%-@.",
+"* -+%#+  -+%-@. ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....+ -....+ ",
+"*  +++%#  +++++ ",
+"*  ++%-@  ++++  ",
+"* -+%-@. -+%#+  ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....+ -....+ ",
+
+"****************",
+"*             %&",
+"*            %-@",
+"*  ++++   ++%-@.",
+"* -+%#+  -+%-@. ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....%&-....+ ",
+"*  +++%-@ +++++ ",
+"*  ++%-@. ++++  ",
+"* -+%-@. -+%#+  ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....+ -....+ ",
+
+"****************",
+"*               ",
+"*            %# ",
+"*  ++%#   ++%-@ ",
+"* -+%-@  -+%-@. ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....%&-....+ ",
+"*  +++%-@ +++++ ",
+"*  ++%-@. ++%#  ",
+"* -+%-@. -+%-@. ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....+ -....+ ",
+
+"****************",
+"*               ",
+"*     %#        ",
+"*  ++%-@  ++%#  ",
+"* -+%-@. -+%-@  ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....+ -....+ ",
+"*  +++%#  +++%# ",
+"*  ++%-@  ++%-@ ",
+"* -+%-@. -+%-@. ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....+ -....+ ",
+
+"****************",
+"*      %&       ",
+"*     %-@       ",
+"*  ++%-@. ++++  ",
+"* -+%-@. -+%#+  ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....+ -....%&",
+"*  +++++  +++%-@",
+"*  ++%#   ++%-@.",
+"* -+%-@  -+%-@. ",
+"* -+-@.+ -+-@.+ ",
+"* -+X.X+ -+X.X+ ",
+"* -+++++ -+++++ ",
+"* -....+ -....+ ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"      &.&       ",
+"      .&.       ",
+"      &.&       ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"     & . &      ",
+"      .&..      ",
+"      &*&       ",
+"      .&&       ",
+"     & . &      ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"        .       ",
+"                ",
+"    &&     & &  ",
+"     &&&=&&     ",
+"   .  ***.&     ",
+"     &*.*&   .  ",
+"     =***=&     ",
+"     & & & &    ",
+"    .&& &       ",
+"    &           ",
+"    &     .     ",
+"                ",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"   + +  .   &&  ",
+" &   .&   &&&   ",
+"  &&&=**=&&& &  ",
+"   &=**+*=& .   ",
+"   &*&**&*&     ",
+"  &=*&*&**=&+.  ",
+"    =*****&     ",
+"+.=& ==&=&&&&   ",
+"  &&&&&=&&  &&  ",
+"  &&&& &&    &  ",
+"  & &&+   .     ",
+"  & &           ",
+"       .        ",
+"                ",
+
+"&               ",
+" &      & & & & ",
+"  &+ &  .   && &",
+" &&& .& X & &   ",
+"  &&&&*+ = & &  ",
+"   &=++= ++ .X  ",
+"   &+=   =&+ .  ",
+"&&& += = +*+&&& ",
+"   =+ *+= ++  & ",
+"+.X =++ =+=     ",
+"& &&  & &&  &   ",
+"  && & &&    &  ",
+" && &&+ X .   & ",
+" && &         & ",
+"&      .        ",
+"                ",
+
+"&               ",
+" &   +  & & & & ",
+"  &+ &  .   && &",
+" &  X.& X+&  . +",
+"  &+ &*   .& &  ",
+" +   +++X +   + ",
+"    X       +   ",
+"&&& ++ X +*X &  ",
+"    + *++ ++  & ",
+"+. X+++ ++   +  ",
+"& &   & &X X&   ",
+"  &X & && .  &  ",
+"    &&+  X. X & ",
+" && &     X   + ",
+"&      .+   +   ",
+"                ",
+
+"X       X       ",
+" &X  +    ++ +  ",
+"   + X X. X   X&",
+"  X  +.X +.X+  +",
+"   . X + XX  X  ",
+" ++ + +X . +.   ",
+"   X+. + X. +X+ ",
+" & X+X+  + + &  ",
+"    + X. X +    ",
+" .X+X++ +  X +. ",
+" +   X  & X &   ",
+"  & + . X X  +  ",
+"   .  +X ..+  & ",
+"  & &. .  X  X+ ",
+"&    X X+.  +   ",
+"                ",
+
+"  XX X  XX      ",
+"   +    X   X  X",
+"   X X++ X+X  X ",
+"  X+X  ++X+     ",
+" X X  XX ++X  X+",
+"XX X X + X X++  ",
+" X  X+ X       X",
+"X   X   X    +  ",
+"++XX XX  +XX  XX",
+"+ X+X  X X ++  X",
+"+     XX   +  X ",
+"    XX   X X   X",
+" X       X    XX",
+"X   X  X    X   ",
+"  XXXX   XX  X  ",
+"    X       XX  ",
+
+" XXXXXXXXXXXXXXX",
+"-X%X%X%%%%%%%%%X",
+"-%X%XX%%%%%%%%%X",
+"-%%X%X%%%%%%%X%X",
+"-%X%XX%%%%%%%%%X",
+"-X%X%X%%%%%%%%%X",
+"-%X%XX%%%%%%%X%X",
+"-%%X%X%%%%%%%%%X",
+"-%X%XX%%%%%%%%%X",
+"-X%X%X%%%%%%%X%X",
+"-%X%XX%%%%%%%%%X",
+"--%X%X%%%%%%%%%X",
+"--X%XX%%%%%%%X%X",
+" X%X%X%%%%%%%%%X",
+" %X%XX%%%%%%%%%X",
+"XXXXXXXXXXXXXXXX",
+
+"XXXXXXXXXXXXXXXX",
+"XX%X%X%%%%%%%%%X",
+"X%X%XX%%%%%%%%%X",
+"X%%X%X%%%%%X%%%X",
+"X%X%XX%%%%%%%%%X",
+"XX%X%X%%%%%%%%%X",
+"X%X%XX%%%%%X%%%X",
+"X%%X%X%%%%%%%%%X",
+"X%X%XX%%%%%%%%%X",
+"XX%X%X%%%%%X%%%X",
+"X%X%XX%%%%%%%%%X",
+"X%%X%X%%%%%%%%%X",
+"X%X%XX%%%%%X%%%X",
+"XX%X%X%%%%%%%%%X",
+"X%X%XX%%%%%%%%%X",
+"XXXXXXXXXXXXXXXX",
+
+"XXXXXXXXXXXXXXXX",
+"XX%X%X%%%%%%%%%X",
+"X%X%XX%%%%%%%%%X",
+"X%%X%X%%%X%%%%%X",
+"X%X%XX%%%%%%%%%X",
+"XX%X%X%%%%%%%%%X",
+"X%X%XX%%%X%%%%%X",
+"X%%X%X%%%%%%%%%X",
+"X%X%XX%%%%%%%%%X",
+"XX%X%X%%%X%%%%%X",
+"X%X%XX%%%%%%%%%X",
+"X%%X%X%%%%%%%%%X",
+"X%X%XX%%%X%%%%%X",
+"XX%X%X%%%%%%%%%X",
+"X%X%XX%%%%%%%%%X",
+"XXXXXXXXXXXXXXXX",
+
+"XXXXXXXXXXXXXXXX",
+"XX%X%X%%%%%%%%%X",
+"X%X%XX%%%%%%%%%X",
+"X%%X%X%X%%%%%%%X",
+"X%X%XX%%%%%%%%%X",
+"XX%X%X%%%%%%%%%X",
+"X%X%XX%X%%%%%%%X",
+"X%%X%X%%%%%%%%%X",
+"X%X%XX%%%%%%%%%X",
+"XX%X%X%X%%%%%%%X",
+"X%X%XX%%%%%%%%%X",
+"X%%X%X%%%%%%%%%X",
+"X%X%XX%X%%%%%%%X",
+"XX%X%X%%%%%%%%%X",
+"X%X%XX%%%%%%%%%X",
+"XXXXXXXXXXXXXXXX",
+
+"X%%X%X%X%%X%X%%X",
+"X%%XX%X%%%X%X%%X",
+"X%%X%X%%%%X%X%%X",
+"XXXXX%%%%%X%X%%X",
+"X%%X%%%%%%X%X%%X",
+"X%%X%%%X%%X%X%%X",
+"X%%X%%XX%%X%X%%X",
+"X%%X%X%X%%X%X%%%",
+"XXXXX%XX%%X%X%%%",
+"X%%XXX%X%%X%X%%%",
+"X%%XX%XX%%X%XXXX",
+"X%%XXX%X%%X%%%%%",
+"X%%XX%X%%%XXXXXX",
+"X%%XXX%%%X%X%X%X",
+"XXXXX%%%X%X%X%X%",
+"X%%X%%%XXXXXXXXX",
+
+"X%%X%X%X%%X%X%%X",
+"X%%XX%X%%%X%X%%X",
+"X%%X%X%%%%X%X%%X",
+"XXXXX%%%%%X%X%%X",
+"X%%X%%%%%%X%X%%X",
+"X%%X%%%X%%X%X%%X",
+"X%%X%%XX%%X%X%%X",
+"X%%X%X%X%%X%X%%%",
+"XXXXXXXX%%X%X%%%",
+"X%%X%X%X%%X%X%%%",
+"X%%X%XXX%%X%XXXX",
+"X%%X%X%X%%X%%%%%",
+"X%%X%XX%%%XXXXXX",
+"X%%X%X%%%X%X%X%X",
+"XXXXX%%%X%X%X%X%",
+"X%%X%%%XXXXXXXXX",
+
+"X%%X%X%X%%X%X%%X",
+"X%%XX%X%%%X%X%%X",
+"X%%X%X%%%%X%X%%X",
+"XXXXX%%%%%X%X%%X",
+"X%%X%%%%%%X%X%%X",
+"X%%X%%%X%%X%X%%X",
+"X%%X%%XX%%X%X%%X",
+"X%%X%XXX%%X%X%%%",
+"XXXXX%XX%%X%X%%%",
+"X%%X%%XX%%X%X%%%",
+"X%%X%%XX%%X%XXXX",
+"X%%X%%XX%%X%%%%%",
+"X%%X%%X%%%XXXXXX",
+"X%%X%X%%%X%X%X%X",
+"XXXXX%%%X%X%X%X%",
+"X%%X%%%XXXXXXXXX",
+
+"X%%X%X%X%%X%X%%X",
+"X%%XX%X%%%X%X%%X",
+"X%%X%X%%%%X%X%%X",
+"XXXXX%%%%%X%X%%X",
+"X%%X%%%%%%X%X%%X",
+"X%%X%%%X%%X%X%%X",
+"X%%X%%XX%%X%X%%X",
+"X%%X%X%X%%X%X%%%",
+"XXXXX%%X%%X%X%%%",
+"X%%X%%XX%%X%X%%%",
+"X%%X%%XX%%X%XXXX",
+"X%%X%%XX%%X%%%%%",
+"X%%X%%X%%%XXXXXX",
+"X%%X%X%%%X%X%X%X",
+"XXXXX%%%X%X%X%X%",
+"X%%X%%%XXXXXXXXX",
+
+"%%  %%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"X%%X%X%%%%X%X%%X",
+"XXXXX%%%%%X%X%%X",
+"X%%X%%%%%%X%X%%X",
+"X%%X%%%X%%X%X%%X",
+"X%%X%%XX%%X%X%%X",
+"X%%X%X%X%%X%X%%%",
+"XXXXX%%X%%X%X%%%",
+"X%%XXXXX%%X%X%%%",
+"X%%XXXXX%%X%XXXX",
+"X%%XXXXX%%X%%%%%",
+"X%%X%%X%%%XXXXXX",
+"X%%X%X%%%X%X%X%X",
+"XXXXX%%%X%X%X%X%",
+"X%%X%%%XXXXXXXXX",
+
+"%%%X%X%X%%X%X%%X",
+"%%%XX%X%%%X%X%%X",
+"X%%X%X%%%%X%X%%X",
+"XXXXX%%%%%X%X%%X",
+"X%%X%%%%%%X%X%%X",
+"X%%X%%%X%%X%X%%X",
+"X%%X%%XX%%X%X%%X",
+"X%%X%X%X%%X%X%%%",
+"XXXXX%%X%%X%X%%%",
+"XXXXXXXX%%X%X%%%",
+"XXXXXXXX%%X%XXXX",
+"XXXXXXXX%%X%%%%%",
+"X%%X%%X%%%XXXXXX",
+"X%%X%X%%%X%X%X%X",
+"XXXXX%%%X%X%X%X%",
+"X%%X%%%XXXXXXXXX",
+
+"X%%X%X%X%%X%X%%X",
+"X%%XX%X%%%X%X%%X",
+"X%%X%X%%%%X%X%%X",
+"XXXXX%%%%%X%X%%X",
+"X%%X%%%%%%X%X%%X",
+"X%%X%%%X%%X%X%%X",
+"X%%X%%XX%%X%X%%X",
+"X%%X%X%X%%X%X%%%",
+"XXXXX%%X%%X%X%%%",
+"XXXXXX%X%%X%X%%%",
+"XXXXXX%X%%X%XXXX",
+"XXXXXX%X%%X%%%%%",
+"X%%X%%X%%%XXXXXX",
+"X%%X%X%%%X%X%X%X",
+"XXXXX%%%X%X%X%X%",
+"X%%X%%%XXXXXXXXX",
+
+"X%%X%X%X%%X%X%%X",
+"X%%XX%X%%%X%X%%X",
+"X%%X%X%%%%X%X%%X",
+"XXXXX%%%%%X%X%%X",
+"X%%X%%%%%%X%X%%X",
+"X%%X%%%X%%X%X%%X",
+"X%%X%%XX%%X%X%%X",
+"X%%X%X%X%%X%X%%%",
+"XXXXX%%X%%X%X%%%",
+"XXXX%%%X%%X%X%%%",
+"XXXX%%%X%%X%XXXX",
+"XXXX%%%X%%X%%%%%",
+"X%%X%%X%%%XXXXXX",
+"X%%X%X%%%X%X%X%X",
+"XXXXX%%%X%X%X%X%",
+"X%%X%%%XXXXXXXXX",
+
+"X%%X%X%X%%X%X%%X",
+"X%%XX%X%%%X%X%%X",
+"X%%X%X%%%%X%X%%X",
+"XXXXX%%%%%X%X%%X",
+"X%%X%%%%%%X%X%%X",
+"X%%X%%%X%%X%X%%X",
+"X%%X%%XX%%X%X%%X",
+"X%%X%XXX%%X%X%%%",
+"XXXXX%XX%%X%X%%%",
+"X%%X%%XX%%X%X%%%",
+"X%%X%%XX%%X%XXXX",
+"X%%X%%XX%%X%%%%%",
+"X%%X%%X%%%XXXXXX",
+"X%%X%X%%%X%X%X%X",
+"XXXXX%%%X%X%X%X%",
+"X%%X%%%XXXXXXXXX",
+
+"X%%X%X%X%%X%X%%X",
+"X%%XX%X%%%X%X%%X",
+"X%%X%X%%%%X%X%%X",
+"XXXXX%%%%%X%X%%X",
+"X%%X%%%%%%X%X%%X",
+"X%%X%%%X%%X%X%%X",
+"X%%X%%XX%%X%X%%X",
+"X%%X%X%X%%X%X%%%",
+"XXXXXXXX%%X%X%%%",
+"X%%X%X%X%%X%X%%%",
+"X%%X%XXX%%X%XXXX",
+"X%%X%X%X%%X%%%%%",
+"X%%X%XX%%%XXXXXX",
+"X%%X%X%%%X%X%X%X",
+"XXXXX%%%X%X%X%X%",
+"X%%X%%%XXXXXXXXX",
+
+"X%%X%X%X%%X%X%%X",
+"X%%XX%X%%%X%X%%X",
+"X%%X%X%%%%X%X%%X",
+"XXXXX%%%%%X%X%%X",
+"X%%X%%%%%%X%X%%X",
+"X%%X%%%X%%X%X%%X",
+"X%%X%%XX%%X%X%%X",
+"X%%X%X%X%%X%X%%%",
+"XXXXX%XX%%X%X%%%",
+"X%%XXX%X%%X%X%%%",
+"X%%XX%XX%%X%XXXX",
+"X%%XXX%X%%X%%%%%",
+"X%%XX%X%%%XXXXXX",
+"X%%XXX%%%X%X%X%X",
+"XXXXX%%%X%X%X%X%",
+"X%%X%%%XXXXXXXXX",
+
+"X%%X%X%X%%X%X%%X",
+"X%%XX%X%%%X%X%%X",
+"X%%X%X%%%%X%X%%X",
+"XXXXX%%%%%X%X%%X",
+"X%%X%%%%%%X%X%%X",
+"X%%X%%%X%%X%X%%X",
+"X%%X%%XX%%X%X%%X",
+"X%%X%X%X%%X%X%%%",
+"XXXXX%XX%%X%X%%%",
+"X%%X%X%X%%X%X%%%",
+"X%%XX%XX%%X%XXXX",
+"X%%X%X%X%%X%%%%%",
+"X%%XX%X%%%XXXXXX",
+"X%%XXX%%%X%X%X%X",
+"XXXXX%%%X%X%X%X%",
+"X%%X%%%XXXXXXXXX",
+
+"****************",
+"               *",
+"               *",
+"-------------- *",
+"@@@@@@@@@@@@=. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@ .*",
+"@@@@@@@@@@@@   +",
+"@@@@@@@@@@   ++*",
+"@@@@@@@@ ++ ++ *",
+"@@@@@@@+ +@+@.+*",
+"@@@@@   +@@@@.+*",
+"@@@@ +@+@@@@@.+*",
+"@@.X++@@@@@@@.+*",
+"@.XXX@@@@@@@@.+*",
+
+"****************",
+"               *",
+"               *",
+"-------------- *",
+"@@@@@@@@@@@@=. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@  .",
+"@@@@@@@@@@@@ + +",
+"@@@@@@@@@@  + +*",
+"@@@@@@@@ +@+ + *",
+"@@@@@@++ + +@.+*",
+"@@@@@@@ @@@@@.+*",
+"@@@@  ++@@@@@.+*",
+"@@.X++@@@@@@@.+*",
+"@.XXX@@@@@@@@.+*",
+
+"****************",
+"               *",
+"               *",
+"-------------- *",
+"@@@@@@@@@@@@=. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@ + ",
+"@@@@@@@@@@@@  ++",
+"@@@@@@@@@@ + ++*",
+"@@@@@@@@ +++@  *",
+"@@@@@@+++@  @.+*",
+"@@@@@ @@ @@@@.+*",
+"@@@@+ ++@@@@@.+*",
+"@@.X++@@@@@@@.+*",
+"@.XXX@@@@@@@@.+*",
+
+"****************",
+"               *",
+"               *",
+"-------------- *",
+"@@@@@@@@@@@@=. *",
+"@@@@@@@@@@@@@. *",
+"@@@@@@@@@@@@@.+ ",
+"@@@@@@@@@@@@@   ",
+"@@@@@@@@@@@+@ +*",
+"@@@@@@@@@@+   ++",
+"@@@@@@@@ @+ +@ *",
+"@@@@@@@+ ++ @.+*",
+"@@@@@ + @@@@@.+*",
+"@@@@++++@@@@@.+*",
+"@@.X++@@@@@@@.+*",
+"@.XXX@@@@@@@@.+*",
+
+".XXX@@@@@@@@@ .*",
+"XXX@@@@@@@@@@  *",
+"&X@@@@@@@@@ @ ++",
+"X@@@@@@@@ @ +++*",
+"@@@@@@@@ @+ +.+*",
+"@@@@@@ @ + +@.+*",
+"@@@@@@+ @+@@@.+*",
+"@@@@@  @+@@@@.+*",
+"@@.X+@@@@@@@@.+*",
+"@.XXX@@@@@@@@.+*",
+".XXX@@@@@@@@@.+*",
+"XXX@@@@@@@@@@.+*",
+"&X@@@@@@@@@@@.+*",
+"X@@@@@@@@@@@@.+*",
+"@@@@@@@@---@@.+*",
+"@@@@@@@@...@@.+*",
+
+".XXX@@@@@@@@@  *",
+"XXX@@@@@@@@@@ .*",
+"&X@@@@@@@@@  + +",
+"X@@@@@@ @@+++@+*",
+"@@@@@@@@ @  +.+*",
+"@@@@@@ @++ +@.+*",
+"@@@@@@+  @@@@.+*",
+"@@@@@@ @+@@@@.+*",
+"@@.X@+@@@@@@@.+*",
+"@.XXX@@@@@@@@.+*",
+".XXX@@@@@@@@@.+*",
+"XXX@@@@@@@@@@.+*",
+"&X@@@@@@@@@@@.+*",
+"X@@@@@@@@@@@@.+*",
+"@@@@@@@@---@@.+*",
+"@@@@@@@@...@@.+*",
+
+".XXX@@@@@@@@@ .*",
+"XXX@@@@@@@@@@+ *",
+"&X@@@@@@@@@ +  *",
+"X@@@@@@ @@+ +.@+",
+"@@@@@@@@ +@+ ++*",
+"@@@@@@ @ +@ @.+*",
+"@@@@@++@ +@@@.+*",
+"@@@@@@@ +@@@@.+*",
+"@@.X+++@@@@@@.+*",
+"@.XXX@@@@@@@@.+*",
+".XXX@@@@@@@@@.+*",
+"XXX@@@@@@@@@@.+*",
+"&X@@@@@@@@@@@.+*",
+"X@@@@@@@@@@@@.+*",
+"@@@@@@@@---@@.+*",
+"@@@@@@@@...@@.+*",
+
+".XXX@@@@@@@@@+ *",
+"XXX@@@@@@@@@+@ *",
+"&X@@@@@@@@@    +",
+"X@@@@@@ @+@+++.@",
+"@@@@@@@@  @+@ +*",
+"@@@@@@ @@+@@ .+*",
+"@@@@@@+++ +@@.+*",
+"@@@@@+@@ @@@@.+*",
+"@@.X++++@@@@@.+*",
+"@.XXX@@@@@@@@.+*",
+".XXX@@@@@@@@@.+*",
+"XXX@@@@@@@@@@.+*",
+"&X@@@@@@@@@@@.+*",
+"X@@@@@@@@@@@@.+*",
+"@@@@@@@@---@@.+*",
+"@@@@@@@@...@@.+*",
+
+"................",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@ ",
+"@@@@@@@@@@@+@  +",
+"@@@@@@@@@@@ @++@",
+"@@@@@@@@@@+@ +@ ",
+"@@@@@@@@@ +++@@@",
+"@@@@@@@  ++@@@@@",
+"@@@@@ +++ @@@@ +",
+"@@@@ +  @@@@ +++",
+"@@.+++@@@@..+   ",
+"@.X+.@@@@.X++@@@",
+"oXXX.@@@oXXX.@@@",
+"oXX.@@@.oXX.@@@.",
+"XOO@@@oXXOO@@@oX",
+
+"................",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@ @@",
+"@@@@@@@@@@@+@@ +",
+"@@@@@@@@@@+@ ++ ",
+"@@@@@@@@@ @@ @+@",
+"@@@@@@@@ @+@++@@",
+"@@@@@@@+  ++@@ @",
+"@@@@@  +@+@@@@++",
+"@@@@++ + @@@   +",
+"@@.+++@@@@..++  ",
+"@.X+.@@@@.X++@@@",
+"oXXX.@@@oXXX.@@@",
+"oXX.@@@.oXX.@@@.",
+"XOO@@@oXXOO@@@oX",
+
+"................",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@  ",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@++ @@ ",
+"@@@@@@@@@@@@++@+",
+"@@@@@@@@@  @+ +@",
+"@@@@@@@@+ ++@+@@",
+"@@@@@@@+++ +@@ +",
+"@@@@@   @+@@@@ +",
+"@@@+++ + @@@ +  ",
+"@@.@.+@@@@..++ @",
+"@.X++@@@@.X++@@@",
+"oXXX.@@@oXXX.@@@",
+"oXX.@@@.oXX.@@@.",
+"XOO@@@oXXOO@@@oX",
+
+"................",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@+@@",
+"@@@@@@@@@@+@+ @ ",
+"@@@@@@@@@@ @@@ +",
+"@@@@@@@@@+   ++@",
+"@@@@@@@@+++@++@@",
+"@@@@@@@@++ +@@ @",
+"@@@@   + +@@@@++",
+"@@@+@.++ @@@   @",
+"@@.+.+@@@@..+++ ",
+"@.X++@@@@.X++@@@",
+"oXXX.@@@oXXX.@@@",
+"oXX.@@@.oXX.@@@.",
+"XOO@@@oXXOO@@@oX",
+
+"..............  ",
+"@@@+@@@+@@@@@.**",
+"++ @+@@@ @@@@. *",
+"+@+@@+ +@+ @   +",
+"@@+@@ ++@@@  . *",
+"@@@+ ++ @+  +. *",
+"@@  ++@+@  ++. *",
+"@ + @@@@  ++@++*",
+"@++@ @+   ++@+ *",
+"  @@@  ++ @@@. *",
+"@@@@@++  @@@@. *",
+"@@..++ @@@@@@. *",
+"@.X++ @@@@@@@. *",
+"oXXX.@@@@@@@@. *",
+"oXX.@@@@@@@@@. *",
+"XOO@@@@@@@@@@. *",
+
+"..............  ",
+"@+@+@@@@+@@@@..*",
+" ++ +@ @ +@@@  *",
+"+@@@@ ++@@ @   +",
+"@@@@ @+ +@   . *",
+"@@  ++@+@ @ +. *",
+"@@@@+@++@  +++.*",
+"@ +@ @@@  ++@@+*",
+"@+@+ @+  +@+++ *",
+"@  @@+  ++ @@. *",
+"+@@@+  + @@@@. *",
+"@@..@ +@@@@@@. *",
+"@.X+++@@@@@@@. *",
+"oXXX.@@@@@@@@. *",
+"oXX.@@@@@@@@@. *",
+"XOO@@@@@@@@@@. *",
+
+"..............  ",
+"+@+@@@ @++@@@..*",
+"@++ +@+@@ @@ @ *",
+"@+@@@@  +@  @  +",
+" @@@+ +@+@@ +. *",
+"@@ @ +++@  + . *",
+"@ @@+ @+@   ++.*",
+"@@@+@@@@+ +@+@+*",
+"@ ++ @++  ++++ *",
+"@+ @@++ + @@@. *",
+"+@@@+   @+@@@. *",
+"@@..+ +@@@@@@. *",
+"@.X+ +@@@@@@@. *",
+"oXXX.@@@@@@@@. *",
+"oXX.@@@@@@@@@. *",
+"XOO@@@@@@@@@@. *",
+
+"..............  ",
+" +@@@@ @++@@@..*",
+" ++ +@+@ @ @@  *",
+"++@@@ + +@  @. +",
+"@@@+ +@+@@  .  *",
+"@@@@ ++@@ ++++ *",
+"@@ +@ @@   ++ .*",
+" @ +@@@++ ++@@+*",
+"@@+ @@++  @+++ *",
+"++ @@++    @@. *",
+" @@@ +++@+@@@. *",
+"@@.. + @@@@@@. *",
+"@.X+++@@@@@@@. *",
+"oXXX.@@@@@@@@. *",
+"oXX.@@@@@@@@@. *",
+"XOO@@@@@@@@@@. *",
+
+"****************",
+"                ",
+"------------ -++",
+"@@@@@@@@@@   +@@",
+"@@@@@@@@  +++@@@",
+"@@@@@@   ++@@@@ ",
+"@@@@   +++@@@@  ",
+"@@   ++@@@@@   +",
+".. +++@@@@.. +++",
+"X++@@@@@@.X++@@@",
+"XX.@@@@@.XXX.@@@",
+"X.@@@@@.XXX.@@@@",
+".@@@@@oXXX.@@@@@",
+"@@@@@.oXX.@@@@@@",
+"@@@@oXXOO@@@@@@@",
+"@@@.oXX.@@@@@@@.",
+
+"****************",
+"               +",
+"------------  -+",
+"@@@@@@@@@@+  +@@",
+"@@@@@@@@ + ++@@@",
+"@@@@@@ +  +@@@@ ",
+"@@@@  + ++@@@@  ",
+"@@  + +@@@@@  ++",
+"..  ++@@@@.. +++",
+"X++@@@@@@.X++@@@",
+"XX.@@@@@.XXX.@@@",
+"X.@@@@@.XXX.@@@@",
+".@@@@@oXXX.@@@@@",
+"@@@@@.oXX.@@@@@@",
+"@@@@oXXOO@@@@@@@",
+"@@@.oXX.@@@@@@@.",
+
+"****************",
+"               +",
+"------------ -@+",
+"@@@@@@@@@@+   +@",
+"@@@@@@@@+ + +@@@",
+"@@@@@@@+  +@@@@ ",
+"@@@+@  +@+@@@@  ",
+"@@+  + @@@@@ +++",
+"..   +@@@@..+  @",
+"X++@@@@@@.X++@@@",
+"XX.@@@@@.XXX.@@@",
+"X.@@@@@.XXX.@@@@",
+".@@@@@oXXX.@@@@@",
+"@@@@@.oXX.@@@@@@",
+"@@@@oXXOO@@@@@@@",
+"@@@.oXX.@@@@@@@.",
+
+"**************+*",
+"              + ",
+"-----------  -+@",
+"@@@@@@@@@+@++  @",
+"@@@@@@@++ ++ @@@",
+"@@@@@@+    @@@@@",
+"@@@+@++ @+@@@@ +",
+"@@+    @@@@@ +++",
+".. + +@@@@..+ @+",
+"X++@@@@@@.X++@@@",
+"XX.@@@@@.XXX.@@@",
+"X.@@@@@.XXX.@@@@",
+".@@@@@oXXX.@@@@@",
+"@@@@@.oXX.@@@@@@",
+"@@@@oXXOO@@@@@@@",
+"@@@.oXX.@@@@@@@.",
+
+"****************",
+"               *",
+"-------  +     *",
+"@@@@@@         *",
+"@@     +@@@@@@ *",
+"   ++++@@@@@-@ *",
+"+++++@.@@@@@@@ *",
+"++@@@@.@@@@@@@ *",
+"+@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@.@.@@.@@@@@@@ *",
+
+"****************",
+"               *",
+"-------        *",
+"@@@@@ @ +      *",
+"@@  + + @@@@@@ *",
+"++ ++ +@@@@@-@ *",
+" ++ +@.@@@@@@@ *",
+" +@@@@.@@@@@@@ *",
+"++@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@.@.@@.@@@@@@@ *",
+
+"****************",
+"               *",
+"-------  +     *",
+"@@@@@  +++     *",
+"@@ ++ + @@@@@@ *",
+"++  +++@@@@@-@ *",
+"+++@ @.@@@@@@@ *",
+"++ @@@.@@@@@@@ *",
+"+@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@.@.@@.@@@@@@@ *",
+
+"* **************",
+"+      +       *",
+"---@- -+ +     *",
+"@@@ @+ +++     *",
+"+@ @+ + @@@@@@ *",
+" + + ++@@@@@-@ *",
+"+++@ @.@@@@@@@ *",
+" + @@@.@@@@@@@ *",
+"+@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@@@@@@.@@@@@@@ *",
+"@.@.@@.@@@@@@@ *",
+
+"**********+++***",
+"       ++++.   *",
+"  ..+++. .     *",
+"++++.   +      *",
+"X.             *",
+"...........  . *",
+"@@@@@@@@@@..   *",
+"@@@@@@@@@   +++*",
+"@@@@@ .   +++  *",
+"@@   .+++.+    *",
+"@. ++.+.@@.    *",
+"  ++@@@@@@.+   *",
+"+++@@@@@@@.+ . *",
+"X@@@@@@@@@.+ .+*",
+"@@@@@@@@@@  ++ *",
+"@@@@@@@. .++   *",
+
+"*********+++****",
+"      +++.+.   *",
+"  .+.+ +++     *",
+"+++++   +      *",
+"X+..           *",
+".. ........ .  *",
+"@@@@@@@@@@.  + *",
+"@@@@@@@.@ . +++*",
+"@@@@@@ +  + +  *",
+"@@   .++. +    *",
+"@.+++.+.@@.    *",
+"   +@@@@@@.+   *",
+"+++@@@@@@@.+ . *",
+"X@@@@@@@@@.+.+ *",
+"@@@@@@@@@@   ++*",
+"@@@@@@@..+ ++  *",
+
+"*********++.****",
+"   +  +++++.   *",
+"  ...++ ++     *",
+"+++++.  +      *",
+"X+ +            ",
+"...........  . *",
+"@@@@@@@@@@.. ++ ",
+"@@@@@@@.+@ +  +*",
+"@@@@@.@  . ++  *",
+"@@@ + ++++.    *",
+"@. +++.@@@.    *",
+"  + @@@@@@.+   *",
+"+++@@@@@@@.+ + *",
+"X@@@@@@@@@.+ .+ ",
+"@@@@@@@@@@   ++*",
+"@@@@@@@. .+.+  *",
+
+"*********++ .***",
+"   + +++++.+   *",
+" ... ++  ++    *",
+"+ ++++. +      *",
+"X++            *",
+"...........   .*",
+"@@@@@@@@@@...++ ",
+"@@@@@@@ +.+.+  +",
+"@@@@@ .+. + +  *",
+"@@@+++@+@+.    *",
+"@  + +@.@@.    *",
+"++ + @@@@@.+   *",
+"+++@@@@@@@.+ ++ ",
+"X@@@@@@@@@.++ .*",
+"@@@@@@@@@..   ++",
+"@@@@@@@+. +.   *",
+
+"@@@@@@   +.+   *",
+"@@@@ . ++@.+   *",
+"@@@  +++@@.+   *",
+"@@  .+@@@@.+   *",
+" . .@@@@@@.+   *",
+" ++@@@@@@@.+   *",
+"X@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+
+"@@@@@@   +..   *",
+"@@@@   +++@+   *",
+"@@@ +.++@@.+   *",
+"@@.  .@@@@.+   *",
+" +  @@@@@@.+   *",
+" ++@@@@@@@.+   *",
+"X@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+
+"@@@@@@ + ++.   *",
+"@@@@  ++ +.+   *",
+"@@@ +.+.@@.+   *",
+"@@.  @@@@@.+   *",
+" +++@@@@@@.+   *",
+" ++@@@@@@@.+   *",
+"X@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+
+"@@@@@@+  +++.  *",
+"@@@@+  +@ .+   *",
+"@@@   .+.@.+   *",
+"@@+.@@@@@@.+   *",
+"  +@+@@@@@.+   *",
+"  ++@@@@@@.+   *",
+"X@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+"@@@@@@@@@@.+   *",
+
+"                ",
+".        @ @  + ",
+"@.     @ .+ + + ",
+"@@.***+.+*+*+*+*",
+".@....+ + +     ",
+"XX@.@ +       . ",
+"X@@@+.      . . ",
+"@@@@@.      . .+",
+"@@@@@.   ..@..  ",
+"@@@@@. .....    ",
+"@@@@@. ... +    ",
+"@@@....         ",
+".@@+@.          ",
+"XX@@@.        ..",
+"X@@@@.      ..+@",
+"@@@@@.+   . +.  ",
+
+"            +   ",
+".     + + +  +..",
+"@.  ++ +  . . .@",
+"@@+**+.@.*.*.**.",
+"+@..+   . .  .  ",
+"XX+@. . . .     ",
+"X@@@@.         +",
+"@@@@@.     + +  ",
+"@@@@@.   +    ++",
+"@@@@@. ++ @+@+@ ",
+"@@@@@++ @.+.+ . ",
+"@@@+@.@. .      ",
+".@+.+. .        ",
+"XX@@@.          ",
+"X@@@@.      .  @",
+"@@@@@.+   . @ ++",
+
+"        @      +",
+".         +  + .",
+"@.    @   ..+. .",
+"@@.@*.*..+*+*.+.",
+".+.+...+  . .   ",
+"XX@@.+          ",
+"X@@@@.         +",
+"@@@@@.    +.@+ +",
+"@@@@@..  .@++ . ",
+"@@@@..+ + +.   .",
+"@@@@@.  +. . .  ",
+"@@@.+.+.       @",
+".@+.+.       @ +",
+"XX@@@.     @ +  ",
+"X@@@@.     + + +",
+"@@@@@.+  + +  ..",
+
+"                ",
+".         + + + ",
+"@.      +  @ @.+",
+"@@.**.+@..*+*+*+",
+".@@.@@+. + +    ",
+"XX+.+    +      ",
+"X@@@@.+ +     + ",
+"@@@@@.          ",
+"@@@@@.      +...",
+"@@@@@.  ++@+@+..",
+"@@.@@+++.   . ..",
+".@@@@@ @ ... .  ",
+".@+@+.+..       ",
+"XX@@@.          ",
+"X@@@@.          ",
+"@@@@@.+       @+",
+
+" +              ",
+"+               ",
+"+ .@.           ",
+"****************",
+"  @            *",
+"@ +            *",
+".   .   + +    *",
+" +.+    .+     *",
+"      +   .    *",
+"      .+       *",
+"    . +  .  .  *",
+"  . +     .    *",
+"..+.+  .  .  . *",
+"+ .. .. +.  .  *",
+".@  ++ +. +  + *",
+"   +   .  .    *",
+
+"                ",
+".. .            ",
+" . .            ",
+"****************",
+"               *",
+"               *",
+"  +            *",
+"  @. +   .     *",
+"@+ +  .    .   *",
+"   .           *",
+".        .     *",
+"     . . @.    *",
+" . @. ++  .  . *",
+".  +++.@+.  .  *",
+" ++++ +.  +  + *",
+" + . .         *",
+
+" + +            ",
+" .+.            ",
+"+.       +      ",
+"*******+********",
+"     +         *",
+" @ @ @ + +.    *",
+" +  .+. .      *",
+"  .+. .   +    *",
+".+.         +  *",
+"          +    *",
+"      @ .   +  *",
+" @ @ +. + +  . *",
+" . +.+.+  .. . *",
+".+ ..+.  .  .  *",
+"..+ +  +  +  + *",
+"+              *",
+
+"    +  +        ",
+"@ +@.           ",
+".. . +          ",
+"*+*+************",
+"               *",
+"        @   +  *",
+"+   @   +.+    *",
+" .@.+.+.   +   *",
+"+. +@  + +     *",
+". . .+         *",
+"               *",
+"               *",
+" .  .  .@ @ .. *",
+".  .  .. +  .  *",
+"@+  +. ++ +  + *",
+" . . @.@ .     *",
+
+"@@@@@.++. +.  . ",
+"@@@@@.++@. .    ",
+"@@@@@.+. +      ",
+"@@@.@.++      +@",
+".@.@@.++   @ @ .",
+"XX@@@.++  . ... ",
+"X@@@@.++ .@.    ",
+"@@@@@.++. +.+  .",
+"@@@@@.+.+. . ...",
+"@@@@@.+..... .  ",
+"@@@.@.++@  +  + ",
+"@@@@..+.        ",
+".@..@.++   .    ",
+"XX@@@.++  .     ",
+"X@@@@.++   +    ",
+"@@@@@.++        ",
+
+"@@@@@.++ .+  +..",
+"@@@@@.+. + + +. ",
+"@@@@@@++.+  .   ",
+"@@+@@+++        ",
+".+@+..++        ",
+"XX@@@.++      .+",
+"X@@@@.++     +. ",
+"@@@@@.++  + . ++",
+"@@@@@.+++++.@+@.",
+"@@@@@..+. .. .  ",
+"@@@@+++.@. +  + ",
+"@@@+@.++        ",
+".+@@@.++   .    ",
+"XX@@@.++  .     ",
+"X@@@@.++   +    ",
+"@@@@@.++        ",
+
+"@@@@@.+@ +. +.+ ",
+"@@@@@.++. +.    ",
+"@@@@+.+. .      ",
+"@+++.+.+ +      ",
+".@.@@.++        ",
+"XX@@@.++      + ",
+"X@@@@.++    +   ",
+"@@@@@.++  +   @.",
+"@@@@@.++   .  +.",
+"@@@@@.++@ .++.+ ",
+"@@@@@.@+ +... + ",
+"@@@@+..+..      ",
+".+@+@++.   .    ",
+"XX@+@.++  .     ",
+"X@@.@.++   +    ",
+"@@@@@.++        ",
+
+"@@@@@.++    @ +.",
+"@@@@@.++   + + +",
+"@@@@@.++ + +. ..",
+"@@@@@@+@.... .  ",
+".@.@..+.        ",
+"XX+@+.++        ",
+"X@@@@.++       +",
+"@@@@@.++    + +.",
+"@@@@@.++  +.  .+",
+"@@@@@.+++..@ ++ ",
+"@@@@@.++ +.++ . ",
+"@@@@+@+@.       ",
+".@.@...+   .    ",
+"XX@@@.++  .     ",
+"X@@@@.++   +    ",
+"@@@@@.++        ",
+
+"..   .@  .   . *",
+". + @.   . ..  *",
+"++  .  .     + *",
+"   . .      .  *",
+"...          . *",
+".  .       ..  *",
+" .       .   + *",
+" .  .  .       *",
+" .           . *",
+".           .  *",
+" +           + *",
+"               *",
+"             . *",
+"            .  *",
+"             + *",
+"               *",
+
+"..         . . *",
+".      + +. .  *",
+" +   +       + *",
+"   +   ++      *",
+" +. @+.+  +  . *",
+". @+ +      .  *",
+"++     + +   + *",
+"    +          *",
+" +.  .       . *",
+".           .  *",
+" +           + *",
+"               *",
+"             . *",
+"            .  *",
+"             + *",
+"               *",
+
+" .        .  . *",
+".        @ +.+ *",
+" +  +  +...  + *",
+"  +   ..@ + +  *",
+"+. @..+.+.+  . *",
+".  .+. . +  .  *",
+" ..  .+      + *",
+"+.+.+          *",
+"+.+          . *",
+".           .  *",
+" +           + *",
+"               *",
+"             . *",
+"            .  *",
+"             + *",
+"               *",
+
+" ..+.  .     . *",
+".+ . .      .  *",
+" .           + *",
+"               *",
+" .    @. .+. . *",
+".+ +@+  ++@ +  *",
+"+.+ + ++@. . + *",
+"  @++.@    . . *",
+" ++..    .   . *",
+"+..    .    .  *",
+".+. .        + *",
+"               *",
+"             . *",
+"            .  *",
+"             + *",
+"               *",
+
+"XXXXXXXXXXXXXXXX",
+".@@.............",
+"O.....O.........",
+"XXXXXXXXXXXXXXXX",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$##&$#####$$##$",
+"X$######&###&##$",
+"X$###&#&##&####$",
+"X$$#$#$#$*$#$#$$",
+
+"XXXXXXXXXXXXXXXX",
+".@@.............",
+"O.....O.........",
+"XXXXXXXXXXXXXXXX",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$$&$#$#$#$#$#$$",
+
+"XXXXXXXXXXXXXXXX",
+".@@.............",
+"O.....O.........",
+"XXXXXXXXXXXXXXXX",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$$#$#$#$#$#$#$$",
+
+"XXXXXXXXXXXXXXXX",
+".@@.............",
+"O.....O.........",
+"XXXXXXXXXXXXXXXX",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$$#$#$#$#$#&#$$",
+
+"XXXXXXXXXXXXXXXX",
+".@@.............",
+"O.....O.........",
+"XXXXXXXXXXXXXXXX",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$##$$###&#$$##$",
+"X$####&#####&##$",
+"X$#&###&*#&####$",
+"X$$#$*$#$#$*$#$$",
+
+"XXXXXXXXXXXXXXXX",
+".@@.............",
+"O.....O.........",
+"XXXXXXXXXXXXXXXX",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"X$#############$",
+"X$#############$",
+"X$##$&#####$$##$",
+"X$######&######$",
+"X$##&##&##&####$",
+"X$##$$*##*#&*##$",
+"X$##*######*###$",
+"X$######*######$",
+"X$$#$#$#$#$#$#$$",
+
+"XXXXXXXXXXXXXXXX",
+".@@.............",
+"O.....O.........",
+"XXXXXXXXXXXXXXXX",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"X$###&#&#&#&###$",
+"X$#############$",
+"X$##$&*####*$##$",
+"X$##*####&#####$",
+"X$#######*#####$",
+"X$##$$#*###$$##$",
+"X$#########*###$",
+"X$#############$",
+"X$$#$#$#$#$#$#$$",
+
+"XXXXXXXXXXXXXXXX",
+".@@.............",
+"O.....O.........",
+"XXXXXXXXXXXXXXXX",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$###&##&######$",
+"X$########&####$",
+"X$##*$&####$&##$",
+"X$#######*#&###$",
+"X$#####*##*####$",
+"X$$#$#$#$#$#$#$$",
+
+"X$####*#*#*####$",
+"X$##*#######*##$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"XXXXXXXXXXXXXXXX",
+"................",
+"XXXXXXXXXXXXXXXX",
+".X.#.O........*.",
+"..XX.X.X.X.X.XXX",
+
+"X$########&####$",
+"X$####&########$",
+"X$##$&#*#&#$&##$",
+"X$#*#*####*####$",
+"X$######*###*##$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"XXXXXXXXXXXXXXXX",
+"................",
+"XXXXXXXXXXXXXXXX",
+".X.#.O........*.",
+"..XX.X.X.X.X.XXX",
+
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$##&##########$",
+"X$#######&##&##$",
+"X$##$$&####$$##$",
+"X$#*####*#&#*##$",
+"X$###*#&##*####$",
+"X$$$$$*$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"XXXXXXXXXXXXXXXX",
+"................",
+"XXXXXXXXXXXXXXXX",
+".X.#.O........*.",
+"..XX.X.X.X.X.XXX",
+
+"X$#############$",
+"X$########&####$",
+"X$##$&#&###*&##$",
+"X$####*##*###*#$",
+"X$##*#&########$",
+"X$##$$#####*$##$",
+"X$#############$",
+"X$#############$",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"XXXXXXXXXXXXXXXX",
+"................",
+"XXXXXXXXXXXXXXXX",
+".X.#.O........*.",
+"..XX.X.X.X.X.XXX",
+
+"X$#######*#####$",
+"X$#*########*##$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"XXXXXXXXXXXXXXXX",
+"................",
+"XXXXXXXXXXXXXXXX",
+".X.#.O........*.",
+"..XX.X.X.X.X.XXX",
+
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"XXXXXXXXXXXXXXXX",
+"................",
+"XXXXXXXXXXXXXXXX",
+".X.#.O........*.",
+"..XX.X.X.X.X.XXX",
+
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"XXXXXXXXXXXXXXXX",
+"................",
+"XXXXXXXXXXXXXXXX",
+".X.#.O........*.",
+"..XX.X.X.X.X.XXX",
+
+"X$######*###*##$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$##$$#####$$##$",
+"X$#############$",
+"X$#############$",
+"X$$$$$$$$-$-$$$$",
+"X$$$$$$$---$$$$$",
+"X$$$$$$$-$$$$$$$",
+"XXXXXXXXXXXXXXXX",
+"................",
+"XXXXXXXXXXXXXXXX",
+".X.#.O........*.",
+"..XX.X.X.X.X.XXX",
+
+"oooo.........OOo",
+"oooo.........OOo",
+"oooX....%....XOo",
+"ooXX....%....XO-",
+"ooXo....%....O-@",
+"oooO....%....-@@",
+"oooo........-@@@",
+"oooo.......-@@@@",
+"oooo......-@.@@@",
+"oooo.....-@@@@@@",
+"oooX....-@@@@@@@",
+"ooXX...-@@@@@@@@",
+"ooXo..-@@@@@@@@@",
+"oooO.-@@@@@@@@@@",
+"oooo-@.@@@@@@.@O",
+"oooo@@@@@@@@@@OO",
+
+"oo-----------ooo",
+"o-@@@@@@@@@@oooo",
+"-@.@@@@@@.@ooooo",
+"@@@@@@@@@@oooooo",
+"@@@@@@@@@ooooooo",
+"@@@@@@@@oooooooo",
+"@@@@@@@oooooOooo",
+"@@@@@@ooooOooooo",
+"@@@.@ooooooooooo",
+"@@@@oooooooooooo",
+"@@@ooOoooooooooo",
+"@@oooooooooOOooo",
+"@ooooooooooooooo",
+"oOoooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+
+"oooooooooooooooo",
+"oooooOooooOooooo",
+"oooooooooooooooo",
+"ooooooooooooooo@",
+"ooOooooOoooooo@.",
+"ooooooooooooo@..",
+"oooooooooooo@...",
+"ooooooooooo@....",
+"oooOoooooo@.....",
+"ooooooOOO@......",
+"ooooooOO@....%..",
+"oooooOO@....%...",
+"oooooO@....%....",
+"ooooO@....%.....",
+"oooo@..........O",
+"oooo..........Oo",
+
+"oo@@@@@@@@@@@ooo",
+"o@..........oooo",
+"@..........ooooo",
+"....%.....oooooo",
+"...%.....ooooooo",
+"..%.....oooooooo",
+".%.....oooooOooo",
+"......ooooOooooo",
+".....ooooooooooo",
+"....oooooooooooo",
+"...ooOoooooooooo",
+"..oooooooooOOooo",
+".ooooooooooooooo",
+"oOoooooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo",
+
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@...@@@@@...@@",
+"@@.@@@..@..@@@.@",
+"@@.@@@@@.@@@@@.@",
+"@@*@@@@*@.@@@@.@",
+"@@@.@@.@@@.@@.@@",
+"@@@.@.@@&@@.@.@@",
+"@@@@.@@&&=@@.@@@",
+"@@@.@.@@=@@.@.@@",
+"@@@.@@.@@@.@@.@@",
+"@@.@@@@.@*@@@@*@",
+"@@.@@@@@.@@@@@.@",
+"@@.@@@..@..@@@.@",
+"@@@...@@@@@...@@",
+"@@@@@@@@@@@@@@@@",
+
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@...@@@@@*..@@",
+"@@.@@@..@..@@@.@",
+"@@.@@@@@.@@@@@.@",
+"@@.@@@@.@.@@@@.@",
+"@@@.@@.@@@.@@.@@",
+"@@@.@.@@&@@*@.@@",
+"@@@@.@@&&=@@.@@@",
+"@@@.@*@@=@@.@.@@",
+"@@@.@@.@@@.@@.@@",
+"@@.@@@@.@.@@@@.@",
+"@@.@@@@@.@@@@@.@",
+"@@.@@@..@..@@@.@",
+"@@@..*@@@@@...@@",
+"@@@@@@@@@@@@@@@@",
+
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@...@@@@@...@@",
+"@@.@@@.*@..@@@*@",
+"@@.@@@@@.@@@@@.@",
+"@@.@@@@.@.@@@@.@",
+"@@@.@@.@@@.@@.@@",
+"@@@.@.@@=@@.@.@@",
+"@@@@.@@=&&@@.@@@",
+"@@@.@.@@&@@.@.@@",
+"@@@.@@.@@@.@@.@@",
+"@@.@@@@.@.@@@@.@",
+"@@.@@@@@.@@@@@.@",
+"@@*@@@..@*.@@@.@",
+"@@@...@@@@@...@@",
+"@@@@@@@@@@@@@@@@",
+
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@@",
+"@@@*..@@@@@...@@",
+"@@.@@@..@..@@@.@",
+"@@.@@@@@.@@@@@.@",
+"@@.@@@@.@.@@@@.@",
+"@@@.@@.@@@.@@.@@",
+"@@@.@.@@=@@.@*@@",
+"@@@@.@@=&=@@.@@@",
+"@@@*@.@@=@@.@.@@",
+"@@@.@@.@@@.@@.@@",
+"@@.@@@@.@.@@@@.@",
+"@@.@@@@@.@@@@@.@",
+"@@.@@@..@..@@@.@",
+"@@@...@@@@@..*@@",
+"@@@@@@@@@@@@@@@@",
+
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%",
+"%%%%%%%%%%%%%%%%"};
diff --git a/images/tilesbw.xpm b/images/tilesbw.xpm
new file mode 100644 (file)
index 0000000..80df2ad
--- /dev/null
@@ -0,0 +1,16325 @@
+/* XPM */
+static char * tilesbw_xpm[] = {
+"16 15360 2 1",
+"      c #FFFFFFFFFFFF",
+"#     c #000000000000",
+
+"                ",
+"                ",
+"   #       #    ",
+"                ",
+"                ",
+"                ",
+"  #             ",
+"            #   ",
+"                ",
+"         #      ",
+"                ",
+"    #           ",
+"                ",
+"            #   ",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"#               ",
+"#               ",
+"#      #        ",
+"#               ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"################",
+"################",
+"################",
+"######### # ####",
+"################",
+"################",
+"## # ###########",
+"################",
+"################",
+"################",
+"################",
+"################",
+"###### # #######",
+"################",
+"################",
+"################",
+
+"################",
+"################",
+"################",
+"################",
+"################",
+"#######   ######",
+"####### ########",
+"#######   ######",
+"################",
+"######### ######",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+
+"################",
+"################",
+"################",
+"######### # ####",
+"################",
+"################",
+"## # ###########",
+"################",
+"################",
+"################",
+"################",
+"################",
+"###### # #######",
+"################",
+"################",
+"################",
+
+"                ",
+"     #      ### ",
+"# ######    # ##",
+"####  ###### ## ",
+"##  ######## ## ",
+" ###############",
+"##### ##########",
+"################",
+"################",
+"################",
+"################",
+"################",
+"#### # #########",
+"################",
+"################",
+"################",
+
+"                ",
+" #     ###      ",
+"######## ##     ",
+"#####   ##### # ",
+"### ###### #### ",
+"############### ",
+"################",
+"############### ",
+"### # ##########",
+"################",
+"################",
+"############### ",
+"################",
+"################",
+"################",
+"################",
+
+"                ",
+"                ",
+"  #             ",
+"                ",
+"##              ",
+"# ##            ",
+"#  ##           ",
+"#####           ",
+"##### #         ",
+"##### ##        ",
+"##### #         ",
+"#### # #        ",
+"##########      ",
+"##########   #  ",
+"########### #   ",
+"############ #  ",
+
+"                ",
+"                ",
+"#               ",
+"#               ",
+" ##  # ##       ",
+"#### ##         ",
+"####  # #       ",
+"#######  ##     ",
+"########        ",
+"#####  # #      ",
+"#########       ",
+"###########     ",
+"########## #    ",
+"#### ########   ",
+"### ## #### ##  ",
+"##############  ",
+
+"#############   ",
+"########### #   ",
+"############### ",
+"########### # # ",
+"####### ####### ",
+"####### #####   ",
+"######### #     ",
+"#########   #   ",
+"##########      ",
+"## # ########   ",
+"#############   ",
+"######### ###   ",
+"########### #   ",
+"#########  ##   ",
+"############    ",
+"###########  #  ",
+
+"######## #####  ",
+"#############   ",
+"######### ##    ",
+"# # ### ###     ",
+"############    ",
+"##############  ",
+"########### ##  ",
+"#############   ",
+"######## ## #   ",
+"########### ##  ",
+"##############  ",
+"########## #    ",
+"#############   ",
+"########### #   ",
+"######### ####  ",
+"##############  ",
+
+"#############   ",
+"##### ####   ## ",
+"########## #    ",
+"######  ##      ",
+"#########   #   ",
+"######## # #    ",
+"######## # #    ",
+"# ######## #    ",
+"### ##  ###     ",
+"#####    #      ",
+"# ####          ",
+"#### #          ",
+"#  ###          ",
+"##              ",
+"#               ",
+"                ",
+
+"############### ",
+"#############  #",
+"### ###### ## # ",
+"#########  ##   ",
+"########  # ### ",
+"#### ###        ",
+"########  ##    ",
+"####   #        ",
+"##### # #       ",
+"######  #       ",
+"##### # ##      ",
+"### ##          ",
+"    ##          ",
+" # # ##         ",
+"                ",
+"                ",
+
+"################",
+"################",
+"################",
+"################",
+"################",
+"##### # ########",
+"################",
+"################",
+"################",
+"################",
+"## #### ### #  #",
+"############### ",
+"#######   ### ##",
+"#### #####   ###",
+"   ###  #       ",
+"                ",
+
+"################",
+"################",
+"################",
+"######### # ####",
+"################",
+"################",
+"################",
+"## ######## ####",
+"################",
+"#### ####   # ##",
+"################",
+" #####    ## ###",
+"##   #######  ##",
+"#     ##      ##",
+"                ",
+"                ",
+
+"################",
+" ###############",
+"  ######## # ###",
+"  ##############",
+"  ##############",
+"    # #### #####",
+"    # #  #######",
+"      ###  #####",
+"      #####  ###",
+"      ##### ####",
+"       ##  #  ##",
+"            ### ",
+"             ###",
+"              ##",
+"              ##",
+"                ",
+
+"################",
+" ###############",
+"   ###### # ####",
+"    ############",
+"   #############",
+" ##  # #########",
+" ## # ###### ###",
+"   ###  ### ####",
+"     ## ########",
+"      #  ## ####",
+"      #####  ###",
+"          ##  ##",
+"           ## ##",
+"           ### #",
+"            ### ",
+"               #",
+
+"  ##############",
+"   #############",
+"    # ##########",
+"  ### ##########",
+"  #  ###########",
+"  ## #### # ####",
+"   #### ########",
+"    # #  #######",
+"    ### ########",
+"  ###### #######",
+" ## #### #######",
+" ## ############",
+"   #############",
+"   # ###########",
+"   # ###########",
+"  ##############",
+
+"   #############",
+"   ##  #########",
+"   # ###########",
+"     ## ########",
+"     ###########",
+"  #  ###########",
+"     ###########",
+"    ##### # ####",
+"    ## #########",
+"     ## ########",
+"    ############",
+"    ############",
+"   #############",
+"   #  ##########",
+"  ##############",
+"  ##############",
+
+"                ",
+"              # ",
+"            # ##",
+"              ##",
+"             ###",
+"       ### #####",
+"      ###  #####",
+"     # ##  #####",
+"    ############",
+"   # # ##  #####",
+"    #  #  ######",
+"      ##########",
+"  #  ###########",
+" ########## # ##",
+"##### ##########",
+"################",
+
+"                ",
+"              # ",
+"             #  ",
+"               #",
+"         #######",
+"         #  ####",
+"         #######",
+"        ########",
+"     # ## # ####",
+"     #### ######",
+"      ##########",
+"    ####### # ##",
+"# #### #########",
+"  ##############",
+"#### ###########",
+"################",
+
+"      #         ",
+" # # # #   #    ",
+"# #   # # #  #  ",
+" # # #     # # #",
+"# # # #   # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # #  ",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"                ",
+"                ",
+"       #        ",
+" #   #  #       ",
+"  # # # #       ",
+" # #     #      ",
+"# # # #   #     ",
+" # # # #   #    ",
+"    # # #   #   ",
+" # # # #        ",
+"# # # # # # #   ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # #      ",
+"# # # # # # # # ",
+" # # # # # # #  ",
+
+"# # # # # # # # ",
+" # # # # # # #  ",
+"# # # # # # # # ",
+" # # # # #   # #",
+"# # # # #   #   ",
+" # # # # # # # #",
+"# # # # # # #   ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # #   # #",
+"# # # # # # #   ",
+" # # # # # # # #",
+"# # # # # #   # ",
+" # # # # #   # #",
+"# # # # # #   # ",
+" # # # # # # # #",
+
+"# # # # # # # # ",
+" # # # # #   #  ",
+"# # # # # # #   ",
+" # # # # #      ",
+"# # # # #       ",
+" # # #   #      ",
+"# # #           ",
+" #     #   #    ",
+"#   # #   #     ",
+" #     #        ",
+"#   # # #       ",
+" # # #          ",
+"# #             ",
+"   #            ",
+"#               ",
+"                ",
+
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # #   #",
+"#     # #   # # ",
+" # #   #       #",
+"  # # # #     # ",
+"   #       #   #",
+"# #             ",
+" #              ",
+"#               ",
+"                ",
+
+"      #   # # # ",
+"   # #   # # # #",
+"  # # # # # # # ",
+"       #   # # #",
+"          # # # ",
+"         # # # #",
+"    #     # # # ",
+"               #",
+"        # # #   ",
+"         # # #  ",
+"          #   # ",
+"               #",
+"        #     # ",
+"                ",
+"                ",
+"                ",
+
+"    #   # # # # ",
+"       # # # # #",
+"  # # # # # # # ",
+"   #   # # # # #",
+"  # # # # # # # ",
+"   # # # # # # #",
+"    # # # # # # ",
+"   #   # # # # #",
+"  #   # # # # # ",
+" # # # # # # # #",
+"#     # # # # # ",
+" # # # # # # # #",
+"    #   # # # # ",
+"     # # # # # #",
+"      # # # # # ",
+"   # #   # # # #",
+
+"                ",
+"             #  ",
+"            # # ",
+"         # #    ",
+"      #         ",
+"     # #   #   #",
+"    #   # # # # ",
+"           # #  ",
+"    #   # # # # ",
+"     # # # # # #",
+"      # # # # # ",
+"   # # # # # # #",
+"    # # # # # # ",
+"     # # # # # #",
+"    # # # # # # ",
+"     # # # # # #",
+
+"                ",
+" #      #   #   ",
+"  # #    # # #  ",
+" # # #   #  #  #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"                ",
+"#               ",
+"#  #   #        ",
+" #      # #   # ",
+"# #   #         ",
+" # # # #        ",
+"# # # # # #  #  ",
+" # # # #   #    ",
+"# # # # # # #   ",
+" # # # # # # #  ",
+"# # # # # # #   ",
+" # # # # # # ## ",
+"# # # # # # #   ",
+" # # # # # # ## ",
+"# # # # # # #   ",
+" # # # # # # ## ",
+
+"# # # # # # #   ",
+" # # # # # #    ",
+"# # # # # #  #  ",
+" # # # # #  #   ",
+"# # # # # # #   ",
+" # # # # # # ## ",
+"# # # # # # #   ",
+" # # # # # #    ",
+"# # # # # #     ",
+" # # # # #  #   ",
+"# # # # # #     ",
+" # # # # # ##   ",
+"# # # # # #     ",
+" # # # # # # #  ",
+"# # # # # # #   ",
+" # # # # # #    ",
+
+"# # # # # # #   ",
+" # # # # # # #  ",
+"# # # # # # #   ",
+" # # # # # # #  ",
+"# # # #     #   ",
+" # # #   #      ",
+"# # # # #       ",
+" # # # #        ",
+"# # # #         ",
+" # # #          ",
+"# # # # #       ",
+" # # #          ",
+"  # # #         ",
+" # #            ",
+"#               ",
+"                ",
+
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"#     # #   # # ",
+" # # # #   #   #",
+"# #   # #     # ",
+" #             #",
+"# #     #       ",
+" #     # #   #  ",
+"        #       ",
+"                ",
+
+"  # # # # # # # ",
+" # # # # # # # #",
+"  # # # # # # # ",
+"   # # # # # # #",
+"  # #   # # # # ",
+"     #   # # # #",
+"        # # # # ",
+"         # # # #",
+"      # # # # # ",
+"     # #   # # #",
+"      #   # # # ",
+"           # # #",
+"        # # #   ",
+"               #",
+"              # ",
+"                ",
+
+"    #   # # # # ",
+"   # # # # # # #",
+"    # # # # # # ",
+"       # # # # #",
+"      # # # # # ",
+"   # # # # # # #",
+"      # # # # # ",
+"     # # # # # #",
+"      # # # # # ",
+"     # # # # # #",
+"        # # # # ",
+"   # # # # # # #",
+"  # #   # # # # ",
+"   #   # # # # #",
+"  # # # # # # # ",
+" # # # # # # # #",
+
+"                ",
+"                ",
+"        #   # # ",
+"         # # # #",
+"      #   # # # ",
+"     #     # # #",
+"            # # ",
+"       #   # # #",
+"    # #   # # # ",
+"       # # # # #",
+"  #   # # # # # ",
+"   # # # # # # #",
+"  # # # # # # # ",
+"   # # # # # # #",
+"  # # # # # # # ",
+" # # # # # # # #",
+
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"                ",
+"                ",
+"     #   #      ",
+"  #   # #       ",
+"   # # # # #    ",
+"    # # # #     ",
+"   # # # # #    ",
+"    # # # # #   ",
+"   # # # #      ",
+"    # # # # #   ",
+"     # # # #    ",
+"    # # # # #   ",
+"   # #   #      ",
+"                ",
+"                ",
+"                ",
+
+"################",
+"## # # # # # # #",
+"# # # # # # # ##",
+"## # #     # # #",
+"# # # # #   # ##",
+"## #   # # # # #",
+"# # #     # # ##",
+"## #       # # #",
+"# # #   # # # ##",
+"##   #     # # #",
+"# # # # # # # ##",
+"## #   # # # # #",
+"# # # # # # # ##",
+"## # # # # # # #",
+"# # # # # # # ##",
+"################",
+
+"  # #   # # # # ",
+" # # # # # # # #",
+"  # #   # # # # ",
+"   #   # # # #  ",
+"      #   # # # ",
+" #   # # # # # #",
+"  #     # # # # ",
+" #     #   # # #",
+"      #   #   # ",
+" # # # # #   # #",
+"  # # #   # #   ",
+" # # # #   # #  ",
+"    # #   # # # ",
+" # #   #   # # #",
+"    #     # # # ",
+"                ",
+
+"  # # # #   # # ",
+"   # #     # # #",
+"  # # # # # # # ",
+" # # # # # # #  ",
+"    #   # # # # ",
+" #   # #     # #",
+"  # # # # # # # ",
+" # #   # # # #  ",
+"  # #     # #   ",
+" # # # # # #   #",
+"  # # # # # # # ",
+" # # #   #   # #",
+"  # # #   # # # ",
+" # # # # # # # #",
+"  # # # # # # # ",
+"                ",
+
+"  # # #   # # # ",
+" # # # # # # #  ",
+"  # # # # #   # ",
+" # # #   # # #  ",
+"  # # # # # # # ",
+" # #   # # # # #",
+"  # #   # #   # ",
+" # # # # # # # #",
+"  # # # # #   # ",
+"   #   #       #",
+"  # # # # # # # ",
+" # # # # # # #  ",
+"  #   #     # # ",
+" # # # #   #    ",
+"  #   # #   # # ",
+"                ",
+
+"  # # #   # # # ",
+" # # # # # # #  ",
+"  # # # # #   # ",
+" # # #   # # #  ",
+"  # # # # # # # ",
+" # #   # # # # #",
+"  # #   # #   # ",
+" # # # # # # # #",
+"  # # # # #   # ",
+"   #   #       #",
+"  # # # # # # # ",
+" # # # # # # #  ",
+"  #   #     # # ",
+" # # # #   #    ",
+"  #   # #   # # ",
+"                ",
+
+"   # #   ##     ",
+" ##    #     #  ",
+"  #   ##  ##  ##",
+" # #   #   #   #",
+" # #    #### #  ",
+"##     ###      ",
+" #  ###  ##  #  ",
+" #  #  ##  ### #",
+"# ## # #  ##  ##",
+"   # #  #  # #  ",
+"  #   ##   #  ##",
+"   ## ## # ##  #",
+"## ####  # #    ",
+"#       ## #   #",
+"  #  # #        ",
+"    ##  #    #  ",
+
+"  ## #  ##      ",
+"   #    #   #  #",
+"   # ### ### ## ",
+"  ###  #### ##  ",
+" # #  ## ###  ##",
+"## # # # # ###  ",
+" #  ## #       #",
+"#   #   #    #  ",
+"#### ##  ###  ##",
+"  ###  # # #   #",
+"      ##   #  # ",
+"    ##   # #   #",
+" #       #    ##",
+"#   #  #    #   ",
+"  ####   ##  #  ",
+"    #       ##  ",
+
+"   #   #        ",
+"# # ##     #  # ",
+" ##   ##  #     ",
+" #  ##    ## # #",
+"#  #   # #     #",
+" #  #       #  #",
+"       # ##    #",
+" #   #  #   ##  ",
+" # # ##        #",
+" # # #   # # #  ",
+"  ##  ##  #     ",
+"    #  #     #  ",
+" #   # #   #   #",
+"##  #  ##   #   ",
+"   #  #  ###    ",
+"     #   #   #  ",
+
+"  #        #    ",
+"    ##  ##   #  ",
+"  ##   #  ## ## ",
+"###  #  #  ###  ",
+"   #     # # #  ",
+" #  ## ##  # # #",
+" ### #   ###  ##",
+"## # # ### ### #",
+"     ##  ### ## ",
+"## ##  ##  ### #",
+" # #  ## ##  #  ",
+"##  #   #  ### #",
+"  #  ### ###  ##",
+"    ##  ##  ##  ",
+"  ##  ##  ## ## ",
+"     # # # #    ",
+
+"   ####  #####  ",
+"# ## ########## ",
+" ###### #   # ##",
+"###   ########  ",
+"# ###### #######",
+"###########  ###",
+"   # #   #######",
+"########### ##  ",
+"## #### ########",
+" ######### ## ##",
+"## ##   ########",
+"######### ##   #",
+"  ##############",
+"##### ##   #####",
+"## ########## ##",
+"  ## ## ####### ",
+
+"  ####### ### # ",
+" ## ####### ##  ",
+"######  ########",
+"#   #######  ###",
+"######### ##### ",
+"###### ####### #",
+"## ##   ### ####",
+"############# ##",
+"##  ############",
+"###### ##  ### #",
+"################",
+"#  ## ### ### # ",
+"################",
+"## #####  ##  ##",
+" ##### ######## ",
+" ##  ##### #####",
+
+" #############  ",
+"####  ##########",
+" #######   #### ",
+"##  ######### ##",
+"######### ######",
+" ####  #########",
+"#   #######   ##",
+"#######  ###### ",
+"###########  ###",
+"##  ############",
+" #### ##  ######",
+"############  ##",
+"###  ##### #### ",
+"################",
+"# ######  ## ###",
+" ### #########  ",
+
+"  ### ########  ",
+"  ########  ####",
+" ###############",
+"#   ###  ###  ##",
+"################",
+"##########  ####",
+"#####  ##### ###",
+"#  ###### ######",
+"##### #####  ###",
+"######## #######",
+"###   ##########",
+"###########   ##",
+"#   ############",
+"############### ",
+"  # # #   ##    ",
+" ############## ",
+
+"                ",
+"     #       #  ",
+"        #       ",
+" #          #   ",
+"     ## ##      ",
+"    #  #  #  #  ",
+"    # # # #     ",
+"     # # #      ",
+" #  # # # #  #  ",
+"    #  #  #     ",
+"   # ## ##      ",
+"           #    ",
+"                ",
+"  #     #   #   ",
+"      #         ",
+"                ",
+
+"  ## #  ##      ",
+"   #    #   #  #",
+"   # ### ### ## ",
+"  ###  #### ##  ",
+" # #  ## ###  ##",
+"## # # # # ###  ",
+" #  ## #       #",
+"#   #   #    #  ",
+"#### ##  ###  ##",
+"  ###  # # #   #",
+"      ##   #  # ",
+"    ##   # #   #",
+" #       #    ##",
+"#   #  #    #   ",
+"  ####   ##  #  ",
+"    #       ##  ",
+
+"   #   #        ",
+"# # ##     #  # ",
+" ##   ##  #     ",
+" #  ##    ## # #",
+"#  #   # #     #",
+" #  #       #  #",
+"       # ##    #",
+" #   #  #   ##  ",
+" # # ##        #",
+" # # #   # # #  ",
+"  ##  ##  #     ",
+"    #  #     #  ",
+" #   # #   #   #",
+"##  #  ##   #   ",
+"   #  #  ###    ",
+"     #   #   #  ",
+
+"  #        #    ",
+"    ##  ##   #  ",
+"  ##   #  ## ## ",
+"###  #  #  ###  ",
+"   #     # # #  ",
+" #  ## ##  # # #",
+" ### #   ###  ##",
+"## # # ### ### #",
+"     ##  ### ## ",
+"## ##  ##  ### #",
+" # #  ## ##  #  ",
+"##  #   #  ### #",
+"  #  ### ###  ##",
+"    ##  ##  ##  ",
+"  ##  ##  ## ## ",
+"     # # # #    ",
+
+"                ",
+"  #          #  ",
+"        # # ## #",
+"   #       ##   ",
+" ###   #  ####  ",
+" ##   ## ## #  #",
+"  #   ## ####   ",
+" #### # # ## # #",
+"  # # #### ## # ",
+"  # ######  # # ",
+"#### #### ## ###",
+"  #  # ##  # # #",
+"  # ####  ##   #",
+" ### ##     # # ",
+" #  ##      ##  ",
+"  #  #  #       ",
+
+"                ",
+"#     # #    #  ",
+"#    #  # #  #  ",
+"###  ####  #    ",
+" ### #  ##  ##  ",
+" ## ##### #  ## ",
+"##### # ### ####",
+"## ## # ## ## ##",
+"##  #### ##### #",
+"###   ### ## ###",
+"## #   #  #    #",
+"## #    # ## # #",
+"#  #  # #       ",
+"     #  # #     ",
+" #   # #   #    ",
+"      #   #     ",
+
+"#               ",
+"  #       #     ",
+"  #             ",
+" # #   #   #   #",
+"# ##    ## #  ##",
+"### # ######## #",
+"  ##### ## ## ##",
+"########## #### ",
+"##### # #### ###",
+" #   ## ###  ## ",
+"## ##   ## #####",
+"#   # # #  # ###",
+"  #      # # ## ",
+"    #    #  ##  ",
+"#           #   ",
+"  #         #   ",
+
+"           #    ",
+"   #            ",
+"#     #     #   ",
+"#    #  #   ##  ",
+"  #  ##  ##  ## ",
+"  ##  #  ##  # #",
+"  ##  #  ###  # ",
+"# ######### # ##",
+"######### # # ##",
+"## #### # ######",
+"# # ##### # # # ",
+"# # # ##  # #   ",
+"### #      # ## ",
+" ##   # #  #  # ",
+"#     #   #     ",
+"#    #          ",
+
+"    #           ",
+"  ##            ",
+"  #     # #     ",
+" ###      #     ",
+"# ###  #  ##  ##",
+"  # #  ## ##   #",
+"#  ##  ######  #",
+" #### # ## ### #",
+"    # # ## ## # ",
+"  # ## ###  # # ",
+"##  ## ##    # #",
+" #     ## # ## #",
+" ## #  #  ##   #",
+" ### # #  #  # #",
+" #    #      #  ",
+"     #        # ",
+
+"                ",
+"#     #      #  ",
+"#   ##   #   #  ",
+" ### #          ",
+" #### #  #      ",
+"### ###  ##    #",
+" #### # ### #  #",
+"##### # ### #  #",
+"## ####### ### #",
+"##   # ##### ###",
+"## #   #  #    #",
+"## #  # ##  ## #",
+"#  # #  #    # #",
+"#    #  #     # ",
+"##   #   #   #  ",
+"  #   #         ",
+
+"#               ",
+"          #    #",
+"       #      # ",
+"    #      #    ",
+"#  ##   #  #   #",
+"   ##  ##  ## ##",
+"   ####### ## ##",
+"#  # ##  # # #  ",
+"#### #  #### # #",
+" #     ####  ###",
+"### # # ##  ####",
+"#   #        # #",
+" # #    #  # #  ",
+"#   ##   # # #  ",
+"#   #   #       ",
+"        #       ",
+
+"           #    ",
+"   #            ",
+"            #   ",
+"#    #     #   #",
+"  #   #   ##    ",
+"   #  #  ##   # ",
+"   # ##  ### #  ",
+"# ### # #   ### ",
+"####### # # ####",
+"##  ### # # ####",
+"#   ##### # # # ",
+"# # # ##    # # ",
+"  # #    # #   #",
+"     ##  ##     ",
+"  #      #      ",
+"#      #      # ",
+
+"################",
+"################",
+"####  ######  ##",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+"####  ######  ##",
+"###  ######  ###",
+"################",
+"################",
+
+"#### # # # # ###",
+"##### # # # ####",
+"###  # # # #  ##",
+"##  # #   # # ##",
+"## # # # # # ###",
+"##### #   # ####",
+"#### # # # # ###",
+"##### # # # ####",
+"#### # # # # ###",
+"##### # # # ####",
+"###  # # # #  ##",
+"##  # #   # # ##",
+"## # # # # # ###",
+"##### #   # ####",
+"#### # # # # ###",
+"##### # # # ####",
+
+"                ",
+"                ",
+"################",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # # # ## ",
+"  ### # # # # ##",
+"  ## # # # # # #",
+"   ## # # # # # ",
+"   ### # # # # #",
+"   ## # #   # # ",
+"    ## # #   # #",
+"    ### # # # # ",
+"     ### # # # #",
+"      ### # # # ",
+"       ### # # #",
+"        ##### # ",
+"          ######",
+"             ###",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"             ###",
+"          ### # ",
+"        ## # # #",
+"       ## # # # ",
+"      ## # # # #",
+"     ## # # # # ",
+"    ## # # # # #",
+"   ## # #   # # ",
+"   ### #   # # #",
+"   ## # # # # # ",
+"  ## # # # # # #",
+"  ### # # # # ##",
+"  ## # # # # ## ",
+"  ### # # # ##  ",
+
+"                ",
+"                ",
+"####            ",
+"# # ###         ",
+" # # # ##       ",
+"# # # # ##      ",
+" # # # # ##     ",
+"# # # # # ##    ",
+" # #   # # #    ",
+"# # #   # # #   ",
+" # # # # # ##   ",
+"# # # # # # #   ",
+"## # # # # # #  ",
+"### # # # # ##  ",
+" ### # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # # # #  ",
+" ## # # # # ##  ",
+"## # # # # # #  ",
+"# # # # # # #   ",
+" # # #   # ##   ",
+"# # #   # # #   ",
+" # # # # # #    ",
+"# # # # # ##    ",
+" # # # # ##     ",
+"# # # # ##      ",
+" # # # ##       ",
+"# # ####        ",
+"#######         ",
+"####            ",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ###   #   ##  ",
+"#### # # # # ###",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # ###",
+"  ### #   # # # ",
+"  ## # # # # # #",
+"  ### #   # #   ",
+"  ## # # # # # #",
+"  ### # # # # # ",
+"  ## # # # # # #",
+"  ### # # # #   ",
+"  ## # # # # # #",
+"  ### #   # # # ",
+"  ## # # # # ###",
+"  ### #   # ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"                ",
+"                ",
+"################",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+"#### # # # # ###",
+"#####   #   ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"#### # # # # #  ",
+"# # # #   # ##  ",
+" # # # # # # #  ",
+"#   # #   # ##  ",
+" # # # # # # #  ",
+"# # # # # # ##  ",
+" # # # # # # #  ",
+"#   # # # # ##  ",
+" # # # # # # #  ",
+"# # # #   # ##  ",
+"#### # # # # #  ",
+"##### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # # # #  ",
+"  ###       ##  ",
+"#### # # # # ###",
+"# # # # # # # # ",
+" # # # # # # # #",
+"#   # # # # #   ",
+" # # # ### # # #",
+"#   # ## ## #   ",
+" # # # ### # # #",
+"#   # # # # #   ",
+" # # # # # # # #",
+"# # # # # # # # ",
+"#### # # # # ###",
+"#####       ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"        #  #    ",
+"        #  #    ",
+"################",
+"# # # # # ### # ",
+" # # # ### # # #",
+"# # # # # ### # ",
+" # # # ### # # #",
+"#     # #  #  # ",
+" # # # ### # # #",
+"# # # # # ### # ",
+" # # # ### # # #",
+"# # # # # ### # ",
+"################",
+"################",
+"        #  #    ",
+"        #  #    ",
+
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"################",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"################",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+
+"################",
+"################",
+"################",
+"######### # ####",
+"################",
+"################",
+"## # ###########",
+"################",
+"################",
+"################",
+"################",
+"################",
+"###### # #######",
+"################",
+"################",
+"################",
+
+"################",
+"################",
+"####  ######  ##",
+"##### # # # # # ",
+" ##### # # # # #",
+"##### # # # # # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # # # # ##### ",
+" # # # # ##### #",
+"# # # # # ##### ",
+"####  ######  ##",
+"###  ######  ###",
+"################",
+"################",
+
+"#### # # #######",
+"##### # # ######",
+"###  # # #### ##",
+"##  # #   ### ##",
+"## # # # # # ###",
+"##### #   # ####",
+"#### # # # # ###",
+"##### # # # ####",
+"#### # # # # ###",
+"####### # # ####",
+"### #### # #  ##",
+"##  ###   # # ##",
+"## ##### # # ###",
+"##### #   # ####",
+"#### # # # # ###",
+"##### # # # ####",
+
+"                ",
+"                ",
+"################",
+"##### # # # # # ",
+" ##### # # # # #",
+"##### # # # # # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # # # # ##### ",
+" # # # # ##### #",
+"# # # # # ##### ",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ## # # #####  ",
+"  ### # # ####  ",
+"  ## # # #####  ",
+"  ### #   ####  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ##### # # ##  ",
+"  ###### # # #  ",
+"  #####   # ##  ",
+"  ###### # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # ###### ",
+"  ### # # ### ##",
+"  ## # # ##### #",
+"   ## # # ### # ",
+"   ### # # # # #",
+"   ## # #   # # ",
+"    ## # #   # #",
+"    ### # ### # ",
+"     ### ##### #",
+"      ### ##### ",
+"       ### ### #",
+"        ##### # ",
+"          ######",
+"             ###",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"             ###",
+"          ### # ",
+"        ## # # #",
+"       ## # # # ",
+"      ## # # # #",
+"     ## # # # # ",
+"    ## # # # # #",
+"   ## ###   ####",
+"   ######  #####",
+"   ###### # ####",
+"  ## ### # # # #",
+"  ### # # # # ##",
+"  ## # # # # ## ",
+"  ### # # # ##  ",
+
+"                ",
+"                ",
+"####            ",
+"# # ###         ",
+" # ### ##       ",
+"# ##### ##      ",
+" # ##### ##     ",
+"# # ### # ##    ",
+" # #   # # #    ",
+"# # #   # # #   ",
+" # # # # # ##   ",
+"# # ### # # #   ",
+"## ##### # # #  ",
+"### ### # # ##  ",
+" ####### # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # # # #  ",
+" ## # # # # ##  ",
+"## # # # ### #  ",
+"##### # #####   ",
+" #####  #####   ",
+"#####   ### #   ",
+" # # # # # #    ",
+"# # # # # ##    ",
+" # # # # ##     ",
+"# # # # ##      ",
+" # # # ##       ",
+"# # ####        ",
+"#######         ",
+"####            ",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ###   #   ##  ",
+"#### # # # # ###",
+"##### # # # # # ",
+" ##### # # # # #",
+"##### # # # # # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # # # # ##### ",
+" # # # # ##### #",
+"# # # # # ##### ",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ## # # #####  ",
+"  ### # # ####  ",
+"  ## # # #######",
+"  ### #   ### # ",
+"  ## # # # # # #",
+"  ### #   # #   ",
+"  ## # # # # # #",
+"  ### # # # # # ",
+"  ## # # # # # #",
+"  ##### # # #   ",
+"  ###### # # # #",
+"  #####   # # # ",
+"  ###### # # ###",
+"  ### #   # ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"                ",
+"                ",
+"################",
+"##### # # # # # ",
+" ##### # # # # #",
+"##### # # # # # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # # # # ##### ",
+" # # # # ##### #",
+"# # # # # ##### ",
+"#### # # # # ###",
+"#####   #   ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # #####  ",
+"  ### # # ####  ",
+"#### # # #####  ",
+"# # # #   ####  ",
+" # # # # # # #  ",
+"#   # #   # ##  ",
+" # # # # # # #  ",
+"# # # # # # ##  ",
+" # # # # # # #  ",
+"#   ### # # ##  ",
+" # ##### # # #  ",
+"# # ###   # ##  ",
+"######## # # #  ",
+"##### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # #####  ",
+"  ###     ####  ",
+"#### # # #######",
+"##### # # ### # ",
+" ##### # # # # #",
+"##### # # # #   ",
+" # # # ### # # #",
+"#   # ## ## #   ",
+" # # # ### # # #",
+"#   # # # # ####",
+" # # # # # #####",
+"# # ### # # ####",
+"######## # # ###",
+"#######     ####",
+"  ###### # # #  ",
+"  ### # # # ##  ",
+
+"        #  #    ",
+"        #  #    ",
+"################",
+"##### # # ### # ",
+" ##### ### # # #",
+"##### # # ### # ",
+" # # # ### # # #",
+"#     # #  #  # ",
+" # # # ### # # #",
+"# # # # # ##### ",
+" # # # ####### #",
+"# # # # # ##### ",
+"################",
+"################",
+"        #  #    ",
+"        #  #    ",
+
+"  ## # # #####  ",
+"  ### # # ####  ",
+"  ## # # #####  ",
+"  ### #   ####  ",
+"  ## # # # # #  ",
+"################",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"################",
+"  ##### # # ##  ",
+"  ###### # # #  ",
+"  #####   # ##  ",
+"  ###### # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"################",
+"################",
+"################",
+"######### # ####",
+"################",
+"################",
+"## # ###########",
+"################",
+"################",
+"################",
+"################",
+"################",
+"###### # #######",
+"################",
+"################",
+"################",
+
+"################",
+"################",
+"####  ######  ##",
+"# # ##### # # # ",
+" # # ##### # # #",
+"# # ##### # # # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # # ##### # # ",
+" # # ##### # # #",
+"# # # ##### # # ",
+"####  ######  ##",
+"###  ######  ###",
+"################",
+"################",
+
+"#### # # # # ###",
+"##### # # # ####",
+"###  # # # #  ##",
+"##  # #   # # ##",
+"## # # # #######",
+"#######   ######",
+"######## #######",
+"####### # ######",
+"######## # # ###",
+"##### # # # ####",
+"###  # # # #  ##",
+"##  # #   # # ##",
+"## # # # # # ###",
+"##### #   # ####",
+"#### # # # # ###",
+"##### # # # ####",
+
+"                ",
+"                ",
+"################",
+"# # ##### # # # ",
+" # # ##### # # #",
+"# # ##### # # # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # # ##### # # ",
+" # # ##### # # #",
+"# # # ##### # # ",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # #####  ",
+"  #####   ####  ",
+"  ###### #####  ",
+"  ##### # ####  ",
+"  ###### # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # # # ## ",
+"  ### # # # # ##",
+"  ## # # # ### #",
+"   ## # # ##### ",
+"   ### # # #####",
+"   ## # #   ### ",
+"    ## ###   # #",
+"    ####### # # ",
+"     ####### # #",
+"      ##### # # ",
+"       ### # # #",
+"        ##### # ",
+"          ######",
+"             ###",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"             ###",
+"          ### # ",
+"        ## # # #",
+"       ## # # # ",
+"      #### # # #",
+"     ###### # # ",
+"    ###### # # #",
+"   ## ###   # # ",
+"   ### #   ### #",
+"   ## # # ##### ",
+"  ## # # ##### #",
+"  ### # # ### ##",
+"  ## # # # # ## ",
+"  ### # # # ##  ",
+
+"                ",
+"                ",
+"####            ",
+"# # ###         ",
+" # # # ##       ",
+"# # # ####      ",
+" # # ######     ",
+"# # # ######    ",
+" # #   ### #    ",
+"# ###   # # #   ",
+" ##### # # ##   ",
+"# ##### # # #   ",
+"## ### # # # #  ",
+"### # # # # ##  ",
+" ### # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # # # #  ",
+" ## ### # # ##  ",
+"## ##### # # #  ",
+"# ##### # # #   ",
+" # ###   # ##   ",
+"# # #   ### #   ",
+" # # # #####    ",
+"# # # ######    ",
+" # # # ####     ",
+"# # # # ##      ",
+" # # # ##       ",
+"# # ####        ",
+"#######         ",
+"####            ",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ###   #   ##  ",
+"#### # # # # ###",
+"# # ##### # # # ",
+" # # ##### # # #",
+"# # ##### # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # ##### # # ",
+" # # ##### # # #",
+"# # # ##### # # ",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # ###",
+"  ### #   # # # ",
+"  ## # # ##### #",
+"  #####   ###   ",
+"  ###### ##### #",
+"  ##### # ### # ",
+"  ###### # # # #",
+"  ### # # # #   ",
+"  ## # # # # # #",
+"  ### #   # # # ",
+"  ## # # # # ###",
+"  ### #   # ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"                ",
+"                ",
+"################",
+"# # ##### # # # ",
+" # # ##### # # #",
+"# # ##### # # # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # # ##### # # ",
+" # # ##### # # #",
+"# # # ##### # # ",
+"#### # # # # ###",
+"#####   #   ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"#### # # # # #  ",
+"# # # #   # ##  ",
+" # # # # #####  ",
+"#   ###   ####  ",
+" # ##### #####  ",
+"# # ### # ####  ",
+" # ##### # # #  ",
+"#   # # # # ##  ",
+" # # # # # # #  ",
+"# # # #   # ##  ",
+"#### # # # # #  ",
+"##### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # # # #  ",
+"  ####    # ##  ",
+"######## #######",
+"# ##### # ### # ",
+" # ### # ##### #",
+"#   # # # ###   ",
+" # # # ### # # #",
+"#   # ## ## #   ",
+" # ### ### # # #",
+"#  #### # # ####",
+" # ##### # #####",
+"# # ### # # ####",
+"#### # # # # ###",
+"#####       ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"        #  #    ",
+"        #  #    ",
+"################",
+"# # ##### ### # ",
+" # # ##### # # #",
+"# # ##### ### # ",
+" # # # ### # # #",
+"#     # #  #  # ",
+" # # # ### # # #",
+"# # # ####### # ",
+" # # ##### # # #",
+"# # # ####### # ",
+"################",
+"################",
+"        #  #    ",
+"        #  #    ",
+
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # #####  ",
+"################",
+"  ###### #####  ",
+"  ##### # ####  ",
+"################",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+
+"################",
+"################",
+"####  ######  ##",
+"# # # # ##### # ",
+" # # # # ##### #",
+"# # # # ##### # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# ##### # # # # ",
+" ##### # # # # #",
+"# ##### # # # # ",
+"####  ######  ##",
+"###  ######  ###",
+"################",
+"################",
+
+"#### # # # # ###",
+"####### # # ####",
+"### #### # #  ##",
+"##  ###   # # ##",
+"## ##### # # ###",
+"##### #   # ####",
+"#### # # # # ###",
+"##### # # # ####",
+"#### # # #######",
+"##### # # ######",
+"###  # # #### ##",
+"##  # #   ### ##",
+"## # # # # # ###",
+"##### #   # ####",
+"#### # # # # ###",
+"####### # ######",
+
+"                ",
+"                ",
+"################",
+"# # # # ##### # ",
+" # # # # ##### #",
+"# # # # ##### # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# ##### # # # # ",
+" ##### # # # # #",
+"# ##### # # # # ",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ##### # # ##  ",
+"  ###### # # #  ",
+"  #####   # ##  ",
+"  ###### # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # #####  ",
+"  ### # # ####  ",
+"  ## # # #####  ",
+"  ### #   ####  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ##### # ####  ",
+
+"  ## # # # # ## ",
+"  ### # # # # ##",
+"  ## ### # # # #",
+"   ###### # ### ",
+"   ##### # #####",
+"   ######   ####",
+"    #### #   ###",
+"    ### # # # # ",
+"     ### # # # #",
+"      ### # # # ",
+"       ### # # #",
+"        ##### # ",
+"          ######",
+"             ###",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"             ###",
+"          ### # ",
+"        ###### #",
+"       ######## ",
+"      ## ##### #",
+"     ## # # # # ",
+"    ## # # # # #",
+"   ## # #   # # ",
+"   ### #   # # #",
+"   ## # # ### # ",
+"  ## # # ##### #",
+"  ### # ##### ##",
+"  ## # # ### ## ",
+"  ### # # # ##  ",
+
+"                ",
+"                ",
+"####            ",
+"# # ###         ",
+" # # # ##       ",
+"# # # # ##      ",
+" # # # # ##     ",
+"# # # # # ##    ",
+" ###   # ###    ",
+"#####   #####   ",
+" ##### # ####   ",
+"# ### # #####   ",
+"## # # # ### #  ",
+"### # # # # ##  ",
+" ### # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## ### # # #  ",
+" ## ##### # ##  ",
+"## ##### # # #  ",
+"# # ### # # #   ",
+" # # #   # ##   ",
+"# # #   # # #   ",
+" # # # # # #    ",
+"# # # # # ##    ",
+" # ##### ##     ",
+"# ########      ",
+" # ######       ",
+"# # ####        ",
+"#######         ",
+"####            ",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ###   #   ##  ",
+"#### # # # # ###",
+"# # # # ##### # ",
+" # # # # ##### #",
+"# # # # ##### # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# ##### # # # # ",
+" ##### # # # # #",
+"# ##### # # # # ",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ##### # # ##  ",
+"  ###### # # ###",
+"  #####   # # # ",
+"  ###### # # # #",
+"  ### #   # #   ",
+"  ## # # # # # #",
+"  ### # # # # # ",
+"  ## # # ##### #",
+"  ### # # ###   ",
+"  ## # # ##### #",
+"  ### #   ### # ",
+"  ## # # # # ###",
+"  ### #   # ####",
+"  ## # # # # #  ",
+"  ##### # ####  ",
+
+"                ",
+"                ",
+"################",
+"# # # # ##### # ",
+" # # # # ##### #",
+"# # # # ##### # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# ##### # # # # ",
+" ##### # # # # #",
+"# ##### # # # # ",
+"#### # # # # ###",
+"#####   #   ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # # # #  ",
+"  ##### # # ##  ",
+"######## # # #  ",
+"# # ###   # ##  ",
+" # ##### # # #  ",
+"#   # #   # ##  ",
+" # # # # # # #  ",
+"# # # # # # ##  ",
+" # # # # #####  ",
+"#   # # # ####  ",
+" # # # # #####  ",
+"# # # #   ####  ",
+"#### # # # # #  ",
+"##### #   # ##  ",
+"  ## # # # # #  ",
+"  ##### # ####  ",
+
+"  ###### # # #  ",
+"  #####     ##  ",
+"######## # #####",
+"# # # # # ##### ",
+" # # # # # #####",
+"#   # # # # ### ",
+" # # # ### # # #",
+"#   # ## ## #   ",
+" # # # ### # # #",
+"##### # # ###   ",
+"#### # # ##### #",
+"##### # ##### # ",
+"#### # # ### ###",
+"#####     # ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"        #  #    ",
+"        #  #    ",
+"################",
+"# # # # ##### # ",
+" # # # ####### #",
+"# # # # ##### # ",
+" # # # ### # # #",
+"#     # #  #  # ",
+" # # # ### # # #",
+"# ##### # ### # ",
+" ##### ### # # #",
+"# ##### # ### # ",
+"################",
+"################",
+"        #  #    ",
+"        #  #    ",
+
+"  ## # # # # #  ",
+"  ##### # # ##  ",
+"  ###### # # #  ",
+"  #####   # ##  ",
+"  ###### # # #  ",
+"################",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"################",
+"  ### # # ####  ",
+"  ## # # #####  ",
+"  ### #   ####  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ##### # ####  ",
+
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+
+"################",
+"################",
+"####  ######  ##",
+"# # # # # # ####",
+"## # # # # # ###",
+"# # # # # # ####",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"### # # # # # ##",
+"## # # # # # ###",
+"### # # # # # ##",
+"####  ######  ##",
+"###  ######  ###",
+"################",
+"################",
+
+"######## # # ###",
+"##### # # # ####",
+"###  # # # #  ##",
+"##  # #   # # ##",
+"## # # # # # ###",
+"##### #   # ####",
+"#### # # # # ###",
+"##### # # # ####",
+"#### # # # # ###",
+"##### # # # ####",
+"###  # # # #  ##",
+"##  # #   # # ##",
+"## # # # #######",
+"#######   ######",
+"######## #######",
+"####### # ######",
+
+"                ",
+"                ",
+"################",
+"# # # # # # ####",
+"## # # # # # ###",
+"# # # # # # ####",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"### # # # # # ##",
+"## # # # # # ###",
+"### # # # # # ##",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ###### # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # #####  ",
+"  #####   ####  ",
+"  ###### #####  ",
+"  ##### # ####  ",
+
+"  ###### # # ## ",
+"  ### # # # # ##",
+"  ## # # # # # #",
+"   ## # # # ####",
+"   ### # # # ###",
+"   ## # #   ####",
+"    ## # #   # #",
+"    ### # # # # ",
+"     ### # # # #",
+"      ### # # ##",
+"       ### # ###",
+"        ##### ##",
+"          ######",
+"             ###",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"             ###",
+"          ######",
+"        ## # ###",
+"       ## # ####",
+"      ## # # # #",
+"     ## # # # # ",
+"    ## # # # # #",
+"   ## # #   # ##",
+"   ### #   # ###",
+"   ## # # # # ##",
+"  ## # # ##### #",
+"  ##### # ### ##",
+"  ###### ###### ",
+"  ##### # ####  ",
+
+"                ",
+"                ",
+"####            ",
+"# # ###         ",
+"## # # ##       ",
+"# # # # ##      ",
+" # # # # ##     ",
+"# # # # # ##    ",
+" # #   # # #    ",
+"### #   # # #   ",
+"#### # # # ##   ",
+"### # # # # #   ",
+"## # # # #####  ",
+"### ### # ####  ",
+" ####### #####  ",
+"  ####### ####  ",
+
+"  ###### # # #  ",
+" ## # # # # ##  ",
+"## # # # # # #  ",
+"# # # # # # #   ",
+"## # #   # ##   ",
+"# # #   # # #   ",
+" # # # # # #    ",
+"# # # # # ##    ",
+" # # # # ##     ",
+"### # # ##      ",
+"## # # ##       ",
+"### ####        ",
+"#######         ",
+"####            ",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ###   #   ##  ",
+"#### # # # # ###",
+"# # # # # # ####",
+"## # # # # # ###",
+"# # # # # # ####",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"### # # # # # ##",
+"## # # # # # ###",
+"### # # # # # ##",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ###### # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # ###",
+"  ### #   # # # ",
+"  ## # # # # # #",
+"  ### #   # #   ",
+"  ## # # # # # #",
+"  ### # # # # # ",
+"  ## # # # # # #",
+"  ### # # # #   ",
+"  ## # # # # # #",
+"  ### #   # # # ",
+"  ## # # #######",
+"  #####   ######",
+"  ###### #####  ",
+"  ##### # ####  ",
+
+"                ",
+"                ",
+"################",
+"# # # # # # ####",
+"## # # # # # ###",
+"# # # # # # ####",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"### # # # # # ##",
+"## # # # # # ###",
+"### # # # # # ##",
+"#### # # # # ###",
+"#####   #   ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ###### # # #  ",
+"  ### # # # ##  ",
+"#### # # # # #  ",
+"# # # #   # ##  ",
+" # # # # # # #  ",
+"#   # #   # ##  ",
+" # # # # # # #  ",
+"# # # # # # ##  ",
+" # # # # # # #  ",
+"#   # # # # ##  ",
+" # # # # # # #  ",
+"# # # #   # ##  ",
+"#### # # #####  ",
+"#######   ####  ",
+"  ###### #####  ",
+"  ##### # ####  ",
+
+"  ###### # # #  ",
+"  ### #     ##  ",
+"#### # # # # ###",
+"# # # # # # ####",
+"## # # # # # ###",
+"#   # # # # ####",
+" # # # ### # # #",
+"#   # ## ## #   ",
+" # # # ### # # #",
+"### # # # # # ##",
+"## # # # # # ###",
+"### # # # # # ##",
+"#### # # #######",
+"#######   ######",
+"  ###### #####  ",
+"  ##### # ####  ",
+
+"        #  #    ",
+"        #  #    ",
+"################",
+"# # # # # ######",
+"## # # ### # ###",
+"# # # # # ######",
+" # # # ### # # #",
+"#     # #  #  # ",
+" # # # ### # # #",
+"### # # # ### ##",
+"## # # ### # ###",
+"### # # # ### ##",
+"################",
+"################",
+"        #  #    ",
+"        #  #    ",
+
+"  ###### # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"################",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"################",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # #####  ",
+"  #####   ####  ",
+"  ###### #####  ",
+"  ##### # ####  ",
+
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+
+"################",
+"################",
+"####  ######  ##",
+"##### # ##### # ",
+" ##### # ##### #",
+"##### # ##### # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# ##### # ##### ",
+" ##### # ##### #",
+"# ##### # ##### ",
+"####  ######  ##",
+"###  ######  ###",
+"################",
+"################",
+
+"#### # # #######",
+"####### # ######",
+"### #### #### ##",
+"##  ###   ### ##",
+"## ##### # # ###",
+"##### #   # ####",
+"#### # # # # ###",
+"##### # # # ####",
+"#### # # #######",
+"####### # ######",
+"### #### #### ##",
+"##  ###   ### ##",
+"## ##### # # ###",
+"##### #   # ####",
+"#### # # # # ###",
+"##### # # # ####",
+
+"                ",
+"                ",
+"################",
+"##### # ##### # ",
+" ##### # ##### #",
+"##### # ##### # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# ##### # ##### ",
+" ##### # ##### #",
+"# ##### # ##### ",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ## # # #####  ",
+"  ##### # ####  ",
+"  ###### #####  ",
+"  #####   ####  ",
+"  ###### # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # #####  ",
+"  ##### # ####  ",
+"  ###### #####  ",
+"  #####   ####  ",
+"  ###### # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # # #### ",
+"  ##### # ######",
+"  ###### # #####",
+"   #### # # ### ",
+"   ##### # # # #",
+"   ## # #   # # ",
+"    ## ###   # #",
+"    ####### # # ",
+"     ####### # #",
+"      ##### ####",
+"       ### #####",
+"        ########",
+"          ######",
+"             ###",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"             ###",
+"          ### # ",
+"        ## # # #",
+"       #### # # ",
+"      ###### # #",
+"     ###### # # ",
+"    ## ### # # #",
+"   ## # #   # # ",
+"   ### #   # ###",
+"   #### # # ####",
+"  ###### # #####",
+"  ##### # # ####",
+"  ###### # # ## ",
+"  ### # # # ##  ",
+
+"                ",
+"                ",
+"####            ",
+"#######         ",
+" ##### ##       ",
+"##### # ##      ",
+" # # # ####     ",
+"# # # ######    ",
+" # #   #####    ",
+"# ###   ### #   ",
+" ##### # # ##   ",
+"# ##### # # #   ",
+"## ### # # # #  ",
+"### # # # # ##  ",
+" ### # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # #####  ",
+" #### # # ####  ",
+"###### # #####  ",
+"##### # # ###   ",
+" ### #   # ##   ",
+"# # #   # # #   ",
+" # # # # # #    ",
+"# # # ### ##    ",
+" # # ######     ",
+"# # ######      ",
+" # # ####       ",
+"# # ####        ",
+"#######         ",
+"####            ",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ###   #   ##  ",
+"#### # # # # ###",
+"##### # ##### # ",
+" ##### # ##### #",
+"##### # ##### # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# ##### # ##### ",
+" ##### # ##### #",
+"# ##### # ##### ",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ## # # #####  ",
+"  ##### # ####  ",
+"  ###### #######",
+"  #####   ### # ",
+"  ###### # # # #",
+"  ### #   # #   ",
+"  ## # # # # # #",
+"  ### # # # # # ",
+"  ## # # ##### #",
+"  ##### # ###   ",
+"  ###### ##### #",
+"  #####   ### # ",
+"  ###### # # ###",
+"  ### #   # ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"                ",
+"                ",
+"################",
+"##### # ##### # ",
+" ##### # ##### #",
+"##### # ##### # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# ##### # ##### ",
+" ##### # ##### #",
+"# ##### # ##### ",
+"#### # # # # ###",
+"#####   #   ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # #####  ",
+"  ##### # ####  ",
+"######## #####  ",
+"# #####   ####  ",
+" # ##### # # #  ",
+"#   # #   # ##  ",
+" # # # # # # #  ",
+"# # # # # # ##  ",
+" # # # # #####  ",
+"#   ### # ####  ",
+" # ##### #####  ",
+"# # ###   ####  ",
+"######## # # #  ",
+"##### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # # # #  ",
+"  ###       ##  ",
+"#### # # # # ###",
+"##### # ##### # ",
+" ##### # ##### #",
+"##### # #####   ",
+" # # # ### # # #",
+"#   # ## ## #   ",
+" # # # ### # # #",
+"# ##### # ##### ",
+" ##### # ##### #",
+"# ##### # ##### ",
+"#### # # # # ###",
+"#####       ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"        #  #    ",
+"        #  #    ",
+"################",
+"##### # ##### # ",
+" ##### ####### #",
+"##### # ##### # ",
+" # # # ### # # #",
+"#     # #  #  # ",
+" # # # ### # # #",
+"# ##### # ##### ",
+" ##### ####### #",
+"# ##### # ##### ",
+"################",
+"################",
+"        #  #    ",
+"        #  #    ",
+
+"  ## # # #####  ",
+"  ##### # ####  ",
+"  ###### #####  ",
+"  #####   ####  ",
+"  ###### # # #  ",
+"################",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"################",
+"  ##### # ####  ",
+"  ###### #####  ",
+"  #####   ####  ",
+"  ###### # # #  ",
+"  ### #   # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+
+"################",
+"################",
+"####  ######  ##",
+"# ##### # ##### ",
+" # ##### # #####",
+"# ##### # ##### ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"##### # ##### # ",
+"#### # ##### # #",
+"##### # ##### # ",
+"####  ######  ##",
+"###  ######  ###",
+"################",
+"################",
+
+"######## # # ###",
+"####### # # ####",
+"### #### #### ##",
+"##  # #   ### ##",
+"## # # # #######",
+"##### #   ######",
+"#### # # # # ###",
+"####### # # ####",
+"######## # # ###",
+"####### # # ####",
+"### #### #### ##",
+"##  # #   ### ##",
+"## # # # #######",
+"##### #   ######",
+"#### # # # # ###",
+"####### # # ####",
+
+"                ",
+"                ",
+"################",
+"# ##### # ##### ",
+" # ##### # #####",
+"# ##### # ##### ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"##### # ##### # ",
+"#### # ##### # #",
+"##### # ##### # ",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ###### # # #  ",
+"  ##### # # ##  ",
+"  ###### #####  ",
+"  ### #   ####  ",
+"  ## # # #####  ",
+"  ### #   ####  ",
+"  ## # # # # #  ",
+"  ##### # # ##  ",
+"  ###### # # #  ",
+"  ##### # # ##  ",
+"  ###### #####  ",
+"  ### #   ####  ",
+"  ## # # #####  ",
+"  ### #   ####  ",
+"  ## # # # # #  ",
+"  ##### # # ##  ",
+
+"  ###### # # ## ",
+"  ##### # # ####",
+"  ###### # #####",
+"   ## # # # ####",
+"   ##### # # ###",
+"   ######   # # ",
+"    ######   # #",
+"    ##### ### # ",
+"     ### ##### #",
+"      ### ##### ",
+"       ### ### #",
+"        ##### # ",
+"          ######",
+"             ###",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"             ###",
+"          ### # ",
+"        ###### #",
+"       ###### # ",
+"      ## ### # #",
+"     ## # # # # ",
+"    #### # # # #",
+"   ######   # # ",
+"   #####   # # #",
+"   #### # # ### ",
+"  ## # # # #####",
+"  ### # # ######",
+"  ## # # # #### ",
+"  ##### # # ##  ",
+
+"                ",
+"                ",
+"####            ",
+"# #####         ",
+" # ######       ",
+"# ##### ##      ",
+" # # # # ##     ",
+"# # # # ####    ",
+" # #   #####    ",
+"#####   #####   ",
+"#### # # ####   ",
+"##### # # # #   ",
+"## # # # # # #  ",
+"### # # # # ##  ",
+" ### # # # # #  ",
+"  ##### # # ##  ",
+
+"  ###### # # #  ",
+" ###### # ####  ",
+"## ### # #####  ",
+"# # # # # ###   ",
+" # # #   ####   ",
+"# # #   # ###   ",
+" # # # # # #    ",
+"# # # # # ##    ",
+" # ### # ##     ",
+"# ##### ##      ",
+" ########       ",
+"# ######        ",
+"#######         ",
+"####            ",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ###   #   ##  ",
+"#### # # # # ###",
+"# ##### # ##### ",
+" # ##### # #####",
+"# ##### # ##### ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"##### # ##### # ",
+"#### # ##### # #",
+"##### # ##### # ",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ###### # # #  ",
+"  ##### # # ##  ",
+"  ###### #######",
+"  ### #   ### # ",
+"  ## # # ##### #",
+"  ### #   ###   ",
+"  ## # # # # # #",
+"  ##### # # # # ",
+"  ###### # # # #",
+"  ##### # # #   ",
+"  ###### ##### #",
+"  ### #   ### # ",
+"  ## # # #######",
+"  ### #   ######",
+"  ## # # # # #  ",
+"  ##### # # ##  ",
+
+"                ",
+"                ",
+"################",
+"# ##### # ##### ",
+" # ##### # #####",
+"# ##### # ##### ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"##### # ##### # ",
+"#### # ##### # #",
+"##### # ##### # ",
+"#### # # # # ###",
+"#####   #   ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ###### # # #  ",
+"  ##### # # ##  ",
+"######## #####  ",
+"# # # #   ####  ",
+" # # # # #####  ",
+"#   # #   ####  ",
+" # # # # # # #  ",
+"# # ### # # ##  ",
+" # ##### # # #  ",
+"#   ### # # ##  ",
+" # ##### #####  ",
+"# # # #   ####  ",
+"#### # # #####  ",
+"##### #   ####  ",
+"  ## # # # # #  ",
+"  ##### # # ##  ",
+
+"  ## # # # # #  ",
+"  ###       ##  ",
+"#### # # # # ###",
+"# # ##### # ####",
+"## # ##### # ###",
+"#   ##### # ####",
+" # # # ### # # #",
+"#   # ## ## #   ",
+" # # # ### # # #",
+"### # ##### # ##",
+"## # ##### # ###",
+"### # ##### # ##",
+"#### # # # # ###",
+"#####       ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"        #  #    ",
+"        #  #    ",
+"################",
+"# ##### # ##### ",
+" # ####### #####",
+"# ##### # ##### ",
+" # # # ### # # #",
+"#     # #  #  # ",
+" # # # ### # # #",
+"##### # ##### # ",
+"#### # ##### # #",
+"##### # ##### # ",
+"################",
+"################",
+"        #  #    ",
+"        #  #    ",
+
+"  ###### # # #  ",
+"  ##### # # ##  ",
+"  ###### #####  ",
+"  ### #   ####  ",
+"  ## # # #####  ",
+"################",
+"  ## # # # # #  ",
+"  ##### # # ##  ",
+"################",
+"  ##### # # ##  ",
+"  ###### #####  ",
+"  ### #   ####  ",
+"  ## # # #####  ",
+"  ### #   ####  ",
+"  ## # # # # #  ",
+"  ##### # # ##  ",
+
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+
+"################",
+"################",
+"####  ######  ##",
+"# # ##### # ####",
+"## # ##### # ###",
+"# # ##### # ####",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"### # ##### # ##",
+"## # ##### # ###",
+"### # ##### # ##",
+"####  ######  ##",
+"###  ######  ###",
+"################",
+"################",
+
+"######## # # ###",
+"##### # # # ####",
+"###  # # # #  ##",
+"##  # #   # # ##",
+"## # # # #######",
+"#######   ######",
+"######## #######",
+"####### # ######",
+"######## # # ###",
+"##### # # # ####",
+"###  # # # #  ##",
+"##  # #   # # ##",
+"## # # # #######",
+"#######   ######",
+"######## #######",
+"####### # ######",
+
+"                ",
+"                ",
+"################",
+"# # ##### # ####",
+"## # ##### # ###",
+"# # ##### # ####",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"### # ##### # ##",
+"## # ##### # ###",
+"### # ##### # ##",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ###### # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # #####  ",
+"  #####   ####  ",
+"  ###### #####  ",
+"  ##### # ####  ",
+"  ###### # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # #####  ",
+"  #####   ####  ",
+"  ###### #####  ",
+"  ##### # ####  ",
+
+"  ###### # # ## ",
+"  ### # # # # ##",
+"  ## ### # # ###",
+"   ###### # ####",
+"   ####### # ###",
+"   ## ###   # ##",
+"    ## # ##  # #",
+"    ### ##### # ",
+"     ######### #",
+"      ####### ##",
+"       ### # ###",
+"        ##### ##",
+"          ######",
+"             ###",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"             ###",
+"          ######",
+"        #### ###",
+"       ## # ####",
+"      #### # # #",
+"     ###### # # ",
+"    ###### # # #",
+"   ## ###   # ##",
+"   # # #   # ###",
+"   ## # # # # ##",
+"  ## # # # ### #",
+"  ##### # ######",
+"  ###### ###### ",
+"  ##### # ####  ",
+
+"                ",
+"                ",
+"####            ",
+"# # ###         ",
+"## # ####       ",
+"# # ######      ",
+" # # ######     ",
+"# # # ### ##    ",
+" # #   # # #    ",
+"### #   # ###   ",
+"## # # # ####   ",
+"### # # # ###   ",
+"## # # # #####  ",
+"### ### # ####  ",
+" ####### # # #  ",
+"  ##### # # ##  ",
+
+"  ###### # # #  ",
+" ## # # # # ##  ",
+"## # # # # # #  ",
+"# # # # # # #   ",
+"## # #   ####   ",
+"# # #   #####   ",
+" # # # #####    ",
+"# # # # ####    ",
+" # # # # ##     ",
+"### # # ##      ",
+"## # # ##       ",
+"### ####        ",
+"#######         ",
+"####            ",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ###   #   ##  ",
+"#### # # # # ###",
+"# # ##### # ####",
+"## # ##### # ###",
+"# # ##### # ####",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"### # ##### # ##",
+"## # ##### # ###",
+"### # ##### # ##",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ###### # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # ###",
+"  ### #   # # # ",
+"  ## # # ##### #",
+"  #####   ###   ",
+"  ###### ##### #",
+"  ##### # ### # ",
+"  ###### # # # #",
+"  ### # # # #   ",
+"  ## # # # # # #",
+"  ### #   # # # ",
+"  ## # # #######",
+"  #####   ######",
+"  ###### #####  ",
+"  ##### # ####  ",
+
+"                ",
+"                ",
+"################",
+"# # ##### # ####",
+"## # ##### # ###",
+"# # ##### # ####",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"### # ##### # ##",
+"## # ##### # ###",
+"### # ##### # ##",
+"#### # # # # ###",
+"#####   #   ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ###### # # #  ",
+"  ### # # # ##  ",
+"#### # # # # #  ",
+"# # # #   # ##  ",
+" # # # # #####  ",
+"#   ###   ####  ",
+" # ##### #####  ",
+"# # ### # ####  ",
+" # ##### # # #  ",
+"#   # # # # ##  ",
+" # # # # # # #  ",
+"# # # #   # ##  ",
+"#### # # #####  ",
+"#######   ####  ",
+"  ###### #####  ",
+"  ##### # ####  ",
+
+"  ###### # # #  ",
+"  ### #     ##  ",
+"#### # # # # ###",
+"# # # # # # # # ",
+" # # # # ##### #",
+"#   ### # ###   ",
+" # ########### #",
+"#   #### ####   ",
+" # ####### # # #",
+"#   # # # # #   ",
+" # # # # # # # #",
+"# # # # # # # # ",
+"#### # # #######",
+"#######   ######",
+"  ###### #####  ",
+"  ##### # ####  ",
+
+"        #  #    ",
+"        #  #    ",
+"################",
+"# # ##### ######",
+"## # ##### # ###",
+"# # ##### ######",
+" # # # ### # # #",
+"#     # #  #  # ",
+" # # # ### # # #",
+"### # ####### ##",
+"## # ##### # ###",
+"### # ####### ##",
+"################",
+"################",
+"        #  #    ",
+"        #  #    ",
+
+"  ###### # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # #####  ",
+"################",
+"  ###### #####  ",
+"  ##### # ####  ",
+"################",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### #   # ##  ",
+"  ## # # #####  ",
+"  #####   ####  ",
+"  ###### #####  ",
+"  ##### # ####  ",
+
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+
+"################",
+"################",
+"####  ######  ##",
+"### # ##### # ##",
+"#### # ##### # #",
+"### # ##### # ##",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # ##### # ####",
+" # ##### # #####",
+"# # ##### # ####",
+"####  ######  ##",
+"###  ######  ###",
+"################",
+"################",
+
+"#### # # #######",
+"##### # # ######",
+"###  # # # #  ##",
+"##  ###   # # ##",
+"## ##### # # ###",
+"#######   # ####",
+"######## #######",
+"##### # # ######",
+"#### # # #######",
+"##### # # ######",
+"###  # # # #  ##",
+"##  ###   # # ##",
+"## ##### # # ###",
+"#######   # ####",
+"######## #######",
+"##### # # ######",
+
+"                ",
+"                ",
+"################",
+"### # ##### # ##",
+"#### # ##### # #",
+"### # ##### # ##",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # ##### # ####",
+" # ##### # #####",
+"# # ##### # ####",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ## # # #####  ",
+"  ### # # ####  ",
+"  ## # # # # #  ",
+"  #####   # ##  ",
+"  ###### # # #  ",
+"  #####   # ##  ",
+"  ###### #####  ",
+"  ### # # ####  ",
+"  ## # # #####  ",
+"  ### # # ####  ",
+"  ## # # # # #  ",
+"  #####   # ##  ",
+"  ###### # # #  ",
+"  #####   # ##  ",
+"  ###### #####  ",
+"  ### # # ####  ",
+
+"  ## # # ###### ",
+"  ##### # ### ##",
+"  ###### # # # #",
+"   ###### # # ##",
+"   ##### # # # #",
+"   ## # #   # ##",
+"    ## ###   # #",
+"    ####### # # ",
+"     ####### # #",
+"      ##### ####",
+"       ### #####",
+"        ########",
+"          ######",
+"             ###",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"             ###",
+"          ######",
+"        #### # #",
+"       #### # ##",
+"      ###### # #",
+"     ###### # # ",
+"    ## ### # # #",
+"   ## # #   # # ",
+"   # # #   # ###",
+"   #### # # ####",
+"  ###### # #####",
+"  ##### # # ####",
+"  ###### ###### ",
+"  ### # # ####  ",
+
+"                ",
+"                ",
+"####            ",
+"### ###         ",
+"#### # ##       ",
+"### # ####      ",
+" # # ######     ",
+"# # # ######    ",
+" # #   ### #    ",
+"# # #   # # #   ",
+" # ### # # ##   ",
+"# ##### # # #   ",
+"## ##### # # #  ",
+"### ### # # ##  ",
+" ### # # #####  ",
+"  ### # # ####  ",
+
+"  ## # # #####  ",
+" ## # # # ####  ",
+"## # # # # # #  ",
+"### # # # # #   ",
+"#### #   # ##   ",
+"### #   # # #   ",
+" # # # ### #    ",
+"# # # ######    ",
+" # # ######     ",
+"# # # ####      ",
+" # # # ##       ",
+"# # # ##        ",
+"#######         ",
+"####            ",
+"                ",
+"                ",
+
+"  ## # # # # #  ",
+"  ###   #   ##  ",
+"#### # # # # ###",
+"### # ##### # ##",
+"#### # ##### # #",
+"### # ##### # ##",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # ##### # ####",
+" # ##### # #####",
+"# # ##### # ####",
+"################",
+"################",
+"                ",
+"                ",
+
+"  ## # # #####  ",
+"  ### # # ####  ",
+"  ## # # # # ###",
+"  #####   # # # ",
+"  ###### # # # #",
+"  #####   # #   ",
+"  ###### ##### #",
+"  ### # # ### # ",
+"  ## # # ##### #",
+"  ### # # ###   ",
+"  ## # # # # # #",
+"  #####   # # # ",
+"  ###### # # ###",
+"  #####   # ####",
+"  ###### #####  ",
+"  ### # # ####  ",
+
+"                ",
+"                ",
+"################",
+"### # ##### # ##",
+"#### # ##### # #",
+"### # ##### # ##",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # ##### # ####",
+" # ##### # #####",
+"# # ##### # ####",
+"#### # # # # ###",
+"#####   #   ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"  ## # # #####  ",
+"  ### # # ####  ",
+"#### # # # # #  ",
+"# # ###   # ##  ",
+" # ##### # # #  ",
+"#   ###   # ##  ",
+" # ##### #####  ",
+"# # # # # ####  ",
+" # # # # #####  ",
+"#   # # # ####  ",
+" # # # # # # #  ",
+"# # ###   # ##  ",
+"######## # # #  ",
+"#######   # ##  ",
+"  ###### #####  ",
+"  ### # # ####  ",
+
+"  ## # # #####  ",
+"  #####   ####  ",
+"######## #######",
+"# # ### # ### # ",
+" # ##### # # # #",
+"#   # # # # #   ",
+" # # # ### # # #",
+"#   # ## ## #   ",
+" # # # ####### #",
+"#   ### # ###   ",
+" # ##### ##### #",
+"# # ### # ### # ",
+"######## # # ###",
+"##### #     ####",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"        #  #    ",
+"        #  #    ",
+"################",
+"### # ####### ##",
+"#### # ##### # #",
+"### # ####### ##",
+" # # # ### # # #",
+"#     # #  #  # ",
+" # # # ### # # #",
+"# # ##### ######",
+" # ####### #####",
+"# # ##### ######",
+"################",
+"################",
+"        #  #    ",
+"        #  #    ",
+
+"  ## # # #####  ",
+"  ### # # ####  ",
+"  ## # # # # #  ",
+"  #####   # ##  ",
+"  ###### # # #  ",
+"################",
+"  ###### #####  ",
+"  ### # # ####  ",
+"################",
+"  ### # # ####  ",
+"  ## # # # # #  ",
+"  #####   # ##  ",
+"  ###### # # #  ",
+"  #####   # ##  ",
+"  ###### #####  ",
+"  ### # # ####  ",
+
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+
+"################",
+"######## ## ####",
+"################",
+"######## ## ####",
+"################",
+"######## ## ####",
+"################",
+"######## ## ####",
+"################",
+"######## ## ####",
+"################",
+"######## ## ####",
+"################",
+"######## ## ####",
+"################",
+"######## ## ####",
+
+"################",
+"################",
+"################",
+"################",
+"################",
+" # # # # # # # #",
+"################",
+"################",
+" # # # # # # # #",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"################",
+"        #       ",
+"        ##      ",
+"################",
+"      #         ",
+"     #          ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        ## #    ",
+"        ####    ",
+"        #  #    ",
+"       ##  #    ",
+"      # #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #####",
+"        # ##    ",
+"        ###     ",
+"        ########",
+"       #        ",
+"      #         ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"         #######",
+"        ##      ",
+"        ###     ",
+"        ########",
+"        #  #    ",
+"       ##  #    ",
+"      # #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"###########     ",
+"          ##    ",
+"         ###    ",
+"########## #    ",
+"       ##  #    ",
+"      # #  #    ",
+"     #  #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"#########  #    ",
+"        ## #    ",
+"        ####    ",
+"###########     ",
+"      #         ",
+"     #          ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"################",
+"        #  #    ",
+"        ## #    ",
+"################",
+"      #         ",
+"     #          ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        ## #    ",
+"        ########",
+"        #  #    ",
+"       ### #    ",
+"      # # ######",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"################",
+"         #      ",
+"         ##     ",
+"################",
+"       ##  #    ",
+"      # #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"############    ",
+"        # ##    ",
+"        ## #    ",
+"############    ",
+"       ##  #    ",
+"      # #  #    ",
+"     #  #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"################",
+"        # ##    ",
+"        ## #    ",
+"################",
+"       ##  #    ",
+"      # #  #    ",
+"     #  #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+" ##  ## #### ## ",
+" ##  ## #### ## ",
+"################",
+" ##  ## #### ## ",
+" ##  ## #### ## ",
+" ##  ## #### ## ",
+" ##  ## #### ## ",
+"################",
+" ##  ## #### ## ",
+" ##  ## #### ## ",
+"        #  #    ",
+"        #  #    ",
+"        #  #    ",
+
+"     #    #     ",
+"   ##########   ",
+"   ##########   ",
+"     #    #     ",
+"     #    #     ",
+"################",
+"   ##########   ",
+"     #    #     ",
+"################",
+"   ##########   ",
+"   ##########   ",
+"     #    #     ",
+"     #    #     ",
+"   ##########   ",
+"   ##########   ",
+"     #    #     ",
+
+" ###############",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+" ###############",
+
+"################",
+"################",
+"################",
+"##    ####    ##",
+"################",
+"################",
+"################",
+"################",
+"################",
+"################",
+"##    ####    ##",
+"################",
+"################",
+"################",
+"################",
+"################",
+
+"################",
+"#### ###### ####",
+"#### ###### ####",
+"#### ###### ####",
+"#### ###### ####",
+"################",
+"################",
+"################",
+"################",
+"#### ###### ####",
+"#### ###### ####",
+"#### ###### ####",
+"#### ###### ####",
+"################",
+"################",
+"################",
+
+"                ",
+"                ",
+"                ",
+" ##  ##  ##  ## ",
+" ##  ##  ##  ## ",
+"################",
+" ##  ##  ##  ## ",
+" ##  ##  ##  ## ",
+" ##  ##  ##  ## ",
+" ##  ##  ##  ## ",
+"################",
+" ##  ##  ##  ## ",
+" ##  ##  ##  ## ",
+"                ",
+"                ",
+"                ",
+
+"     #    #     ",
+"   ##########   ",
+"   ##########   ",
+"     #    #     ",
+"     #    #     ",
+"   ##########   ",
+"   ##########   ",
+"     #    #     ",
+"     #    #     ",
+"   ##########   ",
+"   ##########   ",
+"     #    #     ",
+"     #    #     ",
+"   ##########   ",
+"   ##########   ",
+"     #    #     ",
+
+"     #    ##    ",
+"     #    ###   ",
+"      #  ###    ",
+"      #### # ## ",
+"     ####   ### ",
+"      ##     ###",
+"        #   ##  ",
+"         #  ##  ",
+"          ###   ",
+"          ####  ",
+"          ##  ##",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"          #   ##",
+"         #####  ",
+"          ###   ",
+"         # ##   ",
+"        #   ##  ",
+"       #    ####",
+"     ###     ## ",
+"     ####   ####",
+"      ######  # ",
+"     #   ####   ",
+"     #    ###   ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"##   #          ",
+"  #####         ",
+"    ##          ",
+"   ####         ",
+"  ###  #        ",
+"####    #       ",
+" ##     ###     ",
+" ###   ####     ",
+"    ######      ",
+"   ####   #     ",
+"   ###    #     ",
+
+"   # #    #     ",
+"  ###     #     ",
+"   ####   #     ",
+"## # #####      ",
+" ##    ###      ",
+"###     ###     ",
+"  ##   # #      ",
+"  ##  #         ",
+"   ###          ",
+"   ###          ",
+"### ##          ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"     #    #     ",
+"    ###   ##    ",
+"    # #  # #    ",
+"   #  #  #  #   ",
+" ##   #  #   ## ",
+"################",
+"       ##       ",
+"      ####      ",
+"    ##    ##    ",
+" ###        ### ",
+"################",
+"                ",
+"      ###       ",
+"        #       ",
+"        ##      ",
+"        #       ",
+
+"     ##   ##    ",
+"     ##   ##    ",
+"     ##   # #   ",
+"     # #  #  #  ",
+"     # #  #   ##",
+" ##  #  # #    #",
+"  #  #   ##  ###",
+"  #  #    ###   ",
+"  #  #    ###   ",
+" ### #   ##  ###",
+"     #  # #    #",
+"     # #  #   ##",
+"     # #  #  #  ",
+"     ##   # #   ",
+"     ##   ##    ",
+"     ##   ##    ",
+
+"        #       ",
+"        ##      ",
+"        #       ",
+"      ###       ",
+"                ",
+"################",
+" ###        ### ",
+"    ##    ##    ",
+"      ####      ",
+"       ##       ",
+"################",
+" ##   #  #   ## ",
+"   #  #  #  #   ",
+"    # #  # #    ",
+"    ###   ##    ",
+"     #    #     ",
+
+"    ##   ##     ",
+"    ##   ##     ",
+"   # #   ##     ",
+"  #  #  # #     ",
+"##   #  # #     ",
+"#    # #  #  ## ",
+"###  ##   #  #  ",
+"   ###    #  #  ",
+"   ###    #  #  ",
+"###  ##   # ### ",
+"#    # #  #     ",
+"##   #  # #     ",
+"  #  #  # #     ",
+"   # #   ##     ",
+"    ##   ##     ",
+"    ##   ##     ",
+
+"                ",
+"   ##########   ",
+"   ##########   ",
+" ##  #    #  ## ",
+" ##  #    #  ## ",
+"################",
+" ##  #    #  ## ",
+" ##  #    #  ## ",
+" ##  #    #  ## ",
+" ##  #    #  ## ",
+"################",
+" ##  #    #  ## ",
+" ##  #    #  ## ",
+"   ##########   ",
+"   ##########   ",
+"     #    #     ",
+
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ##         #  ",
+"  ## # # # # #  ",
+"################",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+"################",
+"  ### # # # ##  ",
+"  ##         #  ",
+"  ### # # # ##  ",
+"  ## # # # # #  ",
+"  ### # # # ##  ",
+
+"     #    #     ",
+"     #    #     ",
+"################",
+"#   ### # #   # ",
+" # # # # ### # #",
+"#   ### # #   # ",
+" # # # # ### # #",
+"#   ### # #   # ",
+" # # # # ### # #",
+"#   ### # #   # ",
+" # # # # ### # #",
+"#   ### # #   # ",
+"################",
+"################",
+"     #    #     ",
+"     #    #     ",
+
+" ###############",
+"#               ",
+"#               ",
+"#               ",
+"#    #######    ",
+"#   #########   ",
+"#  ### ### ###  ",
+"# ###   #   ### ",
+"#  #  #   #  #  ",
+"#  #         #  ",
+"#  # # # # # #  ",
+"#  #    #    #  ",
+"#  # #  #    #  ",
+"#  ###########  ",
+"#               ",
+"#               ",
+
+"################",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+
+"################",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"################",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+
+"                ",
+"                ",
+"  #######       ",
+"   ##   ##      ",
+"   ##    ##     ",
+"   ##    ##     ",
+"   ##    ##     ",
+"   ##   ##      ",
+"   ######       ",
+"   ##  ##       ",
+"   ##   ##      ",
+"   ##    ##     ",
+"  ####  ####    ",
+"                ",
+"                ",
+"                ",
+
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"################",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"################",
+
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"################",
+
+"                ",
+"         #      ",
+"    #           ",
+"           #    ",
+"  ######## #    ",
+" ##   #  #      ",
+" ## #    #      ",
+" ####### #      ",
+" ######  #      ",
+"     ##  #      ",
+"     #####      ",
+"#    ####       ",
+"          ##    ",
+"         ###    ",
+"   #            ",
+"                ",
+
+"      #         ",
+"              # ",
+"  #        #    ",
+"      ##        ",
+"    ## ##       ",
+"    #  ###  #   ",
+"   ##  ###      ",
+" # ##  ###      ",
+"   ## ####      ",
+"   ### ###  #   ",
+"   # ## #       ",
+"   #####    #   ",
+"                ",
+"#      #  #     ",
+"  #  #        # ",
+"                ",
+
+"                ",
+"                ",
+"     #   #      ",
+"             #  ",
+"  #  ####       ",
+"    ##  ######  ",
+"   ### # ## ##  ",
+"   ###      ## #",
+"#  ###########  ",
+"   ##  #  # #   ",
+"   #########    ",
+"              # ",
+"  #     #  #    ",
+"     #          ",
+"                ",
+"                ",
+
+"  #  #  #  #  # ",
+"#               ",
+"     ##        #",
+"   ## ###       ",
+"# ##  # #       ",
+"  ##  # #  ##  #",
+"  ##  # #  #    ",
+"# ## ## #  #    ",
+"  ##  # #      #",
+"  ##  # #  #    ",
+"# ## ## #       ",
+"  ###  ##  #   #",
+"  ## # #        ",
+"# #####         ",
+"               #",
+" #  #  #  #  #  ",
+
+" #    #    #   #",
+"                ",
+"   ##########   ",
+"# ###      ##   ",
+"  ## ###### #  #",
+"  ## ##    ##   ",
+"  ## # ######   ",
+"# ## # #        ",
+"  ##   #        ",
+"  ######   #    ",
+"  #####   # #  #",
+"#            #  ",
+"   # #    # #   ",
+"                ",
+"#              #",
+"   #   #    #   ",
+
+" # # # # # # # #",
+"#               ",
+"     ########  #",
+"#  ## ########  ",
+"   #  ##     # #",
+"# ##  # ######  ",
+"  ## ## #   #  #",
+"# ##  # ####    ",
+"  ##  # #      #",
+"# ##  # #   #   ",
+"  ## ## #      #",
+"# ###  ## # #   ",
+"  ## # #       #",
+"# #####   # #   ",
+"               #",
+"# # # # # # # # ",
+
+"# # # # # # # # ",
+"               #",
+"#       ######  ",
+"       ##  # # #",
+"#     # #  # #  ",
+"      ### ## # #",
+"#     # #  # #  ",
+"      ###  # # #",
+"#    ####  # #  ",
+"    ## ##### # #",
+"#  ###       #  ",
+"   # ######### #",
+"#  ##  #  # #   ",
+"   #########   #",
+"#               ",
+" # # # # # # # #",
+
+" #  #  #  #  #  ",
+"               #",
+"#    ########   ",
+"    ## ##   #   ",
+"   #   # #  #  #",
+"# ##   # ####   ",
+"  ##   # ###    ",
+"  ## # # #     #",
+"# ##   # #      ",
+"  ##  ## #      ",
+"  #### ###     #",
+"# ##     #  #   ",
+"  # # # #  # #  ",
+"  ######    #  #",
+"#               ",
+"  #  #  #  #  # ",
+
+"                ",
+"                ",
+"        #####   ",
+"  #     #  ##   ",
+"        #  ##   ",
+"   ######  ##   ",
+"  ## ########   ",
+" ###   #   ##   ",
+" ###       ##   ",
+" ########  ##  #",
+" ##    ##  ##   ",
+" ########   #   ",
+"      #######   ",
+"      ##   #    ",
+"      #####     ",
+"                ",
+
+"                ",
+"    ########### ",
+"   ###       ## ",
+"  # # ####### # ",
+" # ## #   ## ###",
+" #  ##   ##  ###",
+" # ###       ###",
+" #  ######## ###",
+" # #       # ## ",
+" ##  # # ### ## ",
+" ###########  # ",
+"    #    # #### ",
+"         ##  #  ",
+"         ####   ",
+"               #",
+"                ",
+
+"                ",
+" #              ",
+"    ############",
+"   #### # # # ##",
+"  # ## #########",
+" # ## ##      ##",
+" #  ###        #",
+" # ###         #",
+" #  ########### ",
+" # #  #  #  # # ",
+" ## #  ##  # #  ",
+" ############   ",
+"      #  #      ",
+"               #",
+"                ",
+"                ",
+
+"#          ##  #",
+"   ######## ##  ",
+"  ## # # ## # ##",
+"## ##    #  ## #",
+" # ######   # ##",
+" ##   # #   ## #",
+"######  #   # ##",
+"     ## #  ### #",
+"     ## ###  ###",
+"#    #  #  #  ##",
+"     # # #  # ##",
+"     ##      #  ",
+"     ########   ",
+"               #",
+"                ",
+"                ",
+
+"################",
+"# #   #   #   ##",
+"#   #   #      #",
+"# #   #   #   ##",
+"#   # ######## #",
+"# #  ##      ###",
+"#   ###      # #",
+"# #####      ###",
+"#  ####     ## #",
+"# #####      ###",
+"#  # ##      # #",
+"# #####      ###",
+"#  ####     ## #",
+"#  ####      ###",
+"#  # ##      # #",
+"# #####      ###",
+
+"################",
+"   #  # #   # # ",
+"   ##   #   #   ",
+"   #  # #   #   ",
+"   ##   #   #   ",
+"    ####    # ##",
+"            # ##",
+" #          # ##",
+"      # #   # ##",
+" #       #  # ##",
+"  #     ##  # ##",
+"   #   #### # ##",
+" #     ###  # ##",
+"  #     #   # ##",
+"   #   #    # ##",
+" #       #  # ##",
+
+"################",
+"  #   #   #   ##",
+"#   #   #   #  #",
+" ###########  ##",
+"##  #   #  ##  #",
+"##         #  ##",
+" ##  #     ##  #",
+"##         #  ##",
+" #          #  #",
+"##         #  ##",
+" #     ##  ##  #",
+"##         #  ##",
+" #         ##  #",
+"##         #  ##",
+" #         ##  #",
+"## #####   #  ##",
+
+"#  ####     ### ",
+"# #####      #  ",
+"#  # ##      #  ",
+"# #####      ## ",
+"#  ####     ## #",
+"# #####      ###",
+"#  # ##      # #",
+"#  ####      ###",
+"#  ####     ## #",
+"# #####      ###",
+"#  # ##      # #",
+"# #####      ###",
+"#  ####     ##  ",
+"# #####      ## ",
+"#  # ##      #  ",
+"# #####      ## ",
+
+"  #     # # # ##",
+"   #  ##    # ##",
+" #       #  # ##",
+"  #     #   # ##",
+" ###   #    # ##",
+" ###     #  # ##",
+"  #     #   # ##",
+"   #   #    # ##",
+"            # ##",
+"        ### # ##",
+" ###    ### # ##",
+" ###        # ##",
+"############# ##",
+"  #   #   #   # ",
+"#   #   #   #   ",
+"  #   #   #   # ",
+
+" # ##  ##  ##  #",
+"## ##  ##  #  ##",
+" # #####   ##  #",
+"## ####    #  ##",
+" # ## ##   ##  #",
+"## ##  ##  #  ##",
+" #         ##  #",
+"##         #  ##",
+" #         ##  #",
+"############  ##",
+"#   #   # # #  #",
+"  #   #  ##   ##",
+"#########   #  #",
+"  #   #   #   ##",
+"#   #   #   #  #",
+"  #   #   #   ##",
+
+"#  ####     ####",
+"# #####         ",
+"#  # ##         ",
+"#  ####         ",
+"#  ####     #   ",
+"# #####         ",
+"#  # ##         ",
+"# #####         ",
+"#  ####         ",
+"# ##############",
+"#  # ## # # # # ",
+"# ### #####   ##",
+"#  #############",
+"# #   #   #   # ",
+"#   #   #   #   ",
+"################",
+
+"##############  ",
+"           #  # ",
+"           ##   ",
+"           #  # ",
+"#   #   #  ##   ",
+"           #  # ",
+"           ##   ",
+"           #  # ",
+"           ##   ",
+"############  # ",
+"# # # # # # #   ",
+"# #  ##  ##   # ",
+"#########      #",
+"  #   #   #   # ",
+"#   #   #   #   ",
+"################",
+
+"#   #   #  ##  #",
+"  #       #   ##",
+"#       #   #  #",
+" #        #   ##",
+"#   #   #      #",
+"      #    ## ##",
+"    #      ##  #",
+"  #       #   ##",
+"#   #    #  #  #",
+"      #   #   ##",
+"#           #  #",
+"  #   #   #   ##",
+"#   #   #      #",
+"  #   #   #   ##",
+"#   #   #   #  #",
+"################",
+
+"################",
+"# #   #   #   # ",
+"#   #  #########",
+"#     ##########",
+"#   ####   #   #",
+"# # ####     #  ",
+"#  ## ##     # #",
+"# ######        ",
+"#  ## ##       #",
+"# ######   #    ",
+"#  ## ##       #",
+"# ###### ##     ",
+"#  ## ## ##    #",
+"# ###### ##   # ",
+"#  #####       #",
+"#  #####        ",
+
+"################",
+"  #   #   #   # ",
+"##  #   #   ##  ",
+"################",
+"################",
+"##    #         ",
+"## #            ",
+"##          #   ",
+"##   #   #   ###",
+"##        ####  ",
+"##     #    ##  ",
+"###       #     ",
+"##              ",
+"################",
+"## # # # # # # #",
+"### # # # # # # ",
+
+"################",
+"  #   #   #   ##",
+"#   #  ##   #  #",
+"###########   ##",
+"########### #  #",
+"         ##   ##",
+"         ## #  #",
+"  # #    ##   ##",
+"      #  ## #  #",
+"    #    ##   ##",
+"    ##   ## #  #",
+"   #     ##   ##",
+"   # ##  ## #  #",
+"###########   ##",
+" # # # # #  #  #",
+"# # # # # #   ##",
+
+"#  ## ##       #",
+"# ######        ",
+"#  ## ##       #",
+"# ######        ",
+"#  ## ##       #",
+"# ######   ##   ",
+"#  #####   ##  #",
+"# ######        ",
+"#  ## ##       #",
+"# ######        ",
+"#  ## ##       #",
+"#  #####        ",
+"#  ## ##       #",
+"# ######     #  ",
+"#  ## ##   #   #",
+"# ##############",
+
+"## #############",
+"###   # # #   # ",
+"##  #   #   #   ",
+"### # #         ",
+"##  # # # ##### ",
+"##### #   ##  ##",
+"##  ##  # ##  ##",
+"###   #   ##### ",
+"##  #   # ####  ",
+"###  ##   ## ## ",
+"##  #   # ##  ##",
+"###   #         ",
+"##  # ###   #  #",
+"###   #   #   ##",
+"##  #   #   #  #",
+"################",
+
+"#########   #  #",
+"  #   #   # # ##",
+"#   #   #   #  #",
+"  #   #   #   ##",
+"    #   #   #  #",
+"  #   ##  #   ##",
+"    #   #   #  #",
+"  #   #   #   ##",
+"    #   # # #  #",
+"         ##   ##",
+"    #       #  #",
+"  # # # # #   ##",
+"#########   #  #",
+"##      #     ##",
+"##   ####   #  #",
+"## # #### #   ##",
+
+"#  ## ##########",
+"# ##### #       ",
+"#  ######       ",
+"# ### # #       ",
+"#  ######     # ",
+"# ### # #       ",
+"#  ######       ",
+"#  ## # ########",
+"#  ###### # # # ",
+"# ### ## # ### #",
+"#  #### # # # # ",
+"# #### # ### # #",
+"#  #############",
+"# #   #   #   # ",
+"#   #   #   #   ",
+"################",
+
+"################",
+"              ##",
+"              ##",
+"              ##",
+"    #        ###",
+"              ##",
+"              ##",
+"################",
+"# # # # # # # # ",
+"## # ### ### ## ",
+"# # # # # # #   ",
+" # ### # # #  # ",
+"########### #   ",
+"  #   #   #   # ",
+"#   #   #   #   ",
+"################",
+
+"    #   #   #  #",
+"     ####     ##",
+"     ####   ## #",
+" #      #     ##",
+"   # #  ##  #  #",
+"         ###  ##",
+"   ##    #  #  #",
+"   ##    ##   ##",
+"##### #   ###  #",
+"  ##      ##  ##",
+"#   #      ##  #",
+"  #  #      # ##",
+"#   # #     #  #",
+"  #   #    ## ##",
+"#   # #     #  #",
+"################",
+
+"################",
+"#     #   #   # ",
+"#   #   ########",
+"#     ##########",
+"#   # ###       ",
+"# #  ####       ",
+"#   # # # #     ",
+"# #######    ###",
+"#  #### #     # ",
+"# #######    ## ",
+"#  ## # # # # ##",
+"# #######       ",
+"#  ## ###       ",
+"# #######       ",
+"#  ## # ########",
+"# ######        ",
+
+"################",
+"  #   #   #   # ",
+"### #   #   #   ",
+"###   #   #   # ",
+" ###############",
+" ##             ",
+" ##             ",
+" ##      #      ",
+" ##      #    # ",
+" ##     # #     ",
+" ##             ",
+" ###############",
+" ## # # # # # # ",
+" ### # # # # # #",
+"################",
+" ##   #   #   ##",
+
+"################",
+"  #   #   #   ##",
+"    #   #   #  #",
+" ###########  ##",
+"##  #   #  ##  #",
+"##         #  ##",
+"##         ##  #",
+"##         #  ##",
+"##        ##   #",
+"##         #  ##",
+"##         ##  #",
+"##         #  ##",
+"##  #      ##  #",
+" #        ##  ##",
+"## #       ##  #",
+" #         #  ##",
+
+"#  ## ##########",
+"# #####         ",
+"#  ## #         ",
+"# #####         ",
+"#  ## #     #   ",
+"# #####         ",
+"#  ## #         ",
+"# #####   #     ",
+"#  ## # #   #   ",
+"# #####         ",
+"#  ####         ",
+"# #####         ",
+"#  ## # ########",
+"# ##############",
+"#  ## # #       ",
+"# #######       ",
+
+"#   #   #   # ##",
+"#             ##",
+"#   #####   # ##",
+"# # ##  ##    ##",
+"#   ##  ##  # # ",
+"# # #####     ##",
+"#   ####    # # ",
+"# # ## ##     ##",
+"#   ##  ##  # ##",
+"# #           ##",
+"#   #   #   ####",
+"# #   #   # ####",
+"################",
+"################",
+"                ",
+"                ",
+
+"##   #     ##  #",
+" #         #  ##",
+"##   #    ###  #",
+"##  # #    #  ##",
+"##     #   ##  #",
+"##         #  ##",
+"##         ##  #",
+"############# ##",
+"#############  #",
+"#          ## ##",
+"#          ##  #",
+"#     #### ## ##",
+"##     #   ##  #",
+"##    #    ## ##",
+"##         ##  #",
+"##         ##  #",
+
+"#  ## # #       ",
+"#  ######       ",
+"#  ## ###   #   ",
+"# #######      #",
+"#  ## # #   #   ",
+"#########       ",
+"####### #       ",
+"# ##############",
+"#  ## ### # # # ",
+"# ###### ### # #",
+"#  #### # # # # ",
+"# #### # # ### #",
+"#  #############",
+"# #   #   #   # ",
+"#         # #   ",
+"################",
+
+"         #      ",
+"          #     ",
+"            #   ",
+"        ###     ",
+"        # #     ",
+"        ###     ",
+"                ",
+"################",
+"# # # # # # # # ",
+"## # ### ### # #",
+"# # # # # # # # ",
+"   ### ### # # #",
+"################",
+"  #       #   # ",
+"#   #   #   #   ",
+"################",
+
+"##         ##  #",
+"##         ## ##",
+"##         ##  #",
+"##     #   ## ##",
+"##     #   ##  #",
+"##    #    ## ##",
+"##         ##  #",
+"##         ## ##",
+"#############  #",
+" ### # ### #  ##",
+"### # # # # #  #",
+"## # ### ##   ##",
+"#########      #",
+"   ## #   #   ##",
+"#  ##   #   #  #",
+"################",
+
+"################",
+"# #   #  #######",
+"### #   ########",
+"# #   ####      ",
+"#   # ## #      ",
+"# #  #####      ",
+"##  ## ###  #  #",
+"# ########  ####",
+"#  #### ##   # #",
+"# ########  #   ",
+"#  ### ###      ",
+"# ## #####      ",
+"#  #######      ",
+"# ###### # #  # ",
+"#  ### ###      ",
+"# ##############",
+
+"################",
+"####  #    #####",
+"#####   # ######",
+"  ##  #  ###    ",
+"  ####### ##    ",
+"  ##    ####    ",
+"  ##    ####   #",
+"  ####  ####    ",
+"  ##    ####    ",
+"  ##    ########",
+"  ## ## #       ",
+"  ######## #  # ",
+"  ##            ",
+"# ##############",
+"  ##   #   #   #",
+"#### # # #  ####",
+
+"################",
+"############## #",
+"############## #",
+"            ## #",
+"            ## #",
+"            ## #",
+" # # ###    ## #",
+"    ##      ## #",
+"            ## #",
+"####        ## #",
+"   #   #    ## #",
+" ###    #   ## #",
+" ###        ## #",
+"################",
+"################",
+"###           ##",
+
+"#  #####        ",
+"# #####       ##",
+"## # ##      ###",
+"#######    #### ",
+"#  ## # #  # ## ",
+"# #####   ##### ",
+"#  #### ## #### ",
+"# ##### ####### ",
+"#  ##### ### ## ",
+"# ### ######### ",
+"#  ####### #### ",
+"# ############# ",
+"## ##### ### ## ",
+"# ############# ",
+"#  ## # ## #### ",
+"# ############# ",
+
+" # #        ####",
+"################",
+"################",
+"     #   #    ##",
+"              ##",
+"     #####    ##",
+"     ##  ##   ##",
+"     ##  ##   ##",
+"     #####    ##",
+"     ####     ##",
+"     ## ##    ##",
+"  #  ##  ##   ##",
+"              ##",
+"   #          ##",
+"       #      ##",
+"         #    ##",
+
+"  #           ##",
+" ##           ##",
+"              ##",
+" #            ##",
+"          #   ##",
+" #         #  ##",
+"          # # ##",
+" #       #    ##",
+"    #         ##",
+" #            ##",
+"              ##",
+"###           ##",
+"      #       ##",
+"       #    ####",
+"      # #  ## ##",
+"     #     #####",
+
+"## ## ## ### ## ",
+"################",
+"## ### ### #### ",
+"# ###########  #",
+"#  ## ## #### # ",
+"# #########  #  ",
+"#  #### ### # # ",
+"# #######  #   #",
+"#  ## ### # # # ",
+"# #####  #   #  ",
+"#  #### # # # # ",
+"# ###  #   ##  #",
+"#  #############",
+"# #   #   # # ##",
+"#   #   #   #  #",
+"################",
+
+"          ##  ##",
+"################",
+"# # # # # # # # ",
+"   #     #   #  ",
+"# # # # # # #   ",
+" #   # #   #####",
+"# # # # # # # # ",
+"     #   # # #  ",
+"# # # # # # # # ",
+" # #   # #   # #",
+"# # # # # # # ##",
+"#    #   # ###  ",
+"################",
+"# #   #   ##  # ",
+"#   #   #  ##   ",
+"################",
+
+"           # ###",
+"              ##",
+"#             ##",
+"##            ##",
+"              ##",
+"################",
+"# # # # # # # # ",
+" ### #   # # ## ",
+"# # # # ### # # ",
+" #   # # # #  # ",
+"# # # # # # # # ",
+" # ###  ###   # ",
+"#########   # # ",
+"  ##  #   # # # ",
+"#  ##   ### # # ",
+"############### ",
+
+"################",
+"#               ",
+"# #   #   #   # ",
+"#               ",
+"#   # ##########",
+"#    ###########",
+"# # # #         ",
+"#  # ##         ",
+"#  ## #         ",
+"#  # ##         ",
+"# ### #         ",
+"#  # ##         ",
+"#  ## #         ",
+"#  # ##         ",
+"# ### #         ",
+"#  # ##         ",
+
+"################",
+"                ",
+"  #   #   #   # ",
+"            ####",
+"####### #  #####",
+"#######   ###   ",
+"     ##  # ##   ",
+"     ##  ## #   ",
+"     ## ## ##   ",
+"     ##  ## #   ",
+"     ##  # ##   ",
+"     ##  ## ####",
+"     ## ## #    ",
+"     ##  ##    #",
+"     ##  ###### ",
+"#######       ##",
+
+"################",
+"               #",
+"  #   #   #   ##",
+"############   #",
+"#############  #",
+"          ##   #",
+"          ##  ##",
+"          ##   #",
+"          ###  #",
+"          ##   #",
+"          ##  ##",
+"##        ##   #",
+"##        ###  #",
+" #        ##   #",
+"##        ##  ##",
+" #        ##   #",
+
+"#  ## #        #",
+"#  # ##        #",
+"# ### #        #",
+"#  # ##        #",
+"#  ## #        #",
+"#  # ##        #",
+"# ### #        #",
+"#  # ##        #",
+"#  ## #        #",
+"#  # ##        #",
+"# ### #        #",
+"#  # ##        #",
+"#  ## #        #",
+"#  # ##        #",
+"# ### #        #",
+"#  # ##        #",
+
+"# # ##  #   # # ",
+"## ##         ##",
+"####  #   #   # ",
+"#             ##",
+"#   #   # ##### ",
+"#         #   ##",
+"# #####   # ### ",
+"# ##  ##  # # ##",
+"# ##  ##  # # # ",
+"# #####   # # ##",
+"# ####    # # # ",
+"# ## ##   # # ##",
+"# ##  ##  # # ##",
+"#         # #   ",
+"# #   #   # # # ",
+"#    ###### ####",
+
+"##        ###  #",
+" #        ##   #",
+"##        ##  ##",
+" #        ##   #",
+"##        ###  #",
+" #        ##   #",
+"##        ##  ##",
+" #        ##   #",
+"##        ###  #",
+" ###########   #",
+"# # # # # #   ##",
+"         #     #",
+"#########   #  #",
+"               #",
+"  #   #   #   ##",
+"############   #",
+
+"#  ## #        #",
+"#  # ##        #",
+"# ### #        #",
+"#  # ##        #",
+"#  ## #        #",
+"#  # ##        #",
+"# ### #        #",
+"#  # ##        #",
+"#  ## #        #",
+"#  # ###########",
+"# ##### # # # ##",
+"#  ##         # ",
+"#  ###########  ",
+"#               ",
+"# #   #   #   # ",
+"################",
+
+"#   ## #      # ",
+"######  #    #  ",
+"#        #  #  #",
+"######          ",
+"#   ##          ",
+"#    #          ",
+"# #  #          ",
+"#    #          ",
+"#   ##    #    #",
+"#    #   #      ",
+"  #  #  #       ",
+"     ######   ##",
+"#   #   # #   # ",
+"          #   # ",
+"  #   #   #   # ",
+"################",
+
+" #  #  #  ###  #",
+"#  #  #  # #####",
+"  #  #  #      #",
+"               #",
+"               #",
+"           #####",
+"           #  ##",
+"           #   #",
+"  #  #  #  ##  #",
+"#  #  #  # #   #",
+" #  #  #  ##  ##",
+"############   #",
+"#   #   #   #  #",
+"               #",
+"  #   #   #   ##",
+"################",
+
+"################",
+"#               ",
+"# # # #   #   # ",
+"#               ",
+"#   # ##########",
+"#    ###########",
+"# # # #         ",
+"#  # ##         ",
+"#  ## #        #",
+"#  ####         ",
+"# ### #         ",
+"#  # ##         ",
+"#  ## #        #",
+"#  # ##        #",
+"# ### #    #   #",
+"#  ####    #   #",
+
+"################",
+"    #           ",
+"  #   #   #   # ",
+"            #   ",
+"########### #   ",
+"###########   ##",
+"         ##   # ",
+"         ##   ##",
+"         ## # # ",
+"         ##   ##",
+"         ##   # ",
+"###########   ##",
+"#        #  # ##",
+"##### # #     ##",
+"########  #   # ",
+"#             ##",
+
+"################",
+"               #",
+"  #   #   #   ##",
+" ###########   #",
+"##  #   #  ##  #",
+" #         #   #",
+"##         #  ##",
+" #         #   #",
+"##  #   #  ##  #",
+" #         #   #",
+"##         #  ##",
+" #         #   #",
+"##  #   #  ##  #",
+" #         #   #",
+"##         #  ##",
+" #         #   #",
+
+"#  ## #        #",
+"#  # ##        #",
+"# ### #        #",
+"#  # ##        #",
+"#  ## #        #",
+"#  # ##        #",
+"# #####    #   #",
+"#  # ##    ##  #",
+"#  ## #        #",
+"#  # ##        #",
+"# ### #        #",
+"#  ####        #",
+"#  ## #        #",
+"#  # ##        #",
+"# ### #        #",
+"#  # ##        #",
+
+"#   #   #   # # ",
+"#             ##",
+"#  #####  #   # ",
+"#  ##  ##  #  ##",
+"#  ##  ##     ##",
+"#  #####      ##",
+"#  ####   #   # ",
+"#  ## ##      ##",
+"#  ##  ##   # ##",
+"#             # ",
+"# #   #   #  # #",
+"#           # # ",
+"#   #   #   ## #",
+"#           # # ",
+"################",
+"################",
+
+"##  #   #  #   #",
+" #         #   #",
+"##         #   #",
+" #         #  ##",
+"##  #   #  ##  #",
+" #         #   #",
+"##         #  ##",
+"#############  #",
+"#############  #",
+"#          ##  #",
+"#          ## ##",
+"#          ##  #",
+"#          ##  #",
+"#          ### #",
+"#          ##  #",
+"#          ##  #",
+
+"#  ## #         ",
+"#  # ##         ",
+"# ### #         ",
+"#  ####         ",
+"#  ## #         ",
+"#  # ##      #  ",
+"# #####         ",
+"#  # ##         ",
+"#  ## #         ",
+"#  # ###########",
+"# ####    #  #  ",
+"#  ##   #  #    ",
+"#  #############",
+"#         #   # ",
+"# #             ",
+"################",
+
+"               #",
+"               #",
+"               #",
+"               #",
+"   #           #",
+"               #",
+"               #",
+"               #",
+"               #",
+"################",
+"  #    #  #   # ",
+" #   ##    # #  ",
+"################",
+"                ",
+"      #     ##  ",
+"################",
+
+"#          ##  #",
+"#      #   ##  #",
+"#          ##  #",
+"#          ##  #",
+"#      #   ##  #",
+"#          ##  #",
+"#          ## ##",
+"#          ##  #",
+"#############  #",
+"  # # # #  #   #",
+"          #  # #",
+"# # # #  #     #",
+"#########      #",
+"#              #",
+"      #   #   ##",
+"################",
+
+"################",
+"#   #           ",
+"#   #           ",
+"#           #   ",
+"#   #   ########",
+"#      ### # # #",
+"#     ###       ",
+"#    ## #       ",
+"#   ## ##    # #",
+"# # # # #       ",
+"#   #####     # ",
+"#   # # #       ",
+"# # ## #########",
+"# # ############",
+"#   ## ## # # ##",
+"#   # ## # # # #",
+
+"################",
+"      #         ",
+"                ",
+"                ",
+"######  #   #   ",
+" # # #  #     ##",
+"    ### ###  ## ",
+"     #      # # ",
+"    ##  #  # ## ",
+"     #    ### # ",
+"    ###### # ## ",
+"     #     ## # ",
+"##### #### # ## ",
+"####     # ## # ",
+"###   #  # # ## ",
+"##     # # ## # ",
+
+"################",
+"               #",
+" #        ##  ##",
+"               #",
+"#   ####### #  #",
+"###### # # #   #",
+"# ###     ##  ##",
+"  ###      #   #",
+"  ###     ###  #",
+"  ###      #   #",
+"  ###     ##  ##",
+"  ###      #   #",
+"  ## ########  #",
+"  #########    #",
+"  #########   ##",
+"         ##    #",
+
+"#   ## ## # # ##",
+"#   # ## # # # #",
+"#   ## ## # # ##",
+"#   # ## # # # #",
+"#   ## ## ######",
+"#   #### ### # #",
+"#   ## ## #     ",
+"#   # #####     ",
+"#   ## ## #     ",
+"# # # ## ##     ",
+"#   ### # #     ",
+"#   ## ####     ",
+"#   # # # #     ",
+"#   #### ##     ",
+"#   # # # #   # ",
+"#   ## ####     ",
+
+"#   #   ## # ## ",
+"         # ## # ",
+"  #   #   ## ## ",
+"           ## # ",
+"### #####  # ###",
+" ## ##  ## ### #",
+"  # ##  ## ##   ",
+" ## #####  #####",
+"  # ####    #   ",
+" ## ## ##       ",
+"  # ##  ##    # ",
+" ##             ",
+"  ##############",
+" # # # # # # # #",
+"                ",
+"       ## #    #",
+
+"          # #  #",
+"         ##    #",
+"          #   ##",
+"         ##    #",
+"########### #  #",
+"#        #     #",
+"  ## ## # #   ##",
+"########       #",
+"#   ### #   #  #",
+"  ###########  #",
+" #### # # # # ##",
+" ###       ##  #",
+"####        #  #",
+"# ##       ##  #",
+"####        # ##",
+"####       ##  #",
+
+"#   # # # #   # ",
+"# # #### ##     ",
+"#   # # # #     ",
+"#   ## ####     ",
+"#   # # # ######",
+"#   #### #  #  #",
+"#   # # #       ",
+"#  ### #  #  #  ",
+"#   # #         ",
+"#   ##  #  #  ##",
+"#   ############",
+"#            #  ",
+"#   #       #   ",
+"#              #",
+"#      #        ",
+"################",
+
+"       #        ",
+"               #",
+"     # # #      ",
+"               #",
+"################",
+"        #  #   #",
+"  #  #        # ",
+" # #  #  #   #  ",
+"            #   ",
+" ## #  #   # #  ",
+"###########  #  ",
+"             ###",
+"        #   #   ",
+"                ",
+"      #         ",
+"################",
+
+"# ##        #  #",
+"####       ##  #",
+"####        # ##",
+"# ##       ##  #",
+"#############  #",
+" ###########   #",
+" ### # ## #   ##",
+"           #   #",
+"# # # # #  ##  #",
+"# # # # #  #   #",
+"           #  ##",
+"######     #   #",
+"#   ##     ##  #",
+"     #     #   #",
+"     #     #  ##",
+"################",
+
+"             ###",
+"########### ####",
+"# #   #    # #  ",
+"#         # ## #",
+"#        # # # #",
+"#       # # ##  ",
+"# #    # # # #  ",
+"#     # # # ##  ",
+"#    # # # # #  ",
+"#   # # ### ##  ",
+"# ## # # # # #  ",
+"#  ## # # # ##  ",
+"#  # # # # # #  ",
+"#  #### # # ##  ",
+"# ## # # # # # #",
+"#  ## # # # ## #",
+
+"##############  ",
+"##############  ",
+"            ####",
+"#           ##  ",
+"#           ##  ",
+"            ##  ",
+"            ##  ",
+"  #    #######  ",
+"      ##  #     ",
+"      ## #  ####",
+"      ###  #    ",
+"      ##  #  # #",
+"      ## #  #   ",
+"      ###  #   #",
+"####  ##########",
+"#  ## ##      ##",
+
+"                ",
+"                ",
+"#############   ",
+"            #   ",
+"            #   ",
+"            #   ",
+" #   #  #   #   ",
+"            #   ",
+"            #   ",
+"####        #   ",
+"#  #  #     #   ",
+" ###  #     #   ",
+" ###      # #   ",
+"####        #   ",
+"############### ",
+"############### ",
+
+"#  # # # # # # #",
+"#  ## # ### ## #",
+"# ## # # # # # #",
+"#  ## # # # ## #",
+"#  # # # # # # #",
+"#  #### # # ##  ",
+"# ## # ### # #  ",
+"#  ## # # # ####",
+"#  # # # # #  # ",
+"#  ## # #### # #",
+"# ## # # #  #   ",
+"#  ## # ########",
+"#  # # # #      ",
+"#  #### ##      ",
+"# ## # # #      ",
+"#  ## # ##      ",
+
+"#  ## ##    # ##",
+"####  ##      ##",
+"###   ##  #  ## ",
+"# ##  ##    ## #",
+"#  ## ##    # # ",
+"      ##    ## #",
+"      ##  # # # ",
+"########    ## #",
+"  #   # #   # # ",
+" # # #      ## #",
+"#   # #   # # # ",
+"####        ## #",
+"  ##############",
+" # #############",
+"                ",
+"                ",
+
+" #           ## ",
+" #           ## ",
+"##           ## ",
+" #           ## ",
+"##     ##    ## ",
+" #    #  #   ## ",
+"##   ##  #   ## ",
+" #   ####    ## ",
+"##    ##     ## ",
+" #           ## ",
+"##           ## ",
+" #           ## ",
+"##           ## ",
+"#         #  ## ",
+"             ## ",
+"             ## ",
+
+"#  # # # #      ",
+"#  ## # ##      ",
+"# ## # # #      ",
+"#  ## # ##   ## ",
+"#  # # # #      ",
+"#  #### ##      ",
+"# ## # # #######",
+"#  ## # #       ",
+"#  # # ## # # # ",
+"#  ## #         ",
+"# ## ## # # # # ",
+"#  ##    ##    #",
+"#  #############",
+"#               ",
+"#               ",
+"################",
+
+"      #         ",
+"                ",
+"                ",
+"        #      #",
+"        #       ",
+"                ",
+"################",
+"                ",
+"# # # # # # # # ",
+"                ",
+"# # # # # # # # ",
+"                ",
+"################",
+"                ",
+"                ",
+"################",
+
+"             ## ",
+"             ## ",
+"     #       ## ",
+"    #        ## ",
+"   #         ## ",
+"             ## ",
+"############### ",
+"             #  ",
+"# # # # # # # # ",
+"           #  # ",
+"# # # # # #   # ",
+" ##      #    # ",
+"#########   # # ",
+"              # ",
+"              # ",
+"############### ",
+
+"################",
+"#               ",
+"#               ",
+"#               ",
+"#     ##########",
+"#    ###########",
+"#   # #        #",
+"#  #  #        #",
+"#  ## #        #",
+"#  # ##        #",
+"#  ## #        #",
+"#  #  #        #",
+"#  ## #        #",
+"#  # ###########",
+"#  #############",
+"#  # #         #",
+
+"################",
+"                ",
+"      #         ",
+"     # # #      ",
+"#   # # #       ",
+"#    # # #     #",
+"#   # # #     # ",
+"#  # # # #    ##",
+"#   # # #     # ",
+"############# # ",
+"##  ## ##   # # ",
+"##  ## ##   ####",
+"#   ## ##     ##",
+"##          ### ",
+" #          # # ",
+" ###        # ##",
+
+"################",
+"               #",
+"               #",
+" ###########   #",
+"############   #",
+" #        ##   #",
+"##        ##   #",
+" #        ##   #",
+"##        ##   #",
+" #        ##   #",
+"##        ##   #",
+" #        ##   #",
+"##        ##   #",
+" #        ##   #",
+"## #####  ##   #",
+" # ##  ## ##   #",
+
+"#  ###         #",
+"#  # #         #",
+"#  ###         #",
+"#  # #         #",
+"#  ###         #",
+"#  # #         #",
+"#  ###         #",
+"#  # #         #",
+"#  ###         #",
+"#  # #         #",
+"#  ###         #",
+"#  # #         #",
+"#  #############",
+"#  ##  #  #   # ",
+"#  ###########  ",
+"#               ",
+
+" ###     #### # ",
+" #       #### # ",
+" ###        # # ",
+" ###        ####",
+" #            ##",
+"##          ### ",
+"            # # ",
+"#######    ## ##",
+"      #    #  # ",
+"      #    #  # ",
+"    # #    #  # ",
+"   # #     #  ##",
+"  # # #    #  ##",
+"   # # #   #    ",
+"  # # #    #    ",
+"   # #     #    ",
+
+"## ##  ## ##   #",
+" # #####  ##   #",
+"## ####   ##   #",
+" # ## ##  ##   #",
+"## ##  ## ##   #",
+" #        ##   #",
+"##        ##   #",
+" #        ##   #",
+"##        ##   #",
+" ###########   #",
+"#         #    #",
+"  # # #  #     #",
+"#########      #",
+"               #",
+"               #",
+"               #",
+
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#   # #         ",
+"#  # #          ",
+"#   # #         ",
+"#  # # # #     #",
+"#  ## # #       ",
+"# ## # #        ",
+"# # # #     ####",
+"#          #    ",
+"#         ######",
+"#        #    # ",
+"#               ",
+"################",
+
+"  # # #    #    ",
+" ###  #    #   #",
+" #    #    #    ",
+"      #    #    ",
+"      #    #    ",
+"     ##    #    ",
+"    # #    #    ",
+" # # #   # #    ",
+"# # # # #  #    ",
+" # # # #   #    ",
+"### # #    #    ",
+"## # # #   #    ",
+"  # # #    #    ",
+"     ##    #    ",
+"      #    #    ",
+"################",
+
+"        #      #",
+"               #",
+"               #",
+"               #",
+"        #      #",
+"       # #     #",
+"    # # # # #  #",
+"   # # # # #   #",
+"    # # # # #  #",
+"   # # # #     #",
+"    # # # #    #",
+"     # # #     #",
+"      # # #    #",
+"       # #     #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#   # #         ",
+"#  # # #        ",
+"#   # # #   #   ",
+"#  #   #########",
+"# # # ##########",
+"#  # ####      #",
+"#   ### #      #",
+"#    #  #      #",
+"#    ## #      #",
+"#    # ##      #",
+"#   ### #  ##  #",
+"#    #  #   #  #",
+"#    ## #      #",
+"#    # ##      #",
+
+"################",
+"                ",
+"                ",
+"                ",
+"################",
+"################",
+"#               ",
+"#           ### ",
+"#               ",
+"#     #         ",
+"#               ",
+"################",
+"#   # #     #   ",
+"#              #",
+"# # #   # # # # ",
+"############## #",
+
+"################",
+"               #",
+"               #",
+"               #",
+"#############  #",
+"#############  #",
+"           ##  #",
+"           ##  #",
+"           ##  #",
+"      #    ##  #",
+"           ##  #",
+"##         ##  #",
+"##         ##  #",
+" #         ##  #",
+"##         ##  #",
+" #         ##  #",
+
+"#   ### #      #",
+"#    #  #      #",
+"#    ## #      #",
+"#    # ##      #",
+"#   ### #      #",
+"#    #  #      #",
+"#    ## #      #",
+"#    # ##      #",
+"#   ### #      #",
+"#    #  #      #",
+"#    ## #      #",
+"#    # ##      #",
+"#   ### #      #",
+"#    #  #  ##  #",
+"#    ## #   #  #",
+"#    # ##      #",
+
+"#            ## ",
+"#            #  ",
+"#    #####   ## ",
+"#    ##  ##  # #",
+"#    ##  ##  ## ",
+"#    #####   #  ",
+"#    ####    ## ",
+"#    ## ##   # #",
+"#    ##  ##  ###",
+"#            ## ",
+"#            ###",
+"#######         ",
+"#      #        ",
+"###### #        ",
+"#    # #        ",
+"############### ",
+
+"##         ##  #",
+" #         ##  #",
+"##     #   ##  #",
+" #         ##  #",
+"##         ##  #",
+" #         ##  #",
+"#############  #",
+"#           #  #",
+"  # # # #  ##  #",
+"          #    #",
+"##########     #",
+"     #  #      #",
+"     #  #   #  #",
+" #####  #####  #",
+" #          #  #",
+" # #      # ####",
+
+"#   ### #      #",
+"#    #  #       ",
+"#    ## #       ",
+"#    # ##       ",
+"#   ### #      #",
+"#    #  #       ",
+"#    ## #       ",
+"#    # #########",
+"#   #####   #   ",
+"#    ##   #   # ",
+"#    ###########",
+"#               ",
+"#   #   #   #   ",
+"#               ",
+"#               ",
+"################",
+
+"############### ",
+"             ###",
+"             ## ",
+"             ## ",
+"            ####",
+"             ## ",
+"             ## ",
+"############### ",
+"#   #   #   ##  ",
+"  #   #   # #   ",
+"############   #",
+"                ",
+"#   #   #   #  #",
+"                ",
+"                ",
+"################",
+
+" #  #    #     #",
+"##   #  #      #",
+"   #      #    #",
+"    #    #  ####",
+"##   #  #   #  #",
+" # #      # #  #",
+" #  #    #  #  #",
+" #   #  #   #  #",
+"##          #  #",
+"##          #  #",
+" #          #  #",
+"#######   ###  #",
+" #  ###   #    #",
+"#     #   #    #",
+"     ##   #    #",
+"################",
+
+"################",
+"#               ",
+"#               ",
+"#               ",
+"#   #   ########",
+"#      ### # # #",
+"#     # #       ",
+"#    # ##       ",
+"#   # # #       ",
+"#   ##  #       ",
+"#   # # #       ",
+"#   #  ##       ",
+"#   ### ########",
+"#   ##  ########",
+"#   # ### # # ##",
+"#   #  # # # # #",
+
+"################",
+"                ",
+"                ",
+"           #    ",
+"######          ",
+" # # #  #     ##",
+"    ##       ## ",
+"     #      # # ",
+"    ##     # ## ",
+"     #     ## # ",
+"    ######## ## ",
+"     #     #  # ",
+"##### ###### ## ",
+"####       ## # ",
+"###        #  # ",
+"##  #    # ## # ",
+
+"################",
+"               #",
+"               #",
+"               #",
+"#   ####### #  #",
+"###### # # #   #",
+"# ###     ##   #",
+"  # #      #   #",
+"  ###     ###  #",
+"  ###      #   #",
+"  # #     ##   #",
+"  ###      #   #",
+"  ##########   #",
+"  ##      #    #",
+"  #########    #",
+"         ##    #",
+
+"#   # ### # # ##",
+"#   ## # # # # #",
+"#   # ### # # ##",
+"#   #  # # # # #",
+"#   # ### ######",
+"#   ## # ### # #",
+"#   # ### #     ",
+"#   ## #  #     ",
+"#   # # # #     ",
+"#   ##   ##     ",
+"#   # # # #     ",
+"#   #  #  #     ",
+"#   # # # #     ",
+"#   ##   ##     ",
+"#   # # # #     ",
+"#   #  #  #     ",
+
+"    #      # ## ",
+"      #    ## # ",
+"           # ## ",
+"           #  # ",
+"### #####  # ###",
+" ## ##  ## ### #",
+"  # ##  ## ##   ",
+" ## #####  #####",
+"  # ####        ",
+" ## ## ##       ",
+"  # ##  ##      ",
+" ##             ",
+"  ##############",
+" # # # # # # # #",
+"                ",
+"               #",
+
+"          # #  #",
+"         ##    #",
+"          #    #",
+"         ##    #",
+"########### #  #",
+"#        #     #",
+"  ## ## #      #",
+"########       #",
+"     ## #   #  #",
+"  ###########  #",
+" #### # # # #  #",
+" ###       ##  #",
+"## #        #  #",
+"# ##       ##  #",
+"####        #  #",
+"## #       ##  #",
+
+"#   # # # #     ",
+"#   ## # ##     ",
+"#   # # # #     ",
+"#   #  #  #     ",
+"#   ### # ######",
+"#   ##   #      ",
+"#   # # #  # # #",
+"#   #  #        ",
+"#   # #  # # # #",
+"#   ##      ##  ",
+"#   ############",
+"#               ",
+"#   #   #   #   ",
+"#               ",
+"#               ",
+"################",
+
+"                ",
+"               #",
+"                ",
+"               #",
+"################",
+"               #",
+"  ##  # # # # # ",
+"             #  ",
+"    # # # # #   ",
+" ##       ## #  ",
+"###########  #  ",
+"             ###",
+"#   #   #   #   ",
+"                ",
+"                ",
+"################",
+
+"# ##        #  #",
+"## #       ##  #",
+"####        #  #",
+"# ##       ##  #",
+"## ##########  #",
+" ###########   #",
+" ### # ## #    #",
+"           #   #",
+"# # # # #  ##  #",
+"# # # # #  #   #",
+"           #   #",
+"######     #   #",
+"#   ##     ##  #",
+"     #     #   #",
+"     #     #   #",
+"################",
+
+"          ######",
+"######## #######",
+"#       # #     ",
+"#      #  #     ",
+"#     # # #   ##",
+"#    #   ##  # #",
+"#   # # # #  ## ",
+"#  #   #  #   ##",
+"#  #  # # #     ",
+"#  ###   ##     ",
+"#  ## # # #     ",
+"#  # # #  #     ",
+"#  #  # # #  # #",
+"#  # #   #######",
+"#  ## # #       ",
+"#  #   #        ",
+
+"####            ",
+"################",
+"  ##       #####",
+"  ##      ##    ",
+"  ###### ###    ",
+"# ##    ## #    ",
+"# ##    #  #    ",
+"  ##    ####    ",
+"  ##    ####    ",
+"  ##    ## #    ",
+"  ##    #  #    ",
+"  ##    ## #    ",
+"  ##    # ##    ",
+"####    ####    ",
+"  #     ## #####",
+" #      # #     ",
+
+"                ",
+"################",
+"################",
+"              ##",
+"  ##          ##",
+"              ##",
+"              ##",
+"           #  ##",
+"   #      #   ##",
+"  #      #    ##",
+" #            ##",
+"              ##",
+"              ##",
+"              ##",
+"################",
+"              ##",
+
+"#  #  ##########",
+"#  # ##         ",
+"#  ## #         ",
+"#  ## #        #",
+"#  #  #       ##",
+"#  # ##  #   # #",
+"#  ## #     #  #",
+"#  #  #    #   #",
+"#  #  #   # # ##",
+"#  # ##  #   # #",
+"#  ## # # # #  #",
+"#  #  ##   #   #",
+"#  #  # # # # ##",
+"#  # #   # # # #",
+"#  ## # # # #  #",
+"#  #   #   #   #",
+
+"#       ##      ",
+"#########       ",
+"#               ",
+"################",
+"################",
+"                ",
+"       #####    ",
+"       ##  ##   ",
+"       ##  ##   ",
+"       #####    ",
+"       ####     ",
+"       ## ##    ",
+"       ##  ##   ",
+"                ",
+"                ",
+"                ",
+
+"             # #",
+" ############  #",
+"##          #  #",
+"####        #  #",
+"####        #  #",
+"  ##        #  #",
+"  ##        #  #",
+"  ##        #  #",
+"  ##        #  #",
+"  ##        #  #",
+"  ##############",
+"  ##          ##",
+"  ##          ##",
+"  ##        # ##",
+"  ##          ##",
+"  ##          ##",
+
+"#  #  # # # # ##",
+"#  ###   #   ## ",
+"#  ## # # # ##  ",
+"#  #   # # ##   ",
+"#  #  # # ##   #",
+"#  # #   ##     ",
+"#  ## # ## # # #",
+"#  ##  ##       ",
+"#  #  ## #  # # ",
+"#  # ##         ",
+"#  ###    # # # ",
+"#  ##      ##   ",
+"#  #############",
+"#               ",
+"#               ",
+"################",
+
+"################",
+"                ",
+"# # # # # # # # ",
+"                ",
+" # # # ## ## # #",
+"              # ",
+" # #         ###",
+"     ## # #     ",
+" #          #  #",
+"      # #     # ",
+"# # #        # #",
+"       ##   #   ",
+"################",
+"                ",
+"                ",
+"################",
+
+"####  #       ##",
+"  ### #       ##",
+" #  # #       ##",
+"# # # #       ##",
+"              ##",
+"              ##",
+"############## #",
+"#   #   #   ## #",
+" # # # # # #   #",
+"  #   #   ##   #",
+" # # # # #     #",
+"#   #   ##     #",
+"########    #  #",
+"               #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#               ",
+"#       ########",
+"#      ### # # #",
+"#     ###       ",
+"#     # #       ",
+"#     # #       ",
+"#     # #       ",
+"# #   # #       ",
+"## #  # #       ",
+"# #   # ########",
+"## #  ##        ",
+"# # # ##########",
+"#  #            ",
+"# # # ########  ",
+
+"################",
+"                ",
+"                ",
+"##  ############",
+" # #############",
+"### #           ",
+" ## #  #        ",
+"#####           ",
+" ## #           ",
+"#####  #        ",
+" ## #           ",
+"### ############",
+"# ##   #    #   ",
+"  ##############",
+"                ",
+"#############   ",
+
+"################",
+"               #",
+"               #",
+"##########     #",
+"##########     #",
+"        ##  #  #",
+"    #   ## # # #",
+"        ##  #  #",
+"        ##   # #",
+"    #   ##     #",
+"        ##     #",
+"##########     #",
+"# #   # #      #",
+"########       #",
+"  # #          #",
+"  # ######     #",
+
+"#  #  #     ##  ",
+"#     #    # ###",
+"#     #   #     ",
+"#     #      ###",
+"#######     ##  ",
+"#          # #  ",
+"#         #  #  ",
+"#            #  ",
+"#           ##  ",
+"#          # #  ",
+"#         #  #  ",
+"#            #  ",
+"#######     ##  ",
+"#     #    # ###",
+"#     #   #     ",
+"#     #      ###",
+
+"#     #     #   ",
+"#   #####   #   ",
+"   ## # ##  #   ",
+"# ## ### ## #   ",
+"# # # # # # #   ",
+"# ## # # ## # ##",
+"# # # # # # # ##",
+"# ## # # ## # ##",
+"# # # # # # # ##",
+"# ## # # ## # ##",
+"# # # # # # # ##",
+"# ## # # ## # ##",
+"#  ## # ##  #   ",
+"#   #####   #   ",
+"            #   ",
+"#############   ",
+
+"  ##     #     #",
+"  # #    #     #",
+"  #  #   #     #",
+"  #      #     #",
+"         #######",
+"###            #",
+"  ## #         #",
+"  ##           #",
+"###            #",
+"##             #",
+" ##  #         #",
+"  ##           #",
+"         #######",
+"  # #    #     #",
+"  #  #   #     #",
+"  #      #     #",
+
+"#     #      #  ",
+"#     ###### #  ",
+"#          # #  ",
+"#  #       # #  ",
+"# # #   ########",
+"#  #   ## # # # ",
+"# # #  ##       ",
+"#  #    #       ",
+"#      ##       ",
+"#      ##       ",
+"#       #       ",
+"#      ##       ",
+"#      #########",
+"#      #### ####",
+"#               ",
+"################",
+
+"         # #    ",
+"        # #     ",
+"        ## #    ",
+"                ",
+"##############  ",
+"# # # # # # ## #",
+"             ###",
+"            ##  ",
+"             ###",
+"            ## #",
+"             # #",
+"            ## #",
+"############## #",
+"## ##########  #",
+"                ",
+"################",
+
+"  #      #     #",
+"  ########     #",
+"               #",
+" ##########    #",
+"## # # # ##    #",
+"##        #    #",
+"##       ##    #",
+"##        #    #",
+"##       ##    #",
+"##        #    #",
+"##       ##    #",
+"###########    #",
+"##########     #",
+"## ## ###      #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#   # #         ",
+"#  # # #        ",
+"#   # #         ",
+"#  #   #########",
+"# # # # ########",
+"#  # ## #      #",
+"#    #  #      #",
+"#    ## #      #",
+"#    #  #      #",
+"#    ## #      #",
+"#    #  #      #",
+"#    ## #      #",
+"#    #  #      #",
+"#    ## #      #",
+
+"################",
+"                ",
+"                ",
+"                ",
+"################",
+"################",
+"#               ",
+"#               ",
+"#              #",
+"#              #",
+"#               ",
+"################",
+"#   # #     #   ",
+"#              #",
+"# # #   # # # # ",
+"############### ",
+
+"################",
+"               #",
+"               #",
+"               #",
+"#############  #",
+"#############  #",
+"           ##  #",
+"           ##  #",
+"           ##  #",
+"       #   ##  #",
+"      #    ##  #",
+"##   #     ##  #",
+"##  #      ##  #",
+" #         ##  #",
+"##    #    ##  #",
+" #         ##  #",
+
+"#    #  #      #",
+"#    ## #      #",
+"#    #  #      #",
+"#    ## #      #",
+"#    #  #      #",
+"#    ## #      #",
+"#    #  #      #",
+"#    ## #      #",
+"#    #  #      #",
+"#    ## #      #",
+"#    #  #      #",
+"#    ## #      #",
+"#    #  #      #",
+"#    ## #      #",
+"#    #  #      #",
+"#    ## #      #",
+
+"#            #  ",
+"#            ## ",
+"#    #####   #  ",
+"#    ##  ##  ## ",
+"#    ##  ##  #  ",
+"#    #####   ## ",
+"#    ####    #  ",
+"#    ## ##   ## ",
+"#    ##  ##  # #",
+"#            ## ",
+"#            ###",
+"#######         ",
+"#      #        ",
+"###### #        ",
+"#    # #        ",
+"############### ",
+
+"##         ##  #",
+" #         ##  #",
+"##     #   ##  #",
+" #         ##  #",
+"##         ##  #",
+" #         ##  #",
+"#############  #",
+"#           #  #",
+"  # # # #  #   #",
+"          #    #",
+"##########     #",
+"     #  #      #",
+"     #  #      #",
+"    ######     #",
+"   ##    ##    #",
+"  #  ####  #   #",
+
+"#    #  #      #",
+"#    ## #       ",
+"#    #  #    ## ",
+"#    ## #     # ",
+"#    #  #    ## ",
+"#    ## #       ",
+"#    #  #       ",
+"#    ## ########",
+"#    # ##   #   ",
+"#    ##   #   # ",
+"#    ## ########",
+"#      # #      ",
+"#     # # #     ",
+"#    # # #      ",
+"#               ",
+"################",
+
+"############### ",
+"             ###",
+"             ## ",
+"             ## ",
+"             ###",
+"             ## ",
+"             ## ",
+"############### ",
+"#   #   #   ##  ",
+"  #   #   # #   ",
+"############   #",
+"                ",
+"               #",
+"                ",
+"                ",
+"################",
+
+" ## #  # # ##  #",
+"## #  #   # #  #",
+" # ## ### # #  #",
+" # # ### ## #  #",
+"## #   #  # #  #",
+" ## # #  # ##  #",
+"  #  ####  #   #",
+"   ##    ##    #",
+"    ######     #",
+"#              #",
+" #       #     #",
+"#     # # #    #",
+" #   # # #     #",
+"#     # # #    #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#  # #  ########",
+"# # #  ##       ",
+"#  #  # #       ",
+"#    ## #       ",
+"#   #   #      #",
+"#  #  # #     # ",
+"#  ##   #       ",
+"#  #  # #       ",
+"#  ##   #       ",
+"#  #  # #       ",
+"#  ##   #       ",
+"#  #  # #       ",
+"#  ##   ########",
+"#  #  ## # # # #",
+
+"################",
+"           #    ",
+"###       # #   ",
+"  #      # #    ",
+"  ##############",
+"  #             ",
+"  #             ",
+"  #             ",
+"  #             ",
+"  #             ",
+"  #             ",
+"  ##############",
+"  #             ",
+"  #     # #    #",
+"######## # #####",
+" #      # #   # ",
+
+"################",
+"               #",
+"               #",
+" ###########   #",
+"##         #   #",
+" #         #   #",
+" #         #   #",
+" #         #   #",
+" #    #    #   #",
+" #   #     #   #",
+" #         #   #",
+"##         #   #",
+"##         #   #",
+"##         #   #",
+"##         #   #",
+" #         #   #",
+
+"#  ## #         ",
+"#  #  #         ",
+"#  ## #         ",
+"#  #  #    #    ",
+"#  ## #         ",
+"#  #  #         ",
+"#  ## #         ",
+"#  #  #    #    ",
+"#  ## #         ",
+"#  #  #         ",
+"#  ## #         ",
+"#  #  #         ",
+"#  ## # ########",
+"#  #  ##########",
+"#  ## # #       ",
+"#  #  # #       ",
+
+"#        # #  # ",
+"#           # # ",
+"#          # ## ",
+"#   #####   # # ",
+"#   ##  ##    # ",
+"#   ##  ##    # ",
+"#   #####     # ",
+"#   ####      # ",
+"#   ## ##     ##",
+"#   ##  ##    ##",
+"#            # #",
+"#           ####",
+"################",
+"################",
+"                ",
+"                ",
+
+"##         #   #",
+" #         #   #",
+"##         #   #",
+" #         #   #",
+"##         #   #",
+" #         #   #",
+"##         #   #",
+"#############  #",
+"#           #  #",
+"#           #  #",
+"#           #  #",
+"#           #  #",
+"##          #  #",
+"##          #  #",
+"##          #  #",
+"##          #  #",
+
+"#  ##   #       ",
+"#  #  # #   # # ",
+"#  ##   #       ",
+"#  #  # #       ",
+"#  ##   #       ",
+"#  #  # #       ",
+"#  ##   #       ",
+"#  #  # ########",
+"#  ##  ##   #   ",
+"#  #  #         ",
+"#  ####   #   # ",
+"#  ##           ",
+"#  #############",
+"#               ",
+"#               ",
+"################",
+
+"                ",
+"#               ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"################",
+"#   #   #   #   ",
+"               #",
+"  #   #   #   # ",
+"             #  ",
+"################",
+"                ",
+"                ",
+"################",
+
+"##          #  #",
+"##    ###   #  #",
+"##    # #   #  #",
+"##    # #   #  #",
+"##    ###   #  #",
+"##          #  #",
+"##          #  #",
+"##          #  #",
+"#############  #",
+"           #   #",
+"  #   #   #    #",
+"         #   # #",
+"#########   #  #",
+"           # # #",
+"               #",
+"################",
+
+"          ######",
+"######### #     ",
+"#        ##     ",
+"# # #   # #     ",
+"## #   ## #     ",
+"# # # #   #     ",
+"#  # ## # #     ",
+"#   #     #     ",
+"#  #  # # #     ",
+"#  #      #    #",
+"#  ## # # #     ",
+"#  #      #     ",
+"#  #  # # ######",
+"#  # #   #      ",
+"#  ## # # #   # ",
+"#  #   #        ",
+
+"#####       ####",
+"    ###### ##   ",
+"    #     # #   ",
+"    #    # ##   ",
+"    ##### # #   ",
+"    #   ##  #   ",
+"    #   # # #   ",
+"    #   #  ##   ",
+"    #   # # #   ",
+"    #   ## #####",
+"    #   # #     ",
+"    ######      ",
+"#####           ",
+"   #           #",
+"  ############# ",
+" #            # ",
+
+"############### ",
+"             ## ",
+"             ## ",
+"   #         ## ",
+"  #          ## ",
+"             ## ",
+"         #   ## ",
+"             ## ",
+"         #   ## ",
+"####         ## ",
+"  ##     #   ## ",
+" # #         ## ",
+"#  #############",
+"  ##############",
+" # #          ##",
+"## #          ##",
+
+"#  #  ##########",
+"#  #  #         ",
+"#  ## #   #   # ",
+"#  #  #         ",
+"#  #  # #   #   ",
+"#  # ##         ",
+"#  ## #   #   # ",
+"#  #  #         ",
+"#  #  # #       ",
+"#  #  #    #####",
+"#  ## #   ######",
+"#  #  #  # #    ",
+"#  #  # #  #    ",
+"#  # ###   #    ",
+"#  ##   #  #    ",
+"#  #       #    ",
+
+"###########   ##",
+"#         #   # ",
+"#  #####  #  #  ",
+"# ## # ## # #   ",
+"# # ### # # # # ",
+"# ## # ## # ##  ",
+"# # # # # # # # ",
+"# ## # ## # #   ",
+"# # # # # # # # ",
+"###### ## # #   ",
+"##### # # # # # ",
+"   ### ## # #   ",
+"   #############",
+"   #############",
+"                ",
+"                ",
+
+"   #          ##",
+"   #          ##",
+"#  #          ##",
+"   #          ##",
+"#  #          ##",
+"   #  #####   ##",
+"#  #  ##  ##  ##",
+"   #  ##  ##  ##",
+"#  #  #####   ##",
+"   #  ####    ##",
+"#  #  ## ##   ##",
+"   #  ##  ##  ##",
+"####          ##",
+"###           ##",
+"              ##",
+"              ##",
+
+"#  #  # #  #   #",
+"#  #       #    ",
+"#  ## # #  #    ",
+"#  #       #    ",
+"#  #  # #  #### ",
+"#  # #    #  ###",
+"#  ## #  #  ##  ",
+"#  #    #  ## ##",
+"#  #   #  ##    ",
+"#  #  #  ## ## #",
+"#  # #  ##    # ",
+"#  ##  ## ## #  ",
+"#  # ###    ####",
+"#     ######    ",
+"#               ",
+"################",
+
+"                ",
+"          #     ",
+"                ",
+"                ",
+"   ########    #",
+"####     #######",
+"  #  #  ##    # ",
+" #     ## ## #  ",
+"#  #  ##    #  #",
+"     ## ## #    ",
+" #  ##    #  #  ",
+"   ## ## #     #",
+"####    #### ###",
+"  ######      ##",
+"                ",
+"################",
+
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"#######    #####",
+"     #######  # ",
+" #  ##    #  ## ",
+"   ## ## #  # # ",
+"  ##    #  #  # ",
+" ## ## #  #   # ",
+"##    #  #    # ",
+"# ## #  #  #  # ",
+"    ####  # # # ",
+"####       #  # ",
+"          #   # ",
+"############### ",
+
+"                ",
+"                ",
+"################",
+"#               ",
+"#               ",
+"#         # #   ",
+"#   # #    # #  ",
+"#  # #    # #  #",
+"#   # #   ##  # ",
+"#   ##   #    ##",
+"#  #          # ",
+"#         ######",
+"#        #######",
+"#       ###     ",
+"#      ## #     ",
+"#     ## ##   # ",
+
+"      ##########",
+"     ###########",
+"##### #         ",
+"   # ##         ",
+"  # # #  #    # ",
+" # # ##         ",
+"# # # #         ",
+" # # ##         ",
+"# # # #         ",
+" # # ##         ",
+"# # # #         ",
+"#######         ",
+"######    ##### ",
+"         #     #",
+"        #  ###  ",
+"       #   ###  ",
+
+"###             ",
+"###             ",
+" #############  ",
+" ##          #  ",
+" ##          #  ",
+" ##          #  ",
+" ##          #  ",
+" ##          #  ",
+" ##          #  ",
+" ##          #  ",
+" ##          #  ",
+" ###############",
+" ###############",
+"              ##",
+"#             ##",
+" #         #  ##",
+
+"#    ## # #     ",
+"#   ## # ##     ",
+"#  ## # # #     ",
+"# ## # # ##     ",
+"# # # # # #   # ",
+"# ## # # ##     ",
+"# # # # # #     ",
+"# ## # # #######",
+"# # # # ##      ",
+"# ## # ## # # # ",
+"# # # ##        ",
+"# ## ## # # # # ",
+"# # ##          ",
+"# ### # # # # # ",
+"# ##   ##      #",
+"# ##############",
+
+"       # #######",
+"       # #######",
+"       # #######",
+"       #   ###  ",
+"        #  ###  ",
+"         #     #",
+"          ##### ",
+"#######         ",
+"     ##         ",
+"# # ###         ",
+"   ## #         ",
+"# ## ##         ",
+" ## # #         ",
+"## # ##         ",
+"# # # #         ",
+" # # ##  #    # ",
+
+" #            ##",
+" #            ##",
+" #            ##",
+" #            ##",
+"#          #  ##",
+"              ##",
+"              ##",
+"  ##############",
+" ##           # ",
+" ### # # # # #  ",
+" ##         ##  ",
+" ### # # # # #  ",
+" ##       #  #  ",
+" ### # # #   #  ",
+" ##     #    #  ",
+" ## ####     #  ",
+
+"#     # #     # ",
+"#  #### ####  ##",
+"#  #       #### ",
+"#  # ##       ##",
+"#  #       #### ",
+"#  # ##    #  ##",
+"#  #     ###  # ",
+"####       #  ##",
+"#          #  # ",
+"####       #  ##",
+"#  # ## ## #  ##",
+"#  #       #    ",
+"#  # ## ## #    ",
+"#  #########    ",
+"#               ",
+"################",
+
+"# # # #         ",
+" # # ##         ",
+"# # # ##########",
+" # # #          ",
+"# # # # # # # # ",
+" # #           #",
+"# # # # # # # # ",
+" #           #  ",
+"# # # # # # #   ",
+"     ##    #    ",
+"###########     ",
+"  #     #       ",
+"  #     #       ",
+" # ##### #      ",
+"# #     # #     ",
+"################",
+
+" ##          #  ",
+" ##          #  ",
+"###   # #    #  ",
+" #   # #     #  ",
+"#    ## #    #  ",
+"    ##       #  ",
+"    #        #  ",
+"             #  ",
+"             #  ",
+"        #    #  ",
+"       # #   #  ",
+"      # #    #  ",
+"     ### #   #  ",
+"     #       #  ",
+"             #  ",
+"##############  ",
+
+"################",
+"#               ",
+"#   #           ",
+"#  # # #     ###",
+"#   # # #   ##  ",
+"#    # #   # #  ",
+"#   # #   #  #  ",
+"#        #   #  ",
+"# #     #    #  ",
+"#  #   #  #  #  ",
+"# #   #  ##  ###",
+"## #  #  ## ####",
+"# #   #  #  #   ",
+"## #  #     #   ",
+"# #   #   # #   ",
+"#  #  #  ## #   ",
+
+"################",
+"             # #",
+"            # # ",
+"######          ",
+"     ###########",
+"     #          ",
+"     #          ",
+"     #          ",
+"     #          ",
+"     #          ",
+"######      # # ",
+"#####           ",
+"                ",
+"                ",
+"                ",
+"  #             ",
+
+"################",
+"               #",
+"          # #  #",
+"           # # #",
+"#############  #",
+"            #  #",
+"         #  #  #",
+"            #  #",
+"         #  #  #",
+"            #  #",
+"#        #  #  #",
+"            #  #",
+"            #  #",
+"            #  #",
+"            #  #",
+"         #  #  #",
+
+"#   # #  ## #   ",
+"#  #  #  #  #   ",
+"# #   #     #   ",
+"#  #  #   # #   ",
+"# #   #  ## #   ",
+"#  #  #  ## #   ",
+"# # # #  #  #  #",
+"#  #  #     #   ",
+"# #   #   # #  #",
+"#  #  #  ## #   ",
+"# #   #  ## #   ",
+"##    #  #  #   ",
+"# #   #     #   ",
+"#     #   # #   ",
+"# #   #  ## #   ",
+"#  #  #  ## #   ",
+
+"                ",
+"                ",
+"  #             ",
+"                ",
+"                ",
+"  #             ",
+"               #",
+"# #          ## ",
+" # # #      ##  ",
+"  # # #    # # #",
+"   # # #  #  ## ",
+"  # # # ## # ###",
+"   # # ## # #   ",
+"    # ## # #  ##",
+"     # ## #  ###",
+"      ## #  ### ",
+
+"        #   #  #",
+"     #####  #  #",
+"      #     #  #",
+"     #      #  #",
+"   ###      #  #",
+" ### #      #  #",
+"# #  #      #  #",
+" #   #      #  #",
+"#    #      #  #",
+"     #      #  #",
+"     #      #  #",
+"######      #  #",
+"    #       #  #",
+"   #        #  #",
+"  #         #  #",
+" #          #  #",
+
+"# #   #  #  #   ",
+"#  #  #     ####",
+"# #   #    #    ",
+"#     #   #   ##",
+"# #   #  #   ###",
+"#     # #       ",
+"#     ##        ",
+"#     ##########",
+"#               ",
+"# # # #        #",
+"#  # #        # ",
+"# # # #        #",
+"#  # #          ",
+"#   # #         ",
+"#               ",
+"################",
+
+"       ##       ",
+"########       #",
+"          ###   ",
+"#       #####   ",
+"       ## # #   ",
+"      ## # #    ",
+"     ## # #     ",
+" ###############",
+"# #             ",
+" #             #",
+"# #           # ",
+" #             #",
+"#             # ",
+"                ",
+"                ",
+"################",
+
+"#           #  #",
+"#############  #",
+"           ##  #",
+"   ###    ##   #",
+"  ###    ##    #",
+"        ##     #",
+"       ##      #",
+"########       #",
+"               #",
+"               #",
+"#     #        #",
+" #   # #       #",
+"#   # # #      #",
+"     # #       #",
+"    # #        #",
+"################",
+
+"################",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+
+"################",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"################",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+
+"                ",
+"                ",
+"     ######     ",
+"    ##   ###    ",
+"   ##     ##    ",
+"   ##           ",
+"   ##           ",
+"   ##           ",
+"   ##           ",
+"   ##           ",
+"   ##     ##    ",
+"    ##   ##     ",
+"     #####      ",
+"                ",
+"                ",
+"                ",
+
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"################",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"################",
+
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"################",
+
+"################",
+"# #   #   #   # ",
+"#   #   #   #   ",
+"# #  ##   ######",
+"#   #   ##      ",
+"# #   ##        ",
+"#   # #         ",
+"# #   #         ",
+"# # # #      ###",
+"# #   #     #   ",
+"#   # #     #   ",
+"# # # #     #   ",
+"#   # #     #   ",
+"# #   #      ###",
+"#   # #       ##",
+"# #   #     # # ",
+
+"################",
+"  # # #   #   # ",
+"#   #   #   #   ",
+"################",
+"                ",
+"                ",
+"                ",
+"                ",
+"################",
+" ###############",
+"##              ",
+"##     ####     ",
+"##    ##  ##    ",
+"##    ##        ",
+"##    ##        ",
+" #    ##        ",
+
+"################",
+"  #   #   #   ##",
+"#   #   #   #  #",
+"#######   #  ###",
+"      ###   #  #",
+"        # #   ##",
+"         #  #  #",
+"         ##   ##",
+"###      # ##  #",
+"#  #     ##   ##",
+"## #     #  #  #",
+"#  #     ##   ##",
+"#  #     #  ## #",
+"###      ##   ##",
+"###      #  #  #",
+"## #     ##   ##",
+
+"#  ## # #    ###",
+"# #   ###     # ",
+"#   # # #   # ##",
+"# #  # ##    ## ",
+"#   ### #     ##",
+"# ## # ##   # # ",
+"#   ### #    ###",
+"# #  # ##     # ",
+"#   ### #   # ##",
+"# #  # #     ## ",
+"#   ###       ##",
+"# # # #     # # ",
+"#  ## #      ###",
+"# #   #       # ",
+"#   # #     # ##",
+"# #   #      ## ",
+
+"##    ##  ##    ",
+" #     ####     ",
+"##              ",
+" ###############",
+"#####  ##  #####",
+"   ##########   ",
+"####        ####",
+"   ##########   ",
+"#### # # # #####",
+"   ## #   # #   ",
+"#### # # # #####",
+"   ## # # # #   ",
+"#### # # # #####",
+"   #  # # # #   ",
+"#### # # # #####",
+"   ## # # # #   ",
+
+"##       #  #  #",
+"###      ##   ##",
+"## #     #  #  #",
+" #       ##   ##",
+"###      #  #  #",
+" # #     ## # ##",
+"##       # ##  #",
+" ##      ##   ##",
+"## #     #  #  #",
+" #       ##   ##",
+"###      #  #  #",
+" # #     ##   ##",
+"##       #  #  #",
+" ##      ##   ##",
+"## #     #  #  #",
+" #       ##   ##",
+
+"#   # #    #####",
+"# #   #   # # # ",
+"#   # #   ## # #",
+"# #   #   ######",
+"#######         ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"################",
+"# #   #   #   # ",
+"#   #   #   #   ",
+"# ##  #   #   # ",
+"#   #   #   #   ",
+"################",
+
+"#### # # # #####",
+" ## # #   # # ##",
+" # # # # # # # #",
+"################",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"################",
+"  #   #   #   # ",
+"#   #   ##  #   ",
+"  #   #   #   # ",
+"#   #   #   # # ",
+"################",
+
+"####     #  ## #",
+"  # #    ##  ###",
+" # ##    #  #  #",
+"#####    ##   ##",
+"         #######",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"################",
+"  #   #   #   ##",
+"#   #  ##   #  #",
+"  #   #   # # ##",
+"#   #   #   #  #",
+"################",
+
+"################",
+"# #   #   #   # ",
+"#   #       #   ",
+"#     #   #   # ",
+"#   #   #   #   ",
+"# #   ######### ",
+"#   # ##     #  ",
+"# #  # # # # ## ",
+"#   ## #     #  ",
+"# #  # #     ## ",
+"#   ## # # # #  ",
+"# #  # #     ## ",
+"#   ## #######  ",
+"# #  ##  #  # # ",
+"#   #########   ",
+"# #   ##  #  ## ",
+
+"################",
+"  #   #   #   # ",
+"#   #   #   #   ",
+"  #   #       # ",
+"# ##### ##  #  #",
+"  #   # # #  ## ",
+"#   #  ##   #   ",
+"  #   #   ##    ",
+"  ###   # #     ",
+" # #  #  #  #   ",
+"#####   # #     ",
+"  #   ## #      ",
+"#   # #         ",
+"  #  #    #  #  ",
+"#   #    #      ",
+"# # ##          ",
+
+"################",
+"  #   #   #   ##",
+"#   #   #####  #",
+"  #   #   #   ##",
+"######  #   #  #",
+"      ##  #   ##",
+"        #      #",
+"         ##   ##",
+"   ####   # #  #",
+"  ##  ##   #  ##",
+"  ##       ##  #",
+"  ##        # ##",
+"  ##        #  #",
+"  ##  ##    # ##",
+"   ####     #  #",
+"            # ##",
+
+"#     # #   #  #",
+"# #   #   #   # ",
+"#   #  ##   #   ",
+"# #   #   #   # ",
+"#   #   #   #  #",
+"# #   ##  #   ##",
+"#   # # #    ## ",
+"# #   #   # ##  ",
+"#   #  ##  ##   ",
+"# #   #   #   # ",
+"#   #   #   #  #",
+"#     ##  #   ##",
+"#   # # #    ## ",
+"# #   #   # ##  ",
+"#   #  ##  ##   ",
+"# #   #   #   # ",
+
+"#  ##      #    ",
+"  ###     #     ",
+" ## #           ",
+"##   ##      #  ",
+"#   ##      #   ",
+"  # ###         ",
+"#  ## #        #",
+"  ##  ##        ",
+" ## #   # #     ",
+"##    #  #      ",
+"#   #   ####    ",
+"  #    ## # ####",
+"#   # ###    ## ",
+"  #  ##   # ### ",
+"#   ##  #  ##  #",
+"   ## #   ##  ##",
+
+"            #  #",
+"#           # ##",
+"           ##  #",
+"    #   #  #  ##",
+"          # #  #",
+"#        ##   ##",
+"    #  ##   #  #",
+"   #  ##  #   ##",
+"      # #   #  #",
+"     ##   #   ##",
+"#  ##   #   #  #",
+"####  #   #   ##",
+"### #   # ###  #",
+"###   #   ##  ##",
+"# # #   # ###  #",
+" ##       ##  ##",
+
+"#   #   #   #   ",
+"# #   ##  #     ",
+"#  ## # #   #   ",
+"# #   #  ###  ##",
+"#   #  ### ##   ",
+"# #   #  ###  # ",
+"#   #   #   #   ",
+"# #   ##  #  ## ",
+"#  ## # ##  #  #",
+"# #   #   #   # ",
+"#   #   #   #   ",
+"# #       #   # ",
+"#   #   #   #   ",
+"# #   #   #   # ",
+"#   #   #   #   ",
+"################",
+
+"# ##     ##  ## ",
+" ##   # ##  ### ",
+"##  #  ##  ##   ",
+"# #   ##  ##  # ",
+"#   ### #   #   ",
+"  #   #   #   # ",
+"#   #   #   #   ",
+"# ##  #  ## # ##",
+"# # ##  #  ## # ",
+"  #   #   #   # ",
+"#   #       #   ",
+"  #   #   ### ##",
+"#   #   ## #####",
+"  #   #   #   # ",
+"#   #   #   #   ",
+"################",
+
+"#   #   # # #  #",
+"  #   #   #   ##",
+"##  #   #   #  #",
+"  #   #   #   ##",
+"# # #   ##  #  #",
+" ##   # # #   ##",
+"#   #  ##      #",
+"  #   #   #   ##",
+"##  ##  #   #  #",
+"  #   #   #   ##",
+"#  ##       #  #",
+"# #   #   #   ##",
+"#   #   #   #  #",
+"  #   #   #   ##",
+"#   #   #   #  #",
+"################",
+
+"################",
+"# #   #   #   # ",
+"#   #  #########",
+"# #   ## #   #  ",
+"#   ####   #   #",
+"# # ## # #   #  ",
+"#  ## ##   #   #",
+"# #### # #   #  ",
+"#  ## ##   #   #",
+"# ## ###     #  ",
+"#  ## ##   #   #",
+"# #### # #   #  ",
+"#  ## ##   #   #",
+"# ## ### #      ",
+"#  ## ##   #   #",
+"# #### # #   #  ",
+
+"################",
+"  #   #   #   # ",
+"##  #   #   #   ",
+" ###############",
+" #              ",
+" #              ",
+" #            # ",
+" #       #  #   ",
+" #       ## ##  ",
+" #              ",
+" #              ",
+" #     #        ",
+" #              ",
+" ###############",
+" # # # # # # ###",
+" ## # # # # ####",
+
+"################",
+"  #   #   #   ##",
+"#   #   #   #  #",
+"###########   ##",
+"          ###  #",
+"          #   ##",
+"          # #  #",
+"          #   ##",
+"          # #  #",
+"          #   ##",
+"          # #  #",
+"          #   ##",
+"          # #  #",
+"###########   ##",
+"############## #",
+"################",
+
+"#  ## ##   #   #",
+"# ## ### #   #  ",
+"#  ## ##   #   #",
+"# #### # #   #  ",
+"#  ## ##   #   #",
+"# ## ### #   #  ",
+"#  ## ##   #   #",
+"# #### # #   #  ",
+"#  ## ##   #   #",
+"# ## ### #   #  ",
+"#  ## ##   #   #",
+"# #### # #   # #",
+"#  ## ##   #  ##",
+"# ## ### #     #",
+"#  ## ##  ##  ##",
+"# #### #########",
+
+" ############## ",
+" ##   #   ### # ",
+" #  ##  # ## ## ",
+" ### ### ## # # ",
+" # ##   ## # ## ",
+" ##  #### # # # ",
+" ## ## # # # ## ",
+" ##  #### # # # ",
+" #  ## # # # ## ",
+" ##   ### # # # ",
+" #  ## # # # ## ",
+" ##   ### # # # ",
+"##  ## # # # ## ",
+"###   ### # # # ",
+"##  #  # # # ## ",
+"### ############",
+
+"            ## #",
+"            ####",
+"            ## #",
+"  ##        ####",
+"            ## #",
+"  ##        ####",
+"            ## #",
+"    ####    ####",
+"   ##  ##   ## #",
+"   ##       ####",
+"   ##       ## #",
+"   ##       ####",
+"   ##  ##   ## #",
+"    ####    ####",
+"            ## #",
+"  ##        ####",
+
+"#  ## ##########",
+"# ## ## #       ",
+"#  ### ##       ",
+"# ###   #       ",
+"#  # # ##     # ",
+"# ##    #       ",
+"#  # # ##       ",
+"# ##    ########",
+"#  # # #  # # # ",
+"# ##  #         ",
+"#  # #  # # # # ",
+"# ###           ",
+"#  #############",
+"# #   #   #   # ",
+"#       #   #   ",
+"################",
+
+"################",
+"              ##",
+"              ##",
+"              ##",
+"    #      #  ##",
+"          #   ##",
+"              ##",
+"################",
+"# # # # # #   ##",
+"             #  ",
+"# # # # #   ## #",
+"           #    ",
+"################",
+"  #   #   #   # ",
+"#   #       #   ",
+"################",
+
+" #  #       ## #",
+"##  #  # #  ####",
+"####        ## #",
+" ##         ####",
+"            ## #",
+"################",
+" # #  # # # #  #",
+"           #  ##",
+" #  # # # # #  #",
+"         ##   ##",
+" ## # # #   #  #",
+"##     #  #   ##",
+"####### # # #  #",
+"  #   #   # # ##",
+"#   #   #   #  #",
+"################",
+
+"################",
+"# #   #   #   # ",
+"#   #   #   #   ",
+"# #   #   #   ##",
+"#   #   #   ### ",
+"# #   #   # ### ",
+"#   # # #  ## # ",
+"# #   #   ## ## ",
+"#   #   ### # # ",
+"# #   # ## #### ",
+"#   #  ## # # # ",
+"# #   ## ### ## ",
+"#   # # # # # # ",
+"# #   #### #### ",
+"# # # # # # # # ",
+"# #   ## ### ## ",
+
+"################",
+"  #   #   #   # ",
+"#   #   #   #   ",
+"############### ",
+"# # # # # # # # ",
+"             ###",
+"     ###      ##",
+"    #   #    ## ",
+"   ##   #     # ",
+"   ##   #    ## ",
+"   #####  #   # ",
+"    ###      ## ",
+"        #     ##",
+"     #       ## ",
+"           #  # ",
+"             ## ",
+
+"################",
+"  #   #   #   ##",
+"#   #   #   #  #",
+"  #   #   #   ##",
+"#   #   #   #  #",
+"############  ##",
+" # # # # # ##  #",
+"          ##  ##",
+"           ##  #",
+"          ##  ##",
+"           ##  #",
+"          ##  ##",
+"#############  #",
+" #        #   ##",
+"      #  #  #  #",
+" #      # #   ##",
+
+"#   # # # # ### ",
+"# #   #### # ## ",
+"# # # # # ### # ",
+"# #   ## # # ## ",
+"#   # # ### ### ",
+"# #   ## # # ## ",
+"# # # ### ### # ",
+"# #   ## # # ## ",
+"#   # # ### ### ",
+"# #   ## # # ## ",
+"# # # ### ### # ",
+"# #   ## # # ## ",
+"#   # # ### ### ",
+"# #   ## # # ## ",
+"# # # ### ### # ",
+"# #   ## # # ## ",
+
+"              # ",
+"    ####     ###",
+"   ##  ##     ##",
+"   ##        ## ",
+"   ##         # ",
+"   ##        ## ",
+"#  ##  ##     # ",
+"    ####     ## ",
+"#             # ",
+"             ## ",
+"#   #         # ",
+"   #     #   ## ",
+"        #     # ",
+"             ## ",
+"              # ",
+"         #   ## ",
+
+"    #  ##   #  #",
+"############  ##",
+" # # # # # ##  #",
+"          ##  ##",
+"#          ##  #",
+"          ##  ##",
+"  #        ##  #",
+"          ##  ##",
+"    #      ##  #",
+"          ##  ##",
+"      #    ##  #",
+"          ##  ##",
+"    ###    ##  #",
+"   ## #   ##  ##",
+" # ## #    ##  #",
+" # ####   ##  ##",
+
+"#   # # ### ### ",
+"# #   ## # # ###",
+"# # # ### ### # ",
+"# #   ## # # ###",
+"#   # # ### ##  ",
+"# #   ## # ##  #",
+"#   # ### ##    ",
+"# #   ## ##  # #",
+"#   # # ##      ",
+"# #   ###  # # #",
+"# # # ##      # ",
+"# #   ##########",
+"#   #   #   #   ",
+"# #   #   ######",
+"#   #   #       ",
+"################",
+
+"        #     # ",
+"             ## ",
+"              # ",
+"############### ",
+"            ##  ",
+" # # # # #  #   ",
+"           #    ",
+" # # # #  ######",
+"         ## # # ",
+"## ###  #       ",
+"    #  #  #   # ",
+"################",
+"#   #        # #",
+"############## #",
+"                ",
+"################",
+
+"   ###     ##  #",
+"          ##  ##",
+"  #   #    ##  #",
+"          ##  ##",
+"           ##  #",
+"          ##  ##",
+"           ##  #",
+"############  ##",
+"# # # # # # #  #",
+"         ##   ##",
+"  #   # # # #  #",
+"########  #   ##",
+"        #   #  #",
+"###   #   #   ##",
+"        #   #  #",
+"################",
+
+"          ######",
+"###########     ",
+"#   #   ###     ",
+"# # # #####  #  ",
+"#   # ## ##     ",
+"###  #### #  #  ",
+"#   ## # ##     ",
+"# ##### ###  #  ",
+"#  # # # ##     ",
+"# ### ### #     ",
+"#  # # # #######",
+"# ##### ##      ",
+"#  # # ## #  ## ",
+"##### ###       ",
+"#  # # ##  #   #",
+"# ##### #       ",
+
+"######          ",
+"     ###########",
+"     ####   #   ",
+" ##  # # ## # # ",
+"#  # # ## ### ##",
+"#  # # #  #   ##",
+" ##  # ###  ## #",
+"     # #  # ####",
+"     # ##  # # #",
+"     # #  ######",
+"###### ### # # #",
+"    #  #########",
+"# ##  ## # # # #",
+"      ##########",
+"## # ### # # # #",
+"      ##########",
+
+"                ",
+"################",
+"#   #   #   #  #",
+"################",
+"############## #",
+"#           ####",
+"#           ## #",
+"#       ##  ####",
+"#      # #  ## #",
+"#      # #  ####",
+"#       ##  ## #",
+"#           ####",
+"#           ## #",
+"#           ####",
+"#   #       ## #",
+"#  ##       ####",
+
+"#  # # ##   ####",
+"# ### ###  ##   ",
+"#  # # ## ###   ",
+"# ##### ### #   ",
+"#  # # ### ##   ",
+"# ### ### ###   ",
+"#  # # # # ##   ",
+"# ##### ### #   ",
+"#  # # # # ##   ",
+"# ### ### ###   ",
+"#  # # # # ##   ",
+"####### ### #   ",
+"## # # # # ##   ",
+"# ### ### ### # ",
+"#  # # # # ##   ",
+"# ##### ### #  #",
+
+"########## # # #",
+"         #######",
+"         # # # #",
+"   #     #######",
+"    #    # # ## ",
+"         #####  ",
+" ####    # ## # ",
+"##  ##   ###    ",
+"##       ## # # ",
+"##       #     #",
+"##       ## # # ",
+"##  ##   ##### #",
+" ####    ## ### ",
+"         ##### #",
+"# # #    ###### ",
+"  #      ## ## #",
+
+"#  #        ## #",
+"#           ####",
+"############## #",
+"            # ##",
+"# # # # # ###  #",
+"          #   ##",
+"# # # # ##  #  #",
+" ###############",
+"##             #",
+" #             #",
+"##   ######### #",
+" #  ##     # # #",
+"##      # # ## #",
+" #  #  # #     #",
+"##   #  #  ##  #",
+"##        #    #",
+
+"#  # # # # ##   ",
+"# ### ### ###   ",
+"## # # # # ##   ",
+"# ##### ### ####",
+"#  # # # # #    ",
+"##### ### #  # #",
+"#  # # # #      ",
+"# ##### #   # # ",
+"#  # # #        ",
+"# ### #    #    ",
+"#  # #  ##  # ##",
+"# ###           ",
+"#  #############",
+"# #   #   ##  # ",
+"#   #   #   #   ",
+"################",
+
+"         ###### ",
+"         #  ## #",
+"         # #### ",
+"############## #",
+"        #### ## ",
+"  #  # ### ### #",
+"      ######### ",
+"  #  #########  ",
+" #              ",
+"          #     ",
+" ## # #     ##  ",
+"     #          ",
+"################",
+"  #   #   #   # ",
+"#   # # #   # # ",
+"################",
+
+"##  #  ##      #",
+" #    #        #",
+"##  #          #",
+" ############## ",
+"#             ##",
+" #      #    ###",
+"    ##    # #  #",
+"  ##    #  #  ##",
+"          # #  #",
+"#      # ##   ##",
+" # #    #   #  #",
+"#      #  # # ##",
+"####### # # #  #",
+"  #   #   ### ##",
+"#   #   #   #  #",
+"################",
+
+"################",
+"#               ",
+"# #   #   #   # ",
+"# #  ###########",
+"#   ### # # # # ",
+"#   ## # # # # #",
+"# # ##  ########",
+"#   ##  # ######",
+"#   ##  # #   ##",
+"#   ##  # #   ##",
+"# # ##  # #   ##",
+"#   ##  # #   ##",
+"#   ##  # #   ##",
+"# # ##  # #   ##",
+"# # ##  # #   ##",
+"#   ##  # ######",
+
+"################",
+"                ",
+"  #   #   #   # ",
+"### ############",
+"### # # #  #  # ",
+"### #   #  #  # ",
+"# # # # #  #  # ",
+" ## # #         ",
+"# # #           ",
+" ## #           ",
+"# # #    ####   ",
+" ## #   ##  ##  ",
+"# # #   ##      ",
+" ## #   ##      ",
+"# # #   ##      ",
+" ## #   ##  ##  ",
+
+"################",
+"               #",
+"  #   #   #   ##",
+"######## #     #",
+" #  #  ##   #  #",
+" #  #  #       #",
+" #  #  #  #   ##",
+"       #   ##  #",
+"       ##   #  #",
+"       #       #",
+"  ## # #  #   ##",
+"  ## # #       #",
+"       ##   #  #",
+"       #       #",
+"       #  #   ##",
+"    #########  #",
+
+"#   ##  ##     #",
+"#   ##  ########",
+"# # ## #        ",
+"#   ###         ",
+"#   ############",
+"#    ###########",
+"# #   #   #   # ",
+"################",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"########      ##",
+"#       #    # #",
+"# #   # #     ##",
+"#       #       ",
+
+"# # #    ####   ",
+" ## #           ",
+"# # #           ",
+" ## #           ",
+"### #           ",
+"##  ###     ####",
+"  #   #     #   ",
+"#######     ####",
+"                ",
+"                ",
+"                ",
+"                ",
+"################",
+" # # # # # # # #",
+"################",
+"   # ###        ",
+
+"   #       ##  #",
+"  #       #    #",
+" ###########  ##",
+"    ## #       #",
+"   ##  ##   #  #",
+"########       #",
+" ##   #   #   ##",
+"################",
+"               #",
+"               #",
+"               #",
+"               #",
+"#      #########",
+" #    #        #",
+"#     #   #   ##",
+"      #        #",
+
+"#   #   #       ",
+"#       #       ",
+"# #   #  #      ",
+"#  #      ######",
+"#  ##   #   #   ",
+"#               ",
+"# #   ##  #   # ",
+"#   #           ",
+"#   #   # # #   ",
+"#               ",
+"# ##  #   #   # ",
+"#     #    #    ",
+"#   #   #   #   ",
+"#               ",
+"# #   #   #   # ",
+"################",
+
+"   # ###        ",
+"                ",
+"    ##  ##      ",
+"## ######   ####",
+"####    #   #   ",
+" ###    ########",
+"##              ",
+"##              ",
+"##              ",
+"##              ",
+"##              ",
+"##              ",
+"################",
+"################",
+"  #   #   #   # ",
+"################",
+
+"      # #   #  #",
+"      #    #   #",
+"     ##   #   ##",
+"#####          #",
+"#   #   #   #  #",
+"##  #   #      #",
+" ##   #   #   ##",
+" #   ##        #",
+" #  #   ##  #  #",
+" #             #",
+" ##   ##  #   ##",
+" #             #",
+"##  #   #   #  #",
+"#              #",
+"  #   #   #   ##",
+"################",
+
+"################",
+"#               ",
+"# # # # # # # # ",
+"#  # # # # # # #",
+"#   #   #   #   ",
+"#  #     #  #  #",
+"# # # # # ##  # ",
+"#  #    ##  # ##",
+"#   #   # ###   ",
+"#  #       # ###",
+"# # # #   #  #  ",
+"#  #         #  ",
+"#   #   #   ##  ",
+"#  #  ##  #  #  ",
+"# # # # ###  #  ",
+"#  #      #  #  ",
+
+"################",
+"                ",
+"# # # # # # # # ",
+" # # # # # # # #",
+"#   #   ########",
+" ##    ##       ",
+"###   # #       ",
+" ## ##  #       ",
+"#   ##  #   # # ",
+"###### ##   ####",
+"    #####   # # ",
+"    ### #       ",
+" #####  #       ",
+" #  ##  #       ",
+" ##  #  ########",
+" #   # #        ",
+
+"################",
+"               #",
+"# # # # # # # ##",
+" # # # # # #   #",
+"#############  #",
+"           #   #",
+"           ## ##",
+"           #   #",
+"#          ##  #",
+"#          #   #",
+"#          ## ##",
+"           #   #",
+"           ##  #",
+"           #   #",
+"########### # ##",
+"         # #   #",
+
+"#   #   ##  ##  ",
+"#  #    #    #  ",
+"# # # #   #  #  ",
+"#  #         #  ",
+"#   #   #   ##  ",
+"#  #         #  ",
+"# # # #  #######",
+"#  #    ########",
+"#   #  # ### # #",
+"#  #  #  #######",
+"# # ##   ### # #",
+"#  # # # #######",
+"#   ###  ### # #",
+"#  # #   #######",
+"# # ## # ### # #",
+"#  # #   #######",
+
+" #  ###         ",
+" #   ###########",
+" ##   #   #   # ",
+" #              ",
+" #  #   #   #   ",
+" #      ########",
+"####### #       ",
+"####### #  #### ",
+" # # ## # ##  ##",
+"####### # ##    ",
+" # # ## # ##    ",
+"####### # ##    ",
+" # # ## # ##  ##",
+"####### #  #### ",
+" # # ## #       ",
+"####### #       ",
+
+"        #   #  #",
+"########   #   #",
+"  #   #   # # ##",
+"           #   #",
+"#   #   #   #  #",
+"################",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"      ##########",
+"      ###   # ##",
+"      ###  ##  #",
+
+"#   ## # ### # #",
+"#  # ##  #######",
+"# # ##   ### # #",
+"#  # # # #######",
+"#   ##   ### # #",
+"#  # # # #######",
+"# # ##   #######",
+"#  # # # #######",
+"#   ##  #       ",
+"#  # # #  #  #  ",
+"# # ###        #",
+"#  # ###########",
+"#   # # # # # # ",
+"#    # # # # # #",
+"# #   #   #   # ",
+"################",
+
+" # # ## #       ",
+"####### #       ",
+" # # ## #       ",
+"####### #       ",
+" # # ## #       ",
+"####### #  #   #",
+"####### #  #   #",
+"####### #  #   #",
+"     #  ########",
+"#   #           ",
+"   #  #   #   # ",
+"###             ",
+"# # # # # # # # ",
+" # # # # # # # #",
+"  #   #   #   # ",
+"################",
+
+"      ###   #  #",
+"      #######  #",
+"      ##### # ##",
+"      #    #   #",
+"      # #   #  #",
+"   #  #    #   #",
+"   #  #   # # ##",
+"   #  #    #   #",
+"####### #   #  #",
+"           #   #",
+"  #   #   # # ##",
+"           #   #",
+"# # # # # # #  #",
+" # # # # # #   #",
+"  #   #   #   ##",
+"################",
+
+"################",
+"#               ",
+"# #   #   #   # ",
+"#               ",
+"#   #   #   #   ",
+"#      #########",
+"# #   ### # # # ",
+"#    # #        ",
+"#   # ### # # # ",
+"#  # # #        ",
+"# ### ### # # # ",
+"#  # # #        ",
+"#  ## ### # # # ",
+"#  # # #        ",
+"# ### ### # # # ",
+"#  # # #        ",
+
+"################",
+"                ",
+"  #   #   #   # ",
+"        ########",
+"#   #  #########",
+"##### ###       ",
+"# # ### #       ",
+"    ## ##       ",
+"# ### # #       ",
+"  ## # ##       ",
+"### # # #      #",
+" # # # ##      #",
+"### # # #      #",
+" # # # ##      #",
+"### # # #      #",
+" # # # ##       ",
+
+"################",
+"               #",
+"  #   #   #   ##",
+"############   #",
+"#############  #",
+"          ##   #",
+"          ##  ##",
+"          ##   #",
+"          ###  #",
+"####      ##   #",
+"#  ##     ##  ##",
+"#         ##   #",
+"#         ###  #",
+"#         ##   #",
+"#  ##     ##  ##",
+"####      ##   #",
+
+"#  ## ### # # # ",
+"#  # # #        ",
+"# ### ### # # # ",
+"#  # # #        ",
+"#  ## ### # # # ",
+"#  # # #        ",
+"# ### ### # # # ",
+"#  # # #        ",
+"#  ## ### # # # ",
+"#  # # #        ",
+"# ### ### # # # ",
+"#  # # #        ",
+"#  ## ### # # # ",
+"#  # # #        ",
+"# ### ### # # # ",
+"#  # # #        ",
+
+"### # # #       ",
+" # # # ##       ",
+"### # # #       ",
+" # # # ##       ",
+"### # # #       ",
+" # # # #########",
+"### # ##  #     ",
+" # # ##         ",
+"### ##  # # #   ",
+" # ##           ",
+"####  # # #   # ",
+" ##             ",
+"##  # # # # # # ",
+" #             #",
+"##   #  #  #  # ",
+" #  #  #  #  # #",
+
+"          ###  #",
+"          ##   #",
+"          ##  ##",
+"          ##   #",
+"          ###  #",
+"############   #",
+"      #   #   ##",
+"         # #   #",
+"# # #   # # #  #",
+"       # # #   #",
+"# #   # ###   ##",
+"     #   # #   #",
+"##### # ### #  #",
+"#        # #   #",
+"# # # # ###   ##",
+"#        # #   #",
+
+"#  ## ### # # # ",
+"#  # # #        ",
+"# ### ### # # # ",
+"#  # # #        ",
+"#  ## ### # # # ",
+"#  # # #        ",
+"# ### ##########",
+"#  # ##         ",
+"#  ###  # #  # #",
+"#  ##  # #  # # ",
+"# ############# ",
+"#               ",
+"# # # # # # # # ",
+"## # # # # # # #",
+"#               ",
+"################",
+
+"############# # ",
+" # #   # #  ## #",
+"### # #   # # # ",
+" # #   # #  ## #",
+"##  # #   # # # ",
+" # #   # #  ## #",
+"### # #   # # # ",
+"#  #   # #  ## #",
+"#   # #   # # # ",
+"   #   # #  ##  ",
+"  # # #   # ####",
+"   #   # #      ",
+"# # # # # # # # ",
+" # # # # # # # #",
+"                ",
+"################",
+
+"# # # # ### #  #",
+"#        # #   #",
+"# # # # ###   ##",
+"#        # #   #",
+"# # # # ### #  #",
+"#        # #   #",
+"###########   ##",
+"        #  #   #",
+" # # # #  # #  #",
+"# # # #    #   #",
+"######    #   ##",
+"           #   #",
+"# # # # # # # ##",
+" # # # # # # # #",
+"          #    #",
+"################",
+
+"                ",
+"                ",
+"################",
+"#               ",
+"#  ###  # # #   ",
+"#   #          #",
+"# #   #   #   ##",
+"#            ###",
+"#   #   #   ### ",
+"#          ### #",
+"# #   #   ### ##",
+"#        ### ###",
+"#   #   ### ### ",
+"#      ### ### #",
+"# #   ### ### ##",
+"#     ## ### ###",
+
+"    ############",
+"   #############",
+"# ##            ",
+" ###            ",
+"#####   #   #   ",
+"## #            ",
+"# ##            ",
+" ###            ",
+"#####   #   #   ",
+"## #            ",
+"# ##            ",
+" ###            ",
+"#####   #   #  #",
+"## #           #",
+"# ##           #",
+" ###           #",
+
+"################",
+"################",
+"              ##",
+"              ##",
+"#   #   #   # ##",
+"              ##",
+"              ##",
+"              ##",
+"#   #   #   # ##",
+"              ##",
+"              ##",
+"####          ##",
+"#  ##   #   # ##",
+"#             ##",
+"#             ##",
+"#             ##",
+
+"#   #  #### ### ",
+"#      ### ### #",
+"# #   ### ### ##",
+"#  #   # ### ###",
+"# ###  #### ### ",
+"# ##   ### ### #",
+"# #   ### ### ##",
+"#      # ### ###",
+"#   #  #### ### ",
+"#      ### ### #",
+"# #   ### ### ##",
+"#      # ### ###",
+"# # #  #### ### ",
+"#      ### ### #",
+"# #   ### ### ##",
+"#      # ### ###",
+
+"#####   #   #  #",
+"## #            ",
+"# ##            ",
+" ###            ",
+"#####   #   #   ",
+"## #            ",
+"# ##            ",
+" ###            ",
+"#####   #   #   ",
+"## #            ",
+"# ##            ",
+" ###############",
+"####   #   #   #",
+"### # # # # # # ",
+"##   #   #   #  ",
+"# # # # # # #   ",
+
+"#  ##   #   # ##",
+"####          ##",
+"              ##",
+"              ##",
+"#   #   #   # ##",
+"              ##",
+"              ##",
+"              ##",
+"#   #   #   # ##",
+"              ##",
+"              ##",
+"################",
+"   #   #   #  # ",
+"  # # # # # ##  ",
+" #   #   #  #   ",
+"# # #   # ## #  ",
+
+"#   #  #### ####",
+"#      ### #### ",
+"# #   ### ####  ",
+"#      # #### # ",
+"#   #  #####   #",
+"#   #  #### # ##",
+"# #   ####   # #",
+"#      ###### ##",
+"#   #   #   ## #",
+"#  ##       # # ",
+"# ### #   # ## #",
+"# ###       ####",
+"# ###   #   #   ",
+"#               ",
+"# #   #   #   # ",
+"################",
+
+"   #   #   #   #",
+"# # # #   #   # ",
+" #   #   #   #  ",
+"# # # # #   # # ",
+"####   #   #   #",
+"   ## ### # # # ",
+" # # ### #   #  ",
+"   #############",
+"####     ####   ",
+"  # #   #     # ",
+" ## #   # #   # ",
+"#   #   #      #",
+"#   #   #   #   ",
+"   #     #      ",
+"  #       #   # ",
+"################",
+
+"   #   #  # ##  ",
+"  # # #  #   #  ",
+" #   #  # #  #  ",
+"# # # ##     #  ",
+"   #  # #   ##  ",
+"# # ##       #  ",
+" #  # #   #  #  ",
+"####         #  ",
+"#   #   #   ##  ",
+"# # # # #    #  ",
+"  #   #   ####  ",
+" # # # #  #  #  ",
+"#   #   # #  #  ",
+"          #  #  ",
+"  #   #   #  #  ",
+"##############  ",
+
+"        ########",
+"       ##       ",
+"##### # # #   # ",
+"#    # ##       ",
+"#   # # #       ",
+"#  # # ## #   # ",
+"#  ## # #      #",
+"#  # # ###### ##",
+"#  ## ##  #  # #",
+"#  # ##  #  # ##",
+"#  ###  #  # # #",
+"#  ##  #  ######",
+"#  ##### # # # #",
+"#       # ### ##",
+"#      # # # # #",
+"#     ##########",
+
+"#    ###########",
+"#   ############",
+"#### #          ",
+"# ####          ",
+" # # #          ",
+"# ####          ",
+" # # #          ",
+"######          ",
+" # # #          ",
+"# ####          ",
+" # # #         #",
+"######         #",
+" # # #         #",
+"# ####         #",
+" # # #         #",
+"######          ",
+
+"################",
+"################",
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"####          ##",
+"#  ##         ##",
+"#             ##",
+"#             ##",
+"#             ##",
+"#  ##         ##",
+"####          ##",
+
+"#    # # # # # #",
+"#   # ### ### ##",
+"#   ## # # # # #",
+"# # ############",
+"#   ## # # # # #",
+"#   # ### ######",
+"# # ## # # # # #",
+"# # ############",
+"#   ## # # # # #",
+"#   # ### ### ##",
+"#   ## # # # # #",
+"#   ############",
+"# # ## # # # # #",
+"#   ##### ### ##",
+"#   ## # # # # #",
+"#   ############",
+
+" # # #          ",
+"# ####          ",
+" # # #          ",
+"######          ",
+" # # #          ",
+"# ####          ",
+" # # #          ",
+"######          ",
+" # # ###########",
+"# ####   #   #  ",
+" # ## # # # # # ",
+"####   # # #   #",
+" ## # # # # # # ",
+"##   #   #   #  ",
+"# # # # # # # # ",
+"   # # #   # # #",
+
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"################",
+" #   #   #   ## ",
+"# # # # # # ##  ",
+" # #   # # ##   ",
+"# # # # # ## #  ",
+" #   #   ##  #  ",
+"# # # # ##   #  ",
+"   # # ##    #  ",
+
+"#   ## # # # ## ",
+"#   # ### ####  ",
+"#   ## # # ## # ",
+"# # ########   #",
+"#   ## # ## # # ",
+"#   # ####   #  ",
+"# # ## ## # # # ",
+"#   ####   # # #",
+"#   ### # # # # ",
+"#   ############",
+"# #       #  #  ",
+"#               ",
+"#               ",
+"#               ",
+"# #   #   #   # ",
+"################",
+
+"# # # # # # # # ",
+" #   #   #   #  ",
+"# # # # # # # # ",
+" # #   # # #   #",
+"# # # # # # # # ",
+" #   #   #   #  ",
+"# # # # # # # # ",
+"   # ###   # # #",
+"# # ### # # # ##",
+"############### ",
+"  #  #    #  #  ",
+"                ",
+"                ",
+"                ",
+"  #   #   #   # ",
+"################",
+
+"# # # ##     #  ",
+" #   ## #    #  ",
+"# # ##  #    #  ",
+" # ##   #    #  ",
+"# #######    #  ",
+" ## # ##     #  ",
+"#######  #  ##  ",
+"#    #  #  # #  ",
+"    #  #  #  #  ",
+"             #  ",
+"  #  #       #  ",
+"  #  #       #  ",
+"        #   ##  ",
+"             #  ",
+"  #   #   #  #  ",
+"##############  ",
+
+"################",
+"#               ",
+"#             ##",
+"#   ########### ",
+"#  ##        ## ",
+"# # # # # # ### ",
+"# # ##       ## ",
+"# # # # # # ### ",
+"# # #        ## ",
+"# # # # # # ### ",
+"# # #    #   ## ",
+"# # # # # # ### ",
+"# # #        ###",
+"# # ############",
+"# ##   ##      #",
+"# ##############",
+
+"################",
+"                ",
+"######          ",
+"     ###########",
+"     #      ##  ",
+"     ## # # #   ",
+"     #      #   ",
+"     ## # # #   ",
+"     #      #   ",
+"     ## # # #   ",
+"     #   #  #   ",
+"     ## # # # ##",
+"#####       ##  ",
+"################",
+"#      ##      #",
+"################",
+
+"################",
+"               #",
+"               #",
+"#############  #",
+"## ##       #  #",
+"# # # # # # #  #",
+"## ###      #  #",
+"# # # # # # #  #",
+"## ##       #  #",
+"# # # # # # #  #",
+"## ##    #  #  #",
+" ## # # # # #  #",
+"   ##       #  #",
+"#############  #",
+"#    ###   #   #",
+"###########    #",
+
+"#   # # #     # ",
+"# ##### ####### ",
+"# ##   #   #   #",
+"# # #   #   #   ",
+"# #  #   #   #  ",
+"# #             ",
+"# #             ",
+"# #   #   #    #",
+"# #  #   #   # #",
+"# # #   #   #  #",
+"# #            #",
+"# #            #",
+"# ##   #        ",
+"# # #   #       ",
+"# #  #   #      ",
+"# ##########    ",
+
+"#     # #     # ",
+"####### ####### ",
+"   #   #   #    ",
+"#   #   #   #   ",
+" #   #   #   #  ",
+"                ",
+"####            ",
+"#  ## #      #  ",
+"#             # ",
+"#              #",
+"#         ##    ",
+"#  ##     ## #  ",
+"####      ##  # ",
+"             ###",
+"     #        ##",
+"  ####  #    # #",
+
+"#####  ##   #  #",
+"       #       #",
+"#######        #",
+"#              #",
+"#   #   #   #  #",
+"#   ########   #",
+"#  ##      #   #",
+"#  ## #### #   #",
+"#  ## #  # ##  #",
+"#  ## #  # #   #",
+"#  ## #  # #   #",
+"### # #  # #   #",
+"   ## #### ##  #",
+"#####      #   #",
+"#  ##      #   #",
+"#  #########   #",
+
+"#   #   #   #   ",
+"#          #    ",
+"#         #     ",
+"##########      ",
+"#               ",
+"#     ###      #",
+"#     ###     # ",
+"##############  ",
+"#   #   #   #  #",
+"#    #######    ",
+"#   #     #    #",
+"#  #     #      ",
+"# #######   #   ",
+"# #    #        ",
+"#               ",
+"################",
+
+"  # ## #      # ",
+"  #  ##        #",
+"  #  #          ",
+" #   #  #    #  ",
+"#   ## #      # ",
+"     ####      #",
+"     ###        ",
+"     ## #    #  ",
+"##  ## #      # ",
+"# #  ##        #",
+" #   ###########",
+"# #             ",
+"#   #   #   #   ",
+"                ",
+"                ",
+"################",
+
+"#  ######## #  #",
+"#              #",
+"#   #####      #",
+"#  ##   #      #",
+"#  ##   #   #  #",
+"#  ##   #      #",
+"### #   #      #",
+"   ##   #      #",
+"#########   #  #",
+"#  #####       #",
+"#              #",
+"               #",
+"#   #   #   #  #",
+"               #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#               ",
+"#        #####  ",
+"#      ### #####",
+"#     # # # ####",
+"#    # # # # ###",
+"#    ## # ######",
+"#   ## # ##   ##",
+"#   # ### #   ##",
+"#  #### #   # ##",
+"#  ## #   #   ##",
+"#  ##   #   #  #",
+"#  # ##   #   ##",
+"#  # #  #   #   ",
+"#   # #   #   # ",
+
+"################",
+"                ",
+"                ",
+"                ",
+"                ",
+"################",
+"##   # #     # #",
+"### # # # # # # ",
+"###             ",
+"### # # # # # # ",
+"####     # #    ",
+"### # # # # # # ",
+"###             ",
+"### # # # # # # ",
+"##   # #     # #",
+"# # # # # # # # ",
+
+"################",
+"               #",
+"               #",
+"               #",
+"               #",
+"#############  #",
+"     #      #  #",
+"# # # # # # #  #",
+"            #  #",
+"#   ####  # #  #",
+" # ##  ##   #  #",
+"#  ##     # #  #",
+"   ##       #  #",
+"#  ##     # #  #",
+"   ##  ##   #  #",
+"#   ####  # #  #",
+
+"#   #  ##   # ##",
+"#    #   ###### ",
+"# #   ##     #  ",
+"## #    ########",
+"#               ",
+"################",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"################",
+"#     # #       ",
+"#    # #        ",
+"# # # #  #  ####",
+"#  # # ##  #    ",
+
+"################",
+"  ##    ##     #",
+" ##  ##    ## # ",
+"##############  ",
+"             #  ",
+"#########    ## ",
+"         #   ## ",
+"          #  #  ",
+"      ##########",
+"      #       ##",
+"      #       # ",
+"####  #       # ",
+"    # #       # ",
+"    # #       # ",
+"    # ######### ",
+"#   #  #   # # #",
+
+"#           #  #",
+"# # # # # # #  #",
+"##       #  #  #",
+"# # # # # # #  #",
+"#           #  #",
+"# # # # # # #  #",
+"#    #      #  #",
+"# # # # # # #  #",
+"#           #  #",
+"# # # # # # #  #",
+"##       #  #  #",
+"# # # # # # #  #",
+"#           #  #",
+"# # # # # # #  #",
+"#    #      #  #",
+"# # # # # # #  #",
+
+"#   # ##  # ## #",
+"#  # #   ##   # ",
+"#        ##  # #",
+"#        ##    #",
+"#         ##    ",
+"#      #  ######",
+"#           ### ",
+"#   #           ",
+"#             # ",
+"#        #   # #",
+"#             # ",
+"#      #     # #",
+"#   #         # ",
+"#               ",
+"#               ",
+"################",
+
+" #  #      # # #",
+" #  #   ## # # #",
+" #  #   ## # #  ",
+" #  #   ## # ## ",
+"#   #      # ## ",
+"    #      # ## ",
+"    #      # # #",
+" #  #      # # #",
+"#   #      # # #",
+"    #      # # #",
+"#   #      # ## ",
+"    #      # ###",
+"#   #      #    ",
+"    #      #    ",
+"    #      #    ",
+"################",
+
+"#           #  #",
+"# # # # # # #  #",
+"##       #  #  #",
+"# # # # # # #  #",
+"#           #  #",
+"# # # # # # #  #",
+"#    #      #  #",
+"# # # # # # #  #",
+"#############  #",
+"           #   #",
+"          #    #",
+"########## # # #",
+"            #  #",
+"           # # #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#              #",
+"#             ##",
+"#   #   #   ## #",
+"#           ## #",
+"#          #   #",
+"#         ## # #",
+"#   #   ##     #",
+"#       ## # # #",
+"#      #       #",
+"#     ## # # # #",
+"#   ##         #",
+"#   ## # # # # #",
+"#  #           #",
+"#  # # # # # # #",
+
+"################",
+"                ",
+"###########     ",
+"###########     ",
+"         ## #   ",
+"         ##     ",
+"         ##    #",
+"         ##   ##",
+"         ## ##  ",
+"         ## ## #",
+"         ###    ",
+"   ####  ### # #",
+"  ##  ## ##     ",
+"  ##     ### # #",
+"  ##     ##     ",
+"  ##     ### # #",
+
+"################",
+"               #",
+"   #############",
+"  ##############",
+"## #         ###",
+"## #         ###",
+"   #         ###",
+" # #         ###",
+"   #         ###",
+" # #         ###",
+"   #         ###",
+" # #         ###",
+"   #         ###",
+" # #         ###",
+"   #         ###",
+" # #         ###",
+
+"#  #           #",
+"#  # # # # # # #",
+"#  #           #",
+"#  # # # # # # #",
+"#  #           #",
+"#  # # # # # # #",
+"#  #           #",
+"#  # # # # # # #",
+"#  #           #",
+"#  # # # # # # #",
+"#  #           #",
+"#  # # # # # # #",
+"#  #           #",
+"#  # # # # # ## ",
+"#  #         #  ",
+"#  # # # # ##   ",
+
+"  ##  ## ##     ",
+"   ####  ### # #",
+"         ##     ",
+"         ### # #",
+"         ##     ",
+"         ### # #",
+"         ##     ",
+"         ### # #",
+"         ##     ",
+"         ### # #",
+"         ##     ",
+"         ### # #",
+"###########     ",
+"         # # # #",
+"# # #   #  #    ",
+"       #   # # #",
+
+"   #         ###",
+" # #         ###",
+"   #         ###",
+" # #         ###",
+"   #         ###",
+" # #         ###",
+"   #         ###",
+" # #         ###",
+"   #         ###",
+" # #         ###",
+"   #         ###",
+" # #         ###",
+"   #############",
+" ##          # #",
+" #  # # #   #  #",
+"#          #   #",
+
+"#  #       #  # ",
+"#  # # # ##     ",
+"#  #     #  # # ",
+"#  # # ##       ",
+"#  #   #########",
+"#  # # #        ",
+"#  #   #        ",
+"#  # # #        ",
+"#  #   #########",
+"#  # ##         ",
+"#  # #         #",
+"#  ##         # ",
+"#  ###########  ",
+"#               ",
+"#               ",
+"################",
+
+"# #   #    #   #",
+"     #     # ## ",
+"#   #      # #  ",
+"   #       ##   ",
+"################",
+"    ## ## #     ",
+"   ## ##   #    ",
+"  ## ##     #   ",
+"## ###       ###",
+"#     #     #   ",
+"       #   #    ",
+"        # #     ",
+"#   #   ########",
+"                ",
+"                ",
+"################",
+
+"  # # #   # #  #",
+"         #     #",
+"# # #   #      #",
+"       #       #",
+"####### #   #  #",
+"      #        #",
+"      #        #",
+"      #        #",
+"####### #   #  #",
+"     #         #",
+"    #          #",
+"   #           #",
+"### #   #   #  #",
+"               #",
+"               #",
+"################",
+
+"                ",
+"                ",
+"################",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#      #########",
+"#     ### # # # ",
+"#    # #        ",
+"#   #  ## # # # ",
+"#  #   #        ",
+"#  #   ## # # ##",
+"#  # # #      ##",
+"#  #   ## # ####",
+"#  #   #     ###",
+
+"           #####",
+"          ######",
+"######## ###    ",
+"        ####    ",
+"       #####    ",
+"      #### #    ",
+"     #### ##    ",
+"### #### ###    ",
+"# ##### ####    ",
+"  #### ### #    ",
+"##### ### ##    ",
+"#### ### ###    ",
+"### ### ####    ",
+"## ### ### #    ",
+"# ### ### ##    ",
+" ### ### ###    ",
+
+"############### ",
+"############### ",
+"             ## ",
+"             ## ",
+"             ## ",
+"             ## ",
+"             ## ",
+"  ####       ## ",
+" ##  ##      ## ",
+" ##          ## ",
+" ##          ## ",
+" ##          ## ",
+" ##  ##      ## ",
+"  ####       ## ",
+"             ## ",
+"             ## ",
+
+"#  # # ## # ### ",
+"#  #   #     # #",
+"#  #   ## # ####",
+"#  ### #     ###",
+"#  ##  ## # ### ",
+"#  #   #     # #",
+"#  #   ## # ####",
+"#  # # #     ###",
+"#  #   ## # ### ",
+"#  #   #     # #",
+"#  #   ## # ####",
+"#  # # #     ###",
+"#  #   ## # ### ",
+"#  # # #     # #",
+"#  #   ## # ####",
+"#  #   #     ###",
+
+"### ### ####    ",
+"## ### ### #    ",
+"# ### ### ######",
+" ### ### #######",
+"### ### ####  ##",
+"## ### ####  ## ",
+"# ### ####   #  ",
+" ### ####  ##  #",
+"### ####  ##  ##",
+"## ####   #   # ",
+"# ####  ##  ##  ",
+" ####  ##  ##  #",
+"####   #   #   #",
+"###  ##  ##  ## ",
+"##  ##  ##  ##  ",
+"#   #   #   #   ",
+
+"             ## ",
+"             ## ",
+"############### ",
+"##############  ",
+"  ##  ##  ### # ",
+" ##  ##  ###  # ",
+" #   #   ## # # ",
+"#  ##  ###  # # ",
+"  ##  ### # # # ",
+"  #   ##    # # ",
+"##  ### # # # # ",
+"#  ###      # # ",
+"   ## # # # # # ",
+" ###        # # ",
+"### # # # # # # ",
+"##          # # ",
+
+"#  #   ## # ####",
+"#  # # #        ",
+"#  #   ## # # # ",
+"#  #   #        ",
+"#  #   ## # # # ",
+"#  # # #        ",
+"#  ##  ## # # # ",
+"#  #   #########",
+"#  #  #         ",
+"#  # #  ##    ##",
+"#  ##           ",
+"#  #############",
+"#               ",
+"#               ",
+"#               ",
+"################",
+
+"################",
+"                ",
+"# # # # # # # # ",
+"                ",
+"# # # # # # # # ",
+"                ",
+"# # # # # # # # ",
+"################",
+"                ",
+"      #     ##  ",
+"  ##            ",
+"################",
+"                ",
+"                ",
+"                ",
+"################",
+
+"# # # # # # # # ",
+"            # # ",
+"# # # # # # # # ",
+"            # # ",
+"# # # # # # # # ",
+"            # # ",
+"# # # # # # # # ",
+"############# # ",
+"           #  # ",
+"##    #   #   # ",
+"         #    # ",
+"#########     # ",
+"              # ",
+"              # ",
+"              # ",
+"############### ",
+
+"                ",
+"                ",
+"                ",
+"################",
+"#       #   #   ",
+"#  ######   ####",
+"#  #            ",
+"#  # #   # #    ",
+"#  # #   # #   #",
+"###           # ",
+"#            ## ",
+"#    # # #  #  #",
+"#    # # # ## # ",
+"####      #  #  ",
+"#  #     ## # # ",
+"#  #    #  #   #",
+
+"       #########",
+"      ##########",
+"     ###        ",
+"#####  #        ",
+"   ## ##        ",
+"# #  # #  #     ",
+" ## # ##        ",
+"#  #   #        ",
+"# # # ##        ",
+" #     #        ",
+"# # # ##        ",
+"   #   #        ",
+"# # # ##        ",
+"     # #        ",
+"# # # ##        ",
+"   #   #        ",
+
+"################",
+"################",
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+"              ##",
+" ####         ##",
+"##  ##        ##",
+"##            ##",
+"##            ##",
+"##            ##",
+
+"#  #   ## # # # ",
+"#  ## #  #      ",
+"#    ## # # # # ",
+"#    # #   #   #",
+"#    #### # # # ",
+"#    ##      #  ",
+"#    ## # # # # ",
+"#    # #   #   #",
+"#    ## # # # # ",
+"#    #   #      ",
+"#    ## # # # # ",
+"#    # #   #   #",
+"#    ## # # # # ",
+"#    #       #  ",
+"#    ## # # # # ",
+"#    # #   #   #",
+
+"# # # ##        ",
+" #     #        ",
+"# # # ##        ",
+"   #   #        ",
+"# # # ##        ",
+"     # #        ",
+"# # # ##        ",
+"   #   #  #     ",
+"# # # ##       #",
+" #     #########",
+"# # # #   #   # ",
+"   # #          ",
+"# # #   #   #   ",
+"   #            ",
+"# #   #   #   # ",
+" #              ",
+
+"##  ##        ##",
+" ####         ##",
+"              ##",
+"              ##",
+"              ##",
+"  ##          ##",
+" # ##         ##",
+"#        #    ##",
+"              ##",
+"################",
+"  #   #   #   # ",
+"             #  ",
+"#   #   #   #   ",
+"           ##   ",
+"  #   #   # #   ",
+"         #  #   ",
+
+"#    ## # # # # ",
+"#    #   #     #",
+"#    ## # # # # ",
+"#    # #   # #  ",
+"#    #### # #   ",
+"#    ##    #    ",
+"#    ## # #   # ",
+"#    # # #      ",
+"#    ## #   #   ",
+"#    # #        ",
+"# #  ##   # # # ",
+"#    ###########",
+"#       #   #   ",
+"#  #            ",
+"#               ",
+"################",
+
+"#   #   #   #   ",
+"                ",
+"  #   #   #   # ",
+"                ",
+"#   #   #   #   ",
+"                ",
+"  #   #   #   # ",
+"                ",
+"#       #   #   ",
+"   ##          #",
+"  ##  #   #   # ",
+"################",
+"                ",
+"                ",
+"                ",
+"################",
+
+"#   #   #   #   ",
+"       # #  #   ",
+"  #   #  #  #   ",
+"     #   #  #   ",
+"#   #  # #  #   ",
+"   #     #  #   ",
+"  #  # # #  #   ",
+" #       #  #   ",
+"##########  #   ",
+"        #   #   ",
+" # # # #    #   ",
+"#######    ##   ",
+"            #   ",
+"        # # #   ",
+"            #   ",
+"#############   ",
+
+"################",
+"#               ",
+"# #             ",
+"#               ",
+"#               ",
+"#               ",
+"#              #",
+"#               ",
+"#  #############",
+"# ### # # # # ##",
+"# ##     #     #",
+"# ### # # # # ##",
+"# ##           #",
+"# ### # # # # ##",
+"# ## #       # #",
+"# ##############",
+
+"################",
+"                ",
+"     ###########",
+"    ### # # # # ",
+"    ##          ",
+"    ### # # # # ",
+"    ##       #  ",
+"    ### # # # # ",
+"    ############",
+"    ###   ##   #",
+"    ############",
+"#####           ",
+"                ",
+"                ",
+"     ## ## ## ##",
+"     ##         ",
+
+"################",
+"               #",
+"############   #",
+"# # # # # ## # #",
+"           #   #",
+"# # # # # ##   #",
+"     #     #   #",
+"# # # # # #### #",
+"############ # #",
+"#   ##   ##  # #",
+"##########   # #",
+"             # #",
+"             # #",
+"             # #",
+" ## ## ## ## # #",
+" ## ## ## ## # #",
+
+"# ############  ",
+"# #             ",
+"# #             ",
+"############## #",
+"# ####  ##   # #",
+"# # # ##### #   ",
+"# ###  ##   ## #",
+"# ##########    ",
+"# #   # #       ",
+"# #  # #        ",
+"# # # #         ",
+"# ######        ",
+"#       #      #",
+"#########      #",
+"#               ",
+"#               ",
+
+"     ##   ####  ",
+"         ##  ## ",
+"     ##  ##     ",
+"#        ##     ",
+"#        ##     ",
+"     ##  ##  ## ",
+"#    ##   ####  ",
+"                ",
+"     ## ## ## ##",
+"                ",
+"                ",
+"################",
+"                ",
+"################",
+"                ",
+"                ",
+
+" ## ## ## ## # #",
+"             # #",
+" ## ## ## ## # #",
+"             # #",
+"             # #",
+" ## ## ## ## # #",
+" ## ## ## ## # #",
+"             # #",
+" ## ## ## ## # #",
+"             # #",
+"             # #",
+"############## #",
+"               #",
+"#############  #",
+"             # #",
+"              ##",
+
+"#               ",
+"#               ",
+"################",
+"#               ",
+"#               ",
+"#               ",
+"# #             ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#   #           ",
+"#               ",
+"#               ",
+"#               ",
+"################",
+
+"                ",
+"                ",
+"################",
+"                ",
+"         #######",
+"        ### # # ",
+"        ## # # #",
+"        ### # # ",
+"        ## # # #",
+"        ########",
+"        ########",
+"                ",
+"                ",
+"                ",
+"                ",
+"################",
+
+"               #",
+"               #",
+"#############  #",
+"             # #",
+"######        ##",
+"# # ##         #",
+" # # #         #",
+"# # ##         #",
+" # # #         #",
+"######         #",
+"####           #",
+"     #         #",
+"               #",
+"               #",
+"           #   #",
+"################",
+
+"            ####",
+"########## ## # ",
+"#         # #   ",
+"#        #  # # ",
+"#       #   #   ",
+"#      #  # # # ",
+"#      # ## #   ",
+"#      # #  # # ",
+"#      #  # #   ",
+"#     ## ## #   ",
+"#      # #  #  #",
+"#      #  # # ##",
+"# #    # ## # ##",
+"#      # #  # ##",
+"#      #  # # ##",
+"#      # ## # ##",
+
+"################",
+"# # # # # # #  #",
+"             ###",
+"# # # # #  ##  #",
+"         ##    #",
+"# # #  ##      #",
+"      #        #",
+"# # ##         #",
+"     #         #",
+"     #         #",
+"###  #         #",
+"  ## #         #",
+"     #         #",
+"     #         #",
+"     #         #",
+"  ## #         #",
+
+"#############   ",
+"  # # # # # ####",
+"#           #  #",
+" #  # # # # #  #",
+" ##         #  #",
+"# ### # # # #  #",
+" # #        #  #",
+"# ### # # # #  #",
+" # #        #  #",
+"# ### # # # #  #",
+" # #        #  #",
+"# ### # # # #  #",
+" # #        #  #",
+"# ### # # # #  #",
+" # #        #  #",
+"# ### # # # #  #",
+
+"#    # # #  #  #",
+"#      #  # #   ",
+"#      # ## #   ",
+"#      # #  # # ",
+"#  #   #  # #   ",
+"#      # ## # # ",
+"#      # #  ####",
+"#      #   # ## ",
+"#      #  # ##  ",
+"#      # # ## # ",
+"#      ## ##    ",
+"#      #########",
+"#               ",
+"#  #    ##      ",
+"#       # #     ",
+"#    # # # #    ",
+
+"###  #         #",
+"     #         #",
+"     #       ###",
+"# # ##     ## # ",
+"     #  ###  # #",
+"# # #####     # ",
+"################",
+"    # ## #  #   ",
+"   # ## ####    ",
+"  # #######    #",
+" # #########  # ",
+"################",
+"# ##############",
+"# #            #",
+"# ############# ",
+"##            # ",
+
+"## #        #  #",
+"# ### # # # #  #",
+"## #        #  #",
+"##### # # # #  #",
+" ###        #  #",
+"  ##  # # # #  #",
+"############## #",
+" # ##   # ##   #",
+"# ##   # ##    #",
+" ##   # ##     #",
+"##   # ##      #",
+"########       #",
+"#              #",
+"  ##           #",
+"  # # #    #   #",
+" # # #         #",
+
+"# # #   # # #   ",
+"## # #   # #    ",
+"# # # #  ##     ",
+"#  # # #       #",
+"#  ## ##      # ",
+"#            #  ",
+"#           #   ",
+"#  #   #    #   ",
+"#   # # # # #   ",
+"#  # # # #  # # ",
+"#   # # # # # # ",
+"#  # # ##   # # ",
+"#  ## #     #   ",
+"#           #   ",
+"#           #   ",
+"################",
+
+"##############  ",
+"#            #  ",
+"############### ",
+"       ###     #",
+"      #   #     ",
+"     #     #    ",
+"     #     #    ",
+"     #     #    ",
+"     ##   #     ",
+"      ####      ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"################",
+
+" ## # #        #",
+" # # ##        #",
+"   ###         #",
+"     # # #     #",
+"#     # #      #",
+" #   # # #     #",
+"  #  # #    #  #",
+"  #            #",
+"  #   # ##     #",
+"# #    # #     #",
+"# #   # # #    #",
+"# #    # ##    #",
+"  #          # #",
+"  #            #",
+"  #            #",
+"################",
+
+"################",
+"#               ",
+"#           ####",
+"#   # #    ## # ",
+"#  # #    ##    ",
+"# # # #  ###    ",
+"#  # #  # ##    ",
+"# # #  ## ##    ",
+"#     # # ##    ",
+"#    ## # ##    ",
+"#   # # # ##    ",
+"#  ## # # ##    ",
+"#  ## # # ##    ",
+"#  ## # # ##    ",
+"#  ## # ####    ",
+"#  ## # # ##    ",
+
+"################",
+"                ",
+"############    ",
+"# # # # # ##    ",
+"           #####",
+"          ### # ",
+"           #    ",
+"          ##    ",
+"           #    ",
+"          ##    ",
+"           #    ",
+"      # # ######",
+"       ##### # #",
+"      ##### #   ",
+"       ### # # #",
+"      ### # # # ",
+
+"################",
+"               #",
+"               #",
+"               #",
+"#############  #",
+"# # # # # # #  #",
+"           ##  #",
+"            #  #",
+"           ##  #",
+"            #  #",
+"           ##  #",
+"#############  #",
+" # # # # # #   #",
+"# #   # # #    #",
+" # # # # #     #",
+"# # # # #      #",
+
+"#  ## ### ##    ",
+"#  ## # # ##    ",
+"#  #### # ##   #",
+"#  ## # # ##   #",
+"#  ## # # ##   #",
+"#  ## # # ##   #",
+"#  ## # # ##   #",
+"#  ## # # ##    ",
+"#  ## # # ##    ",
+"#  ## # # ##    ",
+"#  ## # ####    ",
+"#  ## # # ##    ",
+"#  ## ### ##    ",
+"#  ## # # ##    ",
+"#  #### # ##    ",
+"#  ## # # ##    ",
+
+"       #########",
+"####  ##### # # ",
+"#  ##  ##       ",
+"#     ###   #   ",
+"#      ##       ",
+"#     ### #   # ",
+"#  ##  ##       ",
+"####  ###   #   ",
+"       ##       ",
+"      ### #   # ",
+"       ##       ",
+"      ###   #   ",
+"       ##       ",
+"      ##########",
+"       ### # # #",
+"      ### # # # ",
+
+"###########    #",
+"# # # # # #    #",
+"         ##    #",
+"#   #   # #    #",
+"         ##    #",
+"  #   #   #    #",
+"         ##    #",
+"#   #   # #    #",
+"         #######",
+"  #   #   #    #",
+"         ##    #",
+"#   #   # ######",
+"         ##    #",
+"###########    #",
+" # # # # #     #",
+"# # # # #      #",
+
+"#  ## # # ##    ",
+"#  ## # # ##    ",
+"#  ## # # ##    ",
+"#  ## # # ##    ",
+"#  ## # # ######",
+"#  ## # ##      ",
+"#  ## # ########",
+"#  ## ##        ",
+"#  ## ##########",
+"#  ###          ",
+"#  #############",
+"#  ##           ",
+"#  #############",
+"#               ",
+"#               ",
+"################",
+
+"       #########",
+"      ##########",
+"       # # # # #",
+"      ##        ",
+"########        ",
+"      #         ",
+"######          ",
+"    #           ",
+"################",
+"  #             ",
+"################",
+"#           ####",
+"################",
+"           #   #",
+"           #   #",
+"################",
+
+"########    #  #",
+"########   # # #",
+" # # # #  # #  #",
+"      ##   # # #",
+"       #    #  #",
+"      ##       #",
+"       #       #",
+"      ##  #    #",
+"#######        #",
+"     #         #",
+"#####     # #  #",
+"  ##     # #   #",
+"###       # #  #",
+"         # #   #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#               ",
+"#      #        ",
+"#               ",
+"#    ###########",
+"#   ## # # # # #",
+"#  #### # # # # ",
+"#  # # # # # # #",
+"#  #### # # # ##",
+"#  # ########## ",
+"#  ##     ### # ",
+"#  ######## # # ",
+"#       # # # # ",
+"#       # # # # ",
+"#       # # # # ",
+
+"################",
+"                ",
+"            ####",
+"#         ###   ",
+"        ### # # ",
+"######### # #   ",
+" # #### # # # # ",
+"# ### # # # #   ",
+"### # # # # # # ",
+"# # # # # # #   ",
+"# # # # # # # # ",
+"# # # # # # #   ",
+"# # # # # # # # ",
+"# # # # # # #   ",
+"# # # # # # # # ",
+"# # # # # # #   ",
+
+"################",
+"               #",
+"############   #",
+"           #   #",
+"# # # # # ##   #",
+"           #   #",
+"# # # # # ##   #",
+"           #   #",
+"        # ##   #",
+"  ####     #   #",
+" ##  ## # ##   #",
+" ##        #   #",
+" ##     # ##   #",
+" ##        #   #",
+" ##  ## # ##   #",
+"  ####     #   #",
+
+"#       # # # # ",
+"#   #   # # # # ",
+"#       # # # # ",
+"#       # # # # ",
+"#       # # # # ",
+"#       # # # # ",
+"#       # # # # ",
+"#       # # # # ",
+"#       # # # # ",
+"#       # # # # ",
+"#       # # # # ",
+"#   #   # # # # ",
+"#       # # # # ",
+"#       ########",
+"#      ##       ",
+"#     ### # # # ",
+
+"# # # # # # # # ",
+"# # # # # # #   ",
+"# # # # # # # # ",
+"# # # # # # #   ",
+"# # # # # # # # ",
+"# # # # # # #   ",
+"# # # # # # # # ",
+"# # # # # # ####",
+"# # # # # ######",
+"# # # # # ##    ",
+"# # # # # ######",
+"# # # # # #     ",
+"# # # # ########",
+"##### # ##      ",
+"    # # ########",
+"# # # # #       ",
+
+"        # ##   #",
+"           #   #",
+"# # # # # ##   #",
+"           #   #",
+"# # # # # ##   #",
+"           #   #",
+"# # # # # ##   #",
+"############   #",
+"###########    #",
+"         ##    #",
+"###########    #",
+"         #     #",
+"##########     #",
+"         #     #",
+"#########   #  #",
+"        #   #  #",
+
+"#    ####       ",
+"#   ## ## # # # ",
+"#   #####       ",
+"#   ## ## # # # ",
+"#   #####       ",
+"#   ## ## # # # ",
+"#   #####       ",
+"#   ## ## # # # ",
+"#   ############",
+"#   ## #        ",
+"#   ###   #     ",
+"#   ##          ",
+"#   ############",
+"#               ",
+"#               ",
+"################",
+
+"    # ##########",
+"# # # ##        ",
+"    # ##########",
+"# # # #         ",
+"    ############",
+"# # ##          ",
+"    ############",
+"# # #           ",
+"################",
+"                ",
+"  #       #     ",
+"                ",
+"################",
+"                ",
+"                ",
+"################",
+
+"#########      #",
+"       #       #",
+"########       #",
+"       #       #",
+"#######        #",
+"      #   #    #",
+"#######        #",
+"     #         #",
+"######  #      #",
+"    #          #",
+"  ##           #",
+"  #            #",
+"##          #  #",
+"         #     #",
+"               #",
+"################",
+
+"                ",
+"                ",
+"      ##########",
+"#### ##         ",
+"#   ### # # # # ",
+"#  ## #         ",
+"# ## ## # ##### ",
+"# #####   # # # ",
+"# ## ## # ##### ",
+"# #####         ",
+"# ## ## ### # # ",
+"# #####   #     ",
+"# ## ## # # # # ",
+"# ### #        #",
+"# ## ## # # # ##",
+"# #####      ###",
+
+"              ##",
+"            ##  ",
+"############    ",
+"         #      ",
+"# # # # #   #   ",
+"       #        ",
+"# # # ##      # ",
+"     ##         ",
+"# # ### #   #   ",
+"   ###          ",
+"# ####    #     ",
+" #####          ",
+"######  #   #   ",
+"######          ",
+"#######         ",
+"######          ",
+
+"######          ",
+"     ###        ",
+"  #    ###      ",
+"         ##     ",
+"#   #   #  #    ",
+"            #   ",
+"      #      #  ",
+"             #  ",
+"        #   # # ",
+" ####         # ",
+"##  ##    #    #",
+"##             #",
+"##      #   #  #",
+"##             #",
+"##  ##        ##",
+" ####          #",
+
+"# ## ## # # ####",
+"# #####    #####",
+"# ## ## # ######",
+"# #####  #######",
+"# ## ## ########",
+"# ### ##########",
+"# ## ###########",
+"# ############# ",
+"# ############ #",
+"# ########### ##",
+"# ########## ## ",
+"# ######### ## #",
+"# ######## ## ##",
+"# ####### ## ## ",
+"# ###### ## ####",
+"# ######## ## # ",
+
+"######  #   #   ",
+"##### #         ",
+"#### ###  #     ",
+"### ## #        ",
+"## ## ###   #   ",
+"# ## ## ##      ",
+"### ## # #    # ",
+"## ## # # #     ",
+"# ## ### # ##   ",
+" ## # # # ## ## ",
+"## # # # ## ## #",
+"# # # # ## ## ##",
+" # # # ## ## ###",
+"# # # ## ## ####",
+" # #### ## #####",
+"# # ## ## ######",
+
+"        #   #  #",
+"               #",
+"  #       #   # ",
+"              # ",
+"#   #   #   ##  ",
+"             #  ",
+"      #    ##   ",
+"           # #  ",
+"#   #   #### #  ",
+"        #### #  ",
+"######### ## #  ",
+"########   # #  ",
+"####### # ## #  ",
+"######     # #  ",
+"##### # # ## #  ",
+"####       # #  ",
+
+"# #### ## ## # #",
+"# ### ## ## # # ",
+"# ## ## ## # # #",
+"# # ## ## ### # ",
+"#  ## ## # # # #",
+"#  # ## # # # ##",
+"#  ### # # # ## ",
+"#   # ### # ## #",
+"# #  ### # ## ##",
+"#     # #### ## ",
+"# ##   #### ## #",
+"## ##   ## ## ##",
+"### #    ### ###",
+"# ##  #     ####",
+"#               ",
+"################",
+
+" # ## ## #######",
+"# ## ## ########",
+" ## ############",
+"## ## ##########",
+"# ## ########## ",
+" ## ########### ",
+"## ########## # ",
+"# ##########  ##",
+" ##########  ## ",
+"########### ## #",
+"######### ### # ",
+"########  ######",
+"######          ",
+"####      #     ",
+"                ",
+"################",
+
+"### # ### ## #  ",
+"##         # #  ",
+"# # # ### ## #  ",
+"           # #  ",
+"# # # # # ## #  ",
+"           # #  ",
+"# # # # # ## #  ",
+"############ #  ",
+"# # # # # #  #  ",
+" # # # # #   #  ",
+"# # # # #    #  ",
+"########   # #  ",
+"          #  #  ",
+"#            #  ",
+"             #  ",
+"##############  ",
+
+"################",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+
+"################",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"################",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+
+"                ",
+"      ####      ",
+"       ##       ",
+"       ##       ",
+"       ##       ",
+"       ##       ",
+"       ##       ",
+"       ##       ",
+"       ##       ",
+"       ##       ",
+"       ##       ",
+"      ####      ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"################",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"################",
+
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#          ###  ",
+"#           #   ",
+"#    ###   ###  ",
+"#   #####       ",
+"#     #         ",
+"#    ##         ",
+"#   # #         ",
+"#  # #      #   ",
+"#   #      #    ",
+"#  #            ",
+"#               ",
+"#               ",
+"#               ",
+"#          #   #",
+
+"################",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"   ####         ",
+"  #    #        ",
+" ##    #        ",
+" ##    #       #",
+" ##    #      # ",
+" ######       # ",
+"  ####      #   ",
+"          #   # ",
+"            #   ",
+"              # ",
+
+"################",
+"               #",
+"               #",
+"               #",
+"               #",
+"       #       #",
+"      #        #",
+" #    #  # #   #",
+"    #   #      #",
+"  #   #   #    #",
+"#   #   #      #",
+"  #   #   #    #",
+"#   #   #   #  #",
+"  #   #   #    #",
+"#   #   #   #  #",
+"  #   #   #    #",
+
+"#               ",
+"#               ",
+"#               ",
+"#             # ",
+"#   #   #   #   ",
+"# #   #   #   # ",
+"#   #   #   #   ",
+"# #   #   #   # ",
+"#   #   #   #   ",
+"#         #     ",
+"#               ",
+"#               ",
+"#               ",
+"#            ###",
+"#          ###  ",
+"#         ##    ",
+
+"      ####  #   ",
+"       ##       ",
+"       ##       ",
+"  #    ##       ",
+"#      ##       ",
+"  #    ##       ",
+"#      ##       ",
+"  #   ####      ",
+"#               ",
+"                ",
+"              ##",
+"             ## ",
+"             ## ",
+"############### ",
+"    #        ###",
+"   ##       ##  ",
+
+"#   #   #   ####",
+"  #   ##       #",
+"               #",
+"   ######      #",
+"   ######      #",
+"    #  #       #",
+"    #  #     # #",
+"    #  #       #",
+"############   #",
+"## ##          #",
+"############   #",
+" #  #      #   #",
+" #  #      #   #",
+" #  #      #   #",
+"############   #",
+" #  #     #    #",
+
+"#        # #    ",
+"#         ##    ",
+"#          #    ",
+"#          ###  ",
+"#         #   # ",
+"#        #     #",
+"#       ##     #",
+"#      # #     #",
+"#      #  #   # ",
+"#      # # ###  ",
+"#       #   #   ",
+"#        ###    ",
+"#               ",
+"#               ",
+"#               ",
+"################",
+
+"  # #      # ###",
+"   ##       ##  ",
+"    #        #  ",
+"    ###      ###",
+"   #   #    #   ",
+"  #     #  #    ",
+" ##     # ##    ",
+"# #     ## #    ",
+"#  #   # #  #   ",
+"# # ###  # # ###",
+" #   #    #   # ",
+"  ###      ###  ",
+"                ",
+"                ",
+"                ",
+"################",
+
+"##########     #",
+"               #",
+"               #",
+"               #",
+"#              #",
+" #      # #    #",
+" #             #",
+" #      # #    #",
+"#              #",
+"        # #    #",
+"               #",
+"         #     #",
+"               #",
+"               #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#               ",
+"#               ",
+"#    ###########",
+"#   ############",
+"#  ###          ",
+"# ## #   #      ",
+"# # ##          ",
+"# ## #   #      ",
+"# # ##          ",
+"# ## #   #      ",
+"# # ##        ##",
+"# ## #         #",
+"# # ##         #",
+"# ## #         #",
+
+"################",
+"                ",
+"                ",
+"                ",
+"########        ",
+"########        ",
+"      ##  #     ",
+"      ##       #",
+"      ##  #    #",
+"      ##       #",
+"      ##        ",
+"      ##        ",
+"##    ##      ##",
+"#     ##   ###  ",
+"#     ##  ##    ",
+"#     ## ###    ",
+
+"################",
+"               #",
+"               #",
+"      #####    #",
+"     ##   #    #",
+"##### #   #    #",
+"#  # ##   #    #",
+"#  ## #####    #",
+"#### # # #     #",
+"  #     #      #",
+"    ###        #",
+" ### # ##      #",
+"#    #   ##    #",
+"     #     ### #",
+"     #       # #",
+"     #       # #",
+
+"# # ##         #",
+"# ## #         #",
+"# # ##         #",
+"# ## #        ##",
+"# # ##          ",
+"# ## #          ",
+"# # ##          ",
+"# ## ###########",
+"# # #           ",
+"# ##  ##  ##  ##",
+"# ##############",
+"#   #     # #   ",
+"#   #     # #   ",
+"#   #     # #   ",
+"#   #     # #   ",
+"#   #     # #   ",
+
+"#     ## ###    ",
+"#     ## # #    ",
+"#     ## ###    ",
+"##    ## # #    ",
+"      ## ###  # ",
+"      ## # #    ",
+"      ## ###    ",
+"######## # #    ",
+"      #  ###    ",
+"  ## #   # #    ",
+"#####    ###    ",
+" # # #   # #  # ",
+" # # #   ###    ",
+" # # #   # #    ",
+" # # #   ###    ",
+" ##  #   # #    ",
+
+"     #       # #",
+"     #       # #",
+"     #       # #",
+" #   #  #    # #",
+"     #     # # #",
+"     #       # #",
+"     #       # #",
+"     #       # #",
+"     #       # #",
+"     #       # #",
+" #   #  #    # #",
+"     #     # # #",
+"     #       # #",
+"     #       # #",
+"     #       # #",
+"     #       # #",
+
+"#   #     ##    ",
+"#   #     ##    ",
+"#   #           ",
+" ###            ",
+"#               ",
+"                ",
+"#               ",
+" ###############",
+"#               ",
+"#               ",
+"#    #######    ",
+"#   # # # #     ",
+"#  #######      ",
+"# #     #       ",
+"#               ",
+"################",
+
+" ##  #   ###    ",
+"     #   # #    ",
+"     #   ###  # ",
+"     #   # #    ",
+"    #    ###    ",
+"   #     # #    ",
+"  #      ###    ",
+"##       # #    ",
+"         ###    ",
+" ####    # #    ",
+" # ##    ###  ##",
+" ####    # ###  ",
+"         ##     ",
+"         #######",
+"                ",
+"################",
+
+"     #       # #",
+" #   #  #    # #",
+"     #     # # #",
+"     #       # #",
+"     #       # #",
+"     #       # #",
+"     #       # #",
+"     #       # #",
+"    ###      # #",
+" ###   ##    # #",
+"#        ##  # #",
+" ########  ### #",
+"##  ####    #  #",
+"#     ######   #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#      #########",
+"#     ##        ",
+"#    ###        ",
+"#   ## #        ",
+"#   # ##        ",
+"#   ## #   ###  ",
+"#   # ##        ",
+"#   ## #   ###  ",
+"#   # ##        ",
+"#   ## #        ",
+"#   # ##        ",
+"#   ## #        ",
+"#   # ##        ",
+"#   ## #        ",
+
+"################",
+"                ",
+"##              ",
+"  #    #########",
+"  #   ##        ",
+"  #### #        ",
+"      ##  ##### ",
+"  #    #        ",
+"      ##  ##### ",
+"       #        ",
+"  #   ##  ##### ",
+"       #        ",
+"      ##        ",
+"  #    #        ",
+"      ##        ",
+"       #        ",
+
+"################",
+"               #",
+"               #",
+"############## #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"   #         # #",
+"  ###        # #",
+
+"# # # ##        ",
+"#   ## #        ",
+"# # # ##########",
+"#   ###         ",
+"# # ##  ##  ##  ",
+"#   ############",
+"#     # ##  ##  ",
+"#     # ##  ##  ",
+"#  #### ##  ##  ",
+"#  #    ##      ",
+"#  #    ##      ",
+"#  #            ",
+"#  #            ",
+"#  #            ",
+"#  #  #   #     ",
+"#  #            ",
+
+"  #   ##        ",
+"       #        ",
+"####  ##       #",
+"    # ##      ##",
+"     ###     ###",
+"### ## #    ### ",
+"#  ## ##    ##  ",
+"#   ## #        ",
+"#   # ##        ",
+"########        ",
+"    ####        ",
+"    ## #        ",
+"    # ##       #",
+"    ####      ##",
+"    ####     ###",
+"    ## #    ### ",
+
+" ###         # #",
+"###          # #",
+"##           # #",
+"#            # #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"   #         # #",
+"  ###        # #",
+" ###         # #",
+"###          # #",
+"##           # #",
+"#            # #",
+"             # #",
+"             # #",
+
+"#  #            ",
+"#  #            ",
+"#  #  #   #     ",
+"####            ",
+"#               ",
+"#               ",
+"#     #   #     ",
+"####            ",
+"#  #            ",
+"#  #            ",
+"#  #            ",
+"#  #            ",
+"#  #######      ",
+"#        #      ",
+"#        #      ",
+"################",
+
+"    # ##    ##  ",
+"    ## #        ",
+"##### ##        ",
+"#   ## #        ",
+"#   # ##########",
+"#   ###         ",
+"#   ##    ##    ",
+"#   ############",
+"#               ",
+"#        # #####",
+"# # # # # #     ",
+"#        #     #",
+"#       ####### ",
+"#       #    #  ",
+"#               ",
+"################",
+
+"             # #",
+"        # #  # #",
+"             # #",
+"             # #",
+"############## #",
+"            #  #",
+"##         #   #",
+"###########    #",
+"            #  #",
+"##             #",
+"#           #  #",
+" # # # # # #   #",
+"               #",
+"               #",
+"               #",
+"################",
+
+"     ###########",
+"######          ",
+"#  ###          ",
+"# ## # ###      ",
+"### ## # #      ",
+"## # # # #      ",
+"### ##          ",
+"## # #          ",
+"# ####          ",
+"## # #          ",
+"### ##          ",
+"## # #          ",
+"# # ##          ",
+"## # #          ",
+"# # ##          ",
+"## # #         #",
+
+"################",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"  #       #     ",
+" ###     ###    ",
+"###     ###     ",
+"##     ###     #",
+
+"##############  ",
+"             ###",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"  #          # #",
+" ###         # #",
+"###          # #",
+"##           # #",
+
+"# # ##        ##",
+"## # #       ###",
+"# ####      ### ",
+"## # #     ###  ",
+"### ##  # ###   ",
+"## # #   ###    ",
+"# # ##  ###     ",
+"## # #  ##      ",
+"# ####          ",
+"## # #  #       ",
+"### ##          ",
+"## # ###########",
+"# # # # # # # # ",
+"## # ###########",
+"# # ##          ",
+"## # #    #     ",
+
+"#     ###     ##",
+"     ###     ###",
+"    ###     ### ",
+"   ###     ###  ",
+"# ###   # ###   ",
+" ###     ###    ",
+"###     ###     ",
+"##      ##      ",
+"                ",
+"#       #       ",
+"                ",
+"################",
+"# # # # # # # # ",
+"################",
+"                ",
+" #     #        ",
+
+"#            # #",
+"             # #",
+"             # #",
+"  ############ #",
+"  #         #  #",
+"  #        #   #",
+"  # #  #  #   ##",
+"  ### #  #  #  #",
+"  ##########  ##",
+"  #         #  #",
+"  #          ###",
+"###            #",
+"##             #",
+"#########      #",
+"        #      #",
+" #####  #   ####",
+
+"###  #          ",
+"# # ##          ",
+"# #  #          ",
+"# # ##          ",
+"# #  #          ",
+"# #  #   ## ##  ",
+"# # ##    # #   ",
+"# #  #          ",
+"# # ##          ",
+"# #  #          ",
+"# #  ###########",
+"# # #           ",
+"# ##       #    ",
+"# ##############",
+"#               ",
+"################",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+" #   ##         ",
+"                ",
+"################",
+"                ",
+"    #        #  ",
+"################",
+"                ",
+"################",
+
+"##   #  #   #  #",
+"##   #  #   #  #",
+"######  #   #  #",
+"# # #   #   #  #",
+"        #   #  #",
+"        #   #  #",
+"        #   #  #",
+"        #####  #",
+" # # #  #      #",
+"        #      #",
+"#########  #   #",
+"       #  # #  #",
+"      #  # #   #",
+"######    # #  #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#        # #    ",
+"#       # #     ",
+"#     ##########",
+"#     #         ",
+"#     #   ######",
+"#     #  ##     ",
+"#     # # #     ",
+"#     # # #     ",
+"#     # # ######",
+"#     # ##      ",
+
+"################",
+"                ",
+"                ",
+"   ######       ",
+"   ######      #",
+"    #  #       #",
+"    #  #     # #",
+"    #  #       #",
+"############   #",
+"## ##          #",
+"############   #",
+" #  #      #   #",
+" #  #      #   #",
+" #  #      #   #",
+"############   #",
+" #  #     #    #",
+
+"################",
+" #  #          #",
+" #  #          #",
+" #  #          #",
+"##  #########  #",
+"            #  #",
+"            #  #",
+"          ###  #",
+"            #  #",
+"##          #  #",
+"            #  #",
+"            #  #",
+"            #  #",
+"   #  #  #  #  #",
+"   #  #  #  #  #",
+"#############  #",
+
+"#     # ########",
+"#     #         ",
+"#     #         ",
+"#     #         ",
+"#     #         ",
+"#     #         ",
+"#     #      #  ",
+"#     #         ",
+"#     #         ",
+"#     #         ",
+"#     ##########",
+"#        #      ",
+"#    # # #    # ",
+"#        #      ",
+"#    # # # #  # ",
+"#        ###    ",
+
+"##########      ",
+" #  #           ",
+" #  #           ",
+" #              ",
+" #              ",
+" ##  ####  #####",
+"      ##      # ",
+"      ##   #### ",
+"      ##     ## ",
+"      ##      # ",
+"###   ##   #   #",
+"  #  ####  #    ",
+"# #        #    ",
+"  #        #    ",
+"# # #  # # # #  ",
+"  ###      ###  ",
+
+"               #",
+"               #",
+"               #",
+" ###           #",
+"#   #          #",
+"# # #          #",
+"#   #     #    #",
+" ###           #",
+"  #            #",
+" #             #",
+"#              #",
+"               #",
+"               #",
+"               #",
+"     #####     #",
+"    ##   #     #",
+
+"#        # #    ",
+"#          #    ",
+"#          #    ",
+"#          ###  ",
+"#         #   # ",
+"#        #     #",
+"#       ##     #",
+"#      # #     #",
+"#      #  #   # ",
+"#      # # ###  ",
+"#       #   #   ",
+"#        ###    ",
+"#               ",
+"#               ",
+"#               ",
+"################",
+
+"  # #      # #  ",
+"    #        #  ",
+"    #        #  ",
+"    ###      ###",
+"   #   #    #   ",
+"  #     #  #    ",
+" ##     # ##    ",
+"# #     ## #    ",
+"#  #   # #  #   ",
+"# # ###  # # ###",
+" #   #    #   # ",
+"  ###      ###  ",
+"                ",
+"                ",
+"                ",
+"################",
+
+"   ###   #     #",
+"   # #   #     #",
+"   ###   #     #",
+"   # #   #     #",
+"#  ###   #     #",
+" # # #   #     #",
+" # ###   #     #",
+" # # #####     #",
+"#  ##   #      #",
+"   #####       #",
+"               #",
+"         #     #",
+"               #",
+"               #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"#   # # #     ##",
+"#  ## # #       ",
+"#   # # #       ",
+"#   # # #       ",
+"#   # # #       ",
+"#   # # #      #",
+"#   # # #     ##",
+"#   # # #    ## ",
+"#   ######  ### ",
+"#  #   ##   # # ",
+"#          # #  ",
+
+"################",
+"                ",
+"                ",
+"         #######",
+"     ###########",
+"    ######      ",
+"#  ##           ",
+"  #             ",
+" #      #    ## ",
+"#               ",
+"#       #       ",
+"            #   ",
+"    #    #     #",
+"            #   ",
+"                ",
+"        #       ",
+
+"################",
+"               #",
+"               #",
+"#              #",
+"####           #",
+" #####         #",
+"    ###   ##   #",
+"     ###       #",
+"      ###      #",
+"       ###     #",
+"#   #   ###    #",
+"        ###    #",
+"# # #    ###   #",
+"          ##   #",
+"          ##   #",
+"           ##  #",
+
+"#          ###  ",
+"#          # #  ",
+"#         # ##  ",
+"#         ####  ",
+"#         ####  ",
+"#      #  ## #  ",
+"#         # ##  ",
+"#         ##### ",
+"#         ### # ",
+"#         ## ## ",
+"#          ## ##",
+"#          # # #",
+"#          ## # ",
+"#   #       ## #",
+"#           ### ",
+"#            # #",
+
+"    # # #  #### ",
+"    #   #   ##  ",
+"            ##  ",
+"        #   ##  ",
+"   # # #    ##  ",
+"#       #   ##  ",
+"           #### ",
+"        #       ",
+"       ##       ",
+"    #           ",
+"        #   #   ",
+"#               ",
+"#     #  # ## # ",
+" #          #   ",
+"# #             ",
+" # ##           ",
+
+"  # #      ##  #",
+"           ##  #",
+"    #   #  ##  #",
+"           ##  #",
+"  ## ##  # ##  #",
+"           ##  #",
+"    #      ##  #",
+"           #   #",
+"    #   #  #   #",
+"           #   #",
+"#   #     #    #",
+"         #     #",
+"  #  #   #     #",
+"        ##     #",
+"       ##      #",
+"     ###       #",
+
+"#             # ",
+"#              #",
+"#  ##           ",
+"# ###           ",
+"#  ##           ",
+"#  ########   # ",
+"# #       #     ",
+"#        #      ",
+"#               ",
+"#               ",
+"#     # # #     ",
+"#    # # #      ",
+"#               ",
+"#               ",
+"#               ",
+"################",
+
+"# # ##       #  ",
+" # # ####       ",
+"### # # ########",
+" ### # # # # # #",
+"   ###### # # ##",
+"     #########  ",
+"     ###        ",
+"    #  #        ",
+"                ",
+"                ",
+"                ",
+"              # ",
+"                ",
+"                ",
+"                ",
+"################",
+
+"    ###        #",
+" #####         #",
+"# ##           #",
+" ##            #",
+"#      ####    #",
+"      #####    #",
+"     # ####    #",
+"     # ####    #",
+"     # ####    #",
+"     # ####    #",
+"     ##  #     #",
+"     ####      #",
+"               #",
+"               #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#    ###########",
+"#   ##          ",
+"#  ###          ",
+"# ## #          ",
+"# # ##          ",
+"# ## #          ",
+"# # ##          ",
+"# ## #          ",
+"# # ##         #",
+"# ## #        ##",
+"# # ##       ###",
+"# ## #      ### ",
+"# # ##     ###  ",
+"# ## #    ###   ",
+
+"################",
+"                ",
+"################",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"#         #     ",
+"##       ###    ",
+"#       ###     ",
+"       ###      ",
+"      ###       ",
+"     ###        ",
+"    ###        #",
+
+"################",
+"               #",
+"#######        #",
+"      #        #",
+"      ######## #",
+"      #      # #",
+"      #      # #",
+"      #      # #",
+"      # #   ## #",
+"      #      # #",
+"      #      # #",
+"      #      # #",
+"      # #   ## #",
+"      #      # #",
+"      #      # #",
+" # #  #      # #",
+
+"# # ##   ###    ",
+"# ## #   ##     ",
+"# # ##          ",
+"# ## #          ",
+"# # ##          ",
+"# ## #          ",
+"# # ############",
+"# ###           ",
+"# ##   #  #  #  ",
+"# ##############",
+"#               ",
+"#  # ###########",
+"# #  #          ",
+"#  # #          ",
+"#    #          ",
+"#  # #          ",
+
+"   ###         #",
+"   ##          #",
+"               #",
+"               #",
+"                ",
+"                ",
+"################",
+"                ",
+"#  ##   #    ###",
+"########### ##  ",
+"           ###  ",
+"###       ## #  ",
+"  #  ##   # ##  ",
+"  ########## #  ",
+"          ####  ",
+"      ###### #  ",
+
+" # #  # #   ## #",
+" # #  #      # #",
+" # #  #      # #",
+" # #  #      # #",
+"      # #   ## #",
+"      #      # #",
+"#######      # #",
+"     #       # #",
+"#####   #   ## #",
+"             # #",
+"             # #",
+"             # #",
+"#           ## #",
+"    ####     # #",
+"     ##      # #",
+"     ##      # #",
+
+"#    #          ",
+"#    #          ",
+"#    #          ",
+"######          ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+"######          ",
+"#    #          ",
+"#  # ########## ",
+"#             # ",
+"#  #          # ",
+"#      #      # ",
+"#    #    #   # ",
+"################",
+
+"    ####### ##  ",
+"    ######## #  ",
+"          ####  ",
+"          ## #  ",
+"          # ##  ",
+"          ## #  ",
+"    ##########  ",
+" ## ######## #  ",
+" ########## ####",
+"  #   # # ###   ",
+"  ##########  # ",
+"  #       ######",
+"  #     #    #  ",
+"  #            #",
+"  #         #   ",
+"################",
+
+"#    ##     ## #",
+"     ##      # #",
+"     ##      # #",
+"    ####     # #",
+"#           ## #",
+"             # #",
+"             # #",
+"             # #",
+"############## #",
+"            #  #",
+" ##  #  #  #   #",
+"###########    #",
+"               #",
+"               #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#         ##### ",
+"#        #######",
+"#   #   # #   ##",
+"#      # ## # # ",
+"#     # # #     ",
+"#    # # ## # # ",
+"#   # # # #     ",
+"#  # # # ## # # ",
+"#  ## # # #     ",
+"#  # # # ## # # ",
+"#  ## # # #     ",
+"#  ### # ## # # ",
+"#  ## ### #     ",
+"#  # # # ## # # ",
+
+"################",
+"                ",
+"                ",
+"############## #",
+"############# ##",
+"# # # # # # ####",
+"            ### ",
+"# # # # # ####  ",
+"          ###   ",
+"# # # # #### #  ",
+"        ### ##  ",
+"# # # ##### ##  ",
+"      ###   ## #",
+"# # ##### # # ##",
+"    ###      ###",
+"# # ### # # ### ",
+
+"################",
+"               #",
+"               #",
+"               #",
+"#           #  #",
+"###########    #",
+"          #    #",
+"          #    #",
+"          # #  #",
+"          #    #",
+"          #    #",
+"          #    #",
+"          # #  #",
+"#         #    #",
+"          #    #",
+"          #    #",
+
+"#  ## # # #     ",
+"#  # # # ## # # ",
+"#  ## # # #     ",
+"#  # # # ## # # ",
+"#  ## # # #     ",
+"#  # # # ## # # ",
+"#  ## ### #     ",
+"#  # # # ## # # ",
+"#  ## # # #     ",
+"#  # # # ## # # ",
+"#  ## # # #     ",
+"#  ### # ## # # ",
+"#  ## # # #     ",
+"#  # # # ## # # ",
+"#  ## # # #     ",
+"#  # # # ##  # #",
+
+"           ###  ",
+"# # # # # ###   ",
+"         ### #  ",
+"# # # # ### ##  ",
+"       ###  ##  ",
+"# # # ### # ## #",
+"     ###    # ##",
+"# ##### # # ####",
+"   ###      ### ",
+"# # # # # ####  ",
+"          ###   ",
+"# # # # #### #  ",
+"        ### ##  ",
+"# # # ##### ##  ",
+"      ###   ##  ",
+" # ###### # ##  ",
+
+"          # #  #",
+"          #    #",
+"          #    #",
+"          #    #",
+"          # #  #",
+"          #    #",
+"#         #    #",
+"          #    #",
+"          # #  #",
+"          #    #",
+"          #    #",
+"   ####   #    #",
+"    ##    # #  #",
+"    ##    #    #",
+"    ##    #    #",
+"    ##    #    #",
+
+"#  ## ### #     ",
+"#  # # # ##  # #",
+"#  ## # # #     ",
+"#  # # # ##  # #",
+"#  ## # # #     ",
+"#  # # # #######",
+"#  ## # ##      ",
+"#  ### ##       ",
+"#  ## ##  # # # ",
+"#  # ##         ",
+"#  ### #  ## #  ",
+"#  ##    ##    #",
+"#  #############",
+"#               ",
+"#               ",
+"################",
+
+"    ###     ##  ",
+" # # # # # ###  ",
+"            ##  ",
+" # # # # # ###  ",
+"            ##  ",
+"################",
+"             #  ",
+"            #  #",
+"# # # # # ######",
+"          #     ",
+"##  # # ##     #",
+"#       #       ",
+"########        ",
+"                ",
+"                ",
+"################",
+
+"#   ##    # #  #",
+"#  ####   #    #",
+"#         #    #",
+"#         #    #",
+"          # #  #",
+"###########    #",
+"         #     #",
+" #      #      #",
+"########    #  #",
+"               #",
+" # # #         #",
+"               #",
+"     #  #   #  #",
+"               #",
+"               #",
+"################",
+
+"################",
+"################",
+"#####           ",
+"### #  # #      ",
+"##  #  #########",
+"### #  #   #  # ",
+"### #  #   ## ##",
+"### #  #        ",
+"##  #  #        ",
+"### #  #        ",
+"########  #### #",
+"          #   ##",
+"          #  # #",
+"          # # ##",
+"          # ## #",
+"########### # ##",
+
+"################",
+"################",
+"                ",
+"       #   #   #",
+"################",
+" #              ",
+" ##             ",
+"                ",
+"                ",
+"                ",
+"###### ### #####",
+"     #    ##    ",
+"     #   # #    ",
+"     #  # ##    ",
+"     #  ## #    ",
+"     #  # ##    ",
+
+"#########    ###",
+"#########    ###",
+"        #    #  ",
+"        #    #  ",
+"#########    #  ",
+"  #          #  ",
+" # #         ###",
+"  #             ",
+"                ",
+"        ######  ",
+"# #### ##    # #",
+"#     # #    #  ",
+"#    # ##    #  ",
+"#    ## #    #  ",
+"#    # ##    #  ",
+"#    ## #    #  ",
+
+"################",
+"###### # # # ###",
+"    # # # # # ##",
+"     # # # ## ##",
+"    #    # #  ##",
+"  ##    # #   ##",
+"# ##   # #    ##",
+"      # #     ##",
+"     # #      ##",
+"              ##",
+"##   #        ##",
+" #   #        ##",
+" #   #        ##",
+" #   #        ##",
+" #   #  ##### ##",
+" #   # ##   # ##",
+
+"### ##    # ## #",
+"##  ##    # # ##",
+"### ##    # ## #",
+"### ##    # # ##",
+"##  ##    # ### ",
+"### ##    # ## #",
+"### ##    # # ##",
+"### ##    # ####",
+"##  ## #  # # ##",
+"### ##    # ####",
+"### ##    # # ##",
+"### ##    # ####",
+"##  ## #  # # ##",
+"### ##    # ####",
+"### ##    # # ##",
+"### ##    # ####",
+
+" ###############",
+"## #  #  #  #  #",
+"##              ",
+" #             #",
+"##            # ",
+" #  #         # ",
+"##             #",
+" #             #",
+"##           ###",
+" #             #",
+"##             #",
+" #             #",
+"##        ###  #",
+" #  #      #   #",
+"##          ####",
+" #           ###",
+
+"################",
+"  #  #  #  #  ##",
+"               #",
+"#              #",
+" #        #   ##",
+" #             #",
+"#              #",
+"#             ##",
+"###            #",
+"#              #",
+"#             ##",
+"#              #",
+"#  ###         #",
+"#   #     #   ##",
+"####           #",
+"###            #",
+
+" #   #### # # ##",
+" #     ##   # ##",
+" #     ##   # ##",
+" #   #### # # ##",
+" #   # ##   # ##",
+" #   # ###### ##",
+" #   # #####  ##",
+" #   #        ##",
+" #   #        ##",
+" #   #        ##",
+" #   #######  ##",
+" #     ## ##  ##",
+" #    ## # #  ##",
+" #    ######  ##",
+" #    #### #  ##",
+" #         #####",
+
+"##  ## #  # # # ",
+"### ##    # ## #",
+"### ##    # # # ",
+"### ##    # ## #",
+"##  ## #  # # ##",
+"### ##    # ## #",
+"### ##    # # ##",
+"##  ##    # ## #",
+"### ## #  # # ##",
+"### ##    # ### ",
+"##  ##    # ### ",
+"### ##    # ####",
+"### ##    #     ",
+"##  ##    ######",
+"### ##          ",
+"################",
+
+"##              ",
+" ###############",
+"######  ####### ",
+"################",
+"                ",
+"                ",
+"                ",
+"                ",
+"################",
+" ##  #   ##  #  ",
+"### # # ### # # ",
+"################",
+"                ",
+"################",
+"          ###   ",
+"####     ## #  #",
+
+"              ##",
+"################",
+"###### #### # # ",
+"##############  ",
+"             #  ",
+"             #  ",
+"             #  ",
+"             #  ",
+"##############  ",
+" ##  #   ## #   ",
+"### # # ####    ",
+"###########     ",
+"                ",
+"################",
+"                ",
+"##          ### ",
+
+" #              ",
+" #              ",
+" #              ",
+" #              ",
+" #   ###########",
+" #   #        ##",
+" #   #    ######",
+" #   #   ##  # #",
+" #   #  # #  ###",
+" #   # #  #### #",
+" #   #   #  # ##",
+" #   #  #  #  ##",
+" #   # #  #   ##",
+"##   #        ##",
+"     #        ##",
+"     #    #   ##",
+
+"## # # # # # # #",
+"################",
+"### ##     #  # ",
+"### ##    ######",
+"### ##   #  #   ",
+"##  ##  ####    ",
+"### ## ## ######",
+"### ##  ## #    ",
+"##  ##  #  #    ",
+"### ##     #    ",
+"### ##     #    ",
+"##  ########    ",
+"###        #    ",
+"##### ## ###    ",
+"############    ",
+"############    ",
+
+" # #     #### ##",
+"####     ###  ##",
+"# #           ##",
+"###########    #",
+"          #    #",
+"          #    #",
+"###########    #",
+"               #",
+"  #            #",
+"    #   ###    #",
+"        ### #  #",
+"################",
+"#               ",
+"# ##############",
+"################",
+"################",
+
+" #  #      ## # ",
+"##        # ### ",
+"#         ### # ",
+"##########  ### ",
+"           ## # ",
+"          # ### ",
+"         ## # # ",
+"  ##### # ##### ",
+"  #    ## # # # ",
+"  #   # ##  ### ",
+"  #  ####   # # ",
+"  #    #    ### ",
+"  #         # # ",
+"################",
+"############# ##",
+"################",
+
+"     #   # #  ##",
+"     #    #   ##",
+"     #  #   # ##",
+"###### # # # ###",
+"        #   # ##",
+"          #   ##",
+"    # #  # #  ##",
+"          #   ##",
+"    # #       ##",
+"              ##",
+"            # ##",
+" #         ## ##",
+"              ##",
+"################",
+"################",
+"################",
+
+"################",
+"#               ",
+"#           #   ",
+"#               ",
+"#               ",
+"#               ",
+"#   #       #   ",
+"#               ",
+"#       #       ",
+"# # #           ",
+"# # #       #   ",
+"#               ",
+"# ##############",
+"# ## # # # # # #",
+"# #     # # # # ",
+"# ## # # # # # #",
+
+"################",
+"                ",
+"            #   ",
+"                ",
+"#       #       ",
+"                ",
+"    #           ",
+"                ",
+"        #       ",
+"                ",
+"    #       #   ",
+"                ",
+"################",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"################",
+"                ",
+"                ",
+"           ###  ",
+"          ###   ",
+"       # #      ",
+"      # #       ",
+"     # # #      ",
+"    # #   #     ",
+"   # ##         ",
+"     ##         ",
+"     #          ",
+"################",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"################",
+"                ",
+"    #           ",
+"                ",
+"#       #       ",
+"                ",
+"            #   ",
+"                ",
+"        #       ",
+"                ",
+"    #       #   ",
+"                ",
+"################",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"################",
+"                ",
+"   ## ##########",
+"      ## # # # #",
+"#  ## #   #   # ",
+"      ## # # # #",
+"      # # # # # ",
+"      ## # # # #",
+"      # # #   # ",
+"      ## # # # #",
+"    # # # #   # ",
+"      ## # # # #",
+"####### # # # # ",
+" # # # # # # # #",
+"# # # # # #   # ",
+" # # # # # # # #",
+
+"################",
+"               #",
+"### ##         #",
+" ##            #",
+"  # ##  #      #",
+" ##            #",
+"# #         #  #",
+" ##            #",
+"# #            #",
+" ##       # #  #",
+"# # #     # #  #",
+" ##            #",
+"# ############ #",
+" # # # # # # # #",
+"# # # # #   ## #",
+" # # # # # # # #",
+
+"# #     # # # # ",
+"# ## # # # # # #",
+"# #     #     # ",
+"# ## # # # # # #",
+"# #     # # # # ",
+"# ## # # # # # #",
+"# #     # # # # ",
+"# ## # # # # # #",
+"# ##############",
+"#     #   #   # ",
+"# # # # #   # # ",
+"# # # #       # ",
+"#     # #   # # ",
+"#     #   #   # ",
+"#   # # #   # # ",
+"#     #       # ",
+
+"# # # # # # # # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"################",
+"                ",
+"    #       #   ",
+"                ",
+"#       #       ",
+"                ",
+"                ",
+"                ",
+
+"# # # # # # # # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"################",
+"                ",
+"    #       #   ",
+"                ",
+"        #       ",
+"                ",
+"    #       #   ",
+"                ",
+
+"# # # # # # # # ",
+" # # # # # # # #",
+"#     # #     # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+"################",
+"       #  #   ##",
+"    #  ##   #  #",
+"       #  #   ##",
+"       ##   #  #",
+"       #  #   ##",
+"    #  ##   #  #",
+"       #  #   ##",
+
+"# # # # # #   # ",
+" # # # # # # # #",
+"#     # #       ",
+" # # # # # # # #",
+"# # # # # #   # ",
+" # # # # # # # #",
+"# # # # # #   # ",
+" # # # # # # # #",
+"####### # # # # ",
+"      ## # # # #",
+"    # # # #   # ",
+"      ## # # # #",
+"#     # # #   # ",
+"      ## # # # #",
+"    # # # # # # ",
+"      ## # # # #",
+
+"# # # # #   ## #",
+" # # # # # # # #",
+"# #     #   ## #",
+" # # # # # # # #",
+"# # # # #   ## #",
+" # # # # # # # #",
+"# # # # #   ## #",
+" # # # # # # # #",
+"# ############ #",
+" ##            #",
+"# # #     # #  #",
+" ##       # #  #",
+"# #     #      #",
+" ##            #",
+"# # #          #",
+" ##            #",
+
+"#     # #   # # ",
+"#     #   #   # ",
+"#   # # #   # # ",
+"#     #       # ",
+"#   ### #   # ##",
+"#   # #   #   # ",
+"#   #   #   #   ",
+"#   # #       # ",
+"#   #   #   ####",
+"#   # #   #  ## ",
+"#   #   #   #  #",
+"#   # #   #   # ",
+"#   #   #   # ##",
+"#   ########### ",
+"#  ##        ## ",
+"# ###        ## ",
+
+"#       #       ",
+"                ",
+"    #       #   ",
+"  #####         ",
+"###   ##########",
+"  ## ##   #   # ",
+"#   #   #   #   ",
+"  ## ##   #   # ",
+"#### ########   ",
+"   # #    ##    ",
+"#  # #  ##  #   ",
+" ### ###########",
+"#########       ",
+"       ##       ",
+"       ##       ",
+"##     ##       ",
+
+"#               ",
+"                ",
+"    #       #  #",
+"               #",
+"################",
+"  #   #   #   ##",
+"#   #   #   ####",
+"  #   #   # ####",
+"#   #   #  #####",
+"  #       ## ###",
+"#   #   ### ####",
+"########## # ###",
+"# # # # # # ####",
+"        ## # ###",
+"# # # # # # ####",
+"        ## # ###",
+
+"#      ##   #  #",
+"       #  #   ##",
+"#############  #",
+"            # ##",
+"         #  #  #",
+"            # ##",
+"     #      #  #",
+"    #       # ##",
+"   #        #  #",
+"         #  # ##",
+"    ##  #   #  #",
+"   #        # ##",
+"  #         #  #",
+"         #  # ##",
+"            #  #",
+"############# ##",
+
+"#     # # # # # ",
+"      ## # # # #",
+"    # # # #   # ",
+"      ## # # # #",
+"#     # # #   # ",
+"      ## # # # #",
+"    # # # # # # ",
+"      ## # # # #",
+"#     # # # # # ",
+"      ## # # # #",
+"    # # # #   # ",
+"      ## # # # #",
+"#     # # #   # ",
+"      ## # # # #",
+"    # # # # # # ",
+"      ## # # # #",
+
+"# #            #",
+" ##            #",
+"# # #       #  #",
+" ##            #",
+"# #     #      #",
+" ##            #",
+"# # #          #",
+" ##            #",
+"# #     #      #",
+" ##            #",
+"# # #       #  #",
+" ##            #",
+"# #            #",
+" ##            #",
+"# # #       #  #",
+" ##            #",
+
+"# # #        ## ",
+"# ###        ## ",
+"# # #        ## ",
+"# ###        ## ",
+"# # #        ## ",
+"# ###        ## ",
+"# # #        ## ",
+"# ###        ###",
+"# # ##########  ",
+"# ##     # #    ",
+"# ##############",
+"#       #  #    ",
+"#     ###  #####",
+"#    # #    ### ",
+"#   # ###   ### ",
+"#  #####        ",
+
+" #     ##       ",
+"#      ##       ",
+" #     ##       ",
+"#      ##       ",
+"##     ##       ",
+"       ##       ",
+"       #########",
+"########        ",
+"            # # ",
+"  # #    ##    #",
+"############### ",
+" #  #   # #   # ",
+"##  ##### ##### ",
+"           ###  ",
+"           ###  ",
+"                ",
+
+"  # # # # # ### ",
+"        ## # ###",
+"    # # # # #   ",
+"        ## #    ",
+"      # # #     ",
+"        ##      ",
+"#####   ########",
+"     #          ",
+"    # #         ",
+"#  # # #        ",
+"# ### ##   #   #",
+" ##### #        ",
+"  ### ##        ",
+"   # # #        ",
+"   ## ##        ",
+" ##### #        ",
+
+"         ## #  #",
+"######### #   ##",
+"       ##   #  #",
+"      #   #   ##",
+"     #      #  #",
+"    # #   #   ##",
+"#####   #   #  #",
+"   #  #   #   ##",
+"   ##       #  #",
+"   #  #   #   ##",
+"   ##   #   #  #",
+"   #  #   #   ##",
+"   ##  ##   #  #",
+"   #  ### #   ##",
+"   ## # #   #  #",
+"   #  # # #  ###",
+
+"#     # # # # # ",
+"      ## # # # #",
+"    # # # #   # ",
+"      ## # # # #",
+"#     # # #   # ",
+"      ## # # # #",
+"    # # # # # # ",
+"      ## # # # #",
+"#     # # # # # ",
+"      ## # # # #",
+"    # # # #   # ",
+"      ## # # # #",
+"#     # # #   # ",
+"      ## # # # #",
+"    # # # # # # ",
+"      ## # # # #",
+
+"# #     #      #",
+" ##            #",
+"# # #          #",
+" ##            #",
+"# #     #      #",
+" ##            #",
+"# # #       #  #",
+" ##            #",
+"# #     #      #",
+" ##            #",
+"# # #       #  #",
+" ##            #",
+"# #            #",
+" ##            #",
+"# # #       #  #",
+" ##            #",
+
+"# ### #         ",
+"# # #       ####",
+"# # #      # #  ",
+"# ###     # ####",
+"# # #     # #  #",
+"# # #     #     ",
+"# # #     ######",
+"# ###  ## #     ",
+"# # #  ## #     ",
+"# # #  ## #     ",
+"# # #     #     ",
+"# ###     #     ",
+"# # #     #     ",
+"# # #     #     ",
+"# # #     ######",
+"# ###     #     ",
+
+"                ",
+"#########       ",
+"#  #  #  #      ",
+"####### # #     ",
+"  #  # #  #     ",
+"      # # # ##  ",
+"###     ### ##  ",
+"  #    ## # ##  ",
+"  #     # #     ",
+"  #     ###     ",
+"  #    ## #     ",
+"  #     # #    #",
+"  #     ###    #",
+"  #    ## #    #",
+"###     # #     ",
+" #      ###     ",
+
+" # ## ##        ",
+" # # # #        ",
+" # ## ##        ",
+" ##### #        ",
+"   ## ##        ",
+"   ### #        ",
+"   ## ##        ",
+" ### # #        ",
+" # ## ##########",
+" # # ###########",
+" # ## #         ",
+"## # ##         ",
+"## ## #         ",
+"## # ##         ",
+" #### #   # # ##",
+"   ####   ## # #",
+
+"   ###  #   # ##",
+"   ########## ##",
+"   #      ### ##",
+"   ########  ###",
+"   ###  #   #  #",
+"   #  # # #   ##",
+"   ## # #   #  #",
+"   #  ### #   ##",
+"#####  ##   #  #",
+"###   #   #   ##",
+"  # #       #   ",
+"  #   #   #   # ",
+"  # #   #   #   ",
+"  #   #         ",
+"  # #   #   #   ",
+"  #   #   #   # ",
+
+"#     # # # # # ",
+"      ## # # # #",
+"    # # # #   # ",
+"      ## # # # #",
+"#     # # #   # ",
+"      ## # # # #",
+"    # # # # # # ",
+"      ## # # # #",
+"#     # # # # # ",
+"######## # # # #",
+"#   # # # #   # ",
+"  #   ## # # # #",
+"#   # # # #   # ",
+"      ## # # # #",
+"#   # # # # # # ",
+"  #   ## # # # #",
+
+"# #     #      #",
+" ##            #",
+"# # #          #",
+" ##            #",
+"# #     #      #",
+" ##            #",
+"# # #       #  #",
+" ##            #",
+"# #     #      #",
+" ##            #",
+"# # #       #  #",
+" ##            #",
+"# #     #      #",
+" ##            #",
+"# # #          #",
+" ##            #",
+
+"# # #     # ####",
+"# # #      #    ",
+"# # #       ####",
+"# ###           ",
+"# # #           ",
+"# # #           ",
+"# ## #          ",
+"# #   ##########",
+"#  #   #   #   #",
+"#   ############",
+"#   #       #   ",
+"#               ",
+"#       #       ",
+"#               ",
+"#   #       #   ",
+"################",
+
+"#      ## #     ",
+"       # #      ",
+"#########       ",
+"                ",
+"   ###          ",
+"   ###          ",
+"                ",
+"##########      ",
+"   #   #  #     ",
+"########   # ## ",
+"    #   # ## ## ",
+"         # # ## ",
+"#       ####    ",
+"         ##     ",
+"    #    ##     ",
+"################",
+
+"   ## #         ",
+" ### ###########",
+" # #############",
+" # # #          ",
+" # ###          ",
+" #####          ",
+"   ###          ",
+"   # #          ",
+" ###############",
+" # ##           ",
+" # #############",
+" #              ",
+" #      #       ",
+"#               ",
+"#   #       #   ",
+"################",
+
+"  # #       #  #",
+"###   #   #   ##",
+"##  #   #   #  #",
+" ##   #   #   ##",
+" #  #       #  #",
+" ##   #   #   ##",
+" #  #   #   #  #",
+" ###############",
+"##      #       ",
+"#               ",
+"     ####   #   ",
+"    ##  #       ",
+"#   #####       ",
+"    ####        ",
+"            #   ",
+"################",
+
+"####### # # # # ",
+"      ## # # # #",
+"    # # # #   # ",
+"      ## # # # #",
+"#     # # #   # ",
+"      ## # # # #",
+"    # # # # # # ",
+"      ## # # # #",
+" ###  #   #   # ",
+" # #  ## # # # #",
+"      #   #   # ",
+"      ## # # # #",
+"#     ##########",
+"                ",
+"    #  # # ### #",
+"################",
+
+"# #     #      #",
+" ##            #",
+"# # #       #  #",
+" ##            #",
+"# #            #",
+" ##            #",
+"# # #       #  #",
+" ##            #",
+"  #  ###       #",
+" ##  # #       #",
+"  #         #  #",
+" ##            #",
+"###     #      #",
+"               #",
+" #  #       #  #",
+"################",
+
+"                ",
+"                ",
+"       ####### #",
+"##### ##      ##",
+"#    ### # # ## ",
+"#   ## #     # #",
+"#  ## ## # # ## ",
+"#  # # #     # #",
+"#  ## ## # # ## ",
+"#  # # #  #  # #",
+"#  ## ## # # ## ",
+"#  # # #     # #",
+"#  ## ## # # ## ",
+"#  # # #     # #",
+"#  ## ## # # ## ",
+"#  # # #     # #",
+
+" ###############",
+"################",
+"##              ",
+" #  ####        ",
+"##   ##         ",
+" #             #",
+"##            ##",
+" #  ####     ###",
+"##   ##     ### ",
+" #         ###  ",
+"##        ###   ",
+" #     # ###    ",
+"##      ###     ",
+" #      ##     #",
+"##     #  #   ##",
+" #           ###",
+
+"                ",
+"#               ",
+"##              ",
+" ## ############",
+"# ##            ",
+"## ##           ",
+"#   ##          ",
+"    ##          ",
+"    ##          ",
+"    ##          ",
+"    ##          ",
+"    ##          ",
+"#   ##          ",
+"##  ##          ",
+"#   ##          ",
+"    ##         #",
+
+"                ",
+"                ",
+"                ",
+"################",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+"               #",
+" #  #  #  #  # #",
+"#  #  #  #  #  #",
+"  #  #  #  #  # ",
+
+"#  ## ## # # ## ",
+"#  # # #     # #",
+"#  ## ## # # ## ",
+"#  # # #     # #",
+"#  ## ## # # ## ",
+"#  # # #     # #",
+"#  ## ## # # ## ",
+"#  # # #     # #",
+"#  ## ## # # ## ",
+"#  # # #  #  # #",
+"#  ## ## # # ## ",
+"#  # # #  #  # #",
+"#  ## ## # # ## ",
+"#  # # #     # #",
+"#  ## ## # # ## ",
+"#  # # #     # #",
+
+"##          ### ",
+" #         ###  ",
+"##        ###   ",
+" #     # ###    ",
+"##      ###     ",
+" #      ##     #",
+"##     #  #   ##",
+" #           ###",
+"## #        ### ",
+" #         ###  ",
+"##        ###   ",
+" #     # ###    ",
+"## #    ###     ",
+" #      ##     #",
+"##     #  #   ##",
+" #           ###",
+
+"    ##          ",
+"    ##         #",
+"    ##          ",
+"    ##          ",
+"#   ##          ",
+"##  ##         #",
+"#   ##          ",
+"    ##          ",
+"    ##          ",
+"    ##         #",
+"    ##     #    ",
+"    ##    #   # ",
+"#   ##   #   #  ",
+"##  ##     #   #",
+"#   ##    #     ",
+"    ##   #      ",
+
+"#            #  ",
+"               #",
+"              # ",
+" #           #  ",
+"#              #",
+"              # ",
+"             #  ",
+" #             #",
+"#             # ",
+"             #  ",
+"               #",
+" #            # ",
+"#            #  ",
+"               #",
+"              # ",
+"             #  ",
+
+"#  ## ## # # ## ",
+"#  # # #     # #",
+"#  ## ## # # ## ",
+"#  # # #     # #",
+"#  ## ## # # ## ",
+"#  # # #     # #",
+"#  ## ## # # ## ",
+"#  # # #     # #",
+"#  ## ## # # ## ",
+"#  # # #     # #",
+"#  ## ## # # ## ",
+"#  # # #     # #",
+"#  ## ##   # ###",
+"#  # # #     ## ",
+"#  ## ##     ###",
+"#  # # #        ",
+
+"## #        ### ",
+" #         ###  ",
+"##        ###   ",
+" #     # ###    ",
+"## #    ###     ",
+" #      ##      ",
+"##     #  #     ",
+" #              ",
+"##              ",
+" #              ",
+"################",
+"#             # ",
+"  #   #   #  #  ",
+" #   #   #  #   ",
+"############    ",
+"                ",
+
+"    ##     #    ",
+"    ##    #     ",
+"    ##   #      ",
+"    ##     #    ",
+"    ##    #     ",
+"    #    #      ",
+"   #       #    ",
+"  #       #     ",
+" # #     #     #",
+"#  #       #  # ",
+"   #      #   # ",
+"   #     #    ##",
+"   # ###   #  ##",
+"#  #   #  #     ",
+"   #   # #      ",
+"#  #   #   #  # ",
+
+"               #",
+"              # ",
+"             #  ",
+"             # #",
+"            # # ",
+"           #   #",
+" ## ##       # #",
+"### # #     #  #",
+"# # # #    #   #",
+"# # # #      # #",
+"### ###     #  #",
+" # # #     #   #",
+"# ###        # #",
+"            #  #",
+"               #",
+" #  #  #  #  # #",
+
+"#  ## ##        ",
+"#  # # #  #     ",
+"#  ## ##        ",
+"#  # # #  #     ",
+"#  ## ##       #",
+"#  # # #  #   # ",
+"#  ## ##        ",
+"#  # # #########",
+"#  ## #         ",
+"#  # #      #  #",
+"#  ##   # #   ##",
+"#  #############",
+"#               ",
+"#     #         ",
+"#    #  #       ",
+"################",
+
+"                ",
+"    #    #      ",
+" # #            ",
+"###      #      ",
+" #              ",
+"         #      ",
+"                ",
+"################",
+"                ",
+"##       #   #  ",
+"#   # #    #    ",
+"################",
+"                ",
+"                ",
+"                ",
+"################",
+
+"   #   #  #  #  ",
+"#  #   # #  #  #",
+"   #   #        ",
+"#  #   #########",
+"   #    ##  ## #",
+"#  #    ##  ## #",
+"   #    ##  ## #",
+"####            ",
+"  #             ",
+" #           ###",
+"#            ###",
+"  #####    #####",
+"      #    #    ",
+"      #    #    ",
+"      #    #    ",
+"####### ## #####",
+
+"#  #  #  #  #  #",
+"  #  #  #  #   #",
+"               #",
+"############## #",
+"# ##    ##   # #",
+"# ##    ##   # #",
+"# ##    ##   # #",
+"             # #",
+"             # #",
+"             # #",
+"             # #",
+"#####    ##### #",
+"    #    #     #",
+"    #    #     #",
+"    #    #     #",
+"##### ## #######",
+
+"################",
+"#               ",
+"#        #      ",
+"#   # #         ",
+"#  # #          ",
+"#   # #         ",
+"#  # #  ########",
+"#      #########",
+"# # # # #       ",
+"#    # ##   #   ",
+"# # #   #  # #  ",
+"#   ## ##   #   ",
+"# # #   #       ",
+"#   ## ##       ",
+"# # #   #   ####",
+"#   ## ##  ##   ",
+
+"################",
+"                ",
+"       #        ",
+"        # #     ",
+"       # #      ",
+"        #       ",
+"################",
+"################",
+"               #",
+"  #            #",
+" # #   # ##    #",
+"  #       #    #",
+"               #",
+"               #",
+"################",
+"                ",
+
+"################",
+"               #",
+"               #",
+"               #",
+" ###########   #",
+" #         #   #",
+"#####   ####   #",
+"# ###   ####   #",
+"#          #   #",
+"#       ####   #",
+"#       ####   #",
+"#          #   #",
+"# ##       #   #",
+"# ##       #   #",
+"#####      #   #",
+"    #   #  #####",
+
+"# # #   # # # ##",
+"#   ## ### ## ##",
+"# # #   # # # # ",
+"#   ## # # ## # ",
+"# # # # # # # # ",
+"#   ## # # ## # ",
+"# # ### # # # # ",
+"#   ## # # ## # ",
+"# # # # # # # # ",
+"#   ## # # ## # ",
+"# # # # # # # # ",
+"#   ## # # ## # ",
+"# # # # # # # # ",
+"#   #### # ## # ",
+"# # ### # # # # ",
+"#   #### # ## # ",
+
+"################",
+" # # # # # # # #",
+"                ",
+"#######  ####   ",
+"#######  #####  ",
+"##       ##  ## ",
+"##       ##   ##",
+"##       ##   ##",
+"######   ##   ##",
+"######   ##   ##",
+"##       ##   ##",
+"##       ##   ##",
+"##       ##  ## ",
+"##       #####  ",
+"##       ####   ",
+"                ",
+
+"### #          #",
+" ## #          #",
+"  # #      #####",
+" ## #      #   #",
+"  # #      #   #",
+" ## #      #   #",
+"  # #      #   #",
+" ## ########## #",
+"  # ########## #",
+" ## #       ## #",
+"  # #  #    ## #",
+" ## #     # ## #",
+"  # #    #  ## #",
+" ## #   #   ## #",
+"  # #  #    ## #",
+" ## #       ## #",
+
+"# # ### # # # ##",
+"#   ## # # ##   ",
+"# # # # # # ####",
+"#   ## # # #    ",
+"# # # # # #     ",
+"#   ## # #      ",
+"# # # # #    ###",
+"#   ## #    # # ",
+"# # # #    #####",
+"#   ##    # # # ",
+"#   ############",
+"#        #     #",
+"#        #     #",
+"#  #     #     #",
+"#        #     #",
+"################",
+
+"################",
+"                ",
+"################",
+"     ####       ",
+"    #  #        ",
+"    ###         ",
+"####   #######  ",
+"# #   # # # #   ",
+"##   #######    ",
+"#   # # # #    #",
+"################",
+" # #     #     #",
+"   #     #      ",
+" # #     #      ",
+"   #     #      ",
+"################",
+
+"### #       ## #",
+"    #       ## #",
+"#####       ## #",
+"   #    #   ## #",
+"  #   #     ## #",
+" #          ## #",
+"############## #",
+"            #  #",
+"##  #  #   #   #",
+"#         #    #",
+"##########     #",
+"               #",
+"               #",
+"               #",
+"               #",
+"################",
+
+"################",
+"#               ",
+"#               ",
+"#    #          ",
+"# ###      # #  ",
+"# # #       #   ",
+"# # #      # #  ",
+"# # #     #    #",
+"# ###  ######## ",
+"#     ## #######",
+"## # ### # # ## ",
+"#   ## # #######",
+"## ## ## # # ## ",
+"#  # # # #######",
+"## ## ## # # ## ",
+"#  # # # #######",
+
+"################",
+"                ",
+"       #  #     ",
+"      #  #      ",
+"  ##############",
+" ###############",
+"# #             ",
+" ##             ",
+"# #   ######   #",
+" ##   #######  #",
+"# #   ##   ##  #",
+" ##   ##   ##  #",
+"# #   ##   ##  #",
+" ##   #######  #",
+"# #   ######   #",
+" ##   ##       #",
+
+"################",
+"               #",
+"               #",
+"               #",
+"##########     #",
+"##########     #",
+"        ##     #",
+"        ##     #",
+"###     ###### #",
+"####    ###### #",
+"#  ##   ## # # #",
+"#   ##  ###### #",
+"#   ##  ## # # #",
+"#   ##  ###### #",
+"#   ##  ## # # #",
+"#   ##  ###### #",
+
+"## ## ## # # ## ",
+"#  # # # #######",
+"## ## ## # # ## ",
+"#  # # # #######",
+"## ## ## # # ## ",
+"#  # # # #######",
+"## ## ## # # ## ",
+"#  # # # #######",
+"## ## ## ###### ",
+"#  # # #      ##",
+"## ## ######### ",
+"#  # ##         ",
+"## ###   #  #  #",
+"#  ##           ",
+"#  #############",
+"#               ",
+
+"# #   ##       #",
+" ##   ##       #",
+"# #   ##       #",
+" ##   ##       #",
+"# #             ",
+" ##             ",
+"# ##############",
+" #              ",
+"#  #  #  #  #  #",
+"                ",
+" #  #  #     #  ",
+"        #####   ",
+"  #  # #   #  # ",
+"    # #   #  #  ",
+"################",
+"  #           # ",
+
+"#   ##  ## # # #",
+"#  ##   ###### #",
+"####    ## # # #",
+"###     ###### #",
+"        ## # # #",
+"        ###### #",
+"########## # # #",
+"        # #### #",
+"  #  # # ### # #",
+"      #      # #",
+"#  # ######### #",
+"            #  #",
+" #  #  #   #   #",
+"          #    #",
+"##########     #",
+"               #",
+
+"#               ",
+"#    # #     ###",
+"#   # #     #   ",
+"#    # #   # #  ",
+"#     #   # ### ",
+"#         #### #",
+"#        #  # ##",
+"#    # # #      ",
+"#   # #  #      ",
+"#    # # #   ###",
+"#        #   # #",
+"#        #   # #",
+"# #      #   # #",
+"#        #   # #",
+"# #      #   #  ",
+"################",
+
+"   ###########  ",
+"################",
+"                ",
+"                ",
+"### ########### ",
+"  # #         # ",
+"### ########### ",
+"        ## ##   ",
+"        ## ##   ",
+"        ## ##   ",
+" ## ##          ",
+" ## ##         #",
+" ## ##         #",
+"################",
+"                ",
+"################",
+
+"               #",
+"#####    # # # #",
+"     #    # #  #",
+"      #  # #   #",
+"##     #  # #  #",
+"# #    #   #   #",
+"####    #      #",
+"        #      #",
+"        #      #",
+"  ###   #      #",
+"  # #   #  #   #",
+"### #   # # #  #",
+"### #   #  #   #",
+"### #   # # #  #",
+"    #   #      #",
+"################",
+
+"################",
+"# #   #   #   # ",
+"#       #   #  #",
+"# #   #   #   # ",
+"#       #   #  #",
+"# # ############",
+"#   #           ",
+"# # #           ",
+"#####           ",
+"                ",
+"        #  #  # ",
+"                ",
+"#####           ",
+"# # #           ",
+"#   #           ",
+"# # #           ",
+
+"#   ############",
+"#   # #   #   # ",
+"#   #   #   #   ",
+"#   # #   #   # ",
+"#   #   #   #   ",
+"#   #     #   ##",
+"    #   #     # ",
+"    # #   #  #  ",
+"    #   #   #   ",
+"    # #    ##   ",
+" #  #   #  #   #",
+"    # #   ##  ##",
+"    #    ### ###",
+"    # #  ##  # #",
+"    #   # # #  #",
+"    #   # # # # ",
+
+"################",
+"  #   ######### ",
+"#   ###       ##",
+"  ##            ",
+"##              ",
+"      ########  ",
+"    ##        ##",
+"  ##            ",
+" #    #######   ",
+"#   ##       ## ",
+"  ##           #",
+"##    ######    ",
+"#  ###      ##  ",
+"  ##          ##",
+" #  # # # # #   ",
+"#               ",
+
+"################",
+"  #   #   #   ##",
+"#   #       #  #",
+" ##   #   #   ##",
+"   ##   #   #  #",
+"     ##   #   ##",
+"      # #   #  #",
+"##     #  #   ##",
+"  ##   ##      #",
+"   ##   # #   ##",
+"#   #   #   #  #",
+" #  ##   ##   ##",
+"  #####  #  #  #",
+"   ####  ##   ##",
+"#  ##  #  # #  #",
+" #  #  #  #   ##",
+
+"#   #           ",
+"# # #   #  #  # ",
+"#   #           ",
+"# # #           ",
+"#   #           ",
+"# # #           ",
+"#   #           ",
+"# # #           ",
+"#   #   #  #  # ",
+"# # #           ",
+"#   #           ",
+"# # #           ",
+"#   #           ",
+"# # #           ",
+"#   #           ",
+"# # #   #  #  # ",
+
+"    #  #  ### # ",
+" #  # ##  ##  ##",
+"    ####  ## # #",
+"       ## ## ## ",
+"    ### # ## ## ",
+"    # #   ## ## ",
+"    # # # ## ## ",
+"    # # # ## ## ",
+"    # #   ## ## ",
+"    # # # ## ## ",
+"    # # # ## ## ",
+"    # #   ## ## ",
+"    ### # ## ## ",
+"       ## ## ## ",
+"    ###   ## ## ",
+" #  # # # ## ## ",
+
+"################",
+"                ",
+"                ",
+"################",
+"## # # # # # # #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # #       # # ",
+
+"### #  #  # #  #",
+"  # #   # #   ##",
+"  #  #  # # #  #",
+"#  # #  # #   ##",
+"#  # #  # # #  #",
+"#  # #  # #   ##",
+"#  # #  # # #  #",
+"#  # #  # #   ##",
+"#  # #  # # #  #",
+"#  # #  # #   ##",
+"#  # #  # # #  #",
+"#  # #  # #   ##",
+"#  # #  # # #  #",
+"#  # #  # #   ##",
+"#  # #  # # #  #",
+"#  # #  # #   ##",
+
+"#   #           ",
+"#   #           ",
+"#   #           ",
+"# # #           ",
+"#   #           ",
+"# # #           ",
+"#   #   #  #  # ",
+"# # #           ",
+"#   #           ",
+"# # #           ",
+"#   #           ",
+"# # #           ",
+"#   #           ",
+"# # #   #  #  # ",
+"#   #           ",
+"# # #           ",
+
+"    # # # ## ## ",
+"    # #   ## ## ",
+"    # # # ## ## ",
+"    # # # ## ## ",
+"    # #   ## ## ",
+"    # # # ## ## ",
+" #  ### # ## ## ",
+"       #  ## ## ",
+"    ### # ## ## ",
+"    # # # ## ## ",
+"    # #   ## # #",
+"    # # # ##  ##",
+"    # # # ### ##",
+" #  # #   ###   ",
+"    # #   ###   ",
+"    # #  # # ## ",
+
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"## # # # # # # #",
+"################",
+"                ",
+"################",
+" #              ",
+"  ## # # # # ###",
+
+"#  # #  # # #  #",
+"#  # #  # #   ##",
+"#  # #  # # #  #",
+"#  # #  # #   ##",
+"#  # #  # # #  #",
+"#  # #  # #   ##",
+"#  # #  # # #  #",
+"#  # #  # #   ##",
+"#  # #  # # #  #",
+"#  # #  # #   ##",
+"# #  #  # # #  #",
+"# # #   # #   ##",
+"  # #   # # #  #",
+"### #  # ##   ##",
+"## #   # #  #  #",
+"   ## #  #    ##",
+
+"#####           ",
+"                ",
+"                ",
+"                ",
+"#####   #  #  # ",
+"# #  #          ",
+"#   # #         ",
+"# #   ##        ",
+"#   #   #####   ",
+"# #   #   # #   ",
+"#   #########   ",
+"# # ##  ## ##   ",
+"#  # ### ## #   ",
+"# ###########   ",
+"#  ##  ##  ##   ",
+"#############   ",
+
+"    # # #  # ###",
+"    # ##    # ##",
+"    # ## #   #  ",
+"    # ##     ###",
+" #  #  #  #   ##",
+"    #   #      #",
+"    #   #   #   ",
+"    # #  #      ",
+" ####    # ## # ",
+" #   ##  ####   ",
+" # #  ###  ##   ",
+" #        # ##  ",
+" # # #####    ##",
+" #    #   #     ",
+" # #    #   #   ",
+" ###############",
+
+"#  ####     ### ",
+" ##   ######    ",
+"  ##           #",
+"#   ##       ## ",
+"##    #######   ",
+"# ##            ",
+"##  ##        ##",
+"  ##  ########  ",
+"    ###       ##",
+"      ######### ",
+" #              ",
+"    #       #  #",
+"        #    ## ",
+"###       ###   ",
+"  #########     ",
+"################",
+
+" ###### #   #  #",
+"## ###  # #   ##",
+"#   #  ##   #  #",
+"   ## ##  #   ##",
+"  ## ##     #  #",
+"##  ###   #   ##",
+"   ###  #   #  #",
+" ####     #   ##",
+"# ###   #      #",
+" ##   #   #   ##",
+"##  #   #   #  #",
+"#         #   ##",
+"    #   #   #  #",
+"  #   #       ##",
+"#   #   #   #  #",
+"################",
+
+"################",
+"# #   #   #   # ",
+"#       #   #  #",
+"# #   #   #   # ",
+"#       #   #  #",
+"# # ############",
+"#   #           ",
+"# # #       ### ",
+"#####       ### ",
+"                ",
+"       ##  ## ##",
+"       ##  ## ##",
+"#####  ##  ## ##",
+"# # #           ",
+"#   #   ## ## ##",
+"# # #   ## ## ##",
+
+"#   ############",
+"#   # #   #   # ",
+"#   #   #   #   ",
+"#   # #   #   # ",
+"#   #   #   #   ",
+"#   # #   #   ##",
+"    #         # ",
+"    # #   #  #  ",
+"    #   #   # ##",
+"    # #    #####",
+" ## ##  #  #   #",
+" ## # #   ### ##",
+" ## #    ### ###",
+"    # #  ##  ###",
+" ## #   # # ## #",
+" ## ##  # # # # ",
+
+"################",
+"  #   ######### ",
+"#   ####  #   ##",
+"  ### ### ## ## ",
+"##  # #  # ###  ",
+" ### ######### #",
+" #  ## # #  # # ",
+"####  ## # #  # ",
+" #  # ######## #",
+"##  ##  ## # ## ",
+"  ## #   # #####",
+"###  #######  # ",
+"#  ### #    ####",
+" ###   # #    ##",
+" #  ### # ###   ",
+"#        #      ",
+
+"################",
+"  #   #   #   ##",
+"#   #       #  #",
+"###   #   #   ##",
+" #### # #   #  #",
+"# #  ##   #   ##",
+"#### ## #   #  #",
+"###    #  #   ##",
+"##### ###      #",
+"#  #### # #   ##",
+"## ##  ##   #  #",
+" #  ###  ##   ##",
+"####### ##  #  #",
+"   ##### ##   ##",
+"#  #####  # #  #",
+" # ##  #  #   ##",
+
+"#   #   ## ## ##",
+"# # #           ",
+"#   #           ",
+"# # #   ## ## ##",
+"#   #   ## ## ##",
+"# # #   ## ## ##",
+"#   #           ",
+"# # #  ## ##  ##",
+"#   #  ## ##  ##",
+"# # #  ## ##  ##",
+"#   #           ",
+"# # #       #   ",
+"#   #  ## ## # #",
+"# # #  ## ## # #",
+"#   #  ## ## # #",
+"# # #           ",
+
+" ## # ##  ### # ",
+"    ####  ### ##",
+"    ####  ## # #",
+" ##  # ## ## ## ",
+" ## ### # ##### ",
+" ## # #   ## ## ",
+"    # # # ## ## ",
+" ## # # # ##### ",
+" ## ###   ## ## ",
+" ## # # # ##### ",
+"    ### # ## ## ",
+"    # #   ##### ",
+"# # ### # ## ## ",
+"# #   ### ##### ",
+"# # ###   ##### ",
+"    # # # ## ## ",
+
+"################",
+"     #          ",
+"  #    ##    ## ",
+"################",
+"## # # # # # # #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # #       # # ",
+
+"### #### ## #  #",
+"  # #   # #   ##",
+" ##  ## ###    #",
+"#  # # ## #   ##",
+"#  # ## # # #  #",
+"## # ## # #   ##",
+"#  # ## # # #  #",
+"#  # #### #   ##",
+"## # #  # # #  #",
+"#  # #### #   ##",
+"#  # #  # # #  #",
+"#  # # ## #   ##",
+"#  # # ## # #  #",
+"## # ## # #   ##",
+"#  # # ## # #  #",
+"# ## #### #    #",
+
+"#   #  ## ## ## ",
+"#   #  ## ## ## ",
+"#   #  ## ## ## ",
+"# # #           ",
+"#   #           ",
+"# # #   ## ## ##",
+"#   #   ## ## ##",
+"# # #   ## ## ##",
+"#   #           ",
+"# # #  ## ## ###",
+"#   #  ## ## ## ",
+"# # #  ## ## ## ",
+"#   #           ",
+"# # #           ",
+"#   #  ##  ## ##",
+"# # #  ##  ## ##",
+
+"##  # # # ## ## ",
+"##  # #   ##### ",
+"##  # # # ## ## ",
+"   ## # # ## ## ",
+"    # #   ## ## ",
+" ## # # # ##### ",
+" ## ##### ## ## ",
+" ##   ##  ## ## ",
+"    ### # ## ## ",
+" ## # # # ##### ",
+" ## # #   ## # #",
+" ## # # # ##  ##",
+"    # # # ### ##",
+"    # #   ### # ",
+" ## # #   ######",
+" ## # #  # # ## ",
+
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"## # # # # # # #",
+"################",
+"                ",
+"################",
+" #    ##        ",
+"  ## # # # # ###",
+
+"#  # ## # # #  #",
+"#  # #  # #   ##",
+"#  # # ## # #  #",
+"#  # ## # #   ##",
+"#  # #### # #  #",
+"#  # #### #   ##",
+"#  # ## # # #  #",
+"#  # ## # #   ##",
+"#  # # #### #  #",
+"#  # ## # #   ##",
+"# #  #### # #  #",
+"# # #  ## #   ##",
+"# # #   # # #  #",
+"### # ## ##   ##",
+"## #  ## #  #  #",
+" # ## #  #    ##",
+
+"#####  ##  ## ##",
+"                ",
+"        ## ## ##",
+"        ## ## ##",
+"#####   ## ## ##",
+"# #  #          ",
+"#   # #    #    ",
+"# #   ##        ",
+"#   #   #####   ",
+"# #   #   # #  #",
+"#   #########  #",
+"# # ##  ## ##  #",
+"#  # ### ## #   ",
+"# ###########   ",
+"#  ##  ##  ##   ",
+"#############   ",
+
+" ## # # #  # ###",
+"    # ##    # ##",
+" ## # ## #   #  ",
+" ## # ##     ###",
+" ## #  #  #   ##",
+"    #   #      #",
+" #  #   #   #   ",
+"    # #  #      ",
+" ####    # ## # ",
+"##   ##  ####   ",
+"## #  ###  ##   ",
+"##        # ##  ",
+" # # #####    ##",
+" #    #   #     ",
+" # #    #   #   ",
+" ###############",
+
+"#  ####     ####",
+" ### ######## ##",
+" ###  # ##     #",
+"### ####  ##### ",
+"##   ########   ",
+"# ## # # #  # ##",
+"##  ##  ## #  ##",
+"  ##  ######## #",
+"    ###  #    ##",
+"      ######### ",
+" #              ",
+"    #       #  #",
+"        #    ## ",
+"###       ###   ",
+"  #########     ",
+"################",
+
+" ###### #   #  #",
+"## ###  # #   ##",
+"# # #  ##   #  #",
+"## ## ##  #   ##",
+"# ## ##     #  #",
+"### ###   #   ##",
+"   ###  #      #",
+" ####     #   ##",
+"# ###   #   #  #",
+" ##   #   #   ##",
+"##  #   #   #  #",
+"#         #   ##",
+"    #   #   #  #",
+"  #   #       ##",
+"#   #   #   #  #",
+"################",
+
+"                ",
+"                ",
+"                ",
+" # # #          ",
+"#      #########",
+"  # # ##        ",
+"#    # #########",
+"  # ####        ",
+"#  ### #########",
+"  ## ###        ",
+"#  ### ## ######",
+"  ## ###        ",
+"#  ### #### ####",
+"  ## ###     ## ",
+"#  ### ######## ",
+"  ## ###    #   ",
+
+"            ####",
+"          ######",
+"        ### #   ",
+"      ### #   # ",
+"#########   #   ",
+"      #       # ",
+"####### #   #   ",
+"     ##   #     ",
+"######  #   #   ",
+"    ###   #   # ",
+"######      #   ",
+"## # ##   #   # ",
+"# # ##  #       ",
+"      #   #   # ",
+"# # # # #   #   ",
+"       #      # ",
+
+"##              ",
+"####            ",
+"# ####        ##",
+"  # ###      ## ",
+"#   ##########  ",
+"      ##    # # ",
+"#   # ## ####   ",
+"  #   ###  #    ",
+"#   #  ## ###   ",
+"      ### ##  # ",
+"#   #  ######   ",
+"  #   #### #    ",
+"#   #  ## ###   ",
+"      ###   # # ",
+"#   # ### # #   ",
+"  #   #      ## ",
+
+"  #######       ",
+"###########     ",
+"#   #   ####    ",
+"  #   #   ###   ",
+"#   #   #  ##   ",
+"  #       # ## #",
+"#   #   #   ##  ",
+"      #      ###",
+"#   #   #   ### ",
+"  #   #   #  # #",
+"#       #   ### ",
+"  #   #   #  # #",
+"#   #       ### ",
+"      #   #  ###",
+"#   #   #   ##  ",
+"  #       # # ##",
+
+"#  ### ######   ",
+"  ## ###   # #  ",
+"#  ### ## ##    ",
+"   # ###   #    ",
+"#  ### #####    ",
+" # # ###   #    ",
+"#  ### #####    ",
+" # # ###    # # ",
+"#  ### # ####   ",
+" # # ###     #  ",
+"#  ### ######## ",
+" ### ###      ##",
+"#  ### ##### ###",
+" # # ###        ",
+"#  ### ####### #",
+" ### ###       #",
+
+"  #    ##   #   ",
+"        ###   # ",
+"          ###   ",
+"    #       ####",
+"             ###",
+"        #  ## # ",
+"              ##",
+"             #  ",
+"             ###",
+"            #   ",
+"           #####",
+"   #     ###    ",
+"##      ###### #",
+"  ######        ",
+"######### ######",
+"                ",
+
+"    ### #    ## ",
+"  # ##        ##",
+"# ###           ",
+"##        #     ",
+"##              ",
+" #            # ",
+"##              ",
+"  # #           ",
+"###             ",
+"   #            ",
+" ####           ",
+"    ##   #     #",
+"########      ##",
+"        ######  ",
+"## #### ########",
+" #              ",
+
+"#   #   #  ##   ",
+"  #   #   ##  ##",
+"##  #   ### #   ",
+"  ######  #    #",
+"   ######## #   ",
+" ## #     #    #",
+"    #### ## # # ",
+"   #      #    #",
+"   ########   # ",
+"  #       #   ##",
+" #### ##### #   ",
+"##        #    #",
+"######## ## #   ",
+"          #    #",
+"##### #####   # ",
+"          #    #",
+
+"#  ### #########",
+" ### ##       ##",
+"#  ###  # #  # #",
+" ####       # ##",
+"#  ########### #",
+" ##   #   # # ##",
+"# # #   #   ## #",
+" #        # # ##",
+"# #     #   ## #",
+" #        # # ##",
+"# #         ## #",
+" #        # # ##",
+"# #         ## #",
+" #        # # ##",
+"# #         ## #",
+" #        # # ##",
+
+"                ",
+"                ",
+"   ###     ###  ",
+"  #   ## ##   # ",
+" ###    #     # ",
+"  #    # #   ## ",
+"   #  #   #  ## ",
+"   # #  #  # #  ",
+"    #  ###  #   ",
+"   # #  #  # #  ",
+"   #  #   #  #  ",
+"  #    # #    # ",
+"  #     #     # ",
+"  #   ## ##   # ",
+"   ###     ###  ",
+"                ",
+
+" ###############",
+" #              ",
+" ###############",
+" #              ",
+" #              ",
+" #           #  ",
+" #        # #   ",
+" #       ###    ",
+" #      # #     ",
+" #     #        ",
+" #              ",
+" #          ####",
+" #          #   ",
+" #          ####",
+" #          # # ",
+" #          #   ",
+
+"###########     ",
+"         ##    #",
+"######  #       ",
+"     # #  #    #",
+"     ## #       ",
+"     ##   #    #",
+"     #  #     # ",
+"     ##        #",
+"     #          ",
+"     ##        #",
+"     #          ",
+"#######        #",
+"#   #         ##",
+"####           #",
+"  ##############",
+"               #",
+
+"# #         ## #",
+" # #      # # ##",
+"#           ## #",
+" # #      # # ##",
+"#            # #",
+" # #      #  # #",
+"# # #        ## ",
+" # #         ###",
+"# #    #########",
+" #    #   #    #",
+"# #  #  #  # ## ",
+"    ##########  ",
+"#  #        #   ",
+" #   #         #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"                ",
+"################",
+"################",
+"                ",
+"                ",
+"################",
+" # ## # # # # # ",
+"################",
+"                ",
+"                ",
+"                ",
+"                ",
+"# #             ",
+" # # # #   # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+" #          #   ",
+"##          #   ",
+"#           # ##",
+"            # ##",
+"            # ##",
+"#############   ",
+"#  # # # ####   ",
+"  #########     ",
+"# #       #     ",
+" # # # # ##     ",
+"  # # # # ######",
+"                ",
+"                ",
+"   #   # #     #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"               #",
+"               #",
+" ##            #",
+" ##        #####",
+" ##     ####   #",
+"        ####   #",
+"           #   #",
+" ## ##  ####   #",
+" ## ##  ####   #",
+" ## ##     #   #",
+"############   #",
+" # #           #",
+"# # # #   #    #",
+"     # # # # # #",
+"# # # # # # #  #",
+" # # # # # # # #",
+
+"     ######     ",
+"   ##      ##   ",
+"  #          #  ",
+" #          # # ",
+" #     #   #  # ",
+"#  #   ## #    #",
+"#   #  ###     #",
+"#    # ## #    #",
+"#     ###  #   #",
+"#     ###   #  #",
+"#    #  #      #",
+" #  #         # ",
+" # #          # ",
+"  #          #  ",
+"   ##      ##   ",
+"     ######     ",
+
+"### # # # # ####",
+"## #   # # #####",
+"# # # # # ######",
+"## # # # #######",
+"#   # # ########",
+"## # # #########",
+"# # # ##########",
+"## # ###########",
+"# # ############",
+"## #############",
+"# ##############",
+"################",
+"################",
+"################",
+"################",
+"################",
+
+"################",
+"################",
+"################",
+"################",
+"############### ",
+"##############  ",
+"############# # ",
+"############ #  ",
+"########### # # ",
+"########## # #  ",
+"######### # # # ",
+"######## #   #  ",
+"####### # # # # ",
+"###### # # # # #",
+"##### #   # # ##",
+"#### # # # # ###",
+
+"##          ####",
+"# #   #   ######",
+"          ######",
+"#   #   ### # # ",
+"        ## # # #",
+"  #   ### # # # ",
+"      ## # # # #",
+"#   ### #     # ",
+"    ## # # # # #",
+"  ### # # # # # ",
+"  ## # # # # # #",
+"### # # # # # # ",
+"####  ######  ##",
+"###  ######  ###",
+"################",
+"################",
+
+"################",
+"################",
+"################",
+"############### ",
+"##############  ",
+"############# # ",
+"############    ",
+"########### #   ",
+"##########      ",
+"######### #   # ",
+"########        ",
+"####### #   #   ",
+"######          ",
+"##### #   #   ##",
+"####          ##",
+"### #   #   ####",
+
+"################",
+"                ",
+"                ",
+"           ###  ",
+"          ###   ",
+"       # #      ",
+"      # #       ",
+"     # # #      ",
+"    # #   #     ",
+"   # ##         ",
+"     ##         ",
+"     #          ",
+"################",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"################",
+"                ",
+"                ",
+"                ",
+"                ",
+"       #        ",
+"    #######     ",
+"   # ##### #    ",
+"  # #  #  # #   ",
+" # #   #   #    ",
+"                ",
+"                ",
+"################",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"################",
+"                ",
+"                ",
+" ###            ",
+"#####           ",
+"   ### #        ",
+"    ###         ",
+"     ###        ",
+"    # ###       ",
+"   #   ###      ",
+"        ##      ",
+"        ##      ",
+"################",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"# ### ##########",
+"   # #          ",
+"    # #         ",
+"     ##         ",
+"     ##         ",
+"   #####        ",
+"     ##         ",
+"     ##         ",
+"    ###         ",
+"   # #          ",
+"    #           ",
+"   #            ",
+"################",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"######## # #####",
+"        ##      ",
+"    #   #       ",
+"     # #        ",
+"      #         ",
+"     # #        ",
+"    # #         ",
+" ### #          ",
+"### #           ",
+"#  #            ",
+"                ",
+"                ",
+"################",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"################",
+"                ",
+"  #    #    #   ",
+" # #   #   #    ",
+"  # #######     ",
+"   #######      ",
+"      #         ",
+"     #          ",
+"    #           ",
+"   #            ",
+"                ",
+"                ",
+"################",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"## ## ##########",
+"   ##           ",
+"   ##           ",
+"   # #   #      ",
+"    # # #       ",
+"     # #        ",
+"      # #       ",
+"     # # #      ",
+"    #   # ###   ",
+"   #     ###    ",
+"                ",
+"                ",
+"################",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"################",
+"         #      ",
+"        #       ",
+"       ##       ",
+"       ##       ",
+"       ####     ",
+"      ###       ",
+"     # ##       ",
+"    #  ##       ",
+"   #   # #      ",
+"        # #     ",
+"         #      ",
+"################",
+" # # # # # # # #",
+"# # # # # # # # ",
+" # # # # # # # #",
+
+"################",
+"#              #",
+"#              #",
+"#     ##       #",
+"#       ##     #",
+"#      # #     #",
+"#       ##     #",
+"#      #   #   #",
+"#          #   #",
+"#   ##    #    #",
+"#   ## #       #",
+"#              #",
+"#              #",
+"#              #",
+"#              #",
+"################",
+
+"################",
+"#              #",
+"#              #",
+"#     ## #     #",
+"#    #    #    #",
+"#     # #      #",
+"#       ###    #",
+"#        #     #",
+"#     #    #   #",
+"#   ##    #    #",
+"#   ##         #",
+"#              #",
+"#              #",
+"#              #",
+"#              #",
+"################",
+
+"################",
+"#              #",
+"#              #",
+"#     # #      #",
+"#       #      #",
+"#       # #    #",
+"#    #   ##    #",
+"#      #   #   #",
+"#     #  #     #",
+"#   ##    #    #",
+"#   ##         #",
+"#              #",
+"#              #",
+"#              #",
+"#              #",
+"################",
+
+"################",
+"#              #",
+"#              #",
+"#      #       #",
+"#    #  #      #",
+"#       #      #",
+"#       # #    #",
+"#   #  #   #   #",
+"#     #    #   #",
+"#   #   #      #",
+"#   ##         #",
+"#              #",
+"#              #",
+"#              #",
+"#              #",
+"################",
+
+"################",
+"#              #",
+"#              #",
+"#              #",
+"#      ##  #   #",
+"      #  ##     ",
+"#    ##  #     #",
+"#   #  ##      #",
+"#  #           #",
+"# #            #",
+"#              #",
+"#              #",
+"#              #",
+"#              #",
+"#              #",
+"################",
+
+"################",
+"#              #",
+"#              #",
+"#              #",
+"#       ##     #",
+"      ##  ##   #",
+"#    ###  #    #",
+"#   ##  ##     #",
+"#  #           #",
+"# #            #",
+"#              #",
+"#              #",
+"#              #",
+"#              #",
+"#              #",
+"################",
+
+"################",
+"#              #",
+"#              #",
+"#              #",
+"#        ##    #",
+"      ###  #   #",
+"#    # ## #    #",
+"#   ###  #     #",
+"#  #           #",
+"# #            #",
+"#              #",
+"#              #",
+"#              #",
+"#              #",
+"#              #",
+"################",
+
+"################",
+"#              #",
+"#              #",
+"#              #",
+"#      #  ##   #",
+"      # ###     ",
+"#    #  ##     #",
+"#   # ##       #",
+"#  #           #",
+"# #            #",
+"#              #",
+"#              #",
+"#              #",
+"#              #",
+"#              #",
+"################",
+
+"################",
+"#              #",
+"#              #",
+"#              #",
+"#     ##       #",
+"#    #  ##     #",
+"#   #          #",
+"#  #           #",
+"#       #  #   #",
+"#      ####    #",
+"#     #        #",
+"#    #         #",
+"#              #",
+"#              #",
+"#              #",
+"################",
+
+"################",
+"#              #",
+"#              #",
+"#              #",
+"#      ##      #",
+"#    ##  #     #",
+"#   #          #",
+"#  #           #",
+"#       ##     #",
+"#      ## ##   #",
+"#     #        #",
+"#    #         #",
+"#              #",
+"#              #",
+"#              #",
+"################",
+
+"################",
+"#              #",
+"#              #",
+"#              #",
+"#       ##     #",
+"#    ###       #",
+"#   #          #",
+"#  #           #",
+"#       ###    #",
+"#      ##  #   #",
+"#     #        #",
+"#    #         #",
+"#              #",
+"#              #",
+"#              #",
+"################",
+
+"################",
+"#              #",
+"#              #",
+"#              #",
+"#     #  #     #",
+"#    # ##      #",
+"#   #          #",
+"#  #           #",
+"#       # ##   #",
+"#      ###     #",
+"#     #        #",
+"#    #         #",
+"#              #",
+"#              #",
+"#              #",
+"################",
+
+"################",
+"#               ",
+"#          ###  ",
+"#           #   ",
+"#    ###   ###  ",
+"#   #####       ",
+"#     #         ",
+"#    ##         ",
+"#   # #         ",
+"#  # #      #   ",
+"#   #      #    ",
+"#  #            ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+
+"################",
+"#               ",
+"#          ###  ",
+"#           #   ",
+"#    ##    ###  ",
+"#   ##          ",
+"#  ####         ",
+"#  ####         ",
+"#  ## #      #  ",
+"#  # #      #   ",
+"#   #      #    ",
+"#  #            ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+
+"################",
+"#               ",
+"#          ###  ",
+"#           #   ",
+"#          ###  ",
+"#   #           ",
+"#  ## #         ",
+"#  ####         ",
+"#  ## #      #  ",
+"#  ###      #   ",
+"#   #      #    ",
+"#  #            ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+
+"################",
+"#               ",
+"#          ###  ",
+"#           #   ",
+"#          ###  ",
+"#               ",
+"#     #         ",
+"#  ####       # ",
+"#  ####      #  ",
+"#  ###      #   ",
+"#   ###    #    ",
+"#  #            ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+
+"################",
+"#               ",
+"#          ###  ",
+"#           #   ",
+"#          ###  ",
+"#               ",
+"#     #         ",
+"#    ##       # ",
+"#   # #      #  ",
+"#  ######   #   ",
+"#   ####   #    ",
+"#  #            ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+
+"################",
+"#               ",
+"#          ###  ",
+"#           #   ",
+"#          ###  ",
+"#               ",
+"#     #         ",
+"#    ##  #      ",
+"#   # ####   #  ",
+"#  # # ##   #   ",
+"#   # ##   #    ",
+"#  #            ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+
+"################",
+"#               ",
+"#          ###  ",
+"#           #   ",
+"#          ###  ",
+"#       #       ",
+"#     # ##      ",
+"#    #####      ",
+"#   # # ##   #  ",
+"#  # #  #   #   ",
+"#   #      #    ",
+"#  #            ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+
+"################",
+"#               ",
+"#          ###  ",
+"#           #   ",
+"#     ##   ###  ",
+"#      ##       ",
+"#     ####      ",
+"#    ##  #      ",
+"#   # #         ",
+"#  # #      #   ",
+"#   #      #    ",
+"#  #            ",
+"#               ",
+"#               ",
+"#               ",
+"#               ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"       #        ",
+"      ###       ",
+"     #####      ",
+"      ###       ",
+"       #        ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"                ",
+"      #         ",
+"       #        ",
+"    # ### #     ",
+"     ## ##      ",
+"    ## # ##     ",
+"    # ## #      ",
+"    ### ##      ",
+"      ###       ",
+"     # #        ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"         #      ",
+"                ",
+"    #   #   #   ",
+"#      ##  #    ",
+" ## ##  ###     ",
+"   #  ##  #     ",
+"   ###  ##  #   ",
+" # ### # #      ",
+"   ## #  # #    ",
+"    #  #   #    ",
+"  #  ##  ###    ",
+" #    #### #    ",
+"     #      #   ",
+"     #       #  ",
+"         #      ",
+"    #           ",
+
+" #    #      #  ",
+"         #      ",
+"   # ## ## #    ",
+"    #  #    #   ",
+"  #  # #  #     ",
+" # # #### ####  ",
+" ### #     # #  ",
+"  #      # #    ",
+"  ##   # # ##   ",
+"   # ##      #  ",
+" # # ##  #  #   ",
+"   ## #######   ",
+"   #   #   ##   ",
+"      #         ",
+"         ##     ",
+"  #             ",
+
+"      # #  # #  ",
+"   ###  # #  ## ",
+"# #   #   ##  ##",
+"  ##   #  # #   ",
+"   ###    # #  #",
+"# # ### #  ###  ",
+"   #      ### ##",
+" #  ## #    #  #",
+"  #      #     #",
+"#  #  #   ##### ",
+"   ## # ##  #  #",
+"# # ##   ###    ",
+"#  # #  ###  #  ",
+" #    #       # ",
+"# # #  # # # #  ",
+"   # ## ## #    ",
+
+"       #        ",
+"      #  #  #   ",
+"  # #   # #  #  ",
+"   # # # ##  #  ",
+"            # # ",
+"  #  #    #     ",
+"   #  #   # #   ",
+"#               ",
+"  #         # # ",
+" # #   ##    #  ",
+"  # #      #    ",
+"         #      ",
+"   # #     # #  ",
+"    #  # #      ",
+"                ",
+"                ",
+
+"   #   #        ",
+"# # ##     #  # ",
+" ##   ##  #     ",
+" #  ##    ## # #",
+"#  #   # #     #",
+" #  #       #  #",
+"       # ##    #",
+" #   #  #   ##  ",
+" # # ##        #",
+" # # #   # # #  ",
+"  ##  ##  #     ",
+"    #  #     #  ",
+" #   # #   #   #",
+"##  #  ##   #   ",
+"   #  #  ###    ",
+"     #   #   #  ",
+
+"   #   #        ",
+"# # ##     #  # ",
+" ###  # # ##    ",
+" #  ##     # # #",
+"#  ##### # #   #",
+" #  #   ## ##  #",
+"       # ###   #",
+" ##  # #    ##  ",
+" # # ##  # #   #",
+" # ###   # # #  ",
+"  ##  ## ##     ",
+"    #  #        ",
+" #   # #  #    #",
+"## ## ###   #  #",
+"  ## ##  ###    ",
+"     #   #   #  ",
+
+"################",
+"## # #         #",
+"# # ##         #",
+"#  # #       # #",
+"# # ##         #",
+"## # #         #",
+"# # ##       # #",
+"#  # #         #",
+"# # ##         #",
+"## # #       # #",
+"# # ##         #",
+"#  # #         #",
+"# # ##       # #",
+"## # #         #",
+"# # ##         #",
+"################",
+
+"################",
+"## # #         #",
+"# # ##         #",
+"#  # #     #   #",
+"# # ##         #",
+"## # #         #",
+"# # ##     #   #",
+"#  # #         #",
+"# # ##         #",
+"## # #     #   #",
+"# # ##         #",
+"#  # #         #",
+"# # ##     #   #",
+"## # #         #",
+"# # ##         #",
+"################",
+
+"################",
+"## # #         #",
+"# # ##         #",
+"#  # #   #     #",
+"# # ##         #",
+"## # #         #",
+"# # ##   #     #",
+"#  # #         #",
+"# # ##         #",
+"## # #   #     #",
+"# # ##         #",
+"#  # #         #",
+"# # ##   #     #",
+"## # #         #",
+"# # ##         #",
+"################",
+
+"################",
+"## # #         #",
+"# # ##         #",
+"#  # # #       #",
+"# # ##         #",
+"## # #         #",
+"# # ## #       #",
+"#  # #         #",
+"# # ##         #",
+"## # # #       #",
+"# # ##         #",
+"#  # #         #",
+"# # ## #       #",
+"## # #         #",
+"# # ##         #",
+"################",
+
+"#  # # #  # #  #",
+"#  ## #   # #  #",
+"#  # #    # #  #",
+"#####     # #  #",
+"#  #      # #  #",
+"#  #   #  # #  #",
+"#  #  ##  # #  #",
+"#  # # #  # #   ",
+"##### ##  # #   ",
+"#  ### #  # #   ",
+"#  ## ##  # ####",
+"#  ### #  #     ",
+"#  ## #   ######",
+"#  ###   # # # #",
+"#####   # # # # ",
+"#  #   #########",
+
+"#  # # #  # #  #",
+"#  ## #   # #  #",
+"#  # #    # #  #",
+"#####     # #  #",
+"#  #      # #  #",
+"#  #   #  # #  #",
+"#  #  ##  # #  #",
+"#  # # #  # #   ",
+"########  # #   ",
+"#  # # #  # #   ",
+"#  # ###  # ####",
+"#  # # #  #     ",
+"#  # ##   ######",
+"#  # #   # # # #",
+"#####   # # # # ",
+"#  #   #########",
+
+"#  # # #  # #  #",
+"#  ## #   # #  #",
+"#  # #    # #  #",
+"#####     # #  #",
+"#  #      # #  #",
+"#  #   #  # #  #",
+"#  #  ##  # #  #",
+"#  # ###  # #   ",
+"##### ##  # #   ",
+"#  #  ##  # #   ",
+"#  #  ##  # ####",
+"#  #  ##  #     ",
+"#  #  #   ######",
+"#  # #   # # # #",
+"#####   # # # # ",
+"#  #   #########",
+
+"#  # # #  # #  #",
+"#  ## #   # #  #",
+"#  # #    # #  #",
+"#####     # #  #",
+"#  #      # #  #",
+"#  #   #  # #  #",
+"#  #  ##  # #  #",
+"#  # # #  # #   ",
+"#####  #  # #   ",
+"#  #  ##  # #   ",
+"#  #  ##  # ####",
+"#  #  ##  #     ",
+"#  #  #   ######",
+"#  # #   # # # #",
+"#####   # # # # ",
+"#  #   #########",
+
+"#  # # #  # #  #",
+"#  ## #   # #  #",
+"#  # #    # #  #",
+"#####     # #  #",
+"#  #      # #  #",
+"#  #   #  # #  #",
+"#  #  ##  # #  #",
+"#  # # #  # #   ",
+"#####  #  # #   ",
+"#  #####  # #   ",
+"#  #####  # ####",
+"#  #####  #     ",
+"#  #  #   ######",
+"#  # #   # # # #",
+"#####   # # # # ",
+"#  #   #########",
+
+"#  # # #  # #  #",
+"#  ## #   # #  #",
+"#  # #    # #  #",
+"#####     # #  #",
+"#  #      # #  #",
+"#  #   #  # #  #",
+"#  #  ##  # #  #",
+"#  # # #  # #   ",
+"#####  #  # #   ",
+"########  # #   ",
+"########  # ####",
+"########  #     ",
+"#  #  #   ######",
+"#  # #   # # # #",
+"#####   # # # # ",
+"#  #   #########",
+
+"#  # # #  # #  #",
+"#  ## #   # #  #",
+"#  # #    # #  #",
+"#####     # #  #",
+"#  #      # #  #",
+"#  #   #  # #  #",
+"#  #  ##  # #  #",
+"#  # # #  # #   ",
+"#####  #  # #   ",
+"###### #  # #   ",
+"###### #  # ####",
+"###### #  #     ",
+"#  #  #   ######",
+"#  # #   # # # #",
+"#####   # # # # ",
+"#  #   #########",
+
+"#  # # #  # #  #",
+"#  ## #   # #  #",
+"#  # #    # #  #",
+"#####     # #  #",
+"#  #      # #  #",
+"#  #   #  # #  #",
+"#  #  ##  # #  #",
+"#  # # #  # #   ",
+"#####  #  # #   ",
+"####   #  # #   ",
+"####   #  # ####",
+"####   #  #     ",
+"#  #  #   ######",
+"#  # #   # # # #",
+"#####   # # # # ",
+"#  #   #########",
+
+"#  # # #  # #  #",
+"#  ## #   # #  #",
+"#  # #    # #  #",
+"#####     # #  #",
+"#  #      # #  #",
+"#  #   #  # #  #",
+"#  #  ##  # #  #",
+"#  # ###  # #   ",
+"##### ##  # #   ",
+"#  #  ##  # #   ",
+"#  #  ##  # ####",
+"#  #  ##  #     ",
+"#  #  #   ######",
+"#  # #   # # # #",
+"#####   # # # # ",
+"#  #   #########",
+
+"#  # # #  # #  #",
+"#  ## #   # #  #",
+"#  # #    # #  #",
+"#####     # #  #",
+"#  #      # #  #",
+"#  #   #  # #  #",
+"#  #  ##  # #  #",
+"#  # # #  # #   ",
+"########  # #   ",
+"#  # # #  # #   ",
+"#  # ###  # ####",
+"#  # # #  #     ",
+"#  # ##   ######",
+"#  # #   # # # #",
+"#####   # # # # ",
+"#  #   #########",
+
+"#  # # #  # #  #",
+"#  ## #   # #  #",
+"#  # #    # #  #",
+"#####     # #  #",
+"#  #      # #  #",
+"#  #   #  # #  #",
+"#  #  ##  # #  #",
+"#  # # #  # #   ",
+"##### ##  # #   ",
+"#  ### #  # #   ",
+"#  ## ##  # ####",
+"#  ### #  #     ",
+"#  ## #   ######",
+"#  ###   # # # #",
+"#####   # # # # ",
+"#  #   #########",
+
+"#  # # #  # #  #",
+"#  ## #   # #  #",
+"#  # #    # #  #",
+"#####     # #  #",
+"#  #      # #  #",
+"#  #   #  # #  #",
+"#  #  ##  # #  #",
+"#  # # #  # #   ",
+"##### ##  # #   ",
+"#  # # #  # #   ",
+"#  ## ##  # ####",
+"#  # # #  #     ",
+"#  ## #   ######",
+"#  ###   # # # #",
+"#####   # # # # ",
+"#  #   #########",
+
+"################",
+"               #",
+"               #",
+"############## #",
+"             ###",
+"             # #",
+"            ## #",
+"           # ###",
+"         #  ## #",
+"        #  # ###",
+"        # #  # #",
+"      # ## # # #",
+"       #     # #",
+"     #       ###",
+"   #        ####",
+"  ###        # #",
+
+"################",
+"               #",
+"               #",
+"############## #",
+"             # #",
+"             ###",
+"             # #",
+"            ## #",
+"          #### #",
+"            ####",
+"        # #  # #",
+"       #  # ## #",
+"       # #   # #",
+"    ##       # #",
+"   #   #     ###",
+"  ###        # #",
+
+"################",
+"               #",
+"               #",
+"############## #",
+"           # # #",
+"             ###",
+"          #  # #",
+"          ## ###",
+"          #  # #",
+"         ## ## #",
+"      # # #  # #",
+"         ##  # #",
+"      ###    # #",
+"     ##      # #",
+"   #         # #",
+"  ###        # #",
+
+"################",
+"               #",
+"               #",
+"############## #",
+"             ###",
+"            ####",
+"           # # #",
+"             ###",
+"          # ## #",
+"             # #",
+"        ## # # #",
+"       #   # ###",
+"      # # #  # #",
+"     # #   # # #",
+"   #         # #",
+"  ###        ###",
+
+" ###      #### #",
+"###          # #",
+"##       # # ###",
+"#        #  ## #",
+"        #  # # #",
+"      ####   # #",
+"      # #    # #",
+"    ##       # #",
+"   #         # #",
+"  ###        # #",
+" ###         # #",
+"###          # #",
+"##           # #",
+"#            # #",
+"             # #",
+"             # #",
+
+" ###       # ###",
+"###       #  # #",
+"##      ##  ####",
+"#         ## # #",
+"      # # #  # #",
+"       # #   # #",
+"     ##      # #",
+"             # #",
+"   # #       # #",
+"  ###        # #",
+" ###         # #",
+"###          # #",
+"##           # #",
+"#            # #",
+"             # #",
+"             # #",
+
+" ###         ###",
+"###          # #",
+"##         #  ##",
+"#         #  # #",
+"         # # # #",
+"      # #  ### #",
+"      #  #   # #",
+"      ##     # #",
+"   # #       # #",
+"  ###        # #",
+" ###         # #",
+"###          # #",
+"##           # #",
+"#            # #",
+"             # #",
+"             # #",
+
+" ###        ####",
+"###       # ## #",
+"##       ##  ###",
+"#        ##  # #",
+"        #  # # #",
+"      #  #   # #",
+"       #     # #",
+"     #       # #",
+"   ###       # #",
+"  ###        # #",
+" ###         # #",
+"###          # #",
+"##           # #",
+"#            # #",
+"             # #",
+"             # #",
+
+"################",
+"                ",
+"              ##",
+"            #   ",
+"          #   # ",
+"           ### #",
+"        #   #   ",
+"         #  #   ",
+"      ##     ###",
+"      #  ##   # ",
+"    # # #   # ##",
+"   ##  #   #    ",
+"  #       # #   ",
+" ###     ###    ",
+"###     ###     ",
+"##     ###     #",
+
+"################",
+"               #",
+"             #  ",
+"          # #  #",
+"            ### ",
+"         ##     ",
+"          # #   ",
+"        #   #   ",
+"      ##     ###",
+"      #  #      ",
+"    ##        ##",
+"   # # #    #   ",
+"  #       #     ",
+" ###     ###    ",
+"###     ###     ",
+"##     ###     #",
+
+"################",
+"               #",
+"             ###",
+"          #  # #",
+"           #### ",
+"         ##     ",
+"         ## # ##",
+"        #      #",
+"      ##     #  ",
+"       # #   # #",
+"    ###      # #",
+"     ###    ##  ",
+"  # #     # #   ",
+" ###     ###    ",
+"###     ###     ",
+"##     ###     #",
+
+"################",
+"              ##",
+"                ",
+"          ##  ##",
+"             #  ",
+"         # #    ",
+"        ## ## ##",
+"          #     ",
+"      ####   #  ",
+"     ##  #   ###",
+"    # #     # ##",
+"   #  #     #   ",
+"  # ##    ###   ",
+" ###     ###    ",
+"###     ###     ",
+"##     ###     #",
+
+"##############  ",
+"     #  # #  ###",
+"   #   ###   # #",
+"    # #    # ###",
+" #    ## #  ## #",
+"   # ###   # # #",
+"# #      # # # #",
+"     #  # ## # #",
+" #   # # #   # #",
+"#  #   #     # #",
+"     ## #    # #",
+"   ###       # #",
+"  #          # #",
+" ###         # #",
+"###          # #",
+"##           # #",
+
+"##############  ",
+"#   #   # #  ###",
+"     # ##   ## #",
+" #    # #    # #",
+"#   # ####  ## #",
+"   # #   ## ## #",
+"# #   #  ### # #",
+"# #   #      # #",
+" #  #   ##   # #",
+"#     ## #   # #",
+"    ###      # #",
+"   #         # #",
+"  # #        # #",
+" ###         # #",
+"###          # #",
+"##           # #",
+
+"######### ####  ",
+"#   #      # ###",
+"###  ####   ## #",
+" # # # ##  # # #",
+"#   # ####  ## #",
+"   # #  ##  ## #",
+"#     ##  ## # #",
+"# #   ##     # #",
+"#   ##   #   # #",
+"#   # #  #   # #",
+"    #        # #",
+"   ###       # #",
+"  # #        # #",
+" ###         # #",
+"###          # #",
+"##           # #",
+
+"##############  ",
+"  # #  ###   ###",
+" #### ###   ## #",
+" ##  #  #    # #",
+"    # #### ### #",
+"#  # #      ## #",
+"# #     # ## # #",
+"    # ##     # #",
+"#    ##  #   # #",
+" #   #   #   # #",
+"   ##        # #",
+"   # #       # #",
+"  # #        # #",
+" ###         # #",
+"###          # #",
+"##           # #",
+
+"################",
+"         #  # # ",
+"################",
+"            #   ",
+"       # ##   ##",
+"    #  ##     ##",
+"       # #     #",
+" #  #         # ",
+"   #   #    # # ",
+"#         #     ",
+"##       ###    ",
+"#       ###     ",
+"       ###      ",
+"      ###       ",
+"     ###        ",
+"    ###        #",
+
+"################",
+"            ### ",
+"################",
+"         #      ",
+"      ##  # #  #",
+"      #  #    ##",
+"    #  # #     #",
+" #   #  #   ##  ",
+"   #            ",
+"# #       ###   ",
+"##       ###    ",
+"#       ###     ",
+"       ###      ",
+"      ###       ",
+"     ###        ",
+"    ###        #",
+
+"############ ###",
+"         # ## # ",
+"################",
+"         ##     ",
+"     ####   #   ",
+"       #   #  ##",
+"  #### # #     #",
+"   # #  #   ## #",
+"                ",
+"# #       ###   ",
+"##       ###    ",
+"#       ###     ",
+"       ###      ",
+"      ###       ",
+"     ###        ",
+"    ###        #",
+
+"############ ###",
+"         #  # # ",
+"################",
+"        #       ",
+"     #      #   ",
+"     #     #  ##",
+"   ### # #     #",
+"  ##    #   ## #",
+"   #            ",
+"#         ###   ",
+"##       ###    ",
+"#       ###     ",
+"       ###      ",
+"      ###       ",
+"     ###        ",
+"    ###        #",
+
+"################",
+"    #  #       #",
+"#######        #",
+"     ##        #",
+"##    ######## #",
+"   #  #      # #",
+"#     #      # #",
+"      #      # #",
+"      # #   ## #",
+"      #      # #",
+"      #      # #",
+"      #      # #",
+"      # #   ## #",
+"      #      # #",
+"      #      # #",
+" # #  #      # #",
+
+"################",
+"   ### #       #",
+"### ###        #",
+"###  ##        #",
+"#   # ######## #",
+"   #  #      # #",
+"##    #      # #",
+"      #      # #",
+"      # #   ## #",
+"      #      # #",
+"      #      # #",
+"      #      # #",
+"      # #   ## #",
+"      #      # #",
+"      #      # #",
+" # #  #      # #",
+
+"#### ###########",
+"     #         #",
+"#######        #",
+"#  #  #        #",
+"  ##  ######## #",
+" #    #      # #",
+"      #      # #",
+"      #      # #",
+"      # #   ## #",
+"      #      # #",
+"      #      # #",
+"      #      # #",
+"      # #   ## #",
+"      #      # #",
+"      #      # #",
+" # #  #      # #",
+
+"#### ###########",
+"     #         #",
+"### ###        #",
+"## #  #        #",
+"  ##  ######## #",
+" #    #      # #",
+"      #      # #",
+"      #      # #",
+"      # #   ## #",
+"      #      # #",
+"      #      # #",
+"      #      # #",
+"      # #   ## #",
+"      #      # #",
+"      #      # #",
+" # #  #      # #",
+
+"######## #######",
+"   #  #  #     #",
+" # #### #      #",
+"#   #       #  #",
+"## #        ## #",
+" ##########  # #",
+"     #    #  # #",
+"     #   ## #  #",
+"  #   # # # # ##",
+"    ###  ##    #",
+"   #    # # # ##",
+"# # # #  ## ## #",
+" #  ##    # ## #",
+"#        ##    #",
+"          # ## #",
+"      # ###    #",
+
+"################",
+"       ###     #",
+"  ## # ##      #",
+" # ##  # #  #  #",
+"##          #  #",
+" ##########  # #",
+"          #  # #",
+"         ####  #",
+"       # ##### #",
+"    #  ####    #",
+"      #   #    #",
+"   ##     # #  #",
+"  #       # ## #",
+"# #            #",
+"        #      #",
+"        # # ## #",
+
+"################",
+"     #   #   # #",
+"  # # ### ## # #",
+"  ## ##   # #  #",
+"##    #     #  #",
+" ##########   ##",
+" #        #  ###",
+"         ##### #",
+"       ## # #  #",
+"     #  # # #  #",
+"      #  ##  # #",
+"  #  #   ## #  #",
+" ## #     # ## #",
+"#         #    #",
+"          ## ###",
+"          #  ###",
+
+"################",
+"         ##    #",
+"  # # ### #    #",
+"   # # #    #  #",
+"##  #   #   #  #",
+"###########    #",
+"          #   ##",
+"         ##### #",
+"       #  # # ##",
+"      ##  ###  #",
+"    #  # ##    #",
+"  ## # # ## #  #",
+" # # #    # ## #",
+"##        #    #",
+"          #    #",
+"          #  # #",
+
+"         ## ## #",
+"    #  #  ###  #",
+"     #  # # ## #",
+"    # #   #    #",
+"  #  #  # # #  #",
+" # # #    #    #",
+"#         #    #",
+"          #    #",
+"          # #  #",
+"          #    #",
+"          #    #",
+"   ####   #    #",
+"    ##    # #  #",
+"    ##    #    #",
+"    ##    #    #",
+"    ##    #    #",
+
+"      # ### # ##",
+"     #### ###  #",
+"    #   # # ## #",
+"  #  #    #    #",
+"##   ##   # #  #",
+" ### #    #    #",
+"#         #    #",
+"          #    #",
+"          # #  #",
+"          #    #",
+"          #    #",
+"   ####   #    #",
+"    ##    # #  #",
+"    ##    #    #",
+"    ##    #    #",
+"    ##    #    #",
+
+"      # # # ## #",
+"     #  # # #  #",
+"     ######### #",
+"    #  #  #    #",
+" # #  #   # #  #",
+" ##       #    #",
+"#         #    #",
+"          #    #",
+"          # #  #",
+"          #    #",
+"          #    #",
+"   ####   #    #",
+"    ##    # #  #",
+"    ##    #    #",
+"    ##    #    #",
+"    ##    #    #",
+
+"          ### ##",
+"         ## # ##",
+"       # ## ## #",
+"    # # # #  ###",
+"  ##  ## ## #  #",
+" #  #     #    #",
+"#         #    #",
+"          #    #",
+"          # #  #",
+"          #    #",
+"          #    #",
+"   ####   #    #",
+"    ##    # #  #",
+"    ##    #    #",
+"    ##    #    #",
+"    ##    #    #",
+
+"                ",
+"#    #    # # # ",
+"##  #  # # #   #",
+" ###############",
+"# ## # # #  #   ",
+"## ##           ",
+"#   ##        # ",
+"    ##       #  ",
+"    ##  # ## # #",
+"    ##   ##  #  ",
+"   #####      # ",
+"    ##   # #    ",
+"# # ###         ",
+"## ###      # # ",
+"#   ##   ##   # ",
+"    ##     # # #",
+
+"             # #",
+"#       #  #   #",
+"## #  #  #   #  ",
+" ## ############",
+"#### #  # # # # ",
+"## ##           ",
+"#   ##         #",
+"    ##     #  ##",
+"    ##   #### # ",
+"    ## ##   #   ",
+"    ###  ##  #  ",
+"   ###  #  #    ",
+"#   ##          ",
+"### ##        # ",
+"#   ##    #  #  ",
+"    ##  ### ## #",
+
+"         #   #  ",
+"#      #  #  # #",
+"##  # #  # #  # ",
+" ###############",
+"# ##  # #  #   #",
+"## ##           ",
+"#   ##      ##  ",
+"    ##    #     ",
+"    ##  #  #  # ",
+"    ### # #  #  ",
+"  # ### # # #  #",
+"   ###          ",
+"### ##          ",
+"##  ##          ",
+"#   ##    #   # ",
+"    ##     ##  #",
+
+"                ",
+"#         ## # #",
+"##   # ##   # # ",
+" ###############",
+"#### # #   # # #",
+"## ##     #     ",
+"#   ##        # ",
+"    ##       #  ",
+"    ##  #  #  # ",
+"    ##   ###    ",
+"   #####  #  # #",
+"  # ##  #      #",
+"### ##          ",
+"##  ##        # ",
+"#   ##      # # ",
+"    ##   ##  # #",
+
+"#  #     #     #",
+"      #     #   ",
+"   ## #         ",
+"################",
+"  #        #   #",
+"#   #   ##   # #",
+" # # #   #     #",
+" ## # #        #",
+"#     #        #",
+"## #    #      #",
+"      #   #    #",
+" ##            #",
+"    ## ### #   #",
+"    ## #  #  # #",
+"####  #  #  #  #",
+" ##  # ###    # ",
+
+"     ##  #  #  #",
+" ##   #  #      ",
+"  # # # # #     ",
+"################",
+" #     #   # # #",
+"   #  # #   #  #",
+" #### # # #  # #",
+"  ##    #   #  #",
+"## # ##        #",
+"#         #    #",
+"         #  ## #",
+"  ###  #  #  # #",
+"##             #",
+"##  ## ## #  # #",
+"#  #  ## #  ## #",
+"  #  #  #  #  # ",
+
+"#     #        #",
+" #  #   #       ",
+" #   #   #  #   ",
+"################",
+"  # #          #",
+"       #   #   #",
+"# # # ##  #    #",
+" #          #  #",
+"# # # #   #  # #",
+" # #           #",
+"               #",
+"      # # ## # #",
+"     ##  #     #",
+" ####  #  #  # #",
+"#  #  #  #  #  #",
+" ##  #  #  #  # ",
+
+"     #  #      #",
+"   # #   #   #  ",
+" ##    #   #    ",
+"################",
+"     #   # #   #",
+" # #           #",
+"  # ## #### ## #",
+"#  # #      ## #",
+" #    ### #    #",
+"      # #  # # #",
+"   # #  #      #",
+"         #     #",
+"#  ###     #   #",
+"##  # ## ## ## #",
+"## #  #  #  #  #",
+"  # ##  #  # ## ",
+
+"    ## # # #    ",
+"    ## # ### # #",
+"   ### #        ",
+"  # ### #   #   ",
+"# # ##          ",
+"##  ##         #",
+"#   ##    #   # ",
+"    ##  # # #   ",
+"    ###  # #  # ",
+"    ## # #     #",
+"    ###    #    ",
+" #####    #   # ",
+"# # ##   #   #  ",
+"##  ##     #   #",
+"#   ##    #     ",
+"    ##   #      ",
+
+"    ## ##  #    ",
+"    ## ##      #",
+"   ####       # ",
+"  # ##      #   ",
+"### ##     #  # ",
+"##  ##      #  #",
+"#   ##   ##     ",
+"    ## # # #  # ",
+"    ###  #      ",
+"    ###        #",
+"   ###     #    ",
+"  # ##    #   # ",
+"# # ##   #   #  ",
+"##  ##     #   #",
+"#   ##    #     ",
+"    ##   #      ",
+
+"    ## ## ## # #",
+"   ###   #     #",
+"    ###         ",
+" # ###          ",
+"# # ##          ",
+"##  ##    # ## #",
+"#   ##    #    #",
+"    ##      # # ",
+"    ##  ### #   ",
+"    ## # #     #",
+"   ### ##  #    ",
+"    ##    #   # ",
+"# # ##   #   #  ",
+"##  ##     #   #",
+"#   ##    #     ",
+"    ##   #      ",
+
+"    ###      #  ",
+"    ### ## #  ##",
+"    ## #        ",
+"   ###          ",
+"# # ##      ### ",
+"##  ##         #",
+"#   ##     ##   ",
+"    ##   # #  ##",
+"    ### # # #   ",
+"    ### #    # #",
+"   ###     #    ",
+"  # ###   #   # ",
+"#  ###   #   #  ",
+"##  ##     #   #",
+"#   ##    #     ",
+"    ##   #      ",
+
+"#  # #     # # #",
+"    ##       # #",
+"   ###   #    # ",
+"##   # #     #  ",
+"# # #   # # #  #",
+"    #   ##    # ",
+"#   ##       #  ",
+" ##            #",
+"#             # ",
+"             #  ",
+"               #",
+" #            # ",
+"#            #  ",
+"               #",
+"              # ",
+"             #  ",
+
+"#    #    #  #  ",
+"# # #    #  #  #",
+"#   # ##  #   # ",
+" #           #  ",
+"# # #    #     #",
+"       #      # ",
+" #           #  ",
+" #             #",
+"#             # ",
+"             #  ",
+"               #",
+" #            # ",
+"#            #  ",
+"               #",
+"              # ",
+"             #  ",
+
+"#  #  # #  # #  ",
+"  #      #     #",
+"    #     #   # ",
+" #   #      ## #",
+"#  ##   ### # ##",
+"  #    #      # ",
+"   ## # #    #  ",
+" #        #    #",
+"#             # ",
+"             #  ",
+"               #",
+" #            # ",
+"#            #  ",
+"               #",
+"              # ",
+"             #  ",
+
+"#  ## # #    #  ",
+" ##      # #   #",
+"     # ## #   # ",
+" ###        ##  ",
+"# #  ## #  #   #",
+"#   #    #   ## ",
+"###  #     # #  ",
+" #  # ## ##  # #",
+"#           # # ",
+"  #          #  ",
+"               #",
+" #            # ",
+"#            #  ",
+"               #",
+"              # ",
+"             #  ",
+
+"################",
+"     #          ",
+"  #    ##    ## ",
+"################",
+"## # # # # # # #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # #   # # # # ",
+"##   # # # #   #",
+"# # #       # # ",
+
+"################",
+"     #          ",
+"  #    ##    ## ",
+"################",
+"## # # # # # # #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # #   # # # # ",
+"##   # # #     #",
+"# # # #   # # # ",
+"##   # # # #   #",
+"# # #       # # ",
+
+"################",
+"     #          ",
+"  #    ##    ## ",
+"################",
+"## # # # # # # #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # #   # # ",
+"##       # #   #",
+"# # # # # ### # ",
+"##     # # #   #",
+"# # # ### # # # ",
+"##   # # ###   #",
+"# # # #     # # ",
+
+"################",
+"     #          ",
+"  #    ##    ## ",
+"################",
+"## # # # # # # #",
+"# # #   # # # # ",
+"#               ",
+"# # #   # # # # ",
+"##   # ###     #",
+"# # ### # # # # ",
+"##   #   # #   #",
+"# # # # ### # # ",
+"##   ### # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # #       # # ",
+
+"################",
+"     #          ",
+"  #    ##    ## ",
+"################",
+"## # # # # # # #",
+"# # # # # # # # ",
+"#               ",
+"# # # #   # # # ",
+"##   # # #     #",
+"# # #   # # # # ",
+"##   # # ###   #",
+"# # ###   # # # ",
+"##   # # ###   #",
+"# # # ### # # # ",
+"##   # # # #   #",
+"# # #       # # ",
+
+"################",
+"     #          ",
+"  #    ##    ## ",
+"################",
+"## # # # # # # #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   #   # #   #",
+"# # # # #   # # ",
+"##   # ### #   #",
+"# # #   # # # # ",
+"##   # #  ##   #",
+"# # #     # # # ",
+
+"################",
+"     #          ",
+"  #    ##    ## ",
+"################",
+"## # # # # # # #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # #   # # # # ",
+"##   # #   #   #",
+"# # #       # # ",
+
+"################",
+"     #          ",
+"  #    ##    ## ",
+"################",
+"## # # # # # # #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # #       # # ",
+
+"##   # # #     #",
+"# # #   # # # # ",
+"##   # #   #   #",
+"# # # # # # # # ",
+"##   ### ###   #",
+"# # # # # # # # ",
+"##   # ### ##  #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"## # # # # # # #",
+"################",
+"                ",
+"################",
+" #    ##        ",
+"  ## # # # # ###",
+
+"##  ## #   #   #",
+"# # # ### ### # ",
+"##   # # # #   #",
+"# # # # ### # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"## # # # # # # #",
+"################",
+"                ",
+"################",
+" #    ##        ",
+"  ## # # # # ###",
+
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"## # # # # # # #",
+"################",
+"                ",
+"################",
+" #    ##        ",
+"  ## # # # # ###",
+
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"## # # # # # # #",
+"################",
+"                ",
+"################",
+" #    ##        ",
+"  ## # # # # ###",
+
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"## # # # # # # #",
+"################",
+"                ",
+"################",
+" #    ##        ",
+"  ## # # # # ###",
+
+"##   # # ###   #",
+"# # # ### # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"## # # # # # # #",
+"################",
+"                ",
+"################",
+" #    ##        ",
+"  ## # # # # ###",
+
+"##   # # ###   #",
+"# # #   # # # # ",
+"##   # #   #   #",
+"# # # ### ### # ",
+"##   # # # #   #",
+"# # # # # # # # ",
+"##   # ### #   #",
+"# # # # # # # # ",
+"#               ",
+"# # # # # # # # ",
+"## # # # # # # #",
+"################",
+"                ",
+"################",
+" #    ##        ",
+"  ## # # # # ###",
+
+"##   # # # #   #",
+"# # # # # # # # ",
+"##     #   #   #",
+"# # # # # # # # ",
+"##   #   #     #",
+"# # # # ### # # ",
+"##   ### # #   #",
+"# # # # # ### # ",
+"#               ",
+"# # # # ### # # ",
+"## # # # # # # #",
+"################",
+"                ",
+"################",
+" #    ##        ",
+"  ## # # # # ###",
+
+"#### # # # # ###",
+"##### # # # ####",
+"###  # #   # ###",
+"##  # # # # ####",
+"## # # #   # ## ",
+"##### # # # ## #",
+"#### # # # ###  ",
+"##### # # ##   #",
+"#### # # ##  #  ",
+"##### # ## #   #",
+"###  # ###   #  ",
+"##  # ##   #   #",
+"## # ##  #   #  ",
+"###### #   #   #",
+"######   #   #  ",
+"####   #   #   #",
+
+"################",
+"##           ###",
+"##   #   #  ####",
+"   #   #   #####",
+" #   #   #######",
+"   #   # #######",
+" #   #  ########",
+"   #   #########",
+" #   ###########",
+"   # ###########",
+" #  ############",
+"   #############",
+" ###############",
+" ###############",
+"################",
+"################",
+
+"################",
+"################",
+"################",
+"############### ",
+"############## #",
+"############# # ",
+"############ # #",
+"########### # # ",
+"########## # # #",
+"######### # #   ",
+"######## # # # #",
+"####### # # # # ",
+"###### # #   # #",
+"##### # # # # # ",
+"#### # # # # # #",
+"################",
+
+"################",
+"#           ####",
+" # # # # # #####",
+"# #   # # ######",
+" # # # # #######",
+"# # # # ########",
+"   # # #########",
+"# # # ##########",
+" # # ###########",
+"# # ############",
+" # #############",
+"# ##############",
+" ###############",
+"################",
+"################",
+"################",
+
+"                ",
+"                ",
+"   ###     ###  ",
+"  #   ## ##   # ",
+" ###    #     # ",
+"  #    # #   ## ",
+"   #  #   #  ## ",
+"   # #  #  # #  ",
+"    #  ###  #   ",
+"   # #  #  # #  ",
+"   #  #   #  #  ",
+"  #    # #    # ",
+"  #     #     # ",
+"  #   ## ##   # ",
+"   ###     ###  ",
+"                ",
+
+"                ",
+"                ",
+"   ###     ###  ",
+"  #   #####   # ",
+"  #    ##     # ",
+"  #    ###    # ",
+"   #  #   #  #  ",
+"   # #  #  # #  ",
+"    #  ###  #   ",
+"   # #  #  # #  ",
+"   #  #   #  #  ",
+"  #    # #    # ",
+"  #     #     # ",
+"  #  ### ##   # ",
+"   ####    ###  ",
+"                ",
+
+"                ",
+"                ",
+"   ###     ###  ",
+"  #   ## ##   # ",
+"  #     #     # ",
+"  #    # #    # ",
+"   #  #   #  #  ",
+"   # #  #  # #  ",
+"    #  ###  #   ",
+"   # #  #  # #  ",
+"  ##  #   #  ## ",
+"  ##   # #   ## ",
+"  #     #     # ",
+"  #   ## ##   # ",
+"   ###     ###  ",
+"                ",
+
+"                ",
+"                ",
+"   ###     ###  ",
+"  #   #####   # ",
+"  #     ##    # ",
+"  #    # #    # ",
+"   #  #   #  #  ",
+"   # #  #  # #  ",
+"    #  ###  #   ",
+"   # #  #  # #  ",
+"   #  #   #  #  ",
+"  #    ###    # ",
+"  #     ##    # ",
+"  #   #####   # ",
+"   ###     ###  ",
+"                ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                ",
+"                "};
diff --git a/images/tilessm.xpm b/images/tilessm.xpm
new file mode 100644 (file)
index 0000000..c2036bb
--- /dev/null
@@ -0,0 +1,3857 @@
+/* XPM */
+static char * tilessm_xpm[] = {
+"4 2880 14 1",
+"      c #CCCC7F7F6666",
+".     c #FFFFFFFFFFFF",
+"X     c #FFFF00000000",
+"o     c #66666666E6E6",
+"O     c #0000E6E60000",
+"+     c #00007F7F0000",
+"@     c #000000000000",
+"#     c #3F3F3F3F3F3F",
+"$     c #00000000E6E6",
+"%     c #FFFFFFFF0000",
+"&     c #BFBFBFBFBFBF",
+"*     c #7F7F7F7F7F7F",
+"=     c #99997F7F4C4C",
+"-     c #FFFF7F7F0000",
+
+"   .",
+"   .",
+"   .",
+
+"XXX.",
+"XXX.",
+"XXX.",
+
+"ooo.",
+"ooo.",
+"ooo.",
+
+"ooo.",
+"ooo.",
+"ooo.",
+
+"ooo.",
+"ooo.",
+"ooo.",
+
+"   .",
+"ooo.",
+"ooo.",
+
+"   .",
+"ooo.",
+"ooo.",
+
+"   .",
+"o  .",
+"oo .",
+
+"   .",
+"o  .",
+"oo .",
+
+"oo .",
+"oo .",
+"oo .",
+
+"oo .",
+"oo .",
+"oo .",
+
+"oo .",
+"o  .",
+"   .",
+
+"oo .",
+"o  .",
+"   .",
+
+"ooo.",
+"ooo.",
+"   .",
+
+"ooo.",
+"ooo.",
+"   .",
+
+" oo.",
+"  o.",
+"   .",
+
+" oo.",
+"  o.",
+"   .",
+
+" oo.",
+" oo.",
+" oo.",
+
+" oo.",
+" oo.",
+" oo.",
+
+"   .",
+"  o.",
+" oo.",
+
+"   .",
+"  o.",
+" oo.",
+
+"   .",
+"OOO.",
+"OOO.",
+
+"   .",
+"O  .",
+"OO .",
+
+"OO .",
+"OO .",
+"OO .",
+
+"OO .",
+"O  .",
+"   .",
+
+"OOO.",
+"OOO.",
+"   .",
+
+" OO.",
+"  O.",
+"   .",
+
+" OO.",
+" OO.",
+" OO.",
+
+"   .",
+"  O.",
+" OO.",
+
+"   .",
+"OOO.",
+"OOO.",
+
+"   .",
+"O  .",
+"OO .",
+
+"OO .",
+"OO .",
+"OO .",
+
+"OO .",
+"O  .",
+"   .",
+
+"OOO.",
+"OOO.",
+"   .",
+
+" OO.",
+"  O.",
+"   .",
+
+" OO.",
+" OO.",
+" OO.",
+
+"   .",
+"  O.",
+" OO.",
+
+"OOO.",
+"O+O.",
+"OOO.",
+
+"OOO.",
+"OOO.",
+"OOO.",
+
+"+++.",
+"+++.",
+"+++.",
+
+"+++.",
+"+++.",
+"+++.",
+
+"+++.",
+"+++.",
+"+++.",
+
+"+++.",
+"+++.",
+"+++.",
+
+"+++.",
+"+++.",
+"+++.",
+
+"@@@.",
+"@#@.",
+"@@@.",
+
+"@@@.",
+"@#@.",
+"@@@.",
+
+"@@@.",
+"@#@.",
+"@@@.",
+
+"@@@.",
+"@#@.",
+"@@@.",
+
+"$$$.",
+"$o$.",
+"$$$.",
+
+"$$$.",
+"$o$.",
+"$$$.",
+
+"$$$.",
+"$o$.",
+"$$$.",
+
+"$$$.",
+"$o$.",
+"$$$.",
+
+"%#%.",
+"#X#.",
+"%#%.",
+
+"@@@.",
+"....",
+"....",
+
+"@@@.",
+"....",
+"....",
+
+"@@@.",
+"....",
+"....",
+
+" %X.",
+"%XX.",
+"XXX.",
+
+" %X.",
+"XXX.",
+"XXX.",
+
+" %X.",
+"%XX.",
+"XXX.",
+
+" %X.",
+"XXX.",
+"XXX.",
+
+" %X.",
+"%XX.",
+"XXX.",
+
+" %X.",
+"XXX.",
+"XXX.",
+
+" %X.",
+"%XX.",
+"XXX.",
+
+" %X.",
+"XXX.",
+"XXX.",
+
+"###.",
+"#.#.",
+"###.",
+
+"###.",
+"#.#.",
+"###.",
+
+"###.",
+"#.#.",
+"###.",
+
+"###.",
+"#.#.",
+"###.",
+
+"###.",
+"#.#.",
+"###.",
+
+"###.",
+"#.#.",
+"###.",
+
+"###.",
+"#.#.",
+"###.",
+
+"###.",
+"#.#.",
+"###.",
+
+"###.",
+"#.#.",
+"###.",
+
+"###.",
+"#.#.",
+"###.",
+
+"###.",
+"#.#.",
+"###.",
+
+"###.",
+"#.#.",
+"###.",
+
+"#X#.",
+"O#O.",
+"#X#.",
+
+"###.",
+"#.#.",
+"###.",
+
+"###.",
+"#.#.",
+"###.",
+
+"ooo.",
+"ooo.",
+"ooo.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"#O#.",
+"X#X.",
+"#O#.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"ooo.",
+"ooo.",
+"ooo.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"#X#.",
+"O#O.",
+"#X#.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"ooo.",
+"ooo.",
+"ooo.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"#O#.",
+"X#X.",
+"#O#.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"ooo.",
+"ooo.",
+"ooo.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"#X#.",
+"O#O.",
+"#X#.",
+
+"###.",
+"#&#.",
+"###.",
+
+"###.",
+"#&#.",
+"###.",
+
+"ooo.",
+"ooo.",
+"ooo.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"#O#.",
+"X#X.",
+"#O#.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"ooo.",
+"ooo.",
+"ooo.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"#X#.",
+"O#O.",
+"#X#.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"ooo.",
+"ooo.",
+"ooo.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"#O#.",
+"X#X.",
+"#O#.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"ooo.",
+"ooo.",
+"ooo.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"#X#.",
+"O#O.",
+"#X#.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"ooo.",
+"ooo.",
+"ooo.",
+
+"o@o.",
+"o@o.",
+"o@o.",
+
+"ooo.",
+"@@@.",
+"ooo.",
+
+"   .",
+"@%@.",
+"   .",
+
+" @ .",
+" % .",
+" @ .",
+
+" @ .",
+" %@.",
+"   .",
+
+"   .",
+" %@.",
+" @ .",
+
+"   .",
+"@% .",
+" @ .",
+
+" @ .",
+"@% .",
+"   .",
+
+" @ .",
+"@%@.",
+"   .",
+
+" @ .",
+" %@.",
+" @ .",
+
+"   .",
+"@%@.",
+" @ .",
+
+" @ .",
+"@% .",
+" @ .",
+
+" @ .",
+"@%@.",
+" @ .",
+
+" @ .",
+"@%@.",
+" @ .",
+
+" @ .",
+"@%@.",
+" @ .",
+
+"   .",
+"   .",
+"   .",
+
+".o..",
+"ooo.",
+".o..",
+
+".o..",
+"ooo.",
+".o..",
+
+"###.",
+" @ .",
+"###.",
+
+"# #.",
+"#@#.",
+"# #.",
+
+"# @.",
+" # .",
+"  #.",
+
+"  #.",
+" # .",
+"# @.",
+
+"#  .",
+" # .",
+"@ #.",
+
+"@ #.",
+" # .",
+"#  .",
+
+"###.",
+" @ .",
+"###.",
+
+"# #.",
+"#@#.",
+"# #.",
+
+"###.",
+" @ .",
+"###.",
+
+"# #.",
+"#@#.",
+"# #.",
+
+"###.",
+"# #.",
+"###.",
+
+"###.",
+"###.",
+"###.",
+
+"###.",
+"###.",
+"###.",
+
+"   .",
+"   .",
+"   .",
+
+"@@@.",
+"@  .",
+"@ O.",
+
+"@@@.",
+"   .",
+"OO .",
+
+"@@@.",
+"  @.",
+"  @.",
+
+"@ O.",
+"@ O.",
+"@ O.",
+
+"  O.",
+"OOO.",
+" O .",
+
+"  @.",
+"  @.",
+"  @.",
+
+"@ O.",
+"@  .",
+"@@@.",
+
+"  O.",
+"   .",
+"@@@.",
+
+"  @.",
+"  @.",
+"@@@.",
+
+" @@.",
+" @@.",
+"   .",
+
+" @@.",
+" @@.",
+"   .",
+
+" @@.",
+" @@.",
+"   .",
+
+" @@.",
+" @@.",
+"   .",
+
+" @@.",
+" @@.",
+"   .",
+
+" @@.",
+" @@.",
+"   .",
+
+" @@.",
+" @@.",
+"   .",
+
+" @@.",
+" @@.",
+"   .",
+
+" @@.",
+" @@.",
+"   .",
+
+" @@.",
+" @@.",
+"   .",
+
+" @@.",
+" @@.",
+"   .",
+
+" @@.",
+" @@.",
+"   .",
+
+"@@@.",
+"@  .",
+"@  .",
+
+"@@@.",
+"   .",
+"#**.",
+
+"@@@.",
+"  @.",
+"**@.",
+
+"@  .",
+"@  .",
+"@ *.",
+
+"#**.",
+"#@@.",
+"  #.",
+
+"**@.",
+"**@.",
+"**@.",
+
+"@ *.",
+"@ *.",
+"@@@.",
+
+"**#.",
+"*  .",
+"@@@.",
+
+"@@@.",
+"  @.",
+"@@@.",
+
+"@@@.",
+"@ #.",
+"@##.",
+
+"@@@.",
+"===.",
+"===.",
+
+"@@@.",
+"= @.",
+"= @.",
+
+"@#@.",
+"@@@.",
+"@  .",
+
+"@@@.",
+"@@@.",
+"*==.",
+
+"@ @.",
+"  @.",
+"==@.",
+
+"@ *.",
+"@ *.",
+"@@@.",
+
+"*==.",
+"###.",
+"@@@.",
+
+"==@.",
+"# @.",
+"@@@.",
+
+"@@@.",
+"@ *.",
+"@**.",
+
+"@@@.",
+"##*.",
+"##*.",
+
+"@@@.",
+"==@.",
+"==@.",
+
+"@**.",
+"@**.",
+"@**.",
+
+"***.",
+"** .",
+"## .",
+
+"==@.",
+"**@.",
+"==@.",
+
+"@**.",
+"@*#.",
+"@@@.",
+
+"###.",
+"###.",
+"@@@.",
+
+"==@.",
+"##@.",
+"@@@.",
+
+"@@@.",
+"@ $.",
+"@$$.",
+
+"@@@.",
+"**X.",
+"**X.",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"@$$.",
+"@$X.",
+"@XX.",
+
+"##X.",
+"***.",
+"***.",
+
+"XX@.",
+"**@.",
+"**@.",
+
+"@XX.",
+"@X#.",
+"@@@.",
+
+"###.",
+"###.",
+"@@@.",
+
+"##@.",
+"# @.",
+"@@@.",
+
+"@@@.",
+"@X*.",
+"@X*.",
+
+"@@@.",
+"**o.",
+"**o.",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"@X*.",
+"@X*.",
+"@X*.",
+
+"*Xo.",
+"*  .",
+"*  .",
+
+"$*@.",
+"o*@.",
+"$$@.",
+
+"@X*.",
+"@XX.",
+"@@@.",
+
+"* &.",
+"X &.",
+"@@@.",
+
+"&&@.",
+"& @.",
+"@@@.",
+
+"@@@.",
+"@ *.",
+"@o*.",
+
+"@@@.",
+"*  .",
+"* o.",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"@o*.",
+"@o*.",
+"@o*.",
+
+"* o.",
+"* o.",
+"**o.",
+
+"**@.",
+"**@.",
+"**@.",
+
+"@o*.",
+"@$$.",
+"@@@.",
+
+"**$.",
+"$$$.",
+"@@@.",
+
+"$$@.",
+"$ @.",
+"@@@.",
+
+"@@@.",
+"@ O.",
+"@OO.",
+
+"@@@.",
+"**#.",
+"**#.",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"@OO.",
+"@OO.",
+"@OO.",
+
+"**+.",
+"***.",
+"***.",
+
+"++@.",
+"* @.",
+"* @.",
+
+"@O+.",
+"@+#.",
+"@@@.",
+
+"#+#.",
+"+#+.",
+"@@@.",
+
+"+ @.",
+"  @.",
+"@@@.",
+
+"@@@.",
+"@ o.",
+"@oo.",
+
+"@@@.",
+"**X.",
+"**#.",
+
+"@@@.",
+"XX@.",
+"#X@.",
+
+"@oo.",
+"@o$.",
+"@o*.",
+
+"**X.",
+"$$o.",
+"***.",
+
+"**@.",
+"**@.",
+"**@.",
+
+"@o*.",
+"@$$.",
+"@@@.",
+
+"***.",
+"$$$.",
+"@@@.",
+
+"**@.",
+"$ @.",
+"@@@.",
+
+"@@@.",
+"@o#.",
+"@o#.",
+
+"@@@.",
+"# O.",
+"# O.",
+
+"@@@.",
+"##@.",
+"##@.",
+
+"@o*.",
+"@o*.",
+"@$$.",
+
+"* O.",
+"* O.",
+"$ +.",
+
+"##@.",
+"##@.",
+"++@.",
+
+"@  .",
+"@O .",
+"@@@.",
+
+" O .",
+"O  .",
+"@@@.",
+
+"  @.",
+" O@.",
+"@@@.",
+
+"@@@.",
+"@O$.",
+"@$$.",
+
+"@@@.",
+"**O.",
+"***.",
+
+"@@@.",
+"OO@.",
+"**@.",
+
+"@$$.",
+"@$X.",
+"@$#.",
+
+"**o.",
+"Xoo.",
+"#Oo.",
+
+"**@.",
+"**@.",
+"$$@.",
+
+"@$#.",
+"@$X.",
+"@@@.",
+
+"#OO.",
+"XOO.",
+"@@@.",
+
+"OO@.",
+"OO@.",
+"@@@.",
+
+"@@@.",
+"@ -.",
+"@--.",
+
+"@@@.",
+"**-.",
+"**-.",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"@-*.",
+"@-*.",
+"@--.",
+
+"* -.",
+"**o.",
+"**o.",
+
+"XX@.",
+"**@.",
+"**@.",
+
+"@--.",
+"@-X.",
+"@@@.",
+
+"XXo.",
+"XXX.",
+"@@@.",
+
+"$$@.",
+"  @.",
+"@@@.",
+
+"@@@.",
+"@O&.",
+"@&&.",
+
+"@@@.",
+"**..",
+"**&.",
+
+"@@@.",
+"..@.",
+"&&@.",
+
+"@&*.",
+"@&*.",
+"@&&.",
+
+"*...",
+"&...",
+"&**.",
+
+"##@.",
+"##@.",
+"##@.",
+
+"@&&.",
+"@&*.",
+"@@@.",
+
+"***.",
+"***.",
+"@@@.",
+
+"**@.",
+"*O@.",
+"@@@.",
+
+"@@@.",
+"@X*.",
+"@X*.",
+
+"@@@.",
+"***.",
+"***.",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"@XX.",
+"@OO.",
+"@OO.",
+
+"X$$.",
+"Ooo.",
+"Ooo.",
+
+"$$@.",
+"OO@.",
+"OO@.",
+
+"@Oo.",
+"@Oo.",
+"@@@.",
+
+"***.",
+"$$$.",
+"@@@.",
+
+"*O@.",
+"$O@.",
+"@@@.",
+
+"@@@.",
+"@OO.",
+"@o*.",
+
+"@@@.",
+"OOO.",
+"***.",
+
+"@@@.",
+"OO@.",
+"**@.",
+
+"@o*.",
+"@o*.",
+"@o*.",
+
+"$$$.",
+"oOo.",
+"OOo.",
+
+"**@.",
+"**@.",
+"$$@.",
+
+"@o*.",
+"@o$.",
+"@@@.",
+
+"***.",
+"$$$.",
+"@@@.",
+
+"OO@.",
+"Oo@.",
+"@@@.",
+
+"@@@.",
+"@OO.",
+"@O..",
+
+"@@@.",
+".#O.",
+"&*O.",
+
+"@@@.",
+"OO@.",
+"oO@.",
+
+"@.&.",
+"@&*.",
+"@OO.",
+
+"*OO.",
+"OOO.",
+"OO..",
+
+"OO@.",
+".#@.",
+"&*@.",
+
+"@OO.",
+"@OO.",
+"@@@.",
+
+"O.&.",
+"O&*.",
+"@@@.",
+
+"*O@.",
+"OO@.",
+"@@@.",
+
+"@@@.",
+"@O&.",
+"@&&.",
+
+"@@@.",
+"**#.",
+"**#.",
+
+"@@@.",
+"##@.",
+"##@.",
+
+"@&*.",
+"@&&.",
+"@&&.",
+
+"*#*.",
+"*OO.",
+"***.",
+
+"&*@.",
+"&*@.",
+"**@.",
+
+"@&&.",
+"@&..",
+"@@@.",
+
+".@..",
+"....",
+"@@@.",
+
+"@.@.",
+".O@.",
+"@@@.",
+
+"@@@.",
+"@OO.",
+"@OO.",
+
+"@@@.",
+"O.#.",
+"##X.",
+
+"@@@.",
+"#O@.",
+"X#@.",
+
+"@O..",
+"@...",
+"@.*.",
+
+"##X.",
+"**#.",
+"*.#.",
+
+"X#@.",
+"#.@.",
+"#*@.",
+
+"@OO.",
+"@OO.",
+"@@@.",
+
+"..*.",
+".**.",
+"@@@.",
+
+"*O@.",
+"OO@.",
+"@@@.",
+
+"@@@.",
+"@+#.",
+"@&#.",
+
+"@@@.",
+"###.",
+"###.",
+
+"@@@.",
+"##@.",
+"#.@.",
+
+"@&#.",
+"@&#.",
+"@&#.",
+
+"##&.",
+"#&*.",
+"#**.",
+
+".#@.",
+"*#@.",
+"##@.",
+
+"@**.",
+"@++.",
+"@@@.",
+
+"*##.",
+"+++.",
+"@@@.",
+
+"**@.",
+"++@.",
+"@@@.",
+
+"@@@.",
+"@  .",
+"@  .",
+
+"@@@.",
+"   .",
+"oo .",
+
+"@@@.",
+"  @.",
+"  @.",
+
+"@ o.",
+"@ o.",
+"@ o.",
+
+"  o.",
+"   .",
+"  o.",
+
+"  @.",
+"  @.",
+"  @.",
+
+"@  .",
+"@  .",
+"@@@.",
+
+"oo .",
+"   .",
+"@@@.",
+
+"  @.",
+"  @.",
+"@@@.",
+
+"@@@.",
+"@+&.",
+"@+&.",
+
+"@@@.",
+"&&&.",
+"###.",
+
+"@@@.",
+"&+@.",
+"&+@.",
+
+"@+&.",
+"@.&.",
+"@+&.",
+
+"###.",
+"***.",
+"+++.",
+
+"&+@.",
+"&+@.",
+"&+@.",
+
+"@&&.",
+"@++.",
+"@@@.",
+
+"&&&.",
+"+++.",
+"@@@.",
+
+"&&@.",
+"++@.",
+"@@@.",
+
+"@@@.",
+"@  .",
+"@  .",
+
+"@@@.",
+"  &.",
+" &&.",
+
+"@@@.",
+"& @.",
+"*#@.",
+
+"@  .",
+"@ @.",
+"@  .",
+
+"@&*.",
+" @*.",
+"@ @.",
+
+"*#@.",
+"# @.",
+"  @.",
+
+"@ @.",
+"@  .",
+"@@@.",
+
+" @ .",
+"   .",
+"@@@.",
+
+"  @.",
+"  @.",
+"@@@.",
+
+"@@@.",
+"@+*.",
+"@+*.",
+
+"@@@.",
+"***.",
+"*++.",
+
+"@@@.",
+"**@.",
+"o*@.",
+
+"@+*.",
+"@+*.",
+"@+X.",
+
+"* o.",
+"* o.",
+"###.",
+
+"o*@.",
+"o*@.",
+"#*@.",
+
+"@XX.",
+"@XX.",
+"@@@.",
+
+"###.",
+"XXX.",
+"@@@.",
+
+"#*@.",
+"$$@.",
+"@@@.",
+
+"@@@.",
+"@ o.",
+"@oo.",
+
+"@@@.",
+"&&&.",
+"&&&.",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"@oo.",
+"@oo.",
+"@oo.",
+
+"&&&.",
+"&&&.",
+"&&&.",
+
+"$$@.",
+"**@.",
+"**@.",
+
+"@oo.",
+"@o$.",
+"@@@.",
+
+"$$$.",
+"$$$.",
+"@@@.",
+
+"**@.",
+"$ @.",
+"@@@.",
+
+"@@@.",
+"@ X.",
+"@XX.",
+
+"@@@.",
+"##X.",
+"##X.",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"@X .",
+"@XX.",
+"@XX.",
+
+"**X.",
+"**#.",
+"**#.",
+
+"XX@.",
+"**@.",
+"**@.",
+
+"@XX.",
+"@X$.",
+"@@@.",
+
+"$# .",
+"#$#.",
+"@@@.",
+
+"#$@.",
+"$ @.",
+"@@@.",
+
+"@@@.",
+"@Oo.",
+"@Oo.",
+
+"@@@.",
+"==O.",
+"==*.",
+
+"@@@.",
+"OO@.",
+"**@.",
+
+"@Oo.",
+"@Oo.",
+"@**.",
+
+"==*.",
+"$$O.",
+"***.",
+
+"**@.",
+"*O@.",
+"**@.",
+
+"@OO.",
+"@OO.",
+"@@@.",
+
+"X##.",
+"XXX.",
+"@@@.",
+
+"#O@.",
+"XO@.",
+"@@@.",
+
+"@@@.",
+"@  .",
+"@  .",
+
+"@@@.",
+" o#.",
+" o#.",
+
+"@@@.",
+"##@.",
+"##@.",
+
+"@  .",
+"@  .",
+"@.#.",
+
+" $$.",
+" ==.",
+"# *.",
+
+"$$@.",
+"==@.",
+"**@.",
+
+"@.#.",
+"@.&.",
+"@@@.",
+
+"#=*.",
+"&= .",
+"@@@.",
+
+"* @.",
+"  @.",
+"@@@.",
+
+"@@@.",
+"@  .",
+"@O*.",
+
+"@@@.",
+"  O.",
+"*OO.",
+
+"@@@.",
+"##@.",
+"##@.",
+
+"@O*.",
+"@O*.",
+"@O*.",
+
+"*O+.",
+"*++.",
+"*==.",
+
+"++@.",
+"+*@.",
+"O*@.",
+
+"@O*.",
+"@++.",
+"@@@.",
+
+"*  .",
+"+  .",
+"@@@.",
+
+"O*@.",
+"++@.",
+"@@@.",
+
+"@@@.",
+"@##.",
+"@#o.",
+
+"@@@.",
+"o##.",
+"*##.",
+
+"@@@.",
+"##@.",
+"##@.",
+
+"@o*.",
+"@*o.",
+"@o*.",
+
+"o##.",
+"*##.",
+"o$$.",
+
+"##@.",
+"##@.",
+"$$@.",
+
+"@*o.",
+"@o$.",
+"@@@.",
+
+"$$$.",
+"$$$.",
+"@@@.",
+
+"$*@.",
+"**@.",
+"@@@.",
+
+"@@@.",
+"@&&.",
+"@&O.",
+
+"@@@.",
+"O##.",
+"O##.",
+
+"@@@.",
+"##@.",
+"##@.",
+
+"@OO.",
+"@OO.",
+"@OO.",
+
+"O##.",
+"O##.",
+"O++.",
+
+"##@.",
+"##@.",
+"++@.",
+
+"@OO.",
+"@O+.",
+"@@@.",
+
+"+++.",
+"+++.",
+"@@@.",
+
+"+&@.",
+"&&@.",
+"@@@.",
+
+"@@@.",
+"@o#.",
+"@o#.",
+
+"@@@.",
+"###.",
+"###.",
+
+"@@@.",
+"##@.",
+"##@.",
+
+"@oo.",
+"@ #.",
+"@ #.",
+
+"-oX.",
+"###.",
+"###.",
+
+"o%@.",
+"  @.",
+"o#@.",
+
+"@ #.",
+"@# .",
+"@@@.",
+
+"###.",
+"  #.",
+"@@@.",
+
+"o#@.",
+"oo@.",
+"@@@.",
+
+"@@@.",
+"@o..",
+"@o&.",
+
+"@@@.",
+"*##.",
+"*##.",
+
+"@@@.",
+"##@.",
+"##@.",
+
+"@Oo.",
+"@OO.",
+"@**.",
+
+"ooo.",
+"OOO.",
+"**O.",
+
+"o#@.",
+"o#@.",
+"o#@.",
+
+"@OO.",
+"@OO.",
+"@@@.",
+
+"O*O.",
+"O*O.",
+"@@@.",
+
+"o#@.",
+"oo@.",
+"@@@.",
+
+"@@@.",
+"@  .",
+"@ o.",
+
+"@@@.",
+"o# .",
+"o#o.",
+
+"@@@.",
+"o#@.",
+"o#@.",
+
+"@oo.",
+"@oo.",
+"@oo.",
+
+"o#o.",
+"o#o.",
+"o#o.",
+
+"o#@.",
+"o#@.",
+"o#@.",
+
+"@oo.",
+"@o$.",
+"@@@.",
+
+"$$o.",
+"*o$.",
+"@@@.",
+
+"$$@.",
+"* @.",
+"@@@.",
+
+"@@@.",
+"@OO.",
+"@&*.",
+
+"@@@.",
+"OO..",
+"*...",
+
+"@@@.",
+"##@.",
+"##@.",
+
+"@&*.",
+"@&*.",
+"@&*.",
+
+"..&.",
+".&&.",
+"&&*.",
+
+"&O@.",
+"*O@.",
+"*O@.",
+
+"@&*.",
+"@&#.",
+"@@@.",
+
+"***.",
+"###.",
+"@@@.",
+
+"*O@.",
+"#O@.",
+"@@@.",
+
+"@@@.",
+"@&&.",
+"@&@.",
+
+"@@@.",
+"&*&.",
+"**&.",
+
+"@@@.",
+"&&@.",
+"&&@.",
+
+"@&*.",
+"@**.",
+"@**.",
+
+"**&.",
+"**&.",
+"*##.",
+
+"&&@.",
+"&&@.",
+"##@.",
+
+"@**.",
+"@*#.",
+"@@@.",
+
+"###.",
+"###.",
+"@@@.",
+
+"#&@.",
+"&&@.",
+"@@@.",
+
+"@@@.",
+"@  .",
+"@  .",
+
+"@@@.",
+"o**.",
+"o$$.",
+
+"@@@.",
+"* @.",
+"$ @.",
+
+"@O*.",
+"@O+.",
+"@##.",
+
+"###.",
+"###.",
+"###.",
+
+"# @.",
+"##@.",
+"  @.",
+
+"@  .",
+"@  .",
+"@@@.",
+
+"&**.",
+"&**.",
+"@@@.",
+
+"  @.",
+"  @.",
+"@@@.",
+
+"@@@.",
+"@ O.",
+"@ O.",
+
+"@@@.",
+"**&.",
+"**&.",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"@ O.",
+"@ +.",
+"@  .",
+
+"++O.",
+"+O+.",
+"   .",
+
+"++@.",
+"+ @.",
+"  @.",
+
+"@  .",
+"@ &.",
+"@@@.",
+
+"&&&.",
+"&o&.",
+"@@@.",
+
+"  @.",
+"& @.",
+"@@@.",
+
+"@@@.",
+"@O&.",
+"@&&.",
+
+"@@@.",
+"##O.",
+"###.",
+
+"@@@.",
+"OO@.",
+"##@.",
+
+"@&&.",
+"@&&.",
+"@&&.",
+
+"##*.",
+"## .",
+"##O.",
+
+"**@.",
+"  @.",
+"OO@.",
+
+"@&&.",
+"@&*.",
+"@@@.",
+
+"**#.",
+"***.",
+"@@@.",
+
+"##@.",
+"**@.",
+"@@@.",
+
+"@@@.",
+"@&#.",
+"@&*.",
+
+"@@@.",
+"##&.",
+"&&&.",
+
+"@@@.",
+"##@.",
+"##@.",
+
+"@O&.",
+"@O&.",
+"@O&.",
+
+"&&&.",
+"&&&.",
+"&&*.",
+
+"##@.",
+"**@.",
+"**@.",
+
+"@&#.",
+"@&*.",
+"@@@.",
+
+"#&*.",
+"***.",
+"@@@.",
+
+"*O@.",
+"*O@.",
+"@@@.",
+
+"@@@.",
+"@.*.",
+"@.*.",
+
+"@@@.",
+"**..",
+"*...",
+
+"@@@.",
+"##@.",
+"##@.",
+
+"@.*.",
+"@...",
+"@...",
+
+"..&.",
+".&*.",
+"&*#.",
+
+"*#@.",
+"#*@.",
+"**@.",
+
+"@.&.",
+"@O*.",
+"@@@.",
+
+"*#*.",
+"#&&.",
+"@@@.",
+
+"**@.",
+"&&@.",
+"@@@.",
+
+"@@@.",
+"@  .",
+"@ %.",
+
+"@@@.",
+"   .",
+"%% .",
+
+"@@@.",
+"  @.",
+"  @.",
+
+"@  .",
+"@  .",
+"@  .",
+
+"%  .",
+"%  .",
+"%  .",
+
+"  @.",
+"  @.",
+"  @.",
+
+"@ %.",
+"@  .",
+"@@@.",
+
+"%% .",
+"   .",
+"@@@.",
+
+"  @.",
+"  @.",
+"@@@.",
+
+"@@@.",
+"@XX.",
+"@XX.",
+
+"@@@.",
+" **.",
+"  *.",
+
+"@@@.",
+"  @.",
+"* @.",
+
+"@  .",
+"@  .",
+"@ ..",
+
+"   .",
+".* .",
+"* ..",
+
+"  @.",
+".*@.",
+"*.*.",
+
+"@  .",
+"@  .",
+"@@@.",
+
+"   .",
+"   .",
+"@@@.",
+
+".*@.",
+"  @.",
+"@@@.",
+
+"@@@.",
+"@&=.",
+"@&=.",
+
+"@@@.",
+"== .",
+"== .",
+
+"@@@.",
+"  @.",
+"#@@.",
+
+"@&=.",
+"@**.",
+"@  .",
+
+"==&.",
+"**&.",
+"  &.",
+
+"#@@.",
+"#@@.",
+"#@@.",
+
+"@ *.",
+"@**.",
+"@@@.",
+
+"* &.",
+"  *.",
+"@@@.",
+
+"#@@.",
+"**@.",
+"@@@.",
+
+"@@@.",
+"@&*.",
+"@&*.",
+
+"@@@.",
+"***.",
+"***.",
+
+"@@@.",
+"*@@.",
+"@*@.",
+
+"@&#.",
+"@  .",
+"@**.",
+
+"##*.",
+" &*.",
+" &*.",
+
+"*@@.",
+"@*@.",
+"**@.",
+
+"@**.",
+"@ *.",
+"@@@.",
+
+" &#.",
+"   .",
+"@@@.",
+
+"##@.",
+"  @.",
+"@@@.",
+
+"@@@.",
+"@&*.",
+"@&*.",
+
+"@@@.",
+"***.",
+"***.",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"@&*.",
+"@&@.",
+"@&*.",
+
+"@*@.",
+"*@*.",
+"***.",
+
+"*@@.",
+"@#@.",
+"* @.",
+
+"@&*.",
+"@&#.",
+"@@@.",
+
+"***.",
+"###.",
+"@@@.",
+
+"* @.",
+"# @.",
+"@@@.",
+
+"@@@.",
+"@  .",
+"@&*.",
+
+"@@@.",
+"   .",
+"*  .",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"@##.",
+"@  .",
+"@  .",
+
+"#  .",
+" . .",
+" * .",
+
+"**@.",
+"  @.",
+"  @.",
+
+"@ ..",
+"@ *.",
+"@@@.",
+
+" . .",
+" * .",
+"@@@.",
+
+". @.",
+"* @.",
+"@@@.",
+
+"@@@.",
+"@& .",
+"@  .",
+
+"@@..",
+" .#.",
+".##.",
+
+"&@@.",
+"#&@.",
+"##*.",
+
+"@ ..",
+"@ ..",
+"@  .",
+
+".##.",
+"&&#.",
+"&&*.",
+
+"##*.",
+"#*@.",
+"* @.",
+
+"@  .",
+"@  .",
+"@@@.",
+
+" **.",
+"   .",
+"@@@.",
+
+"  @.",
+" &@.",
+"@@@.",
+
+"@@@.",
+"@&*.",
+"@&*.",
+
+"@@@.",
+"*@*.",
+"@*@.",
+
+"@@@.",
+"@*@.",
+"**@.",
+
+"@&*.",
+"@&#.",
+"@  .",
+
+"***.",
+"###.",
+"  &.",
+
+"**@.",
+"**@.",
+"**@.",
+
+"@**.",
+"@ *.",
+"@@@.",
+
+"* &.",
+"* &.",
+"@@@.",
+
+"**@.",
+"##@.",
+"@@@.",
+
+"@@@.",
+"@ &.",
+"@&&.",
+
+"@@@.",
+"*@*.",
+"**@.",
+
+"@@@.",
+"  @.",
+"#*@.",
+
+"@&&.",
+"@&&.",
+"@&&.",
+
+"*@*.",
+"**@.",
+"*@*.",
+
+"#*@.",
+"#*@.",
+"#*@.",
+
+"@&&.",
+"@&#.",
+"@@@.",
+
+"###.",
+"## .",
+"@@@.",
+
+"##@.",
+"  @.",
+"@@@.",
+
+"$$$.",
+"$##.",
+"$##.",
+
+"$$$.",
+"##*.",
+"#&*.",
+
+"$$$.",
+"*##.",
+"#*#.",
+
+"$$$.",
+"##$.",
+"##$.",
+
+"$##.",
+"$##.",
+"$##.",
+
+"##&.",
+"&*&.",
+"##&.",
+
+"*##.",
+"***.",
+"*##.",
+
+"##$.",
+"##$.",
+"##$.",
+
+"$##.",
+"$&*.",
+"$&*.",
+
+"##&.",
+"##&.",
+"##&.",
+
+"*##.",
+"*##.",
+"*##.",
+
+"##$.",
+"*#$.",
+"*#$.",
+
+"$#&.",
+"$##.",
+"$$$.",
+
+"***.",
+"###.",
+"$$$.",
+
+"***.",
+"###.",
+"$$$.",
+
+"##$.",
+"##$.",
+"$$$.",
+
+"---.",
+"-  .",
+"-X .",
+
+"---.",
+"   .",
+"   .",
+
+"---.",
+"   .",
+"   .",
+
+"---.",
+"  X.",
+"   .",
+
+"---.",
+"###.",
+"#*#.",
+
+"---.",
+"X -.",
+"  -.",
+
+"-##.",
+"-#*.",
+"-##.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"*#*.",
+"###.",
+
+"###.",
+"#*#.",
+"###.",
+
+"###.",
+"*#*.",
+"###.",
+
+"##-.",
+"#*-.",
+"##-.",
+
+"-X .",
+"-  .",
+"-*&.",
+
+"* *.",
+"***.",
+"&*&.",
+
+"   .",
+"***.",
+"&&*.",
+
+"** .",
+"** .",
+"## .",
+
+"#*#.",
+"###.",
+"#*#.",
+
+"  -.",
+"  -.",
+"  -.",
+
+"-*&.",
+"-*#.",
+"-  .",
+
+"&*&.",
+"###.",
+"   .",
+
+"&&#.",
+"#*&.",
+" *&.",
+
+"#* .",
+"&**.",
+"&* .",
+
+"###.",
+"#*#.",
+"###.",
+
+"  -.",
+"  -.",
+"  -.",
+
+"-**.",
+"-**.",
+"-**.",
+
+"***.",
+"***.",
+"***.",
+
+" **.",
+" *&.",
+" *&.",
+
+"** .",
+"&* .",
+"&**.",
+
+"#*#.",
+"###.",
+"#*#.",
+
+"  -.",
+"  -.",
+"  -.",
+
+"-**.",
+"-  .",
+"---.",
+
+"***.",
+"***.",
+"---.",
+
+" *&.",
+" ##.",
+"---.",
+
+"&  .",
+"# X.",
+"---.",
+
+"###.",
+"#*#.",
+"---.",
+
+"  -.",
+"X -.",
+"---.",
+
+"---.",
+"- *.",
+"-**.",
+
+"*&&.",
+"*&&.",
+"*&#.",
+
+"&=-.",
+"#  .",
+"&==.",
+
+"---.",
+"= -.",
+" =-.",
+
+"-**.",
+"-**.",
+"-**.",
+
+"*&&.",
+"*&#.",
+"*&&.",
+
+"#**.",
+"&==.",
+"#**.",
+
+"= -.",
+"  -.",
+"* -.",
+
+"-**.",
+"-**.",
+"-**.",
+
+"*&#.",
+"*&&.",
+"*##.",
+
+"&*X.",
+"&X*.",
+"#**.",
+
+"* -.",
+"* -.",
+"* -.",
+
+"-**.",
+"-*#.",
+"---.",
+
+"###.",
+"###.",
+"---.",
+
+"###.",
+"###.",
+"---.",
+
+"# -.",
+"  -.",
+"---.",
+
+"+XX.",
+"XX*.",
+"XX*.",
+
+"XXX.",
+"%%%.",
+"%**.",
+
+"XX+.",
+"*X#.",
+"*X#.",
+
+"XX*.",
+"XX*.",
+"XX*.",
+
+"%%*.",
+"%**.",
+"%**.",
+
+"*X#.",
+"*X#.",
+"*X#.",
+
+"XXX.",
+"XX#.",
+"+++.",
+
+"XXX.",
+"X#X.",
+"+++.",
+
+"XX#.",
+"XXX.",
+"+++.",
+
+"++o.",
+"o#o.",
+"o#o.",
+
+"ooo.",
+"*%%.",
+"*%*.",
+
+"ooo.",
+"%*$.",
+"%*$.",
+
+"o#o.",
+"o#o.",
+"o#o.",
+
+"*%%.",
+"*%*.",
+"*%*.",
+
+"%*$.",
+"**$.",
+"**$.",
+
+"o#$.",
+"$$$.",
+"+++.",
+
+"$$$.",
+"$$$.",
+"+++.",
+
+"$$$.",
+"$$$.",
+"+++.",
+
+"+++.",
+"+ *.",
+"+**.",
+
+"+++.",
+"   .",
+"*  .",
+
+"+++.",
+" .&.",
+".==.",
+
+"+++.",
+"& +.",
+"=&+.",
+
+"+**.",
+"+**.",
+"+**.",
+
+"* ..",
+"* ..",
+"**..",
+
+".==.",
+".OO.",
+"&OO.",
+
+"=&+.",
+"=&+.",
+"=*+.",
+
+"+**.",
+"+**.",
+"+**.",
+
+"* &.",
+"**&.",
+"* &.",
+
+"&OO.",
+"&==.",
+"&==.",
+
+"=*+.",
+"=*+.",
+"=*+.",
+
+"+**.",
+"+ *.",
+"+++.",
+
+"* &.",
+"   .",
+"+++.",
+
+"***.",
+"**#.",
+"+++.",
+
+"*#+.",
+"# +.",
+"+++.",
+
+"+++.",
+"+ *.",
+"+oX.",
+
+"+++.",
+"   .",
+"*  .",
+
+"+++.",
+" .&.",
+".-o.",
+
+"+++.",
+"& +.",
+"=&+.",
+
+"+**.",
+"+Xo.",
+"+**.",
+
+"* ..",
+"X ..",
+"**..",
+
+".XX.",
+".OX.",
+"&XO.",
+
+"X&+.",
+"=&+.",
+"=*+.",
+
+"+oX.",
+"+**.",
+"+Xo.",
+
+"*+&.",
+"**&.",
+"*+&.",
+
+"&OX.",
+"&o=.",
+"&XX.",
+
+"X*+.",
+"-*+.",
+"=*+.",
+
+"+**.",
+"+ *.",
+"+++.",
+
+"* &.",
+"   .",
+"+++.",
+
+"***.",
+"**#.",
+"+++.",
+
+"*#+.",
+"# +.",
+"+++.",
+
+"---.",
+"-  .",
+"- &.",
+
+"-...",
+".##.",
+"&##.",
+
+"---.",
+"& ..",
+"&&&.",
+
+"..-.",
+"##&.",
+"##&.",
+
+"-&*.",
+"-**.",
+"- *.",
+
+"*&&.",
+"*# .",
+"&&&.",
+
+"***.",
+"***.",
+"&&&.",
+
+"&&-.",
+"# -.",
+"&&-.",
+
+"- *.",
+"-**.",
+"-**.",
+
+"&&X.",
+"&X&.",
+"&&&.",
+
+"&&&.",
+"&&&.",
+"&&&.",
+
+"&&-.",
+"&&-.",
+"&#-.",
+
+"-**.",
+"-*#.",
+"---.",
+
+"###.",
+"###.",
+"---.",
+
+"###.",
+"###.",
+"---.",
+
+"# -.",
+"  -.",
+"---.",
+
+"###.",
+"#@#.",
+"###.",
+
+"*#o.",
+"#oo.",
+"ooo.",
+
+"oo#.",
+"o#*.",
+"###.",
+
+"**#.",
+"*&#.",
+"###.",
+
+"oo*.",
+"o**.",
+"***.",
+
+"---.",
+"   .",
+"   .",
+
+"---.",
+"   .",
+"   .",
+
+"---.",
+"   .",
+"   .",
+
+"---.",
+"   .",
+"   .",
+
+"---.",
+"   .",
+"   .",
+
+"---.",
+"   .",
+"   .",
+
+"---.",
+"   .",
+"   .",
+
+"---.",
+"   .",
+"   .",
+
+"+++.",
+"+o+.",
+"+++.",
+
+"+++.",
+"+o+.",
+"+++.",
+
+"+++.",
+"+o+.",
+"+++.",
+
+"+++.",
+"+o+.",
+"+++.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"@@@.",
+"@XX.",
+"@XX.",
+
+"@@@.",
+"@XX.",
+"@XX.",
+
+"@@@.",
+"@XX.",
+"@XX.",
+
+"@@@.",
+"@XX.",
+"@XX.",
+
+"@@@.",
+"@XX.",
+"@XX.",
+
+"@@@.",
+"@XX.",
+"@XX.",
+
+"@@@.",
+"@XX.",
+"@XX.",
+
+"@@@.",
+"@XX.",
+"@XX.",
+
+"   .",
+" X .",
+"   .",
+
+"   .",
+" % .",
+"   .",
+
+"   .",
+" % .",
+"   .",
+
+" % .",
+"%%%.",
+" % .",
+
+" % .",
+"%%%.",
+" % .",
+
+"%#%.",
+"#%#.",
+"%#%.",
+
+"% %.",
+"#@#.",
+"% %.",
+
+"###.",
+"###.",
+"###.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"#@#.",
+"@@@.",
+"@#@.",
+
+"@@@.",
+"*@@.",
+"@*@.",
+
+"@@@.",
+"*@@.",
+"@*@.",
+
+"@@@.",
+"*@@.",
+"@*@.",
+
+"@@@.",
+"*@@.",
+"@*@.",
+
+"*@@.",
+"@*@.",
+"**@.",
+
+"*@@.",
+"@*@.",
+"**@.",
+
+"*@@.",
+"@*@.",
+"**@.",
+
+"*@@.",
+"@*@.",
+"**@.",
+
+"@@@.",
+"***.",
+"***.",
+
+"@@@.",
+"***.",
+"***.",
+
+"@@@.",
+"***.",
+"***.",
+
+"@@@.",
+"***.",
+"***.",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"@@@.",
+"**@.",
+"**@.",
+
+"---.",
+"*@*.",
+"@*@.",
+
+"---.",
+"*@*.",
+"@*@.",
+
+"---.",
+"*@*.",
+"@*@.",
+
+"---.",
+"*@*.",
+"@*@.",
+
+"---.",
+"@*-.",
+"**-.",
+
+"---.",
+"@*-.",
+"**-.",
+
+"---.",
+"@*-.",
+"**-.",
+
+"---.",
+"@*-.",
+"**-.",
+
+"---.",
+"  -.",
+"#*-.",
+
+"---.",
+"  -.",
+"#*-.",
+
+"---.",
+"  -.",
+"#*-.",
+
+"---.",
+"  -.",
+"#*-.",
+
+"#*@.",
+"#*@.",
+"#*@.",
+
+"#*@.",
+"#*@.",
+"#*@.",
+
+"#*@.",
+"#*@.",
+"#*@.",
+
+"#*@.",
+"#*@.",
+"#*@.",
+
+"&=-.",
+"#  .",
+"&==.",
+
+"&=-.",
+"#  .",
+"&==.",
+
+"&=-.",
+"#  .",
+"&==.",
+
+"&=-.",
+"#  .",
+"&==.",
+
+"---.",
+"= -.",
+" =-.",
+
+"---.",
+"= -.",
+" =-.",
+
+"---.",
+"= -.",
+" =-.",
+
+"---.",
+"= -.",
+" =-.",
+
+"#**.",
+"&==.",
+"#**.",
+
+"#**.",
+"&==.",
+"#**.",
+
+"#**.",
+"&==.",
+"#**.",
+
+"#**.",
+"&==.",
+"#**.",
+
+"= -.",
+"  -.",
+"* -.",
+
+"= -.",
+"  -.",
+"* -.",
+
+"= -.",
+"  -.",
+"* -.",
+
+"= -.",
+"  -.",
+"* -.",
+
+".XX.",
+".OO.",
+"&%O.",
+
+".XX.",
+".O%.",
+"&XO.",
+
+".XX.",
+".%X.",
+"&OO.",
+
+".XX.",
+".%O.",
+"&XO.",
+
+".XX.",
+".OO.",
+"&O%.",
+
+".XX.",
+".OO.",
+"&%X.",
+
+".XX.",
+".XO.",
+"&O%.",
+
+".XX.",
+".OO.",
+"&XO.",
+
+"&OX.",
+"&o=.",
+"&XX.",
+
+"&OO.",
+"&o=.",
+"&XX.",
+
+"&OO.",
+"&o=.",
+"&XX.",
+
+"&OO.",
+"&o=.",
+"&XX.",
+
+"&XO.",
+"&o=.",
+"&XX.",
+
+"&OO.",
+"&o=.",
+"&XX.",
+
+"&OO.",
+"&o=.",
+"&XX.",
+
+"&O%.",
+"&o=.",
+"&XX.",
+
+"###.",
+"#&*.",
+"#**.",
+
+"***.",
+"**o.",
+"*oo.",
+
+"ooo.",
+"oo#.",
+"o#*.",
+
+"#*#.",
+"##o.",
+"#oo.",
+
+"&&X.",
+"&X&.",
+"&&&.",
+
+"&&X.",
+"&X&.",
+"&&&.",
+
+"&&X.",
+"&X&.",
+"&&&.",
+
+"&&X.",
+"&X&.",
+"&&&.",
+
+"   .",
+"   .",
+"   .",
+
+"   .",
+"   .",
+"   .",
+
+"   .",
+"   .",
+"   .",
+
+"   .",
+"   .",
+"   ."};
diff --git a/manual/Ask.html b/manual/Ask.html
new file mode 100644 (file)
index 0000000..ab610b8
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Micropolis Query Window</title></head><body>
+<h1>Micropolis Query Window</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Budget.Cancel.html b/manual/Budget.Cancel.html
new file mode 100644 (file)
index 0000000..fc88e5b
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Cancel Changes and Continue</title></head><body>
+<h1>Cancel Changes and Continue</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Budget.Collected.html b/manual/Budget.Collected.html
new file mode 100644 (file)
index 0000000..f922e8f
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Taxes Collected</title></head><body>
+<h1>Taxes Collected</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Budget.Continue.html b/manual/Budget.Continue.html
new file mode 100644 (file)
index 0000000..1004cef
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Continue With These Figures</title></head><body>
+<h1>Continue With These Figures</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Budget.Police.html b/manual/Budget.Police.html
new file mode 100644 (file)
index 0000000..7315172
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Police Fund</title></head><body>
+<h1>Police Fund</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Budget.Previous.html b/manual/Budget.Previous.html
new file mode 100644 (file)
index 0000000..0a5bce2
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Previous Funds</title></head><body>
+<h1>Previous Funds</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Budget.Road.html b/manual/Budget.Road.html
new file mode 100644 (file)
index 0000000..a955c1a
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Road Fund</title></head><body>
+<h1>Road Fund</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Budget.html b/manual/Budget.html
new file mode 100644 (file)
index 0000000..740fe06
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Micropolis Budget Window</title></head><body>
+<h1>Micropolis Budget Window</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Disaster.No.html b/manual/Disaster.No.html
new file mode 100644 (file)
index 0000000..bc62cb1
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Don't Cause a Disaster</title></head><body>
+<h1>Don't Cause a Disaster</h1>
+Press this button to avoid causing a disaster.
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Disaster.Yes.html b/manual/Disaster.Yes.html
new file mode 100644 (file)
index 0000000..3a6f8bf
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Cause a Disaster</title></head><body>
+<h1>Cause a Disaster</h1>
+Press this button to cause a disaster.
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.BuildPie.html b/manual/Editor.BuildPie.html
new file mode 100644 (file)
index 0000000..f695ab1
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Editor Tool Build Pie Menu</title></head><body>
+<h1>Editor Tool Build Pie Menu</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.Options.html b/manual/Editor.Options.html
new file mode 100644 (file)
index 0000000..4b80586
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Editor Options Menu</title></head><body>
+<h1>Editor Options Menu</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.ToolChalk.html b/manual/Editor.ToolChalk.html
new file mode 100644 (file)
index 0000000..97bfa8a
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Chalk Tool Icon</title></head><body>
+<h1>Chalk Tool Icon</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.ToolInd.html b/manual/Editor.ToolInd.html
new file mode 100644 (file)
index 0000000..9c947e1
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Industrial Zone Tool Icon</title></head><body>
+<h1>Industrial Zone Tool Icon</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.ToolName.html b/manual/Editor.ToolName.html
new file mode 100644 (file)
index 0000000..479b128
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Editor Tool Name</title></head><body>
+<h1>Editor Tool Name</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.ToolNuclear.html b/manual/Editor.ToolNuclear.html
new file mode 100644 (file)
index 0000000..fcbb715
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Nuclear Power Plant Tool Icon</title></head><body>
+<h1>Nuclear Power Plant Tool Icon</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.ToolPie.html b/manual/Editor.ToolPie.html
new file mode 100644 (file)
index 0000000..7d8b8e3
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Editor Tool Pie Menu</title></head><body>
+<h1>Editor Tool Pie Menu</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.ToolQuery.html b/manual/Editor.ToolQuery.html
new file mode 100644 (file)
index 0000000..5e354bb
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Query Tool Icon</title></head><body>
+<h1>Query Tool Icon</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.ToolRail.html b/manual/Editor.ToolRail.html
new file mode 100644 (file)
index 0000000..3db7153
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Rail Tool Icon</title></head><body>
+<h1>Rail Tool Icon</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.ToolRes.html b/manual/Editor.ToolRes.html
new file mode 100644 (file)
index 0000000..eff0a6e
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Residential Zone Tool Icon</title></head><body>
+<h1>Residential Zone Tool Icon</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.ToolSeaport.html b/manual/Editor.ToolSeaport.html
new file mode 100644 (file)
index 0000000..4b78737
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Seaport Tool Icon</title></head><body>
+<h1>Seaport Tool Icon</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.ToolStadium.html b/manual/Editor.ToolStadium.html
new file mode 100644 (file)
index 0000000..cbfd3a0
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Stadium Tool Icon</title></head><body>
+<h1>Stadium Tool Icon</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.ToolWire.html b/manual/Editor.ToolWire.html
new file mode 100644 (file)
index 0000000..5697548
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Wire Tool Icon</title></head><body>
+<h1>Wire Tool Icon</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.View.html b/manual/Editor.View.html
new file mode 100644 (file)
index 0000000..82b1a82
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Editor View</title></head><body>
+<h1>Editor View</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Editor.html b/manual/Editor.html
new file mode 100644 (file)
index 0000000..9395267
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Micropolis Editor Window</title></head><body>
+<h1>Micropolis Editor Window</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Evaluation.Dismiss.html b/manual/Evaluation.Dismiss.html
new file mode 100644 (file)
index 0000000..e494022
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Dismiss Evaluation Window Button</title></head><body>
+<h1>Dismiss Evaluation Window Button</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Evaluation.GoodJob.html b/manual/Evaluation.GoodJob.html
new file mode 100644 (file)
index 0000000..83e2ac7
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Are You Doing a Good Job?</title></head><body>
+<h1>Are You Doing a Good Job?</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Evaluation.Statistics.html b/manual/Evaluation.Statistics.html
new file mode 100644 (file)
index 0000000..b78ddff
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Statistics</title></head><body>
+<h1>Statistics</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Evaluation.html b/manual/Evaluation.html
new file mode 100644 (file)
index 0000000..92f77d9
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Micropolis Evaluation Window</title></head><body>
+<h1>Micropolis Evaluation Window</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/File.Cancel.html b/manual/File.Cancel.html
new file mode 100644 (file)
index 0000000..cacc692
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Cancel File Chooser</title></head><body>
+<h1>Cancel File Chooser</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/File.Directory.html b/manual/File.Directory.html
new file mode 100644 (file)
index 0000000..ec5d4c1
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Directory Name</title></head><body>
+<h1>Directory Name</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/File.OK.html b/manual/File.OK.html
new file mode 100644 (file)
index 0000000..18793f5
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>OK Button</title></head><body>
+<h1>OK Button</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/File.html b/manual/File.html
new file mode 100644 (file)
index 0000000..7cbff1b
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Micropolis File Chooser Window</title></head><body>
+<h1>Micropolis File Chooser Window</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Frob.Dismiss.html b/manual/Frob.Dismiss.html
new file mode 100644 (file)
index 0000000..cd28b8e
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Frob Dismiss Button</title></head><body>
+<h1>Frob Dismiss Button</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Frob.html b/manual/Frob.html
new file mode 100644 (file)
index 0000000..4d6dfef
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Micropolis Frob Window</title></head><body>
+<h1>Micropolis Frob Window</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Graph.120Years.html b/manual/Graph.120Years.html
new file mode 100644 (file)
index 0000000..183db3c
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Graph 120 Year Scale</title></head><body>
+<h1>Graph 120 Year Scale</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Graph.Com.html b/manual/Graph.Com.html
new file mode 100644 (file)
index 0000000..957e017
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Graph Commercial Toggle</title></head><body>
+<h1>Graph Commercial Toggle</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Graph.Dismiss.html b/manual/Graph.Dismiss.html
new file mode 100644 (file)
index 0000000..f51b8ef
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Dismiss Graph Window Button</title></head><body>
+<h1>Dismiss Graph Window Button</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Graph.Money.html b/manual/Graph.Money.html
new file mode 100644 (file)
index 0000000..5813024
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Graph Cash Flow Toggle</title></head><body>
+<h1>Graph Cash Flow Toggle</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Graph.Pollution.html b/manual/Graph.Pollution.html
new file mode 100644 (file)
index 0000000..f1ba861
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Graph Pollution Toggle</title></head><body>
+<h1>Graph Pollution Toggle</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Graph.html b/manual/Graph.html
new file mode 100644 (file)
index 0000000..841ce5a
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Micropolis Graph Window</title></head><body>
+<h1>Micropolis Graph Window</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Head.Demand.html b/manual/Head.Demand.html
new file mode 100644 (file)
index 0000000..4efd4da
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Res Com Ind Demand Gauge</title></head><body>
+<h1>Res Com Ind Demand Gauge</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Head.Entry.html b/manual/Head.Entry.html
new file mode 100644 (file)
index 0000000..3842845
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Text Entry Field</title></head><body>
+<h1>Text Entry Field</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Head.Funds.html b/manual/Head.Funds.html
new file mode 100644 (file)
index 0000000..eab2a2a
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Micropolis Funds Display</title></head><body>
+<h1>Micropolis Funds Display</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Head.OptionsMenu.html b/manual/Head.OptionsMenu.html
new file mode 100644 (file)
index 0000000..486551f
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Options Menu</title></head><body>
+<h1>Options Menu</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Head.Scrollbar.html b/manual/Head.Scrollbar.html
new file mode 100644 (file)
index 0000000..c70de8c
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Message Log Scrollbar</title></head><body>
+<h1>Message Log Scrollbar</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Head.TimeMenu.html b/manual/Head.TimeMenu.html
new file mode 100644 (file)
index 0000000..26922bc
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Time Menu</title></head><body>
+<h1>Time Menu</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Head.WindowsMenu.html b/manual/Head.WindowsMenu.html
new file mode 100644 (file)
index 0000000..3188969
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Windows Menu</title></head><body>
+<h1>Windows Menu</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Head.html b/manual/Head.html
new file mode 100644 (file)
index 0000000..42a70a2
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Micropolis Controls Window</title></head><body>
+<h1>Micropolis Controls Window</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Help.Dismiss.html b/manual/Help.Dismiss.html
new file mode 100644 (file)
index 0000000..e38abab
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Help Dismiss Button</title></head><body>
+<h1>Help Dismiss Button</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Help.Scrollbar.html b/manual/Help.Scrollbar.html
new file mode 100644 (file)
index 0000000..d8d8c33
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Help Text Scrollbar</title></head><body>
+<h1>Help Text Scrollbar</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Help.html b/manual/Help.html
new file mode 100644 (file)
index 0000000..2c54af5
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Micropolis Help Window</title></head><body>
+<h1>Micropolis Help Window</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Map.Zones.html b/manual/Map.Zones.html
new file mode 100644 (file)
index 0000000..717d764
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Map Zones Menu</title></head><body>
+<h1>Map Zones Menu</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Map.html b/manual/Map.html
new file mode 100644 (file)
index 0000000..96e926f
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Micropolis Map Window</title></head><body>
+<h1>Micropolis Map Window</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Notice.Text.html b/manual/Notice.Text.html
new file mode 100644 (file)
index 0000000..057dd87
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Notice Text</title></head><body>
+<h1>Notice Text</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Notice.View.html b/manual/Notice.View.html
new file mode 100644 (file)
index 0000000..ed41c14
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Notice Map View</title></head><body>
+<h1>Notice Map View</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Notice.html b/manual/Notice.html
new file mode 100644 (file)
index 0000000..53af170
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Micropolis Notice Window</title></head><body>
+<h1>Micropolis Notice Window</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Plan.Goto.html b/manual/Plan.Goto.html
new file mode 100644 (file)
index 0000000..276b49f
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Goto Plan</title></head><body>
+<h1>Goto Plan</h1>
+Press this button to scroll your editor window to the planned location.
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Plan.Support.html b/manual/Plan.Support.html
new file mode 100644 (file)
index 0000000..c7733da
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Support Plan</title></head><body>
+<h1>Support Plan</h1>
+Press this vote button to support the plan.
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Plan.Veto.html b/manual/Plan.Veto.html
new file mode 100644 (file)
index 0000000..264fdb5
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Veto Plan</title></head><body>
+<h1>Veto Plan</h1>
+Press this button to veto the plan.
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Player.Display.html b/manual/Player.Display.html
new file mode 100644 (file)
index 0000000..1807840
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Display of Player to Add</title></head><body>
+<h1>Display of Player to Add</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Player.html b/manual/Player.html
new file mode 100644 (file)
index 0000000..dbf110b
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Micropolis Player Window</title></head><body>
+<h1>Micropolis Player Window</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Quit.AllQuit.html b/manual/Quit.AllQuit.html
new file mode 100644 (file)
index 0000000..0157afa
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Everyone Quit Micropolis</title></head><body>
+<h1>Everyone Quit Micropolis</h1>
+Press this vote button to quit Micropolis if everyone else agrees.
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Quit.IQuit.html b/manual/Quit.IQuit.html
new file mode 100644 (file)
index 0000000..fd8144c
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Really Quit Micropolis</title></head><body>
+<h1>Really Quit Micropolis</h1>
+Press this button to quit playing this game of Micropolis.
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Quit.IResign.html b/manual/Quit.IResign.html
new file mode 100644 (file)
index 0000000..8bb4bfd
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Resign Micropolis</title></head><body>
+<h1>Resign Micropolis</h1>
+Press this button to resign yourself from this game of Micropolis.
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Quit.No.html b/manual/Quit.No.html
new file mode 100644 (file)
index 0000000..c4cea14
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Keep Playing Micropolis</title></head><body>
+<h1>Keep Playing Micropolis</h1>
+Press this button to continue playing this game of Micropolis.
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/README b/manual/README
new file mode 100644 (file)
index 0000000..1fc17bd
--- /dev/null
@@ -0,0 +1,64 @@
+This is the documentation for Micropolis. 
+The index is in "index.html".
+The other html files are help files, which are not finished yet. 
+
+===
+
+Micropolis, Unix Version.  This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+  http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <http://www.gnu.org/licenses/>.
+
+            ADDITIONAL TERMS per GNU GPL Section 7
+
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+
+This disclaimer supplements the one included in the General Public
+License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.
diff --git a/manual/Scenario.Bern.html b/manual/Scenario.Bern.html
new file mode 100644 (file)
index 0000000..019ac88
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Bern Scenario Button</title></head><body>
+<h1>Bern Scenario Button</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Scenario.Detroit.html b/manual/Scenario.Detroit.html
new file mode 100644 (file)
index 0000000..8114a31
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Detroit Scenario Button</title></head><body>
+<h1>Detroit Scenario Button</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Scenario.LoadCity.html b/manual/Scenario.LoadCity.html
new file mode 100644 (file)
index 0000000..24e17cd
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Load City Button</title></head><body>
+<h1>Load City Button</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Scenario.Name.html b/manual/Scenario.Name.html
new file mode 100644 (file)
index 0000000..045d358
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>City Name Entry Field</title></head><body>
+<h1>City Name Entry Field</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Scenario.Rio.html b/manual/Scenario.Rio.html
new file mode 100644 (file)
index 0000000..4557180
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Rio de Janeiro Scenario Button</title></head><body>
+<h1>Rio de Janeiro Scenario Button</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Scenario.SanFran.html b/manual/Scenario.SanFran.html
new file mode 100644 (file)
index 0000000..7c263b3
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>San Francisco Scenario Button</title></head><body>
+<h1>San Francisco Scenario Button</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Scenario.Use.html b/manual/Scenario.Use.html
new file mode 100644 (file)
index 0000000..8351f0b
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Use This Map Button</title></head><body>
+<h1>Use This Map Button</h1>
+Press this button to start playing with this map.
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Scenario.html b/manual/Scenario.html
new file mode 100644 (file)
index 0000000..863f255
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Micropolis Chooser Window</title></head><body>
+<h1>Micropolis Chooser Window</h1>
+
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/SelectCity.No.html b/manual/SelectCity.No.html
new file mode 100644 (file)
index 0000000..03f2e9a
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Keep Playing</title></head><body>
+<h1>Keep Playing</h1>
+Press this button to keep playing with the current city simulation.
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/SelectCity.Yes.html b/manual/SelectCity.Yes.html
new file mode 100644 (file)
index 0000000..f3d07fb
--- /dev/null
@@ -0,0 +1,77 @@
+<head><title>Another City</title></head><body>
+<h1>Another City</h1>
+Press this vote button to abandon this city and choose another one to play with.
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/Window.html b/manual/Window.html
new file mode 100644 (file)
index 0000000..0c35d8d
--- /dev/null
@@ -0,0 +1,78 @@
+<head><title>Micropolis Window</title></head><body>
+<h1>Micropolis Window</h1>
+This is one of Micropolis's windows.
+Press Help or Meta-Click on the other controls and graphics for more information about them.
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/bibliography.html b/manual/bibliography.html
new file mode 100644 (file)
index 0000000..aa0d819
--- /dev/null
@@ -0,0 +1,172 @@
+<head><title>Bibliography</title></head><body>
+
+<h1>Bibliography</h1>
+
+<h2>City Planning Bibliography</h2>
+
+<ul>
+
+<li>Boyer, R., and D. Savageau. Places Rated Almanac. Chicago: Rand
+McNally & Co., 1986.
+
+<li>Callenbach, Ernest. Ecotopia. Berkeley: Banyan Tree Books, 1975.
+
+<li>Choay, Francoise. The Modern City: Planning in the 19th Century.
+New York: George Braziller, 1969.
+
+<li>Clark, David. Urban Geography. Baltimore: The Johns Hopkins
+University Press, 1982.
+
+<li>Clay, Grady. Close-Up, How to Read the American City. Chicago: The
+University of Chicago Press, 1980.
+
+<li>Gallion, A., and S. Eisner. The Urban Pattern. New York: Van
+Nostrand Reinhold Company, 1986.
+
+<li>Greenburg, M., D. Krueckeberg, and C. Michaelson. Local population
+and Employment Projection Techniques. New Brunswick: Center for Urban
+Policy Research, 1987.
+
+<li>Hoskin, Frank P. The Language of Cities. Cambridge: Schenkman
+Publishing Company, 1972.
+
+<li>Jacobs, Jane. The Death and Life of Great American Cities. New
+York: John Wiley & Sons, 1974.
+
+<li>Le Corbusier. The City of Tomorrow and Its Planning. New York:
+Dover Publications, Inc., 1987.
+
+<li>Lynch, Kevin. A Theory of Good City Form. Cambridge: MIT Press,
+1981.
+
+<li>Register, Richard. Ecocity Berkeley. Berkeley: North Atlantic
+Books, 1987
+
+<li>Planning: The magazine of the American Planning Association.
+1313 E. 60th St. Chicago, IL 60637.
+
+</ul>
+
+<h2>Related Reading for Children</h2>
+
+<h3>Fiction</h3>
+
+<ul>
+
+<li>Burton, Virginia Lee. The Little House. Boston: Houghton Mifflin,
+1942 (reissued 1969).
+
+<li>Murphy, Shirley, and Murphy, Pat. Mrs. Tortino's Return to the
+Sun. Shepard Books, 1980.
+
+<li>Dr. Seuss. The Lorax. New Youk: Random House, 1971.
+
+</ul>
+
+<h3>Nonfiction</h3>
+
+<ul>
+
+<li>Barker, Albert. From Settlement to City. New York: Julian Messner,
+1978.
+
+<li>Eichner, James A. The First Book of Local Government. New York:
+Franklin Watts, 1976.
+
+<li>Macaulay, David. City: A Story of Roman Planning and Construction.
+Boston: Houghton Mifflin, 1974.
+
+<li>Macaulay, David. Underground. Boston: Houghton Mifflin, 1976.
+
+<li>Monroe, Roxie. Artchitects Make Zigzags: Looking at Architecture
+from A to Z. Washington D.C.: National Trust for Historic
+Preservation, 1986.
+
+<li>Rhodes, Dorthy. How to Read a City Map. Chicago: Elk Grove Press,
+1967.
+
+</ul>
+
+For information on city planning and related subjects, contact:
+<p>
+<blockquote>
+American Planning Association <p>
+Planners Bookstore <p>
+1313 E. 60th St. Chicago, IL 60637 <p>
+(312) 955-9100 <p>
+</blockquote>
+<p>
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/credits.html b/manual/credits.html
new file mode 100644 (file)
index 0000000..c322247
--- /dev/null
@@ -0,0 +1,114 @@
+<head><title>Credits</title></head><body>
+
+<h1>Credits</h1>
+
+<ul>
+
+<li>Unix Implementation, User Interface, Graphics and Multi-Player Game Design:
+Don Hopkins
+
+<li>TCL/Tk Scripting Language and Toolkit: John Ousterhout (Scriptics).
+
+<li>HyperLook User Interface System:
+Arthur van Hoff, Doug Scoular, Don Hopkins (The Turing Institute, Ltd.)
+
+<li>Original Micropolis Concept and Design:
+Will Wright (Maxis Software)
+
+<li>Contributors to Design:
+Don Hopkins, Arthur van Hoff, Jeff Braun, Robert Strobel, Brian Witt
+
+<li>Graphic Artwork:
+Don Bayless, Will Wright, Scott Martindale, Don Hopkins
+
+<li>Documentation:
+Michael Bremer, Cliff Ellis, Akila Redmer, Tom Bentlery, Will Wright, Don Hopkins
+
+<li>Sounds:
+Will Wright, Steve Hales, Don Hopkins
+
+<li>City Scenarios:
+Jonathan Trachtenberg, Brett G. Durrett
+
+<li>Special Thanks to:
+Will Wright, Lucy Bradshaw, Upmanu Lall, 
+Arthur van Hoff, Dug Scoular, Marcel van Vuure, Bob Adams, Carol
+Adams, Rafael Bracho, Josh Siegel, John Gilmore, Tim Niblett,
+Maxis, Dux Software, The Turing Institute, HyperNeWS Fund Contributers
+
+</ul>
+
+Software and Manual Copyright (C) 2002 by Electronic Arts.
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/history.html b/manual/history.html
new file mode 100644 (file)
index 0000000..2ed2d93
--- /dev/null
@@ -0,0 +1,640 @@
+<head><title>History Of Cities And City Planning</title></head><body>
+
+<h1>History Of Cities And City Planning</h1>
+
+<h1>By Cliff Ellis</h1>
+
+<h2>Introduction</h2>
+
+The building of cities has a long and complex history. Although city
+planning as an organized profession has existed for less than a
+century, all cities display various degrees of forethought and
+conscious design in their layout and functioning.  <p>
+
+Early humans led a nomadic existence, relying on hunting and gathering
+for sustenance. Between 8,000 and 10,000 years ago, systematic
+cultivation of plants and the domestication of animals allowed for
+more permanent settlements. During the fourth millennium B.C., the
+requirements for the "urban revolution" were finally met: the
+production of a surplus of storable food, a system of writing, a more
+complex social organization, and technological advances such as the
+plough, potter's wheel, loom, and metallurgy.  <p>
+
+Cities exist for many reasons, and the diversity of urban forms can be
+traced to the complex functions that cities perform. Cities serve as
+centers of storage, trade, and manufacture. The agricultural surplus
+from the surrounding countryside is processed and distributed in
+cities. Cities also grew up around marketplaces, where goods from
+distant places could be exchanged for local products. Throughout
+history, cities have been founded at the intersections of
+transportation routes, or at points where goods must shift from one
+mode of transportation to another, as at river and ocean ports.  <p>
+
+Religious elements have been crucial throughout urban history. Ancient
+peoples had sacred places, often associated with cemeteries or
+shrines, around which cities grew. Ancient cities usually had large
+temple precincts with monumental religious buildings. Many medieval
+cities were built near monasteries and cathedrals.  <p>
+
+Cities often provide protection in a precarious world. During attacks,
+the rural populace could flee behind city walls, where defence forces
+assembled to repel the enemy. The wall served this purpose for
+millennia, until the invention of heavy artillery rendered walls
+useless in warfare. With the advent of modern aerial warfare, cities
+have become prime targets for destruction rather than safe havens.
+<p>
+
+Cities serve as centers of government. In particular, the emergence of
+the great nation-states of Europe between 1400 and 1800 led to the
+creation of new capital cities or the investing of existing cities
+with expanded governmental functions.  <p>
+
+Washington, D.C., for example, displays the monumental buildings,
+radial street pattern, and large public spaces typical of capital
+cities.  <p>
+
+Cities, with their concentration of talent, mixture of peoples, and
+economic surplus, have provided a fertile ground for the evolution of
+human culture: the arts, scientific research, and technical
+innovation. They serve as centers of communication, where new ideas
+and information are spread to the surrounding territory and to foreign
+lands.  <p>
+
+<h2>Constraints on City Form</h2>
+
+Cities are physical artifacts inserted into a preexisting natural
+world, and natural constraints must be respected if a settlement is to
+survive and prosper. Cities must conform to the landscape in which
+they are located, although technologies have gradually been developed
+to reorganize the land to suit human purposes. Moderately sloping land
+provides the best urban site, but spectacular effects have been
+achieved on hilly sites such as San Francisco, Rio de Janeiro, and
+Athens.  <p>
+
+Climate influences city form. For example, streets have been aligned
+to take advantage of cooling breezes, and arcades designed to shield
+pedestrians from sun and rain. The architecture of individual
+buildings often reflects adaptations to temperature, rainfall, snow,
+wind and other climatic characteristics.  <p>
+
+Cities must have a healthy water supply, and locations along rivers
+and streams, or near underground watercourses, have always been
+favored. Many large modern cities have outgrown their local water
+supplies and rely upon distant water sources diverted by elaborate
+systems of pipes and canals.  <p>
+
+City location and internal structure have been profoundly influenced
+by natural transportation routes. Cities have often been sited near
+natural harbors, on navigable rivers, or along land routes determined
+by regional topography.  <p>
+
+Finally, cities have had to survive periodic natural disasters such as
+earthquakes, hurricanes, tornados, and floods. The San Francisco
+earthquake of 1906 demonstrated how natural forces can undo decades of
+human labor in a very short time.  <p>
+
+<h2>Elements of Urban Structure</h2>
+
+City planners must weave a complex, ever-changing array of elements
+into a working whole: that is the perennial challenge of city
+planning. The physical elements of the city can be divided into three
+categories: networks, buildings, and open spaces. Many alternative
+arrangements of these components have been tried throughout history,
+but no ideal city form has ever been agreed upon. Lively debates about
+the best way to arrange urban anatomies continue to rage, and show no
+signs of abating.  <p>
+
+<h3>Networks</h3>
+
+Every modern city contains an amazing array of pathways to carry flows
+of people, goods, water, energy, and information. Transportation
+networks are the largest and most visible of these. Ancient cities
+relied on streets, most of them quite narrow by modern standards, to
+carry foot traffic and carts. The modern city contains a complex
+hierarchy of transportation channels, ranging from ten-lane freeways
+to sidewalks. In the United States, the bulk of trips are carried by
+the private automobile, with mass transit a distant second. American
+cities display the low-density sprawl characteristic of auto-centered
+urban development. In contrast, many European cities have the high
+densities necessary to support rail transit.  <p>
+
+Modern cities rely on complex networks of utilities. When cities were
+small, obtaining pure water and disposing of wastes was not a major
+problem, but cities with large populations and high densities require
+expensive public infrastructure. During the nineteenth century, rapid
+urban growth and industrialization caused overcrowding, pollution, and
+disease in urban areas. After the connection between impure water and
+disease was established, American and European cities began to install
+adequate sewer and water systems. Since the late nineteenth century,
+cities have also been laced with wires and conduits carrying
+electricity, gas, and communications signals.  <p>
+
+<h3>Buildings</h3>
+
+Buildings are the most visible elements of the city, the features that
+give each city its unique character. Residential structures occupy
+almost half of all urban land, with the building types ranging from
+scattered single-family homes to dense high-rise apartments.
+Commercial buildings are clustered downtown and at various subcenters,
+with skyscrapers packed into the central business district and
+low-rise structures prevailing elsewhere, although tall buildings are
+becoming more common in the suburbs. Industrial buildings come in many
+forms ranging from large factory complexes in industrial districts to
+small workshops.  <p>
+
+City planners engage in a constant search for the proper arrangement
+of these different types of land use, paying particular attention to
+the compatibility of different activities, population densities,
+traffic generation, economic efficiency, social relationships, and the
+height and bulk of buildings.  <p>
+
+<h3>Open Spaces</h3>
+
+Open space is sometimes treated as a leftover, but it contributes
+greatly to the quality of urban life. "Hard" spaces such as plazas,
+malls, and courtyards provide settings for public activities of all
+kinds. "Soft" spaces such as parks, gardens, lawns, and nature
+preserves provide essential relief from harsh urban conditions and
+serve as space for recreational activities. These "amenities"
+increasingly influence which cities will be perceived as desirable
+places to live.  <p>
+
+<h2>Evolution of Urban Form</h2>
+
+The first true urban settlements appeared around 3,000 B.C. in ancient
+Mesopotamia, Egypt, and the Indus Valley. Ancient cities displayed
+both "organic" and "planned" types of urban form. These societies had
+elaborate religious, political, and military hierarchies. Precincts
+devoted to the activities of the elite were often highly planned and
+regular in form. In contrast, residential areas often grew by a slow
+process of accretion, producing complex, irregular patterns that we
+term "organic." Two typical features of the ancient city are the wall
+and the citadel: the wall for defense in regions periodically swept by
+conquering armies, and the citadel -- a large, elevated precinct
+within the city -- devoted to religious and state functions.  <p>
+
+Greek cities did not follow a single pattern. Cities growing slowly
+from old villages often had an irregular, organic form, adapting
+gradually to the accidents of topography and history. Colonial cities,
+however, were planned prior to settlement using the grid system. The
+grid is easy to lay out, easy to comprehend, and divides urban land
+into uniform rectangular lots suitable for development.  <p>
+
+The Romans engaged in extensive city-building activities as they
+consolidated their empire. Rome itself displayed the informal
+complexity created by centuries of organic growth, although particular
+temple and public districts were highly planned. In contrast, the
+Roman military and colonial towns were laid out in a variation of the
+grid. Many European cities, like London and Paris, sprang from these
+Roman origins.  <p>
+
+We usually associate medieval cities with narrow winding streets
+converging on a market square with a cathedral and city hall. Many
+cities of this period display this pattern, the product of thousands
+of incremental additions to the urban fabric. However, new towns
+seeded throughout undeveloped regions of Europe were based upon the
+familiar grid. In either case, large encircling walls were built for
+defense against marauding armies; new walls enclosing more land were
+built as the city expanded and outgrew its former container.  <p>
+
+During the Renaissance, architects began to systematically study the
+shaping of urban space, as though the city itself were a piece of
+architecture that could be given an aesthetically pleasing and
+functional order. Many of the great public spaces of Rome and other
+Italian cities date from this era. Parts of old cities were rebuilt to
+create elegant squares, long street vistas, and symmetrical building
+arrangements. Responding to advances in firearms during the fifteenth
+century, new city walls were designed with large earthworks to deflect
+artillery, and star-shaped points to provide defenders with sweeping
+lines of fire. Spanish colonial cities in the New World were built
+according to rules codified in the Laws of the Indies of 1573,
+specifying an orderly grid of streets with a central plaza, defensive
+wall, and uniform building style.  <p>
+
+We associate the baroque city with the emergence of great
+nation-states between 1600 and 1750. Ambitious monarchs constructed
+new palaces, courts, and bureaucratic offices. The grand scale was
+sought in urban public spaces: long avenues, radial street networks,
+monumental squares, geometric parks and gardens. Versailles is a clear
+expression of this city-building model; Washington, D.C. is an example
+from the United States. Baroque principles of urban design were used
+by Baron Haussmann in his celebrated restructuring of Paris between
+1853 and 1870. Haussmann carved broad new thoroughfares through the
+tangled web of old Parisian streets, linking major subcenters of the
+city with one another in a pattern which has served as a model for
+many other modernization plans.  <p>
+
+Toward the latter half of the eighteenth century, particularly in
+America, the city as a setting for commerce assumed primacy. The
+buildings of the bourgeoisie expand along with their owners'
+prosperity: banks, office buildings, warehouses, hotels, and small
+factories. New towns founded during this period were conceived as
+commercial enterprises, and the neutral grid was the most effective
+means to divide land up into parcels for sale. The city became a
+checkerboard on which players speculated on shifting land values. No
+longer would religious, political, and cultural imperatives shape
+urban development; rather, the market would be allowed to determine
+the pattern of urban growth. New York, Philadelphia, and Boston around
+1920 exemplify the commercial city of this era, with their bustling,
+mixed-use waterfront districts.  <p>
+
+<h2>Transition to the Industrial City</h2>
+
+Cities have changed more since the Industrial Revolution than in all
+the previous centuries of their existence. New York had a population
+of about 313,000 in 1840 but had reached 4,767,000 in 1910. Chicago
+exploded from 4.000 to 2,185,000 during the same period. Millions of
+rural dwellers no longer needed on farms flocked to the cities, where
+new factories churned out products for the new markets made accessible
+by railroads and steamships. In the United States, millions of
+immigrants from Europe swelled the urban populations. Increasingly,
+urban economies were being woven more rightly into the national and
+international economies.  <p>
+
+Technological innovations poured forth, many with profound impacts on
+urban form. Railroad tracks were driven into the heart of the city.
+Internal rail transportation systems greatly expanded the radius of
+urban settlement: horsecars beginning in the 1830s, cable cars in the
+1870s, and electric trolleys in the 1880s. In the 1880s, the first
+central power plants began providing electrical power to urban areas.
+The rapid communication provided by the telegraph and the telephone
+allowed formerly concentrated urban activities to disperse across a
+wider field.  <p>
+
+The industrial city still focused on the city center, which contained
+both the central business district, defined by large office buildings,
+and substantial numbers of factory and warehouse structures. Both
+trolleys and railroad systems converged on the center of the city,
+which boasted the premier entertainment and shopping establishments.
+The working class lived in crowded districts close to the city center,
+near their place of employment.  <p>
+
+Early American factories were located outside of major cities along
+rivers which provided water power for machinery. After steam power
+became widely available in the 1930s, factories could be located
+within the city in proximity to port facilities, rail lines, and the
+urban labor force. Large manufacturing zones emerged within the major
+northeastern and midwestern cities such as Pittsburgh, Detroit, and
+Cleveland. But by the late nineteenth century, factory
+decentralization had already begun, as manufacturers sought larger
+parcels of land away from the congestion of the city. Gary, Indiana,
+for example, was founded in 1906 on the southern shore of Lake
+Michigan by the United States Steel Company.  <p>
+
+The increasing crowding, pollution, and disease in the central city
+produced a growing desire to escape to a healthier environment in the
+suburbs. The upper classes had always been able to retreat to homes in
+the countryside. Beginning in the 1830s, commuter railroads enabled
+the upper middle class to commute in to the city center. Horsecar
+lines were built in many cities between the 1830s and 1880s, allowing
+the middle class to move out from the central cities into more
+spacious suburbs. Finally, during the 1890s electric trolleys and
+elevated rapid transit lines proliferated, providing cheap urban
+transportation for the majority of the population.  <p>
+
+The central business district of the city underwent a radical
+transformation with the development of the skyscraper between 1870 and
+1900. These tall buildings were not technically feasible until the
+invention of the elevator and steel-frame construction methods.
+Skyscrapers reflect the dynamics of the real estate market; the tall
+building extracts the maximum economic value from a limited parcel of
+land. These office buildings housed the growing numbers of
+white-collar employees in banking, finance, management, and business
+services, all manifestations of the shift from an economy of small
+firms to one of large corporations.  <p>
+
+<h3>The Form of the Modern City
+in the Age of the Automobile</h3>
+
+The city of today may be divided into two parts: <p>
+
+<ul>
+
+<li>An inner zone, coextensive with the boundaries of the old industrial city.
+
+<li>Suburban areas, dating from the 1920s, which have been designed for the automobile from the beginning.
+
+</ul>
+
+The central business districts of American cities have become centers
+of information processing, finance, and administration rather than
+manufacturing. White-collar employees in these economic sectors
+commute in from the suburbs on a network of urban freeways built
+during the 1950s and 1960s; this "hub-and-wheel" freeway pattern can
+be observed on many city maps. New bridges have spanned rivers and
+bays, as in New York and San Francisco, linking together formerly
+separate cities into vast urbanized regions.  <p>
+
+Waves of demolition and rebuilding have produced "Manhattanized"
+downtowns across the land. During the 1950s and 1960s, urban renewal
+programs cleared away large areas of the old city, releasing the land
+for new office buildings, convention centers, hotels, and sports
+complexes. Building surges have converted the downtowns of American
+cities into forests of tall office buildings. More recently, office
+functions not requiring a downtown location have been moved to huge
+office parks in the suburbs.  <p>
+
+Surrounding the central business area lies a large band of old
+mixed-use and residential buildings which hose the urban poor. High
+crime, low income, deteriorating services, inadequate housing, and
+intractable social problems plague these neglected areas of urban
+America. The manufacturing jobs formerly available to inner city
+residents are no longer there, and resources have not been committed
+to replace them.  <p>
+
+These inner city areas have been left behind by a massive migration to
+the suburbs, which began in the late nineteenth century but
+accelerated in the 1920s with the spread of the automobile. Freeway
+building after World War II opened up even larger areas of suburban
+land, which were quickly filled by people fleeing central city
+decline. Today, more people live in suburbs than in cities proper.
+Manufacturers have also moved their production facilities to suburban
+locations which have freeway and rail accessibility.  <p>
+
+Indeed, we have reached a new stage of urbanization beyond the
+metropolis. Most major cities are no longer focused exclusively on the
+traditional downtown. New subcenters have arisen round the periphery,
+and these subcenters supply most of the daily needs of their adjacent
+populations. The old metropolis has become a multi-centered urban
+region. In turn, many of these urban regions have expanded to the
+point where they have coalesced into vast belts of urbanization --
+what the geographer Jean Gottman termed "megalopolis." The prime
+example is the eastern seaboard of the United States from Boston to
+Washington. The planner C.A. Doxiadis has speculated that similar vast
+corridors of urbanization will appear throughout the world during the
+next century. Thus far, American planners have not had much success in
+imposing a rational form on this process. However, New Town and
+greenbelt programs in Britain and the Scandinavian countries have, to
+some extent, prevented formless sprawl from engulfing the countryside.
+<p>
+
+<h3>The Economics of Urban Areas</h3>
+
+Since the 1950s, city planners have increasingly paid attention to the
+economics of urban areas. When many American cities experienced fiscal
+crises during the 1970s, urban financial management assumed even
+greater importance. Today, planners routinely assess the economic
+consequences of all major changes in the form of the city.  <p>
+
+Several basic concepts underlie urban and regional economic analysis.
+First, cities cannot grow if their residents simply provide services
+for one another. The city must create products which can be sold to an
+external purchaser, bringing in money which can be reinvested in new
+production facilities and raw materials. This "economic base" of
+production for external markets is crucial. Without it, the economic
+engine of the city grinds to a halt.  <p>
+
+Once the economic base is established, an elaborate internal market
+can evolve. This market includes the production of goods and services
+for businesses and residents within the city. Obviously, a large part
+of the city's physical plant is devoted to facilities for internal
+transactions: retail stores of all kinds, restaurants, local
+professional services, and so on.  <p>
+
+Modern cities are increasingly engaged in competition for economic
+resources such as industrial plants, corporate headquarters,
+high-technology firms, and government facilities. Cities try to lure
+investment with an array of features: low tax rates, improved
+transportation and utility infrastructure, cheap land, and skilled
+labor force. Amenities such as climate, proximity to recreation,
+parks, elegant architecture, and cultural activities influence the
+location decisions of businesses and individuals. Many older cities
+have difficulty surviving in this new economic game. Abandoned by
+traditional industries, they're now trying to create a new economic
+base involving growth sectors such as high technology.  <p>
+
+Today, cities no longer compete in mere regional or national markets:
+the market is an international one. Multinational firms close plants
+in Chicago or Detroit and build replacements in Asia or Latin America.
+Foreign products dominate whole sectors of the American consumer goods
+market. Huge sums of money shift around the globe in instantaneous
+electronic transactions. Cities must struggle for survival in a
+volatile environment in which the rules are always changing. This
+makes city planning even more challenging than before.  <p>
+
+<h2>Modern City Planning</h2>
+
+Modern city planning can be divided into two distinct but related
+types of planning. visionary city planning proposes radical changes in
+the form of the city, often in conjunction with sweeping changes in
+the social and economic order. Institutionalized city planning is
+lodged within the existing structures of government, and modifies
+urban growth processes in moderate, pragmatic ways. It is constrained
+by the prevailing alignment of political and economic forces within
+the city.  <p>
+
+<h3>Visionary or Utopian City Planning</h3>
+
+People have imagined ideal cities for millennia. Plato's Republic was
+an ideal city, although lacking in the spatial detail of later
+schemes. Renaissance architects designed numerous geometric cities,
+and ever since architects have been the chief source of imaginative
+urban proposals. In the twentieth century, Le Corbusier, Frank Lloyd
+Wright, Paolo Soleri, and dozens of other architects have designed
+cities on paper. Although few have been realized in pure form, they
+have influenced the layout of many new towns and urban redevelopment
+projects.  <p>
+
+In his "Contemporary City for Three Million People" of 1922 and
+"Radiant City" of 1935, Le Corbusier advocated a high-density urban
+alternative, with skyscraper office buildings and mid-rise apartments
+placed within park-like open spaces. Different land uses were located
+in separate districts, forming a rigid geometric pattern with a
+sophisticated system of superhighways and rail transit.  <p>
+
+Frank Lloyd Wright envisioned a decentralized low-density city in
+keeping with his distaste for large cities and belief in frontier
+individualism. The Broadacre City plan of 1935 is a large grid of
+arterials spread across the countryside, with most of the internal
+space devoted to single-family homes on large lots. Areas are also
+carefully set aside for small farms, light industry, orchards,
+recreation areas, and other urban facilities. A network of
+superhighways knits the region together, so spatially dispersed
+facilities are actually very close in terms of travel time. In many
+ways, Wright's Broadacre City resembles American suburban and exurban
+developments of the post-WWII period.  <p>
+
+Many other utopian plans could be catalogued, but the point is that
+planners and architects have generated a complex array of urban
+patterns from which to draw ideas and inspiration. Most city planners,
+however, do not work on a blank canvas; they can only make incremental
+changes to an urban scene already shaped by a complicated historical
+process.  <p>
+
+<h3>Institutionalized City Planning</h3>
+
+The form of the city is determined primarily by thousands of private
+decisions to construct buildings, within a framework of public
+infrastructure and regulations administered by the city, state, and
+federal governments. City planning actions can have enormous impacts
+on land values. From the point of view of land economics, the city is
+an enormous playing field on which thousands of competitors struggle
+to capture value by constructing or trading land and buildings. The
+goal of city planning is to intervene in this game in order to protect
+widely shared public values such as health, safety, environmental
+quality, social equality, and aesthetics.  <p>
+
+The roots of American city planning lie in an array of reform efforts
+of the late nineteenth century: the Parks movement, the City Beautiful
+movement, campaigns for housing regulations, the Progressive movement
+for government reform, and efforts to improve public health through
+the provision of sanitary sewers and clean water supplies. The First
+National Conference on City Planning occurred in 1909, the same year
+as Daniel Burnham's famous Plan of Chicago. That date may be used to
+mark the inauguration of the new profession. The early city planners
+actually came from diverse backgrounds such as architecture, landscape
+architecture, engineering, and law, but they shared a common desire to
+produce a more orderly urban pattern.  <p>
+
+The zoning of land became, and still is, the most potent instrument
+available to American city planners for controlling urban development.
+Zoning is basically the dividing of the city into discrete areas
+within which only certain land uses and types of buildings can be
+constructed. The rationale is that certain activities of building
+types don't mix well; factories and homes, for example. Illogical
+mixtures create nuisances for the parties involved and lower land
+values. After several decades of gradual development, land-use zoning
+received legal approval from the Supreme Court in 1926.  <p>
+
+Zoning isn't the same as planning: it is a legal tool for the
+implementation of plans. Zoning should be closely integrated with a
+Master Plan or Comprehensive Plan that spells out a logical path for
+the city's future in areas such as land use, transportation, parks and
+recreation, environmental quality, and public works construction. In
+the early days of zoning this was often neglected, but this lack of
+coordination between zoning and planning is less common now.  <p>
+
+The other important elements of existing city planning are subdivision
+regulations and environmental regulations. Subdivision regulations
+require that land being subdivided for development be provided with
+adequate street, sewers, water, schools, utilities, and various design
+features. The goal is to prevent shabby, deficient developments that
+produce headaches for both their residents and the city. Since the
+late 1960s, environmental regulations have exerted a stronger
+influence on patterns of urban growth by restricting development in
+floodplains, on unstable slopes, on earthquake faults, or near
+sensitive natural areas. Businesses have been forced to reduce smoke
+emissions and the disposal of wastes has been more closely monitored.
+Overall, the pace of environmental degradation has been slowed, but
+certainly not stopped, and a dismaying backlog of environmental
+hazards remains to be cleaned up. City planners have plenty of work to
+do as we move into the twenty-first century.  <p>
+
+<h2>Conclusion: Good City Form</h2>
+
+What is the good city? We are unlikely to arrive at an unequivocal
+answer; the diversity of human needs and tastes frustrates all
+attempts to provide recipes or instruction manuals for the building of
+cities. However, we can identify the crucial dimensions of city
+performance, and specify the many ways in which cities can achieve
+success along these dimensions.  <p>
+
+A most useful guide in this enterprise is Kevin Lynch's A Theory of
+Good City Form (Cambridge, MA, MIT Press, 1981). Lynch offers five
+basic dimensions of city performance: vitality, sense, fit, access,
+and control. To these he adds two "meta-criteria," efficiency and
+justice.  <p>
+
+For Lynch, a vital city successfully fulfils the biological needs of
+its inhabitants, and provides a safe environment for their activities.
+A sensible city is organized so that its residents can perceive and
+understand the city's form and function. A city with good fit provides
+the buildings, spaces, and networks required for its residents to
+pursue their projects successfully. An accessible city allows people
+of all ages and background to gain the activities, resources,
+services, and information that they need. A city with good control is
+arranged so that its citizens have a say in the management of the
+spaces in which they work and reside.  <p>
+
+Finally, an efficient city achieves the goals listed above at the
+least cost, and balances the achievement of the goals with one
+another. They cannot all be maximized at the same time. And a just
+city distributes benefits among its citizens according to some fair
+standard. Clearly, these two meta-criteria raise difficult issues
+which will continue to spark debates for the foreseeable future.  <p>
+
+These criteria tell aspiring city builders where to aim, while
+acknowledging the diverse ways of achieving good city form. Cities are
+endlessly fascinating because each is unique, the product of decades,
+centuries, or even millennia of historical evolution. As we walk
+through city streets, we walk through time, encountering the
+city-building legacy of past generations. Paris, Venice, Rome, New
+York, Chicago, San Francisco -- each has its glories and its failures.
+In theory, we should be able to learn the lessons of history and build
+cities that our descendants will admire and wish to preserve. That
+remains a constant challenge for all those who undertake the task of
+city planning.  <p>
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/index.html b/manual/index.html
new file mode 100644 (file)
index 0000000..62a2c42
--- /dev/null
@@ -0,0 +1,85 @@
+<head><title>Micropolis Manual</title></head><body>
+<h1>Micropolis Manual</h1>
+
+<ul>
+<li><a href="intro.html">Introduction</a>
+<li><a href="tutorial.html">Tutorial</a>
+<li><a href="reference.html">User Reference</a>
+<li><a href="inside.html">Inside The Simulator</a>
+<li><a href="history.html">History Of Cities And City Planning</a>
+<li><a href="bibliography.html">Bibliography</a>
+<li><a href="credits.html">Credits</a>
+</ul>
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/inside.html b/manual/inside.html
new file mode 100644 (file)
index 0000000..5653b9b
--- /dev/null
@@ -0,0 +1,372 @@
+<head><title>Inside The Simulator</title></head><body>
+
+<h1>Inside The Simulator</h1>
+
+<h2>How the Simulator Works and Strategies for Using It</h2>
+
+Many factors influence the chance of your city's prospering or
+floundering: both internal factors (the structure and efficiency of
+your city) and external factors (the regional economy, disasters,
+etc.).  <p>
+
+<h3>Zones</h3>
+
+Your city is divided up into three primary zones: residential,
+commercial and industrial. These zones symbolize the three basic
+pillars upon which a city is based: population, industry, and
+commerce. All three are necessary for your city to grow and thrive.
+<p>
+
+<ul>
+
+<li>Residential Zones are where the Sims live. Here they build houses,
+apartments and community facilities such as churches and schools. Sims
+are the work force for your city's commercial and industrial zones.
+<p>
+
+<li>Industrial Zones are used to site warehouses, factories, and other
+unsightly and polluting structures which have a negative impact on
+surrounding zones. One of the major goals of planning is to separate
+these "nuisances" from the areas where people live. In this
+simulation, industrial zones represent the "basic" production of your
+city. Things produced here are sold outside the city to an "external
+market," bringing money into the city for future growth.  <p>
+
+<li>Commercial Zones represent the retail stores and services in your
+city, including gas stations, grocery stores, banks, and offices.
+Commercial areas are mainly dedicated to producing goods and services
+needed within your city. This is called "non-basic" production or
+production for the "internal market."  <p>
+
+</ul>
+<p>
+
+<h3>Population -- Residential</h3>
+
+The major factors controlling residential population are birthrate,
+availability of jobs and housing, unemployment, and quality of life
+within the city.  <p>
+
+Birthrate as used here, is actually a combination of the birthrate
+(positive) and the deathrate (negative). Within Micropolis there is
+always a positive birthrate.  <p>
+
+Availability of jobs (the employment rate) is a ratio of the current
+commercial and industrial populations to the total residential
+population. As a rule of thumb, the number of commercial and
+industrial zones together should roughly equal the number of
+residential zones.  <p>
+
+If there are more jobs in your city than residents, new settlers will
+be attracted. If the job market declines during a local recession,
+your people will migrate away in search of jobs.  <p>
+
+Housing for your residents is built in the residential zones. These
+zones must be powered and connected to the places of employment by
+roads. The structures built in residential zones are influenced by
+land value and population density.  <p>
+
+Quality of life is a measure of relative "attractiveness" assigned to
+different zone locations. It is affected by negative factors such as
+pollution and crime, and positive factors such as parks and
+accessibility.  <p>
+
+<h3>External Market -- Industrial</h3>
+
+There are thousands of variables that influence your city. All these
+variables can be influenced by your actions with the exception of one.
+<p>
+
+The external market (the economic conditions that exist outside of
+your city) is controlled by the simulation -- there is nothing you can
+do to change it. In many ways, this external market is the original
+source of all city growth. Towns frequently begin as production
+centers (steel towns, refineries, etc.) that service a demand in the
+surrounding region. As time passes, the external market grows to
+reflect the regional growth going on around your city.  <p>
+
+The industry in your city will attempt to grow as the external market
+grows. For this to happen there must be room for expansion (more
+industrial zones) and an adequate labor supply (more residential
+zones).  <p>
+
+<h3>Internal Market -- Commercial</h3>
+
+The internal market is completely influenced by the conditions within
+your city. Internal production, created in the commercial zones,
+represents all the things which are purchased and consumed within the
+city. Food stores, gas stations, retail stores, financial services,
+medical care, etc. -- all depend on a nearby population to service.
+Within Micropolis, the size of the internal market determines the rate at
+which commercial zones will prosper. Commercial zones need enough
+zoned land to build on and an existent, sufficient work force to
+employ. The structures built in commercial zones are mainly influenced
+by land value and population density.  <p>
+
+Commercial zones grow and develop to serve the expanding internal
+market. Commercial growth will usually be slow at first, when the
+population is small and needs very little. As your city grows,
+commercial growth will accelerate and the internal market will become
+a much larger consumer of your total city production. This
+accelerating effect, when the external/industrial production is
+overtaken by the accelerating internal/commercial sector, can turn a
+sleepy little town of 50,000 into a thriving capital of 200,000 in a
+few short years.  <p>
+
+<h3>Tax Rate</h3>
+
+The tax rate you set controls the amount of income generated by your
+city. As taxes are collected each year (simulation time), the Budget
+Window will appear, giving you the fiscal details of your city and a
+chance to adjust rates. The simulation determines the amount of
+revenue collected by assessing each zone an amount based on its land
+value, current level of development and the current tax rate.  <p>
+
+The tax rate has a global affect on your city's growth rate. If you
+set it low (0%-4%), growth will be brisk but the city income will be
+low. If you set it high (10%-20%), you will collect a lot in the short
+run but in the long run tax income will decrease along with the
+population. You must keep tax income high enough to invest in new
+development, but low enough not to scare off residents and businesses.
+A high tax rate is one way to control city growth, should you want to
+experiment with "growth control measures."  <p>
+
+<h3>Budgeting</h3>
+
+City budgeting affects the way your city grows. City infrastructure
+cost is represented by three departments: police, fire, and
+transportation. You may set the funding levels separately for each.
+All three departments will request a certain level of funding each
+year. You may supply all or part of the requested funds, in the
+attempt to balance safety needs and budgetary concerns.  <p>
+
+<ul>
+
+<li>Police Department: Police stations lower the crime rate around a
+territory. The effective radius of your police station is related to
+the amount of funding allocated to the police department. Police
+stations cost $100 per year to fund. 
+
+<li>Fire Department: Fire stations prevent and extinguish fires. The
+level of funding determines the effective radius of a fire station.
+Fire stations put out fires within this radius much sooner than
+outside it, and decrease the chance that they will start in the first
+place. Fire stations cost $100 per year to fund. 
+
+<li>Transportation Department:When you build roads and rail systems
+you are charged for construction and yearly maintenance. The larger
+your transportation network, the more it will cost for upkeep. If you
+decide not to or are unable to pay this maintenance cost, roads will
+slowly deteriorate and become unusable. The maintenance cost for each
+piece is: Road - $1, Bridge - $4, Rail - $4, Rail tunnel - $10.
+
+</ul>
+
+<h3>Power</h3>
+
+Electrical power makes modern cities possible. Efficient and reliable
+power transmission to all zones is the goal of good "power
+management."  <p>
+
+The entire power grid of your city is periodically checked in the
+simulation for links to power. If a zone is connected (by other zones
+or power lines) to a power plant, the zone is considered powered.  <p>
+
+Zones must be powered for development to occur. Many things (such as
+fires, tornadoes, earthquakes and bulldozers) can knock down power
+lines and cause blackouts in parts of your city. Development will stop
+in unpowered zones, and if power is not quickly restored, the zone
+will decline back to its original state of emptiness.  <p>
+
+Redundant power plants and power connections can make your power grid
+more reliable, but running more line adds construction costs.  <p>
+
+<h3>Transportation -- Traffic</h3>
+
+One of the most important elements of city structure is the
+transportation network. It moves Sims and good throughout your city.
+Roads typically occupy as much as 25%-40% of the land in urban areas.
+Traffic along these roads indicates which sections of your road system
+are used the most.  <p>
+
+Traffic levels are simulated by a process known as "Trip Generation."
+Over time, each populated zone in the city will generate a number of
+trips, depending on the population. Each generated trip starts at the
+origin zone, travels down the road, and if a "proper destination" is
+reached, ends at the destination zone -- otherwise, the trip fails.
+Trip failure indicates inaccessibility of a zone and limits its
+growth.  <p>
+
+The majority of generated trips represent people commuting to and from
+work. Additional traffic is generated by residents traveling to
+shopping, recreation, etc. When analyzing traffic, the simulator tests
+the following traffic routes: <p>
+
+<i>Traffic Patterns</i><p>
+
+<ul>
+
+<li>From Residential
+  <ul>
+    <li>To Commercial
+    <li>To Industrial
+  </ul>
+
+<li>From Commercial
+  <ul>
+    <li>To Residential
+    <li>To Industrial
+  </ul>
+
+<li>From Industrial
+  <ul>
+    <li>To Residential
+  </ul>
+
+</ul>
+
+<p>
+
+When Sims drive away from an origin zone, they have a limited "trip
+range" in which to find a destination zone. Heavy traffic decreases
+the trip range. If the destination zone is too far away, the trip is
+unsuccessful. Repeated unsuccessful trips will cause the Sims to move
+out of the origin zone.  <p>
+
+Each road has a limited capacity for traffic. When this capacity is
+exceeded traffic jams will form. Traffic jams drastically lower the
+capacity of a road, compounding the problem and frustrating drivers.
+<p>
+
+Traffic conditions fluctuate quickly. Avoid traffic problems by
+providing several routes for the traffic to take.  <p>
+
+A road must be adjacent to a zone for the zone to be connected to the
+traffic pattern. Zones do not conduct traffic the way they conduct
+power.  <p>
+
+<h3>Pollution</h3>
+
+Pollution levels are tracked in all areas of your city. This is a
+general "nuisance level" that includes air and water pollution, noise
+pollution, toxic wastes, etc. Pollution has a negative impact on the
+growth of residential areas.  <p>
+
+The primary cause of pollution is industrialized zones. The level of
+pollution created by an industrial zone increases with its level of
+growth.  <p>
+
+Traffic is another cause of pollution. There are limited means of
+combating the pollution level. Lowering traffic density, limiting
+industrial development, and separating the pollution from the
+residential areas will help.  <p>
+
+<h3>Crime</h3>
+
+Crime rates are influenced by population density, local law
+enforcement, and land values. As population density increases in an
+area, the number of crimes committed increases. Crime will also
+increase in areas of low land value.  <p>
+
+The most effective way to deal with high crime rates is to introduce a
+police station into the area. Based on its level of funding, the
+police station will reduce the rate of crime in its sphere of
+influence. A long-term approach to lowering crime is to raise the land
+value of the area. One way to do this is to demolish and rezone (urban
+renewal).  <p>
+
+<h3>Land Value</h3>
+
+Land value is one of the most fundamental aspects of urban structure.
+The land value of an area affects how that area is used. In this
+simulation the land value of an area is based on terrain,
+accessibility, pollution, and distance to downtown.  <p>
+
+The farther the residents have to go to work, the lower the land value
+where they live, due in part to transportation costs. The value of
+commercial zones depends greatly on accessibility by the populace.
+<p>
+
+Land value is also affected by surrounding terrain. If land is closer
+to water, trees, agricultural areas, or parks, its value will rise.
+Creative placement of zones within the terrain, with little
+bulldozing, can make good use of this natural advantage.  <p>
+
+Land value and crime rate have a feedback effect on each other. Lower
+land values cause crime rates to rise. Higher crime rates cause land
+values to drop, and can cause "transition areas" near your central
+city to rapidly decline in value.  <p>
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/intro.html b/manual/intro.html
new file mode 100644 (file)
index 0000000..2b0e593
--- /dev/null
@@ -0,0 +1,250 @@
+<head><title>Introduction</title></head><body>
+
+<h1>Introduction</h1>
+
+<h2>Foreword</h2>
+
+Enter Micropolis and take control. Be the undisputed ruler of a
+sophisticated real-time City Simulation. Become the master of existing
+cities such as San Francisco, Tokyo, and Rio de Janeiro, or create
+your own dream city (or nightmare slum) from the ground up.  <p>
+
+Whether you take over an existing city or build your own, you are the
+Mayor and City Planner with complete authority.  <p>
+
+Your city is populated by Sims -- Simulated Citizens. Like their human
+counterparts, they build houses, condos, churches, stores and
+factories. And, also like humans, they complain about things like
+taxes, mayors, taxes, city planners, and taxes. If they get unhappy,
+they move out; you collect fewer taxes, the city deteriorates.  <p>
+
+The next few sections will explain the overall concept of Micropolis and
+give information that will help you win Scenarios and design and build
+better cities.  <p>
+
+<h2>About System Simulations</h2>
+
+Micropolis is the first of a new type of entertainment/educational
+software, called System Simulations. We provide you with a set of
+Rules and Tools that describe, create and control a system. In the
+case of Micropolis the system is a city.  <p>
+
+The challenge of playing a System Simulation game is to figure out how
+the system works and take control of it. As master of the system, you
+are free to use the Tools to create and control an unlimited number of
+systems (in this case, cities) within the framework and limits
+provided by the Rules.  <p>
+
+<h3>Rules</h3>
+
+In Micropolis, the Rules to learn are based on city planning and
+management, including: <p>
+
+<ul>
+
+<li>Human Factors: Residential space and amenities, availability of
+jobs, and quality of life.
+
+<li>Economic Factors: Land value, industrial and commercial space,
+unemployment, internal and external markets, electric power, taxation,
+and funding for city services.
+
+<li>Survival Factors: Strategies for dealing with disasters, crime,
+and pollution.
+
+<li>Political Factors: Public opinion, zoning, and keeping residents
+and businesses satisfied with your city and your performance. 
+
+</ul>
+<p>
+
+<h3>Tools</h3>
+
+The Tools provide you with the ability to plan, lay out, zone, build,
+bulldoze, re-zone, and manage a city. <p>
+
+<ul>
+
+<li>Plan: Mapping systems give physical and demographic overviews of
+the entire city.
+
+<li>Layout: Design living and working areas, road and transit systems,
+and recreational areas.
+
+<li>Zone: Set zoning boundaries for parks, residential, commercial and
+industrial areas.
+
+<li>Build: Place roads, rails, airports, seaports, fire and police
+stations, sports stadiums, and power plants.
+
+<li>Bulldoze: Clear forests for city growth, build landfill along
+waterways, clear and re-zone developed areas.
+
+<li>Manage: Using the mapping and graphing systems, gather up-to-date
+information on traffic density, population trends, power grid status,
+pollution, crime, land value, police and fire department efficiency,
+and cash flow. Set the tax rate and funding levels for city services.
+
+</ul>
+<p>
+
+But the most important Tool of all is the Simulator itself. Test your
+plans and ideas as you watch the city grow or shrink through the
+immigration and emigration of industrious Simulated Citizens. Sims
+will move in and build homes, hospitals, churches, stores and
+factories in the zones you provide, or move out in search of jobs or a
+better life elsewhere. The success of the city is based on the quality
+of the city you design and manage.  <p>
+
+<h3>Simulator Reaction Time</h3>
+
+The simulator is a very complex multi-tasking piece of software. It is
+constantly performing many checks, calculations, and updates, as well
+as keeping watch on the mouse and keyboard to respond to your demands.
+When you load in a city, give the simulator some time to compile its
+data and update the maps, graphs, population levels, etc. Some of the
+other times when the simulator lags behind you are when powering zones
+and updating the city services map after installing police and fire
+stations.  <p>
+
+<h2>The Goals of Micropolis</h2>
+
+There are many goals to be pursued and reached in Micropolis.  <p>
+
+<h3>Scenarios</h3>
+
+Each of the eight included scenarios is actually a game in itself,
+with an unlimited number of ways to win -- or lose. <p>
+
+Each Scenario is a city which is either the victim of horrible
+planning or about to be the victim of a natural disaster. After you
+load in a Scenario, you will have a limited amount of time to correct
+or repair the problems. If you are successful, you will be given the
+key to the city. If not, you may be ridden out of town on a rail.  <p>
+
+If one strategy doesn't work, try another. There are a million stories
+in each city, and you write them.  <p>
+
+<h3>Your Dream City</h3>
+
+Perhaps the main goal of Micropolis is for you to design, manage and
+maintain the city of your dreams.  <p>
+
+Your ideal place to live may be a bustling megalopolis, lots of
+people, lots of cars, tall buildings: high-energy, high density
+living. Or it may be a small rural community, or a linked group of
+small communities providing slow-paced country living.  <p>
+
+As long as your city can provide places for people to live, work, shop
+and play, it will attract residents. And as long as traffic,
+pollution, overcrowding, crime or taxes don't drive them away, your
+city will live.  <p>
+
+<h1>Getting Started</h1>
+
+<h2>Micropolis Requirements</h2>
+
+Micropolis requires an Intel processor running the Linux operating
+system, with the X11 window system installed, a 16 bit deep color graphics display, 
+a kernel with the shared memory option enabled, 
+and at least 32 megabytes of memory. <p>
+
+<h2>Micropolis Features</h2>
+
+<h3>On-Line Help</h3>
+
+You can get help on the Micropolis user interface, by pointing the mouse
+at anything mysterious, holding down shift, and clicking the left button. 
+The Help window will pop up, giving instructions and useful hints on how 
+to use the controls.  <p>
+
+<h3>Multiple Views</h3>
+
+You can open up any number of animated city maps and editors at once. <p>
+
+<h3>Pie Menus</h3>
+
+Micropolis features pop up "pie menus" for quickly selecting city editing tools. 
+Pie menus are radial menus with their choices in different directions, 
+and they're very fast and efficient to use. 
+Since you change editing tools quite often while building a city, 
+you can save much time and effort by using the pie menu shortcuts 
+instead of the moving back and forth to the tool pallet.
+<p>
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
+
+
+
diff --git a/manual/reference.html b/manual/reference.html
new file mode 100644 (file)
index 0000000..dc4eb79
--- /dev/null
@@ -0,0 +1,1194 @@
+<head><title>User Reference</title></head><body>
+
+<h1>User Reference Guide: Controlling Micropolis</h1>
+
+<h2>Getting Help</h2>
+
+If you wonder about a control or graphic in Micropolis, you can point at
+it with the cursor, hold down shift and click the left button, 
+to bring up a helpwindow describing it.  <p>
+
+<h2>Using the Mouse</h2>
+
+In Micropolis, you will primarily use the left mouse button to edit the city. 
+The main function of the right mouse button is to select from pie menus. 
+The middle button is used to scroll the view in the Edit Window. <p>
+
+Clicking a mouse button means to press and release it without moving.
+Dragging means to press and hold the button, move the mouse, then
+release the button.  <p>
+
+<h2>Pie Menus</h2>
+
+Pie menus are designed to be very fast and efficient to use. 
+You can pop up a pie menu by pressing and holding the right button, 
+then select from it by moving in the direction of the item you want, 
+then releasing the button.  <p>
+
+Once you are familiar with the directions, you can use pie menus very
+quickly by smoothly pressing the right button down, 
+moving in the direction you want, and releasing. 
+If you do this without stopping, 
+the pie menu will not even display on the screen -- 
+you will just hear the name of the item spoken,
+to remind you of the selection. 
+The more you use pie menus, the easier they are to use. 
+See how fast you can get!
+<p>
+
+<h2>Micropolis Chooser Window</h2>
+
+This window lets you select which city to simulate.
+You can see what the selected city looks like in the map window.
+Give your city a name by typing it into the Name text field. <p>
+
+Click on "New City" to generate a random map to start a city from scratch.
+Click on "Load City" to load a saved city from disk. <p>
+
+You can go back and forth between your previously selected cities
+with the "Previous Map" and "Next Map" buttons. <p>
+
+Click on any of the Scenario buttons to play any of the eight scenarios. 
+When you click on any of those buttons, the city is displayed in the Micropolis Map Window.
+
+The Scenarios provide both real and hypothetical problems for you to
+deal with in seven famous (and one not-so-famous) cities. They present
+various levels of difficulty. Some problems are in the form of
+disasters which will occur some time after you start. Other problems
+are more long-term, such as crime.  <p>
+
+Your task is to deal with the problem at hand as well as possible
+under the circumstances. After a certain amount of time the city
+residents will rate your performance in a special election. If you do
+very well you may be given the key to the city. However, if you do
+poorly, they just might run you out of town.  <p>
+
+<ul>
+
+<li>Dullsville, USA 1900 -- Boredom
+<p>
+
+Things haven't changed much around here in the last hundred years and
+the residents are beginning to get bored. They think Dullsville could
+be the next great city with the right leader. It is your job to
+attract new growth and development, turning Dullsville into a
+Metropolis by the 21st century. <p>
+
+<ul>
+<li>Difficulty: Easy
+<li>Time Limit: 30 years
+<li>Win Condition: Metropolis
+</ul>
+
+<li>San Francisco, CA 1906 -- 8.0 Earthquake
+<p>
+
+Damage from the earthquake was minor compared to that of the ensuing
+fires, which took days to control. 1500 people died. Controlling the
+fires should be your initial concern here. Afterwards, clearing the
+remaining rubble will allow the city to start rebuilding.  <p>
+
+<ul>
+<li>Difficulty: Very difficult
+<li>Time Limit: 5 years
+<li>Win Condition: Metropolis
+</ul>
+
+<li>Hamburg, Germany 1944 -- Fire
+<p>
+
+Allied fire-bombing of German cities in WWII caused tremendous damage
+and loss of life. People living in the inner cities were at greatest
+risk. You must control the firestorms during the bombing and then
+rebuild the city after the war.  <p>
+
+<ul>
+<li>Difficulty: Very difficult
+<li>Time Limit: 5 years
+<li>Win Condition: Metropolis
+</ul>
+
+Bern, Switzerland 1965 -- Traffic
+<p>
+
+The roads here are becoming more congested every day, and the
+residents are upset. They demand that you do something about it. Some
+have suggested a mass transit system as the answer, but this would
+require major rezoning in the downtown area.  <p>
+
+<ul>
+<li>Difficulty: Easy
+<li>Time Limit: 10 years
+<li>Win Condition: Low Average Traffic Density
+</ul>
+
+Tokyo, Japan 1957 -- Monster Attack
+<p>
+
+A large reptilian creature has been spotted heading for Tokyo bay. It
+seems to be attracted to the heavy levels of industrial pollution
+there. Try to control the fires, then rebuild the industrial center.
+<p>
+
+<ul>
+<li>Difficulty: Moderately difficult
+<li>Time Limit: 5 years
+<li>Win Condition: City Score above 500
+</ul>
+
+Rio de Janeiro, Brazil 2047 -- Flood
+<p>
+
+In the mid-21st century, the greenhouse effect raised global
+temperatures 6 degrees F. Polar ice caps melted and raised sea levels
+worldwide. Coastal areas were devastated by flood and erosion.
+Unfortunately, some of the largest cities in the world are located on
+the coast.  <p>
+
+<ul>
+<li>Difficulty: Moderately difficult
+<li>Time Limit: 10 years
+<li>Win Condition: City Score above 500
+</ul>
+
+Boston, MA 2010 -- Nuclear Meltdown
+<p>
+
+A major meltdown is about to occur at one of the new downtown nuclear
+reactors. The area in the vicinity of the reactor will be severely
+contaminated by radiation, forcing you to restructure the city around
+it.  <p>
+
+<ul>
+<li>Difficulty: Very difficult
+<li>Time Limit: 5 years
+<li>Win Condition: City Score above 500
+</ul>
+
+Detroit, MI 1927 -- Crime
+<p>
+
+By 1970, competition from overseas and other economic factors pushed
+the once "automobile capital of the world" into recession. Plummeting
+land values and unemployment then increased crime in the inner-city to
+chronic levels. You have just been elected after promising to reduce
+crime and rebuild the industrial base of the city.  <p>
+
+<ul>
+<li>Difficulty: Moderately difficult
+<li>Time Limit: 10 years
+<li>Win Condition: Low Average Crime Density
+</ul>
+
+You can select the Game Level from the radio buttons (Easy / Medium / Hard).
+Once a city is started, you cannot change the Game Level; 
+it remains at your initial setting for the life of the city. 
+The current Game Level is displayed in the evaluation window. <p>
+
+This level -- Easy, Medium, or Hard -- adjusts the simulation to your
+current abilities by altering several factors. A harder setting will
+increase the chance of disasters, make residents more intolerant of
+taxation, cause maintenance costs to grow, etc.  <p>
+
+Once you have decided which city you want to play, press "Use This Map" and Micropolis will come to life!
+<p>
+
+<h2>Micropolis Controls Window</h2>
+
+This window contains the main controls to Micropolis, status displays, and a scrolling text message log. 
+At the top is a row of menus that are enabled when the game is playing. 
+Beneath that is a status display panel showing the date and the current funds on the left.
+In the middle is a graph and bar display of the Residential, Commercial and Industrial rates and demands.
+On the right is an icon of the Micropolis simulation machine, 
+with a red screen when paused and green screen when running.
+The bottom half of the window is occupied by a scrolling text window, 
+that Micropolis uses to display important messages.
+<ul>
+
+       <li>Menu Bar
+
+               <ul>
+
+                       <li>Micropolis Menu
+
+                               <ul>
+
+                                       <li>About...<br>
+Display fascinating and vital information about Micropolis.
+
+                                       <li>Save City<br>
+Write the city to a file.
+
+                                       <li>Save City As...<br>
+Save the city with a new file name.
+
+                                       <li>Choose City!<br>
+Generate a new city, select a scenario or load a pre-existing city.
+
+                                       <li>Quit Playing!<br>
+Exit Micropolis and go back to the real world.
+
+                               </ul>
+
+                       <li>Options Menu
+
+                               <ul>
+                                       <li>Auto Budget<br>
+Keeps your budget at the same level (or fully funded) 
+without asking for approval every year. 
+If there isn't enough money to meet the budget, 
+then funds will be allocated first to the Transit system, 
+then to the Fire Department, then to the Police. 
+If your city runs out of money, 
+the budget window comes up at the end of
+the year anyway, and Auto Budget is turned off. 
+                                       <li>Auto Bulldozer<br>
+Allows you to place zones, roadways, etc.,
+directly on top of trees, shoreline, power lines, and rubble, 
+without manually bulldozing first. 
+You will be charged the same amount as for manual bulldozing.  
+                                       <li>Disasters<br>
+Enables or disables random disasters. 
+If disasters are disabled, you can still select them manually 
+from the Disasters Menu. 
+                                       <li>Sound<br>
+Toggles the city sounds on and off. 
+Preserves the sanity and good will of those who have to work in the same room.
+                                       <li>Animation<br>
+Toggles tile animations on and off.
+
+                               </ul>
+
+                       <li>Disasters Menu<br>
+The Disasters Menu allows you to set natural (and unnatural) disasters
+loose on your city. Use these disasters to test your ability to deal
+with emergencies in your city or just to release some aggression. More
+information on disasters, their causes, and dealing with them is
+presented later.  <p>
+
+Disasters will randomly occur as you play Micropolis. At higher game
+levels the disasters will happen more often. Most disasters can be
+activated from the Disasters Menu. Random disasters can be eliminated
+by turing off the Disasters setting of the Options Menu.  <p>
+
+<li>Shipwreck: Shipwrecks can occur once you have an operating
+seaport. They can cause fires where the ship crashes into a shore or
+bridge. Shipwrecks are not available on the Disasters Menu. <p>
+
+                               <ul>
+                                       <li>Monster<br>
+Sets a monster loose on your city. <p>
+
+Monster Attacks are provoked by high levels of
+pollution. A monster destroys everything in its path, starts fires,
+and causes planes, helicopters, trains, and ships to crash. <p>
+
+                                       <li>Fire<br>
+Starts a fire somewhere on the map. <p>
+
+<li>Fires can start anywhere in the city. Fires spread fairly
+rapidly through forests and buildings, somewhat slower over roadways.
+Fire will not cross water or clear land.  <p>
+
+The effectiveness of the fire department (which can be viewed in the
+Map Window) is based on how close it is to the fire, its funding
+level, and its transit access. Fires inside this effective radius will
+be extinguished automatically. If you have no operational fire
+departments in the area you can try to control the fire yourself.
+Since fire will not spread across clear terrain, you can build fire
+breaks with the bulldozer. Just surround the fire with clear areas and
+it will stop spreading and eventually burn itself out. You cannot
+directly bulldoze a fire.  <p>
+
+                                       <li>Flood<br>
+Causes a flood to occur near the water. <p>
+
+Floods gradually spread and
+destroy buildings and utilities. After a while the flood waters
+recede, leaving behind cleared terrain. <p>
+
+                                       <li>Meltdown<br>
+If there's a nuclear power plant, this spills Irn-Bru
+in the control room, causing a meltdown. <p>
+
+Meltdowns are only possible if you are using a nuclear
+power plant. If a meltdown occurs, your nuclear plant will explode
+into flames. The surrounding area will be unusable for the remainder
+of the simulation due to radioactive contamination.  <p>
+
+                                       <li>Tornado<br>
+Causes a tornado to appear somewhere on the map. <p>
+
+Tornados can occur anywhere on the map at any time. Very
+fast and unpredictable, they can appear and disappear at a moment's
+notice. Tornados destroy everything in their path, and can cause
+planes, helicopters, trains, and ships to crash.
+<p>
+
+                                       <li>Earthquake<br>
+Causes a MAJOR earthquake. <p>
+
+Earthquakes are the most devastating disaster. This is
+a Major earthquake -- between 8.0 and 9.0 on the Richter Scale. It
+will destroy buildings and start fires. The initial damage will vary
+with the severity of the earthquake, and the eventual fire damage
+depends on your fire-control efforts.  <p>
+
+
+When an Earthquake occurs, the Edit Window will shake for a while.
+When it stops you will have to take charge and control the scattered
+fires. Use the bulldozer to contain the largest fires first and work
+your way down to the smaller ones. <p>
+
+                                       <li>Clipper<br>
+The Clipper disaster violates the privacy of your simulated citizens, 
+and encrypts the city so only the NSA can decode it. <p>
+
+Do not use this unless you work for the National Security Agency, 
+and routinely subvert the Constitution of the United States 
+by spying on American citizens with the Echelon Surveillance System. <p>
+
+                               </ul>
+                       <li>Time Menu
+                               <ul>
+                                       <li>Pause<br>
+Stops the passage of time entirely.
+                                       <li>Slow<br>
+Months pass by slowly.
+                                       <li>Medium<br>
+Months pass by normally.
+                                       <li>Fast<br>
+Months pass by fast.
+
+                               </ul>
+                       <li>Priority Menu
+                               <ul>
+                                       <li>Flat Out!<br>
+Micropolis runs really fast, hogging the CPU.
+                                       <li>Zoom Zoom<br>
+Micropolis runs pretty fast, but leaves some time for other programs.
+                                       <li>Buzz Buzz<br>
+Micropolis runs fairly quickly.
+                                       <li>Putter Putter<br>
+Micropolis runs slower.
+                                       <li>Snore Snore<br>
+Micropolis runs very slowly.
+
+                               </ul>
+                       <li>Windows Menu
+                               <ul>
+                                       <li>Budget<br>
+Open the Budget Window. 
+The simulation is paused as long as the budget window is open.
+                                       <li>Evaluation<br>
+Open the Evaluation Window.
+                                       <li>Graph<br>
+Open the Graph Window.
+                                       <li>Map<br>
+Open the Map Window.
+                                       <li>Editor<br>
+Open the Editor Window.
+                                       <li>Frob<br>
+Open the Frob-O-Matic Window.
+                                       <li>Map Copy<br>
+Open another copy of the Map Window.
+                                       <li>Editor Copy<br>
+Open another copy of the Editor Window.
+
+                               </ul>
+               </ul>
+
+       <li>Status Panel
+               <ul>
+                       <li>License Owner Name<br>
+                       <li>Date<br>
+                       <li>Funds<br>
+                       <li>Residential, Commercial, Industrial History Graph<br>
+                       <li>Residential, Commercial, Industrial Demand Chart<br>
+The Demand Indicator shows the demand levels for Residential (green),
+Commercial (blue), and Industrial zones (yellow), and can be helpful
+in planning your city.
+                       <li>Micropolis Simulator Icon<br>
+                       <li>Scrolling Text Message Window<br>
+                       <li>Text Input Field<br>
+               </ul>
+</ul>
+
+
+
+<h2>Micropolis Edit Window Window</h2>
+
+This is where all actual zoning and building takes place. 
+<p>
+
+<h3>Terrain</h3>
+
+There are three types of terrain in the Edit Window: Open Land, Trees,
+and Water.  <p>
+
+Open Land is where you can zone and build. It is shown as brown with
+dark brown speckles.  <p>
+
+Trees and Forests are shown as green, with dark green speckles. You
+cannot zone or build on trees. You may bulldoze trees and forests to
+turn them into clear land. While some bulldozing is necessary,
+clearing away too much green area will result in lower property
+values.  <p>
+
+Water is shown as blue, with dark blue speckles. You cannot zone or
+build on water. You must bulldoze coastlines to create landfills
+before you can build or zone there.  <p>
+
+<h3>Edit Window Gadgets</h3>
+
+The Edit Window is where you will do the actual building and zoning.
+In the middle of the Edit Window is a detailed map showing part of the
+terrain. Around the edges are controls and fields displaying
+information about the city.  <p>
+
+There is a row of Menu Buttons on the left below the title. 
+The Display menu lets you select how often the display is drawn.
+The Options menu lets you turn on and off certain view specific features. <p>
+
+To the right of the menu buttons, important messages are displayed.
+Below the menu bar is a tool pallet.
+The palette displays the name and cost of the currently selected tool,
+above an menu of colorful icons,
+used for choosing the city editing mode. 
+Click the mouse over an icon to select an editing tool. 
+The currently selected tool is highlighted, 
+and its name and cost is displayed at the top of the panel, 
+and spoken. <p>
+
+You can use the selected tool by pressing the left mouse button over
+the map in the middle of the Edit Window. Also, you can pop up a Pie
+Menu to quickly switch between editing tools, by clicking the right
+mouse button over the map. <p>
+
+You can easily scroll the map by pressing the middle mouse button down
+over the map and dragging the view around.  <p>
+
+<h3>Edit Window Icons</h3>
+
+You can select an icon from the Tool Icon pallet to use a city editing tool. 
+When an icon is selected, a rectangle will accompany the cursor
+when it's over the map, to indicate the area the tool will effect.
+<p>
+
+<ul>
+
+<li>Query Tool (question mark)<br>
+Shows the Zone Status Window, 
+describing the population density, value, crime rate, pollution, 
+and growth rate of the zone under the cursor. 
+It doesn't cost anything to use.  <p>
+
+<li>Bulldozer<br>
+Clears trees and forests, creates landfill along the water,
+and levels developed, existing zones and clears rubble caused by disasters. 
+The Auto Bulldoze option works on natural terrain, power
+lines and rubble, but not on zones, roads and rails. <p>
+
+It costs $1 for each square tile bulldozed. Knocking down a 3x3 zone
+costs $9 since it's made up of nine tiles. You're automatically
+charged $1 for each non-empty tile that you Auto Bulldoze.  <p>
+
+<li>Road<br>
+Connect developed areas. 
+Intersections and turns are automatically created. 
+Lay continuous roads by pressing the left mouse button and dragging your cursor. 
+Be careful -- if you accidentally lay a road in the wrong place,
+you will have to pay for bulldozing and rebuilding. <p>
+
+Roads may not be placed over zoned areas. They may be placed over
+trees, shrubbery, and shoreline only after bulldozing or activating
+the Auto Bulldoze function from the Options Menu. Roads can cross over
+power lines and rails only at right angles.  <p>
+
+Holding down the Control key while laying roads will constrain them to
+a straight line.  <p>
+
+Laying roads across water creates a bridge. Bridges can only be built
+in a straight line -- no curves, turns or intersections. Shorelines
+must be bulldozed prior to building a bridge, unless the Auto Bulldoze
+function from the Options Menu is active.  <p>
+
+Roadways are maintained by the transit budget, and wear out if there
+is a lack of funding. The amount of yearly funding requested by the
+transportation department is $1 for each section of road, $4 for each
+section of bridge.  <p>
+
+It costs $10 to lay one section of road and $50 to lay one section of
+bridge.  <p>
+
+<li>Power Lines<br>
+Carry power from power plants to zoned land and between
+zones. All developed land needs power to function. Power is conducted
+through adjacent zones. Unpowered zones display the flashing lightning
+bolt symbol. There is a delay between the time you connect power to a
+zone and when the flashing symbol disappears. The delay grows longer
+as the city grows larger.  <p>
+
+Power lines cannot cross zoned land. They can be built over trees,
+shrubbery, and shoreline only after bulldozing, or activating the Auto
+Bulldoze function from the Options Menu.  <p>
+
+Junctions and corners are automatically created. Lay continuous power
+lines by pressing the left mouse button down and dragging your cursor.
+Power lines across water must be horizontal or vertical -- no turn,
+curves or intersections. Power lines consume some power due to
+transmission inefficiencies.  <p>
+
+Holding down the Control key while laying power lines will constrain
+them to a straight line.  <p>
+
+It costs $5 to lay one section of power line on land, $25 on water.
+<p>
+
+<li>Transit Lines<br>
+Create a railway system for intra-city mass transit.
+Place tracks in heavy traffic areas to help alleviate congestion.  <p>
+
+Intersections and turns are created automatically. Lay continuous
+transit lines by pressing the left mouse button down and dragging with
+your cursor. Tracks laid under rivers will appear as dashed lines.
+These are underwater tunnels, and must be vertical or horizontal -- no
+turns, curves or intersections.  <p>
+
+Holding down the Control key while laying tracks will constrain them
+to a straight line.  <p>
+
+Transit lines are maintained by the transit budget. The level of
+funding affects the efficiency of the system. The amount of yearly
+funding requested by the transportation department is $4 for each
+section of rail, and $10 for each section of tunnel.  <p>
+
+It costs $20 per section of track laid on land, 
+$100 per section under water.  <p>
+
+<li>Parks<br>
+Can be placed on clear land. Parks, like forests and water,
+raise the land value of surrounding zones. Parks can be bulldozed as
+fire breaks or reserve space for later mass transit expansion.  <p>
+
+Holding down the Control key while building parks will constrain them
+to a straight line.  <p>
+
+It costs $10 to zone one park.  <p>
+
+<li>Residential Zones<br>
+Where the Sims live, build houses, apartments
+and community facilitieslike hospitals and churches. <p>
+
+Most residential zones develop into one of four classes: lower,
+middle, upper, and high. They can range in population density from
+single-family homes to high-rise apartments and condominiums. Some
+residential zones will automatically develop into churches and
+hospitals.  <p>
+
+Factors influencing residential value and growth are pollution,
+traffic density, population density, surrounding terrain, roadway
+access, parks and utilities.  <p>
+
+It costs $100 to zone one plot of land as residential. <p>
+
+<li>Commercial Zones<br>
+Used for many things, including retail stores,
+office buildings, parking garages and gas stations.  <p>
+
+There are four values for commercial property, and five levels of
+growth, from the small general store to tall skyscrapers. Factors
+influencing the value and growth of commercial areas include internal
+markets, pollution, traffic density, residential access, labor supply,
+airports, crime rates, transit access and utilities.  <p>
+
+It costs $100 to zone one plot of land as commercial.  <p>
+
+<li>Industrial Zones<br>
+For heavy manufacturing and industrial services.
+There are four levels of industrial growth, from small pumping
+stations and warehouses to large factories.  <p>
+
+Factors influencing industrial growth are external markets, seaports,
+transit access, residential access, labor supply and utilities.  <p>
+
+It costs $100 to zone one plot of land as industrial.  <p>
+
+<li>Police Departments<br>
+Lower the crime rate in the surrounding area. 
+This in turn raises property values. Place these in high-density crime
+areas, as defined by your Crime Rate Map. The efficiency of a station
+depends on the level of police department funding and transit access.
+<p>
+
+It costs $500 to build a police station. Full yearly maintenance of
+each Police Station is $100.  <p>
+
+<li>Fire Departments<br>
+Make surrounding areas less susceptible to fires.
+When fires do occur, they are put out sooner and do less damage if a
+station is near. The effectiveness of fire containment depends on the
+level of fire department funding and transit access.  <p>
+
+It costs $500 to build a fire station. Full yearly maintenance of each
+fire station is $100.  <p>
+
+<li>Stadiums<br>
+Encourage residential growth, once a city has become fairly
+large. You may build a stadium in a smaller city without negative (or
+positive) effect. Stadiums indirectly generate a lot of revenue, but
+create a lot of traffic. Properly maintaining a stadium requires a
+good road and transit network.  <p>
+
+It costs $3000 to build a stadium.  <p>
+
+<li>Power Plants<br>
+Can be Coal or Nuclear. 
+The nuclear plant is more powerful but carries a slight risk of meltdown.
+The coal plant is less expensive, but less powerful and it pollutes.
+<p>
+
+All zoned land needs power to develop and grow. When developed land
+loses power, it will degenerate to an undeveloped zone unless power is
+restored. Connecting too many zones to a power plant causes brownouts.
+<p>
+
+Coal power plants cost $3000 to build, and supply enough energy for
+about 50 zones. Nuclear power plants cost $5000 and supply electricity
+for about 150 zones.  <p>
+
+<li>Seaports<br>
+Increase the potential for industrial growth. They have
+little effect in a small city, but contribute a lot to
+industrialization in a large city.  <p>
+
+Seaports should be placed on a shoreline. The shoreline must be
+bulldozed prior to zoning a Seaport, unless Auto Bulldoze is active.
+Once the port is operational you may see ships in the water.  <p>
+
+It costs $5000 to zone land for use as a seaport.  <p>
+
+<li>Airports<br>
+Increase the growth potential of your commercial markets.
+Once a city starts getting large, commercial growth will level off
+without an airport. Airports are large and expensive and should not be
+built unless your city can afford one. Position airports to keep
+flight paths over water whenever possible, lessening the impact of air
+disasters.  <p>
+
+Once you build an airport you will see planes flying above your city
+to and from the airport. There is also a traffic helicopter that
+alerts you to heavy traffic areas.  <p>
+
+It costs $10,000 to zone land for use as an airport.  <p>
+
+</ul>
+
+<h2>Micropolis Budget Window</h2>
+
+When your first taxes are collected in a new city, and each year
+after, the Budget Window will appear (unless you select the Auto
+Budget option). You will be asked to set the funding levels for the
+fire, police, and transportation departments, and to set the property
+tax rate.  <p>
+
+The Budget Window can be opened from the Windows Menu. When Auto
+Budget is active, all the funding levels will remain at full funding,
+or your last setting. If there is not enough money to completely fund
+the budget, money will go first to the Transit Department, then the
+Fire Department, then the Police Department.  <p>
+
+You can raise and lower the tax rate and budget levels by 
+dragging the sliders corresponding to each category. 
+Press the button labeled "Continue With These Figures" 
+to make the Budget Window disappear.  <p>
+
+When the Budget Window opens up, 
+a timer in the bottom button starts running. 
+When it runs out, the Budget Window automatically goes
+with the currently selected figures and disappears.
+You can click on the timer button to cancel it, 
+and the Budget Window will stay up for as long as you like.  <p>
+
+<h3>Tax Rate</h3>
+
+The maximum tax rate you can set is 20%.  <p>
+
+The minimum tax rate you can set is 0%.  <p>
+
+The optimum tax rate for fast growth is between 5% and 7%.  <p>
+
+To slow city growth without actually shrinking, set the tax rate to 8% or 9%.  <p>
+
+<h3>Funding Levels</h3>
+
+The amount of yearly funding requested for the fire and police
+departments is $100 per station that you have placed. Until you
+actually build fire or police stations, you cannot fund them. You
+cannot allocate more than 100% of the requested funding for fire and
+police departments -- Micropolis police officers and fire inspectors are
+honest and will not accept your bribes.  <p>
+
+Allocating less than the requested amount will decrease the effective
+coverage of the police or fire stations.  <p>
+
+The amount of yearly funding requested for the transportation
+department is $1 for each section of road, $4 for each section of
+bridge (roads over water), $4 for each section of rail, and $10 for
+each section of tunnel (underwater rails). You cannot allocate more
+than 100% of the requested funds.  <p>
+
+Transportation maintenance funding slightly below 100% will cause
+slow, minor deterioration of the transit system -- an occasional
+pothole or bad track section. Funding between 90% and 75% will cause
+noticeable damage -- many sections of road and rail will be unusable.
+Funding below 75% will cause rapid deterioration of your transit
+system.  <p>
+
+<h3>Cash Flow</h3>
+
+The cash flow is calculated as follows:
+<p>
+<pre>CashFlow = TaxesCllected - TotalAllocatedFunds
+
+</pre>
+
+It will be a negative number if your yearly maintenance costs are
+greater than your yearly tax intake.  <p>
+
+A major difference between Micropolis and a real city is that Micropolis
+does not allow budget deficits. If you don't have the money, you can't
+spend it. Try not to let your city run with a negative cash flow.  <p>
+
+<h2>Micropolis Map Window</h2>
+
+The Map Window shows the entire area of your city. It has a pallet of
+icons down the left edge, for selecting between different map types.
+The maps show demographic information to help you comprehend the state
+of your city.  <p>
+
+You can select between various views by pressing the left mouse button
+over any of the icons. Some of the icons have submenus, that pop up
+when you hold the button down, so you can select different aspects of
+the view.  <p>
+
+One or more yellow rectangular outlines overlay the map, showing the
+location of the Edit Window and Surveyor Window views of the city. You
+can drag the rectangles around the map to pan the other views. You can
+also "throw" the view, by dragging with the left mouse button, and
+releasing the button while moving the mouse. The view keeps on panning
+and bounces off the edges of the map! Click on a moving rectangle to
+make it sit still, or on the map to stop all the bouncing rectangles.
+Use the middle button to avoid such behavior.  <p>
+
+<h3>Using The Maps</h3>
+
+The Map Window should be constantly referred to in all stages of city
+planning, building and managing.  <p>
+
+Before you build, use the map before beginning a new city to plan: <p>
+
+<ul>
+
+<li>Where you want your city center.
+
+<li>Where you want the high-class waterfront residential areas.
+
+<li>Where you will cross water with bridges, power lines and tunnels.
+
+<li>Where to place power plants.
+
+<li>Where to place large industrial sections away from the residential sections.
+
+<li>The general layout of your city.
+
+</ul>
+
+<p>
+
+Printing the map and sketching in your plan with pencil or pen can
+save a lot of bulldozing and re-zoning and rebuilding.  <p>
+
+During city growth: <p>
+
+<ul>
+
+<li>Use the map to guide your city's growth around forest areas, to
+preserve the trees and improve property values.
+
+<li>Use the Transportation Map along with the Traffic Density map to
+plan traffic control and expansion.
+
+<li>Use the City Form Maps to make sure you have the proper ratio of
+residential to commercial to industrial zones.
+
+<li>Use the Pollution Map to detect problem areas, and disperse the
+industrial zones and/or replace roads with rails.
+
+<li>Printing out the map in various stages of development and doing
+some preliminary expansion planning with pencil can be useful.
+Printouts can also be used for city historical records.
+
+</ul>
+
+During city maintenance: <p>
+
+<ul>
+
+<li>Use the Power Grid Map to locate zones that have lost power.
+
+<li>Use the City Services Maps to evaluate the effective coverage of
+your police and fire departments.
+
+<li>Use the Crime Rate Map to locate problem areas that need more
+police protection.
+
+<li>Use the Pollution Map to locate problem areas.
+
+<li>Use the Transportation and Traffic Density Maps to determine where
+to replace roads with rails.
+
+<li>Use the Land Value Map to locate depressed areas for improvement
+or replacement.
+
+<li>Use the City Form Maps to maintain the proper ratio of residential
+to commercial to industrial zones.
+
+</ul>
+
+<h2>Micropolis Graph Window</h2>
+
+The Graph Window gives you time-based graphs of various city data. It
+can be opened through the Windows Menu.  <p>
+
+Unlike the maps, which only show the current state of your city, the
+Graphs give you a record of the past so you can gauge trends and
+cycles.  <p>
+
+You may view graphs for time periods of either the last 10 years or
+the last 120 years by clicking on the "10 YRS." or "120 YRS." button.
+<p>
+
+<ul>
+
+<li>The Residential Population Graph shows the total population in
+residential zones.
+
+<li>The Commercial Population Graph shows the total population in
+commercial zones.
+
+<li>The Industrial Population Graph shows the total population in
+industrial zones.
+
+<li>The Cash Flow Graph shows your city's cash flow: money collected
+in taxes minus money it took to maintain your city. The center of the
+Cash Flow Graph represents a cash flow of zero. Do not build more
+infrastructure (roads, rails, police departments, fire stations) than
+you can support with tax revenues.
+
+<li>The Crime Rate Graph shows the overall crime rate of the entire
+city.
+
+<li>The Pollution Graph shows the overall average pollution reading of
+the entire city.
+
+</ul>
+
+<h3>Using the Graphs</h3>
+
+The Graphs give information on many of the same factors as the maps,
+but show the information over time. Graphs are for locating trends in
+city life that won't be noticeable in a map. If you look at a map, for
+example the Crime Rate Map, a very slight rise in the crime rate will
+not be noticeable. But on the Crime Rate Graph, you would easily
+locate the upward trend in crime because you will be viewing the
+levels for a number of years at the same time.  <p>
+
+Residential, commercial and industrial population growth and/or
+decline can be tracked and displayed. If you notice a downward trend
+in any of these, refer to the User Reference Card to locate potential
+problems and solutions.  <p>
+
+Use the Cash Flow Graph to track your city's efficiency as it grows.
+If your maintenance costs are higher than your tax revenues, you will
+have a negative cash flow.  <p>
+
+The Crime Rate Graph can be displayed, revealing slight but consistent
+upward or downward trends.  <p>
+
+Use the Pollution Graph to catch rising levels of pollution before
+they reach a problem level.  <p>
+
+<h2>Micropolis Evaluation Window</h2>
+
+The Evaluation Window gives you a performance rating. You can access
+it through the Windows Menu.  <p>
+
+Public Opinion is presented in poll form, rating your overall job as
+Mayor and listing what the public regards as the city's most pressing
+problems. You are advised to keep your residents happy or they might
+migrate away, and you will be left with a "ghost town."  <p>
+
+In general, if more than 55% of the populace thinks you are doing a
+good job, then you can feel secure of keeping your job.  <p>
+
+If 10% or less of the people think something is a problem, then it's
+not too bad.  <p>
+
+These are most of the problems that citizens complain about, and how
+to correct them: <p>
+
+<ul>
+
+<li>Traffic -- Replace dense sections of roads with rails.
+
+<li>Crime -- Add police stations and/or raise property values.
+
+<li>Pollution -- Replace roads with rails, disperse industrial zones.
+
+<li>Housing -- Zone more residences.
+
+<li>Housing Costs -- Zone more residences in low property value areas.
+
+<li>Fires -- Build more fire departments.
+
+<li>Taxes -- Lower taxes (if you can). Or lie through your lips.
+
+<li>Unemployment -- Zone more commercial and industrial areas.
+
+</ul>
+
+Statistics on Population, Net Migration, and Assessed Value are
+displayed, along with the city's Game Level and the Overall City
+Score. This data is calculated once a year at budget time.  <p>
+
+Population is the number of residents in your city.  <p>
+
+The Net Migration statistic provides a rating of the desirability of
+your city. If people are leaving in droves, then you know something is
+rotten in Micropolis.  <p>
+
+The Assessed Value is the combined value of all city-owned property:
+roads, rails, power plants, police and fire stations, airports,
+seaports, parks, etc. It does not include residential, commercial and
+industrial zones.  <p>
+
+The Categories are defined by population as follows: <p>
+
+<ul>
+
+<li>Village: 0 to 1,999
+
+<li>Town: 2,000 to 9,999
+
+<li>City: 10,000 to 49,999
+
+<li>Capital: 50,000 to 99,999
+
+<li>Metropolis: 100,000 to 499,999
+
+<li>Megalopolis: 500,000 and above
+
+</ul>
+
+Overall City Score is a composite score based on the following factors
+(some positive, some negative): <p>
+
+<ul>
+
+<li>Major Factors: Crime, pollution, housing costs, taxes, traffic,
+unemployment, fire protection, unpowered zones, city growth rate. 
+
+<li>Minor Factors: Stadium needed (but not built), seaport needed (but
+not built), airport needed (but not built), road funding, police
+funding, fire department funding, and fires. 
+
+</ul>
+
+A large population is not necessarily a sign of a successful city.
+Population size does not affect the overall city score, since low
+population could indicate a new or growing city.  <p>
+
+Since city growth rate does affect the overall city score, a city in
+which growth has been intentionally stopped for environmental or
+aesthetic reasons will have a slightly lower score.  <p>
+
+<h2>City SimNotice Window</h2>
+
+The Notice Window is used to display important messages, and for
+temporary control panels. When something important happens, it pops up
+to the front. 
+Some times it displays a live view of events happening in the city, 
+that you can click on to scroll the editor window to the location of interest.
+You can dismiss the Notice window by clicking the "Dismiss" button along the bottom edge. <p>
+
+
+
+
+
+
+
+
+
+<h2>Growing a City</h2>
+
+While growing a city, refer often to the User Reference Card. It
+provides a chart of City Dynamics; how all factors of city life and
+growth are related.  <p>
+
+The main points to keep in mind while growing a city are: <p>
+
+<ul>
+
+<li>Grow slowly. Watch your money.
+
+<li>All zones must be powered to develop.
+
+<li>Zones must be developed to generate tax money.
+
+<li>Roads or rails must provide access to and from each zone for it to
+fully develop.
+
+<li>There is a yearly maintenance cost for each section of road, rail,
+bridge and tunnel. This can add up. Don't build too many roads and
+rails and generate high maintenance costs before your city can
+generate enough tax revenues to support them.
+
+<li>Extra power plants and redundant power lines are expensive, but
+can keep zones from losing power during a disaster or emergency and
+deteriorating.
+
+<li>Rails can carry much more traffic than roads. While building and
+zoning an area that you predict will generate heavy traffic, install
+rails instead of roads in the early stages of development.
+
+<li>If you get a lot of heavy traffic warnings, replace roads with
+rails. You can build an entirely roadless city, even if you're not a
+train spotter!
+
+<li>Grouping zones together, four of five in a row touching each
+other, can eliminate a lot of power line segments.
+
+<li>Airports, seaports and stadiums won't help a small city grow -- so
+save your money until the city gets larger. The Sims will tell you
+when they need these things.
+
+<li>Place zones, roads, etc. carefully -- they cannot be moved, and
+you will have to pay to bulldoze them and rebuild.
+
+<li>As a rule of thumb, the number of residential zones should be
+approximately equal to the sum of commercial and industrial zones.
+When your city is small, you will need more industrial zones than
+commercial, and when your city gets larger, you will need more
+commercial zones than industrial.
+
+<li>Separate the residential areas from the industrial areas.
+
+<li>Proximity to forests, parks, and water increases land value, which
+increases the taxes collected. Don't bulldoze any more forest than you
+must. Natural shoreline increases property values more than landfill
+shoreline.
+
+<li>Keep in mind that proximity to downtown raises property values.
+The simulator defines the downtown areas as "the center of mass of the
+population density." It calculates the average geographical center of
+the population.
+
+<li>A bigger, more populous city is not necessarily better. Having a
+self-supporting, profitable city with pleasant surroundings is better
+than a huge city that is always broke and has no forest or shoreline.
+
+<li>Use the various maps and graphs to plan city growth, locate
+problems, and track your progress. Look for areas that need police and
+fire coverage as you go, so you don't have to go back and bulldoze
+developed zones to make room for police and fire stations.
+
+<li>Save your city to disk before trying any major new policy so you
+can go back if your plan doesn't work.
+
+<li>Print out your city in different stages of evolution to track and
+plan growth.
+
+<li>Check the Evaluation Window often. The Sims will let you know how
+you are doing. Also the statistics can be useful; if your population
+is shrinking, don't go zoning new areas that may never develop. Look
+for problems in the existing zoned areas, and spend your time and
+money solving them.
+
+<li>Save your city to disk often!!!
+
+</ul>
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/manual/tutorial.html b/manual/tutorial.html
new file mode 100644 (file)
index 0000000..e99ff77
--- /dev/null
@@ -0,0 +1,384 @@
+<head><title>Tutorial -- A Walk Through Your City</title></head><body>
+
+<h1>Tutorial -- A Walk Through Your City</h1>
+
+<h2>Starting Up</h2>
+
+To start up Micropolis, go to the Micropolis directory and run the shell
+script named "Micropolis". The computer will chug for a while as
+HyperLook and Micropolis are loaded. You'll know things are going well
+when you see the Introduction Screen.  <p>
+
+<i>The Introduction Screen</i><p>
+
+Once Micropolis is loaded, the Introduction Screen will go away and be
+replaced by a Welcome Notice, and a Startup Window with a bunch of
+buttons for cities and scenarios.  <p>
+
+<i>The Welcome Notice</i><p>
+
+<i>The Startup Window</i><p>
+
+In case you wonder about any of the buttons or graphics, you can get
+help on anything by pointing at it and pressing the "Help" key. So try
+pressing "Help" over the weird little grill in the upper right corner
+of the Startup Window. This brings up the HyperLook Help stack. Click
+on "Done" to dismiss it.  <p>
+
+<i>The Help Stack</i><p>
+
+<h2>Generating a New City</h2>
+
+Now click the left mouse button on the "New City" button. The Welcome
+Notice will turn into a control panel for setting up a New City, and
+the Startup Screen will turn into a Terrain Generator with a map and
+some buttons.  <p>
+
+<i>The New City Panel</i><p>
+
+<i>The Terrain Generator</i><p>
+
+<h2>City Name</h2>
+
+You can set the name of your city by clicking the left button on the
+"City Name" text field, and typing the name. The delete key erases the
+last character, and Control-U erases to the beginning of the line. You
+can double or triple click on the name to select it, and it will be
+deleted when you type a new name.  <p>
+
+<h2>Game Level</h2>
+
+The three exclusive settings let you select the Game Level. Choose
+"Easy" for now, by clicking the left mouse button. If you're just
+starting out, you can certainly use the extra money!  <p>
+
+<h2>Generate New Terrain</h2>
+
+If you're not satisfied with the terrain map you see, just press
+"Generate New Terrain", and you will get a new map. You can do this as
+many times as you like, until you get a nice map.  <p>
+
+<i>Randomly Generated Terrain Maps</i><p>
+
+<h2>Use This Map</h2>
+
+When you are happy with the terrain map, press the "Use This Map"
+button, and the game will begin!  <p>
+
+<h2>The Edit Window</h2>
+
+You're now playing Micropolis! The Edit Window, which is the main window
+used for controlling Micropolis, will be displayed: <p>
+
+<i>The Edit Window</i><p>
+
+The Edit Window is where you will do the actual building and zoning.
+In the middle of the Edit Window is a detailed map showing part of the
+terrain. Around the edges are controls and fields displaying
+information about the city.  <p>
+
+Along the top edge of the window is the City Name, where the name of
+your city or the scenario you selected is displayed. Clicking on it
+brings the window to the front.  <p>
+
+In the upper left corner is a picture of the City Simulator.
+If you click on that, the Introduction Screen will be displayed
+to show the credits, version, and copyrights. Click on the
+Introduction Screen to dismiss it.  <p>
+
+On the left edge, below the City Simulator, is a Close Box. Clicking
+the left button on the Close Box closes the Edit Window into a small
+icon, a miniature version of the window. Thanks to the way HyperLook
+is designed, when a window is iconified, it continues to animate. You
+can double click on an icon to open it back up to a full sized window.
+<p>
+
+There is a row of Menu Buttons below the title, to the right of the
+Close Box. Pressing the right mouse button down over any of these
+buttons pops up a menu, from which you can select using the right
+mouse button. Clicking the left mouse button over a Menu Button
+selects the menu's default item, without displaying the menu. The
+default menu item has a black ring or rectangle around it. You can set
+the default by pressing the Control key when the menu is up.  <p>
+
+There are three fields below the Menu Buttons, that display your
+Current Funds (in dollars), the Current Date (the year and month), and
+important Messages (one at a time). Clicking on them just brings the
+window to the front.  <p>
+
+Along the left edge of the window are two columns of colorful Tool
+Icons, used for choosing the city editing mode. Click the mouse over
+an icon to select an editing tool. The currently selected tool is
+highlighted in yellow. The Tool Cost field along the bottom edge of
+the window tells you the name of the selected tool, and how many
+dollars it costs to use.  <p>
+
+You can use the selected tool by pressing the left mouse button over
+the map in the middle of the Edit Window. Also, you can pop up a Pie
+Menu to quickly switch between editing tools, by clicking the right
+mouse button over the map. You can easily scroll the map by pressing
+the middle mouse button down over the map and dragging the view
+around.  <p>
+
+The Demand Indicator shows the demand levels for Residential (green),
+Commercial (blue), and Industrial zones (yellow), and can be helpful
+in planning your city.  <p>
+
+The Zoom Control changes the magnification of the map. You can zoom in
+or out to make the graphics larger or smaller, or press the Zoom Reset
+button to zoom back to normal. The animation is fastest at the normal
+size.  <p>
+
+All of the Micropolis windows have Drag Edges with which you can move the
+window around, and Resize Corners to change the size of the window.
+Some windows cannot be resized, so the resize corners just move them
+around. To use them, press the left mouse button down over the corner
+or edge, and move the outline to where you want it. The window will
+move or resize to that location, when you release the button.  <p>
+
+The main portion of the map is land. Your available land is made up of
+three types of terrain. The brown areas are Clear Land, the green
+areas are forests and Trees, and the blue areas are Water. You can
+build only on Clear Land. You can clear forest and extend coastlines
+with your bulldozer. You can run roads, rails, and power lines
+straight across the Water.  <p>
+
+<h2>The Map Window</h2>
+
+The other window that's shown when you start the game is the Map
+Window, which displays an overview of your entire city map: <p>
+
+<i>The Map Window</i><p>
+
+You can see different demographic views of the city, chosen by the
+icons on the left. The type of map is shown along the top edge of the
+window, to the right of the Close Box.  <p>
+
+There is a yellow rectangle in the Map Window that shows the location
+of the detailed city view. (There may be more than one yellow
+rectangles, if multiple views are visible.) Press the mouse button
+down over the yellow rectangle, and drag it around the map, to scroll
+the view.  <p>
+
+<h2>Building a City</h2>
+
+To begin a city, we need: places for Sims to live, places for Sims to
+work, and power.  <p>
+
+You can only build on Clear Land, so use the Bulldozer to clear away
+some trees. Click the left mouse button on the Bulldozer Icon. Move
+the cursor over to land. It now points to a small square, outlining
+the area that will be bulldozed when you click the left button. The
+Trees under your pointer are now Clear Land. Now, hold the left button
+down and drag the pointer across the Trees. Mass destruction. Clear a
+large area of land to prepare for building.  <p>
+
+Click the Residential Icon, then move back to your terrain. Your
+cursor will now point to a large square outline. This outline
+indicates how much clear space you will need to create a Residential
+Zone -- a place for Sims to live. Clicking the left mouse button in
+Clear Land will "zone" that area. The "R" in the zone center indicates
+that it is a Residential Zone. The flashing lightning symbol means
+that the zone has no power. Place a few more Residential Zones next to
+the first one.  <p>
+
+<i>Several New Residential Zones</i><p>
+
+Now decide where to position a Power Plant in your city. Point to the
+Power Plant Icon, and press and hold the left mouse button. A menu
+will appear, giving you the option of choosing a Coal or Nuclear
+plant. For now, release the button over "Coal". The outline for a
+Power Plant is even larger than for a Residential Zone. Place the
+Power Plant in some open space near your Residential Zones. If your
+Power Plant is not directly adjacent to a Residential Zone, you'll
+need to run a Power Line from your Power Plant to the Residential
+Zones.  <p>
+
+To do this, click the left mouse button over the Power Line Icon. By
+pointing your cursor and pressing the button, lay Power Lines from
+your Power Plant to your Residential Zones. Adjacent Power Line
+sections will automatically connect to each other. Road and Rail lines
+connect in the same manner.  <p>
+
+In a moment, the flashing symbols in the Residential Zones will
+disappear, indicating that your zones have been powered. Any zones
+that are adjacent to a powered zone do not need separate Power Lines
+run to them. Soon you will see small houses start to appear. The Sims
+have started to move in!  <p>
+
+<i>Here Comes the Neighborhood!</i><p>
+
+Once there are a few Residential Zones, where Sims can live, you need
+to make it possible for your new residents to find jobs. They can't
+all work at the power plant!  <p>
+
+<i>Residential, Commercial, and Industrial Zones</i><p>
+
+Now you're ready for Commercial and Industrial areas; places for Sims
+to work, shop, and transact business. Select the Commercial Icon and
+place a few Commercial Zones near your Residential ones. Then select
+the Industrial Icon and place some Industrial Zones. Connect all
+necessary Power Lines.  <p>
+
+Notice that as you select different Tool Icons, the icon's description
+and its associated cost will be displayed in the Tool Cost field near
+the lower left corner of the Edit Window. The Current Funds field near
+the top of the window displays your total funds available.  <p>
+
+Now click the left button on the Road Icon and add Roads from your
+Residential housing to the Commercial and Industrial areas to allow
+the Sims to commute to work. Road sections connect themselves like
+Power Line sections. Once you have Roads, traffic will be generated.
+<p>
+
+<i>Roads with Traffic</i><p>
+
+Now move the cursor to the Menu Button labelled "Windows", and press
+the right mouse button down. The Windows Menu will pop up below the
+cursor. Drag the cursor to the menu item labelled "Budget", and
+release the right button. This brings up the Budget Window, which lets
+you set the level of funding for your fire, police, and transportation
+departments.  <p>
+
+<i>The Budget Window</i> <p>
+
+Click the left mouse button on the up and down arrows, or drag the
+sliders to change the funding levels. You can also adjust the current
+tax rate. If you have no police or fire departments, you can't fund
+them. You cannot fund more than 100%. Since your city is so new, you
+can't do much here now, but come back later. Click the left mouse
+button on the "Go With These Figures" button to make the window go
+away when you're done. If the hour glass runs out, the window will go
+away automatically. You can click on the hourglass to keep that from
+happening.  <p>
+
+Now look at the Map Window. You can get an idea of the size of your
+city, and how much room you have left. Try the different map views by
+clicking the left mouse button on the icons along the left edge of the
+Map Window. You will need this information to build and adjust
+conditions in your city. For example, you can pinpoint the areas with
+the highest crime to determine locations for new police stations.  <p>
+
+<i>The Map Window</i><p>
+
+Additional information can be gained through the available Graphs.
+Unlike the Maps, which only show the current state of your city, the
+Graphs give you a record of the past so you can gauge trends and
+cycles. You can display the Graph Window by selecting the item
+labelled "Graph" from the Window Menu.  <p>
+
+<i>The Graph Window</i><p>
+
+You can toggle the various graph displays on and off, and switch
+between 10 year and 120 year graphs, by clicking on the icons at the
+left of the Graph Window.  <p>
+
+Another way to gather information about your city is by using the
+Query Tool. To use this, select the Tool Icon with the magnifying
+glass and question mark, or hold down the "Q" key, then press the left
+mouse button over the map in the Edit Window. You will be shown a
+window filled with information about the zone under the cursor.  <p>
+
+<i>The Zone Status Window</i> <p>
+
+Now, let's Save the city to disk. Use the File Menu to select "Save
+City as...". You'll see the Save File dialog. Near the top of the
+window is a text field labelled "File:". You can select a directory by
+typing its name into the text field, or by double clicking in the
+scrolling list. Then you can type in a name for your city, ending with
+the ".city" extension, and press return. Your city will be saved to
+disk, so you can load it later to get back to where you are now.  <p>
+
+<i>Save File Dialog</i> <p>
+
+To load a city, use the File Menu and select the item labelled "Load
+City...". The Open File dialog looks and works almost like the Save
+File dialog. It will start out in a directory named "Cities", which
+contains some interesting cities included with Micropolis. You can load
+and play any of them, or navigate to the directory where you saved
+your city, and load that again.  <p>
+
+<i>Open File Dialog</i> <p>
+
+This is all the basic information you need to run Micropolis, but we
+suggest reading on. The User Reference section explains in detail how
+to use each program function. Inside Micropolis explains the inner
+workings of the simulator, and gives some brief hints and tips for
+using it. There is also an essay on The History of Cities and City
+Planning, and a Bibliography for serious City Planners.  <p>
+
+Have Fun Playing Micropolis!  <p>
+
+<p>
+
+<hr>
+<p>
+<h2>Micropolis, Unix Version.</h2>
+This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright &copy; 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+<a href="http://wiki.laptop.org/go/Micropolis">http://wiki.laptop.org/go/Micropolis</a> or email  <a href="mailto:micropolis@laptop.org">micropolis@laptop.org</a>.
+</p><p>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+</p><p>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</p><p>
+
+<h3 align="center">ADDITIONAL TERMS per GNU GPL Section 7</h3>
+
+</p><p>
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+</p><p>
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+</p><p>
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+</p><p>
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+</p><p>
+
+This disclaimer supplements the one included in the General Public
+License.  <b>TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.</b>
+</p>
+</body>
diff --git a/micropolisactivity.py b/micropolisactivity.py
new file mode 100644 (file)
index 0000000..1aae9ba
--- /dev/null
@@ -0,0 +1,313 @@
+# -*- mode: python; tab-width: 4 -*-
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+
+import gtk
+import os
+import signal
+import tempfile
+import logging
+import sys
+import time
+import subprocess
+import thread
+import fcntl
+
+from sugar.activity import activity
+from sugar.activity.activity import get_bundle_path
+from sugar import profile
+from gettext import gettext as _
+from glob import glob
+
+try:
+    import pygame.mixer
+    pygame.mixer.init()
+except: pass
+
+try:
+    from sugar.presence import presenceservice
+except ImportError:
+    from sugar.presence import PresenceService as presenceservice
+
+
+def QuoteTCL(s):
+    return s.replace('"', '\\"')
+
+
+class MicropolisActivity(activity.Activity):
+
+    def __init__(self, handle):
+
+        activity.Activity.__init__(self, handle)
+    
+        self.set_title(_('Micropolis Activity'))
+        self.connect('destroy', self._destroy_cb)
+        self.connect('focus-in-event', self._focus_in_cb)
+        self.connect('focus-out-event', self._focus_out_cb)
+
+        signal.signal(signal.SIGCHLD, self._sigchild_handler)
+
+        self._bundle_path = get_bundle_path()
+
+        if False:
+            # FIXME: Plug Micropolis's window into a gtk socket.
+            # Doesn't work yet, but it would be cool if it did. 
+            socket = gtk.Socket()
+            try:
+                self.set_canvas(socket)
+            except AttributeError:
+                self.add(socket)
+            socket.show()
+            socket.connect('plug-added', self._plug_added_cb)
+            socket.connect('plug-removed', self._plug_removed_cb)
+
+            win = socket.get_id()
+
+        command = os.path.join(
+            self._bundle_path,
+            'Micropolis')
+
+        args = [
+            command,
+            #'-R', str(win), # Set root window to socket window id
+            '-t', # Interactive tty mode, so we can send it commands.
+        ]
+
+        logging.debug("CWD: " + self._bundle_path)
+        logging.debug("Micropolis ARGS: " + repr(args))
+
+        self._process = subprocess.Popen(
+            args,
+            stdin=subprocess.PIPE,
+            stdout=subprocess.PIPE,
+            close_fds=True,
+            cwd=self._bundle_path,
+            preexec_fn=lambda: os.chdir(self._bundle_path))
+
+        logging.debug("STARTING THREAD... " + str(self._stdout_thread_function))
+        t = None
+        try:
+            t = thread.start_new(
+                self._stdout_thread_function,
+                ())
+        except Exception, e:
+            logging.debug("EXCEPTION " + str(e))
+        self._stdout_thread = t
+        logging.debug("STARTED THREAD. " + str(t))
+
+        uri = handle.uri or ''
+        logging.debug("Micropolis SUGARSTARTUP URI " + repr(uri))
+        self.send_process(
+            'SugarStartUp "' + QuoteTCL(uri) + '"\n')
+
+        nick = profile.get_nick_name() or ''
+        logging.debug("Micropolis SUGARNICKNAME NICK " + repr(nick))
+        self.send_process(
+            'SugarNickName "' + QuoteTCL(nick) + '"\n')
+
+        #logging.debug("started Micropolis, pid " + repr(self._pid))
+
+        ps = presenceservice.get_instance()
+
+        for buddy in ps.get_buddies():
+            self._buddy_appeared_cb(ps, buddy)
+
+        ps.connect("buddy-appeared", self._buddy_appeared_cb)
+        ps.connect("buddy-disappeared", self._buddy_disappeared_cb)
+
+
+    def _stdout_thread_function(self, *args, **keys):
+        logging.debug("_stdout_thread_function BEGIN " + repr(args) + " " + repr(keys))
+        f = self._process.stdout
+        fcntl.fcntl(f.fileno(), fcntl.F_SETFD, 0)
+        while True:
+            line = 'XXX'
+            try:
+                line = f.readline()
+            except Exception, e:
+                logging.debug("READLINE EXCEPTION " + str(e))
+                break
+            logging.debug("LINE: " + repr(line))
+            line = line.strip()
+            if not line:
+                continue
+            words = line.strip().split(' ')
+            command = words[0]
+            if command == 'PlaySound':
+                logging.debug("PLAYSOUND " + " ".join(words[1:]))
+                self.play_sound(words[1])
+            else:
+                pass # logging.debug(">>> " + line)
+        logging.debug("_stdout_thread_function END")
+
+
+    def play_sound(self, name):
+        fileName = os.path.join(
+            self._bundle_path,
+            'res/sounds',
+            name.lower() + '.wav')
+        print "PLAY_SOUND " + fileName
+        try:
+            sound = pygame.mixer.Sound(fileName)
+            sound.play()
+        except Exception, e:
+            print "Can't play sound: " + fileName + " " + str(e)
+            pass
+
+
+    def send_process(self, message):
+        logging.debug("SEND_PROCESS " + message)
+        self._process.stdin.write(message)
+
+
+    def share(self):
+        logging.debug("SHARE")
+        Activity.share(self)
+        self.send_process(
+            'SugarShare\n')
+
+
+    def quit_process(self):
+        logging.debug("QUIT_PROCESS")
+        self.send_process(
+            'SugarQuit\n')
+        time.sleep(10)
+
+
+    def _plug_added_cb(self, sock):
+        logging.debug("Micropolis window opened")
+        return False
+
+
+    def _plug_removed_cb(self, sock):
+        logging.debug("Micropolis window closed")
+        self.destroy()
+        return False
+
+    
+    def _destroy_cb(self, window):
+        logging.debug("Micropolis activity destroyed %r" % window)
+        self.quit_process()
+
+        
+    def _focus_in_cb(self, window, event):
+        logging.debug("Micropolis activated %r %r" % (window, event))
+        self.send_process(
+            'SugarActivate\n')
+
+
+    def _focus_out_cb(self, window, event):
+        logging.debug("Micropolis deactivated %r %r" % (window, event))
+        self.send_process(
+            'SugarDeactivate\n')
+
+
+    def _buddy_appeared_cb(self, ps, buddy):
+
+        try:
+            key = buddy.props.key or ''
+            nick = buddy.props.nick or ''
+            color = buddy.props.color or ''
+            address = buddy.props.ip4_address or ''
+        except AttributeError:
+            key = buddy.get_name() or ''
+            nick = buddy.get_name() or ''
+            color = buddy.get_color() or ''
+            address = buddy.get_ip4_address() or ''
+
+        logging.debug("Micropolis _BUDDY_APPEARED_CB KEY " + repr(key) + " NICK " + repr(nick) + " COLOR " + repr(color) + " ADDRESS " + repr(address))
+
+        logging.debug("Buddy appeared " + repr(buddy.props.nick))
+
+        self.send_process(
+            'SugarBuddyAdd "' +
+            QuoteTCL(key) + '" "' +
+            QuoteTCL(nick) + '" "' +
+            QuoteTCL(color) + '" "' +
+            QuoteTCL(address) + '"\n')
+
+    def _buddy_disappeared_cb(self, ps, buddy):
+
+        try:
+            key = buddy.props.key or ''
+            nick = buddy.props.nick or ''
+            color = buddy.props.color or ''
+            address = buddy.props.ip4_address or ''
+        except AttributeError:
+            key = buddy.get_name() or ''
+            nick = buddy.get_name() or ''
+            color = buddy.get_color() or ''
+            address = buddy.get_ip4_address() or ''
+
+        logging.debug("Micropolis _BUDDY_DISAPPEARED_CB KEY " + repr(key) + " NICK " + repr(nick) + " COLOR " + repr(color) + " ADDRESS " + repr(address))
+
+        logging.debug("Buddy disappeared " + repr(buddy.props.nick))
+
+        self.send_process(
+            'SugarBuddyDel "' +
+            QuoteTCL(key) + '" "' +
+            QuoteTCL(nick) + '" "' +
+            QuoteTCL(color) + '" "' +
+            QuoteTCL(address) + '"\n')
+
+    def _sigchild_handler(self, signum, frame):
+        logging.debug("got signal %i %r %r" % (signum, frame, self._process))
+        sys.exit(0)
+
diff --git a/res/buildidx.tcl b/res/buildidx.tcl
new file mode 100644 (file)
index 0000000..ca85f8c
--- /dev/null
@@ -0,0 +1,99 @@
+#
+# buildidx.tcl --
+#
+# Code to build Tcl package library. Defines the proc `buildpackageindex'.
+# 
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: buildidx.tcl,v 2.0 1992/10/16 04:51:38 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+proc TCHSH:PutLibLine {outfp package where endwhere autoprocs} {
+    puts $outfp [concat $package $where [expr {$endwhere - $where - 1}] \
+                        $autoprocs]
+}
+
+proc TCLSH:CreateLibIndex {libName} {
+
+    if {[file extension $libName] != ".tlb"} {
+        error "Package library `$libName' does not have the extension `.tlb'"}
+    set idxName "[file root $libName].tndx"
+
+    unlink -nocomplain $idxName
+    set libFH [open $libName r]
+    set idxFH [open $idxName w]
+
+    set contectHdl [scancontext create]
+
+    scanmatch $contectHdl "^#@package: " {
+        set size [llength $matchInfo(line)]
+        if {$size < 2} {
+            error [format "invalid package header \"%s\"" $matchInfo(line)]
+        }
+        if $inPackage {
+            TCHSH:PutLibLine $idxFH $pkgDefName $pkgDefWhere \
+                             $matchInfo(offset) $pkgDefProcs
+        }
+        set pkgDefName   [lindex $matchInfo(line) 1]
+        set pkgDefWhere  [tell $matchInfo(handle)]
+        set pkgDefProcs  [lrange $matchInfo(line) 2 end]
+        set inPackage 1
+    }
+
+    scanmatch $contectHdl "^#@packend" {
+        if !$inPackage {
+            error "#@packend without #@package in $libName
+        }
+        TCHSH:PutLibLine $idxFH $pkgDefName $pkgDefWhere $matchInfo(offset) \
+                         $pkgDefProcs
+        set inPackage 0
+    }
+
+    set inPackage 0
+    if {[catch {
+        scanfile $contectHdl $libFH
+       } msg] != 0} {
+       global errorInfo errorCode
+       close libFH
+       close idxFH
+       error $msg $errorInfo $errorCode
+    }
+    if {![info exists pkgDefName]} {
+        error "No #@package definitions found in $libName"
+    }
+    if $inPackage {
+        TCHSH:PutLibLine $idxFH $pkgDefName $pkgDefWhere [tell $libFH] \
+                         $pkgDefProcs
+    }
+    close $libFH
+    close $idxFH
+    
+    scancontext delete $contectHdl
+
+    # Set mode and ownership of the index to be the same as the library.
+
+    file stat $libName statInfo
+    chmod $statInfo(mode) $idxName
+    chown [list $statInfo(uid) $statInfo(gid)] $idxName
+
+}
+
+proc buildpackageindex {libfile} {
+
+    set status [catch {TCLSH:CreateLibIndex $libfile} errmsg]
+    if {$status != 0} {
+        global errorInfo errorCode
+        error "building package index for `$libfile' failed: $errmsg" \
+              $errorInfo $errorCode
+    }
+}
+
diff --git a/res/button.tcl b/res/button.tcl
new file mode 100644 (file)
index 0000000..4a282d3
--- /dev/null
@@ -0,0 +1,78 @@
+# button.tcl --
+#
+# This file contains Tcl procedures used to manage Tk buttons.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/button.tcl,v 1.7 92/07/28 15:41:13 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# $tk_priv(window@$screen) keeps track of the button containing the mouse, 
+# and $tk_priv(relief@$screen) saves the original relief of the button so 
+# it can be restored when the mouse button is released.
+
+# The procedure below is invoked when the mouse pointer enters a
+# button widget.  It records the button we're in and changes the
+# state of the button to active unless the button is disabled.
+
+proc tk_butEnter w {
+    global tk_priv
+    set screen [winfo screen $w]
+    if {[lindex [$w config -state] 4] != "disabled"} {
+       $w config -state active
+       set tk_priv(window@$screen) $w
+    } else {
+       set tk_priv(window@$screen) ""
+    }
+}
+
+# The procedure below is invoked when the mouse pointer leaves a
+# button widget.  It changes the state of the button back to
+# inactive.
+
+proc tk_butLeave w {
+    global tk_priv
+    if {[lindex [$w config -state] 4] != "disabled"} {
+       $w config -state normal
+    }
+    set screen [winfo screen $w]
+    set tk_priv(window@$screen) ""
+}
+
+# The procedure below is invoked when the mouse button is pressed in
+# a button/radiobutton/checkbutton widget.  It records information
+# (a) to indicate that the mouse is in the button, and
+# (b) to save the button's relief so it can be restored later.
+
+proc tk_butDown w {
+    global tk_priv
+    set screen [winfo screen $w]
+    set tk_priv(relief@$screen) [lindex [$w config -relief] 4]
+    if {[lindex [$w config -state] 4] != "disabled"} {
+       $w config -relief sunken
+       update idletasks
+    }
+}
+
+# The procedure below is invoked when the mouse button is released
+# for a button/radiobutton/checkbutton widget.  It restores the
+# button's relief and invokes the command as long as the mouse
+# hasn't left the button.
+
+proc tk_butUp w {
+    global tk_priv
+    set screen [winfo screen $w]
+    $w config -relief $tk_priv(relief@$screen)
+    update idletasks
+    if {($w == $tk_priv(window@$screen))
+           && ([lindex [$w config -state] 4] != "disabled")} {
+       uplevel #0 [list $w invoke]
+    }
+}
diff --git a/res/dejavu-lgc/DejaVuLGCSans-Bold.ttf b/res/dejavu-lgc/DejaVuLGCSans-Bold.ttf
new file mode 100644 (file)
index 0000000..2fb94ed
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSans-Bold.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSans-BoldOblique.ttf b/res/dejavu-lgc/DejaVuLGCSans-BoldOblique.ttf
new file mode 100644 (file)
index 0000000..4204838
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSans-BoldOblique.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSans-ExtraLight.ttf b/res/dejavu-lgc/DejaVuLGCSans-ExtraLight.ttf
new file mode 100644 (file)
index 0000000..bf6fe1c
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSans-ExtraLight.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSans-Oblique.ttf b/res/dejavu-lgc/DejaVuLGCSans-Oblique.ttf
new file mode 100644 (file)
index 0000000..e260494
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSans-Oblique.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSans.ttf b/res/dejavu-lgc/DejaVuLGCSans.ttf
new file mode 100644 (file)
index 0000000..fc21908
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSans.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSansCondensed-Bold.ttf b/res/dejavu-lgc/DejaVuLGCSansCondensed-Bold.ttf
new file mode 100644 (file)
index 0000000..806e797
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSansCondensed-Bold.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSansCondensed-BoldOblique.ttf b/res/dejavu-lgc/DejaVuLGCSansCondensed-BoldOblique.ttf
new file mode 100644 (file)
index 0000000..45c02ce
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSansCondensed-BoldOblique.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSansCondensed-Oblique.ttf b/res/dejavu-lgc/DejaVuLGCSansCondensed-Oblique.ttf
new file mode 100644 (file)
index 0000000..0e3626c
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSansCondensed-Oblique.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSansCondensed.ttf b/res/dejavu-lgc/DejaVuLGCSansCondensed.ttf
new file mode 100644 (file)
index 0000000..8b1081a
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSansCondensed.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSansMono-Bold.ttf b/res/dejavu-lgc/DejaVuLGCSansMono-Bold.ttf
new file mode 100644 (file)
index 0000000..b55beca
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSansMono-Bold.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSansMono-BoldOblique.ttf b/res/dejavu-lgc/DejaVuLGCSansMono-BoldOblique.ttf
new file mode 100644 (file)
index 0000000..b17ef8b
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSansMono-BoldOblique.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSansMono-Oblique.ttf b/res/dejavu-lgc/DejaVuLGCSansMono-Oblique.ttf
new file mode 100644 (file)
index 0000000..368ed67
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSansMono-Oblique.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSansMono.ttf b/res/dejavu-lgc/DejaVuLGCSansMono.ttf
new file mode 100644 (file)
index 0000000..c2de2e3
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSansMono.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSerif-Bold.ttf b/res/dejavu-lgc/DejaVuLGCSerif-Bold.ttf
new file mode 100644 (file)
index 0000000..6dc8ce4
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSerif-Bold.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSerif-BoldOblique.ttf b/res/dejavu-lgc/DejaVuLGCSerif-BoldOblique.ttf
new file mode 100644 (file)
index 0000000..a6998d0
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSerif-BoldOblique.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSerif-Oblique.ttf b/res/dejavu-lgc/DejaVuLGCSerif-Oblique.ttf
new file mode 100644 (file)
index 0000000..6f8864a
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSerif-Oblique.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSerif.ttf b/res/dejavu-lgc/DejaVuLGCSerif.ttf
new file mode 100644 (file)
index 0000000..987c870
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSerif.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSerifCondensed-Bold.ttf b/res/dejavu-lgc/DejaVuLGCSerifCondensed-Bold.ttf
new file mode 100644 (file)
index 0000000..e2fb188
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSerifCondensed-Bold.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSerifCondensed-BoldOblique.ttf b/res/dejavu-lgc/DejaVuLGCSerifCondensed-BoldOblique.ttf
new file mode 100644 (file)
index 0000000..3be9bcf
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSerifCondensed-BoldOblique.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSerifCondensed-Oblique.ttf b/res/dejavu-lgc/DejaVuLGCSerifCondensed-Oblique.ttf
new file mode 100644 (file)
index 0000000..24e3e89
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSerifCondensed-Oblique.ttf differ
diff --git a/res/dejavu-lgc/DejaVuLGCSerifCondensed.ttf b/res/dejavu-lgc/DejaVuLGCSerifCondensed.ttf
new file mode 100644 (file)
index 0000000..320e744
Binary files /dev/null and b/res/dejavu-lgc/DejaVuLGCSerifCondensed.ttf differ
diff --git a/res/dejavu-lgc/fonts.alias b/res/dejavu-lgc/fonts.alias
new file mode 100644 (file)
index 0000000..a0d2a90
--- /dev/null
@@ -0,0 +1,144 @@
+"-misc-dejavu lgc sans-bold-r-normal--6-60-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-r-normal--12-120-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-r-normal--7-70-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-r-normal--14-140-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-r-normal--8-80-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-r-normal--16-160-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-r-normal--9-90-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-r-normal--18-180-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-r-normal--10-100-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-r-normal--20-200-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-r-normal--11-110-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-r-normal--22-220-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-r-normal--12-120-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-r-normal--24-240-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-r-normal--13-130-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-r-normal--26-260-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-r-normal--14-140-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-r-normal--28-280-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-r-normal--15-150-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-r-normal--30-300-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-r-normal--18-180-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-r-normal--36-360-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-r-normal--24-240-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-r-normal--48-480-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-o-normal--6-60-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-o-normal--12-120-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-o-normal--7-70-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-o-normal--14-140-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-o-normal--8-80-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-o-normal--16-160-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-o-normal--9-90-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-o-normal--18-180-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-o-normal--10-100-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-o-normal--20-200-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-o-normal--11-110-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-o-normal--22-220-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-o-normal--12-120-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-o-normal--24-240-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-o-normal--13-130-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-o-normal--26-260-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-o-normal--14-140-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-o-normal--28-280-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-o-normal--15-150-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-o-normal--30-300-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-o-normal--18-180-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-o-normal--36-360-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-bold-o-normal--24-240-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-bold-o-normal--48-480-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-o-normal--6-60-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-o-normal--12-120-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-o-normal--7-70-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-o-normal--14-140-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-o-normal--8-80-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-o-normal--16-160-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-o-normal--9-90-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-o-normal--18-180-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-o-normal--10-100-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-o-normal--20-200-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-o-normal--11-110-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-o-normal--22-220-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-o-normal--12-120-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-o-normal--24-240-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-o-normal--13-130-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-o-normal--26-260-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-o-normal--14-140-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-o-normal--28-280-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-o-normal--15-150-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-o-normal--30-300-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-o-normal--18-180-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-o-normal--36-360-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-o-normal--24-240-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-o-normal--48-480-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-r-normal--6-60-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-r-normal--12-120-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-r-normal--7-70-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-r-normal--14-140-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-r-normal--8-80-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-r-normal--16-160-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-r-normal--9-90-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-r-normal--18-180-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-r-normal--10-100-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-r-normal--20-200-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-r-normal--11-110-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-r-normal--22-220-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-r-normal--12-120-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-r-normal--24-240-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-r-normal--13-130-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-r-normal--26-260-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-r-normal--14-140-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-r-normal--28-280-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-r-normal--15-150-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-r-normal--30-300-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-r-normal--18-180-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-r-normal--36-360-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans-medium-r-normal--24-240-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans-medium-r-normal--48-480-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-r-normal--6-60-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-r-normal--12-120-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-r-normal--7-70-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-r-normal--14-140-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-r-normal--8-80-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-r-normal--16-160-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-r-normal--9-90-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-r-normal--18-180-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-r-normal--10-100-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-r-normal--20-200-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-r-normal--11-110-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-r-normal--22-220-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-r-normal--12-120-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-r-normal--24-240-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-r-normal--13-130-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-r-normal--26-260-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-r-normal--14-140-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-r-normal--28-280-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-r-normal--15-150-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-r-normal--30-300-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-r-normal--18-180-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-r-normal--36-360-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-r-normal--24-240-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-r-normal--48-480-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-o-normal--6-60-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-o-normal--12-120-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-o-normal--7-70-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-o-normal--14-140-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-o-normal--8-80-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-o-normal--16-160-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-o-normal--9-90-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-o-normal--18-180-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-o-normal--10-100-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-o-normal--20-200-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-o-normal--11-110-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-o-normal--22-220-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-o-normal--12-120-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-o-normal--24-240-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-o-normal--13-130-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-o-normal--26-260-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-o-normal--14-140-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-o-normal--28-280-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-o-normal--15-150-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-o-normal--30-300-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-o-normal--18-180-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-o-normal--36-360-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-bold-o-normal--24-240-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-bold-o-normal--48-480-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-o-normal--6-60-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-o-normal--12-120-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-o-normal--7-70-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-o-normal--14-140-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-o-normal--8-80-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-o-normal--16-160-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-o-normal--9-90-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-o-normal--18-180-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-o-normal--10-100-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-o-normal--20-200-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-o-normal--11-110-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-o-normal--22-220-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-o-normal--12-120-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-o-normal--24-240-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-o-normal--13-130-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-o-normal--26-260-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-o-normal--14-140-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-o-normal--28-280-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-o-normal--15-150-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-o-normal--30-300-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-o-normal--18-180-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-o-normal--36-360-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-o-normal--24-240-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-o-normal--48-480-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-r-normal--6-60-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-r-normal--12-120-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-r-normal--7-70-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-r-normal--14-140-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-r-normal--8-80-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-r-normal--16-160-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-r-normal--9-90-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-r-normal--18-180-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-r-normal--10-100-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-r-normal--20-200-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-r-normal--11-110-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-r-normal--22-220-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-r-normal--12-120-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-r-normal--24-240-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-r-normal--13-130-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-r-normal--26-260-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-r-normal--14-140-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-r-normal--28-280-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-r-normal--15-150-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-r-normal--30-300-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-r-normal--18-180-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-r-normal--36-360-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans condensed-medium-r-normal--24-240-75-75-p-0-iso8859-1" "-misc-dejavu lgc sans condensed-medium-r-normal--48-480-0-0-p-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-r-normal--6-60-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-r-normal--12-120-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-r-normal--7-70-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-r-normal--14-140-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-r-normal--8-80-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-r-normal--16-160-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-r-normal--9-90-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-r-normal--18-180-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-r-normal--10-100-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-r-normal--20-200-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-r-normal--11-110-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-r-normal--22-220-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-r-normal--12-120-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-r-normal--24-240-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-r-normal--13-130-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-r-normal--26-260-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-r-normal--14-140-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-r-normal--28-280-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-r-normal--15-150-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-r-normal--30-300-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-r-normal--18-180-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-r-normal--36-360-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-r-normal--24-240-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-r-normal--48-480-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-o-normal--6-60-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-o-normal--12-120-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-o-normal--7-70-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-o-normal--14-140-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-o-normal--8-80-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-o-normal--16-160-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-o-normal--9-90-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-o-normal--18-180-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-o-normal--10-100-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-o-normal--20-200-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-o-normal--11-110-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-o-normal--22-220-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-o-normal--12-120-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-o-normal--24-240-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-o-normal--13-130-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-o-normal--26-260-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-o-normal--14-140-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-o-normal--28-280-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-o-normal--15-150-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-o-normal--30-300-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-o-normal--18-180-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-o-normal--36-360-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-bold-o-normal--24-240-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-bold-o-normal--48-480-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-o-normal--6-60-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-o-normal--12-120-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-o-normal--7-70-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-o-normal--14-140-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-o-normal--8-80-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-o-normal--16-160-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-o-normal--9-90-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-o-normal--18-180-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-o-normal--10-100-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-o-normal--20-200-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-o-normal--11-110-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-o-normal--22-220-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-o-normal--12-120-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-o-normal--24-240-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-o-normal--13-130-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-o-normal--26-260-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-o-normal--14-140-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-o-normal--28-280-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-o-normal--15-150-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-o-normal--30-300-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-o-normal--18-180-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-o-normal--36-360-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-o-normal--24-240-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-o-normal--48-480-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-r-normal--6-60-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-r-normal--12-120-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-r-normal--7-70-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-r-normal--14-140-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-r-normal--8-80-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-r-normal--16-160-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-r-normal--9-90-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-r-normal--18-180-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-r-normal--10-100-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-r-normal--20-200-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-r-normal--11-110-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-r-normal--22-220-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-r-normal--12-120-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-r-normal--24-240-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-r-normal--13-130-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-r-normal--26-260-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-r-normal--14-140-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-r-normal--28-280-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-r-normal--15-150-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-r-normal--30-300-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-r-normal--18-180-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-r-normal--36-360-0-0-m-0-iso8859-1"
+"-misc-dejavu lgc sans mono-medium-r-normal--24-240-75-75-m-0-iso8859-1" "-misc-dejavu lgc sans mono-medium-r-normal--48-480-0-0-m-0-iso8859-1"
diff --git a/res/dejavu-lgc/fonts.dir b/res/dejavu-lgc/fonts.dir
new file mode 100644 (file)
index 0000000..062a587
--- /dev/null
@@ -0,0 +1,22 @@
+21
+DejaVuLGCSans-Bold.ttf -misc-dejavu lgc sans-bold-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSans-BoldOblique.ttf -misc-dejavu lgc sans-bold-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSans-ExtraLight.ttf -misc-dejavu lgc sans light-extralight-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSans-Oblique.ttf -misc-dejavu lgc sans-medium-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSans.ttf -misc-dejavu lgc sans-medium-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSansCondensed-Bold.ttf -misc-dejavu lgc sans condensed-bold-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSansCondensed-BoldOblique.ttf -misc-dejavu lgc sans condensed-bold-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSansCondensed-Oblique.ttf -misc-dejavu lgc sans condensed-medium-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSansCondensed.ttf -misc-dejavu lgc sans condensed-medium-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSansMono-Bold.ttf -misc-dejavu lgc sans mono-bold-r-normal--0-0-0-0-m-0-iso8859-1
+DejaVuLGCSansMono-BoldOblique.ttf -misc-dejavu lgc sans mono-bold-o-normal--0-0-0-0-m-0-iso8859-1
+DejaVuLGCSansMono-Oblique.ttf -misc-dejavu lgc sans mono-medium-o-normal--0-0-0-0-m-0-iso8859-1
+DejaVuLGCSansMono.ttf -misc-dejavu lgc sans mono-medium-r-normal--0-0-0-0-m-0-iso8859-1
+DejaVuLGCSerif-Bold.ttf -misc-dejavu lgc serif-bold-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSerif-BoldOblique.ttf -misc-dejavu lgc serif-bold-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSerif-Oblique.ttf -misc-dejavu lgc serif-medium-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSerif.ttf -misc-dejavu lgc serif-medium-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSerifCondensed-Bold.ttf -misc-dejavu lgc serif condensed-bold-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSerifCondensed-BoldOblique.ttf -misc-dejavu lgc serif condensed-bold-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSerifCondensed-Oblique.ttf -misc-dejavu lgc serif condensed-medium-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSerifCondensed.ttf -misc-dejavu lgc serif condensed-medium-r-normal--0-0-0-0-p-0-iso8859-1
diff --git a/res/dejavu-lgc/fonts.scale b/res/dejavu-lgc/fonts.scale
new file mode 100644 (file)
index 0000000..062a587
--- /dev/null
@@ -0,0 +1,22 @@
+21
+DejaVuLGCSans-Bold.ttf -misc-dejavu lgc sans-bold-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSans-BoldOblique.ttf -misc-dejavu lgc sans-bold-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSans-ExtraLight.ttf -misc-dejavu lgc sans light-extralight-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSans-Oblique.ttf -misc-dejavu lgc sans-medium-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSans.ttf -misc-dejavu lgc sans-medium-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSansCondensed-Bold.ttf -misc-dejavu lgc sans condensed-bold-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSansCondensed-BoldOblique.ttf -misc-dejavu lgc sans condensed-bold-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSansCondensed-Oblique.ttf -misc-dejavu lgc sans condensed-medium-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSansCondensed.ttf -misc-dejavu lgc sans condensed-medium-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSansMono-Bold.ttf -misc-dejavu lgc sans mono-bold-r-normal--0-0-0-0-m-0-iso8859-1
+DejaVuLGCSansMono-BoldOblique.ttf -misc-dejavu lgc sans mono-bold-o-normal--0-0-0-0-m-0-iso8859-1
+DejaVuLGCSansMono-Oblique.ttf -misc-dejavu lgc sans mono-medium-o-normal--0-0-0-0-m-0-iso8859-1
+DejaVuLGCSansMono.ttf -misc-dejavu lgc sans mono-medium-r-normal--0-0-0-0-m-0-iso8859-1
+DejaVuLGCSerif-Bold.ttf -misc-dejavu lgc serif-bold-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSerif-BoldOblique.ttf -misc-dejavu lgc serif-bold-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSerif-Oblique.ttf -misc-dejavu lgc serif-medium-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSerif.ttf -misc-dejavu lgc serif-medium-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSerifCondensed-Bold.ttf -misc-dejavu lgc serif condensed-bold-r-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSerifCondensed-BoldOblique.ttf -misc-dejavu lgc serif condensed-bold-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSerifCondensed-Oblique.ttf -misc-dejavu lgc serif condensed-medium-o-normal--0-0-0-0-p-0-iso8859-1
+DejaVuLGCSerifCondensed.ttf -misc-dejavu lgc serif condensed-medium-r-normal--0-0-0-0-p-0-iso8859-1
diff --git a/res/entry.tcl b/res/entry.tcl
new file mode 100644 (file)
index 0000000..2599c98
--- /dev/null
@@ -0,0 +1,78 @@
+# entry.tcl --
+#
+# This file contains Tcl procedures used to manage Tk entries.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/entry.tcl,v 1.2 92/05/23 16:40:57 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# The procedure below is invoked to backspace over one character
+# in an entry widget.  The name of the widget is passed as argument.
+
+proc tk_entryBackspace w {
+    set x [expr {[$w index cursor] - 1}]
+    if {$x != -1} {$w delete $x}
+}
+
+# The procedure below is invoked to backspace over one word in an
+# entry widget.  The name of the widget is passed as argument.
+
+proc tk_entryBackword w {
+    set string [$w get]
+    set curs [expr [$w index cursor]-1]
+    if {$curs < 0} return
+    for {set x $curs} {$x > 0} {incr x -1} {
+       if {([string first [string index $string $x] " \t"] < 0)
+               && ([string first [string index $string [expr $x-1]] " \t"]
+               >= 0)} {
+           break
+       }
+    }
+    $w delete $x $curs
+}
+
+# The procedure below is invoked after insertions.  If the caret is not
+# visible in the window then the procedure adjusts the entry's view to
+# bring the caret back into the window again.
+
+proc tk_entrySeeCaret w {
+    set c [$w index cursor]
+    set left [$w index @0]
+    if {$left > $c} {
+       $w view $c
+       return
+    }
+    while {[$w index @[expr [winfo width $w]-5]] < $c} {
+       set left [expr $left+1]
+       $w view $left
+    }
+}
+
+proc tk_entryCopyPress {w} {
+  set sel ""
+  catch {set sel [selection -window $w get]}
+  $w insert cursor $sel
+  tk_entrySeeCaret $w
+}
+
+proc tk_entryCutPress {w} {
+  catch {$w delete sel.first sel.last}
+  tk_entrySeeCaret $w
+}
+
+proc tk_entryDelLine {w} {
+  $w delete 0 end
+}
+
+proc tk_entryDelPress {w} {
+  tk_entryBackspace $w
+  tk_entrySeeCaret $w
+}
diff --git a/res/help.tcl b/res/help.tcl
new file mode 100644 (file)
index 0000000..6f5ae95
--- /dev/null
@@ -0,0 +1,273 @@
+# Help system, for Unix Micropolis.
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+
+# Help messages to do:
+# MicropolisMenu
+
+# backstop help message
+
+Help Window {Micropolis Window} \
+{This is one of Micropolis's windows.
+Press Help or Meta-Click on the other controls and graphics for more information about them.
+[More help to come in a later version!  Sorry!]}
+
+# AskQuestion button help
+
+Help SelectCity.No {Keep Playing} \
+{Press this button to keep playing with the current city simulation.}
+
+Help SelectCity.Yes {Another City} \
+{Press this vote button to abandon this city and choose another one to play with.}
+
+Help Quit.No {Keep Playing Micropolis} \
+{Press this button to continue playing this game of Micropolis.}
+
+Help Quit.IQuit {Really Quit Micropolis} \
+{Press this button to quit playing this game of Micropolis.}
+
+Help Quit.IResign {Resign Micropolis} \
+{Press this button to resign yourself from this game of Micropolis.}
+
+Help Quit.AllQuit {Everyone Quit Micropolis} \
+{Press this vote button to quit Micropolis if everyone else agrees.}
+
+Help Plan.Veto {Veto Plan} \
+{Press this button to veto the plan.}
+
+Help Plan.Goto {Goto Plan} \
+{Press this button to scroll your editor window to the planned location.}
+
+Help Plan.Support {Support Plan} \
+{Press this vote button to support the plan.}
+
+Help Disaster.Yes {Cause a Disaster} \
+{Press this button to cause a disaster.}
+
+Help Disaster.No {Don't Cause a Disaster} \
+{Press this button to avoid causing a disaster.}
+
+# head window help
+
+Help Head {Micropolis Controls Window} {}
+Help Head.MicropolisMenu {Micropolis Main Menu} {}
+Help Head.OptionsMenu {Options Menu} {}
+Help Head.DisastersMenu {Disasters Menu} {}
+Help Head.TimeMenu {Time Menu} {}
+Help Head.PriorityMenu {Priority Menu} {}
+Help Head.WindowsMenu {Windows Menu} {}
+Help Head.Date {Micropolis Date Display} {}
+Help Head.Funds {Micropolis Funds Display} {}
+Help Head.Graph {Res Com Ind History Graph} {}
+Help Head.Demand {Res Com Ind Demand Gauge} {}
+Help Head.Log {Scrolling Message Log} {}
+Help Head.Scrollbar {Message Log Scrollbar} {}
+Help Head.Chat {Chat Push Button} {}
+Help Head.Entry {Text Entry Field} {}
+
+# notice window help
+
+Help Notice {Micropolis Notice Window} {}
+Help Notice.Title {Notice Title} {}
+Help Notice.Text {Notice Text} {}
+Help Notice.Dismiss {Notice Dismiss Button} {}
+Help Notice.View {Notice Map View} {}
+
+# help window help
+
+Help Help {Micropolis Help Window} {}
+Help Help.Title {Help Title} {}
+Help Help.Scrollbar {Help Text Scrollbar} {}
+Help Help.Text {Help Text} {}
+Help Help.Dismiss {Help Dismiss Button} {}
+
+# frob window help
+
+Help Frob {Micropolis Frob-O-Matic Dynamic Zone Filter} {This bank of (min/max) interval sliders adjust the filters for the dynamic zone map view. The zones that do not pass through the filter are invisible, and the zones passing through all the filters are displayed, as you adjust the filter intervals.}
+Help Frob.Title {Frob Title} {}
+Help Frob.PopulationDensity {Frob Population Density} {Adjust the minimum and maximum Population Density to display in the dynamic map zone menu.}
+Help Frob.RateOfGrowth {Frob Rate Of Growth} {Adjust the minimum and maximum Rate Of Growth to display in the dynamic map zone menu.}
+Help Frob.TrafficDensity {Frob Traffic Density} {Adjust the minimum and maximum Traffic Density to display in the dynamic map zone menu.}
+Help Frob.PollutionRate {Frob Pollution Rate} {Adjust the minimum and maximum Pollution Rate to display in the dynamic map zone menu.}
+Help Frob.CrimeRate {Frob Crime Rate} {Adjust the minimum and maximum Crime Rate to display in the dynamic map zone menu.}
+Help Frob.LandValue {Frob Land Value} {Adjust the minimum and maximum Land Value to display in the dynamic map zone menu.}
+Help Frob.PoliceEffect {Frob Police Effect} {Adjust the minimum and maximum Police Effect to display in the dynamic map zone menu.}
+Help Frob.FireEffect {Frob Fire Effect} {Adjust the minimum and maximum Fire Effect to display in the dynamic map zone menu.}
+Help Frob.Dismiss {Frob Dismiss Button} {}
+
+# scenario window help
+
+Help Scenario {Micropolis Chooser Window} {}
+Help Scenario.NewCity {New City Button} {}
+Help Scenario.LoadCity {Load City Button} {}
+Help Scenario.Dullsville {Dullsville Scenario Button} {}
+Help Scenario.SanFran {San Francisco Scenario Button} {}
+Help Scenario.Hamburg {Hamburg Scenario Button} {}
+Help Scenario.Bern {Bern Scenario Button} {}
+Help Scenario.Tokyo {Tokyo Scenario Button} {}
+Help Scenario.Rio {Rio de Janeiro Scenario Button} {}
+Help Scenario.Boston {Boston Scenario Button} {}
+Help Scenario.Detroit {Detroit Scenario Button} {}
+Help Scenario.Previous {Previous Map Button} {}
+Help Scenario.Use {Use This Map Button} {}
+Help Scenario.Next {Next Map Button} {}
+Help Scenario.Name {City Name Entry Field} {}
+Help Scenario.Level {Game Level Buttons} {}
+
+# map window help
+
+Help Map {Micropolis Map Window} {}
+Help Map.View {Map View} {}
+Help Map.Zones {Map Zones Menu} {}
+Help Map.Overlays {Map Overlays Menu} {}
+
+# editor window help
+
+Help Editor {Micropolis Editor Window} {}
+Help Editor.Display {Editor Display Menu} {}
+Help Editor.Options {Editor Options Menu} {}
+Help Editor.Message {Editor Message Banner} {}
+Help Editor.View {Editor View} {}
+Help Editor.ToolPallet {Editor Tool Pallet} {}
+Help Editor.ToolName {Editor Tool Name} {}
+Help Editor.ToolCost {Editor Tool Cost} {}
+Help Editor.ToolRes {Residential Zone Tool Icon} {}
+Help Editor.ToolCom {Commercial Zone Tool Icon} {}
+Help Editor.ToolInd {Industrial Zone Tool Icon} {}
+Help Editor.ToolFire {Fire Station Tool Icon} {}
+Help Editor.ToolQuery {Query Tool Icon} {}
+Help Editor.ToolPolice {Police Station Tool Icon} {}
+Help Editor.ToolWire {Wire Tool Icon} {}
+Help Editor.ToolBulldozer {Bulldozer Tool Icon} {}
+Help Editor.ToolRail {Rail Tool Icon} {}
+Help Editor.ToolRoad {Road Tool Icon} {}
+Help Editor.ToolChalk {Chalk Tool Icon} {}
+Help Editor.ToolEraser {Eraser Tool Icon} {}
+Help Editor.ToolStadium {Stadium Tool Icon} {}
+Help Editor.ToolPark {Park Tool Icon} {}
+Help Editor.ToolSeaport {Seaport Tool Icon} {}
+Help Editor.ToolCoal {Coal Power Plant Tool Icon} {}
+Help Editor.ToolNuclear {Nuclear Power Plant Tool Icon} {}
+Help Editor.ToolAirport {Airport Tool Icon} {}
+Help Editor.ToolPie {Editor Tool Pie Menu} {}
+Help Editor.ZonePie {Editor Tool Zone Pie Menu} {}
+Help Editor.BuildPie {Editor Tool Build Pie Menu} {}
+
+# budget window help
+
+Help Budget {Micropolis Budget Window} {}
+Help Budget.Label {Paused to set the Budget} {}
+Help Budget.Collected {Taxes Collected} {}
+Help Budget.Flow {Cash Flow} {}
+Help Budget.Previous {Previous Funds} {}
+Help Budget.Current {Current Funds} {}
+Help Budget.Road {Road Fund} {}
+Help Budget.Fire {Fire Fund} {}
+Help Budget.Police {Police Fund} {}
+Help Budget.Tax {Tax Rate} {}
+Help Budget.Continue {Continue With These Figures} {}
+Help Budget.Reset {Reset to Original Figures} {}
+Help Budget.Cancel {Cancel Changes and Continue} {}
+Help Budget.AutoCancel {Automatic Cancel Timeout} {}
+
+# graph window help
+
+Help Graph {Micropolis Graph Window} {}
+Help Graph.10Years {Graph 10 Year Scale} {}
+Help Graph.120Years {Graph 120 Year Scale} {}
+Help Graph.Res {Graph Residential Toggle} {}
+Help Graph.Com {Graph Commercial Toggle} {}
+Help Graph.Ind {Graph Industrial Toggle} {}
+Help Graph.Money {Graph Cash Flow Toggle} {}
+Help Graph.Crime {Graph Crime Toggle} {}
+Help Graph.Pollution {Graph Pollution Toggle} {}
+Help Graph.View {Graph View} {}
+Help Graph.Dismiss {Dismiss Graph Window Button} {}
+
+# evaluation window help
+
+Help Evaluation {Micropolis Evaluation Window} {}
+Help Evaluation.Opinion {Public Opinion} {}
+Help Evaluation.GoodJob {Are You Doing a Good Job?} {}
+Help Evaluation.WorstProblems {Your Worst Problems} {}
+Help Evaluation.Statistics {Statistics} {}
+Help Evaluation.Score {Score} {}
+Help Evaluation.Dismiss {Dismiss Evaluation Window Button} {}
+
+# ask window help
+
+Help Ask {Micropolis Query Window} {}
+
+# add player window
+
+Help Player {Micropolis Player Window} {}
+Help Player.Players {Displays of Micropolis Players} {}
+Help Player.Display {Display of Player to Add} {}
+Help Player.Dismiss {Dismiss Player Window Button} {}
+
+# file window
+
+Help File {Micropolis File Chooser Window} {}
+Help File.List {List of File Names} {}
+Help File.Directory {Directory Name} {}
+Help File.File {File Name} {}
+Help File.OK {OK Button} {}
+Help File.Rescan {Rescan Directory} {}
+Help File.Cancel {Cancel File Chooser} {}
diff --git a/res/hexa.112 b/res/hexa.112
new file mode 100644 (file)
index 0000000..f8908c8
Binary files /dev/null and b/res/hexa.112 differ
diff --git a/res/hexa.232 b/res/hexa.232
new file mode 100644 (file)
index 0000000..57d0d1c
Binary files /dev/null and b/res/hexa.232 differ
diff --git a/res/hexa.384 b/res/hexa.384
new file mode 100644 (file)
index 0000000..58c129e
Binary files /dev/null and b/res/hexa.384 differ
diff --git a/res/hexa.385 b/res/hexa.385
new file mode 100644 (file)
index 0000000..dd7a431
Binary files /dev/null and b/res/hexa.385 differ
diff --git a/res/hexa.386 b/res/hexa.386
new file mode 100644 (file)
index 0000000..3b6506c
Binary files /dev/null and b/res/hexa.386 differ
diff --git a/res/hexa.387 b/res/hexa.387
new file mode 100644 (file)
index 0000000..3e7798b
Binary files /dev/null and b/res/hexa.387 differ
diff --git a/res/hexa.388 b/res/hexa.388
new file mode 100644 (file)
index 0000000..842527c
Binary files /dev/null and b/res/hexa.388 differ
diff --git a/res/hexa.456 b/res/hexa.456
new file mode 100644 (file)
index 0000000..8d8866f
Binary files /dev/null and b/res/hexa.456 differ
diff --git a/res/hexa.544 b/res/hexa.544
new file mode 100644 (file)
index 0000000..9b3c512
Binary files /dev/null and b/res/hexa.544 differ
diff --git a/res/hexa.563 b/res/hexa.563
new file mode 100644 (file)
index 0000000..b735c67
Binary files /dev/null and b/res/hexa.563 differ
diff --git a/res/hexa.999 b/res/hexa.999
new file mode 100644 (file)
index 0000000..1cc9fa2
Binary files /dev/null and b/res/hexa.999 differ
diff --git a/res/init.tcl b/res/init.tcl
new file mode 100644 (file)
index 0000000..3630886
--- /dev/null
@@ -0,0 +1,153 @@
+# init.tcl --
+#
+# Default system startup file for Tcl-based applications.  Defines
+# "unknown" procedure and auto-load facilities.
+#
+# $Header: /user6/ouster/tcl/scripts/RCS/init.tcl,v 1.7 92/07/25 16:29:36 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1991-1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# unknown:
+# Invoked when a Tcl command is invoked that doesn't exist in the
+# interpreter:
+#
+#      1. See if the autoload facility can locate the command in a
+#         Tcl script file.  If so, load it and execute it.
+#      2. See if the command exists as an executable UNIX program.
+#         If so, "exec" the command.
+#      3. See if the command is a valid abbreviation for another command.
+#         if so, invoke the command.  However, only permit abbreviations
+#         at top-level.
+
+proc unknown args {
+    global auto_noexec auto_noload env unknown_active
+
+    if [info exists unknown_active] {
+       unset unknown_active
+       error "unexpected recursion in \"unknown\" command"
+    }
+    set unknown_active 1
+    set name [lindex $args 0]
+    if ![info exists auto_noload] {
+       if [auto_load $name] {
+           unset unknown_active
+           return [uplevel $args]
+       }
+    }
+    if ![info exists auto_noexec] {
+       if [auto_execok $name] {
+           unset unknown_active
+           return [uplevel exec $args]
+       }
+    }
+    if {([info level] == 1) && ([info script] == "")} {
+       set cmds [info commands $name*]
+       if {[llength $cmds] == 1} {
+           unset unknown_active
+           return [uplevel [lreplace $args 0 0 $cmds]]
+       }
+       if {[llength $cmds] != 0} {
+           unset unknown_active
+           if {$name == ""} {
+               error "empty command name \"\""
+           } else {
+               error "ambiguous command name \"$name\": [lsort $cmds]"
+           }
+       }
+    }
+    unset unknown_active
+    error "invalid command name \"$name\""
+}
+
+# auto_load:
+# Checks a collection of library directories to see if a procedure
+# is defined in one of them.  If so, it sources the appropriate
+# library file to create the procedure.  Returns 1 if it successfully
+# loaded the procedure, 0 otherwise.
+
+proc auto_load cmd {
+    global auto_index auto_oldpath auto_path env
+    if [info exists auto_index($cmd)] {
+       uplevel #0 source $auto_index($cmd)
+       return 1
+    }
+    if [catch {set path $auto_path}] {
+       if [catch {set path $env(TCLLIBPATH)}] {
+           if [catch {set path [info library]}] {
+               return 0
+           }
+       }
+    }
+    if [info exists auto_oldpath] {
+       if {$auto_oldpath == $path} {
+           return 0
+       }
+    }
+    set auto_oldpath $path
+    catch {unset auto_index}
+    foreach dir $path {
+       set f ""
+       catch {
+           set f [open $dir/tclindex]
+           if {[gets $f] != "# Tcl autoload index file: each line identifies a Tcl"} {
+               puts stdout "Bad id line in file $dir/tclindex"
+               error done
+           }
+           while {[gets $f line] >= 0} {
+               if {([string index $line 0] == "#") || ([llength $line] != 2)} {
+                   continue
+               }
+               set name [lindex $line 0]
+               if {![info exists auto_index($name)]} {
+                   set auto_index($name) $dir/[lindex $line 1]
+               }
+           }
+       }
+       if {$f != ""} {
+           close $f
+       }
+    }
+    if [info exists auto_index($cmd)] {
+       uplevel #0 source $auto_index($cmd)
+       return 1
+    }
+    return 0
+}
+
+# auto_execok:
+# Returns 1 if there's an executable in the current path for the
+# given name, 0 otherwise.  Builds an associative array auto_execs
+# that caches information about previous checks, for speed.
+
+proc auto_execok name {
+    global auto_execs env
+
+    if [info exists auto_execs($name)] {
+       return $auto_execs($name)
+    }
+    set auto_execs($name) 0
+    foreach dir [split $env(PATH) :] {
+       if {[file executable $dir/$name] && ![file isdirectory $dir/$name]} {
+           set auto_execs($name) 1
+           return 1
+       }
+    }
+    return 0
+}
+
+# auto_reset:
+# Destroy all cached information for auto-loading and auto-execution,
+# so that the information gets recomputed the next time it's needed.
+
+proc auto_reset {} {
+    global auto_execs auto_index
+    unset auto_execs auto_index
+}
diff --git a/res/listbox.tcl b/res/listbox.tcl
new file mode 100644 (file)
index 0000000..a1f6992
--- /dev/null
@@ -0,0 +1,29 @@
+# listbox.tcl --
+#
+# This file contains Tcl procedures used to manage Tk listboxes.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/listbox.tcl,v 1.2 92/06/03 15:21:28 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# The procedure below may be invoked to change the behavior of
+# listboxes so that only a single item may be selected at once.
+# The arguments give one or more windows whose behavior should
+# be changed;  if one of the arguments is "Listbox" then the default
+# behavior is changed for all listboxes.
+
+proc tk_listboxSingleSelect args {
+    foreach w $args {
+       bind $w <B1-Motion> {%W select from [%W nearest %y]} 
+       bind $w <Shift-1> {%W select from [%W nearest %y]}
+       bind $w <Shift-B1-Motion> {%W select from [%W nearest %y]}
+    }
+}
diff --git a/res/menu.tcl b/res/menu.tcl
new file mode 100644 (file)
index 0000000..ea9e13e
--- /dev/null
@@ -0,0 +1,478 @@
+# menu.tcl --
+#
+# This file contains Tcl procedures used to manage Tk menus and
+# menubuttons.  Most of the code here is dedicated to support for
+# menu traversal via the keyboard.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/menu.tcl,v 1.11 92/08/08 14:49:55 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# The procedure below is publically available.  It is used to indicate
+# the menus associated with a particular top-level window, for purposes
+# of keyboard menu traversal.  Its first argument is the path name of
+# a top-level window, and any additional arguments are the path names of
+# the menu buttons associated with that top-level window, in the order
+# they should be traversed.  If no menu buttons are named, the procedure
+# returns the current list of menus for w.  If a single empty string is
+# supplied, then the menu list for w is cancelled.  Otherwise, tk_menus
+# sets the menu list for w to the menu buttons.
+
+# Variables used by menu buttons:
+# $tk_priv(posted@$screen) -   keeps track of the menubutton whose menu is
+#                              currently posted (or empty string, if none).
+# $tk_priv(inMenuButton@$screen)-
+#                              if non-null, identifies menu button
+#                              containing mouse pointer.
+# $tk_priv(relief@$screen) -   keeps track of original relief of posted
+#                              menu button, so it can be restored later.
+# $tk_priv(dragging@$screen) - if non-null, identifies menu button whose
+#                              menu is currently being dragged in a tear-off
+#                              operation.
+# $tk_priv(focus@$screen) -    records old focus window so focus can be
+#                              returned there after keyboard traversal
+#                              to menu.
+#
+# Variables used by menus:
+#     $tk_priv(x@$screen) and $tk_priv(y@$screen) are used to keep
+#     track of the position of the mouse cursor in the menu window
+#     during dragging of tear-off menus.  $tk_priv(window) keeps track
+#     of the menu containing the mouse, if any.
+
+proc tk_menus {w args} {
+    global tk_priv
+
+    if {$args == ""} {
+       if [catch {set result [set tk_priv(menusFor$w)]}] {
+           return ""
+       }
+       return $result
+    }
+
+    if {$args == "{}"} {
+       catch {unset tk_priv(menusFor$w)}
+       return ""
+    }
+
+    append tk_priv(menusFor$w) " $args"
+}
+
+# The procedure below is publically available.  It takes any number of
+# arguments taht are names of widgets or classes.  It sets up bindings
+# for the widgets or classes so that keyboard menu traversal is possible
+# when the input focus is in those widgets or classes.
+
+proc tk_bindForTraversal args {
+    foreach w $args {
+       bind $w <Alt-KeyPress> {tk_traverseToMenu %W %A}
+       bind $w <F10> {tk_firstMenu %W}
+    }
+}
+
+# The procedure below does all of the work of posting a menu (including
+# unposting any other menu that might currently be posted).  The "w"
+# argument is the name of the menubutton for the menu to be posted.
+# Note:  if $w is disabled then the procedure does nothing.
+
+proc tk_mbPost {w} {
+    global tk_priv
+    if {[lindex [$w config -state] 4] == "disabled"} {
+       return
+    }
+    set screen [winfo screen $w]
+    if {![info exists tk_priv(posted@$screen)]} {
+       set tk_priv(posted@$screen) {}
+    }
+    if {![info exists tk_priv(focus@$screen)]} {
+       set tk_priv(focus@$screen) {}
+    }
+    set cur $tk_priv(posted@$screen)
+    if {$cur == $w} {
+       return
+    }
+    if {$cur != ""} {tk_mbUnpost $w}
+    set tk_priv(relief@$screen) [lindex [$w config -relief] 4]
+    $w config -relief raised
+    set tk_priv(cursor@$screen) [lindex [$w config -cursor] 4]
+    $w config -cursor arrow
+    $w post
+    catch {grab -global $w}
+    set tk_priv(posted@$screen) $w
+    if {$tk_priv(focus@$screen) == ""} {
+       set tk_priv(focus@$screen) [focus -query $w]
+    }
+    set menu [lindex [$w config -menu] 4]
+    focus $menu
+}
+
+# The procedure below does all the work of unposting the menubutton that's
+# currently posted.  It takes no arguments.
+
+proc tk_mbUnpost {w} {
+    global tk_priv
+    set screen [winfo screen $w]
+    if {![info exists tk_priv(posted@$screen)]} {
+       set tk_priv(posted@$screen) {}
+    }
+    if {![info exists tk_priv(focus@$screen)]} {
+       set tk_priv(focus@$screen) {}
+    }
+    set mb $tk_priv(posted@$screen)
+    if {$mb != ""} {
+       $mb config -relief $tk_priv(relief@$screen)
+       $mb config -cursor $tk_priv(cursor@$screen)
+       $mb unpost
+       catch {grab -off $mb}
+       set menu [lindex [$mb config -menu] 4]
+       focus $tk_priv(focus@$screen)
+       set tk_priv(focus@$screen) ""
+       set tk_priv(posted@$screen) {}
+    }
+}
+
+# The procedure below is invoked to implement keyboard traversal to
+# a menu button.  It takes two arguments:  the name of a window where
+# a keystroke originated, and the ascii character that was typed.
+# This procedure finds a menu bar by looking upward for a top-level
+# window, then looking for a window underneath that named "menu".
+# Then it searches through all the subwindows of "menu" for a menubutton
+# with an underlined character matching char.  If one is found, it
+# posts that menu.
+
+proc tk_traverseToMenu {w char} {
+    if {$char == ""} {
+       return
+    }
+    set char [string tolower $char]
+
+    foreach mb [tk_getMenuButtons $w] {
+       if {[winfo class $mb] == "Menubutton"} {
+           set char2 [string index [lindex [$mb config -text] 4] \
+                   [lindex [$mb config -underline] 4]]
+           if {[string compare $char [string tolower $char2]] == 0} {
+               tk_mbPost $mb
+               [lindex [$mb config -menu] 4] activate 0
+               return
+           }
+       }
+    }
+}
+
+# The procedure below is used to implement keyboard traversal within
+# the posted menu.  It takes two arguments:  the name of the menu to
+# be traversed within, and an ASCII character.  It searches for an
+# entry in the menu that has that character underlined.  If such an
+# entry is found, it is invoked and the menu is unposted.
+
+proc tk_traverseWithinMenu {w char} {
+    if {$char == ""} {
+       return
+    }
+    set char [string tolower $char]
+    set last [$w index last]
+    for {set i 0} {$i <= $last} {incr i} {
+       if [catch {set char2 [string index \
+               [lindex [$w entryconfig $i -label] 4] \
+               [lindex [$w entryconfig $i -underline] 4]]}] {
+           continue
+       }
+       if {[string compare $char [string tolower $char2]] == 0} {
+           tk_mbUnpost $w
+           $w invoke $i
+           return
+       }
+    }
+}
+
+# The procedure below takes a single argument, which is the name of
+# a window.  It returns a list containing path names for all of the
+# menu buttons associated with that window's top-level window, or an
+# empty list if there are none.
+
+proc tk_getMenuButtons {w} {
+    global tk_priv
+    set top [winfo toplevel $w]
+    if [catch {set buttons [set tk_priv(menusFor$top)]}] {
+       return ""
+    }
+    return $buttons
+}
+
+# The procedure below is used to traverse to the next or previous
+# menu in a menu bar.  It takes one argument, which is a count of
+# how many menu buttons forward or backward (if negative) to move.
+# If there is no posted menu then this procedure has no effect.
+
+proc tk_nextMenu {w count} {
+    global tk_priv
+    set screen [winfo screen $w]
+    if {![info exists tk_priv(posted@$screen)]} {
+       set tk_priv(posted@$screen) {}
+    }
+    if {$tk_priv(posted@$screen) == ""} {
+       return
+    }
+    set buttons [tk_getMenuButtons $tk_priv(posted@$screen)]
+    set length [llength $buttons]
+    for {set i 0} 1 {incr i} {
+       if {$i >= $length} {
+           return
+       }
+       if {[lindex $buttons $i] == $tk_priv(posted@$screen)} {
+           break
+       }
+    }
+    incr i $count
+    while 1 {
+       while {$i < 0} {
+           incr i $length
+       }
+       while {$i >= $length} {
+           incr i -$length
+       }
+       set mb [lindex $buttons $i]
+       if {[lindex [$mb configure -state] 4] != "disabled"} {
+           break
+       }
+       incr i $count
+    }
+    tk_mbUnpost $w
+    tk_mbPost $mb
+    [lindex [$mb config -menu] 4] activate 0
+}
+
+# The procedure below is used to traverse to the next or previous entry
+# in the posted menu.  It takes one argument, which is 1 to go to the
+# next entry or -1 to go to the previous entry.  Disabled entries are
+# skipped in this process.
+
+proc tk_nextMenuEntry {w count} {
+    global tk_priv
+    set screen [winfo screen $w]
+    if {![info exists tk_priv(posted@$screen)]} {
+       set tk_priv(posted@$screen) {}
+    }
+    if {$tk_priv(posted@$screen) == ""} {
+       return
+    }
+    set menu [lindex [$tk_priv(posted@$screen) config -menu] 4]
+    set length [expr [$menu index last]+1]
+    set i [$menu index active]
+    if {$i == "none"} {
+       set i 0
+    } else {
+       incr i $count
+    }
+    while 1 {
+       while {$i < 0} {
+           incr i $length
+       }
+       while {$i >= $length} {
+           incr i -$length
+       }
+       if {[catch {$menu entryconfigure $i -state} state] == 0} {
+           if {[lindex $state 4] != "disabled"} {
+               break
+           }
+       }
+       incr i $count
+    }
+    $menu activate $i
+}
+
+# The procedure below invokes the active entry in the posted menu,
+# if there is one.  Otherwise it does nothing.
+
+proc tk_invokeMenu {w} {
+    set i [$w index active]
+    if {$i != "none"} {
+       tk_mbUnpost $w
+       update idletasks
+       $w invoke $i
+    }
+}
+
+# The procedure below is invoked to keyboard-traverse to the first
+# menu for a given source window.  The source window is passed as
+# parameter.
+
+proc tk_firstMenu {w} {
+    set mb [lindex [tk_getMenuButtons $w] 0]
+    if {$mb != ""} {
+       tk_mbPost $mb
+       [lindex [$mb config -menu] 4] activate 0
+    }
+}
+
+# The procedure below is invoked when a button-1-down event is
+# received by a menu button.  If the mouse is in the menu button
+# then it posts the button's menu.  If the mouse isn't in the
+# button's menu, then it deactivates any active entry in the menu.
+# Remember, event-sharing can cause this procedure to be invoked
+# for two different menu buttons on the same event.
+
+proc tk_mbButtonDown {w x y} {
+    global tk_priv
+    set screen [winfo screen $w]
+    if {![info exists tk_priv(inMenuButton@$screen)]} {
+       set tk_priv(inMenuButton@$screen) {}
+    }
+    if {![info exists tk_priv(posted@$screen)]} {
+       set tk_priv(posted@$screen) {}
+    }
+    if {[lindex [$w config -state] 4] == "disabled"} {
+       return
+    } 
+    if {$tk_priv(inMenuButton@$screen) == $w} {
+       tk_mbPost $w
+    }
+    if {$tk_priv(posted@$screen) != ""} then {
+       set menu [lindex [$tk_priv(posted@$screen) config -menu] 4]
+       if {![info exists tk_priv(window@$screen)]} {
+           set tk_priv(window@$screen) {}
+       }
+       if {$tk_priv(window@$screen) != $menu} {
+           $menu activate none
+       }
+    }
+}
+
+proc tk_mbButtonUp {w x y} {
+    global tk_priv
+    set screen [winfo screen $w]
+    if {![info exists tk_priv(inMenuButton@$screen)]} {
+       set tk_priv(inMenuButton@$screen) {}
+    }
+    if {![info exists tk_priv(posted@$screen)]} {
+       set tk_priv(posted@$screen) {}
+    }
+    if {($tk_priv(inMenuButton@$screen) != "") &&
+       ($tk_priv(posted@$screen) != "")} {
+       [lindex [$tk_priv(posted@$screen) config -menu] 4] activate 0
+    } else {
+       tk_mbUnpost $w
+    }
+}
+
+proc tk_mbButtonEnter {w m} {
+    global tk_priv
+    set screen [winfo screen $w]
+    set tk_priv(inMenuButton@$screen) $w
+    if {[lindex [$w config -state] 4] != "disabled"} {
+       $w config -state active
+    }
+}
+
+proc tk_mbButtonLeave {w} {
+    global tk_priv
+    set screen [winfo screen $w]
+    set tk_priv(inMenuButton@$screen) {}
+    if {[lindex [$w config -state] 4] != "disabled"} {
+       $w config -state normal
+    }
+}
+
+# In the binding below, it's important to ignore grab-related entries
+# and exits because they lag reality and can cause menus to chase
+# their own tail, repeatedly posting and unposting.
+
+proc tk_mbButton1Enter {w m} {
+    global tk_priv
+    set screen [winfo screen $w]
+    set tk_priv(inMenuButton@$screen) $w
+    if {([lindex [$w config -state] 4] != "disabled")
+           && ("$m" != "NotifyGrab") && ("$m" != "NotifyUngrab")} {
+       $w config -state active
+       tk_mbPost $w
+    }
+}
+
+
+proc tk_mbButton2Down {w x y} {
+    global tk_priv
+    set screen [winfo screen $w]
+    if {![info exists tk_priv(inMenuButton@$screen)]} {
+       set tk_priv(inMenuButton@$screen) {}
+    }
+    if {![info exists tk_priv(posted@$screen)]} {
+       set tk_priv(posted@$screen) {}
+    }
+    if {($tk_priv(posted@$screen) == "")
+           && ([lindex [$w config -state] 4] != "disabled")} {
+       set tk_priv(dragging@$screen) $w
+       [lindex [$w config -menu] 4] post $x $y
+    }
+}
+
+
+proc tk_mbButton2Motion {w x y} {
+    global tk_priv
+    set screen [winfo screen $w]
+    if {![info exists tk_priv(dragging@$screen)]} {
+       set tk_priv(dragging@$screen) {}
+    }
+    if {$tk_priv(dragging@$screen) != ""} {
+       [lindex [$tk_priv(dragging@$screen) config -menu] 4] post $x $y
+    }
+}
+
+proc tk_mbButton2Up {w x y} {
+    global tk_priv
+    set screen [winfo screen $w]
+    set tk_priv(dragging@$screen) ""
+}
+
+
+proc tk_menuEnter {w y} {
+    global tk_priv
+    set screen [winfo screen $w]
+    set tk_priv(window@$screen) $w
+    $w activate @$y
+}
+
+proc tk_menuLeave {w} {
+    global tk_priv
+    set screen [winfo screen $w]
+    set tk_priv(window@$screen) {}
+    $w activate none
+}
+
+proc tk_menuMotion {w y} {
+    global tk_priv
+    set screen [winfo screen $w]
+    if {![info exists tk_priv(window@$screen)]} {
+       set tk_priv(window@$screen) {}
+    }
+    if {$tk_priv(window@$screen) != ""} {
+       $w activate @$y
+    }
+}
+
+proc tk_menuUp {w y} {
+    tk_menuMotion $w $y
+    tk_invokeMenu $w
+}
+
+proc tk_menu2Down {w x y} {
+    global tk_priv
+    set screen [winfo screen $w]
+    set tk_priv(x@$screen) $x
+    set tk_priv(y@$screen) $y
+}
+
+proc tk_menu2Motion {w x y} {
+    global tk_priv
+    set screen [winfo screen $w]
+    if {$tk_priv(posted@$screen) == ""} {
+       $w post [expr $x-$tk_priv(x@$screen)] [expr $y-$tk_priv(y@$screen)]
+    }
+}
+
diff --git a/res/micropolis.tcl b/res/micropolis.tcl
new file mode 100644 (file)
index 0000000..b1379c1
--- /dev/null
@@ -0,0 +1,5366 @@
+#######################################################################
+# Micropolis.tcl, by Don Hopkins.
+# Copyright (C) 2002 by Electronic Arts.
+# This file defines the user interface of Micropolis. 
+# Modify at your own risk!
+########################################################################
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+
+
+########################################################################
+# Libraries
+########################################################################
+
+
+set errorInfo {}
+set auto_noexec 1
+
+source $tk_library/wish.tcl
+
+
+########################################################################
+# Globals
+########################################################################
+
+
+set UniqueID 0
+set State uninitialized
+set CityName "Micropolis"
+set GameLevel 0
+set SimHome [pwd]
+set CityLibDir $SimHome/cities
+set CityDir $CityLibDir
+set OldBudget 0
+set BudgetRoadFund 0
+set BudgetFireFund 0
+set BudgetPoliceFund 0
+set BudgetTaxRate 0
+set DemandRes 0
+set DemandCom 0
+set DemandInd 0
+set Priority 2
+set Time 3
+set AutoGoto 1
+set AutoBudget 1
+set Disasters 1
+set AutoBulldoze 1
+set Sound 1
+set DoAnimation 1
+set DoMessages 1
+set DoNotices 1
+set ShapePies 1
+set SoundServers {}
+set AudioChannels {mode edit fancy warning intercom}
+set BudgetTimeout 30
+set BudgetTimer 0
+set BudgetTimerActive 0
+set BudgetsVisible 0
+set EvaluationsVisible 0
+set SplashScreenDelay 5000
+set Scenario -1
+set Chatting 0
+set ChatServer "localhost"
+set ChatSocket 6667
+set ChatConnection {}
+set NickName "nickname"
+set UserName "username"
+set ServerName "servername"
+set RealName "realname"
+set ChannelName "#Micropolis"
+set HomeDir ""
+set ResourceDir ""
+set HostName ""
+set LocalHostName "[exec hostname]"
+set SaveCityWin ""
+set MapHistory {}
+set MapHistoryNum -1
+set HelpLoaded 0
+set QueryX 0
+set QueryY 0
+set FreeVotes 0
+set ShowingPicture 300
+set MaxLines 500
+set ShrinkLines 250
+set ShowingParms {}
+set VoteNames {UseThisMap Ask Zone}
+set VotesForUseThisMap {}
+set VotesForAsk {}
+set VotesForZone {}
+set VotesForBudget {}
+set CurrentDate {}
+
+set HeadWindows {}
+set EditorWindows {}
+set MapWindows {}
+set GraphWindows {}
+set BudgetWindows {}
+set EvaluationWindows {}
+set SplashWindows {}
+set ScenarioWindows {}
+set FileWindows {}
+set AskWindows {}
+set PlayerWindows {}
+set NoticeWindows {}
+set HelpWindows {}
+set FrobWindows {}
+
+set HeadPanelWidth 360
+set HeadPanelHeight 200
+
+set MapPanelWidth 360
+set MapPanelHeight 330
+
+set NoticePanelWidth 360
+set NoticePanelHeight 250
+
+set SplashPanelWidth 1200
+set SplashPanelHeight 900
+
+set ScenarioPanelWidth 420
+set ScenarioPanelHeight 440
+
+set SugarURI ""
+set SugarNickName ""
+set SugarShared 0
+set SugarActivated 0
+set SugarBuddies {}
+
+set SubWindows {
+  {editor EditorWindows}
+  {map MapWindows}
+  {graph GraphWindows}
+  {budget BudgetWindows}
+  {evaluation EvaluationWindows}
+  {scenario ScenarioWindows}
+  {splash SplashWindows}
+  {file FileWindows}
+  {ask AskWindows}
+  {player PlayerWindows}
+  {notice NoticeWindows}
+  {help HelpWindows}
+  {frob FrobWindows}
+  {head HeadWindows}
+}
+
+
+#   0           1               2               3       4         5   6   7   8         9       10   11       12      13
+#   type       id              callback        param   var       x   y   w   h         normal  over disabled checked checkedover
+#   ----------- --------------- --------------- ------- ------- --- --- --- ---         ------- ---- -------- ------- -----------
+set ScenarioButtons {
+  { button     load            DoLoad          ""      ""       70 238 157  90         ""      @images/button1hilite.xpm "" }
+  { button     generate        DoGenerate      ""      ""       62 392 157  90         ""      @images/button2hilite.xpm "" }
+  { button     quit            DoQuit          ""      ""       68 544 157  90         ""      @images/button3hilite.xpm "" }
+  { button     about           DoAbout         ""      ""      101 705 157  90         ""      @images/button4hilite.xpm "" }
+  { checkbox   easy            DoLevel         0       ""      982 106 190  70         ""      @images/checkbox1hilite.xpm "" @images/checkbox1checked.xpm @images/checkbox1hilitechecked.xpm }
+  { checkbox   medium          DoLevel         1       ""      982 176 190  70         ""      @images/checkbox2hilite.xpm "" @images/checkbox2checked.xpm @images/checkbox2hilitechecked.xpm }
+  { checkbox   hard            DoLevel         2       ""      982 246 190  70         ""      @images/checkbox3hilite.xpm "" @images/checkbox3checked.xpm @images/checkbox3hilitechecked.xpm }
+  { button     left            DoLeft          ""      ""      540 375  50  50         ""      @images/lefthilite.xpm @images/leftdisabled.xpm }
+  { button     right           DoRight         ""      ""      841 375  50  50         ""      @images/righthilite.xpm @images/rightdisabled.xpm }
+  { button     play            DoPlay          ""      ""      625 376 180  50         ""      @images/playhilite.xpm "" }
+  { button     scenario1       DoPickScenario  "1"     ""      310 451 209 188         ""      @images/scenario1hilite.xpm "" }
+  { button     scenario2       DoPickScenario  "2"     ""      519 451 209 188         ""      @images/scenario2hilite.xpm "" }
+  { button     scenario3       DoPickScenario  "3"     ""      727 450 209 188         ""      @images/scenario3hilite.xpm "" }
+  { button     scenario4       DoPickScenario  "4"     ""      936 450 209 188         ""      @images/scenario4hilite.xpm "" }
+  { button     scenario5       DoPickScenario  "5"     ""      310 639 209 188         ""      @images/scenario5hilite.xpm "" }
+  { button     scenario6       DoPickScenario  "8"     ""      519 639 209 188         ""      @images/scenario6hilite.xpm "" }
+  { button     scenario7       DoPickScenario  "7"     ""      728 638 209 188         ""      @images/scenario7hilite.xpm "" }
+  { button     scenario8       DoPickScenario  "6"     ""      937 638 209 188         ""      @images/scenario8hilite.xpm "" }
+}
+
+# Disabled until we handle mouse events on the map itself.
+#   { button   map             DoMap           ""      ""      516  30 396 338         ""      @images/maphilite.xpm }
+
+
+########################################################################
+# Fonts
+
+
+set FontInfo {
+  {Big {
+       {-*-dejavu lgc sans-medium-r-normal-*-90-*}
+  }}
+  {Large {
+       {-*-dejavu lgc sans-medium-r-normal-*-80-*}
+  }}
+  {Medium {
+       {-*-dejavu lgc sans-medium-r-normal-*-70-*}
+  }}
+  {Small {
+       {-*-dejavu lgc sans-medium-r-normal-*-60-*}
+  }}
+  {Narrow {
+       {-*-dejavu lgc sans-medium-r-normal-*-60-*}
+  }}
+  {Tiny {
+       {-*-dejavu lgc sans-medium-r-normal-*-60-*}
+  }}
+  {Text {
+       {-*-dejavu lgc sans-medium-r-normal-*-70-*}
+  }}
+  {Message {
+       {-*-dejavu lgc sans-medium-r-normal-*-70-*}
+  }}
+  {Alert {
+       {-*-dejavu lgc sans-medium-r-normal-*-70-*}
+  }}
+}
+
+
+########################################################################
+
+
+set MapTitles {
+  {Micropolis Overall Map}
+  {Residential Zone Map}
+  {Commercial Zone Map}
+  {Industrial Zone Map}
+  {Power Grid Map}
+  {Transportation Map}
+  {Population Density Map}
+  {Rate of Growth Map}
+  {Traffic Density Map}
+  {Pollution Desity Map}
+  {Crime Rate Map}
+  {Land Value Map}
+  {Fire Coverage Map}
+  {Police Coverage Map}
+  {Dynamic Filter Map}
+}
+
+
+set EditorPallets {
+  leftframe.tools.palletres
+  leftframe.tools.palletcom
+  leftframe.tools.palletind
+  leftframe.tools.palletfire
+  leftframe.tools.palletquery
+  leftframe.tools.palletpolice
+  leftframe.tools.palletwire
+  leftframe.tools.palletbulldozer
+  leftframe.tools.palletrail
+  leftframe.tools.palletroad
+  leftframe.tools.palletchalk
+  leftframe.tools.palleteraser
+  leftframe.tools.palletstadium
+  leftframe.tools.palletpark
+  leftframe.tools.palletseaport
+  leftframe.tools.palletcoal
+  leftframe.tools.palletnuclear
+  leftframe.tools.palletairport
+}
+
+
+set EditorPalletImages { 
+  res com ind fire qry pol
+  wire dozr rail road chlk ersr
+  stad park seap coal nuc airp
+}
+
+
+set EditorPalletSounds { 
+  Res Com Ind Fire Query Police
+  Wire Bulldozer Rail Road Chalk Eraser
+  Stadium Park Seaport Coal Nuclear Airport
+}
+
+
+set GraphPallets {
+  leftframe.left.res
+  leftframe.left.com
+  leftframe.left.ind
+  leftframe.right.money
+  leftframe.right.crime
+  leftframe.right.pollution
+}
+
+
+set GraphPalletImages { 
+  res com ind mony crim poll
+}
+
+
+set GraphYearPallets {
+  leftframe.year.year10
+  leftframe.year.year120
+}
+
+
+set GraphYearPalletImages { 10 120 }
+
+
+set ToolInfo {
+  {     {a}    {Residential Zone}      {$100}}
+  {     {a}    {Commercial Zone}       {$100}}
+  {     {an}   {Industrial Zone}       {$100}}
+  {     {a}    {Fire Station}          {$500}}
+  {     {a}    {Query}                 {free}}
+  {     {a}    {Police Station}        {$500}}
+  {     {a}    {Wire}                  {$5}}
+  {     {a}    {Bulldozer}             {$1}}
+  {     {a}    {Rail}                  {$20}}
+  {     {a}    {Road}                  {$10}}
+  {     {a}    {Chalk}                 {free}}
+  {     {an}   {Eraser}                {free}}
+  {     {a}    {Stadium}               {$5,000}}
+  {     {a}    {Park}                  {$20}}
+  {     {a}    {Seaport}               {$3,000}}
+  {     {a}    {Coal Power Plant}      {$3,000}}
+  {     {a}    {Nuclear Power Plant}   {$5,000}}
+  {     {an}   {Airport}               {$10,000}}
+  {     {a}    {Network}               {$1,000}}
+}
+
+
+set DynamicDataNames {
+  {Population Density}
+  {Rate of Growth}
+  {Traffic Density}
+  {Pollution Density}
+  {Crime Rate}
+  {Land Value}
+  {Police Coverage}
+  {Fire Coverage}
+}
+
+########################################################################
+# Initialization
+########################################################################
+
+
+wm title . {Micropolis Root}
+
+
+if {"[sim Platform]" == "msdos"} {
+  sim DoAnimation 0
+  set DoAnimation 0
+  set ShapePies 0
+} else {
+  sim DoAnimation 1
+  set DoAnimation 1
+  set ShapePies 1
+}
+
+sprite explosion 7
+sprite tornado 6
+sprite airplane 3
+sprite helicopter 2
+sprite monster 5
+sprite ship 4
+sprite bus 8
+sprite train 1
+
+sim ResetDynamic
+
+# The next three lines have no effect on the OLPC, where we don't provide
+# the font in res (because it's already in the system fonts).  These lines
+# are for other systems that lack the font.
+set FontPath "[pwd]/res/dejavu-lgc"
+system "xset -fp $FontPath >&/dev/null"
+system "xset +fp $FontPath >&/dev/null"
+
+
+########################################################################
+# Messages
+########################################################################
+
+
+proc Message {id color title msg {props {}}} {
+  global Messages
+  set Messages($id) [list $color $title $msg $props]
+}
+
+
+Message 1 #7f7fff {DULLSVILLE, USA  1900} \
+{Things haven't changed much around here in the last hundred years or so and the residents are beginning to get bored.  They think Dullsville could be the next great city with the right leader. 
+
+It is your job to attract new growth and development, turning Dullsville into a Metropolis within 30 years.}
+
+Message 2 #7f7fff {SAN FRANCISCO, CA.  1906} \
+{Damage from the earthquake was minor compared to that of the ensuing fires, which took days to control.  1500 people died.
+
+Controlling the fires should be your initial concern.  Then clear the rubble and start rebuilding.  You have 5 years.}
+       
+Message 3 #7f7fff {HAMBURG, GERMANY  1944} \
+{Allied fire-bombing of German cities in WWII caused tremendous damage and loss of life.  People living in the inner cities were at greatest risk.
+
+You must control the firestorms during the bombing and then rebuild the city after the war.  You have 5 years.}
+
+Message 4 #7f7fff {BERN, SWITZERLAND  1965} \
+{The roads here are becoming more congested every day, and the residents are upset.  They demand that you do something about it.
+
+Some have suggested a mass transit system as the answer, but this would require major rezoning in the downtown area.  You have 10 years.}
+
+Message 5 #7f7fff {TOKYO, JAPAN  1957} \
+{A large reptilian creature has been spotted heading for Tokyo bay.  It seems to be attracted to the heavy levels of industrial pollution there.
+
+Try to control the fires, then rebuild the industrial center.  You have 5 years.}
+
+Message 6 #7f7fff {DETROIT, MI.  1972} \
+{By 1970, competition from overseas and other economic factors pushed the once "automobile capital of the world" into recession.  Plummeting land values and unemployment then increased crime in the inner-city to chronic levels.
+
+You have 10 years to reduce crime and rebuild the industrial base of the city.}
+
+Message 7 #7f7fff {BOSTON, MA.  2010} \
+{A major meltdown is about to occur at one of the new downtown nuclear reactors.  The area in the vicinity of the reactor will be severly contaminated by radiation, forcing you to restructure the city around it.
+
+You have 5 years to get the situation under control.}
+
+Message 8 #7f7fff {RIO DE JANEIRO, BRAZIL  2047} \
+{In the mid-21st century, the greenhouse effect raised global temperatures 6 degrees F.  Polar icecaps melted and raised sea levels worldwide.  Coastal areas were devastated by flood and erosion.
+
+You have 10 years to turn this swamp back into a city again.}
+
+Message 9 #ffa500 {Query Zone Status} \
+{
+Zone:      %s
+Density:    %s
+Value:     %s
+Crime:     %s
+Pollution:  %s
+Growth:            %s} \
+{{view {PanView $v $QueryX $QueryY}}}
+
+Message 10 #ff4f4f {POLLUTION ALERT!} \
+{Pollution in your city has exceeded the maximum allowable amounts established by the Micropolis Pollution Agency.  You are running the risk of grave ecological consequences.
+
+Either clean up your act or open a gas mask concession at city hall.} \
+{{view {PanView $v [sim PolMaxX] [sim PolMaxY]}}}
+
+Message 11 #ff4f4f {CRIME ALERT!} \
+{Crime in your city is our of hand.  Angry mobs are looting and vandalizing the central city.  The president will send in the national guard soon if you cannot control the problem.} \
+{{view {PanView $v [sim CrimeMaxX] [sim CrimeMaxY]}}}
+
+Message 12 #ff4f4f {TRAFFIC WARNING!} \
+{Traffic in this city is horrible.  The city gridlock is expanding.  The commuters are getting militant.
+
+Either build more roads and rails or get a bulletproof limo.} \
+{{view {PanView $v [sim TrafMaxX] [sim TrafMaxY]}}}
+
+Message 20 #ff4f4f {FIRE REPORTED!} \
+"A fire has been reported!" \
+{{view {PanView $v [sim CrashX] [sim CrashY]}}}
+
+Message 21 #ff4f4f {MONSTER ATTACK!} \
+"A large reptilian creature has been spotted in the water.  It seems to be attracted to areas of high pollution.  There is a trail of destruction wherever it goes.  \
+All you can do is wait till he leaves, then rebuild from the rubble." \
+{{view {FollowView $v monster}}}
+
+# XXX: write more text
+Message 22 #ff4f4f {TORNADO ALERT!} \
+{A tornado has been reported!  There's nothing you can do to stop it, so you'd better prepare to clean up after the disaster!} \
+{{view {FollowView $v tornado}}}
+
+# XXX: write more text
+Message 23 #ff4f4f {EARTHQUAKE!} \
+{A major earthquake has occurred!  Put out the fires as quickly as possible, before they spread, then reconnect the power grid and rebuild the city.} \
+{{view {PanView $v [sim CenterX] [sim CenterY]}}}
+
+# XXX: write more text
+Message 24 #ff4f4f {PLANE CRASH!} \
+{A plane has crashed!} \
+{{view {PanView $v [sim CrashX] [sim CrashY]}}}
+
+# XXX: write more text
+Message 25 #ff4f4f {SHIPWRECK!} \
+{A ship has wrecked!} \
+{{view {PanView $v [sim CrashX] [sim CrashY]}}}
+
+# XXX: write more text
+Message 26 #ff4f4f {TRAIN CRASH!} \
+{A train has crashed!} \
+{{view {PanView $v [sim CrashX] [sim CrashY]}}}
+
+# XXX: write more text
+Message 27 #ff4f4f {HELICOPTER CRASH!} \
+{A helicopter has crashed!} \
+{{view {PanView $v [sim CrashX] [sim CrashY]}}}
+
+Message 30 #ff4f4f {FIREBOMBING REPORTED!} \
+{Firebombs are falling!!} \
+{{view {PanView $v [sim CrashX] [sim CrashY]}}}
+
+Message 35 #7fff7f {TOWN} \
+{Congratulations, your village has grown to town status.  You now have 2,000 citizens.} \
+{{view {PanView $v [sim CenterX] [sim CenterY]}}}
+
+Message 36 #7fff7f {CITY} \
+{Your town has grown into a full sized city, with a current population of 10,000.  Keep up the good work!} \
+{{view {PanView $v [sim CenterX] [sim CenterY]}}}
+
+Message 37 #7fff7f {CAPITAL} \
+{Your city has become a capital.  The current population here is 50,000.  Your political future looks bright.} \
+{{view {PanView $v [sim CenterX] [sim CenterY]}}}
+
+Message 38 #7fff7f {METROPOLIS} \
+{Your capital city has now achieved the status of metropolis.  The current population is 100,000.  With your management skills, you should seriously consider running for governor.} \
+{{view {PanView $v [sim CenterX] [sim CenterY]}}}
+
+Message 39 #7fff7f {MEGALOPOLIS} \
+{Congratulation, you have reached the highest category of urban development, the megalopolis.
+
+If you manage to reach this level, send us email at micropolis@laptop.org or send us a copy of your city.  We might do something interesting with it.} \
+{{view {PanView $v [sim CenterX] [sim CenterY]}}}
+
+Message 40 #7fff7f {MEGALINIUM} \
+{Congratulation, you have reached the end of time!
+
+Because of the toroidal nature of the the Micropolis Space/Time Continuum, your city has wrapped back in time to 1900!} \
+{{view {PanView $v [sim CenterX] [sim CenterY]}}}
+
+# XXX: write more text
+Message 41 #ff4f4f {HEAVY TRAFFIC!} \
+{Sky Watch One
+reporting heavy traffic!} \
+{{view {FollowView $v helicopter}}}
+
+# XXX: write more text
+Message 42 #ff4f4f {FLOODING REPORTED!} \
+{Flooding has been been reported along the water's edge!} \
+{{view {PanView $v [sim FloodX] [sim FloodY]}}}
+
+Message 43 #ff4f4f {NUCLEAR MELTDOWN!} \
+{A nuclear meltdown has occured at your power plant.  You are advised to avoid the area until the radioactive isotopes decay.
+
+Many generations will confront this problem before it goes away, so don't hold your breath.} \
+{{view {PanView $v [sim MeltX] [sim MeltY]}}}
+
+
+Message 44 #ff4f4f {RIOTS!} \
+{The citizens are rioting in the streets, setting cars and houses on fire, and bombing government buildings and businesses!
+
+All media coverage is blacked out, while the fascist pigs beat the poor citizens into submission.}
+
+Message 46 #ff4f4f {NO SOUND SERVER!} \
+{There is no sound server running on your X11 display "%s".  You won't hear any noise unless you run a sound server, and turn the sound back on in the "Options" menu.}
+
+Message 48 #7f7fff {Start a New City} \
+{Build your very own city from the ground up, starting with this map of uninhabited land.}
+
+Message 49 #7f7fff {Restore a Saved City} \
+{This city was saved in the file named: %s}
+
+Message 100 #7fff7f {YOU'RE A WINNER!} \
+{Your mayorial skill and city planning expertise have earned you the KEY TO THE CITY.  Local residents will erect monuments to your glory and name their first-born children after you.  Why not run for governor?} \
+{{middle {@images/key2city.xpm}}}
+
+Message 200 #ff4f4f {IMPEACHMENT NOTICE!} \
+{The entire population of this city has finally had enough of your inept planning and incompetant management.  An angry mob -- led by your mother -- has been spotted in the vicinity of city hall.
+
+You should seriously consider taking an extended vacation -- NOW.  (Or read the manual and try again.)}
+
+Message 300 #ffd700 {About Micropolis} \
+"Micropolis Version [sim Version] Copyright (C) 2007
+    by Electronic Arts.
+Based on the Original Micropolis Concept and Design
+    by Will Wright.
+TCL/Tk User Interface Designed and Created
+    by Don Hopkins, DUX Software.
+Ported to Linux, Optimized and Adapted for OLPC
+    by Don Hopkins.
+Licensed under the GNU General Public License, 
+    version 3, with additional conditions." 
+
+
+########################################################################
+# Options
+########################################################################
+
+
+option add *CheckButton.relief         flat
+option add *Dialog.cursor              top_left_arrow
+option add *Entry.relief               sunken
+option add *Frame.borderWidth          0
+option add *Listbox.relief             sunken
+option add *Scrollbar.relief           sunken
+option add *RadioButton.anchor         w
+option add *RadioButton.relief         flat
+
+option add *background                 #b0b0b0
+option add *foreground                 #000000
+option add *activeBackground           #d0d0d0
+option add *activeForeground           #000000
+option add *disabledForeground         ""
+option add *selectBackground           #d0d0d0
+option add *selectForeground           #000000
+#option add *selector                  #ffff80
+option add *selector                   #bf0000
+
+option add *Scrollbar.Background       #b0b0b0
+option add *Scrollbar.Foreground       #d0d0d0
+option add *Interval.Background        #b0b0b0
+option add *Interval.Foreground                #000000
+option add *Interval.activeForeground  #d0d0d0
+option add *Interval.sliderForeground  #b0b0b0
+option add *Scale.activeForeground     #d0d0d0
+option add *Scale.sliderForeground     #b0b0b0
+option add *PieMenu.activeBackground   #b0b0b0
+
+option add Mwm*Micropolis.clientDecoration -maximize
+
+
+########################################################################
+# Global Bindings
+########################################################################
+
+
+bind all <Help> {HandleHelp %W %x %y %X %Y}
+bind all <Shift-ButtonPress> {HandleHelp %W %x %y %X %Y}
+bind all <Meta-ButtonPress> {HandleHelp %W %x %y %X %Y}
+bind all <Shift-Meta-ButtonPress> {HandleHelp %W %x %y %X %Y}
+
+
+########################################################################
+# Utilities
+########################################################################
+
+
+proc echo {args} {
+  puts stdout $args
+  flush stdout
+} 
+
+
+proc Unique {} {
+  global UniqueID
+  set id $UniqueID
+  incr UniqueID
+  return $id
+}
+
+
+proc tkerror {err} {
+    global errorInfo
+    puts stderr "$errorInfo"
+}
+
+
+proc ident {i} {
+  return "$i"
+}
+
+proc NoFunction {args} {}
+
+
+proc LinkWindow {fromname to} {
+  global WindowLinks
+  set WindowLinks($fromname) $to
+}
+
+
+proc WindowLink {fromname} {
+  global WindowLinks
+  set to ""
+  catch {set to $WindowLinks($fromname)}
+  return $to
+}
+
+
+proc DeleteWindow {sym name win} {
+  set head [WindowLink $win.head]
+  LinkWindow $head.$sym {}
+  global $name
+  set wins [eval ident "\$$name"]
+  set i [lsearch $wins $win]
+  if {$i != -1} {
+    set $name [lreplace $wins $i $i]
+  }
+  destroy $win
+}
+
+
+proc Font {win name} {
+  global FontInfo FontCache HeadWindows
+  set scr [winfo screen $win]
+  set font ""
+  catch {
+    set font $FontCache($scr,$name)
+  }
+  if {"$font" == ""} {
+    set label ""
+    catch {
+      set label $FontCache($scr)
+    }
+    if {"$label" == ""} {
+      foreach head $HeadWindows {
+       if {"[winfo screen $head]" == "$scr"} {
+         set label $head.fontlabel
+         label $label -text "X11 Sucks" -font fixed
+         set FontCache($scr) $label
+       }
+      }
+    }
+
+    set fonts [keylget FontInfo $name]
+    foreach font $fonts {
+      #echo "Configuring font $font on $label"
+      if {[catch "$label config -font \"$font\""] == 0} {
+        #echo "yow!"
+       break
+      } else {
+        #echo "oops!"
+       set font ""
+      }
+    }
+    if {"$font" == ""} {
+      #set font 8x16
+      # OLCP default font
+      set font 6x13
+    }
+    set FontCache($scr,$name) $font
+  }
+  return $font
+}
+
+
+proc Color {win color mono} {
+  if {[winfo screendepth $win] == 1} {
+    return $mono
+  } else {
+    return $color
+  }
+}
+
+
+########################################################################
+# Window Definition Functions
+########################################################################
+
+
+proc MakeWindow.head {{display ":0"}} {
+  global ResourceDir
+  source $ResourceDir/whead.tcl
+  return $win
+}
+
+
+proc MakeWindow.editor {head {display ":0"}} {
+  global ResourceDir
+  source $ResourceDir/weditor.tcl
+  return $win
+}
+
+
+proc MakeWindow.map {head {display ":0"}} {
+  global ResourceDir
+  source $ResourceDir/wmap.tcl
+  return $win
+}
+
+
+proc MakeWindow.graph {head {display ":0"}} {
+  global ResourceDir
+  source $ResourceDir/wgraph.tcl
+  return $win
+}
+
+
+proc MakeWindow.budget {head {display ":0"}} {
+  global ResourceDir
+  source $ResourceDir/wbudget.tcl
+  return $win
+}
+
+
+proc MakeWindow.evaluation {head {display ":0"}} {
+  global ResourceDir
+  source $ResourceDir/weval.tcl
+  return $win
+}
+
+
+proc MakeWindow.splash {head {display ":0"}} {
+  global ResourceDir
+  source $ResourceDir/wsplash.tcl
+  return $win
+}
+
+
+proc MakeWindow.scenario {head {display ":0"}} {
+  global ResourceDir
+  source $ResourceDir/wscen.tcl
+  return $win
+}
+
+
+proc MakeWindow.file {head {display ":0"}} {
+  global ResourceDir
+  source $ResourceDir/wfile.tcl
+  return $win
+}
+
+
+proc MakeWindow.ask {head {display ":0"}} {
+  global ResourceDir
+  source $ResourceDir/wask.tcl
+  return $win
+}
+
+
+proc MakeWindow.player {head {display ":0"}} {
+  global ResourceDir
+  source $ResourceDir/wplayer.tcl
+  return $win
+}
+
+
+proc MakeWindow.notice {head {display ":0"}} {
+  global ResourceDir
+  source $ResourceDir/wnotice.tcl
+  return $win
+}
+
+proc MakeWindow.help {head {display ":0"}} {
+  global ResourceDir
+  source $ResourceDir/whelp.tcl
+  return $win
+}
+
+proc MakeWindow.frob {head {display ":0"}} {
+  global ResourceDir
+  source $ResourceDir/wfrob.tcl
+  return $win
+}
+
+
+########################################################################
+# Sound Support
+########################################################################
+
+
+proc UIInitializeSound {} {
+}
+
+
+proc UIShutDownSound {} {
+}
+
+
+proc UIDoSoundOn {win cmd} {
+  global Sound SoundServers
+  if {$Sound} {
+    set win [WindowLink [winfo toplevel $win].head]
+    if {[lsearch $SoundServers $win] != -1} {
+      set cmd "send -quick -server $win Sound sound $cmd"
+      if {[catch $cmd]} {
+       # XXX: Lost a sound server...
+       LostSoundServer $win
+      }
+    }
+  }
+}
+
+
+proc UIDoSound {cmd} {
+  global Sound SoundServers
+  if {$Sound} {
+    foreach win $SoundServers {
+      set foo "send -quick -server $win Sound $cmd"
+      if {[catch $foo]} {
+       # XXX: Lost a sound server...
+        LostSoundServer $win
+      }
+    }
+  }
+}
+
+
+proc KillSoundServers {} {
+  global SoundServers
+  foreach win $SoundServers {
+    set foo "send -quick -server $win Sound KillSoundServer"
+    catch $foo
+  }
+  set SoundServers {}
+}
+
+
+proc UISetChannelVolume {win chan vol} {
+  UIDoSoundOn $win "channel $chan -volume $vol"
+}
+
+
+proc EchoPlaySound {soundspec} {
+  # Temporary workaround to tell Python Sugar app to play sound.
+  global Sound
+  if {$Sound} {
+    echo PlaySound [lindex $soundspec 0]
+  }
+}
+
+
+proc UIMakeSoundOn {win chan sound {opts ""}} {
+  # Send message to Python to play sound.
+  EchoPlaySound $sound
+
+  #UIDoSoundOn $win "play $sound -replay -channel $chan $opts"
+}
+
+
+proc UIStartSoundOn {win chan sound {opts ""}} {
+  # Send message to Python to play sound.
+  EchoPlaySound $sound
+
+  #UIDoSoundOn $win "play $sound -replay -channel $chan -repeat 100 $opts"
+}
+
+
+proc UIStopSoundOn {win chan sound {opts ""}} {
+  UIDoSoundOn $win "stop $sound"
+}
+
+
+proc UIMakeSound {chan sound {opts ""}} {
+  # Send message to Python to play sound.
+  EchoPlaySound $sound
+
+  #UIDoSound "sound play $sound -replay -channel $chan $opts"
+}
+
+
+proc UIStartSound {chan sound {opts ""}} {
+  # Send message to Python to play sound.
+  EchoPlaySound $sound
+
+  #UIDoSound "sound play $sound -channel $chan -repeat 100 $opts"
+}
+
+
+proc UIStopSound {chan sound {opts ""}} {
+  UIDoSound "sound stop $sound"
+}
+
+
+proc SetupSoundServer {win} {
+  AddSoundServer $win
+}
+
+
+proc AddSoundServer {win} {
+  global SoundServers
+  set i [lsearch $SoundServers $win]
+  if {$i < 0} {
+    set SoundServers [linsert $SoundServers 0 $win]
+  }
+}
+
+
+proc LostSoundServer {win} {
+  DeleteSoundServer $win
+#  UIShowPictureOn [WindowLink $win.head] 46 [winfo screen $win]
+}
+
+
+proc DeleteSoundServer {win} {
+  global SoundServers
+  set i [lsearch $SoundServers $win]
+  if {$i >= 0} {
+    set SoundServers [lreplace $SoundServers $i $i]
+  }
+}
+
+
+proc UISoundOff {} {
+}
+
+
+proc MonsterSpeed {} {
+  return [expr "[sim Rand 40] + 70"]
+}
+
+
+proc ExplosionPitch {} {
+  return [expr "[sim Rand 20] + 90"]
+}
+
+
+proc HonkPitch {} {
+  return [expr "[sim Rand 20] + 90"]
+}
+
+
+########################################################################
+# Global Window Handlers
+
+
+proc WithdrawAll {} {
+  WithdrawHeads
+  WithdrawEditors
+  WithdrawMaps
+  WithdrawGraphs
+  WithdrawBudgets
+  WithdrawEvaluations
+  WithdrawSplashes
+  WithdrawScenarios
+  WithdrawFiles
+  WithdrawAsks
+  WithdrawPlayers
+  WithdrawNotices
+  WithdrawHelps
+  WithdrawFrobs
+}
+
+
+proc ShowInitial {} {
+  ShowHeads
+  ShowEditors
+  ShowMaps
+  EnableMaps
+}
+
+
+########################################################################
+# Head Window Handlers
+
+
+proc PrepHead {head} {
+  global State
+  InitHeadMenus $head
+  case $State {
+    uninitialized {
+    }
+    splash {
+      WithdrawHeadOf $head
+      ShowSplashOf $head
+    }
+    scenario {
+      after 1000 "WithdrawSplashOf $head"
+      WithdrawHeadOf $head
+      ShowScenarioOf $head
+      sim UpdateMaps
+    }
+    play {
+      WithdrawSplashOf $head
+      WithdrawScenarioOf $head
+      ShowHeadOf $head
+      ShowEditorOf $head
+      ShowMapOf $head
+      EnableMaps
+      ReShowPictureOn $head
+      InitHead $head
+      InitHeadMenus $head
+    }
+  }
+}
+
+
+proc ShowHeadOf {head} {
+  wm deiconify $head
+}
+
+
+proc WithdrawHeadOf {head} {
+  wm withdraw $head
+}
+
+
+proc ShowHeads {} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    ShowHeadOf $win
+  }
+}
+
+
+proc WithdrawHeads {} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    wm withdraw $win
+  }
+}
+
+
+proc DeleteHeadWindow {head} {
+  UIQuit $head
+}
+
+
+proc InitHeads {} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    InitHead $win
+  }
+}
+
+
+proc InitHead {win} {
+  set w [WindowLink $win.text]
+  $w configure -state normal
+  $w delete 0.0 end
+  $w insert end "\n"
+  $w configure -state disabled
+
+  if {[sim MultiPlayerMode]} {
+    set w [WindowLink $win.entry]
+    $w delete 0 end
+    global ${w}.value
+    set ${w}.value ""
+  }
+
+  sim UpdateHeads
+  UIUpdateRunning
+}
+
+
+proc InitAllHeadMenus {} {
+  global HeadWindows
+
+  foreach win $HeadWindows {
+    InitHeadMenus $win
+  }
+}
+
+
+proc InitHeadMenus {win} {
+  global State
+  set m0 [WindowLink $win.m0]
+  set m1 [WindowLink $win.m1]
+  set m2 [WindowLink $win.m2]
+  set m3 [WindowLink $win.m3]
+  set m4 [WindowLink $win.m4]
+  set b0 [WindowLink $win.b0]
+  set b1 [WindowLink $win.b1]
+  set b2 [WindowLink $win.b2]
+  set b3 [WindowLink $win.b3]
+  set b4 [WindowLink $win.b4]
+  case $State {
+    uninitialized {
+    }
+    splash {
+    }
+    scenario {
+      $m0 unpost
+      $m1 unpost
+      $m2 unpost
+      $m3 unpost
+      $m4 unpost
+      $m0 disable 1
+      $m0 disable 2
+      # When in multi player mode there is an extra menu
+      # item to add another player, before the quit item,
+      # so compensate for it here.
+      if {[sim MultiPlayerMode]} {
+        $m0 disable 4
+      } else {
+        $m0 disable 3
+      }
+      $b0 config -state normal
+      $b2 config -state disabled
+      $b4 config -state disabled
+    }
+    play {
+      $m0 enable 1
+      $m0 enable 2
+      # When in multi player mode there is an extra menu
+      # item to add another player, before the quit item,
+      # so compensate for it here.
+      if {[sim MultiPlayerMode]} {
+        $m0 enable 4
+      } else {
+        $m0 enable 3
+      }
+      $b0 config -state normal
+      $b2 config -state normal
+      $b4 config -state normal
+    }
+  }
+}
+
+
+proc UIDisaster {win cmd action} {
+  AskQuestion [Color $win #ff0000 #ffffff] "Cause a Disaster" \
+    "Oh no! Do you really want to $action" \
+    "{No way!} Disaster.No {WithdrawAsks}" \
+    "" \
+    "{I guess so.} Disaster.Yes {WithdrawAsks ; $cmd}"
+}
+
+
+proc CrushHead {head} {
+  global SubWindows VoteNames
+
+  foreach foo $VoteNames {
+    global VotesFor$foo
+    set votes [eval ident \$VotesFor$foo]
+    set i [lsearch $votes $head]
+    if {$i != -1} {
+      set VotesFor$foo [lreplace $votes $i $i]
+    }
+  }
+
+  foreach foo $SubWindows {
+    set sym [lindex $foo 0]
+    set name [lindex $foo 1]
+    global $name
+    set wins [eval ident "\$$name"]
+    foreach win $wins {
+      if {[WindowLink $win.head] == $head} {
+       DeleteWindow $sym $name $win
+      }
+    }
+  }
+}
+
+
+proc ChatDown {win} {
+  tk_butDown $win
+}
+
+
+proc ChatUp {win} {
+  tk_butUp $win
+
+  global Chatting
+
+  if {$Chatting} {
+    CloseChat
+  } else {
+    OpenChat
+  }
+}
+
+
+proc OpenChat {} {
+  global Chatting
+  global ChatServer
+  global ChatSocket
+  global ChatConnection
+
+  DoSendMessage "Opening Connection to Chat Server $ChatServer socket $ChatSocket ..." status
+
+  set ChatConnection {}
+  catch {
+    set ChatConnection [connect $ChatServer $ChatSocket]
+  }
+
+  if {$ChatConnection == {}} then {
+    DoSendMessage "Sorry, I could not open a connection to chat server $ChatServer socket $ChatSocket." status
+    set Chatting 0
+  } else {
+    filehandler $ChatConnection r "ReceiveChat"
+    set Chatting 1
+  }
+
+  global NickName
+  global UserName
+  global HostName
+  global ServerName
+  global RealName
+  global ChannelName
+  catch {
+    puts $ChatConnection "USER $UserName $HostName $ServerName $RealName\r\n" nonewline
+    puts $ChatConnection "NICK $NickName\r\n" nonewline
+    puts $ChatConnection "JOIN $ChannelName\r\n" nonewline
+    flush $ChatConnection
+  }
+}
+
+
+proc ReceiveChat {mode f} {
+#    DoSendMessage "ReceiveChat: MODE $mode F $f"
+    set msg ""
+    gets $f msg
+
+    if {[string first {:} $msg]} {
+       set msg ": $msg"
+    }
+
+    set from [lindex $msg 0]
+    set cmd [string tolower [lindex $msg 1]]
+
+    set handled 0
+
+    if {($cmd == "privmsg") ||
+        ($cmd == "notice")} then {
+      set handled 1
+      set chan [lindex $msg 2]
+      set i [expr "[string length $from] + 1 + [string length $cmd] + 1 + [string length $chan] + 2"]
+      set j [expr "[string length $msg] - 2"]
+      set line [string range $msg $i $j]
+      set chan [string range $chan 1 [string length $chan]]
+      set from [string range $from 1 [expr "[string length $from] - 1"]]
+      set from [split $from {!}]
+      set from [lindex $from 0]
+      DoSendMessage "$from> $line"
+    }
+
+    if {$handled == 0} {
+       set msg [string range $msg \
+                 [expr "[string length $from] + 1"] \
+                 [expr "[string length $msg] - 2"]]
+       DoSendMessage $msg
+    }
+}
+
+
+proc SendChatMessage {msg win} {
+    global ChatConnection ChannelName NickName
+
+    if {"$msg" == ""} {
+       return
+    }
+
+    if {[string range $msg 0 0] == "/"} {
+       set cmd [string range $msg 1 [string length $msg]]
+        DoSendMessage "$NickName> \[$cmd\]"
+       set cmd "$cmd\r\n"
+    } else {
+       set cmd "PRIVMSG $ChannelName :$msg\r\n"
+        DoSendMessage "$NickName> $msg"
+    }
+    
+
+    set result 1
+
+    catch {
+       puts $ChatConnection $cmd nonewline
+       flush $ChatConnection
+       set result 0
+    }
+
+    if {$result} {
+       DoSendMessage "IRC Broke the connection"
+       CloseChat
+    }
+}
+
+
+proc CloseChat {} {
+  global Chatting
+  global ChatServer
+  global ChatSocket
+  global ChatConnection
+
+  DoSendMessage "Closing Connection to Chat Server." status
+
+  catch {
+    puts $ChatConnection "QUIT\r\n" nonewline
+    flush $ChatConnection
+    $ChatConnection close
+  }
+
+  set ChatConnection {}
+  set Chatting 0
+}
+
+
+proc DoEnterMessage {win var} {
+  global Chatting
+  global $var
+  set msg [eval ident "\$\{$var\}"]
+
+  if {$Chatting} then {
+    SendChatMessage $msg $win
+  } else {
+    DoSendMessage $msg
+  }
+  $win delete 0 end
+}
+
+
+proc DoEvalMessage {win var} {
+  global $var
+  set command [eval ident "\$\{$var\}"]
+  $win delete 0 end
+  DoSendMessage "Evaluating TCL: $command"
+  catch {uplevel #0 $command} result
+  DoSendMessage "Result: $result"
+}
+
+
+proc DoSendMessage {msg {tag message}} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    appendWithTag [WindowLink $win.text] $tag "$msg"
+  }
+}
+
+
+proc UISetMessage {msg {tag status}} {
+  global DoMessages EditorWindows HeadWindows
+
+  if {$DoMessages == 0} {
+      return
+  }
+
+  foreach win $EditorWindows {
+    [WindowLink $win.message] configure -text "$msg"
+  }
+
+  foreach win $HeadWindows {
+    appendWithTag [WindowLink $win.text] $tag "$msg"
+  }
+}
+
+
+
+
+proc appendWithTag {w tag text} {
+    global MaxLines
+    global ShrinkLines
+
+    set start [$w index end]
+    $w configure -state normal
+    if {$start > $MaxLines} then {
+       $w delete 0.0 $ShrinkLines.0
+       set start [$w index end]
+    }
+    $w insert end "${text}\n"
+    $w tag add $tag $start {end - 1 char}
+    $w configure -state disabled
+    $w yview -pickplace {end - 1 char}
+}
+
+
+########################################################################
+# Budget Window Handlers
+
+
+proc ShowBudgetOf {head} {
+  set win [WindowLink $head.budget]
+  if {$win == {}} {
+    set win [MakeWindow.budget $head [winfo screen $head]]
+  }
+  wm deiconify $win
+  wm raise $win
+  update idletasks
+  sim UpdateBudget
+}
+
+
+proc ShowBudgets {} {
+  global HeadWindows BudgetsVisible
+  set BudgetsVisible 1
+  foreach win $HeadWindows {
+    ShowBudgetOf $win
+  }
+}
+
+
+proc WithdrawBudgets {} {
+  global BudgetWindows BudgetsVisible
+  foreach win $BudgetWindows {
+    wm withdraw $win
+  }
+  StopBudgetTimer
+  set BudgetsVisible 0
+}
+
+
+proc BudgetContinue {{win ""}} {
+  global OldBudget BudgetRoadFund BudgetFireFund BudgetPoliceFund BudgetTaxRate
+  set OldBudget 0
+  if {([sim RoadFund] != $BudgetRoadFund) ||
+      ([sim FireFund] != $BudgetFireFund) ||
+      ([sim PoliceFund] != $BudgetPoliceFund) ||
+      ([sim TaxRate] != $BudgetTaxRate)} {
+    UISetMessage "The budget was changed."
+  } else {
+    UISetMessage "The budget wasn't changed."
+  }
+  WithdrawBudgets
+  sim Resume
+  MakeRunningSound
+}
+
+
+proc BudgetReset {{win ""}} {
+  global OldBudget BudgetRoadFund BudgetFireFund BudgetPoliceFund BudgetTaxRate
+  if {([sim RoadFund] != $BudgetRoadFund) ||
+      ([sim FireFund] != $BudgetFireFund) ||
+      ([sim PoliceFund] != $BudgetPoliceFund) ||
+      ([sim TaxRate] != $BudgetTaxRate)} {
+    UISetMessage "The budget was reset."
+    if {[sim Players] > 1} {
+      UIMakeSound edit Sorry
+    }
+  } else {
+    UISetMessage "The budget was reset."
+  }
+  sim RoadFund $BudgetRoadFund
+  sim FireFund $BudgetFireFund
+  sim PoliceFund $BudgetPoliceFund 
+  sim TaxRate $BudgetTaxRate
+  set OldBudget 0
+  ChangeBudget
+}
+
+
+proc BudgetCancel {{win ""}} {
+  BudgetReset
+  WithdrawBudgets
+  sim Resume
+  MakeRunningSound
+}
+
+
+proc SetTaxRate {rate} {
+  sim TaxRate $rate
+}
+
+
+proc BudgetSetTaxRate {rate} {
+  SetTaxRate $rate
+  ChangeBudget
+}
+
+
+proc BudgetSetRoadFund {percent} {
+  sim RoadFund $percent
+  ChangeBudget
+}
+
+
+proc BudgetSetFireFund {percent} {
+  sim FireFund $percent
+  ChangeBudget
+}
+
+
+proc BudgetSetPoliceFund {percent} {
+  sim PoliceFund $percent
+  ChangeBudget
+}
+
+
+proc UIShowBudgetAndWait {} {
+  global OldBudget BudgetRoadFund BudgetFireFund BudgetPoliceFund BudgetTaxRate
+  if {$OldBudget == 0} {
+    set BudgetRoadFund [sim RoadFund]
+    set BudgetFireFund [sim FireFund]
+    set BudgetPoliceFund [sim PoliceFund]
+    set BudgetTaxRate [sim TaxRate]
+    set OldBudget 1
+  }
+  ShowBudgets
+  UISetMessage "Pausing to set the budget ..."
+  sim Pause
+  MakeRunningSound
+  StartBudgetTimer
+  InitVotesForBudget
+  sim UpdateBudget
+  sim UpdateBudgetWindow
+}
+
+
+proc ToggleBudgetTimer {} {
+  global BudgetTimerActive
+  if {$BudgetTimerActive} {
+    StopBudgetTimer
+  } else {
+    StartBudgetTimer
+  }
+}
+
+
+proc StopBudgetTimer {} {
+  global BudgetTimerActive
+  set BudgetTimerActive 0
+  UpdateBudgetTimer
+}
+
+
+proc StartBudgetTimer {} {
+  global BudgetTimerActive BudgetTimer BudgetTimeout
+  set me [Unique]
+  set BudgetTimerActive $me
+  set BudgetTimer $BudgetTimeout
+  UpdateBudgetTimer
+  after 1000 TickBudgetTimer $me
+}
+
+
+proc RestartBudgetTimer {} {
+  global BudgetTimerActive
+  if {$BudgetTimerActive} {
+    StopBudgetTimer
+    StartBudgetTimer
+  }
+}
+
+
+proc UpdateBudgetTimer {} {
+  global BudgetWindows BudgetTimerActive BudgetTimer
+  if {$BudgetTimerActive} {
+    set text [format "Auto Cancel In %d Seconds (click to disable)" $BudgetTimer]
+  } else {
+    set text [format "Enable Auto Cancel (currently disabled)"]
+  }
+  foreach win $BudgetWindows {
+    set t [WindowLink $win.timer]
+    $t config -text "$text"
+  }
+}
+
+
+proc TickBudgetTimer {me} {
+  global BudgetTimerActive BudgetTimer BudgetTimeout
+  if {$BudgetTimerActive == $me} {
+    incr BudgetTimer -1
+    if {$BudgetTimer < 0} {
+      StopBudgetTimer
+      UpdateBudgetTimer
+      FireBudgetTimer
+    } else {
+      UpdateBudgetTimer
+      after 1000 TickBudgetTimer $me
+    }
+  }
+}
+
+
+proc FireBudgetTimer {} {
+  BudgetCancel
+}
+
+
+proc funds {n} {
+  sim Funds $n
+}
+
+
+proc ToggleAutoBudget {} {
+  global AutoBudget
+  if {$AutoBudget} {
+      #echo "ToggleAutoBudget found on, clearing"
+      sim AutoBudget 0
+  } else {
+      #echo "ToggleAutoBudget found off, setting"
+      sim AutoBudget 1
+  }
+}
+
+
+proc UIUpdateBudget {} {
+  UpdateAutoBudget
+}
+
+
+proc UpdateAutoBudget {} {
+  global BudgetWindows AutoBudget
+  if {[sim AutoBudget]} {
+    set text "Disable Auto Budget (currently enabled)"
+  } else {
+    set text "Enable Auto Budget (currently disabled)"
+  }
+  #echo "UpdateAutoBudget $AutoBudget $text"
+  foreach win $BudgetWindows {
+    set t [WindowLink $win.autobudget]
+    $t config -text "$text"
+  }
+}
+
+
+proc UISetBudget {cashflow previous current collected taxrate} {
+  global BudgetWindows BudgetsVisible
+
+  #echo "UISetBudgetValues $taxrate $BudgetsVisible"
+
+  if {$BudgetsVisible} {
+
+    foreach win $BudgetWindows {
+      set w [WindowLink $win.cashflow]
+      set old [lindex [$w configure -text] 4]
+      if {$old != $cashflow} {
+       $w configure -text $cashflow
+      }
+      set w [WindowLink $win.previous]
+      set old [lindex [$w configure -text] 4]
+      if {$old != $previous} {
+       $w configure -text $previous
+      }
+      set w [WindowLink $win.current]
+      set old [lindex [$w configure -text] 4]
+      if {$old != $current} {
+       $w configure -text $current
+      }
+      set w [WindowLink $win.collected]
+      set old [lindex [$w configure -text] 4]
+      if {$old != $collected} {
+       $w configure -text $collected
+      }
+
+      set w [WindowLink $win.taxrate]
+      set old [$w get]
+      if {$old != $taxrate} {
+       $w set $taxrate
+      }
+
+      set w [WindowLink $win.taxlabel]
+      set old [lindex [$w configure -text] 4]
+      set new "$taxrate%"
+      if {$old != $new} {
+       $w configure -text $new
+      }
+    }
+  }
+
+  global HeadWindows
+  foreach win $HeadWindows {
+
+    set w [WindowLink $win.taxrate]
+    set old [$w get]
+    if {$old != $taxrate} {
+      # FIXME: this might not work if the slider is disabled in multi player mode.
+      $w set $taxrate
+    }
+
+    set w [WindowLink $win.taxlabel]
+    set old [lindex [$w configure -text] 4]
+    set new "Tax Rate: $taxrate%"
+    if {$old != $new} {
+      $w configure -text $new
+    }
+  }
+}
+
+
+proc UISetBudgetValues {roadgot roadwant roadpercent policegot policewant policepercent firegot firewant firepercent} {
+  global BudgetWindows BudgetsVisible
+
+  if {$BudgetsVisible == 0} {
+      return;
+  }
+
+  foreach win $BudgetWindows {
+    set w [WindowLink $win.fire].request
+    set old [lindex [$w configure -text] 4]
+    set new "$firepercent% of $firewant = $firegot"
+    if {$old != $new} {
+      $w configure -text $new
+    }
+    set w [WindowLink $win.fire].fund
+    set old [$w get]
+    if {$old != $firepercent} {
+      $w set $firepercent
+    }
+
+    set w [WindowLink $win.police].request
+    set old [lindex [$w configure -text] 4]
+    set new "$policepercent% of $policewant = $policegot"
+    if {$old != $new} {
+      $w configure -text $new
+    }
+    set w [WindowLink $win.police].fund
+    set old [$w get]
+    if {$old != $policepercent} {
+      $w set $policepercent
+    }
+
+    set w [WindowLink $win.road].request
+    set old [lindex [$w configure -text] 4]
+    set new "$roadpercent% of $roadwant = $roadgot"
+    if {$old != $new} {
+      $w configure -text $new
+    }
+    set w [WindowLink $win.road].fund
+    set old [$w get]
+    if {$old != $roadpercent} {
+      $w set $roadpercent
+    }
+  }
+}
+
+
+proc ChangeBudget {} {
+  global VotesForBudget
+  if {"$VotesForBudget" != ""} {
+    InitVotesForBudget
+  }
+  RestartBudgetTimer
+}
+
+
+proc InitVotesForBudget {} {
+  global VotesForBudget BudgetWindows
+  set VotesForBudget {}
+  foreach win $BudgetWindows {
+    [WindowLink $win.vote] config -relief raised
+  }
+  UpdateVotesForBudget
+}
+
+
+proc UpdateVotesForBudget {} {
+  global BudgetWindows
+  UpdateVotesFor Budget $BudgetWindows
+}
+
+
+proc UpdateTaxRateSliders {} {
+  global HeadWindows
+  set players [sim Players]
+  foreach win $HeadWindows {
+    set slider [WindowLink $win.taxrate]
+    #echo "UpdateTaxRateSliders players $players win $win slider $slider"
+    if {$players == 1} {
+      $slider configure -state normal
+    } else {
+      $slider configure -state disabled
+    }
+  }
+}
+
+
+########################################################################
+# Evaluation Window Handlers
+
+
+proc ToggleEvaluationOf {head} {
+  global State
+  if {"$State" != "play"} {
+    return
+  }
+
+  set mapped 0
+  set win [WindowLink $head.evaluation]
+  if {$win != ""} {
+    set mapped [winfo ismapped $win]
+  }
+
+  if {$mapped} {
+    WithdrawEvaluationOf $head
+  } else {
+    ShowEvaluationOf $head
+  }
+
+}
+
+
+proc WithdrawEvaluationOf {head} {
+  set win [WindowLink $head.evaluation]
+  if {"$win" != ""} {
+    pack unpack $win
+  }
+}
+
+
+proc ShowEvaluationOf {head} {
+  set win [WindowLink $head.evaluation]
+  if {$win == {}} {
+    set win [MakeWindow.evaluation $head [winfo screen $head]]
+  }
+  #wm raise $win
+  #wm deiconify $win
+  set parent [WindowLink $win.parent]
+  #pack append [WindowLink $head.col2]\
+  #  $parent {top frame nw fill}
+  pack append $parent\
+    $win {top frame nw fillx}
+  update idletasks
+  sim UpdateEvaluation
+}
+
+
+proc WithdrawEvaluations {} {
+  global EvaluationWindows EvaluationsVisible
+  foreach win $EvaluationWindows {
+    #wm withdraw $win
+    #set parent [WindowLink $win.parent]
+    #pack unpack $parent
+    pack unpack $win
+  }
+  set EvaluationsVisible 0
+}
+
+
+proc EvaluationVisible {w v} {
+    global EvaluationsVisible
+    global [set var $w.visible]
+    
+    set $var $v
+
+    if ($v) {
+       set EvaluationsVisible [expr "$EvaluationsVisible + 1"]
+    } else {
+       set EvaluationsVisible [expr "$EvaluationsVisible - 1"]
+    }
+}
+
+
+proc UISetEvaluation {changed score ps0 ps1 ps2 ps3 pv0 pv1 pv2 pv3 pop delta assessed cityclass citylevel goodyes goodno title} {
+  global EvaluationWindows EvaluationsVisible CurrentDate
+
+  set class [string tolower $cityclass]
+  UISetMessage "$CurrentDate: Score $score, $class population $pop."
+
+  if {$EvaluationsVisible} {
+
+    foreach win $EvaluationWindows {
+
+      global [set var $win.visible]
+      set visible [eval ident "\$\{$var\}"]
+
+      if {$visible} {
+
+       # TODO: set evaluation window and icon title
+       #wm title $win "$title"
+       #wm iconname $win "$title"
+
+       set w [WindowLink $win.goodjob]
+       set old [lindex [$w configure -text] 4]
+       set new "$goodyes\n$goodno"
+       if {$old != $new} {
+         $w configure -text $new
+       }
+
+       set w [WindowLink $win.problemnames]
+       set old [lindex [$w configure -text] 4]
+       set new "$ps0\n$ps1\n$ps2\n$ps3"
+       if {$old != $new} {
+         $w configure -text $new
+       }
+
+       set w [WindowLink $win.problempercents]
+       set old [lindex [$w configure -text] 4]
+       set new "$pv0\n$pv1\n$pv2\n$pv3"
+       if {$old != $new} {
+         $w configure -text $new
+       }
+
+       set w [WindowLink $win.stats]
+       set old [lindex [$w configure -text] 4]
+       set new "$pop\n$delta\n\n$assessed\n$cityclass\n$citylevel"
+       if {$old != $new} {
+         $w configure -text $new
+       }
+
+       set w [WindowLink $win.score]
+       set old [lindex [$w configure -text] 4]
+       set new "$score\n$changed"
+       if {$old != $new} {
+         $w configure -text $new
+       }
+      }
+    }
+  }
+}
+
+
+########################################################################
+# File Window Handlers
+
+
+proc ShowFileOf {head} {
+  set win [WindowLink $head.file]
+  if {$win == {}} {
+    set win [MakeWindow.file $head [winfo screen $head]]
+  }
+  wm deiconify $win
+  wm raise $win
+  return $win
+}
+
+
+proc ShowFiles {} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    ShowFileOf $win
+  }
+}
+
+
+proc WithdrawFiles {} {
+  global FileWindows
+  foreach win $FileWindows {
+    wm withdraw $win
+  }
+}
+
+
+proc DoFileDialog {win Message Path Pattern FileName ActionOk ActionCancel} {
+  ShowFileDialog $win "$Path" "$Pattern"
+  $win.message1 configure -text "$Message"
+  $win.path.path delete 0 end
+  $win.path.path insert 0 $Path
+  $win.file.file delete 0 end
+  $win.file.file insert 0 "$FileName"
+  $win.frame1.ok config -command "
+      $ActionOk \[$win.file.file get\] \[$win.path.path get\]
+      wm withdraw $win"
+  $win.frame1.rescan config -command "
+      ShowFileDialog $win \[$win.path.path get\] $Pattern"
+  $win.frame1.cancel config -command "
+      $ActionCancel
+      wm withdraw $win"
+  bind $win.files.files "<Double-Button-1>" "\
+    FileSelectDouble $win %W %y $Pattern \"
+       $ActionOk \[$win.file.file get\] \[$win.path.path get\]\""
+  bind $win.path.path <Return> "
+    ShowFileDialog $win \[$win.path.path get\] $Pattern
+    $win.file.file cursor 0
+    focus $win.file.file"
+  bind $win.file.file <Return> "\
+    $ActionOk \[$win.file.file get\] \[$win.path.path get]
+    wm withdraw $win"
+}
+
+
+proc BindSelectOne {win Y} {
+  set Nearest [$win nearest $Y]
+  if {$Nearest >= 0} {
+    $win select from $Nearest
+    $win select to $Nearest
+  }
+}
+
+
+proc FileSelect {win widget Y} {
+  BindSelectOne $widget $Y
+  set Nearest [$widget nearest $Y]
+  if {$Nearest >= 0} {
+    set Path [$win.path.path get]
+    set TmpEntry [$widget get $Nearest]
+    if {[string compare "/" [string index $TmpEntry \
+          [expr [string length $TmpEntry]-1]]] == 0 || \
+        [string compare "@" [string index $TmpEntry \
+          [expr [string length $TmpEntry]-1]]] == 0} {
+      # handle directories, and symbolic links to directories
+      set FileName [string range $TmpEntry 0 \
+            [expr [string length $TmpEntry]-2]]
+      # whoops / or @ is part of the name
+      if {[MiscIsDir $Path/$FileName] != 1} {
+        set FileName $TmpEntry
+      }
+    } {
+      if {[string compare "*" [string index $TmpEntry \
+            [expr [string length $TmpEntry]-1]]] == 0} {
+        # handle executable filenames
+        set FileName [string range $TmpEntry 0 \
+              [expr [string length $TmpEntry]-2]]
+        # whoops * is part of the name
+        if {[file executable $Path/$FileName] != 1} {
+          set FileName $TmpEntry
+        }
+      } {
+        # a ordinary filename
+        set FileName $TmpEntry
+      }
+    }
+    # enter the selected filename into the filename field
+    if {[MiscIsDir $Path/$FileName] != 1} {
+      $win.file.file delete 0 end
+      $win.file.file insert 0 $FileName
+    }
+  }
+}
+
+
+proc FileSelectDouble {win widget Y Pattern Action} {
+  BindSelectOne $widget $Y
+  set Nearest [$widget nearest $Y]
+  if {$Nearest >= 0} {
+    set Path [$win.path.path get]
+    set TmpEntry [$widget get $Nearest]
+    if {[string compare $TmpEntry "../"] == 0} {
+      # go up one directory
+      set TmpEntry \
+        [string trimright [string trimright [string trim $Path] /] @]
+      if {[string length $TmpEntry] <= 0} {
+        return
+      }
+      set Path [file dirname $TmpEntry]
+      $win.path.path delete 0 end
+      $win.path.path insert 0 $Path
+      ShowFileDialog $win $Path $Pattern
+    } {
+      if {[string compare "/" [string index $TmpEntry \
+            [expr [string length $TmpEntry]-1]]] == 0 || \
+          [string compare "@" [string index $TmpEntry \
+            [expr [string length $TmpEntry]-1]]] == 0} {
+        # handle directorys, and symbolic links to directorys
+        set FileName [string range $TmpEntry 0 \
+              [expr [string length $TmpEntry]-2]]
+        # whoops / or @ is part of the name
+        if {[MiscIsDir $Path/$FileName] != 1} {
+          set FileName $TmpEntry
+        }
+      } {
+        if {[string compare "*" [string index $TmpEntry \
+              [expr [string length $TmpEntry]-1]]] == 0} {
+          # handle executable filenames
+          set FileName [string range $TmpEntry 0 \
+                [expr [string length $TmpEntry]-2]]
+          # whoops * is part of the name
+          if {[file executable $Path/$FileName] != 1} {
+            set FileName $TmpEntry
+          }
+        } {
+          # a ordinary filename
+          set FileName $TmpEntry
+        }
+      }
+      # change directory
+      if {[MiscIsDir $Path/$FileName] == 1} {
+        if {[string compare "/" [string index $Path \
+              [expr [string length $Path]-1]]] == 0} {
+           append Path $FileName
+        } {
+          append Path / $FileName
+        }
+        $win.path.path delete 0 end
+        $win.path.path insert 0 $Path
+        ShowFileDialog $win $Path $Pattern
+      } {
+        # enter the selected filename into the filename field
+       $win.file.file delete 0 end
+       $win.file.file insert 0 "$FileName"
+        if {[string length $Action] > 0} {
+          eval $Action
+        }
+        wm withdraw $win
+      }
+    }
+  }
+}
+
+
+proc NameComplete {win Type} {
+
+  set NewFile ""
+  set Matched ""
+
+  if {[string compare $Type path] == 0} {
+    set DirName [file dirname [$win.path.path get]]
+    set FileName [file tail [$win.path.path get]]
+  } {
+    set DirName [file dirname [$win.path.path get]/]
+    set FileName [file tail [$win.file.file get]]
+  }
+
+  set FoundCounter 0
+  if {[MiscIsDir $DirName] == 1} {
+    catch "exec ls $DirName/" Result
+    set Counter 0
+    set ListLength [llength $Result]
+    # go through list
+    while {$Counter < $ListLength} {
+      if {[string length $FileName] == 0} {
+        if {$FoundCounter == 0} {
+          set NewFile [lindex $Result $Counter]
+        } {
+          set Counter1 0
+          set TmpFile1 $NewFile
+          set TmpFile2 [lindex $Result $Counter]
+          set Length1 [string length $TmpFile1]
+          set Length2 [string length $TmpFile2]
+          set NewFile ""
+          if {$Length1 > $Length2} {
+            set Length1 $Length2
+          }
+          while {$Counter1 < $Length1} {
+            if {[string compare [string index $TmpFile1 $Counter1] \
+                  [string index $TmpFile2 $Counter1]] == 0} {
+              append NewFile [string index $TmpFile1 $Counter1]
+            } {
+              break
+            }
+            incr Counter1 1
+          }
+        }
+        incr FoundCounter 1
+      } {
+        if {[regexp "^$FileName" [lindex $Result $Counter] \
+              Matched] == 1} {
+          if {$FoundCounter == 0} {
+            set NewFile [lindex $Result $Counter]
+          } {
+            set Counter1 0
+            set TmpFile1 $NewFile
+            set TmpFile2 [lindex $Result $Counter]
+            set Length1 [string length $TmpFile1]
+            set Length2 [string length $TmpFile2]
+            set NewFile ""
+            if {$Length1 > $Length2} {
+              set Length1 $Length2
+            }
+            while {$Counter1 < $Length1} {
+              if {[string compare [string index $TmpFile1 $Counter1] \
+                    [string index $TmpFile2 $Counter1]] == 0} {
+                append NewFile [string index $TmpFile1 $Counter1]
+              } {
+                break
+              }
+              incr Counter1 1
+            }
+          }
+          incr FoundCounter 1
+        }
+      }
+      incr Counter 1
+    }
+  }
+
+  if {$FoundCounter == 1} {
+    if {[MiscIsDir $DirName/$NewFile] == 1} {
+      if {[string compare $DirName "/"] == 0} {
+        $win.path.path delete 0 end
+        $win.path.path insert 0 "/[string trim [string trim $NewFile /] @]/"
+      } {
+        $win.path.path delete 0 end
+        $win.path.path insert 0 "[string trimright $DirName /]/[string trim [string trim $NewFile /] @]/"
+      }
+    } {
+      $win.path.path delete 0 end
+      $win.path.path insert 0 \
+        "[string trim [string trimright $DirName /] @]/"
+      $win.file.file delete 0 end
+      $win.file.file insert 0 "$NewFile"
+    }
+  } {
+    if {[MiscIsDir $DirName/$NewFile] == 1 ||
+        [string compare $Type path] == 0} {
+      $win.path.path delete 0 end
+      $win.path.path insert 0 \
+        "[string trimright $DirName /]/[string trim [string trim $NewFile /] @]"
+    } {
+      $win.path.path delete 0 end
+      $win.path.path insert 0 "$DirName"
+      if {[string length $NewFile] > 0} {
+        $win.file.file delete 0 end
+        $win.file.file insert 0 "$NewFile"
+      }
+    }
+  }
+}
+
+
+proc ShowFileDialog {win Path Pattern} {
+  busy $win {
+    set Path [lindex [split $Path] 0]
+    if {[$win.files.files size] > 0} {
+      $win.files.files delete 0 end
+    }
+    # read directory
+    if {[catch "exec ls -F $Path" Result]} {
+      set ElementList {}
+    }
+    if {[string match $Result "* not found"]} {
+      set ElementList {}
+    }
+    set ElementList [lsort $Result]
+
+    # insert ..
+    if {[string compare $Path "/"]} {
+      $win.files.files insert end "../"
+    }
+
+    # walk through list
+    foreach Counter $ElementList {
+      # insert filename
+      if {[string match $Pattern $Counter] == 1} {
+       if {[string compare $Counter "../"] &&
+           [string compare $Counter "./"]} {
+         $win.files.files insert end $Counter
+       }
+      } else {
+        set fn $Path/[string trim [string trim [string trim $Counter /] @] *]
+       if {[MiscIsDir $fn]} {
+         $win.files.files insert end $Counter
+       }
+      }
+    }
+  }
+}
+
+
+proc MiscIsDir {PathName} {
+
+  if {[file isdirectory $PathName] == 1} {
+    return 1
+  } {
+    catch "file type $PathName" Type
+    if {[string compare $Type link] == 0} {
+      set LinkName [file readlink $PathName]
+      catch "file type $LinkName" Type
+      while {[string compare $Type link] == 0} {
+        set LinkName [file readlink $LinkName]
+      }
+      return [file isdirectory $LinkName]
+    }
+  }
+  return 0
+}
+
+
+proc busy {win cmds} {
+    set busy {}
+    set list [winfo children $win]
+    set busy $list
+    while {$list != ""} {
+       set next {}
+       foreach w $list {
+           set class [winfo class $w]
+           set cursor [lindex [$w config -cursor] 4]
+           if {[winfo toplevel $w] == $w} {
+               lappend busy [list $w $cursor]
+           }
+           set next [concat $next [winfo children $w]]
+       }
+       set list $next
+    }
+
+    foreach w $busy {
+       catch {[lindex $w 0] config -cursor watch}
+    }
+
+    update idletasks
+
+    set error [catch {uplevel eval [list $cmds]} result]
+
+    foreach w $busy {
+       catch {[lindex $w 0] config -cursor [lindex $w 1]}
+    }
+
+    if $error {
+       error $result
+    } else {
+       return $result
+    }
+}
+
+
+########################################################################
+# Editor Window Handlers
+
+proc ShowEditorOf {head} {
+  global EditorWindows
+  set found 0
+  foreach win $EditorWindows {
+    if {[WindowLink $win.head] == $head} {
+      set parent [WindowLink $win.parent]
+      #pack append [WindowLink $head.col2]\
+      #  $parent {top frame nw expand fill}
+      pack append $parent\
+       $win {top frame nw expand fill}
+      set found 1
+    }
+  }
+  if {$found == 0} {
+    NewEditorOf $head
+  } else {
+    update idletasks
+    sim UpdateEditors
+    sim UpdateMaps
+  }
+}
+
+
+proc NewEditorOf {head} {
+  set win [MakeWindow.editor $head [winfo screen $head]]
+  #wm deiconify $win
+  set parent [WindowLink $win.parent]
+  pack append $parent\
+    $win {top frame nw expand fill}
+  update idletasks
+  sim UpdateEditors
+  sim UpdateMaps
+}
+
+
+proc ShowEditors {} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    ShowEditorOf $win
+  }
+}
+
+
+proc WithdrawEditors {} {
+  global EditorWindows
+  foreach win $EditorWindows {
+    #set parent [WindowLink $win.parent]
+    #pack unpack $parent
+    pack unpack $win
+  }
+}
+
+
+proc InitEditors {} {
+  global EditorWindows
+  foreach win $EditorWindows {
+    InitEditor $win
+  }
+}
+
+
+proc InitEditor {win} {
+  set e [WindowLink $win.view]
+  UISetToolState $win 7
+  $e ToolState 7
+  set size [$e size]
+  $e Pan 960 800
+  $e AutoGoing 0
+  global $e.TrackState
+  set $e.TrackState {}
+}
+
+
+proc SetEditorAutoGoto {win val} {
+  global AutoGoto.$win
+  set AutoGoto.$win $val
+  set e [WindowLink $win.view]
+  $e AutoGoto $val
+}
+
+
+proc SetEditorControls {win val} {
+  global Controls.$win
+  set Controls.$win $val
+  if {$val} {
+    pack append $win $win.leftframe {left frame center filly} 
+  } else {
+    pack unpack $win.leftframe
+  }
+}
+
+
+proc SetEditorOverlay {win val} {
+  global Overlay.$win
+  set Overlay.$win $val
+  set e [WindowLink $win.view]
+  $e ShowOverlay $val
+}
+
+
+proc SetEditorDynamicFilter {win val} {
+  global DynamicFilter.$win
+  set DynamicFilter.$win $val
+  set e [WindowLink $win.view]
+  $e DynamicFilter $val
+  if {$val == 1} then {
+    ShowFrobOf [WindowLink $win.head]
+  }
+}
+
+
+proc SetEditorSkip {win val} {
+  set e [WindowLink $win.view]
+  $e Skip $val
+}
+
+
+proc EditorToolDown {mod w x y} {
+  global [set var $w.TrackState]
+
+  $w ToolMode 1
+
+  case [$w ToolState] in \
+    7 { # bulldozer
+      UIMakeSoundOn $w edit Rumble "-repeat 4"
+    } \
+    10 { # chalk
+      StartChalk $w
+    }
+
+  case $mod in \
+    constrain {
+      set $var [list constrain_start $x $y]
+      $w ToolConstrain $x $y
+    } \
+    default {
+      set $var none
+    }
+  EditorTool ToolDown $w $x $y
+  sim NeedRest 5
+}
+
+
+proc EditorToolDrag {w x y} {
+  EditorTool ToolDrag $w $x $y
+  sim NeedRest 5
+}
+
+
+proc EditorToolUp {w x y} {
+  global [set var $w.TrackState]
+  $w ToolMode 0
+
+  case [$w ToolState] in \
+    7 { # bulldozer
+     UIStopSoundOn $w edit 1
+    } \
+    10 { # chalk
+      StopChalk $w
+    }
+
+  EditorTool ToolUp $w $x $y
+  set $var {}
+  $w ToolConstrain -1 -1
+  sim UpdateMaps
+  sim UpdateEditors
+  sim NeedRest 5
+}
+
+
+proc EditorTool {action w x y} {
+  global [set var $w.TrackState]
+  set state [eval ident "\$\{$var\}"]
+  case [lindex $state 0] in \
+    constrain_start {
+      set x0 [lindex $state 1]
+      set y0 [lindex $state 2]
+      set dx [expr "$x - $x0"]
+      set dy [expr "$y - $y0"]
+      if [expr "($dx > 16) || ($dx < -16)"] then {
+        $w ToolConstrain -1 $y0
+        set $var none
+      } else {
+       if [expr "($dy > 16) || ($dy < -16)"] then {
+         $w ToolConstrain $x0 -1
+         set $var none
+       }
+      }
+    }
+  $w $action $x $y
+}
+
+
+proc StartChalk {w} {
+  sim CollapseMotion 0
+}
+
+
+proc StopChalk {w} {
+  sim CollapseMotion 1
+}
+
+
+proc EditorPanDown {mod w x y} {
+  global [set var $w.TrackState]
+  $w ToolMode -1
+  case $mod in \
+    constrain {
+      set $var [list constrain_start $x $y]
+      $w ToolConstrain $x $y
+    } \
+    default {
+      set $var none
+    }
+  EditorTool PanStart $w $x $y
+}
+
+
+proc EditorPanDrag {w x y} {
+  EditorTool PanTo $w $x $y
+}
+
+
+proc EditorPanUp {w x y} {
+  $w AutoGoing 0
+  $w ToolMode 0
+  EditorTool PanTo $w $x $y
+  $w ToolConstrain -1 -1
+  sim UpdateMaps
+  sim UpdateEditors
+}
+
+
+proc EditorKeyDown {w k} {
+  $w KeyDown $k
+}
+
+
+proc EditorKeyUp {w k} {
+  $w KeyUp $k
+}
+
+
+proc BindEditorButtons {win} {
+  set w [WindowLink $win.top]
+
+  bind $win <1> "CancelPie $win ; EditorToolDown none %W %x %y"
+  bind $win <B1-Motion> {EditorToolDrag %W %x %y}
+  bind $win <ButtonRelease-1> {EditorToolUp %W %x %y}
+
+  bind $win <Control-1> "CancelPie $win ; EditorToolDown constrain %W %x %y"
+  bind $win <Control-B1-Motion> {EditorToolDrag %W %x %y}
+  bind $win <Control-ButtonRelease-1> {EditorToolUp %W %x %y}
+
+  bind $win <2> "CancelPie $win ; EditorPanDown none %W %x %y"
+  bind $win <B2-Motion> {EditorPanDrag %W %x %y}
+  bind $win <ButtonRelease-2> {EditorPanUp %W %x %y}
+
+  bind $win <Control-2> "CancelPie $win ; EditorPanDown constrain %W %x %y"
+  bind $win <Control-B2-Motion> {EditorPanDrag %W %x %y}
+  bind $win <Control-ButtonRelease-2> {EditorPanUp %W %x %y}
+
+  InitPie $win $w.toolpie
+}
+
+
+proc UISetFunds {funds} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    [WindowLink $win.funds] configure -text "$funds"
+  }
+}
+
+
+proc UISetDate {date month year} {
+  global HeadWindows
+  global CurrentDate
+  
+  set CurrentDate "$date"
+
+  foreach win $HeadWindows {
+    [WindowLink $win.date] Set $month $year
+  }
+}
+
+
+proc SetPriority {index} {
+  case $index { \
+    {0} {
+      sim Delay 500000
+      sim Skips 0
+    } \
+    {1} {
+      sim Delay 100000
+      sim Skips 0
+    } \
+    {2} {
+      sim Delay 25000
+      sim Skips 0
+    } \
+    {3} {
+      sim Delay 5000
+      sim Skips 20
+    } \
+    {4} {
+      sim Delay 5
+      sim Skips 500
+    }
+  }
+}
+
+
+proc UISetDemand {r c i} {
+  global HeadWindows DemandRes DemandCom DemandInd
+
+  set DemandRes $r
+  set DemandCom $c
+  set DemandInd $i
+
+  if {$r <= 0} then {set ry0 32} else {set ry0 24}
+  set ry1 [expr "$ry0 - $r"]
+  if {$c <= 0} then {set cy0 32} else {set cy0 24}
+  set cy1 [expr "$cy0 - $c"]
+  if {$i <= 0} then {set iy0 32} else {set iy0 24}
+  set iy1 [expr "$iy0 - $i"]
+
+  foreach win $HeadWindows {
+    set can [WindowLink $win.demand]
+#    $can coords r 8 $ry0 14 $ry1
+#    $can coords c 17 $cy0 23 $cy1
+#    $can coords i 26 $iy0 32 $iy1
+    $can coords r 49 $ry0 55 $ry1
+    $can coords c 58 $cy0 64 $cy1
+    $can coords i 67 $iy0 73 $iy1
+  }
+}
+
+
+proc UISetOptions {autobudget autogoto autobulldoze disasters sound animation messages notices} {
+  global AutoBudget AutoGoto AutoBulldoze Disasters Sound
+  set AutoBudget $autobudget
+  set AutoGoto $autogoto
+  set AutoBulldoze $autobulldoze
+  set Disasters $disasters
+  set Sound $sound
+  set DoAnimation $animation
+  set DoMessages $messages
+  set DoNotices $notices
+}
+
+
+proc UIDidToolRes {win x y} {
+  UIMakeSoundOn $win edit O "-speed 140"
+}
+
+
+proc UIDidToolCom {win x y} {
+  UIMakeSoundOn $win edit A "-speed 140"
+}
+
+
+proc UIDidToolInd {win x y} {
+  UIMakeSoundOn $win edit E "-speed 140"
+}
+
+
+proc UIDidToolFire {win x y} {
+  UIMakeSoundOn $win edit O "-speed 130"
+}
+
+
+proc UIDidToolQry {win x y} {
+  UIMakeSoundOn $win edit E "-speed 200"
+}
+
+
+proc UIDidToolPol {win x y} {
+  UIMakeSoundOn $win edit E "-speed 130"
+}
+
+
+proc UIDidToolWire {win x y} {
+  UIMakeSoundOn $win edit O "-speed 120"
+}
+
+
+proc UIDidToolDozr {win x y} {
+  UIMakeSoundOn $win edit Rumble
+}
+
+
+proc UIDidToolRail {win x y} {
+  UIMakeSoundOn $win edit O "-speed 100"
+}
+
+
+proc UIDidToolRoad {win x y} {
+  UIMakeSoundOn $win edit E "-speed 100"
+}
+
+
+proc UIDidToolChlk {win x y} {
+}
+
+
+proc UIDidToolEraser {win x y} {
+}
+
+
+proc UIDidToolStad {win x y} {
+  UIMakeSoundOn $win edit O "-speed 90"
+}
+
+
+proc UIDidToolPark {win x y} {
+  UIMakeSoundOn $win edit A "-speed 130"
+}
+
+
+proc UIDidToolSeap {win x y} {
+  UIMakeSoundOn $win edit E "-speed 90"
+}
+
+
+proc UIDidToolCoal {win x y} {
+  UIMakeSoundOn $win edit O "-speed 75"
+}
+
+
+proc UIDidToolNuc {win x y} {
+  UIMakeSoundOn $win edit E "-speed 75"
+}
+
+
+proc UIDidToolAirp {win x y} {
+  UIMakeSoundOn $win edit A "-speed 50"
+}
+
+
+proc UISetToolState {w state} {
+  global EditorPallets EditorPalletImages ToolInfo
+  set win [WindowLink $w.top]
+  #echo "UISETTOOLSTATE w $w win $win $state"
+  ExclusivePallet $state $win $EditorPallets ic $EditorPalletImages \
+       raised sunken {NoFunction}
+       {NoFunction}
+  set c1 [WindowLink $w.cost1]
+  if {"$c1" != ""} {
+    set info [lindex $ToolInfo $state]
+    set cost1 [lindex $info 1]
+    set cost2 [lindex $info 2]
+    $c1 configure -text "$cost1"
+    [WindowLink $w.cost2] configure -text "$cost2"
+  }
+}
+
+
+proc UIShowZoneStatus {zone density value crime pollution growth x y} {
+  global QueryX QueryY
+  set QueryX [expr "8 + 16 * $x"]
+  set QueryY [expr "8 + 16 * $y"]
+  UIShowPicture 9 [list $zone $density $value $crime $pollution $growth]
+}
+
+
+########################################################################
+# Map Window Handlers
+
+
+proc ShowMapOf {head} {
+  global MapWindows
+  set found 0
+  foreach win $MapWindows {
+    if {"[WindowLink $win.head]" == "$head"} {
+      global MapPanelWidth MapPanelHeight
+      #place configure $win -x 0 -y 0 -width $MapPanelWidth -height $MapPanelHeight
+      #[WindowLink $win.parent] configure -width $MapPanelWidth -height $MapPanelHeight
+      set parent [WindowLink $win.parent]
+      pack append [WindowLink $head.w2] \
+         $win {top frame nw expand fill}
+      set found 1
+    }
+  }
+  if {$found == 0} {
+    NewMapOf $head
+  } else {
+    update idletasks
+    sim UpdateMaps
+  }
+}
+
+
+proc NewMapOf {head} {
+  set win [MakeWindow.map $head [winfo screen $head]]
+  global MapPanelWidth MapPanelHeight
+  #place configure $win -x 0 -y 0 -width $MapPanelWidth -height $MapPanelHeight
+  #[WindowLink $win.parent] configure -width $MapPanelWidth -height $MapPanelHeight
+  set parent [WindowLink $win.parent]
+  #pack append [WindowLink $head.col1]\
+  #  $parent {top frame nw fillx}
+  pack append [WindowLink $head.w2] \
+      $win {top frame nw expand fill}
+  sim UpdateMaps
+}
+
+
+proc ShowMaps {} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    ShowMapOf $win
+  }
+}
+
+
+proc WithdrawMaps {} {
+  global MapWindows
+  foreach win $MapWindows {
+    #place forget $win
+    pack unpack $win
+  }
+}
+
+
+proc InitMaps {} {
+  global MapWindows
+  foreach win $MapWindows {
+    InitMap $win
+  }
+}
+
+
+proc InitMap {win} {
+  SetMapState $win 0
+}
+
+
+proc EnableMaps {} {
+  global MapWindows
+  foreach win $MapWindows {
+    EnableMap $win
+  }
+}
+
+
+proc EnableMap {win} {
+  [WindowLink $win.view] ShowEditors 1
+  [WindowLink $win.zones] config -state normal
+  [WindowLink $win.overlays] config -state normal
+}
+
+
+proc DisableMaps {} {
+  global MapWindows
+  foreach win $MapWindows {
+    DisableMap $win
+  }
+}
+
+
+proc DisableMap {win} {
+  [WindowLink $win.view] ShowEditors 0
+  [WindowLink $win.zones] config -state disabled
+  [WindowLink $win.overlays] config -state disabled
+}
+
+
+proc SetMapState {win state} {
+  set m [WindowLink $win.view]
+  $m MapState $state
+  if {$state == 14} then {
+    ShowFrobOf [WindowLink $win.head]
+  }
+}
+
+
+proc MapPanDown {w x y} {
+  $w PanStart $x $y
+}
+
+
+proc MapPanDrag {w x y} {
+  $w PanTo $x $y
+}
+
+
+proc MapPanUp {w x y} {
+  $w PanTo $x $y
+  sim UpdateMaps
+  sim UpdateEditors
+}
+
+
+proc UISetMapState {w state} {
+  global MapTitles
+  #set win [winfo toplevel $w]
+  set win [WindowLink $w.win]
+  set m [WindowLink $win.view]
+  set title [lindex $MapTitles $state]
+
+  # TODO: set map text field header to title
+  #wm title $win "$title"
+  #wm iconname $win "$title"
+
+  global [set var MapState.$win]
+  set $var $state
+
+  case $state { \
+    {6 8 9 10 11 12 13} {
+      [WindowLink $win.legend] config -bitmap "@images/legendmm.xpm"
+    } \
+    {7} {
+      [WindowLink $win.legend] config -bitmap "@images/legendpm.xpm"
+    } \
+    {0 1 2 3 4 5 14} {
+      [WindowLink $win.legend] config -bitmap "@images/legendn.xpm"
+    }
+  }
+}
+
+
+########################################################################
+# Graph Window Handlers
+
+
+proc ToggleGraphOf {head} {
+  global State
+  if {"$State" != "play"} {
+    return
+  }
+
+  set mapped 0
+  set win [WindowLink $head.graph]
+  if {$win != ""} {
+    set mapped [winfo ismapped $win]
+  }
+
+  if {$mapped} {
+    WithdrawGraphOf $head
+  } else {
+    ShowGraphOf $head
+  }
+
+}
+
+
+proc WithdrawGraphOf {head} {
+  set win [WindowLink $head.graph]
+  if {"$win" != ""} {
+    pack unpack $win
+  }
+}
+
+
+proc ShowGraphOf {head} {
+  set win [WindowLink $head.graph]
+  if {$win == {}} {
+    set win [MakeWindow.graph $head [winfo screen $head]]
+  }
+  #wm deiconify $win
+  #wm raise $win
+  set parent [WindowLink $win.parent]
+  pack append $parent\
+    $win {top frame nw fillx}
+  update idletasks
+  sim UpdateGraphs
+}
+
+
+proc WithdrawGraphs {} {
+  global GraphWindows
+  foreach win $GraphWindows {
+    #wm withdraw $win
+    pack unpack $win
+  }
+}
+
+
+proc InitGraphs {} {
+  global GraphWindows
+  foreach win $GraphWindows {
+    InitGraph $win
+  }
+}
+
+
+proc InitGraph {win} {
+  UISetGraphState $win 1 1 1 1 1 1 0
+}
+
+
+proc UISetGraphState {win t0 t1 t2 t3 t4 t5 range} {
+  set g [WindowLink $win.graphview]
+  GraphPalletMask $win [expr "$t0 + ($t1<<1) + ($t2<<2) + ($t3<<3) + ($t4<<4) + ($t5<<5)"]
+  GraphYearPallet $win $range
+}
+
+
+########################################################################
+# Splash Window Handlers
+
+
+proc ShowSplashOf {head} {
+  set win [WindowLink $head.splash]
+  if {$win == {}} {
+    set win [MakeWindow.splash $head [winfo screen $head]]
+  }
+  set splashscreen [WindowLink $win.splashscreen]
+  set success 0
+  catch {$splashscreen config -bitmap "@images/splashscreen.xpm"; set success 1}
+  if {$success} {
+    wm deiconify $win
+    global SplashScreenDelay
+    after $SplashScreenDelay "UIPickScenarioMode"
+  } else {
+    UIPickScenarioMode
+  }
+}
+
+
+proc WithdrawSplashOf {head} {
+  set win WindowLink $head.splash]
+  wm withdraw $win
+}
+
+
+proc ShowSplashes {} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    ShowSplashOf $win
+  }
+}
+
+
+proc WithdrawSplashes {} {
+  global SplashWindows
+  foreach win $SplashWindows {
+    wm withdraw $win
+    set splashscreen [WindowLink $win.splashscreen]
+    $splashscreen config -bitmap ""
+  }
+}
+
+
+proc InitSplashes {} {
+}
+
+
+proc InitSplash {win} {
+}
+
+
+proc DeleteSplashWindow {win} {
+  # TODO
+}
+
+
+########################################################################
+# Scenario Window Handlers
+
+
+proc ShowScenarioOf {head} {
+  set win [WindowLink $head.scenario]
+  if {$win == {}} {
+    set win [MakeWindow.scenario $head [winfo screen $head]]
+  }
+  # TODO: load background bitmap
+  wm deiconify $win
+}
+
+
+proc WithdrawScenarioOf {head} {
+  set win WindowLink $head.scenario]
+  wm withdraw $win
+}
+
+
+proc ShowScenarios {} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    ShowScenarioOf $win
+  }
+}
+
+
+proc WithdrawScenarios {} {
+  global ScenarioWindows
+  foreach win $ScenarioWindows {
+    wm withdraw $win
+    # TODO: flush background bitmap
+  }
+}
+
+
+proc InitScenarios {} {
+  global MapHistory MapHistoryNum
+  if {$MapHistoryNum < 1} {
+    set prev disabled
+  } else {
+    set prev normal
+  }
+  if {$MapHistoryNum == ([llength $MapHistory] - 1)} {
+    set next disabled
+  } else {
+    set next normal
+  }
+  global ScenarioWindows
+  foreach win $ScenarioWindows {
+    # TODO
+    #[WindowLink $win.previous] config -state $prev
+    #[WindowLink $win.next] config -state $next
+  }
+}
+
+
+proc InitScenario {win} {
+  global MapHistory MapHistoryNum
+  if {$MapHistoryNum < 1} {
+    set prev disabled
+  } else {
+    set prev normal
+  }
+
+  if {$MapHistoryNum == ([llength $MapHistory] - 1)} {
+    set next disabled
+  } else {
+    set next normal
+  }
+
+  # TODO
+  #[WindowLink $win.previous] config -state $prev
+  #[WindowLink $win.next] config -state $next
+
+  LinkWindow $win.scenarioTarget -1
+  LinkWindow $win.scenarioTargetDown -1
+
+  global ScenarioButtons
+  set i 0
+  set len [llength $ScenarioButtons]
+  while {$i < $len} {
+    set data [lindex $ScenarioButtons $i]
+    set type [lindex $data 0]
+    set id [lindex $data 1]
+    #echo "DATA $data"
+    #echo "ID $id"
+
+    LinkWindow $win.$id.over 0
+    LinkWindow $win.$id.enabled 1
+    LinkWindow $win.$id.checked 0
+    #echo "SETTING WIN $win ID $id"
+
+    set i [expr "$i + 1"]
+  }
+
+  UpdateLevelSelection $win
+  UpdateLeftRightEnabled $win
+}
+
+
+proc UpdateLevelSelection {win} {
+  #echo UpdateLevelSelection
+  global GameLevel
+  if {$GameLevel == 0} then {
+    LinkWindow $win.easy.checked 1
+    LinkWindow $win.medium.checked 0
+    LinkWindow $win.hard.checked 0
+  }
+  if {$GameLevel == 1} then {
+    LinkWindow $win.easy.checked 0
+    LinkWindow $win.medium.checked 1
+    LinkWindow $win.hard.checked 0
+  }
+  if {$GameLevel == 2} then {
+    LinkWindow $win.easy.checked 0
+    LinkWindow $win.medium.checked 0
+    LinkWindow $win.hard.checked 1
+  }
+
+  UpdateScenarioButtonID $win easy
+  UpdateScenarioButtonID $win medium
+  UpdateScenarioButtonID $win hard
+
+}
+
+
+proc UpdateLeftRightEnabled {win} {
+  #echo UpdateLeftRightEnabled
+
+  global MapHistory MapHistoryNum
+  if {$MapHistoryNum < 1} {
+    LinkWindow $win.left.enabled 0
+  } else {
+    LinkWindow $win.left.enabled 1
+  }
+
+  if {$MapHistoryNum == ([llength $MapHistory] - 1)} {
+    LinkWindow $win.right.enabled 0
+  } else {
+    LinkWindow $win.right.enabled 1
+  }
+
+  UpdateScenarioButtonID $win left
+  UpdateScenarioButtonID $win right
+}
+
+
+proc UpdateScenarioButtonID {win id} {
+
+  global ScenarioButtons
+  set i 0
+  set len [llength $ScenarioButtons]
+  while {$i < $len} {
+    set data [lindex $ScenarioButtons $i]
+    set id 
+    if {$id == [lindex $data 1]} then {
+      UpdateScenarioButton $win $data
+      break
+    }
+
+    set i [expr "$i + 1"]
+  }
+}
+
+
+proc UpdateScenarioButton {win data} {
+  set type [lindex $data 0]
+  set id [lindex $data 1]
+  set over [WindowLink $win.$id.over]
+  set enabled [WindowLink $win.$id.enabled]
+  set checked [WindowLink $win.$id.checked]
+  #echo "WIN $win TYPE $type ID $id OVER $over ENABLED $enabled CHECKED $checked"
+  if {$enabled} {
+    if {$checked} {
+      if {$over} {
+        set bm [lindex $data 13]
+      } else {
+        set bm [lindex $data 12]
+      }
+    } else {
+      if {$over} {
+        set bm [lindex $data 10]
+      } else {
+        set bm [lindex $data 9]
+      }
+    }
+  } else {
+    set bm [lindex $data 11]
+  }
+
+  [WindowLink $win.canvas] itemconfig $id -bitmap $bm
+}
+
+
+proc DoEnterCityName {win} {
+}
+
+
+proc InitVotesForUseThisMap {} {
+  # TODO: Disabled for new scenario window.
+  return
+
+  global VotesForUseThisMap ScenarioWindows
+  set VotesForUseThisMap {}
+  foreach win $ScenarioWindows {
+    [WindowLink $win.vote] config -relief raised
+  }
+  UpdateVotesForUseThisMap
+}
+
+
+proc UpdateVotesForUseThisMap {} {
+  global ScenarioWindows
+  UpdateVotesFor UseThisMap $ScenarioWindows
+}
+
+
+proc UIUseThisMap {} {
+  global CityName GameLevel Scenario
+  WithdrawAll
+  # special handling for scenarios?
+  if {$GameLevel != -1} {
+    sim GameLevel $GameLevel
+  }
+  sim CityName $CityName
+  UINewGame
+  UIPlayGame
+  if {$Scenario != -1} {
+    UIShowPicture $Scenario
+  }
+}
+
+
+proc HandleScenarioDown {win x y} {
+  #echo HandleScenarioDown $win $x $y
+  HandleScenarioMove $win $x $y
+  set w [WindowLink $win.w]
+  set target [WindowLink $w.scenarioTarget]
+  LinkWindow $w.scenarioTargetDown $target
+}
+
+
+proc HandleScenarioUp {win x y} {
+  #echo HandleScenarioUp $win $x $y
+  HandleScenarioMove $win $x $y
+  global ScenarioButtons
+  set w [WindowLink $win.w]
+  set target [WindowLink $w.scenarioTarget]
+  set targetDown [WindowLink $w.scenarioTargetDown]
+  if {($target != -1) &&
+      ($target == $targetDown)} {
+    set data [lindex $ScenarioButtons $target]
+    set type [lindex $data 0]
+    set id [lindex $data 1]
+    set callback [lindex $data 2]
+    set param [lindex $data 3]
+    set var [lindex $data 4]
+    set xx [lindex $data 5]
+    set yy [lindex $data 6]
+    set ww [lindex $data 7]
+    set hh [lindex $data 8]
+    set normal [lindex $data 9]
+    set over [lindex $data 10]
+    set disabled [lindex $data 11]
+    if {$type == "button"} {
+      #echo callback $callback w $w param $param
+      eval "$callback $w {$param}"
+    } else {
+      if {$type == "checkbox"} {
+        #echo checkbox callback $callback w $w param $param
+       eval "$callback $w {$param}"
+      }
+    }
+  }
+}
+
+
+proc HandleScenarioMove {win x y} {
+  #echo HandleScenarioMove $win $x $y
+  global ScenarioButtons
+  set w [WindowLink $win.w]
+  set target [WindowLink $w.scenarioTarget]
+  set found -1
+  set i 0
+  set len [llength $ScenarioButtons]
+  while {$i < $len} {
+    set data [lindex $ScenarioButtons $i]
+    set type [lindex $data 0]
+    set id [lindex $data 1]
+    set callback [lindex $data 2]
+    set param [lindex $data 3]
+    set var [lindex $data 4]
+    set xx [lindex $data 5]
+    set yy [lindex $data 6]
+    set ww [lindex $data 7]
+    set hh [lindex $data 8]
+
+    set enabled [WindowLink $w.$id.enabled]
+    set checked [WindowLink $w.$id.checked]
+
+    #echo "ID $id ENABLED $enabled CHECKED $checked w $w id $id"
+
+    if {($enabled != 0) &&
+        ($x >= $xx) &&
+       ($x < ($xx + $ww)) &
+       ($y >= $yy) &&
+       ($y < ($yy + $hh))} {
+      set found $i
+      break
+    }
+
+    set i [expr "$i + 1"]
+  }
+
+  if {$found != $target} {
+
+    if {$found == -1} {
+      if {$target != -1} { 
+
+       #echo OUT $w $found $xx $yy $normal
+       LinkWindow $w.scenarioTarget -1
+
+        set targetdata [lindex $ScenarioButtons $target]
+       set targetid [lindex $targetdata 1]
+       LinkWindow $w.$targetid.over 0
+        UpdateScenarioButton $w $targetdata
+
+      }
+    } else {
+
+      #echo IN $w $found $xx $yy $over
+      LinkWindow $w.scenarioTarget $found
+      LinkWindow $w.$id.over 1
+
+      if {$target != -1} {
+        set targetdata [lindex $ScenarioButtons $target]
+       set targetid [lindex $targetdata 1]
+       LinkWindow $w.$targetid.over 0
+       UpdateScenarioButton $w $targetdata
+      }
+
+      UpdateScenarioButton $w $data
+
+    }
+  }
+}
+
+proc DoLoad {win param} {
+  #echo DOLOAD $win $param
+  UILoadCity $win
+}
+
+
+proc DoGenerate {win param} {
+  #echo DOGENERATE $win $param
+  UIGenerateNewCity
+}
+
+
+proc DoQuit {win param} {
+  #echo DOQUIT $win $param
+  UIQuit $win
+}
+
+
+proc DoAbout {win param} {
+  #echo DOABOUT $win $param
+  MakeHistory "DoLoadCity cities/about.cty"
+}
+
+
+proc DoMap {win param} {
+  #echo DOMAP $win $param
+}
+
+
+proc DoLevel {win param} {
+  #echo DOLEVEL $win $param
+  DoSetGameLevel $param
+}
+
+
+proc DoLeft {win param} {
+  #echo DOLEFT $win $param
+  PrevHistory
+}
+
+
+proc DoRight {win param} {
+  #echo DORIGHT $win $param
+ NextHistory
+}
+
+
+proc DoPlay {win param} {
+  #echo DOPLAY $win $param
+  UIUseThisMap
+}
+
+
+proc DoPickScenario {win param} {
+  #echo DOPICKSCENARIO $win $param
+  UILoadScenario $param
+}
+
+
+########################################################################
+# Undo/Redo Facility
+
+
+proc InitHistory {} {
+  global MapHistory
+  global MapHistoryNum
+  set MapHistory {}
+  set MapHistoryNum -1
+}
+
+
+proc MakeHistory {cmd} {
+  global MapHistory
+  set len [llength $MapHistory]
+  if {($len == 0) ||
+      ($cmd != [lindex $MapHistory [expr $len-1]])} {
+    lappend MapHistory $cmd
+  } else {
+    incr len -1
+  }
+  GotoHistory $len
+}
+
+
+proc GotoHistory {i} {
+  global MapHistory
+  global MapHistoryNum
+  InitVotesForUseThisMap
+  if {$i != $MapHistoryNum} {
+    set MapHistoryNum $i
+    set cmd [lindex $MapHistory $i]
+    eval $cmd
+  }
+  if {$MapHistoryNum == 0} {
+    set prev disabled
+  } else {
+    set prev normal
+  }
+  if {$MapHistoryNum == ([llength $MapHistory] - 1)} {
+    set next disabled
+  } else {
+    set next normal
+  }
+
+  global ScenarioWindows
+  foreach win $ScenarioWindows {
+    UpdateLeftRightEnabled $win
+  }
+
+}
+
+
+proc NextHistory {} {
+  global MapHistory
+  global MapHistoryNum
+  set len [llength $MapHistory]
+  set i [expr "$MapHistoryNum + 1"]
+  if {$i < $len} {
+    GotoHistory $i
+  }
+}
+
+
+proc PrevHistory {} {
+  global MapHistory
+  global MapHistoryNum
+  set i [expr "$MapHistoryNum - 1"]
+  if {$i >= 0} {
+    GotoHistory $i
+  }
+}
+
+
+########################################################################
+# Ask Window Handlers
+
+proc ShowAskOf {head} {
+  set win [WindowLink $head.ask]
+  if {$win == {}} {
+    set win [MakeWindow.ask $head [winfo screen $head]]
+  }
+  wm deiconify $win
+  wm raise $win
+  return $win
+}
+
+
+proc ShowAsks {} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    ShowAskOf $win
+  }
+}
+
+
+proc WithdrawAsks {} {
+  global AskWindows
+  foreach win $AskWindows {
+    wm withdraw $win
+  }
+}
+
+
+proc WithdrawAskOf {win} {
+  set ask [WindowLink $win.ask]
+  if {"$ask" != ""} {
+    wm withdraw $ask
+  }
+}
+
+
+proc AskQuestion {color title text left middle right} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    AskQuestionOn $win $color $title $text $left $middle $right
+  }
+}
+
+
+proc AskQuestionOn {head color title text left middle right} {
+  ShowAskOf $head
+
+  set win [WindowLink $head.ask]
+  set t [WindowLink $win.title]
+  $t configure -text $title
+  $t configure -background $color
+
+  set t [WindowLink $win.text]
+  $t configure -state normal
+  $t delete 0.0 end
+  $t insert end "${text}\n"
+  $t configure -state disabled
+
+  set bf [WindowLink $win.frame]
+  set l [WindowLink $win.left]
+  set m [WindowLink $win.middle]
+  set r [WindowLink $win.vote]
+  set rf [WindowLink $win.voteframe]
+
+  if {$left != ""} {
+    $l config \
+       -text [lindex $left 0] \
+       -command [format [lindex $left 2] $head]
+    SetHelp $l [lindex $left 1]
+    pack append $bf $l {left frame center}
+  } else {
+    pack unpack $l
+  }
+
+  if {$middle != ""} {
+    $m config \
+       -text [lindex $middle 0] \
+       -command [format [lindex $middle 2] $head]
+    SetHelp $m [lindex $middle 1]
+    pack append $bf $m {left frame center expand}
+  } else {
+    pack unpack $m
+  }
+
+  if {$right != ""} {
+    set notify [format [lindex $right 2] $head]
+    set preview [format [lindex $right 3] $head]
+    set cmd [list DoVote $win Ask $notify $preview]
+    $r config \
+       -text [lindex $right 0] \
+       -command $cmd
+    SetHelp $r [lindex $right 1]
+    pack append $bf $rf {right frame center}
+  } else {
+    pack unpack $rf
+  }
+
+  InitVotesForAsk
+}
+
+
+proc BindVotingButton {win but name} {
+  set w [WindowLink $win.top]
+
+  bind $but <Any-Enter> "VoteButtonEnter $win $but"
+  bind $but <Any-Leave> "VoteButtonLeave $win $but"
+  bind $but <1> "VoteButtonDown $win $but $name"
+  bind $but <ButtonRelease-1> "VoteButtonUp $win $but $name"
+  bind $but <2> "VoteButtonDown $win $but $name"
+  bind $but <ButtonRelease-2> "VoteButtonUp $win $but $name"
+  bind $but <3> "VoteButtonDown $win $but $name"
+  bind $but <ButtonRelease-3> "VoteButtonUp $win $but $name"
+}
+
+
+proc VoteButtonEnter {win but} {
+  global tk_priv
+  set screen [winfo screen $but]
+  if {[lindex [$but config -state] 4] != "disabled"} {
+    $but config -state active
+    set tk_priv(window@$screen) $but
+  } else {
+    set tk_priv(window@$screen) ""
+  }
+}
+
+
+proc VoteButtonLeave {win but} {
+  global tk_priv
+  if {[lindex [$but config -state] 4] != "disabled"} {
+    $but config -state normal
+  }
+  set screen [winfo screen $but]
+  set tk_priv(window@$screen) ""
+}
+
+
+proc VoteButtonDown {win but name} {
+  global tk_priv
+  set screen [winfo screen $but]
+  set rel [lindex [$but config -relief] 4]
+  set tk_priv(relief@$screen) $rel
+  if {[lindex [$but config -state] 4] != "disabled"} {
+    set head [WindowLink $win.head]
+    if {[IsVotingFor $head $name]} {
+      $but config -relief raised
+    } else {
+      $but config -relief sunken
+    }
+  }
+}
+
+
+proc VoteButtonUp {win but name} {
+  global tk_priv
+  set screen [winfo screen $but]
+  $but config -relief $tk_priv(relief@$screen)
+  if {($but == $tk_priv(window@$screen))
+       && ([lindex [$but config -state] 4] != "disabled")} {
+    uplevel #0 [list $but invoke]
+    set head [WindowLink $win.head]
+    if {[IsVotingFor $head $name]} {
+      $but config -relief sunken
+    } else {
+      $but config -relief raised
+    }
+  }
+}
+
+
+proc PressVoteButton {win but name} {
+  global tk_priv
+  uplevel #0 [list $but invoke]
+  set head [WindowLink $win.head]
+  if {[IsVotingFor $head $name]} {
+    $but config -relief sunken
+  } else {
+    $but config -relief raised
+  }
+}
+
+
+proc IsVotingFor {win name} {
+  global VotesFor$name
+  set votes [eval ident "\$\{VotesFor$name\}"]
+  if {[lsearch $votes $win] == -1} {
+    return 0
+  } else {
+    return 1
+  }
+}
+
+
+proc DoVote {win name notify preview} {
+  global VotesFor$name
+  set votes [eval ident "\$\{VotesFor$name\}"]
+
+  set win [WindowLink $win.head]
+  set i [lsearch $votes $win]
+  if {$i == -1} {
+    lappend VotesFor$name $win
+  } else {
+    set VotesFor$name [lreplace $votes $i $i]
+  }
+  UpdateVotesFor$name
+  set votes [eval ident "\$\{VotesFor$name\}"]
+  if {[llength $votes] >= [NeededVotes]} {
+    eval "$notify"
+  } else {
+    eval "$preview"
+  }
+}
+
+
+proc UpdateVotesFor {name wins} {
+  global VotesFor$name
+  set votes [eval llength "\$\{VotesFor$name\}"]
+  set needed [NeededVotes]
+
+  foreach win $wins {
+    set head [WindowLink $win.head]
+    if {[IsVotingFor $head $name]} {
+      set border [expr "($needed - $votes) * 1"]
+      set pad [expr "6 - $border"]
+      [WindowLink $win.vote] config -padx $pad -pady $pad
+      [WindowLink $win.voteframe] config -borderwidth $border
+    } else {
+      set border [expr "($needed - $votes - 1) * 1"]
+      set pad [expr "6 - $border"]
+      [WindowLink $win.vote] config -padx $pad -pady $pad
+      [WindowLink $win.voteframe] config -borderwidth $border
+    }
+  }
+}
+
+
+proc InitVotesForAsk {} {
+  global VotesForAsk AskWindows
+  set VotesForAsk {}
+  foreach win $AskWindows {
+    [WindowLink $win.vote] config -relief raised
+  }
+  sim PendingTool -1
+  UpdateVotesForAsk
+}
+
+
+proc UpdateVotesForAsk {} {
+  global AskWindows
+  UpdateVotesFor Ask $AskWindows
+}
+
+
+########################################################################
+# Player Window Handlers
+
+proc ShowPlayerOf {head} {
+  set win [WindowLink $head.player]
+  if {$win == {}} {
+    set win [MakeWindow.player $head [winfo screen $head]]
+  }
+  wm deiconify $win
+  wm raise $win
+  return $win
+}
+
+
+proc ShowPlayers {} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    ShowPlayerOf $win
+  }
+}
+
+
+proc WithdrawPlayers {} {
+  global PlayerWindows
+  foreach win $PlayerWindows {
+    wm withdraw $win
+  }
+}
+
+
+proc UpdatePlayers {} {
+  # TODO: Disabled for new scenario window.
+  return
+
+  global HeadWindows PlayerWindows
+
+  set players ""
+  foreach win $HeadWindows {
+    set server [winfo screen $win]
+#    if {[string first : $server] == 0} {
+#      set server "[exec hostname]:0"
+#    }
+    lappend players $server
+  }
+
+  sim Players [llength $players]
+
+  foreach win $PlayerWindows {
+    set list [WindowLink $win.players]
+    $list delete 0 end
+    eval "$list insert 0 $players"
+  }
+
+  UpdateVotesForUseThisMap
+  UpdateVotesForAsk
+  UpdateVotesForBudget
+  UpdateTaxRateSliders
+}
+
+
+proc UIShowPlayer {win} {
+  ShowPlayerOf $win
+}
+
+
+proc DoNewPlayer {win} {
+  set field [WindowLink $win.display]
+  set dpy [$field get]
+  if {"$dpy" != ""} {
+    $field delete 0 end
+    sim Flush
+    update idletasks
+    if {[AddPlayer $dpy] != ""} {
+      wm withdraw $win
+    }
+  }
+}
+
+########################################################################
+# Notice Window Handlers
+
+
+proc ShowNoticeOf {head} {
+  set win [WindowLink $head.notice]
+  if {$win == {}} {
+    set win [MakeWindow.notice $head [winfo screen $head]]
+  }
+  global NoticePanelWidth NoticePanelHeight
+  #place configure $win -x 0 -y 0 -width $NoticePanelWidth -height $NoticePanelHeight
+  pack append [WindowLink $head.w3] \
+      $win {bottom frame sw expand fill}
+  return $win
+}
+
+
+proc ShowNotices {} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    ShowNoticeOf $win
+  }
+}
+
+
+proc WithdrawNotices {} {
+  global NoticeWindows
+  foreach win $NoticeWindows {
+    #place forget $win
+    pack unpack $win
+  }
+}
+
+
+proc ReShowPictureOn {{head ""}} {
+  global ShowingPicture ShowingParms
+  UIShowPictureOn $head $ShowingPicture $ShowingParms
+}
+
+
+proc UIShowPicture {id {parms ""}} {
+  UIShowPictureOn "" $id $parms
+}
+
+
+proc UIShowPictureOn {where id {parms ""}} {
+  global DoNotices Messages ShowingPicture ShowingParms
+  if {$DoNotices == 0} {
+      return
+  }
+
+  set ShowingPicture $id
+  set ShowingParms $parms
+  set msg $Messages($id)
+  set color [lindex $msg 0]
+  set title [lindex $msg 1]
+  set body [lindex $msg 2]
+  if {$parms != ""} {
+    set cmd "format {$body} $parms"
+    set body [uplevel #0 $cmd]
+  }
+  set props [lindex $msg 3]
+  if {"$where" == ""} {
+    global HeadWindows
+    set where $HeadWindows
+  }
+  foreach head $where {
+    NoticeMessageOn $head "$title" $color "$body" Medium $props
+  }
+}
+
+
+proc NoticeMessageOn {head title color text font props} {
+  ShowNoticeOf $head
+  set win [WindowLink $head.notice]
+
+  set t [WindowLink $win.title]
+  $t configure -text $title -background $color
+
+  set t [WindowLink $win.text]
+  $t configure -state normal -font [Font $head $font]
+  $t delete 0.0 end
+  $t insert end "${text}\n"
+  $t configure -state disabled
+
+  set left ""
+  catch {set left [keylget props left]}
+  set l [WindowLink $win.left]
+  if {$left != ""} {
+    $l config -bitmap $left
+    place $l -in $t -anchor sw -relx .05 -rely .95
+  } else {
+    place forget $l
+  }
+
+  set middle ""
+  catch {set middle [keylget props middle]}
+  set m [WindowLink $win.middle]
+  if {$middle != ""} {
+    $m config -bitmap $middle
+    place $m -in $t -anchor s -relx .5 -rely .95
+  } else {
+    place forget $m
+  }
+
+  set right ""
+  catch {set right [keylget props right]}
+  set r [WindowLink $win.right]
+  if {$right != ""} {
+    $r config -bitmap $right
+    place $r -in $t -anchor se -relx .95 -rely .95
+  } else {
+    place forget $r
+  }
+
+  set view ""
+  catch {set view [keylget props view]}
+  set vf [WindowLink $win.viewframe]
+  global v
+  set v [WindowLink $win.view]
+  set bg [WindowLink $win.background]
+  if {$view != ""} {
+    uplevel #0 "$view"
+    pack unpack $t
+    pack append $bg $vf {left frame center fill}
+    pack append $bg $t {right frame center fill expand}
+  } else {
+    pack unpack $vf
+  }
+}
+
+
+proc UIPopUpMessage {msg} {
+  DoSendMessage $msg
+}
+
+
+proc ComeToMe {view} {
+  set win [winfo toplevel $view]
+
+  set xy [$view Pan]
+  set x [expr "[lindex $xy 0] >>4"]
+  set y [expr "[lindex $xy 1] >>4"]
+
+  ComeTo $win $x $y
+}
+
+
+proc ComeTo {win x y} {
+  global EditorWindows
+  set head [WindowLink $win.head]
+  set myeds {}
+  set myautoeds {}
+  foreach ed $EditorWindows {
+    if {"[WindowLink $ed.head]" == "$head"} {
+      lappend myeds $ed
+      set view [WindowLink $ed.view]
+      if {[$view AutoGoto]} {
+        lappend myautoeds $ed
+      }
+    }
+  }
+  if {[llength $myautoeds]} {
+    UIAutoGotoOn $x $y $myautoeds
+  } else {
+    if {[llength $myeds]} {
+      UIAutoGotoOn $x $y $myeds
+    }
+  }
+}
+
+
+proc FollowView {view id} {
+  $view Follow $id
+
+  set skips 999999
+  if {[sim DoAnimation]} {
+    set head [WindowLink [winfo toplevel $view].head]
+    global EditorWindows
+    foreach win $EditorWindows {
+      if {"[WindowLink $win.head]" == "$head"} {
+       set s [[WindowLink $win.view] Skip]
+       set skips [min $skips $s]
+      }
+    }
+
+    if {$skips == 999999} {
+      set skips 0
+    }
+  }
+
+  $view Skip $skips
+  $view Update
+}
+
+
+proc PanView {view x y} {
+  FollowView $view ""
+  $view Pan $x $y
+}
+
+
+########################################################################
+# Help Window Handlers
+
+
+proc ShowHelpOf {head} {
+  set win [WindowLink $head.help]
+  if {$win == {}} {
+    set win [MakeWindow.help $head [winfo screen $head]]
+  }
+  wm deiconify $win
+  wm raise $win
+  return $win
+}
+
+
+proc ShowHelps {} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    ShowHelpOf $win
+  }
+}
+
+
+proc WithdrawHelps {} {
+  global HelpWindows
+  foreach win $HelpWindows {
+    wm withdraw $win
+  }
+}
+
+
+########################################################################
+# Frob Window Handlers
+
+
+proc ShowFrobOf {head} {
+  set win [WindowLink $head.frob]
+  if {$win == {}} {
+    set win [MakeWindow.frob $head [winfo screen $head]]
+  }
+  wm deiconify $win
+  wm raise $win
+
+  return $win
+}
+
+
+proc ShowFrobs {} {
+  global HeadWindows
+  foreach win $HeadWindows {
+    ShowFrobOf $win
+  }
+}
+
+
+proc WithdrawFrobs {} {
+  global FrobWindows
+  foreach win $FrobWindows {
+    wm withdraw $win
+  }
+}
+
+
+proc UISetDynamic {i min max} {
+  sim DynamicData [expr "$i*2"] $min
+  sim DynamicData [expr "$i*2+1"] $max
+}
+
+
+########################################################################
+# Help Handler
+
+
+proc LoadHelp {} {
+  global ResourceDir
+
+  source $ResourceDir/help.tcl
+}
+
+proc HandleHelp {win x y rootx rooty} {
+  global HelpLoaded HelpWidgets Messages
+
+  if {$HelpLoaded == 0} {
+    LoadHelp
+    set HelpLoaded 1
+  }
+
+  set orig $win
+  set head [WindowLink [winfo toplevel $win].head]
+  set id ""
+  while {1} {
+    catch {set id $HelpWidgets($win)}
+    if {$id != ""} {
+      break
+    }
+    set list [split $win .]
+    set len [expr "[llength $list] - 2"]
+    set list [lrange $list 0 $len]
+    if {[llength $list] <= 1} {
+      set id Window
+      break
+    }
+    set win [join $list .]
+  }
+  if [info exists Messages($id)] {
+    UIShowHelpOn $head $id
+  } else {
+    UIShowHelpOn $head Window
+  }
+}
+
+
+proc UIShowHelpOn {win id {parms ""}} {
+  global Messages ShowingPicture ShowingParms ResourceDir
+  set head [WindowLink $win.head]
+  set msg $Messages($id)
+  set color [lindex $msg 0]
+  set title [lindex $msg 1]
+  set body [lindex $msg 2]
+  if {$parms != ""} {
+    set cmd "format {$body} $parms"
+    set body [uplevel #0 $cmd]
+  }
+  set props [lindex $msg 3]
+
+  ShowHelpOf $head
+  set win [WindowLink $head.help]
+
+  set t [WindowLink $win.title]
+  $t configure -text $title -background $color
+
+  set t [WindowLink $win.text]
+  $t configure -state normal -font [Font $head Large]
+  $t delete 0.0 end
+  $t insert end "${body}\n"
+  FormatHTML $ResourceDir/doc/$id.html $t
+  $t configure -state disabled
+}
+
+
+proc FormatHTML {filename text} {
+  set f ""
+  catch {
+    set f [open $filename]
+    set line ""
+    set header ""
+    set title ""
+    gets $f header
+    gets $f title
+
+    while {[gets $f line] >= 0} {
+      if {"$line" == "</body>"} {
+       break
+      }
+      if {([string index $line 0] == "#") || ([string length $line] == 0)} {
+       continue
+      }
+      $text insert end "$line\n"
+    }
+  }
+  if {$f != ""} {
+    close $f
+  }
+}
+
+
+proc SetHelp {win id} {
+  global HelpWidgets
+  set HelpWidgets($win) $id
+}
+
+
+proc Help {id title {msg {}} {props {}}} {
+  Message $id #7f7fff $title $msg $props
+}
+
+########################################################################
+# Pie Menu Handlers
+
+
+# Set up the bindings to pop up $pie when the right button is clicked in $win
+proc InitPie {win pie} {
+  bind $win <Motion> {}
+  bind $win <3> "PieMenuDown $win $pie $pie Initial %X %Y"
+  bind $win <B3-Motion> {}
+  bind $win <B3-ButtonRelease> {}
+}
+
+
+# Set up the bindings to continue tracking $pie
+# Get this: we keep the tracking machine state in the bindings!
+proc ActivatePie {win root pie state} {
+  bind $win <Motion> "PieMenuMotion $win $root $pie $state %X %Y"
+  bind $win <3> "PieMenuDown $win $root $pie $state %X %Y"
+  bind $win <B3-Motion> "PieMenuMotion $win $root $pie $state %X %Y"
+  bind $win <B3-ButtonRelease> "PieMenuUp $win $root $pie $state %X %Y"
+}
+
+
+# Cancel and reset a pie menu
+proc CancelPie {win} {
+  set binding [bind $win <3>]
+  set root [lindex $binding 2]
+  set pie [lindex $binding 3]
+  set state [lindex $binding 4]
+  if {"$state" != "Initial"} {
+    catch {$root ungrab $win}
+    $pie unpost
+    $pie activate none
+    UIMakeSoundOn $win fancy Oop
+  }
+  InitPie $win $root
+}
+
+
+# Handle pie menu button down
+proc PieMenuDown {win root pie state x y} {
+  case $state {
+    Initial {
+      ActivatePie $win $root $pie FirstDown
+      update idletasks
+      catch {$root grab $win}
+      $pie activate none
+      $pie post $x $y
+      PreviewPieMenu $win $pie $x $y
+      update idletasks
+    }
+    ClickedUp {
+      TrackPieMenu $pie $x $y
+      ActivatePie $win $root $pie SecondDown
+    }
+    SelectedUp {
+      $pie activate none
+      #$pie post $x $y
+      $pie defer
+      PreviewPieMenu $win $pie $x $y
+      ActivatePie $win $root $pie SecondDown
+    }
+    FirstDown { # error
+      CancelPie $win
+    }
+    SecondDown { # error
+      CancelPie $win
+    }
+  }
+}
+
+
+# Handle pie menu button motion
+proc PieMenuMotion {win root pie state x y} {
+  case $state {
+    FirstDown {
+      TrackPieMenu $pie $x $y
+      $pie defer
+    }
+    ClickedUp {
+      $pie activate none
+      #$pie post $x $y
+    }
+    SecondDown {
+      TrackPieMenu $pie $x $y
+      $pie defer
+    }
+    SelectedUp {
+      $pie activate none
+      #$pie post $x $y
+    }
+    Initial { # error
+      CancelPie $win
+    }
+  }
+}
+
+
+# Handle pie menu button up
+proc PieMenuUp {win root pie state x y} {
+  case $state {
+    FirstDown {
+      TrackPieMenu $pie $x $y
+      set active [$pie index active]
+      if {$active == "none"} {
+       $pie show
+        catch {$root grab $win}
+        ActivatePie $win $root $pie ClickedUp
+      } else {
+        set label [lindex [$pie entryconfig $active -label] 4]
+        set submenu [lindex [$pie entryconfig $active -piemenu] 4]
+       UIMakeSoundOn $win mode $label
+       if {$submenu == {}} {
+         set reward [$pie pending]
+         catch {$root ungrab $win}
+         $pie unpost
+          $pie activate none
+          if {$reward} {
+           sim Funds [expr "[sim Funds] + 5"]
+           UIMakeSoundOn $win fancy Aaah
+         }
+         eval [lindex [$pie entryconfig $active -command] 4]
+          InitPie $win $root   
+       } else {
+         $pie unpost
+          $pie activate none
+          $submenu activate none
+          $submenu post $x $y
+         PreviewPieMenu $win $submenu $x $y
+          catch {$root grab $win}
+         ActivatePie $win $root $submenu SelectedUp
+       }
+      }
+    }
+    SecondDown {
+      TrackPieMenu $pie $x $y
+      set active [$pie index active]
+      if {$active == "none"} {
+       CancelPie $win
+      } else {
+        set label [lindex [$pie entryconfig $active -label] 4]
+        set submenu [lindex [$pie entryconfig $active -piemenu] 4]
+       UIMakeSoundOn $win mode $label
+       if {$submenu == {}} {
+         set reward [$pie pending]
+         catch {$root ungrab $win}
+         $pie unpost
+          $pie activate none
+          if {$reward} {
+           sim Funds [expr "[sim Funds] + 5"]
+           UIMakeSoundOn $win fancy Aaah
+         }
+         eval [lindex [$pie entryconfig $active -command] 4]
+         InitPie $win $root
+       } else {
+         $pie unpost
+          $pie activate none
+          $submenu activate none
+          $submenu post $x $y
+         PreviewPieMenu $win $submenu $x $y
+          catch {$root grab $win}
+         ActivatePie $win $root $submenu SelectedUp
+       }
+      }
+    }
+    Initial { # error
+      CancelPie $win
+    }
+    ClickedUp { # error
+      CancelPie $win
+    }
+    SelectedUp { # error
+      CancelPie $win
+    }
+  }
+}
+
+
+# Track the selected item
+proc TrackPieMenu {pie x y} {
+  $pie activate @$x,$y
+}
+
+
+proc PreviewPieMenu {win pie x y} {
+  set preview [lindex [$pie config -preview] 4]
+  if {"$preview" != ""} {
+    set rx [winfo rootx $win]
+    set ry [winfo rooty $win]
+    set x [expr "$x - $rx"]
+    set y [expr "$y - $ry"]
+    eval [format $preview $x $y]
+  }
+}
+
+
+########################################################################
+# Pallet Handlers
+
+
+proc ExclusivePallet {state parent children prefix images inactive active cmd} {
+  #echo "ExclusivePallet state $state parent $parent children $children prefix $prefix images $images inactive $inactive active $active cmd $cmd"
+  set i 0
+  foreach child $children {
+    set name [lindex $images $i]
+    if {$i == $state} then {
+      $parent.$child config \
+         -bitmap "@images/${prefix}${name}hi.xpm" \
+         -relief $active
+    } else {
+      $parent.$child config \
+         -bitmap "@images/${prefix}${name}.xpm" \
+         -relief $inactive
+    }
+    incr i
+  }
+  eval [concat $cmd $state]
+}
+
+
+proc NonExclusivePallet {mask parent children prefix images
+                        inactive active cmd} {
+  set i 0
+  foreach child $children {
+    set name [lindex $images $i]
+    if {$mask & (1<<$i)} then {
+      $parent.$child config \
+         -bitmap "@images/${prefix}${name}hi.xpm" \
+         -relief $active
+    } else {
+      $parent.$child config \
+         -bitmap "@images/${prefix}${name}.xpm" \
+         -relief $inactive
+    }
+    incr i
+  }
+  eval [concat $cmd $mask]
+}
+
+
+proc EditorPallet {win state} {
+  global EditorPalletSounds
+  UIMakeSoundOn $win mode [lindex $EditorPalletSounds $state]
+  EditorSetTool $win $state
+}
+
+
+proc EditorSetTool {win state} {
+  global EditorPallets
+  global EditorPalletImages
+  ExclusivePallet $state $win $EditorPallets ic $EditorPalletImages \
+       flat raised "$win.centerframe.view ToolState"
+}
+
+
+proc GraphPallet {win state} {
+  set mask [[WindowLink $win.graphview] Mask]
+  set mask [expr "$mask ^ (1<<$state)"]
+  GraphPalletMask $win $mask
+}
+
+
+proc GraphPalletMask {win mask} {
+  global GraphPallets
+  global GraphPalletImages
+  NonExclusivePallet $mask $win $GraphPallets gr $GraphPalletImages \
+       flat flat "SetGraphState $win"
+}
+
+
+proc GraphYearPallet {win state} {
+  global GraphYearPallets
+  global GraphYearPalletImages
+  ExclusivePallet $state $win $GraphYearPallets gr $GraphYearPalletImages \
+       flat flat "SetGraphYearState $win"
+}
+
+
+proc SetGraphYearState {win state} {
+  set graph [WindowLink $win.graphview]
+  if {$state == 0} {
+    $graph Range 10
+  } else {
+    $graph Range 120
+  }
+}
+
+
+proc SetGraphState {win mask} {
+  global GraphPallets
+  set graph [WindowLink $win.graphview]
+  $graph Mask $mask
+}
+
+
+########################################################################
+# Button Handlers
+
+proc sim_butEnter {w} {
+  global tk_priv
+  set screen [winfo screen $w]
+  set tk_priv(window@$screen) $w
+}
+
+
+proc sim_butLeave {w} {
+  global tk_priv
+  set screen [winfo screen $w]
+  set tk_priv(window@$screen) ""
+}
+
+
+proc sim_butDown {w} {
+  global tk_priv
+  set screen [winfo screen $w]
+  set pict [lindex [$w config -bitmap] 4]
+  set tk_priv(relief@$screen) $pict
+  $w config -bitmap [lindex [split $pict .] 0]hi.xpm
+  update idletasks
+}
+
+
+proc sim_butUp {w} {
+  global tk_priv
+  set screen [winfo screen $w]
+  $w config -bitmap $tk_priv(relief@$screen)
+  update idletasks
+  if {$w == $tk_priv(window@$screen)} {
+    uplevel #0 [list $w invoke]
+  }
+}
+
+
+proc BindSimButton {w} {
+  bind $w <Any-Enter> {sim_butEnter %W}
+  bind $w <Any-Leave> {sim_butLeave %W}
+  bind $w <1> {sim_butDown %W}
+  bind $w <ButtonRelease-1> {sim_butUp %W}
+  bind $w <2> {sim_butDown %W}
+  bind $w <ButtonRelease-2> {sim_butUp %W}
+  bind $w <3> {sim_butDown %W}
+  bind $w <ButtonRelease-3> {sim_butUp %W}
+}
+
+
+########################################################################
+# Internal Callbacks
+
+
+proc UIStartMicropolis {homedir resourcedir hostname} {
+  global HomeDir ResourceDir HostName HeadWindows
+  set HomeDir $homedir
+  set ResourceDir $resourcedir
+  set HostName $hostname
+  sim InitGame
+  sim GameStarted
+  update
+
+  foreach display [sim Displays] {
+    if {"[AddPlayer $display]" == ""} {
+      echo Couldn't add a player on $display ...
+    }
+  }
+
+  if {"$HeadWindows" == ""} {
+    echo Micropolis is exiting because it couldn't connect to any players.
+    sim ReallyQuit
+  }
+}
+
+
+proc UISelectCity {win} {
+  AskQuestion [Color $win #ff0000 #ffffff] "Choose Another City" \
+    "Do you want to abandon this city and choose another one?" \
+    "{Keep playing.} SelectCity.No {RejectPlan}" \
+    "" \
+    "{Another city!} SelectCity.Yes {UIPickScenarioMode}"
+}
+
+
+proc UIQuit {head} {
+  if {[sim Players] == 1} {
+    set l "{Keep playing.} Quit.No {RejectPlan}"
+    set m ""
+    set r "{I quit!} Quit.IQuit {DoReallyQuit %s}"
+  } else {
+    set l "{Keep playing.} Quit.No {RejectPlan}"
+    set m "{I quit!} Quit.IResign {DoIResign %s}"
+    set r "{Everyone quit!} Quit.AllQuit {DoReallyQuit %s}"
+  }
+  AskQuestion [Color $head #ff0000 #ffffff] "Quit Playing Micropolis" \
+    "Do you want to quit playing Micropolis?" \
+    $l $m $r
+}
+
+
+proc DoIResign {head} {
+  global VotesForAsk
+  set display [winfo screen $head]
+  CrushHead $head
+  DecRefDisplay $display
+  UISetMessage "The player on X11 Display $display has resigned."
+  UpdatePlayers
+  if {([sim Players] == 0) ||
+      ([llength $VotesForAsk] >= [sim Players])} {
+    sim ReallyQuit
+  }
+}
+
+
+proc DoReallyQuit {head} {
+  echo QuitMicropolis
+  sim ReallyQuit
+}
+
+
+proc UISplashMode {} {
+  global State
+  set State splash
+  sim Pause
+  WithdrawAll
+  InitSplashes
+  ShowSplashes
+}
+
+
+proc UIPickScenarioMode {} {
+  global State
+  global CityLibDir
+  set State scenario
+  sim Pause
+  WithdrawAll
+  InitHistory
+  UIGenerateCityNow
+  InitScenarios
+  InitVotesForUseThisMap
+  ShowScenarios
+}
+
+
+proc ForcePickScenarioMode {} {
+  global State
+  if {"$State" != "scenario"} {
+    UIPickScenarioMode
+  }
+}
+
+
+proc UIGenerateCityNow {} {
+  global CityName GameLevel
+  sim CityName NowHere
+  sim GameLevel 0
+  UIGenerateNewCity
+}
+
+
+proc UIGenerateNewCity {} {
+  global CityName GameLevel
+  if {$GameLevel == -1} {
+    set GameLevel 0
+  }
+  MakeHistory "DoNewCity NowHere $GameLevel [sim Rand] [sim TreeLevel] [sim LakeLevel] [sim CurveLevel] [sim CreateIsland]"
+}
+
+
+proc DoNewCity {name level {r ""} {tl -1} {ll -1} {cl -1} {ci -1}} {
+  global Scenario
+  set Scenario -1
+  sim TreeLevel $tl
+  sim LakeLevel $ll
+  sim CurveLevel $cl
+  sim CreateIsland $ci
+  if {"$r" == ""} {
+    sim GenerateNewCity
+  } else {
+    sim GenerateSomeCity $r
+  }
+  sim CityName $name
+  sim GameLevel $level
+  UIShowPicture 48
+}
+
+
+proc UIDidGenerateNewCity {} {
+  sim Update
+}
+
+
+proc IncRefDisplay {display} {
+  global DisplayRegistry
+  if ![info exists DisplayRegistry($display)] {
+    set DisplayRegistry($display) 0
+  }
+  incr DisplayRegistry($display)
+}
+
+
+proc DecRefDisplay {display} {
+  global DisplayRegistry
+  incr DisplayRegistry($display) -1
+  if {$DisplayRegistry($display) <= 0} {
+    CloseDisplay $display
+  }
+}
+
+
+proc CloseDisplay {display} {
+}
+
+
+proc DoStopMicropolis {} {
+  KillSoundServers
+  destroy .
+}
+
+
+proc AddPlayer {display} {
+  set i [string first : $display]
+  if {$i == 0} {
+  } else {
+    if {$i == -1} {
+      set display "$display:0"
+    }
+  }
+
+  echo Adding a player on $display ...
+
+  set head [MakeWindow.head $display]
+
+  if {"$head" != ""} {
+    set display [winfo screen $head]
+    IncRefDisplay $display
+    PrepHead $head
+    UISetMessage "Added a player on X11 Display \"$display\"."
+    UpdatePlayers
+  } else {
+    UISetMessage "Couldn't add a player on X11 Display \"$display\"!"
+  }
+  return $head
+}
+
+
+proc FireBomb {} {
+  sim FireBomb
+}
+
+proc DropFireBombs {} {
+  FireBomb
+  after 300 FireBomb
+  after 600 FireBomb
+  after 900 FireBomb
+}
+
+
+proc UIMakeMonster {} {
+  sim MakeMonster [sim Rand 120] [sim Rand 100]
+}
+
+
+proc melt {} {
+  sim HeatSteps 1
+  sim HeatFlow -7
+  sim HeatRule 0
+}
+
+
+proc eco {} {
+  sim HeatSteps 1
+  sim HeatFlow 19
+  sim HeatRule 1
+}
+
+
+proc oops {} {
+  sim HeatSteps 0
+}
+
+
+proc TogglePause {} {
+  global State
+
+  if {"$State" != "play" || [sim Speed]} {
+    sim Speed 0
+  } else {
+    sim Speed 3
+  }
+  MakeRunningSound
+}
+
+
+proc SetSpeedTime {time} {
+  sim Speed $time
+  MakeRunningSound
+}
+
+
+proc MakeRunningSound {} {
+  global State
+
+  if {"$State" == "play" && [sim Speed]} {
+    UIMakeSound edit Boing "-speed 1[sim Speed]0"
+  } else {
+    UIMakeSound edit Boing "-speed 90"
+  }
+}
+
+
+proc SayDemands {} {
+  global DemandRes DemandCom DemandInd
+  set slope 3
+  set r [expr "100 + ($DemandRes * $slope)"]
+  set c [expr "100 + ($DemandCom * $slope)"]
+  set i [expr "100 + ($DemandInd * $slope)"]
+  after 020 "UIMakeSound edit O \"-speed $r\""
+  after 220 "UIMakeSound edit A \"-speed $c\""
+  after 440 "UIMakeSound edit E \"-speed $i\""
+}
+
+
+proc UISaveCity {win} {
+  global SaveCityWin
+  set SaveCityWin $win
+  sim SaveCity
+}
+
+
+proc UISaveCityAs {{win ""}} {
+  global SaveCityWin
+  if {"$win" == ""} {set win $SaveCityWin}
+  set SaveCityWin $win
+
+  global CityDir
+  set file [ShowFileOf $win]
+  DoFileDialog $file "Choose a File to Save the City" $CityDir "*.cty" "" \
+       "UIDoReallySaveCity" ""
+}
+
+
+proc UIDoReallySaveCity {name path} {
+  global CityDir
+  if {![string match *.cty $name]} {
+    set name $name.cty
+  }
+  set CityDir $path
+  sim SaveCityAs $path/$name
+}
+
+
+proc UIDidSaveCity {} {
+  DoSendMessage "Saved the city in \"[sim CityFileName]\"." status
+}
+
+
+proc UIDidntSaveCity {msg} {
+  DoSendMessage $msg alert
+  UIMakeSound warning Sorry "-speed 85"
+}
+
+
+proc UILoadScenario {scen} {
+  MakeHistory "DoScenario $scen"
+}
+
+
+proc DoScenario {scen} {
+  global Scenario
+  set Scenario $scen
+  sim LoadScenario $scen
+  UIShowPicture $scen
+}
+
+
+proc UIDidLoadScenario {} {
+}
+
+
+proc UIStartScenario {id} {
+  global Scenario
+  set Scenario $id
+  UILoadScenario $id
+  UIPlayGame
+  UIShowPicture $id
+}
+
+
+proc UIPlayNewCity {} {
+  UIGenerateNewCity
+  UIPlayGame
+}
+
+
+proc UIStartLoad {} {
+  UIPlayGame
+}
+
+
+proc UIReallyStartGame {} {
+  #UIPickScenarioMode
+  UISplashMode
+}
+
+
+proc UIPlayGame {} {
+  global State
+  global Priority
+  set State play
+  sim Resume
+  sim Speed 3
+  sim AutoGoto 1
+  SetPriority $Priority
+  InitHeads
+  InitAllHeadMenus
+  ShowInitial
+  sim NeedRest 10
+}
+
+
+proc UISetSpeed {speed} {
+  global Time State
+  set Time $speed
+  if {"$State" == "play"} {
+    UISetMessage [lindex {
+      {Time pauses.}
+      {Time flows slow.}
+      {Time flows medium.}
+      {Time flows fast.}
+    } $speed]
+  }
+  UIUpdateRunning
+}
+
+
+proc UIUpdateRunning {} {
+  global HeadWindows Time State
+
+       if {($State == "play") && $Time} {
+    set pict "@images/micropolisg.xpm"
+  } else {
+    set pict "@images/micropoliss.xpm"
+  }
+
+  foreach win $HeadWindows {
+    set can [WindowLink $win.demand]
+    $can itemconfig micropolis -bitmap $pict
+  }
+}
+
+
+proc DoSetGameLevel {level} {
+  sim GameLevel $level
+}
+
+
+proc UISetGameLevel {level} {
+  global GameLevel
+  set GameLevel $level
+  global ScenarioWindows
+  foreach win $ScenarioWindows {
+    UpdateLevelSelection $win
+  }
+}
+
+
+proc UISetCityName {name} {
+  global EditorWindows
+  global CityName
+  set CityName $name
+  set title "Micropolis Editor on $name"
+  foreach win $EditorWindows {
+    # TODO: set editor window and icon title
+    #wm title $win "$title"
+    #wm iconname $win "$title"
+  }
+}
+
+
+proc UILoadCity {win} {
+  # if changed, r-u-sure?
+  global CityDir
+  set file [ShowFileOf $win]
+  DoFileDialog $file "Choose a City to Load" $CityDir "*.cty" "" \
+       "UIDoLoadCity" ""
+}
+
+
+proc UIDoLoadCity {name path} {
+  global CityDir
+  set CityDir $path
+  if {![string match *.cty $name]} {
+    set name $name.cty
+  }
+  MakeHistory "DoLoadCity $path/$name"
+}
+
+
+proc DoLoadCity {filename} {
+  sim LoadCity $filename
+}
+
+proc UIDidLoadCity {} {
+  global State GameLevel Scenario
+  set Scenario -1
+  set GameLevel -1
+  if {$State == "play"} {
+    UIPlayGame
+  } else {
+    UIShowPicture 49 [sim CityFileName]
+  }
+}
+
+
+proc UIDidntLoadCity {msg} {
+  DoSendMessage $msg alert
+  UIMakeSound warning Sorry "-speed 85"
+  UIShowPicture 49 [sim CityFileName]
+  sim Fill 0
+  sim UpdateMaps
+}
+
+
+proc UINewGame {} {
+  global OldBudget
+  set OldBudget 0
+  sim InitGame
+  sim EraseOverlay
+  InitEditors
+  InitMaps
+  InitGraphs
+  update
+  sim UpdateMaps
+}
+
+
+proc UIDidPan {w x y} {
+  if {[$w ToolMode] == 1} {
+    EditorToolDrag $w $x $y
+  }
+  update idletasks
+}
+
+
+proc UIDidStopPan {win} {
+  UIMakeSoundOn $win fancy Skid "-volume 25"
+  $win TweakCursor
+}
+
+
+proc UIEarthQuake {} {
+}
+
+
+proc UIAutoGoto {x y {except {}}} {
+  global EditorWindows
+  set didOne 0
+  set x [expr "$x * 16 + 8"]
+  set y [expr "$y * 16 + 8"]
+  foreach win $EditorWindows {
+    if {"$win" != "$except"} {
+      set view [WindowLink $win.view]
+      if {[$view AutoGoto]} {
+        set didOne 1
+        $view AutoGoal $x $y
+      }
+    }
+  }
+  if {$didOne} {
+    sim UpdateMaps
+  }
+}
+
+
+proc UIAutoGotoOn {x y eds} {
+  set x [expr "$x * 16 + 8"]
+  set y [expr "$y * 16 + 8"]
+  foreach win $eds {
+    [WindowLink $win.view] AutoGoal $x $y
+  }
+  sim UpdateMaps
+}
+
+
+proc DoLeaveGame {head} {
+}
+
+
+proc UILoseGame {} {
+  UIPickScenarioMode
+  UIShowPicture 200
+}
+
+
+proc UIWinGame {} {
+  UIShowPicture 100
+}
+
+
+proc DoPendTool {view tool x y} {
+  global HeadWindows ToolInfo VotesForAsk
+
+  set win [WindowLink $view.top]
+  set head [WindowLink $win.head]
+
+  if {($tool == [sim PendingTool]) &&
+      ($x == [sim PendingX]) &&
+      ($y == [sim PendingY])} {
+    if {[lsearch $VotesForAsk $head] != -1} {
+      # you can only vote once
+      UIMakeSound edit Oop
+    } else {
+      UIMakeSound edit Boing
+      set ask [WindowLink $head.ask]
+      PressVoteButton $ask [WindowLink $ask.vote] Ask
+    }
+  } else {
+    UIAutoGoto $x $y $win
+
+    UIMakeSound edit Boing
+    set info [lindex $ToolInfo $tool]
+    set a [lindex $info 0]
+    set name [lindex $info 1]
+    set cost [lindex $info 2]
+    set title "Build $a $name"
+    set question "Do you support the plan to build $a $name for $cost?"
+    AskQuestion [Color $win #00ff00 #ffffff] "$title" \
+       "$question" \
+       "{Veto plan.} Plan.Veto
+          {RejectPlan}" \
+       "{Goto plan.} Plan.Goto
+          {ComeTo %s $x $y}" \
+       "{Support plan!} Plan.Support
+          {SupportPlan $view %s $tool $x $y}
+          {PreviewSupportPlan $view %s $tool $x $y}"
+    set VotesForAsk $head
+    set ask [WindowLink $head.ask]
+    [WindowLink $ask.vote] config -relief sunken
+
+    UpdateVotesForAsk
+
+    sim PendingTool $tool
+    sim PendingX $x
+    sim PendingY $y
+    sim Votes [llength $VotesForAsk]
+  }
+}
+
+
+proc RejectPlan {} {
+  sim PendingTool -1
+  if {[sim Players] > 1} {
+    UIMakeSound edit Sorry
+  }
+  WithdrawAsks
+}
+
+
+proc NeededVotes {} {
+  global FreeVotes
+  set players [sim Players]
+  set needed [expr "$players - $FreeVotes"]
+  return [max 0 $needed]
+}
+
+
+proc SupportPlan {view h tool x y} {
+  global VotesForAsk
+  sim Votes [llength $VotesForAsk]
+  sim PendingTool -1
+  sim OverRide 1
+  $view DoTool $tool $x $y
+  sim OverRide 0
+  WithdrawAsks
+  UIMakeSound edit Aaah
+}
+
+
+proc PreviewSupportPlan {view h tool x y} {
+  global VotesForAsk
+  sim Votes [llength $VotesForAsk]
+}
+
+
+proc SugarStartUp {uri} {
+  global SugarURI
+  set SugarURI $uri
+
+  # TODO: Load the city file at the given URI, or configure according to URI parameters. 
+}
+
+
+proc SugarNickName {nick} {
+  global SugarNickName
+  set SugarNickName $nick
+}
+
+
+proc SugarActivate {} {
+  global SugarActivated
+  set SugarActivated 1
+}
+
+
+proc SugarDeactivate {} {
+  global SugarActivated
+  set SugarActivated 0
+}
+
+
+proc SugarShare {} {
+  global SugarShared
+  set SugarShared 1
+}
+
+
+proc SugarBuddyAdd {key nick color address} {
+  global SugarBuddies
+  set buddy [list $key $nick $color $address]
+  lappend SugarBuddies $buddy
+}
+
+
+proc SugarBuddyDel {key nick color address} {
+  global SugarBuddies
+  set buddy [list $key $nick $color $address]
+  set i [lsearch $wins $win]
+  if {$i != -1} {
+    set SugarBuddies [lreplace $wins $i $i]
+  }
+}
+
+
+proc SugarQuit {} {
+  sim ReallyQuit
+}
+
+
+########################################################################
diff --git a/res/mkindex.tcl b/res/mkindex.tcl
new file mode 100644 (file)
index 0000000..fe17903
--- /dev/null
@@ -0,0 +1,50 @@
+# auto_mkindex:
+# Given a directory and a glob-style specification for files in that
+# directory, generate a "tclIndex" file in the directory that is suitable
+# for use in auto-loading.  Returns a null string.
+#
+# $Header: /user6/ouster/tcl/scripts/RCS/mkindex.tcl,v 1.2 91/12/16 08:29:25 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1991 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+proc auto_mkindex {dir files} {
+    global errorCode errorInfo
+    set oldDir [pwd]
+    cd $dir
+    set dir [pwd]
+    append index "# Tcl autoload index file: each line identifies a Tcl\n"
+    append index "# procedure and the file where that procedure is\n"
+    append index "# defined.  Generated by the \"auto_mkindex\" command.\n"
+    append index "\n"
+    foreach file [glob $files] {
+       set f ""
+       set error [catch {
+           set f [open $file]
+           while {[gets $f line] >= 0} {
+               if [regexp {^proc[      ]+([^   ]*)} $line match procName] {
+                   append index "[list $procName $file]\n"
+               }
+           }
+           close $f
+       } msg]
+       if $error {
+           set code $errorCode
+           set info $errorInfo
+           catch [close $f]
+           cd $oldDir
+           error $msg $info $code
+       }
+    }
+    set f [open tclindex w]
+    puts $f $index nonewline
+    close $f
+    cd $oldDir
+}
diff --git a/res/parray.tcl b/res/parray.tcl
new file mode 100644 (file)
index 0000000..a90e42f
--- /dev/null
@@ -0,0 +1,29 @@
+# parray:
+# Print the contents of a global array on stdout.
+#
+# $Header: /sprite/src/lib/tcl/scripts/RCS/parray.tcl,v 1.1 91/09/26 09:55:03 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1991 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+proc parray a {
+    global $a
+    set maxl 0
+    foreach name [lsort [array names $a]] {
+       if {[string length $name] > $maxl} {
+           set maxl [string length $name]
+       }
+    }
+    set maxl [expr {$maxl + [string length $a] + 2}]
+    foreach name [lsort [array names $a]] {
+       set nameString [format %s(%s) $a $name]
+       puts stdout [format "%-*s = %s" $maxl $nameString [set ${a}($name)]]
+    }
+}
diff --git a/res/snro.111 b/res/snro.111
new file mode 100644 (file)
index 0000000..9fdfc3d
Binary files /dev/null and b/res/snro.111 differ
diff --git a/res/snro.222 b/res/snro.222
new file mode 100644 (file)
index 0000000..ddf2eb1
Binary files /dev/null and b/res/snro.222 differ
diff --git a/res/snro.333 b/res/snro.333
new file mode 100644 (file)
index 0000000..7ef3922
Binary files /dev/null and b/res/snro.333 differ
diff --git a/res/snro.444 b/res/snro.444
new file mode 100644 (file)
index 0000000..a6d1437
Binary files /dev/null and b/res/snro.444 differ
diff --git a/res/snro.555 b/res/snro.555
new file mode 100644 (file)
index 0000000..14bf8ed
Binary files /dev/null and b/res/snro.555 differ
diff --git a/res/snro.666 b/res/snro.666
new file mode 100644 (file)
index 0000000..fede901
Binary files /dev/null and b/res/snro.666 differ
diff --git a/res/snro.777 b/res/snro.777
new file mode 100644 (file)
index 0000000..14e7bb8
Binary files /dev/null and b/res/snro.777 differ
diff --git a/res/snro.888 b/res/snro.888
new file mode 100644 (file)
index 0000000..c413e10
Binary files /dev/null and b/res/snro.888 differ
diff --git a/res/sound.tcl b/res/sound.tcl
new file mode 100644 (file)
index 0000000..d5d7a55
--- /dev/null
@@ -0,0 +1,158 @@
+# Original TCL/X sound server support -- not used in OLPC Micropolis.
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+
+global errorInfo
+set errorInfo {}
+
+global auto_noexec
+set auto_noexec 1
+
+proc echo {args} {
+  puts stdout $args
+  flush stdout
+} 
+
+source $tk_library/wish.tcl
+
+global ResourceDir
+set ResourceDir ""
+
+proc StartSound {resourcedir} {
+  global ResourceDir
+  set ResourceDir $resourcedir
+}
+
+proc KillSoundServer {} {
+  catch "destroy ."
+  echo Sound server exiting.
+  exit
+}
+
+proc ConnectNewClient {mode f} {
+  echo "ConnectNewClient mode $mode f $f"
+}
+
+
+set ChatSocket 8888
+set ChatServer {}
+
+if {0} {
+
+catch {
+    set ChatServer [accept $ChatSocket]
+}
+
+if {$ChatServer != {}} then {
+    filehandler $ChatServer e "ConnectNewClient"
+}
+
+}
+
+
+set ResourceDir $tk_library
+
+sound file Rumble $ResourceDir/rumble.au
+sound file HeavyTraffic $ResourceDir/traffic.au
+sound file Siren $ResourceDir/siren.au
+sound file HonkHonk-Low $ResourceDir/honk-low.au
+sound file Monster $ResourceDir/monster.au
+sound file Explosion-High $ResourceDir/expl-hi.au
+sound file HonkHonk-High $ResourceDir/honk-hi.au
+sound file HonkHonk-Med $ResourceDir/honk-med.au
+sound file Explosion-Low $ResourceDir/expl-low.au
+sound file QuackQuack $ResourceDir/quack.au
+sound file Ignition $ResourceDir/ignition.au
+sound file Whip $ResourceDir/whip.au
+sound file Cuckoo $ResourceDir/cuckoo.au
+sound file Boing $ResourceDir/boing.au
+sound file Skid $ResourceDir/skid.au
+sound file Computer $ResourceDir/computer.au
+sound file Unix $ResourceDir/unix.au
+sound file Sorry $ResourceDir/sorry.au
+sound file UhUh $ResourceDir/uhuh.au
+sound file Woosh $ResourceDir/woosh.au
+sound file Aaah $ResourceDir/aaah.au
+sound file Oop $ResourceDir/oop.au
+sound file Beep $ResourceDir/beep.au
+sound file Bop $ResourceDir/bop.au
+sound file Zone $ResourceDir/zone.au
+sound file Build $ResourceDir/build.au
+sound file Res $ResourceDir/res.au
+sound file Com $ResourceDir/com.au
+sound file Ind $ResourceDir/ind.au
+sound file Fire $ResourceDir/fire.au
+sound file Query $ResourceDir/query.au
+sound file Police $ResourceDir/police.au
+sound file Wire $ResourceDir/wire.au
+sound file Bulldozer $ResourceDir/bulldoze.au
+sound file Rail $ResourceDir/rail.au
+sound file Road $ResourceDir/road.au
+sound file Chalk $ResourceDir/chalk.au
+sound file Eraser $ResourceDir/eraser.au
+sound file Stadium $ResourceDir/stadium.au
+sound file Park $ResourceDir/park.au
+sound file Seaport $ResourceDir/seaport.au
+sound file Coal $ResourceDir/coal.au
+sound file Nuclear $ResourceDir/nuclear.au
+sound file Airport $ResourceDir/airport.au
+sound file O $ResourceDir/o.au
+sound file A $ResourceDir/a.au
+sound file E $ResourceDir/e.au
diff --git a/res/sounds/a.wav b/res/sounds/a.wav
new file mode 100755 (executable)
index 0000000..878c76e
Binary files /dev/null and b/res/sounds/a.wav differ
diff --git a/res/sounds/aaah.wav b/res/sounds/aaah.wav
new file mode 100755 (executable)
index 0000000..3c59296
Binary files /dev/null and b/res/sounds/aaah.wav differ
diff --git a/res/sounds/airport.wav b/res/sounds/airport.wav
new file mode 100755 (executable)
index 0000000..fa644d0
Binary files /dev/null and b/res/sounds/airport.wav differ
diff --git a/res/sounds/beep.wav b/res/sounds/beep.wav
new file mode 100755 (executable)
index 0000000..e37a6a4
Binary files /dev/null and b/res/sounds/beep.wav differ
diff --git a/res/sounds/boing.wav b/res/sounds/boing.wav
new file mode 100755 (executable)
index 0000000..203904a
Binary files /dev/null and b/res/sounds/boing.wav differ
diff --git a/res/sounds/bop.wav b/res/sounds/bop.wav
new file mode 100755 (executable)
index 0000000..a2cd48c
Binary files /dev/null and b/res/sounds/bop.wav differ
diff --git a/res/sounds/build.wav b/res/sounds/build.wav
new file mode 100755 (executable)
index 0000000..b210d97
Binary files /dev/null and b/res/sounds/build.wav differ
diff --git a/res/sounds/bulldozer.wav b/res/sounds/bulldozer.wav
new file mode 100755 (executable)
index 0000000..d42b18c
Binary files /dev/null and b/res/sounds/bulldozer.wav differ
diff --git a/res/sounds/chalk.wav b/res/sounds/chalk.wav
new file mode 100755 (executable)
index 0000000..31224b7
Binary files /dev/null and b/res/sounds/chalk.wav differ
diff --git a/res/sounds/coal.wav b/res/sounds/coal.wav
new file mode 100755 (executable)
index 0000000..c1f3b98
Binary files /dev/null and b/res/sounds/coal.wav differ
diff --git a/res/sounds/com.wav b/res/sounds/com.wav
new file mode 100755 (executable)
index 0000000..b046360
Binary files /dev/null and b/res/sounds/com.wav differ
diff --git a/res/sounds/computer.wav b/res/sounds/computer.wav
new file mode 100755 (executable)
index 0000000..acf08a1
Binary files /dev/null and b/res/sounds/computer.wav differ
diff --git a/res/sounds/cuckoo.wav b/res/sounds/cuckoo.wav
new file mode 100755 (executable)
index 0000000..64d7ed2
Binary files /dev/null and b/res/sounds/cuckoo.wav differ
diff --git a/res/sounds/e.wav b/res/sounds/e.wav
new file mode 100755 (executable)
index 0000000..fb9477d
Binary files /dev/null and b/res/sounds/e.wav differ
diff --git a/res/sounds/eraser.wav b/res/sounds/eraser.wav
new file mode 100755 (executable)
index 0000000..a7837d8
Binary files /dev/null and b/res/sounds/eraser.wav differ
diff --git a/res/sounds/explosion-hi.wav b/res/sounds/explosion-hi.wav
new file mode 100755 (executable)
index 0000000..3b36fa2
Binary files /dev/null and b/res/sounds/explosion-hi.wav differ
diff --git a/res/sounds/explosion-high.wav b/res/sounds/explosion-high.wav
new file mode 100755 (executable)
index 0000000..04fdc8f
Binary files /dev/null and b/res/sounds/explosion-high.wav differ
diff --git a/res/sounds/explosion-low.wav b/res/sounds/explosion-low.wav
new file mode 100755 (executable)
index 0000000..d9605d7
Binary files /dev/null and b/res/sounds/explosion-low.wav differ
diff --git a/res/sounds/fire.wav b/res/sounds/fire.wav
new file mode 100755 (executable)
index 0000000..ec60059
Binary files /dev/null and b/res/sounds/fire.wav differ
diff --git a/res/sounds/heavytraffic.wav b/res/sounds/heavytraffic.wav
new file mode 100755 (executable)
index 0000000..1c53cf7
Binary files /dev/null and b/res/sounds/heavytraffic.wav differ
diff --git a/res/sounds/honkhonk-hi.wav b/res/sounds/honkhonk-hi.wav
new file mode 100755 (executable)
index 0000000..9eda496
Binary files /dev/null and b/res/sounds/honkhonk-hi.wav differ
diff --git a/res/sounds/honkhonk-high.wav b/res/sounds/honkhonk-high.wav
new file mode 100755 (executable)
index 0000000..358eb55
Binary files /dev/null and b/res/sounds/honkhonk-high.wav differ
diff --git a/res/sounds/honkhonk-low.wav b/res/sounds/honkhonk-low.wav
new file mode 100755 (executable)
index 0000000..d406be7
Binary files /dev/null and b/res/sounds/honkhonk-low.wav differ
diff --git a/res/sounds/honkhonk-med.wav b/res/sounds/honkhonk-med.wav
new file mode 100755 (executable)
index 0000000..028d8e6
Binary files /dev/null and b/res/sounds/honkhonk-med.wav differ
diff --git a/res/sounds/ignition.wav b/res/sounds/ignition.wav
new file mode 100755 (executable)
index 0000000..7466606
Binary files /dev/null and b/res/sounds/ignition.wav differ
diff --git a/res/sounds/ind.wav b/res/sounds/ind.wav
new file mode 100755 (executable)
index 0000000..4c71440
Binary files /dev/null and b/res/sounds/ind.wav differ
diff --git a/res/sounds/monster.wav b/res/sounds/monster.wav
new file mode 100755 (executable)
index 0000000..d9b02b4
Binary files /dev/null and b/res/sounds/monster.wav differ
diff --git a/res/sounds/nuclear.wav b/res/sounds/nuclear.wav
new file mode 100755 (executable)
index 0000000..b02450e
Binary files /dev/null and b/res/sounds/nuclear.wav differ
diff --git a/res/sounds/o.wav b/res/sounds/o.wav
new file mode 100755 (executable)
index 0000000..bc7d8f9
Binary files /dev/null and b/res/sounds/o.wav differ
diff --git a/res/sounds/oop.wav b/res/sounds/oop.wav
new file mode 100755 (executable)
index 0000000..86a9809
Binary files /dev/null and b/res/sounds/oop.wav differ
diff --git a/res/sounds/park.wav b/res/sounds/park.wav
new file mode 100755 (executable)
index 0000000..fc7c93f
Binary files /dev/null and b/res/sounds/park.wav differ
diff --git a/res/sounds/police.wav b/res/sounds/police.wav
new file mode 100755 (executable)
index 0000000..251dcec
Binary files /dev/null and b/res/sounds/police.wav differ
diff --git a/res/sounds/quack.wav b/res/sounds/quack.wav
new file mode 100755 (executable)
index 0000000..db46549
Binary files /dev/null and b/res/sounds/quack.wav differ
diff --git a/res/sounds/quackquack.wav b/res/sounds/quackquack.wav
new file mode 100755 (executable)
index 0000000..bdddcfc
Binary files /dev/null and b/res/sounds/quackquack.wav differ
diff --git a/res/sounds/query.wav b/res/sounds/query.wav
new file mode 100755 (executable)
index 0000000..6eec447
Binary files /dev/null and b/res/sounds/query.wav differ
diff --git a/res/sounds/rail.wav b/res/sounds/rail.wav
new file mode 100755 (executable)
index 0000000..86b37ed
Binary files /dev/null and b/res/sounds/rail.wav differ
diff --git a/res/sounds/res.wav b/res/sounds/res.wav
new file mode 100755 (executable)
index 0000000..d9e6eb1
Binary files /dev/null and b/res/sounds/res.wav differ
diff --git a/res/sounds/road.wav b/res/sounds/road.wav
new file mode 100755 (executable)
index 0000000..d8dccfa
Binary files /dev/null and b/res/sounds/road.wav differ
diff --git a/res/sounds/rumble.wav b/res/sounds/rumble.wav
new file mode 100755 (executable)
index 0000000..32acf7f
Binary files /dev/null and b/res/sounds/rumble.wav differ
diff --git a/res/sounds/seaport.wav b/res/sounds/seaport.wav
new file mode 100755 (executable)
index 0000000..df68175
Binary files /dev/null and b/res/sounds/seaport.wav differ
diff --git a/res/sounds/siren.wav b/res/sounds/siren.wav
new file mode 100755 (executable)
index 0000000..349ddcc
Binary files /dev/null and b/res/sounds/siren.wav differ
diff --git a/res/sounds/skid.wav b/res/sounds/skid.wav
new file mode 100755 (executable)
index 0000000..b4b6cc5
Binary files /dev/null and b/res/sounds/skid.wav differ
diff --git a/res/sounds/sorry.wav b/res/sounds/sorry.wav
new file mode 100755 (executable)
index 0000000..ce01b84
Binary files /dev/null and b/res/sounds/sorry.wav differ
diff --git a/res/sounds/stadium.wav b/res/sounds/stadium.wav
new file mode 100755 (executable)
index 0000000..bd28253
Binary files /dev/null and b/res/sounds/stadium.wav differ
diff --git a/res/sounds/uhuh.wav b/res/sounds/uhuh.wav
new file mode 100755 (executable)
index 0000000..b05c02d
Binary files /dev/null and b/res/sounds/uhuh.wav differ
diff --git a/res/sounds/whip.wav b/res/sounds/whip.wav
new file mode 100755 (executable)
index 0000000..7c77390
Binary files /dev/null and b/res/sounds/whip.wav differ
diff --git a/res/sounds/wire.wav b/res/sounds/wire.wav
new file mode 100755 (executable)
index 0000000..04bbdfb
Binary files /dev/null and b/res/sounds/wire.wav differ
diff --git a/res/sounds/woosh.wav b/res/sounds/woosh.wav
new file mode 100755 (executable)
index 0000000..9424347
Binary files /dev/null and b/res/sounds/woosh.wav differ
diff --git a/res/sounds/zone.wav b/res/sounds/zone.wav
new file mode 100755 (executable)
index 0000000..7198d8a
Binary files /dev/null and b/res/sounds/zone.wav differ
diff --git a/res/stri.202 b/res/stri.202
new file mode 100644 (file)
index 0000000..fb51d43
--- /dev/null
@@ -0,0 +1,20 @@
+Low
+Medium
+High
+Very High
+Slum
+Lower Class
+Middle Class
+High
+Safe
+Light
+Moderate
+Dangerous
+None
+Moderate
+Heavy
+Very Heavy
+Declining
+Stable
+Slow Growth
+Fast Growth
diff --git a/res/stri.219 b/res/stri.219
new file mode 100644 (file)
index 0000000..82129de
--- /dev/null
@@ -0,0 +1,27 @@
+Clear
+Water
+Trees
+Rubble
+Flood
+Radioactive Waste
+Fire
+Road
+Power
+Rail
+Residential
+Commercial
+Industrial
+Seaport
+Airport
+Coal Power
+Fire Department
+Police Department
+Stadium
+Nuclear Power
+Draw Bridge
+Radar Dish
+Fountain
+Industrial
+Steelers 38  Bears 3
+Draw Bridge
+Ur 238
diff --git a/res/stri.301 b/res/stri.301
new file mode 100644 (file)
index 0000000..9ce422e
--- /dev/null
@@ -0,0 +1,64 @@
+More residential zones needed.
+More commercial zones needed.
+More industrial zones needed.
+More roads required.
+Inadequate rail system.
+Build a Power Plant.
+Residents demand a Stadium.
+Industry requires a Sea Port.
+Commerce requires an Airport.
+Pollution very high.
+Crime very high.
+Frequent traffic jams reported.
+Citizens demand a Fire Department.
+Citizens demand a Police Department.
+Blackouts reported. Check power map.
+Citizens upset. The tax rate is too high.
+Roads deteriorating, due to lack of funds.
+Fire departments need funding.
+Police departments need funding.
+Fire reported !
+A Monster has been sighted !!
+Tornado reported !!
+Major earthquake reported !!!
+A plane has crashed !
+Shipwreck reported !
+A train crashed !
+A helicopter crashed !
+Unemployment rate is high.
+YOUR CITY HAS GONE BROKE!
+Firebombing reported !
+Need more parks.
+Explosion detected !
+Insufficient funds to build that.
+Area must be bulldozed first.
+Population has reached 2,000.
+Population has reached 10,000.
+Population has reached 50,000.
+Population has reached 100,000.
+Population has reached 500,000.
+Brownouts, build another Power Plant.
+Heavy Traffic reported.
+Flooding reported !!
+A Nuclear Meltdown has occurred !!!
+They're rioting in the streets !!
+End of Demo !!
+No Sound Server!
+No Multi Player License !!
+Started a New City.
+Restored a Saved City.
+x
+x
+x
+x
+x
+x
+x
+x
+x
+x
+x
+x
+x
+x
+x
diff --git a/res/stri.356 b/res/stri.356
new file mode 100644 (file)
index 0000000..a2e2d31
--- /dev/null
@@ -0,0 +1,19 @@
+Residential Zone
+Commercial Zone
+Industrial Zone
+Fire Station
+Query
+Police Station
+Wire Power
+Bulldozer
+Rail
+Road
+Chalk
+Eraser
+Stadium
+Park
+Seaport
+Coal Power
+Nuclear Power
+Airport
+
diff --git a/res/tcl.tdx b/res/tcl.tdx
new file mode 100644 (file)
index 0000000..d2f3c54
--- /dev/null
@@ -0,0 +1,15 @@
+TclX-ArrayProcedures 48 407 for_array_keys
+TclX-assign_fields 500 148 assign_fields
+TclX-developer_utils 699 804 saveprocs edprocs
+TclX-forfile 1537 167 for_file
+TclX-forrecur 1749 356 for_recursive_glob
+TclX-globrecur 2147 330 recursive_glob
+TclX-help 2527 4828 help helpcd helppwd apropos
+TclX-packages 7400 950 packages autoprocs
+TclX-directory_stack 8399 574 pushd popd dirs
+TclX-set_functions 9039 2020 union intersect intersect3 lrmdups
+TclX-show_procedures 11111 603 showproc showprocs
+TclX-stringfile_functions 11773 363 read_file write_file
+TclX-Compatibility 12174 59 execvp
+TclX-convertlib 12273 933 convert_lib
+TclX-profrep 13239 3168 profrep
diff --git a/res/tcl.tlb b/res/tcl.tlb
new file mode 100644 (file)
index 0000000..d463f71
--- /dev/null
@@ -0,0 +1,661 @@
+
+#@package: TclX-ArrayProcedures for_array_keys
+
+proc for_array_keys {varName arrayName codeFragment} {
+    upvar $varName enumVar $arrayName enumArray
+
+    if ![info exists enumArray] {
+       error "\"$arrayName\" isn't an array"
+    }
+
+    set searchId [array startsearch enumArray]
+    while {[array anymore enumArray $searchId]} {
+       set enumVar [array nextelement enumArray $searchId]
+       uplevel $codeFragment
+    }
+    array donesearch enumArray $searchId
+}
+
+#@package: TclX-assign_fields assign_fields
+
+proc assign_fields {list args} {
+    foreach varName $args {
+        set value [lvarpop list]
+        uplevel "set $varName [list $value]"
+    }
+}
+
+#@package: TclX-developer_utils saveprocs edprocs
+
+proc saveprocs {fileName args} {
+    set fp [open $fileName w]
+    puts $fp "# tcl procs saved on [fmtclock [getclock]]\n"
+    puts $fp [eval "showprocs $args"]
+    close $fp
+}
+
+proc edprocs {args} {
+    global env
+
+    set tmpFilename /tmp/tcldev.[id process]
+
+    set fp [open $tmpFilename w]
+    puts $fp "\n# TEMP EDIT BUFFER -- YOUR CHANGES ARE FOR THIS SESSION ONLY\n"
+    puts $fp [eval "showprocs $args"]
+    close $fp
+
+    if [info exists env(EDITOR)] {
+        set editor $env(EDITOR)
+    } else {
+       set editor vi
+    }
+
+    set startMtime [file mtime $tmpFilename]
+    system "$editor $tmpFilename"
+
+    if {[file mtime $tmpFilename] != $startMtime} {
+       source $tmpFilename
+       echo "Procedures were reloaded."
+    } else {
+       echo "No changes were made."
+    }
+    unlink $tmpFilename
+    return
+}
+
+#@package: TclX-forfile for_file
+
+proc for_file {var filename code} {
+    upvar $var line
+    set fp [open $filename r]
+    while {[gets $fp line] >= 0} {
+        uplevel $code
+    }
+    close $fp
+}
+
+
+#@package: TclX-forrecur for_recursive_glob
+
+proc for_recursive_glob {var globlist code {depth 1}} {
+    upvar $depth $var myVar
+    foreach globpat $globlist {
+        foreach file [glob -nocomplain $globpat] {
+            if [file isdirectory $file] {
+                for_recursive_glob $var $file/* $code [expr {$depth + 1}]
+           }
+           set myVar $file
+           uplevel $depth $code
+        }
+    }
+}
+
+#@package: TclX-globrecur recursive_glob
+
+proc recursive_glob {globlist} {
+    set result ""
+    foreach pattern $globlist {
+        foreach file [glob -nocomplain $pattern] {
+            lappend result $file
+            if [file isdirectory $file] {
+                set result [concat $result [recursive_glob $file/*]]
+            }
+        }
+    }
+    return $result
+}
+
+#@package: TclX-help help helpcd helppwd apropos
+
+
+proc help:flattenPath {pathName} {
+    set newPath {}
+    foreach element [split $pathName /] {
+        if {"$element" == "."} {
+           continue
+        }
+        if {"$element" == ".."} {
+            if {[llength [join $newPath /]] == 0} {
+                error "Help: name goes above subject directory root"}
+            lvarpop newPath [expr [llength $newPath]-1]
+            continue
+        }
+        lappend newPath $element
+    }
+    set newPath [join $newPath /]
+    
+
+    if {("$newPath" == "") && [string match "/*" $pathName]} {
+        set newPath "/"}
+        
+    return $newPath
+}
+
+
+proc help:EvalPath {pathName} {
+    global TCLENV
+
+    if {![string match "/*" $pathName]} {
+        if {"$pathName" == ""} {
+            return $TCLENV(help:curDir)}
+        if {"$TCLENV(help:curDir)" == "/"} {
+            set pathName "/$pathName"
+        } else {
+            set pathName "$TCLENV(help:curDir)/$pathName"
+        }
+    }
+    set pathName [help:flattenPath $pathName]
+    if {[string match "*/" $pathName] && ($pathName != "/")} {
+        set pathName [csubstr $pathName 0 [expr [length $pathName]-1]]}
+
+    return $pathName    
+}
+
+
+proc help:Display {line} {
+    global TCLENV
+    if {$TCLENV(help:lineCnt) >= 23} {
+        set TCLENV(help:lineCnt) 0
+        puts stdout ":" nonewline
+        flush stdout
+        gets stdin response
+        if {![lempty $response]} {
+            return 0}
+    }
+    puts stdout $line
+    incr TCLENV(help:lineCnt)
+}
+
+
+proc help:DisplayFile {filepath} {
+
+    set inFH [open $filepath r]
+    while {[gets $inFH fileBuf] >= 0} {
+        if {![help:Display $fileBuf]} {
+            break}
+    }
+    close $inFH
+
+}    
+
+
+proc help:ListDir {dirPath} {
+    set dirList {}
+    set fileList {}
+    if {[catch {set dirFiles [glob $dirPath/*]}] != 0} {
+        error "No files in subject directory: $dirPath"}
+    foreach fileName $dirFiles {
+        if [file isdirectory $fileName] {
+            lappend dirList "[file tail $fileName]/"
+        } else {
+            lappend fileList [file tail $fileName]
+        }
+    }
+   return [list [lsort $dirList] [lsort $fileList]]
+}
+
+
+proc help:DisplayColumns {nameList} {
+    set count 0
+    set outLine ""
+    foreach name $nameList {
+        if {$count == 0} {
+            append outLine "   "}
+        append outLine $name
+        if {[incr count] < 4} {
+            set padLen [expr 17-[clength $name]]
+            if {$padLen < 3} {
+               set padLen 3}
+            append outLine [replicate " " $padLen]
+        } else {
+           if {![help:Display $outLine]} {
+               return}
+           set outLine ""
+           set count 0
+        }
+    }
+    if {$count != 0} {
+        help:Display $outLine}
+    return
+}
+
+
+
+proc help {{subject {}}} {
+    global TCLENV
+
+    set TCLENV(help:lineCnt) 0
+
+
+    if {($subject == "help") || ($subject == "?")} {
+        help:DisplayFile "$TCLENV(help:root)/help"
+        return
+    }
+
+    set request [help:EvalPath $subject]
+    set requestPath "$TCLENV(help:root)$request"
+
+    if {![file exists $requestPath]} {
+        error "Help:\"$request\" does not exist"}
+    
+    if [file isdirectory $requestPath] {
+        set dirList [help:ListDir $requestPath]
+        set subList  [lindex $dirList 0]
+        set fileList [lindex $dirList 1]
+        if {[llength $subList] != 0} {
+            help:Display "\nSubjects available in $request:"
+            help:DisplayColumns $subList
+        }
+        if {[llength $fileList] != 0} {
+            help:Display "\nHelp files available in $request:"
+            help:DisplayColumns $fileList
+        }
+    } else {
+        help:DisplayFile $requestPath
+    }
+    return
+}
+
+
+
+proc helpcd {{dir /}} {
+    global TCLENV
+
+    set request [help:EvalPath $dir]
+    set requestPath "$TCLENV(help:root)$request"
+
+    if {![file exists $requestPath]} {
+        error "Helpcd: \"$request\" does not exist"}
+    
+    if {![file isdirectory $requestPath]} {
+        error "Helpcd: \"$request\" is not a directory"}
+
+    set TCLENV(help:curDir) $request
+    return    
+}
+
+
+proc helppwd {} {
+        global TCLENV
+        echo "Current help subject directory: $TCLENV(help:curDir)"
+}
+
+
+proc apropos {name} {
+    global TCLENV
+
+    set TCLENV(help:lineCnt) 0
+
+    set aproposCT [scancontext create]
+    scanmatch -nocase $aproposCT $name {
+        set path [lindex $matchInfo(line) 0]
+        set desc [lrange $matchInfo(line) 1 end]
+        if {![help:Display [format "%s - %s" $path $desc]]} {
+            return}
+    }
+    foreach brief [glob -nocomplain $TCLENV(help:root)/*.brf] {
+        set briefFH [open $brief]
+        scanfile $aproposCT $briefFH
+        close $briefFH
+    }
+    scancontext delete $aproposCT
+}
+
+global TCLENV TCLPATH
+
+set TCLENV(help:root) [searchpath $TCLPATH help]
+set TCLENV(help:curDir) "/"
+set TCLENV(help:outBuf) {}
+
+#@package: TclX-packages packages autoprocs
+
+proc packages {{option {}}} {
+    global TCLENV
+    set packList {}
+    foreach key [array names TCLENV] {
+        if {[string match "PKG:*" $key]} {
+            lappend packList [string range $key 4 end]
+        }
+    }
+    if [lempty $option] {
+        return $packList
+    } else {
+        if {$option != "-location"} {
+            error "Unknow option \"$option\", expected \"-location\""
+        }
+        set locList {}
+        foreach pack $packList {
+            set fileId [lindex $TCLENV(PKG:$pack) 0]
+            
+            lappend locList [list $pack [concat $TCLENV($fileId) \
+                                             [lrange $TCLENV(PKG:$pack) 1 2]]]
+        }
+        return $locList
+    }
+}
+
+proc autoprocs {} {
+    global TCLENV
+    set procList {}
+    foreach key [array names TCLENV] {
+        if {[string match "PROC:*" $key]} {
+            lappend procList [string range $key 5 end]
+        }
+    }
+    return $procList
+}
+
+#@package: TclX-directory_stack pushd popd dirs
+
+global TCLENV(dirPushList)
+
+set TCLENV(dirPushList) ""
+
+proc pushd {args} {
+    global TCLENV
+
+    if {[llength $args] > 1} {
+        error "bad # args: pushd [dir_to_cd_to]"
+    }
+    set TCLENV(dirPushList) [linsert $TCLENV(dirPushList) 0 [pwd]]
+
+    if {[llength $args] != 0} {
+        cd [glob $args]
+    }
+}
+
+proc popd {} {
+    global TCLENV
+
+    if [llength $TCLENV(dirPushList)] {
+        cd [lvarpop TCLENV(dirPushList)]
+        pwd
+    } else {
+        error "directory stack empty"
+    }
+}
+
+proc dirs {} { 
+    global TCLENV
+    echo [pwd] $TCLENV(dirPushList)
+}
+
+#@package: TclX-set_functions union intersect intersect3 lrmdups
+
+proc union {lista listb} {
+    set full_list [lsort [concat $lista $listb]]
+    set check_element [lindex $full_list 0]
+    set outlist $check_element
+    foreach element [lrange $full_list 1 end] {
+       if {$check_element == $element} continue
+       lappend outlist $element
+       set check_element $element
+    }
+    return $outlist
+}
+
+proc lrmdups {list} {
+    set list [lsort $list]
+    set result [lvarpop list]
+    lappend last $result
+    foreach element $list {
+       if {$last != $element} {
+           lappend result $element
+           set last $element
+       }
+    }
+    return $result
+}
+
+
+proc intersect3 {list1 list2} {
+    set list1Result ""
+    set list2Result ""
+    set intersectList ""
+
+    set list1 [lrmdups $list1]
+    set list2 [lrmdups $list2]
+
+    while {1} {
+        if [lempty $list1] {
+            if ![lempty $list2] {
+                set list2Result [concat $list2Result $list2]
+            }
+            break
+        }
+        if [lempty $list2] {
+           set list1Result [concat $list1Result $list1]
+            break
+        }
+        set compareResult [string compare [lindex $list1 0] [lindex $list2 0]]
+
+        if {$compareResult < 0} {
+            lappend list1Result [lvarpop list1]
+            continue
+        }
+        if {$compareResult > 0} {
+            lappend list2Result [lvarpop list2]
+            continue
+        }
+        lappend intersectList [lvarpop list1]
+        lvarpop list2
+    }
+    return [list $list1Result $intersectList $list2Result]
+}
+
+proc intersect {list1 list2} {
+    set intersectList ""
+
+    set list1 [lsort $list1]
+    set list2 [lsort $list2]
+
+    while {1} {
+        if {[lempty $list1] || [lempty $list2]} break
+
+        set compareResult [string compare [lindex $list1 0] [lindex $list2 0]]
+
+        if {$compareResult < 0} {
+            lvarpop list1
+            continue
+        }
+
+        if {$compareResult > 0} {
+            lvarpop list2
+            continue
+        }
+
+        lappend intersectList [lvarpop list1]
+        lvarpop list2
+    }
+    return $intersectList
+}
+
+
+
+#@package: TclX-show_procedures showproc showprocs
+
+proc showproc {procname} {
+    if [lempty [info procs $procname]] {demand_load $procname}
+       set arglist [info args $procname]
+       set nargs {}
+       while {[llength $arglist] > 0} {
+           set varg [lvarpop arglist 0]
+           if [info default $procname $varg defarg] {
+               lappend nargs [list $varg $defarg]
+           } else {
+               lappend nargs $varg
+           }
+    }
+    format "proc %s \{%s\} \{%s\}\n" $procname $nargs [info body $procname]
+}
+
+proc showprocs {args} {
+    if [lempty $args] { set args [info procs] }
+    set out ""
+
+    foreach i $args {
+       foreach j $i { append out [showproc $j] "\n"}
+    }
+    return $out
+}
+
+
+#@package: TclX-stringfile_functions read_file write_file
+
+proc read_file {fileName {numBytes {}}} {
+    set fp [open $fileName]
+    if {$numBytes != ""} {
+        set result [read $fp $numBytes]
+    } else {
+        set result [read $fp]
+    }
+    close $fp
+    return $result
+} 
+
+proc write_file {fileName args} {
+    set fp [open $fileName w]
+    foreach string $args {
+        puts $fp $string
+    }
+    close $fp
+}
+
+
+#@package: TclX-Compatibility execvp
+
+proc execvp {progname args} {
+    execl $progname $args
+}
+
+#@package: TclX-convertlib convert_lib
+
+proc convert_lib {tclIndex packageLib {ignore {}}} {
+    if {[file tail $tclIndex] != "tclIndex"} {
+        error "Tail file name numt be `tclIndex': $tclIndex"}
+    set srcDir [file dirname $tclIndex]
+
+    if {[file extension $packageLib] != ".tlib"} {
+        append packageLib ".tlib"}
+
+
+    set tclIndexFH [open $tclIndex r]
+    while {[gets $tclIndexFH line] >= 0} {
+        if {([cindex $line 0] == "#") || ([llength $line] != 2)} {
+            continue}
+        if {[lsearch $ignore [lindex $line 1]] >= 0} {
+            continue}
+        lappend entryTable([lindex $line 1]) [lindex $line 0]
+    }
+    close $tclIndexFH
+
+    set libFH [open $packageLib w]
+    foreach srcFile [array names entryTable] {
+        set srcFH [open $srcDir/$srcFile r]
+        puts $libFH "#@package: $srcFile $entryTable($srcFile)\n"
+        copyfile $srcFH $libFH
+        close $srcFH
+    }
+    close $libFH
+    buildpackageindex $packageLib
+}
+
+#@package: TclX-profrep profrep
+
+proc profrep:summarize {profDataVar stackDepth sumProfDataVar} {
+    upvar $profDataVar profData $sumProfDataVar sumProfData
+
+    if {(![info exists profData]) || ([catch {array size profData}] != 0)} {
+        error "`profDataVar' must be the name of an array returned by the `profile off' command"
+    }
+    set maxNameLen 0
+    foreach procStack [array names profData] {
+        if {[llength $procStack] < $stackDepth} {
+            set sigProcStack $procStack
+        } else {
+            set sigProcStack [lrange $procStack 0 [expr {$stackDepth - 1}]]
+        }
+        set maxNameLen [max $maxNameLen [clength $sigProcStack]]
+        if [info exists sumProfData($sigProcStack)] {
+            set cur $sumProfData($sigProcStack)
+            set add $profData($procStack)
+            set     new [expr [lindex $cur 0]+[lindex $add 0]]
+            lappend new [expr [lindex $cur 1]+[lindex $add 1]]
+            lappend new [expr [lindex $cur 2]+[lindex $add 2]]
+            set $sumProfData($sigProcStack) $new
+        } else {
+            set sumProfData($sigProcStack) $profData($procStack)
+        }
+    }
+    return $maxNameLen
+}
+
+proc profrep:sort {sumProfDataVar sortKey} {
+    upvar $sumProfDataVar sumProfData
+
+    case $sortKey {
+        {calls} {set keyIndex 0}
+        {real}  {set keyIndex 1}
+        {cpu}   {set keyIndex 2}
+        default {
+            error "Expected a sort of: `calls',  `cpu' or ` real'"}
+    }
+
+
+    foreach procStack [array names sumProfData] {
+        set key [format "%016d" [lindex $sumProfData($procStack) $keyIndex]]
+        lappend keyProcList [list $key $procStack]
+    }
+    set keyProcList [lsort $keyProcList]
+
+
+    for {set idx [expr [llength $keyProcList]-1]} {$idx >= 0} {incr idx -1} {
+        lappend sortedProcList [lindex [lindex $keyProcList $idx] 1]
+    }
+    return $sortedProcList
+}
+
+
+proc profrep:print {sumProfDataVar sortedProcList maxNameLen outFile
+                    userTitle} {
+    upvar $sumProfDataVar sumProfData
+    
+    if {$outFile == ""} {
+        set outFH stdout
+    } else {
+        set outFH [open $outFile w]
+    }
+
+
+    set stackTitle "Procedure Call Stack"
+    set maxNameLen [max $maxNameLen [clength $stackTitle]]
+    set hdr [format "%-${maxNameLen}s %10s %10s %10s" $stackTitle \
+                    "Calls" "Real Time" "CPU Time"]
+    if {$userTitle != ""} {
+        puts $outFH [replicate - [clength $hdr]]
+        puts $outFH $userTitle
+    }
+    puts $outFH [replicate - [clength $hdr]]
+    puts $outFH $hdr
+    puts $outFH [replicate - [clength $hdr]]
+
+
+    foreach procStack $sortedProcList {
+        set data $sumProfData($procStack)
+        puts $outFH [format "%-${maxNameLen}s %10d %10d %10d" $procStack \
+                            [lindex $data 0] [lindex $data 1] [lindex $data 2]]
+    }
+    if {$outFile != ""} {
+        close $outFH
+    }
+}
+
+
+proc profrep {profDataVar sortKey stackDepth {outFile {}} {userTitle {}}} {
+    upvar $profDataVar profData
+
+    set maxNameLen [profrep:summarize profData $stackDepth sumProfData]
+    set sortedProcList [profrep:sort sumProfData $sortKey]
+    profrep:print sumProfData $sortedProcList $maxNameLen $outFile $userTitle
+
+}
diff --git a/res/tclindex b/res/tclindex
new file mode 100644 (file)
index 0000000..897e4b8
--- /dev/null
@@ -0,0 +1,68 @@
+# Tcl autoload index file: each line identifies a Tcl
+# procedure and the file where that procedure is
+# defined.  Generated by the "auto_mkindex" command.
+
+unknown tclinit.tcl
+searchpath tclinit.tcl
+autoload tclinit.tcl
+load tclinit.tcl
+TCHSH:PutLibLine buildidx.tcl
+TCLSH:CreateLibIndex buildidx.tcl
+buildpackageindex buildidx.tcl
+unknown init.tcl
+auto_load init.tcl
+auto_execok init.tcl
+auto_reset init.tcl
+auto_mkindex mkindex.tcl
+parray parray.tcl
+tk_butEnter button.tcl
+tk_butLeave button.tcl
+tk_butDown button.tcl
+tk_butUp button.tcl
+tk_entryBackspace entry.tcl
+tk_entryBackword entry.tcl
+tk_entrySeeCaret entry.tcl
+tk_entryCopyPress entry.tcl
+tk_entryCutPress entry.tcl
+tk_entryDelLine entry.tcl
+tk_entryDelPress entry.tcl
+tk_listboxSingleSelect listbox.tcl
+tk_menus menu.tcl
+tk_bindForTraversal menu.tcl
+tk_mbPost menu.tcl
+tk_mbUnpost menu.tcl
+tk_traverseToMenu menu.tcl
+tk_traverseWithinMenu menu.tcl
+tk_getMenuButtons menu.tcl
+tk_nextMenu menu.tcl
+tk_nextMenuEntry menu.tcl
+tk_invokeMenu menu.tcl
+tk_firstMenu menu.tcl
+tk_mbButtonDown menu.tcl
+tk_mbButtonUp menu.tcl
+tk_mbButtonEnter menu.tcl
+tk_mbButtonLeave menu.tcl
+tk_mbButton1Enter menu.tcl
+tk_mbButton2Down menu.tcl
+tk_mbButton2Motion menu.tcl
+tk_mbButton2Up menu.tcl
+tk_menuEnter menu.tcl
+tk_menuLeave menu.tcl
+tk_menuMotion menu.tcl
+tk_menuUp menu.tcl
+tk_menu2Down menu.tcl
+tk_menu2Motion menu.tcl
+tk_textSelectTo text.tcl
+tk_textBackspace text.tcl
+tk_textIndexCloser text.tcl
+tk_textResetAnchor text.tcl
+tk_textDown text.tcl
+tk_textDoubleDown text.tcl
+tk_textTripleDown text.tcl
+tk_textAdjustTo text.tcl
+tk_textKeyPress text.tcl
+tk_textReturnPress text.tcl
+tk_textDelPress text.tcl
+tk_textCutPress text.tcl
+tk_textCopyPress text.tcl
+tkerror tkerror.tcl
diff --git a/res/tclinit.tcl b/res/tclinit.tcl
new file mode 100644 (file)
index 0000000..b470ee8
--- /dev/null
@@ -0,0 +1,104 @@
+#-----------------------------------------------------------------------------
+# TclInit.tcl -- Extended Tcl initialization.
+#-----------------------------------------------------------------------------
+# $Id: TclInit.tcl,v 2.0 1992/10/16 04:51:37 markd Rel $
+#-----------------------------------------------------------------------------
+
+global env TCLENV
+set TCLENV(inUnknown) 0
+
+#
+# Unknown command trap handler.
+#
+proc unknown {cmdName args} {
+    global TCLENV
+    if $TCLENV(inUnknown) {
+        error "recursive unknown command trap: \"$cmdName\""}
+    set TCLENV(inUnknown) 1
+    
+    set stat [catch {demand_load $cmdName} ret]
+    if {$stat == 0 && $ret} {
+        set TCLENV(inUnknown) 0
+        return [uplevel 1 [list eval $cmdName $args]]
+    }
+
+    if {$stat != 0} {
+        global errorInfo errorCode
+        set TCLENV(inUnknown) 0
+        error $ret $errorInfo $errorCode
+    }
+
+    global env interactiveSession noAutoExec
+
+    if {$interactiveSession && ([info level] == 1) && ([info script] == "") &&
+            (!([info exists noAutoExec] && [set noAutoExec]))} {
+        if {[file rootname $cmdName] == "$cmdName"} {
+            if [info exists env(PATH)] {
+                set binpath [searchpath [split $env(PATH) :] $cmdName]
+            } else {
+                set binpath [searchpath "." $cmdName]
+            }
+        } else {
+            set binpath $cmdName
+        }
+        if {[file executable $binpath]} {
+            set TCLENV(inUnknown) 0
+            uplevel 1 [list system [concat $cmdName $args]]
+            return
+        }
+    }
+    set TCLENV(inUnknown) 0
+    error "invalid command name: \"$cmdName\""
+}
+
+#
+# Search a path list for a file. (catch is for bad ~user)
+#
+proc searchpath {pathlist file} {
+    foreach dir $pathlist {
+        if {$dir == ""} {set dir .}
+        if {[catch {file exists $dir/$file} result] == 0 && $result}  {
+            return $dir/$file
+        }
+    }
+    return {}
+}
+
+#
+# Define a proc to be available for demand_load.
+#
+proc autoload {filenam args} {
+    global TCLENV
+    foreach i $args {
+        set TCLENV(PROC:$i) [list F $filenam]
+    }
+}
+
+#
+# Search TCLPATH for a file to source.
+#
+proc load {name} {
+    global TCLPATH errorCode
+    if {[string first / $name] >= 0} {
+        return  [uplevel #0 source $name]
+    }
+    set where [searchpath $TCLPATH $name]
+    if [lempty $where] {
+        error "couldn't find $name in Tcl search path" "" "TCLSH FILE_NOT_FOUND"
+    }
+    uplevel #0 source $where
+}
+
+autoload buildidx.tcl buildpackageindex
+
+# == Put any code you want all Tcl programs to include here. ==
+
+if !$interactiveSession return
+
+# == Interactive Tcl session initialization ==
+
+set TCLENV(topLevelPromptHook) {global programName; concat "$programName>" }
+set TCLENV(downLevelPromptHook) {concat "=>"}
+
+if [file readable ~/.tclrc] {source ~/.tclrc}
+
diff --git a/res/text.tcl b/res/text.tcl
new file mode 100644 (file)
index 0000000..20c1dd6
--- /dev/null
@@ -0,0 +1,184 @@
+# text.tcl --
+#
+# This file contains Tcl procedures used to manage Tk entries.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/text.tcl,v 1.2 92/07/16 16:26:33 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# $tk_priv(selectMode@$w) holds one of "char", "word", or "line" to
+# indicate which selection mode is active.
+
+# The procedure below is invoked when dragging one end of the selection.
+# The arguments are the text window name and the index of the character
+# that is to be the new end of the selection.
+
+proc tk_textSelectTo {w x {y ""}} {
+    global tk_priv
+    if {$y != ""} {
+      set index @$x,$y
+    } else {
+      set index $x
+    }
+
+    if {![info exists tk_priv(selectMode@$w)]} {
+      set tk_priv(selectMode@$w) "char"
+    }
+    case $tk_priv(selectMode@$w) {
+       char {
+           if [$w compare $index < anchor] {
+               set first $index
+               set last anchor
+           } else {
+               set first anchor
+               set last [$w index $index+1c]
+           }
+       }
+       word {
+           if [$w compare $index < anchor] {
+               set first [$w index "$index wordstart"]
+               set last [$w index "anchor wordend"]
+           } else {
+               set first [$w index "anchor wordstart"]
+               set last [$w index "$index wordend"]
+           }
+       }
+       line {
+           if [$w compare $index < anchor] {
+               set first [$w index "$index linestart"]
+               set last [$w index "anchor lineend + 1c"]
+           } else {
+               set first [$w index "anchor linestart"]
+               set last [$w index "$index lineend + 1c"]
+           }
+       }
+    }
+    $w tag remove sel 0.0 $first
+    $w tag add sel $first $last
+    $w tag remove sel $last end
+}
+
+# The procedure below is invoked to backspace over one character in
+# a text widget.  The name of the widget is passed as argument.
+
+proc tk_textBackspace w {
+    catch {$w delete insert-1c insert}
+}
+
+# The procedure below compares three indices, a, b, and c.  Index b must
+# be less than c.  The procedure returns 1 if a is closer to b than to c,
+# and 0 otherwise.  The "w" argument is the name of the text widget in
+# which to do the comparison.
+
+proc tk_textIndexCloser {w a b c} {
+    set a [$w index $a]
+    set b [$w index $b]
+    set c [$w index $c]
+    if [$w compare $a <= $b] {
+       return 1
+    }
+    if [$w compare $a >= $c] {
+       return 0
+    }
+    scan $a "%d.%d" lineA chA
+    scan $b "%d.%d" lineB chB
+    scan $c "%d.%d" lineC chC
+    if {$chC == 0} {
+       incr lineC -1
+       set chC [string length [$w get $lineC.0 $lineC.end]]
+    }
+    if {$lineB != $lineC} {
+       return [expr {($lineA-$lineB) < ($lineC-$lineA)}]
+    }
+    return [expr {($chA-$chB) < ($chC-$chA)}]
+}
+
+# The procedure below is called to reset the selection anchor to
+# whichever end is FARTHEST from the index argument.
+
+proc tk_textResetAnchor {w x y} {
+    global tk_priv
+    set index @$x,$y
+    if {[$w tag ranges sel] == ""} {
+       set tk_priv(selectMode@$w) char
+       $w mark set anchor $index
+       return
+    }
+    if [tk_textIndexCloser $w $index sel.first sel.last] {
+       if {![info exists tk_priv(selectMode@$w)]} {
+         set tk_priv(selectMode@$w) "char"
+       }
+       if {$tk_priv(selectMode@$w) == "char"} {
+           $w mark set anchor sel.last
+       } else {
+           $w mark set anchor sel.last-1c
+       }
+    } else {
+       $w mark set anchor sel.first
+    }
+}
+
+proc tk_textDown {w x y} {
+    global tk_priv
+    set tk_priv(selectMode@$w) char
+    $w mark set insert @$x,$y
+    $w mark set anchor insert
+    if {[lindex [$w config -state] 4] == "normal"} {focus $w}
+}
+
+proc tk_textDoubleDown {w x y} {
+    global tk_priv
+    set tk_priv(selectMode@$w) word
+    $w mark set insert "@$x,$y wordstart"
+    tk_textSelectTo $w insert
+}
+
+proc tk_textTripleDown {w x y} {
+    global tk_priv
+    set tk_priv(selectMode@$w) line
+    $w mark set insert "@$x,$y linestart"
+    tk_textSelectTo $w insert
+}
+
+proc tk_textAdjustTo {w x y} {
+    tk_textResetAnchor $w $x $y
+    tk_textSelectTo $w $x $y
+}
+
+proc tk_textKeyPress {w a} {
+    if {"$a" != ""} {
+       $w insert insert $a
+       $w yview -pickplace insert
+    }
+}
+
+proc tk_textReturnPress {w} {
+    $w insert insert \n
+    $w yview -pickplace insert
+}
+
+proc tk_textDelPress {w} {
+  tk_textBackspace $w
+  $w yview -pickplace insert
+}
+
+proc tk_textCutPress {w} {
+  catch {$w delete sel.first sel.last}
+}
+
+proc tk_textCopyPress {w} {
+    set sel ""
+    catch {set sel [selection -window $w get]}
+    $w insert $sel
+    $w yview -pickplace insert
+}
+
+
diff --git a/res/tk.tcl b/res/tk.tcl
new file mode 100644 (file)
index 0000000..3f1c8ac
--- /dev/null
@@ -0,0 +1,168 @@
+# tk.tcl --
+#
+# Initialization script normally executed in the interpreter for each
+# Tk-based application.  Arranges class bindings for widgets.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/tk.tcl,v 1.19 92/08/08 14:50:08 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+
+# Insist on running with a compatible version of Tcl.
+
+if "[info tclversion] != {6.4}" {
+    error "wrong version of Tcl loaded ([info tclversion]): need 6.4"
+}
+
+# Initialize the auto-load path to include Tk's directory as well as
+# Tcl's directory:
+
+set auto_path "$tk_library [info library]"
+
+# ----------------------------------------------------------------------
+# Class bindings for various flavors of button widgets.  
+# ----------------------------------------------------------------------
+
+bind Button <Any-Enter> {tk_butEnter %W}
+bind Button <Any-Leave> {tk_butLeave %W}
+bind Button <1> {tk_butDown %W}
+bind Button <ButtonRelease-1> {tk_butUp %W}
+bind Button <2> {tk_butDown %W}
+bind Button <ButtonRelease-2> {tk_butUp %W}
+bind Button <3> {tk_butDown %W}
+bind Button <ButtonRelease-3> {tk_butUp %W}
+
+bind CheckButton <Any-Enter> {tk_butEnter %W}
+bind CheckButton <Any-Leave> {tk_butLeave %W}
+bind CheckButton <1> {tk_butDown %W}
+bind CheckButton <ButtonRelease-1> {tk_butUp %W}
+bind CheckButton <2> {tk_butDown %W}
+bind CheckButton <ButtonRelease-2> {tk_butUp %W}
+bind CheckButton <3> {tk_butDown %W}
+bind CheckButton <ButtonRelease-3> {tk_butUp %W}
+
+bind RadioButton <Any-Enter> {tk_butEnter %W}
+bind RadioButton <Any-Leave> {tk_butLeave %W}
+bind RadioButton <1> {tk_butDown %W}
+bind RadioButton <ButtonRelease-1> {tk_butUp %W}
+bind RadioButton <2> {tk_butDown %W}
+bind RadioButton <ButtonRelease-2> {tk_butUp %W}
+bind RadioButton <3> {tk_butDown %W}
+bind RadioButton <ButtonRelease-3> {tk_butUp %W}
+
+# ----------------------------------------------------------------------
+# Class bindings for entry widgets.
+# ----------------------------------------------------------------------
+
+bind Entry <1> {
+    %W cursor @%x
+    %W select from @%x
+    if {[lindex [%W config -state] 4] == "normal"} {focus %W}
+}
+bind Entry <B1-Motion> {%W select to @%x}
+bind Entry <Shift-1> {%W select adjust @%x}
+bind Entry <Shift-B1-Motion> {%W select to @%x}
+bind Entry <2> {%W scan mark %x}
+bind Entry <B2-Motion> {%W scan dragto %x}
+bind Entry <Any-KeyPress> {
+    tk_entryCutPress %W
+    if {"%A" != ""} {
+       %W insert cursor %A
+       tk_entrySeeCaret %W
+    }
+}
+bind Entry <Delete> {tk_entryDelPress %W}
+bind Entry <BackSpace> {tk_entryDelPress %W}
+bind Entry <Control-h> {tk_entryDelPress %W}
+bind Entry <Control-d> {tk_entryCutPress %W}
+bind Entry <Control-u> {tk_entryDelLine %W}
+bind Entry <Control-x> {tk_entryCutPress %W}
+bind Entry <Control-y> {tk_entryCopyPress %W}
+bind Entry <Control-v> {tk_entryCopyPress %W}
+bind Entry <Control-w> {tk_entryBackword %W; tk_entrySeeCaret %W}
+tk_bindForTraversal Entry
+
+# ----------------------------------------------------------------------
+# Class bindings for listbox widgets.
+# ----------------------------------------------------------------------
+
+bind Listbox <1> {%W select from [%W nearest %y]}
+bind Listbox <B1-Motion> {%W select to [%W nearest %y]}
+bind Listbox <Shift-1> {%W select adjust [%W nearest %y]}
+bind Listbox <Shift-B1-Motion> {%W select to [%W nearest %y]}
+bind Listbox <2> {%W scan mark %x %y}
+bind Listbox <B2-Motion> {%W scan dragto %x %y}
+bind Listbox <3> {%W select from [%W nearest %y]}
+bind Listbox <B3-Motion> {%W select to [%W nearest %y]}
+bind Listbox <Shift-3> {%W select adjust [%W nearest %y]}
+bind Listbox <Shift-B3-Motion> {%W select to [%W nearest %y]}
+
+# ----------------------------------------------------------------------
+# Class bindings for scrollbar widgets.  
+# ----------------------------------------------------------------------
+
+# ----------------------------------------------------------------------
+# Class bindings for scale widgets.  
+# ----------------------------------------------------------------------
+
+# ----------------------------------------------------------------------
+# Class bindings for menubutton widgets.  
+# ----------------------------------------------------------------------
+
+bind Menubutton <Enter>                        {tk_mbButtonEnter %W %m}
+bind Menubutton <Any-Leave>            {tk_mbButtonLeave %W}
+bind Menubutton <1>                    {tk_mbButtonDown %W %X %Y}
+bind Menubutton <Any-ButtonRelease-1>  {tk_mbButtonUp %W %X %Y}
+bind Menubutton <B1-Enter>             {tk_mbButton1Enter %W %m}
+bind Menubutton <2>                    {tk_mbButtonDown %W %X %Y}
+bind Menubutton <ButtonRelease-2>      {tk_mbButtonUp %W %X %Y}
+bind Menubutton <3>                    {tk_mbButtonDown %W %X %Y}
+bind Menubutton <ButtonRelease-3>      {tk_mbButtonUp %W %X %Y}
+
+# ----------------------------------------------------------------------
+# Class bindings for menu widgets.
+# ----------------------------------------------------------------------
+
+bind Menu <Any-Enter> {tk_menuEnter %W %y}
+bind Menu <Any-Leave> {tk_menuLeave %W}
+bind Menu <Any-Motion> {tk_menuMotion %W %y}
+bind Menu <ButtonRelease-1> {tk_menuUp %W %y}
+bind Menu <ButtonRelease-2> {tk_menuUp %W %y}
+bind Menu <ButtonRelease-3> {tk_menuUp %W %y}
+
+bind Menu <Escape> {tk_mbUnpost %W}
+bind Menu <Any-KeyPress> {tk_traverseWithinMenu %W %A}
+bind Menu <Left> {tk_nextMenu %W -1}
+bind Menu <Right> {tk_nextMenu %W 1}
+bind Menu <Up> {tk_nextMenuEntry %W -1}
+bind Menu <Down> {tk_nextMenuEntry %W 1}
+bind Menu <Return> {tk_invokeMenu %W}
+
+# ----------------------------------------------------------------------
+# Class bindings for text widgets. 
+# ----------------------------------------------------------------------
+
+#bind Text <1> {tk_textDown %W %x %y}
+#bind Text <Double-1> {tk_textDoubleDown %W %x %y}
+#bind Text <Triple-1> {tk_textTripleDown %W %x %y}
+#bind Text <B1-Motion> {tk_textSelectTo %W %x %y}
+#bind Text <Shift-1> {tk_textAdjustTo %W %x %y}
+#bind Text <Shift-B1-Motion> {tk_textSelectTo %W %x %y}
+bind Text <2> {%W scan mark %y}
+bind Text <B2-Motion> {%W scan dragto %y}
+bind Text <Any-KeyPress> {tk_textKeyPress %W %A}
+bind Text <Return> {tk_textReturnPress %W}
+bind Text <BackSpace> {tk_textDelPress %W}
+bind Text <Delete> {tk_textDelPress %W}
+bind Text <Control-h> {tk_textDelPress %W}
+bind Text <Control-d> {tk_textCutPress %W}
+bind Text <Control-v> {tk_textCopyPress %W}
+tk_bindForTraversal Text
+
+# Initialize the elements of tk_priv that require initialization.
diff --git a/res/tk.tdx b/res/tk.tdx
new file mode 100644 (file)
index 0000000..9273ac6
--- /dev/null
@@ -0,0 +1,6 @@
+button.tcl 66 2232 tk_butEnter tk_butLeave tk_butDown tk_butUp
+listbox.tcl 2345 1170 tk_listboxSingleSelect
+tkerror.tcl 3547 174 tkerror
+text.tcl 3813 3124 tk_textSelectTo tk_textBackspace tk_textIndexCloser tk_textResetAnchor
+menu.tcl 7123 8987 tk_menus tk_bindForTraversal tk_mbPost tk_mbUnpost tk_traverseToMenu tk_traverseWithinMenu tk_getMenuButtons tk_nextMenu tk_nextMenuEntry tk_invokeMenu tk_firstMenu
+entry.tcl 16184 1762 tk_entryBackspace tk_entryBackword tk_entrySeeCaret
diff --git a/res/tk.tlb b/res/tk.tlb
new file mode 100644 (file)
index 0000000..9fde00e
--- /dev/null
@@ -0,0 +1,588 @@
+#@package: button.tcl tk_butEnter tk_butLeave tk_butDown tk_butUp
+
+# button.tcl --
+#
+# This file contains Tcl procedures used to manage Tk buttons.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/button.tcl,v 1.7 92/07/28 15:41:13 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# The procedure below is invoked when the mouse pointer enters a
+# button widget.  It records the button we're in and changes the
+# state of the button to active unless the button is disabled.
+
+proc tk_butEnter w {
+    global tk_priv tk_strictMotif
+    if {[lindex [$w config -state] 4] != "disabled"} {
+       if {!$tk_strictMotif} {
+           $w config -state active
+       }
+       set tk_priv(window) $w
+    }
+}
+
+# The procedure below is invoked when the mouse pointer leaves a
+# button widget.  It changes the state of the button back to
+# inactive.
+
+proc tk_butLeave w {
+    global tk_priv tk_strictMotif
+    if {[lindex [$w config -state] 4] != "disabled"} {
+       if {!$tk_strictMotif} {
+           $w config -state normal
+       }
+    }
+    set tk_priv(window) ""
+}
+
+# The procedure below is invoked when the mouse button is pressed in
+# a button/radiobutton/checkbutton widget.  It records information
+# (a) to indicate that the mouse is in the button, and
+# (b) to save the button's relief so it can be restored later.
+
+proc tk_butDown w {
+    global tk_priv
+    set tk_priv(relief) [lindex [$w config -relief] 4]
+    if {[lindex [$w config -state] 4] != "disabled"} {
+       $w config -relief sunken
+    }
+}
+
+# The procedure below is invoked when the mouse button is released
+# for a button/radiobutton/checkbutton widget.  It restores the
+# button's relief and invokes the command as long as the mouse
+# hasn't left the button.
+
+proc tk_butUp w {
+    global tk_priv
+    $w config -relief $tk_priv(relief)
+    if {($w == $tk_priv(window))
+           && ([lindex [$w config -state] 4] != "disabled")} {
+       uplevel #0 [list $w invoke]
+    }
+}
+#@package: listbox.tcl tk_listboxSingleSelect
+
+# listbox.tcl --
+#
+# This file contains Tcl procedures used to manage Tk listboxes.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/listbox.tcl,v 1.2 92/06/03 15:21:28 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# The procedure below may be invoked to change the behavior of
+# listboxes so that only a single item may be selected at once.
+# The arguments give one or more windows whose behavior should
+# be changed;  if one of the arguments is "Listbox" then the default
+# behavior is changed for all listboxes.
+
+proc tk_listboxSingleSelect args {
+    foreach w $args {
+       bind $w <B1-Motion> {%W select from [%W nearest %y]} 
+       bind $w <Shift-1> {%W select from [%W nearest %y]}
+       bind $w <Shift-B1-Motion> {%W select from [%W nearest %y]}
+    }
+}
+#@package: tkerror.tcl tkerror
+
+# This file contains a default version of the tkError procedure.  It
+# just prints out a stack trace.
+
+proc tkerror err {
+    global errorInfo
+    puts stdout "$errorInfo"
+}
+#@package: text.tcl tk_textSelectTo tk_textBackspace tk_textIndexCloser tk_textResetAnchor
+
+# text.tcl --
+#
+# This file contains Tcl procedures used to manage Tk entries.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/text.tcl,v 1.2 92/07/16 16:26:33 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# The procedure below is invoked when dragging one end of the selection.
+# The arguments are the text window name and the index of the character
+# that is to be the new end of the selection.
+
+proc tk_textSelectTo {w index} {
+    global tk_priv
+
+    case $tk_priv(selectMode) {
+       char {
+           if [$w compare $index < anchor] {
+               set first $index
+               set last anchor
+           } else {
+               set first anchor
+               set last [$w index $index+1c]
+           }
+       }
+       word {
+           if [$w compare $index < anchor] {
+               set first [$w index "$index wordstart"]
+               set last [$w index "anchor wordend"]
+           } else {
+               set first [$w index "anchor wordstart"]
+               set last [$w index "$index wordend"]
+           }
+       }
+       line {
+           if [$w compare $index < anchor] {
+               set first [$w index "$index linestart"]
+               set last [$w index "anchor lineend + 1c"]
+           } else {
+               set first [$w index "anchor linestart"]
+               set last [$w index "$index lineend + 1c"]
+           }
+       }
+    }
+    $w tag remove sel 0.0 $first
+    $w tag add sel $first $last
+    $w tag remove sel $last end
+}
+
+# The procedure below is invoked to backspace over one character in
+# a text widget.  The name of the widget is passed as argument.
+
+proc tk_textBackspace w {
+    $w delete insert-1c insert
+}
+
+# The procedure below compares three indices, a, b, and c.  Index b must
+# be less than c.  The procedure returns 1 if a is closer to b than to c,
+# and 0 otherwise.  The "w" argument is the name of the text widget in
+# which to do the comparison.
+
+proc tk_textIndexCloser {w a b c} {
+    set a [$w index $a]
+    set b [$w index $b]
+    set c [$w index $c]
+    if [$w compare $a <= $b] {
+       return 1
+    }
+    if [$w compare $a >= $c] {
+       return 0
+    }
+    scan $a "%d.%d" lineA chA
+    scan $b "%d.%d" lineB chB
+    scan $c "%d.%d" lineC chC
+    if {$chC == 0} {
+       incr lineC -1
+       set chC [string length [$w get $lineC.0 $lineC.end]]
+    }
+    if {$lineB != $lineC} {
+       return [expr {($lineA-$lineB) < ($lineC-$lineA)}]
+    }
+    return [expr {($chA-$chB) < ($chC-$chA)}]
+}
+
+# The procedure below is called to reset the selection anchor to
+# whichever end is FARTHEST from the index argument.
+
+proc tk_textResetAnchor {w index} {
+    global tk_priv
+    if {[$w tag ranges sel] == ""} {
+       set tk_priv(selectMode) char
+       $w mark set anchor $index
+       return
+    }
+    if [tk_textIndexCloser $w $index sel.first sel.last] {
+       if {$tk_priv(selectMode) == "char"} {
+           $w mark set anchor sel.last
+       } else {
+           $w mark set anchor sel.last-1c
+       }
+    } else {
+       $w mark set anchor sel.first
+    }
+}
+#@package: menu.tcl tk_menus tk_bindForTraversal tk_mbPost tk_mbUnpost tk_traverseToMenu tk_traverseWithinMenu tk_getMenuButtons tk_nextMenu tk_nextMenuEntry tk_invokeMenu tk_firstMenu
+
+# menu.tcl --
+#
+# This file contains Tcl procedures used to manage Tk menus and
+# menubuttons.  Most of the code here is dedicated to support for
+# menu traversal via the keyboard.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/menu.tcl,v 1.11 92/08/08 14:49:55 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# The procedure below is publically available.  It is used to indicate
+# the menus associated with a particular top-level window, for purposes
+# of keyboard menu traversal.  Its first argument is the path name of
+# a top-level window, and any additional arguments are the path names of
+# the menu buttons associated with that top-level window, in the order
+# they should be traversed.  If no menu buttons are named, the procedure
+# returns the current list of menus for w.  If a single empty string is
+# supplied, then the menu list for w is cancelled.  Otherwise, tk_menus
+# sets the menu list for w to the menu buttons.
+
+proc tk_menus {w args} {
+    global tk_priv
+
+    if {$args == ""} {
+       if [catch {set result [set tk_priv(menusFor$w)]}] {
+           return ""
+       }
+       return $result
+    }
+
+    if {$args == "{}"} {
+       catch {unset tk_priv(menusFor$w)}
+       return ""
+    }
+
+    set tk_priv(menusFor$w) $args
+}
+
+# The procedure below is publically available.  It takes any number of
+# arguments taht are names of widgets or classes.  It sets up bindings
+# for the widgets or classes so that keyboard menu traversal is possible
+# when the input focus is in those widgets or classes.
+
+proc tk_bindForTraversal args {
+    foreach w $args {
+       bind $w <Alt-KeyPress> {tk_traverseToMenu %W %A}
+       bind $w <F10> {tk_firstMenu %W}
+    }
+}
+
+# The procedure below does all of the work of posting a menu (including
+# unposting any other menu that might currently be posted).  The "w"
+# argument is the name of the menubutton for the menu to be posted.
+# Note:  if $w is disabled then the procedure does nothing.
+
+proc tk_mbPost {w} {
+    global tk_priv tk_strictMotif
+    if {[lindex [$w config -state] 4] == "disabled"} {
+       return
+    }
+    set cur $tk_priv(posted)
+    if {$cur == $w} {
+       return
+    }
+    if {$cur != ""} tk_mbUnpost
+    set tk_priv(relief) [lindex [$w config -relief] 4]
+    $w config -relief raised
+    set tk_priv(cursor) [lindex [$w config -cursor] 4]
+    $w config -cursor arrow
+    $w post
+    grab -global $w
+    set tk_priv(posted) $w
+    if {$tk_priv(focus) == ""} {
+       set tk_priv(focus) [focus]
+    }
+    set menu [lindex [$w config -menu] 4]
+    set tk_priv(activeBg) [lindex [$menu config -activebackground] 4]
+    set tk_priv(activeFg) [lindex [$menu config -activeforeground] 4]
+    if $tk_strictMotif {
+       $menu config -activebackground [lindex [$menu config -background] 4]
+       $menu config -activeforeground [lindex [$menu config -foreground] 4]
+    }
+    focus $menu
+}
+
+# The procedure below does all the work of unposting the menubutton that's
+# currently posted.  It takes no arguments.
+
+proc tk_mbUnpost {} {
+    global tk_priv
+    if {$tk_priv(posted) != ""} {
+       $tk_priv(posted) config -relief $tk_priv(relief)
+       $tk_priv(posted) config -cursor $tk_priv(cursor)
+       $tk_priv(posted) config -activebackground $tk_priv(activeBg)
+       $tk_priv(posted) config -activeforeground $tk_priv(activeFg)
+       $tk_priv(posted) unpost
+       grab none
+       focus $tk_priv(focus)
+       set tk_priv(focus) ""
+       set menu [lindex [$tk_priv(posted) config -menu] 4]
+       $menu config -activebackground $tk_priv(activeBg)
+       $menu config -activeforeground $tk_priv(activeFg)
+       set tk_priv(posted) {}
+    }
+}
+
+# The procedure below is invoked to implement keyboard traversal to
+# a menu button.  It takes two arguments:  the name of a window where
+# a keystroke originated, and the ascii character that was typed.
+# This procedure finds a menu bar by looking upward for a top-level
+# window, then looking for a window underneath that named "menu".
+# Then it searches through all the subwindows of "menu" for a menubutton
+# with an underlined character matching char.  If one is found, it
+# posts that menu.
+
+proc tk_traverseToMenu {w char} {
+    global tk_priv
+    if {$char == ""} {
+       return
+    }
+    set char [string tolower $char]
+
+    foreach mb [tk_getMenuButtons $w] {
+       if {[winfo class $mb] == "Menubutton"} {
+           set char2 [string index [lindex [$mb config -text] 4] \
+                   [lindex [$mb config -underline] 4]]
+           if {[string compare $char [string tolower $char2]] == 0} {
+               tk_mbPost $mb
+               [lindex [$mb config -menu] 4] activate 0
+               return
+           }
+       }
+    }
+}
+
+# The procedure below is used to implement keyboard traversal within
+# the posted menu.  It takes two arguments:  the name of the menu to
+# be traversed within, and an ASCII character.  It searches for an
+# entry in the menu that has that character underlined.  If such an
+# entry is found, it is invoked and the menu is unposted.
+
+proc tk_traverseWithinMenu {w char} {
+    if {$char == ""} {
+       return
+    }
+    set char [string tolower $char]
+    set last [$w index last]
+    for {set i 0} {$i <= $last} {incr i} {
+       if [catch {set char2 [string index \
+               [lindex [$w entryconfig $i -label] 4] \
+               [lindex [$w entryconfig $i -underline] 4]]}] {
+           continue
+       }
+       if {[string compare $char [string tolower $char2]] == 0} {
+           tk_mbUnpost
+           $w invoke $i
+           return
+       }
+    }
+}
+
+# The procedure below takes a single argument, which is the name of
+# a window.  It returns a list containing path names for all of the
+# menu buttons associated with that window's top-level window, or an
+# empty list if there are none.
+
+proc tk_getMenuButtons w {
+    global tk_priv
+    set top [winfo toplevel $w]
+    if [catch {set buttons [set tk_priv(menusFor$top)]}] {
+       return ""
+    }
+    return $buttons
+}
+
+# The procedure below is used to traverse to the next or previous
+# menu in a menu bar.  It takes one argument, which is a count of
+# how many menu buttons forward or backward (if negative) to move.
+# If there is no posted menu then this procedure has no effect.
+
+proc tk_nextMenu count {
+    global tk_priv
+    if {$tk_priv(posted) == ""} {
+       return
+    }
+    set buttons [tk_getMenuButtons $tk_priv(posted)]
+    set length [llength $buttons]
+    for {set i 0} 1 {incr i} {
+       if {$i >= $length} {
+           return
+       }
+       if {[lindex $buttons $i] == $tk_priv(posted)} {
+           break
+       }
+    }
+    incr i $count
+    while 1 {
+       while {$i < 0} {
+           incr i $length
+       }
+       while {$i >= $length} {
+           incr i -$length
+       }
+       set mb [lindex $buttons $i]
+       if {[lindex [$mb configure -state] 4] != "disabled"} {
+           break
+       }
+       incr i $count
+    }
+    tk_mbUnpost
+    tk_mbPost $mb
+    [lindex [$mb config -menu] 4] activate 0
+}
+
+# The procedure below is used to traverse to the next or previous entry
+# in the posted menu.  It takes one argument, which is 1 to go to the
+# next entry or -1 to go to the previous entry.  Disabled entries are
+# skipped in this process.
+
+proc tk_nextMenuEntry count {
+    global tk_priv
+    if {$tk_priv(posted) == ""} {
+       return
+    }
+    set menu [lindex [$tk_priv(posted) config -menu] 4]
+    set length [expr [$menu index last]+1]
+    set i [$menu index active]
+    if {$i == "none"} {
+       set i 0
+    } else {
+       incr i $count
+    }
+    while 1 {
+       while {$i < 0} {
+           incr i $length
+       }
+       while {$i >= $length} {
+           incr i -$length
+       }
+       if {[catch {$menu entryconfigure $i -state} state] == 0} {
+           if {[lindex $state 4] != "disabled"} {
+               break
+           }
+       }
+       incr i $count
+    }
+    $menu activate $i
+}
+
+# The procedure below invokes the active entry in the posted menu,
+# if there is one.  Otherwise it does nothing.
+
+proc tk_invokeMenu {menu} {
+    set i [$menu index active]
+    if {$i != "none"} {
+       tk_mbUnpost
+       update idletasks
+       $menu invoke $i
+    }
+}
+
+# The procedure below is invoked to keyboard-traverse to the first
+# menu for a given source window.  The source window is passed as
+# parameter.
+
+proc tk_firstMenu w {
+    set mb [lindex [tk_getMenuButtons $w] 0]
+    if {$mb != ""} {
+       tk_mbPost $mb
+       [lindex [$mb config -menu] 4] activate 0
+    }
+}
+
+# The procedure below is invoked when a button-1-down event is
+# received by a menu button.  If the mouse is in the menu button
+# then it posts the button's menu.  If the mouse isn't in the
+# button's menu, then it deactivates any active entry in the menu.
+# Remember, event-sharing can cause this procedure to be invoked
+# for two different menu buttons on the same event.
+
+proc tk_mbButtonDown w {
+    global tk_priv
+    if {[lindex [$w config -state] 4] == "disabled"} {
+       return
+    } 
+    if {$tk_priv(inMenuButton) == $w} {
+       tk_mbPost $w
+    }
+    set menu [lindex [$tk_priv(posted) config -menu] 4]
+    if {$tk_priv(window) != $menu} {
+       $menu activate none
+    }
+}
+#@package: entry.tcl tk_entryBackspace tk_entryBackword tk_entrySeeCaret
+
+# entry.tcl --
+#
+# This file contains Tcl procedures used to manage Tk entries.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/entry.tcl,v 1.2 92/05/23 16:40:57 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# The procedure below is invoked to backspace over one character
+# in an entry widget.  The name of the widget is passed as argument.
+
+proc tk_entryBackspace w {
+    set x [expr {[$w index cursor] - 1}]
+    if {$x != -1} {$w delete $x}
+}
+
+# The procedure below is invoked to backspace over one word in an
+# entry widget.  The name of the widget is passed as argument.
+
+proc tk_entryBackword w {
+    set string [$w get]
+    set curs [expr [$w index cursor]-1]
+    if {$curs < 0} return
+    for {set x $curs} {$x > 0} {incr x -1} {
+       if {([string first [string index $string $x] " \t"] < 0)
+               && ([string first [string index $string [expr $x-1]] " \t"]
+               >= 0)} {
+           break
+       }
+    }
+    $w delete $x $curs
+}
+
+# The procedure below is invoked after insertions.  If the caret is not
+# visible in the window then the procedure adjusts the entry's view to
+# bring the caret back into the window again.
+
+proc tk_entrySeeCaret w {
+    set c [$w index cursor]
+    set left [$w index @0]
+    if {$left > $c} {
+       $w view $c
+       return
+    }
+    while {[$w index @[expr [winfo width $w]-5]] < $c} {
+       set left [expr $left+1]
+       $w view $left
+    }
+}
diff --git a/res/tkerror.tcl b/res/tkerror.tcl
new file mode 100644 (file)
index 0000000..34166db
--- /dev/null
@@ -0,0 +1,7 @@
+# This file contains a default version of the tkError procedure.  It
+# just prints out a stack trace.
+
+proc tkerror err {
+    global errorInfo
+    puts stdout "$errorInfo"
+}
diff --git a/res/wask.tcl b/res/wask.tcl
new file mode 100644 (file)
index 0000000..68d1ead
--- /dev/null
@@ -0,0 +1,145 @@
+# Window: Query.  Ask the player something.  For Unix Micropolis
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+
+global AskWindows
+set n [Unique]
+set win .ask$n
+set AskWindows [linsert $AskWindows 0 $win]
+
+LinkWindow $head.ask $win
+LinkWindow $win.head $head
+
+catch "destroy $win"
+toplevel $win -screen $display
+
+SetHelp $win Ask
+
+wm title $win {Micropolis Query}
+wm iconname $win {Micropolis Query}
+wm geometry $win 350x200+5+5
+wm positionfrom $win user
+wm sizefrom $win user
+wm maxsize $win 700 700
+wm minsize $win 100 100
+wm protocol $win delete "DeleteWindow ask AskWindows"
+wm transient $win $head
+
+frame $win.top \
+  -relief raised \
+  -borderwidth 1
+LinkWindow $win.background $win.top
+
+label $win.top.title \
+  -borderwidth 2 \
+  -relief raised \
+  -font [Font $win Big]
+LinkWindow $win.title $win.top.title
+
+text $win.top.text \
+  -borderwidth 2 \
+  -relief flat \
+  -wrap word \
+  -state disabled \
+  -font [Font $win Big]
+LinkWindow $win.text $win.top.text
+
+frame $win.top.frame \
+  -borderwidth 2 \
+  -relief flat
+LinkWindow $win.frame $win.top.frame
+
+button $win.top.frame.left \
+  -font [Font $win Large]\
+  -borderwidth 1\
+  -padx 6 -pady 12
+LinkWindow $win.left $win.top.frame.left
+
+button $win.top.frame.middle \
+  -font [Font $win Large]\
+  -borderwidth 1\
+  -padx 6 -pady 12
+LinkWindow $win.middle $win.top.frame.middle
+
+frame $win.top.frame.rightframe \
+  -borderwidth 0 \
+  -relief raised
+LinkWindow $win.voteframe $win.top.frame.rightframe
+
+button $win.top.frame.rightframe.right \
+  -font [Font $win Large]\
+  -relief raised \
+  -borderwidth 1
+LinkWindow $win.vote $win.top.frame.rightframe.right
+
+pack append $win.top.frame.rightframe\
+  $win.top.frame.rightframe.right      {top frame center}
+
+BindVotingButton $win $win.top.frame.rightframe.right Ask
+
+pack append $win.top\
+  $win.top.title       {top frame center fillx} \
+  $win.top.text                {top frame center expand fill} \
+  $win.top.frame       {bottom frame center fillx}
+
+pack append $win\
+  $win.top             {left frame center expand fill}
+
+update idletasks
diff --git a/res/wbudget.tcl b/res/wbudget.tcl
new file mode 100644 (file)
index 0000000..e1d0fac
--- /dev/null
@@ -0,0 +1,423 @@
+# Window: Budget, for Unix Micropolis
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+global BudgetWindows
+set n [Unique]
+set win .budget$n
+set BudgetWindows [linsert $BudgetWindows 0 $win]
+
+LinkWindow $head.budget $win
+LinkWindow $win.head $head
+
+catch "destroy $win"
+toplevel $win -screen $display
+
+SetHelp $win Budget
+
+global [set var $win.visible]
+set $var 0
+
+wm title $win {Micropolis Budget}
+wm iconname $win {Micropolis Budget}
+wm group $win $head
+wm geometry $win 600x600+5+5
+wm positionfrom $win user
+wm maxsize $win 700 700
+wm minsize $win 150 200
+wm protocol $win delete "BudgetCancel"
+wm transient $win $head
+
+label $win.label\
+  -borderwidth 1\
+  -relief raised\
+  -font [Font $win Large]\
+  -text {Micropolis has paused to set the budget...}
+
+SetHelp $win.label Budget.Label
+
+frame $win.rightframe\
+  -borderwidth 0
+
+frame $win.rightframe.roadframe\
+  -borderwidth 1\
+  -relief raised
+
+SetHelp $win.rightframe.roadframe Budget.Road
+
+label $win.rightframe.roadframe.label\
+  -relief flat\
+  -font [Font $win Large]\
+  -text {            Road Fund            }
+
+frame $win.rightframe.roadframe.frame\
+  -borderwidth 2\
+  -relief flat
+LinkWindow $win.road $win.rightframe.roadframe.frame
+
+label $win.rightframe.roadframe.frame.request\
+  -relief flat\
+  -font [Font $win Medium]\
+  -text {100% of $0 = $0}
+
+scale $win.rightframe.roadframe.frame.fund\
+  -command {BudgetSetRoadFund}\
+  -font [Font $win Medium]\
+  -orient horizontal\
+  -showvalue false\
+  -sliderlength 15\
+  -to 100\
+  -width 10
+
+pack append $win.rightframe.roadframe.frame\
+  $win.rightframe.roadframe.frame.fund      {top frame center expand fill} \
+  $win.rightframe.roadframe.frame.request   {top frame center expand fill}
+
+pack append $win.rightframe.roadframe\
+  $win.rightframe.roadframe.label     {top frame center fillx} \
+  $win.rightframe.roadframe.frame     {top frame center expand fill}
+
+
+frame $win.rightframe.fireframe\
+  -borderwidth 1\
+  -relief raised
+
+SetHelp $win.rightframe.fireframe Budget.Fire
+
+label $win.rightframe.fireframe.label\
+  -font [Font $win Large]\
+  -relief flat\
+  -text {Fire Fund}
+
+frame $win.rightframe.fireframe.frame\
+  -borderwidth 2\
+  -relief flat
+LinkWindow $win.fire $win.rightframe.fireframe.frame
+
+label $win.rightframe.fireframe.frame.request\
+  -relief flat\
+  -font [Font $win Medium]\
+  -text {100% of $0 = $0}
+
+scale $win.rightframe.fireframe.frame.fund\
+  -command {BudgetSetFireFund}\
+  -font [Font $win Medium]\
+  -orient horizontal\
+  -showvalue false\
+  -sliderlength 15\
+  -to 100\
+  -width 10
+
+pack append $win.rightframe.fireframe.frame\
+  $win.rightframe.fireframe.frame.fund      {top frame center expand fill} \
+  $win.rightframe.fireframe.frame.request   {top frame center expand fill}
+
+pack append $win.rightframe.fireframe\
+  $win.rightframe.fireframe.label     {top frame center fillx} \
+  $win.rightframe.fireframe.frame     {top frame center expand fill}
+
+
+frame $win.rightframe.policeframe\
+  -borderwidth 1\
+  -relief raised
+
+SetHelp $win.rightframe.policeframe Budget.Police
+
+label $win.rightframe.policeframe.label\
+  -relief flat\
+  -font [Font $win Large]\
+  -text {Police Fund}
+
+frame $win.rightframe.policeframe.frame\
+  -borderwidth 2\
+  -relief flat
+LinkWindow $win.police $win.rightframe.policeframe.frame
+
+label $win.rightframe.policeframe.frame.request\
+  -relief flat\
+  -font [Font $win Medium]\
+  -text {100% of $0 = $0}
+
+scale $win.rightframe.policeframe.frame.fund\
+  -command {BudgetSetPoliceFund}\
+  -font [Font $win Medium]\
+  -orient horizontal\
+  -showvalue false\
+  -sliderlength 15\
+  -to 100\
+  -width 10
+
+pack append $win.rightframe.policeframe.frame\
+  $win.rightframe.policeframe.frame.fund      {top frame center expand fill}\
+  $win.rightframe.policeframe.frame.request   {top frame center expand fill}
+
+pack append $win.rightframe.policeframe\
+  $win.rightframe.policeframe.label     {top frame center fillx} \
+  $win.rightframe.policeframe.frame     {top frame center expand fill}
+
+
+frame $win.rightframe.taxrateframe\
+  -borderwidth 1\
+  -relief raised
+
+SetHelp $win.rightframe.taxrateframe Budget.Tax
+
+label $win.rightframe.taxrateframe.label\
+  -relief flat\
+  -font [Font $win Large]\
+  -text {Tax Rate}
+
+frame $win.rightframe.taxrateframe.frame\
+  -borderwidth 2\
+  -relief flat
+
+label $win.rightframe.taxrateframe.frame.rate\
+  -relief flat\
+  -font [Font $win Medium]\
+  -text {7%}
+LinkWindow $win.taxlabel $win.rightframe.taxrateframe.frame.rate
+
+scale $win.rightframe.taxrateframe.frame.scale\
+  -command {BudgetSetTaxRate}\
+  -font [Font $win Medium]\
+  -orient horizontal\
+  -showvalue false\
+  -sliderlength 15\
+  -to 20\
+  -width 10
+LinkWindow $win.taxrate $win.rightframe.taxrateframe.frame.scale
+
+pack append $win.rightframe.taxrateframe.frame\
+  $win.rightframe.taxrateframe.frame.scale    {top frame center expand fill}\
+  $win.rightframe.taxrateframe.frame.rate     {top frame center expand fill}
+
+pack append $win.rightframe.taxrateframe\
+  $win.rightframe.taxrateframe.label    {top frame center fillx} \
+  $win.rightframe.taxrateframe.frame    {top frame center expand fill}
+
+
+pack append $win.rightframe\
+  $win.rightframe.roadframe    {top frame center expand fill} \
+  $win.rightframe.fireframe    {top frame center expand fill} \
+  $win.rightframe.policeframe  {top frame center expand fill} \
+  $win.rightframe.taxrateframe {top frame center expand fill}
+
+
+frame $win.leftframe\
+  -borderwidth 0
+
+frame $win.leftframe.collectedframe\
+  -borderwidth 1\
+  -relief raised
+
+SetHelp $win.leftframe.collectedframe Budget.Collected
+
+label $win.leftframe.collectedframe.label\
+  -relief flat\
+  -font [Font $win Large]\
+  -text {Taxes Collected}
+
+label $win.leftframe.collectedframe.value\
+  -relief flat\
+  -font [Font $win Medium]\
+  -text {$0}
+LinkWindow $win.collected $win.leftframe.collectedframe.value
+
+pack append $win.leftframe.collectedframe\
+  $win.leftframe.collectedframe.label   {top frame center fillx} \
+  $win.leftframe.collectedframe.value   {top frame center expand fill} 
+
+frame $win.leftframe.cashflowframe\
+  -borderwidth 1\
+  -relief raised
+LinkWindow $win.cashflow $win.leftframe.cashflowframe.value
+
+SetHelp $win.leftframe.cashflowframe Budget.Flow
+
+label $win.leftframe.cashflowframe.label\
+  -relief flat\
+  -font [Font $win Large]\
+  -text {Cash Flow}
+
+label $win.leftframe.cashflowframe.value\
+  -relief flat\
+  -font [Font $win Medium]\
+  -text {+$0}
+
+pack append $win.leftframe.cashflowframe\
+  $win.leftframe.cashflowframe.label   {top frame center fillx} \
+  $win.leftframe.cashflowframe.value   {top frame center expand fill} 
+
+frame $win.leftframe.previousframe\
+  -borderwidth 1\
+  -relief raised
+LinkWindow $win.previous $win.leftframe.previousframe.value
+
+SetHelp $win.leftframe.previousframe Budget.Previous
+
+label $win.leftframe.previousframe.label\
+  -relief flat\
+  -font [Font $win Large]\
+  -text {Previous Funds}
+
+label $win.leftframe.previousframe.value\
+  -relief flat\
+  -font [Font $win Medium]\
+  -text {$0}
+
+pack append $win.leftframe.previousframe\
+  $win.leftframe.previousframe.label   {top frame center fillx} \
+  $win.leftframe.previousframe.value   {top frame center expand fill} 
+
+frame $win.leftframe.currentframe\
+  -borderwidth 1\
+  -relief raised
+LinkWindow $win.current $win.leftframe.currentframe.value
+
+SetHelp $win.leftframe.currentframe Budget.Current
+
+label $win.leftframe.currentframe.label\
+  -relief flat\
+  -font [Font $win Large]\
+  -text {Current Funds}
+
+label $win.leftframe.currentframe.value\
+  -relief flat\
+  -font [Font $win Medium]\
+  -text {$0}
+
+pack append $win.leftframe.currentframe\
+  $win.leftframe.currentframe.label   {top frame center fillx} \
+  $win.leftframe.currentframe.value   {top frame center expand fill} 
+
+pack append $win.leftframe\
+  $win.leftframe.collectedframe   {top frame center expand fill} \
+  $win.leftframe.cashflowframe    {top frame center expand fill} \
+  $win.leftframe.previousframe    {top frame center expand fill} \
+  $win.leftframe.currentframe     {top frame center expand fill}
+
+frame $win.bottomframe\
+  -borderwidth 0
+
+frame $win.bottomframe.voteframe \
+  -borderwidth 0 \
+  -relief raised
+LinkWindow $win.voteframe $win.bottomframe.voteframe
+
+button $win.bottomframe.voteframe.continue\
+  -text {Continue With These Figures}\
+  -font [Font $win Large]\
+  -relief raised \
+  -command "DoVote $win Budget BudgetContinue {}"
+LinkWindow $win.vote $win.bottomframe.voteframe.continue
+
+SetHelp $win.bottomframe.voteframe Budget.Continue
+
+pack append $win.bottomframe.voteframe\
+  $win.bottomframe.voteframe.continue  {top frame center fillx}
+
+BindVotingButton $win $win.bottomframe.voteframe.continue Budget
+
+button $win.bottomframe.reset\
+  -text {Reset to Original Figures}\
+  -font [Font $win Large]\
+  -command "BudgetReset"
+
+SetHelp $win.bottomframe.reset Budget.Reset
+
+button $win.bottomframe.cancel\
+  -text {Cancel Changes and Continue}\
+  -font [Font $win Large]\
+  -command "BudgetCancel"
+
+SetHelp $win.bottomframe.cancel Budget.Cancel
+
+button $win.bottomframe.timer\
+  -text {Timeout in 0 seconds ...}\
+  -font [Font $win Large]\
+  -command "ToggleBudgetTimer"
+LinkWindow $win.timer $win.bottomframe.timer
+
+SetHelp $win.bottomframe.timer Budget.AutoCancel
+
+button $win.bottomframe.autobudget\
+  -text {Enable Auto Budget}\
+  -font [Font $win Large]\
+  -command "ToggleAutoBudget"
+LinkWindow $win.autobudget $win.bottomframe.autobudget
+
+SetHelp $win.bottomframe.autobudget Budget.AutoBudget
+
+pack append $win.bottomframe\
+  $win.bottomframe.voteframe   {top frame center expand fillx}\
+  $win.bottomframe.reset       {top frame center expand fillx}\
+  $win.bottomframe.cancel      {top frame center expand fillx}\
+  $win.bottomframe.timer       {top frame center expand fillx}\
+  $win.bottomframe.autobudget  {top frame center expand fillx}
+
+pack append $win\
+  $win.label        {top frame center fillx} \
+  $win.bottomframe  {bottom frame center fillx} \
+  $win.leftframe    {left frame center expand fill} \
+  $win.rightframe   {right frame center expand fill}
+
+sim UpdateBudget
+
+update idletasks
+
diff --git a/res/weditor.tcl b/res/weditor.tcl
new file mode 100644 (file)
index 0000000..0d407d2
--- /dev/null
@@ -0,0 +1,576 @@
+# Window: Editor, for Unix Micropolis.
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+global EditorWindows
+set n [Unique]
+set parent [WindowLink $head.col2]
+set win $parent.editor$n
+set EditorWindows [linsert $EditorWindows 0 $win] 
+
+global Skip.$win
+set Skip.$win 0
+global AutoGoto.$win
+set AutoGoto.$win 0
+global Controls.$win
+set Controls.$win 1
+global Overlay.$win
+set Overlay.$win 0
+global DynamicFilter.$win
+set DynamicFilter.$win 0
+
+LinkWindow $head.editor $win
+LinkWindow $win.head $head
+LinkWindow $win.parent $parent
+LinkWindow $win.top $win
+
+catch "destroy $win"
+frame $win
+
+SetHelp $win Editor
+
+bind $win <Visibility> {[WindowLink %W.view] Visible [string compare %s FullyObscured]}
+bind $win <Map> {[WindowLink %W.view] Visible 1}
+bind $win <Unmap> {[WindowLink %W.view] Visible 0}
+# $head.editor points to most recently created or entered editor
+bind $win <Enter> "LinkWindow $head.editor $win"
+
+global CityName
+
+#wm title $win "Micropolis Editor"
+#wm iconname $win $CityName
+#wm group $win $head
+#wm geometry $win 550x535+440+5
+#wm positionfrom $win user
+#wm withdraw $win
+#wm maxsize $win 5000 5000
+#wm minsize $win 32 32
+#wm protocol $win delete "DeleteWindow editor EditorWindows"
+
+frame $win.topframe\
+  -borderwidth 0
+
+frame $win.topframe.controls\
+  -borderwidth 1\
+  -relief raised
+
+if {0} {
+  menubutton $win.topframe.controls.update\
+    -menu $win.topframe.controls.update.m\
+    -text {Display}\
+    -font [Font $win Medium]\
+    -variable $win.postedMenu\
+    -borderwidth 1\
+    -relief flat
+  tk_bindForTraversal $win.topframe.controls.update
+  bind $win.topframe.controls.update <F10> {tk_firstMenu %W} 
+  bind $win.topframe.controls.update <Mod2-Key> {tk_traverseToMenu %W %A} 
+  tk_menus $win $win.topframe.controls.update
+
+  SetHelp $win.topframe.controls.update Editor.Display
+
+  menu $win.topframe.controls.update.m\
+    -font [Font $win Medium]
+  tk_bindForTraversal $win.topframe.controls.update.m
+  bind $win.topframe.controls.update.m <F10> {tk_firstMenu %W} 
+  bind $win.topframe.controls.update.m <Mod2-Key> {tk_traverseToMenu %W %A} 
+    $win.topframe.controls.update.m add radiobutton\
+      -label {Always}\
+      -variable Skip.$win\
+      -value 0\
+      -command "SetEditorSkip $win 0"
+    $win.topframe.controls.update.m add radiobutton\
+      -label {Often}\
+      -variable Skip.$win\
+      -value 1\
+      -command "SetEditorSkip $win 2"
+    $win.topframe.controls.update.m add radiobutton\
+      -label {Sometimes}\
+      -variable Skip.$win\
+      -value 2\
+      -command "SetEditorSkip $win 8"
+    $win.topframe.controls.update.m add radiobutton\
+      -label {Seldom}\
+      -variable Skip.$win\
+      -value 3\
+      -command "SetEditorSkip $win 64"
+    $win.topframe.controls.update.m add radiobutton\
+      -label {Rarely}\
+      -variable Skip.$win\
+      -value 4\
+      -command "SetEditorSkip $win 256"
+}
+
+menubutton $win.topframe.controls.options\
+  -menu $win.topframe.controls.options.m\
+  -text {Options}\
+  -font [Font $win Medium]\
+  -variable $win.postedMenu\
+  -borderwidth 1\
+  -relief flat
+tk_bindForTraversal $win.topframe.controls.options
+bind $win.topframe.controls.options <F10> {tk_firstMenu %W} 
+bind $win.topframe.controls.options <Mod2-Key> {tk_traverseToMenu %W %A} 
+tk_menus $win $win.topframe.controls.options
+
+SetHelp $win.topframe.controls.options Editor.Options
+
+menu $win.topframe.controls.options.m\
+  -font [Font $win Medium]
+tk_bindForTraversal $win.topframe.controls.options.m
+bind $win.topframe.controls.options.m <F10> {tk_firstMenu %W} 
+bind $win.topframe.controls.options.m <Mod2-Key> {tk_traverseToMenu %W %A} 
+$win.topframe.controls.options.m add checkbutton\
+  -label {Auto Goto}\
+  -variable AutoGoto.$win\
+  -command "SetEditorAutoGoto $win \$\{AutoGoto.$win\}"
+$win.topframe.controls.options.m add checkbutton\
+  -label {Pallet Panel}\
+  -variable Controls.$win\
+  -command "SetEditorControls $win \$\{Controls.$win\}"
+$win.topframe.controls.options.m add checkbutton\
+  -label {Chalk Overlay}\
+  -variable Overlay.$win\
+  -command "SetEditorOverlay $win \$\{Overlay.$win\}"
+# Disabled dynamic fulter for now.
+#$win.topframe.controls.options.m add checkbutton\
+#  -label {Dynamic Filter}\
+#  -variable DynamicFilter.$win\
+#  -command "SetEditorDynamicFilter $win \$\{DynamicFilter.$win\}"
+
+pack append $win.topframe.controls\
+  $win.topframe.controls.options {left frame ne}
+
+#    $win.topframe.controls.update {left frame ne}
+
+label $win.topframe.messagelabel\
+  -borderwidth 1\
+  -relief raised\
+  -font [Font $win Large]\
+  -text {}\
+  -width 23
+LinkWindow $win.message $win.topframe.messagelabel
+
+SetHelp $win.message Editor.Message
+
+pack append $win.topframe\
+  $win.topframe.controls       {left frame ne} \
+  $win.topframe.messagelabel   {left frame ne expand fill} 
+
+frame $win.centerframe\
+  -cursor hand2\
+  -borderwidth 1\
+  -relief sunken
+
+SetHelp $win.centerframe Editor.View
+
+editorview $win.centerframe.view\
+  -font [Font $win Big]
+LinkWindow $win.view $win.centerframe.view
+LinkWindow $win.centerframe.view.top $win
+
+BindEditorButtons $win.centerframe.view
+
+bind $win.centerframe.view <Any-Enter> {focus %W}
+
+if {[sim MultiPlayerMode]} {
+
+  set entry [WindowLink $head.entry]
+  bind $win.centerframe.view <Any-KeyPress> "
+      if {\"%A\" != \"\"} {
+         $entry insert cursor %A
+         tk_entrySeeCaret $entry
+      }
+  "
+
+  bind $win.centerframe.view <Delete> "tk_entryDelPress $entry"
+  bind $win.centerframe.view <BackSpace> "tk_entryDelPress $entry"
+  bind $win.centerframe.view <Control-h> "tk_entryDelPress $entry"
+  bind $win.centerframe.view <Control-d> "tk_textCutPress $entry"
+  bind $win.centerframe.view <Control-u> "tk_entryDelLine $entry"
+  bind $win.centerframe.view <Control-v> "tk_entryCopyPress $entry"
+  bind $win.centerframe.view <Control-w> "tk_entryBackword $entry; tk_entrySeeCaret $entry"
+  bind $win.centerframe.view <Return> "DoEnterMessage $entry $entry.value"
+  bind $win.centerframe.view <Escape> "DoEvalMessage $entry $entry.value"
+
+} else {
+
+  bind $win.centerframe.view <KeyPress> {EditorKeyDown %W %K}
+  bind $win.centerframe.view <KeyRelease> {EditorKeyUp %W %K}
+
+}
+
+bind $win.centerframe.view <Up> "%W PanBy 0 -16 ; %W TweakCursor"
+bind $win.centerframe.view <Down> "%W PanBy 0 16 ; %W TweakCursor"
+bind $win.centerframe.view <Left> "%W PanBy -16 0 ; %W TweakCursor"
+bind $win.centerframe.view <Right> "%W PanBy 16 0 ; %W TweakCursor"
+bind $win.centerframe.view <Tab> "EditorToolDown none %W %x %y ; EditorToolUp %W %x %y"
+
+bind $win.centerframe.view <Meta-KeyPress> {EditorKeyDown %W %K}
+bind $win.centerframe.view <Meta-KeyRelease> {EditorKeyUp %W %K}
+bind $win.centerframe.view <Shift-Meta-KeyPress> {EditorKeyDown %W %K}
+bind $win.centerframe.view <Shift-Meta-KeyRelease> {EditorKeyUp %W %K}
+
+pack append $win.centerframe\
+  $win.centerframe.view {top frame center fill expand}
+
+frame $win.leftframe\
+  -borderwidth 1\
+  -relief raised\
+  -geometry 130x10
+
+SetHelp $win.leftframe Editor.ToolPallet
+
+frame $win.leftframe.tools\
+  -borderwidth 0\
+  -relief flat
+
+label $win.leftframe.tools.costlabel1\
+  -relief flat\
+  -font [Font $win Small]\
+  -text {}
+LinkWindow $win.cost1 $win.leftframe.tools.costlabel1
+LinkWindow $win.centerframe.view.cost1 $win.leftframe.tools.costlabel1
+
+SetHelp $win.leftframe.tools.costlabel1 Editor.ToolName
+
+label $win.leftframe.tools.costlabel2\
+  -relief flat\
+  -font [Font $win Small]\
+  -text {}
+LinkWindow $win.cost2 $win.leftframe.tools.costlabel2
+LinkWindow $win.centerframe.view.cost2 $win.leftframe.tools.costlabel2
+LinkWindow $win.centerframe.top $win
+
+SetHelp $win.leftframe.tools.costlabel2 Editor.ToolCost
+
+canvas $win.leftframe.tools.spacer\
+  -width 132 -height 4
+
+button $win.leftframe.tools.palletres\
+  -bitmap "@images/icres.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 0"
+SetHelp $win.leftframe.tools.palletres Editor.ToolRes
+
+button $win.leftframe.tools.palletcom\
+  -bitmap "@images/iccom.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 1"
+SetHelp $win.leftframe.tools.palletcom Editor.ToolCom
+
+button $win.leftframe.tools.palletind\
+  -bitmap "@images/icind.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 2"
+SetHelp $win.leftframe.tools.palletind Editor.ToolInd
+
+button $win.leftframe.tools.palletfire\
+  -bitmap "@images/icfire.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 3"
+SetHelp $win.leftframe.tools.palletfire Editor.ToolFire
+
+button $win.leftframe.tools.palletquery\
+  -bitmap "@images/icqry.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 4"
+SetHelp $win.leftframe.tools.palletquery Editor.ToolQuery
+
+button $win.leftframe.tools.palletpolice\
+  -bitmap "@images/icpol.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 5"
+SetHelp $win.leftframe.tools.palletpolice Editor.ToolPolice
+
+button $win.leftframe.tools.palletwire\
+  -bitmap "@images/icwire.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 6"
+SetHelp $win.leftframe.tools.palletwire Editor.ToolWire
+
+button $win.leftframe.tools.palletbulldozer\
+  -bitmap "@images/icdozr.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 7"
+SetHelp $win.leftframe.tools.palletbulldozer Editor.ToolBulldozer
+
+button $win.leftframe.tools.palletrail\
+  -bitmap "@images/icrail.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 8"
+SetHelp $win.leftframe.tools.palletrail Editor.ToolRail
+
+button $win.leftframe.tools.palletroad\
+  -bitmap "@images/icroad.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 9"
+SetHelp $win.leftframe.tools.palletroad Editor.ToolRoad
+
+button $win.leftframe.tools.palletchalk\
+  -bitmap "@images/icchlk.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 10"
+SetHelp $win.leftframe.tools.palletchalk Editor.ToolChalk
+
+button $win.leftframe.tools.palleteraser\
+  -bitmap "@images/icersr.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 11"
+SetHelp $win.leftframe.tools.palleteraser Editor.ToolEraser
+
+button $win.leftframe.tools.palletstadium\
+  -bitmap "@images/icstad.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 12"
+SetHelp $win.leftframe.tools.palletstadium Editor.ToolStadium
+
+button $win.leftframe.tools.palletpark\
+  -bitmap "@images/icpark.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 13"
+SetHelp $win.leftframe.tools.palletpark Editor.ToolPark
+
+button $win.leftframe.tools.palletseaport\
+  -bitmap "@images/icseap.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 14"
+SetHelp $win.leftframe.tools.palletseaport Editor.ToolSeaport
+
+button $win.leftframe.tools.palletcoal\
+  -bitmap "@images/iccoal.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 15"
+SetHelp $win.leftframe.tools.palletcoal Editor.ToolCoal
+
+button $win.leftframe.tools.palletnuclear\
+  -bitmap "@images/icnuc.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 16"
+SetHelp $win.leftframe.tools.palletnuclear Editor.ToolNuclear
+
+button $win.leftframe.tools.palletairport\
+  -bitmap "@images/icairp.xpm"\
+  -font [Font $win Medium] \
+  -borderwidth 1 -relief flat -padx 0 -pady 0 -text {} -cursor hand2\
+  -command "EditorPallet $win 17"
+SetHelp $win.leftframe.tools.palletairport Editor.ToolAirport
+
+pack append $win.leftframe.tools\
+  $win.leftframe.tools.costlabel1 {top frame center fillx}\
+  $win.leftframe.tools.costlabel2 {top frame center fillx}\
+  $win.leftframe.tools.spacer     {top frame center fillx}
+
+place $win.leftframe.tools.palletres -x 9 -y 58
+place $win.leftframe.tools.palletcom -x 47 -y 58
+place $win.leftframe.tools.palletind -x 85 -y 58
+place $win.leftframe.tools.palletfire -x 9 -y 112
+place $win.leftframe.tools.palletquery -x 47 -y 112
+place $win.leftframe.tools.palletpolice -x 85 -y 112
+place $win.leftframe.tools.palletwire -x 28 -y 150
+place $win.leftframe.tools.palletbulldozer -x 66 -y 150
+place $win.leftframe.tools.palletrail -x 6 -y 188
+place $win.leftframe.tools.palletroad -x 66 -y 188
+place $win.leftframe.tools.palletchalk -x 28 -y 216
+place $win.leftframe.tools.palleteraser -x 66 -y 216
+place $win.leftframe.tools.palletstadium -x 1 -y 254
+place $win.leftframe.tools.palletpark -x 47 -y 254
+place $win.leftframe.tools.palletseaport -x 85 -y 254
+place $win.leftframe.tools.palletcoal -x 1 -y 300
+place $win.leftframe.tools.palletnuclear -x 85 -y 300
+place $win.leftframe.tools.palletairport -x 35 -y 346
+
+pack append $win.leftframe\
+  $win.leftframe.tools {top frame center expand fill}
+
+pack append $win\
+  $win.topframe        {top frame center fillx} \
+  $win.centerframe     {right frame center expand fill} \
+  $win.leftframe       {left frame center filly} 
+
+global ShapePies
+
+piemenu $win.toolpie\
+    -title Tool\
+    -titlefont [Font $win Medium]\
+    -font [Font $win Medium]\
+    -fixedradius 26\
+    -shaped $ShapePies\
+    -preview "UIMakeSoundOn $head fancy Woosh {-volume 40}"
+  $win.toolpie add command\
+    -label Road -bitmap "@images/icroadhi.xpm"\
+    -xoffset -4\
+    -command "EditorSetTool $win 9"
+  $win.toolpie add command\
+    -label Bulldozer -bitmap "@images/icdozrhi.xpm"\
+    -xoffset 5 -yoffset 17\
+    -command "EditorSetTool $win 7"
+  $win.toolpie add piemenu\
+    -font [Font $win Medium]\
+    -label Zone -piemenu $win.zonepie 
+  $win.toolpie add command\
+    -label Wire -bitmap "@images/icwirehi.xpm"\
+    -xoffset -4 -yoffset 17\
+    -command "EditorSetTool $win 6"
+  $win.toolpie add command\
+    -label Rail -bitmap "@images/icrailhi.xpm"\
+    -xoffset 4\
+    -command "EditorSetTool $win 8"
+  $win.toolpie add command\
+    -label Chalk -bitmap "@images/icchlkhi.xpm"\
+    -xoffset -4 -yoffset -17\
+    -command "EditorSetTool $win 10"
+  $win.toolpie add piemenu\
+    -font [Font $win Medium]\
+    -label Build -piemenu $win.buildpie
+  $win.toolpie add command\
+    -label Eraser -bitmap "@images/icersrhi.xpm"\
+    -xoffset 4 -yoffset -17\
+    -command "EditorSetTool $win 11"
+
+piemenu $win.zonepie\
+    -title Zone\
+    -titlefont [Font $win Medium]\
+    -font [Font $win Medium]\
+    -shaped $ShapePies\
+    -initialangle 270 -fixedradius 20
+  $win.zonepie add command\
+    -label Query -bitmap "@images/icqryhi.xpm"\
+    -yoffset 5\
+    -command "EditorSetTool $win 4"
+  $win.zonepie add command\
+    -label Police -bitmap "@images/icpolhi.xpm"\
+    -xoffset 4 -yoffset -10\
+    -command "EditorSetTool $win 5"
+  $win.zonepie add command\
+    -label Ind -bitmap "@images/icindhi.xpm"\
+    -xoffset 4 -yoffset 25\
+    -command "EditorSetTool $win 2"
+  $win.zonepie add command\
+    -label Com -bitmap "@images/iccomhi.xpm"\
+    -yoffset -5\
+    -command "EditorSetTool $win 1"
+  $win.zonepie add command\
+    -label Res -bitmap "@images/icreshi.xpm"\
+    -xoffset -4 -yoffset 25\
+    -command "EditorSetTool $win 0"
+  $win.zonepie add command\
+    -label Fire -bitmap "@images/icfirehi.xpm"\
+    -xoffset -4 -yoffset -10\
+    -command "EditorSetTool $win 3"
+
+piemenu $win.buildpie\
+    -title Build\
+    -titlefont [Font $win Medium]\
+    -font [Font $win Medium]\
+    -shaped $ShapePies\
+    -initialangle 270 -fixedradius 25
+  $win.buildpie add command\
+    -label Airport -bitmap "@images/icairphi.xpm"\
+    -yoffset 7\
+    -command "EditorSetTool $win 17"
+  $win.buildpie add command\
+    -label Nuclear -bitmap "@images/icnuchi.xpm"\
+    -xoffset 11 -yoffset -10\
+    -command "EditorSetTool $win 16"
+  $win.buildpie add command\
+    -label Seaport -bitmap "@images/icseaphi.xpm"\
+    -xoffset 0 -yoffset 14\
+    -command "EditorSetTool $win 14"
+  $win.buildpie add command\
+    -label Park -bitmap "@images/icparkhi.xpm"\
+    -yoffset -5\
+    -command "EditorSetTool $win 13"
+  $win.buildpie add command\
+    -label Stadium -bitmap "@images/icstadhi.xpm"\
+    -xoffset 0 -yoffset 14\
+    -command "EditorSetTool $win 12"
+  $win.buildpie add command\
+    -label Coal -bitmap "@images/iccoalhi.xpm"\
+    -xoffset -11 -yoffset -10\
+    -command "EditorSetTool $win 15"
+
+SetEditorAutoGoto $win 0
+SetEditorControls $win 1
+SetEditorOverlay $win 1
+SetEditorDynamicFilter $win 0
+
+InitEditor $win
+
+global CityName
+UISetCityName $CityName
+
+update idletasks
diff --git a/res/weval.tcl b/res/weval.tcl
new file mode 100644 (file)
index 0000000..6a586d3
--- /dev/null
@@ -0,0 +1,302 @@
+# Window: Player evaluation, for Unix Micropolis.
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+global EvaluationWindows
+set n [Unique]
+set parent [WindowLink $head.col2]
+set win $parent.evaluation$n
+set EvaluationWindows [linsert $EvaluationWindows 0 $win]
+
+LinkWindow $head.evaluation $win
+LinkWindow $win.head $head
+LinkWindow $win.parent $parent
+LinkWindow $win.top $win
+
+catch "destroy $win"
+frame $win
+
+SetHelp $win Evaluation
+
+global [set var $win.visible]
+set $var 0
+
+bind $win <Visibility> {EvaluationVisible %W [string compare %s FullyObscured]}
+bind $win <Map> {EvaluationVisible %W 1}
+bind $win <Unmap> {EvaluationVisible %W 0}
+
+#wm title $win {Micropolis Evaluation}
+#wm iconname $win {Micropolis Evaluation}
+#wm group $win $head
+#wm geometry $win 480x240+5-5
+#wm withdraw $win
+#wm maxsize $win 700 700
+#wm minsize $win 400 200
+#wm protocol $win delete "DeleteWindow evaluation EvaluationWindows"
+
+
+frame $win.leftframe\
+  -borderwidth 1\
+  -relief raised
+
+SetHelp $win.leftframe Evaluation.Opinion
+
+label $win.leftframe.title\
+  -font [Font $win Big]\
+  -padx 0\
+  -relief flat\
+  -text {Public Opinion}\
+  -width 5
+
+label $win.leftframe.isthe\
+  -font [Font $win Large]\
+  -text {Is the mayor doing a good job?}
+
+SetHelp $win.leftframe.isthe Evaluation.GoodJob
+
+frame $win.leftframe.goodjobframe\
+  -borderwidth 1
+
+SetHelp $win.leftframe.goodjobframe Evaluation.GoodJob
+
+message $win.leftframe.goodjobframe.yesno\
+  -aspect 1500\
+  -justify right\
+  -padx 5\
+  -pady 2\
+  -font [Font $win Medium]\
+  -text {YES
+NO}
+
+message $win.leftframe.goodjobframe.percents\
+  -aspect 1500\
+  -justify left\
+  -padx 5\
+  -pady 2\
+  -font [Font $win Medium]\
+  -text {100%
+0%}
+LinkWindow $win.goodjob $win.leftframe.goodjobframe.percents
+
+pack append $win.leftframe.goodjobframe\
+  $win.leftframe.goodjobframe.percents {right frame w expand} \
+  $win.leftframe.goodjobframe.yesno            {right frame e expand} 
+
+label $win.leftframe.whatare\
+  -font [Font $win Large]\
+  -text {What are the worst problems?}
+
+SetHelp $win.leftframe.whatare Evaluation.WorstProblems
+
+frame $win.leftframe.worstproblems\
+  -borderwidth 1
+
+SetHelp $win.leftframe.worstproblems Evaluation.WorstProblems
+
+message $win.leftframe.worstproblems.problemnames\
+  -aspect 1500\
+  -justify right\
+  -padx 5\
+  -pady 2\
+  -font [Font $win Medium]\
+  -text {        
+
+
+
+}
+LinkWindow $win.problemnames $win.leftframe.worstproblems.problemnames
+
+message $win.leftframe.worstproblems.problempercents\
+  -aspect 1500\
+  -justify left\
+  -padx 5\
+  -pady 2\
+  -font [Font $win Medium]\
+  -text {        
+
+
+
+}
+LinkWindow $win.problempercents $win.leftframe.worstproblems.problempercents
+
+pack append $win.leftframe.worstproblems\
+  $win.leftframe.worstproblems.problempercents {right frame w expand} \
+  $win.leftframe.worstproblems.problemnames    {right frame e expand}
+
+pack append $win.leftframe\
+  $win.leftframe.title         {top frame center fillx expand} \
+  $win.leftframe.isthe         {top frame center fillx expand} \
+  $win.leftframe.goodjobframe  {top frame center fillx expand} \
+  $win.leftframe.whatare       {top frame center fillx expand} \
+  $win.leftframe.worstproblems {top frame center fillx expand} 
+
+frame $win.rightframe\
+  -borderwidth 1\
+  -relief raised
+
+SetHelp $win.rightframe Evaluation.Statistics
+
+label $win.rightframe.title\
+  -font [Font $win Big]\
+  -padx 0\
+  -relief flat\
+  -text {Statistics}\
+  -width 5
+
+frame $win.rightframe.statsframe\
+  -borderwidth 1
+
+message $win.rightframe.statsframe.statlabels\
+  -aspect 1500\
+  -justify right\
+  -padx 5\
+  -pady 2\
+  -font [Font $win Medium]\
+  -text {Population:
+Net Migration:
+(last year) 
+Assessed Value:
+Category:
+Game Level:}
+
+message $win.rightframe.statsframe.stats\
+  -aspect 1500\
+  -justify left\
+  -padx 5\
+  -pady 2\
+  -font [Font $win Medium]\
+  -text {                
+
+
+
+
+}
+LinkWindow $win.stats $win.rightframe.statsframe.stats
+
+pack append $win.rightframe.statsframe\
+  $win.rightframe.statsframe.statlabels        {left frame e expand} \
+  $win.rightframe.statsframe.stats     {right frame w expand}
+
+message $win.rightframe.cityscore\
+  -aspect 1500\
+  -justify center\
+  -padx 5\
+  -pady 2\
+  -font [Font $win Medium]\
+  -text {Overall City Score
+(0 - 1000)}
+
+SetHelp $win.rightframe.cityscore Evaluation.Score
+
+frame $win.rightframe.scoreframe\
+  -borderwidth 1
+
+SetHelp $win.rightframe.scoreframe Evaluation.Score
+
+message $win.rightframe.scoreframe.scorelabels\
+  -aspect 1500\
+  -justify right\
+  -padx 5\
+  -pady 2\
+  -font [Font $win Medium]\
+  -text {Current Score:
+Annual Change:}
+
+message $win.rightframe.scoreframe.scores\
+  -aspect 1500\
+  -justify left\
+  -padx 5\
+  -pady 2\
+  -font [Font $win Medium]\
+  -text {        
+
+}
+LinkWindow $win.score $win.rightframe.scoreframe.scores
+
+pack append $win.rightframe.scoreframe\
+  $win.rightframe.scoreframe.scorelabels       {left frame e expand} \
+  $win.rightframe.scoreframe.scores            {right frame w expand}
+
+pack append $win.rightframe\
+  $win.rightframe.title        {top frame center fillx expand} \
+  $win.rightframe.statsframe   {top frame center fillx expand} \
+  $win.rightframe.cityscore    {top frame center fillx expand} \
+  $win.rightframe.scoreframe   {top frame center fillx expand} 
+
+frame $win.bottomframe\
+  -borderwidth 0
+
+SetHelp $win.bottomframe Evaluation.Dismiss
+
+button $win.bottomframe.button\
+  -font [Font $win Large]\
+  -text {Dismiss Evaluation}\
+  -command "pack unpack $win"
+
+pack append $win.bottomframe\
+  $win.bottomframe.button   {top frame center expand fillx}
+
+pack append $win\
+  $win.bottomframe     {bottom frame center fillx}\
+  $win.leftframe       {left frame center expand fill} \
+  $win.rightframe      {right frame center expand fill}
+
+sim UpdateEvaluation
+
+update idletasks
diff --git a/res/wfile.tcl b/res/wfile.tcl
new file mode 100644 (file)
index 0000000..5ae6331
--- /dev/null
@@ -0,0 +1,193 @@
+# Window:  File Chooser, for Unix Micropolis
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+global FileWindows
+set n [Unique]
+set win .file$n
+set FileWindows [linsert $FileWindows 0 $win]
+
+LinkWindow $head.file $win
+LinkWindow $win.head $head
+
+catch "destroy $win"
+toplevel $win -screen $display
+
+SetHelp $win File
+
+wm title $win {File Chooser}
+wm iconname $win {File Chooser}
+wm geometry $win 350x480+5+5
+wm positionfrom $win user
+wm sizefrom $win user
+wm maxsize $win 700 700
+wm minsize $win 100 100
+wm protocol $win delete "DeleteWindow file FileWindows"
+wm transient $win $head
+
+# Based on xf file selection box code by:
+#   garfield@cs.tu-berlin.de
+#   svoboda@transam.ece.cmu.edu (David Svoboda)
+
+message $win.message1 \
+  -aspect 1500 \
+  -anchor n \
+  -justify center \
+  -relief flat \
+  -font [Font $win Large] \
+  -text ""
+
+frame $win.frame1 \
+  -borderwidth 0
+
+button $win.frame1.ok -text {OK} -font [Font $win Large]
+
+SetHelp $win.frame1.ok File.OK
+
+button $win.frame1.rescan -text {Rescan} -font [Font $win Large]
+
+SetHelp $win.frame1.rescan File.Rescan
+
+button $win.frame1.cancel -text {Cancel} -font [Font $win Large]
+
+SetHelp $win.frame1.cancel File.Cancel
+
+frame $win.path \
+  -borderwidth 2 \
+  -relief flat
+
+SetHelp $win.path File.Directory
+
+label $win.path.pathlabel -text {Directory:} -font [Font $win Large]
+entry $win.path.path -relief sunken -font [Font $win Large]
+
+frame $win.files \
+  -borderwidth 2 \
+  -relief flat
+
+SetHelp $win.files File.List
+
+scrollbar $win.files.vscroll \
+  -command "$win.files.files yview"
+
+scrollbar $win.files.hscroll \
+  -orient horizontal \
+  -command "$win.files.files xview"
+
+listbox $win.files.files \
+  -exportselection false \
+  -font [Font $win Large] \
+  -xscrollcommand "$win.files.hscroll set" \
+  -yscrollcommand "$win.files.vscroll set"
+
+pack append $win.files \
+           $win.files.vscroll {left filly} \
+           $win.files.hscroll {bottom fillx} \
+           $win.files.files {left fill expand}
+
+frame $win.file \
+  -borderwidth 2 \
+  -relief flat
+
+SetHelp $win.file File.File
+
+label $win.file.labelfile \
+  -relief flat \
+  -font [Font $win Large] \
+  -text "File:"
+
+entry $win.file.file \
+  -font [Font $win Large] \
+  -relief sunken
+
+pack append $win.file \
+           $win.file.labelfile {left} \
+           $win.file.file {left fill expand}
+
+bind $win.files.files <ButtonPress-1> "FileSelect $win %W %y"
+bind $win.files.files <Button1-Motion> "FileSelect $win %W %y"
+bind $win.files.files <Shift-Button1-Motion> "FileSelect $win %W %y"
+bind $win.files.files <Shift-ButtonPress-1> "FileSelect $win %W %y"
+bind $win.path.path <Tab> "NameComplete $win path"
+catch "bind $win.path.path <Up> {}"
+bind $win.path.path <Down> "
+  $win.file.file cursor 0
+  focus $win.file.file"
+
+bind $win.file.file <Tab> "NameComplete $win file"
+bind $win.file.file <Up> "
+  $win.path.path cursor 0
+  focus $win.path.path"
+catch "bind $win.path.path <Down> {}"
+
+pack append $win.frame1 \
+           $win.frame1.ok {left fill expand} \
+           $win.frame1.rescan {left fill expand} \
+           $win.frame1.cancel {left fill expand}
+pack append $win.path \
+           $win.path.pathlabel {left} \
+           $win.path.path {left fill expand}
+pack append $win \
+           $win.message1 {top fill} \
+           $win.frame1 {bottom fill} \
+           $win.file {bottom fill} \
+           $win.path {bottom fill} \
+           $win.files {left fill expand}
+
+update idletasks
diff --git a/res/wfrob.tcl b/res/wfrob.tcl
new file mode 100644 (file)
index 0000000..8fc206c
--- /dev/null
@@ -0,0 +1,264 @@
+# Window: Dynamic Zone Filter, examining traffic, density, etc, for Unix Micropolis
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+global FrobWindows
+set n [Unique]
+set win .frob$n
+set FrobWindows [linsert $FrobWindows 0 $win]
+
+LinkWindow $head.frob $win
+LinkWindow $head.frob $win
+LinkWindow $win.head $head
+
+catch "destroy $win"
+toplevel $win -screen $display
+
+SetHelp $win Frob
+
+wm title $win {Micropolis Dynamic Zone Filter}
+wm iconname $win {Micropolis Frob}
+wm geometry $win 350x480+5+5
+wm positionfrom $win user
+wm sizefrom $win user
+wm maxsize $win 700 700
+wm minsize $win 100 100
+wm protocol $win delete "DeleteWindow frob FrobWindows"
+wm transient $win $head
+
+frame $win.top \
+  -relief raised \
+  -borderwidth 1
+LinkWindow $win.background $win.top
+
+label $win.top.title \
+  -text {Frob-O-Matic Dynamic Zone Filter} \
+  -borderwidth 1 \
+  -relief raised \
+  -font [Font $win Big]
+LinkWindow $win.title $win.top.title
+
+#  SetHelp $win.top.title Frob.Title
+
+frame $win.top.border \
+  -relief flat \
+  -borderwidth 4
+
+label $win.top.border.l0 \
+  -text {Population Density} \
+  -borderwidth 1 \
+  -font [Font $win Small]
+
+SetHelp $win.top.border.l0 Frob.PopulationDensity
+
+interval $win.top.border.i0\
+      -font [Font $win Medium]\
+      -borderwidth 1 \
+      -orient horizontal \
+      -from 0 -to 255 \
+      -command "UISetDynamic 0"
+
+SetHelp $win.top.border.i0 Frob.PopulationDensity
+
+label $win.top.border.l1 \
+  -text {Rate Of Growth} \
+  -borderwidth 2 \
+  -font [Font $win Small]
+
+SetHelp $win.top.border.l0 Frob.RateOfGrowth
+
+interval $win.top.border.i1\
+      -font [Font $win Medium]\
+      -borderwidth 1 \
+      -orient horizontal \
+      -from 0 -to 255 \
+      -command "UISetDynamic 1"
+
+SetHelp $win.top.border.i0 Frob.RateOfGrowth
+
+label $win.top.border.l2 \
+  -text {Traffic Density} \
+  -borderwidth 2 \
+  -font [Font $win Small]
+
+SetHelp $win.top.border.l0 Frob.TrafficDensity
+
+interval $win.top.border.i2\
+      -font [Font $win Medium]\
+      -borderwidth 1 \
+      -orient horizontal \
+      -from 0 -to 255 \
+      -command "UISetDynamic 2"
+
+SetHelp $win.top.border.i0 Frob.TrafficDensity
+
+label $win.top.border.l3 \
+  -text {Pollution Rate} \
+  -borderwidth 2 \
+  -font [Font $win Small]
+
+SetHelp $win.top.border.l0 Frob.PollutionRate
+
+interval $win.top.border.i3\
+      -font [Font $win Medium]\
+      -borderwidth 1 \
+      -orient horizontal \
+      -from 0 -to 255 \
+      -command "UISetDynamic 3"
+
+SetHelp $win.top.border.i0 Frob.PollutionRate
+
+label $win.top.border.l4 \
+  -text {Crime Rate} \
+  -borderwidth 2 \
+  -font [Font $win Small]
+
+SetHelp $win.top.border.l0 Frob.CrimeRate
+
+interval $win.top.border.i4\
+      -font [Font $win Medium]\
+      -borderwidth 1 \
+      -orient horizontal \
+      -from 0 -to 255 \
+      -command "UISetDynamic 4"
+
+SetHelp $win.top.border.i0 Frob.CrimeRate
+
+label $win.top.border.l5 \
+  -text {Land Value} \
+  -borderwidth 2 \
+  -font [Font $win Small]
+
+SetHelp $win.top.border.l0 Frob.LandValue
+
+interval $win.top.border.i5\
+      -font [Font $win Medium]\
+      -borderwidth 1 \
+      -orient horizontal \
+      -from 0 -to 255 \
+      -command "UISetDynamic 5"
+
+SetHelp $win.top.border.i0 Frob.LandValue
+
+label $win.top.border.l6 \
+  -text {Police Effect} \
+  -borderwidth 2 \
+  -font [Font $win Small]
+
+SetHelp $win.top.border.l0 Frob.PoliceEffect
+
+interval $win.top.border.i6\
+      -font [Font $win Medium]\
+      -borderwidth 1 \
+      -orient horizontal \
+      -from 0 -to 255 \
+      -command "UISetDynamic 6"
+
+SetHelp $win.top.border.i0 Frob.PoliceEffect
+
+label $win.top.border.l7 \
+  -text {Fire Effect} \
+  -borderwidth 2 \
+  -font [Font $win Small]
+
+SetHelp $win.top.border.l0 Frob.FireEffect
+
+interval $win.top.border.i7\
+      -font [Font $win Medium]\
+      -borderwidth 1 \
+      -orient horizontal \
+      -from 0 -to 255 \
+      -command "UISetDynamic 7"
+
+SetHelp $win.top.border.i0 Frob.FireEffect
+
+pack append $win.top.border\
+  $win.top.border.l0           {top frame center fillx} \
+  $win.top.border.i0           {top frame center fillx} \
+  $win.top.border.l1           {top frame center fillx} \
+  $win.top.border.i1           {top frame center fillx} \
+  $win.top.border.l2           {top frame center fillx} \
+  $win.top.border.i2           {top frame center fillx} \
+  $win.top.border.l3           {top frame center fillx} \
+  $win.top.border.i3           {top frame center fillx} \
+  $win.top.border.l4           {top frame center fillx} \
+  $win.top.border.i4           {top frame center fillx} \
+  $win.top.border.l5           {top frame center fillx} \
+  $win.top.border.i5           {top frame center fillx} \
+  $win.top.border.l6           {top frame center fillx} \
+  $win.top.border.i6           {top frame center fillx} \
+  $win.top.border.l7           {top frame center fillx} \
+  $win.top.border.i7           {top frame center fillx}
+
+pack append $win.top\
+  $win.top.title               {top frame center fillx} \
+  $win.top.border              {top frame center fill}
+
+button $win.dismiss\
+  -font [Font $win Large]\
+  -text {Dismiss}\
+  -command "wm withdraw $win"
+
+SetHelp $win.dismiss Frob.Dismiss
+
+pack append $win\
+  $win.dismiss {bottom frame center fillx}\
+  $win.top             {left frame center expand fill}
+
+update idletasks
diff --git a/res/wgraph.tcl b/res/wgraph.tcl
new file mode 100644 (file)
index 0000000..bc9b27d
--- /dev/null
@@ -0,0 +1,256 @@
+# Window: Graphs of money, crime, etc, for Unix Micropolis
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+global GraphWindows
+set n [Unique]
+set parent [WindowLink $head.col2]
+set win $parent.graph$n
+set GraphWindows [linsert $GraphWindows 0 $win]
+
+LinkWindow $head.graph $win
+LinkWindow $win.head $head
+LinkWindow $win.parent $parent
+LinkWindow $win.top $win
+
+catch "destroy $win"
+frame $win
+
+SetHelp $win Graph
+
+bind $win <Visibility> {[WindowLink %W.graphview] Visible [string compare %s FullyObscured]}
+bind $win <Map> {[WindowLink %W.graphview] Visible 1}
+bind $win <Unmap> {[WindowLink %W.graphview] Visible 0}
+
+#wm title $win {Micropolis Graph}
+#wm iconname $win {Micropolis Graph}
+#wm group $win $head
+#wm geometry $win 550x200+440+730
+#wm positionfrom $win user
+#wm withdraw $win
+#wm maxsize $win 1000 500
+#wm minsize $win 150 85
+#wm protocol $win delete "DeleteWindow graph GraphWindows"
+
+
+frame $win.centerframe\
+  -borderwidth 1\
+  -relief raised
+
+SetHelp $win.centerframe Graph.View
+
+graphview $win.centerframe.graph\
+  -font [Font $win Small]
+LinkWindow $win.centerframe.graph.pallet $win.leftframe
+LinkWindow $win.graphview $win.centerframe.graph
+
+pack append $win.centerframe\
+  $win.centerframe.graph {top frame center fill expand}
+
+frame $win.leftframe\
+  -borderwidth 1\
+  -relief raised
+
+frame $win.leftframe.left\
+  -borderwidth 0
+
+button $win.leftframe.left.res\
+  -bitmap "@images/grres.xpm"\
+  -font [Font $win Medium]\
+  -borderwidth 0\
+  -relief flat\
+  -padx 0\
+  -pady 0\
+  -text {}\
+  -command "GraphPallet $win 0"
+
+SetHelp $win.leftframe.left.res Graph.Res
+
+button $win.leftframe.left.com\
+  -bitmap "@images/grcom.xpm"\
+  -font [Font $win Medium]\
+  -borderwidth 0\
+  -relief flat\
+  -padx 0\
+  -pady 0\
+  -text {}\
+  -command "GraphPallet $win 1"
+
+SetHelp $win.leftframe.left.com Graph.Com
+
+button $win.leftframe.left.ind\
+  -bitmap "@images/grind.xpm"\
+  -font [Font $win Medium]\
+  -borderwidth 0\
+  -relief flat\
+  -padx 0\
+  -pady 0\
+  -text {}\
+  -command "GraphPallet $win 2"
+
+SetHelp $win.leftframe.left.ind Graph.Ind
+
+pack append $win.leftframe.left\
+  $win.leftframe.left.res      {top frame center padx 2 pady 2} \
+  $win.leftframe.left.com      {top frame center padx 2 pady 2} \
+  $win.leftframe.left.ind      {top frame center padx 2 pady 2}
+
+frame $win.leftframe.right\
+  -borderwidth 0
+
+button $win.leftframe.right.money\
+  -bitmap "@images/grmony.xpm"\
+  -font [Font $win Medium]\
+  -borderwidth 0\
+  -relief flat\
+  -padx 0\
+  -pady 0\
+  -text {}\
+  -command "GraphPallet $win 3"
+
+SetHelp $win.leftframe.right.money Graph.Money
+
+button $win.leftframe.right.crime\
+  -bitmap "@images/grcrim.xpm"\
+  -font [Font $win Medium]\
+  -borderwidth 0\
+  -relief flat\
+  -padx 0\
+  -pady 0\
+  -text {}\
+  -command "GraphPallet $win 4"
+
+SetHelp $win.leftframe.right.crime Graph.Crime
+
+button $win.leftframe.right.pollution\
+  -bitmap "@images/grpoll.xpm"\
+  -font [Font $win Medium]\
+  -borderwidth 0\
+  -relief flat\
+  -padx 0\
+  -pady 0\
+  -text {}\
+  -command "GraphPallet $win 5"
+
+SetHelp $win.leftframe.right.pollution Graph.Pollution
+
+pack append $win.leftframe.right\
+  $win.leftframe.right.money           {top frame center padx 2 pady 2} \
+  $win.leftframe.right.crime           {top frame center padx 2 pady 2} \
+  $win.leftframe.right.pollution       {top frame center padx 2 pady 2}
+
+frame $win.leftframe.year\
+  -borderwidth 0
+
+button $win.leftframe.year.year10\
+  -bitmap "@images/gr10.xpm"\
+  -font [Font $win Medium]\
+  -borderwidth 0\
+  -relief flat\
+  -padx 0\
+  -pady 0\
+  -text {}\
+  -command "GraphYearPallet $win 0"
+
+SetHelp $win.leftframe.year.year10 Graph.10Years
+
+button $win.leftframe.year.year120\
+  -bitmap "@images/gr120.xpm"\
+  -font [Font $win Medium]\
+  -borderwidth 0\
+  -relief flat\
+  -padx 0\
+  -pady 0\
+  -text {}\
+  -command "GraphYearPallet $win 1"
+
+SetHelp $win.leftframe.year.year120 Graph.120Years
+
+pack append $win.leftframe.year\
+  $win.leftframe.year.year10   {top frame center} \
+  $win.leftframe.year.year120  {top frame center} \
+
+pack append $win.leftframe\
+  $win.leftframe.year          {top frame center padx 2 pady 2} \
+  $win.leftframe.left          {left frame center} \
+  $win.leftframe.right         {right frame center} \
+
+
+frame $win.bottomframe\
+  -borderwidth 0
+
+SetHelp $win.bottomframe Graph.Dismiss
+
+button $win.bottomframe.button\
+  -font [Font $win Large]\
+  -text {Dismiss Graph}\
+  -borderwidth 1 \
+  -command "pack unpack $win"
+
+pack append $win.bottomframe\
+  $win.bottomframe.button   {top frame center expand fillx}
+
+pack append $win\
+  $win.bottomframe     {bottom frame center fillx}\
+  $win.leftframe       {left frame center filly} \
+  $win.centerframe     {right frame center expand fill}
+
+InitGraph $win
+
+update idletasks
diff --git a/res/whead.tcl b/res/whead.tcl
new file mode 100644 (file)
index 0000000..d437925
--- /dev/null
@@ -0,0 +1,701 @@
+# Window: Head (global controls & menus), for Unix Micropolis.
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+global HeadWindows
+set n [Unique]
+set win .head$n
+
+catch "destroy $win"
+if {[catch "toplevel $win -screen $display"]} {
+  puts stderr "Couldn't open X11 display \"$display\"."
+  set win ""
+  return ""
+}
+
+global HeadPanelWidth
+global HeadPanelHeight
+global MapPanelWidth
+global MapPanelHeight
+global NoticePanelWidth
+global NoticePanelHeight
+
+set visual [winfo screenvisual $win]
+set depth [winfo screendepth $win]
+#set screenwidth [winfo screenwidth $win]
+#set screenheight [winfo screenheight $win]
+set screenwidth 1200
+set screenheight 900
+
+if {!(("$visual" == "pseudocolor") ||
+      ("$visual" == "truecolor") ||
+      (("$visual" == "staticgray") &&
+       ($depth == 1)))} {
+  catch "destroy $win"
+  puts stderr "Micropolis can't find an appropriate visual on display \"$display\"."
+  set win ""
+  return ""
+}
+
+set HeadWindows [linsert $HeadWindows 0 $win]
+
+SetHelp $win Head
+
+LinkWindow $win.head $win
+LinkWindow $win.editor {}
+LinkWindow $win.map {}
+LinkWindow $win.graph {}
+LinkWindow $win.budget {}
+LinkWindow $win.evaluation {}
+LinkWindow $win.splash {}
+LinkWindow $win.scenario {}
+LinkWindow $win.file {}
+LinkWindow $win.config {}
+LinkWindow $win.notice {}
+LinkWindow $win.ask {}
+
+tk_bindForTraversal $win
+bind $win <F10> {tk_firstMenu %W} 
+bind $win <Mod2-Key> {tk_traverseToMenu %W %A} 
+
+wm title $win "Micropolis Controls"
+wm iconname $win {Micropolis Controls}
+wm geometry $win 1200x900+0+0
+#wm positionfrom $win user
+wm withdraw $win
+#wm maxsize $win $screenwidth $screenheight
+#wm minsize $win 100 100
+wm protocol $win delete "DeleteHeadWindow $win ;"
+wm fullscreen $win on
+
+global $win.postedMenu
+global $win.Sound
+
+frame $win.col1
+tk_bindForTraversal $win.col1
+
+LinkWindow $win.col1 $win.col1
+
+frame $win.col1.w1\
+  -width $HeadPanelWidth\
+  -height $HeadPanelHeight
+tk_bindForTraversal $win.col1.w1
+
+frame $win.col1.w1.f1\
+  -borderwidth 1\
+  -relief raised
+tk_bindForTraversal $win.col1.w1.f1
+bind $win.col1.w1.f1 <F10> {tk_firstMenu %W} 
+bind $win.col1.w1.f1 <Mod2-Key> {tk_traverseToMenu %W %A} 
+
+SetHelp $win.col1.w1.f1.micropolis Head.MicropolisMenu
+
+menubutton $win.col1.w1.f1.micropolis\
+  -menu $win.col1.w1.f1.micropolis.m\
+  -text {Micropolis}\
+  -font [Font $win Medium]\
+  -variable $win.postedMenu
+tk_bindForTraversal $win.col1.w1.f1.micropolis
+bind $win.col1.w1.f1.micropolis <F10> {tk_firstMenu %W} 
+bind $win.col1.w1.f1.micropolis <Mod2-Key> {tk_traverseToMenu %W %A} 
+
+tk_menus $win $win.col1.w1.f1.micropolis
+
+menu $win.col1.w1.f1.micropolis.m\
+  -font [Font $win Medium]
+tk_bindForTraversal $win.col1.w1.f1.micropolis.m
+bind $win.col1.w1.f1.micropolis.m <F10> {tk_firstMenu %W} 
+bind $win.col1.w1.f1.micropolis.m <Mod2-Key> {tk_traverseToMenu %W %A} 
+  $win.col1.w1.f1.micropolis.m add command\
+    -label {About...}\
+    -command "UIShowPicture 300"
+  $win.col1.w1.f1.micropolis.m add command\
+    -label {Save City}\
+    -command "UISaveCity $win"
+  $win.col1.w1.f1.micropolis.m add command\
+    -label {Save City as...}\
+    -command "UISaveCityAs $win"
+  if {[sim MultiPlayerMode]} {
+    $win.col1.w1.f1.micropolis.m add command\
+      -label {Add Player...}\
+      -command "UIShowPlayer $win"
+  }
+  $win.col1.w1.f1.micropolis.m add command\
+    -label {Choose City!}\
+    -command "UISelectCity $win"
+  $win.col1.w1.f1.micropolis.m add command\
+    -label {Quit Playing!}\
+    -command "UIQuit $win"
+
+SetHelp $win.col1.w1.f1.options Head.OptionsMenu
+
+menubutton $win.col1.w1.f1.options\
+  -menu $win.col1.w1.f1.options.m\
+  -text {Options}\
+  -font [Font $win Medium]\
+  -variable $win.postedMenu
+tk_bindForTraversal $win.col1.w1.f1.options
+bind $win.col1.w1.f1.options <F10> {tk_firstMenu %W} 
+bind $win.col1.w1.f1.options <Mod2-Key> {tk_traverseToMenu %W %A} 
+
+tk_menus $win $win.col1.w1.f1.options
+
+menu $win.col1.w1.f1.options.m\
+  -font [Font $win Medium]
+tk_bindForTraversal $win.col1.w1.f1.options.m
+bind $win.col1.w1.f1.options.m <F10> {tk_firstMenu %W} 
+bind $win.col1.w1.f1.options.m <Mod2-Key> {tk_traverseToMenu %W %A} 
+  $win.col1.w1.f1.options.m add checkbutton\
+    -label {Auto Budget}\
+    -variable AutoBudget\
+    -command {sim AutoBudget $AutoBudget}
+  $win.col1.w1.f1.options.m add checkbutton\
+    -label {Auto Bulldoze}\
+    -variable AutoBulldoze\
+    -command {sim AutoBulldoze $AutoBulldoze}
+  $win.col1.w1.f1.options.m add checkbutton\
+    -label {Disasters}\
+    -variable Disasters\
+    -command {sim Disasters $Disasters}
+  $win.col1.w1.f1.options.m add checkbutton\
+    -label {Sound}\
+    -variable Sound\
+    -command {sim Sound $Sound}
+  $win.col1.w1.f1.options.m add checkbutton\
+    -label {Animation}\
+    -variable DoAnimation\
+    -command {sim DoAnimation $DoAnimation}
+  $win.col1.w1.f1.options.m add checkbutton\
+    -label {Messages}\
+    -variable DoMessages\
+    -command {sim DoMessages $DoMessages}
+  $win.col1.w1.f1.options.m add checkbutton\
+    -label {Notices}\
+    -variable DoNotices\
+    -command {sim DoNotices $DoNotices}
+
+SetHelp $win.col1.w1.f1.disasters Head.DisastersMenu
+
+menubutton $win.col1.w1.f1.disasters\
+  -menu $win.col1.w1.f1.disasters.m\
+  -text {Disasters}\
+  -font [Font $win Medium]\
+  -variable $win.postedMenu
+tk_bindForTraversal $win.col1.w1.f1.disasters
+bind $win.col1.w1.f1.disasters <F10> {tk_firstMenu %W} 
+bind $win.col1.w1.f1.disasters <Mod2-Key> {tk_traverseToMenu %W %A} 
+
+tk_menus $win $win.col1.w1.f1.disasters
+
+menu $win.col1.w1.f1.disasters.m\
+  -font [Font $win Medium]
+tk_bindForTraversal $win.col1.w1.f1.disasters.m
+bind $win.col1.w1.f1.disasters.m <F10> {tk_firstMenu %W} 
+bind $win.col1.w1.f1.disasters.m <Mod2-Key> {tk_traverseToMenu %W %A} 
+  $win.col1.w1.f1.disasters.m add command\
+    -label {Monster}\
+    -command "UIDisaster $win \"UIMakeMonster\" \"release a monster?\""
+  $win.col1.w1.f1.disasters.m add command\
+    -label {Fire}\
+    -command "UIDisaster $win \"sim MakeFire\" \"start a fire?\""
+  $win.col1.w1.f1.disasters.m add command\
+    -label {Flood}\
+    -command "UIDisaster $win \"sim MakeFlood\" \"bring on a flood?\""
+  $win.col1.w1.f1.disasters.m add command\
+    -label {Meltdown}\
+    -command "UIDisaster $win \"sim MakeMeltdown\" \"have a nuclear meltdown?\""
+  $win.col1.w1.f1.disasters.m add command\
+    -label {Tornado}\
+    -command "UIDisaster $win \"sim MakeTornado\" \"spin up a tornado?\""
+  $win.col1.w1.f1.disasters.m add command\
+    -label {Earthquake}\
+    -command "UIDisaster $win \"sim MakeEarthquake\" \"cause an earthquake?\""
+
+SetHelp $win.col1.w1.f1.priority Head.PriorityMenu
+
+menubutton $win.col1.w1.f1.priority\
+  -menu $win.col1.w1.f1.priority.m\
+  -text {Priority}\
+  -font [Font $win Medium]\
+  -variable $win.postedMenu
+tk_bindForTraversal $win.col1.w1.f1.priority
+bind $win.col1.w1.f1.priority <F10> {tk_firstMenu %W} 
+bind $win.col1.w1.f1.priority <Mod2-Key> {tk_traverseToMenu %W %A} 
+
+tk_menus $win $win.col1.w1.f1.priority
+
+menu $win.col1.w1.f1.priority.m\
+  -font [Font $win Medium]
+tk_bindForTraversal $win.col1.w1.f1.priority.m
+bind $win.col1.w1.f1.priority.m <F10> {tk_firstMenu %W} 
+bind $win.col1.w1.f1.priority.m <Mod2-Key> {tk_traverseToMenu %W %A} 
+  $win.col1.w1.f1.priority.m add radiobutton\
+    -label {Super Fast}\
+    -command {SetPriority 4}\
+    -value {4}\
+    -variable Priority
+  $win.col1.w1.f1.priority.m add radiobutton\
+    -label {Fast}\
+    -command {SetPriority 3}\
+    -value {3}\
+    -variable Priority
+  $win.col1.w1.f1.priority.m add radiobutton\
+    -label {Normal}\
+    -command {SetPriority 2}\
+    -value {2}\
+    -variable Priority
+  $win.col1.w1.f1.priority.m add radiobutton\
+    -label {Slow}\
+    -command {SetPriority 1}\
+    -value {1}\
+    -variable Priority
+  $win.col1.w1.f1.priority.m add radiobutton\
+    -label {Super Slow}\
+    -command {SetPriority 0}\
+    -value {0}\
+    -variable Priority
+
+SetHelp $win.col1.w1.f1.windows Head.WindowsMenu
+
+menubutton $win.col1.w1.f1.windows\
+  -menu $win.col1.w1.f1.windows.m\
+  -text {Windows}\
+  -font [Font $win Medium]\
+  -variable $win.postedMenu
+tk_bindForTraversal $win.col1.w1.f1.windows
+bind $win.col1.w1.f1.windows <F10> {tk_firstMenu %W} 
+bind $win.col1.w1.f1.windows <Mod2-Key> {tk_traverseToMenu %W %A} 
+
+tk_menus $win $win.col1.w1.f1.windows
+
+menu $win.col1.w1.f1.windows.m\
+  -font [Font $win Medium]
+tk_bindForTraversal $win.col1.w1.f1.windows.m
+bind $win.col1.w1.f1.windows.m <F10> {tk_firstMenu %W} 
+bind $win.col1.w1.f1.windows.m <Mod2-Key> {tk_traverseToMenu %W %A} 
+  $win.col1.w1.f1.windows.m add command\
+    -label {Budget}\
+    -command "UIShowBudgetAndWait"
+  $win.col1.w1.f1.windows.m add command\
+    -label {Evaluation}\
+    -command "ShowEvaluationOf $win"
+  $win.col1.w1.f1.windows.m add command\
+    -label {Graph}\
+    -command "ShowGraphOf $win"
+  #$win.col1.w1.f1.windows.m add command\
+  #  -label {Map}\
+  #  -command "ShowMapOf $win"
+  #$win.col1.w1.f1.windows.m add command\
+  #  -label {Editor}\
+  #  -command "ShowEditorOf $win"
+  #$win.col1.w1.f1.windows.m add command\
+  #  -label {Frob}\
+  #  -command "ShowFrobOf $win"
+  #$win.col1.w1.f1.windows.m add command\
+  #  -label {New Map}\
+  #  -command "NewMapOf $win"
+  #$win.col1.w1.f1.windows.m add command\
+  #  -label {New Editor}\
+  #  -command "NewEditorOf $win"
+
+LinkWindow $win.m0 $win.col1.w1.f1.micropolis.m
+LinkWindow $win.m1 $win.col1.w1.f1.options.m
+LinkWindow $win.m2 $win.col1.w1.f1.disasters.m
+LinkWindow $win.m3 $win.col1.w1.f1.priority.m
+LinkWindow $win.m4 $win.col1.w1.f1.windows.m
+
+LinkWindow $win.b0 $win.col1.w1.f1.micropolis
+LinkWindow $win.b1 $win.col1.w1.f1.options
+LinkWindow $win.b2 $win.col1.w1.f1.disasters
+LinkWindow $win.b3 $win.col1.w1.f1.priority
+LinkWindow $win.b4 $win.col1.w1.f1.windows
+
+pack append $win.col1.w1.f1\
+  $win.col1.w1.f1.micropolis   {left frame nw} \
+  $win.col1.w1.f1.options      {left frame nw} \
+  $win.col1.w1.f1.disasters    {left frame nw} \
+  $win.col1.w1.f1.priority     {left frame nw} \
+  $win.col1.w1.f1.windows      {left frame nw}
+
+frame $win.col1.w1.f2\
+  -background #BFBFBF \
+  -borderwidth 1\
+  -relief raised
+
+frame $win.col1.w1.f2.f1\
+  -background #BFBFBF \
+  -borderwidth 1\
+  -relief flat
+
+frame $win.col1.w1.f2.f1.frame \
+  -background #BFBFBF \
+  -borderwidth 0\
+  -relief flat
+
+canvas $win.col1.w1.f2.f1.frame.demand\
+  -scrollincrement 0 \
+  -borderwidth 0 \
+  -background #BFBFBF \
+  -width 80 -height 55
+LinkWindow $win.demand $win.col1.w1.f2.f1.frame.demand
+$win.col1.w1.f2.f1.frame.demand create bitmap 41 4 \
+  -tags picture \
+  -bitmap "@images/demandg.xpm" \
+  -anchor nw
+$win.col1.w1.f2.f1.frame.demand create rectangle -10 -10 1 1 \
+  -tags r \
+  -fill [Color $win #00ff00 #000000]
+$win.col1.w1.f2.f1.frame.demand create rectangle -10 -10 1 1 \
+  -tags c \
+  -fill [Color $win #0000ff #000000]
+$win.col1.w1.f2.f1.frame.demand create rectangle -10 -10 1 1 \
+  -tags i \
+  -fill [Color $win #ffff00 #000000]
+$win.col1.w1.f2.f1.frame.demand create bitmap 0 4 \
+  -tags micropolis \
+  -bitmap "@images/micropoliss.xpm" \
+  -anchor nw 
+
+$win.col1.w1.f2.f1.frame.demand bind micropolis <1> {TogglePause}
+$win.col1.w1.f2.f1.frame.demand bind micropolis <2> {TogglePause}
+$win.col1.w1.f2.f1.frame.demand bind micropolis <3> {TogglePause}
+$win.col1.w1.f2.f1.frame.demand bind picture <1> "ToggleEvaluationOf $win"
+$win.col1.w1.f2.f1.frame.demand bind picture <2> "ToggleEvaluationOf $win"
+$win.col1.w1.f2.f1.frame.demand bind picture <3> "ToggleEvaluationOf $win"
+$win.col1.w1.f2.f1.frame.demand bind r <1> "ToggleEvaluationOf $win"
+$win.col1.w1.f2.f1.frame.demand bind r <2> "ToggleEvaluationOf $win"
+$win.col1.w1.f2.f1.frame.demand bind r <3> "ToggleEvaluationOf $win"
+$win.col1.w1.f2.f1.frame.demand bind c <1> "ToggleEvaluationOf $win"
+$win.col1.w1.f2.f1.frame.demand bind c <2> "ToggleEvaluationOf $win"
+$win.col1.w1.f2.f1.frame.demand bind c <3> "ToggleEvaluationOf $win"
+$win.col1.w1.f2.f1.frame.demand bind i <1> "ToggleEvaluationOf $win"
+$win.col1.w1.f2.f1.frame.demand bind i <2> "ToggleEvaluationOf $win"
+$win.col1.w1.f2.f1.frame.demand bind i <3> "ToggleEvaluationOf $win"
+
+SetHelp $win.col1.w1.f2.f1.frame.demand Head.Demand
+
+frame $win.col1.w1.f2.f1.frame.graphframe \
+  -background #BFBFBF \
+  -borderwidth 1\
+  -relief sunken
+
+graphview $win.col1.w1.f2.f1.frame.graphframe.graph\
+  -background #BFBFBF \
+  -font [Font $win Tiny]
+$win.col1.w1.f2.f1.frame.graphframe.graph Range 10
+$win.col1.w1.f2.f1.frame.graphframe.graph Mask 7
+LinkWindow $win.graphview $win.col1.w1.f2.f1.frame.graphframe.graph
+bind $win.col1.w1.f2.f1.frame.graphframe.graph <ButtonPress> "ToggleGraphOf $win"
+
+
+SetHelp $win.col1.w1.f2.f1.frame.graphframe.graph Head.Graph
+
+pack append $win.col1.w1.f2.f1.frame.graphframe \
+  $win.col1.w1.f2.f1.frame.graphframe.graph    {left expand fill}
+
+pack append $win.col1.w1.f2.f1.frame \
+  $win.col1.w1.f2.f1.frame.demand              {left frame sw padx 4} \
+  $win.col1.w1.f2.f1.frame.graphframe  {right frame center expand fill}
+
+frame $win.col1.w1.f2.f1.info\
+  -background #BFBFBF \
+  -borderwidth 1\
+  -relief flat
+
+dateview $win.col1.w1.f2.f1.info.date\
+  -background #BFBFBF \
+  -width 20 \
+  -font [Font $win Medium]
+LinkWindow $win.date $win.col1.w1.f2.f1.info.date
+
+SetHelp $win.col1.w1.f2.f1.info.date Head.Date
+
+label $win.col1.w1.f2.f1.info.fundslabel\
+  -background #BFBFBF \
+  -relief flat\
+  -font [Font $win Medium]\
+  -text {}\
+  -anchor w\
+  -width 20
+LinkWindow $win.funds $win.col1.w1.f2.f1.info.fundslabel
+bind $win.col1.w1.f2.f1.info.fundslabel <ButtonPress> "UIShowBudgetAndWait"
+
+SetHelp $win.col1.w1.f2.f1.info.fundslabel Head.Funds
+
+label $win.col1.w1.f2.f1.info.rate\
+  -background #BFBFBF \
+  -relief flat\
+  -font [Font $win Medium]\
+  -text {Tax Rate: 7%} \
+  -anchor w\
+  -width 20
+LinkWindow $win.taxlabel $win.col1.w1.f2.f1.info.rate
+bind $win.col1.w1.f2.f1.info.rate <ButtonPress> "UIShowBudgetAndWait"
+
+
+scale $win.col1.w1.f2.f1.info.scale\
+  -background #BFBFBF \
+  -command {SetTaxRate}\
+  -orient horizontal\
+  -showvalue false\
+  -font [Font $win Medium]\
+  -sliderlength 15\
+  -to 20
+$win.col1.w1.f2.f1.info.scale set 7
+LinkWindow $win.taxrate $win.col1.w1.f2.f1.info.scale
+
+
+pack append $win.col1.w1.f2.f1.info \
+  $win.col1.w1.f2.f1.info.date         {top frame nw} \
+  $win.col1.w1.f2.f1.info.fundslabel   {top frame nw} \
+  $win.col1.w1.f2.f1.info.rate         {top frame nw} \
+  $win.col1.w1.f2.f1.info.scale                {top frame nw fill expand}
+
+pack append $win.col1.w1.f2.f1 \
+  $win.col1.w1.f2.f1.frame             {left frame nw expand fill} \
+  $win.col1.w1.f2.f1.info              {left frame nw}
+
+frame $win.col1.w1.f2.f2\
+  -borderwidth 1 \
+  -relief flat
+tk_bindForTraversal $win.col1.w1.f2.f2
+bind $win.col1.w1.f2.f2 <F10> {tk_firstMenu %W} 
+bind $win.col1.w1.f2.f2 <Mod2-Key> {tk_traverseToMenu %W %A} 
+
+SetHelp $win.col1.w1.f2.f2 Head.Log
+
+scrollbar $win.col1.w1.f2.f2.scroll\
+  -command "$win.col1.w1.f2.f2.text yview" \
+  -borderwidth 1
+
+SetHelp $win.col1.w1.f2.f2.scroll Head.Scrollbar
+
+text $win.col1.w1.f2.f2.text \
+  -yscroll "$win.col1.w1.f2.f2.scroll set" \
+  -borderwidth 1 \
+  -relief sunken \
+  -wrap word \
+  -state disabled \
+  -height 5 \
+  -font [Font $win Text]
+LinkWindow $win.text $win.col1.w1.f2.f2.text
+
+$win.col1.w1.f2.f2.text tag configure status \
+  -font [Font $win Message]
+
+$win.col1.w1.f2.f2.text tag configure message \
+  -font [Font $win Message] \
+  -foreground #ffffff \
+  -background #3f3f3f
+
+$win.col1.w1.f2.f2.text tag configure alert \
+  -font [Font $win Alert] \
+  -foreground [Color $win #ff3f3f #000000]
+
+pack append $win.col1.w1.f2.f2 \
+  $win.col1.w1.f2.f2.scroll    {left frame center filly} \
+  $win.col1.w1.f2.f2.text      {right frame center fill expand}
+
+if {[sim MultiPlayerMode]} {
+  frame $win.col1.w1.f2.f3 \
+    -borderwidth 1 \
+    -relief flat
+  tk_bindForTraversal $win.col1.w1.f2.f3
+  bind $win.col1.w1.f2.f3 <F10> {tk_firstMenu %W} 
+  bind $win.col1.w1.f2.f3 <Mod2-Key> {tk_traverseToMenu %W %A} 
+
+  button $win.col1.w1.f2.f3.chat \
+    -font [Font $win Large] \
+    -relief flat \
+    -text {Chat:}
+  LinkWindow $win.chat $win.col1.w1.f2.f3.chat
+  bind $win.col1.w1.f2.f3.chat <1> {ChatDown %W}
+  bind $win.col1.w1.f2.f3.chat <ButtonRelease-1> {ChatUp %W}
+
+  SetHelp $win.col1.w1.f2.f3.chat Head.Chat
+
+  entry $win.col1.w1.f2.f3.entry \
+    -relief sunken\
+    -text {}\
+    -foreground #ffffff\
+    -background #4f4f4f\
+    -textvariable $win.col1.w1.f2.f3.entry.value\
+    -font [Font $win Message]
+  global $win.col1.w1.f2.f3.entry.value
+  set $win.col1.w1.f2.f3.entry.value ""
+  tk_bindForTraversal $win.col1.w1.f2.f3.entry
+  bind $win.col1.w1.f2.f3.entry <F10> {tk_firstMenu %W} 
+  bind $win.col1.w1.f2.f3.entry <Mod2-Key> {tk_traverseToMenu %W %A}
+  bind $win.col1.w1.f2.f3.entry <Return> "DoEnterMessage %W %W.value"
+  bind $win.col1.w1.f2.f3.entry <Escape> "DoEvalMessage %W %W.value"
+  bind $win.col1.w1.f2.f3.entry <Any-Enter> {focus %W}
+  LinkWindow $win.entry $win.col1.w1.f2.f3.entry
+
+  SetHelp $win.col1.w1.f2.f3.entry Head.Entry
+}
+
+frame $win.col1.w2
+tk_bindForTraversal $win.col1.w2
+
+LinkWindow $win.w2 $win.col1.w2
+
+frame $win.col1.w3
+tk_bindForTraversal $win.col1.w3
+
+LinkWindow $win.w3 $win.col1.w3
+
+frame $win.col2
+tk_bindForTraversal $win.col2
+
+LinkWindow $win.col2 $win.col2
+
+#frame $win.col2.x1 -width 400 -height 400
+#tk_bindForTraversal $win.col2.x1
+
+#LinkWindow $win.x1 $win.col2.x1
+
+#frame $win.col2.x2
+#tk_bindForTraversal $win.col2.x2
+
+#LinkWindow $win.x2 $win.col2.x2
+
+#frame $win.col2.x3
+#tk_bindForTraversal $win.col2.x3
+
+#LinkWindow $win.x3 $win.col2.x3
+
+#frame $win.col2.x4
+#tk_bindForTraversal $win.col2.x4
+
+#LinkWindow $win.x4 $win.col2.x4
+
+if {[sim MultiPlayerMode]} {
+
+  pack append $win.col1.w1.f2.f3 \
+    $win.col1.w1.f2.f3.chat    {left frame center padx 4} \
+    $win.col1.w1.f2.f3.entry   {left frame center fillx expand padx 4}
+
+  pack append $win.col1.w1.f2 \
+    $win.col1.w1.f2.f1         {top frame center fillx} \
+    $win.col1.w1.f2.f2         {top frame center expand fill} \
+    $win.col1.w1.f2.f3         {top frame center fillx}
+
+} else {
+
+  pack append $win.col1.w1.f2 \
+    $win.col1.w1.f2.f1         {top frame center fillx} \
+    $win.col1.w1.f2.f2         {top frame center expand fill}
+
+}
+
+pack append $win.col1.w1\
+  $win.col1.w1.f1              {top frame center fillx} \
+  $win.col1.w1.f2              {top frame center expand fill}
+
+#pack append $win\
+#    $win.col1                 {left frame center filly} \
+#    $win.col2                 {left frame center expand fill}
+
+place configure $win.col1\
+  -x 0\
+  -y 0\
+  -width $HeadPanelWidth\
+  -height $screenheight
+
+pack append $win.col1\
+    $win.col1.w1               {top frame nw fillx} \
+    $win.col1.w2               {top frame nw fillx} \
+    $win.col1.w3               {bottom frame sw fillx} 
+
+#place configure $win.col1.w1\
+#  -x 0\
+#  -y 0\
+#  -width $HeadPanelWidth\
+#  -height $HeadPanelHeight
+
+#place configure $win.col1.w2\
+#  -x 0\
+#  -y $HeadPanelHeight\
+#  -width $MapPanelWidth\
+#  -height $MapPanelHeight
+
+#place configure $win.col1.w3\
+#  -x 0\
+#  -y [expr "$HeadPanelHeight + $MapPanelHeight"]\
+#  -width $NoticePanelWidth\
+#  -height [expr "$screenheight - ($HeadPanelHeight + $MapPanelHeight)"]
+
+place configure $win.col2\
+  -x [expr "$HeadPanelWidth + 5"]\
+  -y 0\
+  -width [expr "($screenwidth - $HeadPanelWidth) - 5"]\
+  -height $screenheight
+
+#pack append $win.col2\
+#    $win.col2.x1              {top frame nw fillx} \
+#    $win.col2.x2              {top frame nw fillx} \
+#    $win.col2.x3              {top frame nw expand fill} \
+#    $win.col2.x4              {top frame nw fillx}
+
+SetupSoundServer $win
+
+InitHead $win
+InitHeadMenus $win
+
+update idletasks
diff --git a/res/whelp.tcl b/res/whelp.tcl
new file mode 100644 (file)
index 0000000..be2d1a2
--- /dev/null
@@ -0,0 +1,131 @@
+# Window: Help, for Unix Micropolis.
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+global HelpWindows
+set n [Unique]
+set win .help$n
+set HelpWindows [linsert $HelpWindows 0 $win]
+
+LinkWindow $head.help $win
+LinkWindow $win.head $head
+
+catch "destroy $win"
+toplevel $win -screen $display
+
+SetHelp $win Help
+
+wm title $win {Micropolis Help}
+wm iconname $win {Micropolis Help}
+wm geometry $win 400x240+5+5
+wm positionfrom $win user
+wm sizefrom $win user
+wm maxsize $win 700 700
+wm minsize $win 100 100
+wm protocol $win delete "DeleteWindow help HelpWindows"
+wm transient $win $head
+
+frame $win.top \
+  -relief raised \
+  -borderwidth 1
+LinkWindow $win.background $win.top
+
+label $win.top.title \
+  -text {Help} \
+  -borderwidth 2 \
+  -relief raised \
+  -font [Font $win Big]
+LinkWindow $win.title $win.top.title
+
+SetHelp $win.top.title Help.Title
+
+scrollbar $win.top.scroll\
+  -command "$win.top.text yview" \
+  -borderwidth 1
+
+SetHelp $win.top.scroll Help.Scrollbar
+
+text $win.top.text \
+  -yscroll "$win.top.scroll set" \
+  -borderwidth 2 \
+  -relief flat \
+  -wrap word \
+  -state disabled \
+  -font [Font $win Large]
+LinkWindow $win.text $win.top.text
+
+SetHelp $win.top.text Help.Text
+
+pack append $win.top\
+  $win.top.title       {top frame center fillx} \
+  $win.top.scroll      {left frame center filly} \
+  $win.top.text                {right frame center expand fill}
+
+button $win.dismiss\
+  -font [Font $win Large]\
+  -text {Dismiss}\
+  -command "wm withdraw $win"
+
+SetHelp $win.dismiss Help.Dismiss
+
+pack append $win\
+  $win.dismiss         {bottom frame center fillx}\
+  $win.top             {left frame center expand fill}
+
+update idletasks
diff --git a/res/wish.tcl b/res/wish.tcl
new file mode 100644 (file)
index 0000000..add4f41
--- /dev/null
@@ -0,0 +1,25 @@
+# wish.tcl --
+#
+# This script is invoked by the "wish" program whenever it starts up.
+# It invokes initialization scripts for Tcl and Tk, then does a few
+# wish-specific things like setting the window geometry, if one was
+# specified.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/wish.tcl,v 1.1 92/03/06 09:40:56 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+source [info library]/init.tcl
+source $tk_library/tk.tcl
+
+if [info exists geometry] {
+    wm geometry . $geometry
+}
diff --git a/res/wishx.tcl b/res/wishx.tcl
new file mode 100644 (file)
index 0000000..c50b775
--- /dev/null
@@ -0,0 +1,24 @@
+# wish.tcl --
+#
+# This script is invoked by the "wish" program whenever it starts up.
+# It invokes initialization scripts for Tcl and Tk, then does a few
+# wish-specific things like setting the window geometry, if one was
+# specified.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/wish.tcl,v 1.1 92/03/06 09:40:56 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+load tk.tcl
+
+if [info exists geometry] {
+    wm geometry . $geometry
+}
diff --git a/res/wmap.tcl b/res/wmap.tcl
new file mode 100644 (file)
index 0000000..73e7d6f
--- /dev/null
@@ -0,0 +1,254 @@
+# Windows: Maps, for Unix Micropolis.
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+global MapWindows
+set n [Unique]
+set parent [WindowLink $head.w2]
+set win $parent.map$n
+set MapWindows [linsert $MapWindows 0 $win]
+
+global MapState.$win
+set MapState.$win 0
+
+LinkWindow $head.map $win
+LinkWindow $win.head $head
+LinkWindow $win.parent $parent
+LinkWindow $win.top $win
+
+catch "destroy $win"
+frame $win
+
+SetHelp $win Map
+
+bind $win <Visibility> {[WindowLink %W.view] Visible [string compare %s FullyObscured]}
+bind $win <Map> {[WindowLink %W.view] Visible 1}
+bind $win <Unmap> {[WindowLink %W.view] Visible 0}
+
+frame $win.centerframe\
+  -borderwidth 1\
+  -relief sunken
+
+SetHelp $win.centerframe Map.View
+
+mapview $win.centerframe.view\
+  -font [Font $win Large]
+$win.centerframe.view size [expr "[sim WorldX] * 3"] [expr "[sim WorldY] * 3"]
+
+LinkWindow $win.view $win.centerframe.view
+LinkWindow $win.centerframe.view.pallet $win.topframe
+LinkWindow $win.centerframe.view.win $win
+
+bind $win.centerframe.view <1> {MapPanDown %W %x %y}
+bind $win.centerframe.view <B1-Motion> {MapPanDrag %W %x %y}
+bind $win.centerframe.view <ButtonRelease-1> {MapPanUp %W %x %y}
+
+bind $win.centerframe.view <2> {MapPanDown %W %x %y}
+bind $win.centerframe.view <B2-Motion> {MapPanDrag %W %x %y}
+bind $win.centerframe.view <ButtonRelease-2> {MapPanUp %W %x %y}
+
+bind $win.centerframe.view <3> {MapPanDown %W %x %y}
+bind $win.centerframe.view <B3-Motion> {MapPanDrag %W %x %y}
+bind $win.centerframe.view <ButtonRelease-3> {MapPanUp %W %x %y}
+
+pack append $win.centerframe\
+  $win.centerframe.view {top frame center expand}
+
+frame $win.topframe\
+  -borderwidth 1\
+  -relief raised
+
+menubutton $win.topframe.zones\
+  -menu $win.topframe.zones.m\
+  -text {Zones}\
+  -font [Font $win Medium]\
+  -variable $win.postedMenu\
+  -borderwidth 1\
+  -relief flat
+LinkWindow $win.zones $win.topframe.zones
+tk_bindForTraversal $win.topframe.zones
+bind $win.topframe.zones <F10> {tk_firstMenu %W} 
+bind $win.topframe.zones <Mod2-Key> {tk_traverseToMenu %W %A} 
+tk_menus $win $win.topframe.zones
+
+SetHelp $win.topframe.zones Map.Zones
+
+menu $win.topframe.zones.m\
+  -font [Font $win Medium]
+tk_bindForTraversal $win.topframe.zones.m
+bind $win.topframe.zones.m <F10> {tk_firstMenu %W} 
+bind $win.topframe.zones.m <Mod2-Key> {tk_traverseToMenu %W %A} 
+  $win.topframe.zones.m add radiobutton\
+    -label {All}\
+    -variable MapState.$win\
+    -value 0\
+    -command "SetMapState $win 0"
+  $win.topframe.zones.m add radiobutton\
+    -label {Residential}\
+    -variable MapState.$win\
+    -value 1\
+    -command "SetMapState $win 1"
+  $win.topframe.zones.m add radiobutton\
+    -label {Commercial}\
+    -variable MapState.$win\
+    -value 2\
+    -command "SetMapState $win 2"
+  $win.topframe.zones.m add radiobutton\
+    -label {Industrial}\
+    -variable MapState.$win\
+    -value 3\
+    -command "SetMapState $win 3"
+  $win.topframe.zones.m add radiobutton\
+    -label {Transportation}\
+    -variable MapState.$win\
+    -value 5\
+    -command "SetMapState $win 5"
+  # Disabled dynamic filter for now.
+  #$win.topframe.zones.m add radiobutton\
+  #  -label {Dynamic}\
+  #  -variable MapState.$win\
+  #  -value 14\
+  #  -command "SetMapState $win 14"
+
+menubutton $win.topframe.overlays\
+  -menu $win.topframe.overlays.m\
+  -text {Overlays}\
+  -font [Font $win Medium]\
+  -variable $win.postedMenu\
+  -borderwidth 1\
+  -relief flat
+LinkWindow $win.overlays $win.topframe.overlays
+tk_bindForTraversal $win.topframe.overlays
+bind $win.topframe.overlays <F10> {tk_firstMenu %W} 
+bind $win.topframe.overlays <Mod2-Key> {tk_traverseToMenu %W %A} 
+tk_menus $win $win.topframe.overlays
+
+SetHelp $win.topframe.overlays Map.Overlays
+
+menu $win.topframe.overlays.m\
+  -font [Font $win Medium]
+tk_bindForTraversal $win.topframe.overlays.m
+bind $win.topframe.overlays.m <F10> {tk_firstMenu %W} 
+bind $win.topframe.overlays.m <Mod2-Key> {tk_traverseToMenu %W %A} 
+  $win.topframe.overlays.m add radiobutton\
+    -label {Population Density}\
+    -variable MapState.$win\
+    -value 6\
+    -command "SetMapState $win 6"
+  $win.topframe.overlays.m add radiobutton\
+    -label {Rate of Growth}\
+    -variable MapState.$win\
+    -value 7\
+    -command "SetMapState $win 7"
+  $win.topframe.overlays.m add radiobutton\
+    -label {Land Value}\
+    -variable MapState.$win\
+    -value 11\
+    -command "SetMapState $win 11"
+  $win.topframe.overlays.m add radiobutton\
+    -label {Crime Rate}\
+    -variable MapState.$win\
+    -value 10\
+    -command "SetMapState $win 10"
+  $win.topframe.overlays.m add radiobutton\
+    -label {Pollution Density}\
+    -variable MapState.$win\
+    -value 9\
+    -command "SetMapState $win 9"
+  $win.topframe.overlays.m add radiobutton\
+    -label {Traffic Density}\
+    -variable MapState.$win\
+    -value 8\
+    -command "SetMapState $win 8"
+  $win.topframe.overlays.m add radiobutton\
+    -label {Power Grid}\
+    -variable MapState.$win\
+    -value 4\
+    -command "SetMapState $win 4"
+  $win.topframe.overlays.m add radiobutton\
+    -label {Fire Coverage}\
+    -variable MapState.$win\
+    -value 12\
+    -command "SetMapState $win 12"
+  $win.topframe.overlays.m add radiobutton\
+    -label {Police Coverage}\
+    -variable MapState.$win\
+    -value 13\
+    -command "SetMapState $win 13"
+
+label $win.topframe.legend\
+  -bitmap "@images/legendn.xpm" \
+  -font [Font $win Medium]
+LinkWindow $win.legend $win.topframe.legend
+
+pack append $win.topframe\
+  $win.topframe.zones          {left frame nw} \
+  $win.topframe.overlays       {left frame nw} \
+  $win.topframe.legend         {right frame ne}
+
+pack append $win\
+  $win.topframe                        {top frame center fillx} \
+  $win.centerframe             {top frame center fill}
+
+pack append $parent\
+  $win {top frame nw expand fill}
+
+InitMap $win
+
+update idletasks
diff --git a/res/wnotice.tcl b/res/wnotice.tcl
new file mode 100644 (file)
index 0000000..d233c1c
--- /dev/null
@@ -0,0 +1,170 @@
+# Window: Notices, for Unix Micropolis.
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+
+global NoticeWindows
+set n [Unique]
+set parent [WindowLink $head.w3]
+set win $parent.notice$n
+set NoticeWindows [linsert $NoticeWindows 0 $win]
+
+LinkWindow $head.notice $win
+LinkWindow $win.head $head
+LinkWindow $win.parent $parent
+
+catch "destroy $win"
+frame $win
+
+SetHelp $win Notice
+
+bind $win <Visibility> {[WindowLink %W.view] Visible [string compare %s FullyObscured]}
+bind $win <Map> {[WindowLink %W.view] Visible 1}
+bind $win <Unmap> {[WindowLink %W.view] Visible 0}
+
+frame $win.top \
+  -relief raised \
+  -borderwidth 1
+LinkWindow $win.background $win.top
+
+label $win.top.title \
+  -borderwidth 2 \
+  -relief raised \
+  -font [Font $win Big]
+LinkWindow $win.title $win.top.title
+
+SetHelp $win.top.title Notice.Title
+
+text $win.top.text \
+  -borderwidth 2 \
+  -relief flat \
+  -wrap word \
+  -state disabled \
+  -font [Font $win Large]
+LinkWindow $win.text $win.top.text
+
+SetHelp $win.top.text Notice.Text
+
+global ResourceDir
+
+button $win.top.text.left \
+  -command "UIMakeSound fancy HeavyTraffic" \
+  -font [Font $win Large]\
+  -borderwidth 1 \
+  -relief flat
+LinkWindow $win.left $win.top.text.left
+
+button $win.top.text.middle \
+  -command "UIMakeSound fancy Computer" \
+  -font [Font $win Large]\
+  -borderwidth 1 \
+  -relief flat
+LinkWindow $win.middle $win.top.text.middle
+
+button $win.top.text.right \
+  -command "UIMakeSound fancy QuackQuack" \
+  -font [Font $win Large]\
+  -borderwidth 1 \
+  -relief flat
+LinkWindow $win.right $win.top.text.right
+
+frame $win.top.viewframe\
+  -borderwidth 4\
+  -relief flat
+LinkWindow $win.viewframe $win.top.viewframe
+
+SetHelp $win.top.viewframe Notice.View
+
+frame $win.top.viewframe.f\
+  -cursor hand2\
+  -borderwidth 1\
+  -relief sunken
+
+pack append $win.top.viewframe\
+  $win.top.viewframe.f \
+      {top frame center expand fill}
+
+editorview $win.top.viewframe.f.view \
+  -font [Font $win Big]\
+  -width 128 -height 32
+LinkWindow $win.view $win.top.viewframe.f.view
+$win.top.viewframe.f.view ShowMe 0
+bind $win.top.viewframe.f.view <ButtonPress> \
+      "ComeToMe %W"
+
+pack append $win.top.viewframe.f\
+  $win.top.viewframe.f.view \
+      {top frame center expand fill}
+
+pack append $win.top\
+  $win.top.title       {top frame center fillx} \
+  $win.top.text                {right frame center expand fill}
+
+button $win.dismiss\
+  -font [Font $win Large]\
+  -text {Dismiss}\
+  -command "pack unpack $win"
+
+SetHelp $win.dismiss Notice.Dismiss
+
+pack append $win\
+  $win.dismiss         {bottom frame center fillx} \
+  $win.top             {left frame center expand fill}
+
+update idletasks
diff --git a/res/wplayer.tcl b/res/wplayer.tcl
new file mode 100644 (file)
index 0000000..f8831b4
--- /dev/null
@@ -0,0 +1,176 @@
+# Window: Player, for Unix Micropolis.
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+#
+global PlayerWindows
+set n [Unique]
+set win .player$n
+set PlayerWindows [linsert $PlayerWindows 0 $win]
+
+LinkWindow $head.player $win
+LinkWindow $win.head $head
+
+catch "destroy $win"
+toplevel $win -screen $display
+
+SetHelp $win Player
+
+wm title $win {Micropolis Players}
+wm iconname $win {Micropolis Players}
+wm geometry $win 400x250+5+5
+wm positionfrom $win user
+wm sizefrom $win user
+wm maxsize $win 700 700
+wm minsize $win 100 100
+wm protocol $win delete "DeleteWindow player PlayerWindows"
+wm transient $win $head
+
+frame $win.top \
+  -relief raised \
+  -borderwidth 1
+LinkWindow $win.background $win.top
+
+label $win.top.label \
+  -text "X11 Servers of Micropolis Players" \
+  -font [Font $win Large]
+
+text $win.top.text \
+  -borderwidth 2 \
+  -relief flat \
+  -wrap word \
+  -state normal \
+  -height 4 \
+  -font [Font $win Medium]
+LinkWindow $win.text $win.top.text
+$win.top.text delete 0.0 end
+$win.top.text insert end {\
+Micropolis is connected to the X11 servers listed above.
+To add another player to the game, enter their display name.
+If you don't have a "Multi Player" license, you can just \
+add more players on your own display, by entering ":0".}
+
+$win.top.text configure -state disabled
+
+frame $win.top.f \
+  -relief flat \
+  -borderwidth 1
+
+SetHelp $win.top.f Player.Display
+
+button $win.top.f.add \
+  -text "Add Player on X11 Display:" \
+  -borderwidth 1 \
+  -font [Font $win Large] \
+  -command "DoNewPlayer $win"
+
+entry $win.top.f.display \
+  -relief sunken \
+  -font [Font $win Large] \
+  -text ""
+bind $win.top.f.display <Return> "DoNewPlayer $win"
+bind $win.top.f.display <Any-Enter> {focus %W}
+LinkWindow $win.display $win.top.f.display
+
+pack append $win.top.f \
+  $win.top.f.add       {left frame nw padx 4} \
+  $win.top.f.display   {left frame nw expand fillx padx 4}
+
+frame $win.top.g \
+  -relief flat \
+  -borderwidth 1
+
+SetHelp $win.top.g Player.Players
+
+scrollbar $win.top.g.scroll \
+  -borderwidth 1 \
+  -command "$win.top.g.list yview"
+
+listbox $win.top.g.list \
+  -relief sunken \
+  -borderwidth 1 \
+  -font [Font $win Large] \
+  -yscroll "$win.top.g.scroll set"
+LinkWindow $win.players $win.top.g.list
+
+pack append $win.top.g \
+  $win.top.g.scroll {left filly frame e} \
+  $win.top.g.list {right expand fill frame w}
+
+pack append $win.top \
+  $win.top.label       {top frame center fillx} \
+  $win.top.g           {top frame center expand fill} \
+  $win.top.text                {top frame center fill} \
+  $win.top.f           {top frame center fillx}
+
+button $win.dismiss\
+  -font [Font $win Large]\
+  -borderwidth 1 \
+  -text {Dismiss}\
+  -command "wm withdraw $win"
+
+SetHelp $win.dismiss Player.Dismiss
+
+pack append $win\
+  $win.top             {top frame center expand fill} \
+  $win.dismiss         {bottom frame center fillx}
+
+UpdatePlayers
+
+update idletasks
diff --git a/res/wscen.tcl b/res/wscen.tcl
new file mode 100644 (file)
index 0000000..7b2af7d
--- /dev/null
@@ -0,0 +1,176 @@
+# Window: Scenarios, for Unix Micropolis.
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+#
+global ScenarioWindows
+set n [Unique]
+set win .scenario$n
+
+LinkWindow $head.scenario $win
+LinkWindow $win.head $head
+LinkWindow $win.scenarioTarget -1
+LinkWindow $win.scenarioTargetDown -1
+
+catch "destroy $win"
+if {[catch "toplevel $win -screen $display"]} {
+  puts stderr "Couldn't open X11 display \"$display\"."
+  set win ""
+  return ""
+}
+
+wm title $win "Micropolis Scenarios"
+wm iconname $win {Micropolis Scenarios}
+wm geometry $win 1200x900+0+0
+wm withdraw $win
+wm protocol $win delete "DeleteScenarioWindow $win ;"
+wm fullscreen $win on
+
+set ScenarioWindows [linsert $ScenarioWindows 0 $win]
+
+SetHelp $win Scenario
+
+canvas $win.canvas \
+  -scrollincrement 0 \
+  -borderwidth 0 \
+  -background #000000 \
+  -width 1200 -height 900
+LinkWindow $win.canvas $win.canvas
+LinkWindow $win.canvas.w $win
+
+$win.canvas create bitmap 0 0 \
+  -tags background  \
+  -bitmap "@images/background-micropolis.xpm" \
+  -anchor nw
+
+$win.canvas bind background <ButtonPress> {HandleScenarioDown %W %x %y}
+$win.canvas bind background <ButtonRelease-1> {HandleScenarioUp %W %x %y}
+$win.canvas bind background <ButtonRelease-2> {HandleScenarioUp %W %x %y}
+$win.canvas bind background <ButtonRelease-3> {HandleScenarioUp %W %x %y}
+$win.canvas bind background <Motion> {HandleScenarioMove %W %x %y}
+$win.canvas bind background <Button1-Motion> {HandleScenarioMove %W %x %y}
+$win.canvas bind background <Button2-Motion> {HandleScenarioMove %W %x %y}
+$win.canvas bind background <Button3-Motion> {HandleScenarioMove %W %x %y}
+
+global ScenarioButtons
+set i 0
+set len [llength $ScenarioButtons]
+while {$i < $len} {
+  set data [lindex $ScenarioButtons $i]
+  set type [lindex $data 0]
+  set id [lindex $data 1]
+  set xx [lindex $data 5]
+  set yy [lindex $data 6]
+  set ww [lindex $data 7]
+  set hh [lindex $data 8]
+  
+  $win.canvas create bitmap $xx $yy \
+    -tags $id \
+    -anchor nw
+
+  $win.canvas bind $id <ButtonPress> {HandleScenarioDown %W %x %y}
+  $win.canvas bind $id <ButtonRelease-1> {HandleScenarioUp %W %x %y}
+  $win.canvas bind $id <ButtonRelease-2> {HandleScenarioUp %W %x %y}
+  $win.canvas bind $id <ButtonRelease-3> {HandleScenarioUp %W %x %y}
+  $win.canvas bind $id <Motion> {HandleScenarioMove %W %x %y}
+  $win.canvas bind $id <Button1-Motion> {HandleScenarioMove %W %x %y}
+  $win.canvas bind $id <Button2-Motion> {HandleScenarioMove %W %x %y}
+  $win.canvas bind $id <Button3-Motion> {HandleScenarioMove %W %x %y}
+
+  set i [expr "$i + 1"]
+}
+
+mapview $win.canvas.view \
+  -font [Font $win Large]
+LinkWindow $win.view $win.canvas.view
+$win.canvas.view size [expr "[sim WorldX] * 3"] [expr "[sim WorldY] * 3"]
+
+# Hide the editor rectangles.
+$win.canvas.view ShowEditors 0
+
+frame $win.canvas.name \
+  -borderwidth 2\
+  -relief flat
+
+SetHelp $win.name Scenario.Name
+
+label $win.canvas.name.namelabel \
+  -text {City Name:} \
+  -font [Font $win Text]
+
+entry $win.canvas.name.cityname \
+  -text {}\
+  -textvariable CityName \
+  -font [Font $win Text] \
+  -width 33
+bind $win.canvas.name.cityname <Return> "DoEnterCityName $win"
+bind $win.canvas.name.cityname <Any-Enter> {focus %W}
+LinkWindow $win.cityname $win.canvas.name.cityname
+
+pack append $win.canvas.name \
+  $win.canvas.name.namelabel   {left frame e}\
+  $win.canvas.name.cityname    {left frame e}
+
+place $win.canvas -x 0 -y 0
+place $win.canvas.view -x 534 -y 48
+place $win.canvas.name -x 530 -y 0
+
+InitScenario $win
+
+update idletasks
diff --git a/res/wscen_old.tcl b/res/wscen_old.tcl
new file mode 100644 (file)
index 0000000..b798b56
--- /dev/null
@@ -0,0 +1,427 @@
+# Window: Scenarios, for Unix Micropolis.
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+#
+global ScenarioWindows
+set n [Unique]
+set parent [WindowLink $head.col2]
+set win $parent.scenario$n
+set ScenarioWindows [linsert $ScenarioWindows 0 $win]
+
+global ScenarioPanelWidth
+global ScenarioPanelHeight
+
+LinkWindow $head.scenario $win
+LinkWindow $win.head $head
+LinkWindow $win.parent $parent
+
+catch "destroy $win"
+frame $win \
+  -width $ScenarioPanelWidth \
+  -height $ScenarioPanelHeight
+
+SetHelp $win Scenario
+
+frame $win.scen\
+  -borderwidth 0 -geometry 100x470
+
+label $win.scen.micropolis\
+  -bitmap "@images/micropolisl.xpm" \
+  -font [Font $win Medium]
+
+button $win.scen.newcity\
+  -command "UIGenerateNewCity" \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scncty.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.newcity Scenario.NewCity
+
+button $win.scen.loadcity\
+  -command "UILoadCity $head" \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/sclcty.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.loadcity Scenario.LoadCity
+
+button $win.scen.dullsville\
+  -command {UILoadScenario 1} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scdull.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.dullsville Scenario.Dullsville
+
+button $win.scen.sanfrancisco\
+  -command {UILoadScenario 2} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scsfo.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.sanfrancisco Scenario.SanFran
+
+button $win.scen.hamburg\
+  -command {UILoadScenario 3} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scham.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.hamburg Scenario.Hamburg
+
+button $win.scen.bern\
+  -command {UILoadScenario 4} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scbern.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.bern Scenario.Bern
+
+button $win.scen.tokyo\
+  -command {UILoadScenario 5} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/sctkyo.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.tokyo Scenario.Tokyo
+
+button $win.scen.rio\
+  -command {UILoadScenario 8} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scrio.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.rio Scenario.Rio
+
+button $win.scen.boston\
+  -command {UILoadScenario 7} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scbos.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.boston Scenario.Boston
+
+button $win.scen.detroit\
+  -command {UILoadScenario 6} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scdet.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.detroit Scenario.Detroit
+
+message $win.scen.labeldullville\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {Dullsville 1900
+Boredom}
+
+SetHelp $win.scen.labeldullville Scenario.Dullsville
+
+message $win.scen.labelsanfrancisco\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {San Francisco 1906
+Earthquake}
+
+SetHelp $win.scen.labelsanfrancisco Scenario.SanFran
+
+message $win.scen.labelhamburg\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {Hamburg 1944
+Bombing}
+
+SetHelp $win.scen.labelhamburg Scenario.Hamburg
+
+message $win.scen.labelbern\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {Bern 1965
+Traffic}
+
+SetHelp $win.scen.labelbern Scenario.Bern
+
+message $win.scen.labeltokyo\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {Tokyo 1957
+Monster Attack}
+
+SetHelp $win.scen.labeltokyo Scenario.Tokyo
+
+message $win.scen.labelrio\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {Rio de Janeiro 2047
+Coastal Flooding}
+
+SetHelp $win.scen.labelrio Scenario.Rio
+
+message $win.scen.labelboston\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {Boston 2010
+Nuclear Meltdown}
+
+SetHelp $win.scen.labelboston Scenario.Boston
+
+message $win.scen.labeldetroit\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {Detroit 1972
+Crime}
+
+SetHelp $win.scen.labeldetroit Scenario.Detroit
+
+place $win.scen.micropolis -anchor n -x 265 -y 25
+place $win.scen.newcity -x 160 -y 120
+place $win.scen.loadcity -x 300 -y 120
+place $win.scen.dullsville -x 20 -y 230
+place $win.scen.sanfrancisco -x 160 -y 230
+place $win.scen.hamburg -x 300 -y 230
+place $win.scen.bern -x 440 -y 230
+place $win.scen.tokyo -x 20 -y 350
+place $win.scen.rio -x 160 -y 350
+place $win.scen.boston -x 300 -y 350
+place $win.scen.detroit -x 440 -y 350
+place $win.scen.labeldullville -anchor n -x 54 -y 290
+place $win.scen.labelsanfrancisco -anchor n -x 194 -y 290
+place $win.scen.labelhamburg -anchor n -x 334 -y 290
+place $win.scen.labelbern -anchor n -x 474 -y 290
+place $win.scen.labeltokyo -anchor n -x 54 -y 410
+place $win.scen.labelrio -anchor n -x 194 -y 410
+place $win.scen.labelboston -anchor n -x 334 -y 410
+place $win.scen.labeldetroit -anchor n -x 474 -y 410
+
+BindSimButton $win.scen.newcity
+BindSimButton $win.scen.loadcity
+BindSimButton $win.scen.dullsville
+BindSimButton $win.scen.sanfrancisco
+BindSimButton $win.scen.hamburg
+BindSimButton $win.scen.bern
+BindSimButton $win.scen.tokyo
+BindSimButton $win.scen.rio
+BindSimButton $win.scen.boston
+BindSimButton $win.scen.detroit
+
+frame $win.name \
+  -borderwidth 2\
+  -relief flat
+
+SetHelp $win.name Scenario.Name
+
+label $win.name.namelabel \
+  -text {City Name:} \
+  -font [Font $win Text]
+
+entry $win.name.cityname \
+  -text {}\
+  -textvariable CityName \
+  -font [Font $win Text] \
+  -width 50
+bind $win.name.cityname <Return> "DoEnterCityName $win"
+bind $win.name.cityname <Any-Enter> {focus %W}
+LinkWindow $win.cityname $win.name.cityname
+
+pack append $win.name \
+  $win.name.namelabel  {left frame e}\
+  $win.name.cityname   {left frame e}
+
+frame $win.level \
+  -borderwidth 2\
+  -relief flat
+
+SetHelp $win.level Scenario.Level
+
+label $win.level.levellabel \
+  -text {Game Level:} \
+  -font [Font $win Text]
+
+frame $win.level.radio \
+  -borderwidth 0\
+  -relief flat
+
+radiobutton $win.level.radio.easy \
+  -text "Easy" -variable GameLevel -value 0 \
+  -command "DoSetGameLevel 0" \
+  -font [Font $win Large]
+
+radiobutton $win.level.radio.medium \
+  -text "Medium" -variable GameLevel -value 1 \
+  -command "DoSetGameLevel 1" \
+  -font [Font $win Large]
+
+radiobutton $win.level.radio.hard \
+  -text "Hard" -variable GameLevel -value 2 \
+  -command "DoSetGameLevel 2" \
+  -font [Font $win Large]
+
+pack append $win.level.radio \
+  $win.level.radio.easy                {top frame e expand fillx}\
+  $win.level.radio.medium      {top frame e expand fillx}\
+  $win.level.radio.hard                {top frame e expand fillx}
+
+frame $win.level.label \
+  -borderwidth 0\
+  -relief flat
+
+label $win.level.label.easylabel \
+  -text {Initial Funds: $20,000} \
+  -font [Font $win Large] \
+  -anchor w
+
+label $win.level.label.mediumlabel \
+  -text {Initial Funds: $10,000} \
+  -font [Font $win Large] \
+  -anchor w
+
+label $win.level.label.hardlabel \
+  -text {Initial Funds: $5,000} \
+  -font [Font $win Large] \
+  -anchor w
+
+pack append $win.level.label \
+  $win.level.label.easylabel           {top frame e expand fillx} \
+  $win.level.label.mediumlabel         {top frame e expand fillx} \
+  $win.level.label.hardlabel           {top frame e expand fillx}
+
+pack append $win.level \
+   $win.level.levellabel               {left frame ne} \
+   $win.level.radio                    {left frame ne} \
+   $win.level.label                    {left frame ne expand fillx}
+
+frame $win.buttons \
+  -borderwidth 0\
+  -relief flat -borderwidth 2
+
+button $win.buttons.previous \
+  -text {Previous Map}\
+  -font [Font $win Large]\
+  -command "PrevHistory"\
+  -relief raised \
+  -width 20
+LinkWindow $win.previous $win.buttons.previous
+
+SetHelp $win.buttons.previous Scenario.Previous
+
+frame $win.buttons.voteframe \
+  -borderwidth 0 \
+  -relief raised
+LinkWindow $win.voteframe $win.buttons.voteframe
+
+SetHelp $win.buttons.voteframe Scenario.Use
+
+button $win.buttons.voteframe.vote \
+  -font [Font $win Large]\
+  -text {    Use This Map    }\
+  -command "DoVote $win UseThisMap UIUseThisMap {}"\
+  -relief raised \
+  -borderwidth 1\
+  -width 20
+LinkWindow $win.vote $win.buttons.voteframe.vote
+
+pack append $win.buttons.voteframe\
+  $win.buttons.voteframe.vote  {top frame center}
+
+BindVotingButton $win $win.buttons.voteframe.vote UseThisMap
+
+button $win.buttons.next \
+  -font [Font $win Large]\
+  -text {Next Map}\
+  -command "NextHistory"\
+  -width 20
+LinkWindow $win.next $win.buttons.next
+
+SetHelp $win.buttons.next Scenario.Next
+
+pack append $win.buttons\
+  $win.buttons.previous                {left frame nw}\
+  $win.buttons.voteframe       {left frame nw}\
+  $win.buttons.next            {left frame nw}
+
+pack append $win\
+  $win.scen                    {top frame center fillx}\
+  $win.buttons                 {top frame center fillx}\
+  $win.name                    {top frame center fillx}\
+  $win.level                   {top frame center fillx}\
+
+#place configure $win -x 0 -y 0 -width $ScenarioPanelWidth -height $ScenarioPanelHeight
+
+InitScenario $win
+
+update idletasks
diff --git a/res/wscen_older.tcl b/res/wscen_older.tcl
new file mode 100644 (file)
index 0000000..d9db560
--- /dev/null
@@ -0,0 +1,427 @@
+# Window: Scenarios, for Unix Micropolis.
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+#
+global ScenarioWindows
+set n [Unique]
+set parent [WindowLink $head.col2]
+set win $parent.scenario$n
+set ScenarioWindows [linsert $ScenarioWindows 0 $win]
+
+global ScenarioPanelWidth
+global ScenarioPanelHeight
+
+LinkWindow $head.scenario $win
+LinkWindow $win.head $head
+LinkWindow $win.parent $parent
+
+catch "destroy $win"
+frame $win \
+  -width $ScenarioPanelWidth \
+  -height $ScenarioPanelHeight
+
+SetHelp $win Scenario
+
+frame $win.scen\
+  -borderwidth 0 -geometry 100x280
+
+label $win.scen.micropolis\
+  -bitmap "@images/micropolisl.xpm" \
+  -font [Font $win Medium]
+
+button $win.scen.newcity\
+  -command "UIGenerateNewCity" \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scncty.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.newcity Scenario.NewCity
+
+button $win.scen.loadcity\
+  -command "UILoadCity $head" \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/sclcty.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.loadcity Scenario.LoadCity
+
+button $win.scen.dullsville\
+  -command {UILoadScenario 1} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scdull.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.dullsville Scenario.Dullsville
+
+button $win.scen.sanfrancisco\
+  -command {UILoadScenario 2} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scsfo.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.sanfrancisco Scenario.SanFran
+
+button $win.scen.hamburg\
+  -command {UILoadScenario 3} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scham.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.hamburg Scenario.Hamburg
+
+button $win.scen.bern\
+  -command {UILoadScenario 4} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scbern.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.bern Scenario.Bern
+
+button $win.scen.tokyo\
+  -command {UILoadScenario 5} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/sctkyo.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.tokyo Scenario.Tokyo
+
+button $win.scen.rio\
+  -command {UILoadScenario 8} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scrio.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.rio Scenario.Rio
+
+button $win.scen.boston\
+  -command {UILoadScenario 7} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scbos.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.boston Scenario.Boston
+
+button $win.scen.detroit\
+  -command {UILoadScenario 6} \
+  -relief flat \
+  -borderwidth 0 \
+  -bitmap "@images/scdet.xpm" \
+  -font [Font $win Medium]
+
+SetHelp $win.scen.detroit Scenario.Detroit
+
+message $win.scen.labeldullville\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {Dullsville 1900
+Boredom}
+
+SetHelp $win.scen.labeldullville Scenario.Dullsville
+
+message $win.scen.labelsanfrancisco\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {San Francisco 1906
+Earthquake}
+
+SetHelp $win.scen.labelsanfrancisco Scenario.SanFran
+
+message $win.scen.labelhamburg\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {Hamburg 1944
+Bombing}
+
+SetHelp $win.scen.labelhamburg Scenario.Hamburg
+
+message $win.scen.labelbern\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {Bern 1965
+Traffic}
+
+SetHelp $win.scen.labelbern Scenario.Bern
+
+message $win.scen.labeltokyo\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {Tokyo 1957
+Monster Attack}
+
+SetHelp $win.scen.labeltokyo Scenario.Tokyo
+
+message $win.scen.labelrio\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {Rio de Janeiro 2047
+Coastal Flooding}
+
+SetHelp $win.scen.labelrio Scenario.Rio
+
+message $win.scen.labelboston\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {Boston 2010
+Nuclear Meltdown}
+
+SetHelp $win.scen.labelboston Scenario.Boston
+
+message $win.scen.labeldetroit\
+  -aspect 1500\
+  -font [Font $win Small] \
+  -justify center \
+  -text {Detroit 1972
+Crime}
+
+SetHelp $win.scen.labeldetroit Scenario.Detroit
+
+4lace $win.scen.micropolis -anchor n -x 205 -y 25
+place $win.scen.newcity -x 20 -y 10
+place $win.scen.loadcity -x 320 -y 10
+place $win.scen.dullsville -x 20 -y 80
+place $win.scen.sanfrancisco -x 120 -y 80
+place $win.scen.hamburg -x 220 -y 80
+place $win.scen.bern -x 320 -y 80
+place $win.scen.tokyo -x 20 -y 180
+place $win.scen.rio -x 120 -y 180
+place $win.scen.boston -x 220 -y 180
+place $win.scen.detroit -x 320 -y 180
+place $win.scen.labeldullville -anchor n -x 54 -y 140
+place $win.scen.labelsanfrancisco -anchor n -x 154 -y 140
+place $win.scen.labelhamburg -anchor n -x 254 -y 140
+place $win.scen.labelbern -anchor n -x 354 -y 140
+place $win.scen.labeltokyo -anchor n -x 54 -y 240
+place $win.scen.labelrio -anchor n -x 154 -y 240
+place $win.scen.labelboston -anchor n -x 254 -y 240
+place $win.scen.labeldetroit -anchor n -x 354 -y 240
+
+BindSimButton $win.scen.newcity
+BindSimButton $win.scen.loadcity
+BindSimButton $win.scen.dullsville
+BindSimButton $win.scen.sanfrancisco
+BindSimButton $win.scen.hamburg
+BindSimButton $win.scen.bern
+BindSimButton $win.scen.tokyo
+BindSimButton $win.scen.rio
+BindSimButton $win.scen.boston
+BindSimButton $win.scen.detroit
+
+frame $win.name \
+  -borderwidth 2\
+  -relief flat
+
+SetHelp $win.name Scenario.Name
+
+label $win.name.namelabel \
+  -text {City Name:} \
+  -font [Font $win Text]
+
+entry $win.name.cityname \
+  -text {}\
+  -textvariable CityName \
+  -font [Font $win Text] \
+  -width 50
+bind $win.name.cityname <Return> "DoEnterCityName $win"
+bind $win.name.cityname <Any-Enter> {focus %W}
+LinkWindow $win.cityname $win.name.cityname
+
+pack append $win.name \
+  $win.name.namelabel  {left frame e}\
+  $win.name.cityname   {left frame e}
+
+frame $win.level \
+  -borderwidth 2\
+  -relief flat
+
+SetHelp $win.level Scenario.Level
+
+label $win.level.levellabel \
+  -text {Game Level:} \
+  -font [Font $win Text]
+
+frame $win.level.radio \
+  -borderwidth 0\
+  -relief flat
+
+radiobutton $win.level.radio.easy \
+  -text "Easy" -variable GameLevel -value 0 \
+  -command "DoSetGameLevel 0" \
+  -font [Font $win Large]
+
+radiobutton $win.level.radio.medium \
+  -text "Medium" -variable GameLevel -value 1 \
+  -command "DoSetGameLevel 1" \
+  -font [Font $win Large]
+
+radiobutton $win.level.radio.hard \
+  -text "Hard" -variable GameLevel -value 2 \
+  -command "DoSetGameLevel 2" \
+  -font [Font $win Large]
+
+pack append $win.level.radio \
+  $win.level.radio.easy                {top frame e expand fillx}\
+  $win.level.radio.medium      {top frame e expand fillx}\
+  $win.level.radio.hard                {top frame e expand fillx}
+
+frame $win.level.label \
+  -borderwidth 0\
+  -relief flat
+
+label $win.level.label.easylabel \
+  -text {Initial Funds: $20,000} \
+  -font [Font $win Large] \
+  -anchor w
+
+label $win.level.label.mediumlabel \
+  -text {Initial Funds: $10,000} \
+  -font [Font $win Large] \
+  -anchor w
+
+label $win.level.label.hardlabel \
+  -text {Initial Funds: $5,000} \
+  -font [Font $win Large] \
+  -anchor w
+
+pack append $win.level.label \
+  $win.level.label.easylabel           {top frame e expand fillx} \
+  $win.level.label.mediumlabel         {top frame e expand fillx} \
+  $win.level.label.hardlabel           {top frame e expand fillx}
+
+pack append $win.level \
+   $win.level.levellabel               {left frame ne} \
+   $win.level.radio                    {left frame ne} \
+   $win.level.label                    {left frame ne expand fillx}
+
+frame $win.buttons \
+  -borderwidth 0\
+  -relief flat -borderwidth 2
+
+button $win.buttons.previous \
+  -text {Previous Map}\
+  -font [Font $win Large]\
+  -command "PrevHistory"\
+  -relief raised \
+  -width 20
+LinkWindow $win.previous $win.buttons.previous
+
+SetHelp $win.buttons.previous Scenario.Previous
+
+frame $win.buttons.voteframe \
+  -borderwidth 0 \
+  -relief raised
+LinkWindow $win.voteframe $win.buttons.voteframe
+
+SetHelp $win.buttons.voteframe Scenario.Use
+
+button $win.buttons.voteframe.vote \
+  -font [Font $win Large]\
+  -text {    Use This Map    }\
+  -command "DoVote $win UseThisMap UIUseThisMap {}"\
+  -relief raised \
+  -borderwidth 1\
+  -width 20
+LinkWindow $win.vote $win.buttons.voteframe.vote
+
+pack append $win.buttons.voteframe\
+  $win.buttons.voteframe.vote  {top frame center}
+
+BindVotingButton $win $win.buttons.voteframe.vote UseThisMap
+
+button $win.buttons.next \
+  -font [Font $win Large]\
+  -text {Next Map}\
+  -command "NextHistory"\
+  -width 20
+LinkWindow $win.next $win.buttons.next
+
+SetHelp $win.buttons.next Scenario.Next
+
+pack append $win.buttons\
+  $win.buttons.previous                {left frame nw}\
+  $win.buttons.voteframe       {left frame nw}\
+  $win.buttons.next            {left frame nw}
+
+pack append $win\
+  $win.scen                    {top frame center fillx}\
+  $win.buttons                 {top frame center fillx}\
+  $win.name                    {top frame center fillx}\
+  $win.level                   {top frame center fillx}\
+
+#place configure $win -x 0 -y 0 -width $ScenarioPanelWidth -height $ScenarioPanelHeight
+
+InitScenario $win
+
+update idletasks
diff --git a/res/wsplash.tcl b/res/wsplash.tcl
new file mode 100644 (file)
index 0000000..685e2b1
--- /dev/null
@@ -0,0 +1,101 @@
+# Window: Splash Screen, for Unix Micropolis.
+#
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+#
+global SplashWindows
+set n [Unique]
+set win .splash$n
+
+LinkWindow $head.splash $win
+LinkWindow $win.head $head
+
+catch "destroy $win"
+if {[catch "toplevel $win -screen $display"]} {
+  puts stderr "Couldn't open X11 display \"$display\"."
+  set win ""
+  return ""
+}
+
+wm title $win "Micropolis Splash Screen"
+wm iconname $win {Micropolis Splash Screen}
+wm geometry $win 1200x900+0+0
+wm withdraw $win
+wm protocol $win delete "DeleteSplashWindow $win ;"
+wm fullscreen $win on
+
+set SplashWindows [linsert $SplashWindows 0 $win]
+
+SetHelp $win Splash
+
+global SplashPanelWidth
+global SplashPanelHeight
+
+set SplashPanelWidth 1200
+set SplashPanelHeight 900
+
+label $win.splashscreen \
+  -font [Font $win Medium]
+LinkWindow $win.splashscreen $win.splashscreen
+
+place $win.splashscreen -x 0 -y 0
+
+InitSplash $win
+
+update idletasks
diff --git a/src/ASSETS.txt b/src/ASSETS.txt
new file mode 100644 (file)
index 0000000..d84e7d5
--- /dev/null
@@ -0,0 +1,315 @@
+Micropolis Assets:
+
+  This is a list of required and optional assets for Micropolis. 
+
+  As noted, some of them are for the current TCL/Tk based version of
+  Micropolis that we want to get out right away.  Others are for the more
+  advanced Python version that we're developing after releasing the
+  TCL/Tk version.
+
+  The TCL/Tk version currently works ok with its current assets, and
+  these are just suggestions that would improve it but are not
+  necessary. The Python version is not yet fully designed or
+  implemented, and it will be more open-ended and powerful, so this is
+  just a rough estimate of the assets it will need. 
+
+  User Interface Graphics and Icons
+
+    These aren't all necessary, but it would be nice to have some of
+    them to make the interface look nicer, more graphical, and kid
+    friendly.
+
+    The style should be international, kid oriented, big, bright,
+    saturated, simple. 
+
+    Icons should look good and be readable when shown in desaturated
+    gray scale on the OLPC's monochrome screen in low power reflective
+    mode. The the brightness detail can be full resolution but the
+    color detail should be lower resolution by about half (not
+    depending on color detail as fine as brightness detail), because
+    of the nature of the OLPC's screen: 200 dots per inch monochrome
+    gray scale, with lower resolution color. For example, text on an
+    icon should be a noticeably different brightness than the
+    background color, instead of relying on color variation, which is
+    not as detailed and won't show up in monochrome mode.
+
+    SVG is the idea source format, because it can be scaled to any
+    size, rendered with antialiased edges, and will be easily used in
+    the Python version. Illustrator exports SVG. For now the TCL/Tk
+    version can use versions of the SVG files converted to "XPM"
+    format (which I can do).
+
+    Later, the Python user interface will require a bunch more icons
+    and graphics, depending on the user interface and features we
+    decide to support. It would be great to be able to use the same
+    SVG source graphics in the Python version, scaling them as
+    appropriate to adapt to the screen layout. We should revisit the
+    icons and graphics after we port Micropolis to Python.
+
+    What follows is a complete list of graphics we could use in the
+    TCL/Tk version. SVG is ideal but PNG is sufficient for this time.
+
+    Micropolis icon for use in Sugar user interface, in SVG or PNG. 
+
+    Logos:
+      Micropolis logo
+      Micropolis lettering
+      OLPC Project logo
+      XO Laptop logo
+      Linux Penguin logo
+      Python Programming Language logo
+
+    Small menu item icons for map overlay menus:
+      Zones
+        All
+       Residential
+       Commercial
+       Industrial
+       Transportation
+      Overlays
+        Population Density
+        Rate of Growth
+        Land Value
+        Crime Rate
+        Pollution Density
+        Traffic Density
+        Power Grid
+        Fire Coverage
+        Police Coverage
+
+    Small menu item icons for File menu:
+      Save City
+      Save City as...
+      Add Player...
+      Choose City!
+      Quit Playing!
+
+    Small menu item icons for Options menu:
+      Auto Budget
+      Auto Bulldoze
+      Disasters
+      Sound
+      Animation
+      Messages
+      Notices
+
+    Small menu item icons for Disasters menu:
+      Monster
+      Fire
+      Flood
+      Meltdown
+      Air Crash
+      Tornado
+      Earthquake
+
+    Small menu item icons for Time menu:
+      Pause
+      Slow
+      Medium
+      Fast
+
+    Small menu item icons for Priority menu:
+      Flat Out!
+      Zoom Zoom
+      Whoosh Whoosh
+      Buzz Buzz
+      Putter Putter
+      Drip Drip
+      Snore Snore
+
+    Small menu item icons for Windows menu (maybe the same as ones used in buttons):
+      Budget
+      Evaluation
+      Graph
+
+    Small menu item icons for Map Options menu:
+      Auto Goto
+      Palette Panel
+      Chalk Overlay
+
+    Small "OK" button for confirmation dialog buttons.
+
+    Small "Cancel" button for confirmation dialog buttons.
+
+    Large "Question" icon for dialogs asking questions (ok/cancel questions).
+
+    Large "Notice" icon for notice window (informational).
+
+    Large "Query" icon for zone query window (zone tricorder).
+
+    Medium "Generate New City" icon for button to generate new city, on start screen.
+
+    Medium Game Level icons for start screen radio buttons:
+      Easy
+      Medium
+      Hard
+
+    Big "Load City" icon for load city dialog.
+    Meduim "Load City" icon for button to load city, on start screen.
+
+    Big "Save City" icon for save city dialog.
+    Small "Save City" icon for button to save city.
+
+    Big Evaluation icon for evaluation window. 
+    Small Evaluation icon for button to bring up evaluation window.
+
+    Big Graph icon for graph window. 
+    Small Graph icon for button to bring up graph window.
+
+    Big Simolean/Budget symbol for Budget window. 
+    Small Simolean/Budget symbol for button to bring up budget window.
+
+    Big Quit symbol for Quit confirmation dialog.
+    Small Quit symbol for button to bring up Quit confirmation dialog.
+
+    Big About symbol for About dialog.
+    Small About symbol for button to open About dialog.
+
+    Big Choose City symbol for Choose City confirmation dialog.
+    Small Choose City symbol for button to open Choose City confirmation dialog.
+
+
+  Simulation and User Interface Sounds
+
+    Right now it's using the original sounds, plus some interface
+    sounds I recorded. I can convert them to the format required by
+    the Linux sound interface we use. 
+
+    I can supply a list of required interface sounds, but I think we
+    can go with the sounds we have right now without any trouble.
+
+    Later, the Python version will require a bunch more sounds for its
+    user interface, which will depend on the user interface features
+    we decide to support. So we should revisit the sound effects
+    later once Micropolis is ported to Python. 
+
+    To be authentic, I would like to use the original sounds that the
+    simulator made (like the Skywatch One helicopter), or re-record
+    high quality replacements. Maybe we can get Will to record a fresh
+    version of "Skywatch One reporting heavy traffic!" in his own
+    voice (he made that original sound) and the sound people can add
+    in the helicopter sound over his voice to re-create the original
+    sound at high quality. The other sounds could be re-made from
+    scratch without any problem or help from Will. 
+
+    Voice overs reading the user interface text, notices, help text
+    and documentation would be great for pre-literate children. Would
+    need to be translated to other languages. 
+
+
+  Update Documentation
+
+    I have translated the Micropolis manual to HTML. 
+
+    It's the original version that applies to the multi player
+    X11/TCL/Tk version, which needs to be update in a few places where
+    it's specific about the user interface or installation instructions.
+
+    It would benefit from some nice reformatting and CSS styles, as well
+    as some illustrations and screen snapshots.
+
+    After we port Micropolis to Python, the interface-specific
+    documentation will have to be rewritten, re-illustrated, and then it
+    will have to be translated to different languages.
+
+    The documentation consists of the following files:
+
+    Index
+      Introduction
+      Tutorial
+      User Reference
+      Inside the Simulator
+      History of Cities and City Planning
+      Bibliography
+      Credits
+
+    Help Text
+
+      There are also HTML files corresponding to user interface help text.
+      The user interface components are tagged with help ids that are the
+      base names of html files. The existing HTML help files are just
+      placeholders that don't have any useful help text, and there are
+      some help files for user interface components and windows that have
+      since been removed, as well as some help files missing for user
+      interface components and windows that have been added.
+
+      To finish implementing help, we need to go through the code and
+      identify all help tags and opportunities for adding missing help
+      tags to the user interface, then make all help files corresponding
+      to the existing tags, delete obsolete help files, and write all the
+      help text. It would be nice for the help text to hsve illustrations
+      of the corresponding windows and components in use.
+
+      After we port Micropolis to Python, the help files will have to be
+      re-inventoried, rewritten, re-illustrated, and translated to
+      different languages.
+
+    Courseware
+
+      We need to include any Micropolis courseware or teacher's guides with
+      the documentation, and update it to relect the current user
+      interface.
+
+      After we port Micropolis to Python, we will need to update the
+      courseware to reflect the features and user interface of the new
+      user interface.
+
+--
+Micropolis, Unix Version.  This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+  http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <http://www.gnu.org/licenses/>.
+
+            ADDITIONAL TERMS per GNU GPL Section 7
+
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+
+This disclaimer supplements the one included in the General Public
+License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.
diff --git a/src/PLAN.txt b/src/PLAN.txt
new file mode 100644 (file)
index 0000000..12ba526
--- /dev/null
@@ -0,0 +1,297 @@
+Plan for developing Micropolis for OLPC.
+
+First, get it running on the current OLPC platform.
+
+  DONE:
+
+    Screen depth and size: fixed size of OLPC screen.
+    Window management: one window. 
+    Simplify window management. Single map and editor view. Tiled graph and evaluation windows. 
+    Rearrange startup screen so it works in the full window mode.
+    Make budget window and file dialogs be transient popup windows.
+    Add "Enable/Disable Auto Budget" button to budget window.
+    Click on small R/C/I gauge to toggle evaluation window.
+    Click on small graph to toggle graph window.
+    Click on funds or tax rate to show budget window.
+    Disable multi player features by default (added -m flag to enable multi player mode).
+    Disable other experimental features (cellular automata, dynamic query, etc).
+    Add -S flag to enable Sugar features, and TCL access to test flag.
+    Enable audio: Use Sugar audio server.
+      Convert sounds to new audio format (currently wav).
+
+    Fix fonts. 
+      Pick nice Sugar fonts to use, based on Sugar flag. 
+
+  TODO:
+    Update manual and documentation.
+
+    Make Sugar activity wrapper in Python.
+
+    Put new graphics and icons into interface and menus.
+
+
+Replace TCL/Tk with Python/GTK, and use Pango/Cairo for graphics.
+  Implement custom Tk components in GTK.
+    Map view.
+    Editor view.
+    Date view.
+    Graph view.
+    Pie menus.
+    Cellular Automata Machine view.
+
+  Integrate with Sugar and OLPC hardware.
+    Audio.
+      Support CSound audio mixer.
+      Switch to a smaller audio format.
+      Record better sounds.
+    Internationalization.
+    Graphics.
+      Hires monochrome. 
+      SVG graphics and icons. 
+      Create better icons. 
+    Sugar integration. 
+      Integrate with OLPC activity system, window manager, etc. 
+      Rework user interface to follow Sugar user interface guidelines. 
+    Keyboard control.
+      Support OLPC keyboard layout and device buttons. 
+      Game keypad interface for book mode.
+    Optimization.
+      Optimize power management.
+      Optimize size.
+      Optimize speed.
+    Documentation.
+      Integrated help, tutorials, essays on city design from manual, etc. 
+      Voiceovers, demos, journal playback.
+      Courseware. 
+      Map annotation. 
+    Journaling.
+      Event history.
+      Edit history. 
+      Checkpointing. 
+      Branching histories. 
+      Rewinding and fast forwarding. 
+      Publishing newspaper articles linking to save files.
+      URL to link into a city at a particular location on the map.
+    Grid networking. 
+      Multi player stupport.
+        Sharing cities.
+        Colaborative editing.
+        Voting. 
+        Chat. 
+       White board.
+    Educational.
+      Bring old Micropolis courseware up to date, and integrate with the game. 
+      Export simulation data to spreadsheet or xml. 
+      Creative writing, storytelling, newspaper reporting, blogging, etc.
+      Scenarios and experiments.
+      What-if? 
+        Branching history at decision point, and comparing different results. 
+      Scripting. 
+        Open up the simulator to Python. 
+        Web services to remotely monitor and control simulation. 
+       HTML or AJAX web server remote control interface.
+         Support multi player interactions through web server.
+           Submit a proposal to build a stadium over the web.
+           Style it like a real civic government web page, that allows citizens to participate online. 
+       Enable extending the graphics, tiles, sprites. 
+       Enable programming behaviors, defining new zones, new global variables, overlays, etc. 
+       Cellular automata.
+       Visual programming.
+       Programming by example. 
+       KidSim, AgentSheets. 
+
+    Visual Programming
+
+      Simplify the Micropolis interface and make it easier for kids to
+      use it with the game controller, in a way that will support
+      multi player interaction.
+
+      Collapse the separate concepts of game editing tool (bulldozer,
+      road, residential zone, etc) and agent (sprites like the
+      monster, tornado, helicopter, train, etc).
+
+      Agents with specialized tool represent different roles that kids
+      can play. A bunch of kids can join together and play different
+      roles at the same time in the same city. Instead of having a
+      bunch of editing tools to switch between, you have a bunch of
+      different agents you can drive around the map, like using a
+      monster to crush things instead of a bulldozer, or riding around
+      in a helicopter to scroll around and observe the map. Make a
+      meta-game like pokemon trading cards or magic the gathering,
+      about acquiring and deploying and using agents on the map. Give
+      agents different budgets and constraints.
+
+      Use an agent to represent a user in the world, and control an
+      editing tool. You see other users in the map driving around
+      their editing tool agents.
+
+      Each editing tool can be associated with a particular agent,
+      with a keyboard/game controller based user interface for moving
+      around, as well as a mouse based interface for picking it up and
+      dragging it around.
+
+      The road tool becomes a road building vehicle, that you can
+      easily move up/down/left/right/diagonally with the game
+      controller directional input. Requires much less coordination to
+      draw straight roads than with a mouse. 
+
+      The bulldozer tool becomes an actual bulldozer that you can
+      drive around the map, crushing things in your wake.
+
+      This makes the game easily usable by little kids in book mode. 
+
+      Also support small children using Micropolis like a drawing tool or
+      etch-a-sketch, simply doodling with the editing tools for the
+      visceral pleasure of it, and setting fires and other disasters
+      to watch it burn and mutate.
+
+      Logo Turtles (as a generalization of the monster, tornado,
+      helicopter, etc)
+
+        Implement programmable logo turtles as agents that can move
+        around on the map, sense it, and edit it. 
+
+       Like Robot Odyssey agents, so you can go "inside" an agent,
+       and travel around with it, operate its controls, read its
+       sensors, and automate its behvior by wiring up visual programs
+       with logic and math and nested "ic chip" components.
+
+       Plug in graphics to represent the agent: use classic logo
+       turtle and Micropolis sprites, but also allow kids to plug in
+       their own.
+         Micropolis sprites have 8 rotations. 
+         SVG or Cairo drawings can be rotated continuously.
+
+        Re-implement the classic Micropolis agents like the monster,
+        tornado, helicopter, train, etc in terms of logo turtles, that
+        kids can drive around, learn to use, open up and modify (by
+        turning internal tuning knobs, or even rewiring).
+
+       Let kids reprogram the agents to do all kinds of other stuff.
+
+       Mobile robots, that you can double click to open up into
+       Robot-Odyssey-esque visual program editors.
+
+       Agents have local cellular-automata-like sensors to read
+       information about the current and surrounding tiles.
+
+       KidSim / Cocoa / StageCraft Creator let kids define visual
+       cellular automata rules by example, based on tile patterns and
+       rules. Show it a pattern that you want to match by selecting
+       an instance of that pattern in the world, then abstract it
+       with wildcards if necessary, then demonstrate the result you
+       want it to change the cell to in the next generation.
+
+       Sense high level information about zones and overlays, so the
+       agents can base their behavior on any aspect of the world
+       model.
+
+         Support an extensible model by allowing users to add more
+         layers.
+
+           Add layers with arbitrary names and data types at
+           different resolutions:
+
+             byte, int, float, n-dimensional vector, color, boolean
+             mask, musical note, dict, parametric field (i.e. perlin
+             noise or other mathematical function) at each cell, etc.
+
+       Edit the world. 
+
+         All Micropolis editing tools (including colored pens that draw
+         on overlays) should be available to the agent.
+
+         Enable users to plug in their own editing tools, that they
+         can use themselves with the mouse, keyboard or game
+         controller, or program agents to use to edit the map under
+         program control.
+
+      Robot Odyssey
+
+        Build your own universal programmable editing tool.
+       Roll your own von Neuman Universal Constructor. 
+       Smart robots you program to perform special purpose editing tasks. 
+
+       The "Painter" picture editing program had a way of recording
+       and playing back high level editing commands, relative to the
+       current cursor position.
+
+       Remixing. Journaling. Programming by demonstration or example.
+       You could use a tape recorder to record a bunch of Micropolis
+       editing commands that you act out (or you can just select them
+       from the journal), then you can play those tapes back with
+       relative coordinates, so they apply relative to where the
+       agent currently is on the map. You can copy and paste and cut
+       and splice any editing commands into tapes that you can use to
+       program the robot to play back in arbitrary sequences. 
+
+       Program an urban sprawl development-bot to lay out entire
+       residential subdivisions, complete with zones, roads, parks and
+       wires. Then program a luddite roomba-bot that sucks them all
+       up and plants trees in their place.
+
+       This becomes really fun when we let players plug in their own
+       programmed zones for the robot to lay out, and layers of data
+       to control the robot's behavior, out of which they can program
+       their own cellular automata rules and games (like KidSim /
+       Cocoa / StageCraft Creator).
+
+--
+Micropolis, Unix Version.  This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+  http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <http://www.gnu.org/licenses/>.
+
+            ADDITIONAL TERMS per GNU GPL Section 7
+
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+
+This disclaimer supplements the one included in the General Public
+License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.
diff --git a/src/ROADMAP.txt b/src/ROADMAP.txt
new file mode 100644 (file)
index 0000000..f57e0da
--- /dev/null
@@ -0,0 +1,263 @@
+========================================================================
+
+Roadmap of the Micropolis source code. 
+
+========================================================================
+
+Micropolis designed and implemented by Will Wright, 
+Unix porting, optimization and multi player user interface design 
+by Don Hopkins (dhopkins@DonHopkins.com), for DUX Software.
+
+========================================================================
+
+Documentation:
+
+  manual
+    User manual and help page templates. 
+
+  src/notes
+    Notes, to-do lists, lists of potential bugs to work on, and screen
+    snapshots.
+
+Resources:
+
+  res
+
+    Resources, data, TCL code, etc.
+
+    Modified standard TCL/Tk widget libraries to support multiple
+    displays, by removing uses of global variables, and instead 
+    storing screen-specific data in tk_priv map, 
+    keyed by "<variable>@<screen>" where screen is
+    "[winfo screen $w]", the screen identifier. 
+
+    Data files:
+      hexa.112
+      hexa.232
+      hexa.384
+      hexa.385
+      hexa.386
+      hexa.387
+      hexa.388
+      hexa.456
+      hexa.544
+      hexa.563
+      hexa.999
+
+    Scenarios:
+      snro.111
+      snro.222
+      snro.333
+      snro.444
+      snro.555
+      snro.666
+      snro.777
+      snro.888
+
+    String resources:
+      stri.202
+      stri.219
+      stri.301
+      stri.356
+
+    Audio files:
+      aaah.au
+      a.au
+      airport.au
+      beep.au
+      boing.au
+      bop.au
+      build.au
+      bulldoze.au
+      chalk.au
+      coal.au
+      com.au
+      computer.au
+      cuckoo.au
+      e.au
+      eraser.au
+      expl-hi.au
+      expl-low.au
+      fire.au
+      honk-hi.au
+      honk-low.au
+      honk-med.au
+      ignition.au
+      ind.au
+      monster.au
+      nuclear.au
+      o.au
+      oop.au
+      park.au
+      police.au
+      quack.au
+      query.au
+      rail.au
+      res.au
+      road.au
+      rumble.au
+      seaport.au
+      siren.au
+      skid.au
+      sorry.au
+      stadium.au
+      traffic.au
+      uhuh.au
+      unix.au
+      whip.au
+      wire.au
+      woosh.au
+      zone.au
+
+    Modified TCL/Tk standard library code:
+    
+      button.tcl
+        Modified to support multiple displays.
+      menu.tcl
+        Modified to support multiple displays.
+      text.tcl
+        Modified to support multiple displays.
+      tk.tcl
+        Modified to support multiple displays.
+      buildidx.tcl
+      entry.tcl
+      init.tcl
+      listbox.tcl
+      mkindex.tcl
+      parray.tcl
+      tclinit.tcl
+      tkerror.tcl
+      wish.tcl
+      wishx.tcl
+      tclindex
+      tcl.tdx
+      tcl.tlb
+      tk.tdx
+      tk.tlb
+
+    Micropolis user interface code:
+
+      micropolis.tcl
+        Micropolis utilities and shared interface code. 
+      help.tcl
+        Micropolis help messages.
+      wask.tcl
+        Ask question window.
+      wbudget.tcl
+        Budget window.
+      weditor.tcl
+        Map editor window.
+      weval.tcl
+        Evaluation window.
+      wfile.tcl
+        File open window.
+      wfrob.tcl
+        Frob window (dynamic zone finder sliders).
+      wgraph.tcl
+        Graph window.
+      whead.tcl
+        Head main application window.
+      whelp.tcl
+        Help window.
+      wmap.tcl
+        Map overview window.
+      wnotice.tcl
+        Notice message window.
+      wplayer.tcl
+        Add player window.
+      wscen.tcl
+        Choose scenario window.
+
+    Micropolis sound server code:
+
+      sound.tcl
+        Code loaded by sound server, 
+       which runs in another process,
+       and is controlled via the TCL "send" command. 
+       No longer used. 
+       Sound should be built into Micropolis, using a modern standard sound library (and file formats). 
+
+Base Libraries:
+
+  src/tcl
+    TCL language interpreter.
+    Free software.
+    Modified for unix porting.
+
+  src/tk
+    Tk user interface toolkit.
+    Free software.
+    Modified for unix porting, multiple display support, various extensions and bug fixes.
+    See src/notes/to.ouster (message about multiple display support),
+       src/notes/TkVersion (description of origin and changes in tk)
+
+  src/tclx
+    Useful extensions to TCL/Tk.
+    Free software.
+    Modified for unix porting.
+
+Micropolis source code:
+
+  src/sim
+
+  src/sim/terrain
+
+========================================================================
+Micropolis, Unix Version.  This game was released for the Unix platform
+in or about 1990 and has been modified for inclusion in the One Laptop
+Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+you need assistance with this program, you may contact:
+  http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.  You should have received a
+copy of the GNU General Public License along with this program.  If
+not, see <http://www.gnu.org/licenses/>.
+
+            ADDITIONAL TERMS per GNU GPL Section 7
+
+No trademark or publicity rights are granted.  This license does NOT
+give you any right, title or interest in the trademark SimCity or any
+other Electronic Arts trademark.  You may not distribute any
+modification of this program using the trademark SimCity or claim any
+affliation or association with Electronic Arts Inc. or its employees.
+
+Any propagation or conveyance of this program must include this
+copyright notice and these terms.
+
+If you convey this program (or any modifications of it) and assume
+contractual liability for the program to recipients of it, you agree
+to indemnify Electronic Arts for any liability that those contractual
+assumptions impose on Electronic Arts.
+
+You may not misrepresent the origins of this program; modified
+versions of the program must be marked as such and not identified as
+the original program.
+
+This disclaimer supplements the one included in the General Public
+License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+NOT APPLY TO YOU.
diff --git a/src/makefile b/src/makefile
new file mode 100644 (file)
index 0000000..57217b1
--- /dev/null
@@ -0,0 +1,130 @@
+# Makefile for Micropolis
+# 
+# Micropolis, Unix Version.  This game was released for the Unix platform
+# in or about 1990 and has been modified for inclusion in the One Laptop
+# Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+# you need assistance with this program, you may contact:
+#   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.  You should have received a
+# copy of the GNU General Public License along with this program.  If
+# not, see <http://www.gnu.org/licenses/>.
+# 
+#             ADDITIONAL TERMS per GNU GPL Section 7
+# 
+# No trademark or publicity rights are granted.  This license does NOT
+# give you any right, title or interest in the trademark SimCity or any
+# other Electronic Arts trademark.  You may not distribute any
+# modification of this program using the trademark SimCity or claim any
+# affliation or association with Electronic Arts Inc. or its employees.
+# 
+# Any propagation or conveyance of this program must include this
+# copyright notice and these terms.
+# 
+# If you convey this program (or any modifications of it) and assume
+# contractual liability for the program to recipients of it, you agree
+# to indemnify Electronic Arts for any liability that those contractual
+# assumptions impose on Electronic Arts.
+# 
+# You may not misrepresent the origins of this program; modified
+# versions of the program must be marked as such and not identified as
+# the original program.
+# 
+# This disclaimer supplements the one included in the General Public
+# License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+# PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+# OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+# SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+# DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+# INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+# RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+# USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+# INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+# MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+# UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+# WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+# CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+# ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+# JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+# WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+# CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+# NOT APPLY TO YOU.
+
+RES = ../res
+
+TARFILES = \
+       micropolis-activity/Micropolis \
+       micropolis-activity/README \
+       micropolis-activity/COPYING \
+       micropolis-activity/cities \
+       micropolis-activity/images \
+       micropolis-activity/res \
+       micropolis-activity/manual \
+       micropolis-activity/activity \
+       micropolis-activity/__init__.py \
+       micropolis-activity/micropolisactivity.py \
+       micropolis-activity/Micropolis.png
+
+all:
+       cd tcl ; make all
+       cd tk ; make all
+       cd tclx ; make all
+       cd sim ; make all
+
+clean:
+       rm -f Micropolis.tgz
+       (cd $(RES) ; touch junk~ ; rm -f sim *~)
+       (cd .. ; touch junk~ ; rm -f *~)
+       touch junk~ ; rm -f *~
+       rm -rf BUILDIT
+       cd tcl ; make clean
+       cd tk ; make clean
+       cd tclx ; make clean
+       cd sim ; make clean
+
+install: all
+       (cd $(RES) ; rm -f sim)
+       cp sim/sim $(RES)/sim ; strip $(RES)/sim
+
+tar:
+       touch $(RES)/junk~ ../images/junk~
+       rm -f ../../micropolis-activity.tgz $(RES)/*~ ../images/*~
+       (cd ../.. ; tar cfvz micropolis-activity.tgz $(TARFILES)) 
+
+xo:  install
+       touch $(RES)/junk~ ../images/junk~
+       rm -f ../../micropolis.xo $(RES)/*~ ../images/*~
+       rm -rf BUILDIT
+       mkdir BUILDIT
+       tar cf - -C ../.. $(TARFILES) | (cd BUILDIT; tar xf -)
+       # The DejaVu fonts are not needed on the XO, only other platforms.
+       rm -rf BUILDIT/micropolis-activity/res/dejavu-lgc
+       mv BUILDIT/micropolis-activity BUILDIT/micropolis.activity
+       (cd BUILDIT; zip -r ../../../micropolis.xo micropolis.activity)
+       rm -rf BUILDIT
+
+#
+# To cut a release:
+# Edit activity/activity.info and increment the version number.
+# In what follows, replace "3" with the latest version number
+#   vi activity/activity.info
+#   git commit activity/activity.info
+# Now make the source tar file:
+#   git-archive --format=tar --prefix=micropolis-activity-3/ HEAD >../micropolis-activity-3-src.tar
+#   gzip -9 ../micropolis-activity-3-src.tar
+#   chmod a-w ../micropolis-activity-3-src.tar.gz
+# Now make the binary:
+#   (cd src; make xo)
+#   mv ../micropolis.xo ../micropolis-3.xo
+#   chmod a-w ../micropolis-3.xo 
+# You're done.  Publish them.
+#
diff --git a/src/notes/BUGS b/src/notes/BUGS
new file mode 100644 (file)
index 0000000..ceb9130
--- /dev/null
@@ -0,0 +1,50 @@
+==== IN PROGRESS ====
+
+IRC Chat Server connection
+
+If Numeric Lock is on, Tk ignores all mouse clicks! Ignore NumLock state. 
+
+
+==== UNIMPLEMENTED FEATURES ====
+
+Integrate sound server into main application.
+
+
+==== BUGS ====
+
+Wrap year back around from 1000000 to 0 instead of 1900. 
+Ensure floored arithmetic in code w.r.t. CityTime.
+
+pause game and change graph mode from 10 yrs to 120 yrs. graph does not update.
+
+colors in the power grid overlay are not correct.
+if funds negative, then current funds displays $-,600
+
+earthquakes at high speed slow down mouse tracking
+
+lots of res/sounddev processes sitting around.
+
+errors on one x server should not kill whole game for all players, just close down that x server.
+
+pan cursor gets displaced when it hits the limits.
+
+panning needs to be easier, some shift key accelerator for two button mice.
+Panning mode, so you don't need to hold the button down, or lose your current tool.
+
+function or control keys to switch between drawing tools, that don't interfere with chat. 
+
+Need an official way to cheat, since FUND does not work. One armed bandit? 
+
+
+==== FIXED ====
+
+option to turn off alerts
+option to print notices less frequently
+blur the quickly changing date
+
+sometimes the date window stops updating
+sometimes the text buttons stop updating
+
+sometimes the graph window does not show up in the head window! 
+
+
diff --git a/src/notes/Beyond-Intelligent-Machines b/src/notes/Beyond-Intelligent-Machines
new file mode 100644 (file)
index 0000000..436f7af
--- /dev/null
@@ -0,0 +1,241 @@
+Date: Tue, 24 Nov 92 22:25:59 -0500
+From: ben@cs.UMD.EDU (Ben Shneiderman)
+To: bam@cs.cmu.edu, ben@cs.umd.edu, callahan@cerc.wvu.wvnet.edu,
+        hopkins@bongo.garnet.cs.cmu.edu, weiser.pa@xerox.com
+Subject: Re: more pie menus!
+
+I couldn't resist sending you all this latest essay which is
+destined for IEEE Software...some readers expect it to generate
+some strong responses...Ben
+
+
+Beyond Intelligent Machines:
+    Designing Predictable and Controllable User Interfaces
+  Ben Shneiderman  November 24, 1992
+       University of Maryland, College Park, MD 20742  
+   Professor, Department of Computer Science,
+   Head, Human-Computer Interaction Laboratory at the 
+      Center for Automation Research &
+   Member, Institute for Systems Research
+Who's in control?
+
+An important shift is occurring from the old vision of computers
+as 'intelligent' to a new vision based on predictable and controllable
+user interfaces that depend on direct manipulation of objects and actions.
+Appropriate metaphors and terminology are important since they shape
+the thoughts of researchers, designers, managers, congress-people, 
+journalists, etc.  Most of us have learned the importance of gender 
+neutral terminology and similarly I have been strongly opposed to 
+suggesting that computers are 'intelligent' or 'smart' for several 
+reasons:
+1) Limits to Imagination
+I think we should have much greater ambition than to make a computer 
+behave like an intelligent butler or other human agent.  Computer 
+supported cooperative work (CSCW), hypertext/hypermedia, multi-media, 
+information visualization, and virtual realities are powerful 
+technologies that enable human users to accomplish tasks that no human 
+has ever done.  If we describe computers in human terms then we
+run the risk of limiting our ambition and creativity in the design
+of future computer capabilities.
+2) Predictability and Control are Desirable
+If machines are 'intelligent' or 'adaptive' then they may become less 
+predictable and controllable.  Our usability studies show that users 
+want feelings of mastery, 
+competence, and understanding that come from a predictable and 
+controllable interface.  Most users seek a sense of 
+accomplishment at the end of the day, not the sense that this 
+'intelligent' machine magically did their job for them. 
+3) Human Responsibility
+I am concerned that if designers are successful in convincing the users 
+that computers are intelligent, then the users will have a reduced sense 
+of responsibility for failures.  The tendency to blame the machine is 
+already widespread and I think we will be on dangerous grounds if we 
+encourage this trend.
+4)  Machines are not People  AND  People are not Machines
+I have a basic philosophical objection to the suggestion that machines 
+are, or can ever be, intelligent.  I know that many of my colleagues are 
+quite happy to call machines intelligent and knowledgeable, but I prefer 
+to treat and think about machines in very different ways from the way I 
+treat and think about people.
+
+The lessons of history
+While some productive work has been done under the banner of
+`intelligent', often those who use this term reveal how little they
+know about what users want or need.  The users's goal is not to
+interact with an 'intelligent' machine, but to create, communicate, 
+explore, plan, draw, compose, design, or learn.  Ample evidence 
+exists of the misguided directions brought by 'intelligent' machines:
+  - natural language interaction seems clumsy and slow compared to 
+direct manipulation and information visualization methods that use 
+rapid, high-resolution, color displays with pointing devices.  Lotus HAL 
+is gone, AI INTELLECT hangs on but is not catching on.  There are some 
+interesting directions for tools that support human work through 
+natural language processing: aiding human translators, parsing 
+texts, and generating reports from structured databases.
+  - speech I/O in talking cars and vending machines is gone.
+Voice recognition is fine for handicapped users plus special situations, 
+but doesn't seem to be viable in general office, home, or school 
+settings.  Our recent studies suggest that speech I/O has a greater
+interference with short term and working memory than hand-eye 
+coordination for mouse menu selection.  Voice store and forward,
+phone-based information retrieval, and voice annotation have great 
+potential but these are not the 'intelligent' applications.
+  - adaptive interfaces are unstable and unpredictable, often leading 
+users to worry about what will change next.  I see only modest chances 
+for success in user modeling to recognize the level of expertise and
+revise the interface accordingly - can anyone point to successful
+studies or commercial products?  By contrast, user controlled 
+adaptation through control panels, cruise control for cars, and 
+remote controls for TV are success stories.  While algorithms to 
+deal with dynamic
+issues in network or disk space management are needed, the task domain 
+and user interface issues of the application program
+should generally be under direct user control.
+  - Intelligent CAI (Computer Assisted Instruction) only prolonged the 
+time (compared to traditional CAI) until the users felt they were the 
+victims of the machine.  Newer variations such as Intelligent Tutoring 
+Systems are giving way to Interactive Learning Environments where 
+students are in control and actively creating or exploring.
+  - intelligent talking robots with five-fingered hands and human facial 
+features (quaint fantasy that did well in Hollywood but not in Detroit 
+or elsewhere) are mostly gone in favor of flexible manufacturing systems 
+that enable supervisors to specify behavior with predictable results.
+It seems that some designers continue to ignore this historical pattern 
+and still dream of creating 'intelligent' or 'smart' machines.  It is an 
+ancient and primitive fantasy, and its seems most new technologies must 
+pass through this child-like animistic phase.  Lewis Mumford identified 
+this pattern (Technics and Civilization, 1934) when he wrote about the 
+Obstacle of Animism: 'the most ineffective kind of machine is the 
+realistic mechanical imitation of a man or another animal...for 
+thousands of years animism has stood in the way of...development.'   
+An alternate vision
+
+My point in this essay is not merely to counter a popular design 
+philosophy, but to offer a new vision that is more in harmony with what 
+users want.  I believe that the future will be filled with powerful, but 
+predictable and controllable computers that genuinely serve human needs  
+(Designing the User Interface: Strategies for Effective Human-Computer
+Interaction, Second Edition, Addison-Wesley Publ. Co., Reading, MA, 1992).
+
+In this vision of predictable and controllable (PC) computing, 
+the promising strategies are rapid,
+visual, animated, colorful, high resolution interfaces built on
+meaningful control panels, appropriate preference boxes,
+user-selectable toolbars, rapid menu selection, easy to create macros,
+and comprehensible shortcuts.  These enable me to specify rapidly, 
+accurately, and confidently how I want my email filtered, what documents 
+I want retrieved and in what order, and how my documents will be 
+formatted.
+Our Human-Computer Interaction Laboratory has applied these principles 
+to information visualization methods that give users X-ray vision to see 
+through their mountains of data.  Treemaps enable users to see (and 
+hear) 2-3000 nodes of hierarchically structured information by utilizing 
+every pixel on the display.  Each node is represented by a rectangle 
+whose location preserves the logical tree structure and whose area is 
+proportional to one of its attributes.  Color represents a second 
+attribute and sound a third (B. Johnson & D. Turo,  Improving the 
+Visualization of Hierarchies with Treemaps: Design Issues and 
+Experimentation, Proc. IEEE Visualization '92).  Treemaps have been 
+applied to Macintosh directory browsing (Figure 1), in which area could 
+be set to file size, color to application type, and sound to file age 
+(our TreeViz application is available from the University of Maryland's 
+Office of Technology Liaison, (301) 405-4210).  When users first try 
+TreeViz they usually discover duplicate or misplaced files, redundant 
+and chaotic directories, and many useless files or applications.  Other 
+applications include: stock market portfolio management, sales data, 
+voting patterns, sports (48 statistics on 459 NBA players, in 27 teams, 
+in four leagues), etc.
+Dynamic queries allow rapid adjustment of query parameters and immediate 
+display of updated result sets.  These animations enable users to 
+develop intuitions, discover patterns, spot trends, find exceptions, and 
+see anomalies.  The Dynamic HomeFinder prototype (Figure 2) allows users 
+to adjust the cost, number of bedrooms, location, etc. and see points of 
+light come and go on a map to indicate a matching home.  Users execute
+up to 100 queries/second (rather than one query per 100 seconds)
+producing a revealing animated view of where high or low priced homes
+are found, and there are no syntax errors.  Clicking on a point of
+light brings up a description or image (videotape available, or for 
+an empirical comparison with a natural language system, see 
+Williamson, C. and Shneiderman, B., The Dynamic HomeFinder: Evaluating 
+dynamic queries in a real-estate information exploration system, 1992 
+ACM SIGIR Proceedings).  
+
+Dynamic queries are very effective when a visual environment such as a
+map, calendar, or schematic diagram are available, but they can be
+easily applied with standard text file output (Figure 3).  Dynamic 
+queries exemplify the future of interaction; You don't need to
+describe your goals, negotiate with an intelligent agent, and wait for
+a response, you Just Do It!   Furthermore, dynamically seeing the 
+results enables you to explore and rapidly reformulate your goals in 
+an engaging videogame-like manner.  
+Open problems in information visualization include screen organization, 
+widget design, algorithms for rapid search and display, use of color
+and sound, and strategies to accommodate human perceptual skills.  
+We also see promise in expanding macro makers into the graphical 
+environment with visual triggers based on controlled replay of 
+desired actions - the 
+general idea is Programming in the User Interface (PITUI) to 
+Do-What-I-Did (DWID).
+I want to encourage the exploration of new metaphors and visions of how 
+computers can empower people by presenting information, allowing rapid 
+selection, supporting personally specified automation, and providing 
+relevant feedback.  Metaphors related to controlling tools or machines 
+such as driving, steering, flying, directing, conducting, piloting, 
+or operating seem more generative of effective and acceptable 
+interfaces, than 'intelligent' machines.
+
+
+A scientific approach to user interface research
+Whether you agree with the design philosophy in this essay, and
+especially if you disagree, I hope that you will add to our scientific
+knowledge by conducting well-designed empirical studies of learning
+time, measuring performance time for appropriate tasks, recording error
+rates, evaluating human retention of interface features, and assessing
+subjective satisfaction.  There's much work to be done to make
+computing accessible, effective, and enjoyable.
+Acknowledgements:  This essay was prompted by the discussion between 
+Mark Weiser and Bill Hefley, stimulated by lively email and personal 
+discussions with Paul Resnick, Tom Malone, and Christopher Fry at MIT, 
+and refined by comments from Catherine Plaisant, Rick Chimera, Brian 
+Johnson, David Turo, Richard Huddleston, and Richard Potter at the 
+Human-Computer Interaction Lab at Univ. of Maryland.  I appreciate Bill 
+Curtis's support for this vision.  Thanks to all.
diff --git a/src/notes/Changes b/src/notes/Changes
new file mode 100644 (file)
index 0000000..14ac275
--- /dev/null
@@ -0,0 +1,102 @@
+* xpm
+** Makefile
+  delete -DNEED_STRDUP
+  change ranlib to echo
+** hashtab.c
+  Used aho-sethi-ullman hash function instead of mock lisp (ick)
+
+* tcl
+** Makefile
+  CC=cc
+  CFLAGS -O
+  deleted COMPAT_OBJS from OBJS
+** config
+  set libc="/usr/lib/libc.a"
+  made it always mv Makefile Makefile.bak
+** tclVar.c
+  worked around Tcl_GetVar optimizer bug
+
+* tk
+** Makefile
+  CC=cc
+  CFLAGS -O
+  # ranlib
+** tkConfig.h
+  ifdef around open()
+** tkWm.c
+  "wm front window" raises window to front
+** tkWmProtocol.c
+  53: warning: text following #endif violates ANSI standard
+** main.c
+  accom: Warning 100: main.c, line 321: statement not reached
+** tkTCP.c tkTCP.h
+  integrated "tcp" command
+  updated: tkWindow.c tk.h
+** tkEntry.c
+  bug when changing entry's variable value to shorted than selected string,
+  not clearing selection properly, fixed EntrySetValue from:
+    entryPtr->selectFirst = -1;
+  to:
+    entryPtr->selectFirst = entryPtr->selectLast = -1;
+** tkEvent.c
+  added "focus -query <windowname>" argument
+  added IdleHandlerPool because it was calling malloc alot
+** tkCanvas.c
+  fixed bug in tk_CanvasCmd with multiple displays of different res,
+  by changing tkwin to new:
+    canvasPtr->pixelsPerMM = WidthOfScreen(Tk_Screen(new));
+    canvasPtr->pixelsPerMM /= WidthMMOfScreen(Tk_Screen(new));
+** tkGrab.c
+  added "grab -off <window>" argument to specify which server to ungrab
+** tkSelect.c
+  added "selection -window <windowname>"
+** tk_TextSelectTo was being called with one arg instead of x y in text.tcl
+  made default second arg that does the right thing
+** tkCmds.c
+  tk_WinfoCmd added "server" option that returns DisplayName w/out screen
+** tkColor.c
+  added Tk_DefaultColormap, replacing calls to DefaultColormapOfScreen. 
+
+* tclX
+** Config.mk
+  TCL_CONFIG_FILE=sgi
+  OPTIMIZE_FLAG=-O
+  CC=cc
+  XPM_LIBS= -L$(XPM_DIR) -L../$(XPM_DIR) -lXpm
+** src/tclXgetdate.y
+  added declarations:
+       static time_t timeconv(int hh, int mm, int ss, int mer);
+       static time_t daylcorr(time_t future, time_t now);
+       static lookup(char *id);
+** tksrc/Makefile
+  Moved TCL_TK_LIBS to end:
+       $(CC) $(CFLAGS) ../tkucbsrc/main.o ../libtk.a ../libtcl.a \
+             $(XLDFLAGS) $(XPM_LIBS) $(TCL_TK_LIBS) -o ../wish
+
+
+* X
+** Makefile
+  XHOME = /usr
+  CC = cc $(CPPFLAGS) $(CFLAGS)
+  OPTFLAGS = -O
+  #LDFLAGS = -Bstatic
+  #    $(ELMHOME)/lib/elm.a
+  -lm
+** Headers/Sim.h
+  #ifdef sun around #include <sys/vadvise.h>
+  #ifdef ELM around #include "elm.h"
+  added short YourStupid;
+** sim.c
+  #ifdef ELM around vars and in sim_exit lice_init sim_update
+  factored out env_init and called in main
+** w_tk.c
+  static int SimTileViewCmd
+  static int SimGraphViewCmd
+** w_stubs.c
+  deleted CdestX CdestY YourStupid
+** w_fileio.c
+  deleted InitSimLoad roadPercent policePercent firePercent
+
+* Resources
+** tclIndex
+  prune files, make index
diff --git a/src/notes/DONE b/src/notes/DONE
new file mode 100644 (file)
index 0000000..200af0b
--- /dev/null
@@ -0,0 +1,36 @@
+* multiple maps & editors (1)
+  need menu for creating new editor and map windows
+* about dialog (1)
+  pictures, copyright notice, credits, etc.
+* notice dialog (1)
+  window that pops up to display text and graphics
+  city size changes, warnings, disasters, win/lose
+* elan license manager (2)
+* map & editor controls (2)
+  controls for things effecting the editor or map,
+  like update frequency, autogoto
+* scenario descriptions (3)
+  describe each scenario when it's selected
+* query zone status (2)
+  no editing tool for "query" function, so press help key instead
+* "are you sure?" confirmation dialogs (3)
+  pop-up window asks a question with yes/no buttons,
+  before "quit", "load city", "select city", etc
+* map icons (4)
+  make a bunch of big new map icons
+* get key dialog (1)
+* hour glass on budget window (3)
+  take down budget window and continue when timer runs out
+* history mechanism should reset history when you play a game
+* now that autogoto is a view option, and there's no way to set the global
+  flag from the user interface, turn it on after reading from a file. 
+* audio mixer does alopen on hw without audio
+* elmd -s 0, kill when done
+* Programs dumps core upon start-up on krill.corp.  Running 12 bit deep
+  root.  So it appears that it needs to be a little smarter about different
+  depth roots.
+* get key panel
+  show license status! give more feedback!
+    unsigned long elm_fexpdate(feature)
+    elm_getservers
+  micropolis / micropolisnet licenses
diff --git a/src/notes/DocTCL b/src/notes/DocTCL
new file mode 100644 (file)
index 0000000..b199dc3
--- /dev/null
@@ -0,0 +1,88 @@
+editorview .editor
+       -display host:0?
+
+.editor
+       configure ...
+       position ?x y?
+       size ?w h?
+       Pan ?x y?
+       ToolState ?state?
+       ToolMoveTo x y
+       ToolDragTo x y
+       PanStart x y
+       PanTo x y
+       Visible ?0..1?
+       KeyDown key
+       KeyUp key
+       TileCoord x y
+
+mapview .map
+       ?-display host:0?
+
+.map
+       configure ...
+       position ?x y?
+       size ?w h?
+       MapState ?0..8?
+       ZoneType ?0..3?
+       PopnRate ?0..1?
+       PoliceRadius ?0..1?
+       PanStart x y
+       PanTo x y
+       ViewAt x y
+       Visible ?0..1?
+
+sim
+       GameStarted
+       InitGame
+       SaveCity
+       GenerateNewCity
+       ReallyQuit
+        UpdateMaps
+       UpdateGraphs
+       UpdateEvaluations
+       UpdateBudgets
+       DoBudget
+       Pause
+       Resume
+       CheckLicense
+       StartBulldozer
+       StopBulldozer
+       MakeFire
+       MakeFlood
+       MakeAirCrash
+       MakeTornado
+       MakeEarthquake
+       MakeMonster
+       MakeMeltdown
+       SoundOff
+       LoadScenario 1..8
+       LoadCity filename
+       SaveCityAs filename
+       MakeExplosion x y
+       InstallKey 0..1 key
+       MakeSound id
+       StartSound id
+       StopSound id
+       CityName ?name?
+       GameLevel ?1..2?
+       Speed ?0..7?
+       Delay ?int?
+       HeatSteps ?steps?
+       HeatFlow ?flow?
+       HeatRule ?rule?
+       Funds ?funds?
+       TaxRate ?0..20?
+       FireFund ?int?
+       PoliceFund ?int?
+       RoadFund ?int?
+       AutoBudget ?0..1?
+       AutoGoto ?0..1?
+       AutoBulldoze ?0..1?
+       Disasters ?0..1?
+       Sound ?0..1?
+       FlushStyle ?0..2?
+       MonsterGoal ?x y?
+       TornadoGoal ?x y?
+       HelicopterGoal ?x y?
+       MonsterDirection ?-1..7?
diff --git a/src/notes/Dynamic.tcl b/src/notes/Dynamic.tcl
new file mode 100644 (file)
index 0000000..15bf2d3
--- /dev/null
@@ -0,0 +1,132 @@
+option add *Interval.activeForeground  #d0d0d0
+option add *Interval.sliderForeground  #b0b0b0
+option add *Interval.activeForeground  #d0d0d0
+option add *Interval.sliderForeground  #b0b0b0
+
+########################################################################
+# Dynamic Map Handlers
+
+proc ShowDynamicPanel {win} {
+  if {! [winfo ismapped $win.bottomframe]} {
+    pack append $win $win.bottomframe  {bottom frame center fill expand}
+    set x [winfo rootx $win]
+    set y [winfo rooty $win]
+    set width [winfo width $win]
+    set height 670
+    wm geometry $win ${width}x${height}
+  }
+}
+
+
+proc HideDynamicPanel {win} {
+  if {[winfo ismapped $win.bottomframe]} {
+    pack unpack $win.bottomframe
+    set x [winfo rootx $win]
+    set y [winfo rooty $win]
+    set width [winfo width $win]
+    set height 332
+    wm geometry $win ${width}x${height}
+  }
+}
+
+
+proc InitDynamic {} {
+  global MapWindows
+  sim ResetDynamic
+
+  for {set i 0} {$i < 8} {incr i} {
+    foreach win $MapWindows {
+      [WindowLink $win.interval]$i reset
+    }
+  }
+
+}
+
+
+proc SetDynamicData {win index min max} {
+  set MinIndex [expr "$index * 2"]
+  set MaxIndex [expr "$MinIndex + 1"]
+
+  sim DynamicData $MinIndex $min
+  sim DynamicData $MaxIndex $max
+
+  set int [WindowLink $win.interval]$index
+  set from [lindex [$int config -from] 4]
+  set to [lindex [$int config -to] 4]
+  set min [lindex [$int config -min] 4]
+  set max [lindex [$int config -max] 4]
+  set range [expr "${to}-${from}"]
+  set offset 80
+  set scale 100
+  set low [expr "(($min-$from)*$scale/$range) + $offset"]
+  set high [expr "(($max-$from)*$scale/$range) + $offset"]
+  set sound 29
+  set title Slider$index
+  set vol 70
+  set chan fancy
+
+  UIDoSound "\"sound replay $title -channel $chan -volume $vol ; sound replay $sound -channel $chan -volume $vol -speed $low ; sound play $sound -channel $chan -volume $vol -speed $high\""
+
+  global MapWindows
+  foreach win $MapWindows {
+    [WindowLink $win.interval]$index set $min $max
+  }
+}
+
+
+
+
+
+global MapTitles
+set MapTitles {
+  {Micropolis Map}
+  {Residential Zone Map}
+  {Commercial Zone Map}
+  {Industrial Zone Map}
+  {Power Grid Map}
+  {Transportation Map}
+  {Population Density Map}
+  {Rate of Growth Map}
+  {Traffic Map}
+  {Pollution Map}
+  {Crime Map}
+  {Land Value Map}
+  {Fire Station Map}
+  {Police Station Map}
+  {Dynamic Query Map}
+}
+
+
+
+
+proc UISetMapState {w state} {
+  global MapTitles
+  set win [winfo toplevel $w]
+  set m [WindowLink $win.view]
+  set title [lindex $MapTitles $state]
+  wm title $win "$title"
+  wm iconname $win "$title"
+  global [set var MapState.$win]
+  set $var $state
+
+  case $state { \
+    {6 8 9 10 11 12 13} {
+      [WindowLink $win.legend] config -bitmap "@Images/LegendMaxMin.xpm"
+      HideDynamicPanel $win
+    } \
+    {7} {
+      [WindowLink $win.legend] config -bitmap "@Images/LegendPlusMinus.xpm"
+      HideDynamicPanel $win
+    } \
+    {0 1 2 3 4 5 14} {
+      [WindowLink $win.legend] config -bitmap "@Images/LegendNone.xpm"
+      if {$state == 14} {
+       ShowDynamicPanel $win
+      } else {
+        HideDynamicPanel $win
+      }
+    }
+  }
+}
+
+
diff --git a/src/notes/FirstRelease b/src/notes/FirstRelease
new file mode 100644 (file)
index 0000000..f3dced6
--- /dev/null
@@ -0,0 +1,27 @@
+Here are the things that need to be done before releasing a single
+user version of the game, and how much effort I think they'll take
+(Simple = 1, Difficult = 9).  We also need to allocate time for user
+testing (to get feedback from people using it, and make changes based
+on their input), and of course debugging and smoothing out rough
+edges.
+
+* keyboard commands: arrow, function keys (3)
+  also need to disable autorepeat
+* save/restore overlay (5)
+  write all overlay information into another file, like Glasgow.city.overlay
+
+* print city dialog (6)
+  need to implement printing function and control panel from scratch
+* help (8)
+  must implement a help mechanism and put in lots of help
+* manual (9)
+  need to re-write manual, and do new illustrations
+  must have a framemaker license to do this
+
+We could probably come out with a solid beta release without printing,
+help, or a manual. 
+
+       -Don
+
+
+DONE:
diff --git a/src/notes/InterCHI-Interactive-Experience-Proposal b/src/notes/InterCHI-Interactive-Experience-Proposal
new file mode 100644 (file)
index 0000000..aa681e3
--- /dev/null
@@ -0,0 +1,85 @@
+MicropolisNet: a Cooperative Multi User City Simulation
+
+MicropolisNet is an animated interactive system simulation game, providing 
+a set of rules and tools for planning and building a complex
+dynamic simulated city.  Several people on different workstations can
+participate in the same game, cooperating and coordinating their
+actions over the net. 
+
+Working together, you can zone land use, hook up the power grid, build
+roads, bridges, parks and stadiums, raise taxes, and even summon
+disasters, causing the city to grow and thrive, or crumble and die.
+MicropolisNet features multiple city views and maps with overlays,
+simultaneous editing and user interface interaction, "voting panels"
+for group decision making, and multimedia communication and
+annotation features ("bridges between players").
+
+The multi user interface supports communication via three media in
+parallel: text, sound, and graphics.  It includes a scrolling text log
+for telegram messages, a networked audio server for sound effects and
+voice intercom, and shared cursors and graphical overlays for
+pointing, gesturing, annotating and editing the map.
+
+I propose to build a model of the Amsterdam neighborhood near
+the conference ("bridges between dijks"), and let people walk up 
+and interact as they please.  Experienced MicropolisNet players can
+participate, using the shared environment and communication features
+to demonstrate the system, advise other players, and coordinate the
+game.  
+
+The purpose of the experience is to create a constructive cooperative
+virtual environment, where people can collaborate towards a common goal, 
+take part in group decisions, and share resources, responsibility, 
+and the consequences of each others actions. 
+
+MicropolisNet is robust and easy to use, with engaging interactive sound
+effects and lively graphical animation, so it's fun to watch as well
+as play.  
+
+MicropolisNet can be played across several different makes of computer at 
+once ("bridges between brands").  It presently runs on color SPARC and 
+Indigo workstations (and is easily portable to other Unix platforms), 
+and plays over the net (but without sound) on other 8 bit color X 
+terminals and workstations.  I can ship my own SPARC if necessary, and 
+I'm trying to obtain support and a loan of equipment (hopefully Indigos) 
+in Holland.
+
+It would be useful to have a high resolution video projector, visible 
+from the other workstations.  The projector could display overall city 
+maps, graphs, messages, statistics and other global data, so players 
+don't need to spend their own screen space.  
+
+I need enough floor and table space to place workstations where people 
+can walk up to them and use the keyboard, mouse, and microphone.  Most 
+could be together in a group within view of the video projector, but 
+others could be in remote locations. 
+
+The workstations, network, video projector, and posters must be set 
+up and torn down, but none of that's very difficult.  Thin wire ethernet
+would be preferable, and would require thick to thin transceiver for the
+workstations equipped with thick wire ethernet plugs.  
+
+Once MicropolisNet is set up and running, it doesn't require special
+supervision.  I will attend and demonstrate the system as much as I
+can, but during other times, unless someone volunteers, it can run 
+on its own, as long as there's enough security that none of the 
+equipment walks off.  
+
+I'm presently implementing MicropolisNet on X11 for DUX Software (who
+licensed Micropolis from Maxis).  It's mostly functional now, and will
+be ready to demonstrate, but not yet released as a product, by the time 
+of the conference.  Soon I'll have an "Alpha" demo version for the SGI
+and SPARC, for limited distribution to INTERCHI reviewers and other
+interested people.  I'll make a video tape as soon as I have the 
+time and equipment.  
+
+I've given many talks and interactive presentations at conferences, 
+and run demos at trade show booths.  At CHI'90, I participated in the 
+"Empowered" performance (giving a whirlwind tour of pie menu based user
+interfaces I'd implemented).  Last year, I ported Micropolis (single user) 
+to OpenWindows on the SPARC (which won "Product of the Year 1992" from
+Unix World).  I worked as a developer of The NeWS Toolkit (at Sun in
+Mountain View) and the HyperLook UIMS (at the Turing Institute in
+Glasgow), both of which I used to port Micropolis to the SPARC.  To 
+implement MicropolisNet on X11, I'm using the Tk toolkit, which I chose 
+to use because it's free, simple, and extensible. 
diff --git a/src/notes/MULTI b/src/notes/MULTI
new file mode 100644 (file)
index 0000000..c1bace0
--- /dev/null
@@ -0,0 +1,26 @@
+keep track of one per display:
+  tk_priv(...)
+    window
+    posted
+    focus
+    relief
+    cursor
+    activeBg activeFg
+    inMenuButton
+    dragging x y
+    selectMode
+    buttons
+
+fix button tracking
+fix menu tracking
+fix pie menu tracking
+
+tk_mbUnpost needs argument to tell which display
+tk_nextMenu needs argument to tell which display
+tk_nextMenuEntry needs argument to tell which display
+
+which display does "selection" work on???
+
+fix c event focus code to keep focus in display instead of main window
+
+added "focus -query window" form to find out focus on a particular display
diff --git a/src/notes/Micropolis-Indigo.gif b/src/notes/Micropolis-Indigo.gif
new file mode 100644 (file)
index 0000000..399676e
Binary files /dev/null and b/src/notes/Micropolis-Indigo.gif differ
diff --git a/src/notes/Micropolis-NCD.gif b/src/notes/Micropolis-NCD.gif
new file mode 100644 (file)
index 0000000..60f9ae8
Binary files /dev/null and b/src/notes/Micropolis-NCD.gif differ
diff --git a/src/notes/Micropolis-Sun.gif b/src/notes/Micropolis-Sun.gif
new file mode 100644 (file)
index 0000000..43f955d
Binary files /dev/null and b/src/notes/Micropolis-Sun.gif differ
diff --git a/src/notes/MultiPlayerIdeas.txt b/src/notes/MultiPlayerIdeas.txt
new file mode 100644 (file)
index 0000000..b660554
--- /dev/null
@@ -0,0 +1,304 @@
+Notice window
+  welcome
+  scenario descriptions
+  warnings
+
+zone status window
+  display live map picture
+  reconfigure to support various tasks
+  editors for chaging zone
+  invest $ => develop zone => increase land value
+  population density
+  crime prevention
+  environmental cleanup
+  enance growth
+
+editor
+  pie menus
+  demand gauge
+
+budget
+  multi user dialog
+  hour glass timeout
+  auto budget toggle
+  pause/resume toggle (to allow changing budget while simulation is running)
+
+map
+  drag rectangles to pan map views
+  menus on palette
+  generate terrain mode
+  lengend
+  rearrange
+  switch overlays
+  dynamic zone finder
+
+graph
+  2x3 palelet, 10/120 years
+  double buffering
+  communicate data. ard wire in c? 
+
+evaluation
+  historical graphis?
+
+surveyor
+  other editors
+
+dynamic zone finder
+  washboard filter sliders
+
+get key dialog
+
+new city -- or "use map"?
+  name, level
+  scenario selection
+  random terrain generator
+  player can propose a city by selecting a scenario, loading a city, or generating a random terrain. 
+  all players must vote unanimously on a city to play
+  selecting a new city clears all votes
+  players can press next/previous to page through proposed city history
+    you can go back to randomly generated terrains, because it saves the random number generator seed
+    clears votes, proposes new or old city
+  terrain editor todo:
+    Integrate terrain editor code into map editor, 
+    and have a button on the new city map to run in terrain editor mode.
+    Terrain editor will include only terrain editing tools,
+    plus random terrain generation interface,
+    and simulator will be paused.
+
+print dialog
+  Newspaper printing and publishing metaphore. 
+
+  Optionally save a snapshot of the city state, to link to from the newspaper article. 
+
+  Publish in newspaper, print on paper, save to disk, copy to clipboard, 
+  add to journal, blog, etc.
+
+  Allow user to enter text to be printed along with an image, like blogging. 
+  Can print any map or editor view with data overlay and chalk drawings, 
+  entire map (fit on one page, or split across multiple pages), 
+  or other windows like graph, evaluation, notices, messages, chat log, etc. 
+
+  Export text content as html with embedded images. 
+
+  Make an html/image city overview and journal, like The Sims family view and scrapbook. 
+
+  Printable windows and views should have a "print" button or function that pops up a 
+  pie menu of possible destinations, for quickly making snapshots in your journal, etc.
+
+  Publish illustrated newspapers in the game, like The Sims storybook, with newspaper 
+  articles composed of pictures of the city, text excerpts from chat logs, etc. 
+
+  A player could be a "reporter" interviewing other player politicians via chat,
+  before and after the vote on building a stadium, asking them to make their case for
+  or against the stadium, and publish the interviews in the game's newspaper, the
+  "Micropolis Journal".
+
+  Players can browse each others newspapers over the net, and download the city snapshots 
+  the articles write about. 
+
+  Flash: Monster invades Micropolis, near nuclear reactor! 
+  (story and link to saved city so you can read the story, then bring up the city and 
+  play it live from the point the story was written)
+
+quit
+  confirm
+  multi player logout
+
+save dialog
+
+load dialog
+
+network city browsing and sharing
+  "What-If?" history tree.
+  Publish your cities on the net.
+  Download other peoples cities.
+  Use a URL to point to a saved city. 
+  Grab a live snapshot of somebody's running city.
+  Checkpoint and branch timelines.
+  Save a city back to the point where it branched, 
+  to create an alternate history that other players can load.
+  Multiple players build a tree of saved cities with branching alternate histories.
+    Like the parallel universes in Niven's All the Myriad Ways.
+  Rewind any city up the tree and select available alternate histories at each branch point. 
+  Play back alternate histories edit by edit, stop them at any point and take over, 
+  making a new branch point at that location.
+  When you play together in the same city, you have to discuss and agree with other players 
+  about what to do, and convince other people of your ideas.
+  You can try an idea out yourself, by branching your own private history, 
+  giving your idea a try, and reporting back to the other players in the main shared timeline
+  what happened (with links to the save file and history so other players can see for themselves). 
+  GUI: Branching history tree outline viewer of saved files. 
+  Drag and drop a history point into the chat log which other players can click on to open a 
+  live view playing that history. 
+
+status control
+  views
+  players
+  new player
+  new view
+
+Keep and export logs of simulation values
+  r, c, i demand
+  evaluation
+  tax rate, collected
+  funds
+  funding levels
+  event logs
+    simulation events
+      extend simulator to log all interesting simulation events, 
+      so newspaper reporters can write stories about them
+    editing commands
+      Log enough information to replay all edits against a save file to recreate same city.
+      This is the key to high level multi player protocol between
+      multiple parallel lock-step simulations, like The Sims Online,
+      better than using low level x11 to implement the multi player
+      interface)
+      Treat any editing command as a "what-if" branch point where it could go another way.
+      Give players an easy interface to replay a simulation up to a branch point, and 
+      and re-make the decision, to see how it would turn out differently. 
+  chat logs
+  everything else of course
+  web service to access logs
+  export logs as xml for programs or csv for spreadsheets
+  import and export chalk overlay as vector drawing
+  support image overlays with transparency (begs for photoshop-like drawing interface)?
+    Careful how far down that road you go, because you could use it to paint the image of
+    a happy emerald green city over a dreary industrial wasteland. 
+    The simple white chalk overlay has the advantage that you always know what's chalk and what's not. 
+  opml outline with geo-codes
+    store city overlay information in opml
+    register the corners of the map with real-world lat/long values
+      allow rotation and scaling but not arbitrary shearing or distortion
+    register nodes of the opml outline at lat/long points and areas on the map
+      what's a good way to associate an opml node with an arbitrary area on the map? 
+      an attribute with a polygon in lat/long coordinates?
+      a list of rectangles in lat/long coordinates?
+      a list of tiles in row/col coordinates?
+    associate geo-coded opml nodes with features on the map like 
+    zones, buildings, streets, neighborhoods
+      use opml nodes to give names to features, 
+       take notes about them, 
+       attach pictures to them,
+       write stories about them,
+      support overlapping features, so roads can cross, 
+      and each tile can belong to any number of features.
+    allow users to plant signs on the map, like micropolis 2000. 
+      represent signs with an opml node. 
+        signs can contains arbitrary opml outlines
+          with links to other opml nodes
+           like a sign at a crossroad, linked to the nodes representing each road, 
+           and the regions of the city that the roads bring you to.
+      use opml to write a city guide
+      attach chalk overlays and signs to opml nodes so you can show and hide them hierarchically
+
+head window
+  Represents root window of Micropolis application to TCL, and ties all the other windows together. 
+  Contains the application's main menus and scrolling message and chat log.
+
+  An artifact of the way TCL/Tk/X11 works. 
+
+  With another gui, might be the main base window that contains all other subwindows. 
+
+  In X11, we depend on the user's chosen X11 window manager to manage all the separate windows. 
+
+  In a better world (Sugar) Micropolis should let users save and restore windows
+  configurations and multiple views, tailored for various roles and tasks. 
+
+  When a new player joins, the select a role to play, which will grant them 
+  permissions and customize the interface, opening and positioning the appropriate
+  windows and tools for their role. 
+
+  Each role supports various tasks that might themselves reconfigure the user interface. 
+
+  User interface configurations should be selected based on the role and the task. 
+
+  Users first select a role that stays the same (forever or most of the time) 
+  and which grants them a set of permissions. 
+
+  Each role supports a set of tasks (like Eclipse's "aspects"), which users may
+  switch between, to reconfigure the user interface. 
+
+  Players can hold elections to grant each other roles 
+  (like mayor, treasurer, planner, builder, reporter, god, etc).
+
+Ownershop
+
+  This vastly complicates the game, so I didn't try it, but I wrote down some ideas.
+
+  Consider the screen area of the user interface it would require to 
+  enable the user to micro-manage all the ownership issues, in terms of 
+  the number of acres of city map it would cover. 
+
+  It seemed like it would be too complicated to be fun. 
+
+  Even if it could be magically implemented with a simple gui, would it be any fun? 
+
+  That said, here are some ideas. 
+
+  Ownership plane: 0 => nobody, 1-256 => user id 
+    (note: Can't save ownership user ids into save files if we want multiple  
+    players to enter and exit independently from the city itself, or if we
+    want to support an open-ended, possibly large number of players over time. 
+    As I said, this gets complicated pretty fast, without a lot of beneficial fun.)
+
+  Players have separate funds. 
+    This raises issues about: who gets paid how much of the city's overall income,
+    and who pays for city services?
+
+    Could have a main shared city budget, then certain players can be appropriated 
+    funds from that budget earmarked to perform various tasks.
+    But again, that gets pretty complicated, and how is it fun? 
+
+  Competition or cooperation?
+    Should we attempt to make the game support competition between players,
+    or is it better to keep it cooperation-oriented, by requiring unanimous votes,
+    sharing the budget, etc. 
+
+    I think it's simpler and more educational to give players the freedom to misbehave, 
+    while building in social networking and accountability, to let players discuss, 
+    negotiate, make and break deals, establish reputations, reward good behavior, 
+    and punish bad behavior, by developing real-world social interaction skills. 
+
+    What fun would politics be if you couldn't have scandals? 
+
+  Land value
+    higher resolution land value grid
+    effected by sales
+
+  asking price
+    Tiles are owned by someone, and may be for sale, and given an asking price by the owner.
+      Requires complex user interface for selecting tiles, assigning price, etc. 
+      How is that fun? 
+    Groups of tiles: parcels of land, for sale all at once, to highest bidder. 
+      M.U.L.E.-like multi player auctions for land.
+    Developers can build on empty tiles that are for sale, and they're bought automatically. 
+      What's so fun about being a developer? Nothing to do after setting the price of the land. 
+    Buyers can offer to buy something that doesn't have a price, which initiates an 
+    M.U.L.E. dialog with the owner, and allows other players to join in the auction, 
+    submitting their own bids. 
+
+  Transaction tool - $ (or local currency symbol)
+    select group of cells
+  negitiate deals with the owners
+  automatically calculates default land value suggested price (upon which the tax rate based) 
+    based on modified land value through worth
+
+  communication window
+    so people can negotiate and talk
+    irc-like chat rooms where people can have a side discussion
+    private person-to-person messages
+
+  calculate evaluation for each player
+    Independent and combined scores and statistics.
+    Hard to define what this means in terms of the current simulation.
+    Would have to deeply change the way the simulation works,
+    but then would it still be fun?
+
+  Zone ownership.
+    Develop Micropolis into a more Monopoly-like game: SimCitopoly.
+    A player can own power plants and other utilities, and makes money
+    by selling electricity and other services to other players. 
+    Zones don't develop until someone buys them.
+    Own residential => collect rent, pay maintainence. 
+    Own industrial, commercial => collect income, pay expenses.
+    All zone owners pay taxes.
diff --git a/src/notes/NCDAudio b/src/notes/NCDAudio
new file mode 100644 (file)
index 0000000..9834c76
--- /dev/null
@@ -0,0 +1,63 @@
+tcl/tk interface to audio library
+  gui to auctl
+  easily reconfigure user interface for other different audio servers
+  audio error handler / io error handler
+
+set aud [audio openserver server]
+
+$au errorhandler
+$au ioerrorhandler
+$au flush
+$au sync
+$au synchronize
+$au closeserver
+
+$au server connectionnumber
+$au server vendor
+$au server vendorrelease
+$au server string
+$au server name
+
+$au device count
+$au device list
+$au device id valuemask
+$au device id changablemask
+$au device id identifier
+$au device id kind
+$au device id use
+$au device id format
+$au device id numtracks
+$au device id access
+$au device id description
+$au device id minsamplerate
+$au device id maxsamplerate
+$au device id location
+$au device id gain
+$au device id linemode
+$au device id numchildren
+$au device id children
+
+$au bucket count
+$au bucket list
+set id [$au bucket create format tracks access rate samples description]
+$au bucket id destroy
+$au bucket id valuemask
+$au bucket id changablemask
+$au bucket id identifier
+$au bucket id kind
+$au bucket id use
+$au bucket id format
+$au bucket id numtracks
+$au bucket id access
+$au bucket id description
+$au bucket id samplerate
+$au bucket id numsamples
+set flow [$au bucket id play dev start samples volume done]
+set flow [$au bucket id record dev start samples volume done]
+
+$au flow id volume percent
+$au flow id start
+$au flow id stop
+$au flow id state
+
+$au monitor 
diff --git a/src/notes/OLPC-notes.txt b/src/notes/OLPC-notes.txt
new file mode 100644 (file)
index 0000000..cbbf866
--- /dev/null
@@ -0,0 +1,366 @@
+Micropolis for OLCP Sugar User Interface
+By Don Hopkins (dhopkins@DonHopkins.com)
+
+Why is Micropolis such a great match for OLPC's Sugar interface?
+
+Constructivist education.
+  Children learn by doing and experiencing. 
+  Playful learning (as opposed to edutainment).
+  People learn effectively through making things. 
+  Micropolis is often mentioned as a great example of an educational,
+  constructivist game, in the academic literature and popular press.
+
+Multi player
+  Sharing, collaborating, conferencing, voting. 
+
+Writing journals about Micropolis
+  The Micropolis Journal: newspaper metaphore.
+
+Drive the development and prove the worthyness of the technology.
+
+  Develop Micropolis hand-in-hand with Sugar, so they synergize with each other.
+
+  I developed the HyperLook version of Micropolis in parallel with the
+  HyperLook user interface environment, and they both were better
+  because of it. Micropolis required HyperLook to support useful
+  multimedia extensions like a shared audio mixer server, an efficient
+  shared memory based bitmap animation system, and integration with
+  TNT Open Look user interface components (sliders, pin-up menus,
+  buttons, etc). And Micropolis was able to take full advantage of
+  HyperLook's features like outline graphics, scaling images,
+  graphical editing, printing PostScript, etc. Micropolis was extremely
+  useful as an engaging promotional demonstation that proved the
+  capabilities and quality of HyperLook.
+
+Use Micropolis to showcase the unique ideas and features of Sugar, in an
+exciting way that many people can easily understand.
+
+CSound audio mixer.
+Mesh networking. 
+D-bus messaging system.
+Python scripting langauge.
+GTK widgets. 
+Pie menus. 
+Communication and conferencing.
+Chat, shared whiteboard, voting interface. 
+Learn to work together with other people, and argue your ideas. 
+Politics. Interpersonal communication and cooperation. 
+Immersive microworlds. 
+Inspire and teach kids to program.
+Virtual datalogger, tricorder, lets you export and analyze logs and data from simulation.
+Micropolis courseware.
+Teach ecological and environmental issues.
+Social studies.
+Creative writing, developing language skills.
+Science education. 
+
+========================================================================
+
+Notes on adapting Micropolis to the OLPC Sugar user interface:
+
+Core Ideas:
+
+  Activities, not Applications
+
+    First cut: 
+
+      Integrate the current TCL/Tk version of Micropolis to run as a simple activity within Sugar. 
+
+        Restructure the multi-window TCL/Tk code to run in a single full screen window.
+       Implement a simple activity-oriented tiled window management interface. 
+       Disable advanced features like multiple editor and map windows, 
+       that require more sophisticated window management. 
+       Instead of using a traditional multi-window management approach, 
+
+        Make a simple wrapper around it that makes it appear in the Sugar user interface as an activity, like eToys does.
+
+      Long term:
+
+       Implement activity specific modes that reconfigure the user inteface (like Eclipse "perspectives").
+         - build/edit oriented interface
+         - query/analysis oriented interface
+         - financial oriented interface
+         - communication/coordination oriented interface
+         - dynamic zone finder analysis
+         - grid of several overall map views, each configured to show a different overlay. 
+         - grid of several close-up map views, each centered on a different parts of the city (or tracking a player's cursor)
+        
+       Collaboration: Enhance multi player mode to support sharing activities.
+         Both publishing your game for others to clone and play themselves (massively single player, like Spore),
+         and letting others join in your game (like the current cooperative multi-player mode)). 
+         Multi player inte
+
+       Expression: Enhance chat, journaling, storytelling, and personalization aspects of the game. 
+
+       Journaling: Record all events (both user edits and simulation events), chat messages and drawings.
+         Checkpoint the game state, and implement the ability to deterministically replay time stamped 
+         editing events into the simulation, so you can fast forward and rewind from any checkpoint to 
+         any step of the simulation. 
+         Enable players to write newspaper articles about the cities, with live links to a snapshot 
+         of the simulation and a place on the map, related to the story. Other players could browse
+         their published newspapers about the history of a city, and jump into that history at any time
+         from any story. 
+
+       Iteration: Checkpoint game save files, allowing players to rewind history, and try "what-if" experiments. 
+
+  Presence is Always Present
+
+    First cut:
+
+      Enhance the current X11 based multi player interface to support presence, the grid network, and messaging.
+      The current multi player interface runs a single Micropolis process on one laptop, 
+      which connects to the local X server, and/or several other X servers on laptops over the net.
+      Rewrite the "Add User" dialog to be grid-network aware. 
+      Instead of asking for an X server DISPLAY screen, provide a list of friends on the network. 
+      Send an invitation to play to friends on the network. 
+      Rewrite the built-in chat interface to integrate with the chat system used by Sugar. 
+      Improve the shared "white board" overlay, so kids can draw on the map in different colors, 
+      enable and disable different overlays, save overlays with the map, add text to overlays, etc.
+      Implement location based chat, by overlaying people icons and chat bubbles on the map. 
+        Each player has a people icon "cursor" that they can move around the map (which follows 
+       their selected editing cursor), and their chat messages show up in bubbles overlayed on the map.
+       When you select an editing tool, you can type what you're doing with the tool, 
+       other people will be able to watch you, and make comments on what you're doing.
+
+    Long term:
+
+      Rewrite Micropolis in terms of Python/GTK/Cairo, and take full advantage of the Sugar libraries and services. 
+      Support sharing, mentoring, colaboration, voting, political dialogs, journaling, etc.
+      Develop Micropolis into a exemplary, cutting edge demonstration of all that's great about Sugar. 
+
+  Tools of Expression
+
+    Micropolis is great at supporting personal expression, interpretation and storytelling, 
+    and leveraging what the player already knows to make connections to new knowledge,
+    and stimulating conversation, debate and analytical thinking.
+
+    Develop a web based "Wikipedia" oriented interface to Micropolis, supporting colaboration, discussion, 
+    annotation, history journaling, and branching alternative histories. 
+
+  Journaling
+
+    The "Micropolis Journal" could be realized as a web-based
+    newspaper-like interface.
+
+    Expose the multi player user interface through the web, instead of
+    using X11.
+
+    Automatically generate a newspaper for any particular time in a
+    city's history, from the simulator events and state, combined with
+    user written articles and chat messages.
+
+    The newspaper has sections that present automatically generated
+    snapshots of the information displayed in the various dialogs
+    (graph, evaluation, chat, notices, etc), and stories about
+    significant events (both user-generated and simulation-generated).
+
+    Enrich the city save file with metadata including the chat and
+    event journal, overlays, snapshots at different points in time (in
+    a branching "what-if" tree structure), etc.
+
+    In the Python version of Micropolis it will be easy to implement a
+    web server based interface that lets users read the city's
+    newspaper through the web browser, automatically inserting
+    pictures of the map corresponding to particular events in time. An
+    article about pollution going down could show a before and after
+    overall map with the polution overlay, and stuff like that.
+
+    Plug in modules to the simulator that analyze the state of the
+    city and generate events for the newspaper to write articles
+    about, including interesting stastical information and other
+    parameters to insert into the story template. 
+
+    Implement "online surveys" that let newspaper readers vote on proposals
+    (expose the voting interface to web based users).
+
+    Use OpenLaszlo to develop a rich graphical AJAXian web service
+    based Micropolis interface, eliminating the need for the X11
+    interface, and enabling all kinds of interesting interface
+    customizations and mash-ups with other web services.
+
+Know your Audience
+
+  Inexperienced
+
+    Keep the user interface simple, low surface area, direct, obvious, redundant, forgiving. 
+    Gentle learning curve. Self revealing interface. Direct manipulation. 
+    Integrated help and educational content. 
+    Playback journals with voice-overs, so kids can learn by watching and listening to
+    recordings of teachers playing and describing what they're doing. 
+    Multi player support for mentoring. 
+
+  Young
+
+    Micropolis appeals to a wide range of age levels. 
+
+    Design the user interface to support zooming, use large colorful
+    graphics, etc.
+
+    Do not require high coordination, fine pointer positioning, moving
+    the mouse while holding down the button, etc.
+
+    Scale across age levels by using interfaces that clearly reveal
+    themselves to novice users, but can be reconfigured by more
+    experienced users to be more streamlined.
+
+    For example, from the current interface: the map editor window has
+    a palette of editing tools, which makes it easy for novice users
+    to see and learn all the available editing commands, but consumes
+    precious screen space.
+
+    It also provides pie menus as a short cut to the palette, which
+    are layed out in the same arrangement as the palett (so the
+    palette serves as a map to the pie menus). Intermediate users can
+    use the palette as a map, to help learn the pie menus, and when
+    they are more experienced, they can close the palette to make the
+    map bigger, and use the pie menus exclusively.
+
+    The pie menus themselves are self-revealing, and have their own
+    gradual learning curve that supports graduation from inexperienced
+    users (click the menu up, look at the screen, move in the
+    direction, select the item), intermediate users (press down and
+    move in the direction, look at screen to make sure the right item
+    is selected, then select the item), and advanced users (mouse
+    ahead in the correct direction without looking at the screen).
+
+  International
+
+    The text in Micropolis needs to be broken out into external files so
+    it can be translated to different languages.
+
+    The Micropolis documentation, supporting essays about city planning,
+    and study guides need to be translated.
+
+    Best to do this after converting to Python/GTK/Cairo, since the
+    old version of TCL/Tk that Micropolis currently uses does not support
+    unicode or i18n.
+
+    Dig up the tile sets for different kinds of cities (old west,
+    european, futuristic, moon base, etc), develop new tile sets, and
+    enable children to easily develop their own tile sets and
+    interface skins.
+
+Key Design Principles
+
+  Performance
+
+    Micropolis was designed to run well in a C64. 
+
+    I've profiled and optimized it to run efficiently on Unix, and
+    take optimal advantage of the X11 window system.
+
+  Usability
+
+    Micropolis is fairly usable and approachable, but every effort should
+    be made to improve it, take maximum advantage of the Sugar user
+    interface, and for Micropolis to serve as a good example of Sugar
+    interface design, for others to emulate.
+
+  Simplicity
+
+    Some of the advanced features of the multi player X11 version of
+    Micropolis (like multiple map views and editors) will have to be
+    temporarily sidelined, and eventually reimplemented in simpler,
+    activity-oriented ways.
+
+  Reliability
+
+    Micropolis is currently pretty robust and can run for an indefinite
+    time without leaking memory or crashing. 
+
+    The scripting language interface should try to protect against hard crashes, 
+    but once you open it up to scripting, there are an infinite number of ways 
+    programmers could make mistakes. 
+
+  Security
+
+    The code should be audited for security. 
+
+    User access to the scripting language and network remote control
+    code should be disabled.
+
+    Currently it allows any users to type TCL expressions, which is
+    great for cheating, but bad for security. 
+
+    Currently there is some code in there to enable network remote
+    control (setting the tax rate and other parameters via a midi
+    slider box on a Mac running Bounce/Body Electric that sends UDP
+    packets to Micropolis when the user changes the slider).  That should
+    be disabled (and eventually be replaced by a secure web service
+    based network interface.).
+
+  Adaptability
+
+    Adapt to different screen display modes and resolutions.  Micropolis
+    has a high contrast monochrome tile set that it could use in
+    monochrome mode.
+
+    The color tiles look great in monochrome mode with gray scales, 
+    but the high contrast monochrome tiles might be easier to see. 
+
+    Need to support zooming into the map with any magnification, like
+    google maps (or the old PostScript-based HyperLook version of
+    Micropolis).
+
+    Support playing Micropolis with the game controller in book mode. 
+
+    Instead of using X11 for multi player interaction (which will
+    cause the application to crash horribly if the network connection
+    is lost), reimplement the multi player mode on top of the dbus
+    messaging system, so it is more robust, and every player runs
+    their own instance of the simulator, so they all simulate together
+    in lock-step, like The Sims Online.
+
+  Recoverability
+
+    Use checkpointing and journaling to implement automatic back-up,
+    and expose a "rewind/fast forward" interface to the user, so they
+    can back up, change history, and replay changes at any point in time.
+
+    This is also the key to implementing a more advanced multi player
+    interface (better than the current X11 based system, more like The
+    Sims Online, where everyone runs their own copy of the simulation
+    in lock-step), so anyone can join the game by cloning its current
+    state, subscribing to its edit event stream, and submitting all
+    their edits to the master simulation (or going through the voting
+    negotiation system, like the current voting interface for building
+    expensive items and changing the tax rate).
+
+    Solve the colaborative undo/redo problem by allowing children to
+    branch out to their own private alternative histories. Instead of
+    overwriting the one main history, it inserts a branch point into
+    the shared history that links to their own private Idaho, which
+    itself may branch out into many histories. See Larry Niven's "All
+    the Myriad Ways".
+
+  Interoperability
+
+    Exposing Micropolis as a set of web services would enable all kinds
+    of interesting mash-ups and rich web based user interfaces.
+
+  Mobility
+
+    Support playing Micropolis in book mode with the game pad. 
+
+  Transparency
+
+    The "view source" button could bring up the Micropolis source code.
+    Develop some source code documentation and extend the "How the
+    Simulator Works" documentation to link into the appropriate source
+    code. Annotate the C and Python source code to better explain how
+    it works.
+
+    Encourage children to learn Python programming (rather than
+    focusing on the C source code). Develop a robust Python scripting
+    interface that lets you hook into and control all aspects of the
+    simulator. Enable users to develop various kinds of Micropolis
+    plug-ins (buildings, editing tools, agents, disasters, etc) that
+    are easily scripted in Python, by subclassing.
+
+  Accessibility
+
+    Enable full keyboard control. 
+    Enable full game pad control.
+    Enable full network control. 
+    Speech synthesis and recorded voice feedback. 
+    Zooming interface. 
diff --git a/src/notes/Performance b/src/notes/Performance
new file mode 100644 (file)
index 0000000..217ec97
--- /dev/null
@@ -0,0 +1,47 @@
+8878317760   31.79  31.79     163289     14 animateTiles (g_ani.c)
+  funky funky
+
+1807963847    6.47  50.11      66550     18 MapScan (s_sim.c)
+
+1041273098    3.73  62.74         26     24 GetFromMap (s_traf.c)
+  unwind and inline
+
+ 909060732    3.25  69.71         39     34 SetZPower (s_zone.c)
+  frequently called from DoZone, MapScan
+
+1041273098    3.73  62.74         26     24 GetFromMap (s_traf.c)
+ 603351309    2.16  80.21         84     23 DriveDone (s_traf.c)
+  unwound and inlined DriveDone's 4 calls to GetFromMap
+
+
+1398123339    3.85  66.07        103     28 Rand (s_sim.c)
+ 199605792    0.55  90.82         76     17 RandInt (s_sim.c)
+   1336958    0.00  99.77         80     26 GRand (s_gen.c)
+    280400    0.00  99.95         29     17 random (random.c)
+    270800    0.00  99.95        102     30 ORand (s_mvobj.c)
+       340    0.00 100.00         34     52 ReallyRandom (tclxmath.c)
+       100    0.00 100.00         10     20 rand (rand.c)
+
+lose as many calls to Rand as possible (RandInt is faster)
+inline TestBounds2
+
+malloc            117467  29.27       1022  Tk_DoWhenIdle (tkevent.c)
+                   73203  18.24        908  Tk_CreateTimerHandler (tkevent.c)
+Tk_DoWhenIdle and Tk_CreateTimerHandler should keep a list of reusable frobs
+
+free               73201  18.48       1296  Tk_DoOneEvent (tkevent.c)
+                   59107  14.92       1065  Tk_CancelIdleCall (tkevent.c)
+                   58360  14.73       1372  Tk_DoOneEvent (tkevent.c)
+Tk_DoOneEvent should reuse stuff
+
+strlen             71590  22.28        518  StringCreate (tclhash.c)
+                   65469  20.37        410  Tcl_SetVar2 (tclvar.c)
+
+strcmp            108488  73.40         99  xpmHashSlot (hashtab.c)
+
+XSync              73384  99.94        100  UpdateFlush (w_x.c)
+
+Tk_DeleteTimerHandler   73202  99.99        818  StopMicropolisTimer (w_tk.c)
+Tk_CreateTimerHandler   73203 100.00        810  StartMicropolisTimer (w_tk.c)
+Tk_CancelIdleCall   59067  99.87        277  CancelRedrawView (w_tk.c)
+
diff --git a/src/notes/Publicity b/src/notes/Publicity
new file mode 100644 (file)
index 0000000..9611a23
--- /dev/null
@@ -0,0 +1,28 @@
+Sun
+SGI
+IBM
+HP
+DEC
+SCO
+
+2 page article in GIS World, May/June
+
+GIS Convention in Boston
+  Scott McNealy using SC as a prop, throwing a box to the audience
+
+Uniforum
+  SGI booth
+
+InterCHI
+  Interactive Experience
+  Video Tape
+
+Sun World
+
+SGI Conference in April
+
+Sun Columbia Open House
+
+John Gage demonstration to congress
+
+"Self Revealing Gestural Interfaces" talk to IBM Almaden Research, Interval Research
diff --git a/src/notes/Questions b/src/notes/Questions
new file mode 100644 (file)
index 0000000..39b0803
--- /dev/null
@@ -0,0 +1,45 @@
+########################################################################
+# Questions
+########################################################################
+
+
+global Questions
+
+
+proc Question {id color title msg {props {}}} {
+  global Questions
+  set Questions($id) [list $color $title $msg $props]
+}
+
+Question QuitSingle #ff0000 "Quit Micropolis" \
+    "Do you want to quit playing Micropolis?" \
+{{left {{Keep Playing.} Quit.KeepPlaying
+   {RejectPlan}}}
+ {right {{I Quit!} Quit.IQuit
+   {DoReallyQuit %s}}}}
+
+Question QuitMulti #ff0000 "Quit Micropolis" \
+    "Do you want to quit playing Micropolis?" \
+{{left {{Keep Playing.} Quit.KeepPlaying 
+   {RejectPlan}}}
+ {middle {{I Resign!} Quit.IResign
+   {DoIResign %s}}}
+ {right {{I Quit!} Quit.AllQuit 
+   {DoReallyQuit %s}}}}
+
+Question Choose #ff0000 "New City" \
+"Do you want to abandon this city and select another one?" \
+{{left {{Keep Playing.} SelectCity.No
+   {RejectPlan}}}
+ {right {{Yes, another city!} SelectCity.Yes
+   {UIPickScenarioMode}}}}
+
+# Ugh.
+Question Build #00ff00 "%s" "%s" \
+{{left {{Dismiss Plan.} Plan.Dismiss
+   {WithdrawAskOf %s}}}
+ {right {{Support plan!} Plan.Support 
+   {SupportPlan $view %s $tool $x $y}
+   {PreviewSupportPlan $view %s $tool $x $y}}}}
+
+
diff --git a/src/notes/Release b/src/notes/Release
new file mode 100644 (file)
index 0000000..39bc30c
--- /dev/null
@@ -0,0 +1,68 @@
+    Multi Player Micropolis for X11 is now available from DUX Software!
+
+DESCRIPTION:
+       Micropolis, the original award winning city simulation game from
+Maxis Software, now runs on powerful Unix workstations with X11!  DUX's
+implementation of Micropolis for Unix was awarded product of the year 1992
+by Unix World in the January 1993 issue, and reviewed in the April 1993
+issue.  Now it's souped up, works with standard X11 servers, and even
+supports networked multi user collaboration!  Multi Player Micropolis is
+designed to be a fun cooperative educational experience!
+
+       Micropolis is a colorful animated interactive system simulation
+game, providing a set of rules and tools for planning and building a
+complex dynamic simulated city.  Several people on different X11
+workstations can participate in the same city, cooperating and
+coordinating their actions across the network.
+
+       Working together, you can zone land use, hook up the power grid,
+build roads, bridges, parks and stadiums, raise taxes, and even summon
+disasters, causing the city to grow and thrive, or crumble and die.  It's
+a creative, entertaining way to develop your political skills!
+
+REQUIREMENTS:
+       Micropolis runs on Silicon Graphics Irix, SPARC SunOS, and other
+Unix workstations.  You can play it locally or over the network on most 8
+bit color or monochrome X11 displays, like NCD X terminals.  And you can
+hear it on standard sound devices, and NCD's NetAudio server.
+
+OPTIONS:
+       Micropolis supports but doesn't require the X11 shared memory and
+shaped window extensions, and a local sound device or NetAudio server.
+And you can turn off the sound so your boss doesn't know you're playing!
+
+FEATURES:
+       Multi Player Micropolis for X11 sports the Motif look and feel,
+implemented using the efficient TCL/Tk toolkit.  It features multiple
+city editors and maps with overlays, fast colorful animation, engaging
+sound effects, easy to use pie menus and direct manipulation interaction,
+simultaneous multi player editing, communication and annotation
+facilities, and voting dialogs for group decision making.  It includes
+eight challenging scenarios and a library of interesting cities.
+
+AVAILABILITY:
+       Multi Player Micropolis is available directly from DUX Software, and
+via anonymous ftp from ftp.uu.net (192.48.96.9), in the directory
+"vendor/dux/Micropolis".  You may freely copy it, and play the fully
+functional game in "demo mode" on one display without a license, but the
+city melts every 5 minutes.  If you enjoy Micropolis, you can buy a license
+over the phone by credit card, without leaving your seat!  A single
+player license lets you save and restore your cities, and play for as
+long as you like on one display; a multi player license lets you play
+Micropolis with your friends over the net!
+
+PRICING:
+       Single Player Node Locked License:       $49
+       Multi Player Node Locked License:        $89
+       Single Player Floating License:         $129
+       Multi Player Floating License:          $149
+
+PLEASE CONTACT:
+       DUX Software, 4906 El Camino Real, Suite 1, Los Altos, CA 94022
+       Phone #: 1-800-543-4999 or 1-415-967-1500, FAX #: 1-415-967-5528
+       Email: micropolis@dux.com
+
+NOTICE:
+       X11 Micropolis Copyright (C) 1993 by Electronic Arts.
+Unix implementation and multi player user interface by Don Hopkins, DUX.
+Based on the original Micropolis concept and design by Will Wright, MAXIS.
diff --git a/src/notes/SharedData b/src/notes/SharedData
new file mode 100644 (file)
index 0000000..75b4d0c
--- /dev/null
@@ -0,0 +1,62 @@
+* Notes:
+do tile animation in parallel - tileSynch
+maps on demand
+
+* Initialize at start of game:
+
+short mickStartingYear;
+extern char *cityName;
+extern char *CityFileName;
+extern short GameLevel;
+
+* Share data:
+
+** global
+long CityTime;
+short *Map[WORLD_X];
+** editor window
+short Oframe[OBJN];
+short GlobalX[OBJN];
+short GlobalY[OBJN];
+long totalFunds;
+short RValve, CValve, IValve;
+** map window
+short *PowerMap;
+Byte *PopDensity[HWLDX];               /* 2X2 Maps  60 x 50 */
+Byte *TrfDensity[HWLDX];
+Byte *PollutionMem[HWLDX];
+Byte *LandValueMem[HWLDX];
+Byte *CrimeMem[HWLDX];
+short RateOGMem[SmX][SmY];
+short PoliceMapEffect[SmX][SmY];
+short FireRate[SmX][SmY];
+** graph window
+short ResHisMax, Res2HisMax;
+short ComHisMax, Com2HisMax;
+short IndHisMax, Ind2HisMax;
+short *ResHis;
+short *ComHis;
+short *IndHis;
+short *MoneyHis;
+short *PollutionHis;
+short *CrimeHis;
+short *MiscHis;
+short Graph10Max, Graph120Max;
+short Res2HisMax, Com2HisMax, Ind2HisMax;
+** evaluation window
+** budget window
+short CityTax;
+long RoadSpend, PoliceSpend, FireSpend;
+long RoadFund, PoliceFund, FireFund;
+float roadPercent, policePercent, firePercent;
+long roadMaxValue, policeMaxValue, fireMaxValue;
+long TaxFund, RoadFund, PoliceFund, FireFund;
+
+
+* Messages
+censusChanged
+message(msg, x, y)
+earthquake
+newMap
+
+formalize all global variable setter functions, to go through tcl
diff --git a/src/notes/Strategy b/src/notes/Strategy
new file mode 100644 (file)
index 0000000..41270b6
--- /dev/null
@@ -0,0 +1,114 @@
+From: skaven@carson.u.washington.edu (Willilam Gilliland)
+Newsgroups: comp.sys.mac.games
+Subject: Micropolis Strategies for Success
+Summary: How to build a better burg.
+Date: 24 Oct 92 20:15:41 GMT
+Organization: University of Washington, Seattle
+
+What follows is the general strategy I use whenever I play 
+Micropolis.  With it I have been able to build a self-sustaining
+city of 270,000 on Medium without resorting to cheats such as
+F-U-N-D or banzai taxation or the 'no disaster' setting.  
+This strategy was based on a few ideas given to me by Kevin 
+Ames (kja5@po.CWRU.edu) who has had a city last 1000 years,
+long enough that two nuclear meltdowns have occured and the
+radiation has decayed.  
+
+Note, however, that this strategy will not let you keep 
+growth going indefinately.  In about 250 years (at least the 
+way I play) the screen is filled and the zones are at 
+operating capacity.  While population will fluctuate due to 
+the world economy (+/- about 10000 people) it will not grow 
+significantly beyond that level.
+
+This strategy is based on two principles in the game.
+
+P1. Zones are affected greatest by the 1-thick row of spaces
+surrounding them.
+
+P2. The life or death of a city is based on cash flow.
+
+Therefore, the strategy revolves around maximizing your 
+income by affecting the spaces around every zone and at the
+same time minimizing your expenses.  To do this you should
+follow these guidelines.
+
+1. MAXIMIZE zone contact with parks, forests, and shoreline. 
+Since the important contact is the one space around them, to 
+maximize your profit you should space zones one space apart, 
+leaving a strip of forest between them.  Since I prefer maps 
+with a river running down the middle, I will put zones in 
+small blocks of 3 or 4 to increase density at the city 
+center.  Any empty spaces should be filled with parks.
+
+Since natural forests and shoreline are worth more than parks 
+and bulldozed shoreline, you should always strive to preserve 
+as much as you can while getting the most use out of them.
+
+2. MINIMIZE the amount of rails, roads and power lines you 
+have.  A good way to do this is to have a long straight road 
+with zones along both sides of it.  Do NOT surround zones 
+with roads like city blocks in real life -- this increases 
+expenses for road maintenance, increases pollution, and 
+lowers property values by reducing contact with forest/parks.  
+Besides, only one contact space is necessary.  Since you can 
+send power lines (perpendicularly) over road sections you 
+should do this whenever possible, as it increases the space 
+available for parks/forests.
+
+Since roads are cheaper to build and maintain than rails you 
+should keep them in the low-usage areas and keep the rails 
+for the high usage areas.  Another way to reduce your rails 
+is to have small 'buds' of zones connected by roads to a main 
+rail strip.
+
+An example of a 'long strip' is below.
+
+  #########################################################
+  #rrr#rrr#ccc#rrr#rrr#ccc#rrr#rrr#ccc#rrr#rrr#ccc#rrr#rrr#
+  -rrr#rrr-ccc#rrr-rrr#ccc-rrr#rrr-ccc#rrr-rrr#ccc-rrr#rrr#
+  #rrr#rrr#ccc#rrr#rrr#ccc#rrr#rrr#ccc#rrr#rrr#ccc#rrr#rrr#
+  ==+===+===+===+===+===+===+===+===+===+===+===+===+==+###
+  #rrr#rrr#ccc#rrr#rrr#ccc#rrr#rrr#ccc#rrr#rrr#ccc#rrr#rrr#
+  #rrr-rrr#ccc-rrr#rrr-ccc#rrr-rrr#ccc-rrr#rrr-ccc#rrr-rrr#
+  #rrr#rrr#ccc#rrr#rrr#ccc#rrr#rrr#ccc#rrr#rrr#ccc#rrr#rrr#
+  #########################################################
+
+#      forest or park        - power line
+=      rail                  + power line crossing rail
+r      r-zone
+c      c-zone
+
+3. MINIMIZE pollution near R and C zones.  The easiest way to 
+do this is to bunch all your I-zones together at the 
+periphery of the map, to leave the city center for the more 
+valuable R and C zones.  You should also leave a 1-wide strip 
+of parks between the zones to decrease the severity of the 
+pollution.  Remember, roads add to pollution too, so if you 
+have a lot of traffic put in rails.
+
+4. MINIMIZE the number of police and fire stations while you 
+MAXIMIZE coverage area.  The spacing takes practice to figure 
+out, but on my screen the ideal spacing is to have the police 
+stations in a triangular pattern that just fits on the 
+screen.  In other words, I have two stations in the bottom 
+corners of the window and one at the top in the center (or 
+vice versa).  Concentrated police coverage is much more 
+important than concentrated fire coverage, and I use a wider 
+triangular pattern for fire departments.
+
+While there are a number of tips to improve game play, these guidelines
+are general patterns that, if followed, will let you build cities that have
+a positive cash flow with a low tax level.  And that is all you need to have
+cities last indefinately.
+
+===============================================================================
+   __                                                                    ____
+  |  |                    The Missionary of Montlake                    /    \
+  |~~|              Bill Gilliland, skaven@u.washington.edu             |    | 
+ /    \                    Expatriate Member, SUDS                      |    |
+ |    |                                                                 |    |
+ |    |                        IN VINO VERITAS                          |    |
+ |    |                                                                 \    /
+ |    |                    "In Wine there is Truth"                      |  | 
+ \____/                                                                  |__|
diff --git a/src/notes/TODO b/src/notes/TODO
new file mode 100644 (file)
index 0000000..295952c
--- /dev/null
@@ -0,0 +1,50 @@
+* notice views on flood, 41 heavy traffic, 22 tornado
+
+* shell scripts & licensing
+  include elmnotify etc
+
+* configuration panel
+  preferences (global, per head)
+    auto scroll edge
+    auto scroll step
+    auto scroll delay
+    pie menu popup delay
+    sound effect level
+
+* players
+  more info, saved in database
+  name, server, email addresses
+  audio servers (per head?)
+  save/restore named window configurations
+
+* help (8)
+  must implement a help mechanism and put in lots of help
+
+* documentation
+  manual entries for Micropolis, elm stuff, audio servers
+
+* manual (9)
+  need to re-write manual, and do new illustrations
+  must have a framemaker license to do this
+
+* keyboard commands: arrow, function keys (3)
+  also need to disable autorepeat
+
+* save/restore overlay (5)
+  write all overlay information into another file, like Glasgow.city.overlay
+
+* print city dialog (6)
+  need to implement printing function and control panel from scratch
+
+* In file dialog boxes, highlight text and then typing doesn't replace it,
+  you still have to backspace.
+
+* In file dialog boxes, ~ isn't interpreted correctly.
+
+* Start Hamburg, restart another scenario.  the new scenario gets bombed.
+  can't reproduce
+
+* Tk text fields don't display cursor on second screen
+
+* One person inserting text into text field moves everybody else's 
+  insertion point to the end.
diff --git a/src/notes/TkVersion b/src/notes/TkVersion
new file mode 100644 (file)
index 0000000..a3592d6
--- /dev/null
@@ -0,0 +1,40 @@
+tcl6.4
+tclX6.4c-p1
+tk2.3
+tkpixmap-1.3 patch to tk
+xpm3.2a
+
+tcl, tclX and tk absolute file name global variable patchs
+  tcl default file?? TCL_DEFAULT
+
+fix tkpixmap patch to support named pixmaps on a per screen basis
+
+
+tcl patches:
+  config:
+    forced: set stdlibOK=1
+  tclCmdIL.c:
+    added global TCL_Library
+  tclUnix.h:
+    #if 0'ed out unix procedure prototypes
+  stdlib.h:
+    added CONST to atof
+
+tclX patches:
+  tkWindow.c:
+    added global TK_Library
+  src/tclExtdInt.h:
+    acc warns of integer overflow. inserted casts.
+  tclXlib.h:
+    changed (char *)NULL to (char **)NULL
+
+tk patches:
+  multiple display patchs to tk
+    hash tables:
+      tkBitmap.c tkCursor.c tkPixmap.c 
+    grab:
+      tkGrab.c
+      library/menu.tcl
+  tk.h:
+    defined _PTRDIFF_T and _SIZE_T, so gcc's stddef.h doesn't clash 
+    with sunos4.1.1's stdtypes.h
diff --git a/src/notes/bugs.txt b/src/notes/bugs.txt
new file mode 100644 (file)
index 0000000..045deb6
--- /dev/null
@@ -0,0 +1,8 @@
+Package as a Sugar activity.
+
+Adjust position and width of buttons in scenario panel, wider and to right. 
+
+When running in wire mode, the incremental overall map updating code
+(XDrawPoints) seems to draw in the wrong place horizontally, half a
+screen to the right.
+
diff --git a/src/notes/outline b/src/notes/outline
new file mode 100644 (file)
index 0000000..a7698a2
--- /dev/null
@@ -0,0 +1,475 @@
+BUGS:
+
+
+* multi-user "select city" dialog
+** Add about, configure buttons
+** draw and erase on map window
+
+* configuration panel
+** players
+** keys
+
+* sim.
+** command to set process nice
+** first editor on a display gets a control window
+
+
+* control window.
+** file menu.
+*** About (dialog)
+*** LoadScenario (confirm)
+*** StartNewCity (confirm)
+*** LoadCity (file dialog)
+*** SaveCity (file dialog if no file name)
+*** SaveCityAs (file dialog)
+*** PrintCity (print dialog)
+*** GetKey (key dialog)
+*** QuitMicropolis (confirm)
+** options menu
+*** auto budget, auto goto, auto bulldoze, disasters, sound
+** disasters menu
+*** monster, fire, flood, air crash, tornado, earthquake, meltdown
+** window menu
+   defer creating windows
+
+
+* more controls
+** command field
+*** type in arguments to menu commands
+*** interpret tcl
+** icon for each window opened and openable (dim)
+*** window name, display name, user name
+*** click opened icon to bring to top
+*** click openable icon to make new window
+*** make nice icons
+*** display nice icons in x window icons too
+*** save window layout
+*** restore window layout
+** speed slider
+** priority slider
+
+
+* editor window.
+** editor view.
+** tool pallet.
+** various text fields.
+*** funds, date, message, cost.
+** initialize controls
+** autogoto is a per-editor flag
+** autogoto toggle
+** coal/nuclear toggle
+** update frequency slider
+** cursor tool outline (preview?)
+** pie menus
+** earthquake
+** demand gauge
+** auto scroll
+** constrained drag
+** arrow keys pan
+** fix autorepeat problem
+
+
+* map window.
+** set window title
+** initialize pallet and menus
+** legend tied to map state
+** menu buttons that appear when needed
+*** zone type
+*** population type
+*** service type
+** disable manipulation of other peoples maps (unless you're god)
+** click on a rectangle to bring that editor to the top
+** create a new editor by clicking on the small map
+** open new display by typing in a display name and creating a new editor
+** update frequency slider
+
+* budget window.
+** set window title
+** hour glass
+** auto budget behavior
+     do we or don't we pause the simulator?
+     do we or don't we bring up other peoples budget window?
+     when AutoBudget, simulator continues, and just your window opens.
+     when not AutoBudget, simulator pauses, so everyones window opens, 
+     hour glasses starts
+     how about we just don't pause, and everyone controls their own window.
+
+* graph window
+** set window title
+** graph object
+*** GraphRange ?10|120?
+*** GraphType 0..5 ?0..1?
+*** set window title
+
+
+* dialogs
+
+** start scenario.
+*** 6 scenario buttons, labeled.
+*** new city.
+*** load city.
+*** get key
+*** dynamic scenario description
+
+** generate city
+*** label "creating new map"
+*** city name text field
+*** city level buttons with labels
+*** map view
+*** generate new terrain
+*** use this map
+*** load city
+*** play scenario
+*** get key
+
+** load
+*** file dialog
+
+** save
+*** file dialog
+
+** print
+*** mono / color
+*** small map / large map
+*** printer command text field
+*** print button
+
+** key
+*** Instructions, Address, Phone Number (labels)
+*** License Type: Node/Network (exclusive settings)
+*** License Code: (field)
+*** Enter Key: (text field)
+*** Install Key (button)
+
+** zone status
+*** zone type label
+*** Density, Value, Crime, Pollution, Growth (fields)
+
+** notice
+*** city size
+**** city size label, description message
+**** town, city, capital, metropolis, megalopolis, winner
+*** warning messages
+**** warning name, description message
+**** pollution, crime, traffic, monster, meltdown, riots, demo, impeachment
+
+** about
+*** text, pictures, noises
+
+** confirm
+*** message, yes button, no button
+
+** error
+*** message
+*** ok
+
+* evaluation window.
+
+
+* help
+
+
+* printing
+
+
+* sound
+
+
+* new elm interface
+
+
+* tk
+** masked pixmap object for canvases (or a regular componant)
+** pie menus
+
+
+
+
+* stacks
+
+** Audio
+  implement audio interface
+
+** Micropolis
+  About box
+*** messages
+  /StartGame { % HomeDir ResourceDir StackDir KeyDir => -
+  /ReallyStartGame { % - => -
+  /NewGame { % - => -
+  /StartLoad { % - => -
+  /StartScenario { % name|number => -
+  /DoStartNewCity { % - => -
+  /DoPlayNewCity { % - => -
+  /DoLoseGame { % - => -
+  /DoLoadScenario { % - => -
+  /DidLoadScenario { % - => -
+  /DoLoadCity { % - => -
+  /HeyLoadCity { % name => -
+  /CancelLoadCity { % - => -
+  /DidLoadCity { % - => -
+  /DidntLoadCity { % error => -
+  /DoSaveCity { % - => -
+  /DoSaveCityAs { % - => -
+  /HeySaveCityAs { % name => -
+  /DidSaveCity { % - => -
+  /DidntSaveCity { % error => -
+  /DoGetKey { % - => -
+  /DoQuitMicropolis { % - => -
+  /InitializeSound { % - => -
+  /ShutDownSound { % - => -
+  /SetUserSound { % bool => -
+  /MakeSound { % n => -
+  /StartSound { % n => -
+  /StopSound { % n => -
+  /SoundOff { % - => -
+  /UckfayEthayOlicepay { % - => -
+  /PrintLargeMap { % - => -
+  /PrintSmallMap { % - => -
+  /HyperDrawLargeMap { % - => -
+  /HyperDrawSmallMap { % - => -
+  /HyperDrawCityView { % - => -
+  /DoPrintCity { % - => -
+  /StartElmd { % - => -
+
+** Budget
+  Tax Rate Percent: (slider 0% 20%)
+    /SetTaxRate
+  Taxes Collected: (field)
+  Amount Requested (column heading)
+  Amount Allocated (column heading)
+  Funding Level (column heading)
+  Fire Fund: (field) (numeric) (slider 0% 100%)
+    /SetFireFund
+  Police Fund: (field) (numeric) (slider 0% 100%)
+    /SetPoliceFund
+  Trans. Fund: (field) (numeric) (slider 0% 100%)
+    /SetTransFund
+  Cash Flow: (field)
+  Previous Funds: (field)
+  Current Funds: (field)
+  Hour Glass (inactivity timer)
+    goes for 20 seconds then takes down budget window and continues
+  Go With These Figures (button)
+    /GoWithTheseFigures /ResumeSim /Hide
+*** messages
+  /SetBudget { % [($flow) ($previous) () ($current)] ($collected) tax => -
+  /SetMaxFunds { % [($road)] [road] [($police)] [police] [($fire)] [fire] => -
+  /StartWaiting { % - => -
+    shows hour glass
+
+** Editor
+  File (menu)
+    { NIL /DoLoadScenario /Micropolis Send }
+    { NIL /DoStartNewCity /Micropolis Send }
+    { NIL /DoLoadCity /Micropolis Send }
+    { NIL /DoSaveCity /Micropolis Send }
+    { NIL /DoSaveCityAs /Micropolis Send }
+    { NIL /DoPrintCity /Micropolis Send }
+    { NIL /DoGetKey /Micropolis Send }
+    { NIL /DoQuitMicropolis /Micropolis Send }
+  Options (menu)
+    [exch] /SetOptions ClientSend
+  Disasters (menu)
+    { NIL /MakeMonster ClientSend }
+    { NIL /MakeFire ClientSend }
+    { NIL /MakeFlood ClientSend }
+    { NIL /MakeAirCrash ClientSend }
+    { NIL /MakeTornado ClientSend }
+    { NIL /MakeEarthquake ClientSend }
+    { NIL /MakeMeltdown ClientSend }
+  Time (menu)
+    /Action {
+       [exch] /SetSpeed ClientSend
+    } def
+  Priority (menu)
+    /Action {
+       { {1000 5} {500 4} {250 3} {120 2} {60 0} {25 0} {0 0}
+       } exch get cvx exec
+       [exch] /SetNice ClientSend
+       [exch] /SetDelay ClientSend
+    } def
+  Windows (menu)
+    { NIL /UpdateBudget ClientSend }
+    { NIL /UpdateEvaluation ClientSend
+      /MicropolisEvaluation ShowStack }
+    { /MicropolisGraph ShowStack }
+    { /MicropolisSurveyor ShowStack }
+    { /MicropolisNotice ShowStack }
+    { /MicropolisMap ShowStack }
+    { /MicropolisEditor ShowStack }
+  Funds: (field)
+  Date: (field)
+  Message: (field)
+  Editing Icons (exclusive settings)
+    /InitGame
+    /DoSetWandState /SetPowerType
+  Demand: (gauge)
+    /SetDemand { % r c i => -
+  Zoom In/Out (rocker switch)
+  Zoom Reset (button)
+  Tool Cost: (field)
+  Editor View
+    Editing Icons (pie menu)
+      /DoSetWandState
+    Cursor outline showing where tool will operate
+      color codes for tools
+        query          gray
+        bulldozer      brown
+       road            black white
+       wire            black yellow
+       rail            black brown
+       park            brown green
+       residential     green
+       commercial      blue
+       industrial      yellow
+       police          brown blue
+       fire            brown red
+       stadium         gray green
+       coal            gray yellow
+       seaport         gray blue
+       airport         gray white
+       nuclear         gray yellow
+       monster         orange
+       helicopter      red
+
+       draw (colored pen)
+
+       
+       
+    Panning with arrow keys
+    Panning by dragging
+    Dynamic panning & bouncing
+    Earthquake
+    Mouse tool handling
+    Tools connect corners
+    Constrained drag
+    Auto scroll
+*** messages
+  /InitGame { % - => -
+  /DoEarthQuake { % - => -
+  /DoSetWandState { % state => -
+  /JustSetWandState { % n => -
+  /SetMessage { % str => -
+
+** Evaluation
+  Public Opinion (column header)
+    Is the mayor doing a good job? (field)
+      % yes, % no (fields)
+    What are the worst problems? (field)
+      % problem, ... (fields)
+  Statistics (column header)
+    Population, Net Migration, Assessed, Value, Category (fields)
+    Overall City Score (field)
+      current score (field)
+      anual change (field)
+*** messages
+  /SetEvaluation { % [strings] => -
+
+** Graph
+  Graph Plot
+    /InitGraph /GraphMe
+    /SetGraph { % [range year month res com ind money crime pollution] => -
+  10/120 Year (exclusive toggle)
+    /SetGraphRange
+  Residential, Commercial, Industrial, Money, Crime, Pollution (toggles)
+*** messages
+
+** Map
+  Scenerio Screen
+    Noisy Grill (toggle)
+    Duck (button)
+    Key (button)
+    New City, Load City (buttons)
+    6 scenarios (buttons)
+    scenario names (labels)
+  Map Background
+    Map View
+      Shows rectangles for editor views
+      Drag rectangles to scroll editor views
+    Terrain Generator
+      Generate New Terrain, Use This Map (buttons)
+    City Map
+      Map State Icons (exclusive settings)
+       Zone Type (menu)
+       Population Type (menu)
+       Service Type (menu)
+       /OnInit
+       /SetMapState /SetZoneType /SetPopNRate /SetPoliceRadius
+      Legend
+       Max/Min / +/- / none (picture)
+*** messages
+  /InitGame { % - => -
+
+** Notice
+  Welcome Notice
+  New City (dialog)
+    Creating New Map ... (label)
+    City Name: (text field)
+    Game Level: Easy/Medium/Hard (exclusive settings)
+  Are You Sure?
+    Yes, No (buttons)
+  Really Quit?
+    Save City, Really Quit, Never Mind (buttons)
+  Print City
+    Monochrome/Color (exclusive settings)
+    Edit Small Map, Edit Large Map, Edit City View (buttons)
+    Printer Command: (text field)
+    Print Small Map, Print Large Map, Show Printer Queue (buttons)
+  Install Key
+    Instructions, Address, Phone Number (labels)
+    License Type: Node/Network (exclusive settings)
+    License Code: (field)
+    Enter Key: (text field)
+    Install Key (button)
+  Earthquake Control
+    Richter Scale: (slider .1% 10%)
+    Earthquake (button)
+  Scenario Descriptions
+  Zone Status
+    Zone Type (field)
+    Density, Value, Crime, Pollution, Growth (fields)
+  Game Level Notices
+  Warnings
+*** messages
+  /InitGame { % - => -
+  /ShowNotice { % card => -
+  /ShowPicture { % id => -
+  /ShowZoneStatus { % type [s0 s1 s2 s3 s4] => -
+  /AreYouSure? { % yesResponse => -
+  /Respond { % target thing|null => -
+  /Yes { % - => -
+  /No { % - => -
+
+** Surveyor
+  Editor View(s)
+  Zoom In/Out (rocker switch)
+  Zoom Reset (button)
+  Single/Multiple View (toggle)
+  Click on surveyor view to center editor there
+*** messages
+  /AutoGoto { % x y msg => -
+  /AutoGotoClick { % - => -
+
+** Help
+  Help Text Display
+  Done (button)
+
+
+
+Dullsville
+       Philip Glass, Powaqqatsi, That Place
+San_Francisco
+       Grateful Dead, Fire on the Mountain
+       Philip Glass, Powaqqatsi, Serra Pelada
+Hamburg
+       Yello, Oh Yeah
+Bern
+       Yello, RubberBandMan
+       Philip Glass, Powaqqatsi, CAUGHT!
+Tokyo
+       Percussions D'Asie
+       Philip Glass, Powaqqatsi, Serra Pelada
+Detroit
+Boston
+Rio_de_Janeiro
+       Philip Glass, Powaqqatsi, From Egypt
diff --git a/src/notes/sim.gif b/src/notes/sim.gif
new file mode 100644 (file)
index 0000000..83c1042
Binary files /dev/null and b/src/notes/sim.gif differ
diff --git a/src/notes/to.ouster b/src/notes/to.ouster
new file mode 100644 (file)
index 0000000..fbf7af8
--- /dev/null
@@ -0,0 +1,202 @@
+To: ouster@sprite.berkeley.edu
+Cc: hopkins
+Subject: more multiple display stuff
+--text follows this line--
+A problem I fixed is that the "focus" command only returns the focus
+of the main window's display, and there's no way to find out the focus
+on other displays.  I fixed this by adding a "focus -query .window"
+form, that returns the focus of the display of the named window.  When
+the tcl menu tracking code supports multiple displays, it will need to
+use this form to save the focus of the appropriate display before
+popping up a menu. 
+
+A problem I haven't fixed yet is with the "selection" command, which
+right now will only retrieve the selection from the display of the
+main window.  Pasting into a text field on another display with ^V
+inserts the selection from the main display.  It could be changed to
+take a window argument similar to "focus". 
+
+I wish I could think of a better flag name than "-query"...  
+
+I had a go at hacking the Tk C code to keep track of one focus per
+display instead of per main window.  (Should I be using one main
+window per display?  I'm not now, I'm just creating remote toplevels
+with the -screen argument.)  I moved the "struct TkWindow *focusPtr;"
+from the TkMainInfo to the TkDisplay structure, and modified the code
+in tkEvent.c that handled it and tkWindow.c that initialized it.  
+
+In tkEvent.c, I changed 3 "winPtr->mainPtr->focusPtr"'s to
+"winPtr->dispPtr->focusPtr", in Tk_HandleEvent and TkEventDeadWindow.  
+I worked over Tk_FocusCmd and TkFocusEventProc, included below.  
+I'm not sure what the "winPtr == winPtr->dispPtr->mouseMainPtr" test
+at the end of Tk_FocusCmd really intends, but the transformation was
+pretty straightforward, and it seems to work for my cases.  
+
+I've looked at the tcl code to try to figure out how to make it track
+properly with multiple displays.  I think I'll need a function that
+given the name of a window, returns a unique string describing the
+display, that I can use to make tk_priv keys that distinguish between
+displays.  The tcl functions tk_mbUnpost, tk_nextMenu, and
+tk_nextMenuEntry all need to take an argument so they can figure out
+which display to work on. 
+
+Another unrelated fix I made to Tk and Tcl was to put the TK_LIBRARY
+and TCL_LIBRARY strings into global variables, and refer to those
+variables instead of embeding strings in the code, so it's possible to
+set them up properly before initializing, since I want to be able to
+set a couple environment variables and run the application with no
+installation.  Is there a more appropriate way to do this? 
+
+       -Don
+
+Here is the code for Tk_FocusCmd and TkFocusEventProc:
+
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_FocusCmd --
+ *
+ *     This procedure is invoked to process the "focus" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_FocusCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    register TkWindow *winPtr = (TkWindow *) clientData;
+    register TkWindow *newPtr;
+
+    if (argc > 3) {
+       focusSyntax:
+       Tcl_AppendResult(interp, "too many args: should be \"",
+               argv[0], " ?-query? ?window?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if (argc == 1) {
+       if (winPtr->dispPtr->focusPtr == NULL) {
+           interp->result = "none";
+       } else {
+           interp->result = winPtr->dispPtr->focusPtr->pathName;
+       }
+       return TCL_OK;
+    }
+
+    if (argv[1][0] == '-') {
+       int switchLength;
+
+       switchLength = strlen(argv[1]);
+       if ((switchLength >= 2)
+               && (strncmp(argv[1], "-query", switchLength) == 0)) {
+
+           if (argc != 3) {
+               goto focusSyntax;
+           }
+
+           newPtr = (TkWindow *) Tk_NameToWindow(interp, argv[2], tkwin);
+           if (newPtr == NULL) {
+               return TCL_ERROR;
+           }
+           if (newPtr->dispPtr->focusPtr == NULL) {
+               interp->result = "none";
+           } else {
+               interp->result = newPtr->dispPtr->focusPtr->pathName;
+           }
+           return TCL_OK;
+       }
+    }
+
+    if (argc != 2) {
+       goto focusSyntax;
+    }
+
+    if (strcmp(argv[1], "none") == 0) {
+       newPtr = NULL;
+    } else {
+       newPtr = (TkWindow *) Tk_NameToWindow(interp, argv[1], tkwin);
+       if (newPtr == NULL) {
+           return TCL_ERROR;
+       }
+    }
+    if (newPtr->dispPtr->focusPtr == newPtr) {
+       return TCL_OK;
+    }
+    if (winPtr == newPtr->dispPtr->mouseMainPtr) { /* XXX: ??? presumably */
+       if ((newPtr->dispPtr->focusPtr != NULL)
+               && (newPtr->dispPtr->focusPtr->focusProc != NULL)) {
+           (*newPtr->dispPtr->focusPtr->focusProc)(
+                   newPtr->dispPtr->focusPtr->focusData, 0);
+       }
+       newPtr->dispPtr->focusPtr = newPtr;
+       if ((newPtr != NULL) && (newPtr->focusProc != NULL)) {
+           (*newPtr->focusProc)(newPtr->focusData, 1);
+       }
+    } else {
+       newPtr->dispPtr->focusPtr = newPtr;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkFocusEventProc --
+ *
+ *     This procedure is invoked whenever the pointer enters
+ *     or leaves a top-level window.  It notifies the current
+ *     owner of the focus, if any.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkFocusEventProc(winPtr, eventPtr)
+    register TkWindow *winPtr; /* Top-level window just entered or left. */
+    XEvent *eventPtr;          /* EnterWindow or LeaveWindow event. */
+{
+    register TkWindow *focusPtr;
+    TkWindow *newMouseMainPtr = NULL;
+
+    if (eventPtr->type == EnterNotify) {
+       newMouseMainPtr = winPtr->mainPtr->winPtr;
+    }
+    if (winPtr->dispPtr->mouseMainPtr == newMouseMainPtr) {
+       return;
+    }
+    if (winPtr->dispPtr->mouseMainPtr != NULL) {
+       focusPtr = winPtr->dispPtr->focusPtr;
+       if ((focusPtr != NULL)
+               && (focusPtr->focusProc != NULL)) {
+           (*focusPtr->focusProc)(focusPtr->focusData, 0);
+       }
+    }
+    winPtr->dispPtr->mouseMainPtr = newMouseMainPtr;
+    if (newMouseMainPtr != NULL) {
+       focusPtr = newMouseMainPtr->dispPtr->focusPtr;
+       if ((focusPtr != NULL)
+               && (focusPtr->focusProc != NULL)) {
+           (*focusPtr->focusProc)(focusPtr->focusData, 1);
+       }
+    }
+}
diff --git a/src/sim/g_ani.c b/src/sim/g_ani.c
new file mode 100644 (file)
index 0000000..b5a9e49
--- /dev/null
@@ -0,0 +1,98 @@
+/* g_ani.c: Animate Tiles, for Unix Micropolis.
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+#include "animtab.h"
+
+
+/* comefrom: moveWorld doEditWindow scoreDoer doMapInFront graphDoer */
+animateTiles(void)
+{
+  unsigned short tilevalue, tileflags;
+  unsigned short *tMapPtr;
+  int i;
+
+  /* Animate whole world */
+  tMapPtr = (unsigned short *)&(Map[0][0]);
+
+  for (i = WORLD_X * WORLD_Y; i > 0; i--) {
+    tilevalue = (*tMapPtr);
+    if (tilevalue & ANIMBIT) {
+      tileflags = tilevalue & ALLBITS;
+      tilevalue &= LOMASK;
+#if 0
+      do {
+       tilevalue = aniTile[tilevalue];
+      } while (!(tileSynch & aniSynch[tilevalue]));
+#else
+      tilevalue = aniTile[tilevalue];
+#endif
+
+      tilevalue |= tileflags;
+      (*tMapPtr) = tilevalue;
+    }
+    tMapPtr++;
+  }
+
+#if 0
+  tileSynch = (tileSynch == 0x80) ? 0x01 : (tileSynch << 1);
+#endif
+}
diff --git a/src/sim/g_bigmap.c b/src/sim/g_bigmap.c
new file mode 100644 (file)
index 0000000..695cd88
--- /dev/null
@@ -0,0 +1,308 @@
+/* g_bigmap.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+int dynamicFilter(int c, int r);
+int WireDrawBeegMapRect(SimView *view, short x, short y, short w, short h);
+
+drawBeegMaps()
+{
+  sim_update_editors();
+}
+
+
+MemDrawBeegMapRect(SimView *view, int x, int y, int w, int h)
+{
+  int lineBytes = view->line_bytes;
+  int pixelBytes = view->pixel_bytes;
+  QUAD ii, mm;
+  unsigned short *map;
+  unsigned short tile;
+  unsigned char blink = (flagBlink <= 0), *bt = view->bigtiles;
+  short col, row;
+  short **have, *ha;
+
+  if (x < view->tile_x) {
+    if ((w -= (view->tile_x - x)) <= 0)
+      return;
+    x = view->tile_x;
+  }
+  if (y < view->tile_y) {
+    if ((h -= (view->tile_y - y)) <= 0)
+      return;
+    y = view->tile_y;
+  }
+  if ((x + w) > (view->tile_x + view->tile_width)) {
+    if ((w -= ((x + w) - (view->tile_x + view->tile_width))) <= 0)
+      return;
+  }
+  if ((y + h) > (view->tile_y + view->tile_height)) {
+    if ((h -= ((y + h) - (view->tile_y + view->tile_height))) <= 0)
+      return;
+  }
+
+  if (view->x->color) {
+    register unsigned QUAD *image, *mem;
+
+    image = (unsigned QUAD *)view->data;
+    ii = ((lineBytes * h * 16) - 16) / sizeof(unsigned QUAD);
+    map = (unsigned short *)&Map[x][y];
+    mm = WORLD_Y - h;
+    have = view->tiles;
+
+    /*
+     * Huge Berserk Rebel Warthog
+     */
+
+    for (col = 0; col < w; col++) {
+      ha = &have[col][0];
+      image = (unsigned QUAD *)(view->data + (col * 16 * pixelBytes));
+      for (row = 0; row < h; row++, ha++) {
+       tile = *(map++);
+       if ((tile & LOMASK) >= TILE_COUNT) tile -= TILE_COUNT;
+
+       /* Blink lightning bolt in unpowered zone center */
+       if (blink && (tile & ZONEBIT) && !(tile & PWRBIT)) {
+         tile = LIGHTNINGBOLT;
+       } else {
+         tile &= LOMASK;
+       } // if
+
+       if (
+           (tile > 63) &&
+           (view->dynamic_filter != 0) &&
+           (dynamicFilter(col + x, row + y) == 0)
+           ) {
+         tile = 0;
+       } // if
+
+       /* XXX */
+       if (tile == *ha) {
+         image = (unsigned QUAD *)(((unsigned char *)image) +
+                                   (lineBytes * 16));
+       } else {
+         *ha = tile;
+         mem = (unsigned QUAD *)&(bt[tile * 256 * pixelBytes]);
+
+         /* XXX: handle depth for big tiles */
+#if 1
+         /* Very un-rolled loop. */
+
+#define ROW1_8(n) \
+         image[0] = mem[0+n]; \
+         image[1] = mem[1+n]; \
+         image[2] = mem[2+n]; \
+         image[3] = mem[3+n]; \
+         image = (unsigned QUAD *)(((unsigned char *)image) + lineBytes);
+
+#define ROW2_8(n) ROW1_8(n) ROW1_8(n+4)
+#define ROW4_8(n) ROW2_8(n) ROW2_8(n+8)
+#define ROW8_8(n) ROW4_8(n) ROW4_8(n+16)
+#define ROW16_8() ROW8_8(0) ROW8_8(32)
+
+#define ROW1_16(n) \
+      memcpy((char *)image, (char *)mem + (2 * 16 * (n)), 2 * 16); \
+      image = (unsigned QUAD *)(((unsigned char *)image) + lineBytes);
+
+#define ROW2_16(n) ROW1_16(n) ROW1_16(n+1)
+#define ROW4_16(n) ROW2_16(n) ROW2_16(n+2)
+#define ROW8_16(n) ROW4_16(n) ROW4_16(n+4)
+#define ROW16_16() ROW8_16(0) ROW8_16(8)
+
+         switch (view->x->depth) {
+
+         case 8:
+           ROW16_8();
+           break;
+
+         case 15:
+         case 16:
+           ROW16_16();
+           break;
+
+         case 24:
+         case 32:
+         default:
+           /* XXX: handle different depths */
+           break;
+
+         } // switch
+
+#else
+         /* Not so un-rolled loop. */
+
+         { int i;
+           for (i = 16; i > 0; i--) {
+             image[0] = mem[0]; image[1] = mem[1];
+             image[2] = mem[2]; image[3] = mem[3];
+             image = (unsigned QUAD *)(((unsigned char *)image) + lineBytes);
+             mem += 4;
+           }
+         } // scope
+#endif
+
+       } // if
+
+      } // for row
+      image -= ii;
+      map += mm;
+    } // for col
+  } else {
+    register unsigned short *image, *mem;
+
+    image = (unsigned short *)view->data;
+    ii = ((lineBytes * h * 16) - 2) / sizeof(unsigned short);
+    map = (unsigned short *)&Map[x][y];
+    mm = WORLD_Y - h;
+    have = view->tiles;
+
+    for (col = 0; col < w; col++) {
+      ha = &have[col][0];
+      image = (unsigned short *)(view->data + (col * 2));
+      for (row = 0; row < h; row++, ha++) {
+       tile = *(map++);
+       if ((tile & LOMASK) >= TILE_COUNT) tile -= TILE_COUNT;
+
+       /* Blink lightning bolt in unpowered zone center */
+       if (blink && (tile & ZONEBIT) && !(tile & PWRBIT))
+         tile = LIGHTNINGBOLT;
+       else
+         tile &= LOMASK;
+
+       if (tile == *ha) {
+         image = (unsigned short *)
+           (((unsigned char *)image) + (lineBytes * 16));
+       } else {
+         *ha = tile;
+         mem = (unsigned short *)&(bt[tile * 32]);
+
+         { char i;
+           for (i = 16; i > 0; i--) {
+             *image = *mem;
+             image = (unsigned short *)(((unsigned char *)image) + lineBytes);
+             mem++;
+           }
+         }
+       }
+      }
+      image -= ii;
+      map += mm;
+    }
+  }
+}
+
+
+WireDrawBeegMapRect(SimView *view, short x, short y, short w, short h)
+{
+  unsigned short *map;
+  unsigned short tile;
+  unsigned char blink = (flagBlink <= 0);
+  short col, row;
+  QUAD mm;
+  short **have, *ha;
+
+  if (x < view->tile_x) {
+    if ((w -= (view->tile_x - x)) <= 0)
+      return;
+    x = view->tile_x;
+  }
+  if (y < view->tile_y) {
+    if ((h -= (view->tile_y - y)) <= 0)
+      return;
+    y = view->tile_y;
+  }
+  if ((x + w) > (view->tile_x + view->tile_width)) {
+    if ((w -= ((x + w) - (view->tile_x + view->tile_width))) <= 0)
+      return;
+  }
+  if ((y + h) > (view->tile_y + view->tile_height)) {
+    if ((h -= ((y + h) - (view->tile_y + view->tile_height))) <= 0)
+      return;
+  }
+
+  map = (unsigned short *)&Map[x][y];
+  mm = WORLD_Y - h;
+  have = view->tiles;
+
+  for (col = 0; col < w; col++) {
+    ha = &have[col][0];
+    for (row = 0; row < h; row++, ha++) {
+      tile = *(map++);
+      if ((tile & LOMASK) >= TILE_COUNT) tile -= TILE_COUNT;
+
+      /* Blink lightning bolt in unpowered zone center */
+      if (blink && (tile & ZONEBIT) && !(tile & PWRBIT))
+       tile = LIGHTNINGBOLT;
+      else
+       tile &= LOMASK;
+
+      if (tile != *ha) {
+       *ha = tile;
+       XCopyArea(view->x->dpy, view->x->big_tile_pixmap, view->pixmap,
+                 view->x->gc, 0, tile * 16, 16, 16,
+                 col * 16, row * 16);
+      }
+    }
+    map += mm;
+  }
+}
diff --git a/src/sim/g_cam.c b/src/sim/g_cam.c
new file mode 100644 (file)
index 0000000..c2f1b12
--- /dev/null
@@ -0,0 +1,1228 @@
+/* g_cam.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+#ifdef CAM
+
+
+Can *
+new_can(int w, int h, Byte *mem, int line_bytes)
+{
+  Can *can = (Can *)malloc(sizeof(Can));
+
+  can->width = w;
+  can->height = h;
+  can->line_bytes = line_bytes;
+  can->mem = mem;
+
+  return (can);
+}
+
+
+Cam *
+new_cam(SimCam *scam, int x, int y, int w, int h, int dx, int dy, vf func)
+{
+  Cam *cam = (Cam *)malloc(sizeof(Cam));
+  int ww, hh;
+
+  cam->x = x;
+  cam->y = y;
+  cam->ideal_width = w;
+  cam->ideal_height = h;
+  w = (w + 1) & ~1;
+  h = (h + 1) & ~1;
+  ww = w + 2;
+  hh = h + 2;
+  cam->width = w;
+  cam->height = h;
+  cam->back = new_can(ww, hh, (Byte *)malloc(ww * hh), ww);
+  cam->front = new_can(w, h,
+                      (Byte *)scam->data + x + (y * scam->line_bytes),
+                      scam->line_bytes);
+  cam->neighborhood = func;
+  cam->rule = NULL;
+  cam->rule_size = 0;
+  cam->phase = 0;
+  cam->wrap = 3;
+  cam->frob = -1;
+  cam->steps = 1;
+  cam->dx = dx;
+  cam->dy = dy;
+  cam->gx = 0;
+  cam->gy = 0;
+  cam->dragging = 0;
+  cam->set_x = -1;
+  cam->set_y = -1;
+  cam->set_width = -1;
+  cam->set_height = -1;
+  cam->set_x0 = -1;
+  cam->set_y0 = -1;
+  cam->set_x1 = -1;
+  cam->set_y1 = -1;
+  cam->name = NULL;
+  cam->next = scam->cam_list;
+  scam->cam_list = cam;
+  scam->cam_count++;
+
+  return (cam);
+}
+
+
+scam_randomize(SimCam *scam)
+{
+  u_char *data = scam->data;
+  int line_bytes = scam->line_bytes;
+  int pixels = line_bytes * scam->w_height;
+  int i;
+
+  for (i = 0; i < pixels; i++) {
+    *data = (char)(Rand16() >>4);
+    data++;
+  }
+}
+
+
+cam_randomize(Cam *cam)
+{
+  int x, y, w, h, lb;
+  Byte *image;
+
+  w = cam->width;
+  h = cam->height;
+  lb = cam->front->line_bytes;
+  image = cam->front->mem;
+
+  for (y = 0; y < h; y++, image += lb) {
+    for (x = 0; x < w; x++) {
+      image[x] = (char)(Rand16() >> 4);
+    }
+  }
+}
+
+
+cam_do_rule(SimCam *scam, Cam *cam)
+{
+  Byte *back, *front;
+  int frontline, backline;
+  int w, h;
+  int steps = cam->steps;
+  int step;
+
+  back = cam->back->mem;
+  backline = cam->back->line_bytes;
+
+  front = cam->front->mem;
+  frontline = cam->front->line_bytes;
+
+  w = cam->width;
+  h = cam->height;
+
+  for (step=0; step < steps; step++) {
+    int x, y;
+    Byte *p = back + backline + 1,
+          *f = front;
+/*
+* Copy wrapping edges from front=>back:
+*
+*      0       ff      f0 f1 ... fe ff         f0
+*
+*      1       0f      00 01 ... 0e 0f         00
+*      2       1f      10 11 ... 1e 1f         10
+*              ..      .. ..     .. ..         ..
+*              ef      e0 e1 ... ee ef         e0
+*      h       ff      f0 f1 ... fe ff         f0
+*
+*      h+1     0f      00 01 ... 0e 0f         00
+*
+* wrap value:  effect:
+*      0       no effect
+*      1       copy front=>back, no wrap
+*      2       no copy, wrap edges
+*      3       copy front=>back, wrap edges
+*      4       copy front=>back, same edges
+*      5       copy edges from screen
+*/
+
+    switch (cam->wrap) {
+
+    case 0:
+      break;
+
+    case 1:
+      for (y=0; y<h; y++) {
+       memcpy(p, f, w);
+       p += backline;
+       f += frontline;
+      }
+      break;
+
+    case 2:
+      for (y=0; y<h; y++) {
+       p[-1] = p[w-1];
+       p[w] = p[0];
+       p += backline;
+       f += frontline;
+      }
+      memcpy(back, back + backline*h, backline);
+      memcpy(back + backline*(h+1), back + backline, backline);
+      break;
+
+    case 3:
+      for (y=0; y<h; y++) {
+       memcpy(p, f, w);
+       p[-1] = p[w-1];
+       p[w] = p[0];
+       p += backline;
+       f += frontline;
+      }
+      memcpy(back, back + backline*h, backline);
+      memcpy(back + backline*(h+1), back + backline, backline);
+      break;
+
+    case 4:
+      for (y=0; y<h; y++) {
+       memcpy(p, f, w);
+       p[-1] = p[0];
+       p[w] =  p[w-1];
+       p += backline;
+       f += frontline;
+      }
+      memcpy(back + (backline * (h + 1)), back + backline*h, backline);
+      memcpy(back, back + backline, backline);
+      break;
+
+    case 5:
+      { int left = (cam->x == 0) ? 1 : 0;
+       int right = (cam->x + cam->front->width == scam->w_width) ? 1 : 0;
+       int top = (cam->y == 0) ? 1 : 0;
+       int bottom = (cam->y + cam->front->height == scam->w_height) ? 1 : 0;
+
+       if (!left && !right && !top && !bottom) {
+         p = back;
+         f = front - 1 - frontline;
+         for (y=-1; y<=h; y++) {
+           memcpy(p, f, w + 2);
+           p += backline;
+           f += frontline;
+         }
+       } else {
+         p = back + backline + 1;
+         f = front;
+
+         p[-1 - backline] = f[left - 1 - (top ? 0 : frontline)];
+         memcpy(p - backline, f, w);
+         p[w - backline] = f[w - right - (top ? 0 : frontline)];
+
+         for (y=0; y<h; y++) {
+           p[-1] = f[left - 1];
+           memcpy(p, f, w);
+           p[w] = f[w - right];
+           p += backline;
+           f += frontline;
+         }
+       }
+      }
+      break;
+
+    }
+
+    cam_slide(scam, cam);
+
+    (*cam->neighborhood)(cam);
+    cam->phase = !cam->phase;
+
+    cam_update(scam, cam);
+
+    cam_adjust(scam, cam);
+  } /* for step */
+}
+
+
+cam_slide(SimCam *scam, Cam *cam)
+{
+  int x = cam->x;
+  int y = cam->y;
+  int last_x = x;
+  int last_y = y;
+  int width = cam->width;
+  int height = cam->height;
+  int dx = cam->dx;
+  int dy = cam->dy;
+  int dragging = cam->dragging;
+  int bounce = 0;
+int dagnabit = 0;
+
+  if (dragging ||
+      (cam->set_x >= 0) ||
+      (cam->set_y >= 0)) {
+    if (cam->set_x >= 0) {
+      x = cam->set_x;
+      cam->set_x = -1;
+    }
+    if (cam->set_y >= 0) {
+      y = cam->set_y;
+      cam->set_y = -1;
+    }
+  } else {
+    x += dx;
+    y += dy;
+  }
+
+  if (x < 0) {
+    x = 0;
+    if (!dragging) {
+      dx = ABS(dx);
+      bounce = 1;
+    }
+  } else if ((x + width) > scam->w_width) {
+    x = scam->w_width - width;
+    if (!dragging) {
+      dx = -ABS(dx);
+      bounce = 1;
+    }
+  }
+  
+  if (y < 0) {
+    y = 0;
+    if (!dragging) {
+      dy = ABS(dy);
+      bounce = 1;
+    }
+else {
+dagnabit = 1;
+printf("dagnabit\n");
+}
+  } else if ((y + height) > scam->w_height) {
+    y = scam->w_height - height;
+    if (!dragging) {
+      dy = -ABS(dy);
+      bounce = 1;
+    }
+  }
+  
+  if (dragging) {
+    dx = x - last_x;
+    dy = y - last_y;
+  } else {
+    if (bounce) {
+      cam->frob = (Rand16() & 15) * ((cam->frob > 0) ? -1 : 1);
+    }
+  }
+
+  cam->x = x;
+  cam->y = y;
+  cam->front->mem = (Byte *)scam->data + x + (scam->line_bytes * y);
+  cam->dx = dx + cam->gx;
+  cam->dy = dy + cam->gy;
+if (dagnabit) {
+  printf("x %d y %d dx %d dy %d\n", cam->x, cam->y, cam->dx, cam->dy);
+}
+}
+
+
+cam_update(SimCam *scam, Cam *cam)
+{
+  if (scam->x->shared) {
+    XShmPutImage(scam->x->dpy, Tk_WindowId(scam->tkwin), scam->x->gc,
+                scam->image, cam->x, cam->y, 
+                cam->x, cam->y, cam->width, cam->height,
+                False);
+  } else {
+    XPutImage(scam->x->dpy, Tk_WindowId(scam->tkwin), scam->x->gc,
+             scam->image, cam->x, cam->y, 
+             cam->x, cam->y, cam->width, cam->height);
+  }
+}
+
+
+cam_adjust(SimCam *scam, Cam *cam)
+{
+  int x0 = cam->set_x0;
+  int y0 = cam->set_y0;
+  int x1 = cam->set_x1;
+  int y1 = cam->set_y1;
+  int width = cam->set_width;
+  int height = cam->set_height;
+  int min_size = 8;
+  int tmp;
+
+  if ((x0 >= 0) ||
+      (y0 >= 0) ||
+      (x1 >= 0) ||
+      (y1 >= 0) ||
+      (width > 0) ||
+      (height > 0)) {
+    if (x0 < 0) x0 = cam->x;
+    if (y0 < 0) y0 = cam->y;
+    if (x1 < 0) x1 = cam->x + cam->ideal_width;
+    if (y1 < 0) y1 = cam->y + cam->ideal_height;
+    if (width > 0) x1 = x0 + width;
+    if (height > 0) y1 = y0 + height;
+
+    cam->set_width = cam->set_height = 
+      cam->set_x0 = cam->set_y0 =
+      cam->set_x1 = cam->set_y1 = -1;
+
+    if (x0 > x1) {
+      tmp = x0; x0 = x1; x1 = tmp;
+    }
+
+    if (y0 > y1) {
+      tmp = y0; y0 = y1; y1 = tmp;
+    }
+
+    if (x0 < 0) x0 = 0;
+    if (y0 < 0) y0 = 0;
+    if (x0 > scam->w_width - min_size) x0 = scam->w_width - min_size;
+    if (y0 > scam->w_height - min_size) x0 = scam->w_height - min_size;
+    if (x1 < x0 + min_size) x1 = x0 + min_size;
+    if (y1 < y0 + min_size) y1 = y0 + min_size;
+    if (x1 > scam->w_width) x1 = scam->w_width;
+    if (y1 > scam->w_height) y1 = scam->w_height;
+
+    cam->x = x0;
+    cam->y = y0;
+    cam->ideal_width = x1 - x0;
+    cam->ideal_height = y1 - y0;
+    cam->width = cam->ideal_width & ~1;
+    cam->height = cam->ideal_height & ~1;
+    cam->front->mem = (Byte *)scam->data + x0 + (y0 * scam->line_bytes);
+    cam->front->width = cam->width;
+    cam->front->height = cam->height;
+    free(cam->back->mem);
+    cam->back->mem = (Byte *)malloc((cam->width + 2) * (cam->height + 2));
+    cam->back->width = cam->width + 2;
+    cam->back->height = cam->height + 2;
+    cam->back->line_bytes = cam->back->width;
+  }
+}
+
+
+void
+n_moore_a(Cam *cam)
+{
+    /* 0    1    2    3    4    5    6    7    8     9     */
+    /* c    c'   se   sw   ne   nw   e    w    s     n     */
+    /* 0x1  0x2  0x4  0x8  0x10 0x20 0x40 0x80 0x100 0x200 */
+
+#define MOORE_A (                                                      \
+       ((NORTHWEST&1)<<5) |    ((NORTH&1)<<9) |((NORTHEAST&1)<<4) |    \
+       ((WEST&1)<<7) |         (CENTER&3) |    ((EAST&1)<<6) |         \
+       ((SOUTHWEST&1)<<3) |    ((SOUTH&1)<<8) |((SOUTHEAST&1)<<2)      \
+    )
+
+    CAM_TABLE_LOOP(MOORE_A)
+}
+
+
+void
+n_moore_ab(Cam *cam)
+{
+    /* 0    1    2    3    4    5    6    7    8     9     10    11    */
+    /* c    c'   se   sw   ne   nw   e    w    s     n     &c    &c'   */
+    /* 0x1  0x2  0x4  0x8  0x10 0x20 0x40 0x80 0x100 0x200 0x400 0x800 */
+
+#define MOORE_AB (MOORE_A | ((CENTER&12)<<8))
+
+    CAM_TABLE_LOOP(MOORE_AB)
+}
+
+
+void
+n_vonn_neumann(Cam *cam)
+{
+    /* 0    1    2    3    4    5    6    7    8     9     */
+    /* c    c'   e'   w'   s'   n'   e    w    s     n     */
+    /* 0x1  0x2  0x4  0x8  0x10 0x20 0x40 0x80 0x100 0x200 */
+
+#define VON_NEUMANN (                                                  \
+       (CENTER&3) |                                                    \
+       ((EAST&1)<<6) | ((EAST&2)<<1) |                                 \
+       ((WEST&1)<<7) | ((WEST&2)<<2) |                                 \
+       ((SOUTH&1)<<8) | ((SOUTH&2)<<3) |                               \
+       ((NORTH&1)<<9) | ((NORTH&2)<<4)                                 \
+    )
+
+    CAM_TABLE_LOOP(VON_NEUMANN)
+}
+
+
+void
+n_margolis(Cam *cam)
+{
+    register Byte i;
+
+    /* 0    1    2    3    4    5    6    7    8    9      */
+    /* c    c'   cw   ccw  opp  cw'  ccw' opp'             */
+    /* 0x1  0x2  0x4  0x8  0x10 0x20 0x40 0x80 0x100 0x200 */
+
+#define MARGOLIS_ODD (                                                 \
+       (CENTER & 3) |                                                  \
+       (i=(x&1 ? (y&1 ? (EAST) : (NORTH))                              \
+               : (y&1 ? (SOUTH) : (WEST))),                            \
+        (((i&1)<<2) | ((i&2)<<4))) |                                   \
+       (i=(x&1 ? (y&1 ? (SOUTH) : (EAST))                              \
+               : (y&1 ? (WEST) : (NORTH))),                            \
+        (((i&1)<<3) | ((i&2)<<5))) |                                   \
+       (i=(x&1 ? (y&1 ? (SOUTHEAST):(NORTHEAST))                       \
+               : (y&1 ? (SOUTHWEST):(NORTHWEST))),                     \
+        (((i&1)<<4) | ((i&2)<<6)))                                     \
+    )
+
+#define MARGOLIS_EVEN (                                                        \
+       (CENTER & 3) |                                                  \
+       (i=(x&1 ? (y&1 ? (WEST) : (SOUTH))                              \
+               : (y&1 ? (NORTH) : (EAST))),                            \
+        (((i&1)<<2) | ((i&2)<<4))) |                                   \
+       (i=(x&1 ? (y&1 ? (NORTH) : (WEST))                              \
+               : (y&1 ? (EAST) : (SOUTH))),                            \
+        (((i&1)<<3) | ((i&2)<<5))) |                                   \
+       (i=(x&1 ? (y&1 ? (NORTHWEST) : (SOUTHWEST))                     \
+               : (y&1 ? (NORTHEAST) : (SOUTHEAST))),                   \
+        (((i&1)<<4) | ((i&2)<<6)))                                     \
+    )
+
+    if (cam->phase) {
+        CAM_TABLE_LOOP(MARGOLIS_ODD)
+    } else {
+        CAM_TABLE_LOOP(MARGOLIS_EVEN)
+    }
+}
+
+
+void
+n_margolis_ph(Cam *cam)
+{
+    register Byte i;
+
+    /* 0    1    2    3    4    5    6    7    8    9      */
+    /* c    c'   cw   ccw  opp  cw'  ccw' opp' pha   pha'  */
+    /* 0x1  0x2  0x4  0x8  0x10 0x20 0x40 0x80 0x100 0x200 */
+
+#define MARGOLIS_ODD_PH (MARGOLIS_ODD | 0x100)
+#define MARGOLIS_EVEN_PH (MARGOLIS_EVEN | 0x200)
+
+    if (cam->phase) {
+       CAM_TABLE_LOOP(MARGOLIS_ODD_PH)
+    } else {
+       CAM_TABLE_LOOP(MARGOLIS_EVEN_PH)
+    }
+}
+
+
+void
+n_margolis_hv(Cam *cam)
+{
+    register Byte i;
+
+    /* 0    1    2    3    4    5    6    7    8    9      */
+    /* c    c'   cw   ccw  opp  cw'  ccw' opp' horz  vert  */
+    /* 0x1  0x2  0x4  0x8  0x10 0x20 0x40 0x80 0x100 0x200 */
+
+#define MARGOLIS_ODD_HV (MARGOLIS_ODD | ((x&1)<<8) | ((y&1)<<9))
+#define MARGOLIS_EVEN_HV (MARGOLIS_EVEN | ((x&1)<<8) | ((y&1)<<9))
+
+    if (cam->phase) {
+       CAM_TABLE_LOOP(MARGOLIS_ODD_HV)
+    } else {
+       CAM_TABLE_LOOP(MARGOLIS_EVEN_HV)
+    }
+}
+
+
+void
+n_life(Cam *cam)
+{
+  int s;
+
+#define LIFE (                                                 \
+        ((CENTER&1) ? (((s = SUM8) == 2) || (s == 3))          \
+                    : (SUM8 == 3)) |                           \
+        (CENTER<<1)                                            \
+       )
+
+  CAM_LOOP(LIFE)
+}
+
+
+void
+n_brain(Cam *cam)
+{
+  int s;
+
+#define BRAIN (                                                        \
+        (((((s = CENTER)&3) == 0) && (SUM8 == 2)) ? 1 : 0) |   \
+        (s<<1)                                                 \
+       )
+
+  CAM_LOOP(BRAIN)
+}
+
+
+void
+n_heat(Cam *cam)
+{
+  int frob = cam->frob;
+
+#define HEAT (                                                         \
+       ((QUAD)(NORTHWEST + NORTH + NORTHEAST +                         \
+               WEST + EAST +                                           \
+               SOUTHWEST + SOUTH + SOUTHEAST + frob)) >> 3     \
+    )
+
+    CAM_LOOP(HEAT)
+}
+
+
+void
+n_dheat(Cam *cam)
+{
+  int frob = cam->frob;
+  int last = 0;
+
+#define DHEAT \
+       last += NORTHWEST + NORTH + NORTHEAST + \
+               WEST + frob + EAST + \
+               SOUTHWEST + SOUTH + SOUTHEAST; \
+       *front = last >> 3; \
+       last &= 7;
+    CAM_LOOP_BODY(DHEAT)
+
+}
+
+
+void
+n_lheat(Cam *cam)
+{
+  int frob = cam->frob;
+
+#define LHEAT (                                                                \
+       ((QUAD)(NORTH + WEST + EAST + SOUTH + frob)) >> 2               \
+    )
+
+    CAM_LOOP(LHEAT)
+}
+
+
+void
+n_ldheat(Cam *cam)
+{
+  int frob = cam->frob;
+  int last; /* I meant to do that! */
+
+#define LDHEAT (                                                       \
+       ((last = (QUAD)(NORTH + WEST + EAST + SOUTH + frob              \
+                       + (last&0x03))), last >> 2)                     \
+  )
+
+  CAM_LOOP(LDHEAT)
+}
+
+
+void
+n_abdheat(Cam *cam)
+{
+  int frob = cam->frob;
+  int lasta = 0, lastb = 0; /* I meant to do that! */
+
+#define YUM(x) (((QUAD)(x))&0x0f)
+#define YUK(x) (((QUAD)(x))&0xf0)
+
+#define ABDHEAT (                                                      \
+       (lasta = (QUAD)(YUM(NORTHWEST) + YUM(NORTH) + YUM(NORTHEAST) +  \
+                       YUM(WEST) + YUM(EAST) +                         \
+                       YUM(SOUTHWEST) + YUM(SOUTH) + YUM(SOUTHEAST) +  \
+                       frob + (lasta&0x07))),                  \
+       (lastb = (QUAD)(YUK(NORTHWEST) + YUK(NORTH) + YUK(NORTHEAST) +  \
+                       YUK(WEST) + YUK(EAST) +                         \
+                       YUK(SOUTHWEST) + YUK(SOUTH) + YUK(SOUTHEAST) +  \
+                       (frob<<4) + (lastb&0x70))),             \
+       (((lasta>>3)&0x0f) | ((lastb>>3)&0xf0))                         \
+    )
+
+    CAM_LOOP(ABDHEAT)
+}
+
+
+void
+n_abcdheat(Cam *cam)
+{
+  int last;
+  int frob = cam->frob;
+
+  CAM_LOOP(HEAT)
+}
+
+
+void
+n_edheat(Cam *cam)
+{
+  int frob = cam->frob;
+  int last = 0;
+
+#define EDHEAT (                                                       \
+       (last = (QUAD)(YUM(NORTHWEST) + YUM(NORTH) + YUM(NORTHEAST) +   \
+                      YUM(WEST) + YUM(EAST) +                          \
+                      YUM(SOUTHWEST) + YUM(SOUTH) + YUM(SOUTHEAST) +   \
+                      frob + (last&0x07))),                    \
+       (((last>>3)&0x0f) | ((CENTER<<4)&0xf0))                         \
+    )
+
+    CAM_LOOP(EDHEAT)
+}
+
+
+int ranch(QUAD l0, QUAD l1, QUAD l2)
+{
+  int s = SUM8;
+  int v = SUM9p(1);
+  int o = 0;
+
+  o = (CENTER&4)<<1;
+
+  if (v < 4 || v == 5) {
+    o |= 0x04;
+  } else {
+  }
+
+  return (o);
+} 
+
+
+void
+n_ranch(Cam *cam)
+{
+#define RANCH ranch(l0, l1, l2)
+
+  CAM_LOOP(RANCH)
+}
+
+
+void
+n_anneal(Cam *cam)
+{
+  int s;
+
+#define ANNEAL (                                                       \
+         ((s = SUM9) > 5) || (s == 4)                                  \
+       )
+  CAM_LOOP(ANNEAL)
+}
+
+
+void
+n_anneal4(Cam *cam)
+{
+  int s;
+
+#define ANNEAL4 (                                                      \
+         ((((s = SUM9p(0)) > 5) || (s == 4)) ? 1 : 0) |                \
+         ((((s = SUM9p(1)) > 5) || (s == 4)) ? 2 : 0) |                \
+         ((((s = SUM9p(2)) > 5) || (s == 4)) ? 4 : 0) |                \
+         ((((s = SUM9p(3)) > 5) || (s == 4)) ? 8 : 0) |                \
+         (CENTER << 4)                                                 \
+       )
+  CAM_LOOP(ANNEAL4)
+}
+
+
+void
+n_anneal8(Cam *cam)
+{
+  int s;
+
+#define ANNEAL8 (                                                      \
+         ((((s = SUM9p(0)) > 5) || (s == 4)) ? 1 : 0) |                \
+         ((((s = SUM9p(1)) > 5) || (s == 4)) ? 2 : 0) |                \
+         ((((s = SUM9p(2)) > 5) || (s == 4)) ? 4 : 0) |                \
+         ((((s = SUM9p(3)) > 5) || (s == 4)) ? 8 : 0) |                \
+         ((((s = SUM9p(4)) > 5) || (s == 4)) ? 16 : 0) |               \
+         ((((s = SUM9p(5)) > 5) || (s == 4)) ? 32 : 0) |               \
+         ((((s = SUM9p(6)) > 5) || (s == 4)) ? 64 : 0) |               \
+         ((((s = SUM9p(7)) > 5) || (s == 4)) ? 128 : 0)                \
+       )
+  CAM_LOOP(ANNEAL8)
+}
+
+
+void
+n_eco(Cam *cam)
+{
+  int s;
+
+#define ANTILIFE (                                                     \
+        ((CENTER&1) ? (SUM8 != 5)                                      \
+                    : (((s = SUM8) != 5) && (s != 6))) |               \
+        (CENTER<<1)                                                    \
+       )
+
+#define ECO (                                                          \
+         (((s = SUM9p(7)) > 5) || (s == 4) ? 128 : 0) |                \
+         ((CENTER&128) ? ((ANTILIFE)&127) : ((BRAIN)&127))             \
+       )
+  CAM_LOOP(ECO)
+}
+
+
+void
+n_torben(Cam *cam)
+{
+  int s;
+
+/* 0 0 0 1 0 1 0 1 1 1 */
+
+#define TORBEN (                                                       \
+ (CENTER << 1) | ((((s = SUM9) > 6) || (s == 5) || (s == 3)) ? 1 : 0)  \
+       )
+  CAM_LOOP(TORBEN)
+}
+
+
+void
+n_torben2(Cam *cam)
+{
+  int s;
+
+
+/* 0 0 0 1 0 1 0 1 1 1 */
+/* 0 0 1 0 1 0 1 0 1 1 */
+#define TORBEN2 (                                                      \
+         TORBEN | (CENTER <<1)                                         \
+       )
+  CAM_LOOP(TORBEN2)
+}
+
+
+void
+n_torben3(Cam *cam)
+{
+  int s;
+
+/* 0 0 0 1 1 0 0 1 1 1 */
+
+#define TORBEN3 (                                                      \
+         ((s = SUM9) > 6) || (s == 3) || (s == 4)                      \
+       )
+  CAM_LOOP(TORBEN3)
+}
+
+
+void
+n_torben4(Cam *cam)
+{
+  int s;
+
+
+/* 0 0 0 1 0 1 0 1 1 1 */
+/* 0 0 1 0 1 0 1 0 1 1 */
+#define TORBEN4 (                                                      \
+         TORBEN3 | (CENTER <<1)                                        \
+       )
+  CAM_LOOP(TORBEN4)
+}
+
+
+void
+n_ball(Cam *cam)
+{
+  char p = (cam->phase ? 1 : 0);
+  int x, y, r = Rand16();
+  int backline = cam->back->line_bytes,
+      frontline = cam->front->line_bytes;
+  Byte *back = cam->back->mem,
+        *front = cam->front->mem;
+
+  if (!p) {
+    back += 1 + backline;
+  }
+
+  for (y = p + (cam->height >>1); y > 0; y--) {
+    for (x = p + (cam->width >>1); x > 0; x--) {
+      Byte nw = back[0], ne = back[1],
+             sw = back[backline], se = back[backline+1];
+      
+      r += nw + ne + sw + sw; r >>= 1;
+
+      switch ((nw&1) + (ne&1) + (sw&1) + (se&1)) {
+      case 0:
+      case 3:
+      case 4:
+       /* same */
+       back[0] = nw; back[1] = ne;
+       back[backline] = sw; back[backline+1] = se;
+       break;
+      case 1:
+       /* reflect */
+       back[0] = se; back[1] = sw;
+       back[backline] = ne; back[backline+1] = nw;
+       break;
+      case 2:
+       /* turn */
+       switch (((nw&1) <<3) | ((ne&1) <<2) | ((sw&1) <<1) | (se&1)) {
+       case 6:
+       case 9:
+         if (r&1) {
+           /* clockwise */
+           back[0] = sw; back[1] = nw;
+           back[backline] = se; back[backline+1] = ne;
+         } else {
+           /* counterclockwise */
+           back[0] = ne; back[1] = se;
+           back[backline] = nw; back[backline+1] = sw;
+         }
+       default:
+         back[0] = nw; back[1] = ne;
+         back[backline] = sw; back[backline+1] = se;
+         break;
+       }
+       break;
+      }
+
+      back += 2;
+    }
+    back += backline + backline - cam->width - (2*p);
+  }
+  back = cam->back->mem + backline + 1,
+  front = cam->front->mem;
+
+  for (y = cam->height; y > 0; y--) {
+    memcpy(front, back, cam->width);
+    back += backline;
+    front += frontline;
+  }
+}
+
+
+void
+n_logic(Cam *cam)
+{
+  char p = (cam->phase ? 1 : 0);
+  int x, y;
+  int backline = cam->back->line_bytes,
+      frontline = cam->front->line_bytes;
+  Byte tmp;
+  Byte *back = cam->back->mem,
+        *front = cam->front->mem;
+
+  /* bit 8 is center' */
+  /* bit 7 is center */
+
+  if (cam->phase) {
+    back += 1 + backline;
+    front += 1 + frontline;
+  }
+
+  for (y = cam->height >>1; y > 0; y--) {
+    for (x = cam->width >>1; x > 0; x--) {
+      Byte nw = back[0], ne = back[1],
+             sw = back[backline], se = back[backline+1];
+      
+      switch (((nw&128) >>4) | ((ne&128) >>5) |
+             ((sw&128) >>6) | ((se&128) >>7)) {
+      case 0:
+       break;
+
+      case 1:
+       break;
+
+      case 2:
+       break;
+
+      case 3:
+       break;
+
+      case 4:
+       break;
+
+      case 5:
+       break;
+
+      case 6:
+       break;
+
+      case 7:
+       break;
+
+      case 8:
+       break;
+
+      case 9:
+       break;
+
+      case 10:
+       break;
+
+      case 11:
+       break;
+
+      case 12:
+       break;
+
+      case 13:
+       break;
+
+      case 14:
+       break;
+
+      case 15:
+       tmp = nw; nw = se; se = tmp;
+       tmp = sw; ne = sw; sw = tmp;
+       break;
+
+      }
+
+      back += 2; front += 2;
+    }
+    back += backline + backline - cam->width;
+    front += frontline + frontline - cam->width;
+  }
+
+  back = cam->back->mem + backline + 1,
+  front = cam->front->mem;
+
+  for (y = cam->height; y > 0; y--) {
+    memcpy(front, back, cam->width);
+    back += backline;
+    front += frontline;
+  }
+}
+
+
+void
+n_party(Cam *cam)
+{
+#define PARTY (CENTER ^ NORTH ^ SOUTH ^ EAST ^ WEST)
+  CAM_LOOP(PARTY)
+}
+
+
+vf neighborhoods[] = {
+/* 0 1 2 3 */
+  &n_moore_a, &n_moore_a, &n_moore_ab, &n_vonn_neumann,
+/* 4 5 6 */
+  &n_margolis, &n_margolis_ph, &n_margolis_hv, 
+/* 7 8                 9 10 11 12 */
+  &n_life, &n_brain, &n_heat, &n_dheat, &n_lheat, &n_ldheat,
+/* 13 14 15 16 17 */
+  &n_ranch, &n_anneal, &n_anneal4, &n_anneal8, &n_eco,
+/* 18 19 20 21 22 */
+  &n_abdheat, &n_edheat, &n_abcdheat, &n_torben, &n_torben2,
+/* 23 24 25 26 27 */
+  &n_torben3, &n_torben4, &n_ball, &n_logic, &n_party
+};
+
+
+cam_set_neighborhood(Cam *cam, int code)
+{
+  cam->neighborhood = neighborhoods[code];
+}
+
+
+cam_load_rule(Cam *cam, char *filename)
+{
+  FILE *fp;
+  QUAD magic, neighborhood, rule_size;
+  Byte *rule;
+
+  if ((fp = fopen(filename, "r")) == NULL) {
+    fprintf(stderr, "cam: Can't open rule file \"%s\"\n", filename);
+    return;
+  }
+
+/* XXX: Make this byte order independent!!! */
+
+#if defined(MSDOS) || defined(OSF1) || defined(IS_INTEL)
+
+#define SWAPQUAD(x) ((x = ((x <<24) & 0xff000000) | \
+                         ((x <<8)  & 0x00ff0000) | \
+                         ((x >>8)  & 0x0000ff00) | \
+                         ((x >>24) & 0x000000ff)), 0)
+
+#else
+
+#define SWAPQUAD(x) 0
+
+#endif
+
+  if ((fread(&magic, 1, sizeof(QUAD), fp) != sizeof(QUAD)) ||
+      SWAPQUAD(magic) ||
+      (magic != 0xcac0cac0) ||
+      (fread(&neighborhood, 1, sizeof(QUAD), fp) != sizeof(QUAD)) ||
+      SWAPQUAD(neighborhood) ||
+      (fread(&rule_size, 1, sizeof(QUAD), fp) != sizeof(QUAD)) ||
+      SWAPQUAD(rule_size) ||
+      ((rule = (Byte *)malloc(rule_size)) == NULL) ||
+      (fread(rule, 1, rule_size, fp) != rule_size)) {
+    fprintf(stderr, "cam: Bad rule file \"%s\"\n", filename);
+    fclose(fp);
+    return;
+  }
+
+  fclose(fp);
+  if (cam->rule != NULL)
+    free(cam->rule);
+  cam->rule = rule;
+  cam->rule_size = rule_size;
+  cam_set_neighborhood(cam, neighborhood);
+}
+
+
+Cam *
+find_cam(SimCam *scam, int x, int y)
+{
+  Cam *cam;
+
+  for (cam = scam->cam_list; cam != NULL; cam = cam->next) {
+    if ((x >= cam->x) &&
+       (y >= cam->y) &&
+       (x < cam->x + cam->width) &&
+       (y < cam->y + cam->height)) {
+      break;
+    }
+  }
+
+  return cam;
+}
+
+
+Cam *
+find_cam_by_name(SimCam *scam, char *name)
+{
+  Cam *cam;
+
+  for (cam = scam->cam_list; cam != NULL; cam = cam->next) {
+    if ((cam->name != NULL) &&
+       (strcmp(name, cam->name) == 0)) {
+      return cam;
+    }
+  }
+
+  return NULL;
+}
+
+
+Cam *
+get_cam_number(SimCam *scam, int i)
+{
+  Cam *cam;
+
+  for (cam = scam->cam_list;
+       (i != 0) && (cam != NULL);
+       (i--), (cam = cam->next)) ;
+
+  return cam;
+}
+
+
+cam_layout(SimCam *scam)
+{
+  int x, y, gap, border, maxwidth, lastmax;
+  Cam *cam;
+
+  border = 8;
+  gap = 8;
+  x = border; y = border;
+  maxwidth = lastmax = gap;
+
+  for (cam = scam->cam_list; cam != NULL; cam = cam->next) {
+    cam->dx = 0; cam->dy = 0;    
+    if (cam->width > maxwidth) {
+      lastmax = maxwidth;
+      maxwidth = cam->width;
+    }
+    if (y + cam->height + border > scam->w_height) {
+      y = border; x = x + maxwidth + gap;
+      maxwidth = lastmax = gap;
+    }
+    if ((x + cam->width > scam->w_width) ||
+       (y + cam->height > scam->w_height)) {
+      cam->x = 0; cam->y = 0;
+      cam->front->mem = (Byte *)scam->data;
+      maxwidth = lastmax;
+    } else {
+      cam->x = x; cam->y = y;
+      cam->front->mem =
+       scam->data + x + (scam->line_bytes * y);
+      y = y + cam->height + gap;
+    }
+  }
+}
+
+
+init_scam(SimCam *scam)
+{
+  scam_randomize(scam);
+}
+
+
+handle_scam(SimCam *scam)
+{
+  Cam *cam;
+
+  for (cam = scam->cam_list; cam != NULL; cam = cam->next) {
+    cam_do_rule(scam, cam);
+  }
+}
+
+
+#endif /* CAM */
diff --git a/src/sim/g_map.c b/src/sim/g_map.c
new file mode 100644 (file)
index 0000000..4b0fe5f
--- /dev/null
@@ -0,0 +1,518 @@
+/* g_map.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+#define VAL_NONE       0
+#define VAL_LOW                1
+#define VAL_MEDIUM     2
+#define VAL_HIGH       3
+#define VAL_VERYHIGH   4
+#define VAL_PLUS       5
+#define VAL_VERYPLUS   6
+#define VAL_MINUS      7
+#define VAL_VERYMINUS  8
+
+short valMap[] = { 
+  -1, COLOR_LIGHTGRAY, COLOR_YELLOW, COLOR_ORANGE, COLOR_RED,
+  COLOR_DARKGREEN, COLOR_LIGHTGREEN, COLOR_ORANGE, COLOR_YELLOW
+};
+
+short valGrayMap[] = { 
+  -1, 31, 127, 191, 255,
+  223, 255, 31, 0
+};
+
+
+int (*mapProcs[NMAPS])();
+
+int drawAll(SimView *view);
+int drawRes(SimView *view);
+int drawCom(SimView *view);
+int drawInd(SimView *view);
+int drawPower(SimView *view);
+int drawLilTransMap(SimView *view);
+int drawPopDensity(SimView *view);
+int drawRateOfGrowth(SimView *view);
+int drawTrafMap(SimView *view);
+int drawPolMap(SimView *view);
+int drawCrimeMap(SimView *view);
+int drawLandMap(SimView *view);
+int drawFireRadius(SimView *view);
+int drawPoliceRadius(SimView *view);
+int drawDynamic(SimView *view);
+
+
+short GetCI(short x)
+{
+  if (x < 50)  return(VAL_NONE);
+  if (x < 100) return(VAL_LOW);
+  if (x < 150) return(VAL_MEDIUM);
+  if (x < 200) return(VAL_HIGH);
+  return(VAL_VERYHIGH);
+}
+
+
+drawPopDensity(SimView *view)
+{
+  short x, y;
+
+  drawAll(view);
+  for (x = 0; x < HWLDX; x++) {
+    for (y = 0; y < HWLDY; y++) {
+      maybeDrawRect(view, GetCI(PopDensity[x][y]),
+                   x * 6, y * 6, 6, 6);
+    }
+  }
+}
+
+
+drawRateOfGrowth(SimView *view)
+{
+  short x, y;
+
+  drawAll(view);
+  for (x = 0; x < SmX; x++) {
+    for (y = 0; y < SmY; y++) {
+      short val, z = RateOGMem[x][y];
+
+      if (z > 100) val = VAL_VERYPLUS;
+      else {
+       if (z > 20)  val = VAL_PLUS;
+       else {
+         if (z < -100) val = VAL_VERYMINUS;
+         else {
+           if (z < -20) val = VAL_MINUS;
+           else val = VAL_NONE;
+         }
+       }
+      }
+      maybeDrawRect(view, val,
+                   x * 24, y * 24, 24, 24);
+    }
+  }
+}
+
+
+drawTrafMap(SimView *view)
+{
+  short x;
+  short y;
+
+  drawLilTransMap(view);
+
+  for (x = 0; x < HWLDX; x++) {
+    for (y = 0; y < HWLDY; y++) {
+      maybeDrawRect(view, GetCI(TrfDensity[x][y]),
+                   x * 6, y * 6, 6, 6);
+    }
+  }
+}
+
+
+drawPolMap(SimView *view)
+{
+  short x, y;
+
+  drawAll(view);
+
+  for (x = 0; x < HWLDX; x++) {
+    for (y = 0; y < HWLDY; y++) {
+      maybeDrawRect(view, GetCI(10 + PollutionMem[x][y]),
+                   x * 6, y * 6, 6, 6);
+    }
+  } 
+}
+
+
+drawCrimeMap(SimView *view)
+{
+  short x, y;
+
+  drawAll(view);
+
+  for (x = 0; x < HWLDX; x++) {
+    for (y = 0; y < HWLDY; y++) {
+      maybeDrawRect(view, GetCI(CrimeMem[x][y]),
+                   x * 6, y * 6, 6, 6);
+    }
+  }
+}
+
+
+drawLandMap(SimView *view)
+{
+  short x, y;
+
+  drawAll(view);
+
+  for (x = 0; x < HWLDX; x++) {
+    for (y = 0; y < HWLDY; y++) {
+      maybeDrawRect(view, GetCI(LandValueMem[x][y]),
+                   x * 6, y * 6, 6, 6);
+    }
+  }
+}
+
+
+drawFireRadius(SimView *view)
+{
+  short x, y;
+
+  drawAll(view);
+  for (x = 0; x < SmY; x++) {
+    for (y = 0; y < SmY; y++) {
+      maybeDrawRect(view, GetCI(FireRate[x][y]),
+                   x * 24, y * 24, 24, 24);
+    }
+  }
+}
+
+
+drawPoliceRadius(SimView *view)
+{
+  short x, y;
+
+  drawAll(view);
+  for (x = 0; x < SmX; x++) {
+    for (y = 0; y < SmY; y++) {
+      maybeDrawRect(view, GetCI(PoliceMapEffect[x][y]),
+                   x * 24, y * 24, 24, 24);
+    }
+  }
+}
+
+
+setUpMapProcs(void)
+{
+  mapProcs[ALMAP] = drawAll;
+  mapProcs[REMAP] = drawRes;
+  mapProcs[COMAP] = drawCom;
+  mapProcs[INMAP] = drawInd;
+  mapProcs[PRMAP] = drawPower;
+  mapProcs[RDMAP] = drawLilTransMap;
+  mapProcs[PDMAP] = drawPopDensity;
+  mapProcs[RGMAP] = drawRateOfGrowth;
+  mapProcs[TDMAP] = drawTrafMap;
+  mapProcs[PLMAP] = drawPolMap;
+  mapProcs[CRMAP] = drawCrimeMap;
+  mapProcs[LVMAP] = drawLandMap;
+  mapProcs[FIMAP] = drawFireRadius;
+  mapProcs[POMAP] = drawPoliceRadius;
+  mapProcs[DYMAP] = drawDynamic;
+}
+
+
+MemDrawMap(SimView *view)
+{
+  (*mapProcs[view->map_state])(view);
+  if (!view->x->color) {
+    ditherMap(view);
+    XSetForeground(view->x->dpy, view->x->gc, view->pixels[COLOR_BLACK]);
+    XSetBackground(view->x->dpy, view->x->gc, view->pixels[COLOR_WHITE]);
+    XPutImage(view->x->dpy, view->pixmap, view->x->gc, view->image, 
+             0, 0, 0, 0, view->m_width, view->m_height);
+  }
+}
+
+
+ditherMap(SimView *view)
+{
+  int i, x, y, width, height;
+  int err, pixel1, pixel8;
+  int line_bytes1 = view->line_bytes;
+  int line_bytes8 = view->line_bytes8;
+  unsigned char *image1 = view->data;
+  unsigned char *image8 = view->data8;
+  int *errors;
+
+  width = view->m_width; height = view->m_height;
+
+  errors = (int *)malloc(sizeof(int) * (width));
+
+  for (i = 0; i < width; i++)
+    errors[i] = (Rand16() & 15) - 7;
+
+  err = (Rand16() & 15) - 7;
+
+  for (y = 0; y < height; y += 2) {
+    unsigned char *i1 = image1; 
+    unsigned char *i8 = image8;
+
+    image1 += line_bytes1;
+    image8 += line_bytes8;
+
+    for (x = 0; x < width; x += 8) {
+      pixel1 = 0;
+      for (i = 0; i < 8; i++) {
+       pixel1 <<= 1;
+       pixel8 = *(i8++) + err + errors[x + i];
+       if (pixel8 > 127) {
+         err = pixel8 - 255;
+       } else {
+         pixel1 |= 1;
+         err = pixel8;
+       }
+       errors[x + i] = err/2;
+       err = err/2;
+      }
+      *(i1++) = pixel1;
+    }
+
+    i1 = image1 + (width / 8) - 1;
+    i8 = image8 + width - 1;
+
+    image1 += line_bytes1;
+    image8 += line_bytes8;
+
+    for (x = width - 8; x >= 0; x -= 8) {
+      pixel1 = 0;
+      for (i = 7; i >= 0; i--) {
+       pixel1 >>= 1;
+       pixel8 = *(i8--) + err + errors[x + i];
+       if (pixel8 > 127) {
+         err = pixel8 - 255;
+       } else {
+         pixel1 |= 128;
+         err = pixel8;
+       }
+       errors[x + i] = err/2;
+       err = err/2;
+      }
+      *(i1--) = pixel1;
+    }
+  }
+
+  free(errors);
+}
+
+
+maybeDrawRect(SimView *view, int val,
+           int x, int y, int w, int h)
+{
+  if (val == VAL_NONE) return;
+
+  if (view->x->color) {
+    drawRect(view, view->pixels[valMap[val]], 0, x, y, w, h);
+  } else {
+    drawRect(view, valGrayMap[val], 1, x, y, w, h);
+  }
+}
+
+
+drawRect(SimView *view, int pixel, int solid,
+        int x, int y, int w, int h)
+{
+  int W = view->m_width, H = view->m_height;
+
+  if (x < 0) {
+    if ((w += x) < 0) w = 0;
+    x = 0;
+  } else if (x > W) {
+    x = 0; w = 0;
+  }
+  if (x + w > W) {
+    w = W - x;
+  }
+  if (y < 0) {
+    if ((h += y) < 0) h = 0;
+    y = 0;
+  } else if (y > H) {
+    y = 0; h = 0;
+  }
+  if (y + h > H) {
+    h = H - y;
+  }
+
+  if (w && h) {
+    int i, j, stipple = (x ^ y) & 1;
+    unsigned char *data =
+      view->x->color ? view->data : view->data8;
+
+    /* In the case of black and white, we use an 8 bit buffer and dither it. */
+    int pixelBytes = 
+      view->x->color ? view->pixel_bytes : 1;
+    QUAD line = 
+      view->x->color ? view->line_bytes : view->line_bytes8;
+
+    unsigned char *image =
+      &(data[(line * y) + (x * pixelBytes)]);
+
+    switch (pixelBytes) {
+
+    case 1:
+      {
+       unsigned char *data = 
+         view->data8;
+       unsigned char *image = 
+         &data[(line * y) + (x * pixelBytes)];
+
+       if (solid) {
+         for (i = h; i > 0; i--) {
+           for (j = w; j > 0; j--) {
+             *image = pixel;
+             image++;
+           }
+           image += line - w;
+         }
+       } else {
+         for (i = h; i > 0; i--) {
+           for (j = w; j > 0; j--) {
+             if (stipple++ & 1)
+               *image = pixel;
+             image++;
+           }
+           if (!(w & 1))
+             stipple++;
+           image += line - w;
+         }
+       }
+      }
+      break;
+
+    case 2:
+      {
+       unsigned short *data = 
+         (unsigned short *)view->data;
+       unsigned short *image;
+       line >>= 1; /* Convert from byte offset to short offset */
+       image = 
+         &data[(line * y) + x];
+
+       if (solid) {
+         for (i = h; i > 0; i--) {
+           for (j = w; j > 0; j--) {
+             *image = pixel;
+             image++;
+           }
+           image += line - w;
+         }
+       } else {
+         for (i = h; i > 0; i--) {
+           for (j = w; j > 0; j--) {
+             if (stipple++ & 1)
+               *image = pixel;
+             image++;
+           }
+           if (!(w & 1))
+             stipple++;
+           image += line - w;
+         }
+       }
+      }
+      break;
+
+    case 3:
+    case 4:
+      {
+       unsigned char *data = 
+         (unsigned char *)view->data;
+       unsigned char *image;
+       int bitmapPad = view->x->small_tile_image->bitmap_pad;
+       int rowBytes = view->x->small_tile_image->bytes_per_line;
+       line = rowBytes >> 1; /* Convert from byte offset to short offset */
+       image = 
+         &data[(line * y) + x];
+
+       if (solid) {
+         for (i = h; i > 0; i--) {
+           for (j = w; j > 0; j--) {
+             *(image++) = (pixel >> 0) & 0xff;
+             *(image++) = (pixel >> 8) & 0xff;
+             *(image++) = (pixel >> 16) & 0xff;
+             if (bitmapPad == 32) {
+               image++;
+             }
+           }
+           image += line - w;
+         }
+       } else {
+         for (i = h; i > 0; i--) {
+           for (j = w; j > 0; j--) {
+             if (stipple++ & 1) {
+               *(image++) = (pixel >> 0) & 0xff;
+               *(image++) = (pixel >> 8) & 0xff;
+               *(image++) = (pixel >> 16) & 0xff;
+               if (bitmapPad == 32) {
+                 image++;
+               }
+             }
+           }
+           if (!(w & 1)) {
+             stipple++;
+           }
+           image += line - w;
+         }
+       }
+      }
+      break;
+
+    default:
+      assert(0); /* Undefined depth */
+      break;
+    }
+
+  }
+}
+
+
+
diff --git a/src/sim/g_setup.c b/src/sim/g_setup.c
new file mode 100644 (file)
index 0000000..61204fe
--- /dev/null
@@ -0,0 +1,443 @@
+/* g_setup.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+#define SIM_SMTILE     385
+#define SIM_BWTILE     386
+#define SIM_GSMTILE    388
+#define SIM_LGTILE     544
+
+
+#define gray25_width 16
+#define gray25_height 16
+static unsigned char gray25_bits[] = {
+  0x77, 0x77,
+  0xdd, 0xdd,
+  0x77, 0x77,
+  0xdd, 0xdd,
+  0x77, 0x77,
+  0xdd, 0xdd,
+  0x77, 0x77,
+  0xdd, 0xdd,
+  0x77, 0x77,
+  0xdd, 0xdd,
+  0x77, 0x77,
+  0xdd, 0xdd,
+  0x77, 0x77,
+  0xdd, 0xdd,
+  0x77, 0x77,
+  0xdd, 0xdd,
+};
+
+
+#define gray50_width 16
+#define gray50_height 16
+static unsigned char gray50_bits[] = {
+  0x55, 0x55,
+  0xaa, 0xaa,
+  0x55, 0x55,
+  0xaa, 0xaa,
+  0x55, 0x55,
+  0xaa, 0xaa,
+  0x55, 0x55,
+  0xaa, 0xaa,
+  0x55, 0x55,
+  0xaa, 0xaa,
+  0x55, 0x55,
+  0xaa, 0xaa,
+  0x55, 0x55,
+  0xaa, 0xaa,
+  0x55, 0x55,
+  0xaa, 0xaa,
+};
+
+
+#define gray75_width 16
+#define gray75_height 16
+static unsigned char gray75_bits[] = {
+  0x88, 0x88,
+  0x22, 0x22,
+  0x88, 0x88,
+  0x22, 0x22,
+  0x88, 0x88,
+  0x22, 0x22,
+  0x88, 0x88,
+  0x22, 0x22,
+  0x88, 0x88,
+  0x22, 0x22,
+  0x88, 0x88,
+  0x22, 0x22,
+  0x88, 0x88,
+  0x22, 0x22,
+  0x88, 0x88,
+  0x22, 0x22,
+};
+
+#define vert_width 16
+#define vert_height 16
+static unsigned char vert_bits[] = {
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+  0xaa, 0xaa,
+};
+
+
+#define horiz_width 16
+#define horiz_height 16
+static unsigned char horiz_bits[] = {
+  0xff, 0xff,
+  0x00, 0x00,
+  0xff, 0xff,
+  0x00, 0x00,
+  0xff, 0xff,
+  0x00, 0x00,
+  0xff, 0xff,
+  0x00, 0x00,
+  0xff, 0xff,
+  0x00, 0x00,
+  0xff, 0xff,
+  0x00, 0x00,
+  0xff, 0xff,
+  0x00, 0x00,
+  0xff, 0xff,
+  0x00, 0x00,
+};
+
+
+#define diag_width 16
+#define diag_height 16
+static unsigned char diag_bits[] = {
+  0x55, 0x55, 
+  0xee, 0xee, 
+  0x55, 0x55, 
+  0xba, 0xbb,
+  0x55, 0x55, 
+  0xee, 0xee, 
+  0x55, 0x55, 
+  0xba, 0xbb,
+  0x55, 0x55, 
+  0xee, 0xee,
+  0x55, 0x55, 
+  0xba, 0xbb,
+  0x55, 0x55, 
+  0xee, 0xee, 
+  0x55, 0x55, 
+  0xba, 0xbb,
+};
+
+
+Ptr MickGetHexa(short theID)
+{
+  Handle theData;
+
+  theData = GetResource("hexa", theID);
+  return ((Ptr)*theData);
+}
+
+
+Pixmap *
+GetObjectXpms(XDisplay *xd, int id, int frames)
+{
+  int i;
+  Pixmap *pixmaps = (Pixmap *)ckalloc(2 * frames * sizeof (Pixmap));
+  XpmAttributes attributes;
+  char name[256];
+
+  attributes.visual = Tk_DefaultVisual(xd->screen);
+  attributes.colormap = Tk_DefaultColormap(xd->screen);
+  attributes.depth = Tk_DefaultDepth(xd->screen);
+  attributes.valuemask = XpmVisual | XpmColormap | XpmDepth;
+
+  for (i = 0; i < frames; i++) {
+    sprintf(name, "%s/images/obj%d-%d.xpm", HomeDir, id, i);
+    if (XpmReadFileToPixmap(xd->dpy, 
+                           RootWindowOfScreen(xd->screen),
+                           name,
+                           &pixmaps[i + i], &pixmaps[i + i + 1],
+                           &attributes) < 0) {
+      fprintf(stderr,
+             "Uh oh, Micropolis couldn't read the pixmap file \"%s\".\n",
+             name);
+      sim_exit(1); // Just sets tkMustExit and ExitReturn
+      return NULL;
+    }
+  }
+  return (pixmaps);
+}
+
+
+GetPixmaps(XDisplay *xd)
+{
+  if (xd->gray25_stipple == None) {
+    xd->gray25_stipple =
+      XCreatePixmapFromBitmapData(xd->dpy, xd->root,
+                                 gray25_bits, gray25_width, gray25_height,
+                                 1, 0, 1);
+    xd->gray50_stipple =
+      XCreatePixmapFromBitmapData(xd->dpy, xd->root,
+                                 gray50_bits, gray50_width, gray50_height,
+                                 1, 0, 1);
+    xd->gray75_stipple =
+      XCreatePixmapFromBitmapData(xd->dpy, xd->root,
+                                 gray75_bits, gray75_width, gray75_height,
+                                 1, 0, 1);
+    xd->vert_stipple =
+      XCreatePixmapFromBitmapData(xd->dpy, xd->root,
+                                 vert_bits, vert_width, vert_height,
+                                 1, 0, 1);
+    xd->horiz_stipple =
+      XCreatePixmapFromBitmapData(xd->dpy, xd->root,
+                                 horiz_bits, horiz_width, horiz_height,
+                                 1, 0, 1);
+    xd->diag_stipple =
+      XCreatePixmapFromBitmapData(xd->dpy, xd->root,
+                                 diag_bits, diag_width, diag_height,
+                                 1, 0, 1);
+  }
+
+  if (xd->objects == NULL) {
+    Pixmap **pm;
+
+    xd->objects = pm = (Pixmap **)ckalloc(OBJN * sizeof (Pixmap *));
+
+    pm[0] = NULL; /* no object number 0 */
+    pm[TRA] = GetObjectXpms(xd, TRA, 5);
+    pm[COP] = GetObjectXpms(xd, COP, 8);
+    pm[AIR] = GetObjectXpms(xd, AIR, 11);
+    pm[SHI] = GetObjectXpms(xd, SHI, 8);
+    pm[GOD] = GetObjectXpms(xd, GOD, 16);
+    pm[TOR] = GetObjectXpms(xd, TOR, 3);
+    pm[EXP] = GetObjectXpms(xd, EXP, 6);
+    pm[BUS] = GetObjectXpms(xd, BUS, 4);
+  }
+}
+
+
+GetViewTiles(SimView *view)
+{
+  char name[256];
+  XpmAttributes attributes;
+
+  attributes.visual = Tk_DefaultVisual(view->x->screen);
+  attributes.colormap = Tk_DefaultColormap(view->x->screen);
+  attributes.depth = Tk_DefaultDepth(view->x->screen);
+  attributes.valuemask = XpmVisual | XpmColormap | XpmDepth;
+
+  if (view->class == Editor_Class) {
+
+    sprintf(name, "%s/images/%s", HomeDir,
+           view->x->color ? "tiles.xpm" : "tilesbw.xpm");
+
+    switch (view->type) {
+
+    case X_Mem_View:
+      if (view->x->big_tile_image == NULL) {
+       if (XpmReadFileToImage(view->x->dpy, name,
+                              &view->x->big_tile_image, NULL,
+                              &attributes) < 0) {
+         fprintf(stderr,
+                 "Uh oh, Micropolis couldn't read the pixmap file \"%s\".\n",
+                 name);
+         sim_exit(1); // Just sets tkMustExit and ExitReturn
+         return;
+       }
+      }
+      view->bigtiles = (unsigned char *)view->x->big_tile_image->data;
+      break;
+
+    case X_Wire_View:
+      if (view->x->big_tile_pixmap == None) {
+       if (XpmReadFileToPixmap(view->x->dpy,
+                               RootWindowOfScreen(view->x->screen),
+                               name,
+                               &view->x->big_tile_pixmap, NULL,
+                               &attributes) < 0) {
+         fprintf(stderr,
+                 "Uh oh, Micropolis couldn't read the pixmap file \"%s\".\n",
+                 name);
+         sim_exit(1); // Just sets tkMustExit and ExitReturn
+         return;
+       }
+      }
+      break;
+
+    }
+
+  } else if (view->class == Map_Class) {
+
+    if (view->x->small_tile_image == NULL) {
+      if (view->x->color) {
+
+       sprintf(name, "%s/images/%s", HomeDir, "tilessm.xpm");
+       if (XpmReadFileToImage(view->x->dpy, name,
+                              &view->x->small_tile_image, NULL,
+                              &attributes) < 0) {
+         fprintf(stderr,
+                 "Uh oh, Micropolis couldn't read the pixmap file \"%s\".\n",
+                 name);
+         sim_exit(1); // Just sets tkMustExit and ExitReturn
+         return;
+       }
+
+      } else {
+
+       view->x->small_tile_image = 
+         XCreateImage(view->x->dpy, view->x->visual, 8,
+                      ZPixmap,
+                      0, (char *)MickGetHexa(SIM_GSMTILE),
+                      4, 3 * TILE_COUNT, 8, 4);
+
+      }
+    }
+
+    { int x, y, b, tile;
+      unsigned char *from, *to;
+      int pixelBytes = view->pixel_bytes;
+      int rowBytes = view->x->small_tile_image->bytes_per_line;
+      
+      if (pixelBytes == 0) {
+       /* handle the case of monochrome display (8 bit map) */
+       pixelBytes = 1;
+      }
+
+      /* from is 4 pixels wide per 3 pixel wide tile */
+      from = (unsigned char *)view->x->small_tile_image->data;
+      to = (unsigned char *)ckalloc(4 * 4 * TILE_COUNT * pixelBytes);
+      view->smalltiles = to;
+
+      switch (pixelBytes) {
+
+      case 1:
+       for (tile = 0; tile < TILE_COUNT; tile++) {
+         for (y = 0; y < 3; y++) {
+           for (x = 0; x < 4; x++) {
+             *to++ = *from++;
+           }
+         }
+         for (x = 0; x < 4; x++) {
+           *to++ = 0;
+         }
+       }
+       break;
+
+      case 2:
+       for (tile = 0; tile < TILE_COUNT; tile++) {
+         for (y = 0; y < 3; y++) {
+           for (x = 0; x < 4; x++) {
+             *to++ = *from++;
+             *to++ = *from++;
+           }
+         }
+         for (x = 0; x < 4; x++) {
+           *to++ = 0;
+           *to++ = 0;
+         }
+       }
+       break;
+
+      case 3:
+      case 4:
+       for (tile = 0; tile < TILE_COUNT; tile++) {
+         for (y = 0; y < 3; y++) {
+           for (x = 0; x < 4; x++) {
+             *to++ = *from++;
+             *to++ = *from++;
+             *to++ = *from++;
+             if (pixelBytes == 4) {
+               *to++ = *from++;
+             }
+           }
+         }
+         for (x = 0; x < 4; x++) {
+           *to++ = 0;
+           *to++ = 0;
+           *to++ = 0;
+           if (pixelBytes == 4) {
+             *to++ = 0;
+           }
+         }
+       }
+       break;
+
+      default:
+       assert(0); /* Undefined depth */
+       break;
+
+      }
+
+    }
+  }
+}
diff --git a/src/sim/g_smmaps.c b/src/sim/g_smmaps.c
new file mode 100644 (file)
index 0000000..ed8c075
--- /dev/null
@@ -0,0 +1,388 @@
+/* g_smmaps.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+int DynamicData[32];
+
+
+#define DRAW_BEGIN \
+  int col, row; \
+  unsigned short tile; \
+  short *mp; \
+  unsigned char *imageBase; \
+  unsigned char *image; \
+  unsigned QUAD *mem; \
+  unsigned QUAD l; \
+  int lineBytes = view->line_bytes8; \
+  int pixelBytes = view->pixel_bytes; \
+  mp = &Map[0][0]; \
+  imageBase = view->x->color ? view->data : view->data8; \
+  for (col = 0; col < WORLD_X; col++) { \
+    image = imageBase + (3 * pixelBytes * col); \
+    for (row = 0; row < WORLD_Y; row++) { \
+      tile = *(mp++) & LOMASK; \
+      if (tile >= TILE_COUNT) tile -= TILE_COUNT;
+
+
+#if defined(MSDOS) || defined(OSF1) || defined(IS_INTEL)
+
+#define ROW1_8(n) \
+      l = mem[n]; \
+      image[0] = l; \
+      image[1] = l >>8; \
+      image[2] = l >>16; \
+      image += lineBytes;
+
+#define ROW1_16(n) \
+      memcpy((char *)image, ((char *)mem) + (n * 4 * 2), (3 * 2)); \
+      image += lineBytes;
+
+#define ROW1_24(n) \
+      memcpy((char *)image, ((char *)mem) + (n * 4 * 3), (3 * 3)); \
+      image += lineBytes;
+
+#define ROW1_32(n) \
+      memcpy((char *)image, ((char *)mem) + (n * 4 * 4), (3 * 4)); \
+      image += lineBytes;
+
+#else
+
+#define ROW1_8(n) \
+      l = mem[n]; \
+      image[0] = l >>24; \
+      image[1] = l >>16; \
+      image[2] = l >>8; \
+      image += lineBytes;
+
+#define ROW1_16(n) \
+      l = mem[n]; /* XXX: WRONG. handle depth */ \
+      image[0] = l >>24; \
+      image[1] = l >>16; \
+      image[2] = l >>8; \
+      image += lineBytes;
+
+#define ROW1_24(n) \
+      l = mem[n]; /* XXX: WRONG. handle depth */ \
+      image[0] = l >>24; \
+      image[1] = l >>16; \
+      image[2] = l >>8; \
+      image += lineBytes;
+
+#define ROW1_32(n) \
+      l = mem[n]; /* XXX: WRONG. handle depth */ \
+      image[0] = l >>24; \
+      image[1] = l >>16; \
+      image[2] = l >>8; \
+      image += lineBytes;
+
+#endif
+
+#define ROW3_8 ROW1_8(0) ROW1_8(1) ROW1_8(2)
+#define ROW3_16 ROW1_16(0) ROW1_16(1) ROW1_16(2)
+#define ROW3_24 ROW1_24(0) ROW1_24(1) ROW1_24(2)
+#define ROW3_32 ROW1_32(0) ROW1_32(1) ROW1_32(2)
+
+#define ROW3 \
+         switch (view->x->depth) { \
+               case 1: \
+               case 8: \
+                 ROW3_8 \
+                 break; \
+               case 15: \
+               case 16: \
+                 ROW3_16 \
+                 break; \
+               case 24: \
+                 ROW3_24 \
+                 break; \
+               case 32: \
+                 ROW3_32 \
+                 break; \
+               default: \
+                 assert(0); /* Undefined depth */ \
+                 break; \
+         }
+
+#define DRAW_END \
+      mem = (unsigned QUAD *)&view->smalltiles[tile * 4 * 4 * pixelBytes]; \
+      ROW3 \
+    } \
+  }
+
+
+void drawAll(SimView *view)
+{
+  DRAW_BEGIN
+  DRAW_END
+}
+
+
+void drawRes(SimView *view)
+{
+  DRAW_BEGIN
+    if (tile > 422)
+      tile = 0;
+  DRAW_END
+}
+
+
+void drawCom(SimView *view)
+{
+  DRAW_BEGIN
+    if ((tile > 609) ||
+       ((tile >= 232) && (tile < 423)))
+      tile = 0;
+  DRAW_END
+}
+
+
+void drawInd(SimView *view)
+{
+  DRAW_BEGIN
+    if (((tile >= 240) && (tile <= 611)) ||
+       ((tile >= 693) && (tile <= 851)) ||
+       ((tile >= 860) && (tile <= 883)) ||
+       (tile >= 932))
+      tile = 0;
+  DRAW_END
+}
+
+
+void drawLilTransMap(SimView *view)
+{
+  DRAW_BEGIN
+    if ((tile >= 240) ||
+       ((tile >= 207) && tile <= 220) ||
+       (tile == 223))
+      tile = 0;
+  DRAW_END
+}
+
+
+/* color pixel values */
+#define UNPOWERED      COLOR_LIGHTBLUE
+#define POWERED                COLOR_RED
+#define CONDUCTIVE     COLOR_LIGHTGRAY
+
+
+void drawPower(SimView *view)
+{
+  short col, row;
+  unsigned short tile;
+  short *mp;
+  unsigned char *image, *imageBase;
+  unsigned QUAD *mem;
+  unsigned QUAD l;
+  int lineBytes = view->line_bytes8;
+  int pixelBytes = view->pixel_bytes;
+
+  int pix;
+  int powered, unpowered, conductive;
+
+  if (view->x->color) {
+    powered = view->pixels[POWERED];
+    unpowered = view->pixels[UNPOWERED];
+    conductive = view->pixels[CONDUCTIVE];
+  } else {
+    powered = 255;
+    unpowered = 0;
+    conductive = 127;
+  }
+
+  mp = &Map[0][0];
+  imageBase = view->x->color ? view->data : view->data8;
+
+  for (col = 0; col < WORLD_X; col++) {
+    image = imageBase + (3 * pixelBytes * col);
+    for (row = 0; row < WORLD_Y; row++) {
+      tile = *(mp++);
+
+      if ((tile & LOMASK) >= TILE_COUNT) tile -= TILE_COUNT;
+
+      if ((unsigned short)(tile & LOMASK) <= (unsigned short)63) {
+               tile &= LOMASK;
+               pix = -1;
+      } else if (tile & ZONEBIT) {
+               pix = (tile & PWRBIT) ? powered : unpowered;
+      } else {
+               if (tile & CONDBIT) {
+                 pix = conductive;
+               } else {
+                 tile = 0;
+                 pix = -1;
+               }
+      }
+
+      if (pix < 0) {
+               mem = (unsigned QUAD *)&view->smalltiles[tile * 4 * 4 * pixelBytes];
+               ROW3
+      } else {
+               switch (view->x->depth) {
+
+               case 1:
+               case 8:
+                 image[0] = image[1] = image[2] = pix;
+                 image += lineBytes;
+                 image[0] = image[1] = image[2] = pix;
+                 image += lineBytes;
+                 image[0] = image[1] = image[2] = pix;
+                 image += lineBytes;
+                 break;
+
+               case 15:
+               case 16:
+                 { 
+                       unsigned short *p;
+                       p = (short *)image;
+                       p[0] = p[1] = p[2] = pix;
+                       image += lineBytes;
+                       p = (short *)image;
+                       p[0] = p[1] = p[2] = pix;
+                       image += lineBytes;
+                       p = (short *)image;
+                       p[0] = p[1] = p[2] = pix;
+                       image += lineBytes;
+                 }
+                 break;
+
+               case 24:
+               case 32:
+                 { 
+                       int x, y;
+                       for (y = 0; y < 3; y++) {
+                         unsigned char *img =
+                               image;
+                         for (x = 0; x < 4; x++) {
+                               *(img++) = (pix >> 0) & 0xff;
+                               *(img++) = (pix >> 8) & 0xff;
+                               *(img++) = (pix >> 16) & 0xff;
+                               if (pixelBytes == 4) {
+                                 img++;
+                               } // if
+                         } // for x
+                         image += lineBytes;
+                       } // for y
+                 }
+                 break;
+
+               default:
+                 assert(0); /* Undefined depth */
+                 break;
+
+               }
+      }
+    }
+  }
+}
+
+
+int dynamicFilter(int col, int row)
+{
+  int r, c, x;
+
+  r = row >>1;
+  c = col >>1;
+
+  if (((DynamicData[0] > DynamicData[1]) ||
+       ((x = PopDensity[c][r])                 >= DynamicData[0]) &&
+       (x                                                              <= DynamicData[1])) &&
+      ((DynamicData[2] > DynamicData[3]) ||
+       ((x = RateOGMem[c>>2][r>>2])            >= ((2 * DynamicData[2]) - 256)) &&
+       (x                                                              <= ((2 * DynamicData[3]) - 256))) &&
+      ((DynamicData[4] > DynamicData[5]) ||
+       ((x = TrfDensity[c][r])                 >= DynamicData[4]) &&
+       (x                                                              <= DynamicData[5])) &&
+      ((DynamicData[6] > DynamicData[7]) ||
+       ((x = PollutionMem[c][r])               >= DynamicData[6]) &&
+       (x                                                              <= DynamicData[7])) &&
+      ((DynamicData[8] > DynamicData[9]) ||
+       ((x = CrimeMem[c][r])                   >= DynamicData[8]) &&
+       (x                                                              <= DynamicData[9])) &&
+      ((DynamicData[10] > DynamicData[11]) ||
+       ((x = LandValueMem[c][r])               >= DynamicData[10]) &&
+       (x                                                              <= DynamicData[11])) &&
+      ((DynamicData[12] > DynamicData[13]) ||
+       ((x = PoliceMapEffect[c>>2][r>>2]) >= DynamicData[12]) &&
+       (x                                                              <= DynamicData[13])) &&
+      ((DynamicData[14] > DynamicData[15]) ||
+       ((x = FireRate[c>>2][r>>2])             >= DynamicData[14]) &&
+       (x                                                              <= DynamicData[15]))) {
+    return 1;
+  } else {
+    return 0;
+  } // if
+}
+
+
+void drawDynamic(SimView *view)
+{
+  DRAW_BEGIN
+    if (tile > 63) {
+      if (!dynamicFilter(col, row)) {
+       tile = 0;
+      } // if
+    } // if
+  DRAW_END
+}
+
+
diff --git a/src/sim/headers/animtab.h b/src/sim/headers/animtab.h
new file mode 100644 (file)
index 0000000..e62557f
--- /dev/null
@@ -0,0 +1,287 @@
+/* animtab.h
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+
+short aniTile[ 1024 ] = { 
+    0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,  15,
+    16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31, 
+    32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
+    48,  49,  50,  51,  52,  53,  54,  55,
+    /* Fire */                              
+                                           57,  58,  59,  60,  61,  62,  63,  56,
+    /* No Traffic */                    
+    64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
+    /* Light Traffic */
+#if 0
+    96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
+    112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
+    128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
+    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
+#else
+    128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
+    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
+    96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
+    112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
+#endif
+    /* Heavy Traffic */
+#if 0
+    160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
+    176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
+    192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
+    144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
+#else
+    192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
+    144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
+    160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
+    176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
+#endif
+    /* Wires & Rails */
+    208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
+    224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
+    /* Residential */
+    240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255,
+    256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271,
+    272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287,
+    288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303,
+    304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319,
+    320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335,
+    336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351,
+    352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367,
+    368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383,
+    384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399,
+    400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415,
+    416, 417, 418, 419, 420, 421, 422,
+    /* Commercial */
+                                      423, 424, 425, 426, 427, 428, 429, 430, 431,
+    432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447,
+    448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463,
+    464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479,
+    480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495,
+    496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511,
+    512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527,
+    528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543,
+    544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559,
+    560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575,
+    576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591,
+    592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607,
+    608, 609, 610, 611,
+    /* Industrial */
+                       612, 613, 614, 615, 616, 617, 618, 619, 852, 621, 622, 623,
+    624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639,
+    640, 884, 642, 643, 888, 645, 646, 647, 648, 892, 896, 651, 652, 653, 654, 655,
+    656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671,
+    672, 673, 674, 675, 900, 904, 678, 679, 680, 681, 682, 683, 684, 685, 908, 687,
+    688, 912, 690, 691, 692,
+    /* SeaPort */
+                            693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703,
+    704, 705, 706, 707, 708,
+    /* AirPort */
+                            709, 710, 832, 712, 713, 714, 715, 716, 717, 718, 719,
+    720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735,
+    736, 737, 738, 739, 740, 741, 742, 743, 744,
+    /* Coal power */
+                                                745, 746, 916, 920, 749, 750, 924,
+    928, 753, 754, 755, 756, 757, 758, 759, 760,
+    /* Fire Dept */
+                                                761, 762, 763, 764, 765, 766, 767,
+    768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778,
+    /* Stadium */
+                                                          779, 780, 781, 782, 783,
+    784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794,
+    /* Stadium Anims */
+                                                          795, 796, 797, 798, 799,
+    800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810,
+    /* Nuclear Power */
+                                                          811, 812, 813, 814, 815,
+    816, 817, 818, 819, 952, 821, 822, 823, 824, 825, 826,
+    /* Power out + Bridges */
+                                                          827, 828, 829, 830, 831,
+    /* Radar dish */
+    833, 834, 835, 836, 837, 838, 839, 832,
+    /* Fountain / Flag */
+                                           841, 842, 843, 840, 845, 846, 847, 848,
+    849, 850, 851, 844, 853, 854, 855, 856, 857, 858, 859, 852,
+    /* zone destruct & rubblize */
+                                                               861, 862, 863, 864,
+    865, 866, 867, 867,
+    /* totally unsure */
+                       868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879,
+    880, 881, 882, 883,
+    /* Smoke stacks */
+                       885, 886, 887, 884, 889, 890, 891, 888, 893, 894, 895, 892,
+    897, 898, 899, 896, 901, 902, 903, 900, 905, 906, 907, 904, 909, 910, 911, 908,
+    913, 914, 915, 912, 917, 918, 919, 916, 921, 922, 923, 920, 925, 926, 927, 924,
+    929, 930, 931, 928,
+    /* Stadium Playfield */
+                       933, 934, 935, 936, 937, 938, 939, 932, 941, 942, 943, 944,
+    945, 946, 947, 940,
+    /* Bridge up chars */
+                       948, 949, 950, 951,
+    /* Nuclear swirl */
+                                           953, 954, 955, 952,
+    /*  */
+};
+
+
+unsigned char aniSynch[1024] = {
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       /* Fire */
+                                                       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       /* No Traffic */
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       /* Light Traffic */
+       0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 
+       0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 
+       0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 
+       0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+       /* Heavy Traffic */     
+       0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 
+       0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 
+       0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 
+       0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
+        /* Wires and Rails */
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       /* Residential */
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       /* Commercial */
+                                                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 
+       /* Industrial */
+                               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0x11, 0xff, 0xff, 0x11, 0xff, 0xff, 0xff, 0xff, 0x11, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0x11, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0xff, 
+       0xff, 0x11, 0xff, 0xff, 0xff, 
+       /* SeaPort */
+                                     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff,
+       /* AirPort */
+                                     0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       /* Coal Power */
+                                                             0xff, 0xff, 0x11, 0x11, 0xff, 0xff, 0x11, 
+       0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       /* Fire/Police Department */
+                                                             0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       /* Stadium */
+                                                                         0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       /* Full Stadium */
+                                                                         0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       /* Nuclear Power */
+                                                                         0xff, 0xff, 0xff, 0xff, 0xff, 
+       0xff, 0xff, 0xff, 0xff, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       /* Power out/Bridges */
+                                                                         0xff, 0xff, 0xff, 0xff, 0xff, 
+       /* Radar Dish */
+       0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
+       /* Fountain/Flag */
+                                                       0x11, 0x22, 0x44, 0x88, 0x01, 0x02, 0x04, 0x08,
+       0x10, 0x20, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
+       /* Zone Destruct + Rubblize */
+                                                                               0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff,
+       /* Totally Unsure */
+                               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 
+       /* Smoke Stacks */
+                               0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88,
+       0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88, 
+       0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88, 
+       0x11, 0x22, 0x44, 0x88, 
+       /* Stadium Playfield */
+                               0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08,
+       0x10, 0x20, 0x40, 0x80,
+       /* Bridge Up */
+                               0xff, 0xff, 0xff, 0xff,
+       /* Nuclear swirl */
+                                                       0x11, 0x22, 0x44, 0x88,
+};
diff --git a/src/sim/headers/cam.h b/src/sim/headers/cam.h
new file mode 100644 (file)
index 0000000..80cb20b
--- /dev/null
@@ -0,0 +1,217 @@
+/* cam.h
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <signal.h>
+#ifndef HPUX
+#include <stropts.h>
+#endif
+#include <time.h>
+#include <errno.h>
+#ifndef IS_LINUX
+#include <sys/conf.h>
+#endif
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <sys/mman.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/extensions/XShm.h>
+
+
+#define CAM_ARGS \
+       SimCam *scam, ARGS
+
+
+struct Can {
+  Byte *mem;
+  int line_bytes;
+  int width;
+  int height;
+};
+
+typedef struct Can Can;
+
+
+struct Cam {
+  struct Cam *next;
+  Can *back, *front;
+  void (*neighborhood)();
+  Byte *rule;
+  int rule_size;
+  int width;
+  int height;
+  int ideal_width;
+  int ideal_height;
+  int phase;
+  int wrap;
+  int steps;
+  int frob;
+  int x;
+  int y;
+  int dx;
+  int dy;
+  int gx;
+  int gy;
+  int dragging;
+  int set_x;
+  int set_y;
+  int set_width;
+  int set_height;
+  int set_x0;
+  int set_y0;
+  int set_x1;
+  int set_y1;
+  char *name;
+};
+
+
+typedef struct Cam Cam;
+
+
+struct SimCam {
+  struct SimCam *next;
+  int w_x, w_y, w_width, w_height;
+  int visible;
+  int invalid;
+  int skips;
+  int skip;
+  Tk_Window tkwin;
+  Tcl_Interp *interp;
+  int flags;
+  XDisplay *x;
+  XImage *image;
+  XShmSegmentInfo *shminfo;
+  int line_bytes;
+  u_char *data;
+  int cam_count;
+  Cam *cam_list;
+};
+
+
+typedef struct SimCam SimCam;
+
+
+#define NORTHWEST      ((Byte)((l0>>16) & 0xff))
+#define NORTH          ((Byte)((l0>>8) & 0xff))
+#define NORTHEAST      ((Byte)(l0 & 0xff))
+#define WEST           ((Byte)((l1>>16) & 0xff))
+#define CENTER         ((Byte)((l1>>8) & 0xff))
+#define EAST           ((Byte)(l1 & 0xff))
+#define SOUTHWEST      ((Byte)((l2>>16) & 0xff))
+#define SOUTH          ((Byte)((l2>>8) & 0xff))
+#define SOUTHEAST      ((Byte)(l2 & 0xff))
+
+#define SUM8           ((l0&1) + ((l0>>8)&1) + ((l0>>16)&1) + \
+                        (l1&1) +               ((l1>>16)&1) + \
+                        (l2&1) + ((l2>>8)&1) + ((l2>>16)&1))
+
+#define SUM9           (SUM8 + ((l1>>8)&1))
+
+#define SUM8p(p)       (((l0>>p)&1) + ((l0>>(p+8))&1) + ((l0>>(p+16))&1) + \
+                        ((l1>>p)&1) +                   ((l1>>(p+16))&1) + \
+                        ((l2>>p)&1) + ((l2>>(p+8))&1) + ((l2>>(p+16))&1))
+
+#define SUM9p(p)       (SUM8p(p) + ((l1>>(p+8))&1))
+
+#define CAM_LOOP_BODY(BODY) \
+      { int y; \
+       int backline = cam->back->line_bytes, \
+           frontline = cam->front->line_bytes; \
+       Byte *back = cam->back->mem, \
+              *front = cam->front->mem; \
+       Byte *rule = cam->rule; \
+       for (y=0; y<cam->height; y++) { \
+         QUAD l0 = (back[0]<<8) + \
+                   back[1], \
+              l1 = (back[backline]<<8) + \
+                   back[backline+1], \
+              l2 = (back[backline+backline]<<8) + \
+                   back[backline+backline+1]; \
+         int x, w = cam->width; \
+         for (x=0; x<w; x++) { \
+           l0 = (l0<<8) + back[2]; \
+           l1 = (l1<<8) + back[backline+2]; \
+           l2 = (l2<<8) + back[backline+backline+2]; \
+           BODY; \
+           back++; front++; \
+         } \
+         back += backline - w; front += frontline - w; \
+       } \
+      }
+
+#define CAM_LOOP(RULE) \
+       CAM_LOOP_BODY(*front = (RULE) )
+
+#define CAM_TABLE_LOOP(NEIGHBORHOOD) \
+         CAM_LOOP(rule[(NEIGHBORHOOD)])
+
+
+typedef void (*vf)();
+
diff --git a/src/sim/headers/mac.h b/src/sim/headers/mac.h
new file mode 100644 (file)
index 0000000..3163f8f
--- /dev/null
@@ -0,0 +1,90 @@
+/* mac.h:  minor league Macintosh emulation
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+
+#ifndef _Mac_
+#define _Mac_ 1
+
+#ifdef OSF1
+#define QUAD int
+#else
+#define QUAD long
+#endif
+
+typedef unsigned char Byte;
+typedef Byte * Ptr;
+typedef char **Handle;
+
+extern Ptr NewPtr();
+extern Handle GetResource();
+extern QUAD ResourceSize();
+extern char *ResourceName();
+extern QUAD ResourceID();
+
+struct Resource {
+  char *buf;
+  QUAD size;
+  char name[4];
+  QUAD id;
+  struct Resource *next;
+};
+
+#endif
diff --git a/src/sim/headers/macros.h b/src/sim/headers/macros.h
new file mode 100644 (file)
index 0000000..48a3964
--- /dev/null
@@ -0,0 +1,127 @@
+/* macros.h
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+
+#define ABS(x)         (((x) < 0) ? (-(x)) : (x))
+
+#define HASHED_CMD(scope, name) \
+  { int new; \
+    Tcl_CreateHashEntry(&scope##Cmds, #name, &new)->clientData = \
+      (ClientData)scope##Cmd##name; \
+  }
+
+
+#define ARGS \
+       Tcl_Interp *interp, int argc, char **argv
+
+#define CLIENT_ARGS \
+       ClientData clientData, ARGS
+
+#define VIEW_ARGS \
+       SimView *view, ARGS
+
+#define GRAPH_ARGS \
+       SimGraph *graph, ARGS
+
+#define DATE_ARGS \
+       SimDate *date, ARGS
+
+#define SPRITE_ARGS \
+       SimSprite *sprite, ARGS
+
+
+/* tile bounds */
+
+#define TestBounds(x, y) \
+       (((x) >= 0) && ((x) < WORLD_X) && ((y) >= 0) && ((y) < WORLD_Y))
+
+/* For s_disasters.c */
+
+#define TILE_IS_NUCLEAR(tile) \
+       ((tile & LOMASK) == NUCLEAR)
+
+#define TILE_IS_VULNERABLE(tile) \
+       (!(tile & ZONEBIT) && \
+        ((tile & LOMASK) >= RBRDR) && \
+        ((tile & LOMASK) <= LASTZONE))
+
+#define TILE_IS_ARSONABLE(tile) \
+       (!(tile & ZONEBIT) && \
+        ((tile & LOMASK) >= RBRDR) && \
+        ((tile & LOMASK) <= LASTZONE))
+
+#define TILE_IS_RIVER_EDGE(tile) \
+       (((tile & LOMASK) >= FIRSTRIVEDGE) && \
+        ((tile & LOMASK) <= LASTRIVEDGE))
+
+#define TILE_IS_FLOODABLE(tile) \
+       ((tile == DIRT) || \
+        ((tile & BULLBIT) && \
+         (tile & BURNBIT)))
+
+#define TILE_IS_RUBBLE(tile) \
+        (((tile & LOMASK) >= RUBBLE) && \
+         ((tile & LOMASK) <= LASTRUBBLE)))
+
+#define TILE_IS_FLOODABLE2(tile) \
+       ((tile == 0) || \
+        (tile & BURNBIT) || \
+         TILE_IS_RUBBLE(tile))
diff --git a/src/sim/headers/sim.h b/src/sim/headers/sim.h
new file mode 100644 (file)
index 0000000..d6a31a1
--- /dev/null
@@ -0,0 +1,691 @@
+/* sim.h:  Main include file
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+
+/* workaround sun c compiler junk */
+
+#ifdef sun
+
+#define _TTYCHARS_
+#define CTRL(c) (#c[0]&037)
+
+#ifndef SOLARIS2
+#define __sys_ioccom_h
+#define _IOCPARM_MASK   0xff            /* parameters must be < 256 bytes */
+#define _IOC_VOID       0x20000000      /* no parameters */
+#define _IOC_OUT        0x40000000      /* copy out parameters */
+#define _IOC_IN         0x80000000      /* copy in parameters */
+#define _IOC_INOUT      (_IOC_IN|_IOC_OUT)
+#define _IO(x,y)        (_IOC_VOID|(#x[0]<<8)|y)
+#define _IOR(x,y,t)     (_IOC_OUT|((sizeof(t)&_IOCPARM_MASK)<<16)|(#x[0]<<8)|y)
+#define _IORN(x,y,t)    (_IOC_OUT|(((t)&_IOCPARM_MASK)<<16)|(#x[0]<<8)|y)
+#define _IOW(x,y,t)     (_IOC_IN|((sizeof(t)&_IOCPARM_MASK)<<16)|(#x[0]<<8)|y)
+#define _IOWN(x,y,t)    (_IOC_IN|(((t)&_IOCPARM_MASK)<<16)|(#x[0]<<8)|y)
+#define _IOWR(x,y,t)    (_IOC_INOUT|((sizeof(t)&_IOCPARM_MASK)<<16)|(#x[0]<<8)|y)
+#define _IOWRN(x,y,t)   (_IOC_INOUT|(((t)&_IOCPARM_MASK)<<16)|(#x[0]<<8)|y)
+#endif
+
+#endif
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <ctype.h>
+#include <setjmp.h>
+#include <malloc.h>
+#include <errno.h>
+#include <signal.h>
+#include <math.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <sys/ioctl.h>
+#include <sys/resource.h>
+#ifndef MSDOS
+#ifndef HPUX
+#include <alloca.h>
+#endif
+#include <sys/mman.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+
+#ifdef sun
+#ifdef SOLARIS2
+#include <sys/systeminfo.h>
+#else
+#include <sys/vadvise.h>
+#endif
+#endif
+
+#ifdef sgi
+#if 0
+#include <audio.h>
+#endif
+#endif
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/extensions/XShm.h>
+
+//#include <xpmtk.h>
+#include <X11/xpm.h>
+
+/* gcc compat workaround! */
+#define _STDDEF_H
+
+#include "tclxtend.h"
+#include "tclint.h"
+#include "tclunix.h"
+#include "tkconfig.h"
+#include "tkint.h"
+
+#include "mac.h"
+#include "view.h"
+#include "macros.h"
+
+/* Constants */
+
+#define TRUE            1
+#define FALSE           0
+
+#ifdef MEGA
+#define SimWidth       (120 * MEGA)
+#define SimHeight      (100 * MEGA)
+#else
+#define SimWidth       120
+#define SimHeight      100
+#endif
+
+#define WORLD_X                SimWidth
+#define WORLD_Y                SimHeight
+#define HWLDX          (SimWidth >>1)
+#define HWLDY          (SimHeight >>1)
+#define QWX            (SimWidth >>2)
+#define QWY            (SimHeight >>2)
+#define SmX            (SimWidth >>3)
+#define SmY            ((SimHeight + 7) >>3)
+
+#define EDITOR_W (WORLD_X * 16)
+#define EDITOR_H (WORLD_Y * 16)
+#define MAP_W (WORLD_X * 3)
+#define MAP_H (WORLD_Y * 3)
+
+#define NIL            0
+#define HORIZ          1
+#define VERT           0
+
+#define PROBNUM 10
+
+#define HISTLEN                480
+#define MISCHISTLEN    240
+
+#define POWERMAPROW            ((WORLD_X + 15) / 16)
+
+#ifdef MEGA
+#define POWERMAPLEN            ((QUAD)(2 * POWERMAPROW * WORLD_Y))
+#define POWERWORD(x, y)                ((((QUAD)(x)) >>4) + (((QUAD)(y)) * POWERMAPROW))
+#else
+#define POWERMAPLEN            1700 /* ??? PWRMAPSIZE */
+#define POWERWORD(x, y)                (((x) >>4) + ((y) <<3))
+#endif
+
+#define SETPOWERBIT(x, y)      PowerMap[POWERWORD((x), (y))] |= 1 << ((x) & 15)
+#define PWRMAPSIZE             (POWERMAPROW * WORLD_Y)
+#define PWRSTKSIZE             ((WORLD_X * WORLD_Y) / 4)
+
+#define ALMAP 0 /* all */
+#define REMAP 1 /* residential */
+#define COMAP 2 /* commercial */
+#define INMAP 3 /* industrial */
+
+#define PRMAP 4 /* power */
+#define RDMAP 5 /* road */
+
+#define PDMAP 6 /* population density */
+#define RGMAP 7 /* rate of growth */
+
+#define TDMAP 8 /* traffic density */
+#define PLMAP 9 /* pollution */
+#define CRMAP 10 /* crime */
+#define LVMAP 11 /* land value */
+
+#define FIMAP 12 /* fire radius */
+#define POMAP 13 /* police radius */
+#define DYMAP 14 /* dynamic */
+
+#define NMAPS 15
+
+/* These adjust frequency in Simulate() */
+
+#define VALVERATE 2
+#define CENSUSRATE 4
+#define TAXFREQ 48
+
+/* These are names of the 16 colors */
+#define COLOR_WHITE            0
+#define COLOR_YELLOW           1
+#define COLOR_ORANGE           2
+#define COLOR_RED              3
+#define COLOR_DARKRED          4
+#define COLOR_DARKBLUE         5
+#define COLOR_LIGHTBLUE                6
+#define COLOR_BROWN            7
+#define COLOR_LIGHTGREEN       8
+#define COLOR_DARKGREEN                9
+#define COLOR_OLIVE            10
+#define COLOR_LIGHTBROWN       11
+#define COLOR_LIGHTGRAY                12
+#define COLOR_MEDIUMGRAY       13
+#define COLOR_DARKGRAY         14
+#define COLOR_BLACK            15
+
+/* Status Bits */
+
+#define PWRBIT         32768   /*20    bit 15  */
+#define CONDBIT                16384   /*10    bit 14  */
+#define BURNBIT                8192    /*8     bit 13  */
+#define BULLBIT                4096    /*4     bit 12  */
+#define ANIMBIT                2048    /*2     bit 11  */
+#define ZONEBIT                1024    /*1     bit 10  */
+#define ALLBITS                64512   /*  mask for upper 6 bits       */
+#define LOMASK         1023    /*      mask for low 10 bits    */
+
+#define BLBNBIT                (BULLBIT+BURNBIT)
+#define BLBNCNBIT      (BULLBIT+BURNBIT+CONDBIT)
+#define BNCNBIT                (BURNBIT+CONDBIT)
+
+/* Object & Sound Numbers */
+
+#define TRA            1
+#define COP            2
+#define AIR            3
+#define SHI            4
+#define GOD            5
+#define TOR            6
+#define EXP            7
+#define BUS            8
+
+/* Max # of Objects */
+
+#define OBJN           9
+
+/* Graph Histories */
+#define RES_HIST       0
+#define COM_HIST       1
+#define IND_HIST       2
+#define MONEY_HIST     3
+#define CRIME_HIST     4
+#define POLLUTION_HIST 5
+#define HISTORIES      6
+#define ALL_HISTORIES  ((1 <<HISTORIES) - 1)
+
+/* Character Mapping */
+
+#define DIRT           0
+#define RIVER          2
+#define REDGE          3
+#define CHANNEL                4
+#define FIRSTRIVEDGE   5
+#define LASTRIVEDGE    20
+#define TREEBASE       21
+#define LASTTREE       36
+#define WOODS          37
+#define UNUSED_TRASH1  38
+#define UNUSED_TRASH2  39
+#define WOODS2         40
+#define WOODS3         41
+#define WOODS4         42
+#define WOODS5         43
+#define RUBBLE         44
+#define LASTRUBBLE     47
+#define FLOOD          48
+#define LASTFLOOD      51
+#define RADTILE                52
+#define UNUSED_TRASH3  53
+#define UNUSED_TRASH4  54
+#define UNUSED_TRASH5  55
+#define FIRE           56
+#define FIREBASE       56
+#define LASTFIRE       63
+#define ROADBASE       64
+#define HBRIDGE                64
+#define VBRIDGE                65
+#define ROADS          66
+#define INTERSECTION   76
+#define HROADPOWER     77
+#define VROADPOWER     78
+#define BRWH           79
+#define LTRFBASE       80
+#define BRWV           95
+#define BRWXXX1                111
+#define BRWXXX2                127
+#define BRWXXX3                143
+#define HTRFBASE       144
+#define BRWXXX4                159
+#define BRWXXX5                175
+#define BRWXXX6                191
+#define LASTROAD       206
+#define BRWXXX7                207
+#define POWERBASE      208
+#define HPOWER         208
+#define VPOWER         209
+#define LHPOWER                210
+#define LVPOWER                211
+#define RAILHPOWERV    221
+#define RAILVPOWERH    222
+#define LASTPOWER      222
+#define UNUSED_TRASH6  223
+#define RAILBASE       224
+#define HRAIL          224
+#define VRAIL          225
+#define LHRAIL         226
+#define LVRAIL         227
+#define HRAILROAD      237
+#define VRAILROAD      238
+#define LASTRAIL       238
+#define ROADVPOWERH    239 /* bogus? */
+#define RESBASE                240
+#define FREEZ          244
+#define HOUSE          249
+#define LHTHR          249
+#define HHTHR          260
+#define RZB            265
+#define HOSPITAL       409
+#define CHURCH         418
+#define COMBASE                423
+#define COMCLR         427
+#define CZB            436
+#define INDBASE                612
+#define INDCLR         616
+#define LASTIND                620
+#define IND1           621
+#define IZB            625
+#define IND2           641
+#define IND3           644
+#define IND4           649
+#define IND5           650
+#define IND6           676
+#define IND7           677
+#define IND8           686
+#define IND9           689
+#define PORTBASE       693
+#define PORT           698
+#define LASTPORT       708
+#define AIRPORTBASE    709
+#define RADAR          711
+#define AIRPORT                716
+#define COALBASE       745
+#define POWERPLANT     750
+#define LASTPOWERPLANT 760
+#define FIRESTBASE     761
+#define FIRESTATION    765
+#define POLICESTBASE   770
+#define POLICESTATION  774
+#define STADIUMBASE    779
+#define STADIUM                784
+#define FULLSTADIUM    800
+#define NUCLEARBASE    811
+#define NUCLEAR                816
+#define LASTZONE       826
+#define LIGHTNINGBOLT  827
+#define HBRDG0         828
+#define HBRDG1         829
+#define HBRDG2         830
+#define HBRDG3         831
+#define RADAR0         832
+#define RADAR1         833
+#define RADAR2         834
+#define RADAR3         835
+#define RADAR4         836
+#define RADAR5         837
+#define RADAR6         838
+#define RADAR7         839
+#define FOUNTAIN       840
+#define INDBASE2       844
+#define TELEBASE       844
+#define TELELAST       851
+#define SMOKEBASE      852
+#define TINYEXP                860
+#define SOMETINYEXP    864
+#define LASTTINYEXP    867
+#define COALSMOKE1     916
+#define COALSMOKE2     920
+#define COALSMOKE3     924
+#define COALSMOKE4     928
+#define FOOTBALLGAME1  932
+#define FOOTBALLGAME2  940
+#define VBRDG0         948
+#define VBRDG1         949
+#define VBRDG2         950
+#define VBRDG3         951
+
+#define TILE_COUNT     960
+
+/* 
+ * These describe the wand values, the object dragged around on the screen.
+ */
+
+#define residentialState 0
+#define commercialState 1
+#define industrialState 2
+#define fireState 3
+#define queryState 4
+#define policeState 5
+#define wireState 6
+#define dozeState 7
+#define rrState 8
+#define roadState 9
+#define chalkState 10
+#define eraserState 11
+#define stadiumState 12
+#define parkState 13
+#define seaportState  14
+#define powerState 15
+#define nuclearState 16
+#define airportState 17
+#define networkState 18
+
+
+#define firstState residentialState
+#define lastState networkState
+
+#if 0
+#define specialState 16
+#define monsterGoalState 17
+#define helicopterGoalState 18
+#define blackState 19
+#define whiteState 20
+#define redState 21
+#define orangeState 23
+#define blueState 24
+#define greenState 25
+#define brownState 26
+#endif
+
+
+#define STATE_CMD 0
+#define STATE_TILES 1
+#define STATE_OVERLAYS 2
+#define STATE_GRAPHS 3
+
+
+extern short *Map[WORLD_X];            /* Main Map 120 x 100  */
+extern Byte *PopDensity[HWLDX];                /* 2X2 Maps  60 x 50 */
+extern Byte *TrfDensity[HWLDX];
+extern Byte *PollutionMem[HWLDX];
+extern Byte *LandValueMem[HWLDX];
+extern Byte *CrimeMem[HWLDX];
+extern Byte *tem[HWLDX];
+extern Byte *tem2[HWLDX];
+extern Byte *TerrainMem[QWX];          /* 4X4 Maps  30 x 25 */
+extern Byte *Qtem[QWX];
+extern short RateOGMem[SmX][SmY];
+extern short FireStMap[SmX][SmY];      /* 8X8 Maps  15 x 13 */
+extern short PoliceMap[SmX][SmY];
+extern short PoliceMapEffect[SmX][SmY];
+extern short ComRate[SmX][SmY];
+extern short FireRate[SmX][SmY];
+extern short STem[SmX][SmY];
+extern short SpriteXOffset[OBJN];
+extern short SpriteYOffset[OBJN];
+extern short SMapX, SMapY;
+extern short CChr, CChr9;
+extern short RoadTotal, RailTotal, FirePop;
+extern short ResPop, ComPop, IndPop, TotalPop, LastTotalPop;
+extern short ResZPop, ComZPop, IndZPop, TotalZPop;
+extern short HospPop, ChurchPop, StadiumPop;
+extern short PolicePop, FireStPop;
+extern short CoalPop, NuclearPop, PortPop, APortPop;
+extern short NeedHosp, NeedChurch;
+extern short CrimeAverage, PolluteAverage, LVAverage;
+extern char *MicropolisVersion;
+extern char *CityName;
+extern char *CityFileName;
+extern char *StartupName;
+extern short StartingYear;
+extern QUAD CityTime;
+extern QUAD LastCityTime;
+extern QUAD LastCityMonth;
+extern QUAD LastCityYear;
+extern QUAD LastFunds;
+extern QUAD LastR, LastC, LastI;
+extern short GameLevel;
+extern short Cycle;
+extern short ScenarioID;
+extern short ShakeNow;
+extern QUAD DonDither;
+extern int DoOverlay;
+
+extern short *ResHis, ResHisMax;
+extern short *ComHis, ComHisMax;
+extern short *IndHis, IndHisMax;
+extern short *MoneyHis, *CrimeHis, *PollutionHis, *MiscHis;
+extern short *PowerMap;
+
+extern float roadPercent, policePercent, firePercent;
+extern QUAD RoadSpend, PoliceSpend, FireSpend;
+extern QUAD roadMaxValue, policeMaxValue, fireMaxValue;
+extern QUAD TaxFund, RoadFund, PoliceFund, FireFund;
+extern short RoadEffect, PoliceEffect, FireEffect;
+extern short TaxFlag, CityTax;
+extern QUAD TotalFunds;
+
+extern QUAD costOf[];
+
+extern short flagBlink;
+extern unsigned char tileSynch;
+extern short aniTile[];
+extern unsigned char aniSynch[];
+extern int TilesAnimated;
+extern int DoAnimation;
+extern int DoMessages;
+extern int DoNotices;
+extern unsigned char ColorIntensities[];
+
+extern short MesX, MesY;
+extern short MesNum, MessagePort;
+extern QUAD LastMesTime;
+
+extern short SimSpeed;
+extern short SimMetaSpeed;
+extern short NoDisasters;
+extern short autoBulldoze;
+extern short autoBudget;
+extern short autoGo;
+extern short UserSoundOn;
+
+extern short DisasterEvent;
+extern short DisasterWait;
+
+extern short ResCap, ComCap, IndCap;
+extern short RValve, CValve, IValve;
+extern short PwrdZCnt;
+extern short unPwrdZCnt;
+
+extern char *HomeDir, *ResourceDir, *HostName;
+
+extern short Graph10Max, Graph120Max;
+extern short Res2HisMax, Com2HisMax, Ind2HisMax;
+extern unsigned char *History10[HISTORIES], *History120[HISTORIES];
+extern short CityScore;
+extern short deltaCityScore;
+extern short ScoreType;
+extern short ScoreWait;
+extern short CityClass;
+extern short PolMaxX, PolMaxY;
+extern int PowerStackNum;
+extern short TrafficAverage;
+extern short PosStackN;
+extern short SMapXStack[], SMapYStack[];
+extern short Zsource;
+extern short HaveLastMessage;
+extern short PdestX, PdestY;
+extern short CdestX, CdestY;
+extern int absDist;
+extern short CopFltCnt;
+extern short GodCnt;
+extern short GdestX, GdestY;
+extern short GorgX, GorgY;
+extern short GodControl;
+extern short CopControl;
+extern short CdestX, CdestY;
+extern short TrafMaxX, TrafMaxY;
+extern short CrimeMaxX, CrimeMaxY;
+extern short FloodX, FloodY;
+extern short CrashX, CrashY;
+extern short CCx, CCy;
+extern QUAD CityPop, deltaCityPop;
+extern char *cityClassStr[6];
+extern short CityYes, CityNo;
+extern short ProblemTable[PROBNUM];
+extern short ProblemVotes[PROBNUM];
+extern short ProblemOrder[4];
+extern QUAD CityAssValue;
+
+extern short InitSimLoad;
+extern short DoInitialEval;
+extern int Startup;
+extern int StartupGameLevel;
+extern int PerformanceTiming;
+extern double FlushTime;
+
+extern char *optarg;
+extern int optind;
+extern struct timeval start_time, now_time, beat_time, last_now_time;
+extern Sim *sim;
+extern int WireMode;
+extern int MultiPlayerMode;
+extern int SugarMode;
+extern int sim_delay;
+extern int sim_skips;
+extern int sim_skip;
+extern int sim_paused;
+extern int sim_paused_speed;
+extern int sim_tty;
+#ifdef CAM
+extern int sim_just_cam;
+#endif
+extern int heat_steps;
+extern int heat_flow;
+extern int heat_rule;
+extern int UpdateDelayed;
+extern int DynamicData[32];
+extern int Players;
+extern int Votes;
+extern int BobHeight;
+extern int OverRide;
+extern int Expensive;
+extern int PendingTool;
+extern int PendingX;
+extern int PendingY;
+extern int TreeLevel;
+extern int LakeLevel;
+extern int CurveLevel;
+extern int CreateIsland;
+extern short specialBase;
+extern short PunishCnt;
+extern short Dozing;
+extern short toolSize[];
+extern short toolOffset[];
+extern QUAD toolColors[];
+extern char *Displays;
+extern char *FirstDisplay;
+extern char *dateStr[12];
+
+extern short NewMap;
+extern short NewMapFlags[NMAPS];
+extern short NewGraph;
+extern short ValveFlag;
+extern short MustUpdateFunds;
+extern short MustUpdateOptions;
+extern short CensusChanged;
+extern short EvalChanged;
+extern short MeltX, MeltY;
+extern int NeedRest;
+extern int ExitReturn;
+
+extern Tcl_Interp *tk_mainInterp;
+extern Tk_Window MainWindow;
+extern int FlushStyle;
+extern int GotXError;
+
+extern short Rand(short range);
+extern short RandInt(void);
+
+extern Sim *MakeNewSim();
+extern SimView *MakeNewView();
+extern SimSprite *GetSprite();
+extern SimSprite *MakeSprite();
+extern SimSprite *MakeNewSprite();
+
+extern int setSpeed(short speed);
+extern int setSkips(int skips);
+extern int SetGameLevel(short level);
+extern int SetGameLevelFunds(short level);
+
+extern struct XDisplay *XDisplays;
diff --git a/src/sim/headers/view.h b/src/sim/headers/view.h
new file mode 100644 (file)
index 0000000..39931a5
--- /dev/null
@@ -0,0 +1,326 @@
+/* view.h
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+
+#define X_Mem_View 1
+#define X_Wire_View 2
+
+#define Editor_Class 0
+#define Map_Class 1
+
+#define Button_Press 0
+#define Button_Move 1
+#define Button_Release 2
+
+#define VIEW_REDRAW_PENDING 1
+
+
+typedef struct Ink {
+  struct Ink *next;
+  int x, y;
+  int color;
+  int length;
+  int maxlength;
+  XPoint *points;
+  int left, top, right, bottom;
+  int last_x, last_y;
+} Ink;
+
+
+typedef struct XDisplay {
+  struct XDisplay *next;
+  int references;
+  char *display;
+  TkDisplay *tkDisplay;
+  Display *dpy;
+  Screen *screen;
+  Window root;
+  Visual *visual;
+  int depth;
+  int color;
+  Colormap colormap;
+  int *pixels;
+  GC gc;
+  int shared;
+  unsigned long last_request_read;
+  unsigned long request;
+  XImage *big_tile_image;
+  XImage *small_tile_image;
+  Pixmap big_tile_pixmap;
+  Pixmap **objects;
+  GC overlay_gc;
+  Pixmap gray25_stipple;
+  Pixmap gray50_stipple;
+  Pixmap gray75_stipple;
+  Pixmap vert_stipple;
+  Pixmap horiz_stipple;
+  Pixmap diag_stipple;
+} XDisplay;
+
+
+typedef struct SimView {
+  struct SimView *next;
+  char *title;
+  int type;
+  int class;
+
+/* graphics stuff */
+  int *pixels;
+  int line_bytes;
+  int pixel_bytes;
+  int depth;
+  unsigned char *data;
+  int line_bytes8;
+  unsigned char *data8;
+  int visible;
+  int invalid;
+  int skips;
+  int skip;
+  int update;
+
+/* map stuff */
+  unsigned char *smalltiles;
+  short map_state;
+  int show_editors;
+
+/* editor stuff */
+  unsigned char *bigtiles;
+  short power_type;
+  short tool_showing;
+  short tool_mode;
+  short tool_x, tool_y;
+  short tool_x_const, tool_y_const;
+  short tool_state;
+  short tool_state_save;
+  short super_user;
+  short show_me;
+  short dynamic_filter;
+  Tk_TimerToken auto_scroll_token;
+  Time tool_event_time;
+  Time tool_last_event_time;
+
+/* scrolling */
+  int w_x, w_y;                                        /* view window position */
+  int w_width, w_height;                       /* view window size */
+  int m_width, m_height;                       /* memory buffer size */
+  int i_width, i_height;                       /* ideal whole size */
+  int pan_x, pan_y;                            /* centered in window */
+  int tile_x, tile_y, tile_width, tile_height; /* visible tiles */
+  int screen_x, screen_y, screen_width, screen_height; /* visible pixels */
+
+/* tracking */
+  int orig_pan_x, orig_pan_y;
+  int last_x, last_y;
+  int last_button;
+  char *track_info;
+  char *message_var;
+
+/* window system */
+  Tk_Window tkwin;
+  Tcl_Interp *interp;
+  int flags;
+
+  XDisplay *x;
+  XShmSegmentInfo *shminfo;
+  short **tiles;
+  short **other_tiles;
+  XImage *image;
+  XImage *other_image;
+  unsigned char *other_data;
+  Pixmap pixmap;
+  Pixmap pixmap2;
+  Pixmap overlay_pixmap;
+  Pixmap overlay_valid;
+  XFontStruct *fontPtr;
+
+/* timing */
+  int updates;
+  double update_real;
+  double update_user;
+  double update_system;
+  int update_context;
+
+/* auto goto */
+  int auto_goto;
+  int auto_going;
+  int auto_x_goal, auto_y_goal;
+  int auto_speed;
+  struct SimSprite *follow;
+
+/* sound */
+  int sound;
+
+/* configuration */
+  int width, height;
+
+/* overlay */
+  int show_overlay;
+  int overlay_mode;
+  struct timeval overlay_time;
+} SimView;
+
+
+typedef struct SimGraph {
+  struct SimGraph *next;
+  int range;
+  int mask;
+  Tk_Window tkwin;
+  Tcl_Interp *interp;
+  int flags;
+  XDisplay *x;
+  int visible;
+  int w_x, w_y;
+  int w_width, w_height;
+  Pixmap pixmap;
+  int *pixels;
+  XFontStruct *fontPtr;
+  Tk_3DBorder border;
+  int borderWidth;
+  int relief;
+  Tk_TimerToken draw_graph_token;
+} SimGraph;
+
+
+typedef struct SimDate {
+  struct SimDate *next;
+  int reset;
+  int month;
+  int year;
+  int lastmonth;
+  int lastyear;
+  Tk_Window tkwin;
+  Tcl_Interp *interp;
+  int flags;
+  XDisplay *x;
+  int visible;
+  int w_x, w_y;
+  int w_width, w_height;
+  Pixmap pixmap;
+  int *pixels;
+  XFontStruct *fontPtr;
+  Tk_3DBorder border;
+  int borderWidth;
+  int padX;
+  int padY;
+  int width;
+  int monthTab;
+  int monthTabX;
+  int yearTab;
+  int yearTabX;
+  Tk_TimerToken draw_date_token;
+} SimDate;
+
+
+typedef struct SimSprite {
+  struct SimSprite *next;
+  char *name;
+  int type;
+  int frame;
+  int x, y;
+  int width, height;
+  int x_offset, y_offset;
+  int x_hot, y_hot;
+  int orig_x, orig_y;
+  int dest_x, dest_y;
+  int count, sound_count;
+  int dir, new_dir;
+  int step, flag, control;
+  int turn;
+  int accel;
+  int speed;
+} SimSprite;
+
+
+#ifdef CAM
+#include "cam.h"
+#endif
+
+
+typedef struct Person {
+  int id;
+  char *name;
+} Person;
+
+
+typedef struct Sim {
+  int editors;
+  SimView *editor;
+  int maps;
+  SimView *map;
+  int graphs;
+  SimGraph *graph;
+  int dates;
+  SimDate *date;
+  int sprites;
+  SimSprite *sprite;
+#ifdef CAM
+  int scams;
+  SimCam *scam;
+#endif
+  Ink *overlay;
+} Sim;
+
+
+typedef struct Cmd {
+  char *name;
+  int (*cmd)();
+} Cmd;
+
diff --git a/src/sim/makefile b/src/sim/makefile
new file mode 100644 (file)
index 0000000..3497eb2
--- /dev/null
@@ -0,0 +1,107 @@
+XINCLUDE = /usr/include/X11
+TCLHOME = ../tcl
+TKHOME = ../tk
+TCLXHOME = ../tclx
+TCLLIBRARY = /usr/local/lib/tcl
+TKLIBRARY = /usr/local/lib/tk
+
+CC = gcc
+
+OPTFLAGS = -O3
+#OPTFLAGS = -g
+
+#DEFINES = -DIS_LINUX -DIS_INTEL -DCAM -DNET
+DEFINES = -DIS_LINUX -DIS_INTEL
+
+CFLAGS = $(OPTFLAGS) $(DEFINES)
+
+#LDFLAGS = -Bstatic
+
+INSTALL = install -s
+
+INCLUDES = \
+       -Iheaders \
+       -I$(XPMHOME) \
+       -I$(XINCLUDE) \
+       -I$(TCLHOME) \
+       -I$(TCLXHOME)/src \
+       -I$(TKHOME)
+
+CPPFLAGS = $(INCLUDES)
+
+LIBS = $(TCLXHOME)/libtk.a \
+       $(TCLXHOME)/libtcl.a \
+       -lm \
+        -lX11 \
+        -lXext \
+       -lXpm
+
+SRCS = \
+       sim.c \
+       s_alloc.c \
+       s_disast.c \
+       s_eval.c \
+       s_gen.c \
+       s_init.c \
+       s_msg.c \
+       s_power.c \
+       s_scan.c \
+       s_sim.c \
+       s_traf.c \
+       s_zone.c \
+       s_fileio.c \
+       g_setup.c \
+       g_ani.c \
+       g_bigmap.c \
+       g_map.c \
+       g_smmaps.c \
+       w_stubs.c \
+       w_sound.c \
+       w_resrc.c \
+       w_keys.c \
+       w_util.c \
+       w_con.c \
+       w_eval.c \
+       w_budget.c \
+       w_graph.c \
+       w_date.c \
+       w_update.c \
+       w_tool.c \
+       w_x.c \
+       w_tk.c \
+       w_sim.c \
+       w_editor.c \
+       w_map.c \
+       w_sprite.c \
+       w_piem.c \
+       w_inter.c \
+       w_cam.c \
+       g_cam.c \
+       w_net.c \
+       rand.c \
+       random.c
+
+HEADERS = \
+       headers/mac.h \
+       headers/macros.h \
+       headers/sim.h \
+       headers/view.h \
+       headers/animtab.h
+
+OBJS = $(SRCS:.c=.o)
+ALLOBJS = $(OBJS)
+
+all: sim
+
+lint:
+       alint $(INCLUDES) $(SRCS) > LINT
+
+sim: $(ALLOBJS)
+       $(CC) $(CFLAGS) $(LDFLAGS) $(INCLUDES) $(ALLOBJS) $(LIBS) -o sim
+
+clean:
+       rm -f $(OBJS) \
+               sim a.out core gmon.out *~ *.BAK Headers/*~
+
+etags:
+       etags $(SRCS) $(HEADERS)
diff --git a/src/sim/rand.c b/src/sim/rand.c
new file mode 100644 (file)
index 0000000..6311526
--- /dev/null
@@ -0,0 +1,55 @@
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * 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. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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.
+ */
+
+#include "sim.h"
+
+#include <sys/types.h>
+#include <stdlib.h>
+
+#define SIM_RAND_MAX 0xffff
+
+static unsigned QUAD next = 1;
+
+int
+sim_rand()
+{
+       next = next * 1103515245 + 12345;
+       return ((next % ((SIM_RAND_MAX + 1) <<8)) >>8);
+}
+
+void
+sim_srand(seed)
+u_int seed;
+{
+       next = seed;
+}
diff --git a/src/sim/random.c b/src/sim/random.c
new file mode 100644 (file)
index 0000000..e043b88
--- /dev/null
@@ -0,0 +1,366 @@
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.
+ *
+ * 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. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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.
+ */
+
+#include "sim.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/*
+ * random.c:
+ *
+ * An improved random number generation package.  In addition to the standard
+ * rand()/srand() like interface, this package also has a special state info
+ * interface.  The initstate() routine is called with a seed, an array of
+ * bytes, and a count of how many bytes are being passed in; this array is
+ * then initialized to contain information for random number generation with
+ * that much state information.  Good sizes for the amount of state
+ * information are 32, 64, 128, and 256 bytes.  The state can be switched by
+ * calling the setstate() routine with the same array as was initiallized
+ * with initstate().  By default, the package runs with 128 bytes of state
+ * information and generates far better random numbers than a linear
+ * congruential generator.  If the amount of state information is less than
+ * 32 bytes, a simple linear congruential R.N.G. is used.
+ *
+ * Internally, the state information is treated as an array of longs; the
+ * zeroeth element of the array is the type of R.N.G. being used (small
+ * integer); the remainder of the array is the state information for the
+ * R.N.G.  Thus, 32 bytes of state information will give 7 longs worth of
+ * state information, which will allow a degree seven polynomial.  (Note:
+ * the zeroeth word of state information also has some other information
+ * stored in it -- see setstate() for details).
+ * 
+ * The random number generation technique is a linear feedback shift register
+ * approach, employing trinomials (since there are fewer terms to sum up that
+ * way).  In this approach, the least significant bit of all the numbers in
+ * the state table will act as a linear feedback shift register, and will
+ * have period 2^deg - 1 (where deg is the degree of the polynomial being
+ * used, assuming that the polynomial is irreducible and primitive).  The
+ * higher order bits will have longer periods, since their values are also
+ * influenced by pseudo-random carries out of the lower bits.  The total
+ * period of the generator is approximately deg*(2**deg - 1); thus doubling
+ * the amount of state information has a vast influence on the period of the
+ * generator.  Note: the deg*(2**deg - 1) is an approximation only good for
+ * large deg, when the period of the shift register is the dominant factor.
+ * With deg equal to seven, the period is actually much longer than the
+ * 7*(2**7 - 1) predicted by this formula.
+ */
+
+/*
+ * For each of the currently supported random number generators, we have a
+ * break value on the amount of state information (you need at least this
+ * many bytes of state info to support this random number generator), a degree
+ * for the polynomial (actually a trinomial) that the R.N.G. is based on, and
+ * the separation between the two lower order coefficients of the trinomial.
+ */
+#define        TYPE_0          0               /* linear congruential */
+#define        BREAK_0         8
+#define        DEG_0           0
+#define        SEP_0           0
+
+#define        TYPE_1          1               /* x**7 + x**3 + 1 */
+#define        BREAK_1         32
+#define        DEG_1           7
+#define        SEP_1           3
+
+#define        TYPE_2          2               /* x**15 + x + 1 */
+#define        BREAK_2         64
+#define        DEG_2           15
+#define        SEP_2           1
+
+#define        TYPE_3          3               /* x**31 + x**3 + 1 */
+#define        BREAK_3         128
+#define        DEG_3           31
+#define        SEP_3           3
+
+#define        TYPE_4          4               /* x**63 + x + 1 */
+#define        BREAK_4         256
+#define        DEG_4           63
+#define        SEP_4           1
+
+/*
+ * Array versions of the above information to make code run faster --
+ * relies on fact that TYPE_i == i.
+ */
+#define        MAX_TYPES       5               /* max number of types above */
+
+static int degrees[MAX_TYPES] =        { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 };
+static int seps [MAX_TYPES] =  { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 };
+
+QUAD sim_random();
+void sim_srandom();
+char *sim_initstate();
+char *sim_setstate();
+
+/*
+ * Initially, everything is set up as if from:
+ *
+ *     initstate(1, &randtbl, 128);
+ *
+ * Note that this initialization takes advantage of the fact that srandom()
+ * advances the front and rear pointers 10*rand_deg times, and hence the
+ * rear pointer which starts at 0 will also end up at zero; thus the zeroeth
+ * element of the state information, which contains info about the current
+ * position of the rear pointer is just
+ *
+ *     MAX_TYPES * (rptr - state) + TYPE_3 == TYPE_3.
+ */
+
+static QUAD randtbl[DEG_3 + 1] = {
+       TYPE_3,
+       0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342, 0xde3b81e0, 0xdf0a6fb5,
+       0xf103bc02, 0x48f340fb, 0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd,
+       0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, 0xda672e2a, 0x1588ca88,
+       0xe369735d, 0x904f35f7, 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc,
+       0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, 0xf5ad9d0e, 0x8999220b,
+       0x27fb47b9,
+};
+
+/*
+ * fptr and rptr are two pointers into the state info, a front and a rear
+ * pointer.  These two pointers are always rand_sep places aparts, as they
+ * cycle cyclically through the state information.  (Yes, this does mean we
+ * could get away with just one pointer, but the code for random() is more
+ * efficient this way).  The pointers are left positioned as they would be
+ * from the call
+ *
+ *     initstate(1, randtbl, 128);
+ *
+ * (The position of the rear pointer, rptr, is really 0 (as explained above
+ * in the initialization of randtbl) because the state table pointer is set
+ * to point to randtbl[1] (as explained below).
+ */
+static QUAD *fptr = &randtbl[SEP_3 + 1];
+static QUAD *rptr = &randtbl[1];
+
+/*
+ * The following things are the pointer to the state information table, the
+ * type of the current generator, the degree of the current polynomial being
+ * used, and the separation between the two pointers.  Note that for efficiency
+ * of random(), we remember the first location of the state information, not
+ * the zeroeth.  Hence it is valid to access state[-1], which is used to
+ * store the type of the R.N.G.  Also, we remember the last location, since
+ * this is more efficient than indexing every time to find the address of
+ * the last element to see if the front and rear pointers have wrapped.
+ */
+static QUAD *state = &randtbl[1];
+static int rand_type = TYPE_3;
+static int rand_deg = DEG_3;
+static int rand_sep = SEP_3;
+static QUAD *end_ptr = &randtbl[DEG_3 + 1];
+
+/*
+ * srandom:
+ *
+ * Initialize the random number generator based on the given seed.  If the
+ * type is the trivial no-state-information type, just remember the seed.
+ * Otherwise, initializes state[] based on the given "seed" via a linear
+ * congruential generator.  Then, the pointers are set to known locations
+ * that are exactly rand_sep places apart.  Lastly, it cycles the state
+ * information a given number of times to get rid of any initial dependencies
+ * introduced by the L.C.R.N.G.  Note that the initialization of randtbl[]
+ * for default usage relies on values produced by this routine.
+ */
+void
+sim_srandom(x)
+       unsigned int x;
+{
+       register int i, j;
+
+       if (rand_type == TYPE_0)
+               state[0] = x;
+       else {
+               j = 1;
+               state[0] = x;
+               for (i = 1; i < rand_deg; i++)
+                       state[i] = 1103515245 * state[i - 1] + 12345;
+               fptr = &state[rand_sep];
+               rptr = &state[0];
+               for (i = 0; i < 10 * rand_deg; i++)
+                       (void)sim_random();
+       }
+}
+
+/*
+ * initstate:
+ *
+ * Initialize the state information in the given array of n bytes for future
+ * random number generation.  Based on the number of bytes we are given, and
+ * the break values for the different R.N.G.'s, we choose the best (largest)
+ * one we can and set things up for it.  srandom() is then called to
+ * initialize the state information.
+ * 
+ * Note that on return from srandom(), we set state[-1] to be the type
+ * multiplexed with the current value of the rear pointer; this is so
+ * successive calls to initstate() won't lose this information and will be
+ * able to restart with setstate().
+ * 
+ * Note: the first thing we do is save the current state, if any, just like
+ * setstate() so that it doesn't matter when initstate is called.
+ *
+ * Returns a pointer to the old state.
+ */
+char *
+sim_initstate(seed, arg_state, n)
+       unsigned int seed;              /* seed for R.N.G. */
+       char *arg_state;                /* pointer to state array */
+       int n;                          /* # bytes of state info */
+{
+       register char *ostate = (char *)(&state[-1]);
+
+       if (rand_type == TYPE_0)
+               state[-1] = rand_type;
+       else
+               state[-1] = MAX_TYPES * (rptr - state) + rand_type;
+       if (n < BREAK_0) {
+               (void)fprintf(stderr,
+                   "random: not enough state (%d bytes); ignored.\n", n);
+               return(0);
+       }
+       if (n < BREAK_1) {
+               rand_type = TYPE_0;
+               rand_deg = DEG_0;
+               rand_sep = SEP_0;
+       } else if (n < BREAK_2) {
+               rand_type = TYPE_1;
+               rand_deg = DEG_1;
+               rand_sep = SEP_1;
+       } else if (n < BREAK_3) {
+               rand_type = TYPE_2;
+               rand_deg = DEG_2;
+               rand_sep = SEP_2;
+       } else if (n < BREAK_4) {
+               rand_type = TYPE_3;
+               rand_deg = DEG_3;
+               rand_sep = SEP_3;
+       } else {
+               rand_type = TYPE_4;
+               rand_deg = DEG_4;
+               rand_sep = SEP_4;
+       }
+       state = &(((QUAD *)arg_state)[1]);      /* first location */
+       end_ptr = &state[rand_deg];     /* must set end_ptr before srandom */
+       sim_srandom(seed);
+       if (rand_type == TYPE_0)
+               state[-1] = rand_type;
+       else
+               state[-1] = MAX_TYPES*(rptr - state) + rand_type;
+       return(ostate);
+}
+
+/*
+ * setstate:
+ *
+ * Restore the state from the given state array.
+ *
+ * Note: it is important that we also remember the locations of the pointers
+ * in the current state information, and restore the locations of the pointers
+ * from the old state information.  This is done by multiplexing the pointer
+ * location into the zeroeth word of the state information.
+ *
+ * Note that due to the order in which things are done, it is OK to call
+ * setstate() with the same state as the current state.
+ *
+ * Returns a pointer to the old state information.
+ */
+char *
+sim_setstate(arg_state)
+       char *arg_state;
+{
+       register QUAD *new_state = (QUAD *)arg_state;
+       register int type = new_state[0] % MAX_TYPES;
+       register int rear = new_state[0] / MAX_TYPES;
+       char *ostate = (char *)(&state[-1]);
+
+       if (rand_type == TYPE_0)
+               state[-1] = rand_type;
+       else
+               state[-1] = MAX_TYPES * (rptr - state) + rand_type;
+       switch(type) {
+       case TYPE_0:
+       case TYPE_1:
+       case TYPE_2:
+       case TYPE_3:
+       case TYPE_4:
+               rand_type = type;
+               rand_deg = degrees[type];
+               rand_sep = seps[type];
+               break;
+       default:
+               (void)fprintf(stderr,
+                   "random: state info corrupted; not changed.\n");
+       }
+       state = &new_state[1];
+       if (rand_type != TYPE_0) {
+               rptr = &state[rear];
+               fptr = &state[(rear + rand_sep) % rand_deg];
+       }
+       end_ptr = &state[rand_deg];             /* set end_ptr too */
+       return(ostate);
+}
+
+/*
+ * random:
+ *
+ * If we are using the trivial TYPE_0 R.N.G., just do the old linear
+ * congruential bit.  Otherwise, we do our fancy trinomial stuff, which is
+ * the same in all the other cases due to all the global variables that have
+ * been set up.  The basic operation is to add the number at the rear pointer
+ * into the one at the front pointer.  Then both pointers are advanced to
+ * the next location cyclically in the table.  The value returned is the sum
+ * generated, reduced to 31 bits by throwing away the "least random" low bit.
+ *
+ * Note: the code takes advantage of the fact that both the front and
+ * rear pointers can't wrap on the same call by not testing the rear
+ * pointer if the front one has wrapped.
+ *
+ * Returns a 31-bit random number.
+ */
+QUAD
+sim_random()
+{
+       QUAD i;
+
+       if (rand_type == TYPE_0)
+               i = state[0] = (state[0] * 1103515245 + 12345) & 0x7fffffff;
+       else {
+               *fptr += *rptr;
+               i = (*fptr >> 1) & 0x7fffffff;  /* chucking least random bit */
+               if (++fptr >= end_ptr) {
+                       fptr = state;
+                       ++rptr;
+               } else if (++rptr >= end_ptr)
+                       rptr = state;
+       }
+       return(i);
+}
diff --git a/src/sim/s_alloc.c b/src/sim/s_alloc.c
new file mode 100644 (file)
index 0000000..25be874
--- /dev/null
@@ -0,0 +1,209 @@
+/* s_alloc.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+/* Allocate Stuff */
+
+
+short SMapX, SMapY;
+short CChr, CChr9;
+
+short RoadTotal, RailTotal, FirePop;
+
+short ResPop, ComPop, IndPop, TotalPop, LastTotalPop;
+short ResZPop, ComZPop, IndZPop, TotalZPop;
+short HospPop, ChurchPop, StadiumPop;
+short PolicePop, FireStPop;
+short CoalPop, NuclearPop, PortPop, APortPop;
+
+short NeedHosp, NeedChurch;
+short CrimeAverage, PolluteAverage, LVAverage;
+
+QUAD CityTime;
+short StartingYear;
+
+short *Map[WORLD_X];
+
+short ResHisMax, Res2HisMax;
+short ComHisMax, Com2HisMax;
+short IndHisMax, Ind2HisMax;
+short CensusChanged;
+
+short MessagePort;
+short MesX, MesY;
+
+QUAD RoadSpend, PoliceSpend, FireSpend;
+QUAD RoadFund, PoliceFund, FireFund;
+short RoadEffect, PoliceEffect, FireEffect;
+QUAD TaxFund; 
+short CityTax, TaxFlag;
+unsigned char tileSynch = 0x01;
+
+Byte *PopDensity[HWLDX];
+Byte *TrfDensity[HWLDX];
+Byte *PollutionMem[HWLDX];
+Byte *LandValueMem[HWLDX];
+Byte *CrimeMem[HWLDX];
+Byte *tem[HWLDX];
+Byte *tem2[HWLDX];
+Byte *TerrainMem[QWX];
+Byte *Qtem[QWX];
+
+short RateOGMem[SmX][SmY];
+short FireStMap[SmX][SmY];
+short PoliceMap[SmX][SmY];
+short PoliceMapEffect[SmX][SmY];
+
+short FireRate[SmX][SmY];
+short ComRate[SmX][SmY];
+short STem[SmX][SmY];
+
+Ptr terrainBase;
+Ptr qTemBase;
+Ptr tem1Base;
+Ptr tem2Base;
+
+Ptr popPtr;
+Ptr trfPtr;
+Ptr polPtr;
+Ptr landPtr;
+Ptr crimePtr;
+       
+Ptr auxPopPtr;
+Ptr auxTrfPtr;
+Ptr auxPolPtr;
+Ptr auxLandPtr;
+Ptr auxCrimePtr;
+Ptr brettPtr;
+
+unsigned short *mapPtr;
+short *ResHis;
+short *ComHis;
+short *IndHis;
+short *MoneyHis;
+short *PollutionHis;
+short *CrimeHis;
+short *MiscHis;
+short *PowerMap;
+
+
+int initMapArrays(void)
+{
+  short i;
+  unsigned short *auxPtr, *temp1;
+
+  if (!mapPtr)
+    mapPtr = (unsigned short *)NewPtr(sizeof(unsigned short) *
+                                     WORLD_X * WORLD_Y);
+  auxPtr = mapPtr;
+
+  for (i = 0; i < WORLD_X; i++) {
+    temp1 = auxPtr + i * WORLD_Y;
+    Map[i] = (short *)temp1;
+  }
+
+  popPtr = NewPtr(HWLDX * HWLDY);
+  trfPtr = NewPtr(HWLDX * HWLDY);
+  polPtr = NewPtr(HWLDX * HWLDY);
+  landPtr = NewPtr(HWLDX * HWLDY);
+  crimePtr = NewPtr(HWLDX * HWLDY);
+
+  tem1Base = NewPtr(HWLDX * HWLDY);
+  tem2Base = NewPtr(HWLDX * HWLDY);
+
+  auxPopPtr = popPtr;
+  auxTrfPtr = trfPtr;
+  auxPolPtr = polPtr;
+  auxLandPtr = landPtr;
+  auxCrimePtr = crimePtr;
+
+  for (i = 0; i < HWLDX; i++) {
+    PopDensity[i] = (Byte *) auxPopPtr + (i * HWLDY);
+    TrfDensity[i] = (Byte *) auxTrfPtr + (i * HWLDY);
+    PollutionMem[i] = (Byte *) auxPolPtr + (i * HWLDY);
+    LandValueMem[i] = (Byte *) auxLandPtr + (i * HWLDY);
+    CrimeMem[i] = (Byte *) auxCrimePtr + (i * HWLDY);
+
+    tem[i] = (Byte *)tem1Base + (i * HWLDY);
+    tem2[i] = (Byte *) tem2Base + (i * HWLDY);
+  }
+
+  brettPtr = (Ptr) &PopDensity[0][0];
+
+  terrainBase = NewPtr(QWX * QWY);
+  qTemBase = NewPtr(QWX * QWY);
+
+  for (i = 0; i < QWX; i++) {
+    TerrainMem[i] = (Byte *)terrainBase + (i * QWY);
+    Qtem[i] = (Byte *)qTemBase + (i * QWY);
+  }
+
+  ResHis = (short *)NewPtr(HISTLEN);
+  ComHis = (short *)NewPtr(HISTLEN);
+  IndHis = (short *)NewPtr(HISTLEN);
+  MoneyHis = (short *)NewPtr(HISTLEN);
+  PollutionHis = (short *)NewPtr(HISTLEN);
+  CrimeHis = (short *)NewPtr(HISTLEN);
+  MiscHis = (short *)NewPtr(MISCHISTLEN);
+  PowerMap = (short *)NewPtr(POWERMAPLEN);             /* power alloc */
+}
diff --git a/src/sim/s_disast.c b/src/sim/s_disast.c
new file mode 100644 (file)
index 0000000..691e4f3
--- /dev/null
@@ -0,0 +1,320 @@
+/* s_disast.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+/* Disasters */
+
+
+short ShakeNow;
+short FloodCnt;
+short FloodX, FloodY;
+
+
+/* comefrom: Simulate */
+DoDisasters(void)
+{ 
+  /* Chance of disasters at lev 0 1 2 */
+  static short DisChance[3] = { 10*48, 5*48, 60}; 
+  register short x;
+
+  if (FloodCnt) FloodCnt--;
+  if (DisasterEvent) 
+    ScenarioDisaster();
+
+  x = GameLevel;
+  if (x > 2) x = 0;
+
+  if (NoDisasters) return;             /*post*/
+  if (!Rand(DisChance[x])) {
+    x = Rand(8);
+    switch (x) {
+    case 0:
+    case 1:
+      SetFire();
+      break;
+    case 2:
+    case 3:
+      MakeFlood();
+      break;
+    case 4:
+      break;
+    case 5:
+      MakeTornado();
+      break;
+    case 6:
+      MakeEarthquake();
+      break;
+    case 7:
+    case 8:
+      if (PolluteAverage > /* 80 */ 60) MakeMonster();
+      break;
+    }
+  }
+}
+
+
+/* comefrom: DoDisasters */
+ScenarioDisaster(void)
+{
+  int x, y;
+
+  switch (DisasterEvent) {
+    case 1:                    /* Dullsville */
+      break;
+    case 2:                    /* San Francisco */
+      if (DisasterWait == 1) MakeEarthquake();
+      break;
+    case 3:                    /* Hamburg */
+      DropFireBombs();
+      break;
+    case 4:                    /* Bern */
+      break;
+    case 5:                    /* Tokyo */
+      if (DisasterWait == 1) MakeMonster();
+      break;
+    case 6:                    /* Detroit */
+      break;
+    case 7:                    /* Boston */
+      if (DisasterWait == 1) MakeMeltdown();
+      break;
+    case 8:                    /* Rio */
+      if ((DisasterWait % 24) == 0) MakeFlood();
+      break;
+  }
+  if (DisasterWait) DisasterWait--;
+  else DisasterEvent = 0;
+}
+
+
+/* comefrom: ScenarioDisaster */
+MakeMeltdown(void)
+{
+  short x, y;
+
+  for (x = 0; x < (WORLD_X - 1); x ++) {
+    for (y = 0; y < (WORLD_Y - 1); y++) {
+      /* TILE_IS_NUCLEAR(Map[x][y]) */
+      if ((Map[x][y] & LOMASK) == NUCLEAR) {
+       DoMeltdown(x, y);
+       return;
+      }
+    }
+  }
+}
+
+
+FireBomb()
+{
+  CrashX = Rand(WORLD_X - 1);
+  CrashY = Rand(WORLD_Y - 1);
+  MakeExplosion(CrashX, CrashY);
+  ClearMes();
+  SendMesAt(-30, CrashX, CrashY);
+}
+
+
+/* comefrom: DoDisasters ScenarioDisaster */
+MakeEarthquake(void)
+{
+  register short x, y, z;
+  short time;
+
+  DoEarthQuake();
+
+  SendMesAt(-23, CCx, CCy);
+  time = Rand(700) + 300;
+  for (z = 0; z < time; z++)  {
+    x = Rand(WORLD_X - 1);
+    y = Rand(WORLD_Y - 1);
+    if ((x < 0) || (x > (WORLD_X - 1)) ||
+       (y < 0) || (y > (WORLD_Y - 1)))
+      continue;
+    /* TILE_IS_VULNERABLE(Map[x][y]) */
+    if (Vunerable(Map[x][y])) {
+      if (z & 0x3)
+       Map[x][y] = (RUBBLE + BULLBIT) + (Rand16() & 3);
+      else
+       Map[x][y] = (FIRE + ANIMBIT) + (Rand16() & 7);
+    }
+  }
+}
+
+
+/* comefrom: DoDisasters */
+SetFire(void)
+{
+  register short x, y, z;
+
+  x = Rand(WORLD_X - 1);
+  y = Rand(WORLD_Y - 1);
+  z = Map[x][y];
+  /* TILE_IS_ARSONABLE(z) */
+  if (!(z & ZONEBIT)) {
+    z = z & LOMASK;
+    if ((z > LHTHR) && (z < LASTZONE)) {
+      Map[x][y] = FIRE + ANIMBIT + (Rand16() & 7);
+      CrashX = x; CrashY = y;
+      SendMesAt(-20, x, y);
+    }
+  }
+}
+
+
+/* comefrom: DoDisasters */
+MakeFire(void)
+{
+  short t, x, y, z;
+  for (t = 0; t < 40; t++)  {
+    x = Rand(WORLD_X - 1);
+    y = Rand(WORLD_Y - 1);
+    z = Map[x][y];
+    /* !(z & BURNBIT) && TILE_IS_ARSONABLE(z) */
+    if ((!(z & ZONEBIT)) && (z & BURNBIT)) {
+      z = z & LOMASK;
+      if ((z > 21) && (z < LASTZONE)) {
+       Map[x][y] = FIRE + ANIMBIT + (Rand16() & 7);
+       SendMesAt(20, x, y);
+       return;
+      }
+    }
+  }
+}
+
+
+/* comefrom: MakeEarthquake */
+Vunerable(int tem)
+{
+  register int tem2;
+
+  tem2 = tem & LOMASK;
+  if ((tem2 < RESBASE) ||
+      (tem2 > LASTZONE) ||
+      (tem & ZONEBIT))
+    return(FALSE);
+  return(TRUE);
+}
+
+
+/* comefrom: DoDisasters ScenarioDisaster */
+MakeFlood(void)
+{
+  static short Dx[4] = { 0, 1, 0,-1};
+  static short Dy[4] = {-1, 0, 1, 0};
+  register short xx, yy, c;
+  short z, t, x, y;
+
+  for (z = 0; z < 300; z++) {
+    x = Rand(WORLD_X - 1);
+    y = Rand(WORLD_Y - 1);
+    c = Map[x][y] & LOMASK; /* XXX: & LOMASK */
+    /* TILE_IS_RIVER_EDGE(c) */
+    if ((c > 4) && (c < 21))           /* if riveredge  */
+      for (t = 0; t < 4; t++) {
+       xx = x + Dx[t];
+       yy = y + Dy[t];
+       if (TestBounds(xx, yy)) {
+         c = Map[xx][yy];
+         /* TILE_IS_FLOODABLE(c) */
+         if ((c == 0) || ((c & BULLBIT) && (c & BURNBIT))) {
+           Map[xx][yy] = FLOOD;
+           FloodCnt = 30;
+           SendMesAt(-42, xx, yy);
+           FloodX = xx; FloodY = yy;
+           return;
+         }
+       }
+      }
+  }
+}
+
+
+/* comefrom: MapScan */
+DoFlood(void)
+{
+  static short Dx[4] = { 0, 1, 0,-1};
+  static short Dy[4] = {-1, 0, 1, 0};
+  register short z, c, xx, yy, t;
+
+  if (FloodCnt)
+    for (z = 0; z < 4; z++) {
+      if (!(Rand16() & 7)) {
+       xx = SMapX + Dx[z];
+       yy = SMapY + Dy[z];
+       if (TestBounds(xx, yy)) {
+         c = Map[xx][yy];
+         t = c & LOMASK;
+         /* TILE_IS_FLOODABLE2(c) */
+         if ((c & BURNBIT) ||
+             (c == 0) ||
+             ((t >= WOODS5 /* XXX */) && (t < FLOOD))) {
+           if (c & ZONEBIT)
+             FireZone(xx, yy, c);
+           Map[xx][yy] = FLOOD + Rand(2);
+         }
+       }
+      }
+    }
+  else
+    if (!(Rand16() & 15))
+      Map[SMapX][SMapY] = 0;
+}
diff --git a/src/sim/s_eval.c b/src/sim/s_eval.c
new file mode 100644 (file)
index 0000000..acbb6ed
--- /dev/null
@@ -0,0 +1,344 @@
+/* s_eval.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+/* City Evaluation */
+
+
+short EvalValid;
+short CityYes, CityNo;
+short ProblemTable[PROBNUM];
+short ProblemTaken[PROBNUM];
+short ProblemVotes[PROBNUM];           /* these are the votes for each  */
+short ProblemOrder[4];                 /* sorted index to above  */
+QUAD CityPop, deltaCityPop;
+QUAD CityAssValue;
+short CityClass;                       /*  0..5  */
+short CityScore, deltaCityScore, AverageCityScore;
+short TrafficAverage;
+
+
+/* comefrom: SpecialInit Simulate */
+CityEvaluation(void)
+{
+  EvalValid = 0;
+  if (TotalPop) {
+    GetAssValue();
+    DoPopNum();
+    DoProblems();
+    GetScore();
+    DoVotes();
+    ChangeEval();
+  } else {
+    EvalInit();
+    ChangeEval();
+  }
+  EvalValid = 1;
+}
+
+
+/* comefrom: CityEvaluation SetCommonInits */
+EvalInit(void)
+{
+  register short x, z;
+
+  z = 0;
+  CityYes = z;
+  CityNo = z;
+  CityPop = z; 
+  deltaCityPop = z;
+  CityAssValue = z;
+  CityClass = z;
+  CityScore = 500; 
+  deltaCityScore = z;
+  EvalValid = 1;
+  for (x = 0; x < PROBNUM; x++)
+    ProblemVotes[x] = z;
+  for (x = 0; x < 4; x++)
+    ProblemOrder[x] = z;
+}
+
+
+/* comefrom: CityEvaluation */
+GetAssValue(void)
+{
+  QUAD z;
+
+  z = RoadTotal * 5;
+  z += RailTotal * 10;
+  z += PolicePop * 1000;
+  z += FireStPop * 1000;
+  z += HospPop * 400;
+  z += StadiumPop * 3000;
+  z += PortPop * 5000;
+  z += APortPop * 10000;
+  z += CoalPop * 3000;
+  z += NuclearPop * 6000;
+  CityAssValue = z * 1000;
+}
+
+
+/* comefrom: CityEvaluation */
+DoPopNum(void)
+{
+  QUAD OldCityPop;
+
+  OldCityPop = CityPop;
+  CityPop = ((ResPop) + (ComPop * 8L) + (IndPop *8L)) * 20L;
+  if (OldCityPop == -1) {
+    OldCityPop = CityPop;
+  }
+  deltaCityPop = CityPop - OldCityPop;
+
+  CityClass = 0;                       /* village */
+  if (CityPop > 2000)  CityClass++;    /* town */
+  if (CityPop > 10000) CityClass++;    /* city */
+  if (CityPop > 50000) CityClass++;    /* capital */
+  if (CityPop > 100000)        CityClass++;    /* metropolis */
+  if (CityPop > 500000)        CityClass++;    /* megalopolis */
+}
+
+
+/* comefrom: CityEvaluation */
+DoProblems(void)
+{
+  register short x, z;
+  short ThisProb, Max;
+
+  for (z = 0; z < PROBNUM; z++)
+    ProblemTable[z] = 0;
+  ProblemTable[0] = CrimeAverage;              /* Crime */
+  ProblemTable[1] = PolluteAverage;            /* Pollution */
+  ProblemTable[2] = LVAverage * .7;            /* Housing */
+  ProblemTable[3] = CityTax * 10;              /* Taxes */
+  ProblemTable[4] = AverageTrf();              /* Traffic */
+  ProblemTable[5] = GetUnemployment();         /* Unemployment */
+  ProblemTable[6] = GetFire();                 /* Fire */
+  VoteProblems();
+  for (z = 0; z < PROBNUM; z++)
+    ProblemTaken[z] = 0;
+  for (z = 0; z < 4; z++) {
+    Max = 0;
+    for (x = 0; x < 7; x++) {
+      if ((ProblemVotes[x] > Max) && (!ProblemTaken[x])) {
+       ThisProb = x;
+       Max = ProblemVotes[x];
+      }
+    }
+    if (Max) {
+      ProblemTaken[ThisProb] = 1;
+      ProblemOrder[z] = ThisProb;
+    }
+    else {
+      ProblemOrder[z] = 7;
+      ProblemTable[7] = 0;
+    }
+  }
+}
+
+
+/* comefrom: DoProblems */
+VoteProblems(void)
+{
+  register x, z, count;
+
+  for (z = 0; z < PROBNUM; z++)
+    ProblemVotes[z] = 0;
+
+  x = 0;
+  z = 0;
+  count = 0;
+  while ((z < 100) && (count < 600)) {
+    if (Rand(300) < ProblemTable[x]) {
+      ProblemVotes[x]++;
+      z++;
+    }
+    x++;
+    if (x > PROBNUM) x = 0;
+    count++;
+  }
+}
+
+
+/* comefrom: DoProblems */
+AverageTrf(void)
+{
+  QUAD TrfTotal;
+  register short x, y, count;
+
+  TrfTotal = 0;
+  count = 1;
+  for (x=0; x < HWLDX; x++)
+    for (y=0; y < HWLDY; y++)  
+      if (LandValueMem[x][y]) {
+       TrfTotal += TrfDensity[x][y];
+       count++;
+      }
+
+  TrafficAverage = (TrfTotal / count) * 2.4;
+  return(TrafficAverage);
+}
+
+
+/* comefrom: DoProblems */
+GetUnemployment(void)
+{
+  float r;
+  short b;
+
+  b = (ComPop + IndPop) << 3;
+  if (b)
+    r = ((float)ResPop) / b;
+  else
+    return(0);
+
+  b = (r - 1) * 255;
+  if (b > 255)
+    b = 255;
+  return (b);
+}
+
+
+/* comefrom: DoProblems GetScore */
+GetFire(void)
+{
+  short z;
+
+  z = FirePop * 5;
+  if (z > 255)
+    return(255);
+  else
+    return(z);
+}
+
+
+/* comefrom: CityEvaluation */
+GetScore(void)
+{
+  register x, z;
+  short OldCityScore;
+  float SM, TM;
+
+  OldCityScore = CityScore;
+  x = 0;
+  for (z = 0; z < 7; z++)
+    x += ProblemTable[z];      /* add 7 probs */
+
+  x = x / 3;                   /* 7 + 2 average */
+  if (x > 256) x = 256;
+
+  z = (256 - x) * 4;
+  if (z > 1000) z = 1000;
+  if (z < 0 ) z = 0;
+
+  if (ResCap) z = z * .85;
+  if (ComCap) z = z * .85;
+  if (IndCap) z = z * .85;
+  if (RoadEffect < 32)  z = z - (32 - RoadEffect);
+  if (PoliceEffect < 1000) z = z * (.9 + (PoliceEffect / 10000.1));
+  if (FireEffect < 1000) z = z * (.9 + (FireEffect / 10000.1));
+  if (RValve < -1000) z = z * .85;
+  if (CValve < -1000) z = z * .85;
+  if (IValve < -1000) z = z * .85;
+
+  SM = 1.0;
+  if ((CityPop == 0) || (deltaCityPop == 0))
+    SM = 1.0;
+  else if (deltaCityPop == CityPop)
+    SM = 1.0;
+  else if (deltaCityPop > 0)
+    SM = ((float)deltaCityPop/CityPop) + 1.0;
+  else if (deltaCityPop < 0)  
+    SM = .95 + ((float) deltaCityPop/(CityPop - deltaCityPop));
+  z = z * SM;
+  z = z - GetFire();           /* dec score for fires */
+  z = z - (CityTax);
+
+  TM = unPwrdZCnt + PwrdZCnt;  /* dec score for unpowered zones */
+  if (TM) SM = PwrdZCnt / TM;
+  else SM = 1.0;
+  z = z * SM; 
+
+  if (z > 1000) z = 1000;
+  if (z < 0 ) z = 0;
+
+  CityScore = (CityScore + z) / 2; 
+
+  deltaCityScore = CityScore - OldCityScore;
+}
+
+
+/* comefrom: CityEvaluation */
+DoVotes(void)
+{
+  register z;
+
+  CityYes = 0;
+  CityNo = 0;
+  for (z = 0; z < 100; z++) {
+    if (Rand(1000) < CityScore)
+      CityYes++;
+    else
+      CityNo++;
+  }
+}
diff --git a/src/sim/s_fileio.c b/src/sim/s_fileio.c
new file mode 100644 (file)
index 0000000..3768f01
--- /dev/null
@@ -0,0 +1,606 @@
+/* s_fileio.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+#if defined(MSDOS) || defined(OSF1) || defined(IS_INTEL)
+
+#define SWAP_SHORTS(a,b)       _swap_shorts(a,b)
+#define SWAP_LONGS(a,b)                _swap_longs(a,b)
+#define HALF_SWAP_LONGS(a,b)   _half_swap_longs(a,b)
+
+static void
+_swap_shorts(short *buf, int len)
+{
+  int i;
+
+  /* Flip bytes in each short! */
+  for (i = 0; i < len; i++) {  
+    *buf = ((*buf & 0xFF) <<8) | ((*buf &0xFF00) >>8);
+    buf++;
+  }
+}
+
+static void
+_swap_longs(long *buf, int len)
+{
+  int i;
+
+  /* Flip bytes in each long! */
+  for (i = 0; i < len; i++) {  
+    long l = *buf;
+    *buf =
+      ((l & 0x000000ff) << 24) |
+      ((l & 0x0000ff00) << 8) |
+      ((l & 0x00ff0000) >> 8) |
+      ((l & 0xff000000) >> 24);
+    buf++;
+  }
+}
+
+static void
+_half_swap_longs(long *buf, int len)
+{
+  int i;
+
+  /* Flip bytes in each long! */
+  for (i = 0; i < len; i++) {  
+    long l = *buf;
+    *buf =
+      ((l & 0x0000ffff) << 16) |
+      ((l & 0xffff0000) >> 16);
+    buf++;
+  }
+}
+
+#else
+
+#define SWAP_SHORTS(a, b)
+#define SWAP_LONGS(a, b)
+#define HALF_SWAP_LONGS(a, b)
+
+#endif
+
+
+static int
+_load_short(short *buf, int len, FILE *f)
+{
+  if (fread(buf, sizeof(short), len, f) != len)
+     return 0;
+
+  SWAP_SHORTS(buf, len);       /* to intel */
+
+  return 1;
+}
+
+
+static int
+_load_long(long *buf, int len, FILE *f)
+{
+  if (fread(buf, sizeof(long), len, f) != len)
+     return 0;
+
+  SWAP_LONGS(buf, len);        /* to intel */
+
+  return 1;
+}
+
+
+static int
+_save_short(short *buf, int len, FILE *f)
+{
+
+  SWAP_SHORTS(buf, len);       /* to MAC */
+
+  if (fwrite(buf, sizeof(short), len, f) != len)
+     return 0;
+
+  SWAP_SHORTS(buf, len);       /* back to intel */
+
+  return 1;
+}
+
+
+static int
+_save_long(long *buf, int len, FILE *f)
+{
+
+  SWAP_LONGS(buf, len);        /* to MAC */
+
+  if (fwrite(buf, sizeof(long), len, f) != len)
+     return 0;
+
+  SWAP_LONGS(buf, len);        /* back to intel */
+
+  return 1;
+}
+
+
+static
+int 
+_load_file(char *filename, char *dir)
+{
+  FILE *f;
+  char path[512];
+  QUAD size;
+
+#ifdef MSDOS
+  if (dir != NULL) {
+    sprintf(path, "%s\\%s", dir, filename);
+    filename = path;
+  }
+  if ((f = fopen(filename, "rb")) == NULL) {
+    return 0;
+  }
+#else
+  if (dir != NULL) {
+    sprintf(path, "%s/%s", dir, filename);
+    filename = path;
+  }
+  if ((f = fopen(filename, "r")) == NULL) {
+    return (0);
+  }
+#endif
+
+  fseek(f, 0L, SEEK_END);
+  size = ftell(f);
+  fseek(f, 0L, SEEK_SET);
+
+  switch (size) {
+  case 27120: /* Normal city */
+    break;
+
+  case 99120: /* 2x2 city */
+    break;
+
+  case 219120: /* 3x3 city */
+    break;
+
+  default:
+    return (0);
+  }
+
+  if ((_load_short(ResHis, HISTLEN / 2, f) == 0) ||
+      (_load_short(ComHis, HISTLEN / 2, f) == 0) ||
+      (_load_short(IndHis, HISTLEN / 2, f) == 0) ||
+      (_load_short(CrimeHis, HISTLEN / 2, f) == 0) ||
+      (_load_short(PollutionHis, HISTLEN / 2, f) == 0) ||
+      (_load_short(MoneyHis, HISTLEN / 2, f) == 0) ||
+      (_load_short(MiscHis, MISCHISTLEN / 2, f) == 0) ||
+      (_load_short((&Map[0][0]), WORLD_X * WORLD_Y, f) < 0)) {
+
+    /* TODO:  report error */
+    fclose(f);
+    return(0);
+  }
+
+  fclose(f);
+  return(1);
+}
+
+
+int loadFile(char *filename)
+{
+  long l;
+
+  if (_load_file(filename, NULL) == 0)
+    return(0);
+
+  /* total funds is a long.....    MiscHis is array of shorts */
+  /* total funds is being put in the 50th & 51th word of MiscHis */
+  /* find the address, cast the ptr to a lontPtr, take contents */
+
+  l = *(QUAD *)(MiscHis + 50);
+  HALF_SWAP_LONGS(&l, 1);
+  SetFunds(l);
+
+  l = *(QUAD *)(MiscHis + 8);
+  HALF_SWAP_LONGS(&l, 1);
+  CityTime = l;
+
+  autoBulldoze = MiscHis[52];  /* flag for autoBulldoze */
+  autoBudget = MiscHis[53];    /* flag for autoBudget */
+  autoGo = MiscHis[54];                /* flag for autoGo */
+  UserSoundOn = MiscHis[55];   /* flag for the sound on/off */
+  CityTax = MiscHis[56];
+  SimSpeed = MiscHis[57];
+  //  sim_skips = sim_skip = 0;
+  ChangeCensus();
+  MustUpdateOptions = 1;
+
+  /* yayaya */
+
+  l = *(QUAD *)(MiscHis + 58);
+  HALF_SWAP_LONGS(&l, 1);
+  policePercent = l / 65536.0;
+
+  l = *(QUAD *)(MiscHis + 60);
+  HALF_SWAP_LONGS(&l, 1);
+  firePercent = l / 65536.0;
+
+  l = *(QUAD *)(MiscHis + 62);
+  HALF_SWAP_LONGS(&l, 1);
+  roadPercent = l / 65536.0;
+
+  policePercent = (*(QUAD*)(MiscHis + 58)) / 65536.0;  /* and 59 */
+  firePercent = (*(QUAD*)(MiscHis + 60)) / 65536.0;    /* and 61 */
+  roadPercent =(*(QUAD*)(MiscHis + 62)) / 65536.0;     /* and 63 */
+
+  if (CityTime < 0)
+    CityTime = 0;
+  if ((CityTax > 20) || (CityTax < 0))
+    CityTax = 7;
+  if ((SimSpeed < 0) || (SimSpeed > 3))
+    SimSpeed = 3;
+
+  setSpeed(SimSpeed);
+  setSkips(0);
+
+  InitFundingLevel();
+
+  /* set the scenario id to 0 */
+  InitWillStuff();
+  ScenarioID = 0;
+  InitSimLoad = 1;
+  DoInitialEval = 0;
+  DoSimInit();
+  InvalidateEditors();
+  InvalidateMaps();
+
+  return (1);
+}
+
+
+int saveFile(char *filename)
+{
+  long l;
+  FILE *f;
+
+#ifdef MSDOS
+  if ((f = fopen(filename, "wb")) == NULL) {
+#else
+  if ((f = fopen(filename, "w")) == NULL) {
+#endif
+    /* TODO: report error */
+    return(0);
+  }
+
+  /* total funds is a long.....    MiscHis is array of ints */
+  /* total funds is bien put in the 50th & 51th word of MiscHis */
+  /* find the address, cast the ptr to a lontPtr, take contents */
+
+  l = TotalFunds;
+  HALF_SWAP_LONGS(&l, 1);
+  (*(QUAD *)(MiscHis + 50)) = l;
+
+  l = CityTime;
+  HALF_SWAP_LONGS(&l, 1);
+  (*(QUAD *)(MiscHis + 8)) = l;
+
+  MiscHis[52] = autoBulldoze;  /* flag for autoBulldoze */
+  MiscHis[53] = autoBudget;    /* flag for autoBudget */
+  MiscHis[54] = autoGo;                /* flag for autoGo */
+  MiscHis[55] = UserSoundOn;   /* flag for the sound on/off */
+  MiscHis[57] = SimSpeed;
+  MiscHis[56] = CityTax;       /* post release */
+
+  /* yayaya */
+
+  l = (int)(policePercent * 65536);
+  HALF_SWAP_LONGS(&l, 1);
+  (*(QUAD *)(MiscHis + 58)) = l;
+
+  l = (int)(firePercent * 65536);
+  HALF_SWAP_LONGS(&l, 1);
+  (*(QUAD *)(MiscHis + 60)) = l;
+
+  l = (int)(roadPercent * 65536);
+  HALF_SWAP_LONGS(&l, 1);
+  (*(QUAD *)(MiscHis + 62)) = l;
+
+  if ((_save_short(ResHis, HISTLEN / 2, f) == 0) ||
+      (_save_short(ComHis, HISTLEN / 2, f) == 0) ||
+      (_save_short(IndHis, HISTLEN / 2, f) == 0) ||
+      (_save_short(CrimeHis, HISTLEN / 2, f) == 0) ||
+      (_save_short(PollutionHis, HISTLEN / 2, f) == 0) ||
+      (_save_short(MoneyHis, HISTLEN / 2, f) == 0) ||
+      (_save_short(MiscHis, MISCHISTLEN / 2, f) == 0) ||
+      (_save_short((&Map[0][0]), WORLD_X * WORLD_Y, f) < 0)) {
+
+    /* TODO:  report error */
+    fclose(f);
+    return(0);
+  }
+
+  fclose(f);
+  return(1);
+}
+
+
+LoadScenario(short s)
+{
+  char *name, *fname;
+
+  if (CityFileName != NULL) {
+    ckfree(CityFileName);
+    CityFileName = NULL;
+  }
+
+  SetGameLevel(0);
+
+  if ((s < 1) || (s > 8)) s = 1;
+
+  switch (s) {
+  case 1:
+    name = "Dullsville";
+    fname = "snro.111";
+    ScenarioID = 1;
+    CityTime = ((1900 - 1900) * 48) + 2;
+    SetFunds(5000);
+    break;
+  case 2:
+    name = "San Francisco";
+    fname = "snro.222";
+    ScenarioID = 2;
+    CityTime = ((1906 - 1900) * 48) + 2;
+    SetFunds(20000);
+    break;
+  case 3:
+    name = "Hamburg";
+    fname = "snro.333";
+    ScenarioID = 3;
+    CityTime = ((1944 - 1900) * 48) + 2;
+    SetFunds(20000);
+    break;
+  case 4:
+    name = "Bern";
+    fname = "snro.444";
+    ScenarioID = 4;
+    CityTime = ((1965 - 1900) * 48) + 2;
+    SetFunds(20000);
+    break;
+  case 5:
+    name = "Tokyo";
+    fname = "snro.555";
+    ScenarioID = 5;
+    CityTime = ((1957 - 1900) * 48) + 2;
+    SetFunds(20000);
+    break;
+  case 6:
+    name = "Detroit";
+    fname = "snro.666";
+    ScenarioID = 6;
+    CityTime = ((1972 - 1900) * 48) + 2;
+    SetFunds(20000);
+    break;
+  case 7:
+    name = "Boston";
+    fname = "snro.777";
+    ScenarioID = 7;
+    CityTime = ((2010 - 1900) * 48) + 2;
+    SetFunds(20000);
+    break;
+  case 8:
+    name = "Rio de Janeiro";
+    fname = "snro.888";
+    ScenarioID = 8;
+    CityTime = ((2047 - 1900) * 48) + 2;
+    SetFunds(20000);
+    break;
+  }
+
+  setAnyCityName(name);
+  //  sim_skips = sim_skip = 0;
+  InvalidateMaps();
+  InvalidateEditors();
+  setSpeed(3);
+  CityTax = 7;
+  gettimeofday(&start_time, NULL);
+
+  _load_file(fname, ResourceDir);
+
+  InitWillStuff();
+  InitFundingLevel();
+  UpdateFunds();
+  InvalidateEditors();
+  InvalidateMaps();
+  InitSimLoad = 1;
+  DoInitialEval = 0;
+  DoSimInit();
+  DidLoadScenario();
+  Kick();
+}
+
+
+DidLoadScenario()
+{
+  Eval("UIDidLoadScenario");
+}
+
+
+int LoadCity(char *filename)
+{
+  char *cp;
+  char msg[256];
+
+  if (loadFile(filename)) {
+    if (CityFileName != NULL)
+      ckfree(CityFileName);
+    CityFileName = (char *)ckalloc(strlen(filename) + 1);
+    strcpy(CityFileName, filename);
+
+    if (cp = (char *)rindex(filename, '.'))
+      *cp = 0;
+#ifdef MSDOS
+    if (cp = (char *)rindex(filename, '\\'))
+#else
+    if (cp = (char *)rindex(filename, '/'))
+#endif
+      cp++;
+    else
+      cp = filename;
+    filename = (char *)ckalloc(strlen(cp) + 1);
+    strcpy(filename, cp);
+    setCityName(filename);
+    gettimeofday(&start_time, NULL);
+
+    InvalidateMaps();
+    InvalidateEditors();
+    DidLoadCity();
+    return (1);
+  } else {
+    sprintf(msg, "Unable to load a city from the file named \"%s\". %s",
+           filename ? filename : "(null)",
+           errno ? strerror(errno) : "");
+    DidntLoadCity(msg);
+    return (0);
+  }
+}
+
+
+DidLoadCity()
+{
+  Eval("UIDidLoadCity");
+}
+
+
+DidntLoadCity(char *msg)
+{
+  char buf[1024];
+  sprintf(buf, "UIDidntLoadCity {%s}", msg);
+  Eval(buf);
+}
+
+
+SaveCity()
+{
+  char msg[256];
+
+  if (CityFileName == NULL) {
+    DoSaveCityAs();
+  } else {
+    if (saveFile(CityFileName))
+      DidSaveCity();
+    else {
+      sprintf(msg, "Unable to save the city to the file named \"%s\". %s",
+             CityFileName ? CityFileName : "(null)",
+             errno ? strerror(errno) : "");
+      DidntSaveCity(msg);
+    }
+  }
+}
+
+
+DoSaveCityAs()
+{
+  Eval("UISaveCityAs");
+}
+
+
+DidSaveCity()
+{
+  Eval("UIDidSaveCity");
+}
+
+
+DidntSaveCity(char *msg)
+{
+  char buf[1024];
+  sprintf(buf, "UIDidntSaveCity {%s}", msg);
+  Eval(buf);
+}
+
+
+SaveCityAs(char *filename)
+{
+  char msg[256];
+  char *cp;
+
+  if (CityFileName != NULL)
+    ckfree(CityFileName);
+  CityFileName = (char *)ckalloc(strlen(filename) + 1);
+  strcpy(CityFileName, filename);
+
+  if (saveFile(CityFileName)) {
+    if (cp = (char *)rindex(filename, '.'))
+      *cp = 0;
+#ifdef MSDOS
+    if (cp = (char *)rindex(filename, '\\'))
+#else
+    if (cp = (char *)rindex(filename, '/'))
+#endif
+      cp++;
+    else
+      cp = filename;
+    filename = (char *)ckalloc(strlen(cp) + 1);
+    strcpy(filename, cp);
+    setCityName(cp);
+    DidSaveCity();
+  } else {
+    sprintf(msg, "Unable to save the city to the file named \"%s\". %s",
+           CityFileName ? CityFileName : "(null)",
+           errno ? strerror(errno) : "");
+    DidntSaveCity(msg);
+  }
+}
+
+
diff --git a/src/sim/s_gen.c b/src/sim/s_gen.c
new file mode 100644 (file)
index 0000000..448781a
--- /dev/null
@@ -0,0 +1,643 @@
+/* s_gen.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+/* Generate Map */
+
+
+#define WATER_LOW      RIVER /* 2 */
+#define WATER_HIGH     LASTRIVEDGE /* 20 */
+#define WOODS_LOW      TREEBASE /* 21 */
+#define WOODS_HIGH     UNUSED_TRASH2 /* 39 */
+
+
+short XStart, YStart, MapX, MapY;
+short Dir, LastDir;
+int TreeLevel = -1;            /* level for tree creation */
+int LakeLevel = -1;            /* level for lake creation */
+int CurveLevel = -1;           /* level for river curviness */
+int CreateIsland = -1;         /* -1 => 10%, 0 => never, 1 => always */
+
+
+GenerateNewCity(void) 
+{
+  GenerateSomeCity(Rand16());
+}
+
+
+GenerateSomeCity(int r)
+{
+  if (CityFileName != NULL) {
+    ckfree(CityFileName);
+    CityFileName = NULL;
+  }
+
+  gettimeofday(&start_time, NULL);
+
+  GenerateMap(r);
+  ScenarioID = 0;
+  CityTime = 0;
+  InitSimLoad = 2;
+  DoInitialEval = 0;
+
+  InitWillStuff();
+  ResetMapState();
+  ResetEditorState();
+  InvalidateEditors();
+  InvalidateMaps();
+  UpdateFunds();
+  DoSimInit();
+  Eval("UIDidGenerateNewCity");
+  Kick();
+}
+
+
+ERand(short limit)
+{
+  short x, z;
+
+  z = Rand(limit);
+  x = Rand(limit);
+  if (z < x)
+    return (z);
+  return (x);
+}
+
+
+GenerateMap(int r)
+{
+  SeedRand(r);
+
+  if (CreateIsland < 0) {
+    if (Rand(100) < 10) { /* chance that island is generated */
+      MakeIsland();
+      return;
+    }
+  }
+  if (CreateIsland == 1) {
+    MakeNakedIsland();
+  } else {
+    ClearMap();
+  }
+  GetRandStart();
+  if (CurveLevel != 0) {
+    DoRivers();
+  }
+  if (LakeLevel != 0) {
+    MakeLakes();
+  }
+  SmoothRiver();
+  if (TreeLevel != 0) {
+    DoTrees();
+  }
+  RandomlySeedRand();
+}
+
+
+ClearMap(void)
+{
+  register short x, y;
+
+  for (x = 0; x < WORLD_X; x++)
+    for (y = 0; y < WORLD_Y; y++)
+      Map[x][y] = DIRT;
+}
+
+
+ClearUnnatural(void)
+{
+  register short x, y;
+
+  for (x = 0; x < WORLD_X; x++) {
+    for (y = 0; y < WORLD_Y; y++) {
+      if (Map[x][y] > WOODS) {
+       Map[x][y] = DIRT;
+      }
+    }
+  }
+}
+
+
+#define RADIUS 18
+
+MakeNakedIsland()
+{
+  register int x, y;
+
+  for (x = 0; x < WORLD_X; x++)
+    for (y = 0; y < WORLD_Y; y++)
+      Map[x][y] = RIVER;
+  for (x = 5; x < WORLD_X - 5; x++)
+    for (y = 5; y < WORLD_Y - 5; y++)
+      Map[x][y] = DIRT;
+  for (x = 0; x < WORLD_X - 5; x += 2) {
+    MapX = x ;
+    MapY = ERand(RADIUS);
+    BRivPlop();
+    MapY = (WORLD_Y - 10) - ERand(RADIUS);
+    BRivPlop();
+    MapY = 0;
+    SRivPlop();
+    MapY = (WORLD_Y - 6);
+    SRivPlop();
+  }
+  for (y = 0; y < WORLD_Y - 5; y += 2) {
+    MapY = y ;
+    MapX = ERand(RADIUS);
+    BRivPlop();
+    MapX = (WORLD_X - 10) - ERand(RADIUS);
+    BRivPlop();
+    MapX = 0;
+    SRivPlop();
+    MapX = (WORLD_X - 6);
+    SRivPlop();
+  }
+}
+
+
+MakeIsland(void)
+{
+  MakeNakedIsland();
+  SmoothRiver();
+  DoTrees();
+}
+
+
+MakeLakes(void)
+{
+  short Lim1, Lim2, t, z;
+  register short x, y;
+
+  if (LakeLevel < 0) {
+    Lim1 = Rand(10);
+  } else {
+    Lim1 = LakeLevel / 2;
+  }
+  for (t = 0; t < Lim1; t++) {
+    x = Rand(WORLD_X - 21) + 10;
+    y = Rand(WORLD_Y - 20) + 10;
+    Lim2 = Rand(12) + 2;
+    for (z = 0; z < Lim2; z++) {
+      MapX = x - 6 + Rand(12);
+      MapY = y - 6 + Rand(12);
+      if (Rand(4))
+       SRivPlop();
+      else
+       BRivPlop();
+    }
+  }
+}
+
+
+GetRandStart(void)
+{
+  XStart = 40 + Rand(WORLD_X - 80);
+  YStart = 33 + Rand(WORLD_Y - 67);
+  MapX = XStart;
+  MapY = YStart;
+}
+
+
+MoveMap(short dir)
+{
+  static short DirTab[2][8] = { { 0, 1, 1, 1, 0, -1, -1, -1},
+                               {-1,-1, 0, 1, 1,  1,  0, -1} };
+  dir = dir & 7;
+  MapX += DirTab[0][dir];
+  MapY += DirTab[1][dir];
+}
+
+
+TreeSplash(short xloc, short yloc)
+{
+  short dis, dir;
+  register short xoff, yoff, z;
+
+  if (TreeLevel < 0) {
+    dis = Rand(150) + 50;
+  } else {
+    dis = Rand(100 + (TreeLevel * 2)) + 50;
+  }
+  MapX = xloc;
+  MapY = yloc;
+  for (z = 0; z < dis; z++) {
+    dir = Rand(7);
+    MoveMap(dir);
+    if (!(TestBounds(MapX, MapY)))
+      return;
+    if ((Map[MapX][MapY] & LOMASK) == DIRT)
+      Map[MapX][MapY] = WOODS + BLBNBIT;
+  }
+}
+
+
+DoTrees(void)
+{
+  short Amount, x, xloc, yloc;
+
+  if (TreeLevel < 0) {
+    Amount = Rand(100) + 50;
+  } else {
+    Amount = TreeLevel + 3;
+  }
+  for(x = 0; x < Amount; x++) {
+    xloc = Rand(WORLD_X - 1);
+    yloc = Rand(WORLD_Y - 1);
+    TreeSplash(xloc, yloc);
+  }
+  SmoothTrees();
+  SmoothTrees();
+}
+
+
+SmoothRiver(void)
+{
+  static short DX[4] = {-1, 0, 1, 0};
+  static short DY[4] = { 0, 1, 0,-1};
+  static short REdTab[16] = {
+    13+BULLBIT,        13+BULLBIT,     17+BULLBIT,     15+BULLBIT,
+    5+BULLBIT, 2,              19+BULLBIT,     17+BULLBIT,
+    9+BULLBIT, 11+BULLBIT,     2,              13+BULLBIT,
+    7+BULLBIT, 9+BULLBIT,      5+BULLBIT,      2 };
+  short bitindex, z, Xtem, Ytem;
+  register short temp, MapX, MapY;
+
+  for (MapX = 0; MapX < WORLD_X; MapX++) {
+    for (MapY = 0; MapY < WORLD_Y; MapY++) {
+      if (Map[MapX][MapY] == REDGE) {
+       bitindex = 0;
+       for (z = 0; z < 4; z++) {
+         bitindex = bitindex << 1;
+         Xtem = MapX + DX[z];
+         Ytem = MapY + DY[z];
+         if (TestBounds(Xtem, Ytem) &&
+             ((Map[Xtem][Ytem] & LOMASK) != DIRT) &&
+             (((Map[Xtem][Ytem]&LOMASK) < WOODS_LOW) ||
+              ((Map[Xtem][Ytem]&LOMASK) > WOODS_HIGH)))
+             bitindex++;
+       }
+       temp = REdTab[bitindex & 15];
+       if ((temp != RIVER) && (Rand(1)))
+         temp++;
+       Map[MapX][MapY] = temp;
+      }
+    }
+  }
+}
+
+
+IsTree(int cell)
+{
+  if (((cell & LOMASK) >= WOODS_LOW) &&
+      ((cell & LOMASK) <= WOODS_HIGH))
+    return TRUE;
+  return FALSE;
+}
+
+SmoothTrees(void)
+{
+  static short DX[4] = {-1, 0, 1, 0};
+  static short DY[4] = { 0, 1, 0,-1};
+  static short TEdTab[16] = { 0, 0, 0, 34,
+                             0, 0, 36, 35,
+                             0, 32, 0, 33,
+                             30, 31, 29, 37 };
+  short   bitindex, z, Xtem, Ytem;
+  register short temp, MapX, MapY;
+
+  for (MapX = 0; MapX < WORLD_X; MapX++) {
+    for (MapY = 0; MapY < WORLD_Y; MapY++) {
+      if (IsTree(Map[MapX][MapY])) {
+       bitindex = 0;
+       for (z = 0; z < 4; z++) {
+         bitindex = bitindex << 1;
+         Xtem = MapX + DX[z];
+         Ytem = MapY + DY[z];
+         if (TestBounds(Xtem, Ytem) &&
+             IsTree(Map[Xtem][Ytem])) {
+           bitindex++;
+         }
+       }
+       temp = TEdTab[bitindex & 15];
+       if (temp) {
+         if (temp != WOODS)
+           if ((MapX + MapY) & 1)
+             temp = temp - 8;
+         Map[MapX][MapY] = temp + BLBNBIT;
+       }
+       else Map[MapX][MapY] = temp;
+      }
+    }
+  }
+}
+
+
+DoRivers(void)
+{      
+
+  LastDir = Rand(3);
+  Dir = LastDir;
+  DoBRiv();
+  MapX = XStart;
+  MapY = YStart;
+  LastDir = LastDir ^ 4;
+  Dir = LastDir;
+  DoBRiv();    
+  MapX = XStart;
+  MapY = YStart;
+  LastDir = Rand(3);
+  DoSRiv();
+}
+
+
+DoBRiv(void)
+{
+  int r1, r2;
+
+  if (CurveLevel < 0) {
+    r1 = 100;
+    r2 = 200;
+  } else {
+    r1 = CurveLevel + 10;
+    r2 = CurveLevel + 100;
+  }
+
+  while (TestBounds (MapX + 4, MapY + 4)) {
+    BRivPlop();
+    if (Rand(r1) < 10) {
+      Dir = LastDir;
+    } else {
+      if (Rand(r2) > 90) Dir++;
+      if (Rand(r2) > 90) Dir--;
+    }
+    MoveMap(Dir);
+  }
+}
+
+
+DoSRiv(void)
+{
+  int r1, r2;
+
+  if (CurveLevel < 0) {
+    r1 = 100;
+    r2 = 200;
+  } else {
+    r1 = CurveLevel + 10;
+    r2 = CurveLevel + 100;
+  }
+
+  while (TestBounds (MapX + 3, MapY + 3)) {
+    SRivPlop();
+    if (Rand(r1) < 10) {
+      Dir = LastDir;
+    } else {
+      if (Rand(r2) > 90) Dir++;
+      if (Rand(r2) > 90) Dir--;
+    }
+    MoveMap(Dir);
+  }
+}
+
+
+PutOnMap(short Mchar, short Xoff, short Yoff)
+{
+  register short Xloc, Yloc, temp;
+
+  if (Mchar == 0)
+    return;
+  Xloc = MapX + Xoff;
+  Yloc = MapY + Yoff;
+  if (TestBounds(Xloc, Yloc) == FALSE)
+    return;
+  if (temp = Map[Xloc][Yloc]) {
+    temp = temp & LOMASK;
+    if (temp == RIVER)
+      if (Mchar != CHANNEL)
+       return;
+    if (temp == CHANNEL)
+      return;
+  }
+  Map[Xloc][Yloc] = Mchar;     
+}
+
+
+BRivPlop(void)
+{
+  static short BRMatrix[9][9] = {
+    { 0, 0, 0, 3, 3, 3, 0, 0, 0 },
+    { 0, 0, 3, 2, 2, 2, 3, 0, 0 },
+    { 0, 3, 2, 2, 2, 2, 2, 3, 0 },
+    { 3, 2, 2, 2, 2, 2, 2, 2, 3 },
+    { 3, 2, 2, 2, 4, 2, 2, 2, 3 },
+    { 3, 2, 2, 2, 2, 2, 2, 2, 3 },
+    { 0, 3, 2, 2, 2, 2, 2, 3, 0 },
+    { 0, 0, 3, 2, 2, 2, 3, 0, 0 },
+    { 0, 0, 0, 3, 3, 3, 0, 0, 0 } };
+  short x, y;
+
+  for (x = 0; x < 9; x++)
+    for (y = 0; y < 9; y++)
+      PutOnMap(BRMatrix[y][x], x, y);
+}
+
+
+SRivPlop(void)
+{
+  static short SRMatrix[6][6] = {
+    { 0, 0, 3, 3, 0, 0 },
+    { 0, 3, 2, 2, 3, 0 },
+    { 3, 2, 2, 2, 2, 3 },
+    { 3, 2, 2, 2, 2, 3 },
+    { 0, 3, 2, 2, 3, 0 },
+    { 0, 0, 3, 3, 0, 0 } };
+  short x, y;
+
+  for (x = 0; x < 6; x++)
+    for (y = 0; y < 6; y++)
+      PutOnMap(SRMatrix[y][x], x, y);
+}
+
+
+SmoothWater()
+{
+  int x, y;
+
+  for(x = 0; x < WORLD_X; x++) {
+    for(y = 0; y < WORLD_Y; y++) {
+      /* If water: */
+      if (((Map[x][y] & LOMASK) >= WATER_LOW) &&
+         ((Map[x][y] & LOMASK) <= WATER_HIGH)) {
+       if (x > 0) {
+         /* If nearest object is not water: */
+         if (((Map[x - 1][y] & LOMASK) < WATER_LOW) ||
+             ((Map[x - 1][y] & LOMASK) > WATER_HIGH)) {
+           goto edge;
+         }
+       }
+       if (x < (WORLD_X - 1)) {
+         /* If nearest object is not water: */
+         if (((Map[x+1][y]&LOMASK) < WATER_LOW) ||
+             ((Map[x+1][y]&LOMASK) > WATER_HIGH)) {
+           goto edge;
+         }
+       }
+       if (y > 0) {
+         /* If nearest object is not water: */
+         if (((Map[x][y - 1] & LOMASK) < WATER_LOW) ||
+             ((Map[x][y-1]&LOMASK) > WATER_HIGH)) {
+           goto edge;
+         }
+       }
+       if (y < (WORLD_Y - 1)) {
+         /* If nearest object is not water: */
+         if (((Map[x][y + 1] & LOMASK) < WATER_LOW) ||
+             ((Map[x][y + 1] & LOMASK) > WATER_HIGH)) {
+         edge:
+           Map[x][y]=REDGE; /* set river edge */
+           continue;
+         }
+       }
+      }
+    }
+  }
+  for (x = 0; x < WORLD_X; x++) {
+    for (y = 0; y < WORLD_Y; y++) {
+      /* If water which is not a channel: */
+      if (((Map[x][y] & LOMASK) != CHANNEL) &&
+         ((Map[x][y] & LOMASK) >= WATER_LOW) &&
+         ((Map[x][y] & LOMASK) <= WATER_HIGH)) {
+       if (x > 0) {
+         /* If nearest object is not water; */
+         if (((Map[x - 1][y] & LOMASK) < WATER_LOW) ||
+             ((Map[x - 1][y] & LOMASK) > WATER_HIGH)) {
+           continue;
+         }
+       }
+       if (x < (WORLD_X - 1)) {
+         /* If nearest object is not water: */
+         if (((Map[x + 1][y] & LOMASK) < WATER_LOW) ||
+             ((Map[x + 1][y] & LOMASK) > WATER_HIGH)) {
+           continue;
+         }
+       }
+       if (y > 0) {
+         /* If nearest object is not water: */
+         if (((Map[x][y - 1] & LOMASK) < WATER_LOW) ||
+             ((Map[x][y - 1] & LOMASK) > WATER_HIGH)) {
+           continue;
+         }
+       }
+       if (y < (WORLD_Y - 1)) {
+         /* If nearest object is not water: */
+         if (((Map[x][y + 1] & LOMASK) < WATER_LOW) ||
+             ((Map[x][y + 1] & LOMASK) > WATER_HIGH)) {
+           continue;
+         }
+       }
+       Map[x][y] = RIVER; /* make it a river */
+      }
+    }
+  }
+  for (x = 0; x < WORLD_X; x++) {
+    for (y = 0; y < WORLD_Y; y++) {
+      /* If woods: */
+      if (((Map[x][y] & LOMASK) >= WOODS_LOW) &&
+         ((Map[x][y] & LOMASK) <= WOODS_HIGH)) {
+       if (x > 0) {
+         /* If nearest object is water: */
+         if ((Map[x - 1][y] == RIVER) ||
+             (Map[x - 1][y] == CHANNEL)) {
+           Map[x][y] = REDGE; /* make it water's edge */
+           continue;
+         }
+       }
+       if (x < (WORLD_X - 1)) {
+         /* If nearest object is water: */
+         if ((Map[x + 1][y] == RIVER) ||
+             (Map[x + 1][y] == CHANNEL)) {
+           Map[x][y] = REDGE; /* make it water's edge */
+           continue;
+         }
+       }
+       if (y > 0) {
+         /* If nearest object is water: */
+         if ((Map[x][y - 1] == RIVER) ||
+             (Map[x][y - 1] == CHANNEL)) {
+           Map[x][y] = REDGE; /* make it water's edge */
+           continue;
+         }
+       }
+       if (y < (WORLD_Y - 1)) {
+         /* If nearest object is water; */
+         if ((Map[x][y + 1] == RIVER) ||
+             (Map[x][y + 1] == CHANNEL)) {
+           Map[x][y] = REDGE; /* make it water's edge */
+           continue;
+         }
+       }
+      }
+    }
+  }
+}
diff --git a/src/sim/s_init.c b/src/sim/s_init.c
new file mode 100644 (file)
index 0000000..7f26308
--- /dev/null
@@ -0,0 +1,154 @@
+/* s_init.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+/* Initialize Stuff */
+
+
+/* comefrom: loadFile bootUp main doMessage */
+InitWillStuff()
+{
+  register short x, y, z;
+
+  RandomlySeedRand();
+  InitGraphMax();
+  RoadEffect = 32;
+  PoliceEffect = 1000;         /*added*/
+  FireEffect = 1000;
+  CityScore = 500;
+  CityPop = -1;
+  LastCityTime = -1;
+  LastCityYear = -1;
+  LastCityMonth = -1;
+  LastFunds = -1;
+  LastR = LastC = LastI = -999999;
+  OverRide = 0;
+  PendingTool = -1;
+
+  MesNum = 0;
+  MessagePort = 0;
+  RoadFund = 0;
+  PoliceFund = 0;
+  FireFund = 0;
+  UpdateDelayed = 0;
+  ValveFlag = 1;
+
+  DestroyAllSprites();
+
+  DisasterEvent = 0;
+  TaxFlag = 0;
+
+  for (x = 0; x < HWLDX; x++) {
+    for (y = 0; y < HWLDY; y++) {
+      PopDensity[x][y] = 0;
+      TrfDensity[x][y] = 0;
+      PollutionMem[x][y] = 0;
+      LandValueMem[x][y] = 0;
+      CrimeMem[x][y] = 0;
+    }
+  }
+
+  for (x = 0; x < QWX; x++) {
+    for (y = 0; y < QWY; y++) {
+      TerrainMem[x][y] = 0;
+    }
+  }
+
+  for (x = 0; x < SmX; x++) {
+    for (y = 0; y < SmY; y++) {
+      RateOGMem[x][y] = 0;
+      FireRate[x][y] = 0;      
+      ComRate[x][y] = 0;
+      PoliceMap[x][y] = 0;
+      PoliceMapEffect[x][y] = 0;
+      FireRate[x][y] = 0;
+    }
+  }
+
+  ResetLastKeys();
+  DoNewGame();
+  DoUpdateHeads();
+}
+
+
+ResetMapState()
+{
+  SimView *view;
+
+  for (view = sim->map; view != NULL; view = view->next) {
+    view->map_state = ALMAP;
+  }
+}
+
+
+ResetEditorState()
+{
+  SimView *view;
+
+  for (view = sim->editor; view != NULL; view = view->next) {
+    view->tool_state = dozeState;
+    view->tool_state_save = -1;
+  }
+}
+
+
diff --git a/src/sim/s_msg.c b/src/sim/s_msg.c
new file mode 100644 (file)
index 0000000..330f125
--- /dev/null
@@ -0,0 +1,448 @@
+/* s_msg.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+QUAD LastCityPop;
+short LastCategory;
+short LastPicNum;
+short autoGo;
+short HaveLastMessage = 0;
+char LastMessage[256];
+int DoAutoGoto(short x, short y, char *msg);
+int DoShowPicture(short id);
+
+/* comefrom: Simulate */
+SendMessages(void)
+{
+  register z;
+  short PowerPop;
+  float TM;
+
+  if ((ScenarioID) && (ScoreType) && (ScoreWait)) {
+    ScoreWait--;
+    if (!ScoreWait)
+      DoScenarioScore(ScoreType);
+  }
+
+  CheckGrowth();
+
+  TotalZPop = ResZPop + ComZPop + IndZPop;
+  PowerPop = NuclearPop + CoalPop;
+
+  z = CityTime & 63;
+
+  switch(z) {
+
+  case 1:
+    if ((TotalZPop >>2) >= ResZPop)
+      SendMes(1); /* need Res */
+    break;
+  case 5:
+    if ((TotalZPop >>3) >= ComZPop)
+      SendMes(2); /* need Com */
+    break;
+  case 10:
+    if ((TotalZPop >>3) >= IndZPop)
+      SendMes(3); /* need Ind */
+    break;
+  case 14:
+    if ((TotalZPop > 10) && ((TotalZPop <<1) > RoadTotal))
+      SendMes(4);
+    break;
+  case 18:
+    if ((TotalZPop > 50) && (TotalZPop > RailTotal))
+      SendMes(5);
+    break;
+  case 22:
+    if ((TotalZPop > 10) && (PowerPop == 0))
+      SendMes(6); /* need Power */
+    break;
+  case 26:
+    if ((ResPop > 500) && (StadiumPop == 0)) {
+      SendMes(7); /* need Stad */
+      ResCap = 1;
+    }
+    else
+      ResCap = 0;
+    break;
+  case 28:
+    if ((IndPop > 70) && (PortPop == 0)) {
+      SendMes(8);
+      IndCap = 1;
+    }
+    else IndCap = 0;
+    break;
+  case 30:
+    if ((ComPop > 100) && (APortPop == 0)) {
+      SendMes(9);
+      ComCap = 1;
+    }
+    else ComCap = 0;
+    break;
+  case 32:
+    TM = unPwrdZCnt + PwrdZCnt;        /* dec score for unpowered zones */
+    if (TM)  
+      if ((PwrdZCnt / TM) < .7)
+       SendMes(15);
+    break;
+  case 35:
+    if (PolluteAverage > /* 80 */ 60)
+      SendMes(-10);
+    break;
+  case 42:
+    if (CrimeAverage > 100)
+      SendMes(-11);
+    break;
+  case 45:
+    if ((TotalPop > 60) && (FireStPop == 0))
+      SendMes(13);
+    break;
+  case 48:
+    if ((TotalPop > 60) && (PolicePop == 0))
+      SendMes(14);
+    break;
+  case 51:
+    if (CityTax > 12)
+      SendMes(16);
+    break;
+  case 54:
+    if ((RoadEffect < 20) && (RoadTotal > 30))
+      SendMes(17);
+    break;
+  case 57:
+    if ((FireEffect < 700) && (TotalPop > 20))
+      SendMes(18);
+    break;
+  case 60:
+    if ((PoliceEffect < 700) && (TotalPop > 20))
+      SendMes(19);
+    break;
+  case 63:
+    if (TrafficAverage > 60)
+      SendMes(-12);
+    break;
+  }
+}
+
+
+/* comefrom: SendMessages */
+CheckGrowth(void)
+{
+  QUAD ThisCityPop;
+  short z;
+
+  if (!(CityTime & 3)) {
+    z = 0;
+    ThisCityPop = ((ResPop) + (ComPop * 8L) + (IndPop * 8L)) * 20L;
+    if (LastCityPop) {
+      if ((LastCityPop < 2000) && (ThisCityPop >= 2000))       z = 35;
+      if ((LastCityPop < 10000) && (ThisCityPop >= 10000))     z = 36;
+      if ((LastCityPop < 50000L) && (ThisCityPop >= 50000L))   z = 37;
+      if ((LastCityPop < 100000L) && (ThisCityPop >= 100000L)) z = 38;
+      if ((LastCityPop < 500000L) && (ThisCityPop >= 500000L)) z = 39;
+    }
+    if (z)
+      if (z != LastCategory) {
+       SendMes(-z);
+       LastCategory = z;
+      }
+    LastCityPop = ThisCityPop;
+  }
+}
+
+
+/* comefrom: SendMessages */
+DoScenarioScore(int type)
+{
+  short z;
+
+  z = -200;    /* you lose */
+  switch(type) {
+  case 1:      /* Dullsville */
+         if (CityClass >= 4)           z = -100;
+         break;
+  case 2:      /* San Francisco */
+         if (CityClass >= 4)           z = -100;
+         break;
+  case 3:      /* Hamburg */
+         if (CityClass >= 4)           z = -100;
+         break;
+  case 4:      /* Bern */
+         if (TrafficAverage < 80)      z = -100;
+         break;
+  case 5:      /* Tokyo */
+         if (CityScore > 500)          z = -100;
+         break;
+  case 6:      /* Detroit */
+         if (CrimeAverage < 60)        z = -100;
+         break;
+  case 7:      /* Boston */
+         if (CityScore > 500)          z = -100;
+         break;
+  case 8:      /* Rio de Janeiro */
+         if (CityScore > 500)          z = -100;
+         break;
+  }
+  ClearMes();
+  SendMes(z);
+
+  if (z == -200)
+    DoLoseGame();
+}
+
+
+ClearMes(void)
+{
+  MessagePort = 0;
+  MesX = 0;
+  MesY = 0;
+  LastPicNum = 0;
+}
+
+
+/* comefrom: MakeEarthquake MakeFire MakeFire MakeFlood SendMessages 
+            CheckGrowth DoScenarioScore DoPowerScan */
+SendMes(int Mnum)
+{
+  if (Mnum < 0) {
+    if (Mnum != LastPicNum) {
+      MessagePort = Mnum;
+      MesX = 0;
+      MesY = 0;
+      LastPicNum = Mnum;
+      return (1);
+    }
+  } else {
+    if (!(MessagePort)) {
+      MessagePort = Mnum;
+      MesX = 0;
+      MesY = 0;
+      return(1);
+    }
+  }
+  return(0);
+}
+
+
+/* comefrom: DoExplosion DoCopter ExplodeObject */
+void SendMesAt(short Mnum, short x, short y)
+{
+  if (SendMes(Mnum)) {
+    MesX = x;
+    MesY = y;
+  }
+}
+
+
+doMessage(void) 
+{
+  char messageStr[256];
+  short pictId;
+  short firstTime;
+
+  messageStr[0] = 0;
+
+  if (MessagePort) {
+    MesNum = MessagePort;
+    MessagePort = 0;
+    LastMesTime = TickCount();
+    firstTime = 1;
+  } else {
+    firstTime = 0;
+    if (MesNum == 0)  return;
+    if (MesNum < 0) {
+      MesNum = -MesNum;
+      LastMesTime = TickCount();
+    } else if ((TickCount() - LastMesTime) > (60 * 30)) {
+      MesNum = 0;
+      return;
+    }
+  }
+  if (firstTime) {
+    switch ((MesNum < 0) ? -MesNum : MesNum) {
+    case  12:
+      if (Rand(5) == 1) {
+       MakeSound("city", "HonkHonk-Med");
+      } else if (Rand(5) == 1) {
+       MakeSound("city", "HonkHonk-Low");
+      } else if (Rand(5) == 1) {
+       MakeSound("city", "HonkHonk-High");
+      }
+      break;
+    case  11:
+    case  20:
+    case 22:
+    case 23:
+    case 24:
+    case 25:
+    case 26:
+    case 27:
+      MakeSound("city", "Siren");
+      break;
+    case  21:
+      MakeSound("city", "Monster -speed [MonsterSpeed]");
+      break;
+    case 30:
+      MakeSound("city", "Explosion-Low");
+      MakeSound("city", "Siren");
+      break;
+    case  43:
+      MakeSound("city", "Explosion-High");
+      MakeSound("city", "Explosion-Low");
+      MakeSound("city", "Siren");
+      break;
+    case  44:
+      MakeSound("city", "Siren");
+      break;
+    }
+  }
+
+  if (MesNum >= 0) {
+    if (MesNum == 0)
+      return;
+
+    if (MesNum > 60) {
+      MesNum = 0;
+      return;
+    }
+
+    GetIndString(messageStr, 301, MesNum);
+    if (MesX || MesY) {
+      /* TODO: draw goto button */
+    }
+
+    if (autoGo && (MesX || MesY)) {
+      DoAutoGoto(MesX, MesY, messageStr);
+      MesX = 0;
+      MesY = 0;
+    } else {
+      SetMessageField(messageStr);
+    }
+
+  } else { /* picture message */
+    pictId = -(MesNum);
+
+    if (pictId < 43)
+      GetIndString(messageStr, 301, pictId);
+    else
+      messageStr[0] = '\0';
+
+    DoShowPicture(pictId);
+
+    MessagePort = pictId; /* resend text message */
+
+    if (autoGo && (MesX || MesY)) {
+      
+      DoAutoGoto(MesX, MesY, messageStr);
+      MesX = 0;
+      MesY = 0;
+    }
+  }
+}
+
+
+DoAutoGoto(short x, short y, char *msg)
+{
+  char buf[256];
+
+  SetMessageField(msg);
+  sprintf(buf, "UIAutoGoto %d %d", x, y);
+  Eval(buf);
+}
+
+
+SetMessageField(char *str)
+{
+  char buf[256];
+
+  if (!HaveLastMessage ||
+      strcmp(LastMessage, str)) {
+    strcpy(LastMessage, str);
+    HaveLastMessage = 1;
+    sprintf(buf, "UISetMessage {%s}", str);
+    Eval(buf);
+  }
+}
+
+
+DoShowPicture(short id)
+{
+  char buf[256];
+
+  sprintf(buf, "UIShowPicture %d", id);
+  Eval(buf);
+}
+
+
+DoLoseGame()
+{
+  Eval("UILoseGame");
+}
+
+
+DoWinGame()
+{
+  Eval("UIWinGame");
+}
+
+
diff --git a/src/sim/s_power.c b/src/sim/s_power.c
new file mode 100644 (file)
index 0000000..5d309b3
--- /dev/null
@@ -0,0 +1,253 @@
+/* s_power.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+/* Power Scan */
+
+
+int PowerStackNum;
+char PowerStackX[PWRSTKSIZE], PowerStackY[PWRSTKSIZE];
+QUAD MaxPower, NumPower;
+
+
+/* comefrom: TestForCond DoPowerScan TryGo */
+MoveMapSim (short MDir)
+{
+  switch (MDir) {
+  case 0:
+    if (SMapY > 0) {
+      SMapY--;
+      return (TRUE);
+    }
+    if (SMapY < 0)
+      SMapY = 0;
+    return (FALSE);
+  case 1:
+    if (SMapX < (WORLD_X - 1)) {
+      SMapX++;
+      return (TRUE);
+    }
+    if (SMapX > (WORLD_X - 1))
+      SMapX = WORLD_X - 1;
+    return (FALSE);
+  case 2:
+    if (SMapY < (WORLD_Y - 1)) {
+      SMapY++;
+      return (TRUE);
+    }
+    if (SMapY > (WORLD_Y - 1))
+      SMapY = WORLD_Y - 1;
+    return (FALSE);
+  case 3:
+    if (SMapX > 0) {
+      SMapX--;
+      return (TRUE);
+    }
+    if (SMapX < 0)
+      SMapX = 0;
+    return (FALSE);
+  case 4:
+    return (TRUE);
+  }
+  return (FALSE);                              
+}
+
+
+/* inlined -Don */
+#if 0
+/* comefrom: DoPowerScan */
+SetPowerBit(void) 
+{
+  register int PowerWrd;
+
+  /* XXX: assumes 120x100 */
+  PowerWrd = (SMapX >>4) + (SMapY <<3);
+  PowerMap[PowerWrd] |= 1 << (SMapX & 15);
+}
+#endif
+
+
+/* inlined */
+#if 0
+/* comefrom: TestForCond */
+int TestPowerBit(void)
+{
+  register int PowerWrd;
+
+  if ((CChr9 == NUCLEAR) || (CChr9 == POWERPLANT))
+    return(1);
+  /* XXX: assumes 120x100 */
+  PowerWrd = (SMapX >>4) + (SMapY <<3);
+  if (PowerWrd >= PWRMAPSIZE)
+    return(0);
+  return ((PowerMap[PowerWrd] & (1 << (SMapX & 15))) ? 1 : 0);
+}
+#endif
+
+
+/* comefrom: DoPowerScan */
+short TestForCond(short TFDir)
+{      
+  register int xsave, ysave, PowerWrd;
+
+  xsave = SMapX;
+  ysave = SMapY;
+  if (MoveMapSim(TFDir)) {
+    /* TestPowerBit was taking a lot of time so I swapped the & order -Don */
+#if 0
+    if ((Map[SMapX][SMapY] & CONDBIT) &&
+       (!TestPowerBit()))
+#else
+    if ((Map[SMapX][SMapY] & CONDBIT) &&
+       (CChr9 != NUCLEAR) &&
+       (CChr9 != POWERPLANT) &&
+       (
+#if 0
+        (PowerWrd = (SMapX >>4) + (SMapY <<3)),
+#else
+        (PowerWrd = POWERWORD(SMapX, SMapY)),
+#endif
+        ((PowerWrd > PWRMAPSIZE) ||
+         ((PowerMap[PowerWrd] & (1 << (SMapX & 15))) == 0))))
+#endif
+    {
+      SMapX = xsave;
+      SMapY = ysave;
+      return (TRUE);
+    }
+  }
+  SMapX = xsave;
+  SMapY = ysave;
+  return (FALSE);
+}
+
+
+/* comefrom: Simulate SpecialInit InitSimMemory */
+DoPowerScan()
+{      
+  short ADir;
+  register int ConNum, Dir, x;
+
+  for (x = 0; x < PWRMAPSIZE; x++)
+    PowerMap[x] = 0;   /* ClearPowerMem */
+
+  MaxPower = (CoalPop * 700L) + (NuclearPop * 2000L); /* post release */
+  NumPower = 0;
+
+  while (PowerStackNum)        {
+    PullPowerStack();
+    ADir = 4;
+    do {
+      if (++NumPower > MaxPower) {
+       SendMes(40);
+       return;
+      }
+      MoveMapSim(ADir);
+/* inlined -Don */
+#if 0
+      SetPowerBit();
+#else
+#if 1
+      SETPOWERBIT(SMapX, SMapY);
+#else
+      PowerMap[(SMapX >>4) + (SMapY <<3)] |= 1 << (SMapX & 15);
+#endif
+#endif
+      ConNum = 0;
+      Dir = 0;
+      while ((Dir < 4) && (ConNum < 2))        {
+       if (TestForCond(Dir)) {
+         ConNum++;
+         ADir = Dir;
+       }
+       Dir++;
+      }
+      if (ConNum > 1)
+       PushPowerStack();
+    } while (ConNum);
+  }
+}
+
+
+/* comefrom: DoPowerScan DoSPZone */
+PushPowerStack(void) 
+{      
+  if (PowerStackNum < (PWRSTKSIZE - 2)) {
+    PowerStackNum++;
+    PowerStackX[PowerStackNum] = SMapX;
+    PowerStackY[PowerStackNum] = SMapY;
+   }
+}
+
+
+/* comefrom: DoPowerScan */
+PullPowerStack(void)
+{      
+  if (PowerStackNum > 0)  {
+    SMapX = PowerStackX[PowerStackNum];
+    SMapY = PowerStackY[PowerStackNum];
+    PowerStackNum--;
+  }
+}
+
+
diff --git a/src/sim/s_scan.c b/src/sim/s_scan.c
new file mode 100644 (file)
index 0000000..20a7d62
--- /dev/null
@@ -0,0 +1,540 @@
+/* s_scan.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+/* Map Updates */
+
+
+short NewMap;
+short NewMapFlags[NMAPS];
+short CCx, CCy, CCx2, CCy2;
+short PolMaxX, PolMaxY;
+short CrimeMaxX, CrimeMaxY;
+QUAD DonDither = 0;
+
+
+/* comefrom: Simulate SpecialInit */
+FireAnalysis(void)             /* Make firerate map from firestation map  */
+{
+  register x,y;
+
+  SmoothFSMap();
+  SmoothFSMap();
+  SmoothFSMap();
+  for (x = 0; x < SmX; x++)
+    for (y = 0; y < SmY; y++)
+      FireRate[x][y] = FireStMap[x][y];
+
+  NewMapFlags[DYMAP] = NewMapFlags[FIMAP] = 1;
+}
+
+
+/* comefrom: Simulate SpecialInit */
+PopDenScan(void)               /*  sets: PopDensity, , , ComRate  */
+{
+  QUAD Xtot, Ytot, Ztot;
+  register short x, y, z;
+
+  ClrTemArray();
+  Xtot = 0;
+  Ytot = 0;
+  Ztot = 0;
+  for (x = 0; x < WORLD_X; x++)
+    for (y = 0; y < WORLD_Y; y++) {
+      z = Map[x][y];
+      if (z & ZONEBIT) {
+       z = z & LOMASK;
+       SMapX = x;
+       SMapY = y;
+       z = GetPDen(z) <<3;
+       if (z > 254)
+         z = 254;
+       tem[x >>1][y >>1] = z;
+       Xtot += x;
+       Ytot += y;
+       Ztot++;
+      }
+    }
+  DoSmooth();                  /* T1 -> T2 */
+  DoSmooth2();                 /* T2 -> T1 */
+  DoSmooth();                  /* T1 -> T2 */
+
+  for (x = 0; x < HWLDX; x++)
+    for (y = 0; y < HWLDY; y++)
+      PopDensity[x][y] = tem2[x][y] <<1;
+
+  DistIntMarket();             /* set ComRate w/ (/ComMap) */
+
+  if (Ztot) {                  /* Find Center of Mass for City */
+    CCx = Xtot / Ztot;
+    CCy = Ytot / Ztot;
+  } else {
+    CCx = HWLDX;               /* if pop=0 center of Map is CC */
+    CCy = HWLDY;
+  }
+  CCx2 = CCx >>1;
+  CCy2 = CCy >>1;
+  NewMapFlags[DYMAP] = NewMapFlags[PDMAP] = NewMapFlags[RGMAP] = 1;
+}
+
+
+/* comefrom: PopDenScan */
+GetPDen(int Ch9)
+{
+  register int pop;
+
+  if (Ch9 == FREEZ) {
+    pop = DoFreePop(Ch9);
+    return (pop);
+  }
+  if (Ch9 < COMBASE) {
+    pop = RZPop(Ch9);
+    return (pop);
+  }
+  if (Ch9 < INDBASE) {
+    pop = (CZPop(Ch9) <<3);
+    return (pop);
+  }
+  if (Ch9 < PORTBASE) {
+    pop = (IZPop(Ch9) <<3);
+    return (pop);
+  }
+  return (0);
+}
+
+
+/* comefrom: Simulate SpecialInit */
+PTLScan(void)          /* Does pollution, terrain, land value   */
+{
+  QUAD ptot, LVtot;
+  register int x, y, z, dis;
+  int Plevel, LVflag, loc, zx, zy, Mx, My, pnum, LVnum, pmax;
+
+  for (x = 0; x < QWX; x++)
+    for (y = 0; y < QWY; y++)
+      Qtem[x][y] = 0;
+  LVtot = 0;
+  LVnum = 0;
+  for (x = 0; x < HWLDX; x++)
+    for (y = 0; y < HWLDY; y++) {
+      Plevel = 0;
+      LVflag = 0;
+      zx = x <<1;
+      zy = y <<1;
+      for (Mx = zx; Mx <= zx + 1; Mx++)
+       for (My = zy; My <= zy + 1; My++) {
+         if (loc = (Map[Mx][My] & LOMASK)) {
+           if (loc < RUBBLE) {
+             Qtem[x >>1][y >>1] += 15; /* inc terrainMem */
+             continue;
+           }
+           Plevel += GetPValue(loc);
+           if (loc >= ROADBASE)
+             LVflag++;
+         }
+       }
+/* XXX ???
+      if (Plevel < 0)
+       Plevel = 250;
+*/
+      if (Plevel > 255)
+       Plevel = 255;
+      tem[x][y] = Plevel;
+      if (LVflag) {                    /* LandValue Equation */
+       dis = 34 - GetDisCC(x, y);
+       dis = dis <<2;
+       dis += (TerrainMem[x >>1][y >>1] );
+       dis -= (PollutionMem[x][y]);
+       if (CrimeMem[x][y] > 190) dis -= 20;
+       if (dis > 250) dis = 250;
+       if (dis < 1) dis = 1;
+       LandValueMem[x][y] = dis;
+       LVtot += dis;
+       LVnum++;
+      } else
+       LandValueMem[x][y] = 0;
+    }
+
+  if (LVnum)
+    LVAverage = LVtot / LVnum;
+  else
+    LVAverage = 0;
+
+  DoSmooth();
+  DoSmooth2();
+  pmax = 0;
+  pnum = 0;
+  ptot = 0;
+  for (x = 0; x < HWLDX; x++) {
+    for (y = 0; y < HWLDY; y++)  {
+      z = tem[x][y];
+      PollutionMem[x][y] = z;
+      if (z) {                         /*  get pollute average  */
+       pnum++;
+       ptot += z;
+       /* find max pol for monster  */
+       if ((z > pmax) ||
+           ((z == pmax) && (!(Rand16() & 3)))) {
+         pmax = z;
+         PolMaxX = x <<1;
+         PolMaxY = y <<1;
+       }
+      }
+    }
+  }
+  if (pnum)
+    PolluteAverage = ptot / pnum;
+  else
+    PolluteAverage = 0;
+
+  SmoothTerrain();
+
+  NewMapFlags[DYMAP] = NewMapFlags[PLMAP] = NewMapFlags[LVMAP] = 1;
+}
+
+
+/* comefrom: PTLScan */
+GetPValue(int loc)
+{
+  if (loc < POWERBASE) {
+    if (loc >= HTRFBASE) return (/* 25 */ 75); /* heavy traf  */
+    if (loc >= LTRFBASE) return (/* 10 */ 50); /* light traf  */
+    if (loc <  ROADBASE) {
+      if (loc > FIREBASE) return (/* 60 */ 90);
+      /* XXX: Why negative pollution from radiation? */
+      if (loc >= RADTILE) return (/* -40 */ 255);      /* radioactivity  */
+    }
+    return (0);
+  }
+  if (loc <= LASTIND) return (0);
+  if (loc < PORTBASE) return (50);     /* Ind  */
+  if (loc <= LASTPOWERPLANT) return (/* 60 */ 100);    /* prt, aprt, cpp */
+  return (0);
+}
+
+
+/* comefrom: PTLScan DistIntMarket */
+GetDisCC(int x, int y)
+{
+  short xdis, ydis, z;
+
+  if (x > CCx2)
+    xdis = x - CCx2;
+  else
+    xdis = CCx2 - x;
+
+  if (y > CCy2)
+    ydis = y - CCy2;
+  else
+    ydis = CCy2 - y;
+
+  z = (xdis + ydis);
+  if (z > 32)
+    return (32);
+  else
+    return (z);
+}
+
+
+/* comefrom: Simulate SpecialInit */
+CrimeScan(void)
+{
+  short numz;
+  QUAD totz;
+  register short x, y, z;
+  short cmax;
+
+  SmoothPSMap();
+  SmoothPSMap();
+  SmoothPSMap();
+  totz = 0;
+  numz = 0;
+  cmax = 0;
+  for (x = 0; x < HWLDX; x++)
+    for (y = 0; y < HWLDY; y++) {
+      if (z = LandValueMem[x][y]) {
+       ++numz;
+       z = 128 - z;
+       z += PopDensity[x][y];
+       if (z > 300) z = 300;
+       z -= PoliceMap[x >>2][y >>2];
+       if (z > 250) z = 250;
+       if (z < 0) z = 0;
+       CrimeMem[x][y] = z;
+       totz += z;
+       if ((z > cmax) ||
+           ((z == cmax) && (!(Rand16() & 3)))) {
+         cmax = z;
+         CrimeMaxX = x <<1;
+         CrimeMaxY = y <<1;
+       }
+      } else {
+       CrimeMem[x][y] = 0;
+      }
+    }
+  if (numz)
+    CrimeAverage = totz / numz;
+  else
+    CrimeAverage = 0;
+  for (x = 0; x < SmX; x++)
+    for (y = 0; y < SmY; y++)
+      PoliceMapEffect[x][y] = PoliceMap[x][y];
+  NewMapFlags[DYMAP] = NewMapFlags[CRMAP] = NewMapFlags[POMAP] = 1;
+}
+
+
+/* comefrom: PTLScan */
+SmoothTerrain(void)
+{
+  if (DonDither & 1) {
+    register int x, y = 0, z = 0, dir = 1;
+
+    for (x = 0; x < QWX; x++) {
+      for (; y != QWY && y != -1; y += dir) {
+       z += Qtem[(x == 0) ? x : (x - 1)][y] +
+            Qtem[(x == (QWX - 1)) ? x : (x + 1)][y] +
+            Qtem[x][(y == 0) ? (0) : (y - 1)] +
+            Qtem[x][(y == (QWY - 1)) ? y : (y + 1)] +
+            (Qtem[x][y] <<2);
+       TerrainMem[x][y] = (unsigned char)(((unsigned)z) >>3);
+       z &= 0x7;
+      }
+      dir = -dir;
+      y += dir;
+    }
+  } else {
+    register short x,y,z;
+
+    for (x = 0; x < QWX; x++)
+      for (y = 0; y < QWY; y++) {
+       z = 0;
+       if (x > 0) z += Qtem[x - 1][y];
+       if (x < (QWX - 1)) z += Qtem[x + 1][y];
+       if (y > 0) z += Qtem[x][y - 1];
+       if (y < (QWY - 1)) z += Qtem[x][y + 1];
+       TerrainMem[x][y] = (unsigned char)((z >>2) + Qtem[x][y]) >>1;
+      }
+  }
+}
+
+/* comefrom: PopDenScan */
+DoSmooth (void)        /* smooths data in tem[x][y] into tem2[x][y]  */
+{
+  if (DonDither & 2) {
+    register int x, y = 0, z = 0, dir = 1;
+
+    for (x = 0; x < HWLDX; x++) {
+      for (; y != HWLDY && y != -1; y += dir) {
+/*
+       z += tem[(x == 0) ? x : (x - 1)][y] +
+            tem[(x == (HWLDX - 1)) ? x : (x + 1)][y] +
+            tem[x][(y == 0) ? (0) : (y - 1)] +
+            tem[x][(y == (HWLDY - 1)) ? y : (y + 1)] +
+            tem[x][y];
+       tem2[x][y] = (unsigned char)(((unsigned int)z) >>2);
+       z &= 0x3;
+*/
+       z += tem[(x == 0) ? x : (x - 1)][y] +
+            tem[(x == (HWLDX - 1)) ? x : (x + 1)][y] +
+            tem[x][(y == 0) ? (0) : (y - 1)] +
+            tem[x][(y == (HWLDY - 1)) ? y : (y + 1)] +
+            tem[x][y];
+       tem2[x][y] = (unsigned char)(((unsigned int)z) >>2);
+       z &= 3;
+      }
+      dir = -dir;
+      y += dir;
+    }
+  } else {
+    register short x,y,z;
+
+    for (x = 0; x < HWLDX; x++) {
+      for (y = 0; y < HWLDY; y++) {
+       z = 0;
+       if (x > 0) z += tem[x - 1][y];
+       if (x < (HWLDX - 1)) z += tem[x + 1][y];
+       if (y > 0) z += tem[x][y - 1];
+       if (y < (HWLDY - 1)) z += tem[x][y + 1];
+       z = (z + tem[x][y]) >>2;
+       if (z > 255) z = 255;
+       tem2[x][y] = (unsigned char)z;
+      }
+    }
+  }
+}
+
+
+/* comefrom: PopDenScan */
+DoSmooth2 (void)        /* smooths data in tem2[x][y] into tem[x][y]  */
+{
+  if (DonDither & 4) {
+    register int x, y = 0, z = 0, dir = 1;
+
+    for (x = 0; x < HWLDX; x++) {
+      for (; y != HWLDY && y != -1; y += dir) {
+/*
+       z += tem2[(x == 0) ? x : (x - 1)][y] +
+            tem2[(x == (HWLDX - 1)) ? x : (x + 1)][y] +
+            tem2[x][(y == 0) ? (0) : (y - 1)] +
+            tem2[x][(y == (HWLDY - 1)) ? y : (y + 1)] +
+            tem2[x][y];
+       tem[x][y] = (unsigned char)(z >>2);
+       z &= 0x3;
+*/
+       z += tem2[(x == 0) ? x : (x - 1)][y] +
+           tem2[(x == (HWLDX - 1)) ? x : (x + 1)][y] +
+           tem2[x][(y == 0) ? (0) : (y - 1)] +
+           tem2[x][(y == (HWLDY - 1)) ? y : (y + 1)] +
+           tem2[x][y];
+       tem[x][y] = (unsigned char)(((unsigned char)z) >>2);
+       z &= 3;
+      }
+      dir = -dir;
+      y += dir;
+    }
+  } else {
+    register short x,y,z;
+
+    for (x = 0; x < HWLDX; x++) {
+      for (y = 0; y < HWLDY; y++) {
+       z = 0;
+       if (x > 0) z += tem2[x - 1][y];
+       if (x < (HWLDX - 1)) z += tem2[x + 1][y];
+       if (y > 0) z += tem2[x][y - 1];
+       if (y < (HWLDY - 1)) z += tem2[x][y + 1];
+       z = (z + tem2[x][y]) >>2;
+       if (z > 255) z = 255;
+       tem[x][y] = (unsigned char)z;
+      }
+    }
+  }
+}
+
+
+/* comefrom: PopDenScan */
+ClrTemArray(void)
+{
+  register short x, y, z;
+
+  z = 0;
+  for (x = 0; x < HWLDX; x++)
+    for (y = 0; y < HWLDY; y++)
+      tem[x][y] = z;
+}
+
+
+/* comefrom: FireAnalysis */
+SmoothFSMap(void)
+{
+  register short x, y, edge;
+
+  for (x = 0; x < SmX; x++)
+    for (y = 0; y < SmY; y++) {
+      edge = 0;
+      if (x) edge += FireStMap[x - 1][y];
+      if (x < (SmX - 1)) edge += FireStMap[x + 1][y];
+      if (y) edge += FireStMap[x][y - 1];
+      if (y < (SmY - 1)) edge += FireStMap[x][y + 1];
+      edge = (edge >>2) + FireStMap[x][y];
+      STem[x][y] = edge >>1;
+    }
+  for (x = 0; x < SmX; x++)
+    for (y = 0; y < SmY; y++)
+      FireStMap[x][y] = STem[x][y];
+}
+
+
+/* comefrom: CrimeScan */
+SmoothPSMap(void)
+{
+  register x, y, edge;
+
+  for (x = 0; x < SmX; x++)
+    for (y = 0; y < SmY; y++) {
+      edge = 0;
+      if (x) edge += PoliceMap[x - 1][y];
+      if (x < (SmX - 1)) edge += PoliceMap[x + 1][y];
+      if (y) edge += PoliceMap[x][y - 1];
+      if (y < (SmY - 1)) edge += PoliceMap[x][y + 1];
+      edge = (edge >>2) + PoliceMap[x][y];
+      STem[x][y] = edge >>1;
+    }
+  for (x = 0; x < SmX; x++)
+    for (y = 0; y < SmY; y++)
+      PoliceMap[x][y] = STem[x][y];
+}
+
+
+/* comefrom: PopDenScan */
+DistIntMarket(void)
+{
+  register short x, y, z;
+
+  for (x = 0; x < SmX; x++)
+    for (y = 0; y < SmY; y++) {
+      z = GetDisCC(x <<2,y <<2);
+      z = z <<2;
+      z = 64 - z;
+      ComRate[x][y] = z;
+  }
+}
diff --git a/src/sim/s_sim.c b/src/sim/s_sim.c
new file mode 100644 (file)
index 0000000..6f4b0bb
--- /dev/null
@@ -0,0 +1,1240 @@
+/* s_sim.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+/* Simulation */
+
+
+short ValveFlag;
+short CrimeRamp, PolluteRamp ;
+short RValve, CValve, IValve;
+short ResCap, ComCap, IndCap;
+short CashFlow;
+float EMarket = 4.0;
+short DisasterEvent;
+short DisasterWait;
+short ScoreType;
+short ScoreWait;
+short PwrdZCnt;
+short unPwrdZCnt;
+short NewPower; /* post */
+short AvCityTax;
+short Scycle = 0;
+short Fcycle = 0;
+short Spdcycle = 0;
+short DoInitialEval = 0;
+short MeltX, MeltY;
+
+
+/* comefrom: doEditWindow scoreDoer doMapInFront graphDoer doNilEvent */
+SimFrame(void)
+{
+  short i;
+
+  if (SimSpeed == 0)
+    return;
+
+  if (++Spdcycle > 1023)
+    Spdcycle = 0;
+
+  if (SimSpeed == 1 && Spdcycle % 5)
+    return;
+
+  if (SimSpeed == 2 && Spdcycle % 3)
+    return;
+
+  if (++Fcycle > 1023) Fcycle = 0;
+/*  if (InitSimLoad) Fcycle = 0; */
+  Simulate(Fcycle & 15);
+}
+
+
+/* comefrom: SimFrame */
+Simulate(int mod16)
+{
+  static short SpdPwr[4] = { 1,  2,  4,  5 };
+  static short SpdPtl[4] = { 1,  2,  7, 17 };
+  static short SpdCri[4] = { 1,  1,  8, 18 };
+  static short SpdPop[4] = { 1,  1,  9, 19 };
+  static short SpdFir[4] = { 1,  1, 10, 20 };
+  short x;
+
+  x = SimSpeed;
+  if (x > 3) x = 3;
+
+  switch (mod16)  {
+    case 0:
+      if (++Scycle > 1023) Scycle = 0; /* this is cosmic */
+      if (DoInitialEval) {
+       DoInitialEval = 0;
+       CityEvaluation();
+      }
+      CityTime++;
+      AvCityTax += CityTax;            /* post */
+      if (!(Scycle & 1)) SetValves();
+      ClearCensus();
+      break;
+    case 1:
+      MapScan(0, 1 * WORLD_X / 8);
+      break;
+    case 2:
+      MapScan(1 * WORLD_X / 8, 2 * WORLD_X / 8);
+      break;
+    case 3:
+      MapScan(2 * WORLD_X / 8, 3 * WORLD_X / 8);
+      break;
+    case 4:
+      MapScan(3 * WORLD_X / 8, 4 * WORLD_X / 8);
+      break;
+    case 5:
+      MapScan(4 * WORLD_X / 8, 5 * WORLD_X / 8);
+      break;
+    case 6:
+      MapScan(5 * WORLD_X / 8, 6 * WORLD_X / 8);
+      break;
+    case 7:
+      MapScan(6 * WORLD_X / 8, 7 * WORLD_X / 8);
+      break;
+    case 8:
+      MapScan(7 * WORLD_X / 8, WORLD_X);
+      break;
+    case 9:
+      if (!(CityTime % CENSUSRATE)) TakeCensus();
+      if (!(CityTime % (CENSUSRATE * 12))) Take2Census();
+
+      if (!(CityTime % TAXFREQ))  {
+       CollectTax();
+       CityEvaluation();
+      }
+      break;
+    case 10:
+      if (!(Scycle % 5)) DecROGMem();
+      DecTrafficMem();
+      NewMapFlags[TDMAP] = 1;
+      NewMapFlags[RDMAP] = 1;
+      NewMapFlags[ALMAP] = 1;
+      NewMapFlags[REMAP] = 1;
+      NewMapFlags[COMAP] = 1;
+      NewMapFlags[INMAP] = 1;
+      NewMapFlags[DYMAP] = 1;
+      SendMessages();
+      break;
+    case 11:
+      if (!(Scycle % SpdPwr[x])) {
+       DoPowerScan();
+       NewMapFlags[PRMAP] = 1;
+       NewPower = 1; /* post-release change */
+      }
+      break;
+    case 12:
+      if (!(Scycle % SpdPtl[x])) PTLScan();
+      break;
+    case 13:
+      if (!(Scycle % SpdCri[x])) CrimeScan();
+      break;
+    case 14:
+      if (!(Scycle % SpdPop[x])) PopDenScan();
+      break;
+    case 15:
+      if (!(Scycle % SpdFir[x])) FireAnalysis();
+      DoDisasters();   
+      break;
+  }
+}
+
+
+/* comefrom: Simulate */
+DoSimInit(void)
+{
+  Fcycle = 0;
+  Scycle = 0;
+
+  if (InitSimLoad == 2)                        /* if new city    */
+    InitSimMemory();
+
+  if (InitSimLoad == 1)                        /* if city just loaded  */
+    SimLoadInit();
+
+  SetValves();
+  ClearCensus();
+#if 1
+  MapScan(0, WORLD_X); /* XXX are you sure ??? */
+#endif
+  DoPowerScan();
+  NewPower = 1;                /* post rel */
+  PTLScan();
+  CrimeScan();
+  PopDenScan();
+  FireAnalysis();
+  NewMap = 1;
+  doAllGraphs();
+  NewGraph = 1;
+  TotalPop = 1;
+  DoInitialEval = 1;
+}
+
+
+/* comefrom: SimLoadInit */
+DoNilPower(void)
+{
+  register short x, y, z;
+
+  for (x = 0; x < WORLD_X; x++)
+    for (y = 0; y < WORLD_Y; y++) {
+      z = Map[x][y];
+      if (z & ZONEBIT) {
+       SMapX = x;
+       SMapY = y;
+       CChr = z;
+       SetZPower();
+      }
+    }
+}
+
+
+/* comefrom: Simulate */
+DecTrafficMem(void)            /* tends to empty TrfDensity   */
+{
+  register short x, y, z;
+
+  for (x = 0; x < HWLDX; x++)
+    for (y = 0; y < HWLDY; y++)
+      if (z = TrfDensity[x][y]) {
+       if (z > 24) {
+         if (z > 200) TrfDensity[x][y] = z - 34;
+         else TrfDensity[x][y] = z - 24;
+       }
+       else TrfDensity[x][y] = 0;
+      }
+}
+
+
+/* comefrom: Simulate */
+DecROGMem(void)                        /* tends to empty RateOGMem   */
+{
+  register short x, y, z;
+
+  for (x = 0; x < SmX; x++)
+    for (y = 0; y < SmY; y++)  {
+      z = RateOGMem[x][y];
+      if (z == 0) continue;
+      if (z > 0)  {
+       --RateOGMem[x][y];
+       if (z > 200) RateOGMem[x][y] = 200;    /* prevent overflow */
+       continue;
+      }
+      if (z < 0)  {
+       ++RateOGMem[x][y];
+       if (z < -200) RateOGMem[x][y] = -200;
+      }
+    }
+}
+
+
+/* comefrom: DoSimInit */
+InitSimMemory(void)
+{      
+  register short x, z;
+
+  z = 0;
+  SetCommonInits();
+  for (x = 0; x < 240; x++)  {
+    ResHis[x] = z;
+    ComHis[x] = z;
+    IndHis[x] = z;
+    MoneyHis[x] = 128;
+    CrimeHis[x] = z;
+    PollutionHis[x] = z;
+  }
+  CrimeRamp = z;
+  PolluteRamp = z;
+  TotalPop = z;
+  RValve = z;
+  CValve = z;
+  IValve = z;
+  ResCap = z;
+  ComCap = z;
+  IndCap = z;
+
+  EMarket = 6.0;
+  DisasterEvent = 0;
+  ScoreType = 0;
+
+  /* This clears powermem */
+  PowerStackNum = z;           
+  DoPowerScan();
+  NewPower = 1;                /* post rel */  
+
+  InitSimLoad = 0;
+}
+
+
+/* comefrom: DoSimInit */
+SimLoadInit(void)
+{
+  static short DisTab[9] = { 0, 2, 10, 5, 20, 3, 5, 5, 2 * 48};
+  static short ScoreWaitTab[9] = { 0, 30 * 48, 5 * 48, 5 * 48, 10 * 48,
+                                  5 * 48, 10 * 48, 5 * 48, 10 * 48 };
+  register int z;
+
+  z = 0;
+  EMarket = (float)MiscHis[1];
+  ResPop = MiscHis[2];
+  ComPop = MiscHis[3];
+  IndPop = MiscHis[4];
+  RValve = MiscHis[5];
+  CValve = MiscHis[6];
+  IValve = MiscHis[7];
+  CrimeRamp = MiscHis[10];
+  PolluteRamp = MiscHis[11];
+  LVAverage = MiscHis[12];
+  CrimeAverage = MiscHis[13];
+  PolluteAverage = MiscHis[14];
+  GameLevel = MiscHis[15];
+
+  if (CityTime < 0) CityTime = 0;
+  if (!EMarket) EMarket = 4.0;
+  if ((GameLevel > 2) || (GameLevel < 0)) GameLevel = 0;
+  SetGameLevel(GameLevel);
+
+  SetCommonInits();
+
+  CityClass = MiscHis[16];
+  CityScore = MiscHis[17];
+
+  if ((CityClass > 5) || (CityClass < 0)) CityClass = 0;
+  if ((CityScore > 999) || (CityScore < 1)) CityScore = 500;
+
+  ResCap = 0;
+  ComCap = 0;
+  IndCap = 0;
+
+  AvCityTax = (CityTime % 48) * 7;  /* post */
+
+  for (z = 0; z < PWRMAPSIZE; z++)
+    PowerMap[z] = ~0; /* set power Map */
+  DoNilPower();
+
+  if (ScenarioID > 8) ScenarioID = 0;
+
+  if (ScenarioID) {
+    DisasterEvent = ScenarioID;
+    DisasterWait = DisTab[DisasterEvent];
+    ScoreType = DisasterEvent;
+    ScoreWait = ScoreWaitTab[DisasterEvent];
+  } else {
+    DisasterEvent = 0;
+    ScoreType = 0;
+  }
+
+  RoadEffect = 32;
+  PoliceEffect = 1000; /*post*/
+  FireEffect = 1000;
+  InitSimLoad = 0;
+}
+
+
+/* comefrom: InitSimMemory SimLoadInit */
+SetCommonInits(void)
+{
+  EvalInit();
+  RoadEffect = 32;
+  PoliceEffect = 1000;
+  FireEffect = 1000;
+  TaxFlag = 0;
+  TaxFund = 0;
+/*
+  if ((GameLevel > 2) || (GameLevel < 0)) GameLevel = 0;
+  setGameLevel(GameLevel);
+*/
+}
+
+
+/* comefrom: Simulate DoSimInit */
+SetValves(void)
+{
+  static short TaxTable[21] = {
+    200, 150, 120, 100, 80, 50, 30, 0, -10, -40, -100,
+    -150, -200, -250, -300, -350, -400, -450, -500, -550, -600 };
+  float Employment, Migration, Births, LaborBase, IntMarket;
+  float Rratio, Cratio, Iratio, temp;
+  float NormResPop, PjResPop, PjComPop, PjIndPop;
+  register short z;
+
+  MiscHis[1] = (short)EMarket;
+  MiscHis[2] = ResPop;
+  MiscHis[3] = ComPop;
+  MiscHis[4] = IndPop;
+  MiscHis[5] = RValve;
+  MiscHis[6] = CValve;
+  MiscHis[7] = IValve;
+  MiscHis[10] = CrimeRamp;
+  MiscHis[11] = PolluteRamp;
+  MiscHis[12] = LVAverage;
+  MiscHis[13] = CrimeAverage;
+  MiscHis[14] = PolluteAverage;
+  MiscHis[15] = GameLevel;
+  MiscHis[16] = CityClass;
+  MiscHis[17] = CityScore;
+
+  NormResPop = ResPop / 8;
+  LastTotalPop = TotalPop;
+  TotalPop = NormResPop + ComPop + IndPop;
+
+  if (NormResPop) Employment = ((ComHis[1] + IndHis[1]) / NormResPop);
+  else Employment = 1;
+
+  Migration = NormResPop * (Employment - 1);
+  Births = NormResPop * (.02);                         /* Birth Rate  */
+  PjResPop = NormResPop + Migration + Births;  /* Projected Res.Pop  */
+
+  if (temp = (ComHis[1] + IndHis[1])) LaborBase = (ResHis[1] / temp);
+  else LaborBase = 1;
+  if (LaborBase > 1.3) LaborBase = 1.3;
+  if (LaborBase < 0) LaborBase = 0;  /* LB > 1 - .1  */
+
+  for (z = 0; z < 2; z++)
+    temp = ResHis[z] + ComHis[z] + IndHis[z];
+  IntMarket = (NormResPop + ComPop + IndPop) / 3.7;
+
+  PjComPop = IntMarket * LaborBase;                    
+
+  z = GameLevel;                       /* New ExtMarket */
+  temp = 1;
+  switch (z)  {
+  case 0:
+    temp = 1.2;
+    break;
+  case 1:
+    temp = 1.1;
+    break;
+  case 2:
+    temp = .98;
+    break;
+  }
+
+  PjIndPop = IndPop * LaborBase * temp;
+  if (PjIndPop < 5) PjIndPop = 5;
+
+  if (NormResPop) Rratio = (PjResPop / NormResPop); /* projected -vs- actual */
+  else Rratio = 1.3;
+  if (ComPop) Cratio = (PjComPop / ComPop);
+  else Cratio = PjComPop;
+  if (IndPop) Iratio = (PjIndPop / IndPop);
+  else Iratio = PjIndPop;
+
+  if (Rratio > 2) Rratio = 2;
+  if (Cratio > 2) Cratio = 2;
+  if (Iratio > 2) Iratio = 2;
+
+  z = CityTax + GameLevel;
+  if (z > 20) z = 20;
+  Rratio = ((Rratio -1) * 600) + TaxTable[z]; /* global tax/Glevel effects */
+  Cratio = ((Cratio -1) * 600) + TaxTable[z];
+  Iratio = ((Iratio -1) * 600) + TaxTable[z];
+
+  if (Rratio > 0)              /* ratios are velocity changes to valves  */
+    if (RValve <  2000) RValve += Rratio;
+  if (Rratio < 0)
+    if (RValve > -2000) RValve += Rratio;
+  if (Cratio > 0)
+    if (CValve <  1500) CValve += Cratio;
+  if (Cratio < 0)
+    if (CValve > -1500) CValve += Cratio;
+  if (Iratio > 0)
+    if (IValve <  1500) IValve += Iratio;
+  if (Iratio < 0)
+    if (IValve > -1500) IValve += Iratio;
+
+  if (RValve >  2000) RValve =  2000;
+  if (RValve < -2000) RValve = -2000;
+  if (CValve >  1500) CValve =  1500;
+  if (CValve < -1500) CValve = -1500;
+  if (IValve >  1500) IValve =  1500;
+  if (IValve < -1500) IValve = -1500;
+
+  if ((ResCap) && (RValve > 0)) RValve = 0;    /* Stad, Prt, Airprt  */
+  if ((ComCap) && (CValve > 0)) CValve = 0;
+  if ((IndCap) && (IValve > 0)) IValve = 0;
+  ValveFlag = 1;
+}
+
+
+/* comefrom: Simulate DoSimInit */
+ClearCensus(void)
+{
+  register short x, y, z;
+
+  z = 0;
+  PwrdZCnt = z;
+  unPwrdZCnt = z;
+  FirePop = z;
+  RoadTotal = z;
+  RailTotal = z;
+  ResPop = z;
+  ComPop = z;
+  IndPop = z;
+  ResZPop = z;
+  ComZPop = z;
+  IndZPop = z;
+  HospPop = z;
+  ChurchPop = z;
+  PolicePop = z;
+  FireStPop = z;
+  StadiumPop = z;
+  CoalPop = z;
+  NuclearPop = z;
+  PortPop = z;
+  APortPop = z;
+  PowerStackNum = z;           /* Reset before Mapscan */
+  for (x = 0; x < SmX; x++)
+    for (y = 0; y < SmY; y++) {
+      FireStMap[x][y] = z;
+      PoliceMap[x][y] = z;
+    }
+}
+
+
+/* comefrom: Simulate */
+TakeCensus(void)
+{
+  short x;
+
+  /* put census#s in Historical Graphs and scroll data  */
+  ResHisMax = 0;
+  ComHisMax = 0;
+  IndHisMax = 0;
+  for (x = 118; x >= 0; x--)   {
+    if ((ResHis[x + 1] = ResHis[x]) > ResHisMax) ResHisMax = ResHis[x];
+    if ((ComHis[x + 1] = ComHis[x]) > ComHisMax) ComHisMax = ComHis[x];
+    if ((IndHis[x + 1] = IndHis[x]) > IndHisMax) IndHisMax = IndHis[x];
+    CrimeHis[x + 1] = CrimeHis[x];
+    PollutionHis[x + 1] = PollutionHis[x];
+    MoneyHis[x + 1] = MoneyHis[x];
+  }
+
+  Graph10Max = ResHisMax;
+  if (ComHisMax > Graph10Max) Graph10Max = ComHisMax;
+  if (IndHisMax > Graph10Max) Graph10Max = IndHisMax;
+
+  ResHis[0] = ResPop / 8;
+  ComHis[0] = ComPop;
+  IndHis[0] = IndPop;
+
+  CrimeRamp += (CrimeAverage - CrimeRamp) / 4;
+  CrimeHis[0] = CrimeRamp;
+
+  PolluteRamp += (PolluteAverage - PolluteRamp) / 4;
+  PollutionHis[0] = PolluteRamp;
+
+  x = (CashFlow / 20) + 128;   /* scale to 0..255  */
+  if (x < 0) x = 0;
+  if (x > 255) x = 255;
+
+  MoneyHis[0] = x;
+  if (CrimeHis[0] > 255) CrimeHis[0] = 255;
+  if (PollutionHis[0] > 255) PollutionHis[0] = 255;
+
+  ChangeCensus(); /* XXX: if 10 year graph view */
+
+  if (HospPop < (ResPop >>8)) NeedHosp = TRUE;
+  if (HospPop > (ResPop >>8)) NeedHosp = -1;
+  if (HospPop == (ResPop >>8)) NeedHosp = FALSE;
+
+  if (ChurchPop < (ResPop >>8)) NeedChurch = TRUE;
+  if (ChurchPop > (ResPop >>8)) NeedChurch = -1;
+  if (ChurchPop == (ResPop >>8)) NeedChurch = FALSE;
+}
+
+
+/* comefrom: Simulate */
+Take2Census(void)    /* Long Term Graphs */
+{
+  short x;
+
+  Res2HisMax = 0;
+  Com2HisMax = 0;
+  Ind2HisMax = 0;
+  for (x = 238; x >= 120; x--) {
+    if ((ResHis[x + 1] = ResHis[x]) > Res2HisMax) Res2HisMax = ResHis[x];
+    if ((ComHis[x + 1] = ComHis[x]) > Com2HisMax) Com2HisMax = ComHis[x];
+    if ((IndHis[x + 1] = IndHis[x]) > Ind2HisMax) Ind2HisMax = IndHis[x];
+    CrimeHis[x + 1] = CrimeHis[x];
+    PollutionHis[x + 1] = PollutionHis[x];
+    MoneyHis[x + 1] = MoneyHis[x];
+  }
+  Graph120Max = Res2HisMax;
+  if (Com2HisMax > Graph120Max) Graph120Max = Com2HisMax;
+  if (Ind2HisMax > Graph120Max) Graph120Max = Ind2HisMax;
+
+  ResHis[120] = ResPop / 8;
+  ComHis[120] = ComPop;
+  IndHis[120] = IndPop;
+  CrimeHis[120] = CrimeHis[0] ;
+  PollutionHis[120] = PollutionHis[0];
+  MoneyHis[120] = MoneyHis[0];
+  ChangeCensus(); /* XXX: if 120 year graph view */
+}
+
+
+/* comefrom: Simulate */
+CollectTax(void)
+{      
+  static float RLevels[3] = { 0.7, 0.9, 1.2 };
+  static float FLevels[3] = { 1.4, 1.2, 0.8 };
+  short z;
+
+  CashFlow = 0;
+  if (!TaxFlag) { /* if the Tax Port is clear  */
+    /* XXX: do something with z */
+    z = AvCityTax / 48;  /* post */
+    AvCityTax = 0;                     
+    PoliceFund = PolicePop * 100;
+    FireFund   = FireStPop * 100;
+    RoadFund   = (RoadTotal + (RailTotal * 2)) * RLevels[GameLevel];
+    TaxFund = (((QUAD)TotalPop * LVAverage) / 120) *
+             CityTax * FLevels[GameLevel];
+    if (TotalPop) {    /* if there are people to tax  */
+      CashFlow = TaxFund - (PoliceFund + FireFund + RoadFund);
+
+      DoBudget();
+    } else {
+      RoadEffect = 32;
+      PoliceEffect = 1000;
+      FireEffect = 1000;
+    }
+  }
+}
+
+
+UpdateFundEffects(void)
+{
+  if (RoadFund)
+    RoadEffect = (short)(((float)RoadSpend /
+                         (float)RoadFund) * 32.0);
+  else
+    RoadEffect = 32;
+
+  if (PoliceFund)
+    PoliceEffect = (short)(((float)PoliceSpend /
+                           (float)PoliceFund) * 1000.0);
+  else
+    PoliceEffect = 1000;
+
+  if (FireFund)
+    FireEffect = (short)(((float)FireSpend /
+                         (float)FireFund) * 1000.0);
+  else
+    FireEffect = 1000;
+
+  drawCurrPercents();
+}
+
+
+/* comefrom: Simulate DoSimInit */
+MapScan(int x1, int x2)
+{
+  register short x, y;
+
+  for (x = x1; x < x2; x++)  {
+    for (y = 0; y < WORLD_Y; y++) {
+      if (CChr = Map[x][y]) {
+       CChr9 = CChr & LOMASK;  /* Mask off status bits  */
+       if (CChr9 >= FLOOD) {
+         SMapX = x;
+         SMapY = y;
+         if (CChr9 < ROADBASE) {
+           if (CChr9 >= FIREBASE) {
+             FirePop++;
+             if (!(Rand16() & 3)) DoFire();    /* 1 in 4 times */
+             continue;
+           }
+           if (CChr9 < RADTILE)  DoFlood();
+           else DoRadTile();
+           continue;
+         }
+
+         if (NewPower && (CChr & CONDBIT))
+           SetZPower();
+
+         if ((CChr9 >= ROADBASE) &&
+             (CChr9 < POWERBASE)) {
+           DoRoad();
+           continue;
+         }
+
+         if (CChr & ZONEBIT) { /* process Zones */
+           DoZone();
+           continue;
+         }
+
+         if ((CChr9 >= RAILBASE) &&
+             (CChr9 < RESBASE)) {
+           DoRail();
+           continue;
+         }
+         if ((CChr9 >= SOMETINYEXP) &&
+             (CChr9 <= LASTTINYEXP))  /* clear AniRubble */
+           Map[x][y] = RUBBLE + (Rand16() & 3) + BULLBIT;
+       }
+      }
+    }
+  }
+}
+
+
+/* comefrom: MapScan */
+DoRail(void)
+{
+  RailTotal++;
+  GenerateTrain(SMapX, SMapY);
+  if (RoadEffect < 30) /* Deteriorating  Rail  */
+    if (!(Rand16() & 511))
+      if (!(CChr & CONDBIT))
+       if (RoadEffect < (Rand16() & 31)) {
+         if (CChr9 < (RAILBASE + 2))
+           Map[SMapX][SMapY] = RIVER;
+         else
+           Map[SMapX][SMapY] = RUBBLE + (Rand16() & 3) + BULLBIT;
+         return;
+       }
+}
+
+
+/* comefrom: MapScan */
+DoRadTile(void)
+{
+  if (!(Rand16() & 4095)) Map[SMapX][SMapY] = 0; /* Radioactive decay */
+}
+
+
+/* comefrom: MapScan */
+DoRoad(void)
+{
+  register short Density, tden, z;
+  static short DenTab[3] = { ROADBASE, LTRFBASE, HTRFBASE };
+
+  RoadTotal++;
+/*  GenerateBus(SMapX, SMapY); */
+  if (RoadEffect < 30) /* Deteriorating Roads */
+    if (!(Rand16() & 511))
+      if (!(CChr & CONDBIT))
+       if (RoadEffect < (Rand16() & 31)) {
+         if (((CChr9 & 15) < 2) || ((CChr9 & 15) == 15))
+           Map[SMapX][SMapY] = RIVER;
+         else
+           Map[SMapX][SMapY] = RUBBLE + (Rand16() & 3) + BULLBIT;
+         return;
+       }
+
+  if (!(CChr & BURNBIT)) { /* If Bridge */
+    RoadTotal += 4;                    
+    if (DoBridge())  return;
+  }
+  if (CChr9 < LTRFBASE) tden = 0;
+  else if (CChr9 < HTRFBASE) tden = 1;
+  else {
+    RoadTotal++;
+    tden = 2;
+  }
+
+  Density = (TrfDensity[SMapX >>1][SMapY >>1]) >>6;  /* Set Traf Density  */
+  if (Density > 1) Density--;
+  if (tden != Density) { /* tden 0..2   */
+    z = ((CChr9 - ROADBASE) & 15) + DenTab[Density];
+    z += CChr & (ALLBITS - ANIMBIT);
+    if (Density) z += ANIMBIT;
+    Map[SMapX][SMapY] = z;
+  }
+}
+
+
+/* comefrom: MapScan */
+DoBridge(void)
+{
+  static short HDx[7] = { -2,  2, -2, -1,  0,  1,  2 };
+  static short HDy[7] = { -1, -1,  0,  0,  0,  0,  0 };
+  static short HBRTAB[7] = {
+    HBRDG1 | BULLBIT, HBRDG3 | BULLBIT, HBRDG0 | BULLBIT,
+    RIVER, BRWH | BULLBIT, RIVER, HBRDG2 | BULLBIT };
+  static short HBRTAB2[7] = {
+    RIVER, RIVER, HBRIDGE | BULLBIT, HBRIDGE | BULLBIT, HBRIDGE | BULLBIT,
+    HBRIDGE | BULLBIT, HBRIDGE | BULLBIT };
+  static short VDx[7] = {  0,  1,  0,  0,  0,  0,  1 };
+  static short VDy[7] = { -2, -2, -1,  0,  1,  2,  2 };
+  static short VBRTAB[7] = {
+    VBRDG0 | BULLBIT, VBRDG1 | BULLBIT, RIVER, BRWV | BULLBIT,
+    RIVER, VBRDG2 | BULLBIT, VBRDG3 | BULLBIT };
+  static short VBRTAB2[7] = {
+    VBRIDGE | BULLBIT, RIVER, VBRIDGE | BULLBIT, VBRIDGE | BULLBIT,
+    VBRIDGE | BULLBIT, VBRIDGE | BULLBIT, RIVER };
+  register z, x, y, MPtem;
+
+  if (CChr9 == BRWV) { /*  Vertical bridge close */
+    if ((!(Rand16() & 3)) &&
+       (GetBoatDis() > 340))
+      for (z = 0; z < 7; z++) { /* Close  */
+       x = SMapX + VDx[z];
+       y = SMapY + VDy[z];
+       if (TestBounds(x, y))
+         if ((Map[x][y] & LOMASK) == (VBRTAB[z] & LOMASK))
+           Map[x][y] = VBRTAB2[z];
+      }
+    return (TRUE);
+  }
+  if (CChr9 == BRWH) { /*  Horizontal bridge close  */
+    if ((!(Rand16() & 3)) &&
+       (GetBoatDis() > 340))
+      for (z = 0; z < 7; z++) { /* Close  */
+       x = SMapX + HDx[z];
+       y = SMapY + HDy[z];
+       if (TestBounds(x, y))
+         if ((Map[x][y] & LOMASK) == (HBRTAB[z] & LOMASK))
+           Map[x][y] = HBRTAB2[z];
+      }
+    return (TRUE);
+  }
+
+  if ((GetBoatDis() < 300) || (!(Rand16() & 7))) {
+    if (CChr9 & 1) {
+      if (SMapX < (WORLD_X - 1))
+       if (Map[SMapX + 1][SMapY] == CHANNEL) { /* Vertical open */
+         for (z = 0; z < 7; z++) {
+           x = SMapX + VDx[z];
+           y = SMapY + VDy[z];
+           if (TestBounds(x, y))  {
+             MPtem = Map[x][y];
+             if ((MPtem == CHANNEL) ||
+                 ((MPtem & 15) == (VBRTAB2[z] & 15)))
+               Map[x][y] = VBRTAB[z];
+           }
+         }
+         return (TRUE);
+       }
+      return (FALSE);
+    } else {
+      if (SMapY > 0)
+       if (Map[SMapX][SMapY - 1] == CHANNEL) { /* Horizontal open  */
+         for (z = 0; z < 7; z++) {
+           x = SMapX + HDx[z];
+           y = SMapY + HDy[z];
+           if (TestBounds(x, y)) {
+             MPtem = Map[x][y];
+             if (((MPtem & 15) == (HBRTAB2[z] & 15)) ||
+                 (MPtem == CHANNEL))
+               Map[x][y] = HBRTAB[z];
+           }
+         }
+         return (TRUE);
+       }
+      return (FALSE);
+    }
+  }
+  return (FALSE);
+}
+
+
+int
+GetBoatDis(void)
+{
+  register int dist, mx, my, dx, dy;
+  SimSprite *sprite;
+
+  dist = 99999;
+  mx = (SMapX <<4) + 8;
+  my = (SMapY <<4) + 8;
+
+  for (sprite = sim->sprite; sprite != NULL; sprite = sprite->next) {
+    if ((sprite->type == SHI) &&
+       (sprite->frame != 0)) {
+      if ((dx = sprite->x + sprite->x_hot - mx) < 0) dx = -dx;
+      if ((dy = sprite->y + sprite->y_hot - my) < 0) dy = -dy;
+      dx += dy;
+      if (dx < dist) dist = dx;
+    }
+  }
+  return (dist);
+}
+
+
+/* comefrom: MapScan */
+DoFire(void)
+{
+  static short DX[4] = { -1,  0,  1,  0 };
+  static short DY[4] = {  0, -1,  0,  1 };
+  register short z, Xtem, Ytem, Rate, c;
+
+  for (z = 0; z < 4; z++) {
+    if (!(Rand16() & 7)) {
+      Xtem = SMapX + DX[z];
+      Ytem = SMapY + DY[z];
+      if (TestBounds(Xtem, Ytem)) {
+       c = Map[Xtem][Ytem];
+       if (c & BURNBIT) {
+         if (c & ZONEBIT) {
+           FireZone(Xtem, Ytem, c);
+           if ((c & LOMASK) > IZB)  { /*  Explode  */
+             MakeExplosionAt((Xtem <<4) + 8, (Ytem <<4) + 8);
+           }
+         }
+         Map[Xtem][Ytem] = FIRE + (Rand16() & 3) + ANIMBIT;
+       }
+      }
+    }
+  }
+  z = FireRate[SMapX >>3][SMapY >>3];
+  Rate = 10;
+  if (z) {
+    Rate = 3;
+    if (z > 20) Rate = 2;
+    if (z > 100) Rate = 1;
+  }
+  if (!Rand(Rate))
+    Map[SMapX][SMapY] = RUBBLE + (Rand16() & 3) + BULLBIT;
+}
+
+
+/* comefrom: DoFire MakeFlood */
+FireZone(int Xloc, int Yloc, int ch)
+{
+  register short Xtem, Ytem;
+  short x, y, XYmax;
+
+  RateOGMem[Xloc >>3][Yloc >>3] -= 20;
+
+  ch = ch & LOMASK;
+  if (ch < PORTBASE)
+    XYmax = 2;
+  else
+    if (ch == AIRPORT)
+      XYmax = 5;
+    else
+      XYmax = 4;
+
+  for (x = -1; x < XYmax; x++)
+    for (y = -1; y < XYmax; y++) {
+      Xtem = Xloc + x;
+      Ytem = Yloc + y;
+      if ((Xtem < 0) || (Xtem > (WORLD_X - 1)) ||
+         (Ytem < 0) || (Ytem > (WORLD_Y - 1)))
+       continue;
+      if ((short)(Map[Xtem][Ytem] & LOMASK) >= ROADBASE) /* post release */
+       Map[Xtem][Ytem] |= BULLBIT;
+    }
+}
+
+
+/* comefrom: DoSPZone DoHospChur */
+RepairZone(short ZCent, short zsize)
+{
+  short cnt;
+  register short x, y, ThCh;
+
+  zsize--;
+  cnt = 0;
+  for (y = -1; y < zsize; y++)
+    for (x = -1; x < zsize; x++) {
+      int xx = SMapX + x;
+      int yy = SMapY + y;
+      cnt++;
+      if (TestBounds(xx, yy)) {
+       ThCh = Map[xx][yy];
+       if (ThCh & ZONEBIT) continue;
+       if (ThCh & ANIMBIT) continue;
+       ThCh = ThCh & LOMASK;
+       if ((ThCh < RUBBLE) || (ThCh >= ROADBASE)) {
+         Map[xx][yy] = ZCent - 3 - zsize + cnt + CONDBIT + BURNBIT;
+       }
+      }
+    }
+}
+
+
+/* comefrom: DoZone */
+DoSPZone(short PwrOn)
+{
+  static short MltdwnTab[3] = { 30000, 20000, 10000 };  /* simadj */
+  register z;
+
+  switch (CChr9) {
+
+  case POWERPLANT:
+    CoalPop++;
+    if (!(CityTime & 7))
+      RepairZone(POWERPLANT, 4); /* post */
+    PushPowerStack();
+    CoalSmoke(SMapX, SMapY);
+    return;
+
+  case NUCLEAR:
+    if (!NoDisasters && !Rand(MltdwnTab[GameLevel])) {
+      DoMeltdown(SMapX, SMapY);
+      return;
+    }
+    NuclearPop++;
+    if (!(CityTime & 7))
+      RepairZone(NUCLEAR, 4); /* post */
+    PushPowerStack();
+    return;
+
+  case FIRESTATION:
+    FireStPop++;
+    if (!(CityTime & 7))
+      RepairZone(FIRESTATION, 3); /* post */
+
+    if (PwrOn)
+      z = FireEffect;                  /* if powered get effect  */
+    else
+      z = FireEffect >>1;              /* from the funding ratio  */
+
+    if (!FindPRoad())
+      z = z >>1;                       /* post FD's need roads  */
+
+    FireStMap[SMapX >>3][SMapY >>3] += z;
+    return;
+
+  case POLICESTATION:
+    PolicePop++;
+    if (!(CityTime & 7))
+      RepairZone(POLICESTATION, 3); /* post */
+
+    if (PwrOn)
+      z = PoliceEffect;
+    else
+      z = PoliceEffect >>1;
+
+    if (!FindPRoad())
+      z = z >>1; /* post PD's need roads */
+
+    PoliceMap[SMapX >>3][SMapY >>3] += z;
+    return;
+
+  case STADIUM:
+    StadiumPop++;
+    if (!(CityTime & 15))
+      RepairZone(STADIUM, 4);
+    if (PwrOn)
+      if (!((CityTime + SMapX + SMapY) & 31)) {        /* post release */
+       DrawStadium(FULLSTADIUM);
+       Map[SMapX + 1][SMapY] = FOOTBALLGAME1 + ANIMBIT;
+       Map[SMapX + 1][SMapY + 1] = FOOTBALLGAME2 + ANIMBIT;
+      }
+    return;
+
+ case FULLSTADIUM:
+    StadiumPop++;
+    if (!((CityTime + SMapX + SMapY) & 7))     /* post release */
+      DrawStadium(STADIUM);
+    return;
+
+ case AIRPORT:
+    APortPop++;
+    if (!(CityTime & 7))
+      RepairZone(AIRPORT, 6);
+
+    if (PwrOn) { /* post */
+      if ((Map[SMapX + 1][SMapY - 1] & LOMASK) == RADAR)
+       Map[SMapX + 1][SMapY - 1] = RADAR + ANIMBIT + CONDBIT + BURNBIT;
+    } else
+      Map[SMapX + 1][SMapY - 1] = RADAR + CONDBIT + BURNBIT;
+
+    if (PwrOn)
+      DoAirport();
+    return;
+
+ case PORT:
+    PortPop++;
+    if ((CityTime & 15) == 0) {
+      RepairZone(PORT, 4);
+    }
+    if (PwrOn &&
+       (GetSprite(SHI) == NULL)) {
+      GenerateShip();
+    }
+    return;
+  }
+}
+
+
+/* comefrom: DoSPZone */
+DrawStadium(int z)
+{
+  register int x, y;
+
+  z = z - 5;
+  for (y = (SMapY - 1); y < (SMapY + 3); y++)
+    for (x = (SMapX - 1); x < (SMapX + 3); x++)
+      Map[x][y] = (z++) | BNCNBIT;
+  Map[SMapX][SMapY] |= ZONEBIT | PWRBIT;
+}
+
+
+/* comefrom: DoSPZone */
+DoAirport(void)
+{
+  if (!(Rand(5))) {
+    GeneratePlane(SMapX, SMapY);
+    return;
+  }
+  if (!(Rand(12)))
+    GenerateCopter(SMapX, SMapY);
+}
+
+
+/* comefrom: DoSPZone */
+CoalSmoke(int mx, int my)
+{
+  static short SmTb[4] = { COALSMOKE1, COALSMOKE2, COALSMOKE3, COALSMOKE4 };
+  static short dx[4] = {  1,  2,  1,  2 };
+  static short dy[4] = { -1, -1,  0,  0 };
+  register short x;
+
+  for (x = 0; x < 4; x++)
+    Map[mx + dx[x]][my + dy[x]] =
+      SmTb[x] | ANIMBIT | CONDBIT | PWRBIT | BURNBIT;
+}
+
+
+/* comefrom: DoSPZone MakeMeltdown */
+DoMeltdown(int SX, int SY)
+{
+  register x, y, z, t;
+
+  MeltX = SX; MeltY = SY;
+
+  MakeExplosion(SX - 1, SY - 1);
+  MakeExplosion(SX - 1, SY + 2);
+  MakeExplosion(SX + 2, SY - 1);
+  MakeExplosion(SX + 2, SY + 2);
+
+  for (x = (SX - 1); x < (SX + 3); x++)
+    for (y = (SY - 1); y < (SY + 3); y++)
+      Map[x][y] = FIRE + (Rand16() & 3) + ANIMBIT;
+
+  for (z = 0; z < 200; z++)  {
+    x = SX - 20 + Rand(40);
+    y = SY - 15 + Rand(30);
+    if ((x < 0) || (x >= WORLD_X) ||
+       (y < 0) || (y >= WORLD_Y))
+      continue;
+    t = Map[x][y];
+    if (t & ZONEBIT)
+      continue;
+    if ((t & BURNBIT) || (t == 0))
+      Map[x][y] = RADTILE;
+  }
+
+  ClearMes();
+  SendMesAt(-43, SX, SY);
+}
+
+
+#define RANDOM_RANGE 0xffff
+
+short
+Rand(short range)
+{
+  int maxMultiple, rnum;
+
+  range++;
+  maxMultiple = RANDOM_RANGE / range;
+  maxMultiple *= range;
+  while ((rnum = Rand16()) >= maxMultiple)
+    continue;
+  return (rnum % range);
+}
+
+
+int
+Rand16(void)
+{
+  return (sim_rand());
+}
+
+
+int
+Rand16Signed(void)
+{
+  int i = sim_rand();
+
+  if (i > 32767) {
+    i = 32767 - i;
+  }
+  return (i);
+}
+
+
+RandomlySeedRand()
+{
+  struct timeval time;
+
+  gettimeofday(&time, NULL);
+
+  SeedRand(time.tv_usec ^ time.tv_sec ^ sim_rand());
+}
+
+
+SeedRand(int seed)
+{
+  sim_srand(seed);
+}
diff --git a/src/sim/s_traf.c b/src/sim/s_traf.c
new file mode 100644 (file)
index 0000000..37f1d45
--- /dev/null
@@ -0,0 +1,330 @@
+/* s_traf.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+/* Traffic Generation */
+
+
+#define MAXDIS 30
+
+short PosStackN, SMapXStack[MAXDIS+1], SMapYStack[MAXDIS+1];
+short LDir;
+short Zsource;
+short TrafMaxX, TrafMaxY;
+
+
+/* comefrom: DoIndustrial DoCommercial DoResidential */
+MakeTraf(int Zt)
+{
+  short xtem, ytem;
+
+  xtem = SMapX;
+  ytem = SMapY;
+  Zsource = Zt;
+  PosStackN = 0;
+
+#if 0
+  if ((!Rand(2)) && FindPTele()) {
+/* printf("Telecommute!\n"); */
+    return (TRUE);
+  }
+#endif
+
+  if (FindPRoad()) {           /* look for road on zone perimeter */
+    if (TryDrive()) {          /* attempt to drive somewhere */
+      SetTrafMem();            /* if sucessful, inc trafdensity */
+      SMapX = xtem;
+      SMapY = ytem;
+      return (TRUE);           /* traffic passed */
+    }
+    SMapX = xtem;
+    SMapY = ytem;
+    return (FALSE);            /* traffic failed */
+  }
+  else return (-1);            /* no road found */
+}
+
+
+/* comefrom: MakeTraf */
+SetTrafMem(void)
+{
+  register short x, z;
+
+  for (x = PosStackN; x > 0; x--) {
+    PullPos();
+    if (TestBounds(SMapX, SMapY)) {
+      z = Map[SMapX][SMapY] & LOMASK;
+      if ((z >= ROADBASE) && (z < POWERBASE)) {
+       SimSprite *sprite;
+
+       /* check for rail */
+       z = TrfDensity[SMapX >>1][SMapY >>1];
+       z += 50;
+       if ((z > 240) &&
+           (!Rand(5))) {
+         z = 240;
+         TrafMaxX = SMapX <<4;
+         TrafMaxY = SMapY <<4;
+         if (((sprite = GetSprite(COP)) != NULL) &&
+             (sprite->control == -1)) {
+           sprite->dest_x = TrafMaxX;
+           sprite->dest_y = TrafMaxY;
+         }
+       }
+       TrfDensity[SMapX >>1][SMapY >>1] = z;
+      }
+    }
+  }
+}
+
+
+/* comefrom: TryGo */
+PushPos(void)
+{
+  PosStackN++;
+  SMapXStack[PosStackN] = SMapX;
+  SMapYStack[PosStackN] = SMapY;
+}
+
+
+/* comefrom: SetTrafMem */
+PullPos(void)
+{
+  SMapX = SMapXStack[PosStackN];
+  SMapY = SMapYStack[PosStackN];
+  PosStackN--;
+}
+
+
+/* comefrom: DoSPZone MakeTraf */
+FindPRoad(void)                /* look for road on edges of zone   */
+{
+  static short PerimX[12] = {-1, 0, 1, 2, 2, 2, 1, 0,-1,-2,-2,-2};
+  static short PerimY[12] = {-2,-2,-2,-1, 0, 1, 2, 2, 2, 1, 0,-1};
+  register short tx, ty, z;
+
+  for (z = 0; z < 12; z++) {
+         tx = SMapX + PerimX[z];
+         ty = SMapY + PerimY[z];
+         if (TestBounds(tx, ty)) {
+                 if (RoadTest(Map[tx][ty])) {
+                         SMapX = tx;
+                         SMapY = ty;
+                         return (TRUE);
+                 }
+         }
+  }
+  return (FALSE);
+}
+
+
+FindPTele(void)                /* look for telecommunication on edges of zone */
+{
+  static short PerimX[12] = {-1, 0, 1, 2, 2, 2, 1, 0,-1,-2,-2,-2};
+  static short PerimY[12] = {-2,-2,-2,-1, 0, 1, 2, 2, 2, 1, 0,-1};
+  register short tx, ty, z, tile;
+
+  for (z = 0; z < 12; z++) {
+         tx = SMapX + PerimX[z];
+         ty = SMapY + PerimY[z];
+         if (TestBounds(tx, ty)) {
+                 tile = Map[tx][ty] & LOMASK;
+                 if ((tile >= TELEBASE) && (tile <= TELELAST)) {
+                         return (TRUE);
+                 }
+         }
+  }
+  return (FALSE);
+}
+
+
+/* comefrom: MakeTraf */
+TryDrive(void)
+{
+  short z;
+
+  LDir = 5;
+  for (z = 0; z < MAXDIS; z++) {       /* Maximum distance to try */
+    if (TryGo(z)) {                    /* if it got a road */
+      if (DriveDone())                 /* if destination is reached */
+       return (TRUE);                  /* pass */
+    } else {
+      if (PosStackN) {                 /* deadend , backup */
+       PosStackN--;
+       z += 3;
+      }
+      else return (FALSE);             /* give up at start  */ 
+    }
+  }
+  return (FALSE);                      /* gone maxdis */
+}
+
+
+/* comefrom: TryDrive */
+TryGo(int z)
+{
+  short x, rdir, realdir;
+
+#if 0
+  rdir = Rand(3); /* XXX: Heaviest user of Rand */
+#else
+  rdir = Rand16() & 3;
+#endif
+  for (x = rdir; x < (rdir + 4); x++) {        /* for the 4 directions */
+    realdir = x & 3;
+    if (realdir == LDir) continue;     /* skip last direction */
+    if (RoadTest(GetFromMap(realdir))) {
+      MoveMapSim(realdir);
+      LDir = (realdir + 2) & 3;
+      if (z & 1)                       /* save pos every other move */
+       PushPos();
+      return (TRUE);
+    }
+  }
+  return (FALSE);
+}
+
+
+/* comefrom: TryGo DriveDone */
+GetFromMap(int x)
+{
+  switch (x) {
+  case 0:
+    if (SMapY > 0)
+      return (Map[SMapX][SMapY - 1] & LOMASK);
+    return (FALSE);
+  case 1:
+    if (SMapX < (WORLD_X - 1))
+      return (Map[SMapX + 1][SMapY] & LOMASK);
+    return (FALSE);
+  case 2:
+    if (SMapY < (WORLD_Y - 1))
+      return (Map[SMapX][SMapY + 1] & LOMASK);
+    return (FALSE);
+  case 3:
+    if (SMapX > 0)
+      return (Map[SMapX - 1][SMapY] & LOMASK);
+    return (FALSE);
+  default: 
+    return (FALSE);
+  }
+}
+
+
+/* comefrom: TryDrive */
+DriveDone(void)
+{
+  static short TARGL[3] = {COMBASE, LHTHR, LHTHR};
+  static short TARGH[3] = {NUCLEAR, PORT, COMBASE};    /* for destinations */
+  register short x, z, l, h;
+
+/* unwound -Don */
+#if 0
+  for (x = 0; x < 4; x++) {    /* R>C C>I I>R  */
+    z = GetFromMap(x);
+    if ((z >= TARGL[Zsource]) && (z <= TARGH[Zsource]))
+      return (TRUE);
+  }
+#else
+  l = TARGL[Zsource];
+  h = TARGH[Zsource];
+
+  if (SMapY > 0) {
+    z = Map[SMapX][SMapY - 1] & LOMASK;
+    if ((z >= l) && (z <= h))
+      return (TRUE);
+  }
+  if (SMapX < (WORLD_X - 1)) {
+    z = Map[SMapX + 1][SMapY] & LOMASK;
+    if ((z >= l) && (z <= h))
+      return (TRUE);
+  }
+  if (SMapY < (WORLD_Y - 1)) {
+    z = Map[SMapX][SMapY + 1] & LOMASK;
+    if ((z >= l) && (z <= h))
+      return (TRUE);
+  }
+  if (SMapX > 0) {
+    z = Map[SMapX - 1][SMapY] & LOMASK;
+    if ((z >= l) && (z <= h))
+      return (TRUE);
+  }
+#endif
+
+  return (FALSE);
+}
+
+
+/* comefrom: TryGo FindPRoad */
+RoadTest(int x)
+{
+  x = x & LOMASK;
+  if (x < ROADBASE)
+    return (FALSE);
+  if (x > LASTRAIL)
+    return (FALSE);
+  if ((x >= POWERBASE) && (x < RAILHPOWERV))
+    return (FALSE);
+  return (TRUE);
+}
+
diff --git a/src/sim/s_zone.c b/src/sim/s_zone.c
new file mode 100644 (file)
index 0000000..ab9f3d7
--- /dev/null
@@ -0,0 +1,659 @@
+/* s_zone.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+/* Zone Stuff */
+
+
+DoZone(void)
+{
+  short ZonePwrFlg;
+
+  ZonePwrFlg = SetZPower();    /* Set Power Bit in Map from PowerMap */
+  if (ZonePwrFlg) PwrdZCnt++;
+  else unPwrdZCnt++;
+
+  if (CChr9 > PORTBASE) {      /* do Special Zones  */
+    DoSPZone(ZonePwrFlg);
+    return;
+  }
+  if (CChr9 < HOSPITAL) {      
+    DoResidential(ZonePwrFlg);
+    return;
+  }
+  if (CChr9 < COMBASE) {
+    DoHospChur();
+    return;
+  }
+  if (CChr9 < INDBASE)  {
+    DoCommercial(ZonePwrFlg);
+    return;
+  }
+  DoIndustrial(ZonePwrFlg);
+  return;
+}
+
+
+DoHospChur(void)
+{
+  if (CChr9 == HOSPITAL) {
+    HospPop++;
+    if (!(CityTime & 15)) RepairZone (HOSPITAL, 3); /*post*/
+    if (NeedHosp == -1)
+      if (!Rand(20))
+       ZonePlop(RESBASE);
+  }
+  if (CChr9 == CHURCH) {
+    ChurchPop++;
+    if (!(CityTime & 15)) RepairZone (CHURCH, 3); /*post*/
+    if (NeedChurch == -1)
+      if (!Rand(20))
+       ZonePlop(RESBASE);
+  }
+}
+
+
+#define T 1
+#define F 0
+#define ASCBIT (ANIMBIT | CONDBIT | BURNBIT)
+#define REGBIT (CONDBIT | BURNBIT)
+
+SetSmoke(int ZonePower)
+{
+  static short AniThis[8] = {    T,    F,    T,    T,    F,    F,    T,    T };
+  static short DX1[8]    = {   -1,    0,    1,    0,    0,    0,    0,    1 };
+  static short DY1[8]    = {   -1,    0,   -1,   -1,    0,    0,   -1,   -1 };
+  static short DX2[8]    = {   -1,    0,    1,    1,    0,    0,    1,    1 };
+  static short DY2[8]    = {   -1,    0,    0,   -1,    0,    0,   -1,    0 };
+  static short AniTabA[8] = {    0,    0,   32,   40,    0,    0,   48,   56 };
+  static short AniTabB[8] = {    0,    0,   36,   44,    0,    0,   52,   60 };
+  static short AniTabC[8] = { IND1,    0, IND2, IND4,    0,    0, IND6, IND8 };
+  static short AniTabD[8] = { IND1,    0, IND3, IND5,    0,    0, IND7, IND9 };
+  register short z;
+
+  if (CChr9 < IZB) return;
+  z = (CChr9 - IZB) >>3;
+  z = z & 7;
+  if (AniThis[z]) {
+    int xx = SMapX + DX1[z];
+    int yy = SMapY + DY1[z];
+    if (TestBounds(xx, yy)) {
+      if (ZonePower) {
+       if ((Map[xx][yy] & LOMASK) == AniTabC[z]) {
+         Map[xx][yy] =
+           ASCBIT | (SMOKEBASE + AniTabA[z]);
+         Map[xx][yy] =
+           ASCBIT | (SMOKEBASE + AniTabB[z]);
+       }
+      } else {
+       if ((Map[xx][yy] & LOMASK) > AniTabC[z]) {
+         Map[xx][yy] =
+           REGBIT | AniTabC[z];
+         Map[xx][yy] =
+           REGBIT | AniTabD[z];
+       }
+      }
+    }
+  }
+}
+
+
+DoIndustrial(int ZonePwrFlg)
+{
+  short tpop, zscore, TrfGood;
+
+  IndZPop++;
+  SetSmoke(ZonePwrFlg);
+  tpop = IZPop(CChr9);
+  IndPop += tpop;
+  if (tpop > Rand(5)) TrfGood = MakeTraf(2);
+  else TrfGood = TRUE;
+
+  if (TrfGood == -1) {
+    DoIndOut(tpop, Rand16() & 1);
+    return;
+  }
+
+  if (!(Rand16() & 7)) {
+    zscore = IValve + EvalInd(TrfGood);
+    if (!ZonePwrFlg) zscore = -500;
+    if ((zscore > -350) &&
+       (((short)(zscore - 26380)) > ((short)Rand16Signed()))) {
+      DoIndIn(tpop, Rand16() & 1);
+      return;
+    }
+    if ((zscore < 350) &&
+       (((short)(zscore + 26380)) < ((short)Rand16Signed())))
+      DoIndOut(tpop, Rand16() & 1);
+  }
+}
+
+
+DoCommercial(int ZonePwrFlg)
+{
+  register short tpop, TrfGood;
+  short zscore, locvalve,value;
+
+  ComZPop++;
+  tpop = CZPop(CChr9);
+  ComPop += tpop;
+  if (tpop > Rand(5)) TrfGood = MakeTraf(1);
+  else TrfGood = TRUE;
+
+  if (TrfGood == -1) {
+    value = GetCRVal();
+    DoComOut(tpop, value);
+    return;
+  }
+
+  if (!(Rand16() & 7)) {
+    locvalve = EvalCom(TrfGood);
+    zscore = CValve + locvalve;
+    if (!ZonePwrFlg) zscore = -500;
+
+    if (TrfGood &&
+       (zscore > -350) &&
+       (((short)(zscore - 26380)) > ((short)Rand16Signed()))) {
+      value = GetCRVal();
+      DoComIn(tpop, value);
+      return;
+    }
+    if ((zscore < 350) &&
+       (((short)(zscore + 26380)) < ((short)Rand16Signed()))) {
+      value = GetCRVal();
+      DoComOut(tpop, value);
+    }
+  }
+}
+
+
+DoResidential(int ZonePwrFlg)
+{
+  short tpop, zscore, locvalve, value, TrfGood;
+
+  ResZPop++;
+  if (CChr9 == FREEZ) tpop = DoFreePop();
+  else tpop = RZPop(CChr9);
+
+  ResPop += tpop;
+  if (tpop > Rand(35)) TrfGood = MakeTraf(0);
+  else TrfGood = TRUE;
+
+  if (TrfGood == -1) {
+    value = GetCRVal();
+    DoResOut(tpop, value);
+    return;
+  }
+
+  if ((CChr9 == FREEZ) || (!(Rand16() & 7))) {
+    locvalve = EvalRes(TrfGood);
+    zscore = RValve + locvalve;
+    if (!ZonePwrFlg) zscore = -500;
+
+    if ((zscore > -350) &&
+       (((short)(zscore - 26380)) > ((short)Rand16Signed()))) {
+      if ((!tpop) && (!(Rand16() & 3))) {
+       MakeHosp();
+       return;
+      }
+      value = GetCRVal();
+      DoResIn(tpop, value);
+      return;
+    }
+    if ((zscore < 350) &&
+       (((short)(zscore + 26380)) < ((short)Rand16Signed()))) {
+           value = GetCRVal();
+           DoResOut(tpop, value);
+    }
+  }
+}
+
+
+MakeHosp(void)
+{
+  if (NeedHosp > 0) {
+    ZonePlop(HOSPITAL - 4);
+    NeedHosp = FALSE;
+    return;
+  }
+  if (NeedChurch > 0) {
+    ZonePlop(CHURCH - 4);
+    NeedChurch = FALSE;
+    return;
+  }
+}
+
+
+GetCRVal(void)
+{
+  register short LVal;
+
+  LVal = LandValueMem[SMapX >>1][SMapY >>1];
+  LVal -= PollutionMem[SMapX >>1][SMapY >>1];
+  if (LVal < 30) return (0);
+  if (LVal < 80) return (1);
+  if (LVal < 150) return (2);
+  return (3);
+}
+
+
+DoResIn(int pop, int value)
+{
+  short z;
+
+  z = PollutionMem[SMapX >>1][SMapY >>1];
+  if (z > 128) return;
+
+  if (CChr9 == FREEZ) {
+    if (pop < 8) {
+      BuildHouse(value);
+      IncROG(1);
+      return;
+    }
+    if (PopDensity[SMapX >>1][SMapY >>1] > 64) {
+      ResPlop(0, value);
+      IncROG(8);
+      return;
+    }
+    return;
+  }
+  if (pop < 40) {
+    ResPlop((pop / 8) - 1, value);
+    IncROG(8);
+  }
+}
+
+
+DoComIn(int pop, int value)
+{
+  register short z;
+
+  z = LandValueMem[SMapX >>1][SMapY >>1];
+  z = z >>5;
+  if (pop > z) return;
+
+  if (pop < 5) {
+    ComPlop(pop, value);
+    IncROG(8);
+  }
+}
+
+
+DoIndIn(int pop, int value)
+{
+  if (pop < 4) {
+    IndPlop(pop, value);
+    IncROG(8);
+  }
+}
+
+
+IncROG(int amount)
+{
+  RateOGMem[SMapX>>3][SMapY>>3] += amount<<2;
+}
+
+
+DoResOut(int pop, int value)
+{
+  static short Brdr[9] = {0,3,6,1,4,7,2,5,8};
+  register short x, y, loc, z;
+
+  if (!pop) return;
+  if (pop > 16) {
+    ResPlop(((pop - 24) / 8), value);
+    IncROG(-8);
+    return;
+  }
+  if (pop == 16) {
+    IncROG(-8);
+    Map[SMapX][SMapY] = (FREEZ | BLBNCNBIT | ZONEBIT);
+    for (x = SMapX - 1; x <= SMapX + 1; x++)
+      for (y = SMapY - 1; y <= SMapY + 1; y++)
+       if (x >= 0 && x < WORLD_X &&
+           y >= 0 && y < WORLD_Y) {
+         if ((Map[x][y] & LOMASK) != FREEZ)
+           Map[x][y] = LHTHR + value +
+             Rand(2) + BLBNCNBIT;
+       }
+  }
+  if (pop < 16) {
+    IncROG(-1);
+    z = 0;
+    for (x = SMapX - 1; x <= SMapX + 1; x++)
+      for (y = SMapY - 1; y <= SMapY + 1; y++) {
+       if (x >= 0 && x < WORLD_X &&
+           y >= 0 && y < WORLD_Y) {
+         loc = Map[x][y] & LOMASK;
+         if ((loc >= LHTHR) && (loc <= HHTHR)) {
+           Map[x][y] = Brdr[z] +
+             BLBNCNBIT + FREEZ - 4;
+           return;
+         }
+       }
+       z++;
+      }
+  }
+}
+
+
+DoComOut(int pop, int value)
+{
+  if (pop > 1) {
+    ComPlop(pop - 2, value);
+    IncROG(-8);
+    return;
+  }
+  if (pop == 1) {
+    ZonePlop(COMBASE);
+    IncROG(-8);
+  }
+}
+
+
+DoIndOut(int pop, int value)
+{
+  if (pop > 1) {
+    IndPlop(pop - 2, value);
+    IncROG(-8);
+    return;
+  }
+  if (pop == 1) {
+    ZonePlop(INDCLR - 4);
+    IncROG(-8);
+  }
+}
+
+
+RZPop(int Ch9)
+{
+  short CzDen;
+
+  CzDen = (((Ch9 - RZB) / 9) % 4);
+  return ((CzDen * 8) + 16);
+}
+
+
+CZPop(int Ch9)
+{
+  short CzDen;
+
+  if (Ch9 == COMCLR) return (0);
+  CzDen = (((Ch9 - CZB) / 9) % 5) + 1;
+  return (CzDen);
+}
+
+
+IZPop(int Ch9)
+{
+  short CzDen;
+
+  if (Ch9 == INDCLR) return (0);
+  CzDen = (((Ch9 - IZB) / 9) % 4) + 1;
+  return (CzDen);
+}
+
+
+BuildHouse(int value)
+{
+  short z, score, hscore, BestLoc;
+  static short ZeX[9] = { 0,-1, 0, 1,-1, 1,-1, 0, 1};
+  static short ZeY[9] = { 0,-1,-1,-1, 0, 0, 1, 1, 1};
+
+  BestLoc = 0;
+  hscore = 0;
+  for (z = 1; z < 9; z++) {
+    int xx = SMapX + ZeX[z];
+    int yy = SMapY + ZeY[z];
+    if (TestBounds(xx, yy)) {
+      score = EvalLot(xx, yy);
+      if (score != 0) {
+       if (score > hscore) {
+         hscore = score;
+         BestLoc = z;
+       }
+       if ((score == hscore) && !(Rand16() & 7))
+         BestLoc = z;
+      }
+    }
+  }
+  if (BestLoc) {
+    int xx = SMapX + ZeX[BestLoc];
+    int yy = SMapY + ZeY[BestLoc];
+    if (TestBounds(xx, yy)) {
+      Map[xx][yy] = HOUSE + BLBNCNBIT + Rand(2) + (value * 3);
+    }
+  }
+}
+
+
+ResPlop (int Den, int Value)
+{
+  short base;
+
+  base = (((Value * 4) + Den) * 9) + RZB - 4;
+  ZonePlop(base);
+}
+
+
+ComPlop (int Den, int Value)
+{
+  short base;
+       
+  base = (((Value * 5) + Den) * 9) + CZB - 4;
+  ZonePlop(base);
+}
+
+
+IndPlop (int Den, int Value)
+{
+  short base;
+       
+  base = (((Value * 4) + Den) * 9) + (IZB - 4);
+  ZonePlop (base);
+}
+
+
+EvalLot (int x, int y)
+{
+  short z, score;
+  static short DX[4] = { 0, 1, 0,-1};
+  static short DY[4] = {-1, 0, 1, 0};
+
+  /* test for clear lot */
+  z = Map[x][y] & LOMASK;
+  if (z && ((z < RESBASE) || (z > RESBASE + 8)))
+    return (-1);
+  score = 1;
+  for (z = 0; z < 4; z++) {
+    int xx = x + DX[z];
+    int yy = y + DY[z];
+    if (TestBounds(xx, yy) && 
+       Map[xx][yy] &&
+       ((Map[xx][yy] & LOMASK) <= LASTROAD)) {
+      score++;         /* look for road */
+    }
+  }
+  return (score);
+}
+
+
+ZonePlop (int base)
+{
+  short z, x;
+  static short Zx[9] = {-1, 0, 1,-1, 0, 1,-1, 0, 1};
+  static short Zy[9] = {-1,-1,-1, 0, 0, 0, 1, 1, 1};
+
+  for (z = 0; z < 9; z++) {            /* check for fire  */
+    int xx = SMapX + Zx[z];
+    int yy = SMapY + Zy[z];
+    if (TestBounds(xx, yy)) {
+      x = Map[xx][yy] & LOMASK;
+      if ((x >= FLOOD) && (x < ROADBASE)) return (FALSE);
+    }
+  }
+  for (z = 0; z < 9; z++) {
+    int xx = SMapX + Zx[z];
+    int yy = SMapY + Zy[z];
+    if (TestBounds(xx, yy)) {
+      Map[xx][yy] = base + BNCNBIT;
+    }
+  base++;
+  }
+  CChr = Map[SMapX][SMapY];
+  SetZPower();
+  Map[SMapX][SMapY] |= ZONEBIT + BULLBIT;
+}
+
+
+EvalRes (int traf)
+{
+  register short Value;
+
+  if (traf < 0) return (-3000);
+
+  Value = LandValueMem[SMapX >>1][SMapY >>1];
+  Value -= PollutionMem[SMapX >>1][SMapY >>1];
+
+  if (Value < 0) Value = 0;            /* Cap at 0 */
+  else Value = Value <<5;
+
+  if (Value > 6000) Value = 6000;      /* Cap at 6000 */
+
+  Value = Value - 3000;
+  return (Value);
+}
+
+
+EvalCom (int traf)
+{
+  short Value;
+
+  if (traf < 0) return (-3000);
+  Value = ComRate[SMapX >>3][SMapY >>3];
+  return (Value);
+}
+
+
+EvalInd (int traf)
+{
+  if (traf < 0) return (-1000);
+  return (0);
+}
+
+
+DoFreePop (void)
+{
+  short count;
+  register short loc, x, y;
+
+  count = 0;
+  for (x = SMapX - 1; x <= SMapX + 1; x++)
+    for (y = SMapY - 1; y <= SMapY + 1; y++) {
+      if (x >= 0 && x < WORLD_X &&
+         y >= 0 && y < WORLD_Y) {
+       loc = Map[x][y] & LOMASK;
+       if ((loc >= LHTHR) && (loc <= HHTHR))
+         count++;
+      }
+    }
+  return (count);
+}
+
+
+SetZPower(void)                /* set bit in MapWord depending on powermap  */
+{
+  short z;
+  QUAD PowerWrd;
+
+/* TestPowerBit was taking alot of time so I inlined it. -Don */
+
+#if 0
+
+  if (z = TestPowerBit())
+    Map[SMapX][SMapY] = CChr | PWRBIT;
+  else
+    Map[SMapX][SMapY] = CChr & (~PWRBIT);
+  return (z);
+
+#else
+
+  if ((CChr9 == NUCLEAR) ||
+      (CChr9 == POWERPLANT) ||
+      (
+#if 1
+       (PowerWrd = POWERWORD(SMapX, SMapY)),
+#else
+       (PowerWrd = (SMapX >>4) + (SMapY <<3)),
+#endif
+       ((PowerWrd < PWRMAPSIZE) &&
+       (PowerMap[PowerWrd] & (1 << (SMapX & 15)))))) {
+    Map[SMapX][SMapY] = CChr | PWRBIT;
+    return 1;
+  } else {
+    Map[SMapX][SMapY] = CChr & (~PWRBIT);
+    return 0;
+  }
+
+#endif
+}
diff --git a/src/sim/sim.c b/src/sim/sim.c
new file mode 100644 (file)
index 0000000..79a7817
--- /dev/null
@@ -0,0 +1,834 @@
+/* sim.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+/* Sim City */
+
+char *MicropolisVersion = "4.0";
+Sim *sim = NULL;
+int sim_loops = 0;
+int sim_delay = 50;
+int sim_skips = 0;
+int sim_skip = 0;
+int sim_paused = 0;
+int sim_paused_speed = 3;
+int sim_tty = 0;
+#ifdef CAM
+int sim_just_cam = 0;
+#endif
+int heat_steps = 0;
+int heat_flow = -7;
+int heat_rule = 0;
+int heat_wrap = 3;
+struct timeval start_time, now_time, beat_time, last_now_time;
+char *CityFileName = NULL;
+int Startup = 0;
+int StartupGameLevel = 0;
+char *StartupName = NULL;
+int WireMode = 0;
+int MultiPlayerMode = 0;
+int SugarMode = 0;
+int TilesAnimated = 0;
+int DoAnimation = 1;
+int DoMessages = 1;
+int DoNotices = 1;
+char *Displays = NULL;
+char *FirstDisplay = NULL;
+int ExitReturn = 0;
+
+
+sim_exit(int val)
+{
+  tkMustExit = 1;
+  ExitReturn = val;
+}
+
+
+sim_really_exit(int val)
+{
+  DoStopMicropolis();
+
+  exit(val);
+}
+
+
+#define COPY(FROM, TO) \
+  TO = ckalloc(strlen(FROM) + 1); \
+  strcpy(TO, FROM);
+
+
+#define TESTDIR(DIR, NAME) \
+  if ((stat(DIR, &statbuf) == -1) || \
+      !(S_ISDIR(statbuf.st_mode))) { \
+    fprintf(stderr, \
+           "Can't find the directory \"%s\"!\n", DIR); \
+    fprintf(stderr, \
+           "The environment variable \"%s\" should name a directory.\n", \
+           NAME); \
+    lost = 1; \
+  }
+
+
+void
+env_init(void)
+{
+  char dir[256];
+  char *s;
+  struct stat statbuf;
+  int lost = 0;
+
+  if ((s = getenv("SIMHOME")) == NULL) {
+    s = ".";
+  }
+  COPY(s, HomeDir);
+  TESTDIR(HomeDir, "$SIMHOME");
+
+  sprintf(dir, "%s/res/", HomeDir);
+  COPY(dir, ResourceDir);
+  TESTDIR(ResourceDir, "$SIMHOME/res");
+
+  { extern char *TCL_Library, *TK_Library;
+    TCL_Library = TK_Library = ResourceDir;
+  }
+
+  if (lost) {
+    fprintf(stderr,
+           "Please check the environment or reinstall Micropolis and try again! Sorry!\n");
+    sim_exit(1); // Just sets tkMustExit and ExitReturn
+    return;
+  }
+
+  gettimeofday(&now_time, NULL);
+  last_now_time = now_time;
+}
+
+
+void
+sim_init(void)
+{
+  gettimeofday(&start_time, NULL);
+  gettimeofday(&beat_time, NULL);
+
+  signal_init();
+
+  UserSoundOn = 1;
+  MustUpdateOptions = 1;
+  HaveLastMessage = 0;
+  ScenarioID = 0;
+  StartingYear = 1900;
+  tileSynch = 0x01;
+  sim_skips = sim_skip = 0;
+  autoGo = 1;
+  CityTax = 7;
+  CityTime = 50;
+  NoDisasters = 0;
+  PunishCnt = 0;
+  autoBulldoze = 1;
+  autoBudget = 1;
+  MesNum = 0;
+  LastMesTime = 0;
+  flagBlink = 1;
+  SimSpeed = 3;
+  ChangeEval();
+  MessagePort = 0;
+  MesX = 0;
+  MesY = 0;
+  sim_paused = 0;
+  sim_loops = 0;
+  InitSimLoad = 2;
+  tkMustExit = 0;
+  ExitReturn = 0;
+
+  InitializeSound();
+  initMapArrays();
+  initGraphs();
+  InitFundingLevel();
+#if 0
+  loadObjectData();
+#endif
+  setUpMapProcs();
+  StopEarthquake();
+  ResetMapState();
+  ResetEditorState();
+  ClearMap();
+  InitWillStuff();
+  SetFunds(5000);
+  SetGameLevelFunds(StartupGameLevel);
+  setSpeed(0);
+  setSkips(0);
+}
+
+
+int triedToBailOnce = 0;
+
+void
+SignalExitHandler()
+{
+  if (triedToBailOnce) {
+    exit(-1);
+  } else {
+    triedToBailOnce = 1;
+    fprintf(stderr, "\nMicropolis has been terminated by a signal.\n");
+    fprintf(stderr, "Pick a window -- you're leaving!\n\n");
+    fflush(stderr);
+    sim_really_exit(-1);
+  }
+}
+
+
+signal_init()
+{
+  signal(SIGHUP, (void (*)())SignalExitHandler);
+  signal(SIGINT, (void (*)())SignalExitHandler);
+  signal(SIGQUIT, (void (*)())SignalExitHandler);
+  signal(SIGTERM, (void (*)())SignalExitHandler);
+}
+
+
+void
+sim_update()
+{
+  gettimeofday(&now_time, NULL);
+
+  flagBlink = (now_time.tv_usec < 500000) ? 1 : -1;
+
+  if (SimSpeed && !heat_steps) {
+    TilesAnimated = 0;
+  }
+
+  sim_update_editors();
+  
+  sim_update_maps();
+  sim_update_graphs();
+  sim_update_budgets();
+  sim_update_evaluations();
+
+  UpdateFlush();
+}
+
+
+sim_update_editors(void)
+{
+  SimView *view;
+
+  for (view = sim->editor; view != NULL; view = view->next) {
+#if 1
+    CancelRedrawView(view);
+    view->invalid = 1;
+    DoUpdateEditor(view);
+#else
+    EventuallyRedrawView(view);
+#endif
+  }
+
+  DoUpdateHeads();
+}
+
+
+sim_update_maps(void)
+{
+  SimView *view;
+  int i;
+
+  for (view = sim->map; view != NULL; view = view->next) {
+    int mustUpdateMap =
+      NewMapFlags[view->map_state] || NewMap || ShakeNow;
+    if (mustUpdateMap) {
+      view->invalid = 1;
+    }
+    if (view->invalid) {
+#if 1
+      if (mustUpdateMap) {
+//fprintf(stderr, "sim_update_maps mustUpdateMap\n");
+//     view->skip = 0;
+      }
+      if (DoUpdateMap(view)) {
+//          CancelRedrawView(view);
+//       view->invalid = 1;
+      }
+#else
+      EventuallyRedrawView(view);
+#endif
+    }
+  }
+
+  NewMap = 0;
+  for (i = 0; i < NMAPS; i++) {
+    NewMapFlags[i] = 0;
+  }
+}
+
+
+sim_update_graphs(void)
+{
+  graphDoer();
+}
+
+
+sim_update_budgets(void)
+{
+  if ((sim_skips != 0) &&
+      (sim_skip != 0)) {
+    return;
+  }
+
+  UpdateBudgetWindow();
+}
+
+
+sim_update_evaluations(void)
+{
+  if ((sim_skips != 0) &&
+      (sim_skip != 0)) {
+    return;
+  }
+
+  scoreDoer();
+}
+
+
+#ifdef CAM
+
+sim_update_cams(void)
+{
+  SimCam *scam;
+
+  if ((sim_skips != 0) &&
+      (sim_skip != 0)) {
+    return;
+  }
+
+  for (scam = sim->scam; scam != NULL; scam = scam->next) {
+    CancelRedrawView(scam);
+    scam->invalid = 1;
+    handle_scam(scam);
+  }
+}
+
+#endif /* CAM */
+
+
+short *CellSrc = NULL;
+short *CellDst = NULL;
+
+#define SRCCOL (WORLD_Y + 2)
+#define DSTCOL WORLD_Y
+
+#define CLIPPER_LOOP_BODY(CODE) \
+    src = CellSrc; dst = CellDst; \
+    for (x = 0; x < WORLD_X;) { \
+      short nw, n, ne, w, c, e, sw, s, se; \
+      \
+      src = CellSrc + (x * SRCCOL); dst = CellDst + (x * DSTCOL); \
+      w = src[0]; c = src[SRCCOL]; e = src[2 * SRCCOL]; \
+      sw = src[1]; s = src[SRCCOL + 1]; se = src[(2 * SRCCOL) + 1]; \
+      \
+      for (y = 0; y < WORLD_Y; y++) { \
+        nw = w; w = sw; sw = src[2]; \
+       n = c; c = s; s = src[SRCCOL + 2]; \
+       ne = e; e = se; se = src[(2 * SRCCOL) + 2]; \
+       { CODE } \
+       src++; dst++; \
+      } \
+      x++; /* src += SRCCOL - 3; dst += DSTCOL - 1; */ \
+      src = CellSrc + ((x + 1) * SRCCOL) - 3; dst = CellDst + ((x + 1) * DSTCOL) - 1; \
+      \
+      nw = src[1]; n = src[SRCCOL + 1]; ne = src[(2 * SRCCOL) + 1]; \
+      w = src[2]; c = src[SRCCOL + 2]; e = src[(2 * SRCCOL) + 2]; \
+      \
+      for (y = WORLD_Y - 1; y >= 0; y--) { \
+        sw = w; w = nw; nw = src[0]; \
+        s = c; c = n; n = src[SRCCOL]; \
+        se = e; e = ne; ne = src[2 * SRCCOL]; \
+       { CODE } \
+       src--; dst--; \
+      } \
+      x++; /* src += SRCCOL + 3; dst += DSTCOL + 1; */ \
+    }
+
+void
+sim_heat(void)
+{
+  int x, y, l, r, u, d;
+  static int a = 0;
+  short *src, *dst;
+  register int fl = heat_flow;
+
+  if (CellSrc == NULL) {
+    CellSrc = (short *)ckalloc((WORLD_X + 2) * (WORLD_Y + 2) * sizeof (short));
+    CellDst = &Map[0][0];
+  }
+
+  src = CellSrc + SRCCOL + 1;
+  dst = CellDst;
+
+/*
+ * Copy wrapping edges:
+ *
+ *     0       ff      f0 f1 ... fe ff         f0
+ *
+ *     1       0f      00 01 ... 0e 0f         00
+ *     2       1f      10 11 ... 1e 1f         10
+ *             ..      .. ..     .. ..         ..
+ *             ef      e0 e1 ... ee ef         e0
+ *     h       ff      f0 f1 ... fe ff         f0
+ *
+ *     h+1     0f      00 01 ... 0e 0f         00
+ *
+ * wrap value: effect:
+ *     0       no effect
+ *     1       copy future=>past, no wrap
+ *     2       no copy, wrap edges
+ *     3       copy future=>past, wrap edges
+ *     4       copy future=>past, same edges
+ */
+
+  switch (heat_wrap) {
+  case 0:
+    break;
+  case 1:
+    for (x = 0; x < WORLD_X; x++) {
+      memcpy(src, dst, WORLD_Y * sizeof (short));
+      src += SRCCOL;
+      dst += DSTCOL;
+    }
+    break;
+  case 2:
+    for (x = 0; x < WORLD_X; x++) {
+      src[-1] = src[WORLD_Y - 1];
+      src[WORLD_Y] = src[0];
+      src += SRCCOL;
+      dst += DSTCOL;
+    }
+    memcpy(CellSrc,CellSrc + (SRCCOL * WORLD_X), 
+         SRCCOL * sizeof (short));
+    memcpy(CellSrc + SRCCOL * (WORLD_X + 1), CellSrc + SRCCOL,
+         SRCCOL * sizeof (short));
+    break;
+  case 3:
+    for (x = 0; x < WORLD_X; x++) {
+      memcpy(src, dst, WORLD_Y * sizeof (short));
+      src[-1] = src[WORLD_Y - 1];
+      src[WORLD_Y] = src[0];
+      src += SRCCOL;
+      dst += DSTCOL;
+    }
+    memcpy(CellSrc, CellSrc + (SRCCOL * WORLD_X),
+          SRCCOL * sizeof (short));
+    memcpy(CellSrc + SRCCOL * (WORLD_X + 1), CellSrc + SRCCOL,
+          SRCCOL * sizeof (short));
+    break;
+  case 4:
+    src[0] = dst[0];
+    src[1 + WORLD_Y] = dst[WORLD_Y - 1];
+    src[(1 + WORLD_X) * SRCCOL] = dst[(WORLD_X - 1) * DSTCOL];
+    src[((2 + WORLD_X) * SRCCOL) - 1] = dst[(WORLD_X * WORLD_Y) - 1];
+    for (x = 0; x < WORLD_X; x++) {
+      memcpy(src, dst, WORLD_Y * sizeof (short));
+      src[-1] = src[0];
+      src[WORLD_Y] =  src[WORLD_Y - 1];
+      src += SRCCOL;
+      dst += DSTCOL;
+    }
+    memcpy(CellSrc + (SRCCOL * (WORLD_X + 1)), CellSrc + (SRCCOL * WORLD_X),
+          SRCCOL * sizeof (short));
+    memcpy(CellSrc, CellSrc + SRCCOL,
+          SRCCOL * sizeof (short));
+    break;
+  }
+
+
+  switch (heat_rule) {
+
+  case 0:
+#define HEAT \
+       a += nw + n + ne + w + e + sw + s + se + fl; \
+       dst[0] = ((a >> 3) & LOMASK) | \
+                    (ANIMBIT | BURNBIT | BULLBIT); \
+       a &= 7;
+
+    CLIPPER_LOOP_BODY(HEAT);
+    break;
+
+  case 1:
+#define ECOMASK 0x3fc
+#define ECO \
+      c -= fl; n -= fl; s -= fl; e -= fl; w -= fl; \
+      ne -= fl; nw -= fl; se -= fl; sw -= fl; \
+      \
+      /* anneal */ \
+      { int sum = (c&1) + (n&1) + (s&1) + (e&1) + (w&1) + \
+                 (ne&1) + (nw&1) + (se&1) + (sw&1), cell; \
+       if (((sum > 5) || (sum == 4))) { \
+         /* brian's brain */ \
+         cell = ((c <<1) & (0x3fc)) | \
+                (((((c >>1)&3) == 0) && \
+                  (((n&2) + (s&2) + (e&2) + (w&2) + \
+                    (ne&2) + (nw&2) + (se&2) + (sw&2)) == (2 <<1)) \
+                 ) ? 2 : 0) | \
+                1; \
+       } else { \
+         /* anti-life */ \
+         sum = ((n&2) + (s&2) + (e&2) + (w&2) + \
+                (ne&2) + (nw&2) + (se&2) + (sw&2)) >>1; \
+         cell = (((c ^ 2) <<1) & ECOMASK) | \
+                ((c&2) ? ((sum != 5) ? 2 : 0) \
+                       : (((sum != 5) && (sum != 6)) ? 2 : 0)); \
+       } \
+       dst[0] = ((fl + cell) & LOMASK) | \
+                (ANIMBIT | BURNBIT | BULLBIT); \
+      } \
+      c += fl; n += fl; s += fl; e += fl; w += fl; \
+      ne += fl; nw += fl; se += fl; sw += fl;
+
+    CLIPPER_LOOP_BODY(ECO);
+    break;
+  }
+}
+
+
+void
+sim_timeout_loop(short doSim)
+{
+  if (SimSpeed) {
+    sim_loop(doSim);
+  }
+  DoTimeoutListen();
+}
+
+
+sim_loop(int doSim)
+{
+#ifdef CAM
+  if (!sim_just_cam) {
+#endif
+    if (heat_steps) {
+      int j;
+
+      for (j = 0; j < heat_steps; j++) {
+       sim_heat();
+      }
+
+      MoveObjects();
+/*
+      InvalidateMaps();
+*/
+      NewMap = 1;
+    } else {
+      if (doSim) {
+       SimFrame();
+      }
+      MoveObjects();
+    }
+
+    sim_loops++;
+    sim_update();
+#ifdef CAM
+  } else {
+    sim_update_cams();
+    UpdateFlush();
+    DoTimeoutListen();
+  }
+#endif
+}
+
+
+int
+MatchArg(char *arg, char *pat)
+{
+  while (*pat && *arg) {
+    if (tolower(*arg) != tolower(*pat)) {
+      if (*pat == '_') {
+       pat++;
+       continue;
+      }
+      return (0);
+    }
+    arg++; pat++;
+  }
+  return (*arg == '\0');
+}
+
+
+int
+main(int argc, char *argv[])
+{ 
+  int c, errflg = 0;
+  extern int isatty();
+
+  printf("Welcome to X11 Multi Player Micropolis version %s by Will Wright, Don Hopkins.\n",
+        MicropolisVersion);
+  printf("Copyright (C) 2002 by Electronic Arts, Maxis. All rights reserved.\n");
+
+  while (!errflg && 
+        !tkMustExit &&
+        (c = getopt(argc, argv, "tcwmSR:gs:l:")) != -1) {
+    switch (c) {
+
+    case 't': /* TTY mode */
+      sim_tty = isatty(0);
+      break;
+
+    case 'c': /* Create Own Colormap */
+      { extern int TK_CreateColormap;
+       TK_CreateColormap = 1;
+      }
+      break;
+
+    case 'w': /* Wire Mode (don't use shared memory) */
+      WireMode = 1;
+      break;
+
+    case 'm': /* Multi Player Mode */
+      MultiPlayerMode = 1;
+      break;
+
+    case 'S': /* Sugar Mode */
+      SugarMode = 1;
+      break;
+
+    case 'R': /* Root Window ID */
+      c = atoi(optarg);
+      if (c) {
+       tk_RootWindow = c;
+      } else {
+       errflg = 1;
+      }
+      break;
+
+    case 'g': /* Generate New Terrain */
+      if (Startup) {
+       errflg = 1;
+      } else {
+       Startup = -1;
+      }
+      break;
+
+    case 'l': /* Level */
+      c = atoi(optarg);
+      if (!c) {
+       if (MatchArg(optarg, "easy")) {
+         c = 1;
+       } else if (MatchArg(optarg, "medium")) {
+         c = 2;
+       } else if (MatchArg(optarg, "hard")) {
+         c = 3;
+       }
+      }
+      if ((c < 1) || (c > 3)) {
+       errflg = 1;
+      } else {
+       StartupGameLevel = c - 1;
+      }
+      break;
+
+    case 's': /* Scenario <name> */
+      if (Startup)
+       errflg++;
+      else {
+       c = atoi(optarg);
+       if (!c) {
+         if (MatchArg(optarg, "Dullsville")) {
+           c = 1;
+         } else if (MatchArg(optarg, "San_Francisco")) {
+           c = 2;
+         } else if (MatchArg(optarg, "Hamburg")) {
+           c = 3;
+         } else if (MatchArg(optarg, "Bern")) {
+           c = 4;
+         } else if (MatchArg(optarg, "Tokyo")) {
+           c = 5;
+         } else if (MatchArg(optarg, "Detroit")) {
+           c = 6;
+         } else if (MatchArg(optarg, "Boston")) {
+           c = 7;
+         } else if (MatchArg(optarg, "Rio_de_Janeiro")) {
+           c = 8;
+         }
+       }
+       if ((c < 1) || (c > 8)) {
+         errflg = 1;
+       } else {
+         Startup = c;
+       }
+      }
+      break;
+
+    case 'd': /* Display <name> */
+      { char *d = Displays;
+
+       if (d == NULL) {
+         Displays = malloc(strlen(optarg) + 3);
+         sprintf(Displays, "{%s}", optarg);
+
+         if (strchr(optarg, ':') != NULL) {
+           FirstDisplay = malloc(strlen(optarg) + 1);
+           strcpy(FirstDisplay, optarg);
+         } else {
+           FirstDisplay = malloc(strlen(optarg) + 3);
+           sprintf(FirstDisplay, "%s:0", optarg);
+         }
+       } else {
+         /* Implicitly set multi player mode if multiple displays given. */
+         MultiPlayerMode = 1;
+         Displays = malloc(strlen(Displays) + strlen(optarg) + 4);
+         sprintf(Displays, "%s {%s}", d, optarg);
+         free(d);
+       }
+      }
+      break;
+
+    case '?':
+      errflg++;
+      break;
+    }
+  }
+
+  if (!errflg &&
+      !tkMustExit) {
+    if ((Startup == -1) ||
+       (Startup == -2)) {
+      /* Generate New City */
+      if ((optind != argc) && (optind != argc - 1)) {
+       errflg = 1;
+      } else {
+       if (optind == argc - 1)
+         StartupName = argv[optind];
+      }
+    } else if (Startup > 0) {
+      /* Scenario */
+    } else if (optind == argc - 1) {
+      /* Load City */
+      Startup = -2;
+      StartupName = argv[optind];
+    } else if (optind == argc) {
+      /* No arguments */
+    } else {
+      errflg = 1;
+    }
+  }
+
+  if (errflg) {
+    fprintf(stderr,
+"usage: %s\n", argv[0]);
+    fprintf(stderr,
+"        [-s(cenario) number|name]\n");
+    fprintf(stderr,
+"        [-g(enerate random map and start playing)\n");
+    fprintf(stderr,
+"        [-l(evel) number|name]\n");
+    fprintf(stderr,
+"        [-w(ire mode: use X11 networking without shared memory)]\n");
+    fprintf(stderr,
+"        [-t(ty mode: interactive TCL session on stdin/stdout)]\n");
+    fprintf(stderr,
+"        [-c(olormap mode: create own X11 colormap on 8 bit screens)]\n");
+    fprintf(stderr,
+"        [-S(ugar mode: enable OLPC Sugar user interface integration)]\n");
+    fprintf(stderr,
+"        [-m(ulti player mode: enable adding multiple players via X11)]\n");
+    fprintf(stderr,
+"        [NewCityName]\n");
+    fprintf(stderr,
+"        [SavedFileName.city]\n");
+    fprintf(stderr,
+"The game level and NewCityName argument are optional, and only apply when\n");
+    fprintf(stderr,
+"starting a new city or generating new terrain.\n");
+    fprintf(stderr,
+"Game levels include: 1: Easy, 2: Medium, 3: Hard\n");
+    fprintf(stderr,
+"Scenarios include: 1: Dullsville, 2: San_Francisco, 3: Hamburg, 4: Bern,\n");
+    fprintf(stderr,
+"                  5: Tokyo, 6: Detroit, 7: Boston, 8: Rio_de_Janeiro\n");
+    fflush(stderr);
+    sim_exit(0); // Just sets tkMustExit and ExitReturn
+  }
+
+  if ((!tkMustExit) &&
+      (Displays == NULL)) {
+    char *d = getenv("DISPLAY");
+
+    if (d == NULL) d = ":0";
+
+    Displays = malloc(strlen(d) + 3);
+    sprintf(Displays, "{%s}", d);
+    if (strchr(d, ':') != NULL) {
+      FirstDisplay = malloc(strlen(d) + 1);
+      strcpy(FirstDisplay, d);
+    } else {
+      FirstDisplay = malloc(strlen(d) + 3);
+      sprintf(FirstDisplay, "%s:0", d);
+    }
+  }
+
+  if (!tkMustExit) {
+    env_init();
+  }
+
+  if (!tkMustExit) {
+    tk_main();
+  }
+
+  exit (ExitReturn);
+}
diff --git a/src/sim/terrain/mapgener.c b/src/sim/terrain/mapgener.c
new file mode 100644 (file)
index 0000000..1f9d2e7
--- /dev/null
@@ -0,0 +1,411 @@
+/* mapgener.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+
+/* Micropolis simulator code.  Copyright 1988, 1989 Maxis, Will Wright */
+
+#include "sim.h"
+
+#define TRUE 1
+#define FALSE 0
+#define WORLD_X 120
+#define WORLD_Y 100
+#define RIVER 2
+#define REDGE 3
+#define CHANNEL 4
+#define WOODS 37
+#define BL 4096
+#define BN 8192
+#define BLN BL+BN
+
+static int XStart, YStart;
+static int  Dir, LastDir;
+
+                                       /* trash values for GRand()     */
+static int GRanArray[5] = { 1018,4521,202,419,3 }; 
+
+far GenerateMap()
+{
+       GRanArray[0] = TickCount();  /* This is the only machine-specific call  */
+                                                                /* It inits GRand() w/ clockcount(long)        */
+       
+       if (!(GRand(10)))  {                    /* 1 in 3 chance that island is generated       */
+               MakeIsland();
+               return;
+       }
+       ClearMap();                                     /* else make river map                                          */
+       GetRandStart();
+       DoRivers();
+       MakeLakes();
+       SmoothRiver();
+       DoTrees();
+}
+
+near ClearMap()
+{
+register int x, y;
+
+       for (x=0; x<WORLD_X; x++)
+               for (y=0; y<WORLD_Y; y++)
+                       Map[x][y] = 0;
+}
+
+#define RADIUS 18
+
+near MakeIsland()
+{
+       register int x,y,z;
+       
+       for (x=0; x<WORLD_X; x++)
+               for (y=0; y<WORLD_Y; y++)
+                       Map[x][y] = RIVER;
+       for (x=5; x<WORLD_X-5; x++)
+               for (y=5; y<WORLD_Y-5; y++)
+                       Map[x][y] = 0;
+       for (x=0; x<WORLD_X-5; x+=2)    {
+               MapX= x ;
+               MapY= EGRand(RADIUS);
+               BRivPlop();
+               MapY= 90-EGRand(RADIUS);
+               BRivPlop();
+               MapY= 0;
+               SRivPlop();
+               MapY= 94;
+               SRivPlop();
+       }
+       for (y=0; y<WORLD_Y-5; y+=2)    {
+               MapY= y ;
+               MapX= EGRand(RADIUS);
+               BRivPlop();
+               MapX= 110-EGRand(RADIUS);
+               BRivPlop();
+               MapX= 0;
+               SRivPlop();
+               MapX= 114;
+               SRivPlop();
+       }
+       SmoothRiver();
+       DoTrees();
+}
+
+near MakeLakes()
+{
+       int Lim1, Lim2, t, z;
+       register int x, y;
+       
+       Lim1 = GRand(10);
+       for (t = 0; t < Lim1; t++)  {
+               x = GRand(99) + 10;
+               y = GRand(80) + 10;
+               Lim2 = GRand(12)+2;
+               for (z = 0; z < Lim2; z++)  {
+                       MapX = x - 6 + GRand(12);
+                       MapY = y - 6 + GRand(12);
+                       if (GRand(4))  SRivPlop();
+                       else  BRivPlop();
+               }
+       }
+}
+
+near GetRandStart()
+{
+       XStart = 40 + GRand(40);
+       YStart = 33 + GRand(33);
+       MapX = XStart;
+       MapY = YStart;
+}
+
+near DoTrees()
+{
+       int Amount,x,xloc,yloc;
+
+       Amount = GRand(100)+50;
+       for (x=0; x<Amount; x++)  {
+               xloc = GRand(119);
+               yloc = GRand(99);
+               TreeSplash(xloc,yloc);
+       }
+       SmoothTrees();
+       SmoothTrees();
+}
+
+near TreeSplash(xloc,yloc)
+int xloc,yloc;
+{
+       int  Dis, Dir;
+       register int xoff, yoff,z;
+       
+       Dis = GRand(150)+50;
+       MapX = xloc;
+       MapY = yloc;
+       for (z=0; z<Dis; z++)   {
+               Dir = GRand(7);
+               MoveMap(Dir);
+               if (!(TestBounds(MapX,MapY))) return;
+               if (Map[MapX][MapY] == 0)  Map[MapX][MapY] = WOODS+ BLN;
+       }
+}
+       
+far SmoothRiver()
+{
+ static int DX[4] = {-1, 0, 1, 0};
+ static int DY[4] = { 0, 1, 0,-1};
+ static int REdTab[16] = { 13+BL,13+BL,17+BL,15+BL,5+BL,2,19+BL,
+                                                  17+BL,9+BL,11+BL,2,13+BL,7+BL,9+BL,5+BL,2};
+ int  bitindex, z,Xtem,Ytem;
+ register int temp,MapX,MapY;
+ for (MapX = 0; MapX < WORLD_X; MapX++)
+       for (MapY = 0; MapY < WORLD_Y; MapY++)
+               if (Map[MapX][MapY] == REDGE)   {
+                       bitindex = 0;
+                       for (z=0; z<4; z++)     {
+                               bitindex = bitindex << 1;
+                               Xtem = MapX + DX[z];
+                               Ytem = MapY + DY[z];
+                               if (TestBounds(Xtem, Ytem))
+                                       if ( Map[Xtem][Ytem]) bitindex++;
+                       }
+                       temp = REdTab[bitindex & 15];
+                       if ((temp != 2) && (GRand(1))) temp++;
+                       Map[MapX][MapY] = temp;
+               }
+ }
+
+far SmoothTrees()
+{
+ static int DX[4] = {-1, 0, 1, 0};
+ static int DY[4] = { 0, 1, 0,-1};
+ static int TEdTab[16] = {0,0,0,34,0,0,36,35,0,32,0,33,30,31,29,37};
+ int   bitindex, z,Xtem,Ytem;
+ register int temp,MapX,MapY;
+ for (MapX = 0; MapX < WORLD_X; MapX++)
+       for (MapY = 0; MapY < WORLD_Y; MapY++)
+               if ((Map[MapX][MapY] & BLN) == BLN)     {
+                       bitindex = 0;
+                       for (z=0; z<4; z++)     {
+                               bitindex = bitindex << 1;
+                               Xtem = MapX + DX[z];
+                               Ytem = MapY + DY[z];
+                               if (TestBounds(Xtem, Ytem))             
+                                       if (Map[Xtem][Ytem] & BN) bitindex++;
+                               
+                       }
+                       temp = TEdTab[bitindex & 15];
+                       if (temp) {
+                               if (temp != 37) 
+                                       if ((MapX+MapY) & 1)
+                                               temp = temp-8;
+                               Map[MapX][MapY] = temp+BLN;
+                       }
+                       else Map[MapX][MapY] = temp;
+               }
+ }
+near DoRivers()
+{      
+
+       LastDir = GRand(3);
+       Dir = LastDir;
+       DoBRiv();
+       MapX = XStart;
+       MapY = YStart;
+       LastDir = LastDir ^ 4;
+       Dir = LastDir;
+       DoBRiv();       
+       MapX = XStart;
+       MapY = YStart;
+       LastDir = GRand(3);
+       DoSRiv();
+}
+
+near DoBRiv()
+{
+int temp, count;
+
+       count = 0;
+       while (TestBounds (MapX+4, MapY+4))             {
+               BRivPlop();
+               if (GRand(10) > 4) Dir++;
+               if (GRand(10) > 4) Dir--;
+               if (!(GRand(10))) Dir = LastDir;        
+               MoveMap (Dir);
+       }
+}
+
+near DoSRiv()
+{
+int temp;
+
+       while (TestBounds (MapX+3, MapY+3))             {
+               SRivPlop();
+               if (GRand(10) > 5) Dir++;
+               if (GRand(10) > 5) Dir--;
+               if (!(GRand(12))) Dir = LastDir;
+               MoveMap (Dir);
+       }
+}
+
+near MoveMap   (dir)
+int dir;
+{
+static int DirTab[2][8] ={             { 0, 1, 1, 1, 0, -1, -1, -1},
+                                                               {-1,-1, 0, 1, 1,  1,  0, -1}    };
+       dir = dir & 7;
+       MapX += DirTab[0][dir];
+       MapY += DirTab[1][dir];
+}
+
+
+
+
+near BRivPlop()
+{
+static int BRMatrix[9][9] ={
+               {0,0,0,3,3,3,0,0,0},
+               {0,0,3,2,2,2,3,0,0},
+               {0,3,2,2,2,2,2,3,0},
+               {3,2,2,2,2,2,2,2,3},
+               {3,2,2,2,4,2,2,2,3},
+               {3,2,2,2,2,2,2,2,3},
+               {0,3,2,2,2,2,2,3,0},
+               {0,0,3,2,2,2,3,0,0},
+               {0,0,0,3,3,3,0,0,0}             };
+int x, y;
+
+       for (x=0; x<9; x++)
+               for (y=0; y<9; y++)
+                       PutOnMap (BRMatrix[y][x], x, y);
+}
+
+near SRivPlop()
+{
+static int SRMatrix[6][6] ={
+               {0,0,3,3,0,0},
+               {0,3,2,2,3,0},
+               {3,2,2,2,2,3},
+               {3,2,2,2,2,3},
+               {0,3,2,2,3,0},
+               {0,0,3,3,0,0}           };
+int x, y;
+
+       for (x=0; x<6; x++)
+               for (y=0; y<6; y++)
+                       PutOnMap (SRMatrix[y][x], x, y);
+}
+
+near PutOnMap (Mchar, Xoff, Yoff)
+int Mchar, Xoff, Yoff;
+{
+register int Xloc, Yloc, temp;
+
+       if (Mchar == 0) return;
+       Xloc = MapX + Xoff;
+       Yloc = MapY + Yoff;
+       if (TestBounds (Xloc, Yloc) == FALSE) return (FALSE);
+       if (temp = Map [Xloc][Yloc])    {
+               temp = temp & 1023;
+               if (temp == RIVER) 
+                       if (Mchar != CHANNEL)
+                               return (FALSE);
+               if (temp == CHANNEL) return (FALSE);
+       }                                       
+       Map [Xloc][Yloc] = Mchar;       
+}
+
+far TestBounds(x, y)
+register int x, y;
+{
+       if ((( x >= 0) && (x < WORLD_X)) && (( y >= 0) && (y < WORLD_Y)))
+               return (TRUE);
+       return (FALSE);
+}
+
+
+
+near EGRand(limit)
+int limit;
+{
+       int x,z;
+       
+       z= GRand(limit);
+       x= GRand(limit);
+       if (z < x) return(z);
+       return(x);
+}
+
+#define RANMASK 32767
+
+near GRand(range)                      /* stupid but works  */
+int range;
+{
+       register x, newv, divisor;
+       
+       divisor = RANMASK/ (range+1);
+       newv = 0;
+       for (x=4; x!=0; x--)
+               newv += (GRanArray[x] = GRanArray[x-1]);
+       GRanArray[0] = newv;
+       x = (newv & RANMASK) / divisor;
+       if (x > range)  return(range);
+       return(x);
+}
diff --git a/src/sim/terrain/messages b/src/sim/terrain/messages
new file mode 100644 (file)
index 0000000..c0910f4
--- /dev/null
@@ -0,0 +1,234 @@
+/* messages
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+
+struct msgpr popMsgs[]={ 
+{"TRAFFIC WARNING-Traffic in this"
+ "\ncity is expanding. The commuters"
+ "\nare getting militant. Highway"
+ "\nshootings are on the rise. Either"
+ "\nbuild more roads and rails or get"
+ "\na bulletproof limo.",-12},
+
+{"CRIME ALERT-  Crime in your city is"
+ "\nout of hand. Angry mobs are looting"
+ "\nand vandalizing the central city. The"
+ "\npresident will send in the national"
+ "\nguard soon if you cannot control the"
+ "\nproblem.",-11},
+
+{"NUCLEAR MELTDOWN-A nuclear meltdown"
+ "\nhas occurred at your power plant."
+ "\nYou are advised to avoid the area"
+ "\nuntil the radioactive isotopes decay."
+ "\nMany  generations will confront this"
+ "\nproblem before it goes away so don't"
+ "\nhold your breath.",-43},
+
+{"YOU'RE A WINNER- Your mayorial skill"
+ "\nand city planning expertise have"
+ "\nearned you the KEY TO THE CITY. Local"
+ "\nresidents will erect monuments to"
+ "\nyour glory and name their first-born"
+ "\nchildren after you. Why not run for"
+ "\ngovernor?",-100},
+
+{"IMPEACHMENT NOTICE- The entire"
+ "\npopulation of this city has finally"
+ "\nhad enough of your inept planning "
+ "\nand incompetant management. An angry"
+ "\nmob - lead by your mother - has been"
+ "\nspotted in the vicinity of city hall."
+ "\nYou should seriously consider taking"
+ "\nan extended vacation - NOW. (Or read"
+ "\nthe manual and try again).",-200},
+
+{"MONSTER ATTACK- A large reptilian"
+ "\ncreature has been spotted in the"
+ "\nwater. It seems to be attracted to "
+ "\nareas of high pollution. There is a"
+ "\ntrail of destruction wherever it"
+ "\n goes.  As a last resort try calling"
+ "\n(Kanji) "
+ "\nOther than that wait till it leaves"
+ "\nthen rebuild from the rubble.",-21},
+
+{"POLLUTION ALERT- Pollution in your"
+ "\ncity has exceeded the maximum"
+ "\nallowable amounts established by"
+ "\nthe Micropolis pollution agency. You"
+ "\nare running the risk of grave"
+ "\necological consequences. Either"
+ "\nclean up your act or open a gas"
+ "\nmask concession at city hall.",-10},
+
+{"MEGALOPOLIS - Congratulations, you"
+ "\nhave reached the highest category"
+ "\nof urban development, the mega-"
+ "\nlopolis. If you manage to reach"
+ "\nthis level send us email at micropolis@laptop.org"
+ "\nor send us a copy of your city. We "
+ "\nmight do something interesting with"
+ "\nit.",-39},
+
+{"METROPOLIS - Your capital city has"
+ "\nnow achieved the status of metro-"
+ "\npolis. The current population is"
+ "\n100,000. With your planning skills,"
+ "\nyou should consider running for"
+ "\ngovernor, or maybe VLSI design.",-38},
+
+{"CAPITAL- Your current city has"
+ "\nbecome a capital.  The current"
+ "\npopulation here is 50,000. Your"
+ "\npolitical future looks bright.",-37},
+
+{"CITY- Your town has grown into a"
+ "\nfull sized city, with a current"
+ "\npopulation of 10,000. Keep up the"
+ "\ngood work!",-36},
+
+{"TOWN- Congratulations, your village"
+ "\nhas grown to town status. You now"
+ "\nhave 2,000 citizens.",-35},
+
+
+{"Detroit, MI. 1972-"
+ "\nBy 1970, competition from overseas"
+ "\nand other economic factors pushed the"
+ "\nonce automobile capital of the world"
+ "\ninto recession.  Plummeting land"
+ "\nvalues and unemployment then"
+ "\nincreased crime in the inner-city"
+ "\nto chronic levels.  You have 10 years"
+ "\nto reduce crime and rebuild the"
+ "\nindustrial base of the city. ",-6},
+
+{"Rio de Janiero, Brazil 2047 -"
+"\nBy the mid-21st century, the green-"
+"\nhouse effect increased global tem-"
+"\nperatures about 4 degrees F. Polar"
+"\nicecaps melted and raised sea levels"
+"\nworldwide. Coastal areas were"
+"\ndevastated by flood and erosion. You"
+"\nhave 10 years to turn this swamp back"
+"\ninto a city again.",-8},
+
+{"Tokyo, Japan 1957-"
+"\nA large reptilian creature has been"
+"\nspotted heading for Tokyo bay. It"
+"\nseems to be attracted to the heavy"
+"\nlevels of industrial pollution.  Try"
+"\nto control the fires, then rebuild"
+"\nthe industrial center. You have five"
+"\nyears.",-5},
+
+{"Hamburg, Germany 1944-"
+"\nAllied fire-bombing of German cities"
+"\nin WWII caused tremendous damage and"
+"\nloss of life. People living in the"
+"\ninner cities were at greatest risk."
+"\nYou must control the firestorms"
+"\nduring the bombing and then rebuild"
+"\nthe city after the war. You have"
+"\nfive years.",-3},
+
+{"San Francisco, CA. 1906-"
+"\nDamage from the earthquake was minor"
+"\ncompared to that of the ensuing"
+"\nfires, which took days to control."
+"\n1500 people died.  Controlling the"
+"\nfires should be your initial concern."
+"\nThen clear the rubble and start re-"
+"\nbuilding. You have five years.",-2},
+
+{"Dullsville, USA 1900-"
+"\nThings haven't changed much around"
+"\nhere in the last hundred years or"
+"\nso and the residents are beginning"
+"\nto get bored. They think Dullsville"
+"\ncould be the next great city with"
+"\nthe right leader. It is your job to"
+"\nattract new growth and development,"
+"\nturning Dullsville into a"
+"\nMetropolis within 30 years.",-1},
+
+{"Boston, MA. 2010-"
+"\nA major meltdown is about to occur"
+"\nat one of the new downtown nuclear"
+"\nreactors. The area in the vicinity"
+"\nof the reactor will be severely "
+"\ncontaminated by radiation, forcing"
+"\nyou to restructure the city around"
+"\nit. You have 5 years to get the"
+"\nsituation under control.",-7},
+
+{"Bern, Switzerland 1965-"
+"\nThe roads here are becoming more"
+"\ncongested every day, and the"
+"\nresidents are upset. They demand"
+"\nthat you do something about it."
+"\nSome have suggested a mass transit"
+"\nsystem as the answer, but this"
+"\nwould require major rezoning in"
+"\nthe downtown area. You have"
+"\nten years.",-4},
+  {NULL, 0}};
diff --git a/src/sim/terrain/terra.c b/src/sim/terrain/terra.c
new file mode 100644 (file)
index 0000000..387f255
--- /dev/null
@@ -0,0 +1,868 @@
+/* terra.c:  Terrain editor
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+
+/* terra.c     -       terrain editor for Sim City
+                                       by Paul Schmidt, 1989
+                                       Raxsoft, Inc.
+                                       1194 Spring Valley Commons
+                                       Livermore, CA 94550
+                                       (415) 449-9079
+*/
+
+#include "..\sim\sim.h"
+#include "..\gr\menu.h"
+#include "..\gr\grdef.h"
+#include "..\terra\tmenu.h"
+#include "..\ed\eddef.h"
+#include "..\ed\edext.h"
+#include <setjmp.h>
+#include <dos.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys\types.h>
+#include <sys\stat.h>
+#include <direct.h>
+
+char *GSaveRect();
+
+extern MOUSESTATE near mouse_state;
+extern FILE *demoFP;
+extern char realMouseFlag;
+
+extern long lastEvent, TickCount();            /* from ..\sim\main.c */
+extern long policeFund, fireFund, transFund;
+
+char CreateWithIsland;
+
+#define UMaps 4
+#define URecs 5000
+int UndoMapBuffer1[WORLD_X*WORLD_Y];
+int UndoMapBuffer2[WORLD_X*WORLD_Y];
+int UndoMapBuffer3[WORLD_X*WORLD_Y];
+int UndoMapBuffer4[WORLD_X*WORLD_Y];
+int *UndoMap[UMaps]={UndoMapBuffer1,UndoMapBuffer2,UndoMapBuffer3,UndoMapBuffer4};             /* maps for fill undos */
+int UndoMaps;          /* number of occupied undo maps */
+struct {
+       char x,y;               /* coordinate of undo */
+       int val;                        /* cell value */
+} UndoRec[URecs];              /* putdown undos */
+int UndoHead=0,UndoTail=0;
+
+char fillState=0;                      /* flag telling if fill mode is on or off */
+
+int treeLevel=50;              /* level for tree creation */
+int lakeLevel=50;              /* level for lake creation */
+int curvLevel=50;              /* level for river curviness */
+
+/* ========================================================== */
+
+void ClearUndo()               /* clear all undo records */
+{
+       UndoMaps=UndoHead=UndoTail=0;           /* kill undo pointers */
+       DrawAllEdIcons(UPDATE);         /* update undo icon */
+}
+
+void AddUndo(pos)              /* add undo record */
+Point pos;             /* position to add to undo */
+{
+
+       if(pos.h != -1 || pos.v != -1) {                /* if they're not setting to undo the entire map */
+               if(pos.h > WORLD_X || pos.v > WORLD_Y || pos.h < 0 || pos.v < 0) {              /* if out of bounds */
+                       return;         /* do nothing */
+               }
+       }
+       if(pos.h == -1 && pos.v == -1) {                /* if undo entire map */
+               register int tem;               /* temporary counter */
+               register int x,y;               /* temporary coordinates */
+
+               if(UndoMaps == UMaps) {         /* if there are already five undo maps */
+                       while(UndoRec[UndoTail].x != -1 || UndoRec[UndoTail].y != -1) {         /* until we find the last map undo */
+                               UndoTail=Bound(0,UndoTail+1,URecs-1);           /* move tail */
+                       }
+                       UndoTail=Bound(0,UndoTail+1,URecs-1);           /* move tail to kill the last map */
+                       UndoMaps--;
+                       for(tem=0;tem < UndoMaps;tem++) {               /* for each map */
+                               for(x=0;x < WORLD_X*WORLD_Y;x++) {
+                                       *(UndoMap[tem]+x)=*(UndoMap[tem+1]+x);
+                               }
+                       }
+               }
+               for(x=0;x < WORLD_X*WORLD_Y;x++) {
+                       *(UndoMap[UndoMaps]+x)=*((int*)Map+x);          /* save current map */
+               }
+               UndoMaps++;             /* one more map saved */
+       }
+       UndoRec[UndoHead].x=pos.h;              /* set x and y position */
+       UndoRec[UndoHead].y=pos.v;
+       UndoRec[UndoHead].val=Map[pos.h][pos.v];                /* set map value */
+       UndoHead=Bound(0,UndoHead+1,URecs-1);           /* move head */
+       if(UndoHead == UndoTail) {              /* if we pushed the tail up */
+               UndoTail=Bound(0,UndoTail+1,URecs-1);           /* move tail */
+       }
+}
+
+void Undo()            /* undo one map operation */
+{
+       register int x,y;
+
+       if(UndoHead == UndoTail) {              /* if there's nothing to undo */
+               MakeSound(7);           /* bad sound */
+               return;         /* do nothing */
+       }
+       UndoHead=Bound(0,UndoHead-1,URecs-1);           /* set new head */
+       if(UndoRec[UndoHead].x == -1) {         /* if the entire map changed */
+               register int tem;               /* temporary counter */
+               register int x,y;               /* temporary coordinates */
+
+               for(x=0;x < WORLD_X*WORLD_Y;x++) {
+                       *((int*)Map+x)=*(UndoMap[UndoMaps-1]+x);                /* set undo map */
+               }
+               UndoMaps--;             /* one less map */
+       } else {
+               Map[UndoRec[UndoHead].x][UndoRec[UndoHead].y]=UndoRec[UndoHead].val;            /* set old value */
+       }
+
+       UpdateOurMaps();                /* update big and small maps */
+}
+
+/* ======================================================================== */
+
+DoEvent()
+{
+
+       int object;
+       EVENT event;
+
+#if DEBUG && 0
+       PrintLock("DoEvent - get event ");
+#endif
+       GetMouseEvent(&event);
+       object=event.object;
+#if DEBUG && 0
+       PrintLock("DoEvent ");
+#endif
+
+       switch(object&0xff00)
+       {
+               case 0: DoMenu(object);
+                               break;
+               case 0x100:
+                               DoEdEvent(&event);
+                               break;
+               case 0x200:
+                               DoKeyDown(object);
+                               break;
+               case 0x300:
+                               MenuEvent(&event);
+                               break;
+               case 0x400:
+                               DoMapEvent(&event);
+                               break;
+               case 0x600:
+                               DoScreen(&event);
+                               break;
+       }
+}
+
+UpdateOurSmallMap()            /* update small map */
+{
+       register int tem;               /* temporary counter */
+       
+       MouseHide();            /* hide mouse */
+       DrawSmallMap();         /* updates small map */
+       for(tem=0;tem < WORLD_X*WORLD_Y;tem++) {
+               *((int*)lastSmallMap+tem)=(*((int*)Map+tem))&LOMASK;            /* copy map */
+       }
+       MouseShow();            /* show mouse */
+}
+
+UpdateOurMaps()                /* update edit and map widnows */
+{
+       UpdateMapCursorOff();           /* turn off map cursor */
+       MouseHide();            /* hide mouse */
+       DrawBigMap();           /* updates large map */
+       MouseShow();            /* show mouse */
+       UpdateOurSmallMap();
+       DrawAllEdIcons(UPDATE);         /* update icons */
+       UpdateMapCursorOn();            /* turn map cursor on */
+}
+
+/* ======================================================================== */
+DoMenu(itemNum)
+int itemNum;
+{
+       static char far *popGameLevelStrs[]={"Easy","Medium","Hard",NULL};
+       int cur_windowActive;           /* current active window */
+       register int x,y;               /* temporary integers */
+       Rect msgBox;
+       Rect msgRect;
+       char *savePtr;          /* pointer to saved rectangle */
+       int smoothFlag;
+       long tmpFunds;
+       int virginCity=YES;
+
+       switch(itemNum)
+       {
+/*             case MNUSCNO:
+/*                                     /* Load a scenario - if it fails we need to redraw the */
+/*                                     /* screen */
+/*                             if (!LoadScenario()) {
+/*                                     InitWindows();
+/*                             } else {
+/*                                     ClearUndo();            /* clear undo records */
+/*                             }
+/*                             SelectNewWindow(EDWINDOW);              /* enable edit window */
+/*                             SelectNewWindow(MAPWINDOW);             /* enable map window */
+/*                             break;          /**/
+               case MNUQUIT:
+                               if (Verify("EXIT"))
+                                       Quit("Micropolis Terrain Editor");
+                               break;
+               case MNU_SoundToggle:           /* sound on/off */
+                               userSoundOn^=YES;
+sso:
+                               ShowSelectedOptions();
+                               break;
+               case MNUABOUT:
+                               DoAbout();
+                               break;
+               case MNULOAD:
+                               if (LoadGame(NULL,NO))
+                                       virginCity=NO;
+                               SelectNewWindow(EDWINDOW);              /* enable edit window */
+                               SelectNewWindow(MAPWINDOW);             /* enable map window */
+                               ClearUndo();            /* clear undo records */
+                               break;
+               case MNUSAVE:
+                               SaveGame(lastFileName);
+                               break;
+               case MNUSVAS:
+                               SaveGame(NULL);
+                               break;
+               case MNUNEW: /* Start new game */
+                               if (Verify("NEW GAME")) {
+                                       totalFunds=20000L;
+                                       NewGame(NO);
+                                       transFund=policeFund=fireFund=65535L;
+                                       CityTax=7;
+                                       virginCity=YES;
+                                       ClearUndo();            /* clear undo records */
+                               }
+                               SelectNewWindow(EDWINDOW);              /* enable edit window */
+                               SelectNewWindow(MAPWINDOW);             /* enable map window */
+                               break;
+               case MNUPRINT:
+                               PrintCity();
+                               break;
+               case MNU_SmoothTrees:
+                       smoothFlag=1;
+                       goto dosmooth;
+               case MNU_ClearMap:              /* if map is to be cleared */
+                       AddUndo(-1,-1);         /* save map */
+                       rax_ClearMap();         /* clear map (..\sim\mapgener.c) */
+                       GameLevel=0;            /* assume game is easy */
+                       goto updateBoth;
+                       break;
+               case MNU_ClearUnnatural:                /* if unnatural objects are to be cleared */
+                       AddUndo(-1,-1);         /* save map */
+                       for(x=0;x < WORLD_X;x++) {
+                               for(y=0;y < WORLD_Y;y++) {
+                                       if((Map[x][y]&LOMASK) > 37) {           /* get rid of everything unnatural */
+                                               Map[x][y]=0;            /* turn it into dirt */
+                                       }
+                               }
+                       }
+updateBoth:
+                       UpdateOurMaps();                /* update both windows */
+                       break;
+               case MNU_GenerateRandom:                /* if random map is to be generated */
+                       if(SetTerrainParameters()) {            /* allow user to set terrain generation parameters */
+                               CenterRect(&msgBox, 20, 5);
+                               msgRect=*AdjRect(&msgBox);
+                               savePtr=GSaveRect(&msgRect);            /* save rectangle */
+                               GRectFill(&msgRect, WHITE|PWHITE);
+                               GSetAttrib(DGREEN, DGREEN, PBLACK);
+                               GRectOutline(&msgRect, 4);
+                               GSetAttrib(LGREEN, LGREEN, PMGREY);
+                               GRectOutline(&msgRect, 2);
+                               GSetAttrib(DBLUE, WHITE, PWHITE|PINV);
+                               CenterPrint(&msgBox, msgBox.top+2, "Now terraforming");
+
+                               AddUndo(-1,-1);         /* save map */
+                               rax_ClearMap();                                 /* make river map */
+                               rax_GetRandStart();
+                               if(CreateWithIsland) {          /* if we're creating an island */
+                                       rax_MakeIsland();               /* make an island */
+                               }
+                               if(curvLevel) {         /* if we're supposedly creating an island */
+                                       rax_DoRivers();         /* create river */
+                               }
+                               if(lakeLevel) {         /* if there are to be lakes */
+                                       rax_MakeLakes();                /* add lakes */
+                               }
+                               rax_SmoothRiver();              /* smooth out river */
+                               if(treeLevel) {         /* if we're creating a woodsy terrain */
+                                       rax_DoTrees();          /* add trees */
+                               }
+                               rax_SmoothTrees();              /* smooth trees */
+                               rax_SmoothTrees();              /* smooth trees */
+
+                               GRestoreRect(&msgRect,savePtr);         /* restore rectangle */
+                               MapX=MapY=0;
+                               goto updateBoth;
+                       }
+                       break;
+               case MNU_SmoothRiver:           /* if water is to be smoothed */
+                       smoothFlag=2;
+                       goto dosmooth;
+               case MNU_SmoothBoth:            /* if both are to be smoothed */
+                       smoothFlag=3;                   /* Both */
+dosmooth:
+                       CenterRect(&msgBox, 16, 5);
+                       msgRect=*AdjRect(&msgBox);
+                       savePtr=GSaveRect(&msgRect);            /* save rectangle */
+                       GRectFill(&msgRect, WHITE|PWHITE);
+                       GSetAttrib(DGREEN, DGREEN, PBLACK);
+                       GRectOutline(&msgRect, 4);
+                       GSetAttrib(LGREEN, LGREEN, PMGREY);
+                       GRectOutline(&msgRect, 2);
+                       GSetAttrib(DBLUE, WHITE, PWHITE|PINV);
+                       CenterPrint(&msgBox, msgBox.top+2, "Smoothing...");
+
+                       AddUndo(-1,-1);         /* save map */
+                       if (smoothFlag & 2)     /* If water smooth flag set */
+                       {
+                               rax_WaterEdges();               /* make sure water edges are ok */
+                               rax_SmoothRiver();
+                       }
+                       if (smoothFlag & 1)
+                       {
+                               rax_SmoothTrees();
+                               rax_SmoothTrees();
+                       }
+
+                       GRestoreRect(&msgRect,savePtr);         /* restore rectangle */
+                       goto updateBoth;
+
+               case MNU_RandomIsland:          /* if random Island toggle */
+                       CreateWithIsland^=1;            /* toggle state of flag */
+                       ShowSelectedOptions();          /* update menu flag status */
+                       break;
+
+               case MNU_GameLevel:             /* if game level */
+/*                     GameLevel++;            /* add one for PopUpMenuBox */
+/*                     PopUpMenuBox(&GameLevel, popGameLevelStrs);
+/*                     GameLevel--;            /**/
+                       
+                       tmpFunds=totalFunds;    /* Don't alter the amount of funds! */
+                       ChooseGameLevel();              /* get city name & level from user */
+                       if (!virginCity)
+                               totalFunds=tmpFunds;
+                       NewName();              /* set the name of the city */
+                       break;
+               case MNU_GameYear:              /* if game year */
+                       SetGameYear();          /* allow user to set the game year */
+                       break;
+
+               case MNU_EditWindow:            /* if edit window */
+                       SelectNewWindow(EDWINDOW);              /* bring the edit window to the foreground */
+                       break;
+               case MNU_MapWindow:             /* if map window */
+                       SelectNewWindow(MAPWINDOW);             /* bring the map window to the foreground */
+                       break;
+
+               default:
+                       /* unimplemented option */
+                       break;
+       }
+}
+
+long messageTime;
+
+DoEdEvent(ePtr)
+EVENT *ePtr;
+{
+       int object;
+
+       object=ePtr->object&0xff;
+
+       if (object & 0xf0)
+       {       /* Must be an icon */
+               SetWandState(object&0xf, YES);
+       }
+       switch (object)
+       {       
+               case 0: DoEdMapEvent(ePtr);
+                               break;
+               case 2: DoMoveWindow(ePtr, edWinList);
+                               break;
+               case 8: ResizeEdWindow(ePtr);
+                               break;
+       }
+}
+
+/* ======================================================================== */
+DoMapEvent(ePtr)
+EVENT *ePtr;
+{
+       int object;
+
+       object=ePtr->object&0xff;
+
+       {
+               switch (object)
+               {       case 0: DoMapWindowEvent(ePtr);         /* move locus of edit window */
+                                       break;
+                       case 2: DoMoveMap(ePtr);                /* move window */
+                                       break;
+               }
+       }
+}
+
+void EditTerra()               /* main program entry point */
+{
+       int updateWait=0, updateWait2=0;
+
+       CreateWithIsland=0;
+       ShowSelectedOptions();          /* update menu flag status */
+       GameLevel=0;            /* assume game is easy */
+       totalFunds=20000L;
+       transFund=policeFund=fireFund=65535L;
+       CityTax=7;
+
+       EnableMenus();          /* make sure menus are enabled */
+       for (;;)
+       {
+               long lastMapCursor;             /* time value for map window cursor flashing */
+
+               if (WaitedEnough(&lastMapCursor,2))
+               {               /* if we should flash the map cursor */
+                       UpdateMapCursor();              /* update the map cursor */
+               }
+
+
+               if (!menuActive)                /* if no menus are active */
+               {
+                       char moveFlag;
+                       if (CheckKeyState(CNTRLSCAN))   /* Is the control key hit? */
+                       {
+                               int dx, dy;
+                               dx=joyMoveX;
+                               dy=joyMoveY;
+                               
+                               if (CheckKeyState(HOMESCAN))    /* Home arrow */
+                               {       dx--; dy--;
+                               }
+                               if (CheckKeyState(PGUPSCAN))    /* PgUp arrow */
+                               {       dx++; dy--;
+                               }
+                               if (CheckKeyState(ENDSCAN))     /* End arrow */
+                               {       dx--; dy++;
+                               }
+                               if (CheckKeyState(PGDNSCAN))    /* PgDn arrow */
+                               {       dx++; dy++;
+                               }
+                               if (CheckKeyState(RIGHTSCAN))   /* Right arrow */
+                                       dx++;
+                               if (CheckKeyState(LEFTSCAN))    /* Left arrow */
+                                       dx--;
+                               if (CheckKeyState(UPSCAN))      /* Up arrow */
+                                       dy--;
+                               if (CheckKeyState(DOWNSCAN))    /* Down arrow */
+                                       dy++;
+                               if (dx || dy)
+                               {
+                                       DisableMenus();
+                                       freeze=YES;
+                                       EdScroll(dx,dy);
+                                       freeze=NO;
+                               }
+                       }
+                       if (!ScrollLock())
+                       {
+moveagn:
+                               moveFlag=NO;
+                               if (mouse_state.x <= 1)
+                               {       
+                                       if (MapX > 0)
+                                       {
+                                               MapX--;
+                                               moveFlag=YES;
+                                       }
+                               } else if (mouse_state.x >= screenWidth-6)
+                               {
+                                       if (MapX+edWinWid < WORLD_X)
+                                       {
+                                               MapX++;
+                                               moveFlag=YES;
+                                       }
+                               }
+                               if (mouse_state.y < 1 )
+                               {
+                                       if (MapY > 0)
+                                       {
+                                               MapY--;
+                                               moveFlag=YES;
+                                       }
+                               }
+                               else if (mouse_state.y >= screenHeight-6)
+                               {
+                                       if (MapY+edWinLen < WORLD_Y)
+                                       {
+                                               MapY++;
+                                               moveFlag=YES;
+                                       }
+                               }
+
+                               if (moveFlag == YES)
+                               {       
+                                       DisableMenus(); /* locks to current process */
+                                       newMapFlags[CYMAP]=0;
+                                       DrawBigMap();
+#if 0
+                                       DrawObjects();
+#endif
+                                       EnableMenus();
+                                       goto moveagn;
+                               }
+
+                       }                /* End of "if (!ScrollLock" */
+               }       /* End if if (!menuActive) */
+               if (KBHit() || CheckMouseEvents())              /* if an event happened */
+               {
+                       DisableMenus();
+                       while(KBHit())
+                       {       DoKey();
+                       }
+                       while (CheckMouseEvents())
+                       {       DoEvent();
+                       }
+                       lastEvent=TickCount();
+               }
+               if (simSpeed == 0)
+               {
+                       if (WaitedEnough(&updateWait, 18*3))
+                       {               DisableMenus();
+                                       UpdateEdWindow();
+                       }
+               }
+#if DEBUGINI
+       OutStr("\nMAIN: re-enable");
+#endif
+
+               EnableMenus();  /* Make sure the menus are enabled */
+               copyOK=YES;
+#if DEBUGINI
+       OutStr("\nMAIN: copyok, pass");
+#endif
+               Pass();
+               copyOK=NO;
+#if DEBUGINI
+       OutStr("\nMAIN: copy not OK");
+#endif
+       }
+}
+
+SetGameYear()          /* get game year */
+{
+       Rect verBox;
+       static char *label="Enter Game Year:";          /* label for window */
+
+       char dateBuffer[10];            /* buffer for date */
+       EVENT event;
+       char *savePtr;
+       int len, x, y, i,c, optLens[8];
+       Rect tmpBox;
+       Size strSize;
+       const char **optPtr;
+       int posIndex=(-1);
+       long tmpTime;
+
+       FlushKeys();
+
+       CenterRect(&verBox,18,5);
+
+       tmpBox=*AdjRect(&verBox);
+       savePtr=GSaveRect(&tmpBox);
+
+       GRectFill(&tmpBox,BUDGFC+PMGREY);
+       GSetAttrib(BUDGBC,BUDGBC,PWHITE);
+       GRectOutline(&tmpBox, 4);
+                               /* Outline outline in BLACK */
+       GSetAttrib(BLACK,BLACK,PBLACK);
+       GRectOutline(&tmpBox,1);
+       GSetAttrib(BUDGBC,BUDGFC,PINV|PWHITE);
+       PrintRectLines(&verBox,verBox.top,label);
+       i=20;
+       x=verBox.left+i;
+       y=verBox.bottom-2;
+       GSetAttrib(BUDGBC,BUDBOXC,PINV|PWHITE);
+
+/*     GSetAttrib(BUDGBC,BUDBOXC,0); */
+/*     TempFullScreenCursor(); */
+
+       sprintf(dateBuffer,"%4d",(CityTime/48)+1900);           /* set date */
+       GetStrSetNum(); /* Numbers only */
+       GetStrn(verBox.left+6,verBox.top+3,dateBuffer,5,1);             /* allow user to edit the date and set eos */
+       GetStrSetAll(); /* allow any alphnum input */
+       if(strlen(dateBuffer) == 4) {           /* if they entered a good date */
+               tmpTime=(atoi(dateBuffer)-1900)*48L;            /* set new date */
+               if (tmpTime > 0)
+                       CityTime=tmpTime;
+       } else {                /* if not the correct length */
+               MakeSound(7);           /* this should be CANTSND for bad date */
+       }
+       for(i=0;i < 100;i++) {          /* kill any and all events */
+               GetMouseEvent(&event);          /* get event */
+       }
+/*     RemoveTempCursor(); */
+       GRestoreRect(&tmpBox,savePtr);
+       DoDate();               /* update the date in the edit window */
+}
+
+int PSBound(a,n,b)             /* return number between a and b */
+{
+       if(n < a) n=a;
+       if(n > b) n=b;
+       return n;
+}
+
+/* here is the concept for SetTerrainParameters():
+ZDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD?
+3                                    3
+3    Terrain Creation Parameters     3
+3                                    3
+3    Number     Number     River     3
+3   of Trees   of Lakes  Curviness   3
+3                                    3
+3   \11 xxx% \10   \11 xxx% \10   \11 xxx% \10   3
+3                                    3
+3  ZDDDDDDDD?            ZDDDDDDDD?  3
+3  3   Go   3            3 Cancel 3  3
+3  @DDDDDDDDY            @DDDDDDDDY  3
+@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDY
+*/
+SetTerrainParameters()         /* allow user to set up terrain grneration parameters */
+{
+       char *savePtr;          /* pointer to saved screen data */
+       char temStr[20];                /* temporary string for percentages */
+       EVENT event;            /* temporary event */
+       int atButton=0;         /* current button we're at */
+       int buttonDown=0;               /* flag telling if mouse button is down */
+       int goFlag=0;           /* flag telling if terrain is to be generated */
+       long startTime;         /* temporary timer value */
+       int tem;                /* temporary counter */
+       int x,y;                /* temporary positions */
+       Rect wRect;             /* rectangle showing extents of window */
+       Rect tmpRect;           /* temporary rectangle for adjusted window rectangle */
+       Point buttonPos[8];             /* positions of buttons */
+
+       FlushKeys();            /* do something...flush keyboard buffer? */
+
+       CenterRect(&wRect,36,10);               /* center our window */
+
+       tmpRect=*AdjRect(&wRect);
+       savePtr=GSaveRect(&tmpRect);
+
+       GRectFill(&tmpRect,BUDGFC+PMGREY);
+       GSetAttrib(BUDGBC,BUDGBC,PWHITE);
+       GRectOutline(&tmpRect,4);
+                               /* Outline outline in BLACK */
+       GSetAttrib(BLACK,BLACK,PBLACK);
+       GRectOutline(&tmpRect,1);
+       GSetAttrib(BUDGBC,BUDGFC,PINV|PWHITE);
+       PrintRectLines(&wRect,wRect.top,"Terrain Creation Parameters");
+       x=(wRect.left+2)*8;
+       y=(wRect.top+2)*fontHeight;
+       GPPrintf(x+(1*8),y+(1*fontHeight)-3," Number     Number     River  ");
+       GPPrintf(x+(1*8),y+(2*fontHeight)-3,"of Trees   of Lakes  Curviness");
+
+       buttonPos[0].h=wRect.left+3;            /* positions of buttons */
+       buttonPos[1].h=wRect.left+10;
+       buttonPos[2].h=wRect.left+14;
+       buttonPos[3].h=wRect.left+21;
+       buttonPos[4].h=wRect.left+25;
+       buttonPos[5].h=wRect.left+32;
+       for(tem=0;tem < 6;tem++) {
+               buttonPos[tem].v=wRect.top+5;           /* set vertical position */
+       }
+       buttonPos[6].h=wRect.left+3;
+       buttonPos[7].h=wRect.left+25;
+       buttonPos[6].v=buttonPos[7].v=wRect.top+8;
+
+       GSetAttrib(BUDGBC,BUDBOXC,PINV|PWHITE);
+       for(tem=0;tem < 3;tem++) {              /* for each set of value buttons */
+               AddTextButton(buttonPos[tem*2],"\11",0x800+tem*2);                /* add button */
+               AddTextButton(buttonPos[tem*2+1],"\10",0x801+tem*2);              /* add button */
+       }
+       AddTextButton(buttonPos[6],"   Go   ",0x806);           /* add 'go' button */
+       AddTextButton(buttonPos[7]," Cancel ",0x807);           /* add 'cancel' button */
+
+               /* output initial values */
+       GSetAttrib(BUDGBC,BUDGFC,PINV|PWHITE);
+       sprintf(temStr,"%3d%%%%",treeLevel);            /* get string for tree level */
+       GPPrintf(x+(3*8),y+(3*fontHeight),temStr);              /* output string */
+       sprintf(temStr,"%3d%%%%",lakeLevel);            /* get string for lake level */
+       GPPrintf(x+(14*8),y+(3*fontHeight),temStr);             /* output string */
+       sprintf(temStr,"%3d%%%%",curvLevel);            /* get string for curviness level */
+       GPPrintf(x+(25*8),y+(3*fontHeight),temStr);             /* output string */
+
+/*     GSetAttrib(BUDGBC,BUDBOXC,0); */
+       TempFullScreenCursor();         /* give us a cursor */
+
+       while(1) {              /* until break */
+               if(0) {         /* never unless below code calls it */
+repos:
+                       SetMouseAtButton(atButton+0x800);
+               }
+               while (KBHit())         /* Clear any keys pressed */
+               {       
+                       switch (GetECH())
+                       {       case 27:                /* if escape */
+                               case 'C':               /* (or 'cancel') */
+                               case 'c':
+                                       goFlag=0;               /* don't create random terrain */
+                                       goto xit;
+                               case 13:                /* if carriage return */
+                               case 'G':               /* (or 'go') */
+                               case 'g':
+                                       goFlag=1;               /* create random terrain */
+                                       goto xit;
+                               case '+':       atButton=((atButton+1) % 8);            /* for each button */
+                                                       goto repos;
+                               case '-':
+                                                       atButton=(atButton)?(atButton-1):7;
+                                                       goto repos;
+                       }
+               }
+               if(CheckMouseEvents()) {                /* if there's an activity */
+                       GetMouseEvent(&event);          /* get event */
+downAgain:
+                       switch(event.object) {          /* get event id */
+                               case 0x800:             /* if - trees */
+                                       treeLevel=PSBound(0,treeLevel-1,100);
+                                       goto updateValues;              /* update values */
+                               case 0x801:             /* if + trees */
+                                       treeLevel=PSBound(0,treeLevel+1,100);
+                                       goto updateValues;              /* update values */
+                               case 0x802:             /* if - lakes */
+                                       lakeLevel=PSBound(0,lakeLevel-1,100);
+                                       goto updateValues;              /* update values */
+                               case 0x803:             /* if + lakes */
+                                       lakeLevel=PSBound(0,lakeLevel+1,100);
+                                       goto updateValues;              /* update values */
+                               case 0x804:             /* if - curviness */
+                                       curvLevel=PSBound(0,curvLevel-1,100);
+                                       goto updateValues;              /* update values */
+                               case 0x805:             /* if + curviness */
+                                       curvLevel=PSBound(0,curvLevel+1,100);
+                                       goto updateValues;              /* update values */
+                               case 0x806:             /* if 'go' */
+                                       goFlag=1;               /* return flag telling to create terrain */
+                                       break;
+                               case 0x807:             /* if 'cancel' */
+                                       goFlag=0;               /* return flag telling to create terrain */
+                                       break;
+                       }
+                       if(0) {         /* only if above code calls us */
+updateValues:
+                               RemoveTempCursor();             /* remove cursor from screen */
+                               GSetAttrib(BUDGBC,BUDGFC,PINV|PWHITE);
+                               sprintf(temStr,"%3d%%%%",treeLevel);            /* get string for tree level */
+                               GPPrintf(x+(3*8),y+(3*fontHeight),temStr);              /* output string */
+                               sprintf(temStr,"%3d%%%%",lakeLevel);            /* get string for lake level */
+                               GPPrintf(x+(14*8),y+(3*fontHeight),temStr);             /* output string */
+                               sprintf(temStr,"%3d%%%%",curvLevel);            /* get string for curviness level */
+                               GPPrintf(x+(25*8),y+(3*fontHeight),temStr);             /* output string */
+                               TempFullScreenCursor();         /* put cursor back */
+                               if(!buttonDown) {               /* if button was not down */
+                                       buttonDown=1;           /* set button down flag */
+                                       startTime=TickCount();          /* get current time */
+                                       while(StillDown()) {            /* while a button is down */
+                                               if(TickCount()-startTime > 5) {         /* if autorepeat is up */
+                                                       goto downAgain;
+                                               }
+                                       }
+                                       buttonDown=0;           /* button is no longer down */
+                               } else {                /* if button is already down */
+                                       if(StillDown()) {               /* if button is still down */
+                                               startTime=TickCount();          /* get current time */
+                                               while(startTime == TickCount()) ;               /* wait for 1/18th of a second */
+                                               goto downAgain;
+                                       }
+                                       buttonDown=0;           /* no button is down */
+                               }
+                       }
+                       if(event.object == 0x806 || event.object == 0x807) {            /* if one of the exit buttons */
+xit:
+                               break;          /* exit loop */
+                       }
+               }
+       }
+
+       for(tem=0x800;tem <= 0x809;tem++) {             /* remove buttons from hot list */
+               DelButtonHot(tem);
+       }
+       RemoveTempCursor();             /* remove our cursor */
+       GRestoreRect(&tmpRect,savePtr);
+       return goFlag;          /* return flag telling if terrain is to be created */
+}
diff --git a/src/sim/terrain/terragen.c b/src/sim/terrain/terragen.c
new file mode 100644 (file)
index 0000000..de3e3aa
--- /dev/null
@@ -0,0 +1,508 @@
+/* terragen.c:  Terrain generator
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+
+/* Micropolis simulator code.  Copyright 1988, 1989 Maxis, Will Wright */
+/* modified by Paul Schmidt 10-89 to implement terrain editor quickly... - rax */
+
+#include "..\sim\sim.h"
+
+#define TRUE 1
+#define FALSE 0
+#define WORLD_X 120
+#define WORLD_Y 100
+#define RIVER 2
+#define REDGE 3
+#define CHANNEL 4
+#define WOODS 37
+#define BL 4096
+#define BN 8192
+#define BLN BL+BN
+
+#define WATER_LOW      2               /* range for water */
+#define WATER_HIGH     20
+#define WOODS_LOW      21              /* range for woods */
+#define WOODS_HIGH     39
+
+static int XStart, YStart;
+static int  Dir, LastDir;
+
+                                       /* trash values for GRand()     */
+static int GRanArray[5] = { 1018,4521,202,419,3 }; 
+
+extern int treeLevel;          /* level for tree creation (terra.c) */
+extern int lakeLevel;          /* level for lake creation (terra.c) */
+extern int curvLevel;          /* level for river curviness (terra.c) */
+
+rax_ClearMap()
+{
+register int x, y;
+
+       for (x=0; x<WORLD_X; x++)
+               for (y=0; y<WORLD_Y; y++)
+                       Map[x][y] = 0;
+}
+
+rax_WaterEdges()               /* set water edges */
+{
+       register int x,y;               /* temporary counters */
+
+       for(x=0;x < WORLD_X;x++) {
+               for(y=0;y < WORLD_Y;y++) {
+                       if((Map[x][y]&LOMASK) >= WATER_LOW && (Map[x][y]&LOMASK) <= WATER_HIGH) {               /* if water */
+                               if(x > 0) {
+                                       if((Map[x-1][y]&LOMASK) < WATER_LOW || (Map[x-1][y]&LOMASK) > WATER_HIGH) {             /* if nearest object is not water */
+                                               goto edge;
+                                       }
+                               }
+                               if(x < WORLD_X-1) {
+                                       if((Map[x+1][y]&LOMASK) < WATER_LOW || (Map[x+1][y]&LOMASK) > WATER_HIGH) {             /* if nearest object is not water */
+                                               goto edge;
+                                       }
+                               }
+                               if(y > 0) {
+                                       if((Map[x][y-1]&LOMASK) < WATER_LOW || (Map[x][y-1]&LOMASK) > WATER_HIGH) {             /* if nearest object is not water */
+                                               goto edge;
+                                       }
+                               }
+                               if(y < WORLD_Y-1) {
+                                       if((Map[x][y+1]&LOMASK) < WATER_LOW || (Map[x][y+1]&LOMASK) > WATER_HIGH) {             /* if nearest object is not water */
+edge:
+                                               Map[x][y]=REDGE;                /* set river edge */
+                                               continue;
+                                       }
+                               }
+                       }
+               }
+       }
+       for(x=0;x < WORLD_X;x++) {
+               for(y=0;y < WORLD_Y;y++) {
+                       if((Map[x][y]&LOMASK) != CHANNEL && (Map[x][y]&LOMASK) >= WATER_LOW && (Map[x][y]&LOMASK) <= WATER_HIGH) {              /* if water which is not a channel */
+                               if(x > 0) {
+                                       if((Map[x-1][y]&LOMASK) < WATER_LOW || (Map[x-1][y]&LOMASK) > WATER_HIGH) {             /* if nearest object is not water */
+                                               continue;
+                                       }
+                               }
+                               if(x < WORLD_X-1) {
+                                       if((Map[x+1][y]&LOMASK) < WATER_LOW || (Map[x+1][y]&LOMASK) > WATER_HIGH) {             /* if nearest object is not water */
+                                               continue;
+                                       }
+                               }
+                               if(y > 0) {
+                                       if((Map[x][y-1]&LOMASK) < WATER_LOW || (Map[x][y-1]&LOMASK) > WATER_HIGH) {             /* if nearest object is not water */
+                                               continue;
+                                       }
+                               }
+                               if(y < WORLD_Y-1) {
+                                       if((Map[x][y+1]&LOMASK) < WATER_LOW || (Map[x][y+1]&LOMASK) > WATER_HIGH) {             /* if nearest object is not water */
+                                               continue;
+                                       }
+                               }
+                               Map[x][y]=RIVER;                /* make it a river */
+                       }
+               }
+       }
+       for(x=0;x < WORLD_X;x++) {
+               for(y=0;y < WORLD_Y;y++) {
+                       if((Map[x][y]&LOMASK) >= WOODS_LOW && (Map[x][y]&LOMASK) <= WOODS_HIGH) {               /* if woods */
+                               if(x > 0) {
+                                       if(Map[x-1][y] == RIVER || Map[x-1][y] == CHANNEL) {            /* if nearest object is water */
+                                               Map[x][y]=REDGE;                /* make it water's edge */
+                                               continue;
+                                       }
+                               }
+                               if(x < WORLD_X-1) {
+                                       if(Map[x+1][y] == RIVER || Map[x+1][y] == CHANNEL) {            /* if nearest object is water */
+                                               Map[x][y]=REDGE;                /* make it water's edge */
+                                               continue;
+                                       }
+                               }
+                               if(y > 0) {
+                                       if(Map[x][y-1] == RIVER || Map[x][y-1] == CHANNEL) {            /* if nearest object is water */
+                                               Map[x][y]=REDGE;                /* make it water's edge */
+                                               continue;
+                                       }
+                               }
+                               if(y < WORLD_Y-1) {
+                                       if(Map[x][y+1] == RIVER || Map[x][y+1] == CHANNEL) {            /* if nearest object is water */
+                                               Map[x][y]=REDGE;                /* make it water's edge */
+                                               continue;
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
+#define RADIUS 18
+
+rax_MakeIsland()
+{
+       register int x,y,z;
+       
+       for (x=0; x<WORLD_X; x++)
+               for (y=0; y<WORLD_Y; y++)
+                       Map[x][y] = RIVER;
+       for (x=5; x<WORLD_X-5; x++)
+               for (y=5; y<WORLD_Y-5; y++)
+                       Map[x][y] = 0;
+       for (x=0; x<WORLD_X-5; x+=2)    {
+               MapX= x ;
+               MapY= rax_EGRand(RADIUS);
+               rax_BRivPlop();
+               MapY= 90-rax_EGRand(RADIUS);
+               rax_BRivPlop();
+               MapY= 0;
+               rax_SRivPlop();
+               MapY= 94;
+               rax_SRivPlop();
+       }
+       for (y=0; y<WORLD_Y-5; y+=2)    {
+               MapY= y ;
+               MapX= rax_EGRand(RADIUS);
+               rax_BRivPlop();
+               MapX= 110-rax_EGRand(RADIUS);
+               rax_BRivPlop();
+               MapX= 0;
+               rax_SRivPlop();
+               MapX= 114;
+               rax_SRivPlop();
+       }
+}
+
+rax_MakeLakes()
+{
+       int Lim1, Lim2, t, z;
+       register int x, y;
+       
+/*     Lim1 = rax_GRand(10);           /**/
+       Lim1=lakeLevel/2;
+       for (t = 0; t < Lim1; t++)  {
+               x = rax_GRand(99) + 10;
+               y = rax_GRand(80) + 10;
+               Lim2 = rax_GRand(12)+2;
+               for (z = 0; z < Lim2; z++)  {
+                       MapX = x - 6 + rax_GRand(12);
+                       MapY = y - 6 + rax_GRand(12);
+                       if (rax_GRand(4))  rax_SRivPlop();
+                       else  rax_BRivPlop();
+               }
+       }
+}
+
+rax_GetRandStart()
+{
+       XStart = 40 + rax_GRand(40);
+       YStart = 33 + rax_GRand(33);
+       MapX = XStart;
+       MapY = YStart;
+}
+
+rax_DoTrees()
+{
+       int x,xloc,yloc;
+
+       for(x=0;x < (treeLevel*3);x++) {
+               xloc=rax_GRand(119);
+               yloc=rax_GRand(99);
+               rax_TreeSplash(xloc,yloc);
+       }
+       rax_SmoothTrees();
+       rax_SmoothTrees();
+}
+
+rax_TreeSplash(xloc,yloc)
+int xloc,yloc;
+{
+       int  Dis, Dir;
+       register int xoff, yoff,z;
+       
+       Dis = rax_GRand(100+(treeLevel*2))+50;
+       MapX = xloc;
+       MapY = yloc;
+       for (z=0; z<Dis; z++)   {
+               Dir = rax_GRand(7);
+               rax_MoveMap(Dir);
+               if (!(rax_TestBounds(MapX,MapY))) return;
+               if (Map[MapX][MapY] == 0)  Map[MapX][MapY] = WOODS+ BLN;
+       }
+}
+       
+rax_SmoothRiver()
+{
+ static int DX[4] = {-1, 0, 1, 0};
+ static int DY[4] = { 0, 1, 0,-1};
+ static int REdTab[16] = { 13+BL,13+BL,17+BL,15+BL,5+BL,2,19+BL,
+                                                  17+BL,9+BL,11+BL,2,13+BL,7+BL,9+BL,5+BL,2};
+ int  bitindex, z,Xtem,Ytem;
+ register int temp,MapX,MapY;
+ for (MapX = 0; MapX < WORLD_X; MapX++)
+       for (MapY = 0; MapY < WORLD_Y; MapY++)
+               if (Map[MapX][MapY] == REDGE)   {
+                       bitindex = 0;
+                       for (z=0; z<4; z++)     {
+                               bitindex = bitindex << 1;
+                               Xtem = MapX + DX[z];
+                               Ytem = MapY + DY[z];
+                               if (rax_TestBounds(Xtem, Ytem))
+/*                                     if(Map[Xtem][Ytem]) bitindex++;         /* original code */
+                                       if((Map[Xtem][Ytem]&LOMASK) && ((Map[Xtem][Ytem]&LOMASK) < WOODS_LOW || (Map[Xtem][Ytem]&LOMASK) > WOODS_HIGH)) bitindex++;             /* new code - rax */
+                       }
+                       temp = REdTab[bitindex & 15];
+                       if ((temp != 2) && (rax_GRand(1))) temp++;
+                       Map[MapX][MapY] = temp;
+               }
+ }
+
+IsTree(cell)           /* return TRUE or FALSE if cell value is a tree cell */
+register int cell;
+{
+       if((cell&LOMASK) >= WOODS_LOW && (cell&LOMASK) <= WOODS_HIGH) return TRUE; else return FALSE;
+}
+rax_SmoothTrees()
+{
+ static int DX[4] = {-1, 0, 1, 0};
+ static int DY[4] = { 0, 1, 0,-1};
+ static int TEdTab[16] = {0,0,0,34,0,0,36,35,0,32,0,33,30,31,29,37};
+ int   bitindex, z,Xtem,Ytem;
+ register int temp,MapX,MapY;
+ for (MapX = 0; MapX < WORLD_X; MapX++)
+       for (MapY = 0; MapY < WORLD_Y; MapY++)
+               if (IsTree(Map[MapX][MapY]))    {
+                       bitindex = 0;
+                       for (z=0; z<4; z++)     {
+                               bitindex = bitindex << 1;
+                               Xtem = MapX + DX[z];
+                               Ytem = MapY + DY[z];
+                               if (rax_TestBounds(Xtem, Ytem))         
+                                       if(IsTree(Map[Xtem][Ytem])) bitindex++;
+                               
+                       }
+                       temp = TEdTab[bitindex & 15];
+                       if (temp) {
+                               if (temp != 37) 
+                                       if ((MapX+MapY) & 1)
+                                               temp = temp-8;
+                               Map[MapX][MapY] = temp+BLN;
+                       }
+                       else Map[MapX][MapY] = temp;
+               }
+ }
+rax_DoRivers()
+{      
+       LastDir = rax_GRand(3);
+       Dir = LastDir;
+       rax_DoBRiv();
+       MapX = XStart;
+       MapY = YStart;
+       LastDir = LastDir ^ 4;
+       Dir = LastDir;
+       rax_DoBRiv();   
+       MapX = XStart;
+       MapY = YStart;
+       LastDir = rax_GRand(3);
+       rax_DoSRiv();
+}
+
+rax_DoBRiv()
+{
+       while(rax_TestBounds (MapX+4, MapY+4)) {
+               rax_BRivPlop();
+               if(rax_GRand(curvLevel+10) < 10) {
+                       Dir=LastDir;
+               } else {
+                       if(rax_GRand(curvLevel+100) > 90) {
+                               Dir++;
+                       }
+                       if(rax_GRand(curvLevel+100) > 90) {
+                               Dir--;
+                       }
+               }
+               rax_MoveMap(Dir);
+       }
+}
+
+rax_DoSRiv()
+{
+       while(rax_TestBounds (MapX+3, MapY+3)) {
+               rax_SRivPlop();
+               if(rax_GRand(curvLevel+10) < 10) {
+                       Dir=LastDir;
+               } else {
+                       if(rax_GRand(curvLevel+100) > 90) {
+                               Dir++;
+                       }
+                       if(rax_GRand(curvLevel+100) > 90) {
+                               Dir--;
+                       }
+               }
+               rax_MoveMap(Dir);
+       }
+}
+
+rax_MoveMap    (dir)
+int dir;
+{
+static int DirTab[2][8] ={             { 0, 1, 1, 1, 0, -1, -1, -1},
+                                                               {-1,-1, 0, 1, 1,  1,  0, -1}    };
+       dir = dir & 7;
+       MapX += DirTab[0][dir];
+       MapY += DirTab[1][dir];
+}
+
+
+
+
+rax_BRivPlop()
+{
+static int BRMatrix[9][9] ={
+               {0,0,0,3,3,3,0,0,0},
+               {0,0,3,2,2,2,3,0,0},
+               {0,3,2,2,2,2,2,3,0},
+               {3,2,2,2,2,2,2,2,3},
+               {3,2,2,2,4,2,2,2,3},
+               {3,2,2,2,2,2,2,2,3},
+               {0,3,2,2,2,2,2,3,0},
+               {0,0,3,2,2,2,3,0,0},
+               {0,0,0,3,3,3,0,0,0}             };
+int x, y;
+
+       for (x=0; x<9; x++)
+               for (y=0; y<9; y++)
+                       rax_PutOnMap (BRMatrix[y][x], x, y);
+}
+
+rax_SRivPlop()
+{
+static int SRMatrix[6][6] ={
+               {0,0,3,3,0,0},
+               {0,3,2,2,3,0},
+               {3,2,2,2,2,3},
+               {3,2,2,2,2,3},
+               {0,3,2,2,3,0},
+               {0,0,3,3,0,0}           };
+int x, y;
+
+       for (x=0; x<6; x++)
+               for (y=0; y<6; y++)
+                       rax_PutOnMap (SRMatrix[y][x], x, y);
+}
+
+rax_PutOnMap (Mchar, Xoff, Yoff)
+int Mchar, Xoff, Yoff;
+{
+register int Xloc, Yloc, temp;
+
+       if (Mchar == 0) return;
+       Xloc = MapX + Xoff;
+       Yloc = MapY + Yoff;
+       if (rax_TestBounds (Xloc, Yloc) == FALSE) return (FALSE);
+       if (temp = Map [Xloc][Yloc])    {
+               temp = temp & 1023;
+               if (temp == RIVER) 
+                       if (Mchar != CHANNEL)
+                               return (FALSE);
+               if (temp == CHANNEL) return (FALSE);
+       }                                       
+       Map [Xloc][Yloc] = Mchar;       
+}
+
+rax_TestBounds(x, y)
+register int x, y;
+{
+       if ((( x >= 0) && (x < WORLD_X)) && (( y >= 0) && (y < WORLD_Y)))
+               return (TRUE);
+       return (FALSE);
+}
+
+
+
+rax_EGRand(limit)
+int limit;
+{
+       int x,z;
+       
+       z= rax_GRand(limit);
+       x= rax_GRand(limit);
+       if (z < x) return(z);
+       return(x);
+}
+
+#define RANMASK 32767
+
+rax_GRand(range)                       /* stupid but works  */
+int range;
+{
+       register x, newv, divisor;
+       
+       divisor = RANMASK/ (range+1);
+       newv = 0;
+       for (x=4; x!=0; x--)
+               newv += (GRanArray[x] = GRanArray[x-1]);
+       GRanArray[0] = newv;
+       x = (newv & RANMASK) / divisor;
+       if (x > range)  return(range);
+       return(x);
+}
diff --git a/src/sim/w_budget.c b/src/sim/w_budget.c
new file mode 100644 (file)
index 0000000..5fc5e4f
--- /dev/null
@@ -0,0 +1,349 @@
+/* w_budget.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+float roadPercent = 0.0;
+float policePercent = 0.0;
+float firePercent = 0.0;
+QUAD roadValue;
+QUAD policeValue;
+QUAD fireValue;
+QUAD roadMaxValue;
+QUAD policeMaxValue;
+QUAD fireMaxValue;
+int MustDrawCurrPercents = 0;
+int MustDrawBudgetWindow = 0;
+int SetBudget(char *flowStr, char *previousStr,
+             char *currentStr, char *collectedStr, short tax);
+
+
+void InitFundingLevel(void)
+{
+  firePercent = 1.0;           /* 1.0 */
+  fireValue = 0;
+  policePercent = 1.0;         /* 1.0 */
+  policeValue = 0;
+  roadPercent = 1.0;           /* 1.0 */
+  roadValue = 0;
+  drawBudgetWindow();
+  drawCurrPercents();
+}
+
+
+DoBudget()
+{
+  DoBudgetNow(0);
+}
+
+
+DoBudgetFromMenu()
+{
+  DoBudgetNow(1);
+}
+
+
+DoBudgetNow(int fromMenu)
+{
+  QUAD yumDuckets;
+  QUAD total;
+  QUAD moreDough;
+  QUAD fireInt, policeInt, roadInt;
+
+  fireInt = (int)(((float)FireFund) * firePercent);
+  policeInt = (int)(((float)PoliceFund) * policePercent);
+  roadInt = (int)(((float)RoadFund) * roadPercent);
+
+  total = fireInt + policeInt + roadInt;
+
+  yumDuckets = TaxFund + TotalFunds;
+
+  if (yumDuckets > total) {
+    fireValue = fireInt;
+    policeValue = policeInt;
+    roadValue = roadInt;
+  } else if (total > 0) {
+    if (yumDuckets > roadInt) {
+      roadValue = roadInt;
+      yumDuckets -= roadInt;
+
+      if (yumDuckets > fireInt) {
+       fireValue = fireInt;
+       yumDuckets -= fireInt;
+
+       if (yumDuckets > policeInt) {
+         policeValue = policeInt;
+         yumDuckets -= policeInt;
+       } else {
+         policeValue = yumDuckets;
+         if (yumDuckets > 0)
+           policePercent = ((float)yumDuckets) / ((float)PoliceFund);
+         else
+           policePercent = 0.0;
+       }
+      } else {
+       fireValue = yumDuckets;
+       policeValue = 0;
+       policePercent = 0.0;
+       if (yumDuckets > 0)
+         firePercent = ((float)yumDuckets) / ((float)FireFund);
+       else
+         firePercent = 0.0;
+      }
+    } else {
+      roadValue = yumDuckets;
+      if (yumDuckets > 0)
+       roadPercent = ((float)yumDuckets) / ((float)RoadFund);
+      else
+       roadPercent = 0.0;
+
+      fireValue = 0;
+      policeValue = 0;
+      firePercent = 0.0;
+      policePercent = 0.0;
+    }
+  } else {
+    fireValue = 0;
+    policeValue = 0;
+    roadValue = 0;
+    firePercent = 1.0;
+    policePercent = 1.0;
+    roadPercent = 1.0;
+  }
+
+  fireMaxValue = FireFund;
+  policeMaxValue = PoliceFund;
+  roadMaxValue = RoadFund;
+
+  drawCurrPercents();
+
+ noMoney:      
+  if ((!autoBudget) || fromMenu) {
+    if (!autoBudget) {
+      /* TODO: append the the current year to the budget string */
+    }
+
+    ShowBudgetWindowAndStartWaiting();
+
+    if (!fromMenu) {
+      FireSpend = fireValue;
+      PoliceSpend = policeValue;
+      RoadSpend = roadValue;
+
+      total = FireSpend + PoliceSpend + RoadSpend;
+      moreDough = (QUAD)(TaxFund - total);
+      Spend(-moreDough);
+    }
+    drawBudgetWindow();
+    drawCurrPercents();
+    DoUpdateHeads();
+
+  } else { /* autoBudget & !fromMenu */
+    if ((yumDuckets) > total) {
+      moreDough = (QUAD)(TaxFund - total);
+      Spend(-moreDough);
+      FireSpend = FireFund;
+      PoliceSpend = PoliceFund;
+      RoadSpend = RoadFund;
+      drawBudgetWindow();
+      drawCurrPercents();
+      DoUpdateHeads();
+    } else {
+      autoBudget = 0; /* XXX: force autobudget */
+      MustUpdateOptions = 1;
+      ClearMes();
+      SendMes(29);
+      goto noMoney;
+    }
+  }
+}
+
+
+drawBudgetWindow(void)
+{
+  MustDrawBudgetWindow = 1;
+}
+
+
+ReallyDrawBudgetWindow(void)
+{
+  short cashFlow, cashFlow2;
+  char numStr[256], dollarStr[256], collectedStr[256],
+       flowStr[256], previousStr[256], currentStr[256];
+
+  cashFlow = TaxFund - fireValue - policeValue - roadValue;
+       
+  cashFlow2 = cashFlow;
+  if (cashFlow < 0)   {
+    cashFlow = -cashFlow;
+    sprintf(numStr, "%d", cashFlow);
+    makeDollarDecimalStr(numStr, dollarStr);
+    sprintf(flowStr, "-%s", dollarStr);
+  } else {
+    sprintf(numStr, "%d", cashFlow);
+    makeDollarDecimalStr(numStr, dollarStr);
+    sprintf(flowStr, "+%s", dollarStr);
+  }
+
+  sprintf(numStr, "%d", TotalFunds);
+  makeDollarDecimalStr(numStr, previousStr);
+
+  sprintf(numStr, "%d", cashFlow2 + TotalFunds);
+  makeDollarDecimalStr(numStr, currentStr);
+
+  sprintf(numStr, "%d", TaxFund);
+  makeDollarDecimalStr(numStr, collectedStr);
+
+  SetBudget(flowStr, previousStr, currentStr, collectedStr, CityTax);
+}
+
+
+drawCurrPercents(void)
+{
+  MustDrawCurrPercents = 1;
+}
+
+
+ReallyDrawCurrPercents(void)
+{
+  char num[256];
+  char fireWant[256], policeWant[256], roadWant[256];
+  char fireGot[256], policeGot[256], roadGot[256];
+
+  sprintf(num, "%d", fireMaxValue);
+  makeDollarDecimalStr(num, fireWant);
+
+  sprintf(num, "%d", policeMaxValue);
+  makeDollarDecimalStr(num, policeWant);
+
+  sprintf(num, "%d", roadMaxValue);
+  makeDollarDecimalStr(num, roadWant);
+
+  sprintf(num, "%d", (int)(fireMaxValue * firePercent));
+  makeDollarDecimalStr(num, fireGot);
+
+  sprintf(num, "%d", (int)(policeMaxValue * policePercent));
+  makeDollarDecimalStr(num, policeGot);
+
+  sprintf(num, "%d", (int)(roadMaxValue * roadPercent));
+  makeDollarDecimalStr(num, roadGot);
+
+  SetBudgetValues(roadGot, roadWant, 
+                 policeGot, policeWant, 
+                 fireGot, fireWant);
+}
+
+
+UpdateBudgetWindow()
+{
+  if (MustDrawCurrPercents) {
+    ReallyDrawCurrPercents();
+    MustDrawCurrPercents = 0;
+  }
+  if (MustDrawBudgetWindow) {
+    ReallyDrawBudgetWindow();
+    MustDrawBudgetWindow = 0;
+  }
+}
+
+
+UpdateBudget()
+{
+  drawCurrPercents();
+  drawBudgetWindow();
+  Eval("UIUpdateBudget");
+}
+
+
+ShowBudgetWindowAndStartWaiting()
+{
+  Eval("UIShowBudgetAndWait");
+
+  Pause();
+}
+
+
+SetBudget(char *flowStr, char *previousStr,
+         char *currentStr, char *collectedStr, short tax)
+{
+  char buf[256];
+
+  sprintf(buf, "UISetBudget {%s} {%s} {%s} {%s} {%d}",
+         flowStr, previousStr, currentStr, collectedStr, tax);
+  Eval(buf);
+}
+
+
+SetBudgetValues(char *roadGot, char *roadWant,
+               char *policeGot, char *policeWant,
+               char *fireGot, char *fireWant)
+{
+  char buf[256];
+
+  sprintf(buf, "UISetBudgetValues {%s} {%s} %d {%s} {%s} %d {%s} {%s} %d",
+         roadGot, roadWant, (int)(roadPercent * 100),
+         policeGot, policeWant, (int)(policePercent * 100),
+         fireGot, fireWant, (int)(firePercent * 100));
+  Eval(buf);
+}
+
+
diff --git a/src/sim/w_cam.c b/src/sim/w_cam.c
new file mode 100644 (file)
index 0000000..021f10b
--- /dev/null
@@ -0,0 +1,877 @@
+/* w_cam.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+#ifdef CAM
+
+
+Tk_ConfigSpec SimCamConfigSpecs[] = {
+    {TK_CONFIG_PIXELS, "-width", "width", "Width",
+       0, Tk_Offset(SimCam, w_width), 0},
+    {TK_CONFIG_PIXELS, "-height", "height", "Height",
+       0, Tk_Offset(SimCam, w_height), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+
+Tk_ConfigSpec CamConfigSpecs[] = {
+    {TK_CONFIG_PIXELS, "-wrap", "wrap", "Wrap",
+       0, Tk_Offset(Cam, wrap), 0},
+    {TK_CONFIG_PIXELS, "-steps", "steps", "Steps",
+       0, Tk_Offset(Cam, steps), 0},
+    {TK_CONFIG_PIXELS, "-frob", "frob", "Frob",
+       0, Tk_Offset(Cam, frob), 0},
+    {TK_CONFIG_PIXELS, "-x", "x", "X",
+       0, Tk_Offset(Cam, x), 0},
+    {TK_CONFIG_PIXELS, "-y", "y", "Y",
+       0, Tk_Offset(Cam, y), 0},
+    {TK_CONFIG_PIXELS, "-width", "width", "Width",
+       0, Tk_Offset(Cam, width), 0},
+    {TK_CONFIG_PIXELS, "-height", "height", "Height",
+       0, Tk_Offset(Cam, height), 0},
+    {TK_CONFIG_PIXELS, "-dx", "dx", "Dx",
+       0, Tk_Offset(Cam, dx), 0},
+    {TK_CONFIG_PIXELS, "-dy", "dy", "Dy",
+       0, Tk_Offset(Cam, dy), 0},
+    {TK_CONFIG_PIXELS, "-gx", "gx", "Gx",
+       0, Tk_Offset(Cam, gx), 0},
+    {TK_CONFIG_PIXELS, "-gy", "gy", "Gy",
+       0, Tk_Offset(Cam, gy), 0},
+    {TK_CONFIG_PIXELS, "-dragging", "dragging", "Dragging",
+       0, Tk_Offset(Cam, dragging), 0},
+    {TK_CONFIG_PIXELS, "-setx", "setx", "SetX",
+       "-1", Tk_Offset(Cam, set_x), 0},
+    {TK_CONFIG_PIXELS, "-sety", "sety", "SetY",
+       "-1", Tk_Offset(Cam, set_y), 0},
+    {TK_CONFIG_PIXELS, "-setwidth", "setwidth", "SetWidth",
+       "-1", Tk_Offset(Cam, set_width), 0},
+    {TK_CONFIG_PIXELS, "-setheight", "setheight", "SetHeight",
+       "-1", Tk_Offset(Cam, set_height), 0},
+    {TK_CONFIG_PIXELS, "-setx0", "setx0", "SetX0",
+       "-1", Tk_Offset(Cam, set_x0), 0},
+    {TK_CONFIG_PIXELS, "-sety0", "sety0", "SetY0",
+       "-1", Tk_Offset(Cam, set_y0), 0},
+    {TK_CONFIG_PIXELS, "-setx1", "setx1", "SetX1",
+       "-1", Tk_Offset(Cam, set_x1), 0},
+    {TK_CONFIG_PIXELS, "-sety1", "sety1", "SetY1",
+       "-1", Tk_Offset(Cam, set_y1), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+
+Tcl_HashTable CamCmds;
+
+int next_cam_id = 1;
+
+
+static void
+DisplaySimCam(ClientData clientData)
+{
+  SimCam *scam = (SimCam *) clientData;
+  Tk_Window tkwin = scam->tkwin;
+  Pixmap pm = None;
+  Drawable d;
+
+  scam->flags &= ~VIEW_REDRAW_PENDING;
+  if (scam->visible && (tkwin != NULL) && Tk_IsMapped(tkwin)) {
+    DoUpdateCam(scam);
+  }
+}
+
+
+void
+DestroyCam(SimCam *scam, Cam *cam)
+{
+  Cam **cp;
+
+  for (cp = &scam->cam_list;
+       (*cp) != NULL;
+       cp = &((*cp)->next)) {
+    if ((*cp) == cam) {
+      (*cp) = cam->next;
+      scam->cam_count--;
+      if (cam->front != NULL) {
+       ckfree(cam->front);
+      }
+      if (cam->back != NULL) {
+       if (cam->back->mem != NULL) {
+         ckfree(cam->back->mem);
+       }
+       ckfree(cam->back);
+      }
+      if (cam->rule != NULL) {
+       ckfree(cam->rule);
+      }
+      if (cam->name != NULL) {
+       ckfree(cam->name);
+      }
+      ckfree(cam);
+      break;
+    }
+  }
+}
+
+
+void
+DestroyScam(ClientData cdata)
+{
+  SimCam *scam = (SimCam *)cdata;
+  SimCam **cp;
+
+  CancelRedrawView(scam);
+
+  while (scam->cam_list) {
+    DestroyCam(scam, scam->cam_list);
+  }
+
+  for (cp = &sim->scam;
+       (*cp) != NULL;
+       cp = &((*cp)->next)) {
+    if ((*cp) == scam) {
+      (*cp) = scam->next;
+      sim->scams--;
+      break;
+    }
+  }
+
+  if (scam->shminfo != NULL) {
+    XShmDetach(scam->x->dpy, scam->shminfo);
+    shmdt(scam->shminfo->shmaddr);
+    shmctl(scam->shminfo->shmid, IPC_RMID, 0);
+    ckfree(scam->shminfo);
+    scam->shminfo = NULL;
+    if (scam->image) {
+      scam->image->data = NULL;
+      scam->data = NULL;
+      XDestroyImage(scam->image);
+      scam->image = NULL;
+    }
+  } else {
+    if (scam->image) {
+      if (scam->image->data) {
+       ckfree(scam->image->data);
+       scam->image->data = NULL;
+      }
+      scam->data = NULL;
+      XDestroyImage(scam->image);
+      scam->image = NULL;
+    }
+  }
+
+  DecRefDisplay(scam->x);
+
+  ckfree((char *) scam);
+}
+
+
+void
+CamEventProc(ClientData clientData, XEvent *eventPtr)
+{
+  SimCam *scam = (SimCam *) clientData;
+
+  if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {
+    scam->visible = 1;
+    EventuallyRedrawCam(scam);
+  } else if (eventPtr->type == MapNotify) {
+    scam->visible = 1;
+  } else if (eventPtr->type == UnmapNotify) {
+    scam->visible = 0;
+  } else if (eventPtr->type == VisibilityNotify) {
+    if (eventPtr->xvisibility.state == VisibilityFullyObscured)
+      scam->visible = 0;
+    else
+      scam->visible = 1;
+  } else if (eventPtr->type == ConfigureNotify) {
+    DoResizeCam(scam,
+               eventPtr->xconfigure.width,
+               eventPtr->xconfigure.height);
+    EventuallyRedrawCam(scam);
+  } else if (eventPtr->type == DestroyNotify) {
+    Tcl_DeleteCommand(scam->interp, Tk_PathName(scam->tkwin));
+    scam->tkwin = NULL;
+    if (scam->flags & VIEW_REDRAW_PENDING) {
+      Tk_CancelIdleCall(DisplaySimCam, (ClientData) scam);
+    }
+    Tk_EventuallyFree((ClientData) scam, DestroyScam);
+  }
+}
+
+
+int
+DoCamCmd(CLIENT_ARGS)
+{
+  SimCam *scam = (SimCam *) clientData;
+  Tcl_HashEntry *ent;
+  int result = TCL_OK;
+  int (*cmd)();
+
+  if (argc < 2) {
+    return TCL_ERROR;
+  }
+
+  if (ent = Tcl_FindHashEntry(&CamCmds, argv[1])) {
+    cmd = (int (*)())ent->clientData;
+    Tk_Preserve((ClientData) scam);
+    result = cmd(scam, interp, argc, argv);
+    Tk_Release((ClientData) scam);
+  } else {
+    Tcl_AppendResult(interp, "unknown command name: \"",
+                    argv[0], " ", argv[1], "\".", (char *) NULL);
+    result = TCL_ERROR;
+  }
+  return result;
+}
+
+
+int
+CamCmd(CLIENT_ARGS)
+{
+  Tk_Window tkwin = (Tk_Window) clientData;
+  SimCam *scam;
+
+  if (argc < 2) {
+    Tcl_AppendResult(interp, "wrong # args:  should be \"",
+                    argv[0], " pathName ?options?\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  tkwin = Tk_CreateWindowFromPath(interp, tkwin,
+                                 argv[1], (char *) NULL);
+  if (tkwin == NULL) {
+    return TCL_ERROR;
+  }
+
+  scam = (SimCam *)ckalloc(sizeof (SimCam));
+
+  scam->w_x = 0;
+  scam->w_y = 0;
+  scam->w_width = 0;
+  scam->w_height = 0;
+  scam->visible = 0;
+  scam->invalid = 1;
+  scam->skips = 0;
+  scam->skip = 0;
+  scam->tkwin = tkwin;
+  scam->interp = interp;
+  scam->flags = 0;
+  scam->x = NULL;
+  scam->image = NULL;
+  scam->shminfo = NULL;
+  scam->line_bytes = 0;
+  scam->data = NULL;
+  scam->cam_count = 0;
+  scam->cam_list = NULL;
+
+  Tk_SetClass(scam->tkwin, "Cam");
+
+  Tk_CreateEventHandler(scam->tkwin,
+                       VisibilityChangeMask |
+                       ExposureMask |
+                       StructureNotifyMask |
+                       EnterWindowMask |
+                       LeaveWindowMask |
+                       PointerMotionMask,
+                       CamEventProc, (ClientData) scam);
+  Tcl_CreateCommand(interp, Tk_PathName(scam->tkwin),
+                   DoCamCmd, (ClientData) scam, (void (*)()) NULL);
+
+  Tk_MakeWindowExist(scam->tkwin);
+
+  if (getenv("XSYNCHRONIZE") != NULL) {
+    XSynchronize(Tk_Display(tkwin), 1);
+  }
+
+  InitNewCam(scam);
+  DoNewCam(scam);
+
+  if (ConfigureCam(interp, scam, argc-2, argv+2, 0) != TCL_OK) {
+    /* XXX: destroy scam */
+    Tk_DestroyWindow(scam->tkwin);
+    return TCL_ERROR;
+  }
+
+  scam->invalid = 1;
+
+  interp->result = Tk_PathName(scam->tkwin);
+  return TCL_OK;
+}
+
+
+int
+ConfigureCam(Tcl_Interp *interp, SimCam *scam,
+            int argc, char **argv, int flags)
+{
+  if (Tk_ConfigureWidget(interp, scam->tkwin, SimCamConfigSpecs,
+                        argc, argv, (char *) scam, flags) != TCL_OK) {
+    return TCL_ERROR;
+  }
+
+  if (scam->w_width || scam->w_height) {
+    Tk_GeometryRequest(scam->tkwin, scam->w_width, scam->w_height);
+  }
+
+  EventuallyRedrawCam(scam);
+
+  return TCL_OK;
+}
+
+
+EventuallyRedrawCam(SimCam *scam)
+{
+  if (!(scam->flags & VIEW_REDRAW_PENDING)) {
+    Tk_DoWhenIdle(DisplaySimCam, (ClientData) scam);
+    scam->flags |= VIEW_REDRAW_PENDING;
+  }
+}
+
+
+CamCmdconfigure(CAM_ARGS)
+{
+  int result = TCL_OK;
+
+  if (argc == 2) {
+    result = Tk_ConfigureInfo(interp, scam->tkwin, SimCamConfigSpecs,
+                             (char *) scam, (char *) NULL, 0);
+  } else if (argc == 3) {
+    result = Tk_ConfigureInfo(interp, scam->tkwin, SimCamConfigSpecs,
+                             (char *) scam, argv[2], 0);
+  } else {
+    result = ConfigureCam(interp, scam, argc-2, argv+2,
+                         TK_CONFIG_ARGV_ONLY);
+  }
+  return result;
+}
+
+
+CamCmdposition(CAM_ARGS)
+{
+  if ((argc != 2) && (argc != 4)) {
+    return TCL_ERROR;
+  }
+  if (argc == 4) {
+    int x, y;
+
+    if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK)
+       || (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {
+      return TCL_ERROR;
+    }
+    scam->w_x = x;
+    scam->w_y = y;
+  }
+  sprintf(interp->result, "%d %d", scam->w_x, scam->w_y);
+  return TCL_OK;
+}
+
+
+CamCmdsize(CAM_ARGS)
+{
+  if ((argc != 2) && (argc != 4)) {
+    return TCL_ERROR;
+  }
+  if (argc == 4) {
+    int w, h;
+
+    if (Tcl_GetInt(interp, argv[2], &w) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    if (Tcl_GetInt(interp, argv[3], &h) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    scam->w_width = w;
+    scam->w_height = h;
+  }
+  sprintf(interp->result, "%d %d", scam->w_width, scam->w_height);
+  return TCL_OK;
+}
+
+
+CamCmdVisible(CAM_ARGS)
+{
+  int visible;
+
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &visible) != TCL_OK) ||
+       (visible < 0) || (visible > 1)) {
+      return TCL_ERROR;
+    }
+
+    visible = visible && Tk_IsMapped(scam->tkwin);
+    scam->visible = visible;
+  }
+
+  sprintf(interp->result, "%d", scam->visible);
+  return TCL_OK;
+}
+
+
+CamCmdStoreColor(CAM_ARGS)
+{
+  int index, r, g, b, err;
+  XColor color;
+
+  if (argc != 6) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &index) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[2], &r) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[2], &g) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[2], &b) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  color.pixel = index;
+  color.red = r;
+  color.green = g;
+  color.blue = b;
+  color.flags = DoRed | DoGreen | DoBlue;
+  err = XStoreColor(scam->x->dpy, scam->x->colormap, &color);
+
+  sprintf(interp->result, "%d", err);
+  return TCL_OK;
+}
+
+
+CamCmdNewCam(CAM_ARGS)
+{
+  Cam *cam;
+  char *name;
+  char *rule_name = NULL;
+  int rule_number = 0;
+  int x, y, w, h;
+
+  if (argc < 8) {
+    return TCL_ERROR;
+  }
+
+  name = argv[2];
+
+  if ((Tcl_GetInt(interp, argv[3], &rule_number) != TCL_OK) ||
+      (rule_number == 0)) {
+    rule_name = argv[3];
+  }
+
+  if ((Tcl_GetInt(interp, argv[4], &x) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[5], &y) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[6], &w) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[7], &h) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  cam = (Cam *)find_cam_by_name(scam, name);
+
+  if (cam != NULL) {
+    DestroyCam(scam, cam);
+  }
+
+  cam = (Cam *)new_cam(scam, x, y, w, h, 0, 0, NULL);
+  cam->name = (char *)malloc(strlen(name) + 1);
+  strcpy(cam->name, name);
+
+  if (rule_name != NULL) {
+    cam_load_rule(cam, rule_name);
+  } else {
+    cam_set_neighborhood(cam, rule_number);
+  }
+
+  return Tk_ConfigureWidget(interp, scam->tkwin, CamConfigSpecs,
+                           argc - 8, argv + 8, (char *) cam, 0);
+}
+
+
+CamCmdDeleteCam(CAM_ARGS)
+{
+  Cam *cam;
+  char *name;
+
+  if (argc != 3) {
+    return TCL_ERROR;
+  }
+
+  name = argv[2];
+
+  cam = (Cam *)find_cam_by_name(scam, name);
+
+  if (cam != NULL) {
+    DestroyCam(scam, cam);
+  }
+
+  return TCL_OK;
+}
+
+
+CamCmdRandomizeCam(CAM_ARGS)
+{
+  Cam *cam;
+  char *name;
+
+  if (argc != 3) {
+    return TCL_ERROR;
+  }
+
+  name = argv[2];
+
+  cam = (Cam *)find_cam_by_name(scam, name);
+
+  if (cam != NULL) {
+    cam_randomize(cam);
+  }
+
+  return TCL_OK;
+}
+
+
+CamCmdConfigCam(CAM_ARGS)
+{
+  Cam *cam;
+  int result = TCL_OK;
+
+  if (argc < 3) {
+    return TCL_ERROR;
+  }
+
+  cam = (Cam *)find_cam_by_name(scam, argv[2]);
+
+  if (cam == NULL) {
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    result = Tk_ConfigureInfo(interp, scam->tkwin, CamConfigSpecs,
+                   (char *) cam, (char *) NULL, 0);
+  } else if (argc == 4) {
+    result = Tk_ConfigureInfo(interp, scam->tkwin, CamConfigSpecs,
+                   (char *) cam, argv[3], 0);
+  } else {
+    result = Tk_ConfigureWidget(interp, scam->tkwin, CamConfigSpecs,
+                               argc - 3, argv + 3, (char *) cam, 0);
+  }
+
+  return result;
+}
+
+
+CamCmdFindCam(CAM_ARGS)
+{
+  Cam *cam;
+  int x, y;
+
+  if (argc != 4) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  cam = (Cam *)find_cam(scam, x, y);
+  sprintf(interp->result, "%s", (cam == NULL) ? "" : cam->name);
+
+  return TCL_OK;
+}
+
+
+CamCmdFindSomeCam(CAM_ARGS)
+{
+  Cam *cam;
+  int x, y;
+
+  if (argc != 4) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  cam = (Cam *)find_cam(scam, x, y);
+  if (cam == NULL) {
+    cam = scam->cam_list;
+  }
+
+  sprintf(interp->result, "%s", (cam == NULL) ? "" : cam->name);
+
+  return TCL_OK;
+}
+
+/*************************************************************************/
+
+InitNewCam(SimCam *scam)
+{
+  scam->x = (XDisplay *)FindXDisplay(scam->tkwin);
+  IncRefDisplay(scam->x);
+
+  DoResizeCam(scam, 512, 512);
+
+  init_scam(scam);
+}
+
+
+DoResizeCam(SimCam *scam, int w, int h)
+{
+  Cam *cam;
+
+  for (cam = scam->cam_list; cam != NULL; cam = cam->next) {
+    if (cam->front->width > w) w = cam->front->width;
+    if (cam->front->height > h) h = cam->front->height;
+  }
+
+  scam->w_width = w;
+  scam->w_height = h;
+
+  if (scam->shminfo != NULL) {
+    XShmDetach(scam->x->dpy, scam->shminfo);
+    shmdt(scam->shminfo->shmaddr);
+    shmctl(scam->shminfo->shmid, IPC_RMID, 0);
+    ckfree(scam->shminfo);
+    scam->shminfo = NULL;
+    if (scam->image) {
+      scam->image->data = NULL;
+      scam->data = NULL;
+      XDestroyImage(scam->image);
+      scam->image = NULL;
+    }
+  } else {
+    if (scam->image) {
+      if (scam->image->data) {
+       ckfree(scam->image->data);
+       scam->image->data = NULL;
+      }
+      scam->data = NULL;
+      XDestroyImage(scam->image);
+      scam->image = NULL;
+    }
+  }
+
+  if (scam->x->shared) {
+    scam->shminfo = (XShmSegmentInfo *)ckalloc(sizeof (XShmSegmentInfo));
+
+    scam->image =
+      XShmCreateImage(scam->x->dpy, scam->x->visual, scam->x->depth,
+                       scam->x->color ? ZPixmap : XYBitmap,
+                       NULL, scam->shminfo,
+                       scam->w_width, scam->w_height);
+
+    scam->line_bytes = scam->image->bytes_per_line;
+    scam->shminfo->readOnly = False;
+    scam->shminfo->shmid = shmget(IPC_PRIVATE,
+                                 (scam->line_bytes *
+                                  scam->w_height),
+                                 (IPC_CREAT | 0777));
+    if (scam->shminfo->shmid < 0) {
+      perror("shmget");
+      fprintf(stderr,
+             "Drat, Micropolis can't share memory with X display \"%s\".\n",
+             scam->x->display);
+      goto FALL_BACK;
+    }
+
+    scam->data = (unsigned char *)shmat(scam->shminfo->shmid, 0, 0);
+    scam->image->data = (char *)scam->data;
+    if ((int)scam->data == -1) {
+      perror("shmat");
+      fprintf(stderr,
+             "Drat, Micropolis can't find any memory to share with display \"%s\".\n",
+             scam->x->display);
+      goto FALL_BACK;
+    }
+
+    scam->shminfo->shmaddr = (char *)scam->data;
+    scam->shminfo->readOnly = False;
+
+
+    { int (*old)();
+      int CatchXError();
+
+      GotXError = 0;
+      old = XSetErrorHandler(CatchXError);
+
+      if (XShmAttach(scam->x->dpy, scam->shminfo) == 0) {
+       fprintf(stderr,
+               "Drat, the X display \"%s\" can't access Micropolis's shared memory.\n",
+               scam->x->display);
+       GotXError = 1;
+      }
+
+      XSync(scam->x->dpy, False);
+
+      XSetErrorHandler(old);
+
+      if (GotXError) {
+       goto FALL_BACK;
+      }
+    }
+  } else {
+    goto SPRING_FORWARD;
+  FALL_BACK:
+    fprintf(stderr,
+           "Falling back to the X network protocol on display \"%s\"...\n",
+           scam->x->display);
+  SPRING_FORWARD:
+    scam->x->shared = 0;
+    if (scam->shminfo) {
+      if (scam->shminfo->shmid >= 0) {
+       if (scam->shminfo->shmaddr) {
+         shmdt(scam->shminfo->shmaddr);
+       }
+       shmctl(scam->shminfo->shmid, IPC_RMID, 0);
+      }
+      ckfree((char *)scam->shminfo);
+      scam->shminfo = NULL;
+    }
+    if (scam->image) {
+      scam->image->data = NULL;
+      XDestroyImage(scam->image);
+      scam->image = NULL;
+    }
+    scam->data = NULL;
+    scam->line_bytes = scam->w_width;
+    scam->data = (Byte *)ckalloc(scam->line_bytes * scam->w_height);
+    scam->image = 
+      XCreateImage(scam->x->dpy, scam->x->visual,
+                  scam->x->depth,
+                  scam->x->color ? ZPixmap : XYBitmap,
+                  0, (char *)scam->data,
+                  scam->w_width, scam->w_height,
+                  8, scam->line_bytes); /* XXX: handle other depths */
+  }
+
+  for (cam = scam->cam_list; cam != NULL; cam = cam->next) {
+    if (cam->x + cam->front->width > scam->w_width) {
+      cam->x = scam->w_width - cam->front->width;
+    }
+    if (cam->y + cam->front->height > scam->w_height) {
+      cam->y = scam->w_height - cam->front->height;
+    }
+    cam->front->line_bytes = scam->line_bytes;
+    cam->front->mem = /* XXX: handle other depths */
+      (Byte *)scam->data + cam->x + (scam->line_bytes * cam->y);
+  }
+}
+
+
+DoNewCam(SimCam *scam)
+{
+  sim->scams++; scam->next = sim->scam; sim->scam = scam;
+  scam->invalid = 1;
+}
+
+
+DoUpdateCam(SimCam *scam)
+{
+  if (!scam->visible) {
+    return;
+  }
+
+  if (scam->invalid) {
+    scam->invalid = 0;
+  }
+
+  if (scam->x->shared) {
+    XShmPutImage(scam->x->dpy, Tk_WindowId(scam->tkwin), scam->x->gc,
+                scam->image, 0, 0,
+                0, 0, scam->w_width, scam->w_height,
+                False);
+  } else {
+    XPutImage(scam->x->dpy, Tk_WindowId(scam->tkwin), scam->x->gc,
+                scam->image, 0, 0,
+                0, 0, scam->w_width, scam->w_height);
+  }
+}
+
+
+cam_command_init()
+{
+  int new;
+  extern int TileCamCmd(CLIENT_ARGS);
+
+  Tcl_CreateCommand(tk_mainInterp, "camview", CamCmd,
+                   (ClientData)MainWindow, (void (*)()) NULL);
+
+  Tcl_InitHashTable(&CamCmds, TCL_STRING_KEYS);
+
+#define CAM_CMD(name) HASHED_CMD(Cam, name)
+
+  CAM_CMD(configure);
+  CAM_CMD(position);
+  CAM_CMD(size);
+  CAM_CMD(Visible);
+  CAM_CMD(StoreColor);
+  CAM_CMD(NewCam);
+  CAM_CMD(DeleteCam);
+  CAM_CMD(RandomizeCam);
+  CAM_CMD(ConfigCam);
+  CAM_CMD(FindCam);
+  CAM_CMD(FindSomeCam);
+}
+
+
+#endif /* CAM */
diff --git a/src/sim/w_con.c b/src/sim/w_con.c
new file mode 100644 (file)
index 0000000..0d20c9a
--- /dev/null
@@ -0,0 +1,646 @@
+/* w_con.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+short _RoadTable[16] = {
+  66, 67, 66, 68,
+  67, 67, 69, 73,
+  66, 71, 66, 72,
+  70, 75, 74, 76
+};
+
+short _RailTable[16] = {
+  226, 227, 226, 228,
+  227, 227, 229, 233,
+  226, 231, 226, 232,
+  230, 235, 234, 236
+};
+
+short _WireTable[16] = {
+  210, 211, 210, 212,
+  211, 211, 213, 217,
+  210, 215, 210, 216,
+  214, 219, 218, 220
+};
+
+
+#define NeutralizeRoad(Tile) \
+  if (((Tile &= LOMASK) >= 64) && \
+      ((Tile & LOMASK) <= 207)) { \
+    Tile = (Tile & 0x000F) + 64; \
+  }
+
+
+/* comefrom: check3Border check4Border check5Border processWand */
+int
+ConnecTile(short x, short y, short *TileAdrPtr, short Command)
+{
+  short Tile;
+  int result = 1;
+
+  /* make sure the array subscripts are in bounds */
+  if (!TestBounds(x, y)) {
+    return (0);
+  }
+
+  /* AutoDoze */
+  if ((Command >= 2) && (Command <= 4)) {
+
+    if ((autoBulldoze != 0) &&
+       (TotalFunds > 0) &&
+       ((Tile = (*TileAdrPtr)) & BULLBIT)) {
+      NeutralizeRoad(Tile);
+      /* Maybe this should check BULLBIT instead of checking tile values? */
+      if (((Tile >= TINYEXP) && (Tile <= LASTTINYEXP)) ||
+         ((Tile < 64) && (Tile != 0))) {
+       Spend(1);
+       (*TileAdrPtr) = 0;
+      }
+    }
+  }
+
+  switch (Command) {
+
+  case 0:      /* Fix zone */
+    _FixZone(x, y, TileAdrPtr);
+    break;
+    
+  case 1:      /* Doze zone */
+    result = _LayDoze(x, y, TileAdrPtr);
+    _FixZone(x, y, TileAdrPtr);
+    break;
+    
+  case 2:      /* Lay Road */
+    result = _LayRoad(x, y, TileAdrPtr);
+    _FixZone(x, y, TileAdrPtr);
+    break;
+    
+  case 3:      /* Lay Rail */
+    result = _LayRail(x, y, TileAdrPtr);
+    _FixZone(x, y, TileAdrPtr);
+    break;
+    
+  case 4:      /* Lay Wire */
+    result = _LayWire(x, y, TileAdrPtr);
+    _FixZone(x, y, TileAdrPtr);
+    break;
+
+  }
+  
+  return result;
+}
+
+/* comefrom: ConnecTile */
+int
+_LayDoze(int x, int y, short *TileAdrPtr)
+{
+  short Tile;
+
+  if (!(TotalFunds)) {
+    return -2;                 /* no mas dinero. */
+  }
+
+  Tile = (*TileAdrPtr);
+
+  if (!(Tile & BULLBIT)) {
+    return 0;                  /* Check dozeable bit. */
+  }
+
+  NeutralizeRoad(Tile);
+
+  switch (Tile) {
+  case HBRIDGE:
+  case VBRIDGE:
+  case BRWV:
+  case BRWH:
+  case HBRDG0:
+  case HBRDG1:
+  case HBRDG2:
+  case HBRDG3:
+  case VBRDG0:
+  case VBRDG1:
+  case VBRDG2:
+  case VBRDG3:
+  case HPOWER:
+  case VPOWER:
+  case HRAIL:
+  case VRAIL:          /* Dozing over water, replace with water. */
+    (*TileAdrPtr) = RIVER;
+    break;
+
+  default:             /* Dozing on land, replace with land.  Simple, eh? */
+    (*TileAdrPtr) = DIRT;
+    break;
+  }
+
+  Spend(1);                    /* Costs $1.00....*/
+  return 1;
+}
+
+
+/* comefrom: ConnecTile */
+int
+_LayRoad(int x, int y, short *TileAdrPtr)
+{
+  short Tile;
+  int cost = 10;
+
+  if (TotalFunds < 10) {
+    return -2;
+  }
+
+  Tile = (*TileAdrPtr) & LOMASK;
+
+  switch (Tile) {
+
+  case DIRT:
+    (*TileAdrPtr) = ROADS | BULLBIT | BURNBIT;
+    break;
+                       
+  case RIVER:                  /* Road on Water */
+  case REDGE:
+  case CHANNEL:                        /* Check how to build bridges, if possible. */
+    if (TotalFunds < 50) {
+      return -2;
+    }
+
+    cost = 50;
+
+    if (x < (WORLD_X - 1)) {
+      Tile = TileAdrPtr[WORLD_Y];
+      NeutralizeRoad(Tile);
+      if ((Tile == VRAILROAD) ||
+         (Tile == HBRIDGE) ||
+         ((Tile >= ROADS) &&
+          (Tile <= HROADPOWER))) {
+       (*TileAdrPtr) = HBRIDGE | BULLBIT;
+       break;
+      }
+    }
+
+    if (x > 0) {
+      Tile = TileAdrPtr[-WORLD_Y];
+      NeutralizeRoad(Tile);
+      if ((Tile == VRAILROAD) ||
+         (Tile == HBRIDGE) ||
+         ((Tile >= ROADS) &&
+          (Tile <= INTERSECTION))) {
+       (*TileAdrPtr) = HBRIDGE | BULLBIT;
+       break;
+      }
+    }
+
+    if (y < (WORLD_Y - 1)) {
+      Tile = TileAdrPtr[1];
+      NeutralizeRoad(Tile);
+      if ((Tile == HRAILROAD) ||
+         (Tile == VROADPOWER) ||
+         ((Tile >= VBRIDGE) &&
+          (Tile <= INTERSECTION))) {
+       (*TileAdrPtr) = VBRIDGE | BULLBIT;
+       break;
+      }
+    }
+
+    if (y > 0) {
+      Tile = TileAdrPtr[-1];
+      NeutralizeRoad(Tile);
+      if ((Tile == HRAILROAD) ||
+         (Tile == VROADPOWER) ||
+         ((Tile >= VBRIDGE) &&
+          (Tile <= INTERSECTION))) {
+       (*TileAdrPtr) = VBRIDGE | BULLBIT;
+       break;
+      }
+    }
+
+    /* Can't do road... */
+    return 0;
+
+  case LHPOWER:                /* Road on power */
+    (*TileAdrPtr) = VROADPOWER | CONDBIT | BURNBIT | BULLBIT;
+    break;
+
+  case LVPOWER:                /* Road on power #2 */
+    (*TileAdrPtr) = HROADPOWER | CONDBIT | BURNBIT | BULLBIT;
+    break;
+
+  case LHRAIL:         /* Road on rail */
+    (*TileAdrPtr) = HRAILROAD | BURNBIT | BULLBIT;
+    break;
+
+  case LVRAIL:         /* Road on rail #2 */
+    (*TileAdrPtr) = VRAILROAD | BURNBIT | BULLBIT;
+    break;
+
+  default:             /* Can't do road */
+    return 0;
+
+  }
+
+  Spend(cost);
+
+  return 1;
+}
+
+
+/* comefrom: ConnecTile */
+int
+_LayRail(int x, int y, short *TileAdrPtr)
+{
+  short Tile;
+  int cost = 20;
+
+  if (TotalFunds < 20) {
+    return -2;
+  }
+
+  Tile = (*TileAdrPtr) & LOMASK;
+  NeutralizeRoad(Tile);
+
+  switch (Tile) {
+  case 0:                      /* Rail on Dirt */
+    (*TileAdrPtr) = 226 | BULLBIT | BURNBIT;
+    break;
+
+  case 2:                      /* Rail on Water */
+  case 3:
+  case 4:                      /* Check how to build underwater tunnel, if possible. */
+    if (TotalFunds < 100) {
+      return -2;
+    }
+    cost = 100;
+
+    if (x < (WORLD_X - 1)) {
+      Tile = TileAdrPtr[WORLD_Y];
+      NeutralizeRoad(Tile);
+      if ((Tile == 221) || (Tile == 224) || ((Tile >= 226) && (Tile <= 237))) {
+       (*TileAdrPtr) = 224 | BULLBIT;
+       break;
+      }
+    }
+    
+    if (x > 0) {
+      Tile = TileAdrPtr[-WORLD_Y];
+      NeutralizeRoad(Tile);
+      if ((Tile == 221) || (Tile == 224) || ((Tile > 225) && (Tile < 238))) {
+       (*TileAdrPtr) = 224 | BULLBIT;
+       break;
+      }
+    }
+
+    if (y < (WORLD_Y - 1)) {
+      Tile = TileAdrPtr[1];
+      NeutralizeRoad(Tile);
+      if ((Tile == 222) || (Tile == 238) || ((Tile > 224) && (Tile < 237))) {
+       (*TileAdrPtr) = 225 | BULLBIT;
+       break;
+      }
+    }
+
+    if (y > 0) {
+      Tile = TileAdrPtr[-1];
+      NeutralizeRoad(Tile);
+      if ((Tile == 222) || (Tile == 238) || ((Tile > 224) && (Tile < 237))) {
+       (*TileAdrPtr) = 225 | BULLBIT;
+       break;
+      }
+    }
+
+    /* Can't do rail... */
+    return 0;
+
+  case 210:            /* Rail on power */
+    (*TileAdrPtr) = 222 | CONDBIT | BURNBIT | BULLBIT;
+    break;
+
+  case 211:            /* Rail on power #2 */
+    (*TileAdrPtr) = 221 | CONDBIT | BURNBIT | BULLBIT;
+    break;
+
+  case 66:             /* Rail on road */
+    (*TileAdrPtr) = 238 | BURNBIT | BULLBIT;
+    break;
+
+  case 67:             /* Rail on road #2 */
+    (*TileAdrPtr) = 237 | BURNBIT | BULLBIT;
+    break;
+
+  default:             /* Can't do rail */
+    return 0;
+  }
+
+  Spend(cost);
+  return 1;
+}
+
+
+/* comefrom: ConnecTile */
+int
+_LayWire(int x, int y, short *TileAdrPtr)
+{
+  short Tile;
+  int cost = 5;
+
+  if (TotalFunds < 5) {
+    return -2;
+  }
+
+  Tile = (*TileAdrPtr) & LOMASK;
+  NeutralizeRoad(Tile);
+
+  switch (Tile) {
+  case 0:                      /* Wire on Dirt */
+    (*TileAdrPtr) = 210 | CONDBIT | BURNBIT | BULLBIT;
+    break;
+
+  case 2:                      /* Wire on Water */
+  case 3:
+  case 4:                      /* Check how to lay underwater wire, if possible. */
+    if (TotalFunds < 25)
+      return -2;
+    cost = 25;
+
+    if (x < (WORLD_X - 1)) {
+      Tile = TileAdrPtr[WORLD_Y];
+      if (Tile & CONDBIT) {
+       NeutralizeRoad(Tile);
+       if ((Tile != 77) && (Tile != 221) && (Tile != 208)) {
+         (*TileAdrPtr) = 209 | CONDBIT | BULLBIT;
+         break;                
+       }
+      }
+    }
+
+    if (x > 0) {
+      Tile = TileAdrPtr[-WORLD_Y];
+      if (Tile & CONDBIT) {
+       NeutralizeRoad(Tile);           
+       if ((Tile != 77) && (Tile != 221) && (Tile != 208)) {
+         (*TileAdrPtr) = 209 | CONDBIT | BULLBIT;
+         break;                
+       }
+      }
+    }
+
+    if (y < (WORLD_Y - 1)) {
+      Tile = TileAdrPtr[1];
+      if (Tile & CONDBIT) {
+       NeutralizeRoad(Tile);           
+       if ((Tile != 78) && (Tile != 222) && (Tile != 209)) {
+         (*TileAdrPtr) = 208 | CONDBIT | BULLBIT;
+         break;
+       }
+      }
+    }
+
+    if (y > 0) {
+      Tile = TileAdrPtr[-1];
+      if (Tile & CONDBIT) {
+       NeutralizeRoad(Tile);           
+       if ((Tile != 78) && (Tile != 222) && (Tile != 209)) {
+         (*TileAdrPtr) = 208 | CONDBIT | BULLBIT;
+         break;                
+       }
+      }
+    }
+
+    /* Can't do wire... */
+    return 0;
+
+  case 66:             /* Wire on Road */
+    (*TileAdrPtr) = 77 | CONDBIT | BURNBIT | BULLBIT;
+    break;
+
+  case 67:             /* Wire on Road #2 */
+    (*TileAdrPtr) = 78 | CONDBIT | BURNBIT | BULLBIT;
+                       break;
+
+  case 226:            /* Wire on rail */
+    (*TileAdrPtr) = 221 | CONDBIT | BURNBIT | BULLBIT;
+    break;
+
+  case 227:            /* Wire on rail #2 */
+    (*TileAdrPtr) = 222 | CONDBIT | BURNBIT | BULLBIT;
+    break;
+
+  default:             /* Can't do wire */
+    return 0;
+  }
+
+  Spend(cost);
+  return 1;
+}
+
+
+/* comefrom: ConnecTile */
+_FixZone(int x, int y, short *TileAdrPtr)
+{
+  _FixSingle(x,y, &TileAdrPtr[0]);
+
+  if (y > 0) {
+    _FixSingle(x, y-1, &TileAdrPtr[-1]);
+  }
+
+  if (x < (WORLD_X - 1)) {
+    _FixSingle(x+1, y, &TileAdrPtr[WORLD_Y]);
+  }
+
+  if (y < (WORLD_Y - 1)) {
+    _FixSingle(x, y+1, &TileAdrPtr[1]);
+  }
+
+  if (x > 0) {
+    _FixSingle(x-1, y, &TileAdrPtr[-WORLD_Y]);
+  }
+
+}
+
+
+/* comefrom: _FixZone */
+_FixSingle(int x, int y, short *TileAdrPtr)
+{
+  short Tile;
+  short adjTile = 0;
+
+  Tile = (*TileAdrPtr) & LOMASK;
+  NeutralizeRoad(Tile);
+  if ((Tile >= 66) && (Tile <= 76)) {          /* Cleanup Road */
+
+    if (y > 0) {
+      Tile = TileAdrPtr[-1];
+      NeutralizeRoad(Tile);
+      if (((Tile == 237) || ((Tile >= 64) && (Tile <= 78))) &&
+         (Tile != 77) && (Tile != 238) && (Tile != 64))
+       adjTile |= 0x0001;
+    }
+
+    if (x < (WORLD_X - 1)) {
+      Tile = TileAdrPtr[WORLD_Y];
+      NeutralizeRoad(Tile);
+      if (((Tile == 238) || ((Tile >= 64) && (Tile <= 78))) &&
+         (Tile != 78) && (Tile != 237) && (Tile != 65))
+       adjTile |= 0x0002;
+    }
+
+    if (y < (WORLD_Y - 1)) {
+      Tile = TileAdrPtr[1];
+      NeutralizeRoad(Tile);
+      if (((Tile == 237) || ((Tile >= 64) && (Tile <= 78))) &&
+         (Tile != 77) && (Tile != 238) && (Tile != 64))
+       adjTile |= 0x0004;
+    }
+
+    if (x > 0) {
+      Tile = TileAdrPtr[-WORLD_Y];
+      NeutralizeRoad(Tile);
+      if (((Tile == 238) || ((Tile >= 64) && (Tile <= 78))) &&
+         (Tile != 78) && (Tile != 237) && (Tile != 65))
+       adjTile |= 0x0008;
+    }
+
+    (*TileAdrPtr) = _RoadTable[adjTile] | BULLBIT | BURNBIT;
+    return;
+  }
+
+  if ((Tile >= 226) && (Tile <= 236)) {                /* Cleanup Rail */
+
+    if (y > 0) {
+      Tile = TileAdrPtr[-1];
+      NeutralizeRoad(Tile);
+      if ((Tile >= 221) && (Tile <= 238) &&
+         (Tile != 221) && (Tile != 237) && (Tile != 224))
+       adjTile |= 0x0001;
+    }
+
+    if (x < (WORLD_X - 1)) {
+      Tile = TileAdrPtr[WORLD_Y];
+      NeutralizeRoad(Tile);
+      if ((Tile >= 221) && (Tile <= 238) &&
+         (Tile != 222) && (Tile != 238) && (Tile != 225))
+       adjTile |= 0x0002;
+    }
+
+    if (y < (WORLD_Y - 1)) {
+      Tile = TileAdrPtr[1];
+      NeutralizeRoad(Tile);
+      if ((Tile >= 221) && (Tile <= 238) &&
+         (Tile != 221) && (Tile != 237) && (Tile != 224))
+       adjTile |= 0x0004;
+    }
+
+    if (x > 0) {
+      Tile = TileAdrPtr[-WORLD_Y];
+      NeutralizeRoad(Tile);
+      if ((Tile >= 221) && (Tile <= 238) &&
+         (Tile != 222) && (Tile != 238) && (Tile != 225))
+       adjTile |= 0x0008;
+    }
+
+    (*TileAdrPtr) = _RailTable[adjTile] | BULLBIT | BURNBIT;
+    return;
+  }
+
+  if ((Tile >= 210) && (Tile <= 220)) {                /* Cleanup Wire */
+
+    if (y > 0) {
+      Tile = TileAdrPtr[-1];
+      if (Tile & CONDBIT) {
+       NeutralizeRoad(Tile);
+       if ((Tile != 209) && (Tile != 78) && (Tile != 222))
+         adjTile |= 0x0001;
+      }
+    }
+
+    if (x < (WORLD_X - 1)) {
+      Tile = TileAdrPtr[WORLD_Y];
+      if (Tile & CONDBIT) {
+       NeutralizeRoad(Tile);
+       if ((Tile != 208) && (Tile != 77) && (Tile != 221))
+         adjTile |= 0x0002;
+      }
+    }
+
+    if (y < (WORLD_Y - 1)) {
+      Tile = TileAdrPtr[1];
+      if (Tile & CONDBIT) {
+       NeutralizeRoad(Tile);
+       if ((Tile != 209) && (Tile != 78) && (Tile != 222))
+         adjTile |= 0x0004;
+      }
+    }
+
+    if (x > 0) {
+      Tile = TileAdrPtr[-WORLD_Y];
+      if (Tile & CONDBIT) {
+       NeutralizeRoad(Tile);
+       if ((Tile != 208) && (Tile != 77) && (Tile != 221))
+         adjTile |= 0x0008;
+      }
+    }
+
+    (*TileAdrPtr) = _WireTable[adjTile] | BULLBIT | BURNBIT | CONDBIT;
+    return;
+  }
+}
+
diff --git a/src/sim/w_date.c b/src/sim/w_date.c
new file mode 100644 (file)
index 0000000..049227b
--- /dev/null
@@ -0,0 +1,736 @@
+/* w_date.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+short NewDate = 0;
+Tcl_HashTable DateCmds;
+int DateUpdateTime = 200;
+
+
+#define DEF_DATE_FONT  "-Adobe-Helvetica-Bold-R-Normal-*-140-*"
+#define DEF_DATE_BG_COLOR      "#b0b0b0"
+#define DEF_DATE_BG_MONO       "#ffffff"
+#define DEF_DATE_BORDER_WIDTH  "2"
+#define DEF_DATE_PADY          "1"
+#define DEF_DATE_PADX          "1"
+#define DEF_DATE_WIDTH         "0"
+#define DEF_DATE_MONTHTAB      "7"
+#define DEF_DATE_YEARTAB       "13"
+
+Tk_ConfigSpec DateConfigSpecs[] = {
+    {TK_CONFIG_FONT, "-font", (char *) NULL, (char *) NULL,
+       DEF_DATE_FONT, Tk_Offset(SimDate, fontPtr), 0},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_DATE_BG_COLOR, Tk_Offset(SimDate, border),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_DATE_BG_MONO, Tk_Offset(SimDate, border),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       DEF_DATE_BORDER_WIDTH, Tk_Offset(SimDate, borderWidth), 0},
+    {TK_CONFIG_PIXELS, "-padx", "padX", "Pad",
+       DEF_DATE_PADX, Tk_Offset(SimDate, padX), 0},
+    {TK_CONFIG_PIXELS, "-pady", "padY", "Pad",
+       DEF_DATE_PADY, Tk_Offset(SimDate, padY), 0},
+    {TK_CONFIG_INT, "-width", "width", "Width",
+       DEF_DATE_WIDTH, Tk_Offset(SimDate, width), 0},
+    {TK_CONFIG_INT, "-monthtab", "monthtab", "MonthTab",
+       DEF_DATE_MONTHTAB, Tk_Offset(SimDate, monthTab), 0},
+    {TK_CONFIG_INT, "-yeartab", "yeartab", "YearTab",
+       DEF_DATE_YEARTAB, Tk_Offset(SimDate, yearTab), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+  };
+
+
+XDisplay *FindXDisplay();
+
+
+static void
+DisplaySimDate(ClientData clientData)
+{
+  SimDate *date = (SimDate *) clientData;
+  Tk_Window tkwin = date->tkwin;
+  Pixmap pm = None;
+  Drawable d;
+
+  date->flags &= ~VIEW_REDRAW_PENDING;
+//fprintf(stderr, "DisplaySimDate cleared VIEW_REDRAW_PENDING\n");
+
+  assert(date->draw_date_token != 0);
+  if (date->draw_date_token != 0) {
+//    Tk_DeleteTimerHandler(date->draw_date_token);
+    date->draw_date_token = 0;
+  }
+
+  if (date->visible && (tkwin != NULL) && Tk_IsMapped(tkwin)) {
+    DoUpdateDate(date);
+  }
+}
+
+
+void
+DestroySimDate(ClientData clientData)
+{
+  SimDate *date = (SimDate *) clientData;
+
+  DestroyDate(date);
+}
+
+
+EventuallyRedrawDate(SimDate *date)
+{
+  if (!(date->flags & VIEW_REDRAW_PENDING)) {
+    assert(date->draw_date_token == 0);
+    if (date->draw_date_token == 0) {
+      date->draw_date_token =
+       Tk_CreateTimerHandler(
+         DateUpdateTime,
+         DisplaySimDate,
+         (ClientData) date);
+      date->flags |= VIEW_REDRAW_PENDING;
+//fprintf(stderr, "EventuallyRedrawDate set VIEW_REDRAW_PENDING\n");
+    }
+  }
+}
+
+
+void
+SimDateEventProc(ClientData clientData, XEvent *eventPtr)
+{
+  SimDate *date = (SimDate *) clientData;
+
+  if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {
+    date->visible = 1;
+    EventuallyRedrawDate(date);
+  } else if (eventPtr->type == MapNotify) {
+    date->visible = 1;
+  } else if (eventPtr->type == UnmapNotify) {
+    date->visible = 0;
+  } else if (eventPtr->type == VisibilityNotify) {
+    if (eventPtr->xvisibility.state == VisibilityFullyObscured)
+      date->visible = 0;
+    else
+      date->visible = 1;
+  } else if (eventPtr->type == ConfigureNotify) {
+    DoResizeDate(date,
+                 eventPtr->xconfigure.width,
+                 eventPtr->xconfigure.height);
+    EventuallyRedrawDate(date);
+  } else if (eventPtr->type == DestroyNotify) {
+    Tcl_DeleteCommand(date->interp, Tk_PathName(date->tkwin));
+    date->tkwin = NULL;
+    if (date->flags & VIEW_REDRAW_PENDING) {
+      assert(date->draw_date_token != 0);
+      if (date->draw_date_token != 0) {
+       Tk_DeleteTimerHandler(date->draw_date_token);
+       date->draw_date_token = 0;
+      }
+      date->flags &= ~VIEW_REDRAW_PENDING;
+//fprintf(stderr, "SimDateEventProc cleared VIEW_REDRAW_PENDING\n");
+    }
+   Tk_EventuallyFree((ClientData) date, DestroySimDate);
+  }
+}
+
+
+static void
+ComputeDateGeometry(SimDate *date)
+{
+    XCharStruct bbox;
+    int dummy;
+    unsigned int width, height;
+    int charWidth;
+
+    XTextExtents(date->fontPtr, "0", 1,
+                &dummy, &dummy, &dummy, &bbox);
+    charWidth = (bbox.lbearing + bbox.rbearing);
+
+    if (date->width == 0) {
+      char *maxString = "Date:  MMM    1000000";
+      int maxStringLength = strlen(maxString);
+
+      XTextExtents(date->fontPtr, maxString, maxStringLength,
+                  &dummy, &dummy, &dummy, &bbox);
+      width = bbox.lbearing + bbox.rbearing;
+    } else {
+      width = date->width * charWidth;
+    }
+
+    height = date->fontPtr->ascent + date->fontPtr->descent;
+
+    width += 2 * date->padX;
+    height += 2 * date->padY;
+
+    Tk_GeometryRequest(
+       date->tkwin,
+       (int) (width + (2 * date->borderWidth) + 2),
+       (int) (height + (2 * date->borderWidth) + 2));
+    Tk_SetInternalBorder(
+       date->tkwin,
+       date->borderWidth);
+
+    date->yearTabX = date->yearTab * charWidth;
+    date->monthTabX = date->monthTab * charWidth;
+}
+
+
+int DateCmdconfigure(DATE_ARGS)
+{
+  int result = TCL_OK;
+
+  if (argc == 2) {
+    result = Tk_ConfigureInfo(interp, date->tkwin, DateConfigSpecs,
+                             (char *) date, (char *) NULL, 0);
+  } else if (argc == 3) {
+    result = Tk_ConfigureInfo(interp, date->tkwin, DateConfigSpecs,
+                             (char *) date, argv[2], 0);
+  } else {
+    result = ConfigureSimDate(interp, date, argc-2, argv+2,
+                           TK_CONFIG_ARGV_ONLY);
+  }
+  return TCL_OK;
+}
+
+
+int DateCmdposition(DATE_ARGS)
+{
+  int result = TCL_OK;
+
+    if ((argc != 2) && (argc != 4)) {
+      return TCL_ERROR;
+    }
+    if (argc == 4) {
+      if ((Tcl_GetInt(interp, argv[2], &date->w_x) != TCL_OK)
+         || (Tcl_GetInt(interp, argv[3], &date->w_y) != TCL_OK)) {
+       return TCL_ERROR;
+      }
+    }
+    sprintf(interp->result, "%d %d", date->w_x, date->w_y);
+    return TCL_OK;
+}
+
+
+int DateCmdsize(DATE_ARGS)
+{
+  if ((argc != 2) && (argc != 4)) {
+    return TCL_ERROR;
+  }
+  if (argc == 4) {
+    int w, h;
+    
+    if (Tcl_GetInt(interp, argv[2], &w) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    if (Tcl_GetInt(interp, argv[3], &h) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    date->w_width = w;
+    date->w_height = h;
+  }
+  sprintf(interp->result, "%d %d", date->w_width, date->w_height);
+  return TCL_OK;
+}
+
+
+int DateCmdVisible(DATE_ARGS)
+{
+  int visible;
+
+  if ((argc != 2) && (argc != 3)) {
+    Tcl_AppendResult(interp, "wrong # args", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &visible) != TCL_OK) ||
+       (visible < 0) || (visible > 1)) {
+      Tcl_AppendResult(interp, " bogus args", (char *) NULL);
+      return TCL_ERROR;
+    }
+
+    date->visible = visible;
+  }
+
+  sprintf(interp->result, "%d", date->visible);
+
+  return TCL_OK;
+}
+
+
+int DateCmdReset(DATE_ARGS)
+{
+  int range;
+
+  if (argc != 2) {
+    Tcl_AppendResult(interp, "wrong # args", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  date->reset = 1;
+
+//  ComputeDateGeometry(date); // ???
+
+  EventuallyRedrawDate(date);
+
+  return TCL_OK;
+}
+
+
+int DateCmdSet(DATE_ARGS)
+{
+  int range;
+
+  if (argc != 4) {
+    Tcl_AppendResult(interp, "wrong # args", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &date->month) != TCL_OK) ||
+      (date->month < 0) ||
+      (date->month >= 12)) {
+    Tcl_AppendResult(interp, " bogus args", (char *) NULL);
+    return TCL_ERROR;
+  }
+  
+  if ((Tcl_GetInt(interp, argv[3], &date->year) != TCL_OK) ||
+      (date->year < 0)) {
+    Tcl_AppendResult(interp, " bogus args", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+//  ComputeDateGeometry(date); // ???
+
+  EventuallyRedrawDate(date);
+
+  return TCL_OK;
+}
+
+
+int
+DoDateCmd(CLIENT_ARGS)
+{
+  SimDate *date = (SimDate *) clientData;
+  Tcl_HashEntry *ent;
+  int result = TCL_OK;
+  int (*cmd)();
+
+  if (argc < 2) {
+    return TCL_ERROR;
+  }
+
+  if (ent = Tcl_FindHashEntry(&DateCmds, argv[1])) {
+    cmd = (int (*)())ent->clientData;
+    Tk_Preserve((ClientData) date);
+    result = cmd(date, interp, argc, argv);
+    Tk_Release((ClientData) date);
+  } else {
+    Tcl_AppendResult(interp, "unknown command name: \"",
+                    argv[0], " ", argv[1], "\".", (char *) NULL);
+    result = TCL_ERROR;
+  }
+  return result;
+}
+
+
+int
+DateViewCmd(CLIENT_ARGS)
+{
+  SimDate *date;
+  Tk_Window tkwin = (Tk_Window) clientData;
+
+  if (argc < 2) {
+    Tcl_AppendResult(interp, "wrong # args:  should be \"",
+                    argv[0], " pathName ?options?\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  tkwin = Tk_CreateWindowFromPath(interp, tkwin,
+                                 argv[1], (char *) NULL);
+  if (tkwin == NULL) {
+    return TCL_ERROR;
+  }
+
+  date = (SimDate *)ckalloc(sizeof (SimDate));
+
+  date->tkwin = tkwin;
+  date->interp = interp;
+  date->flags = 0;
+  date->reset = 1;
+  date->month = 0;
+  date->year = 0;
+  date->lastmonth = 0;
+  date->lastyear = 0;
+  
+  Tk_SetClass(date->tkwin, "DateView");
+  Tk_CreateEventHandler(date->tkwin,
+                       VisibilityChangeMask |
+                       ExposureMask |
+                       StructureNotifyMask,
+                       SimDateEventProc, (ClientData) date);
+  Tcl_CreateCommand(interp, Tk_PathName(date->tkwin),
+                   DoDateCmd, (ClientData) date, (void (*)()) NULL);
+
+/*
+  Tk_MakeWindowExist(date->tkwin);
+*/
+  
+  if (getenv("XSYNCHRONIZE") != NULL) {
+    XSynchronize(Tk_Display(tkwin), 1);
+  }
+
+  InitNewDate(date);
+  DoNewDate(date);
+
+  if (ConfigureSimDate(interp, date, argc-2, argv+2, 0) != TCL_OK) {
+    /* XXX: destroy date */
+    Tk_DestroyWindow(date->tkwin);
+    return TCL_ERROR;
+  }
+
+  interp->result = Tk_PathName(date->tkwin);
+  return TCL_OK;
+}
+
+
+int
+ConfigureSimDate(Tcl_Interp *interp, SimDate *date,
+                 int argc, char **argv, int flags)
+{
+  if (Tk_ConfigureWidget(interp, date->tkwin, DateConfigSpecs,
+                        argc, argv, (char *) date, flags) != TCL_OK) {
+    return TCL_ERROR;
+  }
+  
+  Tk_SetBackgroundFromBorder(date->tkwin, date->border);
+
+  ComputeDateGeometry(date);
+
+  EventuallyRedrawDate(date);
+
+  return TCL_OK;
+}
+
+
+date_command_init()
+{
+  int new;
+
+  Tcl_CreateCommand(tk_mainInterp, "dateview", DateViewCmd,
+                   (ClientData)MainWindow, (void (*)()) NULL);
+
+  Tcl_InitHashTable(&DateCmds, TCL_STRING_KEYS);
+
+#define DATE_CMD(name) HASHED_CMD(Date, name)
+
+  DATE_CMD(configure);
+  DATE_CMD(position);
+  DATE_CMD(size);
+  DATE_CMD(Visible);
+  DATE_CMD(Reset);
+  DATE_CMD(Set);
+}
+
+
+InitNewDate(SimDate *date)
+{
+  int d = 8;
+  struct XDisplay *xd;
+
+  date->next = NULL;
+
+/* This stuff was initialized in our caller (DateCmd) */
+/*  date->tkwin = NULL; */
+/*  date->interp = NULL; */
+/*  date->flags = 0; */
+
+  date->x = NULL;
+  date->visible = 0;
+  date->w_x = date->w_y = 0;
+  date->w_width = date->w_height = 0;
+  date->pixmap = None;
+  date->pixels = NULL;
+  date->fontPtr = NULL;
+  date->border = NULL;
+  date->borderWidth = 0;
+  date->padX = 0;
+  date->padY = 0;
+  date->width = 0;
+  date->monthTab = 0;
+  date->monthTabX = 0;
+  date->yearTab = 0;
+  date->yearTabX = 0;
+  date->draw_date_token = 0;
+  date->reset = 1;
+  date->year = 0;
+  date->month = 0;
+  date->lastyear = 0;
+  date->lastmonth = 0;
+
+  date->x = FindXDisplay(date->tkwin);
+  IncRefDisplay(date->x);
+
+  date->pixels = date->x->pixels;
+  date->fontPtr = NULL;
+
+  DoResizeDate(date, 16, 16);
+}
+
+
+DestroyDate(SimDate *date)
+{
+  SimDate **gp;
+
+  for (gp = &sim->date;
+       (*gp) != NULL;
+       gp = &((*gp)->next)) {
+    if ((*gp) == date) {
+      (*gp) = date->next;
+      sim->dates--;
+      break;
+    }
+  }
+
+  if (date->pixmap != None) {
+    XFreePixmap(date->x->dpy, date->pixmap);
+    date->pixmap = None;
+  }
+
+  DecRefDisplay(date->x);
+
+  ckfree((char *) date);
+}
+
+
+DoResizeDate(SimDate *date, int w, int h)
+{
+  int resize = 0;
+
+  date->w_width = w; date->w_height = h;
+
+  if (date->pixmap != None) {
+    XFreePixmap(date->x->dpy, date->pixmap);
+    date->pixmap = None;
+  }
+  date->pixmap = XCreatePixmap(date->x->dpy, date->x->root,
+                               w, h, date->x->depth);
+  if (date->pixmap == None) {
+    fprintf(stderr,
+           "Sorry, Micropolis can't create a pixmap on X display \"%s\".\n",
+           date->x->display);
+    sim_exit(1); // Just sets tkMustExit and ExitReturn
+    return;
+  }
+}
+
+
+DoNewDate(SimDate *date)
+{
+  sim->dates++; date->next = sim->date; sim->date = date;
+
+  NewDate = 1;
+}
+
+
+#define BORDER 1
+
+DoUpdateDate(SimDate *date)
+{
+  Display *dpy;
+  GC gc;
+  Pixmap pm;
+  int *pix;
+  int w, h, i, j, x, y;
+  int tx, ty;
+  float sx, sy;
+
+  if (!date->visible) {
+    return;
+  }
+
+  dpy = date->x->dpy;
+  gc = date->x->gc;
+  pm = date->pixmap;
+  pix = date->pixels;
+
+  w = date->w_width;
+  h = date->w_height;
+
+  XSetFont(date->x->dpy, date->x->gc, date->fontPtr->fid);
+
+#if 0
+  if (date->x->color) {
+    XSetForeground(dpy, gc, pix[COLOR_LIGHTGRAY]);
+  } else {
+    XSetForeground(dpy, gc, pix[COLOR_WHITE]);
+  }
+#else
+  XSetForeground(dpy, gc, Tk_3DBorderColor(date->border)->pixel);
+#endif
+
+  XFillRectangle(dpy, pm, gc, 0, 0, w, h);
+
+  tx = BORDER; ty = BORDER;
+
+  if ((w -= (2 * BORDER)) < 1) w = 1;
+  if ((h -= (2 * BORDER)) < 1) h = 1;
+
+  x = date->borderWidth + date->padX + 1;
+  y = date->borderWidth + date->padY + date->fontPtr->ascent;
+
+  if (date->reset) {
+    date->reset = 0;
+    date->lastyear = date->year;
+    date->lastmonth = date->month;
+  }
+
+  {
+    char *dateString = "Date:";
+    char yearString[256];
+    int month = date->month;
+    int year = date->year;
+    int lastmonth = date->lastmonth;
+    int lastyear = date->lastyear;
+    int yearsPassed;
+    int monthsPassed;
+    yearsPassed =
+        (year - lastyear);
+    if (yearsPassed < 0) yearsPassed = 1;
+    if (yearsPassed > 9) yearsPassed = 9;
+    monthsPassed =
+      (month - lastmonth) +
+      (12 * yearsPassed);
+
+    if (monthsPassed > 11) monthsPassed = 11;
+    if (monthsPassed == 1) monthsPassed = 0;
+    if (monthsPassed) {
+      int m = lastmonth;
+      int i;
+
+      XSetForeground(dpy, gc, pix[COLOR_DARKGRAY]);
+
+      for (i = 0; i < monthsPassed; i++) {
+       
+       XDrawString(date->x->dpy, pm, date->x->gc,
+                   x + date->monthTabX, y,
+                   dateStr[m],
+                   strlen(dateStr[date->month]));
+
+       m++;
+       if (m == 12) m = 0;
+      }
+
+      if (year != lastyear) {
+       int yy = lastyear;
+       if ((year - yy) > 10) {
+         yy = year - 10;
+       }
+
+       for (i = yy; i < year; i++) {
+         sprintf(
+           yearString,
+           "%d",
+           i);
+
+         XDrawString(date->x->dpy, pm, date->x->gc,
+                     x + date->yearTabX, y,
+                     yearString,
+                     strlen(yearString));
+       }
+      }
+
+      EventuallyRedrawDate(date);
+    }
+
+    date->lastmonth = month;
+    date->lastyear = year;
+
+    XSetForeground(dpy, gc, pix[COLOR_BLACK]);
+
+    XDrawString(date->x->dpy, pm, date->x->gc,
+               x, y,
+               dateString,
+               strlen(dateString));
+
+    XDrawString(date->x->dpy, pm, date->x->gc,
+               x + date->monthTabX, y,
+               dateStr[date->month],
+               strlen(dateStr[date->month]));
+
+    sprintf(
+      yearString,
+      "%d",
+      year);
+
+    XDrawString(date->x->dpy, pm, date->x->gc,
+               x + date->yearTabX, y,
+               yearString,
+               strlen(yearString));
+  }
+
+  XCopyArea(date->x->dpy, date->pixmap,
+           Tk_WindowId(date->tkwin), date->x->gc,
+           0, 0, date->w_width, date->w_height, 0, 0);
+}
+
+
diff --git a/src/sim/w_editor.c b/src/sim/w_editor.c
new file mode 100644 (file)
index 0000000..b13e326
--- /dev/null
@@ -0,0 +1,1583 @@
+/* w_editor.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+Tcl_HashTable EditorCmds;
+int DoOverlay = 2;
+int BobHeight = 8;
+
+
+extern Tk_ConfigSpec TileViewConfigSpecs[];
+
+
+int EditorCmdconfigure(VIEW_ARGS)
+{
+  int result = TCL_OK;
+
+  if (argc == 2) {
+    result = Tk_ConfigureInfo(interp, view->tkwin, TileViewConfigSpecs,
+                             (char *) view, (char *) NULL, 0);
+  } else if (argc == 3) {
+    result = Tk_ConfigureInfo(interp, view->tkwin, TileViewConfigSpecs,
+                             (char *) view, argv[2], 0);
+  } else {
+    result = ConfigureTileView(interp, view, argc-2, argv+2,
+                              TK_CONFIG_ARGV_ONLY);
+  }
+  return TCL_OK;
+}
+
+
+int EditorCmdposition(VIEW_ARGS)
+{
+  if ((argc != 2) && (argc != 4)) {
+    return TCL_ERROR;
+  }
+  if (argc == 4) {
+    if ((Tcl_GetInt(interp, argv[2], &view->w_x) != TCL_OK) ||
+       (Tcl_GetInt(interp, argv[3], &view->w_y) != TCL_OK)) {
+      return TCL_ERROR;
+    }
+  }
+  sprintf(interp->result, "%d %d", view->w_x, view->w_y);
+  return TCL_OK;
+}
+
+
+int EditorCmdsize(VIEW_ARGS)
+{
+  if ((argc != 2) && (argc != 4)) {
+    return TCL_ERROR;
+  }
+  if (argc == 4) {
+    int w, h;
+    
+    if (Tcl_GetInt(interp, argv[2], &w) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    if (Tcl_GetInt(interp, argv[3], &h) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    view->w_width = w;
+    view->w_height = h;
+  }
+  sprintf(interp->result, "%d %d", view->w_width, view->w_height);
+  return TCL_OK;
+}
+
+
+int EditorCmdAutoGoto(VIEW_ARGS)
+{
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+  if (argc == 3) {
+    int val;
+
+    if (Tcl_GetInt(interp, argv[2], &val) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    view->auto_goto = val;
+    view->auto_going = view->auto_x_goal = view->auto_y_goal = 0;
+  }
+  sprintf(interp->result, "%d", view->auto_goto);
+  return TCL_OK;
+}
+
+
+int EditorCmdSound(VIEW_ARGS)
+{
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+  if (argc == 3) {
+    int val;
+
+    if (Tcl_GetInt(interp, argv[2], &val) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    view->sound = val;
+    view->auto_going = view->auto_x_goal = view->auto_y_goal = 0;
+  }
+  sprintf(interp->result, "%d", view->sound);
+  return TCL_OK;
+}
+
+
+int EditorCmdSkip(VIEW_ARGS)
+{
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+  if (argc == 3) {
+    int val;
+
+    if (Tcl_GetInt(interp, argv[2], &val) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    view->skip = view->skips = val; // XXX? why setting skips too?
+  }
+  sprintf(interp->result, "%d", view->skips);
+  return TCL_OK;
+}
+
+
+int EditorCmdUpdate(VIEW_ARGS)
+{
+  if (argc != 2) {
+    return TCL_ERROR;
+  }
+  view->skip = 0;
+  return TCL_OK;
+}
+
+
+int EditorCmdPan(VIEW_ARGS)
+{
+  if ((argc != 2) && (argc != 4)) {
+    return TCL_ERROR;
+  }
+  if (argc == 4) {
+    int x, y;
+
+    if (Tcl_GetInt(interp, argv[2], &x) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    if (Tcl_GetInt(interp, argv[3], &y) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    DoPanTo(view, x, y); Kick();
+  }
+  sprintf(interp->result, "%d %d", view->pan_x, view->pan_y);
+  return TCL_OK;
+}
+
+
+int EditorCmdToolConstrain(VIEW_ARGS)
+{
+  int x = -1, y = -1, tx, ty;
+
+  if (argc != 4) {
+    return TCL_ERROR;
+  }
+
+  if (Tcl_GetInt(interp, argv[2], &x) != TCL_OK) {
+    return TCL_ERROR;
+  }
+  if (Tcl_GetInt(interp, argv[3], &y) != TCL_OK) {
+    return TCL_ERROR;
+  }
+  view->tool_x_const = -1; view->tool_y_const = -1;
+  ViewToTileCoords(view, x, y, &tx, &ty);
+  view->tool_x_const = (x == -1) ? -1 : tx;
+  view->tool_y_const = (y == -1) ? -1 : ty;
+  return TCL_OK;
+}
+
+
+int EditorCmdToolState(VIEW_ARGS)
+{
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+  if (argc == 3) {
+    int state;
+
+    if (Tcl_GetInt(interp, argv[2], &state) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    setWandState(view, state);
+  }
+  sprintf(interp->result, "%d", view->tool_state);
+  return TCL_OK;
+}
+
+
+int EditorCmdToolMode(VIEW_ARGS)
+{
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+  if (argc == 3) {
+    int mode;
+
+    if (Tcl_GetInt(interp, argv[2], &mode) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    view->tool_mode = mode;
+  }
+  sprintf(interp->result, "%d", view->tool_mode);
+  return TCL_OK;
+}
+
+
+int EditorCmdDoTool(VIEW_ARGS)
+{
+  int tool, x, y;
+
+  if (argc != 5) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &tool) != TCL_OK) ||
+      (tool < 0) ||
+      (tool > lastState) ||
+      (Tcl_GetInt(interp, argv[3], &x) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[4], &y) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  DoTool(view, tool, x, y); Kick();
+  return TCL_OK;
+}
+
+
+int EditorCmdToolDown(VIEW_ARGS)
+{
+  int x, y;
+
+  if (argc != 4) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  ToolDown(view, x, y); Kick();
+  return TCL_OK;
+}
+
+
+int EditorCmdToolDrag(VIEW_ARGS)
+{
+  int x, y;
+
+  if (argc != 4) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  ToolDrag(view, x, y); Kick();
+  return TCL_OK;
+}
+
+
+int EditorCmdToolUp(VIEW_ARGS)
+{
+  int x, y;
+
+  if (argc != 4) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  ToolUp(view, x, y); Kick();
+  return TCL_OK;
+}
+
+
+int EditorCmdPanStart(VIEW_ARGS)
+{
+  int x, y;
+
+  if (argc != 4) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  view->last_x = x;
+  view->last_y = y;
+  return TCL_OK;
+}
+
+
+int EditorCmdPanTo(VIEW_ARGS)
+{
+  int x, y, dx, dy;
+
+  if (argc != 4) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  dx = (view->tool_x_const == -1) ? (view->last_x - x) : 0;
+  dy = (view->tool_y_const == -1) ? (view->last_y - y) : 0;
+  if (dx || dy) {
+    view->last_x = x;
+    view->last_y = y;
+    DoPanBy(view, dx, dy); Kick();
+  }
+  return TCL_OK;
+}
+
+
+int EditorCmdPanBy(VIEW_ARGS)
+{
+  int dx, dy;
+
+  if (argc != 4) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &dx) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[3], &dy) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  DoPanBy(view, dx, dy); Kick();
+  return TCL_OK;
+}
+
+
+int EditorCmdTweakCursor(VIEW_ARGS)
+{
+  int x, y;
+
+  XWarpPointer (view->x->dpy, None, None, 0, 0, 0, 0, 0, 0);
+
+  return TCL_OK;
+}
+
+
+int EditorCmdVisible(VIEW_ARGS)
+{
+  int visible;
+
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &visible) != TCL_OK) ||
+       (visible < 0) || (visible > 1)) {
+      return TCL_ERROR;
+    }
+
+    visible = visible && Tk_IsMapped(view->tkwin);
+    view->visible = visible;
+  }
+
+  sprintf(interp->result, "%d", view->visible);
+  return TCL_OK;
+}
+
+
+int EditorCmdKeyDown(VIEW_ARGS)
+{
+
+  if (argc != 3) {
+    return TCL_ERROR;
+  }
+
+  doKeyDown(view, argv[2][0]);
+  return TCL_OK;
+}
+
+
+int EditorCmdKeyUp(VIEW_ARGS)
+{
+
+  if (argc != 3) {
+    return TCL_ERROR;
+  }
+
+  doKeyUp(view, argv[2][0]);
+  return TCL_OK;
+}
+
+
+int EditorCmdTileCoord(VIEW_ARGS)
+{
+  int x, y;
+
+  if ((argc != 2) && (argc != 4)) {
+    return TCL_ERROR;
+  }
+
+  if (Tcl_GetInt(interp, argv[2], &x) != TCL_OK) {
+    return TCL_ERROR;
+  }
+  if (Tcl_GetInt(interp, argv[3], &y) != TCL_OK) {
+    return TCL_ERROR;
+  }
+
+  ViewToTileCoords(view, x, y, &x, &y);
+
+  sprintf(interp->result, "%d %d", x, y);
+  return TCL_OK;
+}
+
+
+int EditorCmdChalkStart(VIEW_ARGS)
+{
+  int x, y;
+
+  if (argc != 4) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  ChalkStart(view, x, y, COLOR_WHITE);
+  return TCL_OK;
+}
+
+
+int EditorCmdChalkTo(VIEW_ARGS)
+{
+  int x, y;
+
+  if (argc != 4) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  ChalkTo(view, x, y);
+  return TCL_OK;
+}
+
+
+int EditorCmdAutoGoing(VIEW_ARGS)
+{
+  int flag;
+
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &flag) != TCL_OK)) {
+      return TCL_ERROR;
+    }
+
+    view->auto_going = flag;
+    if (view->auto_goto == -1)
+      view->auto_goto = 0;
+  }
+
+  sprintf(interp->result, "%d", view->auto_going);
+  return TCL_OK;
+}
+
+
+int EditorCmdAutoSpeed(VIEW_ARGS)
+{
+  int speed;
+
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &speed) != TCL_OK) ||
+       (speed < 1)) {
+      return TCL_ERROR;
+    }
+
+    view->auto_speed = speed;
+  }
+
+  sprintf(interp->result, "%d", view->auto_speed);
+  return TCL_OK;
+}
+
+
+int EditorCmdAutoGoal(VIEW_ARGS)
+{
+  if ((argc != 2) && (argc != 4)) {
+    return TCL_ERROR;
+  }
+  if (argc == 4) {
+    int x, y, dx, dy;
+
+    if (Tcl_GetInt(interp, argv[2], &x) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    if (Tcl_GetInt(interp, argv[3], &y) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    view->auto_x_goal = x;
+    view->auto_y_goal = y;
+    /* actually go there if more than a block away */
+    dx = view->pan_x - x;
+    dy = view->pan_y - y;
+    view->auto_going = (((dx * dx) + (dy * dy)) > (64 * 64));
+    if ((view->auto_going != 0) &&
+       (view->auto_goto == 0))
+      view->auto_goto = -1;
+  }
+
+  sprintf(interp->result, "%d %d", view->auto_x_goal, view->auto_y_goal);
+  return TCL_OK;
+}
+
+
+int EditorCmdSU(VIEW_ARGS)
+{
+  int su;
+
+  if ((argc != 2) && (argc != 4)) {
+    return TCL_ERROR;
+  }
+
+  if (argc == 4) {
+    if ((strcmp(argv[3], "xyzzy") != 0) ||
+       (Tcl_GetInt(interp, argv[2], &su) != TCL_OK)) {
+      return TCL_ERROR;
+    }
+
+    view->super_user = su;
+  }
+
+  sprintf(interp->result, "%d", view->super_user);
+  return TCL_OK;
+}
+
+
+int EditorCmdShowMe(VIEW_ARGS)
+{
+  int flag;
+
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if (Tcl_GetInt(interp, argv[2], &flag) != TCL_OK) {
+      return TCL_ERROR;
+    }
+
+    view->show_me = flag;
+  }
+
+  sprintf(interp->result, "%d", view->show_me);
+  return TCL_OK;
+}
+
+
+int EditorCmdFollow(VIEW_ARGS)
+{
+  int id;
+  SimSprite *sprite;
+
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    view->follow = NULL;
+    if (argv[2][0] != '\0') {
+      for (sprite = sim->sprite; sprite != NULL; sprite = sprite->next) {
+       if (strcmp(sprite->name, argv[2]) == 0) {
+         view->follow = sprite;
+         break;
+       }
+      }
+    }
+
+    if (view->follow != NULL) {
+      HandleAutoGoto(view);
+    }
+  }
+
+  sprintf(interp->result, "%s",
+         (view->follow == NULL) ? "" : view->follow->name);
+  return TCL_OK;
+}
+
+
+int EditorCmdShowOverlay(VIEW_ARGS)
+{
+  int flag;
+
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &flag) != TCL_OK)) {
+      return TCL_ERROR;
+    }
+
+    view->show_overlay = flag;
+  }
+
+  sprintf(interp->result, "%d", view->show_overlay);
+  return TCL_OK;
+}
+
+
+int EditorCmdOverlayMode(VIEW_ARGS)
+{
+  int flag;
+
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &flag) != TCL_OK)) {
+      return TCL_ERROR;
+    }
+
+    view->overlay_mode = flag;
+  }
+
+  sprintf(interp->result, "%d", view->overlay_mode);
+  return TCL_OK;
+}
+
+
+int EditorCmdDynamicFilter(VIEW_ARGS)
+{
+  int val;
+
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK)) {
+      return TCL_ERROR;
+    }
+
+    view->dynamic_filter = val;
+  }
+
+  sprintf(interp->result, "%d", view->dynamic_filter);
+  return TCL_OK;
+}
+
+
+int EditorCmdWriteJpeg(VIEW_ARGS)
+{
+  int val;
+  char *fileName = argv[2];
+
+  if (argc != 3) {
+    return TCL_ERROR;
+  }
+  
+  // Write a jpeg file of this view.
+
+  return TCL_OK;
+}
+
+
+editor_command_init()
+{
+  int new;
+  extern int TileViewCmd(CLIENT_ARGS);
+
+  Tcl_CreateCommand(tk_mainInterp, "editorview", TileViewCmd,
+                   (ClientData)MainWindow, (void (*)()) NULL);
+
+  Tcl_InitHashTable(&EditorCmds, TCL_STRING_KEYS);
+
+#define EDITOR_CMD(name) HASHED_CMD(Editor, name)
+
+  EDITOR_CMD(configure);
+  EDITOR_CMD(position);
+  EDITOR_CMD(size);
+  EDITOR_CMD(AutoGoto);
+  EDITOR_CMD(Sound);
+  EDITOR_CMD(Skip);
+  EDITOR_CMD(Update);
+  EDITOR_CMD(Pan);
+  EDITOR_CMD(ToolConstrain);
+  EDITOR_CMD(ToolState);
+  EDITOR_CMD(ToolMode);
+  EDITOR_CMD(DoTool);
+  EDITOR_CMD(ToolDown);
+  EDITOR_CMD(ToolDrag);
+  EDITOR_CMD(ToolUp);
+  EDITOR_CMD(PanStart);
+  EDITOR_CMD(PanTo);
+  EDITOR_CMD(PanBy);
+  EDITOR_CMD(TweakCursor);
+  EDITOR_CMD(Visible);
+  EDITOR_CMD(KeyDown);
+  EDITOR_CMD(KeyUp);
+  EDITOR_CMD(TileCoord);
+  EDITOR_CMD(ChalkStart);
+  EDITOR_CMD(ChalkTo);
+  EDITOR_CMD(AutoGoing);
+  EDITOR_CMD(AutoSpeed);
+  EDITOR_CMD(AutoGoal);
+  EDITOR_CMD(SU);
+  EDITOR_CMD(ShowMe);
+  EDITOR_CMD(Follow);
+  EDITOR_CMD(ShowOverlay);
+  EDITOR_CMD(OverlayMode);
+  EDITOR_CMD(DynamicFilter);
+}
+
+
+int
+DoEditorCmd(CLIENT_ARGS)
+{
+  SimView *view = (SimView *) clientData;
+  Tcl_HashEntry *ent;
+  int result = TCL_OK;
+  int (*cmd)();
+
+  if (argc < 2) {
+    return TCL_ERROR;
+  }
+
+  if (ent = Tcl_FindHashEntry(&EditorCmds, argv[1])) {
+    cmd = (int (*)())ent->clientData;
+    Tk_Preserve((ClientData) view);
+    result = cmd(view, interp, argc, argv);
+    Tk_Release((ClientData) view);
+  } else {
+    Tcl_AppendResult(interp, "unknown command name: \"",
+                    argv[0], " ", argv[1], "\".", (char *) NULL);
+    result = TCL_ERROR;
+  }
+  return result;
+}
+
+
+
+/*************************************************************************/
+
+
+DoNewEditor(SimView *view)
+{
+  sim->editors++; view->next = sim->editor; sim->editor = view;
+  view->invalid = 1;
+}
+
+
+DoUpdateEditor(SimView *view)
+{
+  int dx, dy, i;
+
+  view->updates++;
+
+  if (!view->visible) {
+    return;
+  }
+
+  if ((!ShakeNow) &&
+//      (!view->invalid) &&
+      (!view->update) &&
+      (sim_skips ||
+       view->skips)) {
+    if (sim_skips) {
+      if (sim_skip > 0) {
+       return 0;
+      }
+    } else {
+      if (view->skip > 0) {
+       --view->skip;
+       return 0;
+      } else {
+       view->skip = view->skips;
+      }
+    }
+  }
+
+  view->skips = 0;
+  view->update = 0;
+
+  HandleAutoGoto(view);
+
+  if (DoAnimation && SimSpeed && !heat_steps && !TilesAnimated) {
+    TilesAnimated = 1;
+    animateTiles();
+  }
+
+  if (view->invalid) {
+
+    switch (view->type) {
+
+    case X_Mem_View:
+      MemDrawBeegMapRect(view, view->tile_x, view->tile_y,
+                        view->tile_width, view->tile_height);
+      break;
+
+    case X_Wire_View:
+      WireDrawBeegMapRect(view, view->tile_x, view->tile_y,
+                         view->tile_width, view->tile_height);
+      break;
+
+    }
+
+    XCopyArea(view->x->dpy, view->pixmap, view->pixmap2, view->x->gc,
+             0, 0, view->screen_width, view->screen_height,
+             view->screen_x, view->screen_y);
+    DrawOutside(view);
+    if (PendingTool != -1) {
+      DrawPending(view);
+    }
+    DrawObjects(view);
+    if (view->show_overlay) {
+      DrawOverlay(view);
+    }
+  }
+
+  for (dx = dy = i = 0; i < ShakeNow; i++) {
+    dx += Rand(16) - 8;
+    dy += Rand(16) - 8;
+  }
+
+  XCopyArea(view->x->dpy, view->pixmap2,
+           Tk_WindowId(view->tkwin), view->x->gc,
+           0, 0, view->w_width, view->w_height, dx, dy);
+
+  DrawCursor(view);
+
+  view->invalid = 0;
+}
+
+
+HandleAutoGoto(SimView *view)
+{
+  if (view->follow != NULL) {
+    int x = view->follow->x + view->follow->x_hot,
+        y = view->follow->y + view->follow->y_hot;
+
+    if ((x != view->pan_x) ||
+       (y != view->pan_y)) {
+      DoPanTo(view, x, y);
+    }
+  } else if (view->auto_goto &&
+            view->auto_going &&
+            (view->tool_mode == 0)) {
+    int dx, dy;
+    int panx, pany, speed;
+    double dist, sloth;
+
+    speed = view->auto_speed;
+
+    if (view->auto_going < 5) {
+      sloth = ((double)view->auto_going) / 5.0;
+    } else {
+      sloth = 1.0;
+    }
+
+    dx = view->auto_x_goal - view->pan_x;
+    dy = view->auto_y_goal - view->pan_y;
+
+    dist = sqrt((double)((dx * dx) + (dy * dy)));
+
+    if (dist < (speed * sloth)) {
+      view->auto_going = 0;
+      if (view->auto_goto == -1)
+       view->auto_goto = 0;
+      DoPanTo(view, view->auto_x_goal, view->auto_y_goal);
+      NewMap = 1;
+      DidStopPan(view);
+    } else {
+      double atan2(), cos(), sin();
+      double direction, vx, vy;
+      double co, si;
+
+      direction = (double)atan2((double)dy, (double)dx);
+      co = (double)cos(direction);
+      si = (double)sin(direction);
+      vx = co * (double)speed;
+      vy = si * (double)speed;
+
+      vx *= sloth; vy *= sloth;
+      speed *= sloth;
+
+      vx += 0.5; vy += 0.5;
+
+      DoPanBy(view, (int)(vx), (int)(vy));
+      view->auto_going++;
+    }
+  }
+}
+
+DrawOutside(SimView *view)
+{
+  Pixmap pm = view->pixmap2;
+  int left = (view->w_width / 2) - view->pan_x;
+  int right = left + view->i_width;
+  int top = (view->w_height / 2) - view->pan_y;
+  int bottom = top + view->i_height;
+
+  if ((top > 0) || (bottom < view->w_height) ||
+      (left > 0) || (right < view->w_width)) {
+    if (view->x->color) {
+      XSetForeground(view->x->dpy, view->x->gc,
+                    view->pixels[COLOR_BLACK]);
+    } else {
+      XSetForeground(view->x->dpy, view->x->gc,
+                    view->pixels[COLOR_WHITE]);
+    }
+
+    if (top > 0)
+      XFillRectangle(view->x->dpy, pm, view->x->gc,
+                    0, 0, view->w_width, top);
+    if (bottom < view->w_height)
+      XFillRectangle(view->x->dpy, pm, view->x->gc,
+                    0, bottom, view->w_width,
+                    view->w_height - bottom);
+    if (left > 0)
+      XFillRectangle(view->x->dpy, pm, view->x->gc,
+                    0, top, left, bottom - top);
+    if (right < view->w_width)
+      XFillRectangle(view->x->dpy, pm, view->x->gc,
+                    right, top, view->w_width - right, bottom - top);
+  }
+}
+
+
+char CursorDashes[] = { 4, 4 };
+
+DrawPending(SimView *view)
+{
+  Pixmap pm = view->pixmap2;
+  int left = (view->w_width / 2) - view->pan_x;
+  int top = (view->w_height / 2) - view->pan_y;
+  int x, y, size;
+  char *iconname = NULL;
+
+  x = (PendingX - toolOffset[PendingTool]) <<4;
+  y = (PendingY - toolOffset[PendingTool]) <<4;
+  size = toolSize[PendingTool] <<4;
+  x += left; y += top;
+
+  XSetStipple(view->x->dpy, view->x->gc, view->x->gray50_stipple);
+  XSetTSOrigin(view->x->dpy, view->x->gc, 0, 0);
+  XSetForeground(view->x->dpy, view->x->gc, view->x->pixels[COLOR_BLACK]);
+  XSetFillStyle(view->x->dpy, view->x->gc, FillStippled);
+  XFillRectangle(view->x->dpy, pm, view->x->gc,
+                x, y, size, size);
+  XSetFillStyle(view->x->dpy, view->x->gc, FillSolid);
+
+  switch (PendingTool) {
+  case residentialState:
+    iconname = "@images/res.xpm"; break;
+  case commercialState:
+    iconname = "@images/com.xpm"; break;
+  case industrialState:
+    iconname = "@images/ind.xpm"; break;
+  case fireState:
+    iconname = "@images/fire.xpm"; break;
+  case policeState:
+    iconname = "@images/police.xpm"; break;
+  case stadiumState:
+    iconname = "@images/stadium.xpm"; break;
+  case seaportState:
+    iconname = "@images/seaport.xpm"; break;
+  case powerState:
+    iconname = "@images/coal.xpm"; break;
+  case nuclearState:
+    iconname = "@images/nuclear.xpm"; break;
+  case airportState:
+    iconname = "@images/airport.xpm"; break;
+  default:
+    break;
+  }
+
+  if (iconname != NULL) {
+    Pixmap icon = Tk_GetPixmap(view->interp, view->tkwin, iconname);
+    float f;
+    int i;
+
+    gettimeofday(&now_time, NULL);
+    f = (2 * now_time.tv_usec / 1000000.0);
+    if (f > 1.0) f = 2.0 - f;
+    i = (int)(f * BobHeight * (Players - Votes));
+
+    if (icon != None) {
+      XCopyArea(view->x->dpy, icon, pm, view->x->gc, 
+               0, 0, size, size, x + i, y - i);
+    }
+  }
+}
+
+
+DrawCursor(SimView *view)
+{
+  Pixmap pm = Tk_WindowId(view->tkwin);
+  int left = (view->w_width / 2) - view->pan_x;
+  int top = (view->w_height / 2) - view->pan_y;
+  int x, y, mode, size, offset, fg, bg, light, dark;
+  SimView *v;
+
+  for (v = sim->editor; v != NULL; v = v->next) {
+    mode = v->tool_mode;
+    if ((v->show_me != 0) &&
+       ((mode == -1) || v->tool_showing)) {
+      x = v->tool_x; y = v->tool_y;
+      if (mode == -1) { /* pan cursor */
+
+       x += left; y += top;
+
+       XSetLineAttributes(view->x->dpy, view->x->gc, 3,
+                          LineSolid, CapRound, JoinMiter);
+       XSetForeground(view->x->dpy, view->x->gc,
+                      view->pixels[COLOR_BLACK]);
+       XDrawLine(view->x->dpy, pm, view->x->gc,
+                 x - 6, y - 6, x + 6, y + 6);
+       XDrawLine(view->x->dpy, pm, view->x->gc,
+                 x - 6, y + 6, x + 6, y - 6);
+       XDrawLine(view->x->dpy, pm, view->x->gc,
+                 x - 8, y, x + 8, y);
+       XDrawLine(view->x->dpy, pm, view->x->gc,
+                 x, y + 8, x, y - 8);
+       XSetLineAttributes(view->x->dpy, view->x->gc, 1,
+                          LineSolid, CapRound, JoinMiter);
+       XSetForeground(view->x->dpy, view->x->gc,
+                      view->pixels[COLOR_WHITE]);
+       XDrawLine(view->x->dpy, pm, view->x->gc,
+                 x - 6, y - 6, x + 6, y + 6);
+       XDrawLine(view->x->dpy, pm, view->x->gc,
+                 x - 6, y + 6, x + 6, y - 6);
+       XDrawLine(view->x->dpy, pm, view->x->gc,
+                 x - 8, y, x + 8, y);
+       XDrawLine(view->x->dpy, pm, view->x->gc,
+                 x, y + 8, x, y - 8);
+       XSetLineAttributes(view->x->dpy, view->x->gc, 1,
+                          LineSolid, CapButt, JoinMiter);
+
+      } else { /* edit cursor */
+
+       size = toolSize[v->tool_state];
+       fg = toolColors[v->tool_state] & 0xff;
+       light = COLOR_WHITE;
+       dark = COLOR_BLACK;
+       if (mode == 1) {
+         int temp = dark;
+         dark = light;
+         light = temp;
+       }
+       switch (v->tool_state) {
+
+       case chalkState:
+         x += left; y += top;
+         if (mode == 1) {
+           offset = 2;
+         } else {
+           offset = 0;
+
+           if (view->x->color) {
+             XSetForeground(view->x->dpy, view->x->gc,
+                            view->pixels[COLOR_MEDIUMGRAY]);
+             XFillArc(view->x->dpy, pm, view->x->gc,
+                      x - 8, y + 7, 7, 7, 0, 360 * 64);
+           } else {
+             XSetStipple(view->x->dpy, view->x->gc,
+                         view->x->gray50_stipple);
+             XSetTSOrigin(view->x->dpy, view->x->gc, 0, 0);
+             XSetForeground(view->x->dpy, view->x->gc,
+                            view->x->pixels[COLOR_BLACK]);
+             XSetBackground(view->x->dpy, view->x->gc,
+                            view->x->pixels[COLOR_WHITE]);
+             XSetFillStyle(view->x->dpy, view->x->gc, FillOpaqueStippled);
+             XFillArc(view->x->dpy, pm, view->x->gc,
+                      x - 8, y + 7, 7, 7, 0, 360 * 64);
+             XSetFillStyle(view->x->dpy, view->x->gc, FillSolid);
+           }
+         }
+
+         if (view->x->color) {
+           XSetLineAttributes(view->x->dpy, view->x->gc, 3,
+                              LineSolid, CapRound, JoinMiter);
+           XSetForeground(view->x->dpy, view->x->gc,
+                          view->pixels[COLOR_LIGHTGRAY]);
+           XFillArc(view->x->dpy, pm, view->x->gc,
+                    x - 6 - offset, y + 5 + offset, 7, 7, 0, 360 * 64);
+           XDrawLine(view->x->dpy, pm, view->x->gc,
+                     x + 13 - offset, y - 5 + offset,
+                     x - 1 - offset, y + 9 + offset);
+           XSetForeground(view->x->dpy, view->x->gc,
+                          view->pixels[COLOR_WHITE]);
+           XDrawLine(view->x->dpy, pm, view->x->gc,
+                     x + 11 - offset, y - 7 + offset,
+                     x - 3 - offset, y + 7 + offset);
+           XFillArc(view->x->dpy, pm, view->x->gc,
+                    x + 8 - offset, y - 9 + offset, 7, 7, 0, 360 * 64);
+           XSetLineAttributes(view->x->dpy, view->x->gc, 1,
+                              LineSolid, CapButt, JoinMiter);
+         } else {
+           XSetLineAttributes(view->x->dpy, view->x->gc, 3,
+                              LineSolid, CapRound, JoinMiter);
+           XSetStipple(view->x->dpy, view->x->gc,
+                       view->x->gray25_stipple);
+           XSetTSOrigin(view->x->dpy, view->x->gc, 0, 0);
+           XSetForeground(view->x->dpy, view->x->gc,
+                          view->x->pixels[COLOR_BLACK]);
+           XSetBackground(view->x->dpy, view->x->gc,
+                          view->x->pixels[COLOR_WHITE]);
+           XSetFillStyle(view->x->dpy, view->x->gc, FillOpaqueStippled);
+           XFillArc(view->x->dpy, pm, view->x->gc,
+                    x - 6 - offset, y + 5 + offset, 7, 7, 0, 360 * 64);
+           XDrawLine(view->x->dpy, pm, view->x->gc,
+                     x + 13 - offset, y - 5 + offset,
+                     x - 1 - offset, y + 9 + offset);
+           XSetStipple(view->x->dpy, view->x->gc,
+                       view->x->gray75_stipple);
+           XDrawLine(view->x->dpy, pm, view->x->gc,
+                     x + 11 - offset, y - 7 + offset,
+                     x - 3 - offset, y + 7 + offset);
+           XFillArc(view->x->dpy, pm, view->x->gc,
+                    x + 8 - offset, y - 9 + offset, 7, 7, 0, 360 * 64);
+           XSetLineAttributes(view->x->dpy, view->x->gc, 1,
+                              LineSolid, CapButt, JoinMiter);
+           XSetFillStyle(view->x->dpy, view->x->gc, FillSolid);
+         }
+
+         break;
+
+       case eraserState:
+         x += left; y += top;
+         if (mode == 1) {
+           offset = 0;
+         } else {
+           offset = 2;
+
+           if (view->x->color) {
+             XSetForeground(view->x->dpy, view->x->gc,
+                            view->pixels[COLOR_MEDIUMGRAY]);
+             XFillRectangle(view->x->dpy, pm, view->x->gc,
+                      x - 8, y - 8, 16, 16);
+           } else {
+             XSetStipple(view->x->dpy, view->x->gc,
+                         view->x->gray50_stipple);
+             XSetTSOrigin(view->x->dpy, view->x->gc, 0, 0);
+             XSetForeground(view->x->dpy, view->x->gc,
+                            view->x->pixels[COLOR_BLACK]);
+             XSetBackground(view->x->dpy, view->x->gc,
+                            view->x->pixels[COLOR_WHITE]);
+             XSetFillStyle(view->x->dpy, view->x->gc, FillOpaqueStippled);
+             XFillRectangle(view->x->dpy, pm, view->x->gc,
+                      x - 8, y - 8, 16, 16);
+             XSetFillStyle(view->x->dpy, view->x->gc, FillSolid);
+           }
+         }
+
+         if (view->x->color) {
+           XSetForeground(view->x->dpy, view->x->gc,
+                          view->pixels[COLOR_LIGHTGRAY]);
+         } else {
+           XSetStipple(view->x->dpy, view->x->gc,
+                       view->x->gray75_stipple);
+           XSetTSOrigin(view->x->dpy, view->x->gc, 0, 0);
+           XSetForeground(view->x->dpy, view->x->gc,
+                          view->x->pixels[COLOR_BLACK]);
+           XSetBackground(view->x->dpy, view->x->gc,
+                          view->x->pixels[COLOR_WHITE]);
+           XSetFillStyle(view->x->dpy, view->x->gc, FillOpaqueStippled);
+         }
+
+         /* top */
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x - 8 + offset, y - 8 - offset,
+                   x + 8 + offset, y - 8 - offset);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x - 7 + offset, y - 7 - offset,
+                   x + 7 + offset, y - 7 - offset);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x - 6 + offset, y - 6 - offset,
+                   x + 6 + offset, y - 6 - offset);
+
+         /* left */
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x - 8 + offset, y - 8 - offset,
+                   x - 8 + offset, y + 8 - offset);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x - 7 + offset, y - 7 - offset,
+                   x - 7 + offset, y + 7 - offset);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x - 6 + offset, y - 6 - offset,
+                   x - 6 + offset, y + 6 - offset);
+
+         if (view->x->color) {
+           XSetForeground(view->x->dpy, view->x->gc,
+                          view->pixels[COLOR_BLACK]);
+         } else {
+           XSetFillStyle(view->x->dpy, view->x->gc, FillSolid);
+         }
+
+         /* bottom */
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x - 7 + offset, y + 7 - offset,
+                   x + 8 + offset, y + 7 - offset);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x - 6 + offset, y + 6 - offset,
+                   x + 7 + offset, y + 6 - offset);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x - 5 + offset, y + 5 - offset,
+                   x + 6 + offset, y + 5 - offset);
+
+         /* right */
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x + 7 + offset, y + 8 - offset,
+                   x + 7 + offset, y - 7 - offset);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x + 6 + offset, y + 7 - offset,
+                   x + 6 + offset, y - 6 - offset);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x + 5 + offset, y + 6 - offset,
+                   x + 5 + offset, y - 5 - offset);
+
+         if (view->x->color) {
+           XSetForeground(view->x->dpy, view->x->gc,
+                          view->pixels[COLOR_DARKGRAY]);
+           XFillRectangle(view->x->dpy, pm, view->x->gc,
+                          x - 5 + offset, y - 5 - offset, 10, 10);
+         } else {
+           XSetStipple(view->x->dpy, view->x->gc,
+                       view->x->gray50_stipple);
+           XSetForeground(view->x->dpy, view->x->gc,
+                          view->x->pixels[COLOR_BLACK]);
+           XSetBackground(view->x->dpy, view->x->gc,
+                          view->x->pixels[COLOR_WHITE]);
+           XSetFillStyle(view->x->dpy, view->x->gc, FillOpaqueStippled);
+           XFillRectangle(view->x->dpy, pm, view->x->gc,
+                          x - 5 + offset, y - 5 - offset, 10, 10);
+           XSetFillStyle(view->x->dpy, view->x->gc, FillSolid);
+         }
+
+         break;
+
+       default:
+         offset = toolOffset[v->tool_state];
+
+         bg = (toolColors[v->tool_state] >> 8) & 0xff;
+
+         x = (x & ~15) - (offset <<4);
+         y = (y & ~15) - (offset <<4);
+         size <<= 4;
+         x += left; y += top;
+
+         XSetForeground(view->x->dpy, view->x->gc,
+                        view->pixels[dark]);
+         XDrawRectangle(view->x->dpy, pm, view->x->gc,
+                        x - 1, y - 1, size + 4, size + 4);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x - 3, y + size + 3,
+                   x - 1, y + size + 3);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x + size + 3, y - 3,
+                   x + size + 3, y - 1);
+
+         XSetForeground(view->x->dpy, view->x->gc,
+                        view->pixels[light]);
+         XDrawRectangle(view->x->dpy, pm, view->x->gc,
+                        x - 4, y - 4, size + 4, size + 4);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x - 4, y + size + 1,
+                   x - 4, y + size + 3);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x + size + 1, y - 4,
+                   x + size + 3, y - 4);
+
+         if (view->x->color) {
+           if (fg == bg) {
+             XSetForeground(view->x->dpy, view->x->gc,
+                            view->x->pixels[fg]);
+             XSetLineAttributes(view->x->dpy, view->x->gc, 2,
+                                LineSolid, CapButt, JoinMiter);
+           } else {
+             XSetForeground(view->x->dpy, view->x->gc,
+                            view->x->pixels[fg]);
+             XSetBackground(view->x->dpy, view->x->gc,
+                            view->pixels[bg]);
+
+             XSetLineAttributes(view->x->dpy, view->x->gc, 2,
+                                LineDoubleDash, CapButt, JoinMiter);
+             XSetDashes(view->x->dpy, view->x->gc, 0, CursorDashes, 2);
+           }
+         } else {
+           XSetStipple(view->x->dpy, view->x->gc,
+                       view->x->gray50_stipple);
+           XSetForeground(view->x->dpy, view->x->gc,
+                          view->x->pixels[COLOR_BLACK]);
+           XSetBackground(view->x->dpy, view->x->gc,
+                          view->x->pixels[COLOR_WHITE]);
+           XSetFillStyle(view->x->dpy, view->x->gc, FillOpaqueStippled);
+           XSetLineAttributes(view->x->dpy, view->x->gc, 2,
+                              LineSolid, CapButt, JoinMiter);
+         }
+
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x - 2, y - 1, x - 2, y + size + 3);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x - 1, y + size + 2, x + size + 3, y + size + 2);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x + size + 2, y + size + 1, x + size + 2, y - 3);
+         XDrawLine(view->x->dpy, pm, view->x->gc,
+                   x + size + 1, y - 2, x - 3, y - 2);
+
+         if (!view->x->color) {
+           XSetFillStyle(view->x->dpy, view->x->gc, FillSolid);
+         }
+         XSetLineAttributes(view->x->dpy, view->x->gc, 1,
+                            LineSolid, CapButt, JoinMiter);
+         
+         break;
+       }
+      }
+    }
+  }
+}
+
+
+TimeElapsed(struct timeval *elapsed,
+           struct timeval *start,
+           struct timeval *finish)
+{
+  int usec = finish->tv_usec - start->tv_usec;
+  int sec = finish->tv_sec - start->tv_sec;
+
+  while (usec < 0) {
+    usec += 1000000;
+    sec--;
+  }
+  elapsed->tv_usec = usec;
+  elapsed->tv_sec = sec;
+}
+
+
+
+DrawOverlay(SimView *view)
+{
+  int width = view->w_width;
+  int height = view->w_height;
+  int left = view->pan_x - (width / 2);
+  int top = view->pan_y - (height / 2);
+  int right = left + width;
+  int bottom = top + height;
+  int showing = 0;
+  Ink *ink;
+  struct timeval start, finished, elapsed;
+
+  for (ink = sim->overlay; ink != NULL; ink = ink->next) {
+    if ((ink->bottom >= top) && (ink->top <= bottom) &&
+       (ink->right >= left) && (ink->left <= right)) {
+      showing = 1;
+      break;
+    }
+  }
+
+  if (!showing) return;
+
+/* overlay_mode state machine:
+   0 => overlay invalid: 
+        draw lines to pm => 1
+   1 => overlay stable: 
+        sync, time draw lines to pm => 2
+   2 => overlay stable: 
+        draw lines to ol,
+        sync, time clip ol to pm,
+        lines faster? => 3,
+       clipping faster? => 4
+   3 => lines faster: 
+        draw lines to pm => 3
+   4 => clipping faster: 
+        clip ol to pm => 4
+*/   
+
+  switch (view->overlay_mode) {
+  case 0:
+    DrawTheOverlay(view, view->x->gc,
+                  view->pixmap2, view->pixels[COLOR_WHITE],
+                  top, bottom, left, right, 0);
+    view->overlay_mode = 1;
+    break;
+  case 1:
+    XSync(view->x->dpy, False);
+    gettimeofday(&start, NULL);
+    DrawTheOverlay(view, view->x->gc,
+                  view->pixmap2, view->pixels[COLOR_WHITE],
+                  top, bottom, left, right, 0);
+    XSync(view->x->dpy, False);
+    gettimeofday(&finished, NULL);
+    TimeElapsed(&view->overlay_time, &start, &finished);
+    view->overlay_mode = 2;
+    break;
+  case 2:
+    XSetForeground(view->x->dpy, view->x->overlay_gc, 0);
+    XFillRectangle(view->x->dpy, view->overlay_pixmap, view->x->overlay_gc,
+                  0, 0, view->m_width, view->m_height);
+    DrawTheOverlay(view, view->x->overlay_gc,
+                  view->overlay_pixmap, 1,
+                  top, bottom, left, right, 1);
+    XSync(view->x->dpy, False);
+    gettimeofday(&start, NULL);
+    ClipTheOverlay(view);
+    XSync(view->x->dpy, False);
+    gettimeofday(&finished, NULL);
+    TimeElapsed(&elapsed, &start, &finished);
+    if ((elapsed.tv_sec > view->overlay_time.tv_sec) ||
+       ((elapsed.tv_sec == view->overlay_time.tv_sec) &&
+        ((elapsed.tv_usec > view->overlay_time.tv_usec)))) {
+      view->overlay_mode = 3;
+    } else {
+      view->overlay_mode = 4;
+    }
+    break;
+  case 3:
+    DrawTheOverlay(view, view->x->gc,
+                  view->pixmap2, view->pixels[COLOR_WHITE],
+                  top, bottom, left, right, 0);
+    break;
+  case 4:
+    ClipTheOverlay(view);
+    break;
+  }
+}
+
+
+DrawTheOverlay(SimView *view, GC gc, Pixmap pm, int color, 
+              int top, int bottom, int left, int right,
+              int onoverlay)
+{
+  Ink *ink;
+
+  if (view->x->color) {
+    XSetForeground(view->x->dpy, gc, color);
+    XSetLineAttributes(view->x->dpy, gc, 3,
+                      LineSolid, CapButt, JoinBevel);
+  } else {
+    if (!onoverlay) {
+      XSetStipple(view->x->dpy, gc, view->x->gray50_stipple);
+      XSetTSOrigin(view->x->dpy, gc, view->updates & 1, 0);
+      XSetBackground(view->x->dpy, gc, 0);
+      XSetFillStyle(view->x->dpy, gc, FillOpaqueStippled);
+    }
+    XSetForeground(view->x->dpy, gc, 1);
+    XSetLineAttributes(view->x->dpy, gc, 3,
+                      LineSolid, CapButt, JoinBevel);
+  }
+  for (ink = sim->overlay; ink != NULL; ink = ink->next) {
+    if ((ink->bottom >= top) && (ink->top <= bottom) &&
+       (ink->right >= left) && (ink->left <= right)) {
+      if (ink->length <= 1) {
+       XFillArc(view->x->dpy, pm, gc,
+                ink->x - 3, ink->y - 3, 6, 6, 0, 360 * 64);
+      } else {
+       ink->points[0].x = ink->x - left;
+       ink->points[0].y = ink->y - top;
+       XDrawLines(view->x->dpy, pm, gc,
+                  ink->points, ink->length, CoordModePrevious);
+      }
+    }
+  }
+  if (!view->x->color) {
+    XSetFillStyle(view->x->dpy, gc, FillSolid);
+  }
+  XSetLineAttributes(view->x->dpy, gc, 1,
+                    LineSolid, CapButt, JoinMiter);
+}
+
+
+ClipTheOverlay(SimView *view)
+{
+  if (view->x->color) {
+    XSetForeground(view->x->dpy, view->x->gc, view->pixels[COLOR_WHITE]);
+    XSetFillStyle(view->x->dpy, view->x->gc, FillStippled);
+    XSetStipple(view->x->dpy, view->x->gc, view->overlay_pixmap);
+    XSetTSOrigin(view->x->dpy, view->x->gc, 0, 0);
+    XFillRectangle(view->x->dpy, view->pixmap2, view->x->gc,
+                  0, 0, view->w_width, view->w_height);
+    XSetFillStyle(view->x->dpy, view->x->gc, FillSolid);
+  } else {
+    XSetStipple(view->x->dpy, view->x->gc, view->x->gray50_stipple);
+    XSetTSOrigin(view->x->dpy, view->x->gc, view->updates & 1, 0);
+    XSetForeground(view->x->dpy, view->x->gc, view->pixels[COLOR_WHITE]);
+    XSetBackground(view->x->dpy, view->x->gc, view->pixels[COLOR_BLACK]);
+    XSetFillStyle(view->x->dpy, view->x->gc, FillOpaqueStippled);
+    XSetLineAttributes(view->x->dpy, view->x->gc, 3,
+                      LineSolid, CapButt, JoinBevel);
+    XSetClipOrigin(view->x->dpy, view->x->gc, 0, 0);
+    XSetClipMask(view->x->dpy, view->x->gc, view->overlay_pixmap);
+    XFillRectangle(view->x->dpy, view->pixmap2, view->x->gc,
+                  0, 0, view->w_width, view->w_height);
+    XSetFillStyle(view->x->dpy, view->x->gc, FillSolid);
+    XSetClipMask(view->x->dpy, view->x->gc, None);
+  }
+}
diff --git a/src/sim/w_eval.c b/src/sim/w_eval.c
new file mode 100644 (file)
index 0000000..dd628f4
--- /dev/null
@@ -0,0 +1,163 @@
+/* w_eval.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+char *cityClassStr[6] = {
+  "VILLAGE", "TOWN", "CITY", "CAPITAL", "METROPOLIS", "MEGALOPOLIS"
+};
+
+char *cityLevelStr[3] = {
+  "Easy", "Medium", "Hard"
+};
+
+char *probStr[10] = {
+  "CRIME", "POLLUTION", "HOUSING COSTS", "TAXES",
+  "TRAFFIC", "UNEMPLOYMENT", "FIRES"
+};
+
+
+/* comefrom: DoSubUpDate scoreDoer */
+doScoreCard(void)
+{
+  char title[256],
+  goodyes[32], goodno[32],
+  prob0[32], prob1[32], prob2[32], prob3[32],
+  pop[32], delta[32], assessed[32], assessed_dollars[32],
+  score[32], changed[32];
+
+  /* send /EvaluationTitle /SetValue [ (titleStr year) ] */
+  /* send /GoodJobPercents /SetValue [ (CityYes%) (CityNo%) ] */
+  /* send /WorstProblemPercents /SetValue [ (ProblemVotes[0]%) ... ] */
+  /* send /WorstProblemNames /SetValue [ (probStr[ProblemOrder[0]) ... ] */
+  /*   put ^chars around first problem name to make it bold */
+  /* send /Statistics /SetValue
+         [ (CityPop) (deltaCityPop) () (CityAssValue)
+           (cityClassStr[CityClass]) (cityLevelStr[GameLevel]) ] */
+  /* send /CurrentScore /SetValue [ (CityScore) ] */
+  /* send /AnnualChange /SetValue [ (deltaCityScore) ] */
+
+  sprintf(title, "City Evaluation  %d", CurrentYear());
+  sprintf(goodyes, "%d%%", CityYes);
+  sprintf(goodno, "%d%%", CityNo);
+  sprintf(prob0, "%d%%", ProblemVotes[ProblemOrder[0]]);
+  sprintf(prob1, "%d%%", ProblemVotes[ProblemOrder[1]]);
+  sprintf(prob2, "%d%%", ProblemVotes[ProblemOrder[2]]);
+  sprintf(prob3, "%d%%", ProblemVotes[ProblemOrder[3]]);
+  sprintf(pop, "%d", CityPop);
+  sprintf(delta, "%d", deltaCityPop);
+  sprintf(assessed, "%d", CityAssValue);
+  makeDollarDecimalStr(assessed, assessed_dollars);
+
+  sprintf(score, "%d", CityScore);
+  sprintf(changed, "%d", deltaCityScore);
+
+  SetEvaluation(changed, score,
+               ProblemVotes[ProblemOrder[0]] ? probStr[ProblemOrder[0]] : " ",
+               ProblemVotes[ProblemOrder[1]] ? probStr[ProblemOrder[1]] : " ",
+               ProblemVotes[ProblemOrder[2]] ? probStr[ProblemOrder[2]] : " ",
+               ProblemVotes[ProblemOrder[3]] ? probStr[ProblemOrder[3]] : " ",
+               ProblemVotes[ProblemOrder[0]] ? prob0 : " ",
+               ProblemVotes[ProblemOrder[1]] ? prob1 : " ",
+               ProblemVotes[ProblemOrder[2]] ? prob2 : " ",
+               ProblemVotes[ProblemOrder[3]] ? prob3 : " ",
+               pop, delta, assessed_dollars,
+               cityClassStr[CityClass], cityLevelStr[GameLevel],
+               goodyes, goodno, title);
+}
+
+
+ChangeEval()
+{
+  EvalChanged = 1;
+}
+
+
+scoreDoer(void)
+{
+  if (EvalChanged) {
+    doScoreCard();
+    EvalChanged = 0;
+  }
+}
+
+
+SetEvaluation(char *changed, char *score,
+             char *ps0, char *ps1, char *ps2, char *ps3,
+             char *pv0, char *pv1, char *pv2, char *pv3,
+             char *pop, char *delta, char *assessed_dollars,
+             char *cityclass, char *citylevel,
+             char *goodyes, char *goodno, char *title)
+{
+  char buf[2048];
+
+  sprintf(buf, "UISetEvaluation {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%s} {%s}",
+         changed, score,
+         ps0, ps1, ps2, ps3,
+         pv0, pv1, pv2, pv3,
+         pop, delta, assessed_dollars,
+         cityclass, citylevel,
+         goodyes, goodno, title);
+  Eval(buf);
+}
+
+
diff --git a/src/sim/w_graph.c b/src/sim/w_graph.c
new file mode 100644 (file)
index 0000000..950799f
--- /dev/null
@@ -0,0 +1,894 @@
+/* w_graph.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+short NewGraph = 0;
+short AllMax;
+unsigned char *History10[HISTORIES];
+unsigned char *History120[HISTORIES];
+int HistoryInitialized = 0;
+short Graph10Max, Graph120Max;
+Tcl_HashTable GraphCmds;
+int GraphUpdateTime = 100;
+
+
+#define DEF_GRAPH_FONT "-Adobe-Helvetica-Bold-R-Normal-*-140-*"
+#define DEF_GRAPH_BG_COLOR     "#b0b0b0"
+#define DEF_GRAPH_BG_MONO      "#ffffff"
+#define DEF_GRAPH_BORDER_WIDTH "0"
+#define DEF_GRAPH_RELIEF       "flat"
+
+Tk_ConfigSpec GraphConfigSpecs[] = {
+    {TK_CONFIG_FONT, "-font", (char *) NULL, (char *) NULL,
+       DEF_GRAPH_FONT, Tk_Offset(SimGraph, fontPtr), 0},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_GRAPH_BG_COLOR, Tk_Offset(SimGraph, border),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_GRAPH_BG_MONO, Tk_Offset(SimGraph, border),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       DEF_GRAPH_BORDER_WIDTH, Tk_Offset(SimGraph, borderWidth), 0},
+    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
+       DEF_GRAPH_RELIEF, Tk_Offset(SimGraph, relief), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+  };
+
+
+XDisplay *FindXDisplay();
+
+
+static void
+DisplaySimGraph(ClientData clientData)
+{
+  SimGraph *graph = (SimGraph *) clientData;
+  Tk_Window tkwin = graph->tkwin;
+  Pixmap pm = None;
+  Drawable d;
+
+  graph->flags &= ~VIEW_REDRAW_PENDING;
+
+//fprintf(stderr, "DisplaySimGraph token %d\n", graph->draw_graph_token);
+
+  assert(graph->draw_graph_token != 0);
+
+  if (graph->draw_graph_token != 0) {
+//    Tk_DeleteTimerHandler(graph->draw_graph_token);
+    graph->draw_graph_token = 0;
+  }
+
+  if (graph->visible && (tkwin != NULL) && Tk_IsMapped(tkwin)) {
+    DoUpdateGraph(graph);
+  }
+}
+
+
+void
+DestroySimGraph(ClientData clientData)
+{
+  SimGraph *graph = (SimGraph *) clientData;
+
+  DestroyGraph(graph);
+}
+
+
+EventuallyRedrawGraph(SimGraph *graph)
+{
+  if (!(graph->flags & VIEW_REDRAW_PENDING)) {
+    assert(graph->draw_graph_token == 0);
+    if (graph->draw_graph_token == 0) {
+      graph->draw_graph_token =
+       Tk_CreateTimerHandler(
+         GraphUpdateTime,
+         DisplaySimGraph,
+         (ClientData) graph);
+      graph->flags |= VIEW_REDRAW_PENDING;
+//fprintf(stderr, "EventuallyRedrawGraph token %d\n", graph->draw_graph_token);
+    }
+  }
+}
+
+
+void
+SimGraphEventProc(ClientData clientData, XEvent *eventPtr)
+{
+  SimGraph *graph = (SimGraph *) clientData;
+
+  if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {
+    graph->visible = 1;
+    EventuallyRedrawGraph(graph);
+  } else if (eventPtr->type == MapNotify) {
+    graph->visible = 1;
+  } else if (eventPtr->type == UnmapNotify) {
+    graph->visible = 0;
+  } else if (eventPtr->type == VisibilityNotify) {
+    if (eventPtr->xvisibility.state == VisibilityFullyObscured)
+      graph->visible = 0;
+    else
+      graph->visible = 1;
+  } else if (eventPtr->type == ConfigureNotify) {
+    DoResizeGraph(graph,
+                 eventPtr->xconfigure.width,
+                 eventPtr->xconfigure.height);
+    EventuallyRedrawGraph(graph);
+  } else if (eventPtr->type == DestroyNotify) {
+    Tcl_DeleteCommand(graph->interp, Tk_PathName(graph->tkwin));
+    graph->tkwin = NULL;
+    if (graph->flags & VIEW_REDRAW_PENDING) {
+//fprintf(stderr, "SimGraphEventProc Destroy token %d\n", graph->draw_graph_token);
+      assert(graph->draw_graph_token != 0);
+      if (graph->draw_graph_token != 0) {
+       Tk_DeleteTimerHandler(graph->draw_graph_token);
+       graph->draw_graph_token = 0;
+      }
+      graph->flags &= ~VIEW_REDRAW_PENDING;
+    }
+   Tk_EventuallyFree((ClientData) graph, DestroySimGraph);
+  }
+}
+
+
+int GraphCmdconfigure(GRAPH_ARGS)
+{
+  int result = TCL_OK;
+
+  if (argc == 2) {
+    result = Tk_ConfigureInfo(interp, graph->tkwin, GraphConfigSpecs,
+                             (char *) graph, (char *) NULL, 0);
+  } else if (argc == 3) {
+    result = Tk_ConfigureInfo(interp, graph->tkwin, GraphConfigSpecs,
+                             (char *) graph, argv[2], 0);
+  } else {
+    result = ConfigureSimGraph(interp, graph, argc-2, argv+2,
+                           TK_CONFIG_ARGV_ONLY);
+  }
+  return TCL_OK;
+}
+
+
+int GraphCmdposition(GRAPH_ARGS)
+{
+  int result = TCL_OK;
+
+    if ((argc != 2) && (argc != 4)) {
+      return TCL_ERROR;
+    }
+    if (argc == 4) {
+      if ((Tcl_GetInt(interp, argv[2], &graph->w_x) != TCL_OK)
+         || (Tcl_GetInt(interp, argv[3], &graph->w_y) != TCL_OK)) {
+       return TCL_ERROR;
+      }
+    }
+    sprintf(interp->result, "%d %d", graph->w_x, graph->w_y);
+    return TCL_OK;
+}
+
+
+int GraphCmdsize(GRAPH_ARGS)
+{
+  if ((argc != 2) && (argc != 4)) {
+    return TCL_ERROR;
+  }
+  if (argc == 4) {
+    int w, h;
+    
+    if (Tcl_GetInt(interp, argv[2], &w) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    if (Tcl_GetInt(interp, argv[3], &h) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    graph->w_width = w;
+    graph->w_height = h;
+  }
+  sprintf(interp->result, "%d %d", graph->w_width, graph->w_height);
+  return TCL_OK;
+}
+
+
+int GraphCmdVisible(GRAPH_ARGS)
+{
+  int visible;
+
+  if ((argc != 2) && (argc != 3)) {
+    Tcl_AppendResult(interp, "wrong # args", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &visible) != TCL_OK) ||
+       (visible < 0) || (visible > 1)) {
+      Tcl_AppendResult(interp, " bogus args", (char *) NULL);
+      return TCL_ERROR;
+    }
+
+    graph->visible = visible;
+  }
+
+  sprintf(interp->result, "%d", graph->visible);
+
+  return TCL_OK;
+}
+
+
+int GraphCmdRange(GRAPH_ARGS)
+{
+  int range;
+
+  if ((argc != 2) && (argc != 3)) {
+    Tcl_AppendResult(interp, "wrong # args", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &range) != TCL_OK) ||
+       ((range != 10) && (range != 120))) {
+      Tcl_AppendResult(interp, " bogus args", (char *) NULL);
+      return TCL_ERROR;
+    }
+
+    graph->range = range;
+    NewGraph = 1;
+  }
+
+  sprintf(interp->result, "%d", graph->range);
+
+  return TCL_OK;
+}
+
+
+int GraphCmdMask(GRAPH_ARGS)
+{
+  int mask;
+
+  if ((argc != 2) && (argc != 3)) {
+    Tcl_AppendResult(interp, "wrong # args", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &mask) != TCL_OK) ||
+       (mask < 0) || (mask > 63)) {
+      Tcl_AppendResult(interp, " bogus args", (char *) NULL);
+      return TCL_ERROR;
+    }
+
+    graph->mask = mask;
+    NewGraph = 1;
+  }
+
+  sprintf(interp->result, "%d", graph->mask);
+
+  return TCL_OK;
+}
+
+
+int
+DoGraphCmd(CLIENT_ARGS)
+{
+  SimGraph *graph = (SimGraph *) clientData;
+  Tcl_HashEntry *ent;
+  int result = TCL_OK;
+  int (*cmd)();
+
+  if (argc < 2) {
+    return TCL_ERROR;
+  }
+
+  if (ent = Tcl_FindHashEntry(&GraphCmds, argv[1])) {
+    cmd = (int (*)())ent->clientData;
+    Tk_Preserve((ClientData) graph);
+    result = cmd(graph, interp, argc, argv);
+    Tk_Release((ClientData) graph);
+  } else {
+    Tcl_AppendResult(interp, "unknown command name: \"",
+                    argv[0], " ", argv[1], "\".", (char *) NULL);
+    result = TCL_ERROR;
+  }
+  return result;
+}
+
+
+int
+GraphViewCmd(CLIENT_ARGS)
+{
+  SimGraph *graph;
+  Tk_Window tkwin = (Tk_Window) clientData;
+
+  if (argc < 2) {
+    Tcl_AppendResult(interp, "wrong # args:  should be \"",
+                    argv[0], " pathName ?options?\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  tkwin = Tk_CreateWindowFromPath(interp, tkwin,
+                                 argv[1], (char *) NULL);
+  if (tkwin == NULL) {
+    return TCL_ERROR;
+  }
+
+  graph = (SimGraph *)ckalloc(sizeof (SimGraph));
+
+  graph->tkwin = tkwin;
+  graph->interp = interp;
+  graph->flags = 0;
+  
+  Tk_SetClass(graph->tkwin, "GraphView");
+  Tk_CreateEventHandler(graph->tkwin,
+                       VisibilityChangeMask |
+                       ExposureMask |
+                       StructureNotifyMask,
+                       SimGraphEventProc, (ClientData) graph);
+  Tcl_CreateCommand(interp, Tk_PathName(graph->tkwin),
+                   DoGraphCmd, (ClientData) graph, (void (*)()) NULL);
+
+/*
+  Tk_MakeWindowExist(graph->tkwin);
+*/
+  
+  if (getenv("XSYNCHRONIZE") != NULL) {
+    XSynchronize(Tk_Display(tkwin), 1);
+  }
+
+  InitNewGraph(graph);
+  DoNewGraph(graph);
+
+  if (ConfigureSimGraph(interp, graph, argc-2, argv+2, 0) != TCL_OK) {
+    /* XXX: destroy graph */
+    Tk_DestroyWindow(graph->tkwin);
+    return TCL_ERROR;
+  }
+
+  interp->result = Tk_PathName(graph->tkwin);
+  return TCL_OK;
+}
+
+
+int
+ConfigureSimGraph(Tcl_Interp *interp, SimGraph *graph,
+                 int argc, char **argv, int flags)
+{
+  if (Tk_ConfigureWidget(interp, graph->tkwin, GraphConfigSpecs,
+                        argc, argv, (char *) graph, flags) != TCL_OK) {
+    return TCL_ERROR;
+  }
+  
+  Tk_SetBackgroundFromBorder(graph->tkwin, graph->border);
+
+  EventuallyRedrawGraph(graph);
+  return TCL_OK;
+}
+
+
+
+
+char *HistName[] = {
+  "Residential", "Commercial", "Industrial",
+  "Cash Flow", "Crime", "Pollution"
+};
+
+unsigned char HistColor[] = {
+  COLOR_LIGHTGREEN, COLOR_DARKBLUE, COLOR_YELLOW,
+  COLOR_DARKGREEN, COLOR_RED, COLOR_OLIVE
+};
+
+
+graph_command_init()
+{
+  int new;
+
+  Tcl_CreateCommand(tk_mainInterp, "graphview", GraphViewCmd,
+                   (ClientData)MainWindow, (void (*)()) NULL);
+
+  Tcl_InitHashTable(&GraphCmds, TCL_STRING_KEYS);
+
+#define GRAPH_CMD(name) HASHED_CMD(Graph, name)
+
+  GRAPH_CMD(configure);
+  GRAPH_CMD(position);
+  GRAPH_CMD(size);
+  GRAPH_CMD(Visible);
+  GRAPH_CMD(Range);
+  GRAPH_CMD(Mask);
+}
+
+
+
+void
+drawMonth(short *hist, unsigned char *s, float scale)
+{
+  register short val;
+  register short x;
+
+  for (x = 0; x < 120; x++) {
+    val = hist[x] * scale;
+    if (val < 0) val = 0;
+    if (val > 255) val = 255;
+    s[119 - x] = val;
+  }
+}
+
+
+void
+doAllGraphs(void)
+{
+  float scaleValue;
+
+  AllMax = 0;
+  if (ResHisMax > AllMax) AllMax = ResHisMax;
+  if (ComHisMax > AllMax) AllMax = ComHisMax;
+  if (IndHisMax > AllMax) AllMax = IndHisMax;
+  if (AllMax <= 128) AllMax = 0;
+
+  if (AllMax) {
+    scaleValue = 128.0 / AllMax;
+  } else {
+    scaleValue = 1.0;
+  }
+
+  // scaleValue = 0.5; // XXX
+
+  drawMonth(ResHis, History10[RES_HIST], scaleValue);
+  drawMonth(ComHis, History10[COM_HIST], scaleValue);
+  drawMonth(IndHis, History10[IND_HIST], scaleValue);
+  drawMonth(MoneyHis, History10[MONEY_HIST], 1.0);
+  drawMonth(CrimeHis, History10[CRIME_HIST], 1.0);
+  drawMonth(PollutionHis, History10[POLLUTION_HIST], 1.0);
+
+  AllMax = 0;
+  if (Res2HisMax > AllMax) AllMax = Res2HisMax;
+  if (Com2HisMax > AllMax) AllMax = Com2HisMax;
+  if (Ind2HisMax > AllMax) AllMax = Ind2HisMax;
+  if (AllMax <= 128) AllMax = 0;
+
+  if (AllMax) {
+    scaleValue = 128.0 / AllMax;
+  } else {
+    scaleValue = 1.0;
+  }
+
+  // scaleValue = 0.5; // XXX
+
+  drawMonth(ResHis + 120, History120[RES_HIST], scaleValue);
+  drawMonth(ComHis + 120, History120[COM_HIST], scaleValue);
+  drawMonth(IndHis + 120, History120[IND_HIST], scaleValue);
+  drawMonth(MoneyHis + 120, History120[MONEY_HIST], 1.0);
+  drawMonth(CrimeHis + 120, History120[CRIME_HIST], 1.0);
+  drawMonth(PollutionHis + 120, History120[POLLUTION_HIST], 1.0);
+}
+
+
+void
+ChangeCensus(void)
+{
+  CensusChanged = 1;
+}
+
+
+void
+graphDoer(void)
+{
+  SimGraph *graph;
+
+  if (CensusChanged) {
+    doAllGraphs();
+    NewGraph = 1;
+    CensusChanged = 0;
+  }
+
+  if (NewGraph) {
+    for (graph = sim->graph; graph != NULL; graph = graph->next) {
+      EventuallyRedrawGraph(graph);
+    }
+    NewGraph = 0;
+  }
+}
+
+
+void
+initGraphs(void)
+{
+  int i;
+  SimGraph *graph;
+
+  for (graph = sim->graph; graph != NULL; graph = graph->next) {
+    graph->range = 10;
+    graph->mask = ALL_HISTORIES;
+  }
+
+  if (!HistoryInitialized) {
+    HistoryInitialized = 1;
+    for (i = 0; i < HISTORIES; i++) {
+      History10[i] = (unsigned char *)ckalloc(120);
+      History120[i] = (unsigned char *)ckalloc(120);
+    }
+  }
+}
+
+
+/* comefrom: InitWillStuff */
+InitGraphMax(void)
+{
+  register x;
+
+  ResHisMax = 0;
+  ComHisMax = 0;
+  IndHisMax = 0;
+  for (x = 118; x >= 0; x--) {
+    if (ResHis[x] > ResHisMax) ResHisMax = ResHis[x];
+    if (ComHis[x] > ComHisMax) ComHisMax = ComHis[x];
+    if (IndHis[x] > IndHisMax) IndHisMax = IndHis[x];
+    if (ResHis[x] < 0) ResHis[x] = 0;
+    if (ComHis[x] < 0) ComHis[x] = 0;
+    if (IndHis[x] < 0) IndHis[x] = 0;
+  }
+  Graph10Max = ResHisMax;
+  if (ComHisMax > Graph10Max) Graph10Max = ComHisMax;
+  if (IndHisMax > Graph10Max) Graph10Max = IndHisMax;
+
+  Res2HisMax = 0;
+  Com2HisMax = 0;
+  Ind2HisMax = 0;
+  for (x = 238; x >= 120; x--) {
+    if (ResHis[x] > Res2HisMax) Res2HisMax = ResHis[x];
+    if (ComHis[x] > Com2HisMax) Com2HisMax = ComHis[x];
+    if (IndHis[x] > Ind2HisMax) Ind2HisMax = IndHis[x];
+    if (ResHis[x] < 0) ResHis[x] = 0;
+    if (ComHis[x] < 0) ComHis[x] = 0;
+    if (IndHis[x] < 0) IndHis[x] = 0;
+  }
+  Graph120Max = Res2HisMax;
+  if (Com2HisMax > Graph120Max) Graph120Max = Com2HisMax;
+  if (Ind2HisMax > Graph120Max) Graph120Max = Ind2HisMax;
+}
+
+
+InitNewGraph(SimGraph *graph)
+{
+  int d = 8;
+  struct XDisplay *xd;
+
+  graph->next = NULL;
+  graph->range = 10;
+  graph->mask = ALL_HISTORIES;
+
+/* This stuff was initialized in our caller (GraphCmd) */
+/*  graph->tkwin = NULL; */
+/*  graph->interp = NULL; */
+/*  graph->flags = 0; */
+
+  graph->x = NULL;
+  graph->visible = 0;
+  graph->w_x = graph->w_y = 0;
+  graph->w_width = graph->w_height = 0;
+  graph->pixmap = None;
+  graph->pixels = NULL;
+  graph->fontPtr = NULL;
+  graph->border = NULL;
+  graph->borderWidth = 0;
+  graph->relief = TK_RELIEF_FLAT;
+  graph->draw_graph_token = 0;
+//fprintf(stderr, "InitNewGraph token %d\n", graph->draw_graph_token);
+
+  graph->x = FindXDisplay(graph->tkwin);
+  IncRefDisplay(graph->x);
+
+  graph->pixels = graph->x->pixels;
+  graph->fontPtr = NULL;
+
+  DoResizeGraph(graph, 16, 16);
+}
+
+
+DestroyGraph(SimGraph *graph)
+{
+  SimGraph **gp;
+
+  for (gp = &sim->graph;
+       (*gp) != NULL;
+       gp = &((*gp)->next)) {
+    if ((*gp) == graph) {
+      (*gp) = graph->next;
+      sim->graphs--;
+      break;
+    }
+  }
+
+  if (graph->pixmap != None) {
+    XFreePixmap(graph->x->dpy, graph->pixmap);
+    graph->pixmap = None;
+  }
+
+  DecRefDisplay(graph->x);
+
+  ckfree((char *) graph);
+}
+
+
+DoResizeGraph(SimGraph *graph, int w, int h)
+{
+  int resize = 0;
+
+  graph->w_width = w; graph->w_height = h;
+
+  if (graph->pixmap != None) {
+    XFreePixmap(graph->x->dpy, graph->pixmap);
+    graph->pixmap = None;
+  }
+  graph->pixmap = XCreatePixmap(graph->x->dpy, graph->x->root,
+                               w, h, graph->x->depth);
+  if (graph->pixmap == None) {
+    fprintf(stderr,
+           "Sorry, Micropolis can't create a pixmap on X display \"%s\".\n",
+           graph->x->display);
+    sim_exit(1); // Just sets tkMustExit and ExitReturn
+    return;
+  }
+}
+
+
+DoNewGraph(SimGraph *graph)
+{
+  sim->graphs++; graph->next = sim->graph; sim->graph = graph;
+
+  NewGraph = 1;
+}
+
+
+#define BORDER 5
+
+DoUpdateGraph(SimGraph *graph)
+{
+  Display *dpy;
+  GC gc;
+  Pixmap pm;
+  int *pix;
+  unsigned char **hist;
+  int w, h, mask, i, j, x, y;
+  XPoint points[121];
+  int year = (CityTime / 48) + StartingYear;
+  int month = (CityTime / 4) % 12;
+  int do_top_labels = 0;
+  int do_right_labels = 0;
+  int top_label_height = 30;
+  int right_label_width = 65;
+  int tx, ty;
+  float sx, sy;
+
+  if (!graph->visible) {
+    return;
+  }
+
+  if (graph->range == 10) {
+    hist = History10;
+  } else {
+    hist = History120;
+  }
+
+  dpy = graph->x->dpy;
+  gc = graph->x->gc;
+  pm = graph->pixmap;
+  pix = graph->pixels;
+
+  w = graph->w_width;
+  h = graph->w_height;
+
+  XSetFont(graph->x->dpy, graph->x->gc, graph->fontPtr->fid);
+  XSetLineAttributes(dpy, gc, 3, LineSolid, CapButt, JoinBevel);
+  if (graph->x->color) {
+    XSetForeground(dpy, gc, pix[COLOR_LIGHTGRAY]);
+  } else {
+    XSetForeground(dpy, gc, pix[COLOR_WHITE]);
+  }
+  XFillRectangle(dpy, pm, gc, 0, 0, w, h);
+
+  tx = BORDER; ty = BORDER;
+
+  if ((w -= (2 * BORDER)) < 1) w = 1;
+  if ((h -= (2 * BORDER)) < 1) h = 1;
+
+  if (w > (4 * right_label_width)) {
+    w -= right_label_width;
+    do_right_labels = 1;
+  }
+
+  if (do_right_labels &&
+      (h > (3 * top_label_height))) {
+    ty += top_label_height;
+    h -= top_label_height;
+    do_top_labels = 1;
+  }
+
+  sx = ((float)w) / 120.0; sy = ((float)h) / 256.0;
+
+  mask = graph->mask;
+  for (i = 0; i < HISTORIES; i++, mask >>= 1, hist++) {
+    if (mask & 1) {
+      int fg = COLOR_WHITE;
+      int bg = COLOR_BLACK;
+      Pixmap stipple = None;
+
+      for (j = 0; j < 120; j++) {
+       x = tx + (j * sx);
+       y = ty + ((int)(h - (((float)(*hist)[j]) * sy)));
+       points[j].x = x; points[j].y = y;
+      }
+      x = tx + (j * sx);
+      points[j].x = x; points[j].y = y;
+
+      if (graph->x->color) {
+       XSetForeground(dpy, gc, pix[HistColor[i]]);
+      } else {
+       switch (i) {
+       case 0: /* res */
+         stipple = graph->x->gray50_stipple;
+         break;
+       case 1: /* com */
+         stipple = graph->x->gray25_stipple;
+         break;
+       case 2: /* ind */
+         stipple = graph->x->gray75_stipple;
+         break;
+       case 3: /* cash */
+         fg = COLOR_BLACK;
+         break;
+       case 4: /* crime */
+         stipple = graph->x->horiz_stipple;
+         break;
+       case 5: /* pol */
+         stipple = graph->x->vert_stipple;
+         break;
+       }
+       if (stipple != None) {
+         XSetStipple(graph->x->dpy, gc, stipple);
+         XSetTSOrigin(graph->x->dpy, gc, 0, 0);
+         XSetForeground(graph->x->dpy, gc, pix[fg]);
+         XSetBackground(graph->x->dpy, gc, pix[bg]);
+         XSetFillStyle(graph->x->dpy, gc, FillOpaqueStippled);
+       } else {
+         XSetForeground(graph->x->dpy, gc, pix[fg]);
+       }
+      }
+
+      XDrawLines(dpy, pm, gc, points, 121, CoordModeOrigin);
+
+      if (!graph->x->color && (stipple != None)) {
+       XSetFillStyle(graph->x->dpy, gc, FillSolid);
+      }
+
+      if (do_right_labels) {
+       if (graph->x->color) {
+         XSetForeground(dpy, gc, pix[HistColor[i]]);
+         XDrawString(graph->x->dpy, pm, graph->x->gc,
+                     x + 4, y + 5,
+                     HistName[i], strlen(HistName[i]));
+         XDrawString(graph->x->dpy, pm, graph->x->gc,
+                     x + 5, y + 4,
+                     HistName[i], strlen(HistName[i]));
+
+         XSetForeground(dpy, gc, pix[COLOR_BLACK]);
+         XDrawString(graph->x->dpy, pm, graph->x->gc,
+                     x + 5, y + 5,
+                     HistName[i], strlen(HistName[i]));
+       } else {
+         XSetForeground(dpy, gc, pix[COLOR_BLACK]);
+         XDrawString(graph->x->dpy, pm, graph->x->gc,
+                     x + 5, y + 5,
+                     HistName[i], strlen(HistName[i]));
+       }
+      }
+    }
+  }
+
+  XSetLineAttributes(dpy, gc, 1, LineSolid, CapButt, JoinMiter);
+
+  XSetForeground(dpy, gc, pix[COLOR_BLACK]);
+  XDrawLine(dpy, pm, gc, tx, ty - 1, tx + w, ty - 1);
+  XDrawLine(dpy, pm, gc, tx, ty + h, tx + w, ty + h);
+
+  if (graph->range == 10) {
+    for (x = 120 - month; x >= 0; x -= 12) {
+      int xx, yy;
+      xx = tx + (x * sx);
+      XDrawLine(dpy, pm, gc, xx, ty - 1, xx, ty + h);
+      if (do_top_labels) {
+       char buf[256];
+
+       sprintf(buf, "%d", year--);
+       xx = tx + (x * sx) + 2;
+       yy = ty - ((year & 1) ? 4 : 20);
+       XDrawString(graph->x->dpy, pm, graph->x->gc,
+                   xx, yy, buf, strlen(buf));
+      }
+    }
+  } else {
+    int past;
+
+    sx /= 10;
+    past = 10 * (year % 10);
+    year /= 10;
+
+    for (x = 1200 - past; x >= 0; x -= 120) {
+      int xx, yy;
+      xx = tx + (x * sx);
+      XDrawLine(dpy, pm, gc, xx, ty - 1, xx, ty + h);
+      if (do_top_labels) {
+       char buf[256];
+
+       sprintf(buf, "%d0", year--);
+
+       xx = tx + (x * sx) + 2;
+       yy = ty - ((year & 1) ? 4 : 20);
+       XDrawString(graph->x->dpy, pm, graph->x->gc,
+                   xx, yy, buf, strlen(buf));
+      }
+    }
+  }
+
+  XCopyArea(graph->x->dpy, graph->pixmap,
+           Tk_WindowId(graph->tkwin), graph->x->gc,
+           0, 0, graph->w_width, graph->w_height, 0, 0);
+}
+
+
diff --git a/src/sim/w_inter.c b/src/sim/w_inter.c
new file mode 100644 (file)
index 0000000..33e7771
--- /dev/null
@@ -0,0 +1,1604 @@
+/* 
+ * tkInterval.c --
+ *
+ *     This module implements a interval widgets for the Tk toolkit.
+ *     A interval displays a slider that can be adjusted to change a
+ *     value;  it also displays numeric labels and a textual label,
+ *     if desired.
+ *
+ * Copyright 1990 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+/* Improvements in the version used for Micropolis are copyrighted and
+ * licensed under these copyright terms.
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+
+#include "tkconfig.h"
+#include "default.h"
+#include "tkint.h"
+
+/*
+ * A data structure of the following type is kept for each interval
+ * widget managed by this file:
+ */
+
+typedef struct {
+    Tk_Window tkwin;           /* Window that embodies the interval.  NULL
+                                * means that the window has been destroyed
+                                * but the data structures haven't yet been
+                                * cleaned up.*/
+    Tcl_Interp *interp;                /* Interpreter associated with interval. */
+    Tk_Uid orientUid;          /* Orientation for window ("vertical" or
+                                * "horizontal"). */
+    int vertical;              /* Non-zero means vertical orientation,
+                                * zero means horizontal. */
+    int minValue;              /* Value corresponding to minimum of interval. */
+    int maxValue;              /* Value corresponding to maximum of interval. */
+    int fromValue;             /* Value corresponding to left or top of
+                                * interval. */
+    int toValue;               /* Value corresponding to right or bottom
+                                * of interval. */
+    int tickInterval;          /* Distance between tick marks;  0 means
+                                * don't display any tick marks. */
+    int trackValue;            /* Value of mouse at start of tracking. */
+    int trackWidth;            /* Value of max-min at start of tracking. */
+    int trackState;            /* Tracking state. */
+    char *command;             /* Command prefix to use when invoking Tcl
+                                * commands because the interval value changed.
+                                * NULL means don't invoke commands.
+                                * Malloc'ed. */
+    int commandLength;         /* Number of non-NULL bytes in command. */
+    char *label;               /* Label to display above or to right of
+                                * interval;  NULL means don't display a
+                                * label.  Malloc'ed. */
+    int labelLength;           /* Number of non-NULL chars. in label. */
+    Tk_Uid state;              /* Normal or disabled.  Value cannot be
+                                * changed when interval is disabled. */
+
+    /*
+     * Information used when displaying widget:
+     */
+
+    int borderWidth;           /* Width of 3-D border around window. */
+    Tk_3DBorder bgBorder;      /* Used for drawing background. */
+    Tk_3DBorder sliderBorder;  /* Used for drawing slider in normal mode. */
+    Tk_3DBorder activeBorder;  /* Used for drawing slider when active (i.e.
+                                * when mouse is in window). */
+    XFontStruct *fontPtr;      /* Information about text font, or NULL. */
+    XColor *textColorPtr;      /* Color for drawing text. */
+    GC textGC;                 /* GC for drawing text in normal mode. */
+    int width;                 /* Desired narrow dimension of interval,
+                                * in pixels. */
+    int length;                        /* Desired long dimension of interval,
+                                * in pixels. */
+    int relief;                        /* Indicates whether window as a whole is
+                                * raised, sunken, or flat. */
+    int offset;                        /* Zero if relief is TK_RELIEF_FLAT,
+                                * borderWidth otherwise.   Indicates how
+                                * much interior stuff must be offset from
+                                * outside edges to leave room for border. */
+    int showValue;             /* Non-zero means to display the interval value
+                                * below or to the left of the slider;  zero
+                                * means don't display the value. */
+    int tickPixels;            /* Number of pixels required for widest tick
+                                * mark.  0 means don't display ticks.*/
+    int valuePixels;           /* Number of pixels required for value text. */
+    int labelPixels;           /* Number of pixels required for label.   0
+                                * means don't display label. */
+
+    /*
+     * Miscellaneous information:
+     */
+
+    Cursor cursor;             /* Current cursor for window, or None. */
+    int flags;                 /* Various flags;  see below for
+                                * definitions. */
+} Interval;
+
+/*
+ * Flag bits for intervals:
+ *
+ * REDRAW_SLIDER -             1 means slider (and numerical readout) need
+ *                             to be redrawn.
+ * REDRAW_OTHER -              1 means other stuff besides slider and value
+ *                             need to be redrawn.
+ * REDRAW_ALL -                        1 means the entire widget needs to be redrawn.
+ * ACTIVE -                    1 means the widget is active (the mouse is
+ *                             in its window).
+ * BUTTON_PRESSED -            1 means a button press is in progress, so
+ *                             slider should appear depressed and should be
+ *                             draggable.
+ */
+
+#define REDRAW_SLIDER          1
+#define REDRAW_OTHER           2
+#define REDRAW_ALL             3
+#define ACTIVE                 4
+#define BUTTON_PRESSED         8
+
+/*
+ * Space to leave between interval area and text.
+ */
+
+#define SPACING 2
+
+/*
+ * Information used for argv parsing.
+ */
+
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_BORDER, "-activeforeground", "activeForeground", "Background",
+       DEF_SCALE_ACTIVE_FG_COLOR, Tk_Offset(Interval, activeBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-activeforeground", "activeForeground", "Background",
+       DEF_SCALE_ACTIVE_FG_MONO, Tk_Offset(Interval, activeBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_SCALE_BG_COLOR, Tk_Offset(Interval, bgBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_SCALE_BG_MONO, Tk_Offset(Interval, bgBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       DEF_SCALE_BORDER_WIDTH, Tk_Offset(Interval, borderWidth), 0},
+    {TK_CONFIG_STRING, "-command", "command", "Command",
+       (char *) NULL, Tk_Offset(Interval, command), 0},
+    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",
+       DEF_SCALE_CURSOR, Tk_Offset(Interval, cursor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_FONT, "-font", "font", "Font",
+       DEF_SCALE_FONT, Tk_Offset(Interval, fontPtr),
+       0},
+    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",
+       DEF_SCALE_FG_COLOR, Tk_Offset(Interval, textColorPtr),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",
+       DEF_SCALE_FG_MONO, Tk_Offset(Interval, textColorPtr),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_INT, "-from", "from", "From",
+       DEF_SCALE_FROM, Tk_Offset(Interval, fromValue), 0},
+    {TK_CONFIG_STRING, "-label", "label", "Label",
+       DEF_SCALE_LABEL, Tk_Offset(Interval, label), 0},
+    {TK_CONFIG_PIXELS, "-length", "length", "Length",
+       DEF_SCALE_LENGTH, Tk_Offset(Interval, length), 0},
+    {TK_CONFIG_UID, "-orient", "orient", "Orient",
+       DEF_SCALE_ORIENT, Tk_Offset(Interval, orientUid), 0},
+    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
+       DEF_SCALE_RELIEF, Tk_Offset(Interval, relief), 0},
+    {TK_CONFIG_BOOLEAN, "-showvalue", "showValue", "ShowValue",
+       DEF_SCALE_SHOW_VALUE, Tk_Offset(Interval, showValue), 0},
+    {TK_CONFIG_BORDER, "-sliderforeground", "sliderForeground", "Background",
+       DEF_SCALE_SLIDER_FG_COLOR, Tk_Offset(Interval, sliderBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-sliderforeground", "sliderForeground", "Background",
+       DEF_SCALE_SLIDER_FG_MONO, Tk_Offset(Interval, sliderBorder), 
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_PIXELS, "-min", "min", "Min",
+       "0", Tk_Offset(Interval, minValue), 0},
+    {TK_CONFIG_PIXELS, "-max", "max", "Max",
+       "9999", Tk_Offset(Interval, maxValue), 0},
+    {TK_CONFIG_UID, "-state", "state", "State",
+       DEF_SCALE_STATE, Tk_Offset(Interval, state), 0},
+    {TK_CONFIG_INT, "-tickinterval", "tickInterval", "TickInterval",
+       DEF_SCALE_TICK_INTERVAL, Tk_Offset(Interval, tickInterval), 0},
+    {TK_CONFIG_INT, "-to", "to", "To",
+       DEF_SCALE_TO, Tk_Offset(Interval, toValue), 0},
+    {TK_CONFIG_PIXELS, "-width", "width", "Width",
+       DEF_SCALE_WIDTH, Tk_Offset(Interval, width), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            ComputeIntervalGeometry _ANSI_ARGS_((Interval *intervalPtr));
+static int             ConfigureInterval _ANSI_ARGS_((Tcl_Interp *interp,
+                           Interval *intervalPtr, int argc, char **argv,
+                           int flags));
+static void            DestroyInterval _ANSI_ARGS_((ClientData clientData));
+static void            DisplayHorizontalInterval _ANSI_ARGS_((
+                           ClientData clientData));
+static void            DisplayHorizontalValue _ANSI_ARGS_((Interval *intervalPtr,
+                           int value, int bottom));
+static void            DisplayVerticalInterval _ANSI_ARGS_((
+                           ClientData clientData));
+static void            DisplayVerticalValue _ANSI_ARGS_((Interval *intervalPtr,
+                           int value, int rightEdge));
+static void            EventuallyRedrawInterval _ANSI_ARGS_((Interval *intervalPtr,
+                           int what));
+static int             PixelToValue _ANSI_ARGS_((Interval *intervalPtr, int x,
+                           int y));
+static void            IntervalEventProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static void            IntervalMouseProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static int             IntervalWidgetCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+static void            SetInterval _ANSI_ARGS_((Interval *intervalPtr,
+                           int minValue, int maxValue, int notify));
+static void            TrackInterval _ANSI_ARGS_((Interval *intervalPtr,
+                           int value));
+static void            StartTrackInterval _ANSI_ARGS_((Interval *intervalPtr,
+                           int value));
+static int             ValueToPixel _ANSI_ARGS_((Interval *intervalPtr, int value));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_IntervalCmd --
+ *
+ *     This procedure is invoked to process the "interval" Tcl
+ *     command.  See the user documentation for details on what
+ *     it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_IntervalCmd(clientData, interp, argc, argv)
+    ClientData clientData;             /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    register Interval *intervalPtr;
+    Tk_Window new;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " pathName ?options?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], (char *) NULL);
+    if (new == NULL) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * Initialize fields that won't be initialized by ConfigureInterval,
+     * or which ConfigureInterval expects to have reasonable values
+     * (e.g. resource pointers).
+     */
+
+    intervalPtr = (Interval *) ckalloc(sizeof(Interval));
+    intervalPtr->tkwin = new;
+    intervalPtr->interp = interp;
+    intervalPtr->minValue = 0;
+    intervalPtr->maxValue = 0;
+    intervalPtr->command = NULL;
+    intervalPtr->label = NULL;
+    intervalPtr->state = tkNormalUid;
+    intervalPtr->bgBorder = NULL;
+    intervalPtr->sliderBorder = NULL;
+    intervalPtr->activeBorder = NULL;
+    intervalPtr->fontPtr = NULL;
+    intervalPtr->textColorPtr = NULL;
+    intervalPtr->textGC = None;
+    intervalPtr->cursor = None;
+    intervalPtr->flags = 0;
+
+    Tk_SetClass(intervalPtr->tkwin, "Interval");
+    Tk_CreateEventHandler(intervalPtr->tkwin, ExposureMask|StructureNotifyMask,
+           IntervalEventProc, (ClientData) intervalPtr);
+    Tk_CreateEventHandler(intervalPtr->tkwin, EnterWindowMask|LeaveWindowMask
+           |PointerMotionMask|ButtonPressMask|ButtonReleaseMask,
+           IntervalMouseProc, (ClientData) intervalPtr);
+    Tcl_CreateCommand(interp, Tk_PathName(intervalPtr->tkwin), IntervalWidgetCmd,
+           (ClientData) intervalPtr, (void (*)()) NULL);
+    if (ConfigureInterval(interp, intervalPtr, argc-2, argv+2, 0) != TCL_OK) {
+       goto error;
+    }
+
+    interp->result = Tk_PathName(intervalPtr->tkwin);
+    return TCL_OK;
+
+    error:
+    Tk_DestroyWindow(intervalPtr->tkwin);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * IntervalWidgetCmd --
+ *
+ *     This procedure is invoked to process the Tcl command
+ *     that corresponds to a widget managed by this module.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+IntervalWidgetCmd(clientData, interp, argc, argv)
+    ClientData clientData;             /* Information about interval
+                                        * widget. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    register Interval *intervalPtr = (Interval *) clientData;
+    int result = TCL_OK;
+    int length;
+    char c;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    Tk_Preserve((ClientData) intervalPtr);
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)) {
+       if (argc == 2) {
+           result = Tk_ConfigureInfo(interp, intervalPtr->tkwin, configSpecs,
+                   (char *) intervalPtr, (char *) NULL, 0);
+       } else if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, intervalPtr->tkwin, configSpecs,
+                   (char *) intervalPtr, argv[2], 0);
+       } else {
+           result = ConfigureInterval(interp, intervalPtr, argc-2, argv+2,
+                   TK_CONFIG_ARGV_ONLY);
+       }
+    } else if ((c == 'g') && (strncmp(argv[1], "get", length) == 0)) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " get\"", (char *) NULL);
+           goto error;
+       }
+       sprintf(interp->result, "%d %d", intervalPtr->minValue, intervalPtr->maxValue);
+    } else if ((c == 's') && (strncmp(argv[1], "set", length) == 0)) {
+       int minValue, maxValue;
+
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " set minValue maxValue\"", (char *) NULL);
+           goto error;
+       }
+       if (Tcl_GetInt(interp, argv[2], &minValue) != TCL_OK) {
+           goto error;
+       }
+       if (Tcl_GetInt(interp, argv[3], &maxValue) != TCL_OK) {
+           goto error;
+       }
+       if (minValue > maxValue) {
+         int temp = minValue;
+         minValue = maxValue; maxValue = temp;
+       }
+       if (intervalPtr->state == tkNormalUid) {
+           if ((minValue < intervalPtr->fromValue)
+                   ^ (intervalPtr->toValue < intervalPtr->fromValue)) {
+               minValue = intervalPtr->fromValue;
+           }
+           if ((minValue > intervalPtr->toValue)
+                   ^ (intervalPtr->toValue < intervalPtr->fromValue)) {
+               minValue = intervalPtr->toValue;
+           }
+           if ((maxValue < intervalPtr->fromValue)
+                   ^ (intervalPtr->toValue < intervalPtr->fromValue)) {
+               maxValue = intervalPtr->fromValue;
+           }
+           if ((maxValue > intervalPtr->toValue)
+                   ^ (intervalPtr->toValue < intervalPtr->fromValue)) {
+               maxValue = intervalPtr->toValue;
+           }
+           SetInterval(intervalPtr, minValue, maxValue, 1);
+       }
+    } else if ((c == 'r') && (strncmp(argv[1], "reset", length) == 0)) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " reset\"", (char *) NULL);
+           goto error;
+       }
+       SetInterval(intervalPtr,
+                   intervalPtr->fromValue, intervalPtr->toValue, 0);
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\":  must be configure, get, or set", (char *) NULL);
+       goto error;
+    }
+    Tk_Release((ClientData) intervalPtr);
+    return result;
+
+    error:
+    Tk_Release((ClientData) intervalPtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyInterval --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a button at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the interval is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyInterval(clientData)
+    ClientData clientData;     /* Info about interval widget. */
+{
+    register Interval *intervalPtr = (Interval *) clientData;
+
+    if (intervalPtr->command != NULL) {
+       ckfree(intervalPtr->command);
+    }
+    if (intervalPtr->label != NULL) {
+       ckfree(intervalPtr->label);
+    }
+    if (intervalPtr->bgBorder != NULL) {
+       Tk_Free3DBorder(intervalPtr->bgBorder);
+    }
+    if (intervalPtr->sliderBorder != NULL) {
+       Tk_Free3DBorder(intervalPtr->sliderBorder);
+    }
+    if (intervalPtr->activeBorder != NULL) {
+       Tk_Free3DBorder(intervalPtr->activeBorder);
+    }
+    if (intervalPtr->fontPtr != NULL) {
+       Tk_FreeFontStruct(intervalPtr->fontPtr);
+    }
+    if (intervalPtr->textColorPtr != NULL) {
+       Tk_FreeColor(intervalPtr->textColorPtr);
+    }
+    if (intervalPtr->textGC != None) {
+       Tk_FreeGC(intervalPtr->textGC);
+    }
+    if (intervalPtr->cursor != None) {
+       Tk_FreeCursor(intervalPtr->cursor);
+    }
+    ckfree((char *) intervalPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureInterval --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or
+ *     reconfigure) a interval widget.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information, such as colors, border width,
+ *     etc. get set for intervalPtr;  old resources get freed,
+ *     if there were any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureInterval(interp, intervalPtr, argc, argv, flags)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    register Interval *intervalPtr;    /* Information about widget;  may or may
+                                * not already have values for some fields. */
+    int argc;                  /* Number of valid entries in argv. */
+    char **argv;               /* Arguments. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    XGCValues gcValues;
+    GC newGC;
+    int length;
+
+    if (Tk_ConfigureWidget(interp, intervalPtr->tkwin, configSpecs,
+           argc, argv, (char *) intervalPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few options need special processing, such as parsing the
+     * orientation or setting the background from a 3-D border.
+     */
+
+    length = strlen(intervalPtr->orientUid);
+    if (strncmp(intervalPtr->orientUid, "vertical", length) == 0) {
+       intervalPtr->vertical = 1;
+    } else if (strncmp(intervalPtr->orientUid, "horizontal", length) == 0) {
+       intervalPtr->vertical = 0;
+    } else {
+       Tcl_AppendResult(interp, "bad orientation \"", intervalPtr->orientUid,
+               "\": must be vertical or horizontal", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if ((intervalPtr->state != tkNormalUid)
+           && (intervalPtr->state != tkDisabledUid)) {
+       Tcl_AppendResult(interp, "bad state value \"", intervalPtr->state,
+               "\":  must be normal or disabled", (char *) NULL);
+       intervalPtr->state = tkNormalUid;
+       return TCL_ERROR;
+    }
+
+    /*
+     * Make sure that the tick interval has the right sign so that
+     * addition moves from fromValue to toValue.
+     */
+
+    if ((intervalPtr->tickInterval < 0)
+           ^ ((intervalPtr->toValue - intervalPtr->fromValue) <  0)) {
+       intervalPtr->tickInterval = -intervalPtr->tickInterval;
+    }
+
+    /*
+     * Set the interval mix and max values to themselves;  all this does is
+     * to make sure that the interval's value is within the new acceptable 
+     * range for the interval.
+     */
+
+    SetInterval(intervalPtr, intervalPtr->minValue, intervalPtr->maxValue, 0);
+
+    if (intervalPtr->command != NULL) {
+       intervalPtr->commandLength = strlen(intervalPtr->command);
+    } else {
+       intervalPtr->commandLength = 0;
+    }
+
+    if (intervalPtr->label != NULL) {
+       intervalPtr->labelLength = strlen(intervalPtr->label);
+    } else {
+       intervalPtr->labelLength = 0;
+    }
+
+    Tk_SetBackgroundFromBorder(intervalPtr->tkwin, intervalPtr->bgBorder);
+
+    gcValues.font = intervalPtr->fontPtr->fid;
+    gcValues.foreground = intervalPtr->textColorPtr->pixel;
+    newGC = Tk_GetGC(intervalPtr->tkwin, GCForeground|GCFont, &gcValues);
+    if (intervalPtr->textGC != None) {
+       Tk_FreeGC(intervalPtr->textGC);
+    }
+    intervalPtr->textGC = newGC;
+
+    if (intervalPtr->relief != TK_RELIEF_FLAT) {
+       intervalPtr->offset = intervalPtr->borderWidth;
+    } else {
+       intervalPtr->offset = 0;
+    }
+
+    /*
+     * Recompute display-related information, and let the geometry
+     * manager know how much space is needed now.
+     */
+
+    ComputeIntervalGeometry(intervalPtr);
+
+    EventuallyRedrawInterval(intervalPtr, REDRAW_ALL);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ComputeIntervalGeometry --
+ *
+ *     This procedure is called to compute various geometrical
+ *     information for a interval, such as where various things get
+ *     displayed.  It's called when the window is reconfigured.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Display-related numbers get changed in *scrollPtr.  The
+ *     geometry manager gets told about the window's preferred size.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ComputeIntervalGeometry(intervalPtr)
+    register Interval *intervalPtr;            /* Information about widget. */
+{
+    XCharStruct bbox;
+    char valueString[30];
+    int dummy, lineHeight;
+
+    /*
+     * Horizontal intervals are simpler than vertical ones because
+     * all sizes are the same (the height of a line of text);
+     * handle them first and then quit.
+     */
+
+    if (!intervalPtr->vertical) {
+       lineHeight = intervalPtr->fontPtr->ascent + intervalPtr->fontPtr->descent;
+       if (intervalPtr->tickInterval != 0) {
+           intervalPtr->tickPixels = lineHeight;
+       } else {
+           intervalPtr->tickPixels = 0;
+       }
+       if (intervalPtr->showValue) {
+           intervalPtr->valuePixels = lineHeight + SPACING;
+       } else {
+           intervalPtr->valuePixels = 0;
+       }
+       if (intervalPtr->labelLength != 0) {
+           intervalPtr->labelPixels = lineHeight;
+       } else {
+           intervalPtr->labelPixels = 0;
+       }
+
+       Tk_GeometryRequest(intervalPtr->tkwin,
+               intervalPtr->length + 2*intervalPtr->offset,
+               intervalPtr->tickPixels + intervalPtr->valuePixels
+               + intervalPtr->width + 2*intervalPtr->borderWidth
+               + intervalPtr->labelPixels + 2*intervalPtr->offset);
+       Tk_SetInternalBorder(intervalPtr->tkwin, intervalPtr->borderWidth);
+       return;
+    }
+
+    /*
+     * Vertical interval:  compute the amount of space needed for tick marks
+     * and current value by formatting strings for the two end points;
+     * use whichever length is longer.
+     */
+
+    sprintf(valueString, "%d", intervalPtr->fromValue);
+    XTextExtents(intervalPtr->fontPtr, valueString, strlen(valueString),
+           &dummy, &dummy, &dummy, &bbox);
+    intervalPtr->tickPixels = bbox.rbearing + bbox.lbearing;
+    sprintf(valueString, "%d", intervalPtr->toValue);
+    XTextExtents(intervalPtr->fontPtr, valueString, strlen(valueString),
+           &dummy, &dummy, &dummy, &bbox);
+    if (intervalPtr->tickPixels < bbox.rbearing + bbox.lbearing) {
+       intervalPtr->tickPixels = bbox.rbearing + bbox.lbearing;
+    }
+
+    /*
+     * Pad the value with a bit of extra space for prettier printing.
+     */
+
+    intervalPtr->tickPixels += intervalPtr->fontPtr->ascent/2;
+    intervalPtr->valuePixels = intervalPtr->tickPixels;
+    if (intervalPtr->tickInterval == 0) {
+       intervalPtr->tickPixels = 0;
+    }
+    if (!intervalPtr->showValue) {
+       intervalPtr->valuePixels = 0;
+    }
+
+    if (intervalPtr->labelLength == 0) {
+       intervalPtr->labelPixels = 0;
+    } else {
+       XTextExtents(intervalPtr->fontPtr, intervalPtr->label,
+               intervalPtr->labelLength, &dummy, &dummy, &dummy, &bbox);
+       intervalPtr->labelPixels = bbox.rbearing + bbox.lbearing
+               + intervalPtr->fontPtr->ascent;
+    }
+    Tk_GeometryRequest(intervalPtr->tkwin, 2*intervalPtr->borderWidth
+           + intervalPtr->tickPixels + intervalPtr->valuePixels + SPACING
+           + intervalPtr->width + intervalPtr->labelPixels,
+           intervalPtr->length);
+    Tk_SetInternalBorder(intervalPtr->tkwin, intervalPtr->borderWidth);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayVerticalInterval --
+ *
+ *     This procedure redraws the contents of a vertical interval
+ *     window.  It is invoked as a do-when-idle handler, so it only
+ *     runs when there's nothing else for the application to do.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information appears on the screen.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayVerticalInterval(clientData)
+    ClientData clientData;     /* Information about widget. */
+{
+    register Interval *intervalPtr = (Interval *) clientData;
+    register Tk_Window tkwin = intervalPtr->tkwin;
+    int tickRightEdge, valueRightEdge, labelLeftEdge, intervalLeftEdge;
+    int totalPixels, x, y, width, height, tickValue, min, max;
+    int relief;
+    Tk_3DBorder sliderBorder;
+
+    if ((intervalPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
+       goto done;
+    }
+
+    /*
+     * Scanning from left to right across the window, the window
+     * will contain four columns:  ticks, value, interval, and label.
+     * Compute the x-coordinate for each of the columns.
+     */
+
+    totalPixels = intervalPtr->tickPixels + intervalPtr->valuePixels
+           + 2*intervalPtr->borderWidth + intervalPtr->width
+           + 2*SPACING + intervalPtr->labelPixels;
+    tickRightEdge = (Tk_Width(tkwin) - totalPixels)/2 + intervalPtr->tickPixels;
+    valueRightEdge = tickRightEdge + intervalPtr->valuePixels;
+    intervalLeftEdge = valueRightEdge + SPACING;
+    labelLeftEdge = intervalLeftEdge + 2*intervalPtr->borderWidth
+           + intervalPtr->width + intervalPtr->fontPtr->ascent/2;
+
+    /*
+     * Display the information from left to right across the window.
+     */
+
+    if (intervalPtr->flags & REDRAW_OTHER) {
+       XClearWindow(Tk_Display(tkwin), Tk_WindowId(tkwin));
+
+       /*
+        * Display the tick marks.
+        */
+
+       if (intervalPtr->tickPixels != 0) {
+           for (tickValue = intervalPtr->fromValue; ;
+                   tickValue += intervalPtr->tickInterval) {
+               if (intervalPtr->toValue > intervalPtr->fromValue) {
+                   if (tickValue > intervalPtr->toValue) {
+                       break;
+                   }
+               } else {
+                   if (tickValue < intervalPtr->toValue) {
+                       break;
+                   }
+               }
+               DisplayVerticalValue(intervalPtr, tickValue, tickRightEdge);
+           }
+       }
+    }
+
+    /*
+     * Display the values, if they are desired.  If not redisplaying the
+     * entire window, clear the area of the value to get rid of the
+     * old value displayed there.
+     */
+
+    if (intervalPtr->showValue) {
+       if (!(intervalPtr->flags & REDRAW_OTHER)) {
+           XClearArea(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                   valueRightEdge-intervalPtr->valuePixels, intervalPtr->offset,
+                   intervalPtr->valuePixels,
+                   Tk_Height(tkwin) - 2*intervalPtr->offset, False);
+       }
+       DisplayVerticalValue(intervalPtr, intervalPtr->minValue, valueRightEdge);
+       DisplayVerticalValue(intervalPtr, intervalPtr->maxValue, valueRightEdge);
+    }
+
+    /*
+     * Display the interval and the slider.  If not redisplaying the
+     * entire window, must clear the trench area to erase the old
+     * slider, but don't need to redraw the border.
+     */
+
+    if (intervalPtr->flags & REDRAW_OTHER) {
+       Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               intervalPtr->bgBorder, intervalLeftEdge, intervalPtr->offset,
+               intervalPtr->width + 2*intervalPtr->borderWidth,
+               Tk_Height(tkwin) - 2*intervalPtr->offset, intervalPtr->borderWidth,
+               TK_RELIEF_SUNKEN);
+    } else {
+       XClearArea(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               intervalLeftEdge + intervalPtr->borderWidth,
+               intervalPtr->offset + intervalPtr->borderWidth,
+               intervalPtr->width,
+               Tk_Height(tkwin) - 2*intervalPtr->offset
+               - 2*intervalPtr->borderWidth, False);
+    }
+    if (intervalPtr->flags & ACTIVE) {
+       sliderBorder = intervalPtr->activeBorder;
+    } else {
+       sliderBorder = intervalPtr->sliderBorder;
+    }
+    width = intervalPtr->width;
+
+    min = ValueToPixel(intervalPtr, intervalPtr->minValue);
+    max = ValueToPixel(intervalPtr, intervalPtr->maxValue);
+
+    height = (max - min) + (2 * intervalPtr->borderWidth);
+
+    x = intervalLeftEdge + intervalPtr->borderWidth;
+
+    relief = (intervalPtr->flags & BUTTON_PRESSED) ? TK_RELIEF_SUNKEN
+           : TK_RELIEF_RAISED;
+    Tk_Fill3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin), sliderBorder,
+           x, min, width, height, intervalPtr->borderWidth, relief);
+
+    /*
+     * Draw the label to the right of the interval.
+     */
+
+    if ((intervalPtr->flags & REDRAW_OTHER) && (intervalPtr->labelPixels != 0)) {
+       XDrawString(Tk_Display(intervalPtr->tkwin), Tk_WindowId(intervalPtr->tkwin),
+           intervalPtr->textGC, labelLeftEdge,
+           intervalPtr->offset + (3*intervalPtr->fontPtr->ascent)/2,
+           intervalPtr->label, intervalPtr->labelLength);
+    }
+
+    /*
+     * Draw the window border.
+     */
+
+    if ((intervalPtr->flags & REDRAW_OTHER)
+           && (intervalPtr->relief != TK_RELIEF_FLAT)) {
+       Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               intervalPtr->bgBorder, 0, 0, Tk_Width(tkwin), Tk_Height(tkwin),
+               intervalPtr->borderWidth, intervalPtr->relief);
+    }
+
+    done:
+    intervalPtr->flags &= ~REDRAW_ALL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DisplayVerticalValue --
+ *
+ *     This procedure is called to display values (interval readings)
+ *     for vertically-oriented intervals.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The numerical value corresponding to value is displayed with
+ *     its right edge at "rightEdge", and at a vertical position in
+ *     the interval that corresponds to "value".
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DisplayVerticalValue(intervalPtr, value, rightEdge)
+    register Interval *intervalPtr;    /* Information about widget in which to
+                                * display value. */
+    int value;                 /* Y-coordinate of number to display,
+                                * specified in application coords, not
+                                * in pixels (we'll compute pixels). */
+    int rightEdge;             /* X-coordinate of right edge of text,
+                                * specified in pixels. */
+{
+    register Tk_Window tkwin = intervalPtr->tkwin;
+    int y, dummy, length;
+    char valueString[30];
+    XCharStruct bbox;
+
+    y = ValueToPixel(intervalPtr, value) + intervalPtr->fontPtr->ascent/2;
+    sprintf(valueString, "%d", value);
+    length = strlen(valueString);
+    XTextExtents(intervalPtr->fontPtr, valueString, length,
+           &dummy, &dummy, &dummy, &bbox);
+
+    /*
+     * Adjust the y-coordinate if necessary to keep the text entirely
+     * inside the window.
+     */
+
+    if ((y - bbox.ascent) < intervalPtr->offset) {
+       y = intervalPtr->offset + bbox.ascent;
+    }
+    if ((y + bbox.descent) > (Tk_Height(tkwin) - intervalPtr->offset)) {
+       y = Tk_Height(tkwin) - intervalPtr->offset - bbox.descent;
+    }
+    XDrawString(Tk_Display(tkwin), Tk_WindowId(tkwin),
+           intervalPtr->textGC, rightEdge - bbox.rbearing,
+           y, valueString, length);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayHorizontalInterval --
+ *
+ *     This procedure redraws the contents of a horizontal interval
+ *     window.  It is invoked as a do-when-idle handler, so it only
+ *     runs when there's nothing else for the application to do.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information appears on the screen.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayHorizontalInterval(clientData)
+    ClientData clientData;     /* Information about widget. */
+{
+    register Interval *intervalPtr = (Interval *) clientData;
+    register Tk_Window tkwin = intervalPtr->tkwin;
+    int tickBottom, valueBottom, labelBottom, intervalBottom;
+    int totalPixels, x, y, width, height, tickValue, min, max;
+    int relief;
+    Tk_3DBorder sliderBorder;
+
+    if ((intervalPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
+       goto done;
+    }
+
+    /*
+     * Scanning from bottom to top across the window, the window
+     * will contain four rows:  ticks, value, interval, and label.
+     * Compute the y-coordinate for each of the rows.
+     */
+
+    totalPixels = intervalPtr->tickPixels + intervalPtr->valuePixels
+           + 2*intervalPtr->borderWidth + intervalPtr->width
+           + intervalPtr->labelPixels;
+    tickBottom = (Tk_Height(tkwin) + totalPixels)/2 - 1;
+    valueBottom = tickBottom - intervalPtr->tickPixels;
+    intervalBottom = valueBottom - intervalPtr->valuePixels;
+    labelBottom = intervalBottom - 2*intervalPtr->borderWidth - intervalPtr->width;
+
+    /*
+     * Display the information from bottom to top across the window.
+     */
+
+    if (intervalPtr->flags & REDRAW_OTHER) {
+       XClearWindow(Tk_Display(tkwin), Tk_WindowId(tkwin));
+
+       /*
+        * Display the tick marks.
+        */
+
+       if (intervalPtr->tickPixels != 0) {
+           for (tickValue = intervalPtr->fromValue; ;
+                   tickValue += intervalPtr->tickInterval) {
+               if (intervalPtr->toValue > intervalPtr->fromValue) {
+                   if (tickValue > intervalPtr->toValue) {
+                       break;
+                   }
+               } else {
+                   if (tickValue < intervalPtr->toValue) {
+                       break;
+                   }
+               }
+               DisplayHorizontalValue(intervalPtr, tickValue, tickBottom);
+           }
+       }
+    }
+
+    /*
+     * Display the values, if they are desired.  If not redisplaying the
+     * entire window, clear the area of the value to get rid of the
+     * old value displayed there.
+     */
+
+    if (intervalPtr->showValue) {
+       if (!(intervalPtr->flags & REDRAW_OTHER)) {
+           XClearArea(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                   intervalPtr->offset, intervalBottom + 1,
+                   Tk_Width(tkwin) - 2*intervalPtr->offset,
+                   valueBottom - intervalBottom, False);
+       }
+       DisplayHorizontalValue(intervalPtr, intervalPtr->minValue, valueBottom);
+       DisplayHorizontalValue(intervalPtr, intervalPtr->maxValue, valueBottom);
+    }
+
+    /*
+     * Display the interval and the slider.  If not redisplaying the
+     * entire window, must clear the trench area to erase the old
+     * slider, but don't need to redraw the border.
+     */
+
+    y = intervalBottom - 2*intervalPtr->borderWidth - intervalPtr->width + 1;
+    if (intervalPtr->flags & REDRAW_OTHER) {
+       Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               intervalPtr->bgBorder, intervalPtr->offset, y,
+               Tk_Width(tkwin) - 2*intervalPtr->offset,
+               intervalPtr->width + 2*intervalPtr->borderWidth,
+               intervalPtr->borderWidth, TK_RELIEF_SUNKEN);
+    } else {
+       XClearArea(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               intervalPtr->offset + intervalPtr->borderWidth,
+               y + intervalPtr->borderWidth,
+               Tk_Width(tkwin) - 2*intervalPtr->offset - 2*intervalPtr->borderWidth,
+               intervalPtr->width, False);
+    }
+    if (intervalPtr->flags & ACTIVE) {
+       sliderBorder = intervalPtr->activeBorder;
+    } else {
+       sliderBorder = intervalPtr->sliderBorder;
+    }
+    height = intervalPtr->width;
+
+    min = ValueToPixel(intervalPtr, intervalPtr->minValue);
+    max = ValueToPixel(intervalPtr, intervalPtr->maxValue);
+
+    width = (max - min) + (2 * intervalPtr->borderWidth);
+
+    y += intervalPtr->borderWidth;
+    relief = (intervalPtr->flags & BUTTON_PRESSED) ? TK_RELIEF_SUNKEN
+           : TK_RELIEF_RAISED;
+    Tk_Fill3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin), sliderBorder,
+           min, y, width, height, intervalPtr->borderWidth, relief);
+
+    /*
+     * Draw the label to the top of the interval.
+     */
+
+    if ((intervalPtr->flags & REDRAW_OTHER) && (intervalPtr->labelPixels != 0)) {
+       XDrawString(Tk_Display(intervalPtr->tkwin), Tk_WindowId(intervalPtr->tkwin),
+           intervalPtr->textGC, intervalPtr->offset + intervalPtr->fontPtr->ascent/2,
+           labelBottom - intervalPtr->fontPtr->descent,
+           intervalPtr->label, intervalPtr->labelLength);
+    }
+
+    /*
+     * Draw the window border.
+     */
+
+    if ((intervalPtr->flags & REDRAW_OTHER)
+           && (intervalPtr->relief != TK_RELIEF_FLAT)) {
+       Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               intervalPtr->bgBorder, 0, 0, Tk_Width(tkwin), Tk_Height(tkwin),
+               intervalPtr->borderWidth, intervalPtr->relief);
+    }
+
+    done:
+    intervalPtr->flags &= ~REDRAW_ALL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DisplayHorizontalValue --
+ *
+ *     This procedure is called to display values (interval readings)
+ *     for horizontally-oriented intervals.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The numerical value corresponding to value is displayed with
+ *     its bottom edge at "bottom", and at a horizontal position in
+ *     the interval that corresponds to "value".
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DisplayHorizontalValue(intervalPtr, value, bottom)
+    register Interval *intervalPtr;    /* Information about widget in which to
+                                * display value. */
+    int value;                 /* Y-coordinate of number to display,
+                                * specified in application coords, not
+                                * in pixels (we'll compute pixels). */
+    int bottom;                        /* Y-coordinate of bottom edge of text,
+                                * specified in pixels. */
+{
+    register Tk_Window tkwin = intervalPtr->tkwin;
+    int x, y, dummy, length;
+    char valueString[30];
+    XCharStruct bbox;
+
+    x = ValueToPixel(intervalPtr, value);
+    y = bottom - intervalPtr->fontPtr->descent;
+    sprintf(valueString, "%d", value);
+    length = strlen(valueString);
+    XTextExtents(intervalPtr->fontPtr, valueString, length,
+           &dummy, &dummy, &dummy, &bbox);
+
+    /*
+     * Adjust the x-coordinate if necessary to keep the text entirely
+     * inside the window.
+     */
+
+    x -= (bbox.lbearing + bbox.rbearing)/2;
+    if ((x - bbox.lbearing) < intervalPtr->offset) {
+       x = intervalPtr->offset + bbox.lbearing;
+    }
+    if ((x + bbox.rbearing) > (Tk_Width(tkwin) - intervalPtr->offset)) {
+       x = Tk_Width(tkwin) - intervalPtr->offset - bbox.rbearing;
+    }
+    XDrawString(Tk_Display(tkwin), Tk_WindowId(tkwin),
+           intervalPtr->textGC, x, y, valueString, length);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * PixelToValue --
+ *
+ *     Given a pixel within a interval window, return the interval
+ *     reading corresponding to that pixel.
+ *
+ * Results:
+ *     An integer interval reading.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+PixelToValue(intervalPtr, x, y)
+    register Interval *intervalPtr;            /* Information about widget. */
+    int x, y;                          /* Coordinates of point within
+                                        * window. */
+{
+    int value, pixelRange;
+
+    if (intervalPtr->vertical) {
+       pixelRange = Tk_Height(intervalPtr->tkwin)
+               - 2*intervalPtr->offset - 4*intervalPtr->borderWidth;
+       value = y;
+    } else {
+       pixelRange = Tk_Width(intervalPtr->tkwin)
+               - 2*intervalPtr->offset - 4*intervalPtr->borderWidth;
+       value = x;
+    }
+
+    if (pixelRange <= 0) {
+       /*
+        * Not enough room for the slider to actually slide:  just return
+        * a constant.
+        */
+
+       return (0);
+    }
+    value -= intervalPtr->offset + intervalPtr->borderWidth;
+#if 0
+    if (value < 0) {
+       value = 0;
+    }
+    if (value > pixelRange) {
+       value = pixelRange;
+    }
+#endif
+    if (intervalPtr->toValue > intervalPtr->fromValue) {
+       value = intervalPtr->fromValue +
+               ((value * (intervalPtr->toValue - intervalPtr->fromValue))
+               + pixelRange/2)/pixelRange;
+    } else {
+       value = intervalPtr->toValue +
+               (((pixelRange - value)
+               * (intervalPtr->fromValue - intervalPtr->toValue))
+               + pixelRange/2)/pixelRange;
+    }
+    return value;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ValueToPixel --
+ *
+ *     Given a reading of the interval, return the x-coordinate or
+ *     y-coordinate corresponding to that reading, depending on
+ *     whether the interval is vertical or horizontal, respectively.
+ *
+ * Results:
+ *     An integer value giving the pixel location corresponding
+ *     to reading.  The value is restricted to lie within the
+ *     defined range for the interval.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ValueToPixel(intervalPtr, value)
+    register Interval *intervalPtr;            /* Information about widget. */
+    int value;                         /* Reading of the widget. */
+{
+    int y, pixelRange, valueRange;
+
+    valueRange = intervalPtr->toValue - intervalPtr->fromValue;
+    pixelRange = (intervalPtr->vertical ? Tk_Height(intervalPtr->tkwin)
+                                       : Tk_Width(intervalPtr->tkwin))
+           - 2*intervalPtr->offset - 4*intervalPtr->borderWidth;
+    y = ((value - intervalPtr->fromValue) * pixelRange
+           + valueRange/2) / valueRange;
+    if (y < 0) {
+       y = 0;
+    } else if (y > pixelRange) {
+       y = pixelRange;
+    }
+    y += intervalPtr->offset + intervalPtr->borderWidth;
+    return y;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * IntervalEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher for various
+ *     events on intervals.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the window gets deleted, internal structures get
+ *     cleaned up.  When it gets exposed, it is redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+IntervalEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    XEvent *eventPtr;          /* Information about event. */
+{
+    Interval *intervalPtr = (Interval *) clientData;
+
+    if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {
+       EventuallyRedrawInterval(intervalPtr, REDRAW_ALL);
+    } else if (eventPtr->type == DestroyNotify) {
+       Tcl_DeleteCommand(intervalPtr->interp, Tk_PathName(intervalPtr->tkwin));
+       intervalPtr->tkwin = NULL;
+       if (intervalPtr->flags & REDRAW_ALL) {
+           if (intervalPtr->vertical) {
+               Tk_CancelIdleCall(DisplayVerticalInterval, (ClientData) intervalPtr);
+           } else {
+               Tk_CancelIdleCall(DisplayHorizontalInterval,
+                       (ClientData) intervalPtr);
+           }
+       }
+       Tk_EventuallyFree((ClientData) intervalPtr, DestroyInterval);
+    } else if (eventPtr->type == ConfigureNotify) {
+       ComputeIntervalGeometry(intervalPtr);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * IntervalMouseProc --
+ *
+ *     This procedure is called back by Tk in response to
+ *     mouse events such as window entry, window exit, mouse
+ *     motion, and button presses.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     This procedure implements the "feel" of the interval by
+ *     issuing commands in response to button presses and mouse
+ *     motion.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+IntervalMouseProc(clientData, eventPtr)
+    ClientData clientData;             /* Information about window. */
+    register XEvent *eventPtr;         /* Information about event. */
+{
+    register Interval *intervalPtr = (Interval *) clientData;
+
+    if (intervalPtr->state != tkNormalUid) {
+       return;
+    }
+
+    Tk_Preserve((ClientData) intervalPtr);
+    if (eventPtr->type == EnterNotify) {
+       intervalPtr->flags |= ACTIVE;
+       EventuallyRedrawInterval(intervalPtr, REDRAW_SLIDER);
+    } else if (eventPtr->type == LeaveNotify) {
+       intervalPtr->flags &= ~ACTIVE;
+       EventuallyRedrawInterval(intervalPtr, REDRAW_SLIDER);
+    } else if ((eventPtr->type == MotionNotify)
+           && (intervalPtr->flags & BUTTON_PRESSED)) {
+       TrackInterval(intervalPtr,  PixelToValue(intervalPtr,
+               eventPtr->xmotion.x, eventPtr->xmotion.y));
+    } else if ((eventPtr->type == ButtonPress)
+/*         && (eventPtr->xbutton.button == Button1) */
+           && (eventPtr->xbutton.state == 0)) {
+       intervalPtr->flags |= BUTTON_PRESSED;
+       StartTrackInterval(intervalPtr, PixelToValue(intervalPtr,
+               eventPtr->xbutton.x, eventPtr->xbutton.y));
+/*     NotifyInterval(intervalPtr); */
+       EventuallyRedrawInterval(intervalPtr, REDRAW_SLIDER);
+    } else if ((eventPtr->type == ButtonRelease)
+/*         && (eventPtr->xbutton.button == Button1) */
+           && (intervalPtr->flags & BUTTON_PRESSED)) {
+       intervalPtr->flags &= ~BUTTON_PRESSED;
+       TrackInterval(intervalPtr,  PixelToValue(intervalPtr,
+               eventPtr->xmotion.x, eventPtr->xmotion.y));
+/*     NotifyInterval(intervalPtr); */
+       EventuallyRedrawInterval(intervalPtr, REDRAW_SLIDER);
+    }
+    Tk_Release((ClientData) intervalPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TrackInterval --
+ *
+ *     This procedure changes the value of a interval and invokes
+ *     a Tcl command to reflect the current position of a interval
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A Tcl command is invoked, and an additional error-processing
+ *     command may also be invoked.  The interval's slider is redrawn.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+StartTrackInterval(intervalPtr, value)
+    register Interval *intervalPtr;    /* Info about widget. */
+    int value;                 /* New value for interval.  Gets
+                                * adjusted if it's off the interval. */
+{
+    int result;
+    char string[20];
+
+    if ((value < intervalPtr->fromValue)
+           ^ (intervalPtr->toValue < intervalPtr->fromValue)) {
+       value = intervalPtr->fromValue;
+    }
+    if ((value > intervalPtr->toValue)
+           ^ (intervalPtr->toValue < intervalPtr->fromValue)) {
+       value = intervalPtr->toValue;
+    }
+    intervalPtr->trackValue = value;
+    intervalPtr->trackWidth = intervalPtr->maxValue - intervalPtr->minValue;
+    if (value <= intervalPtr->minValue) {
+      intervalPtr->trackState = -1;
+    } else if (value >= intervalPtr->maxValue) {
+      intervalPtr->trackState = 1;
+    } else {
+      intervalPtr->trackState = 0;
+    }
+    SetInterval(intervalPtr, intervalPtr->minValue, intervalPtr->maxValue, 1);
+}
+
+
+static void
+TrackInterval(intervalPtr, value)
+    register Interval *intervalPtr;    /* Info about widget. */
+    int value;
+{
+    int result;
+    char string[20];
+    int min, max, delta, lastmin, lastmax;
+
+
+    delta = value - intervalPtr->trackValue;
+    if (delta == 0) return;
+
+    intervalPtr->trackValue = value;
+
+    min = intervalPtr->minValue;
+    max = intervalPtr->maxValue;
+
+    switch (intervalPtr->trackState) {
+    case -1: /* left trench */
+      min += delta;
+      if (min > max) max = min;
+      break;
+    case 1: /* right trench */
+      max += delta;
+      if (min > max) min = max;
+      break;
+    case 0: /* center slider */
+      lastmin = min; lastmax = max;
+      min += delta; max += delta;
+      if ((max - min) != intervalPtr->trackWidth) { /* squished */
+       if (lastmin == intervalPtr->fromValue) {
+         min = max - intervalPtr->trackWidth;
+       } else if (lastmax == intervalPtr->toValue) {
+         max = min + intervalPtr->trackWidth;
+       }
+      }
+      break;
+    }
+
+    SetInterval(intervalPtr, min, max, 1);
+}
+
+
+static void
+SetInterval(intervalPtr, min, max, notify)
+    register Interval *intervalPtr;    /* Info about widget. */
+    int min, max, notify;
+{
+    if (min > max) {
+      int temp = min;
+      min = max;
+      max = temp;
+    }
+
+    if ((min < intervalPtr->fromValue)
+           ^ (intervalPtr->toValue < intervalPtr->fromValue)) {
+       min = intervalPtr->fromValue;
+    }
+    if ((min > intervalPtr->toValue)
+           ^ (intervalPtr->toValue < intervalPtr->fromValue)) {
+       min = intervalPtr->toValue;
+    }
+    if ((max < intervalPtr->fromValue)
+           ^ (intervalPtr->toValue < intervalPtr->fromValue)) {
+       max = intervalPtr->fromValue;
+    }
+    if ((max > intervalPtr->toValue)
+           ^ (intervalPtr->toValue < intervalPtr->fromValue)) {
+       max = intervalPtr->toValue;
+    }
+
+    if ((min == intervalPtr->minValue) &&
+       (max == intervalPtr->maxValue)) {
+      return;
+    }
+
+    intervalPtr->minValue = min;
+    intervalPtr->maxValue = max;
+    EventuallyRedrawInterval(intervalPtr, REDRAW_SLIDER);
+
+    if (notify)
+      NotifyInterval(intervalPtr);
+}
+
+
+NotifyInterval(intervalPtr)
+    register Interval *intervalPtr;    /* Info about widget. */
+{
+    int result;
+    char string[256];
+
+    sprintf(string, " %d %d", intervalPtr->minValue, intervalPtr->maxValue);
+    result = Tcl_VarEval(intervalPtr->interp, intervalPtr->command, string,
+           (char *) NULL);
+    if (result != TCL_OK) {
+       TkBindError(intervalPtr->interp);
+    }
+}
+
+
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * EventuallyRedrawInterval --
+ *
+ *     Arrange for part or all of a interval widget to redrawn at
+ *     the next convenient time in the future.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If "what" is REDRAW_SLIDER then just the slider and the
+ *     value readout will be redrawn;  if "what" is REDRAW_ALL
+ *     then the entire widget will be redrawn.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+EventuallyRedrawInterval(intervalPtr, what)
+    register Interval *intervalPtr;    /* Information about widget. */
+    int what;                  /* What to redraw:  REDRAW_SLIDER
+                                * or REDRAW_ALL. */
+{
+    if ((what == 0) || (intervalPtr->tkwin == NULL)
+           || !Tk_IsMapped(intervalPtr->tkwin)) {
+       return;
+    }
+    if ((intervalPtr->flags & REDRAW_ALL) == 0) {
+       if (intervalPtr->vertical) {
+           Tk_DoWhenIdle(DisplayVerticalInterval, (ClientData) intervalPtr);
+       } else {
+           Tk_DoWhenIdle(DisplayHorizontalInterval, (ClientData) intervalPtr);
+       }
+    }
+    intervalPtr->flags |= what;
+}
diff --git a/src/sim/w_keys.c b/src/sim/w_keys.c
new file mode 100644 (file)
index 0000000..64c5105
--- /dev/null
@@ -0,0 +1,325 @@
+/* w_keys.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+static char LastKeys[5];
+
+
+/* TODO:
+  <n> new city
+  <l> load city
+  <s> save city
+  <q> quit
+  <a> autobulldoze
+  <0><1><2><3>... game speed
+  <m> map window
+  <g> graph window
+  <b> budget window
+  <e> evaluation window
+*/
+
+
+ResetLastKeys()
+{
+  LastKeys[0] = ' ';
+  LastKeys[1] = ' ';
+  LastKeys[2] = ' ';
+  LastKeys[3] = ' ';
+  LastKeys[4] = '\0';
+  PunishCnt = 0;
+}
+
+
+/* comefrom: processEvent */
+doKeyDown(SimView *view, short charCode)
+{
+  LastKeys[0] = LastKeys[1];
+  LastKeys[1] = LastKeys[2];
+  LastKeys[2] = LastKeys[3];
+  LastKeys[3] = tolower(charCode);
+
+  if (strcmp(LastKeys, "fund") == 0) {
+    Spend(-10000);
+    PunishCnt++;                               /* punish for cheating */
+    if (PunishCnt == 5) {
+      PunishCnt = 0;
+      MakeEarthquake();
+    }
+    LastKeys[0] = '\0';
+  } else if (strcmp(LastKeys, "fart") == 0) {
+    MakeSound("city", "Explosion-High");
+    MakeSound("city", "Explosion-Low");
+    MakeFire();
+    MakeFlood();
+    MakeTornado();
+    MakeEarthquake();
+    MakeMonster();
+    LastKeys[0] = '\0';
+  } else if (strcmp(LastKeys, "nuke") == 0) {
+    int i, j;
+    MakeSound("city", "Explosion-High");
+    MakeSound("city", "Explosion-Low");
+    for (i = 0; i < WORLD_X; i++) {
+      for (j = 0; j < WORLD_Y; j++) {
+       short tile = Map[i][j] & LOMASK;
+       if ((tile >= RUBBLE) &&
+           ((tile < CHURCH - 4) ||
+            (tile > CHURCH + 4))) {
+         if ((tile >= HBRIDGE && tile <= VBRIDGE) ||
+             (tile >= BRWH && tile <= LTRFBASE + 1) ||
+             (tile >= BRWV && tile <= BRWV + 2) ||
+             (tile >= BRWXXX1 && tile <= BRWXXX1 + 2) ||
+             (tile >= BRWXXX2 && tile <= BRWXXX2 + 2) ||
+             (tile >= BRWXXX3 && tile <= BRWXXX3 + 2) ||
+             (tile >= BRWXXX4 && tile <= BRWXXX4 + 2) ||
+             (tile >= BRWXXX5 && tile <= BRWXXX5 + 2) ||
+             (tile >= BRWXXX6 && tile <= BRWXXX6 + 2) ||
+             (tile >= BRWXXX7 && tile <= BRWXXX7 + 2)) {
+           Map[i][j] = RIVER;
+         } else {
+           Map[i][j] = TINYEXP + ANIMBIT + BULLBIT + Rand(2);
+         }
+       }
+      }
+    }
+    LastKeys[0] = '\0';
+  } else if (strcmp(LastKeys, "stop") == 0) {
+    heat_steps = 0;
+    LastKeys[0] = '\0';
+    Kick();
+  } else if (strcmp(LastKeys, "will") == 0) {
+    int i;
+    int n = 500;
+    for (i = 0; i < n; i++) {
+      int x1 = Rand(WORLD_X - 1);
+      int y1 = Rand(WORLD_Y - 1);
+      int x2 = Rand(WORLD_X - 1);
+      int y2 = Rand(WORLD_Y - 1);
+      short temp =
+       Map[x1][y1];
+      Map[x1][y1] =
+       Map[x2][y2];
+      Map[x2][y2] =
+       temp;
+    }
+    Kick();
+  } else if (strcmp(LastKeys, "bobo") == 0) {
+    heat_steps = 1;
+    heat_flow = -1;
+    heat_rule = 0;
+    LastKeys[0] = '\0';
+    Kick();
+  } else if (strcmp(LastKeys, "boss") == 0) {
+    heat_steps = 1;
+    heat_flow = 1;
+    heat_rule = 0;
+    LastKeys[0] = '\0';
+    Kick();
+  } else if (strcmp(LastKeys, "mack") == 0) {
+    heat_steps = 1;
+    heat_flow = 0;
+    heat_rule = 0;
+    LastKeys[0] = '\0';
+    Kick();
+  } else if (strcmp(LastKeys, "donh") == 0) {
+    heat_steps = 1;
+    heat_flow = -1;
+    heat_rule = 1;
+    LastKeys[0] = '\0';
+    Kick();
+  } else if (strcmp(LastKeys, "patb") == 0) {
+    heat_steps = 1;
+    heat_flow = Rand(40) - 20;
+    heat_rule = 0;
+    LastKeys[0] = '\0';
+    Kick();
+  } else if (strcmp(LastKeys, "lucb") == 0) {
+    heat_steps = 1;
+    heat_flow = Rand(1000) - 500;
+    heat_rule = 0;
+    LastKeys[0] = '\0';
+    Kick();
+  } else if (strcmp(LastKeys, "olpc") == 0) {
+    Spend(-1000000);
+  }
+
+  switch (charCode) {
+    
+    case 'X':
+    case 'x': {
+      short s = view->tool_state;
+      if (++s > lastState) {
+       s = firstState;
+      }
+      setWandState(view, s);
+      break;
+    }
+
+    case 'Z':
+    case 'z': {
+      short s = view->tool_state;
+      if (--s < firstState) {
+         s = lastState;
+      }
+      setWandState(view, s);
+      break;
+    }
+
+    /***** shift wand state to bull dozer *****/
+    case 'B':
+    case 'b':
+    case 'B'-'@': {
+      if (view->tool_state_save == -1) {
+       view->tool_state_save = view->tool_state;
+      }
+      setWandState(view, dozeState);
+      break;
+    }
+
+    /***** shift wand state to roads *****/
+    case 'R':
+    case 'r':
+    case 'R'-'@': {
+      if (view->tool_state_save == -1) {
+       view->tool_state_save = view->tool_state;
+      }
+      setWandState(view, roadState);
+      break;
+    }
+
+    /***** shift wand state to power *****/
+    case 'P':
+    case 'p':
+    case 'P'-'@': {
+      if (view->tool_state_save == -1) {
+       view->tool_state_save = view->tool_state;
+      }
+      setWandState(view, wireState);
+      break;
+    }
+
+    /***** shift wand state to transit *****/
+    case 'T':
+    case 't':
+    case 'T'-'@': {
+      if (view->tool_state_save == -1) {
+       view->tool_state_save = view->tool_state;
+      }
+      setWandState(view, rrState);
+      break;
+    }
+
+#if 0
+    /***** shift wand state to query *****/
+    case 'Q':
+    case 'q':
+    case 'Q'-'@': {
+      if (view->tool_state_save == -1)
+       view->tool_state_save = view->tool_state;
+      setWandState(view, queryState);
+      break;
+    }
+#endif
+
+    case 27: {
+      SoundOff();
+      break;
+    }
+
+  }
+}
+
+
+/* comefrom: processEvent */
+doKeyUp(SimView *view, short charCode)
+{
+  switch(charCode) {
+
+    case 'b':
+    case 'B':
+    case 'B'-'@':
+    case 'R':
+    case 'r':
+    case 'R'-'@':
+    case 'P':
+    case 'p':
+    case 'P'-'@':
+    case 'T':
+    case 't':
+    case 'T'-'@':
+    case 'q':
+    case 'Q':
+    case 'Q'-'@': {
+      if (view->tool_state_save != -1) {
+       setWandState(view, view->tool_state_save);
+      }
+      view->tool_state_save = -1;
+      break;
+    }
+
+    default: {
+      break;
+    }
+
+  }
+}
diff --git a/src/sim/w_map.c b/src/sim/w_map.c
new file mode 100644 (file)
index 0000000..8d4e5b8
--- /dev/null
@@ -0,0 +1,611 @@
+/* w_map.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+Tcl_HashTable MapCmds;
+
+
+extern Tk_ConfigSpec TileViewConfigSpecs[];
+
+
+Ink *NewInk();
+
+
+MapCmdconfigure(VIEW_ARGS)
+{
+  int result = TCL_OK;
+
+  if (argc == 2) {
+    result = Tk_ConfigureInfo(interp, view->tkwin, TileViewConfigSpecs,
+                             (char *) view, (char *) NULL, 0);
+  } else if (argc == 3) {
+    result = Tk_ConfigureInfo(interp, view->tkwin, TileViewConfigSpecs,
+                             (char *) view, argv[2], 0);
+  } else {
+    result = ConfigureTileView(interp, view, argc-2, argv+2,
+                              TK_CONFIG_ARGV_ONLY);
+  }
+  return result;
+}
+
+MapCmdposition(VIEW_ARGS)
+{
+  if ((argc != 2) && (argc != 4)) {
+    return TCL_ERROR;
+  }
+  if (argc == 4) {
+    if ((Tcl_GetInt(interp, argv[2], &view->w_x) != TCL_OK)
+       || (Tcl_GetInt(interp, argv[3], &view->w_y) != TCL_OK)) {
+      return TCL_ERROR;
+    }
+  }
+  sprintf(interp->result, "%d %d", view->w_x, view->w_y);
+  return TCL_OK;
+}
+
+MapCmdsize(VIEW_ARGS)
+{
+  if ((argc != 2) && (argc != 4)) {
+    return TCL_ERROR;
+  }
+  if (argc == 4) {
+    int w, h;
+
+    if (Tcl_GetInt(interp, argv[2], &w) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    if (Tcl_GetInt(interp, argv[3], &h) != TCL_OK) {
+      return TCL_ERROR;
+    }
+    view->w_width = w;
+    view->w_height = h;
+  }
+  sprintf(interp->result, "%d %d", view->w_width, view->w_height);
+  return TCL_OK;
+}
+
+MapCmdMapState(VIEW_ARGS)
+{
+  int state;
+
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &state) != TCL_OK) ||
+       (state < 0) || (state >= NMAPS)) {
+      return TCL_ERROR;
+    }
+
+    DoSetMapState(view, state); Kick();
+  }
+
+  sprintf(interp->result, "%d", view->map_state);
+  return TCL_OK;
+}
+
+MapCmdShowEditors(VIEW_ARGS)
+{
+  int val;
+
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if (Tcl_GetInt(interp, argv[2], &val) != TCL_OK) {
+      return TCL_ERROR;
+    }
+
+    view->show_editors = val;
+  }
+
+  sprintf(interp->result, "%d", view->show_editors);
+  return TCL_OK;
+}
+
+MapCmdPanStart(VIEW_ARGS)
+{
+  int x, y, left, right, top, bottom, width, height;
+  SimView *ed;
+
+  if (argc != 4) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  for (ed = sim->editor; ed != NULL; ed = ed->next) {
+    if ((ed->x != view->x) || (ed->show_me == 0))
+      continue;
+
+    width = ed->w_width;
+    height = ed->w_height;
+    left = ed->pan_x - (width / 2);
+    top = ed->pan_y - (height / 2);
+    right = left + width;
+    bottom = top + height;
+
+    left = left * 3 / 16 - 4;
+    top = top * 3 / 16 - 4;
+    right = right * 3 / 16 + 4;
+    bottom = bottom * 3 / 16 + 4;
+
+    if ((x >= left) && (x <= right) &&
+       (y >= top) && (y <= bottom)) {
+      goto gotit;
+    }
+  }
+
+gotit:
+  view->last_x = x;
+  view->last_y = y;
+  view->track_info = (char *)ed;
+  return TCL_OK;
+}
+
+MapCmdPanTo(VIEW_ARGS)
+{
+  int x, y, dx, dy;
+  SimView *ed;
+
+  if (argc != 4) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
+      (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {
+    return TCL_ERROR;
+  }
+
+  if ((ed = (SimView *)view->track_info) != NULL) {
+    dx = x - view->last_x;
+    dy = y - view->last_y;
+    if (dx || dy) {
+      view->last_x = x;
+      view->last_y = y;
+      dx = dx * 16 / 3;
+      dy = dy * 16 / 3;
+
+      ed->skip = 0;
+      DoPanBy(ed, dx, dy); Kick();
+    }
+  }
+  return TCL_OK;
+}
+
+MapCmdVisible(VIEW_ARGS)
+{
+  int visible;
+
+  if ((argc != 2) && (argc != 3)) {
+    return TCL_ERROR;
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &visible) != TCL_OK) ||
+       (visible < 0) || (visible > 1)) {
+      return TCL_ERROR;
+    }
+
+    visible = visible && Tk_IsMapped(view->tkwin);
+    view->visible = visible;
+  }
+
+  sprintf(interp->result, "%d", view->visible);
+  return TCL_OK;
+}
+
+MapCmdViewAt(VIEW_ARGS)
+{
+  int x, y;
+
+  if (argc != 4) {
+    return TCL_ERROR;
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
+      (x < 0) || (x >= WORLD_X) ||
+      (Tcl_GetInt(interp, argv[3], &y) != TCL_OK) ||
+      (y < 0) || (y >= WORLD_Y)) {
+    return TCL_ERROR;
+  }
+
+  sprintf(interp->result, "Sorry Not Implemented Yet"); /* XXX */
+  return TCL_OK;
+}
+
+
+map_command_init()
+{
+  int new;
+  extern int TileViewCmd(CLIENT_ARGS);
+
+  Tcl_CreateCommand(tk_mainInterp, "mapview", TileViewCmd,
+                   (ClientData)MainWindow, (void (*)()) NULL);
+
+  Tcl_InitHashTable(&MapCmds, TCL_STRING_KEYS);
+
+#define MAP_CMD(name) HASHED_CMD(Map, name)
+
+  MAP_CMD(configure);
+  MAP_CMD(position);
+  MAP_CMD(size);
+  MAP_CMD(MapState);
+  MAP_CMD(ShowEditors);
+  MAP_CMD(PanStart);
+  MAP_CMD(PanTo);
+  MAP_CMD(Visible);
+  MAP_CMD(ViewAt);
+}
+
+
+int
+DoMapCmd(CLIENT_ARGS)
+{
+  SimView *view = (SimView *) clientData;
+  Tcl_HashEntry *ent;
+  int result = TCL_OK;
+  int (*cmd)();
+
+  if (argc < 2) {
+    return TCL_ERROR;
+  }
+
+  if (ent = Tcl_FindHashEntry(&MapCmds, argv[1])) {
+    cmd = (int (*)())ent->clientData;
+    Tk_Preserve((ClientData) view);
+    result = cmd(view, interp, argc, argv);
+    Tk_Release((ClientData) view);
+  } else {
+    Tcl_AppendResult(interp, "unknown command name: \"",
+                    argv[0], " ", argv[1], "\".", (char *) NULL);
+    result = TCL_ERROR;
+  }
+  return result;
+}
+
+
+/*************************************************************************/
+
+DoNewMap(SimView *view)
+{
+  sim->maps++; view->next = sim->map; sim->map = view;
+/* NewMap = 1; */
+  view->invalid = 1;
+}
+
+
+int DoUpdateMap(SimView *view)
+{
+  int dx, dy, i;
+
+  view->updates++;
+
+// fprintf(stderr, "UpdateMaps sim_skips %d skips %d skip %d visible %d\n", sim_skips, view->skips, view->skip, view->visible);
+
+  if (!view->visible) {
+    return 0;
+  }
+
+  if ((!ShakeNow) &&
+      (!view->update) &&
+      (sim_skips ||
+       view->skips)) {
+    if (sim_skips) {
+      if (sim_skip > 0) {
+       return 0;
+      }
+    } else {
+      if (view->skip > 0) {
+       --view->skip;
+       return 0;
+      } else {
+       view->skip = view->skips;
+      }
+    }
+  }
+
+  view->update = 0;
+  view->skip = 0;
+
+//  view->invalid = 1;
+
+  if (view->invalid || NewMap || ShakeNow) {
+
+    view->invalid = 0;
+
+    switch (view->type) {
+
+    case X_Mem_View:
+      MemDrawMap(view);
+      break;
+
+    case X_Wire_View:
+      WireDrawMap(view);
+      break;
+    }
+
+  }
+
+  /* XXX: don't do this stuff if just redrawing overlay */
+
+  for (dx = dy = i = 0; i < ShakeNow; i++) {
+    dx += Rand(16) - 8;
+    dy += Rand(16) - 8;
+  }
+
+  XCopyArea(view->x->dpy, view->pixmap, view->pixmap2, view->x->gc,
+           dx, dy, view->w_width, view->w_height, 0, 0);
+  DrawMapInk(view);
+
+  /* XXX: do this if just redrawing overlay */
+
+  XCopyArea(view->x->dpy, view->pixmap2,
+           Tk_WindowId(view->tkwin), view->x->gc,
+           0, 0, view->w_width, view->w_height, 0, 0);
+
+  if (view->show_editors) {
+    DrawMapEditorViews(view);
+  }
+
+  return 1;
+}
+
+
+DrawMapEditorViews(SimView *view)
+{
+  Pixmap pm = Tk_WindowId(view->tkwin);
+  struct SimView *ed;
+  int left, right, top, bottom, width, height;
+  int mine;
+
+  XSetLineAttributes(view->x->dpy, view->x->gc, 1,
+                    LineSolid, CapButt, JoinBevel);
+
+  for (ed = sim->editor; ed != NULL; ed = ed->next) {
+    if ((ed->x != view->x) || (ed->show_me == 0))
+      continue;
+
+    width = ed->w_width;
+    height = ed->w_height;
+    left = ed->pan_x - (width / 2);
+    top = ed->pan_y - (height / 2);
+    right = left + width;
+    bottom = top + height;
+
+    left = left * 3 / 16;
+    top = top * 3 / 16;
+    right = right * 3 / 16;
+    bottom = bottom * 3 / 16;
+    width = right - left;
+    height = bottom - top;
+
+    XSetForeground(view->x->dpy, view->x->gc,
+                  view->pixels[COLOR_WHITE]);
+    XDrawRectangle(view->x->dpy, pm, view->x->gc,
+                  left - 3, top - 3, width + 3, height + 3);
+
+    XSetForeground(view->x->dpy, view->x->gc,
+                  view->pixels[COLOR_BLACK]);
+    XDrawRectangle(view->x->dpy, pm, view->x->gc,
+                  left - 1, top - 1, width + 3, height + 3);
+
+    XSetForeground(view->x->dpy, view->x->gc,
+                  view->pixels[COLOR_YELLOW]);
+    XDrawRectangle(view->x->dpy, pm, view->x->gc,
+                  left - 2, top - 2, width + 3, height + 3);
+  }
+}
+
+
+/* 
+ * Sending the whole image is 108108 bytes.
+ * Sending points is 4.4 bytes per point.
+ * One image is as big as 24570 points.
+ * But we have to sort these dang things.
+ */
+
+#define MAX_PIX 256
+int max_pix = MAX_PIX;
+
+struct Pix {
+  long color;
+  short x, y;
+};
+
+struct Pix pix[MAX_PIX];
+
+
+CompareColor(struct Pix *p1, struct Pix *p2)
+{
+  register char c1 = p1->color, c2 = p2->color;
+
+  if (c1 == c2)
+    return (0);
+  return ((c1 < c2) ? -1 : 1);
+}
+
+
+WireDrawMap(SimView *view)
+{
+  int different, x, y, i, last, pts;
+  unsigned char *old, *new;
+  XPoint *points;
+
+  if (!view->x->color) {
+    MemDrawMap(view);
+    return;
+  }
+
+  memcpy(view->other_data, view->data, view->line_bytes * view->m_height); /* XXX: handle depth */
+  MemDrawMap(view);
+
+  old = view->other_data; new = view->data; /* XXX: handle depth */
+  different = 0;
+
+  /* Scan the pixels that have changed */
+  for (y = 0; y < view->m_height; y++) {
+    for (x = 0; x < view->m_width; x++) {
+      if (old[x] != new[x]) {
+       if (different >= max_pix) {
+         /* Wow, lots of the pixels have changed.
+            Maybe we ought to just do it the hard way. */ 
+         XPutImage(view->x->dpy, view->pixmap, view->x->gc, view->image, 
+                   0, 0, 0, 0, view->m_width, view->m_height);
+         return;
+       }
+       pix[different].color = new[x];
+       pix[different].x = x;
+       pix[different].y = y;
+       different++;
+      }
+    }
+    old += view->line_bytes; new += view->line_bytes; /* XXX: handle depth */
+  }
+
+  /* Whew, the images are identical! */
+  if (different == 0)
+    return;
+
+#if 1
+
+  /* Always draw the whole pixmap, for now. */
+  XPutImage(view->x->dpy, view->pixmap, view->x->gc, view->image, 
+           0, 0, 0, 0, view->m_width, view->m_height);
+
+#else
+
+  /* TODO: Fix this. I disabled this incremental drawing code for now since it seems to be buggy. */
+
+  /* Sort the changed pixels by their color */
+  qsort(pix, different, sizeof (struct Pix), (int (*)())CompareColor);
+
+  /* Draw the points of each color that have changed */
+  points = (XPoint *)malloc(sizeof (XPoint) * different);
+  last = 0; pts = 0;
+  for (i = 0; i <= different; i++) {
+    if ((i == different) ||
+       (pix[i].color != pix[last].color)) {
+      XSetForeground(view->x->dpy, view->x->gc, pix[last].color);
+      XDrawPoints(view->x->dpy, view->pixmap, view->x->gc,
+                 points, pts, CoordModeOrigin);
+      if (i == different)
+       break;
+      pts = 0;
+      last = i;
+    }
+    points[pts].x = pix[i].x;
+    points[pts].y = pix[i].y;
+    pts++;
+  }
+  free(points);
+
+#endif
+
+}
+
+
+DrawMapInk(SimView *view)
+{
+  Pixmap pm = view->pixmap2;
+  SimView *v;
+  Ink *ink, *ink2 = NewInk();
+  int i, X, Y, x, y;
+
+  XSetLineAttributes(view->x->dpy, view->x->gc, 0,
+                    LineSolid, CapButt, JoinBevel);
+
+  for (ink = sim->overlay; ink != NULL; ink = ink->next) {
+    X = ink->x; x = (X * 3) >>4;
+    Y = ink->y; y = (Y * 3) >>4;
+    
+    if (ink->length <= 1) {
+      XSetForeground(view->x->dpy, view->x->gc,
+                    view->pixels[ink->color]);
+      XFillArc(view->x->dpy, pm, view->x->gc,
+              ink->x - 1, ink->y - 1, 1, 1, 0, 360 * 64);
+    } else {
+      StartInk(ink2, x, y);
+
+      for (i = 1; i < ink->length; i++) {
+       X += ink->points[i].x; x = (X * 3) >>4;
+       Y += ink->points[i].y; y = (Y * 3) >>4;
+       AddInk(ink2, x, y);
+      }
+
+      XSetForeground(view->x->dpy, view->x->gc,
+                    view->pixels[ink->color]);
+      XDrawLines(view->x->dpy, pm, view->x->gc,
+                ink2->points, ink2->length, CoordModePrevious);
+    }
+  }
+
+  FreeInk(ink2);
+}
+
+
diff --git a/src/sim/w_net.c b/src/sim/w_net.c
new file mode 100644 (file)
index 0000000..3e8094a
--- /dev/null
@@ -0,0 +1,154 @@
+/* w_net.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+#ifdef NET
+
+
+#define NET_BUFFER_SIZE 1024
+
+
+int net_listen_port;
+int net_listen_socket;
+
+
+int
+udp_listen(int port)
+{
+  struct sockaddr_in addr;
+  int flags;
+
+  net_listen_port = port;
+
+  net_listen_socket = socket(AF_INET, SOCK_DGRAM, 0);
+  if (net_listen_socket < 0) {
+    perror("socket()");
+    return 0;
+  }
+
+  flags = 1;
+  if (setsockopt(net_listen_socket, SOL_SOCKET, SO_REUSEADDR,
+                (char *)&flags, sizeof(flags)) == -1) {
+    perror("setsockopt SO_REUSEADDR");
+    return 0;
+  }
+
+  addr.sin_family = AF_INET;
+  addr.sin_port = net_listen_port;
+  addr.sin_addr.s_addr = INADDR_ANY;
+
+  if (bind(net_listen_socket, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+    perror("bind()");
+    return 0;
+  }
+
+  if ((flags = fcntl(net_listen_socket, F_GETFL)) < 0) {
+    perror("fcntl F_GETFL");
+    return 0;
+  }
+  
+  if (fcntl(net_listen_socket, F_SETFL, flags|O_NDELAY) < 0) {
+    perror("fcntl F_SETFL");
+    return 0;
+  }
+
+  Tcp_MakeOpenFile(tk_mainInterp, net_listen_socket, 1, 1);
+
+  return (net_listen_socket);
+}
+
+
+udp_hear(int sock)
+{
+  struct sockaddr_in addr;
+  int addr_len;
+  int len, i;
+  unsigned char buf[NET_BUFFER_SIZE];
+  char cmd[NET_BUFFER_SIZE * 4 + 256];
+  char *cp;
+
+  while (1) {
+    len = recvfrom(sock, buf, NET_BUFFER_SIZE, 0,
+                  (struct sockaddr *)&addr, &addr_len);
+
+    if (len < 0) {
+      if (errno == EINTR) continue;
+      if (errno == EWOULDBLOCK) break;
+      perror("recvfrom");
+      return;
+    }
+
+    sprintf(cmd, "HandlePacket %d {%s} {", sock, inet_ntoa(addr.sin_addr));
+
+    cp = cmd + strlen(cmd);
+    for (i = 0; i < len; i++) {
+      sprintf(cp, "%3d ", buf[i]);
+      cp += 4;
+    }
+    sprintf(cp, "}");
+    Eval(cmd);
+  }
+}
+
+
+#endif
diff --git a/src/sim/w_piem.c b/src/sim/w_piem.c
new file mode 100644 (file)
index 0000000..60b7ea9
--- /dev/null
@@ -0,0 +1,2359 @@
+/* w_piem.c:  Pie Menus
+ */
+
+/*
+ *
+ * Pie Menus for Tk.
+ * Copyright (C) 1992 by Don Hopkins.
+ *
+ * This program is provided for unrestricted use, provided that this 
+ * copyright message is preserved. There is no warranty, and no author 
+ * or distributer accepts responsibility for any damage caused by this 
+ * program. 
+ * 
+ * This code and the ideas behind it were developed over time by Don Hopkins 
+ * with the support of the University of Maryland, UniPress Software, Sun
+ * Microsystems, DUX Software, the Turing Institute, and Carnegie Mellon
+ * University.  Pie menus are NOT patented or restricted, and the interface 
+ * and algorithms may be freely copied and improved upon. 
+ *
+ */
+
+
+#if 0
+/* workaround to make gcc work on suns */
+#ifndef SOLARIS2
+#define _PTRDIFF_T
+#define _SIZE_T
+#ifndef sgi
+typedef unsigned int size_t;
+#endif
+#endif
+#endif
+
+#include "tkconfig.h"
+#include "default.h"
+#include "tkint.h"
+#include <X11/extensions/shape.h>
+
+#define PI 3.1415926535897932
+#define TWO_PI 6.2831853071795865
+#define DEG_TO_RAD(d) (((d) * TWO_PI) / 360.0)
+#define RAD_TO_DEG(d) (((d) * 360.0) / TWO_PI)
+#define PIE_SPOKE_INSET 6
+#define PIE_BG_COLOR "#bfbfbf"
+#define PIE_BG_MONO WHITE
+#define PIE_ACTIVE_FG_COLOR BLACK
+#define PIE_ACTIVE_FG_MONO BLACK
+#define PIE_ACTIVE_BG_COLOR "#bfbfbf"
+#define PIE_ACTIVE_BG_MONO WHITE
+#define PIE_FG BLACK
+#define PIE_FONT "-Adobe-Helvetica-Bold-R-Normal-*-120-*"
+#define PIE_ACTIVE_BORDER_WIDTH "2"
+#define PIE_INACTIVE_RADIUS "8"
+#define PIE_INACTIVE_RADIUS_NUM 8
+#define PIE_MIN_RADIUS "16"
+#define PIE_MIN_RADIUS_NUM 16
+#define PIE_EXTRA_RADIUS "2"
+#define PIE_EXTRA_RADIUS_NUM 2
+#define PIE_BORDER_WIDTH "2"
+#define PIE_POPUP_DELAY "250"
+#define PIE_POPUP_DELAY_NUM 250
+#define PIE_ENTRY_ACTIVE_BG ((char *) NULL)
+#define PIE_ENTRY_BG ((char *) NULL)
+#define PIE_ENTRY_FONT ((char *) NULL)
+
+#ifndef MAX
+#define MAX(x,y) ((x)>(y)?(x):(y))
+#define MIN(x,y) ((x)<(y)?(x):(y))
+#endif
+#define ABS(x)  (((x)<0)?(-(x)):(x))
+
+static int HaveShape = -1;
+
+/*
+ * One of the following data structures is kept for each entry of each
+ * pie menu managed by this file:
+ */
+
+typedef struct PieMenuEntry {
+    int type;
+    struct PieMenu *piemenuPtr;
+    char *label;
+    int labelLength;
+    Pixmap bitmap;
+
+    /*
+     * Information related to displaying entry:
+     */
+
+    int width, height;
+    int x, y;
+    int x_offset, y_offset;
+    int label_x, label_y;
+
+    Tk_3DBorder border;
+    Tk_3DBorder activeBorder;
+    XFontStruct *fontPtr;
+    GC textGC;
+    GC activeGC;
+
+    /*
+     * Information used for pie menu layout & tracking:
+     */
+
+    int slice;                 /* Desired relative slice size */
+    float angle;               /* Angle through center of slice */
+    float dx, dy;              /* Cosine and sine of angle */
+    float subtend;             /* Angle subtended by slice */
+    int quadrant;              /* Quadrant of leading edge */
+    float slope;               /* Slope of leading edge */
+
+    /*
+     * Information used to implement this entry's action:
+     */
+
+    char *command;
+    char *preview;
+    char *name;
+
+    /*
+     * Miscellaneous information:
+     */
+
+    int flags;                 /* Various flags. See below for definitions. */
+} PieMenuEntry;
+
+/*
+ * Flag values defined for menu entries:
+ *
+ * ENTRY_NEEDS_REDISPLAY:      Non-zero means the entry should be redisplayed.
+ */
+
+#define ENTRY_NEEDS_REDISPLAY  1
+
+/*
+ * Types defined for PieMenuEntries:
+ */
+
+#define COMMAND_ENTRY          0
+#define PIEMENU_ENTRY          1
+
+/*
+ * Mask bits for above types:
+ */
+
+#define COMMAND_MASK           TK_CONFIG_USER_BIT
+#define PIEMENU_MASK           (TK_CONFIG_USER_BIT << 1)
+#define ALL_MASK               (COMMAND_MASK | PIEMENU_MASK)
+
+/*
+ * Configuration specs for individual menu entries:
+ */
+
+static Tk_ConfigSpec entryConfigSpecs[] = {
+    {TK_CONFIG_BORDER, "-activebackground", (char *) NULL, (char *) NULL,
+       PIE_ENTRY_ACTIVE_BG, Tk_Offset(PieMenuEntry, activeBorder),
+       ALL_MASK|TK_CONFIG_NULL_OK},
+    {TK_CONFIG_BORDER, "-background", (char *) NULL, (char *) NULL,
+       PIE_ENTRY_BG, Tk_Offset(PieMenuEntry, border),
+       ALL_MASK|TK_CONFIG_NULL_OK},
+    {TK_CONFIG_PIXMAP, "-bitmap", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(PieMenuEntry, bitmap),
+       ALL_MASK|TK_CONFIG_NULL_OK},
+    {TK_CONFIG_STRING, "-command", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(PieMenuEntry, command),
+       COMMAND_MASK},
+    {TK_CONFIG_STRING, "-preview", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(PieMenuEntry, preview),
+       ALL_MASK},
+    {TK_CONFIG_FONT, "-font", (char *) NULL, (char *) NULL,
+       PIE_ENTRY_FONT, Tk_Offset(PieMenuEntry, fontPtr),
+       ALL_MASK|TK_CONFIG_NULL_OK},
+    {TK_CONFIG_STRING, "-label", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(PieMenuEntry, label),
+       ALL_MASK},
+    {TK_CONFIG_STRING, "-piemenu", (char *) NULL, (char *) NULL,
+        (char *) NULL, Tk_Offset(PieMenuEntry, name),
+        ALL_MASK},
+    {TK_CONFIG_INT, "-xoffset", "xOffset", "XOffset",
+       "0", Tk_Offset(PieMenuEntry, x_offset),
+        ALL_MASK},
+    {TK_CONFIG_INT, "-yoffset", "yOffset", "YOffset",
+       "0", Tk_Offset(PieMenuEntry, y_offset),
+        ALL_MASK},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * A data structure of the following type is kept for each
+ * pie menu managed by this file:
+ */
+
+typedef struct PieMenu {
+    Tk_Window tkwin;
+    Tcl_Interp *interp;
+    char *title;
+    int titleLength;
+    char *preview;
+    PieMenuEntry **entries;
+    int numEntries;
+    int active;
+    Tk_Uid group;
+    int root_x, root_y;
+    int dx, dy;
+
+    /*
+     * Information used when displaying widget:
+     */
+
+    Tk_3DBorder border;
+    int borderWidth;
+    Tk_3DBorder activeBorder;
+    int activeBorderWidth;
+    XFontStruct *fontPtr;
+    XFontStruct *titlefontPtr;
+    XColor *fg;
+    GC textGC;
+    XColor *activeFg;
+    GC activeGC;
+
+    /*
+     * Information used to layout pie menu:
+     */
+
+    int width, height;                 /* size of the pie menu */
+    int title_x, title_y;              /* position of menu title */
+    int title_width, title_height;     /* size of menu title */
+    int initial_angle;                 /* pie menu initial angle in radians */
+    int inactive_radius;               /* inactive inner radius */
+    int min_radius;                    /* minimum label radius */
+    int fixed_radius;                  /* fixed label radius */
+    int extra_radius;                  /* extra label radius pad */
+    int label_radius;                  /* Radius of labels from menu center */
+    int center_x, center_y;            /* Menu center */
+    XSegment *segments;                        /* Line segments to draw */
+
+    /*
+     * Miscellaneous information:
+     */
+
+    Tk_TimerToken popup_timer_token;
+    Cursor cursor;
+    PieMenuEntry *postedPie;
+    int flags;
+    int phase;
+    int popup_delay;                   /* Delay before popup */
+    int shaped;                                /* Use SHAPE extension */
+} PieMenu;
+
+/*
+ * Flag bits for menus:
+ *
+ * REDRAW_PENDING:             Non-zero means a DoWhenIdle handler
+ *                             has already been queued to redraw
+ *                             this window.
+ * UPDATE_PENDING:             Non-zero means a DoWhenIdle handler
+ *                             has already been queued to update
+ *                             this window.
+ * RESIZE_PENDING:             Non-zero means a call to ComputeMenuGeometry
+ *                             has already been scheduled.
+ * POPUP_PENDING:              Non-zero means a call to PopupPieMenu has
+ *                             already been scheduled.
+ */
+
+#define REDRAW_PENDING         1
+#define UPDATE_PENDING         2
+#define RESIZE_PENDING         4
+#define POPUP_PENDING          8
+
+/*
+ * Configuration specs valid for the menu as a whole:
+ */
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground",
+       PIE_ACTIVE_BG_COLOR, Tk_Offset(PieMenu, activeBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground",
+       PIE_ACTIVE_BG_MONO, Tk_Offset(PieMenu, activeBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_PIXELS, "-activeborderwidth", "activeBorderWidth", "BorderWidth",
+       PIE_ACTIVE_BORDER_WIDTH, Tk_Offset(PieMenu, activeBorderWidth), 0},
+    {TK_CONFIG_COLOR, "-activeforeground", "activeForeground", "Background",
+       PIE_ACTIVE_FG_COLOR, Tk_Offset(PieMenu, activeFg),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_COLOR, "-activeforeground", "activeForeground", "Background",
+       PIE_ACTIVE_FG_MONO, Tk_Offset(PieMenu, activeFg),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       PIE_BG_COLOR, Tk_Offset(PieMenu, border), TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       PIE_BG_MONO, Tk_Offset(PieMenu, border), TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       PIE_BORDER_WIDTH, Tk_Offset(PieMenu, borderWidth), 0},
+    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",
+       "circle", Tk_Offset(PieMenu, cursor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",
+        PIE_FG, Tk_Offset(PieMenu, fg), 0},
+    {TK_CONFIG_FONT, "-font", "font", "Font",
+       PIE_FONT, Tk_Offset(PieMenu, fontPtr), 0},
+    {TK_CONFIG_STRING, "-title", (char *) NULL, (char *) NULL,
+       "", Tk_Offset(PieMenu, title), 0},
+    {TK_CONFIG_STRING, "-preview", (char *) NULL, (char *) NULL,
+       "", Tk_Offset(PieMenu, preview), 0},
+    {TK_CONFIG_FONT, "-titlefont", "font", "Font",
+       PIE_FONT, Tk_Offset(PieMenu, titlefontPtr), 0},
+    {TK_CONFIG_INT, "-initialangle", "initialAngle", "InitialAngle",
+       "0", Tk_Offset(PieMenu, initial_angle), 0},
+    {TK_CONFIG_INT, "-inactiveradius", "inactiveRadius", "InactiveRadius",
+       PIE_INACTIVE_RADIUS, Tk_Offset(PieMenu, inactive_radius), 0},
+    {TK_CONFIG_INT, "-minradius", "minRadius", "MinRadius",
+        PIE_MIN_RADIUS, Tk_Offset(PieMenu, min_radius), 0},
+    {TK_CONFIG_INT, "-extraradius", "extraRadius", "ExtraRadius",
+        PIE_EXTRA_RADIUS, Tk_Offset(PieMenu, extra_radius), 0},
+    {TK_CONFIG_INT, "-fixedradius", "fixedRadius", "FixedRadius",
+       "0", Tk_Offset(PieMenu, fixed_radius), 0},
+    {TK_CONFIG_INT, "-active", "active", "Active",
+       "-1", Tk_Offset(PieMenu, active), 0},
+    {TK_CONFIG_INT, "-popupdelay", "popupDelay", "PopupDelay",
+       PIE_POPUP_DELAY, Tk_Offset(PieMenu, popup_delay), 0},
+    {TK_CONFIG_INT, "-shaped", "shaped", "Shaped",
+       "1", Tk_Offset(PieMenu, shaped), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+int            Tk_PieMenuCmd(ClientData clientData, Tcl_Interp *interp,
+                             int argc, char **argv);
+static int     ActivatePieMenuEntry _ANSI_ARGS_((PieMenu *menuPtr,
+                   int index, int preview));
+static void    ComputePieMenuGeometry _ANSI_ARGS_((
+                   ClientData clientData));
+static int     ConfigurePieMenu _ANSI_ARGS_((Tcl_Interp *interp,
+                   PieMenu *menuPtr, int argc, char **argv,
+                   int flags));
+static int     ConfigurePieMenuEntry _ANSI_ARGS_((Tcl_Interp *interp,
+                   PieMenu *menuPtr, PieMenuEntry *mePtr, int index,
+                   int argc, char **argv, int flags));
+static void    DestroyPieMenu _ANSI_ARGS_((ClientData clientData));
+static void    DestroyPieMenuEntry _ANSI_ARGS_((ClientData clientData));
+static void    DisplayPieMenu _ANSI_ARGS_((ClientData clientData));
+static void    UpdatePieMenu _ANSI_ARGS_((ClientData clientData));
+static void    PopupPieMenu _ANSI_ARGS_((ClientData clientData));
+static void    EventuallyRedrawPieMenu _ANSI_ARGS_((PieMenu *menuPtr,
+                   int index));
+static int     GetPieMenuIndex _ANSI_ARGS_((Tcl_Interp *interp,
+                   PieMenu *menuPtr, char *string, int *indexPtr));
+static void    PieMenuEventProc _ANSI_ARGS_((ClientData clientData,
+                   XEvent *eventPtr));
+static int     PieMenuWidgetCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+static int     UnpostSubPieMenu _ANSI_ARGS_((Tcl_Interp *interp,
+                   PieMenu *menuPtr));
+static void    PopupPieMenu _ANSI_ARGS_((ClientData clientData));
+static void    NowPopupPieMenu _ANSI_ARGS_((PieMenu *menuPtr));
+static void    NeverPopupPieMenu _ANSI_ARGS_((PieMenu *menuPtr));
+static void    EventuallyPopupPieMenu _ANSI_ARGS_((PieMenu *menuPtr));
+static void    DeferPopupPieMenu _ANSI_ARGS_((PieMenu *menuPtr));
+static void    ShapePieMenu _ANSI_ARGS_((PieMenu *menuPtr));
+
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_PieMenuCmd --
+ *
+ *     This procedure is invoked to process the "piemenu" Tcl
+ *     command.  Read the code and write some user documentation for
+ *     details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation for "menu", which this was based on.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_PieMenuCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    Tk_Window new;
+    register PieMenu *menuPtr;
+    XSetWindowAttributes atts;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " pathName ?options?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Create the new window.  Set override-redirect so the window
+     * manager won't add a border or argue about placement, and set
+     * save-under so that the window can pop up and down without a
+     * lot of re-drawing.
+     */
+
+    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], "");
+    if (new == NULL) {
+       return TCL_ERROR;
+    }
+    atts.override_redirect = True;
+    atts.save_under = True;
+    Tk_ChangeWindowAttributes(new, CWOverrideRedirect|CWSaveUnder, &atts);
+
+    /*
+     * Initialize the data structure for the menu.
+     */
+
+    menuPtr = (PieMenu *) ckalloc(sizeof(PieMenu));
+    menuPtr->tkwin = new;
+    menuPtr->interp = interp;
+    menuPtr->title = NULL;
+    menuPtr->titleLength = 0;
+    menuPtr->preview = NULL;
+    menuPtr->entries = NULL;
+    menuPtr->numEntries = 0;
+    menuPtr->active = -1;
+    menuPtr->group = NULL; 
+    menuPtr->root_x = 0;
+    menuPtr->root_y = 0; 
+    menuPtr->border = NULL;
+    menuPtr->activeBorder = NULL;
+    menuPtr->fontPtr = NULL;
+    menuPtr->titlefontPtr = NULL;
+    menuPtr->fg = NULL;
+    menuPtr->textGC = None;
+    menuPtr->activeFg = NULL;
+    menuPtr->activeGC = None;
+    menuPtr->width = 0;
+    menuPtr->height = 0;
+    menuPtr->title_x = 0;
+    menuPtr->title_y = 0;
+    menuPtr->title_width = 0;
+    menuPtr->title_height = 0;
+    menuPtr->initial_angle = 0;
+    menuPtr->inactive_radius = PIE_INACTIVE_RADIUS_NUM;
+    menuPtr->min_radius = PIE_MIN_RADIUS_NUM;
+    menuPtr->extra_radius = PIE_EXTRA_RADIUS_NUM;
+    menuPtr->fixed_radius = 0;
+    menuPtr->label_radius = 0;
+    menuPtr->center_x = 0;
+    menuPtr->center_y = 0;
+    menuPtr->segments = NULL;
+    menuPtr->cursor = None;
+    menuPtr->postedPie = NULL;
+    menuPtr->flags = 0;
+    menuPtr->phase = 0;
+    menuPtr->shaped = 1;
+    menuPtr->popup_delay = PIE_POPUP_DELAY_NUM;
+
+    Tk_SetClass(new, "PieMenu");
+    Tk_CreateEventHandler(menuPtr->tkwin,
+                         ExposureMask | StructureNotifyMask |
+                         ButtonPressMask | ButtonReleaseMask |
+                         PointerMotionMask,
+                         PieMenuEventProc, (ClientData) menuPtr);
+    Tcl_CreateCommand(interp, Tk_PathName(menuPtr->tkwin), PieMenuWidgetCmd,
+           (ClientData) menuPtr, (void (*)()) NULL);
+    if (ConfigurePieMenu(interp, menuPtr, argc-2, argv+2, 0) != TCL_OK) {
+       goto error;
+    }
+
+    interp->result = Tk_PathName(menuPtr->tkwin);
+    return TCL_OK;
+
+    error:
+    Tk_DestroyWindow(menuPtr->tkwin);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * PieMenuWidgetCmd --
+ *
+ *     This procedure is invoked to process the Tcl command
+ *     that corresponds to a widget managed by this module.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+PieMenuWidgetCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Information about menu widget. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    register PieMenu *menuPtr = (PieMenu *) clientData;
+    register PieMenuEntry *mePtr;
+    int result = TCL_OK;
+    int length, type;
+    char c;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    Tk_Preserve((ClientData) menuPtr);
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'a') && (strncmp(argv[1], "activate", length) == 0)
+           && (length >= 2)) {
+       int index;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " activate index\"", (char *) NULL);
+           goto error;
+       }
+       if (GetPieMenuIndex(interp, menuPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if (menuPtr->active == index) {
+           goto done;
+       }
+       result = ActivatePieMenuEntry(menuPtr, index, 1);
+       DeferPopupPieMenu(menuPtr);
+    } else if ((c == 's') && (strncmp(argv[1], "show", length) == 0)
+           && (length >= 2)) {
+       int index;
+
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " show\"", (char *) NULL);
+           goto error;
+       }
+       NowPopupPieMenu(menuPtr);
+    } else if ((c == 'p') && (strncmp(argv[1], "pending", length) == 0)
+           && (length >= 2)) {
+       int index;
+
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " pending\"", (char *) NULL);
+           goto error;
+       }
+       sprintf(interp->result, "%d",
+               (menuPtr->flags & POPUP_PENDING) ? 1 : 0);
+    } else if ((c == 'd') && (strncmp(argv[1], "defer", length) == 0)
+           && (length >= 2)) {
+       int index;
+
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " defer\"", (char *) NULL);
+           goto error;
+       }
+       DeferPopupPieMenu(menuPtr);
+    } else if ((c == 'a') && (strncmp(argv[1], "add", length) == 0)
+           && (length >= 2)) {
+       PieMenuEntry **newEntries;
+
+       if (argc < 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " add type ?options?\"", (char *) NULL);
+           goto error;
+       }
+
+       /*
+        * Figure out the type of the new entry.
+        */
+
+       c = argv[2][0];
+       length = strlen(argv[2]);
+       if ((c == 'c') && (strncmp(argv[2], "command", length) == 0)) {
+           type = COMMAND_ENTRY;
+       } else if ((c == 'p') && (strncmp(argv[2], "piemenu", length) == 0)) {
+           type = PIEMENU_ENTRY;
+       } else {
+           Tcl_AppendResult(interp, "bad menu entry type \"",
+                            argv[2], "\":  must be command or piemenu",
+                            (char *) NULL);
+           goto error;
+       }
+
+       /*
+        * Add a new entry to the end of the menu's array of entries,
+        * and process options for it.
+        */
+
+       mePtr = (PieMenuEntry *) ckalloc(sizeof(PieMenuEntry));
+       newEntries = (PieMenuEntry **) ckalloc((unsigned)
+               ((menuPtr->numEntries+1)*sizeof(PieMenuEntry *)));
+       if (menuPtr->numEntries != 0) {
+           memcpy((VOID *) newEntries, (VOID *) menuPtr->entries,
+                   menuPtr->numEntries*sizeof(PieMenuEntry *));
+           ckfree((char *) menuPtr->entries);
+       }
+       menuPtr->entries = newEntries;
+       menuPtr->entries[menuPtr->numEntries] = mePtr;
+       menuPtr->numEntries++;
+       mePtr->type = type;
+       mePtr->piemenuPtr = menuPtr;
+       mePtr->label = NULL;
+       mePtr->labelLength = 0;
+       mePtr->bitmap = None;
+       mePtr->width = 0;
+       mePtr->height = 0;
+       mePtr->x_offset = 0;
+       mePtr->y_offset = 0;
+       mePtr->label_x = 0;
+       mePtr->label_y = 0;
+       mePtr->border = NULL;
+       mePtr->activeBorder = NULL;
+       mePtr->fontPtr = NULL;
+       mePtr->textGC = None;
+       mePtr->activeGC = None;
+       mePtr->slice = 1.0;
+       mePtr->angle = 0.0;
+       mePtr->dx = 0.0;
+       mePtr->dy = 0.0;
+       mePtr->subtend = 0.0;
+       mePtr->quadrant = 0;
+       mePtr->slope = 0.0;
+       mePtr->command = NULL;
+       mePtr->preview = NULL;
+       mePtr->name = NULL;
+       mePtr->flags = 0;
+       if (ConfigurePieMenuEntry(interp, menuPtr, mePtr,
+                                 menuPtr->numEntries-1,
+                                 argc-3, argv+3, 0) != TCL_OK) {
+           DestroyPieMenuEntry((ClientData) mePtr);
+           menuPtr->numEntries--;
+           goto error;
+       }
+       if (!(menuPtr->flags & RESIZE_PENDING)) {
+           menuPtr->flags |= RESIZE_PENDING;
+           Tk_DoWhenIdle(ComputePieMenuGeometry, (ClientData) menuPtr);
+       }
+    } else if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)) {
+       if (argc == 2) {
+           result = Tk_ConfigureInfo(interp, menuPtr->tkwin, configSpecs,
+                   (char *) menuPtr, (char *) NULL, 0);
+       } else if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, menuPtr->tkwin, configSpecs,
+                   (char *) menuPtr, argv[2], 0);
+       } else {
+           result = ConfigurePieMenu(interp, menuPtr, argc-2, argv+2,
+                   TK_CONFIG_ARGV_ONLY);
+       }
+    } else if ((c == 'd') && (strncmp(argv[1], "delete", length) == 0)
+           && (length >= 2)) {
+       int index, i;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " delete index\"", (char *) NULL);
+           goto error;
+       }
+       if (GetPieMenuIndex(interp, menuPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if (index < 0) {
+           goto done;
+       }
+       Tk_EventuallyFree((ClientData) menuPtr->entries[index],
+                         DestroyPieMenuEntry);
+       for (i = index; i < menuPtr->numEntries-1; i++) {
+           menuPtr->entries[i] = menuPtr->entries[i+1];
+       }
+       menuPtr->numEntries -= 1;
+       if (menuPtr->active == index) {
+           menuPtr->active = -1;
+       } else if (menuPtr->active > index) {
+           menuPtr->active -= 1;
+       }
+       if (!(menuPtr->flags & RESIZE_PENDING)) {
+           menuPtr->flags |= RESIZE_PENDING;
+           Tk_DoWhenIdle(ComputePieMenuGeometry, (ClientData) menuPtr);
+       }
+    } else if ((c == 'e') && (length >= 3)
+           && (strncmp(argv[1], "entryconfigure", length) == 0)) {
+       int index;
+
+       if (argc < 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " entryconfigure index ?option value ...?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       if (GetPieMenuIndex(interp, menuPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if (index < 0) {
+           goto done;
+       }
+       mePtr = menuPtr->entries[index];
+       Tk_Preserve((ClientData) mePtr);
+       if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, menuPtr->tkwin, entryConfigSpecs,
+                   (char *) mePtr, (char *) NULL,
+                   COMMAND_MASK << mePtr->type);
+       } else if (argc == 4) {
+           result = Tk_ConfigureInfo(interp, menuPtr->tkwin, entryConfigSpecs,
+                   (char *) mePtr, argv[3], COMMAND_MASK << mePtr->type);
+       } else {
+           result = ConfigurePieMenuEntry(interp, menuPtr, mePtr, index,
+                                          argc-3, argv+3,
+                                          TK_CONFIG_ARGV_ONLY |
+                                            COMMAND_MASK << mePtr->type);
+       }
+       Tk_Release((ClientData) mePtr);
+    } else if ((c == 'i') && (strncmp(argv[1], "index", length) == 0)
+           && (length >= 3)) {
+       int index;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " index string\"", (char *) NULL);
+           goto error;
+       }
+       if (GetPieMenuIndex(interp, menuPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if (index < 0) {
+           interp->result = "none";
+       } else {
+           sprintf(interp->result, "%d", index);
+       }
+    } else if ((c == 'i') && (strncmp(argv[1], "invoke", length) == 0)
+           && (length >= 3)) {
+       int index;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " invoke index\"", (char *) NULL);
+           goto error;
+       }
+       if (GetPieMenuIndex(interp, menuPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if (index < 0) {
+           goto done;
+       }
+       mePtr = menuPtr->entries[index];
+       Tk_Preserve((ClientData) mePtr);
+       if (mePtr->command != NULL) {
+           result = Tcl_GlobalEval(interp, mePtr->command);
+       }
+       Tk_Release((ClientData) mePtr);
+    } else if ((c == 'p') && (strncmp(argv[1], "post", length) == 0)) {
+       int x, y, ix, iy, tmp, err;
+       Tk_Uid group;
+
+       if ((argc != 4) && (argc != 5)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " post x y ?group?\"", (char *) NULL);
+           goto error;
+       }
+       if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK)
+               || (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {
+           goto error;
+       }
+       if (argc == 5) {
+           group = Tk_GetUid(argv[4]);
+       } else {
+           group = Tk_GetUid("default");
+       }
+
+       /*
+        * Adjust the position of the menu if necessary to keep it
+        * on-screen.
+        */
+
+       x -= menuPtr->center_x; y -= menuPtr->center_y;
+#if 0
+       ix = x; iy = y;
+
+       tmp = WidthOfScreen(Tk_Screen(menuPtr->tkwin))
+               - Tk_Width(menuPtr->tkwin);
+       if (x > tmp) {
+           x = tmp;
+       }
+       if (x < 0) {
+           x = 0;
+       }
+       tmp = HeightOfScreen(Tk_Screen(menuPtr->tkwin))
+               - Tk_Height(menuPtr->tkwin);
+       if (y > tmp) {
+           y = tmp;
+       }
+       if (y < 0) {
+           y = 0;
+       }
+
+       /* XXX: warp pointer by (x-ix, y-iy) upon popup */
+#endif
+
+       Tk_MakeWindowExist(menuPtr->tkwin);
+       XRaiseWindow(Tk_Display(menuPtr->tkwin), Tk_WindowId(menuPtr->tkwin));
+
+       Tk_MoveWindow(menuPtr->tkwin, x, y);
+       menuPtr->root_x = x + menuPtr->center_x;
+       menuPtr->root_y = y + menuPtr->center_y;
+       
+       if (Tk_IsMapped(menuPtr->tkwin)) {
+           if (group != menuPtr->group) {
+               Tk_UnshareEvents(menuPtr->tkwin, menuPtr->group);
+               Tk_ShareEvents(menuPtr->tkwin, group);
+           }
+       } else {
+           Tk_ShareEvents(menuPtr->tkwin, group);
+           EventuallyPopupPieMenu(menuPtr);
+           result = ActivatePieMenuEntry(menuPtr, -1, 1);
+       }
+       menuPtr->group = group;
+    } else if ((c == 'u') && (strncmp(argv[1], "unpost", length) == 0)) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " unpost\"", (char *) NULL);
+           goto error;
+       }
+       NeverPopupPieMenu(menuPtr);
+       Tk_UnshareEvents(menuPtr->tkwin, menuPtr->group);
+       Tk_UnmapWindow(menuPtr->tkwin);
+       result = ActivatePieMenuEntry(menuPtr, -1, 0);
+       if (result == TCL_OK) {
+           result = UnpostSubPieMenu(interp, menuPtr);
+       }
+    } else if ((c == 'g') && (strncmp(argv[1], "grab", length) == 0)) {
+      Tk_Window tkwin;
+      int err;
+
+      if ((argc != 3) ||
+         ((tkwin = Tk_NameToWindow(interp, argv[2],
+                                   menuPtr->tkwin)) == NULL)) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+                        argv[0], " grab window\"", (char *) NULL);
+       goto error;
+      }
+      
+      err =
+       XGrabPointer(Tk_Display(tkwin),
+                    Tk_WindowId(tkwin),
+                    False,
+                    ButtonPressMask | ButtonReleaseMask |
+                    ButtonMotionMask | PointerMotionMask,
+                    GrabModeAsync, GrabModeAsync, None, None,
+                    TkCurrentTime(((TkWindow *)tkwin)->dispPtr));
+      if (err != 0) {
+       if (err == GrabNotViewable) {
+         interp->result = "grab failed: window not viewable";
+       } else if (err == AlreadyGrabbed) {
+         interp->result = "grab failed: another application has grab";
+       } else if (err == GrabFrozen) {
+         interp->result = "grab failed: keyboard or pointer frozen";
+       } else if (err == GrabInvalidTime) {
+         interp->result = "grab failed: invalid time";
+       } else {
+         char msg[100];
+         
+         sprintf(msg, "grab failed for unknown reason (code %d)",
+                 err);
+         Tcl_AppendResult(interp, msg, (char *) NULL);
+       }
+       return TCL_ERROR;
+      }
+    } else if ((c == 'u') && (strncmp(argv[1], "ungrab", length) == 0)) {
+      Tk_Window tkwin;
+
+      if ((argc != 3) ||
+         ((tkwin = Tk_NameToWindow(interp, argv[2],
+                                   menuPtr->tkwin)) == NULL)) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+                        argv[0], " ungrab window\"", (char *) NULL);
+       goto error;
+      }
+
+      XUngrabPointer(Tk_Display(tkwin),
+                    TkCurrentTime(((TkWindow *)tkwin)->dispPtr));
+
+    } else if ((c == 'd') && (strncmp(argv[1], "distance", length) == 0)
+           && (length >= 3)) {
+       int distance;
+
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " distance\"", (char *) NULL);
+           goto error;
+       }
+       distance = (int)(sqrt((menuPtr->dx * menuPtr->dx) + (menuPtr->dy * menuPtr->dy)) + 0.499);
+       sprintf(interp->result, "%d", distance);
+    } else if ((c == 'd') && (strncmp(argv[1], "direction", length) == 0)
+           && (length >= 3)) {
+       int direction;
+
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " direction\"", (char *) NULL);
+           goto error;
+       }
+       direction = (int)(RAD_TO_DEG(atan2(menuPtr->dy, menuPtr->dx)) + 0.499);
+       if (direction < 0) direction += 360;
+       sprintf(interp->result, "%d", direction);
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\": must be activate, show, add, configure, delete, ",
+               "entryconfigure, index, invoke, post, unpost, pending, ",
+               "defer, grab, or ungrab", (char *) NULL);
+       goto error;
+    }
+    done:
+    Tk_Release((ClientData) menuPtr);
+    return result;
+
+    error:
+    Tk_Release((ClientData) menuPtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyPieMenu --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a pie menu at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the pie menu is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyPieMenu(clientData)
+    ClientData clientData;     /* Info about menu widget. */
+{
+    register PieMenu *menuPtr = (PieMenu *) clientData;
+    int i;
+
+    /* Should we delete the event handler? */
+
+    for (i = 0; i < menuPtr->numEntries; i++) {
+       DestroyPieMenuEntry((ClientData) menuPtr->entries[i]);
+    }
+    if (menuPtr->entries != NULL) {
+       ckfree((char *) menuPtr->entries);
+    }
+    if (menuPtr->border != NULL) {
+       Tk_Free3DBorder(menuPtr->border);
+    }
+    if (menuPtr->activeBorder != NULL) {
+       Tk_Free3DBorder(menuPtr->activeBorder);
+    }
+    if (menuPtr->fontPtr != NULL) {
+       Tk_FreeFontStruct(menuPtr->fontPtr);
+    }
+    if (menuPtr->fg != NULL) {
+       Tk_FreeColor(menuPtr->fg);
+    }
+    if (menuPtr->textGC != None) {
+       Tk_FreeGC(menuPtr->textGC);
+    }
+    if (menuPtr->activeFg != NULL) {
+       Tk_FreeColor(menuPtr->activeFg);
+    }
+    if (menuPtr->activeGC != None) {
+       Tk_FreeGC(menuPtr->activeGC);
+    }
+    if (menuPtr->cursor != None) {
+       Tk_FreeCursor(menuPtr->cursor);
+    }
+    ckfree((char *) menuPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyPieMenuEntry --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a pie menu entry at a safe 
+ *     time (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the pie menu entry is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyPieMenuEntry(clientData)
+    ClientData clientData;             /* Pointer to entry to be freed. */
+{
+    register PieMenuEntry *mePtr = (PieMenuEntry *) clientData;
+    PieMenu *menuPtr = mePtr->piemenuPtr;
+
+    if (menuPtr->postedPie == mePtr) {
+       if (UnpostSubPieMenu(menuPtr->interp, menuPtr)
+               != TCL_OK) {
+           TkBindError(menuPtr->interp);
+       }
+    }
+    if (mePtr->label != NULL) {
+       ckfree(mePtr->label);
+    }
+    if (mePtr->bitmap != None) {
+       Tk_FreePixmap(mePtr->bitmap);
+    }
+    if (mePtr->border != NULL) {
+       Tk_Free3DBorder(mePtr->border);
+    }
+    if (mePtr->activeBorder != NULL) {
+       Tk_Free3DBorder(mePtr->activeBorder);
+    }
+    if (mePtr->fontPtr != NULL) {
+       Tk_FreeFontStruct(mePtr->fontPtr);
+    }
+    if (mePtr->textGC != NULL) {
+       Tk_FreeGC(mePtr->textGC);
+    }
+    if (mePtr->activeGC != NULL) {
+       Tk_FreeGC(mePtr->activeGC);
+    }
+    if (mePtr->command != NULL) {
+       ckfree(mePtr->command);
+    }
+    if (mePtr->name != NULL) {
+       ckfree(mePtr->name);
+    }
+    ckfree((char *) mePtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigurePieMenu --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or
+ *     reconfigure) a menu widget.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information, such as colors, font, etc. get set
+ *     for menuPtr;  old resources get freed, if there were any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigurePieMenu(interp, menuPtr, argc, argv, flags)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    register PieMenu *menuPtr; /* Information about widget;  may or may
+                                * not already have values for some fields. */
+    int argc;                  /* Number of valid entries in argv. */
+    char **argv;               /* Arguments. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    XGCValues gcValues;
+    GC newGC;
+    int i;
+
+    if (Tk_ConfigureWidget(interp, menuPtr->tkwin, configSpecs,
+           argc, argv, (char *) menuPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few options need special processing, such as setting the
+     * background from a 3-D border, or filling in complicated
+     * defaults that couldn't be specified to Tk_ConfigureWidget.
+     */
+
+    if (menuPtr->title == NULL) {
+       menuPtr->titleLength = 0;
+    } else {
+       menuPtr->titleLength = strlen(menuPtr->title);
+    }
+
+    Tk_SetBackgroundFromBorder(menuPtr->tkwin, menuPtr->border);
+
+    gcValues.font = menuPtr->fontPtr->fid;
+    gcValues.foreground = menuPtr->fg->pixel;
+    gcValues.background = Tk_3DBorderColor(menuPtr->border)->pixel;
+    newGC = Tk_GetGC(menuPtr->tkwin, GCForeground|GCBackground|GCFont,
+           &gcValues);
+    if (menuPtr->textGC != None) {
+       Tk_FreeGC(menuPtr->textGC);
+    }
+    menuPtr->textGC = newGC;
+
+    gcValues.font = menuPtr->fontPtr->fid;
+    gcValues.foreground = menuPtr->activeFg->pixel;
+    gcValues.background = Tk_3DBorderColor(menuPtr->activeBorder)->pixel;
+    newGC = Tk_GetGC(menuPtr->tkwin, GCForeground|GCBackground|GCFont,
+           &gcValues);
+    if (menuPtr->activeGC != None) {
+       Tk_FreeGC(menuPtr->activeGC);
+    }
+    menuPtr->activeGC = newGC;
+
+    /*
+     * After reconfiguring a menu, we need to reconfigure all of the
+     * entries in the menu, since some of the things in the children
+     * (such as graphics contexts) may have to change to reflect changes
+     * in the parent.
+     */
+
+    for (i = 0; i < menuPtr->numEntries; i++) {
+       PieMenuEntry *mePtr;
+
+       mePtr = menuPtr->entries[i];
+       ConfigurePieMenuEntry(interp, menuPtr, mePtr, i, 0, (char **) NULL,
+               TK_CONFIG_ARGV_ONLY | COMMAND_MASK << mePtr->type);
+    }
+
+    if (!(menuPtr->flags & RESIZE_PENDING)) {
+       menuPtr->flags |= RESIZE_PENDING;
+       Tk_DoWhenIdle(ComputePieMenuGeometry, (ClientData) menuPtr);
+    }
+
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigurePieMenuEntry --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or
+ *     reconfigure) one entry in a menu.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information such as label and accelerator get
+ *     set for mePtr;  old resources get freed, if there were any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigurePieMenuEntry(interp, menuPtr, mePtr, index, argc, argv, flags)
+    Tcl_Interp *interp;                        /* Used for error reporting. */
+    PieMenu *menuPtr;                  /* Information about whole menu. */
+    register PieMenuEntry *mePtr;      /* Information about menu entry;  may
+                                        * or may not already have values for
+                                        * some fields. */
+    int index;                         /* Index of mePtr within menuPtr's
+                                        * entries. */
+    int argc;                          /* Number of valid entries in argv. */
+    char **argv;                       /* Arguments. */
+    int flags;                         /* Additional flags to pass to
+                                        * Tk_ConfigureWidget. */
+{
+    XGCValues gcValues;
+    GC newGC, newActiveGC;
+
+    /*
+     * If this entry is a piemenu and the piemenu is posted, then unpost
+     * it before reconfiguring the entry (otherwise the reconfigure might
+     * change the name of the piemenu entry, leaving a posted menu
+     * high and dry).
+     */
+
+    if (menuPtr->postedPie == mePtr) {
+       if (UnpostSubPieMenu(menuPtr->interp, menuPtr)
+               != TCL_OK) {
+           TkBindError(menuPtr->interp);
+       }
+    }
+
+    if (Tk_ConfigureWidget(interp, menuPtr->tkwin, entryConfigSpecs,
+           argc, argv, (char *) mePtr,
+           flags | (COMMAND_MASK << mePtr->type)) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * The code below handles special configuration stuff not taken
+     * care of by Tk_ConfigureWidget, such as special processing for
+     * defaults, sizing strings, graphics contexts, etc.
+     */
+
+    if (mePtr->label == NULL) {
+       mePtr->labelLength = 0;
+    } else {
+       mePtr->labelLength = strlen(mePtr->label);
+    }
+
+    if (index != menuPtr->active) {
+       ActivatePieMenuEntry(menuPtr, index, 0);
+    }
+
+    if ((mePtr->fontPtr != NULL) ||
+       (mePtr->type == PIEMENU_ENTRY)) {
+       gcValues.foreground = menuPtr->fg->pixel;
+       gcValues.background = Tk_3DBorderColor(
+               (mePtr->border != NULL) ? mePtr->border : menuPtr->border)
+               ->pixel;
+       if (mePtr->fontPtr != NULL) {
+         gcValues.font = mePtr->fontPtr->fid;
+       } else {
+         if (menuPtr->titlefontPtr != NULL)
+           gcValues.font = menuPtr->titlefontPtr->fid;
+         else
+           gcValues.font = menuPtr->fontPtr->fid;
+       }
+
+       /*
+        * Note: disable GraphicsExpose events;  we know there won't be
+        * obscured areas when copying from an off-screen pixmap to the
+        * screen and this gets rid of unnecessary events.
+        */
+
+       gcValues.graphics_exposures = False;
+       newGC = Tk_GetGC(menuPtr->tkwin,
+               GCForeground|GCBackground|GCFont|GCGraphicsExposures,
+               &gcValues);
+
+       gcValues.foreground = menuPtr->activeFg->pixel;
+       gcValues.background = Tk_3DBorderColor(
+               (mePtr->activeBorder != NULL) ? mePtr->activeBorder
+               : menuPtr->activeBorder)->pixel;
+       newActiveGC = Tk_GetGC(menuPtr->tkwin,
+               GCForeground|GCBackground|GCFont|GCGraphicsExposures,
+               &gcValues);
+    } else {
+       newGC = NULL;
+       newActiveGC = NULL;
+    }
+
+    if (mePtr->textGC != NULL) {
+           Tk_FreeGC(mePtr->textGC);
+    }
+    mePtr->textGC = newGC;
+
+    if (mePtr->activeGC != NULL) {
+           Tk_FreeGC(mePtr->activeGC);
+    }
+    mePtr->activeGC = newActiveGC;
+
+    if (!(menuPtr->flags & RESIZE_PENDING)) {
+       menuPtr->flags |= RESIZE_PENDING;
+       Tk_DoWhenIdle(ComputePieMenuGeometry, (ClientData) menuPtr);
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ComputePieMenuGeometry --
+ *
+ *     This procedure is invoked to recompute the size and
+ *     layout of a menu.  It is called as a when-idle handler so
+ *     that it only gets done once, even if a group of changes is
+ *     made to the menu.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Fields of menu entries are changed to reflect their
+ *     current positions, and the size of the menu window
+ *     itself may be changed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ComputePieMenuGeometry(clientData)
+    ClientData clientData;             /* Structure describing menu. */
+{
+    PieMenu *menuPtr = (PieMenu *) clientData;
+
+    if (menuPtr->tkwin == NULL) {
+       return;
+    }
+
+    LayoutPieMenu(menuPtr);
+
+    if ((menuPtr->width != Tk_ReqWidth(menuPtr->tkwin)) ||
+       (menuPtr->height != Tk_ReqHeight(menuPtr->tkwin))) {
+       Tk_GeometryRequest(menuPtr->tkwin, menuPtr->width, menuPtr->height);
+    } else {
+       /*
+        * Must always force a redisplay here if the window is mapped
+        * (even if the size didn't change, something else might have
+        * changed in the menu, such as a label or accelerator).  The
+        * resize will force a redisplay above.
+        */
+
+       EventuallyRedrawPieMenu(menuPtr, -1);
+    }
+
+    menuPtr->flags &= ~RESIZE_PENDING;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DisplayPieMenu --
+ *
+ *     This procedure is invoked to display a pie menu widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Commands are output to X to display the pie menu in its
+ *     current mode.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DisplayPieMenu(clientData)
+    ClientData clientData;     /* Information about widget. */
+{
+    register PieMenu *menuPtr = (PieMenu *) clientData;
+    register Tk_Window tkwin = menuPtr->tkwin;
+    XFontStruct *fontPtr;
+    int index;
+
+    menuPtr->flags &= ~REDRAW_PENDING;
+    if ((menuPtr->tkwin == NULL) || !Tk_IsMapped(menuPtr->tkwin)) {
+       return;
+    }
+
+    if (menuPtr->titlefontPtr != NULL) {
+       fontPtr = menuPtr->titlefontPtr;
+    } else {
+       fontPtr = menuPtr->fontPtr;
+    }
+
+    if (menuPtr->titleLength != 0) {
+      Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                        menuPtr->border,
+                        menuPtr->borderWidth, menuPtr->borderWidth,
+                        Tk_Width(tkwin) - 2*menuPtr->borderWidth,
+                        menuPtr->title_height + 2*menuPtr->borderWidth,
+                        menuPtr->borderWidth, TK_RELIEF_RAISED);
+
+      TkDisplayChars(Tk_Display(tkwin), Tk_WindowId(tkwin), menuPtr->textGC,
+                    fontPtr, menuPtr->title, menuPtr->titleLength,
+                    menuPtr->title_x, menuPtr->title_y,
+                    TK_NEWLINES_NOT_SPECIAL);
+    }
+
+    if (menuPtr->segments) { 
+      XSetLineAttributes(Tk_Display(tkwin), menuPtr->textGC,
+                        0, LineSolid, CapButt, JoinMiter);
+      XDrawSegments(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                   menuPtr->textGC, menuPtr->segments, menuPtr->numEntries);
+    }
+    
+    Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin), menuPtr->border,
+                      0, 0, Tk_Width(tkwin), Tk_Height(tkwin),
+                      menuPtr->borderWidth, TK_RELIEF_RAISED);
+
+    UpdatePieMenuEntries(menuPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * UpdatePieMenu --
+ *
+ *     This procedure is invoked to update a pie menu widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Commands are output to X to update the pie menu in its
+ *     current mode.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+UpdatePieMenu(clientData)
+    ClientData clientData;     /* Information about widget. */
+{
+    register PieMenu *menuPtr = (PieMenu *) clientData;
+
+    menuPtr->flags &= ~UPDATE_PENDING;
+    if ((menuPtr->tkwin == NULL) || !Tk_IsMapped(menuPtr->tkwin)) {
+       return;
+    }
+
+    UpdatePieMenuEntries(menuPtr);
+}
+
+
+UpdatePieMenuEntries(menuPtr)
+    PieMenu *menuPtr;
+{
+    register PieMenuEntry *mePtr;
+    register Tk_Window tkwin = menuPtr->tkwin;
+    XFontStruct *fontPtr;
+    int index;
+    GC gc;
+
+    for (index = 0; index < menuPtr->numEntries; index++) {
+       mePtr = menuPtr->entries[index];
+       if (!(mePtr->flags & ENTRY_NEEDS_REDISPLAY)) {
+           continue;
+       }
+       mePtr->flags &= ~ENTRY_NEEDS_REDISPLAY;
+
+       /*
+        * Background.
+        */
+
+       Tk_Fill3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                          ((mePtr->activeBorder != NULL)
+                             ? mePtr->activeBorder
+                             : menuPtr->activeBorder),
+                          mePtr->x, mePtr->y,
+                          mePtr->width, mePtr->height,
+                          menuPtr->activeBorderWidth,
+                          ((index == menuPtr->active)
+                             ? TK_RELIEF_SUNKEN
+                             : ((HaveShape && menuPtr->shaped)
+                                  ? TK_RELIEF_RAISED
+                                  : TK_RELIEF_FLAT)));
+
+       gc = mePtr->textGC;
+       if (gc == NULL) {
+           gc = menuPtr->textGC;
+       }
+
+       /*
+        * Draw label or bitmap for entry.
+        */
+
+       fontPtr = mePtr->fontPtr;
+       if (fontPtr == NULL) {
+           fontPtr = menuPtr->fontPtr;
+       }
+       if (mePtr->bitmap != None) {
+           unsigned int width, height;
+
+           Tk_SizeOfPixmap(mePtr->bitmap, &width, &height);
+            XCopyArea(Tk_Display(tkwin), mePtr->bitmap, Tk_WindowId(tkwin),
+                     gc, 0, 0, width, height,
+                     mePtr->label_x, mePtr->label_y);
+       } else {
+           if (mePtr->label != NULL) {
+               TkDisplayChars(Tk_Display(tkwin), Tk_WindowId(tkwin), gc,
+                              fontPtr, mePtr->label, mePtr->labelLength,
+                              mePtr->label_x, mePtr->label_y,
+                              TK_NEWLINES_NOT_SPECIAL);
+           }
+       }
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * GetPieMenuIndex --
+ *
+ *     Parse a textual index into a pie menu and return the numerical
+ *     index of the indicated entry.
+ *
+ * Results:
+ *     A standard Tcl result.  If all went well, then *indexPtr is
+ *     filled in with the entry index corresponding to string
+ *     (ranges from -1 to the number of entries in the pie menu minus
+ *     one).  Otherwise an error message is left in interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+GetPieMenuIndex(interp, menuPtr, string, indexPtr)
+    Tcl_Interp *interp;                /* For error messages. */
+    PieMenu *menuPtr;          /* Menu for which the index is being
+                                * specified. */
+    char *string;              /* Specification of an entry in menu.  See
+                                * manual entry for valid .*/
+    int *indexPtr;             /* Where to store converted relief. */
+{
+    int i, y;
+
+    if ((string[0] == 'a') && (strcmp(string, "active") == 0)) {
+       *indexPtr = menuPtr->active;
+       return TCL_OK;
+    }
+
+    if ((string[0] == 'l') && (strcmp(string, "last") == 0)) {
+       *indexPtr = menuPtr->numEntries-1;
+       return TCL_OK;
+    }
+
+    if ((string[0] == 'n') && (strcmp(string, "none") == 0)) {
+       *indexPtr = -1;
+       return TCL_OK;
+    }
+
+    if (string[0] == '@') {
+        char xstr[32], ystr[32];
+        int x, y;
+
+       if ((sscanf(&string[1], "%31[^,],%31[^,]", xstr, ystr) == 2) &&
+           (Tcl_GetInt(interp, xstr,  &x) == TCL_OK) &&
+           (Tcl_GetInt(interp, ystr,  &y) == TCL_OK)) {
+           *indexPtr = CalcPieMenuItem(menuPtr, x, y);
+           return TCL_OK;
+       } else {
+           Tcl_SetResult(interp, (char *) NULL, TCL_STATIC);
+       }
+    }
+
+    if (isdigit(string[0])) {
+       if (Tcl_GetInt(interp, string,  &i) == TCL_OK) {
+           if ((i < menuPtr->numEntries) && (i >= 0)) {
+               *indexPtr = i;
+               return TCL_OK;
+           }
+       } else {
+           Tcl_SetResult(interp, (char *) NULL, TCL_STATIC);
+       }
+    }
+
+    for (i = 0; i < menuPtr->numEntries; i++) {
+       char *label;
+
+       label = menuPtr->entries[i]->label;
+       if ((label != NULL)
+               && (Tcl_StringMatch(menuPtr->entries[i]->label, string))) {
+           *indexPtr = i;
+           return TCL_OK;
+       }
+    }
+
+    Tcl_AppendResult(interp, "bad menu entry index \"",
+                    string, "\"", (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * PieMenuEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher for various
+ *     events on pie menus.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the window gets deleted, internal structures get
+ *     cleaned up.  When it gets exposed, it is redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+PieMenuEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    XEvent *eventPtr;          /* Information about event. */
+{
+    PieMenu *menuPtr = (PieMenu *) clientData;
+    switch (eventPtr->type) {
+    case Expose:
+       if (eventPtr->xexpose.count == 0) {
+           EventuallyRedrawPieMenu(menuPtr, -1);
+       }
+       break;
+    case DestroyNotify:
+       Tcl_DeleteCommand(menuPtr->interp, Tk_PathName(menuPtr->tkwin));
+
+       /*
+        * Careful!  Must delete the event-sharing information here
+        * rather than in DestroyPieMenu.  By the time that procedure
+        * is called the tkwin may have been reused, resulting in some
+        * other window accidentally being cut off from shared events.
+        */
+
+       Tk_UnshareEvents(menuPtr->tkwin, menuPtr->group);
+       menuPtr->tkwin = NULL;
+       if (menuPtr->flags & REDRAW_PENDING) {
+           Tk_CancelIdleCall(DisplayPieMenu, (ClientData) menuPtr);
+       }
+       if (menuPtr->flags & UPDATE_PENDING) {
+           Tk_CancelIdleCall(UpdatePieMenu, (ClientData) menuPtr);
+       }
+       if (menuPtr->flags & RESIZE_PENDING) {
+           Tk_CancelIdleCall(ComputePieMenuGeometry, (ClientData) menuPtr);
+       }
+       if (menuPtr->flags & POPUP_PENDING) {
+           Tk_CancelIdleCall(PopupPieMenu, (ClientData) menuPtr);
+       }
+       Tk_EventuallyFree((ClientData) menuPtr, DestroyPieMenu);
+       break;
+    case MotionNotify:
+       break;
+    case ButtonPress:
+       break;
+    case ButtonRelease:
+       break;
+    }
+}
+
+
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * EventuallyRedrawPieMenu --
+ *
+ *     Arrange for an entry of a pie menu, or the whole pie menu, 
+ *     to be redisplayed at some point in the future.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A when-idle hander is scheduled to do the redisplay, if there
+ *     isn't one already scheduled.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+EventuallyRedrawPieMenu(menuPtr, index)
+    register PieMenu *menuPtr; /* Information about menu to redraw. */
+    int index;                 /* Which entry to redraw.  If -1, then
+                                * all the entries in the menu are redrawn. */
+{
+    if (menuPtr->tkwin == NULL) {
+       return;
+    }
+    if (index != -1) {
+       menuPtr->entries[index]->flags |= ENTRY_NEEDS_REDISPLAY;
+    } else {
+       for (index = 0; index < menuPtr->numEntries; index++) {
+           menuPtr->entries[index]->flags |= ENTRY_NEEDS_REDISPLAY;
+       }
+       index = -1;
+    }
+    if ((menuPtr->tkwin == NULL) || !Tk_IsMapped(menuPtr->tkwin)
+           || (menuPtr->flags & REDRAW_PENDING)) {
+       return;
+    }
+
+    if (index == -1) {
+       if (menuPtr->flags & UPDATE_PENDING) {
+           Tk_CancelIdleCall(UpdatePieMenu, (ClientData) menuPtr);
+       }
+       Tk_DoWhenIdle(DisplayPieMenu, (ClientData) menuPtr);
+       menuPtr->flags |= REDRAW_PENDING;
+    } else {
+       Tk_DoWhenIdle(UpdatePieMenu, (ClientData) menuPtr);
+       menuPtr->flags |= UPDATE_PENDING;
+    }
+}
+
+
+static void
+PopupPieMenu(clientData)
+    ClientData clientData;     /* Information about widget. */
+{
+  register PieMenu *menuPtr = (PieMenu *) clientData;
+
+  NeverPopupPieMenu(menuPtr);
+
+  if (Tk_IsMapped(menuPtr->tkwin)) {
+    return;
+  }
+
+  ShapePieMenu(menuPtr);
+  Tk_MapWindow(menuPtr->tkwin);
+}
+
+
+static void
+NowPopupPieMenu(menuPtr)
+    register PieMenu *menuPtr;
+{
+  PopupPieMenu((ClientData)menuPtr);
+}
+
+
+static void
+NeverPopupPieMenu(menuPtr)
+    register PieMenu *menuPtr;
+{
+  if (menuPtr->flags & POPUP_PENDING) {
+    Tk_DeleteTimerHandler(menuPtr->popup_timer_token);
+    menuPtr->popup_timer_token = 0;
+    menuPtr->flags &= ~POPUP_PENDING;
+  }
+}
+
+
+static void
+EventuallyPopupPieMenu(menuPtr)
+    register PieMenu *menuPtr;
+{
+  NeverPopupPieMenu(menuPtr);
+
+  if (Tk_IsMapped(menuPtr->tkwin)) {
+    return;
+  }
+
+  menuPtr->popup_timer_token =
+    Tk_CreateTimerHandler(menuPtr->popup_delay,
+                         PopupPieMenu, (ClientData) menuPtr);
+  menuPtr->flags |= POPUP_PENDING;
+}
+
+
+static void
+DeferPopupPieMenu(menuPtr)
+    register PieMenu *menuPtr;
+{
+  if (menuPtr->flags & POPUP_PENDING) {
+    EventuallyPopupPieMenu(menuPtr);
+  }
+}
+
+
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * UnpostSubPieMenu --
+ *
+ *     This procedure unposts any submenu.
+ *
+ * Results:
+ *     A standard Tcl return result.  Errors may occur in the
+ *     Tcl commands generated to unpost submenus.
+ *
+ * Side effects:
+ *     If there is already a submenu posted, it is unposted.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+UnpostSubPieMenu(interp, menuPtr)
+    Tcl_Interp *interp;                /* Used for invoking sub-commands and
+                                * reporting errors. */
+    register PieMenu *menuPtr; /* Information about menu as a whole. */
+{
+    char string[30];
+    int result, x, y, win_x, win_y;
+    unsigned int key_buttons;
+    Window root, child;
+
+    if (menuPtr->postedPie == NULL) {
+       return TCL_OK;
+    }
+
+    result = Tcl_VarEval(interp, menuPtr->postedPie->name,
+                        " unpost", (char *) NULL);
+    menuPtr->postedPie = NULL;
+
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ActivatePieMenuEntry --
+ *
+ *     This procedure is invoked to make a particular pie menu 
+ *     entry the active one, deactivating any other entry that 
+ *     might currently be active.
+ *
+ * Results:
+ *     The return value is a standard Tcl result (errors can occur
+ *     while posting and unposting submenus).
+ *
+ * Side effects:
+ *     Pie menu entries get redisplayed, and the active entry 
+ *     changes.  Submenus may get posted and unposted.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ActivatePieMenuEntry(menuPtr, index, preview)
+    register PieMenu *menuPtr;         /* Menu in which to activate. */
+    int index;                         /* Index of entry to activate, or
+                                        * -1 to deactivate all entries. */
+    int preview;                       /* 1 to execute previewer */
+{
+    register PieMenuEntry *mePtr;
+    int result = TCL_OK;
+
+    if (menuPtr->active >= 0) {
+       mePtr = menuPtr->entries[menuPtr->active];
+
+       EventuallyRedrawPieMenu(menuPtr, menuPtr->active);
+    }
+    menuPtr->active = index;
+    if (index >= 0) {
+       mePtr = menuPtr->entries[index];
+       EventuallyRedrawPieMenu(menuPtr, index);
+       if (preview) {
+         Tk_Preserve((ClientData) mePtr);
+         if (mePtr->preview != NULL) {
+             result = Tcl_GlobalEval(menuPtr->interp, mePtr->preview);
+         }
+         Tk_Release((ClientData) mePtr);
+       }
+    } else {
+/* We're doing this in tcl these days, for finer control. */
+#if 0
+      if (preview && menuPtr->preview) {
+           result = Tcl_GlobalEval(menuPtr->interp, menuPtr->preview);
+      }
+#endif
+    }
+    return result;
+}
+
+
+/*
+ * This pie menu tracking code determines the slice the cursor 
+ * is in by representing slice edge angles as (quadrant, slope) 
+ * pairs that can be quickly computed and compared. 
+ *
+ * The slope is defined such that it is greater than or equal to zero,
+ * less than infinity, and increasing counter-clockwise around the menu. 
+ * Each of the four quadrants encompasses one range of slope.
+ *
+ *                 Y
+ *               ^
+ *               |     x>0, y>=0
+ *  x<=0, y>0 <--+       y/x
+ *    -x/y       |        ^
+ *        quad 1 | quad 0 |     X
+ * -----+--------+--------+----> 
+ *      | quad 2 | quad 3
+ *      V        |      -x/y
+ *   x<0, y<=0   +--> x>=0, y<0
+ *     y/x       |
+ *               |
+ * 
+ * The quadrants and slopes of the item edges are all precalculated,
+ * during menu layout.
+ * The quadrant and slope of the cursor must be calculated frequently
+ * during menu tracking, so we just calculate the numerator and
+ * denominator of the slope, and avoid an unnecessary division.
+ * Instead of calculating "slope = numerator / denominator" then
+ * testing "slope < it->slope", every time the cursor moves, we can
+ * just test "numerator < (denominator * it->slope)".
+ *
+ * This algorithm works in a right-side-up coordinate space, but the final
+ * results are tranformed into X-windows's up-side-down coordinate system 
+ * by subtracting the y values from the window height. 
+ */
+
+
+#define CALC_QUADRANT_SLOPE(x, y, quadrant, numerator, denominator) \
+    if ((y) > 0) (quadrant) = ((x) > 0 ? 0 : 1); \
+    else if ((y) < 0) (quadrant) = ((x) < 0 ? 2 : 3); \
+    else (quadrant) = ((x) > 0 ? 0 : 2); \
+    if ((quadrant) & 1) { \
+       (numerator) = ABS((x)); (denominator) = ABS((y)); \
+    } else { \
+       (numerator) = ABS((y)); (denominator) = ABS((x)); \
+    }
+
+
+int
+CalcPieMenuItem(menu, x, y)
+  PieMenu *menu;
+  int x, y;
+{
+  register PieMenuEntry *it, *last_it;
+  int i, j, order, quadrant;
+  int numerator, denominator;
+  int first, last_i, last_order;
+  
+  /*
+   * Translate x and y from root window coordinates so they are 
+   * relative to the menu center, in right side up coordinates.
+   */
+  
+  menu->dx = x = (x - menu->root_x) + 1;
+  menu->dy = y = (menu->root_y - y) - 1;
+  
+  /*
+   * If there are no menu items,
+   * or we are within the inactive region in the menu center,
+   * then there is no item selected.
+   */
+  if ((menu->numEntries == 0) ||
+      ((x * x) + (y * y) <
+       (menu->inactive_radius * menu->inactive_radius))) {
+    return(-1);
+  }
+  
+  /*
+   * If there's only one item, then that must be it. 
+   */
+  if (menu->numEntries == 1) {
+    return(0);
+  }
+  
+  /*
+   * Calculate the quadrant, slope numerator, and slope denominator of
+   * the cursor slope, to be used for comparisons.
+   */
+  CALC_QUADRANT_SLOPE(x, y, quadrant, numerator, denominator);
+  
+  /*
+   * In most cases, during cursor tracking, the menu item that the
+   * cursor is over will be the same as it was before (almost all
+   * of the time), or one of the neighboring items (most of the
+   * rest of the time). So we check those items first. But to keep
+   * things simple, instead of actually checking the items in order of
+   * frequency (the current, the two neighbors, then the rest), we just
+   * start our loop around the menu items at the item *before* the
+   * last selected menu item, so we still check the three most common
+   * cases first (neighbor, current, neighbor, rest), without having 
+   * to complicate the code with special cases. Another strategy, that
+   * might be good for menus with ridiculously many items, would be
+   * [to check the current item first, then the two neighbors, then]
+   * to do a binary search of the menu items (since they are ordered).
+   * But that's more complicated and you shouldn't have that many menu
+   * items anyway.
+   */
+  
+  /*
+   * Start at the item before current one.
+   */
+  first = menu->active - 1;
+  if (first < 0)
+    first = menu->numEntries - 1;
+  
+  /*
+   * Initialize last_order such that we will go through the loop
+   * at least once, validating last_i, last_order, and last_it for
+   * the next time through the loop.
+   */
+  last_i = last_order = -1;
+  i = first;
+  
+  it = menu->entries[i];
+  
+  while (1) {
+
+/* Legend: c = cursor, e = edge
+   <cursor quad>,<edge quad>
+         quad 1 | quad 0
+         -------+-------
+         quad 2 | quad 3
+*/
+
+    /* Set order = 1, if shortest direction from edge to cursor is ccw */
+    switch ((quadrant - it->quadrant) & 3) {
+
+case 0: /*
+                0,0     1,1     2,2     3,3
+                 |ce   ce|       |       |     
+               --+--   --+--   --+--   --+--   
+                 |       |     ce|       |ce
+       */
+      /* slope >= it->slope */
+      order = ((float)numerator >= (float)(denominator * it->slope));
+      break;
+
+case 1: /*
+                1,0     2,1     3,2     0,3
+                c|e     e|       |       |c
+               --+--   --+--   --+--   --+--   
+                 |      c|      e|c      |e
+       */
+      order = 1;
+      break;
+
+case 2: /*
+                2,0     3,1     0,2     1,3
+                 |e     e|       |c     c|
+               --+--   --+--   --+--   --+--   
+                c|       |c     e|       |e
+       */
+      /* slope < it->slope */
+      order = ((float)numerator < (float)(denominator * it->slope));
+      break;
+
+case 3: /*
+                3,0     0,1     1,2     2,3
+                 |e     e|c     c|       |
+               --+--   --+--   --+--   --+--   
+                 |c      |      e|      c|e
+       */
+      order = 0;
+      break;
+    }
+
+    /*
+     * If we were counter-clockwise of the last leading edge,
+     * and we're clockwise of this leading edge,
+     * then we were in the last menu item.
+     * (Note: first time through this loop last_order = -1 so we'll
+     * go back through the loop at least once, after validating
+     * last_order, last_i, and last_it.)
+     */
+    if ((last_order == 1) && (order == 0)) {
+      return(last_i);
+    }
+    last_order = order;
+
+    /*
+     * Remember this menu item index, and move on to the next one
+     * counter-clockwise around the circle.
+     */
+    last_i = i; last_it = it;
+    if (++i >= menu->numEntries) {
+      i = 0;
+    }
+    it = menu->entries[i];
+
+    /* 
+     * If we've checked all the others, then that must have been it. 
+     * This saves us from checking the leading edge of the first
+     * item again (It's also insurance against layout bugs.)
+     */
+    if (i == first) {
+      return(last_i);
+    }
+  }
+}
+
+
+LayoutPieMenu(menu)
+  PieMenu *menu;
+{
+  int i;
+  int total_slice, radius;
+  int minx, miny, maxx, maxy;
+  float angle;
+  PieMenuEntry *it, *last;
+  XFontStruct *font, *titlefont;
+
+  /*
+   * Calculate the sum of the menu item slice sizes.
+   * Each menu item will get a (slice / total_slice) sized slice of the pie.
+   */
+  total_slice = 0;
+  for (i = 0; i < menu->numEntries; i++) {
+    total_slice += menu->entries[i]->slice;
+  }
+
+  if ((titlefont = menu->titlefontPtr) == NULL)
+    titlefont = menu->fontPtr;
+
+  /*
+   * Calculate the subtend, angle, cosine, sine, quadrant, slope,
+   * and size of each menu item.
+   */
+  angle = DEG_TO_RAD(menu->initial_angle);
+  for (i = 0; i < menu->numEntries; i++) {
+    register float edge_dx, edge_dy, numerator, denominator, twist;
+    register int quadrant;
+
+    it = menu->entries[i];
+    if ((font = it->fontPtr) == NULL)
+      font = menu->fontPtr;
+
+    if (it->bitmap != None) {
+      unsigned int bitmapWidth, bitmapHeight;
+
+      Tk_SizeOfPixmap(it->bitmap, &bitmapWidth, &bitmapHeight);
+      it->height = bitmapHeight;
+      it->width = bitmapWidth;
+    } else {
+      it->height = font->ascent + font->descent;
+      if (it->label != NULL) {
+       (void) TkMeasureChars(font, it->label,
+                             it->labelLength, 0, (int) 100000,
+                             TK_NEWLINES_NOT_SPECIAL, &it->width);
+      } else {
+       it->width = 0;
+      }
+    }
+    it->height += 2*menu->activeBorderWidth + 2;
+    it->width += 2*menu->activeBorderWidth + 2;
+
+    it->subtend = TWO_PI * it->slice / total_slice;
+    twist = it->subtend / 2.0;
+    if (i != 0) angle += twist;
+    it->angle = angle;
+    it->dx = cos(angle);
+    it->dy = sin(angle);
+    edge_dx = cos(angle - twist);
+    edge_dy = sin(angle - twist);
+    CALC_QUADRANT_SLOPE(edge_dx, edge_dy, quadrant, numerator, denominator);
+    it->quadrant = quadrant;
+    it->slope = (float)numerator / (float)denominator;
+    angle += twist;
+  }
+
+  if ((radius = menu->fixed_radius) == 0) {
+    radius = menu->min_radius;
+    if (menu->numEntries > 1) {
+      last = menu->entries[menu->numEntries - 1];
+      for (i = 0; i < menu->numEntries; i++) {
+       float dx, dy, ldx, ldy;
+       int width, height, lwidth, lheight;
+
+       it = menu->entries[i];
+
+       dx = it->dx;  dy = it->dy;
+       width = it->width;  height = it->height;
+       ldx = last->dx;  ldy = last->dy;
+       lwidth = last->width;  lheight = last->height;
+       while (1) {
+         register int x, y, lx, ly, 
+                      x0max, y0max, x1min, y1min;
+
+         x = dx * radius + it->x_offset;
+         y = dy * radius + it->y_offset;
+         lx = ldx * radius + last->x_offset;
+         ly = ldy * radius + last->y_offset;
+
+         /* Translate x y with respect to label size and position */
+         if (ABS(x) <= 2) {
+           x -= width/2;
+           if (y < 0)
+             y -= height;
+         } else {
+           if (x < 0)
+             x -= width;
+           y -= height/2;
+         }
+
+         if (ABS(lx) <= 2) {
+           lx -= lwidth/2;
+           if (ly < 0)
+             ly -= lheight;
+         } else {
+           if (lx < 0)
+             lx -= lwidth;
+           ly -= lheight/2;
+         }
+
+         /* Do rects (x y width height) and (lx ly lwidth lheight) overlap? */
+         x0max = x > lx ? x : lx;
+         y0max = y > ly ? y : ly;
+         x1min = x+width < lx+lwidth ? x+width : lx+lwidth;
+         y1min = y+height < ly+lheight ? y+height : ly+lheight;
+         if (!((x0max < x1min) &&
+               (y0max < y1min))) { /* If they don't overlap */
+           /* They are far enough out, so move on. */
+           break;
+         }
+         /* Push the menu radius out a step and try again */
+         radius++;
+       }
+       /* Loop on to next menu item */
+       last = it;
+      }
+    }
+    radius += menu->extra_radius;
+  }
+  menu->label_radius = radius;
+
+  /* Finally position all the menu labels at the same radius.
+     Figure out the bounding box of the labels. */
+  minx = miny = maxx = maxy = 0;
+  for (i = 0; i < menu->numEntries; i++) {
+    it = menu->entries[i];
+
+    it->x = radius * it->dx + it->x_offset;
+    it->y = radius * it->dy + it->y_offset;
+
+    /* Translate x y with respect to label size and position */
+    if (ABS(it->x) <= 2) {
+      it->x -= it->width/2;
+      if (it->y < 0)
+       it->y -= it->height;
+    } else {
+      if (it->x < 0)
+       it->x -= it->width;
+      it->y -= it->height/2;
+    }
+
+    it->label_x = it->x + menu->activeBorderWidth + 1;
+    it->label_y = it->y - menu->activeBorderWidth - 1;
+    if (it->bitmap == None) {
+      it->label_y -= (it->fontPtr ? it->fontPtr : menu->fontPtr)->ascent;
+    }
+
+    if (it->x < minx) minx = it->x;
+    if ((it->x + it->width) > maxx) maxx = (it->x + it->width);
+    if (it->y < miny) miny = it->y;
+    if ((it->y + it->height) > maxy) maxy = (it->y + it->height);
+  }
+
+  
+  if (menu->titleLength != 0) {
+    menu->title_height = titlefont->ascent + titlefont->descent + 2;
+    (void) TkMeasureChars(titlefont, menu->title,
+                         menu->titleLength, 0, (int) 100000,
+                         TK_NEWLINES_NOT_SPECIAL, &menu->title_width);
+    menu->title_width += 2;
+    if (-(menu->title_width / 2) < minx)
+      minx = -(menu->title_width / 2);
+    if ((menu->title_width / 2) > maxx)
+      maxx = (menu->title_width / 2);
+    maxy += (2 * menu->borderWidth) + menu->title_height;
+  } else {
+    menu->title_width = menu->title_height = 0;
+  }
+
+
+  minx -= 2*menu->borderWidth;  miny -= 2*menu->borderWidth;
+  maxx += 2*menu->borderWidth;  maxy += 2*menu->borderWidth;
+
+  menu->center_x = -minx;
+  menu->center_y = maxy; /* y flip */
+  menu->width = maxx - minx;
+  menu->height = maxy - miny;
+
+/*  menu->title_x = (menu->width - menu->title_width) / 2 + 1; */
+  menu->title_x = menu->center_x - menu->title_width/2 + 1;
+  menu->title_y = 2*menu->borderWidth + titlefont->ascent + 1;
+
+  /* Translate the menu items to the center of the menu, in X coordinates. */
+  for (i = 0; i < menu->numEntries; i++) {
+    it = menu->entries[i];
+    it->x = menu->center_x + it->x;
+    it->y = (menu->center_y - it->y) - it->height; /* y flip */
+    it->label_x = menu->center_x + it->label_x;
+    it->label_y = (menu->center_y - it->label_y) - it->height; /* y flip */
+  }
+
+  if (menu->segments != NULL) {
+      ckfree((char *)menu->segments);
+  }
+  menu->segments = (XSegment *)
+    ckalloc(menu->numEntries * sizeof(XSegment));
+
+  if (menu->numEntries > 1) {
+    XSegment *seg = menu->segments;
+
+    angle = DEG_TO_RAD(menu->initial_angle) -
+            (menu->entries[0]->subtend / 2.0);
+    for (i = 0; i < menu->numEntries; i++) {
+      it = menu->entries[i];
+      seg->x1 = menu->center_x + (cos(angle) * menu->inactive_radius);
+      seg->y1 = menu->center_y - (sin(angle) * menu->inactive_radius);
+      seg->x2 = menu->center_x +
+       (cos(angle) * (menu->label_radius - PIE_SPOKE_INSET));
+      seg->y2 = menu->center_y -
+       (sin(angle) * (menu->label_radius - PIE_SPOKE_INSET));
+      seg++;
+      angle += it->subtend;
+    }
+  }
+}
+
+
+static void
+ShapePieMenu(menuPtr)
+PieMenu *menuPtr;
+{
+  Display *dpy;
+  Window win, shape;
+  GC gc;
+  XGCValues values;
+  PieMenuEntry *it;
+  int i;
+
+  if (HaveShape == 0)
+    return;
+
+  if (menuPtr->shaped == 0) {
+    return;
+  }
+
+  dpy = Tk_Display(menuPtr->tkwin);
+
+  if (HaveShape == -1) {
+    int t1, t2;
+    if (XShapeQueryExtension(dpy, &t1, &t2)) {
+      HaveShape = 1;
+    } else {
+      HaveShape = 0;
+      return;
+    }
+  }
+
+  Tk_MakeWindowExist(menuPtr->tkwin);
+  win = Tk_WindowId(menuPtr->tkwin);
+
+  shape = XCreatePixmap(dpy, RootWindowOfScreen(Tk_Screen(menuPtr->tkwin)),
+                       menuPtr->width, menuPtr->height, 1);
+  gc = XCreateGC(dpy, shape, 0, &values);
+
+
+  XSetForeground(dpy, gc, 0);
+  XFillRectangle(dpy, shape, gc, 0, 0, menuPtr->width, menuPtr->height);
+
+  XSetForeground(dpy, gc, 1);
+  if (menuPtr->titleLength != 0) {
+    int bw = menuPtr->borderWidth;
+
+    XFillRectangle(dpy, shape, gc, bw, bw, menuPtr->width - bw*2, menuPtr->title_height + bw*2);
+  }
+
+  for (i = 0; i < menuPtr->numEntries; i++) {
+    it = menuPtr->entries[i];
+    XFillRectangle(dpy, shape, gc, it->x, it->y, it->width, it->height);
+  }
+
+  XFreeGC(dpy, gc);
+  XShapeCombineMask(dpy, win, ShapeBounding, 0, 0, shape, ShapeSet);
+}
diff --git a/src/sim/w_print.c b/src/sim/w_print.c
new file mode 100644 (file)
index 0000000..51f3c52
--- /dev/null
@@ -0,0 +1,110 @@
+/* w_print.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+PrintRect (int x, int y, int w, int h)
+{
+  int xx, yy;
+  char tally[TILE_COUNT];
+
+  PrintHeader(x, y, w, h);
+
+  for (xx = 0; XX < TILE_COUNT; xx++) {
+    tally[xx] = 0;
+  }
+
+  for (yy = y; yy < (y + h); yy++) {
+    for (xx = ; xx < (x + w); xx++) {
+      tally[TILE_COUNT]++;
+    }
+  }
+
+  for (xx = 0; XX < TILE_COUNT; xx++) {
+    if (tally[xx]) {
+      PrintDefTile(xx);
+    }
+  }
+
+  FirstRow();
+  for (yy = y; yy < (y + h); yy++) {
+    for (xx = x; xx < (x + w); xx++) {
+      PrintTile(Map[x][y] & LOMASK);
+    }
+    PrintNextRow();
+  }
+
+  PrintFinish(x, y, w, h);
+
+  PrintTrailer(x, y, w, h);
+}
+
+
+DefTile(int tile)
+{
+  
+}
+
+
+PrintTile(int tile)
+{
+  
+}
diff --git a/src/sim/w_resrc.c b/src/sim/w_resrc.c
new file mode 100644 (file)
index 0000000..2446694
--- /dev/null
@@ -0,0 +1,208 @@
+/* w_resrc.c:  Get resources (from files)
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+#ifdef MSDOS
+#define PATHSTR        "%s\\%c%c%c%c.%d"
+#define PERMSTR        "rb"
+#else
+#define PATHSTR        "%s/%c%c%c%c.%d"
+#define PERMSTR        "r"
+#endif
+
+
+char *HomeDir, *ResourceDir, *KeyDir, *HostName;
+
+struct Resource *Resources = NULL;
+
+struct StringTable {
+  QUAD id;
+  int lines;
+  char **strings;
+  struct StringTable *next;
+} *StringTables;
+
+
+Handle GetResource(char *name, QUAD id)
+{
+  struct Resource *r = Resources;
+  char fname[256];
+  struct stat st;
+  FILE *fp = NULL;
+
+  while (r != NULL) {
+    if ((r->id == id) &&
+       (strncmp(r->name, name, 4) == 0)) {
+      return ((Handle)&r->buf);
+    }
+    r = r->next;
+  }
+
+  r = (struct Resource *)ckalloc(sizeof(struct Resource));
+
+  r->name[0] = name[0];
+  r->name[1] = name[1];
+  r->name[2] = name[2];
+  r->name[3] = name[3];
+  r->id = id;
+
+  sprintf(fname, PATHSTR, ResourceDir,
+         r->name[0], r->name[1], r->name[2], r->name[3],
+         r->id);
+
+  if ((stat(fname, &st) < 0) ||
+      ((r->size = st.st_size) == 0) ||
+      ((r->buf = (char *)ckalloc(r->size)) == NULL) ||
+      ((fp = fopen(fname, PERMSTR)) == NULL) ||
+      (fread(r->buf, sizeof(char), r->size, fp) != r->size)) {
+    if (fp)
+      fclose(fp);
+    r->buf = NULL;
+    r->size = 0;
+    fprintf(stderr, "Can't find resource file \"%s\"!\n", fname);
+    perror("GetResource");
+    return(NULL);
+  }
+  fclose(fp);
+  r->next = Resources; Resources = r;
+  return ((Handle)&r->buf);
+}
+
+
+void
+ReleaseResource(Handle r)
+{
+}
+
+
+QUAD
+ResourceSize(Handle h)
+{
+  struct Resource *r = (struct Resource *)h;
+
+  return (r->size);
+}
+
+
+char *
+ResourceName(Handle h)
+{
+  struct Resource *r = (struct Resource *)h;
+
+  return (r->name);
+}
+
+
+QUAD
+ResourceID(Handle h)
+{
+  struct Resource *r = (struct Resource *)h;
+
+  return (r->id);
+}
+
+
+GetIndString(char *str, int id, short num)
+{
+  struct StringTable **tp, *st = NULL;
+  Handle h;
+
+  tp = &StringTables;
+
+  while (*tp) {
+    if ((*tp)->id == id) {
+      st = *tp;
+      break;
+    }
+    tp = &((*tp)->next);
+  }
+  if (!st) {
+    QUAD i, lines, size;
+    char *buf;
+
+    st = (struct StringTable *)ckalloc(sizeof (struct StringTable));
+    st->id = id;
+    h = GetResource("stri", id);
+    size = ResourceSize(h);
+    buf = (char *)*h;
+    for (i=0, lines=0; i<size; i++)
+      if (buf[i] == '\n') {
+       buf[i] = 0;
+       lines++;
+      }
+    st->lines = lines;
+    st->strings = (char **)ckalloc(size * sizeof(char *));
+    for (i=0; i<lines; i++) {
+      st->strings[i] = buf;
+      buf += strlen(buf) + 1;
+    }
+    st->next = StringTables;
+    StringTables = st;
+  }
+  if ((num < 1) || (num > st->lines)) {
+    fprintf(stderr, "Out of range string index: %d\n", num);
+    strcpy(str, "Well I'll be a monkey's uncle!");
+  } {
+    strcpy(str, st->strings[num-1]);
+  }
+}
diff --git a/src/sim/w_sim.c b/src/sim/w_sim.c
new file mode 100644 (file)
index 0000000..71f2f1a
--- /dev/null
@@ -0,0 +1,1677 @@
+/* w_sim.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+Tcl_HashTable SimCmds;
+
+
+#define SIMCMD_CALL(proc) \
+  int SimCmd##proc(ARGS) { proc(); return (TCL_OK); }
+
+#define SIMCMD_CALL_KICK(proc) \
+  int SimCmd##proc(ARGS) { proc(); Kick(); return (TCL_OK); }
+
+#define SIMCMD_CALL_INT(proc) \
+  int SimCmd##proc(ARGS) { \
+    int val; \
+    if (argc != 3) return (TCL_ERROR); \
+    if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK)) return (TCL_ERROR); \
+    proc(val); \
+    return (TCL_OK); \
+  }
+
+#define SIMCMD_CALL_STR(proc) \
+  int SimCmd##proc(ARGS) { \
+    if (argc != 3) return (TCL_ERROR); \
+    proc(argv[2]); \
+    return (TCL_OK); \
+  }
+
+#define SIMCMD_CALL_TILEXY(proc) \
+  int SimCmd##proc(ARGS) { \
+    int x, y; \
+    if (argc != 4) return (TCL_ERROR); \
+    if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) || \
+       (x < 0) || (x >= WORLD_X)) return (TCL_ERROR); \
+    if ((Tcl_GetInt(interp, argv[3], &y) != TCL_OK) || \
+       (y < 0) || (y >= WORLD_Y)) return (TCL_ERROR); \
+    proc(x, y); \
+    return (TCL_OK); \
+  }
+
+#define SIMCMD_ACCESS_INT(var) \
+  int SimCmd##var(ARGS) { \
+    int val; \
+    if ((argc != 2) && (argc != 3)) return (TCL_ERROR); \
+    if (argc == 3) { \
+      if (Tcl_GetInt(interp, argv[2], &val) != TCL_OK) return (TCL_ERROR); \
+      var = val; \
+    } \
+    sprintf(interp->result, "%d", var); \
+    return (TCL_OK); \
+  }
+
+#define SIMCMD_GET_INT(var) \
+  int SimCmd##var(ARGS) { \
+    sprintf(interp->result, "%d", var); \
+    return (TCL_OK); \
+  }
+
+#define SIMCMD_GET_STR(var) \
+  int SimCmd##var(ARGS) { \
+    sprintf(interp->result, "%s", var); \
+    return (TCL_OK); \
+  }
+
+
+SIMCMD_CALL_KICK(GameStarted)
+SIMCMD_CALL_KICK(InitGame)
+SIMCMD_CALL(SaveCity)
+SIMCMD_CALL(ReallyQuit)
+SIMCMD_CALL_KICK(UpdateHeads)
+SIMCMD_CALL_KICK(UpdateMaps)
+SIMCMD_CALL_KICK(UpdateEditors)
+SIMCMD_CALL_KICK(RedrawMaps)
+SIMCMD_CALL_KICK(RedrawEditors)
+SIMCMD_CALL_KICK(UpdateGraphs)
+SIMCMD_CALL_KICK(UpdateEvaluation)
+SIMCMD_CALL_KICK(UpdateBudget)
+SIMCMD_CALL_KICK(UpdateBudgetWindow)
+SIMCMD_CALL_KICK(DoBudget)
+SIMCMD_CALL_KICK(DoBudgetFromMenu)
+SIMCMD_CALL_KICK(Pause)
+SIMCMD_CALL_KICK(Resume)
+SIMCMD_CALL(StartBulldozer)
+SIMCMD_CALL(StopBulldozer)
+SIMCMD_CALL(MakeFire)
+SIMCMD_CALL(MakeFlood)
+SIMCMD_CALL(MakeTornado)
+SIMCMD_CALL(MakeEarthquake)
+SIMCMD_CALL(MakeMonster)
+SIMCMD_CALL(MakeMeltdown)
+SIMCMD_CALL(FireBomb)
+SIMCMD_CALL(SoundOff)
+SIMCMD_CALL(GenerateNewCity)
+SIMCMD_CALL_INT(GenerateSomeCity)
+SIMCMD_ACCESS_INT(LakeLevel)
+SIMCMD_ACCESS_INT(TreeLevel)
+SIMCMD_ACCESS_INT(CurveLevel)
+SIMCMD_ACCESS_INT(CreateIsland)
+SIMCMD_CALL_KICK(SmoothTrees)
+SIMCMD_CALL_KICK(SmoothWater)
+SIMCMD_CALL_KICK(SmoothRiver)
+SIMCMD_CALL_KICK(ClearMap)
+SIMCMD_CALL_KICK(ClearUnnatural)
+SIMCMD_CALL_INT(LoadScenario)
+SIMCMD_CALL_STR(LoadCity)
+SIMCMD_CALL_STR(SaveCityAs)
+SIMCMD_CALL_TILEXY(MakeExplosion)
+SIMCMD_CALL(EraseOverlay)
+SIMCMD_ACCESS_INT(OverRide)
+SIMCMD_ACCESS_INT(Expensive)
+SIMCMD_ACCESS_INT(Players)
+SIMCMD_ACCESS_INT(Votes)
+SIMCMD_ACCESS_INT(BobHeight)
+SIMCMD_ACCESS_INT(PendingTool)
+SIMCMD_ACCESS_INT(PendingX)
+SIMCMD_ACCESS_INT(PendingY)
+SIMCMD_GET_STR(Displays)
+
+
+int SimCmdCityName(ARGS)
+{
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    setCityName(argv[2]);
+  }
+
+  sprintf(interp->result, "%s", CityName);
+  return (TCL_OK);
+}
+
+
+int SimCmdCityFileName(ARGS)
+{
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if (CityFileName != NULL) {
+      ckfree(CityFileName);
+      CityFileName = NULL;
+    }
+    if (argv[2][0] != '\0') {
+      CityFileName = (char *)ckalloc(strlen(argv[0]) + 1);
+      strcpy(CityFileName, argv[2]);
+    }
+  }
+
+  sprintf(interp->result, "%s", CityFileName ? CityFileName : "");
+  return (TCL_OK);
+}
+
+
+int SimCmdGameLevel(ARGS)
+{
+  int level;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &level) != TCL_OK) ||
+       (level < 0) || (level > 2)) {
+      return (TCL_ERROR);
+    }
+    SetGameLevelFunds(level);
+  }
+
+  sprintf(interp->result, "%d", GameLevel);
+  return (TCL_OK);
+}
+
+
+int SimCmdSpeed(ARGS)
+{
+  int speed;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &speed) != TCL_OK) ||
+       (speed < 0) || (speed > 7)) {
+      return (TCL_ERROR);
+    }
+    setSpeed(speed); Kick();
+  }
+
+  sprintf(interp->result, "%d", SimSpeed);
+  return (TCL_OK);
+}
+
+
+int SimCmdSkips(ARGS)
+{
+  int skips;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &skips) != TCL_OK) ||
+       (skips < 0)) {
+      return (TCL_ERROR);
+    }
+    setSkips(skips); Kick();
+  }
+
+  sprintf(interp->result, "%d", sim_skips);
+
+  return (TCL_OK);
+}
+
+
+int SimCmdSkip(ARGS)
+{
+  int skip;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &skip) != TCL_OK) ||
+       (skip < 0)) {
+      return (TCL_ERROR);
+    }
+    sim_skip = skip;
+  }
+
+  sprintf(interp->result, "%d", sim_skip);
+
+  return (TCL_OK);
+}
+
+
+int SimCmdDelay(ARGS)
+{
+  int delay;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &delay) != TCL_OK) ||
+       (delay < 0)) {
+      return (TCL_ERROR);
+    }
+    sim_delay = delay; Kick();
+  }
+
+  sprintf(interp->result, "%d", sim_delay);
+  return (TCL_OK);
+}
+
+
+int SimCmdWorldX(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", WORLD_X);
+  return (TCL_OK);
+}
+
+
+int SimCmdWorldY(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", WORLD_Y);
+  return (TCL_OK);
+}
+
+
+int SimCmdHeatSteps(ARGS)
+{
+  int steps;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &steps) != TCL_OK) ||
+       (steps < 0)) {
+      return (TCL_ERROR);
+    }
+    heat_steps = steps; Kick();
+  }
+
+  sprintf(interp->result, "%d", heat_steps);
+  return (TCL_OK);
+}
+
+
+int SimCmdHeatFlow(ARGS)
+{
+  int flow;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if (Tcl_GetInt(interp, argv[2], &flow) != TCL_OK) {
+      return (TCL_ERROR);
+    }
+    heat_flow = flow;
+  }
+
+  sprintf(interp->result, "%d", heat_flow);
+  return (TCL_OK);
+}
+
+
+int SimCmdHeatRule(ARGS)
+{
+  int rule;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if (Tcl_GetInt(interp, argv[2], &rule) != TCL_OK) {
+      return (TCL_ERROR);
+    }
+    heat_rule = rule;
+  }
+
+  sprintf(interp->result, "%d", heat_rule);
+  return (TCL_OK);
+}
+
+
+#ifdef CAM
+
+int SimCmdJustCam(ARGS)
+{
+  int cam;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if (Tcl_GetInt(interp, argv[2], &cam) != TCL_OK) {
+      return (TCL_ERROR);
+    }
+    sim_just_cam = cam;
+  }
+
+  sprintf(interp->result, "%d", sim_just_cam);
+  return (TCL_OK);
+}
+
+#endif
+
+
+#ifdef NET
+
+int SimCmdListenTo(ARGS)
+{
+  int port, sock;
+
+  if (argc != 3) {
+    return (TCL_ERROR);
+  }
+
+  if (Tcl_GetInt(interp, argv[2], &port) != TCL_OK) {
+    return (TCL_ERROR);
+  }
+
+#ifdef NET
+  sock = udp_listen(port);
+#endif  
+
+  sprintf(interp->result, "%d", sock);
+
+  return (TCL_OK);
+}
+
+
+int SimCmdHearFrom(ARGS)
+{
+  int sock;
+
+  if (argc != 3) {
+    return (TCL_ERROR);
+  }
+
+  if ((argv[2][0] != 'f') ||
+      (argv[2][1] != 'i') ||
+      (argv[2][2] != 'l') ||
+      (argv[2][3] != 'e') ||
+      (Tcl_GetInt(interp, argv[2] + 4, &sock) != TCL_OK)) {
+    return (TCL_ERROR);
+  }
+
+#ifdef NET
+  udp_hear(sock);
+#endif  
+
+  return (TCL_OK);
+}
+
+#endif /* NET */
+
+
+int SimCmdFunds(ARGS)
+{
+  int funds;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &funds) != TCL_OK) ||
+       (funds < 0)) {
+      return (TCL_ERROR);
+    }
+    TotalFunds = funds;
+    MustUpdateFunds = 1;
+    Kick();
+  }
+
+  sprintf(interp->result, "%d", TotalFunds);
+  return (TCL_OK);
+}
+
+
+int SimCmdTaxRate(ARGS)
+{
+  int tax;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &tax) != TCL_OK) ||
+       (tax < 0) || (tax > 20)) {
+      return (TCL_ERROR);
+    }
+    CityTax = tax;
+    drawBudgetWindow(); Kick();
+  }
+
+  sprintf(interp->result, "%d", CityTax);
+  return (TCL_OK);
+}
+
+
+int SimCmdFireFund(ARGS)
+{
+  int percent;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &percent) != TCL_OK) ||
+       (percent < 0) || (percent > 100)) {
+      return (TCL_ERROR);
+    }
+    firePercent = percent / 100.0;
+    FireSpend = (fireMaxValue * percent) / 100;
+    UpdateFundEffects(); Kick();
+  }
+
+  sprintf(interp->result, "%d", (int)(firePercent * 100.0));
+  return (TCL_OK);
+}
+
+
+int SimCmdPoliceFund(ARGS)
+{
+  int percent;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &percent) != TCL_OK) ||
+       (percent < 0) || (percent > 100)) {
+      return (TCL_ERROR);
+    }
+    policePercent = percent / 100.0;
+    PoliceSpend = (policeMaxValue * percent) / 100;
+    UpdateFundEffects(); Kick();
+  }
+
+  sprintf(interp->result, "%d", (int)(policePercent * 100.0));
+  return (TCL_OK);
+}
+
+
+int SimCmdRoadFund(ARGS)
+{
+  int percent;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &percent) != TCL_OK) ||
+       (percent < 0) || (percent > 100)) {
+      return (TCL_ERROR);
+    }
+    roadPercent = percent / 100.0;
+    RoadSpend = (roadMaxValue * percent) / 100;
+    UpdateFundEffects(); Kick();
+  }
+
+  sprintf(interp->result, "%d", (int)(roadPercent * 100.0));
+  return (TCL_OK);
+}
+
+
+int SimCmdYear(ARGS)
+{
+  int year;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &year) != TCL_OK)) {
+      return (TCL_ERROR);
+    }
+    SetYear(year);
+  }
+
+  sprintf(interp->result, "%d", CurrentYear());
+  return (TCL_OK);
+}
+
+
+int SimCmdAutoBudget(ARGS)
+{
+  int val;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK) ||
+       (val < 0) || (val > 1)) {
+      return (TCL_ERROR);
+    }
+    autoBudget = val;
+    MustUpdateOptions = 1; Kick();
+    UpdateBudget();
+  }
+
+  sprintf(interp->result, "%d", autoBudget);
+  return (TCL_OK);
+}
+
+
+int SimCmdAutoGoto(ARGS)
+{
+  int val;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK) ||
+       (val < 0) || (val > 1)) {
+      return (TCL_ERROR);
+    }
+    autoGo = val;
+    MustUpdateOptions = 1; Kick();
+  }
+
+  sprintf(interp->result, "%d", autoGo);
+  return (TCL_OK);
+}
+
+
+int SimCmdAutoBulldoze(ARGS)
+{
+  int val;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK) ||
+       (val < 0) || (val > 1)) {
+      return (TCL_ERROR);
+    }
+    autoBulldoze = val;
+    MustUpdateOptions = 1; Kick();
+  }
+
+  sprintf(interp->result, "%d", autoBulldoze);
+  return (TCL_OK);
+}
+
+
+int SimCmdDisasters(ARGS)
+{
+  int val;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK) ||
+       (val < 0) || (val > 1)) {
+      return (TCL_ERROR);
+    }
+    NoDisasters = val ? 0 : 1;
+    MustUpdateOptions = 1; Kick();
+  }
+
+  sprintf(interp->result, "%d", NoDisasters ? 0 : 1);
+  return (TCL_OK);
+}
+
+
+int SimCmdSound(ARGS)
+{
+  int val;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK) ||
+       (val < 0) || (val > 1)) {
+      return (TCL_ERROR);
+    }
+    UserSoundOn = val;
+    MustUpdateOptions = 1; Kick();
+  }
+
+  sprintf(interp->result, "%d", UserSoundOn);
+  return (TCL_OK);
+}
+
+
+int SimCmdFlush(ARGS)
+{
+  int style;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+  
+  return (TCL_OK);
+}
+
+
+int SimCmdFlushStyle(ARGS)
+{
+  int style;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &style) != TCL_OK) ||
+       (style < 0)) {
+      return (TCL_ERROR);
+    }
+    FlushStyle = style;
+  }
+
+  sprintf(interp->result, "%d", FlushStyle);
+  return (TCL_OK);
+}
+
+
+int SimCmdDonDither(ARGS)
+{
+  int dd;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &dd) != TCL_OK) ||
+       (dd < 0)) {
+      return (TCL_ERROR);
+    }
+    DonDither = dd;
+  }
+
+  sprintf(interp->result, "%d", DonDither);
+  return (TCL_OK);
+}
+
+
+int SimCmdDoOverlay(ARGS)
+{
+  int dd;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &dd) != TCL_OK) ||
+       (dd < 0)) {
+      return (TCL_ERROR);
+    }
+    DoOverlay = dd;
+  }
+
+  sprintf(interp->result, "%d", DoOverlay);
+  return (TCL_OK);
+}
+
+
+int SimCmdMonsterGoal(ARGS)
+{
+  SimSprite *sprite;
+  int x, y;
+
+  if (argc != 4) {
+    return (TCL_ERROR);
+  }
+
+  if (Tcl_GetInt(interp, argv[2], &x) != TCL_OK) {
+    return (TCL_ERROR);
+  }
+  if (Tcl_GetInt(interp, argv[3], &y) != TCL_OK) {
+    return (TCL_ERROR);
+  }
+  if ((sprite = GetSprite(GOD)) == NULL) {
+    MakeMonster();
+    if ((sprite = GetSprite(GOD)) == NULL)
+      return (TCL_ERROR);
+  }
+  sprite->dest_x = x;
+  sprite->dest_y = y;
+  sprite->control = -2;
+  sprite->count = -1;
+
+  return (TCL_OK);
+}
+
+
+int SimCmdHelicopterGoal(ARGS)
+{
+  int x, y;
+  SimSprite *sprite;
+
+  if (argc != 4) {
+    return (TCL_ERROR);
+  }
+
+  if (Tcl_GetInt(interp, argv[2], &x) != TCL_OK) {
+    return (TCL_ERROR);
+  }
+  if (Tcl_GetInt(interp, argv[3], &y) != TCL_OK) {
+    return (TCL_ERROR);
+  }
+  
+  if ((sprite = GetSprite(COP)) == NULL) {
+    GenerateCopter(x, y);
+    if ((sprite = GetSprite(COP)) == NULL) {
+      return (TCL_ERROR);
+    }
+  }
+  sprite->dest_x = x;
+  sprite->dest_y = y;
+
+  return (TCL_OK);
+}
+
+
+int SimCmdMonsterDirection(ARGS)
+{
+  int dir;
+  SimSprite *sprite;
+
+  if (argc != 3) {
+    return (TCL_ERROR);
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &dir) != TCL_OK) ||
+      (dir < -1) || (dir > 7)) {
+    return (TCL_ERROR);
+  }
+  if ((sprite = GetSprite(GOD)) == NULL) {
+    MakeMonster();
+    if ((sprite = GetSprite(GOD)) == NULL) {
+      return (TCL_ERROR);
+    }
+  }
+  sprite->control = dir;
+
+  return (TCL_OK);
+}
+
+
+int SimCmdTile(ARGS)
+{
+  int x, y, tile;
+
+  if ((argc != 4) && (argc != 5)) {
+    return (TCL_ERROR);
+  }
+  if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
+      (x < 0) ||
+      (x >= WORLD_X) ||
+      (Tcl_GetInt(interp, argv[3], &y) != TCL_OK) ||
+      (y < 0) ||
+      (y >= WORLD_Y)) {
+    return (TCL_ERROR);
+  }
+  if (argc == 5) {
+    if (Tcl_GetInt(interp, argv[4], &tile) != TCL_OK) {
+      return (TCL_ERROR);
+    }
+    Map[x][y] = tile;
+  }
+  sprintf(interp->result, "%d", Map[x][y]);
+  return (TCL_OK);
+}
+
+
+int SimCmdFill(ARGS)
+{
+  int tile, x, y;
+
+  if (argc != 3) {
+    return (TCL_ERROR);
+  }
+  if (Tcl_GetInt(interp, argv[2], &tile) != TCL_OK) {
+    return (TCL_ERROR);
+  }
+  for (x = 0; x < WORLD_X; x++) {
+    for (y = 0; y < WORLD_Y; y++) {
+      Map[x][y] = tile;
+    }
+  }
+  sprintf(interp->result, "%d", tile);
+  return (TCL_OK);
+}
+
+
+int SimCmdDynamicData(ARGS)
+{
+  int index, val;
+
+  if ((argc != 3) && (argc != 4)) {
+    return (TCL_ERROR);
+  }
+
+  if ((Tcl_GetInt(interp, argv[2], &index) != TCL_OK) ||
+      (index < 0) ||
+      (index >= 32)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 4) {
+    int val;
+
+    if (Tcl_GetInt(interp, argv[3], &val) != TCL_OK) {
+      return (TCL_ERROR);
+    }
+    DynamicData[index] = val;
+    NewMapFlags[DYMAP] = 1;
+    Kick();
+  }
+
+  sprintf(interp->result, "%d", DynamicData[index]);
+  return (TCL_OK);
+}
+
+
+int SimCmdResetDynamic(ARGS)
+{
+  int i;
+
+  for (i = 0; i < 16; i++) {
+    DynamicData[i] = (i & 1) ? 99999 : -99999;
+  }
+  NewMapFlags[DYMAP] = 1;
+  Kick();
+  return (TCL_OK);
+}
+
+
+int SimCmdPerformance(ARGS)
+{
+  SimView *view;
+
+  PerformanceTiming = 1;
+  FlushTime = 0.0;
+  for (view = sim->editor; view != NULL; view = view->next) {
+    view->updates = 0;
+    view->update_real = view->update_user = view->update_system = 0.0;
+  }
+  return (TCL_OK);
+}
+
+
+int SimCmdCollapseMotion(ARGS)
+{
+  int val;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK)) {
+      return (TCL_ERROR);
+    }
+    tkCollapseMotion = val;
+  }
+
+  sprintf(interp->result, "%d", tkCollapseMotion);
+  return (TCL_OK);
+}
+
+
+int SimCmdUpdate(ARGS)
+{
+  sim_update();
+  return (TCL_OK);
+}
+
+
+int SimCmdLandValue(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", LVAverage);
+  return (TCL_OK);
+}
+
+
+int SimCmdTraffic(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", AverageTrf());
+  return (TCL_OK);
+}
+
+
+int SimCmdCrime(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", CrimeAverage);
+  return (TCL_OK);
+}
+
+
+int SimCmdUnemployment(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", GetUnemployment());
+  return (TCL_OK);
+}
+
+
+int SimCmdFires(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", GetFire());
+  return (TCL_OK);
+}
+
+
+int SimCmdPollution(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", PolluteAverage);
+  return (TCL_OK);
+}
+
+
+int SimCmdPolMaxX(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", (PolMaxX <<4) + 8);
+  return (TCL_OK);
+}
+
+
+int SimCmdPolMaxY(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", (PolMaxY <<4) + 8);
+  return (TCL_OK);
+}
+
+
+int SimCmdTrafMaxX(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", TrafMaxX);
+  return (TCL_OK);
+}
+
+
+int SimCmdTrafMaxY(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", TrafMaxY);
+  return (TCL_OK);
+}
+
+
+int SimCmdMeltX(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", (MeltX <<4) + 8);
+  return (TCL_OK);
+}
+
+
+int SimCmdMeltY(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", (MeltY <<4) + 8);
+  return (TCL_OK);
+}
+
+
+int SimCmdCrimeMaxX(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", (CrimeMaxX <<4) + 8);
+  return (TCL_OK);
+}
+
+
+int SimCmdCrimeMaxY(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", (CrimeMaxY <<4) + 8);
+  return (TCL_OK);
+}
+
+
+int SimCmdCenterX(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", (CCx <<4) + 8);
+  return (TCL_OK);
+}
+
+
+int SimCmdCenterY(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", (CCy <<4) + 8);
+  return (TCL_OK);
+}
+
+
+int SimCmdFloodX(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", (FloodX <<4) + 8);
+  return (TCL_OK);
+}
+
+
+int SimCmdFloodY(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", (FloodY <<4) + 8);
+  return (TCL_OK);
+}
+
+
+int SimCmdCrashX(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", (CrashX <<4) + 8);
+  return (TCL_OK);
+}
+
+
+int SimCmdCrashY(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", (CrashY <<4) + 8);
+  return (TCL_OK);
+}
+
+
+int SimCmdDollars(ARGS)
+{
+  int val;
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  makeDollarDecimalStr(argv[1], interp->result);
+  return (TCL_OK);
+}
+
+
+int SimCmdDoAnimation(ARGS)
+{
+  int val;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK)) {
+      return (TCL_ERROR);
+    }
+    DoAnimation = val;
+    MustUpdateOptions = 1; Kick();
+  }
+
+  sprintf(interp->result, "%d", DoAnimation);
+  return (TCL_OK);
+}
+
+
+int SimCmdDoMessages(ARGS)
+{
+  int val;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK)) {
+      return (TCL_ERROR);
+    }
+    DoMessages = val;
+    MustUpdateOptions = 1; Kick();
+  }
+
+  sprintf(interp->result, "%d", DoMessages);
+  return (TCL_OK);
+}
+
+
+int SimCmdDoNotices(ARGS)
+{
+  int val;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK)) {
+      return (TCL_ERROR);
+    }
+    DoNotices = val;
+    MustUpdateOptions = 1; Kick();
+  }
+
+  sprintf(interp->result, "%d", DoNotices);
+  return (TCL_OK);
+}
+
+
+int SimCmdRand(ARGS)
+{
+  int val, r;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if ((Tcl_GetInt(interp, argv[2], &val) != TCL_OK)) {
+      return (TCL_ERROR);
+    }
+    r = Rand(val);
+  } else {
+    r = Rand16();
+  }
+
+  sprintf(interp->result, "%d", r);
+  return (TCL_OK);
+}
+
+
+int SimCmdPlatform(ARGS)
+{
+
+#ifdef MSDOS
+  sprintf(interp->result, "msdos");
+#else
+  sprintf(interp->result, "unix");
+#endif
+
+  return (TCL_OK);
+}
+
+
+int SimCmdVersion(ARGS)
+{
+  sprintf(interp->result, MicropolisVersion);
+
+  return (TCL_OK);
+}
+
+
+int SimCmdOpenWebBrowser(ARGS)
+{
+  int result = 1;
+  char buf[512];
+
+  if ((argc != 3) ||
+      (strlen(argv[2]) > 255)) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(buf, 
+         "netscape -no-about-splash '%s' &",
+         argv[2]);
+
+  result = system(buf);
+  
+  sprintf(interp->result, "%d", result);
+
+  return (TCL_OK);
+}
+
+
+int SimCmdQuoteURL(ARGS)
+{
+  int result = 1;
+  char buf[2048];
+  char *from, *to;
+  int ch;
+  static char *hexDigits =
+    "0123456789ABCDEF";
+
+  if ((argc != 3) ||
+      (strlen(argv[2]) > 255)) {
+    return (TCL_ERROR);
+  }
+
+  from = argv[2];
+  to = buf;
+
+  while ((ch = *(from++)) != '\0') {
+    if ((ch < 32) ||
+       (ch >= 128) ||
+       (ch == '+') ||
+       (ch == '%') ||
+       (ch == '&') ||
+       (ch == '<') ||
+       (ch == '>') ||
+       (ch == '"') ||
+       (ch == '\'')) {
+      *to++ = '%';
+      *to++ = hexDigits[(ch >> 4) & 0x0f];
+      *to++ = hexDigits[ch & 0x0f];
+    } else if (ch == 32) {
+      *to++ = '+';
+    } else {
+      *to++ = ch;
+    } // if
+  } // while
+  
+  *to = '\0';
+
+  sprintf(interp->result, "%s", buf);
+
+  return (TCL_OK);
+}
+
+
+int SimCmdNeedRest(ARGS)
+{
+  int needRest;
+
+  if ((argc != 2) && (argc != 3)) {
+    return (TCL_ERROR);
+  }
+
+  if (argc == 3) {
+    if (Tcl_GetInt(interp, argv[2], &needRest) != TCL_OK) {
+      return (TCL_ERROR);
+    }
+    NeedRest = needRest;
+  }
+
+  sprintf(interp->result, "%d", NeedRest);
+  return (TCL_OK);
+}
+
+
+int SimCmdMultiPlayerMode(ARGS)
+{
+  /* This is read-only because it's specified on
+     the command line and effects how the user 
+     interface is initialized. */
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", MultiPlayerMode);
+  return (TCL_OK);
+}
+
+
+int SimCmdSugarMode(ARGS)
+{
+  /* This is read-only because it's specified on
+     the command line and effects how the user 
+     interface is initialized. */
+
+  if (argc != 2) {
+    return (TCL_ERROR);
+  }
+
+  sprintf(interp->result, "%d", SugarMode);
+  return (TCL_OK);
+}
+
+
+/************************************************************************/
+
+int
+SimCmd(CLIENT_ARGS)
+{
+  Tcl_HashEntry *ent;
+  int result = TCL_OK;
+  int (*cmd)();
+
+  if (argc < 2) {
+    return TCL_ERROR;
+  }
+
+  if (ent = Tcl_FindHashEntry(&SimCmds, argv[1])) {
+    cmd = (int (*)())ent->clientData;
+    result = cmd(interp, argc, argv);
+  } else {
+    result = TCL_ERROR;
+  }
+  return result;
+}
+
+
+sim_command_init()
+{
+  int new;
+
+  Tcl_CreateCommand(tk_mainInterp, "sim", SimCmd,
+                   (ClientData)MainWindow, (void (*)()) NULL);
+
+  Tcl_InitHashTable(&SimCmds, TCL_STRING_KEYS);
+
+#define SIM_CMD(name) HASHED_CMD(Sim, name)
+
+  SIM_CMD(GameStarted);
+  SIM_CMD(InitGame);
+  SIM_CMD(SaveCity);
+  SIM_CMD(ReallyQuit);
+  SIM_CMD(UpdateHeads);
+  SIM_CMD(UpdateMaps);
+  SIM_CMD(RedrawEditors);
+  SIM_CMD(RedrawMaps);
+  SIM_CMD(UpdateEditors);
+  SIM_CMD(UpdateGraphs);
+  SIM_CMD(UpdateEvaluation);
+  SIM_CMD(UpdateBudget);
+  SIM_CMD(UpdateBudgetWindow);
+  SIM_CMD(DoBudget);
+  SIM_CMD(DoBudgetFromMenu);
+  SIM_CMD(Pause);
+  SIM_CMD(Resume);
+  SIM_CMD(StartBulldozer);
+  SIM_CMD(StopBulldozer);
+  SIM_CMD(MakeFire);
+  SIM_CMD(MakeFlood);
+  SIM_CMD(MakeTornado);
+  SIM_CMD(MakeEarthquake);
+  SIM_CMD(MakeMonster);
+  SIM_CMD(MakeMeltdown);
+  SIM_CMD(FireBomb);
+  SIM_CMD(SoundOff);
+  SIM_CMD(GenerateNewCity);
+  SIM_CMD(GenerateSomeCity);
+  SIM_CMD(TreeLevel);
+  SIM_CMD(LakeLevel);
+  SIM_CMD(CurveLevel);
+  SIM_CMD(CreateIsland);
+  SIM_CMD(ClearMap);
+  SIM_CMD(ClearUnnatural);
+  SIM_CMD(SmoothTrees);
+  SIM_CMD(SmoothWater);
+  SIM_CMD(SmoothRiver);
+  SIM_CMD(LoadScenario);
+  SIM_CMD(LoadCity);
+  SIM_CMD(SaveCityAs);
+  SIM_CMD(MakeExplosion);
+  SIM_CMD(CityName);
+  SIM_CMD(CityFileName);
+  SIM_CMD(GameLevel);
+  SIM_CMD(Speed);
+  SIM_CMD(Skips);
+  SIM_CMD(Skip);
+  SIM_CMD(WorldX);
+  SIM_CMD(WorldY);
+  SIM_CMD(Delay);
+  SIM_CMD(HeatSteps);
+  SIM_CMD(HeatFlow);
+  SIM_CMD(HeatRule);
+#ifdef CAM
+  SIM_CMD(JustCam);
+#endif
+#ifdef NET
+  SIM_CMD(ListenTo);
+  SIM_CMD(HearFrom);
+#endif
+  SIM_CMD(Funds);
+  SIM_CMD(TaxRate);
+  SIM_CMD(FireFund);
+  SIM_CMD(PoliceFund);
+  SIM_CMD(RoadFund);
+  SIM_CMD(Year);
+  SIM_CMD(AutoBudget);
+  SIM_CMD(AutoGoto);
+  SIM_CMD(AutoBulldoze);
+  SIM_CMD(Disasters);
+  SIM_CMD(Sound);
+  SIM_CMD(Flush);
+  SIM_CMD(FlushStyle);
+  SIM_CMD(DonDither);
+  SIM_CMD(DoOverlay);
+  SIM_CMD(MonsterGoal);
+  SIM_CMD(HelicopterGoal);
+  SIM_CMD(MonsterDirection);
+  SIM_CMD(EraseOverlay);
+  SIM_CMD(Tile);
+  SIM_CMD(Fill);
+  SIM_CMD(DynamicData);
+  SIM_CMD(ResetDynamic);
+  SIM_CMD(Performance);
+  SIM_CMD(CollapseMotion);
+  SIM_CMD(Update);
+  SIM_CMD(OverRide);
+  SIM_CMD(Expensive);
+  SIM_CMD(Players);
+  SIM_CMD(Votes);
+  SIM_CMD(BobHeight);
+  SIM_CMD(PendingTool);
+  SIM_CMD(PendingX);
+  SIM_CMD(PendingY);
+  SIM_CMD(Displays);
+  SIM_CMD(LandValue);
+  SIM_CMD(Traffic);
+  SIM_CMD(Crime);
+  SIM_CMD(Unemployment);
+  SIM_CMD(Fires);
+  SIM_CMD(Pollution);
+  SIM_CMD(PolMaxX);
+  SIM_CMD(PolMaxY);
+  SIM_CMD(TrafMaxX);
+  SIM_CMD(TrafMaxY);
+  SIM_CMD(MeltX);
+  SIM_CMD(MeltY);
+  SIM_CMD(CrimeMaxX);
+  SIM_CMD(CrimeMaxY);
+  SIM_CMD(CenterX);
+  SIM_CMD(CenterY);
+  SIM_CMD(FloodX);
+  SIM_CMD(FloodY);
+  SIM_CMD(CrashX);
+  SIM_CMD(CrashY);
+  SIM_CMD(Dollars);
+  SIM_CMD(DoAnimation);
+  SIM_CMD(DoMessages);
+  SIM_CMD(DoNotices);
+  SIM_CMD(Rand);
+  SIM_CMD(Platform);
+  SIM_CMD(Version);
+  SIM_CMD(OpenWebBrowser);
+  SIM_CMD(QuoteURL);
+  SIM_CMD(NeedRest);
+  SIM_CMD(MultiPlayerMode);
+  SIM_CMD(SugarMode);
+}
diff --git a/src/sim/w_sound.c b/src/sim/w_sound.c
new file mode 100644 (file)
index 0000000..b9b323c
--- /dev/null
@@ -0,0 +1,161 @@
+/* w_sound.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+/* Sound routines */
+
+
+int SoundInitialized = 0;
+short Dozing;
+
+
+InitializeSound()
+{
+  char cmd[256];
+
+  SoundInitialized = 1;
+
+  if (!UserSoundOn) return;
+
+  Eval("UIInitializeSound");
+}
+
+
+ShutDownSound()
+{
+  if (SoundInitialized) {
+    SoundInitialized = 0;
+    Eval("UIShutDownSound");
+  }
+}
+
+
+MakeSound(char *channel, char *id)
+{
+  char buf[256];
+
+  if (!UserSoundOn) return;
+  if (!SoundInitialized) InitializeSound();
+
+  sprintf(buf, "UIMakeSound \"%s\" \"%s\"", channel, id);
+  Eval(buf);
+}
+
+
+MakeSoundOn(SimView *view, char *channel, char *id)
+{
+  char buf[256];
+
+  if (!UserSoundOn) return;
+  if (!SoundInitialized) InitializeSound();
+
+  sprintf(buf, "UIMakeSoundOn %s \"%s\" \"%s\"",
+         Tk_PathName(view->tkwin), channel, id);
+  Eval(buf);
+}
+
+
+StartBulldozer(void)
+{
+  if (!UserSoundOn) return;
+  if (!SoundInitialized) InitializeSound();
+  if (!Dozing) {
+    DoStartSound("edit", "1");
+    Dozing = 1;
+  }
+}
+
+
+StopBulldozer(void)
+{
+  if ((!UserSoundOn) || (!SoundInitialized)) return;
+  DoStopSound("1");
+  Dozing = 0;
+}
+
+
+/* comefrom: doKeyEvent */
+SoundOff(void)
+{
+  if (!SoundInitialized) InitializeSound();
+  Eval("UISoundOff");
+  Dozing = 0;
+}
+
+
+DoStartSound(char *channel, char *id)
+{
+  char buf[256];
+
+  sprintf(buf, "UIStartSound %s %s", channel, id);
+  Eval(buf);
+}
+
+
+DoStopSound(char *id)
+{
+  char buf[256];
+
+  sprintf(buf, "UIStopSound %s", id);
+  Eval(buf);
+}
diff --git a/src/sim/w_sprite.c b/src/sim/w_sprite.c
new file mode 100644 (file)
index 0000000..22688e5
--- /dev/null
@@ -0,0 +1,1622 @@
+/* w_sprite.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+Tcl_HashTable SpriteCmds;
+short CrashX, CrashY;
+int absDist;
+short Cycle;
+
+SimSprite *GlobalSprites[OBJN];
+
+SimSprite *NewSprite(char *name, int type, int x, int y);
+
+
+#define TRA_GROOVE_X -39
+#define TRA_GROOVE_Y 6
+#define BUS_GROOVE_X -39
+#define BUS_GROOVE_Y 6
+
+#define SPRITECMD_ACCESS_INT(var) \
+  int SpriteCmd##var(SPRITE_ARGS) { \
+    int val; \
+    if ((argc != 2) && (argc != 3)) return (TCL_ERROR); \
+    if (argc == 3) { \
+      if (Tcl_GetInt(interp, argv[2], &val) != TCL_OK) return (TCL_ERROR); \
+      sprite->var = val; \
+    } \
+    sprintf(interp->result, "%d", sprite->var); \
+    return (TCL_OK); \
+  }
+
+
+#define SPRITECMD_GET_STR(var) \
+  int SpriteCmd##var(SPRITE_ARGS) { \
+    sprintf(interp->result, "%s", sprite->var); \
+    return (TCL_OK); \
+  }
+
+
+int
+DoSpriteCmd(CLIENT_ARGS)
+{
+  SimSprite *sprite = (SimSprite *) clientData;
+  Tcl_HashEntry *ent;
+  int result = TCL_OK;
+  int (*cmd)();
+
+  if (argc < 2) {
+    return TCL_ERROR;
+  }
+
+  if (ent = Tcl_FindHashEntry(&SpriteCmds, argv[1])) {
+    cmd = (int (*)())ent->clientData;
+    Tk_Preserve((ClientData) sprite);
+    result = cmd(sprite, interp, argc, argv);
+    Tk_Release((ClientData) sprite);
+  } else {
+    Tcl_AppendResult(interp, "unknown command name: \"",
+                    argv[0], " ", argv[1], "\".", (char *) NULL);
+    result = TCL_ERROR;
+  }
+  return result;
+}
+
+
+int
+SpriteCmd(CLIENT_ARGS)
+{
+  SimSprite *sprite;
+  int type;
+
+  if ((argc != 3) ||
+      (Tcl_GetInt(interp, argv[2], &type) != TCL_OK) ||
+      (type < 1) || (type >= OBJN)) {
+    return TCL_ERROR;
+  }
+
+  sprite = NewSprite(argv[1], type, 0, 0);
+  sprite->frame = 0;
+
+  Tcl_CreateCommand(interp, sprite->name,
+                   DoSpriteCmd, (ClientData) sprite, (void (*)()) NULL);
+
+  interp->result = sprite->name;
+  return TCL_OK;
+}
+
+
+SPRITECMD_GET_STR(name)
+SPRITECMD_ACCESS_INT(type)
+SPRITECMD_ACCESS_INT(frame)
+SPRITECMD_ACCESS_INT(x)
+SPRITECMD_ACCESS_INT(y)
+SPRITECMD_ACCESS_INT(width)
+SPRITECMD_ACCESS_INT(height)
+SPRITECMD_ACCESS_INT(x_offset)
+SPRITECMD_ACCESS_INT(y_offset)
+SPRITECMD_ACCESS_INT(x_hot)
+SPRITECMD_ACCESS_INT(y_hot)
+SPRITECMD_ACCESS_INT(orig_x)
+SPRITECMD_ACCESS_INT(orig_y)
+SPRITECMD_ACCESS_INT(dest_x)
+SPRITECMD_ACCESS_INT(dest_y)
+SPRITECMD_ACCESS_INT(count)
+SPRITECMD_ACCESS_INT(sound_count)
+SPRITECMD_ACCESS_INT(dir)
+SPRITECMD_ACCESS_INT(new_dir)
+SPRITECMD_ACCESS_INT(step)
+SPRITECMD_ACCESS_INT(flag)
+SPRITECMD_ACCESS_INT(control)
+SPRITECMD_ACCESS_INT(turn)
+SPRITECMD_ACCESS_INT(accel)
+SPRITECMD_ACCESS_INT(speed)
+
+
+int SpriteCmdExplode(SPRITE_ARGS)
+{
+  ExplodeSprite(sprite);
+  return TCL_OK;
+}
+
+
+int SpriteCmdInit(SPRITE_ARGS)
+{
+  int x, y;
+
+  if (argc != 4) {
+    return (TCL_ERROR);
+  }
+  if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK) ||
+      (x < 0) || (x >= (WORLD_X <<4)) ||
+      (Tcl_GetInt(interp, argv[3], &y) != TCL_OK) ||
+      (y < 0) || (y >= (WORLD_Y <<4))) {
+    return (TCL_ERROR);
+  }
+  InitSprite(sprite, x, y);
+  return TCL_OK;
+}
+
+
+sprite_command_init()
+{
+  int i;
+
+  Tcl_CreateCommand(tk_mainInterp, "sprite", SpriteCmd,
+                   (ClientData)NULL, (void (*)()) NULL);
+
+  Tcl_InitHashTable(&SpriteCmds, TCL_STRING_KEYS);
+
+#define SPRITE_CMD(cmd) HASHED_CMD(Sprite, cmd)
+
+  SPRITE_CMD(name);
+  SPRITE_CMD(type);
+  SPRITE_CMD(frame);
+  SPRITE_CMD(x);
+  SPRITE_CMD(y);
+  SPRITE_CMD(width);
+  SPRITE_CMD(height);
+  SPRITE_CMD(x_offset);
+  SPRITE_CMD(y_offset);
+  SPRITE_CMD(x_hot);
+  SPRITE_CMD(y_hot);
+  SPRITE_CMD(orig_x);
+  SPRITE_CMD(orig_y);
+  SPRITE_CMD(dest_x);
+  SPRITE_CMD(dest_y);
+  SPRITE_CMD(count);
+  SPRITE_CMD(sound_count);
+  SPRITE_CMD(dir);
+  SPRITE_CMD(new_dir);
+  SPRITE_CMD(step);
+  SPRITE_CMD(flag);
+  SPRITE_CMD(control);
+  SPRITE_CMD(turn);
+  SPRITE_CMD(accel);
+  SPRITE_CMD(speed);
+  SPRITE_CMD(Explode);
+  SPRITE_CMD(Init);
+
+  for (i = 0; i < OBJN; i++) {
+    GlobalSprites[i] = NULL;
+  }
+}
+
+
+SimSprite *FreeSprites = NULL;
+
+SimSprite *
+NewSprite(char *name, int type, int x, int y)
+{
+  SimSprite *sprite;
+
+  if (FreeSprites) {
+    sprite = FreeSprites;
+    FreeSprites = sprite->next;
+  } else {
+    sprite = (SimSprite *)ckalloc(sizeof (SimSprite));
+  }
+
+  sprite->name = (char *)ckalloc(strlen(name) + 1);
+  strcpy(sprite->name, name);
+  sprite->type = type;
+
+  InitSprite(sprite, x, y);
+
+  sim->sprites++; sprite->next = sim->sprite; sim->sprite = sprite;
+
+  return sprite;
+}
+
+
+InitSprite(SimSprite *sprite, int x, int y)
+{
+  sprite->x = x; sprite->y = y;
+  sprite->frame = 0;
+  sprite->orig_x = sprite->orig_y = 0;
+  sprite->dest_x = sprite->dest_y = 0;
+  sprite->count = sprite->sound_count = 0;
+  sprite->dir = sprite->new_dir = 0;
+  sprite->step = sprite->flag = 0;
+  sprite->control = -1;
+  sprite->turn = 0;
+  sprite->accel = 0;
+  sprite->speed = 100;
+
+  if (GlobalSprites[sprite->type] == NULL) {
+    GlobalSprites[sprite->type] = sprite;
+  }
+
+  switch (sprite->type) {
+
+  case TRA:
+    sprite->width = sprite->height = 32;
+    sprite->x_offset = 32; sprite->y_offset = -16;
+    sprite->x_hot = 40; sprite->y_hot = -8;
+    sprite->frame = 1;
+    sprite->dir = 4;
+    break;
+
+  case SHI:
+    sprite->width = sprite->height = 48;
+    sprite->x_offset = 32; sprite->y_offset = -16;
+    sprite->x_hot = 48; sprite->y_hot = 0;
+    if (x < (4 <<4)) sprite->frame = 3;
+    else if (x >= ((WORLD_X - 4) <<4)) sprite->frame = 7;
+    else if (y < (4 <<4)) sprite->frame = 5;
+    else if (y >= ((WORLD_Y - 4) <<4)) sprite->frame = 1;
+    else sprite->frame = 3;
+    sprite->new_dir = sprite->frame;
+    sprite->dir = 10;
+    sprite->count = 1;
+    break;
+
+  case GOD:
+    sprite->width = sprite->height = 48;
+    sprite->x_offset = 24; sprite->y_offset = 0;
+    sprite->x_hot = 40; sprite->y_hot = 16;
+    if (x > ((WORLD_X <<4) / 2)) {
+      if (y > ((WORLD_Y <<4) / 2)) sprite->frame = 10;
+      else sprite->frame = 7;
+    } else if (y > ((WORLD_Y <<4) / 2)) sprite->frame = 1;
+    else sprite->frame = 4;
+    sprite->count = 1000;
+    sprite->dest_x = PolMaxX <<4;
+    sprite->dest_y = PolMaxY <<4;
+    sprite->orig_x = sprite->x;
+    sprite->orig_y = sprite->y;
+    break;
+
+  case COP:
+    sprite->width = sprite->height = 32;
+    sprite->x_offset = 32; sprite->y_offset = -16;
+    sprite->x_hot = 40; sprite->y_hot = -8;
+    sprite->frame = 5;
+    sprite->count = 1500;
+    sprite->dest_x = Rand((WORLD_X <<4) - 1);
+    sprite->dest_y = Rand((WORLD_Y <<4) - 1);
+    sprite->orig_x = x - 30;
+    sprite->orig_y = y;
+    break;
+
+  case AIR:
+    sprite->width = sprite->height = 48;
+    sprite->x_offset = 24; sprite->y_offset = 0;
+    sprite->x_hot = 48; sprite->y_hot = 16;
+    if (x > ((WORLD_X - 20) <<4)) {
+      sprite->x -= 100 + 48;
+      sprite->dest_x = sprite->x - 200;
+      sprite->frame = 7;
+    } else {
+      sprite->dest_x = sprite->x + 200;
+      sprite->frame = 11;
+    }
+    sprite->dest_y = sprite->y;
+    break;
+
+  case TOR:
+    sprite->width = sprite->height = 48;
+    sprite->x_offset = 24; sprite->y_offset = 0;
+    sprite->x_hot = 40; sprite->y_hot = 36;
+    sprite->frame = 1;
+    sprite->count = 200;
+    break;
+
+  case EXP:
+    sprite->width = sprite->height = 48;
+    sprite->x_offset = 24; sprite->y_offset = 0;
+    sprite->x_hot = 40; sprite->y_hot = 16;
+    sprite->frame = 1;
+    break;
+
+  case BUS:
+    sprite->width = sprite->height = 32;
+    sprite->x_offset = 30; sprite->y_offset = -18;
+    sprite->x_hot = 40; sprite->y_hot = -8;
+    sprite->frame = 1;
+    sprite->dir = 1;
+    break;
+
+  }
+}
+
+
+DestroyAllSprites()
+{
+  SimSprite *sprite;
+
+  for (sprite = sim->sprite; sprite != NULL; sprite = sprite->next) {
+    sprite->frame = 0;
+  }
+}
+
+
+DestroySprite(SimSprite *sprite)
+{
+  SimView *view;
+  SimSprite **sp;
+
+  for (view = sim->editor; view != NULL; view = view->next)
+    if (view->follow == sprite)
+      view->follow = NULL;
+
+  if (GlobalSprites[sprite->type] == sprite) {
+    GlobalSprites[sprite->type] = (SimSprite *)NULL;
+  }
+
+  if (sprite->name != NULL) {
+    ckfree(sprite->name);
+    sprite->name = NULL;
+  }
+
+  for (sp = &sim->sprite; *sp != NULL; sp = &((*sp)->next)) {
+    if (sprite == (*sp)) {
+      *sp = sprite->next;
+      break;
+    }
+  }
+
+  sprite->next = FreeSprites;
+  FreeSprites = sprite;
+}
+
+
+SimSprite *
+GetSprite(int type)
+{
+  SimSprite *sprite;
+
+  if (((sprite = GlobalSprites[type]) == NULL) ||
+      (sprite->frame == 0))
+    return (SimSprite *)NULL;
+  else
+    return sprite;
+}
+
+
+SimSprite *
+MakeSprite(int type, int x, int y)
+{
+  SimSprite *sprite;
+  
+  if ((sprite = GlobalSprites[type]) == NULL) {
+    sprite = NewSprite("", type, x, y);
+  } else {
+    InitSprite(sprite, x, y);
+  }
+  return sprite;
+}
+
+
+SimSprite *
+MakeNewSprite(int type, int x, int y)
+{
+  SimSprite *sprite;
+  
+  sprite = NewSprite("", type, x, y);
+  return sprite;
+}
+
+
+DrawObjects(SimView *view)
+{
+  SimSprite *sprite;
+
+  /* XXX: sort these by layer */
+/*
+  if (z = Oframe[TRA]) DrawTrain(view, z);
+  if (z = Oframe[SHI]) DrawBoat(view, z);
+  if (z = Oframe[GOD]) DrawMonster(view, z);
+  if (z = Oframe[COP]) DrawCopter(view, z);
+  if (z = Oframe[AIR]) DrawPlane(view, z);
+  if (z = Oframe[TOR]) DrawTor(view, z);
+  if (z = Oframe[EXP]) DrawExp(view, z);
+*/
+
+  for (sprite = sim->sprite; sprite != NULL; sprite = sprite->next) {
+    DrawSprite(view, sprite);
+  }
+}
+
+
+DrawSprite(SimView *view, SimSprite *sprite)
+{
+  Pixmap pict, mask;
+  int x, y, i;
+
+  if (sprite->frame == 0)
+    return;
+
+  i = (sprite->frame - 1) * 2;
+  pict = view->x->objects[sprite->type][i];
+  mask = view->x->objects[sprite->type][i + 1];
+
+  x = sprite->x
+        - ((view->tile_x <<4) - view->screen_x)
+       + sprite->x_offset;
+  y = sprite->y 
+        - ((view->tile_y <<4) - view->screen_y)
+       + sprite->y_offset;
+
+  XSetClipMask(view->x->dpy, view->x->gc, mask);
+  XSetClipOrigin(view->x->dpy, view->x->gc, x, y);
+  XCopyArea(view->x->dpy, pict, view->pixmap2, view->x->gc, 
+           0, 0, sprite->width, sprite->height, x, y);
+  XSetClipMask(view->x->dpy, view->x->gc, None);
+  XSetClipOrigin(view->x->dpy, view->x->gc, 0, 0);
+}
+
+
+short GetChar(int x, int y)
+{
+  x >>= 4;
+  y >>= 4;
+  if (!TestBounds(x, y))
+    return(-1);
+  else
+    return(Map[x][y] & LOMASK);
+}
+
+
+short TurnTo(int p, int d)
+{
+  if (p == d) return(p);
+  if (p < d)
+    if ((d - p) < 4) p++;
+    else p--;
+  else
+    if ((p - d) < 4) p--;
+    else p++;
+  if (p > 8) p = 1;
+  if (p < 1) p = 8;
+  return(p);
+}
+
+
+TryOther(int Tpoo, int Told, int Tnew)
+{
+  register short z;
+
+  z = Told + 4;
+  if (z > 8) z -= 8;
+  if (Tnew != z) return(0);
+  if ((Tpoo == POWERBASE) || (Tpoo == POWERBASE + 1) ||
+      (Tpoo == RAILBASE) || (Tpoo == RAILBASE + 1))
+    return(1);
+  return(0);
+}
+
+
+short SpriteNotInBounds(SimSprite *sprite)
+{
+  int x = sprite->x + sprite->x_hot;
+  int y = sprite->y + sprite->y_hot;
+
+  if ((x < 0) || (y < 0) ||
+      (x >= (WORLD_X <<4)) ||
+      (y >= (WORLD_Y <<4))) {
+    return (1);
+  }
+  return (0);
+}
+
+
+short GetDir(int orgX, int orgY, int desX, int desY)
+{
+  static short Gdtab[13] = { 0, 3, 2, 1, 3, 4, 5, 7, 6, 5, 7, 8, 1 };
+  int dispX, dispY, z;
+
+  dispX = desX - orgX;
+  dispY = desY - orgY;
+  if (dispX < 0)
+    if (dispY < 0) z = 11;
+    else z = 8;
+  else
+    if (dispY < 0) z = 2;
+    else z = 5;
+  if (dispX < 0) dispX = -dispX;
+  if (dispY < 0) dispY = -dispY;
+
+  absDist = dispX + dispY;
+
+  if ((dispX <<1) < dispY) z++;
+  else if ((dispY <<1) < dispY) z--;
+
+  if ((z < 0) || (z > 12)) z = 0;
+
+  return (Gdtab[z]);
+}
+
+
+GetDis(int x1, int y1, int x2, int y2)
+{
+  register short dispX, dispY;
+       
+  if (x1 > x2) dispX = x1 - x2;
+  else dispX = x2 - x1;
+  if (y1 > y2) dispY = y1 - y2;
+  else dispY = y2 - y1;
+
+  return (dispX + dispY);
+}
+
+
+int CheckSpriteCollision(SimSprite *s1, SimSprite *s2)
+{
+  if ((s1->frame != 0) && (s2->frame != 0) &&
+      GetDis(s1->x + s1->x_hot, s1->y + s1->y_hot,
+            s2->x + s2->x_hot, s2->y + s2->y_hot) < 30)
+    return(1);
+  return(0);
+}
+
+
+MoveObjects()
+{
+  SimSprite *sprite;
+
+  if (!SimSpeed) return;
+  Cycle++;
+
+  for (sprite = sim->sprite; sprite != NULL;) {
+    if (sprite->frame) {
+      switch (sprite->type) {
+      case TRA:
+       DoTrainSprite(sprite);
+       break;
+      case COP:
+       DoCopterSprite(sprite);
+       break;
+      case AIR:
+       DoAirplaneSprite(sprite);
+       break;
+      case SHI:
+       DoShipSprite(sprite);
+       break;
+      case GOD:
+       DoMonsterSprite(sprite);
+       break;
+      case TOR:
+       DoTornadoSprite(sprite);
+       break;
+      case EXP:
+       DoExplosionSprite(sprite);
+       break;
+      case BUS:
+       DoBusSprite(sprite);
+       break;
+      }
+      sprite = sprite->next;
+    } else {
+      if (sprite->name[0] == '\0') {
+       SimSprite *s = sprite;
+       sprite = sprite->next;
+       DestroySprite(s);
+      } else {
+       sprite = sprite->next;
+      }
+    }
+  }
+}
+
+
+DoTrainSprite(SimSprite *sprite)
+{
+  static short Cx[4] = {   0,  16,   0, -16 };
+  static short Cy[4] = { -16,   0,  16,   0 };
+  static short Dx[5] = {   0,   4,   0,  -4,   0 };
+  static short Dy[5] = {  -4,   0,   4,   0,   0 };
+  static short TrainPic2[5] = { 1, 2, 1, 2, 5 };
+  register short z, dir, dir2;
+  short c;
+
+  if ((sprite->frame == 3) || (sprite->frame == 4))
+    sprite->frame = TrainPic2[sprite->dir];
+  sprite->x += Dx[sprite->dir];
+  sprite->y += Dy[sprite->dir];
+  if (!(Cycle & 3)) {
+    dir = Rand16() & 3;
+    for (z = dir; z < (dir + 4); z++) {
+      dir2 = z & 3;
+      if (sprite->dir != 4) {
+       if (dir2 == ((sprite->dir + 2) & 3)) continue;
+      }
+      c = GetChar(sprite->x + Cx[dir2] + 48,
+                 sprite->y + Cy[dir2]);
+      if (((c >= RAILBASE) && (c <= LASTRAIL)) || /* track? */
+         (c == RAILVPOWERH) ||
+         (c == RAILHPOWERV)) {
+       if ((sprite->dir != dir2) &&
+           (sprite->dir != 4)) {
+         if ((sprite->dir + dir2) == 3)
+           sprite->frame = 3;
+         else
+           sprite->frame = 4;
+       } else
+         sprite->frame = TrainPic2[dir2];
+
+       if ((c == RAILBASE) || (c == (RAILBASE + 1)))
+         sprite->frame = 5;
+       sprite->dir = dir2;
+       return;
+      }
+    }
+    if (sprite->dir == 4) {
+      sprite->frame = 0;
+      return;
+    }
+    sprite->dir = 4;
+  }
+}
+
+
+DoCopterSprite(SimSprite *sprite)
+{
+  static short CDx[9] = { 0,  0,  3,  5,  3,  0, -3, -5, -3 };
+  static short CDy[9] = { 0, -5, -3,  0,  3,  5,  3,  0, -3 };
+  register short z, d, x, y;
+
+  if (sprite->sound_count > 0) sprite->sound_count--;
+
+  if (sprite->control < 0) {
+
+    if (sprite->count > 0) sprite->count--;
+
+    if (!sprite->count) {
+      /* Attract copter to monster and tornado so it blows up more often */
+      SimSprite *s = GetSprite(GOD);
+      if (s != NULL) {
+       sprite->dest_x = s->x;
+       sprite->dest_y = s->y;
+      } else {
+       s = GetSprite(TOR);
+       if (s != NULL) {
+         sprite->dest_x = s->x;
+         sprite->dest_y = s->y;
+       } else {
+         sprite->dest_x = sprite->orig_x;
+         sprite->dest_y = sprite->orig_y;
+       }
+      }
+    }
+    if (!sprite->count) { /* land */
+      GetDir(sprite->x, sprite->y, sprite->orig_x, sprite->orig_y);
+      if (absDist < 30) {
+       sprite->frame = 0;
+       return;
+      }
+    }
+  } else {
+    GetDir(sprite->x, sprite->y, sprite->dest_x, sprite->dest_y);
+    if (absDist < 16) {
+      sprite->dest_x = sprite->orig_x;
+      sprite->dest_y = sprite->orig_y;
+      sprite->control = -1;
+    }
+  }
+
+  if (!sprite->sound_count) { /* send report  */
+    x = (sprite->x + 48) >>5;
+    y = sprite->y >>5;
+    if ((x >= 0) &&
+       (x < (WORLD_X >>1)) &&
+       (y >= 0) &&
+       (y < (WORLD_Y >>1))) {
+      /* Don changed from 160 to 170 to shut the #$%#$% thing up! */
+      if ((TrfDensity[x][y] > 170) && ((Rand16() & 7) == 0)) {
+       SendMesAt(-41, (x <<1) + 1, (y <<1) + 1);
+       MakeSound("city", "HeavyTraffic"); /* chopper */
+       sprite->sound_count = 200;
+      }
+    }
+  }
+  z = sprite->frame;
+  if (!(Cycle & 3)) {
+    d = GetDir(sprite->x, sprite->y, sprite->dest_x, sprite->dest_y);
+    z = TurnTo(z, d);
+    sprite->frame = z;
+  }
+
+  sprite->x += CDx[z];
+  sprite->y += CDy[z];
+}
+
+
+DoAirplaneSprite(SimSprite *sprite)
+{
+  static short CDx[12] = { 0,  0,  6,  8,  6,  0, -6, -8, -6,  8,  8,  8 };
+  static short CDy[12] = { 0, -8, -6,  0,  6,  8,  6,  0, -6,  0,  0,  0 };
+
+  register short z, d;
+
+  z = sprite->frame;
+       
+  if (!(Cycle % 5)) {
+    if (z > 8) { /* TakeOff  */
+      z--;
+      if (z < 9) z = 3;
+      sprite->frame = z;
+    } else { /* goto destination */
+      d = GetDir(sprite->x, sprite->y, sprite->dest_x, sprite->dest_y);
+      z = TurnTo(z, d);
+      sprite->frame = z;
+    }
+  }    
+
+  if (absDist < 50) { /* at destination  */
+    sprite->dest_x = Rand((WORLD_X * 16) + 100) - 50;
+    sprite->dest_y = Rand((WORLD_Y * 16) + 100) - 50;
+  }
+
+  /* deh added test for !Disasters */
+  if (!NoDisasters) {
+    SimSprite *s;
+    int explode = 0;
+
+    for (s = sim->sprite; s != NULL; s = s->next) {
+      if ((s->frame != 0) &&
+         ((s->type == COP) ||
+          ((sprite != s) &&
+           (s->type == AIR))) &&
+         CheckSpriteCollision(sprite, s)) {
+       ExplodeSprite(s);
+       explode = 1;
+      }
+    }
+    if (explode)
+      ExplodeSprite(sprite);
+  }
+
+  sprite->x += CDx[z];
+  sprite->y += CDy[z];
+  if (SpriteNotInBounds(sprite)) sprite->frame = 0;
+}
+
+
+DoShipSprite(SimSprite *sprite)
+{
+  static short BDx[9] = { 0,  0,  1,  1,  1,  0, -1, -1, -1 };
+  static short BDy[9] = { 0, -1, -1,  0,  1,  1,  1,  0, -1 };
+  static short BPx[9] = { 0,  0,  2,  2,  2,  0, -2, -2, -2 };
+  static short BPy[9] = { 0, -2, -2,  0,  2,  2,  2,  0, -2 };
+  static short BtClrTab[8] = { RIVER, CHANNEL, POWERBASE, POWERBASE + 1,
+                              RAILBASE, RAILBASE + 1, BRWH, BRWV };
+  register short x, y, z, t = RIVER;
+  short tem, pem;
+
+  if (sprite->sound_count > 0) sprite->sound_count--;
+  if (!sprite->sound_count) {
+    if ((Rand16() & 3) == 1) {
+      if ((ScenarioID == 2) && /* San Francisco */
+         (Rand(10) < 5)) {
+       MakeSound("city", "HonkHonk-Low -speed 80");
+      } else {
+       MakeSound("city", "HonkHonk-Low");
+      }
+    }
+    sprite->sound_count = 200;
+  }
+
+  if (sprite->count > 0) sprite->count--;
+  if (!sprite->count) {
+    sprite->count = 9;
+    if (sprite->frame != sprite->new_dir) {
+      sprite->frame = TurnTo(sprite->frame, sprite->new_dir);
+      return;
+    }
+    tem = Rand16() & 7;
+    for (pem = tem; pem < (tem + 8); pem++) {
+      z = (pem & 7) + 1;
+
+      if (z == sprite->dir) continue;
+      x = ((sprite->x + (48 - 1)) >>4) + BDx[z];
+      y = (sprite->y >>4) + BDy[z];
+      if (TestBounds(x, y)) {
+       t = Map[x][y] & LOMASK;
+       if ((t == CHANNEL) || (t == BRWH) || (t == BRWV) ||
+           TryOther(t, sprite->dir, z)) {
+         sprite->new_dir = z;
+         sprite->frame = TurnTo(sprite->frame, sprite->new_dir);
+         sprite->dir = z + 4;
+         if (sprite->dir > 8) sprite->dir -= 8;
+         break;
+       }
+      }
+    }
+    if (pem == (tem + 8)) {
+      sprite->dir = 10;
+      sprite->new_dir = (Rand16() & 7) + 1;
+    }
+  } else {
+    z = sprite->frame;
+    if (z == sprite->new_dir)  {
+      sprite->x += BPx[z];
+      sprite->y += BPy[z];
+    }
+  }
+  if (SpriteNotInBounds(sprite)) {
+    sprite->frame = 0;
+    return;
+  }
+  for (z = 0; z < 8; z++) {
+    if (t == BtClrTab[z]) break;
+    if (z == 7) {
+      ExplodeSprite(sprite);
+      Destroy(sprite->x + 48, sprite->y);
+    }
+  }
+}
+
+
+DoMonsterSprite(SimSprite *sprite)
+{
+  static short Gx[5] = {  2,  2, -2, -2,  0 };
+  static short Gy[5] = { -2,  2,  2, -2,  0 };
+  static short ND1[4] = {  0,  1,  2,  3 };
+  static short ND2[4] = {  1,  2,  3,  0 };
+  static short nn1[4] = {  2,  5,  8, 11 };
+  static short nn2[4] = { 11,  2,  5,  8 };
+  register short d, z, c;
+
+  if (sprite->sound_count > 0) sprite->sound_count--;
+
+  if (sprite->control < 0) {
+    /* business as usual */
+
+    if (sprite->control == -2) {
+      d = (sprite->frame - 1) / 3;
+      z = (sprite->frame - 1) % 3;
+      if (z == 2) sprite->step = 0;
+      if (z == 0) sprite->step = 1;
+      if (sprite->step) z++;
+      else z--;
+      c = GetDir(sprite->x, sprite->y, sprite->dest_x, sprite->dest_y);
+      if (absDist < 18) {
+       sprite->control = -1;
+       sprite->count = 1000;
+       sprite->flag = 1;
+       sprite->dest_x = sprite->orig_x;
+       sprite->dest_y = sprite->orig_y;
+      } else {
+       c = (c - 1) / 2;
+       if (((c != d) && (!Rand(5))) ||
+           (!Rand(20))) {
+         int diff = (c - d) & 3;
+         if ((diff == 1) || (diff == 3)) {
+           d = c;
+         } else {
+           if (Rand16() & 1) d++; else d--;
+           d &= 3;
+         }
+       } else {
+         if (!Rand(20)) {
+           if (Rand16() & 1) d++; else d--;
+           d &= 3;
+         }
+       }
+      }
+    } else {
+
+      d = (sprite->frame - 1) / 3;
+
+      if (d < 4) { /* turn n s e w */
+       z = (sprite->frame - 1) % 3;
+       if (z == 2) sprite->step = 0;
+       if (z == 0) sprite->step = 1;
+       if (sprite->step) z++;
+       else z--;
+       GetDir(sprite->x, sprite->y, sprite->dest_x, sprite->dest_y);
+       if (absDist < 60) {
+         if (sprite->flag == 0) {
+           sprite->flag = 1;
+           sprite->dest_x = sprite->orig_x;
+           sprite->dest_y = sprite->orig_y;
+         } else {
+           sprite->frame = 0;
+           return;
+         }
+       }
+       c = GetDir(sprite->x, sprite->y, sprite->dest_x, sprite->dest_y);
+       c = (c - 1) / 2;
+       if ((c != d) && (!Rand(10))) {
+         if (Rand16() & 1) z = ND1[d];
+         else z = ND2[d];
+         d = 4;
+         if (!sprite->sound_count) {
+           MakeSound("city", "Monster -speed [MonsterSpeed]"); /* monster */
+           sprite->sound_count = 50 + Rand(100);
+         }
+       }
+      } else {
+       d = 4;
+       c = sprite->frame;
+       z = (c - 13) & 3;
+       if (!(Rand16() & 3)) {
+         if (Rand16() & 1) z = nn1[z];
+         else z = nn2[z];
+         d = (z - 1) / 3;
+         z = (z - 1) % 3;
+       }
+      }
+    }
+  } else {
+    /* somebody's taken control of the monster */
+
+    d = sprite->control;
+    z = (sprite->frame - 1) % 3;
+
+    if (z == 2) sprite->step = 0;
+    if (z == 0) sprite->step = 1;
+    if (sprite->step) z++;
+    else z--;
+  }
+
+  z = (((d * 3) + z) + 1);
+  if (z > 16) z = 16;
+  sprite->frame = z;
+
+  sprite->x += Gx[d];
+  sprite->y += Gy[d];
+
+  if (sprite->count > 0) sprite->count--;
+  c = GetChar(sprite->x + sprite->x_hot, sprite->y + sprite->y_hot);
+  if ((c == -1) ||
+      ((c == RIVER) &&
+       (sprite->count != 0) &&
+       (sprite->control == -1))) {
+    sprite->frame = 0; /* kill zilla */
+  }
+
+  { SimSprite *s;
+    for (s = sim->sprite; s != NULL; s = s->next) {
+      if ((s->frame != 0) &&
+         ((s->type == AIR) ||
+          (s->type == COP) ||
+          (s->type == SHI) ||
+          (s->type == TRA)) &&
+         CheckSpriteCollision(sprite, s)) {
+         ExplodeSprite(s);
+       }
+      }
+    }
+
+  Destroy(sprite->x + 48, sprite->y + 16);
+}
+
+
+DoTornadoSprite(SimSprite *sprite)
+{
+  static short CDx[9] = {  2,  3,  2,  0, -2, -3 };
+  static short CDy[9] = { -2,  0,  2,  3,  2,  0 };
+  register short z;
+
+  z = sprite->frame;
+
+  if (z == 2) /* cycle animation... post Rel */
+    if (sprite->flag)
+      z = 3;
+    else
+      z = 1;
+  else {
+    if (z == 1)
+      sprite->flag = 1;
+    else
+      sprite->flag = 0;
+    z = 2;
+  }
+
+  if (sprite->count > 0) sprite->count--;
+
+  sprite->frame = z;
+
+  { SimSprite *s;
+    for (s = sim->sprite; s != NULL; s = s->next) {
+      if ((s->frame != 0) &&
+         ((s->type == AIR) ||
+          (s->type == COP) ||
+          (s->type == SHI) ||
+          (s->type == TRA)) &&
+         CheckSpriteCollision(sprite, s)) {
+         ExplodeSprite(s);
+       }
+      }
+    }
+
+  z = Rand(5);
+  sprite->x += CDx[z];
+  sprite->y += CDy[z];
+  if (SpriteNotInBounds(sprite)) sprite->frame = 0;
+
+  if ((sprite->count != 0) &&
+      (!Rand(500)))
+    sprite->frame = 0;
+
+  Destroy(sprite->x + 48, sprite->y + 40);
+}
+
+
+DoExplosionSprite(SimSprite *sprite)
+{
+  short x, y;
+
+  if (!(Cycle & 1)) {
+    if (sprite->frame == 1) {
+      MakeSound("city", "Explosion-High"); /* explosion */
+      x = (sprite->x >>4) + 3;
+      y = (sprite->y >>4);
+      SendMesAt(32, x, y);
+    }
+    sprite->frame++;
+  }
+
+  if (sprite->frame > 6) {
+    sprite->frame = 0;
+
+    StartFire(sprite->x + 48 - 8, sprite->y + 16);
+    StartFire(sprite->x + 48 - 24, sprite->y);
+    StartFire(sprite->x + 48 + 8, sprite->y);
+    StartFire(sprite->x + 48 - 24, sprite->y + 32);
+    StartFire(sprite->x + 48 + 8, sprite->y + 32);
+    return;
+  }
+}
+
+
+DoBusSprite(SimSprite *sprite)
+{
+  static short Dx[5] = {   0,   1,   0,  -1,   0 };
+  static short Dy[5] = {  -1,   0,   1,   0,   0 };
+  static short Dir2Frame[4] = { 1, 2, 1, 2 };
+  register int dir, dir2;
+  int c, dx, dy, crossed, tx, ty, otx, oty;
+  int turned = 0;
+  int speed, z;
+
+#ifdef DEBUGBUS
+printf("Bus dir %d turn %d frame %d\n",
+       sprite->dir, sprite->turn, sprite->frame);
+#endif
+
+  if (sprite->turn) {
+    if (sprite->turn < 0) { /* ccw */
+      if (sprite->dir & 1) { /* up or down */
+       sprite->frame = 4;
+      } else { /* left or right */
+       sprite->frame = 3;
+      }
+      sprite->turn++;
+      sprite->dir = (sprite->dir - 1) & 3;
+    } else { /* cw */
+      if (sprite->dir & 1) { /* up or down */
+       sprite->frame = 3;
+      } else { /* left or right */
+       sprite->frame = 4;
+      }
+      sprite->turn--;
+      sprite->dir = (sprite->dir + 1) & 3;
+    }
+    turned = 1;
+  } else {
+    /* finish turn */
+    if ((sprite->frame == 3) || (sprite->frame == 4)) {
+      turned = 1;
+      sprite->frame = Dir2Frame[sprite->dir];
+    }
+  }
+
+  if (sprite->speed == 0) {
+    /* brake */
+    dx = 0; dy = 0;
+  } else { /* cruise at traffic speed */
+
+    tx = (sprite->x + sprite->x_hot) >>5;
+    ty = (sprite->y + sprite->y_hot) >>5;
+    if ((tx >= 0) &&
+       (tx < (WORLD_X >>1)) &&
+       (ty >= 0) &&
+       (ty < (WORLD_Y >>1))) {
+      z = TrfDensity[tx][ty] >>6;
+      if (z > 1) z--;
+    } else z = 0;
+
+    switch (z) {
+    case 0:
+      speed = 8;
+      break;
+    case 1:
+      speed = 4;
+      break;
+    case 2:
+      speed = 1;
+      break;
+    }
+
+    /* govern speed */
+    if (speed > sprite->speed)
+      speed = sprite->speed;
+
+    if (turned) {
+#ifdef DEBUGBUS
+printf("turned\n");
+#endif
+      if (speed > 1) speed = 1;
+      dx = Dx[sprite->dir] * speed;
+      dy = Dy[sprite->dir] * speed;
+    } else {
+      dx = Dx[sprite->dir] * speed;
+      dy = Dy[sprite->dir] * speed;
+
+      tx = (sprite->x + sprite->x_hot) >>4;
+      ty = (sprite->y + sprite->y_hot) >>4;
+
+      /* drift into the right lane */
+      switch (sprite->dir) {
+      case 0: /* up */
+       z = ((tx <<4) + 4) - (sprite->x + sprite->x_hot);
+       if (z < 0) dx = -1;
+       else if (z > 0) dx = 1;
+#ifdef DEBUGBUS
+printf("moving up x %x z %d dx %d\n", sprite->x + sprite->x_hot, z, dx);
+#endif
+       break;
+      case 1: /* right */
+       z = ((ty <<4) + 4) - (sprite->y + sprite->y_hot);
+       if (z < 0) dy = -1;
+       else if (z > 0) dy = 1;
+#ifdef DEBUGBUS
+printf("moving right y %x z %d dy %d\n", sprite->y + sprite->y_hot, z, dy);
+#endif
+       break;
+      case 2: /* down */
+       z = ((tx <<4)) - (sprite->x + sprite->x_hot);
+       if (z < 0) dx = -1;
+       else if (z > 0) dx = 1;
+#ifdef DEBUGBUS
+printf("moving down x %x z %d dx %d\n", sprite->x + sprite->x_hot, z, dx);
+#endif
+       break;
+      case 3: /* left */
+       z = ((ty <<4)) - (sprite->y + sprite->y_hot);
+       if (z < 0) dy = -1;
+       else if (z > 0) dy = 1;
+#ifdef DEBUGBUS
+printf("moving left y %x z %d dy %d\n", sprite->y + sprite->y_hot, z, dy);
+#endif
+       break;
+      }
+    }
+  }
+#ifdef DEBUGBUS
+printf("speed dx %d dy %d\n", dx, dy);
+#endif
+
+#define AHEAD 8
+
+  otx = (sprite->x + sprite->x_hot + (Dx[sprite->dir] * AHEAD)) >>4;
+  oty = (sprite->y + sprite->y_hot + (Dy[sprite->dir] * AHEAD)) >>4;
+  if (otx < 0) otx = 0; else if (otx >= WORLD_X) otx = WORLD_X - 1;
+  if (oty < 0) oty = 0; else if (oty >= WORLD_Y) oty = WORLD_Y - 1;
+
+  tx = (sprite->x + sprite->x_hot + dx + (Dx[sprite->dir] * AHEAD)) >>4;
+  ty = (sprite->y + sprite->y_hot + dy + (Dy[sprite->dir] * AHEAD)) >>4;
+  if (tx < 0) tx = 0; else if (tx >= WORLD_X) tx = WORLD_X - 1;
+  if (ty < 0) ty = 0; else if (ty >= WORLD_Y) ty = WORLD_Y - 1;
+
+  if ((tx != otx) || (ty != oty)) {
+#ifdef DEBUGBUS
+printf("drive from tile %d %d to %d %d\n",
+       otx, oty, tx, ty);
+#endif
+    z = CanDriveOn(tx, ty);
+    if (z == 0) {
+      /* can't drive forward into a new tile */
+      if (speed == 8) {
+       bulldozer_tool(NULL, tx, ty);
+      } else {
+      }
+    } else {
+      /* drive forward into a new tile */
+      if (z > 0) {
+       /* smooth */
+      } else {
+       /* bumpy */
+       dx /= 2;
+       dy /= 2;
+      }
+    }
+  }
+
+  tx = (sprite->x + sprite->x_hot + dx) >>4;
+  ty = (sprite->y + sprite->y_hot + dy) >>4;
+  z = CanDriveOn(tx, ty);
+  if (z > 0) {
+    /* cool, cruise along */
+  } else {
+    if (z < 0) {
+      /* bumpy */
+    } else {
+      /* something in the way */
+    }
+  }
+
+  sprite->x += dx;
+  sprite->y += dy;
+
+  if (!NoDisasters) {
+    SimSprite *s;
+    int explode = 0;
+
+    for (s = sim->sprite; s != NULL; s = s->next) {
+      if ((sprite != s) &&
+         (s->frame != 0) &&
+         ((s->type == BUS) ||
+          ((s->type == TRA) &&
+           (s->frame != 5))) &&
+         CheckSpriteCollision(sprite, s)) {
+       ExplodeSprite(s);
+       explode = 1;
+      }
+    }
+    if (explode)
+      ExplodeSprite(sprite);
+  }
+}
+
+
+int
+CanDriveOn(int x, int y)
+{
+  int tile;
+
+  if (!TestBounds(x, y))
+    return 0;
+
+  tile = Map[x][y] & LOMASK;
+
+  if (((tile >= ROADBASE) &&
+       (tile <= LASTROAD) &&
+       (tile != BRWH) &&
+       (tile != BRWV)) ||
+      (tile == HRAILROAD) ||
+      (tile == VRAILROAD))
+    return 1;
+
+  if ((tile == DIRT) || tally(tile))
+    return -1;
+
+  return 0;
+}
+
+
+ExplodeSprite(SimSprite *sprite)
+{
+  int x, y;
+
+  sprite->frame = 0;
+
+  x = sprite->x + sprite->x_hot;
+  y = sprite->y + sprite->y_hot;
+  MakeExplosionAt(x, y);
+
+  x = (x >>4);
+  y = (y >>4);
+
+  switch (sprite->type) {
+  case AIR:
+    CrashX = x;
+    CrashY = y;
+    SendMesAt(-24, x, y);
+    break;
+  case SHI:
+    CrashX = x;
+    CrashY = y;
+    SendMesAt(-25, x, y);
+    break;
+  case TRA:
+    CrashX = x;
+    CrashY = y;
+    SendMesAt(-26, x, y);
+    break;
+  case COP:
+    CrashX = x;
+    CrashY = y;
+    SendMesAt(-27, x, y);
+    break;
+  case BUS:
+    CrashX = x;
+    CrashY = y;
+    SendMesAt(-26, x, y); /* XXX for now */
+    break;
+  }
+  MakeSound("city", "Explosion-High"); /* explosion */
+  return;
+}
+
+
+int checkWet(int x)
+{
+  if ((x == POWERBASE) || (x == POWERBASE + 1) ||
+      (x == RAILBASE) || (x == RAILBASE + 1) ||
+      (x == BRWH) || (x == BRWV))
+    return(1);
+  else
+    return(0);
+}
+
+
+Destroy(int ox, int oy)
+{
+  short t, z, x, y;
+       
+  x = ox >>4;
+  y = oy >>4;
+  if (!TestBounds(x, y))
+    return;
+  z = Map[x][y];
+  t = z & LOMASK;
+  if (t >= TREEBASE) {
+    /* TILE_IS_BRIDGE(t) */
+    if (!(z & BURNBIT)) {              
+      if ((t >= ROADBASE) && (t <= LASTROAD))
+       Map[x][y] = RIVER;
+      return;
+    }
+    if (z & ZONEBIT) {
+      OFireZone(x, y, z);
+      if (t > RZB) {
+       MakeExplosionAt(ox, oy);
+      }
+    }
+    if (checkWet(t))
+      Map[x][y] = RIVER;
+    else
+      Map[x][y] = (DoAnimation
+                  ? TINYEXP
+                  : (LASTTINYEXP - 3)) | BULLBIT | ANIMBIT;
+  }
+}
+
+
+OFireZone(int Xloc, int Yloc, int ch)
+{
+  register short Xtem, Ytem;
+  short x, y, XYmax;
+
+  RateOGMem[Xloc >>3][Yloc >>3] -= 20;
+
+  ch &= LOMASK;
+  if (ch < PORTBASE)
+    XYmax = 2;
+  else
+    if (ch == AIRPORT) XYmax = 5;
+    else XYmax = 4;
+
+  for (x = -1; x < XYmax; x++)
+    for (y = -1; y < XYmax; y++) {
+      Xtem = Xloc + x;
+      Ytem = Yloc + y;
+      if ((Map[Xtem][Ytem] & LOMASK) >= ROADBASE)
+       Map[Xtem][Ytem] |= BULLBIT;
+    }
+}
+
+
+StartFire(int x, int y)
+{
+  register t, z;
+
+  x >>= 4;
+  y >>= 4;
+  if ((x >= WORLD_X) ||
+      (y >= WORLD_Y) ||
+      (x < 0) || (y < 0))
+    return;
+  z = Map[x][y];
+  t = z & LOMASK;
+  if ((!(z & BURNBIT)) && (t != 0)) return;
+  if (z & ZONEBIT) return;
+  Map[x][y] = FIRE + (Rand16() & 3) + ANIMBIT;
+}
+
+
+GenerateTrain(int x, int y)
+{
+  if ((TotalPop > 20) &&
+      (GetSprite(TRA) == NULL) &&
+      (!Rand(25))) {
+    MakeSprite(TRA, (x <<4) + TRA_GROOVE_X, (y <<4) + TRA_GROOVE_Y);
+  }
+}
+
+
+GenerateBus(int x, int y)
+{
+  if ((GetSprite(BUS) == NULL) &&
+      (!Rand(25))) {
+    MakeSprite(BUS, (x <<4) + BUS_GROOVE_X, (y <<4) + BUS_GROOVE_Y);
+  }
+}
+
+
+GenerateShip(void)
+{
+  register short x, y;
+
+  if (!(Rand16() & 3))
+    for (x = 4; x < WORLD_X - 2; x++)
+      if (Map[x][0] == CHANNEL)  {
+       MakeShipHere(x, 0);
+       return;
+      }
+  if (!(Rand16() & 3))
+    for (y = 1; y < WORLD_Y - 2; y++)
+      if (Map[0][y] == CHANNEL)  {
+       MakeShipHere(0, y);
+       return;
+      }
+  if (!(Rand16() & 3))
+    for (x = 4; x < WORLD_X - 2; x++)                  
+      if (Map[x][WORLD_Y - 1] == CHANNEL)  {
+       MakeShipHere(x, WORLD_Y - 1);
+       return;
+      }
+  if (!(Rand16() & 3))
+    for (y = 1; y < WORLD_Y - 2; y++)
+      if (Map[WORLD_X - 1][y] == CHANNEL)  {
+       MakeShipHere(WORLD_X - 1, y);
+       return;
+      }
+}
+
+
+MakeShipHere(int x, int y, int z)      
+{
+  MakeSprite(SHI, (x <<4) - (48 - 1), (y <<4));
+}
+
+
+MakeMonster(void)
+{
+  register x, y, z, done = 0;
+  SimSprite *sprite;
+
+  if ((sprite = GetSprite(GOD)) != NULL) {
+    sprite->sound_count = 1;
+    sprite->count = 1000;
+    sprite->dest_x = PolMaxX <<4;
+    sprite->dest_y = PolMaxY <<4;
+    return;
+  }
+
+  for (z = 0; z < 300; z++)  {
+    x = Rand(WORLD_X - 20) + 10;
+    y = Rand(WORLD_Y - 10) + 5;
+    if ((Map[x][y] == RIVER) || (Map[x][y] == RIVER + BULLBIT)) {
+      MonsterHere(x, y);
+      done = 1;
+      break;
+    }
+  }
+  if (!done == 0)
+    MonsterHere(60, 50);
+}
+
+
+MonsterHere(int x, int y)
+{
+  short z;
+
+  MakeSprite(GOD, (x <<4) + 48, (y <<4));
+  ClearMes();
+  SendMesAt(-21, x + 5, y);
+}
+
+
+GenerateCopter(int x, int y)
+{
+  if (GetSprite(COP) != NULL) return;
+
+  MakeSprite(COP, (x <<4), (y <<4) + 30);
+}
+
+
+GeneratePlane(int x, int y)
+{
+  if (GetSprite(AIR) != NULL) return;
+
+  MakeSprite(AIR, (x <<4) + 48, (y <<4) + 12);
+}
+
+
+MakeTornado(void)
+{
+  short x, y;
+  SimSprite *sprite;
+
+  if ((sprite = GetSprite(TOR)) != NULL) {
+    sprite->count = 200;
+    return;
+  }
+
+  x = Rand((WORLD_X <<4) - 800) + 400;
+  y = Rand((WORLD_Y <<4) - 200) + 100;
+  MakeSprite(TOR, x, y);
+  ClearMes();
+  SendMesAt(-22, (x >>4) + 3, (y >>4) + 2);
+}
+
+
+MakeExplosion(int x, int y)
+{
+  if ((x >= 0) && (x < WORLD_X) &&
+      (y >= 0) && (y < WORLD_Y)) {
+    MakeExplosionAt((x << 4) + 8, (y << 4) + 8);
+  }
+}
+
+
+MakeExplosionAt(int x, int y)
+{
+  MakeNewSprite(EXP, x - 40, y - 16);
+}
+
diff --git a/src/sim/w_stubs.c b/src/sim/w_stubs.c
new file mode 100644 (file)
index 0000000..d55ce03
--- /dev/null
@@ -0,0 +1,198 @@
+/* w_stubs.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+/* Stubs */
+
+
+QUAD TotalFunds;
+short PunishCnt;
+short autoBulldoze, autoBudget;
+QUAD LastMesTime;
+short GameLevel;
+short InitSimLoad;
+short ScenarioID;
+short SimSpeed;
+short SimMetaSpeed;
+short UserSoundOn;
+char *CityName;
+short NoDisasters;
+short MesNum;
+short EvalChanged;
+short flagBlink;
+
+
+Spend(int dollars)
+{
+  SetFunds(TotalFunds - dollars);
+}
+
+
+SetFunds(int dollars)
+{
+  TotalFunds = dollars;
+  UpdateFunds();
+}
+
+
+/* Mac */
+
+QUAD TickCount()
+{
+  struct timeval time;
+
+  gettimeofday(&time, 0);
+
+  return (QUAD)((time.tv_sec / 60) + (time.tv_usec * 1000000 / 60));
+}
+
+
+Ptr
+NewPtr(size)
+int size;
+{
+  return ((Ptr)calloc(size, sizeof(Byte)));
+}
+
+
+/* w_hlhandlers.c */
+
+GameStarted()
+{
+  InvalidateMaps();
+  InvalidateEditors();
+  gettimeofday(&start_time, NULL);
+
+  switch (Startup) {
+  case -2: /* Load a city */
+    if (LoadCity(StartupName)) {
+      DoStartLoad();
+      StartupName = NULL;
+      break;
+    }
+    StartupName = NULL;
+  case -1:
+    if (StartupName != NULL) {
+      setCityName(StartupName);
+      StartupName = NULL;
+    } else {
+      setCityName("NowHere");
+    }
+    DoPlayNewCity();
+    break;
+  case 0:
+    DoReallyStartGame();
+    break;
+  default: /* scenario number */
+    DoStartScenario(Startup);
+    break;
+  }
+}
+
+
+DoPlayNewCity()
+{
+  Eval("UIPlayNewCity");
+}
+
+
+DoReallyStartGame()
+{
+  Eval("UIReallyStartGame");
+}
+
+
+DoStartLoad()
+{
+  Eval("UIStartLoad");
+}
+
+
+DoStartScenario(int scenario)
+{
+  char buf[256];
+
+  sprintf(buf, "UIStartScenario %d", scenario);
+  Eval(buf);
+}
+
+
+DropFireBombs()
+{
+  Eval("DropFireBombs");
+}
+
+
+InitGame()
+{
+  sim_skips = sim_skip = sim_paused = sim_paused_speed = heat_steps = 0;
+  setSpeed(0);
+}
+
+
+ReallyQuit()
+{
+  sim_exit(0); // Just sets tkMustExit and ExitReturn
+}
+
+
diff --git a/src/sim/w_tk.c b/src/sim/w_tk.c
new file mode 100644 (file)
index 0000000..2a380b3
--- /dev/null
@@ -0,0 +1,832 @@
+/* w_tk.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+#ifdef MSDOS
+#define filename2UNIX(name)    \
+    {   char *p; for (p = name; *p; p++) if (*p == '\\') *p = '/'; }
+#else
+#define filename2UNIX(name)    /**/
+#endif
+
+
+Tcl_Interp *tk_mainInterp = NULL;
+Tcl_CmdBuf buffer = NULL;
+Tk_TimerToken sim_timer_token = 0;
+int sim_timer_idle = 0;
+int sim_timer_set = 0;
+Tk_Window MainWindow;
+int UpdateDelayed = 0;
+int AutoScrollEdge = 16;
+int AutoScrollStep = 16;
+int AutoScrollDelay = 10;
+Tk_TimerToken earthquake_timer_token;
+int earthquake_timer_set = 0;
+int earthquake_delay = 3000;
+int PerformanceTiming;
+double FlushTime;
+int NeedRest = 0;
+
+
+#define DEF_VIEW_FONT  "-Adobe-Helvetica-Bold-R-Normal-*-140-*"
+
+Tk_ConfigSpec TileViewConfigSpecs[] = {
+    {TK_CONFIG_FONT, "-font", (char *) NULL, (char *) NULL,
+       DEF_VIEW_FONT, Tk_Offset(SimView, fontPtr), 0},
+    {TK_CONFIG_STRING, "-messagevar", (char *) NULL, (char *) NULL,
+       NULL, Tk_Offset(SimView, message_var), 0},
+    {TK_CONFIG_PIXELS, "-width", "width", "Width",
+       0, Tk_Offset(SimView, width), 0},
+    {TK_CONFIG_PIXELS, "-height", "height", "Height",
+       0, Tk_Offset(SimView, height), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+
+int TileViewCmd(CLIENT_ARGS);
+int ConfigureTileView(Tcl_Interp *interp, SimView *view,
+                     int argc, char **argv, int flags);
+static void TileViewEventProc(ClientData clientData, XEvent *eventPtr);
+static void DestroyTileView(ClientData clientData);
+
+int ConfigureSimGraph(Tcl_Interp *interp, SimGraph *graph,
+                     int argc, char **argv, int flags);
+
+static void MicropolisTimerProc(ClientData clientData);
+
+int SimCmd(CLIENT_ARGS);
+int DoEditorCmd(CLIENT_ARGS);
+int DoMapCmd(CLIENT_ARGS);
+int GraphViewCmd(CLIENT_ARGS);
+int DoGraphCmd(CLIENT_ARGS);
+int SpriteCmd(CLIENT_ARGS);
+extern int Tk_PieMenuCmd();
+extern int Tk_IntervalCmd();
+
+
+int
+TileViewCmd(CLIENT_ARGS)
+{
+  Tk_Window tkwin = (Tk_Window) clientData;
+  SimView *view;
+  int viewclass;
+
+  if (argc < 2) {
+    Tcl_AppendResult(interp, "wrong # args:  should be \"",
+                    argv[0], " pathName ?options?\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  if (strcmp(argv[0], "editorview") == 0)
+    viewclass = Editor_Class;
+  else if (strcmp(argv[0], "mapview") == 0)
+    viewclass = Map_Class;
+  else {
+    return TCL_ERROR;
+  }
+
+  tkwin = Tk_CreateWindowFromPath(interp, tkwin,
+                                 argv[1], (char *) NULL);
+  if (tkwin == NULL) {
+    return TCL_ERROR;
+  }
+
+  view = (SimView *)ckalloc(sizeof (SimView));
+
+  view->tkwin = tkwin;
+  view->interp = interp;
+  view->flags = 0;
+
+  if (viewclass == Editor_Class) {
+    Tk_SetClass(view->tkwin, "EditorView");
+
+    Tk_CreateEventHandler(view->tkwin,
+                         VisibilityChangeMask |
+                         ExposureMask |
+                         StructureNotifyMask |
+                         EnterWindowMask |
+                         LeaveWindowMask |
+                         PointerMotionMask,
+                         TileViewEventProc, (ClientData) view);
+    Tcl_CreateCommand(interp, Tk_PathName(view->tkwin),
+                     DoEditorCmd, (ClientData) view, (void (*)()) NULL);
+  } else {
+    Tk_SetClass(view->tkwin, "MapView");
+
+    Tk_CreateEventHandler(view->tkwin,
+                         VisibilityChangeMask |
+                         ExposureMask |
+                         StructureNotifyMask /* |
+                         EnterWindowMask |
+                         LeaveWindowMask |
+                         PointerMotionMask */ ,
+                         TileViewEventProc, (ClientData) view);
+    Tcl_CreateCommand(interp, Tk_PathName(view->tkwin),
+                     DoMapCmd, (ClientData) view, (void (*)()) NULL);
+  }
+
+  Tk_MakeWindowExist(view->tkwin);
+
+  if (getenv("XSYNCHRONIZE") != NULL) {
+    XSynchronize(Tk_Display(tkwin), 1);
+  }
+
+  if (viewclass == Editor_Class) {
+    InitNewView(view, "MicropolisEditor", Editor_Class, EDITOR_W, EDITOR_H);
+    DoNewEditor(view);
+  } else {
+    InitNewView(view, "MicropolisMap", Map_Class, MAP_W, MAP_H);
+    DoNewMap(view);
+  }
+
+  if (ConfigureTileView(interp, view, argc-2, argv+2, 0) != TCL_OK) {
+    /* XXX: destroy view */
+    Tk_DestroyWindow(view->tkwin);
+    return TCL_ERROR;
+  }
+
+  switch (view->class) {
+  case Editor_Class:
+    break;
+  case Map_Class:
+    view->invalid = 1;
+    view->update = 1;
+    DoUpdateMap(view);
+    break;
+  }
+
+  interp->result = Tk_PathName(view->tkwin);
+  return TCL_OK;
+}
+
+
+int
+ConfigureTileView(Tcl_Interp *interp, SimView *view,
+            int argc, char **argv, int flags)
+{
+  if (Tk_ConfigureWidget(interp, view->tkwin, TileViewConfigSpecs,
+                        argc, argv, (char *) view, flags) != TCL_OK) {
+    return TCL_ERROR;
+  }
+
+  if (view->class == Map_Class) {
+    Tk_GeometryRequest(view->tkwin, MAP_W, MAP_H);
+  } else {
+    if (view->width || view->height) {
+      Tk_GeometryRequest(view->tkwin, view->width, view->height);
+    }
+  }
+  EventuallyRedrawView(view);
+  return TCL_OK;
+}
+
+
+InvalidateMaps()
+{
+  SimView *view;
+
+//fprintf(stderr, "InvalidateMaps\n");
+  for (view = sim->map; view != NULL; view = view->next) {
+    view->invalid = 1;
+    view->skip = 0;
+    EventuallyRedrawView(view);
+  }
+  sim_skip = 0;
+}
+
+
+InvalidateEditors()
+{
+  SimView *view;
+
+//fprintf(stderr, "InvalidateEditors\n");
+  for (view = sim->editor; view != NULL; view = view->next) {
+    view->invalid = 1;
+    view->skip = 0;
+    EventuallyRedrawView(view);
+  }
+  sim_skip = 0;
+}
+
+
+RedrawMaps()
+{
+  SimView *view;
+
+//fprintf(stderr, "RedrawMaps\n");
+
+  for (view = sim->map; view != NULL; view = view->next) {
+    view->skip = 0;
+    EventuallyRedrawView(view);
+  }
+  sim_skip = 0;
+}
+
+
+RedrawEditors()
+{
+  SimView *view;
+
+//fprintf(stderr, "RedrawEditors\n");
+
+  for (view = sim->editor; view != NULL; view = view->next) {
+    view->skip = 0;
+    EventuallyRedrawView(view);
+  }
+  sim_skip = 0;
+}
+
+
+static void
+DisplayTileView(ClientData clientData)
+{
+  SimView *view = (SimView *) clientData;
+  Tk_Window tkwin = view->tkwin;
+  Pixmap pm = None;
+  Drawable d;
+
+  view->flags &= ~VIEW_REDRAW_PENDING;
+  if (view->visible && (tkwin != NULL) && Tk_IsMapped(tkwin)) {
+    switch (view->class) {
+    case Editor_Class:
+      view->skip = 0;
+      view->update = 1;
+      DoUpdateEditor(view);
+      break;
+    case Map_Class:
+//fprintf(stderr, "DisplayTileView\n");
+      view->skip = 0;
+      view->update = 1;
+      DoUpdateMap(view);
+      break;
+    }
+  }
+}
+
+
+/* comefrom:
+    ConfigureTileView
+    TileViewEventProc expose configure motion
+    InvalidateMaps
+    EraserTo
+    DoSetMapState
+    AddInk
+    EraserTo
+ */
+
+EventuallyRedrawView(SimView *view)
+{
+  if (!(view->flags & VIEW_REDRAW_PENDING)) {
+    Tk_DoWhenIdle(DisplayTileView, (ClientData) view);
+    view->flags |= VIEW_REDRAW_PENDING;
+  }
+
+}
+
+
+CancelRedrawView(SimView *view)
+{
+  if (view->flags & VIEW_REDRAW_PENDING) {
+    Tk_CancelIdleCall(DisplayTileView, (ClientData) view);
+  }
+  view->flags &= ~VIEW_REDRAW_PENDING;
+}
+
+
+static void
+TileAutoScrollProc(ClientData clientData)
+{
+  SimView *view = (SimView *)clientData;
+  char buf[256];
+
+  if (view->tool_mode != 0) {
+    int dx = 0, dy = 0;
+    int result, root_x, root_y, x, y;
+    unsigned int key_buttons;
+    Window root, child;
+
+    XQueryPointer(Tk_Display(view->tkwin), Tk_WindowId(view->tkwin),
+                 &root, &child, &root_x, &root_y, &x, &y, &key_buttons);
+
+    if (x < AutoScrollEdge)
+      dx = -AutoScrollStep;
+    else if (x > (view->w_width - AutoScrollEdge))
+      dx = AutoScrollStep;
+    if (y < AutoScrollEdge)
+      dy = -AutoScrollStep;
+    else if (y > (view->w_height - AutoScrollEdge))
+      dy = AutoScrollStep;
+
+    if (dx || dy) {
+      int px = view->pan_x, py = view->pan_y;
+
+      if (view->tool_mode == -1) {
+       dx = -dx; dy = -dy;
+      }
+
+      DoPanBy(view, dx, dy);
+      view->tool_x += view->pan_x - px;
+      view->tool_y += view->pan_y - py;
+      view->auto_scroll_token =
+       Tk_CreateTimerHandler(AutoScrollDelay, TileAutoScrollProc,
+                             (ClientData) view);
+
+      sprintf(buf, "UIDidPan %s %d %d", Tk_PathName(view->tkwin), x, y);
+      Eval(buf);
+    }
+  }
+}
+
+
+static void
+TileViewEventProc(ClientData clientData, XEvent *eventPtr)
+{
+  SimView *view = (SimView *) clientData;
+
+  if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {
+    view->visible = 1;
+    EventuallyRedrawView(view);
+  } else if (eventPtr->type == MapNotify) {
+    view->visible = 1;
+  } else if (eventPtr->type == UnmapNotify) {
+    view->visible = 0;
+  } else if (eventPtr->type == VisibilityNotify) {
+    if (eventPtr->xvisibility.state == VisibilityFullyObscured)
+      view->visible = 0;
+    else
+      view->visible = 1;
+  } else if (eventPtr->type == ConfigureNotify) {
+    if (view->class == Editor_Class)
+      DoResizeView(view,
+                  eventPtr->xconfigure.width,
+                  eventPtr->xconfigure.height);
+    EventuallyRedrawView(view);
+  } else if (eventPtr->type == DestroyNotify) {
+    Tcl_DeleteCommand(view->interp, Tk_PathName(view->tkwin));
+    view->tkwin = NULL;
+    CancelRedrawView(view);
+    Tk_EventuallyFree((ClientData) view, DestroyTileView);
+  } else if ((view->class == Editor_Class) &&
+            (view->show_me != 0) &&
+            ((eventPtr->type == EnterNotify) ||
+             (eventPtr->type == LeaveNotify) ||
+             (eventPtr->type == MotionNotify))) {
+    int last_x = view->tool_x, last_y = view->tool_y,
+        last_showing = view->tool_showing;
+    int x, y, showing, autoscroll;
+
+    if (eventPtr->type == EnterNotify) {
+      showing = 1;
+      x = eventPtr->xcrossing.x; y = eventPtr->xcrossing.y;
+    } else if (eventPtr->type == LeaveNotify) {
+      showing = 0;
+      x = eventPtr->xcrossing.x; y = eventPtr->xcrossing.y;
+    } else {
+      showing = 1;
+      x = eventPtr->xmotion.x; y = eventPtr->xmotion.y;
+    }
+
+    if (view->tool_mode != 0) {
+
+      if ((x < AutoScrollEdge) ||
+         (x > (view->w_width - AutoScrollEdge)) ||
+         (y < AutoScrollEdge) ||
+         (y > (view->w_height - AutoScrollEdge))) {
+       if (!view->auto_scroll_token) {
+         view->auto_scroll_token =
+           Tk_CreateTimerHandler(AutoScrollDelay, TileAutoScrollProc,
+                                 (ClientData) view);
+       }
+      } else {
+       if (view->auto_scroll_token) {
+         Tk_DeleteTimerHandler(view->auto_scroll_token);
+         view->auto_scroll_token = 0;
+       }
+      }
+    }
+
+    ViewToPixelCoords(view, x, y, &x, &y);
+    view->tool_showing = showing;
+
+    if (view->tool_mode != -1) {
+      view->tool_x = x; view->tool_y = y;
+    }
+
+/* XXX: redraw all views showing cursor */
+/* XXX: also, make sure switching tools works w/out moving */
+    if (((view->tool_showing != last_showing) ||
+        (view->tool_x != last_x) ||
+        (view->tool_y != last_y))) {
+#if 1
+      EventuallyRedrawView(view);
+#else
+      RedrawEditors();
+#endif
+    }
+  }
+}
+
+
+static void
+DestroyTileView(ClientData clientData)
+{
+  SimView *view = (SimView *) clientData;
+
+  DestroyView(view);
+}
+
+
+void
+StdinProc(ClientData clientData, int mask)
+{
+  char line[200];
+  static int gotPartial = 0;
+  char *cmd;
+  int result;
+  
+  if (mask & TK_READABLE) {
+    if (fgets(line, 200, stdin) == NULL) {
+      if (!gotPartial) {
+       if (sim_tty) {
+         sim_exit(0); // Just sets tkMustExit and ExitReturn
+         return;
+       } else {
+         Tk_DeleteFileHandler(0);
+       }
+       return;
+      } else {
+       line[0] = 0;
+      }
+    }
+    cmd = Tcl_AssembleCmd(buffer, line);
+    if (cmd == NULL) {
+      gotPartial = 1;
+      return;
+    }
+    gotPartial = 0;
+    result = Tcl_RecordAndEval(tk_mainInterp, cmd, 0);
+    if (*tk_mainInterp->result != 0) {
+      if ((result != TCL_OK) || sim_tty) {
+       printf("%s\n", tk_mainInterp->result);
+      }
+    }
+    if (sim_tty) {
+      printf("sim:\n");
+      fflush(stdout);
+    }
+  }
+}
+
+
+static void
+StructureProc(ClientData clientData, XEvent *eventPtr)
+{
+  if (eventPtr->type == DestroyNotify) {
+    MainWindow = NULL;
+  }
+}
+
+
+static void
+DelayedMap(ClientData clientData)
+{
+  while (Tk_DoOneEvent(TK_IDLE_EVENTS) != 0) {
+    /* Empty loop body. */
+  }
+  if (MainWindow == NULL) {
+    return;
+  }
+  Tk_MapWindow(MainWindow);
+}
+
+
+DidStopPan(SimView *view)
+{
+  char buf[256];
+  sprintf(buf, "UIDidStopPan %s", Tk_PathName(view->tkwin));
+       
+  Eval(buf);
+}
+
+
+static void
+MicropolisTimerProc(ClientData clientData)
+{
+  sim_timer_token = NULL;
+  sim_timer_set = 0;
+
+  if (NeedRest > 0) {
+    NeedRest--;
+  }
+
+  if (SimSpeed) {
+    sim_loop(1);
+    StartMicropolisTimer();
+  } else {
+    StopMicropolisTimer();
+  }
+}
+
+
+void
+ReallyStartMicropolisTimer(ClientData clientData)
+{
+  int delay = sim_delay;
+  XDisplay *xd = XDisplays;
+
+  StopMicropolisTimer();
+
+  while (xd != NULL) {
+    if ((NeedRest > 0) ||
+       ShakeNow ||
+       (xd->tkDisplay->buttonWinPtr != NULL) ||
+       (xd->tkDisplay->grabWinPtr != NULL)) {
+      if (ShakeNow || NeedRest) {
+       if (delay < 50000) delay = 50000;
+      } else {
+      }
+      break;
+    }
+    xd = xd->next;
+  }
+
+  sim_timer_token =
+    Tk_CreateMicroTimerHandler(
+      0,
+      delay,
+      MicropolisTimerProc,
+      (ClientData)0);
+
+  sim_timer_set = 1;
+}
+
+
+StartMicropolisTimer()
+{
+  if (sim_timer_idle == 0) {
+    sim_timer_idle = 1;
+    Tk_DoWhenIdle(
+      ReallyStartMicropolisTimer,
+      NULL);
+  }
+}
+
+
+StopMicropolisTimer()
+{
+  if (sim_timer_idle != 0) {
+    sim_timer_idle = 0;
+    Tk_CancelIdleCall(
+      ReallyStartMicropolisTimer,
+      NULL);
+  }
+
+  if (sim_timer_set) {
+    if (sim_timer_token != 0) {
+      Tk_DeleteTimerHandler(sim_timer_token);
+      sim_timer_token = 0;
+    }
+    sim_timer_set = 0;
+  }
+}
+
+
+FixMicropolisTimer()
+{
+  if (sim_timer_set) {
+    StartMicropolisTimer(NULL);
+  }
+}
+
+
+static void
+DelayedUpdate(ClientData clientData)
+{
+//fprintf(stderr, "DelayedUpdate\n");
+  UpdateDelayed = 0;
+  sim_skip = 0;
+  sim_update();
+}
+
+
+Kick()
+{
+  if (!UpdateDelayed) {
+    UpdateDelayed = 1;
+    Tk_DoWhenIdle(DelayedUpdate, (ClientData) NULL);
+  }
+}
+
+
+void
+StopEarthquake()
+{
+  ShakeNow = 0;
+  if (earthquake_timer_set) {
+    Tk_DeleteTimerHandler(earthquake_timer_token);
+  }
+  earthquake_timer_set = 0;
+}
+
+
+DoEarthQuake(void)
+{
+  MakeSound("city", "Explosion-Low");
+  Eval("UIEarthQuake");
+  ShakeNow++;
+  if (earthquake_timer_set) {
+    Tk_DeleteTimerHandler(earthquake_timer_token);
+  }
+  Tk_CreateTimerHandler(earthquake_delay, (void (*)())StopEarthquake, (ClientData) 0);
+  earthquake_timer_set = 1;
+}
+
+
+StopToolkit()
+{
+  if (tk_mainInterp != NULL) {
+    Eval("catch {DoStopMicropolis}");
+  }
+}
+
+
+Eval(char *buf)
+{
+  int result = Tcl_Eval(tk_mainInterp, buf, 0, (char **) NULL);
+  if (result != TCL_OK) {
+    char *errorinfo = Tcl_GetVar(tk_mainInterp, "errorInfo",
+                                TCL_GLOBAL_ONLY);
+    if (errorinfo == NULL) errorinfo = "<no backtrace>";
+    fprintf(stderr, "Micropolis: error in TCL code: %s\n%s\n",
+           tk_mainInterp->result, errorinfo);
+  }
+  return (result);
+}
+
+
+tk_main()
+{
+  char *p, *msg;
+  char buf[20];
+  char initCmd[256];
+  Tk_3DBorder border;
+
+  tk_mainInterp = Tcl_CreateExtendedInterp();
+
+#if 0
+  /* XXX: Figure out Extended TCL */
+  tclAppName     = "Wish";
+  tclAppLongname = "Wish - Tk Shell";
+  tclAppVersion  = TK_VERSION;
+  Tcl_ShellEnvInit (interp, TCLSH_ABORT_STARTUP_ERR,
+                    name,
+                    0, NULL,           /* argv var already set  */
+                    fileName == NULL,  /* interactive?          */
+                    NULL);             /* Standard default file */
+#endif
+
+  MainWindow = Tk_CreateMainWindow(tk_mainInterp, FirstDisplay, "Micropolis");
+  if (MainWindow == NULL) {
+    fprintf(stderr, "%s\n", tk_mainInterp->result);
+    sim_really_exit(1); // Just sets tkMustExit and ExitReturn
+  }
+  Tk_SetClass(MainWindow, "Tk");
+  Tk_CreateEventHandler(MainWindow, StructureNotifyMask,
+                       StructureProc, (ClientData) NULL);
+/*  Tk_DoWhenIdle(DelayedMap, (ClientData) NULL); */
+
+  Tk_GeometryRequest(MainWindow, 256, 256);
+  border = Tk_Get3DBorder(tk_mainInterp, MainWindow, None, "gray75");
+  if (border == NULL) {
+    Tcl_SetResult(tk_mainInterp, (char *) NULL, TCL_STATIC);
+    Tk_SetWindowBackground(MainWindow,
+                          WhitePixelOfScreen(Tk_Screen(MainWindow)));
+  } else {
+    Tk_SetBackgroundFromBorder(MainWindow, border);
+  }
+  XSetForeground(Tk_Display(MainWindow),
+                DefaultGCOfScreen(Tk_Screen(MainWindow)),
+                BlackPixelOfScreen(Tk_Screen(MainWindow)));
+
+  sim_command_init();
+  map_command_init();
+  editor_command_init();
+  graph_command_init();
+  date_command_init();
+  sprite_command_init();
+
+#ifdef CAM
+  cam_command_init();
+#endif
+
+  Tcl_CreateCommand(tk_mainInterp, "piemenu", Tk_PieMenuCmd,
+                   (ClientData)MainWindow, (void (*)()) NULL);
+  Tcl_CreateCommand(tk_mainInterp, "interval", Tk_IntervalCmd,
+                   (ClientData)MainWindow, (void (*)()) NULL);
+
+  sim = MakeNewSim();
+
+  sprintf(initCmd, "source %s/micropolis.tcl", ResourceDir);
+  filename2UNIX(initCmd);
+  if (Eval(initCmd)) {
+    sim_exit(1); // Just sets tkMustExit and ExitReturn
+    goto bail;
+  }
+
+  sim_init();
+
+  buffer = Tcl_CreateCmdBuf();
+
+  if (sim_tty) {
+    Tk_CreateFileHandler(0, TK_READABLE, StdinProc, (ClientData) 0);
+  }
+
+  { char buf[1024];
+
+    sprintf(buf, "UIStartMicropolis {%s} {%s} {%s}",
+           HomeDir, ResourceDir, HostName);
+    filename2UNIX(buf);
+    if (Eval(buf) != TCL_OK) {
+      sim_exit(1); // Just sets tkMustExit and ExitReturn
+      goto bail;
+    }
+  }
+
+  if (sim_tty) {
+    printf("sim:\n");
+  }
+  fflush(stdout);
+
+  Tk_MainLoop();
+
+  sim_exit(0); // Just sets tkMustExit and ExitReturn
+
+ bail:
+
+  if (buffer != NULL) {
+    Tcl_DeleteCmdBuf(buffer);
+  }
+
+  Tcl_DeleteInterp(tk_mainInterp);
+}
+
diff --git a/src/sim/w_tool.c b/src/sim/w_tool.c
new file mode 100644 (file)
index 0000000..d678137
--- /dev/null
@@ -0,0 +1,1694 @@
+/* w_tool.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+short specialBase = CHURCH;
+int OverRide = 0;
+int Expensive = 1000;
+int Players = 1;
+int Votes = 0;
+int PendingTool = -1;
+int PendingX;
+int PendingY;
+
+
+QUAD CostOf[] = {
+    100,    100,    100,    500,
+      0,    500,      5,      1,
+     20,     10,      0,      0,
+   5000,     10,   3000,   3000,
+   5000,  10000,    100,      0,
+};
+
+
+short toolSize[] = {
+  3, 3, 3, 3,
+  1, 3, 1, 1,
+  1, 1, 0, 0,
+  4, 1, 4, 4, 
+  4, 6, 1, 0,
+};
+
+
+short toolOffset[] = {
+  1, 1, 1, 1,
+  0, 1, 0, 0,
+  0, 0, 0, 0,
+  1, 0, 1, 1,
+  1, 1, 0, 0,
+};
+
+
+QUAD toolColors[] = {
+ COLOR_LIGHTGREEN | (COLOR_LIGHTGREEN << 8),   /* residentialState */
+ COLOR_LIGHTBLUE | (COLOR_LIGHTBLUE << 8),     /* commercialState */
+ COLOR_YELLOW | (COLOR_YELLOW << 8),           /* industrialState */
+ COLOR_LIGHTGREEN | (COLOR_RED << 8),          /* fireState */
+ COLOR_ORANGE | (COLOR_ORANGE << 8),           /* queryState */
+ COLOR_LIGHTGREEN | (COLOR_LIGHTBLUE << 8),    /* policeState */
+ COLOR_DARKGRAY | (COLOR_YELLOW << 8),         /* wireState */
+ COLOR_LIGHTBROWN | (COLOR_LIGHTBROWN << 8),   /* dozeState */
+ COLOR_DARKGRAY | (COLOR_OLIVE << 8),          /* rrState */
+ COLOR_DARKGRAY | (COLOR_WHITE << 8),          /* roadState */
+ COLOR_LIGHTGRAY | (COLOR_LIGHTGRAY << 8),     /* chalkState */
+ COLOR_DARKGRAY | (COLOR_DARKGRAY << 8),       /* eraserState */
+ COLOR_LIGHTGRAY | (COLOR_LIGHTGREEN << 8),    /* stadiumState */
+ COLOR_LIGHTBROWN | (COLOR_LIGHTGREEN << 8),   /* parkState */
+ COLOR_LIGHTGRAY | (COLOR_LIGHTBLUE << 8),     /* seaportState */
+ COLOR_LIGHTGRAY | (COLOR_YELLOW << 8),                /* powerState */
+ COLOR_LIGHTGRAY | (COLOR_YELLOW << 8),                /* nuclearState */
+ COLOR_LIGHTGRAY | (COLOR_LIGHTBROWN << 8),    /* airportState */
+ COLOR_LIGHTGRAY | (COLOR_RED << 8),           /* networkState */
+};
+
+
+Ink *NewInk();
+
+short tally(short tileValue);
+int DoSetWandState(SimView *view, short state);
+
+
+/*************************************************************************/
+/* UTILITIES */
+
+
+setWandState(SimView *view, short state)
+{
+#if 0
+  if (state < 0) {
+    specialBase = -state;
+    state = specialState;
+  }
+#endif
+
+  view->tool_state = state;
+  DoUpdateHeads();
+  DoSetWandState(view, state);
+}
+
+
+int
+putDownPark(SimView *view, short mapH, short mapV)
+{
+  short value, tile;
+
+  if (TotalFunds - CostOf[parkState] >= 0) {
+    value = Rand(4);
+
+    if (value == 4)
+      tile = FOUNTAIN | BURNBIT | BULLBIT | ANIMBIT;
+    else
+      tile = (value + WOODS2) | BURNBIT | BULLBIT;
+
+    if (Map[mapH][mapV] == 0) {
+      Spend(CostOf[parkState]);
+      UpdateFunds();
+      Map[mapH][mapV] = tile;
+      return 1;
+    }
+    return -1;
+  }
+  return -2;
+}
+
+
+int
+putDownNetwork(SimView *view, short mapH, short mapV)
+{
+  int tile = Map[mapH][mapV] & LOMASK;
+
+  if ((TotalFunds > 0) && tally(tile)) {
+    Map[mapH][mapV] = tile = 0;
+    Spend(1);
+  }
+
+  if (tile == 0) {
+    if ((TotalFunds - CostOf[view->tool_state]) >= 0) {
+      Map[mapH][mapV] = TELEBASE | CONDBIT | BURNBIT | BULLBIT | ANIMBIT;
+      Spend(CostOf[view->tool_state]);
+      return 1;
+    } else {
+      return -2;
+    }
+  } else {
+    return -1;
+  }
+}
+
+
+short
+checkBigZone(short id, short *deltaHPtr, short *deltaVPtr)
+{
+  switch (id) {
+  case POWERPLANT:     /* check coal plant */
+  case PORT:           /* check sea port */
+  case NUCLEAR:                /* check nuc plant */
+  case STADIUM:                /* check stadium */
+    *deltaHPtr = 0;    *deltaVPtr = 0;         return (4);
+
+  case POWERPLANT + 1: /* check coal plant */
+  case COALSMOKE3:     /* check coal plant, smoke */
+  case COALSMOKE3 + 1: /* check coal plant, smoke */
+  case COALSMOKE3 + 2: /* check coal plant, smoke */
+  case PORT + 1:       /* check sea port */
+  case NUCLEAR + 1:    /* check nuc plant */
+  case STADIUM + 1:    /* check stadium */
+    *deltaHPtr = -1;   *deltaVPtr = 0;         return (4);
+
+  case POWERPLANT + 4: /* check coal plant */
+  case PORT + 4:       /* check sea port */
+  case NUCLEAR + 4:    /* check nuc plant */
+  case STADIUM + 4:    /* check stadium */
+    *deltaHPtr = 0;    *deltaVPtr = -1;        return (4);
+
+  case POWERPLANT + 5: /* check coal plant */
+  case PORT + 5:       /* check sea port */
+  case NUCLEAR + 5:    /* check nuc plant */
+  case STADIUM + 5:    /* check stadium */
+    *deltaHPtr = -1;   *deltaVPtr = -1;        return (4);
+
+    /* check airport */
+    /*** first row ***/
+  case AIRPORT:
+    *deltaHPtr = 0;    *deltaVPtr = 0;         return (6);
+  case AIRPORT + 1:
+    *deltaHPtr = -1;   *deltaVPtr = 0;         return (6);
+  case AIRPORT + 2:
+    *deltaHPtr = -2;   *deltaVPtr = 0;         return (6);
+  case AIRPORT + 3:
+    *deltaHPtr = -3;   *deltaVPtr = 0;         return (6);
+
+    /*** second row ***/
+  case AIRPORT + 6:
+    *deltaHPtr = 0;    *deltaVPtr = -1;        return (6);
+  case AIRPORT + 7:
+    *deltaHPtr = -1;   *deltaVPtr = -1;        return (6);
+  case AIRPORT + 8:
+    *deltaHPtr = -2;   *deltaVPtr = -1;        return (6);
+  case AIRPORT + 9:
+    *deltaHPtr = -3;   *deltaVPtr = -1;        return (6);
+
+    /*** third row ***/
+  case AIRPORT + 12:
+    *deltaHPtr = 0;    *deltaVPtr = -2;        return (6);
+  case AIRPORT + 13:
+    *deltaHPtr = -1;   *deltaVPtr = -2;        return (6);
+  case AIRPORT + 14:
+    *deltaHPtr = -2;   *deltaVPtr = -2;        return (6);
+  case AIRPORT + 15:
+    *deltaHPtr = -3;   *deltaVPtr = -2;        return (6);
+
+    /*** fourth row ***/
+  case AIRPORT + 18:
+    *deltaHPtr = 0;    *deltaVPtr = -3;        return (6);
+  case AIRPORT + 19:
+    *deltaHPtr = -1;   *deltaVPtr = -3;        return (6);
+  case AIRPORT + 20:
+    *deltaHPtr = -2;   *deltaVPtr = -3;        return (6);
+  case AIRPORT + 21:
+    *deltaHPtr = -3;   *deltaVPtr = -3;        return (6);
+
+  default:
+    *deltaHPtr = 0;    *deltaVPtr = 0;         return (0);
+  }
+}
+
+
+short
+tally(short tileValue)
+{
+  /* can we autobulldoze this tile? */
+  if (((tileValue >= FIRSTRIVEDGE) &&
+       (tileValue <= LASTRUBBLE)) || 
+      ((tileValue >= (POWERBASE + 2)) &&
+       (tileValue <= (POWERBASE + 12))) ||
+      ((tileValue >= TINYEXP) &&
+       (tileValue <= (LASTTINYEXP + 2)))) { /* ??? */
+    return (1);
+  } else {
+    return (0);
+  }
+}
+
+
+short
+checkSize(short temp)
+{
+  /* check for the normal com, resl, ind 3x3 zones & the fireDept & PoliceDept */
+  if (((temp >= (RESBASE - 1)) && (temp  <= (PORTBASE - 1))) ||
+      ((temp >= (LASTPOWERPLANT + 1)) && (temp <= (POLICESTATION + 4)))) {
+    return (3);
+  } else if (((temp >= PORTBASE) && (temp <= LASTPORT)) ||
+            ((temp >= COALBASE) && (temp <= LASTPOWERPLANT)) ||
+            ((temp >= STADIUMBASE) && (temp <= LASTZONE))) {
+    return (4);
+  }
+  return (0);
+}
+
+
+/* 3x3 */
+
+
+void
+check3x3border(short xMap, short yMap)
+{
+  short xPos, yPos;
+  short cnt;
+
+  xPos = xMap; yPos = yMap - 1;
+  for (cnt = 0; cnt < 3; cnt++) {
+    /*** this will do the upper bordering row ***/
+    ConnecTile(xPos, yPos, &Map[xPos][yPos], 0);
+    xPos++;
+  }
+
+  xPos = xMap - 1; yPos = yMap;
+  for (cnt = 0; cnt < 3; cnt++) {
+    /*** this will do the left bordering row ***/
+    ConnecTile(xPos, yPos, &Map[xPos][yPos], 0);
+    yPos++;
+  }
+
+  xPos = xMap; yPos = yMap + 3;
+  for (cnt = 0; cnt < 3; cnt++) {
+    /*** this will do the bottom bordering row ***/
+    ConnecTile(xPos, yPos, &Map[xPos][yPos], 0);
+    xPos++;
+  }
+       
+  xPos = xMap + 3; yPos = yMap;
+  for (cnt = 0; cnt < 3; cnt++) {
+    /*** this will do the right bordering row ***/
+    ConnecTile(xPos, yPos, &Map[xPos][yPos], 0);
+    yPos++;
+  }
+}
+
+
+int
+check3x3(SimView *view, short mapH, short mapV, short base, short tool)
+{
+  register short rowNum, columnNum;
+  register short holdMapH, holdMapV;
+  short xPos, yPos;
+  short cost = 0;
+  short tileValue;
+  short flag;
+
+  mapH--; mapV--;
+  if ((mapH < 0) || (mapH > (WORLD_X - 3)) ||
+      (mapV < 0) || (mapV > (WORLD_Y - 3))) {
+    return -1;
+  }
+
+  xPos = holdMapH = mapH;
+  yPos = holdMapV = mapV;
+
+  flag = 1;
+
+  for (rowNum = 0; rowNum <= 2; rowNum++) {
+    mapH = holdMapH;
+
+    for (columnNum = 0; columnNum <= 2; columnNum++) {
+      tileValue = Map[mapH++][mapV] & LOMASK;
+
+      if (autoBulldoze) {
+       /* if autoDoze is enabled, add up the cost of bulldozed tiles */
+       if (tileValue != 0) {
+         if (tally(tileValue)) {
+           cost++;
+         } else {
+           flag = 0;
+         }
+       }
+      } else {
+       /* check and see if the tile is clear or not  */
+       if (tileValue != 0) {
+         flag = 0;
+       }
+      }
+    }
+    mapV++;
+  }
+
+  if (flag == 0) {
+    return -1;
+  }
+
+  cost += CostOf[tool];
+
+  if ((TotalFunds - cost) < 0) {
+    return -2;
+  }
+
+  if ((Players > 1) &&
+      (OverRide == 0) &&
+      (cost >= Expensive) &&
+      (view != NULL) &&
+      (view->super_user == 0)) {
+    return -3;
+  }
+
+  /* take care of the money situtation here */
+  Spend(cost);
+  UpdateFunds();
+
+  mapV = holdMapV;
+
+  for (rowNum = 0; rowNum <= 2; rowNum++) {
+    mapH = holdMapH;
+
+    for (columnNum = 0; columnNum <= 2; columnNum++) {
+      if (columnNum == 1 && rowNum == 1) {
+       Map[mapH++][mapV] = base + BNCNBIT + ZONEBIT;
+      } else {
+       Map[mapH++][mapV] = base + BNCNBIT;
+      }
+      base++;
+    }
+    mapV++;
+  }
+  check3x3border(xPos, yPos);
+  return 1;
+}
+
+
+/* 4x4 */
+
+
+void
+check4x4border(short xMap, short yMap)
+{
+  Ptr tilePtr;
+  short xPos, yPos;
+  short cnt;
+
+  xPos = xMap; yPos = yMap - 1;
+  for (cnt = 0; cnt < 4; cnt++) {
+    /* this will do the upper bordering row */
+    tilePtr = (Ptr) &Map[xPos][yPos];
+    ConnecTile(xPos, yPos, tilePtr, 0);
+    xPos++;
+  }
+
+  xPos = xMap - 1; yPos = yMap;
+  for (cnt = 0; cnt < 4; cnt++) {
+    /* this will do the left bordering row */
+    tilePtr = (Ptr) &Map[xPos][yPos];
+    ConnecTile(xPos, yPos, tilePtr, 0);
+    yPos++;
+  }
+
+  xPos = xMap; yPos = yMap + 4;
+  for (cnt = 0; cnt < 4;cnt++) {
+    /* this will do the bottom bordering row */
+    tilePtr = (Ptr) &Map[xPos][yPos];
+    ConnecTile(xPos, yPos, tilePtr, 0);
+    xPos++;
+  }
+       
+  xPos = xMap + 4; yPos = yMap;
+  for (cnt = 0; cnt < 4; cnt++) {
+    /* this will do the right bordering row */
+    tilePtr = (Ptr) &Map[xPos][yPos];
+    ConnecTile(xPos, yPos, tilePtr, 0);
+    yPos++;
+  }
+}
+
+
+short
+check4x4(SimView *view, short mapH, short mapV,
+        short base, short aniFlag, short tool)
+{
+  register short rowNum, columnNum;
+  short h, v;
+  short holdMapH;
+  short xMap, yMap;
+  short tileValue;
+  short flag;
+  short cost = 0;
+
+  mapH--; mapV--;
+  if ((mapH < 0) || (mapH > (WORLD_X - 4)) ||
+      (mapV < 0) || (mapV > (WORLD_Y - 4))) {
+    return -1;
+  }
+
+  h = xMap = holdMapH = mapH;
+  v = yMap = mapV;
+
+  flag = 1;
+
+  for (rowNum = 0; rowNum <= 3; rowNum++) {
+    mapH = holdMapH;
+
+    for (columnNum = 0; columnNum <= 3; columnNum++) {
+      tileValue = Map[mapH++][mapV] & LOMASK;
+
+      if (autoBulldoze) {
+       /* if autoDoze is enabled, add up the cost of bulldozed tiles */
+       if (tileValue != 0) {
+         if (tally(tileValue)) {
+           cost++;
+         } else {
+           flag = 0;
+         }
+       }
+      } else {
+       /* check and see if the tile is clear or not  */
+       if (tileValue != 0) {
+         flag = 0;
+       }
+      }
+    }
+    mapV++;
+  }
+
+  if (flag == 0) {
+    return -1;
+  }
+
+  cost += CostOf[tool];
+
+  if ((TotalFunds - cost) < 0) {
+    return -2;
+  }
+
+  if ((Players > 1) &&
+      (OverRide == 0) &&
+      (cost >= Expensive) &&
+      (view != NULL) &&
+      (view->super_user == 0)) {
+    return -3;
+  }
+
+  /* take care of the money situtation here */
+  Spend(cost);
+  UpdateFunds();
+
+  mapV = v; holdMapH = h;
+
+  for (rowNum = 0; rowNum <= 3; rowNum++) {
+    mapH = holdMapH;
+
+    for (columnNum = 0; columnNum <= 3; columnNum++) {
+      if (columnNum == 1 && rowNum == 1)
+       Map[mapH++][mapV] = base + BNCNBIT + ZONEBIT;
+      else if (columnNum == 1 && rowNum == 2 && aniFlag)
+       Map[mapH++][mapV] = base + BNCNBIT + ANIMBIT;
+      else
+       Map[mapH++][mapV] = base + BNCNBIT;
+      base++;
+    }
+    mapV++;
+  }
+  check4x4border(xMap, yMap);
+  return 1;
+}
+
+
+/* 6x6 */
+
+
+void
+check6x6border(short xMap, short yMap)
+{
+  short xPos, yPos;
+  short cnt;
+
+  xPos = xMap; yPos = yMap - 1;
+  for (cnt = 0; cnt < 6; cnt++) {
+    /* this will do the upper bordering row */
+    ConnecTile(xPos, yPos, &Map[xPos][yPos], 0);
+    xPos++;
+  }
+
+  xPos = xMap - 1; yPos = yMap;
+  for (cnt=0; cnt < 6; cnt++) {
+    /* this will do the left bordering row */
+    ConnecTile(xPos, yPos, &Map[xPos][yPos], 0);
+    yPos++;
+  }
+
+  xPos = xMap; yPos = yMap + 6;
+  for (cnt = 0; cnt < 6; cnt++) {
+    /* this will do the bottom bordering row */
+    ConnecTile(xPos, yPos, &Map[xPos][yPos], 0);
+    xPos++;
+  }
+       
+  xPos = xMap + 6; yPos = yMap;
+  for (cnt = 0; cnt < 6; cnt++) {
+    /* this will do the right bordering row */
+    ConnecTile(xPos, yPos, &Map[xPos][yPos], 0);
+    yPos++;
+  }
+}
+
+
+short
+check6x6(SimView *view, short mapH, short mapV, short base, short tool)
+{
+  register short rowNum, columnNum;
+  short h, v;
+  short holdMapH;
+  short xMap, yMap;
+  short flag;
+  short tileValue;
+  short cost = 0;
+
+  mapH--; mapV--;
+  if ((mapH < 0) || (mapH > (WORLD_X - 6)) ||
+      (mapV < 0) || (mapV > (WORLD_Y - 6)))
+    return -1;
+
+  h = xMap = holdMapH = mapH;
+  v = yMap = mapV;
+
+  flag = 1;
+
+  for (rowNum = 0; rowNum <= 5; rowNum++) {
+    mapH = holdMapH;
+
+    for (columnNum = 0; columnNum <= 5; columnNum++) {
+      tileValue = Map[mapH++][mapV] & LOMASK;
+
+      if (autoBulldoze) {
+       /* if autoDoze is enabled, add up the cost of bulldozed tiles */
+       if (tileValue != 0)
+         if (tally(tileValue)) {
+           cost++;
+         } else {
+           flag = 0;
+         }
+      } else {
+       /* check and see if the tile is clear or not  */
+       if (tileValue != 0) {
+         flag = 0;
+       }
+      }
+    }
+    mapV++;
+  }
+
+  if (flag == 0) {
+    return -1;
+  }
+
+  cost += CostOf[tool];
+
+  if ((TotalFunds - cost) < 0) {
+    return -2;
+  }
+
+  if ((Players > 1) &&
+      (OverRide == 0) &&
+      (cost >= Expensive) &&
+      (view != NULL) &&
+      (view->super_user == 0)) {
+    return -3;
+  }
+
+  /* take care of the money situtation here */
+  Spend(cost);
+  UpdateFunds();
+
+  mapV = v; holdMapH = h;
+
+  for (rowNum = 0; rowNum <= 5; rowNum++) {
+    mapH = holdMapH;
+
+    for (columnNum = 0; columnNum <= 5; columnNum++) {
+      if (columnNum == 1 && rowNum == 1) {
+       Map[mapH++][mapV] = base + BNCNBIT + ZONEBIT;
+      } else {
+       Map[mapH++][mapV] = base + BNCNBIT;
+      }
+      base++;
+    }
+    mapV++;
+  }
+  check6x6border(xMap, yMap);
+  return 1;
+}
+
+
+/* QUERY */
+
+
+/* search table for zone status string match */
+static short idArray[28] = {
+  DIRT, RIVER, TREEBASE, RUBBLE,
+  FLOOD, RADTILE, FIRE, ROADBASE,
+  POWERBASE, RAILBASE, RESBASE, COMBASE,
+  INDBASE, PORTBASE, AIRPORTBASE, COALBASE,
+  FIRESTBASE, POLICESTBASE, STADIUMBASE, NUCLEARBASE,
+  827, 832, FOUNTAIN, INDBASE2,
+  FOOTBALLGAME1, VBRDG0, 952, 956
+};
+
+/*
+  0, 2, 21, 44, 
+  48, 52, 53, 64,
+  208, 224, 240, 423, 
+  612, 693, 709, 745,
+  761, 770, 779, 811, 
+  827, 832, 840, 844,
+  932, 948, 952, 956
+
+  Clear, Water, Trees, Rubble, 
+  Flood, Radioactive Waste, Fire, Road,
+  Power, Rail, Residential, Commercial,
+  Industrial, Port, AirPort, Coal Power,
+  Fire Department, Police Department, Stadium, Nuclear Power, 
+  Draw Bridge, Radar Dish, Fountain, Industrial,
+  49er's 38  Bears 3, Draw Bridge, Ur 238
+*/
+
+
+int getDensityStr(short catNo, short mapH, short mapV)
+{
+  int z;
+
+  switch(catNo) {
+  case 0:
+    z = PopDensity[mapH >>1][mapV >>1];
+    z = z >> 6;
+    z = z & 3;
+    return (z);
+  case 1:
+    z = LandValueMem[mapH >>1][mapV >>1];
+    if (z < 30) return (4);
+    if (z < 80) return (5);
+    if (z < 150) return (6);
+    return (7);
+  case 2:
+    z = CrimeMem[mapH >>1][mapV >>1];
+    z = z >> 6;
+    z = z & 3;
+    return (z + 8);
+  case 3:
+    z = PollutionMem[mapH >>1][mapV >>1];
+    if ((z < 64) && (z > 0)) return (13);
+    z = z >> 6;
+    z = z & 3;
+    return (z + 12);
+  case 4:
+    z = RateOGMem[mapH >>3][mapV >>3];
+    if (z < 0) return (16);
+    if  (z == 0) return (17);
+    if  (z > 100) return (19);
+    return (18);
+  }
+}
+
+
+doZoneStatus(short mapH, short mapV)
+{
+  char localStr[256];
+  char statusStr[5][256];
+  short id;
+  short x;
+  short tileNum;
+  short found;
+
+  tileNum = Map[mapH][mapV] & LOMASK;
+
+  if (tileNum >= COALSMOKE1 && tileNum < FOOTBALLGAME1)
+    tileNum = COALBASE;
+
+  found = 1;
+  for (x = 1; x < 29 && found; x++) {
+    if (tileNum < idArray[x]) {
+      found = 0;
+    }
+  }
+  x--;
+
+  if (x < 1 || x > 28)
+    x = 28;
+
+  GetIndString(localStr, 219, x);
+
+  for (x = 0; x < 5; x++) {
+    id = getDensityStr(x, mapH, mapV);
+    id++;
+    if (id <= 0) id = 1;
+    if (id > 20) id = 20;
+    GetIndString(statusStr[x], 202, id);
+  }
+
+  DoShowZoneStatus(localStr, statusStr[0], statusStr[1],
+                  statusStr[2], statusStr[3], statusStr[4], mapH, mapV);
+}
+
+
+DoShowZoneStatus(char *str, char *s0, char *s1, char *s2, char *s3, char *s4,
+                int x, int y)
+{
+  char buf[1024];
+
+  sprintf(buf, "UIShowZoneStatus {%s} {%s} {%s} {%s} {%s} {%s} %d %d",
+         str, s0, s1, s2, s3, s4, x, y);
+  Eval(buf);
+}
+
+
+/* comefrom: processWand */
+put3x3Rubble(short x, short y)
+{
+  register xx, yy, zz;
+       
+  for (xx = x - 1; xx < x + 2; xx++) {
+    for (yy = y - 1; yy < y + 2; yy++)  {
+      if (TestBounds(xx, yy)) {
+       zz = Map[xx][yy] & LOMASK;
+       if ((zz != RADTILE) && (zz != 0)) {
+         Map[xx][yy] =
+           (DoAnimation
+            ? (TINYEXP + Rand(2))
+            : SOMETINYEXP)
+           | ANIMBIT | BULLBIT;
+       }
+      }
+    }
+  }
+}
+
+
+/* comefrom: processWand */
+put4x4Rubble(short x, short y)
+{
+  register xx, yy, zz;
+       
+  for (xx = x - 1; xx < x + 3; xx++) {
+    for (yy = y - 1; yy < y + 3; yy++) {
+      if (TestBounds(xx, yy)) {
+       zz = Map[xx][yy] & LOMASK;
+       if ((zz != RADTILE) && (zz != 0)) {
+         Map[xx][yy] =
+           (DoAnimation
+            ? (TINYEXP + Rand(2))
+            : SOMETINYEXP)
+           | ANIMBIT | BULLBIT;
+       }
+      }
+    }
+  }
+}
+
+
+/* comefrom: processWand */
+put6x6Rubble(short x, short y)
+{
+  register xx, yy, zz;
+
+  for (xx = x - 1; xx < x + 5; xx++) {
+    for (yy = y - 1; yy < y + 5; yy++)  {
+      if (TestBounds(xx, yy)) {
+       zz = Map[xx][yy] & LOMASK;
+       if ((zz != RADTILE) && (zz != 0)) {
+         Map[xx][yy] =
+           (DoAnimation
+            ? (TINYEXP + Rand(2))
+            : SOMETINYEXP)
+           | ANIMBIT | BULLBIT;
+       }
+      }
+    }
+  }
+}      
+
+
+DidTool(SimView *view, char *name, short x, short y)
+{
+  char buf[256];
+
+  if (view != NULL) {
+    sprintf(buf, "UIDidTool%s %s %d %d",
+           name, Tk_PathName(view->tkwin), x, y);
+    Eval(buf);
+  }
+}
+
+
+DoSetWandState(SimView *view, short state)
+{
+  char buf[256];
+
+  sprintf(buf, "UISetToolState %s %d", Tk_PathName(view->tkwin), state);
+  Eval(buf);
+}
+
+
+/************************************************************************/
+/* TOOLS */
+
+
+int
+query_tool(SimView *view, short x, short y)
+{
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  doZoneStatus(x, y);
+  DidTool(view, "Qry", x, y);
+  return 1;
+}
+
+
+int
+bulldozer_tool(SimView *view, short x, short y)
+{
+  unsigned short currTile, temp;
+  short zoneSize, deltaH, deltaV;
+  int result = 1;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  currTile = Map[x][y];
+  temp = currTile & LOMASK;
+
+  if (currTile & ZONEBIT) { /* zone center bit is set */
+    if (TotalFunds > 0) {
+      Spend(1);
+      switch (checkSize(temp)) {
+      case 3:
+       MakeSound("city", "Explosion-High");
+       put3x3Rubble(x, y);
+       break;
+
+      case 4:
+       put4x4Rubble(x, y);
+       MakeSound("city", "Explosion-Low");
+       break;
+
+      case 6: 
+       MakeSound("city", "Explosion-High");
+       MakeSound("city", "Explosion-Low");
+       put6x6Rubble(x, y);
+       break;
+
+      default:
+       break;
+      }
+    }
+  } else if ((zoneSize = checkBigZone(temp, &deltaH, &deltaV))) {
+    if (TotalFunds > 0) {
+      Spend(1);
+      switch (zoneSize) {
+      case 3:
+       MakeSound("city", "Explosion-High");
+       break;
+
+      case 4:
+       MakeSound("city", "Explosion-Low");
+       put4x4Rubble(x + deltaH, y + deltaV);
+       break;
+
+      case 6: 
+       MakeSound("city", "Explosion-High");
+       MakeSound("city", "Explosion-Low");
+       put6x6Rubble(x + deltaH, y + deltaV);
+       break;
+      }
+    }
+  } else {
+    if (temp == RIVER || temp == REDGE || temp == CHANNEL) {
+      if (TotalFunds >= 6) {
+       result = ConnecTile(x, y, &Map[x][y], 1);
+       if (temp != (Map[x][y] & LOMASK)) {
+         Spend(5);
+       }
+      } else {
+       result = 0;
+      }
+    } else {
+      result = ConnecTile(x, y, &Map[x][y], 1);
+    }
+  }
+  UpdateFunds();
+  if (result == 1) {
+    DidTool(view, "Dozr", x, y);
+  }
+  return result;
+}
+
+
+int
+road_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = ConnecTile(x, y, &Map[x][y], 2);
+  UpdateFunds();
+  if (result == 1) {
+    DidTool(view, "Road", x, y);
+  }
+  return result;
+}
+
+
+int
+rail_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = ConnecTile(x, y, &Map[x][y], 3);
+  UpdateFunds();
+  if (result == 1) {
+    DidTool(view, "Rail", x, y);
+  }
+  return result;
+}
+
+
+int
+wire_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = ConnecTile(x, y, &Map[x][y], 4);
+  UpdateFunds();
+  if (result == 1) {
+    DidTool(view, "Wire", x, y);
+  }
+  return result;
+}
+
+
+int
+park_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1)))
+    return -1;
+
+  result = putDownPark(view, x, y);
+  if (result == 1) {
+    DidTool(view, "Park", x, y);
+  }
+  return result;
+}
+
+
+int
+residential_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = check3x3(view, x, y, RESBASE, residentialState);
+  if (result == 1) {
+    DidTool(view, "Res", x, y);
+  }
+  return result;
+}
+
+
+int
+commercial_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = check3x3(view, x, y, COMBASE, commercialState);
+  if (result == 1) {
+    DidTool(view, "Com", x, y);
+  }
+  return result;
+}
+
+
+int
+industrial_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = check3x3(view, x, y, INDBASE, industrialState);
+  if (result == 1) {
+    DidTool(view, "Ind", x, y);
+  }
+  return result;
+}
+
+
+int
+police_dept_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = check3x3(view, x, y, POLICESTBASE, policeState);
+  if (result == 1) {
+    DidTool(view, "Pol", x, y);
+  }
+  return result;
+}
+
+
+int
+fire_dept_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = check3x3(view, x, y, FIRESTBASE, fireState);
+  if (result == 1) {
+    DidTool(view, "Fire", x, y);
+  }
+  return result;
+}
+
+
+int
+stadium_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = check4x4(view, x, y, STADIUMBASE, 0, stadiumState);
+  if (result == 1) {
+    DidTool(view, "Stad", x, y);
+  }
+  return result;
+}
+
+
+int
+coal_power_plant_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = check4x4(view, x, y, COALBASE, 1, powerState);
+  if (result == 1) {
+    DidTool(view, "Coal", x, y);
+  }
+  return result;
+}
+
+
+int
+nuclear_power_plant_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = check4x4(view, x, y, NUCLEARBASE, 1, nuclearState);
+  if (result == 1) {
+    DidTool(view, "Nuc", x, y);
+  }
+  return result;
+}
+
+
+int
+seaport_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = check4x4(view, x, y, PORTBASE, 0, seaportState);
+  if (result == 1) {
+    DidTool(view, "Seap", x, y);
+  }
+  return result;
+}
+
+
+int
+airport_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = check6x6(view, x, y, AIRPORTBASE, airportState);
+  if (result == 1) {
+    DidTool(view, "Airp", x, y);
+  }
+  return result;
+}
+
+
+int
+network_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = putDownNetwork(view, x, y);
+  if (result == 1) {
+    DidTool(view, "Net", x, y);
+  }
+  return result;
+}
+
+
+#if 0
+int
+special_tool(SimView *view, short x, short y)
+{
+  int result;
+
+  if ((x < 0) || (x > (WORLD_X - 1)) ||
+      (y < 0) || (y > (WORLD_Y - 1))) {
+    return -1;
+  }
+
+  result = check3x3(view, x, y, specialBase, specialState);
+  if (result == 1) {
+    DidTool(view, "Special", x, y);
+  }
+  return result;
+}
+#endif
+
+int
+ChalkTool(SimView *view, short x, short y, short color, short first)
+{
+  if (first) {
+    ChalkStart(view, x, y, color);
+  } else {
+    ChalkTo(view, x, y);
+  }
+  DidTool(view, "Chlk", x, y);
+  return 1;
+}
+
+
+ChalkStart(SimView *view, int x, int y, int color)
+{
+  Ink *ink;
+  Ink **ip;
+
+  for (ip = &sim->overlay; *ip != NULL; ip = &((*ip)->next)) ;
+
+  *ip = ink = NewInk();
+  ink->x = x; ink->y = y;
+  ink->color = color;
+  StartInk(ink, x, y);
+  view->track_info = (char *)ink;
+  view->last_x = x;
+  view->last_y = y;
+  view->tool_event_time = view->tool_last_event_time =
+    ((TkWindow *)view->tkwin)->dispPtr->lastEventTime;
+}
+
+
+ChalkTo(SimView *view, int x, int y)
+{
+  int x0, y0, lx, ly;
+  Ink *ink = (Ink *)view->track_info;
+
+#ifdef MOTIONBUFFER
+  if (view->x->dpy->motion_buffer) {
+    XTimeCoord *coords = NULL, *coord;
+    int n = 0, i;
+    
+    view->tool_last_event_time = view->tool_event_time;
+    view->tool_event_time =
+      ((TkWindow *)view->tkwin)->dispPtr->lastEventTime;
+
+    coords = XGetMotionEvents(view->x->dpy,
+                             Tk_WindowId(view->tkwin),
+                             view->tool_last_event_time,
+                             view->tool_event_time,
+                             &n);
+#if 0
+printf("got %d events at %x from %d to %d (%d elapsed)\n",
+       n, coords,
+       view->tool_last_event_time, view->tool_event_time,
+       view->tool_event_time - view->tool_last_event_time);
+#endif
+    if (n) {
+      lx = ink->last_x; ly = ink->last_y;
+
+      for (i = 0, coord = coords; i < n; i++, coord++) {
+       ViewToPixelCoords(view, coord->x, coord->y, &x0, &y0);
+       lx = (lx + lx + lx + x0) >>2;
+       ly = (ly + ly + ly + y0) >>2;
+#if 0
+printf("adding %d %d => %d %d => %d %d\n",
+       coord->x, coord->y, x0, y0, lx, ly);
+#endif
+       AddInk(ink, lx, ly);
+      }
+    }
+
+    if (coords) {
+      XFree((char *)coords);
+    }
+  }
+#endif
+
+  AddInk(ink, x, y);
+  view->last_x = x;
+  view->last_y = y;
+}
+
+
+int
+EraserTool(SimView *view, short x, short y, short first)
+{
+  if (first) {
+    EraserStart(view, x, y);
+  } else {
+    EraserTo(view, x, y);
+  }
+  DidTool(view, "Eraser", x, y);
+  return 1;
+}
+
+
+InkInBox(Ink *ink, int left, int top, int right, int bottom)
+{
+  if ((left <= ink->right) &&
+      (right >= ink->left) &&
+      (top <= ink->bottom) &&
+      (bottom >= ink->top)) {
+    int x, y, lx, ly, i;
+
+    if (ink->length == 1) {
+      return 1;
+    }
+
+    x = ink->x;  y = ink->y;
+    for (i = 1; i < ink->length; i++) {
+      int ileft, iright, itop, ibottom;
+
+      lx = x; ly = y;
+      x += ink->points[i].x;  y += ink->points[i].y;
+      if (x < lx) { ileft = x; iright = lx; }
+      else { ileft = lx; iright = x; }
+      if (y < ly) { itop = y; ibottom = ly; }
+      else { itop = ly; ibottom = y; }
+      if ((left <= iright) &&
+         (right >= ileft) &&
+         (top <= ibottom) &&
+         (bottom >= itop)) {
+       return 1;
+      }
+    }
+  }
+  return 0;
+}
+
+
+EraserStart(SimView *view, int x, int y)
+{
+  EraserTo(view, x, y);
+}
+
+
+EraserTo(SimView *view, int x, int y)
+{
+  SimView *v;
+  Ink **ip, *ink;
+
+  for (ip = &sim->overlay; *ip != NULL;) {
+    ink = *ip;
+    if (InkInBox(ink, x - 8, y - 8, x + 8, y + 8)) {
+
+      for (view = sim->editor; view != NULL; view = view->next) {
+       int vleft, vtop;
+
+       if ((ink->right >= (vleft = (view->pan_x - (view->w_width / 2)))) &&
+           (ink->left <= (vleft + view->w_width)) &&
+           (ink->bottom >= (vtop = (view->pan_y - (view->w_height / 2)))) &&
+           (ink->top <= (vtop + view->w_height))) {
+         view->overlay_mode = 0;
+         EventuallyRedrawView(view);
+       }
+      }
+
+      *ip = ink->next;
+
+      FreeInk(ink);
+    } else {
+      ip = &((*ip)->next);
+    }
+  }
+}
+
+
+int
+do_tool(SimView *view, short state, short x, short y, short first)
+{
+  int result = 0;
+
+  switch (state) {
+  case residentialState:
+    result = residential_tool(view, x >>4, y >>4);
+    break;
+  case commercialState:
+    result = commercial_tool(view, x >>4, y >>4);
+    break;
+  case industrialState:
+    result = industrial_tool(view, x >>4, y >>4);
+    break;
+  case fireState:
+    result = fire_dept_tool(view, x >>4, y >>4);
+    break;
+  case queryState:
+    result = query_tool(view, x >>4, y >>4);
+    break;
+  case policeState:
+    result = police_dept_tool(view, x >>4, y >>4);
+    break;
+  case wireState:
+    result = wire_tool(view, x >>4, y >>4);
+    break;
+  case dozeState:
+    result = bulldozer_tool(view, x >>4, y >>4);
+    break;
+  case rrState:
+    result = rail_tool(view, x >>4, y >>4);
+    break;
+  case roadState:
+    result = road_tool(view, x >>4, y >>4);
+    break;
+  case chalkState:
+    result = ChalkTool(view, x - 5, y + 11, COLOR_WHITE, first);
+    break;
+  case eraserState:
+    result = EraserTool(view, x, y, first);
+    break;
+  case stadiumState:
+    result = stadium_tool(view, x >>4, y >>4);
+    break;
+  case parkState:
+    result = park_tool(view, x >>4, y >>4);
+    break;
+  case seaportState:
+    result = seaport_tool(view, x >>4, y >>4);
+    break;
+  case powerState:
+    result = coal_power_plant_tool(view, x >>4, y >>4);
+    break;
+  case nuclearState:
+    result = nuclear_power_plant_tool(view, x >>4, y >>4);
+    break;
+  case airportState:
+    result = airport_tool(view, x >>4, y >>4);
+    break;
+  case networkState:
+    result = network_tool(view, x >>4, y >>4);
+    break;
+
+  default:
+    result = 0;
+    break;
+  }
+
+  return result;
+}
+
+
+int
+current_tool(SimView *view, short x, short y, short first)
+{
+  return do_tool(view, view->tool_state, x, y, first);
+}
+
+
+DoTool(SimView *view, short tool, short x, short y)
+{
+  int result;
+
+  result = do_tool(view, tool, x <<4, y <<4, 1);
+
+  if (result == -1) {
+    ClearMes();
+    SendMes(34);
+    MakeSoundOn(view, "edit", "UhUh");
+  } else if (result == -2) {
+    ClearMes();
+    SendMes(33);
+    MakeSoundOn(view, "edit", "Sorry");
+  }
+
+  sim_skip = 0;
+  view->skip = 0;
+  InvalidateEditors();
+}
+
+
+ToolDown(SimView *view, int x, int y)
+{
+  int result;
+
+  ViewToPixelCoords(view, x, y, &x, &y);
+  view->last_x = x;
+  view->last_y = y;
+
+  result = current_tool(view, x, y, 1);
+
+  if (result == -1) {
+    ClearMes();
+    SendMes(34);
+    MakeSoundOn(view, "edit", "UhUh");
+  } else if (result == -2) {
+    ClearMes();
+    SendMes(33);
+    MakeSoundOn(view, "edit", "Sorry");
+  } else if (result == -3) {
+    DoPendTool(view, view->tool_state, x >>4, y >>4);
+  }
+
+  sim_skip = 0;
+  view->skip = 0;
+  view->invalid = 1;
+}
+
+
+ToolUp(SimView *view, int x, int y)
+{
+  int result;
+
+  result = ToolDrag(view, x, y);
+
+  return (result);
+}
+
+
+ToolDrag(SimView *view, int px, int py)
+{
+  int x, y, dx, dy, adx, ady, lx, ly, dist;
+  float i, step, tx, ty, dtx, dty, rx, ry;
+
+  ViewToPixelCoords(view, px, py, &x, &y);
+  view->tool_x = x; view->tool_y = y;
+
+  if ((view->tool_state == chalkState) ||
+      (view->tool_state == eraserState)) {
+
+    current_tool(view, x, y, 0);
+    view->last_x = x; view->last_y = y;
+
+  } else {
+
+    dist = toolSize[view->tool_state];
+
+    x >>= 4; y >>= 4;
+    lx = view->last_x >> 4;
+    ly = view->last_y >> 4;
+
+  reset:
+
+    dx = x - lx;
+    dy = y - ly;
+
+    if (dx == 0 && dy == 0) {
+      return;
+    }
+
+    adx = ABS(dx); ady = ABS(dy);
+
+    if (adx > ady) {
+      step = .3 / adx;
+    } else {
+      step = .3 / ady;
+    }
+
+    rx = (dx < 0 ? 1 : 0);
+    ry = (dy < 0 ? 1 : 0);
+
+    if (dist == 1) {
+      for (i = 0.0; i <= 1 + step; i += step) {
+       tx = (view->last_x >>4) + i * dx;
+       ty = (view->last_y >>4) + i * dy;
+       dtx = ABS(tx - lx);
+       dty = ABS(ty - ly);
+       if (dtx >= 1 || dty >= 1) {
+         /* fill in corners */
+         if ((dtx >= 1) && (dty >= 1)) {
+           if (dtx > dty) {
+             current_tool(view, ((int)(tx + rx)) <<4, ly <<4, 0);
+           } else {
+             current_tool(view, lx <<4, ((int)(ty + ry)) <<4, 0);
+           }
+         }
+         lx = (int)(tx + rx);
+         ly = (int)(ty + ry);
+         current_tool(view, lx <<4, ly <<4, 0);
+       }
+      }
+    } else {
+      for (i = 0.0; i <= 1 + step; i += step) {
+       tx = (view->last_x >>4) + i * dx;
+       ty = (view->last_y >>4) + i * dy;
+       dtx = ABS(tx - lx);
+       dty = ABS(ty - ly);
+       lx = (int)(tx + rx);
+       ly = (int)(ty + ry);
+       current_tool(view, lx <<4, ly <<4, 0);
+      }
+    }
+
+    view->last_x = (lx <<4) + 8;
+    view->last_y = (ly <<4) + 8;
+  }
+  sim_skip = 0; /* update editors overlapping this one */
+  view->skip = 0;
+  view->invalid = 1;
+}
+
+
+DoPendTool(SimView *view, int tool, int x, int y)
+{
+  char buf[256];
+
+  sprintf(buf, "DoPendTool %s %d %d %d",
+         Tk_PathName(view->tkwin), tool, x, y);
+  Eval(buf);
+}
diff --git a/src/sim/w_update.c b/src/sim/w_update.c
new file mode 100644 (file)
index 0000000..168d626
--- /dev/null
@@ -0,0 +1,272 @@
+/* w_update.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+short MustUpdateFunds;
+short MustUpdateOptions;
+QUAD LastCityTime;
+QUAD LastCityYear;
+QUAD LastCityMonth;
+QUAD LastFunds;
+QUAD LastR, LastC, LastI;
+
+char *dateStr[12] = {
+  "Jan", "Feb", "Mar", "Apr", "May", "Jun", 
+  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+};
+
+
+void DoUpdateHeads()
+{
+  showValves();
+  doTimeStuff();
+  ReallyUpdateFunds();
+  updateOptions();
+}
+
+
+void UpdateEditors()
+{
+  InvalidateEditors();
+  DoUpdateHeads();
+}
+
+
+void UpdateMaps()
+{
+  InvalidateMaps();
+}
+
+
+void UpdateGraphs()
+{
+  ChangeCensus();
+}
+
+
+void UpdateEvaluation()
+{
+  ChangeEval();
+}
+
+
+void UpdateHeads()
+{
+  MustUpdateFunds = ValveFlag = 1;
+  LastCityTime = LastCityYear = LastCityMonth = LastFunds = LastR = -999999;
+  DoUpdateHeads();
+}
+
+UpdateFunds(void)
+{
+  MustUpdateFunds = 1;
+//  Kick();
+}
+
+
+ReallyUpdateFunds(void)
+{
+  char localStr[256], dollarStr[256], buf[256];
+
+  if (!MustUpdateFunds) return;
+
+  MustUpdateFunds = 0;
+
+  if (TotalFunds < 0) TotalFunds = 0;
+
+  if (TotalFunds != LastFunds) {
+    LastFunds = TotalFunds;
+    sprintf(localStr, "%d", TotalFunds);
+    makeDollarDecimalStr(localStr, dollarStr);
+
+    sprintf(localStr, "Funds: %s", dollarStr);
+
+    sprintf(buf, "UISetFunds {%s}", localStr);
+    Eval(buf);
+  }
+}
+
+
+doTimeStuff(void) 
+{
+//  if ((CityTime >> 2) != LastCityTime) {
+    updateDate();
+//  }
+}
+
+
+updateDate(void)
+{      
+  int y;
+  int m;
+  char str[256], buf[256];
+  int megalinium = 1000000;
+
+  LastCityTime = CityTime >> 2;
+
+  y = ((int)CityTime / 48) + (int)StartingYear;
+  m = ((int)CityTime % 48) >> 2;
+
+  if (y >= megalinium) {
+    SetYear(StartingYear);
+    y = StartingYear;
+    SendMes(-40);
+  }
+
+  doMessage();
+
+  if ((LastCityYear != y) ||
+      (LastCityMonth != m)) {
+
+    LastCityYear = y;
+    LastCityMonth = m;
+
+    sprintf(str, "%s %d", dateStr[m], y);
+
+    sprintf(buf,
+           "UISetDate {%s} %d %d",
+           str, m, y);
+    Eval(buf);
+  }
+}
+
+
+showValves(void)
+{
+  if (ValveFlag) {
+    drawValve();
+    ValveFlag = 0;
+  }
+}
+
+
+drawValve(void)
+{
+  double r, c, i;
+
+  r = RValve;
+  if (r < -1500) r = -1500;
+  if (r > 1500) r = 1500;
+
+  c = CValve;
+  if (c < -1500) c = -1500;
+  if (c > 1500) c = 1500;
+
+  i = IValve;
+  if (i < -1500) i = -1500;
+  if (i > 1500) i = 1500;
+
+  if ((r != LastR) ||
+      (c != LastC) ||
+      (i != LastI)) {
+    LastR = r;
+    LastC = c;
+    LastI = i;
+    SetDemand(r, c, i);
+  }
+}
+
+
+SetDemand(double r, double c, double i)
+{
+  char buf[256];
+
+  sprintf(buf, "UISetDemand %d %d %d",
+         (int)(r / 100), (int)(c / 100), (int)(i / 100));
+  Eval(buf);
+}
+
+
+updateOptions()
+{
+  int options;
+
+  if (MustUpdateOptions) {
+    options = 0;
+    if (autoBudget)    options |= 1;
+    if (autoGo)                options |= 2;
+    if (autoBulldoze)  options |= 4;
+    if (!NoDisasters)  options |= 8;
+    if (UserSoundOn)   options |= 16;
+    if (DoAnimation)   options |= 32;
+    if (DoMessages)    options |= 64;
+    if (DoNotices)     options |= 128;
+
+    MustUpdateOptions = 0;
+    UpdateOptionsMenu(options);
+  }
+}
+
+
+UpdateOptionsMenu(int options)
+{
+  char buf[256];
+  sprintf(buf, "UISetOptions %d %d %d %d %d %d %d %d",
+         (options&1)?1:0, (options&2)?1:0,
+         (options&4)?1:0, (options&8)?1:0,
+         (options&16)?1:0, (options&32)?1:0,
+         (options&64)?1:0, (options&128)?1:0);
+  Eval(buf);
+}
+
+
diff --git a/src/sim/w_util.c b/src/sim/w_util.c
new file mode 100644 (file)
index 0000000..9f9db36
--- /dev/null
@@ -0,0 +1,295 @@
+/* w_util.c
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+/* comefrom: drawTaxesCollected incBoxValue decBoxValue drawCurrentFunds 
+            drawActualBox UpdateFunds updateCurrentCost */
+makeDollarDecimalStr(char *numStr, char *dollarStr)
+{
+  register short leftMostSet;
+  short numOfDigits;
+  short numOfChars;
+  register short numOfCommas;
+  register short dollarIndex = 0;
+  register short numIndex = 0;
+  register short x;
+
+  numOfDigits = strlen(numStr);
+
+  if (numOfDigits == 1) {
+    dollarStr[0] = '$';
+    dollarStr[1] = numStr[ 0 ];
+    dollarStr[2] = 0;
+    return;
+  } else if (numOfDigits == 2) {
+    dollarStr[0] = '$';
+    dollarStr[1] = numStr[0];
+    dollarStr[2] = numStr[1];
+    dollarStr[3] = 0;
+    return;
+  } else if (numOfDigits == 3) {
+    dollarStr[0] = '$';
+    dollarStr[1] = numStr[0];
+    dollarStr[2] = numStr[1];
+    dollarStr[3] = numStr[2];
+    dollarStr[4] = 0;
+  } else {
+    leftMostSet = numOfDigits % 3;
+    if (leftMostSet == 0)
+      leftMostSet = 3;
+    
+    numOfCommas = (numOfDigits - 1) / 3;
+    
+    /* add 1 for the dollar sign */
+    numOfChars = numOfDigits + numOfCommas + 1;
+    
+    dollarStr[numOfChars] = 0;
+    
+    dollarStr[dollarIndex++] = '$';
+    
+    for (x = 1; x <= leftMostSet; x++) {
+      dollarStr[dollarIndex++] = numStr[numIndex++];
+    }          
+
+    for (x = 1; x <= numOfCommas; x++) {
+      dollarStr[dollarIndex++] = ',';
+      dollarStr[dollarIndex++] = numStr[numIndex++];
+      dollarStr[dollarIndex++] = numStr[numIndex++];
+      dollarStr[dollarIndex++] = numStr[numIndex++];
+    }
+  }
+}
+
+
+Pause()
+{
+  if (!sim_paused) {
+    sim_paused_speed = SimMetaSpeed;
+    setSpeed(0);
+    sim_paused = 1;
+  }
+}
+
+
+Resume()
+{
+  if (sim_paused) {
+    sim_paused = 0;
+    setSpeed(sim_paused_speed);
+  }
+}
+
+
+setSpeed(short speed)
+{
+  if (speed < 0) speed = 0;
+  else if (speed > 3) speed = 3;
+
+  SimMetaSpeed = speed;
+
+  if (sim_paused) {
+    sim_paused_speed = SimMetaSpeed;
+    speed = 0;
+  }
+
+  SimSpeed = speed;
+
+  if (speed == 0) {
+    StopMicropolisTimer();
+  } else {
+    StartMicropolisTimer();
+  }
+
+  { char buf[256];
+    sprintf(buf, "UISetSpeed %d", sim_paused ? 0 : SimMetaSpeed);
+    Eval(buf);
+  }
+}
+
+
+setSkips(int skips)
+{
+  sim_skips = skips;
+  sim_skip = 0;
+}
+
+
+SetGameLevelFunds(short level)
+{
+  switch (level) {
+  default:
+  case 0:
+    SetFunds(20000);
+    SetGameLevel(0);
+    break;
+  case 1:
+    SetFunds(10000);
+    SetGameLevel(1);
+    break;
+  case 2:
+    SetFunds(5000);
+    SetGameLevel(2);
+    break;
+  }
+}
+
+
+SetGameLevel(short level)
+{
+  GameLevel = level;
+  UpdateGameLevel();
+}
+
+
+UpdateGameLevel()
+{
+  char buf[256];
+
+  sprintf(buf, "UISetGameLevel %d", GameLevel);
+  Eval(buf);
+}
+
+
+setCityName(char *name)
+{
+  char *cp = name;
+
+  while (*cp) {
+    if (!isalnum(*cp))
+      *cp = '_';
+    cp++;
+  }
+  setAnyCityName(name);
+}
+
+
+setAnyCityName(char *name)
+{
+  char buf[1024];
+
+  CityName = name;
+  sprintf(buf, "UISetCityName {%s}", CityName);
+  Eval(buf);
+}
+
+
+SetYear(int year)
+{
+  // Must prevent year from going negative, since it screws up the non-floored modulo arithmetic.
+  if (year < StartingYear) {
+    year = StartingYear;
+  }
+
+  year = (year - StartingYear) - (CityTime / 48);
+  CityTime += year * 48;
+  doTimeStuff();
+}
+
+
+int
+CurrentYear()
+{
+  return (CityTime/48 + StartingYear);
+}
+
+
+DoSetMapState(SimView *view, short state)
+{
+  char buf[256];
+
+  view->map_state = state;
+  view->invalid = 1;
+  EventuallyRedrawView(view);
+
+  sprintf(buf, "UISetMapState %s %d", Tk_PathName(view->tkwin), state);
+  Eval(buf);
+}
+
+
+DoNewGame()
+{
+  Eval("UINewGame");
+}
+
+
+DoGeneratedCityImage(char *name, int time, int pop, char *class, int score)
+{
+  /* XXX: TODO: print city */
+}
+
+
+DoStartElmd()
+{
+  /* XXX: TODO: start elm daemon */
+}
+
+
+DoPopUpMessage(char *msg)
+{
+  char buf[1024];
+
+  sprintf(buf, "UIPopUpMessage {%s}", msg);
+  Eval(buf);
+}
+
+
diff --git a/src/sim/w_x.c b/src/sim/w_x.c
new file mode 100644 (file)
index 0000000..a6472a0
--- /dev/null
@@ -0,0 +1,1544 @@
+/* w_x.c:  X Window System support
+ *
+ * Micropolis, Unix Version.  This game was released for the Unix platform
+ * in or about 1990 and has been modified for inclusion in the One Laptop
+ * Per Child program.  Copyright (C) 1989 - 2007 Electronic Arts Inc.  If
+ * you need assistance with this program, you may contact:
+ *   http://wiki.laptop.org/go/Micropolis  or email  micropolis@laptop.org.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.  You should have received a
+ * copy of the GNU General Public License along with this program.  If
+ * not, see <http://www.gnu.org/licenses/>.
+ * 
+ *             ADDITIONAL TERMS per GNU GPL Section 7
+ * 
+ * No trademark or publicity rights are granted.  This license does NOT
+ * give you any right, title or interest in the trademark SimCity or any
+ * other Electronic Arts trademark.  You may not distribute any
+ * modification of this program using the trademark SimCity or claim any
+ * affliation or association with Electronic Arts Inc. or its employees.
+ * 
+ * Any propagation or conveyance of this program must include this
+ * copyright notice and these terms.
+ * 
+ * If you convey this program (or any modifications of it) and assume
+ * contractual liability for the program to recipients of it, you agree
+ * to indemnify Electronic Arts for any liability that those contractual
+ * assumptions impose on Electronic Arts.
+ * 
+ * You may not misrepresent the origins of this program; modified
+ * versions of the program must be marked as such and not identified as
+ * the original program.
+ * 
+ * This disclaimer supplements the one included in the General Public
+ * License.  TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
+ * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
+ * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK.  THE ENTIRE RISK OF
+ * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU.  ELECTRONIC ARTS
+ * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
+ * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
+ * USAGE, OR TRADE PRACTICE.  ELECTRONIC ARTS DOES NOT WARRANT AGAINST
+ * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
+ * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
+ * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
+ * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
+ * CORRECTED.  NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
+ * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY.  SOME
+ * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
+ * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
+ * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
+ * NOT APPLY TO YOU.
+ */
+#include "sim.h"
+
+
+struct XDisplay *XDisplays = NULL;
+int DisplayCount = 0;
+#ifdef IS_LINUX
+int FlushStyle = 3;
+#else
+int FlushStyle = 4;
+#endif
+int GotXError;
+
+
+unsigned char ColorIntensities[] = {
+       /* COLOR_WHITE */               255,
+       /* COLOR_YELLOW */              170,
+       /* COLOR_ORANGE */              127,
+       /* COLOR_RED */                 85,
+       /* COLOR_DARKRED */             63,
+       /* COLOR_DARKBLUE */            76,
+       /* COLOR_LIGHTBLUE */           144,
+       /* COLOR_BROWN */               118,
+       /* COLOR_LIGHTGREEN */          76,
+       /* COLOR_DARKGREEN */           42,
+       /* COLOR_OLIVE */               118,
+       /* COLOR_LIGHTBROWN */          144,
+       /* COLOR_LIGHTGRAY */           191,
+       /* COLOR_MEDIUMGRAY */          127,
+       /* COLOR_DARKGRAY */            63,
+       /* COLOR_BLACK */               0,
+};
+
+
+ViewToTileCoords(SimView *view, int x, int y, int *outx, int *outy)
+{
+  x = (view->pan_x - ((view->w_width >>1) - x)) >>4;
+  y = (view->pan_y - ((view->w_height >>1) - y)) >>4;
+
+  if (x < 0) x = 0;
+  if (x >= WORLD_X) x = WORLD_X - 1;
+  if (y < 0) y = 0;
+  if (y >= WORLD_Y) y = WORLD_Y - 1;
+
+  if (x < view->tile_x)
+    x = view->tile_x;
+  if (x >= view->tile_x + view->tile_width)
+    x = view->tile_x + view->tile_width - 1;
+  if (y < view->tile_y)
+    y = view->tile_y;
+  if (y >= view->tile_y + view->tile_height)
+    y = view->tile_y + view->tile_height - 1;
+
+  if (view->tool_x_const != -1)
+    x = view->tool_x_const;
+  if (view->tool_y_const != -1)
+    y = view->tool_y_const;
+
+  *outx = x; *outy = y;
+}
+
+
+ViewToPixelCoords(SimView *view, int x, int y, int *outx, int *outy)
+{
+  x = view->pan_x - ((view->w_width >>1) - x);
+  y = view->pan_y - ((view->w_height >>1) - y);
+
+  if (x < 0) x = 0;
+  if (x >= (WORLD_X <<4)) x = (WORLD_X <<4) - 1;
+  if (y < 0) y = 0;
+  if (y >= (WORLD_Y <<4)) y = (WORLD_Y <<4) - 1;
+
+  if (x < (view->tile_x <<4))
+    x = (view->tile_x <<4);
+  if (x >= ((view->tile_x + view->tile_width) <<4))
+    x = ((view->tile_x + view->tile_width) <<4) - 1;
+  if (y < (view->tile_y <<4))
+    y = (view->tile_y <<4);
+  if (y >= ((view->tile_y + view->tile_height) <<4))
+    y = ((view->tile_y + view->tile_height) <<4) - 1;
+
+  if (view->tool_x_const != -1)
+    x = (view->tool_x_const <<4) + 8;
+  if (view->tool_y_const != -1)
+    y = (view->tool_y_const <<4) + 8;
+
+  *outx = x; *outy = y;
+}
+
+
+UpdateFlush()
+{
+  struct XDisplay *xd;
+
+  if (sim_skips > 0) {
+    if (sim_skip > 0) {
+      sim_skip--;
+      return;
+    }
+    sim_skip = sim_skips;
+  }
+
+  switch (FlushStyle) {
+
+  case 0:
+    break;
+
+  case 1:
+    for (xd = XDisplays; xd != NULL; xd = xd->next)
+      XFlush(xd->dpy);
+    break;
+
+  case 2:
+    for (xd = XDisplays; xd != NULL; xd = xd->next)
+      XSync(xd->dpy, False);
+    break;
+
+  case 3:
+    if (XDisplays && XDisplays->next) {
+      for (xd = XDisplays; xd != NULL; xd = xd->next) {
+       XFlush(xd->dpy);
+      }
+    }
+    for (xd = XDisplays; xd != NULL; xd = xd->next) {
+      XSync(xd->dpy, False);
+    }
+    break;
+
+  case 4:
+    for (xd = XDisplays; xd != NULL; xd = xd->next) {
+#ifndef IS_LINUX
+      /* XXX TODO: figure this out for linux and new x libs */
+      if ((xd->request != xd->dpy->request) ||
+         (xd->last_request_read != xd->dpy->last_request_read)) {
+       XSync(xd->dpy, False);
+       xd->request = xd->dpy->request;
+       xd->last_request_read = xd->dpy->last_request_read;
+      }
+#endif
+    }
+    break;
+
+  }
+}
+
+
+int
+CatchXError(Display *dpy, XErrorEvent *err)
+{
+  GotXError = 1;
+#if 0
+printf("GOT X ERROR code %d request code %d %d\n",
+       err->error_code, err->request_code, err->minor_code);
+#endif
+  return (0);
+}
+
+
+DoStopMicropolis()
+{
+  (void)XSetErrorHandler(CatchXError);
+
+  StopToolkit();
+
+  if (sim) {
+    while (sim->editor != NULL) {
+      DestroyView(sim->editor);
+    }
+
+    while (sim->map != NULL) {
+      DestroyView(sim->map);
+    }
+
+    while (sim->graph != NULL) {
+      DestroyGraph(sim->graph);
+    }
+
+#ifdef CAM
+    while (sim->scam != NULL) {
+      DestroyCam(sim->scam);
+    }
+#endif
+  }
+}
+
+
+DoTimeoutListen()
+{
+  while (Tk_DoOneEvent(TK_DONT_WAIT)) ;
+}
+
+
+Sim *
+MakeNewSim()
+{
+  Sim *sim;
+
+  sim = (Sim *)ckalloc(sizeof(Sim));
+  sim->editors = 0; sim->editor = NULL;
+  sim->maps = 0; sim->map = NULL;
+  sim->graphs = 0; sim->graph = NULL;
+  sim->sprites = 0; sim->sprite = NULL;
+#ifdef CAM
+  sim->scams = 0; sim->scam = NULL;
+#endif
+  sim->overlay = NULL;
+
+  return (sim);
+}
+
+
+XDisplay *
+FindXDisplay(Tk_Window tkwin)
+{
+  XDisplay *xd;
+  int d = 8;
+  unsigned long valuemask = 0;
+  XGCValues values;
+  XColor rgb, *color;
+  Display *dpy = Tk_Display(tkwin);
+  Screen *screen = Tk_Screen(tkwin);
+#ifdef IS_LINUX
+  char *display = ":0"; /* XXX TODO: fix this for new x libs */
+#else
+  char *display = dpy->display_name;
+#endif
+
+  for (xd = XDisplays;
+       xd && (xd->screen != screen);
+       xd = xd->next) ;
+
+  if (xd != NULL) {
+    return (xd);
+  } else {
+    xd = (struct XDisplay *)ckalloc(sizeof (struct XDisplay));
+
+    xd->references = 0;
+    xd->dpy = dpy;
+    xd->display = (char *)ckalloc(strlen(display) + 1);
+    xd->tkDisplay = ((TkWindow *)tkwin)->dispPtr;
+    strcpy(xd->display, display);
+    xd->screen = screen;
+    xd->root = RootWindowOfScreen(xd->screen);
+
+    xd->visual = Tk_DefaultVisual(xd->screen);
+    xd->depth = Tk_DefaultDepth(xd->screen);
+    xd->colormap = Tk_DefaultColormap(xd->screen);
+
+    xd->color = (xd->depth != 1);
+
+    xd->pixels = (int  *)ckalloc(16 * sizeof(int));
+    if (xd->color) { /* Color screen */
+      int GotColor = 1;
+
+#define GETCOLOR(i, name) \
+      if (!GotColor) { \
+       xd->pixels[i] = Rand16() & 255; \
+      } else { \
+       if ((color = Tk_GetColor(tk_mainInterp, tkwin, \
+                                None, name)) == NULL) { \
+         xd->pixels[i] = Rand16() & 255; \
+         GotColor = 0; \
+       } else { \
+         switch (xd->depth) { \
+         case 8: \
+           xd->pixels[i] = \
+             color->pixel; \
+           break; \
+         case 15: \
+           xd->pixels[i] = \
+             (((color->red >> (8 + 3)) & 0x1f) << (5 + 5)) | \
+             (((color->green >> (8 + 2)) & 0x1f) << (5)) | \
+             (((color->blue >> (8 + 3)) & 0x1f) << (0)); \
+           break; \
+         case 16: \
+           xd->pixels[i] = \
+             (((color->red >> (8 + 3)) & 0x1f) << (6 + 5)) | \
+             (((color->green >> (8 + 2)) & 0x3f) << (5)) | \
+             (((color->blue >> (8 + 3)) & 0x1f) << (0)); \
+           break; \
+         case 24: \
+           xd->pixels[i] = \
+             ((color->red & 0xff) << 16) | \
+             ((color->green & 0xff) << 8) | \
+             ((color->blue & 0xff) << 0); \
+           break; \
+         case 32: \
+           xd->pixels[i] = \
+             ((color->red & 0xff) << 16) | \
+             ((color->green & 0xff) << 8) | \
+             ((color->blue & 0xff) << 0); \
+           break; \
+         } \
+       } \
+      }
+      if ((xd->depth == 8) &&
+         (Tk_DefaultColormap(xd->screen) ==
+          DefaultColormapOfScreen(xd->screen))) {
+       xd->pixels[COLOR_WHITE] = WhitePixelOfScreen(xd->screen);
+       xd->pixels[COLOR_BLACK] = BlackPixelOfScreen(xd->screen);
+      } else {
+       GETCOLOR(COLOR_WHITE,           "#ffffff");
+       GETCOLOR(COLOR_BLACK,           "#000000");
+      }
+
+      GETCOLOR(COLOR_YELLOW,           "#ffff00");
+      GETCOLOR(COLOR_ORANGE,           "#ff7f00");
+      GETCOLOR(COLOR_RED,              "#ff0000");
+      GETCOLOR(COLOR_DARKRED,          "#bf0000");
+      GETCOLOR(COLOR_DARKBLUE,         "#0000e6");
+      GETCOLOR(COLOR_LIGHTBLUE,                "#6666e6");
+      GETCOLOR(COLOR_BROWN,            "#cc4c4c");
+      GETCOLOR(COLOR_LIGHTGREEN,       "#00e600");
+      GETCOLOR(COLOR_DARKGREEN,                "#007f00");
+      GETCOLOR(COLOR_OLIVE,            "#997f4c");
+      GETCOLOR(COLOR_LIGHTBROWN,       "#cc7f66");
+      GETCOLOR(COLOR_LIGHTGRAY,                "#bfbfbf");
+      GETCOLOR(COLOR_MEDIUMGRAY,       "#7f7f7f");
+      GETCOLOR(COLOR_DARKGRAY,         "#3f3f3f");
+
+      if (!GotColor) {
+       fprintf(stderr,
+               "Oh, dear.  There don't seem to be enough free colors on X display \"%s\".\n",
+               xd->display);
+       fprintf(stderr,
+               "Micropolis will try to run anyway, but might look pretty weird!\n");
+      }
+    } else { /* Black and white screen */
+      int white = WhitePixelOfScreen(xd->screen);
+      int black = BlackPixelOfScreen(xd->screen);
+
+      xd->pixels[COLOR_WHITE] = white;
+      xd->pixels[COLOR_BLACK] = black;
+
+      xd->pixels[COLOR_YELLOW] = white;
+      xd->pixels[COLOR_ORANGE] = white;
+      xd->pixels[COLOR_RED] = white;
+      xd->pixels[COLOR_DARKRED] = black;
+      xd->pixels[COLOR_DARKBLUE] = black;
+      xd->pixels[COLOR_LIGHTBLUE] = white;
+      xd->pixels[COLOR_BROWN] = black;
+      xd->pixels[COLOR_LIGHTGREEN] = white;
+      xd->pixels[COLOR_DARKGREEN] = black;
+      xd->pixels[COLOR_OLIVE] = black;
+      xd->pixels[COLOR_LIGHTBROWN] = white;
+      xd->pixels[COLOR_LIGHTGRAY] = white;
+      xd->pixels[COLOR_MEDIUMGRAY] = white;
+      xd->pixels[COLOR_DARKGRAY] = black;
+    }
+
+    xd->gc = Tk_DefaultGC(xd->screen);
+    XSetForeground(xd->dpy, xd->gc, xd->pixels[COLOR_BLACK]);
+    XSetBackground(xd->dpy, xd->gc, xd->pixels[COLOR_WHITE]);
+    XSetLineAttributes(xd->dpy, xd->gc,
+                      1, LineSolid, CapButt, JoinMiter);
+    XSetGraphicsExposures(xd->dpy, xd->gc, False);
+
+#ifndef MSDOS
+    { int major, minor, event, error, pixmaps;
+      if (WireMode ||
+         (XQueryExtension(xd->dpy, "MIT-SHM", /* Jeez! */
+                          &major, &event, &error) != True) ||
+         (XShmQueryVersion(xd->dpy,
+                           &major, &minor, &pixmaps) != True)) {
+       fprintf(stderr,
+               "Darn, X display \"%s\" doesn't support the shared memory extension.\n",
+               xd->display);
+       xd->shared = 0;
+      } else {
+       if (!pixmaps) {
+         fprintf(stderr,
+                 "Darn, X display \"%s\" claims to support the shared memory extension,\n",
+                 xd->display);
+         fprintf(stderr,
+                 "but is too lame to support shared memory pixmaps, so Micropolis will run slower.\n");
+         fprintf(stderr,
+                 "Please complain to your X server vendor, %s\n",
+                 XServerVendor(xd->dpy));
+         xd->shared = -1;
+       } else {
+         fprintf(stderr,
+                 "Cool, I found the shared memory extension!\n");
+         xd->shared = 1;
+       }
+      }
+    }
+#else
+    xd->shared = 0;
+#endif
+
+    xd->request = -1;
+    xd->last_request_read = -1;
+    xd->big_tile_pixmap = None;
+    xd->objects = NULL;
+    xd->overlay_gc = NULL;
+    xd->gray25_stipple = None;
+    xd->gray50_stipple = None;
+    xd->gray75_stipple = None;
+    xd->vert_stipple = None;
+    xd->horiz_stipple = None;
+    xd->diag_stipple = None;
+
+    xd->big_tile_image = xd->small_tile_image = NULL;
+
+    xd->next = XDisplays; XDisplays = xd;
+  }
+
+  return (xd);
+}
+
+
+IncRefDisplay(XDisplay *xd)
+{
+  xd->references++;
+}
+
+
+DecRefDisplay(XDisplay *xd)
+{
+  if ((--xd->references) == 0) {
+    /* I'd blow it away, but tk may still be using the display */
+  }
+}
+
+
+SimView *
+InitNewView(SimView *view, char *title, int class, int w, int h)
+{
+  int type, i;
+  int d = 8;
+  unsigned long valuemask = 0;
+  char *t;
+  struct XDisplay *xd;
+  XGCValues values;
+  XColor rgb, *color;
+
+  t = (char *)ckalloc(strlen(title) + 1);
+  strcpy(t, title);
+
+  view->next = NULL;
+  view->title = t;
+  view->type = -1;
+  view->class = class;
+  view->bigtiles = view->smalltiles = NULL;
+  view->pixels = NULL;
+  view->line_bytes = 0;
+  view->line_bytes8 = 0;
+  view->pixel_bytes = 0;
+  view->depth = 0;
+  view->data = NULL;
+  view->data8 = NULL;
+  view->visible = 0;
+  view->invalid = 0;
+  view->skips = view->skip = 0;
+  view->update = 0;
+  view->map_state = ALMAP;
+  view->show_editors = 1;
+  view->tool_showing = 0;
+  view->tool_mode = 0;
+  view->tool_x = view->tool_y = 0;
+  view->tool_x_const = view->tool_y_const = -1;
+  view->tool_state = dozeState;
+  view->tool_state_save = -1;
+  view->super_user = 0;
+  view->show_me = 1;
+  view->dynamic_filter = 0;
+  view->auto_scroll_token = 0;
+  view->tool_event_time = 0;
+  view->tool_last_event_time = 0;
+  view->w_x = view->w_y = 0;
+  view->w_width = view->w_height = 16;
+  view->m_width = view->m_height = 0;
+  view->i_width = w; view->i_height = h;
+  view->pan_x = view->pan_y = 0;
+  view->tile_x = view->tile_y = 0;
+  view->tile_width = view->tile_height = 0;
+  view->screen_x = view->screen_y = 0;
+  view->screen_width = view->screen_height = 0;
+  view->last_x = view->last_y = view->last_button = 0;
+  view->track_info = NULL;
+  view->message_var = NULL;
+
+/* This stuff was initialized in our caller (SimViewCmd) */
+/*  view->tkwin = NULL; */
+/*  view->interp = NULL; */
+/*  view->flags = 0; */
+
+  view->x = NULL;
+  view->shminfo = NULL;
+  view->tiles = NULL;
+  view->other_tiles = NULL;
+  view->image = NULL;
+  view->other_image = NULL;
+  view->other_data = NULL;
+  view->pixmap = None;
+  view->pixmap2 = None;
+  view->overlay_pixmap = None;
+  view->overlay_valid = 0;
+  view->fontPtr = NULL;
+  view->updates = 0;
+  view->update_real = view->update_user = view->update_system = 0.0;
+  view->update_context = 0;
+  view->auto_goto = 0;
+  view->auto_going = 0;
+  view->auto_x_goal = view->auto_x_goal = 0;
+  view->auto_speed = 75;
+  view->follow = NULL;
+  view->sound = 1;
+  view->width = 0; view->height = 0;
+  view->show_overlay = 1;
+  view->overlay_mode = 0;
+
+  view->x = FindXDisplay(view->tkwin);
+  IncRefDisplay(view->x);
+
+  /* view->x->shared is 1 if the shared memory extension is present and
+     supports shared memory pixmaps, and -1 if it is present but doesn't. */
+  if (view->x->shared != 1) {
+    view->type = X_Wire_View;
+  } else {
+    view->type = X_Mem_View;
+  }
+
+  GetPixmaps(view->x);
+  view->pixels = view->x->pixels;
+
+  if (w == EDITOR_W) w = 256; /* XXX */
+  if (h == EDITOR_H) h = 256; /* XXX */
+
+  view->pan_x = w / 2; view->pan_y = h / 2;
+  DoResizeView(view, w, h);
+
+  GetViewTiles(view);
+
+  return (view);
+}
+
+
+DestroyView(SimView *view)
+{
+  SimView **vp;
+
+  CancelRedrawView(view);
+
+  for (vp = ((view->class == Editor_Class) ?
+            (&sim->editor) : (&sim->map));
+       (*vp) != NULL;
+       vp = &((*vp)->next)) {
+    if ((*vp) == view) {
+      (*vp) = view->next;
+      if (view->class == Editor_Class)
+       sim->editors--;
+      else
+       sim->maps--;
+         
+      break;
+    }
+  }
+
+  if (view->title != NULL) {
+    ckfree (view->title);
+    view->title = NULL;
+  }
+
+  if (view->pixmap != None) {
+    XFreePixmap(view->x->dpy, view->pixmap);
+    view->pixmap = None;
+  }
+
+  if (view->pixmap2 != None) {
+    XFreePixmap(view->x->dpy, view->pixmap2);
+    view->pixmap2 = None;
+  }
+
+  if (view->overlay_pixmap != None) {
+    XFreePixmap(view->x->dpy, view->overlay_pixmap);
+    view->overlay_pixmap = None;
+  }
+
+  if (view->auto_scroll_token) {
+    Tk_DeleteTimerHandler(view->auto_scroll_token);
+    view->auto_scroll_token = 0;
+  }
+
+#ifndef MSDOS
+  if (view->shminfo) {
+    XShmDetach(view->x->dpy, view->shminfo);
+    shmdt(view->shminfo->shmaddr);
+    shmctl(view->shminfo->shmid, IPC_RMID, 0);
+    ckfree(view->shminfo);
+    view->shminfo = NULL;
+    if (view->image) {
+      view->image->data = NULL;
+      view->data = NULL;
+      XDestroyImage(view->image);
+      view->image = NULL;
+    }
+  } else {
+#endif
+    if (view->image) {
+      if (view->image->data) {
+       ckfree(view->image->data);
+       view->image->data = NULL;
+      }
+      view->data = NULL;
+      XDestroyImage(view->image);
+      view->image = NULL;
+    }
+#ifndef MSDOS
+  }
+#endif
+
+  if (view->other_image) {
+      if (view->other_image->data) {
+       ckfree(view->other_image->data);
+       view->other_image->data = NULL;
+      }
+      view->other_data = NULL;
+      XDestroyImage(view->other_image);
+      view->other_image = NULL;
+  }
+
+  if (view->tiles)
+    FreeTiles(view);
+
+  DecRefDisplay(view->x);
+
+  ckfree((char *) view);
+}
+
+
+unsigned char *
+AllocPixels(int len, unsigned char pixel)
+{
+  int i;
+  unsigned char *data, *cp;
+
+  cp = data = (unsigned char *)ckalloc(len);
+  for (i = len; i > 0; i--) {
+    *(cp++) = pixel;
+  }
+
+  return (data);
+}
+
+
+DoResizeView(SimView *view, int w, int h)
+{
+  int resize = 0;
+
+  view->w_width = w;
+  view->w_height = h;
+
+  if (view->class == Map_Class) { /* Map_Class */
+    view->m_width = w;
+    view->m_height = h;
+
+    if (view->pixmap2 == None) {
+
+      view->pixmap2 = XCreatePixmap(view->x->dpy, view->x->root,
+                                   w, h, view->x->depth);
+      if (view->pixmap2 == None) {
+       fprintf(stderr,
+               "Sorry, Micropolis can't create a pixmap on X display \"%s\"!\n",
+               view->x->display);
+       sim_exit(1); // Just sets tkMustExit and ExitReturn
+       return;
+      }
+    }
+
+  } else { /* Editor_Class */
+
+    if ((w = (w + 31) & (~15)) > view->m_width)
+      view->m_width = w, resize++;
+    if ((h = (h + 31) & (~15)) > view->m_height)
+      view->m_height = h, resize++;
+
+    if (resize || (view->pixmap2 == None)) {
+      if (view->pixmap2 != None) {
+       XFreePixmap(view->x->dpy, view->pixmap2);
+       view->pixmap2 = None;
+      }
+      view->pixmap2 = XCreatePixmap(view->x->dpy, view->x->root,
+                                   view->m_width, view->m_height,
+                                   view->x->depth);
+      if (view->pixmap2 == None) {
+       fprintf(stderr,
+               "Sorry, Micropolis couldn't create a pixmap on X display \"%s\"!\n",
+               view->x->display);
+       sim_exit(1); // Just sets tkMustExit and ExitReturn
+       return;
+      }
+    }
+
+    if (resize || (view->overlay_pixmap == None)) {
+      view->overlay_mode = 0;
+      if (view->overlay_pixmap != None) {
+       XFreePixmap(view->x->dpy, view->overlay_pixmap);
+       view->overlay_pixmap = None;
+      }
+      view->overlay_pixmap = XCreatePixmap(view->x->dpy, view->x->root,
+                                          view->m_width, view->m_height,
+                                          1);
+      if (view->overlay_pixmap == None) {
+       fprintf(stderr,
+               "Sorry, Micropolis couldn't create another pixmap on X display \"%s\".\n",
+               view->x->display);
+       sim_exit(1); // Just sets tkMustExit and ExitReturn
+       return;
+      }
+      if (view->x->overlay_gc == NULL) {
+       unsigned long valuemask = 0;
+       XGCValues values;
+
+       view->x->overlay_gc =
+         XCreateGC(view->x->dpy, view->overlay_pixmap, valuemask, &values);
+       XSetForeground(view->x->dpy, view->x->overlay_gc, 0);
+       XSetBackground(view->x->dpy, view->x->overlay_gc, 1);
+       XSetLineAttributes(view->x->dpy, view->x->overlay_gc, 
+                          1, LineSolid, CapButt, JoinMiter);
+       XSetGraphicsExposures(view->x->dpy, view->x->overlay_gc, False);
+      }
+    }
+
+  }
+
+#ifndef MSDOS
+  if (view->type != X_Mem_View) {
+    goto SPRING_FORWARD;
+  }
+
+  if (resize || (view->image == NULL)) {
+    if (view->shminfo && view->image) {
+      if (view->pixmap != None) {
+       XFreePixmap(view->x->dpy, view->pixmap);
+       view->pixmap = None;
+      }
+      XShmDetach(view->x->dpy, view->shminfo);
+      shmdt(view->shminfo->shmaddr);
+      shmctl(view->shminfo->shmid, IPC_RMID, 0);
+      view->image->data = NULL;
+      if (view->data == view->data8)
+       view->data8 = NULL;
+      view->data = NULL;
+      XDestroyImage(view->image);
+      view->image = NULL;
+    }
+
+#if 0
+    /* XShmPixmapFormat is documented but does not exist !!! */
+    if (XShmPixmapFormat(view->x->dpy) != ZPixmap) {
+      fprintf(stderr,
+             "Darn, display \"%s\" has the wrong shared memory format.\n",
+             view->x->display);
+      goto FALL_BACK;
+    }
+#endif
+
+    if (!view->shminfo) {
+      view->shminfo = (XShmSegmentInfo *)ckalloc(sizeof (XShmSegmentInfo));
+    }
+
+    view->image =
+      XShmCreateImage(view->x->dpy, view->x->visual, view->x->depth,
+                     view->x->color ? ZPixmap : XYBitmap,
+                     NULL, view->shminfo,
+                     view->m_width, view->m_height);
+
+    view->line_bytes = view->image->bytes_per_line;
+
+    switch (view->x->depth) {
+
+    case 1:
+      view->pixel_bytes = 0;
+      view->depth = 1;
+      break;
+
+    case 8:
+      view->pixel_bytes = 1;
+      view->depth = 8;
+      break;
+
+    case 15:
+      view->pixel_bytes = 2;
+      view->depth = 15;
+      break;
+
+    case 16:
+      view->pixel_bytes = 2;
+      view->depth = 16;
+      break;
+
+    case 24:
+      /* XXX: TODO: 24 and 32 bit support */
+      view->pixel_bytes = 4;
+      //view->pixel_bytes = 3;
+      view->depth = 24;
+      break;
+
+    case 32:
+      /* XXX: TODO: 24 and 32 bit support */
+      view->pixel_bytes = 4;
+      view->depth = 32;
+      break;
+
+    default:
+      view->pixel_bytes = 0;
+      view->depth = 0;
+      break;
+
+    } // switch
+
+    view->shminfo->shmid = shmget(IPC_PRIVATE,
+                                 (view->line_bytes *
+                                  view->m_height),
+                                 (IPC_CREAT | 0777));
+    if (view->shminfo->shmid < 0) {
+      perror("shmget");
+      fprintf(stderr,
+             "Darn, Micropolis can't share memory with X display \"%s\".\n",
+             view->x->display);
+      goto FALL_BACK;
+    }
+
+    view->data = (unsigned char *)shmat(view->shminfo->shmid, 0, 0);
+    if ((int)view->data == -1) {
+      perror("shmat");
+      fprintf(stderr,
+             "Darn, Micropolis can't find any memory to share with display \"%s\".\n",
+             view->x->display);
+      goto FALL_BACK;
+    }
+
+    view->image->data = (char *)view->data;
+    view->shminfo->shmaddr = (char *)view->data;
+    view->shminfo->readOnly = False;
+
+    { int (*old)();
+      int result;
+      int attached = 0;
+      GotXError = 0;
+      old = XSetErrorHandler(CatchXError);
+
+      result = 
+       XShmAttach(view->x->dpy, view->shminfo);
+      if (result  == 0) {
+       fprintf(stderr,
+               "Darn, the X display \"%s\" can't access Micropolis's shared memory.\n",
+               view->x->display);
+       GotXError = 1;
+      }
+
+      XSync(view->x->dpy, False);
+
+      if (!GotXError) {
+       attached = 1;
+       view->pixmap = XShmCreatePixmap(view->x->dpy, view->x->root,
+                                       view->data, view->shminfo,
+                                       view->m_width, view->m_height,
+                                       view->x->depth);
+       XSync(view->x->dpy, False);
+
+       if (GotXError ||
+           (view->pixmap == None)) {
+         fprintf(stderr,
+                 "Darn, Micropolis couldn't get a shared memory pixmap on X display \"%s\".\n",
+                 view->x->display);
+         GotXError = 1;
+       }
+      }
+
+      XSetErrorHandler(old);
+
+      if (GotXError) {
+       view->pixmap = None;
+       if (attached) {
+          XShmDetach(view->x->dpy, view->shminfo);
+       } // if
+        result = shmdt(view->shminfo->shmaddr);
+        result = shmctl(view->shminfo->shmid, IPC_RMID, 0);
+        ckfree(view->shminfo);
+        view->shminfo = NULL;
+        if (view->image) {
+          view->image->data = NULL;
+          view->data = NULL;
+          XDestroyImage(view->image);
+          view->image = NULL;
+        }
+       goto FALL_BACK;
+      }
+
+      if (view->x->color) {
+       XSetForeground(view->x->dpy, view->x->gc,
+                      view->pixels[COLOR_LIGHTBROWN]);
+      } else {
+       XSetForeground(view->x->dpy, view->x->gc,
+                      view->pixels[COLOR_WHITE]);
+      }
+
+      XFillRectangle(view->x->dpy, view->pixmap, view->x->gc,
+                    0, 0, view->m_width, view->m_height);
+    }
+  }
+
+  goto FINISH;
+
+ FALL_BACK:
+
+  fprintf(stderr,
+         "Falling back to the X network protocol on display \"%s\"...\n",
+         view->x->display);
+#endif
+
+  view->x->shared = 0;
+  view->type = X_Wire_View;
+  if (view->pixmap != None) {
+    XFreePixmap(view->x->dpy, view->pixmap);
+    view->pixmap = None;
+  }
+#ifndef MSDOS
+  if (view->shminfo) {
+    if (view->shminfo->shmid >= 0) {
+      if (view->shminfo->shmaddr) {
+       shmdt(view->shminfo->shmaddr);
+      }
+      shmctl(view->shminfo->shmid, IPC_RMID, 0);
+    }
+    ckfree((char *)view->shminfo);
+    view->shminfo = NULL;
+  }
+#endif
+  if (view->image) {
+    view->image->data = NULL;
+    XDestroyImage(view->image);
+    view->image = NULL;
+  }
+  view->data = NULL;
+  view->line_bytes = 0;
+  view->pixel_bytes = 0;
+  view->depth = 0;
+
+ SPRING_FORWARD:
+
+  if (resize || (view->pixmap == None)) {
+    if (view->pixmap != None) {
+      XFreePixmap(view->x->dpy, view->pixmap);
+      view->pixmap = None;
+    }
+    view->pixmap = XCreatePixmap(view->x->dpy, view->x->root,
+                                view->m_width, view->m_height,
+                                view->x->depth);
+    if (view->pixmap == None) {
+      fprintf(stderr,
+             "Sorry, Micropolis can't create pixmap on X display \"%s\".\n",
+             view->x->display);
+      sim_exit(1); // Just sets tkMustExit and ExitReturn
+      return;
+    }
+    if (view->x->color) {
+      XSetForeground(view->x->dpy, view->x->gc,
+                    view->pixels[COLOR_LIGHTBROWN]);
+    } else {
+      XSetForeground(view->x->dpy, view->x->gc,
+                    view->pixels[COLOR_WHITE]);
+    }
+    XFillRectangle(view->x->dpy, view->pixmap, view->x->gc,
+                    0, 0, view->m_width, view->m_height);
+  }
+
+ FINISH:
+
+  if (view->class == Editor_Class) {
+
+    AllocTiles(view);
+    DoAdjustPan(view);
+
+  } else if (view->class == Map_Class) {
+
+    if (view->type == X_Mem_View) { /* Memory Map */
+
+      if (view->x->color) {
+
+       /* Color, Shared Memory */
+
+       view->data8 = view->data;
+       view->line_bytes8 = view->line_bytes; /* XXX: ??? */
+
+       switch (view->x->depth) {
+
+       case 8:
+         view->pixel_bytes = 1;
+         view->depth = 8;
+         break;
+
+       case 15:
+         view->pixel_bytes = 2;
+         view->depth = 15;
+         break;
+
+       case 16:
+         view->pixel_bytes = 2;
+         view->depth = 16;
+         break;
+
+       case 24:
+         /* XXX: TODO: 24 and 32 bit support */
+         view->pixel_bytes = 4;
+         //view->pixel_bytes = 3;
+         view->depth = 24;
+         break;
+
+       case 32:
+         /* XXX: TODO: 24 and 32 bit support */
+         view->pixel_bytes = 4;
+         view->depth = 32;
+         break;
+
+       default:
+         view->pixel_bytes = 0;
+         view->depth = 0;
+         break;
+
+       } // switch
+
+      } else {
+
+       /* Black and White, Shared Memory */
+
+       if (view->other_image != NULL) {
+         XDestroyImage(view->other_image);
+       }
+
+       view->line_bytes8 = view->m_width; /* XXX: fix depth */
+       view->pixel_bytes = 0;
+       view->depth = 1;
+
+       view->other_data = view->data8 =
+         AllocPixels(view->m_height * view->line_bytes8, /* XXX: fix depth */
+                     view->pixels[COLOR_WHITE]);
+       view->other_image =
+         XCreateImage(view->x->dpy, view->x->visual, 8, /* XXX: fix depth */
+                      ZPixmap, 0, (char *)view->other_data,
+                      view->m_width, view->m_height,
+                      8, view->line_bytes8); /* XXX: fix depth */
+      }
+
+    } else { /* Wire Map */
+      int bitmap_pad;
+      int bitmap_depth;
+
+      if (view->image != NULL) {
+       XDestroyImage(view->image);
+       view->image = NULL;
+      }
+
+      if (view->other_image != NULL) {
+       XDestroyImage(view->other_image);
+       view->other_image = NULL;
+      }
+
+      if (view->x->color) {
+
+       /* Color, Wire */
+
+       switch (view->x->depth) {
+
+       case 8:
+         view->pixel_bytes = 1;
+         view->depth = 8;
+         bitmap_pad = 8;
+         bitmap_depth = 8;
+         view->line_bytes8 =
+           ((view->m_width * view->pixel_bytes) + 3) & (~3);
+         break;
+
+       case 15:
+         view->pixel_bytes = 2;
+         view->depth = 15;
+         bitmap_pad = 16;
+         bitmap_depth = 16;
+         view->line_bytes8 =
+           ((view->m_width * view->pixel_bytes) + 3) & (~3);
+         break;
+
+       case 16:
+         view->pixel_bytes = 2;
+         view->depth = 16;
+         bitmap_pad = 16;
+         bitmap_depth = 16;
+         view->line_bytes8 =
+           ((view->m_width * view->pixel_bytes) + 3) & (~3);
+         break;
+
+       case 24:
+         view->pixel_bytes = 4;
+         //view->pixel_bytes = 3;
+         view->depth = 24;
+         bitmap_depth = 32;
+         bitmap_pad = 32;
+         view->line_bytes8 =
+           ((view->m_width * 4) + 3) & (~3);
+         break;
+
+       case 32:
+         view->pixel_bytes = 4;
+         view->depth = 32;
+         bitmap_pad = 32;
+         bitmap_depth = 32;
+         view->line_bytes8 =
+           ((view->m_width * 4) + 3) & (~3);
+         break;
+
+       default:
+         assert(0); /* Unknown depth */
+         break;
+
+       } // switch
+
+       view->line_bytes = 
+         view->line_bytes8;
+
+      } else {
+
+       /* Black and White, Wire */
+
+       view->pixel_bytes = 0;
+       view->depth = 1;
+        view->line_bytes8 =
+         (view->m_width + 3) & (~3); /* XXX: handle depth */
+       view->line_bytes =
+         (view->m_width + 7) >>3;
+       bitmap_pad = 8;
+       bitmap_depth = 8;
+
+      }
+
+      view->data =
+       AllocPixels(view->m_height * view->line_bytes, 0);
+      view->image =
+       XCreateImage(view->x->dpy, view->x->visual,
+                    bitmap_depth,
+                    view->x->color ? ZPixmap : XYBitmap,
+                    0, (char *)view->data,
+                    view->m_width, view->m_height,
+                    bitmap_pad,
+                    view->line_bytes);
+
+      view->other_data =
+       AllocPixels(view->m_height * view->line_bytes8, 0);
+      view->other_image =
+       XCreateImage(view->x->dpy, view->x->visual,
+                    bitmap_depth,
+                    ZPixmap,
+                    0, (char *)view->other_data,
+                    view->m_width, view->m_height,
+                    bitmap_pad,
+                    view->line_bytes);
+
+      if (view->x->color) {
+       view->data8 = view->data;
+      } else {
+       view->data8 = view->other_data;
+      }
+    }
+  }
+}
+
+
+DoPanBy(struct SimView *view, int dx, int dy)
+{
+  DoPanTo(view, view->pan_x + dx, view->pan_y + dy);
+}
+
+
+DoPanTo(struct SimView *view, int x, int y)
+{
+  if (view->class != Editor_Class) {
+    return;
+  }
+
+  if (x < 0) x = 0;
+  if (y < 0) y = 0;
+  if (x > view->i_width) x = view->i_width - 1;
+  if (y > view->i_height) y = view->i_height - 1;
+  if ((view->pan_x != x) ||
+      (view->pan_y != y)) {
+    view->pan_x = x;
+    view->pan_y = y;
+    DoAdjustPan(view);
+  }
+}
+
+/* #define DEBUG_PAN */
+
+DoAdjustPan(struct SimView *view)
+{
+  int ww2 = view->w_width >>1, wh2 = view->w_height >>1;
+  int px = view->pan_x, py = view->pan_y;
+  int last_tile_x = view->tile_x, last_tile_y = view->tile_y;
+  int last_tile_width = view->tile_width, last_tile_height = view->tile_height;
+  int total_width = view->m_width >>4, total_height = view->m_height >>4;
+//fprintf(stderr, "DoAdjustPan\n");
+
+#ifdef DEBUG_PAN
+  printf("AdjustPan window %d %d  ww2 %d wh2 %d  pan %d %d\n",
+        view->w_width, view->w_height, ww2, wh2, px, py);
+  printf("  last tile %d %d %d %d\n",
+        last_tile_x, last_tile_y, last_tile_width, last_tile_height);
+#endif
+
+  if ((view->tile_x = ((px - ww2) >>4)) < 0)
+    view->tile_x = 0;
+  if ((view->tile_y = ((py - wh2) >>4)) < 0)
+    view->tile_y = 0;
+
+#ifdef DEBUG_PAN
+  printf("  now tile %d %d\n", view->tile_x, view->tile_y);
+#endif
+
+  view->tile_width = ((15 + px + ww2) >>4);
+  view->tile_height = ((15 + py + wh2) >>4);
+
+#ifdef DEBUG_PAN
+  printf("    outer tile %d %d\n", view->tile_width, view->tile_height);
+#endif
+
+  if (view->tile_width > (view->i_width >>4))
+    view->tile_width = (view->i_width >>4);
+  view->tile_width -= view->tile_x;
+  if (view->tile_height > (view->i_height >>4))
+    view->tile_height = (view->i_height >>4);
+  view->tile_height -= view->tile_y;
+
+#ifdef DEBUG_PAN
+  printf("    tile size %d %d\n", view->tile_width, view->tile_height);
+#endif
+
+  if (view->tile_width > (view->m_width >>4))
+    view->tile_width = (view->m_width >>4);
+  if (view->tile_height > (view->m_height >>4))
+    view->tile_height = (view->m_height >>4);
+
+#ifdef DEBUG_PAN
+  printf("    clipped size %d %d\n", view->tile_width, view->tile_height);
+  printf("    maximum size %d %d\n", view->m_width >>4, view->m_height >>4);
+#endif
+
+  view->screen_x = (ww2 - px) + (view->tile_x <<4);
+  view->screen_y = (wh2 - py) + (view->tile_y <<4);
+  view->screen_width = (view->tile_width <<4);
+  view->screen_height = (view->tile_height <<4);
+
+#ifdef DEBUG_PAN
+  printf("    screen %d %d %d %d\n",
+        view->screen_x, view->screen_y,
+        view->screen_width, view->screen_height);
+#endif
+
+  view->overlay_mode = 0;
+//  view->skip = 0;
+  view->invalid = 1;
+  if (SimSpeed == 0) {
+    EventuallyRedrawView(view);
+  }
+/*  InvalidateEditors(); */
+  if (view->show_me) {
+    RedrawMaps();
+  }
+/*  FixMicropolisTimer(); */
+
+  { int dx = last_tile_x - view->tile_x,
+        dy = last_tile_y - view->tile_y;
+    short **want = view->other_tiles,
+         **have = view->tiles;
+
+#ifdef DEBUG_PAN
+    printf("scrolling %d %d\n", dx, dy);
+#endif
+
+    if ((dx != 0) || (dy != 0)) {
+      int row, col, x, y,
+          width = view->tile_width,
+          height = view->tile_height;
+
+      for (col = 0; col < width; col++)
+       memcpy(want[col], have[col], (height * sizeof(short)));
+
+      for (col = 0; col < total_width; col++) {
+       x = col - dx;
+       for (row = 0; row < total_height; row++) {
+         y = row - dy;
+         if ((x >= 0) && (x < width) &&
+             (y >= 0) && (y < height)) {
+           have[col][row] = want[x][y];
+         } else {
+           have[col][row] = -1;
+         }
+       }
+      }
+
+      XCopyArea(view->x->dpy, view->pixmap, view->pixmap, view->x->gc,
+               0, 0, view->tile_width <<4, view->tile_height <<4,
+               dx <<4, dy <<4);
+
+      if (view->type == X_Mem_View) {
+       XSync(view->x->dpy, False);
+      }
+    }
+  }
+}
+
+
+AllocTiles(SimView *view)
+{
+  int row, col;
+  short **have, **want;
+  int w = view->m_width / 16, h = view->m_height / 16;
+  int n = (w + 1) * sizeof (short *);
+
+  if (view->tiles)
+    FreeTiles(view);
+
+  have = view->tiles =
+    (short **)ckalloc(n);
+
+  want = view->other_tiles =
+    (short **)ckalloc(n);
+
+  have[w] = want[w] = NULL;
+
+  n = h * sizeof(short);
+  for (col = 0; col < w; col++) {
+
+    have[col] = (short *)ckalloc(n);
+    want[col] = (short *)ckalloc(n);
+    for (row = 0; row < h; row++) {
+      have[col][row] = -1;
+      want[col][row] = -1;
+    }
+  }
+}
+
+
+FreeTiles(SimView *view)
+{
+  int col;
+
+  for (col = 0; view->tiles[col] != NULL; col++) {
+    ckfree ((char *)view->tiles[col]);
+    ckfree ((char *)view->other_tiles[col]);
+  }
+  ckfree ((char *)view->tiles);
+  view->tiles = NULL;
+  ckfree ((char *)view->other_tiles);
+  view->other_tiles = NULL;
+}
+
+
+#define POINT_BATCH 32
+
+Ink *OldInk = NULL;
+
+
+/* XXX: todo: ink locking so someone doesn't erase ink that's being drawn */
+
+Ink *
+NewInk()
+{
+  Ink *ink;
+
+  if (OldInk) {
+    ink = OldInk;
+    OldInk = OldInk->next;
+  } else {
+    ink = (Ink *)ckalloc(sizeof(Ink));
+    ink->maxlength = POINT_BATCH;
+    ink->points = (XPoint *)ckalloc(POINT_BATCH * sizeof(XPoint));
+  }
+  ink->length = 0;
+  ink->color = COLOR_WHITE;
+  ink->next = NULL;
+  ink->left = ink->right = ink->top = ink->bottom =
+    ink->last_x = ink->last_y = -1;
+  return (ink);
+}
+
+
+FreeInk(Ink *ink)
+{
+  ink->next = OldInk;
+  OldInk = ink;
+}
+
+
+StartInk(Ink *ink, int x, int y)
+{
+  ink->length = 1;
+  ink->left = ink->right = ink->last_x = ink->points[0].x = x;
+  ink->top = ink->bottom = ink->last_y = ink->points[0].y = y;
+}
+
+
+AddInk(Ink *ink, int x, int y)
+{
+  int dx = x - ink->last_x;
+  int dy = y - ink->last_y;
+
+  if ((dx != 0) || (dy != 0)) {
+/*
+    if (ink->length > 1) {
+      if ((dx == 0) &&
+         (ink->points[ink->length - 1].x == 0) &&
+         ((ink->points[ink->length - 1].y < 0) ?
+          (dy < 0) : (dy > 0))) {
+       ink->points[ink->length - 1].y += dy;
+       goto ADJUST;
+      } else if ((dy == 0) &&
+                (ink->points[ink->length - 1].y == 0) &&
+                ((ink->points[ink->length - 1].x < 0) ?
+                 (dx < 0) : (dx > 0))) {
+       ink->points[ink->length - 1].x += dx;
+       goto ADJUST;
+      }
+    }
+*/
+
+    if (ink->length >= ink->maxlength) {
+      ink->maxlength += POINT_BATCH;
+      ink->points = (XPoint *)realloc((void *)ink->points,
+                                     ink->maxlength * sizeof(XPoint));
+    }
+    ink->points[ink->length].x = dx;
+    ink->points[ink->length].y = dy;
+    ink->length++;
+
+  ADJUST:
+    if (x < ink->left)
+      ink->left = x;
+    if (x > ink->right)
+      ink->right = x;
+    if (y < ink->top)
+      ink->top = y;
+    if (y > ink->bottom)
+      ink->bottom = y;
+
+    { int left, right, top, bottom;
+      SimView *view;
+
+      if (ink->last_x < x) { left = ink->last_x; right = x; }
+      else { left = x; right = ink->last_x; }
+      if (ink->last_y < y) { top = ink->last_y; bottom = y; }
+      else { top = y; bottom = ink->last_y; }
+
+      left -= 5; right += 5; top -= 5; bottom += 5;
+
+      for (view = sim->editor; view != NULL; view = view->next) {
+       int vleft, vtop;
+
+       if ((right >= (vleft = view->pan_x - (view->w_width / 2))) &&
+           (left <= vleft + view->w_width) &&
+           (bottom >= (vtop = view->pan_y - (view->w_height / 2))) &&
+           (top <= vtop + view->w_height)) {
+         /* XXX: do studly incremental update instead */
+         view->overlay_mode = 0;
+         EventuallyRedrawView(view);
+       }
+      }
+    }
+    ink->last_x = x; ink->last_y = y;
+  }
+}
+
+
+EraseOverlay()
+{
+  Ink *ink;
+
+  while (sim->overlay) {
+    ink = sim->overlay;
+    sim->overlay = ink->next;
+    FreeInk(ink);
+  }
+}
diff --git a/src/tcl/compat/README b/src/tcl/compat/README
new file mode 100644 (file)
index 0000000..bc5bced
--- /dev/null
@@ -0,0 +1,6 @@
+This directory contains various header and code files that are
+used make Tcl compatible with various releases of UNIX and UNIX-like
+systems.  Typically, files from this directory are used to compile
+Tcl when the corresponding files aren't present in the system's
+library area.  When the whole world is POSIX-ified, this information
+should become unnecessary. (?)
diff --git a/src/tcl/compat/dirent.h b/src/tcl/compat/dirent.h
new file mode 100644 (file)
index 0000000..88a223d
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * dirent.h --
+ *
+ *     This file is a replacement for <dirent.h> in systems that
+ *     support the old BSD-style <sys/dir.h> with a "struct direct".
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /sprite/src/lib/tcl/compat/RCS/dirent.h,v 1.1 91/09/19 16:22:06 ouster Exp $ SPRITE (Berkeley)
+ */
+
+#ifndef _DIRENT
+#define _DIRENT
+
+#include <sys/dir.h>
+
+#define dirent direct
+
+#endif /* _DIRENT */
diff --git a/src/tcl/compat/dirent2.h b/src/tcl/compat/dirent2.h
new file mode 100644 (file)
index 0000000..2b9d293
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * dirent.h --
+ *
+ *     Declarations of a library of directory-reading procedures
+ *     in the POSIX style ("struct dirent").
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /sprite/src/lib/tcl/compat/RCS/dirent2.h,v 1.1 91/09/19 16:22:08 ouster Exp $ SPRITE (Berkeley)
+ */
+
+#ifndef _DIRENT
+#define _DIRENT
+
+#ifndef _TCL
+#include <tcl.h>
+#endif
+
+/*
+ * Dirent structure, which holds information about a single
+ * directory entry.
+ */
+
+#define MAXNAMLEN 255
+#define DIRBLKSIZ 512
+
+struct dirent {
+    long d_ino;                        /* Inode number of entry */
+    short d_reclen;            /* Length of this record */
+    short d_namlen;            /* Length of string in d_name */
+    char d_name[MAXNAMLEN + 1];        /* Name must be no longer than this */
+};
+
+/*
+ * State that keeps track of the reading of a directory (clients
+ * should never look inside this structure;  the fields should
+ * only be accessed by the library procedures).
+ */
+
+typedef struct _dirdesc {
+    int dd_fd;
+    long dd_loc;
+    long dd_size;
+    char dd_buf[DIRBLKSIZ];
+} DIR;
+
+/*
+ * Procedures defined for reading directories:
+ */
+
+extern void            closedir _ANSI_ARGS_((DIR *dirp));
+extern DIR *           opendir _ANSI_ARGS_((char *name));
+extern struct dirent * readdir _ANSI_ARGS_((DIR *dirp));
+
+#endif /* _DIRENT */
diff --git a/src/tcl/compat/limits.h b/src/tcl/compat/limits.h
new file mode 100644 (file)
index 0000000..6225447
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * limits.h --
+ *
+ *     This is a dummy header file to #include in Tcl when there
+ *     is no limits.h in /usr/include.  The file is totally empty.
+ *     In case you're wondering why Tcl includes the file at all
+ *     if it can be empty, it's because there's already code in
+ *     tclUnix.h to #define anything that's not defined in limits.h.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /sprite/src/lib/tcl/compat/RCS/limits.h,v 1.1 91/09/19 16:22:08 ouster Exp $ SPRITE (Berkeley)
+ */
diff --git a/src/tcl/compat/opendir.c b/src/tcl/compat/opendir.c
new file mode 100644 (file)
index 0000000..87ba61c
--- /dev/null
@@ -0,0 +1,106 @@
+/* 
+ * opendir.c --
+ *
+ *     This file provides dirent-style directory-reading procedures
+ *     for V7 Unix systems that don't have such procedures.  The
+ *     origin of this code is unclear, but it seems to have come
+ *     originally from Larry Wall.
+ *
+ */
+
+#include <tclint.h>
+#include <tclunix.h>
+
+#undef DIRSIZ
+#define DIRSIZ(dp) \
+    ((sizeof (struct dirent) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3))
+
+/*
+ * open a directory.
+ */
+DIR *
+opendir(name)
+char *name;
+{
+       register DIR *dirp;
+       register int fd;
+       char *myname;
+
+       myname = ((*name == '\0') ? "." : name);
+       if ((fd = open(myname, 0, 0)) == -1)
+               return NULL;
+       if ((dirp = (DIR *)ckalloc(sizeof(DIR))) == NULL) {
+               close (fd);
+               return NULL;
+       }
+       dirp->dd_fd = fd;
+       dirp->dd_loc = 0;
+       return dirp;
+}
+
+/*
+ * read an old style directory entry and present it as a new one
+ */
+#ifndef pyr
+#define        ODIRSIZ 14
+
+struct olddirect {
+       ino_t   od_ino;
+       char    od_name[ODIRSIZ];
+};
+#else  /* a Pyramid in the ATT universe */
+#define        ODIRSIZ 248
+
+struct olddirect {
+       long    od_ino;
+       short   od_fill1, od_fill2;
+       char    od_name[ODIRSIZ];
+};
+#endif
+
+/*
+ * get next entry in a directory.
+ */
+struct dirent *
+readdir(dirp)
+register DIR *dirp;
+{
+       register struct olddirect *dp;
+       static struct dirent dir;
+
+       for (;;) {
+               if (dirp->dd_loc == 0) {
+                       dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf,
+                           DIRBLKSIZ);
+                       if (dirp->dd_size <= 0)
+                               return NULL;
+               }
+               if (dirp->dd_loc >= dirp->dd_size) {
+                       dirp->dd_loc = 0;
+                       continue;
+               }
+               dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc);
+               dirp->dd_loc += sizeof(struct olddirect);
+               if (dp->od_ino == 0)
+                       continue;
+               dir.d_ino = dp->od_ino;
+               strncpy(dir.d_name, dp->od_name, ODIRSIZ);
+               dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */
+               dir.d_namlen = strlen(dir.d_name);
+               dir.d_reclen = DIRSIZ(&dir);
+               return (&dir);
+       }
+}
+
+/*
+ * close a directory.
+ */
+void
+closedir(dirp)
+register DIR *dirp;
+{
+       close(dirp->dd_fd);
+       dirp->dd_fd = -1;
+       dirp->dd_loc = 0;
+       ckfree((char *) dirp);
+}
diff --git a/src/tcl/compat/stdlib.h b/src/tcl/compat/stdlib.h
new file mode 100644 (file)
index 0000000..da61900
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * stdlib.h --
+ *
+ *     Declares facilities exported by the "stdlib" portion of
+ *     the C library.  This file isn't complete in the ANSI-C
+ *     sense;  it only declares things that are needed by Tcl.
+ *     This file is needed even on many systems with their own
+ *     stdlib.h (e.g. SunOS) because not all stdlib.h files
+ *     declare all the procedures needed here (such as strtod).
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /user6/ouster/tcl/compat/RCS/stdlib.h,v 1.3 91/12/06 10:42:05 ouster Exp $ SPRITE (Berkeley)
+ */
+
+#ifndef _STDLIB
+#define _STDLIB
+
+#include <tclInt.h>
+
+extern void            abort _ANSI_ARGS_((void));
+extern double          atof _ANSI_ARGS_((char *string));
+extern int             atoi _ANSI_ARGS_((char *string));
+extern long            atol _ANSI_ARGS_((char *string));
+extern char *          calloc _ANSI_ARGS_((unsigned int numElements,
+                           unsigned int size));
+extern int             exit _ANSI_ARGS_((int status));
+extern int             free _ANSI_ARGS_((char *blockPtr));
+extern char *          getenv _ANSI_ARGS_((char *name));
+extern char *          malloc _ANSI_ARGS_((unsigned int numBytes));
+extern void            qsort _ANSI_ARGS_((VOID *base, int n, int size,
+                           int (*compar)(CONST VOID *element1, CONST VOID
+                           *element2)));
+extern char *          realloc _ANSI_ARGS_((char *ptr, unsigned int numBytes));
+extern double          strtod _ANSI_ARGS_((char *string, char **endPtr));
+extern long            strtol _ANSI_ARGS_((char *string, char **endPtr,
+                           int base));
+extern unsigned long   strtoul _ANSI_ARGS_((CONST char *string,
+                           char **endPtr, int base));
+
+#endif /* _STDLIB */
diff --git a/src/tcl/compat/strerror.c b/src/tcl/compat/strerror.c
new file mode 100644 (file)
index 0000000..0802f6e
--- /dev/null
@@ -0,0 +1,471 @@
+/* 
+ * strerror.c --
+ *
+ *     Source code for the "strerror" library routine.
+ *
+ * Copyright 1988-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/compat/RCS/strerror.c,v 1.2 91/12/16 09:26:48 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include <tclint.h>
+#include <tclunix.h>
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * strerror --
+ *
+ *     Map an integer error number into a printable string.
+ *
+ * Results:
+ *     The return value is a pointer to a string describing
+ *     error.  The first character of string isn't capitalized.
+ *
+ * Side effects:
+ *     Each call to this procedure may overwrite the value returned
+ *     by the previous call.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+strerror(error)
+    int error;                 /* Integer identifying error (must be
+                                * one of the officially-defined Sprite
+                                * errors, as defined in errno.h). */
+{
+    static char msg[50];
+
+#if TCL_SYS_ERRLIST
+    if ((error <= sys_nerr) && (error > 0)) {
+       return sys_errlist[error];
+    }
+#else
+    switch (error) {
+#ifdef E2BIG
+       case E2BIG: return "argument list too long";
+#endif
+#ifdef EACCES
+       case EACCES: return "permission denied";
+#endif
+#ifdef EADDRINUSE
+       case EADDRINUSE: return "address already in use";
+#endif
+#ifdef EADDRNOTAVAIL
+       case EADDRNOTAVAIL: return "can't assign requested address";
+#endif
+#ifdef EADV
+       case EADV: return "advertise error";
+#endif
+#ifdef EAFNOSUPPORT
+       case EAFNOSUPPORT: return "address family not supported by protocol family";
+#endif
+#ifdef EAGAIN
+       case EAGAIN: return "no more processes";
+#endif
+#ifdef EALIGN
+       case EALIGN: return "EALIGN";
+#endif
+#ifdef EALREADY
+       case EALREADY: return "operation already in progress";
+#endif
+#ifdef EBADE
+       case EBADE: return "bad exchange descriptor";
+#endif
+#ifdef EBADF
+       case EBADF: return "bad file number";
+#endif
+#ifdef EBADFD
+       case EBADFD: return "file descriptor in bad state";
+#endif
+#ifdef EBADMSG
+       case EBADMSG: return "not a data message";
+#endif
+#ifdef EBADR
+       case EBADR: return "bad request descriptor";
+#endif
+#ifdef EBADRPC
+       case EBADRPC: return "RPC structure is bad";
+#endif
+#ifdef EBADRQC
+       case EBADRQC: return "bad request code";
+#endif
+#ifdef EBADSLT
+       case EBADSLT: return "invalid slot";
+#endif
+#ifdef EBFONT
+       case EBFONT: return "bad font file format";
+#endif
+#ifdef EBUSY
+       case EBUSY: return "mount device busy";
+#endif
+#ifdef ECHILD
+       case ECHILD: return "no children";
+#endif
+#ifdef ECHRNG
+       case ECHRNG: return "channel number out of range";
+#endif
+#ifdef ECOMM
+       case ECOMM: return "communication error on send";
+#endif
+#ifdef ECONNABORTED
+       case ECONNABORTED: return "software caused connection abort";
+#endif
+#ifdef ECONNREFUSED
+       case ECONNREFUSED: return "connection refused";
+#endif
+#ifdef ECONNRESET
+       case ECONNRESET: return "connection reset by peer";
+#endif
+#if defined(EDEADLK) && (!defined(EWOULDBLOCK) || (EDEADLK != EWOULDBLOCK))
+       case EDEADLK: return "resource deadlock avoided";
+#endif
+#ifdef EDEADLOCK
+       case EDEADLOCK: return "resource deadlock avoided";
+#endif
+#ifdef EDESTADDRREQ
+       case EDESTADDRREQ: return "destination address required";
+#endif
+#ifdef EDIRTY
+       case EDIRTY: return "mounting a dirty fs w/o force";
+#endif
+#ifdef EDOM
+       case EDOM: return "math argument out of range";
+#endif
+#ifdef EDOTDOT
+       case EDOTDOT: return "cross mount point";
+#endif
+#ifdef EDQUOT
+       case EDQUOT: return "disk quota exceeded";
+#endif
+#ifdef EDUPPKG
+       case EDUPPKG: return "duplicate package name";
+#endif
+#ifdef EEXIST
+       case EEXIST: return "file already exists";
+#endif
+#ifdef EFAULT
+       case EFAULT: return "bad address in system call argument";
+#endif
+#ifdef EFBIG
+       case EFBIG: return "file too large";
+#endif
+#ifdef EHOSTDOWN
+       case EHOSTDOWN: return "host is down";
+#endif
+#ifdef EHOSTUNREACH
+       case EHOSTUNREACH: return "host is unreachable";
+#endif
+#ifdef EIDRM
+       case EIDRM: return "identifier removed";
+#endif
+#ifdef EINIT
+       case EINIT: return "initialization error";
+#endif
+#ifdef EINPROGRESS
+       case EINPROGRESS: return "operation now in progress";
+#endif
+#ifdef EINTR
+       case EINTR: return "interrupted system call";
+#endif
+#ifdef EINVAL
+       case EINVAL: return "invalid argument";
+#endif
+#ifdef EIO
+       case EIO: return "I/O error";
+#endif
+#ifdef EISCONN
+       case EISCONN: return "socket is already connected";
+#endif
+#ifdef EISDIR
+       case EISDIR: return "illegal operation on a directory";
+#endif
+#ifdef EISNAME
+       case EISNAM: return "is a name file";
+#endif
+#ifdef ELBIN
+       case ELBIN: return "ELBIN";
+#endif
+#ifdef EL2HLT
+       case EL2HLT: return "level 2 halted";
+#endif
+#ifdef EL2NSYNC
+       case EL2NSYNC: return "level 2 not synchronized";
+#endif
+#ifdef EL3HLT
+       case EL3HLT: return "level 3 halted";
+#endif
+#ifdef EL3RST
+       case EL3RST: return "level 3 reset";
+#endif
+#ifdef ELIBACC
+       case ELIBACC: return "can not access a needed shared library";
+#endif
+#ifdef ELIBBAD
+       case ELIBBAD: return "accessing a corrupted shared library";
+#endif
+#ifdef ELIBEXEC
+       case ELIBEXEC: return "can not exec a shared library directly";
+#endif
+#ifdef ELIBMAX
+       case ELIBMAX: return
+               "attempting to link in more shared libraries than system limit";
+#endif
+#ifdef ELIBSCN
+       case ELIBSCN: return ".lib section in a.out corrupted";
+#endif
+#ifdef ELNRNG
+       case ELNRNG: return "link number out of range";
+#endif
+#ifdef ELOOP
+       case ELOOP: return "too many levels of symbolic links";
+#endif
+#ifdef EMFILE
+       case EMFILE: return "too many open files";
+#endif
+#ifdef EMLINK
+       case EMLINK: return "too many links";
+#endif
+#ifdef EMSGSIZE
+       case EMSGSIZE: return "message too long";
+#endif
+#ifdef EMULTIHOP
+       case EMULTIHOP: return "multihop attempted";
+#endif
+#ifdef ENAMETOOLONG
+       case ENAMETOOLONG: return "file name too long";
+#endif
+#ifdef ENAVAIL
+       case ENAVAIL: return "not available";
+#endif
+#ifdef ENET
+       case ENET: return "ENET";
+#endif
+#ifdef ENETDOWN
+       case ENETDOWN: return "network is down";
+#endif
+#ifdef ENETRESET
+       case ENETRESET: return "network dropped connection on reset";
+#endif
+#ifdef ENETUNREACH
+       case ENETUNREACH: return "network is unreachable";
+#endif
+#ifdef ENFILE
+       case ENFILE: return "file table overflow";
+#endif
+#ifdef ENOANO
+       case ENOANO: return "anode table overflow";
+#endif
+#if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR))
+       case ENOBUFS: return "no buffer space available";
+#endif
+#ifdef ENOCSI
+       case ENOCSI: return "no CSI structure available";
+#endif
+#ifdef ENODATA
+       case ENODATA: return "no data available";
+#endif
+#ifdef ENODEV
+       case ENODEV: return "no such device";
+#endif
+#ifdef ENOENT
+       case ENOENT: return "no such file or directory";
+#endif
+#ifdef ENOEXEC
+       case ENOEXEC: return "exec format error";
+#endif
+#ifdef ENOLCK
+       case ENOLCK: return "no locks available";
+#endif
+#ifdef ENOLINK
+       case ENOLINK: return "link has be severed";
+#endif
+#ifdef ENOMEM
+       case ENOMEM: return "not enough memory";
+#endif
+#ifdef ENOMSG
+       case ENOMSG: return "no message of desired type";
+#endif
+#ifdef ENONET
+       case ENONET: return "machine is not on the network";
+#endif
+#ifdef ENOPKG
+       case ENOPKG: return "package not installed";
+#endif
+#ifdef ENOPROTOOPT
+       case ENOPROTOOPT: return "bad proocol option";
+#endif
+#ifdef ENOSPC
+       case ENOSPC: return "no space left on device";
+#endif
+#ifdef ENOSR
+       case ENOSR: return "out of stream resources";
+#endif
+#ifdef ENOSTR
+       case ENOSTR: return "not a stream device";
+#endif
+#ifdef ENOSYM
+       case ENOSYM: return "unresolved symbol name";
+#endif
+#ifdef ENOSYS
+       case ENOSYS: return "function not implemented";
+#endif
+#ifdef ENOTBLK
+       case ENOTBLK: return "block device required";
+#endif
+#ifdef ENOTCONN
+       case ENOTCONN: return "socket is not connected";
+#endif
+#ifdef ENOTDIR
+       case ENOTDIR: return "not a directory";
+#endif
+#ifdef ENOTEMPTY
+       case ENOTEMPTY: return "directory not empty";
+#endif
+#ifdef ENOTNAM
+       case ENOTNAM: return "not a name file";
+#endif
+#ifdef ENOTSOCK
+       case ENOTSOCK: return "socket operation on non-socket";
+#endif
+#ifdef ENOTTY
+       case ENOTTY: return "inappropriate device for ioctl";
+#endif
+#ifdef ENOTUNIQ
+       case ENOTUNIQ: return "name not unique on network";
+#endif
+#ifdef ENXIO
+       case ENXIO: return "no such device or address";
+#endif
+#ifdef EOPNOTSUPP
+       case EOPNOTSUPP: return "operation not supported on socket";
+#endif
+#ifdef EPERM
+       case EPERM: return "not owner";
+#endif
+#ifdef EPFNOSUPPORT
+       case EPFNOSUPPORT: return "protocol family not supported";
+#endif
+#ifdef EPIPE
+       case EPIPE: return "broken pipe";
+#endif
+#ifdef EPROCLIM
+       case EPROCLIM: return "too many processes";
+#endif
+#ifdef EPROCUNAVAIL
+       case EPROCUNAVAIL: return "bad procedure for program";
+#endif
+#ifdef EPROGMISMATCH
+       case EPROGMISMATCH: return "program version wrong";
+#endif
+#ifdef EPROGUNAVAIL
+       case EPROGUNAVAIL: return "RPC program not available";
+#endif
+#ifdef EPROTO
+       case EPROTO: return "protocol error";
+#endif
+#ifdef EPROTONOSUPPORT
+       case EPROTONOSUPPORT: return "protocol not suppored";
+#endif
+#ifdef EPROTOTYPE
+       case EPROTOTYPE: return "protocol wrong type for socket";
+#endif
+#ifdef ERANGE
+       case ERANGE: return "math result unrepresentable";
+#endif
+#if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED))
+       case EREFUSED: return "EREFUSED";
+#endif
+#ifdef EREMCHG
+       case EREMCHG: return "remote address changed";
+#endif
+#ifdef EREMDEV
+       case EREMDEV: return "remote device";
+#endif
+#ifdef EREMOTE
+       case EREMOTE: return "pathname hit remote file system";
+#endif
+#ifdef EREMOTEIO
+       case EREMOTEIO: return "remote i/o error";
+#endif
+#ifdef EREMOTERELEASE
+       case EREMOTERELEASE: return "EREMOTERELEASE";
+#endif
+#ifdef EROFS
+       case EROFS: return "read-only file system";
+#endif
+#ifdef ERPCMISMATCH
+       case ERPCMISMATCH: return "RPC version is wrong";
+#endif
+#ifdef ERREMOTE
+       case ERREMOTE: return "object is remote";
+#endif
+#ifdef ESHUTDOWN
+       case ESHUTDOWN: return "can't send afer socket shutdown";
+#endif
+#ifdef ESOCKTNOSUPPORT
+       case ESOCKTNOSUPPORT: return "socket type not supported";
+#endif
+#ifdef ESPIPE
+       case ESPIPE: return "invalid seek";
+#endif
+#ifdef ESRCH
+       case ESRCH: return "no such process";
+#endif
+#ifdef ESRMNT
+       case ESRMNT: return "srmount error";
+#endif
+#ifdef ESTALE
+       case ESTALE: return "stale remote file handle";
+#endif
+#ifdef ESUCCESS
+       case ESUCCESS: return "Error 0";
+#endif
+#ifdef ETIME
+       case ETIME: return "timer expired";
+#endif
+#ifdef ETIMEDOUT
+       case ETIMEDOUT: return "connection timed out";
+#endif
+#ifdef ETOOMANYREFS
+       case ETOOMANYREFS: return "too many references: can't splice";
+#endif
+#ifdef ETXTBSY
+       case ETXTBSY: return "text file or pseudo-device busy";
+#endif
+#ifdef EUCLEAN
+       case EUCLEAN: return "structure needs cleaning";
+#endif
+#ifdef EUNATCH
+       case EUNATCH: return "protocol driver not attached";
+#endif
+#ifdef EUSERS
+       case EUSERS: return "too many users";
+#endif
+#ifdef EVERSION
+       case EVERSION: return "version mismatch";
+#endif
+#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
+       case EWOULDBLOCK: return "operation would block";
+#endif
+#ifdef EXDEV
+       case EXDEV: return "cross-domain link";
+#endif
+#ifdef EXFULL
+       case EXFULL: return "message tables full";
+#endif
+    }
+#endif /* ! TCL_SYS_ERRLIST */
+    sprintf(msg, "unknown error (%d)", error);
+    return msg;
+}
diff --git a/src/tcl/compat/string.h b/src/tcl/compat/string.h
new file mode 100644 (file)
index 0000000..5a455ae
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * string.h --
+ *
+ *     Declarations of ANSI C library procedures for string handling.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /sprite/src/lib/tcl/compat/RCS/string.h,v 1.1 91/09/19 16:22:11 ouster Exp $ SPRITE (Berkeley)
+ */
+
+#ifndef _STRING
+#define _STRING
+
+#include <tcl.h>
+
+extern char *          memchr _ANSI_ARGS_((char *s, int c, int n));
+#if 0
+extern int             memcmp _ANSI_ARGS_((char *s1, char *s2, int n));
+extern char *          memcpy _ANSI_ARGS_((char *t, char *f, int n));
+#endif
+extern char *          memmove _ANSI_ARGS_((char *t, char *f, int n));
+extern char *          memset _ANSI_ARGS_((char *s, int c, int n));
+
+extern int             strcasecmp _ANSI_ARGS_((char *s1, char *s2));
+extern char *          strcat _ANSI_ARGS_((char *dst, char *src));
+extern char *          strchr _ANSI_ARGS_((char *string, int c));
+#if 0
+extern int             strcmp _ANSI_ARGS_((char *s1, char *s2));
+extern char *          strcpy _ANSI_ARGS_((char *dst, char *src));
+#endif
+extern int             strcspn _ANSI_ARGS_((char *string, char *chars));
+extern char *          strdup _ANSI_ARGS_((char *string));
+extern char *          strerror _ANSI_ARGS_((int error));
+#if 0
+extern int             strlen _ANSI_ARGS_((char *string));
+#endif
+extern int             strncasecmp _ANSI_ARGS_((char *s1, char *s2, int n));
+extern char *          strncat _ANSI_ARGS_((char *dst, char *src,
+                           int numChars));
+extern int             strncmp _ANSI_ARGS_((char *s1, char *s2, int nChars));
+extern char *          strncpy _ANSI_ARGS_((char *dst, char *src,
+                           int numChars));
+extern char *          strpbrk _ANSI_ARGS_((char *string, char *chars));
+extern char *          strrchr _ANSI_ARGS_((char *string, int c));
+extern int             strspn _ANSI_ARGS_((char *string, char *chars));
+extern char *          strstr _ANSI_ARGS_((char *string, char *substring));
+extern char *          strtok _ANSI_ARGS_((char *s, char *delim));
+
+#endif /* _STRING */
diff --git a/src/tcl/compat/strstr.c b/src/tcl/compat/strstr.c
new file mode 100644 (file)
index 0000000..11084d7
--- /dev/null
@@ -0,0 +1,73 @@
+/* 
+ * strstr.c --
+ *
+ *     Source code for the "strstr" library routine.
+ *
+ * Copyright 1988-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /sprite/src/lib/tcl/compat/RCS/strstr.c,v 1.1 91/09/19 16:22:12 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * strstr --
+ *
+ *     Locate the first instance of a substring in a string.
+ *
+ * Results:
+ *     If string contains substring, the return value is the
+ *     location of the first matching instance of substring
+ *     in string.  If string doesn't contain substring, the
+ *     return value is 0.  Matching is done on an exact
+ *     character-for-character basis with no wildcards or special
+ *     characters.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+strstr(string, substring)
+    register char *string;     /* String to search. */
+    char *substring;           /* Substring to try to find in string. */
+{
+    register char *a, *b;
+
+    /* First scan quickly through the two strings looking for a
+     * single-character match.  When it's found, then compare the
+     * rest of the substring.
+     */
+
+    b = substring;
+    if (*b == 0) {
+       return string;
+    }
+    for ( ; *string != 0; string += 1) {
+       if (*string != *b) {
+           continue;
+       }
+       a = string;
+       while (1) {
+           if (*b == 0) {
+               return string;
+           }
+           if (*a++ != *b++) {
+               break;
+           }
+       }
+       b = substring;
+    }
+    return (char *) 0;
+}
diff --git a/src/tcl/compat/strtod.c b/src/tcl/compat/strtod.c
new file mode 100644 (file)
index 0000000..3589d25
--- /dev/null
@@ -0,0 +1,259 @@
+/* 
+ * strtod.c --
+ *
+ *     Source code for the "strtod" library procedure.
+ *
+ * Copyright 1988-1992 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/compat/RCS/strtod.c,v 1.1 92/01/03 16:39:02 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include <stdlib.h>
+#include <ctype.h>
+
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#endif
+#ifndef NULL
+#define NULL 0
+#endif
+
+static int maxExponent = 511;  /* Largest possible base 10 exponent.  Any
+                                * exponent larger than this will already
+                                * produce underflow or overflow, so there's
+                                * no need to worry about additional digits.
+                                */
+static double powersOf10[] = { /* Table giving binary powers of 10.  Entry */
+    10.,                       /* is 10^2^i.  Used to convert decimal */
+    100.,                      /* exponents into floating-point numbers. */
+    1.0e4,
+    1.0e8,
+    1.0e16,
+    1.0e32,
+    1.0e64,
+    1.0e128,
+    1.0e256
+};
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * strtod --
+ *
+ *     This procedure converts a floating-point number from an ASCII
+ *     decimal representation to internal double-precision format.
+ *
+ * Results:
+ *     The return value is the double-precision floating-point
+ *     representation of the characters in string.  If endPtr isn't
+ *     NULL, then *endPtr is filled in with the address of the
+ *     next character after the last one that was part of the
+ *     floating-point number.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+double
+strtod(string, endPtr)
+    char *string;              /* A decimal ASCII floating-point number,
+                                * optionally preceded by white space.
+                                * Must have form "-I.FE-X", where I is the
+                                * integer part of the mantissa, F is the
+                                * fractional part of the mantissa, and X
+                                * is the exponent.  Either of the signs
+                                * may be "+", "-", or omitted.  Either I
+                                * or F may be omitted, or both.  The decimal
+                                * point isn't necessary unless F is present.
+                                * The "E" may actually be an "e".  E and X
+                                * may both be omitted (but not just one).
+                                */
+    char **endPtr;             /* If non-NULL, store terminating character's
+                                * address here. */
+{
+    int sign, expSign = FALSE;
+    double fraction, dblExp, *d;
+    register char *p, c;
+    int exp = 0;               /* Exponent read from "EX" field. */
+    int fracExp = 0;           /* Exponent that derives from the fractional
+                                * part.  Under normal circumstatnces, it is
+                                * the negative of the number of digits in F.
+                                * However, if I is very long, the last digits
+                                * of I get dropped (otherwise a long I with a
+                                * large negative exponent could cause an
+                                * unnecessary overflow on I alone).  In this
+                                * case, fracExp is incremented one for each
+                                * dropped digit.
+                                */
+    int mantSize;              /* Number of digits in mantissa. */
+    int decPt;                 /* Number of mantissa digits BEFORE decimal
+                                * point.
+                                */
+    char *pExp;                        /* Temporarily holds location of exponent
+                                * in string.
+                                */
+
+    /*
+     * Strip off leading blanks and check for a sign.
+     */
+
+    p = string;
+    while (isspace(*p)) {
+       p += 1;
+    }
+    if (*p == '-') {
+       sign = TRUE;
+       p += 1;
+    } else {
+       if (*p == '+') {
+           p += 1;
+       }
+       sign = FALSE;
+    }
+
+    /*
+     * Count the number of digits in the mantissa (including the decimal
+     * point), and also locate the decimal point.
+     */
+
+    decPt = -1;
+    for (mantSize = 0; ; mantSize += 1)
+    {
+       c = *p;
+       if (!isdigit(c)) {
+           if ((c != '.') || (decPt >= 0)) {
+               break;
+           }
+           decPt = mantSize;
+       }
+       p += 1;
+    }
+
+    /*
+     * Now suck up the digits in the mantissa.  Use two integers to
+     * collect 9 digits each (this is faster than using floating-point).
+     * If the mantissa has more than 18 digits, ignore the extras, since
+     * they can't affect the value anyway.
+     */
+    
+    pExp  = p;
+    p -= mantSize;
+    if (decPt < 0) {
+       decPt = mantSize;
+    } else {
+       mantSize -= 1;                  /* One of the digits was the point. */
+    }
+    if (mantSize > 18) {
+       fracExp = decPt - 18;
+       mantSize = 18;
+    } else {
+       fracExp = decPt - mantSize;
+    }
+    if (mantSize == 0) {
+       fraction = 0.0;
+       p = string;
+       goto done;
+    } else {
+       int frac1, frac2;
+       frac1 = 0;
+       for ( ; mantSize > 9; mantSize -= 1)
+       {
+           c = *p;
+           p += 1;
+           if (c == '.') {
+               c = *p;
+               p += 1;
+           }
+           frac1 = 10*frac1 + (c - '0');
+       }
+       frac2 = 0;
+       for (; mantSize > 0; mantSize -= 1)
+       {
+           c = *p;
+           p += 1;
+           if (c == '.') {
+               c = *p;
+               p += 1;
+           }
+           frac2 = 10*frac2 + (c - '0');
+       }
+       fraction = (1.0e9 * frac1) + frac2;
+    }
+
+    /*
+     * Skim off the exponent.
+     */
+
+    p = pExp;
+    if ((*p == 'E') || (*p == 'e')) {
+       p += 1;
+       if (*p == '-') {
+           expSign = TRUE;
+           p += 1;
+       } else {
+           if (*p == '+') {
+               p += 1;
+           }
+           expSign = FALSE;
+       }
+       while (isdigit(*p)) {
+           exp = exp * 10 + (*p - '0');
+           p += 1;
+       }
+    }
+    if (expSign) {
+       exp = fracExp - exp;
+    } else {
+       exp = fracExp + exp;
+    }
+
+    /*
+     * Generate a floating-point number that represents the exponent.
+     * Do this by processing the exponent one bit at a time to combine
+     * many powers of 2 of 10. Then combine the exponent with the
+     * fraction.
+     */
+    
+    if (exp < 0) {
+       expSign = TRUE;
+       exp = -exp;
+    } else {
+       expSign = FALSE;
+    }
+    if (exp > maxExponent) {
+       exp = maxExponent;
+    }
+    dblExp = 1.0;
+    for (d = powersOf10; exp != 0; exp >>= 1, d += 1) {
+       if (exp & 01) {
+           dblExp *= *d;
+       }
+    }
+    if (expSign) {
+       fraction /= dblExp;
+    } else {
+       fraction *= dblExp;
+    }
+
+done:
+    if (endPtr != NULL) {
+       *endPtr = p;
+    }
+
+    if (sign) {
+       return -fraction;
+    }
+    return fraction;
+}
diff --git a/src/tcl/compat/strtol.c b/src/tcl/compat/strtol.c
new file mode 100644 (file)
index 0000000..dfd8ad9
--- /dev/null
@@ -0,0 +1,88 @@
+/* 
+ * strtol.c --
+ *
+ *     Source code for the "strtol" library procedure.
+ *
+ * Copyright 1988 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /sprite/src/lib/tcl/compat/RCS/strtol.c,v 1.1 91/09/22 15:42:49 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include <ctype.h>
+
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * strtol --
+ *
+ *     Convert an ASCII string into an integer.
+ *
+ * Results:
+ *     The return value is the integer equivalent of string.  If endPtr
+ *     is non-NULL, then *endPtr is filled in with the character
+ *     after the last one that was part of the integer.  If string
+ *     doesn't contain a valid integer value, then zero is returned
+ *     and *endPtr is set to string.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+long int
+strtol(string, endPtr, base)
+    char *string;              /* String of ASCII digits, possibly
+                                * preceded by white space.  For bases
+                                * greater than 10, either lower- or
+                                * upper-case digits may be used.
+                                */
+    char **endPtr;             /* Where to store address of terminating
+                                * character, or NULL. */
+    int base;                  /* Base for conversion.  Must be less
+                                * than 37.  If 0, then the base is chosen
+                                * from the leading characters of string:
+                                * "0x" means hex, "0" means octal, anything
+                                * else means decimal.
+                                */
+{
+    register char *p;
+    int result;
+
+    /*
+     * Skip any leading blanks.
+     */
+
+    p = string;
+    while (isspace(*p)) {
+       p += 1;
+    }
+
+    /*
+     * Check for a sign.
+     */
+
+    if (*p == '-') {
+       p += 1;
+       result = -(strtoul(p, endPtr, base));
+    } else {
+       if (*p == '+') {
+           p += 1;
+       }
+       result = strtoul(p, endPtr, base);
+    }
+    if ((result == 0) && (endPtr != 0) && (*endPtr == p)) {
+       *endPtr = string;
+    }
+    return result;
+}
diff --git a/src/tcl/compat/strtoul.c b/src/tcl/compat/strtoul.c
new file mode 100644 (file)
index 0000000..2c1fd31
--- /dev/null
@@ -0,0 +1,188 @@
+/* 
+ * strtoul.c --
+ *
+ *     Source code for the "strtoul" library procedure.
+ *
+ * Copyright 1988 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /sprite/src/lib/tcl/compat/RCS/strtoul.c,v 1.2 91/09/22 14:04:43 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include <ctype.h>
+
+/*
+ * The table below is used to convert from ASCII digits to a
+ * numerical equivalent.  It maps from '0' through 'z' to integers
+ * (100 for non-digit characters).
+ */
+
+static char cvtIn[] = {
+    0, 1, 2, 3, 4, 5, 6, 7, 8, 9,              /* '0' - '9' */
+    100, 100, 100, 100, 100, 100, 100,         /* punctuation */
+    10, 11, 12, 13, 14, 15, 16, 17, 18, 19,    /* 'A' - 'Z' */
+    20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+    30, 31, 32, 33, 34, 35,
+    100, 100, 100, 100, 100, 100,              /* punctuation */
+    10, 11, 12, 13, 14, 15, 16, 17, 18, 19,    /* 'a' - 'z' */
+    20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+    30, 31, 32, 33, 34, 35};
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * strtoul --
+ *
+ *     Convert an ASCII string into an integer.
+ *
+ * Results:
+ *     The return value is the integer equivalent of string.  If endPtr
+ *     is non-NULL, then *endPtr is filled in with the character
+ *     after the last one that was part of the integer.  If string
+ *     doesn't contain a valid integer value, then zero is returned
+ *     and *endPtr is set to string.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+unsigned long int
+strtoul(string, endPtr, base)
+    char *string;              /* String of ASCII digits, possibly
+                                * preceded by white space.  For bases
+                                * greater than 10, either lower- or
+                                * upper-case digits may be used.
+                                */
+    char **endPtr;             /* Where to store address of terminating
+                                * character, or NULL. */
+    int base;                  /* Base for conversion.  Must be less
+                                * than 37.  If 0, then the base is chosen
+                                * from the leading characters of string:
+                                * "0x" means hex, "0" means octal, anything
+                                * else means decimal.
+                                */
+{
+    register char *p;
+    register unsigned long int result = 0;
+    register unsigned digit;
+    int anyDigits = 0;
+
+    /*
+     * Skip any leading blanks.
+     */
+
+    p = string;
+    while (isspace(*p)) {
+       p += 1;
+    }
+
+    /*
+     * If no base was provided, pick one from the leading characters
+     * of the string.
+     */
+    
+    if (base == 0)
+    {
+       if (*p == '0') {
+           p += 1;
+           if (*p == 'x') {
+               p += 1;
+               base = 16;
+           } else {
+
+               /*
+                * Must set anyDigits here, otherwise "0" produces a
+                * "no digits" error.
+                */
+
+               anyDigits = 1;
+               base = 8;
+           }
+       }
+       else base = 10;
+    } else if (base == 16) {
+
+       /*
+        * Skip a leading "0x" from hex numbers.
+        */
+
+       if ((p[0] == '0') && (p[1] == 'x')) {
+           p += 2;
+       }
+    }
+
+    /*
+     * Sorry this code is so messy, but speed seems important.  Do
+     * different things for base 8, 10, 16, and other.
+     */
+
+    if (base == 8) {
+       for ( ; ; p += 1) {
+           digit = *p - '0';
+           if (digit > 7) {
+               break;
+           }
+           result = (result << 3) + digit;
+           anyDigits = 1;
+       }
+    } else if (base == 10) {
+       for ( ; ; p += 1) {
+           digit = *p - '0';
+           if (digit > 9) {
+               break;
+           }
+           result = (10*result) + digit;
+           anyDigits = 1;
+       }
+    } else if (base == 16) {
+       for ( ; ; p += 1) {
+           digit = *p - '0';
+           if (digit > ('z' - '0')) {
+               break;
+           }
+           digit = cvtIn[digit];
+           if (digit > 15) {
+               break;
+           }
+           result = (result << 4) + digit;
+           anyDigits = 1;
+       }
+    } else {
+       for ( ; ; p += 1) {
+           digit = *p - '0';
+           if (digit > ('z' - '0')) {
+               break;
+           }
+           digit = cvtIn[digit];
+           if (digit >= base) {
+               break;
+           }
+           result = result*base + digit;
+           anyDigits = 1;
+       }
+    }
+
+    /*
+     * See if there were any digits at all.
+     */
+
+    if (!anyDigits) {
+       p = string;
+    }
+
+    if (endPtr != 0) {
+       *endPtr = p;
+    }
+
+    return result;
+}
diff --git a/src/tcl/compat/testpid.c b/src/tcl/compat/testpid.c
new file mode 100644 (file)
index 0000000..4d497b9
--- /dev/null
@@ -0,0 +1,30 @@
+/* 
+ * testpid.c --
+ *
+ *     This file contains a simple program that will compile
+ *     correctly if and only if <sys/types.h> defines the
+ *     type pid_t.  It is used to determine whether this type
+ *     is defined on a given system.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/compat/RCS/testpid.c,v 1.2 91/12/06 15:31:32 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include <sys/types.h>
+
+pid_t pid;
+
+int main()
+{
+    return 0;
+}
diff --git a/src/tcl/compat/teststrtoul.c b/src/tcl/compat/teststrtoul.c
new file mode 100644 (file)
index 0000000..05a3921
--- /dev/null
@@ -0,0 +1,39 @@
+/* 
+ * teststrtoul.c --
+ *
+ *     This file contains a simple program to detect broken versions
+ *     of strtoul, like those on AIX.  The broken versions return an
+ *     incorrect terminator pointer for the string "0".  This program
+ *     exits with a normal status if strtoul does the right thing, and
+ *     it exits with a non-zero status if strtoul is bogus.  Unlike
+ *     the other test programs, this one must actually be executed to
+ *     be sure that it works.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/compat/RCS/teststrtoul.c,v 1.2 92/01/07 10:02:56 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+extern int strtoul();
+
+int main()
+{
+    char *string = "0";
+    char *term;
+    int value;
+
+    value = strtoul(string, &term, 0);
+    if ((value != 0) || (term != (string+1))) {
+       exit(1);
+    }
+    exit(0);
+}
diff --git a/src/tcl/compat/testuid.c b/src/tcl/compat/testuid.c
new file mode 100644 (file)
index 0000000..14873be
--- /dev/null
@@ -0,0 +1,30 @@
+/* 
+ * testuid.c --
+ *
+ *     This file contains a simple program that will compile
+ *     correctly if and only if <sys/types.h> defines the
+ *     type uid_t.  It is used to determine whether this type
+ *     is defined on a given system.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/compat/RCS/testuid.c,v 1.1 91/12/06 15:31:28 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include <sys/types.h>
+
+uid_t uid;
+
+int main()
+{
+    return 0;
+}
diff --git a/src/tcl/compat/testwait.c b/src/tcl/compat/testwait.c
new file mode 100644 (file)
index 0000000..1ebb8e4
--- /dev/null
@@ -0,0 +1,40 @@
+/* 
+ * testwait.c --
+ *
+ *     This file contains a simple program that will compile
+ *     correctly if and only if <sys/wait.h> defines the
+ *     type "union wait".  It is used during configuration
+ *     to determine whether or not to use this type.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/compat/RCS/testwait.c,v 1.3 91/12/18 13:42:09 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/wait.h>
+
+/*
+ * This code is very tricky, mostly because of weirdness in HP-UX
+ * where "union wait" is defined in both the BSD and SYS-V
+ * environments.  Supposedly the WIFEXITED business will do the
+ * right thing...
+ */
+
+union wait x;
+
+int main()
+{
+    WIFEXITED(x);              /* Generates compiler error if WIFEXITED
+                                * uses an int. */
+    return 0;
+}
diff --git a/src/tcl/config b/src/tcl/config
new file mode 100755 (executable)
index 0000000..198d02e
--- /dev/null
@@ -0,0 +1,322 @@
+#!/bin/csh -f
+#
+# This script should be executed to configure the Tcl source directory
+# for a particular system.  It probes the system for various header
+# files and library object files.  Where things needed by Tcl are missing,
+# substitute versions are included from the "compat" subdirectory.
+#
+# $Header: /user6/ouster/tcl/RCS/config,v 1.30 92/05/13 09:27:18 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1991, 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+
+#--------------------------------------------------------------
+# The variable definitions below configure this script:  they
+# tell where system-defined things are kept (so this program
+# can tell whether the system contains certain features needed
+# by Tcl), and they indicate which Tcl files to modify to
+# reflect the configuration.
+
+# Directory containing system include files:
+
+set includeDir="/usr/include"
+
+# Archive file containing object code for standard C library:
+
+set libc="/usr/lib/libc.a"
+
+# Makefile to modify:
+
+set makefile="makefile"
+
+# Header file to modify to hold #defines about system configuration:
+
+set config="tclunix.h"
+#--------------------------------------------------------------
+
+set changes=0
+unset time
+
+# First make sure that the configuration variables have been
+# set in a reasonable fashion.
+
+if ( ! -r $includeDir/stdio.h ) then
+    echo "- ERROR\!\! $includeDir doesn't seem to contain standard system"
+    echo "  include files.  Please edit config to set the includeDir"
+    echo "  variable."
+    exit(1)
+endif
+if ( ! -r $libc ) then
+    echo "- ERROR\!\! C library $libc doesn\'t exist.  Please edit config"
+    echo "  to set the libc variable."
+    exit(1)
+endif
+nm -p $libc > tmp.libc
+if ( $status != 0 ) then
+    echo "- ERROR\!\!  Nm failed to extract names of system-supplied library"
+    echo "  procedures from $libc.  You'll have to modify config by hand to"
+    echo "  fix the problem (whatever it is)."
+    exit(1)
+endif
+
+# Since nm produces different output on different machines, the code
+# below attempts to guess what pattern to grep for in the nm output.
+
+set pattern="[ADIT]"
+set x=`grep printf tmp.libc | grep -c CODE`
+if ( $x ) then
+    set pattern=CODE
+endif
+set x=`grep printf tmp.libc | grep -c extern`
+if ( $x ) then
+    set pattern="|extern|"
+endif
+
+# Check in the C library for particular library procedures and
+# variables needed by Tcl.
+
+set gettod=`grep gettimeofday tmp.libc | grep -c "$pattern"`
+if ( $gettod > 1 ) set gettod=1
+set getwd=`grep getwd tmp.libc | grep -c "$pattern"`
+if ( $getwd > 1 ) set getwd=1
+set opendir=`grep opendir tmp.libc | grep -c "$pattern"`
+if ( $opendir > 1 ) set opendir=1
+set strerror=`grep strerror tmp.libc | grep -c "$pattern"`
+if ( $strerror > 1 ) set strerror=1
+set strstr=`grep strstr tmp.libc | grep -c "$pattern"`
+if ( $strstr > 1 ) set strstr=1
+set strtod=`grep strtod tmp.libc | grep -c "$pattern"`
+if ( $strtod > 1 ) set strtod=1
+set strtol=`grep strtol tmp.libc | grep -c "$pattern"`
+if ( $strtol > 1 ) set strtol=1
+set strtoul=`grep strtoul tmp.libc | grep -c "$pattern"`
+if ( $strtoul > 1 ) set strtoul=1
+set sys_errlist=`grep sys_errlist tmp.libc | grep -c "$pattern"`
+if ( $sys_errlist > 1 ) set sys_errlist=1
+\rm tmp.libc
+
+# Next, install header files that aren't present in /usr/include.
+
+set extraHdrs=""
+foreach i (dirent.h limits.h)
+    \rm -f $i
+    if ( ! -r $includeDir/$i ) then
+       cp compat/$i .
+       set extraHdrs="$extraHdrs $i"
+    endif
+end
+set stdlibOK=0
+\rm -f stdlib.h
+if ( -r $includeDir/stdlib.h ) then
+    # The check below is needed because SunOS has a stdlib that
+    # doesn't declare strtod and other procedures, so we have to
+    # use ours instead.
+
+    set chk1=`grep -c strtol $includeDir/stdlib.h`
+    set chk2=`grep -c strtoul $includeDir/stdlib.h`
+    set chk3=`grep -c strtod $includeDir/stdlib.h`
+    if ( $chk1 > 0 && $chk2 > 0 && $chk3 > 0 ) then
+       set stdlibOK=1
+    endif
+endif
+# XXX: Un-Kludge around sun acc, which doesn't need this...
+set stdlibOK=1
+if ( ! $stdlibOK ) then
+    cp compat/stdlib.h .
+    set extraHdrs="$extraHdrs stdlib.h"
+endif
+
+# Even if string.h exists it's not complete on all systems.  If
+# some of the procedures we need are missing from the library, then
+# also install a Tcl-specific string.h.
+
+\rm -f string.h
+if ( ! $strstr || ! $strtoul || ! -r $includeDir/string.h ) then
+    cp compat/string.h .
+    set extraHdrs="$extraHdrs string.h"
+endif
+if ( "$extraHdrs" != "" ) then
+    echo "- Substitutes will be used for the following header files,"
+    echo "  which aren't in ${includeDir} or aren't complete:"
+    echo "     $extraHdrs"
+    set changes=1
+endif
+
+# Even if strtoul exists, it is bogus on some AIX systems.  Detect
+# this and pretend the system version doesn't exist if it's bogus.
+
+if ( $strtoul ) then
+    cp compat/teststrtoul.c test.c
+    make configtest >& /dev/null
+    if ( $status == 0 ) then
+       ./a.out
+       if ( $status != 0 ) then
+           set strtoul=0
+       endif
+    endif
+    \rm -f a.out test.c
+endif
+
+# Next, install C procedures for missing library functions.
+
+set extraLibs=""
+\rm -f strerror.c
+if ( ! $strerror ) then
+    set extraLibs="$extraLibs strerror"
+    cp compat/strerror.c .
+endif
+\rm -f opendir.c
+if ( ! $opendir ) then
+    set extraLibs="$extraLibs opendir"
+    cp compat/opendir.c .
+    \rm -f dirent.h
+    cp compat/dirent2.h dirent.h
+    echo "- No opendir/readdir/closedir library exists in this system,"
+    echo "  so substitutes will be provided.  This system better have"
+    echo "  V7-style directories\!"
+endif
+\rm -f strstr.c
+if ( ! $strstr ) then
+    set extraLibs="$extraLibs strstr"
+    cp compat/strstr.c .
+endif
+\rm -f strtod.c
+if ( ! $strtod ) then
+    set extraLibs="$extraLibs strtod"
+    cp compat/strtod.c .
+endif
+\rm -f strtol.c
+if ( ! $strtol ) then
+    set extraLibs="$extraLibs strtol"
+    cp compat/strtol.c .
+endif
+\rm -f strtoul.c
+if ( ! $strtoul ) then
+    set extraLibs="$extraLibs strtoul"
+    cp compat/strtoul.c .
+endif
+if ( "$extraLibs" != "" ) then
+    echo "- Substitutes will be used for the following library procedures,"
+    echo "  which aren't in ${libc} or don't work correctly:"
+    echo "     $extraLibs"
+    set changes=1
+endif
+
+# The following statements determine whether ranlib should be used
+# in the Makefile.  On System-V systems it shouldn't.  The only way
+# to figure this out is to run ranlib and see if it complains (ranlib
+# actually exists on some Sys-V systems, but it returns an error if
+# you run it).
+
+set ranlibOK=0
+cat > ranlibtest.c << EOF
+#include <stdio.h>
+main (argc, argv)
+    int    argc;
+    char **argv;
+{
+    printf ("Hello, world.\n");
+}
+EOF
+cc -c ranlibtest.c
+ar cru ranlibtest.a ranlibtest.o
+ranlib ranlibtest.a >& /dev/null
+if ( $status == 0 ) then
+    set ranlibOK=1
+else
+    echo "- This system appears to be a System V one where ranlib isn't"
+    echo "  used.  The ranlib commands will be removed from Makefile."
+    set changes=1
+endif
+\rm -f ranlibtest.*
+
+# Modify the Makefile to include supplemental library sources, if needed.
+
+set compatObjs=""
+foreach i ($extraLibs)
+    set compatObjs="$compatObjs $i.o"
+end
+#if ( ! -e $makefile.bak ) mv $makefile $makefile.bak
+mv $makefile $makefile.bak
+if ( $ranlibOK ) then
+    sed -e "s/COMPAT_OBJS =/COMPAT_OBJS =$compatObjs/" $makefile.bak > $makefile
+else
+    sed -e "s/COMPAT_OBJS =/COMPAT_OBJS =$compatObjs/" \
+       -e "/ranlib/d" $makefile.bak > $makefile
+endif
+
+# Set the #defines in tclUnix.h to provide various pieces of system
+# configuration information at compile time (existence of header files,
+# variables, type definitions, etc.)
+
+if ( ! $gettod ) then
+    echo "- There's no gettimeofday in ${libc} so Tcl will use"
+    echo '  times for the "time" command.'
+    set changes=1
+endif
+if ( ! $getwd ) then
+    echo "- There's no getwd in ${libc} so Tcl will use"
+    echo '  getcwd for the "pwd" command.'
+    set changes=1
+endif
+set errlist=1
+if ( ! $sys_errlist && ! $strerror ) then
+    echo "- Neither strerror nor sys_errlist is defined in ${libc} so"
+    echo "  Tcl will make a guess about errno-related messages."
+    set errlist=0
+    set changes=1
+endif
+set sysTime=0
+if ( -r $includeDir/sys/time.h ) then
+    set sysTime=1
+endif
+set sysWait=0
+set unionWait=0
+if ( -r $includeDir/sys/wait.h ) then
+    set sysWait=1
+    cp compat/testwait.c test.c
+    make configtest >& /dev/null
+    if ( $status == 0 ) then
+       set unionWait=1
+    endif
+    \rm -f a.out test.c
+endif
+set pid_t=1
+cp compat/testpid.c test.c
+make configtest >& /dev/null
+if ( $status != 0 ) then
+    set pid_t=0
+    echo "- The type pid_t isn't defined in <sys/types.h> so Tcl will"
+    echo '  use "int" instead.'
+endif
+\rm -f a.out test.c
+set uid_t=1
+cp compat/testuid.c test.c
+make configtest >& /dev/null
+if ( $status != 0 ) then
+    set uid_t=0
+    echo "- The type uid_t isn't defined in <sys/types.h> so Tcl will"
+    echo '  use "int" instead.'
+endif
+\rm -f a.out test.c
+if ( ! -e $config.bak ) mv $config $config.bak
+set x=\.\*\$
+sed -e "s/define TCL_GETTOD 1/define TCL_GETTOD $gettod/" \
+    -e "s/define TCL_GETWD 1/define TCL_GETWD $getwd/" \
+    -e "s/define TCL_SYS_ERRLIST 1/define TCL_SYS_ERRLIST $errlist/" \
+    -e "s/define TCL_SYS_TIME_H 1/define TCL_SYS_TIME_H $sysTime/" \
+    -e "s/define TCL_SYS_WAIT_H 1/define TCL_SYS_WAIT_H $sysWait/" \
+    -e "s/define TCL_UNION_WAIT 1/define TCL_UNION_WAIT $unionWait/" \
+    -e "s/define TCL_PID_T 1/define TCL_PID_T $pid_t/" \
+    -e "s/define TCL_UID_T 1/define TCL_UID_T $uid_t/" \
+$config.bak > $config
+
+if ( ! $changes ) then
+    echo "- No special modifications were needed for this system."
+endif
diff --git a/src/tcl/library/init.tcl b/src/tcl/library/init.tcl
new file mode 100644 (file)
index 0000000..7a5c3bc
--- /dev/null
@@ -0,0 +1,154 @@
+# init.tcl --
+#
+# Default system startup file for Tcl-based applications.  Defines
+# "unknown" procedure and auto-load facilities.
+#
+# $Header: /user6/ouster/tcl/scripts/RCS/init.tcl,v 1.7 92/07/25 16:29:36 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1991-1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# unknown:
+# Invoked when a Tcl command is invoked that doesn't exist in the
+# interpreter:
+#
+#      1. See if the autoload facility can locate the command in a
+#         Tcl script file.  If so, load it and execute it.
+#      2. See if the command exists as an executable UNIX program.
+#         If so, "exec" the command.
+#      3. See if the command is a valid abbreviation for another command.
+#         if so, invoke the command.  However, only permit abbreviations
+#         at top-level.
+
+proc unknown args {
+    global auto_noexec auto_noload env unknown_active
+
+    if [info exists unknown_active] {
+       unset unknown_active
+       error "unexpected recursion in \"unknown\" command"
+    }
+    set unknown_active 1
+    set name [lindex $args 0]
+    if ![info exists auto_noload] {
+       if [auto_load $name] {
+           unset unknown_active
+           return [uplevel $args]
+       }
+    }
+    if ![info exists auto_noexec] {
+       if [auto_execok $name] {
+           unset unknown_active
+           return [uplevel exec $args]
+       }
+    }
+    if {([info level] == 1) && ([info script] == "")} {
+       set cmds [info commands $name*]
+       if {[llength $cmds] == 1} {
+           unset unknown_active
+           return [uplevel [lreplace $args 0 0 $cmds]]
+       }
+       if {[llength $cmds] != 0} {
+           unset unknown_active
+           if {$name == ""} {
+               error "empty command name \"\""
+           } else {
+               error "ambiguous command name \"$name\": [lsort $cmds]"
+           }
+       }
+    }
+    unset unknown_active
+    error "invalid command name \"$name\""
+}
+
+# auto_load:
+# Checks a collection of library directories to see if a procedure
+# is defined in one of them.  If so, it sources the appropriate
+# library file to create the procedure.  Returns 1 if it successfully
+# loaded the procedure, 0 otherwise.
+
+proc auto_load cmd {
+    global auto_index auto_oldpath auto_path env
+
+    if [info exists auto_index($cmd)] {
+       uplevel #0 source $auto_index($cmd)
+       return 1
+    }
+    if [catch {set path $auto_path}] {
+       if [catch {set path $env(TCLLIBPATH)}] {
+           if [catch {set path [info library]}] {
+               return 0
+           }
+       }
+    }
+    if [info exists auto_oldpath] {
+       if {$auto_oldpath == $path} {
+           return 0
+       }
+    }
+    set auto_oldpath $path
+    catch {unset auto_index}
+    foreach dir $path {
+       set f ""
+       catch {
+           set f [open $dir/tclindex]
+           if {[gets $f] != "# Tcl autoload index file: each line identifies a Tcl"} {
+               puts stdout "Bad id line in file $dir/tclindex"
+               error done
+           }
+           while {[gets $f line] >= 0} {
+               if {([string index $line 0] == "#") || ([llength $line] != 2)} {
+                   continue
+               }
+               set name [lindex $line 0]
+               if {![info exists auto_index($name)]} {
+                   set auto_index($name) $dir/[lindex $line 1]
+               }
+           }
+       }
+       if {$f != ""} {
+           close $f
+       }
+    }
+    if [info exists auto_index($cmd)] {
+       uplevel #0 source $auto_index($cmd)
+       return 1
+    }
+    return 0
+}
+
+# auto_execok:
+# Returns 1 if there's an executable in the current path for the
+# given name, 0 otherwise.  Builds an associative array auto_execs
+# that caches information about previous checks, for speed.
+
+proc auto_execok name {
+    global auto_execs env
+
+    if [info exists auto_execs($name)] {
+       return $auto_execs($name)
+    }
+    set auto_execs($name) 0
+    foreach dir [split $env(PATH) :] {
+       if {[file executable $dir/$name] && ![file isdirectory $dir/$name]} {
+           set auto_execs($name) 1
+           return 1
+       }
+    }
+    return 0
+}
+
+# auto_reset:
+# Destroy all cached information for auto-loading and auto-execution,
+# so that the information gets recomputed the next time it's needed.
+
+proc auto_reset {} {
+    global auto_execs auto_index
+    unset auto_execs auto_index
+}
diff --git a/src/tcl/library/mkindex.tcl b/src/tcl/library/mkindex.tcl
new file mode 100644 (file)
index 0000000..fe17903
--- /dev/null
@@ -0,0 +1,50 @@
+# auto_mkindex:
+# Given a directory and a glob-style specification for files in that
+# directory, generate a "tclIndex" file in the directory that is suitable
+# for use in auto-loading.  Returns a null string.
+#
+# $Header: /user6/ouster/tcl/scripts/RCS/mkindex.tcl,v 1.2 91/12/16 08:29:25 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1991 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+proc auto_mkindex {dir files} {
+    global errorCode errorInfo
+    set oldDir [pwd]
+    cd $dir
+    set dir [pwd]
+    append index "# Tcl autoload index file: each line identifies a Tcl\n"
+    append index "# procedure and the file where that procedure is\n"
+    append index "# defined.  Generated by the \"auto_mkindex\" command.\n"
+    append index "\n"
+    foreach file [glob $files] {
+       set f ""
+       set error [catch {
+           set f [open $file]
+           while {[gets $f line] >= 0} {
+               if [regexp {^proc[      ]+([^   ]*)} $line match procName] {
+                   append index "[list $procName $file]\n"
+               }
+           }
+           close $f
+       } msg]
+       if $error {
+           set code $errorCode
+           set info $errorInfo
+           catch [close $f]
+           cd $oldDir
+           error $msg $info $code
+       }
+    }
+    set f [open tclindex w]
+    puts $f $index nonewline
+    close $f
+    cd $oldDir
+}
diff --git a/src/tcl/library/parray.tcl b/src/tcl/library/parray.tcl
new file mode 100644 (file)
index 0000000..a90e42f
--- /dev/null
@@ -0,0 +1,29 @@
+# parray:
+# Print the contents of a global array on stdout.
+#
+# $Header: /sprite/src/lib/tcl/scripts/RCS/parray.tcl,v 1.1 91/09/26 09:55:03 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1991 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+proc parray a {
+    global $a
+    set maxl 0
+    foreach name [lsort [array names $a]] {
+       if {[string length $name] > $maxl} {
+           set maxl [string length $name]
+       }
+    }
+    set maxl [expr {$maxl + [string length $a] + 2}]
+    foreach name [lsort [array names $a]] {
+       set nameString [format %s(%s) $a $name]
+       puts stdout [format "%-*s = %s" $maxl $nameString [set ${a}($name)]]
+    }
+}
diff --git a/src/tcl/library/tclindex b/src/tcl/library/tclindex
new file mode 100644 (file)
index 0000000..1b7fd2f
--- /dev/null
@@ -0,0 +1,10 @@
+# Tcl autoload index file: each line identifies a Tcl
+# procedure and the file where that procedure is
+# defined.  Generated by the "auto_mkindex" command.
+
+unknown init.tcl
+auto_load init.tcl
+auto_execok init.tcl
+auto_reset init.tcl
+auto_mkindex mkindex.tcl
+parray parray.tcl
diff --git a/src/tcl/makefile b/src/tcl/makefile
new file mode 100644 (file)
index 0000000..006b435
--- /dev/null
@@ -0,0 +1,85 @@
+# Makefile.linux
+#
+# This Makefile is for use when distributing Tcl to the outside world.
+# It is normally set up by running the "config" script.  Before modifying
+# this file by hand, you should read through the "config" script to see
+# what it does.
+#
+# Some changes you may wish to make here:
+#
+# 1. To compile for non-UNIX systems (so that only the non-UNIX-specific
+# commands are available), change the OBJS line below so it doesn't
+# include ${UNIX_OBJS}.  Also, add the switch "-DTCL_GENERIC_ONLY" to
+# CFLAGS.  Lastly, you'll have to provide your own replacement for the
+# "panic" procedure (see panic.c for what the current one does).
+#
+# 2. ANSI-C procedure prototypes are turned on by default if supported
+# by the compiler.  To turn them off, add "-DNO_PROTOTYPE" to CFLAGS
+# below.
+#
+# 3. If you've put the Tcl script library in a non-standard place, change
+# the definition of TCL_LIBRARY to correspond to its location on your
+# system.
+#
+
+TCL_LIBRARY =  /usr/local/lib/tcl
+
+CC =           gcc
+
+CFLAGS =       -O3 -I. -DTCL_LIBRARY=\"${TCL_LIBRARY}\" -DIS_LINUX
+#CFLAGS =      -g -I. -DTCL_LIBRARY=\"${TCL_LIBRARY}\" -DIS_LINUX
+
+GENERIC_OBJS = \
+       regexp.o \
+       tclassem.o \
+       tclbasic.o \
+       tclckall.o \
+       tclcmdah.o \
+       tclcmdil.o \
+       tclcmdmz.o \
+       tclexpr.o \
+       tclget.o \
+       tclhash.o \
+       tclhist.o \
+       tclparse.o \
+       tclproc.o \
+       tclutil.o \
+       tclvar.o
+
+UNIX_OBJS = \
+       panic.o \
+       tclenv.o \
+       tclglob.o \
+       tclunxaz.o \
+       tclunxst.o \
+       tclunxut.o 
+
+COMPAT_OBJS = 
+
+OBJS = ${GENERIC_OBJS} ${UNIX_OBJS} ${COMPAT_OBJS}
+
+all: libtcl.a
+
+libtcl.a: ${OBJS} ${COMPAT_OBJS}
+       rm -f libtcl.a
+       ar cr libtcl.a ${OBJS}
+       ranlib libtcl.a
+
+tcltest: tcltest.o libtcl.a
+       ${CC} ${CFLAGS} tcltest.o libtcl.a -o tcltest
+
+test: tcltest
+       ( echo cd tests ; echo source all ) | ./tcltest
+
+clean:
+       rm -f ${OBJS} libtcl.a tcltest.o tcltest
+
+# The following target is used during configuration to compile
+# a test program to see if certain facilities are available on
+# the system.
+
+configtest:
+       ${CC} ${CFLAGS} test.c
+
+${OBJS}: tcl.h tclhash.h tclint.h
+${UNIX_OBJS}: tclunix.h
diff --git a/src/tcl/panic.c b/src/tcl/panic.c
new file mode 100644 (file)
index 0000000..abd515a
--- /dev/null
@@ -0,0 +1,54 @@
+/* 
+ * panic.c --
+ *
+ *     Source code for the "panic" library procedure for Tcl;
+ *     individual applications will probably override this with
+ *     an application-specific panic procedure.
+ *
+ * Copyright 1988-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/panic.c,v 1.3 91/10/10 11:25:51 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * panic --
+ *
+ *     Print an error message and kill the process.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The process dies, entering the debugger if possible.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* VARARGS ARGSUSED */
+void
+panic(format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
+    char *format;              /* Format string, suitable for passing to
+                                * fprintf. */
+    char *arg1, *arg2, *arg3;  /* Additional arguments (variable in number)
+                                * to pass to fprintf. */
+    char *arg4, *arg5, *arg6, *arg7, *arg8;
+{
+    (void) fprintf(stderr, format, arg1, arg2, arg3, arg4, arg5, arg6,
+           arg7, arg8);
+    (void) fflush(stderr);
+    abort();
+}
diff --git a/src/tcl/porting.txt b/src/tcl/porting.txt
new file mode 100644 (file)
index 0000000..5825348
--- /dev/null
@@ -0,0 +1,154 @@
+This file contains a collection of notes that various people have
+provided about porting Tcl to various machines and operating systems.
+I don't have personal access to any of these machines, so I make
+no guarantees that the notes are correct, complete, or up-to-date.
+In some cases, a person has volunteered to act as a contact point
+for questions about porting Tcl to a particular machine;  in these
+cases the person's name and e-mail address are listed.
+
+---------------------------------------------
+Cray machines running UNICOS:
+Contact: John Freeman (jlf@cray.com)
+---------------------------------------------
+
+1. The nm command on unicos doesn't have a -p option, so I removed it
+from the config script without apparent harm.
+
+diff -c -r1.1 config
+*** 1.1        1991/11/12 15:11:51
+--- config     1991/11/12 15:14:18
+***************
+*** 57,63 ****
+      echo "  to set the libc variable."
+      exit(1)
+  endif
+! nm -p $libc > tmp.libc
+  if ( $status != 0 ) then
+      echo "- ERROR\!\!  Nm failed to extract names of system-supplied library"
+      echo "  procedures from $libc.  You'll have to modify config by hand to"
+--- 57,63 ----
+      echo "  to set the libc variable."
+      exit(1)
+  endif
+! nm $libc > tmp.libc
+  if ( $status != 0 ) then
+      echo "- ERROR\!\!  Nm failed to extract names of system-supplied library"
+      echo "  procedures from $libc.  You'll have to modify config by hand to"
+
+2. There is an error in the strstr function in UNICOS such that if the
+string to be searched is empty (""), the search will continue past the
+end of the string.  Because of this, the history substitution loop
+will sometimes run past the end of its target string and trash
+malloc's free list, resulting in a core dump some time later.  (As you
+can probably guess, this took a while to diagnose.)  I've submitted a
+problem report to the C library maintainers, but in the meantime here
+is a workaround.
+
+-----------------------------------------------------------------
+diff -c1 -r1.1 tclHistory.c
+*** 1.1        1991/11/12 16:01:58
+--- tclHistory.c       1991/11/12 16:14:22
+***************
+*** 23,24 ****
+--- 23,29 ----
+  #include "tclInt.h"
++ 
++ #ifdef _CRAY
++ /* There is a bug in strstr in UNICOS; this works around it. */
++ #define strstr(s1,s2) ((s1)?(*(s1)?strstr((s1),(s2)):0):0)
++ #endif _CRAY
+
+
+---------------------------------------------
+HP-UX systems:
+---------------------------------------------
+
+1. The #define for TCL_UNION_WAIT in tclUnix.h needs to be set to 0,
+not 1.  I've tried a number of techniques to get the "config" script
+to figure this out and set it correctly, but so far I haven't been
+able to make it work for HP-UX systems.
+
+2. It may also be useful to add the flag "-D_BSD" to CFLAGS in the
+Makefile, but I'm not sure this is necessary (and it may even be
+evil) if TCL_UNION_WAIT has been #define'd correctly.
+
+---------------------------------------------
+MIPS systems runing EP/IX:
+---------------------------------------------
+
+1. Need to add a line "#include <bsd/sys/time.h>" in tclUnix.h.
+
+2. Need to add "-lbsd" into the line that makes tclTest:
+
+       ${CC} ${CFLAGS} tclTest.o libtcl.a -lbsd -o tclTest
+
+---------------------------------------------
+IBM RS/6000 systems running AIX:
+---------------------------------------------
+
+1. The system version of strtoul is buggy, at least under some
+versions of AIX.  If the expression tests fail, try forcing Tcl
+to use its own version of strtoul instead of the system version.
+To do this, first copy strtoul.c from the compat subdirectory up
+to the main Tcl directory.  Then modify the Makefile so that
+the definition for COMPAT_OBJS includes "strtoul.o".  Note:  the
+"config" script should now detect the buggy strtoul and substitute
+Tcl's version automatically.
+
+2. You may have to comment out the declaration of open in tclUnix.h.
+
+3. The "nm -p ..." line in the file "config" has to be changed to
+"nm -en ..." if you use the version of nm that's in /bin.  If you're
+set up to use the BSD version (in /usr/ucb) then this won't be a
+problem.
+
+---------------------------------------------
+AT&T 4.03 OS:
+---------------------------------------------
+
+Machine: i386/33Mhz i387 32k Cache 16MByte 
+OS: AT&T SYSV Release 4 Version 3
+X: X11R5 fixlevel 9
+Xserver: X386 1.2
+
+1. Change the Tk Makefile as follows:
+XLIB            = -lX11
+       should be changed to:
+XLIB            = -lX11 -lsocket -lnsl
+
+2. Change the Tcl "config" script as follows:
+set libc="/lib/libc.a"
+       should be changed to:
+set libc="/usr/ccs/lib/libc.a"
+
+-------------------------------------------------------
+Motorola MPC's running UNIX System V/88 Release R32V2:
+-------------------------------------------------------
+
+1.  Tcl should build without any modifications to sources, but csh
+isn't supplied with the operating system so you'll have to find and
+use the public-domain tcsh.
+
+-------------------------------------------------------
+SGI machines running Irix release 4.0.1 or earlier:
+-------------------------------------------------------
+
+1. There's a bug in the optimizer;  compile tclVar.c using -O0.
+
+2. In tclUnix.h, add the following just before the declaration of environ:
+
+#ifdef __sgi
+#define environ _environ
+#endif
+
+---------------------------------------------
+NeXT machines running NeXTStep 2.1:
+---------------------------------------------
+
+1. Change the "libc" definition in the config file to
+    set libc="/lib/libsys_s.a"
+
+2. Several of the "format" and "scan" tests will fail, but these are
+all minor nits stemming from imperfect POSIX compliance in the NeXT
+C library procedures.  The errors are unlikely to affect any Tcl
+applications.
diff --git a/src/tcl/readme.txt b/src/tcl/readme.txt
new file mode 100644 (file)
index 0000000..6c8d34d
--- /dev/null
@@ -0,0 +1,192 @@
+Tcl
+
+by John Ousterhout
+University of California at Berkeley
+ouster@sprite.berkeley.edu
+
+1. Introduction
+---------------
+
+This directory contains the sources and documentation for Tcl, an
+embeddable tool command language.  The information here corresponds
+to release 6.4.  This release is identical to the 6.3 release except
+for a few bug fixes and one new feature (the Tcl_GlobalEval procedure).
+The file "changes" has a complete list of all changes made to Tcl,
+with incompatible changes specially marked. Tcl 6.4 has no incompatible
+changes relative to 6.3.
+
+For an introduction to the facilities provided by Tcl, see the paper
+``Tcl:  An Embeddable Command Language'', in the Proceedings of the
+1990 Winter USENIX Conference.  A copy of that paper is included here
+in Postscript form in the file "doc/usenix.ps" and in text form in the
+file "doc/usenix.text".  However, the paper corresponds to a much
+earlier version of Tcl (approximately version 3.0), so some details
+of the paper may not be correct anymore and there are many new features
+not documented in the paper.
+
+2. Documentation
+----------------
+
+The "doc" subdirectory contains a complete set of manual entries
+for Tcl.  The file "doc/Tcl.man" gives an overall description of the
+Tcl language and describes the core Tcl commands.  The other ".man"
+files in "doc" describe the library procedures that Tcl provides for
+Tcl-based applications.  Read the "Tcl" man page first.  To print any
+of the man pages, cd to the "doc" directory and invoke your favorite
+variant of troff using the normal -man macros, for example
+
+               ditroff -man <file>
+
+where <file> is the name of the man page you'd like to print.
+
+3. Machines supported
+---------------------
+
+If you follow the directions below, this release should compile
+and run on the following configurations either "out of the box"
+or with only trivial changes:
+
+    - Sun-3's, Sun-4's, SPARCstation-1's and SPARCstation-2's running
+      many variants of SunOS, such as 4.1.
+    - DECstation-3100's and DECstation-5000's running many versions of
+      Ultrix, such as 2.0 and 4.2.
+    - DEC VAXes running many versions of Ultrix or BSD UNIX. 
+    - Intel 386 based systems running SCO Unix 3.2v2.
+    - Intel 386 based systems running SCO Xenix 2.3.3.
+    - Intel 386 based systems running Bell-Tech (now Intel) Unix 3.2.0.
+    - Silicon Graphics systems running IRIX 4.0.
+    - Various H-P machines running versions of HP-UX such as 7.05
+    - Sequent Symmetry running versions of Dynix/ptx such as v1.2.4
+
+If you find problems running Tcl on any of the above configurations,
+please let me know.  Also, if you are able to compile Tcl and run the
+test suite successfully on configurations not listed above, please
+let me know and tell me what changes, if any, you needed to make to
+do it.  I'd like to keep the above list up-to-date and continue to
+improve the portability of Tcl.
+
+Tcl can be used on many other configurations with only a few
+modifications.  The file "porting.notes" contains information sent to
+me about what it took to get Tcl to run on various other configurations.
+I make no guarantees that this information is accurate or complete, but
+you may find it useful.  If you get Tcl running on a new configuration,
+I'd be deligted to receive new information to add to "porting.notes".
+
+4. Compiling Tcl
+----------------
+
+To compile Tcl on any of the configurations listed above, or systems
+similar to them, do the following:
+
+    (a) If your system isn't one of the ones listed above, look in the
+        file "porting.notes" to see if your system is listed there.  This
+       file contains additonal notes on getting Tcl to run on various
+       other systems.
+
+    (b) Edit the "set" commands at the beginning of the file "config"
+        if necessary to correspond to your system configuration (they
+       should already be right for most versions of Unix).
+
+    (c) Type "./config" in the top-level directory. "Config" is a script
+        that pokes around in your system to see if certain almost-standard
+       things are missing (header files, library procedures, etc.);
+       if your system doesn't seem to have them, it configures Tcl to
+       use its own copies of these things instead (Tcl's copies are
+       kept in the "compat" subdirectory).  Config prints out messages
+       for all the substitutions it made.  You can ignore any of the
+       messages unless they say "ERROR!!";  in this case something is
+       fundamentally wrong and the config script couldn't handle your
+       system configuration.
+
+    (d) Type "make" to compile the library.  This will create the Tcl
+       library in "libtcl.a".  The Makefile should work without any
+       modifications but you may wish to personalize it, e.g. to
+       turn on compiler optimization.
+
+    (e) If the combination of "config" and "make" doesn't work for you,
+        then I suggest the following approach:
+           - Start again with a fresh copy of the distribution.
+           - Set the #defines that appear at the very front of
+             tclUnix.h (before the first #include) to correspond
+             to your system.
+           - Modify Makefile to set CC, CFLAGS, etc. for your system.
+           - If things don't compile or don't link, then you may need
+             to copy some of the .c or .h files from the "compat"
+             directory into the main Tcl directory to compensate for
+             files missing from your system.  Modify the COMPAT_OBJS
+             definition in Makefile to include a .o name for each of
+             the .c files that you copied up from the compat directory.
+
+    (f) Create a directory /usr/local/lib/tcl and copy all the files
+        from the "library" subdirectory to /usr/local/lib/tcl.  Or,
+       you can use some other directory as library, but you'll need
+       to modify the Makefile to reflect this fact (change the
+       TCL_LIBRARY definition).
+
+    (g) Type "make tclTest", which will create a simple test program that
+       you can use to try out the Tcl facilities.  TclTest is just a
+       main-program sandwich around the Tcl library.  It reads standard
+       input until it reaches the end of a line where parentheses and
+       backslashes are balanced, then sends everything it's read to the
+       Tcl interpreter.  When the Tcl interpreter returns, tclTest prints
+       the return value or error message.  TclTest defines a few other
+       additional commands, most notably:
+    
+                       echo arg arg ...
+    
+       The "echo" command prints its arguments on standard output,
+       separated by spaces.
+
+5. Test suite
+-------------
+
+There is a relatively complete test suite for all of the Tcl core in
+the subdirectory "tests".  To use it just type "make test" in this
+directory.  You should then see a printout of the test files processed.
+If any errors occur, you'll see a much more substantial printout for
+each error.  Tcl should pass the test suite cleanly on all of the
+systems listed in Section 3.  See the README file in the "tests"
+directory for more information on the test suite.
+
+6. Compiling on non-UNIX systems
+--------------------------------
+
+The Tcl features that depend on system calls peculiar to UNIX (stat,
+fork, exec, times, etc.) are now separate from the main body of Tcl,
+which only requires a few generic library procedures such as malloc
+and strcpy.  Thus it should be relatively easy to compile Tcl for
+these machines, although a number of UNIX-specific commands will
+be absent (e.g.  exec, time, and glob).  See the comments at the
+top of Makefile for information on how to compile without the UNIX
+features.
+
+7. Special thanks
+-----------------
+
+Mark Diekhans and Karl Lehenbauer of Santa Cruz Operation deserve special
+thanks for all their help during the development of Tcl 6.0.  Many of the
+new features in Tcl 6.0 were inspired by an enhanced version of Tcl 3.3
+called Extended Tcl 4.0, which was created by Mark, Karl, and Peter
+da Silva.  Mark and Karl explained these features to me and provided
+excellent (and challenging) feedback during the 6.0 development process.
+They were also a great help in finding and fixing portability problems.
+Without their ideas and assistance Tcl 6.0 would be much less powerful.
+
+8. Support
+----------
+
+There is no official support organization for Tcl, and I can't promise
+to provide much hand-holding to people learning Tcl.  However, I'm very
+interested in receiving bug reports and suggestions for improvements.
+Bugs usually get fixed quickly (particularly if they are serious), but
+enhancements may take a while and may not happen at all unless there
+is widespread support for them.
+
+9. Tcl newsgroup
+-----------------
+
+There is a network news group "comp.lang.tcl" intended for the exchange
+of information about Tcl, Tk, and related applications.  Feel free to use
+this newsgroup both for general information questions and for bug reports.
+I read the newsgroup and will attempt to fix bugs and problems reported
+to it.
diff --git a/src/tcl/regexp.c b/src/tcl/regexp.c
new file mode 100644 (file)
index 0000000..d5b248c
--- /dev/null
@@ -0,0 +1,1233 @@
+/*
+ * regcomp and regexec -- regsub and regerror are elsewhere
+ *
+ *     Copyright (c) 1986 by University of Toronto.
+ *     Written by Henry Spencer.  Not derived from licensed software.
+ *
+ *     Permission is granted to anyone to use this software for any
+ *     purpose on any computer system, and to redistribute it freely,
+ *     subject to the following restrictions:
+ *
+ *     1. The author is not responsible for the consequences of use of
+ *             this software, no matter how awful, even if they arise
+ *             from defects in it.
+ *
+ *     2. The origin of this software must not be misrepresented, either
+ *             by explicit claim or by omission.
+ *
+ *     3. Altered versions must be plainly marked as such, and must not
+ *             be misrepresented as being the original software.
+ *
+ * Beware that some of this code is subtly aware of the way operator
+ * precedence is structured in regular expressions.  Serious changes in
+ * regular-expression syntax might require a total rethink.
+ *
+ * *** NOTE: this code has been altered slightly for use in Tcl. ***
+ * *** The only change is to use ckalloc and ckfree instead of   ***
+ * *** malloc and free.                                                 ***
+ */
+#include "tclint.h"
+
+/*
+ * The "internal use only" fields in regexp.h are present to pass info from
+ * compile to execute that permits the execute phase to run lots faster on
+ * simple cases.  They are:
+ *
+ * regstart    char that must begin a match; '\0' if none obvious
+ * reganch     is the match anchored (at beginning-of-line only)?
+ * regmust     string (pointer into program) that match must include, or NULL
+ * regmlen     length of regmust string
+ *
+ * Regstart and reganch permit very fast decisions on suitable starting points
+ * for a match, cutting down the work a lot.  Regmust permits fast rejection
+ * of lines that cannot possibly match.  The regmust tests are costly enough
+ * that regcomp() supplies a regmust only if the r.e. contains something
+ * potentially expensive (at present, the only such thing detected is * or +
+ * at the start of the r.e., which can involve a lot of backup).  Regmlen is
+ * supplied because the test in regexec() needs it and regcomp() is computing
+ * it anyway.
+ */
+
+/*
+ * Structure for regexp "program".  This is essentially a linear encoding
+ * of a nondeterministic finite-state machine (aka syntax charts or
+ * "railroad normal form" in parsing technology).  Each node is an opcode
+ * plus a "next" pointer, possibly plus an operand.  "Next" pointers of
+ * all nodes except BRANCH implement concatenation; a "next" pointer with
+ * a BRANCH on both ends of it is connecting two alternatives.  (Here we
+ * have one of the subtle syntax dependencies:  an individual BRANCH (as
+ * opposed to a collection of them) is never concatenated with anything
+ * because of operator precedence.)  The operand of some types of node is
+ * a literal string; for others, it is a node leading into a sub-FSM.  In
+ * particular, the operand of a BRANCH node is the first node of the branch.
+ * (NB this is *not* a tree structure:  the tail of the branch connects
+ * to the thing following the set of BRANCHes.)  The opcodes are:
+ */
+
+/* definition  number  opnd?   meaning */
+#define        END     0       /* no   End of program. */
+#define        BOL     1       /* no   Match "" at beginning of line. */
+#define        EOL     2       /* no   Match "" at end of line. */
+#define        ANY     3       /* no   Match any one character. */
+#define        ANYOF   4       /* str  Match any character in this string. */
+#define        ANYBUT  5       /* str  Match any character not in this string. */
+#define        BRANCH  6       /* node Match this alternative, or the next... */
+#define        BACK    7       /* no   Match "", "next" ptr points backward. */
+#define        EXACTLY 8       /* str  Match this string. */
+#define        NOTHING 9       /* no   Match empty string. */
+#define        STAR    10      /* node Match this (simple) thing 0 or more times. */
+#define        PLUS    11      /* node Match this (simple) thing 1 or more times. */
+#define        OPEN    20      /* no   Mark this point in input as start of #n. */
+                       /*      OPEN+1 is number 1, etc. */
+#define        CLOSE   30      /* no   Analogous to OPEN. */
+
+/*
+ * Opcode notes:
+ *
+ * BRANCH      The set of branches constituting a single choice are hooked
+ *             together with their "next" pointers, since precedence prevents
+ *             anything being concatenated to any individual branch.  The
+ *             "next" pointer of the last BRANCH in a choice points to the
+ *             thing following the whole choice.  This is also where the
+ *             final "next" pointer of each individual branch points; each
+ *             branch starts with the operand node of a BRANCH node.
+ *
+ * BACK                Normal "next" pointers all implicitly point forward; BACK
+ *             exists to make loop structures possible.
+ *
+ * STAR,PLUS   '?', and complex '*' and '+', are implemented as circular
+ *             BRANCH structures using BACK.  Simple cases (one character
+ *             per match) are implemented with STAR and PLUS for speed
+ *             and to minimize recursive plunges.
+ *
+ * OPEN,CLOSE  ...are numbered at compile time.
+ */
+
+/*
+ * A node is one char of opcode followed by two chars of "next" pointer.
+ * "Next" pointers are stored as two 8-bit pieces, high order first.  The
+ * value is a positive offset from the opcode of the node containing it.
+ * An operand, if any, simply follows the node.  (Note that much of the
+ * code generation knows about this implicit relationship.)
+ *
+ * Using two bytes for the "next" pointer is vast overkill for most things,
+ * but allows patterns to get big without disasters.
+ */
+#define        OP(p)   (*(p))
+#define        NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377))
+#define        OPERAND(p)      ((p) + 3)
+
+/*
+ * See regmagic.h for one further detail of program structure.
+ */
+
+
+/*
+ * Utility definitions.
+ */
+#ifndef CHARBITS
+#define        UCHARAT(p)      ((int)*(unsigned char *)(p))
+#else
+#define        UCHARAT(p)      ((int)*(p)&CHARBITS)
+#endif
+
+#define        FAIL(m) { regerror(m); return(NULL); }
+#define        ISMULT(c)       ((c) == '*' || (c) == '+' || (c) == '?')
+#define        META    "^$.[()|?+*\\"
+
+/*
+ * Flags to be passed up and down.
+ */
+#define        HASWIDTH        01      /* Known never to match null string. */
+#define        SIMPLE          02      /* Simple enough to be STAR/PLUS operand. */
+#define        SPSTART         04      /* Starts with * or +. */
+#define        WORST           0       /* Worst case. */
+
+/*
+ * Global work variables for regcomp().
+ */
+static char *regparse;         /* Input-scan pointer. */
+static int regnpar;            /* () count. */
+static char regdummy;
+static char *regcode;          /* Code-emit pointer; &regdummy = don't. */
+static long regsize;           /* Code size. */
+
+/*
+ * The first byte of the regexp internal "program" is actually this magic
+ * number; the start node begins in the second byte.
+ */
+#define        MAGIC   0234
+
+
+/*
+ * Forward declarations for regcomp()'s friends.
+ */
+#ifndef STATIC
+#define        STATIC  static
+#endif
+STATIC char *reg();
+STATIC char *regbranch();
+STATIC char *regpiece();
+STATIC char *regatom();
+STATIC char *regnode();
+STATIC char *regnext();
+STATIC void regc();
+STATIC void reginsert();
+STATIC void regtail();
+STATIC void regoptail();
+#ifdef STRCSPN
+STATIC int strcspn();
+#endif
+
+/*
+ - regcomp - compile a regular expression into internal code
+ *
+ * We can't allocate space until we know how big the compiled form will be,
+ * but we can't compile it (and thus know how big it is) until we've got a
+ * place to put the code.  So we cheat:  we compile it twice, once with code
+ * generation turned off and size counting turned on, and once "for real".
+ * This also means that we don't allocate space until we are sure that the
+ * thing really will compile successfully, and we never have to move the
+ * code and thus invalidate pointers into it.  (Note that it has to be in
+ * one piece because free() must be able to free it all.)
+ *
+ * Beware that the optimization-preparation code in here knows about some
+ * of the structure of the compiled regexp.
+ */
+regexp *
+regcomp(exp)
+char *exp;
+{
+       register regexp *r;
+       register char *scan;
+       register char *longest;
+       register int len;
+       int flags;
+
+       if (exp == NULL)
+               FAIL("NULL argument");
+
+       /* First pass: determine size, legality. */
+       regparse = exp;
+       regnpar = 1;
+       regsize = 0L;
+       regcode = &regdummy;
+       regc(MAGIC);
+       if (reg(0, &flags) == NULL)
+               return(NULL);
+
+       /* Small enough for pointer-storage convention? */
+       if (regsize >= 32767L)          /* Probably could be 65535L. */
+               FAIL("regexp too big");
+
+       /* Allocate space. */
+       r = (regexp *)ckalloc(sizeof(regexp) + (unsigned)regsize);
+       if (r == NULL)
+               FAIL("out of space");
+
+       /* Second pass: emit code. */
+       regparse = exp;
+       regnpar = 1;
+       regcode = r->program;
+       regc(MAGIC);
+       if (reg(0, &flags) == NULL)
+               return(NULL);
+
+       /* Dig out information for optimizations. */
+       r->regstart = '\0';     /* Worst-case defaults. */
+       r->reganch = 0;
+       r->regmust = NULL;
+       r->regmlen = 0;
+       scan = r->program+1;                    /* First BRANCH. */
+       if (OP(regnext(scan)) == END) {         /* Only one top-level choice. */
+               scan = OPERAND(scan);
+
+               /* Starting-point info. */
+               if (OP(scan) == EXACTLY)
+                       r->regstart = *OPERAND(scan);
+               else if (OP(scan) == BOL)
+                       r->reganch++;
+
+               /*
+                * If there's something expensive in the r.e., find the
+                * longest literal string that must appear and make it the
+                * regmust.  Resolve ties in favor of later strings, since
+                * the regstart check works with the beginning of the r.e.
+                * and avoiding duplication strengthens checking.  Not a
+                * strong reason, but sufficient in the absence of others.
+                */
+               if (flags&SPSTART) {
+                       longest = NULL;
+                       len = 0;
+                       for (; scan != NULL; scan = regnext(scan))
+                               if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) {
+                                       longest = OPERAND(scan);
+                                       len = strlen(OPERAND(scan));
+                               }
+                       r->regmust = longest;
+                       r->regmlen = len;
+               }
+       }
+
+       return(r);
+}
+
+/*
+ - reg - regular expression, i.e. main body or parenthesized thing
+ *
+ * Caller must absorb opening parenthesis.
+ *
+ * Combining parenthesis handling with the base level of regular expression
+ * is a trifle forced, but the need to tie the tails of the branches to what
+ * follows makes it hard to avoid.
+ */
+static char *
+reg(paren, flagp)
+int paren;                     /* Parenthesized? */
+int *flagp;
+{
+       register char *ret;
+       register char *br;
+       register char *ender;
+       register int parno = 0;
+       int flags;
+
+       *flagp = HASWIDTH;      /* Tentatively. */
+
+       /* Make an OPEN node, if parenthesized. */
+       if (paren) {
+               if (regnpar >= NSUBEXP)
+                       FAIL("too many ()");
+               parno = regnpar;
+               regnpar++;
+               ret = regnode(OPEN+parno);
+       } else
+               ret = NULL;
+
+       /* Pick up the branches, linking them together. */
+       br = regbranch(&flags);
+       if (br == NULL)
+               return(NULL);
+       if (ret != NULL)
+               regtail(ret, br);       /* OPEN -> first. */
+       else
+               ret = br;
+       if (!(flags&HASWIDTH))
+               *flagp &= ~HASWIDTH;
+       *flagp |= flags&SPSTART;
+       while (*regparse == '|') {
+               regparse++;
+               br = regbranch(&flags);
+               if (br == NULL)
+                       return(NULL);
+               regtail(ret, br);       /* BRANCH -> BRANCH. */
+               if (!(flags&HASWIDTH))
+                       *flagp &= ~HASWIDTH;
+               *flagp |= flags&SPSTART;
+       }
+
+       /* Make a closing node, and hook it on the end. */
+       ender = regnode((paren) ? CLOSE+parno : END);   
+       regtail(ret, ender);
+
+       /* Hook the tails of the branches to the closing node. */
+       for (br = ret; br != NULL; br = regnext(br))
+               regoptail(br, ender);
+
+       /* Check for proper termination. */
+       if (paren && *regparse++ != ')') {
+               FAIL("unmatched ()");
+       } else if (!paren && *regparse != '\0') {
+               if (*regparse == ')') {
+                       FAIL("unmatched ()");
+               } else
+                       FAIL("junk on end");    /* "Can't happen". */
+               /* NOTREACHED */
+       }
+
+       return(ret);
+}
+
+/*
+ - regbranch - one alternative of an | operator
+ *
+ * Implements the concatenation operator.
+ */
+static char *
+regbranch(flagp)
+int *flagp;
+{
+       register char *ret;
+       register char *chain;
+       register char *latest;
+       int flags;
+
+       *flagp = WORST;         /* Tentatively. */
+
+       ret = regnode(BRANCH);
+       chain = NULL;
+       while (*regparse != '\0' && *regparse != '|' && *regparse != ')') {
+               latest = regpiece(&flags);
+               if (latest == NULL)
+                       return(NULL);
+               *flagp |= flags&HASWIDTH;
+               if (chain == NULL)      /* First piece. */
+                       *flagp |= flags&SPSTART;
+               else
+                       regtail(chain, latest);
+               chain = latest;
+       }
+       if (chain == NULL)      /* Loop ran zero times. */
+               (void) regnode(NOTHING);
+
+       return(ret);
+}
+
+/*
+ - regpiece - something followed by possible [*+?]
+ *
+ * Note that the branching code sequences used for ? and the general cases
+ * of * and + are somewhat optimized:  they use the same NOTHING node as
+ * both the endmarker for their branch list and the body of the last branch.
+ * It might seem that this node could be dispensed with entirely, but the
+ * endmarker role is not redundant.
+ */
+static char *
+regpiece(flagp)
+int *flagp;
+{
+       register char *ret;
+       register char op;
+       register char *next;
+       int flags;
+
+       ret = regatom(&flags);
+       if (ret == NULL)
+               return(NULL);
+
+       op = *regparse;
+       if (!ISMULT(op)) {
+               *flagp = flags;
+               return(ret);
+       }
+
+       if (!(flags&HASWIDTH) && op != '?')
+               FAIL("*+ operand could be empty");
+       *flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH);
+
+       if (op == '*' && (flags&SIMPLE))
+               reginsert(STAR, ret);
+       else if (op == '*') {
+               /* Emit x* as (x&|), where & means "self". */
+               reginsert(BRANCH, ret);                 /* Either x */
+               regoptail(ret, regnode(BACK));          /* and loop */
+               regoptail(ret, ret);                    /* back */
+               regtail(ret, regnode(BRANCH));          /* or */
+               regtail(ret, regnode(NOTHING));         /* null. */
+       } else if (op == '+' && (flags&SIMPLE))
+               reginsert(PLUS, ret);
+       else if (op == '+') {
+               /* Emit x+ as x(&|), where & means "self". */
+               next = regnode(BRANCH);                 /* Either */
+               regtail(ret, next);
+               regtail(regnode(BACK), ret);            /* loop back */
+               regtail(next, regnode(BRANCH));         /* or */
+               regtail(ret, regnode(NOTHING));         /* null. */
+       } else if (op == '?') {
+               /* Emit x? as (x|) */
+               reginsert(BRANCH, ret);                 /* Either x */
+               regtail(ret, regnode(BRANCH));          /* or */
+               next = regnode(NOTHING);                /* null. */
+               regtail(ret, next);
+               regoptail(ret, next);
+       }
+       regparse++;
+       if (ISMULT(*regparse))
+               FAIL("nested *?+");
+
+       return(ret);
+}
+
+/*
+ - regatom - the lowest level
+ *
+ * Optimization:  gobbles an entire sequence of ordinary characters so that
+ * it can turn them into a single node, which is smaller to store and
+ * faster to run.  Backslashed characters are exceptions, each becoming a
+ * separate node; the code is simpler that way and it's not worth fixing.
+ */
+static char *
+regatom(flagp)
+int *flagp;
+{
+       register char *ret;
+       int flags;
+
+       *flagp = WORST;         /* Tentatively. */
+
+       switch (*regparse++) {
+       case '^':
+               ret = regnode(BOL);
+               break;
+       case '$':
+               ret = regnode(EOL);
+               break;
+       case '.':
+               ret = regnode(ANY);
+               *flagp |= HASWIDTH|SIMPLE;
+               break;
+       case '[': {
+                       register int clss;
+                       register int classend;
+
+                       if (*regparse == '^') { /* Complement of range. */
+                               ret = regnode(ANYBUT);
+                               regparse++;
+                       } else
+                               ret = regnode(ANYOF);
+                       if (*regparse == ']' || *regparse == '-')
+                               regc(*regparse++);
+                       while (*regparse != '\0' && *regparse != ']') {
+                               if (*regparse == '-') {
+                                       regparse++;
+                                       if (*regparse == ']' || *regparse == '\0')
+                                               regc('-');
+                                       else {
+                                               clss = UCHARAT(regparse-2)+1;
+                                               classend = UCHARAT(regparse);
+                                               if (clss > classend+1)
+                                                       FAIL("invalid [] range");
+                                               for (; clss <= classend; clss++)
+                                                       regc(clss);
+                                               regparse++;
+                                       }
+                               } else
+                                       regc(*regparse++);
+                       }
+                       regc('\0');
+                       if (*regparse != ']')
+                               FAIL("unmatched []");
+                       regparse++;
+                       *flagp |= HASWIDTH|SIMPLE;
+               }
+               break;
+       case '(':
+               ret = reg(1, &flags);
+               if (ret == NULL)
+                       return(NULL);
+               *flagp |= flags&(HASWIDTH|SPSTART);
+               break;
+       case '\0':
+       case '|':
+       case ')':
+               FAIL("internal urp");   /* Supposed to be caught earlier. */
+               /* NOTREACHED */
+               break;
+       case '?':
+       case '+':
+       case '*':
+               FAIL("?+* follows nothing");
+               /* NOTREACHED */
+               break;
+       case '\\':
+               if (*regparse == '\0')
+                       FAIL("trailing \\");
+               ret = regnode(EXACTLY);
+               regc(*regparse++);
+               regc('\0');
+               *flagp |= HASWIDTH|SIMPLE;
+               break;
+       default: {
+                       register int len;
+                       register char ender;
+
+                       regparse--;
+                       len = strcspn(regparse, META);
+                       if (len <= 0)
+                               FAIL("internal disaster");
+                       ender = *(regparse+len);
+                       if (len > 1 && ISMULT(ender))
+                               len--;          /* Back off clear of ?+* operand. */
+                       *flagp |= HASWIDTH;
+                       if (len == 1)
+                               *flagp |= SIMPLE;
+                       ret = regnode(EXACTLY);
+                       while (len > 0) {
+                               regc(*regparse++);
+                               len--;
+                       }
+                       regc('\0');
+               }
+               break;
+       }
+
+       return(ret);
+}
+
+/*
+ - regnode - emit a node
+ */
+static char *                  /* Location. */
+regnode(op)
+char op;
+{
+       register char *ret;
+       register char *ptr;
+
+       ret = regcode;
+       if (ret == &regdummy) {
+               regsize += 3;
+               return(ret);
+       }
+
+       ptr = ret;
+       *ptr++ = op;
+       *ptr++ = '\0';          /* Null "next" pointer. */
+       *ptr++ = '\0';
+       regcode = ptr;
+
+       return(ret);
+}
+
+/*
+ - regc - emit (if appropriate) a byte of code
+ */
+static void
+regc(b)
+char b;
+{
+       if (regcode != &regdummy)
+               *regcode++ = b;
+       else
+               regsize++;
+}
+
+/*
+ - reginsert - insert an operator in front of already-emitted operand
+ *
+ * Means relocating the operand.
+ */
+static void
+reginsert(op, opnd)
+char op;
+char *opnd;
+{
+       register char *src;
+       register char *dst;
+       register char *place;
+
+       if (regcode == &regdummy) {
+               regsize += 3;
+               return;
+       }
+
+       src = regcode;
+       regcode += 3;
+       dst = regcode;
+       while (src > opnd)
+               *--dst = *--src;
+
+       place = opnd;           /* Op node, where operand used to be. */
+       *place++ = op;
+       *place++ = '\0';
+       *place++ = '\0';
+}
+
+/*
+ - regtail - set the next-pointer at the end of a node chain
+ */
+static void
+regtail(p, val)
+char *p;
+char *val;
+{
+       register char *scan;
+       register char *temp;
+       register int offset;
+
+       if (p == &regdummy)
+               return;
+
+       /* Find last node. */
+       scan = p;
+       for (;;) {
+               temp = regnext(scan);
+               if (temp == NULL)
+                       break;
+               scan = temp;
+       }
+
+       if (OP(scan) == BACK)
+               offset = scan - val;
+       else
+               offset = val - scan;
+       *(scan+1) = (offset>>8)&0377;
+       *(scan+2) = offset&0377;
+}
+
+/*
+ - regoptail - regtail on operand of first argument; nop if operandless
+ */
+static void
+regoptail(p, val)
+char *p;
+char *val;
+{
+       /* "Operandless" and "op != BRANCH" are synonymous in practice. */
+       if (p == NULL || p == &regdummy || OP(p) != BRANCH)
+               return;
+       regtail(OPERAND(p), val);
+}
+
+/*
+ * regexec and friends
+ */
+
+/*
+ * Global work variables for regexec().
+ */
+static char *reginput;         /* String-input pointer. */
+static char *regbol;           /* Beginning of input, for ^ check. */
+static char **regstartp;       /* Pointer to startp array. */
+static char **regendp;         /* Ditto for endp. */
+
+/*
+ * Forwards.
+ */
+STATIC int regtry();
+STATIC int regmatch();
+STATIC int regrepeat();
+
+#ifdef DEBUG
+int regnarrate = 0;
+void regdump();
+STATIC char *regprop();
+#endif
+
+/*
+ - regexec - match a regexp against a string
+ */
+int
+regexec(prog, string)
+register regexp *prog;
+register char *string;
+{
+       register char *s;
+#ifndef IS_LINUX
+       extern char *strchr();
+#endif
+
+       /* Be paranoid... */
+       if (prog == NULL || string == NULL) {
+               regerror("NULL parameter");
+               return(0);
+       }
+
+       /* Check validity of program. */
+       if (UCHARAT(prog->program) != MAGIC) {
+               regerror("corrupted program");
+               return(0);
+       }
+
+       /* If there is a "must appear" string, look for it. */
+       if (prog->regmust != NULL) {
+               s = string;
+               while ((s = strchr(s, prog->regmust[0])) != NULL) {
+                       if (strncmp(s, prog->regmust, prog->regmlen) == 0)
+                               break;  /* Found it. */
+                       s++;
+               }
+               if (s == NULL)  /* Not present. */
+                       return(0);
+       }
+
+       /* Mark beginning of line for ^ . */
+       regbol = string;
+
+       /* Simplest case:  anchored match need be tried only once. */
+       if (prog->reganch)
+               return(regtry(prog, string));
+
+       /* Messy cases:  unanchored match. */
+       s = string;
+       if (prog->regstart != '\0')
+               /* We know what char it must start with. */
+               while ((s = strchr(s, prog->regstart)) != NULL) {
+                       if (regtry(prog, s))
+                               return(1);
+                       s++;
+               }
+       else
+               /* We don't -- general case. */
+               do {
+                       if (regtry(prog, s))
+                               return(1);
+               } while (*s++ != '\0');
+
+       /* Failure. */
+       return(0);
+}
+
+/*
+ - regtry - try match at specific point
+ */
+static int                     /* 0 failure, 1 success */
+regtry(prog, string)
+regexp *prog;
+char *string;
+{
+       register int i;
+       register char **sp;
+       register char **ep;
+
+       reginput = string;
+       regstartp = prog->startp;
+       regendp = prog->endp;
+
+       sp = prog->startp;
+       ep = prog->endp;
+       for (i = NSUBEXP; i > 0; i--) {
+               *sp++ = NULL;
+               *ep++ = NULL;
+       }
+       if (regmatch(prog->program + 1)) {
+               prog->startp[0] = string;
+               prog->endp[0] = reginput;
+               return(1);
+       } else
+               return(0);
+}
+
+/*
+ - regmatch - main matching routine
+ *
+ * Conceptually the strategy is simple:  check to see whether the current
+ * node matches, call self recursively to see whether the rest matches,
+ * and then act accordingly.  In practice we make some effort to avoid
+ * recursion, in particular by going through "ordinary" nodes (that don't
+ * need to know whether the rest of the match failed) by a loop instead of
+ * by recursion.
+ */
+static int                     /* 0 failure, 1 success */
+regmatch(prog)
+char *prog;
+{
+       register char *scan;    /* Current node. */
+       char *next;             /* Next node. */
+#ifndef IS_LINUX
+       extern char *strchr();
+#endif
+
+       scan = prog;
+#ifdef DEBUG
+       if (scan != NULL && regnarrate)
+               fprintf(stderr, "%s(\n", regprop(scan));
+#endif
+       while (scan != NULL) {
+#ifdef DEBUG
+               if (regnarrate)
+                       fprintf(stderr, "%s...\n", regprop(scan));
+#endif
+               next = regnext(scan);
+
+               switch (OP(scan)) {
+               case BOL:
+                       if (reginput != regbol)
+                               return(0);
+                       break;
+               case EOL:
+                       if (*reginput != '\0')
+                               return(0);
+                       break;
+               case ANY:
+                       if (*reginput == '\0')
+                               return(0);
+                       reginput++;
+                       break;
+               case EXACTLY: {
+                               register int len;
+                               register char *opnd;
+
+                               opnd = OPERAND(scan);
+                               /* Inline the first character, for speed. */
+                               if (*opnd != *reginput)
+                                       return(0);
+                               len = strlen(opnd);
+                               if (len > 1 && strncmp(opnd, reginput, len) != 0)
+                                       return(0);
+                               reginput += len;
+                       }
+                       break;
+               case ANYOF:
+                       if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) == NULL)
+                               return(0);
+                       reginput++;
+                       break;
+               case ANYBUT:
+                       if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) != NULL)
+                               return(0);
+                       reginput++;
+                       break;
+               case NOTHING:
+                       break;
+               case BACK:
+                       break;
+               case OPEN+1:
+               case OPEN+2:
+               case OPEN+3:
+               case OPEN+4:
+               case OPEN+5:
+               case OPEN+6:
+               case OPEN+7:
+               case OPEN+8:
+               case OPEN+9: {
+                               register int no;
+                               register char *save;
+
+                               no = OP(scan) - OPEN;
+                               save = reginput;
+
+                               if (regmatch(next)) {
+                                       /*
+                                        * Don't set startp if some later
+                                        * invocation of the same parentheses
+                                        * already has.
+                                        */
+                                       if (regstartp[no] == NULL)
+                                               regstartp[no] = save;
+                                       return(1);
+                               } else
+                                       return(0);
+                       }
+                       /* NOTREACHED */
+                       break;
+               case CLOSE+1:
+               case CLOSE+2:
+               case CLOSE+3:
+               case CLOSE+4:
+               case CLOSE+5:
+               case CLOSE+6:
+               case CLOSE+7:
+               case CLOSE+8:
+               case CLOSE+9: {
+                               register int no;
+                               register char *save;
+
+                               no = OP(scan) - CLOSE;
+                               save = reginput;
+
+                               if (regmatch(next)) {
+                                       /*
+                                        * Don't set endp if some later
+                                        * invocation of the same parentheses
+                                        * already has.
+                                        */
+                                       if (regendp[no] == NULL)
+                                               regendp[no] = save;
+                                       return(1);
+                               } else
+                                       return(0);
+                       }
+                       /* NOTREACHED */
+                       break;
+               case BRANCH: {
+                               register char *save;
+
+                               if (OP(next) != BRANCH)         /* No choice. */
+                                       next = OPERAND(scan);   /* Avoid recursion. */
+                               else {
+                                       do {
+                                               save = reginput;
+                                               if (regmatch(OPERAND(scan)))
+                                                       return(1);
+                                               reginput = save;
+                                               scan = regnext(scan);
+                                       } while (scan != NULL && OP(scan) == BRANCH);
+                                       return(0);
+                                       /* NOTREACHED */
+                               }
+                       }
+                       /* NOTREACHED */
+                       break;
+               case STAR:
+               case PLUS: {
+                               register char nextch;
+                               register int no;
+                               register char *save;
+                               register int min;
+
+                               /*
+                                * Lookahead to avoid useless match attempts
+                                * when we know what character comes next.
+                                */
+                               nextch = '\0';
+                               if (OP(next) == EXACTLY)
+                                       nextch = *OPERAND(next);
+                               min = (OP(scan) == STAR) ? 0 : 1;
+                               save = reginput;
+                               no = regrepeat(OPERAND(scan));
+                               while (no >= min) {
+                                       /* If it could work, try it. */
+                                       if (nextch == '\0' || *reginput == nextch)
+                                               if (regmatch(next))
+                                                       return(1);
+                                       /* Couldn't or didn't -- back up. */
+                                       no--;
+                                       reginput = save + no;
+                               }
+                               return(0);
+                       }
+                       /* NOTREACHED */
+                       break;
+               case END:
+                       return(1);      /* Success! */
+                       /* NOTREACHED */
+                       break;
+               default:
+                       regerror("memory corruption");
+                       return(0);
+                       /* NOTREACHED */
+                       break;
+               }
+
+               scan = next;
+       }
+
+       /*
+        * We get here only if there's trouble -- normally "case END" is
+        * the terminating point.
+        */
+       regerror("corrupted pointers");
+       return(0);
+}
+
+/*
+ - regrepeat - repeatedly match something simple, report how many
+ */
+static int
+regrepeat(p)
+char *p;
+{
+       register int count = 0;
+       register char *scan;
+       register char *opnd;
+
+       scan = reginput;
+       opnd = OPERAND(p);
+       switch (OP(p)) {
+       case ANY:
+               count = strlen(scan);
+               scan += count;
+               break;
+       case EXACTLY:
+               while (*opnd == *scan) {
+                       count++;
+                       scan++;
+               }
+               break;
+       case ANYOF:
+               while (*scan != '\0' && strchr(opnd, *scan) != NULL) {
+                       count++;
+                       scan++;
+               }
+               break;
+       case ANYBUT:
+               while (*scan != '\0' && strchr(opnd, *scan) == NULL) {
+                       count++;
+                       scan++;
+               }
+               break;
+       default:                /* Oh dear.  Called inappropriately. */
+               regerror("internal foulup");
+               count = 0;      /* Best compromise. */
+               break;
+       }
+       reginput = scan;
+
+       return(count);
+}
+
+/*
+ - regnext - dig the "next" pointer out of a node
+ */
+static char *
+regnext(p)
+register char *p;
+{
+       register int offset;
+
+       if (p == &regdummy)
+               return(NULL);
+
+       offset = NEXT(p);
+       if (offset == 0)
+               return(NULL);
+
+       if (OP(p) == BACK)
+               return(p-offset);
+       else
+               return(p+offset);
+}
+
+#ifdef DEBUG
+
+STATIC char *regprop();
+
+/*
+ - regdump - dump a regexp onto stdout in vaguely comprehensible form
+ */
+void
+regdump(r)
+regexp *r;
+{
+       register char *s;
+       register char op = EXACTLY;     /* Arbitrary non-END op. */
+       register char *next;
+       extern char *strchr();
+
+
+       s = r->program + 1;
+       while (op != END) {     /* While that wasn't END last time... */
+               op = OP(s);
+               printf("%2d%s", s-r->program, regprop(s));      /* Where, what. */
+               next = regnext(s);
+               if (next == NULL)               /* Next ptr. */
+                       printf("(0)");
+               else 
+                       printf("(%d)", (s-r->program)+(next-s));
+               s += 3;
+               if (op == ANYOF || op == ANYBUT || op == EXACTLY) {
+                       /* Literal string, where present. */
+                       while (*s != '\0') {
+                               putchar(*s);
+                               s++;
+                       }
+                       s++;
+               }
+               putchar('\n');
+       }
+
+       /* Header fields of interest. */
+       if (r->regstart != '\0')
+               printf("start `%c' ", r->regstart);
+       if (r->reganch)
+               printf("anchored ");
+       if (r->regmust != NULL)
+               printf("must have \"%s\"", r->regmust);
+       printf("\n");
+}
+
+/*
+ - regprop - printable representation of opcode
+ */
+static char *
+regprop(op)
+char *op;
+{
+       register char *p;
+       static char buf[50];
+
+       (void) strcpy(buf, ":");
+
+       switch (OP(op)) {
+       case BOL:
+               p = "BOL";
+               break;
+       case EOL:
+               p = "EOL";
+               break;
+       case ANY:
+               p = "ANY";
+               break;
+       case ANYOF:
+               p = "ANYOF";
+               break;
+       case ANYBUT:
+               p = "ANYBUT";
+               break;
+       case BRANCH:
+               p = "BRANCH";
+               break;
+       case EXACTLY:
+               p = "EXACTLY";
+               break;
+       case NOTHING:
+               p = "NOTHING";
+               break;
+       case BACK:
+               p = "BACK";
+               break;
+       case END:
+               p = "END";
+               break;
+       case OPEN+1:
+       case OPEN+2:
+       case OPEN+3:
+       case OPEN+4:
+       case OPEN+5:
+       case OPEN+6:
+       case OPEN+7:
+       case OPEN+8:
+       case OPEN+9:
+               sprintf(buf+strlen(buf), "OPEN%d", OP(op)-OPEN);
+               p = NULL;
+               break;
+       case CLOSE+1:
+       case CLOSE+2:
+       case CLOSE+3:
+       case CLOSE+4:
+       case CLOSE+5:
+       case CLOSE+6:
+       case CLOSE+7:
+       case CLOSE+8:
+       case CLOSE+9:
+               sprintf(buf+strlen(buf), "CLOSE%d", OP(op)-CLOSE);
+               p = NULL;
+               break;
+       case STAR:
+               p = "STAR";
+               break;
+       case PLUS:
+               p = "PLUS";
+               break;
+       default:
+               regerror("corrupted opcode");
+               break;
+       }
+       if (p != NULL)
+               (void) strcat(buf, p);
+       return(buf);
+}
+#endif
+
+/*
+ * The following is provided for those people who do not have strcspn() in
+ * their C libraries.  They should get off their butts and do something
+ * about it; at least one public-domain implementation of those (highly
+ * useful) string routines has been published on Usenet.
+ */
+#ifdef STRCSPN
+/*
+ * strcspn - find length of initial segment of s1 consisting entirely
+ * of characters not from s2
+ */
+
+static int
+strcspn(s1, s2)
+char *s1;
+char *s2;
+{
+       register char *scan1;
+       register char *scan2;
+       register int count;
+
+       count = 0;
+       for (scan1 = s1; *scan1 != '\0'; scan1++) {
+               for (scan2 = s2; *scan2 != '\0';)       /* ++ moved down. */
+                       if (*scan1 == *scan2++)
+                               return(count);
+               count++;
+       }
+       return(count);
+}
+#endif
diff --git a/src/tcl/regexp.h b/src/tcl/regexp.h
new file mode 100644 (file)
index 0000000..f6cf369
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Definitions etc. for regexp(3) routines.
+ *
+ * Caveat:  this is V8 regexp(3) [actually, a reimplementation thereof],
+ * not the System V one.
+ */
+
+#ifndef _TCL
+#include "tcl.h"
+#endif
+#ifndef _REGEXP
+#define _REGEXP 1
+
+#define NSUBEXP  10
+typedef struct regexp {
+       char *startp[NSUBEXP];
+       char *endp[NSUBEXP];
+       char regstart;          /* Internal use only. */
+       char reganch;           /* Internal use only. */
+       char *regmust;          /* Internal use only. */
+       int regmlen;            /* Internal use only. */
+       char program[1];        /* Unwarranted chumminess with compiler. */
+} regexp;
+
+extern regexp *regcomp _ANSI_ARGS_((char *exp));
+extern int regexec _ANSI_ARGS_((regexp *prog, char *string));
+extern void regsub _ANSI_ARGS_((regexp *prog, char *source, char *dest));
+extern void regerror _ANSI_ARGS_((char *msg));
+
+#endif /* REGEXP */
diff --git a/src/tcl/tcl.h b/src/tcl/tcl.h
new file mode 100644 (file)
index 0000000..831b872
--- /dev/null
@@ -0,0 +1,340 @@
+/*
+ * tcl.h --
+ *
+ *     This header file describes the externally-visible facilities
+ *     of the Tcl interpreter.
+ *
+ * Copyright 1987-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /user6/ouster/tcl/RCS/tcl.h,v 1.84 92/08/07 08:21:34 ouster Exp $ SPRITE (Berkeley)
+ */
+
+#ifndef _TCL
+#define _TCL
+
+#define TCL_VERSION "6.4"
+
+/*
+ * Definitions that allow this header file to be used either with or
+ * without ANSI C features like function prototypes.
+ */
+
+#undef _ANSI_ARGS_
+#undef const
+#if ((defined(__STDC__) || defined(SABER)) && !defined(NO_PROTOTYPE)) || defined(__cplusplus)
+#   define _ANSI_ARGS_(x)      x
+#   define CONST const
+#   ifdef __cplusplus
+#       define VARARGS (...)
+#   else
+#       define VARARGS ()
+#   endif
+#else
+#   define _ANSI_ARGS_(x)      ()
+#   define CONST
+#endif
+
+#ifdef __cplusplus
+#   define EXTERN extern "C"
+#else
+#   define EXTERN extern
+#endif
+
+/*
+ * Miscellaneous declarations (to allow Tcl to be used stand-alone,
+ * without the rest of Sprite).
+ */
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#ifndef _CLIENTDATA
+typedef int *ClientData;
+#define _CLIENTDATA
+#endif
+
+/*
+ * Data structures defined opaquely in this module.  The definitions
+ * below just provide dummy types.  A few fields are made visible in
+ * Tcl_Interp structures, namely those for returning string values.
+ * Note:  any change to the Tcl_Interp definition below must be mirrored
+ * in the "real" definition in tclInt.h.
+ */
+
+typedef struct Tcl_Interp{
+    char *result;              /* Points to result string returned by last
+                                * command. */
+    void (*freeProc) _ANSI_ARGS_((char *blockPtr));
+                               /* Zero means result is statically allocated.
+                                * If non-zero, gives address of procedure
+                                * to invoke to free the result.  Must be
+                                * freed by Tcl_Eval before executing next
+                                * command. */
+    int errorLine;             /* When TCL_ERROR is returned, this gives
+                                * the line number within the command where
+                                * the error occurred (1 means first line). */
+} Tcl_Interp;
+
+typedef int *Tcl_Trace;
+typedef int *Tcl_CmdBuf;
+
+/*
+ * When a TCL command returns, the string pointer interp->result points to
+ * a string containing return information from the command.  In addition,
+ * the command procedure returns an integer value, which is one of the
+ * following:
+ *
+ * TCL_OK              Command completed normally;  interp->result contains
+ *                     the command's result.
+ * TCL_ERROR           The command couldn't be completed successfully;
+ *                     interp->result describes what went wrong.
+ * TCL_RETURN          The command requests that the current procedure
+ *                     return;  interp->result contains the procedure's
+ *                     return value.
+ * TCL_BREAK           The command requests that the innermost loop
+ *                     be exited;  interp->result is meaningless.
+ * TCL_CONTINUE                Go on to the next iteration of the current loop;
+ *                     interp->result is meaninless.
+ */
+
+#define TCL_OK         0
+#define TCL_ERROR      1
+#define TCL_RETURN     2
+#define TCL_BREAK      3
+#define TCL_CONTINUE   4
+
+#define TCL_RESULT_SIZE 199
+
+/*
+ * Procedure types defined by Tcl:
+ */
+
+typedef void (Tcl_CmdDeleteProc) _ANSI_ARGS_((ClientData clientData));
+typedef int (Tcl_CmdProc) _ANSI_ARGS_((ClientData clientData,
+       Tcl_Interp *interp, int argc, char *argv[]));
+typedef void (Tcl_CmdTraceProc) _ANSI_ARGS_((ClientData clientData,
+       Tcl_Interp *interp, int level, char *command, Tcl_CmdProc *proc,
+       ClientData cmdClientData, int argc, char *argv[]));
+typedef void (Tcl_FreeProc) _ANSI_ARGS_((char *blockPtr));
+typedef char *(Tcl_VarTraceProc) _ANSI_ARGS_((ClientData clientData,
+       Tcl_Interp *interp, char *name1, char *name2, int flags));
+
+/*
+ * Flag values passed to Tcl_Eval (see the man page for details;  also
+ * see tclInt.h for additional flags that are only used internally by
+ * Tcl):
+ */
+
+#define TCL_BRACKET_TERM       1
+
+/*
+ * Flag that may be passed to Tcl_ConvertElement to force it not to
+ * output braces (careful!  if you change this flag be sure to change
+ * the definitions at the front of tclUtil.c).
+ */
+
+#define TCL_DONT_USE_BRACES    1
+
+/*
+ * Flag value passed to Tcl_RecordAndEval to request no evaluation
+ * (record only).
+ */
+
+#define TCL_NO_EVAL            -1
+
+/*
+ * Specil freeProc values that may be passed to Tcl_SetResult (see
+ * the man page for details):
+ */
+
+#define TCL_VOLATILE   ((Tcl_FreeProc *) -1)
+#define TCL_STATIC     ((Tcl_FreeProc *) 0)
+#define TCL_DYNAMIC    ((Tcl_FreeProc *) free)
+
+/*
+ * Flag values passed to variable-related procedures.
+ */
+
+#define TCL_GLOBAL_ONLY                1
+#define TCL_APPEND_VALUE       2
+#define TCL_LIST_ELEMENT       4
+#define TCL_NO_SPACE           8
+#define TCL_TRACE_READS                0x10
+#define TCL_TRACE_WRITES       0x20
+#define TCL_TRACE_UNSETS       0x40
+#define TCL_TRACE_DESTROYED    0x80
+#define TCL_INTERP_DESTROYED   0x100
+#define TCL_LEAVE_ERR_MSG      0x200
+
+/*
+ * Additional flag passed back to variable watchers.  This flag must
+ * not overlap any of the TCL_TRACE_* flags defined above or the
+ * TRACE_* flags defined in tclInt.h.
+ */
+
+#define TCL_VARIABLE_UNDEFINED 8
+
+/*
+ * The following declarations either map ckalloc and ckfree to
+ * malloc and free, or they map them to procedures with all sorts
+ * of debugging hooks defined in tclCkalloc.c.
+ */
+
+#ifdef TCL_MEM_DEBUG
+
+EXTERN char *          Tcl_DbCkalloc _ANSI_ARGS_((unsigned int size,
+                           char *file, int line));
+EXTERN int             Tcl_DbCkfree _ANSI_ARGS_((char *ptr,
+                           char *file, int line));
+#  define ckalloc(x) Tcl_DbCkalloc(x, __FILE__, __LINE__)
+#  define ckfree(x)  Tcl_DbCkfree(x, __FILE__, __LINE__)
+
+#else
+
+#  define ckalloc(x) malloc(x)
+#  define ckfree(x)  free(x)
+
+#endif /* TCL_MEM_DEBUG */
+
+/*
+ * Macro to free up result of interpreter.
+ */
+
+#define Tcl_FreeResult(interp)                                 \
+    if ((interp)->freeProc != 0) {                             \
+       if ((interp)->freeProc == (Tcl_FreeProc *) free) {      \
+           ckfree((interp)->result);                           \
+       } else {                                                \
+           (*(interp)->freeProc)((interp)->result);            \
+       }                                                       \
+       (interp)->freeProc = 0;                                 \
+    }
+
+/*
+ * Exported Tcl procedures:
+ */
+
+EXTERN void            Tcl_AppendElement _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, int noSep));
+EXTERN void            Tcl_AppendResult _ANSI_ARGS_((Tcl_Interp *interp, ...));
+EXTERN char *          Tcl_AssembleCmd _ANSI_ARGS_((Tcl_CmdBuf buffer,
+                           char *string));
+EXTERN void            Tcl_AddErrorInfo _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *message));
+EXTERN char            Tcl_Backslash _ANSI_ARGS_((char *src,
+                           int *readPtr));
+EXTERN char *          Tcl_Concat _ANSI_ARGS_((int argc, char **argv));
+EXTERN int             Tcl_ConvertElement _ANSI_ARGS_((char *src,
+                           char *dst, int flags));
+EXTERN Tcl_CmdBuf      Tcl_CreateCmdBuf _ANSI_ARGS_((void));
+EXTERN void            Tcl_CreateCommand _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *cmdName, Tcl_CmdProc *proc,
+                           ClientData clientData,
+                           Tcl_CmdDeleteProc *deleteProc));
+EXTERN Tcl_Interp *    Tcl_CreateInterp _ANSI_ARGS_((void));
+EXTERN int             Tcl_CreatePipeline _ANSI_ARGS_((Tcl_Interp *interp,
+                           int argc, char **argv, int **pidArrayPtr,
+                           int *inPipePtr, int *outPipePtr,
+                           int *errFilePtr));
+EXTERN Tcl_Trace       Tcl_CreateTrace _ANSI_ARGS_((Tcl_Interp *interp,
+                           int level, Tcl_CmdTraceProc *proc,
+                           ClientData clientData));
+EXTERN void            Tcl_DeleteCmdBuf _ANSI_ARGS_((Tcl_CmdBuf buffer));
+EXTERN int             Tcl_DeleteCommand _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *cmdName));
+EXTERN void            Tcl_DeleteInterp _ANSI_ARGS_((Tcl_Interp *interp));
+EXTERN void            Tcl_DeleteTrace _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tcl_Trace trace));
+EXTERN void            Tcl_DetachPids _ANSI_ARGS_((int numPids, int *pidPtr));
+EXTERN int             Tcl_DumpActiveMemory _ANSI_ARGS_((char *fileName));
+EXTERN char *          Tcl_ErrnoId _ANSI_ARGS_((void));
+EXTERN int             Tcl_Eval _ANSI_ARGS_((Tcl_Interp *interp, char *cmd,
+                           int flags, char **termPtr));
+EXTERN int             Tcl_EvalFile _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *fileName));
+EXTERN int             Tcl_ExprBoolean _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, int *ptr));
+EXTERN int             Tcl_ExprDouble _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, double *ptr));
+EXTERN int             Tcl_ExprLong _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, long *ptr));
+EXTERN int             Tcl_ExprString _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string));
+EXTERN int             Tcl_Fork _ANSI_ARGS_((void));
+EXTERN int             Tcl_GetBoolean _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, int *boolPtr));
+EXTERN int             Tcl_GetDouble _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, double *doublePtr));
+EXTERN int             Tcl_GetInt _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, int *intPtr));
+EXTERN char *          Tcl_GetVar _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *varName, int flags));
+EXTERN char *          Tcl_GetVar2 _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *name1, char *name2, int flags));
+EXTERN int             Tcl_GlobalEval _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *command));
+EXTERN void            Tcl_InitHistory _ANSI_ARGS_((Tcl_Interp *interp));
+EXTERN void            Tcl_InitMemory _ANSI_ARGS_((Tcl_Interp *interp));
+EXTERN char *          Tcl_Merge _ANSI_ARGS_((int argc, char **argv));
+EXTERN char *          Tcl_ParseVar _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, char **termPtr));
+EXTERN int             Tcl_RecordAndEval _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *cmd, int flags));
+EXTERN void            Tcl_ResetResult _ANSI_ARGS_((Tcl_Interp *interp));
+#define Tcl_Return Tcl_SetResult
+EXTERN int             Tcl_ScanElement _ANSI_ARGS_((char *string,
+                           int *flagPtr));
+EXTERN void            Tcl_SetErrorCode _ANSI_ARGS_((Tcl_Interp *interp, ...));
+EXTERN void            Tcl_SetResult _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, Tcl_FreeProc *freeProc));
+EXTERN char *          Tcl_SetVar _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *varName, char *newValue, int flags));
+EXTERN char *          Tcl_SetVar2 _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *name1, char *name2, char *newValue,
+                           int flags));
+EXTERN char *          Tcl_SignalId _ANSI_ARGS_((int sig));
+EXTERN char *          Tcl_SignalMsg _ANSI_ARGS_((int sig));
+EXTERN int             Tcl_SplitList _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *list, int *argcPtr, char ***argvPtr));
+EXTERN int             Tcl_StringMatch _ANSI_ARGS_((char *string,
+                           char *pattern));
+EXTERN char *          Tcl_TildeSubst _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *name));
+EXTERN int             Tcl_TraceVar _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *varName, int flags, Tcl_VarTraceProc *proc,
+                           ClientData clientData));
+EXTERN int             Tcl_TraceVar2 _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *name1, char *name2, int flags,
+                           Tcl_VarTraceProc *proc, ClientData clientData));
+EXTERN char *          Tcl_UnixError _ANSI_ARGS_((Tcl_Interp *interp));
+EXTERN int             Tcl_UnsetVar _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *varName, int flags));
+EXTERN int             Tcl_UnsetVar2 _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *name1, char *name2, int flags));
+EXTERN void            Tcl_UntraceVar _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *varName, int flags, Tcl_VarTraceProc *proc,
+                           ClientData clientData));
+EXTERN void            Tcl_UntraceVar2 _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *name1, char *name2, int flags,
+                           Tcl_VarTraceProc *proc, ClientData clientData));
+EXTERN int             Tcl_VarEval _ANSI_ARGS_((Tcl_Interp *interp, ...));
+EXTERN ClientData      Tcl_VarTraceInfo _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *varName, int flags,
+                           Tcl_VarTraceProc *procPtr,
+                           ClientData prevClientData));
+EXTERN ClientData      Tcl_VarTraceInfo2 _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *name1, char *name2, int flags,
+                           Tcl_VarTraceProc *procPtr,
+                           ClientData prevClientData));
+EXTERN int             Tcl_WaitPids _ANSI_ARGS_((int numPids, int *pidPtr,
+                           int *statusPtr));
+
+#endif /* _TCL */
diff --git a/src/tcl/tclassem.c b/src/tcl/tclassem.c
new file mode 100644 (file)
index 0000000..ed70991
--- /dev/null
@@ -0,0 +1,207 @@
+/* 
+ * tclAssem.c --
+ *
+ *     This file contains procedures to help assemble Tcl commands
+ *     from an input source  where commands may arrive in pieces, e.g.
+ *     several lines of type-in corresponding to one command.
+ *
+ * Copyright 1990-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclAssem.c,v 1.9 92/07/02 09:14:05 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tclint.h"
+
+/*
+ * The structure below is the internal representation for a command
+ * buffer, which is used to hold a piece of a command until a full
+ * command is available.  When a full command is available, it will
+ * be returned to the user, but it will also be retained in the buffer
+ * until the NEXT call to Tcl_AssembleCmd, at which point it will be
+ * removed.
+ */
+
+typedef struct {
+    char *buffer;              /* Storage for command being assembled.
+                                * Malloc-ed, and grows as needed. */
+    int bufSize;               /* Total number of bytes in buffer. */
+    int bytesUsed;             /* Number of bytes in buffer currently
+                                * occupied (0 means there is not a
+                                * buffered incomplete command). */
+} CmdBuf;
+
+/*
+ * Default amount of space to allocate in command buffer:
+ */
+
+#define CMD_BUF_SIZE 100
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_CreateCmdBuf --
+ *
+ *     Allocate and initialize a command buffer.
+ *
+ * Results:
+ *     The return value is a token that may be passed to
+ *     Tcl_AssembleCmd and Tcl_DeleteCmdBuf.
+ *
+ * Side effects:
+ *     Memory is allocated.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Tcl_CmdBuf
+Tcl_CreateCmdBuf()
+{
+    register CmdBuf *cbPtr;
+
+    cbPtr = (CmdBuf *) ckalloc(sizeof(CmdBuf));
+    cbPtr->buffer = (char *) ckalloc(CMD_BUF_SIZE);
+    cbPtr->buffer[0] = '\0';
+    cbPtr->bufSize = CMD_BUF_SIZE;
+    cbPtr->bytesUsed = 0;
+    return (Tcl_CmdBuf) cbPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_DeleteCmdBuf --
+ *
+ *     Release all of the resources associated with a command buffer.
+ *     The caller should never again use buffer again.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Memory is released.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_DeleteCmdBuf(buffer)
+    Tcl_CmdBuf buffer;         /* Token for command buffer (return value
+                                * from previous call to Tcl_CreateCmdBuf). */
+{
+    register CmdBuf *cbPtr = (CmdBuf *) buffer;
+
+    ckfree(cbPtr->buffer);
+    ckfree((char *) cbPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_AssembleCmd --
+ *
+ *     This is a utility procedure to assist in situations where
+ *     commands may be read piece-meal from some input source.  Given
+ *     some input text, it adds the text to an input buffer and returns
+ *     whole commands when they are ready.
+ *
+ * Results:
+ *     If the addition of string to any currently-buffered information
+ *     results in one or more complete Tcl commands, then the return value
+ *     is a pointer to the complete command(s).  The command value will
+ *     only be valid until the next call to this procedure with the
+ *     same buffer.  If the addition of string leaves an incomplete
+ *     command at the end of the buffer, then NULL is returned.
+ *
+ * Side effects:
+ *     If string leaves a command incomplete, the partial command
+ *     information is buffered for use in later calls to this procedure.
+ *     Once a command has been returned, that command is deleted from
+ *     the buffer on the next call to this procedure.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tcl_AssembleCmd(buffer, string)
+    Tcl_CmdBuf buffer;         /* Token for a command buffer previously
+                                * created by Tcl_CreateCmdBuf.  */
+    char *string;              /* Bytes to be appended to command stream.
+                                * Note:  if the string is zero length,
+                                * then whatever is buffered will be
+                                * considered to be a complete command
+                                * regardless of whether parentheses are
+                                * matched or not. */
+{
+    register CmdBuf *cbPtr = (CmdBuf *) buffer;
+    int length, totalLength;
+    register char *p;
+
+    /*
+     * If an empty string is passed in, just pretend the current
+     * command is complete, whether it really is or not.
+     */
+
+    length = strlen(string);
+    if (length == 0) {
+       cbPtr->bytesUsed = 0;
+       return cbPtr->buffer;
+    }
+
+    /*
+     * Add the new information to the buffer.  If the current buffer
+     * isn't large enough, grow it by at least a factor of two, or
+     * enough to hold the new text.
+     */
+
+    length = strlen(string);
+    totalLength = cbPtr->bytesUsed + length + 1;
+    if (totalLength > cbPtr->bufSize) {
+       unsigned int newSize;
+       char *newBuf;
+
+       newSize = cbPtr->bufSize*2;
+       if (newSize < totalLength) {
+           newSize = totalLength;
+       }
+       newBuf = (char *) ckalloc(newSize);
+       strcpy(newBuf, cbPtr->buffer);
+       ckfree(cbPtr->buffer);
+       cbPtr->buffer = newBuf;
+       cbPtr->bufSize = newSize;
+    }
+    strcpy(cbPtr->buffer+cbPtr->bytesUsed, string);
+    cbPtr->bytesUsed += length;
+
+    /*
+     * See if there is now a complete command in the buffer.
+     */
+
+    p = cbPtr->buffer;
+    while (1) {
+       int gotNewLine = 0;
+
+       while (isspace(*p)) {
+           if (*p == '\n') {
+               gotNewLine = 1;
+           }
+           p++;
+       }
+       if (*p == 0) {
+           if (gotNewLine) {
+               cbPtr->bytesUsed = 0;
+               return cbPtr->buffer;
+           }
+           return NULL;
+       }
+       p = TclWordEnd(p, 0);
+    }
+}
diff --git a/src/tcl/tclbasic.c b/src/tcl/tclbasic.c
new file mode 100644 (file)
index 0000000..90a656d
--- /dev/null
@@ -0,0 +1,1063 @@
+/* 
+ * tclBasic.c --
+ *
+ *     Contains the basic facilities for TCL command interpretation,
+ *     including interpreter creation and deletion, command creation
+ *     and deletion, and command parsing and execution.
+ *
+ * Copyright 1987-1992 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclBasic.c,v 1.131 92/06/21 14:09:41 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tclint.h"
+
+/*
+ * The following structure defines all of the commands in the Tcl core,
+ * and the C procedures that execute them.
+ */
+
+typedef struct {
+    char *name;                        /* Name of command. */
+    Tcl_CmdProc *proc;         /* Procedure that executes command. */
+} CmdInfo;
+
+/*
+ * Built-in commands, and the procedures associated with them:
+ */
+
+static CmdInfo builtInCmds[] = {
+    /*
+     * Commands in the generic core:
+     */
+
+    {"append",         Tcl_AppendCmd},
+    {"array",          Tcl_ArrayCmd},
+    {"break",          Tcl_BreakCmd},
+    {"case",           Tcl_CaseCmd},
+    {"catch",          Tcl_CatchCmd},
+    {"concat",         Tcl_ConcatCmd},
+    {"continue",       Tcl_ContinueCmd},
+    {"error",          Tcl_ErrorCmd},
+    {"eval",           Tcl_EvalCmd},
+    {"expr",           Tcl_ExprCmd},
+    {"for",            Tcl_ForCmd},
+    {"foreach",                Tcl_ForeachCmd},
+    {"format",         Tcl_FormatCmd},
+    {"global",         Tcl_GlobalCmd},
+    {"if",             Tcl_IfCmd},
+    {"incr",           Tcl_IncrCmd},
+    {"info",           Tcl_InfoCmd},
+    {"join",           Tcl_JoinCmd},
+    {"lappend",                Tcl_LappendCmd},
+    {"lindex",         Tcl_LindexCmd},
+    {"linsert",                Tcl_LinsertCmd},
+    {"list",           Tcl_ListCmd},
+    {"llength",                Tcl_LlengthCmd},
+    {"lrange",         Tcl_LrangeCmd},
+    {"lreplace",       Tcl_LreplaceCmd},
+    {"lsearch",                Tcl_LsearchCmd},
+    {"lsort",          Tcl_LsortCmd},
+    {"proc",           Tcl_ProcCmd},
+    {"regexp",         Tcl_RegexpCmd},
+    {"regsub",         Tcl_RegsubCmd},
+    {"rename",         Tcl_RenameCmd},
+    {"return",         Tcl_ReturnCmd},
+    {"scan",           Tcl_ScanCmd},
+    {"set",            Tcl_SetCmd},
+    {"split",          Tcl_SplitCmd},
+    {"string",         Tcl_StringCmd},
+    {"trace",          Tcl_TraceCmd},
+    {"unset",          Tcl_UnsetCmd},
+    {"uplevel",                Tcl_UplevelCmd},
+    {"upvar",          Tcl_UpvarCmd},
+    {"while",          Tcl_WhileCmd},
+
+    /*
+     * Commands in the UNIX core:
+     */
+
+#ifndef TCL_GENERIC_ONLY
+    {"cd",             Tcl_CdCmd},
+    {"close",          Tcl_CloseCmd},
+    {"eof",            Tcl_EofCmd},
+    {"exec",           Tcl_ExecCmd},
+    {"exit",           Tcl_ExitCmd},
+    {"file",           Tcl_FileCmd},
+    {"flush",          Tcl_FlushCmd},
+    {"gets",           Tcl_GetsCmd},
+    {"glob",           Tcl_GlobCmd},
+    {"open",           Tcl_OpenCmd},
+    {"puts",           Tcl_PutsCmd},
+    {"pwd",            Tcl_PwdCmd},
+    {"read",           Tcl_ReadCmd},
+    {"seek",           Tcl_SeekCmd},
+    {"source",         Tcl_SourceCmd},
+    {"tell",           Tcl_TellCmd},
+    {"time",           Tcl_TimeCmd},
+#endif /* TCL_GENERIC_ONLY */
+    {NULL,             (Tcl_CmdProc *) NULL}
+};
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_CreateInterp --
+ *
+ *     Create a new TCL command interpreter.
+ *
+ * Results:
+ *     The return value is a token for the interpreter, which may be
+ *     used in calls to procedures like Tcl_CreateCmd, Tcl_Eval, or
+ *     Tcl_DeleteInterp.
+ *
+ * Side effects:
+ *     The command interpreter is initialized with an empty variable
+ *     table and the built-in commands.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Tcl_Interp *
+Tcl_CreateInterp()
+{
+    register Interp *iPtr;
+    register Command *cmdPtr;
+    register CmdInfo *cmdInfoPtr;
+    int i;
+
+    iPtr = (Interp *) ckalloc(sizeof(Interp));
+    iPtr->result = iPtr->resultSpace;
+    iPtr->freeProc = 0;
+    iPtr->errorLine = 0;
+    Tcl_InitHashTable(&iPtr->commandTable, TCL_STRING_KEYS);
+    Tcl_InitHashTable(&iPtr->globalTable, TCL_STRING_KEYS);
+    iPtr->numLevels = 0;
+    iPtr->framePtr = NULL;
+    iPtr->varFramePtr = NULL;
+    iPtr->activeTracePtr = NULL;
+    iPtr->numEvents = 0;
+    iPtr->events = NULL;
+    iPtr->curEvent = 0;
+    iPtr->curEventNum = 0;
+    iPtr->revPtr = NULL;
+    iPtr->historyFirst = NULL;
+    iPtr->revDisables = 1;
+    iPtr->evalFirst = iPtr->evalLast = NULL;
+    iPtr->appendResult = NULL;
+    iPtr->appendAvl = 0;
+    iPtr->appendUsed = 0;
+    iPtr->numFiles = 0;
+    iPtr->filePtrArray = NULL;
+    for (i = 0; i < NUM_REGEXPS; i++) {
+       iPtr->patterns[i] = NULL;
+       iPtr->patLengths[i] = -1;
+       iPtr->regexps[i] = NULL;
+    }
+    iPtr->cmdCount = 0;
+    iPtr->noEval = 0;
+    iPtr->scriptFile = NULL;
+    iPtr->flags = 0;
+    iPtr->tracePtr = NULL;
+    iPtr->resultSpace[0] = 0;
+
+    /*
+     * Create the built-in commands.  Do it here, rather than calling
+     * Tcl_CreateCommand, because it's faster (there's no need to
+     * check for a pre-existing command by the same name).
+     */
+
+    for (cmdInfoPtr = builtInCmds; cmdInfoPtr->name != NULL; cmdInfoPtr++) {
+       int new;
+       Tcl_HashEntry *hPtr;
+
+       hPtr = Tcl_CreateHashEntry(&iPtr->commandTable,
+               cmdInfoPtr->name, &new);
+       if (new) {
+           cmdPtr = (Command *) ckalloc(sizeof(Command));
+           cmdPtr->proc = cmdInfoPtr->proc;
+           cmdPtr->clientData = (ClientData) NULL;
+           cmdPtr->deleteProc = NULL;
+           Tcl_SetHashValue(hPtr, cmdPtr);
+       }
+    }
+
+#ifndef TCL_GENERIC_ONLY
+    TclSetupEnv((Tcl_Interp *) iPtr);
+#endif
+
+    return (Tcl_Interp *) iPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_DeleteInterp --
+ *
+ *     Delete an interpreter and free up all of the resources associated
+ *     with it.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The interpreter is destroyed.  The caller should never again
+ *     use the interp token.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_DeleteInterp(interp)
+    Tcl_Interp *interp;                /* Token for command interpreter (returned
+                                * by a previous call to Tcl_CreateInterp). */
+{
+    Interp *iPtr = (Interp *) interp;
+    Tcl_HashEntry *hPtr;
+    Tcl_HashSearch search;
+    register Command *cmdPtr;
+    int i;
+
+    /*
+     * If the interpreter is in use, delay the deletion until later.
+     */
+
+    iPtr->flags |= DELETED;
+    if (iPtr->numLevels != 0) {
+       return;
+    }
+
+    /*
+     * Free up any remaining resources associated with the
+     * interpreter.
+     */
+
+    for (hPtr = Tcl_FirstHashEntry(&iPtr->commandTable, &search);
+           hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
+       cmdPtr = (Command *) Tcl_GetHashValue(hPtr);
+       if (cmdPtr->deleteProc != NULL) { 
+           (*cmdPtr->deleteProc)(cmdPtr->clientData);
+       }
+       ckfree((char *) cmdPtr);
+    }
+    Tcl_DeleteHashTable(&iPtr->commandTable);
+    TclDeleteVars(iPtr, &iPtr->globalTable);
+    if (iPtr->events != NULL) {
+       int i;
+
+       for (i = 0; i < iPtr->numEvents; i++) {
+           ckfree(iPtr->events[i].command);
+       }
+       ckfree((char *) iPtr->events);
+    }
+    while (iPtr->revPtr != NULL) {
+       HistoryRev *nextPtr = iPtr->revPtr->nextPtr;
+
+       ckfree((char *) iPtr->revPtr);
+       iPtr->revPtr = nextPtr;
+    }
+    if (iPtr->appendResult != NULL) {
+       ckfree(iPtr->appendResult);
+    }
+#ifndef TCL_GENERIC_ONLY
+    if (iPtr->numFiles > 0) {
+       for (i = 0; i < iPtr->numFiles; i++) {
+           OpenFile *filePtr;
+    
+           filePtr = iPtr->filePtrArray[i];
+           if (filePtr == NULL) {
+               continue;
+           }
+           if (i >= 3) {
+               fclose(filePtr->f);
+               if (filePtr->f2 != NULL) {
+                   fclose(filePtr->f2);
+               }
+               if (filePtr->numPids > 0) {
+                   Tcl_DetachPids(filePtr->numPids, filePtr->pidPtr);
+                   ckfree((char *) filePtr->pidPtr);
+               }
+           }
+           ckfree((char *) filePtr);
+       }
+       ckfree((char *) iPtr->filePtrArray);
+    }
+#endif
+    for (i = 0; i < NUM_REGEXPS; i++) {
+       if (iPtr->patterns[i] == NULL) {
+           break;
+       }
+       ckfree(iPtr->patterns[i]);
+       ckfree((char *) iPtr->regexps[i]);
+    }
+    while (iPtr->tracePtr != NULL) {
+       Trace *nextPtr = iPtr->tracePtr->nextPtr;
+
+       ckfree((char *) iPtr->tracePtr);
+       iPtr->tracePtr = nextPtr;
+    }
+    ckfree((char *) iPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_CreateCommand --
+ *
+ *     Define a new command in a command table.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If a command named cmdName already exists for interp, it is
+ *     deleted.  In the future, when cmdName is seen as the name of
+ *     a command by Tcl_Eval, proc will be called.  When the command
+ *     is deleted from the table, deleteProc will be called.  See the
+ *     manual entry for details on the calling sequence.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_CreateCommand(interp, cmdName, proc, clientData, deleteProc)
+    Tcl_Interp *interp;                /* Token for command interpreter (returned
+                                * by a previous call to Tcl_CreateInterp). */
+    char *cmdName;             /* Name of command. */
+    Tcl_CmdProc *proc;         /* Command procedure to associate with
+                                * cmdName. */
+    ClientData clientData;     /* Arbitrary one-word value to pass to proc. */
+    Tcl_CmdDeleteProc *deleteProc;
+                               /* If not NULL, gives a procedure to call when
+                                * this command is deleted. */
+{
+    Interp *iPtr = (Interp *) interp;
+    register Command *cmdPtr;
+    Tcl_HashEntry *hPtr;
+    int new;
+
+    hPtr = Tcl_CreateHashEntry(&iPtr->commandTable, cmdName, &new);
+    if (!new) {
+       /*
+        * Command already exists:  delete the old one.
+        */
+
+       cmdPtr = (Command *) Tcl_GetHashValue(hPtr);
+       if (cmdPtr->deleteProc != NULL) {
+           (*cmdPtr->deleteProc)(cmdPtr->clientData);
+       }
+    } else {
+       cmdPtr = (Command *) ckalloc(sizeof(Command));
+       Tcl_SetHashValue(hPtr, cmdPtr);
+    }
+    cmdPtr->proc = proc;
+    cmdPtr->clientData = clientData;
+    cmdPtr->deleteProc = deleteProc;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_DeleteCommand --
+ *
+ *     Remove the given command from the given interpreter.
+ *
+ * Results:
+ *     0 is returned if the command was deleted successfully.
+ *     -1 is returned if there didn't exist a command by that
+ *     name.
+ *
+ * Side effects:
+ *     CmdName will no longer be recognized as a valid command for
+ *     interp.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_DeleteCommand(interp, cmdName)
+    Tcl_Interp *interp;                /* Token for command interpreter (returned
+                                * by a previous call to Tcl_CreateInterp). */
+    char *cmdName;             /* Name of command to remove. */
+{
+    Interp *iPtr = (Interp *) interp;
+    Tcl_HashEntry *hPtr;
+    Command *cmdPtr;
+
+    hPtr = Tcl_FindHashEntry(&iPtr->commandTable, cmdName);
+    if (hPtr == NULL) {
+       return -1;
+    }
+    cmdPtr = (Command *) Tcl_GetHashValue(hPtr);
+    if (cmdPtr->deleteProc != NULL) {
+       (*cmdPtr->deleteProc)(cmdPtr->clientData);
+    }
+    ckfree((char *) cmdPtr);
+    Tcl_DeleteHashEntry(hPtr);
+    return 0;
+}
+\f
+/*
+ *-----------------------------------------------------------------
+ *
+ * Tcl_Eval --
+ *
+ *     Parse and execute a command in the Tcl language.
+ *
+ * Results:
+ *     The return value is one of the return codes defined in tcl.hd
+ *     (such as TCL_OK), and interp->result contains a string value
+ *     to supplement the return code.  The value of interp->result
+ *     will persist only until the next call to Tcl_Eval:  copy it or
+ *     lose it! *TermPtr is filled in with the character just after
+ *     the last one that was part of the command (usually a NULL
+ *     character or a closing bracket).
+ *
+ * Side effects:
+ *     Almost certainly;  depends on the command.
+ *
+ *-----------------------------------------------------------------
+ */
+
+int
+Tcl_Eval(interp, cmd, flags, termPtr)
+    Tcl_Interp *interp;                /* Token for command interpreter (returned
+                                * by a previous call to Tcl_CreateInterp). */
+    char *cmd;                 /* Pointer to TCL command to interpret. */
+    int flags;                 /* OR-ed combination of flags like
+                                * TCL_BRACKET_TERM and TCL_RECORD_BOUNDS. */
+    char **termPtr;            /* If non-NULL, fill in the address it points
+                                * to with the address of the char. just after
+                                * the last one that was part of cmd.  See
+                                * the man page for details on this. */
+{
+    /*
+     * The storage immediately below is used to generate a copy
+     * of the command, after all argument substitutions.  Pv will
+     * contain the argv values passed to the command procedure.
+     */
+
+#   define NUM_CHARS 200
+    char copyStorage[NUM_CHARS];
+    ParseValue pv;
+    char *oldBuffer;
+
+    /*
+     * This procedure generates an (argv, argc) array for the command,
+     * It starts out with stack-allocated space but uses dynamically-
+     * allocated storage to increase it if needed.
+     */
+
+#   define NUM_ARGS 10
+    char *(argStorage[NUM_ARGS]);
+    char **argv = argStorage;
+    int argc;
+    int argSize = NUM_ARGS;
+
+    register char *src;                        /* Points to current character
+                                        * in cmd. */
+    char termChar;                     /* Return when this character is found
+                                        * (either ']' or '\0').  Zero means
+                                        * that newlines terminate commands. */
+    int result;                                /* Return value. */
+    register Interp *iPtr = (Interp *) interp;
+    Tcl_HashEntry *hPtr;
+    Command *cmdPtr;
+    char *dummy;                       /* Make termPtr point here if it was
+                                        * originally NULL. */
+    char *cmdStart;                    /* Points to first non-blank char. in
+                                        * command (used in calling trace
+                                        * procedures). */
+    char *ellipsis = "";               /* Used in setting errorInfo variable;
+                                        * set to "..." to indicate that not
+                                        * all of offending command is included
+                                        * in errorInfo.  "" means that the
+                                        * command is all there. */
+    register Trace *tracePtr;
+
+    /*
+     * Initialize the result to an empty string and clear out any
+     * error information.  This makes sure that we return an empty
+     * result if there are no commands in the command string.
+     */
+
+    Tcl_FreeResult((Tcl_Interp *) iPtr);
+    iPtr->result = iPtr->resultSpace;
+    iPtr->resultSpace[0] = 0;
+    result = TCL_OK;
+
+    /*
+     * Check depth of nested calls to Tcl_Eval:  if this gets too large,
+     * it's probably because of an infinite loop somewhere.
+     */
+
+    iPtr->numLevels++;
+    if (iPtr->numLevels > MAX_NESTING_DEPTH) {
+       iPtr->numLevels--;
+       iPtr->result =  "too many nested calls to Tcl_Eval (infinite loop?)";
+       return TCL_ERROR;
+    }
+
+    /*
+     * Initialize the area in which command copies will be assembled.
+     */
+
+    pv.buffer = copyStorage;
+    pv.end = copyStorage + NUM_CHARS - 1;
+    pv.expandProc = TclExpandParseValue;
+    pv.clientData = (ClientData) NULL;
+
+    src = cmd;
+    if (flags & TCL_BRACKET_TERM) {
+       termChar = ']';
+    } else {
+       termChar = 0;
+    }
+    if (termPtr == NULL) {
+       termPtr = &dummy;
+    }
+    *termPtr = src;
+    cmdStart = src;
+
+    /*
+     * There can be many sub-commands (separated by semi-colons or
+     * newlines) in one command string.  This outer loop iterates over
+     * individual commands.
+     */
+
+    while (*src != termChar) {
+       iPtr->flags &= ~(ERR_IN_PROGRESS | ERROR_CODE_SET);
+
+       /*
+        * Skim off leading white space and semi-colons, and skip
+        * comments.
+        */
+
+       while (1) {
+           register char c = *src;
+
+           if ((CHAR_TYPE(c) != TCL_SPACE) && (c != ';') && (c != '\n')) {
+               break;
+           }
+           src += 1;
+       }
+       if (*src == '#') {
+           for (src++; *src != 0; src++) {
+               if (*src == '\n') {
+                   src++;
+                   break;
+               }
+           }
+           continue;
+       }
+       cmdStart = src;
+
+       /*
+        * Parse the words of the command, generating the argc and
+        * argv for the command procedure.  May have to call
+        * TclParseWords several times, expanding the argv array
+        * between calls.
+        */
+
+       pv.next = oldBuffer = pv.buffer;
+       argc = 0;
+       while (1) {
+           int newArgs, maxArgs;
+           char **newArgv;
+           int i;
+
+           /*
+            * Note:  the "- 2" below guarantees that we won't use the
+            * last two argv slots here.  One is for a NULL pointer to
+            * mark the end of the list, and the other is to leave room
+            * for inserting the command name "unknown" as the first
+            * argument (see below).
+            */
+
+           maxArgs = argSize - argc - 2;
+           result = TclParseWords((Tcl_Interp *) iPtr, src, flags,
+                   maxArgs, termPtr, &newArgs, &argv[argc], &pv);
+           src = *termPtr;
+           if (result != TCL_OK) {
+               ellipsis = "...";
+               goto done;
+           }
+
+           /*
+            * Careful!  Buffer space may have gotten reallocated while
+            * parsing words.  If this happened, be sure to update all
+            * of the older argv pointers to refer to the new space.
+            */
+
+           if (oldBuffer != pv.buffer) {
+               int i;
+
+               for (i = 0; i < argc; i++) {
+                   argv[i] = pv.buffer + (argv[i] - oldBuffer);
+               }
+               oldBuffer = pv.buffer;
+           }
+           argc += newArgs;
+           if (newArgs < maxArgs) {
+               argv[argc] = (char *) NULL;
+               break;
+           }
+
+           /*
+            * Args didn't all fit in the current array.  Make it bigger.
+            */
+
+           argSize *= 2;
+           newArgv = (char **)
+                   ckalloc((unsigned) argSize * sizeof(char *));
+           for (i = 0; i < argc; i++) {
+               newArgv[i] = argv[i];
+           }
+           if (argv != argStorage) {
+               ckfree((char *) argv);
+           }
+           argv = newArgv;
+       }
+
+       /*
+        * If this is an empty command (or if we're just parsing
+        * commands without evaluating them), then just skip to the
+        * next command.
+        */
+
+       if ((argc == 0) || iPtr->noEval) {
+           continue;
+       }
+       argv[argc] = NULL;
+
+       /*
+        * Save information for the history module, if needed.
+        */
+
+       if (flags & TCL_RECORD_BOUNDS) {
+           iPtr->evalFirst = cmdStart;
+           iPtr->evalLast = src-1;
+       }
+
+       /*
+        * Find the procedure to execute this command.  If there isn't
+        * one, then see if there is a command "unknown".  If so,
+        * invoke it instead, passing it the words of the original
+        * command as arguments.
+        */
+
+       hPtr = Tcl_FindHashEntry(&iPtr->commandTable, argv[0]);
+       if (hPtr == NULL) {
+           int i;
+
+           hPtr = Tcl_FindHashEntry(&iPtr->commandTable, "unknown");
+           if (hPtr == NULL) {
+               Tcl_ResetResult(interp);
+               Tcl_AppendResult(interp, "invalid command name: \"",
+                       argv[0], "\"", (char *) NULL);
+               result = TCL_ERROR;
+               goto done;
+           }
+           for (i = argc; i >= 0; i--) {
+               argv[i+1] = argv[i];
+           }
+           argv[0] = "unknown";
+           argc++;
+       }
+       cmdPtr = (Command *) Tcl_GetHashValue(hPtr);
+
+       /*
+        * Call trace procedures, if any.
+        */
+
+       for (tracePtr = iPtr->tracePtr; tracePtr != NULL;
+               tracePtr = tracePtr->nextPtr) {
+           char saved;
+
+           if (tracePtr->level < iPtr->numLevels) {
+               continue;
+           }
+           saved = *src;
+           *src = 0;
+           (*tracePtr->proc)(tracePtr->clientData, interp, iPtr->numLevels,
+                   cmdStart, cmdPtr->proc, cmdPtr->clientData, argc, argv);
+           *src = saved;
+       }
+
+       /*
+        * At long last, invoke the command procedure.  Reset the
+        * result to its default empty value first (it could have
+        * gotten changed by earlier commands in the same command
+        * string).
+        */
+
+       iPtr->cmdCount++;
+       Tcl_FreeResult(iPtr);
+       iPtr->result = iPtr->resultSpace;
+       iPtr->resultSpace[0] = 0;
+       result = (*cmdPtr->proc)(cmdPtr->clientData, interp, argc, argv);
+       if (result != TCL_OK) {
+           break;
+       }
+    }
+
+    /*
+     * Free up any extra resources that were allocated.
+     */
+
+    done:
+    if (pv.buffer != copyStorage) {
+       ckfree((char *) pv.buffer);
+    }
+    if (argv != argStorage) {
+       ckfree((char *) argv);
+    }
+    iPtr->numLevels--;
+    if (iPtr->numLevels == 0) {
+       if (result == TCL_RETURN) {
+           result = TCL_OK;
+       }
+       if ((result != TCL_OK) && (result != TCL_ERROR)) {
+           Tcl_ResetResult(interp);
+           if (result == TCL_BREAK) {
+               iPtr->result = "invoked \"break\" outside of a loop";
+           } else if (result == TCL_CONTINUE) {
+               iPtr->result = "invoked \"continue\" outside of a loop";
+           } else {
+               iPtr->result = iPtr->resultSpace;
+               sprintf(iPtr->resultSpace, "command returned bad code: %d",
+                       result);
+           }
+           result = TCL_ERROR;
+       }
+       if (iPtr->flags & DELETED) {
+           Tcl_DeleteInterp(interp);
+       }
+    }
+
+    /*
+     * If an error occurred, record information about what was being
+     * executed when the error occurred.
+     */
+
+    if ((result == TCL_ERROR) && !(iPtr->flags & ERR_ALREADY_LOGGED)) {
+       int numChars;
+       register char *p;
+
+       /*
+        * Compute the line number where the error occurred.
+        */
+
+       iPtr->errorLine = 1;
+       for (p = cmd; p != cmdStart; p++) {
+           if (*p == '\n') {
+               iPtr->errorLine++;
+           }
+       }
+       for ( ; isspace(*p) || (*p == ';'); p++) {
+           if (*p == '\n') {
+               iPtr->errorLine++;
+           }
+       }
+
+       /*
+        * Figure out how much of the command to print in the error
+        * message (up to a certain number of characters, or up to
+        * the first new-line).
+        */
+
+       numChars = src - cmdStart;
+       if (numChars > (NUM_CHARS-50)) {
+           numChars = NUM_CHARS-50;
+           ellipsis = " ...";
+       }
+
+       if (!(iPtr->flags & ERR_IN_PROGRESS)) {
+           sprintf(copyStorage, "\n    while executing\n\"%.*s%s\"",
+                   numChars, cmdStart, ellipsis);
+       } else {
+           sprintf(copyStorage, "\n    invoked from within\n\"%.*s%s\"",
+                   numChars, cmdStart, ellipsis);
+       }
+       Tcl_AddErrorInfo(interp, copyStorage);
+       iPtr->flags &= ~ERR_ALREADY_LOGGED;
+    } else {
+       iPtr->flags &= ~ERR_ALREADY_LOGGED;
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_CreateTrace --
+ *
+ *     Arrange for a procedure to be called to trace command execution.
+ *
+ * Results:
+ *     The return value is a token for the trace, which may be passed
+ *     to Tcl_DeleteTrace to eliminate the trace.
+ *
+ * Side effects:
+ *     From now on, proc will be called just before a command procedure
+ *     is called to execute a Tcl command.  Calls to proc will have the
+ *     following form:
+ *
+ *     void
+ *     proc(clientData, interp, level, command, cmdProc, cmdClientData,
+ *             argc, argv)
+ *         ClientData clientData;
+ *         Tcl_Interp *interp;
+ *         int level;
+ *         char *command;
+ *         int (*cmdProc)();
+ *         ClientData cmdClientData;
+ *         int argc;
+ *         char **argv;
+ *     {
+ *     }
+ *
+ *     The clientData and interp arguments to proc will be the same
+ *     as the corresponding arguments to this procedure.  Level gives
+ *     the nesting level of command interpretation for this interpreter
+ *     (0 corresponds to top level).  Command gives the ASCII text of
+ *     the raw command, cmdProc and cmdClientData give the procedure that
+ *     will be called to process the command and the ClientData value it
+ *     will receive, and argc and argv give the arguments to the
+ *     command, after any argument parsing and substitution.  Proc
+ *     does not return a value.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Tcl_Trace
+Tcl_CreateTrace(interp, level, proc, clientData)
+    Tcl_Interp *interp;                /* Interpreter in which to create the trace. */
+    int level;                 /* Only call proc for commands at nesting level
+                                * <= level (1 => top level). */
+    Tcl_CmdTraceProc *proc;    /* Procedure to call before executing each
+                                * command. */
+    ClientData clientData;     /* Arbitrary one-word value to pass to proc. */
+{
+    register Trace *tracePtr;
+    register Interp *iPtr = (Interp *) interp;
+
+    tracePtr = (Trace *) ckalloc(sizeof(Trace));
+    tracePtr->level = level;
+    tracePtr->proc = proc;
+    tracePtr->clientData = clientData;
+    tracePtr->nextPtr = iPtr->tracePtr;
+    iPtr->tracePtr = tracePtr;
+
+    return (Tcl_Trace) tracePtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_DeleteTrace --
+ *
+ *     Remove a trace.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     From now on there will be no more calls to the procedure given
+ *     in trace.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_DeleteTrace(interp, trace)
+    Tcl_Interp *interp;                /* Interpreter that contains trace. */
+    Tcl_Trace trace;           /* Token for trace (returned previously by
+                                * Tcl_CreateTrace). */
+{
+    register Interp *iPtr = (Interp *) interp;
+    register Trace *tracePtr = (Trace *) trace;
+    register Trace *tracePtr2;
+
+    if (iPtr->tracePtr == tracePtr) {
+       iPtr->tracePtr = tracePtr->nextPtr;
+       ckfree((char *) tracePtr);
+    } else {
+       for (tracePtr2 = iPtr->tracePtr; tracePtr2 != NULL;
+               tracePtr2 = tracePtr2->nextPtr) {
+           if (tracePtr2->nextPtr == tracePtr) {
+               tracePtr2->nextPtr = tracePtr->nextPtr;
+               ckfree((char *) tracePtr);
+               return;
+           }
+       }
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_AddErrorInfo --
+ *
+ *     Add information to a message being accumulated that describes
+ *     the current error.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The contents of message are added to the "errorInfo" variable.
+ *     If Tcl_Eval has been called since the current value of errorInfo
+ *     was set, errorInfo is cleared before adding the new message.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_AddErrorInfo(interp, message)
+    Tcl_Interp *interp;                /* Interpreter to which error information
+                                * pertains. */
+    char *message;             /* Message to record. */
+{
+    register Interp *iPtr = (Interp *) interp;
+
+    /*
+     * If an error is already being logged, then the new errorInfo
+     * is the concatenation of the old info and the new message.
+     * If this is the first piece of info for the error, then the
+     * new errorInfo is the concatenation of the message in
+     * interp->result and the new message.
+     */
+
+    if (!(iPtr->flags & ERR_IN_PROGRESS)) {
+       Tcl_SetVar2(interp, "errorInfo", (char *) NULL, interp->result,
+               TCL_GLOBAL_ONLY);
+       iPtr->flags |= ERR_IN_PROGRESS;
+
+       /*
+        * If the errorCode variable wasn't set by the code that generated
+        * the error, set it to "NONE".
+        */
+
+       if (!(iPtr->flags & ERROR_CODE_SET)) {
+           (void) Tcl_SetVar2(interp, "errorCode", (char *) NULL, "NONE",
+                   TCL_GLOBAL_ONLY);
+       }
+    }
+    Tcl_SetVar2(interp, "errorInfo", (char *) NULL, message,
+           TCL_GLOBAL_ONLY|TCL_APPEND_VALUE);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_VarEval --
+ *
+ *     Given a variable number of string arguments, concatenate them
+ *     all together and execute the result as a Tcl command.
+ *
+ * Results:
+ *     A standard Tcl return result.  An error message or other
+ *     result may be left in interp->result.
+ *
+ * Side effects:
+ *     Depends on what was done by the command.
+ *
+ *----------------------------------------------------------------------
+ */
+int
+Tcl_VarEval(Tcl_Interp *interp, ...)
+{
+    va_list argList;
+#define FIXED_SIZE 200
+    char fixedSpace[FIXED_SIZE+1];
+    int spaceAvl, spaceUsed, length;
+    char *string, *cmd;
+    int result;
+
+    /*
+     * Copy the strings one after the other into a single larger
+     * string.  Use stack-allocated space for small commands, but if
+     * the commands gets too large than call ckalloc to create the
+     * space.
+     */
+
+    va_start(argList, interp);
+    spaceAvl = FIXED_SIZE;
+    spaceUsed = 0;
+    cmd = fixedSpace;
+    while (1) {
+       string = va_arg(argList, char *);
+       if (string == NULL) {
+           break;
+       }
+       length = strlen(string);
+       if ((spaceUsed + length) > spaceAvl) {
+           char *new;
+
+           spaceAvl = spaceUsed + length;
+           spaceAvl += spaceAvl/2;
+           new = ckalloc((unsigned) spaceAvl);
+           memcpy((VOID *) new, (VOID *) cmd, spaceUsed);
+           if (cmd != fixedSpace) {
+               ckfree(cmd);
+           }
+           cmd = new;
+       }
+       strcpy(cmd + spaceUsed, string);
+       spaceUsed += length;
+    }
+    va_end(argList);
+    cmd[spaceUsed] = '\0';
+
+    result = Tcl_Eval(interp, cmd, 0, (char **) NULL);
+    if (cmd != fixedSpace) {
+       ckfree(cmd);
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_GlobalEval --
+ *
+ *     Evaluate a command at global level in an interpreter.
+ *
+ * Results:
+ *     A standard Tcl result is returned, and interp->result is
+ *     modified accordingly.
+ *
+ * Side effects:
+ *     The command string is executed in interp, and the execution
+ *     is carried out in the variable context of global level (no
+ *     procedures active), just as if an "uplevel #0" command were
+ *     being executed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_GlobalEval(interp, command)
+    Tcl_Interp *interp;                /* Interpreter in which to evaluate command. */
+    char *command;             /* Command to evaluate. */
+{
+    register Interp *iPtr = (Interp *) interp;
+    int result;
+    CallFrame *savedVarFramePtr;
+
+    savedVarFramePtr = iPtr->varFramePtr;
+    iPtr->varFramePtr = NULL;
+    result = Tcl_Eval(interp, command, 0, (char **) NULL);
+    iPtr->varFramePtr = savedVarFramePtr;
+    return result;
+}
diff --git a/src/tcl/tclckall.c b/src/tcl/tclckall.c
new file mode 100644 (file)
index 0000000..037d42d
--- /dev/null
@@ -0,0 +1,533 @@
+/* 
+ * tclCkalloc.c --
+ *    Interface to malloc and free that provides support for debugging problems
+ *    involving overwritten, double freeing memory and loss of memory.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * This code contributed by Karl Lehenbauer and Mark Diekhans
+ *
+ */
+
+#include "tclint.h"
+
+#define FALSE  0
+#define TRUE   1
+
+#ifdef TCL_MEM_DEBUG
+#ifndef TCL_GENERIC_ONLY
+#include "tclunix.h"
+#endif
+
+#define GUARD_SIZE 8
+
+struct mem_header {
+        long               length;
+        char              *file;
+        int                line;
+        struct mem_header *flink;
+        struct mem_header *blink;
+        unsigned char      low_guard[GUARD_SIZE];
+        char               body[1];
+};
+
+static struct mem_header *allocHead = NULL;  /* List of allocated structures */
+
+#define GUARD_VALUE  0341
+
+/* static char high_guard[] = {0x89, 0xab, 0xcd, 0xef}; */
+
+static int total_mallocs = 0;
+static int total_frees = 0;
+static int current_bytes_malloced = 0;
+static int maximum_bytes_malloced = 0;
+static int current_malloc_packets = 0;
+static int maximum_malloc_packets = 0;
+static int break_on_malloc = 0;
+static int trace_on_at_malloc = 0;
+static int  alloc_tracing = FALSE;
+static int  init_malloced_bodies = FALSE;
+#ifdef MEM_VALIDATE
+    static int  validate_memory = TRUE;
+#else
+    static int  validate_memory = FALSE;
+#endif
+
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * dump_memory_info --
+ *     Display the global memory management statistics.
+ *
+ *----------------------------------------------------------------------
+ */
+static void
+dump_memory_info(outFile) 
+    FILE *outFile;
+{
+        fprintf(outFile,"total mallocs             %10d\n", 
+                total_mallocs);
+        fprintf(outFile,"total frees               %10d\n", 
+                total_frees);
+        fprintf(outFile,"current packets allocated %10d\n", 
+                current_malloc_packets);
+        fprintf(outFile,"current bytes allocated   %10d\n", 
+                current_bytes_malloced);
+        fprintf(outFile,"maximum packets allocated %10d\n", 
+                maximum_malloc_packets);
+        fprintf(outFile,"maximum bytes allocated   %10d\n", 
+                maximum_bytes_malloced);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ValidateMemory --
+ *     Procedure to validate allocted memory guard zones.
+ *
+ *----------------------------------------------------------------------
+ */
+static void
+ValidateMemory (memHeaderP, file, line, nukeGuards)
+    struct mem_header *memHeaderP;
+    char              *file;
+    int                line;
+    int                nukeGuards;
+{
+    unsigned char *hiPtr;
+    int   idx;
+    int   guard_failed = FALSE;
+
+    for (idx = 0; idx < GUARD_SIZE; idx++)
+        if (*(memHeaderP->low_guard + idx) != GUARD_VALUE) {
+            guard_failed = TRUE;
+            fflush (stdout);
+            fprintf(stderr, "low guard byte %d is 0x%x\n", idx, 
+                    *(memHeaderP->low_guard + idx) & 0xff);
+        }
+
+    if (guard_failed) {
+        dump_memory_info (stderr);
+        fprintf (stderr, "low guard failed at %lx, %s %d\n",
+                 memHeaderP->body, file, line);
+        fflush (stderr);  /* In case name pointer is bad. */
+        fprintf (stderr, "Allocated at (%s %d)\n", memHeaderP->file,
+                 memHeaderP->line);
+        panic ("Memory validation failure");
+    }
+
+    hiPtr = (unsigned char *)memHeaderP->body + memHeaderP->length;
+    for (idx = 0; idx < GUARD_SIZE; idx++)
+        if (*(hiPtr + idx) != GUARD_VALUE) {
+            guard_failed = TRUE;
+            fflush (stdout);
+            fprintf(stderr, "hi guard byte %d is 0x%x\n", idx, 
+                    *(hiPtr+idx) & 0xff);
+        }
+
+    if (guard_failed) {
+        dump_memory_info (stderr);
+        fprintf (stderr, "high guard failed at %lx, %s %d\n",
+                 memHeaderP->body, file, line);
+        fflush (stderr);  /* In case name pointer is bad. */
+        fprintf (stderr, "Allocated at (%s %d)\n", memHeaderP->file,
+                 memHeaderP->line);
+        panic ("Memory validation failure");
+    }
+
+    if (nukeGuards) {
+        memset ((char *) memHeaderP->low_guard, 0, GUARD_SIZE); 
+        memset ((char *) hiPtr, 0, GUARD_SIZE); 
+    }
+
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ValidateAllMemory --
+ *     Validates guard regions for all allocated memory.
+ *
+ *----------------------------------------------------------------------
+ */
+void
+Tcl_ValidateAllMemory (file, line)
+    char  *file;
+    int    line;
+{
+    struct mem_header *memScanP;
+
+    for (memScanP = allocHead; memScanP != NULL; memScanP = memScanP->flink)
+        ValidateMemory (memScanP, file, line, FALSE);
+
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_DumpActiveMemory --
+ *     Displays all allocated memory to stderr.
+ *
+ * Results:
+ *     Return TCL_ERROR if an error accessing the file occures, `errno' 
+ *     will have the file error number left in it.
+ *----------------------------------------------------------------------
+ */
+int
+Tcl_DumpActiveMemory (fileName)
+    char *fileName;
+{
+    FILE              *fileP;
+    struct mem_header *memScanP;
+    char              *address;
+
+#ifdef MSDOS
+    fileP = fopen (fileName, "wb");
+#else
+    fileP = fopen (fileName, "w");
+#endif
+    if (fileP == NULL)
+        return TCL_ERROR;
+
+    for (memScanP = allocHead; memScanP != NULL; memScanP = memScanP->flink) {
+        address = &memScanP->body [0];
+        fprintf (fileP, "%8lx - %8lx  %7d @ %s %d\n", address,
+                 address + memScanP->length - 1, memScanP->length,
+                 memScanP->file, memScanP->line);
+    }
+    fclose (fileP);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_DbCkalloc - debugging ckalloc
+ *
+ *        Allocate the requested amount of space plus some extra for
+ *        guard bands at both ends of the request, plus a size, panicing 
+ *        if there isn't enough space, then write in the guard bands
+ *        and return the address of the space in the middle that the
+ *        user asked for.
+ *
+ *        The second and third arguments are file and line, these contain
+ *        the filename and line number corresponding to the caller.
+ *        These are sent by the ckalloc macro; it uses the preprocessor
+ *        autodefines __FILE__ and __LINE__.
+ *
+ *----------------------------------------------------------------------
+ */
+char *
+Tcl_DbCkalloc(size, file, line)
+    unsigned int size;
+    char        *file;
+    int          line;
+{
+    struct mem_header *result;
+
+    if (validate_memory)
+        Tcl_ValidateAllMemory (file, line);
+
+    result = (struct mem_header *)malloc((unsigned)size + 
+                              sizeof(struct mem_header) + GUARD_SIZE);
+    if (result == NULL) {
+        fflush(stdout);
+        dump_memory_info(stderr);
+        panic("unable to alloc %d bytes, %s line %d", size, file, 
+              line);
+    }
+
+    /*
+     * Fill in guard zones and size.  Link into allocated list.
+     */
+    result->length = size;
+    result->file = file;
+    result->line = line;
+    memset ((char *) result->low_guard, GUARD_VALUE, GUARD_SIZE);
+    memset (result->body + size, GUARD_VALUE, GUARD_SIZE);
+    result->flink = allocHead;
+    result->blink = NULL;
+    if (allocHead != NULL)
+        allocHead->blink = result;
+    allocHead = result;
+
+    total_mallocs++;
+    if (trace_on_at_malloc && (total_mallocs >= trace_on_at_malloc)) {
+        (void) fflush(stdout);
+        fprintf(stderr, "reached malloc trace enable point (%d)\n",
+                total_mallocs);
+        fflush(stderr);
+        alloc_tracing = TRUE;
+        trace_on_at_malloc = 0;
+    }
+
+    if (alloc_tracing)
+        fprintf(stderr,"ckalloc %lx %d %s %d\n", result->body, size, 
+                file, line);
+
+    if (break_on_malloc && (total_mallocs >= break_on_malloc)) {
+        break_on_malloc = 0;
+        (void) fflush(stdout);
+        fprintf(stderr,"reached malloc break limit (%d)\n", 
+                total_mallocs);
+        fprintf(stderr, "program will now enter C debugger\n");
+        (void) fflush(stderr);
+        kill (getpid(), SIGINT);
+    }
+
+    current_malloc_packets++;
+    if (current_malloc_packets > maximum_malloc_packets)
+        maximum_malloc_packets = current_malloc_packets;
+    current_bytes_malloced += size;
+    if (current_bytes_malloced > maximum_bytes_malloced)
+        maximum_bytes_malloced = current_bytes_malloced;
+
+    if (init_malloced_bodies)
+        memset (result->body, 0xff, (int) size);
+
+    return result->body;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_DbCkfree - debugging ckfree
+ *
+ *        Verify that the low and high guards are intact, and if so
+ *        then free the buffer else panic.
+ *
+ *        The guards are erased after being checked to catch duplicate
+ *        frees.
+ *
+ *        The second and third arguments are file and line, these contain
+ *        the filename and line number corresponding to the caller.
+ *        These are sent by the ckfree macro; it uses the preprocessor
+ *        autodefines __FILE__ and __LINE__.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_DbCkfree(ptr, file, line)
+    char *  ptr;
+    char     *file;
+    int       line;
+{
+    struct mem_header *memp = 0;  /* Must be zero for size calc */
+
+    /*
+     * Since header ptr is zero, body offset will be size
+     */
+    memp = (struct mem_header *)(((char *) ptr) - (int)memp->body);
+
+    if (alloc_tracing)
+        fprintf(stderr, "ckfree %lx %ld %s %d\n", memp->body, 
+                memp->length, file, line);
+
+    if (validate_memory)
+        Tcl_ValidateAllMemory (file, line);
+
+    ValidateMemory (memp, file, line, TRUE);
+
+    total_frees++;
+    current_malloc_packets--;
+    current_bytes_malloced -= memp->length;
+
+    /*
+     * Delink from allocated list
+     */
+    if (memp->flink != NULL)
+        memp->flink->blink = memp->blink;
+    if (memp->blink != NULL)
+        memp->blink->flink = memp->flink;
+    if (allocHead == memp)
+        allocHead = memp->flink;
+    free((char *) memp);
+    return 0;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * MemoryCmd --
+ *     Implements the TCL memory command:
+ *       memory info
+ *       memory display
+ *       break_on_malloc count
+ *       trace_on_at_malloc count
+ *       trace on|off
+ *       validate on|off
+ *
+ * Results:
+ *     Standard TCL results.
+ *
+ *----------------------------------------------------------------------
+ */
+       /* ARGSUSED */
+static int
+MemoryCmd (clientData, interp, argc, argv)
+    char       *clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    char *fileName;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args:  should be \"",
+               argv[0], " option [args..]\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if (strcmp(argv[1],"trace") == 0) {
+        if (argc != 3) 
+            goto bad_suboption;
+        alloc_tracing = (strcmp(argv[2],"on") == 0);
+        return TCL_OK;
+    }
+    if (strcmp(argv[1],"init") == 0) {
+        if (argc != 3)
+            goto bad_suboption;
+        init_malloced_bodies = (strcmp(argv[2],"on") == 0);
+        return TCL_OK;
+    }
+    if (strcmp(argv[1],"validate") == 0) {
+        if (argc != 3)
+             goto bad_suboption;
+        validate_memory = (strcmp(argv[2],"on") == 0);
+        return TCL_OK;
+    }
+    if (strcmp(argv[1],"trace_on_at_malloc") == 0) {
+        if (argc != 3) 
+            goto argError;
+        if (Tcl_GetInt(interp, argv[2], &trace_on_at_malloc) != TCL_OK)
+                return TCL_ERROR;
+         return TCL_OK;
+    }
+    if (strcmp(argv[1],"break_on_malloc") == 0) {
+        if (argc != 3) 
+            goto argError;
+        if (Tcl_GetInt(interp, argv[2], &break_on_malloc) != TCL_OK)
+                return TCL_ERROR;
+        return TCL_OK;
+    }
+
+    if (strcmp(argv[1],"info") == 0) {
+        dump_memory_info(stdout);
+        return TCL_OK;
+    }
+    if (strcmp(argv[1],"active") == 0) {
+        if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args:  should be \"",
+                   argv[0], " active file", (char *) NULL);
+           return TCL_ERROR;
+       }
+        fileName = argv [2];
+        if (fileName [0] == '~')
+            if ((fileName = Tcl_TildeSubst (interp, fileName)) == NULL)
+                return TCL_ERROR;
+        if (Tcl_DumpActiveMemory (fileName) != TCL_OK) {
+           Tcl_AppendResult(interp, "error accessing ", argv[2], 
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       return TCL_OK;
+    }
+    Tcl_AppendResult(interp, "bad option \"", argv[1],
+           "\":  should be info, init, active, break_on_malloc, ",
+           "trace_on_at_malloc, trace, or validate", (char *) NULL);
+    return TCL_ERROR;
+
+argError:
+    Tcl_AppendResult(interp, "wrong # args:  should be \"", argv[0],
+           " ", argv[1], "count\"", (char *) NULL);
+    return TCL_ERROR;
+
+bad_suboption:
+    Tcl_AppendResult(interp, "wrong # args:  should be \"", argv[0],
+           " ", argv[1], " on|off\"", (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_InitMemory --
+ *     Initialize the memory command.
+ *
+ *----------------------------------------------------------------------
+ */
+void
+Tcl_InitMemory(interp)
+    Tcl_Interp *interp;
+{
+Tcl_CreateCommand (interp, "memory", MemoryCmd, (ClientData)NULL, 
+                  (void (*)())NULL);
+}
+
+#else
+
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_Ckalloc --
+ *     Interface to malloc when TCL_MEM_DEBUG is disabled.  It does check
+ *     that memory was actually allocated.
+ *
+ *----------------------------------------------------------------------
+ */
+VOID *
+Tcl_Ckalloc (size)
+    unsigned int size;
+{
+        char *result;
+
+        result = malloc(size);
+        if (result == NULL) 
+                panic("unable to alloc %d bytes", size);
+        return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TckCkfree --
+ *     Interface to free when TCL_MEM_DEBUG is disabled.  Done here rather
+ *     in the macro to keep some modules from being compiled with 
+ *     TCL_MEM_DEBUG enabled and some with it disabled.
+ *
+ *----------------------------------------------------------------------
+ */
+void
+Tcl_Ckfree (ptr)
+    VOID *ptr;
+{
+        free (ptr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_InitMemory --
+ *     Dummy initialization for memory command, which is only available 
+ *     if TCL_MEM_DEBUG is on.
+ *
+ *----------------------------------------------------------------------
+ */
+       /* ARGSUSED */
+void
+Tcl_InitMemory(interp)
+    Tcl_Interp *interp;
+{
+}
+
+#endif
diff --git a/src/tcl/tclcmdah.c b/src/tcl/tclcmdah.c
new file mode 100644 (file)
index 0000000..d1bf65f
--- /dev/null
@@ -0,0 +1,913 @@
+/* 
+ * tclCmdAH.c --
+ *
+ *     This file contains the top-level command routines for most of
+ *     the Tcl built-in commands whose names begin with the letters
+ *     A to H.
+ *
+ * Copyright 1987-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclCmdAH.c,v 1.76 92/07/06 09:49:41 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tclint.h"
+
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_BreakCmd --
+ *
+ *     This procedure is invoked to process the "break" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_BreakCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    if (argc != 1) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_BREAK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_CaseCmd --
+ *
+ *     This procedure is invoked to process the "case" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_CaseCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int i, result;
+    int body;
+    char *string;
+    int caseArgc, splitArgs;
+    char **caseArgv;
+
+    if (argc < 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " string ?in? patList body ... ?default body?\"",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+    string = argv[1];
+    body = -1;
+    if (strcmp(argv[2], "in") == 0) {
+       i = 3;
+    } else {
+       i = 2;
+    }
+    caseArgc = argc - i;
+    caseArgv = argv + i;
+
+    /*
+     * If all of the pattern/command pairs are lumped into a single
+     * argument, split them out again.
+     */
+
+    splitArgs = 0;
+    if (caseArgc == 1) {
+       result = Tcl_SplitList(interp, caseArgv[0], &caseArgc, &caseArgv);
+       if (result != TCL_OK) {
+           return result;
+       }
+       splitArgs = 1;
+    }
+
+    for (i = 0; i < caseArgc; i += 2) {
+       int patArgc, j;
+       char **patArgv;
+       register char *p;
+
+       if (i == (caseArgc-1)) {
+           interp->result = "extra case pattern with no body";
+           result = TCL_ERROR;
+           goto cleanup;
+       }
+
+       /*
+        * Check for special case of single pattern (no list) with
+        * no backslash sequences.
+        */
+
+       for (p = caseArgv[i]; *p != 0; p++) {
+           if (isspace(*p) || (*p == '\\')) {
+               break;
+           }
+       }
+       if (*p == 0) {
+           if ((*caseArgv[i] == 'd')
+                   && (strcmp(caseArgv[i], "default") == 0)) {
+               body = i+1;
+           }
+           if (Tcl_StringMatch(string, caseArgv[i])) {
+               body = i+1;
+               goto match;
+           }
+           continue;
+       }
+
+       /*
+        * Break up pattern lists, then check each of the patterns
+        * in the list.
+        */
+
+       result = Tcl_SplitList(interp, caseArgv[i], &patArgc, &patArgv);
+       if (result != TCL_OK) {
+           goto cleanup;
+       }
+       for (j = 0; j < patArgc; j++) {
+           if (Tcl_StringMatch(string, patArgv[j])) {
+               body = i+1;
+               break;
+           }
+       }
+       ckfree((char *) patArgv);
+       if (j < patArgc) {
+           break;
+       }
+    }
+
+    match:
+    if (body != -1) {
+       result = Tcl_Eval(interp, caseArgv[body], 0, (char **) NULL);
+       if (result == TCL_ERROR) {
+           char msg[100];
+           sprintf(msg, "\n    (\"%.50s\" arm line %d)", caseArgv[body-1],
+                   interp->errorLine);
+           Tcl_AddErrorInfo(interp, msg);
+       }
+       goto cleanup;
+    }
+
+    /*
+     * Nothing matched:  return nothing.
+     */
+
+    result = TCL_OK;
+
+    cleanup:
+    if (splitArgs) {
+       ckfree((char *) caseArgv);
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_CatchCmd --
+ *
+ *     This procedure is invoked to process the "catch" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_CatchCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int result;
+
+    if ((argc != 2) && (argc != 3)) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " command ?varName?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    result = Tcl_Eval(interp, argv[1], 0, (char **) NULL);
+    if (argc == 3) {
+       if (Tcl_SetVar(interp, argv[2], interp->result, 0) == NULL) {
+           Tcl_SetResult(interp, "couldn't save command result in variable",
+                   TCL_STATIC);
+           return TCL_ERROR;
+       }
+    }
+    Tcl_ResetResult(interp);
+    sprintf(interp->result, "%d", result);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ConcatCmd --
+ *
+ *     This procedure is invoked to process the "concat" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_ConcatCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    if (argc == 1) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " arg ?arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    interp->result = Tcl_Concat(argc-1, argv+1);
+    interp->freeProc = (Tcl_FreeProc *) free;
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ContinueCmd --
+ *
+ *     This procedure is invoked to process the "continue" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_ContinueCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    if (argc != 1) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_CONTINUE;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ErrorCmd --
+ *
+ *     This procedure is invoked to process the "error" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_ErrorCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    Interp *iPtr = (Interp *) interp;
+
+    if ((argc < 2) || (argc > 4)) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " message ?errorInfo? ?errorCode?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if ((argc >= 3) && (argv[2][0] != 0)) {
+       Tcl_AddErrorInfo(interp, argv[2]);
+       iPtr->flags |= ERR_ALREADY_LOGGED;
+    }
+    if (argc == 4) {
+       Tcl_SetVar2(interp, "errorCode", (char *) NULL, argv[3],
+               TCL_GLOBAL_ONLY);
+       iPtr->flags |= ERROR_CODE_SET;
+    }
+    Tcl_SetResult(interp, argv[1], TCL_VOLATILE);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_EvalCmd --
+ *
+ *     This procedure is invoked to process the "eval" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_EvalCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int result;
+    char *cmd;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " arg ?arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (argc == 2) {
+       result = Tcl_Eval(interp, argv[1], 0, (char **) NULL);
+    } else {
+    
+       /*
+        * More than one argument:  concatenate them together with spaces
+        * between, then evaluate the result.
+        */
+    
+       cmd = Tcl_Concat(argc-1, argv+1);
+       result = Tcl_Eval(interp, cmd, 0, (char **) NULL);
+       ckfree(cmd);
+    }
+    if (result == TCL_ERROR) {
+       char msg[60];
+       sprintf(msg, "\n    (\"eval\" body line %d)", interp->errorLine);
+       Tcl_AddErrorInfo(interp, msg);
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ExprCmd --
+ *
+ *     This procedure is invoked to process the "expr" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_ExprCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    if (argc != 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " expression\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    return Tcl_ExprString(interp, argv[1]);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ForCmd --
+ *
+ *     This procedure is invoked to process the "for" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_ForCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int result, value;
+
+    if (argc != 5) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " start test next command\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    result = Tcl_Eval(interp, argv[1], 0, (char **) NULL);
+    if (result != TCL_OK) {
+       if (result == TCL_ERROR) {
+           Tcl_AddErrorInfo(interp, "\n    (\"for\" initial command)");
+       }
+       return result;
+    }
+    while (1) {
+       result = Tcl_ExprBoolean(interp, argv[2], &value);
+       if (result != TCL_OK) {
+           return result;
+       }
+       if (!value) {
+           break;
+       }
+       result = Tcl_Eval(interp, argv[4], 0, (char **) NULL);
+       if (result == TCL_CONTINUE) {
+           result = TCL_OK;
+       } else if (result != TCL_OK) {
+           if (result == TCL_ERROR) {
+               char msg[60];
+               sprintf(msg, "\n    (\"for\" body line %d)", interp->errorLine);
+               Tcl_AddErrorInfo(interp, msg);
+           }
+           break;
+       }
+       result = Tcl_Eval(interp, argv[3], 0, (char **) NULL);
+       if (result == TCL_BREAK) {
+           break;
+       } else if (result != TCL_OK) {
+           if (result == TCL_ERROR) {
+               Tcl_AddErrorInfo(interp, "\n    (\"for\" loop-end command)");
+           }
+           return result;
+       }
+    }
+    if (result == TCL_BREAK) {
+       result = TCL_OK;
+    }
+    if (result == TCL_OK) {
+       Tcl_ResetResult(interp);
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ForeachCmd --
+ *
+ *     This procedure is invoked to process the "foreach" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_ForeachCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int listArgc, i, result;
+    char **listArgv;
+
+    if (argc != 4) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " varName list command\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Break the list up into elements, and execute the command once
+     * for each value of the element.
+     */
+
+    result = Tcl_SplitList(interp, argv[2], &listArgc, &listArgv);
+    if (result != TCL_OK) {
+       return result;
+    }
+    for (i = 0; i < listArgc; i++) {
+       if (Tcl_SetVar(interp, argv[1], listArgv[i], 0) == NULL) {
+           Tcl_SetResult(interp, "couldn't set loop variable", TCL_STATIC);
+           result = TCL_ERROR;
+           break;
+       }
+
+       result = Tcl_Eval(interp, argv[3], 0, (char **) NULL);
+       if (result != TCL_OK) {
+           if (result == TCL_CONTINUE) {
+               result = TCL_OK;
+           } else if (result == TCL_BREAK) {
+               result = TCL_OK;
+               break;
+           } else if (result == TCL_ERROR) {
+               char msg[100];
+               sprintf(msg, "\n    (\"foreach\" body line %d)",
+                       interp->errorLine);
+               Tcl_AddErrorInfo(interp, msg);
+               break;
+           } else {
+               break;
+           }
+       }
+    }
+    ckfree((char *) listArgv);
+    if (result == TCL_OK) {
+       Tcl_ResetResult(interp);
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_FormatCmd --
+ *
+ *     This procedure is invoked to process the "format" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_FormatCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    register char *format;     /* Used to read characters from the format
+                                * string. */
+    char newFormat[40];                /* A new format specifier is generated here. */
+    int width;                 /* Field width from field specifier, or 0 if
+                                * no width given. */
+    int precision;             /* Field precision from field specifier, or 0
+                                * if no precision given. */
+    int size;                  /* Number of bytes needed for result of
+                                * conversion, based on type of conversion
+                                * ("e", "s", etc.) and width from above. */
+    char *oneWordValue = NULL; /* Used to hold value to pass to sprintf, if
+                                * it's a one-word value. */
+    double twoWordValue;       /* Used to hold value to pass to sprintf if
+                                * it's a two-word value. */
+    int useTwoWords;           /* 0 means use oneWordValue, 1 means use
+                                * twoWordValue. */
+    char *dst = interp->result;        /* Where result is stored.  Starts off at
+                                * interp->resultSpace, but may get dynamically
+                                * re-allocated if this isn't enough. */
+    int dstSize = 0;           /* Number of non-null characters currently
+                                * stored at dst. */
+    int dstSpace = TCL_RESULT_SIZE;
+                               /* Total amount of storage space available
+                                * in dst (not including null terminator. */
+    int noPercent;             /* Special case for speed:  indicates there's
+                                * no field specifier, just a string to copy. */
+    char **curArg;             /* Remainder of argv array. */
+    int useShort;              /* Value to be printed is short (half word). */
+
+    /*
+     * This procedure is a bit nasty.  The goal is to use sprintf to
+     * do most of the dirty work.  There are several problems:
+     * 1. this procedure can't trust its arguments.
+     * 2. we must be able to provide a large enough result area to hold
+     *    whatever's generated.  This is hard to estimate.
+     * 2. there's no way to move the arguments from argv to the call
+     *    to sprintf in a reasonable way.  This is particularly nasty
+     *    because some of the arguments may be two-word values (doubles).
+     * So, what happens here is to scan the format string one % group
+     * at a time, making many individual calls to sprintf.
+     */
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " formatString ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    curArg = argv+2;
+    argc -= 2;
+    for (format = argv[1]; *format != 0; ) {
+       register char *newPtr = newFormat;
+
+       width = precision = useTwoWords = noPercent = useShort = 0;
+
+       /*
+        * Get rid of any characters before the next field specifier.
+        * Collapse backslash sequences found along the way.
+        */
+
+       if (*format != '%') {
+           register char *p;
+           int bsSize;
+
+           oneWordValue = p = format;
+           while ((*format != '%') && (*format != 0)) {
+               if (*format == '\\') {
+                   *p = Tcl_Backslash(format, &bsSize);
+                   if (*p != 0) {
+                       p++;
+                   }
+                   format += bsSize;
+               } else {
+                   *p = *format;
+                   p++;
+                   format++;
+               }
+           }
+           size = p - oneWordValue;
+           noPercent = 1;
+           goto doField;
+       }
+
+       if (format[1] == '%') {
+           oneWordValue = format;
+           size = 1;
+           noPercent = 1;
+           format += 2;
+           goto doField;
+       }
+
+       /*
+        * Parse off a field specifier, compute how many characters
+        * will be needed to store the result, and substitute for
+        * "*" size specifiers.
+        */
+
+       *newPtr = '%';
+       newPtr++;
+       format++;
+       while ((*format == '-') || (*format == '#')) {
+           *newPtr = *format;
+           newPtr++;
+           format++;
+       }
+       if (*format == '0') {
+           *newPtr = '0';
+           newPtr++;
+           format++;
+       }
+       if (isdigit(*format)) {
+           width = atoi(format);
+           do {
+               format++;
+           } while (isdigit(*format));
+       } else if (*format == '*') {
+           if (argc <= 0) {
+               goto notEnoughArgs;
+           }
+           if (Tcl_GetInt(interp, *curArg, &width) != TCL_OK) {
+               goto fmtError;
+           }
+           argc--;
+           curArg++;
+           format++;
+       }
+       if (width != 0) {
+           sprintf(newPtr, "%d", width);
+           while (*newPtr != 0) {
+               newPtr++;
+           }
+       }
+       if (*format == '.') {
+           *newPtr = '.';
+           newPtr++;
+           format++;
+       }
+       if (isdigit(*format)) {
+           precision = atoi(format);
+           do {
+               format++;
+           } while (isdigit(*format));
+       } else if (*format == '*') {
+           if (argc <= 0) {
+               goto notEnoughArgs;
+           }
+           if (Tcl_GetInt(interp, *curArg, &precision) != TCL_OK) {
+               goto fmtError;
+           }
+           argc--;
+           curArg++;
+           format++;
+       }
+       if (precision != 0) {
+           sprintf(newPtr, "%d", precision);
+           while (*newPtr != 0) {
+               newPtr++;
+           }
+       }
+       if (*format == 'l') {
+           format++;
+       } else if (*format == 'h') {
+           useShort = 1;
+           *newPtr = 'h';
+           newPtr++;
+           format++;
+       }
+       *newPtr = *format;
+       newPtr++;
+       *newPtr = 0;
+       if (argc <= 0) {
+           goto notEnoughArgs;
+       }
+       switch (*format) {
+           case 'D':
+           case 'O':
+           case 'U':
+               if (!useShort) {
+                   newPtr++;
+               } else {
+                   useShort = 0;
+               }
+               newPtr[-1] = tolower(*format);
+               newPtr[-2] = 'l';
+               *newPtr = 0;
+           case 'd':
+           case 'o':
+           case 'u':
+           case 'x':
+           case 'X':
+               if (Tcl_GetInt(interp, *curArg, (int *) &oneWordValue)
+                       != TCL_OK) {
+                   goto fmtError;
+               }
+               size = 40;
+               break;
+           case 's':
+               oneWordValue = *curArg;
+               size = strlen(*curArg);
+               break;
+           case 'c':
+               if (Tcl_GetInt(interp, *curArg, (int *) &oneWordValue)
+                       != TCL_OK) {
+                   goto fmtError;
+               }
+               size = 1;
+               break;
+           case 'F':
+               newPtr[-1] = tolower(newPtr[-1]);
+           case 'e':
+           case 'E':
+           case 'f':
+           case 'g':
+           case 'G':
+               if (Tcl_GetDouble(interp, *curArg, &twoWordValue) != TCL_OK) {
+                   goto fmtError;
+               }
+               useTwoWords = 1;
+               size = 320;
+               if (precision > 10) {
+                   size += precision;
+               }
+               break;
+           case 0:
+               interp->result =
+                       "format string ended in middle of field specifier";
+               goto fmtError;
+           default:
+               sprintf(interp->result, "bad field specifier \"%c\"", *format);
+               goto fmtError;
+       }
+       argc--;
+       curArg++;
+       format++;
+
+       /*
+        * Make sure that there's enough space to hold the formatted
+        * result, then format it.
+        */
+
+       doField:
+       if (width > size) {
+           size = width;
+       }
+       if ((dstSize + size) > dstSpace) {
+           char *newDst;
+           int newSpace;
+
+           newSpace = 2*(dstSize + size);
+           newDst = (char *) ckalloc((unsigned) newSpace+1);
+           if (dstSize != 0) {
+               memcpy((VOID *) newDst, (VOID *) dst, dstSize);
+           }
+           if (dstSpace != TCL_RESULT_SIZE) {
+               ckfree(dst);
+           }
+           dst = newDst;
+           dstSpace = newSpace;
+       }
+       if (noPercent) {
+           memcpy((VOID *) (dst+dstSize), (VOID *) oneWordValue, size);
+           dstSize += size;
+           dst[dstSize] = 0;
+       } else {
+           if (useTwoWords) {
+               sprintf(dst+dstSize, newFormat, twoWordValue);
+           } else if (useShort) {
+               int tmp = (int)oneWordValue;
+               sprintf(dst+dstSize, newFormat, (short)tmp);
+           } else {
+               sprintf(dst+dstSize, newFormat, oneWordValue);
+           }
+           dstSize += strlen(dst+dstSize);
+       }
+    }
+
+    interp->result = dst;
+    if (dstSpace != TCL_RESULT_SIZE) {
+       interp->freeProc = (Tcl_FreeProc *) free;
+    } else {
+       interp->freeProc = 0;
+    }
+    return TCL_OK;
+
+    notEnoughArgs:
+    interp->result = "not enough arguments for all format specifiers";
+    fmtError:
+    if (dstSpace != TCL_RESULT_SIZE) {
+       ckfree(dst);
+    }
+    return TCL_ERROR;
+}
diff --git a/src/tcl/tclcmdil.c b/src/tcl/tclcmdil.c
new file mode 100644 (file)
index 0000000..d7e9bdc
--- /dev/null
@@ -0,0 +1,1149 @@
+/* 
+ * tclCmdIL.c --
+ *
+ *     This file contains the top-level command routines for most of
+ *     the Tcl built-in commands whose names begin with the letters
+ *     I through L.  It contains only commands in the generic core
+ *     (i.e. those that don't depend much upon UNIX facilities).
+ *
+ * Copyright 1987-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclCmdIL.c,v 1.84 91/12/06 10:42:36 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tclint.h"
+
+/*
+ * Global absolute file name:
+ */
+
+char *TCL_Library = TCL_LIBRARY;
+
+/*
+ * Forward declarations for procedures defined in this file:
+ */
+
+static int             SortCompareProc _ANSI_ARGS_((CONST VOID *first,
+                           CONST VOID *second));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_IfCmd --
+ *
+ *     This procedure is invoked to process the "if" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_IfCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    char *condition, *ifPart, *elsePart, *cmd, *name;
+    char *clause;
+    int result, value;
+
+    name = argv[0];
+    if (argc < 3) {
+       ifSyntax:
+       Tcl_AppendResult(interp, "wrong # args: should be \"", name,
+               " bool ?then? command ?else? ?command?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    condition = argv[1];
+    argc -= 2;
+    argv += 2;
+    if ((**argv == 't') && (strncmp(*argv, "then", strlen(*argv)) == 0)) {
+       argc--;
+       argv++;
+    }
+    if (argc < 1) {
+       goto ifSyntax;
+    }
+    ifPart = *argv;
+    argv++;
+    argc--;
+    if (argc == 0) {
+       elsePart = "";
+    } else {
+       if ((**argv == 'e') && (strncmp(*argv, "else", strlen(*argv)) == 0)) {
+           argc--;
+           argv++;
+       }
+       if (argc != 1) {
+           goto ifSyntax;
+       }
+       elsePart = *argv;
+    }
+
+    cmd = ifPart;
+    clause = "\"then\" clause";
+    result = Tcl_ExprBoolean(interp, condition, &value);
+    if (result != TCL_OK) {
+       if (result == TCL_ERROR) {
+           char msg[60];
+           sprintf(msg, "\n    (\"if\" test line %d)", interp->errorLine);
+           Tcl_AddErrorInfo(interp, msg);
+       }
+       return result;
+    }
+    if (value == 0) {
+       cmd = elsePart;
+       clause = "\"else\" clause";
+    }
+    if (*cmd == 0) {
+       return TCL_OK;
+    }
+    result = Tcl_Eval(interp, cmd, 0, (char **) NULL);
+    if (result == TCL_ERROR) {
+       char msg[60];
+       sprintf(msg, "\n    (%s line %d)", clause, interp->errorLine);
+       Tcl_AddErrorInfo(interp, msg);
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_IncrCmd --
+ *
+ *     This procedure is invoked to process the "incr" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+    /* ARGSUSED */
+int
+Tcl_IncrCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int value;
+    char *oldString, *result;
+    char newString[30];
+
+    if ((argc != 2) && (argc != 3)) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " varName ?increment?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    oldString = Tcl_GetVar(interp, argv[1], TCL_LEAVE_ERR_MSG);
+    if (oldString == NULL) {
+       return TCL_ERROR;
+    }
+    if (Tcl_GetInt(interp, oldString, &value) != TCL_OK) {
+       Tcl_AddErrorInfo(interp,
+               "\n    (reading value of variable to increment)");
+       return TCL_ERROR;
+    }
+    if (argc == 2) {
+       value += 1;
+    } else {
+       int increment;
+
+       if (Tcl_GetInt(interp, argv[2], &increment) != TCL_OK) {
+           Tcl_AddErrorInfo(interp,
+                   "\n    (reading increment)");
+           return TCL_ERROR;
+       }
+       value += increment;
+    }
+    sprintf(newString, "%d", value);
+    result = Tcl_SetVar(interp, argv[1], newString, TCL_LEAVE_ERR_MSG);
+    if (result == NULL) {
+       return TCL_ERROR;
+    }
+    interp->result = result;
+    return TCL_OK; 
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_InfoCmd --
+ *
+ *     This procedure is invoked to process the "info" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_InfoCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    register Interp *iPtr = (Interp *) interp;
+    int length;
+    char c;
+    Arg *argPtr;
+    Proc *procPtr;
+    Var *varPtr;
+    Command *cmdPtr;
+    Tcl_HashEntry *hPtr;
+    Tcl_HashSearch search;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'a') && (strncmp(argv[1], "args", length)) == 0) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " args procname\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       procPtr = TclFindProc(iPtr, argv[2]);
+       if (procPtr == NULL) {
+           infoNoSuchProc:
+           Tcl_AppendResult(interp, "\"", argv[2],
+                   "\" isn't a procedure", (char *) NULL);
+           return TCL_ERROR;
+       }
+       for (argPtr = procPtr->argPtr; argPtr != NULL;
+               argPtr = argPtr->nextPtr) {
+           Tcl_AppendElement(interp, argPtr->name, 0);
+       }
+       return TCL_OK;
+    } else if ((c == 'b') && (strncmp(argv[1], "body", length)) == 0) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " body procname\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       procPtr = TclFindProc(iPtr, argv[2]);
+       if (procPtr == NULL) {
+           goto infoNoSuchProc;
+       }
+       iPtr->result = procPtr->command;
+       return TCL_OK;
+    } else if ((c == 'c') && (strncmp(argv[1], "cmdcount", length) == 0)
+           && (length >= 2)) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " cmdcount\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       sprintf(iPtr->result, "%d", iPtr->cmdCount);
+       return TCL_OK;
+    } else if ((c == 'c') && (strncmp(argv[1], "commands", length) == 0)
+           && (length >= 2)){
+       if (argc > 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " commands [pattern]\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       for (hPtr = Tcl_FirstHashEntry(&iPtr->commandTable, &search);
+               hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
+           char *name = Tcl_GetHashKey(&iPtr->commandTable, hPtr);
+           if ((argc == 3) && !Tcl_StringMatch(name, argv[2])) {
+               continue;
+           }
+           Tcl_AppendElement(interp, name, 0);
+       }
+       return TCL_OK;
+    } else if ((c == 'd') && (strncmp(argv[1], "default", length)) == 0) {
+       if (argc != 5) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " default procname arg varname\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       procPtr = TclFindProc(iPtr, argv[2]);
+       if (procPtr == NULL) {
+           goto infoNoSuchProc;
+       }
+       for (argPtr = procPtr->argPtr; ; argPtr = argPtr->nextPtr) {
+           if (argPtr == NULL) {
+               Tcl_AppendResult(interp, "procedure \"", argv[2],
+                       "\" doesn't have an argument \"", argv[3],
+                       "\"", (char *) NULL);
+               return TCL_ERROR;
+           }
+           if (strcmp(argv[3], argPtr->name) == 0) {
+               if (argPtr->defValue != NULL) {
+                   if (Tcl_SetVar((Tcl_Interp *) iPtr, argv[4],
+                           argPtr->defValue, 0) == NULL) {
+                       defStoreError:
+                       Tcl_AppendResult(interp,
+                               "couldn't store default value in variable \"",
+                               argv[4], "\"", (char *) NULL);
+                       return TCL_ERROR;
+                   }
+                   iPtr->result = "1";
+               } else {
+                   if (Tcl_SetVar((Tcl_Interp *) iPtr, argv[4], "", 0)
+                           == NULL) {
+                       goto defStoreError;
+                   }
+                   iPtr->result = "0";
+               }
+               return TCL_OK;
+           }
+       }
+    } else if ((c == 'e') && (strncmp(argv[1], "exists", length) == 0)) {
+       char *p;
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " exists varName\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       p = Tcl_GetVar((Tcl_Interp *) iPtr, argv[2], 0);
+
+       /*
+        * The code below handles the special case where the name is for
+        * an array:  Tcl_GetVar will reject this since you can't read
+        * an array variable without an index.
+        */
+
+       if (p == NULL) {
+           Tcl_HashEntry *hPtr;
+           Var *varPtr;
+
+           if (strchr(argv[2], '(') != NULL) {
+               noVar:
+               iPtr->result = "0";
+               return TCL_OK;
+           }
+           if (iPtr->varFramePtr == NULL) {
+               hPtr = Tcl_FindHashEntry(&iPtr->globalTable, argv[2]);
+           } else {
+               hPtr = Tcl_FindHashEntry(&iPtr->varFramePtr->varTable, argv[2]);
+           }
+           if (hPtr == NULL) {
+               goto noVar;
+           }
+           varPtr = (Var *) Tcl_GetHashValue(hPtr);
+           if (varPtr->flags & VAR_UPVAR) {
+               varPtr = (Var *) Tcl_GetHashValue(varPtr->value.upvarPtr);
+           }
+           if (!(varPtr->flags & VAR_ARRAY)) {
+               goto noVar;
+           }
+       }
+       iPtr->result = "1";
+       return TCL_OK;
+    } else if ((c == 'g') && (strncmp(argv[1], "globals", length) == 0)) {
+       char *name;
+
+       if (argc > 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " globals [pattern]\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       for (hPtr = Tcl_FirstHashEntry(&iPtr->globalTable, &search);
+               hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
+           varPtr = (Var *) Tcl_GetHashValue(hPtr);
+           if (varPtr->flags & VAR_UNDEFINED) {
+               continue;
+           }
+           name = Tcl_GetHashKey(&iPtr->globalTable, hPtr);
+           if ((argc == 3) && !Tcl_StringMatch(name, argv[2])) {
+               continue;
+           }
+           Tcl_AppendElement(interp, name, 0);
+       }
+       return TCL_OK;
+    } else if ((c == 'l') && (strncmp(argv[1], "level", length) == 0)
+           && (length >= 2)) {
+       if (argc == 2) {
+           if (iPtr->varFramePtr == NULL) {
+               iPtr->result = "0";
+           } else {
+               sprintf(iPtr->result, "%d", iPtr->varFramePtr->level);
+           }
+           return TCL_OK;
+       } else if (argc == 3) {
+           int level;
+           CallFrame *framePtr;
+
+           if (Tcl_GetInt(interp, argv[2], &level) != TCL_OK) {
+               return TCL_ERROR;
+           }
+           if (level <= 0) {
+               if (iPtr->varFramePtr == NULL) {
+                   levelError:
+                   Tcl_AppendResult(interp, "bad level \"", argv[2],
+                           "\"", (char *) NULL);
+                   return TCL_ERROR;
+               }
+               level += iPtr->varFramePtr->level;
+           }
+           for (framePtr = iPtr->varFramePtr; framePtr != NULL;
+                   framePtr = framePtr->callerVarPtr) {
+               if (framePtr->level == level) {
+                   break;
+               }
+           }
+           if (framePtr == NULL) {
+               goto levelError;
+           }
+           iPtr->result = Tcl_Merge(framePtr->argc, framePtr->argv);
+           iPtr->freeProc = (Tcl_FreeProc *) free;
+           return TCL_OK;
+       }
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " level [number]\"", (char *) NULL);
+       return TCL_ERROR;
+    } else if ((c == 'l') && (strncmp(argv[1], "library", length) == 0)
+           && (length >= 2)) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " library\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+#ifdef TCL_LIBRARY
+       interp->result = TCL_Library;
+       return TCL_OK;
+#else
+       interp->result = "there is no Tcl library at this installation";
+       return TCL_ERROR;
+#endif
+    } else if ((c == 'l') && (strncmp(argv[1], "locals", length) == 0)
+           && (length >= 2)) {
+       char *name;
+
+       if (argc > 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " locals [pattern]\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (iPtr->varFramePtr == NULL) {
+           return TCL_OK;
+       }
+       for (hPtr = Tcl_FirstHashEntry(&iPtr->varFramePtr->varTable, &search);
+               hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
+           varPtr = (Var *) Tcl_GetHashValue(hPtr);
+           if (varPtr->flags & (VAR_UNDEFINED|VAR_UPVAR)) {
+               continue;
+           }
+           name = Tcl_GetHashKey(&iPtr->varFramePtr->varTable, hPtr);
+           if ((argc == 3) && !Tcl_StringMatch(name, argv[2])) {
+               continue;
+           }
+           Tcl_AppendElement(interp, name, 0);
+       }
+       return TCL_OK;
+    } else if ((c == 'p') && (strncmp(argv[1], "procs", length)) == 0) {
+       if (argc > 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " procs [pattern]\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       for (hPtr = Tcl_FirstHashEntry(&iPtr->commandTable, &search);
+               hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
+           char *name = Tcl_GetHashKey(&iPtr->commandTable, hPtr);
+
+           cmdPtr = (Command *) Tcl_GetHashValue(hPtr);
+           if (!TclIsProc(cmdPtr)) {
+               continue;
+           }
+           if ((argc == 3) && !Tcl_StringMatch(name, argv[2])) {
+               continue;
+           }
+           Tcl_AppendElement(interp, name, 0);
+       }
+       return TCL_OK;
+    } else if ((c == 's') && (strncmp(argv[1], "script", length) == 0)) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " script\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (iPtr->scriptFile != NULL) {
+           interp->result = iPtr->scriptFile;
+       }
+       return TCL_OK;
+    } else if ((c == 't') && (strncmp(argv[1], "tclversion", length) == 0)) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " tclversion\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+
+       /*
+        * Note:  TCL_VERSION below is expected to be set with a "-D"
+        * switch in the Makefile.
+        */
+
+       strcpy(iPtr->result, TCL_VERSION);
+       return TCL_OK;
+    } else if ((c == 'v') && (strncmp(argv[1], "vars", length)) == 0) {
+       Tcl_HashTable *tablePtr;
+       char *name;
+
+       if (argc > 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " vars [pattern]\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (iPtr->varFramePtr == NULL) {
+           tablePtr = &iPtr->globalTable;
+       } else {
+           tablePtr = &iPtr->varFramePtr->varTable;
+       }
+       for (hPtr = Tcl_FirstHashEntry(tablePtr, &search);
+               hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
+           varPtr = (Var *) Tcl_GetHashValue(hPtr);
+           if (varPtr->flags & VAR_UNDEFINED) {
+               continue;
+           }
+           name = Tcl_GetHashKey(tablePtr, hPtr);
+           if ((argc == 3) && !Tcl_StringMatch(name, argv[2])) {
+               continue;
+           }
+           Tcl_AppendElement(interp, name, 0);
+       }
+       return TCL_OK;
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\": should be args, body, commands, cmdcount, default, ",
+               "exists, globals, level, library, locals, procs, ",
+               "script, tclversion, or vars",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_JoinCmd --
+ *
+ *     This procedure is invoked to process the "join" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_JoinCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    char *joinString;
+    char **listArgv;
+    int listArgc, i;
+
+    if (argc == 2) {
+       joinString = " ";
+    } else if (argc == 3) {
+       joinString = argv[2];
+    } else {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " list ?joinString?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if (Tcl_SplitList(interp, argv[1], &listArgc, &listArgv) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    for (i = 0; i < listArgc; i++) {
+       if (i == 0) {
+           Tcl_AppendResult(interp, listArgv[0], (char *) NULL);
+       } else  {
+           Tcl_AppendResult(interp, joinString, listArgv[i], (char *) NULL);
+       }
+    }
+    ckfree((char *) listArgv);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_LindexCmd --
+ *
+ *     This procedure is invoked to process the "lindex" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+    /* ARGSUSED */
+int
+Tcl_LindexCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    char *p, *element;
+    int index, size, parenthesized, result;
+
+    if (argc != 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " list index\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (Tcl_GetInt(interp, argv[2], &index) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    if (index < 0) {
+       return TCL_OK;
+    }
+    for (p = argv[1] ; index >= 0; index--) {
+       result = TclFindElement(interp, p, &element, &p, &size,
+               &parenthesized);
+       if (result != TCL_OK) {
+           return result;
+       }
+    }
+    if (size == 0) {
+       return TCL_OK;
+    }
+    if (size >= TCL_RESULT_SIZE) {
+       interp->result = (char *) ckalloc((unsigned) size+1);
+       interp->freeProc = (Tcl_FreeProc *) free;
+    }
+    if (parenthesized) {
+       memcpy((VOID *) interp->result, (VOID *) element, size);
+       interp->result[size] = 0;
+    } else {
+       TclCopyAndCollapse(size, element, interp->result);
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_LinsertCmd --
+ *
+ *     This procedure is invoked to process the "linsert" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_LinsertCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    char *p, *element, savedChar;
+    int i, index, count, result, size;
+
+    if (argc < 4) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " list index element ?element ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (Tcl_GetInt(interp, argv[2], &index) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * Skip over the first "index" elements of the list, then add
+     * all of those elements to the result.
+     */
+
+    size = 0;
+    element = argv[1];
+    for (count = 0, p = argv[1]; (count < index) && (*p != 0); count++) {
+       result = TclFindElement(interp, p, &element, &p, &size, (int *) NULL);
+       if (result != TCL_OK) {
+           return result;
+       }
+    }
+    if (*p == 0) {
+       Tcl_AppendResult(interp, argv[1], (char *) NULL);
+    } else {
+       char *end;
+
+       end = element+size;
+       if (element != argv[1]) {
+           while ((*end != 0) && !isspace(*end)) {
+               end++;
+           }
+       }
+       savedChar = *end;
+       *end = 0;
+       Tcl_AppendResult(interp, argv[1], (char *) NULL);
+       *end = savedChar;
+    }
+
+    /*
+     * Add the new list elements.
+     */
+
+    for (i = 3; i < argc; i++) {
+       Tcl_AppendElement(interp, argv[i], 0);
+    }
+
+    /*
+     * Append the remainder of the original list.
+     */
+
+    if (*p != 0) {
+       Tcl_AppendResult(interp, " ", p, (char *) NULL);
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ListCmd --
+ *
+ *     This procedure is invoked to process the "list" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_ListCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " arg ?arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    interp->result = Tcl_Merge(argc-1, argv+1);
+    interp->freeProc = (Tcl_FreeProc *) free;
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_LlengthCmd --
+ *
+ *     This procedure is invoked to process the "llength" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_LlengthCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int count, result;
+    char *element, *p;
+
+    if (argc != 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " list\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    for (count = 0, p = argv[1]; *p != 0 ; count++) {
+       result = TclFindElement(interp, p, &element, &p, (int *) NULL,
+               (int *) NULL);
+       if (result != TCL_OK) {
+           return result;
+       }
+       if (*element == 0) {
+           break;
+       }
+    }
+    sprintf(interp->result, "%d", count);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_LrangeCmd --
+ *
+ *     This procedure is invoked to process the "lrange" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_LrangeCmd(notUsed, interp, argc, argv)
+    ClientData notUsed;                        /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int first, last, result;
+    char *begin, *end, c, *dummy;
+    int count;
+
+    if (argc != 4) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " list first last\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (Tcl_GetInt(interp, argv[2], &first) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    if (first < 0) {
+       first = 0;
+    }
+    if ((*argv[3] == 'e') && (strncmp(argv[3], "end", strlen(argv[3])) == 0)) {
+       last = 1000000;
+    } else {
+       if (Tcl_GetInt(interp, argv[3], &last) != TCL_OK) {
+           Tcl_ResetResult(interp);
+           Tcl_AppendResult(interp,
+                   "expected integer or \"end\" but got \"",
+                   argv[3], "\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+    }
+    if (first > last) {
+       return TCL_OK;
+    }
+
+    /*
+     * Extract a range of fields.
+     */
+
+    for (count = 0, begin = argv[1]; count < first; count++) {
+       result = TclFindElement(interp, begin, &dummy, &begin, (int *) NULL,
+               (int *) NULL);
+       if (result != TCL_OK) {
+           return result;
+       }
+       if (*begin == 0) {
+           break;
+       }
+    }
+    for (count = first, end = begin; (count <= last) && (*end != 0);
+           count++) {
+       result = TclFindElement(interp, end, &dummy, &end, (int *) NULL,
+               (int *) NULL);
+       if (result != TCL_OK) {
+           return result;
+       }
+    }
+
+    /*
+     * Chop off trailing spaces.
+     */
+
+    while (isspace(end[-1])) {
+       end--;
+    }
+    c = *end;
+    *end = 0;
+    Tcl_SetResult(interp, begin, TCL_VOLATILE);
+    *end = c;
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_LreplaceCmd --
+ *
+ *     This procedure is invoked to process the "lreplace" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_LreplaceCmd(notUsed, interp, argc, argv)
+    ClientData notUsed;                        /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    char *p1, *p2, *element, savedChar, *dummy;
+    int i, first, last, count, result, size;
+
+    if (argc < 4) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " list first last ?element element ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (Tcl_GetInt(interp, argv[2], &first) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    if (TclGetListIndex(interp, argv[3], &last) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    if (first < 0) {
+       first = 0;
+    }
+    if (last < 0) {
+       last = 0;
+    }
+    if (first > last) {
+       Tcl_AppendResult(interp, "first index must not be greater than second",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Skip over the elements of the list before "first".
+     */
+
+    size = 0;
+    element = argv[1];
+    for (count = 0, p1 = argv[1]; (count < first) && (*p1 != 0); count++) {
+       result = TclFindElement(interp, p1, &element, &p1, &size,
+                               (int *) NULL);
+       if (result != TCL_OK) {
+           return result;
+       }
+    }
+    if (*p1 == 0) {
+       Tcl_AppendResult(interp, "list doesn't contain element ",
+               argv[2], (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Skip over the elements of the list up through "last".
+     */
+
+    for (p2 = p1 ; (count <= last) && (*p2 != 0); count++) {
+       result = TclFindElement(interp, p2, &dummy, &p2, (int *) NULL,
+               (int *) NULL);
+       if (result != TCL_OK) {
+           return result;
+       }
+    }
+
+    /*
+     * Add the elements before "first" to the result.  Be sure to
+     * include quote or brace characters that might terminate the
+     * last of these elements.
+     */
+
+    p1 = element+size;
+    if (element != argv[1]) {
+       while ((*p1 != 0) && !isspace(*p1)) {
+           p1++;
+       }
+    }
+    savedChar = *p1;
+    *p1 = 0;
+    Tcl_AppendResult(interp, argv[1], (char *) NULL);
+    *p1 = savedChar;
+
+    /*
+     * Add the new list elements.
+     */
+
+    for (i = 4; i < argc; i++) {
+       Tcl_AppendElement(interp, argv[i], 0);
+    }
+
+    /*
+     * Append the remainder of the original list.
+     */
+
+    if (*p2 != 0) {
+       if (*interp->result == 0) {
+           Tcl_SetResult(interp, p2, TCL_VOLATILE);
+       } else {
+           Tcl_AppendResult(interp, " ", p2, (char *) NULL);
+       }
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_LsearchCmd --
+ *
+ *     This procedure is invoked to process the "lsearch" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_LsearchCmd(notUsed, interp, argc, argv)
+    ClientData notUsed;                        /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int listArgc;
+    char **listArgv;
+    int i, match;
+
+    if (argc != 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " list pattern\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (Tcl_SplitList(interp, argv[1], &listArgc, &listArgv) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    match = -1;
+    for (i = 0; i < listArgc; i++) {
+       if (Tcl_StringMatch(listArgv[i], argv[2])) {
+           match = i;
+           break;
+       }
+    }
+    sprintf(interp->result, "%d", match);
+    ckfree((char *) listArgv);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_LsortCmd --
+ *
+ *     This procedure is invoked to process the "lsort" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_LsortCmd(notUsed, interp, argc, argv)
+    ClientData notUsed;                        /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int listArgc;
+    char **listArgv;
+
+    if (argc != 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " list\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (Tcl_SplitList(interp, argv[1], &listArgc, &listArgv) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    qsort((VOID *) listArgv, listArgc, sizeof (char *), SortCompareProc);
+    interp->result = Tcl_Merge(listArgc, listArgv);
+    interp->freeProc = (Tcl_FreeProc *) free;
+    ckfree((char *) listArgv);
+    return TCL_OK;
+}
+
+/*
+ * The procedure below is called back by qsort to determine
+ * the proper ordering between two elements.
+ */
+
+static int
+SortCompareProc(first, second)
+    CONST VOID *first, *second;                /* Elements to be compared. */
+{
+    return strcmp(*((char **) first), *((char **) second));
+}
diff --git a/src/tcl/tclcmdmz.c b/src/tcl/tclcmdmz.c
new file mode 100644 (file)
index 0000000..92eae5e
--- /dev/null
@@ -0,0 +1,1420 @@
+/* 
+ * tclCmdMZ.c --
+ *
+ *     This file contains the top-level command routines for most of
+ *     the Tcl built-in commands whose names begin with the letters
+ *     M to Z.  It contains only commands in the generic core (i.e.
+ *     those that don't depend much upon UNIX facilities).
+ *
+ * Copyright 1987-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclCmdMZ.c,v 1.13 92/04/23 11:07:54 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tclint.h"
+
+/*
+ * Structure used to hold information about variable traces:
+ */
+
+typedef struct {
+    int flags;                 /* Operations for which Tcl command is
+                                * to be invoked. */
+    int length;                        /* Number of non-NULL chars. in command. */
+    char command[4];           /* Space for Tcl command to invoke.  Actual
+                                * size will be as large as necessary to
+                                * hold command.  This field must be the
+                                * last in the structure, so that it can
+                                * be larger than 4 bytes. */
+} TraceVarInfo;
+
+/*
+ * Forward declarations for procedures defined in this file:
+ */
+
+static char *          TraceVarProc _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, char *name1, char *name2,
+                           int flags));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_RegexpCmd --
+ *
+ *     This procedure is invoked to process the "regexp" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_RegexpCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int noCase = 0;
+    int indices = 0;
+    regexp *regexpPtr;
+    char **argPtr, *string;
+    int match, i;
+
+    if (argc < 3) {
+       wrongNumArgs:
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " ?-nocase? exp string ?matchVar? ?subMatchVar ",
+               "subMatchVar ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    argPtr = argv+1;
+    argc--;
+    while ((argc > 0) && (argPtr[0][0] == '-')) {
+       if (strcmp(argPtr[0], "-indices") == 0) {
+           argPtr++;
+           argc--;
+           indices = 1;
+       } else if (strcmp(argPtr[0], "-nocase") == 0) {
+           argPtr++;
+           argc--;
+           noCase = 1;
+       } else {
+           break;
+       }
+    }
+    if (argc < 2) {
+       goto wrongNumArgs;
+    }
+    regexpPtr = TclCompileRegexp(interp, argPtr[0]);
+    if (regexpPtr == NULL) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * Convert the string to lower case, if desired, and perform
+     * the match.
+     */
+
+    if (noCase) {
+       register char *dst, *src;
+
+       string = (char *) ckalloc((unsigned) (strlen(argPtr[1]) + 1));
+       for (src = argPtr[1], dst = string; *src != 0; src++, dst++) {
+           if (isupper(*src)) {
+               *dst = tolower(*src);
+           } else {
+               *dst = *src;
+           }
+       }
+       *dst = 0;
+    } else {
+       string = argPtr[1];
+    }
+    tclRegexpError = NULL;
+    match = regexec(regexpPtr, string);
+    if (string != argPtr[1]) {
+       ckfree(string);
+    }
+    if (tclRegexpError != NULL) {
+       Tcl_AppendResult(interp, "error while matching pattern: ",
+               tclRegexpError, (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (!match) {
+       interp->result = "0";
+       return TCL_OK;
+    }
+
+    /*
+     * If additional variable names have been specified, return
+     * index information in those variables.
+     */
+
+    argc -= 2;
+    if (argc > NSUBEXP) {
+       interp->result = "too many substring variables";
+       return TCL_ERROR;
+    }
+    for (i = 0; i < argc; i++) {
+       char *result, info[50];
+
+       if (regexpPtr->startp[i] == NULL) {
+           if (indices) {
+               result = Tcl_SetVar(interp, argPtr[i+2], "-1 -1", 0);
+           } else {
+               result = Tcl_SetVar(interp, argPtr[i+2], "", 0);
+           }
+       } else {
+           if (indices) {
+               sprintf(info, "%d %d", regexpPtr->startp[i] - string,
+                       regexpPtr->endp[i] - string - 1);
+               result = Tcl_SetVar(interp, argPtr[i+2], info, 0);
+           } else {
+               char savedChar, *first, *last;
+
+               first = argPtr[1] + (regexpPtr->startp[i] - string);
+               last = argPtr[1] + (regexpPtr->endp[i] - string);
+               savedChar = *last;
+               *last = 0;
+               result = Tcl_SetVar(interp, argPtr[i+2], first, 0);
+               *last = savedChar;
+           }
+       }
+       if (result == NULL) {
+           Tcl_AppendResult(interp, "couldn't set variable \"",
+                   argPtr[i+2], "\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+    }
+    interp->result = "1";
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_RegsubCmd --
+ *
+ *     This procedure is invoked to process the "regsub" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_RegsubCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int noCase = 0, all = 0;
+    regexp *regexpPtr;
+    char *string, *p, *firstChar, *newValue, **argPtr;
+    int match, result, flags;
+    register char *src, c;
+
+    if (argc < 5) {
+       wrongNumArgs:
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " ?-nocase? ?-all? exp string subSpec varName\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    argPtr = argv+1;
+    argc--;
+    while (argPtr[0][0] == '-') {
+       if (strcmp(argPtr[0], "-nocase") == 0) {
+           argPtr++;
+           argc--;
+           noCase = 1;
+       } else if (strcmp(argPtr[0], "-all") == 0) {
+           argPtr++;
+           argc--;
+           all = 1;
+       } else {
+           break;
+       }
+    }
+    if (argc != 4) {
+       goto wrongNumArgs;
+    }
+    regexpPtr = TclCompileRegexp(interp, argPtr[0]);
+    if (regexpPtr == NULL) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * Convert the string to lower case, if desired.
+     */
+
+    if (noCase) {
+       register char *dst;
+
+       string = (char *) ckalloc((unsigned) (strlen(argPtr[1]) + 1));
+       for (src = argPtr[1], dst = string; *src != 0; src++, dst++) {
+           if (isupper(*src)) {
+               *dst = tolower(*src);
+           } else {
+               *dst = *src;
+           }
+       }
+       *dst = 0;
+    } else {
+       string = argPtr[1];
+    }
+
+    /*
+     * The following loop is to handle multiple matches within the
+     * same source string;  each iteration handles one match and its
+     * corresponding substitution.  If "-all" hasn't been specified
+     * then the loop body only gets executed once.
+     */
+
+    flags = 0;
+    for (p = string; *p != 0; ) {
+       tclRegexpError = NULL;
+       match = regexec(regexpPtr, p);
+       if (tclRegexpError != NULL) {
+           Tcl_AppendResult(interp, "error while matching pattern: ",
+                   tclRegexpError, (char *) NULL);
+           result = TCL_ERROR;
+           goto done;
+       }
+       if (!match) {
+           break;
+       }
+
+       /*
+        * Copy the portion of the source string before the match to the
+        * result variable.
+        */
+    
+       src = argPtr[1] + (regexpPtr->startp[0] - string);
+       c = *src;
+       *src = 0;
+       newValue = Tcl_SetVar(interp, argPtr[3], argPtr[1] + (p - string),
+               flags);
+       *src = c;
+       flags = TCL_APPEND_VALUE;
+       if (newValue == NULL) {
+           cantSet:
+           Tcl_AppendResult(interp, "couldn't set variable \"",
+                   argPtr[3], "\"", (char *) NULL);
+           result = TCL_ERROR;
+           goto done;
+       }
+    
+       /*
+        * Append the subSpec argument to the variable, making appropriate
+        * substitutions.  This code is a bit hairy because of the backslash
+        * conventions and because the code saves up ranges of characters in
+        * subSpec to reduce the number of calls to Tcl_SetVar.
+        */
+    
+       for (src = firstChar = argPtr[2], c = *src; c != 0; src++, c = *src) {
+           int index;
+    
+           if (c == '&') {
+               index = 0;
+           } else if (c == '\\') {
+               c = src[1];
+               if ((c >= '0') && (c <= '9')) {
+                   index = c - '0';
+               } else if ((c == '\\') || (c == '&')) {
+                   *src = c;
+                   src[1] = 0;
+                   newValue = Tcl_SetVar(interp, argPtr[3], firstChar,
+                           TCL_APPEND_VALUE);
+                   *src = '\\';
+                   src[1] = c;
+                   if (newValue == NULL) {
+                       goto cantSet;
+                   }
+                   firstChar = src+2;
+                   src++;
+                   continue;
+               } else {
+                   continue;
+               }
+           } else {
+               continue;
+           }
+           if (firstChar != src) {
+               c = *src;
+               *src = 0;
+               newValue = Tcl_SetVar(interp, argPtr[3], firstChar,
+                       TCL_APPEND_VALUE);
+               *src = c;
+               if (newValue == NULL) {
+                   goto cantSet;
+               }
+           }
+           if ((index < NSUBEXP) && (regexpPtr->startp[index] != NULL)
+                   && (regexpPtr->endp[index] != NULL)) {
+               char *first, *last, saved;
+    
+               first = argPtr[1] + (regexpPtr->startp[index] - string);
+               last = argPtr[1] + (regexpPtr->endp[index] - string);
+               saved = *last;
+               *last = 0;
+               newValue = Tcl_SetVar(interp, argPtr[3], first,
+                       TCL_APPEND_VALUE);
+               *last = saved;
+               if (newValue == NULL) {
+                   goto cantSet;
+               }
+           }
+           if (*src == '\\') {
+               src++;
+           }
+           firstChar = src+1;
+       }
+       if (firstChar != src) {
+           if (Tcl_SetVar(interp, argPtr[3], firstChar,
+                   TCL_APPEND_VALUE) == NULL) {
+               goto cantSet;
+           }
+       }
+       p = regexpPtr->endp[0];
+       if (!all) {
+           break;
+       }
+    }
+
+    /*
+     * If there were no matches at all, then return a "0" result.
+     */
+
+    if (p == string) {
+       interp->result = "0";
+       result = TCL_OK;
+       goto done;
+    }
+
+    /*
+     * Copy the portion of the source string after the last match to the
+     * result variable.
+     */
+
+    if (*p != 0) {
+       if (Tcl_SetVar(interp, argPtr[3], p, TCL_APPEND_VALUE) == NULL) {
+           goto cantSet;
+       }
+    }
+    interp->result = "1";
+    result = TCL_OK;
+
+    done:
+    if (string != argPtr[1]) {
+       ckfree(string);
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_RenameCmd --
+ *
+ *     This procedure is invoked to process the "rename" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_RenameCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    register Command *cmdPtr;
+    Interp *iPtr = (Interp *) interp;
+    Tcl_HashEntry *hPtr;
+    int new;
+
+    if (argc != 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " oldName newName\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (argv[2][0] == '\0') {
+       if (Tcl_DeleteCommand(interp, argv[1]) != 0) {
+           Tcl_AppendResult(interp, "can't delete \"", argv[1],
+                   "\": command doesn't exist", (char *) NULL);
+           return TCL_ERROR;
+       }
+       return TCL_OK;
+    }
+    hPtr = Tcl_FindHashEntry(&iPtr->commandTable, argv[2]);
+    if (hPtr != NULL) {
+       Tcl_AppendResult(interp, "can't rename to \"", argv[2],
+               "\": command already exists", (char *) NULL);
+       return TCL_ERROR;
+    }
+    hPtr = Tcl_FindHashEntry(&iPtr->commandTable, argv[1]);
+    if (hPtr == NULL) {
+       Tcl_AppendResult(interp, "can't rename \"", argv[1],
+               "\":  command doesn't exist", (char *) NULL);
+       return TCL_ERROR;
+    }
+    cmdPtr = (Command *) Tcl_GetHashValue(hPtr);
+    Tcl_DeleteHashEntry(hPtr);
+    hPtr = Tcl_CreateHashEntry(&iPtr->commandTable, argv[2], &new);
+    Tcl_SetHashValue(hPtr, cmdPtr);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ReturnCmd --
+ *
+ *     This procedure is invoked to process the "return" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_ReturnCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    if (argc > 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " ?value?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (argc == 2) {
+       Tcl_SetResult(interp, argv[1], TCL_VOLATILE);
+    }
+    return TCL_RETURN;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ScanCmd --
+ *
+ *     This procedure is invoked to process the "scan" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_ScanCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int arg1Length;                    /* Number of bytes in argument to be
+                                        * scanned.  This gives an upper limit
+                                        * on string field sizes. */
+#   define MAX_FIELDS 20
+    typedef struct {
+       char fmt;                       /* Format for field. */
+       int size;                       /* How many bytes to allow for
+                                        * field. */
+       char *location;                 /* Where field will be stored. */
+    } Field;
+    Field fields[MAX_FIELDS];          /* Info about all the fields in the
+                                        * format string. */
+    register Field *curField;
+    int numFields = 0;                 /* Number of fields actually
+                                        * specified. */
+    int suppress;                      /* Current field is assignment-
+                                        * suppressed. */
+    int totalSize = 0;                 /* Number of bytes needed to store
+                                        * all results combined. */
+    char *results;                     /* Where scanned output goes.  */
+    int numScanned;                    /* sscanf's result. */
+    register char *fmt;
+    int i, widthSpecified;
+
+    if (argc < 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " string format ?varName varName ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * This procedure operates in four stages:
+     * 1. Scan the format string, collecting information about each field.
+     * 2. Allocate an array to hold all of the scanned fields.
+     * 3. Call sscanf to do all the dirty work, and have it store the
+     *    parsed fields in the array.
+     * 4. Pick off the fields from the array and assign them to variables.
+     */
+
+    arg1Length = (strlen(argv[1]) + 4) & ~03;
+    for (fmt = argv[2]; *fmt != 0; fmt++) {
+       if (*fmt != '%') {
+           continue;
+       }
+       fmt++;
+       if (*fmt == '*') {
+           suppress = 1;
+           fmt++;
+       } else {
+           suppress = 0;
+       }
+       widthSpecified = 0;
+       while (isdigit(*fmt)) {
+           widthSpecified = 1;
+           fmt++;
+       }
+       if (suppress) {
+           continue;
+       }
+       if (numFields == MAX_FIELDS) {
+           interp->result = "too many fields to scan";
+           return TCL_ERROR;
+       }
+       curField = &fields[numFields];
+       numFields++;
+       switch (*fmt) {
+           case 'D':
+           case 'O':
+           case 'X':
+           case 'd':
+           case 'o':
+           case 'x':
+               curField->fmt = 'd';
+               curField->size = sizeof(int);
+               break;
+
+           case 's':
+               curField->fmt = 's';
+               curField->size = arg1Length;
+               break;
+
+           case 'c':
+                if (widthSpecified) {
+                    interp->result = 
+                         "field width may not be specified in %c conversion";
+                    return TCL_ERROR;
+                }
+               curField->fmt = 'c';
+               curField->size = sizeof(int);
+               break;
+
+           case 'E':
+           case 'F':
+               curField->fmt = 'F';
+               curField->size = sizeof(double);
+               break;
+
+           case 'e':
+           case 'f':
+               curField->fmt = 'f';
+               curField->size = sizeof(float);
+               break;
+
+           case '[':
+               curField->fmt = 's';
+               curField->size = arg1Length;
+               do {
+                   fmt++;
+               } while (*fmt != ']');
+               break;
+
+           default:
+               sprintf(interp->result, "bad scan conversion character \"%c\"",
+                       *fmt);
+               return TCL_ERROR;
+       }
+       totalSize += curField->size;
+    }
+
+    if (numFields != (argc-3)) {
+       interp->result =
+               "different numbers of variable names and field specifiers";
+       return TCL_ERROR;
+    }
+
+    /*
+     * Step 2:
+     */
+
+    results = (char *) ckalloc((unsigned) totalSize);
+    for (i = 0, totalSize = 0, curField = fields;
+           i < numFields; i++, curField++) {
+       curField->location = results + totalSize;
+       totalSize += curField->size;
+    }
+
+    /*
+     * Step 3:
+     */
+
+    numScanned = sscanf(argv[1], argv[2],
+           fields[0].location, fields[1].location, fields[2].location,
+           fields[3].location, fields[4].location, fields[5].location,
+           fields[6].location, fields[7].location, fields[8].location,
+           fields[9].location, fields[10].location, fields[11].location,
+           fields[12].location, fields[13].location, fields[14].location,
+           fields[15].location, fields[16].location, fields[17].location,
+           fields[18].location, fields[19].location);
+
+    /*
+     * Step 4:
+     */
+
+    if (numScanned < numFields) {
+       numFields = numScanned;
+    }
+    for (i = 0, curField = fields; i < numFields; i++, curField++) {
+       switch (curField->fmt) {
+           char string[120];
+
+           case 'd':
+               sprintf(string, "%d", *((int *) curField->location));
+               if (Tcl_SetVar(interp, argv[i+3], string, 0) == NULL) {
+                   storeError:
+                   Tcl_AppendResult(interp,
+                           "couldn't set variable \"", argv[i+3], "\"",
+                           (char *) NULL);
+                   ckfree((char *) results);
+                   return TCL_ERROR;
+               }
+               break;
+
+           case 'c':
+               sprintf(string, "%d", *((char *) curField->location) & 0xff);
+               if (Tcl_SetVar(interp, argv[i+3], string, 0) == NULL) {
+                   goto storeError;
+               }
+               break;
+
+           case 's':
+               if (Tcl_SetVar(interp, argv[i+3], curField->location, 0)
+                       == NULL) {
+                   goto storeError;
+               }
+               break;
+
+           case 'F':
+               sprintf(string, "%g", *((double *) curField->location));
+               if (Tcl_SetVar(interp, argv[i+3], string, 0) == NULL) {
+                   goto storeError;
+               }
+               break;
+
+           case 'f':
+               sprintf(string, "%g", *((float *) curField->location));
+               if (Tcl_SetVar(interp, argv[i+3], string, 0) == NULL) {
+                   goto storeError;
+               }
+               break;
+       }
+    }
+    ckfree(results);
+    sprintf(interp->result, "%d", numScanned);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_SplitCmd --
+ *
+ *     This procedure is invoked to process the "split" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_SplitCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    char *splitChars;
+    register char *p, *p2;
+    char *elementStart;
+
+    if (argc == 2) {
+       splitChars = " \n\t\r";
+    } else if (argc == 3) {
+       splitChars = argv[2];
+    } else {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " string ?splitChars?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Handle the special case of splitting on every character.
+     */
+
+    if (*splitChars == 0) {
+       char string[2];
+       string[1] = 0;
+       for (p = argv[1]; *p != 0; p++) {
+           string[0] = *p;
+           Tcl_AppendElement(interp, string, 0);
+       }
+       return TCL_OK;
+    }
+
+    /*
+     * Normal case: split on any of a given set of characters.
+     * Discard instances of the split characters.
+     */
+
+    for (p = elementStart = argv[1]; *p != 0; p++) {
+       char c = *p;
+       for (p2 = splitChars; *p2 != 0; p2++) {
+           if (*p2 == c) {
+               *p = 0;
+               Tcl_AppendElement(interp, elementStart, 0);
+               *p = c;
+               elementStart = p+1;
+               break;
+           }
+       }
+    }
+    if (p != argv[1]) {
+       Tcl_AppendElement(interp, elementStart, 0);
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_StringCmd --
+ *
+ *     This procedure is invoked to process the "string" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_StringCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int length;
+    register char *p, c;
+    int match;
+    int first;
+    int left = 0, right = 0;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " option arg ?arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'c') && (strncmp(argv[1], "compare", length) == 0)) {
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " compare string1 string2\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       match = strcmp(argv[2], argv[3]);
+       if (match > 0) {
+           interp->result = "1";
+       } else if (match < 0) {
+           interp->result = "-1";
+       } else {
+           interp->result = "0";
+       }
+       return TCL_OK;
+    } else if ((c == 'f') && (strncmp(argv[1], "first", length) == 0)) {
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " first string1 string2\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       first = 1;
+
+       firstLast:
+       match = -1;
+       c = *argv[2];
+       length = strlen(argv[2]);
+       for (p = argv[3]; *p != 0; p++) {
+           if (*p != c) {
+               continue;
+           }
+           if (strncmp(argv[2], p, length) == 0) {
+               match = p-argv[3];
+               if (first) {
+                   break;
+               }
+           }
+       }
+       sprintf(interp->result, "%d", match);
+       return TCL_OK;
+    } else if ((c == 'i') && (strncmp(argv[1], "index", length) == 0)) {
+       int index;
+
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " index string charIndex\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (Tcl_GetInt(interp, argv[3], &index) != TCL_OK) {
+           return TCL_ERROR;
+       }
+       if ((index >= 0) && (index < strlen(argv[2]))) {
+           interp->result[0] = argv[2][index];
+           interp->result[1] = 0;
+       }
+       return TCL_OK;
+    } else if ((c == 'l') && (strncmp(argv[1], "last", length) == 0)
+           && (length >= 2)) {
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " last string1 string2\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       first = 0;
+       goto firstLast;
+    } else if ((c == 'l') && (strncmp(argv[1], "length", length) == 0)
+           && (length >= 2)) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " length string\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       sprintf(interp->result, "%d", strlen(argv[2]));
+       return TCL_OK;
+    } else if ((c == 'm') && (strncmp(argv[1], "match", length) == 0)) {
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " match pattern string\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (Tcl_StringMatch(argv[3], argv[2]) != 0) {
+           interp->result = "1";
+       } else {
+           interp->result = "0";
+       }
+       return TCL_OK;
+    } else if ((c == 'r') && (strncmp(argv[1], "range", length) == 0)) {
+       int first, last, stringLength;
+
+       if (argc != 5) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " range string first last\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       stringLength = strlen(argv[2]);
+       if (Tcl_GetInt(interp, argv[3], &first) != TCL_OK) {
+           return TCL_ERROR;
+       }
+       if ((*argv[4] == 'e')
+               && (strncmp(argv[4], "end", strlen(argv[4])) == 0)) {
+           last = stringLength-1;
+       } else {
+           if (Tcl_GetInt(interp, argv[4], &last) != TCL_OK) {
+               Tcl_ResetResult(interp);
+               Tcl_AppendResult(interp,
+                       "expected integer or \"end\" but got \"",
+                       argv[4], "\"", (char *) NULL);
+               return TCL_ERROR;
+           }
+       }
+       if (first < 0) {
+           first = 0;
+       }
+       if (last >= stringLength) {
+           last = stringLength-1;
+       }
+       if (last >= first) {
+           char saved, *p;
+
+           p = argv[2] + last + 1;
+           saved = *p;
+           *p = 0;
+           Tcl_SetResult(interp, argv[2] + first, TCL_VOLATILE);
+           *p = saved;
+       }
+       return TCL_OK;
+    } else if ((c == 't') && (strncmp(argv[1], "tolower", length) == 0)
+           && (length >= 3)) {
+       register char *p;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " tolower string\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       Tcl_SetResult(interp, argv[2], TCL_VOLATILE);
+       for (p = interp->result; *p != 0; p++) {
+           if (isupper(*p)) {
+               *p = tolower(*p);
+           }
+       }
+       return TCL_OK;
+    } else if ((c == 't') && (strncmp(argv[1], "toupper", length) == 0)
+           && (length >= 3)) {
+       register char *p;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " toupper string\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       Tcl_SetResult(interp, argv[2], TCL_VOLATILE);
+       for (p = interp->result; *p != 0; p++) {
+           if (islower(*p)) {
+               *p = toupper(*p);
+           }
+       }
+       return TCL_OK;
+    } else if ((c == 't') && (strncmp(argv[1], "trim", length) == 0)
+           && (length == 4)) {
+       char *trimChars;
+       register char *p, *checkPtr;
+
+       left = right = 1;
+
+       trim:
+       if (argc == 4) {
+           trimChars = argv[3];
+       } else if (argc == 3) {
+           trimChars = " \t\n\r";
+       } else {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " ", argv[1], " string ?chars?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       p = argv[2];
+       if (left) {
+           for (c = *p; c != 0; p++, c = *p) {
+               for (checkPtr = trimChars; *checkPtr != c; checkPtr++) {
+                   if (*checkPtr == 0) {
+                       goto doneLeft;
+                   }
+               }
+           }
+       }
+       doneLeft:
+       Tcl_SetResult(interp, p, TCL_VOLATILE);
+       if (right) {
+           char *donePtr;
+
+           p = interp->result + strlen(interp->result) - 1;
+           donePtr = &interp->result[-1];
+           for (c = *p; p != donePtr; p--, c = *p) {
+               for (checkPtr = trimChars; *checkPtr != c; checkPtr++) {
+                   if (*checkPtr == 0) {
+                       goto doneRight;
+                   }
+               }
+           }
+           doneRight:
+           p[1] = 0;
+       }
+       return TCL_OK;
+    } else if ((c == 't') && (strncmp(argv[1], "trimleft", length) == 0)
+           && (length > 4)) {
+       left = 1;
+       argv[1] = "trimleft";
+       goto trim;
+    } else if ((c == 't') && (strncmp(argv[1], "trimright", length) == 0)
+           && (length > 4)) {
+       right = 1;
+       argv[1] = "trimright";
+       goto trim;
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\": should be compare, first, index, last, length, match, ",
+               "range, tolower, toupper, trim, trimleft, or trimright",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_TraceCmd --
+ *
+ *     This procedure is invoked to process the "trace" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_TraceCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    char c;
+    int length;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "too few args: should be \"",
+               argv[0], " option [arg arg ...]\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    c = argv[1][1];
+    length = strlen(argv[1]);
+    if ((c == 'a') && (strncmp(argv[1], "variable", length) == 0)
+           && (length >= 2)) {
+       char *p;
+       int flags, length;
+       TraceVarInfo *tvarPtr;
+
+       if (argc != 5) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " variable name ops command\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+
+       flags = 0;
+       for (p = argv[3] ; *p != 0; p++) {
+           if (*p == 'r') {
+               flags |= TCL_TRACE_READS;
+           } else if (*p == 'w') {
+               flags |= TCL_TRACE_WRITES;
+           } else if (*p == 'u') {
+               flags |= TCL_TRACE_UNSETS;
+           } else {
+               goto badOps;
+           }
+       }
+       if (flags == 0) {
+           goto badOps;
+       }
+
+       length = strlen(argv[4]);
+       tvarPtr = (TraceVarInfo *) ckalloc((unsigned)
+               (sizeof(TraceVarInfo) - sizeof(tvarPtr->command) + length + 1));
+       tvarPtr->flags = flags;
+       tvarPtr->length = length;
+       flags |= TCL_TRACE_UNSETS;
+       strcpy(tvarPtr->command, argv[4]);
+       if (Tcl_TraceVar(interp, argv[2], flags, TraceVarProc,
+               (ClientData) tvarPtr) != TCL_OK) {
+           ckfree((char *) tvarPtr);
+           return TCL_ERROR;
+       }
+    } else if ((c == 'd') && (strncmp(argv[1], "vdelete", length)
+           && (length >= 2)) == 0) {
+       char *p;
+       int flags, length;
+       TraceVarInfo *tvarPtr;
+       ClientData clientData;
+
+       if (argc != 5) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " vdelete name ops command\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+
+       flags = 0;
+       for (p = argv[3] ; *p != 0; p++) {
+           if (*p == 'r') {
+               flags |= TCL_TRACE_READS;
+           } else if (*p == 'w') {
+               flags |= TCL_TRACE_WRITES;
+           } else if (*p == 'u') {
+               flags |= TCL_TRACE_UNSETS;
+           } else {
+               goto badOps;
+           }
+       }
+       if (flags == 0) {
+           goto badOps;
+       }
+
+       /*
+        * Search through all of our traces on this variable to
+        * see if there's one with the given command.  If so, then
+        * delete the first one that matches.
+        */
+
+       length = strlen(argv[4]);
+       clientData = 0;
+       while ((clientData = Tcl_VarTraceInfo(interp, argv[2], 0,
+               TraceVarProc, clientData)) != 0) {
+           tvarPtr = (TraceVarInfo *) clientData;
+           if ((tvarPtr->length == length) && (tvarPtr->flags == flags)
+                   && (strncmp(argv[4], tvarPtr->command, length) == 0)) {
+               Tcl_UntraceVar(interp, argv[2], flags | TCL_TRACE_UNSETS,
+                       TraceVarProc, clientData);
+               ckfree((char *) tvarPtr);
+               break;
+           }
+       }
+    } else if ((c == 'i') && (strncmp(argv[1], "vinfo", length) == 0)
+           && (length >= 2)) {
+       ClientData clientData;
+       char ops[4], *p;
+       char *prefix = "{";
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " vinfo name\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       clientData = 0;
+       while ((clientData = Tcl_VarTraceInfo(interp, argv[2], 0,
+               TraceVarProc, clientData)) != 0) {
+           TraceVarInfo *tvarPtr = (TraceVarInfo *) clientData;
+           p = ops;
+           if (tvarPtr->flags & TCL_TRACE_READS) {
+               *p = 'r';
+               p++;
+           }
+           if (tvarPtr->flags & TCL_TRACE_WRITES) {
+               *p = 'w';
+               p++;
+           }
+           if (tvarPtr->flags & TCL_TRACE_UNSETS) {
+               *p = 'u';
+               p++;
+           }
+           *p = '\0';
+           Tcl_AppendResult(interp, prefix, (char *) NULL);
+           Tcl_AppendElement(interp, ops, 1);
+           Tcl_AppendElement(interp, tvarPtr->command, 0);
+           Tcl_AppendResult(interp, "}", (char *) NULL);
+           prefix = " {";
+       }
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\": should be variable, vdelete, or vinfo",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+
+    badOps:
+    Tcl_AppendResult(interp, "bad operations \"", argv[3],
+           "\": should be one or more of rwu", (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TraceVarProc --
+ *
+ *     This procedure is called to handle variable accesses that have
+ *     been traced using the "trace" command.
+ *
+ * Results:
+ *     Normally returns NULL.  If the trace command returns an error,
+ *     then this procedure returns an error string.
+ *
+ * Side effects:
+ *     Depends on the command associated with the trace.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static char *
+TraceVarProc(clientData, interp, name1, name2, flags)
+    ClientData clientData;     /* Information about the variable trace. */
+    Tcl_Interp *interp;                /* Interpreter containing variable. */
+    char *name1;               /* Name of variable or array. */
+    char *name2;               /* Name of element within array;  NULL means
+                                * scalar variable is being referenced. */
+    int flags;                 /* OR-ed bits giving operation and other
+                                * information. */
+{
+    TraceVarInfo *tvarPtr = (TraceVarInfo *) clientData;
+    char *result;
+    int code, cmdLength, flags1, flags2;
+    Interp dummy;
+#define STATIC_SIZE 199
+    char staticSpace[STATIC_SIZE+1];
+    char *cmdPtr, *p;
+
+    result = NULL;
+    if ((tvarPtr->flags & flags) && !(flags & TCL_INTERP_DESTROYED)) {
+
+       /*
+        * Generate a command to execute by appending list elements
+        * for the two variable names and the operation.  The five
+        * extra characters are for three space, the opcode character,
+        * and the terminating null.
+        */
+
+       if (name2 == NULL) {
+           name2 = "";
+       }
+       cmdLength = tvarPtr->length + Tcl_ScanElement(name1, &flags1) +
+               Tcl_ScanElement(name2, &flags2) + 5;
+       if (cmdLength < STATIC_SIZE) {
+           cmdPtr = staticSpace;
+       } else {
+           cmdPtr = (char *) ckalloc((unsigned) cmdLength);
+       }
+       p = cmdPtr;
+       strcpy(p, tvarPtr->command);
+       p += tvarPtr->length;
+       *p = ' ';
+       p++;
+       p += Tcl_ConvertElement(name1, p, flags1);
+       *p = ' ';
+       p++;
+       p += Tcl_ConvertElement(name2, p, flags2);
+       *p = ' ';
+       if (flags & TCL_TRACE_READS) {
+           p[1] = 'r';
+       } else if (flags & TCL_TRACE_WRITES) {
+           p[1] = 'w';
+       } else if (flags & TCL_TRACE_UNSETS) {
+           p[1] = 'u';
+       }
+       p[2] = '\0';
+
+       /*
+        * Execute the command.  Be careful to save and restore the
+        * result from the interpreter used for the command.
+        */
+
+       dummy.freeProc = interp->freeProc;
+       if (interp->freeProc == 0) {
+           Tcl_SetResult((Tcl_Interp *) &dummy, interp->result, TCL_VOLATILE);
+       } else {
+           dummy.result = interp->result;
+       }
+       code = Tcl_Eval(interp, cmdPtr, 0, (char **) NULL);
+       if (cmdPtr != staticSpace) {
+           ckfree(cmdPtr);
+       }
+       if (code != TCL_OK) {
+           result = "access disallowed by trace command";
+           Tcl_ResetResult(interp);            /* Must clear error state. */
+       }
+       Tcl_FreeResult(interp);
+       interp->result = dummy.result;
+       interp->freeProc = dummy.freeProc;
+    }
+    if (flags & TCL_TRACE_DESTROYED) {
+       ckfree((char *) tvarPtr);
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_WhileCmd --
+ *
+ *     This procedure is invoked to process the "while" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_WhileCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int result, value;
+
+    if (argc != 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " test command\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    while (1) {
+       result = Tcl_ExprBoolean(interp, argv[1], &value);
+       if (result != TCL_OK) {
+           return result;
+       }
+       if (!value) {
+           break;
+       }
+       result = Tcl_Eval(interp, argv[2], 0, (char **) NULL);
+       if (result == TCL_CONTINUE) {
+           result = TCL_OK;
+       } else if (result != TCL_OK) {
+           if (result == TCL_ERROR) {
+               char msg[60];
+               sprintf(msg, "\n    (\"while\" body line %d)",
+                       interp->errorLine);
+               Tcl_AddErrorInfo(interp, msg);
+           }
+           break;
+       }
+    }
+    if (result == TCL_BREAK) {
+       result = TCL_OK;
+    }
+    if (result == TCL_OK) {
+       Tcl_ResetResult(interp);
+    }
+    return result;
+}
diff --git a/src/tcl/tclenv.c b/src/tcl/tclenv.c
new file mode 100644 (file)
index 0000000..656ca53
--- /dev/null
@@ -0,0 +1,458 @@
+/* 
+ * tclEnv.c --
+ *
+ *     Tcl support for environment variables, including a setenv
+ *     procedure.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclEnv.c,v 1.7 91/09/23 11:22:21 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tclint.h"
+#include "tclunix.h"
+
+/*
+ * The structure below is used to keep track of all of the interpereters
+ * for which we're managing the "env" array.  It's needed so that they
+ * can all be updated whenever an environment variable is changed
+ * anywhere.
+ */
+
+typedef struct EnvInterp {
+    Tcl_Interp *interp;                /* Interpreter for which we're managing
+                                * the env array. */
+    struct EnvInterp *nextPtr; /* Next in list of all such interpreters,
+                                * or zero. */
+} EnvInterp;
+
+static EnvInterp *firstInterpPtr;
+                               /* First in list of all managed interpreters,
+                                * or NULL if none. */
+
+static int environSize = 0;    /* Non-zero means that the all of the
+                                * environ-related information is malloc-ed
+                                * and the environ array itself has this
+                                * many total entries allocated to it (not
+                                * all may be in use at once).  Zero means
+                                * that the environment array is in its
+                                * original static state. */
+
+/*
+ * Declarations for local procedures defined in this file:
+ */
+
+static void            EnvInit _ANSI_ARGS_((void));
+static char *          EnvTraceProc _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, char *name1, char *name2,
+                           int flags));
+static int             FindVariable _ANSI_ARGS_((char *name, int *lengthPtr));
+
+#ifdef IS_LINUX
+int                    setenv _ANSI_ARGS_((const char *name, const char *value, int replace));
+int                    unsetenv _ANSI_ARGS_((const char *name));
+#else
+void                   setenv _ANSI_ARGS_((char *name, char *value));
+void                   unsetenv _ANSI_ARGS_((char *name));
+#endif
+
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclSetupEnv --
+ *
+ *     This procedure is invoked for an interpreter to make environment
+ *     variables accessible from that interpreter via the "env"
+ *     associative array.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The interpreter is added to a list of interpreters managed
+ *     by us, so that its view of envariables can be kept consistent
+ *     with the view in other interpreters.  If this is the first
+ *     call to Tcl_SetupEnv, then additional initialization happens,
+ *     such as copying the environment to dynamically-allocated space
+ *     for ease of management.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TclSetupEnv(interp)
+    Tcl_Interp *interp;                /* Interpreter whose "env" array is to be
+                                * managed. */
+{
+    EnvInterp *eiPtr;
+    int i;
+
+    /*
+     * First, initialize our environment-related information, if
+     * necessary.
+     */
+
+    if (environSize == 0) {
+       EnvInit();
+    }
+
+    /*
+     * Next, add the interpreter to the list of those that we manage.
+     */
+
+    eiPtr = (EnvInterp *) ckalloc(sizeof(EnvInterp));
+    eiPtr->interp = interp;
+    eiPtr->nextPtr = firstInterpPtr;
+    firstInterpPtr = eiPtr;
+
+    /*
+     * Store the environment variable values into the interpreter's
+     * "env" array, and arrange for us to be notified on future
+     * writes and unsets to that array.
+     */
+
+    (void) Tcl_UnsetVar2(interp, "env", (char *) NULL, TCL_GLOBAL_ONLY);
+    for (i = 0; ; i++) {
+       char *p, *p2;
+
+       p = environ[i];
+       if (p == NULL) {
+           break;
+       }
+       for (p2 = p; *p2 != '='; p2++) {
+           /* Empty loop body. */
+       }
+       *p2 = 0;
+       (void) Tcl_SetVar2(interp, "env", p, p2+1, TCL_GLOBAL_ONLY);
+       *p2 = '=';
+    }
+    Tcl_TraceVar2(interp, "env", (char *) NULL,
+           TCL_GLOBAL_ONLY | TCL_TRACE_WRITES | TCL_TRACE_UNSETS,
+           EnvTraceProc, (ClientData) NULL);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * FindVariable --
+ *
+ *     Locate the entry in environ for a given name.
+ *
+ * Results:
+ *     The return value is the index in environ of an entry with the
+ *     name "name", or -1 if there is no such entry.   The integer at
+ *     *lengthPtr is filled in with the length of name (if a matching
+ *     entry is found) or the length of the environ array (if no matching
+ *     entry is found).
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+FindVariable(name, lengthPtr)
+    char *name;                        /* Name of desired environment variable. */
+    int *lengthPtr;            /* Used to return length of name (for
+                                * successful searches) or number of non-NULL
+                                * entries in environ (for unsuccessful
+                                * searches). */
+{
+    int i;
+    register char *p1, *p2;
+
+    for (i = 0, p1 = environ[i]; p1 != NULL; i++, p1 = environ[i]) {
+       for (p2 = name; *p2 == *p1; p1++, p2++) {
+           /* NULL loop body. */
+       }
+       if ((*p1 == '=') && (*p2 == '\0')) {
+           *lengthPtr = p2-name;
+           return i;
+       }
+    }
+    *lengthPtr = i;
+    return -1;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * setenv --
+ *
+ *     Set an environment variable, replacing an existing value
+ *     or creating a new variable if there doesn't exist a variable
+ *     by the given name.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The environ array gets updated, as do all of the interpreters
+ *     that we manage.
+ *
+ *----------------------------------------------------------------------
+ */
+
+#ifdef IS_LINUX
+int
+setenv(name, value, replace)
+    const char *name;          /* Name of variable whose value is to be
+                                * set. */
+    const char *value;         /* New value for variable. */
+    int replace;
+#else
+void
+setenv(name, value)
+    char *name;                        /* Name of variable whose value is to be
+                                * set. */
+    char *value;               /* New value for variable. */
+#endif
+{
+    int index, length, nameLength;
+    char *p;
+    EnvInterp *eiPtr;
+
+    if (environSize == 0) {
+       EnvInit();
+    }
+
+    /*
+     * Figure out where the entry is going to go.  If the name doesn't
+     * already exist, enlarge the array if necessary to make room.  If
+     * the name exists, free its old entry.
+     */
+
+    index = FindVariable((char *)name, &length);
+    if (index == -1) {
+       if ((length+2) > environSize) {
+           char **newEnviron;
+
+           newEnviron = (char **) ckalloc((unsigned)
+                   ((length+5) * sizeof(char *)));
+           memcpy((VOID *) newEnviron, (VOID *) environ,
+                   length*sizeof(char *));
+           ckfree((char *) environ);
+           environ = newEnviron;
+           environSize = length+5;
+       }
+       index = length;
+       environ[index+1] = NULL;
+       nameLength = strlen(name);
+    } else {
+       ckfree(environ[index]);
+       nameLength = length;
+    }
+
+    /*
+     * Create a new entry and enter it into the table.
+     */
+
+    p = (char *) ckalloc((unsigned) (nameLength + strlen(value) + 2));
+    environ[index] = p;
+    strcpy(p, name);
+    p += nameLength;
+    *p = '=';
+    strcpy(p+1, value);
+
+    /*
+     * Update all of the interpreters.
+     */
+
+    for (eiPtr= firstInterpPtr; eiPtr != NULL; eiPtr = eiPtr->nextPtr) {
+       (void) Tcl_SetVar2(eiPtr->interp, "env", (char *)name, p+1, TCL_GLOBAL_ONLY);
+    }
+
+#ifdef IS_LINUX
+    return 0;
+#endif
+
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * unsetenv --
+ *
+ *     Remove an environment variable, updating the "env" arrays
+ *     in all interpreters managed by us.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Interpreters are updated, as is environ.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+unsetenv(name)
+#ifdef IS_LINUX
+    const char *name;                  /* Name of variable to remove. */
+#else
+    char *name;                        /* Name of variable to remove. */
+#endif
+{
+    int index, dummy;
+    char **envPtr;
+    EnvInterp *eiPtr;
+
+    if (environSize == 0) {
+       EnvInit();
+    }
+
+    /*
+     * Update the environ array.
+     */
+
+    index = FindVariable((char *)name, &dummy);
+    if (index == -1) {
+       return;
+    }
+    ckfree(environ[index]);
+    for (envPtr = environ+index+1; ; envPtr++) {
+       envPtr[-1] = *envPtr;
+       if (*envPtr == NULL) {
+           break;
+       }
+    }
+
+    /*
+     * Update all of the interpreters.
+     */
+
+    for (eiPtr = firstInterpPtr; eiPtr != NULL; eiPtr = eiPtr->nextPtr) {
+       (void) Tcl_UnsetVar2(eiPtr->interp, "env", (char *)name, TCL_GLOBAL_ONLY);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * EnvTraceProc --
+ *
+ *     This procedure is invoked whenever an environment variable
+ *     is modified or deleted.  It propagates the change to the
+ *     "environ" array and to any other interpreters for whom
+ *     we're managing an "env" array.
+ *
+ * Results:
+ *     Always returns NULL to indicate success.
+ *
+ * Side effects:
+ *     Environment variable changes get propagated.  If the whole
+ *     "env" array is deleted, then we stop managing things for
+ *     this interpreter (usually this happens because the whole
+ *     interpreter is being deleted).
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static char *
+EnvTraceProc(clientData, interp, name1, name2, flags)
+    ClientData clientData;     /* Not used. */
+    Tcl_Interp *interp;                /* Interpreter whose "env" variable is
+                                * being modified. */
+    char *name1;               /* Better be "env". */
+    char *name2;               /* Name of variable being modified, or
+                                * NULL if whole array is being deleted. */
+    int flags;                 /* Indicates what's happening. */
+{
+    /*
+     * First see if the whole "env" variable is being deleted.  If
+     * so, just forget about this interpreter.
+     */
+
+    if (name2 == NULL) {
+       register EnvInterp *eiPtr, *prevPtr;
+
+       if ((flags & (TCL_TRACE_UNSETS|TCL_TRACE_DESTROYED))
+               != (TCL_TRACE_UNSETS|TCL_TRACE_DESTROYED)) {
+           panic("EnvTraceProc called with confusing arguments");
+       }
+       eiPtr = firstInterpPtr;
+       if (eiPtr->interp == interp) {
+           firstInterpPtr = eiPtr->nextPtr;
+       } else {
+           for (prevPtr = eiPtr, eiPtr = eiPtr->nextPtr; ;
+                   prevPtr = eiPtr, eiPtr = eiPtr->nextPtr) {
+               if (eiPtr == NULL) {
+                   panic("EnvTraceProc couldn't find interpreter");
+               }
+               if (eiPtr->interp == interp) {
+                   prevPtr->nextPtr = eiPtr->nextPtr;
+                   break;
+               }
+           }
+       }
+       ckfree((char *) eiPtr);
+       return NULL;
+    }
+
+    /*
+     * If a value is being set, call setenv to do all of the work.
+     */
+
+    if (flags & TCL_TRACE_WRITES) {
+       setenv(name2, Tcl_GetVar2(interp, "env", name2, TCL_GLOBAL_ONLY), 0);
+    }
+
+    if (flags & TCL_TRACE_UNSETS) {
+       unsetenv(name2);
+    }
+    return NULL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * EnvInit --
+ *
+ *     This procedure is called to initialize our management
+ *     of the environ array.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Environ gets copied to malloc-ed storage, so that in
+ *     the future we don't have to worry about which entries
+ *     are malloc-ed and which are static.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+EnvInit()
+{
+    char **newEnviron;
+    int i, length;
+
+    if (environSize != 0) {
+       return;
+    }
+    for (length = 0; environ[length] != NULL; length++) {
+       /* Empty loop body. */
+    }
+    environSize = length+5;
+    newEnviron = (char **) ckalloc((unsigned)
+               (environSize * sizeof(char *)));
+    for (i = 0; i < length; i++) {
+       newEnviron[i] = (char *) ckalloc((unsigned) (strlen(environ[i]) + 1));
+       strcpy(newEnviron[i], environ[i]);
+    }
+    newEnviron[length] = NULL;
+    environ = newEnviron;
+}
diff --git a/src/tcl/tclexpr.c b/src/tcl/tclexpr.c
new file mode 100644 (file)
index 0000000..3be04f3
--- /dev/null
@@ -0,0 +1,1336 @@
+/* 
+ * tclExpr.c --
+ *
+ *     This file contains the code to evaluate expressions for
+ *     Tcl.
+ *
+ *     This implementation of floating-point support was modelled
+ *     after an initial implementation by Bill Carpenter.
+ *
+ * Copyright 1987-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclExpr.c,v 1.35 92/03/23 09:53:46 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tclint.h"
+
+/*
+ * The stuff below is a bit of a workaround so that this file can be used
+ * in environments that include no UNIX, i.e. no errno.  Just define
+ * errno here.
+ */
+
+#ifndef TCL_GENERIC_ONLY
+#include "tclunix.h"
+#else
+int errno;
+#define ERANGE 34
+#endif
+
+/*
+ * The data structure below is used to describe an expression value,
+ * which can be either an integer (the usual case), a double-precision
+ * floating-point value, or a string.  A given number has only one
+ * value at a time.
+ */
+
+#define STATIC_STRING_SPACE 150
+
+typedef struct {
+    long intValue;             /* Integer value, if any. */
+    double  doubleValue;       /* Floating-point value, if any. */
+    ParseValue pv;             /* Used to hold a string value, if any. */
+    char staticSpace[STATIC_STRING_SPACE];
+                               /* Storage for small strings;  large ones
+                                * are malloc-ed. */
+    int type;                  /* Type of value:  TYPE_INT, TYPE_DOUBLE,
+                                * or TYPE_STRING. */
+} Value;
+
+/*
+ * Valid values for type:
+ */
+
+#define TYPE_INT       0
+#define TYPE_DOUBLE    1
+#define TYPE_STRING    2
+
+
+/*
+ * The data structure below describes the state of parsing an expression.
+ * It's passed among the routines in this module.
+ */
+
+typedef struct {
+    char *originalExpr;                /* The entire expression, as originally
+                                * passed to Tcl_Expr. */
+    char *expr;                        /* Position to the next character to be
+                                * scanned from the expression string. */
+    int token;                 /* Type of the last token to be parsed from
+                                * expr.  See below for definitions.
+                                * Corresponds to the characters just
+                                * before expr. */
+} ExprInfo;
+
+/*
+ * The token types are defined below.  In addition, there is a table
+ * associating a precedence with each operator.  The order of types
+ * is important.  Consult the code before changing it.
+ */
+
+#define VALUE          0
+#define OPEN_PAREN     1
+#define CLOSE_PAREN    2
+#define END            3
+#define UNKNOWN                4
+
+/*
+ * Binary operators:
+ */
+
+#define MULT           8
+#define DIVIDE         9
+#define MOD            10
+#define PLUS           11
+#define MINUS          12
+#define LEFT_SHIFT     13
+#define RIGHT_SHIFT    14
+#define LESS           15
+#define GREATER                16
+#define LEQ            17
+#define GEQ            18
+#define EQUAL          19
+#define NEQ            20
+#define BIT_AND                21
+#define BIT_XOR                22
+#define BIT_OR         23
+#define AND            24
+#define OR             25
+#define QUESTY         26
+#define COLON          27
+
+/*
+ * Unary operators:
+ */
+
+#define        UNARY_MINUS     28
+#define NOT            29
+#define BIT_NOT                30
+
+/*
+ * Precedence table.  The values for non-operator token types are ignored.
+ */
+
+int precTable[] = {
+    0, 0, 0, 0, 0, 0, 0, 0,
+    11, 11, 11,                                /* MULT, DIVIDE, MOD */
+    10, 10,                            /* PLUS, MINUS */
+    9, 9,                              /* LEFT_SHIFT, RIGHT_SHIFT */
+    8, 8, 8, 8,                                /* LESS, GREATER, LEQ, GEQ */
+    7, 7,                              /* EQUAL, NEQ */
+    6,                                 /* BIT_AND */
+    5,                                 /* BIT_XOR */
+    4,                                 /* BIT_OR */
+    3,                                 /* AND */
+    2,                                 /* OR */
+    1, 1,                              /* QUESTY, COLON */
+    12, 12, 12                         /* UNARY_MINUS, NOT, BIT_NOT */
+};
+
+/*
+ * Mapping from operator numbers to strings;  used for error messages.
+ */
+
+char *operatorStrings[] = {
+    "VALUE", "(", ")", "END", "UNKNOWN", "5", "6", "7",
+    "*", "/", "%", "+", "-", "<<", ">>", "<", ">", "<=",
+    ">=", "==", "!=", "&", "^", "|", "&&", "||", "?", ":",
+    "-", "!", "~"
+};
+
+/*
+ * Declarations for local procedures to this file:
+ */
+
+static int             ExprGetValue _ANSI_ARGS_((Tcl_Interp *interp,
+                           ExprInfo *infoPtr, int prec, Value *valuePtr));
+static int             ExprLex _ANSI_ARGS_((Tcl_Interp *interp,
+                           ExprInfo *infoPtr, Value *valuePtr));
+static void            ExprMakeString _ANSI_ARGS_((Value *valuePtr));
+static int             ExprParseString _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, Value *valuePtr));
+static int             ExprTopLevel _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, Value *valuePtr));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ExprParseString --
+ *
+ *     Given a string (such as one coming from command or variable
+ *     substitution), make a Value based on the string.  The value
+ *     will be a floating-point or integer, if possible, or else it
+ *     will just be a copy of the string.
+ *
+ * Results:
+ *     TCL_OK is returned under normal circumstances, and TCL_ERROR
+ *     is returned if a floating-point overflow or underflow occurred
+ *     while reading in a number.  The value at *valuePtr is modified
+ *     to hold a number, if possible.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ExprParseString(interp, string, valuePtr)
+    Tcl_Interp *interp;                /* Where to store error message. */
+    char *string;              /* String to turn into value. */
+    Value *valuePtr;           /* Where to store value information. 
+                                * Caller must have initialized pv field. */
+{
+    register char c;
+
+    /*
+     * Try to convert the string to a number.
+     */
+
+    c = *string;
+    if (((c >= '0') && (c <= '9')) || (c == '-') || (c == '.')) {
+       char *term;
+
+       valuePtr->type = TYPE_INT;
+       errno = 0;
+       valuePtr->intValue = strtol(string, &term, 0);
+       c = *term;
+       if ((c == '\0') && (errno != ERANGE)) {
+           return TCL_OK;
+       }
+       if ((c == '.') || (c == 'e') || (c == 'E') || (errno == ERANGE)) {
+           errno = 0;
+           valuePtr->doubleValue = strtod(string, &term);
+           if (errno == ERANGE) {
+               Tcl_ResetResult(interp);
+               if (valuePtr->doubleValue == 0.0) {
+                   Tcl_AppendResult(interp, "floating-point value \"",
+                           string, "\" too small to represent",
+                           (char *) NULL);
+               } else {
+                   Tcl_AppendResult(interp, "floating-point value \"",
+                           string, "\" too large to represent",
+                           (char *) NULL);
+               }
+               return TCL_ERROR;
+           }
+           if (*term == '\0') {
+               valuePtr->type = TYPE_DOUBLE;
+               return TCL_OK;
+           }
+       }
+    }
+
+    /*
+     * Not a valid number.  Save a string value (but don't do anything
+     * if it's already the value).
+     */
+
+    valuePtr->type = TYPE_STRING;
+    if (string != valuePtr->pv.buffer) {
+       int length, shortfall;
+
+       length = strlen(string);
+       valuePtr->pv.next = valuePtr->pv.buffer;
+       shortfall = length - (valuePtr->pv.end - valuePtr->pv.buffer);
+       if (shortfall > 0) {
+           (*valuePtr->pv.expandProc)(&valuePtr->pv, shortfall);
+       }
+       strcpy(valuePtr->pv.buffer, string);
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ExprLex --
+ *
+ *     Lexical analyzer for expression parser:  parses a single value,
+ *     operator, or other syntactic element from an expression string.
+ *
+ * Results:
+ *     TCL_OK is returned unless an error occurred while doing lexical
+ *     analysis or executing an embedded command.  In that case a
+ *     standard Tcl error is returned, using interp->result to hold
+ *     an error message.  In the event of a successful return, the token
+ *     and field in infoPtr is updated to refer to the next symbol in
+ *     the expression string, and the expr field is advanced past that
+ *     token;  if the token is a value, then the value is stored at
+ *     valuePtr.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ExprLex(interp, infoPtr, valuePtr)
+    Tcl_Interp *interp;                        /* Interpreter to use for error
+                                        * reporting. */
+    register ExprInfo *infoPtr;                /* Describes the state of the parse. */
+    register Value *valuePtr;          /* Where to store value, if that is
+                                        * what's parsed from string.  Caller
+                                        * must have initialized pv field
+                                        * correctly. */
+{
+    register char *p, c;
+    char *var, *term;
+    int result;
+
+    p = infoPtr->expr;
+    c = *p;
+    while (isspace(c)) {
+       p++;
+       c = *p;
+    }
+    infoPtr->expr = p+1;
+    switch (c) {
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+       case '.':
+
+           /*
+            * Number.  First read an integer.  Then if it looks like
+            * there's a floating-point number (or if it's too big a
+            * number to fit in an integer), parse it as a floating-point
+            * number.
+            */
+
+           infoPtr->token = VALUE;
+           valuePtr->type = TYPE_INT;
+           errno = 0;
+           valuePtr->intValue = strtoul(p, &term, 0);
+           c = *term;
+           if ((c == '.') || (c == 'e') || (c == 'E') || (errno == ERANGE)) {
+               char *term2;
+
+               errno = 0;
+               valuePtr->doubleValue = strtod(p, &term2);
+               if (errno == ERANGE) {
+                   Tcl_ResetResult(interp);
+                   if (valuePtr->doubleValue == 0.0) {
+                       interp->result =
+                               "floating-point value too small to represent";
+                   } else {
+                       interp->result =
+                               "floating-point value too large to represent";
+                   }
+                   return TCL_ERROR;
+               }
+               if (term2 == infoPtr->expr) {
+                   interp->result = "poorly-formed floating-point value";
+                   return TCL_ERROR;
+               }
+               valuePtr->type = TYPE_DOUBLE;
+               infoPtr->expr = term2;
+           } else {
+               infoPtr->expr = term;
+           }
+           return TCL_OK;
+
+       case '$':
+
+           /*
+            * Variable.  Fetch its value, then see if it makes sense
+            * as an integer or floating-point number.
+            */
+
+           infoPtr->token = VALUE;
+           var = Tcl_ParseVar(interp, p, &infoPtr->expr);
+           if (var == NULL) {
+               return TCL_ERROR;
+           }
+           if (((Interp *) interp)->noEval) {
+               valuePtr->type = TYPE_INT;
+               valuePtr->intValue = 0;
+               return TCL_OK;
+           }
+           return ExprParseString(interp, var, valuePtr);
+
+       case '[':
+           infoPtr->token = VALUE;
+           result = Tcl_Eval(interp, p+1, TCL_BRACKET_TERM,
+                   &infoPtr->expr);
+           if (result != TCL_OK) {
+               return result;
+           }
+           infoPtr->expr++;
+           if (((Interp *) interp)->noEval) {
+               valuePtr->type = TYPE_INT;
+               valuePtr->intValue = 0;
+               Tcl_ResetResult(interp);
+               return TCL_OK;
+           }
+           result = ExprParseString(interp, interp->result, valuePtr);
+           if (result != TCL_OK) {
+               return result;
+           }
+           Tcl_ResetResult(interp);
+           return TCL_OK;
+
+       case '"':
+           infoPtr->token = VALUE;
+           result = TclParseQuotes(interp, infoPtr->expr, '"', 0,
+                   &infoPtr->expr, &valuePtr->pv);
+           if (result != TCL_OK) {
+               return result;
+           }
+           return ExprParseString(interp, valuePtr->pv.buffer, valuePtr);
+
+       case '{':
+           infoPtr->token = VALUE;
+           result = TclParseBraces(interp, infoPtr->expr, &infoPtr->expr,
+                   &valuePtr->pv);
+           if (result != TCL_OK) {
+               return result;
+           }
+           return ExprParseString(interp, valuePtr->pv.buffer, valuePtr);
+
+       case '(':
+           infoPtr->token = OPEN_PAREN;
+           return TCL_OK;
+
+       case ')':
+           infoPtr->token = CLOSE_PAREN;
+           return TCL_OK;
+
+       case '*':
+           infoPtr->token = MULT;
+           return TCL_OK;
+
+       case '/':
+           infoPtr->token = DIVIDE;
+           return TCL_OK;
+
+       case '%':
+           infoPtr->token = MOD;
+           return TCL_OK;
+
+       case '+':
+           infoPtr->token = PLUS;
+           return TCL_OK;
+
+       case '-':
+           infoPtr->token = MINUS;
+           return TCL_OK;
+
+       case '?':
+           infoPtr->token = QUESTY;
+           return TCL_OK;
+
+       case ':':
+           infoPtr->token = COLON;
+           return TCL_OK;
+
+       case '<':
+           switch (p[1]) {
+               case '<':
+                   infoPtr->expr = p+2;
+                   infoPtr->token = LEFT_SHIFT;
+                   break;
+               case '=':
+                   infoPtr->expr = p+2;
+                   infoPtr->token = LEQ;
+                   break;
+               default:
+                   infoPtr->token = LESS;
+                   break;
+           }
+           return TCL_OK;
+
+       case '>':
+           switch (p[1]) {
+               case '>':
+                   infoPtr->expr = p+2;
+                   infoPtr->token = RIGHT_SHIFT;
+                   break;
+               case '=':
+                   infoPtr->expr = p+2;
+                   infoPtr->token = GEQ;
+                   break;
+               default:
+                   infoPtr->token = GREATER;
+                   break;
+           }
+           return TCL_OK;
+
+       case '=':
+           if (p[1] == '=') {
+               infoPtr->expr = p+2;
+               infoPtr->token = EQUAL;
+           } else {
+               infoPtr->token = UNKNOWN;
+           }
+           return TCL_OK;
+
+       case '!':
+           if (p[1] == '=') {
+               infoPtr->expr = p+2;
+               infoPtr->token = NEQ;
+           } else {
+               infoPtr->token = NOT;
+           }
+           return TCL_OK;
+
+       case '&':
+           if (p[1] == '&') {
+               infoPtr->expr = p+2;
+               infoPtr->token = AND;
+           } else {
+               infoPtr->token = BIT_AND;
+           }
+           return TCL_OK;
+
+       case '^':
+           infoPtr->token = BIT_XOR;
+           return TCL_OK;
+
+       case '|':
+           if (p[1] == '|') {
+               infoPtr->expr = p+2;
+               infoPtr->token = OR;
+           } else {
+               infoPtr->token = BIT_OR;
+           }
+           return TCL_OK;
+
+       case '~':
+           infoPtr->token = BIT_NOT;
+           return TCL_OK;
+
+       case 0:
+           infoPtr->token = END;
+           infoPtr->expr = p;
+           return TCL_OK;
+
+       default:
+           infoPtr->expr = p+1;
+           infoPtr->token = UNKNOWN;
+           return TCL_OK;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ExprGetValue --
+ *
+ *     Parse a "value" from the remainder of the expression in infoPtr.
+ *
+ * Results:
+ *     Normally TCL_OK is returned.  The value of the expression is
+ *     returned in *valuePtr.  If an error occurred, then interp->result
+ *     contains an error message and TCL_ERROR is returned.
+ *     InfoPtr->token will be left pointing to the token AFTER the
+ *     expression, and infoPtr->expr will point to the character just
+ *     after the terminating token.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ExprGetValue(interp, infoPtr, prec, valuePtr)
+    Tcl_Interp *interp;                        /* Interpreter to use for error
+                                        * reporting. */
+    register ExprInfo *infoPtr;                /* Describes the state of the parse
+                                        * just before the value (i.e. ExprLex
+                                        * will be called to get first token
+                                        * of value). */
+    int prec;                          /* Treat any un-parenthesized operator
+                                        * with precedence <= this as the end
+                                        * of the expression. */
+    Value *valuePtr;                   /* Where to store the value of the
+                                        * expression.   Caller must have
+                                        * initialized pv field. */
+{
+    Interp *iPtr = (Interp *) interp;
+    Value value2;                      /* Second operand for current
+                                        * operator.  */
+    int operator;                      /* Current operator (either unary
+                                        * or binary). */
+    int badType;                       /* Type of offending argument;  used
+                                        * for error messages. */
+    int gotOp;                         /* Non-zero means already lexed the
+                                        * operator (while picking up value
+                                        * for unary operator).  Don't lex
+                                        * again. */
+    int result;
+
+    /*
+     * There are two phases to this procedure.  First, pick off an initial
+     * value.  Then, parse (binary operator, value) pairs until done.
+     */
+
+    gotOp = 0;
+    value2.pv.buffer = value2.pv.next = value2.staticSpace;
+    value2.pv.end = value2.pv.buffer + STATIC_STRING_SPACE - 1;
+    value2.pv.expandProc = TclExpandParseValue;
+    value2.pv.clientData = (ClientData) NULL;
+    result = ExprLex(interp, infoPtr, valuePtr);
+    if (result != TCL_OK) {
+       goto done;
+    }
+    if (infoPtr->token == OPEN_PAREN) {
+
+       /*
+        * Parenthesized sub-expression.
+        */
+
+       result = ExprGetValue(interp, infoPtr, -1, valuePtr);
+       if (result != TCL_OK) {
+           goto done;
+       }
+       if (infoPtr->token != CLOSE_PAREN) {
+           Tcl_ResetResult(interp);
+           sprintf(interp->result,
+                   "unmatched parentheses in expression \"%.50s\"",
+                   infoPtr->originalExpr);
+           result = TCL_ERROR;
+           goto done;
+       }
+    } else {
+       if (infoPtr->token == MINUS) {
+           infoPtr->token = UNARY_MINUS;
+       }
+       if (infoPtr->token >= UNARY_MINUS) {
+
+           /*
+            * Process unary operators.
+            */
+
+           operator = infoPtr->token;
+           result = ExprGetValue(interp, infoPtr, precTable[infoPtr->token],
+                   valuePtr);
+           if (result != TCL_OK) {
+               goto done;
+           }
+           switch (operator) {
+               case UNARY_MINUS:
+                   if (valuePtr->type == TYPE_INT) {
+                       valuePtr->intValue = -valuePtr->intValue;
+                   } else if (valuePtr->type == TYPE_DOUBLE){
+                       valuePtr->doubleValue = -valuePtr->doubleValue;
+                   } else {
+                       badType = valuePtr->type;
+                       goto illegalType;
+                   } 
+                   break;
+               case NOT:
+                   if (valuePtr->type == TYPE_INT) {
+                       valuePtr->intValue = !valuePtr->intValue;
+                   } else if (valuePtr->type == TYPE_DOUBLE) {
+                       /*
+                        * Theoretically, should be able to use
+                        * "!valuePtr->intValue", but apparently some
+                        * compilers can't handle it.
+                        */
+                       if (valuePtr->doubleValue == 0.0) {
+                           valuePtr->intValue = 1;
+                       } else {
+                           valuePtr->intValue = 0;
+                       }
+                       valuePtr->type = TYPE_INT;
+                   } else {
+                       badType = valuePtr->type;
+                       goto illegalType;
+                   }
+                   break;
+               case BIT_NOT:
+                   if (valuePtr->type == TYPE_INT) {
+                       valuePtr->intValue = ~valuePtr->intValue;
+                   } else {
+                       badType  = valuePtr->type;
+                       goto illegalType;
+                   }
+                   break;
+           }
+           gotOp = 1;
+       } else if (infoPtr->token != VALUE) {
+           goto syntaxError;
+       }
+    }
+
+    /*
+     * Got the first operand.  Now fetch (operator, operand) pairs.
+     */
+
+    if (!gotOp) {
+       result = ExprLex(interp, infoPtr, &value2);
+       if (result != TCL_OK) {
+           goto done;
+       }
+    }
+    while (1) {
+       operator = infoPtr->token;
+       value2.pv.next = value2.pv.buffer;
+       if ((operator < MULT) || (operator >= UNARY_MINUS)) {
+           if ((operator == END) || (operator == CLOSE_PAREN)) {
+               result = TCL_OK;
+               goto done;
+           } else {
+               goto syntaxError;
+           }
+       }
+       if (precTable[operator] <= prec) {
+           result = TCL_OK;
+           goto done;
+       }
+
+       /*
+        * If we're doing an AND or OR and the first operand already
+        * determines the result, don't execute anything in the
+        * second operand:  just parse.  Same style for ?: pairs.
+        */
+
+       if ((operator == AND) || (operator == OR) || (operator == QUESTY)) {
+           if (valuePtr->type == TYPE_DOUBLE) {
+               valuePtr->intValue = valuePtr->doubleValue != 0;
+               valuePtr->type = TYPE_INT;
+           } else if (valuePtr->type == TYPE_STRING) {
+               badType = TYPE_STRING;
+               goto illegalType;
+           }
+           if (((operator == AND) && !valuePtr->intValue)
+                   || ((operator == OR) && valuePtr->intValue)) {
+               iPtr->noEval++;
+               result = ExprGetValue(interp, infoPtr, precTable[operator],
+                       &value2);
+               iPtr->noEval--;
+           } else if (operator == QUESTY) {
+               if (valuePtr->intValue != 0) {
+                   valuePtr->pv.next = valuePtr->pv.buffer;
+                   result = ExprGetValue(interp, infoPtr, precTable[operator],
+                           valuePtr);
+                   if (result != TCL_OK) {
+                       goto done;
+                   }
+                   if (infoPtr->token != COLON) {
+                       goto syntaxError;
+                   }
+                   value2.pv.next = value2.pv.buffer;
+                   iPtr->noEval++;
+                   result = ExprGetValue(interp, infoPtr, precTable[operator],
+                           &value2);
+                   iPtr->noEval--;
+               } else {
+                   iPtr->noEval++;
+                   result = ExprGetValue(interp, infoPtr, precTable[operator],
+                           &value2);
+                   iPtr->noEval--;
+                   if (result != TCL_OK) {
+                       goto done;
+                   }
+                   if (infoPtr->token != COLON) {
+                       goto syntaxError;
+                   }
+                   valuePtr->pv.next = valuePtr->pv.buffer;
+                   result = ExprGetValue(interp, infoPtr, precTable[operator],
+                           valuePtr);
+               }
+           } else {
+               result = ExprGetValue(interp, infoPtr, precTable[operator],
+                       &value2);
+           }
+       } else {
+           result = ExprGetValue(interp, infoPtr, precTable[operator],
+                   &value2);
+       }
+       if (result != TCL_OK) {
+           goto done;
+       }
+       if ((infoPtr->token < MULT) && (infoPtr->token != VALUE)
+               && (infoPtr->token != END)
+               && (infoPtr->token != CLOSE_PAREN)) {
+           goto syntaxError;
+       }
+
+       /*
+        * At this point we've got two values and an operator.  Check
+        * to make sure that the particular data types are appropriate
+        * for the particular operator, and perform type conversion
+        * if necessary.
+        */
+
+       switch (operator) {
+
+           /*
+            * For the operators below, no strings are allowed and
+            * ints get converted to floats if necessary.
+            */
+
+           case MULT: case DIVIDE: case PLUS: case MINUS:
+               if ((valuePtr->type == TYPE_STRING)
+                       || (value2.type == TYPE_STRING)) {
+                   badType = TYPE_STRING;
+                   goto illegalType;
+               }
+               if (valuePtr->type == TYPE_DOUBLE) {
+                   if (value2.type == TYPE_INT) {
+                       value2.doubleValue = value2.intValue;
+                       value2.type = TYPE_DOUBLE;
+                   }
+               } else if (value2.type == TYPE_DOUBLE) {
+                   if (valuePtr->type == TYPE_INT) {
+                       valuePtr->doubleValue = valuePtr->intValue;
+                       valuePtr->type = TYPE_DOUBLE;
+                   }
+               }
+               break;
+
+           /*
+            * For the operators below, only integers are allowed.
+            */
+
+           case MOD: case LEFT_SHIFT: case RIGHT_SHIFT:
+           case BIT_AND: case BIT_XOR: case BIT_OR:
+                if (valuePtr->type != TYPE_INT) {
+                    badType = valuePtr->type;
+                    goto illegalType;
+                } else if (value2.type != TYPE_INT) {
+                    badType = value2.type;
+                    goto illegalType;
+                }
+                break;
+
+           /*
+            * For the operators below, any type is allowed but the
+            * two operands must have the same type.  Convert integers
+            * to floats and either to strings, if necessary.
+            */
+
+           case LESS: case GREATER: case LEQ: case GEQ:
+           case EQUAL: case NEQ:
+               if (valuePtr->type == TYPE_STRING) {
+                   if (value2.type != TYPE_STRING) {
+                       ExprMakeString(&value2);
+                   }
+               } else if (value2.type == TYPE_STRING) {
+                   if (valuePtr->type != TYPE_STRING) {
+                       ExprMakeString(valuePtr);
+                   }
+               } else if (valuePtr->type == TYPE_DOUBLE) {
+                   if (value2.type == TYPE_INT) {
+                       value2.doubleValue = value2.intValue;
+                       value2.type = TYPE_DOUBLE;
+                   }
+               } else if (value2.type == TYPE_DOUBLE) {
+                    if (valuePtr->type == TYPE_INT) {
+                       valuePtr->doubleValue = valuePtr->intValue;
+                       valuePtr->type = TYPE_DOUBLE;
+                   }
+               }
+               break;
+
+           /*
+            * For the operators below, no strings are allowed, but
+            * no int->double conversions are performed.
+            */
+
+           case AND: case OR:
+               if (valuePtr->type == TYPE_STRING) {
+                   badType = valuePtr->type;
+                   goto illegalType;
+               }
+               if (value2.type == TYPE_STRING) {
+                   badType = value2.type;
+                   goto illegalType;
+               }
+               break;
+
+           /*
+            * For the operators below, type and conversions are
+            * irrelevant:  they're handled elsewhere.
+            */
+
+           case QUESTY: case COLON:
+               break;
+
+           /*
+            * Any other operator is an error.
+            */
+
+           default:
+               interp->result = "unknown operator in expression";
+               result = TCL_ERROR;
+               goto done;
+       }
+
+       /*
+        * If necessary, convert one of the operands to the type
+        * of the other.  If the operands are incompatible with
+        * the operator (e.g. "+" on strings) then return an
+        * error.
+        */
+
+       switch (operator) {
+           case MULT:
+               if (valuePtr->type == TYPE_INT) {
+                   valuePtr->intValue *= value2.intValue;
+               } else {
+                   valuePtr->doubleValue *= value2.doubleValue;
+               }
+               break;
+           case DIVIDE:
+               if (valuePtr->type == TYPE_INT) {
+                   if (value2.intValue == 0) {
+                       divideByZero:
+                       interp->result = "divide by zero";
+                       result = TCL_ERROR;
+                       goto done;
+                   }
+                   valuePtr->intValue /= value2.intValue;
+               } else {
+                   if (value2.doubleValue == 0.0) {
+                       goto divideByZero;
+                   }
+                   valuePtr->doubleValue /= value2.doubleValue;
+               }
+               break;
+           case MOD:
+               if (value2.intValue == 0) {
+                   goto divideByZero;
+               }
+               valuePtr->intValue %= value2.intValue;
+               break;
+           case PLUS:
+               if (valuePtr->type == TYPE_INT) {
+                   valuePtr->intValue += value2.intValue;
+               } else {
+                   valuePtr->doubleValue += value2.doubleValue;
+               }
+               break;
+           case MINUS:
+               if (valuePtr->type == TYPE_INT) {
+                   valuePtr->intValue -= value2.intValue;
+               } else {
+                   valuePtr->doubleValue -= value2.doubleValue;
+               }
+               break;
+           case LEFT_SHIFT:
+               valuePtr->intValue <<= value2.intValue;
+               break;
+           case RIGHT_SHIFT:
+               /*
+                * The following code is a bit tricky:  it ensures that
+                * right shifts propagate the sign bit even on machines
+                * where ">>" won't do it by default.
+                */
+
+               if (valuePtr->intValue < 0) {
+                   valuePtr->intValue =
+                           ~((~valuePtr->intValue) >> value2.intValue);
+               } else {
+                   valuePtr->intValue >>= value2.intValue;
+               }
+               break;
+           case LESS:
+               if (valuePtr->type == TYPE_INT) {
+                   valuePtr->intValue =
+                       valuePtr->intValue < value2.intValue;
+               } else if (valuePtr->type == TYPE_DOUBLE) {
+                   valuePtr->intValue =
+                       valuePtr->doubleValue < value2.doubleValue;
+               } else {
+                   valuePtr->intValue =
+                           strcmp(valuePtr->pv.buffer, value2.pv.buffer) < 0;
+               }
+               valuePtr->type = TYPE_INT;
+               break;
+           case GREATER:
+               if (valuePtr->type == TYPE_INT) {
+                   valuePtr->intValue =
+                       valuePtr->intValue > value2.intValue;
+               } else if (valuePtr->type == TYPE_DOUBLE) {
+                   valuePtr->intValue =
+                       valuePtr->doubleValue > value2.doubleValue;
+               } else {
+                   valuePtr->intValue =
+                           strcmp(valuePtr->pv.buffer, value2.pv.buffer) > 0;
+               }
+               valuePtr->type = TYPE_INT;
+               break;
+           case LEQ:
+               if (valuePtr->type == TYPE_INT) {
+                   valuePtr->intValue =
+                       valuePtr->intValue <= value2.intValue;
+               } else if (valuePtr->type == TYPE_DOUBLE) {
+                   valuePtr->intValue =
+                       valuePtr->doubleValue <= value2.doubleValue;
+               } else {
+                   valuePtr->intValue =
+                           strcmp(valuePtr->pv.buffer, value2.pv.buffer) <= 0;
+               }
+               valuePtr->type = TYPE_INT;
+               break;
+           case GEQ:
+               if (valuePtr->type == TYPE_INT) {
+                   valuePtr->intValue =
+                       valuePtr->intValue >= value2.intValue;
+               } else if (valuePtr->type == TYPE_DOUBLE) {
+                   valuePtr->intValue =
+                       valuePtr->doubleValue >= value2.doubleValue;
+               } else {
+                   valuePtr->intValue =
+                           strcmp(valuePtr->pv.buffer, value2.pv.buffer) >= 0;
+               }
+               valuePtr->type = TYPE_INT;
+               break;
+           case EQUAL:
+               if (valuePtr->type == TYPE_INT) {
+                   valuePtr->intValue =
+                       valuePtr->intValue == value2.intValue;
+               } else if (valuePtr->type == TYPE_DOUBLE) {
+                   valuePtr->intValue =
+                       valuePtr->doubleValue == value2.doubleValue;
+               } else {
+                   valuePtr->intValue =
+                           strcmp(valuePtr->pv.buffer, value2.pv.buffer) == 0;
+               }
+               valuePtr->type = TYPE_INT;
+               break;
+           case NEQ:
+               if (valuePtr->type == TYPE_INT) {
+                   valuePtr->intValue =
+                       valuePtr->intValue != value2.intValue;
+               } else if (valuePtr->type == TYPE_DOUBLE) {
+                   valuePtr->intValue =
+                       valuePtr->doubleValue != value2.doubleValue;
+               } else {
+                   valuePtr->intValue =
+                           strcmp(valuePtr->pv.buffer, value2.pv.buffer) != 0;
+               }
+               valuePtr->type = TYPE_INT;
+               break;
+           case BIT_AND:
+               valuePtr->intValue &= value2.intValue;
+               break;
+           case BIT_XOR:
+               valuePtr->intValue ^= value2.intValue;
+               break;
+           case BIT_OR:
+               valuePtr->intValue |= value2.intValue;
+               break;
+
+           /*
+            * For AND and OR, we know that the first value has already
+            * been converted to an integer.  Thus we need only consider
+            * the possibility of int vs. double for the second value.
+            */
+
+           case AND:
+               if (value2.type == TYPE_DOUBLE) {
+                   value2.intValue = value2.doubleValue != 0;
+                   value2.type = TYPE_INT;
+               }
+               valuePtr->intValue = valuePtr->intValue && value2.intValue;
+               break;
+           case OR:
+               if (value2.type == TYPE_DOUBLE) {
+                   value2.intValue = value2.doubleValue != 0;
+                   value2.type = TYPE_INT;
+               }
+               valuePtr->intValue = valuePtr->intValue || value2.intValue;
+               break;
+
+           case COLON:
+               interp->result = "can't have : operator without ? first";
+               result = TCL_ERROR;
+               goto done;
+       }
+    }
+
+    done:
+    if (value2.pv.buffer != value2.staticSpace) {
+       ckfree(value2.pv.buffer);
+    }
+    return result;
+
+    syntaxError:
+    Tcl_ResetResult(interp);
+    Tcl_AppendResult(interp, "syntax error in expression \"",
+           infoPtr->originalExpr, "\"", (char *) NULL);
+    result = TCL_ERROR;
+    goto done;
+
+    illegalType:
+    Tcl_AppendResult(interp, "can't use ", (badType == TYPE_DOUBLE) ?
+           "floating-point value" : "non-numeric string",
+           " as operand of \"", operatorStrings[operator], "\"",
+           (char *) NULL);
+    result = TCL_ERROR;
+    goto done;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ExprMakeString --
+ *
+ *     Convert a value from int or double representation to
+ *     a string.
+ *
+ * Results:
+ *     The information at *valuePtr gets converted to string
+ *     format, if it wasn't that way already.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ExprMakeString(valuePtr)
+    register Value *valuePtr;          /* Value to be converted. */
+{
+    int shortfall;
+
+    shortfall = 150 - (valuePtr->pv.end - valuePtr->pv.buffer);
+    if (shortfall > 0) {
+       (*valuePtr->pv.expandProc)(&valuePtr->pv, shortfall);
+    }
+    if (valuePtr->type == TYPE_INT) {
+       sprintf(valuePtr->pv.buffer, "%ld", valuePtr->intValue);
+    } else if (valuePtr->type == TYPE_DOUBLE) {
+       sprintf(valuePtr->pv.buffer, "%g", valuePtr->doubleValue);
+    }
+    valuePtr->type = TYPE_STRING;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ExprTopLevel --
+ *
+ *     This procedure provides top-level functionality shared by
+ *     procedures like Tcl_ExprInt, Tcl_ExprDouble, etc.
+ *
+ * Results:
+ *     The result is a standard Tcl return value.  If an error
+ *     occurs then an error message is left in interp->result.
+ *     The value of the expression is returned in *valuePtr, in
+ *     whatever form it ends up in (could be string or integer
+ *     or double).  Caller may need to convert result.  Caller
+ *     is also responsible for freeing string memory in *valuePtr,
+ *     if any was allocated.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ExprTopLevel(interp, string, valuePtr)
+    Tcl_Interp *interp;                        /* Context in which to evaluate the
+                                        * expression. */
+    char *string;                      /* Expression to evaluate. */
+    Value *valuePtr;                   /* Where to store result.  Should
+                                        * not be initialized by caller. */
+{
+    ExprInfo info;
+    int result;
+
+    info.originalExpr = string;
+    info.expr = string;
+    valuePtr->pv.buffer = valuePtr->pv.next = valuePtr->staticSpace;
+    valuePtr->pv.end = valuePtr->pv.buffer + STATIC_STRING_SPACE - 1;
+    valuePtr->pv.expandProc = TclExpandParseValue;
+    valuePtr->pv.clientData = (ClientData) NULL;
+
+    result = ExprGetValue(interp, &info, -1, valuePtr);
+    if (result != TCL_OK) {
+       return result;
+    }
+    if (info.token != END) {
+       Tcl_AppendResult(interp, "syntax error in expression \"",
+               string, "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tcl_ExprLong, Tcl_ExprDouble, Tcl_ExprBoolean --
+ *
+ *     Procedures to evaluate an expression and return its value
+ *     in a particular form.
+ *
+ * Results:
+ *     Each of the procedures below returns a standard Tcl result.
+ *     If an error occurs then an error message is left in
+ *     interp->result.  Otherwise the value of the expression,
+ *     in the appropriate form, is stored at *resultPtr.  If
+ *     the expression had a result that was incompatible with the
+ *     desired form then an error is returned.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tcl_ExprLong(interp, string, ptr)
+    Tcl_Interp *interp;                        /* Context in which to evaluate the
+                                        * expression. */
+    char *string;                      /* Expression to evaluate. */
+    long *ptr;                         /* Where to store result. */
+{
+    Value value;
+    int result;
+
+    result = ExprTopLevel(interp, string, &value);
+    if (result == TCL_OK) {
+       if (value.type == TYPE_INT) {
+           *ptr = value.intValue;
+       } else if (value.type == TYPE_DOUBLE) {
+           *ptr = value.doubleValue;
+       } else {
+           interp->result = "expression didn't have numeric value";
+           result = TCL_ERROR;
+       }
+    }
+    if (value.pv.buffer != value.staticSpace) {
+       ckfree(value.pv.buffer);
+    }
+    return result;
+}
+
+int
+Tcl_ExprDouble(interp, string, ptr)
+    Tcl_Interp *interp;                        /* Context in which to evaluate the
+                                        * expression. */
+    char *string;                      /* Expression to evaluate. */
+    double *ptr;                       /* Where to store result. */
+{
+    Value value;
+    int result;
+
+    result = ExprTopLevel(interp, string, &value);
+    if (result == TCL_OK) {
+       if (value.type == TYPE_INT) {
+           *ptr = value.intValue;
+       } else if (value.type == TYPE_DOUBLE) {
+           *ptr = value.doubleValue;
+       } else {
+           interp->result = "expression didn't have numeric value";
+           result = TCL_ERROR;
+       }
+    }
+    if (value.pv.buffer != value.staticSpace) {
+       ckfree(value.pv.buffer);
+    }
+    return result;
+}
+
+int
+Tcl_ExprBoolean(interp, string, ptr)
+    Tcl_Interp *interp;                        /* Context in which to evaluate the
+                                        * expression. */
+    char *string;                      /* Expression to evaluate. */
+    int *ptr;                          /* Where to store 0/1 result. */
+{
+    Value value;
+    int result;
+
+    result = ExprTopLevel(interp, string, &value);
+    if (result == TCL_OK) {
+       if (value.type == TYPE_INT) {
+           *ptr = value.intValue != 0;
+       } else if (value.type == TYPE_DOUBLE) {
+           *ptr = value.doubleValue != 0.0;
+       } else {
+           interp->result = "expression didn't have numeric value";
+           result = TCL_ERROR;
+       }
+    }
+    if (value.pv.buffer != value.staticSpace) {
+       ckfree(value.pv.buffer);
+    }
+    return result;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tcl_ExprString --
+ *
+ *     Evaluate an expression and return its value in string form.
+ *
+ * Results:
+ *     A standard Tcl result.  If the result is TCL_OK, then the
+ *     interpreter's result is set to the string value of the
+ *     expression.  If the result is TCL_OK, then interp->result
+ *     contains an error message.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tcl_ExprString(interp, string)
+    Tcl_Interp *interp;                        /* Context in which to evaluate the
+                                        * expression. */
+    char *string;                      /* Expression to evaluate. */
+{
+    Value value;
+    int result;
+
+    result = ExprTopLevel(interp, string, &value);
+    if (result == TCL_OK) {
+       if (value.type == TYPE_INT) {
+           sprintf(interp->result, "%ld", value.intValue);
+       } else if (value.type == TYPE_DOUBLE) {
+           sprintf(interp->result, "%g", value.doubleValue);
+       } else {
+           if (value.pv.buffer != value.staticSpace) {
+               interp->result = value.pv.buffer;
+               interp->freeProc = (Tcl_FreeProc *) free;
+               value.pv.buffer = value.staticSpace;
+           } else {
+               Tcl_SetResult(interp, value.pv.buffer, TCL_VOLATILE);
+           }
+       }
+    }
+    if (value.pv.buffer != value.staticSpace) {
+       ckfree(value.pv.buffer);
+    }
+    return result;
+}
diff --git a/src/tcl/tclget.c b/src/tcl/tclget.c
new file mode 100644 (file)
index 0000000..175f406
--- /dev/null
@@ -0,0 +1,184 @@
+/* 
+ * tclGet.c --
+ *
+ *     This file contains procedures to convert strings into
+ *     other forms, like integers or floating-point numbers or
+ *     booleans, doing syntax checking along the way.
+ *
+ * Copyright 1990-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclGet.c,v 1.11 92/02/29 16:13:14 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tclint.h"
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_GetInt --
+ *
+ *     Given a string, produce the corresponding integer value.
+ *
+ * Results:
+ *     The return value is normally TCL_OK;  in this case *intPtr
+ *     will be set to the integer value equivalent to string.  If
+ *     string is improperly formed then TCL_ERROR is returned and
+ *     an error message will be left in interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_GetInt(interp, string, intPtr)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    char *string;              /* String containing a (possibly signed)
+                                * integer in a form acceptable to strtol. */
+    int *intPtr;               /* Place to store converted result. */
+{
+    char *end;
+    int i;
+
+    i = strtol(string, &end, 0);
+    while ((*end != '\0') && isspace(*end)) {
+       end++;
+    }
+    if ((end == string) || (*end != 0)) {
+       Tcl_AppendResult(interp, "expected integer but got \"", string,
+               "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    *intPtr = i;
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_GetDouble --
+ *
+ *     Given a string, produce the corresponding double-precision
+ *     floating-point value.
+ *
+ * Results:
+ *     The return value is normally TCL_OK;  in this case *doublePtr
+ *     will be set to the double-precision value equivalent to string.
+ *     If string is improperly formed then TCL_ERROR is returned and
+ *     an error message will be left in interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_GetDouble(interp, string, doublePtr)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    char *string;              /* String containing a floating-point number
+                                * in a form acceptable to strtod. */
+    double *doublePtr;         /* Place to store converted result. */
+{
+    char *end;
+    double d;
+
+    d = strtod(string, &end);
+    while ((*end != '\0') && isspace(*end)) {
+       end++;
+    }
+    if ((end == string) || (*end != 0)) {
+       Tcl_AppendResult(interp, "expected floating-point number but got \"",
+               string, "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    *doublePtr = d;
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_GetBoolean --
+ *
+ *     Given a string, return a 0/1 boolean value corresponding
+ *     to the string.
+ *
+ * Results:
+ *     The return value is normally TCL_OK;  in this case *boolPtr
+ *     will be set to the 0/1 value equivalent to string.  If
+ *     string is improperly formed then TCL_ERROR is returned and
+ *     an error message will be left in interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_GetBoolean(interp, string, boolPtr)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    char *string;              /* String containing a boolean number
+                                * specified either as 1/0 or true/false or
+                                * yes/no. */
+    int *boolPtr;              /* Place to store converted result, which
+                                * will be 0 or 1. */
+{
+    char c;
+    char lowerCase[10];
+    int i, length;
+
+    /*
+     * Convert the input string to all lower-case.
+     */
+
+    for (i = 0; i < 9; i++) {
+       c = string[i];
+       if (c == 0) {
+           break;
+       }
+       if ((c >= 'A') && (c <= 'Z')) {
+           c += 'a' - 'A';
+       }
+       lowerCase[i] = c;
+    }
+    lowerCase[i] = 0;
+
+    length = strlen(lowerCase);
+    c = lowerCase[0];
+    if ((c == '0') && (lowerCase[1] == '\0')) {
+       *boolPtr = 0;
+    } else if ((c == '1') && (lowerCase[1] == '\0')) {
+       *boolPtr = 1;
+    } else if ((c == 'y') && (strncmp(lowerCase, "yes", length) == 0)) {
+       *boolPtr = 1;
+    } else if ((c == 'n') && (strncmp(lowerCase, "no", length) == 0)) {
+       *boolPtr = 0;
+    } else if ((c == 't') && (strncmp(lowerCase, "true", length) == 0)) {
+       *boolPtr = 1;
+    } else if ((c == 'f') && (strncmp(lowerCase, "false", length) == 0)) {
+       *boolPtr = 0;
+    } else if ((c == 'o') && (length >= 2)) {
+       if (strncmp(lowerCase, "on", length) == 0) {
+           *boolPtr = 1;
+       } else if (strncmp(lowerCase, "off", length) == 0) {
+           *boolPtr = 0;
+       }
+    } else {
+       Tcl_AppendResult(interp, "expected boolean value but got \"",
+               string, "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
diff --git a/src/tcl/tclglob.c b/src/tcl/tclglob.c
new file mode 100644 (file)
index 0000000..c549290
--- /dev/null
@@ -0,0 +1,580 @@
+/* 
+ * tclGlob.c --
+ *
+ *     This file provides procedures and commands for file name
+ *     manipulation, such as tilde expansion and globbing.
+ *
+ * Copyright 1990-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclGlob.c,v 1.24 92/07/01 08:51:50 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include <sys/types.h>
+
+#include "tclint.h"
+#include "tclunix.h"
+
+void dvpath(char *);
+
+/*
+ * The structure below is used to keep track of a globbing result
+ * being built up (i.e. a partial list of file names).  The list
+ * grows dynamically to be as big as needed.
+ */
+
+typedef struct {
+    char *result;              /* Pointer to result area. */
+    int totalSpace;            /* Total number of characters allocated
+                                * for result. */
+    int spaceUsed;             /* Number of characters currently in use
+                                * to hold the partial result (not including
+                                * the terminating NULL). */
+    int dynamic;               /* 0 means result is static space, 1 means
+                                * it's dynamic. */
+} GlobResult;
+
+/*
+ * Declarations for procedures local to this file:
+ */
+
+static void            AppendResult _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *dir, char *separator, char *name,
+                           int nameLength));
+static int             DoGlob _ANSI_ARGS_((Tcl_Interp *interp, char *dir,
+                           char *rem));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * AppendResult --
+ *
+ *     Given two parts of a file name (directory and element within
+ *     directory), concatenate the two together and append them to
+ *     the result building up in interp.
+ *
+ * Results:
+ *     There is no return value.
+ *
+ * Side effects:
+ *     Interp->result gets extended.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+AppendResult(interp, dir, separator, name, nameLength)
+    Tcl_Interp *interp;                /* Interpreter whose result should be
+                                * appended to. */
+    char *dir;                 /* Name of directory, without trailing
+                                * slash except for root directory. */
+    char *separator;           /* Separator string so use between dir and
+                                * name:  either "/" or "" depending on dir. */
+    char *name;                        /* Name of file withing directory (NOT
+                                * necessarily null-terminated!). */
+    int nameLength;            /* Number of characters in name. */
+{
+    int dirFlags, nameFlags;
+    char *p, saved;
+
+    /*
+     * Next, see if we can put together a valid list element from dir
+     * and name by calling Tcl_AppendResult.
+     */
+
+    if (*dir == 0) {
+       dirFlags = 0;
+    } else {
+       Tcl_ScanElement(dir, &dirFlags);
+    }
+    saved = name[nameLength];
+    name[nameLength] = 0;
+    Tcl_ScanElement(name, &nameFlags);
+    if ((dirFlags == 0) && (nameFlags == 0)) {
+       if (*interp->result != 0) {
+           Tcl_AppendResult(interp, " ", dir, separator, name, (char *) NULL);
+       } else {
+           Tcl_AppendResult(interp, dir, separator, name, (char *) NULL);
+       }
+       name[nameLength] = saved;
+       return;
+    }
+
+    /*
+     * This name has weird characters in it, so we have to convert it to
+     * a list element.  To do that, we have to merge the characters
+     * into a single name.  To do that, malloc a buffer to hold everything.
+     */
+
+    p = (char *) ckalloc((unsigned) (strlen(dir) + strlen(separator)
+           + nameLength + 1));
+    sprintf(p, "%s%s%s", dir, separator, name);
+    name[nameLength] = saved;
+    Tcl_AppendElement(interp, p, 0);
+    ckfree(p);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DoGlob --
+ *
+ *     This recursive procedure forms the heart of the globbing
+ *     code.  It performs a depth-first traversal of the tree
+ *     given by the path name to be globbed.
+ *
+ * Results:
+ *     The return value is a standard Tcl result indicating whether
+ *     an error occurred in globbing.  After a normal return the
+ *     result in interp will be set to hold all of the file names
+ *     given by the dir and rem arguments.  After an error the
+ *     result in interp will hold an error message.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+DoGlob(interp, dir, rem)
+    Tcl_Interp *interp;                        /* Interpreter to use for error
+                                        * reporting (e.g. unmatched brace). */
+    char *dir;                         /* Name of a directory at which to
+                                        * start glob expansion.  This name
+                                        * is fixed: it doesn't contain any
+                                        * globbing chars. */
+    char *rem;                         /* Path to glob-expand. */
+{
+    /*
+     * When this procedure is entered, the name to be globbed may
+     * already have been partly expanded by ancestor invocations of
+     * DoGlob.  The part that's already been expanded is in "dir"
+     * (this may initially be empty), and the part still to expand
+     * is in "rem".  This procedure expands "rem" one level, making
+     * recursive calls to itself if there's still more stuff left
+     * in the remainder.
+     */
+
+    register char *p;
+    register char c;
+    char *openBrace, *closeBrace;
+    int gotSpecial, result;
+    char *separator;
+
+    /*
+     * Figure out whether we'll need to add a slash between the directory
+     * name and file names within the directory when concatenating them
+     * together.
+     */
+
+    if ((dir[0] == 0) || ((dir[0] == '/') && (dir[1] == 0))) {
+       separator = "";
+    } else {
+       separator = "/";
+    }
+
+    /*
+     * When generating information for the next lower call,
+     * use static areas if the name is short, and malloc if the name
+     * is longer.
+     */
+
+#define STATIC_SIZE 200
+
+    /*
+     * First, find the end of the next element in rem, checking
+     * along the way for special globbing characters.
+     */
+
+    gotSpecial = 0;
+    openBrace = closeBrace = NULL;
+    for (p = rem; ; p++) {
+       c = *p;
+       if ((c == '\0') || (c == '/')) {
+           break;
+       }
+       if ((c == '{') && (openBrace == NULL)) {
+           openBrace = p;
+       }
+       if ((c == '}') && (closeBrace == NULL)) {
+           closeBrace = p;
+       }
+       if ((c == '*') || (c == '[') || (c == '\\') || (c == '?')) {
+           gotSpecial = 1;
+       }
+    }
+
+    /*
+     * If there is an open brace in the argument, then make a recursive
+     * call for each element between the braces.  In this case, the
+     * recursive call to DoGlob uses the same "dir" that we got.
+     * If there are several brace-pairs in a single name, we just handle
+     * one here, and the others will be handled in recursive calls.
+     */
+
+    if (openBrace != NULL) {
+       int remLength, l1, l2;
+       char static1[STATIC_SIZE];
+       char *element, *newRem;
+
+       if (closeBrace == NULL) {
+           Tcl_ResetResult(interp);
+           interp->result = "unmatched open-brace in file name";
+           return TCL_ERROR;
+       }
+       remLength = strlen(rem) + 1;
+       if (remLength <= STATIC_SIZE) {
+           newRem = static1;
+       } else {
+           newRem = (char *) ckalloc((unsigned) remLength);
+       }
+       l1 = openBrace-rem;
+       strncpy(newRem, rem, l1);
+       p = openBrace;
+       for (p = openBrace; *p != '}'; ) {
+           element = p+1;
+           for (p = element; ((*p != '}') && (*p != ',')); p++) {
+               /* Empty loop body:  just find end of this element. */
+           }
+           l2 = p - element;
+           strncpy(newRem+l1, element, l2);
+           strcpy(newRem+l1+l2, closeBrace+1);
+           if (DoGlob(interp, dir, newRem) != TCL_OK) {
+               return TCL_ERROR;
+           }
+       }
+       if (remLength > STATIC_SIZE) {
+           ckfree(newRem);
+       }
+       return TCL_OK;
+    }
+
+    /*
+     * If there were any pattern-matching characters, then scan through
+     * the directory to find all the matching names.
+     */
+
+    if (gotSpecial) {
+       DIR *d;
+       struct dirent *entryPtr;
+       int l1, l2;
+       char *pattern, *newDir, *dirName;
+       char static1[STATIC_SIZE], static2[STATIC_SIZE];
+       struct stat statBuf;
+
+       /*
+        * Be careful not to do any actual file system operations on a
+        * directory named "";  instead, use ".".  This is needed because
+        * some versions of UNIX don't treat "" like "." automatically.
+        */
+
+       if (*dir == '\0') {
+           dirName = ".";
+       } else {
+           dirName = dir;
+       }
+       if ((stat(dirName, &statBuf) != 0)
+               || ((statBuf.st_mode & S_IFMT) != S_IFDIR)) {
+           return TCL_OK;
+       }
+       d = opendir(dirName);
+       if (d == NULL) {
+           Tcl_ResetResult(interp);
+           Tcl_AppendResult(interp, "couldn't read directory \"",
+                   dirName, "\": ", Tcl_UnixError(interp), (char *) NULL);
+           return TCL_ERROR;
+       }
+       l1 = strlen(dir);
+       l2 = (p - rem);
+       if (l2 < STATIC_SIZE) {
+           pattern = static2;
+       } else {
+           pattern = (char *) ckalloc((unsigned) (l2+1));
+       }
+       strncpy(pattern, rem, l2);
+       pattern[l2] = '\0';
+       result = TCL_OK;
+       while (1) {
+           entryPtr = readdir(d);
+           if (entryPtr == NULL) {
+               break;
+           }
+
+           /*
+            * Don't match names starting with "." unless the "." is
+            * present in the pattern.
+            */
+
+           if ((*entryPtr->d_name == '.') && (*pattern != '.')) {
+               continue;
+           }
+           if (Tcl_StringMatch(entryPtr->d_name, pattern)) {
+               int nameLength = strlen(entryPtr->d_name);
+               if (*p == 0) {
+                   AppendResult(interp, dir, separator, entryPtr->d_name,
+                           nameLength);
+               } else {
+                   if ((l1+nameLength+2) <= STATIC_SIZE) {
+                       newDir = static1;
+                   } else {
+                       newDir = (char *) ckalloc((unsigned) (l1+nameLength+2));
+                   }
+                   sprintf(newDir, "%s%s%s", dir, separator, entryPtr->d_name);
+                   result = DoGlob(interp, newDir, p+1);
+                   if (newDir != static1) {
+                       ckfree(newDir);
+                   }
+                   if (result != TCL_OK) {
+                       break;
+                   }
+               }
+           }
+       }
+       closedir(d);
+       if (pattern != static2) {
+           ckfree(pattern);
+       }
+       return result;
+    }
+
+    /*
+     * This is the simplest case:  just another path element.  Move
+     * it to the dir side and recurse (or just add the name to the
+     * list, if we're at the end of the path).
+     */
+
+    if (*p == 0) {
+       AppendResult(interp, dir, separator, rem, p-rem);
+    } else {
+       int l1, l2;
+       char *newDir;
+       char static1[STATIC_SIZE];
+
+       l1 = strlen(dir);
+       l2 = l1 + (p - rem) + 2;
+       if (l2 <= STATIC_SIZE) {
+           newDir = static1;
+       } else {
+           newDir = (char *) ckalloc((unsigned) l2);
+       }
+       sprintf(newDir, "%s%s%.*s", dir, separator, p-rem, rem);
+       result = DoGlob(interp, newDir, p+1);
+       if (newDir != static1) {
+           ckfree(newDir);
+       }
+       if (result != TCL_OK) {
+           return TCL_ERROR;
+       }
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_TildeSubst --
+ *
+ *     Given a name starting with a tilde, produce a name where
+ *     the tilde and following characters have been replaced by
+ *     the home directory location for the named user.
+ *
+ * Results:
+ *     The result is a pointer to a static string containing
+ *     the new name.  This name will only persist until the next
+ *     call to Tcl_TildeSubst;  save it if you care about it for
+ *     the long term.  If there was an error in processing the
+ *     tilde, then an error message is left in interp->result
+ *     and the return value is NULL.
+ *
+ * Side effects:
+ *     None that the caller needs to worry about.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tcl_TildeSubst(interp, name)
+    Tcl_Interp *interp;                /* Interpreter in which to store error
+                                * message (if necessary). */
+    char *name;                        /* File name, which may begin with "~/"
+                                * (to indicate current user's home directory)
+                                * or "~<user>/" (to indicate any user's
+                                * home directory). */
+{
+#define STATIC_BUF_SIZE 50
+    static char staticBuf[STATIC_BUF_SIZE];
+    static int curSize = STATIC_BUF_SIZE;
+    static char *curBuf = staticBuf;
+    char *dir;
+    int length;
+    int fromPw = 0;
+    register char *p;
+
+    if (name[0] != '~') {
+       return name;
+    }
+
+#ifdef MSDOS
+    dvpath(dir);
+    if (name[1] != '/') {
+        strcat(dir,"/");
+        p = name;
+    }
+    else
+        p = name +1;
+#else
+
+    /*
+     * First, find the directory name corresponding to the tilde entry.
+     */
+
+    if ((name[1] == '/') || (name[1] == '\0')) {
+       dir = getenv("HOME");
+       if (dir == NULL) {
+           Tcl_ResetResult(interp);
+           Tcl_AppendResult(interp, "couldn't find HOME environment ",
+                   "variable to expand \"", name, "\"", (char *) NULL);
+           return NULL;
+       }
+       p = name+1;
+    } else {
+       struct passwd *pwPtr;
+
+       for (p = &name[1]; (*p != 0) && (*p != '/'); p++) {
+           /* Null body;  just find end of name. */
+       }
+       length = p-&name[1];
+       if (length >= curSize) {
+           length = curSize-1;
+       }
+       memcpy((VOID *) curBuf, (VOID *) (name+1), length);
+       curBuf[length] = '\0';
+       pwPtr = getpwnam(curBuf);
+       if (pwPtr == NULL) {
+           Tcl_ResetResult(interp);
+           Tcl_AppendResult(interp, "user \"", curBuf,
+                   "\" doesn't exist", (char *) NULL);
+           return NULL;
+       }
+       dir = pwPtr->pw_dir;
+       fromPw = 1;
+    }
+#endif
+
+    /*
+     * Grow the buffer if necessary to make enough space for the
+     * full file name.
+     */
+
+    length = strlen(dir) + strlen(p);
+    if (length >= curSize) {
+       if (curBuf != staticBuf) {
+           ckfree(curBuf);
+       }
+       curSize = length + 1;
+       curBuf = (char *) ckalloc((unsigned) curSize);
+    }
+
+    /*
+     * Finally, concatenate the directory name with the remainder
+     * of the path in the buffer.
+     */
+
+    strcpy(curBuf, dir);
+    strcat(curBuf, p);
+#ifndef MSDOS
+    if (fromPw) {
+       endpwent();
+    }
+#endif
+    return curBuf;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_GlobCmd --
+ *
+ *     This procedure is invoked to process the "glob" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_GlobCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int i, result, noComplain;
+
+    if (argc < 2) {
+       notEnoughArgs:
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " ?-nocomplain? name ?name ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    noComplain = 0;
+    if ((argv[1][0] == '-') && (strcmp(argv[1], "-nocomplain") == 0)) {
+       if (argc < 3) {
+           goto notEnoughArgs;
+       }
+       noComplain = 1;
+    }
+
+    for (i = 1 + noComplain; i < argc; i++) {
+       char *thisName;
+
+       /*
+        * Do special checks for names starting at the root and for
+        * names beginning with ~.  Then let DoGlob do the rest.
+        */
+
+       thisName = argv[i];
+       if (*thisName == '~') {
+           thisName = Tcl_TildeSubst(interp, thisName);
+           if (thisName == NULL) {
+               return TCL_ERROR;
+           }
+       }
+       if (*thisName == '/') {
+           result = DoGlob(interp, "/", thisName+1);
+       } else {
+           result = DoGlob(interp, "", thisName);
+       }
+       if (result != TCL_OK) {
+           return result;
+       }
+    }
+    if ((*interp->result == 0) && !noComplain) {
+       char *sep = "";
+
+       Tcl_AppendResult(interp, "no files matched glob pattern",
+               (argc == 2) ? " \"" : "s \"", (char *) NULL);
+       for (i = 1; i < argc; i++) {
+           Tcl_AppendResult(interp, sep, argv[i], (char *) NULL);
+           sep = " ";
+       }
+       Tcl_AppendResult(interp, "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
diff --git a/src/tcl/tclhash.c b/src/tcl/tclhash.c
new file mode 100644 (file)
index 0000000..3d02764
--- /dev/null
@@ -0,0 +1,931 @@
+/* 
+ * tclHash.c --
+ *
+ *     Implementation of in-memory hash tables for Tcl and Tcl-based
+ *     applications.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclHash.c,v 1.9 92/01/04 15:45:21 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tclint.h"
+
+/*
+ * Imported library procedures for which there are no header files:
+ */
+
+extern void panic();
+
+/*
+ * When there are this many entries per bucket, on average, rebuild
+ * the hash table to make it larger.
+ */
+
+#define REBUILD_MULTIPLIER     3
+
+
+/*
+ * The following macro takes a preliminary integer hash value and
+ * produces an index into a hash tables bucket list.  The idea is
+ * to make it so that preliminary values that are arbitrarily similar
+ * will end up in different buckets.  The hash function was taken
+ * from a random-number generator.
+ */
+
+#define RANDOM_INDEX(tablePtr, i) \
+    (((((long) (i))*1103515245) >> (tablePtr)->downShift) & (tablePtr)->mask)
+
+/*
+ * Procedure prototypes for static procedures in this file:
+ */
+
+static Tcl_HashEntry * ArrayFind _ANSI_ARGS_((Tcl_HashTable *tablePtr,
+                           char *key));
+static Tcl_HashEntry * ArrayCreate _ANSI_ARGS_((Tcl_HashTable *tablePtr,
+                           char *key, int *newPtr));
+static Tcl_HashEntry * BogusFind _ANSI_ARGS_((Tcl_HashTable *tablePtr,
+                           char *key));
+static Tcl_HashEntry * BogusCreate _ANSI_ARGS_((Tcl_HashTable *tablePtr,
+                           char *key, int *newPtr));
+static int             HashString _ANSI_ARGS_((char *string));
+static void            RebuildTable _ANSI_ARGS_((Tcl_HashTable *tablePtr));
+static Tcl_HashEntry * StringFind _ANSI_ARGS_((Tcl_HashTable *tablePtr,
+                           char *key));
+static Tcl_HashEntry * StringCreate _ANSI_ARGS_((Tcl_HashTable *tablePtr,
+                           char *key, int *newPtr));
+static Tcl_HashEntry * OneWordFind _ANSI_ARGS_((Tcl_HashTable *tablePtr,
+                           char *key));
+static Tcl_HashEntry * OneWordCreate _ANSI_ARGS_((Tcl_HashTable *tablePtr,
+                           char *key, int *newPtr));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_InitHashTable --
+ *
+ *     Given storage for a hash table, set up the fields to prepare
+ *     the hash table for use.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     TablePtr is now ready to be passed to Tcl_FindHashEntry and
+ *     Tcl_CreateHashEntry.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_InitHashTable(tablePtr, keyType)
+    register Tcl_HashTable *tablePtr;  /* Pointer to table record, which
+                                        * is supplied by the caller. */
+    int keyType;                       /* Type of keys to use in table:
+                                        * TCL_STRING_KEYS, TCL_ONE_WORD_KEYS,
+                                        * or an integer >= 2. */
+{
+    tablePtr->buckets = tablePtr->staticBuckets;
+    tablePtr->staticBuckets[0] = tablePtr->staticBuckets[1] = 0;
+    tablePtr->staticBuckets[2] = tablePtr->staticBuckets[3] = 0;
+    tablePtr->numBuckets = TCL_SMALL_HASH_TABLE;
+    tablePtr->numEntries = 0;
+    tablePtr->rebuildSize = TCL_SMALL_HASH_TABLE*REBUILD_MULTIPLIER;
+    tablePtr->downShift = 28;
+    tablePtr->mask = 3;
+    tablePtr->keyType = keyType;
+    if (keyType == TCL_STRING_KEYS) {
+       tablePtr->findProc = StringFind;
+       tablePtr->createProc = StringCreate;
+    } else if (keyType == TCL_ONE_WORD_KEYS) {
+       tablePtr->findProc = OneWordFind;
+       tablePtr->createProc = OneWordCreate;
+    } else {
+       tablePtr->findProc = ArrayFind;
+       tablePtr->createProc = ArrayCreate;
+    };
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_DeleteHashEntry --
+ *
+ *     Remove a single entry from a hash table.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The entry given by entryPtr is deleted from its table and
+ *     should never again be used by the caller.  It is up to the
+ *     caller to free the clientData field of the entry, if that
+ *     is relevant.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_DeleteHashEntry(entryPtr)
+    Tcl_HashEntry *entryPtr;
+{
+    register Tcl_HashEntry *prevPtr;
+
+    if (*entryPtr->bucketPtr == entryPtr) {
+       *entryPtr->bucketPtr = entryPtr->nextPtr;
+    } else {
+       for (prevPtr = *entryPtr->bucketPtr; ; prevPtr = prevPtr->nextPtr) {
+           if (prevPtr == NULL) {
+               panic("malformed bucket chain in Tcl_DeleteHashEntry");
+           }
+           if (prevPtr->nextPtr == entryPtr) {
+               prevPtr->nextPtr = entryPtr->nextPtr;
+               break;
+           }
+       }
+    }
+    entryPtr->tablePtr->numEntries--;
+    ckfree((char *) entryPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_DeleteHashTable --
+ *
+ *     Free up everything associated with a hash table except for
+ *     the record for the table itself.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The hash table is no longer useable.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_DeleteHashTable(tablePtr)
+    register Tcl_HashTable *tablePtr;          /* Table to delete. */
+{
+    register Tcl_HashEntry *hPtr, *nextPtr;
+    int i;
+
+    /*
+     * Free up all the entries in the table.
+     */
+
+    for (i = 0; i < tablePtr->numBuckets; i++) {
+       hPtr = tablePtr->buckets[i];
+       while (hPtr != NULL) {
+           nextPtr = hPtr->nextPtr;
+           ckfree((char *) hPtr);
+           hPtr = nextPtr;
+       }
+    }
+
+    /*
+     * Free up the bucket array, if it was dynamically allocated.
+     */
+
+    if (tablePtr->buckets != tablePtr->staticBuckets) {
+       ckfree((char *) tablePtr->buckets);
+    }
+
+    /*
+     * Arrange for panics if the table is used again without
+     * re-initialization.
+     */
+
+    tablePtr->findProc = BogusFind;
+    tablePtr->createProc = BogusCreate;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_FirstHashEntry --
+ *
+ *     Locate the first entry in a hash table and set up a record
+ *     that can be used to step through all the remaining entries
+ *     of the table.
+ *
+ * Results:
+ *     The return value is a pointer to the first entry in tablePtr,
+ *     or NULL if tablePtr has no entries in it.  The memory at
+ *     *searchPtr is initialized so that subsequent calls to
+ *     Tcl_NextHashEntry will return all of the entries in the table,
+ *     one at a time.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Tcl_HashEntry *
+Tcl_FirstHashEntry(tablePtr, searchPtr)
+    Tcl_HashTable *tablePtr;           /* Table to search. */
+    Tcl_HashSearch *searchPtr;         /* Place to store information about
+                                        * progress through the table. */
+{
+    searchPtr->tablePtr = tablePtr;
+    searchPtr->nextIndex = 0;
+    searchPtr->nextEntryPtr = NULL;
+    return Tcl_NextHashEntry(searchPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_NextHashEntry --
+ *
+ *     Once a hash table enumeration has been initiated by calling
+ *     Tcl_FirstHashEntry, this procedure may be called to return
+ *     successive elements of the table.
+ *
+ * Results:
+ *     The return value is the next entry in the hash table being
+ *     enumerated, or NULL if the end of the table is reached.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Tcl_HashEntry *
+Tcl_NextHashEntry(searchPtr)
+    register Tcl_HashSearch *searchPtr;        /* Place to store information about
+                                        * progress through the table.  Must
+                                        * have been initialized by calling
+                                        * Tcl_FirstHashEntry. */
+{
+    Tcl_HashEntry *hPtr;
+
+    while (searchPtr->nextEntryPtr == NULL) {
+       if (searchPtr->nextIndex >= searchPtr->tablePtr->numBuckets) {
+           return NULL;
+       }
+       searchPtr->nextEntryPtr =
+               searchPtr->tablePtr->buckets[searchPtr->nextIndex];
+       searchPtr->nextIndex++;
+    }
+    hPtr = searchPtr->nextEntryPtr;
+    searchPtr->nextEntryPtr = hPtr->nextPtr;
+    return hPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_HashStats --
+ *
+ *     Return statistics describing the layout of the hash table
+ *     in its hash buckets.
+ *
+ * Results:
+ *     The return value is a malloc-ed string containing information
+ *     about tablePtr.  It is the caller's responsibility to free
+ *     this string.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tcl_HashStats(tablePtr)
+    Tcl_HashTable *tablePtr;           /* Table for which to produce stats. */
+{
+#define NUM_COUNTERS 10
+    int count[NUM_COUNTERS], overflow, i, j;
+    double average, tmp;
+    register Tcl_HashEntry *hPtr;
+    char *result, *p;
+
+    /*
+     * Compute a histogram of bucket usage.
+     */
+
+    for (i = 0; i < NUM_COUNTERS; i++) {
+       count[i] = 0;
+    }
+    overflow = 0;
+    average = 0.0;
+    for (i = 0; i < tablePtr->numBuckets; i++) {
+       j = 0;
+       for (hPtr = tablePtr->buckets[i]; hPtr != NULL; hPtr = hPtr->nextPtr) {
+           j++;
+       }
+       if (j < NUM_COUNTERS) {
+           count[j]++;
+       } else {
+           overflow++;
+       }
+       tmp = j;
+       average += (tmp+1.0)*(tmp/tablePtr->numEntries)/2.0;
+    }
+
+    /*
+     * Print out the histogram and a few other pieces of information.
+     */
+
+    result = (char *) ckalloc((unsigned) ((NUM_COUNTERS*60) + 300));
+    sprintf(result, "%d entries in table, %d buckets\n",
+           tablePtr->numEntries, tablePtr->numBuckets);
+    p = result + strlen(result);
+    for (i = 0; i < NUM_COUNTERS; i++) {
+       sprintf(p, "number of buckets with %d entries: %d\n",
+               i, count[i]);
+       p += strlen(p);
+    }
+    sprintf(p, "number of buckets with more %d or more entries: %d\n",
+           NUM_COUNTERS, overflow);
+    p += strlen(p);
+    sprintf(p, "average search distance for entry: %.1f", average);
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * HashString --
+ *
+ *     Compute a one-word summary of a text string, which can be
+ *     used to generate a hash index.
+ *
+ * Results:
+ *     The return value is a one-word summary of the information in
+ *     string.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+HashString(string)
+    register char *string;     /* String from which to compute hash value. */
+{
+    register int result, c;
+
+    /*
+     * I tried a zillion different hash functions and asked many other
+     * people for advice.  Many people had their own favorite functions,
+     * all different, but no-one had much idea why they were good ones.
+     * I chose the one below (multiply by 9 and add new character)
+     * because of the following reasons:
+     *
+     * 1. Multiplying by 10 is perfect for keys that are decimal strings,
+     *    and multiplying by 9 is just about as good.
+     * 2. Times-9 is (shift-left-3) plus (old).  This means that each
+     *    character's bits hang around in the low-order bits of the
+     *    hash value for ever, plus they spread fairly rapidly up to
+     *    the high-order bits to fill out the hash value.  This seems
+     *    works well both for decimal and non-decimal strings.
+     */
+
+    result = 0;
+    while (1) {
+       c = *string;
+       string++;
+       if (c == 0) {
+           break;
+       }
+       result += (result<<3) + c;
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * StringFind --
+ *
+ *     Given a hash table with string keys, and a string key, find
+ *     the entry with a matching key.
+ *
+ * Results:
+ *     The return value is a token for the matching entry in the
+ *     hash table, or NULL if there was no matching entry.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static Tcl_HashEntry *
+StringFind(tablePtr, key)
+    Tcl_HashTable *tablePtr;   /* Table in which to lookup entry. */
+    char *key;                 /* Key to use to find matching entry. */
+{
+    register Tcl_HashEntry *hPtr;
+    register char *p1, *p2;
+    int index;
+
+    index = HashString(key) & tablePtr->mask;
+
+    /*
+     * Search all of the entries in the appropriate bucket.
+     */
+
+    for (hPtr = tablePtr->buckets[index]; hPtr != NULL;
+           hPtr = hPtr->nextPtr) {
+       for (p1 = key, p2 = hPtr->key.string; ; p1++, p2++) {
+           if (*p1 != *p2) {
+               break;
+           }
+           if (*p1 == '\0') {
+               return hPtr;
+           }
+       }
+    }
+    return NULL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * StringCreate --
+ *
+ *     Given a hash table with string keys, and a string key, find
+ *     the entry with a matching key.  If there is no matching entry,
+ *     then create a new entry that does match.
+ *
+ * Results:
+ *     The return value is a pointer to the matching entry.  If this
+ *     is a newly-created entry, then *newPtr will be set to a non-zero
+ *     value;  otherwise *newPtr will be set to 0.  If this is a new
+ *     entry the value stored in the entry will initially be 0.
+ *
+ * Side effects:
+ *     A new entry may be added to the hash table.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static Tcl_HashEntry *
+StringCreate(tablePtr, key, newPtr)
+    Tcl_HashTable *tablePtr;   /* Table in which to lookup entry. */
+    char *key;                 /* Key to use to find or create matching
+                                * entry. */
+    int *newPtr;               /* Store info here telling whether a new
+                                * entry was created. */
+{
+    register Tcl_HashEntry *hPtr;
+    register char *p1, *p2;
+    int index;
+
+    index = HashString(key) & tablePtr->mask;
+
+    /*
+     * Search all of the entries in this bucket.
+     */
+
+    for (hPtr = tablePtr->buckets[index]; hPtr != NULL;
+           hPtr = hPtr->nextPtr) {
+       for (p1 = key, p2 = hPtr->key.string; ; p1++, p2++) {
+           if (*p1 != *p2) {
+               break;
+           }
+           if (*p1 == '\0') {
+               *newPtr = 0;
+               return hPtr;
+           }
+       }
+    }
+
+    /*
+     * Entry not found.  Add a new one to the bucket.
+     */
+
+    *newPtr = 1;
+    hPtr = (Tcl_HashEntry *) ckalloc((unsigned)
+           (sizeof(Tcl_HashEntry) + strlen(key) - (sizeof(hPtr->key) -1)));
+    hPtr->tablePtr = tablePtr;
+    hPtr->bucketPtr = &(tablePtr->buckets[index]);
+    hPtr->nextPtr = *hPtr->bucketPtr;
+    hPtr->clientData = 0;
+    strcpy(hPtr->key.string, key);
+    *hPtr->bucketPtr = hPtr;
+    tablePtr->numEntries++;
+
+    /*
+     * If the table has exceeded a decent size, rebuild it with many
+     * more buckets.
+     */
+
+    if (tablePtr->numEntries >= tablePtr->rebuildSize) {
+       RebuildTable(tablePtr);
+    }
+    return hPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * OneWordFind --
+ *
+ *     Given a hash table with one-word keys, and a one-word key, find
+ *     the entry with a matching key.
+ *
+ * Results:
+ *     The return value is a token for the matching entry in the
+ *     hash table, or NULL if there was no matching entry.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static Tcl_HashEntry *
+OneWordFind(tablePtr, key)
+    Tcl_HashTable *tablePtr;   /* Table in which to lookup entry. */
+    register char *key;                /* Key to use to find matching entry. */
+{
+    register Tcl_HashEntry *hPtr;
+    int index;
+
+    index = RANDOM_INDEX(tablePtr, key);
+
+    /*
+     * Search all of the entries in the appropriate bucket.
+     */
+
+    for (hPtr = tablePtr->buckets[index]; hPtr != NULL;
+           hPtr = hPtr->nextPtr) {
+       if (hPtr->key.oneWordValue == key) {
+           return hPtr;
+       }
+    }
+    return NULL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * OneWordCreate --
+ *
+ *     Given a hash table with one-word keys, and a one-word key, find
+ *     the entry with a matching key.  If there is no matching entry,
+ *     then create a new entry that does match.
+ *
+ * Results:
+ *     The return value is a pointer to the matching entry.  If this
+ *     is a newly-created entry, then *newPtr will be set to a non-zero
+ *     value;  otherwise *newPtr will be set to 0.  If this is a new
+ *     entry the value stored in the entry will initially be 0.
+ *
+ * Side effects:
+ *     A new entry may be added to the hash table.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static Tcl_HashEntry *
+OneWordCreate(tablePtr, key, newPtr)
+    Tcl_HashTable *tablePtr;   /* Table in which to lookup entry. */
+    register char *key;                /* Key to use to find or create matching
+                                * entry. */
+    int *newPtr;               /* Store info here telling whether a new
+                                * entry was created. */
+{
+    register Tcl_HashEntry *hPtr;
+    int index;
+
+    index = RANDOM_INDEX(tablePtr, key);
+
+    /*
+     * Search all of the entries in this bucket.
+     */
+
+    for (hPtr = tablePtr->buckets[index]; hPtr != NULL;
+           hPtr = hPtr->nextPtr) {
+       if (hPtr->key.oneWordValue == key) {
+           *newPtr = 0;
+           return hPtr;
+       }
+    }
+
+    /*
+     * Entry not found.  Add a new one to the bucket.
+     */
+
+    *newPtr = 1;
+    hPtr = (Tcl_HashEntry *) ckalloc(sizeof(Tcl_HashEntry));
+    hPtr->tablePtr = tablePtr;
+    hPtr->bucketPtr = &(tablePtr->buckets[index]);
+    hPtr->nextPtr = *hPtr->bucketPtr;
+    hPtr->clientData = 0;
+    hPtr->key.oneWordValue = key;
+    *hPtr->bucketPtr = hPtr;
+    tablePtr->numEntries++;
+
+    /*
+     * If the table has exceeded a decent size, rebuild it with many
+     * more buckets.
+     */
+
+    if (tablePtr->numEntries >= tablePtr->rebuildSize) {
+       RebuildTable(tablePtr);
+    }
+    return hPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ArrayFind --
+ *
+ *     Given a hash table with array-of-int keys, and a key, find
+ *     the entry with a matching key.
+ *
+ * Results:
+ *     The return value is a token for the matching entry in the
+ *     hash table, or NULL if there was no matching entry.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static Tcl_HashEntry *
+ArrayFind(tablePtr, key)
+    Tcl_HashTable *tablePtr;   /* Table in which to lookup entry. */
+    char *key;                 /* Key to use to find matching entry. */
+{
+    register Tcl_HashEntry *hPtr;
+    int *arrayPtr = (int *) key;
+    register int *iPtr1, *iPtr2;
+    int index, count;
+
+    for (index = 0, count = tablePtr->keyType, iPtr1 = arrayPtr;
+           count > 0; count--, iPtr1++) {
+       index += *iPtr1;
+    }
+    index = RANDOM_INDEX(tablePtr, index);
+
+    /*
+     * Search all of the entries in the appropriate bucket.
+     */
+
+    for (hPtr = tablePtr->buckets[index]; hPtr != NULL;
+           hPtr = hPtr->nextPtr) {
+       for (iPtr1 = arrayPtr, iPtr2 = hPtr->key.words,
+               count = tablePtr->keyType; ; count--, iPtr1++, iPtr2++) {
+           if (count == 0) {
+               return hPtr;
+           }
+           if (*iPtr1 != *iPtr2) {
+               break;
+           }
+       }
+    }
+    return NULL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ArrayCreate --
+ *
+ *     Given a hash table with one-word keys, and a one-word key, find
+ *     the entry with a matching key.  If there is no matching entry,
+ *     then create a new entry that does match.
+ *
+ * Results:
+ *     The return value is a pointer to the matching entry.  If this
+ *     is a newly-created entry, then *newPtr will be set to a non-zero
+ *     value;  otherwise *newPtr will be set to 0.  If this is a new
+ *     entry the value stored in the entry will initially be 0.
+ *
+ * Side effects:
+ *     A new entry may be added to the hash table.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static Tcl_HashEntry *
+ArrayCreate(tablePtr, key, newPtr)
+    Tcl_HashTable *tablePtr;   /* Table in which to lookup entry. */
+    register char *key;                /* Key to use to find or create matching
+                                * entry. */
+    int *newPtr;               /* Store info here telling whether a new
+                                * entry was created. */
+{
+    register Tcl_HashEntry *hPtr;
+    int *arrayPtr = (int *) key;
+    register int *iPtr1, *iPtr2;
+    int index, count;
+
+    for (index = 0, count = tablePtr->keyType, iPtr1 = arrayPtr;
+           count > 0; count--, iPtr1++) {
+       index += *iPtr1;
+    }
+    index = RANDOM_INDEX(tablePtr, index);
+
+    /*
+     * Search all of the entries in the appropriate bucket.
+     */
+
+    for (hPtr = tablePtr->buckets[index]; hPtr != NULL;
+           hPtr = hPtr->nextPtr) {
+       for (iPtr1 = arrayPtr, iPtr2 = hPtr->key.words,
+               count = tablePtr->keyType; ; count--, iPtr1++, iPtr2++) {
+           if (count == 0) {
+               *newPtr = 0;
+               return hPtr;
+           }
+           if (*iPtr1 != *iPtr2) {
+               break;
+           }
+       }
+    }
+
+    /*
+     * Entry not found.  Add a new one to the bucket.
+     */
+
+    *newPtr = 1;
+    hPtr = (Tcl_HashEntry *) ckalloc((unsigned) (sizeof(Tcl_HashEntry)
+           + (tablePtr->keyType*sizeof(int)) - 4));
+    hPtr->tablePtr = tablePtr;
+    hPtr->bucketPtr = &(tablePtr->buckets[index]);
+    hPtr->nextPtr = *hPtr->bucketPtr;
+    hPtr->clientData = 0;
+    for (iPtr1 = arrayPtr, iPtr2 = hPtr->key.words, count = tablePtr->keyType;
+           count > 0; count--, iPtr1++, iPtr2++) {
+       *iPtr2 = *iPtr1;
+    }
+    *hPtr->bucketPtr = hPtr;
+    tablePtr->numEntries++;
+
+    /*
+     * If the table has exceeded a decent size, rebuild it with many
+     * more buckets.
+     */
+
+    if (tablePtr->numEntries >= tablePtr->rebuildSize) {
+       RebuildTable(tablePtr);
+    }
+    return hPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * BogusFind --
+ *
+ *     This procedure is invoked when an Tcl_FindHashEntry is called
+ *     on a table that has been deleted.
+ *
+ * Results:
+ *     If panic returns (which it shouldn't) this procedure returns
+ *     NULL.
+ *
+ * Side effects:
+ *     Generates a panic.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static Tcl_HashEntry *
+BogusFind(tablePtr, key)
+    Tcl_HashTable *tablePtr;   /* Table in which to lookup entry. */
+    char *key;                 /* Key to use to find matching entry. */
+{
+    panic("called Tcl_FindHashEntry on deleted table");
+    return NULL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * BogusCreate --
+ *
+ *     This procedure is invoked when an Tcl_CreateHashEntry is called
+ *     on a table that has been deleted.
+ *
+ * Results:
+ *     If panic returns (which it shouldn't) this procedure returns
+ *     NULL.
+ *
+ * Side effects:
+ *     Generates a panic.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static Tcl_HashEntry *
+BogusCreate(tablePtr, key, newPtr)
+    Tcl_HashTable *tablePtr;   /* Table in which to lookup entry. */
+    char *key;                 /* Key to use to find or create matching
+                                * entry. */
+    int *newPtr;               /* Store info here telling whether a new
+                                * entry was created. */
+{
+    panic("called Tcl_CreateHashEntry on deleted table");
+    return NULL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * RebuildTable --
+ *
+ *     This procedure is invoked when the ratio of entries to hash
+ *     buckets becomes too large.  It creates a new table with a
+ *     larger bucket array and moves all of the entries into the
+ *     new table.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Memory gets reallocated and entries get re-hashed to new
+ *     buckets.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+RebuildTable(tablePtr)
+    register Tcl_HashTable *tablePtr;  /* Table to enlarge. */
+{
+    int oldSize, count, index;
+    Tcl_HashEntry **oldBuckets;
+    register Tcl_HashEntry **oldChainPtr, **newChainPtr;
+    register Tcl_HashEntry *hPtr;
+
+    oldSize = tablePtr->numBuckets;
+    oldBuckets = tablePtr->buckets;
+
+    /*
+     * Allocate and initialize the new bucket array, and set up
+     * hashing constants for new array size.
+     */
+
+    tablePtr->numBuckets *= 4;
+    tablePtr->buckets = (Tcl_HashEntry **) ckalloc((unsigned)
+           (tablePtr->numBuckets * sizeof(Tcl_HashEntry *)));
+    for (count = tablePtr->numBuckets, newChainPtr = tablePtr->buckets;
+           count > 0; count--, newChainPtr++) {
+       *newChainPtr = NULL;
+    }
+    tablePtr->rebuildSize *= 4;
+    tablePtr->downShift -= 2;
+    tablePtr->mask = (tablePtr->mask << 2) + 3;
+
+    /*
+     * Rehash all of the existing entries into the new bucket array.
+     */
+
+    for (oldChainPtr = oldBuckets; oldSize > 0; oldSize--, oldChainPtr++) {
+       for (hPtr = *oldChainPtr; hPtr != NULL; hPtr = *oldChainPtr) {
+           *oldChainPtr = hPtr->nextPtr;
+           if (tablePtr->keyType == TCL_STRING_KEYS) {
+               index = HashString(hPtr->key.string) & tablePtr->mask;
+           } else if (tablePtr->keyType == TCL_ONE_WORD_KEYS) {
+               index = RANDOM_INDEX(tablePtr, hPtr->key.oneWordValue);
+           } else {
+               register int *iPtr;
+               int count;
+
+               for (index = 0, count = tablePtr->keyType,
+                       iPtr = hPtr->key.words; count > 0; count--, iPtr++) {
+                   index += *iPtr;
+               }
+               index = RANDOM_INDEX(tablePtr, index);
+           }
+           hPtr->bucketPtr = &(tablePtr->buckets[index]);
+           hPtr->nextPtr = *hPtr->bucketPtr;
+           *hPtr->bucketPtr = hPtr;
+       }
+    }
+
+    /*
+     * Free up the old bucket array, if it was dynamically allocated.
+     */
+
+    if (oldBuckets != tablePtr->staticBuckets) {
+       ckfree((char *) oldBuckets);
+    }
+}
diff --git a/src/tcl/tclhash.h b/src/tcl/tclhash.h
new file mode 100644 (file)
index 0000000..b390573
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * tclHash.h --
+ *
+ *     This header file declares the facilities provided by the
+ *     Tcl hash table procedures.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /sprite/src/lib/tcl/RCS/tclHash.h,v 1.3 91/08/27 11:36:04 ouster Exp $ SPRITE (Berkeley)
+ */
+
+#ifndef _TCLHASH
+#define _TCLHASH
+
+#ifndef _TCL
+#include <tcl.h>
+#endif
+
+/*
+ * Structure definition for an entry in a hash table.  No-one outside
+ * Tcl should access any of these fields directly;  use the macros
+ * defined below.
+ */
+
+typedef struct Tcl_HashEntry {
+    struct Tcl_HashEntry *nextPtr;     /* Pointer to next entry in this
+                                        * hash bucket, or NULL for end of
+                                        * chain. */
+    struct Tcl_HashTable *tablePtr;    /* Pointer to table containing entry. */
+    struct Tcl_HashEntry **bucketPtr;  /* Pointer to bucket that points to
+                                        * first entry in this entry's chain:
+                                        * used for deleting the entry. */
+    ClientData clientData;             /* Application stores something here
+                                        * with Tcl_SetHashValue. */
+    union {                            /* Key has one of these forms: */
+       char *oneWordValue;             /* One-word value for key. */
+       int words[1];                   /* Multiple integer words for key.
+                                        * The actual size will be as large
+                                        * as necessary for this table's
+                                        * keys. */
+       char string[4];                 /* String for key.  The actual size
+                                        * will be as large as needed to hold
+                                        * the key. */
+    } key;                             /* MUST BE LAST FIELD IN RECORD!! */
+} Tcl_HashEntry;
+
+/*
+ * Structure definition for a hash table.  Must be in tcl.h so clients
+ * can allocate space for these structures, but clients should never
+ * access any fields in this structure.
+ */
+
+#define TCL_SMALL_HASH_TABLE 4
+typedef struct Tcl_HashTable {
+    Tcl_HashEntry **buckets;           /* Pointer to bucket array.  Each
+                                        * element points to first entry in
+                                        * bucket's hash chain, or NULL. */
+    Tcl_HashEntry *staticBuckets[TCL_SMALL_HASH_TABLE];
+                                       /* Bucket array used for small tables
+                                        * (to avoid mallocs and frees). */
+    int numBuckets;                    /* Total number of buckets allocated
+                                        * at **bucketPtr. */
+    int numEntries;                    /* Total number of entries present
+                                        * in table. */
+    int rebuildSize;                   /* Enlarge table when numEntries gets
+                                        * to be this large. */
+    int downShift;                     /* Shift count used in hashing
+                                        * function.  Designed to use high-
+                                        * order bits of randomized keys. */
+    int mask;                          /* Mask value used in hashing
+                                        * function. */
+    int keyType;                       /* Type of keys used in this table. 
+                                        * It's either TCL_STRING_KEYS,
+                                        * TCL_ONE_WORD_KEYS, or an integer
+                                        * giving the number of ints in a
+                                        */
+    Tcl_HashEntry *(*findProc) _ANSI_ARGS_((struct Tcl_HashTable *tablePtr,
+           char *key));
+    Tcl_HashEntry *(*createProc) _ANSI_ARGS_((struct Tcl_HashTable *tablePtr,
+           char *key, int *newPtr));
+} Tcl_HashTable;
+
+/*
+ * Structure definition for information used to keep track of searches
+ * through hash tables:
+ */
+
+typedef struct Tcl_HashSearch {
+    Tcl_HashTable *tablePtr;           /* Table being searched. */
+    int nextIndex;                     /* Index of next bucket to be
+                                        * enumerated after present one. */
+    Tcl_HashEntry *nextEntryPtr;       /* Next entry to be enumerated in the
+                                        * the current bucket. */
+} Tcl_HashSearch;
+
+/*
+ * Acceptable key types for hash tables:
+ */
+
+#define TCL_STRING_KEYS                0
+#define TCL_ONE_WORD_KEYS      1
+
+/*
+ * Macros for clients to use to access fields of hash entries:
+ */
+
+#define Tcl_GetHashValue(h) ((h)->clientData)
+#define Tcl_SetHashValue(h, value) ((h)->clientData = (ClientData) (value))
+#define Tcl_GetHashKey(tablePtr, h) \
+    ((char *) (((tablePtr)->keyType == TCL_ONE_WORD_KEYS) ? (h)->key.oneWordValue \
+                                               : (h)->key.string))
+
+/*
+ * Macros to use for clients to use to invoke find and create procedures
+ * for hash tables:
+ */
+
+#define Tcl_FindHashEntry(tablePtr, key) \
+       (*((tablePtr)->findProc))(tablePtr, key)
+#define Tcl_CreateHashEntry(tablePtr, key, newPtr) \
+       (*((tablePtr)->createProc))(tablePtr, key, newPtr)
+
+/*
+ * Exported procedures:
+ */
+
+extern void            Tcl_DeleteHashEntry _ANSI_ARGS_((
+                           Tcl_HashEntry *entryPtr));
+extern void            Tcl_DeleteHashTable _ANSI_ARGS_((
+                           Tcl_HashTable *tablePtr));
+extern Tcl_HashEntry * Tcl_FirstHashEntry _ANSI_ARGS_((
+                           Tcl_HashTable *tablePtr,
+                           Tcl_HashSearch *searchPtr));
+extern char *          Tcl_HashStats _ANSI_ARGS_((Tcl_HashTable *tablePtr));
+extern void            Tcl_InitHashTable _ANSI_ARGS_((Tcl_HashTable *tablePtr,
+                           int keyType));
+extern Tcl_HashEntry * Tcl_NextHashEntry _ANSI_ARGS_((
+                           Tcl_HashSearch *searchPtr));
+
+#endif /* _TCLHASH */
diff --git a/src/tcl/tclhist.c b/src/tcl/tclhist.c
new file mode 100644 (file)
index 0000000..d715564
--- /dev/null
@@ -0,0 +1,1093 @@
+/* 
+ * tclHistory.c --
+ *
+ *     This module implements history as an optional addition to Tcl.
+ *     It can be called to record commands ("events") before they are
+ *     executed, and it provides a command that may be used to perform
+ *     history substitutions.
+ *
+ * Copyright 1990-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclHistory.c,v 1.23 91/10/28 09:11:16 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tclint.h"
+
+/*
+ * This history stuff is mostly straightforward, except for one thing
+ * that makes everything very complicated.  Suppose that the following
+ * commands get executed:
+ *     echo foo
+ *     history redo
+ * It's important that the history event recorded for the second command
+ * be "echo foo", not "history redo".  Otherwise, if another "history redo"
+ * command is typed, it will result in infinite recursions on the
+ * "history redo" command.  Thus, the actual recorded history must be
+ *     echo foo
+ *     echo foo
+ * To do this, the history command revises recorded history as part of
+ * its execution.  In the example above, when "history redo" starts
+ * execution, the current event is "history redo", but the history
+ * command arranges for the current event to be changed to "echo foo".
+ *
+ * There are three additional complications.  The first is that history
+ * substitution may only be part of a command, as in the following
+ * command sequence:
+ *     echo foo bar
+ *     echo [history word 3]
+ * In this case, the second event should be recorded as "echo bar".  Only
+ * part of the recorded event is to be modified.  Fortunately, Tcl_Eval
+ * helps with this by recording (in the evalFirst and evalLast fields of
+ * the intepreter) the location of the command being executed, so the
+ * history module can replace exactly the range of bytes corresponding
+ * to the history substitution command.
+ *
+ * The second complication is that there are two ways to revise history:
+ * replace a command, and replace the result of a command.  Consider the
+ * two examples below:
+ *     format {result is %d} $num         |    format {result is %d} $num
+ *     print [history redo]               |    print [history word 3]
+ * Recorded history for these two cases should be as follows:
+ *     format {result is %d} $num         |    format {result is %d} $num
+ *     print [format {result is %d} $num] |    print $num
+ * In the left case, the history command was replaced with another command
+ * to be executed (the brackets were retained), but in the case on the
+ * right the result of executing the history command was replaced (i.e.
+ * brackets were replaced too).
+ *
+ * The third complication is that there could potentially be many
+ * history substitutions within a single command, as in:
+ *     echo [history word 3] [history word 2]
+ * There could even be nested history substitutions, as in:
+ *     history subs abc [history word 2]
+ * If history revisions were made immediately during each "history" command
+ * invocations, it would be very difficult to produce the correct cumulative
+ * effect from several substitutions in the same command.  To get around
+ * this problem, the actual history revision isn't made during the execution
+ * of the "history" command.  Information about the changes is just recorded,
+ * in xxx records, and the actual changes are made during the next call to
+ * Tcl_RecordHistory (when we know that execution of the previous command
+ * has finished).
+ */
+
+/*
+ * Default space allocation for command strings:
+ */
+
+#define INITIAL_CMD_SIZE 40
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            DoRevs _ANSI_ARGS_((Interp *iPtr));
+static HistoryEvent *  GetEvent _ANSI_ARGS_((Interp *iPtr, char *string));
+static char *          GetWords _ANSI_ARGS_((Interp *iPtr, char *command,
+                           char *words));
+static void            InsertRev _ANSI_ARGS_((Interp *iPtr,
+                           HistoryRev *revPtr));
+static void            MakeSpace _ANSI_ARGS_((HistoryEvent *hPtr, int size));
+static void            RevCommand _ANSI_ARGS_((Interp *iPtr, char *string));
+static void            RevResult _ANSI_ARGS_((Interp *iPtr, char *string));
+static int             SubsAndEval _ANSI_ARGS_((Interp *iPtr, char *cmd,
+                           char *old, char *new));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_InitHistory --
+ *
+ *     Initialize history-related state in an interpreter.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     History info is initialized in iPtr.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_InitHistory(interp)
+    Tcl_Interp *interp;                /* Interpreter to initialize. */
+{
+    register Interp *iPtr = (Interp *) interp;
+    int i;
+
+    if (iPtr->numEvents != 0) {
+       return;
+    }
+    iPtr->numEvents = 20;
+    iPtr->events = (HistoryEvent *)
+           ckalloc((unsigned) (iPtr->numEvents * sizeof(HistoryEvent)));
+    for (i = 0; i < iPtr->numEvents; i++) {
+       iPtr->events[i].command = (char *) ckalloc(INITIAL_CMD_SIZE);
+       *iPtr->events[i].command = 0;
+       iPtr->events[i].bytesAvl = INITIAL_CMD_SIZE;
+    }
+    iPtr->curEvent = 0;
+    iPtr->curEventNum = 0;
+    Tcl_CreateCommand((Tcl_Interp *) iPtr, "history", Tcl_HistoryCmd,
+           (ClientData) NULL, (void (*)()) NULL);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_RecordAndEval --
+ *
+ *     This procedure adds its command argument to the current list of
+ *     recorded events and then executes the command by calling Tcl_Eval.
+ *
+ * Results:
+ *     The return value is a standard Tcl return value, the result of
+ *     executing cmd.
+ *
+ * Side effects:
+ *     The command is recorded and executed.  In addition, pending history
+ *     revisions are carried out, and information is set up to enable
+ *     Tcl_Eval to identify history command ranges.  This procedure also
+ *     initializes history information for the interpreter, if it hasn't
+ *     already been initialized.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_RecordAndEval(interp, cmd, flags)
+    Tcl_Interp *interp;                /* Token for interpreter in which command
+                                * will be executed. */
+    char *cmd;                 /* Command to record. */
+    int flags;                 /* Additional flags to pass to Tcl_Eval. 
+                                * TCL_NO_EVAL means only record: don't
+                                * execute command. */
+{
+    register Interp *iPtr = (Interp *) interp;
+    register HistoryEvent *eventPtr;
+    int length, result;
+
+    if (iPtr->numEvents == 0) {
+       Tcl_InitHistory(interp);
+    }
+    DoRevs(iPtr);
+
+    /*
+     * Don't record empty commands.
+     */
+
+    while (isspace(*cmd)) {
+       cmd++;
+    }
+    if (*cmd == '\0') {
+       Tcl_ResetResult(interp);
+       return TCL_OK;
+    }
+
+    iPtr->curEventNum++;
+    iPtr->curEvent++;
+    if (iPtr->curEvent >= iPtr->numEvents) {
+       iPtr->curEvent = 0;
+    }
+    eventPtr = &iPtr->events[iPtr->curEvent];
+
+    /*
+     * Chop off trailing newlines before recording the command.
+     */
+
+    length = strlen(cmd);
+    while (cmd[length-1] == '\n') {
+       length--;
+    }
+    MakeSpace(eventPtr, length + 1);
+    strncpy(eventPtr->command, cmd, length);
+    eventPtr->command[length] = 0;
+
+    /*
+     * Execute the command.  Note: history revision isn't possible after
+     * a nested call to this procedure, because the event at the top of
+     * the history list no longer corresponds to what's going on when
+     * a nested call here returns.  Thus, must leave history revision
+     * disabled when we return.
+     */
+
+    result = TCL_OK;
+    if (flags != TCL_NO_EVAL) {
+       iPtr->historyFirst = cmd;
+       iPtr->revDisables = 0;
+       result = Tcl_Eval(interp, cmd, flags | TCL_RECORD_BOUNDS,
+               (char **) NULL);
+    }
+    iPtr->revDisables = 1;
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_HistoryCmd --
+ *
+ *     This procedure is invoked to process the "history" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_HistoryCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    register Interp *iPtr = (Interp *) interp;
+    register HistoryEvent *eventPtr;
+    int length;
+    char c;
+
+    /*
+     * If no arguments, treat the same as "history info".
+     */
+
+    if (argc == 1) {
+       goto infoCmd;
+    }
+
+    c = argv[1][0];
+    length = strlen(argv[1]);
+
+    if ((c == 'a') && (strncmp(argv[1], "add", length)) == 0) {
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " add event ?exec?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 4) {
+           if (strncmp(argv[3], "exec", strlen(argv[3])) != 0) {
+               Tcl_AppendResult(interp, "bad argument \"", argv[3],
+                       "\": should be \"exec\"", (char *) NULL);
+               return TCL_ERROR;
+           }
+           return Tcl_RecordAndEval(interp, argv[2], 0);
+       }
+       return Tcl_RecordAndEval(interp, argv[2], TCL_NO_EVAL);
+    } else if ((c == 'c') && (strncmp(argv[1], "change", length)) == 0) {
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " change newValue ?event?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           eventPtr = &iPtr->events[iPtr->curEvent];
+           iPtr->revDisables += 1;
+           while (iPtr->revPtr != NULL) {
+               HistoryRev *nextPtr;
+
+               ckfree(iPtr->revPtr->newBytes);
+               nextPtr = iPtr->revPtr->nextPtr;
+               ckfree((char *) iPtr->revPtr);
+               iPtr->revPtr = nextPtr;
+           }
+       } else {
+           eventPtr = GetEvent(iPtr, argv[3]);
+           if (eventPtr == NULL) {
+               return TCL_ERROR;
+           }
+       }
+       MakeSpace(eventPtr, strlen(argv[2]) + 1);
+       strcpy(eventPtr->command, argv[2]);
+       return TCL_OK;
+    } else if ((c == 'e') && (strncmp(argv[1], "event", length)) == 0) {
+       if (argc > 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " event ?event?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       eventPtr = GetEvent(iPtr, argc==2 ? "-1" : argv[2]);
+       if (eventPtr == NULL) {
+           return TCL_ERROR;
+       }
+       RevResult(iPtr, eventPtr->command);
+       Tcl_SetResult(interp, eventPtr->command, TCL_VOLATILE);
+       return TCL_OK;
+    } else if ((c == 'i') && (strncmp(argv[1], "info", length)) == 0) {
+       int count, indx, i;
+       char *newline;
+
+       if ((argc != 2) && (argc != 3)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " info ?count?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       infoCmd:
+       if (argc == 3) {
+           if (Tcl_GetInt(interp, argv[2], &count) != TCL_OK) {
+               return TCL_ERROR;
+           }
+           if (count > iPtr->numEvents) {
+               count = iPtr->numEvents;
+           }
+       } else {
+           count = iPtr->numEvents;
+       }
+       newline = "";
+       for (i = 0, indx = iPtr->curEvent + 1 + iPtr->numEvents - count;
+               i < count; i++, indx++) {
+           char *cur, *next, savedChar;
+           char serial[20];
+
+           if (indx >= iPtr->numEvents) {
+               indx -= iPtr->numEvents;
+           }
+           cur = iPtr->events[indx].command;
+           if (*cur == '\0') {
+               continue;               /* No command recorded here. */
+           }
+           sprintf(serial, "%6d  ", iPtr->curEventNum + 1 - (count - i));
+           Tcl_AppendResult(interp, newline, serial, (char *) NULL);
+           newline = "\n";
+
+           /*
+            * Tricky formatting here:  for multi-line commands, indent
+            * the continuation lines.
+            */
+
+           while (1) {
+               next = strchr(cur, '\n');
+               if (next == NULL) {
+                   break;
+               }
+               next++;
+               savedChar = *next;
+               *next = 0;
+               Tcl_AppendResult(interp, cur, "\t", (char *) NULL);
+               *next = savedChar;
+               cur = next;
+           }
+           Tcl_AppendResult(interp, cur, (char *) NULL);
+       }
+       return TCL_OK;
+    } else if ((c == 'k') && (strncmp(argv[1], "keep", length)) == 0) {
+       int count, i, src;
+       HistoryEvent *events;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " keep number\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (Tcl_GetInt(interp, argv[2], &count) != TCL_OK) {
+           return TCL_ERROR;
+       }
+       if ((count <= 0) || (count > 1000)) {
+           Tcl_AppendResult(interp, "illegal keep count \"", argv[2],
+                   "\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+
+       /*
+        * Create a new history array and copy as much existing history
+        * as possible from the old array.
+        */
+
+       events = (HistoryEvent *)
+               ckalloc((unsigned) (count * sizeof(HistoryEvent)));
+       if (count < iPtr->numEvents) {
+           src = iPtr->curEvent + 1 - count;
+           if (src < 0) {
+               src += iPtr->numEvents;
+           }
+       } else {
+           src = iPtr->curEvent + 1;
+       }
+       for (i = 0; i < count; i++, src++) {
+           if (src >= iPtr->numEvents) {
+               src = 0;
+           }
+           if (i < iPtr->numEvents) {
+               events[i] = iPtr->events[src];
+               iPtr->events[src].command = NULL;
+           } else {
+               events[i].command = (char *) ckalloc(INITIAL_CMD_SIZE);
+               events[i].command[0] = 0;
+               events[i].bytesAvl = INITIAL_CMD_SIZE;
+           }
+       }
+
+       /*
+        * Throw away everything left in the old history array, and
+        * substitute the new one for the old one.
+        */
+
+       for (i = 0; i < iPtr->numEvents; i++) {
+           if (iPtr->events[i].command != NULL) {
+               ckfree(iPtr->events[i].command);
+           }
+       }
+       ckfree((char *) iPtr->events);
+       iPtr->events = events;
+       if (count < iPtr->numEvents) {
+           iPtr->curEvent = count-1;
+       } else {
+           iPtr->curEvent = iPtr->numEvents-1;
+       }
+       iPtr->numEvents = count;
+       return TCL_OK;
+    } else if ((c == 'n') && (strncmp(argv[1], "nextid", length)) == 0) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " nextid\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       sprintf(iPtr->result, "%d", iPtr->curEventNum+1);
+       return TCL_OK;
+    } else if ((c == 'r') && (strncmp(argv[1], "redo", length)) == 0) {
+       if (argc > 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " redo ?event?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       eventPtr = GetEvent(iPtr, argc==2 ? "-1" : argv[2]);
+       if (eventPtr == NULL) {
+           return TCL_ERROR;
+       }
+       RevCommand(iPtr, eventPtr->command);
+       return Tcl_Eval(interp, eventPtr->command, 0, (char **) NULL);
+    } else if ((c == 's') && (strncmp(argv[1], "substitute", length)) == 0) {
+       if ((argc > 5) || (argc < 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " substitute old new ?event?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       eventPtr = GetEvent(iPtr, argc==4 ? "-1" : argv[4]);
+       if (eventPtr == NULL) {
+           return TCL_ERROR;
+       }
+       return SubsAndEval(iPtr, eventPtr->command, argv[2], argv[3]);
+    } else if ((c == 'w') && (strncmp(argv[1], "words", length)) == 0) {
+       char *words;
+
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " words num-num/pat ?event?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       eventPtr = GetEvent(iPtr, argc==3 ? "-1" : argv[3]);
+       if (eventPtr == NULL) {
+           return TCL_ERROR;
+       }
+       words = GetWords(iPtr, eventPtr->command, argv[2]);
+       if (words == NULL) {
+           return TCL_ERROR;
+       }
+       RevResult(iPtr, words);
+       iPtr->result = words;
+       iPtr->freeProc = (Tcl_FreeProc *) free;
+       return TCL_OK;
+    }
+
+    Tcl_AppendResult(interp, "bad option \"", argv[1],
+           "\": must be add, change, event, info, keep, nextid, ",
+           "redo, substitute, or words", (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * MakeSpace --
+ *
+ *     Given a history event, make sure it has enough space for
+ *     a string of a given length (enlarge the string area if
+ *     necessary).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     More memory may get allocated.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+MakeSpace(hPtr, size)
+    HistoryEvent *hPtr;
+    int size;                  /* # of bytes needed in hPtr. */
+{
+    if (hPtr->bytesAvl < size) {
+       ckfree(hPtr->command);
+       hPtr->command = (char *) ckalloc((unsigned) size);
+       hPtr->bytesAvl = size;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * InsertRev --
+ *
+ *     Add a new revision to the list of those pending for iPtr.
+ *     Do it in a way that keeps the revision list sorted in
+ *     increasing order of firstIndex.  Also, eliminate revisions
+ *     that are subsets of other revisions.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     RevPtr is added to iPtr's revision list.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+InsertRev(iPtr, revPtr)
+    Interp *iPtr;                      /* Interpreter to use. */
+    register HistoryRev *revPtr;       /* Revision to add to iPtr's list. */
+{
+    register HistoryRev *curPtr;
+    register HistoryRev *prevPtr;
+
+    for (curPtr = iPtr->revPtr, prevPtr = NULL; curPtr != NULL;
+           prevPtr = curPtr, curPtr = curPtr->nextPtr) {
+       /*
+        * If this revision includes the new one (or vice versa) then
+        * just eliminate the one that is a subset of the other.
+        */
+
+       if ((revPtr->firstIndex <= curPtr->firstIndex)
+               && (revPtr->lastIndex >= curPtr->firstIndex)) {
+           curPtr->firstIndex = revPtr->firstIndex;
+           curPtr->lastIndex = revPtr->lastIndex;
+           curPtr->newSize = revPtr->newSize;
+           ckfree(curPtr->newBytes);
+           curPtr->newBytes = revPtr->newBytes;
+           ckfree((char *) revPtr);
+           return;
+       }
+       if ((revPtr->firstIndex >= curPtr->firstIndex)
+               && (revPtr->lastIndex <= curPtr->lastIndex)) {
+           ckfree(revPtr->newBytes);
+           ckfree((char *) revPtr);
+           return;
+       }
+
+       if (revPtr->firstIndex < curPtr->firstIndex) {
+           break;
+       }
+    }
+
+    /*
+     * Insert revPtr just after prevPtr.
+     */
+
+    if (prevPtr == NULL) {
+       revPtr->nextPtr = iPtr->revPtr;
+       iPtr->revPtr = revPtr;
+    } else {
+       revPtr->nextPtr = prevPtr->nextPtr;
+       prevPtr->nextPtr = revPtr;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * RevCommand --
+ *
+ *     This procedure is invoked by the "history" command to record
+ *     a command revision.  See the comments at the beginning of the
+ *     file for more information about revisions.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Revision information is recorded.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+RevCommand(iPtr, string)
+    register Interp *iPtr;     /* Interpreter in which to perform the
+                                * substitution. */
+    char *string;              /* String to substitute. */
+{
+    register HistoryRev *revPtr;
+
+    if ((iPtr->evalFirst == NULL) || (iPtr->revDisables > 0)) {
+       return;
+    }
+    revPtr = (HistoryRev *) ckalloc(sizeof(HistoryRev));
+    revPtr->firstIndex = iPtr->evalFirst - iPtr->historyFirst;
+    revPtr->lastIndex = iPtr->evalLast - iPtr->historyFirst;
+    revPtr->newSize = strlen(string);
+    revPtr->newBytes = (char *) ckalloc((unsigned) (revPtr->newSize+1));
+    strcpy(revPtr->newBytes, string);
+    InsertRev(iPtr, revPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * RevResult --
+ *
+ *     This procedure is invoked by the "history" command to record
+ *     a result revision.  See the comments at the beginning of the
+ *     file for more information about revisions.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Revision information is recorded.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+RevResult(iPtr, string)
+    register Interp *iPtr;     /* Interpreter in which to perform the
+                                * substitution. */
+    char *string;              /* String to substitute. */
+{
+    register HistoryRev *revPtr;
+    char *evalFirst, *evalLast;
+    char *argv[2];
+
+    if ((iPtr->evalFirst == NULL) || (iPtr->revDisables > 0)) {
+       return;
+    }
+
+    /*
+     * Expand the replacement range to include the brackets that surround
+     * the command.  If there aren't any brackets (i.e. this command was
+     * invoked at top-level) then don't do any revision.  Also, if there
+     * are several commands in brackets, of which this is just one,
+     * then don't do any revision.
+     */
+
+    evalFirst = iPtr->evalFirst;
+    evalLast = iPtr->evalLast + 1;
+    while (1) {
+       if (evalFirst == iPtr->historyFirst) {
+           return;
+       }
+       evalFirst--;
+       if (*evalFirst == '[') {
+           break;
+       }
+       if (!isspace(*evalFirst)) {
+           return;
+       }
+    }
+    if (*evalLast != ']') {
+       return;
+    }
+
+    revPtr = (HistoryRev *) ckalloc(sizeof(HistoryRev));
+    revPtr->firstIndex = evalFirst - iPtr->historyFirst;
+    revPtr->lastIndex = evalLast - iPtr->historyFirst;
+    argv[0] = string;
+    revPtr->newBytes = Tcl_Merge(1, argv);
+    revPtr->newSize = strlen(revPtr->newBytes);
+    InsertRev(iPtr, revPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DoRevs --
+ *
+ *     This procedure is called to apply the history revisions that
+ *     have been recorded in iPtr.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The most recent entry in the history for iPtr may be modified.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DoRevs(iPtr)
+    register Interp *iPtr;     /* Interpreter whose history is to
+                                * be modified. */
+{
+    register HistoryRev *revPtr;
+    register HistoryEvent *eventPtr;
+    char *newCommand, *p;
+    unsigned int size;
+    int bytesSeen, count;
+
+    if (iPtr->revPtr == NULL) {
+       return;
+    }
+
+    /*
+     * The revision is done in two passes.  The first pass computes the
+     * amount of space needed for the revised event, and the second pass
+     * pieces together the new event and frees up the revisions.
+     */
+
+    eventPtr = &iPtr->events[iPtr->curEvent];
+    size = strlen(eventPtr->command) + 1;
+    for (revPtr = iPtr->revPtr; revPtr != NULL; revPtr = revPtr->nextPtr) {
+       size -= revPtr->lastIndex + 1 - revPtr->firstIndex;
+       size += revPtr->newSize;
+    }
+
+    newCommand = (char *) ckalloc(size);
+    p = newCommand;
+    bytesSeen = 0;
+    for (revPtr = iPtr->revPtr; revPtr != NULL; ) {
+       HistoryRev *nextPtr = revPtr->nextPtr;
+
+       count = revPtr->firstIndex - bytesSeen;
+       if (count > 0) {
+           strncpy(p, eventPtr->command + bytesSeen, count);
+           p += count;
+       }
+       strncpy(p, revPtr->newBytes, revPtr->newSize);
+       p += revPtr->newSize;
+       bytesSeen = revPtr->lastIndex+1;
+       ckfree(revPtr->newBytes);
+       ckfree((char *) revPtr);
+       revPtr = nextPtr;
+    }
+    if (&p[strlen(&eventPtr->command[bytesSeen]) + 1] >
+           &newCommand[size]) {
+       printf("Assertion failed!\n");
+    }
+    strcpy(p, eventPtr->command + bytesSeen);
+
+    /*
+     * Replace the command in the event.
+     */
+
+    ckfree(eventPtr->command);
+    eventPtr->command = newCommand;
+    eventPtr->bytesAvl = size;
+    iPtr->revPtr = NULL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * GetEvent --
+ *
+ *     Given a textual description of an event (see the manual page
+ *     for legal values) find the corresponding event and return its
+ *     command string.
+ *
+ * Results:
+ *     The return value is a pointer to the event named by "string".
+ *     If no such event exists, then NULL is returned and an error
+ *     message is left in iPtr.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static HistoryEvent *
+GetEvent(iPtr, string)
+    register Interp *iPtr;     /* Interpreter in which to look. */
+    char *string;              /* Description of event. */
+{
+    int eventNum, index;
+    register HistoryEvent *eventPtr;
+    int length;
+
+    /*
+     * First check for a numeric specification of an event.
+     */
+
+    if (isdigit(*string) || (*string == '-')) {
+       if (Tcl_GetInt((Tcl_Interp *) iPtr, string, &eventNum) != TCL_OK) {
+           return NULL;
+       }
+       if (eventNum < 0) {
+           eventNum += iPtr->curEventNum;
+        }
+       if (eventNum > iPtr->curEventNum) {
+           Tcl_AppendResult((Tcl_Interp *) iPtr, "event \"", string,
+                   "\" hasn't occurred yet", (char *) NULL);
+           return NULL;
+       }
+       if ((eventNum <= iPtr->curEventNum-iPtr->numEvents)
+               || (eventNum <= 0)) {
+           Tcl_AppendResult((Tcl_Interp *) iPtr, "event \"", string,
+                   "\" is too far in the past", (char *) NULL);
+           return NULL;
+       }
+       index = iPtr->curEvent + (eventNum - iPtr->curEventNum);
+       if (index < 0) {
+           index += iPtr->numEvents;
+       }
+       return &iPtr->events[index];
+    }
+
+    /*
+     * Next, check for an event that contains the string as a prefix or
+     * that matches the string in the sense of Tcl_StringMatch.
+     */
+
+    length = strlen(string);
+    for (index = iPtr->curEvent - 1; ; index--) {
+       if (index < 0) {
+           index += iPtr->numEvents;
+       }
+       if (index == iPtr->curEvent) {
+           break;
+       }
+       eventPtr = &iPtr->events[index];
+       if ((strncmp(eventPtr->command, string, length) == 0)
+               || Tcl_StringMatch(eventPtr->command, string)) {
+           return eventPtr;
+       }
+    }
+
+    Tcl_AppendResult((Tcl_Interp *) iPtr, "no event matches \"", string,
+           "\"", (char *) NULL);
+    return NULL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * SubsAndEval --
+ *
+ *     Generate a new command by making a textual substitution in
+ *     the "cmd" argument.  Then execute the new command.
+ *
+ * Results:
+ *     The return value is a standard Tcl error.
+ *
+ * Side effects:
+ *     History gets revised if the substitution is occurring on
+ *     a recorded command line.  Also, the re-executed command
+ *     may produce side-effects.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+SubsAndEval(iPtr, cmd, old, new)
+    register Interp *iPtr;     /* Interpreter in which to execute
+                                * new command. */
+    char *cmd;                 /* Command in which to substitute. */
+    char *old;                 /* String to search for in command. */
+    char *new;                 /* Replacement string for "old". */
+{
+    char *src, *dst, *newCmd;
+    int count, oldLength, newLength, length, result;
+
+    /*
+     * Figure out how much space it will take to hold the
+     * substituted command (and complain if the old string
+     * doesn't appear in the original command).
+     */
+
+    oldLength = strlen(old);
+    newLength = strlen(new);
+    src = cmd;
+    count = 0;
+    while (1) {
+       src = strstr(src, old);
+       if (src == NULL) {
+           break;
+       }
+       src += oldLength;
+       count++;
+    }
+    if (count == 0) {
+       Tcl_AppendResult((Tcl_Interp *) iPtr, "\"", old,
+               "\" doesn't appear in event", (char *) NULL);
+       return TCL_ERROR;
+    }
+    length = strlen(cmd) + count*(newLength - oldLength);
+
+    /*
+     * Generate a substituted command.
+     */
+
+    newCmd = (char *) ckalloc((unsigned) (length + 1));
+    dst = newCmd;
+    while (1) {
+       src = strstr(cmd, old);
+       if (src == NULL) {
+           strcpy(dst, cmd);
+           break;
+       }
+       strncpy(dst, cmd, src-cmd);
+       dst += src-cmd;
+       strcpy(dst, new);
+       dst += newLength;
+       cmd = src + oldLength;
+    }
+
+    RevCommand(iPtr, newCmd);
+    result = Tcl_Eval((Tcl_Interp *) iPtr, newCmd, 0, (char **) NULL);
+    ckfree(newCmd);
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * GetWords --
+ *
+ *     Given a command string, return one or more words from the
+ *     command string.
+ *
+ * Results:
+ *     The return value is a pointer to a dynamically-allocated
+ *     string containing the words of command specified by "words".
+ *     If the word specifier has improper syntax then an error
+ *     message is placed in iPtr->result and NULL is returned.
+ *
+ * Side effects:
+ *     Memory is allocated.  It is the caller's responsibilty to
+ *     free the returned string..
+ *
+ *----------------------------------------------------------------------
+ */
+
+static char *
+GetWords(iPtr, command, words)
+    register Interp *iPtr;     /* Tcl interpreter in which to place
+                                * an error message if needed. */
+    char *command;             /* Command string. */
+    char *words;               /* Description of which words to extract
+                                * from the command.  Either num[-num] or
+                                * a pattern. */
+{
+    char *result;
+    char *start, *end, *dst;
+    register char *next;
+    int first;                 /* First word desired. -1 means last word
+                                * only. */
+    int last;                  /* Last word desired.  -1 means use everything
+                                * up to the end. */
+    int index;                 /* Index of current word. */
+    char *pattern;
+
+    /*
+     * Figure out whether we're looking for a numerical range or for
+     * a pattern.
+     */
+
+    pattern = NULL;
+    first = 0;
+    last = -1;
+    if (*words == '$') {
+       if (words[1] != '\0') {
+           goto error;
+       }
+       first = -1;
+    } else if (isdigit(*words)) {
+       first = strtoul(words, &start, 0);
+       if (*start == 0) {
+           last = first;
+       } else if (*start == '-') {
+           start++;
+           if (*start == '$') {
+               start++;
+           } else if (isdigit(*start)) {
+               last = strtoul(start, &start, 0);
+           } else {
+               goto error;
+           }
+           if (*start != 0) {
+               goto error;
+           }
+       }
+       if ((first > last) && (last != -1)) {
+           goto error;
+       }
+    } else {
+       pattern = words;
+    }
+
+    /*
+     * Scan through the words one at a time, copying those that are
+     * relevant into the result string.  Allocate a result area large
+     * enough to hold all the words if necessary.
+     */
+
+    result = (char *) ckalloc((unsigned) (strlen(command) + 1));
+    dst = result;
+    for (next = command; isspace(*next); next++) {
+       /* Empty loop body:  just find start of first word. */
+    }
+    for (index = 0; *next != 0; index++) {
+       start = next;
+       end = TclWordEnd(next, 0);
+       for (next = end; isspace(*next); next++) {
+           /* Empty loop body:  just find start of next word. */
+       }
+       if ((first > index) || ((first == -1) && (*next != 0))) {
+           continue;
+       }
+       if ((last != -1) && (last < index)) {
+           continue;
+       }
+       if (pattern != NULL) {
+           int match;
+           char savedChar = *end;
+
+           *end = 0;
+           match = Tcl_StringMatch(start, pattern);
+           *end = savedChar;
+           if (!match) {
+               continue;
+           }
+       }
+       if (dst != result) {
+           *dst = ' ';
+           dst++;
+       }
+       strncpy(dst, start, (end-start));
+       dst += end-start;
+    }
+    *dst = 0;
+
+    /*
+     * Check for an out-of-range argument index.
+     */
+
+    if ((last >= index) || (first >= index)) {
+       ckfree(result);
+       Tcl_AppendResult((Tcl_Interp *) iPtr, "word selector \"", words,
+               "\" specified non-existent words", (char *) NULL);
+       return NULL;
+    }
+    return result;
+
+    error:
+    Tcl_AppendResult((Tcl_Interp *) iPtr, "bad word selector \"", words,
+           "\":  should be num-num or pattern", (char *) NULL);
+    return NULL;
+}
diff --git a/src/tcl/tclint.h b/src/tcl/tclint.h
new file mode 100644 (file)
index 0000000..9bb0128
--- /dev/null
@@ -0,0 +1,834 @@
+/*
+ * tclInt.h --
+ *
+ *     Declarations of things used internally by the Tcl interpreter.
+ *
+ * Copyright 1987-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /user6/ouster/tcl/RCS/tclInt.h,v 1.69 92/06/21 14:09:23 ouster Exp $ SPRITE (Berkeley)
+ */
+
+#ifndef _TCLINT
+#define _TCLINT
+
+/*
+ * Common include files needed by most of the Tcl source files are
+ * included here, so that system-dependent personalizations for the
+ * include files only have to be made in once place.  This results
+ * in a few extra includes, but greater modularity.  The order of
+ * the three groups of #includes is important.  For example, stdio.h
+ * is needed by tcl.h, and the _ANSI_ARGS_ declaration in tcl.h is
+ * needed by stdlib.h in some configurations.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+
+#ifndef _TCL
+#include "tcl.h"
+#endif
+#ifndef _TCLHASH
+#include "tclhash.h"
+#endif
+#ifndef _REGEXP
+#include "regexp.h"
+#endif
+
+/*
+ * Macro to use instead of "void" for arguments that must have
+ * type "void *" in ANSI C;  maps them to type "char *" in
+ * non-ANSI systems.  This macro may be used in some of the include
+ * files below, which is why it is defined here.
+ */
+
+#ifndef VOID
+#   ifdef __STDC__
+#       define VOID void
+#   else
+#       define VOID char
+#   endif
+#endif
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+//#include <varargs.h>
+#include <stdarg.h>
+
+/*
+ * At present (12/91) not all stdlib.h implementations declare strtod.
+ * The declaration below is here to ensure that it's declared, so that
+ * the compiler won't take the default approach of assuming it returns
+ * an int.  There's no ANSI prototype for it because there would end
+ * up being too many conflicts with slightly-different prototypes.
+ */
+
+extern double strtod();
+
+/*
+ *----------------------------------------------------------------
+ * Data structures related to variables.   These are used primarily
+ * in tclVar.c
+ *----------------------------------------------------------------
+ */
+
+/*
+ * The following structure defines a variable trace, which is used to
+ * invoke a specific C procedure whenever certain operations are performed
+ * on a variable.
+ */
+
+typedef struct VarTrace {
+    Tcl_VarTraceProc *traceProc;/* Procedure to call when operations given
+                                * by flags are performed on variable. */
+    ClientData clientData;     /* Argument to pass to proc. */
+    int flags;                 /* What events the trace procedure is
+                                * interested in:  OR-ed combination of
+                                * TCL_TRACE_READS, TCL_TRACE_WRITES, and
+                                * TCL_TRACE_UNSETS. */
+    struct VarTrace *nextPtr;  /* Next in list of traces associated with
+                                * a particular variable. */
+} VarTrace;
+
+/*
+ * When a variable trace is active (i.e. its associated procedure is
+ * executing), one of the following structures is linked into a list
+ * associated with the variable's interpreter.  The information in
+ * the structure is needed in order for Tcl to behave reasonably
+ * if traces are deleted while traces are active.
+ */
+
+typedef struct ActiveVarTrace {
+    struct ActiveVarTrace *nextPtr;
+                               /* Next in list of all active variable
+                                * traces for the interpreter, or NULL
+                                * if no more. */
+    VarTrace *nextTracePtr;    /* Next trace to check after current
+                                * trace procedure returns;  if this
+                                * trace gets deleted, must update pointer
+                                * to avoid using free'd memory. */
+} ActiveVarTrace;
+
+/*
+ * The following structure describes an enumerative search in progress on
+ * an array variable;  this are invoked with options to the "array"
+ * command.
+ */
+
+typedef struct ArraySearch {
+    int id;                    /* Integer id used to distinguish among
+                                * multiple concurrent searches for the
+                                * same array. */
+    struct Var *varPtr;                /* Pointer to array variable that's being
+                                * searched. */
+    Tcl_HashSearch search;     /* Info kept by the hash module about
+                                * progress through the array. */
+    Tcl_HashEntry *nextEntry;  /* Non-null means this is the next element
+                                * to be enumerated (it's leftover from
+                                * the Tcl_FirstHashEntry call or from
+                                * an "array anymore" command).  NULL
+                                * means must call Tcl_NextHashEntry
+                                * to get value to return. */
+    struct ArraySearch *nextPtr;/* Next in list of all active searches
+                                * for this variable, or NULL if this is
+                                * the last one. */
+} ArraySearch;
+
+/*
+ * The structure below defines a variable, which associates a string name
+ * with a string value.  Pointers to these structures are kept as the
+ * values of hash table entries, and the name of each variable is stored
+ * in the hash entry.
+ */
+
+typedef struct Var {
+    int valueLength;           /* Holds the number of non-null bytes
+                                * actually occupied by the variable's
+                                * current value in value.string (extra
+                                * space is sometimes left for expansion).
+                                * For array and global variables this is
+                                * meaningless. */
+    int valueSpace;            /* Total number of bytes of space allocated
+                                * at value. */
+    int upvarUses;             /* Counts number of times variable is
+                                * is referenced via global or upvar variables
+                                * (i.e. how many variables have "upvarPtr"
+                                * pointing to this variable).  Variable
+                                * can't be deleted until this count reaches
+                                * 0. */
+    VarTrace *tracePtr;                /* First in list of all traces set for this
+                                * variable. */
+    ArraySearch *searchPtr;    /* First in list of all searches active
+                                * for this variable, or NULL if none. */
+    int flags;                 /* Miscellaneous bits of information about
+                                * variable.  See below for definitions. */
+    union {
+       char string[4];         /* String value of variable.  The actual
+                                * length of this field is given by the
+                                * valueSpace field above. */
+       Tcl_HashTable *tablePtr;/* For array variables, this points to
+                                * information about the hash table used
+                                * to implement the associative array. 
+                                * Points to malloc-ed data. */
+       Tcl_HashEntry *upvarPtr;
+                               /* If this is a global variable being
+                                * referred to in a procedure, or a variable
+                                * created by "upvar", this field points to
+                                * the hash table entry for the higher-level
+                                * variable. */
+    } value;                   /* MUST BE LAST FIELD IN STRUCTURE!!! */
+} Var;
+
+/*
+ * Flag bits for variables:
+ *
+ * VAR_ARRAY   -               1 means this is an array variable rather
+ *                             than a scalar variable.
+ * VAR_UPVAR -                         1 means this variable just contains a
+ *                             pointer to another variable that has the
+ *                             real value.  Variables like this come
+ *                             about through the "upvar" and "global"
+ *                             commands.
+ * VAR_UNDEFINED -             1 means that the variable is currently
+ *                             undefined.  Undefined variables usually
+ *                             go away completely, but if an undefined
+ *                             variable has a trace on it, or if it is
+ *                             a global variable being used by a procedure,
+ *                             then it stays around even when undefined.
+ * VAR_ELEMENT_ACTIVE -                Used only in array variables;  1 means that
+ *                             an element of the array is currently being
+ *                             manipulated in some way, so that it isn't
+ *                             safe to delete the whole array.
+ * VAR_TRACE_ACTIVE -          1 means that trace processing is currently
+ *                             underway for a read or write access, so
+ *                             new read or write accesses should not cause
+ *                             trace procedures to be called and the
+ *                             variable can't be deleted.
+ */
+
+#define VAR_ARRAY              1
+#define VAR_UPVAR              2
+#define VAR_UNDEFINED          4
+#define VAR_ELEMENT_ACTIVE     0x10
+#define VAR_TRACE_ACTIVE       0x20
+#define VAR_SEARCHES_POSSIBLE  0x40
+
+/*
+ *----------------------------------------------------------------
+ * Data structures related to procedures.   These are used primarily
+ * in tclProc.c
+ *----------------------------------------------------------------
+ */
+
+/*
+ * The structure below defines an argument to a procedure, which
+ * consists of a name and an (optional) default value.
+ */
+
+typedef struct Arg {
+    struct Arg *nextPtr;       /* Next argument for this procedure,
+                                * or NULL if this is the last argument. */
+    char *defValue;            /* Pointer to arg's default value, or NULL
+                                * if no default value. */
+    char name[4];              /* Name of argument starts here.  The name
+                                * is followed by space for the default,
+                                * if there is one.  The actual size of this
+                                * field will be as large as necessary to
+                                * hold both name and default value.  THIS
+                                * MUST BE THE LAST FIELD IN THE STRUCTURE!! */
+} Arg;
+
+/*
+ * The structure below defines a command procedure, which consists of
+ * a collection of Tcl commands plus information about arguments and
+ * variables.
+ */
+
+typedef struct Proc {
+    struct Interp *iPtr;       /* Interpreter for which this command
+                                * is defined. */
+    char *command;             /* Command that constitutes the body of
+                                * the procedure (dynamically allocated). */
+    Arg *argPtr;               /* Pointer to first of procedure's formal
+                                * arguments, or NULL if none. */
+} Proc;
+
+/*
+ * The structure below defines a command trace.  This is used to allow Tcl
+ * clients to find out whenever a command is about to be executed.
+ */
+
+typedef struct Trace {
+    int level;                 /* Only trace commands at nesting level
+                                * less than or equal to this. */
+    Tcl_CmdTraceProc *proc;    /* Procedure to call to trace command. */
+    ClientData clientData;     /* Arbitrary value to pass to proc. */
+    struct Trace *nextPtr;     /* Next in list of traces for this interp. */
+} Trace;
+
+/*
+ * The structure below defines a frame, which is a procedure invocation.
+ * These structures exist only while procedures are being executed, and
+ * provide a sort of call stack.
+ */
+
+typedef struct CallFrame {
+    Tcl_HashTable varTable;    /* Hash table containing all of procedure's
+                                * local variables. */
+    int level;                 /* Level of this procedure, for "uplevel"
+                                * purposes (i.e. corresponds to nesting of
+                                * callerVarPtr's, not callerPtr's).  1 means
+                                * outer-most procedure, 0 means top-level. */
+    int argc;                  /* This and argv below describe name and
+                                * arguments for this procedure invocation. */
+    char **argv;               /* Array of arguments. */
+    struct CallFrame *callerPtr;
+                               /* Value of interp->framePtr when this
+                                * procedure was invoked (i.e. next in
+                                * stack of all active procedures). */
+    struct CallFrame *callerVarPtr;
+                               /* Value of interp->varFramePtr when this
+                                * procedure was invoked (i.e. determines
+                                * variable scoping within caller;  same
+                                * as callerPtr unless an "uplevel" command
+                                * or something equivalent was active in
+                                * the caller). */
+} CallFrame;
+
+/*
+ * The structure below defines one history event (a previously-executed
+ * command that can be re-executed in whole or in part).
+ */
+
+typedef struct {
+    char *command;             /* String containing previously-executed
+                                * command. */
+    int bytesAvl;              /* Total # of bytes available at *event (not
+                                * all are necessarily in use now). */
+} HistoryEvent;
+
+/*
+ *----------------------------------------------------------------
+ * Data structures related to history.   These are used primarily
+ * in tclHistory.c
+ *----------------------------------------------------------------
+ */
+
+/*
+ * The structure below defines a pending revision to the most recent
+ * history event.  Changes are linked together into a list and applied
+ * during the next call to Tcl_RecordHistory.  See the comments at the
+ * beginning of tclHistory.c for information on revisions.
+ */
+
+typedef struct HistoryRev {
+    int firstIndex;            /* Index of the first byte to replace in
+                                * current history event. */
+    int lastIndex;             /* Index of last byte to replace in
+                                * current history event. */
+    int newSize;               /* Number of bytes in newBytes. */
+    char *newBytes;            /* Replacement for the range given by
+                                * firstIndex and lastIndex. */
+    struct HistoryRev *nextPtr;        /* Next in chain of revisions to apply, or
+                                * NULL for end of list. */
+} HistoryRev;
+
+/*
+ *----------------------------------------------------------------
+ * Data structures related to files.  These are used primarily in
+ * tclUnixUtil.c and tclUnixAZ.c.
+ *----------------------------------------------------------------
+ */
+
+/*
+ * The data structure below defines an open file (or connection to
+ * a process pipeline) as returned by the "open" command.
+ */
+
+typedef struct OpenFile {
+    FILE *f;                   /* Stdio file to use for reading and/or
+                                * writing. */
+    FILE *f2;                  /* Normally NULL.  In the special case of
+                                * a command pipeline with pipes for both
+                                * input and output, this is a stdio file
+                                * to use for writing to the pipeline. */
+    int readable;              /* Non-zero means file may be read. */
+    int writable;              /* Non-zero means file may be written. */
+    int numPids;               /* If this is a connection to a process
+                                * pipeline, gives number of processes
+                                * in pidPtr array below;  otherwise it
+                                * is 0. */
+    int *pidPtr;               /* Pointer to malloc-ed array of child
+                                * process ids (numPids of them), or NULL
+                                * if this isn't a connection to a process
+                                * pipeline. */
+    int errorId;               /* File id of file that receives error
+                                * output from pipeline.  -1 means not
+                                * used (i.e. this is a normal file). */
+} OpenFile;
+
+/*
+ *----------------------------------------------------------------
+ * This structure defines an interpreter, which is a collection of
+ * commands plus other state information related to interpreting
+ * commands, such as variable storage.  Primary responsibility for
+ * this data structure is in tclBasic.c, but almost every Tcl
+ * source file uses something in here.
+ *----------------------------------------------------------------
+ */
+
+typedef struct Command {
+    Tcl_CmdProc *proc;         /* Procedure to process command. */
+    ClientData clientData;     /* Arbitrary value to pass to proc. */
+    Tcl_CmdDeleteProc *deleteProc;
+                               /* Procedure to invoke when deleting
+                                * command. */
+} Command;
+
+#define CMD_SIZE(nameLength) ((unsigned) sizeof(Command) + nameLength - 3)
+
+typedef struct Interp {
+
+    /*
+     * Note:  the first three fields must match exactly the fields in
+     * a Tcl_Interp struct (see tcl.h).  If you change one, be sure to
+     * change the other.
+     */
+
+    char *result;              /* Points to result returned by last
+                                * command. */
+    Tcl_FreeProc *freeProc;    /* Zero means result is statically allocated.
+                                * If non-zero, gives address of procedure
+                                * to invoke to free the result.  Must be
+                                * freed by Tcl_Eval before executing next
+                                * command. */
+    int errorLine;             /* When TCL_ERROR is returned, this gives
+                                * the line number within the command where
+                                * the error occurred (1 means first line). */
+    Tcl_HashTable commandTable;        /* Contains all of the commands currently
+                                * registered in this interpreter.  Indexed
+                                * by strings; values have type (Command *). */
+
+    /*
+     * Information related to procedures and variables.  See tclProc.c
+     * and tclvar.c for usage.
+     */
+
+    Tcl_HashTable globalTable; /* Contains all global variables for
+                                * interpreter. */
+    int numLevels;             /* Keeps track of how many nested calls to
+                                * Tcl_Eval are in progress for this
+                                * interpreter.  It's used to delay deletion
+                                * of the table until all Tcl_Eval invocations
+                                * are completed. */
+    CallFrame *framePtr;       /* Points to top-most in stack of all nested
+                                * procedure invocations.  NULL means there
+                                * are no active procedures. */
+    CallFrame *varFramePtr;    /* Points to the call frame whose variables
+                                * are currently in use (same as framePtr
+                                * unless an "uplevel" command is being
+                                * executed).  NULL means no procedure is
+                                * active or "uplevel 0" is being exec'ed. */
+    ActiveVarTrace *activeTracePtr;
+                               /* First in list of active traces for interp,
+                                * or NULL if no active traces. */
+
+    /*
+     * Information related to history:
+     */
+
+    int numEvents;             /* Number of previously-executed commands
+                                * to retain. */
+    HistoryEvent *events;      /* Array containing numEvents entries
+                                * (dynamically allocated). */
+    int curEvent;              /* Index into events of place where current
+                                * (or most recent) command is recorded. */
+    int curEventNum;           /* Event number associated with the slot
+                                * given by curEvent. */
+    HistoryRev *revPtr;                /* First in list of pending revisions. */
+    char *historyFirst;                /* First char. of current command executed
+                                * from history module or NULL if none. */
+    int revDisables;           /* 0 means history revision OK;  > 0 gives
+                                * a count of number of times revision has
+                                * been disabled. */
+    char *evalFirst;           /* If TCL_RECORD_BOUNDS flag set, Tcl_Eval
+                                * sets this field to point to the first
+                                * char. of text from which the current
+                                * command came.  Otherwise Tcl_Eval sets
+                                * this to NULL. */
+    char *evalLast;            /* Similar to evalFirst, except points to
+                                * last character of current command. */
+
+    /*
+     * Information used by Tcl_AppendResult to keep track of partial
+     * results.  See Tcl_AppendResult code for details.
+     */
+
+    char *appendResult;                /* Storage space for results generated
+                                * by Tcl_AppendResult.  Malloc-ed.  NULL
+                                * means not yet allocated. */
+    int appendAvl;             /* Total amount of space available at
+                                * partialResult. */
+    int appendUsed;            /* Number of non-null bytes currently
+                                * stored at partialResult. */
+
+    /*
+     * Information related to files.  See tclUnixAZ.c and tclUnixUtil.c
+     * for details.
+     */
+
+    int numFiles;              /* Number of entries in filePtrArray
+                                * below.  0 means array hasn't been
+                                * created yet. */
+    OpenFile **filePtrArray;   /* Pointer to malloc-ed array of pointers
+                                * to information about open files.  Entry
+                                * N corresponds to the file with fileno N.
+                                * If an entry is NULL then the corresponding
+                                * file isn't open.  If filePtrArray is NULL
+                                * it means no files have been used, so even
+                                * stdin/stdout/stderr entries haven't been
+                                * setup yet. */
+    /*
+     * A cache of compiled regular expressions.  See TclCompileRegexp
+     * in tclUtil.c for details.
+     */
+
+#define NUM_REGEXPS 5
+    char *patterns[NUM_REGEXPS];/* Strings corresponding to compiled
+                                * regular expression patterns.  NULL
+                                * means that this slot isn't used.
+                                * Malloc-ed. */
+    int patLengths[NUM_REGEXPS];/* Number of non-null characters in
+                                * corresponding entry in patterns.
+                                * -1 means entry isn't used. */
+    regexp *regexps[NUM_REGEXPS];
+                               /* Compiled forms of above strings.  Also
+                                * malloc-ed, or NULL if not in use yet. */
+
+
+    /*
+     * Miscellaneous information:
+     */
+
+    int cmdCount;              /* Total number of times a command procedure
+                                * has been called for this interpreter. */
+    int noEval;                        /* Non-zero means no commands should actually
+                                * be executed:  just parse only.  Used in
+                                * expressions when the result is already
+                                * determined. */
+    char *scriptFile;          /* NULL means there is no nested source
+                                * command active;  otherwise this points to
+                                * the name of the file being sourced (it's
+                                * not malloc-ed:  it points to an argument
+                                * to Tcl_EvalFile. */
+    int flags;                 /* Various flag bits.  See below. */
+    Trace *tracePtr;           /* List of traces for this interpreter. */
+    char resultSpace[TCL_RESULT_SIZE+1];
+                               /* Static space for storing small results. */
+} Interp;
+
+/*
+ * Flag bits for Interp structures:
+ *
+ * DELETED:            Non-zero means the interpreter has been deleted:
+ *                     don't process any more commands for it, and destroy
+ *                     the structure as soon as all nested invocations of
+ *                     Tcl_Eval are done.
+ * ERR_IN_PROGRESS:    Non-zero means an error unwind is already in progress.
+ *                     Zero means a command proc has been invoked since last
+ *                     error occured.
+ * ERR_ALREADY_LOGGED: Non-zero means information has already been logged
+ *                     in $errorInfo for the current Tcl_Eval instance,
+ *                     so Tcl_Eval needn't log it (used to implement the
+ *                     "error message log" command).
+ * ERROR_CODE_SET:     Non-zero means that Tcl_SetErrorCode has been
+ *                     called to record information for the current
+ *                     error.  Zero means Tcl_Eval must clear the
+ *                     errorCode variable if an error is returned.
+ */
+
+#define DELETED                        1
+#define ERR_IN_PROGRESS                2
+#define ERR_ALREADY_LOGGED     4
+#define ERROR_CODE_SET         8
+
+/*
+ *----------------------------------------------------------------
+ * Data structures related to command parsing.   These are used in
+ * tclParse.c and its clients.
+ *----------------------------------------------------------------
+ */
+
+/*
+ * The following data structure is used by various parsing procedures
+ * to hold information about where to store the results of parsing
+ * (e.g. the substituted contents of a quoted argument, or the result
+ * of a nested command).  At any given time, the space available
+ * for output is fixed, but a procedure may be called to expand the
+ * space available if the current space runs out.
+ */
+
+typedef struct ParseValue {
+    char *buffer;              /* Address of first character in
+                                * output buffer. */
+    char *next;                        /* Place to store next character in
+                                * output buffer. */
+    char *end;                 /* Address of the last usable character
+                                * in the buffer. */
+    void (*expandProc) _ANSI_ARGS_((struct ParseValue *pvPtr, int needed));
+                               /* Procedure to call when space runs out;
+                                * it will make more space. */
+    ClientData clientData;     /* Arbitrary information for use of
+                                * expandProc. */
+} ParseValue;
+
+/*
+ * A table used to classify input characters to assist in parsing
+ * Tcl commands.  The table should be indexed with a signed character
+ * using the CHAR_TYPE macro.  The character may have a negative
+ * value.
+ */
+
+extern char tclTypeTable[];
+#define CHAR_TYPE(c) (tclTypeTable+128)[c]
+
+/*
+ * Possible values returned by CHAR_TYPE:
+ *
+ * TCL_NORMAL -                All characters that don't have special significance
+ *                     to the Tcl language.
+ * TCL_SPACE -         Character is space, tab, or return.
+ * TCL_COMMAND_END -   Character is newline or null or semicolon or
+ *                     close-bracket.
+ * TCL_QUOTE -         Character is a double-quote.
+ * TCL_OPEN_BRACKET -  Character is a "[".
+ * TCL_OPEN_BRACE -    Character is a "{".
+ * TCL_CLOSE_BRACE -   Character is a "}".
+ * TCL_BACKSLASH -     Character is a "\".
+ * TCL_DOLLAR -                Character is a "$".
+ */
+
+#define TCL_NORMAL             0
+#define TCL_SPACE              1
+#define TCL_COMMAND_END                2
+#define TCL_QUOTE              3
+#define TCL_OPEN_BRACKET       4
+#define TCL_OPEN_BRACE         5
+#define TCL_CLOSE_BRACE                6
+#define TCL_BACKSLASH          7
+#define TCL_DOLLAR             8
+
+/*
+ * Additional flags passed to Tcl_Eval.  See tcl.h for other flags to
+ * Tcl_Eval;  these ones are only used internally by Tcl.
+ *
+ * TCL_RECORD_BOUNDS   Tells Tcl_Eval to record information in the
+ *                     evalFirst and evalLast fields for each command
+ *                     executed directly from the string (top-level
+ *                     commands and those from command substitution).
+ */
+
+#define TCL_RECORD_BOUNDS      0x100
+
+/*
+ * Maximum number of levels of nesting permitted in Tcl commands.
+ */
+
+#define MAX_NESTING_DEPTH      100
+
+/*
+ * Variables shared among Tcl modules but not used by the outside
+ * world:
+ */
+
+extern char *          tclRegexpError;
+
+/*
+ *----------------------------------------------------------------
+ * Procedures shared among Tcl modules but not used by the outside
+ * world:
+ *----------------------------------------------------------------
+ */
+
+extern void            panic();
+extern regexp *                TclCompileRegexp _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string));
+extern void            TclCopyAndCollapse _ANSI_ARGS_((int count, char *src,
+                           char *dst));
+extern void            TclDeleteVars _ANSI_ARGS_((Interp *iPtr,
+                           Tcl_HashTable *tablePtr));
+extern void            TclExpandParseValue _ANSI_ARGS_((ParseValue *pvPtr,
+                           int needed));
+extern int             TclFindElement _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *list, char **elementPtr, char **nextPtr,
+                           int *sizePtr, int *bracePtr));
+extern Proc *          TclFindProc _ANSI_ARGS_((Interp *iPtr,
+                           char *procName));
+extern int             TclGetFrame _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, CallFrame **framePtrPtr));
+extern int             TclGetListIndex _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, int *indexPtr));
+extern int             TclGetOpenFile _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, OpenFile **filePtrPtr));
+extern Proc *          TclIsProc _ANSI_ARGS_((Command *cmdPtr));
+extern void            TclMakeFileTable _ANSI_ARGS_((Interp *iPtr,
+                           int index));
+extern int             TclParseBraces _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, char **termPtr, ParseValue *pvPtr));
+extern int             TclParseNestedCmd _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, int flags, char **termPtr,
+                           ParseValue *pvPtr));
+extern int             TclParseQuotes _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, int termChar, int flags,
+                           char **termPtr, ParseValue *pvPtr));
+extern int             TclParseWords _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, int flags, int maxWords,
+                           char **termPtr, int *argcPtr, char **argv,
+                           ParseValue *pvPtr));
+extern void            TclSetupEnv _ANSI_ARGS_((Tcl_Interp *interp));
+extern char *          TclWordEnd _ANSI_ARGS_((char *start, int nested));
+
+/*
+ *----------------------------------------------------------------
+ * Command procedures in the generic core:
+ *----------------------------------------------------------------
+ */
+
+extern int     Tcl_AppendCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_ArrayCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_BreakCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_CaseCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_CatchCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_ConcatCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_ContinueCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_ErrorCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_EvalCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_ExprCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_ForCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_ForeachCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_FormatCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_GlobalCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_HistoryCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_IfCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_IncrCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_InfoCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_JoinCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_LappendCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_LindexCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_LinsertCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_LlengthCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_ListCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_LrangeCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_LreplaceCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_LsearchCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_LsortCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_ProcCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_RegexpCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_RegsubCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_RenameCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_ReturnCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_ScanCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_SetCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_SplitCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_StringCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_TraceCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_UnsetCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_UplevelCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_UpvarCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_WhileCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_Cmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_Cmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+
+/*
+ *----------------------------------------------------------------
+ * Command procedures in the UNIX core:
+ *----------------------------------------------------------------
+ */
+
+extern int     Tcl_CdCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_CloseCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_EofCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_ExecCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_ExitCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_FileCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_FlushCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_GetsCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_GlobCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_OpenCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_PutsCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_PwdCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_ReadCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_SeekCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_SourceCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_TellCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+extern int     Tcl_TimeCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+
+#endif /* _TCLINT */
diff --git a/src/tcl/tclparse.c b/src/tcl/tclparse.c
new file mode 100644 (file)
index 0000000..7e132b3
--- /dev/null
@@ -0,0 +1,1174 @@
+/* 
+ * tclParse.c --
+ *
+ *     This file contains a collection of procedures that are used
+ *     to parse Tcl commands or parts of commands (like quoted
+ *     strings or nested sub-commands).
+ *
+ * Copyright 1991 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclParse.c,v 1.21 92/06/08 09:32:37 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tclint.h"
+
+/*
+ * The following table assigns a type to each character.  Only types
+ * meaningful to Tcl parsing are represented here.  The table indexes
+ * all 256 characters, with the negative ones first, then the positive
+ * ones.
+ */
+
+char tclTypeTable[] = {
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_COMMAND_END,   TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_SPACE,         TCL_COMMAND_END,   TCL_SPACE,
+    TCL_SPACE,         TCL_SPACE,         TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_SPACE,         TCL_NORMAL,        TCL_QUOTE,         TCL_NORMAL,
+    TCL_DOLLAR,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_COMMAND_END,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_OPEN_BRACKET,
+    TCL_BACKSLASH,     TCL_COMMAND_END,   TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,
+    TCL_NORMAL,        TCL_NORMAL,        TCL_NORMAL,        TCL_OPEN_BRACE,
+    TCL_NORMAL,        TCL_CLOSE_BRACE,   TCL_NORMAL,        TCL_NORMAL,
+};
+
+/*
+ * Function prototypes for procedures local to this file:
+ */
+
+static char *  QuoteEnd _ANSI_ARGS_((char *string, int term));
+static char *  VarNameEnd _ANSI_ARGS_((char *string));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_Backslash --
+ *
+ *     Figure out how to handle a backslash sequence.
+ *
+ * Results:
+ *     The return value is the character that should be substituted
+ *     in place of the backslash sequence that starts at src, or 0
+ *     if the backslash sequence should be replace by nothing (e.g.
+ *     backslash followed by newline).  If readPtr isn't NULL then
+ *     it is filled in with a count of the number of characters in
+ *     the backslash sequence.  Note:  if the backslash isn't followed
+ *     by characters that are understood here, then the backslash
+ *     sequence is only considered to be one character long, and it
+ *     is replaced by a backslash char.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char
+Tcl_Backslash(src, readPtr)
+    char *src;                 /* Points to the backslash character of
+                                * a backslash sequence. */
+    int *readPtr;              /* Fill in with number of characters read
+                                * from src, unless NULL. */
+{
+    register char *p = src+1;
+    char result;
+    int count;
+
+    count = 2;
+
+    switch (*p) {
+       case 'b':
+           result = '\b';
+           break;
+       case 'e':
+           result = 033;
+           break;
+       case 'f':
+           result = '\f';
+           break;
+       case 'n':
+           result = '\n';
+           break;
+       case 'r':
+           result = '\r';
+           break;
+       case 't':
+           result = '\t';
+           break;
+       case 'v':
+           result = '\v';
+           break;
+       case 'C':
+           p++;
+           if (isspace(*p) || (*p == 0)) {
+               result = 'C';
+               count = 1;
+               break;
+           }
+           count = 3;
+           if (*p == 'M') {
+               p++;
+               if (isspace(*p) || (*p == 0)) {
+                   result = 'M' & 037;
+                   break;
+               }
+               count = 4;
+               result = (*p & 037) | 0200;
+               break;
+           }
+           count = 3;
+           result = *p & 037;
+           break;
+       case 'M':
+           p++;
+           if (isspace(*p) || (*p == 0)) {
+               result = 'M';
+               count = 1;
+               break;
+           }
+           count = 3;
+           result = *p + 0200;
+           break;
+       case '}':
+       case '{':
+       case ']':
+       case '[':
+       case '$':
+       case ' ':
+       case ';':
+       case '"':
+       case '\\':
+           result = *p;
+           break;
+       case '\n':
+           result = 0;
+           break;
+       default:
+           if (isdigit(*p)) {
+               result = *p - '0';
+               p++;
+               if (!isdigit(*p)) {
+                   break;
+               }
+               count = 3;
+               result = (result << 3) + (*p - '0');
+               p++;
+               if (!isdigit(*p)) {
+                   break;
+               }
+               count = 4;
+               result = (result << 3) + (*p - '0');
+               break;
+           }
+           result = '\\';
+           count = 1;
+           break;
+    }
+
+    if (readPtr != NULL) {
+       *readPtr = count;
+    }
+    return result;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TclParseQuotes --
+ *
+ *     This procedure parses a double-quoted string such as a
+ *     quoted Tcl command argument or a quoted value in a Tcl
+ *     expression.  This procedure is also used to parse array
+ *     element names within parentheses, or anything else that
+ *     needs all the substitutions that happen in quotes.
+ *
+ * Results:
+ *     The return value is a standard Tcl result, which is
+ *     TCL_OK unless there was an error while parsing the
+ *     quoted string.  If an error occurs then interp->result
+ *     contains a standard error message.  *TermPtr is filled
+ *     in with the address of the character just after the
+ *     last one successfully processed;  this is usually the
+ *     character just after the matching close-quote.  The
+ *     fully-substituted contents of the quotes are stored in
+ *     standard fashion in *pvPtr, null-terminated with
+ *     pvPtr->next pointing to the terminating null character.
+ *
+ * Side effects:
+ *     The buffer space in pvPtr may be enlarged by calling its
+ *     expandProc.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+TclParseQuotes(interp, string, termChar, flags, termPtr, pvPtr)
+    Tcl_Interp *interp;                /* Interpreter to use for nested command
+                                * evaluations and error messages. */
+    char *string;              /* Character just after opening double-
+                                * quote. */
+    int termChar;              /* Character that terminates "quoted" string
+                                * (usually double-quote, but sometimes
+                                * right-paren or something else). */
+    int flags;                 /* Flags to pass to nested Tcl_Eval calls. */
+    char **termPtr;            /* Store address of terminating character
+                                * here. */
+    ParseValue *pvPtr;         /* Information about where to place
+                                * fully-substituted result of parse. */
+{
+    register char *src, *dst, c;
+
+    src = string;
+    dst = pvPtr->next;
+
+    while (1) {
+       if (dst == pvPtr->end) {
+           /*
+            * Target buffer space is about to run out.  Make more space.
+            */
+
+           pvPtr->next = dst;
+           (*pvPtr->expandProc)(pvPtr, 1);
+           dst = pvPtr->next;
+       }
+
+       c = *src;
+       src++;
+       if (c == termChar) {
+           *dst = '\0';
+           pvPtr->next = dst;
+           *termPtr = src;
+           return TCL_OK;
+       } else if (CHAR_TYPE(c) == TCL_NORMAL) {
+           copy:
+           *dst = c;
+           dst++;
+           continue;
+       } else if (c == '$') {
+           int length;
+           char *value;
+
+           value = Tcl_ParseVar(interp, src-1, termPtr);
+           if (value == NULL) {
+               return TCL_ERROR;
+           }
+           src = *termPtr;
+           length = strlen(value);
+           if ((pvPtr->end - dst) <= length) {
+               pvPtr->next = dst;
+               (*pvPtr->expandProc)(pvPtr, length);
+               dst = pvPtr->next;
+           }
+           strcpy(dst, value);
+           dst += length;
+           continue;
+       } else if (c == '[') {
+           int result;
+
+           pvPtr->next = dst;
+           result = TclParseNestedCmd(interp, src, flags, termPtr, pvPtr);
+           if (result != TCL_OK) {
+               return result;
+           }
+           src = *termPtr;
+           dst = pvPtr->next;
+           continue;
+       } else if (c == '\\') {
+           int numRead;
+
+           src--;
+           *dst = Tcl_Backslash(src, &numRead);
+           if (*dst != 0) {
+               dst++;
+           }
+           src += numRead;
+           continue;
+       } else if (c == '\0') {
+           Tcl_ResetResult(interp);
+           sprintf(interp->result, "missing %c", termChar);
+           *termPtr = string-1;
+           return TCL_ERROR;
+       } else {
+           goto copy;
+       }
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TclParseNestedCmd --
+ *
+ *     This procedure parses a nested Tcl command between
+ *     brackets, returning the result of the command.
+ *
+ * Results:
+ *     The return value is a standard Tcl result, which is
+ *     TCL_OK unless there was an error while executing the
+ *     nested command.  If an error occurs then interp->result
+ *     contains a standard error message.  *TermPtr is filled
+ *     in with the address of the character just after the
+ *     last one processed;  this is usually the character just
+ *     after the matching close-bracket, or the null character
+ *     at the end of the string if the close-bracket was missing
+ *     (a missing close bracket is an error).  The result returned
+ *     by the command is stored in standard fashion in *pvPtr,
+ *     null-terminated, with pvPtr->next pointing to the null
+ *     character.
+ *
+ * Side effects:
+ *     The storage space at *pvPtr may be expanded.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+TclParseNestedCmd(interp, string, flags, termPtr, pvPtr)
+    Tcl_Interp *interp;                /* Interpreter to use for nested command
+                                * evaluations and error messages. */
+    char *string;              /* Character just after opening bracket. */
+    int flags;                 /* Flags to pass to nested Tcl_Eval. */
+    char **termPtr;            /* Store address of terminating character
+                                * here. */
+    register ParseValue *pvPtr;        /* Information about where to place
+                                * result of command. */
+{
+    int result, length, shortfall;
+    Interp *iPtr = (Interp *) interp;
+
+    result = Tcl_Eval(interp, string, flags | TCL_BRACKET_TERM, termPtr);
+    if (result != TCL_OK) {
+       /*
+        * The increment below results in slightly cleaner message in
+        * the errorInfo variable (the close-bracket will appear).
+        */
+
+       if (**termPtr == ']') {
+           *termPtr += 1;
+       }
+       return result;
+    }
+    (*termPtr) += 1;
+    length = strlen(iPtr->result);
+    shortfall = length + 1 - (pvPtr->end - pvPtr->next);
+    if (shortfall > 0) {
+       (*pvPtr->expandProc)(pvPtr, shortfall);
+    }
+    strcpy(pvPtr->next, iPtr->result);
+    pvPtr->next += length;
+    Tcl_FreeResult(iPtr);
+    iPtr->result = iPtr->resultSpace;
+    iPtr->resultSpace[0] = '\0';
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TclParseBraces --
+ *
+ *     This procedure scans the information between matching
+ *     curly braces.
+ *
+ * Results:
+ *     The return value is a standard Tcl result, which is
+ *     TCL_OK unless there was an error while parsing string.
+ *     If an error occurs then interp->result contains a
+ *     standard error message.  *TermPtr is filled
+ *     in with the address of the character just after the
+ *     last one successfully processed;  this is usually the
+ *     character just after the matching close-brace.  The
+ *     information between curly braces is stored in standard
+ *     fashion in *pvPtr, null-terminated with pvPtr->next
+ *     pointing to the terminating null character.
+ *
+ * Side effects:
+ *     The storage space at *pvPtr may be expanded.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+TclParseBraces(interp, string, termPtr, pvPtr)
+    Tcl_Interp *interp;                /* Interpreter to use for nested command
+                                * evaluations and error messages. */
+    char *string;              /* Character just after opening bracket. */
+    char **termPtr;            /* Store address of terminating character
+                                * here. */
+    register ParseValue *pvPtr;        /* Information about where to place
+                                * result of command. */
+{
+    int level;
+    register char *src, *dst, *end;
+    register char c;
+
+    src = string;
+    dst = pvPtr->next;
+    end = pvPtr->end;
+    level = 1;
+
+    /*
+     * Copy the characters one at a time to the result area, stopping
+     * when the matching close-brace is found.
+     */
+
+    while (1) {
+       c = *src;
+       src++;
+       if (dst == end) {
+           pvPtr->next = dst;
+           (*pvPtr->expandProc)(pvPtr, 20);
+           dst = pvPtr->next;
+           end = pvPtr->end;
+       }
+       *dst = c;
+       dst++;
+       if (CHAR_TYPE(c) == TCL_NORMAL) {
+           continue;
+       } else if (c == '{') {
+           level++;
+       } else if (c == '}') {
+           level--;
+           if (level == 0) {
+               dst--;                  /* Don't copy the last close brace. */
+               break;
+           }
+       } else if (c == '\\') {
+           int count;
+
+           /*
+            * Must always squish out backslash-newlines, even when in
+            * braces.  This is needed so that this sequence can appear
+            * anywhere in a command, such as the middle of an expression.
+            */
+
+           if (*src == '\n') {
+               dst--;
+               src++;
+           } else {
+               (void) Tcl_Backslash(src-1, &count);
+               while (count > 1) {
+                    if (dst == end) {
+                        pvPtr->next = dst;
+                        (*pvPtr->expandProc)(pvPtr, 20);
+                        dst = pvPtr->next;
+                        end = pvPtr->end;
+                    }
+                   *dst = *src;
+                   dst++;
+                   src++;
+                   count--;
+               }
+           }
+       } else if (c == '\0') {
+           Tcl_SetResult(interp, "missing close-brace", TCL_STATIC);
+           *termPtr = string-1;
+           return TCL_ERROR;
+       }
+    }
+
+    *dst = '\0';
+    pvPtr->next = dst;
+    *termPtr = src;
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TclParseWords --
+ *
+ *     This procedure parses one or more words from a command
+ *     string and creates argv-style pointers to fully-substituted
+ *     copies of those words.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.
+ *     
+ *     *argcPtr is modified to hold a count of the number of words
+ *     successfully parsed, which may be 0.  At most maxWords words
+ *     will be parsed.  If 0 <= *argcPtr < maxWords then it
+ *     means that a command separator was seen.  If *argcPtr
+ *     is maxWords then it means that a command separator was
+ *     not seen yet.
+ *
+ *     *TermPtr is filled in with the address of the character
+ *     just after the last one successfully processed in the
+ *     last word.  This is either the command terminator (if
+ *     *argcPtr < maxWords), the character just after the last
+ *     one in a word (if *argcPtr is maxWords), or the vicinity
+ *     of an error (if the result is not TCL_OK).
+ *     
+ *     The pointers at *argv are filled in with pointers to the
+ *     fully-substituted words, and the actual contents of the
+ *     words are copied to the buffer at pvPtr.
+ *
+ *     If an error occurrs then an error message is left in
+ *     interp->result and the information at *argv, *argcPtr,
+ *     and *pvPtr may be incomplete.
+ *
+ * Side effects:
+ *     The buffer space in pvPtr may be enlarged by calling its
+ *     expandProc.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+TclParseWords(interp, string, flags, maxWords, termPtr, argcPtr, argv, pvPtr)
+    Tcl_Interp *interp;                /* Interpreter to use for nested command
+                                * evaluations and error messages. */
+    char *string;              /* First character of word. */
+    int flags;                 /* Flags to control parsing (same values as
+                                * passed to Tcl_Eval). */
+    int maxWords;              /* Maximum number of words to parse. */
+    char **termPtr;            /* Store address of terminating character
+                                * here. */
+    int *argcPtr;              /* Filled in with actual number of words
+                                * parsed. */
+    char **argv;               /* Store addresses of individual words here. */
+    register ParseValue *pvPtr;        /* Information about where to place
+                                * fully-substituted word. */
+{
+    register char *src, *dst;
+    register char c;
+    int type, result, argc;
+    char *oldBuffer;           /* Used to detect when pvPtr's buffer gets
+                                * reallocated, so we can adjust all of the
+                                * argv pointers. */
+
+    src = string;
+    oldBuffer = pvPtr->buffer;
+    dst = pvPtr->next;
+    for (argc = 0; argc < maxWords; argc++) {
+       argv[argc] = dst;
+
+       /*
+        * Skip leading space.
+        */
+    
+       skipSpace:
+       c = *src;
+       type = CHAR_TYPE(c);
+       while (type == TCL_SPACE) {
+           src++;
+           c = *src;
+           type = CHAR_TYPE(c);
+       }
+    
+       /*
+        * Handle the normal case (i.e. no leading double-quote or brace).
+        */
+
+       if (type == TCL_NORMAL) {
+           normalArg:
+           while (1) {
+               if (dst == pvPtr->end) {
+                   /*
+                    * Target buffer space is about to run out.  Make
+                    * more space.
+                    */
+       
+                   pvPtr->next = dst;
+                   (*pvPtr->expandProc)(pvPtr, 1);
+                   dst = pvPtr->next;
+               }
+       
+               if (type == TCL_NORMAL) {
+                   copy:
+                   *dst = c;
+                   dst++;
+                   src++;
+               } else if (type == TCL_SPACE) {
+                   goto wordEnd;
+               } else if (type == TCL_DOLLAR) {
+                   int length;
+                   char *value;
+       
+                   value = Tcl_ParseVar(interp, src, termPtr);
+                   if (value == NULL) {
+                       return TCL_ERROR;
+                   }
+                   src = *termPtr;
+                   length = strlen(value);
+                   if ((pvPtr->end - dst) <= length) {
+                       pvPtr->next = dst;
+                       (*pvPtr->expandProc)(pvPtr, length);
+                       dst = pvPtr->next;
+                   }
+                   strcpy(dst, value);
+                   dst += length;
+               } else if (type == TCL_COMMAND_END) {
+                   if ((c == ']') && !(flags & TCL_BRACKET_TERM)) {
+                       goto copy;
+                   }
+
+                   /*
+                    * End of command;  simulate a word-end first, so
+                    * that the end-of-command can be processed as the
+                    * first thing in a new word.
+                    */
+
+                   goto wordEnd;
+               } else if (type == TCL_OPEN_BRACKET) {
+                   pvPtr->next = dst;
+                   result = TclParseNestedCmd(interp, src+1, flags, termPtr,
+                           pvPtr);
+                   if (result != TCL_OK) {
+                       return result;
+                   }
+                   src = *termPtr;
+                   dst = pvPtr->next;
+               } else if (type == TCL_BACKSLASH) {
+                   int numRead;
+    
+                   *dst = Tcl_Backslash(src, &numRead);
+                   if (*dst != 0) {
+                       dst++;
+                   }
+                   src += numRead;
+               } else {
+                   goto copy;
+               }
+               c = *src;
+               type = CHAR_TYPE(c);
+           }
+       } else {
+    
+           /*
+            * Check for the end of the command.
+            */
+       
+           if (type == TCL_COMMAND_END) {
+               if (flags & TCL_BRACKET_TERM) {
+                   if (c == '\0') {
+                       Tcl_SetResult(interp, "missing close-bracket",
+                               TCL_STATIC);
+                       return TCL_ERROR;
+                   }
+               } else {
+                   if (c == ']') {
+                       goto normalArg;
+                   }
+               }
+               goto done;
+           }
+       
+           /*
+            * Now handle the special cases: open braces, double-quotes,
+            * and backslash-newline.
+            */
+
+           pvPtr->next = dst;
+           if (type == TCL_QUOTE) {
+               result = TclParseQuotes(interp, src+1, '"', flags,
+                       termPtr, pvPtr);
+           } else if (type == TCL_OPEN_BRACE) {
+               result = TclParseBraces(interp, src+1, termPtr, pvPtr);
+           } else if ((type == TCL_BACKSLASH) && (src[1] == '\n')) {
+               src += 2;
+               goto skipSpace;
+           } else {
+               goto normalArg;
+           }
+           if (result != TCL_OK) {
+               return result;
+           }
+       
+           /*
+            * Back from quotes or braces;  make sure that the terminating
+            * character was the end of the word.  Have to be careful here
+            * to handle continuation lines (i.e. lines ending in backslash).
+            */
+       
+           c = **termPtr;
+           if ((c == '\\') && ((*termPtr)[1] == '\n')) {
+               c = (*termPtr)[2];
+           }
+           type = CHAR_TYPE(c);
+           if ((type != TCL_SPACE) && (type != TCL_COMMAND_END)) {
+               if (*src == '"') {
+                   Tcl_SetResult(interp, "extra characters after close-quote",
+                           TCL_STATIC);
+               } else {
+                   Tcl_SetResult(interp, "extra characters after close-brace",
+                           TCL_STATIC);
+               }
+               return TCL_ERROR;
+           }
+           src = *termPtr;
+           dst = pvPtr->next;
+
+       }
+
+       /*
+        * We're at the end of a word, so add a null terminator.  Then
+        * see if the buffer was re-allocated during this word.  If so,
+        * update all of the argv pointers.
+        */
+
+       wordEnd:
+       *dst = '\0';
+       dst++;
+       if (oldBuffer != pvPtr->buffer) {
+           int i;
+
+           for (i = 0; i <= argc; i++) {
+               argv[i] = pvPtr->buffer + (argv[i] - oldBuffer);
+           }
+           oldBuffer = pvPtr->buffer;
+       }
+    }
+
+    done:
+    pvPtr->next = dst;
+    *termPtr = src;
+    *argcPtr = argc;
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TclExpandParseValue --
+ *
+ *     This procedure is commonly used as the value of the
+ *     expandProc in a ParseValue.  It uses malloc to allocate
+ *     more space for the result of a parse.
+ *
+ * Results:
+ *     The buffer space in *pvPtr is reallocated to something
+ *     larger, and if pvPtr->clientData is non-zero the old
+ *     buffer is freed.  Information is copied from the old
+ *     buffer to the new one.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TclExpandParseValue(pvPtr, needed)
+    register ParseValue *pvPtr;                /* Information about buffer that
+                                        * must be expanded.  If the clientData
+                                        * in the structure is non-zero, it
+                                        * means that the current buffer is
+                                        * dynamically allocated. */
+    int needed;                                /* Minimum amount of additional space
+                                        * to allocate. */
+{
+    int newSpace;
+    char *new;
+
+    /*
+     * Either double the size of the buffer or add enough new space
+     * to meet the demand, whichever produces a larger new buffer.
+     */
+
+    newSpace = (pvPtr->end - pvPtr->buffer) + 1;
+    if (newSpace < needed) {
+       newSpace += needed;
+    } else {
+       newSpace += newSpace;
+    }
+    new = (char *) ckalloc((unsigned) newSpace);
+
+    /*
+     * Copy from old buffer to new, free old buffer if needed, and
+     * mark new buffer as malloc-ed.
+     */
+
+    memcpy((VOID *) new, (VOID *) pvPtr->buffer, pvPtr->next - pvPtr->buffer);
+    pvPtr->next = new + (pvPtr->next - pvPtr->buffer);
+    if (pvPtr->clientData != 0) {
+       ckfree(pvPtr->buffer);
+    }
+    pvPtr->buffer = new;
+    pvPtr->end = new + newSpace - 1;
+    pvPtr->clientData = (ClientData) 1;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclWordEnd --
+ *
+ *     Given a pointer into a Tcl command, find the end of the next
+ *     word of the command.
+ *
+ * Results:
+ *     The return value is a pointer to the character just after the
+ *     last one that's part of the word pointed to by "start".  This
+ *     may be the address of the NULL character at the end of the
+ *     string.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+TclWordEnd(start, nested)
+    char *start;               /* Beginning of a word of a Tcl command. */
+    int nested;                        /* Zero means this is a top-level command.
+                                * One means this is a nested command (close
+                                * brace is a word terminator). */
+{
+    register char *p;
+    int count;
+
+    p = start;
+    while (isspace(*p)) {
+       p++;
+    }
+
+    /*
+     * Handle words beginning with a double-quote or a brace.
+     */
+
+    if (*p == '"') {
+       p = QuoteEnd(p+1, '"');
+    } else if (*p == '{') {
+       int braces = 1;
+       while (braces != 0) {
+           p++;
+           while (*p == '\\') {
+               (void) Tcl_Backslash(p, &count);
+               p += count;
+           }
+           if (*p == '}') {
+               braces--;
+           } else if (*p == '{') {
+               braces++;
+           } else if (*p == 0) {
+               return p;
+           }
+       }
+    }
+
+    /*
+     * Handle words that don't start with a brace or double-quote.
+     * This code is also invoked if the word starts with a brace or
+     * double-quote and there is garbage after the closing brace or
+     * quote.  This is an error as far as Tcl_Eval is concerned, but
+     * for here the garbage is treated as part of the word.
+     */
+
+    while (*p != 0) {
+       if (*p == '[') {
+           p++;
+           while ((*p != ']') && (*p != 0)) {
+               p = TclWordEnd(p, 1);
+           }
+           if (*p == ']') {
+               p++;
+           }
+       } else if (*p == '\\') {
+           (void) Tcl_Backslash(p, &count);
+           p += count;
+       } else if (*p == '$') {
+           p = VarNameEnd(p);
+       } else if (*p == ';') {
+           /*
+            * Note:  semi-colon terminates a word
+            * and also counts as a word by itself.
+            */
+
+           if (p == start) {
+               p++;
+           }
+           break;
+       } else if (isspace(*p)) {
+           break;
+       } else if ((*p == ']') && nested) {
+           break;
+       } else {
+           p++;
+       }
+    }
+    return p;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * QuoteEnd --
+ *
+ *     Given a pointer to a string that obeys the parsing conventions
+ *     for quoted things in Tcl, find the end of that quoted thing.
+ *     The actual thing may be a quoted argument or a parenthesized
+ *     index name.
+ *
+ * Results:
+ *     The return value is a pointer to the character just after the
+ *     last one that is part of the quoted string.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static char *
+QuoteEnd(string, term)
+    char *string;              /* Pointer to character just after opening
+                                * "quote". */
+    int term;                  /* This character will terminate the
+                                * quoted string (e.g. '"' or ')'). */
+{
+    register char *p = string;
+    int count;
+
+    while ((*p != 0) && (*p != term)) {
+       if (*p == '\\') {
+           (void) Tcl_Backslash(p, &count);
+           p += count;
+       } else if (*p == '[') {
+           p++;
+           while ((*p != ']') && (*p != 0)) {
+               p = TclWordEnd(p, 1);
+           }
+           if (*p == ']') {
+               p++;
+           }
+       } else if (*p == '$') {
+           p = VarNameEnd(p);
+       } else {
+           p++;
+       }
+    }
+    return p;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * VarNameEnd --
+ *
+ *     Given a pointer to a variable reference using $-notation, find
+ *     the end of the variable name spec.
+ *
+ * Results:
+ *     The return value is a pointer to the character just after the
+ *     last one that is part of the variable name.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static char *
+VarNameEnd(string)
+    char *string;              /* Pointer to dollar-sign character. */
+{
+    register char *p = string+1;
+
+    if (*p == '{') {
+       do {
+           p++;
+       } while ((*p != '}') && (*p != 0));
+    } else {
+       while (isalnum(*p) || (*p == '_')) {
+           p++;
+       }
+       if ((*p == '(') && (p != string+1)) {
+           p = QuoteEnd(p+1, ')');
+       }
+    }
+    return p;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ParseVar --
+ *
+ *     Given a string starting with a $ sign, parse off a variable
+ *     name and return its value.
+ *
+ * Results:
+ *     The return value is the contents of the variable given by
+ *     the leading characters of string.  If termPtr isn't NULL,
+ *     *termPtr gets filled in with the address of the character
+ *     just after the last one in the variable specifier.  If the
+ *     variable doesn't exist, then the return value is NULL and
+ *     an error message will be left in interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tcl_ParseVar(interp, string, termPtr)
+    Tcl_Interp *interp;                        /* Context for looking up variable. */
+    register char *string;             /* String containing variable name.
+                                        * First character must be "$". */
+    char **termPtr;                    /* If non-NULL, points to word to fill
+                                        * in with character just after last
+                                        * one in the variable specifier. */
+
+{
+    char *name1, *name1End, c, *result;
+    register char *name2;
+#define NUM_CHARS 200
+    char copyStorage[NUM_CHARS];
+    ParseValue pv;
+
+    /*
+     * There are three cases:
+     * 1. The $ sign is followed by an open curly brace.  Then the variable
+     *    name is everything up to the next close curly brace, and the
+     *    variable is a scalar variable.
+     * 2. The $ sign is not followed by an open curly brace.  Then the
+     *    variable name is everything up to the next character that isn't
+     *    a letter, digit, or underscore.  If the following character is an
+     *    open parenthesis, then the information between parentheses is
+     *    the array element name, which can include any of the substitutions
+     *    permissible between quotes.
+     * 3. The $ sign is followed by something that isn't a letter, digit,
+     *    or underscore:  in this case, there is no variable name, and "$"
+     *    is returned.
+     */
+
+    name2 = NULL;
+    string++;
+    if (*string == '{') {
+       string++;
+       name1 = string;
+       while (*string != '}') {
+           if (*string == 0) {
+               Tcl_SetResult(interp, "missing close-brace for variable name",
+                       TCL_STATIC);
+               if (termPtr != 0) {
+                   *termPtr = string;
+               }
+               return NULL;
+           }
+           string++;
+       }
+       name1End = string;
+       string++;
+    } else {
+       name1 = string;
+       while (isalnum(*string) || (*string == '_')) {
+           string++;
+       }
+       if (string == name1) {
+           if (termPtr != 0) {
+               *termPtr = string;
+           }
+           return "$";
+       }
+       name1End = string;
+       if (*string == '(') {
+           char *end;
+
+           /*
+            * Perform substitutions on the array element name, just as
+            * is done for quotes.
+            */
+
+           pv.buffer = pv.next = copyStorage;
+           pv.end = copyStorage + NUM_CHARS - 1;
+           pv.expandProc = TclExpandParseValue;
+           pv.clientData = (ClientData) NULL;
+           if (TclParseQuotes(interp, string+1, ')', 0, &end, &pv)
+                   != TCL_OK) {
+               char msg[100];
+               sprintf(msg, "\n    (parsing index for array \"%.*s\")",
+                       string-name1, name1);
+               Tcl_AddErrorInfo(interp, msg);
+               result = NULL;
+               name2 = pv.buffer;
+               if (termPtr != 0) {
+                   *termPtr = end;
+               }
+               goto done;
+           }
+           string = end;
+           name2 = pv.buffer;
+       }
+    }
+    if (termPtr != 0) {
+       *termPtr = string;
+    }
+
+    c = *name1End;
+    *name1End = 0;
+    result = Tcl_GetVar2(interp, name1, name2, TCL_LEAVE_ERR_MSG);
+    *name1End = c;
+
+    done:
+    if ((name2 != NULL) && (pv.buffer != copyStorage)) {
+       ckfree(pv.buffer);
+    }
+    return result;
+}
diff --git a/src/tcl/tclproc.c b/src/tcl/tclproc.c
new file mode 100644 (file)
index 0000000..eb94c3b
--- /dev/null
@@ -0,0 +1,567 @@
+/* 
+ * tclProc.c --
+ *
+ *     This file contains routines that implement Tcl procedures,
+ *     including the "proc" and "uplevel" commands.
+ *
+ * Copyright 1987-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /sprite/src/lib/tcl/RCS/tclProc.c,v 1.59 91/09/30 16:59:54 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tclint.h"
+
+/*
+ * Forward references to procedures defined later in this file:
+ */
+
+static  int    InterpProc _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+static  void   ProcDeleteProc _ANSI_ARGS_((ClientData clientData));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ProcCmd --
+ *
+ *     This procedure is invoked to process the "proc" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result value.
+ *
+ * Side effects:
+ *     A new procedure gets created.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_ProcCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    register Interp *iPtr = (Interp *) interp;
+    register Proc *procPtr;
+    int result, argCount, i;
+    char **argArray = NULL;
+    Arg *lastArgPtr;
+    register Arg *argPtr = NULL;       /* Initialization not needed, but
+                                        * prevents compiler warning. */
+
+    if (argc != 4) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " name args body\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    procPtr = (Proc *) ckalloc(sizeof(Proc));
+    procPtr->iPtr = iPtr;
+    procPtr->command = (char *) ckalloc((unsigned) strlen(argv[3]) + 1);
+    strcpy(procPtr->command, argv[3]);
+    procPtr->argPtr = NULL;
+
+    /*
+     * Break up the argument list into argument specifiers, then process
+     * each argument specifier.
+     */
+
+    result = Tcl_SplitList(interp, argv[2], &argCount, &argArray);
+    if (result != TCL_OK) {
+       goto procError;
+    }
+    lastArgPtr = NULL;
+    for (i = 0; i < argCount; i++) {
+       int fieldCount, nameLength, valueLength;
+       char **fieldValues;
+
+       /*
+        * Now divide the specifier up into name and default.
+        */
+
+       result = Tcl_SplitList(interp, argArray[i], &fieldCount,
+               &fieldValues);
+       if (result != TCL_OK) {
+           goto procError;
+       }
+       if (fieldCount > 2) {
+           ckfree((char *) fieldValues);
+           Tcl_AppendResult(interp,
+                   "too many fields in argument specifier \"",
+                   argArray[i], "\"", (char *) NULL);
+           result = TCL_ERROR;
+           goto procError;
+       }
+       if ((fieldCount == 0) || (*fieldValues[0] == 0)) {
+           ckfree((char *) fieldValues);
+           Tcl_AppendResult(interp, "procedure \"", argv[1],
+                   "\" has argument with no name", (char *) NULL);
+           result = TCL_ERROR;
+           goto procError;
+       }
+       nameLength = strlen(fieldValues[0]) + 1;
+       if (fieldCount == 2) {
+           valueLength = strlen(fieldValues[1]) + 1;
+       } else {
+           valueLength = 0;
+       }
+       argPtr = (Arg *) ckalloc((unsigned)
+               (sizeof(Arg) - sizeof(argPtr->name) + nameLength
+               + valueLength));
+       if (lastArgPtr == NULL) {
+           procPtr->argPtr = argPtr;
+       } else {
+           lastArgPtr->nextPtr = argPtr;
+       }
+       lastArgPtr = argPtr;
+       argPtr->nextPtr = NULL;
+       strcpy(argPtr->name, fieldValues[0]);
+       if (fieldCount == 2) {
+           argPtr->defValue = argPtr->name + nameLength;
+           strcpy(argPtr->defValue, fieldValues[1]);
+       } else {
+           argPtr->defValue = NULL;
+       }
+       ckfree((char *) fieldValues);
+    }
+
+    Tcl_CreateCommand(interp, argv[1], InterpProc, (ClientData) procPtr,
+           ProcDeleteProc);
+    ckfree((char *) argArray);
+    return TCL_OK;
+
+    procError:
+    ckfree(procPtr->command);
+    while (procPtr->argPtr != NULL) {
+       argPtr = procPtr->argPtr;
+       procPtr->argPtr = argPtr->nextPtr;
+       ckfree((char *) argPtr);
+    }
+    ckfree((char *) procPtr);
+    if (argArray != NULL) {
+       ckfree((char *) argArray);
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclGetFrame --
+ *
+ *     Given a description of a procedure frame, such as the first
+ *     argument to an "uplevel" or "upvar" command, locate the
+ *     call frame for the appropriate level of procedure.
+ *
+ * Results:
+ *     The return value is -1 if an error occurred in finding the
+ *     frame (in this case an error message is left in interp->result).
+ *     1 is returned if string was either a number or a number preceded
+ *     by "#" and it specified a valid frame.  0 is returned if string
+ *     isn't one of the two things above (in this case, the lookup
+ *     acts as if string were "1").  The variable pointed to by
+ *     framePtrPtr is filled in with the address of the desired frame
+ *     (unless an error occurs, in which case it isn't modified).
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TclGetFrame(interp, string, framePtrPtr)
+    Tcl_Interp *interp;                /* Interpreter in which to find frame. */
+    char *string;              /* String describing frame. */
+    CallFrame **framePtrPtr;   /* Store pointer to frame here (or NULL
+                                * if global frame indicated). */
+{
+    register Interp *iPtr = (Interp *) interp;
+    int level, result;
+    CallFrame *framePtr;
+
+    if (iPtr->varFramePtr == NULL) {
+       iPtr->result = "already at top level";
+       return -1;
+    }
+
+    /*
+     * Parse string to figure out which level number to go to.
+     */
+
+    result = 1;
+    if (*string == '#') {
+       if (Tcl_GetInt(interp, string+1, &level) != TCL_OK) {
+           return -1;
+       }
+       if (level < 0) {
+           levelError:
+           Tcl_AppendResult(interp, "bad level \"", string, "\"",
+                   (char *) NULL);
+           return -1;
+       }
+    } else if (isdigit(*string)) {
+       if (Tcl_GetInt(interp, string, &level) != TCL_OK) {
+           return -1;
+       }
+       level = iPtr->varFramePtr->level - level;
+    } else {
+       level = iPtr->varFramePtr->level - 1;
+       result = 0;
+    }
+
+    /*
+     * Figure out which frame to use, and modify the interpreter so
+     * its variables come from that frame.
+     */
+
+    if (level == 0) {
+       framePtr = NULL;
+    } else {
+       for (framePtr = iPtr->varFramePtr; framePtr != NULL;
+               framePtr = framePtr->callerVarPtr) {
+           if (framePtr->level == level) {
+               break;
+           }
+       }
+       if (framePtr == NULL) {
+           goto levelError;
+       }
+    }
+    *framePtrPtr = framePtr;
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_UplevelCmd --
+ *
+ *     This procedure is invoked to process the "uplevel" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result value.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_UplevelCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    register Interp *iPtr = (Interp *) interp;
+    int result;
+    CallFrame *savedVarFramePtr, *framePtr;
+
+    if (argc < 2) {
+       uplevelSyntax:
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " ?level? command ?command ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Find the level to use for executing the command.
+     */
+
+    result = TclGetFrame(interp, argv[1], &framePtr);
+    if (result == -1) {
+       return TCL_ERROR;
+    }
+    argc -= (result+1);
+    argv += (result+1);
+
+    /*
+     * Modify the interpreter state to execute in the given frame.
+     */
+
+    savedVarFramePtr = iPtr->varFramePtr;
+    iPtr->varFramePtr = framePtr;
+
+    /*
+     * Execute the residual arguments as a command.
+     */
+
+    if (argc == 0) {
+       goto uplevelSyntax;
+    }
+    if (argc == 1) {
+       result = Tcl_Eval(interp, argv[0], 0, (char **) NULL);
+    } else {
+       char *cmd;
+
+       cmd = Tcl_Concat(argc, argv);
+       result = Tcl_Eval(interp, cmd, 0, (char **) NULL);
+       ckfree(cmd);
+    }
+    if (result == TCL_ERROR) {
+       char msg[60];
+       sprintf(msg, "\n    (\"uplevel\" body line %d)", interp->errorLine);
+       Tcl_AddErrorInfo(interp, msg);
+    }
+
+    /*
+     * Restore the variable frame, and return.
+     */
+
+    iPtr->varFramePtr = savedVarFramePtr;
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclFindProc --
+ *
+ *     Given the name of a procedure, return a pointer to the
+ *     record describing the procedure.
+ *
+ * Results:
+ *     NULL is returned if the name doesn't correspond to any
+ *     procedure.  Otherwise the return value is a pointer to
+ *     the procedure's record.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Proc *
+TclFindProc(iPtr, procName)
+    Interp *iPtr;              /* Interpreter in which to look. */
+    char *procName;            /* Name of desired procedure. */
+{
+    Tcl_HashEntry *hPtr;
+    Command *cmdPtr;
+
+    hPtr = Tcl_FindHashEntry(&iPtr->commandTable, procName);
+    if (hPtr == NULL) {
+       return NULL;
+    }
+    cmdPtr = (Command *) Tcl_GetHashValue(hPtr);
+    if (cmdPtr->proc != InterpProc) {
+       return NULL;
+    }
+    return (Proc *) cmdPtr->clientData;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclIsProc --
+ *
+ *     Tells whether a command is a Tcl procedure or not.
+ *
+ * Results:
+ *     If the given command is actuall a Tcl procedure, the
+ *     return value is the address of the record describing
+ *     the procedure.  Otherwise the return value is 0.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Proc *
+TclIsProc(cmdPtr)
+    Command *cmdPtr;           /* Command to test. */
+{
+    if (cmdPtr->proc == InterpProc) {
+       return (Proc *) cmdPtr->clientData;
+    }
+    return (Proc *) 0;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * InterpProc --
+ *
+ *     When a Tcl procedure gets invoked, this routine gets invoked
+ *     to interpret the procedure.
+ *
+ * Results:
+ *     A standard Tcl result value, usually TCL_OK.
+ *
+ * Side effects:
+ *     Depends on the commands in the procedure.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+InterpProc(clientData, interp, argc, argv)
+    ClientData clientData;     /* Record describing procedure to be
+                                * interpreted. */
+    Tcl_Interp *interp;                /* Interpreter in which procedure was
+                                * invoked. */
+    int argc;                  /* Count of number of arguments to this
+                                * procedure. */
+    char **argv;               /* Argument values. */
+{
+    register Proc *procPtr = (Proc *) clientData;
+    register Arg *argPtr;
+    register Interp *iPtr = (Interp *) interp;
+    char **args;
+    CallFrame frame;
+    char *value, *end;
+    int result;
+
+    /*
+     * Set up a call frame for the new procedure invocation.
+     */
+
+    iPtr = procPtr->iPtr;
+    Tcl_InitHashTable(&frame.varTable, TCL_STRING_KEYS);
+    if (iPtr->varFramePtr != NULL) {
+       frame.level = iPtr->varFramePtr->level + 1;
+    } else {
+       frame.level = 1;
+    }
+    frame.argc = argc;
+    frame.argv = argv;
+    frame.callerPtr = iPtr->framePtr;
+    frame.callerVarPtr = iPtr->varFramePtr;
+    iPtr->framePtr = &frame;
+    iPtr->varFramePtr = &frame;
+
+    /*
+     * Match the actual arguments against the procedure's formal
+     * parameters to compute local variables.
+     */
+
+    for (argPtr = procPtr->argPtr, args = argv+1, argc -= 1;
+           argPtr != NULL;
+           argPtr = argPtr->nextPtr, args++, argc--) {
+
+       /*
+        * Handle the special case of the last formal being "args".  When
+        * it occurs, assign it a list consisting of all the remaining
+        * actual arguments.
+        */
+
+       if ((argPtr->nextPtr == NULL)
+               && (strcmp(argPtr->name, "args") == 0)) {
+           if (argc < 0) {
+               argc = 0;
+           }
+           value = Tcl_Merge(argc, args);
+           Tcl_SetVar(interp, argPtr->name, value, 0);
+           ckfree(value);
+           argc = 0;
+           break;
+       } else if (argc > 0) {
+           value = *args;
+       } else if (argPtr->defValue != NULL) {
+           value = argPtr->defValue;
+       } else {
+           Tcl_AppendResult(interp, "no value given for parameter \"",
+                   argPtr->name, "\" to \"", argv[0], "\"",
+                   (char *) NULL);
+           result = TCL_ERROR;
+           goto procDone;
+       }
+       Tcl_SetVar(interp, argPtr->name, value, 0);
+    }
+    if (argc > 0) {
+       Tcl_AppendResult(interp, "called \"", argv[0],
+               "\" with too many arguments", (char *) NULL);
+       result = TCL_ERROR;
+       goto procDone;
+    }
+
+    /*
+     * Invoke the commands in the procedure's body.
+     */
+
+    result = Tcl_Eval(interp, procPtr->command, 0, &end);
+    if (result == TCL_RETURN) {
+       result = TCL_OK;
+    } else if (result == TCL_ERROR) {
+       char msg[100];
+
+       /*
+        * Record information telling where the error occurred.
+        */
+
+       sprintf(msg, "\n    (procedure \"%.50s\" line %d)", argv[0],
+               iPtr->errorLine);
+       Tcl_AddErrorInfo(interp, msg);
+    } else if (result == TCL_BREAK) {
+       iPtr->result = "invoked \"break\" outside of a loop";
+       result = TCL_ERROR;
+    } else if (result == TCL_CONTINUE) {
+       iPtr->result = "invoked \"continue\" outside of a loop";
+       result = TCL_ERROR;
+    }
+
+    /*
+     * Delete the call frame for this procedure invocation (it's
+     * important to remove the call frame from the interpreter
+     * before deleting it, so that traces invoked during the
+     * deletion don't see the partially-deleted frame).
+     */
+
+    procDone:
+    iPtr->framePtr = frame.callerPtr;
+    iPtr->varFramePtr = frame.callerVarPtr;
+    TclDeleteVars(iPtr, &frame.varTable);
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ProcDeleteProc --
+ *
+ *     This procedure is invoked just before a command procedure is
+ *     removed from an interpreter.  Its job is to release all the
+ *     resources allocated to the procedure.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Memory gets freed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ProcDeleteProc(clientData)
+    ClientData clientData;             /* Procedure to be deleted. */
+{
+    register Proc *procPtr = (Proc *) clientData;
+    register Arg *argPtr;
+
+    ckfree((char *) procPtr->command);
+    for (argPtr = procPtr->argPtr; argPtr != NULL; ) {
+       Arg *nextPtr = argPtr->nextPtr;
+
+       ckfree((char *) argPtr);
+       argPtr = nextPtr;
+    }
+    ckfree((char *) procPtr);
+}
diff --git a/src/tcl/tcltest.c b/src/tcl/tcltest.c
new file mode 100644 (file)
index 0000000..fd61f40
--- /dev/null
@@ -0,0 +1,157 @@
+/* 
+ * tclTest.c --
+ *
+ *     Test driver for TCL.
+ *
+ * Copyright 1987-1991 Regents of the University of California
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/tclTest/RCS/tclTest.c,v 1.21 92/01/19 14:15:27 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include "tcl.h"
+
+extern int exit();
+extern int Tcl_DumpActiveMemory();
+
+Tcl_Interp *interp;
+Tcl_CmdBuf buffer;
+char dumpFile[100];
+int quitFlag = 0;
+
+char *initCmd =
+    "if [file exists [info library]/init.tcl] {source [info library]/init.tcl}";
+
+       /* ARGSUSED */
+int
+cmdCheckmem(clientData, interp, argc, argv)
+    ClientData clientData;
+    Tcl_Interp *interp;
+    int argc;
+    char *argv[];
+{
+    if (argc != 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " fileName\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    strcpy(dumpFile, argv[1]);
+    quitFlag = 1;
+    return TCL_OK;
+}
+
+       /* ARGSUSED */
+int
+cmdEcho(clientData, interp, argc, argv)
+    ClientData clientData;
+    Tcl_Interp *interp;
+    int argc;
+    char *argv[];
+{
+    int i;
+
+    for (i = 1; ; i++) {
+       if (argv[i] == NULL) {
+           if (i != argc) {
+               echoError:
+               sprintf(interp->result,
+                   "argument list wasn't properly NULL-terminated in \"%s\" command",
+                   argv[0]);
+           }
+           break;
+       }
+       if (i >= argc) {
+           goto echoError;
+       }
+       fputs(argv[i], stdout);
+       if (i < (argc-1)) {
+           printf(" ");
+       }
+    }
+    printf("\n");
+    return TCL_OK;
+}
+
+int
+main()
+{
+    char line[1000], *cmd;
+    int result, gotPartial;
+
+    interp = Tcl_CreateInterp();
+#ifdef TCL_MEM_DEBUG
+    Tcl_InitMemory(interp);
+#endif
+    Tcl_CreateCommand(interp, "echo", cmdEcho, (ClientData) "echo",
+           (Tcl_CmdDeleteProc *) NULL);
+    Tcl_CreateCommand(interp, "checkmem", cmdCheckmem, (ClientData) 0,
+           (Tcl_CmdDeleteProc *) NULL);
+    buffer = Tcl_CreateCmdBuf();
+#ifndef TCL_GENERIC_ONLY
+    result = Tcl_Eval(interp, initCmd, 0, (char **) NULL);
+    if (result != TCL_OK) {
+       printf("%s\n", interp->result);
+       exit(1);
+    }
+#endif
+
+    gotPartial = 0;
+    while (1) {
+       clearerr(stdin);
+       if (!gotPartial) {
+           fputs("% ", stdout);
+           fflush(stdout);
+       }
+       if (fgets(line, 1000, stdin) == NULL) {
+           if (!gotPartial) {
+               exit(0);
+           }
+           line[0] = 0;
+       }
+       cmd = Tcl_AssembleCmd(buffer, line);
+       if (cmd == NULL) {
+           gotPartial = 1;
+           continue;
+       }
+
+       gotPartial = 0;
+       result = Tcl_RecordAndEval(interp, cmd, 0);
+       if (result == TCL_OK) {
+           if (*interp->result != 0) {
+               printf("%s\n", interp->result);
+           }
+           if (quitFlag) {
+               Tcl_DeleteInterp(interp);
+               Tcl_DeleteCmdBuf(buffer);
+#ifdef TCL_MEM_DEBUG
+               Tcl_DumpActiveMemory(dumpFile);
+#endif
+               exit(0);
+           }
+       } else {
+           if (result == TCL_ERROR) {
+               printf("Error");
+           } else {
+               printf("Error %d", result);
+           }
+           if (*interp->result != 0) {
+               printf(": %s\n", interp->result);
+           } else {
+               printf("\n");
+           }
+       }
+    }
+}
diff --git a/src/tcl/tclunix.h b/src/tcl/tclunix.h
new file mode 100644 (file)
index 0000000..a4c5cab
--- /dev/null
@@ -0,0 +1,325 @@
+/*
+ * tclUnix.h --
+ *
+ *     This file reads in UNIX-related header files and sets up
+ *     UNIX-related macros for Tcl's UNIX core.  It should be the
+ *     only file that contains #ifdefs to handle different flavors
+ *     of UNIX.  This file sets up the union of all UNIX-related
+ *     things needed by any of the Tcl core files.  This file
+ *     depends on configuration #defines in tclConfig.h
+ *
+ *     The material in this file was originally contributed by
+ *     Karl Lehenbauer, Mark Diekhans and Peter da Silva.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /user6/ouster/tcl/RCS/tclUnix.h,v 1.26 92/08/03 08:27:43 ouster Exp $ SPRITE (Berkeley)
+ */
+
+#ifndef _TCLUNIX
+#define _TCLUNIX
+
+/*
+ * The following #defines are used to distinguish between different
+ * UNIX systems.  These #defines are normally set by the "config" script
+ * based on information it gets by looking in the include and library
+ * areas.  The defaults below are for BSD-based systems like SunOS
+ * or Ultrix.
+ *
+ * TCL_GETTOD -                        1 means there exists a library procedure
+ *                             "gettimeofday" (e.g. BSD systems).  0 means
+ *                             have to use "times" instead.
+ * TCL_GETWD -                 1 means there exists a library procedure
+ *                             "getwd" (e.g. BSD systems).  0 means
+ *                             have to use "getcwd" instead.
+ * TCL_SYS_ERRLIST -           1 means that the array sys_errlist is
+ *                             defined as part of the C library.
+ * TCL_SYS_TIME_H -            1 means there exists an include file
+ *                             <sys/time.h> (e.g. BSD derivatives).
+ * TCL_SYS_WAIT_H -            1 means there exists an include file
+ *                             <sys/wait.h> that defines constants related
+ *                             to the results of "wait".
+ * TCL_UNION_WAIT -            1 means that the "wait" system call returns
+ *                             a structure of type "union wait" (e.g. BSD
+ *                             systems).  0 means "wait" returns an int
+ *                             (e.g. System V and POSIX).
+ * TCL_PID_T -                 1 means that <sys/types> defines the type
+ *                             pid_t.  0 means that it doesn't.
+ * TCL_UID_T -                 1 means that <sys/types> defines the type
+ *                             uid_t.  0 means that it doesn't.
+ */
+
+#define TCL_GETTOD 1
+#define TCL_GETWD 0
+#define TCL_SYS_ERRLIST 1
+#define TCL_SYS_TIME_H 1
+#define TCL_SYS_WAIT_H 1
+#define TCL_UNION_WAIT 0
+
+#ifdef IS_LINUX
+
+#define TCL_PID_T 1
+#define TCL_UID_T 1
+
+#else
+
+#define TCL_PID_T 0
+#define TCL_UID_T 0
+
+#endif
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <pwd.h>
+#include <signal.h>
+#include <sys/param.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#if TCL_SYS_TIME_H
+#   include <sys/time.h>
+#else
+#   include <time.h>
+#endif
+#if TCL_SYS_WAIT_H
+#   include <sys/wait.h>
+#endif
+
+/*
+ * Not all systems declare the errno variable in errno.h. so this
+ * file does it explicitly.  The list of system error messages also
+ * isn't generally declared in a header file anywhere.
+ */
+
+extern int errno;
+extern int sys_nerr;
+//#ifndef IS_LINUX
+//extern char *sys_errlist[];
+//#endif
+
+/*
+ * The type of the status returned by wait varies from UNIX system
+ * to UNIX system.  The macro below defines it:
+ */
+
+#if TCL_UNION_WAIT
+#   define WAIT_STATUS_TYPE union wait
+#else
+#   define WAIT_STATUS_TYPE int
+#endif
+
+/*
+ * Supply definitions for macros to query wait status, if not already
+ * defined in header files above.
+ */
+
+#ifndef WIFEXITED
+#   define WIFEXITED(stat)  (((*((int *) &(stat))) & 0xff) == 0)
+#endif
+
+#ifndef WEXITSTATUS
+#   define WEXITSTATUS(stat) (((*((int *) &(stat))) >> 8) & 0xff)
+#endif
+
+#ifndef WIFSIGNALED
+#   define WIFSIGNALED(stat) (((*((int *) &(stat)))) && ((*((int *) &(stat))) == ((*((int *) &(stat))) & 0x00ff)))
+#endif
+
+#ifndef WTERMSIG
+#   define WTERMSIG(stat)    ((*((int *) &(stat))) & 0x7f)
+#endif
+
+#ifndef WIFSTOPPED
+#   define WIFSTOPPED(stat)  (((*((int *) &(stat))) & 0xff) == 0177)
+#endif
+
+#ifndef WSTOPSIG
+#   define WSTOPSIG(stat)    (((*((int *) &(stat))) >> 8) & 0xff)
+#endif
+
+/*
+ * Supply macros for seek offsets, if they're not already provided by
+ * an include file.
+ */
+
+#ifndef SEEK_SET
+#   define SEEK_SET 0
+#endif
+
+#ifndef SEEK_CUR
+#   define SEEK_CUR 1
+#endif
+
+#ifndef SEEK_END
+#   define SEEK_END 2
+#endif
+
+/*
+ * The stuff below is needed by the "time" command.  If this
+ * system has no gettimeofday call, then must use times and the
+ * CLK_TCK #define (from sys/param.h) to compute elapsed time.
+ * Unfortunately, some systems only have HZ and no CLK_TCK, and
+ * some might not even have HZ.
+ */
+
+#if ! TCL_GETTOD
+#   include <sys/times.h>
+#   include <sys/param.h>
+#   ifndef CLK_TCK
+#       ifdef HZ
+#           define CLK_TCK HZ
+#       else
+#           define CLK_TCK 60
+#       endif
+#   endif
+#endif
+
+/*
+ * Define access mode constants if they aren't already defined.
+ */
+
+#ifndef F_OK
+#    define F_OK 00
+#endif
+#ifndef X_OK
+#    define X_OK 01
+#endif
+#ifndef W_OK
+#    define W_OK 02
+#endif
+#ifndef R_OK
+#    define R_OK 04
+#endif
+
+/*
+ * On systems without symbolic links (i.e. S_IFLNK isn't defined)
+ * define "lstat" to use "stat" instead.
+ */
+
+#ifndef S_IFLNK
+#   define lstat stat
+#endif
+
+/*
+ * Define macros to query file type bits, if they're not already
+ * defined.
+ */
+
+#ifndef S_ISREG
+#   ifdef S_IFREG
+#       define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+#   else
+#       define S_ISREG(m) 0
+#   endif
+# endif
+#ifndef S_ISDIR
+#   ifdef S_IFDIR
+#       define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+#   else
+#       define S_ISDIR(m) 0
+#   endif
+# endif
+#ifndef S_ISCHR
+#   ifdef S_IFCHR
+#       define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
+#   else
+#       define S_ISCHR(m) 0
+#   endif
+# endif
+#ifndef S_ISBLK
+#   ifdef S_IFBLK
+#       define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
+#   else
+#       define S_ISBLK(m) 0
+#   endif
+# endif
+#ifndef S_ISFIFO
+#   ifdef S_IFIFO
+#       define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
+#   else
+#       define S_ISFIFO(m) 0
+#   endif
+# endif
+#ifndef S_ISLNK
+#   ifdef S_IFLNK
+#       define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
+#   else
+#       define S_ISLNK(m) 0
+#   endif
+# endif
+#ifndef S_ISSOCK
+#   ifdef S_IFSOCK
+#       define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
+#   else
+#       define S_ISSOCK(m) 0
+#   endif
+# endif
+
+/*
+ * Make sure that MAXPATHLEN is defined.
+ */
+
+#ifndef MAXPATHLEN
+#   ifdef PATH_MAX
+#       define MAXPATHLEN PATH_MAX
+#   else
+#       define MAXPATHLEN 2048
+#   endif
+#endif
+
+/*
+ * Define pid_t and uid_t if they're not already defined.
+ */
+
+#if ! TCL_PID_T
+#   define pid_t int
+#endif
+#if ! TCL_UID_T
+#   define uid_t int
+#endif
+
+/*
+ * Variables provided by the C library:
+ */
+
+extern char **environ;
+
+/*
+ * Library procedures used by Tcl but not declared in a header file:
+ */
+
+#if 0
+#ifndef _CRAY
+extern int     access     _ANSI_ARGS_((CONST char *path, int mode));
+extern int     chdir      _ANSI_ARGS_((CONST char *path));
+extern int     close      _ANSI_ARGS_((int fd));
+extern int     dup2       _ANSI_ARGS_((int src, int dst));
+extern int     execvp     _ANSI_ARGS_((CONST char *name, char **argv));
+extern void    _exit      _ANSI_ARGS_((int status));
+extern pid_t   fork       _ANSI_ARGS_((void));
+extern uid_t   geteuid    _ANSI_ARGS_((void));
+extern pid_t   getpid     _ANSI_ARGS_((void));
+extern char *  getcwd     _ANSI_ARGS_((char *buffer, int size));
+extern char *  getwd      _ANSI_ARGS_((char *buffer));
+extern int     kill       _ANSI_ARGS_((pid_t pid, int sig));
+extern long    lseek      _ANSI_ARGS_((int fd, int offset, int whence));
+extern char *  mktemp     _ANSI_ARGS_((char *template));
+extern int     open       _ANSI_ARGS_((CONST char *path, int flags, ...));
+extern int     pipe       _ANSI_ARGS_((int *fdPtr));
+extern int     read       _ANSI_ARGS_((int fd, char *buf, int numBytes));
+extern int     readlink   _ANSI_ARGS_((CONST char *path, char *buf, int size));
+extern int     unlink     _ANSI_ARGS_((CONST char *path));
+extern int     write      _ANSI_ARGS_((int fd, char *buf, int numBytes));
+#endif /* _CRAY */
+#endif
+
+#endif /* _TCLUNIX */
diff --git a/src/tcl/tclunxaz.c b/src/tcl/tclunxaz.c
new file mode 100644 (file)
index 0000000..afa959c
--- /dev/null
@@ -0,0 +1,1709 @@
+/* 
+ * tclUnixAZ.c --
+ *
+ *     This file contains the top-level command procedures for
+ *     commands in the Tcl core that require UNIX facilities
+ *     such as files and process execution.  Much of the code
+ *     in this file is based on earlier versions contributed
+ *     by Karl Lehenbauer, Mark Diekhans and Peter da Silva.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclUnixAZ.c,v 1.36 92/04/16 13:32:02 ouster Exp $ sprite (Berkeley)";
+#endif /* not lint */
+
+#include "tclint.h"
+#include "tclunix.h"
+
+/*
+ * The variable below caches the name of the current working directory
+ * in order to avoid repeated calls to getwd.  The string is malloc-ed.
+ * NULL means the cache needs to be refreshed.
+ */
+
+static char *currentDir =  NULL;
+
+/*
+ * Prototypes for local procedures defined in this file:
+ */
+
+static int             CleanupChildren _ANSI_ARGS_((Tcl_Interp *interp,
+                           int numPids, int *pidPtr, int errorId));
+static char *          GetFileType _ANSI_ARGS_((int mode));
+static int             StoreStatData _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *varName, struct stat *statPtr));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_CdCmd --
+ *
+ *     This procedure is invoked to process the "cd" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_CdCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    char *dirName;
+
+    if (argc > 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " dirName\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if (argc == 2) {
+       dirName = argv[1];
+    } else {
+       dirName = "~";
+    }
+    dirName = Tcl_TildeSubst(interp, dirName);
+    if (dirName == NULL) {
+       return TCL_ERROR;
+    }
+    if (currentDir != NULL) {
+       ckfree(currentDir);
+       currentDir = NULL;
+    }
+    if (chdir(dirName) != 0) {
+       Tcl_AppendResult(interp, "couldn't change working directory to \"",
+               dirName, "\": ", Tcl_UnixError(interp), (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_CloseCmd --
+ *
+ *     This procedure is invoked to process the "close" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_CloseCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    OpenFile *filePtr;
+    int result = TCL_OK;
+
+    if (argc != 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " fileId\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (TclGetOpenFile(interp, argv[1], &filePtr) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    ((Interp *) interp)->filePtrArray[fileno(filePtr->f)] = NULL;
+
+    /*
+     * First close the file (in the case of a process pipeline, there may
+     * be two files, one for the pipe at each end of the pipeline).
+     */
+
+    if (filePtr->f2 != NULL) {
+       if (fclose(filePtr->f2) == EOF) {
+           Tcl_AppendResult(interp, "error closing \"", argv[1],
+                   "\": ", Tcl_UnixError(interp), "\n", (char *) NULL);
+           result = TCL_ERROR;
+       }
+    }
+    if (fclose(filePtr->f) == EOF) {
+       Tcl_AppendResult(interp, "error closing \"", argv[1],
+               "\": ", Tcl_UnixError(interp), "\n", (char *) NULL);
+       result = TCL_ERROR;
+    }
+
+    /*
+     * If the file was a connection to a pipeline, clean up everything
+     * associated with the child processes.
+     */
+
+    if (filePtr->numPids > 0) {
+       if (CleanupChildren(interp, filePtr->numPids, filePtr->pidPtr,
+               filePtr->errorId) != TCL_OK) {
+           result = TCL_ERROR;
+       }
+    }
+
+    ckfree((char *) filePtr);
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_EofCmd --
+ *
+ *     This procedure is invoked to process the "eof" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_EofCmd(notUsed, interp, argc, argv)
+    ClientData notUsed;                        /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    OpenFile *filePtr;
+
+    if (argc != 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " fileId\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (TclGetOpenFile(interp, argv[1], &filePtr) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    if (feof(filePtr->f)) {
+       interp->result = "1";
+    } else {
+       interp->result = "0";
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ExecCmd --
+ *
+ *     This procedure is invoked to process the "exec" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_ExecCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int outputId;                      /* File id for output pipe.  -1
+                                        * means command overrode. */
+    int errorId;                       /* File id for temporary file
+                                        * containing error output. */
+    int *pidPtr;
+    int numPids, result;
+
+    /*
+     * See if the command is to be run in background;  if so, create
+     * the command, detach it, and return.
+     */
+
+    if ((argv[argc-1][0] == '&') && (argv[argc-1][1] == 0)) {
+       argc--;
+       argv[argc] = NULL;
+       numPids = Tcl_CreatePipeline(interp, argc-1, argv+1, &pidPtr,
+               (int *) NULL, (int *) NULL, (int *) NULL);
+       if (numPids < 0) {
+           return TCL_ERROR;
+       }
+       Tcl_DetachPids(numPids, pidPtr);
+       ckfree((char *) pidPtr);
+       return TCL_OK;
+    }
+
+    /*
+     * Create the command's pipeline.
+     */
+
+    numPids = Tcl_CreatePipeline(interp, argc-1, argv+1, &pidPtr,
+           (int *) NULL, &outputId, &errorId);
+    if (numPids < 0) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * Read the child's output (if any) and put it into the result.
+     */
+
+    result = TCL_OK;
+    if (outputId != -1) {
+       while (1) {
+#          define BUFFER_SIZE 1000
+           char buffer[BUFFER_SIZE+1];
+           int count;
+    
+           count = read(outputId, buffer, BUFFER_SIZE);
+    
+           if (count == 0) {
+               break;
+           }
+           if (count < 0) {
+               Tcl_ResetResult(interp);
+               Tcl_AppendResult(interp,
+                       "error reading from output pipe: ",
+                       Tcl_UnixError(interp), (char *) NULL);
+               result = TCL_ERROR;
+               break;
+           }
+           buffer[count] = 0;
+           Tcl_AppendResult(interp, buffer, (char *) NULL);
+       }
+       close(outputId);
+    }
+
+    if (CleanupChildren(interp, numPids, pidPtr, errorId) != TCL_OK) {
+       result = TCL_ERROR;
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ExitCmd --
+ *
+ *     This procedure is invoked to process the "exit" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_ExitCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int value;
+
+    if ((argc != 1) && (argc != 2)) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " ?returnCode?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (argc == 1) {
+       exit(0);
+    }
+    if (Tcl_GetInt(interp, argv[1], &value) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    exit(value);
+#if 0
+    return TCL_OK;                     /* Better not ever reach this! */
+#endif
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_FileCmd --
+ *
+ *     This procedure is invoked to process the "file" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_FileCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    char *p;
+    int length, statOp;
+    int mode = 0;                      /* Initialized only to prevent
+                                        * compiler warning message. */
+    struct stat statBuf;
+    char *fileName, c;
+
+    if (argc < 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " option name ?arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    c = argv[1][0];
+    length = strlen(argv[1]);
+
+    /*
+     * First handle operations on the file name.
+     */
+
+    fileName = Tcl_TildeSubst(interp, argv[2]);
+    if (fileName == NULL) {
+       return TCL_ERROR;
+    }
+    if ((c == 'd') && (strncmp(argv[1], "dirname", length) == 0)) {
+       if (argc != 3) {
+           argv[1] = "dirname";
+           not3Args:
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " ", argv[1], " name\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+#ifdef MSDOS
+       p = strrchr(fileName, '\\');
+#else
+       p = strrchr(fileName, '/');
+#endif
+       if (p == NULL) {
+           interp->result = ".";
+       } else if (p == fileName) {
+#ifdef MSDOS
+           interp->result = "\\";
+#else
+           interp->result = "/";
+#endif
+       } else {
+           *p = 0;
+           Tcl_SetResult(interp, fileName, TCL_VOLATILE);
+           *p = '/';
+       }
+       return TCL_OK;
+    } else if ((c == 'r') && (strncmp(argv[1], "rootname", length) == 0)
+           && (length >= 2)) {
+       char *lastSlash;
+
+       if (argc != 3) {
+           argv[1] = "rootname";
+           goto not3Args;
+       }
+       p = strrchr(fileName, '.');
+#ifdef MSDOS
+       lastSlash = strrchr(fileName, '\\');
+#else
+       lastSlash = strrchr(fileName, '/');
+#endif
+       if ((p == NULL) || ((lastSlash != NULL) && (lastSlash > p))) {
+           Tcl_SetResult(interp, fileName, TCL_VOLATILE);
+       } else {
+           *p = 0;
+           Tcl_SetResult(interp, fileName, TCL_VOLATILE);
+           *p = '.';
+       }
+       return TCL_OK;
+    } else if ((c == 'e') && (strncmp(argv[1], "extension", length) == 0)
+           && (length >= 3)) {
+       char *lastSlash;
+
+       if (argc != 3) {
+           argv[1] = "extension";
+           goto not3Args;
+       }
+       p = strrchr(fileName, '.');
+#ifdef MSDOS
+       lastSlash = strrchr(fileName, '\\');
+#else
+       lastSlash = strrchr(fileName, '/');
+#endif
+       if ((p != NULL) && ((lastSlash == NULL) || (lastSlash < p))) {
+           Tcl_SetResult(interp, p, TCL_VOLATILE);
+       }
+       return TCL_OK;
+    } else if ((c == 't') && (strncmp(argv[1], "tail", length) == 0)
+           && (length >= 2)) {
+       if (argc != 3) {
+           argv[1] = "tail";
+           goto not3Args;
+       }
+#ifdef MSDOS
+       p = strrchr(fileName, '\\');
+#else
+       p = strrchr(fileName, '/');
+#endif
+       if (p != NULL) {
+           Tcl_SetResult(interp, p+1, TCL_VOLATILE);
+       } else {
+           Tcl_SetResult(interp, fileName, TCL_VOLATILE);
+       }
+       return TCL_OK;
+    }
+
+    /*
+     * Next, handle operations that can be satisfied with the "access"
+     * kernel call.
+     */
+
+    if (fileName == NULL) {
+       return TCL_ERROR;
+    }
+    if ((c == 'r') && (strncmp(argv[1], "readable", length) == 0)
+           && (length >= 5)) {
+       if (argc != 3) {
+           argv[1] = "readable";
+           goto not3Args;
+       }
+       mode = R_OK;
+       checkAccess:
+       if (access(fileName, mode) == -1) {
+           interp->result = "0";
+       } else {
+           interp->result = "1";
+       }
+       return TCL_OK;
+    } else if ((c == 'w') && (strncmp(argv[1], "writable", length) == 0)) {
+       if (argc != 3) {
+           argv[1] = "writable";
+           goto not3Args;
+       }
+       mode = W_OK;
+       goto checkAccess;
+    } else if ((c == 'e') && (strncmp(argv[1], "executable", length) == 0)
+           && (length >= 3)) {
+       if (argc != 3) {
+           argv[1] = "executable";
+           goto not3Args;
+       }
+       mode = X_OK;
+       goto checkAccess;
+    } else if ((c == 'e') && (strncmp(argv[1], "exists", length) == 0)
+           && (length >= 3)) {
+       if (argc != 3) {
+           argv[1] = "exists";
+           goto not3Args;
+       }
+       mode = F_OK;
+       goto checkAccess;
+    }
+
+    /*
+     * Lastly, check stuff that requires the file to be stat-ed.
+     */
+
+    if ((c == 'a') && (strncmp(argv[1], "atime", length) == 0)) {
+       if (argc != 3) {
+           argv[1] = "atime";
+           goto not3Args;
+       }
+       if (stat(fileName, &statBuf) == -1) {
+           goto badStat;
+       }
+       sprintf(interp->result, "%ld", statBuf.st_atime);
+       return TCL_OK;
+    } else if ((c == 'i') && (strncmp(argv[1], "isdirectory", length) == 0)
+           && (length >= 3)) {
+       if (argc != 3) {
+           argv[1] = "isdirectory";
+           goto not3Args;
+       }
+       statOp = 2;
+    } else if ((c == 'i') && (strncmp(argv[1], "isfile", length) == 0)
+           && (length >= 3)) {
+       if (argc != 3) {
+           argv[1] = "isfile";
+           goto not3Args;
+       }
+       statOp = 1;
+    } else if ((c == 'l') && (strncmp(argv[1], "lstat", length) == 0)) {
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " lstat name varName\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+
+       if (lstat(fileName, &statBuf) == -1) {
+           Tcl_AppendResult(interp, "couldn't lstat \"", argv[2],
+                   "\": ", Tcl_UnixError(interp), (char *) NULL);
+           return TCL_ERROR;
+       }
+       return StoreStatData(interp, argv[3], &statBuf);
+    } else if ((c == 'm') && (strncmp(argv[1], "mtime", length) == 0)) {
+       if (argc != 3) {
+           argv[1] = "mtime";
+           goto not3Args;
+       }
+       if (stat(fileName, &statBuf) == -1) {
+           goto badStat;
+       }
+       sprintf(interp->result, "%ld", statBuf.st_mtime);
+       return TCL_OK;
+    } else if ((c == 'o') && (strncmp(argv[1], "owned", length) == 0)) {
+       if (argc != 3) {
+           argv[1] = "owned";
+           goto not3Args;
+       }
+       statOp = 0;
+#ifdef S_IFLNK
+    /*
+     * This option is only included if symbolic links exist on this system
+     * (in which case S_IFLNK should be defined).
+     */
+    } else if ((c == 'r') && (strncmp(argv[1], "readlink", length) == 0)
+           && (length >= 5)) {
+       char linkValue[MAXPATHLEN+1];
+       int linkLength;
+
+       if (argc != 3) {
+           argv[1] = "readlink";
+           goto not3Args;
+       }
+       linkLength = readlink(fileName, linkValue, sizeof(linkValue) - 1);
+       if (linkLength == -1) {
+           Tcl_AppendResult(interp, "couldn't readlink \"", argv[2],
+                   "\": ", Tcl_UnixError(interp), (char *) NULL);
+           return TCL_ERROR;
+       }
+       linkValue[linkLength] = 0;
+       Tcl_SetResult(interp, linkValue, TCL_VOLATILE);
+       return TCL_OK;
+#endif
+    } else if ((c == 's') && (strncmp(argv[1], "size", length) == 0)
+           && (length >= 2)) {
+       if (argc != 3) {
+           argv[1] = "size";
+           goto not3Args;
+       }
+       if (stat(fileName, &statBuf) == -1) {
+           goto badStat;
+       }
+       sprintf(interp->result, "%ld", statBuf.st_size);
+       return TCL_OK;
+    } else if ((c == 's') && (strncmp(argv[1], "stat", length) == 0)
+           && (length >= 2)) {
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                   " stat name varName\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+
+       if (stat(fileName, &statBuf) == -1) {
+           badStat:
+           Tcl_AppendResult(interp, "couldn't stat \"", argv[2],
+                   "\": ", Tcl_UnixError(interp), (char *) NULL);
+           return TCL_ERROR;
+       }
+       return StoreStatData(interp, argv[3], &statBuf);
+    } else if ((c == 't') && (strncmp(argv[1], "type", length) == 0)
+           && (length >= 2)) {
+       if (argc != 3) {
+           argv[1] = "type";
+           goto not3Args;
+       }
+       if (lstat(fileName, &statBuf) == -1) {
+           goto badStat;
+       }
+       interp->result = GetFileType((int) statBuf.st_mode);
+       return TCL_OK;
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\": should be atime, dirname, executable, exists, ",
+               "extension, isdirectory, isfile, lstat, mtime, owned, ",
+               "readable, ",
+#ifdef S_IFLNK
+               "readlink, ",
+#endif
+               "root, size, stat, tail, type, ",
+               "or writable",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (stat(fileName, &statBuf) == -1) {
+       interp->result = "0";
+       return TCL_OK;
+    }
+    switch (statOp) {
+       case 0:
+           mode = (geteuid() == statBuf.st_uid);
+           break;
+       case 1:
+           mode = S_ISREG(statBuf.st_mode);
+           break;
+       case 2:
+           mode = S_ISDIR(statBuf.st_mode);
+           break;
+    }
+    if (mode) {
+       interp->result = "1";
+    } else {
+       interp->result = "0";
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * StoreStatData --
+ *
+ *     This is a utility procedure that breaks out the fields of a
+ *     "stat" structure and stores them in textual form into the
+ *     elements of an associative array.
+ *
+ * Results:
+ *     Returns a standard Tcl return value.  If an error occurs then
+ *     a message is left in interp->result.
+ *
+ * Side effects:
+ *     Elements of the associative array given by "varName" are modified.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+StoreStatData(interp, varName, statPtr)
+    Tcl_Interp *interp;                        /* Interpreter for error reports. */
+    char *varName;                     /* Name of associative array variable
+                                        * in which to store stat results. */
+    struct stat *statPtr;              /* Pointer to buffer containing
+                                        * stat data to store in varName. */
+{
+    char string[30];
+
+    sprintf(string, "%d", statPtr->st_dev);
+    if (Tcl_SetVar2(interp, varName, "dev", string, TCL_LEAVE_ERR_MSG)
+           == NULL) {
+       return TCL_ERROR;
+    }
+    sprintf(string, "%d", statPtr->st_ino);
+    if (Tcl_SetVar2(interp, varName, "ino", string, TCL_LEAVE_ERR_MSG)
+           == NULL) {
+       return TCL_ERROR;
+    }
+    sprintf(string, "%d", statPtr->st_mode);
+    if (Tcl_SetVar2(interp, varName, "mode", string, TCL_LEAVE_ERR_MSG)
+           == NULL) {
+       return TCL_ERROR;
+    }
+    sprintf(string, "%d", statPtr->st_nlink);
+    if (Tcl_SetVar2(interp, varName, "nlink", string, TCL_LEAVE_ERR_MSG)
+           == NULL) {
+       return TCL_ERROR;
+    }
+    sprintf(string, "%d", statPtr->st_uid);
+    if (Tcl_SetVar2(interp, varName, "uid", string, TCL_LEAVE_ERR_MSG)
+           == NULL) {
+       return TCL_ERROR;
+    }
+    sprintf(string, "%d", statPtr->st_gid);
+    if (Tcl_SetVar2(interp, varName, "gid", string, TCL_LEAVE_ERR_MSG)
+           == NULL) {
+       return TCL_ERROR;
+    }
+    sprintf(string, "%ld", statPtr->st_size);
+    if (Tcl_SetVar2(interp, varName, "size", string, TCL_LEAVE_ERR_MSG)
+           == NULL) {
+       return TCL_ERROR;
+    }
+    sprintf(string, "%ld", statPtr->st_atime);
+    if (Tcl_SetVar2(interp, varName, "atime", string, TCL_LEAVE_ERR_MSG)
+           == NULL) {
+       return TCL_ERROR;
+    }
+    sprintf(string, "%ld", statPtr->st_mtime);
+    if (Tcl_SetVar2(interp, varName, "mtime", string, TCL_LEAVE_ERR_MSG)
+           == NULL) {
+       return TCL_ERROR;
+    }
+    sprintf(string, "%ld", statPtr->st_ctime);
+    if (Tcl_SetVar2(interp, varName, "ctime", string, TCL_LEAVE_ERR_MSG)
+           == NULL) {
+       return TCL_ERROR;
+    }
+    if (Tcl_SetVar2(interp, varName, "type",
+           GetFileType((int) statPtr->st_mode), TCL_LEAVE_ERR_MSG) == NULL) {
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * GetFileType --
+ *
+ *     Given a mode word, returns a string identifying the type of a
+ *     file.
+ *
+ * Results:
+ *     A static text string giving the file type from mode.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static char *
+GetFileType(mode)
+    int mode;
+{
+    if (S_ISREG(mode)) {
+       return "file";
+    } else if (S_ISDIR(mode)) {
+       return "directory";
+    } else if (S_ISCHR(mode)) {
+       return "characterSpecial";
+    } else if (S_ISBLK(mode)) {
+       return "blockSpecial";
+    } else if (S_ISFIFO(mode)) {
+       return "fifo";
+    } else if (S_ISLNK(mode)) {
+       return "link";
+    } else if (S_ISSOCK(mode)) {
+       return "socket";
+    }
+    return "unknown";
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_FlushCmd --
+ *
+ *     This procedure is invoked to process the "flush" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_FlushCmd(notUsed, interp, argc, argv)
+    ClientData notUsed;                        /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    OpenFile *filePtr;
+    FILE *f;
+
+    if (argc != 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " fileId\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (TclGetOpenFile(interp, argv[1], &filePtr) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    if (!filePtr->writable) {
+       Tcl_AppendResult(interp, "\"", argv[1],
+               "\" wasn't opened for writing", (char *) NULL);
+       return TCL_ERROR;
+    }
+    f = filePtr->f2;
+    if (f == NULL) {
+       f = filePtr->f;
+    }
+    if (fflush(f) == EOF) {
+       Tcl_AppendResult(interp, "error flushing \"", argv[1],
+               "\": ", Tcl_UnixError(interp), (char *) NULL);
+       clearerr(f);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_GetsCmd --
+ *
+ *     This procedure is invoked to process the "gets" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_GetsCmd(notUsed, interp, argc, argv)
+    ClientData notUsed;                        /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+#   define BUF_SIZE 200
+    char buffer[BUF_SIZE+1];
+    int totalCount, done, flags;
+    OpenFile *filePtr;
+    register FILE *f;
+
+    if ((argc != 2) && (argc != 3)) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " fileId ?varName?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (TclGetOpenFile(interp, argv[1], &filePtr) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    if (!filePtr->readable) {
+       Tcl_AppendResult(interp, "\"", argv[1],
+               "\" wasn't opened for reading", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * We can't predict how large a line will be, so read it in
+     * pieces, appending to the current result or to a variable.
+     */
+
+    totalCount = 0;
+    done = 0;
+    flags = 0;
+    f = filePtr->f;
+    while (!done) {
+       register int c, count;
+       register char *p;
+
+       for (p = buffer, count = 0; count < BUF_SIZE-1; count++, p++) {
+           c = getc(f);
+           if (c == EOF) {
+               if (ferror(filePtr->f)) {
+                   Tcl_ResetResult(interp);
+                   Tcl_AppendResult(interp, "error reading \"", argv[1],
+                           "\": ", Tcl_UnixError(interp), (char *) NULL);
+                   clearerr(filePtr->f);
+                   return TCL_ERROR;
+               } else if (feof(filePtr->f)) {
+                   if ((totalCount == 0) && (count == 0)) {
+                       totalCount = -1;
+                   }
+                   done = 1;
+                   break;
+               }
+           }
+           if (c == '\n') {
+               done = 1;
+               break;
+           }
+           *p = c;
+       }
+       *p = 0;
+       if (argc == 2) {
+           Tcl_AppendResult(interp, buffer, (char *) NULL);
+       } else {
+           if (Tcl_SetVar(interp, argv[2], buffer, flags|TCL_LEAVE_ERR_MSG)
+                   == NULL) {
+               return TCL_ERROR;
+           }
+           flags = TCL_APPEND_VALUE;
+       }
+       totalCount += count;
+    }
+
+    if (argc == 3) {
+       sprintf(interp->result, "%d", totalCount);
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_OpenCmd --
+ *
+ *     This procedure is invoked to process the "open" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_OpenCmd(notUsed, interp, argc, argv)
+    ClientData notUsed;                        /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    Interp *iPtr = (Interp *) interp;
+    int pipeline, fd;
+    char *access;
+    register OpenFile *filePtr;
+
+    if (argc == 2) {
+       access = "r";
+    } else if (argc == 3) {
+       access = argv[2];
+    } else {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " filename ?access?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    filePtr = (OpenFile *) ckalloc(sizeof(OpenFile));
+    filePtr->f = NULL;
+    filePtr->f2 = NULL;
+    filePtr->readable = 0;
+    filePtr->writable = 0;
+    filePtr->numPids = 0;
+    filePtr->pidPtr = NULL;
+    filePtr->errorId = -1;
+
+    /*
+     * Verify the requested form of access.
+     */
+
+    pipeline = 0;
+    if (argv[1][0] == '|') {
+       pipeline = 1;
+    }
+    switch (access[0]) {
+       case 'r':
+           filePtr->readable = 1;
+           break;
+       case 'w':
+           filePtr->writable = 1;
+           break;
+       case 'a':
+           filePtr->writable = 1;
+           break;
+       default:
+           badAccess:
+           Tcl_AppendResult(interp, "illegal access mode \"", access,
+                   "\"", (char *) NULL);
+           goto error;
+    }
+    if (access[1] == '+') {
+       filePtr->readable = filePtr->writable = 1;
+       if (access[2] != 0) {
+           goto badAccess;
+       }
+    } else if (access[1] != 0) {
+       goto badAccess;
+    }
+
+    /*
+     * Open the file or create a process pipeline.
+     */
+
+    if (!pipeline) {
+       char *fileName = argv[1];
+
+       if (fileName[0] == '~') {
+           fileName = Tcl_TildeSubst(interp, fileName);
+           if (fileName == NULL) {
+               goto error;
+           }
+       }
+       filePtr->f = fopen(fileName, access);
+       if (filePtr->f == NULL) {
+           Tcl_AppendResult(interp, "couldn't open \"", argv[1],
+                   "\": ", Tcl_UnixError(interp), (char *) NULL);
+           goto error;
+       }
+    } else {
+       int *inPipePtr, *outPipePtr;
+       int cmdArgc, inPipe, outPipe;
+       char **cmdArgv;
+
+       if (Tcl_SplitList(interp, argv[1]+1, &cmdArgc, &cmdArgv) != TCL_OK) {
+           goto error;
+       }
+       inPipePtr = (filePtr->writable) ? &inPipe : NULL;
+       outPipePtr = (filePtr->readable) ? &outPipe : NULL;
+       inPipe = outPipe = -1;
+       filePtr->numPids = Tcl_CreatePipeline(interp, cmdArgc, cmdArgv,
+               &filePtr->pidPtr, inPipePtr, outPipePtr, &filePtr->errorId);
+       ckfree((char *) cmdArgv);
+       if (filePtr->numPids < 0) {
+           goto error;
+       }
+       if (filePtr->readable) {
+           if (outPipe == -1) {
+               if (inPipe != -1) {
+                   close(inPipe);
+               }
+               Tcl_AppendResult(interp, "can't read output from command:",
+                       " standard output was redirected", (char *) NULL);
+               goto error;
+           }
+           filePtr->f = fdopen(outPipe, "r");
+       }
+       if (filePtr->writable) {
+           if (inPipe == -1) {
+               Tcl_AppendResult(interp, "can't write input to command:",
+                       " standard input was redirected", (char *) NULL);
+               goto error;
+           }
+           if (filePtr->f != NULL) {
+               filePtr->f2 = fdopen(inPipe, "w");
+           } else {
+               filePtr->f = fdopen(inPipe, "w");
+           }
+       }
+    }
+
+    /*
+     * Enter this new OpenFile structure in the table for the
+     * interpreter.  May have to expand the table to do this.
+     */
+
+    fd = fileno(filePtr->f);
+    TclMakeFileTable(iPtr, fd);
+    if (iPtr->filePtrArray[fd] != NULL) {
+       panic("Tcl_OpenCmd found file already open");
+    }
+    iPtr->filePtrArray[fd] = filePtr;
+    sprintf(interp->result, "file%d", fd);
+    return TCL_OK;
+
+    error:
+    if (filePtr->f != NULL) {
+       fclose(filePtr->f);
+    }
+    if (filePtr->f2 != NULL) {
+       fclose(filePtr->f2);
+    }
+    if (filePtr->numPids > 0) {
+       Tcl_DetachPids(filePtr->numPids, filePtr->pidPtr);
+       ckfree((char *) filePtr->pidPtr);
+    }
+    if (filePtr->errorId != -1) {
+       close(filePtr->errorId);
+    }
+    ckfree((char *) filePtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_PwdCmd --
+ *
+ *     This procedure is invoked to process the "pwd" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_PwdCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    char buffer[MAXPATHLEN+1];
+
+    if (argc != 1) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (currentDir == NULL) {
+#if TCL_GETWD
+       if (getwd(buffer) == NULL) {
+           Tcl_AppendResult(interp, "error getting working directory name: ",
+                   buffer, (char *) NULL);
+           return TCL_ERROR;
+       }
+#else
+       if (getcwd(buffer, MAXPATHLEN) == 0) {
+           if (errno == ERANGE) {
+               interp->result = "working directory name is too long";
+           } else {
+               Tcl_AppendResult(interp,
+                       "error getting working directory name: ",
+                       Tcl_UnixError(interp), (char *) NULL);
+           }
+           return TCL_ERROR;
+       }
+#endif
+       currentDir = (char *) ckalloc((unsigned) (strlen(buffer) + 1));
+       strcpy(currentDir, buffer);
+    }
+    interp->result = currentDir;
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_PutsCmd --
+ *
+ *     This procedure is invoked to process the "puts" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_PutsCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    OpenFile *filePtr;
+    FILE *f;
+
+    if (argc == 4) {
+       if (strncmp(argv[3], "nonewline", strlen(argv[3])) != 0) {
+           Tcl_AppendResult(interp, "bad argument \"", argv[3],
+                   "\": should be \"nonewline\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+    } else if (argc != 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " fileId string ?nonewline?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (TclGetOpenFile(interp, argv[1], &filePtr) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    if (!filePtr->writable) {
+       Tcl_AppendResult(interp, "\"", argv[1],
+               "\" wasn't opened for writing", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    f = filePtr->f2;
+    if (f == NULL) {
+       f = filePtr->f;
+    }
+    fputs(argv[2], f);
+    if (argc == 3) {
+       fputc('\n', f);
+    }
+    if (ferror(f)) {
+       Tcl_AppendResult(interp, "error writing \"", argv[1],
+               "\": ", Tcl_UnixError(interp), (char *) NULL);
+       clearerr(f);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ReadCmd --
+ *
+ *     This procedure is invoked to process the "read" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_ReadCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    OpenFile *filePtr;
+    int bytesLeft, bytesRead, count;
+#define READ_BUF_SIZE 4096
+    char buffer[READ_BUF_SIZE+1];
+    int newline;
+
+    if ((argc != 2) && (argc != 3)) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " fileId ?numBytes|nonewline?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (TclGetOpenFile(interp, argv[1], &filePtr) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    if (!filePtr->readable) {
+       Tcl_AppendResult(interp, "\"", argv[1],
+               "\" wasn't opened for reading", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Compute how many bytes to read, and see whether the final
+     * newline should be dropped.
+     */
+
+    newline = 1;
+    if ((argc > 2) && isdigit(argv[2][0])) {
+       if (Tcl_GetInt(interp, argv[2], &bytesLeft) != TCL_OK) {
+           return TCL_ERROR;
+       }
+    } else {
+       bytesLeft = 1<<30;
+       if (argc > 2) {
+           if (strncmp(argv[2], "nonewline", strlen(argv[2])) == 0) {
+               newline = 0;
+           } else {
+               Tcl_AppendResult(interp, "bad argument \"", argv[2],
+                       "\": should be \"nonewline\"", (char *) NULL);
+               return TCL_ERROR;
+           }
+       }
+    }
+
+    /*
+     * Read the file in one or more chunks.
+     */
+
+    bytesRead = 0;
+    while (bytesLeft > 0) {
+       count = READ_BUF_SIZE;
+       if (bytesLeft < READ_BUF_SIZE) {
+           count = bytesLeft;
+       }
+       count = fread(buffer, 1, count, filePtr->f);
+       if (ferror(filePtr->f)) {
+           Tcl_ResetResult(interp);
+           Tcl_AppendResult(interp, "error reading \"", argv[1],
+                   "\": ", Tcl_UnixError(interp), (char *) NULL);
+           clearerr(filePtr->f);
+           return TCL_ERROR;
+       }
+       if (count == 0) {
+           break;
+       }
+       buffer[count] = 0;
+       Tcl_AppendResult(interp, buffer, (char *) NULL);
+       bytesLeft -= count;
+       bytesRead += count;
+    }
+    if ((newline == 0) && (interp->result[bytesRead-1] == '\n')) {
+       interp->result[bytesRead-1] = 0;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_SeekCmd --
+ *
+ *     This procedure is invoked to process the "seek" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_SeekCmd(notUsed, interp, argc, argv)
+    ClientData notUsed;                        /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    OpenFile *filePtr;
+    int offset, mode;
+
+    if ((argc != 3) && (argc != 4)) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " fileId offset ?origin?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (TclGetOpenFile(interp, argv[1], &filePtr) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    if (Tcl_GetInt(interp, argv[2], &offset) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    mode = SEEK_SET;
+    if (argc == 4) {
+       int length;
+       char c;
+
+       length = strlen(argv[3]);
+       c = argv[3][0];
+       if ((c == 's') && (strncmp(argv[3], "start", length) == 0)) {
+           mode = SEEK_SET;
+       } else if ((c == 'c') && (strncmp(argv[3], "current", length) == 0)) {
+           mode = SEEK_CUR;
+       } else if ((c == 'e') && (strncmp(argv[3], "end", length) == 0)) {
+           mode = SEEK_END;
+       } else {
+           Tcl_AppendResult(interp, "bad origin \"", argv[3],
+                   "\": should be start, current, or end", (char *) NULL);
+           return TCL_ERROR;
+       }
+    }
+    if (fseek(filePtr->f, offset, mode) == -1) {
+       Tcl_AppendResult(interp, "error during seek: ",
+               Tcl_UnixError(interp), (char *) NULL);
+       clearerr(filePtr->f);
+       return TCL_ERROR;
+    }
+
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_SourceCmd --
+ *
+ *     This procedure is invoked to process the "source" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_SourceCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    if (argc != 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " fileName\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    return Tcl_EvalFile(interp, argv[1]);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_TellCmd --
+ *
+ *     This procedure is invoked to process the "tell" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_TellCmd(notUsed, interp, argc, argv)
+    ClientData notUsed;                        /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    OpenFile *filePtr;
+
+    if (argc != 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " fileId\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (TclGetOpenFile(interp, argv[1], &filePtr) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    sprintf(interp->result, "%d", ftell(filePtr->f));
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_TimeCmd --
+ *
+ *     This procedure is invoked to process the "time" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_TimeCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int count, i, result;
+    double timePer;
+#if TCL_GETTOD
+    struct timeval start, stop;
+    struct timezone tz;
+    int micros;
+#else
+    struct tms dummy2;
+    long start, stop;
+#endif
+
+    if (argc == 2) {
+       count = 1;
+    } else if (argc == 3) {
+       if (Tcl_GetInt(interp, argv[2], &count) != TCL_OK) {
+           return TCL_ERROR;
+       }
+    } else {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " command ?count?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+#if TCL_GETTOD
+    gettimeofday(&start, &tz);
+#else
+    start = times(&dummy2);
+#endif
+    for (i = count ; i > 0; i--) {
+       result = Tcl_Eval(interp, argv[1], 0, (char **) NULL);
+       if (result != TCL_OK) {
+           if (result == TCL_ERROR) {
+               char msg[60];
+               sprintf(msg, "\n    (\"time\" body line %d)",
+                       interp->errorLine);
+               Tcl_AddErrorInfo(interp, msg);
+           }
+           return result;
+       }
+    }
+#if TCL_GETTOD
+    gettimeofday(&stop, &tz);
+    micros = (stop.tv_sec - start.tv_sec)*1000000
+           + (stop.tv_usec - start.tv_usec);
+    timePer = micros;
+#else
+    stop = times(&dummy2);
+    timePer = (((double) (stop - start))*1000000.0)/CLK_TCK;
+#endif
+    Tcl_ResetResult(interp);
+    sprintf(interp->result, "%.0f microseconds per iteration", timePer/count);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * CleanupChildren --
+ *
+ *     This is a utility procedure used to wait for child processes
+ *     to exit, record information about abnormal exits, and then
+ *     collect any stderr output generated by them.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If anything at
+ *     weird happened with the child processes, TCL_ERROR is returned
+ *     and a message is left in interp->result.
+ *
+ * Side effects:
+ *     If the last character of interp->result is a newline, then it
+ *     is removed.  File errorId gets closed, and pidPtr is freed
+ *     back to the storage allocator.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+CleanupChildren(interp, numPids, pidPtr, errorId)
+    Tcl_Interp *interp;                /* Used for error messages. */
+    int numPids;               /* Number of entries in pidPtr array. */
+    int *pidPtr;               /* Array of process ids of children. */
+    int errorId;               /* File descriptor index for file containing
+                                * stderr output from pipeline.  -1 means
+                                * there isn't any stderr output. */
+{
+    int result = TCL_OK;
+    int i, pid, length;
+    WAIT_STATUS_TYPE waitStatus;
+
+    for (i = 0; i < numPids; i++) {
+       pid = Tcl_WaitPids(1, &pidPtr[i], (int *) &waitStatus);
+       if (pid == -1) {
+           Tcl_AppendResult(interp, "error waiting for process to exit: ",
+                   Tcl_UnixError(interp), (char *) NULL);
+           continue;
+       }
+
+       /*
+        * Create error messages for unusual process exits.  An
+        * extra newline gets appended to each error message, but
+        * it gets removed below (in the same fashion that an
+        * extra newline in the command's output is removed).
+        */
+
+       if (!WIFEXITED(waitStatus) || (WEXITSTATUS(waitStatus) != 0)) {
+           char msg1[20], msg2[20];
+
+           result = TCL_ERROR;
+           sprintf(msg1, "%d", pid);
+           if (WIFEXITED(waitStatus)) {
+               sprintf(msg2, "%d", WEXITSTATUS(waitStatus));
+               Tcl_SetErrorCode(interp, "CHILDSTATUS", msg1, msg2,
+                       (char *) NULL);
+           } else if (WIFSIGNALED(waitStatus)) {
+               char *p;
+       
+               p = Tcl_SignalMsg((int) (WTERMSIG(waitStatus)));
+               Tcl_SetErrorCode(interp, "CHILDKILLED", msg1,
+                       Tcl_SignalId((int) (WTERMSIG(waitStatus))), p,
+                       (char *) NULL);
+               Tcl_AppendResult(interp, "child killed: ", p, "\n",
+                       (char *) NULL);
+           } else if (WIFSTOPPED(waitStatus)) {
+               char *p;
+
+               p = Tcl_SignalMsg((int) (WSTOPSIG(waitStatus)));
+               Tcl_SetErrorCode(interp, "CHILDSUSP", msg1,
+                       Tcl_SignalId((int) (WSTOPSIG(waitStatus))), p, (char *) NULL);
+               Tcl_AppendResult(interp, "child suspended: ", p, "\n",
+                       (char *) NULL);
+           } else {
+               Tcl_AppendResult(interp,
+                       "child wait status didn't make sense\n",
+                       (char *) NULL);
+           }
+       }
+    }
+    ckfree((char *) pidPtr);
+
+    /*
+     * Read the standard error file.  If there's anything there,
+     * then return an error and add the file's contents to the result
+     * string.
+     */
+
+    if (errorId >= 0) {
+       while (1) {
+#          define BUFFER_SIZE 1000
+           char buffer[BUFFER_SIZE+1];
+           int count;
+    
+           count = read(errorId, buffer, BUFFER_SIZE);
+    
+           if (count == 0) {
+               break;
+           }
+           if (count < 0) {
+               Tcl_AppendResult(interp,
+                       "error reading stderr output file: ",
+                       Tcl_UnixError(interp), (char *) NULL);
+               break;
+           }
+           buffer[count] = 0;
+           Tcl_AppendResult(interp, buffer, (char *) NULL);
+       }
+       close(errorId);
+    }
+
+    /*
+     * If the last character of interp->result is a newline, then remove
+     * the newline character (the newline would just confuse things).
+     */
+
+    length = strlen(interp->result);
+    if ((length > 0) && (interp->result[length-1] == '\n')) {
+       interp->result[length-1] = '\0';
+    }
+
+    return result;
+}
diff --git a/src/tcl/tclunxst.c b/src/tcl/tclunxst.c
new file mode 100644 (file)
index 0000000..89fb0cd
--- /dev/null
@@ -0,0 +1,730 @@
+/* 
+ * tclUnixStr.c --
+ *
+ *     This file contains procedures that generate strings
+ *     corresponding to various UNIX-related codes, such
+ *     as errno and signals.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclUnixStr.c,v 1.12 92/04/30 15:51:15 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tclint.h"
+#include "tclunix.h"
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ErrnoId --
+ *
+ *     Return a textual identifier for the current errno value.
+ *
+ * Results:
+ *     This procedure returns a machine-readable textual identifier
+ *     that corresponds to the current errno value (e.g. "EPERM").
+ *     The identifier is the same as the #define name in errno.h.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tcl_ErrnoId()
+{
+    switch (errno) {
+#ifdef E2BIG
+       case E2BIG: return "E2BIG";
+#endif
+#ifdef EACCES
+       case EACCES: return "EACCES";
+#endif
+#ifdef EADDRINUSE
+       case EADDRINUSE: return "EADDRINUSE";
+#endif
+#ifdef EADDRNOTAVAIL
+       case EADDRNOTAVAIL: return "EADDRNOTAVAIL";
+#endif
+#ifdef EADV
+       case EADV: return "EADV";
+#endif
+#ifdef EAFNOSUPPORT
+       case EAFNOSUPPORT: return "EAFNOSUPPORT";
+#endif
+#ifdef EAGAIN
+       case EAGAIN: return "EAGAIN";
+#endif
+#ifdef EALIGN
+       case EALIGN: return "EALIGN";
+#endif
+#ifdef EALREADY
+       case EALREADY: return "EALREADY";
+#endif
+#ifdef EBADE
+       case EBADE: return "EBADE";
+#endif
+#ifdef EBADF
+       case EBADF: return "EBADF";
+#endif
+#ifdef EBADFD
+       case EBADFD: return "EBADFD";
+#endif
+#ifdef EBADMSG
+       case EBADMSG: return "EBADMSG";
+#endif
+#ifdef EBADR
+       case EBADR: return "EBADR";
+#endif
+#ifdef EBADRPC
+       case EBADRPC: return "EBADRPC";
+#endif
+#ifdef EBADRQC
+       case EBADRQC: return "EBADRQC";
+#endif
+#ifdef EBADSLT
+       case EBADSLT: return "EBADSLT";
+#endif
+#ifdef EBFONT
+       case EBFONT: return "EBFONT";
+#endif
+#ifdef EBUSY
+       case EBUSY: return "EBUSY";
+#endif
+#ifdef ECHILD
+       case ECHILD: return "ECHILD";
+#endif
+#ifdef ECHRNG
+       case ECHRNG: return "ECHRNG";
+#endif
+#ifdef ECOMM
+       case ECOMM: return "ECOMM";
+#endif
+#ifdef ECONNABORTED
+       case ECONNABORTED: return "ECONNABORTED";
+#endif
+#ifdef ECONNREFUSED
+       case ECONNREFUSED: return "ECONNREFUSED";
+#endif
+#ifdef ECONNRESET
+       case ECONNRESET: return "ECONNRESET";
+#endif
+#if defined(EDEADLK) && (!defined(EWOULDBLOCK) || (EDEADLK != EWOULDBLOCK))
+       case EDEADLK: return "EDEADLK";
+#endif
+#ifndef IS_LINUX
+#ifdef EDEADLOCK
+       case EDEADLOCK: return "EDEADLOCK";
+#endif
+#endif
+#ifdef EDESTADDRREQ
+       case EDESTADDRREQ: return "EDESTADDRREQ";
+#endif
+#ifdef EDIRTY
+       case EDIRTY: return "EDIRTY";
+#endif
+#ifdef EDOM
+       case EDOM: return "EDOM";
+#endif
+#ifdef EDOTDOT
+       case EDOTDOT: return "EDOTDOT";
+#endif
+#ifdef EDQUOT
+       case EDQUOT: return "EDQUOT";
+#endif
+#ifdef EDUPPKG
+       case EDUPPKG: return "EDUPPKG";
+#endif
+#ifdef EEXIST
+       case EEXIST: return "EEXIST";
+#endif
+#ifdef EFAULT
+       case EFAULT: return "EFAULT";
+#endif
+#ifdef EFBIG
+       case EFBIG: return "EFBIG";
+#endif
+#ifdef EHOSTDOWN
+       case EHOSTDOWN: return "EHOSTDOWN";
+#endif
+#ifdef EHOSTUNREACH
+       case EHOSTUNREACH: return "EHOSTUNREACH";
+#endif
+#ifdef EIDRM
+       case EIDRM: return "EIDRM";
+#endif
+#ifdef EINIT
+       case EINIT: return "EINIT";
+#endif
+#ifdef EINPROGRESS
+       case EINPROGRESS: return "EINPROGRESS";
+#endif
+#ifdef EINTR
+       case EINTR: return "EINTR";
+#endif
+#ifdef EINVAL
+       case EINVAL: return "EINVAL";
+#endif
+#ifdef EIO
+       case EIO: return "EIO";
+#endif
+#ifdef EISCONN
+       case EISCONN: return "EISCONN";
+#endif
+#ifdef EISDIR
+       case EISDIR: return "EISDIR";
+#endif
+#ifdef EISNAME
+       case EISNAM: return "EISNAM";
+#endif
+#ifdef ELBIN
+       case ELBIN: return "ELBIN";
+#endif
+#ifdef EL2HLT
+       case EL2HLT: return "EL2HLT";
+#endif
+#ifdef EL2NSYNC
+       case EL2NSYNC: return "EL2NSYNC";
+#endif
+#ifdef EL3HLT
+       case EL3HLT: return "EL3HLT";
+#endif
+#ifdef EL3RST
+       case EL3RST: return "EL3RST";
+#endif
+#ifdef ELIBACC
+       case ELIBACC: return "ELIBACC";
+#endif
+#ifdef ELIBBAD
+       case ELIBBAD: return "ELIBBAD";
+#endif
+#ifdef ELIBEXEC
+       case ELIBEXEC: return "ELIBEXEC";
+#endif
+#ifdef ELIBMAX
+       case ELIBMAX: return "ELIBMAX";
+#endif
+#ifdef ELIBSCN
+       case ELIBSCN: return "ELIBSCN";
+#endif
+#ifdef ELNRNG
+       case ELNRNG: return "ELNRNG";
+#endif
+#ifdef ELOOP
+       case ELOOP: return "ELOOP";
+#endif
+#ifdef EMFILE
+       case EMFILE: return "EMFILE";
+#endif
+#ifdef EMLINK
+       case EMLINK: return "EMLINK";
+#endif
+#ifdef EMSGSIZE
+       case EMSGSIZE: return "EMSGSIZE";
+#endif
+#ifdef EMULTIHOP
+       case EMULTIHOP: return "EMULTIHOP";
+#endif
+#ifdef ENAMETOOLONG
+       case ENAMETOOLONG: return "ENAMETOOLONG";
+#endif
+#ifdef ENAVAIL
+       case ENAVAIL: return "ENAVAIL";
+#endif
+#ifdef ENET
+       case ENET: return "ENET";
+#endif
+#ifdef ENETDOWN
+       case ENETDOWN: return "ENETDOWN";
+#endif
+#ifdef ENETRESET
+       case ENETRESET: return "ENETRESET";
+#endif
+#ifdef ENETUNREACH
+       case ENETUNREACH: return "ENETUNREACH";
+#endif
+#ifdef ENFILE
+       case ENFILE: return "ENFILE";
+#endif
+#ifdef ENOANO
+       case ENOANO: return "ENOANO";
+#endif
+#if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR))
+       case ENOBUFS: return "ENOBUFS";
+#endif
+#ifdef ENOCSI
+       case ENOCSI: return "ENOCSI";
+#endif
+#ifdef ENODATA
+       case ENODATA: return "ENODATA";
+#endif
+#ifdef ENODEV
+       case ENODEV: return "ENODEV";
+#endif
+#ifdef ENOENT
+       case ENOENT: return "ENOENT";
+#endif
+#ifdef ENOEXEC
+       case ENOEXEC: return "ENOEXEC";
+#endif
+#ifdef ENOLCK
+       case ENOLCK: return "ENOLCK";
+#endif
+#ifdef ENOLINK
+       case ENOLINK: return "ENOLINK";
+#endif
+#ifdef ENOMEM
+       case ENOMEM: return "ENOMEM";
+#endif
+#ifdef ENOMSG
+       case ENOMSG: return "ENOMSG";
+#endif
+#ifdef ENONET
+       case ENONET: return "ENONET";
+#endif
+#ifdef ENOPKG
+       case ENOPKG: return "ENOPKG";
+#endif
+#ifdef ENOPROTOOPT
+       case ENOPROTOOPT: return "ENOPROTOOPT";
+#endif
+#ifdef ENOSPC
+       case ENOSPC: return "ENOSPC";
+#endif
+#ifdef ENOSR
+       case ENOSR: return "ENOSR";
+#endif
+#ifdef ENOSTR
+       case ENOSTR: return "ENOSTR";
+#endif
+#ifdef ENOSYM
+       case ENOSYM: return "ENOSYM";
+#endif
+#ifdef ENOSYS
+       case ENOSYS: return "ENOSYS";
+#endif
+#ifdef ENOTBLK
+       case ENOTBLK: return "ENOTBLK";
+#endif
+#ifdef ENOTCONN
+       case ENOTCONN: return "ENOTCONN";
+#endif
+#ifdef ENOTDIR
+       case ENOTDIR: return "ENOTDIR";
+#endif
+#if defined(ENOTEMPTY) && (!defined(EEXIST) || (ENOTEMPTY != EEXIST))
+       case ENOTEMPTY: return "ENOTEMPTY";
+#endif
+#ifdef ENOTNAM
+       case ENOTNAM: return "ENOTNAM";
+#endif
+#ifdef ENOTSOCK
+       case ENOTSOCK: return "ENOTSOCK";
+#endif
+#ifdef ENOTTY
+       case ENOTTY: return "ENOTTY";
+#endif
+#ifdef ENOTUNIQ
+       case ENOTUNIQ: return "ENOTUNIQ";
+#endif
+#ifndef __GNUC__
+#ifdef ENXIO
+       case ENXIO: return "ENXIO";
+#endif
+#endif
+#ifdef EOPNOTSUPP
+       case EOPNOTSUPP: return "EOPNOTSUPP";
+#endif
+#ifndef __GNUC__
+#ifdef EPERM
+       case EPERM: return "EPERM";
+#endif
+#endif
+#ifdef EPFNOSUPPORT
+       case EPFNOSUPPORT: return "EPFNOSUPPORT";
+#endif
+#ifdef EPIPE
+       case EPIPE: return "EPIPE";
+#endif
+#ifdef EPROCLIM
+       case EPROCLIM: return "EPROCLIM";
+#endif
+#ifdef EPROCUNAVAIL
+       case EPROCUNAVAIL: return "EPROCUNAVAIL";
+#endif
+#ifdef EPROGMISMATCH
+       case EPROGMISMATCH: return "EPROGMISMATCH";
+#endif
+#ifdef EPROGUNAVAIL
+       case EPROGUNAVAIL: return "EPROGUNAVAIL";
+#endif
+#ifdef EPROTO
+       case EPROTO: return "EPROTO";
+#endif
+#ifdef EPROTONOSUPPORT
+       case EPROTONOSUPPORT: return "EPROTONOSUPPORT";
+#endif
+#ifdef EPROTOTYPE
+       case EPROTOTYPE: return "EPROTOTYPE";
+#endif
+#ifdef ERANGE
+       case ERANGE: return "ERANGE";
+#endif
+#if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED))
+       case EREFUSED: return "EREFUSED";
+#endif
+#ifdef EREMCHG
+       case EREMCHG: return "EREMCHG";
+#endif
+#ifdef EREMDEV
+       case EREMDEV: return "EREMDEV";
+#endif
+#ifdef EREMOTE
+       case EREMOTE: return "EREMOTE";
+#endif
+#ifdef EREMOTEIO
+       case EREMOTEIO: return "EREMOTEIO";
+#endif
+#ifdef EREMOTERELEASE
+       case EREMOTERELEASE: return "EREMOTERELEASE";
+#endif
+#ifdef EROFS
+       case EROFS: return "EROFS";
+#endif
+#ifdef ERPCMISMATCH
+       case ERPCMISMATCH: return "ERPCMISMATCH";
+#endif
+#ifdef ERREMOTE
+       case ERREMOTE: return "ERREMOTE";
+#endif
+#ifdef ESHUTDOWN
+       case ESHUTDOWN: return "ESHUTDOWN";
+#endif
+#ifdef ESOCKTNOSUPPORT
+       case ESOCKTNOSUPPORT: return "ESOCKTNOSUPPORT";
+#endif
+#ifdef ESPIPE
+       case ESPIPE: return "ESPIPE";
+#endif
+#ifdef ESRCH
+       case ESRCH: return "ESRCH";
+#endif
+#ifdef ESRMNT
+       case ESRMNT: return "ESRMNT";
+#endif
+#ifdef ESTALE
+       case ESTALE: return "ESTALE";
+#endif
+#ifdef ESUCCESS
+       case ESUCCESS: return "ESUCCESS";
+#endif
+#ifdef ETIME
+       case ETIME: return "ETIME";
+#endif
+#ifdef ETIMEDOUT
+       case ETIMEDOUT: return "ETIMEDOUT";
+#endif
+#ifdef ETOOMANYREFS
+       case ETOOMANYREFS: return "ETOOMANYREFS";
+#endif
+#ifdef ETXTBSY
+       case ETXTBSY: return "ETXTBSY";
+#endif
+#ifdef EUCLEAN
+       case EUCLEAN: return "EUCLEAN";
+#endif
+#ifdef EUNATCH
+       case EUNATCH: return "EUNATCH";
+#endif
+#ifdef EUSERS
+       case EUSERS: return "EUSERS";
+#endif
+#ifdef EVERSION
+       case EVERSION: return "EVERSION";
+#endif
+#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
+       case EWOULDBLOCK: return "EWOULDBLOCK";
+#endif
+#ifdef EXDEV
+       case EXDEV: return "EXDEV";
+#endif
+#ifdef EXFULL
+       case EXFULL: return "EXFULL";
+#endif
+    }
+    return "unknown error";
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_SignalId --
+ *
+ *     Return a textual identifier for a signal number.
+ *
+ * Results:
+ *     This procedure returns a machine-readable textual identifier
+ *     that corresponds to sig.  The identifier is the same as the
+ *     #define name in signal.h.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tcl_SignalId(sig)
+    int sig;                   /* Number of signal. */
+{
+    switch (sig) {
+#ifdef SIGABRT
+       case SIGABRT: return "SIGABRT";
+#endif
+#ifdef SIGALRM
+       case SIGALRM: return "SIGALRM";
+#endif
+#ifdef SIGBUS
+       case SIGBUS: return "SIGBUS";
+#endif
+#ifdef SIGCHLD
+       case SIGCHLD: return "SIGCHLD";
+#endif
+#if defined(SIGCLD) && (!defined(SIGCHLD) || (SIGCLD != SIGCHLD))
+       case SIGCLD: return "SIGCLD";
+#endif
+#ifdef SIGCONT
+       case SIGCONT: return "SIGCONT";
+#endif
+#if defined(SIGEMT) && (!defined(SIGXCPU) || (SIGEMT != SIGXCPU))
+       case SIGEMT: return "SIGEMT";
+#endif
+#ifdef SIGFPE
+       case SIGFPE: return "SIGFPE";
+#endif
+#ifdef SIGHUP
+       case SIGHUP: return "SIGHUP";
+#endif
+#ifdef SIGILL
+       case SIGILL: return "SIGILL";
+#endif
+#ifdef SIGINT
+       case SIGINT: return "SIGINT";
+#endif
+#ifdef SIGIO
+       case SIGIO: return "SIGIO";
+#endif
+#if defined(SIGIOT) && (!defined(SIGABRT) || (SIGIOT != SIGABRT))
+       case SIGIOT: return "SIGIOT";
+#endif
+#ifdef SIGKILL
+       case SIGKILL: return "SIGKILL";
+#endif
+#if defined(SIGLOST) && (!defined(SIGIOT) || (SIGLOST != SIGIOT))
+       case SIGLOST: return "SIGLOST";
+#endif
+#ifdef SIGPIPE
+       case SIGPIPE: return "SIGPIPE";
+#endif
+#if defined(SIGPOLL) && (!defined(SIGIO) || (SIGPOLL != SIGIO))
+       case SIGPOLL: return "SIGPOLL";
+#endif
+#ifdef SIGPROF
+       case SIGPROF: return "SIGPROF";
+#endif
+#if defined(SIGPWR) && (!defined(SIGXFSZ) || (SIGPWR != SIGXFSZ))
+       case SIGPWR: return "SIGPWR";
+#endif
+#ifdef SIGQUIT
+       case SIGQUIT: return "SIGQUIT";
+#endif
+#ifdef SIGSEGV
+       case SIGSEGV: return "SIGSEGV";
+#endif
+#ifdef SIGSTOP
+       case SIGSTOP: return "SIGSTOP";
+#endif
+#ifdef SIGSYS
+       case SIGSYS: return "SIGSYS";
+#endif
+#ifdef SIGTERM
+       case SIGTERM: return "SIGTERM";
+#endif
+#ifdef SIGTRAP
+       case SIGTRAP: return "SIGTRAP";
+#endif
+#ifdef SIGTSTP
+       case SIGTSTP: return "SIGTSTP";
+#endif
+#ifdef SIGTTIN
+       case SIGTTIN: return "SIGTTIN";
+#endif
+#ifdef SIGTTOU
+       case SIGTTOU: return "SIGTTOU";
+#endif
+#ifdef SIGURG
+       case SIGURG: return "SIGURG";
+#endif
+#ifdef SIGUSR1
+       case SIGUSR1: return "SIGUSR1";
+#endif
+#ifdef SIGUSR2
+       case SIGUSR2: return "SIGUSR2";
+#endif
+#ifdef SIGVTALRM
+       case SIGVTALRM: return "SIGVTALRM";
+#endif
+#ifdef SIGWINCH
+       case SIGWINCH: return "SIGWINCH";
+#endif
+#ifdef SIGXCPU
+       case SIGXCPU: return "SIGXCPU";
+#endif
+#ifdef SIGXFSZ
+       case SIGXFSZ: return "SIGXFSZ";
+#endif
+    }
+    return "unknown signal";
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_SignalMsg --
+ *
+ *     Return a human-readable message describing a signal.
+ *
+ * Results:
+ *     This procedure returns a string describing sig that should
+ *     make sense to a human.  It may not be easy for a machine
+ *     to parse.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tcl_SignalMsg(sig)
+    int sig;                   /* Number of signal. */
+{
+    switch (sig) {
+#ifdef SIGABRT
+       case SIGABRT: return "SIGABRT";
+#endif
+#ifdef SIGALRM
+       case SIGALRM: return "alarm clock";
+#endif
+#ifdef SIGBUS
+       case SIGBUS: return "bus error";
+#endif
+#ifdef SIGCHLD
+       case SIGCHLD: return "child status changed";
+#endif
+#if defined(SIGCLD) && (!defined(SIGCHLD) || (SIGCLD != SIGCHLD))
+       case SIGCLD: return "child status changed";
+#endif
+#ifdef SIGCONT
+       case SIGCONT: return "continue after stop";
+#endif
+#if defined(SIGEMT) && (!defined(SIGXCPU) || (SIGEMT != SIGXCPU))
+       case SIGEMT: return "EMT instruction";
+#endif
+#ifdef SIGFPE
+       case SIGFPE: return "floating-point exception";
+#endif
+#ifdef SIGHUP
+       case SIGHUP: return "hangup";
+#endif
+#ifdef SIGILL
+       case SIGILL: return "illegal instruction";
+#endif
+#ifdef SIGINT
+       case SIGINT: return "interrupt";
+#endif
+#ifdef SIGIO
+       case SIGIO: return "input/output possible on file";
+#endif
+#if defined(SIGIOT) && (!defined(SIGABRT) || (SIGABRT != SIGIOT))
+       case SIGIOT: return "IOT instruction";
+#endif
+#ifdef SIGKILL
+       case SIGKILL: return "kill signal";
+#endif
+#if defined(SIGLOST) && (!defined(SIGIOT) || (SIGLOST != SIGIOT))
+       case SIGLOST: return "resource lost";
+#endif
+#ifdef SIGPIPE
+       case SIGPIPE: return "write on pipe with no readers";
+#endif
+#if defined(SIGPOLL) && (!defined(SIGIO) || (SIGPOLL != SIGIO))
+       case SIGPOLL: return "input/output possible on file";
+#endif
+#ifdef SIGPROF
+       case SIGPROF: return "profiling alarm";
+#endif
+#if defined(SIGPWR) && (!defined(SIGXFSZ) || (SIGPWR != SIGXFSZ))
+       case SIGPWR: return "power-fail restart";
+#endif
+#ifdef SIGQUIT
+       case SIGQUIT: return "quit signal";
+#endif
+#ifdef SIGSEGV
+       case SIGSEGV: return "segmentation violation";
+#endif
+#ifdef SIGSTOP
+       case SIGSTOP: return "stop";
+#endif
+#ifdef SIGSYS
+       case SIGSYS: return "bad argument to system call";
+#endif
+#ifdef SIGTERM
+       case SIGTERM: return "software termination signal";
+#endif
+#ifdef SIGTRAP
+       case SIGTRAP: return "trace trap";
+#endif
+#ifdef SIGTSTP
+       case SIGTSTP: return "stop signal from tty";
+#endif
+#ifdef SIGTTIN
+       case SIGTTIN: return "background tty read";
+#endif
+#ifdef SIGTTOU
+       case SIGTTOU: return "background tty write";
+#endif
+#ifdef SIGURG
+       case SIGURG: return "urgent I/O condition";
+#endif
+#ifdef SIGUSR1
+       case SIGUSR1: return "user-defined signal 1";
+#endif
+#ifdef SIGUSR2
+       case SIGUSR2: return "user-defined signal 2";
+#endif
+#ifdef SIGVTALRM
+       case SIGVTALRM: return "virtual time alarm";
+#endif
+#ifdef SIGWINCH
+       case SIGWINCH: return "window changed";
+#endif
+#ifdef SIGXCPU
+       case SIGXCPU: return "exceeded CPU time limit";
+#endif
+#ifdef SIGXFSZ
+       case SIGXFSZ: return "exceeded file size limit";
+#endif
+    }
+    return "unknown signal";
+}
diff --git a/src/tcl/tclunxut.c b/src/tcl/tclunxut.c
new file mode 100644 (file)
index 0000000..6bc760b
--- /dev/null
@@ -0,0 +1,1033 @@
+/* 
+ * tclUnixUtil.c --
+ *
+ *     This file contains a collection of utility procedures that
+ *     are present in the Tcl's UNIX core but not in the generic
+ *     core.  For example, they do file manipulation and process
+ *     manipulation.
+ *
+ *     The Tcl_Fork and Tcl_WaitPids procedures are based on code
+ *     contributed by Karl Lehenbauer, Mark Diekhans and Peter
+ *     da Silva.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclUnixUtil.c,v 1.18 91/11/21 14:53:46 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tclint.h"
+#include "tclunix.h"
+
+/*
+ * Data structures of the following type are used by Tcl_Fork and
+ * Tcl_WaitPids to keep track of child processes.
+ */
+
+typedef struct {
+    int pid;                   /* Process id of child. */
+    WAIT_STATUS_TYPE status;   /* Status returned when child exited or
+                                * suspended. */
+    int flags;                 /* Various flag bits;  see below for
+                                * definitions. */
+} WaitInfo;
+
+/*
+ * Flag bits in WaitInfo structures:
+ *
+ * WI_READY -                  Non-zero means process has exited or
+ *                             suspended since it was forked or last
+ *                             returned by Tcl_WaitPids.
+ * WI_DETACHED -               Non-zero means no-one cares about the
+ *                             process anymore.  Ignore it until it
+ *                             exits, then forget about it.
+ */
+
+#define WI_READY       1
+#define WI_DETACHED    2
+
+static WaitInfo *waitTable = NULL;
+static int waitTableSize = 0;  /* Total number of entries available in
+                                * waitTable. */
+static int waitTableUsed = 0;  /* Number of entries in waitTable that
+                                * are actually in use right now.  Active
+                                * entries are always at the beginning
+                                * of the table. */
+#define WAIT_TABLE_GROW_BY 4
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_EvalFile --
+ *
+ *     Read in a file and process the entire file as one gigantic
+ *     Tcl command.
+ *
+ * Results:
+ *     A standard Tcl result, which is either the result of executing
+ *     the file or an error indicating why the file couldn't be read.
+ *
+ * Side effects:
+ *     Depends on the commands in the file.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_EvalFile(interp, fileName)
+    Tcl_Interp *interp;                /* Interpreter in which to process file. */
+    char *fileName;            /* Name of file to process.  Tilde-substitution
+                                * will be performed on this name. */
+{
+    int fileId, result;
+    struct stat statBuf;
+    char *cmdBuffer, *end, *oldScriptFile;
+    Interp *iPtr = (Interp *) interp;
+
+    oldScriptFile = iPtr->scriptFile;
+    iPtr->scriptFile = fileName;
+    fileName = Tcl_TildeSubst(interp, fileName);
+    if (fileName == NULL) {
+       goto error;
+    }
+#ifdef MSDOS
+    filename2DOS(fileName);
+#endif
+    fileId = open(fileName, O_RDONLY, 0);
+
+    if (fileId < 0) {
+       Tcl_AppendResult(interp, "couldn't read file \"", fileName,
+               "\": ", Tcl_UnixError(interp), (char *) NULL);
+       goto error;
+    }
+    if (fstat(fileId, &statBuf) == -1) {
+       Tcl_AppendResult(interp, "couldn't stat file \"", fileName,
+               "\": ", Tcl_UnixError(interp), (char *) NULL);
+       close(fileId);
+       goto error;
+    }
+    cmdBuffer = (char *) ckalloc((unsigned) statBuf.st_size+1);
+#ifdef MSDOS
+    if (read(fileId, cmdBuffer, (int) statBuf.st_size) < 0) {
+#else
+    if (read(fileId, cmdBuffer, (int) statBuf.st_size) != statBuf.st_size) {
+#endif
+       Tcl_AppendResult(interp, "error in reading file \"", fileName,
+               "\": ", Tcl_UnixError(interp), (char *) NULL);
+       close(fileId);
+       goto error;
+    }
+    if (close(fileId) != 0) {
+       Tcl_AppendResult(interp, "error closing file \"", fileName,
+               "\": ", Tcl_UnixError(interp), (char *) NULL);
+       goto error;
+    }
+    cmdBuffer[statBuf.st_size] = 0;
+    result = Tcl_Eval(interp, cmdBuffer, 0, &end);
+    if (result == TCL_RETURN) {
+       result = TCL_OK;
+    }
+    if (result == TCL_ERROR) {
+       char msg[200];
+
+       /*
+        * Record information telling where the error occurred.
+        */
+
+       sprintf(msg, "\n    (file \"%.150s\" line %d)", fileName,
+               interp->errorLine);
+       Tcl_AddErrorInfo(interp, msg);
+    }
+    ckfree(cmdBuffer);
+    iPtr->scriptFile = oldScriptFile;
+    return result;
+
+    error:
+    iPtr->scriptFile = oldScriptFile;
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_Fork --
+ *
+ *     Create a new process using the vfork system call, and keep
+ *     track of it for "safe" waiting with Tcl_WaitPids.
+ *
+ * Results:
+ *     The return value is the value returned by the vfork system
+ *     call (0 means child, > 0 means parent (value is child id),
+ *     < 0 means error).
+ *
+ * Side effects:
+ *     A new process is created, and an entry is added to an internal
+ *     table of child processes if the process is created successfully.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_Fork()
+{
+    WaitInfo *waitPtr;
+    pid_t pid;
+
+    /*
+     * Disable SIGPIPE signals:  if they were allowed, this process
+     * might go away unexpectedly if children misbehave.  This code
+     * can potentially interfere with other application code that
+     * expects to handle SIGPIPEs;  what's really needed is an
+     * arbiter for signals to allow them to be "shared".
+     */
+
+    if (waitTable == NULL) {
+       (void) signal(SIGPIPE, SIG_IGN);
+    }
+
+    /*
+     * Enlarge the wait table if there isn't enough space for a new
+     * entry.
+     */
+
+    if (waitTableUsed == waitTableSize) {
+       int newSize;
+       WaitInfo *newWaitTable;
+
+       newSize = waitTableSize + WAIT_TABLE_GROW_BY;
+       newWaitTable = (WaitInfo *) ckalloc((unsigned)
+               (newSize * sizeof(WaitInfo)));
+       memcpy((VOID *) newWaitTable, (VOID *) waitTable,
+               (waitTableSize * sizeof(WaitInfo)));
+       if (waitTable != NULL) {
+           ckfree((char *) waitTable);
+       }
+       waitTable = newWaitTable;
+       waitTableSize = newSize;
+    }
+
+    /*
+     * Make a new process and enter it into the table if the fork
+     * is successful.
+     */
+
+    waitPtr = &waitTable[waitTableUsed];
+    pid = fork();
+    if (pid > 0) {
+       waitPtr->pid = pid;
+       waitPtr->flags = 0;
+       waitTableUsed++;
+    }
+    return pid;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_WaitPids --
+ *
+ *     This procedure is used to wait for one or more processes created
+ *     by Tcl_Fork to exit or suspend.  It records information about
+ *     all processes that exit or suspend, even those not waited for,
+ *     so that later waits for them will be able to get the status
+ *     information.
+ *
+ * Results:
+ *     -1 is returned if there is an error in the wait kernel call.
+ *     Otherwise the pid of an exited/suspended process from *pidPtr
+ *     is returned and *statusPtr is set to the status value returned
+ *     by the wait kernel call.
+ *
+ * Side effects:
+ *     Doesn't return until one of the pids at *pidPtr exits or suspends.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_WaitPids(numPids, pidPtr, statusPtr)
+    int numPids;               /* Number of pids to wait on:  gives size
+                                * of array pointed to by pidPtr. */
+    int *pidPtr;               /* Pids to wait on:  return when one of
+                                * these processes exits or suspends. */
+    int *statusPtr;            /* Wait status is returned here. */
+{
+    int i, count, pid;
+    register WaitInfo *waitPtr;
+    int anyProcesses;
+    WAIT_STATUS_TYPE status;
+
+    while (1) {
+       /*
+        * Scan the table of child processes to see if one of the
+        * specified children has already exited or suspended.  If so,
+        * remove it from the table and return its status.
+        */
+
+       anyProcesses = 0;
+       for (waitPtr = waitTable, count = waitTableUsed;
+               count > 0; waitPtr++, count--) {
+           for (i = 0; i < numPids; i++) {
+               if (pidPtr[i] != waitPtr->pid) {
+                   continue;
+               }
+               anyProcesses = 1;
+               if (waitPtr->flags & WI_READY) {
+                   *statusPtr = *((int *) &waitPtr->status);
+                   pid = waitPtr->pid;
+                   if (WIFEXITED(waitPtr->status)
+                           || WIFSIGNALED(waitPtr->status)) {
+                       *waitPtr = waitTable[waitTableUsed-1];
+                       waitTableUsed--;
+                   } else {
+                       waitPtr->flags &= ~WI_READY;
+                   }
+                   return pid;
+               }
+           }
+       }
+
+       /*
+        * Make sure that the caller at least specified one valid
+        * process to wait for.
+        */
+
+       if (!anyProcesses) {
+           errno = ECHILD;
+           return -1;
+       }
+
+       /*
+        * Wait for a process to exit or suspend, then update its
+        * entry in the table and go back to the beginning of the
+        * loop to see if it's one of the desired processes.
+        */
+
+       pid = wait(&status);
+       if (pid < 0) {
+           return pid;
+       }
+       for (waitPtr = waitTable, count = waitTableUsed; ;
+               waitPtr++, count--) {
+           if (count == 0) {
+               break;                  /* Ignore unknown processes. */
+           }
+           if (pid != waitPtr->pid) {
+               continue;
+           }
+
+           /*
+            * If the process has been detached, then ignore anything
+            * other than an exit, and drop the entry on exit.
+            */
+
+           if (waitPtr->flags & WI_DETACHED) {
+               if (WIFEXITED(status) || WIFSIGNALED(status)) {
+                   *waitPtr = waitTable[waitTableUsed-1];
+                   waitTableUsed--;
+               }
+           } else {
+               waitPtr->status = status;
+               waitPtr->flags |= WI_READY;
+           }
+           break;
+       }
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_DetachPids --
+ *
+ *     This procedure is called to indicate that one or more child
+ *     processes have been placed in background and are no longer
+ *     cared about.  They should be ignored in future calls to
+ *     Tcl_WaitPids.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_DetachPids(numPids, pidPtr)
+    int numPids;               /* Number of pids to detach:  gives size
+                                * of array pointed to by pidPtr. */
+    int *pidPtr;               /* Array of pids to detach:  must have
+                                * been created by Tcl_Fork. */
+{
+    register WaitInfo *waitPtr;
+    int i, count, pid;
+
+    for (i = 0; i < numPids; i++) {
+       pid = pidPtr[i];
+       for (waitPtr = waitTable, count = waitTableUsed;
+               count > 0; waitPtr++, count--) {
+           if (pid != waitPtr->pid) {
+               continue;
+           }
+
+           /*
+            * If the process has already exited then destroy its
+            * table entry now.
+            */
+
+           if ((waitPtr->flags & WI_READY) && (WIFEXITED(waitPtr->status)
+                   || WIFSIGNALED(waitPtr->status))) {
+               *waitPtr = waitTable[waitTableUsed-1];
+               waitTableUsed--;
+           } else {
+               waitPtr->flags |= WI_DETACHED;
+           }
+           goto nextPid;
+       }
+       panic("Tcl_Detach couldn't find process");
+
+       nextPid:
+       continue;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_CreatePipeline --
+ *
+ *     Given an argc/argv array, instantiate a pipeline of processes
+ *     as described by the argv.
+ *
+ * Results:
+ *     The return value is a count of the number of new processes
+ *     created, or -1 if an error occurred while creating the pipeline.
+ *     *pidArrayPtr is filled in with the address of a dynamically
+ *     allocated array giving the ids of all of the processes.  It
+ *     is up to the caller to free this array when it isn't needed
+ *     anymore.  If inPipePtr is non-NULL, *inPipePtr is filled in
+ *     with the file id for the input pipe for the pipeline (if any):
+ *     the caller must eventually close this file.  If outPipePtr
+ *     isn't NULL, then *outPipePtr is filled in with the file id
+ *     for the output pipe from the pipeline:  the caller must close
+ *     this file.  If errFilePtr isn't NULL, then *errFilePtr is filled
+ *     with a file id that may be used to read error output after the
+ *     pipeline completes.
+ *
+ * Side effects:
+ *     Processes and pipes are created.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_CreatePipeline(interp, argc, argv, pidArrayPtr, inPipePtr,
+       outPipePtr, errFilePtr)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    int argc;                  /* Number of entries in argv. */
+    char **argv;               /* Array of strings describing commands in
+                                * pipeline plus I/O redirection with <,
+                                * <<, and >.  Argv[argc] must be NULL. */
+    int **pidArrayPtr;         /* Word at *pidArrayPtr gets filled in with
+                                * address of array of pids for processes
+                                * in pipeline (first pid is first process
+                                * in pipeline). */
+    int *inPipePtr;            /* If non-NULL, input to the pipeline comes
+                                * from a pipe (unless overridden by
+                                * redirection in the command).  The file
+                                * id with which to write to this pipe is
+                                * stored at *inPipePtr.  -1 means command
+                                * specified its own input source. */
+    int *outPipePtr;           /* If non-NULL, output to the pipeline goes
+                                * to a pipe, unless overriden by redirection
+                                * in the command.  The file id with which to
+                                * read frome this pipe is stored at
+                                * *outPipePtr.  -1 means command specified
+                                * its own output sink. */
+    int *errFilePtr;           /* If non-NULL, all stderr output from the
+                                * pipeline will go to a temporary file
+                                * created here, and a descriptor to read
+                                * the file will be left at *errFilePtr.
+                                * The file will be removed already, so
+                                * closing this descriptor will be the end
+                                * of the file.  If this is NULL, then
+                                * all stderr output goes to our stderr. */
+{
+    int *pidPtr = NULL;                /* Points to malloc-ed array holding all
+                                * the pids of child processes. */
+    int numPids = 0;           /* Actual number of processes that exist
+                                * at *pidPtr right now. */
+    int cmdCount;              /* Count of number of distinct commands
+                                * found in argc/argv. */
+    char *input = NULL;                /* Describes input for pipeline, depending
+                                * on "inputFile".  NULL means take input
+                                * from stdin/pipe. */
+    int inputFile = 0;         /* Non-zero means input is name of input
+                                * file.  Zero means input holds actual
+                                * text to be input to command. */
+    char *output = NULL;       /* Holds name of output file to pipe to,
+                                * or NULL if output goes to stdout/pipe. */
+    int inputId = -1;          /* Readable file id input to current command in
+                                * pipeline (could be file or pipe).  -1
+                                * means use stdin. */
+    int outputId = -1;         /* Writable file id for output from current
+                                * command in pipeline (could be file or pipe).
+                                * -1 means use stdout. */
+    int errorId = -1;          /* Writable file id for all standard error
+                                * output from all commands in pipeline.  -1
+                                * means use stderr. */
+    int lastOutputId = -1;     /* Write file id for output from last command
+                                * in pipeline (could be file or pipe).
+                                * -1 means use stdout. */
+    int pipeIds[2];            /* File ids for pipe that's being created. */
+    int firstArg, lastArg;     /* Indexes of first and last arguments in
+                                * current command. */
+    int lastBar;
+    char *execName;
+    int i, j, pid;
+
+    if (inPipePtr != NULL) {
+       *inPipePtr = -1;
+    }
+    if (outPipePtr != NULL) {
+       *outPipePtr = -1;
+    }
+    if (errFilePtr != NULL) {
+       *errFilePtr = -1;
+    }
+    pipeIds[0] = pipeIds[1] = -1;
+
+    /*
+     * First, scan through all the arguments to figure out the structure
+     * of the pipeline.  Count the number of distinct processes (it's the
+     * number of "|" arguments).  If there are "<", "<<", or ">" arguments
+     * then make note of input and output redirection and remove these
+     * arguments and the arguments that follow them.
+     */
+
+    cmdCount = 1;
+    lastBar = -1;
+    for (i = 0; i < argc; i++) {
+       if ((argv[i][0] == '|') && ((argv[i][1] == 0))) {
+           if ((i == (lastBar+1)) || (i == (argc-1))) {
+               interp->result = "illegal use of | in command";
+               return -1;
+           }
+           lastBar = i;
+           cmdCount++;
+           continue;
+       } else if (argv[i][0] == '<') {
+           if (argv[i][1] == 0) {
+               input = argv[i+1];
+               inputFile = 1;
+           } else if ((argv[i][1] == '<') && (argv[i][2] == 0)) {
+               input = argv[i+1];
+               inputFile = 0;
+           } else {
+               continue;
+           }
+       } else if ((argv[i][0] == '>') && (argv[i][1] == 0)) {
+           output = argv[i+1];
+       } else {
+           continue;
+       }
+       if (i >= (argc-1)) {
+           Tcl_AppendResult(interp, "can't specify \"", argv[i],
+                   "\" as last word in command", (char *) NULL);
+           return -1;
+       }
+       for (j = i+2; j < argc; j++) {
+           argv[j-2] = argv[j];
+       }
+       argc -= 2;
+       i--;                    /* Process new arg from same position. */
+    }
+    if (argc == 0) {
+       interp->result =  "didn't specify command to execute";
+       return -1;
+    }
+
+    /*
+     * Set up the redirected input source for the pipeline, if
+     * so requested.
+     */
+
+    if (input != NULL) {
+       if (!inputFile) {
+           /*
+            * Immediate data in command.  Create temporary file and
+            * put data into file.
+            */
+
+#ifdef MSDOS
+#          define TMP_STDIN_NAME "tcl.in"
+#else
+#          define TMP_STDIN_NAME "/tmp/tcl.in.XXXXXX"
+#endif
+           char inName[sizeof(TMP_STDIN_NAME) + 1];
+           int length;
+
+           strcpy(inName, TMP_STDIN_NAME);
+           mkstemp(inName);
+           inputId = open(inName, O_RDWR|O_CREAT|O_TRUNC, 0600);
+           if (inputId < 0) {
+               Tcl_AppendResult(interp,
+                       "couldn't create input file for command: ",
+                       Tcl_UnixError(interp), (char *) NULL);
+               goto error;
+           }
+           length = strlen(input);
+#ifdef MSDOS
+           if (write(inputId, input, length) < 0) {
+#else
+           if (write(inputId, input, length) != length) {
+#endif
+               Tcl_AppendResult(interp,
+                       "couldn't write file input for command: ",
+                       Tcl_UnixError(interp), (char *) NULL);
+               goto error;
+           }
+           if ((lseek(inputId, 0L, 0) == -1) || (unlink(inName) == -1)) {
+               Tcl_AppendResult(interp,
+                       "couldn't reset or remove input file for command: ",
+                       Tcl_UnixError(interp), (char *) NULL);
+               goto error;
+           }
+       } else {
+           /*
+            * File redirection.  Just open the file.
+            */
+
+           inputId = open(input, O_RDONLY, 0);
+           if (inputId < 0) {
+               Tcl_AppendResult(interp,
+                       "couldn't read file \"", input, "\": ",
+                       Tcl_UnixError(interp), (char *) NULL);
+               goto error;
+           }
+       }
+    } else if (inPipePtr != NULL) {
+       if (pipe(pipeIds) != 0) {
+           Tcl_AppendResult(interp,
+                   "couldn't create input pipe for command: ",
+                   Tcl_UnixError(interp), (char *) NULL);
+           goto error;
+       }
+       inputId = pipeIds[0];
+       *inPipePtr = pipeIds[1];
+       pipeIds[0] = pipeIds[1] = -1;
+    }
+
+    /*
+     * Set up the redirected output sink for the pipeline from one
+     * of two places, if requested.
+     */
+
+    if (output != NULL) {
+       /*
+        * Output is to go to a file.
+        */
+
+       lastOutputId = open(output, O_WRONLY|O_CREAT|O_TRUNC, 0666);
+       if (lastOutputId < 0) {
+           Tcl_AppendResult(interp,
+                   "couldn't write file \"", output, "\": ",
+                   Tcl_UnixError(interp), (char *) NULL);
+           goto error;
+       }
+    } else if (outPipePtr != NULL) {
+       /*
+        * Output is to go to a pipe.
+        */
+
+       if (pipe(pipeIds) != 0) {
+           Tcl_AppendResult(interp,
+                   "couldn't create output pipe: ",
+                   Tcl_UnixError(interp), (char *) NULL);
+           goto error;
+       }
+       lastOutputId = pipeIds[1];
+       *outPipePtr = pipeIds[0];
+       pipeIds[0] = pipeIds[1] = -1;
+    }
+
+    /*
+     * Set up the standard error output sink for the pipeline, if
+     * requested.  Use a temporary file which is opened, then deleted.
+     * Could potentially just use pipe, but if it filled up it could
+     * cause the pipeline to deadlock:  we'd be waiting for processes
+     * to complete before reading stderr, and processes couldn't complete
+     * because stderr was backed up.
+     */
+
+    if (errFilePtr != NULL) {
+#      define TMP_STDERR_NAME "/tmp/tcl.err.XXXXXX"
+       char errName[sizeof(TMP_STDERR_NAME) + 1];
+
+       strcpy(errName, TMP_STDERR_NAME);
+       mkstemp(errName);
+       errorId = open(errName, O_WRONLY|O_CREAT|O_TRUNC, 0600);
+       if (errorId < 0) {
+           errFileError:
+           Tcl_AppendResult(interp,
+                   "couldn't create error file for command: ",
+                   Tcl_UnixError(interp), (char *) NULL);
+           goto error;
+       }
+       *errFilePtr = open(errName, O_RDONLY, 0);
+       if (*errFilePtr < 0) {
+           goto errFileError;
+       }
+       if (unlink(errName) == -1) {
+           Tcl_AppendResult(interp,
+                   "couldn't remove error file for command: ",
+                   Tcl_UnixError(interp), (char *) NULL);
+           goto error;
+       }
+    }
+
+    /*
+     * Scan through the argc array, forking off a process for each
+     * group of arguments between "|" arguments.
+     */
+
+    pidPtr = (int *) ckalloc((unsigned) (cmdCount * sizeof(int)));
+    for (i = 0; i < numPids; i++) {
+       pidPtr[i] = -1;
+    }
+    for (firstArg = 0; firstArg < argc; numPids++, firstArg = lastArg+1) {
+       for (lastArg = firstArg; lastArg < argc; lastArg++) {
+           if ((argv[lastArg][0] == '|') && (argv[lastArg][1] == 0)) {
+               break;
+           }
+       }
+       argv[lastArg] = NULL;
+       if (lastArg == argc) {
+           outputId = lastOutputId;
+       } else {
+           if (pipe(pipeIds) != 0) {
+               Tcl_AppendResult(interp, "couldn't create pipe: ",
+                       Tcl_UnixError(interp), (char *) NULL);
+               goto error;
+           }
+           outputId = pipeIds[1];
+       }
+       execName = Tcl_TildeSubst(interp, argv[firstArg]);
+       pid = Tcl_Fork();
+       if (pid == -1) {
+           Tcl_AppendResult(interp, "couldn't fork child process: ",
+                   Tcl_UnixError(interp), (char *) NULL);
+           goto error;
+       }
+       if (pid == 0) {
+           char errSpace[200];
+
+           if (((inputId != -1) && (dup2(inputId, 0) == -1))
+                   || ((outputId != -1) && (dup2(outputId, 1) == -1))
+                   || ((errorId != -1) && (dup2(errorId, 2) == -1))) {
+               char *err;
+               err = "forked process couldn't set up input/output\n";
+               write(errorId < 0 ? 2 : errorId, err, strlen(err));
+               _exit(1);
+           }
+           for (i = 3; (i <= outputId) || (i <= inputId) || (i <= errorId);
+                   i++) {
+               close(i);
+           }
+           execvp(execName, &argv[firstArg]);
+           sprintf(errSpace, "couldn't find \"%.150s\" to execute\n",
+                   argv[firstArg]);
+           write(2, errSpace, strlen(errSpace));
+           _exit(1);
+       } else {
+           pidPtr[numPids] = pid;
+       }
+
+       /*
+        * Close off our copies of file descriptors that were set up for
+        * this child, then set up the input for the next child.
+        */
+
+       if (inputId != -1) {
+           close(inputId);
+       }
+       if (outputId != -1) {
+           close(outputId);
+       }
+       inputId = pipeIds[0];
+       pipeIds[0] = pipeIds[1] = -1;
+    }
+    *pidArrayPtr = pidPtr;
+
+    /*
+     * All done.  Cleanup open files lying around and then return.
+     */
+
+cleanup:
+    if (inputId != -1) {
+       close(inputId);
+    }
+    if (lastOutputId != -1) {
+       close(lastOutputId);
+    }
+    if (errorId != -1) {
+       close(errorId);
+    }
+    return numPids;
+
+    /*
+     * An error occurred.  There could have been extra files open, such
+     * as pipes between children.  Clean them all up.  Detach any child
+     * processes that have been created.
+     */
+
+    error:
+    if ((inPipePtr != NULL) && (*inPipePtr != -1)) {
+       close(*inPipePtr);
+       *inPipePtr = -1;
+    }
+    if ((outPipePtr != NULL) && (*outPipePtr != -1)) {
+       close(*outPipePtr);
+       *outPipePtr = -1;
+    }
+    if ((errFilePtr != NULL) && (*errFilePtr != -1)) {
+       close(*errFilePtr);
+       *errFilePtr = -1;
+    }
+    if (pipeIds[0] != -1) {
+       close(pipeIds[0]);
+    }
+    if (pipeIds[1] != -1) {
+       close(pipeIds[1]);
+    }
+    if (pidPtr != NULL) {
+       for (i = 0; i < numPids; i++) {
+           if (pidPtr[i] != -1) {
+               Tcl_DetachPids(1, &pidPtr[i]);
+           }
+       }
+       ckfree((char *) pidPtr);
+    }
+    numPids = -1;
+    goto cleanup;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_UnixError --
+ *
+ *     This procedure is typically called after UNIX kernel calls
+ *     return errors.  It stores machine-readable information about
+ *     the error in $errorCode returns an information string for
+ *     the caller's use.
+ *
+ * Results:
+ *     The return value is a human-readable string describing the
+ *     error, as returned by strerror.
+ *
+ * Side effects:
+ *     The global variable $errorCode is reset.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tcl_UnixError(interp)
+    Tcl_Interp *interp;                /* Interpreter whose $errorCode variable
+                                * is to be changed. */
+{
+    char *id, *msg;
+
+    id = Tcl_ErrnoId();
+    msg = strerror(errno);
+    Tcl_SetErrorCode(interp, "UNIX", id, msg, (char *) NULL);
+    return msg;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclMakeFileTable --
+ *
+ *     Create or enlarge the file table for the interpreter, so that
+ *     there is room for a given index.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The file table for iPtr will be created if it doesn't exist
+ *     (and entries will be added for stdin, stdout, and stderr).
+ *     If it already exists, then it will be grown if necessary.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TclMakeFileTable(iPtr, index)
+    Interp *iPtr;              /* Interpreter whose table of files is
+                                * to be manipulated. */
+    int index;                 /* Make sure table is large enough to
+                                * hold at least this index. */
+{
+    /*
+     * If the table doesn't even exist, then create it and initialize
+     * entries for standard files.
+     */
+
+    if (iPtr->numFiles == 0) {
+       OpenFile *filePtr;
+       int i;
+
+       if (index < 2) {
+           iPtr->numFiles = 3;
+       } else {
+           iPtr->numFiles = index+1;
+       }
+       iPtr->filePtrArray = (OpenFile **) ckalloc((unsigned)
+               ((iPtr->numFiles)*sizeof(OpenFile *)));
+       for (i = iPtr->numFiles-1; i >= 0; i--) {
+           iPtr->filePtrArray[i] = NULL;
+       }
+
+       filePtr = (OpenFile *) ckalloc(sizeof(OpenFile));
+       filePtr->f = stdin;
+       filePtr->f2 = NULL;
+       filePtr->readable = 1;
+       filePtr->writable = 0;
+       filePtr->numPids = 0;
+       filePtr->pidPtr = NULL;
+       filePtr->errorId = -1;
+       iPtr->filePtrArray[0] = filePtr;
+
+       filePtr = (OpenFile *) ckalloc(sizeof(OpenFile));
+       filePtr->f = stdout;
+       filePtr->f2 = NULL;
+       filePtr->readable = 0;
+       filePtr->writable = 1;
+       filePtr->numPids = 0;
+       filePtr->pidPtr = NULL;
+       filePtr->errorId = -1;
+       iPtr->filePtrArray[1] = filePtr;
+
+       filePtr = (OpenFile *) ckalloc(sizeof(OpenFile));
+       filePtr->f = stderr;
+       filePtr->f2 = NULL;
+       filePtr->readable = 0;
+       filePtr->writable = 1;
+       filePtr->numPids = 0;
+       filePtr->pidPtr = NULL;
+       filePtr->errorId = -1;
+       iPtr->filePtrArray[2] = filePtr;
+    } else if (index >= iPtr->numFiles) {
+       int newSize;
+       OpenFile **newPtrArray;
+       int i;
+
+       newSize = index+1;
+       newPtrArray = (OpenFile **) ckalloc((unsigned)
+               ((newSize)*sizeof(OpenFile *)));
+       memcpy((VOID *) newPtrArray, (VOID *) iPtr->filePtrArray,
+               iPtr->numFiles*sizeof(OpenFile *));
+       for (i = iPtr->numFiles; i < newSize; i++) {
+           newPtrArray[i] = NULL;
+       }
+       ckfree((char *) iPtr->filePtrArray);
+       iPtr->numFiles = newSize;
+       iPtr->filePtrArray = newPtrArray;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclGetOpenFile --
+ *
+ *     Given a string identifier for an open file, find the corresponding
+ *     open file structure, if there is one.
+ *
+ * Results:
+ *     A standard Tcl return value.  If the open file is successfully
+ *     located, *filePtrPtr is modified to point to its structure.
+ *     If TCL_ERROR is returned then interp->result contains an error
+ *     message.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TclGetOpenFile(interp, string, filePtrPtr)
+    Tcl_Interp *interp;                /* Interpreter in which to find file. */
+    char *string;              /* String that identifies file. */
+    OpenFile **filePtrPtr;     /* Address of word in which to store pointer
+                                * to structure about open file. */
+{
+    int fd = 0;                        /* Initial value needed only to stop compiler
+                                * warnings. */
+    Interp *iPtr = (Interp *) interp;
+
+    if ((string[0] == 'f') && (string[1] == 'i') && (string[2] == 'l')
+           & (string[3] == 'e')) {
+       char *end;
+
+       fd = strtoul(string+4, &end, 10);
+       if ((end == string+4) || (*end != 0)) {
+           goto badId;
+       }
+    } else if ((string[0] == 's') && (string[1] == 't')
+           && (string[2] == 'd')) {
+       if (strcmp(string+3, "in") == 0) {
+           fd = 0;
+       } else if (strcmp(string+3, "out") == 0) {
+           fd = 1;
+       } else if (strcmp(string+3, "err") == 0) {
+           fd = 2;
+       } else {
+           goto badId;
+       }
+    } else {
+       badId:
+       Tcl_AppendResult(interp, "bad file identifier \"", string,
+               "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if (fd >= iPtr->numFiles) {
+       if ((iPtr->numFiles == 0) && (fd <= 2)) {
+           TclMakeFileTable(iPtr, fd);
+       } else {
+           notOpen:
+           Tcl_AppendResult(interp, "file \"", string, "\" isn't open",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+    }
+    if (iPtr->filePtrArray[fd] == NULL) {
+       goto notOpen;
+    }
+    *filePtrPtr = iPtr->filePtrArray[fd];
+    return TCL_OK;
+}
+
+#ifdef MSDOS
+int
+filename2DOS(name)
+    char *name;
+{
+    for ( ; *name; name++) if (*name == '/') *name = '\\';
+}
+#endif
diff --git a/src/tcl/tclutil.c b/src/tcl/tclutil.c
new file mode 100644 (file)
index 0000000..13071c2
--- /dev/null
@@ -0,0 +1,1422 @@
+/* 
+ * tclUtil.c --
+ *
+ *     This file contains utility procedures that are used by many Tcl
+ *     commands.
+ *
+ * Copyright 1987-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclUtil.c,v 1.63 92/07/02 08:50:54 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tclint.h"
+
+/*
+ * The following values are used in the flags returned by Tcl_ScanElement
+ * and used by Tcl_ConvertElement.  The value TCL_DONT_USE_BRACES is also
+ * defined in tcl.h;  make sure its value doesn't overlap with any of the
+ * values below.
+ *
+ * TCL_DONT_USE_BRACES -       1 means the string mustn't be enclosed in
+ *                             braces (e.g. it contains unmatched braces,
+ *                             or ends in a backslash character, or user
+ *                             just doesn't want braces);  handle all
+ *                             special characters by adding backslashes.
+ * USE_BRACES -                        1 means the string contains a special
+ *                             character that can be handled simply by
+ *                             enclosing the entire argument in braces.
+ * BRACES_UNMATCHED -          1 means that braces aren't properly matched
+ *                             in the argument.
+ */
+
+#define USE_BRACES             2
+#define BRACES_UNMATCHED       4
+
+/*
+ * The variable below is set to NULL before invoking regexp functions
+ * and checked after those functions.  If an error occurred then regerror
+ * will set the variable to point to a (static) error message.  This
+ * mechanism unfortunately does not support multi-threading, but then
+ * neither does the rest of the regexp facilities.
+ */
+
+char *tclRegexpError = NULL;
+
+/*
+ * Function prototypes for local procedures in this file:
+ */
+
+static void            SetupAppendBuffer _ANSI_ARGS_((Interp *iPtr,
+                           int newSpace));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclFindElement --
+ *
+ *     Given a pointer into a Tcl list, locate the first (or next)
+ *     element in the list.
+ *
+ * Results:
+ *     The return value is normally TCL_OK, which means that the
+ *     element was successfully located.  If TCL_ERROR is returned
+ *     it means that list didn't have proper list structure;
+ *     interp->result contains a more detailed error message.
+ *
+ *     If TCL_OK is returned, then *elementPtr will be set to point
+ *     to the first element of list, and *nextPtr will be set to point
+ *     to the character just after any white space following the last
+ *     character that's part of the element.  If this is the last argument
+ *     in the list, then *nextPtr will point to the NULL character at the
+ *     end of list.  If sizePtr is non-NULL, *sizePtr is filled in with
+ *     the number of characters in the element.  If the element is in
+ *     braces, then *elementPtr will point to the character after the
+ *     opening brace and *sizePtr will not include either of the braces.
+ *     If there isn't an element in the list, *sizePtr will be zero, and
+ *     both *elementPtr and *termPtr will refer to the null character at
+ *     the end of list.  Note:  this procedure does NOT collapse backslash
+ *     sequences.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TclFindElement(interp, list, elementPtr, nextPtr, sizePtr, bracePtr)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    register char *list;       /* String containing Tcl list with zero
+                                * or more elements (possibly in braces). */
+    char **elementPtr;         /* Fill in with location of first significant
+                                * character in first element of list. */
+    char **nextPtr;            /* Fill in with location of character just
+                                * after all white space following end of
+                                * argument (i.e. next argument or end of
+                                * list). */
+    int *sizePtr;              /* If non-zero, fill in with size of
+                                * element. */
+    int *bracePtr;             /* If non-zero fill in with non-zero/zero
+                                * to indicate that arg was/wasn't
+                                * in braces. */
+{
+    register char *p;
+    int openBraces = 0;
+    int inQuotes = 0;
+    int size;
+
+    /*
+     * Skim off leading white space and check for an opening brace or
+     * quote.   Note:  use of "isascii" below and elsewhere in this
+     * procedure is a temporary workaround (7/27/90) because Mx uses characters
+     * with the high-order bit set for some things.  This should probably
+     * be changed back eventually, or all of Tcl should call isascii.
+     */
+
+    while (isascii(*list) && isspace(*list)) {
+       list++;
+    }
+    if (*list == '{') {
+       openBraces = 1;
+       list++;
+    } else if (*list == '"') {
+       inQuotes = 1;
+       list++;
+    }
+    if (bracePtr != 0) {
+       *bracePtr = openBraces;
+    }
+    p = list;
+
+    /*
+     * Find the end of the element (either a space or a close brace or
+     * the end of the string).
+     */
+
+    while (1) {
+       switch (*p) {
+
+           /*
+            * Open brace: don't treat specially unless the element is
+            * in braces.  In this case, keep a nesting count.
+            */
+
+           case '{':
+               if (openBraces != 0) {
+                   openBraces++;
+               }
+               break;
+
+           /*
+            * Close brace: if element is in braces, keep nesting
+            * count and quit when the last close brace is seen.
+            */
+
+           case '}':
+               if (openBraces == 1) {
+                   char *p2;
+
+                   size = p - list;
+                   p++;
+                   if ((isascii(*p) && isspace(*p)) || (*p == 0)) {
+                       goto done;
+                   }
+                   for (p2 = p; (*p2 != 0) && (!isspace(*p2)) && (p2 < p+20);
+                           p2++) {
+                       /* null body */
+                   }
+                   Tcl_ResetResult(interp);
+                   sprintf(interp->result,
+                           "list element in braces followed by \"%.*s\" instead of space",
+                           p2-p, p);
+                   return TCL_ERROR;
+               } else if (openBraces != 0) {
+                   openBraces--;
+               }
+               break;
+
+           /*
+            * Backslash:  skip over everything up to the end of the
+            * backslash sequence.
+            */
+
+           case '\\': {
+               int size;
+
+               (void) Tcl_Backslash(p, &size);
+               p += size - 1;
+               break;
+           }
+
+           /*
+            * Space: ignore if element is in braces or quotes;  otherwise
+            * terminate element.
+            */
+
+           case ' ':
+           case '\f':
+           case '\n':
+           case '\r':
+           case '\t':
+           case '\v':
+               if ((openBraces == 0) && !inQuotes) {
+                   size = p - list;
+                   goto done;
+               }
+               break;
+
+           /*
+            * Double-quote:  if element is in quotes then terminate it.
+            */
+
+           case '"':
+               if (inQuotes) {
+                   char *p2;
+
+                   size = p-list;
+                   p++;
+                   if ((isascii(*p) && isspace(*p)) || (*p == 0)) {
+                       goto done;
+                   }
+                   for (p2 = p; (*p2 != 0) && (!isspace(*p2)) && (p2 < p+20);
+                           p2++) {
+                       /* null body */
+                   }
+                   Tcl_ResetResult(interp);
+                   sprintf(interp->result,
+                           "list element in quotes followed by \"%.*s\" %s",
+                           p2-p, p, "instead of space");
+                   return TCL_ERROR;
+               }
+               break;
+
+           /*
+            * End of list:  terminate element.
+            */
+
+           case 0:
+               if (openBraces != 0) {
+                   Tcl_SetResult(interp, "unmatched open brace in list",
+                           TCL_STATIC);
+                   return TCL_ERROR;
+               } else if (inQuotes) {
+                   Tcl_SetResult(interp, "unmatched open quote in list",
+                           TCL_STATIC);
+                   return TCL_ERROR;
+               }
+               size = p - list;
+               goto done;
+
+       }
+       p++;
+    }
+
+    done:
+    while (isascii(*p) && isspace(*p)) {
+       p++;
+    }
+    *elementPtr = list;
+    *nextPtr = p;
+    if (sizePtr != 0) {
+       *sizePtr = size;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclCopyAndCollapse --
+ *
+ *     Copy a string and eliminate any backslashes that aren't in braces.
+ *
+ * Results:
+ *     There is no return value.  Count chars. get copied from src
+ *     to dst.  Along the way, if backslash sequences are found outside
+ *     braces, the backslashes are eliminated in the copy.
+ *     After scanning count chars. from source, a null character is
+ *     placed at the end of dst.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TclCopyAndCollapse(count, src, dst)
+    int count;                 /* Total number of characters to copy
+                                * from src. */
+    register char *src;                /* Copy from here... */
+    register char *dst;                /* ... to here. */
+{
+    register char c;
+    int numRead;
+
+    for (c = *src; count > 0; src++, c = *src, count--) {
+       if (c == '\\') {
+           *dst = Tcl_Backslash(src, &numRead);
+           if (*dst != 0) {
+               dst++;
+           }
+           src += numRead-1;
+           count -= numRead-1;
+       } else {
+           *dst = c;
+           dst++;
+       }
+    }
+    *dst = 0;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_SplitList --
+ *
+ *     Splits a list up into its constituent fields.
+ *
+ * Results
+ *     The return value is normally TCL_OK, which means that
+ *     the list was successfully split up.  If TCL_ERROR is
+ *     returned, it means that "list" didn't have proper list
+ *     structure;  interp->result will contain a more detailed
+ *     error message.
+ *
+ *     *argvPtr will be filled in with the address of an array
+ *     whose elements point to the elements of list, in order.
+ *     *argcPtr will get filled in with the number of valid elements
+ *     in the array.  A single block of memory is dynamically allocated
+ *     to hold both the argv array and a copy of the list (with
+ *     backslashes and braces removed in the standard way).
+ *     The caller must eventually free this memory by calling free()
+ *     on *argvPtr.  Note:  *argvPtr and *argcPtr are only modified
+ *     if the procedure returns normally.
+ *
+ * Side effects:
+ *     Memory is allocated.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_SplitList(interp, list, argcPtr, argvPtr)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    char *list;                        /* Pointer to string with list structure. */
+    int *argcPtr;              /* Pointer to location to fill in with
+                                * the number of elements in the list. */
+    char ***argvPtr;           /* Pointer to place to store pointer to array
+                                * of pointers to list elements. */
+{
+    char **argv;
+    register char *p;
+    int size, i, result, elSize, brace;
+    char *element;
+
+    /*
+     * Figure out how much space to allocate.  There must be enough
+     * space for both the array of pointers and also for a copy of
+     * the list.  To estimate the number of pointers needed, count
+     * the number of space characters in the list.
+     */
+
+    for (size = 1, p = list; *p != 0; p++) {
+       if (isspace(*p)) {
+           size++;
+       }
+    }
+    size++;                    /* Leave space for final NULL pointer. */
+    argv = (char **) ckalloc((unsigned)
+           ((size * sizeof(char *)) + (p - list) + 1));
+    for (i = 0, p = ((char *) argv) + size*sizeof(char *);
+           *list != 0; i++) {
+       result = TclFindElement(interp, list, &element, &list, &elSize, &brace);
+       if (result != TCL_OK) {
+           ckfree((char *) argv);
+           return result;
+       }
+       if (*element == 0) {
+           break;
+       }
+       if (i >= size) {
+           ckfree((char *) argv);
+           Tcl_SetResult(interp, "internal error in Tcl_SplitList",
+                   TCL_STATIC);
+           return TCL_ERROR;
+       }
+       argv[i] = p;
+       if (brace) {
+           strncpy(p, element, elSize);
+           p += elSize;
+           *p = 0;
+           p++;
+       } else {
+           TclCopyAndCollapse(elSize, element, p);
+           p += elSize+1;
+       }
+    }
+
+    argv[i] = NULL;
+    *argvPtr = argv;
+    *argcPtr = i;
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ScanElement --
+ *
+ *     This procedure is a companion procedure to Tcl_ConvertElement.
+ *     It scans a string to see what needs to be done to it (e.g.
+ *     add backslashes or enclosing braces) to make the string into
+ *     a valid Tcl list element.
+ *
+ * Results:
+ *     The return value is an overestimate of the number of characters
+ *     that will be needed by Tcl_ConvertElement to produce a valid
+ *     list element from string.  The word at *flagPtr is filled in
+ *     with a value needed by Tcl_ConvertElement when doing the actual
+ *     conversion.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_ScanElement(string, flagPtr)
+    char *string;              /* String to convert to Tcl list element. */
+    int *flagPtr;              /* Where to store information to guide
+                                * Tcl_ConvertElement. */
+{
+    int flags, nestingLevel;
+    register char *p;
+
+    /*
+     * This procedure and Tcl_ConvertElement together do two things:
+     *
+     * 1. They produce a proper list, one that will yield back the
+     * argument strings when evaluated or when disassembled with
+     * Tcl_SplitList.  This is the most important thing.
+     * 
+     * 2. They try to produce legible output, which means minimizing the
+     * use of backslashes (using braces instead).  However, there are
+     * some situations where backslashes must be used (e.g. an element
+     * like "{abc": the leading brace will have to be backslashed.  For
+     * each element, one of three things must be done:
+     *
+     * (a) Use the element as-is (it doesn't contain anything special
+     * characters).  This is the most desirable option.
+     *
+     * (b) Enclose the element in braces, but leave the contents alone.
+     * This happens if the element contains embedded space, or if it
+     * contains characters with special interpretation ($, [, ;, or \),
+     * or if it starts with a brace or double-quote, or if there are
+     * no characters in the element.
+     *
+     * (c) Don't enclose the element in braces, but add backslashes to
+     * prevent special interpretation of special characters.  This is a
+     * last resort used when the argument would normally fall under case
+     * (b) but contains unmatched braces.  It also occurs if the last
+     * character of the argument is a backslash.
+     *
+     * The procedure figures out how many bytes will be needed to store
+     * the result (actually, it overestimates).  It also collects information
+     * about the element in the form of a flags word.
+     */
+
+    nestingLevel = 0;
+    flags = 0;
+    p = string;
+    if ((*p == '{') || (*p == '"') || (*p == 0)) {
+       flags |= USE_BRACES;
+    }
+    for ( ; *p != 0; p++) {
+       switch (*p) {
+           case '{':
+               nestingLevel++;
+               break;
+           case '}':
+               nestingLevel--;
+               if (nestingLevel < 0) {
+                   flags |= TCL_DONT_USE_BRACES|BRACES_UNMATCHED;
+               }
+               break;
+           case '[':
+           case '$':
+           case ';':
+           case ' ':
+           case '\f':
+           case '\n':
+           case '\r':
+           case '\t':
+           case '\v':
+               flags |= USE_BRACES;
+               break;
+           case '\\':
+               if (p[1] == 0) {
+                   flags = TCL_DONT_USE_BRACES;
+               } else {
+                   int size;
+
+                   (void) Tcl_Backslash(p, &size);
+                   p += size-1;
+                   flags |= USE_BRACES;
+               }
+               break;
+       }
+    }
+    if (nestingLevel != 0) {
+       flags = TCL_DONT_USE_BRACES | BRACES_UNMATCHED;
+    }
+    *flagPtr = flags;
+
+    /*
+     * Allow enough space to backslash every character plus leave
+     * two spaces for braces.
+     */
+
+    return 2*(p-string) + 2;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ConvertElement --
+ *
+ *     This is a companion procedure to Tcl_ScanElement.  Given the
+ *     information produced by Tcl_ScanElement, this procedure converts
+ *     a string to a list element equal to that string.
+ *
+ * Results:
+ *     Information is copied to *dst in the form of a list element
+ *     identical to src (i.e. if Tcl_SplitList is applied to dst it
+ *     will produce a string identical to src).  The return value is
+ *     a count of the number of characters copied (not including the
+ *     terminating NULL character).
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_ConvertElement(src, dst, flags)
+    register char *src;                /* Source information for list element. */
+    char *dst;                 /* Place to put list-ified element. */
+    int flags;                 /* Flags produced by Tcl_ScanElement. */
+{
+    register char *p = dst;
+
+    /*
+     * See the comment block at the beginning of the Tcl_ScanElement
+     * code for details of how this works.
+     */
+
+    if ((flags & USE_BRACES) && !(flags & TCL_DONT_USE_BRACES)) {
+       *p = '{';
+       p++;
+       for ( ; *src != 0; src++, p++) {
+           *p = *src;
+       }
+       *p = '}';
+       p++;
+    } else if (*src == 0) {
+       /*
+        * If string is empty but can't use braces, then use special
+        * backslash sequence that maps to empty string.
+        */
+
+       p[0] = '\\';
+       p[1] = '0';
+       p += 2;
+    } else {
+       for (; *src != 0 ; src++) {
+           switch (*src) {
+               case ']':
+               case '[':
+               case '$':
+               case ';':
+               case ' ':
+               case '\\':
+               case '"':
+                   *p = '\\';
+                   p++;
+                   break;
+               case '{':
+               case '}':
+                   if (flags & BRACES_UNMATCHED) {
+                       *p = '\\';
+                       p++;
+                   }
+                   break;
+               case '\f':
+                   *p = '\\';
+                   p++;
+                   *p = 'f';
+                   p++;
+                   continue;
+               case '\n':
+                   *p = '\\';
+                   p++;
+                   *p = 'n';
+                   p++;
+                   continue;
+               case '\r':
+                   *p = '\\';
+                   p++;
+                   *p = 'r';
+                   p++;
+                   continue;
+               case '\t':
+                   *p = '\\';
+                   p++;
+                   *p = 't';
+                   p++;
+                   continue;
+               case '\v':
+                   *p = '\\';
+                   p++;
+                   *p = 'v';
+                   p++;
+                   continue;
+           }
+           *p = *src;
+           p++;
+       }
+    }
+    *p = '\0';
+    return p-dst;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_Merge --
+ *
+ *     Given a collection of strings, merge them together into a
+ *     single string that has proper Tcl list structured (i.e.
+ *     Tcl_SplitList may be used to retrieve strings equal to the
+ *     original elements, and Tcl_Eval will parse the string back
+ *     into its original elements).
+ *
+ * Results:
+ *     The return value is the address of a dynamically-allocated
+ *     string containing the merged list.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tcl_Merge(argc, argv)
+    int argc;                  /* How many strings to merge. */
+    char **argv;               /* Array of string values. */
+{
+#   define LOCAL_SIZE 20
+    int localFlags[LOCAL_SIZE], *flagPtr;
+    int numChars;
+    char *result;
+    register char *dst;
+    int i;
+
+    /*
+     * Pass 1: estimate space, gather flags.
+     */
+
+    if (argc <= LOCAL_SIZE) {
+       flagPtr = localFlags;
+    } else {
+       flagPtr = (int *) ckalloc((unsigned) argc*sizeof(int));
+    }
+    numChars = 1;
+    for (i = 0; i < argc; i++) {
+       numChars += Tcl_ScanElement(argv[i], &flagPtr[i]) + 1;
+    }
+
+    /*
+     * Pass two: copy into the result area.
+     */
+
+    result = (char *) ckalloc((unsigned) numChars);
+    dst = result;
+    for (i = 0; i < argc; i++) {
+       numChars = Tcl_ConvertElement(argv[i], dst, flagPtr[i]);
+       dst += numChars;
+       *dst = ' ';
+       dst++;
+    }
+    if (dst == result) {
+       *dst = 0;
+    } else {
+       dst[-1] = 0;
+    }
+
+    if (flagPtr != localFlags) {
+       ckfree((char *) flagPtr);
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_Concat --
+ *
+ *     Concatenate a set of strings into a single large string.
+ *
+ * Results:
+ *     The return value is dynamically-allocated string containing
+ *     a concatenation of all the strings in argv, with spaces between
+ *     the original argv elements.
+ *
+ * Side effects:
+ *     Memory is allocated for the result;  the caller is responsible
+ *     for freeing the memory.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tcl_Concat(argc, argv)
+    int argc;                  /* Number of strings to concatenate. */
+    char **argv;               /* Array of strings to concatenate. */
+{
+    int totalSize, i;
+    register char *p;
+    char *result;
+
+    for (totalSize = 1, i = 0; i < argc; i++) {
+       totalSize += strlen(argv[i]) + 1;
+    }
+    result = (char *) ckalloc((unsigned) totalSize);
+    if (argc == 0) {
+       *result = '\0';
+       return result;
+    }
+    for (p = result, i = 0; i < argc; i++) {
+       char *element;
+       int length;
+
+       /*
+        * Clip white space off the front and back of the string
+        * to generate a neater result, and ignore any empty
+        * elements.
+        */
+
+       element = argv[i];
+       while (isspace(*element)) {
+           element++;
+       }
+       for (length = strlen(element);
+               (length > 0) && (isspace(element[length-1]));
+               length--) {
+           /* Null loop body. */
+       }
+       if (length == 0) {
+           continue;
+       }
+       (void) strncpy(p, element, length);
+       p += length;
+       *p = ' ';
+       p++;
+    }
+    if (p != result) {
+       p[-1] = 0;
+    } else {
+       *p = 0;
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_StringMatch --
+ *
+ *     See if a particular string matches a particular pattern.
+ *
+ * Results:
+ *     The return value is 1 if string matches pattern, and
+ *     0 otherwise.  The matching operation permits the following
+ *     special characters in the pattern: *?\[] (see the manual
+ *     entry for details on what these mean).
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_StringMatch(string, pattern)
+    register char *string;     /* String. */
+    register char *pattern;    /* Pattern, which may contain
+                                * special characters. */
+{
+    char c2;
+
+    while (1) {
+       /* See if we're at the end of both the pattern and the string.
+        * If so, we succeeded.  If we're at the end of the pattern
+        * but not at the end of the string, we failed.
+        */
+       
+       if (*pattern == 0) {
+           if (*string == 0) {
+               return 1;
+           } else {
+               return 0;
+           }
+       }
+       if ((*string == 0) && (*pattern != '*')) {
+           return 0;
+       }
+
+       /* Check for a "*" as the next pattern character.  It matches
+        * any substring.  We handle this by calling ourselves
+        * recursively for each postfix of string, until either we
+        * match or we reach the end of the string.
+        */
+       
+       if (*pattern == '*') {
+           pattern += 1;
+           if (*pattern == 0) {
+               return 1;
+           }
+           while (1) {
+               if (Tcl_StringMatch(string, pattern)) {
+                   return 1;
+               }
+               if (*string == 0) {
+                   return 0;
+               }
+               string += 1;
+           }
+       }
+    
+       /* Check for a "?" as the next pattern character.  It matches
+        * any single character.
+        */
+
+       if (*pattern == '?') {
+           goto thisCharOK;
+       }
+
+       /* Check for a "[" as the next pattern character.  It is followed
+        * by a list of characters that are acceptable, or by a range
+        * (two characters separated by "-").
+        */
+       
+       if (*pattern == '[') {
+           pattern += 1;
+           while (1) {
+               if ((*pattern == ']') || (*pattern == 0)) {
+                   return 0;
+               }
+               if (*pattern == *string) {
+                   break;
+               }
+               if (pattern[1] == '-') {
+                   c2 = pattern[2];
+                   if (c2 == 0) {
+                       return 0;
+                   }
+                   if ((*pattern <= *string) && (c2 >= *string)) {
+                       break;
+                   }
+                   if ((*pattern >= *string) && (c2 <= *string)) {
+                       break;
+                   }
+                   pattern += 2;
+               }
+               pattern += 1;
+           }
+           while ((*pattern != ']') && (*pattern != 0)) {
+               pattern += 1;
+           }
+           goto thisCharOK;
+       }
+    
+       /* If the next pattern character is '/', just strip off the '/'
+        * so we do exact matching on the character that follows.
+        */
+       
+       if (*pattern == '\\') {
+           pattern += 1;
+           if (*pattern == 0) {
+               return 0;
+           }
+       }
+
+       /* There's no special character.  Just make sure that the next
+        * characters of each string match.
+        */
+       
+       if (*pattern != *string) {
+           return 0;
+       }
+
+       thisCharOK: pattern += 1;
+       string += 1;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_SetResult --
+ *
+ *     Arrange for "string" to be the Tcl return value.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     interp->result is left pointing either to "string" (if "copy" is 0)
+ *     or to a copy of string.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_SetResult(interp, string, freeProc)
+    Tcl_Interp *interp;                /* Interpreter with which to associate the
+                                * return value. */
+    char *string;              /* Value to be returned.  If NULL,
+                                * the result is set to an empty string. */
+    Tcl_FreeProc *freeProc;    /* Gives information about the string:
+                                * TCL_STATIC, TCL_VOLATILE, or the address
+                                * of a Tcl_FreeProc such as free. */
+{
+    register Interp *iPtr = (Interp *) interp;
+    int length;
+    Tcl_FreeProc *oldFreeProc = iPtr->freeProc;
+    char *oldResult = iPtr->result;
+
+    iPtr->freeProc = freeProc;
+    if (string == NULL) {
+       iPtr->resultSpace[0] = 0;
+       iPtr->result = iPtr->resultSpace;
+       iPtr->freeProc = 0;
+    } else if (freeProc == TCL_VOLATILE) {
+       length = strlen(string);
+       if (length > TCL_RESULT_SIZE) {
+           iPtr->result = (char *) ckalloc((unsigned) length+1);
+           iPtr->freeProc = (Tcl_FreeProc *) free;
+       } else {
+           iPtr->result = iPtr->resultSpace;
+           iPtr->freeProc = 0;
+       }
+       strcpy(iPtr->result, string);
+    } else {
+       iPtr->result = string;
+    }
+
+    /*
+     * If the old result was dynamically-allocated, free it up.  Do it
+     * here, rather than at the beginning, in case the new result value
+     * was part of the old result value.
+     */
+
+    if (oldFreeProc != 0) {
+       (*oldFreeProc)(oldResult);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_AppendResult --
+ *
+ *     Append a variable number of strings onto the result already
+ *     present for an interpreter.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The result in the interpreter given by the first argument
+ *     is extended by the strings given by the second and following
+ *     arguments (up to a terminating NULL argument).
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_AppendResult(Tcl_Interp *interp, ...)
+{
+    va_list argList;
+    register Interp *iPtr;
+    char *string;
+    int newSpace;
+
+    /*
+     * First, scan through all the arguments to see how much space is
+     * needed.
+     */
+
+    va_start(argList, interp);
+    iPtr = (Interp *)interp;
+    newSpace = 0;
+    while (1) {
+       string = va_arg(argList, char *);
+       if (string == NULL) {
+           break;
+       }
+       newSpace += strlen(string);
+    }
+    va_end(argList);
+
+    /*
+     * If the append buffer isn't already setup and large enough
+     * to hold the new data, set it up.
+     */
+
+    if ((iPtr->result != iPtr->appendResult)
+          || ((newSpace + iPtr->appendUsed) >= iPtr->appendAvl)) {
+       SetupAppendBuffer(iPtr, newSpace);
+    }
+
+    /*
+     * Final step:  go through all the argument strings again, copying
+     * them into the buffer.
+     */
+
+    va_start(argList, interp);
+    while (1) {
+       string = va_arg(argList, char *);
+       if (string == NULL) {
+           break;
+       }
+       strcpy(iPtr->appendResult + iPtr->appendUsed, string);
+       iPtr->appendUsed += strlen(string);
+    }
+    va_end(argList);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_AppendElement --
+ *
+ *     Convert a string to a valid Tcl list element and append it
+ *     to the current result (which is ostensibly a list).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The result in the interpreter given by the first argument
+ *     is extended with a list element converted from string.  If
+ *     the original result wasn't empty, then a blank is added before
+ *     the converted list element.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_AppendElement(interp, string, noSep)
+    Tcl_Interp *interp;                /* Interpreter whose result is to be
+                                * extended. */
+    char *string;              /* String to convert to list element and
+                                * add to result. */
+    int noSep;                 /* If non-zero, then don't output a
+                                * space character before this element,
+                                * even if the element isn't the first
+                                * thing in the output buffer. */
+{
+    register Interp *iPtr = (Interp *) interp;
+    int size, flags;
+    char *dst;
+
+    /*
+     * See how much space is needed, and grow the append buffer if
+     * needed to accommodate the list element.
+     */
+
+    size = Tcl_ScanElement(string, &flags) + 1;
+    if ((iPtr->result != iPtr->appendResult)
+          || ((size + iPtr->appendUsed) >= iPtr->appendAvl)) {
+       SetupAppendBuffer(iPtr, size+iPtr->appendUsed);
+    }
+
+    /*
+     * Convert the string into a list element and copy it to the
+     * buffer that's forming.
+     */
+
+    dst = iPtr->appendResult + iPtr->appendUsed;
+    if (!noSep && (iPtr->appendUsed != 0)) {
+       iPtr->appendUsed++;
+       *dst = ' ';
+       dst++;
+    }
+    iPtr->appendUsed += Tcl_ConvertElement(string, dst, flags);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * SetupAppendBuffer --
+ *
+ *     This procedure makes sure that there is an append buffer
+ *     properly initialized for interp, and that it has at least
+ *     enough room to accommodate newSpace new bytes of information.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+SetupAppendBuffer(iPtr, newSpace)
+    register Interp *iPtr;     /* Interpreter whose result is being set up. */
+    int newSpace;              /* Make sure that at least this many bytes
+                                * of new information may be added. */
+{
+    int totalSpace;
+
+    /*
+     * Make the append buffer larger, if that's necessary, then
+     * copy the current result into the append buffer and make the
+     * append buffer the official Tcl result.
+     */
+
+    if (iPtr->result != iPtr->appendResult) {
+       /*
+        * If an oversized buffer was used recently, then free it up
+        * so we go back to a smaller buffer.  This avoids tying up
+        * memory forever after a large operation.
+        */
+
+       if (iPtr->appendAvl > 500) {
+           ckfree(iPtr->appendResult);
+           iPtr->appendResult = NULL;
+           iPtr->appendAvl = 0;
+       }
+       iPtr->appendUsed = strlen(iPtr->result);
+    }
+    totalSpace = newSpace + iPtr->appendUsed;
+    if (totalSpace >= iPtr->appendAvl) {
+       char *new;
+
+       if (totalSpace < 100) {
+           totalSpace = 200;
+       } else {
+           totalSpace *= 2;
+       }
+       new = (char *) ckalloc((unsigned) totalSpace);
+       strcpy(new, iPtr->result);
+       if (iPtr->appendResult != NULL) {
+           ckfree(iPtr->appendResult);
+       }
+       iPtr->appendResult = new;
+       iPtr->appendAvl = totalSpace;
+    } else if (iPtr->result != iPtr->appendResult) {
+       strcpy(iPtr->appendResult, iPtr->result);
+    }
+    Tcl_FreeResult(iPtr);
+    iPtr->result = iPtr->appendResult;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ResetResult --
+ *
+ *     This procedure restores the result area for an interpreter
+ *     to its default initialized state, freeing up any memory that
+ *     may have been allocated for the result and clearing any
+ *     error information for the interpreter.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_ResetResult(interp)
+    Tcl_Interp *interp;                /* Interpreter for which to clear result. */
+{
+    register Interp *iPtr = (Interp *) interp;
+
+    Tcl_FreeResult(iPtr);
+    iPtr->result = iPtr->resultSpace;
+    iPtr->resultSpace[0] = 0;
+    iPtr->flags &=
+           ~(ERR_ALREADY_LOGGED | ERR_IN_PROGRESS | ERROR_CODE_SET);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_SetErrorCode --
+ *
+ *     This procedure is called to record machine-readable information
+ *     about an error that is about to be returned.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The errorCode global variable is modified to hold all of the
+ *     arguments to this procedure, in a list form with each argument
+ *     becoming one element of the list.  A flag is set internally
+ *     to remember that errorCode has been set, so the variable doesn't
+ *     get set automatically when the error is returned.
+ *
+ *----------------------------------------------------------------------
+ */
+void
+Tcl_SetErrorCode(Tcl_Interp *interp, ...)
+{
+    va_list argList;
+    char *string;
+    int flags;
+    Interp *iPtr;
+
+    /*
+     * Scan through the arguments one at a time, appending them to
+     * $errorCode as list elements.
+     */
+
+    va_start(argList, interp);
+    iPtr = (Interp *)interp;
+    flags = TCL_GLOBAL_ONLY | TCL_LIST_ELEMENT;
+    while (1) {
+       string = va_arg(argList, char *);
+       if (string == NULL) {
+           break;
+       }
+       (void) Tcl_SetVar2((Tcl_Interp *) iPtr, "errorCode",
+               (char *) NULL, string, flags);
+       flags |= TCL_APPEND_VALUE;
+    }
+    va_end(argList);
+    iPtr->flags |= ERROR_CODE_SET;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclGetListIndex --
+ *
+ *     Parse a list index, which may be either an integer or the
+ *     value "end".
+ *
+ * Results:
+ *     The return value is either TCL_OK or TCL_ERROR.  If it is
+ *     TCL_OK, then the index corresponding to string is left in
+ *     *indexPtr.  If the return value is TCL_ERROR, then string
+ *     was bogus;  an error message is returned in interp->result.
+ *     If a negative index is specified, it is rounded up to 0.
+ *     The index value may be larger than the size of the list
+ *     (this happens when "end" is specified).
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TclGetListIndex(interp, string, indexPtr)
+    Tcl_Interp *interp;                        /* Interpreter for error reporting. */
+    char *string;                      /* String containing list index. */
+    int *indexPtr;                     /* Where to store index. */
+{
+    if (isdigit(*string) || (*string == '-')) {
+       if (Tcl_GetInt(interp, string, indexPtr) != TCL_OK) {
+           return TCL_ERROR;
+       }
+       if (*indexPtr < 0) {
+           *indexPtr = 0;
+       }
+    } else if (strncmp(string, "end", strlen(string)) == 0) {
+       *indexPtr = 1<<30;
+    } else {
+       Tcl_AppendResult(interp, "bad index \"", string,
+               "\": must be integer or \"end\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclCompileRegexp --
+ *
+ *     Compile a regular expression into a form suitable for fast
+ *     matching.  This procedure retains a small cache of pre-compiled
+ *     regular expressions in the interpreter, in order to avoid
+ *     compilation costs as much as possible.
+ *
+ * Results:
+ *     The return value is a pointer to the compiled form of string,
+ *     suitable for passing to regexec.  If an error occurred while
+ *     compiling the pattern, then NULL is returned and an error
+ *     message is left in interp->result.
+ *
+ * Side effects:
+ *     The cache of compiled regexp's in interp will be modified to
+ *     hold information for string, if such information isn't already
+ *     present in the cache.
+ *
+ *----------------------------------------------------------------------
+ */
+
+regexp *
+TclCompileRegexp(interp, string)
+    Tcl_Interp *interp;                        /* For use in error reporting. */
+    char *string;                      /* String for which to produce
+                                        * compiled regular expression. */
+{
+    register Interp *iPtr = (Interp *) interp;
+    int i, length;
+    regexp *result;
+
+    length = strlen(string);
+    for (i = 0; i < NUM_REGEXPS; i++) {
+       if ((length == iPtr->patLengths[i])
+               && (strcmp(string, iPtr->patterns[i]) == 0)) {
+           /*
+            * Move the matched pattern to the first slot in the
+            * cache and shift the other patterns down one position.
+            */
+
+           if (i != 0) {
+               int j;
+               char *cachedString;
+
+               cachedString = iPtr->patterns[i];
+               result = iPtr->regexps[i];
+               for (j = i-1; j >= 0; j--) {
+                   iPtr->patterns[j+1] = iPtr->patterns[j];
+                   iPtr->patLengths[j+1] = iPtr->patLengths[j];
+                   iPtr->regexps[j+1] = iPtr->regexps[j];
+               }
+               iPtr->patterns[0] = cachedString;
+               iPtr->patLengths[0] = length;
+               iPtr->regexps[0] = result;
+           }
+           return iPtr->regexps[0];
+       }
+    }
+
+    /*
+     * No match in the cache.  Compile the string and add it to the
+     * cache.
+     */
+
+    tclRegexpError = NULL;
+    result = regcomp(string);
+    if (tclRegexpError != NULL) {
+       Tcl_AppendResult(interp,
+           "couldn't compile regular expression pattern: ",
+           tclRegexpError, (char *) NULL);
+       return NULL;
+    }
+    if (iPtr->patterns[NUM_REGEXPS-1] != NULL) {
+       ckfree(iPtr->patterns[NUM_REGEXPS-1]);
+       ckfree((char *) iPtr->regexps[NUM_REGEXPS-1]);
+    }
+    for (i = NUM_REGEXPS - 2; i >= 0; i--) {
+       iPtr->patterns[i+1] = iPtr->patterns[i];
+       iPtr->patLengths[i+1] = iPtr->patLengths[i];
+       iPtr->regexps[i+1] = iPtr->regexps[i];
+    }
+    iPtr->patterns[0] = (char *) ckalloc((unsigned) (length+1));
+    strcpy(iPtr->patterns[0], string);
+    iPtr->patLengths[0] = length;
+    iPtr->regexps[0] = result;
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * regerror --
+ *
+ *     This procedure is invoked by the Henry Spencer's regexp code
+ *     when an error occurs.  It saves the error message so it can
+ *     be seen by the code that called Spencer's code.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The value of "string" is saved in "tclRegexpError".
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+regerror(string)
+    char *string;                      /* Error message. */
+{
+    tclRegexpError = string;
+}
diff --git a/src/tcl/tclvar.c b/src/tcl/tclvar.c
new file mode 100644 (file)
index 0000000..63849f1
--- /dev/null
@@ -0,0 +1,2265 @@
+/* 
+ * tclVar.c --
+ *
+ *     This file contains routines that implement Tcl variables
+ *     (both scalars and arrays).
+ *
+ *     The implementation of arrays is modelled after an initial
+ *     implementation by Karl Lehenbauer, Mark Diekhans and
+ *     Peter da Silva.
+ *
+ * Copyright 1987-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclVar.c,v 1.27 92/05/07 09:24:59 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tclint.h"
+
+/*
+ * The strings below are used to indicate what went wrong when a
+ * variable access is denied.
+ */
+
+static char *noSuchVar =       "no such variable";
+static char *isArray =         "variable is array";
+static char *needArray =       "variable isn't array";
+static char *noSuchElement =   "no such element in array";
+static char *traceActive =     "trace is active on variable";
+
+/*
+ * Forward references to procedures defined later in this file:
+ */
+
+static  char *         CallTraces _ANSI_ARGS_((Interp *iPtr, Var *arrayPtr,
+                           Tcl_HashEntry *hPtr, char *name1, char *name2,
+                           int flags));
+static void            DeleteSearches _ANSI_ARGS_((Var *arrayVarPtr));
+static void            DeleteArray _ANSI_ARGS_((Interp *iPtr, char *arrayName,
+                           Var *varPtr, int flags));
+static Var *           NewVar _ANSI_ARGS_((int space));
+static ArraySearch *   ParseSearchId _ANSI_ARGS_((Tcl_Interp *interp,
+                           Var *varPtr, char *varName, char *string));
+static void            VarErrMsg _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *name1, char *name2, char *operation,
+                           char *reason));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_GetVar --
+ *
+ *     Return the value of a Tcl variable.
+ *
+ * Results:
+ *     The return value points to the current value of varName.  If
+ *     the variable is not defined or can't be read because of a clash
+ *     in array usage then a NULL pointer is returned and an error
+ *     message is left in interp->result if the TCL_LEAVE_ERR_MSG
+ *     flag is set.  Note:  the return value is only valid up until
+ *     the next call to Tcl_SetVar or Tcl_SetVar2;  if you depend on
+ *     the value lasting longer than that, then make yourself a private
+ *     copy.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tcl_GetVar(interp, varName, flags)
+    Tcl_Interp *interp;                /* Command interpreter in which varName is
+                                * to be looked up. */
+    char *varName;             /* Name of a variable in interp. */
+    int flags;                 /* OR-ed combination of TCL_GLOBAL_ONLY
+                                * or TCL_LEAVE_ERR_MSG bits. */
+{
+    register char *p;
+
+    /*
+     * If varName refers to an array (it ends with a parenthesized
+     * element name), then handle it specially.
+     */
+
+    for (p = varName; *p != '\0'; p++) {
+       if (*p == '(') {
+           char *result;
+           char *open = p;
+
+           do {
+               p++;
+           } while (*p != '\0');
+           p--;
+           if (*p != ')') {
+               goto scalar;
+           }
+           *open = '\0';
+           *p = '\0';
+           result = Tcl_GetVar2(interp, varName, open + 1, flags);
+           *open = '(';
+           *p = ')';
+#ifdef sgi
+           strcmp("a", "b"); /* XXX SGI compiler optimizer bug */
+#endif
+           return result;
+       }
+    }
+
+    scalar:
+    return Tcl_GetVar2(interp, varName, (char *) NULL, flags);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_GetVar2 --
+ *
+ *     Return the value of a Tcl variable, given a two-part name
+ *     consisting of array name and element within array.
+ *
+ * Results:
+ *     The return value points to the current value of the variable
+ *     given by name1 and name2.  If the specified variable doesn't
+ *     exist, or if there is a clash in array usage, then NULL is
+ *     returned and a message will be left in interp->result if the
+ *     TCL_LEAVE_ERR_MSG flag is set.  Note:  the return value is
+ *     only valid up until the next call to Tcl_SetVar or Tcl_SetVar2;
+ *     if you depend on the value lasting longer than that, then make
+ *     yourself a private copy.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tcl_GetVar2(interp, name1, name2, flags)
+    Tcl_Interp *interp;                /* Command interpreter in which variable is
+                                * to be looked up. */
+    char *name1;               /* Name of array (if name2 is NULL) or
+                                * name of variable. */
+    char *name2;               /* If non-null, gives name of element in
+                                * array. */
+    int flags;                 /* OR-ed combination of TCL_GLOBAL_ONLY
+                                * or TCL_LEAVE_ERR_MSG bits. */
+{
+    Tcl_HashEntry *hPtr;
+    Var *varPtr;
+    Interp *iPtr = (Interp *) interp;
+    Var *arrayPtr = NULL;
+
+    /*
+     * Lookup the first name.
+     */
+
+    if ((flags & TCL_GLOBAL_ONLY) || (iPtr->varFramePtr == NULL)) {
+       hPtr = Tcl_FindHashEntry(&iPtr->globalTable, name1);
+    } else {
+       hPtr = Tcl_FindHashEntry(&iPtr->varFramePtr->varTable, name1);
+    }
+    if (hPtr == NULL) {
+       if (flags & TCL_LEAVE_ERR_MSG) {
+           VarErrMsg(interp, name1, name2, "read", noSuchVar);
+       }
+       return NULL;
+    }
+    varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    if (varPtr->flags & VAR_UPVAR) {
+       hPtr = varPtr->value.upvarPtr;
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    }
+
+    /*
+     * If this is an array reference, then remember the traces on the array
+     * and lookup the element within the array.
+     */
+
+    if (name2 != NULL) {
+       if (varPtr->flags & VAR_UNDEFINED) {
+           if (flags & TCL_LEAVE_ERR_MSG) {
+               VarErrMsg(interp, name1, name2, "read", noSuchVar);
+           }
+           return NULL;
+       } else if (!(varPtr->flags & VAR_ARRAY)) {
+           if (flags & TCL_LEAVE_ERR_MSG) {
+               VarErrMsg(interp, name1, name2, "read", needArray);
+           }
+           return NULL;
+       }
+       arrayPtr = varPtr;
+       hPtr = Tcl_FindHashEntry(varPtr->value.tablePtr, name2);
+       if (hPtr == NULL) {
+           if (flags & TCL_LEAVE_ERR_MSG) {
+               VarErrMsg(interp, name1, name2, "read", noSuchElement);
+           }
+           return NULL;
+       }
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    }
+
+    /*
+     * Invoke any traces that have been set for the variable.
+     */
+
+    if ((varPtr->tracePtr != NULL)
+           || ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
+       char *msg;
+
+       msg = CallTraces(iPtr, arrayPtr, hPtr, name1, name2,
+               (flags & TCL_GLOBAL_ONLY) | TCL_TRACE_READS);
+       if (msg != NULL) {
+           VarErrMsg(interp, name1, name2, "read", msg);
+           return NULL;
+       }
+
+       /*
+        * Watch out!  The variable could have gotten re-allocated to
+        * a larger size.  Fortunately the hash table entry will still
+        * be around.
+        */
+
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    }
+    if (varPtr->flags & (VAR_UNDEFINED|VAR_UPVAR|VAR_ARRAY)) {
+       if (flags & TCL_LEAVE_ERR_MSG) {
+           VarErrMsg(interp, name1, name2, "read", noSuchVar);
+       }
+       return NULL;
+    }
+    return varPtr->value.string;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_SetVar --
+ *
+ *     Change the value of a variable.
+ *
+ * Results:
+ *     Returns a pointer to the malloc'ed string holding the new
+ *     value of the variable.  The caller should not modify this
+ *     string.  If the write operation was disallowed then NULL
+ *     is returned;  if the TCL_LEAVE_ERR_MSG flag is set, then
+ *     an explanatory message will be left in interp->result.
+ *
+ * Side effects:
+ *     If varName is defined as a local or global variable in interp,
+ *     its value is changed to newValue.  If varName isn't currently
+ *     defined, then a new global variable by that name is created.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tcl_SetVar(interp, varName, newValue, flags)
+    Tcl_Interp *interp;                /* Command interpreter in which varName is
+                                * to be looked up. */
+    char *varName;             /* Name of a variable in interp. */
+    char *newValue;            /* New value for varName. */
+    int flags;                 /* Various flags that tell how to set value:
+                                * any of TCL_GLOBAL_ONLY, TCL_APPEND_VALUE,
+                                * TCL_LIST_ELEMENT, TCL_NO_SPACE, or
+                                * TCL_LEAVE_ERR_MSG. */
+{
+    register char *p;
+
+    /*
+     * If varName refers to an array (it ends with a parenthesized
+     * element name), then handle it specially.
+     */
+
+    for (p = varName; *p != '\0'; p++) {
+       if (*p == '(') {
+           char *result;
+           char *open = p;
+
+           do {
+               p++;
+           } while (*p != '\0');
+           p--;
+           if (*p != ')') {
+               goto scalar;
+           }
+           *open = '\0';
+           *p = '\0';
+           result = Tcl_SetVar2(interp, varName, open+1, newValue, flags);
+           *open = '(';
+           *p = ')';
+           return result;
+       }
+    }
+
+    scalar:
+    return Tcl_SetVar2(interp, varName, (char *) NULL, newValue, flags);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_SetVar2 --
+ *
+ *     Given a two-part variable name, which may refer either to a
+ *     scalar variable or an element of an array, change the value
+ *     of the variable.  If the named scalar or array or element
+ *     doesn't exist then create one.
+ *
+ * Results:
+ *     Returns a pointer to the malloc'ed string holding the new
+ *     value of the variable.  The caller should not modify this
+ *     string.  If the write operation was disallowed because an
+ *     array was expected but not found (or vice versa), then NULL
+ *     is returned;  if the TCL_LEAVE_ERR_MSG flag is set, then
+ *     an explanatory message will be left in interp->result.
+ *
+ * Side effects:
+ *     The value of the given variable is set.  If either the array
+ *     or the entry didn't exist then a new one is created.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tcl_SetVar2(interp, name1, name2, newValue, flags)
+    Tcl_Interp *interp;                /* Command interpreter in which variable is
+                                * to be looked up. */
+    char *name1;               /* If name2 is NULL, this is name of scalar
+                                * variable.  Otherwise it is name of array. */
+    char *name2;               /* Name of an element within array, or NULL. */
+    char *newValue;            /* New value for variable. */
+    int flags;                 /* Various flags that tell how to set value:
+                                * any of TCL_GLOBAL_ONLY, TCL_APPEND_VALUE,
+                                * TCL_LIST_ELEMENT, and TCL_NO_SPACE, or
+                                * TCL_LEAVE_ERR_MSG . */
+{
+    Tcl_HashEntry *hPtr;
+    register Var *varPtr = NULL;
+                               /* Initial value only used to stop compiler
+                                * from complaining; not really needed. */
+    register Interp *iPtr = (Interp *) interp;
+    int length, new, listFlags;
+    Var *arrayPtr = NULL;
+
+    /*
+     * Lookup the first name.
+     */
+
+    if ((flags & TCL_GLOBAL_ONLY) || (iPtr->varFramePtr == NULL)) {
+       hPtr = Tcl_CreateHashEntry(&iPtr->globalTable, name1, &new);
+    } else {
+       hPtr = Tcl_CreateHashEntry(&iPtr->varFramePtr->varTable,
+               name1, &new);
+    }
+    if (!new) {
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+       if (varPtr->flags & VAR_UPVAR) {
+           hPtr = varPtr->value.upvarPtr;
+           varPtr = (Var *) Tcl_GetHashValue(hPtr);
+       }
+    }
+
+    /*
+     * If this is an array reference, then create a new array (if
+     * needed), remember any traces on the array, and lookup the
+     * element within the array.
+     */
+
+    if (name2 != NULL) {
+       if (new) {
+           varPtr = NewVar(0);
+           Tcl_SetHashValue(hPtr, varPtr);
+           varPtr->flags = VAR_ARRAY;
+           varPtr->value.tablePtr = (Tcl_HashTable *)
+                   ckalloc(sizeof(Tcl_HashTable));
+           Tcl_InitHashTable(varPtr->value.tablePtr, TCL_STRING_KEYS);
+       } else {
+           if (varPtr->flags & VAR_UNDEFINED) {
+               varPtr->flags = VAR_ARRAY;
+               varPtr->value.tablePtr = (Tcl_HashTable *)
+                       ckalloc(sizeof(Tcl_HashTable));
+               Tcl_InitHashTable(varPtr->value.tablePtr, TCL_STRING_KEYS);
+           } else if (!(varPtr->flags & VAR_ARRAY)) {
+               if (flags & TCL_LEAVE_ERR_MSG) {
+                   VarErrMsg(interp, name1, name2, "set", needArray);
+               }
+               return NULL;
+           }
+           arrayPtr = varPtr;
+       }
+       hPtr = Tcl_CreateHashEntry(varPtr->value.tablePtr, name2, &new);
+    }
+
+    /*
+     * Compute how many bytes will be needed for newValue (leave space
+     * for a separating space between list elements).
+     */
+
+    if (flags & TCL_LIST_ELEMENT) {
+       length = Tcl_ScanElement(newValue, &listFlags) + 1;
+    } else {
+       length = strlen(newValue);
+    }
+
+    /*
+     * If the variable doesn't exist then create a new one.  If it
+     * does exist then clear its current value unless this is an
+     * append operation.
+     */
+
+    if (new) {
+       varPtr = NewVar(length);
+       Tcl_SetHashValue(hPtr, varPtr);
+       if ((arrayPtr != NULL) && (arrayPtr->searchPtr != NULL)) {
+           DeleteSearches(arrayPtr);
+       }
+    } else {
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+       if (varPtr->flags & VAR_ARRAY) {
+           if (flags & TCL_LEAVE_ERR_MSG) {
+               VarErrMsg(interp, name1, name2, "set", isArray);
+           }
+           return NULL;
+       }
+       if (!(flags & TCL_APPEND_VALUE) || (varPtr->flags & VAR_UNDEFINED)) {
+           varPtr->valueLength = 0;
+       }
+    }
+
+    /*
+     * Make sure there's enough space to hold the variable's
+     * new value.  If not, enlarge the variable's space.
+     */
+
+    if ((length + varPtr->valueLength) >= varPtr->valueSpace) {
+       Var *newVarPtr;
+       int newSize;
+
+       newSize = 2*varPtr->valueSpace;
+       if (newSize <= (length + varPtr->valueLength)) {
+           newSize += length;
+       }
+       newVarPtr = NewVar(newSize);
+       newVarPtr->valueLength = varPtr->valueLength;
+       newVarPtr->upvarUses = varPtr->upvarUses;
+       newVarPtr->tracePtr = varPtr->tracePtr;
+       strcpy(newVarPtr->value.string, varPtr->value.string);
+       Tcl_SetHashValue(hPtr, newVarPtr);
+       ckfree((char *) varPtr);
+       varPtr = newVarPtr;
+    }
+
+    /*
+     * Append the new value to the variable, either as a list
+     * element or as a string.
+     */
+
+    if (flags & TCL_LIST_ELEMENT) {
+       if ((varPtr->valueLength > 0) && !(flags & TCL_NO_SPACE)) {
+           varPtr->value.string[varPtr->valueLength] = ' ';
+           varPtr->valueLength++;
+       }
+       varPtr->valueLength += Tcl_ConvertElement(newValue,
+               varPtr->value.string + varPtr->valueLength, listFlags);
+       varPtr->value.string[varPtr->valueLength] = 0;
+    } else {
+       strcpy(varPtr->value.string + varPtr->valueLength, newValue);
+       varPtr->valueLength += length;
+    }
+    varPtr->flags &= ~VAR_UNDEFINED;
+
+    /*
+     * Invoke any write traces for the variable.
+     */
+
+    if ((varPtr->tracePtr != NULL)
+           || ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
+       char *msg;
+
+       msg = CallTraces(iPtr, arrayPtr, hPtr, name1, name2,
+               (flags & TCL_GLOBAL_ONLY) | TCL_TRACE_WRITES);
+       if (msg != NULL) {
+           VarErrMsg(interp, name1, name2, "set", msg);
+           return NULL;
+       }
+
+       /*
+        * Watch out!  The variable could have gotten re-allocated to
+        * a larger size.  Fortunately the hash table entry will still
+        * be around.
+        */
+
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    }
+    return varPtr->value.string;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_UnsetVar --
+ *
+ *     Delete a variable, so that it may not be accessed anymore.
+ *
+ * Results:
+ *     Returns 0 if the variable was successfully deleted, -1
+ *     if the variable can't be unset.  In the event of an error,
+ *     if the TCL_LEAVE_ERR_MSG flag is set then an error message
+ *     is left in interp->result.
+ *
+ * Side effects:
+ *     If varName is defined as a local or global variable in interp,
+ *     it is deleted.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_UnsetVar(interp, varName, flags)
+    Tcl_Interp *interp;                /* Command interpreter in which varName is
+                                * to be looked up. */
+    char *varName;             /* Name of a variable in interp.  May be
+                                * either a scalar name or an array name
+                                * or an element in an array. */
+    int flags;                 /* OR-ed combination of any of
+                                * TCL_GLOBAL_ONLY or TCL_LEAVE_ERR_MSG. */
+{
+    register char *p;
+    int result;
+
+    /*
+     * Figure out whether this is an array reference, then call
+     * Tcl_UnsetVar2 to do all the real work.
+     */
+
+    for (p = varName; *p != '\0'; p++) {
+       if (*p == '(') {
+           char *open = p;
+
+           do {
+               p++;
+           } while (*p != '\0');
+           p--;
+           if (*p != ')') {
+               goto scalar;
+           }
+           *open = '\0';
+           *p = '\0';
+           result = Tcl_UnsetVar2(interp, varName, open+1, flags);
+           *open = '(';
+           *p = ')';
+           return result;
+       }
+    }
+
+    scalar:
+    return Tcl_UnsetVar2(interp, varName, (char *) NULL, flags);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_UnsetVar2 --
+ *
+ *     Delete a variable, given a 2-part name.
+ *
+ * Results:
+ *     Returns 0 if the variable was successfully deleted, -1
+ *     if the variable can't be unset.  In the event of an error,
+ *     if the TCL_LEAVE_ERR_MSG flag is set then an error message
+ *     is left in interp->result.
+ *
+ * Side effects:
+ *     If name1 and name2 indicate a local or global variable in interp,
+ *     it is deleted.  If name1 is an array name and name2 is NULL, then
+ *     the whole array is deleted.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_UnsetVar2(interp, name1, name2, flags)
+    Tcl_Interp *interp;                /* Command interpreter in which varName is
+                                * to be looked up. */
+    char *name1;               /* Name of variable or array. */
+    char *name2;               /* Name of element within array or NULL. */
+    int flags;                 /* OR-ed combination of any of
+                                * TCL_GLOBAL_ONLY or TCL_LEAVE_ERR_MSG. */
+{
+    Tcl_HashEntry *hPtr, dummyEntry;
+    Var *varPtr, dummyVar;
+    Interp *iPtr = (Interp *) interp;
+    Var *arrayPtr = NULL;
+
+    if ((flags & TCL_GLOBAL_ONLY) || (iPtr->varFramePtr == NULL)) {
+       hPtr = Tcl_FindHashEntry(&iPtr->globalTable, name1);
+    } else {
+       hPtr = Tcl_FindHashEntry(&iPtr->varFramePtr->varTable, name1);
+    }
+    if (hPtr == NULL) {
+       if (flags & TCL_LEAVE_ERR_MSG) {
+           VarErrMsg(interp, name1, name2, "unset", noSuchVar);
+       }
+       return -1;
+    }
+    varPtr = (Var *) Tcl_GetHashValue(hPtr);
+
+    /*
+     * For global variables referenced in procedures, leave the procedure's
+     * reference variable in place, but unset the global variable.  Can't
+     * decrement the actual variable's use count, since we didn't delete
+     * the reference variable.
+     */
+
+    if (varPtr->flags & VAR_UPVAR) {
+       hPtr = varPtr->value.upvarPtr;
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    }
+
+    /*
+     * If the variable being deleted is an element of an array, then
+     * remember trace procedures on the overall array and find the
+     * element to delete.
+     */
+
+    if (name2 != NULL) {
+       if (!(varPtr->flags & VAR_ARRAY)) {
+           if (flags & TCL_LEAVE_ERR_MSG) {
+               VarErrMsg(interp, name1, name2, "unset", needArray);
+           }
+           return -1;
+       }
+       if (varPtr->searchPtr != NULL) {
+           DeleteSearches(varPtr);
+       }
+       arrayPtr = varPtr;
+       hPtr = Tcl_FindHashEntry(varPtr->value.tablePtr, name2);
+       if (hPtr == NULL) {
+           if (flags & TCL_LEAVE_ERR_MSG) {
+               VarErrMsg(interp, name1, name2, "unset", noSuchElement);
+           }
+           return -1;
+       }
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    }
+
+    /*
+     * If there is a trace active on this variable or if the variable
+     * is already being deleted then don't delete the variable:  it
+     * isn't safe, since there are procedures higher up on the stack
+     * that will use pointers to the variable.  Also don't delete an
+     * array if there are traces active on any of its elements.
+     */
+
+    if (varPtr->flags &
+           (VAR_TRACE_ACTIVE|VAR_ELEMENT_ACTIVE)) {
+       if (flags & TCL_LEAVE_ERR_MSG) {
+           VarErrMsg(interp, name1, name2, "unset", traceActive);
+       }
+       return -1;
+    }
+
+    /*
+     * The code below is tricky, because of the possibility that
+     * a trace procedure might try to access a variable being
+     * deleted.  To handle this situation gracefully, copy the
+     * contents of the variable and its hash table entry to
+     * dummy variables, then clean up the actual variable so that
+     * it's been completely deleted before the traces are called.
+     * Then call the traces, and finally clean up the variable's
+     * storage using the dummy copies.
+     */
+
+    dummyVar = *varPtr;
+    Tcl_SetHashValue(&dummyEntry, &dummyVar);
+    if (varPtr->upvarUses == 0) {
+       Tcl_DeleteHashEntry(hPtr);
+       ckfree((char *) varPtr);
+    } else {
+       varPtr->flags = VAR_UNDEFINED;
+       varPtr->tracePtr = NULL;
+    }
+
+    /*
+     * Call trace procedures for the variable being deleted and delete
+     * its traces.
+     */
+
+    if ((dummyVar.tracePtr != NULL)
+           || ((arrayPtr != NULL) && (arrayPtr->tracePtr != NULL))) {
+       (void) CallTraces(iPtr, arrayPtr, &dummyEntry, name1, name2,
+               (flags & TCL_GLOBAL_ONLY) | TCL_TRACE_UNSETS);
+       while (dummyVar.tracePtr != NULL) {
+           VarTrace *tracePtr = dummyVar.tracePtr;
+           dummyVar.tracePtr = tracePtr->nextPtr;
+           ckfree((char *) tracePtr);
+       }
+    }
+
+    /*
+     * If the variable is an array, delete all of its elements.  This
+     * must be done after calling the traces on the array, above (that's
+     * the way traces are defined).
+     */
+
+    if (dummyVar.flags & VAR_ARRAY) {
+       DeleteArray(iPtr, name1, &dummyVar,
+           (flags & TCL_GLOBAL_ONLY) | TCL_TRACE_UNSETS);
+    }
+    if (dummyVar.flags & VAR_UNDEFINED) {
+       if (flags & TCL_LEAVE_ERR_MSG) {
+           VarErrMsg(interp, name1, name2, "unset", 
+                   (name2 == NULL) ? noSuchVar : noSuchElement);
+       }
+       return -1;
+    }
+    return 0;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_TraceVar --
+ *
+ *     Arrange for reads and/or writes to a variable to cause a
+ *     procedure to be invoked, which can monitor the operations
+ *     and/or change their actions.
+ *
+ * Results:
+ *     A standard Tcl return value.
+ *
+ * Side effects:
+ *     A trace is set up on the variable given by varName, such that
+ *     future references to the variable will be intermediated by
+ *     proc.  See the manual entry for complete details on the calling
+ *     sequence for proc.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_TraceVar(interp, varName, flags, proc, clientData)
+    Tcl_Interp *interp;                /* Interpreter in which variable is
+                                * to be traced. */
+    char *varName;             /* Name of variable;  may end with "(index)"
+                                * to signify an array reference. */
+    int flags;                 /* OR-ed collection of bits, including any
+                                * of TCL_TRACE_READS, TCL_TRACE_WRITES,
+                                * TCL_TRACE_UNSETS, and TCL_GLOBAL_ONLY. */
+    Tcl_VarTraceProc *proc;    /* Procedure to call when specified ops are
+                                * invoked upon varName. */
+    ClientData clientData;     /* Arbitrary argument to pass to proc. */
+{
+    register char *p;
+
+    /*
+     * If varName refers to an array (it ends with a parenthesized
+     * element name), then handle it specially.
+     */
+
+    for (p = varName; *p != '\0'; p++) {
+       if (*p == '(') {
+           int result;
+           char *open = p;
+
+           do {
+               p++;
+           } while (*p != '\0');
+           p--;
+           if (*p != ')') {
+               goto scalar;
+           }
+           *open = '\0';
+           *p = '\0';
+           result = Tcl_TraceVar2(interp, varName, open+1, flags,
+                   proc, clientData);
+           *open = '(';
+           *p = ')';
+           return result;
+       }
+    }
+
+    scalar:
+    return Tcl_TraceVar2(interp, varName, (char *) NULL, flags,
+           proc, clientData);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_TraceVar2 --
+ *
+ *     Arrange for reads and/or writes to a variable to cause a
+ *     procedure to be invoked, which can monitor the operations
+ *     and/or change their actions.
+ *
+ * Results:
+ *     A standard Tcl return value.
+ *
+ * Side effects:
+ *     A trace is set up on the variable given by name1 and name2, such
+ *     that future references to the variable will be intermediated by
+ *     proc.  See the manual entry for complete details on the calling
+ *     sequence for proc.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tcl_TraceVar2(interp, name1, name2, flags, proc, clientData)
+    Tcl_Interp *interp;                /* Interpreter in which variable is
+                                * to be traced. */
+    char *name1;               /* Name of scalar variable or array. */
+    char *name2;               /* Name of element within array;  NULL means
+                                * trace applies to scalar variable or array
+                                * as-a-whole. */
+    int flags;                 /* OR-ed collection of bits, including any
+                                * of TCL_TRACE_READS, TCL_TRACE_WRITES,
+                                * TCL_TRACE_UNSETS, and TCL_GLOBAL_ONLY. */
+    Tcl_VarTraceProc *proc;    /* Procedure to call when specified ops are
+                                * invoked upon varName. */
+    ClientData clientData;     /* Arbitrary argument to pass to proc. */
+{
+    Tcl_HashEntry *hPtr;
+    Var *varPtr = NULL;                /* Initial value only used to stop compiler
+                                * from complaining; not really needed. */
+    Interp *iPtr = (Interp *) interp;
+    register VarTrace *tracePtr;
+    int new;
+
+    /*
+     * Locate the variable, making a new (undefined) one if necessary.
+     */
+
+    if ((flags & TCL_GLOBAL_ONLY) || (iPtr->varFramePtr == NULL)) {
+       hPtr = Tcl_CreateHashEntry(&iPtr->globalTable, name1, &new);
+    } else {
+       hPtr = Tcl_CreateHashEntry(&iPtr->varFramePtr->varTable, name1, &new);
+    }
+    if (!new) {
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+       if (varPtr->flags & VAR_UPVAR) {
+           hPtr = varPtr->value.upvarPtr;
+           varPtr = (Var *) Tcl_GetHashValue(hPtr);
+       }
+    }
+
+    /*
+     * If the trace is to be on an array element, make sure that the
+     * variable is an array variable.  If the variable doesn't exist
+     * then define it as an empty array.  Then find the specific
+     * array element.
+     */
+
+    if (name2 != NULL) {
+       if (new) {
+           varPtr = NewVar(0);
+           Tcl_SetHashValue(hPtr, varPtr);
+           varPtr->flags = VAR_ARRAY;
+           varPtr->value.tablePtr = (Tcl_HashTable *)
+                   ckalloc(sizeof(Tcl_HashTable));
+           Tcl_InitHashTable(varPtr->value.tablePtr, TCL_STRING_KEYS);
+       } else {
+           if (varPtr->flags & VAR_UNDEFINED) {
+               varPtr->flags = VAR_ARRAY;
+               varPtr->value.tablePtr = (Tcl_HashTable *)
+                       ckalloc(sizeof(Tcl_HashTable));
+               Tcl_InitHashTable(varPtr->value.tablePtr, TCL_STRING_KEYS);
+           } else if (!(varPtr->flags & VAR_ARRAY)) {
+               iPtr->result = needArray;
+               return TCL_ERROR;
+           }
+       }
+       hPtr = Tcl_CreateHashEntry(varPtr->value.tablePtr, name2, &new);
+    }
+
+    if (new) {
+       if ((name2 != NULL) && (varPtr->searchPtr != NULL)) {
+           DeleteSearches(varPtr);
+       }
+       varPtr = NewVar(0);
+       varPtr->flags = VAR_UNDEFINED;
+       Tcl_SetHashValue(hPtr, varPtr);
+    } else {
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    }
+
+    /*
+     * Set up trace information.
+     */
+
+    tracePtr = (VarTrace *) ckalloc(sizeof(VarTrace));
+    tracePtr->traceProc = proc;
+    tracePtr->clientData = clientData;
+    tracePtr->flags = flags &
+           (TCL_TRACE_READS|TCL_TRACE_WRITES|TCL_TRACE_UNSETS);
+    tracePtr->nextPtr = varPtr->tracePtr;
+    varPtr->tracePtr = tracePtr;
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_UntraceVar --
+ *
+ *     Remove a previously-created trace for a variable.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If there exists a trace for the variable given by varName
+ *     with the given flags, proc, and clientData, then that trace
+ *     is removed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_UntraceVar(interp, varName, flags, proc, clientData)
+    Tcl_Interp *interp;                /* Interpreter containing traced variable. */
+    char *varName;             /* Name of variable;  may end with "(index)"
+                                * to signify an array reference. */
+    int flags;                 /* OR-ed collection of bits describing
+                                * current trace, including any of
+                                * TCL_TRACE_READS, TCL_TRACE_WRITES,
+                                * TCL_TRACE_UNSETS, and TCL_GLOBAL_ONLY. */
+    Tcl_VarTraceProc *proc;    /* Procedure assocated with trace. */
+    ClientData clientData;     /* Arbitrary argument to pass to proc. */
+{
+    register char *p;
+
+    /*
+     * If varName refers to an array (it ends with a parenthesized
+     * element name), then handle it specially.
+     */
+
+    for (p = varName; *p != '\0'; p++) {
+       if (*p == '(') {
+           char *open = p;
+
+           do {
+               p++;
+           } while (*p != '\0');
+           p--;
+           if (*p != ')') {
+               goto scalar;
+           }
+           *open = '\0';
+           *p = '\0';
+           Tcl_UntraceVar2(interp, varName, open+1, flags, proc, clientData);
+           *open = '(';
+           *p = ')';
+           return;
+       }
+    }
+
+    scalar:
+    Tcl_UntraceVar2(interp, varName, (char *) NULL, flags, proc, clientData);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_UntraceVar2 --
+ *
+ *     Remove a previously-created trace for a variable.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If there exists a trace for the variable given by name1
+ *     and name2 with the given flags, proc, and clientData, then
+ *     that trace is removed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tcl_UntraceVar2(interp, name1, name2, flags, proc, clientData)
+    Tcl_Interp *interp;                /* Interpreter containing traced variable. */
+    char *name1;               /* Name of variable or array. */
+    char *name2;               /* Name of element within array;  NULL means
+                                * trace applies to scalar variable or array
+                                * as-a-whole. */
+    int flags;                 /* OR-ed collection of bits describing
+                                * current trace, including any of
+                                * TCL_TRACE_READS, TCL_TRACE_WRITES,
+                                * TCL_TRACE_UNSETS, and TCL_GLOBAL_ONLY. */
+    Tcl_VarTraceProc *proc;    /* Procedure assocated with trace. */
+    ClientData clientData;     /* Arbitrary argument to pass to proc. */
+{
+    register VarTrace *tracePtr;
+    VarTrace *prevPtr;
+    Var *varPtr;
+    Interp *iPtr = (Interp *) interp;
+    Tcl_HashEntry *hPtr;
+    ActiveVarTrace *activePtr;
+
+    /*
+     * First, lookup the variable.
+     */
+
+    if ((flags & TCL_GLOBAL_ONLY) || (iPtr->varFramePtr == NULL)) {
+       hPtr = Tcl_FindHashEntry(&iPtr->globalTable, name1);
+    } else {
+       hPtr = Tcl_FindHashEntry(&iPtr->varFramePtr->varTable, name1);
+    }
+    if (hPtr == NULL) {
+       return;
+    }
+    varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    if (varPtr->flags & VAR_UPVAR) {
+       hPtr = varPtr->value.upvarPtr;
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    }
+    if (name2 != NULL) {
+       if (!(varPtr->flags & VAR_ARRAY)) {
+           return;
+       }
+       hPtr = Tcl_FindHashEntry(varPtr->value.tablePtr, name2);
+       if (hPtr == NULL) {
+           return;
+       }
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    }
+
+    flags &= (TCL_TRACE_READS | TCL_TRACE_WRITES | TCL_TRACE_UNSETS);
+    for (tracePtr = varPtr->tracePtr, prevPtr = NULL; ;
+           prevPtr = tracePtr, tracePtr = tracePtr->nextPtr) {
+       if (tracePtr == NULL) {
+           return;
+       }
+       if ((tracePtr->traceProc == proc) && (tracePtr->flags == flags)
+               && (tracePtr->clientData == clientData)) {
+           break;
+       }
+    }
+
+    /*
+     * The code below makes it possible to delete traces while traces
+     * are active:  it makes sure that the deleted trace won't be
+     * processed by CallTraces.
+     */
+
+    for (activePtr = iPtr->activeTracePtr; activePtr != NULL;
+           activePtr = activePtr->nextPtr) {
+       if (activePtr->nextTracePtr == tracePtr) {
+           activePtr->nextTracePtr = tracePtr->nextPtr;
+       }
+    }
+    if (prevPtr == NULL) {
+       varPtr->tracePtr = tracePtr->nextPtr;
+    } else {
+       prevPtr->nextPtr = tracePtr->nextPtr;
+    }
+    ckfree((char *) tracePtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_VarTraceInfo --
+ *
+ *     Return the clientData value associated with a trace on a
+ *     variable.  This procedure can also be used to step through
+ *     all of the traces on a particular variable that have the
+ *     same trace procedure.
+ *
+ * Results:
+ *     The return value is the clientData value associated with
+ *     a trace on the given variable.  Information will only be
+ *     returned for a trace with proc as trace procedure.  If
+ *     the clientData argument is NULL then the first such trace is
+ *     returned;  otherwise, the next relevant one after the one
+ *     given by clientData will be returned.  If the variable
+ *     doesn't exist, or if there are no (more) traces for it,
+ *     then NULL is returned.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+ClientData
+Tcl_VarTraceInfo(interp, varName, flags, proc, prevClientData)
+    Tcl_Interp *interp;                /* Interpreter containing variable. */
+    char *varName;             /* Name of variable;  may end with "(index)"
+                                * to signify an array reference. */
+    int flags;                 /* 0 or TCL_GLOBAL_ONLY. */
+    Tcl_VarTraceProc *proc;    /* Procedure assocated with trace. */
+    ClientData prevClientData; /* If non-NULL, gives last value returned
+                                * by this procedure, so this call will
+                                * return the next trace after that one.
+                                * If NULL, this call will return the
+                                * first trace. */
+{
+    register char *p;
+
+    /*
+     * If varName refers to an array (it ends with a parenthesized
+     * element name), then handle it specially.
+     */
+
+    for (p = varName; *p != '\0'; p++) {
+       if (*p == '(') {
+           ClientData result;
+           char *open = p;
+
+           do {
+               p++;
+           } while (*p != '\0');
+           p--;
+           if (*p != ')') {
+               goto scalar;
+           }
+           *open = '\0';
+           *p = '\0';
+           result = Tcl_VarTraceInfo2(interp, varName, open+1, flags, proc,
+               prevClientData);
+           *open = '(';
+           *p = ')';
+           return result;
+       }
+    }
+
+    scalar:
+    return Tcl_VarTraceInfo2(interp, varName, (char *) NULL, flags, proc,
+           prevClientData);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_VarTraceInfo2 --
+ *
+ *     Same as Tcl_VarTraceInfo, except takes name in two pieces
+ *     instead of one.
+ *
+ * Results:
+ *     Same as Tcl_VarTraceInfo.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+ClientData
+Tcl_VarTraceInfo2(interp, name1, name2, flags, proc, prevClientData)
+    Tcl_Interp *interp;                /* Interpreter containing variable. */
+    char *name1;               /* Name of variable or array. */
+    char *name2;               /* Name of element within array;  NULL means
+                                * trace applies to scalar variable or array
+                                * as-a-whole. */
+    int flags;                 /* 0 or TCL_GLOBAL_ONLY. */
+    Tcl_VarTraceProc *proc;    /* Procedure assocated with trace. */
+    ClientData prevClientData; /* If non-NULL, gives last value returned
+                                * by this procedure, so this call will
+                                * return the next trace after that one.
+                                * If NULL, this call will return the
+                                * first trace. */
+{
+    register VarTrace *tracePtr;
+    Var *varPtr;
+    Interp *iPtr = (Interp *) interp;
+    Tcl_HashEntry *hPtr;
+
+    /*
+     * First, lookup the variable.
+     */
+
+    if ((flags & TCL_GLOBAL_ONLY) || (iPtr->varFramePtr == NULL)) {
+       hPtr = Tcl_FindHashEntry(&iPtr->globalTable, name1);
+    } else {
+       hPtr = Tcl_FindHashEntry(&iPtr->varFramePtr->varTable, name1);
+    }
+    if (hPtr == NULL) {
+       return NULL;
+    }
+    varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    if (varPtr->flags & VAR_UPVAR) {
+       hPtr = varPtr->value.upvarPtr;
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    }
+    if (name2 != NULL) {
+       if (!(varPtr->flags & VAR_ARRAY)) {
+           return NULL;
+       }
+       hPtr = Tcl_FindHashEntry(varPtr->value.tablePtr, name2);
+       if (hPtr == NULL) {
+           return NULL;
+       }
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    }
+
+    /*
+     * Find the relevant trace, if any, and return its clientData.
+     */
+
+    tracePtr = varPtr->tracePtr;
+    if (prevClientData != NULL) {
+       for ( ; tracePtr != NULL; tracePtr = tracePtr->nextPtr) {
+           if ((tracePtr->clientData == prevClientData)
+                   && (tracePtr->traceProc == proc)) {
+               tracePtr = tracePtr->nextPtr;
+               break;
+           }
+       }
+    }
+    for ( ; tracePtr != NULL; tracePtr = tracePtr->nextPtr) {
+       if (tracePtr->traceProc == proc) {
+           return tracePtr->clientData;
+       }
+    }
+    return NULL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_SetCmd --
+ *
+ *     This procedure is invoked to process the "set" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result value.
+ *
+ * Side effects:
+ *     A variable's value may be changed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_SetCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    register Tcl_Interp *interp;       /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    if (argc == 2) {
+       char *value;
+
+       value = Tcl_GetVar(interp, argv[1], TCL_LEAVE_ERR_MSG);
+       if (value == NULL) {
+           return TCL_ERROR;
+       }
+       interp->result = value;
+       return TCL_OK;
+    } else if (argc == 3) {
+       char *result;
+
+       result = Tcl_SetVar(interp, argv[1], argv[2], TCL_LEAVE_ERR_MSG);
+       if (result == NULL) {
+           return TCL_ERROR;
+       }
+       interp->result = result;
+       return TCL_OK;
+    } else {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " varName ?newValue?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_UnsetCmd --
+ *
+ *     This procedure is invoked to process the "unset" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result value.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_UnsetCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    register Tcl_Interp *interp;       /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int i;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " varName ?varName ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    for (i = 1; i < argc; i++) {
+       if (Tcl_UnsetVar(interp, argv[i], TCL_LEAVE_ERR_MSG) != 0) {
+           return TCL_ERROR;
+       }
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_AppendCmd --
+ *
+ *     This procedure is invoked to process the "append" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result value.
+ *
+ * Side effects:
+ *     A variable's value may be changed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_AppendCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    register Tcl_Interp *interp;       /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int i;
+    char *result = NULL;               /* (Initialization only needed to keep
+                                        * the compiler from complaining) */
+
+    if (argc < 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " varName value ?value ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    for (i = 2; i < argc; i++) {
+       result = Tcl_SetVar(interp, argv[1], argv[i],
+               TCL_APPEND_VALUE|TCL_LEAVE_ERR_MSG);
+       if (result == NULL) {
+           return TCL_ERROR;
+       }
+    }
+    interp->result = result;
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_LappendCmd --
+ *
+ *     This procedure is invoked to process the "lappend" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result value.
+ *
+ * Side effects:
+ *     A variable's value may be changed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_LappendCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    register Tcl_Interp *interp;       /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int i;
+    char *result = NULL;               /* (Initialization only needed to keep
+                                        * the compiler from complaining) */
+
+    if (argc < 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " varName value ?value ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    for (i = 2; i < argc; i++) {
+       result = Tcl_SetVar(interp, argv[1], argv[i],
+               TCL_APPEND_VALUE|TCL_LIST_ELEMENT|TCL_LEAVE_ERR_MSG);
+       if (result == NULL) {
+           return TCL_ERROR;
+       }
+    }
+    interp->result = result;
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_ArrayCmd --
+ *
+ *     This procedure is invoked to process the "array" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result value.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_ArrayCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    register Tcl_Interp *interp;       /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int length;
+    char c;
+    Var *varPtr;
+    Tcl_HashEntry *hPtr;
+    Interp *iPtr = (Interp *) interp;
+
+    if (argc < 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option arrayName ?arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Locate the array variable (and it better be an array).
+     */
+
+    if (iPtr->varFramePtr == NULL) {
+       hPtr = Tcl_FindHashEntry(&iPtr->globalTable, argv[2]);
+    } else {
+       hPtr = Tcl_FindHashEntry(&iPtr->varFramePtr->varTable, argv[2]);
+    }
+    if (hPtr == NULL) {
+       notArray:
+       Tcl_AppendResult(interp, "\"", argv[2], "\" isn't an array",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+    varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    if (varPtr->flags & VAR_UPVAR) {
+       varPtr = (Var *) Tcl_GetHashValue(varPtr->value.upvarPtr);
+    }
+    if (!(varPtr->flags & VAR_ARRAY)) {
+       goto notArray;
+    }
+
+    /*
+     * Dispatch based on the option.
+     */
+
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'a') && (strncmp(argv[1], "anymore", length) == 0)) {
+       ArraySearch *searchPtr;
+
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " anymore arrayName searchId\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       searchPtr = ParseSearchId(interp, varPtr, argv[2], argv[3]);
+       if (searchPtr == NULL) {
+           return TCL_ERROR;
+       }
+       while (1) {
+           Var *varPtr2;
+
+           if (searchPtr->nextEntry != NULL) {
+               varPtr2 = (Var *) Tcl_GetHashValue(searchPtr->nextEntry);
+               if (!(varPtr2->flags & VAR_UNDEFINED)) {
+                   break;
+               }
+           }
+           searchPtr->nextEntry = Tcl_NextHashEntry(&searchPtr->search);
+           if (searchPtr->nextEntry == NULL) {
+               interp->result = "0";
+               return TCL_OK;
+           }
+       }
+       interp->result = "1";
+       return TCL_OK;
+    } else if ((c == 'd') && (strncmp(argv[1], "donesearch", length) == 0)) {
+       ArraySearch *searchPtr, *prevPtr;
+
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " donesearch arrayName searchId\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       searchPtr = ParseSearchId(interp, varPtr, argv[2], argv[3]);
+       if (searchPtr == NULL) {
+           return TCL_ERROR;
+       }
+       if (varPtr->searchPtr == searchPtr) {
+           varPtr->searchPtr = searchPtr->nextPtr;
+       } else {
+           for (prevPtr = varPtr->searchPtr; ; prevPtr = prevPtr->nextPtr) {
+               if (prevPtr->nextPtr == searchPtr) {
+                   prevPtr->nextPtr = searchPtr->nextPtr;
+                   break;
+               }
+           }
+       }
+       ckfree((char *) searchPtr);
+    } else if ((c == 'n') && (strncmp(argv[1], "names", length) == 0)
+           && (length >= 2)) {
+       Tcl_HashSearch search;
+       Var *varPtr2;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " names arrayName\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       for (hPtr = Tcl_FirstHashEntry(varPtr->value.tablePtr, &search);
+               hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
+           varPtr2 = (Var *) Tcl_GetHashValue(hPtr);
+           if (varPtr2->flags & VAR_UNDEFINED) {
+               continue;
+           }
+           Tcl_AppendElement(interp,
+                   Tcl_GetHashKey(varPtr->value.tablePtr, hPtr), 0);
+       }
+    } else if ((c == 'n') && (strncmp(argv[1], "nextelement", length) == 0)
+           && (length >= 2)) {
+       ArraySearch *searchPtr;
+       Tcl_HashEntry *hPtr;
+
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " nextelement arrayName searchId\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       searchPtr = ParseSearchId(interp, varPtr, argv[2], argv[3]);
+       if (searchPtr == NULL) {
+           return TCL_ERROR;
+       }
+       while (1) {
+           Var *varPtr2;
+
+           hPtr = searchPtr->nextEntry;
+           if (hPtr == NULL) {
+               hPtr = Tcl_NextHashEntry(&searchPtr->search);
+               if (hPtr == NULL) {
+                   return TCL_OK;
+               }
+           } else {
+               searchPtr->nextEntry = NULL;
+           }
+           varPtr2 = (Var *) Tcl_GetHashValue(hPtr);
+           if (!(varPtr2->flags & VAR_UNDEFINED)) {
+               break;
+           }
+       }
+       interp->result = Tcl_GetHashKey(varPtr->value.tablePtr, hPtr);
+    } else if ((c == 's') && (strncmp(argv[1], "size", length) == 0)
+           && (length >= 2)) {
+       Tcl_HashSearch search;
+       Var *varPtr2;
+       int size;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " size arrayName\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       size = 0;
+       for (hPtr = Tcl_FirstHashEntry(varPtr->value.tablePtr, &search);
+               hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
+           varPtr2 = (Var *) Tcl_GetHashValue(hPtr);
+           if (varPtr2->flags & VAR_UNDEFINED) {
+               continue;
+           }
+           size++;
+       }
+       sprintf(interp->result, "%d", size);
+    } else if ((c == 's') && (strncmp(argv[1], "startsearch", length) == 0)
+           && (length >= 2)) {
+       ArraySearch *searchPtr;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " startsearch arrayName\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       searchPtr = (ArraySearch *) ckalloc(sizeof(ArraySearch));
+       if (varPtr->searchPtr == NULL) {
+           searchPtr->id = 1;
+           Tcl_AppendResult(interp, "s-1-", argv[2], (char *) NULL);
+       } else {
+           char string[20];
+
+           searchPtr->id = varPtr->searchPtr->id + 1;
+           sprintf(string, "%d", searchPtr->id);
+           Tcl_AppendResult(interp, "s-", string, "-", argv[2],
+                   (char *) NULL);
+       }
+       searchPtr->varPtr = varPtr;
+       searchPtr->nextEntry = Tcl_FirstHashEntry(varPtr->value.tablePtr,
+               &searchPtr->search);
+       searchPtr->nextPtr = varPtr->searchPtr;
+       varPtr->searchPtr = searchPtr;
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\": should be anymore, donesearch, names, nextelement, ",
+               "size, or startsearch", (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_GlobalCmd --
+ *
+ *     This procedure is invoked to process the "global" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result value.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_GlobalCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    Var *varPtr, *gVarPtr;
+    register Interp *iPtr = (Interp *) interp;
+    Tcl_HashEntry *hPtr, *hPtr2;
+    int new;
+
+    if (argc < 2) {
+       Tcl_AppendResult((Tcl_Interp *) iPtr, "wrong # args: should be \"",
+               argv[0], " varName ?varName ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (iPtr->varFramePtr == NULL) {
+       return TCL_OK;
+    }
+
+    for (argc--, argv++; argc > 0; argc--, argv++) {
+       hPtr = Tcl_CreateHashEntry(&iPtr->globalTable, *argv, &new);
+       if (new) {
+           gVarPtr = NewVar(0);
+           gVarPtr->flags |= VAR_UNDEFINED;
+           Tcl_SetHashValue(hPtr, gVarPtr);
+       } else {
+           gVarPtr = (Var *) Tcl_GetHashValue(hPtr);
+       }
+       hPtr2 = Tcl_CreateHashEntry(&iPtr->varFramePtr->varTable, *argv, &new);
+       if (!new) {
+           Var *varPtr;
+           varPtr = (Var *) Tcl_GetHashValue(hPtr2);
+           if (varPtr->flags & VAR_UPVAR) {
+               continue;
+           } else {
+               Tcl_AppendResult((Tcl_Interp *) iPtr, "variable \"", *argv,
+                   "\" already exists", (char *) NULL);
+               return TCL_ERROR;
+           }
+       }
+       varPtr = NewVar(0);
+       varPtr->flags |= VAR_UPVAR;
+       varPtr->value.upvarPtr = hPtr;
+       gVarPtr->upvarUses++;
+       Tcl_SetHashValue(hPtr2, varPtr);
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tcl_UpvarCmd --
+ *
+ *     This procedure is invoked to process the "upvar" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result value.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tcl_UpvarCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    register Interp *iPtr = (Interp *) interp;
+    int result;
+    CallFrame *framePtr;
+    Var *varPtr = NULL;
+    Tcl_HashTable *upVarTablePtr;
+    Tcl_HashEntry *hPtr, *hPtr2;
+    int new;
+    Var *upVarPtr;
+
+    if (argc < 3) {
+       upvarSyntax:
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " ?level? otherVar localVar ?otherVar localVar ...?\"",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Find the hash table containing the variable being referenced.
+     */
+
+    result = TclGetFrame(interp, argv[1], &framePtr);
+    if (result == -1) {
+       return TCL_ERROR;
+    }
+    argc -= result+1;
+    argv += result+1;
+    if (framePtr == NULL) {
+       upVarTablePtr = &iPtr->globalTable;
+    } else {
+       upVarTablePtr = &framePtr->varTable;
+    }
+
+    if ((argc & 1) != 0) {
+       goto upvarSyntax;
+    }
+
+    /*
+     * Iterate over all the pairs of (local variable, other variable)
+     * names.  For each pair, create a hash table entry in the upper
+     * context (if the name wasn't there already), then associate it
+     * with a new local variable.
+     */
+
+    while (argc > 0) {
+        hPtr = Tcl_CreateHashEntry(upVarTablePtr, argv[0], &new);
+        if (new) {
+            upVarPtr = NewVar(0);
+            upVarPtr->flags |= VAR_UNDEFINED;
+            Tcl_SetHashValue(hPtr, upVarPtr);
+        } else {
+            upVarPtr = (Var *) Tcl_GetHashValue(hPtr);
+           if (upVarPtr->flags & VAR_UPVAR) {
+               hPtr = upVarPtr->value.upvarPtr;
+               upVarPtr = (Var *) Tcl_GetHashValue(hPtr);
+           }
+        }
+
+        hPtr2 = Tcl_CreateHashEntry(&iPtr->varFramePtr->varTable,
+                    argv[1], &new);
+        if (!new) {
+            Tcl_AppendResult((Tcl_Interp *) iPtr, "variable \"", argv[1],
+                "\" already exists", (char *) NULL);
+            return TCL_ERROR;
+        }
+        varPtr = NewVar(0);
+        varPtr->flags |= VAR_UPVAR;
+        varPtr->value.upvarPtr = hPtr;
+        upVarPtr->upvarUses++;
+        Tcl_SetHashValue(hPtr2, varPtr);
+
+        argc -= 2;
+        argv += 2;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclDeleteVars --
+ *
+ *     This procedure is called to recycle all the storage space
+ *     associated with a table of variables.  For this procedure
+ *     to work correctly, it must not be possible for any of the
+ *     variable in the table to be accessed from Tcl commands
+ *     (e.g. from trace procedures).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Variables are deleted and trace procedures are invoked, if
+ *     any are declared.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TclDeleteVars(iPtr, tablePtr)
+    Interp *iPtr;              /* Interpreter to which variables belong. */
+    Tcl_HashTable *tablePtr;   /* Hash table containing variables to
+                                * delete. */
+{
+    Tcl_HashSearch search;
+    Tcl_HashEntry *hPtr;
+    register Var *varPtr;
+    int flags, globalFlag;
+
+    flags = TCL_TRACE_UNSETS;
+    if (tablePtr == &iPtr->globalTable) {
+       flags |= TCL_INTERP_DESTROYED | TCL_GLOBAL_ONLY;
+    }
+    for (hPtr = Tcl_FirstHashEntry(tablePtr, &search); hPtr != NULL;
+           hPtr = Tcl_NextHashEntry(&search)) {
+       varPtr = (Var *) Tcl_GetHashValue(hPtr);
+
+       /*
+        * For global/upvar variables referenced in procedures, free up the
+        * local space and then decrement the reference count on the
+        * variable referred to.  If there are no more references to the
+        * global/upvar and it is undefined and has no traces set, then
+        * follow on and delete the referenced variable too.
+        */
+
+       globalFlag = 0;
+       if (varPtr->flags & VAR_UPVAR) {
+           hPtr = varPtr->value.upvarPtr;
+           ckfree((char *) varPtr);
+           varPtr = (Var *) Tcl_GetHashValue(hPtr);
+           varPtr->upvarUses--;
+           if ((varPtr->upvarUses != 0) || !(varPtr->flags & VAR_UNDEFINED)
+                   || (varPtr->tracePtr != NULL)) {
+               continue;
+           }
+           globalFlag = TCL_GLOBAL_ONLY;
+       }
+
+       /*
+        * Invoke traces on the variable that is being deleted, then
+        * free up the variable's space (no need to free the hash entry
+        * here, unless we're dealing with a global variable:  the
+        * hash entries will be deleted automatically when the whole
+        * table is deleted).
+        */
+
+       if (varPtr->tracePtr != NULL) {
+           (void) CallTraces(iPtr, (Var *) NULL, hPtr,
+                   Tcl_GetHashKey(tablePtr, hPtr), (char *) NULL,
+                   flags | globalFlag);
+           while (varPtr->tracePtr != NULL) {
+               VarTrace *tracePtr = varPtr->tracePtr;
+               varPtr->tracePtr = tracePtr->nextPtr;
+               ckfree((char *) tracePtr);
+           }
+       }
+       if (varPtr->flags & VAR_ARRAY) {
+           DeleteArray(iPtr, Tcl_GetHashKey(tablePtr, hPtr), varPtr,
+                   flags | globalFlag);
+       }
+       if (globalFlag) {
+           Tcl_DeleteHashEntry(hPtr);
+       }
+       ckfree((char *) varPtr);
+    }
+    Tcl_DeleteHashTable(tablePtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * CallTraces --
+ *
+ *     This procedure is invoked to find and invoke relevant
+ *     trace procedures associated with a particular operation on
+ *     a variable.  This procedure invokes traces both on the
+ *     variable and on its containing array (where relevant).
+ *
+ * Results:
+ *     The return value is NULL if no trace procedures were invoked, or
+ *     if all the invoked trace procedures returned successfully.
+ *     The return value is non-zero if a trace procedure returned an
+ *     error (in this case no more trace procedures were invoked after
+ *     the error was returned).  In this case the return value is a
+ *     pointer to a static string describing the error.
+ *
+ * Side effects:
+ *     Almost anything can happen, depending on trace;  this procedure
+ *     itself doesn't have any side effects.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static char *
+CallTraces(iPtr, arrayPtr, hPtr, name1, name2, flags)
+    Interp *iPtr;                      /* Interpreter containing variable. */
+    register Var *arrayPtr;            /* Pointer to array variable that
+                                        * contains the variable, or NULL if
+                                        * the variable isn't an element of an
+                                        * array. */
+    Tcl_HashEntry *hPtr;               /* Hash table entry corresponding to
+                                        * variable whose traces are to be
+                                        * invoked. */
+    char *name1, *name2;               /* Variable's two-part name. */
+    int flags;                         /* Flags to pass to trace procedures:
+                                        * indicates what's happening to
+                                        * variable, plus other stuff like
+                                        * TCL_GLOBAL_ONLY and
+                                        * TCL_INTERP_DESTROYED. */
+{
+    Var *varPtr;
+    register VarTrace *tracePtr;
+    ActiveVarTrace active;
+    char *result;
+    int savedArrayFlags = 0;           /* (Initialization not needed except
+                                        * to prevent compiler warning) */
+
+    /*
+     * If there are already similar trace procedures active for the
+     * variable, don't call them again.
+     */
+
+    varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    if (varPtr->flags & VAR_TRACE_ACTIVE) {
+       return NULL;
+    }
+    varPtr->flags |= VAR_TRACE_ACTIVE;
+
+    /*
+     * Invoke traces on the array containing the variable, if relevant.
+     */
+
+    result = NULL;
+    active.nextPtr = iPtr->activeTracePtr;
+    iPtr->activeTracePtr = &active;
+    if (arrayPtr != NULL) {
+       savedArrayFlags = arrayPtr->flags;
+       arrayPtr->flags |= VAR_ELEMENT_ACTIVE;
+       for (tracePtr = arrayPtr->tracePtr;  tracePtr != NULL;
+               tracePtr = active.nextTracePtr) {
+           active.nextTracePtr = tracePtr->nextPtr;
+           if (!(tracePtr->flags & flags)) {
+               continue;
+           }
+           result = (*tracePtr->traceProc)(tracePtr->clientData,
+                   (Tcl_Interp *) iPtr, name1, name2, flags);
+           if (result != NULL) {
+               if (flags & TCL_TRACE_UNSETS) {
+                   result = NULL;
+               } else {
+                   goto done;
+               }
+           }
+       }
+    }
+
+    /*
+     * Invoke traces on the variable itself.
+     */
+
+    if (flags & TCL_TRACE_UNSETS) {
+       flags |= TCL_TRACE_DESTROYED;
+    }
+    for (tracePtr = varPtr->tracePtr; tracePtr != NULL;
+           tracePtr = active.nextTracePtr) {
+       active.nextTracePtr = tracePtr->nextPtr;
+       if (!(tracePtr->flags & flags)) {
+           continue;
+       }
+       result = (*tracePtr->traceProc)(tracePtr->clientData,
+               (Tcl_Interp *) iPtr, name1, name2, flags);
+       if (result != NULL) {
+           if (flags & TCL_TRACE_UNSETS) {
+               result = NULL;
+           } else {
+               goto done;
+           }
+       }
+    }
+
+    /*
+     * Restore the variable's flags, remove the record of our active
+     * traces, and then return.  Remember that the variable could have
+     * been re-allocated during the traces, but its hash entry won't
+     * change.
+     */
+
+    done:
+    if (arrayPtr != NULL) {
+       arrayPtr->flags = savedArrayFlags;
+    }
+    varPtr = (Var *) Tcl_GetHashValue(hPtr);
+    varPtr->flags &= ~VAR_TRACE_ACTIVE;
+    iPtr->activeTracePtr = active.nextPtr;
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * NewVar --
+ *
+ *     Create a new variable with a given initial value.
+ *
+ * Results:
+ *     The return value is a pointer to the new variable structure.
+ *     The variable will not be part of any hash table yet, and its
+ *     upvarUses count is initialized to 0.  Its initial value will
+ *     be empty, but "space" bytes will be available in the value
+ *     area.
+ *
+ * Side effects:
+ *     Storage gets allocated.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static Var *
+NewVar(space)
+    int space;         /* Minimum amount of space to allocate
+                        * for variable's value. */
+{
+    int extra;
+    register Var *varPtr;
+
+    extra = space - sizeof(varPtr->value);
+    if (extra < 0) {
+       extra = 0;
+       space = sizeof(varPtr->value);
+    }
+    varPtr = (Var *) ckalloc((unsigned) (sizeof(Var) + extra));
+    varPtr->valueLength = 0;
+    varPtr->valueSpace = space;
+    varPtr->upvarUses = 0;
+    varPtr->tracePtr = NULL;
+    varPtr->searchPtr = NULL;
+    varPtr->flags = 0;
+    varPtr->value.string[0] = 0;
+    return varPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ParseSearchId --
+ *
+ *     This procedure translates from a string to a pointer to an
+ *     active array search (if there is one that matches the string).
+ *
+ * Results:
+ *     The return value is a pointer to the array search indicated
+ *     by string, or NULL if there isn't one.  If NULL is returned,
+ *     interp->result contains an error message.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static ArraySearch *
+ParseSearchId(interp, varPtr, varName, string)
+    Tcl_Interp *interp;                /* Interpreter containing variable. */
+    Var *varPtr;               /* Array variable search is for. */
+    char *varName;             /* Name of array variable that search is
+                                * supposed to be for. */
+    char *string;              /* String containing id of search.  Must have
+                                * form "search-num-var" where "num" is a
+                                * decimal number and "var" is a variable
+                                * name. */
+{
+    char *end;
+    int id;
+    ArraySearch *searchPtr;
+
+    /*
+     * Parse the id into the three parts separated by dashes.
+     */
+
+    if ((string[0] != 's') || (string[1] != '-')) {
+       syntax:
+       Tcl_AppendResult(interp, "illegal search identifier \"", string,
+               "\"", (char *) NULL);
+       return NULL;
+    }
+    id = strtoul(string+2, &end, 10);
+    if ((end == (string+2)) || (*end != '-')) {
+       goto syntax;
+    }
+    if (strcmp(end+1, varName) != 0) {
+       Tcl_AppendResult(interp, "search identifier \"", string,
+               "\" isn't for variable \"", varName, "\"", (char *) NULL);
+       return NULL;
+    }
+
+    /*
+     * Search through the list of active searches on the interpreter
+     * to see if the desired one exists.
+     */
+
+    for (searchPtr = varPtr->searchPtr; searchPtr != NULL;
+           searchPtr = searchPtr->nextPtr) {
+       if (searchPtr->id == id) {
+           return searchPtr;
+       }
+    }
+    Tcl_AppendResult(interp, "couldn't find search \"", string, "\"",
+           (char *) NULL);
+    return NULL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DeleteSearches --
+ *
+ *     This procedure is called to free up all of the searches
+ *     associated with an array variable.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Memory is released to the storage allocator.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DeleteSearches(arrayVarPtr)
+    register Var *arrayVarPtr;         /* Variable whose searches are
+                                        * to be deleted. */
+{
+    ArraySearch *searchPtr;
+
+    while (arrayVarPtr->searchPtr != NULL) {
+       searchPtr = arrayVarPtr->searchPtr;
+       arrayVarPtr->searchPtr = searchPtr->nextPtr;
+       ckfree((char *) searchPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DeleteArray --
+ *
+ *     This procedure is called to free up everything in an array
+ *     variable.  It's the caller's responsibility to make sure
+ *     that the array is no longer accessible before this procedure
+ *     is called.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     All storage associated with varPtr's array elements is deleted
+ *     (including the hash table).  Any delete trace procedures for
+ *     array elements are invoked.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DeleteArray(iPtr, arrayName, varPtr, flags)
+    Interp *iPtr;                      /* Interpreter containing array. */
+    char *arrayName;                   /* Name of array (used for trace
+                                        * callbacks). */
+    Var *varPtr;                       /* Pointer to variable structure. */
+    int flags;                         /* Flags to pass to CallTraces:
+                                        * TCL_TRACE_UNSETS and sometimes
+                                        * TCL_INTERP_DESTROYED and/or
+                                        * TCL_GLOBAL_ONLY. */
+{
+    Tcl_HashSearch search;
+    register Tcl_HashEntry *hPtr;
+    register Var *elPtr;
+
+    DeleteSearches(varPtr);
+    for (hPtr = Tcl_FirstHashEntry(varPtr->value.tablePtr, &search);
+           hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
+       elPtr = (Var *) Tcl_GetHashValue(hPtr);
+       if (elPtr->tracePtr != NULL) {
+           (void) CallTraces(iPtr, (Var *) NULL, hPtr, arrayName,
+                   Tcl_GetHashKey(varPtr->value.tablePtr, hPtr), flags);
+           while (elPtr->tracePtr != NULL) {
+               VarTrace *tracePtr = elPtr->tracePtr;
+               elPtr->tracePtr = tracePtr->nextPtr;
+               ckfree((char *) tracePtr);
+           }
+       }
+       if (elPtr->flags & VAR_SEARCHES_POSSIBLE) {
+           panic("DeleteArray found searches on array alement!");
+       }
+       ckfree((char *) elPtr);
+    }
+    Tcl_DeleteHashTable(varPtr->value.tablePtr);
+    ckfree((char *) varPtr->value.tablePtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * VarErrMsg --
+ *
+ *     Generate a reasonable error message describing why a variable
+ *     operation failed.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Interp->result is reset to hold a message identifying the
+ *     variable given by name1 and name2 and describing why the
+ *     variable operation failed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+VarErrMsg(interp, name1, name2, operation, reason)
+    Tcl_Interp *interp;                /* Interpreter in which to record message. */
+    char *name1, *name2;       /* Variable's two-part name. */
+    char *operation;           /* String describing operation that failed,
+                                * e.g. "read", "set", or "unset". */
+    char *reason;              /* String describing why operation failed. */
+{
+    Tcl_ResetResult(interp);
+    Tcl_AppendResult(interp, "can't ", operation, " \"", name1, (char *) NULL);
+    if (name2 != NULL) {
+       Tcl_AppendResult(interp, "(", name2, ")", (char *) NULL);
+    }
+    Tcl_AppendResult(interp, "\": ", reason, (char *) NULL);
+}
diff --git a/src/tclx/config.mk b/src/tclx/config.mk
new file mode 100644 (file)
index 0000000..22d43cb
--- /dev/null
@@ -0,0 +1,319 @@
+#
+# Config.mk --
+#
+#   Master configuration file for Extended Tcl.  This should be the only
+# file you have to modify to get Extended Tcl to work.
+# 
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: Config.mk,v 2.3 1992/11/09 07:33:02 markd Exp $
+#------------------------------------------------------------------------------
+#
+
+#==============================================================================
+# Configuration file specification.  Set the macro TCL_CONFIG_FILE to the 
+# name of the file to use in the config directory (don't include the directory
+# name).  If you find problems with these files or have new onces please send
+# them to us (tcl-project@neosoft.com).  At the end of this file is a
+# description of all the flags that can be set in the config file.
+#
+TCL_CONFIG_FILE=linux
+
+#==============================================================================
+#
+# Configuration section.  Modify this section to set some general options and
+# selecting a config file for a specific Unix implementation.
+#
+#==============================================================================
+
+#------------------------------------------------------------------------------
+# Location of the UCB Tcl distribution relative to this directory.  TclX works
+# with Tcl 6.3 and Tcl 6.4.
+#
+TCL_UCB_DIR=../tcl
+
+#------------------------------------------------------------------------------
+# If you are a Tk user and would like to build a version "wish", the Tk shell,
+# that includes the TclX command set, define TCL_TK_SHELL=wish and the
+# location of your Tk directory in TCL_TK_DIR relative to this directory. If
+# you do not want a "wish" compiled, don't define TCL_TK_SHELL. The libraries
+# required to link Tk are defined in the system specific sections below.
+# TK_LIBRARY must be set to the same value specified in the compile of the Tk
+# source.  If TCL_TK_SHELL is define, Tk manual pages will be installed by the
+# install script.
+#
+TCL_TK_SHELL=wish
+TCL_TK_DIR=../tk
+TK_LIBRARY=/usr/local/lib/tk
+XPM_LIBS=-L/usr/X11R6/lib -lXpm 
+
+#------------------------------------------------------------------------------
+# Compiler debug/optimization/profiling flag to use.  Not that if debugging or
+# profiling is enabled, the DO_STRIPPING option below must be disabled.
+#
+
+CC=gcc
+
+OPTIMIZE_FLAG=-O3 -DIS_LINUX
+#OPTIMIZE_FLAG=-g -DIS_LINUX
+
+#------------------------------------------------------------------------------
+# Stripping of the final tclshell binary.  Specify `true' if the binary is to
+# be stripped (optimized case) or specify `false' if the binary is not to be
+# stripped (debugging case).
+#
+DO_STRIPPING=false
+#DO_STRIPPING=true
+
+#------------------------------------------------------------------------------
+# Definition of the compiler you want to use, as well as extra flags for the
+# compiler and linker.  Also the yacc program you wish to use.
+#
+AR=ar
+XCFLAGS=
+XLDFLAGS=
+YACC=yacc
+#YACC=bison -b y
+
+#------------------------------------------------------------------------------
+# If C++ is to be used these should be used.  Specifying CPLUSOBJS includes the
+# C++ support code in the Tcl library. CCPLUS is the command to run your C++
+# compiler. CPLUSINCL is the location of your standard C++  include files.
+#
+#CPLUSOBJS=tcl++.o
+CCPLUS=CC
+CPLUSINCL=/usr/include/CC
+
+#------------------------------------------------------------------------------
+# Enable or disable Tcl history in the Tcl flag.  If this macro is set to
+# '-DTCL_NOHISTORY', the `history' command will not be available in the Tcl
+# shell.  Many people do not find the history command useful and its rather
+# large, so this way it can be excluded from the standard shell.  It will
+# still be in the library and will be available in other applications if they
+# use `Tcl_RecordAndEval'.
+#
+HISTORY_FLAG=
+
+#------------------------------------------------------------------------------
+# Memory debugging defines.  These are only of interest if you are adding C
+# code to Tcl or debugging Tcl C code. You probably don't need this unless it
+# seems like you have memory problems. They help find memory overwrites and
+# leaks.  One or more of the following flags may be specified (in the form
+# -DFLAGNAME).
+#
+#    o TCL_MEM_DEBUG - Turn on memory debugging. 
+#    o TCL_SHELL_MEM_LEAK - Dump a list of active memory blocks when the
+#      shell exits an eof (requires TCL_MEM_DEBUG).
+#
+# NOTE: If TCL_MEM_DEBUG is enabled, the Berkeley Tcl distribution must be 
+# recompiled with this option as well, or it will not link or may fail
+# with some mysterious memory problems.  Same goes for Tk if you are using
+# Tk.  If this option is to be used, all code being tested MUST be compiled
+# with TCL_MEM_DEBUG and use ckalloc and ckfree for all memory passed between
+# the application and Tcl.
+#
+# An addition a flag MEM_VALIDATE may be specified in the Berkeley Tcl
+# compilation to do validation of all memory blocks on each allocation or
+# deallocation (very slow).
+#
+MEM_DEBUG_FLAGS=
+
+#==============================================================================
+# Install options sections.  This sections describes the installation options.
+# Your might want to change some of these values before installing.
+#..............................................................................
+#
+# o TCL_OWNER - The user that will own all Tcl files after installation.
+# o TCL_GROUP - The group that all Tcl files will belong to after installation.
+#
+TCL_OWNER=bin
+TCL_GROUP=bin
+
+# o TCL_DEFAULT - Base name of Tcl default file.  This name will have a
+#   version number appended.
+#
+#TCL_DEFAULT=/etc/default/tcl
+TCL_DEFAULT=/usr/local/lib/tcldefault
+
+#
+# The directory to install Tcl binary into.
+#
+TCL_BINDIR=/usr/local/bin
+
+#
+# The directory tcl.a library goes into.
+#
+TCL_LIBDIR=/usr/local/lib
+
+#
+# The directory the Tcl .h files go into.
+#
+TCL_INCLUDEDIR=/usr/local/include
+
+#
+# The directory .tcl files and the .tlib library goes into.
+#
+TCL_TCLDIR=/usr/local/lib/tcl
+
+#==============================================================================
+# These defines specify where and how the manual pages are to be installed.
+# They are actually defined in the system specific configuration file in the
+# config directory.  Install manual pages is somewhat problematic, so a global
+# option not to install manual pages is provided. Since there are so many
+# manual pages provided, they are placed together in one Tcl manual page
+# directory, rather than splitting into the standard manual pages directories.
+# The actual definitions of these variables are set for in the system
+# dependent file.  You might want to modify these values.
+#..............................................................................
+
+#
+# Set to 1 to install manual files, to 0 to not install manual files.
+#
+
+TCL_MAN_INSTALL=1
+
+#
+# o TCL_MAN_BASEDIR - Base manual directory where all of the man.* and cat.*
+#   directories live.
+#
+TCL_MAN_BASEDIR=/usr/local/man
+
+#
+# o TCL_MAN_CMD_SECTION - Section for Tcl command  manual pages. Normal `1' or
+#   `C'.  You might perfer TCL since there are some many.
+#
+# o TCL_MAN_FUNC_SECTION - Section for Tcl C level function manual pages.
+#   In some cases it might be desirable install all manual pages in one
+#   section, in this case, the value should be the same as TCL_MAN_CMD_SECTION.
+#
+#TCL_MAN_CMD_SECTION=TCL
+#TCL_MAN_FUNC_SECTION=TCL
+TCL_MAN_CMD_SECTION=1
+TCL_MAN_FUNC_SECTION=3
+
+#
+# o TK_MAN_CMD_SECTION - Section for Tk command  manual pages. Normal `1' or
+#   `C'.  You might perfer TK since there are some many.
+#
+# o TK_MAN_FUNC_SECTION - Section for Tk C level function manual pages.
+#   In some cases it might be desirable install all manual pages in one
+#   section, in this case, the value should be the same as TK_MAN_CMD_SECTION.
+#
+#TK_MAN_CMD_SECTION=TK
+#TK_MAN_FUNC_SECTION=TK
+TK_MAN_CMD_SECTION=1
+TK_MAN_FUNC_SECTION=3
+
+
+#..............................................................................
+# The rest of the manual page install options are set in the system dependent
+# configuration file (config/*)
+#
+
+# o TCL_MAN_SEPARATOR - The separator character used in the directory name
+#   of the cat* and man* manual directories.  This is usually empty or 
+#   a period.
+#
+# o TCL_MAN_STYLE - The style of manual management the system has.It is
+#   a string with one of the following values:
+#      o SHORT - Short file name installation (an index can be generated).
+#      o LONG - Long file name installation, a link will be made for each
+#        name the manual page is to be available under.
+#   This flag is optional, if omitted LONG is assumed.
+#
+# o TCL_MAN_INDEX - If 1, then a manual page index will be build in the manual
+#   base directory named index.TCL. Not useful if TCL_MAN_STYLE is LONG. Each
+#   line in the file has the form:
+#       mansubject manfile section
+#   This flag is optional, if omitted 0 is assumed.
+#
+
+#==============================================================================
+# System specific configuration.  A system configuration file in the config
+# directory defines the following mactos required for your version of Unix.
+# In addition to the options defined in the Berkeley source the following
+# options can be defined here.  This information will help you build your own
+# system configuration if one is not supplied here.  The configuration file
+# name is specified an the end of this section.
+#
+#    o SYS_DEP_FLAGS - The system dependency flags.  The following options are
+#      available, these should be defined using -Dflag.
+#
+#      o TCL_HAVE_SETLINEBUF - Define if the `setlinebuf' is available as part
+#        of stdio.
+#
+#      o TCL_32_BIT_RANDOM - Define if the `rand' function returns a value in
+#        the range 0..(2^31)-1, leave undefined if `rand' returns a value
+#        in the range 0..(2^15)-1.
+#
+#      o TCL_NO_SELECT - The select call is not available.
+#
+#      o TCL_NEED_SYS_SELECT_H - Define if <sys/select.h> is required. May not
+#        need it, even if it is there.
+#
+#      o TCL_USE_BZERO_MACRO - Use a macro to define bzero for the select
+#        FD_ZERO macro.
+#
+#      o TCL_POSIX_SIG - Set if posix signals are available (sigaction, etc).
+#
+#      o TCL_HAVE_CATGETS - Set if XPG/3 message catalogs are available
+#        (catopen, catgets, etc).
+#
+#      o TCL_TM_GMTOFF - Set if the seconds east of GMT field in struct tm is
+#        names 'tm_gmtoff'.  Not set if its is names 'tm_tzadj'.
+#
+#      o TCL_TIMEZONE_VAR - If the timezone varaible is used in place of 
+#        one of the fields from struct tm.
+#
+#      o TCL_NEED_TIME_H - Set if time.h is required.
+#
+#      o TCL_SIG_PROC_INT - Set if signal functions return int rather than
+#        void.
+#
+#      o TCL_NO_ITIMER - Set if setitimer is not available.
+#
+#      o TCL_IEEE_FP_MATH - Set if IEEE 745-1985 error reporting via the value
+#        a function returns is to be used instead of the standard matherr
+#        mechanism.
+#
+#      o TCL_NO_FILE_LOCKING - Set if the fcntl system call does not support
+#        file locking.
+#
+#      o TCL_DUP_CLK_TCK - On some systems that have both time.h and
+#        sys/time.h, tclUnix.h defines CLK_TCK then tclExtdInt.h includes
+#        time.h and you get a redefiniton warning.  Set this flag to prevent
+#        the warning (its not safe to just unset it).
+#
+#    o LIBS - The flags to specify when linking the tclshell.
+#
+#    o TCL_TK_LIBS - The libraries to link the TK wish program.  This should
+#      also include libraries specified for LIBS, as both values may not be
+#      used together due to library ordering constraints.
+#
+#    o RANLIB_CMD - Either `ranlib' if ranlib is required or `true' if ranlib
+#      should not be used.
+#
+#    o MCS_CMD - Command to delete comments from the object file comment
+#      section, if available.  The command `true' if it's not available.  This
+#      makes the object file even smaller after its stipped.
+#
+#    o SUPPORT_FLAGS - The flags for SUPPORT_OBJS code.  The following options
+#      are available, these should be defined using -Dflag.
+#
+#      o TCL_HAS_TM_ZONE - If if 'struct tm' has the 'tm_zone' field.   Used
+#        by strftime.
+#
+#    o SUPPORT_OBJS - The object files to compile to implement library 
+#      functions that are not available on this particular version of Unix or 
+#      do not function correctly.  The following are available:
+#         o strftime.o
+#
+#..............................................................................
diff --git a/src/tclx/config/aux b/src/tclx/config/aux
new file mode 100644 (file)
index 0000000..d67526a
--- /dev/null
@@ -0,0 +1,14 @@
+#------------------------------------------------------------------------------
+# A/UX 2.0.1 - System V.2 derivative with BSD extensions
+#------------------------------------------------------------------------------
+# $Id: aux,v 2.2 1992/11/08 17:23:40 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS= -DTCL_USE_BZERO_MACRO -DTCL_SIG_PROC_INT
+LIBS=-lc_s -lm
+RANLIB_CMD=true
+MCS_CMD=true
+TCL_TK_LIBS= -lX11 -lm
+
+TCL_MAN_SEPARATOR=.
+TCL_MAN_STYLE=LONG
diff --git a/src/tclx/config/bsd b/src/tclx/config/bsd
new file mode 100644 (file)
index 0000000..9e41f35
--- /dev/null
@@ -0,0 +1,16 @@
+#------------------------------------------------------------------------------
+# BSD
+#------------------------------------------------------------------------------
+# $Id: bsd,v 2.1 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS=-DTCL_HAVE_SETLINEBUF -DTCL_32_BIT_RANDOM
+LIBS=-lm
+RANLIB_CMD=ranlib
+MCS_CMD=true
+SUPPORT_FLAGS=-DTCL_HAS_TM_ZONE
+SUPPORT_OBJS=strftime.o
+TCL_TK_LIBS= -lX11 -lm
+
+TCL_MAN_SEPARATOR=
+
diff --git a/src/tclx/config/bsd-4.3 b/src/tclx/config/bsd-4.3
new file mode 100644 (file)
index 0000000..027c14c
--- /dev/null
@@ -0,0 +1,15 @@
+#------------------------------------------------------------------------------
+# BSD 4.3
+#------------------------------------------------------------------------------
+# $Id: bsd-4.3,v 2.2 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS=-DTCL_HAVE_SETLINEBUF -DTCL_32_BIT_RANDOM -DTCL_POSIX_SIG
+LIBS=-lm
+RANLIB_CMD=ranlib
+MCS_CMD=true
+SUPPORT_FLAGS=-DTCL_HAS_TM_ZONE
+TCL_TK_LIBS= -lX11 -lm
+
+TCL_MAN_SEPARATOR=
+
diff --git a/src/tclx/config/dos b/src/tclx/config/dos
new file mode 100644 (file)
index 0000000..5c8bd68
--- /dev/null
@@ -0,0 +1,14 @@
+#------------------------------------------------------------------------------
+# Microsoft DOS newer versions (~3.3, let us know which ones works for you)
+#------------------------------------------------------------------------------
+# $Id: dos v 1.0 1993/06/27 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+#SYS_DEP_FLAGS=-DTCL_HAVE_SETLINEBUF -DTCL_IEEE_FP_MATH -DTCL_32_BIT_RANDOM -DTCL_POSIX_SIG -DTCL_TM_GMTOFF
+SYS_DEP_FLAGS=-DTCL_NO_ITIMER -DTCL_NO_FILE_LOCKING -DTCL_IEEE_FP_MATH -DTCL_32_BIT_RANDOM -DTCL_POSIX_SIG -DTCL_TM_GMTOFF
+LIBS=-lsys -lm
+RANLIB_CMD=ranlib
+MCS_CMD=true
+TCL_TK_LIBS= -lX11 -lm
+
+TCL_MAN_SEPARATOR=
diff --git a/src/tclx/config/hpux b/src/tclx/config/hpux
new file mode 100644 (file)
index 0000000..427ef48
--- /dev/null
@@ -0,0 +1,14 @@
+#------------------------------------------------------------------------------
+# HPUX - Hewlett-Packard HP/UX
+#------------------------------------------------------------------------------
+# $Id: hpux,v 2.3 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS= -DTCL_32_BIT_RANDOM -DTCL_POSIX_SIG -DTCL_TIMEZONE_VAR
+LIBS=-lBSD -lPW -lm
+RANLIB_CMD=true
+MCS_CMD=true
+SUPPORT_FLAGS=-DTCL_HAS_TM_ZONE
+TCL_TK_LIBS= -L/usr/lib/X11R5 -lX11 -lBSD -lPW -lm
+
+TCL_MAN_SEPARATOR=
diff --git a/src/tclx/config/linux b/src/tclx/config/linux
new file mode 100644 (file)
index 0000000..12a800d
--- /dev/null
@@ -0,0 +1,13 @@
+#------------------------------------------------------------------------------
+# SUN OS newer versions (~4.1, let us know which ones works for you)
+#------------------------------------------------------------------------------
+# $Id: sunos4.1,v 2.3 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS=-DTCL_HAVE_SETLINEBUF -DTCL_32_BIT_RANDOM -DTCL_POSIX_SIG -DTCL_TM_GMTOFF
+LIBS=-lm
+RANLIB_CMD=ranlib
+MCS_CMD=true
+TCL_TK_LIBS= -L/usr/X11/lib -lX11 -lm -lXpm
+
+TCL_MAN_SEPARATOR=
diff --git a/src/tclx/config/osf1 b/src/tclx/config/osf1
new file mode 100644 (file)
index 0000000..4cb8652
--- /dev/null
@@ -0,0 +1,15 @@
+#------------------------------------------------------------------------------
+# SUN OS newer versions (~4.1, let us know which ones works for you)
+#------------------------------------------------------------------------------
+# $Id: sunos4.1,v 2.3 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+#SYS_DEP_FLAGS=-DTCL_HAVE_SETLINEBUF -DTCL_32_BIT_RANDOM -DTCL_POSIX_SIG -DTCL_TM_GMTOFF
+SYS_DEP_FLAGS=-DTCL_32_BIT_RANDOM -DTCL_POSIX_SIG -DTCL_TIMEZONE_VAR
+LIBS=-lm
+RANLIB_CMD=ranlib
+MCS_CMD=true
+SUPPORT_FLAGS=-DTCL_HAS_TM_ZONE
+TCL_TK_LIBS= -lX11 -lm
+
+TCL_MAN_SEPARATOR=
diff --git a/src/tclx/config/rs6000 b/src/tclx/config/rs6000
new file mode 100644 (file)
index 0000000..ad26a2e
--- /dev/null
@@ -0,0 +1,18 @@
+#------------------------------------------------------------------------------
+# IBM RS6000  (AIX 3.2.2)
+#   o very troublesome system.  NO_SELECT since select is non-standard.
+#------------------------------------------------------------------------------
+# $Id: rs6000,v 2.3 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS=-DTCL_HAVE_SETLINEBUF -DTCL_32_BIT_RANDOM  \
+    -DTCL_NO_SELECT -DTCL_TIMEZONE_VAR -D_NO_PROTO -U__STR__ -D_BSD_INCLUDES
+LIBS=-lm
+RANLIB_CMD=ranlib
+MCS_CMD=true
+SUPPORT_FLAGS=-DTCL_HAS_TM_ZONE
+SUPPORT_OBJS=strftime.o
+TCL_TK_LIBS= -lX11 -lm
+
+TCL_MAN_SEPARATOR=
+
diff --git a/src/tclx/config/scoodt1.1 b/src/tclx/config/scoodt1.1
new file mode 100644 (file)
index 0000000..61ef9ad
--- /dev/null
@@ -0,0 +1,16 @@
+#------------------------------------------------------------------------------
+#  SCO ODT 1.1 - System V 3.2.2
+#------------------------------------------------------------------------------
+# $Id: scoodt1.1,v 2.2 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS=-DTCL_USE_BZERO_MACRO -DTCL_POSIX_SIG -DTCL_NEED_TIME_H -DTCL_DUP_CLK_TCK
+LIBS= -lm -lintl -lmalloc -lc_s
+RANLIB_CMD=true
+MCS_CMD=mcs -d
+TCL_TK_LIBS= -lX11 -lsocket -lm -lintl -lmalloc -lc_s
+
+TCL_MAN_SEPARATOR=.
+TCL_MAN_STYLE=SHORT
+TCL_MAN_INDEX=1
+
diff --git a/src/tclx/config/scoodt2.0 b/src/tclx/config/scoodt2.0
new file mode 100644 (file)
index 0000000..3531725
--- /dev/null
@@ -0,0 +1,14 @@
+#------------------------------------------------------------------------------
+#  SCO ODT 2.0 - System V 3.2.4
+#------------------------------------------------------------------------------
+# $Id: scoodt2.0,v 2.2 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS=-DTCL_POSIX_SIG -DTCL_NEED_TIME_H -DTCL_DUP_CLK_TCK
+LIBS= -lm -lintl -lmalloc -lc_s
+RANLIB_CMD=true
+MCS_CMD=mcs -d
+TCL_TK_LIBS= -lX11_s -lsocket -lm -lintl -lmalloc
+
+TCL_MAN_SEPARATOR=.
+
diff --git a/src/tclx/config/sgi b/src/tclx/config/sgi
new file mode 100644 (file)
index 0000000..07f59c8
--- /dev/null
@@ -0,0 +1,17 @@
+#------------------------------------------------------------------------------
+# SGI IRIX 4.0
+#------------------------------------------------------------------------------
+# The strftime function supplied with IRIX 4.0.5 is broken, when a time
+# is 12:00 AM, %I and %r return times of 00:00, as if it was 24-hour time.
+# We substitute in our own version of strftime to fix this problem.
+#------------------------------------------------------------------------------
+# $Id: sgi,v 2.7 1992/11/09 07:18:22 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS=-DTCL_HAVE_SETLINEBUF -DTCL_POSIX_SIG -DTCL_IEEE_FP_MATH -DTCL_TIMEZONE_VAR
+LIBS=-lm
+RANLIB_CMD=true
+MCS_CMD=true
+TCL_TK_LIBS= -lX11 -lm
+SUPPORT_OBJS=strftime.o
+TCL_MAN_SEPARATOR=
diff --git a/src/tclx/config/solaris2 b/src/tclx/config/solaris2
new file mode 100644 (file)
index 0000000..06f5589
--- /dev/null
@@ -0,0 +1,15 @@
+#------------------------------------------------------------------------------
+# SUN OS newer versions (~4.1, let us know which ones works for you)
+#------------------------------------------------------------------------------
+# $Id: sunos4.1,v 2.3 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+#SYS_DEP_FLAGS=-DTCL_HAVE_SETLINEBUF -DTCL_32_BIT_RANDOM -DTCL_POSIX_SIG -DTCL_TM_GMTOFF
+SYS_DEP_FLAGS=-DTCL_32_BIT_RANDOM -DTCL_POSIX_SIG -DTCL_TIMEZONE_VAR -I/usr/openwin/include
+LIBS=-lm -lsocket -lnsl
+RANLIB_CMD=echo
+MCS_CMD=true
+SUPPORT_FLAGS=-DTCL_HAS_TM_ZONE
+TCL_TK_LIBS= -lX11 -lm -lsocket -lnsl
+
+TCL_MAN_SEPARATOR=
diff --git a/src/tclx/config/sunos4.0 b/src/tclx/config/sunos4.0
new file mode 100644 (file)
index 0000000..770df3b
--- /dev/null
@@ -0,0 +1,15 @@
+#------------------------------------------------------------------------------
+# SUN OS older versions (~4.0, let us know which one works for you)
+#------------------------------------------------------------------------------
+# $Id: sunos4.0,v 2.1 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS=-DTCL_HAVE_SETLINEBUF -DTCL_32_BIT_RANDOM
+LIBS=-lm
+RANLIB_CMD=ranlib
+MCS_CMD=true
+SUPPORT_FLAGS=-DTCL_HAS_TM_ZONE
+SUPPORT_OBJS=strftime.o
+TCL_TK_LIBS= -lX11 -lm
+
+TCL_MAN_SEPARATOR=
diff --git a/src/tclx/config/sunos4.1 b/src/tclx/config/sunos4.1
new file mode 100644 (file)
index 0000000..75d3d88
--- /dev/null
@@ -0,0 +1,13 @@
+#------------------------------------------------------------------------------
+# SUN OS newer versions (~4.1, let us know which ones works for you)
+#------------------------------------------------------------------------------
+# $Id: sunos4.1,v 2.3 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS=-DTCL_HAVE_SETLINEBUF -DTCL_32_BIT_RANDOM -DTCL_POSIX_SIG -DTCL_TM_GMTOFF
+LIBS=-lm
+RANLIB_CMD=ranlib
+MCS_CMD=true
+TCL_TK_LIBS= -lX11 -lm
+
+TCL_MAN_SEPARATOR=
diff --git a/src/tclx/config/sysv.3.2.0 b/src/tclx/config/sysv.3.2.0
new file mode 100644 (file)
index 0000000..98f987f
--- /dev/null
@@ -0,0 +1,15 @@
+#------------------------------------------------------------------------------
+# System V 3.2.0 (tested on Bell-Tech or Intel Unix for the Intel 386)
+#------------------------------------------------------------------------------
+# $Id: sysv.3.2.0,v 2.2 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS=-DTCL_NO_SELECT -DTCL_NO_ITIMER -DTCL_NO_FILE_LOCKING
+LIBS=-lform -lm -lc_s
+RANLIB_CMD=true
+MCS_CMD=mcs -d
+
+TCL_MAN_SEPARATOR=.
+TCL_MAN_STYLE=SHORT
+TCL_MAN_INDEX=1
+
diff --git a/src/tclx/config/ultrix b/src/tclx/config/ultrix
new file mode 100644 (file)
index 0000000..8a205c2
--- /dev/null
@@ -0,0 +1,16 @@
+#------------------------------------------------------------------------------
+# DEC Ultrix
+#------------------------------------------------------------------------------
+# $Id: ultrix,v 2.1 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS=-DTCL_HAVE_SETLINEBUF -DTCL_32_BIT_RANDOM -DTCL_TM_GMTOFF
+LIBS=-lm
+RANLIB_CMD=ranlib
+MCS_CMD=true
+SUPPORT_FLAGS=-DTCL_HAS_TM_ZONE
+SUPPORT_OBJS=strftime.o
+TCL_TK_LIBS= -lX11 -lm
+
+TCL_MAN_SEPARATOR=
+
diff --git a/src/tclx/config/ultrix4.2 b/src/tclx/config/ultrix4.2
new file mode 100644 (file)
index 0000000..34e501b
--- /dev/null
@@ -0,0 +1,14 @@
+#------------------------------------------------------------------------------
+# DEC Ultrix 4.2 
+#------------------------------------------------------------------------------
+# $Id: ultrix4.2,v 1.3 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS=-DTCL_HAVE_SETLINEBUF -DTCL_32_BIT_RANDOM -DTCL_TM_GMTOFF
+LIBS=-lm
+RANLIB_CMD=ranlib
+MCS_CMD=true
+TCL_TK_LIBS= -lX11 -lm
+
+TCL_MAN_SEPARATOR=
+
diff --git a/src/tclx/config/xenix b/src/tclx/config/xenix
new file mode 100644 (file)
index 0000000..a73b173
--- /dev/null
@@ -0,0 +1,15 @@
+#------------------------------------------------------------------------------
+#    XENIX-386 - SCO Xenix 2.3.3 for the 80386
+#------------------------------------------------------------------------------
+# $Id: xenix,v 2.2 1992/11/08 17:24:26 markd Exp $
+#------------------------------------------------------------------------------
+#
+SYS_DEP_FLAGS= -DTCL_NEED_SYS_SELECT_H -DTCL_USE_BZERO_MACRO -DTCL_SIG_PROC_INT -DTCL_NO_ITIMER
+LIBS=-ldir -lm
+RANLIB_CMD=ranlib
+MCS_CMD=true
+
+TCL_MAN_STYLE=SHORT
+TCL_MAN_INDEX=1
+TCL_MAN_INDEX_MERGE=1
+
diff --git a/src/tclx/makefile b/src/tclx/makefile
new file mode 100644 (file)
index 0000000..fae1059
--- /dev/null
@@ -0,0 +1,162 @@
+#
+# Makefile --
+#
+# Makefile for Extended Tcl.  This requires Tcl 6.1 or Tcl 6.2 from Berkeley,
+# which should be compiled before running this makefile.  Its location is
+# configured below.
+# 
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: Makefile,v 2.0 1992/10/16 04:54:45 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+include config.mk
+include config/$(TCL_CONFIG_FILE)
+SHELL=/bin/sh
+
+#------------------------------------------------------------------------------
+
+# List of files that are touched by secondary makefiles when something changes.
+
+MADE.FILES=ucbsrc/made.tmp ossupp/made.tmp src/made.tmp
+TKMADE.FILES=tkucbsrc/made.tmp
+
+CFLAGS= $(OPTIMIZE_FLAG) $(XCFLAGS) -I$(TCL_UCB_DIR) $(MEM_DEBUG_FLAGS) \
+        $(SYS_DEP_FLAGS)
+
+#------------------------------------------------------------------------------
+
+all: tcl tcldef runtcl $(TCL_TK_SHELL)
+
+
+#------------------------------------------------------------------------------
+# Compile the Extended Tcl library and link the Tcl shell.
+#
+
+tcl: TCLX_MAKES
+
+TCLX_MAKES: libtcl.a
+       cd ucbsrc;    $(MAKE) -$(MAKEFLAGS) all
+       cd ossupp;    $(MAKE) -$(MAKEFLAGS) all
+       cd tclsrc;    $(MAKE) -$(MAKEFLAGS) all
+       cd src;       $(MAKE) -$(MAKEFLAGS) all
+
+
+# Copy the UCB libtcl.a file from where it was built.  Force the other
+# Makefiles to add their .o files to the library by nuking their made.tmp file.
+
+libtcl.a: $(TCL_UCB_DIR)/libtcl.a
+       cp $(TCL_UCB_DIR)/libtcl.a .
+       rm -f  $(MADE.FILES)
+
+#------------------------------------------------------------------------------
+# Generate a libtk.a with extensions and a wish shell with Extended Tcl
+# commands.
+#
+
+wish: TKX_MAKES runwish
+
+TKX_MAKES: libtk.a
+       cd tkucbsrc; $(MAKE) -$(MAKEFLAGS) all
+       cd tksrc;    $(MAKE) -$(MAKEFLAGS) all
+
+
+# Copy the UCB libtk.a file.  Force the other Makefiles to add their
+# .o files to the library by nuking their made.tmp file.
+
+libtk.a: $(TCL_TK_DIR)/libtk.a
+       cp $(TCL_TK_DIR)/libtk.a libtk.a
+       rm -f $(TKMADE.FILES)
+
+
+#------------------------------------------------------------------------------
+# Generate a temporary TCLDEFAULT file so Tcl can be run in this directory.
+# Also generate a script to point the TCLDEFAULT environment variable
+# at this file for testing Tcl before its installed.
+
+tcldef:
+       @echo " -       Generating temporary TCLDEFAULT file.     -"
+       @echo " - Use runtcl script to test Tcl before installing -"
+       @echo " - Use runwish script to test Tk before installing -"
+       @echo '# Temporary TCLDEFAULT file for debugging'  >tcldef
+       @echo "set TCLPATH `pwd`/tcllib"                  >>tcldef
+       @echo "set TCLINIT `pwd`/tcllib/tclinit.tcl"      >>tcldef
+
+runtcl:
+       @echo ':'                                              >runtcl
+       @echo '# script for testing Tcl before installation'  >>runtcl
+       @echo "TCLDEFAULT=`pwd`/tcldef"                       >>runtcl
+       @echo "export TCLDEFAULT"                             >>runtcl
+       @echo "if [ \$$# = 0 ]"                               >>runtcl
+       @echo "then"                                          >>runtcl
+       @echo "    exec `pwd`/tcl"                            >>runtcl
+       @echo "else"                                          >>runtcl
+       @echo "    exec `pwd`/tcl \"\$$@\""                   >>runtcl
+       @echo "fi"                                            >>runtcl
+       chmod a+rx runtcl
+
+runwish:
+       @echo ':'                                              >runwish
+       @echo '# script for testing wish before installation' >>runwish
+       @echo "TCLDEFAULT=`pwd`/tcldef"                       >>runwish
+       @echo "export TCLDEFAULT"                             >>runwish
+       @echo "if [ \$$# = 0 ]"                               >>runwish
+       @echo "then"                                          >>runwish
+       @echo "    exec `pwd`/wish"                           >>runwish
+       @echo "else"                                          >>runwish
+       @echo "    exec `pwd`/wish \"\$$@\""                  >>runwish
+       @echo "fi"                                            >>runwish
+       chmod a+rx runwish
+
+#------------------------------------------------------------------------------
+#
+#  just test to see if the C++ include file compiles and links
+
+tclplus:
+       cd src;$(MAKE) -$(MAKEFLAGS) tclplus
+
+#------------------------------------------------------------------------------
+#
+# Run the UCB and Extended Tcl tests.
+
+test: ucbtests extdtests
+
+ucbtests: all
+       @echo ""
+       @echo "**************************************************"
+       @echo "* Ignore failures in tests:  expr-2.2 & expr-2.6 *"
+       @echo "**************************************************"
+       @echo ""
+       ./runtcl -c "cd $(TCL_UCB_DIR)/tests;source all"
+
+extdtests: all
+       ./runtcl -c "cd tests;source all"       
+
+#------------------------------------------------------------------------------
+# Install Tcl.
+
+install: all
+       ./runtcl tclsrc/install.tcl
+
+
+#------------------------------------------------------------------------------
+# Clean up the mess we made.
+
+clean:
+       cd ucbsrc;    $(MAKE) -$(MAKEFLAGS) clean
+       cd ossupp;    $(MAKE) -$(MAKEFLAGS) clean
+       cd src;       $(MAKE) -$(MAKEFLAGS) clean
+       cd tclsrc;    $(MAKE) -$(MAKEFLAGS) clean
+       cd tkucbsrc;  $(MAKE) -$(MAKEFLAGS) clean
+       cd tksrc;     $(MAKE) -$(MAKEFLAGS) clean
+       touch junk~ config/junk~
+       -rm -f *~ config/*~ libtcl.a tcldef libtk.a runtcl runwish
diff --git a/src/tclx/ossupp/fcntl.c b/src/tclx/ossupp/fcntl.c
new file mode 100644 (file)
index 0000000..45df1ca
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * fcntl.c
+ *
+ * Public-domain relatively quick-and-dirty implemenation of
+ * ANSI library routine for System V Unix systems.
+ *
+ * It's written in old-style C for maximal portability.
+ *
+ * Arnold Robbins
+ * January, February, 1991
+ *
+ * Fixes from ado@elsie.nci.nih.gov
+ * February 1991
+ *-----------------------------------------------------------------------------
+ * $Id: fcntl.c,v 2.0 1992/10/16 04:52:16 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ * To avoid Unix version problems, this code has been simplified to avoid
+ * const and size_t, however this can cause an incompatible definition on
+ * ansi-C systems, so a game is played with defines to ignore a strftime
+ * declaration in time.h
+ */
+
+#include <stdio.h>
+
+
+/* fcntl --- performs open file attribute access */
+
+int
+fcntl(fd, cmd, arg)
+    int    fd;
+    int    cmd;
+    int    arg;
+{
+    int rc = 0;
+
+    return rc;
+}
diff --git a/src/tclx/ossupp/ids.c b/src/tclx/ossupp/ids.c
new file mode 100644 (file)
index 0000000..14e8065
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * ids.c
+ *
+ * Public-domain relatively quick-and-dirty implemenation of
+ * ANSI library routine for System V Unix systems.
+ *
+ * It's written in old-style C for maximal portability.
+ *
+ * Arnold Robbins
+ * January, February, 1991
+ *
+ * Fixes from ado@elsie.nci.nih.gov
+ * February 1991
+ *-----------------------------------------------------------------------------
+ * $Id: ids.c,v 2.0 1992/10/16 04:52:16 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ * To avoid Unix version problems, this code has been simplified to avoid
+ * const and size_t, however this can cause an incompatible definition on
+ * ansi-C systems, so a game is played with defines to ignore a strftime
+ * declaration in time.h
+ */
+
+#include <sys/types.h>
+
+static uid_t usrID  = 100;
+static gid_t grpID  = 10;
+
+static int   procID = 12345;
+static int   pgrpID = 10;
+
+
+/* getppid --- returns the process ID of the parent process */
+
+int
+getppid()
+{
+    return procID;
+}
+
+/* getpgrp --- returns the process group of the process indicated by pid */
+
+int
+getpgrp(pid)
+    int pid;
+{
+    return pgrpID;
+}
+
+/* setpgrp --- sets the process group of the process indicated by pid */
+
+int
+setpgrp(pid, pgrp)
+    int pid;
+    int pgrp;
+{
+    pgrpID = pgrp;
+    return pgrp;
+}
+
+/* setuid --- sets the real and effective user ID of the current process */
+
+int setuid(uid)
+    uid_t  uid;
+{
+    usrID = uid;
+    return 0;
+}
+
+/* getgid --- gets the effective group ID of the current process */
+
+uid_t setgid(gid)
+    gid_t  gid;
+{
+    grpID = gid;
+    return 0;
+}
+
diff --git a/src/tclx/ossupp/makefile b/src/tclx/ossupp/makefile
new file mode 100644 (file)
index 0000000..a01156f
--- /dev/null
@@ -0,0 +1,41 @@
+#
+# Makefile  --
+#
+# Makefile for Extended Tcl ossupport code.
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: Makefile,v 2.1 1992/11/07 22:33:46 markd Exp $
+#------------------------------------------------------------------------------
+#
+
+include ../config.mk
+include ../config/$(TCL_CONFIG_FILE)
+SHELL=/bin/sh
+
+#------------------------------------------------------------------------------
+
+CFLAGS=$(OPTIMIZE_FLAG) $(XCFLAGS) -I../$(TCL_UCB_DIR) $(MEM_DEBUG_FLAGS) \
+  $(SYS_DEP_FLAGS) $(SUPPORT_FLAGS)
+
+#------------------------------------------------------------------------------
+
+all: made.tmp
+
+made.tmp: $(SUPPORT_OBJS)
+       $(AR) cr ../libtcl.a $(SUPPORT_OBJS)
+       touch made.tmp
+
+#------------------------------------------------------------------------------
+
+clean:
+       touch junk~
+       -rm -f *~ made.tmp
+       -rm -f *.o
diff --git a/src/tclx/ossupp/makefile.dvx b/src/tclx/ossupp/makefile.dvx
new file mode 100644 (file)
index 0000000..da33a95
--- /dev/null
@@ -0,0 +1,46 @@
+#
+# Makefile  --
+#
+# Makefile for Extended Tcl ossupport code.
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: Makefile,v 2.1 1992/11/07 22:33:46 markd Exp $
+#------------------------------------------------------------------------------
+#
+
+include ..\Config.mk
+include ..\config\$(TCL_CONFIG_FILE)
+#SHELL=/bin/sh
+
+#------------------------------------------------------------------------------
+
+CFLAGS=$(OPTIMIZE_FLAG) $(XCFLAGS) -I../$(TCL_UCB_DIR) $(MEM_DEBUG_FLAGS) \
+ -DTCL_HAS_TM_ZONE $(SUPPORT_FLAGS)
+
+#------------------------------------------------------------------------------
+
+.c.o:
+       $(CC) $(CFLAGS) <@< -c $<
+$(SYS_DEP_FLAGS) 
+<
+
+all: made.tmp
+
+made.tmp: $(SUPPORT_OBJS)
+       $(AR) cr ..\libtcl.a $(SUPPORT_OBJS)
+       $(RANLIB) ..\libtcl.a
+       touch made.tmp
+
+#------------------------------------------------------------------------------
+
+clean:
+       -rm -f made.tmp
+       -rm -f *.o
diff --git a/src/tclx/ossupp/sigs.c b/src/tclx/ossupp/sigs.c
new file mode 100644 (file)
index 0000000..f72fb3b
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * sigs.c
+ *
+ * Public-domain relatively quick-and-dirty implemenation of
+ * ANSI library routine for System V Unix systems.
+ *
+ * It's written in old-style C for maximal portability.
+ *
+ * Arnold Robbins
+ * January, February, 1991
+ *
+ * Fixes from ado@elsie.nci.nih.gov
+ * February 1991
+ *-----------------------------------------------------------------------------
+ * $Id: sigs.c,v 2.0 1992/10/16 04:52:16 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ * To avoid Unix version problems, this code has been simplified to avoid
+ * const and size_t, however this can cause an incompatible definition on
+ * ansi-C systems, so a game is played with defines to ignore a strftime
+ * declaration in time.h
+ */
+
+#include <signal.h>
+
+
+/* sigprocmask --- examines or changes the calling processes' signal mask */
+
+int
+sigprocmask(how, set, oset)
+    int    how;
+    sigset_t *set;
+    sigset_t *oset;
+{
+    int rc = 0;
+
+    return rc;
+}
diff --git a/src/tclx/ossupp/strftime.c b/src/tclx/ossupp/strftime.c
new file mode 100644 (file)
index 0000000..f46dfd7
--- /dev/null
@@ -0,0 +1,296 @@
+/*
+ * strftime.c
+ *
+ * Public-domain relatively quick-and-dirty implemenation of
+ * ANSI library routine for System V Unix systems.
+ *
+ * It's written in old-style C for maximal portability.
+ *
+ * The code for %c, %x, and %X is my best guess as to what's "appropriate".
+ * This version ignores LOCALE information.
+ * It also doesn't worry about multi-byte characters.
+ * So there.
+ *
+ * Arnold Robbins
+ * January, February, 1991
+ *
+ * Fixes from ado@elsie.nci.nih.gov
+ * February 1991
+ *-----------------------------------------------------------------------------
+ * $Id: strftime.c,v 2.0 1992/10/16 04:52:16 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ * To avoid Unix version problems, this code has been simplified to avoid
+ * const and size_t, however this can cause an incompatible definition on
+ * ansi-C systems, so a game is played with defines to ignore a strftime
+ * declaration in time.h
+ */
+
+#define strftime ___srtftime
+
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <sys/types.h>
+
+#undef strftime
+
+extern char *strchr();
+static int weeknumber();
+
+#ifndef TCL_HAS_TM_ZONE
+extern char *tzname[2];
+extern int daylight;
+#endif
+
+/* strftime --- produce formatted time */
+
+int
+strftime(s, maxsize, format, timeptr)
+    char            *s;
+    int              maxsize;
+    char            *format;
+    struct tm       *timeptr;
+{
+       char *endp = s + maxsize;
+       char *start = s;
+       char tbuf[100];
+       int i;
+
+       /* various tables, useful in North America */
+       static char *days_a[] = {
+               "Sun", "Mon", "Tue", "Wed",
+               "Thu", "Fri", "Sat",
+       };
+       static char *days_l[] = {
+               "Sunday", "Monday", "Tuesday", "Wednesday",
+               "Thursday", "Friday", "Saturday",
+       };
+       static char *months_a[] = {
+               "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+               "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
+       };
+       static char *months_l[] = {
+               "January", "February", "March", "April",
+               "May", "June", "July", "August", "September",
+               "October", "November", "December",
+       };
+       static char *ampm[] = { "AM", "PM", };
+
+       if (s == NULL || format == NULL || timeptr == NULL || maxsize == 0)
+               return 0;
+
+       if (strchr(format, '%') == NULL && strlen(format) + 1 >= maxsize)
+               return 0;
+
+       for (; *format && s < endp - 1; format++) {
+               tbuf[0] = '\0';
+               if (*format != '%') {
+                       *s++ = *format;
+                       continue;
+               }
+               switch (*++format) {
+               case '\0':
+                       *s++ = '%';
+                       goto out;
+
+               case '%':
+                       *s++ = '%';
+                       continue;
+
+               case 'a':       /* abbreviated weekday name */
+                       if (timeptr->tm_wday < 0 || timeptr->tm_wday > 6)
+                               strcpy(tbuf, "?");
+                       else
+                               strcpy(tbuf, days_a[timeptr->tm_wday]);
+                       break;
+
+               case 'A':       /* full weekday name */
+                       if (timeptr->tm_wday < 0 || timeptr->tm_wday > 6)
+                               strcpy(tbuf, "?");
+                       else
+                               strcpy(tbuf, days_l[timeptr->tm_wday]);
+                       break;
+
+               case 'h':       /* abbreviated month name */
+               case 'b':       /* abbreviated month name */
+                       if (timeptr->tm_mon < 0 || timeptr->tm_mon > 11)
+                               strcpy(tbuf, "?");
+                       else
+                               strcpy(tbuf, months_a[timeptr->tm_mon]);
+                       break;
+
+               case 'B':       /* full month name */
+                       if (timeptr->tm_mon < 0 || timeptr->tm_mon > 11)
+                               strcpy(tbuf, "?");
+                       else
+                               strcpy(tbuf, months_l[timeptr->tm_mon]);
+                       break;
+
+               case 'c':       /* appropriate date and time representation */
+                       sprintf(tbuf, "%s %s %2d %02d:%02d:%02d %d",
+                               days_a[timeptr->tm_wday],
+                               months_a[timeptr->tm_mon],
+                               timeptr->tm_mday,
+                               timeptr->tm_hour,
+                               timeptr->tm_min,
+                               timeptr->tm_sec,
+                               timeptr->tm_year + 1900);
+                       break;
+
+               case 'd':       /* day of the month, 01 - 31 */
+                       sprintf(tbuf, "%02d", timeptr->tm_mday);
+                       break;
+
+               case 'H':       /* hour, 24-hour clock, 00 - 23 */
+                       sprintf(tbuf, "%02d", timeptr->tm_hour);
+                       break;
+
+               case 'I':       /* hour, 12-hour clock, 01 - 12 */
+                       i = timeptr->tm_hour;
+                       if (i == 0)
+                               i = 12;
+                       else if (i > 12)
+                               i -= 12;
+                       sprintf(tbuf, "%02d", i);
+                       break;
+
+               case 'j':       /* day of the year, 001 - 366 */
+                       sprintf(tbuf, "%03d", timeptr->tm_yday + 1);
+                       break;
+
+               case 'm':       /* month, 01 - 12 */
+                       sprintf(tbuf, "%02d", timeptr->tm_mon + 1);
+                       break;
+
+               case 'M':       /* minute, 00 - 59 */
+                       sprintf(tbuf, "%02d", timeptr->tm_min);
+                       break;
+
+               case 'p':       /* am or pm based on 12-hour clock */
+                       if (timeptr->tm_hour < 12)
+                               strcpy(tbuf, ampm[0]);
+                       else
+                               strcpy(tbuf, ampm[1]);
+                       break;
+
+               case 'S':       /* second, 00 - 61 */
+                       sprintf(tbuf, "%02d", timeptr->tm_sec);
+                       break;
+
+               case 'U':       /* week of year, Sunday is first day of week */
+                       sprintf(tbuf, "%d", weeknumber(timeptr, 0));
+                       break;
+
+               case 'w':       /* weekday, Sunday == 0, 0 - 6 */
+                       sprintf(tbuf, "%d", timeptr->tm_wday);
+                       break;
+
+               case 'W':       /* week of year, Monday is first day of week */
+                       sprintf(tbuf, "%d", weeknumber(timeptr, 1));
+                       break;
+
+               case 'x':       /* appropriate date representation */
+                       sprintf(tbuf, "%s %s %2d %d",
+                               days_a[timeptr->tm_wday],
+                               months_a[timeptr->tm_mon],
+                               timeptr->tm_mday,
+                               timeptr->tm_year + 1900);
+                       break;
+
+               case 'X':       /* appropriate time representation */
+                       sprintf(tbuf, "%02d:%02d:%02d",
+                               timeptr->tm_hour,
+                               timeptr->tm_min,
+                               timeptr->tm_sec);
+                       break;
+
+               case 'y':       /* year without a century, 00 - 99 */
+                       i = timeptr->tm_year % 100;
+                       sprintf(tbuf, "%d", i);
+                       break;
+
+               case 'Y':       /* year with century */
+                       sprintf(tbuf, "%d", 1900 + timeptr->tm_year);
+                       break;
+
+               case 'Z':       /* time zone name or abbrevation */
+#ifdef TCL_HAS_TM_ZONE
+                        strcpy(tbuf, timeptr->tm_zone);
+#else
+                       i = 0;
+                       if (daylight && timeptr->tm_isdst)
+                               i = 1;
+                       strcpy(tbuf, tzname[i]);
+#endif
+                       break;
+
+               case 'n':       /* same as \n */
+                       tbuf[0] = '\n';
+                       tbuf[1] = '\0';
+                       break;
+
+               case 't':       /* same as \t */
+                       tbuf[0] = '\t';
+                       tbuf[1] = '\0';
+                       break;
+
+               case 'D':       /* date as %m/%d/%y */
+                       strftime(tbuf, sizeof tbuf, "%m/%d/%y", timeptr);
+                       break;
+
+               case 'e':       /* day of month, blank padded */
+                       sprintf(tbuf, "%2d", timeptr->tm_mday);
+                       break;
+
+               case 'r':       /* time as %I:%M:%S %p */
+                       strftime(tbuf, sizeof tbuf, "%I:%M:%S %p", timeptr);
+                       break;
+
+               case 'R':       /* time as %H:%M */
+                       strftime(tbuf, sizeof tbuf, "%H:%M", timeptr);
+                       break;
+
+               case 'T':       /* time as %H:%M:%S */
+                       strftime(tbuf, sizeof tbuf, "%H:%M:%S", timeptr);
+                       break;
+
+               default:
+                       tbuf[0] = '%';
+                       tbuf[1] = *format;
+                       tbuf[2] = '\0';
+                       break;
+               }
+               i = strlen(tbuf);
+               if (i)
+                       if (s + i < endp - 1) {
+                               strcpy(s, tbuf);
+                               s += i;
+                       } else
+                               return 0;
+       }
+out:
+       if (s < endp && *format == '\0') {
+               *s = '\0';
+               return (s - start);
+       } else
+               return 0;
+}
+
+/* weeknumber --- figure how many weeks into the year */
+
+/* With thanks and tip of the hatlo to ado@elsie.nci.nih.gov */
+
+static int
+weeknumber(timeptr, firstweekday)
+    struct tm *timeptr;
+    int        firstweekday;
+{
+       if (firstweekday == 0)
+               return (timeptr->tm_yday + 7 - timeptr->tm_wday) / 7;
+       else
+               return (timeptr->tm_yday + 7 -
+                       (timeptr->tm_wday ? (timeptr->tm_wday - 1) : 6)) / 7;
+}
diff --git a/src/tclx/ossupp/times.c b/src/tclx/ossupp/times.c
new file mode 100644 (file)
index 0000000..11654d6
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * times.c
+ *
+ * Public-domain relatively quick-and-dirty implemenation of
+ * ANSI library routine for System V Unix systems.
+ *
+ * It's written in old-style C for maximal portability.
+ *
+ * Arnold Robbins
+ * January, February, 1991
+ *
+ * Fixes from ado@elsie.nci.nih.gov
+ * February 1991
+ *-----------------------------------------------------------------------------
+ * $Id: times.c,v 2.0 1992/10/16 04:52:16 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ * To avoid Unix version problems, this code has been simplified to avoid
+ * const and size_t, however this can cause an incompatible definition on
+ * ansi-C systems, so a game is played with defines to ignore a strftime
+ * declaration in time.h
+ */
+
+#include <sys/types.h>
+#include <time.h>
+#include <sys/times.h>
+
+
+/* times --- produce process times */
+
+clock_t 
+times(buffer)
+    struct tms      *buffer;
+{
+    clock_t clk_time;
+
+    clk_time = clock();
+    buffer->tms_utime  = clk_time;
+    buffer->tms_utime2 = clk_time;
+    buffer->tms_stime  = clk_time;
+    buffer->tms_stime2 = clk_time;
+
+    return clk_time;
+}
diff --git a/src/tclx/readme b/src/tclx/readme
new file mode 100644 (file)
index 0000000..9d7e55d
--- /dev/null
@@ -0,0 +1,380 @@
+
+              *** README.EXTD - README file for Extended Tcl ***
+
+
+EXTENDED TCL
+============
+
+    Extended Tcl (TclX), defines a set of extensions to Tcl 6.4, the Tool
+Command Language invented by Dr. John Ousterhout of the University of
+California at Berkeley.  Tcl is a powerful, yet simple embeddable programming
+language.  Extended Tcl is oriented towards system programming tasks, with
+many additional interfaces to the Unix operating system, It is upwardly
+compatible with Tcl 6.4.  You take the Extended Tcl package, add it to Tcl
+6.4, and from that you get Extended Tcl.  (Berkeley Tcl is not included in
+this distribution, obtain it from sprite.berkeley.edu).
+
+   Support is also included for building a Tk wish shell with the Extended Tcl
+command set.
+
+    Extended Tcl was designed and implemented by Karl Lehenbauer
+(karl@NeoSoft.com) and Mark Diekhans (markd@Grizzly.com), with help in the
+early stages from Peter da Silva (peter@NeoSoft.com).
+
+   As with Berkeley Tcl, all of Extended Tcl is freely redistributable,
+including for commercial use and resale.
+
+
+FEATURES ADDED BY EXTENDED TCL
+==============================
+
+   Here is a summary of the features added by Extended Tcl.  For more details
+on the commands and functionality provided by Extended Tcl, see the manual
+page man/TclX.man.
+
+    o A shell, which provides an environment for developing and executing
+      Tcl programs.  
+
+    o Advanced Tcl code library facility.
+
+    o General purpose commands which define new programming constructs,
+      debugging and profiling facilities.
+
+    o Unix access commands provide access to many Unix system calls, including
+      process management.
+
+    o File I/O commands provided added facilities for accessing and
+      manipulating open files.
+
+    o File scanning facility that provides awk-like functionality.
+
+    o Math commands (random, sin, cos, etc).
+
+    o Extended list manipulation commands
+
+    o Keyed lists, a type of list that provided functionality similar to C
+      structures.
+
+    o Extended string and character manipulation commands.
+
+
+NEW FEATURES IN THIS RELEASE
+============================
+
+    o All known bugs are fixed.
+
+    o Configuration has been simplified.
+
+    o Improved support for Tk.  Including building a wish with signal support
+      and building a Tk package library.
+
+    o All floating point functions (sin, cos, etc).  Now take expressions
+      as arguments.  Floating point numbers will not be demoted to integers
+      or lose precision.
+
+    o The standard Tcl expr command is patched so that floating point numbers
+      do not get demoted to integers or lose precision.  This patch has been
+      submitted to John Ousterhout.
+
+    o The character string manipulation commands take integer expressions
+      for positions and lengths.
+
+    o The performance of the loading of package library indices and the
+      loading of packages from the libraries has been improved.
+
+    o A performance profiling facility has been added.
+
+    o The alarm command will take fractions of a second on systems with the
+      setitimer system call.
+
+    o Fcntl and fstat are easier to use.
+
+    o Better signal handling on systems with Posix signals.
+
+    o And more.  Review "TclX.man" and "CHANGES" for full details.
+
+ON-LINE HELP
+============
+
+    There is a help system included with Extended Tcl.  It contains some
+documentation on every command in Berkeley Tcl, and Extended Tcl.  You can
+invoke it interactively from within Extended Tcl by typing "help".
+
+    Once you bring Tcl up and have gotten it to pass all the tests, try typing
+"help help" to learn how to use help.
+
+MANUAL PAGES
+============
+
+    Man pages in nroff/troff format are provided for all of Tcl and the
+extensions in the directory tclX6.4c/man.  Start with the TclX.man manual.
+
+EXTENDED TCL VERSION NAMING
+===========================
+
+    Extended Tcl takes its version number from the corresponding version of
+Berkeley (Ousterhout) Tcl upon which it is based, with the addition of a
+trailing letter in case there are multiple releases of Extended Tcl within a
+single release of Berkeley Tcl.  This release is TclX 6.4c.
+
+INTERFACING TCL AND C++
+=======================
+
+C++ programmers can include the file "tcl++.h" to define C++ classes
+that can be used to access a Tcl interpreter.  This is based on Tcl
+C++ classes originally developed by Parag Patel.
+
+TCL DIRECTORY HIERARCHY
+=======================
+
+Here is an overview of the directory hierarchy:
+
+                             top_level_directory
+
+                          tcl6.4    tclX6.4c   tk2.3
+
+The tcl6.4 directory contains Berkeley Tcl, unmodified and tk2.3 contains
+unmodified tk2.3, if you plan to use Tk  These locations are only suggested,
+they maybe changed by editing tclX6.4c/Config.mk.
+
+The following directories are included under the tclX6.4c directory:
+
+    o config - Configuration files for various Unix versions.
+
+    o man - Unformated manual pages for TclX.
+
+    o src - The main source for TclX.
+
+    o osSupport - Library routines required by TclX that may not be available
+      on all Unix versions. 
+
+    o ucbsrc - A makefile and sed scripts used to modify source files that
+      are supplied with UCB Tcl.  The files are modified with sed so you don't
+      have to have patch to build Tcl, however context diffs are provided if
+      problems occur porting to a new version of Tcl.
+
+    o tclsrc - Tcl source that is built into the Tcl package library.
+
+    o tcllib - Tcl source and runtime environment that is required to run TclX.
+
+    o tcllib/help - Help files for Tcl and TclX.
+
+    o tests - Tests for TclX.
+
+    o tkucbsrc - A makefile and sed scripts used to modify source files that
+      are supplied with Tk to add in TclX functionality.  Context diffs are
+      also provided.
+
+    o tksrc - A makefile that builds a version of the Tk wish shell containing
+      Extended Tcl.
+
+    o experimental - An directory of expermintal and contributed Tcl source.
+      The code is not normally built as part of TclX.
+
+HOW TO BUILD IT
+===============
+
+   Please read TclX.man in the tclX6.4c/man directory before starting the
+engine or working under the hood.
+
+    Configure and build Berkeley Tcl as described in that distribution.  Don't
+forget to do a "csh config" before running make for the first time.
+
+    Cd to the "tclX6.4c" directory, which contains this distribution.  Edit the
+file "Config.mk" to configure Extended Tcl for your Unix version and your
+preferences.  The first part of this file contains user preference options,
+including the location of the Berkeley Tcl source and, optionally, the Tk 2.3
+source.  A macro TCL_CONFIG_FILE is also defined that points to a Unix system
+configuration file in the "config" directory.  There should be one there for
+your system.  If not, you will have to develop one based on the documentation
+in "Config.mk".  If you develop or fix problems in a configuration file,
+please send it to us at the address below.
+
+    Now do a "make".  If all goes well, this will augment the tcl.a library
+will all of the functions defined by both Berkeley and Extended Tcl, and
+create an executable version of tcl in the "tclX6.4c" directory called, simply
+enough, "tcl".  A "wish" executable will be also built if it was requested.
+
+    Until the Extended Tcl runtime files are installed, "tcl" and "wish" can't
+be run directly.  To run them before installation, use "runtcl" or "runwish".
+
+    Next enter the command "runtcl" and, if everything worked, you should be
+greeted by a tcl prompt:
+
+tcl>
+
+   Note that until Extended Tcl is installed, it will only run while in the
+tclX6.4c directory.
+
+RUN TESTS TO INSURE THAT TCL IS WORKING PROPERLY
+================================================
+
+    Tcl and TclX come with over 1400 tests that you can run to insure that it
+is working properly.  These tests have greatly helped us while working on Tcl
+by detecting bugs that get introduced accidentally as side-effects of changes.
+Consequently, we have found Tcl to be very reliable, and have had very few
+cases where a new release has regressed by introducing new bugs in old
+functions, or reintroducing old bugs in old functions.
+
+   There are two sets of tests: the tests from Berkeley Tcl, and tests for
+Extended Tcl, which test both the new commands added by Extended Tcl and the
+procedures defined in the Tcl procedure library.
+
+    Run both the Berkeley and TclX tests by typing "make test" in the Extended
+directory.
+
+    If a test fails, please dig into the test and the C source for the function
+being tested, fix the bug and mail us the change.  If you're not inclined to
+do this, please report the problem, including the output of the test, to
+tcl-project@neosoft.com.  Sometimes tests fail due to problems in the system
+environment or bugs in that test rather than problems with TclX.  Even if a few
+of the tests fail, you probably still have a working TclX.
+
+   If you're having trouble with the Berkeley tests, and you suspect that the
+extensions might be involved, you can build a special minimal version of
+Berkeley Tcl by cd'ing to the tcl6.4 directory and doing a "make tclTest".
+You can then invoke "tclTest", where you should be greeted by a "%" prompt.
+Next, cd to the tests directory and do a "source all".
+
+    Note that the Berkeley tests turn off tcl's ability to autoload procedures
+from the Tcl source library, so after running the tests, you should usually
+exit Tcl and restart it.
+
+INSTALLING EXTENDED TCL
+=======================
+
+    To install Extended Tcl, edit the tclX6.4c/Config.mk installation
+configuration section to match your preferences. Read the information in the
+Makefile carefully before configuring it. Cd to the tclX6.4c directory and do
+a "make install" (normally as root).  This will install include files and
+manual pages for Berkeley Tcl and TclX, as well as the TclX binary and
+library.
+
+    The Tcl default file may be used to install more than one version of
+TclX on a system.
+
+MAKING EXECUTABLE TCL SCRIPTS
+=============================
+
+    It is common to want to write Tcl scripts, put them in a directory along
+your search path, and execute them just like you do with shell scripts.
+
+On systems that support the "#!" convention, you can put a
+
+#!/usr/local/bin/tcl
+
+as the first line of your script, and executing the script will
+automatically invoke tcl to process it.  Of course if you install
+Tcl somewhere else, you'll use a different path.
+
+    For systems that don't support this convention (most System V
+systems, for example), it is probably best to create a shell
+script that does something like:
+
+        exec tcl commandfile.tcl
+
+
+PACKAGE LIBRARIES
+=================
+
+    Package Libraries are a Tcl source code management tool included in
+this release.  Package libraries allow you to group Tcl procedures into
+logical bundles and create single files, libraries, that contain multiple
+packages.  The package code provides a low-overhead means of automatically
+demand-loading a package on the first attempt to execute one of the procedures
+defined within it.  As such, package libraries provide a mechanism to
+accommodate the creation of Tcl applications and libraries of a substantial
+size.
+
+SUPPORT FOR EXTENDED TCL
+========================
+
+    We are committed to providing continuing support for Extended Tcl.  Please
+send questions, bug reports, and bug fixes to:
+
+         tcl-project@NeoSoft.com (uupsi!sugar!tcl-project)
+
+Or leave a note on our BBS at (713) 684-5900
+
+SEND US YOUR LIBRARY ROUTINES
+=============================
+
+    If you write a useful Tcl procedure and would like to share it with
+everyone, send us a copy and we'll consider it for the Tcl library!
+
+COMPATIBILITY WITH TCLX 6.2b
+============================
+
+   We have attempted to main backwards-compatibility with older versions
+of TclX.  A few changes were made to enhance usability or fix problems that
+have introduced a few incompatibilities, these are listed below.  Remember
+that multiple versions of Tcl may be installed on a system using the Tcl
+default file.  This is useful when converting applications to the new version.
+
+    o The "wait" command only takes one pid.  This is in anticipation of
+      supporting full waitpid functionallity in the wait command.  This will
+      be available as soon as it is supported in UCB Tcl.
+
+    o The -i flag has been dropped from the "chmod" command.  It now assumes
+      that the number is decimal unless prefixed by a 0.
+
+    o The "fcntl" command has been changed to use Posix defined flag names.
+      NDELAY has been renamed NONBLOCK and CLEXEC is now CLOEXEC.  The command
+      no longer returns a list of current values, instead individule values
+      may be queried.
+  
+    o The format of the data returned by "signal get" has changed.  Enough
+      information is now returned to be able to reset signals.
+
+    o The "fstat" command has changed to make it easier to get single values,
+      consequently the syntax to return stat data in an array has changed.
+
+    o A parameter has been added to the Tcl_GetKeyedListKeys C function.
+
+    o The format of package library index files (.tndx) has changed.  These
+      should be purged and rebuilt.
+
+    o Added an options argument to Tcl_Startup.  It is not currrently used.
+
+
+CAVEATS
+=======
+
+    Although Extended Tcl compiles and executes the tests properly on SCO Unix
+System V/3.2.4, Xenix System V/386, and SunOS, it has not had much use under
+Xenix System V/386.
+
+comp    Previous versions of Extended Tcl have also run under Berkeley BSD, HP-UX
+and Xenix/286.  This release, however, has not been tested on these machines,
+although there is configuration information in the makefile for BSD and HP-UX,
+and Extended Tcl should come up fairly easily on these machines.
+
+    Do not create any set-user-id versions of Tcl yet.  There are holes in
+the startup sequence involving shell variables and default files that need
+to be plugged first.
+
+MAILING LISTS AND NEWSGROUPS FOR TCL
+====================================
+
+    A Usenet newsgroup, comp.lang.tcl, is dedicated to discussing Tcl, Tk and
+the applications that embed it.
+
+WHERE TO GET IT
+===============
+
+Tcl 6.4 is available via anonymous ftp from:
+
+   sprite.berkeley.edu:tcl/tcl6.4.tar.Z
+or
+   ftp.uu.net:languages/tcl/tcl6.4.tar.Z
+
+Extended Tcl 6.4c can be downloaded by anonymous FTP from:
+
+   sprite.berkeley.edu:tcl/tclX6.4c.tar.Z
+or
+   barkley.berkeley.edu:tcl/extensions/tclX6.4c.tar.Z
+or
+   ftp.uu.net:languages/tcl/tclX6.4c.tar.Z
+
+A contributed sources archive resides on barkley.berkeley.edu.
+
diff --git a/src/tclx/src/main.c b/src/tclx/src/main.c
new file mode 100644 (file)
index 0000000..6b26066
--- /dev/null
@@ -0,0 +1,79 @@
+/* 
+ * main.c --
+ *
+ * Main to run the Tcl shell.  This file is a useful template for custom
+ * applications that wish to have Tcl as the top level command language.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: main.c,v 2.1 1992/11/10 03:54:12 markd Exp $
+ *-----------------------------------------------------------------------------
+ */
+
+#include <unistd.h>
+
+#include "tclxtend.h"
+
+int
+main(argc, argv)
+    int                argc;
+    CONST char **argv;
+{
+    Tcl_Interp *interp;
+
+    /*
+     * If history is to be used, then set the eval procedure pointer that
+     * Tcl_CommandLoop so that history will be recorded.  This reference
+     * also brings in history from libtcl.a.
+     */
+#ifndef TCL_NOHISTORY
+     tclShellCmdEvalProc = Tcl_RecordAndEval;
+#endif
+
+    /* 
+     * Create a Tcl interpreter for the session, with all extended commands
+     * initialized.  This can be replaced with Tcl_CreateInterp followed
+     * by a subset of the extended command initializaton procedures if 
+     * desired.
+     */
+    interp = Tcl_CreateExtendedInterp();
+
+    /*
+     *   >>>>>> INITIALIZE APPLICATION SPECIFIC COMMANDS HERE <<<<<<
+     */
+
+    /*
+     * Load the tcl startup code, this should pull in all of the tcl
+     * procs, paths, command line processing, autoloads, packages, etc.
+     * If Tcl was invoked interactively, Tcl_Startup will give it
+     * a command loop.
+     */
+
+    Tcl_Startup (interp, argc, argv, NULL, 0);
+
+    /* 
+     * Delete the interpreter (not neccessary under Unix, but we do
+     * it if TCL_MEM_DEBUG is set to better enable us to catch memory
+     * corruption problems)
+     */
+
+#ifdef TCL_MEM_DEBUG
+    Tcl_DeleteInterp(interp);
+#endif
+
+#ifdef TCL_SHELL_MEM_LEAK
+    printf (" >>> Dumping active memory list to mem.lst <<<\n");
+    if (Tcl_DumpActiveMemory ("mem.lst") != TCL_OK)
+        panic ("error accessing `mem.lst': %s", strerror (errno));
+#endif
+
+    _exit(0);
+}
+
diff --git a/src/tclx/src/mainplus.cc b/src/tclx/src/mainplus.cc
new file mode 100644 (file)
index 0000000..0374f5c
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * main++.C --
+ *
+ *   C++ based main.  It is an alternative to the existing main.c to set up
+ * the Tcl shell and may be used as a example on how to use tcl++.h
+ *      
+ *---------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer,
+ * Mark Diekhans, and Peter da Silva make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *---------------------------------------------------------------------------
+ * Based on Tcl C++ classes developed by Parag Patel.
+ *-----------------------------------------------------------------------------
+ * $Id: main++.C,v 2.0 1992/10/16 04:51:31 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+#include <stdlib.h>
+
+#include "tcl++.h"
+/*
+ * This file is optional.
+ */
+#include "patchlevel.h"
+
+int
+main (int     argc,
+      char  **argv)
+{
+    TclInterp_cl *interpPtr;
+
+    /*
+     * If history is to be used, then set the eval procedure pointer that
+     * Tcl_CommandLoop so that history will be recorded.  This reference
+     * also brings in history from Tcl.a.
+     */
+#ifndef TCL_NOHISTORY
+     tclShellCmdEvalProc = (int (*)())Tcl_RecordAndEval;
+#endif
+
+    /* 
+     * Create a Tcl interpreter for the session, with all extended commands
+     * initialized.  This can be replaced with Tcl_CreateInterp followed
+     * by a subset of the extended command initializaton procedures if 
+     * desired.
+     */
+    interpPtr = new TclInterp_cl;
+
+    /*
+     *   >>>>>> INITIALIZE APPLICATION SPECIFIC COMMANDS HERE <<<<<<
+     */
+
+    /*
+     * Load the tcl startup code, this should pull in all of the tcl
+     * procs, paths, command line processing, autoloads, packages, etc.
+     * If Tcl was invoked interactively, Tcl_Startup will give it
+     * a command loop.
+     */
+
+    interpPtr->Startup (argc, argv, NULL, 0);
+
+    /* 
+     * Delete the interpreter (not neccessary under Unix, but we do
+     * it if TCL_MEM_DEBUG is set to better enable us to catch memory
+     * corruption problems)
+     */
+
+#ifdef TCL_MEM_DEBUG
+    delete interpPtr;
+#endif
+
+#ifdef TCL_SHELL_MEM_LEAK
+    printf (" >>> Dumping active memory list to mem.lst <<<\n");
+    if (Tcl_DumpActiveMemory ("mem.lst") != TCL_OK)
+        panic ("error accessing `mem.lst': %s", strerror (errno));
+#endif
+
+    exit(0);
+}
+
diff --git a/src/tclx/src/makefile b/src/tclx/src/makefile
new file mode 100644 (file)
index 0000000..1484c06
--- /dev/null
@@ -0,0 +1,95 @@
+#
+# Makefile  --
+#
+# Makefile for Extended Tcl C sources.  This will compile all of Extended Tcl
+# and add it to the libtcl.a in the parent directory.  Generates a Tcl shell
+# in the parent directory.
+# 
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: Makefile,v 2.0 1992/10/16 04:51:22 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+include ../config.mk
+include ../config/$(TCL_CONFIG_FILE)
+SHELL=/bin/sh
+
+#------------------------------------------------------------------------------
+
+CFLAGS= $(OPTIMIZE_FLAG) $(XCFLAGS) -I../$(TCL_UCB_DIR) $(MEM_DEBUG_FLAGS) \
+        $(SYS_DEP_FLAGS)
+
+#------------------------------------------------------------------------------
+
+OBJS=  main.o     tclxbsrc.o tclxcclk.o tclxchmd.o \
+       tclxclck.o tclxclp.o  tclxcret.o tclxdebg.o \
+       tclxdup.o  tclxfcmd.o tclxfctl.o tclxfmat.o \
+       tclxfsca.o tclxgdat.o tclxgenl.o tclxhndl.o \
+       tclxid.o   tclxklst.o tclxlib.o  tclxlist.o \
+       tclxmath.o tclxmerr.o tclxmsgc.o tclxproc.o \
+       tclxprof.o tclxrexp.o tclxsel.o  tclxsig.o  \
+       tclxstr.o  tclxstup.o tclxunix.o tclxutil.o
+#------------------------------------------------------------------------------
+
+all: made.tmp ../tcl
+
+made.tmp: $(OBJS) $(CPLUSOBJS)
+       $(AR) cr ../libtcl.a $(OBJS) $(CPLUSOBJS)
+       touch made.tmp
+
+tclxstup.o: patchlvl.h tclxstup.c
+       $(CC) -c $(CFLAGS) -DTCL_DEFAULT=\"$(TCL_DEFAULT)\" tclxstup.c
+
+main.o: patchlvl.h main.c
+       $(CC) -c $(CFLAGS) $(HISTORY_FLAG) main.c
+
+tclxgdat.c: tclxgdat.y
+       $(YACC) tclxgdat.y
+       mv y.tab.c tclxgdat.c
+
+../tcl: ../libtcl.a made.tmp 
+       $(RANLIB_CMD) ../libtcl.a
+       $(CC) $(CFLAGS) main.o ../libtcl.a $(LIBS) $(XLDFLAGS) -o ../tcl
+       if $(DO_STRIPPING) ; then \
+           strip ../tcl; \
+           $(MCS_CMD) ../tcl; fi
+
+
+#------------------------------------------------------------------------------
+# This is a painful situation.  The file tcl++.h requires string.h, which is
+# redefined in the UCB Tcl directory.  We force the compiler to search the
+# C++ directories first.
+
+tclplus.o: tclplus.c tclplus.h
+       $(CCPLUS) -c -I $(CCPLUSINCL) $(CFLAGS) $(HISTORY_FLAG) tclplus.cc
+
+#------------------------------------------------------------------------------
+# This is just to test if it compiles.
+
+tclplus: ../tclplus
+
+../tclplus: mainplus.o
+       $(CCPLUS) $(CFLAGS) main++.o ../libtcl.a $(LIBS) $(XLDFLAGS) \
+       -o ../tcl++
+
+mainplus.o: tclplus.h mainplus.c
+       $(CCPLUS) -c -I /usr/include/CC $(CFLAGS) $(HISTORY_FLAG) mainplus.C
+
+
+#------------------------------------------------------------------------------
+
+clean:
+       touch junk~
+       -rm -f made.tmp tclxgdat.c
+       -rm -f *~ *.o ../tcl ../tclplus
+
diff --git a/src/tclx/src/patchlvl.h b/src/tclx/src/patchlvl.h
new file mode 100644 (file)
index 0000000..0d96a42
--- /dev/null
@@ -0,0 +1,2 @@
+
+#define PATCHLEVEL 1
diff --git a/src/tclx/src/tclplus.cc b/src/tclx/src/tclplus.cc
new file mode 100644 (file)
index 0000000..c825a4e
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * tcl++.C --
+ *
+ * It also defines C++ classes that can be used to access a Tcl interpreter.
+ * If tcl.h is not already included, it includes it. Tcl.h  has macros that
+ * allow it to work with K&R C, ANSI C and C++.
+ *---------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *---------------------------------------------------------------------------
+ * Based on Tcl C++ classes developed by Parag Patel.
+ *-----------------------------------------------------------------------------
+ * $Id: tcl++.C,v 2.0 1992/10/16 04:51:32 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclplus.h"
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclInterp_cl::CatVarArgs --
+ *
+ * Concatenate all of the strings passed via varargs into a single string.
+ *
+ * Parameters:
+ *   o argPtr (I) - A pointer to the first argument, as returned by va_start.
+ *     Should be terminate by a NULL.
+ *
+ * Returns:
+ *   A dynamically allocated string.
+ *----------------------------------------------------------------------
+ */
+char *
+TclInterp_cl::CatVarArgs (va_list argPtr)
+{
+    int      len = 0;
+    char    *parmPtr, *ptr;
+    va_list  nextArgPtr = argPtr;
+
+    while (1) {
+        parmPtr = va_arg (nextArgPtr, char *);
+        if (parmPtr == NULL)
+            break;
+        len += strlen (parmPtr);
+    }
+    ptr = (char *) ckalloc (len + 1);
+    ptr [0] = '\0';
+    nextArgPtr = argPtr;
+    while (1) {
+        parmPtr = va_arg (nextArgPtr, char *);
+        if (parmPtr == NULL)
+            break;
+        strcat (ptr, parmPtr);
+    }
+    return ptr;
+}        
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclInterp_cl::AppendResult --
+ *
+ *    Class interface to Tcl_AppendResult (see Tcl documentation for
+ * details).  Not inlined since varargs and inline don't work on some C++
+ * compilers.
+ *----------------------------------------------------------------------
+ */
+void
+TclInterp_cl::AppendResult (const char *p,
+                            ...)
+{
+    va_list  argPtr;
+    char    *strPtr;
+
+    va_start (argPtr, p);
+    strPtr = CatVarArgs (argPtr);
+    Tcl_AppendResult (interp, p, strPtr, (char *) NULL);
+    ckfree (strPtr)
+    va_end (argPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclInterp_cl::SetErrorCode --
+ *
+ *    Class interface to Tcl_SetErrorCode (see Tcl documentation for
+ * details).  Not inlined since varargs and inline don't work on some C++
+ * compilers.
+ *----------------------------------------------------------------------
+ */
+void
+TclInterp_cl::SetErrorCode (char *p, 
+                            ...)
+{
+    va_list  argPtr;
+    char    *strPtr;
+
+    va_start (argPtr, p);
+    strPtr = CatVarArgs (argPtr);
+    Tcl_SetErrorCode (interp, p, strPtr, (char *) NULL);
+    ckfree (strPtr)
+    va_end (argPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TclInterp_cl::VarEval --
+ *
+ *    Class interface to Tcl_VarEval (see Tcl documentation for details).
+ *  Not inlined since varargs and inline don't work on some C++ compilers.
+ *----------------------------------------------------------------------
+ */
+int
+TclInterp_cl::VarEval (const char *p,
+                       ...)
+{
+    int      intResult;
+    va_list  argPtr;
+    char    *strPtr;
+
+    va_start (argPtr, p);
+    strPtr = CatVarArgs (argPtr);
+    intResult = Tcl_VarEval (interp, (char *) p, strPtr, (char *) NULL);
+    ckfree (strPtr);
+    va_end (argPtr);
+    return intResult;
+}
+
diff --git a/src/tclx/src/tclplus.h b/src/tclx/src/tclplus.h
new file mode 100644 (file)
index 0000000..3619855
--- /dev/null
@@ -0,0 +1,570 @@
+/*
+ * tcl++.h --
+ *
+ * This file defines a C++ classes that can be used to access a Tcl
+ * interpreter. If tcl.h is not already included, it includes it. Tcl.h has
+ * macros that allow it to work with K&R C, ANSI C and C++.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * Based on Tcl C++ classes developed by Parag Patel.
+ *-----------------------------------------------------------------------------
+ * $Id: tcl++.h,v 2.0 1992/10/16 04:51:25 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#ifndef _TCL_PLUS_PLUS_H
+#define _TCL_PLUS_PLUS_H
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#ifndef TCLEXTEND_H
+#    include "tclxtend.h"
+#endif
+
+class TclInterp_cl
+{
+    Tcl_Interp *interp;
+
+    friend class TclTrace_cl;
+
+private:
+    char *
+    CatVarArgs (va_list  argPtr);
+
+public:
+    inline 
+    TclInterp_cl () 
+    {
+        interp = Tcl_CreateExtendedInterp ();
+    }
+
+    inline 
+    ~TclInterp_cl () 
+    { 
+        Tcl_DeleteInterp (interp);
+    }
+
+    inline char *
+    Result () 
+    { 
+        return interp->result; 
+    }
+
+    inline int 
+    ErrorLine () 
+    { 
+        return interp->errorLine;
+    }
+
+    inline Tcl_Interp *
+    GetInterp () 
+    {
+        return interp;
+    }
+
+   /*
+    * Exported Tcl procedures (from standard baseline):
+    */
+
+    inline void
+    AppendElement (const char *string,
+                   int         noSep)
+    { 
+        Tcl_AppendElement (interp, (char *) string, noSep);
+    }
+
+    void
+    AppendResult (const char *p,
+                  ...);
+
+    inline void
+    AddErrorInfo (const char *message)
+    {
+        Tcl_AddErrorInfo (interp, (char *)message);
+    }
+
+    inline void 
+    CreateCommand (const char        *cmdName,
+                   Tcl_CmdProc       *proc, 
+                   ClientData         data, 
+                   Tcl_CmdDeleteProc *deleteProc)
+    { 
+        Tcl_CreateCommand (interp, (char*) cmdName, proc, data, deleteProc);
+    }
+
+    inline int
+    CreatePipeline (int    argc, 
+                    char **argv, 
+                    int  **pidArrayPtr,
+                    int   *inPipePtr, 
+                    int   *outPipePtr,
+                    int   *errFilePtr)
+    {
+        return Tcl_CreatePipeline (interp, argc, argv, pidArrayPtr, inPipePtr, 
+                                   outPipePtr, errFilePtr);
+    }
+
+    inline Tcl_Trace 
+    CreateTrace (int               level, 
+                 Tcl_CmdTraceProc *proc, 
+                 ClientData        data)
+    {
+        return Tcl_CreateTrace (interp, level, proc, data);
+    }
+
+    inline void 
+    DeleteCommand (const char *cmdName)
+    { 
+        Tcl_DeleteCommand (interp, (char *)cmdName);
+    }
+
+    inline void 
+    DeleteTrace (Tcl_Trace trace)
+    { 
+        Tcl_DeleteTrace(interp, trace);
+    }
+
+    inline void
+    DetachPids (int  numPids, 
+                int *pidPtr)
+    {
+        Tcl_DetachPids (numPids, pidPtr);
+    }
+
+    inline int 
+    Eval (const char   *cmd, 
+          char          flags = 0, 
+          char        **termPtr = NULL)
+        { return Tcl_Eval (interp, (char *) cmd, flags, termPtr); }
+
+    inline int
+    EvalFile (const char *fileName)
+    { 
+        return Tcl_EvalFile (interp, (char *) fileName);
+    }
+
+    inline int
+    ExprBoolean (const char *string,
+                 int        *ptr)
+    {
+        return Tcl_ExprBoolean (interp, (char *) string, ptr);
+    }
+
+    inline int
+    ExprDouble (const char *string,
+                double     *ptr)
+    { 
+        return Tcl_ExprDouble (interp, (char *) string, ptr);
+    }
+
+    inline int
+    ExprLong (const char *string,
+              long       *ptr)
+    {
+        return Tcl_ExprLong (interp, (char *) string, ptr);
+    }
+
+    inline int
+    ExprString (const char *string)
+    {
+        return Tcl_ExprString (interp, (char *) string);
+    }
+
+    inline int
+    GetBoolean (Tcl_Interp *interp,
+                const char *string,
+                int        *boolPtr)
+    { 
+        return Tcl_GetBoolean (interp, (char *) string, boolPtr);
+    }
+
+    inline int
+    GetDouble (Tcl_Interp *interp,
+               const char *string,
+               double     *doublePtr)
+    { 
+        return Tcl_GetDouble (interp, (char *) string, doublePtr);
+    }
+
+    inline int
+    GetInt (Tcl_Interp *interp,
+            const char *string,
+            int        *intPtr)
+    { 
+        return Tcl_GetInt (interp, (char *) string, intPtr);
+    }
+
+    inline const char *
+    GetVar (const char *varName, 
+            int         flags = 0)
+    { 
+        return Tcl_GetVar (interp, (char *) varName, flags);
+    }
+
+    inline const char *
+    GetVar2 (const char *name1, 
+             const char *name2,
+             int         flags = 0)
+    { 
+        return Tcl_GetVar2 (interp, (char *) name1, (char *) name2, flags); 
+    }
+
+    inline void
+    InitMemory ()
+    {
+        Tcl_InitMemory (interp);
+    }
+
+    inline char *
+    ParseVar (const char  *string, 
+              char       **termPtr)
+       { return Tcl_ParseVar (interp, (char *) string, termPtr); }
+
+    inline int 
+    RecordAndEval (const char *cmd, 
+                   char        flags)
+        { return Tcl_RecordAndEval (interp, (char *) cmd, flags); }
+
+    inline void
+    ResetResult ()
+    {
+        Tcl_ResetResult (interp);
+    }
+
+    void
+    SetErrorCode (char *p, 
+                  ...);
+
+    inline void 
+    SetResult (const char *string)
+    {
+        Tcl_SetResult (interp, (char *) string, TCL_VOLATILE);
+    }
+
+    inline void 
+    SetResult (const char   *string, 
+               Tcl_FreeProc *freeProc)
+    { 
+        Tcl_SetResult (interp, (char *) string, freeProc);
+    }
+
+    inline const char *
+    SetVar (const char  *varName, 
+            const char  *newValue, 
+            int          global = 0)
+    { 
+        return Tcl_SetVar (interp, (char *) varName, (char *) newValue, 
+                           global);
+    }
+
+    inline const char *
+    SetVar2 (const char *name1, 
+             const char *name2, 
+             const char *newValue, 
+             int         global)
+    {
+         return Tcl_SetVar2 (interp, (char *) name1, (char *) name2, 
+                             (char *) newValue, global);
+    }
+
+    inline int 
+    SplitList (const char   *list, 
+               int          &argcP, 
+               char       **&argvP)
+        { return Tcl_SplitList (interp, (char *) list, &argcP, &argvP); }
+
+    inline char *
+    TildeSubst (Tcl_Interp *interp,
+                const char *name)
+        { return Tcl_TildeSubst (interp, (char *) name); }
+
+    int
+    TraceVar (const char       *varName,
+              int               flags,
+              Tcl_VarTraceProc *proc,
+              ClientData        clientData)
+    {
+         return Tcl_TraceVar (interp, (char *) varName, flags, proc,
+                              clientData);
+    }
+
+    inline int
+    TraceVar2 (const char       *name1, 
+               const char       *name2,
+               int               flags, 
+               Tcl_VarTraceProc *proc, 
+               ClientData        clientData)
+    {
+         return Tcl_TraceVar2 (interp, (char *) name1, (char *) name2, flags,
+                               proc, clientData); 
+    }
+
+    inline const char *
+    UnixError ()
+    {
+        return Tcl_UnixError (interp);
+    }
+
+    inline void
+    UnsetVar (Tcl_Interp *interp,
+              const char *varName,
+              int         global)
+        { Tcl_UnsetVar (interp, (char *) varName, global); }
+
+    inline void
+    UnsetVar2 (Tcl_Interp *interp,
+               const char *name1, 
+               const char *name2, 
+               int         global)
+        { Tcl_UnsetVar2 (interp, (char *) name1, (char *) name2, global); }
+
+    inline void
+    UntraceVar (const char       *varName, 
+                int               flags,
+                Tcl_VarTraceProc *proc, 
+                ClientData        clientData)
+    {
+        Tcl_UntraceVar (interp, (char *) varName, flags, proc, clientData);
+    }
+
+
+    inline void
+    UntraceVar2 (Tcl_Interp       *interp,
+                 const char       *name1,
+                 const char       *name2,
+                 int               flags, 
+                 Tcl_VarTraceProc *proc, 
+                 ClientData        clientData)
+    { 
+        Tcl_UntraceVar2 (interp, (char *) name1, (char *) name2, flags, proc,
+                         clientData);
+    }
+
+    int
+    VarEval (const char *p,
+              ...);
+
+    inline ClientData
+    VarTraceInfo (const char       *varName,
+                  int               flags,
+                  Tcl_VarTraceProc *procPtr,
+                  ClientData        prevClientData)
+    { 
+        return Tcl_VarTraceInfo (interp, (char *) varName, flags, procPtr,
+                                 prevClientData);
+    }
+
+    inline ClientData
+    VarTraceInfo2 (const char       *name1, 
+                   const char       *name2, 
+                   int               flags,
+                   Tcl_VarTraceProc *procPtr,
+                   ClientData        prevClientData)
+    { 
+        return Tcl_VarTraceInfo2 (interp, (char *) name1, (char *) name2, 
+                                  flags, procPtr, prevClientData);
+    }
+
+    /*
+     * Exported Tcl functions added to baseline Tcl by the Extended Tcl 
+     * implementation.
+     */
+
+    inline void
+    CommandLoop (FILE       *inFile,
+                 FILE       *outFile,
+                 int         (*evalProc) (),
+                 unsigned    options)
+    {
+        Tcl_CommandLoop (interp, inFile, outFile, evalProc, options);
+    }
+
+    inline char *
+    DeleteKeyedListField (const char  *fieldName,
+                          const char  *keyedList)
+    {
+        return Tcl_DeleteKeyedListField (interp, fieldName, keyedList);
+    }
+
+    inline void
+    ErrorAbort (int  exitCode)
+    {
+        Tcl_ErrorAbort (interp, exitCode);
+    }
+
+    inline int
+    GetKeyedListField (const char  *fieldName,
+                       const char  *keyedList,
+                       char       **fieldValuePtr)
+    {
+        return Tcl_GetKeyedListField (interp, fieldName, keyedList,
+                                      fieldValuePtr);
+    }
+
+    inline int
+    GetKeyedListKeys (const char  *subFieldName,
+                      const char  *keyedList,
+                      int         *keyesArgcPtr,
+                      char      ***keyesArgvPtr)
+    {
+
+        return Tcl_GetKeyedListKeys (interp, subFieldName, keyedList,
+                                     keyesArgcPtr, keyesArgvPtr);
+    }
+
+    inline int
+    GetLong (Tcl_Interp *interp,
+             const char *string,
+             long       *longPtr)
+    {
+        return Tcl_GetLong (interp, string, longPtr);
+    }
+
+    inline int
+    GetUnsigned (Tcl_Interp *interp,
+                 const char *string,
+                 unsigned   *unsignedPtr)
+    {
+         return Tcl_GetUnsigned (interp, string, unsignedPtr);
+    }
+
+    inline char *
+    SetKeyedListField (const char  *fieldName,
+                       const char  *fieldvalue,
+                       const char  *keyedList)
+    {
+        return Tcl_SetKeyedListField (interp, fieldName, fieldvalue,
+                                      keyedList);
+    }
+
+    inline int
+    ShellEnvInit (unsigned     options,
+                  const char  *programName, 
+                  int          argc,
+                  const char **argv,
+                  int          interactive,
+                  const char  *defaultFile)
+     {
+         return Tcl_ShellEnvInit (interp, options, programName, argc, argv,
+                                  interactive, defaultFile);
+     }
+
+    inline void 
+    Startup (int          argc,
+             const char **argv,
+             const char  *defaultFile,
+             unsigned     options = 0) 
+    {
+        Tcl_Startup (interp, argc, argv, defaultFile, options);
+    }
+
+    inline int
+    System (const char *command)
+    {
+        return Tcl_System (interp, (char*) command);
+    }
+};
+
+class TclTrace_cl
+{
+    Tcl_Trace trace;
+    Tcl_Interp *interp;
+
+public:
+    inline 
+    TclTrace_cl (TclInterp_cl     &interpCl, 
+                 int               level, 
+                 Tcl_CmdTraceProc *proc, 
+                 ClientData        data)
+    { 
+        trace = Tcl_CreateTrace (interp = interpCl.interp, level, proc, data);
+    }
+
+    inline ~TclTrace_cl () 
+        { Tcl_DeleteTrace (interp, trace); }
+};
+
+
+class TclCmdBuf_cl
+{
+    Tcl_CmdBuf buf;
+
+public:
+    inline 
+    TclCmdBuf_cl () 
+        { buf = Tcl_CreateCmdBuf (); }
+
+    inline 
+    ~TclCmdBuf_cl () 
+        { Tcl_DeleteCmdBuf (buf); }
+
+    inline const char *
+    AssembleCmd (const char *string)
+        { return Tcl_AssembleCmd (buf, (char *) string); }
+};
+
+class TclHandleTbl_cl
+{
+    void_pt headerPtr;
+
+public:
+    inline
+    TclHandleTbl_cl (const char *handleBase,
+                     int         entrySize,
+                     int         initEntries)
+
+    {
+        headerPtr = Tcl_HandleTblInit (handleBase, entrySize, initEntries);
+    }
+
+    inline
+    ~TclHandleTbl_cl ()
+    {
+        Tcl_HandleTblRelease (headerPtr);
+    }
+
+    inline void_pt  
+    HandleAlloc (char *handlePtr)
+    {
+        return Tcl_HandleAlloc (headerPtr, handlePtr);
+    }
+
+    inline void 
+    HandleFree (void_pt  entryPtr)
+    {
+        Tcl_HandleFree (headerPtr, entryPtr);
+    }
+
+    inline int
+    HandleTblUseCount (int amount)
+    {
+        return Tcl_HandleTblUseCount (headerPtr, amount);
+    }
+
+    inline void_pt
+    HandleWalk (int *walkKeyPtr)
+    {
+        return Tcl_HandleWalk (headerPtr, walkKeyPtr);
+    }
+
+    inline void_pt
+    HandleXlate (Tcl_Interp  *interp,
+                 const  char *handle)
+    {
+        return Tcl_HandleXlate (interp, headerPtr, handle);
+    }
+};
+
+#endif /* _TCL_PLUS_PLUS_H */
+
diff --git a/src/tclx/src/tclxbsrc.c b/src/tclx/src/tclxbsrc.c
new file mode 100644 (file)
index 0000000..8ff8b8e
--- /dev/null
@@ -0,0 +1,355 @@
+/*
+ * tclXbsearch.c
+ *
+ * Extended Tcl binary file search command.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXbsearch.c,v 2.0 1992/10/16 04:50:24 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+/*
+ * Control block used to pass data used by the binary search routines.
+ */
+typedef struct binSearchCB_t {
+    Tcl_Interp   *interp;         /* Pointer to the interpreter.             */
+    char         *fileHandle;     /* Handle of file.                         */
+    char         *key;            /* The key to search for.                  */
+
+    FILE         *fileCBPtr;      /* Open file structure.                    */
+    dynamicBuf_t  dynBuf;         /* Dynamic buffer to hold a line of file.  */
+    long          lastRecOffset;  /* Offset of last record read.             */
+    int           cmpResult;      /* -1, 0 or 1 result of string compare.    */
+    char         *tclProc;        /* Name of Tcl comparsion proc, or NULL.   */
+    } binSearchCB_t;
+
+/*
+ * Prototypes of internal functions.
+ */
+static int
+StandardKeyCompare _ANSI_ARGS_((char *key,
+                                char *line));
+
+static int
+TclProcKeyCompare _ANSI_ARGS_((binSearchCB_t *searchCBPtr));
+
+static int
+ReadAndCompare _ANSI_ARGS_((long           fileOffset,
+                            binSearchCB_t *searchCBPtr));
+
+static int
+BinSearch _ANSI_ARGS_((binSearchCB_t *searchCBPtr));
+
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * StandardKeyCompare --
+ *    Standard comparison routine for BinSearch, compares the key to the
+ *    first white-space seperated field in the line.
+ *
+ * Parameters:
+ *   o key (I) - The key to search for.
+ *   o line (I) - The line to compare the key to.
+ *
+ * Results:
+ *   o < 0 if key < line-key
+ *   o = 0 if key == line-key
+ *   o > 0 if key > line-key.
+ *-----------------------------------------------------------------------------
+ */
+static int
+StandardKeyCompare (key, line)
+    char *key;
+    char *line;
+{
+    int  cmpResult, fieldLen;
+    char saveChar;
+
+    fieldLen = strcspn (line, " \t\r\n\v\f");
+
+    saveChar = line [fieldLen];
+    line [fieldLen] = 0;
+    cmpResult = strcmp (key, line);
+    line [fieldLen] = saveChar;
+
+    return cmpResult;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * TclProcKeyCompare --
+ *    Comparison routine for BinSearch that runs a Tcl procedure to, 
+ *    compare the key to a line from the file.
+ *
+ * Parameters:
+ *   o searchCBPtr (I/O) - The search control block, the line should be in
+ *     dynBuf, the comparsion result is returned in cmpResult.
+ *
+ * Results:
+ *   TCL_OK or TCL_ERROR.
+ *-----------------------------------------------------------------------------
+ */
+static int
+TclProcKeyCompare (searchCBPtr)
+    binSearchCB_t *searchCBPtr;
+{
+    char *cmdArgv [3];
+    char *command;
+    int   result;
+
+    cmdArgv [0] = searchCBPtr->tclProc;
+    cmdArgv [1] = searchCBPtr->key;
+    cmdArgv [2] = searchCBPtr->dynBuf.ptr;
+    command = Tcl_Merge (3, cmdArgv);
+
+    result = Tcl_Eval (searchCBPtr->interp, command, 0, (char **) NULL);
+
+    ckfree (command);
+    if (result == TCL_ERROR)
+        return TCL_ERROR;
+
+    if (!Tcl_StrToInt (searchCBPtr->interp->result, 0, 
+                       &searchCBPtr->cmpResult)) {
+        char *oldResult = ckalloc (strlen (searchCBPtr->interp->result + 1));
+        
+        strcpy (oldResult, searchCBPtr->interp->result);
+        Tcl_ResetResult (searchCBPtr->interp);
+        Tcl_AppendResult (searchCBPtr->interp, "invalid integer \"", oldResult,
+                          "\" returned from compare proc \"",
+                          searchCBPtr->tclProc, "\"", (char *) NULL);
+        ckfree (oldResult);
+        return TCL_ERROR;
+    }
+    Tcl_ResetResult (searchCBPtr->interp);
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ReadAndCompare --
+ *    Search for the next line in the file starting at the specified
+ *    offset.  Read the line into the dynamic buffer and compare it to
+ *    the key using the specified comparison method.  The start of the
+ *    last line read is saved in the control block, and if the start of
+ *    the same line is found in the search, then it will not be recompared.
+ *    This is needed since the search algorithm has to hit the same line
+ *    a couple of times before failing, due to the fact that the records are
+ *    not fixed length.
+ *
+ * Parameters:
+ *   o fileOffset (I) - The offset of the next byte of the search, not
+ *     necessarly the start of a record.
+ *   o searchCBPtr (I/O) - The search control block, the comparsion result
+ *     is returned in cmpResult.  If the EOF is hit, a less-than result is
+ *     returned.
+ *
+ * Results:
+ *   TCL_OK or TCL_ERROR.
+ *-----------------------------------------------------------------------------
+ */
+static int
+ReadAndCompare (fileOffset, searchCBPtr)
+    long           fileOffset;
+    binSearchCB_t *searchCBPtr;
+{
+    int  recChar, status;
+
+    if (fseek (searchCBPtr->fileCBPtr, fileOffset, SEEK_SET) != 0)
+        goto unixError;
+
+    /*
+     * Go to beginning of next line.
+     */
+    
+    if (fileOffset != 0) {
+        while (((recChar = getc (searchCBPtr->fileCBPtr)) != EOF) &&
+                (recChar != '\n'))
+            fileOffset++;
+        if ((recChar == EOF) && ferror (searchCBPtr->fileCBPtr))
+            goto unixError;
+    }
+    /*
+     * If this is the same line as before, then just leave the comparison
+     * result unchanged.
+     */
+    if (fileOffset == searchCBPtr->lastRecOffset)
+        return TCL_OK;
+
+    searchCBPtr->lastRecOffset = fileOffset;
+
+    status = Tcl_DynamicFgets (&searchCBPtr->dynBuf, searchCBPtr->fileCBPtr, 
+                               FALSE);
+    if (status < 0)
+        goto unixError;
+
+    /* 
+     * Only compare if EOF was not hit, otherwise, treat as if we went
+     * above the key we are looking for.
+     */
+    if (status == 0) {
+        searchCBPtr->cmpResult = -1;
+        return TCL_OK;
+    }
+
+    if (searchCBPtr->tclProc == NULL) {
+        searchCBPtr->cmpResult = StandardKeyCompare (searchCBPtr->key, 
+                                                     searchCBPtr->dynBuf.ptr);
+    } else {
+        if (TclProcKeyCompare (searchCBPtr) != TCL_OK)
+            return TCL_ERROR;
+    }
+
+    return TCL_OK;
+
+unixError:
+   Tcl_AppendResult (searchCBPtr->interp, searchCBPtr->fileHandle, ": ",
+                     Tcl_UnixError (searchCBPtr->interp), (char *) NULL);
+   return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * BinSearch --
+ *      Binary search a sorted ASCII file.
+ *
+ * Parameters:
+ *   o searchCBPtr (I/O) - The search control block, if the line is found,
+ *     it is returned in dynBuf.
+ * Results:
+ *     TCL_OK - If the key was found.
+ *     TCL_BREAK - If it was not found.
+ *     TCL_ERROR - If there was an error.
+ *
+ * based on getpath.c from smail 2.5 (9/15/87)
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+BinSearch (searchCBPtr)
+    binSearchCB_t *searchCBPtr;
+{
+    OpenFile   *filePtr;
+    long        middle, high, low;
+    struct stat statBuf;
+
+    if (TclGetOpenFile (searchCBPtr->interp, searchCBPtr->fileHandle, 
+                        &filePtr) != TCL_OK)
+        return TCL_ERROR;
+
+    searchCBPtr->fileCBPtr = filePtr->f;
+    searchCBPtr->lastRecOffset = -1;
+
+    if (fstat (fileno (searchCBPtr->fileCBPtr), &statBuf) < 0)
+        goto unixError;
+
+    low = 0;
+    high = statBuf.st_size;
+
+    /*
+     * "Binary search routines are never written right the first time around."
+     * - Robert G. Sheldon.
+     */
+
+    while (TRUE) {
+        middle = (high + low + 1) / 2;
+
+        if (ReadAndCompare (middle, searchCBPtr) != TCL_OK)
+            return TCL_ERROR;
+
+        if (searchCBPtr->cmpResult == 0)
+            return TCL_OK;     /* Found   */
+        
+        if (low >= middle)  
+            return TCL_BREAK;  /* Failure */
+
+        /*
+         * Close window.
+         */
+        if (searchCBPtr->cmpResult > 0) {
+            low = middle;
+        } else {
+            high = middle - 1;
+        }
+    }
+
+unixError:
+   Tcl_AppendResult (searchCBPtr->interp, searchCBPtr->fileHandle, ": ",
+                     Tcl_UnixError (searchCBPtr->interp), (char *) NULL);
+   return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_BsearchCmd --
+ *     Implements the TCL bsearch command:
+ *        bsearch filehandle key [retvar]
+ *
+ * Results:
+ *      Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_BsearchCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int           status;
+    binSearchCB_t searchCB;
+
+    if ((argc < 3) || (argc > 5)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " handle key [retvar] [compare_proc]"
+                          , (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    searchCB.interp = interp;
+    searchCB.fileHandle = argv [1];
+    searchCB.key = argv [2];
+    searchCB.tclProc = (argc == 5) ? argv [4] : NULL;
+    Tcl_DynBufInit (&searchCB.dynBuf);
+
+    status = BinSearch (&searchCB);
+    if (status == TCL_ERROR) {
+        Tcl_DynBufFree (&searchCB.dynBuf);
+        return TCL_ERROR;
+    }
+
+    if (status == TCL_BREAK) {
+        Tcl_DynBufFree (&searchCB.dynBuf);
+        if ((argc >= 4) && (argv [3][0] != '\0'))
+            interp->result = "0";
+        return TCL_OK;
+    }
+
+    if ((argc == 3) || (argv [3][0] == '\0')) {
+        Tcl_DynBufReturn (interp, &searchCB.dynBuf);
+    } else {
+        char *varPtr;
+
+        varPtr = Tcl_SetVar (interp, argv[3], searchCB.dynBuf.ptr,
+                             TCL_LEAVE_ERR_MSG);
+        Tcl_DynBufFree (&searchCB.dynBuf);
+        if (varPtr == NULL)
+            return TCL_ERROR;
+        interp->result = "1";
+    }
+    return TCL_OK;
+}
diff --git a/src/tclx/src/tclxcclk.c b/src/tclx/src/tclxcclk.c
new file mode 100644 (file)
index 0000000..109c466
--- /dev/null
@@ -0,0 +1,92 @@
+/* 
+ * tclXcnvclock.c --
+ *
+ *      Contains the TCL convertclock command.  This is in a module seperate
+ * from clock so that it can be excluded, along with the yacc generated code,
+ * since its rather large.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXcnvclock.c,v 2.1 1992/11/07 22:23:03 markd Exp $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+#include <time.h>
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ConvertclockCmd --
+ *     Implements the TCL convertclock command:
+ *         convertclock dateString [GMT|{}]
+ *
+ * Results:
+ *     Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_ConvertclockCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    long        clockVal;
+    time_t      baseClock;
+    struct tm  *timeDataPtr;
+    long        zone;
+
+    if ((argc < 2) || (argc > 4)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " dateString [GMT|{}] [baseclock]", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (argc == 4) {
+        if (Tcl_GetLong (interp, argv [3], &baseClock) != TCL_OK)
+            return TCL_ERROR;
+    } else
+        time (&baseClock);
+
+    if ((argc > 2) && (argv [2][0] != '\0')) {
+        if (!STREQU (argv [2], "GMT")) {
+            Tcl_AppendResult (interp, "invalid argument: expected `GMT', ",
+                              "got : `", argv [2], "'", (char *) NULL);
+            return TCL_ERROR;
+        }
+        zone = 0; /* Zero minutes from GMT */
+    } else {
+        timeDataPtr = localtime (&baseClock);
+        /*
+         * Get the minutes east of GMT.
+         */
+#ifdef TCL_TM_GMTOFF
+        zone = -(timeDataPtr->tm_gmtoff / 60);
+#endif
+#ifdef TCL_TIMEZONE_VAR 
+        zone = timezone / 60;
+#endif
+#if  !defined(TCL_TM_GMTOFF) && !defined(TCL_TIMEZONE_VAR)
+        zone = timeDataPtr->tm_tzadj  / 60;
+#endif
+    }
+
+    clockVal = Tcl_GetDate (argv [1], baseClock, zone);
+    if (clockVal == -1) {
+        Tcl_AppendResult (interp, "Unable to convert date-time string \"",
+                          argv [1], "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    sprintf (interp->result, "%ld", clockVal);
+    return TCL_OK;
+}
+
diff --git a/src/tclx/src/tclxchmd.c b/src/tclx/src/tclxchmd.c
new file mode 100644 (file)
index 0000000..94062df
--- /dev/null
@@ -0,0 +1,420 @@
+/* 
+ * tclXchmod.c --
+ *
+ *    Chmod, chown and chgrp Tcl commands.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXchmod.c,v 2.0 1992/10/16 04:50:26 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+/*
+ * Prototypes of internal functions.
+ */
+static int
+ConvSymMode _ANSI_ARGS_((Tcl_Interp  *interp,
+                         char        *symMode,
+                         int          modeVal));
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ConvSymMode --
+ *      Parse and convert symbolic file permissions as specified by chmod(C).
+ *
+ * Parameters:
+ *   o interp - Pointer to the current interpreter, error messages will be
+ *     returned in the result.
+ *   o symMode - The symbolic permissions to parse.
+ *   o modeVal - The existing permissions value on a file.
+ *
+ * Results:
+ *      The new permissions, or -1 if invalid permissions where supplied.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+ConvSymMode (interp, symMode, modeVal)
+    Tcl_Interp  *interp;
+    char        *symMode;
+    int          modeVal;
+
+{
+    int  user, group, other;
+    char operator, *scanPtr;
+    int  rwxMask, ugoMask, setUID, sticky, locking;
+    int  newMode;
+
+    scanPtr = symMode;
+
+    while (*scanPtr != '\0') {
+        user = group = other = FALSE;
+
+        /* 
+         * Scan who field.
+         */
+        while (! ((*scanPtr == '+') || 
+                  (*scanPtr == '-') || 
+                  (*scanPtr == '='))) {
+            switch (*scanPtr) {
+                case 'a':
+                    user = group = other = TRUE;
+                    break;
+                case 'u':
+                    user = TRUE;
+                    break;
+                case 'g':
+                    group = TRUE;
+                    break;
+                case 'o':
+                    other = TRUE;
+                    break;
+                default:
+                    goto invalidMode;
+            }
+            scanPtr++;
+        }
+
+        /*
+         * If none where specified, that means all.
+         */
+
+        if (! (user || group || other))
+            user = group = other = TRUE;
+
+        operator = *scanPtr++;
+
+        /* 
+         * Decode the permissions
+         */
+
+        rwxMask = 0;
+        setUID = sticky = locking = FALSE;
+
+        /* 
+         * Scan permissions field
+         */
+        while (! ((*scanPtr == ',') || (*scanPtr == 0))) {
+            switch (*scanPtr) {
+                case 'r':
+                    rwxMask |= 4;
+                    break;
+                case 'w':
+                    rwxMask |= 2;
+                    break;
+                case 'x':
+                    rwxMask |= 1;
+                    break;
+                case 's':
+                    setUID = TRUE;
+                    break;
+                case 't':
+                    sticky = TRUE;
+                    break;
+                case 'l':
+                    locking = TRUE;
+                    break;
+                default:
+                    goto invalidMode;
+            }
+            scanPtr++;
+        }
+
+        /*
+         * Build mode map of specified values.
+         */
+
+        newMode = 0;
+        ugoMask = 0;
+        if (user) {
+            newMode |= rwxMask << 6;
+            ugoMask |= 0700;
+        }
+        if (group) {
+            newMode |= rwxMask << 3;
+            ugoMask |= 0070;
+        }
+        if (other) {
+            newMode |= rwxMask;
+            ugoMask |= 0007;
+        }
+        if (setUID && user)
+            newMode |= 04000;
+        if ((setUID || locking) && group)
+            newMode |= 02000;
+        if (sticky)
+            newMode |= 01000;
+
+        /* 
+         * Add to cumulative mode based on operator.
+         */
+
+        if (operator == '+')
+            modeVal |= newMode;
+        else if (operator == '-')
+            modeVal &= ~newMode;
+        else if (operator == '=')
+            modeVal |= (modeVal & ugoMask) | newMode;
+        if (*scanPtr == ',')
+            scanPtr++;
+    }
+
+    return modeVal;
+
+  invalidMode:
+    Tcl_AppendResult (interp, "invalid file mode \"", symMode, "\"",
+                      (char *) NULL);
+    return -1;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ChmodCmd --
+ *     Implements the TCL chmod command:
+ *     chmod mode filelist
+ *
+ * Results:
+ *  Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_ChmodCmd (clientData, interp, argc, argv)
+    ClientData   clientData;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    int           idx, modeVal, fileArgc, absMode;
+    char        **fileArgv;
+    struct stat   fileStat;
+
+    if (argc != 3) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " mode filelist", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (isdigit (argv [1][0])) {
+        if (Tcl_GetInt (interp, argv [1], &modeVal) != TCL_OK)
+            return TCL_ERROR;
+        absMode = TRUE;
+    } else
+        absMode = FALSE;
+
+    if (Tcl_SplitList (interp, argv [2], &fileArgc, &fileArgv) != TCL_OK)
+        return TCL_ERROR;
+
+    for (idx = 0; idx < fileArgc; idx++) {
+        if (!absMode) {
+            if (stat (fileArgv [idx], &fileStat) != 0)
+                goto fileError;
+            modeVal = ConvSymMode (interp, argv [1], fileStat.st_mode & 07777);
+            if (modeVal < 0)
+                goto errorExit;
+        }
+        if (chmod (fileArgv [idx], (unsigned short) modeVal) < 0)
+            goto fileError;
+    }
+
+  exitPoint:
+    ckfree ((char *) fileArgv);
+    return TCL_OK;
+
+  fileError:
+    /*
+     * Error accessing file, assumes file name is fileArgv [idx].
+     */
+    Tcl_AppendResult (interp, fileArgv [idx], ": ", Tcl_UnixError (interp),
+                      (char *) NULL);
+
+  errorExit:
+    ckfree ((char *) fileArgv);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ChownCmd --
+ *     Implements the TCL chown command:
+ *     chown owner filelist
+ *     chown {owner group} filelist
+ *
+ * Results:
+ *  Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_ChownCmd (clientData, interp, argc, argv)
+    ClientData   clientData;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    int            idx, ownArgc, fileArgc;
+    char         **ownArgv, **fileArgv = NULL;
+    struct stat    fileStat;
+    int            useOwnerGrp, chGroup, ownerId, groupId;
+    struct passwd *passwdPtr;
+    struct group  *groupPtr;
+    int            result = TCL_ERROR;
+
+    if (argc != 3) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " owner|{owner group} filelist", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (Tcl_SplitList (interp, argv[1], &ownArgc, &ownArgv) != TCL_OK)
+        return TCL_ERROR;
+    if ((ownArgc < 1) || (ownArgc > 2)) {
+        interp->result = "owner arg should be: owner or {owner group}";
+        goto exitPoint;
+    }
+    if (ownArgc == 2) {
+        useOwnerGrp = (ownArgv [1][0] == '\0');
+        chGroup = TRUE;
+    } else
+        chGroup = FALSE;
+
+    /*
+     * Get the owner id, either convert the name or use it as an integer.
+     */
+    passwdPtr = getpwnam (ownArgv [0]);
+    if (passwdPtr != NULL)
+        ownerId = passwdPtr->pw_uid;
+    else {
+        if (!Tcl_StrToInt (ownArgv [0], 10, &ownerId)) {
+            Tcl_AppendResult (interp, "unknown user id: ", ownArgv [0],
+                              (char *) NULL);
+            goto exitPoint;
+        }
+    }
+    /*
+     * Get the group id, this is either the specified id or name, or the
+     * if associated with the specified user.
+     */
+    if (chGroup) {
+        if (useOwnerGrp) {
+            if (passwdPtr == NULL) {
+                passwdPtr = getpwuid (ownerId);
+                if (passwdPtr != NULL) {
+                    Tcl_AppendResult (interp, "unknown user id: ", 
+                                      ownArgv [0], (char *) NULL);
+                    goto exitPoint;
+                }
+            }
+            groupId = passwdPtr->pw_gid;                        
+        } else {
+            groupPtr = getgrnam (ownArgv [1]);
+            if (groupPtr != NULL)
+                groupId = groupPtr->gr_gid;
+            else {
+                if (!Tcl_StrToInt (ownArgv [1], 10, &groupId)) {
+                    Tcl_AppendResult (interp, "unknown group id: ", 
+                                      ownArgv [1], (char *) NULL);
+                    goto exitPoint;
+                }
+            }
+        }
+    }
+    if (Tcl_SplitList (interp, argv [2], &fileArgc, &fileArgv) != TCL_OK)
+        goto exitPoint;
+
+    for (idx = 0; idx < fileArgc; idx++) {
+        if (!chGroup) {
+            if (stat (fileArgv [idx], &fileStat) != 0) {
+                Tcl_AppendResult (interp, fileArgv [idx], ": ",
+                                  Tcl_UnixError (interp), (char *) NULL);
+                goto exitPoint;
+            }
+            groupId = fileStat.st_gid;
+        }
+
+        if (chown (fileArgv[idx], ownerId, groupId) < 0) {
+            Tcl_AppendResult (interp, fileArgv [idx], ": ",
+                              Tcl_UnixError (interp), (char *) NULL);
+            goto exitPoint;
+        }
+
+    } /* Modify each file */
+
+    result = TCL_OK;
+exitPoint:
+    ckfree ((char *) ownArgv);
+    if (fileArgv != NULL)
+        ckfree ((char *) fileArgv);
+    return result;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ChgrpCmd --
+ *     Implements the TCL chgrp command:
+ *     chgrp group filelist
+ *
+ * Results:
+ *  Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_ChgrpCmd (clientData, interp, argc, argv)
+    ClientData   clientData;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    int            idx, fileArgc, groupId, result = TCL_ERROR;
+    char         **fileArgv;
+    struct stat    fileStat;
+    struct group  *groupPtr;
+
+    if (argc < 3) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " group filelist", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    groupPtr = getgrnam (argv [1]);
+    if (groupPtr != NULL)
+        groupId = groupPtr->gr_gid;
+    else {
+        if (!Tcl_StrToInt (argv [1], 10, &groupId)) {
+            Tcl_AppendResult (interp, "unknown group id: ", argv [1],
+                              (char *) NULL);
+            return TCL_ERROR;
+        }
+    }
+    if (Tcl_SplitList (interp, argv [2], &fileArgc, &fileArgv) != TCL_OK)
+        return TCL_ERROR;
+
+    for (idx = 0; idx < fileArgc; idx++) {
+        if ((stat (fileArgv [idx], &fileStat) != 0) ||
+                (chown (fileArgv[idx], fileStat.st_uid, groupId) < 0)) {
+            Tcl_AppendResult (interp, fileArgv [idx], ": ",
+                              Tcl_UnixError (interp), (char *) NULL);
+            goto exitPoint;
+        }
+    } /* Modify each file */
+
+    result = TCL_OK;
+exitPoint:
+    ckfree ((char *) fileArgv);
+    return result;
+}
diff --git a/src/tclx/src/tclxclck.c b/src/tclx/src/tclxclck.c
new file mode 100644 (file)
index 0000000..aff794d
--- /dev/null
@@ -0,0 +1,109 @@
+/* 
+ * tclXclock.c --
+ *
+ *      Contains the TCL time and date related commands.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXclock.c,v 2.0 1992/10/16 04:50:28 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include <time.h>
+#include "tclxint.h"
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_GetclockCmd --
+ *     Implements the TCL getclock command:
+ *         getclock
+ *
+ * Results:
+ *     Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_GetclockCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    if (argc != 1) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv[0], (char *) NULL);
+        return TCL_ERROR;
+    }
+    sprintf (interp->result, "%ld", time ((long *) NULL));
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_FmtclockCmd --
+ *     Implements the TCL fmtclock command:
+ *         fmtclock clockval [format] [GMT|{}]
+ *
+ * Results:
+ *     Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_FmtclockCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int              useGMT = FALSE;
+    long             clockVal;
+    char            *format;
+    struct tm       *timeDataPtr;
+    int              fmtError;
+
+    if ((argc < 2) || (argc > 4)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " clockval [format] [GMT|{}]", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (Tcl_GetLong (interp, argv[1], &clockVal) != TCL_OK)
+        return TCL_ERROR;
+    if ((argc == 4) && (argv [3][0] != '\0')) {
+        if (!STREQU (argv [3], "GMT")) {
+            Tcl_AppendResult (interp, "expected \"GMT\" or {} got \"",
+                              argv [3], "\"", (char *) NULL);
+            return TCL_ERROR;
+        }
+        useGMT = TRUE;
+    }
+
+    if ((argc >= 3) && (argv [2][0] != '\0'))
+        format = argv[2];
+    else
+        format = "%a %b %d %X %Z %Y";
+
+    if (useGMT)
+        timeDataPtr = gmtime (&clockVal);
+    else    
+        timeDataPtr = localtime (&clockVal);
+
+    fmtError = strftime (interp->result, TCL_RESULT_SIZE, format, 
+                         timeDataPtr) < 0;
+    if (fmtError) {
+        Tcl_AppendResult (interp, "error formating time", (char *) NULL);
+        return TCL_ERROR;
+    }
+    return TCL_OK;
+}
diff --git a/src/tclx/src/tclxclp.c b/src/tclx/src/tclxclp.c
new file mode 100644 (file)
index 0000000..4738a5c
--- /dev/null
@@ -0,0 +1,388 @@
+/* 
+ * tclXcmdloop --
+ *
+ *   Interactive command loop, C and Tcl callable.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXcmdloop.c,v 2.0 1992/10/16 04:50:29 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+
+/*
+ * Pointer to eval procedure to use.  This way bring in the history module
+ * from a library can be made optional.  This only works because the calling
+ * sequence of Tcl_Eval is a superset of Tcl_RecordAndEval.  This defaults
+ * to no history, set this variable to Tcl_RecordAndEval to use history.
+ */
+
+int (*tclShellCmdEvalProc) () = Tcl_Eval;
+
+/*
+ * Prototypes of internal functions.
+ */
+static int
+IsSetVarCmd _ANSI_ARGS_((Tcl_Interp *interp,
+                         char       *command));
+
+static void
+OutFlush _ANSI_ARGS_((FILE *filePtr));
+
+static void
+Tcl_PrintResult _ANSI_ARGS_((FILE   *fp,
+                             int     returnval,
+                             char   *resultText));
+
+static void
+OutputPrompt _ANSI_ARGS_((Tcl_Interp *interp,
+                          FILE       *outFP,
+                          int         topLevel));
+
+static int
+SetPromptVar _ANSI_ARGS_((Tcl_Interp  *interp,
+                          char        *hookVarName,
+                          char        *newHookValue,
+                          char       **oldHookValuePtr));
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * IsSetVarCmd --
+ *
+ *      Determine if the current command is a `set' command that set
+ *      a variable (i.e. two arguments).  This routine should only be
+ *      called if the command returned TCL_OK.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+IsSetVarCmd (interp, command)
+    Tcl_Interp *interp;
+    char       *command;
+{
+    char  *nextPtr;
+
+    if ((!STRNEQU (command, "set", 3)) || (!isspace (command [3])))
+        return FALSE;  /* Quick check */
+
+    nextPtr = TclWordEnd (command, FALSE);
+    if (*nextPtr == '\0')
+        return FALSE;
+    nextPtr = TclWordEnd (nextPtr, FALSE);
+    if (*nextPtr == '\0')
+        return FALSE;
+
+    while (*nextPtr != '\0') {
+        if (!isspace (*nextPtr))
+            return TRUE;
+        nextPtr++;
+    }
+    return FALSE;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * OutFlush --
+ *
+ *   Flush a stdio file and check for errors.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static void
+OutFlush (filePtr)
+    FILE *filePtr;
+{
+    int stat;
+
+    stat = fflush (filePtr);
+    if (ferror (filePtr)) {
+        if (errno != EINTR)
+            panic ("command loop: error writing to output file: %s\n",
+                   strerror (errno));
+        clearerr (filePtr);
+    }
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_PrintResult --
+ *
+ *      Print a Tcl result
+ *
+ * Results:
+ *
+ *      Takes an open file pointer, a return value and some result
+ *      text.  Prints the result text if the return value is TCL_OK,
+ *      prints "Error:" and the result text if it's TCL_ERROR,
+ *      else prints "Bad return code:" and the result text.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static void
+Tcl_PrintResult (fp, returnval, resultText)
+    FILE   *fp;
+    int     returnval;
+    char   *resultText;
+{
+
+    if (returnval == TCL_OK) {
+        if (resultText [0] != '\0') {
+            fputs (resultText, fp);
+            fputs ("\n", fp);
+        }
+    } else {
+        OutFlush (fp);
+        fputs ((returnval == TCL_ERROR) ? "Error" : "Bad return code", stderr);
+        fputs (": ", stderr);
+        fputs (resultText, stderr);
+        fputs ("\n", stderr);
+        OutFlush (stderr);
+    }
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * OutputPromp --
+ *     Outputs a prompt by executing either the command string in
+ *     TCLENV(topLevelPromptHook) or TCLENV(downLevelPromptHook).
+ *
+ *-----------------------------------------------------------------------------
+ */
+static void
+OutputPrompt (interp, outFP, topLevel)
+    Tcl_Interp *interp;
+    FILE       *outFP;
+    int         topLevel;
+{
+    char *hookName;
+    char *promptHook;
+    int   result;
+    int   promptDone = FALSE;
+
+    hookName = topLevel ? "topLevelPromptHook"
+                        : "downLevelPromptHook";
+
+    promptHook = Tcl_GetVar2 (interp, "TCLENV", hookName, 1);
+    if ((promptHook != NULL) && (promptHook [0] != '\0')) {
+        result = Tcl_Eval (interp, promptHook, 0, (char **)NULL);
+        if (!((result == TCL_OK) || (result == TCL_RETURN))) {
+            fputs ("Error in prompt hook: ", stderr);
+            fputs (interp->result, stderr);
+            fputs ("\n", stderr);
+            Tcl_PrintResult (outFP, result, interp->result);
+        } else {
+            fputs (interp->result, outFP);
+            promptDone = TRUE;
+        }
+    } 
+    if (!promptDone) {
+        if (topLevel)
+            fputs ("%", outFP);
+        else
+            fputs (">", outFP);
+    }
+    OutFlush (outFP);
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CommandLoop --
+ *
+ *   Run a Tcl command loop.  The command loop interactively prompts for,
+ * reads and executes commands. Two entries in the global array TCLENV
+ * contain prompt hooks.  A prompt hook is Tcl code that is executed and
+ * its result is used as the prompt string.  The element `topLevelPromptHook'
+ * is the hook that generates the main prompt.  The element
+ * `downLevelPromptHook' is the hook to generate the prompt for reading
+ * continuation lines for incomplete commands.  If a signal occurs while
+ * in the command loop, it is reset and ignored.  EOF terminates the loop.
+ *
+ * Parameters:
+ *   o interp (I) - A pointer to the interpreter
+ *   o inFile (I) - The file to read commands from.
+ *   o outFile (I) - The file to write the prompts to. 
+ *   o evalProc (I) - The function to call to evaluate a command.
+ *     Should be either Tcl_Eval or Tcl_RecordAndEval if history is desired.
+ *   o options (I) - Currently unused.
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_CommandLoop (interp, inFile, outFile, evalProc, options)
+    Tcl_Interp *interp;
+    FILE       *inFile;
+    FILE       *outFile;
+    int         (*evalProc) ();
+    unsigned    options;
+{
+    Tcl_CmdBuf cmdBuf;
+    char       inputBuf[256];
+    int        topLevel = TRUE;
+    int        result;
+    char      *cmd;
+
+    cmdBuf = Tcl_CreateCmdBuf();
+
+    while (TRUE) {
+        /*
+         * If a signal came in, process it and drop any pending command.
+         */
+        if (tclReceivedSignal) {
+            Tcl_CheckForSignal (interp, TCL_OK);
+            Tcl_DeleteCmdBuf(cmdBuf);
+            cmdBuf = Tcl_CreateCmdBuf();
+            topLevel = TRUE;
+        }
+        /*
+         * Output a prompt and input a command.
+         */
+        clearerr (inFile);
+        clearerr (outFile);
+        OutputPrompt (interp, outFile, topLevel);
+        errno = 0;
+        if (fgets (inputBuf, sizeof (inputBuf), inFile) == NULL) {
+            if (!feof(inFile) && (errno == EINTR)) {
+                putchar('\n');
+                continue;  /* Next command */
+            }
+            if (ferror (inFile))
+                panic ("command loop: error on input file: %s\n",
+                       strerror (errno));
+            goto endOfFile;
+        }
+        cmd = Tcl_AssembleCmd(cmdBuf, inputBuf);
+
+        if (cmd == NULL) {
+            topLevel = FALSE;
+            continue;  /* Next line */
+        }
+        /*
+         * Finally have a complete command, go eval it and maybe output the
+         * result.
+         */
+        result = (*evalProc) (interp, cmd, 0, (char **)NULL);
+        if (result != TCL_OK || !IsSetVarCmd (interp, cmd))
+            Tcl_PrintResult (outFile, result, interp->result);
+        topLevel = TRUE;
+    }
+endOfFile:
+    Tcl_DeleteCmdBuf(cmdBuf);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * SetPromptVar --
+ *     Set one of the prompt hook variables, saving a copy of the old
+ *     value, if it exists.
+ *
+ * Parameters:
+ *   o hookVarName (I) - The name of the prompt hook, which is an element
+ *     of the TCLENV array.  One of topLevelPromptHook or downLevelPromptHook.
+ *   o newHookValue (I) - The new value for the prompt hook.
+ *   o oldHookValuePtr (O) - If not NULL, then a pointer to a copy of the
+ *     old prompt value is returned here.  NULL is returned if there was not
+ *     old value.  This is a pointer to a malloc-ed string that must be
+ *     freed when no longer needed.
+ * Result:
+ *   TCL_OK if the hook variable was set ok, TCL_ERROR if an error occured.
+ *-----------------------------------------------------------------------------
+ */
+static int
+SetPromptVar (interp, hookVarName, newHookValue, oldHookValuePtr)
+    Tcl_Interp *interp;
+    char       *hookVarName;
+    char       *newHookValue;
+    char      **oldHookValuePtr;
+{
+    char *hookValue;    
+    char *oldHookPtr = NULL;
+
+    if (oldHookValuePtr != NULL) {
+        hookValue = Tcl_GetVar2 (interp, "TCLENV", hookVarName, 
+                                 TCL_GLOBAL_ONLY);
+        if (hookValue != NULL) {
+            oldHookPtr = ckalloc (strlen (hookValue) + 1);
+            strcpy (oldHookPtr, hookValue);
+        }
+    }
+    if (Tcl_SetVar2 (interp, "TCLENV", hookVarName, newHookValue, 
+                     TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG) == NULL) {
+        if (oldHookPtr != NULL)
+            ckfree (oldHookPtr);
+        return TCL_ERROR;
+    }    
+    if (oldHookValuePtr != NULL)
+        *oldHookValuePtr = oldHookPtr;
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CommandloopCmd --
+ *     Implements the TCL commandloop command:
+ *       commandloop prompt prompt2
+ *
+ * Results:
+ *     Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_CommandloopCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    char *oldTopLevelHook  = NULL;
+    char *oldDownLevelHook = NULL;
+    int   result = TCL_ERROR;
+
+    if (argc > 3) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv[0],
+                          " [prompt] [prompt2]", (char *) NULL);
+        return TCL_ERROR;
+    }
+    if (argc > 1) {
+        if (SetPromptVar (interp, "topLevelPromptHook", argv[1],
+                          &oldTopLevelHook) != TCL_OK)
+            goto exitPoint;
+    }
+    if (argc > 2) {
+        if (SetPromptVar (interp, "downLevelPromptHook", argv[2], 
+                          &oldDownLevelHook) != TCL_OK)
+            goto exitPoint;
+    }
+
+    Tcl_CommandLoop (interp, stdin, stdout, tclShellCmdEvalProc, 0);
+
+    if (oldTopLevelHook != NULL)
+        SetPromptVar (interp, "topLevelPromptHook", oldTopLevelHook, NULL);
+    if (oldDownLevelHook != NULL)
+        SetPromptVar (interp, "downLevelPromptHook", oldDownLevelHook, NULL);
+        
+    result = TCL_OK;
+exitPoint:
+    if (oldTopLevelHook != NULL)
+        ckfree (oldTopLevelHook);
+    if (oldDownLevelHook != NULL)
+        ckfree (oldDownLevelHook);
+    return result;
+}
diff --git a/src/tclx/src/tclxcret.c b/src/tclx/src/tclxcret.c
new file mode 100644 (file)
index 0000000..0d6d526
--- /dev/null
@@ -0,0 +1,302 @@
+/*
+ * tclXcreate.c
+ *
+ * Contains a routine to create an interpreter and initialize all the Extended
+ * Tcl commands.  It is is a seperate file so that an application may create
+ * the interpreter and add in only a subset of the Extended Tcl commands.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXcreate.c,v 2.0 1992/10/16 04:50:33 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+int matherr ();
+
+/*
+ * This is a little kludge to make sure matherr is brought in from the Tcl
+ * library if it is not already defined.  This could be done on the link line,
+ * but this makes sure it happens.  This is a global so optimizers don't thow
+ * away the assignment to it.
+ */
+static int (*bringInMathErr)() = matherr;
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CreateExtendedInterp --
+ *
+ *      Create a new TCL command interpreter and initialize all of the
+ *      extended Tcl commands..
+ *
+ * Results:
+ *      The return value is a token for the interpreter.
+ *-----------------------------------------------------------------------------
+ */
+Tcl_Interp *
+Tcl_CreateExtendedInterp ()
+{
+    Tcl_Interp *interp;
+
+    interp = Tcl_CreateInterp ();
+
+    /*
+     * from tclCkalloc.c (now part of the UCB Tcl).
+     */
+#ifdef TCL_MEM_DEBUG    
+    Tcl_InitMemory (interp);
+#endif
+
+    /*
+     * from tclXbsearch.c
+     */
+    Tcl_CreateCommand (interp, "bsearch", Tcl_BsearchCmd, 
+                      (ClientData)NULL, (void (*)())NULL);
+
+    /*
+     * from tclXchmod.c
+     */
+    Tcl_CreateCommand (interp, "chgrp", Tcl_ChgrpCmd, (ClientData)NULL,
+                      (void (*)())NULL);
+    Tcl_CreateCommand (interp, "chmod", Tcl_ChmodCmd, (ClientData)NULL,
+                      (void (*)())NULL);
+    Tcl_CreateCommand (interp, "chown", Tcl_ChownCmd, (ClientData)NULL,
+                      (void (*)())NULL);
+
+    /*
+     * from tclXclock.c
+     */
+    Tcl_CreateCommand (interp, "getclock", Tcl_GetclockCmd, 
+                      (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand (interp, "fmtclock", Tcl_FmtclockCmd, 
+                      (ClientData)NULL, (void (*)())NULL);
+
+    /*
+     * from tclXcnvdate.c
+     */
+    Tcl_CreateCommand (interp, "convertclock", Tcl_ConvertclockCmd,
+                      (ClientData)NULL, (void (*)())NULL);
+
+    /*
+     * from tclXcmdloop.c
+     */
+    Tcl_CreateCommand (interp, "commandloop", Tcl_CommandloopCmd, 
+                      (ClientData)NULL, (void (*)())NULL);
+
+    /*
+     * from tclXdebug.c
+     */
+    Tcl_InitDebug (interp);
+
+    /*
+     * from tclXdup.c
+     */
+    Tcl_CreateCommand (interp, "dup",  Tcl_DupCmd, 
+                       (ClientData) NULL, (void (*)())NULL);
+    /*
+     * from tclXtclXfcntl.c
+     */
+    Tcl_CreateCommand (interp, "fcntl", Tcl_FcntlCmd,
+                       (ClientData) NULL, (void (*)())NULL);
+
+    /*
+     * from tclXfilecmds.c
+     */
+    Tcl_CreateCommand (interp, "pipe", Tcl_PipeCmd,
+                       (ClientData) NULL, (void (*)())NULL);
+    Tcl_CreateCommand (interp, "copyfile", Tcl_CopyfileCmd,
+                       (ClientData) NULL, (void (*)())NULL);
+    Tcl_CreateCommand (interp, "fstat", Tcl_FstatCmd,
+                       (ClientData) NULL, (void (*)())NULL);
+    Tcl_CreateCommand (interp, "lgets", Tcl_LgetsCmd,
+                       (ClientData) NULL, (void (*)())NULL);
+    Tcl_CreateCommand (interp, "flock", Tcl_FlockCmd,
+                       (ClientData) NULL, (void (*)())NULL);
+    Tcl_CreateCommand (interp, "funlock", Tcl_FunlockCmd,
+                       (ClientData) NULL, (void (*)())NULL);
+
+    /*
+     * from tclXfilescan.c
+     */
+    Tcl_InitFilescan (interp);
+
+    /*
+     * from tclXfmath.c
+     */
+    Tcl_CreateCommand(interp, "acos", Tcl_AcosCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "asin", Tcl_AsinCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "atan", Tcl_AtanCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "cos", Tcl_CosCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "sin", Tcl_SinCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "tan", Tcl_TanCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "cosh", Tcl_CoshCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "sinh", Tcl_SinhCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "tanh", Tcl_TanhCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "exp", Tcl_ExpCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "log", Tcl_LogCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "log10", Tcl_Log10Cmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "sqrt", Tcl_SqrtCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "fabs", Tcl_FabsCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "floor", Tcl_FloorCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "ceil", Tcl_CeilCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "fmod", Tcl_FmodCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "pow", Tcl_PowCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+
+    /*
+     * from tclXgeneral.c
+     */
+    Tcl_CreateCommand(interp, "echo", Tcl_EchoCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "infox", Tcl_InfoxCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "loop", Tcl_LoopCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+
+    /*
+     * from tclXid.c
+     */
+    Tcl_CreateCommand (interp, "id", Tcl_IdCmd,
+                       (ClientData)NULL, (void (*)())NULL);
+
+    /*
+     * from tclXkeylist.c
+     */
+    Tcl_CreateCommand(interp, "keyldel", Tcl_KeyldelCmd,
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "keylget", Tcl_KeylgetCmd,
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "keylkeys", Tcl_KeylkeysCmd,
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "keylset", Tcl_KeylsetCmd,
+                     (ClientData)NULL, (void (*)())NULL);
+
+    /*
+     * from tclXlist.c
+     */
+    Tcl_CreateCommand(interp, "lvarcat", Tcl_LvarcatCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "lvarpop", Tcl_LvarpopCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "lvarpush", Tcl_LvarpushCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "lempty", Tcl_LemptyCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    /*
+     * from tclXmath.c
+     */
+    Tcl_CreateCommand (interp, "max", Tcl_MaxCmd, (ClientData)NULL, 
+              (void (*)())NULL);
+    Tcl_CreateCommand (interp, "min", Tcl_MinCmd, (ClientData)NULL, 
+              (void (*)())NULL);
+    Tcl_CreateCommand (interp, "random", Tcl_RandomCmd, (ClientData)NULL, 
+              (void (*)())NULL);
+
+    /*
+     * from tclXmsgcat.c
+     */
+    Tcl_InitMsgCat (interp);
+
+    /*
+     * from tclXprocess.c
+     */
+    Tcl_CreateCommand (interp, "execl", Tcl_ExeclCmd, (ClientData)NULL,
+                      (void (*)())NULL);
+    Tcl_CreateCommand (interp, "fork", Tcl_ForkCmd, (ClientData)NULL,
+                      (void (*)())NULL);
+    Tcl_CreateCommand (interp, "wait", Tcl_WaitCmd, (ClientData)NULL,
+                      (void (*)())NULL);
+
+    /*
+     * from tclXprofile.c
+     */
+    Tcl_InitProfile (interp);
+
+    /*
+     * from tclXselect.c
+     */
+    Tcl_CreateCommand (interp, "select", Tcl_SelectCmd,
+                       (ClientData) NULL, (void (*)())NULL);
+
+    /*
+     * from tclXsignal.c
+     */
+    Tcl_InitSignalHandling (interp);
+
+    /*
+     * from tclXstring.c
+     */
+    Tcl_CreateCommand(interp, "cindex", Tcl_CindexCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "clength", Tcl_ClengthCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "crange", Tcl_CrangeCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "csubstr", Tcl_CrangeCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand(interp, "replicate", Tcl_ReplicateCmd, 
+                     (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand (interp, "translit", Tcl_TranslitCmd, (ClientData)NULL,
+                       (void (*)())NULL);
+    Tcl_CreateCommand (interp, "ctype", Tcl_CtypeCmd,
+                       (ClientData)NULL, (void (*)())NULL);
+
+    /*
+     * from tclXlib.c
+     */
+    Tcl_CreateCommand (interp, "demand_load", Tcl_Demand_loadCmd,
+                      (ClientData)NULL, (void (*)())NULL);
+    Tcl_CreateCommand (interp, "loadlibindex", Tcl_LoadlibindexCmd,
+                      (ClientData)NULL, (void (*)())NULL);
+
+    /*
+     * from tclXunixcmds.c
+     */
+    Tcl_CreateCommand (interp, "system", Tcl_SystemCmd, (ClientData)NULL,
+                      (void (*)())NULL);
+    Tcl_CreateCommand (interp, "times", Tcl_TimesCmd, (ClientData)NULL,
+                      (void (*)())NULL);
+    Tcl_CreateCommand (interp, "umask", Tcl_UmaskCmd, (ClientData)NULL,
+                      (void (*)())NULL);
+    Tcl_CreateCommand (interp, "link", Tcl_LinkCmd, (ClientData)NULL,
+                      (void (*)())NULL);
+    Tcl_CreateCommand (interp, "unlink", Tcl_UnlinkCmd, (ClientData)NULL,
+                      (void (*)())NULL);
+    Tcl_CreateCommand (interp, "mkdir", Tcl_MkdirCmd, (ClientData)NULL,
+                      (void (*)())NULL);
+    Tcl_CreateCommand (interp, "rmdir", Tcl_RmdirCmd, (ClientData)NULL,
+                      (void (*)())NULL);
+    Tcl_CreateCommand (interp, "alarm", Tcl_AlarmCmd, (ClientData)NULL, 
+                      (void (*)())NULL);
+    Tcl_CreateCommand (interp, "sleep", Tcl_SleepCmd, (ClientData)NULL, 
+                      (void (*)())NULL);
+
+    return interp;
+}
diff --git a/src/tclx/src/tclxdebg.c b/src/tclx/src/tclxdebg.c
new file mode 100644 (file)
index 0000000..55e2590
--- /dev/null
@@ -0,0 +1,406 @@
+/*
+ * tclXdebug.c --
+ *
+ * Tcl command execution trace command.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXdebug.c,v 2.0 1992/10/16 04:50:34 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+/*
+ * Client data structure for the cmdtrace command.
+ */
+#define ARG_TRUNCATE_SIZE 40
+#define CMD_TRUNCATE_SIZE 60
+
+typedef struct traceInfo_t {
+    Tcl_Interp *interp;
+    Tcl_Trace   traceHolder;
+    int         noEval;
+    int         noTruncate;
+    int         procCalls;
+    int         flush;
+    int         depth;
+    FILE       *filePtr;          /* File to output trace to. */
+    } traceInfo_t, *traceInfo_pt;
+
+/*
+ * Prototypes of internal functions.
+ */
+void
+PrintStr _ANSI_ARGS_((FILE *filePtr,
+                      char *string,
+                      int   numChars));
+
+void
+PrintArg _ANSI_ARGS_((FILE *filePtr,
+                      char *argStr,
+                      int   noTruncate));
+
+void
+TraceCode  _ANSI_ARGS_((traceInfo_pt traceInfoPtr,
+                        int          level,
+                        char        *command,
+                        int          argc,
+                        char       **argv));
+
+void
+CmdTraceRoutine _ANSI_ARGS_((ClientData    clientData,
+                             Tcl_Interp   *interp,
+                             int           level,
+                             char         *command,
+                             Tcl_CmdProc  *cmdProc,
+                             ClientData    cmdClientData,
+                             int           argc,
+                             char        **argv));
+
+void
+CleanUpDebug _ANSI_ARGS_((ClientData clientData));
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * PrintStr --
+ *     Print an string, truncating it to the specified number of characters.
+ * If the string contains newlines, \n is substituted.
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+PrintStr (filePtr, string, numChars)
+    FILE *filePtr;
+    char *string;
+    int   numChars;
+{
+    int idx;
+
+    for (idx = 0; idx < numChars; idx++) {
+        if (string [idx] == '\n') {
+           putc ('\\', filePtr);
+           putc ('n', filePtr);
+        } else
+           putc (string [idx], filePtr);
+    }
+    if (numChars < strlen (string))
+        fprintf (filePtr, "...");
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * PrintArg --
+ *     Print an argument string, truncating and adding "..." if its longer
+ *     then ARG_TRUNCATE_SIZE.  If the string contains white spaces, quote
+ *     it with angle brackets.
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+PrintArg (filePtr, argStr, noTruncate)
+    FILE *filePtr;
+    char *argStr;
+    int   noTruncate;
+{
+    int idx, argLen, printLen;
+    int quote_it;
+
+    argLen = strlen (argStr);
+    printLen = argLen;
+    if ((!noTruncate) && (printLen > ARG_TRUNCATE_SIZE))
+        printLen = ARG_TRUNCATE_SIZE;
+
+    quote_it = (printLen == 0);
+
+    for (idx = 0; idx < printLen; idx++)
+        if (isspace (argStr [idx])) {
+            quote_it = TRUE;
+            break;
+        }
+
+    if (quote_it) 
+        putc ('{', filePtr);
+    PrintStr (filePtr, argStr, printLen);
+    if (quote_it) 
+        putc ('}', filePtr);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * TraceCode --
+ *    Print out a trace of a code line.  Level is used for indenting
+ * and marking lines and may be eval or procedure level.
+ * 
+ *-----------------------------------------------------------------------------
+ */
+void
+TraceCode (traceInfoPtr, level, command, argc, argv)
+    traceInfo_pt traceInfoPtr;
+    int          level;
+    char        *command;
+    int          argc;
+    char       **argv;
+{
+    int idx, cmdLen, printLen;
+
+    fprintf (traceInfoPtr->filePtr, "%2d:", level);
+
+    if (level > 20)
+        level = 20;
+    for (idx = 0; idx < level; idx++) 
+        fprintf (traceInfoPtr->filePtr, "  ");
+
+    if (traceInfoPtr->noEval) {
+        cmdLen = printLen = strlen (command);
+        if ((!traceInfoPtr->noTruncate) && (printLen > CMD_TRUNCATE_SIZE))
+            printLen = CMD_TRUNCATE_SIZE;
+
+        PrintStr (traceInfoPtr->filePtr, command, printLen);
+      } else {
+          for (idx = 0; idx < argc; idx++) {
+              if (idx > 0)
+                  putc (' ', traceInfoPtr->filePtr);
+              PrintArg (traceInfoPtr->filePtr, argv[idx], 
+                        traceInfoPtr->noTruncate);
+          }
+    }
+
+    putc ('\n', traceInfoPtr->filePtr);
+    if (traceInfoPtr->flush)
+        fflush (traceInfoPtr->filePtr);
+  
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * CmdTraceRoutine --
+ *  Routine called by Tcl_Eval to trace a command.
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+CmdTraceRoutine (clientData, interp, level, command, cmdProc, cmdClientData, 
+                 argc, argv)
+    ClientData    clientData;
+    Tcl_Interp   *interp;
+    int           level;
+    char         *command;
+    Tcl_CmdProc  *cmdProc;
+    ClientData    cmdClientData;
+    int           argc;
+    char        **argv;
+{
+    Interp       *iPtr = (Interp *) interp;
+    traceInfo_pt  traceInfoPtr = (traceInfo_pt) clientData;
+    int           procLevel;
+
+    if (!traceInfoPtr->procCalls) {
+        TraceCode (traceInfoPtr, level, command, argc, argv);
+    } else {
+        if (TclFindProc (iPtr, argv [0]) != NULL) {
+            procLevel = (iPtr->varFramePtr == NULL) ? 0 : 
+                        iPtr->varFramePtr->level;
+            TraceCode (traceInfoPtr, procLevel, command, argc, argv);
+        }
+    }
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CmdtraceCmd --
+ *     Implements the TCL trace command:
+ *     cmdtrace level|on [noeval] [notruncate] [flush] [procs] [filehdl]
+ *     cmdtrace off
+ *     cmdtrace depth
+ *
+ * Results:
+ *  Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+Tcl_CmdtraceCmd (clientData, interp, argc, argv)
+    ClientData    clientData;
+    Tcl_Interp   *interp;
+    int           argc;
+    char        **argv;
+{
+    Interp       *iPtr = (Interp *) interp;
+    traceInfo_pt  infoPtr = (traceInfo_pt) clientData;
+    int           idx;
+    char         *fileHandle;
+
+    if (argc < 2)
+        goto argumentError;
+
+    /*
+     * Handle `depth' sub-command.
+     */
+    if (STREQU (argv[1], "depth")) {
+        if (argc != 2)
+            goto argumentError;
+        sprintf(interp->result, "%d", infoPtr->depth);
+        return TCL_OK;
+    }
+
+    /*
+     * If a trace is in progress, delete it now.
+     */
+    if (infoPtr->traceHolder != NULL) {
+        Tcl_DeleteTrace(interp, infoPtr->traceHolder);
+        infoPtr->depth = 0;
+        infoPtr->traceHolder = NULL;
+    }
+
+    /*
+     * Handle off sub-command.
+     */
+    if (STREQU (argv[1], "off")) {
+        if (argc != 2)
+            goto argumentError;
+        return TCL_OK;
+    }
+
+    infoPtr->noEval     = FALSE;
+    infoPtr->noTruncate = FALSE;
+    infoPtr->procCalls  = FALSE;
+    infoPtr->flush      = FALSE;
+    infoPtr->filePtr    = stdout;
+    fileHandle          = NULL;
+
+    for (idx = 2; idx < argc; idx++) {
+        if (STREQU (argv[idx], "notruncate")) {
+            if (infoPtr->noTruncate)
+                goto argumentError;
+            infoPtr->noTruncate = TRUE;
+            continue;
+        }
+        if (STREQU (argv[idx], "noeval")) {
+            if (infoPtr->noEval)
+                goto argumentError;
+            infoPtr->noEval = TRUE;
+            continue;
+        }
+        if (STREQU (argv[idx], "flush")) {
+            if (infoPtr->flush)
+                goto argumentError;
+            infoPtr->flush = TRUE;
+            continue;
+        }
+        if (STREQU (argv[idx], "procs")) {
+            if (infoPtr->procCalls)
+                goto argumentError;
+            infoPtr->procCalls = TRUE;
+            continue;
+        }
+        if (STRNEQU (argv [idx], "std", 3) || 
+                STRNEQU (argv [idx], "file", 4)) {
+            if (fileHandle != NULL)
+                goto argumentError;
+            fileHandle = argv [idx];
+            continue;
+        }
+        goto invalidOption;
+    }
+
+    if (STREQU (argv[1], "on")) {
+        infoPtr->depth = MAXINT;
+    } else {
+        if (Tcl_GetInt (interp, argv[1], &(infoPtr->depth)) != TCL_OK)
+            return TCL_ERROR;
+    }
+    if (fileHandle != NULL) {
+        OpenFile *tclFilePtr;
+
+        if (TclGetOpenFile (interp, fileHandle, &tclFilePtr) != TCL_OK)
+           return TCL_ERROR;
+        if (!tclFilePtr->writable) {
+            Tcl_AppendResult (interp, "file not writable: ", fileHandle,
+                              (char *) NULL);
+            return TCL_ERROR;
+        }
+        infoPtr->filePtr = tclFilePtr->f;
+    }
+    
+    infoPtr->traceHolder = Tcl_CreateTrace (interp, infoPtr->depth,
+                                            CmdTraceRoutine,
+                                            (ClientData) infoPtr);
+    return TCL_OK;
+
+argumentError:
+    Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                      " level | on [noeval] [notruncate] [flush] [procs]",
+                      "[handle] | off | depth", (char *) NULL);
+    return TCL_ERROR;
+
+invalidOption:
+    Tcl_AppendResult (interp, "invalid option: expected ",
+                      "one of \"noeval\", \"notruncate\", \"procs\", ",
+                      "\"flush\" or a file handle", (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ *  CleanUpDebug --
+ *
+ *  Release the client data area when the trace command is deleted.
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+CleanUpDebug (clientData)
+    ClientData clientData;
+{
+    traceInfo_pt infoPtr = (traceInfo_pt) clientData;
+
+    if (infoPtr->traceHolder != NULL)
+        Tcl_DeleteTrace (infoPtr->interp, infoPtr->traceHolder);
+    ckfree ((char *) infoPtr);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ *  Tcl_InitDebug --
+ *
+ *  Initialize the TCL debugging commands.
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_InitDebug (interp)
+    Tcl_Interp *interp;
+{
+    traceInfo_pt infoPtr;
+
+    infoPtr = (traceInfo_pt) ckalloc (sizeof (traceInfo_t));
+
+    infoPtr->interp      = interp;
+    infoPtr->traceHolder = NULL;
+    infoPtr->noEval      = FALSE;
+    infoPtr->noTruncate  = FALSE;
+    infoPtr->procCalls   = FALSE;
+    infoPtr->flush       = FALSE;
+    infoPtr->depth       = 0;
+
+    Tcl_CreateCommand (interp, "cmdtrace", Tcl_CmdtraceCmd, 
+                       (ClientData)infoPtr, CleanUpDebug);
+}
+
+
diff --git a/src/tclx/src/tclxdup.c b/src/tclx/src/tclxdup.c
new file mode 100644 (file)
index 0000000..1e3d32b
--- /dev/null
@@ -0,0 +1,267 @@
+/*
+ * tclXdup.c
+ *
+ * Extended Tcl dup command.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXdup.c,v 2.0 1992/10/16 04:50:36 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+/*
+ * Prototypes of internal functions.
+ */
+static OpenFile *
+DoNormalDup _ANSI_ARGS_((Tcl_Interp *interp,
+                         OpenFile   *oldFilePtr));
+
+static OpenFile *
+DoSpecialDup _ANSI_ARGS_((Tcl_Interp *interp,
+                          OpenFile   *oldFilePtr,
+                          char       *newHandleName));
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * DoNormalDup --
+ *   Process a normal dup command (i.e. the new file is not specified).
+ *
+ * Parameters:
+ *   o interp (I) - If an error occures, the error message is in result,
+ *     otherwise the file handle is in result.
+ *   o oldFilePtr (I) - Tcl file control block for the file to dup.
+ * Returns:
+ *   A pointer to the open file structure for the new file, or NULL if an
+ * error occured.
+ *-----------------------------------------------------------------------------
+ */
+static OpenFile *
+DoNormalDup (interp, oldFilePtr)
+    Tcl_Interp *interp;
+    OpenFile   *oldFilePtr;
+{
+    Interp   *iPtr = (Interp *) interp;
+    int       newFileId;
+    FILE     *newFileCbPtr;
+    char     *mode;
+
+    newFileId = dup (fileno (oldFilePtr->f));
+    if (newFileId < 0)
+        goto unixError;
+
+    if (Tcl_SetupFileEntry (interp, newFileId,
+                            oldFilePtr->readable,
+                            oldFilePtr->writable) != TCL_OK)
+        return NULL;
+
+    sprintf (interp->result, "file%d", newFileId);
+    return iPtr->filePtrArray [newFileId];
+
+unixError:
+    interp->result = Tcl_UnixError (interp);
+    return NULL;;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * DoSpecialDup --
+ *   Process a special dup command.  This is the case were the file is
+ *   dup-ed to stdin, stdout or stderr.  The new file may or be open or
+ *   closed
+ * Parameters:
+ *   o interp (I) - If an error occures, the error message is in result,
+ *     otherwise nothing is returned.
+ *   o oldFilePtr (I) - Tcl file control block for the file to dup.
+ *   o newFileHandle (I) - The handle name for the new file.
+ * Returns:
+ *   A pointer to the open file structure for the new file, or NULL if an
+ * error occured.
+ *-----------------------------------------------------------------------------
+ */
+static OpenFile *
+DoSpecialDup (interp, oldFilePtr, newHandleName)
+    Tcl_Interp *interp;
+    OpenFile   *oldFilePtr;
+    char       *newHandleName;
+{
+    Interp   *iPtr = (Interp *) interp;
+    int       newFileId;
+    FILE     *newFileCbPtr;
+    OpenFile *newFilePtr;
+
+    /*
+     * Duplicate the old file to the specified file id.
+     */
+    newFileId = Tcl_ConvertFileHandle (interp, newHandleName);
+    if (newFileId < 0)
+        return NULL;
+    if (newFileId > 2) {
+        Tcl_AppendResult (interp, "target handle must be one of stdin, ",
+                          "stdout, stderr, file0, file1, or file2: got \"",
+                          newHandleName, "\"", (char *) NULL);
+        return NULL;
+    }
+    switch (newFileId) {
+        case 0: 
+            newFileCbPtr = stdin;
+            break;
+        case 1: 
+            newFileCbPtr = stdout;
+            break;
+        case 2: 
+            newFileCbPtr = stderr;
+            break;
+    }
+
+    /*
+     * If the specified id is not open, set up a stdio file descriptor.
+     */
+    TclMakeFileTable (iPtr, newFileId);
+    if (iPtr->filePtrArray [newFileId] == NULL) {
+        char *mode;
+
+        /*
+         * Set up a stdio FILE control block for the new file.
+         */
+        if (oldFilePtr->readable && oldFilePtr->writable) {
+            mode = "r+";
+        } else if (oldFilePtr->writable) {
+            mode = "w";
+        } else {
+            mode = "r";
+        }
+        if (freopen ("/dev/null", mode, newFileCbPtr) == NULL)
+            goto unixError;
+    }
+    
+    /*
+     * This functionallity may be obtained with dup2 on most systems.  Being
+     * open is optional.
+     */
+    close (newFileId);
+#ifndef MSDOS
+    if (fcntl (fileno (oldFilePtr->f), F_DUPFD, newFileId) < 0)
+        goto unixError;
+#endif
+    /*
+     * Set up a Tcl OpenFile structure for the new file handle.
+     */
+    newFilePtr = iPtr->filePtrArray [fileno (newFileCbPtr)];
+    if (newFilePtr == NULL) {
+        newFilePtr = (OpenFile*) ckalloc (sizeof (OpenFile));
+        iPtr->filePtrArray [fileno (newFileCbPtr)] = newFilePtr;
+    }
+    newFilePtr->f        = newFileCbPtr;
+    newFilePtr->f2       = NULL;
+    newFilePtr->readable = oldFilePtr->readable;
+    newFilePtr->writable = oldFilePtr->writable;
+    newFilePtr->numPids  = 0;
+    newFilePtr->pidPtr   = NULL;
+    newFilePtr->errorId  = -1;
+
+    return newFilePtr;
+
+unixError:
+    iPtr->result = Tcl_UnixError (interp);
+    return NULL;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_DupCmd --
+ *     Implements the dup TCL command:
+ *         dup filehandle [stdhandle]
+ *
+ * Results:
+ *      Returns TCL_OK and interp->result containing a filehandle
+ *      if the requested file or pipe was successfully duplicated.
+ *
+ *      Return TCL_ERROR and interp->result containing an
+ *      explanation of what went wrong if an error occured.
+ *
+ * Side effects:
+ *      Locates and creates an entry in the handles table
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_DupCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    OpenFile *oldFilePtr, *newFilePtr;
+    long      seekOffset = -1;
+
+    if ((argc < 2) || (argc > 3)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv[0], 
+                          " filehandle [stdhandle]", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (TclGetOpenFile(interp, argv[1], &oldFilePtr) != TCL_OK)
+       return TCL_ERROR;
+    if (oldFilePtr->numPids > 0) { /*??????*/
+        Tcl_AppendResult (interp, "can not `dup' a pipeline", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    /*
+     * If writable, flush out the buffer.  If readable, remember were we are
+     * so the we can set it up for the next stdio read to come from the same
+     * place.  The location is only recorded if the file is a reqular file,
+     * since you cann't seek on other types of files.
+     */
+    if (oldFilePtr->writable) {
+        if (fflush (oldFilePtr->f) != 0)
+            goto unixError;
+    }
+    if (oldFilePtr->readable) {
+        struct stat statBuf;
+        
+        if (fstat (fileno (oldFilePtr->f), &statBuf) < 0)
+            goto unixError;
+        if ((statBuf.st_mode & S_IFMT) == S_IFREG) {
+            seekOffset = ftell (oldFilePtr->f);
+            if (seekOffset < 0)
+                goto unixError;
+        }
+    }
+
+    /*
+     * Process the dup depending on if dup-ing to a new file or a target
+     * file handle.
+     */
+    if (argc == 2)
+        newFilePtr = DoNormalDup (interp, oldFilePtr);
+    else
+        newFilePtr = DoSpecialDup (interp, oldFilePtr, argv [2]);
+
+    if (newFilePtr == NULL)
+        return TCL_ERROR;
+
+    if (seekOffset >= 0) {
+        if (fseek (newFilePtr->f, seekOffset, SEEK_SET) != 0)
+            goto unixError;
+    }
+    return TCL_OK;
+
+unixError:
+    Tcl_ResetResult (interp);
+    interp->result = Tcl_UnixError (interp);
+    return TCL_ERROR;
+}
diff --git a/src/tclx/src/tclxfcmd.c b/src/tclx/src/tclxfcmd.c
new file mode 100644 (file)
index 0000000..a8d2772
--- /dev/null
@@ -0,0 +1,856 @@
+/*
+ * tclXfilecmds.c
+ *
+ * Extended Tcl pipe, copyfile and fstat commands.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXfilecmds.c,v 2.0 1992/10/16 04:50:41 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+/*
+ * Prototypes of internal functions.
+ */
+static char *
+GetFileType _ANSI_ARGS_((struct stat  *statBufPtr));
+
+static void
+ReturnStatList _ANSI_ARGS_((Tcl_Interp   *interp,
+                            OpenFile     *filePtr,
+                            struct stat  *statBufPtr));
+
+static int
+ReturnStatArray _ANSI_ARGS_((Tcl_Interp   *interp,
+                             OpenFile     *filePtr,
+                             struct stat  *statBufPtr,
+                             char         *arrayName));
+
+static int
+ReturnStatItem _ANSI_ARGS_((Tcl_Interp   *interp,
+                            OpenFile     *filePtr,
+                            struct stat  *statBufPtr,
+                            char         *itemName));
+
+static int
+ParseLockUnlockArgs _ANSI_ARGS_((Tcl_Interp    *interp,
+                                 int            argc,
+                                 char         **argv,
+                                 int            argIdx,
+                                 OpenFile     **filePtrPtr,
+                                 struct flock  *lockInfoPtr));
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_PipeCmd --
+ *     Implements the pipe TCL command:
+ *         pipe [handle_var_r handle_var_w]
+ *
+ * Results:
+ *      Standard TCL result.
+ *
+ * Side effects:
+ *      Locates and creates entries in the handles table
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_PipeCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    Interp    *iPtr = (Interp *) interp;
+    int        fileIds [2];
+    char       fHandle [12];
+
+    if (!((argc == 1) || (argc == 3))) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv[0], 
+                          " [handle_var_r handle_var_w]", (char*) NULL);
+        return TCL_ERROR;
+    }
+
+    if (pipe (fileIds) < 0) {
+        interp->result = Tcl_UnixError (interp);
+        return TCL_ERROR;
+    }
+
+    if (Tcl_SetupFileEntry (interp, fileIds [0], TRUE,  FALSE) != TCL_OK)
+        goto errorExit;
+    if (Tcl_SetupFileEntry (interp, fileIds [1], FALSE, TRUE) != TCL_OK)
+        goto errorExit;
+
+    if (argc == 1)      
+        sprintf (interp->result, "file%d file%d", fileIds [0], fileIds [1]);
+    else {
+        sprintf (fHandle, "file%d", fileIds [0]);
+        if (Tcl_SetVar (interp, argv[1], fHandle, TCL_LEAVE_ERR_MSG) == NULL)
+            goto errorExit;
+
+        sprintf (fHandle, "file%d", fileIds [1]);
+        if (Tcl_SetVar (interp, argv[2], fHandle, TCL_LEAVE_ERR_MSG) == NULL)
+            goto errorExit;
+    }
+        
+    return TCL_OK;
+
+errorExit:
+    close (fileIds [0]);
+    close (fileIds [1]);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CopyfileCmd --
+ *     Implements the copyfile TCL command:
+ *         copyfile handle1 handle2 [lines]
+ *
+ * Results:
+ *      Nothing if it worked, else an error.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_CopyfileCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    OpenFile  *fromFilePtr, *toFilePtr;
+    char       transferBuffer [2048];
+    int        bytesRead;
+
+    if (argc != 3) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " fromfilehandle tofilehandle", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (TclGetOpenFile (interp, argv[1], &fromFilePtr) != TCL_OK)
+       return TCL_ERROR;
+    if (TclGetOpenFile (interp, argv[2], &toFilePtr) != TCL_OK)
+       return TCL_ERROR;
+
+    if (!fromFilePtr->readable) {
+        interp->result = "Source file is not open for read access";
+       return TCL_ERROR;
+    }
+    if (!toFilePtr->writable) {
+        interp->result = "Target file is not open for write access";
+       return TCL_ERROR;
+    }
+
+    while (TRUE) {
+        bytesRead = fread (transferBuffer, sizeof (char), 
+                           sizeof (transferBuffer), fromFilePtr->f);
+        if (bytesRead <= 0) {
+            if (feof (fromFilePtr->f))
+                break;
+            else
+                goto unixError;
+        }
+        if (fwrite (transferBuffer, sizeof (char), bytesRead, toFilePtr->f) != 
+                    bytesRead)
+            goto unixError;
+    }
+
+    return TCL_OK;
+
+unixError:
+    interp->result = Tcl_UnixError (interp);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * GetFileType --
+ *
+ *   Looks at stat mode and returns a text string indicating what type of
+ * file it is.
+ *
+ * Parameters:
+ *   o statBufPtr (I) - Pointer to a buffer initialized by stat or fstat.
+ * Returns:
+ *   A pointer static text string representing the type of the file.
+ *-----------------------------------------------------------------------------
+ */
+static char *
+GetFileType (statBufPtr)
+    struct stat  *statBufPtr;
+{
+    char *typeStr;
+
+    /*
+     * Get a string representing the type of the file.
+     */
+    if (S_ISREG (statBufPtr->st_mode)) {
+        typeStr = "file";
+    } else if (S_ISDIR (statBufPtr->st_mode)) {
+        typeStr = "directory";
+    } else if (S_ISCHR (statBufPtr->st_mode)) {
+        typeStr = "characterSpecial";
+    } else if (S_ISBLK (statBufPtr->st_mode)) {
+        typeStr = "blockSpecial";
+    } else if (S_ISFIFO (statBufPtr->st_mode)) {
+        typeStr = "fifo";
+    } else if (S_ISLNK (statBufPtr->st_mode)) {
+        typeStr = "link";
+    } else if (S_ISSOCK (statBufPtr->st_mode)) {
+        typeStr = "socket";
+    } else {
+        typeStr = "unknown";
+    }
+
+    return typeStr;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ReturnStatList --
+ *
+ *   Return file stat infomation as a keyed list.
+ *
+ * Parameters:
+ *   o interp (I) - The list is returned in result.
+ *   o filePtr (I) - Pointer to the Tcl open file structure.
+ *   o statBufPtr (I) - Pointer to a buffer initialized by stat or fstat.
+ *-----------------------------------------------------------------------------
+ */
+static void
+ReturnStatList (interp, filePtr, statBufPtr)
+    Tcl_Interp   *interp;
+    OpenFile     *filePtr;
+    struct stat  *statBufPtr;
+{
+    char statList [200];
+
+    sprintf (statList, 
+             "{atime %d} {ctime %d} {dev %d} {gid %d} {ino %d} {mode %d} ",
+              statBufPtr->st_atime, statBufPtr->st_ctime, statBufPtr->st_dev,
+              statBufPtr->st_gid,   statBufPtr->st_ino,   statBufPtr->st_mode);
+    Tcl_AppendResult (interp, statList, (char *) NULL);
+
+    sprintf (statList, 
+             "{mtime %d} {nlink %d} {size %d} {uid %d} {tty %d} {type %s}",
+             statBufPtr->st_mtime,  statBufPtr->st_nlink, statBufPtr->st_size,
+             statBufPtr->st_uid,    isatty (fileno (filePtr->f)),
+             GetFileType (statBufPtr));
+    Tcl_AppendResult (interp, statList, (char *) NULL);
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ReturnStatArray --
+ *
+ *   Return file stat infomation in an array.
+ *
+ * Parameters:
+ *   o interp (I) - Current interpreter, error return in result.
+ *   o filePtr (I) - Pointer to the Tcl open file structure.
+ *   o statBufPtr (I) - Pointer to a buffer initialized by stat or fstat.
+ *   o arrayName (I) - The name of the array to return the info in.
+ * Returns:
+ *   TCL_OK or TCL_ERROR.
+ *-----------------------------------------------------------------------------
+ */
+static int
+ReturnStatArray (interp, filePtr, statBufPtr, arrayName)
+    Tcl_Interp   *interp;
+    OpenFile     *filePtr;
+    struct stat  *statBufPtr;
+    char         *arrayName;
+{
+    char numBuf [30];
+
+    sprintf (numBuf, "%d", statBufPtr->st_dev);
+    if  (Tcl_SetVar2 (interp, arrayName, "dev", numBuf, 
+                      TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    sprintf (numBuf, "%d", statBufPtr->st_ino);
+    if  (Tcl_SetVar2 (interp, arrayName, "ino", numBuf,
+                         TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    sprintf (numBuf, "%d", statBufPtr->st_mode);
+    if  (Tcl_SetVar2 (interp, arrayName, "mode", numBuf, 
+                      TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    sprintf (numBuf, "%d", statBufPtr->st_nlink);
+    if  (Tcl_SetVar2 (interp, arrayName, "nlink", numBuf,
+                      TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    sprintf (numBuf, "%d", statBufPtr->st_uid);
+    if  (Tcl_SetVar2 (interp, arrayName, "uid", numBuf,
+                      TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    sprintf (numBuf, "%d", statBufPtr->st_gid);
+    if  (Tcl_SetVar2 (interp, arrayName, "gid", numBuf,
+                      TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    sprintf (numBuf, "%d", statBufPtr->st_size);
+    if  (Tcl_SetVar2 (interp, arrayName, "size", numBuf,
+                      TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    sprintf (numBuf, "%d", statBufPtr->st_atime);
+    if  (Tcl_SetVar2 (interp, arrayName, "atime", numBuf,
+                      TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    sprintf (numBuf, "%d", statBufPtr->st_mtime);
+    if  (Tcl_SetVar2 (interp, arrayName, "mtime", numBuf,
+                      TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    sprintf (numBuf, "%d", statBufPtr->st_ctime);
+    if  (Tcl_SetVar2 (interp, arrayName, "ctime", numBuf,
+                      TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    if (Tcl_SetVar2 (interp, arrayName, "tty", 
+                     isatty (fileno (filePtr->f)) ? "1" : "0",
+                     TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    if (Tcl_SetVar2 (interp, arrayName, "type", GetFileType (statBufPtr),
+                     TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    return TCL_OK;
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ReturnStatItem --
+ *
+ *   Return a single file status item.
+ *
+ * Parameters:
+ *   o interp (I) - Item or error returned in result.
+ *   o filePtr (I) - Pointer to the Tcl open file structure.
+ *   o statBufPtr (I) - Pointer to a buffer initialized by stat or fstat.
+ *   o itemName (I) - The name of the desired item.
+ * Returns:
+ *   TCL_OK or TCL_ERROR.
+ *-----------------------------------------------------------------------------
+ */
+static int
+ReturnStatItem (interp, filePtr, statBufPtr, itemName)
+    Tcl_Interp   *interp;
+    OpenFile     *filePtr;
+    struct stat  *statBufPtr;
+    char         *itemName;
+{
+    if (STREQU (itemName, "dev"))
+        sprintf (interp->result, "%d", statBufPtr->st_dev);
+    else if (STREQU (itemName, "ino"))
+        sprintf (interp->result, "%d", statBufPtr->st_ino);
+    else if (STREQU (itemName, "mode"))
+        sprintf (interp->result, "%d", statBufPtr->st_mode);
+    else if (STREQU (itemName, "nlink"))
+        sprintf (interp->result, "%d", statBufPtr->st_nlink);
+    else if (STREQU (itemName, "uid"))
+        sprintf (interp->result, "%d", statBufPtr->st_uid);
+    else if (STREQU (itemName, "gid"))
+        sprintf (interp->result, "%d", statBufPtr->st_gid);
+    else if (STREQU (itemName, "size"))
+        sprintf (interp->result, "%d", statBufPtr->st_size);
+    else if (STREQU (itemName, "atime"))
+        sprintf (interp->result, "%d", statBufPtr->st_atime);
+    else if (STREQU (itemName, "mtime"))
+        sprintf (interp->result, "%d", statBufPtr->st_mtime);
+    else if (STREQU (itemName, "ctime"))
+        sprintf (interp->result, "%d", statBufPtr->st_ctime);
+    else if (STREQU (itemName, "type"))
+        interp->result = GetFileType (statBufPtr);
+    else if (STREQU (itemName, "tty"))
+        interp->result = isatty (fileno (filePtr->f)) ? "1" : "0";
+    else {
+        Tcl_AppendResult (interp, "Got \"", itemName, "\", expected one of ",
+                          "\"atime\", \"ctime\", \"dev\", \"gid\", \"ino\", ",
+                          "\"mode\", \"mtime\", \"nlink\", \"size\", ",
+                          "\"tty\", \"type\", \"uid\"", (char *) NULL);
+
+        return TCL_ERROR;
+    }
+
+    return TCL_OK;
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_FstatCmd --
+ *     Implements the fstat TCL command:
+ *         fstat handle [item]|[stat arrayvar]
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_FstatCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    OpenFile    *filePtr;
+    struct stat  statBuf;
+
+    if ((argc < 2) || (argc > 4)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " handle [item]|[stat arrayVar]", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (TclGetOpenFile (interp, argv[1], &filePtr) != TCL_OK)
+       return TCL_ERROR;
+    
+    if (fstat (fileno (filePtr->f), &statBuf)) {
+        interp->result = Tcl_UnixError (interp);
+        return TCL_ERROR;
+    }
+
+    /*
+     * Return data in the requested format.
+     */
+    if (argc == 4) {
+        if (!STREQU (argv [2], "stat")) {
+            Tcl_AppendResult (interp, "expected item name of \"stat\" when ",
+                              "using array name", (char *) NULL);
+            return TCL_ERROR;
+        }
+        return ReturnStatArray (interp, filePtr, &statBuf, argv [3]);
+    }
+    if (argc == 3)
+        return ReturnStatItem (interp, filePtr, &statBuf, argv [2]);
+
+    ReturnStatList (interp, filePtr, &statBuf);
+    return TCL_OK;
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_LgetsCmd --
+ *
+ * Implements the `lgets' Tcl command:
+ *    lgets fileId [varName]
+ *
+ * Results:
+ *      A standard Tcl result.
+ *
+ * Side effects:
+ *      See the user documentation.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_LgetsCmd (notUsed, interp, argc, argv)
+    ClientData   notUsed;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    dynamicBuf_t  dynBuf;
+    char          prevChar;
+    int           bracesDepth, inQuotes, inChar;
+    OpenFile     *filePtr;
+
+    if ((argc != 2) && (argc != 3)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv[0],
+                          " fileId [varName]", (char *) NULL);
+        return TCL_ERROR;
+    }
+    if (TclGetOpenFile(interp, argv[1], &filePtr) != TCL_OK) {
+        return TCL_ERROR;
+    }
+    if (!filePtr->readable) {
+        Tcl_AppendResult (interp, "\"", argv[1],
+                          "\" wasn't opened for reading", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    Tcl_DynBufInit (&dynBuf);
+
+    prevChar = '\0';
+    bracesDepth = 0;
+    inQuotes = FALSE;
+
+    /*
+     * Read in characters, keeping trace of if we are in the middle of a {}
+     * or "" part of the list.
+     */
+
+    while (TRUE) {
+        if (dynBuf.len + 1 == dynBuf.size)
+            Tcl_ExpandDynBuf (&dynBuf, 0);
+        inChar = getc (filePtr->f);
+        if (inChar == EOF) {
+            if (ferror (filePtr->f))
+                goto readError;
+            break;
+        }
+        if (prevChar != '\\') {
+            switch (inChar) {
+                case '{':
+                    bracesDepth++;
+                    break;
+                case '}':
+                    if (bracesDepth == 0)
+                        break;
+                    bracesDepth--;
+                    break;
+                case '"':
+                    if (bracesDepth == 0)
+                        inQuotes = !inQuotes;
+                    break;
+            }
+        }
+        prevChar = inChar;
+        if ((inChar == '\n') && (bracesDepth == 0) && !inQuotes)
+            break;
+        dynBuf.ptr [dynBuf.len++] = inChar;
+    }
+
+    dynBuf.ptr [dynBuf.len] = '\0';
+
+    if ((bracesDepth != 0) || inQuotes) {
+        Tcl_AppendResult (interp, "miss-matched ",
+                         (bracesDepth != 0) ? "braces" : "quote",
+                         " in inputed list: ", dynBuf.ptr, (char *) NULL);
+        goto errorExit;
+    }
+
+    if (argc == 2) {
+        Tcl_DynBufReturn (interp, &dynBuf);
+    } else {
+        if (Tcl_SetVar (interp, argv[2], dynBuf.ptr, 
+                        TCL_LEAVE_ERR_MSG) == NULL)
+            goto errorExit;
+        if (feof (filePtr->f) && (dynBuf.len == 0))
+            interp->result = "-1";
+        else
+            sprintf (interp->result, "%d", dynBuf.len);
+        Tcl_DynBufFree (&dynBuf);
+    }
+    return TCL_OK;
+
+readError:
+    Tcl_ResetResult (interp);
+    interp->result = Tcl_UnixError (interp);
+    clearerr (filePtr->f);
+    goto errorExit;
+
+errorExit:
+    Tcl_DynBufFree (&dynBuf);
+    return TCL_ERROR;
+
+}
+
+#ifndef TCL_NO_FILE_LOCKING
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ParseLockUnlockArgs --
+ *
+ * Parse the positional arguments common to both the flock and funlock
+ * commands:
+ *   ... handle [start] [length] [origin]
+ *
+ * Parameters:
+ *   o interp (I) - Pointer to the interpreter, errors returned in result.
+ *   o argc (I) - Count of arguments supplied to the comment.
+ *   o argv (I) - Commant argument vector.
+ *   o argIdx (I) - Index of the first common agument to parse.
+ *   o filePtrPtr (O) - Pointer to the open file structure returned here.
+ *   o lockInfoPtr (O) - Fcntl info structure, start, length and whence
+ *     are initialized by this routine.
+ * Returns:
+ *   TCL_OK if all is OK,  TCL_ERROR and an error message is result.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+ParseLockUnlockArgs (interp, argc, argv, argIdx, filePtrPtr, lockInfoPtr)
+    Tcl_Interp    *interp;
+    int            argc;
+    char         **argv;
+    int            argIdx;
+    OpenFile     **filePtrPtr;
+    struct flock  *lockInfoPtr;
+{
+
+    lockInfoPtr->l_start  = 0;
+    lockInfoPtr->l_len    = 0;
+    lockInfoPtr->l_whence = 0;
+
+    if (TclGetOpenFile (interp, argv [argIdx], filePtrPtr) != TCL_OK)
+       return TCL_ERROR;
+    argIdx++;
+
+    if ((argIdx < argc) && (argv [argIdx][0] != '\0')) {
+        if (Tcl_GetLong (interp, argv [argIdx],
+                         &lockInfoPtr->l_start) != TCL_OK)
+            return TCL_ERROR;
+    }
+    argIdx++;
+
+    if ((argIdx < argc) && (argv [argIdx][0] != '\0')) {
+        if (Tcl_GetLong (interp, argv [argIdx], &lockInfoPtr->l_len) != TCL_OK)
+            return TCL_ERROR;
+    }
+    argIdx++;
+
+    if (argIdx < argc) {
+        if (STREQU (argv [argIdx], "start"))
+            lockInfoPtr->l_whence = 0;
+        else if (STREQU (argv [argIdx], "current"))
+            lockInfoPtr->l_whence = 1;
+        else if (STREQU (argv [argIdx], "end"))
+            lockInfoPtr->l_whence = 2;
+        else
+            goto badOrgin;
+    }
+
+    return TCL_OK;
+
+  badOrgin:
+    Tcl_AppendResult(interp, "bad origin \"", argv [argIdx],
+                     "\": should be \"start\", \"current\", or \"end\"",
+                     (char *) NULL);
+    return TCL_ERROR;
+   
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_FlockCmd --
+ *
+ * Implements the `flock' Tcl command:
+ *    flock [-read|-write] [-nowait] handle [start] [length] [origin]
+ *
+ * Results:
+ *      A standard Tcl result.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_FlockCmd (notUsed, interp, argc, argv)
+    ClientData   notUsed;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    int           argIdx, stat;
+    int           readLock = FALSE, writeLock = FALSE, noWaitLock = FALSE;
+    OpenFile     *filePtr;
+    struct flock  lockInfo;
+
+    if (argc < 2)
+        goto invalidArgs;
+
+    /*
+     * Parse off the options.
+     */
+    
+    for (argIdx = 1; (argIdx < argc) && (argv [argIdx][0] == '-'); argIdx++) {
+        if (STREQU (argv [argIdx], "-read")) {
+            readLock = TRUE;
+            continue;
+        }
+        if (STREQU (argv [argIdx], "-write")) {
+            writeLock = TRUE;
+            continue;
+        }
+        if (STREQU (argv [argIdx], "-nowait")) {
+            noWaitLock = TRUE;
+            continue;
+        }
+        goto invalidOption;
+    }
+
+    if (readLock && writeLock)
+        goto bothReadAndWrite;
+    if (!(readLock || writeLock))
+        writeLock = TRUE;
+
+    /*
+     * Make sure there are enough arguments left and then parse the 
+     * positional ones.
+     */
+    if ((argIdx > argc - 1) || (argIdx < argc - 4))
+        goto invalidArgs;
+
+    if (ParseLockUnlockArgs (interp, argc, argv, argIdx, &filePtr,
+                             &lockInfo) != TCL_OK)
+        return TCL_ERROR;
+
+    if (readLock && !filePtr->readable)
+        goto notReadable;
+    if (writeLock && !filePtr->writable)
+        goto notWritable;
+
+    lockInfo.l_type = writeLock ? F_WRLCK : F_RDLCK;
+    
+    stat = fcntl (fileno (filePtr->f), noWaitLock ? F_SETLK : F_SETLKW, 
+                  &lockInfo);
+    if ((stat < 0) && (errno != EACCES)) {
+        interp->result = Tcl_UnixError (interp);
+        return TCL_ERROR;
+    }
+    
+    if (noWaitLock)
+        interp->result = (stat < 0) ? "0" : "1";
+
+    return TCL_OK;
+
+    /*
+     * Code to return error messages.
+     */
+
+  invalidArgs:
+    Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " [-read|-write] ",
+                      "[-nowait] handle [start] [length] [origin]",
+                      (char *) NULL);
+    return TCL_ERROR;
+
+    /*
+     * Invalid option found at argv [argIdx].
+     */
+  invalidOption:
+    Tcl_AppendResult (interp, "invalid option \"", argv [argIdx],
+                      "\" expected one of \"-read\", \"-write\", or ",
+                      "\"-nowait\"", (char *) NULL);
+    return TCL_ERROR;
+
+  bothReadAndWrite:
+    interp->result = "can not specify both \"-read\" and \"-write\"";
+    return TCL_ERROR;
+
+  notReadable:
+    interp->result = "file not open for reading";
+    return TCL_ERROR;
+
+  notWritable:
+    interp->result = "file not open for writing";
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_FunlockCmd --
+ *
+ * Implements the `funlock' Tcl command:
+ *    funlock handle [start] [length] [origin]
+ *
+ * Results:
+ *      A standard Tcl result.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_FunlockCmd (notUsed, interp, argc, argv)
+    ClientData   notUsed;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    OpenFile     *filePtr;
+    struct flock  lockInfo;
+
+    if ((argc < 2) || (argc > 5))
+        goto invalidArgs;
+
+    if (ParseLockUnlockArgs (interp, argc, argv, 1, &filePtr,
+                             &lockInfo) != TCL_OK)
+        return TCL_ERROR;
+
+    lockInfo.l_type = F_UNLCK;
+    
+    if (fcntl (fileno(filePtr->f), F_SETLK, &lockInfo) < 0) {
+        interp->result = Tcl_UnixError (interp);
+        return TCL_ERROR;
+    }
+    
+    return TCL_OK;
+
+  invalidArgs:
+    Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                      " handle [start] [length] [origin]", (char *) NULL);
+    return TCL_ERROR;
+
+}
+#else
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_FlockCmd --
+ *
+ * Version of the command that always returns an error on systems that
+ * don't have file locking.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_FlockCmd (notUsed, interp, argc, argv)
+    ClientData   notUsed;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    interp->result = "File locking is not available on this system";
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_FunlockCmd --
+ *
+ * Version of the command that always returns an error on systems that
+ * don't have file locking/
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_FunlockCmd (notUsed, interp, argc, argv)
+    ClientData   notUsed;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    return Tcl_FlockCmd (notUsed, interp, argc, argv);
+}
+#endif
diff --git a/src/tclx/src/tclxfctl.c b/src/tclx/src/tclxfctl.c
new file mode 100644 (file)
index 0000000..0cbcb15
--- /dev/null
@@ -0,0 +1,352 @@
+/*
+ * tclXfcntl.c
+ *
+ * Extended Tcl fcntl command.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXfcntl.c,v 2.0 1992/10/16 04:50:38 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+/*
+ * Macro to enable line buffering mode on a file.  Macros assure that the
+ * resulting expression returns zero if the function call does not return
+ * a value.
+ */
+#ifdef TCL_HAVE_SETLINEBUF
+#   define SET_LINE_BUF(fp)  (setlinebuf (fp),0)
+#else
+#   define SET_LINE_BUF(fp)  setvbuf (fp, NULL, _IOLBF, BUFSIZ)
+#endif
+
+/*
+ * If we don't have O_NONBLOCK, use O_NDELAY.
+ */
+#ifndef O_NONBLOCK
+#   define O_NONBLOCK O_NDELAY
+#endif
+
+/*
+ * Attributes used by fcntl command and the maximum length of any attribute
+ * name.
+ */
+#define   ATTR_CLOEXEC  1
+#define   ATTR_NOBUF    2
+#define   ATTR_LINEBUF  4
+#define   MAX_ATTR_NAME_LEN  20
+
+/*
+ * Prototypes of internal functions.
+ */
+static int
+XlateFcntlAttr  _ANSI_ARGS_((Tcl_Interp *interp,
+                             char       *attrName,
+                             int        *fcntlAttrPtr,
+                             int        *otherAttrPtr));
+
+static int
+GetFcntlAttr _ANSI_ARGS_((Tcl_Interp *interp,
+                          OpenFile   *filePtr,
+                          char       *attrName));
+
+static int
+SetFcntlAttr _ANSI_ARGS_((Tcl_Interp *interp,
+                          OpenFile   *filePtr,
+                          char       *attrName,
+                          char       *valueStr));
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * XlateFcntlAttr --
+ *    Translate an fcntl attribute.
+ *
+ * Parameters:
+ *   o interp (I) - Tcl interpreter.
+ *   o attrName (I) - The attrbute name to translate, maybe upper or lower
+ *     case.
+ *   o fcntlAttrPtr (O) - If the attr specified is one of the standard
+ *     fcntl attrs, it is returned here, otherwise zero is returned.
+ *   o otherAttrPtr (O) - If the attr specified is one of the additional
+ *     attrs supported by the Tcl command, it is returned here, otherwise
+ *     zero is returned.
+ * Result:
+ *   Returns TCL_OK if all is well, TCL_ERROR if there is an error.
+ *-----------------------------------------------------------------------------
+ */
+static int
+XlateFcntlAttr (interp, attrName, fcntlAttrPtr, otherAttrPtr)
+    Tcl_Interp *interp;
+    char       *attrName;
+    int        *fcntlAttrPtr;
+    int        *otherAttrPtr;
+{
+    char attrNameUp [MAX_ATTR_NAME_LEN];
+
+    *fcntlAttrPtr = 0;
+    *otherAttrPtr = 0;
+
+    if (strlen (attrName) >= MAX_ATTR_NAME_LEN)
+        goto invalidAttrName;
+
+    Tcl_UpShift (attrNameUp, attrName);
+
+    if (STREQU (attrNameUp, "RDONLY")) {
+        *fcntlAttrPtr = O_RDONLY;
+        return TCL_OK;
+    }
+    if (STREQU (attrNameUp, "WRONLY")) {
+        *fcntlAttrPtr = O_WRONLY;
+        return TCL_OK;
+    }
+    if (STREQU (attrNameUp, "RDWR")) {
+        *fcntlAttrPtr = O_RDWR;
+        return TCL_OK;
+    }
+    if (STREQU (attrNameUp, "READ")) {
+        *fcntlAttrPtr = O_RDONLY | O_RDWR;
+        return TCL_OK;
+    }
+    if (STREQU (attrNameUp, "WRITE")) {
+        *fcntlAttrPtr = O_WRONLY | O_RDWR;
+        return TCL_OK;
+    }
+    if (STREQU (attrNameUp, "NONBLOCK")) {
+        *fcntlAttrPtr = O_NONBLOCK;
+        return TCL_OK;
+    }
+    if (STREQU (attrNameUp, "APPEND")) {
+        *fcntlAttrPtr = O_APPEND;
+        return TCL_OK;
+    }
+    if (STREQU (attrNameUp, "CLOEXEC")) {
+        *otherAttrPtr = ATTR_CLOEXEC;
+        return TCL_OK;
+    }
+    if (STREQU (attrNameUp, "NOBUF")) {
+        *otherAttrPtr = ATTR_NOBUF;
+        return TCL_OK;
+    }
+    if (STREQU (attrNameUp, "LINEBUF")) {
+        *otherAttrPtr = ATTR_LINEBUF;
+        return TCL_OK;
+    }
+
+    /*
+     * Error return code.
+     */
+  invalidAttrName:
+    Tcl_AppendResult (interp, "unknown attribute name \"", attrName,
+                      "\", expected one of APPEND, CLOEXEC, LINEBUF, ",
+                      "NONBLOCK, NOBUF, READ, RDONLY, RDWR, WRITE, WRONLY",
+                      (char *) NULL);
+    return TCL_ERROR;
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * GetFcntlAttr --
+ *    Return the value of a specified fcntl attribute.
+ *
+ * Parameters:
+ *   o interp (I) - Tcl interpreter, value is returned in the result
+ *   o filePtr (I) - Pointer to the file descriptor.
+ *   o attrName (I) - The attrbute name to translate, maybe upper or lower
+ *     case.
+ * Result:
+ *   Returns TCL_OK if all is well, TCL_ERROR if fcntl returns an error.
+ *-----------------------------------------------------------------------------
+ */
+static int
+GetFcntlAttr (interp, filePtr, attrName)
+    Tcl_Interp *interp;
+    OpenFile   *filePtr;
+    char       *attrName;
+{
+    int fcntlAttr, otherAttr, current;
+
+    if (XlateFcntlAttr (interp, attrName, &fcntlAttr, &otherAttr) != TCL_OK)
+        return TCL_ERROR;
+
+    if (fcntlAttr != 0) {
+        current = fcntl (fileno (filePtr->f), F_GETFL, 0);
+        if (current == -1)
+            goto unixError;
+        interp->result = (current & fcntlAttr) ? "1" : "0";
+        return TCL_OK;
+    }
+    
+    if (otherAttr & ATTR_CLOEXEC) {
+        current = fcntl (fileno (filePtr->f), F_GETFD, 0);
+        if (current == -1)
+            goto unixError;
+        interp->result = (current & 1) ? "1" : "0";
+        return TCL_OK;
+    }
+
+    /*
+     * Poke the stdio FILE structure to determine the buffering status.
+     */
+
+#ifndef IS_LINUX
+
+#ifdef _IONBF
+    if (otherAttr & ATTR_NOBUF) {
+        interp->result = (filePtr->f->_flag & _IONBF) ? "1" : "0";
+        return TCL_OK;
+    }
+    if (otherAttr & ATTR_LINEBUF) {
+        interp->result = (filePtr->f->_flag & _IOLBF) ? "1" : "0";
+        return TCL_OK;
+    }
+#else
+    if (otherAttr & ATTR_NOBUF) {
+        interp->result = (filePtr->f->_flags & _SNBF) ? "1" : "0";
+        return TCL_OK;
+    }
+    if (otherAttr & ATTR_LINEBUF) {
+        interp->result = (filePtr->f->_flags & _SLBF) ? "1" : "0";
+        return TCL_OK;
+    }
+#endif
+
+#endif
+
+unixError:
+    interp->result = Tcl_UnixError (interp);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * SetFcntlAttr --
+ *    Set the specified fcntl attr to the given value.
+ *
+ * Parameters:
+ *   o interp (I) - Tcl interpreter, value is returned in the result
+ *   o filePtr (I) - Pointer to the file descriptor.
+ *   o attrName (I) - The attrbute name to translate, maybe upper or lower
+ *     case.
+ *   o valueStr (I) - The string value to set the attribiute to.
+ *
+ * Result:
+ *   Returns TCL_OK if all is well, TCL_ERROR if there is an error.
+ *-----------------------------------------------------------------------------
+ */
+static int
+SetFcntlAttr (interp, filePtr, attrName, valueStr)
+    Tcl_Interp *interp;
+    OpenFile   *filePtr;
+    char       *attrName;
+    char       *valueStr;
+{
+
+    int fcntlAttr, otherAttr, current, setValue;
+    if (Tcl_GetBoolean (interp, valueStr, &setValue) != TCL_OK)
+        return TCL_ERROR;
+
+    if (XlateFcntlAttr (interp, attrName, &fcntlAttr, &otherAttr) != TCL_OK)
+        return TCL_ERROR;
+
+    /*
+     * Validate that this the attribute may be set (or cleared).
+     */
+
+    if (fcntlAttr & (O_RDONLY | O_WRONLY | O_RDWR)) {
+        Tcl_AppendResult (interp, "Attribute \"", attrName, "\" may not be ",
+                          "altered after open", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if ((otherAttr & (ATTR_NOBUF | ATTR_LINEBUF)) && !setValue) {
+        Tcl_AppendResult (interp, "Attribute \"", attrName, "\" may not be ",
+                          "cleared once set", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (otherAttr == ATTR_CLOEXEC) {
+        if (fcntl (fileno (filePtr->f), F_SETFD, setValue) == -1)
+            goto unixError;
+        return TCL_OK;
+    }
+
+    if (otherAttr == ATTR_NOBUF) {
+        setbuf (filePtr->f, NULL);
+        return TCL_OK;
+    }
+
+    if (otherAttr == ATTR_LINEBUF) {
+        if (SET_LINE_BUF (filePtr->f) != 0)
+            goto unixError;
+        return TCL_OK;
+    }
+
+    /*
+     * Handle standard fcntl attrs.
+     */
+       
+    current = fcntl (fileno (filePtr->f), F_GETFL, 0);
+    if (current == -1)
+        goto unixError;
+    current &= ~fcntlAttr;
+    if (setValue)
+        current |= fcntlAttr;
+    if (fcntl (fileno (filePtr->f), F_SETFL, current) == -1)
+        goto unixError;
+
+    return TCL_OK;
+
+  unixError:
+    interp->result = Tcl_UnixError (interp);
+    return TCL_ERROR;
+   
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_FcntlCmd --
+ *     Implements the fcntl TCL command:
+ *         fcntl handle [attribute value]
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_FcntlCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    OpenFile    *filePtr;
+
+    if ((argc < 3) || (argc > 4)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " handle attribute [value]", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (TclGetOpenFile (interp, argv[1], &filePtr) != TCL_OK)
+       return TCL_ERROR;
+    if (argc == 3) {    
+        if (GetFcntlAttr (interp, filePtr, argv [2]) != TCL_OK)
+            return TCL_ERROR;
+    } else {
+        if (SetFcntlAttr (interp, filePtr, argv [2], argv [3]) != TCL_OK)
+            return TCL_ERROR;
+    }
+    return TCL_OK;
+}
diff --git a/src/tclx/src/tclxfmat.c b/src/tclx/src/tclxfmat.c
new file mode 100644 (file)
index 0000000..19d42c3
--- /dev/null
@@ -0,0 +1,693 @@
+/* 
+ * tclXfmath.c --
+ *
+ *      Contains the TCL trig and floating point math functions.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXfmath.c,v 2.5 1992/11/09 07:58:13 markd Exp $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+#include <math.h>
+
+/*
+ * Flag used to indicate if a floating point math routine is currently being
+ * executed.  Used to determine if a matherr belongs to Tcl.
+ */
+static int G_inTclFPMath = FALSE;
+
+/*
+ * Flag indicating if a floating point math error occured during the execution
+ * of a library routine called by a Tcl command.  Will not be set by the trap
+ * handler if the error did not occur while the `G_inTclFPMath' flag was
+ * set.  If the error did occur the error type and the name of the function
+ * that got the error are save here.
+ */
+static int   G_gotTclFPMathErr = FALSE;
+static int   G_errorType;
+
+/*
+ * Prototypes of internal functions.
+ */
+#ifdef TCL_IEEE_FP_MATH
+static int
+ReturnIEEEMathError _ANSI_ARGS_((Tcl_Interp *interp,
+                                 double      dbResult));
+#else
+static int
+ReturnFPMathError _ANSI_ARGS_((Tcl_Interp *interp));
+#endif
+
+static int
+Tcl_UnaryFloatFunction _ANSI_ARGS_((Tcl_Interp *interp,
+                                    int         argc,
+                                    char      **argv,
+                                    double (*function)()));
+
+
+#ifdef TCL_IEEE_FP_MATH
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ReturnIEEEMathError --
+ *    Handle return of floating point errors on machines that use IEEE 745-1985
+ * error reporting instead of Unix matherr.  Some machines support both and
+ * on these, either option may be used.
+ *    Various tests are used to determine if a number is one of the special
+ * values.  Not-a-number is tested by comparing the number against itself
+ * (x != x if x is NaN).  Infinity is tested for by comparing against MAXDOUBLE.
+ *
+ * Parameters:
+ *   o interp (I) - Error is returned in result.
+ *   o dbResult (I) - Result of a function call that returned a special value.
+ * Returns:
+ *   Always returns the value TCL_ERROR, so if can be called as the
+ * argument to `return'.
+ *-----------------------------------------------------------------------------
+ */
+static int
+ReturnIEEEMathError (interp, dbResult)
+    Tcl_Interp *interp;
+    double      dbResult;
+{
+    char *errorMsg;
+
+    if (dbResult != dbResult)
+        errorMsg = "domain";
+    else if (dbResult > MAXDOUBLE)
+        errorMsg = "overflow";
+    else if (dbResult < -MAXDOUBLE)
+        errorMsg = "underflow";
+
+    Tcl_AppendResult (interp, "floating point ", errorMsg, " error",
+                      (char *) NULL);
+    return TCL_ERROR;
+}
+#else
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ReturnFPMathError --
+ *    Routine to set an interpreter result to contain a floating point
+ * math error message.  Will clear the `G_gotTclFPMathErr' flag.
+ * This routine always returns the value TCL_ERROR, so if can be called
+ * as the argument to `return'.
+ *
+ * Parameters:
+ *   o interp (I) - Error is returned in result.
+ * Globals:
+ *   o G_gotTclFPMathErr (O) - Flag indicating an error occured, will be 
+ *     cleared.
+ *   o G_errorType (I) - Type of error that occured.
+ * Returns:
+ *   Always returns the value TCL_ERROR, so if can be called as the
+ * argument to `return'.
+ *-----------------------------------------------------------------------------
+ */
+static int
+ReturnFPMathError (interp)
+    Tcl_Interp *interp;
+{
+    char *errorMsg;
+
+    switch (G_errorType) {
+       case DOMAIN: 
+           errorMsg = "domain";
+           break;
+       case SING:
+           errorMsg = "singularity";
+           break;
+       case OVERFLOW:
+           errorMsg = "overflow";
+           break;
+       case UNDERFLOW:
+           errorMsg = "underflow";
+           break;
+       case TLOSS:
+       case PLOSS:
+           errorMsg = "loss of significance";
+           break;
+    }
+    Tcl_AppendResult (interp, "floating point ", errorMsg, " error",
+                      (char *) NULL);
+    G_gotTclFPMathErr = FALSE;  /* Clear the flag. */
+    return TCL_ERROR;
+}
+#endif /* NO_MATH_ERR */
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_MathError --
+ *    Tcl math error handler, should be called by an application `matherr'
+ *    routine to determine if an error was caused by Tcl code or by other
+ *    code in the application.  If the error occured in Tcl code, flags will
+ *    be set so that a standard Tcl interpreter error can be returned.
+ *
+ * Paramenter:
+ *   o functionName (I) - The name of the function that got the error.  From
+ *     the exception structure supplied to matherr.
+ *   o errorType (I) - The type of error that occured.  From the exception 
+ *     structure supplied to matherr.
+ * Results:
+ *      Returns TRUE if the error was in Tcl code, in which case the
+ *   matherr routine calling this function should return non-zero so no
+ *   error message will be generated.  FALSE if the error was not in Tcl
+ *   code, in which case the matherr routine can handle the error in any
+ *   manner it choses.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_MathError (functionName, errorType)
+    char *functionName;
+    int   errorType;
+{
+
+  if (G_inTclFPMath) {
+      G_gotTclFPMathErr = TRUE;
+      G_errorType = errorType;
+      return TRUE;
+  } else
+      return FALSE;
+  
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_UnaryFloatFunction --
+ *     Helper routine that implements Tcl unary floating point
+ *     functions by validating parameters, converting the
+ *     argument, applying the function (the address of which
+ *     is passed as an argument), and converting the result to
+ *     a string and storing it in the result buffer
+ *
+ * Results:
+ *      Returns TCL_OK if number is present, conversion succeeded,
+ *        the function was performed, etc.
+ *      Return TCL_ERROR for any error; an appropriate error message
+ *        is placed in the result string in this case.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+Tcl_UnaryFloatFunction(interp, argc, argv, function)
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+    double    (*function)();
+{
+    double dbVal, dbResult;
+
+    if (argc != 2) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " expr",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (Tcl_ExprDouble (interp, argv [1], &dbVal) != TCL_OK)
+        return TCL_ERROR;
+
+    G_inTclFPMath = TRUE;
+    dbResult = (*function)(dbVal);
+    G_inTclFPMath = FALSE;
+
+#ifdef TCL_IEEE_FP_MATH
+    if ((dbResult != dbResult) ||
+        (dbResult < -MAXDOUBLE) ||
+        (dbResult >  MAXDOUBLE))
+        return ReturnIEEEMathError (interp, dbResult);
+#else
+    if (G_gotTclFPMathErr)
+        return ReturnFPMathError (interp);
+#endif
+
+    Tcl_ReturnDouble (interp, dbResult);
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_AcosCmd --
+ *    Implements the TCL arccosine command:
+ *        acos num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_AcosCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, acos);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_AsinCmd --
+ *    Implements the TCL arcsin command:
+ *        asin num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_AsinCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, asin);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_AtanCmd --
+ *    Implements the TCL arctangent command:
+ *        atan num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_AtanCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, atan);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CosCmd --
+ *    Implements the TCL cosine command:
+ *        cos num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_CosCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, cos);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_SinCmd --
+ *    Implements the TCL sin command:
+ *        sin num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_SinCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, sin);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_TanCmd --
+ *    Implements the TCL tangent command:
+ *        tan num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_TanCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, tan);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CoshCmd --
+ *    Implements the TCL hyperbolic cosine command:
+ *        cosh num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_CoshCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, cosh);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_SinhCmd --
+ *    Implements the TCL hyperbolic sin command:
+ *        sinh num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_SinhCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, sinh);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_TanhCmd --
+ *    Implements the TCL hyperbolic tangent command:
+ *        tanh num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_TanhCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, tanh);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ExpCmd --
+ *    Implements the TCL exponent command:
+ *        exp num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_ExpCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, exp);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_LogCmd --
+ *    Implements the TCL logarithm command:
+ *        log num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_LogCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, log);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_Log10Cmd --
+ *    Implements the TCL base-10 logarithm command:
+ *        log10 num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_Log10Cmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, log10);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_SqrtCmd --
+ *    Implements the TCL square root command:
+ *        sqrt num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_SqrtCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, sqrt);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_FabsCmd --
+ *    Implements the TCL floating point absolute value command:
+ *        fabs num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_FabsCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, fabs);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_FloorCmd --
+ *    Implements the TCL floor command:
+ *        floor num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_FloorCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, floor);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CeilCmd --
+ *    Implements the TCL ceil command:
+ *        ceil num
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_CeilCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    return Tcl_UnaryFloatFunction(interp, argc, argv, ceil);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_FmodCmd --
+ *    Implements the TCL floating modulo command:
+ *        fmod num1 num2
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_FmodCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    double dbVal, dbDivisor, dbResult;
+
+    if (argc != 3) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " expr divisor",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (Tcl_ExprDouble (interp, argv [1], &dbVal) != TCL_OK)
+        return TCL_ERROR;
+
+    if (Tcl_ExprDouble (interp, argv [2], &dbDivisor) != TCL_OK)
+        return TCL_ERROR;
+
+    G_inTclFPMath = TRUE;
+    dbResult = fmod (dbVal, dbDivisor);
+    G_inTclFPMath = FALSE;
+
+#ifdef TCL_IEEE_FP_MATH
+    if ((dbResult != dbResult) ||
+        (dbResult < -MAXDOUBLE) ||
+        (dbResult >  MAXDOUBLE))
+        return ReturnIEEEMathError (interp, dbResult);
+#else
+    if (G_gotTclFPMathErr)
+        return ReturnFPMathError (interp);
+#endif
+
+    Tcl_ReturnDouble (interp, dbResult);
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_PowCmd --
+ *    Implements the TCL power (exponentiation) command:
+ *        pow num1 num2
+ *
+ * Results:
+ *      Returns TCL_OK if number is present and conversion succeeds.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_PowCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    double dbVal, dbExp, dbResult;
+
+    if (argc != 3) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " expr exp",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (Tcl_ExprDouble (interp, argv [1], &dbVal) != TCL_OK)
+        return TCL_ERROR;
+
+    if (Tcl_ExprDouble (interp, argv [2], &dbExp) != TCL_OK)
+        return TCL_ERROR;
+
+    G_inTclFPMath = TRUE;
+    dbResult = pow (dbVal,dbExp);
+    G_inTclFPMath = FALSE;
+
+#ifdef TCL_IEEE_FP_MATH
+    if ((dbResult != dbResult) ||
+        (dbResult < -MAXDOUBLE) ||
+        (dbResult >  MAXDOUBLE))
+        return ReturnIEEEMathError (interp, dbResult);
+#else
+    if (G_gotTclFPMathErr)
+        return ReturnFPMathError (interp);
+#endif
+
+    Tcl_ReturnDouble (interp, dbResult);
+    return TCL_OK;
+}
diff --git a/src/tclx/src/tclxfsca.c b/src/tclx/src/tclxfsca.c
new file mode 100644 (file)
index 0000000..6e2f171
--- /dev/null
@@ -0,0 +1,582 @@
+/*
+ * tclXfilescan.c --
+ *
+ * Tcl file scanning: regular expression matching on lines of a file.  
+ * Implements awk.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXfilescan.c,v 2.0 1992/10/16 04:50:43 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+#include "regexp.h"
+
+/*
+ * A scan context describes a collection of match patterns and commands,
+ * along with a match default command to apply to a file on a scan.
+ */
+#define CONTEXT_A_CASE_INSENSITIVE_FLAG 2
+#define MATCH_CASE_INSENSITIVE_FLAG 4
+
+typedef struct matchDef_t {
+    regexp_t            regExpInfo;
+    char               *command;
+    struct matchDef_t  *nextMatchDefPtr;
+    short               matchflags;
+    } matchDef_t;
+typedef struct matchDef_t *matchDef_pt;
+
+typedef struct scanContext_t {
+    matchDef_pt  matchListHead;
+    matchDef_pt  matchListTail;
+    char        *defaultAction;
+    short        flags;
+    } scanContext_t;
+typedef struct scanContext_t *scanContext_pt;
+
+/*
+ * Global data structure, pointer to by clientData.
+ */
+
+typedef struct {
+    int             useCount;      /* Commands that current share globals */
+    void_pt         tblHdrPtr;     /* Scan context handle table           */
+    char            curName [16];  /* Current context name.               */ 
+    } scanGlob_t;
+typedef scanGlob_t *scanGlob_pt;
+
+/*
+ * Prototypes of internal functions.
+ */
+static int
+CleanUpContext _ANSI_ARGS_((scanGlob_pt    scanGlobPtr,
+                            scanContext_pt contextPtr));
+
+static int
+CreateScanContext _ANSI_ARGS_((Tcl_Interp  *interp,
+                               scanGlob_pt  scanGlobPtr));
+
+static int
+SelectScanContext _ANSI_ARGS_((Tcl_Interp  *interp,
+                               scanGlob_pt  scanGlobPtr,
+                               char        *contextHandle));
+
+static int
+Tcl_Delete_scancontextCmd _ANSI_ARGS_((Tcl_Interp  *interp,
+                                       scanGlob_pt  scanGlobPtr,
+                                       char        *contextHandle));
+
+static int
+SetMatchVar _ANSI_ARGS_((Tcl_Interp *interp,
+                         char       *fileLine,
+                         long        fileOffset,
+                         long        scanLineNum,
+                         char       *fileHandle));
+
+static void
+FileScanCleanUp _ANSI_ARGS_((ClientData clientData));
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * CleanUpContext
+ *     Release all resources allocated to the specified scan context
+ *     entry.  The entry itself is not released.
+ *-----------------------------------------------------------------------------
+ */
+static int
+CleanUpContext (scanGlobPtr, contextPtr)
+    scanGlob_pt    scanGlobPtr;
+    scanContext_pt contextPtr;
+{
+    matchDef_pt  matchPtr, oldMatchPtr;
+
+    for (matchPtr = contextPtr->matchListHead; matchPtr != NULL;) {
+        Tcl_RegExpClean (&matchPtr->regExpInfo);
+        if (matchPtr->command != NULL)
+            ckfree(matchPtr->command);
+        oldMatchPtr = matchPtr;
+        matchPtr = matchPtr->nextMatchDefPtr;
+        ckfree ((char *) oldMatchPtr);
+        }
+    contextPtr->matchListHead = NULL;
+    contextPtr->matchListTail = NULL;
+
+    if (contextPtr->defaultAction != NULL) {
+        ckfree(contextPtr->defaultAction);
+        contextPtr->defaultAction = NULL;
+    }
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * CreateScanContext --
+ *     Create a new scan context, implements the subcommand:
+ *         scancontext create
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+CreateScanContext (interp, scanGlobPtr)
+    Tcl_Interp  *interp;
+    scanGlob_pt  scanGlobPtr;
+{
+    scanContext_pt contextPtr;
+
+    contextPtr = (scanContext_pt)Tcl_HandleAlloc (scanGlobPtr->tblHdrPtr, 
+                                                  scanGlobPtr->curName);
+    contextPtr->flags = 0;
+    contextPtr->matchListHead = NULL;
+    contextPtr->matchListTail = NULL;
+    contextPtr->defaultAction = NULL;
+
+    Tcl_SetResult (interp, scanGlobPtr->curName, TCL_STATIC);
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * DeleteScanContext --
+ *     Deletes the specified scan context, implements the subcommand:
+ *         scancontext delete contexthandle
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+DeleteScanContext (interp, scanGlobPtr, contextHandle)
+    Tcl_Interp  *interp;
+    scanGlob_pt  scanGlobPtr;
+    char        *contextHandle;
+{
+    scanContext_pt contextPtr;
+
+    if ((contextPtr = Tcl_HandleXlate (interp, scanGlobPtr->tblHdrPtr, 
+                                       contextHandle)) == NULL)
+        return TCL_ERROR;
+
+    CleanUpContext (scanGlobPtr, contextPtr);
+    Tcl_HandleFree (scanGlobPtr->tblHdrPtr, contextPtr);
+
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ScancontextCmd --
+ *     Implements the TCL scancontext Tcl command, which has the 
+ *     following forms.
+ *         scancontext create
+ *         scancontext delete
+ *
+ * Results:
+ *    Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+Tcl_ScancontextCmd (clientData, interp, argc, argv)
+    char       *clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    scanGlob_pt  scanGlobPtr = (scanGlob_pt) clientData;
+
+    if (argc < 2) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " option",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+    /*
+     * Create a new scan context.
+     */
+    if (STREQU (argv [1], "create")) {
+        if (argc != 2) {
+            Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " create",
+                              (char *) NULL);
+            return TCL_ERROR;
+        }
+        return CreateScanContext (interp, scanGlobPtr);        
+    }
+    
+    /*
+     * Delete a scan context.
+     */
+    if (STREQU (argv [1], "delete")) {
+        if (argc != 3) {
+            Tcl_AppendResult (interp, tclXWrongArgs, argv [0],
+                              "delete contexthandle", (char *) NULL);
+            return TCL_ERROR;
+        }
+        return DeleteScanContext (interp, scanGlobPtr, argv [2]);
+    }
+    
+    Tcl_AppendResult (interp, "invalid argument, expected one of: ",
+                      "create or delete", (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ScanmatchCmd --
+ *     Implements the TCL command:
+ *         scanmatch [-nocase] contexthandle [regexp] commands
+ *     This uses both Boyer_Moore and regular expressions matching.
+ *
+ * Results:
+ *    Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+Tcl_ScanmatchCmd (clientData, interp, argc, argv)
+    char       *clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    scanGlob_pt     scanGlobPtr = (scanGlob_pt) clientData;
+    scanContext_pt  contextPtr;
+    char           *result;
+    matchDef_pt     newmatch;
+    int             compFlags = REXP_BOTH_ALGORITHMS;
+    int             firstArg = 1;
+
+    if (argc < 3)
+        goto argError;
+    if (STREQU (argv[1], "-nocase")) {
+        compFlags |= REXP_NO_CASE;
+        firstArg = 2;
+    }
+      
+    /*
+     * If firstArg == 2 (-nocase), the both a regular expression and a command
+     * string must be specified, otherwise the regular expression is optional.
+     */
+    if (((firstArg == 2) && (argc != 5)) || ((firstArg == 1) && (argc > 4)))
+        goto argError;
+
+    if ((contextPtr = Tcl_HandleXlate (interp, scanGlobPtr->tblHdrPtr, 
+                                       argv [firstArg])) == NULL)
+        return TCL_ERROR;
+
+    /*
+     * Handle the default case (no regular expression).
+     */
+    if (argc == 3) {
+        if (contextPtr->defaultAction) {
+            Tcl_AppendResult (interp, argv [0], ": default match already ",
+                              "specified in this scan context", (char *) NULL);
+            return TCL_ERROR;
+        }
+        contextPtr->defaultAction = ckalloc (strlen (argv [2]) + 1);
+        strcpy (contextPtr->defaultAction, argv [2]);
+
+        return TCL_OK;
+    }
+
+    /*
+     * Add a regular expression to the context.
+     */
+
+    newmatch = (matchDef_pt) ckalloc(sizeof (matchDef_t));
+    newmatch->matchflags = 0;
+
+    if (compFlags & REXP_NO_CASE) {
+        newmatch->matchflags |= MATCH_CASE_INSENSITIVE_FLAG;
+        contextPtr->flags |= CONTEXT_A_CASE_INSENSITIVE_FLAG;
+    }
+
+    if (Tcl_RegExpCompile (interp, &newmatch->regExpInfo, argv [firstArg + 1], 
+                           compFlags) != TCL_OK) {
+        ckfree ((char *) newmatch);
+        return (TCL_ERROR);
+    }
+
+    newmatch->command = ckalloc (strlen (argv[firstArg + 2]) + 1);
+    strcpy(newmatch->command, argv [firstArg + 2]);
+
+    /*
+     * Link in the new match.
+     */
+    newmatch->nextMatchDefPtr = NULL;
+    if (contextPtr->matchListHead == NULL)
+        contextPtr->matchListHead = newmatch;
+    else
+        contextPtr->matchListTail->nextMatchDefPtr = newmatch;
+    contextPtr->matchListTail = newmatch;
+
+    return TCL_OK;
+
+argError:
+    Tcl_AppendResult (interp, tclXWrongArgs, argv [0],
+                      " [-nocase] contexthandle [regexp] command",
+                      (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * SetMatchVar --
+ *     Sets the TCL array variable matchInfo to contain information 
+ *     about the line that is matched.
+ * Results:
+ *     TCL_OK if all is ok, TCL_ERROR if an error occures setting the
+ *     variables.
+ * Side effects:
+ *     A TCL array variable is created or altered.
+ * 
+ *-----------------------------------------------------------------------------
+ */
+static int
+SetMatchVar (interp, fileLine, fileOffset, scanLineNum, fileHandle)
+    Tcl_Interp *interp;
+    char       *fileLine;
+    long        fileOffset;
+    long        scanLineNum;
+    char       *fileHandle;
+{
+    char numBuf [20];
+
+    if (Tcl_SetVar2 (interp, "matchInfo", "line", fileLine, 
+                     TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    sprintf (numBuf, "%ld", fileOffset);
+    if (Tcl_SetVar2 (interp, "matchInfo", "offset", numBuf,
+                     TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    sprintf (numBuf, "%ld", scanLineNum);
+    if (Tcl_SetVar2 (interp, "matchInfo", "linenum", numBuf,
+                     TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    if (Tcl_SetVar2 (interp, "matchInfo", "handle", fileHandle, 
+                     TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ScanfileCmd --
+ *     Implements the TCL command:
+ *         scanfile contexthandle filehandle
+ *
+ * Results:
+ *    Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+Tcl_ScanfileCmd (clientData, interp, argc, argv)
+    char       *clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    scanGlob_pt     scanGlobPtr = (scanGlob_pt) clientData;
+    scanContext_pt  contextPtr;
+    dynamicBuf_t    dynBuf, lowerDynBuf;
+    OpenFile       *filePtr;
+    matchDef_pt     matchPtr;
+    int             result;
+    int             matchedAtLeastOne;
+    long            fileOffset;
+    long            matchOffset;
+    long            scanLineNum = 0;
+    char           *fileHandle;
+
+    if ((argc < 2) || (argc > 3)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " contexthandle filehandle", (char *) NULL);
+        return TCL_ERROR;
+    }
+    if ((contextPtr = Tcl_HandleXlate (interp, scanGlobPtr->tblHdrPtr, 
+                                       argv [1])) == NULL)
+        return TCL_ERROR;
+
+    if (TclGetOpenFile (interp, argv [2], &filePtr) != TCL_OK)
+            return TCL_ERROR;
+
+    if (contextPtr->matchListHead == NULL) {
+        Tcl_AppendResult (interp, "no patterns in current scan context",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    Tcl_DynBufInit (&dynBuf);
+    Tcl_DynBufInit (&lowerDynBuf);
+
+    result = TCL_OK;  /* Assume the best */
+
+    fileOffset = ftell (filePtr->f);  /* Get starting offset */
+
+    while ((result == TCL_OK)) {
+        int storedThisLine = FALSE;
+
+        switch (Tcl_DynamicFgets (&dynBuf, filePtr->f, FALSE)) {
+          case -1:  /* Error */
+            interp->result = Tcl_UnixError (interp);
+            goto scanExit;
+            
+          case 0:  /* EOF */
+            goto scanExit;
+        }
+        scanLineNum++;
+        matchOffset = fileOffset;
+        fileOffset += strlen(dynBuf.ptr) + 1;
+        storedThisLine = 0;
+        matchedAtLeastOne = 0;
+        if (contextPtr->flags & CONTEXT_A_CASE_INSENSITIVE_FLAG) {
+            lowerDynBuf.len = 0;
+            Tcl_DynBufAppend (&lowerDynBuf, dynBuf.ptr);
+            Tcl_DownShift (lowerDynBuf.ptr, lowerDynBuf.ptr);
+        }
+        for (matchPtr = contextPtr->matchListHead; matchPtr != NULL; 
+                 matchPtr = matchPtr->nextMatchDefPtr) {
+
+            if (!Tcl_RegExpExecute (interp, &matchPtr->regExpInfo, dynBuf.ptr, 
+                                    lowerDynBuf.ptr))
+                continue;  /* Try next match pattern */
+
+            matchedAtLeastOne = TRUE;
+            if (!storedThisLine) {
+                result = SetMatchVar (interp, dynBuf.ptr, matchOffset, 
+                                      scanLineNum, argv[2]);
+                if (result != TCL_OK)
+                    goto scanExit;
+                storedThisLine = TRUE;
+            }
+
+            result = Tcl_Eval(interp, matchPtr->command, 0, (char **)NULL);
+            if (result == TCL_ERROR) {
+                Tcl_AddErrorInfo (interp, 
+                    "\n    while executing a match command");
+                goto scanExit;
+            }
+            if (result == TCL_CONTINUE) {
+                /* 
+                 * Don't process any more matches for this line.
+                 */
+                result = TCL_OK;
+                goto matchLineExit;
+            }
+            if (result == TCL_BREAK) {
+                /*
+                 * Terminate scan.
+                 */
+                result = TCL_OK;
+                goto scanExit;
+            }
+        }
+
+        matchLineExit:
+        /*
+         * Process default action if required.
+         */
+        if ((contextPtr->defaultAction != NULL) && (!matchedAtLeastOne)) {
+
+            result = SetMatchVar (interp, dynBuf.ptr, matchOffset, 
+                                  scanLineNum, argv[2]);
+            if (result != TCL_OK)
+                goto scanExit;
+
+            result = Tcl_Eval (interp, contextPtr->defaultAction, 0, 
+                               (char **)NULL);
+            if (result == TCL_CONTINUE)
+                result = TCL_OK;    /* This doesn't mean anything, but  */
+                                    /* don't break the user.            */
+            if (result == TCL_ERROR)
+                Tcl_AddErrorInfo (interp, 
+                    "\n    while executing a match default command");
+        }
+    }
+scanExit:
+    Tcl_DynBufFree (&dynBuf);
+    Tcl_DynBufFree (&lowerDynBuf);
+    if (result == TCL_RETURN)
+        result = TCL_OK;
+    return result;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ *  FileScanCleanUp --
+ *      Decrements the use count on the globals when a command is deleted.
+ *      If it goes to zero, all resources are released.      
+ *
+ *-----------------------------------------------------------------------------
+ */
+static void
+FileScanCleanUp (clientData)
+    ClientData clientData;
+{
+    scanGlob_pt    scanGlobPtr = (scanGlob_pt) clientData;
+    scanContext_pt contextPtr;
+    int            walkKey;
+    
+    scanGlobPtr->useCount--;
+    if (scanGlobPtr->useCount > 0)
+        return;
+
+    walkKey = -1;
+    while ((contextPtr = Tcl_HandleWalk (scanGlobPtr->tblHdrPtr, 
+            &walkKey)) != NULL)
+        CleanUpContext (scanGlobPtr, contextPtr);
+
+    Tcl_HandleTblRelease (scanGlobPtr->tblHdrPtr);
+    ckfree ((char *) scanGlobPtr);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ *  Tcl_InitFilescan --
+ *      Initialize the TCL file scanning facility..
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_InitFilescan (interp)
+Tcl_Interp *interp;
+{
+    scanGlob_pt    scanGlobPtr;
+    void_pt        fileCbTblPtr;
+
+    scanGlobPtr = (scanGlob_pt) ckalloc (sizeof (scanGlob_t));
+    scanGlobPtr->tblHdrPtr = 
+        Tcl_HandleTblInit ("context", sizeof (scanContext_t), 5);
+
+    /*
+     * Initialize the commands.
+     */
+    scanGlobPtr->useCount = 3;  /* Number of commands */
+
+    Tcl_CreateCommand (interp, "scanfile", Tcl_ScanfileCmd, 
+                       (ClientData)scanGlobPtr, FileScanCleanUp);
+    Tcl_CreateCommand (interp, "scanmatch", Tcl_ScanmatchCmd, 
+                       (ClientData)scanGlobPtr, FileScanCleanUp);
+    Tcl_CreateCommand (interp, "scancontext", Tcl_ScancontextCmd,
+                       (ClientData)scanGlobPtr, FileScanCleanUp);
+}
+
diff --git a/src/tclx/src/tclxgdat.y b/src/tclx/src/tclxgdat.y
new file mode 100644 (file)
index 0000000..6957537
--- /dev/null
@@ -0,0 +1,587 @@
+/* 
+ * tclXgetdate.y --
+ *
+ * Contains yacc grammer for parsing date and time strings..
+ *---------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *---------------------------------------------------------------------------
+ * This code is a slightly modified version of getdate.y by:
+ *     Steven M. Bellovin (unc!smb)
+ *     Dept. of Computer Science
+ *     University of North Carolina at Chapel Hill
+ *     getdate.y    2.13    9/16/86
+ *-----------------------------------------------------------------------------
+ * $Id: tclXgetdate.y,v 2.0 1992/10/16 04:51:34 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+%token ID MONTH DAY MERIDIAN NUMBER UNIT MUNIT SUNIT ZONE DAYZONE AGO
+%{
+#include <unistd.h>
+#include <string.h>
+#include <sys/types.h>
+#include <ctype.h>
+#include <time.h>
+
+#ifndef NULL
+#    define NULL    0
+#endif
+
+#define daysec (24L*60L*60L)
+
+        static int timeflag, zoneflag, dateflag, dayflag, relflag;
+        static time_t relsec, relmonth;
+        static int hh, mm, ss, merid, dayLight;
+        static int dayord, dayreq;
+        static int month, day, year;
+        static int ourzone;
+
+#if 0
+       static time_t timeconv(int hh, int mm, int ss, int mer);
+       static time_t daylcorr(time_t future, time_t now);
+       static lookup(char *id);
+#else
+       static time_t timeconv();
+       static time_t daylcorr();
+       static lookup();
+#endif
+
+#define AM 1
+#define PM 2
+#define DAYLIGHT 1
+#define STANDARD 2
+#define MAYBE    3
+%}
+
+%%
+timedate:               /* empty */
+        | timedate item;
+
+item:   tspec =
+                {timeflag++;}
+        | zone =
+                {zoneflag++;}
+        | dtspec =
+                {dateflag++;}
+        | dyspec =
+                {dayflag++;}
+        | rspec =
+                {relflag++;}
+        | nspec;
+
+nspec:  NUMBER =
+                {if (timeflag && dateflag && !relflag) year = $1;
+                else {timeflag++;hh = $1/100;mm = $1%100;ss = 0;merid = 24;}};
+
+tspec:  NUMBER MERIDIAN =
+                {hh = $1; mm = 0; ss = 0; merid = $2;}
+        | NUMBER ':' NUMBER =
+                {hh = $1; mm = $3; merid = 24;}
+        | NUMBER ':' NUMBER MERIDIAN =
+                {hh = $1; mm = $3; merid = $4;}
+        | NUMBER ':' NUMBER NUMBER =
+                {hh = $1; mm = $3; merid = 24;
+                dayLight = STANDARD; ourzone = -($4%100 + 60*$4/100);}
+        | NUMBER ':' NUMBER ':' NUMBER =
+                {hh = $1; mm = $3; ss = $5; merid = 24;}
+        | NUMBER ':' NUMBER ':' NUMBER MERIDIAN =
+                {hh = $1; mm = $3; ss = $5; merid = $6;}
+        | NUMBER ':' NUMBER ':' NUMBER NUMBER =
+                {hh = $1; mm = $3; ss = $5; merid = 24;
+                dayLight = STANDARD; ourzone = -($6%100 + 60*$6/100);};
+
+zone:   ZONE =
+                {ourzone = $1; dayLight = STANDARD;}
+        | DAYZONE =
+                {ourzone = $1; dayLight = DAYLIGHT;};
+
+dyspec: DAY =
+                {dayord = 1; dayreq = $1;}
+        | DAY ',' =
+                {dayord = 1; dayreq = $1;}
+        | NUMBER DAY =
+                {dayord = $1; dayreq = $2;};
+
+dtspec: NUMBER '/' NUMBER =
+                {month = $1; day = $3;}
+        | NUMBER '/' NUMBER '/' NUMBER =
+                {month = $1; day = $3; year = $5;}
+        | MONTH NUMBER =
+                {month = $1; day = $2;}
+        | MONTH NUMBER ',' NUMBER =
+                {month = $1; day = $2; year = $4;}
+        | NUMBER MONTH =
+                {month = $2; day = $1;}
+        | NUMBER MONTH NUMBER =
+                {month = $2; day = $1; year = $3;};
+
+
+rspec:  NUMBER UNIT =
+                {relsec +=  60L * $1 * $2;}
+        | NUMBER MUNIT =
+                {relmonth += $1 * $2;}
+        | NUMBER SUNIT =
+                {relsec += $1;}
+        | UNIT =
+                {relsec +=  60L * $1;}
+        | MUNIT =
+                {relmonth += $1;}
+        | SUNIT =
+                {relsec++;}
+        | rspec AGO =
+                {relsec = -relsec; relmonth = -relmonth;};
+%%
+
+static int mdays[12] =
+        {31, 0, 31,  30, 31, 30,  31, 31, 30,  31, 30, 31};
+#define epoch 1970
+
+extern struct tm *localtime();
+
+static
+time_t dateconv(mm, dd, yy, h, m, s, mer, zone, dayflag)
+int mm, dd, yy, h, m, s, mer, zone, dayflag;
+{
+        time_t tod, jdate;
+        register int i;
+        time_t timeconv();
+
+        if (yy < 0) yy = -yy;
+        if (yy < 100) yy += 1900;
+        mdays[1] = 28 + (yy%4 == 0 && (yy%100 != 0 || yy%400 == 0));
+        if (yy < epoch || yy > 1999 || mm < 1 || mm > 12 ||
+                dd < 1 || dd > mdays[--mm]) return (-1);
+        jdate = dd-1;
+        for (i=0; i<mm; i++) jdate += mdays[i];
+        for (i = epoch; i < yy; i++) jdate += 365 + (i%4 == 0);
+        jdate *= daysec;
+        jdate += zone * 60L;
+        if ((tod = timeconv(h, m, s, mer)) < 0) return (-1);
+        jdate += tod;
+        if (dayflag==DAYLIGHT || (dayflag==MAYBE&&localtime(&jdate)->tm_isdst))
+                jdate += -1*60*60;
+        return (jdate);
+}
+
+static
+time_t dayconv(ord, day, now) int ord, day; time_t now;
+{
+        register struct tm *loctime;
+        time_t tod;
+        time_t daylcorr();
+
+        tod = now;
+        loctime = localtime(&tod);
+        tod += daysec * ((day - loctime->tm_wday + 7) % 7);
+        tod += 7*daysec*(ord<=0?ord:ord-1);
+        return daylcorr(tod, now);
+}
+
+static
+time_t timeconv(hh, mm, ss, mer) register int hh, mm, ss, mer;
+{
+        if (mm < 0 || mm > 59 || ss < 0 || ss > 59) return (-1);
+        switch (mer) {
+                case AM: if (hh < 1 || hh > 12) return(-1);
+                         return (60L * ((hh%12)*60L + mm)+ss);
+                case PM: if (hh < 1 || hh > 12) return(-1);
+                         return (60L * ((hh%12 +12)*60L + mm)+ss);
+                case 24: if (hh < 0 || hh > 23) return (-1);
+                         return (60L * (hh*60L + mm)+ss);
+                default: return (-1);
+        }
+}
+
+static
+time_t monthadd(sdate, relmonth) time_t sdate, relmonth;
+{
+        struct tm *ltime;
+        time_t dateconv();
+        time_t daylcorr();
+        int mm, yy;
+
+        if (relmonth == 0) return 0;
+        ltime = localtime(&sdate);
+        mm = 12*ltime->tm_year + ltime->tm_mon + relmonth;
+        yy = mm/12;
+        mm = mm%12 + 1;
+        return daylcorr(dateconv(mm, ltime->tm_mday, yy, ltime->tm_hour,
+                ltime->tm_min, ltime->tm_sec, 24, ourzone, MAYBE), sdate);
+}
+
+static
+time_t daylcorr(future, now) time_t future, now;
+{
+        int fdayl, nowdayl;
+
+        nowdayl = (localtime(&now)->tm_hour+1) % 24;
+        fdayl = (localtime(&future)->tm_hour+1) % 24;
+        return (future-now) + 60L*60L*(nowdayl-fdayl);
+}
+
+static char *lptr;
+
+static
+yylex()
+{
+#ifndef YYSTYPE
+//#define YYSTYPE extern int
+#define YYSTYPE int
+#endif
+        YYSTYPE yylval;
+        int sign;
+        register char c;
+        register char *p;
+        char idbuf[20];
+        int pcnt;
+
+        for (;;) {
+                while (isspace(*lptr)) lptr++;
+
+                if (isdigit(c = *lptr) || c == '-' || c == '+') {
+                        if (c== '-' || c == '+') {
+                                if (c=='-') sign = -1;
+                                else sign = 1;
+                                if (!isdigit(*++lptr)) {
+                                        /* yylval = sign; return (NUMBER); */
+                                        return yylex(); /* skip the '-' sign */
+                                }
+                        } else sign = 1;
+                        yylval = 0;
+                        while (isdigit(c = *lptr++)) yylval = 10*yylval + c - '0';
+                        yylval *= sign;
+                        lptr--;
+                        return (NUMBER);
+
+                } else if (isalpha(c)) {
+                        p = idbuf;
+                        while (isalpha(c = *lptr++) || c=='.')
+                                if (p < &idbuf[sizeof(idbuf)-1])
+                                        *p++ = c;
+                        *p = '\0';
+                        lptr--;
+                        return (lookup(idbuf));
+                }
+
+                else if (c == '(') {
+                        pcnt = 0;
+                        do {
+                                c = *lptr++;
+                                if (c == '\0') return(c);
+                                else if (c == '(') pcnt++;
+                                else if (c == ')') pcnt--;
+                        } while (pcnt > 0);
+                }
+
+                else return (*lptr++);
+        }
+}
+
+//static
+struct table {
+        char *name;
+        int type, value;
+};
+
+static
+struct table mdtab[] = {
+        {"January", MONTH, 1},
+        {"February", MONTH, 2},
+        {"March", MONTH, 3},
+        {"April", MONTH, 4},
+        {"May", MONTH, 5},
+        {"June", MONTH, 6},
+        {"July", MONTH, 7},
+        {"August", MONTH, 8},
+        {"September", MONTH, 9},
+        {"Sept", MONTH, 9},
+        {"October", MONTH, 10},
+        {"November", MONTH, 11},
+        {"December", MONTH, 12},
+
+        {"Sunday", DAY, 0},
+        {"Monday", DAY, 1},
+        {"Tuesday", DAY, 2},
+        {"Tues", DAY, 2},
+        {"Wednesday", DAY, 3},
+        {"Wednes", DAY, 3},
+        {"Thursday", DAY, 4},
+        {"Thur", DAY, 4},
+        {"Thurs", DAY, 4},
+        {"Friday", DAY, 5},
+        {"Saturday", DAY, 6},
+        {0, 0, 0}};
+
+#define HRS *60
+#define HALFHR 30
+static
+struct table mztab[] = {
+        {"a.m.", MERIDIAN, AM},
+        {"am", MERIDIAN, AM},
+        {"p.m.", MERIDIAN, PM},
+        {"pm", MERIDIAN, PM},
+        {"nst", ZONE, 3 HRS + HALFHR},          /* Newfoundland */
+        {"n.s.t.", ZONE, 3 HRS + HALFHR},
+        {"ast", ZONE, 4 HRS},           /* Atlantic */
+        {"a.s.t.", ZONE, 4 HRS},
+        {"adt", DAYZONE, 4 HRS},
+        {"a.d.t.", DAYZONE, 4 HRS},
+        {"est", ZONE, 5 HRS},           /* Eastern */
+        {"e.s.t.", ZONE, 5 HRS},
+        {"edt", DAYZONE, 5 HRS},
+        {"e.d.t.", DAYZONE, 5 HRS},
+        {"cst", ZONE, 6 HRS},           /* Central */
+        {"c.s.t.", ZONE, 6 HRS},
+        {"cdt", DAYZONE, 6 HRS},
+        {"c.d.t.", DAYZONE, 6 HRS},
+        {"mst", ZONE, 7 HRS},           /* Mountain */
+        {"m.s.t.", ZONE, 7 HRS},
+        {"mdt", DAYZONE, 7 HRS},
+        {"m.d.t.", DAYZONE, 7 HRS},
+        {"pst", ZONE, 8 HRS},           /* Pacific */
+        {"p.s.t.", ZONE, 8 HRS},
+        {"pdt", DAYZONE, 8 HRS},
+        {"p.d.t.", DAYZONE, 8 HRS},
+        {"yst", ZONE, 9 HRS},           /* Yukon */
+        {"y.s.t.", ZONE, 9 HRS},
+        {"ydt", DAYZONE, 9 HRS},
+        {"y.d.t.", DAYZONE, 9 HRS},
+        {"hst", ZONE, 10 HRS},          /* Hawaii */
+        {"h.s.t.", ZONE, 10 HRS},
+        {"hdt", DAYZONE, 10 HRS},
+        {"h.d.t.", DAYZONE, 10 HRS},
+
+        {"gmt", ZONE, 0 HRS},
+        {"g.m.t.", ZONE, 0 HRS},
+        {"bst", DAYZONE, 0 HRS},                /* British Summer Time */
+        {"b.s.t.", DAYZONE, 0 HRS},
+        {"eet", ZONE, 0 HRS},           /* European Eastern Time */
+        {"e.e.t.", ZONE, 0 HRS},
+        {"eest", DAYZONE, 0 HRS},       /* European Eastern Summer Time */
+        {"e.e.s.t.", DAYZONE, 0 HRS},
+        {"met", ZONE, -1 HRS},          /* Middle European Time */
+        {"m.e.t.", ZONE, -1 HRS},
+        {"mest", DAYZONE, -1 HRS},      /* Middle European Summer Time */
+        {"m.e.s.t.", DAYZONE, -1 HRS},
+        {"wet", ZONE, -2 HRS },         /* Western European Time */
+        {"w.e.t.", ZONE, -2 HRS },
+        {"west", DAYZONE, -2 HRS},      /* Western European Summer Time */
+        {"w.e.s.t.", DAYZONE, -2 HRS},
+
+        {"jst", ZONE, -9 HRS},          /* Japan Standard Time */
+        {"j.s.t.", ZONE, -9 HRS},       /* Japan Standard Time */
+                                        /* No daylight savings time */
+
+        {"aest", ZONE, -10 HRS},        /* Australian Eastern Time */
+        {"a.e.s.t.", ZONE, -10 HRS},
+        {"aesst", DAYZONE, -10 HRS},    /* Australian Eastern Summer Time */
+        {"a.e.s.s.t.", DAYZONE, -10 HRS},
+        {"acst", ZONE, -(9 HRS + HALFHR)},      /* Australian Central Time */
+        {"a.c.s.t.", ZONE, -(9 HRS + HALFHR)},
+        {"acsst", DAYZONE, -(9 HRS + HALFHR)},  /* Australian Central Summer */
+        {"a.c.s.s.t.", DAYZONE, -(9 HRS + HALFHR)},
+        {"awst", ZONE, -8 HRS},         /* Australian Western Time */
+        {"a.w.s.t.", ZONE, -8 HRS},     /* (no daylight time there, I'm told */
+        {0, 0, 0}};
+
+static
+struct table unittb[] = {
+        {"year", MUNIT, 12},
+        {"month", MUNIT, 1},
+        {"fortnight", UNIT, 14*24*60},
+        {"week", UNIT, 7*24*60},
+        {"day", UNIT, 1*24*60},
+        {"hour", UNIT, 60},
+        {"minute", UNIT, 1},
+        {"min", UNIT, 1},
+        {"second", SUNIT, 1},
+        {"sec", SUNIT, 1},
+        {0, 0, 0}};
+
+static
+struct table othertb[] = {
+        {"tomorrow", UNIT, 1*24*60},
+        {"yesterday", UNIT, -1*24*60},
+        {"today", UNIT, 0},
+        {"now", UNIT, 0},
+        {"last", NUMBER, -1},
+        {"this", UNIT, 0},
+        {"next", NUMBER, 2},
+        {"first", NUMBER, 1},
+        /* {"second", NUMBER, 2}, */
+        {"third", NUMBER, 3},
+        {"fourth", NUMBER, 4},
+        {"fifth", NUMBER, 5},
+        {"sixth", NUMBER, 6},
+        {"seventh", NUMBER, 7},
+        {"eigth", NUMBER, 8},
+        {"ninth", NUMBER, 9},
+        {"tenth", NUMBER, 10},
+        {"eleventh", NUMBER, 11},
+        {"twelfth", NUMBER, 12},
+        {"ago", AGO, 1},
+        {0, 0, 0}};
+
+static
+struct table milzone[] = {
+        {"a", ZONE, 1 HRS},
+        {"b", ZONE, 2 HRS},
+        {"c", ZONE, 3 HRS},
+        {"d", ZONE, 4 HRS},
+        {"e", ZONE, 5 HRS},
+        {"f", ZONE, 6 HRS},
+        {"g", ZONE, 7 HRS},
+        {"h", ZONE, 8 HRS},
+        {"i", ZONE, 9 HRS},
+        {"k", ZONE, 10 HRS},
+        {"l", ZONE, 11 HRS},
+        {"m", ZONE, 12 HRS},
+        {"n", ZONE, -1 HRS},
+        {"o", ZONE, -2 HRS},
+        {"p", ZONE, -3 HRS},
+        {"q", ZONE, -4 HRS},
+        {"r", ZONE, -5 HRS},
+        {"s", ZONE, -6 HRS},
+        {"t", ZONE, -7 HRS},
+        {"u", ZONE, -8 HRS},
+        {"v", ZONE, -9 HRS},
+        {"w", ZONE, -10 HRS},
+        {"x", ZONE, -11 HRS},
+        {"y", ZONE, -12 HRS},
+        {"z", ZONE, 0 HRS},
+        {0, 0, 0}};
+
+static
+lookup(id) char *id;
+{
+#define gotit (yylval=i->value,  i->type)
+#define getid for(j=idvar, k=id; *j++ = *k++; )
+
+        char idvar[20];
+        register char *j, *k;
+        register struct table *i;
+        int abbrev;
+
+        getid;
+        if (strlen(idvar) == 3) abbrev = 1;
+        else if (strlen(idvar) == 4 && idvar[3] == '.') {
+                abbrev = 1;
+                idvar[3] = '\0';
+        }
+        else abbrev = 0;
+
+        if (islower(*idvar)) *idvar = toupper(*idvar);
+
+        for (i = mdtab; i->name; i++) {
+                k = idvar;
+                for (j = i->name; *j++ == *k++;) {
+                        if (abbrev && j==i->name+3) return gotit;
+                        if (j[-1] == 0) return gotit;
+                }
+        }
+
+        getid;
+        for (i = mztab; i->name; i++)
+                if (strcmp(i->name, idvar) == 0) return gotit;
+
+        for (j = idvar; *j; j++)
+                if (isupper(*j)) *j = tolower(*j);
+        for (i=mztab; i->name; i++)
+                if (strcmp(i->name, idvar) == 0) return gotit;
+
+        getid;
+        for (i=unittb; i->name; i++)
+                if (strcmp(i->name, idvar) == 0) return gotit;
+
+        if (idvar[strlen(idvar)-1] == 's')
+                idvar[strlen(idvar)-1] = '\0';
+        for (i=unittb; i->name; i++)
+                if (strcmp(i->name, idvar) == 0) return gotit;
+
+        getid;
+        for (i = othertb; i->name; i++)
+                if (strcmp(i->name, idvar) == 0) return gotit;
+
+        getid;
+        if (strlen(idvar) == 1 && isalpha(*idvar)) {
+                if (isupper(*idvar)) *idvar = tolower(*idvar);
+                for (i = milzone; i->name; i++)
+                        if (strcmp(i->name, idvar) == 0) return gotit;
+        }
+
+        return(ID);
+}
+
+time_t
+Tcl_GetDate (p, now, zone)
+    char   *p;
+    time_t  now;
+    long    zone;
+{
+#define mcheck(f)       if (f>1) err++
+        time_t monthadd();
+        int err;
+        struct tm *lt;
+        time_t sdate, tod;
+
+        lptr = p;
+        if (now <= 0)
+                (void) time(&now);
+        lt = localtime(&now);
+        year = lt->tm_year;
+        month = lt->tm_mon+1;
+        day = lt->tm_mday;
+        relsec = 0; relmonth = 0;
+        timeflag=zoneflag=dateflag=dayflag=relflag=0;
+        dayLight = MAYBE;
+        hh = mm = ss = 0;
+        merid = 24;
+        ourzone = zone;
+
+        if (err = yyparse()) return (-1);
+
+        mcheck(timeflag);
+        mcheck(zoneflag);
+        mcheck(dateflag);
+        mcheck(dayflag);
+
+        if (err) return (-1);
+        if (dateflag || timeflag || dayflag) {
+                sdate = dateconv(month,day,year,hh,mm,ss,merid,ourzone,
+                                 dayLight);
+                if (sdate < 0) return -1;
+        }
+        else {
+                sdate = now;
+                if (relflag == 0)
+                        sdate -= (lt->tm_sec + lt->tm_min*60 +
+                                lt->tm_hour*(60L*60L));
+        }
+
+        sdate += relsec;
+        sdate += monthadd(sdate, relmonth);
+
+        if (dayflag && !dateflag) {
+                tod = dayconv(dayord, dayreq, sdate);
+                sdate += tod;
+        }
+
+        return sdate;
+}
+
+/*
+ * Error message are not used, so discard with dummy function.
+ */
+
+void
+yyerror(msg)
+    char *msg;
+{
+}
diff --git a/src/tclx/src/tclxgenl.c b/src/tclx/src/tclxgenl.c
new file mode 100644 (file)
index 0000000..b0dd07e
--- /dev/null
@@ -0,0 +1,186 @@
+/* 
+ * tclXgeneral.c --
+ *
+ *      Contains general extensions to the basic TCL command set.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXgeneral.c,v 2.0 1992/10/16 04:50:47 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+/*
+ * These globals must be set by main for the information to be defined.
+ */
+
+char *tclxVersion       = "?";   /* Extended Tcl version number.            */
+int   tclxPatchlevel    = 0;     /* Extended Tcl patch level.               */
+
+char *tclAppName        = NULL;  /* Application name                        */
+char *tclAppLongname    = NULL;  /* Long, natural language application name */
+char *tclAppVersion     = NULL;  /* Version number of the application       */
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_EchoCmd --
+ *    Implements the TCL echo command:
+ *        echo str1 [str2..]
+ *
+ * Results:
+ *      Always returns TCL_OK.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_EchoCmd(clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int idx;
+
+    for (idx = 1; idx < argc; idx++) {
+        fputs (argv [idx], stdout);
+        if (idx < (argc - 1))
+            printf(" ");
+    }
+    printf("\n");
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_InfoxCmd --
+ *    Implements the TCL infox command:
+ *        infox option
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_InfoxCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    if (argc != 2) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " option", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (STREQU ("version", argv [1])) {
+        Tcl_SetResult (interp, tclxVersion, TCL_STATIC);
+    } else if (STREQU ("patchlevel", argv [1])) {
+        char numBuf [32];
+        sprintf (numBuf, "%d", tclxPatchlevel);
+        Tcl_SetResult (interp, numBuf, TCL_VOLATILE);
+    } else if (STREQU ("appname", argv [1])) {
+        if (tclAppName != NULL)
+            Tcl_SetResult (interp, tclAppName, TCL_STATIC);
+    } else if (STREQU ("applongname", argv [1])) {
+        if (tclAppLongname != NULL)
+            Tcl_SetResult (interp, tclAppLongname, TCL_STATIC);
+    } else if (STREQU ("appversion", argv [1])) {
+        if (tclAppVersion != NULL)
+            Tcl_SetResult (interp, tclAppVersion, TCL_STATIC);
+    } else {
+        Tcl_AppendResult (interp, "illegal option \"", argv [1], 
+                          "\" expect one of: version, patchlevel, appname, ",
+                          "applongname, or appversion", (char *) NULL);
+        return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_LoopCmd --
+ *     Implements the TCL loop command:
+ *         loop var start end [increment] command
+ *
+ * Results:
+ *      Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_LoopCmd (dummy, interp, argc, argv)
+    ClientData  dummy;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int   result = TCL_OK;
+    long  i, first, limit, incr = 1;
+    char *command;
+    char  itxt [12];
+
+    if ((argc < 5) || (argc > 6)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " var first limit [incr] command", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (Tcl_GetLong (interp, argv[2], &first) != TCL_OK)
+        return TCL_ERROR;
+    if (Tcl_GetLong (interp, argv[3], &limit) != TCL_OK)
+        return TCL_ERROR;
+    if (argc == 5)
+        command = argv[4];
+    else {
+        if (Tcl_GetLong (interp, argv[4], &incr) != TCL_OK)
+            return TCL_ERROR;
+        command = argv[5];
+    }
+
+    for (i = first;
+             (((i < limit) && (incr > 0)) || ((i > limit) && (incr < 0)));
+             i += incr) {
+
+        sprintf (itxt,"%ld",i);
+        if (Tcl_SetVar (interp, argv [1], itxt, TCL_LEAVE_ERR_MSG) == NULL)
+            return TCL_ERROR;
+
+        result = Tcl_Eval(interp, command, 0, (char **) NULL);
+        if (result != TCL_OK) {
+            if (result == TCL_CONTINUE) {
+                result = TCL_OK;
+            } else if (result == TCL_BREAK) {
+                result = TCL_OK;
+                break;
+            } else if (result == TCL_ERROR) {
+                char buf [64];
+
+                sprintf (buf, "\n    (\"loop\" body line %d)", 
+                         interp->errorLine);
+                Tcl_AddErrorInfo (interp, buf);
+                break;
+            } else {
+                break;
+            }
+        }
+    }
+    /*
+     * Set variable to its final value.
+     */
+    sprintf (itxt,"%ld",i);
+    if (Tcl_SetVar (interp, argv [1], itxt, TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    return result;
+}
diff --git a/src/tclx/src/tclxhndl.c b/src/tclx/src/tclxhndl.c
new file mode 100644 (file)
index 0000000..81d4cab
--- /dev/null
@@ -0,0 +1,456 @@
+/*
+ *
+ * tclXhandles.c --
+ *
+ * Tcl handles.  Provides a mechanism for managing expandable tables that are
+ * addressed by textual handles.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXhandles.c,v 2.0 1992/10/16 04:50:49 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+/*
+ * This is the table header.  It is separately allocated from the table body,
+ * since it must keep track of a table body that might move.  Each entry in the
+ * table is preceded with a header which has the free list link, which is a
+ * entry index of the next free entry.  Special values keep track of allocated
+ * entries.
+ */
+
+#define NULL_IDX      -1
+#define ALLOCATED_IDX -2
+
+typedef unsigned char ubyte_t;
+typedef ubyte_t *ubyte_pt;
+
+typedef struct {
+    int      useCount;          /* Keeps track of the number sharing       */
+    int      entrySize;         /* Entry size in bytes, including overhead */
+    int      tableSize;         /* Current number of entries in the table  */
+    int      freeHeadIdx;       /* Index of first free entry in the table  */
+    ubyte_pt bodyP;             /* Pointer to table body                   */
+    int      baseLength;        /* Length of handleBase.                   */
+    char     handleBase [1];    /* Base handle name.  MUST BE LAST FIELD!  */
+    } tblHeader_t;
+typedef tblHeader_t *tblHeader_pt;
+
+typedef struct {
+    int freeLink;
+  } entryHeader_t;
+typedef entryHeader_t *entryHeader_pt;
+
+/*
+ * This macro is used to return a pointer to an entry, given its index.
+ */
+#define TBL_INDEX(hdrP, idx) \
+    ((entryHeader_pt) (hdrP->bodyP + (hdrP->entrySize * idx)))
+
+/*
+ * This macros to convert between pointers to the user and header area of
+ * an table entry.
+ */
+#define USER_AREA(entryPtr) \
+ (void_pt) (((ubyte_pt) entryPtr) + sizeof (entryHeader_t));
+#define HEADER_AREA(entryPtr) \
+ (entryHeader_pt) (((ubyte_pt) entryPtr) - sizeof (entryHeader_t));
+
+/*
+ * Prototypes of internal functions.
+ */
+static void
+LinkInNewEntries _ANSI_ARGS_((tblHeader_pt tblHdrPtr,
+                              int          newIdx,
+                              int          numEntries));
+
+static void
+ExpandTable _ANSI_ARGS_((tblHeader_pt tblHdrPtr,
+                         int          neededIdx));
+
+static entryHeader_pt
+AllocEntry _ANSI_ARGS_((tblHeader_pt  tblHdrPtr,
+                        int          *entryIdxPtr));
+
+static int
+HandleDecode _ANSI_ARGS_((Tcl_Interp   *interp,
+                          tblHeader_pt  tblHdrPtr,
+                          CONST char   *handle));
+\f
+/*=============================================================================
+ * LinkInNewEntries --
+ *   Build free links through the newly allocated part of a table.
+ *   
+ * Parameters:
+ *   o tblHdrPtr (I) - A pointer to the table header.
+ *   o newIdx (I) - Index of the first new entry.
+ *   o numEntries (I) - The number of new entries.
+ *-----------------------------------------------------------------------------
+ */
+static void
+LinkInNewEntries (tblHdrPtr, newIdx, numEntries)
+    tblHeader_pt tblHdrPtr;
+    int          newIdx;
+    int          numEntries;
+{
+    int            entIdx, lastIdx;
+    entryHeader_pt entryPtr;
+    
+    lastIdx = newIdx + numEntries - 1;
+
+    for (entIdx = newIdx; entIdx < lastIdx; entIdx++) {
+        entryPtr = TBL_INDEX (tblHdrPtr, entIdx);
+        entryPtr->freeLink = entIdx + 1;
+    }
+    entryPtr = TBL_INDEX (tblHdrPtr, lastIdx);
+    entryPtr->freeLink = tblHdrPtr->freeHeadIdx;
+    tblHdrPtr->freeHeadIdx = newIdx;
+
+} /* LinkInNewEntries */
+\f
+/*=============================================================================
+ * ExpandTable --
+ *   Expand a handle table, doubling its size.
+ * Parameters:
+ *   o tblHdrPtr (I) - A pointer to the table header.
+ *   o neededIdx (I) - If positive, then the table will be expanded so that
+ *     this entry is available.  If -1, then just expand by the number of 
+ *     entries specified on table creation.  MUST be smaller than this size.
+ *-----------------------------------------------------------------------------
+ */
+static void
+ExpandTable (tblHdrPtr, neededIdx)
+    tblHeader_pt tblHdrPtr;
+    int          neededIdx;
+{
+    ubyte_pt oldBodyP = tblHdrPtr->bodyP;
+    int      numNewEntries;
+    int      newSize;
+    
+    if (neededIdx < 0)
+        numNewEntries = tblHdrPtr->tableSize;
+    else
+        numNewEntries = (neededIdx - tblHdrPtr->tableSize) + 1;
+    newSize = (tblHdrPtr->tableSize + numNewEntries) * tblHdrPtr->entrySize;
+
+    tblHdrPtr->bodyP = (ubyte_pt) ckalloc (newSize);
+    memcpy (tblHdrPtr->bodyP, oldBodyP, newSize);
+    LinkInNewEntries (tblHdrPtr, tblHdrPtr->tableSize, numNewEntries);
+    tblHdrPtr->tableSize += numNewEntries;
+    ckfree (oldBodyP);
+    
+} /* ExpandTable */
+\f
+/*=============================================================================
+ * AllocEntry --
+ *   Allocate a table entry, expanding if necessary.
+ *
+ * Parameters:
+ *   o tblHdrPtr (I) - A pointer to the table header.
+ *   o entryIdxPtr (O) - The index of the table entry is returned here.
+ * Returns:
+ *    The a pointer to the entry.
+ *-----------------------------------------------------------------------------
+ */
+static entryHeader_pt
+AllocEntry (tblHdrPtr, entryIdxPtr)
+    tblHeader_pt  tblHdrPtr;
+    int          *entryIdxPtr;
+{
+    int            entryIdx;
+    entryHeader_pt entryPtr;
+
+    if (tblHdrPtr->freeHeadIdx == NULL_IDX)
+        ExpandTable (tblHdrPtr, -1);
+
+    entryIdx = tblHdrPtr->freeHeadIdx;    
+    entryPtr = TBL_INDEX (tblHdrPtr, entryIdx);
+    tblHdrPtr->freeHeadIdx = entryPtr->freeLink;
+    entryPtr->freeLink = ALLOCATED_IDX;
+    
+    *entryIdxPtr = entryIdx;
+    return entryPtr;
+    
+} /* AllocEntry */
+\f
+/*=============================================================================
+ * HandleDecode --
+ *   Decode handle into an entry number.
+ *
+ * Parameters:
+ *   o interp (I) - A error message may be returned in result.
+ *   o tblHdrPtr (I) - A pointer to the table header.
+ *   o handle (I) - Handle to decode.
+ * Returns:
+ *   The entry index decoded from the handle, or a negative number if an error
+ *   occured.
+ *-----------------------------------------------------------------------------
+ */
+static int
+HandleDecode (interp, tblHdrPtr, handle)
+    Tcl_Interp   *interp;
+    tblHeader_pt  tblHdrPtr;
+    CONST char   *handle;
+{
+    unsigned entryIdx;
+
+    if ((strncmp (tblHdrPtr->handleBase, (char *) handle, 
+             tblHdrPtr->baseLength) != 0) ||
+             !Tcl_StrToUnsigned (&handle [tblHdrPtr->baseLength], 10, 
+                                 &entryIdx)) {
+        Tcl_AppendResult (interp, "invalid ", tblHdrPtr->handleBase,
+                          " handle: ", handle, (char *) NULL);
+        return -1;
+    }
+    return entryIdx;
+
+} /* HandleDecode */
+\f
+/*=============================================================================
+ * Tcl_HandleTblInit --
+ *   Create and initialize a Tcl dynamic handle table.  The use count on the
+ *   table is set to one.
+ * Parameters:
+ *   o handleBase(I) - The base name of the handle, the handle will be returned
+ *     in the form "baseNN", where NN is the table entry number.
+ *   o entrySize (I) - The size of an entry, in bytes.
+ *   o initEntries (I) - Initial size of the table, in entries.
+ * Returns:
+ *   A pointer to the table header.  
+ *-----------------------------------------------------------------------------
+ */
+void_pt
+Tcl_HandleTblInit (handleBase, entrySize, initEntries)
+    CONST char *handleBase;
+    int         entrySize;
+    int         initEntries;
+{
+    tblHeader_pt tblHdrPtr;
+    int          baseLength = strlen ((char *) handleBase);
+
+    tblHdrPtr = (tblHeader_pt) ckalloc (sizeof (tblHeader_t) + baseLength + 1);
+
+    tblHdrPtr->useCount = 1;
+    tblHdrPtr->baseLength = baseLength;
+    strcpy (tblHdrPtr->handleBase, (char *) handleBase);
+
+    /* 
+     * Calculate entry size, including header, rounded up to sizeof (int). 
+     */
+    tblHdrPtr->entrySize = entrySize + sizeof (entryHeader_t);
+    tblHdrPtr->entrySize = ((tblHdrPtr->entrySize + sizeof (int) - 1) / 
+                          sizeof (int)) * sizeof (int);
+    tblHdrPtr->freeHeadIdx = NULL_IDX;
+    tblHdrPtr->tableSize = initEntries;
+    tblHdrPtr->bodyP = (ubyte_pt) ckalloc (initEntries * tblHdrPtr->entrySize);
+    LinkInNewEntries (tblHdrPtr, 0, initEntries);
+
+    return (void_pt) tblHdrPtr;
+
+} /* Tcl_HandleTblInit */
+\f
+/*=============================================================================
+ * Tcl_HandleTblUseCount --
+ *   Alter the handle table use count by the specified amount, which can be
+ *   positive or negative.  Amount may be zero to retrieve the use count.
+ * Parameters:
+ *   o headerPtr (I) - Pointer to the table header.
+ *   o amount (I) - The amount to alter the use count by.
+ * Returns:
+ *   The resulting use count.
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_HandleTblUseCount (headerPtr, amount)
+    void_pt  headerPtr;
+    int      amount;
+{
+    tblHeader_pt   tblHdrPtr = (tblHeader_pt)headerPtr;
+        
+    tblHdrPtr->useCount += amount;
+    return tblHdrPtr->useCount;
+}
+\f
+/*=============================================================================
+ * Tcl_HandleTblRelease --
+ *   Decrement the use count on a Tcl dynamic handle table.  If the count
+ *   goes to zero or negative, then release the table.  It is designed to be 
+ *   called when a command is released.
+ * Parameters:
+ *   o headerPtr (I) - Pointer to the table header.
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_HandleTblRelease (headerPtr)
+    void_pt headerPtr;
+{
+    tblHeader_pt   tblHdrPtr = (tblHeader_pt)headerPtr;
+
+    tblHdrPtr->useCount--;
+    if (tblHdrPtr->useCount <= 0) {
+        ckfree (tblHdrPtr->bodyP);
+        ckfree ((char *) tblHdrPtr);
+    }
+}
+\f
+/*=============================================================================
+ * Tcl_HandleAlloc --
+ *   Allocate an entry and associate a handle with it.
+ *
+ * Parameters:
+ *   o headerPtr (I) - A pointer to the table header.
+ *   o handlePtr (O) - Buffer to return handle in. It must be big enough to
+ *     hold the name.
+ * Returns:
+ *   A pointer to the allocated entry (user part).
+ *-----------------------------------------------------------------------------
+ */
+void_pt
+Tcl_HandleAlloc (headerPtr, handlePtr)
+    void_pt   headerPtr;
+    char     *handlePtr;
+{
+    tblHeader_pt   tblHdrPtr = (tblHeader_pt)headerPtr;
+    entryHeader_pt entryPtr;
+    int            entryIdx;
+
+    entryPtr = AllocEntry ((tblHeader_pt) headerPtr, &entryIdx);
+    sprintf (handlePtr, "%s%d", tblHdrPtr->handleBase, entryIdx);
+     
+    return USER_AREA (entryPtr);
+
+} /* Tcl_HandleAlloc */
+\f
+/*=============================================================================
+ * Tcl_HandleXlate --
+ *   Translate a handle to a entry pointer.
+ *
+ * Parameters:
+ *   o interp (I) - A error message may be returned in result.
+ *   o headerPtr (I) - A pointer to the table header.
+ *   o handle (I) - The handle assigned to the entry.
+ * Returns:
+ *   A pointer to the entry, or NULL if an error occured.
+ *-----------------------------------------------------------------------------
+ */
+void_pt
+Tcl_HandleXlate (interp, headerPtr, handle)
+    Tcl_Interp *interp;
+    void_pt     headerPtr;
+    CONST char *handle;
+{
+    tblHeader_pt   tblHdrPtr = (tblHeader_pt)headerPtr;
+    entryHeader_pt entryPtr;
+    int            entryIdx;
+    
+    if ((entryIdx = HandleDecode (interp, tblHdrPtr, handle)) < 0)
+        return NULL;
+    entryPtr = TBL_INDEX (tblHdrPtr, entryIdx);
+
+    if ((entryIdx >= tblHdrPtr->tableSize) ||
+            (entryPtr->freeLink != ALLOCATED_IDX)) {
+        Tcl_AppendResult (interp, tblHdrPtr->handleBase, " is not open",
+                          (char *) NULL);
+        return NULL;
+    }     
+
+    return USER_AREA (entryPtr);
+} /* Tcl_HandleXlate */
+\f
+/*=============================================================================
+ * Tcl_HandleWalk --
+ *   Walk through and find every allocated entry in a table.  Entries may
+ *   be deallocated during a walk, but should not be allocated.
+ *
+ * Parameters:
+ *   o headerPtr (I) - A pointer to the table header.
+ *   o walkKeyPtr (I/O) - Pointer to a variable to use to keep track of the
+ *     place in the table.  The variable should be initialized to -1 before
+ *     the first call.
+ * Returns:
+ *   A pointer to the next allocated entry, or NULL if there are not more.
+ *-----------------------------------------------------------------------------
+ */
+void_pt
+Tcl_HandleWalk (headerPtr, walkKeyPtr)
+    void_pt   headerPtr;
+    int      *walkKeyPtr;
+{
+    tblHeader_pt   tblHdrPtr = (tblHeader_pt)headerPtr;
+    int            entryIdx;
+    entryHeader_pt entryPtr;
+
+    if (*walkKeyPtr == -1)
+        entryIdx = 0;
+    else
+        entryIdx = *walkKeyPtr + 1;
+        
+    while (entryIdx < tblHdrPtr->tableSize) {
+        entryPtr = TBL_INDEX (tblHdrPtr, entryIdx);
+        if (entryPtr->freeLink == ALLOCATED_IDX) {
+            *walkKeyPtr = entryIdx;
+            return USER_AREA (entryPtr);
+        }
+        entryIdx++;
+    }
+    return NULL;
+
+} /* Tcl_HandleWalk */
+\f
+/*=============================================================================
+ * Tcl_WalkKeyToHandle --
+ *   Convert a walk key, as returned from a call to Tcl_HandleWalk into a
+ *   handle.  The Tcl_HandleWalk must have succeeded.
+ * Parameters:
+ *   o headerPtr (I) - A pointer to the table header.
+ *   o walkKey (I) - The walk key.
+ *   o handlePtr (O) - Buffer to return handle in. It must be big enough to
+ *     hold the name.
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_WalkKeyToHandle (headerPtr, walkKey, handlePtr)
+    void_pt   headerPtr;
+    int       walkKey;
+    char     *handlePtr;
+{
+    tblHeader_pt   tblHdrPtr = (tblHeader_pt)headerPtr;
+
+    sprintf (handlePtr, "%s%d", tblHdrPtr->handleBase, walkKey);
+
+} /* Tcl_WalkKeyToHandle */
+\f
+/*=============================================================================
+ * Tcl_HandleFree --
+ *   Frees a handle table entry.
+ *
+ * Parameters:
+ *   o headerPtr (I) - A pointer to the table header.
+ *   o entryPtr (I) - Entry to free.
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_HandleFree (headerPtr, entryPtr)
+    void_pt headerPtr;
+    void_pt entryPtr;
+{
+    tblHeader_pt   tblHdrPtr = (tblHeader_pt)headerPtr;
+    entryHeader_pt freeentryPtr;
+
+    freeentryPtr = HEADER_AREA (entryPtr);
+    freeentryPtr->freeLink = tblHdrPtr->freeHeadIdx;
+    tblHdrPtr->freeHeadIdx = (((ubyte_pt) entryPtr) - tblHdrPtr->bodyP) /
+                           tblHdrPtr->entrySize;
+    
+} /* Tcl_HandleFree */
+
diff --git a/src/tclx/src/tclxid.c b/src/tclx/src/tclxid.c
new file mode 100644 (file)
index 0000000..b23d7bb
--- /dev/null
@@ -0,0 +1,331 @@
+/*
+ * tclXid.c --
+ *
+ * Tcl commands to access getuid, setuid, getgid, setgid and friends.
+ *---------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXid.c,v 2.0 1992/10/16 04:50:51 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+/*
+ * Prototypes of internal functions.
+ */
+static int
+UseridToUsernameResult _ANSI_ARGS_((Tcl_Interp *interp,
+                                    int         userId));
+
+static int
+UsernameToUseridResult _ANSI_ARGS_((Tcl_Interp *interp,
+                                    char       *userName));
+
+static int
+GroupidToGroupnameResult _ANSI_ARGS_((Tcl_Interp *interp,
+                                      int         groupId));
+
+static int
+GroupnameToGroupidResult _ANSI_ARGS_((Tcl_Interp *interp,
+                                      char       *groupName));
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_IdCmd --
+ *     Implements the TCL id command:
+ *
+ *        id user [name]
+ *        id convert user <name>
+ *
+ *        id userid [uid]
+ *        id convert userid <uid>
+ *
+ *        id group [name]
+ *        id convert group <name>
+ *
+ *        id groupid [gid]
+ *        id convert groupid <gid>
+ *
+ *        id process
+ *        id process parent
+ *        id process group
+ *        id process group set
+ *
+ *        id effective user
+ *        id effective userid
+ *
+ *        id effective group
+ *        id effective groupid
+ *
+ * Results:
+ *  Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+
+static int
+UseridToUsernameResult (interp, userId)
+    Tcl_Interp *interp;
+    int         userId;
+{
+    struct passwd *pw = getpwuid (userId);
+    if (pw == NULL) {
+        char numBuf [32];
+
+        sprintf (numBuf, "%d", userId);
+        Tcl_AppendResult (interp, "unknown user id: ", numBuf, (char *) NULL);
+        return TCL_ERROR;
+    }
+    strcpy (interp->result, pw->pw_name);
+    return TCL_OK;
+}
+
+static int
+UsernameToUseridResult (interp, userName)
+    Tcl_Interp *interp;
+    char       *userName;
+{
+    struct passwd *pw = getpwnam (userName);
+    if (pw == NULL) {
+        Tcl_AppendResult (interp, "unknown user id: ", userName, 
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+    sprintf (interp->result, "%d", pw->pw_uid);
+    return TCL_OK;
+}
+
+static int
+GroupidToGroupnameResult (interp, groupId)
+    Tcl_Interp *interp;
+    int         groupId;
+{
+    struct group *grp = getgrgid (groupId);
+    if (grp == NULL) {
+        char numBuf [32];
+
+        sprintf (numBuf, "%d", groupId);
+        Tcl_AppendResult (interp, "unknown group id: ", numBuf, (char *) NULL);
+        return TCL_ERROR;
+    }
+    strcpy (interp->result, grp->gr_name);
+    return TCL_OK;
+}
+
+static int
+GroupnameToGroupidResult (interp, groupName)
+    Tcl_Interp *interp;
+    char       *groupName;
+{
+    struct group *grp = getgrnam (groupName);
+    if (grp == NULL) {
+        Tcl_AppendResult (interp, "unknown group id: ", groupName,
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+    sprintf (interp->result, "%d", grp->gr_gid);
+    return TCL_OK;
+}
+
+int
+Tcl_IdCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    struct passwd *pw;
+    struct group *grp;
+    int uid, gid;
+
+    if (argc < 2) 
+        goto bad_args;
+
+    /*
+     * If the first argument is "convert", handle the conversion.
+     */
+    if (STREQU (argv[1], "convert")) {
+        if (argc != 4) {
+            Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                              " convert arg arg", (char *) NULL);
+            return TCL_ERROR;
+        }
+
+        if (STREQU (argv[2], "user"))
+            return UsernameToUseridResult (interp, argv[3]);
+
+        if (STREQU (argv[2], "userid")) {
+            if (Tcl_GetInt (interp, argv[3], &uid) != TCL_OK) 
+                return TCL_ERROR;
+            return UseridToUsernameResult (interp, uid);
+        }
+
+        if (STREQU (argv[2], "group"))
+            return GroupnameToGroupidResult (interp, argv[3]);
+
+        if (STREQU (argv[2], "groupid")) {
+            if (Tcl_GetInt (interp, argv[3], &gid) != TCL_OK) return TCL_ERROR;
+            return GroupidToGroupnameResult (interp, gid);
+
+        }
+        goto bad_three_arg;
+    }
+
+    /*
+     * If the first argument is "effective", return the effective user ID,
+     * name, group ID or name.
+     */
+    if (STREQU (argv[1], "effective")) {
+        if (argc != 3) {
+            Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                              " effective arg", (char *) NULL);
+            return TCL_ERROR;
+        }
+
+        if (STREQU (argv[2], "user"))
+            return UseridToUsernameResult (interp, geteuid ());
+
+        if (STREQU (argv[2], "userid")) {
+            sprintf (interp->result, "%d", geteuid ());
+            return TCL_OK;
+        }
+
+        if (STREQU (argv[2], "group"))
+            return GroupidToGroupnameResult (interp, getegid ());
+
+        if (STREQU (argv[2], "groupid")) {
+            sprintf (interp->result, "%d", getegid ());
+            return TCL_OK;
+        }
+        goto bad_three_arg;
+    }
+
+    /*
+     * If the first argument is "process", return the process ID, parent's
+     * process ID, process group or set the process group depending on args.
+     */
+    if (STREQU (argv[1], "process")) {
+        if (argc == 2) {
+            sprintf (interp->result, "%d", getpid ());
+            return TCL_OK;
+        }
+
+        if (STREQU (argv[2], "parent")) {
+            if (argc != 3) {
+                Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                                  " process parent", (char *) NULL);
+                return TCL_ERROR;
+            }
+            sprintf (interp->result, "%d", getppid ());
+            return TCL_OK;
+        }
+        if (STREQU (argv[2], "group")) {
+            if (argc == 3) {
+                sprintf (interp->result, "%d", getpgrp ());
+                return TCL_OK;
+            }
+            if ((argc != 4) || !STREQU (argv[3], "set")) {
+                Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                                  " process group [set]", (char *) NULL);
+                return TCL_ERROR;
+            }
+            setpgrp ();
+            return TCL_OK;
+        }
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " process [parent|group|group set]", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    /*
+     * Handle setting or returning the user ID or group ID (by name or number).
+     */
+    if (argc > 3)
+        goto bad_args;
+
+    if (STREQU (argv[1], "user")) {
+        if (argc == 2) {
+            return UseridToUsernameResult (interp, getuid ());
+        } else {
+            pw = getpwnam (argv[2]);
+            if (pw == NULL)
+                goto name_doesnt_exist;
+            if (setuid (pw->pw_uid) < 0)
+                goto cannot_set_name;
+            return TCL_OK;
+        }
+    }
+
+    if (STREQU (argv[1], "userid")) {
+        if (argc == 2) {
+            sprintf (interp->result, "%d", getuid ());
+            return TCL_OK;
+        } else {
+            if (Tcl_GetInt (interp, argv[2], &uid) != TCL_OK)
+                return TCL_ERROR;
+            if (setuid (uid) < 0) 
+                goto cannot_set_name;
+            return TCL_OK;
+        }
+    }
+
+    if (STREQU (argv[1], "group")) {
+        if (argc == 2) {
+            return GroupidToGroupnameResult (interp, getgid ());
+        } else {
+            grp = getgrnam (argv[2]);
+            if (grp == NULL) 
+                goto name_doesnt_exist;
+            if (setgid (grp->gr_gid) < 0)
+                goto cannot_set_name;
+            return TCL_OK;
+        }
+    }
+
+    if (STREQU (argv[1], "groupid")) {
+        if (argc == 2) {
+            sprintf (interp->result, "%d", getgid ());
+            return TCL_OK;
+        } else {
+            if (Tcl_GetInt (interp, argv[2], &gid) != TCL_OK)
+                return TCL_ERROR;
+            if (setgid (gid) < 0)
+                goto cannot_set_name;
+            return TCL_OK;
+        }
+    }
+    Tcl_AppendResult (interp, "bad arg: ", argv [0], 
+                      " second arg must be convert, effective, process, ",
+                      "user, userid, group or groupid", (char *) NULL);
+    return TCL_ERROR;
+
+
+  bad_three_arg:
+    Tcl_AppendResult (interp, "bad arg: ", argv [0], ": ", argv[1],
+                      ": third arg must be user, userid, group or groupid",
+                      (char *) NULL);
+    return TCL_ERROR;
+  bad_args:
+    Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " arg [arg..]",
+                      (char *) NULL);
+    return TCL_ERROR;
+
+  name_doesnt_exist:
+    Tcl_AppendResult (interp, " \"", argv[2], "\" does not exists",
+                      (char *) NULL);
+    return TCL_ERROR;
+
+  cannot_set_name:
+    interp->result = Tcl_UnixError (interp);
+    return TCL_ERROR;
+}
diff --git a/src/tclx/src/tclxint.h b/src/tclx/src/tclxint.h
new file mode 100644 (file)
index 0000000..6a1dfee
--- /dev/null
@@ -0,0 +1,522 @@
+/*
+ * tclExtdInt.h
+ *
+ * Standard internal include file for Extended Tcl library..
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclExtdInt.h,v 2.0 1992/10/16 04:51:27 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#ifndef TCLEXTDINT_H
+#define TCLEXTDINT_H
+
+#include "tclxtend.h"
+#include "tclint.h"
+#include "tclunix.h"
+#include <sys/param.h>
+#include <unistd.h>
+
+
+#ifdef TCL_NEED_SYS_SELECT_H
+#   include "sys/select.h"
+#endif
+
+/*
+ * If tclUnix.h has already included time.h, don't include it again, some
+ * systems don't #ifdef inside of the file.  On some systems, undef
+ * CLK_TCK (defined in tclUnix.h) to avoid an annoying warning about
+ * redefinition.
+ */
+#ifdef TCL_NEED_TIME_H
+#    if TCL_SYS_TIME_H
+#        ifdef TCL_DUP_CLK_TCK
+#            undef CLK_TCK
+#        endif        
+#        include <time.h>
+#    endif
+#endif
+
+/*
+ * Precompute milliseconds-per-tick, the " + CLK_TCK / 2" bit gets it to
+ * round off instead of truncate.  Take care of defining CLK_TCK if its not
+ * defined.
+ */
+#ifndef CLK_TCK
+#    ifdef HZ
+#        define CLK_TCK HZ
+#    else
+#        define CLK_TCK 60
+#    endif
+#endif
+
+#define MS_PER_TICK ((1000 + CLK_TCK/2) / CLK_TCK)
+
+/*
+ * If tclUnix.h did not bring times.h, bring it in here.
+ */
+#if TCL_GETTOD
+#    include <sys/times.h>
+#endif 
+
+#include <values.h>
+#include <grp.h>
+/*
+ * On some systems this is not included by tclUnix.h.
+ */
+
+/*
+ * These should be take from an include file, but it got to be such a mess
+ * to get the include files right that they are here for good measure.
+ */
+struct tm *gmtime ();
+struct tm *localtime ();
+
+#ifndef MAXINT
+#    define BITSPERBYTE   8
+#    define BITS(type)    (BITSPERBYTE * (int)sizeof(type))
+#    define HIBITI        ((unsigned int)(1 << BITS(int) - 1))
+#    define MAXINT        ((int)(~HIBITI))
+#endif
+
+#ifndef MININT
+#    define MININT (-MAXINT)-1
+#endif
+
+#ifndef TRUE
+#    define TRUE   (1)
+#    define FALSE  (0)
+#endif
+
+/*
+ * Structure to hold a regular expression, plus a Boyer-Moore compiled
+ * pattern.
+ */
+
+typedef struct regexp_t {
+    regexp *progPtr;
+    char   *boyerMoorePtr;
+    int     noCase;
+    } regexp_t;
+typedef regexp_t *regexp_pt;
+/*
+ * Flags used by RegExpCompile:
+ */
+#define REXP_NO_CASE         1   /* Do matching regardless of case    */
+#define REXP_BOTH_ALGORITHMS 2   /* Use boyer-moore along with regexp */
+
+/*
+ * Data structure to control a dynamic buffer.  These buffers are primarly
+ * used for reading things from files, were the maximum size is not known
+ * in advance, and the buffer must grow.  These are used in the case were
+ * the value is not to be returned as the interpreter result.
+ */
+
+#define INIT_DYN_BUFFER_SIZE 256
+
+typedef struct dynamicBuf_t {
+    char  buf [INIT_DYN_BUFFER_SIZE];   /* Initial buffer area.              */
+    char *ptr;                          /* Pointer to buffer area.           */
+    int   size;                         /* Current size of buffer.           */
+    int   len;                          /* Current string length (less '\0') */
+    } dynamicBuf_t;
+
+/*
+ * Used to return argument messages by most commands.
+ */
+extern char *tclXWrongArgs;
+
+/*
+ * Macros to do string compares.  They pre-check the first character before
+ * checking of the strings are equal.
+ */
+
+#define STREQU(str1, str2) \
+        (((str1) [0] == (str2) [0]) && (strcmp (str1, str2) == 0))
+#define STRNEQU(str1, str2, cnt) \
+        (((str1) [0] == (str2) [0]) && (strncmp (str1, str2, cnt) == 0))
+
+/*
+ * Prototypes for utility procedures.
+ */
+void
+Tcl_DynBufInit _ANSI_ARGS_((dynamicBuf_t *dynBufPtr));
+
+void
+Tcl_DynBufFree _ANSI_ARGS_((dynamicBuf_t *dynBufPtr));
+
+void
+Tcl_DynBufReturn _ANSI_ARGS_((Tcl_Interp    *interp,
+                              dynamicBuf_t *dynBufPtr));
+
+void
+Tcl_DynBufAppend _ANSI_ARGS_((dynamicBuf_t *dynBufPtr,
+                              char         *newStr));
+
+void
+Tcl_ExpandDynBuf _ANSI_ARGS_((dynamicBuf_t *dynBufPtr,
+                              int           appendSize));
+
+int
+Tcl_DynamicFgets _ANSI_ARGS_((dynamicBuf_t *dynBufPtr,
+                              FILE         *filePtr,
+                              int           append));
+
+int
+Tcl_ConvertFileHandle _ANSI_ARGS_((Tcl_Interp *interp,
+                                  char       *handle));
+
+time_t
+Tcl_GetDate _ANSI_ARGS_((char   *p,
+                         time_t  now,
+                         long    zone));
+
+int
+Tcl_ProcessSignal _ANSI_ARGS_((Tcl_Interp *interp,
+                               int         cmdResultCode));
+
+void
+Tcl_RegExpClean _ANSI_ARGS_((regexp_pt regExpPtr));
+
+int
+Tcl_RegExpCompile _ANSI_ARGS_((Tcl_Interp  *interp,
+                               regexp_pt    regExpPtr,
+                               char        *expression,
+                               int          flags));
+
+int
+Tcl_RegExpExecute _ANSI_ARGS_((Tcl_Interp  *interp,
+                               regexp_pt    regExpPtr,
+                               char        *matchStrIn,
+                               char        *matchStrLower));
+void
+Tcl_ResetSignals ();
+
+int
+Tcl_ReturnDouble _ANSI_ARGS_((Tcl_Interp *interp,
+                              double      number));
+
+int
+Tcl_SetupFileEntry _ANSI_ARGS_((Tcl_Interp *interp,
+                                int         fileNum,
+                                int         readable,
+                                int         writable));
+
+/*
+ * Definitions required to initialize all extended commands.  These are either
+ * the command executors or initialization routines that do the command
+ * initialization.  The initialization routines are used when there is more
+ * to initializing the command that just binding the command name to the
+ * executor.  Usually, this means initializing some command local data via
+ * the ClientData mechanism.  The command executors should be declared to be of
+ * type `Tcl_CmdProc', but this blows up some compilers, so they are declared
+ * with an ANSI prototype.
+ */
+
+/*
+ * from tclXbsearch.c
+ */
+extern int 
+Tcl_BsearchCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXchmod.c
+ */
+extern int 
+Tcl_ChmodCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_ChownCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_ChgrpCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXclock.c
+ */
+extern int 
+Tcl_GetclockCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_FmtclockCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXcnvclock.c
+ */
+extern int 
+Tcl_ConvertclockCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXcmdloop.c
+ */
+extern int 
+Tcl_CommandloopCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXdebug.c
+ */
+extern void
+Tcl_InitDebug _ANSI_ARGS_((Tcl_Interp *interp));
+
+/*
+ * from tclXdup.c
+ */
+extern int 
+Tcl_DupCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXfcntl.c
+ */
+extern int 
+Tcl_FcntlCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXfilecmds.c
+ */
+extern int 
+Tcl_PipeCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_CopyfileCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_FstatCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_LgetsCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int
+Tcl_FlockCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int
+Tcl_FunlockCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXfilescan.c
+ */
+extern void
+Tcl_InitFilescan _ANSI_ARGS_((Tcl_Interp *interp));
+
+/*
+ * from tclXfmath.c
+ */
+extern int 
+Tcl_AcosCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_AsinCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_AtanCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_CosCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_SinCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_TanCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_CoshCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_SinhCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_TanhCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_ExpCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_LogCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_Log10Cmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_SqrtCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_FabsCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_FloorCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_CeilCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_FmodCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_PowCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXgeneral.c
+ */
+
+extern int 
+Tcl_EchoCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_InfoxCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_LoopCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXid.c
+ */
+extern int 
+Tcl_IdCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXkeylist.c
+ */
+extern int 
+Tcl_KeyldelCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_KeylgetCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_KeylkeysCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_KeylsetCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXlist.c
+ */
+extern int 
+Tcl_LvarpopCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_LvarcatCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_LvarpushCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_LemptyCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXmath.c
+ */
+extern int 
+Tcl_MaxCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_MinCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_RandomCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXmsgcat.c
+ */
+extern void
+Tcl_InitMsgCat _ANSI_ARGS_((Tcl_Interp *interp));
+
+/*
+ * from tclXprocess.c
+ */
+extern int 
+Tcl_ExeclCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_ForkCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_WaitCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXprofile.c
+ */
+void
+Tcl_InitProfile _ANSI_ARGS_((Tcl_Interp *interp));
+
+/*
+ * from tclXselect.c
+ */
+extern int 
+Tcl_SelectCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXsignal.c
+ */
+extern void
+Tcl_InitSignalHandling _ANSI_ARGS_((Tcl_Interp *interp));
+
+/*
+ * from tclXstring.c
+ */
+extern int 
+Tcl_CindexCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_ClengthCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_CrangeCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_ReplicateCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_TranslitCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_CtypeCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXlib.c
+ */
+extern int
+Tcl_Demand_loadCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int
+Tcl_LoadlibindexCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+/*
+ * from tclXunixcmds.c
+ */
+extern int 
+Tcl_AlarmCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_SleepCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_SystemCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_TimesCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_UmaskCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_LinkCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_UnlinkCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_MkdirCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+extern int 
+Tcl_RmdirCmd _ANSI_ARGS_((ClientData, Tcl_Interp*, int, char**));
+
+#endif
diff --git a/src/tclx/src/tclxklst.c b/src/tclx/src/tclxklst.c
new file mode 100644 (file)
index 0000000..109cbda
--- /dev/null
@@ -0,0 +1,844 @@
+/* 
+ * tclXkeylist.c --
+ *
+ *  Extended Tcl keyed list commands and interfaces.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXkeylist.c,v 2.0 1992/10/16 04:50:53 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+/*
+ * Type used to return information about a field that was found in a keyed
+ * list.
+ */
+typedef struct fieldInfo_t {
+        int    argc;
+        char **argv;
+        int    foundIdx;
+        char  *valuePtr;
+        int    valueSize;
+        } fieldInfo_t;
+
+/*
+ * Prototypes of internal functions.
+ */
+static int
+CompareKeyListField _ANSI_ARGS_((Tcl_Interp   *interp,
+                                 CONST char   *fieldName,
+                                 CONST char   *field,
+                                 char        **valuePtr,
+                                 int          *valueSizePtr));
+
+static int
+SplitAndFindField _ANSI_ARGS_((Tcl_Interp  *interp,
+                               CONST char  *fieldName,
+                               CONST char  *keyedList,
+                               fieldInfo_t *fieldInfoPtr));
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * CompareKeyListField --
+ *   Compare a field name to a field (keyword/value pair) to determine if
+ * the field names match.
+ *
+ * Parameters:
+ *   o interp (I/O) - Error message will be return in result if there is an
+ *     error.
+ *   o fieldName (I) - Field name to compare against field.
+ *   o field (I) - Field to see if its name matches.
+ *   o valuePtr (O) - If the field names match, a pointer to value part is
+ *     returned.
+ *   o valueSizePtr (O) - If the field names match, the length of the value
+ *     part is returned here.
+ * Returns:
+ *    TCL_OK - If the field names match.
+ *    TCL_BREAK - If the fields names don't match.
+ *    TCL_ERROR -  If the list has an invalid format.
+ *-----------------------------------------------------------------------------
+ */
+static int
+CompareKeyListField (interp, fieldName, field, valuePtr, valueSizePtr)
+    Tcl_Interp   *interp;
+    CONST char   *fieldName;
+    CONST char   *field;
+    char        **valuePtr;
+    int          *valueSizePtr; 
+{
+    char *elementPtr, *nextPtr;
+    int   fieldNameSize, elementSize;
+
+    if (field [0] == '\0') {
+        interp->result =
+            "invalid keyed list format: list contains an empty field entry";
+        return TCL_ERROR;
+    }
+    if (TclFindElement (interp, (char *) field, &elementPtr, &nextPtr, 
+                        &elementSize, NULL) != TCL_OK)
+        return TCL_ERROR;
+    if (elementSize == 0) {
+        interp->result =
+            "invalid keyed list format: list contains an empty field name";
+        return TCL_ERROR;
+    }
+    if (nextPtr[0] == '\0') {
+        Tcl_AppendResult (interp, "invalid keyed list format or inconsistent ",
+                          "field name scoping: no value associated with ",
+                          "field \"", elementPtr, "\"", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    fieldNameSize = strlen ((char *) fieldName);
+    if (!((elementSize == fieldNameSize) && 
+            STRNEQU (elementPtr, ((char *) fieldName), fieldNameSize)))
+        return TCL_BREAK;   /* Names do not match */
+
+    /*
+     * Extract the value from the list.
+     */
+    if (TclFindElement (interp, nextPtr, &elementPtr, &nextPtr, &elementSize, 
+                        NULL) != TCL_OK)
+        return TCL_ERROR;
+    if (nextPtr[0] != '\0') {
+        Tcl_AppendResult (interp, "invalid keyed list format: ",
+                          "trailing data following value in field: \"",
+                          elementPtr, "\"", (char *) NULL);
+        return TCL_ERROR;
+    }
+    *valuePtr = elementPtr;
+    *valueSizePtr = elementSize;
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * SplitAndFindField --
+ *   Split a keyed list into an argv and locate a field (key/value pair)
+ * in the list.
+ *
+ * Parameters:
+ *   o interp (I/O) - Error message will be return in result if there is an
+ *     error.
+ *   o fieldName (I) - The name of the field to find.  Will validate that the
+ *     name is not empty.  If the name has a sub-name (seperated by "."),
+ *     search for the top level name.
+ *   o fieldInfoPtr (O) - The following fields are filled in:
+ *       o argc - The number of elements in the keyed list.
+ *       o argv - The keyed list argv is returned here, even if the key was
+ *         not found.  Client must free.  Will be NULL is an error occurs.
+ *       o foundIdx - The argv index containing the list entry that matches
+ *         the field name, or -1 if the key was not found.
+ *       o valuePtr - Pointer to the value part of the found element. NULL
+ *         in not found.
+ *       o valueSize - The size of the value part.
+ * Returns:
+ *   Standard Tcl result.
+ *-----------------------------------------------------------------------------
+ */
+static int
+SplitAndFindField (interp, fieldName, keyedList, fieldInfoPtr)
+    Tcl_Interp  *interp;
+    CONST char  *fieldName;
+    CONST char  *keyedList;
+    fieldInfo_t *fieldInfoPtr;
+{
+    int  idx, result;
+
+    if (fieldName == '\0') {
+        interp->result = "null key not allowed";
+        return TCL_ERROR;
+    }
+
+    fieldInfoPtr->argv = NULL;
+
+    if (Tcl_SplitList (interp, (char *) keyedList, &fieldInfoPtr->argc,
+                       &fieldInfoPtr->argv) != TCL_OK)
+        goto errorExit;
+
+    result = TCL_BREAK;
+    for (idx = 0; idx < fieldInfoPtr->argc; idx++) {
+        result = CompareKeyListField (interp, fieldName, 
+                                      fieldInfoPtr->argv [idx],
+                                      &fieldInfoPtr->valuePtr,
+                                      &fieldInfoPtr->valueSize);
+        if (result != TCL_BREAK)
+            break;  /* Found or error, exit before idx is incremented. */
+    }
+    if (result == TCL_ERROR)
+        goto errorExit;
+
+    if (result == TCL_BREAK) {
+        fieldInfoPtr->foundIdx = -1;  /* Not found */
+        fieldInfoPtr->valuePtr = NULL;
+    } else {
+        fieldInfoPtr->foundIdx = idx;
+    }
+    return TCL_OK;
+
+errorExit:
+    if (fieldInfoPtr->argv != NULL)
+        ckfree (fieldInfoPtr->argv);
+    fieldInfoPtr->argv = NULL;
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_GetKeyedListKeys --
+ *   Retrieve a list of keyes from a keyed list.  The list is walked rather
+ * than converted to a argv for increased performance.
+ *
+ * Parameters:
+ *   o interp (I/O) - Error message will be return in result if there is an
+ *     error.
+ *   o subFieldName (I) - If "" or NULL, then the keys are retreved for
+ *     the top level of the list.  If specified, it is name of the field who's
+ *     subfield keys are to be retrieve.
+ *   o keyedList (I) - The list to search for the field.
+ *   o keyesArgcPtr (O) - The number of keys in the keyed list is returned
+ *     here.
+ *   o keyesArgvPtr (O) - An argv containing the key names.  It is dynamically
+ *     allocated, containing both the array and the strings. A single call
+ *     to ckfree will release it.
+ * Returns:
+ *   TCL_OK - If the field was found.
+ *   TCL_BREAK - If the field was not found.
+ *   TCL_ERROR - If an error occured.
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_GetKeyedListKeys (interp, subFieldName, keyedList, keyesArgcPtr,
+                      keyesArgvPtr)
+    Tcl_Interp  *interp;
+    CONST char  *subFieldName;
+    CONST char  *keyedList;
+    int         *keyesArgcPtr;
+    char      ***keyesArgvPtr;
+{
+    char  *scanPtr, *subFieldList;
+    int    result, keyCount, totalKeySize, idx;
+    char  *fieldPtr, *keyPtr, *nextByte, *dummyPtr;
+    int    fieldSize,  keySize;
+    char **keyArgv;
+
+    /*
+     * If the keys of a subfield are requested, the dig out that field's
+     * list and then rummage through in getting the keys.
+     */
+    subFieldList = NULL;
+    if ((subFieldName != NULL) && (subFieldName [0] != '\0')) {
+        result = Tcl_GetKeyedListField (interp, subFieldName, keyedList,
+                                        &subFieldList);
+        if (result != TCL_OK)
+            return result;
+        keyedList = subFieldList;
+    }
+
+    /*
+     * Walk the list count the number of field names and their length.
+     */
+    keyCount = 0;
+    totalKeySize = 0;    
+    scanPtr = (char *) keyedList;
+
+    while (*scanPtr != '\0') {
+        result = TclFindElement (interp, scanPtr, &fieldPtr, &scanPtr, 
+                                 &fieldSize, NULL);
+        if (result != TCL_OK)
+            goto errorExit;
+        result = TclFindElement (interp, fieldPtr, &keyPtr, &dummyPtr,
+                                 &keySize, NULL);
+        if (result != TCL_OK)
+            goto errorExit;
+
+        keyCount++;
+        totalKeySize += keySize + 1;
+    }
+
+    /*
+     * Allocate a structure to hold both the argv and strings.
+     */
+    keyArgv = (char **) ckalloc (((keyCount + 1) * sizeof (char *)) +
+                                 totalKeySize);
+    keyArgv [keyCount] = NULL;
+    nextByte = ((char *) keyArgv) + ((keyCount + 1) * sizeof (char *));
+
+    /*
+     * Walk the list once more, copying in the strings and building up the
+     * argv.
+     */
+    scanPtr = (char *) keyedList;
+    idx = 0;
+
+    while (*scanPtr != '\0') {
+        TclFindElement (interp, scanPtr, &fieldPtr, &scanPtr, &fieldSize,
+                        NULL);
+        TclFindElement (interp, fieldPtr, &keyPtr, &dummyPtr, &keySize, NULL);
+        keyArgv [idx++] = nextByte;
+        strncpy (nextByte, keyPtr, keySize);
+        nextByte [keySize] = '\0';
+        nextByte += keySize + 1; 
+    }
+    *keyesArgcPtr = keyCount;
+    *keyesArgvPtr = keyArgv;
+    
+    if (subFieldList != NULL)
+        ckfree (subFieldList);
+    return TCL_OK;
+
+  errorExit:
+    if (subFieldList != NULL)
+        ckfree (subFieldList);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_GetKeyedListField --
+ *   Retrieve a field value from a keyed list.  The list is walked rather than
+ * converted to a argv for increased performance.  This if the name contains
+ * sub-fields, this function recursive.
+ *
+ * Parameters:
+ *   o interp (I/O) - Error message will be return in result if there is an
+ *     error.
+ *   o fieldName (I) - The name of the field to extract.  Will recusively
+ *     process sub-field names seperated by `.'.
+ *   o keyedList (I) - The list to search for the field.
+ *   o fieldValuePtr (O) - If the field is found, a pointer to a dynamicly
+ *     allocated string containing the value is returned here.  If NULL is
+ *     specified, then only the presence of the field is validated, the
+ *     value is not returned.
+ * Returns:
+ *   TCL_OK - If the field was found.
+ *   TCL_BREAK - If the field was not found.
+ *   TCL_ERROR - If an error occured.
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_GetKeyedListField (interp, fieldName, keyedList, fieldValuePtr)
+    Tcl_Interp  *interp;
+    CONST char  *fieldName;
+    CONST char  *keyedList;
+    char       **fieldValuePtr;
+{
+    char *nameSeparPtr, *scanPtr, *valuePtr;
+    int   valueSize, result;
+
+    if (fieldName == '\0') {
+        interp->result = "null key not allowed";
+        return TCL_ERROR;
+    }
+
+    /*
+     * Check for sub-names, temporarly delimit the top name with a '\0'.
+     */
+    nameSeparPtr = strchr ((char *) fieldName, '.');
+    if (nameSeparPtr != NULL)
+        *nameSeparPtr = '\0';
+
+    /*
+     * Walk the list looking for a field name that matches.
+     */
+    scanPtr = (char *) keyedList;
+    result = TCL_BREAK;   /* Assume not found */
+
+    while (*scanPtr != '\0') {
+        char *fieldPtr;
+        int   fieldSize;
+        char  saveChar;
+
+        result = TclFindElement (interp, scanPtr, &fieldPtr, &scanPtr, 
+                                 &fieldSize, NULL);
+        if (result != TCL_OK)
+            break;
+
+        saveChar = fieldPtr [fieldSize];
+        fieldPtr [fieldSize] = '\0';
+
+        result = CompareKeyListField (interp, (char *) fieldName, fieldPtr,
+                                      &valuePtr, &valueSize);
+        fieldPtr [fieldSize] = saveChar;
+        if (result != TCL_BREAK)
+            break;  /* Found or an error */
+    }
+
+    if (result != TCL_OK)
+        goto exitPoint;   /* Not found or an error */
+
+    /*
+     * If a subfield is requested, recurse to get the value otherwise allocate
+     * a buffer to hold the value.
+     */
+    if (nameSeparPtr != NULL) {
+        char  saveChar;
+
+        saveChar = valuePtr [valueSize];
+        valuePtr [valueSize] = '\0';
+        result = Tcl_GetKeyedListField (interp, nameSeparPtr+1, valuePtr, 
+                                        fieldValuePtr);
+        valuePtr [valueSize] = saveChar;
+    } else {
+        if (fieldValuePtr != NULL) {
+            char *fieldValue;
+
+            fieldValue = ckalloc (valueSize + 1);
+            strncpy (fieldValue, valuePtr, valueSize);
+            fieldValue [valueSize] = '\0';
+            *fieldValuePtr = fieldValue;
+        }
+    }
+exitPoint:
+    if (nameSeparPtr != NULL)
+         *nameSeparPtr = '.';
+    return result;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_SetKeyedListField --
+ *   Set a field value in keyed list.
+ *
+ * Parameters:
+ *   o interp (I/O) - Error message will be return in result if there is an
+ *     error.
+ *   o fieldName (I) - The name of the field to extract.  Will recusively
+ *     process sub-field names seperated by `.'.
+ *   o fieldValue (I) - The value to set for the field.
+ *   o keyedList (I) - The keyed list to set a field value in, may be an
+ *     NULL or an empty list to create a new keyed list.
+ * Returns:
+ *   A pointer to a dynamically allocated string, or NULL if an error
+ *   occured.
+ *-----------------------------------------------------------------------------
+ */
+char *
+Tcl_SetKeyedListField (interp, fieldName, fieldValue, keyedList)
+    Tcl_Interp  *interp;
+    CONST char  *fieldName;
+    CONST char  *fieldValue;
+    CONST char  *keyedList;
+{
+    char        *nameSeparPtr;
+    char        *newField = NULL, *newList;
+    fieldInfo_t  fieldInfo;
+    char        *elemArgv [2];
+
+    if (keyedList == NULL)
+        keyedList = "";
+
+    /*
+     * Check for sub-names, temporarly delimit the top name with a '\0'.
+     */
+    nameSeparPtr = strchr ((char *) fieldName, '.');
+    if (nameSeparPtr != NULL)
+        *nameSeparPtr = '\0';
+
+    if (SplitAndFindField (interp, fieldName, keyedList, &fieldInfo) != TCL_OK)
+        goto errorExit;
+
+    /*
+     * Either recursively retrieve build the field value or just use the
+     * supplied value.
+     */
+    elemArgv [0] = (char *) fieldName;
+    if (nameSeparPtr != NULL) {
+        char saveChar;
+
+        if (fieldInfo.valuePtr != NULL) {
+            saveChar = fieldInfo.valuePtr [fieldInfo.valueSize];
+            fieldInfo.valuePtr [fieldInfo.valueSize] = '\0';
+        }
+        elemArgv [1] = Tcl_SetKeyedListField (interp, nameSeparPtr+1,
+                                              fieldValue, fieldInfo.valuePtr);
+
+        if (fieldInfo.valuePtr != NULL)
+            fieldInfo.valuePtr [fieldInfo.valueSize] = saveChar;
+        if (elemArgv [1] == NULL)
+            goto errorExit;
+        newField = Tcl_Merge (2, elemArgv);
+        ckfree (elemArgv [1]);
+    } else {
+        elemArgv [1] = (char *) fieldValue;
+        newField = Tcl_Merge (2, elemArgv);
+    }
+
+    /*
+     * If the field does not current exist in the keyed list, append it,
+     * otherwise replace it.
+     */
+    if (fieldInfo.foundIdx == -1) {
+        fieldInfo.foundIdx = fieldInfo.argc;
+        fieldInfo.argc++;
+    }
+
+    fieldInfo.argv [fieldInfo.foundIdx] = newField;
+    newList = Tcl_Merge (fieldInfo.argc, fieldInfo.argv);
+
+    if (nameSeparPtr != NULL)
+         *nameSeparPtr = '.';
+    ckfree ((char *) newField);
+    ckfree ((char *) fieldInfo.argv);
+    return newList;
+
+errorExit:
+    if (nameSeparPtr != NULL)
+         *nameSeparPtr = '.';
+    if (newField != NULL)
+        ckfree ((char *) newField);
+    if (fieldInfo.argv != NULL)
+        ckfree ((char *) fieldInfo.argv);
+    return NULL;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_DeleteKeyedListField --
+ *   Delete a field value in keyed list.
+ *
+ * Parameters:
+ *   o interp (I/O) - Error message will be return in result if there is an
+ *     error.
+ *   o fieldName (I) - The name of the field to extract.  Will recusively
+ *     process sub-field names seperated by `.'.
+ *   o fieldValue (I) - The value to set for the field.
+ *   o keyedList (I) - The keyed list to delete the field from.
+ * Returns:
+ *   A pointer to a dynamically allocated string containing the new list, or
+ *   NULL if an error occured.
+ *-----------------------------------------------------------------------------
+ */
+char *
+Tcl_DeleteKeyedListField (interp, fieldName, keyedList)
+    Tcl_Interp  *interp;
+    CONST char  *fieldName;
+    CONST char  *keyedList;
+{
+    char        *nameSeparPtr;
+    char        *newList;
+    int          idx;
+    fieldInfo_t  fieldInfo;
+    char        *elemArgv [2];
+    char        *newElement;
+    /*
+     * Check for sub-names, temporarly delimit the top name with a '\0'.
+     */
+    nameSeparPtr = strchr ((char *) fieldName, '.');
+    if (nameSeparPtr != NULL)
+        *nameSeparPtr = '\0';
+
+    if (SplitAndFindField (interp, fieldName, keyedList, &fieldInfo) != TCL_OK)
+        goto errorExit;
+
+    if (fieldInfo.foundIdx == -1) {
+        Tcl_AppendResult (interp, "field name not found: \"",  fieldName,
+                          "\"", (char *) NULL);
+        goto errorExit;
+    }
+
+    /*
+     * If sub-field, recurse down to find the field to delete. If empty field
+     * returned or no sub-field, delete the found entry by moving everything
+     * up in the argv.
+     */
+    elemArgv [0] = (char *) fieldName;
+    if (nameSeparPtr != NULL) {
+        char saveChar;
+
+        if (fieldInfo.valuePtr != NULL) {
+            saveChar = fieldInfo.valuePtr [fieldInfo.valueSize];
+            fieldInfo.valuePtr [fieldInfo.valueSize] = '\0';
+        }
+        elemArgv [1] = Tcl_DeleteKeyedListField (interp, nameSeparPtr+1, 
+                                                 fieldInfo.valuePtr);
+        if (fieldInfo.valuePtr != NULL)
+            fieldInfo.valuePtr [fieldInfo.valueSize] = saveChar;
+        if (elemArgv [1] == NULL)
+            goto errorExit;
+        if (elemArgv [1][0] == '\0')
+            newElement = NULL;
+        else
+            newElement = Tcl_Merge (2, elemArgv);
+        ckfree (elemArgv [1]);
+    } else
+        newElement = NULL;
+
+    if (newElement == NULL) {
+        for (idx = fieldInfo.foundIdx; idx < fieldInfo.argc; idx++)
+             fieldInfo.argv [idx] = fieldInfo.argv [idx + 1];
+        fieldInfo.argc--;
+    } else
+        fieldInfo.argv [fieldInfo.foundIdx] = newElement;
+
+    newList = Tcl_Merge (fieldInfo.argc, fieldInfo.argv);
+
+    if (nameSeparPtr != NULL)
+         *nameSeparPtr = '.';
+    if (newElement != NULL)
+        ckfree (newElement);
+    ckfree ((char *) fieldInfo.argv);
+    return newList;
+
+errorExit:
+    if (nameSeparPtr != NULL)
+         *nameSeparPtr = '.';
+    if (fieldInfo.argv != NULL)
+         ckfree ((char *) fieldInfo.argv);
+    return NULL;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_KeyldelCmd --
+ *     Implements the TCL keyldel command:
+ *         keyldel listvar key
+ *
+ * Results:
+ *    Standard TCL results.
+ *
+ *----------------------------------------------------------------------------
+ */
+int
+Tcl_KeyldelCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    char  *keyedList, *newList;
+    int    listArgc, fieldIdx, idx;
+    char **listArgv;
+    char  *varPtr;
+
+    if (argc != 3) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0],
+                          " listvar key", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    keyedList = Tcl_GetVar (interp, argv[1], TCL_LEAVE_ERR_MSG);
+    if (keyedList == NULL)
+        return TCL_ERROR;
+
+    newList = Tcl_DeleteKeyedListField (interp, argv [2], keyedList);
+    if (newList == NULL)
+        return TCL_ERROR;
+
+    varPtr = Tcl_SetVar (interp, argv [1], newList, TCL_LEAVE_ERR_MSG);
+    ckfree ((char *) newList);
+
+    return (varPtr == NULL) ? TCL_ERROR : TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_KeylgetCmd --
+ *     Implements the TCL keylget command:
+ *         keylget listvar [key] [retvar | {}]
+ *
+ * Results:
+ *    Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_KeylgetCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    char   *keyedList;
+    char   *fieldValue;
+    char  **fieldValuePtr;
+    int     result;
+
+    if ((argc < 2) || (argc > 4)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0],
+                          " listvar [key] [retvar | {}]", (char *) NULL);
+        return TCL_ERROR;
+    }
+    keyedList = Tcl_GetVar (interp, argv[1], TCL_LEAVE_ERR_MSG);
+    if (keyedList == NULL)
+        return TCL_ERROR;
+
+    /*
+     * Handle request for list of keys, use keylkeys command.
+     */
+    if (argc == 2)
+        return Tcl_KeylkeysCmd (clientData, interp, argc, argv);
+
+    /*
+     * Handle retrieving a value for a specified key.
+     */
+    if (argv [2] == '\0') {
+        interp->result = "null key not allowed";
+        return TCL_ERROR;
+    }
+    if ((argc == 4) && (argv [3][0] == '\0'))
+        fieldValuePtr = NULL;
+    else
+        fieldValuePtr = &fieldValue;
+
+    result = Tcl_GetKeyedListField (interp, argv [2], keyedList,
+                                    fieldValuePtr);
+    if (result == TCL_ERROR)
+        return TCL_ERROR;
+
+    /*
+     * Handle field name not found.
+     */
+    if (result == TCL_BREAK) {
+        if (argc == 3) {
+            Tcl_AppendResult (interp, "key \"", argv [2], 
+                              "\" not found in keyed list", (char *) NULL);
+            return TCL_ERROR;
+        } else {
+            interp->result = "0";
+            return TCL_OK;
+        }
+    }
+
+    /*
+     * Handle field name found and return in the result.
+     */
+    if (argc == 3) {
+        Tcl_SetResult (interp, fieldValue, TCL_DYNAMIC);
+        return TCL_OK;
+    }
+
+    /*
+     * Handle null return variable specified and key was found.
+     */
+    if (argv [3][0] == '\0') {
+        interp->result = "1";
+        return TCL_OK;
+    }
+
+    /*
+     * Handle returning the value to the variable.
+     */
+    if (Tcl_SetVar (interp, argv [3], fieldValue, TCL_LEAVE_ERR_MSG) == NULL)
+        result = TCL_ERROR;
+    else
+        result = TCL_OK;
+    ckfree (fieldValue);
+    interp->result = "1";
+    return result;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_KeylkeysCmd --
+ *     Implements the TCL keylkeys command:
+ *         keylkeys listvar [key]
+ *
+ * Results:
+ *    Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_KeylkeysCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    char   *keyedList, **keyesArgv;
+    int    result, keyesArgc;
+
+    if ((argc < 2) || (argc > 3)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0],
+                          " listvar [key]", (char *) NULL);
+        return TCL_ERROR;
+    }
+    keyedList = Tcl_GetVar (interp, argv[1], TCL_LEAVE_ERR_MSG);
+    if (keyedList == NULL)
+        return TCL_ERROR;
+
+    /*
+     * If key argument is not specified, then argv [2] is NULL, meaning get
+     * top level keys.
+     */
+    result = Tcl_GetKeyedListKeys (interp, argv [2], keyedList, &keyesArgc,
+                                   &keyesArgv);
+    if (result == TCL_ERROR)
+        return TCL_ERROR;
+    if (result  == TCL_BREAK) {
+        Tcl_AppendResult (interp, "field name not found: \"",  argv [2],
+                          "\"", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    Tcl_SetResult (interp, Tcl_Merge (keyesArgc, keyesArgv), TCL_DYNAMIC);
+    ckfree (keyesArgv);
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_KeylsetCmd --
+ *     Implements the TCL keylset command:
+ *         keylset listvar key value [key value...]
+ *
+ * Results:
+ *    Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_KeylsetCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    char *keyedList, *newList, *prevList;
+    char *varPtr;
+    int   idx;
+
+    if ((argc < 4) || ((argc % 2) != 0)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0],
+                          " listvar key value [key value...]", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    keyedList = Tcl_GetVar (interp, argv[1], 0);
+    
+    newList = keyedList;
+    for (idx = 2; idx < argc; idx += 2) {
+        prevList = newList;
+        newList = Tcl_SetKeyedListField (interp, argv [idx], argv [idx + 1],
+                                         prevList);
+        if (prevList != keyedList)
+            ckfree (prevList);
+        if (newList == NULL)
+           return TCL_ERROR;
+    }
+    varPtr = Tcl_SetVar (interp, argv [1], newList, TCL_LEAVE_ERR_MSG);
+    ckfree ((char *) newList);
+
+    return (varPtr == NULL) ? TCL_ERROR : TCL_OK;
+}
diff --git a/src/tclx/src/tclxlib.c b/src/tclx/src/tclxlib.c
new file mode 100644 (file)
index 0000000..61d0a83
--- /dev/null
@@ -0,0 +1,1505 @@
+/*
+ * tclXlib.c --
+ *
+ * Tcl commands to load libraries of Tcl code.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXlib.c,v 2.0 1992/10/16 04:50:55 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+/*-----------------------------------------------------------------------------
+ *
+ * The following data structures are used by the Tcl library code. All
+ * structures are kept in the global array TCLENV, so that Tcl procs may be
+ * written to access them.
+ *
+ *  o fileId - This is a small string used to uniquely identify a file, it is
+ *    in the form "@$dev:$inode", where dev and inode are the values obtained
+ *    from stat.
+ *
+ *  o TCLENV(fileId} filePath - This entry translates a file id to an
+ *    file name, which may be an absolute path to a file or the name of 
+ *    a file to find by searching a path.
+ *
+ *  o TCLENV(PKG:$packageName) {$fileId $offset $length} - This entry
+ *    translates a package name into a fileId of the file containing the
+ *    package and the byte and offset length of the package within the file.
+ *    
+ *  o TCLENV(PROC:$proc) {P $packageName} - This form of a procedure entry
+ *    translates a procedure into a package name.
+ *
+ *  o TCLENV(PROC:$proc) {F $fileName} 0 - This form of a procedure entry
+ *    translates a procedure into a file name.  The file name may be an
+ *    absolute path to the file or a file to be found by searching TCLPATH
+ *    or auto_path.
+ *-----------------------------------------------------------------------------
+ */
+#include "tclxint.h"
+
+typedef char fileId_t [64];
+
+/*
+ * Prototypes of internal functions.
+ */
+static int
+EvalFilePart _ANSI_ARGS_((Tcl_Interp  *interp,
+                          char        *fileName,
+                          long         offset,
+                          unsigned     length));
+
+static char *
+MakeAbsFile _ANSI_ARGS_((Tcl_Interp  *interp,
+                         char        *fileName,
+                         char        *buffer,
+                         int          bufferSize));
+
+static int
+GenerateFileId _ANSI_ARGS_((Tcl_Interp *interp,
+                            char       *filePath,
+                            fileId_t    fileId));
+
+static int
+SetTCLENVFileIdEntry _ANSI_ARGS_((Tcl_Interp *interp,
+                                  fileId_t    fileId,
+                                  char       *filePath));
+
+static int
+CheckTCLENVFileIdEntry _ANSI_ARGS_((Tcl_Interp *interp,
+                                    char       *filePath));
+     
+static char *
+GetTCLENVFileIdEntry  _ANSI_ARGS_((Tcl_Interp  *interp,
+                                   fileId_t     fileId));
+
+static int
+SetTCLENVPkgEntry _ANSI_ARGS_((Tcl_Interp *interp,
+                               char       *packageName,
+                               fileId_t    fileId,
+                               char       *offset,
+                               char       *length));
+
+static int
+GetTCLENVPkgEntry _ANSI_ARGS_((Tcl_Interp *interp,
+                               char       *packageName,
+                               char       *fileId,
+                               long       *offsetPtr,
+                               unsigned   *lengthPtr));
+
+static int
+SetTCLENVProcEntry _ANSI_ARGS_((Tcl_Interp *interp,
+                                char       *procName,
+                                char       *type,
+                                char       *location));
+
+static int
+GetTCLENVProcEntry  _ANSI_ARGS_((Tcl_Interp *interp,
+                                 char       *procName,
+                                 char       *typePtr,
+                                 char      **locationPtr));
+
+static int
+ProcessIndexFile _ANSI_ARGS_((Tcl_Interp *interp,
+                              char       *tlibFilePath,
+                              char       *tndxFilePath));
+
+static int
+BuildPackageIndex  _ANSI_ARGS_((Tcl_Interp *interp,
+                                char       *tlibFilePath));
+
+static int
+LoadPackageIndex _ANSI_ARGS_((Tcl_Interp *interp,
+                              char       *tlibFilePath,
+                              int         pathLen,
+                              int         dirLen));
+
+static int
+LoadOusterIndex _ANSI_ARGS_((Tcl_Interp *interp,
+                             char       *indexFilePath,
+                             int         dirLen));
+
+static int
+LoadDirIndexes _ANSI_ARGS_((Tcl_Interp  *interp,
+                            char        *dirName));
+
+static int
+LoadPackageIndexes _ANSI_ARGS_((Tcl_Interp  *interp,
+                                char        *path));
+
+static int
+LoadProc _ANSI_ARGS_((Tcl_Interp  *interp,
+                      char        *procName,
+                      int         *foundPtr));
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * EvalFilePart --
+ *
+ *   Read in a byte range of a file and evaulate it.
+ *
+ * Parameters:
+ *   o interp (I) - A pointer to the interpreter, error returned in result.
+ *   o fileName (I) - The file to evaulate.
+ *   o offset (I) - Byte offset into the file of the area to evaluate
+ *   o length (I) - Number of bytes to evaulate..
+ *
+ * Results:
+ *   A standard Tcl result.
+ *-----------------------------------------------------------------------------
+ */
+static int
+EvalFilePart (interp, fileName, offset, length)
+    Tcl_Interp  *interp;
+    char        *fileName;
+    long         offset;
+    unsigned     length;
+{
+    Interp       *iPtr = (Interp *) interp;
+    int           fileNum, result;
+    struct stat   statBuf;
+    char         *oldScriptFile, *cmdBuffer;
+
+
+    if (fileName [0] == '~')
+        if ((fileName = Tcl_TildeSubst (interp, fileName)) == NULL)
+            return TCL_ERROR;
+
+    fileNum = open (fileName, O_RDONLY, 0);
+    if (fileNum < 0) {
+        Tcl_AppendResult (interp, "open failed on: ", fileName, ": ",
+                          Tcl_UnixError (interp), (char *) NULL);
+        return TCL_ERROR;
+    }
+    if (fstat (fileNum, &statBuf) == -1)
+        goto accessError;
+
+    if ((statBuf.st_size < offset + length) || (offset < 0)) {
+        Tcl_AppendResult (interp, "range to eval outside of file bounds \"",
+                          fileName, "\"", (char *) NULL);
+        close (fileNum);
+        return TCL_ERROR;
+    }
+    if (lseek (fileNum, offset, 0) < 0)
+        goto accessError;
+
+    cmdBuffer = ckalloc (length + 1);
+    if (read (fileNum, cmdBuffer, length) != length)
+        goto accessError;
+
+    cmdBuffer [length] = '\0';
+
+    if (close (fileNum) != 0)
+        goto accessError;
+
+    oldScriptFile = iPtr->scriptFile;
+    iPtr->scriptFile = fileName;
+
+    result = Tcl_Eval (interp, cmdBuffer, 0, (char **) NULL);
+
+    iPtr->scriptFile = oldScriptFile;
+    ckfree (cmdBuffer);
+                         
+    if (result != TCL_ERROR)
+        return TCL_OK;
+
+    /*
+     * An error occured. Record information telling where it came from.
+     */
+    {
+        char buf [100];
+        sprintf (buf, "\n    (file \"%.50s\" line %d)", fileName,
+                 interp->errorLine);
+        Tcl_AddErrorInfo(interp, buf);
+    }
+    return TCL_ERROR;
+
+    /*
+     * Errors accessing the file once its opened are handled here.
+     */
+  accessError:
+    Tcl_AppendResult (interp, "error accessing: ", fileName, ": ",
+                      Tcl_UnixError (interp), (char *) NULL);
+
+    close (fileNum);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * MakeAbsFile --
+ *
+ * Convert a file name to an absolute path.  This handles tilde substitution
+ * and preappend the current directory name if the path is relative.
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter, error returned in result.
+ *   o fileName (I) - File name (should not start with a "/").
+ *   o buffer (O) - Buffer to store string in, if it will fit.
+ *   o bufferSize (I) - Size of buffer.
+ * Returns:
+ *   A pointer to the file name.  If the string would fit in buffer, then
+ * a pointer to buffer is returned, otherwise a dynamicaly allocated file
+ * name.   NULL is returned if an error occured.
+ *-----------------------------------------------------------------------------
+ */
+static char *
+MakeAbsFile (interp, fileName, buffer, bufferSize)
+    Tcl_Interp  *interp;
+    char        *fileName;
+    char        *buffer;
+    int          bufferSize;
+{
+    char   curDir [MAXPATHLEN+1];
+    char  *pathName;
+    int    pathLen;
+
+    if (fileName [0] == '~') {
+        fileName = Tcl_TildeSubst (interp, fileName);
+        if (fileName == NULL)
+            return NULL;
+        pathLen = strlen (fileName);
+        if (pathLen < bufferSize)
+            pathName = buffer;
+        else
+            pathName = ckalloc (pathLen + 1);
+        strcpy (pathName, fileName);
+        return pathName;
+    }
+
+#if TCL_GETWD
+    if (getwd (curDir) == NULL) {
+        Tcl_AppendResult (interp, "error getting working directory name: ",
+                          curDir, (char *) NULL);
+    }
+#else
+    if (getcwd (curDir, MAXPATHLEN) == 0) {
+        Tcl_AppendResult (interp, "error getting working directory name: ",
+                          Tcl_UnixError (interp), (char *) NULL);
+    }
+#endif
+    pathLen = strlen (curDir) + strlen (fileName) + 1;  /* For `/' */
+    if (pathLen < bufferSize)
+        pathName = buffer;
+    else
+        pathName = ckalloc (pathLen + 1);
+    strcpy (pathName, curDir);
+    strcat (pathName, "/");
+    strcat (pathName, fileName);
+
+    return pathName;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * GenerateFileId --
+ *
+ * Given a path to a file, generate its file Id, in the form:
+ *
+ *     "@dev:inode"
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter, error returned in result.
+ *   o filepath (I) - Absolute path to the file.
+ *   o fileId (O) - File id is returned here.
+ * Returns:
+ *   TCL_OK or TCL_ERROR.
+ *-----------------------------------------------------------------------------
+ */
+static int
+GenerateFileId (interp, filePath, fileId)
+     Tcl_Interp *interp;
+     char       *filePath;
+     fileId_t    fileId;
+{
+    struct stat  statInfo;
+
+    if (stat (filePath, &statInfo) < 0) {
+        Tcl_AppendResult (interp, "stat of \"", filePath, "\" failed: ",
+                          Tcl_UnixError (interp), (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    sprintf (fileId, "@%d:%d", statInfo.st_dev, statInfo.st_ino);
+
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * SetTCLENVFileIdEntry --
+ *
+ * Set a file entry in the TCLENV array for a file path in the form:
+ *
+ *     TCLENV(@dev:inode) filepath
+ *
+ * This entry translates a dev:info into a full file path.
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter, error returned in result.
+ *   o fileId (I) -  The file Id for the file.
+ *   o filepath (I) - Absolute path to the file.
+ * Returns:
+ *   TCL_OK or TCL_ERROR.
+ *-----------------------------------------------------------------------------
+ */
+static int
+SetTCLENVFileIdEntry (interp, fileId, filePath)
+     Tcl_Interp *interp;
+     fileId_t    fileId;
+     char       *filePath;
+{
+
+    if (Tcl_SetVar2 (interp, "TCLENV", fileId, filePath,
+                     TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * CheckTCLENVFileIdEntry --
+ *
+ * Check if there is a file entry in for the specified file.
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter.
+ *   o filePath (I) - Absolute path to the library file.
+ * Returns:
+ *   TRUE is returned if the entry exists, FALSE if it doesn't.
+ *-----------------------------------------------------------------------------
+ */
+static int
+CheckTCLENVFileIdEntry (interp, filePath)
+    Tcl_Interp *interp;
+    char       *filePath;
+{
+    fileId_t fileId;
+
+    /*
+     * If we can't generate the Id (stat failed), then just say it doesn't
+     * exists, other, complain later when an attempt is made to process it.
+     */
+    if (GenerateFileId (interp, filePath, fileId) != TCL_OK) {
+        Tcl_ResetResult (interp);
+        return FALSE;
+    }
+
+    if (Tcl_GetVar2 (interp, "TCLENV", fileId, TCL_GLOBAL_ONLY) == NULL)
+        return FALSE;
+
+    return TRUE;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * GetTCLENVFileIdEntry --
+ *
+ * Translate a file id into a file path.
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter.
+ *   o fileId (I) - The file identifier, in the form: "@$dev:$inode"
+ * Returns:
+ *   A pointer to the absolute path to the library file is returned
+ *     here.  This pointer remains valid until the TCLENV entry is changed,
+ *     do not free.
+ *-----------------------------------------------------------------------------
+ */
+static char *
+GetTCLENVFileIdEntry (interp, fileId)
+    Tcl_Interp  *interp;
+    fileId_t     fileId;
+{
+    char *filePath;
+
+    filePath = Tcl_GetVar2 (interp, "TCLENV", fileId, TCL_GLOBAL_ONLY);
+    if (filePath == NULL) {
+        Tcl_AppendResult (interp, "TCLENV file id entry not found for: \"",
+                          fileId, "\"", (char *) NULL);
+        return NULL;
+    }
+    
+    return filePath;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * SetTCLENVPkgEntry --
+ *
+ * Set the package entry in the TCLENV array for a package in the form:
+ *
+ *     TCLENV(PKG:$packageName) [list $fileId $offset $length]
+ *
+ * Duplicate package names are rejected.
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter, error returned in result.
+ *   o packageName (I) - Package name.
+ *   o fileId (I) - File id for the file.
+ *   o offset (I) - String containing the numeric start of the package.
+ *   o length (I) - Strign containing the numeric length of the package.
+ * Returns:
+ *   TCL_OK,r TCL_ERROR of TCL_CONTINUE if the package name is already defined
+ * and should be skipped.
+ *-----------------------------------------------------------------------------
+ */
+static int
+SetTCLENVPkgEntry (interp, packageName, fileId, offset, length)
+     Tcl_Interp *interp;
+     char       *packageName;
+     fileId_t    fileId;
+     char       *offset;
+     char       *length;
+{
+    int   nameLen;
+    char  indexBuffer [64], *indexPtr;
+    char *pkgDataArgv [3], *dataStr, *setResult;
+
+    nameLen = strlen (packageName) + 5;  /* includes "PKG:" and '\0' */
+    if (nameLen <= sizeof (indexBuffer))
+        indexPtr = indexBuffer;
+    else
+        indexPtr = ckalloc (nameLen);
+
+    strcpy (indexPtr,     "PKG:");
+    strcpy (indexPtr + 4, packageName);
+
+    /*
+     * Check for duplicate package name.
+     */
+    if (Tcl_GetVar2 (interp, "TCLENV", indexPtr, TCL_GLOBAL_ONLY) != NULL) {
+        if (indexPtr != indexBuffer)
+            ckfree (indexPtr);
+        return TCL_CONTINUE;
+    }
+
+    pkgDataArgv [0] = fileId;
+    pkgDataArgv [1] = offset;
+    pkgDataArgv [2] = length;
+    dataStr = Tcl_Merge (3, pkgDataArgv);
+
+    setResult = Tcl_SetVar2 (interp, "TCLENV", indexPtr, dataStr,
+                             TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG);
+    ckfree (dataStr);
+    if (indexPtr != indexBuffer)
+        ckfree (indexPtr);
+
+    return (setResult == NULL) ? TCL_ERROR : TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * GetTCLENVPkgEntry --
+ *
+ * Get the package entry in the TCLENV array for a package.
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter, error returned in result.
+ *   o packageName (I) - Package name to find.
+ *   o fileId (O) - The fileId for the library file is returned here.
+ *   o offsetPtr (O) - Start of the package in the library.
+ *   o lengthPtr (O) - Length of the package in the library.
+ * Returns:
+ *   TCL_OK or TCL_ERROR.
+ *-----------------------------------------------------------------------------
+ */
+static int
+GetTCLENVPkgEntry (interp, packageName, fileId, offsetPtr, lengthPtr)
+     Tcl_Interp *interp;
+     char       *packageName;
+     fileId_t    fileId;
+     long       *offsetPtr;
+     unsigned   *lengthPtr;
+{
+    int            nameLen, pkgDataArgc;
+    char           indexBuffer [64], *indexPtr;
+    char          *dataStr, **pkgDataArgv = NULL;
+    register char *srcPtr, *destPtr;    
+
+    nameLen = strlen (packageName) + 5;  /* includes "PKG:" and '\0' */
+    if (nameLen <= sizeof (indexBuffer))
+        indexPtr = indexBuffer;
+    else
+        indexPtr = ckalloc (nameLen);
+
+    strcpy (indexPtr,     "PKG:");
+    strcpy (indexPtr + 4, packageName);
+
+    dataStr = Tcl_GetVar2 (interp, "TCLENV", indexPtr, TCL_GLOBAL_ONLY);
+    if (dataStr == NULL) {
+        Tcl_AppendResult (interp, "entry not found in TCLENV for package \"",
+                          packageName, "\"", (char *) NULL);
+        if (indexPtr != indexBuffer)
+            ckfree (indexPtr);
+        return TCL_ERROR;
+    }
+
+    /*
+     * Extract the data from the array entry.
+     */
+
+    if (Tcl_SplitList (interp, dataStr, &pkgDataArgc,
+                       &pkgDataArgv) != TCL_OK)
+        goto invalidEntry;
+    if (pkgDataArgc != 3)
+        goto invalidEntry;
+    if (strlen (pkgDataArgv [0]) >= sizeof (fileId_t))
+        goto invalidEntry;
+    strcpy (fileId, pkgDataArgv [0]);
+    if (!Tcl_StrToLong (pkgDataArgv [1], 0, offsetPtr))
+        goto invalidEntry;
+    if (!Tcl_StrToUnsigned (pkgDataArgv [2], 0, lengthPtr))
+        goto invalidEntry;
+
+    ckfree (pkgDataArgv);
+    if (indexPtr != indexBuffer)
+        ckfree (indexPtr);
+    return TCL_OK;
+    
+    /*
+     * Exit point when an invalid entry is found.
+     */
+  invalidEntry:
+    if (pkgDataArgv != NULL)
+        ckfree (pkgDataArgv);
+    Tcl_ResetResult (interp);
+    Tcl_AppendResult (interp, "invalid entry for package library: TCLENV(",
+                      indexPtr,") is \"", dataStr, "\"", (char *) NULL);
+    if (indexPtr != indexBuffer)
+        ckfree (indexPtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * SetTCLENVProcEntry --
+ *
+ * Set the proc entry in the TCLENV array for a package in the form:
+ *
+ *     TCLENV(PROC:$proc) [list P $packageName]
+ * or
+ *     TCLENV(PROC:$proc) [list F $fileId]
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter, error returned in result.
+ *   o procName (I) - The Tcl proc name.
+ *   o type (I) - "P" for a package entry or "F" for a file entry.
+ *   o location (I) - Either the package name or file name containing the
+ *                    procedure.
+ * Returns:
+ *   TCL_OK or TCL_ERROR.
+ *-----------------------------------------------------------------------------
+ */
+static int
+SetTCLENVProcEntry (interp, procName, type, location)
+    Tcl_Interp *interp;
+    char       *procName;
+    char       *type;
+    char       *location;
+{
+    int   nameLen;
+    char  indexBuffer [64], *indexPtr;
+    char *procDataArgv [2], *dataStr, *setResult;
+
+    nameLen = strlen (procName) + 6;  /* includes "PROC:" and '\0' */
+    if (nameLen <= sizeof (indexBuffer))
+        indexPtr = indexBuffer;
+    else
+        indexPtr = ckalloc (nameLen);
+
+    strcpy (indexPtr,     "PROC:");
+    strcpy (indexPtr + 5, procName);
+
+    procDataArgv [0] = type;
+    procDataArgv [1] = location;
+    dataStr = Tcl_Merge (2, procDataArgv);
+
+    setResult = Tcl_SetVar2 (interp, "TCLENV", indexPtr, dataStr,
+                             TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG);
+    ckfree (dataStr);
+    if (indexPtr != indexBuffer)
+        ckfree (indexPtr);
+
+    return (setResult == NULL) ? TCL_ERROR : TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * GetTCLENVProcEntry --
+ *
+ * Get the proc entry in the TCLENV array for a package.
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter, error returned in result.
+ *   o procName (I) - The Tcl proc name.
+ *   o typePtr (O) - 'P' for a package entry or 'F' for a file entry.  This
+ *     is a single character result.
+ *   o location (O) - Either the package name or the file name.  It is
+ *     dynamically allocated and must be freed when finished.  NULL is
+ *     return if the procedure is not found.
+ * Returns:
+ *   TCL_OK or TCL_ERROR.
+ *-----------------------------------------------------------------------------
+ */
+static int
+GetTCLENVProcEntry (interp, procName, typePtr, locationPtr)
+    Tcl_Interp *interp;
+    char       *procName;
+    char       *typePtr;
+    char      **locationPtr;
+{
+    int            nameLen, procDataArgc;
+    char           indexBuffer [64], *indexPtr;
+    char          *dataStr, *setResult, **procDataArgv;
+    register char *srcPtr, *destPtr;    
+
+    nameLen = strlen (procName) + 6;  /* includes "PROC:" and '\0' */
+    if (nameLen <= sizeof (indexBuffer))
+        indexPtr = indexBuffer;
+    else
+        indexPtr = ckalloc (nameLen);
+
+    strcpy (indexPtr,     "PROC:");
+    strcpy (indexPtr + 5, procName);
+
+    dataStr = Tcl_GetVar2 (interp, "TCLENV", indexPtr, TCL_GLOBAL_ONLY);
+    if (dataStr == NULL) {
+        if (indexPtr != indexBuffer)
+            ckfree (indexPtr);
+        *locationPtr = NULL;
+        return TCL_OK;
+    }
+
+    /*
+     * Extract the data from the array entry.
+     */
+
+    if (Tcl_SplitList (interp, dataStr, &procDataArgc,
+                       &procDataArgv) != TCL_OK)
+        goto invalidEntry;
+    if ((procDataArgc != 2) || (procDataArgv [0][1] != '\0'))
+        goto invalidEntry;
+    if (!((procDataArgv [0][0] == 'F') || (procDataArgv [0][0] == 'P')))
+        goto invalidEntry;
+    *typePtr = procDataArgv [0][0];
+
+    /*
+     * Now do a nasty trick to save a malloc.  Since procDataArgv contains
+     * the string, just move the string to the top and type cast.
+     */
+    destPtr = (char *) procDataArgv;
+    srcPtr  = procDataArgv [1];
+    while (*srcPtr != '\0')
+        *(destPtr++) = *(srcPtr++);
+    *destPtr = '\0';
+    *locationPtr = (char *) procDataArgv;
+
+    if (indexPtr != indexBuffer)
+        ckfree (indexPtr);
+    return TCL_OK;
+
+    /*
+     * Exit point when an invalid entry is found.
+     */
+  invalidEntry:
+    if (procDataArgv != NULL)
+        ckfree (procDataArgv);
+    Tcl_ResetResult (interp);
+    Tcl_AppendResult (interp, "invalid entry for procedure: TCLENV(",
+                      indexPtr,") is \"", dataStr, "\"", (char *) NULL);
+    if (indexPtr != indexBuffer)
+        ckfree (indexPtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ProcessIndexFile --
+ *
+ * Open and process a package library index file (.tndx).  Creates an
+ * entry in the form:
+ *
+ *     TCLENV(PKG:$packageName) [list $fileId $start $len]
+ *
+ * for each package and a entry in the from
+ *
+ *     TCLENV(PROC:$proc) [list P $packageName]
+ *
+ * for each entry procedure in a package.   If the package is already defined,
+ * it it skipped.
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter, error returned in result.
+ *   o tlibFilePath (I) - Absolute path name to the library file.
+ *   o tndxFilePath (I) - Absolute path name to the library file index.
+ * Returns:
+ *   TCL_OK or TCL_ERROR.
+ *-----------------------------------------------------------------------------
+ */
+static int
+ProcessIndexFile (interp, tlibFilePath, tndxFilePath)
+     Tcl_Interp *interp;
+     char       *tlibFilePath;
+     char       *tndxFilePath;
+{
+    fileId_t      fileId;
+    FILE         *indexFilePtr;
+    dynamicBuf_t  lineBuffer;
+    int           lineArgc, idx, result;
+    char        **lineArgv = NULL;
+
+    if (GenerateFileId (interp, tlibFilePath, fileId) != TCL_OK)
+        return TCL_ERROR;
+
+    indexFilePtr = fopen (tndxFilePath, "r");
+    if (indexFilePtr == NULL) {
+        Tcl_AppendResult (interp, "open failed on: ", tndxFilePath, ": ",
+                          Tcl_UnixError (interp), (char *) NULL);
+        return TCL_ERROR;           
+    }
+    
+    Tcl_DynBufInit (&lineBuffer);
+
+    while (TRUE) {
+        switch (Tcl_DynamicFgets (&lineBuffer, indexFilePtr, FALSE)) {
+          case 0:  /* EOF */
+            goto reachedEOF;
+          case -1: /* Error */
+            Tcl_AppendResult (interp, Tcl_UnixError (interp), (char *) NULL);
+            goto errorExit;
+        }
+        if ((Tcl_SplitList (interp, lineBuffer.ptr, &lineArgc,
+                            &lineArgv) != TCL_OK) || (lineArgc < 4))
+            goto formatError;
+        
+        /*
+         * lineArgv [0] is the package name.
+         * lineArgv [1] is the package offset in the library.
+         * lineArgv [2] is the package length in the library.
+         * lineArgv [3-n] are the entry procedures for the package.
+         */
+        result = SetTCLENVPkgEntry (interp, lineArgv [0], fileId, lineArgv [1],
+                                    lineArgv [2]);
+        if (result == TCL_ERROR)
+            goto errorExit;
+
+        /*
+         * If the package is not duplicated, add the procedures.
+         */
+        if (result != TCL_CONTINUE) {
+            for (idx = 3; idx < lineArgc; idx++) {
+                if (SetTCLENVProcEntry (interp, lineArgv [idx], "P",
+                                        lineArgv [0]) != TCL_OK)
+                    goto errorExit;
+            }
+        }
+        ckfree (lineArgv);
+        lineArgv = NULL;
+    }
+
+  reachedEOF:
+    fclose (indexFilePtr);
+    Tcl_DynBufFree (&lineBuffer);
+
+    if (SetTCLENVFileIdEntry (interp, fileId, tlibFilePath) != TCL_OK)
+        return TCL_ERROR;
+
+    return TCL_OK;
+
+    /*
+     * Handle format error in library input line.
+     */
+  formatError:
+    Tcl_ResetResult (interp);
+    Tcl_AppendResult (interp, "format error in library index \"",
+                      tndxFilePath, "\" (", lineBuffer.ptr, ")",
+                      (char *) NULL);
+    goto errorExit;
+
+    /*
+     * Error exit here, releasing resources and closing the file.
+     */
+  errorExit:
+    if (lineArgv != NULL)
+        ckfree (lineArgv);
+    Tcl_DynBufFree (&lineBuffer);
+    fclose (indexFilePtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * BuildPackageIndex --
+ *
+ * Call the "buildpackageindex" Tcl procedure to rebuild a package index.
+ * If the procedure has not been loaded, then load it.  It MUST have an
+ * proc record setup by autoload.
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter, error returned in result.
+ *   o tlibFilePath (I) - Absolute path name to the library file.
+ * Returns:
+ *   TCL_OK or TCL_ERROR.
+ *-----------------------------------------------------------------------------
+ */
+static int
+BuildPackageIndex (interp, tlibFilePath)
+     Tcl_Interp *interp;
+     char       *tlibFilePath;
+{
+    char *cmdPtr, *initCmd;
+
+    /*
+     * Load buildpackageindex if it is not loaded
+     */
+    if (TclFindProc ((Interp *) interp, "buildpackageindex") == NULL) {
+
+        cmdPtr = "demand_load buildpackageindex";
+
+        if (Tcl_Eval (interp, cmdPtr, 0, (char **) NULL) != TCL_OK)
+            return TCL_ERROR;
+
+        if (!STREQU (interp->result, "1")) {
+            Tcl_ResetResult (interp);
+            interp->result =
+                "can not find \"buildpackageindex\" on \"TCLPATH\"";
+            return TCL_ERROR;
+        }
+        Tcl_ResetResult (interp);
+    }
+
+    /*
+     * Build the package index.
+     */
+    initCmd = "buildpackageindex ";
+
+    cmdPtr = ckalloc (strlen (initCmd) + strlen (tlibFilePath) + 1);
+    strcpy (cmdPtr, initCmd);
+    strcat (cmdPtr, tlibFilePath);
+
+    if (Tcl_Eval (interp, cmdPtr, 0, (char **) NULL) != TCL_OK) {
+        ckfree (cmdPtr);
+        return TCL_ERROR;
+    }
+    ckfree (cmdPtr);
+    Tcl_ResetResult (interp);
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * LoadPackageIndex --
+ *
+ * Load a package .tndx file.  Rebuild .tlib if non-existant or out of
+ * date.  An entry is made in the TCLENV array indicating that this file
+ * has been loaded.
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter, error returned in result.
+ *   o tlibFilePath (I) - Absolute path name to the library file.
+ *   o pathLen (I) - Length of tlibFilePath.
+ *   o dirLen (I) - The length of the leading directory path in the name.
+ * Returns:
+ *   TCL_OK or TCL_ERROR.
+ *-----------------------------------------------------------------------------
+ */
+static int
+LoadPackageIndex (interp, tlibFilePath, pathLen, dirLen)
+     Tcl_Interp *interp;
+     char       *tlibFilePath;
+     int         pathLen;
+     int         dirLen;
+{
+    char        *tndxFilePath, tndxPathBuf [64], *msg;
+    struct stat  tlibStat;
+    struct stat  tndxStat;
+
+    if (pathLen < sizeof (tndxPathBuf))
+        tndxFilePath = tndxPathBuf;
+    else
+        tndxFilePath = ckalloc (pathLen + 1);
+    strcpy (tndxFilePath, tlibFilePath);
+    tndxFilePath [pathLen - 3] = 'n';
+    tndxFilePath [pathLen - 2] = 'd';
+    tndxFilePath [pathLen - 1] = 'x';
+
+    /*
+     * Get library's modification time.  If the file can't be accessed, set
+     * time so the library does not get built.  Other code will report the
+     * error.
+     */
+    if (stat (tlibFilePath, &tlibStat) < 0)
+        tlibStat.st_mtime = MAXINT;
+
+    /*
+     * Get the time for the index.  If the file does not exists or is
+     * out of date, rebuild it.
+     */
+
+    if ((stat (tndxFilePath, &tndxStat) < 0) ||
+        (tndxStat.st_mtime < tlibStat.st_mtime)) {
+        if (BuildPackageIndex (interp, tlibFilePath) != TCL_OK)
+            goto errorExit;
+    }
+
+    if (ProcessIndexFile (interp, tlibFilePath, tndxFilePath) != TCL_OK)
+        goto errorExit;
+    if (tndxFilePath != tndxPathBuf)
+        ckfree (tndxFilePath);
+    return TCL_OK;
+
+  errorExit:
+    if (tndxFilePath != tndxPathBuf)
+        ckfree (tndxFilePath);
+    msg = ckalloc (strlen (tlibFilePath) + 60);
+    strcpy (msg, "\n    while loading Tcl package library index \"");
+    strcat (msg, tlibFilePath);
+    strcat (msg, "\"");
+    Tcl_AddErrorInfo (interp, msg);
+    ckfree (msg);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * LoadOusterIndex --
+ *
+ * Load a standard Tcl index (tclIndex).  An entry is made in the TCLENV
+ * array indicating that this file has been loaded.
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter, error returned in result.
+ *   o indexFilePath (I) - Absolute path name to the tclIndex file.
+ *   o dirLen (I) - The length of the directory component of indexFilePath.
+ * Returns:
+ *   TCL_OK or TCL_ERROR.
+ *-----------------------------------------------------------------------------
+ */
+static int
+LoadOusterIndex (interp, indexFilePath, dirLen)
+     Tcl_Interp *interp;
+     char       *indexFilePath;
+     int         dirLen;
+{
+    FILE         *indexFilePtr;
+    fileId_t      fileId;
+    dynamicBuf_t  lineBuffer;
+    int           lineArgc, result, filePathLen;
+    char        **lineArgv = NULL, *filePath, filePathBuf [64], *msg;
+
+    indexFilePtr = fopen (indexFilePath, "r");
+    if (indexFilePtr == NULL) {
+        Tcl_AppendResult (interp, "open failed on: ", indexFilePath, ": ",
+                          Tcl_UnixError (interp), (char *) NULL);
+        return TCL_ERROR;           
+    }
+    
+    Tcl_DynBufInit (&lineBuffer);
+
+    while (TRUE) {
+        switch (Tcl_DynamicFgets (&lineBuffer, indexFilePtr, FALSE)) {
+          case 0:  /* EOF */
+            goto reachedEOF;
+          case -1: /* Error */
+            Tcl_AppendResult (interp, "read filed on: ", indexFilePath, ": ",
+                              Tcl_UnixError (interp), (char *) NULL);
+            goto errorExit;
+        }
+        if ((lineBuffer.ptr [0] == '\0') || (lineBuffer.ptr [0] == '#'))
+            continue;
+
+        if (Tcl_SplitList (interp, lineBuffer.ptr, &lineArgc,
+                           &lineArgv) != TCL_OK)
+            goto formatError;
+        if (! ((lineArgc == 0) || (lineArgc == 2)))
+            goto formatError;
+
+        if (lineArgc != 0) {
+            filePathLen = strlen (lineArgv [1]) + dirLen + 1;
+            if (filePathLen < sizeof (filePathBuf))
+                filePath = filePathBuf;
+            else
+                filePath = ckalloc (filePathLen + 1);
+            strncpy (filePath, indexFilePath, dirLen + 1);
+            strcpy (filePath + dirLen + 1, lineArgv [1]);
+
+            result = SetTCLENVProcEntry (interp, lineArgv [0], "F", filePath);
+
+            if (filePath != filePathBuf)
+                ckfree (filePath);
+            if (result != TCL_OK)
+                goto errorExit;
+        }
+        ckfree (lineArgv);
+        lineArgv = NULL;
+    }
+
+  reachedEOF:
+    Tcl_DynBufFree (&lineBuffer);
+    fclose (indexFilePtr);
+
+    if (GenerateFileId (interp, indexFilePath, fileId) != TCL_OK)
+        return TCL_ERROR;
+    if (SetTCLENVFileIdEntry (interp, fileId, indexFilePath) != TCL_OK)
+        return TCL_ERROR;
+
+    return TCL_OK;
+
+    /*
+     * Handle format error in library input line. If data is already in the
+     * result, its assumed to be the error that brought us here.
+     */
+  formatError:
+    if (interp->result [0] != '\0')
+        Tcl_AppendResult (interp, "\n",  (char *) NULL);
+    Tcl_AppendResult (interp, "format error in library index \"",
+                      indexFilePath, "\" (", lineBuffer.ptr, ")",
+                      (char *) NULL);
+
+    /*
+     * Error exit here, releasing resources and closing the file.
+     */
+  errorExit:
+    if (lineArgv != NULL)
+        ckfree (lineArgv);
+    Tcl_DynBufFree (&lineBuffer);
+    fclose (indexFilePtr);
+
+    msg = ckalloc (strlen (indexFilePath) + 45);
+    strcpy (msg, "\n    while loading Tcl procedure index \"");
+    strcat (msg, indexFilePath);
+    strcat (msg, "\"");
+    Tcl_AddErrorInfo (interp, msg);
+    ckfree (msg);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * LoadDirIndexes --
+ *
+ *     Load the indexes for all package library (.tlib) or a Ousterhout
+ *  "tclIndex" file in a directory.  Nonexistent or unreadable directories
+ *  are skipped.
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter, error returned in result.
+ *   o dirName (I) - The absolute path name of the directory to search for
+ *     libraries.
+ * Results:
+ *   A standard Tcl result.
+ *-----------------------------------------------------------------------------
+ */
+static int
+LoadDirIndexes (interp, dirName)
+    Tcl_Interp  *interp;
+    char        *dirName;
+{
+    DIR           *dirPtr;
+    struct dirent *entryPtr;
+    int            dirLen, nameLen;
+    char          *filePath = NULL;
+    int            filePathSize = 0;
+
+    dirLen = strlen (dirName);
+
+    dirPtr = opendir (dirName);
+    if (dirPtr == NULL)
+        return TCL_OK;   /* Skip directory */
+
+    while (TRUE) {
+        entryPtr = readdir (dirPtr);
+        if (entryPtr == NULL)
+            break;
+        nameLen = strlen (entryPtr->d_name);
+
+        if ((nameLen > 5) && 
+            ((STREQU (entryPtr->d_name + nameLen - 5, ".tlib")) ||
+             (STREQU (entryPtr->d_name, "tclIndex")))) {
+
+            /*
+             * Expand the filePath buffer if necessary (always allow extra).
+             */
+            if ((nameLen + dirLen + 2) > filePathSize) {
+                if (filePath != NULL)
+                    ckfree (filePath);
+                filePathSize = nameLen + dirLen + 2 + 16;
+                filePath = ckalloc (filePathSize);
+                strcpy (filePath, dirName);
+                filePath [dirLen] = '/';
+            }
+            strcpy (filePath + dirLen + 1, entryPtr->d_name);
+
+            /*
+             * Skip index if it has been loaded before or if it can't be
+             * accessed.
+             */
+            if (CheckTCLENVFileIdEntry (interp, filePath) ||
+                (access (filePath, R_OK) < 0))
+                continue;
+
+            if (entryPtr->d_name [nameLen - 5] == '.') {
+                if (LoadPackageIndex (interp, filePath, dirLen + nameLen + 1,
+                                      dirLen) != TCL_OK)
+                    goto errorExit;
+            } else {
+                if (LoadOusterIndex (interp, filePath, dirLen) != TCL_OK)
+                    goto errorExit;
+            }
+        }
+    }
+
+    if (filePath != NULL)
+        ckfree (filePath);
+    closedir (dirPtr);
+    return TCL_OK;
+
+  errorExit:
+    if (filePath != NULL)
+        ckfree (filePath);
+    closedir (dirPtr);
+    return TCL_ERROR;
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * LoadPackageIndexes --
+ *
+ * Loads the all indexes for all package libraries (.tlib)* or a
+ * Ousterhout "tclIndex" files found in all directories in the path.
+ * If an index has already been loaded, it will not be reloaded.
+ * Non-existent or unreadable directories are skipped.
+ *
+ * Results:
+ *   A standard Tcl result.  Tcl array variable TCLENV is updated to
+ * indicate the procedures that were defined in the library.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+LoadPackageIndexes (interp, path)
+    Tcl_Interp  *interp;
+    char        *path;
+{
+    char  *dirName, dirNameBuf [64];
+    int    idx, dirLen, pathArgc, status;
+    char **pathArgv;
+
+    if (Tcl_SplitList (interp, path, &pathArgc, &pathArgv) != TCL_OK)
+        return TCL_OK;
+
+    for (idx = 0; idx < pathArgc; idx++) {
+        /*
+         * Get the absolute dir name.  if the conversion fails (most likely
+         * invalid "~") or thje directory cann't be read, skip it.
+         */
+        dirName = pathArgv [idx];
+        if (dirName [0] != '/') {
+            dirName = MakeAbsFile (interp, dirName, dirNameBuf, 
+                                   sizeof (dirNameBuf));
+            if (dirName == NULL)
+                continue;
+        }
+        if (access (dirName, X_OK) == 0)
+            status = LoadDirIndexes (interp, dirName);
+        else
+            status = TCL_OK;
+
+        if ((dirName != pathArgv [idx]) && (dirName != dirNameBuf))
+            ckfree (dirName);
+        if (status != TCL_OK)
+            goto errorExit;
+    }
+    ckfree (pathArgv);
+    return TCL_OK;
+
+  errorExit:
+    ckfree (pathArgv);
+    return TCL_ERROR;
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * LoadProc --
+ *
+ *    Attempt to load a procedure (or command) by checking the TCLENV 
+ * array for its location (either in a file or package library).
+ *
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter, error returned in result.
+ *   o procName (I) - The name of the procedure (or command) to load
+ *     libraries.
+ *   o foundPtr (O) - TRUE is returned if the procedure or command was
+ *     loaded, FALSE if it was not.
+ * Results:
+ *   A standard Tcl result.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+LoadProc (interp, procName, foundPtr)
+    Tcl_Interp  *interp;
+    char        *procName;
+    int         *foundPtr;
+{
+    Interp        *iPtr = (Interp *) interp;
+    char           type, *location, *filePath, *cmdPtr, cmdBuf [80];
+    int            cmdLen, result;
+    long           offset;
+    unsigned       length;
+    fileId_t       fileId;
+    Tcl_HashEntry *cmdEntryPtr;
+
+    if (GetTCLENVProcEntry (interp, procName, &type, &location) != TCL_OK)
+        return TCL_ERROR;
+    if (location == NULL) {
+        *foundPtr = FALSE;
+        return TCL_OK;
+    }
+
+    /*
+     * If this is a file entry (type = 'F'), location is a file name or
+     * absolute file path.  If it's an absolute path, just eval it, otherwise
+     * load the source using the "load" procdure (still in Tcl). If this is a
+     * package entry, location is a package name. Source part of the package
+     * library (Must look up the file, offset and length in the package entry
+     * in TCLENV).
+     */
+    if (type == 'F') {
+        if (location [0] == '/') {
+            result = Tcl_EvalFile (interp, location);
+        } else {
+            cmdLen = strlen (location) + 5;
+            if (cmdLen < sizeof (cmdBuf))
+                cmdPtr = cmdBuf;
+            else
+                cmdPtr = ckalloc (cmdLen + 1);
+            strcpy (cmdPtr, "load ");
+            strcat (cmdPtr, location);
+
+            result = Tcl_Eval (interp, cmdPtr, 0, NULL);
+            if (cmdPtr != cmdBuf)
+                ckfree (cmdPtr);
+        }
+    } else {
+        result = GetTCLENVPkgEntry (interp, location, fileId, &offset,
+                                    &length);
+        if (result == TCL_OK) {
+            filePath = GetTCLENVFileIdEntry (interp, fileId);
+            if (filePath == NULL)
+                result = TCL_ERROR;
+        }
+        
+        if (result == TCL_OK)
+            result = EvalFilePart (interp, filePath, offset, length);
+
+    }
+
+    ckfree (location);
+    
+    /*
+     * If we are ok to this point, make sure that the procedure or command is
+     * actually loaded.
+     */
+    if (result == TCL_OK) {
+        cmdEntryPtr = Tcl_FindHashEntry (&iPtr->commandTable, procName);
+        *foundPtr = (cmdEntryPtr != NULL);
+    }
+
+    return result;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_LoadlibindexCmd --
+ *
+ *   This procedure is invoked to process the "Loadlibindex" Tcl command:
+ *
+ *      loadlibindex libfile
+ *
+ * which loads the index for a package library (.tlib) or a Ousterhout
+ * "tclIndex" file.
+ *
+ * Results:
+ *    A standard Tcl result.  Tcl array variable TCLENV is updated to
+ * indicate the procedures that were defined in the library.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_LoadlibindexCmd (dummy, interp, argc, argv)
+    ClientData   dummy;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    char *pathName, pathNameBuf [64];
+    int   pathLen, dirLen;
+
+    if (argc != 2) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " libFile",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    pathName = argv [1];
+    if (pathName [0] != '/') {
+        pathName = MakeAbsFile (interp, pathName, pathNameBuf, 
+                                sizeof (pathNameBuf));
+        if (pathName == NULL)
+            return TCL_ERROR;
+    }
+
+    /*
+     * Find the length of the directory name. Validate that we have a .tlib
+     * extension or file name is "tclIndex" and call the routine to process
+     * the specific type of index.
+     */
+    pathLen = strlen (pathName);
+    for (dirLen = pathLen - 1; pathName [dirLen] != '/'; dirLen--)
+        continue;
+
+    if ((pathLen > 5) && (pathName [pathLen - 5] == '.')) {
+        if (!STREQU (pathName + pathLen - 5, ".tlib"))
+            goto invalidName;
+        if (LoadPackageIndex (interp, pathName, pathLen, dirLen) != TCL_OK)
+            goto errorExit;
+    } else {
+        if (!STREQU (pathName + dirLen, "/tclIndex"))
+            goto invalidName;
+        if (LoadOusterIndex (interp, pathName, dirLen) != TCL_OK)
+            goto errorExit;
+    }
+    if ((pathName != argv [1]) && (pathName != pathNameBuf))
+        ckfree (pathName);
+    return TCL_OK;
+
+  invalidName:
+    Tcl_AppendResult (interp, "invalid library name, must have an extension ",
+                      "of \".tlib\" or the name \"tclIndex\", got \"",
+                      argv [1], "\"", (char *) NULL);
+
+  errorExit:
+    if ((pathName != argv [1]) && (pathName != pathNameBuf))
+        ckfree (pathName);
+    return TCL_ERROR;;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_Demand_loadCmd --
+ *
+ *   This procedure is invoked to process the "demand_load" Tcl command:
+ *
+ *         demand_load proc
+ *
+ * which searchs the TCLENV tables for the specified procedure.  If it
+ * is not found, an attempt is made to load unloaded libraries, first
+ * the variable "TCLPATH" is searched.  If the procedure is not defined
+ * after that, then "auto_path" is searched.
+ *
+ * Results:
+ *   A standard Tcl result.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_Demand_loadCmd (dummy, interp, argc, argv)
+    ClientData   dummy;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    int   found;
+    char *path, *msg;
+
+    if (argc != 2) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " procedure",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (LoadProc (interp, argv [1], &found) != TCL_OK)
+        goto errorExit;
+    if (found) {
+        interp->result = "1";
+        return TCL_OK;
+    }
+
+    /*
+     * Slow path, load the libraries indices on "TCLPATH".
+     */
+    path = Tcl_GetVar (interp, "TCLPATH", TCL_GLOBAL_ONLY);
+    if (path != NULL) {
+        if (LoadPackageIndexes (interp, path) != TCL_OK)
+            goto errorExit;
+        if (LoadProc (interp, argv [1], &found) != TCL_OK)
+            goto errorExit;
+        if (found) {
+            interp->result = "1";
+            return TCL_OK;
+        }
+    }
+
+    /*
+     * Final gasp, check the "auto_path"
+     */
+    path = Tcl_GetVar (interp, "auto_path", TCL_GLOBAL_ONLY);
+    if (path != NULL) {
+        if (LoadPackageIndexes (interp, path) != TCL_OK)
+            goto errorExit;
+        if (LoadProc (interp, argv [1], &found) != TCL_OK)
+            goto errorExit;
+        if (found) {
+            interp->result = "1";
+            return TCL_OK;
+        }
+    }
+
+    /*
+     * Procedure or command was not found.
+     */
+    interp->result = "0";
+    return TCL_OK;
+
+  errorExit:
+    msg = ckalloc (strlen (argv [1]) + 35);
+    strcpy (msg, "\n    while demand loading \"");
+    strcat (msg, argv [1]);
+    strcat (msg, "\"");
+    Tcl_AddErrorInfo (interp, msg);
+    ckfree (msg);
+    return TCL_ERROR;
+}
+
diff --git a/src/tclx/src/tclxlist.c b/src/tclx/src/tclxlist.c
new file mode 100644 (file)
index 0000000..e169a5a
--- /dev/null
@@ -0,0 +1,278 @@
+/* 
+ * tclXlist.c --
+ *
+ *  Extended Tcl list commands.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXlist.c,v 2.0 1992/10/16 04:50:57 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_LvarcatCmd --
+ *     Implements the TCL lvarpop command:
+ *         lvarcat var string string string
+ *
+ * Results:
+ *      Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_LvarcatCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int        listArgc, idx, listIdx;
+    char     **listArgv;
+    char      *staticArgv [12];
+    char      *varContents, *newStr, *result;
+
+    if (argc < 3) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " var string [string...]", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    varContents = Tcl_GetVar (interp, argv[1], 0);
+
+    if (varContents != NULL)
+        listArgc = argc - 1;
+    else
+        listArgc = argc - 2;
+
+    if (listArgc < (sizeof (staticArgv) / sizeof (char *))) {
+        listArgv = staticArgv;
+    } else {
+        listArgv = (char **) ckalloc (listArgc * sizeof (char *));
+    }
+    
+    if (varContents != NULL) {
+        listArgv [0] = varContents;
+        listIdx = 1;
+    } else {
+        listIdx = 0;
+    }
+    for (idx = 2; idx < argc; idx++, listIdx++)
+        listArgv [listIdx] = argv [idx];
+
+    newStr = Tcl_Concat (listArgc, listArgv);
+    result = Tcl_SetVar (interp, argv [1], newStr, TCL_LEAVE_ERR_MSG);
+
+    ckfree (newStr);
+    if (listArgv != staticArgv)
+        ckfree ((char *) listArgv);
+
+    /*
+     * If all is ok, return the variable contents as a "static" result.
+     */
+    if (result != NULL) {
+        interp->result = result;
+        return TCL_OK;
+    } else {
+        return TCL_ERROR;
+    }
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_LvarpopCmd --
+ *     Implements the TCL lvarpop command:
+ *         lvarpop var [index [string]]
+ *
+ * Results:
+ *      Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_LvarpopCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int        listArgc, listIdx, idx;
+    char     **listArgv;
+    char      *varContents, *resultList, *returnElement;
+
+    if ((argc < 2) || (argc > 4)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " var [index [string]]", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    varContents = Tcl_GetVar (interp, argv[1], TCL_LEAVE_ERR_MSG);
+    if (varContents == NULL)
+        return TCL_ERROR;
+
+    if (Tcl_SplitList (interp, varContents, &listArgc, &listArgv) == TCL_ERROR)
+        return TCL_ERROR;
+
+    if (argc == 2) 
+        listIdx = 0;
+    else {
+        if (Tcl_GetInt (interp, argv[2], &listIdx) != TCL_OK)
+            goto errorExit;
+    }
+
+    /*
+     * Just ignore out-of bounds requests, like standard Tcl.
+     */
+    if ((listIdx < 0) || (listIdx >= listArgc)) {
+        goto okExit;
+    }
+    returnElement = listArgv [listIdx];
+
+    if (argc == 4)
+        listArgv [listIdx] = argv [3];
+    else {
+        listArgc--;
+        for (idx = listIdx; idx < listArgc; idx++)
+            listArgv [idx] = listArgv [idx+1];
+    }
+
+    resultList = Tcl_Merge (listArgc, listArgv);
+    if (Tcl_SetVar (interp, argv [1], resultList, TCL_LEAVE_ERR_MSG) == NULL) {
+        ckfree (resultList);
+        goto errorExit;
+    }
+    ckfree (resultList);
+
+    Tcl_SetResult (interp, returnElement, TCL_VOLATILE);
+  okExit:
+    ckfree((char *) listArgv);
+    return TCL_OK;
+
+  errorExit:
+    ckfree((char *) listArgv);
+    return TCL_ERROR;;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_LvarpushCmd --
+ *     Implements the TCL lvarpush command:
+ *         lvarpush var string [index]
+ *
+ * Results:
+ *      Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_LvarpushCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int        listArgc, listIdx, idx;
+    char     **listArgv;
+    char      *varContents, *resultList;
+
+    if ((argc < 3) || (argc > 4)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " var string [index]", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    varContents = Tcl_GetVar (interp, argv[1], TCL_LEAVE_ERR_MSG);
+    if (varContents == NULL)
+        varContents = "";
+
+    if (Tcl_SplitList (interp, varContents, &listArgc, &listArgv) == TCL_ERROR)
+        return TCL_ERROR;
+
+    if (argc == 3) 
+        listIdx = 0;
+    else {
+        if (Tcl_GetInt (interp, argv[3], &listIdx) != TCL_OK)
+            goto errorExit;
+    }
+
+    /*
+     * Out-of-bounds request go to the start or end, as with most of Tcl.
+     */
+    if (listIdx < 0)
+        listIdx = 0;
+    else
+        if (listIdx > listArgc)
+            listIdx = listArgc;
+
+    /*
+     * This code takes advantage of the fact that a NULL entry is always
+     * returned by Tcl_SplitList, but not required by Tcl_Merge.
+     */
+    for (idx = listArgc; idx > listIdx; idx--)
+        listArgv [idx] = listArgv [idx - 1];
+
+    listArgv [listIdx] = argv [2];
+
+    resultList = Tcl_Merge (listArgc + 1, listArgv);
+
+    if (Tcl_SetVar (interp, argv [1], resultList, TCL_LEAVE_ERR_MSG) == NULL) {
+        ckfree (resultList);
+        goto errorExit;
+    }
+
+    ckfree (resultList);
+    ckfree((char *) listArgv);
+    return TCL_OK;
+
+  errorExit:
+    ckfree((char *) listArgv);
+    return TCL_ERROR;;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_LemptyCmd --
+ *     Implements the strcat TCL command:
+ *         lempty list
+ *
+ * Results:
+ *     Standard TCL result.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_LemptyCmd (clientData, interp, argc, argv)
+    ClientData   clientData;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    char *scanPtr;
+
+    if (argc != 2) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " list",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    scanPtr = argv [1];
+    while ((*scanPtr != '\0') && (isspace (*scanPtr)))
+        scanPtr++;
+    sprintf (interp->result, "%d", (*scanPtr == '\0'));
+    return TCL_OK;
+
+} /* Tcl_LemptyCmd */
diff --git a/src/tclx/src/tclxmath.c b/src/tclx/src/tclxmath.c
new file mode 100644 (file)
index 0000000..9f967bf
--- /dev/null
@@ -0,0 +1,207 @@
+/*
+ * tclXmath.c --
+ *
+ * Mathematical Tcl commands.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXmath.c,v 2.0 1992/10/16 04:50:59 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+extern int rand();
+
+/*
+ * Prototypes of internal functions.
+ */
+int 
+really_random _ANSI_ARGS_((int my_range));
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_MaxCmd --
+ *      Implements the TCL max command:
+ *        max num1 num2 [..numN]
+ *
+ * Results:
+ *      Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_MaxCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    double value, maxValue = -MAXDOUBLE;
+    int    idx,   maxIdx   =  1;
+
+
+    if (argc < 3) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " num1 num2 [..numN]", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    for (idx = 1; idx < argc; idx++) {
+        if (Tcl_GetDouble (interp, argv [idx], &value) != TCL_OK)
+            return TCL_ERROR;
+        if (value > maxValue) {
+            maxValue = value;
+            maxIdx = idx;
+        }
+    }
+    strcpy (interp->result, argv [maxIdx]);
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_MinCmd --
+ *     Implements the TCL min command:
+ *         min num1 num2 [..numN]
+ *
+ * Results:
+ *      Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_MinCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int     argc;
+    char      **argv;
+{
+    double value, minValue = MAXDOUBLE;
+    int    idx,   minIdx   = 1;
+
+    if (argc < 3) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " num1 num2 [..numN]", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    for (idx = 1; idx < argc; idx++) {
+        if (Tcl_GetDouble (interp, argv [idx], &value) != TCL_OK)
+            return TCL_ERROR;
+        if (value < minValue) {
+            minValue = value;
+            minIdx = idx;
+            }
+        }
+    strcpy (interp->result, argv [minIdx]);
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ReallyRandom --
+ *     Insure a good random return for a range, unlike an arbitrary
+ *     random() % n, thanks to Ken Arnold, Unix Review, October 1987.
+ *
+ *-----------------------------------------------------------------------------
+ */
+#ifdef TCL_32_BIT_RANDOM
+#    define RANDOM_RANGE 0x7FFFFFFF
+#else
+#    define RANDOM_RANGE 0x7FFF
+#endif
+
+static int 
+
+ReallyRandom (myRange)
+    int myRange;
+{
+    int maxMultiple, rnum;
+
+    maxMultiple = 
+        (int)(
+           RANDOM_RANGE / 
+           myRange);
+    maxMultiple *= 
+        myRange;
+
+    while ((rnum = rand()) >= maxMultiple) {
+        continue;
+    }
+
+    return (rnum % myRange);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_RandomCmd  --
+ *     Implements the TCL random command:
+ *     random limit
+ *
+ * Results:
+ *  Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_RandomCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    unsigned range;
+
+    if ((argc < 2) || (argc > 3))
+        goto invalidArgs;
+
+    if (STREQU (argv [1], "seed")) {
+        long seed;
+
+        if (argc == 3) {
+            if (Tcl_GetLong (interp, argv[2], &seed) != TCL_OK)
+                return TCL_ERROR;
+        } else
+            seed = (unsigned) (getpid() + time((time_t *)NULL));
+
+        srand(seed);
+
+    } else {
+        if (argc != 2)
+            goto invalidArgs;
+        if (Tcl_GetUnsigned (interp, argv[1], &range) != TCL_OK)
+            return TCL_ERROR;
+        if ((range == 0) || (range > (int)RANDOM_RANGE))
+            goto outOfRange;
+
+        sprintf (interp->result, "%d", ReallyRandom (range));
+    }
+    return TCL_OK;
+
+invalidArgs:
+    Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                      " limit | seed [seedval]", (char *) NULL);
+    return TCL_ERROR;
+outOfRange:
+    {
+        char buf [18];
+
+        sprintf (buf, "%d", (int)RANDOM_RANGE);
+        Tcl_AppendResult (interp, "range must be > 0 and <= ",
+                          buf, (char *) NULL);
+        return TCL_ERROR;
+    }
+}
diff --git a/src/tclx/src/tclxmerr.c b/src/tclx/src/tclxmerr.c
new file mode 100644 (file)
index 0000000..dc3596b
--- /dev/null
@@ -0,0 +1,65 @@
+/* 
+ * tclXmatherr.c --
+ *
+ *   Extended Tcl default matherr routine, may be replace by an application
+ *   specified version.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXmatherr.c,v 2.1 1992/11/09 07:33:02 markd Exp $
+ *-----------------------------------------------------------------------------
+ */
+#include "tclxtend.h"
+
+#ifndef TCL_IEEE_FP_MATH
+
+#include <math.h>
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * matherr --
+ *    Default matherr routine for extended Tcl.  If the error does not
+ *  belong to Tcl, standard math error processing is done.  An
+ *  aplication may replace this routine with their own, however it must
+ *  call \fBTcl_MathError\fR to check if the error belongs to tcl.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+matherr (except)
+    struct exception *except;
+{
+    if (Tcl_MathError (except->name, except->type))
+        return 1;
+    else
+        return 0;
+}
+
+#else
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * matherr --
+ *    Dummy matherr for systems wanting to use IEEE 745-1985 floating point
+ * math error reporting.  This just disables standard Unix matherr message
+ * printing by returning 1.  Except parameter not specified, since some systems
+ * don't define it or even use matherr.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+matherr ()
+{
+    return 1;
+}
+
+#endif /* TCL_IEEE_FP_MATH */
diff --git a/src/tclx/src/tclxmsgc.c b/src/tclx/src/tclxmsgc.c
new file mode 100644 (file)
index 0000000..c4b1063
--- /dev/null
@@ -0,0 +1,356 @@
+/* 
+ * tclXmsgcat.c --
+ *
+ *      Contains commands for accessing XPG/3 message catalogs.  If real XPG/3
+ * message catalogs are not available, the default string is returned.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXmsgcat.c,v 2.0 1992/10/16 04:51:02 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+#ifdef TCL_HAVE_CATGETS
+
+#include <nl_types.h>
+
+#else
+
+typedef int nl_catd;
+
+#endif /* TCL_HAVE_CATGETS */
+
+static int
+ParseFailOption _ANSI_ARGS_((Tcl_Interp *interp,
+                             CONST char *optionStr,
+                             int        *failPtr));
+
+static int
+CatOpFailed _ANSI_ARGS_((Tcl_Interp *interp,
+                         CONST char *errorMsg));
+
+/*
+ * Message catalog table is global, so it is shared between all interpreters
+ * in the same process.
+ */
+static void_pt msgCatTblPtr = NULL;
+
+#ifndef TCL_HAVE_CATGETS
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * catopen --
+ *    A stub to use when message catalogs are not available.
+ *
+ * Results:
+ *     Always returns the default string.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static nl_catd
+catopen (name, oflag)
+    char *name;
+    int   oflag;
+{
+    return (nl_catd) -1;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * catgets --
+ *    A stub to use when message catalogs are not available.
+ *
+ * Results:
+ *     Always returns -1.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static char *
+catgets (catd, set_num, msg_num, defaultStr)
+    nl_catd catd;
+    int     set_num, msg_num;
+    char   *defaultStr;
+{
+    return defaultStr;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * catclose --
+ *    A stub to use when message catalogs are not available.
+ *
+ * Results:
+ *     Always returns -1.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+catclose (catd)
+    nl_catd catd;
+{
+    return -1;
+}
+#endif /* TCL_HAVE_CATGETS */
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ParseFailOption --
+ *    Parse the -fail/-nofail option, if specified.
+ *
+ * Results:
+ *     Standard Tcl results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+ParseFailOption (interp, optionStr, failPtr)
+    Tcl_Interp *interp;
+    CONST char *optionStr;
+    int        *failPtr;
+{
+    if (STREQU ("-fail", ((char *) optionStr)))
+        *failPtr = TRUE;
+    else if (STREQU ("-nofail", ((char *) optionStr)))
+        *failPtr = FALSE;
+    else {
+        Tcl_AppendResult (interp, "Expected option of `-fail' or ",
+                          "`-nofail', got: `", optionStr, "'",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * CatOpFailed --
+ *    Handles failures of catopen and catclose.  If message catalogs are
+ * available, if returns the supplied message.  If message are not
+ * available, it returns a message indicating that message stubs are used.
+ * It is not specified by XPG/3 how to get the details of a message catalog
+ * open or close failure.
+ *
+ * Results:
+ *     Always returns TCL_ERROR;
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+CatOpFailed (interp, errorMsg)
+    Tcl_Interp *interp;
+    CONST char *errorMsg;
+{
+#ifdef TCL_HAVE_CATGETS
+
+    Tcl_AppendResult (interp, errorMsg, (char *) NULL);
+
+#else
+
+    Tcl_AppendResult (interp, "the message catalog facility is not available,",
+                      " default string is always returned", (char *) NULL);
+
+#endif /* TCL_HAVE_CATGETS */
+
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CatopenCmd --
+ *    Implements the TCL echo command:
+ *        catopen [-fail|-nofail] catname
+ *
+ * Results:
+ *     Standard Tcl results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+Tcl_CatopenCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int      fail;
+    nl_catd  catDesc;
+    nl_catd *catDescPtr;
+
+    if ((argc < 2) || (argc > 3)) {
+        Tcl_AppendResult (interp, argv [0], " [-fail|-nofail] catname",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+    if (argc == 3) {
+        if (ParseFailOption (interp, argv [1], &fail) != TCL_OK)
+            return TCL_ERROR;
+    } else
+        fail = FALSE;
+
+    catDesc = catopen (argv [argc - 1], 0);
+    if ((catDesc == (nl_catd) -1) && fail)
+        return CatOpFailed (interp, "open of message catalog failed");
+
+    catDescPtr = Tcl_HandleAlloc (msgCatTblPtr, interp->result);
+    *catDescPtr = catDesc;
+
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CatgetsCmd --
+ *    Implements the TCL echo command:
+ *        catgets catHandle setnum msgnum defaultstr
+ *
+ * Results:
+ *     Standard Tcl results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+Tcl_CatgetsCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    nl_catd   *catDescPtr;
+    int        msgSetNum, msgNum;
+    char      *localMsg;
+
+    if (argc != 5) {
+        Tcl_AppendResult (interp, argv [0], " catHandle setnum msgnum ",
+                          "defaultstr", (char *) NULL);
+        return TCL_ERROR;
+    }
+    catDescPtr = Tcl_HandleXlate (interp, msgCatTblPtr, argv [1]);
+    if (catDescPtr == NULL)
+        return TCL_ERROR;
+    if (Tcl_GetInt (interp, argv [2], &msgSetNum) != TCL_OK)
+        return TCL_ERROR;
+    if (Tcl_GetInt (interp, argv [3], &msgNum) != TCL_OK)
+        return TCL_ERROR;
+
+    localMsg = catgets (*catDescPtr, msgSetNum, msgNum, argv [4]);
+
+    Tcl_SetResult (interp, localMsg, TCL_VOLATILE);
+    return TCL_OK;
+}\f
+
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CatcloseCmd --
+ *    Implements the TCL echo command:
+ *        catclose [-fail|-nofail] catHandle
+ *
+ * Results:
+ *     Standard Tcl results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+Tcl_CatcloseCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int      fail;
+    nl_catd *catDescPtr;
+
+    if ((argc < 2) || (argc > 3)) {
+        Tcl_AppendResult (interp, argv [0], " [-fail|-nofail] catHandle",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+    if (argc == 3) {
+        if (ParseFailOption (interp, argv [1], &fail) != TCL_OK)
+            return TCL_ERROR;
+    } else
+        fail = FALSE;
+
+    catDescPtr = Tcl_HandleXlate (interp, msgCatTblPtr, argv [argc - 1]);
+    if (catDescPtr == NULL)
+        return TCL_ERROR;
+
+    if ((catclose (*catDescPtr) < 0) && fail)
+        return CatOpFailed (interp, "close of message catalog failed");
+
+    Tcl_HandleFree (msgCatTblPtr, catDescPtr);
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ *  MsgCatCleanUp --
+ *      Decrements the use count on the globals when a command is deleted.
+ *      If it goes to zero, all resources are released.      
+ *
+ *-----------------------------------------------------------------------------
+ */
+static void
+MsgCatCleanUp (clientData)
+    ClientData clientData;
+{
+    nl_catd *catDescPtr;
+    int      walkKey;
+    
+    if (Tcl_HandleTblUseCount (msgCatTblPtr, -1) > 0)
+        return;
+
+    walkKey = -1;
+    while ((catDescPtr = Tcl_HandleWalk (msgCatTblPtr, &walkKey)) != NULL)
+        catclose (*catDescPtr);
+
+    Tcl_HandleTblRelease (msgCatTblPtr);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ *  Tcl_InitMsgCat --
+ *      Initialize the Tcl XPG/3 message catalog support faility.
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_InitMsgCat (interp)
+    Tcl_Interp *interp;
+{
+
+    if (msgCatTblPtr == NULL)
+        msgCatTblPtr = Tcl_HandleTblInit ("msgcat", sizeof (nl_catd), 6);
+
+    (void) Tcl_HandleTblUseCount (msgCatTblPtr, 2);  /* 3 commands total */
+
+    /*
+     * Initialize the commands.
+     */
+
+    Tcl_CreateCommand (interp, "catopen", Tcl_CatopenCmd, 
+                       (ClientData)NULL, MsgCatCleanUp);
+    Tcl_CreateCommand (interp, "catgets", Tcl_CatgetsCmd, 
+                       (ClientData)NULL, MsgCatCleanUp);
+    Tcl_CreateCommand (interp, "catclose", Tcl_CatcloseCmd,
+                       (ClientData)NULL, MsgCatCleanUp);
+}
+
diff --git a/src/tclx/src/tclxproc.c b/src/tclx/src/tclxproc.c
new file mode 100644 (file)
index 0000000..72183e5
--- /dev/null
@@ -0,0 +1,297 @@
+/*
+ * tclXprocess.c --
+ *
+ * Tcl command to create and manage processes.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXprocess.c,v 2.2 1992/10/30 03:53:30 markd Exp $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+/*
+ * These are needed for wait command even if waitpid is not available.
+ */
+#ifndef  WNOHANG
+#    define  WNOHANG    1
+#endif
+#ifndef  WUNTRACED
+#    define  WUNTRACED  2
+#endif
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ExeclCmd --
+ *     Implements the TCL execl command:
+ *     execl prog [argList]
+ *
+ * Results:
+ *  Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_ExeclCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+#define STATIC_ARG_SIZE   12
+    char  *staticArgv [STATIC_ARG_SIZE];
+    char **argInList = NULL;
+    char **argList   = staticArgv;
+    int    argInCnt, idx;
+
+    if ((argc < 2) || (argc > 3)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " prog [argList]", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    /*
+     * If arg list is supplied, split it and build up the arguments to pass.
+     * otherwise, just supply argv[0].  Must be NULL terminated.
+     */
+    if (argc > 2) {
+        if (Tcl_SplitList (interp, argv [2], &argInCnt, &argInList) != TCL_OK)
+            return TCL_ERROR;
+
+        if (argInCnt > STATIC_ARG_SIZE - 2)
+            argList = (char **) ckalloc ((argInCnt + 1) * sizeof (char **));
+            
+        for (idx = 0; idx < argInCnt; idx++)
+            argList [idx + 1] = argInList [idx];
+
+        argList [argInCnt + 1] = NULL;
+    } else {
+        argList [1] = NULL;
+    }
+
+    argList [0] = argv [1];  /* Program name */
+
+    if (execvp (argv[1], argList) < 0) {
+        if (argInList != NULL)
+            ckfree (argInList);
+        if (argList != staticArgv)
+            ckfree (argList);
+
+        interp->result = Tcl_UnixError (interp);
+        return TCL_ERROR;
+    }
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ForkCmd --
+ *     Implements the TCL fork command:
+ *     fork
+ *
+ * Results:
+ *  Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_ForkCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int pid;
+
+    if (argc != 1) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    pid = Tcl_Fork ();
+    if (pid < 0) {
+        interp->result = Tcl_UnixError (interp);
+        return TCL_ERROR;
+    }
+
+    sprintf(interp->result, "%d", pid);
+    return TCL_OK;
+}
+#ifndef TCL_HAVE_WAITPID
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_WaitCmd --
+ *   Implements the TCL wait command:
+ *     wait pid
+ *
+ * This version is for Tcl 6.4 that does not have the waitpid changes (which
+ * have not yet been released).
+ * 
+ * Results:
+ *   Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_WaitCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    WAIT_STATUS_TYPE  status;
+    int               pid, returnedPid;
+
+
+    if (argc != 2) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " pid",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+    
+    if (Tcl_GetInt (interp, argv [1], &pid) != TCL_OK)
+        return TCL_ERROR;
+
+    returnedPid = Tcl_WaitPids (1, &pid, (WAIT_STATUS_TYPE *) &status);
+
+    if (returnedPid < 0) {
+        interp->result = Tcl_UnixError (interp);
+        return TCL_ERROR;
+    }
+    
+    if (WIFEXITED (status))
+        sprintf (interp->result, "%d %s %d", returnedPid, "EXIT", 
+                 WEXITSTATUS (status));
+    else if (WIFSIGNALED (status))
+        sprintf (interp->result, "%d %s %s", returnedPid, "SIG", 
+                 Tcl_SignalId (WTERMSIG (status)));
+    else if (WIFSTOPPED (status))
+        sprintf (interp->result, "%d %s %s", returnedPid, "STOP", 
+                 Tcl_SignalId (WSTOPSIG (status)));
+
+    return TCL_OK;
+
+}
+#else
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_WaitCmd --
+ *   Implements the TCL wait command:
+ *     wait [-nohang] [-untraced] [-pgroup] [pid]
+ *
+ * Results:
+ *   Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_WaitCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int      pid, returnedPid, status, idx;
+    int      options = 0, pgroup = FALSE;
+    
+    for (idx = 1; idx < argc; idx++) {
+        if (argv [idx][0] != '-')
+            break;
+        if (STREQU ("-nohang", argv [idx])) {
+            if (options & WNOHANG)
+                goto usage;
+            options |= WNOHANG;
+            continue;
+        }
+        if (STREQU ("-untraced", argv [idx])) {
+            if (options & WUNTRACED)
+                goto usage;
+            options |= WUNTRACED;
+            continue;
+        }
+        if (STREQU ("-pgroup", argv [idx])) {
+            if (pgroup)
+                goto usage;
+            pgroup = TRUE;
+            continue;
+        }
+        goto usage;  /* None match */
+    }
+    /*
+     * Check for more than one non-minus argument.  If ok, convert pid,
+     * if supplied.
+     */
+    if (idx < argc - 1)
+        goto usage;  
+    if (idx < argc) {
+        if (Tcl_GetInt (interp, argv [idx], &pid) != TCL_OK)
+            return TCL_ERROR;
+        if (pid <= 0) {
+            Tcl_AppendResult (interp, "pid or process group must be greater ",
+                              "than zero", (char *) NULL);
+            return TCL_ERROR;
+        }
+    } else {
+        pid = -1;  /* pid not supplied */
+    }
+
+#if !TCL_HAVE_WAITPID
+    /*
+     * Versions that don't have real waitpid have limited functionality.
+     */
+    if ((options != 0) || pgroup) {
+        Tcl_AppendResult (interp, "The \"-nohang\", \"-untraced\" and ",
+                          "\"-pgroup\" options are not available on this ",
+                          "system", (char *) NULL);
+        return TCL_ERROR;
+    }
+#endif
+
+    if (pgroup) {
+        if (pid > 0)
+            pid = -pgroup;
+        else
+            pid = 0;
+    }
+
+    returnedPid = waitpid (pid, &status, options);
+
+    if (returnedPid < 0) {
+        interp->result = Tcl_UnixError (interp);
+        return TCL_ERROR;
+    }
+    
+    if (WIFEXITED (status))
+        sprintf (interp->result, "%d %s %d", returnedPid, "EXIT", 
+                 WEXITSTATUS (status));
+    else if (WIFSIGNALED (status))
+        sprintf (interp->result, "%d %s %s", returnedPid, "SIG", 
+                 Tcl_SignalId (WTERMSIG (status)));
+    else if (WIFSTOPPED (status))
+        sprintf (interp->result, "%d %s %s", returnedPid, "STOP", 
+                 Tcl_SignalId (WSTOPSIG (status)));
+
+    return TCL_OK;
+
+usage:
+    Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " ", 
+                      "[-nohang] [-untraced] [-pgroup] [pid]",
+                      (char *) NULL);
+    return TCL_ERROR;
+}
+#endif
diff --git a/src/tclx/src/tclxprof.c b/src/tclx/src/tclxprof.c
new file mode 100644 (file)
index 0000000..4a4ba9d
--- /dev/null
@@ -0,0 +1,702 @@
+/*
+ * tclXprofile.c --
+ *
+ * Tcl performance profile monitor.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXprofile.c,v 2.0 1992/10/16 04:51:05 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclhash.h"
+#include "tclxint.h"
+
+/*
+ * Stack entry used to keep track of an profiling information for active
+ * procedure.  Handling uplevels is tricky.  The eval level and procedure call
+ * level are kept track of.  These are used to distinguish between an uplevel
+ * and exiting a procedure.  During an uplevel, the invisible part of the
+ * profile stack is saved on another stack until the uplevel completes.
+ */
+
+typedef struct profStackEntry_t {
+    long                     realTime;      /* Real time at procedure entry. */
+    long                     cpuTime;       /* CPU time at procedure entry.  */
+    int                      procLevel;     /* Call level of this procedure  */
+    int                      evalLevel;     /* Eval level of this prodecure  */
+    struct profStackEntry_t *prevEntryPtr;  /* Previous stack entry.         */
+    char                     procName [1];  /* Procedure name. MUST BE LAST! */
+} profStackEntry_t;
+
+
+/*
+ * Save stack entry used to hold profile stack entries during an uplevel.
+ */
+
+typedef struct saveStackEntry_t {
+    profStackEntry_t         *topPtr;        /* Top of saved stack section   */
+    profStackEntry_t         *bottomPtr;     /* Bottom of saved stack        */
+    struct saveStackEntry_t  *prevEntryPtr;  /* Previous saved stack section */
+} saveStackEntry_t;
+
+/*
+ * Data keeped on a stack snapshot.
+ */
+
+typedef struct profDataEntry_t {
+    long count;
+    long realTime;
+    long cpuTime;
+} profDataEntry_t;
+
+/*
+ * Client data structure for profile command.  A count of real and CPU time
+ * spent outside of the profiling routines is kept to factor out the variable
+ * overhead.
+ */
+
+typedef struct profInfo_t { 
+    Tcl_Interp       *interp;            /* Interpreter this is for.         */
+    Tcl_Trace         traceHolder;       /* Handle to current trace.         */
+    int               allCommands;       /* Prof all commands, not just procs*/
+    long              realTime;          /* Real and CPU time counter.       */
+    long              cpuTime;
+    long              lastRealTime;      /* Real and CPU time of last exit   */
+    long              lastCpuTime;       /* from profiling routines.         */
+    profStackEntry_t *stackPtr;          /* Pointer to the top of prof stack */
+    saveStackEntry_t *saveStackPtr;      /* Frames saved during an uplevel   */
+    Tcl_HashTable     profDataTable;     /* Cumulative time table, Keyed by  */
+                                         /* call stack list.                 */
+} profInfo_t;
+
+/*
+ * Prototypes of internal functions.
+ */
+
+static void
+ProcEntry _ANSI_ARGS_((profInfo_t *infoPtr,
+                       char       *procName,
+                       int         procLevel,
+                       int         evalLevel));
+
+static void
+ProcPopEntry _ANSI_ARGS_((profInfo_t *infoPtr));
+
+static void
+StackSync _ANSI_ARGS_((profInfo_t *infoPtr,
+                       int         procLevel,
+                       int         evalLevel));
+
+static void
+DoUplevel _ANSI_ARGS_((profInfo_t *infoPtr,
+                       int         procLevel));
+
+static void
+ProfTraceRoutine _ANSI_ARGS_((ClientData    clientData,
+                              Tcl_Interp   *interp,
+                              int           evalLevel,
+                              char         *command,
+                              int           (*cmdProc)(),
+                              ClientData    cmdClientData,
+                              int           argc,
+                              char        **argv));
+
+static void
+CleanDataTable _ANSI_ARGS_((profInfo_t *infoPtr));
+
+static void
+DeleteProfTrace _ANSI_ARGS_((profInfo_t *infoPtr));
+
+static int
+DumpTableData  _ANSI_ARGS_((Tcl_Interp *interp,
+                            profInfo_t *infoPtr,
+                            char       *varName));
+
+static int
+Tcl_ProfileCmd _ANSI_ARGS_((ClientData    clientData,
+                            Tcl_Interp   *interp,
+                            int           argc,
+                            char        **argv));
+
+static void
+CleanUpProfMon _ANSI_ARGS_((ClientData clientData));
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ProcEntry --
+ *   Push a procedure entry onto the stack.
+ *
+ * Parameters:
+ *   o infoPtr (I/O) - The global profiling info.
+ *   o procName (I)  The procedure name.
+ *   o procLevel (I) - The procedure call level that the procedure will
+ *     execute at.
+ *   o evalLevel (I) - The eval level that the procedure will start
+ *     executing at.
+ *-----------------------------------------------------------------------------
+ */
+static void
+ProcEntry (infoPtr, procName, procLevel, evalLevel)
+    profInfo_t *infoPtr;
+    char       *procName;
+    int         procLevel;
+    int         evalLevel;
+{
+    profStackEntry_t *entryPtr;
+
+    /*
+     * Calculate the size of an entry.  One byte for name is in the entry.
+     */
+    entryPtr = (profStackEntry_t *) ckalloc (sizeof (profStackEntry_t) +
+                                             strlen (procName));
+    
+    /*
+     * Fill it in and push onto the stack.  Note that the procedures frame has
+     * not yet been layed down or the procedure body eval execute, so the value
+     * they will be in the procedure is recorded.
+     */
+    entryPtr->realTime     = infoPtr->realTime;
+    entryPtr->cpuTime      = infoPtr->cpuTime;
+    entryPtr->procLevel    = procLevel;
+    entryPtr->evalLevel    = evalLevel;
+    strcpy (entryPtr->procName, procName);
+
+    entryPtr->prevEntryPtr  = infoPtr->stackPtr;
+    infoPtr->stackPtr       = entryPtr;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ProcPopEntry --
+ *   Pop the procedure entry from the top of the stack and record its
+ * times in the data table.
+ *
+ * Parameters:
+ *   o infoPtr (I/O) - The global profiling info.
+ *-----------------------------------------------------------------------------
+ */
+static void
+ProcPopEntry (infoPtr)
+    profInfo_t *infoPtr;
+{
+    profStackEntry_t *entryPtr = infoPtr->stackPtr;
+    profStackEntry_t *scanPtr;
+    int               idx, newEntry;
+    char             *stackListPtr;
+    Tcl_HashEntry    *hashEntryPtr;
+    profDataEntry_t  *dataEntryPtr;
+    char             *stackArgv [MAX_NESTING_DEPTH];
+
+    /*
+     * Build up a stack list.  Entry [0] is the top of the stack.
+     */
+    idx= 0;
+    scanPtr = entryPtr;
+    while (scanPtr != NULL) {
+        stackArgv [idx] = scanPtr->procName;
+        idx++;
+        scanPtr = scanPtr->prevEntryPtr;
+    }
+    stackListPtr = Tcl_Merge (idx, stackArgv);
+
+    /*
+     * Check the hash table for this entry, either finding an existing or
+     * creating a new hash entry.
+     */
+
+    hashEntryPtr = Tcl_CreateHashEntry (&infoPtr->profDataTable,
+                                        stackListPtr,
+                                        &newEntry);
+    ckfree (stackListPtr);
+
+    /*
+     * Fill in or increment the entry.
+     */
+    if (newEntry) {
+        dataEntryPtr = (profDataEntry_t *) ckalloc (sizeof (profDataEntry_t));
+        Tcl_SetHashValue (hashEntryPtr, dataEntryPtr);
+        dataEntryPtr->count    = 0;
+        dataEntryPtr->realTime = 0;
+        dataEntryPtr->cpuTime  = 0;;
+    } else
+        dataEntryPtr = (profDataEntry_t *) Tcl_GetHashValue (hashEntryPtr);
+
+    dataEntryPtr->count++;
+    dataEntryPtr->realTime += (infoPtr->realTime - entryPtr->realTime);
+    dataEntryPtr->cpuTime  += (infoPtr->cpuTime  - entryPtr->cpuTime);
+
+
+    infoPtr->stackPtr = entryPtr->prevEntryPtr;
+    ckfree ((char *) entryPtr);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * StackSync --
+ *   Synchronize the profile stack with the interpreter procedure stack.
+ * This is done once return from uplevels, exits and error unwinds are
+ * detected (the command after).  Saved profile stack entries may be
+ * restored and procedure entries popped from the stack.  When entries
+ * are popped, their statistics is saved in stack.
+ *
+ * Parameters:
+ *   o infoPtr (I/O) - The global profiling info.
+ *   o procLevel (I) - Procedure call level to return to (zero to clear stack).
+ *   o evalLevel (I) - Eval call level to return to (zero to clear stack).
+ *-----------------------------------------------------------------------------
+ */
+static void
+StackSync (infoPtr, procLevel, evalLevel)
+    profInfo_t *infoPtr;
+    int         procLevel;
+    int         evalLevel;
+{
+    saveStackEntry_t *saveEntryPtr;
+    
+    while (TRUE) {
+        /*
+         * Move top of saved stack to standard stack if stack is empty or
+         * saved eval level is greater than the top of the standard stack.
+         */
+        saveEntryPtr = infoPtr->saveStackPtr;
+
+        if ((saveEntryPtr != NULL) && 
+            ((infoPtr->stackPtr == NULL) || 
+             (saveEntryPtr->topPtr->evalLevel >
+              infoPtr->stackPtr->evalLevel))) {
+
+            infoPtr->stackPtr = saveEntryPtr->topPtr;
+            infoPtr->saveStackPtr = saveEntryPtr->prevEntryPtr;
+            ckfree ((char *) saveEntryPtr);
+
+        } else {
+
+            if ((infoPtr->stackPtr == NULL) ||
+                ((procLevel >= infoPtr->stackPtr->procLevel) &&
+                 (evalLevel >= infoPtr->stackPtr->evalLevel)))
+                break;  /* Done */
+            ProcPopEntry (infoPtr);
+
+        }
+    }
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * DoUplevel --
+ *
+ *   Do processing required when an uplevel is detected.  Builds and
+ * pushes a save stack containing all of the save entrys that have been
+ * hiden by the uplevel.  
+ *
+ * Parameters:
+ *   o infoPtr (I/O) - The global profiling info.
+ *   o procLevel (I) - The upleveled procedure call level.
+ *-----------------------------------------------------------------------------
+ */
+static void
+DoUplevel (infoPtr, procLevel)
+    profInfo_t *infoPtr;
+    int         procLevel;
+{
+    profStackEntry_t *scanPtr, *bottomPtr;
+    saveStackEntry_t *saveEntryPtr;
+
+    /*
+     * Find the stack area to save.
+     */
+    bottomPtr = NULL;
+    scanPtr = infoPtr->stackPtr;
+    while ((scanPtr != NULL) && (scanPtr->procLevel > procLevel)) {
+        bottomPtr = scanPtr;
+        scanPtr = scanPtr->prevEntryPtr;
+    }
+    if (bottomPtr == NULL)
+        panic ("uplevel stack confusion");
+
+    /*
+     * Save the stack entries in the save stack.
+     */
+    saveEntryPtr = (saveStackEntry_t *) ckalloc (sizeof (saveStackEntry_t));
+    saveEntryPtr->topPtr       = infoPtr->stackPtr;
+    saveEntryPtr->bottomPtr    = bottomPtr;
+    saveEntryPtr->prevEntryPtr = infoPtr->saveStackPtr;;
+
+    infoPtr->saveStackPtr = saveEntryPtr;
+
+    /*
+     * Hide the stack entries.
+     */
+    infoPtr->stackPtr = bottomPtr->prevEntryPtr;
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ProfTraceRoutine --
+ *  Routine called by Tcl_Eval to do profiling.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static void
+ProfTraceRoutine (clientData, interp, evalLevel, command, cmdProc,
+                  cmdClientData, argc, argv)
+    ClientData    clientData;
+    Tcl_Interp   *interp;
+    int           evalLevel;
+    char         *command;
+    int           (*cmdProc)();
+    ClientData    cmdClientData;
+    int           argc;
+    char        **argv;
+{
+    Interp      *iPtr      = (Interp *) interp;
+    struct tms   cpuTimes;
+    profInfo_t  *infoPtr   = (profInfo_t *) clientData;
+    int          procLevel = (iPtr->varFramePtr == NULL) ? 0 : 
+                             iPtr->varFramePtr->level;
+
+    /*
+     * Calculate the time spent since the last trace.
+     */
+    infoPtr->realTime += times (&cpuTimes) - infoPtr->lastRealTime;
+    infoPtr->cpuTime  += (cpuTimes.tms_utime + cpuTimes.tms_stime) -
+                         infoPtr->lastCpuTime;
+
+    
+    /*
+     * If the procedure level has changed, then something is up.  Its not a
+     * procedure call, as we head them off before they happen.  Its one of
+     * four events.
+     *
+     *   o A uplevel command was executed.
+     *   o Returned from an uplevel.
+     *   o A procedure exit has occured.
+     *   o An error unwind has occured.
+     *     
+     * Eval level must be tested as well as proc level to cover upleveled
+     * proc calls that don't execute any commands.
+     */
+     
+    if ((infoPtr->stackPtr != NULL) && 
+        ((procLevel != infoPtr->stackPtr->procLevel) ||
+         (evalLevel <  infoPtr->stackPtr->evalLevel))) {
+
+        if ((procLevel < infoPtr->stackPtr->procLevel) &&
+            (evalLevel > infoPtr->stackPtr->evalLevel))
+            DoUplevel (infoPtr, procLevel);
+        else
+            StackSync (infoPtr, procLevel, evalLevel);
+    }
+
+    /*
+     * If this is level zero and the stack is empty, add an entry for the
+     * global level.  This takes care of the first command at the global level
+     * after profiling has been enabled or the case where profiling was
+     * enabled in a proc and we have returned to the global level.
+     */
+     if ((infoPtr->stackPtr == NULL) && (procLevel == 0))
+         ProcEntry (infoPtr, "<global>", 0, evalLevel);
+
+    /*
+     * If this command is a procedure or if all commands are being traced,
+     * handle the entry.
+     */
+
+    if (infoPtr->allCommands || (TclFindProc (iPtr, argv [0]) != NULL))
+        ProcEntry (infoPtr, argv [0], procLevel + 1, evalLevel + 1);
+
+    /*
+     * Save the exit time of the profiling trace handler.
+     */
+    infoPtr->lastRealTime = times (&cpuTimes);
+    infoPtr->lastCpuTime  = cpuTimes.tms_utime + cpuTimes.tms_stime;
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * CleanDataTable --
+ *
+ *  Clean up the hash data table, releasing all resources and setting it
+ *  to the empty state.
+ *
+ * Parameters:
+ *   o infoPtr (I/O) - The global profiling info.
+ *-----------------------------------------------------------------------------
+ */
+static void
+CleanDataTable (infoPtr)
+    profInfo_t *infoPtr;
+{
+    Tcl_HashEntry    *hashEntryPtr;
+    Tcl_HashSearch   searchCookie;
+
+    hashEntryPtr = Tcl_FirstHashEntry (&infoPtr->profDataTable,
+                                       &searchCookie);
+    while (hashEntryPtr != NULL) {
+        ckfree ((char *) Tcl_GetHashValue (hashEntryPtr));
+        Tcl_DeleteHashEntry (hashEntryPtr);
+        hashEntryPtr = Tcl_NextHashEntry (&searchCookie);
+    }
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * DeleteProfTrace --
+ *
+ *   Delete the profile trace and clean up the stack, logging all procs
+ * as if they had exited.  Data table must still be available.
+ *
+ * Parameters:
+ *   o infoPtr (I/O) - The global profiling info.
+ *-----------------------------------------------------------------------------
+ */
+static void
+DeleteProfTrace (infoPtr)
+    profInfo_t *infoPtr;
+{
+    Tcl_DeleteTrace (infoPtr->interp, infoPtr->traceHolder);
+    infoPtr->traceHolder = NULL;
+
+    StackSync (infoPtr, 0, 0);
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * DumpTableData --
+ *
+ *   Dump the table data to an array variable.  Entries will be deleted
+ * as they are dumped to limit memory utilization.
+ *
+ * Parameters:
+ *   o interp (I) - Pointer to the interprer.
+ *   o infoPtr (I/O) - The global profiling info.
+ *   o varName (I) - The name of the variable to save the data in.
+ * Returns:
+ *   Standard Tcl command results
+ *-----------------------------------------------------------------------------
+ */
+static int
+DumpTableData (interp, infoPtr, varName)
+    Tcl_Interp *interp;
+    profInfo_t *infoPtr;
+    char       *varName;
+{
+    Tcl_HashEntry    *hashEntryPtr;
+    Tcl_HashSearch    searchCookie;
+    profDataEntry_t  *dataEntryPtr;
+    char             *dataArgv [3], *dataListPtr;
+    char              countBuf [32], realTimeBuf [32], cpuTimeBuf [32];
+
+    dataArgv [0] = countBuf;
+    dataArgv [1] = realTimeBuf;
+    dataArgv [2] = cpuTimeBuf;
+
+    Tcl_UnsetVar (interp, varName, 0);
+    hashEntryPtr = Tcl_FirstHashEntry (&infoPtr->profDataTable,
+                                       &searchCookie);
+    while (hashEntryPtr != NULL) {
+        dataEntryPtr = 
+            (profDataEntry_t *) Tcl_GetHashValue (hashEntryPtr);
+
+        sprintf (countBuf,    "%ld", dataEntryPtr->count);
+        sprintf (realTimeBuf, "%ld", dataEntryPtr->realTime * MS_PER_TICK);
+        sprintf (cpuTimeBuf,  "%ld", dataEntryPtr->cpuTime  * MS_PER_TICK);
+
+        dataListPtr = Tcl_Merge (3, dataArgv);
+
+        if (Tcl_SetVar2 (interp, varName,
+                         Tcl_GetHashKey (&infoPtr->profDataTable,
+                                         hashEntryPtr),
+                         dataListPtr, TCL_LEAVE_ERR_MSG) == NULL) {
+            ckfree (dataListPtr);
+            return TCL_ERROR;
+        }
+        ckfree (dataListPtr);
+        ckfree ((char *) dataEntryPtr);
+        Tcl_DeleteHashEntry (hashEntryPtr);
+
+        hashEntryPtr = Tcl_NextHashEntry (&searchCookie);
+    }
+
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ProfileCmd --
+ *     Implements the TCL profile command:
+ *     profile on
+ *     profile off arrayvar
+ *
+ * Results:
+ *  Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+Tcl_ProfileCmd (clientData, interp, argc, argv)
+    ClientData    clientData;
+    Tcl_Interp   *interp;
+    int           argc;
+    char        **argv;
+{
+    Interp      *iPtr = (Interp *) interp;
+    profInfo_t  *infoPtr = (profInfo_t *) clientData;
+    int          idx;
+    int          cmdArgc,   optionsArgc = 0;
+    char       **cmdArgv, **optionsArgv = &(argv [1]);
+
+    /*
+     * Scan for options (currently only one is supported).  Set cmdArgv to
+     * contain the rest of the command following the options.
+     */
+    for (idx = 1; (idx < argc) && (argv [idx][0] == '-'); idx++)
+        optionsArgc++;
+    cmdArgc = argc - idx;
+    cmdArgv = &(argv [idx]);
+
+    if (cmdArgc < 1)
+        goto wrongArgs;
+
+    /*
+     * Handle the on command.
+     */
+    if (STREQU (cmdArgv [0], "on")) {
+        int        allCommands = FALSE;
+        struct tms cpuTimes;
+
+        if ((cmdArgc != 1) || (optionsArgc > 1))
+            goto wrongArgs;
+
+        if (optionsArgc == 1) {
+            if (!STREQU (optionsArgv [0], "-commands")) {
+                Tcl_AppendResult (interp, "expected option of \"-commands\", ",
+                                  "got \"", optionsArgv [0], "\"",
+                                  (char *) NULL);
+                return TCL_ERROR;
+            }
+            allCommands = TRUE;
+        }
+
+        if (infoPtr->traceHolder != NULL) {
+            Tcl_AppendResult (interp, "profiling is already enabled",
+                              (char *) NULL);
+            return TCL_ERROR;
+        }
+            
+        CleanDataTable (infoPtr);
+        infoPtr->traceHolder = Tcl_CreateTrace (interp, MAXINT,
+                                                ProfTraceRoutine,
+                                                (ClientData) infoPtr);
+        infoPtr->realTime = 0;
+        infoPtr->cpuTime  = 0;
+        infoPtr->lastRealTime = times (&cpuTimes);
+        infoPtr->lastCpuTime  = cpuTimes.tms_utime + cpuTimes.tms_stime;
+        infoPtr->allCommands = allCommands;
+        return TCL_OK;
+    }
+
+    /*
+     * Handle the off command.  Dump the hash table to a variable.
+     */
+    if (STREQU (cmdArgv [0], "off")) {
+
+        if ((cmdArgc != 2) || (optionsArgc > 0))
+            goto wrongArgs;
+
+        if (infoPtr->traceHolder == NULL) {
+            Tcl_AppendResult (interp, "profiling is not currently enabled",
+                              (char *) NULL);
+            return TCL_ERROR;
+        }
+            
+        DeleteProfTrace (infoPtr);
+
+        if (DumpTableData (interp, infoPtr, argv [2]) != TCL_OK)
+            return TCL_ERROR;
+        return TCL_OK;
+    }
+
+    /*
+     * Not a valid subcommand.
+     */
+    Tcl_AppendResult (interp, "expected one of \"on\" or \"off\", got \"",
+                      argv [1], "\"", (char *) NULL);
+    return TCL_ERROR;
+
+  wrongArgs:
+    Tcl_AppendResult (interp, tclXWrongArgs, argv [0],
+                      " [-commands] on|off arrayVar", (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ *  CleanUpProfMon --
+ *
+ *  Release the client data area when the profile command is deleted.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static void
+CleanUpProfMon (clientData)
+    ClientData clientData;
+{
+    profInfo_t *infoPtr = (profInfo_t *) clientData;
+
+    if (infoPtr->traceHolder != NULL)
+        DeleteProfTrace (infoPtr);
+    CleanDataTable (infoPtr);
+    Tcl_DeleteHashTable (&infoPtr->profDataTable);
+    ckfree ((char *) infoPtr);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ *  Tcl_InitProfile --
+ *
+ *  Initialize the Tcl profiling command.
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_InitProfile (interp)
+    Tcl_Interp *interp;
+{
+    profInfo_t *infoPtr;
+
+    infoPtr = (profInfo_t *) ckalloc (sizeof (profInfo_t));
+
+    infoPtr->interp       = interp;
+    infoPtr->traceHolder  = NULL;
+    infoPtr->stackPtr     = NULL;
+    infoPtr->saveStackPtr = NULL;
+    Tcl_InitHashTable (&infoPtr->profDataTable, TCL_STRING_KEYS);
+
+    Tcl_CreateCommand (interp, "profile", Tcl_ProfileCmd, 
+                       (ClientData)infoPtr, CleanUpProfMon);
+}
+
diff --git a/src/tclx/src/tclxrexp.c b/src/tclx/src/tclxrexp.c
new file mode 100644 (file)
index 0000000..3c98005
--- /dev/null
@@ -0,0 +1,493 @@
+/*
+ * tclXregexp.c --
+ *
+ * Tcl regular expression pattern matching utilities.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * Boyer-Moore code from: 
+ *     torek-boyer-moore/27-Aug-90 by
+ *     chris@mimsy.umd.edu (Chris Torek)
+ *-----------------------------------------------------------------------------
+ * $Id: tclXregexp.c,v 2.0 1992/10/16 04:51:08 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+#include "regexp.h"
+
+/*
+ * This is declared in tclUtil.c.  Must be set to NULL before compiling
+ * a regular expressions.
+ */
+extern char *tclRegexpError;
+
+/*
+ * Meta-characters for regular expression
+ */
+#define REXP_META                   "^$.[()|?+*\\"
+#define REXP_META_NO_BRACKET_NO_OR  "^$.()?+*\\"
+
+#ifndef CHAR_MAX
+#    define CHAR_MAX 255
+#endif
+
+/*
+ * Prototypes of internal functions.
+ */
+
+static char *
+BoyerMooreCompile _ANSI_ARGS_((char *pat,
+                                  int patlen));
+
+static char *
+BoyerMooreExecute _ANSI_ARGS_((char     *text,
+                               unsigned  textlen,
+                               char     *compPtr,
+                               unsigned *patLenP));
+
+static int
+FindNonRegExpSubStr _ANSI_ARGS_((char  *expression,
+                                 char **subStrPtrPtr));
+
+\f
+/*
+ * Boyer-Moore search: input is `text' (a string) and its length,
+ * and a `pattern' (another string) and its length.
+ *
+ * The linear setup cost of this function is approximately 256 + patlen.
+ * Afterwards, however, the average cost is O(textlen/patlen), and the
+ * worst case is O(textlen+patlen).
+ *
+ * The Boyer-Moore algorithm works by observing that, for each position
+ * in the text, if the character there does *not* occur somewhere in the
+ * search pattern, no comparisons including that character will match.
+ * That is, given the text "hello world..." and the pattern "goodbye", the
+ * `w' in `world' means that none of `hello w', `ello wo', `llo wor',
+ * `lo worl', `o world', ` world.', and `world..' can match.  In fact,
+ * exactly patlen strings are certain not to match.  We can discover this
+ * simply by looking at the patlen'th character.  Furthermore, even if
+ * the text character does occur, it may be that it rules out some number
+ * of other matches.  Again, we can discover this by doing the match
+ * `backwards'.
+ *
+ * We set up a table of deltas for each possible character, with
+ * delta[character] being patlen for characters not in the pattern,
+ * less for characters in the pattern, growing progressively smaller
+ * as we near the end of the pattern.  Matching then works as follows:
+ *
+ *       0         1         2         3
+ *       01234567890123456789012345678901234567
+ *      "Here is the string being searched into"        (text)
+ *       ------                                         (pos = [0..5])
+ *      "string"                                        (pat)
+ *      654321-                                         (deltas)
+ *
+ * (the delta for `-' will be derived below).
+ *
+ * Positions 0..5 end with `i', which is not the `g' we want.  `i' does
+ * appear in `string', but two characters before the end.  We skip
+ * forward so as to make the `i's match up:
+ *
+ *      "Here is the string being searched into"        (text)
+ *        "string"                                      (pos = [2..7])
+ *
+ * Next we find that ` ' and `g' do not match.  Since ` ' does not appear
+ * in the pattern at all, we can skip forward 6:
+ *
+ *      "Here is the string being searched into"        (text)
+ *              "string"                                (pos = [8..13])
+ *
+ * Comparing `t' vs `g', we again find no match, and so we obtain the
+ * delta for `t', which is 4.  We skip to position 17:
+ *
+ *      "Here is the string being searched into"        (text)
+ *                  "string"                            (pos = [12..17])
+ *
+ * It thus takes only four steps to move the search point forward to the
+ * match, in this case.
+ *
+ * If the pattern has a recurring character, we must set the delta for
+ * that character to the distance of the one closest to the end:
+ *
+ *      "befuddle the cat"      (text)
+ *      "fuddle"                (pos = [0..5])
+ *      654321-                 (delta)
+ *
+ * We want the next search to line the `d's up like this:
+ *
+ *      "befuddle the cat"      (text)
+ *        "fuddle"              (pos = [2..7])
+ *
+ * and not like this:
+ *
+ *      "befuddle the cat"      (text)
+ *         "fuddle"             (pos = [3..8])
+ *
+ * so we take the smaller delta for d, i.e., 2.
+ *
+ * The last task is computing the delta we have noted above as `-':
+ *
+ *      "candlesticks"          (text)
+ *      "hand"                  (pos = [0..3])
+ *      4321-                   (delta)
+ *
+ * Here the `d' in `hand' matches the `d' in `candlesticks', but the
+ * strings differ.  Since there are no other `d's in `hand', we know
+ * that none of (cand,andl,ndle,dles) can match, and thus we want this
+ * delta to be 4 (the length of the pattern).  But if we had, e.g.:
+ *
+ *      "candlesticks"          (text)
+ *      "deed"                  (pos = [0..3])
+ *      4321-                   (delta)
+ *
+ * then we should advance to line up the other `d':
+ *
+ *      "candlesticks"          (text)
+ *         "deed"               (pos = [3..6])
+ *
+ * As this suggests, the delta should be that for the `d' nearest the
+ * end, but not including the end.  This is easily managed by setting up
+ * a delta table as follows:
+ *
+ *      for int:c in [0..255] { delta[c] = patlen; };
+ *      for int:x in [0..patlen-1) { delta[pat[x]] = patlen - (x + 1); };
+ *
+ * delta[pat[patlen-1]] is never written, so the last letter inherits the
+ * delta from an earlier iteration or from the previous loop.
+ *
+ * NB: the nonsense with `deltaspace' below exists merely because gcc
+ * does a horrible job of common subexpression elimination (it does not
+ * notice that the array is at a constant stack address).
+ */
+
+struct compiled_search_struct {
+        unsigned patlen;
+        unsigned deltaspace[CHAR_MAX + 1];
+};
+
+
+static char *
+BoyerMooreCompile (pat, patlen)
+    char *pat;
+    int   patlen;
+{
+        register unsigned char *p, *t;
+        register unsigned i, p1, j, *delta;
+        struct compiled_search_struct *cp;
+        int alloc_len;
+
+        /*
+         * Algorithm fails if pattern is empty.
+         */
+        if ((p1 = patlen) == 0)
+                return (NULL);
+
+        alloc_len = sizeof(struct compiled_search_struct) + patlen + 1;
+        cp = (struct compiled_search_struct *) ckalloc (alloc_len);
+
+        strncpy((char *)cp+sizeof(struct compiled_search_struct), pat, patlen);
+        *((char *)cp+alloc_len-1) = '\0';
+
+        /* set up deltas */
+        delta = cp->deltaspace;
+
+        for (i = 0; i <= CHAR_MAX; i++)
+                delta[i] = p1;
+
+        for (p = (unsigned char *)pat, i = p1; --i > 0;)
+                delta[*p++] = i;
+
+        cp->patlen = patlen;
+        return((char*) cp);
+}
+
+static char *
+BoyerMooreExecute (text, textlen, compPtr, patLenP)
+        char     *text;
+        unsigned  textlen;
+        char     *compPtr;
+        unsigned *patLenP;
+{
+        register unsigned char *p, *t;
+        struct compiled_search_struct *csp = 
+               (struct compiled_search_struct*) compPtr;
+        register unsigned i, p1, j, *delta = csp->deltaspace;
+        char *pat;
+        unsigned patlen;
+
+        *patLenP = p1 = patlen = csp->patlen;
+        /* code below fails (whenever i is unsigned) if pattern too long */
+        if (p1 > textlen)
+                return (NULL);
+
+        pat = (char *)csp + sizeof(struct compiled_search_struct);
+        /*
+         * From now on, we want patlen - 1.
+         * In the loop below, p points to the end of the pattern,
+         * t points to the end of the text to be tested against the
+         * pattern, and i counts the amount of text remaining, not
+         * including the part to be tested.
+         */
+        p1--;
+        p = (unsigned char *)pat + p1;
+        t = (unsigned char *)text + p1;
+        i = textlen - patlen;
+        for (;;) {
+                if (*p == *t && 
+                    memcmp((p - p1), (t - p1), p1) == 0)
+                        return ((char *)t - p1);
+                j = delta[*t];
+                if (i < j)
+                        break;
+                i -= j;
+                t += j;
+        }
+        return (NULL);
+}
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_RegExpClean --
+ *     Free all resources associated with a regular expression info 
+ *     structure..
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_RegExpClean (regExpPtr)
+    regexp_pt regExpPtr;
+{
+    if (regExpPtr->progPtr != NULL)
+       ckfree ((char *) regExpPtr->progPtr);
+    if (regExpPtr->boyerMoorePtr != NULL)
+       ckfree ((char *) regExpPtr->boyerMoorePtr);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * FindNonRegExpSubStr
+ *     Find the largest substring that does not have any regular 
+ *     expression meta-characters and is not located within `[...]'.
+ *     If the regexp contains an or (|), zero is returned, as the 
+ *     Boyer-Moore optimization does not work, since there are actually
+ *     multiple patterns.  The real solution is to build the Boyer-Moore
+ *     into the regular expression code.
+ *-----------------------------------------------------------------------------
+ */
+static int
+FindNonRegExpSubStr (expression, subStrPtrPtr)
+    char  *expression;
+    char **subStrPtrPtr;
+{
+    register char *subStrPtr = NULL;
+    register char  subStrLen = 0;
+    register char *scanPtr   = expression;
+    register int   len;
+
+    while (*scanPtr != '\0') {
+        len = strcspn (scanPtr, REXP_META);
+        /*
+         * If we are at a meta-character, by-pass till non-meta.  If we hit
+         * a `[' then by-pass the entire `[...]' range, but be careful, could
+         * have omitted `]'.  In a `|' is encountered (except in brackets),'
+         * we are through.
+         */
+        if (len == 0) {
+            scanPtr += strspn (scanPtr, REXP_META_NO_BRACKET_NO_OR);
+            if (*scanPtr == '|')
+                return 0;
+            if (*scanPtr == '[') {
+                scanPtr += strcspn (scanPtr, "]");
+                if (*scanPtr == ']')
+                    scanPtr++;
+            }          
+        } else {
+            if (len > subStrLen) {
+                subStrPtr = scanPtr;
+                subStrLen = len;
+            }
+            scanPtr += len;
+        }
+    }
+    *subStrPtrPtr = subStrPtr;
+    return subStrLen;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_RegExpCompile --
+ *     Compile a regular expression.
+ *
+ * Parameters:
+ *     o regExpPtr - Used to hold info on this regular expression.  If the
+ *       structure is being reused, it Tcl_RegExpClean should be called first.
+ *     o expression - Regular expression to compile.
+ *     o flags - The following flags are recognized:
+ *         o REXP_NO_CASE - Comparison will be regardless of case.
+ *         o REXP_BOTH_ALGORITHMS - If specified, a Boyer-Moore expression is 
+ *           compiled for the largest substring of the expression that does
+ *           not contain any meta-characters.  This is slows compiling, but
+ *           speeds up large searches.
+ *
+ * Results:
+ *     Standard TCL results.
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_RegExpCompile (interp, regExpPtr, expression, flags)
+    Tcl_Interp  *interp;
+    regexp_pt    regExpPtr;
+    char        *expression;
+    int          flags;
+{
+    char *expBuf;
+    int   anyMeta;
+
+    if (*expression == '\0') {
+        Tcl_AppendResult (interp, "Null regular expression", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    regExpPtr->progPtr = NULL;
+    regExpPtr->boyerMoorePtr = NULL;
+    regExpPtr->noCase = flags & REXP_NO_CASE;
+
+    if (flags & REXP_NO_CASE) {
+        expBuf = ckalloc (strlen (expression) + 1);
+        Tcl_DownShift (expBuf, expression);
+    } else
+        expBuf = expression;
+
+    anyMeta = strpbrk (expBuf, REXP_META) != NULL;
+
+    /*
+     * If no meta-characters, use Boyer-Moore string matching only.
+     */
+    if (!anyMeta) {
+        regExpPtr->boyerMoorePtr = BoyerMooreCompile (expBuf, strlen (expBuf));
+        goto okExitPoint;
+    }
+    /*
+     * Build a Boyer-Moore on the largest non-meta substring, if requested,
+     * and the reg-exp does not contain a `|' (or).  If less that three
+     * characters in the string, don't use B-M, as it seems not optimal at
+     * this point.
+     */
+    if (flags & REXP_BOTH_ALGORITHMS) {
+        char *subStrPtr;
+        int   subStrLen;
+        
+        subStrLen = FindNonRegExpSubStr (expBuf, &subStrPtr);
+        if (subStrLen > 2)
+            regExpPtr->boyerMoorePtr = 
+                BoyerMooreCompile (subStrPtr, subStrLen);
+    }
+    
+    /*
+     * Compile meta-character containing regular expression.
+     */
+    tclRegexpError = NULL;
+    regExpPtr->progPtr = regcomp (expBuf);
+    if (tclRegexpError != NULL) {
+        if (flags & REXP_NO_CASE)
+            ckfree (expBuf);
+        Tcl_AppendResult (interp, "error in regular expression: ", 
+                          tclRegexpError, (char *) NULL);
+        if (flags & REXP_NO_CASE)
+            ckfree (expBuf);
+        Tcl_RegExpClean (regExpPtr);
+    }
+  
+okExitPoint: 
+    if (flags & REXP_NO_CASE)
+        ckfree (expBuf);
+    return TCL_OK;
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_RegExpExecute --
+ *     Execute a regular expression compiled with Boyer-Moore and/or 
+ *     regexp.
+ *
+ * Parameters:
+ *     o regExpPtr - Used to hold info on this regular expression.
+ *     o matchStrIn - String to match against the regular expression.
+ *     o matchStrLower - Optional lower case version of the string.  If
+ *       multiple no case matches are being done, time can be saved by
+ *       down shifting the string in advance.  NULL if not a no-case 
+ *       match or this procedure is to do the down shifting.
+ *
+ * Results:
+ *     TRUE if a match, FALSE if it does not match.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_RegExpExecute (interp, regExpPtr, matchStrIn, matchStrLower)
+    Tcl_Interp  *interp;
+    regexp_pt    regExpPtr;
+    char        *matchStrIn;
+    char        *matchStrLower;
+{
+    char *matchStr;
+    int   result;
+
+    if (regExpPtr->noCase) {
+        if (matchStrLower == NULL) {
+            matchStr = ckalloc (strlen (matchStrIn) + 1);
+            Tcl_DownShift (matchStr, matchStrIn);
+        } else
+            matchStr = matchStrLower;
+    } else
+        matchStr = matchStrIn;
+
+    /*
+     * If a Boyer-Moore pattern has been compiled, use that algorithm to test
+     * against the text.  If that passes, then test with the regexp if we have
+     * it.
+     */
+    if (regExpPtr->boyerMoorePtr != NULL) {
+        char     *startPtr;
+        unsigned  matchLen;
+
+        startPtr = BoyerMooreExecute (matchStr, strlen (matchStr), 
+                                      regExpPtr->boyerMoorePtr, &matchLen);
+        if (startPtr == NULL) {
+            result = FALSE;
+            goto exitPoint;
+        }
+        if (regExpPtr->progPtr == NULL) {
+            result = TRUE;  /* No regexp, its a match! */
+            goto exitPoint;
+        }
+    }
+    
+    /*
+     * Give it a go with full regular expressions
+     */
+    result = regexec (regExpPtr->progPtr, matchStr);
+
+    /*
+     * Clean up and return status here.
+     */
+exitPoint:
+    if ((regExpPtr->noCase) && (matchStrLower == NULL))
+        ckfree (matchStr);
+    return result;
+}
diff --git a/src/tclx/src/tclxsel.c b/src/tclx/src/tclxsel.c
new file mode 100644 (file)
index 0000000..07e8f86
--- /dev/null
@@ -0,0 +1,429 @@
+/*
+ * tclXselect.c
+ *
+ * Extended Tcl file I/O commands.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXselect.c,v 2.0 1992/10/16 04:51:10 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+#ifdef MSDOS
+typedef struct {
+       long    fds_bits[1];
+} fd_set;              /* GRB for Micropolis */
+#endif
+
+extern
+double floor ();
+
+#ifdef TCL_USE_BZERO_MACRO
+#    define bzero(to,length)    memset(to,'\0',length)
+#endif
+
+/*
+ * Macro to probe the stdio buffer to see if any data is pending in the
+ * buffer.  Different versions are provided for System V and BSD stdio.
+ */
+
+#ifdef __SLBF
+#   define READ_DATA_PENDING(fp) (fp->_r > 0)
+#else
+#   define READ_DATA_PENDING(fp) (fp->_cnt != 0)
+#endif
+
+/*
+ * A few systems (A/UX 2.0) have select but no macros, define em in this case.
+ */
+#if !defined(TCL_NO_SELECT) && !defined(FD_SET)
+#   define FD_SET(fd,fdset)    (fdset)->fds_bits[0] |= (1<<(fd))
+#   define FD_CLR(fd,fdset)    (fdset)->fds_bits[0] &= ~(1<<(fd))
+#   define FD_ZERO(fdset)              (fdset)->fds_bits[0] = 0
+#   define FD_ISSET(fd,fdset)  (((fdset)->fds_bits[0]) & (1<<(fd)))
+#endif
+
+/*
+ * Prototypes of internal functions.
+ */
+static int
+ParseSelectFileList _ANSI_ARGS_((Tcl_Interp *interp,
+                                 char       *handleList,
+                                 fd_set     *fileDescSetPtr,
+                                 FILE     ***fileDescListPtr,
+                                 int        *maxFileIdPtr));
+
+static int
+FindPendingData _ANSI_ARGS_((int         fileDescCnt,
+                             FILE      **fileDescList,
+                             fd_set     *fileDescSetPtr));
+
+static char *
+ReturnSelectedFileList _ANSI_ARGS_((fd_set     *fileDescSetPtr,
+                                    fd_set     *fileDescSet2Ptr,
+                                    int         fileDescCnt,
+                                    FILE      **fileDescList));
+
+#ifndef TCL_NO_SELECT
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ParseSelectFileList --
+ *
+ *   Parse a list of file handles for select.
+ *
+ * Parameters:
+ *   o interp (O) - Error messages are returned in the result.
+ *   o handleList (I) - The list of file handles to parse, may be empty.
+ *   o fileDescSetPtr (O) - The select fd_set for the parsed handles is
+ *     filled in.  Should be cleared before this procedure is called.
+ *   o fileDescListPtr (O) - A pointer to a dynamically allocated list of
+ *     the FILE ptrs that are in the set.  If the list is empty, NULL is
+ *     returned.
+ *   o maxFileIdPtr (I/O) - If a file id greater than the current value is
+ *     encountered, it will be set to that file id.
+ * Returns:
+ *   The number of files in the list, or -1 if an error occured.
+ *-----------------------------------------------------------------------------
+ */
+static int
+ParseSelectFileList (interp, handleList, fileDescSetPtr, fileDescListPtr,
+                     maxFileIdPtr)
+    Tcl_Interp *interp;
+    char       *handleList;
+    fd_set     *fileDescSetPtr;
+    FILE     ***fileDescListPtr;
+    int        *maxFileIdPtr;
+{
+    int    handleCnt, idx;
+    char **handleArgv;
+    FILE **fileDescList;
+
+    /*
+     * Optimize empty list handling.
+     */
+    if (handleList [0] == '\0') {
+        *fileDescListPtr = NULL;
+        return 0;
+    }
+
+    if (Tcl_SplitList (interp, handleList, &handleCnt, &handleArgv) != TCL_OK)
+        return -1;
+
+    /*
+     * Handle case of an empty list.
+     */
+    if (handleCnt == 0) {
+        *fileDescListPtr = NULL;
+        ckfree ((char *) handleArgv);
+        return 0;
+    }
+
+    fileDescList = (FILE **) ckalloc (sizeof (FILE *) * handleCnt);
+
+    for (idx = 0; idx < handleCnt; idx++) {
+        OpenFile *filePtr;
+        int       fileId;
+
+        if (TclGetOpenFile (interp, handleArgv [idx], &filePtr) != TCL_OK) {
+            ckfree ((char *) handleArgv);
+            ckfree ((char *) fileDescList);
+            return -1;
+        }
+        fileId = fileno (filePtr->f);
+        fileDescList [idx] = filePtr->f;
+
+        FD_SET (fileId, fileDescSetPtr);
+        if (fileId > *maxFileIdPtr)
+            *maxFileIdPtr = fileId;
+    }
+
+    *fileDescListPtr = fileDescList;
+    ckfree ((char *) handleArgv);
+    return handleCnt;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * FindPendingData --
+ *
+ *   Scan a list of read file descriptors to determine if any of them
+ *   have data pending in their stdio buffers.
+ *
+ * Parameters:
+ *   o fileDescCnt (I) - Number of descriptors in the list.
+ *   o fileDescListPtr (I) - A pointer to a list of the FILE pointers for
+ *     files that are in the set.
+ *   o fileDescSetPtr (I) - A select fd_set with will have a bit set for
+ *     every file that has data pending it its buffer.
+ * Returns:
+ *   TRUE if any where found that had pending data, FALSE if none were found.
+ *-----------------------------------------------------------------------------
+ */
+static int
+FindPendingData (fileDescCnt, fileDescList, fileDescSetPtr)
+    int         fileDescCnt;
+    FILE      **fileDescList;
+    fd_set     *fileDescSetPtr;
+{
+    int idx, found = FALSE;
+
+    FD_ZERO (fileDescSetPtr);
+
+#ifndef IS_LINUX
+    for (idx = 0; idx < fileDescCnt; idx++) {
+        if (READ_DATA_PENDING (fileDescList [idx])) {
+            FD_SET (fileno (fileDescList [idx]), fileDescSetPtr);
+            found = TRUE;
+        }
+    }
+#endif
+    return found;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ReturnSelectedFileList --
+ *
+ *   Take the resulting file descriptor sets from a select, and the
+ *   list of file descritpors and build up a list of Tcl file handles.
+ *
+ * Parameters:
+ *   o fileDescSetPtr (I) - The select fd_set.
+ *   o fileDescSet2Ptr (I) - Pointer to a second descriptor to also check
+ *     (their may be overlap).  NULL if no second set.
+ *   o fileDescCnt (I) - Number of descriptors in the list.
+ *   o fileDescListPtr (I) - A pointer to a list of the FILE pointers for
+ *     files that are in the set.  If the list is empty, NULL is returned.
+ * Returns:
+ *   A dynamicly allocated list of file handles.  If the handles are empty,
+ *   it still returns a NULL list to make clean up easy.
+ *-----------------------------------------------------------------------------
+ */
+static char *
+ReturnSelectedFileList (fileDescSetPtr, fileDescSet2Ptr, fileDescCnt,
+                        fileDescList) 
+    fd_set     *fileDescSetPtr;
+    fd_set     *fileDescSet2Ptr;
+    int         fileDescCnt;
+    FILE      **fileDescList;
+{
+    int    idx, handleCnt, fileNum;
+    char  *fileHandleList;
+    char **fileHandleArgv, *nextByte;
+
+    /*
+     * Special case the empty list.
+     */
+    if (fileDescCnt == 0) {
+        fileHandleList = ckalloc (1);
+        fileHandleList [0] = '\0';
+        return fileHandleList;
+    }
+
+    /*
+     * Allocate enough room to hold the argv plus all the `fileNNN' strings
+     */
+    fileHandleArgv = (char **)
+        ckalloc ((fileDescCnt * sizeof (char *)) + (9 * fileDescCnt));
+    nextByte = ((char *) fileHandleArgv) + (fileDescCnt * sizeof (char *));
+
+    handleCnt = 0;
+    for (idx = 0; idx < fileDescCnt; idx++) {
+        fileNum = fileno (fileDescList [idx]);
+
+        if (FD_ISSET (fileNum, fileDescSetPtr) ||
+            (fileDescSet2Ptr != NULL &&
+             FD_ISSET (fileNum, fileDescSet2Ptr))) {
+
+            fileHandleArgv [handleCnt] = nextByte;  /* Allocate storage */
+            nextByte += 8;
+            sprintf (fileHandleArgv [handleCnt], "file%d", fileNum);
+            handleCnt++;
+        }
+    }
+
+    fileHandleList = Tcl_Merge (handleCnt, fileHandleArgv);
+    ckfree ((char *) fileHandleArgv);
+
+    return fileHandleList;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_SelectCmd --
+ *  Implements the select TCL command:
+ *      select readhandles [writehandles] [excepthandles] [timeout]
+ *
+ *  This command is extra smart in the fact that it checks for read data
+ * pending in the stdio buffer first before doing a select.
+ *   
+ * Results:
+ *     A list in the form:
+ *        {readhandles writehandles excepthandles}
+ *     or {} it the timeout expired.
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_SelectCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+
+    fd_set readFdSet,            writeFdSet,            exceptFdSet;
+    int    readDescCnt = 0,      writeDescCnt = 0,      exceptDescCnt = 0;
+    FILE **readDescList = NULL,**writeDescList = NULL,**exceptDescList = NULL;
+    fd_set readFdSet2;
+    char  *retListArgv [3];
+
+    int             numSelected, maxFileId = 0, pending;
+    int             result = TCL_ERROR;
+    struct timeval  timeoutRec;
+    struct timeval *timeoutRecPtr;
+
+
+    if (argc < 2) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " readhandles [writehandles] [excepthandles]",
+                          " [timeout]", (char *) NULL);
+        return TCL_ERROR;
+    }
+    
+    /*
+     * Parse the file handles and set everything up for the select call.
+     */
+    FD_ZERO (&readFdSet);
+    FD_ZERO (&writeFdSet);
+    FD_ZERO (&exceptFdSet);
+    readDescCnt = ParseSelectFileList (interp, argv [1], &readFdSet, 
+                                       &readDescList, &maxFileId);
+    if (readDescCnt < 0)
+        goto exitPoint;
+    if (argc > 2) {
+        writeDescCnt = ParseSelectFileList (interp, argv [2], &writeFdSet, 
+                                            &writeDescList, &maxFileId);
+        if (writeDescCnt < 0)
+            goto exitPoint;
+    }
+    if (argc > 3) {
+        exceptDescCnt = ParseSelectFileList (interp, argv [3], &exceptFdSet, 
+                                             &exceptDescList, &maxFileId);
+        if (exceptDescCnt < 0)
+            goto exitPoint;
+    }
+    
+    /*
+     * Get the time out.  Zero is different that not specified.
+     */
+    timeoutRecPtr = NULL;
+    if ((argc > 4) && (argv [4][0] != '\0')) {
+        double  timeout, seconds, microseconds;
+
+        if (Tcl_GetDouble (interp, argv [4], &timeout) != TCL_OK)
+            goto exitPoint;
+        if (timeout < 0) {
+            Tcl_AppendResult (interp, "timeout must be greater than or equal",
+                              " to zero", (char *) NULL);
+            goto exitPoint;
+        }
+        seconds = floor (timeout);
+        microseconds = (timeout - seconds) * 1000000.0;
+        timeoutRec.tv_sec = seconds;
+        timeoutRec.tv_usec = microseconds;
+        timeoutRecPtr = &timeoutRec;
+    }
+
+    /*
+     * Check if any data is pending in the read stdio buffers.  If there is,
+     * then do the select, but don't block in it.
+     */
+
+    pending = FindPendingData (readDescCnt, readDescList, &readFdSet2);
+    if (pending) {
+        timeoutRec.tv_sec = 0;
+        timeoutRec.tv_usec = 0;
+        timeoutRecPtr = &timeoutRec;
+    }
+
+    /*
+     * All set, do the select.
+     */
+    numSelected = select (maxFileId + 1, &readFdSet, &writeFdSet, &exceptFdSet,
+                          timeoutRecPtr);
+    if (numSelected < 0) {
+        interp->result = Tcl_UnixError (interp);
+        goto exitPoint;
+    }
+
+    /*
+     * Return the result, either a 3 element list, or leave the result
+     * empty if the timeout occured.
+     */
+    if (numSelected > 0) {
+        retListArgv [0] = ReturnSelectedFileList (&readFdSet,
+                                                  &readFdSet2,
+                                                  readDescCnt,
+                                                  readDescList);
+        retListArgv [1] = ReturnSelectedFileList (&writeFdSet,
+                                                  NULL,
+                                                  writeDescCnt, 
+                                                  writeDescList);
+        retListArgv [2] = ReturnSelectedFileList (&exceptFdSet,
+                                                  NULL,
+                                                  exceptDescCnt, 
+                                                  exceptDescList);
+        Tcl_SetResult (interp, Tcl_Merge (3, retListArgv), TCL_DYNAMIC); 
+        ckfree ((char *) retListArgv [0]);
+        ckfree ((char *) retListArgv [1]);
+        ckfree ((char *) retListArgv [2]);
+    }
+
+    result = TCL_OK;
+
+exitPoint:
+    if (readDescList != NULL)
+        ckfree ((char *) readDescList);
+    if (writeDescList != NULL)
+        ckfree ((char *) writeDescList);
+    if (exceptDescList != NULL)
+        ckfree ((char *) exceptDescList);
+    return result;
+
+}
+#else
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_SelectCmd --
+ *     Dummy select command that returns an error for systems that don't
+ *     have select.
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_SelectCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    Tcl_AppendResult (interp, 
+                      "select is not available on this version of Unix",
+                      (char *) NULL);
+    return TCL_ERROR;
+}
+#endif
diff --git a/src/tclx/src/tclxsig.c b/src/tclx/src/tclxsig.c
new file mode 100644 (file)
index 0000000..3b0ae6a
--- /dev/null
@@ -0,0 +1,1034 @@
+/*
+ * tclXsignal.c --
+ *
+ * Tcl Unix signal support routines and the signal and commands.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXsignal.c,v 2.0 1992/10/16 04:51:12 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+
+#ifndef SIGCLD
+#   define SIGCLD SIGCHLD
+#endif
+#ifndef SIGCHLD
+#   define SIGCHLD SIGCLD
+#endif
+
+#ifndef MAXSIG
+#    define MAXSIG 32
+#endif
+
+/*
+ * Signal name table maps name to number.
+ */
+
+#define SIG_NAME_MAX 7
+
+static struct {char *name;
+        short num;
+       } sigNameTable [] = {
+    "HUP",     SIGHUP,
+    "INT",     SIGINT,
+    "QUIT",    SIGQUIT,
+    "ILL",     SIGILL,
+    "TRAP",    SIGTRAP,
+    "IOT",     SIGIOT,
+#ifdef SIGABRT
+    "ABRT",    SIGABRT,
+#endif
+#ifdef SIGEMT
+    "EMT",     SIGEMT,
+#endif
+#ifdef SIGSYS
+    "SYS",     SIGSYS,
+#endif
+    "FPE",     SIGFPE,
+    "KILL",    SIGKILL,
+    "BUS",     SIGBUS,
+    "SEGV",    SIGSEGV,
+    "PIPE",    SIGPIPE,
+    "ALRM",    SIGALRM,
+    "TERM",    SIGTERM,
+    "USR1",    SIGUSR1,
+    "USR2",    SIGUSR2,
+    "CLD",     SIGCLD,
+    "CHLD",    SIGCHLD,
+#ifdef SIGPWR
+    "PWR",     SIGPWR,
+#endif
+#ifdef SIGPOLL
+    "POLL",    SIGPOLL,
+#endif
+#ifdef SIGSTOP
+    "STOP",    SIGSTOP,
+#endif
+#ifdef SIGTSTP
+    "TSTP",    SIGTSTP,
+#endif
+#ifdef SIGCONT
+    "CONT",    SIGCONT,
+#endif
+#ifdef SIGTTIN
+    "TTIN",    SIGTTIN,
+#endif
+#ifdef SIGTTOU
+    "TTOU",    SIGTTOU,
+#endif
+    NULL,         -1};
+
+#ifdef TCL_SIG_PROC_INT
+#   define SIG_PROC_RET_TYPE int
+#else
+#   define SIG_PROC_RET_TYPE void
+#endif
+
+typedef SIG_PROC_RET_TYPE (*signalProcPtr_t) _ANSI_ARGS_((int));
+
+/*
+ * Class of actions that can be set by the signal command.
+ */
+#define SIGACT_SET     1   /* Set the signal     */
+#define SIGACT_GET     2   /* Get the signal     */
+#define SIGACT_BLOCK   3   /* Block the signal   */
+#define SIGACT_UNBLOCK 4   /* Unblock the signal */
+
+/*
+ * Defines if this is not Posix.
+ */
+#ifndef SIG_BLOCK
+#   define SIG_BLOCK       1
+#   define SIG_UNBLOCK     2
+#endif
+
+/*
+ * Messages.
+ */
+static char *noPosix = "Posix signals are not available on this system";
+
+/*
+ * Globals that indicate that some signal was received and how many of each
+ * signal type has not yet been processed.
+ */
+int             tclReceivedSignal = FALSE;    /* A signal was received */ 
+static unsigned signalsReceived [MAXSIG];     /* Counters of signals   */
+
+/*
+ * Table of commands to evaluate when a signal occurs.  If the command is
+ * NULL and the signal is received, an error is returned.
+ */
+static char *signalTrapCmds [MAXSIG];
+
+/*
+ * Prototypes of internal functions.
+ */
+
+static int
+SigNameToNum _ANSI_ARGS_((char *sigName));
+
+static signalProcPtr_t
+GetSignalState _ANSI_ARGS_((int signalNum));
+
+static int
+SetSignalAction _ANSI_ARGS_((int             signalNum,
+                             signalProcPtr_t sigFunc));
+
+static SIG_PROC_RET_TYPE
+TclSignalTrap _ANSI_ARGS_((int signalNum));
+
+static int
+EvalTrapCode _ANSI_ARGS_((Tcl_Interp *interp,
+                          int         signalNum,
+                          char       *command));
+
+static int
+ParseSignalList _ANSI_ARGS_((Tcl_Interp *interp,
+                             char       *signalListStr,
+                             int         signalList []));
+
+static char *
+SignalBlocked _ANSI_ARGS_((Tcl_Interp  *interp,
+                           int          signalNum));
+
+static int
+GetSignalStates  _ANSI_ARGS_((Tcl_Interp *interp,
+                              int         signalListSize,
+                              int         signalList [MAXSIG]));
+
+static int
+SetSignalStates  _ANSI_ARGS_((Tcl_Interp      *interp,
+                              int              signalListSize,
+                              int              signalList [MAXSIG],
+                              signalProcPtr_t  actionFunc,
+                              char            *command));
+
+static int
+BlockSignals _ANSI_ARGS_((Tcl_Interp  *interp,
+                          int          action,
+                          int          signalListSize,
+                          int          signalList [MAXSIG]));
+
+static void
+SignalCmdCleanUp _ANSI_ARGS_((ClientData clientData));
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * SigNameToNum --
+ *     Converts a UNIX signal name to its number, returns -1 if not found.
+ *     the name may be upper or lower case and may optionally have the 
+ *     leading "SIG" omitted.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static int
+SigNameToNum (sigName)
+    char *sigName;
+{
+    char  sigNameUp [SIG_NAME_MAX+1];  /* Upshifted signal name */
+    char *sigNamePtr; 
+    int   idx;
+
+    /*
+     * Copy and upshift requested name.
+     */
+
+    if (strlen (sigName) > SIG_NAME_MAX)
+        return -1;   /* Name too long */
+
+    Tcl_UpShift (sigNameUp, sigName);
+
+    if (STRNEQU (sigNameUp, "SIG", 3))
+        sigNamePtr = &sigNameUp [3];
+    else
+        sigNamePtr = sigNameUp;
+
+    for (idx = 0; sigNameTable [idx].num != -1; idx++)
+        if (STREQU (sigNamePtr, sigNameTable [idx].name))
+            break;
+
+    return sigNameTable [idx].num;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_KillCmd --
+ *     Implements the TCL kill command:
+ *        kill [signal] proclist
+ *
+ * Results:
+ *  Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_KillCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int     argc;
+    char      **argv;
+{
+    int    signalNum, idx, procId, procArgc, result = TCL_ERROR;
+    char **procArgv;
+
+    if ((argc < 2) || (argc > 3)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " [signal] processlist", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (argc == 2)
+        signalNum = SIGTERM;
+    else {
+        if (!Tcl_StrToInt (argv[1], 0, &signalNum)) {
+            signalNum = SigNameToNum (argv[1]);
+        }
+        if ((signalNum < 0) || (signalNum > NSIG)) {
+            Tcl_AppendResult (interp, "invalid signal", (char *) NULL);
+            return TCL_ERROR;
+        }
+    }
+
+    if (Tcl_SplitList (interp, argv [argc - 1], &procArgc, 
+                       &procArgv) != TCL_OK)
+        return TCL_ERROR;
+
+    for (idx = 0; idx < procArgc; idx++) {
+
+        if (Tcl_GetInt (interp, procArgv [idx], &procId) != TCL_OK)
+            goto exitPoint;
+
+        if (kill ((pid_t) procId, signalNum) < 0) {
+            Tcl_AppendResult (interp, "pid ", procArgv [idx],
+                              ": ", Tcl_UnixError (interp), (char *) NULL);
+            goto exitPoint;
+        }
+     }
+
+    result = TCL_OK;
+exitPoint:
+    ckfree ((char *) procArgv);
+    return result;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * GetSignalState --
+ *     Get the current state of the specified signal.
+ * Parameters:
+ *   o signalNum (I) - Signal number to query.
+ * Results
+ *   The signal function or SIG_DFL or SIG_IGN.  If an error occures,
+ *   SIG_ERR is returned (check errno);
+ *-----------------------------------------------------------------------------
+ */
+static signalProcPtr_t
+GetSignalState (signalNum)
+    int signalNum;
+{
+#ifdef TCL_POSIX_SIG
+    struct sigaction currentState;
+
+    if (sigaction (signalNum, NULL, &currentState) < 0)
+        return SIG_ERR;
+    return currentState.sa_handler;
+#else
+    signalProcPtr_t  actionFunc;
+
+    if (signalNum == SIGKILL)
+        return SIG_DFL;
+
+    actionFunc = signal (signalNum, SIG_DFL);
+    if (actionFunc == SIG_ERR)
+        return SIG_ERR;
+    if (actionFunc != SIG_DFL)
+        signal (signalNum, actionFunc);  /* reset */
+    return actionFunc;
+#endif
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * SetSignalAction --
+ *     Set the action to occur when a signal is received.
+ * Parameters:
+ *   o signalNum (I) - Signal number to query.
+ *   o sigFunc (O) - The signal function or SIG_DFL or SIG_IGN.
+ * Results
+ *   TRUE if ok,  FALSE if an error (check errno).
+ *-----------------------------------------------------------------------------
+ */
+static int
+SetSignalAction (signalNum, sigFunc)
+    int             signalNum;
+    signalProcPtr_t sigFunc;
+{
+#ifdef TCL_POSIX_SIG
+    struct sigaction newState;
+    
+    newState.sa_handler = sigFunc;
+    sigfillset (&newState.sa_mask);
+    newState.sa_flags = 0;
+
+    if (sigaction (signalNum, &newState, NULL) < 0)
+        return FALSE;
+
+    return TRUE;
+#else
+    if (signal (signalNum, sigFunc) == SIG_ERR)
+        return FALSE;
+    else
+        return TRUE;
+#endif
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * TclSignalTrap --
+ *     Trap handler for UNIX signals.  Sets a flag indicating that the
+ *     trap has occured, saves the name and rearms the trap.  The flag
+ *     will be seen by the interpreter when its safe to trap.
+ * Globals:
+ *   o tclReceivedSignal (O) - Set to TRUE, to indicate a signal was received.
+ *   o signalsReceived (O) - The count of each signal that was received.
+ *-----------------------------------------------------------------------------
+ */
+static SIG_PROC_RET_TYPE
+TclSignalTrap (signalNum)
+    int signalNum;
+{
+    /*
+     * Set flags that are checked by the eval loop.
+     */
+    signalsReceived [signalNum]++;
+    tclReceivedSignal = TRUE;
+
+#ifndef TCL_POSIX_SIG
+    /*
+     * For old-style Unix signals, the signal must be explictly re-enabled.
+     * Not done for SIGCHLD, as we would continue to the signal until the
+     * wait is done.  This is fixed by Posix signals and is not necessary under
+     * BSD, but it done this way for consistency.
+     */
+    if (signalNum != SIGCHLD) {
+        if (SetSignalAction (signalNum, TclSignalTrap) < 0)
+            panic ("TclSignalTrap bug");
+    }
+#endif
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * EvalTrapCode --
+ *     Run code as the result of a signal.  The code will be run in the
+ *     global context, with the symbolic signal name in a global variable.
+ *     signalReceived.  If an error occured, then the result will be
+ *     left in the interp, if no error occured, the result will be reset.
+ * Parameters:
+ *   o interp (I/O) - The interpreter to run the signal in.
+ *   o signalNum (I) - The signal number of the signal that occured.
+ *   o command (I) - The command string to execute.
+ * Return:
+ *   TCL_OK or TCL_ERROR.
+ *-----------------------------------------------------------------------------
+ */
+static int
+EvalTrapCode (interp, signalNum, command)
+    Tcl_Interp *interp;
+    int         signalNum;
+    char       *command;
+{
+    Interp        *iPtr = (Interp *) interp;
+    char          *signalName;
+    int            result;
+    CallFrame     *savedVarFramePtr;
+
+    Tcl_ResetResult (interp);
+
+    /*
+     * Modify the interpreter state to execute in the global frame.
+     */
+    savedVarFramePtr = iPtr->varFramePtr;
+    iPtr->varFramePtr = NULL;
+
+    /*
+     * Force name to always be SIGCHLD, even if system defines only SIGCLD.
+     */
+    if (signalNum == SIGCHLD)
+        signalName = "SIGCHLD";
+    else
+        signalName = Tcl_SignalId (signalNum);
+
+    if (Tcl_SetVar (interp, "signalReceived", signalName,
+                    TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG) == NULL)
+        result = TCL_ERROR;
+    else
+        result = TCL_OK;
+    if (result == TCL_OK);
+        result = Tcl_Eval (interp, signalTrapCmds [signalNum], 0, NULL);
+
+    /*
+     * Restore the frame pointer and return the result (only OK or ERROR).
+     */
+    iPtr->varFramePtr = savedVarFramePtr;
+
+    if (result == TCL_ERROR) {
+        char errorInfo [TCL_RESULT_SIZE];
+
+        sprintf (errorInfo, "\n    while executing signal trap code for %s%s",
+                 signalName, " signal");
+        Tcl_AddErrorInfo (interp, errorInfo);
+
+        return TCL_ERROR;
+    } else {
+        Tcl_ResetResult (interp);
+        return TCL_OK;
+    }
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ResetSignals --
+ *  
+ *   Reset all of the signal flags to indicate that no signals have 
+ * occured.  This is used by the shell at the beginning of each interactive
+ * command
+ *
+ * Globals:
+ *   o tclReceivedSignal (O) - Will be cleared.
+ *   o signalsReceived (O) - The count of each signal that was received.
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_ResetSignals ()
+{
+    int  signalNum;
+
+    tclReceivedSignal = 0;
+    for (signalNum = 0; signalNum < MAXSIG; signalNum++) 
+        signalsReceived [signalNum] = 0;
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CheckForSignal --
+ *  
+ *   Called by Tcl_Eval to check if a signal was received when Tcl_Eval is in
+ * a safe state.  If the signal was received, this handles processing the
+ * signal prehaps recursively eval-ing some code.  This is called just after a
+ * command completes.  The results of the command are passed to this procedure
+ * and may be altered by it.  If trap code is specified for the signal that
+ * was received, then the trap will be executed, otherwise an error result
+ * will be returned indicating that the signal occured.  If an error is
+ * returned, clear the errorInfo variable.  This makes sure it exists and
+ * that it is empty, otherwise bogus or non-existant information will be
+ * returned if this routine was called somewhere besides Tcl_Eval.  If a
+ * signal was received multiple times and a trap is set on it, then that
+ * trap will be executed for each time the signal was received.
+ * 
+ * Parameters:
+ *   o interp (I/O) - interp->result should contain the result for
+ *     the command that just executed.  This will either be restored or
+ *     replaced with a new result.
+ *   o cmdResultCode (I) - The integer result returned by the command that
+ *     Tcl_Eval just completed.  Should be TCL_OK if not called from
+ *     Tcl_Eval.
+ * Globals:
+ *   o tclReceivedSignal (I/O) - Will be cleared.
+ *   o signalsReceived (I/O) - The count of each signal that was received.
+ * Returns:
+ *   Either the original result code, an error result if one of the
+ *   trap commands returned an error, or an error indicating the
+ *   a signal occured.
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_CheckForSignal (interp, cmdResultCode)
+    Tcl_Interp *interp;
+    int         cmdResultCode;
+{
+    char   *savedResult;
+    int     signalNum, result, sigCnt, retErrorForSignal = -1;
+
+    if (!tclReceivedSignal)
+        return cmdResultCode;  /* No signal received */
+
+    savedResult = ckalloc (strlen (interp->result) + 1);
+    strcpy (savedResult, interp->result);
+    Tcl_ResetResult (interp);
+
+    for (signalNum = 1; signalNum < MAXSIG; signalNum++) {
+        if (signalsReceived [signalNum] == 0)
+            continue;
+        
+        if (signalTrapCmds [signalNum] == NULL) {
+            retErrorForSignal = signalNum;
+            signalsReceived [signalNum] = 0;
+        } else {
+            sigCnt = signalsReceived [signalNum];
+            signalsReceived [signalNum] = 0;
+            
+            while (sigCnt-- > 0) {
+                result = EvalTrapCode (interp, signalNum,
+                                       signalTrapCmds [signalNum]);
+                if (result == TCL_ERROR)
+                    goto exitPoint;
+            }
+        }
+    }
+
+    if (retErrorForSignal >= 0) {
+        char *signalName;
+
+        /*
+         * Force name to always be SIGCHLD, even if system defines only SIGCLD.
+         */
+        if (retErrorForSignal == SIGCHLD)
+            signalName = "SIGCHLD";
+        else
+            signalName = Tcl_SignalId (retErrorForSignal);
+
+        Tcl_SetErrorCode (interp, "UNIX", "SIG", signalName, (char*) NULL);
+        Tcl_AppendResult (interp, signalName, " signal received", 
+                          (char *)NULL);
+        Tcl_SetVar (interp, "errorInfo", "", TCL_GLOBAL_ONLY);
+        result = TCL_ERROR;
+    } else {
+        Tcl_SetResult (interp, savedResult, TCL_DYNAMIC);
+        savedResult = NULL;
+        result = cmdResultCode;
+    }
+
+exitPoint:
+    if (savedResult != NULL)
+        ckfree (savedResult);
+    /*
+     * An error might have caused clearing of some signal flags to be missed.
+     */
+    Tcl_ResetSignals ();
+    return result;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ParseSignalList --
+ *  
+ *   Parse a list of signal names or numbers.
+ * 
+ * Parameters:
+ *   o interp (O) - Interpreter for returning errors.
+ *   o signalListStr (I) - The Tcl list of signals to convert.
+ *   o signalList (O) - The list of converted signal numbers, must be
+ *     big enough to hold MAXSIG signals.
+ *     Tcl_Eval just completed.
+ * Returns:
+ *   The number of signals converted, or -1 if an error occures.
+ *-----------------------------------------------------------------------------
+ */
+static int
+ParseSignalList (interp, signalListStr, signalList)
+    Tcl_Interp *interp;
+    char       *signalListStr;
+    int         signalList [];
+{
+    char         **signalListArgv;
+    int            signalListSize, signalNum, idx;
+    int            result = -1;
+    char          *signalName;
+
+    if (Tcl_SplitList (interp, signalListStr, &signalListSize, 
+                       &signalListArgv) != TCL_OK)
+        return -1;
+
+    if (signalListSize > MAXSIG) {
+        Tcl_AppendResult (interp, "too many signals supplied in list",
+                          (char *) NULL);
+        goto exitPoint;
+    }
+
+    if (signalListSize == 0) {
+        Tcl_AppendResult (interp, "signal list may not be empty",
+                          (char *) NULL);
+        goto exitPoint;
+    }
+
+    for (idx = 0; idx < signalListSize; idx++) {
+        signalName = signalListArgv [idx];
+
+        if (Tcl_StrToInt (signalName, 0, &signalNum))
+            signalName = Tcl_SignalId (signalNum);
+        else
+            signalNum = SigNameToNum (signalName);
+
+        if (signalName == NULL) {
+            char numBuf [20];
+
+            sprintf (numBuf, "%d", signalNum);
+            Tcl_AppendResult (interp, "invalid signal number: ",
+                              numBuf, (char *) NULL);
+            goto exitPoint;
+        }
+
+        if ((signalNum < 1) || (signalNum > NSIG)) {
+            Tcl_AppendResult (interp, "invalid signal name: ",
+                              signalName, (char *) NULL);
+            goto exitPoint;
+        }
+        signalList [idx] = signalNum;
+    }
+
+    result = signalListSize;
+exitPoint:
+    ckfree ((char *) signalListArgv);
+    return result;
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * SignalBlocked --
+ *     
+ *    Determine if a signal is blocked.  On non-Posix systems, always returns
+ * "0".
+ *
+ * Parameters::
+ *   o interp (O) - Error messages are returned in result.
+ *   o signalNum (I) - The signal to determine the state for.
+ * Returns:
+ *   NULL if an error occured, or a pointer to a static string of "1" if the
+ * signal is block, and a static string of "0" if it is not blocked.
+ *-----------------------------------------------------------------------------
+ */
+static char *
+SignalBlocked (interp, signalNum)
+    Tcl_Interp  *interp;
+    int          signalNum;
+{
+#ifdef TCL_POSIX_SIG
+    int      idx;
+    sigset_t sigBlockSet;
+
+    if (sigprocmask (SIG_BLOCK, NULL, &sigBlockSet)) {
+        interp->result = Tcl_UnixError (interp);
+        return NULL;
+    }
+    return sigismember (&sigBlockSet, signalNum) ? "1" : "0";
+#else
+    return "0";
+#endif
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * GetSignalStates --
+ *     
+ *    Return a keyed list containing the signal states for the specified
+ * signals.
+ *
+ * Parameters::
+ *   o interp (O) - The list is returned in the result.
+ *   o signalListSize (I) - Number of signals in the signal list.
+ *   o signalList (I) - List of signals of requested signals.
+ * Returns:
+ *   TCL_OK or TCL_ERROR, with error message in interp.
+ *-----------------------------------------------------------------------------
+ */
+static int
+GetSignalStates (interp, signalListSize, signalList)
+    Tcl_Interp *interp;
+    int         signalListSize;
+    int         signalList [MAXSIG];
+{
+    int              idx, signalNum, actuallyDone = -1;
+    char            *stateKeyedList [MAXSIG];
+    char            *sigState [3], *sigEntry [2];
+    signalProcPtr_t  actionFunc;
+
+    for (idx = 0; idx < signalListSize; idx ++) {
+        signalNum = signalList [idx];
+
+        actionFunc = GetSignalState (signalNum);
+        if (actionFunc == SIG_ERR)
+            goto unixSigError;
+        
+        sigState [2] = NULL;
+        if (actionFunc == SIG_DFL)
+            sigState [0]  = "default";
+        else if (actionFunc == SIG_IGN)
+            sigState [0] = "ignore";
+        else if (actionFunc == TclSignalTrap) {
+            if (signalTrapCmds [signalNum] == NULL)
+                sigState [0] = "error";
+            else {
+                sigState [0] = "trap";
+                sigState [2] = signalTrapCmds [signalNum];
+            }
+        }
+
+        sigState [1] = SignalBlocked (interp, signalNum);
+        if (sigState [1] == NULL)
+            goto unixSigError;
+
+        sigEntry [0] = Tcl_SignalId (signalNum);
+        sigEntry [1] = Tcl_Merge ((sigState [2] == NULL) ? 2 : 3,
+                                  sigState);
+
+        stateKeyedList [idx] = Tcl_Merge (2, sigEntry);
+        ckfree (sigEntry [1]);
+
+        actuallyDone = idx;
+
+    }
+    Tcl_SetResult (interp, Tcl_Merge (signalListSize, stateKeyedList),
+                   TCL_DYNAMIC);
+
+    for (idx = 0; idx <= actuallyDone; idx++)
+        ckfree (stateKeyedList [idx]);
+
+    return TCL_OK;
+
+unixSigError:
+    for (idx = 0; idx <= actuallyDone; idx++)
+        ckfree (stateKeyedList [idx]);
+
+    interp->result = Tcl_UnixError (interp);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * SetSignalStates --
+ *     
+ *    Set the signal state for the specified signals.  
+ *
+ * Parameters::
+ *   o interp (O) - The list is returned in the result.
+ *   o signalListSize (I) - Number of signals in the signal list.
+ *   o signalList (I) - List of signals of requested signals.
+ *   o actionFunc (I) - The function to run when the signal is received.
+ *   o command (I) - If the function is the "trap" function, this is the
+ *     Tcl command to run when the trap occurs.  Otherwise, NULL.
+ * Returns:
+ *   TCL_OK or TCL_ERROR, with error message in interp.
+ *-----------------------------------------------------------------------------
+ */
+static int
+SetSignalStates (interp, signalListSize, signalList, actionFunc, command)
+    Tcl_Interp      *interp;
+    int              signalListSize;
+    int              signalList [MAXSIG];
+    signalProcPtr_t  actionFunc;
+    char            *command;
+
+{
+    int idx, signalNum, commandLen;
+
+    if (command != NULL)
+        commandLen = strlen (command);
+
+    for (idx = 0; idx < signalListSize; idx ++) {
+        signalNum = signalList [idx];
+
+        if (signalTrapCmds [signalNum] != NULL) {
+            ckfree (signalTrapCmds [signalNum]);
+            signalTrapCmds [signalNum] = NULL;
+        }
+        if (!SetSignalAction (signalNum, actionFunc))
+            goto unixSigError;
+
+        if (command != NULL) {
+            signalTrapCmds [signalNum] = ckalloc (commandLen + 1);
+            strcpy (signalTrapCmds [signalNum], command);
+        }
+    }
+
+    return TCL_OK;
+
+unixSigError:
+    interp->result = Tcl_UnixError (interp);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * BlockSignals --
+ *     
+ *    Block or unblock the specified signals.  Returns an error if not a Posix
+ * system.
+ *
+ * Parameters::
+ *   o interp (O) - Error messages are returned in result.
+ *   o action (I) - SIG_BLOCK or SIG_UNBLOCK.
+ *   o signalListSize (I) - Number of signals in the signal list.
+ *   o signalList (I) - List of signals of requested signals.
+ * Returns:
+ *   TCL_OK or TCL_ERROR, with error message in interp.
+ *-----------------------------------------------------------------------------
+ */
+static int
+BlockSignals (interp, action, signalListSize, signalList)
+    Tcl_Interp  *interp;
+    int          action;
+    int          signalListSize;
+    int          signalList [MAXSIG];
+{
+#ifdef TCL_POSIX_SIG
+    int      idx;
+    sigset_t sigBlockSet;
+
+    sigemptyset (&sigBlockSet);
+
+    for (idx = 0; idx < signalListSize; idx ++)
+        sigaddset (&sigBlockSet, signalList [idx]);
+
+    if (sigprocmask (action, &sigBlockSet, NULL)) {
+        interp->result = Tcl_UnixError (interp);
+        return TCL_ERROR;
+    }
+
+    return TCL_OK;
+#else
+    interp->result = noPosix;
+    return TCL_ERROR;
+#endif
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_SignalCmd --
+ *     Implements the TCL signal command:
+ *         signal action siglist [command]
+ *
+ * Results:
+ *      Standard TCL results, may return the UNIX system error message.
+ *
+ * Side effects:
+ *     Signal handling states may be changed.
+ *-----------------------------------------------------------------------------
+ */
+static int
+Tcl_SignalCmd (clientData, interp, argc, argv)
+    char       *clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int                  signalListSize, signalNum, idx;
+    int                  signalList [MAXSIG], actionClass;
+    char                *signalName;
+    signalProcPtr_t      actionFunc;
+    char                *command = NULL;
+
+    if ((argc < 3) || (argc > 4)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " action signalList [commands]", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    signalListSize = ParseSignalList (interp, argv [2], signalList);
+    if (signalListSize < 0)    
+        return TCL_ERROR;
+
+    /*
+     * Determine the action to take on all of the signals.
+     */
+    if (STREQU (argv [1], "trap")) {
+        actionFunc = TclSignalTrap;
+        actionClass = SIGACT_SET;
+        if (argc != 4) {
+            Tcl_AppendResult (interp, "command required for ",
+                             "trapping signals", (char *) NULL);
+            return TCL_ERROR;
+        }
+        command = argv [3];
+    } else {
+        if (STREQU (argv [1], "default")) {
+            actionFunc  = SIG_DFL;
+            actionClass = SIGACT_SET;
+        } else if (STREQU (argv [1], "ignore")) {
+            actionFunc = SIG_IGN;
+            actionClass = SIGACT_SET;
+        } else if (STREQU (argv [1], "error")) {
+            actionFunc = TclSignalTrap;
+            actionClass = SIGACT_SET;
+        } else if (STREQU (argv [1], "get")) {
+            actionClass = SIGACT_GET;
+        } else if (STREQU (argv [1], "block")) {
+            actionClass = SIGACT_BLOCK;
+        } else if (STREQU (argv [1], "unblock")) {
+            actionClass = SIGACT_UNBLOCK;
+        } else {
+            Tcl_AppendResult (interp, "invalid signal action specified: ", 
+                              argv [1], ": expected one of \"default\", ",
+                              "\"ignore\", \"error\", \"trap\", or \"get\", ",
+                              "\"block\", \"unblock\"", (char *) NULL);
+            return TCL_ERROR;
+        }
+        if (argc != 3) {
+            Tcl_AppendResult (interp, "command may not be ",
+                              "specified for \"", argv [1], "\" action",
+                              (char *) NULL);
+            return TCL_ERROR;
+        }
+    }
+
+    /*
+     * Process the specified action class.
+     */
+    switch (actionClass) {
+      case SIGACT_SET:
+        return SetSignalStates (interp, signalListSize, signalList,
+                                actionFunc, command);
+      case SIGACT_GET:
+        return GetSignalStates (interp, signalListSize, signalList);
+      case SIGACT_BLOCK:
+        return BlockSignals (interp, SIG_BLOCK, signalListSize, signalList);
+      case SIGACT_UNBLOCK:
+        return BlockSignals (interp, SIG_UNBLOCK, signalListSize, signalList);
+    }
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ *  SignalCmdCleanUp --
+ *      Clean up the signal table when the interpreter is deleted.  This
+ *      is actually when the signal command is deleted.  It releases the
+ *      all signal commands that have been allocated.
+ *
+ *-----------------------------------------------------------------------------
+ */
+static void
+SignalCmdCleanUp (clientData)
+    ClientData clientData;
+{
+    int idx;
+
+    for (idx = 0; idx < MAXSIG; idx++)
+        if (signalTrapCmds [idx] != NULL) {
+            ckfree (signalTrapCmds [idx]);
+            signalTrapCmds [idx] = NULL;
+        }
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_InitSignalHandling --
+ *      Initializes the TCL unix commands.
+ *
+ * Side effects:
+ *    A catch trap is armed for the SIGINT signal.
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_InitSignalHandling (interp)
+    Tcl_Interp *interp;
+{
+    int idx;
+
+    for (idx = 0; idx < MAXSIG; idx++) {
+        signalsReceived [idx] = 0;
+        signalTrapCmds [idx] = NULL;
+    }
+    Tcl_CreateCommand (interp, "kill", Tcl_KillCmd, (ClientData)NULL,
+                      (void (*)())NULL);
+    Tcl_CreateCommand (interp, "signal", Tcl_SignalCmd, (ClientData)NULL,
+                      SignalCmdCleanUp);
+    /*
+     * If interrupt is currently  being trapped, enabled it.  Other wise
+     * leave it off, or if this process is running as a background job it will
+     * get its parent's (shell's) signals.
+     */
+    if (GetSignalState (SIGINT) != SIG_IGN)
+        SetSignalAction (SIGINT, TclSignalTrap);
+}
diff --git a/src/tclx/src/tclxstr.c b/src/tclx/src/tclxstr.c
new file mode 100644 (file)
index 0000000..fe994f4
--- /dev/null
@@ -0,0 +1,498 @@
+/* 
+ * tclXstring.c --
+ *
+ *      Extended TCL string and character manipulation commands.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXstring.c,v 2.0 1992/10/16 04:51:16 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+/*
+ * Prototypes of internal functions.
+ */
+static unsigned int
+ExpandString _ANSI_ARGS_((unsigned char *s,
+                          unsigned char  buf[]));
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CindexCmd --
+ *     Implements the cindex TCL command:
+ *         cindex string indexExpr
+ *
+ * Results:
+ *      Returns the character indexed by  index  (zero  based)  from
+ *      string. 
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_CindexCmd (clientData, interp, argc, argv)
+    ClientData   clientData;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    long index;
+
+    if (argc != 3) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0],
+                          " string indexExpr", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (Tcl_ExprLong (interp, argv[2], &index) != TCL_OK)
+        return TCL_ERROR;
+    if (index >= strlen (argv [1]))
+        return TCL_OK;
+
+    interp->result [0] = argv[1][index];
+    interp->result [1] = 0;
+    return TCL_OK;
+
+} /* Tcl_CindexCmd */
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ClengthCmd --
+ *     Implements the clength TCL command:
+ *         clength string
+ *
+ * Results:
+ *      Returns the length of string in characters. 
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_ClengthCmd (clientData, interp, argc, argv)
+    ClientData   clientData;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+
+    if (argc != 2) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " string", 
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    sprintf (interp->result, "%d", strlen (argv[1]));
+    return TCL_OK;
+
+} /* Tcl_ClengthCmd */
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CrangeCmd --
+ *     Implements the crange and csubstr TCL commands:
+ *         crange string firstExpr lastExpr
+ *         csubstr string firstExpr lengthExpr
+ *
+ * Results:
+ *      Standard Tcl result.
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_CrangeCmd (clientData, interp, argc, argv)
+    ClientData   clientData;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    long      fullLen, first;
+    long      subLen;
+    char     *strPtr;
+    char      holdChar;
+    int       isRange = (argv [0][1] == 'r');  /* csubstr or crange */
+
+    if (argc != 4) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " string firstExpr ", 
+                          (isRange) ? "lastExpr" : "lengthExpr",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (Tcl_ExprLong (interp, argv[2], &first) != TCL_OK)
+        return TCL_ERROR;
+
+    fullLen = strlen (argv [1]);
+    if (first >= fullLen)
+        return TCL_OK;
+
+    if (STREQU (argv[3], "end"))
+        subLen = fullLen - first;
+    else {
+        if (Tcl_ExprLong (interp, argv[3], &subLen) != TCL_OK)
+            return TCL_ERROR;
+        
+        if (isRange) {
+            if (subLen < first) {
+                Tcl_AppendResult (interp, "last is before first",
+                                  (char *) NULL);
+                return TCL_ERROR;
+            }
+            subLen = subLen - first +1;
+        }
+
+        if (first + subLen > fullLen)
+            subLen = fullLen - first;
+    }
+
+    strPtr = argv [1] + first;
+
+    holdChar = strPtr [subLen];
+    strPtr [subLen] = '\0';
+    Tcl_SetResult (interp, strPtr, TCL_VOLATILE);
+    strPtr [subLen] = holdChar;
+
+    return TCL_OK;
+
+} /* Tcl_CrangeCmd */
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ReplicateCmd --
+ *     Implements the replicate TCL command:
+ *         replicate string countExpr
+ *     See the string(TCL) manual page.
+ *
+ * Results:
+ *      Returns string replicated count times.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_ReplicateCmd (clientData, interp, argc, argv)
+    ClientData   clientData;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    long           repCount;
+    register char *srcPtr, *scanPtr, *newPtr;
+    register long  newLen, cnt;
+
+    if (argc != 3) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " string countExpr", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (Tcl_ExprLong (interp, argv[2], &repCount) != TCL_OK)
+        return TCL_ERROR;
+
+    srcPtr = argv [1];
+    newLen = strlen (srcPtr) * repCount;
+    if (newLen >= TCL_RESULT_SIZE)
+        Tcl_SetResult (interp, ckalloc ((unsigned) newLen + 1), TCL_DYNAMIC);
+
+    newPtr = interp->result;
+    for (cnt = 0; cnt < repCount; cnt++) {
+        for (scanPtr = srcPtr; *scanPtr != 0; scanPtr++)
+            *newPtr++ = *scanPtr;
+    }
+    *newPtr = 0;
+
+    return TCL_OK;
+
+} /* Tcl_ReplicateCmd */
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ExpandString --
+ *  Build an expand version of a translit range specification.
+ *
+ * Results:
+ *  TRUE it the expansion is ok, FALSE it its too long.
+ *
+ *-----------------------------------------------------------------------------
+ */
+#define MAX_EXPANSION 255
+
+static unsigned int
+ExpandString (s, buf)
+    unsigned char *s;
+    unsigned char  buf[];
+{
+    int i, j;
+
+    i = 0;
+    while((*s !=0) && i < MAX_EXPANSION) {
+        if(s[1] == '-' && s[2] > s[0]) {
+            for(j = s[0]; j <= s[2]; j++)
+                buf[i++] = j;
+            s += 3;
+        } else
+            buf[i++] = *s++;
+    }
+    buf[i] = 0;
+    return (i < MAX_EXPANSION);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_TranslitCmd --
+ *     Implements the TCL translit command:
+ *     translit inrange outrange string
+ *
+ * Results:
+ *  Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_TranslitCmd (clientData, interp, argc, argv)
+    ClientData   clientData;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    unsigned char from [MAX_EXPANSION+1];
+    unsigned char to   [MAX_EXPANSION+1];
+    unsigned char map  [MAX_EXPANSION+1];
+    unsigned char *s, *t;
+    int idx;
+
+    if (argc != 4) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " from to string", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (!ExpandString ((unsigned char *) argv[1], from)) {
+        interp->result = "inrange expansion too long";
+        return TCL_ERROR;
+    }
+
+    if (!ExpandString ((unsigned char *) argv[2], to)) {
+        interp->result = "outrange expansion too long";
+        return TCL_ERROR;
+    }
+
+    for (idx = 0; idx <= MAX_EXPANSION; idx++)
+        map [idx] = idx;
+
+    for (idx = 0; to [idx] != '\0'; idx++) {
+        if (from [idx] != '\0')
+            map [from [idx]] = to [idx];
+        else
+            break;
+    }
+    if (to [idx] != '\0') {
+        interp->result = "inrange longer than outrange";
+        return TCL_ERROR;
+    }
+
+    for (; from [idx] != '\0'; idx++)
+        map [from [idx]] = 0;
+
+    for (s = t = (unsigned char *) argv[3]; *s != '\0'; s++) {
+        if (map[*s] != '\0')
+            *t++ = map [*s];
+    }
+    *t = '\0';
+
+    Tcl_SetResult (interp, argv[3], TCL_VOLATILE);
+
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_CtypeCmd --
+ *
+ *      This function implements the 'ctype' command:
+ *      ctype class string
+ *
+ *      Where class is one of the following:
+ *        digit, xdigit, lower, upper, alpha, alnum,
+ *        space, cntrl,  punct, print, graph, ascii, char or ord.
+ *
+ * Results:
+ *       One or zero: Depending if all the characters in the string are of
+ *       the desired class.  Char and ord provide conversions and return the
+ *       converted value.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_CtypeCmd (clientData, interp, argc, argv)
+    ClientData   clientData;
+    Tcl_Interp  *interp;
+    int          argc;
+    char       **argv;
+{
+    register char *class;
+    register char *scanPtr = argv [2];
+
+    if (argc != 3) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " class string",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    class = argv [1];
+
+    /*
+     * Handle conversion requests.
+     */
+    if (STREQU (class, "char")) {
+        int number;
+
+        if (Tcl_GetInt (interp, argv [2], &number) != TCL_OK)
+            return TCL_ERROR;
+        if ((number < 0) || (number > 255)) {
+            Tcl_AppendResult (interp, "number must be in the range 0..255",
+                              (char *) NULL);
+            return TCL_ERROR;
+        }
+
+        interp->result [0] = number;
+        interp->result [1] = 0;
+        return TCL_OK;
+    }
+
+    if (STREQU (class, "ord")) {
+        if (strlen (argv [2]) != 1) {
+            Tcl_AppendResult (interp, "string to convert must be only one",
+                              " character", (char *) NULL);
+            return TCL_ERROR;
+        }
+
+        sprintf(interp->result, "%d", (int)(*argv[2]));
+        return TCL_OK;
+    }
+
+    /*
+     * Select based on the first letter of the 'class' argument to chose the 
+     * macro to test characters with.  In some cases another character must be
+     * switched on to determine which macro to use.  This is gross, but better
+     * we only have to do a string compare once to test if class is correct.
+     */
+    if ((class [2] == 'n') && STREQU (class, "alnum")) {
+        for (; *scanPtr != 0; scanPtr++) {
+            if (!isalnum (*scanPtr))
+                break;
+        }
+        goto returnResult;
+    }
+    if ((class [2] == 'p') && STREQU (class, "alpha")) {
+        for (; *scanPtr != 0; scanPtr++) {
+            if (! isalpha (*scanPtr))
+                break;
+        }
+        goto returnResult;
+    }
+    if ((class [1] == 's') && STREQU (class, "ascii")) {
+        for (; *scanPtr != 0; scanPtr++) {
+            if (!isascii (*scanPtr))
+                break;
+        }
+        goto returnResult;
+    }
+    if (STREQU (class, "cntrl")) {
+        for (; *scanPtr != 0; scanPtr++) {
+            if (!iscntrl (*scanPtr))
+                break;
+        }
+        goto returnResult;
+    }
+    if (STREQU (class, "digit")) {
+        for (; *scanPtr != 0; scanPtr++) {
+            if (!isdigit (*scanPtr))
+                break;
+        }
+        goto returnResult;
+    }
+    if (STREQU (class, "graph")) {
+        for (; *scanPtr != 0; scanPtr++) {
+            if (!isgraph (*scanPtr))
+                break;
+        }
+        goto returnResult;
+    }
+    if (STREQU (class, "lower")) {
+        for (; *scanPtr != 0; scanPtr++) {
+            if (!islower (*scanPtr))
+                break;
+        }
+        goto returnResult;
+    }
+    if ((class [1] == 'r') && STREQU (class, "print")) {
+        for (; *scanPtr != 0; scanPtr++) {
+            if (!isprint (*scanPtr))
+                break;
+        }
+        goto returnResult;
+    }
+    if ((class [1] == 'u') && STREQU (class, "punct")) {
+        for (; *scanPtr != 0; scanPtr++) {
+            if (!ispunct (*scanPtr))
+                break;
+        }
+        goto returnResult;
+    }
+    if (STREQU (class, "space")) {
+        for (; *scanPtr != 0; scanPtr++) {
+            if (!isspace (*scanPtr))
+                break;
+        }
+        goto returnResult;
+    }
+    if (STREQU (class, "upper")) {
+        for (; *scanPtr != 0; scanPtr++) {
+            if (!isupper (*scanPtr))
+                break;
+        }
+        goto returnResult;
+    }
+    if (STREQU (class, "xdigit")) {
+        for (; *scanPtr != 0; scanPtr++) {
+            if (!isxdigit (*scanPtr))
+                break;
+        }
+        goto returnResult;
+    }
+    /*
+     * No match on subcommand.
+     */
+    Tcl_AppendResult (interp, "unrecognized class specification: \"", class,
+                      "\", expected one of: alnum, alpha, ascii, char, ",
+                      "cntrl, digit, graph, lower, ord, print, punct, space, ",
+                      "upper or xdigit", (char *) NULL);
+    return TCL_ERROR;
+
+    /*
+     * Return true or false, depending if the end was reached.  Always return 
+     * false for a null string.
+     */
+returnResult:
+    if ((*scanPtr == 0) && (scanPtr != argv [2]))
+        interp->result = "1";
+    else
+        interp->result = "0";
+    return TCL_OK;
+
+}
+
diff --git a/src/tclx/src/tclxstup.c b/src/tclx/src/tclxstup.c
new file mode 100644 (file)
index 0000000..c107b81
--- /dev/null
@@ -0,0 +1,502 @@
+/*
+ * tclXstartup.c --
+ *
+ * Startup code for the Tcl shell and other interactive applications.  Also
+ * create special commands used just by Tcl shell features.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXstartup.c,v 2.1 1992/11/10 04:02:06 markd Exp $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+#include "patchlvl.h"
+
+extern char * etenv ();
+
+extern char *optarg;
+extern int   optind, opterr;
+
+typedef struct tclParms_t {
+    int       execFile;      /* Run the specified file. (no searching)       */
+    int       execCommand;   /* Execute the specified command.               */
+    unsigned  options;       /* Quick startup option.                        */
+    char     *execStr;       /* Command file or command to execute.          */
+    char    **tclArgv;       /* Arguments to pass to tcl script.             */
+    int       tclArgc;       /* Count of arguments to pass to tcl script.    */
+    char     *programName;   /* Name of program (less path).                 */
+    } tclParms_t;
+
+/*
+ * Prototypes of internal functions.
+ */
+static void
+ParseCmdArgs _ANSI_ARGS_((int          argc,
+                          char       **argv,
+                          tclParms_t  *tclParmsPtr));
+
+static int
+FindDefaultFile _ANSI_ARGS_((Tcl_Interp  *interp,
+                             char        *defaultFile));
+
+static int
+ProcessDefaultFile _ANSI_ARGS_((Tcl_Interp  *interp,
+                                char        *defaultFile));
+
+static int
+ProcessInitFile _ANSI_ARGS_((Tcl_Interp  *interp));
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ErrorAbort --
+ *
+ * Display error information and abort when an error is returned in the
+ * interp->result.
+ *
+ * Parameters:
+ *   o interp - A pointer to the interpreter, should contain the
+ *     error message in `result'.
+ *   o exitCode - The code to pass to exit.
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_ErrorAbort (interp, exitCode)
+    Tcl_Interp  *interp;
+    int          exitCode;
+{
+    char *errorStack;
+
+    fflush (stdout);
+    fprintf (stderr, "Error: %s\n", interp->result);
+
+    errorStack = Tcl_GetVar (interp, "errorInfo", 1);
+    if (errorStack != NULL)
+        fprintf (stderr, "%s\n", errorStack);
+    exit (exitCode);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * ParseCmdArgs --
+ *
+ * Parse the arguments passed to the Tcl shell
+ *
+ * Parameters:
+ *   o argc, argv - Arguments passed to main.
+ *   o tclParmsPtr - Results of the parsed Tcl shell command line.
+ *-----------------------------------------------------------------------------
+ */
+static void
+ParseCmdArgs (argc, argv, tclParmsPtr)
+    int          argc;
+    char       **argv;
+    tclParms_t  *tclParmsPtr;
+{
+    char   *scanPtr, *programName;
+    int     programNameLen;
+    int     option;
+
+    tclParmsPtr->execFile = FALSE;
+    tclParmsPtr->execCommand = FALSE;
+    tclParmsPtr->options = 0;
+    tclParmsPtr->execStr = NULL;
+
+    /*
+     * Determine file name (less directories) that the Tcl interpreter is
+     * being run under.
+     */
+    scanPtr = programName = argv[0];
+    while (*scanPtr != '\0') {
+        if (*scanPtr == '/')
+            programName = scanPtr + 1;
+        scanPtr++;
+    }
+    tclParmsPtr->programName = programName;
+    programNameLen = strlen (programName);
+    
+    /*
+     * Scan arguments looking for flags to process here rather than to pass
+     * on to the scripts.  The '-c' or '-f' must also be the last option to
+     * allow for script arguments starting with `-'.
+     */
+    while ((option = getopt (argc, argv, "qc:f:u")) != -1) {
+        switch (option) {
+            case 'q':
+                if (tclParmsPtr->options & TCLSH_QUICK_STARTUP)
+                    goto usageError;
+                tclParmsPtr->options |= TCLSH_QUICK_STARTUP;
+                break;
+            case 'c':
+                tclParmsPtr->execCommand = TRUE;
+                tclParmsPtr->execStr = optarg;
+                goto exitParse;
+            case 'f':
+                tclParmsPtr->execFile = TRUE;
+                tclParmsPtr->execStr = optarg;
+                goto exitParse;
+            case 'u':
+            default:
+                goto usageError;
+        }
+    }
+    exitParse:
+  
+    /*
+     * If neither `-c' nor `-f' were specified and at least one parameter
+     * is supplied, then if is the file to execute.  The rest of the arguments
+     * are passed to the script.  Check for '--' as the last option, this also
+     * is a terminator for the file to execute.
+     */
+    if ((!tclParmsPtr->execCommand) && (!tclParmsPtr->execFile) &&
+        (optind != argc) && !STREQU (argv [optind-1], "--")) {
+        tclParmsPtr->execFile = TRUE;
+        tclParmsPtr->execStr = argv [optind];
+        optind++;
+    }
+
+    tclParmsPtr->tclArgv = &argv [optind];
+    tclParmsPtr->tclArgc = argc - optind;
+    return;
+
+usageError:
+    fprintf (stderr, "usage: %s %s\n", argv [0],
+             "[-qu] [[-f] script]|[-c command] [args]");
+    exit (1);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ * FindDefaultFile --
+ *
+ *   Find the Tcl default file.  If is looked for in the following order:
+ *       o A environment variable named `TCLDEFAULT'.
+ *       o The specified defaultFile (which normally has an version number
+ *         appended.
+ *   A tcl variable `TCLDEFAULT', will contain the path of the default file
+ *   to use after this procedure is executed, or a null string if it is not
+ *   found.
+ * Parameters
+ *   o interp (I) - A pointer to the interpreter.
+ *   o defaultFile (I) - The file name of the default file to use, it
+ *     normally contains a version number.
+ * Returns:
+ *     TCL_OK if all is ok, TCL_ERROR if a error occured.
+ *-----------------------------------------------------------------------------
+ */
+static int
+FindDefaultFile (interp, defaultFile)
+    Tcl_Interp  *interp;
+    char        *defaultFile;
+{
+    char        *defaultFileToUse;
+    struct stat  statBuf;
+
+    if ((defaultFileToUse = getenv ("TCLDEFAULT")) == NULL)
+        defaultFileToUse = defaultFile;
+
+    if (stat (defaultFileToUse, &statBuf) < 0)
+        defaultFileToUse = "";
+    if (Tcl_SetVar (interp, "TCLDEFAULT", defaultFileToUse,
+                    TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG) == NULL)
+        return TCL_ERROR;
+    else
+        return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ * ProcessDefaultFile --
+ *
+ *   Process the Tcl default file and TclInit files.  The default file
+ * is the only file at a fixed path. It is a script file that usaually 
+ * defines a variable "TCLINIT", which has the path of the  full
+ * initialization file. The default file can also set things such as path
+ * variables.  If the TCLINIT variable is set, that file is then evaluated.
+ * If usually does the full Tcl initialization.
+ *
+ * Parameters
+ *   o interp  (I) - A pointer to the interpreter.
+ *   o defaultFile (I) - The file name of the default file to use, it
+ *     normally contains a version number.
+ * Returns:
+ *   TCL_OK if all is ok, TCL_ERROR if an error occured.
+ *-----------------------------------------------------------------------------
+ */
+static int
+ProcessDefaultFile (interp, defaultFile)
+    Tcl_Interp  *interp;
+    char        *defaultFile;
+{
+    char *defaultFileToUse;
+
+    defaultFileToUse = Tcl_GetVar (interp, "TCLDEFAULT", 1);
+    if (*defaultFileToUse == '\0') {
+        Tcl_AppendResult (interp,
+                          "Can't access Tcl default file,\n",
+                          "  Located in one of the following ways:\n",
+                          "    Environment variable: `TCLDEFAULT' or,\n",
+                          "    File `", defaultFile, "'.\n", 
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+    if (Tcl_EvalFile (interp, defaultFileToUse) != TCL_OK)
+        return TCL_ERROR;
+    Tcl_ResetResult (interp);
+
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ * ProcessInitFile --
+ *
+ *    Process the Tcl init file, its abolute patch should be contained in
+ * a Tcl variable "TCLINIT".  If the variable is not found, the file will
+ * not be evaulated.
+ *
+ * Parameters
+ *   o interp  (I) - A pointer to the interpreter.
+ * Returns:
+ *   TCL_OK if all is ok, TCL_ERROR if an error occured.
+ *-----------------------------------------------------------------------------
+ */
+static int
+ProcessInitFile (interp)
+    Tcl_Interp  *interp;
+{
+    char *initFile;
+
+    initFile = Tcl_GetVar (interp, "TCLINIT", 1);
+    if (initFile != NULL) {
+        if (Tcl_EvalFile (interp, initFile) != TCL_OK)
+            return TCL_ERROR;
+    }
+    Tcl_ResetResult (interp);
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ShellEnvInit --
+ *
+ *   Process the Tcl default file.  The default file is the only file at a
+ * fixed path. It is a script file that usaually defines a variable "TCLINIT",
+ * which has the path of the full initialization file. The default file can
+ * also set things such as path variables.  
+ *
+ * Parameters
+ *   o interp - A pointer to the interpreter.
+ *   o options - Flags to control the behavior of this routine, the following
+ *     option is supported:
+ *       o TCLSH_QUICK_STARTUP - Don't source the default file or Tcl init
+ *         file.
+ *       o TCLSH_ABORT_STARTUP_ERR - If set, abort the process if an error
+ *         occurs.
+ *       o TCLSH_NO_INIT_FILE - If set, process the default file, but not the
+ *         init file.  This can be used to make the default file do all
+ *         initialization.
+ *   o programName (I) - The name of the program being executed, usually
+ *     taken from the main argv [0].  Used to set the Tcl variable.  If NULL
+ *     then the variable will not be set.
+ *   o argc, argv (I) - Arguments to pass to the program in a Tcl list variable
+ *     `argv'.  Argv [0] should contain the first argument not the program
+ *     name.  If argv is NULL, then the variable will not be set.
+ *   o interactive (I) - The value to assign to the `interactiveSession' Tcl
+ *     variable. TRUE if an interactive Tcl command loop will be entered,
+ *     FALSE if a script will be executed .  The function does not enter the
+ *     command loop, it just sets the variable.
+ *   o defaultFile (I) - The file name of the default file to use.  If NULL,
+ *     then the standard Tcl default file is used, which is formed from a
+ *     location specified at compile time and the Extended Tcl version
+ *     number.
+ * Notes:
+ *   The variables tclAppName, tclAppLongName, tclAppVersion 
+ * must be set before calling thus routine if special values are desired.
+ *
+ * Returns:
+ *   TCL_OK if all is ok, TCL_ERROR if an error occured.
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_ShellEnvInit (interp, options, programName, argc, argv, interactive,
+                  defaultFile)
+    Tcl_Interp  *interp;
+    unsigned     options;
+    CONST char  *programName; 
+    int          argc;
+    CONST char **argv;
+    int          interactive;
+    CONST char *defaultFile;
+{
+    int   result = TCL_OK;
+    char *defaultFilePath;
+
+    /*
+     * Setup patch to default file, if not specified.
+     */
+    if (defaultFile == NULL) {
+        defaultFilePath = ckalloc (strlen (TCL_DEFAULT) +
+                                   strlen (TCL_VERSION) +
+                                   strlen (TCL_EXTD_VERSION_SUFFIX) + 1);
+        strcpy (defaultFilePath, TCL_DEFAULT);
+        strcat (defaultFilePath, TCL_VERSION);
+        strcat (defaultFilePath, TCL_EXTD_VERSION_SUFFIX);
+    } else {
+        defaultFilePath = (char *) defaultFile;
+    }
+
+    if (programName != NULL) {
+        if (Tcl_SetVar (interp, "programName", (char *) programName,
+                        TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG) == NULL)
+            goto errorExit;
+    }
+
+    if (argv != NULL) {
+        char *args;
+
+        args = Tcl_Merge (argc, (char **) argv);
+        if (Tcl_SetVar (interp, "argv", args,
+                        TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG) == NULL)
+            result = TCL_ERROR;
+        ckfree (args);
+        if (result != TCL_OK)
+            goto errorExit;
+    }
+    if (Tcl_SetVar (interp, "interactiveSession", interactive ? "1" : "0",
+                    TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG) == NULL)
+        goto errorExit;
+
+    tclxVersion = ckalloc (strlen (TCL_VERSION) + 
+                           strlen (TCL_EXTD_VERSION_SUFFIX) + 1);
+    strcpy (tclxVersion, TCL_VERSION);
+    strcat (tclxVersion, TCL_EXTD_VERSION_SUFFIX);
+
+#ifdef PATCHLEVEL
+    tclxPatchlevel = PATCHLEVEL;
+#else
+    tclxPatchlevel = 0;
+#endif
+
+    /*
+     * Set application specific values to return from the infox if they
+     * have not been set.
+     */
+    if (tclAppName == NULL)
+        tclAppName = "TclX";
+    if (tclAppLongname == NULL)
+        tclAppLongname = "Extended Tcl";
+    if (tclAppVersion == NULL)
+        tclAppVersion = tclxVersion;
+
+    /*
+     * Locate the default file and save in Tcl var TCLDEFAULT.  If not quick
+     * startup, process the Tcl default file and execute the Tcl
+     * initialization file.
+     */
+    if (FindDefaultFile (interp, (char *) defaultFilePath) != TCL_OK)
+        goto errorExit;
+    if (!(options & TCLSH_QUICK_STARTUP)) {
+        if (ProcessDefaultFile (interp, defaultFilePath) != TCL_OK)
+            goto errorExit;
+        if (!(options & TCLSH_NO_INIT_FILE)) {
+            if (ProcessInitFile (interp) != TCL_OK)
+                goto errorExit;
+        }
+    }
+    if (defaultFilePath != defaultFile)
+        ckfree (defaultFilePath);
+    return TCL_OK;
+
+errorExit:
+    if (defaultFilePath != defaultFile)
+        ckfree (defaultFilePath);
+    if (options & TCLSH_ABORT_STARTUP_ERR)
+        Tcl_ErrorAbort (interp, 255);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_Startup --
+ *
+ *    Initializes the Tcl extended environment.  This function processes the
+ * standard command line arguments and locates the Tcl default file.  It then
+ * sources the default file and initialization file pointed to by the default
+ * file.  Either an interactive command loop is created or a Tcl script file
+ * is executed depending on the command line.  This functions calls
+ * Tcl_ShellEnvInit, so it should not be called separately.
+ *
+ * Parameters
+ *   o interp - A pointer to the interpreter.
+ *   o argc, argv - Arguments passed to main for the command line.
+ *   o defaultFile (I) - The file name of the default file to use.  If NULL,
+ *     then the standard Tcl default file is used, which is formed from a
+ *     location specified at compile time and the Extended Tcl version
+ *     number.
+ *   o options (I) - Options that control startup behavior.  None are
+ *     currently defined.
+ * Notes:
+ *   The variables tclAppName, tclAppLongName, tclAppVersion 
+ * must be set before calling thus routine if special values are desired.
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_Startup (interp, argc, argv, defaultFile, options)
+    Tcl_Interp  *interp;
+    int          argc;
+    CONST char **argv;
+    CONST char  *defaultFile;
+    unsigned     options;
+{
+    char       *cmdBuf;
+    tclParms_t  tclParms;
+    int         result;
+
+    /*
+     * Process the arguments.
+     */
+    ParseCmdArgs (argc, (char **) argv, &tclParms);
+
+    if (Tcl_ShellEnvInit (interp,
+                          tclParms.options,
+                          (CONST char *)tclParms.programName,
+                          tclParms.tclArgc, (CONST char **)tclParms.tclArgv,
+                          (tclParms.execStr == NULL),
+                          (CONST char *)defaultFile) != TCL_OK)
+        goto errorAbort;
+
+    /*
+     * If the invoked tcl interactively, give the user an interactive session,
+     * otherwise, source the command file or execute the specified command.
+     */
+    if (tclParms.execFile) {
+        result = Tcl_EvalFile (interp, tclParms.execStr);
+        if (result != TCL_OK)
+            goto errorAbort;
+    } else if (tclParms.execCommand) {
+        result = Tcl_Eval (interp, tclParms.execStr, 0, NULL);
+        if (result != TCL_OK)
+            goto errorAbort;
+    } else
+        Tcl_CommandLoop (interp, stdin, stdout, tclShellCmdEvalProc, 0);
+
+    Tcl_ResetResult (interp);
+    return;
+
+errorAbort:
+    Tcl_ErrorAbort (interp, 255);
+}
+
diff --git a/src/tclx/src/tclxtend.h b/src/tclx/src/tclxtend.h
new file mode 100644 (file)
index 0000000..338e7f9
--- /dev/null
@@ -0,0 +1,214 @@
+/* 
+ * tclExtend.h
+ *
+ *    External declarations for the extended Tcl library.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclExtend.h,v 2.0 1992/10/16 04:51:29 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#ifndef TCLEXTEND_H
+#define TCLEXTEND_H
+
+#include <stdio.h>
+#include "tcl.h"
+
+/*
+ * Version suffix for extended Tcl, this is appended to the standard Tcl
+ * version to form the actual extended Tcl version.
+ */
+
+#define TCL_EXTD_VERSION_SUFFIX "c"   /* 6.1c, 6.2c or 6.3c */
+
+#ifdef MSDOS
+#define TCL_NO_ITIMER
+#define TCL_NO_FILE_LOCKING
+#define TCL_IEEE_FP_MATH
+#define TCL_32_BIT_RANDOM
+#define TCL_POSIX_SIG
+#define TCL_TM_GMTOFF
+#endif
+
+typedef void *void_pt;
+
+/*
+ * Flags for Tcl shell startup.
+ */
+#define TCLSH_QUICK_STARTUP       1   /* Don't process default & init files. */
+#define TCLSH_ABORT_STARTUP_ERR   2   /* Abort on an error.                  */
+#define TCLSH_NO_INIT_FILE        4   /* Don't process the init file.        */
+
+/*
+ * These globals are used by the infox command.  Should be set by main.
+ */
+
+extern char *tclxVersion;        /* Extended Tcl version number.            */
+extern int   tclxPatchlevel;     /* Extended Tcl patch level.               */
+
+extern char *tclAppName;         /* Application name                        */
+extern char *tclAppLongname;     /* Long, natural language application name */
+extern char *tclAppVersion;      /* Version number of the application       */
+
+/*
+ * If set to be a pointer to the procedure Tcl_RecordAndEval, will link in
+ * history.  Should be set by main.
+ */
+extern int (*tclShellCmdEvalProc) ();
+
+/*
+ * If non-zero, a signal was received.  Normally signals are handled in
+ * Tcl_Eval, but if an application does not return to eval for some period
+ * of time, then this should be checked and Tcl_CheckForSignal called if
+ * this is set.
+ */
+extern int tclReceivedSignal;
+
+/*
+ * Exported Extended Tcl functions.
+ */
+
+EXTERN int
+Tcl_CheckForSignal _ANSI_ARGS_((Tcl_Interp *interp,
+                                int         cmdResultCode));
+
+EXTERN void 
+Tcl_CommandLoop _ANSI_ARGS_((Tcl_Interp *interp,
+                             FILE       *inFile,
+                             FILE       *outFile,
+                             int         (*evalProc) (),
+                             unsigned    options));
+
+EXTERN Tcl_Interp * 
+Tcl_CreateExtendedInterp ();
+
+EXTERN char *
+Tcl_DeleteKeyedListField _ANSI_ARGS_((Tcl_Interp  *interp,
+                                      CONST char  *fieldName,
+                                      CONST char  *keyedList));
+EXTERN char * 
+Tcl_DownShift _ANSI_ARGS_((char       *targetStr,
+                           CONST char *sourceStr));
+EXTERN void
+Tcl_ErrorAbort _ANSI_ARGS_((Tcl_Interp  *interp,
+                            int          exitCode));
+
+EXTERN char * 
+Tcl_UpShift _ANSI_ARGS_((char       *targetStr,
+                         CONST char *sourceStr));
+
+EXTERN int
+Tcl_GetKeyedListField _ANSI_ARGS_((Tcl_Interp  *interp,
+                                   CONST char  *fieldName,
+                                   CONST char  *keyedList,
+                                   char       **fieldValuePtr));
+
+int
+Tcl_GetKeyedListKeys _ANSI_ARGS_((Tcl_Interp  *interp,
+                                  CONST char  *subFieldName,
+                                  CONST char  *keyedList,
+                                  int         *keyesArgcPtr,
+                                  char      ***keyesArgvPtr));
+
+EXTERN int 
+Tcl_GetLong _ANSI_ARGS_((Tcl_Interp  *interp,
+                         CONST char *string,
+                         long        *longPtr));
+
+EXTERN int 
+Tcl_GetUnsigned _ANSI_ARGS_((Tcl_Interp  *interp,
+                             CONST char *string,
+                             unsigned   *unsignedPtr));
+
+EXTERN char *
+Tcl_SetKeyedListField _ANSI_ARGS_((Tcl_Interp  *interp,
+                                   CONST char  *fieldName,
+                                   CONST char  *fieldvalue,
+                                   CONST char  *keyedList));
+
+EXTERN int
+Tcl_StrToLong _ANSI_ARGS_((CONST char *string,
+                           int          base,
+                           long        *longPtr));
+
+EXTERN int
+Tcl_StrToInt _ANSI_ARGS_((CONST char *string,
+                          int         base,
+                          int        *intPtr));
+
+EXTERN int
+Tcl_StrToUnsigned _ANSI_ARGS_((CONST char *string,
+                               int         base,
+                               unsigned   *unsignedPtr));
+
+EXTERN int
+Tcl_StrToDouble _ANSI_ARGS_((CONST char  *string,
+                             double      *doublePtr));
+
+EXTERN void_pt  
+Tcl_HandleAlloc _ANSI_ARGS_((void_pt   headerPtr,
+                             char     *handlePtr));
+
+EXTERN void 
+Tcl_HandleFree _ANSI_ARGS_((void_pt  headerPtr,
+                            void_pt  entryPtr));
+
+EXTERN void_pt
+Tcl_HandleTblInit _ANSI_ARGS_((CONST char *handleBase,
+                               int         entrySize,
+                               int         initEntries));
+
+EXTERN void
+Tcl_HandleTblRelease _ANSI_ARGS_((void_pt headerPtr));
+
+EXTERN int
+Tcl_HandleTblUseCount _ANSI_ARGS_((void_pt headerPtr,
+                                   int     amount));
+
+EXTERN void_pt
+Tcl_HandleWalk _ANSI_ARGS_((void_pt   headerPtr,
+                            int      *walkKeyPtr));
+
+EXTERN void
+Tcl_WalkKeyToHandle _ANSI_ARGS_((void_pt   headerPtr,
+                                 int       walkKey,
+                                 char     *handlePtr));
+
+EXTERN void_pt
+Tcl_HandleXlate _ANSI_ARGS_((Tcl_Interp  *interp,
+                             void_pt      headerPtr,
+                             CONST  char *handle));
+
+EXTERN int
+Tcl_MathError _ANSI_ARGS_((char *functionName,
+                           int   errorType));
+
+EXTERN void 
+Tcl_Startup _ANSI_ARGS_((Tcl_Interp   *interp,
+                         int           argc,
+                         CONST char  **argv,
+                         CONST char   *defaultFile,
+                         unsigned      options));
+
+EXTERN int
+Tcl_ShellEnvInit _ANSI_ARGS_((Tcl_Interp  *interp,
+                              unsigned     options,
+                              CONST char  *programName,
+                              int          argc,
+                              CONST char **argv,
+                              int          interactive,
+                              CONST char  *defaultFile));
+
+EXTERN int
+Tcl_System _ANSI_ARGS_((Tcl_Interp *interp,
+                        char       *command));
+
+#endif
diff --git a/src/tclx/src/tclxunix.c b/src/tclx/src/tclxunix.c
new file mode 100644 (file)
index 0000000..4c40b62
--- /dev/null
@@ -0,0 +1,537 @@
+/*
+ * tclXunixcmds.c --
+ *
+ * Tcl commands to access unix library calls.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXunixcmds.c,v 2.0 1992/10/16 04:51:18 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+/*
+ * A million microsecondss per seconds.
+ */
+#define TCL_USECS_PER_SEC (1000L * 1000L)
+
+extern
+double floor ();
+
+extern
+double ceil ();
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_AlarmCmd --
+ *     Implements the TCL Alarm command:
+ *         alarm seconds
+ *
+ * Results:
+ *      Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_AlarmCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+#ifdef TCL_NO_ITIMER
+    double            seconds;
+    unsigned          useconds;
+
+    if (argc != 2) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " seconds", 
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (Tcl_GetDouble (interp, argv[1], &seconds) != TCL_OK)
+        return TCL_ERROR;
+
+    useconds = ceil (seconds);
+#ifdef MSDOS
+    sprintf (interp->result, "%d", sleep (useconds));
+#else
+    sprintf (interp->result, "%d", alarm (useconds));
+#endif
+
+    return TCL_OK;
+#else
+
+    double            seconds, secFloor;
+    struct itimerval  timer, oldTimer;
+
+    if (argc != 2) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " seconds", 
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (Tcl_GetDouble (interp, argv[1], &seconds) != TCL_OK)
+        return TCL_ERROR;
+
+    secFloor =  floor (seconds);
+
+    timer.it_value.tv_sec     = secFloor;
+    timer.it_value.tv_usec    = (long) ((seconds - secFloor) *
+                                        (double) TCL_USECS_PER_SEC);
+    timer.it_interval.tv_sec  = 0;
+    timer.it_interval.tv_usec = 0;  
+
+
+    if (setitimer (ITIMER_REAL, &timer, &oldTimer) < 0) {
+        interp->result = Tcl_UnixError (interp);
+        return TCL_ERROR;
+    }
+    seconds  = oldTimer.it_value.tv_sec;
+    seconds += ((double) oldTimer.it_value.tv_usec) /
+               ((double) TCL_USECS_PER_SEC);
+    sprintf (interp->result, "%g", seconds);
+
+    return TCL_OK;
+#endif
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_SleepCmd --
+ *     Implements the TCL sleep command:
+ *         sleep seconds
+ *
+ * Results:
+ *      Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_SleepCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    unsigned time;
+
+    if (argc != 2) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " seconds", 
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (Tcl_GetUnsigned (interp, argv[1], &time) != TCL_OK)
+        return TCL_ERROR;
+
+    sleep (time);
+    return TCL_OK;
+
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_SystemCmd --
+ *     Implements the TCL system command:
+ *     system command
+ *
+ * Results:
+ *  Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_SystemCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int exitCode;
+
+    if (argc != 2) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " command",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    exitCode = Tcl_System (interp, argv[1]);
+    if (exitCode == -1)
+        return TCL_ERROR;
+    sprintf (interp->result, "%d", exitCode);
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_TimesCmd --
+ *     Implements the TCL times command:
+ *     times
+ *
+ * Results:
+ *  Standard TCL results.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_TimesCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    struct tms tm;
+
+    if (argc != 1) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv[0], (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    times(&tm);
+
+    sprintf(interp->result, "%ld %ld %ld %ld", 
+#ifdef MSDOS
+            tm.tms_utime  * MS_PER_TICK, 
+            tm.tms_utime2 * MS_PER_TICK, 
+            tm.tms_stime  * MS_PER_TICK, 
+            tm.tms_stime2 * MS_PER_TICK);
+#else
+            tm.tms_utime  * MS_PER_TICK, 
+            tm.tms_stime  * MS_PER_TICK, 
+            tm.tms_cutime * MS_PER_TICK, 
+            tm.tms_cstime * MS_PER_TICK);
+#endif
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_UmaskCmd --
+ *     Implements the TCL umask command:
+ *     umask [octalmask]
+ *
+ * Results:
+ *  Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_UmaskCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int mask;
+
+    if ((argc < 1) || (argc > 2)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], " octalmask",
+                          (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    if (argc == 1) {
+        mask = umask (0);
+        umask ((unsigned short) mask);
+        sprintf (interp->result, "%o", mask);
+    } else {
+        if (!Tcl_StrToInt (argv [1], 8, &mask)) {
+            Tcl_AppendResult (interp, "Expected octal number got: ", argv [1],
+                              (char *) NULL);
+            return TCL_ERROR;
+        }
+
+        umask ((unsigned short) mask);
+    }
+
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_LinkCmd --
+ *     Implements the TCL link command:
+ *         link [-sym] srcpath destpath
+ *
+ * Results:
+ *  Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_LinkCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    char *tmppath, *srcpath, *destpath;
+
+    if ((argc < 3) || (argc > 4)) {
+        Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                          " [-sym] srcpath destpath", (char *) NULL);
+        return TCL_ERROR;
+    }
+    if (argc == 4) {
+        if (!STREQU (argv [1], "-sym")) {
+            Tcl_AppendResult (interp, "invalid option, expected: \"-sym\", ",
+                              "got: ", argv [1], (char *) NULL);
+            return TCL_ERROR;
+        }
+#ifndef S_IFLNK
+        Tcl_AppendResult (interp, "symbolic links are not supported on this",
+                          " system", (char *) NULL);
+        return TCL_ERROR;
+#endif
+    }
+
+    tmppath = Tcl_TildeSubst (interp, argv [argc - 2]);
+    if (tmppath == NULL)
+        return TCL_ERROR;
+    srcpath = ckalloc (strlen (tmppath) + 1);
+    strcpy (srcpath, tmppath);
+
+    destpath = Tcl_TildeSubst (interp, argv [argc - 1]);
+    if (destpath == NULL)
+        goto errorExit;
+
+    if (argc == 4) {
+#ifdef S_IFLNK
+        if (symlink (srcpath, destpath) != 0)
+           goto unixError;
+#endif
+    } else {
+        if (link (srcpath, destpath) != 0)
+           goto unixError;
+    }
+    ckfree (srcpath);
+    return TCL_OK;
+
+unixError:
+    interp->result = Tcl_UnixError (interp);
+
+errorExit:
+    ckfree (srcpath);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_UnlinkCmd --
+ *     Implements the TCL unlink command:
+ *         unlink [-nocomplain] fileList
+ *
+ * Results:
+ *  Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_UnlinkCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int    idx, fileArgc;
+    char **fileArgv, *fileName;
+    int    noComplain;
+    
+    if ((argc < 2) || (argc > 3))
+        goto badArgs;
+
+    if (argc == 3) {
+        if (!STREQU (argv [1], "-nocomplain"))
+            goto badArgs;
+        noComplain = TRUE;
+    } else {
+        noComplain = FALSE;
+    }
+
+    if (Tcl_SplitList (interp, argv [argc - 1], &fileArgc,
+                       &fileArgv) != TCL_OK)
+        return TCL_ERROR;
+
+    for (idx = 0; idx < fileArgc; idx++) {
+        fileName = Tcl_TildeSubst (interp, fileArgv [idx]);
+        if (fileName == NULL) {
+            if (!noComplain)
+                goto errorExit;
+            continue;
+        }
+        if ((unlink (fileName) != 0) && !noComplain) {
+            Tcl_AppendResult (interp, fileArgv [idx], ": ",
+                              Tcl_UnixError (interp), (char *) NULL);
+            goto errorExit;
+        }
+    }
+
+    ckfree ((char *) fileArgv);
+    return TCL_OK;
+
+errorExit:
+    ckfree ((char *) fileArgv);
+    return TCL_ERROR;
+
+badArgs:
+    Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                      " [-nocomplain] filelist", (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_MkdirCmd --
+ *     Implements the TCL Mkdir command:
+ *         mkdir [-path] dirList
+ *
+ * Results:
+ *  Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_MkdirCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int           idx, dirArgc, result;
+    char        **dirArgv, *scanPtr;
+    struct stat   statBuf;
+
+    if ((argc < 2) || (argc > 3))
+        goto usageError;
+    if ((argc == 3) && !STREQU (argv [1], "-path"))
+        goto usageError;
+
+    if (Tcl_SplitList (interp, argv [argc - 1], &dirArgc, &dirArgv) != TCL_OK)
+        return TCL_ERROR;
+    /*
+     * Make all the directories, optionally making directories along the path.
+     */
+
+    for (idx = 0; idx < dirArgc; idx++) {
+        /*
+         * Make leading directories, if requested.
+         */
+        if (argc == 3) {
+            scanPtr = dirArgv [idx];
+            result = 0;  /* Start out ok, for dirs that are skipped */
+
+            while (*scanPtr != '\0') {
+                scanPtr = strchr (scanPtr+1, '/');
+                if ((scanPtr == NULL) || (*(scanPtr+1) == '\0'))
+                    break;
+                *scanPtr = '\0';
+                if (stat (dirArgv [idx], &statBuf) < 0)
+                    result = mkdir (dirArgv [idx], S_IFDIR | 0777);
+                *scanPtr = '/';
+                if (result < 0)
+                   goto mkdirError;
+            }
+        }
+        /*
+         * Make final directory in the path.
+         */
+        if (mkdir (dirArgv [idx], S_IFDIR | 0777) != 0)
+           goto mkdirError;
+    }
+
+    ckfree ((char *) dirArgv);
+    return TCL_OK;
+
+mkdirError:
+    Tcl_AppendResult (interp, dirArgv [idx], ": ", Tcl_UnixError (interp),
+                      (char *) NULL);
+    ckfree ((char *) dirArgv);
+    return TCL_ERROR;
+
+usageError:
+    Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                      " [-path] dirlist", (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_RmdirCmd --
+ *     Implements the TCL Rmdir command:
+ *         rmdir [-nocomplain]  dirList
+ *
+ * Results:
+ *  Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_RmdirCmd (clientData, interp, argc, argv)
+    ClientData  clientData;
+    Tcl_Interp *interp;
+    int         argc;
+    char      **argv;
+{
+    int    idx, dirArgc;
+    char **dirArgv, *dirName;
+    int    noComplain;
+    
+    if ((argc < 2) || (argc > 3))
+        goto badArgs;
+
+    if (argc == 3) {
+        if (!STREQU (argv [1], "-nocomplain"))
+            goto badArgs;
+        noComplain = TRUE;
+    } else {
+        noComplain = FALSE;
+    }
+
+    if (Tcl_SplitList (interp, argv [argc - 1], &dirArgc, &dirArgv) != TCL_OK)
+        return TCL_ERROR;
+
+    for (idx = 0; idx < dirArgc; idx++) {
+        dirName = Tcl_TildeSubst (interp, dirArgv [idx]);
+        if (dirName == NULL) {
+            if (!noComplain)
+                goto errorExit;
+            continue;
+        }
+        if ((rmdir (dirName) != 0) && !noComplain) {
+           Tcl_AppendResult (interp, dirArgv [idx], ": ",
+                             Tcl_UnixError (interp), (char *) NULL);
+           goto errorExit;
+        }
+    }
+
+    ckfree ((char *) dirArgv);
+    return TCL_OK;
+
+errorExit:
+    ckfree ((char *) dirArgv);
+    return TCL_ERROR;;
+
+badArgs:
+    Tcl_AppendResult (interp, tclXWrongArgs, argv [0], 
+                      " [-nocomplain] dirlist", (char *) NULL);
+    return TCL_ERROR;
+}
diff --git a/src/tclx/src/tclxutil.c b/src/tclx/src/tclxutil.c
new file mode 100644 (file)
index 0000000..f716919
--- /dev/null
@@ -0,0 +1,749 @@
+/*
+ * tclXutil.c
+ *
+ * Utility functions for Extended Tcl.
+ *-----------------------------------------------------------------------------
+ * Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies.  Karl Lehenbauer and
+ * Mark Diekhans make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *-----------------------------------------------------------------------------
+ * $Id: tclXutil.c,v 2.0 1992/10/16 04:51:21 markd Rel $
+ *-----------------------------------------------------------------------------
+ */
+
+#include "tclxint.h"
+
+#ifndef _tolower
+#  define _tolower tolower
+#  define _toupper toupper
+#endif
+
+/*
+ * Used to return argument messages by most commands.
+ */
+char *tclXWrongArgs = "wrong # args: ";
+
+extern double pow ();
+
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_StrToLong --
+ *      Convert an Ascii string to an long number of the specified base.
+ *
+ * Parameters:
+ *   o string (I) - String containing a number.
+ *   o base (I) - The base to use for the number 8, 10 or 16 or zero to decide
+ *     based on the leading characters of the number.  Zero to let the number
+ *     determine the base.
+ *   o longPtr (O) - Place to return the converted number.  Will be 
+ *     unchanged if there is an error.
+ *
+ * Returns:
+ *      Returns 1 if the string was a valid number, 0 invalid.
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_StrToLong (string, base, longPtr)
+    CONST char *string;
+    int         base;
+    long       *longPtr;
+{
+    char *end;
+    long  num;
+
+    num = strtol(string, &end, base);
+    while ((*end != '\0') && isspace(*end)) {
+        end++;
+    }
+    if ((end == string) || (*end != 0))
+        return FALSE;
+    *longPtr = num;
+    return TRUE;
+
+} /* Tcl_StrToLong */
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_StrToInt --
+ *      Convert an Ascii string to an number of the specified base.
+ *
+ * Parameters:
+ *   o string (I) - String containing a number.
+ *   o base (I) - The base to use for the number 8, 10 or 16 or zero to decide
+ *     based on the leading characters of the number.  Zero to let the number
+ *     determine the base.
+ *   o intPtr (O) - Place to return the converted number.  Will be 
+ *     unchanged if there is an error.
+ *
+ * Returns:
+ *      Returns 1 if the string was a valid number, 0 invalid.
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_StrToInt (string, base, intPtr)
+    CONST char *string;
+    int         base;
+    int        *intPtr;
+{
+    char *end;
+    int   num;
+
+    num = strtol(string, &end, base);
+    while ((*end != '\0') && isspace(*end)) {
+        end++;
+    }
+    if ((end == string) || (*end != 0))
+        return FALSE;
+    *intPtr = num;
+    return TRUE;
+
+} /* Tcl_StrToInt */
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_StrToUnsigned --
+ *      Convert an Ascii string to an unsigned int of the specified base.
+ *
+ * Parameters:
+ *   o string (I) - String containing a number.
+ *   o base (I) - The base to use for the number 8, 10 or 16 or zero to decide
+ *     based on the leading characters of the number.  Zero to let the number
+ *     determine the base.
+ *   o unsignedPtr (O) - Place to return the converted number.  Will be 
+ *     unchanged if there is an error.
+ *
+ * Returns:
+ *      Returns 1 if the string was a valid number, 0 invalid.
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_StrToUnsigned (string, base, unsignedPtr)
+    CONST char *string;
+    int         base;
+    unsigned   *unsignedPtr;
+{
+    char          *end;
+    unsigned long  num;
+
+    num = strtoul (string, &end, base);
+    while ((*end != '\0') && isspace(*end)) {
+        end++;
+    }
+    if ((end == string) || (*end != 0))
+        return FALSE;
+    *unsignedPtr = num;
+    return TRUE;
+
+} /* Tcl_StrToUnsigned */
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_StrToDouble --
+ *   Convert a string to a double percision floating point number.
+ *
+ * Parameters:
+ *   string (I) - Buffer containing double value to convert.
+ *   doublePtr (O) - The convert floating point number.
+ * Returns:
+ *   TRUE if the number is ok, FALSE if it is illegal.
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_StrToDouble (string, doublePtr)
+    CONST char *string;
+    double     *doublePtr;
+{
+    char   *end;
+    double  num;
+
+    num = strtod (string, &end);
+    while ((*end != '\0') && isspace(*end)) {
+        end++;
+    }
+    if ((end == string) || (*end != 0))
+        return FALSE;
+
+    *doublePtr = num;
+    return TRUE;
+
+} /* Tcl_StrToDouble */
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_DownShift --
+ *     Utility procedure to down-shift a string.  It is written in such
+ *     a way as that the target string maybe the same as the source string.
+ *
+ * Parameters:
+ *   o targetStr (I) - String to store the down-shifted string in.  Must
+ *     have enough space allocated to store the string.  If NULL is specified,
+ *     then the string will be dynamicly allocated and returned as the
+ *     result of the function. May also be the same as the source string to
+ *     shift in place.
+ *   o sourceStr (I) - The string to down-shift.
+ *
+ * Returns:
+ *   A pointer to the down-shifted string
+ *-----------------------------------------------------------------------------
+ */
+char *
+Tcl_DownShift (targetStr, sourceStr)
+    char       *targetStr;
+    CONST char *sourceStr;
+{
+    register char theChar;
+
+    if (targetStr == NULL)
+        targetStr = ckalloc (strlen ((char *) sourceStr) + 1);
+
+    for (; (theChar = *sourceStr) != '\0'; sourceStr++) {
+        if (isupper (theChar))
+            theChar = _tolower (theChar);
+        *targetStr++ = theChar;
+    }
+    *targetStr = '\0';
+    return targetStr;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_UpShift --
+ *     Utility procedure to up-shift a string.
+ *
+ * Parameters:
+ *   o targetStr (I) - String to store the up-shifted string in.  Must
+ *     have enough space allocated to store the string.  If NULL is specified,
+ *     then the string will be dynamicly allocated and returned as the
+ *     result of the function. May also be the same as the source string to
+ *     shift in place.
+ *   o sourceStr (I) - The string to up-shift.
+ *
+ * Returns:
+ *   A pointer to the up-shifted string
+ *-----------------------------------------------------------------------------
+ */
+char *
+Tcl_UpShift (targetStr, sourceStr)
+    char       *targetStr;
+    CONST char *sourceStr;
+{
+    register char theChar;
+
+    if (targetStr == NULL)
+        targetStr = ckalloc (strlen ((char *) sourceStr) + 1);
+
+    for (; (theChar = *sourceStr) != '\0'; sourceStr++) {
+        if (islower (theChar))
+            theChar = _toupper (theChar);
+        *targetStr++ = theChar;
+    }
+    *targetStr = '\0';
+    return targetStr;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ExpandDynBuf --
+ *
+ *    Expand a dynamic buffer so that it will have room to hold the 
+ *    specified additional space.  If `appendSize' is zero, the buffer
+ *    size will just be doubled.
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_ExpandDynBuf (dynBufPtr, appendSize)
+    dynamicBuf_t *dynBufPtr;
+    int           appendSize;
+{
+    int   newSize, minSize;
+    char *oldBufPtr;
+
+    newSize = dynBufPtr->size * 2;
+    minSize = dynBufPtr->len + 1 + appendSize;
+    if (newSize < minSize)
+        newSize = minSize;
+
+    oldBufPtr = dynBufPtr->ptr;
+    dynBufPtr->ptr = ckalloc (newSize);
+    memcpy (dynBufPtr->ptr, oldBufPtr, dynBufPtr->len + 1);
+    if (oldBufPtr != dynBufPtr->buf)
+        ckfree ((char *) oldBufPtr);
+    dynBufPtr->size = newSize;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_DynBufInit --
+ *
+ *    Initializes a dynamic buffer.
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_DynBufInit (dynBufPtr)
+    dynamicBuf_t *dynBufPtr;
+{
+    dynBufPtr->buf [0] = '\0';
+    dynBufPtr->ptr = dynBufPtr->buf;
+    dynBufPtr->size = INIT_DYN_BUFFER_SIZE;
+    dynBufPtr->len = 0;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_DynBufFree --
+ *
+ *    Clean up a dynamic buffer, release space if it was dynamicly
+ * allocated.
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_DynBufFree (dynBufPtr)
+    dynamicBuf_t *dynBufPtr;
+{
+    if (dynBufPtr->ptr != dynBufPtr->buf)
+        ckfree (dynBufPtr->ptr);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_DynBufReturn --
+ *
+ *    Return the contents of the dynamic buffer as an interpreter result.
+ * Don't call DynBufFree after calling this procedure.  The dynamic buffer
+ * must be re-initialized to reuse it.
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_DynBufReturn (interp, dynBufPtr)
+    Tcl_Interp    *interp;
+    dynamicBuf_t *dynBufPtr;
+{
+    if (dynBufPtr->ptr != dynBufPtr->buf)
+        Tcl_SetResult (interp, dynBufPtr->ptr, TCL_DYNAMIC);
+    else
+        Tcl_SetResult (interp, dynBufPtr->ptr, TCL_VOLATILE);
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_DynBufAppend --
+ *
+ *    Append the specified string to the dynamic buffer, expanding if
+ *    necessary. Assumes the string in the buffer is zero terminated.
+ *
+ *-----------------------------------------------------------------------------
+ */
+void
+Tcl_DynBufAppend (dynBufPtr, newStr)
+    dynamicBuf_t *dynBufPtr;
+    char         *newStr;
+{
+    int newLen, currentUsed;
+
+    newLen = strlen (newStr);
+    if ((dynBufPtr->len + newLen + 1) > dynBufPtr->size)
+        Tcl_ExpandDynBuf (dynBufPtr, newLen);
+    strcpy (dynBufPtr->ptr + dynBufPtr->len, newStr);
+    dynBufPtr->len += newLen;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_DynamicFgets --
+ *
+ *    Reads a line from a file into a dynamic buffer.  The buffer will be
+ * expanded, if necessary and reads are done until EOL or EOF is reached.
+ * Any data already in the buffer will be overwritten. if append is not
+ * specified.  Even if an error or EOF is encountered, the buffer should
+ * be cleaned up, as storage may have still been allocated.
+ *
+ * Results:
+ *    If data was transfered, returns 1, if EOF was encountered without
+ * transfering any data, returns 0.  If an error occured, returns, -1.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_DynamicFgets (dynBufPtr, filePtr, append)
+    dynamicBuf_t *dynBufPtr;
+    FILE         *filePtr;
+    int           append;
+{
+    int   readVal;
+
+    if (!append)
+        dynBufPtr->len = 0;
+
+    while (TRUE) {
+        if (dynBufPtr->len + 1 == dynBufPtr->size)
+            Tcl_ExpandDynBuf (dynBufPtr, 0);
+
+        readVal = getc (filePtr);
+        if (readVal == '\n')      /* Is it a new-line? */
+            break;
+        if (readVal == EOF) {     /* Is it an EOF or an error? */
+            if (feof (filePtr)) {
+                break;
+            }
+            return -1;   /* Error */
+        }
+        dynBufPtr->ptr [dynBufPtr->len++] = readVal;
+    }
+    dynBufPtr->ptr [dynBufPtr->len] = '\0';
+    return (readVal == EOF) ? 0 : 1;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_GetLong --
+ *
+ *      Given a string, produce the corresponding long value.
+ *
+ * Results:
+ *      The return value is normally TCL_OK;  in this case *intPtr
+ *      will be set to the integer value equivalent to string.  If
+ *      string is improperly formed then TCL_ERROR is returned and
+ *      an error message will be left in interp->result.
+ *
+ * Side effects:
+ *      None.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_GetLong(interp, string, longPtr)
+    Tcl_Interp *interp;         /* Interpreter to use for error reporting. */
+    CONST char *string;         /* String containing a (possibly signed)
+                                 * integer in a form acceptable to strtol. */
+    long       *longPtr;        /* Place to store converted result. */
+{
+    char *end;
+    long  i;
+
+    i = strtol(string, &end, 0);
+    while ((*end != '\0') && isspace(*end)) {
+        end++;
+    }
+    if ((end == string) || (*end != 0)) {
+        Tcl_AppendResult (interp, "expected integer but got \"", string,
+                          "\"", (char *) NULL);
+        return TCL_ERROR;
+    }
+    *longPtr = i;
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_GetUnsigned --
+ *
+ *      Given a string, produce the corresponding unsigned integer value.
+ *
+ * Results:
+ *      The return value is normally TCL_OK;  in this case *intPtr
+ *      will be set to the integer value equivalent to string.  If
+ *      string is improperly formed then TCL_ERROR is returned and
+ *      an error message will be left in interp->result.
+ *
+ * Side effects:
+ *      None.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_GetUnsigned(interp, string, unsignedPtr)
+    Tcl_Interp *interp;         /* Interpreter to use for error reporting. */
+    CONST char *string;         /* String containing a (possibly signed)
+                                 * integer in a form acceptable to strtoul. */
+    unsigned   *unsignedPtr;    /* Place to store converted result. */
+{
+    char          *end;
+    unsigned long  i;
+
+    /*
+     * Since some strtoul functions don't detect negative numbers, check
+     * in advance.
+     */
+    while (isspace(*string))
+        string++;
+    if (string [0] == '-')
+        goto badUnsigned;
+
+    i = strtoul(string, &end, 0);
+    while ((*end != '\0') && isspace(*end))
+        end++;
+
+    if ((end == string) || (*end != '\0'))
+        goto badUnsigned;
+
+    *unsignedPtr = i;
+    return TCL_OK;
+
+  badUnsigned:
+    Tcl_AppendResult (interp, "expected unsigned integer but got \"", 
+                      string, "\"", (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_ConvertFileHandle --
+ *
+ * Convert a file handle to its file number. The file handle maybe one 
+ * of "stdin", "stdout" or "stderr" or "fileNNN", were NNN is the file
+ * number.  If the handle is invalid, -1 is returned and a error message
+ * will be returned in interp->result.  This is used when the file may
+ * not be currently open.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_ConvertFileHandle (interp, handle)
+    Tcl_Interp *interp;
+    char       *handle;
+{
+    int fileId = -1;
+
+    if (handle [0] == 's') {
+        if (STREQU (handle, "stdin"))
+            fileId = 0;
+        else if (STREQU (handle, "stdout"))
+            fileId = 1;
+        else if (STREQU (handle, "stderr"))
+            fileId = 2;
+    } else {
+       if (STRNEQU (handle, "file", 4))
+           Tcl_StrToInt (&handle [4], 10, &fileId);
+    }
+    if (fileId < 0)
+        Tcl_AppendResult (interp, "invalid file handle: ", handle,
+                          (char *) NULL);
+    return fileId;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_SetupFileEntry --
+ *
+ * Set up an entry in the Tcl file table for a file number, including the stdio
+ * FILE structure.
+ *
+ * Parameters:
+ *   o interp (I) - Current interpreter.
+ *   o fileNum (I) - File number to set up the entry for.
+ *   o readable (I) - TRUE if read access to the file.
+ *   o writable (I) - TRUE if  write access to the file.
+ * Returns:
+ *   TCL_OK or TCL_ERROR;
+ *-----------------------------------------------------------------------------
+ */
+int
+Tcl_SetupFileEntry (interp, fileNum, readable, writable)
+    Tcl_Interp *interp;
+    int         fileNum;
+    int         readable;
+    int         writable;
+{
+    Interp   *iPtr = (Interp *) interp;
+    char     *mode;
+    FILE     *fileCBPtr;
+    OpenFile *filePtr;
+
+    /*
+     * Set up a stdio FILE control block for the new file.
+     */
+    if (readable && writable) {
+        mode = "r+";
+    } else if (writable) {
+        mode = "w";
+    } else {
+        mode = "r";
+    }
+    fileCBPtr = fdopen (fileNum, mode);
+    if (fileCBPtr == NULL) {
+        iPtr->result = Tcl_UnixError (interp);
+        return TCL_ERROR;
+    }
+
+    /*
+     * Put the file in the Tcl table.
+     */
+    TclMakeFileTable (iPtr, fileNum);
+    if (iPtr->filePtrArray [fileno (fileCBPtr)] != NULL)
+        panic ("file already open");
+    filePtr = (OpenFile *) ckalloc (sizeof (OpenFile));
+    iPtr->filePtrArray [fileno (fileCBPtr)] = filePtr;
+
+    filePtr->f        = fileCBPtr;
+    filePtr->f2       = NULL;
+    filePtr->readable = readable;
+    filePtr->writable = writable;
+    filePtr->numPids  = 0;
+    filePtr->pidPtr   = NULL;
+    filePtr->errorId  = -1;
+
+    return TCL_OK;
+}
+\f
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Tcl_System --
+ *     does the equivalent of the Unix "system" library call, but
+ *     uses waitpid to wait on the correct process, rather than
+ *     waiting on all processes and throwing the exit statii away
+ *     for the processes it isn't interested in, plus does it with
+ *     a Tcl flavor
+ *
+ * Results:
+ *  Standard TCL results, may return the UNIX system error message.
+ *
+ *-----------------------------------------------------------------------------
+ */
+int 
+Tcl_System (interp, command)
+    Tcl_Interp *interp;
+    char       *command;
+{
+    int processID, waitStatus, processStatus;
+
+    if ((processID = Tcl_Fork()) < 0) {
+        interp->result = Tcl_UnixError (interp);
+        return -1;
+    }
+    if (processID == 0) {
+        if (execl ("/bin/sh", "sh", "-c", command, (char *) NULL) < 0) {
+            interp->result = Tcl_UnixError (interp);
+            return -1;
+        }
+        exit(256);
+    }
+
+    /*
+     * Parent process.
+     */
+#ifndef TCL_HAVE_WAITPID
+    if (Tcl_WaitPids(1, &processID, &processStatus) == -1) {
+        interp->result = Tcl_UnixError (interp);
+        return -1;
+    }
+#else
+    if (waitpid (processID, &processStatus, 0) == -1) {
+        interp->result = Tcl_UnixError (interp);
+        return -1;
+    }
+#endif
+    return (WEXITSTATUS(processStatus));
+
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tcl_ReturnDouble --
+ *
+ *     Format a double to the maximum precision supported on
+ *     this machine.  If the number formats to an even integer,
+ *     a ".0" is append to assure that the value continues to
+ *     represent a floating point number.
+ *
+ * Results:
+ *     A standard Tcl result.  If the result is TCL_OK, then the
+ *     interpreter's result is set to the string value of the
+ *     double.  If the result is TCL_OK, then interp->result
+ *     contains an error message (If the number had the value of
+ *     "not a number" or "infinite").
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tcl_ReturnDouble(interp, number)
+    Tcl_Interp *interp;                        /* ->result gets converted number */
+    double number;                     /* Number to convert */
+{
+    static int precision = 0;
+    register char *scanPtr;
+
+    /*
+     * On the first call, determine the number of decimal digits that represent
+     * the precision of a double.
+     */
+    if (precision == 0) {
+#ifdef IS_LINUX
+       precision = 8;
+#else
+       sprintf (interp->result, "%.0f", pow (2.0, (double) DSIGNIF));
+       precision = strlen (interp->result);
+#endif
+    }
+
+    sprintf (interp->result, "%.*g", precision, number);
+
+    /*
+     * Scan the number for "." or "e" to assure that the number has not been
+     * converted to an integer.         Also check for NaN on infinite
+     */
+
+    scanPtr = interp->result;
+    if (scanPtr [0] == '-')
+       scanPtr++;
+    for (; isdigit (*scanPtr); scanPtr++)
+       continue;
+
+    switch (*scanPtr) {
+      case '.':
+      case 'e':
+       return TCL_OK;
+      case 'n':
+      case 'N':
+       interp->result = "Floating point error, result is not a number";
+       return TCL_ERROR;
+      case 'i':
+      case 'I':
+       interp->result = "Floating point error, result is infinite";
+       return TCL_ERROR;
+      case '\0':
+       scanPtr [0] = '.';
+       scanPtr [1] = '0';
+       scanPtr [2] = '\0';
+       return TCL_OK;
+    }
+
+    /*
+     * If we made it here, this sprintf returned something we did not expect.
+     */
+    Tcl_AppendResult (interp, ": unexpected floating point conversion result",
+                     (char *) NULL);
+    return TCL_ERROR;
+}
+     
diff --git a/src/tclx/tcllib/8queens.tcl b/src/tclx/tcllib/8queens.tcl
new file mode 100644 (file)
index 0000000..9e3e246
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# Eight Queens in Tcl
+#
+# by Karl Lehenbauer, 23 Nov 1990
+#
+#-----------------------------------------------------------------------------
+# $Id: 8queens.tcl,v 2.0 1992/10/16 04:51:36 markd Rel $
+#-----------------------------------------------------------------------------
+#
+proc none_attacking {rank position} {
+    global queens
+    loop i 1 $rank {
+       set j $queens([expr {$rank - $i}])
+       if {($j==$position-$i) || ($j==$position) || ($j==$position+$i)} {
+           return 0
+       }
+    }
+    return 1
+}
+
+proc solution {} {
+    global queens
+    echo $queens(1) $queens(2) $queens(3) $queens(4) $queens(5) $queens(6) $queens(7) $queens(8)
+}
+
+proc x8queens {rank} {
+    global queens
+    set queens($rank) 1
+    loop i 1 9 {
+       if [none_attacking $rank $i] {
+           set queens($rank) $i
+           if {$rank != 8} {
+               x8queens [expr $rank+1]
+           } else {
+               solution
+               return
+           }
+       }
+    }
+}
+
+proc 8queens {} {
+    x8queens 1
+}
+
+global interactiveSession
+if !$interactiveSession 8queens
diff --git a/src/tclx/tcllib/buildhelp.tcl b/src/tclx/tcllib/buildhelp.tcl
new file mode 100644 (file)
index 0000000..f736697
--- /dev/null
@@ -0,0 +1,439 @@
+#
+# buildhelp.tcl --
+#
+# Program to extract help files from TCL manual pages or TCL script files.
+# The help directories are built as a hierarchical tree of subjects and help
+# files.  
+# 
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: buildhelp.tcl,v 2.1 1992/10/25 17:07:40 markd Exp $
+#------------------------------------------------------------------------------
+#
+# For nroff man pages, the areas of text to extract are delimited with:
+#
+#     '@help: subjectdir/helpfile
+#     '@endhelp
+#
+# start in column one. The text between these markers is extracted and stored
+# in help/subjectdir/help.  The file must not exists, this is done to enforced 
+# cleaning out the directories before help file generation is started, thus
+# removing any stale files.  The extracted text is run through:
+#
+#     nroff -man|col -xb   {col -b on BSD derived systems}
+#
+# If there is other text to include in the helpfile, but not in the manual 
+# page, the text, along with nroff formatting commands, may be included using:
+#
+#     '@:Other text to include in the help page.
+#
+# A entry in the brief file, used by apropos my be included by:
+#
+#     '@brief: Short, one line description
+#
+# These brief request must occur with in the bounds of a help section.
+#
+# If some header text, such as nroff macros, need to be preappended to the
+# text streem before it is run through nroff, then that text can be bracketed
+# with:
+#
+#     '@header
+#     '@endheader
+#
+# If multiple header blocks are encountered, they will all be preappended.
+#
+# For TCL script files, which are indentified because they end in ".tcl",
+# the text to be extracted is delimited by:
+#
+#    #@help: subjectdir/helpfile
+#    #@endhelp
+#
+# And brief lines are in the form:
+#
+#     #@brief: Short, one line description
+#
+# The only processing done on text extracted from .tcl files it to replace
+# the # in column one with a space.
+#
+#
+#-----------------------------------------------------------------------------
+# 
+# To run this program:
+#
+#   tcl buildhelp.tcl [-m mergeTree] -b brief.brf helpDir file-1 file-2 ...
+#
+# o -m mergeTree is a tree of help code, plus a brief file to merge with the
+#   help files that are to be extracted.  This will become part of the new
+#   help tree.  Used to merge in the documentation from UCB Tcl.
+# o -b specified the name of the brief file to create form the @brief entries.
+#   It must have an extension of ".brf".
+# o helpDir is the help tree root directory.  helpDir should  exists, but any
+#   subdirectories that don't exists will be created.  helpDir should be
+#   cleaned up before the start of manual page generation, as this program
+#   will not overwrite existing files.
+# o file-n are the nroff manual pages (.man) or .tcl or .tlib files to extract
+#   the help files from.
+#
+#-----------------------------------------------------------------------------
+
+#-----------------------------------------------------------------------------
+# Truncate a file name of a help file if the system does not support long
+# file names.  If the name starts with `Tcl_', then this prefix is removed.
+# If the name is then over 14 characters, it is truncated to 14 charactes
+#  
+proc TruncFileName {pathName} {
+    global G_truncFileNames
+
+    if {!$G_truncFileNames} {
+        return $pathName}
+    set fileName [file tail $pathName]
+    if {"[crange $fileName 0 3]" == "Tcl_"} {
+        set fileName [crange $fileName 4 end]}
+    set fileName [crange $fileName 0 13]
+    return "[file dirname $pathName]/$fileName"
+}
+
+#-----------------------------------------------------------------------------
+# Proc to ensure that all directories for the specified file path exists,
+# and if they don't create them.  Don't use -path so we can set the
+# permissions.
+
+proc EnsureDirs {filePath} {
+    set dirPath [file dirname $filePath]
+    if [file exists $dirPath] return
+    foreach dir [split $dirPath /] {
+        lappend dirList $dir
+        set partPath [join $dirList /]
+        if [file exists $partPath] continue
+
+        mkdir $partPath
+        chmod u=rwx,go=rx $partPath
+    }
+}
+
+
+#-----------------------------------------------------------------------------
+#
+# Proc to extract nroff text to use as a header to all pass to nroff when
+# processing a help file.
+#    manPageFH - The file handle of the manual page.
+#
+
+proc ExtractNroffHeader {manPageFH} {
+    global nroffHeader
+    while {[gets $manPageFH manLine] >= 0} {
+        if {[string first "'@endheader" $manLine] == 0} {
+            break;
+            }
+        if {[string first "'@:" $manLine] == 0} {
+            set manLine [csubstr manLine 3 end]
+            }
+        append nroffHeader "$manLine\n"
+        }
+}
+
+#-----------------------------------------------------------------------------
+#
+# Proc to extract a nroff help file when it is located in the text.
+#    manPageFH - The file handle of the manual page.
+#    manLine - The '@help: line starting the data to extract.
+#
+
+proc ExtractNroffHelp {manPageFH manLine} {
+    global G_helpDir nroffHeader G_briefHelpFH G_colArgs
+
+    set helpName [string trim [csubstr $manLine 7 end]]
+    set helpFile [TruncFileName "$G_helpDir/$helpName"]
+    if {[file exists $helpFile]} {
+        error "Help file already exists: $helpFile"}
+    EnsureDirs $helpFile
+    set helpFH [open "| nroff -man | col $G_colArgs > $helpFile" w]
+    echo "    creating help file $helpName"
+
+    # Nroff commands from .TH macro to get the formatting right.  The `\n'
+    # are newline separators to output, the `\\n' become `\n' in the text.
+        
+    puts $helpFH ".ad b\n.PD\n.nrIN \\n()Mu\n.nr)R 0\n.nr)I \\n()Mu"
+    puts $helpFH ".nr)R 0\n.\}E\n.DT\n.na\n.nh"
+    puts $helpFH $nroffHeader
+    set foundBrief 0
+    while {[gets $manPageFH manLine] >= 0} {
+        if {[string first "'@endhelp" $manLine] == 0} {
+            break;
+        }
+        if {[string first "'@brief:" $manLine] == 0} {
+            if $foundBrief {
+                error {Duplicate "'@brief" entry"}
+            }
+            set foundBrief 1
+           puts $G_briefHelpFH "$helpName\t[csubstr $manLine 8 end]"
+            continue;
+        }
+        if {[string first "'@:" $manLine] == 0} {
+            set manLine [csubstr $manLine 3 end]
+        }
+        if {[string first "'@help" $manLine] == 0} {
+            error {"'@help" found within another help section"}
+        }
+        puts $helpFH $manLine
+        }
+    close $helpFH
+    chmod a-w,a+r $helpFile
+}
+
+#-----------------------------------------------------------------------------
+#
+# Proc to extract a tcl script help file when it is located in the text.
+#    ScriptPageFH - The file handle of the .tcl file.
+#    ScriptLine - The #@help: line starting the data to extract.
+#
+
+proc ExtractScriptHelp {ScriptPageFH ScriptLine} {
+    global G_helpDir G_briefHelpFH
+    set helpName [string trim [csubstr $ScriptLine 7 end]]
+    set helpFile "$G_helpDir/$helpName"
+    if {[file exists $helpFile]} {
+        error "Help file already exists: $helpFile"}
+    EnsureDirs $helpFile
+    set helpFH [open $helpFile w]
+    echo "    creating help file $helpName"
+    set foundBrief 0
+    while {[gets $ScriptPageFH ScriptLine] >= 0} {
+        if {[string first "#@endhelp" $ScriptLine] == 0} {
+            break;
+        }
+        if {[string first "#@brief:" $ScriptLine] == 0} {
+            if $foundBrief {
+                error {Duplicate "#@brief" entry"}
+            }
+            set foundBrief 1
+           puts $G_briefHelpFH "$helpName\t[csubstr $ScriptLine 8 end]"
+            continue;
+        }
+        if {[string first "#@help" $ScriptLine] == 0} {
+            error {"#@help" found within another help section"}
+        }
+        if {[clength $ScriptLine] > 1} {
+            set ScriptLine " [csubstr $ScriptLine 1 end]"
+        } else {
+            set ScriptLine ""
+        }
+        puts $helpFH $ScriptLine
+        }
+    close $helpFH
+    chmod a-w,a+r $helpFile
+}
+
+#-----------------------------------------------------------------------------
+#
+# Proc to scan a nroff manual file looking for the start of a help text
+# sections and extracting those sections.
+#    pathName - Full path name of file to extract documentation from.
+#
+
+proc ProcessNroffFile {pathName} {
+   global G_nroffScanCT G_scriptScanCT nroffHeader
+
+   set fileName [file tail $pathName]
+
+   set nroffHeader {}
+   set manPageFH [open $pathName r]
+   echo "    scanning $pathName"
+   set matchInfo(fileName) [file tail $pathName]
+   scanfile $G_nroffScanCT $manPageFH
+   close $manPageFH
+}
+
+#-----------------------------------------------------------------------------
+#
+# Proc to scan a Tcl script file looking for the start of a
+# help text sections and extracting those sections.
+#    pathName - Full path name of file to extract documentation from.
+#
+
+proc ProcessTclScript {pathName} {
+   global G_scriptScanCT nroffHeader
+
+   set scriptFH [open "$pathName" r]
+
+   echo "    scanning $pathName"
+   set matchInfo(fileName) [file tail $pathName]
+   scanfile $G_scriptScanCT $scriptFH
+   close $scriptFH
+}
+
+#-----------------------------------------------------------------------------
+# Proc to copy the help merge tree, excluding the brief file and RCS files
+# 
+
+proc CopyMergeTree {helpDirPath mergeTree} {
+    if {"[cindex $helpDirPath 0]" != "/"} {
+        set helpDirPath "[pwd]/$helpDirPath"
+    }
+    set oldDir [pwd]
+    cd $mergeTree
+
+    set curHelpDir "."
+
+    for_recursive_glob mergeFile {.} {
+        if [string match "*/RCS/*" $mergeFile] continue
+
+        set helpFile "$helpDirPath/$mergeFile"
+        if [file isdirectory $mergeFile] continue
+
+        if {[file exists $helpFile]} {
+            error "Help file already exists: $helpFile"}
+        EnsureDirs $helpFile
+        set inFH [open $mergeFile r]
+        set outFH [open $helpFile w]
+        copyfile $inFH $outFH
+        close $outFH
+        close $inFH
+        chmod a-w,a+r $helpFile
+    }
+    cd $oldDir
+}
+
+#-----------------------------------------------------------------------------
+# GenerateHelp: main procedure.  Generates help from specified files.
+#    helpDirPath - Directory were the help files go.
+#    mergeTree - Help file tree to merge with the extracted help files.
+#    briefFile - The name of the brief file to create.
+#    sourceFiles - List of files to extract help files from.
+
+proc GenerateHelp {helpDirPath briefFile mergeTree sourceFiles} {
+    global G_helpDir G_truncFileNames G_nroffScanCT
+    global G_scriptScanCT G_briefHelpFH G_colArgs
+
+    echo ""
+    echo "Begin building help tree"
+
+    # Determine version of col command to use (no -x on BSD)
+    if {[system {col -bx </dev/null >/dev/null 2>&1}] != 0} {
+        set G_colArgs {-b}
+    } else {
+        set G_colArgs {-bx}
+    }
+    set G_helpDir [glob $helpDirPath]
+
+    if {![file isdirectory $G_helpDir]} {
+        error [concat "$G_helpDir is not a directory or does not exist. "  
+                      "This should be the help root directory"]
+    }
+        
+    set status [catch {set tmpFH [open $G_helpDir/AVeryVeryBigFileName w]}]
+    if {$status != 0} {
+        set G_truncFileNames 1
+    } else {
+        close $tmpFH
+        unlink $G_helpDir/AVeryVeryBigFileName
+        set G_truncFileNames 0
+    }
+
+    set G_nroffScanCT [scancontext create]
+
+    scanmatch $G_nroffScanCT "^'@help:" {
+        ExtractNroffHelp $matchInfo(handle) $matchInfo(line)
+        continue
+    }
+
+    scanmatch $G_nroffScanCT "^'@header" {
+        ExtractNroffHeader $matchInfo(handle)
+        continue
+    }
+    scanmatch $G_nroffScanCT "^'@endhelp" {
+        error [concat {"'@endhelp" without corresponding "'@help:"} \
+                 ", offset = $matchInfo(offset)"]
+    }
+    scanmatch $G_nroffScanCT "^'@brief" {
+        error [concat {"'@brief" without corresponding "'@help:"}
+                 ", offset = $matchInfo(offset)"]
+    }
+
+    set G_scriptScanCT [scancontext create]
+    scanmatch $G_scriptScanCT "^#@help:" {
+        ExtractScriptHelp $matchInfo(handle) $matchInfo(line)
+    }
+
+    if ![lempty $mergeTree] {
+        echo "    Merging tree: $mergeTree"
+        CopyMergeTree $helpDirPath $mergeTree
+    }
+
+
+    if {[file extension $briefFile] != ".brf"} {
+        puts stderr "Brief file \"$briefFile\" must have an extension \".brf\""
+        exit 1
+    }
+    if [file exists $G_helpDir/$briefFile] {
+        puts stderr "Brief file \"$G_helpDir/$briefFile\" already exists"
+        exit 1
+    }
+    set G_briefHelpFH [open "|sort > $G_helpDir/$briefFile" w]
+
+    foreach manFile $sourceFiles {
+        set manFile [glob $manFile]
+        set ext [file extension $manFile]
+        if {"$ext" == ".man"} {
+            set status [catch {ProcessNroffFile $manFile} msg]
+        } else {
+            set status [catch {ProcessTclScript $manFile} msg]
+        }
+        if {$status != 0} {
+            echo "Error extracting help from: $manFile"
+            echo $msg
+            global errorInfo interactiveSession
+            if {!$interactiveSession} {
+                echo $errorInfo
+                exit 1
+            }
+        }
+    }
+
+    close $G_briefHelpFH
+    chmod a-w,a+r $G_helpDir/$briefFile
+    echo "*** completed extraction of all help files"
+}
+
+#-----------------------------------------------------------------------------
+# Print a usage message and exit the program
+proc Usage {} {
+    puts stderr {Wrong args: [-m mergetree] -b briefFile helpdir manfile1 [manfile2..]}
+    exit 1
+}
+
+#-----------------------------------------------------------------------------
+# Main program body, decides if help is interactive or batch.
+
+if {$interactiveSession} {
+    echo "To extract help, use the command:"
+    echo {GenerateHelp helpdir -m mergetree file-1 file-2 ...}
+} else {
+    set mergeTree {}
+    set briefFile {}
+    while {[string match "-*" [lindex $argv 0]]} {
+        set flag [lvarpop argv 0]
+        case $flag in {
+            "-m" {set mergeTree [lvarpop argv]}
+            "-b" {set briefFile [lvarpop argv]}
+            default Usage
+        }
+    }
+    if {[llength $argv] < 2} {
+        Usage
+    }
+    if [lempty $briefFile] {
+       puts stderr {must specify -b argument}
+       Usage 
+    }
+    GenerateHelp [lindex $argv 0] $briefFile $mergeTree [lrange $argv 1 end]
+   
+}
diff --git a/src/tclx/tcllib/buildidx.tcl b/src/tclx/tcllib/buildidx.tcl
new file mode 100644 (file)
index 0000000..8d0d067
--- /dev/null
@@ -0,0 +1,99 @@
+#
+# buildidx.tcl --
+#
+# Code to build Tcl package library. Defines the proc `buildpackageindex'.
+# 
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: buildidx.tcl,v 2.0 1992/10/16 04:51:38 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+proc TCHSH:PutLibLine {outfp package where endwhere autoprocs} {
+    puts $outfp [concat $package $where [expr {$endwhere - $where - 1}] \
+                        $autoprocs]
+}
+
+proc TCLSH:CreateLibIndex {libName} {
+
+    if {[file extension $libName] != ".tlb"} {
+        error "Package library `$libName' does not have the extension `.tlb'"}
+    set idxName "[file root $libName].tdx"
+
+    unlink -nocomplain $idxName
+    set libFH [open $libName r]
+    set idxFH [open $idxName w]
+
+    set contectHdl [scancontext create]
+
+    scanmatch $contectHdl "^#@package: " {
+        set size [llength $matchInfo(line)]
+        if {$size < 2} {
+            error [format "invalid package header \"%s\"" $matchInfo(line)]
+        }
+        if $inPackage {
+            TCHSH:PutLibLine $idxFH $pkgDefName $pkgDefWhere \
+                             $matchInfo(offset) $pkgDefProcs
+        }
+        set pkgDefName   [lindex $matchInfo(line) 1]
+        set pkgDefWhere  [tell $matchInfo(handle)]
+        set pkgDefProcs  [lrange $matchInfo(line) 2 end]
+        set inPackage 1
+    }
+
+    scanmatch $contectHdl "^#@packend" {
+        if !$inPackage {
+            error "#@packend without #@package in $libName
+        }
+        TCHSH:PutLibLine $idxFH $pkgDefName $pkgDefWhere $matchInfo(offset) \
+                         $pkgDefProcs
+        set inPackage 0
+    }
+
+    set inPackage 0
+    if {[catch {
+        scanfile $contectHdl $libFH
+       } msg] != 0} {
+       global errorInfo errorCode
+       close libFH
+       close idxFH
+       error $msg $errorInfo $errorCode
+    }
+    if {![info exists pkgDefName]} {
+        error "No #@package definitions found in $libName"
+    }
+    if $inPackage {
+        TCHSH:PutLibLine $idxFH $pkgDefName $pkgDefWhere [tell $libFH] \
+                         $pkgDefProcs
+    }
+    close $libFH
+    close $idxFH
+    
+    scancontext delete $contectHdl
+
+    # Set mode and ownership of the index to be the same as the library.
+
+    file stat $libName statInfo
+    chmod $statInfo(mode) $idxName
+    chown [list $statInfo(uid) $statInfo(gid)] $idxName
+
+}
+
+proc buildpackageindex {libfile} {
+
+    set status [catch {TCLSH:CreateLibIndex $libfile} errmsg]
+    if {$status != 0} {
+        global errorInfo errorCode
+        error "building package index for `$libfile' failed: $errmsg" \
+              $errorInfo $errorCode
+    }
+}
+
diff --git a/src/tclx/tcllib/tclinit.tcl b/src/tclx/tcllib/tclinit.tcl
new file mode 100644 (file)
index 0000000..b470ee8
--- /dev/null
@@ -0,0 +1,104 @@
+#-----------------------------------------------------------------------------
+# TclInit.tcl -- Extended Tcl initialization.
+#-----------------------------------------------------------------------------
+# $Id: TclInit.tcl,v 2.0 1992/10/16 04:51:37 markd Rel $
+#-----------------------------------------------------------------------------
+
+global env TCLENV
+set TCLENV(inUnknown) 0
+
+#
+# Unknown command trap handler.
+#
+proc unknown {cmdName args} {
+    global TCLENV
+    if $TCLENV(inUnknown) {
+        error "recursive unknown command trap: \"$cmdName\""}
+    set TCLENV(inUnknown) 1
+    
+    set stat [catch {demand_load $cmdName} ret]
+    if {$stat == 0 && $ret} {
+        set TCLENV(inUnknown) 0
+        return [uplevel 1 [list eval $cmdName $args]]
+    }
+
+    if {$stat != 0} {
+        global errorInfo errorCode
+        set TCLENV(inUnknown) 0
+        error $ret $errorInfo $errorCode
+    }
+
+    global env interactiveSession noAutoExec
+
+    if {$interactiveSession && ([info level] == 1) && ([info script] == "") &&
+            (!([info exists noAutoExec] && [set noAutoExec]))} {
+        if {[file rootname $cmdName] == "$cmdName"} {
+            if [info exists env(PATH)] {
+                set binpath [searchpath [split $env(PATH) :] $cmdName]
+            } else {
+                set binpath [searchpath "." $cmdName]
+            }
+        } else {
+            set binpath $cmdName
+        }
+        if {[file executable $binpath]} {
+            set TCLENV(inUnknown) 0
+            uplevel 1 [list system [concat $cmdName $args]]
+            return
+        }
+    }
+    set TCLENV(inUnknown) 0
+    error "invalid command name: \"$cmdName\""
+}
+
+#
+# Search a path list for a file. (catch is for bad ~user)
+#
+proc searchpath {pathlist file} {
+    foreach dir $pathlist {
+        if {$dir == ""} {set dir .}
+        if {[catch {file exists $dir/$file} result] == 0 && $result}  {
+            return $dir/$file
+        }
+    }
+    return {}
+}
+
+#
+# Define a proc to be available for demand_load.
+#
+proc autoload {filenam args} {
+    global TCLENV
+    foreach i $args {
+        set TCLENV(PROC:$i) [list F $filenam]
+    }
+}
+
+#
+# Search TCLPATH for a file to source.
+#
+proc load {name} {
+    global TCLPATH errorCode
+    if {[string first / $name] >= 0} {
+        return  [uplevel #0 source $name]
+    }
+    set where [searchpath $TCLPATH $name]
+    if [lempty $where] {
+        error "couldn't find $name in Tcl search path" "" "TCLSH FILE_NOT_FOUND"
+    }
+    uplevel #0 source $where
+}
+
+autoload buildidx.tcl buildpackageindex
+
+# == Put any code you want all Tcl programs to include here. ==
+
+if !$interactiveSession return
+
+# == Interactive Tcl session initialization ==
+
+set TCLENV(topLevelPromptHook) {global programName; concat "$programName>" }
+set TCLENV(downLevelPromptHook) {concat "=>"}
+
+if [file readable ~/.tclrc] {source ~/.tclrc}
+
diff --git a/src/tclx/tclsrc/array.tcl b/src/tclx/tclsrc/array.tcl
new file mode 100644 (file)
index 0000000..6bbdeeb
--- /dev/null
@@ -0,0 +1,35 @@
+#
+# arrayprocs.tcl --
+#
+# Extended Tcl array procedures.
+# 
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: arrayprocs.tcl,v 2.0 1992/10/16 04:51:54 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-ArrayProcedures for_array_keys
+
+proc for_array_keys {varName arrayName codeFragment} {
+    upvar $varName enumVar $arrayName enumArray
+
+    if ![info exists enumArray] {
+       error "\"$arrayName\" isn't an array"
+    }
+
+    set searchId [array startsearch enumArray]
+    while {[array anymore enumArray $searchId]} {
+       set enumVar [array nextelement enumArray $searchId]
+       uplevel $codeFragment
+    }
+    array donesearch enumArray $searchId
+}
diff --git a/src/tclx/tclsrc/assign.tcl b/src/tclx/tclsrc/assign.tcl
new file mode 100644 (file)
index 0000000..e17dde0
--- /dev/null
@@ -0,0 +1,26 @@
+#
+# asgnfields.tcl --
+#
+# Procedure to assign list fields to variables.
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: asgnfields.tcl,v 2.0 1992/10/16 04:51:55 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-assign_fields assign_fields
+
+proc assign_fields {list args} {
+    foreach varName $args {
+        set value [lvarpop list]
+        uplevel "set $varName [list $value]"
+    }
+}
diff --git a/src/tclx/tclsrc/compat.tcl b/src/tclx/tclsrc/compat.tcl
new file mode 100644 (file)
index 0000000..af84634
--- /dev/null
@@ -0,0 +1,24 @@
+#
+# compat --
+#
+# This file provides commands compatible with older versions of Extended Tcl.
+# 
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: compat.tcl,v 2.0 1992/10/16 04:51:51 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-Compatibility execvp
+
+proc execvp {progname args} {
+    execl $progname $args
+}
diff --git a/src/tclx/tclsrc/convlib.tcl b/src/tclx/tclsrc/convlib.tcl
new file mode 100644 (file)
index 0000000..886f57c
--- /dev/null
@@ -0,0 +1,53 @@
+#
+# convlib.tcl --
+#
+#     Convert Ousterhout style tclIndex files and associated libraries to a
+# package library.
+# 
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: convlib.tcl,v 2.0 1992/10/16 04:51:53 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-convertlib convert_lib
+
+proc convert_lib {tclIndex packageLib {ignore {}}} {
+    if {[file tail $tclIndex] != "tclindex"} {
+        error "Tail file name numt be `tclindex': $tclIndex"}
+    set srcDir [file dirname $tclIndex]
+
+    if {[file extension $packageLib] != ".tlib"} {
+        append packageLib ".tlib"}
+
+    # Build an array addressed by file name containing all of the procs
+    # defined in that file.
+
+    set tclIndexFH [open $tclIndex r]
+    while {[gets $tclIndexFH line] >= 0} {
+        if {([cindex $line 0] == "#") || ([llength $line] != 2)} {
+            continue}
+        if {[lsearch $ignore [lindex $line 1]] >= 0} {
+            continue}
+        lappend entryTable([lindex $line 1]) [lindex $line 0]
+    }
+    close $tclIndexFH
+
+    set libFH [open $packageLib w]
+    foreach srcFile [array names entryTable] {
+        set srcFH [open $srcDir/$srcFile r]
+        puts $libFH "#@package: $srcFile $entryTable($srcFile)\n"
+        copyfile $srcFH $libFH
+        close $srcFH
+    }
+    close $libFH
+    buildpackageindex $packageLib
+}
diff --git a/src/tclx/tclsrc/edprocs.tcl b/src/tclx/tclsrc/edprocs.tcl
new file mode 100644 (file)
index 0000000..92596a8
--- /dev/null
@@ -0,0 +1,56 @@
+#
+# edprocs.tcl --
+#
+# Tools for Tcl developers. Procedures to save procs to a file and to edit
+# a proc in memory.
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: edprocs.tcl,v 2.0 1992/10/16 04:51:57 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-developer_utils saveprocs edprocs
+
+proc saveprocs {fileName args} {
+    set fp [open $fileName w]
+    puts $fp "# tcl procs saved on [fmtclock [getclock]]\n"
+    puts $fp [eval "showprocs $args"]
+    close $fp
+}
+
+proc edprocs {args} {
+    global env
+
+    set tmpFilename /tmp/tcldev.[id process]
+
+    set fp [open $tmpFilename w]
+    puts $fp "\n# TEMP EDIT BUFFER -- YOUR CHANGES ARE FOR THIS SESSION ONLY\n"
+    puts $fp [eval "showprocs $args"]
+    close $fp
+
+    if [info exists env(EDITOR)] {
+        set editor $env(EDITOR)
+    } else {
+       set editor vi
+    }
+
+    set startMtime [file mtime $tmpFilename]
+    system "$editor $tmpFilename"
+
+    if {[file mtime $tmpFilename] != $startMtime} {
+       source $tmpFilename
+       echo "Procedures were reloaded."
+    } else {
+       echo "No changes were made."
+    }
+    unlink $tmpFilename
+    return
+}
diff --git a/src/tclx/tclsrc/forfile.tcl b/src/tclx/tclsrc/forfile.tcl
new file mode 100644 (file)
index 0000000..8721f9c
--- /dev/null
@@ -0,0 +1,29 @@
+#
+# forfile.tcl --
+#
+# Proc to execute code on every line of a file.
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: forfile.tcl,v 2.0 1992/10/16 04:51:58 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-forfile for_file
+
+proc for_file {var filename code} {
+    upvar $var line
+    set fp [open $filename r]
+    while {[gets $fp line] >= 0} {
+        uplevel $code
+    }
+    close $fp
+}
+
diff --git a/src/tclx/tclsrc/forrec.tcl b/src/tclx/tclsrc/forrec.tcl
new file mode 100644 (file)
index 0000000..8c6ea3e
--- /dev/null
@@ -0,0 +1,32 @@
+#
+# forrecur.tcl --
+#
+# Proc to execute code on every file in a recursive directory glob.
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: forrecur.tcl,v 2.0 1992/10/16 04:52:00 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-forrecur for_recursive_glob
+
+proc for_recursive_glob {var globlist code {depth 1}} {
+    upvar $depth $var myVar
+    foreach globpat $globlist {
+        foreach file [glob -nocomplain $globpat] {
+            if [file isdirectory $file] {
+                for_recursive_glob $var $file/* $code [expr {$depth + 1}]
+           }
+           set myVar $file
+           uplevel $depth $code
+        }
+    }
+}
diff --git a/src/tclx/tclsrc/globrec.tcl b/src/tclx/tclsrc/globrec.tcl
new file mode 100644 (file)
index 0000000..e3d1c91
--- /dev/null
@@ -0,0 +1,32 @@
+#
+# globrecur.tcl --
+#
+#  Build up a directory list recursively.
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: globrecur.tcl,v 2.0 1992/10/16 04:52:04 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-globrecur recursive_glob
+
+proc recursive_glob {globlist} {
+    set result ""
+    foreach pattern $globlist {
+        foreach file [glob -nocomplain $pattern] {
+            lappend result $file
+            if [file isdirectory $file] {
+                set result [concat $result [recursive_glob $file/*]]
+            }
+        }
+    }
+    return $result
+}
diff --git a/src/tclx/tclsrc/help.tcl b/src/tclx/tclsrc/help.tcl
new file mode 100644 (file)
index 0000000..e77c3ac
--- /dev/null
@@ -0,0 +1,259 @@
+#
+# help.tcl --
+#
+# Tcl help command. (see TclX manual)
+# 
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: help.tcl,v 2.0 1992/10/16 04:52:01 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-help help helpcd helppwd apropos
+
+#------------------------------------------------------------------------------
+# Take a path name which might have . and .. elements and flatten them out.
+
+proc help:flattenPath {pathName} {
+    set newPath {}
+    foreach element [split $pathName /] {
+        if {"$element" == "."} {
+           continue
+        }
+        if {"$element" == ".."} {
+            if {[llength [join $newPath /]] == 0} {
+                error "Help: name goes above subject directory root"}
+            lvarpop newPath [expr [llength $newPath]-1]
+            continue
+        }
+        lappend newPath $element
+    }
+    set newPath [join $newPath /]
+    
+    # Take care of the case where we started with something line "/" or "/."
+
+    if {("$newPath" == "") && [string match "/*" $pathName]} {
+        set newPath "/"}
+        
+    return $newPath
+}
+
+#------------------------------------------------------------------------------
+# Take the help current directory and a path and evaluate it into a help root-
+# based path name.
+
+proc help:EvalPath {pathName} {
+    global TCLENV
+
+    if {![string match "/*" $pathName]} {
+        if {"$pathName" == ""} {
+            return $TCLENV(help:curDir)}
+        if {"$TCLENV(help:curDir)" == "/"} {
+            set pathName "/$pathName"
+        } else {
+            set pathName "$TCLENV(help:curDir)/$pathName"
+        }
+    }
+    set pathName [help:flattenPath $pathName]
+    if {[string match "*/" $pathName] && ($pathName != "/")} {
+        set pathName [csubstr $pathName 0 [expr [length $pathName]-1]]}
+
+    return $pathName    
+}
+
+#------------------------------------------------------------------------------
+# Display a line of output, pausing waiting for input before displaying if the
+# screen size has been reached.  Return 1 if output is to continue, return
+# 0 if no more should be outputed, indicated by input other than return.
+#
+
+proc help:Display {line} {
+    global TCLENV
+    if {$TCLENV(help:lineCnt) >= 23} {
+        set TCLENV(help:lineCnt) 0
+        puts stdout ":" nonewline
+        flush stdout
+        gets stdin response
+        if {![lempty $response]} {
+            return 0}
+    }
+    puts stdout $line
+    incr TCLENV(help:lineCnt)
+}
+
+#------------------------------------------------------------------------------
+# Display a file.
+
+proc help:DisplayFile {filepath} {
+
+    set inFH [open $filepath r]
+    while {[gets $inFH fileBuf] >= 0} {
+        if {![help:Display $fileBuf]} {
+            break}
+    }
+    close $inFH
+
+}    
+
+#------------------------------------------------------------------------------
+# Procedure to return contents of a directory.  A list is returned, consisting
+# of two lists.  The first list are all the directories (subjects) in the
+# specified directory.  The second is all of the help files.  Eash sub-list
+# is sorted in alphabetical order.
+#
+
+proc help:ListDir {dirPath} {
+    set dirList {}
+    set fileList {}
+    if {[catch {set dirFiles [glob $dirPath/*]}] != 0} {
+        error "No files in subject directory: $dirPath"}
+    foreach fileName $dirFiles {
+        if [file isdirectory $fileName] {
+            lappend dirList "[file tail $fileName]/"
+        } else {
+            lappend fileList [file tail $fileName]
+        }
+    }
+   return [list [lsort $dirList] [lsort $fileList]]
+}
+
+#------------------------------------------------------------------------------
+# Display a list of file names in a column format. This use columns of 14 
+# characters 3 blanks.
+
+proc help:DisplayColumns {nameList} {
+    set count 0
+    set outLine ""
+    foreach name $nameList {
+        if {$count == 0} {
+            append outLine "   "}
+        append outLine $name
+        if {[incr count] < 4} {
+            set padLen [expr 17-[clength $name]]
+            if {$padLen < 3} {
+               set padLen 3}
+            append outLine [replicate " " $padLen]
+        } else {
+           if {![help:Display $outLine]} {
+               return}
+           set outLine ""
+           set count 0
+        }
+    }
+    if {$count != 0} {
+        help:Display $outLine}
+    return
+}
+
+
+#------------------------------------------------------------------------------
+# Help command main.
+
+proc help {{subject {}}} {
+    global TCLENV
+
+    set TCLENV(help:lineCnt) 0
+
+    # Special case "help help", so we can get it at any level.
+
+    if {($subject == "help") || ($subject == "?")} {
+        help:DisplayFile "$TCLENV(help:root)/help"
+        return
+    }
+
+    set request [help:EvalPath $subject]
+    set requestPath "$TCLENV(help:root)$request"
+
+    if {![file exists $requestPath]} {
+        error "Help:\"$request\" does not exist"}
+    
+    if [file isdirectory $requestPath] {
+        set dirList [help:ListDir $requestPath]
+        set subList  [lindex $dirList 0]
+        set fileList [lindex $dirList 1]
+        if {[llength $subList] != 0} {
+            help:Display "\nSubjects available in $request:"
+            help:DisplayColumns $subList
+        }
+        if {[llength $fileList] != 0} {
+            help:Display "\nHelp files available in $request:"
+            help:DisplayColumns $fileList
+        }
+    } else {
+        help:DisplayFile $requestPath
+    }
+    return
+}
+
+
+#------------------------------------------------------------------------------
+# Helpcd main.
+#   
+# The name of the new current directory is assembled from the current 
+# directory and the argument.  The name will be flatten and any trailing
+# "/" will be removed, unless the name is just "/".
+
+proc helpcd {{dir /}} {
+    global TCLENV
+
+    set request [help:EvalPath $dir]
+    set requestPath "$TCLENV(help:root)$request"
+
+    if {![file exists $requestPath]} {
+        error "Helpcd: \"$request\" does not exist"}
+    
+    if {![file isdirectory $requestPath]} {
+        error "Helpcd: \"$request\" is not a directory"}
+
+    set TCLENV(help:curDir) $request
+    return    
+}
+
+#------------------------------------------------------------------------------
+# Helpcd main.
+
+proc helppwd {} {
+        global TCLENV
+        echo "Current help subject directory: $TCLENV(help:curDir)"
+}
+
+#==============================================================================
+#     Tcl apropos command.  (see Tcl shell manual)
+#------------------------------------------------------------------------------
+
+proc apropos {name} {
+    global TCLENV
+
+    set TCLENV(help:lineCnt) 0
+
+    set aproposCT [scancontext create]
+    scanmatch -nocase $aproposCT $name {
+        set path [lindex $matchInfo(line) 0]
+        set desc [lrange $matchInfo(line) 1 end]
+        if {![help:Display [format "%s - %s" $path $desc]]} {
+            return}
+    }
+    foreach brief [glob -nocomplain $TCLENV(help:root)/*.brf] {
+        set briefFH [open $brief]
+        scanfile $aproposCT $briefFH
+        close $briefFH
+    }
+    scancontext delete $aproposCT
+}
+
+#------------------------------------------------------------------------------
+# One time initialization done when the file is sourced.
+#
+global TCLENV TCLPATH
+
+set TCLENV(help:root) [searchpath $TCLPATH help]
+set TCLENV(help:curDir) "/"
+set TCLENV(help:outBuf) {}
diff --git a/src/tclx/tclsrc/install.tcl b/src/tclx/tclsrc/install.tcl
new file mode 100644 (file)
index 0000000..ddd38c8
--- /dev/null
@@ -0,0 +1,619 @@
+#
+# installTcl.tcl -- 
+#
+# Tcl program to install Tcl onto the system.
+#
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: installTcl.tcl,v 2.0 1992/10/16 04:52:08 markd Rel $
+#------------------------------------------------------------------------------
+#
+# It is run in the following manner:
+#
+#     tcl installTcl.tcl
+#
+# This script reads the Extended Tcl Makefile confiugation file (Config.mk)
+# and converts the Makefile macros in Tcl variables that control the
+# installation.  The following variables are currently used:
+#
+#   TCL_UCB_DIR             TCL_DEFAULT             TCL_OWNER
+#   TCL_GROUP               TCL_BINDIR              TCL_LIBDIR
+#   TCL_INCLUDEDIR          TCL_TCLDIR              TCL_MAN_INSTALL
+#   TCL_MAN_BASEDIR         TCL_MAN_CMD_SECTION     TCL_MAN_FUNC_SECTION
+#   TK_MAN_CMD_SECTION      TK_MAN_FUNC_SECTION     TCL_MAN_STYLE*
+#   TCL_MAN_INDEX*          TCL_TK_SHELL*
+#
+# (ones marked with * are optional)
+#
+# Notes:
+#   o Must be run in the Extended Tcl top level directory.
+#   o The routine InstallManPages has code to determine if a manual page
+#     belongs to a command or function.  For Tcl the commands are assumed
+#     to be in "Tcl.man",  for TclX functions are in TclX.man.  All others
+#     are assumed to be functions.  For Tk, all manuals starting with Tk_
+#     are assumed to be functions, all others are assumed to be commands.
+#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+#------------------------------------------------------------------------------
+# ParseConfigFile --
+#
+#  Parse a configure file in the current directory and convert all make
+#  macros to global Tcl variables.
+
+proc ParseConfigFile {configFile} {
+   set cfgFH [open $configFile]
+   while {[gets $cfgFH line] >= 0} {
+      if {[string match {[A-Za-z]*} $line]} {
+          set idx [string first "=" $line]
+          if {$idx < 0} {
+              error "no `=' in: $line"}
+          set name  [string trim [csubstr $line 0 $idx]]
+          set value [string trim [crange  $line [expr $idx+1] end]]
+          global $name
+          set $name $value
+      }
+   }
+   close $cfgFH
+
+}
+
+#------------------------------------------------------------------------------
+# GiveAwayFile --
+#   Give away a file to the Tcl owner and group and set its permissions.
+#
+# Globals:
+#    TCL_OWNER - Owner name for Tcl files.
+#    TCL_GROUP - Group nmae for Tcl file.
+#------------------------------------------------------------------------------
+
+proc GiveAwayFile {file} {
+    global TCL_OWNER TCL_GROUP
+
+    if {[file isdirectory $file]} {
+        chmod a+rx,go-w $file
+    } else {
+        chmod a+r,go-w $file
+    }    
+    chown [list $TCL_OWNER $TCL_GROUP] $file
+
+} ;# GiveAwayFile
+
+#------------------------------------------------------------------------------
+# MakePath --
+#
+# Make sure all directories in a directory path exists, if not, create them.
+#------------------------------------------------------------------------------
+proc MakePath {pathlist} {
+    foreach path $pathlist {
+        set exploded_path [split $path /]
+        set thisdir {}
+        foreach element $exploded_path {
+            append thisdir $element
+            if {![file isdirectory $thisdir]} {
+                mkdir $thisdir
+                GiveAwayFile $thisdir
+            }
+            append thisdir /
+        }
+    }
+}
+
+#------------------------------------------------------------------------------
+# CopyFile -- 
+#
+# Copy the specified file and change the ownership.  If target is a directory,
+# then the file is copied to it, otherwise target is a new file name.
+#------------------------------------------------------------------------------
+
+proc CopyFile {sourceFile target} {
+
+    if {[file isdirectory $target]} {
+        set targetFile "$target/[file tail $sourceFile]"
+    } else {
+        set targetFile $target
+    }
+
+    unlink -nocomplain $targetFile
+    set sourceFH [open $sourceFile r]
+    set targetFH [open $targetFile w]
+    copyfile $sourceFH $targetFH
+    close $sourceFH
+    close $targetFH
+    GiveAwayFile $targetFile
+
+} ;# CopyFile
+
+#------------------------------------------------------------------------------
+# CopyManPage -- 
+#
+# Copy the specified manual page and change the ownership.  The manual page
+# is edited to remove change bars (.VS and .VE macros). If target is a
+# directory, then the file is copied to it, otherwise target is a new file
+# name.
+#------------------------------------------------------------------------------
+
+proc CopyManPage {sourceFile target} {
+
+    if {[file isdirectory $target]} {
+        set targetFile "$target/[file tail $sourceFile]"
+    } else {
+        set targetFile $target
+    }
+
+    unlink -nocomplain $targetFile
+    set sourceFH [open $sourceFile r]
+    set targetFH [open $targetFile w]
+    while {[gets $sourceFH line] >= 0} {
+        if [string match {.V[SE]*} $line] continue
+        puts $targetFH $line
+    }
+    close $sourceFH
+    close $targetFH
+    GiveAwayFile $targetFile
+
+} ;# CopyManPage
+
+#------------------------------------------------------------------------------
+# CopySubDir --
+#
+# Recursively copy part of a directory tree, changing ownership and 
+# permissions.  This is a utility routine that actually does the copying.
+#------------------------------------------------------------------------------
+
+proc CopySubDir {sourceDir destDir} {
+    foreach sourceFile [glob -nocomplain $sourceDir/*] {
+
+        if [file isdirectory $sourceFile] {
+            set destFile $destDir/[file tail $sourceFile]
+            if {![file exists $destFile]} {
+                mkdir $destFile}
+            GiveAwayFile $destFile
+            CopySubDir $sourceFile $destFile
+        } else {
+            CopyFile $sourceFile $destDir
+        }
+    }
+} ;# CopySubDir
+
+#------------------------------------------------------------------------------
+# CopyDir --
+#
+# Recurisvely copy a directory tree.
+#------------------------------------------------------------------------------
+
+proc CopyDir {sourceDir destDir} {
+
+    set cwd [pwd]
+    if ![file exists $sourceDir] {
+        error "\"$sourceDir\" does not exist"
+    }
+    if ![file isdirectory $sourceDir] {
+        error "\"$sourceDir\" isn't a directory"
+    }
+    if {![file exists $destDir]} {
+        mkdir $destDir
+        GiveAwayFile $destDir
+    }
+    if ![file isdirectory $destDir] {
+        error "\"$destDir\" isn't a directory"
+    }
+    cd $sourceDir
+    set status [catch {CopySubDir . $destDir} msg]
+    cd $cwd
+    if {$status != 0} {
+        global errorInfo errorCode
+        error $msg $errorInfo $errorCode
+    }
+}
+
+#------------------------------------------------------------------------------
+# GenDefaultFile -- 
+#
+# Generate the tcl defaults file.
+#------------------------------------------------------------------------------
+
+proc GenDefaultFile {defaultFileBase sourceDir} {
+
+    set defaultFile "$defaultFileBase[infox version]"
+
+    if ![file writable [file dirname $defaultFile]] {
+        puts stderr "Can't create $defaultFile -- directory is not writable"
+        puts stderr "Please reinstall with correct permissions or rebuild"
+        puts stderr "Tcl to select a default file where the directory path"
+        puts stderr "you specify is writable by you."
+        puts stderr ""
+        exit 1
+    }
+
+    set fp [open $defaultFile w]
+
+    puts $fp "# Extended Tcl [infox version] default file"
+    puts $fp ""
+    puts $fp "set TCLINIT $sourceDir/TclInit.tcl"
+    puts $fp ""
+    puts $fp "set TCLPATH $sourceDir"
+
+    close $fp
+    GiveAwayFile $defaultFile
+
+} ;# GenDefaultFile
+
+#------------------------------------------------------------------------------
+# GetManNames --
+#
+#   Search a manual page (nroff source) for the name line.  Parse the name
+# line into all of the functions or commands that it references.  This isn't
+# comprehensive, but it works for all of the Tcl, TclX and Tk man pages.
+#
+# Parameters:
+#   o manFile (I) - The path to the  manual page file.
+# Returns:
+#   A list contain the functions or commands or {} if the name line can't be
+# found or parsed.
+#------------------------------------------------------------------------------
+
+proc GetManNames {manFile} {
+
+   set manFH [open $manFile]
+
+   #
+   # Search for name line.  Once found, grab the next line that is not a
+   # nroff macro.  If we end up with a blank line, we didn't find it.
+   #
+   while {[gets $manFH line] >= 0} {
+       if [regexp {^.SH NAME.*$} $line] {
+           break
+       }
+   }
+   while {[gets $manFH line] >= 0} {
+       if {![string match ".*" $line]} break
+   }
+   close $manFH
+
+   set line [string trim $line]
+   if {$line == ""} return
+
+   #
+   # Lets try and parse the name list out of the line
+   #
+   if {![regexp {^(.*)(\\-)} $line {} namePart]} {
+       if {![regexp {^(.*)(-)} $line {} namePart]} return
+   }
+
+   #
+   # This magic converts the name line into a list
+   #
+
+   if {[catch {join [split $namePart ,] " "} namePart] != 0} return
+
+   return $namePart
+
+}
+
+#------------------------------------------------------------------------------
+# SetUpManIndex --
+#   Setup generation of manual page index for short manual pages, if required.
+# Globals:
+#   o TCL_MAN_INDEX - Boolean indicating if a manual page is to be created.
+#     If it does not exists, false is assumed.
+#   o TCL_MAN_BASEDIR - Base manual directory where all of the man.* and cat.* 
+#     directories live.
+# Returns:
+#   The manual index file handle, or {} if the manual index is not to be
+#  generated.
+#------------------------------------------------------------------------------
+
+proc SetUpManIndex {} {
+    global TCL_MAN_BASEDIR TCL_MAN_INDEX
+
+    if {!([info exists TCL_MAN_INDEX] && [set TCL_MAN_INDEX])} {
+        return {}
+    }
+    set tclIndexFile $TCL_MAN_BASEDIR/index.TCL
+    return [open $tclIndexFile w]
+}
+
+#------------------------------------------------------------------------------
+# FinishUpManIndex --
+#   Finish generation of manual page index for short manual pages, if required.
+# Parameters:
+#   o indexFileHdl - The file handle returned by SetUpManIndex, maybe {}.
+# Globals:
+#   o TCL_MAN_BASEDIR - Base manual directory where all of the man.* and cat.* 
+#     directories live.
+#------------------------------------------------------------------------------
+
+proc FinishUpManIndex {indexFileHdl} {
+    global TCL_MAN_BASEDIR TCL_MAN_INDEX_MERGE
+
+    if [lempty $indexFileHdl] return
+
+    set tclIndexFile $TCL_MAN_BASEDIR/index.TCL
+    close $indexFileHdl
+    GiveAwayFile $tclIndexFile
+
+}
+
+#------------------------------------------------------------------------------
+# InstallShortMan --
+#   Install a manual page on a system that does not have long file names,
+#   optionally adding an entry to the man index.
+#
+# Parameters:
+#   o sourceFile - Manual page source file path.
+#   o section - Section to install the manual page in.
+#   o indexFileHdl - File handle of the current index file being created, or
+#     empty if no index is to be created.
+# Globals:
+#   o TCL_MAN_BASEDIR - Base manual directory where all of the man.* and cat.* 
+#     directories live.
+#   o TCL_MAN_SEPARATOR - The name separator between the directory and the
+#     section.
+#------------------------------------------------------------------------------
+
+proc InstallShortMan {sourceFile section indexFileHdl} {
+    global TCL_MAN_BASEDIR TCL_MAN_SEPARATOR
+
+    set manNames [GetManNames $sourceFile]
+    if [lempty $manNames] {
+        set baseName [file tail [file root $sourceFile]]
+        puts stderr "Warning: can't parse NAME line for man page: $sourceFile."
+        puts stderr "         Manual page only available as: $baseName"
+    }
+
+    set manFileBase [file tail [file root $sourceFile]]
+    set manFileName "$manFileBase.$section"
+
+    set destManDir "$TCL_MAN_BASEDIR/man$TCL_MAN_SEPARATOR$section"
+    set destCatDir "$TCL_MAN_BASEDIR/cat$TCL_MAN_SEPARATOR$section"
+
+    CopyManPage $sourceFile "$destManDir/$manFileName"
+    unlink -nocomplain  "$destCatDir/$manFileName"
+
+    if {![lempty $indexFileHdl]} {
+        foreach name $manNames {
+            puts $indexFileHdl "$name\t$manFileBase\t$section"
+        }
+    }    
+}
+
+#------------------------------------------------------------------------------
+# InstallLongMan --
+#   Install a manual page on a system that does have long file names.
+#
+# Parameters:
+#   o sourceFile - Manual page source file path.
+#   o section - Section to install the manual page in.
+# Globals:
+#   o TCL_MAN_BASEDIR - Base manual directory where all of the man.* and cat.* 
+#     directories live.
+#   o TCL_MAN_SEPARATOR - The name separator between the directory and the
+#     section.
+#------------------------------------------------------------------------------
+
+proc InstallLongMan {sourceFile section} {
+    global TCL_MAN_BASEDIR TCL_MAN_SEPARATOR
+
+    set manNames [GetManNames $sourceFile]
+    if [lempty $manNames] {
+        set baseName [file tail [file root $sourceFile]]
+        puts stderr "Warning: can't parse NAME line for man page: $sourceFile."
+        puts stderr "         Manual page only available as: $baseName"
+        set manNames $baseName
+    }
+
+    set destManDir "$TCL_MAN_BASEDIR/man$TCL_MAN_SEPARATOR$section"
+    set destCatDir "$TCL_MAN_BASEDIR/cat$TCL_MAN_SEPARATOR$section"
+
+    # Copy file to the first name in the list.
+
+    set firstFile [lvarpop manNames]
+    set firstFilePath "$destManDir/$firstFile.$section"
+
+    CopyManPage $sourceFile $firstFilePath
+    unlink -nocomplain   "$destCatDir/$firstFile.$section"
+
+    # Link it to the rest of the names in the list.
+
+    foreach manEntry $manNames {
+        set destFilePath "$destManDir/$manEntry.$section"
+        unlink -nocomplain  $destFilePath
+        if {[catch {
+                link $firstFilePath $destFilePath
+            } msg] != 0} {
+            puts stderr "error from: link $firstFilePath $destFilePath"
+            puts stderr "    $msg"
+        }
+        unlink -nocomplain "$destCatDir/$manEntry.$section"
+    }
+
+}
+
+#------------------------------------------------------------------------------
+# InstallManPage --
+#   Install a manual page on a system.
+#
+# Parameters:
+#   o sourceFile - Manual page source file path.
+#   o section - Section to install the manual page in.
+#   o indexFileHdl - File handle of the current index file being created, or
+#     empty if no index is to be created.
+# Globals
+#   o TCL_MAN_STYLE - SHORT if short manual page names are being used,
+#     LONG if long manual pages are being used.
+#------------------------------------------------------------------------------
+
+proc InstallManPage {sourceFile section indexFileHdl} {
+    global TCL_MAN_STYLE
+
+    if {"$TCL_MAN_STYLE" == "SHORT"} {
+        InstallShortMan $sourceFile $section $indexFileHdl
+    } else {
+        InstallLongMan $sourceFile $section
+    }
+}
+
+#------------------------------------------------------------------------------
+# InstallManPages --
+#   Install the manual pages.
+#------------------------------------------------------------------------------
+
+proc InstallManPages {} {
+    global TCL_UCB_DIR          TCL_TK_SHELL         TCL_TK_DIR
+    global TCL_MAN_BASEDIR      TCL_MAN_SEPARATOR    TCL_MAN_STYLE
+    global TCL_MAN_CMD_SECTION  TCL_MAN_FUNC_SECTION
+    global TK_MAN_CMD_SECTION   TK_MAN_FUNC_SECTION
+
+    if {![info exists TCL_MAN_STYLE]} {
+        set TCL_MAN_STYLE LONG
+    }
+    set TCL_MAN_STYLE [string toupper $TCL_MAN_STYLE]
+    case $TCL_MAN_STYLE in {
+        {SHORT} {}
+        {LONG}  {}
+        default {error "invalid value for TCL_MAN_STYLE: `$TCL_MAN_STYLE'"}
+    }
+
+    MakePath $TCL_MAN_BASEDIR 
+    MakePath "$TCL_MAN_BASEDIR/man$TCL_MAN_SEPARATOR$TCL_MAN_CMD_SECTION"
+    MakePath "$TCL_MAN_BASEDIR/cat$TCL_MAN_SEPARATOR$TCL_MAN_CMD_SECTION"
+    MakePath "$TCL_MAN_BASEDIR/man$TCL_MAN_SEPARATOR$TCL_MAN_FUNC_SECTION"
+    MakePath "$TCL_MAN_BASEDIR/cat$TCL_MAN_SEPARATOR$TCL_MAN_FUNC_SECTION"
+
+    set indexFileHdl [SetUpManIndex]
+
+    # Install all of the actual files.
+
+    echo "    Installing Tcl [info tclversion] man files"
+    foreach fileName [glob $TCL_UCB_DIR/doc/*.man] {
+        if {[file root $fileName] == "Tcl.man"} {
+            set section $TCL_MAN_CMD_SECTION
+        } else {
+            set section $TCL_MAN_FUNC_SECTION
+        }
+        InstallManPage $fileName $section $indexFileHdl
+    }
+
+    echo "    Installing Extended Tcl [infox version] man files"
+
+    foreach fileName [glob man/*.man] {
+        if {[file root $fileName] == "TclX.man"} {
+            set section $TCL_MAN_CMD_SECTION
+        } else {
+            set section $TCL_MAN_FUNC_SECTION
+        }
+        InstallManPage $fileName $section $indexFileHdl
+    }
+
+    if {![info exists TCL_TK_SHELL]} {
+        FinishUpManIndex $indexFileHdl
+        return
+    }
+
+    MakePath "$TCL_MAN_BASEDIR/man$TCL_MAN_SEPARATOR$TK_MAN_CMD_SECTION"
+    MakePath "$TCL_MAN_BASEDIR/cat$TCL_MAN_SEPARATOR$TK_MAN_CMD_SECTION"
+    MakePath "$TCL_MAN_BASEDIR/man$TCL_MAN_SEPARATOR$TK_MAN_FUNC_SECTION"
+    MakePath "$TCL_MAN_BASEDIR/cat$TCL_MAN_SEPARATOR$TK_MAN_FUNC_SECTION"
+
+    echo "    Installing Tk man files"
+
+    foreach fileName [glob $TCL_TK_DIR/doc/*.man] {
+        if {![string match "Tk_*" [file root $fileName]]} {
+            set section $TK_MAN_CMD_SECTION
+        } else {
+            set section $TK_MAN_FUNC_SECTION
+        }
+        InstallManPage $fileName $section $indexFileHdl
+    }
+
+    FinishUpManIndex $indexFileHdl
+
+} ;# InstallLongManPages
+
+#------------------------------------------------------------------------------
+# Main program code.
+#------------------------------------------------------------------------------
+
+echo ""
+echo ">>> Installing Extended Tcl [infox version] <<<"
+
+set argc [llength $argv]
+if {$argc != 0} {
+    puts stderr "usage: tcl installTcl.tcl"
+    exit 1
+}
+
+#
+# Bring in all of the macros defined bu the configuration file.
+#
+ParseConfigFile Config.mk
+ParseConfigFile config/$TCL_CONFIG_FILE
+
+#
+# Make sure all directories exists that we will be installing in.
+#
+
+MakePath [list $TCL_TCLDIR [file dirname $TCL_DEFAULT] $TCL_BINDIR]
+MakePath [list $TCL_LIBDIR $TCL_INCLUDEDIR $TCL_TCLDIR]
+
+echo "    Creating default file: $TCL_DEFAULT[infox version]"
+GenDefaultFile $TCL_DEFAULT $TCL_TCLDIR
+
+echo "    Installing `tcl' program in: $TCL_BINDIR"
+CopyFile tcl $TCL_BINDIR
+chmod +rx $TCL_BINDIR/tcl
+
+echo "    Installing `libtcl.a' library in: $TCL_LIBDIR"
+CopyFile libtcl.a $TCL_LIBDIR
+
+echo "    Installing Tcl .h files in: $TCL_INCLUDEDIR"
+CopyFile $TCL_UCB_DIR/tcl.h $TCL_INCLUDEDIR
+CopyFile $TCL_UCB_DIR/tclHash.h $TCL_INCLUDEDIR
+CopyFile src/tclExtend.h $TCL_INCLUDEDIR
+CopyFile src/tcl++.h $TCL_INCLUDEDIR
+
+echo "    Installing Tcl run-time files in: $TCL_TCLDIR"
+foreach srcFile [glob tcllib/*] {
+    if {![file isdirectory $srcFile]} {
+        CopyFile $srcFile $TCL_TCLDIR
+    }
+}
+
+echo "    Installing Tcl help files in: $TCL_TCLDIR/help"
+if [file exists $TCL_TCLDIR/help] {
+     echo "       Purging old help tree"
+     exec rm -rf $TCL_TCLDIR/help
+}
+CopyDir tcllib/help          $TCL_TCLDIR/help
+
+if [info exists TCL_TK_SHELL] {
+    echo "    Installing `wish' program in: $TCL_BINDIR"
+    CopyFile wish $TCL_BINDIR
+    chmod +rx $TCL_BINDIR/wish
+
+    echo "    Installing `libtk.a' library in: $TCL_LIBDIR"
+    CopyFile libtk.a $TCL_LIBDIR
+
+    echo "    Installing `tk.h' in: $TCL_INCLUDEDIR"
+    CopyFile $TCL_TK_DIR/tk.h $TCL_INCLUDEDIR
+}
+
+foreach file [glob $TCL_TCLDIR/*.tlib] {
+    buildpackageindex $file
+}
+
+if {$TCL_MAN_INSTALL} {
+    InstallManPages
+}
+
+echo "     *** TCL IS NOW INSTALLED ***"
+
diff --git a/src/tclx/tclsrc/makefile b/src/tclx/tclsrc/makefile
new file mode 100644 (file)
index 0000000..cd39e6c
--- /dev/null
@@ -0,0 +1,51 @@
+#
+# Makefile --
+#
+# Makefile for Extended Tcl package library.
+# 
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: Makefile,v 2.0 1992/10/16 04:51:50 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+include ../config.mk
+include ../config/$(TCL_CONFIG_FILE)
+SHELL=/bin/sh
+
+#------------------------------------------------------------------------------
+
+TCL.TLIB=../tcllib/tcl.tlb
+TCL.TNDX=../tcllib/tcl.tdx
+
+#------------------------------------------------------------------------------
+
+TCL_SRCS=array.tcl assign.tcl edprocs.tcl forfile.tcl  \
+       forrec.tcl globrec.tcl help.tcl packages.tcl \
+       pushd.tcl setfuncs.tcl showproc.tcl strfile.tcl \
+       compat.tcl convlib.tcl profrep.tcl
+
+#------------------------------------------------------------------------------
+
+all: made.tmp
+
+made.tmp: $(TCL.TLIB)
+       touch made.tmp
+
+$(TCL.TLIB): $(TCL_SRCS)
+        cat $(TCL_SRCS) | egrep -v '^#$$|^#  *|^#-|^#=|^  *#' > $@
+
+#------------------------------------------------------------------------------
+
+clean:
+       touch junk~
+       -rm -f *~ made.tmp $(TCL.TLIB) $(TCL.TNDX)
+
diff --git a/src/tclx/tclsrc/packages.tcl b/src/tclx/tclsrc/packages.tcl
new file mode 100644 (file)
index 0000000..59f90d6
--- /dev/null
@@ -0,0 +1,55 @@
+#
+# packages.tcl --
+#
+# Command to retrieve a list of packages or information about the packages.
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: packages.tcl,v 2.0 1992/10/16 04:52:02 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-packages packages autoprocs
+
+proc packages {{option {}}} {
+    global TCLENV
+    set packList {}
+    foreach key [array names TCLENV] {
+        if {[string match "PKG:*" $key]} {
+            lappend packList [string range $key 4 end]
+        }
+    }
+    if [lempty $option] {
+        return $packList
+    } else {
+        if {$option != "-location"} {
+            error "Unknow option \"$option\", expected \"-location\""
+        }
+        set locList {}
+        foreach pack $packList {
+            set fileId [lindex $TCLENV(PKG:$pack) 0]
+            
+            lappend locList [list $pack [concat $TCLENV($fileId) \
+                                             [lrange $TCLENV(PKG:$pack) 1 2]]]
+        }
+        return $locList
+    }
+}
+
+proc autoprocs {} {
+    global TCLENV
+    set procList {}
+    foreach key [array names TCLENV] {
+        if {[string match "PROC:*" $key]} {
+            lappend procList [string range $key 5 end]
+        }
+    }
+    return $procList
+}
diff --git a/src/tclx/tclsrc/profrep.tcl b/src/tclx/tclsrc/profrep.tcl
new file mode 100644 (file)
index 0000000..fbda777
--- /dev/null
@@ -0,0 +1,142 @@
+#
+# profrep  --
+#
+# Generate Tcl profiling reports.
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: profrep.tcl,v 2.0 1992/10/16 04:52:05 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-profrep profrep
+
+#
+# Summarize the data from the profile command to the specified significant
+# stack depth.  Returns the maximum number of characters of any significant
+# stack.  (useful in columnizing reports).
+#
+proc profrep:summarize {profDataVar stackDepth sumProfDataVar} {
+    upvar $profDataVar profData $sumProfDataVar sumProfData
+
+    if {(![info exists profData]) || ([catch {array size profData}] != 0)} {
+        error "`profDataVar' must be the name of an array returned by the `profile off' command"
+    }
+    set maxNameLen 0
+    foreach procStack [array names profData] {
+        if {[llength $procStack] < $stackDepth} {
+            set sigProcStack $procStack
+        } else {
+            set sigProcStack [lrange $procStack 0 [expr {$stackDepth - 1}]]
+        }
+        set maxNameLen [max $maxNameLen [clength $sigProcStack]]
+        if [info exists sumProfData($sigProcStack)] {
+            set cur $sumProfData($sigProcStack)
+            set add $profData($procStack)
+            set     new [expr [lindex $cur 0]+[lindex $add 0]]
+            lappend new [expr [lindex $cur 1]+[lindex $add 1]]
+            lappend new [expr [lindex $cur 2]+[lindex $add 2]]
+            set $sumProfData($sigProcStack) $new
+        } else {
+            set sumProfData($sigProcStack) $profData($procStack)
+        }
+    }
+    return $maxNameLen
+}
+
+#
+# Generate a list, sorted in descending order by the specified key, contain
+# the indices into the summarized data.
+#
+proc profrep:sort {sumProfDataVar sortKey} {
+    upvar $sumProfDataVar sumProfData
+
+    case $sortKey {
+        {calls} {set keyIndex 0}
+        {real}  {set keyIndex 1}
+        {cpu}   {set keyIndex 2}
+        default {
+            error "Expected a sort of: `calls',  `cpu' or ` real'"}
+    }
+
+    # Build a list to sort cosisting of a fix-length string containing the
+    # key value and proc stack. Then sort it.
+
+    foreach procStack [array names sumProfData] {
+        set key [format "%016d" [lindex $sumProfData($procStack) $keyIndex]]
+        lappend keyProcList [list $key $procStack]
+    }
+    set keyProcList [lsort $keyProcList]
+
+    # Convert the assending sorted list into a descending list of proc stacks.
+
+    for {set idx [expr [llength $keyProcList]-1]} {$idx >= 0} {incr idx -1} {
+        lappend sortedProcList [lindex [lindex $keyProcList $idx] 1]
+    }
+    return $sortedProcList
+}
+
+#
+# Print the sorted report
+#
+
+proc profrep:print {sumProfDataVar sortedProcList maxNameLen outFile
+                    userTitle} {
+    upvar $sumProfDataVar sumProfData
+    
+    if {$outFile == ""} {
+        set outFH stdout
+    } else {
+        set outFH [open $outFile w]
+    }
+
+    # Output a header.
+
+    set stackTitle "Procedure Call Stack"
+    set maxNameLen [max $maxNameLen [clength $stackTitle]]
+    set hdr [format "%-${maxNameLen}s %10s %10s %10s" $stackTitle \
+                    "Calls" "Real Time" "CPU Time"]
+    if {$userTitle != ""} {
+        puts $outFH [replicate - [clength $hdr]]
+        puts $outFH $userTitle
+    }
+    puts $outFH [replicate - [clength $hdr]]
+    puts $outFH $hdr
+    puts $outFH [replicate - [clength $hdr]]
+
+    # Output the data in sorted order.
+
+    foreach procStack $sortedProcList {
+        set data $sumProfData($procStack)
+        puts $outFH [format "%-${maxNameLen}s %10d %10d %10d" $procStack \
+                            [lindex $data 0] [lindex $data 1] [lindex $data 2]]
+    }
+    if {$outFile != ""} {
+        close $outFH
+    }
+}
+
+#------------------------------------------------------------------------------
+# Generate a report from data collect from the profile command.
+#   o profDataVar (I) - The name of the array containing the data from profile.
+#   o sortKey (I) - Value to sort by. One of "calls", "cpu" or "real".
+#   o stackDepth (I) - The stack depth to consider significant.
+#   o outFile (I) - Name of file to write the report to.  If omitted, stdout
+#     is assumed.
+#   o userTitle (I) - Title line to add to output.
+
+proc profrep {profDataVar sortKey stackDepth {outFile {}} {userTitle {}}} {
+    upvar $profDataVar profData
+
+    set maxNameLen [profrep:summarize profData $stackDepth sumProfData]
+    set sortedProcList [profrep:sort sumProfData $sortKey]
+    profrep:print sumProfData $sortedProcList $maxNameLen $outFile $userTitle
+
+}
diff --git a/src/tclx/tclsrc/pushd.tcl b/src/tclx/tclsrc/pushd.tcl
new file mode 100644 (file)
index 0000000..b9d50a9
--- /dev/null
@@ -0,0 +1,53 @@
+#
+# pushd.tcl --
+#
+# C-shell style directory stack procs.
+#
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: pushd.tcl,v 2.0 1992/10/16 04:52:06 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-directory_stack pushd popd dirs
+
+global TCLENV(dirPushList)
+
+set TCLENV(dirPushList) ""
+
+proc pushd {args} {
+    global TCLENV
+
+    if {[llength $args] > 1} {
+        error "bad # args: pushd [dir_to_cd_to]"
+    }
+    set TCLENV(dirPushList) [linsert $TCLENV(dirPushList) 0 [pwd]]
+
+    if {[llength $args] != 0} {
+        cd [glob $args]
+    }
+}
+
+proc popd {} {
+    global TCLENV
+
+    if [llength $TCLENV(dirPushList)] {
+        cd [lvarpop TCLENV(dirPushList)]
+        pwd
+    } else {
+        error "directory stack empty"
+    }
+}
+
+proc dirs {} { 
+    global TCLENV
+    echo [pwd] $TCLENV(dirPushList)
+}
diff --git a/src/tclx/tclsrc/setfuncs.tcl b/src/tclx/tclsrc/setfuncs.tcl
new file mode 100644 (file)
index 0000000..a85d908
--- /dev/null
@@ -0,0 +1,127 @@
+#
+# setfuncs --
+#
+# Perform set functions on lists.  Also has a procedure for removing duplicate
+# list entries.
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: setfuncs.tcl,v 2.0 1992/10/16 04:52:10 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-set_functions union intersect intersect3 lrmdups
+
+#
+# return the logical union of two lists, removing any duplicates
+#
+proc union {lista listb} {
+    set full_list [lsort [concat $lista $listb]]
+    set check_element [lindex $full_list 0]
+    set outlist $check_element
+    foreach element [lrange $full_list 1 end] {
+       if {$check_element == $element} continue
+       lappend outlist $element
+       set check_element $element
+    }
+    return $outlist
+}
+
+#
+# sort a list, returning the sorted version minus any duplicates
+#
+proc lrmdups {list} {
+    set list [lsort $list]
+    set result [lvarpop list]
+    lappend last $result
+    foreach element $list {
+       if {$last != $element} {
+           lappend result $element
+           set last $element
+       }
+    }
+    return $result
+}
+
+#
+# intersect3 - perform the intersecting of two lists, returning a list
+# containing three lists.  The first list is everything in the first
+# list that wasn't in the second, the second list contains the intersection
+# of the two lists, the third list contains everything in the second list
+# that wasn't in the first.
+#
+
+proc intersect3 {list1 list2} {
+    set list1Result ""
+    set list2Result ""
+    set intersectList ""
+
+    set list1 [lrmdups $list1]
+    set list2 [lrmdups $list2]
+
+    while {1} {
+        if [lempty $list1] {
+            if ![lempty $list2] {
+                set list2Result [concat $list2Result $list2]
+            }
+            break
+        }
+        if [lempty $list2] {
+           set list1Result [concat $list1Result $list1]
+            break
+        }
+        set compareResult [string compare [lindex $list1 0] [lindex $list2 0]]
+
+        if {$compareResult < 0} {
+            lappend list1Result [lvarpop list1]
+            continue
+        }
+        if {$compareResult > 0} {
+            lappend list2Result [lvarpop list2]
+            continue
+        }
+        lappend intersectList [lvarpop list1]
+        lvarpop list2
+    }
+    return [list $list1Result $intersectList $list2Result]
+}
+
+#
+# intersect - perform an intersection of two lists, returning a list
+# containing every element that was present in both lists
+#
+proc intersect {list1 list2} {
+    set intersectList ""
+
+    set list1 [lsort $list1]
+    set list2 [lsort $list2]
+
+    while {1} {
+        if {[lempty $list1] || [lempty $list2]} break
+
+        set compareResult [string compare [lindex $list1 0] [lindex $list2 0]]
+
+        if {$compareResult < 0} {
+            lvarpop list1
+            continue
+        }
+
+        if {$compareResult > 0} {
+            lvarpop list2
+            continue
+        }
+
+        lappend intersectList [lvarpop list1]
+        lvarpop list2
+    }
+    return $intersectList
+}
+
+
diff --git a/src/tclx/tclsrc/showproc.tcl b/src/tclx/tclsrc/showproc.tcl
new file mode 100644 (file)
index 0000000..33e9c85
--- /dev/null
@@ -0,0 +1,45 @@
+#
+# showprocs.tcl --
+#
+# Display procedure headers and bodies.
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: showprocs.tcl,v 2.0 1992/10/16 04:52:11 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-show_procedures showproc showprocs
+
+proc showproc {procname} {
+    if [lempty [info procs $procname]] {demand_load $procname}
+       set arglist [info args $procname]
+       set nargs {}
+       while {[llength $arglist] > 0} {
+           set varg [lvarpop arglist 0]
+           if [info default $procname $varg defarg] {
+               lappend nargs [list $varg $defarg]
+           } else {
+               lappend nargs $varg
+           }
+    }
+    format "proc %s \{%s\} \{%s\}\n" $procname $nargs [info body $procname]
+}
+
+proc showprocs {args} {
+    if [lempty $args] { set args [info procs] }
+    set out ""
+
+    foreach i $args {
+       foreach j $i { append out [showproc $j] "\n"}
+    }
+    return $out
+}
+
diff --git a/src/tclx/tclsrc/strfile.tcl b/src/tclx/tclsrc/strfile.tcl
new file mode 100644 (file)
index 0000000..d255729
--- /dev/null
@@ -0,0 +1,39 @@
+#
+# string_file --
+#
+# Functions to read and write strings from a file that has not been opened.
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: stringfile.tcl,v 2.0 1992/10/16 04:52:13 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+#@package: TclX-stringfile_functions read_file write_file
+
+proc read_file {fileName {numBytes {}}} {
+    set fp [open $fileName]
+    if {$numBytes != ""} {
+        set result [read $fp $numBytes]
+    } else {
+        set result [read $fp]
+    }
+    close $fp
+    return $result
+} 
+
+proc write_file {fileName args} {
+    set fp [open $fileName w]
+    foreach string $args {
+        puts $fp $string
+    }
+    close $fp
+}
+
diff --git a/src/tclx/tksrc/makefile b/src/tclx/tksrc/makefile
new file mode 100644 (file)
index 0000000..98f4289
--- /dev/null
@@ -0,0 +1,44 @@
+#
+# Makefile --
+#
+# Makefile for to build Extended wish.
+# 
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: Makefile,v 2.0 1992/10/16 04:54:30 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+include ../config.mk
+include ../config/$(TCL_CONFIG_FILE)
+SHELL=/bin/sh
+
+#------------------------------------------------------------------------------
+
+CFLAGS= $(OPTIMIZE_FLAG) $(XCFLAGS) -I$(TCL_UCB_DIR) $(MEM_DEBUG_FLAGS)
+
+#------------------------------------------------------------------------------
+
+all: ../wish
+
+../wish: ../libtk.a ../libtcl.a
+       $(RANLIB_CMD) ../libtk.a
+       $(CC) $(CFLAGS) ../tkucbsrc/main.o ../libtk.a ../libtcl.a \
+             $(XLDFLAGS) $(XPM_LIBS) $(TCL_TK_LIBS) -o ../wish
+       if $(DO_STRIPPING) ; then \
+           strip ../wish; \
+           $(MCS_CMD) ../wish; fi
+
+#------------------------------------------------------------------------------
+
+clean:
+       touch junk~
+       -rm -f *~ ../wish
diff --git a/src/tclx/tkucbsrc/main.dif b/src/tclx/tkucbsrc/main.dif
new file mode 100644 (file)
index 0000000..180a61f
--- /dev/null
@@ -0,0 +1,121 @@
+*** ../../tk2.3/main.c Wed Aug 19 08:10:32 1992
+--- main.c     Tue Oct  6 17:27:56 1992
+***************
+*** 19,24
+  
+  #include "tkConfig.h"
+  #include "tkInt.h"
+  
+  /*
+   * Declarations for library procedures:
+
+--- 19,29 -----
+  
+  #include "tkConfig.h"
+  #include "tkInt.h"
++ #define TK_EXTENDED
++ #ifdef TK_EXTENDED
++ #    include "tclExtend.h"
++      Tcl_Interp *tk_mainInterp;  /* Need to process signals */
++ #endif
+  
+  /*
+   * Declarations for library procedures:
+***************
+*** 30,35
+   * Command used to initialize wish:
+   */
+  
+  char initCmd[] = "source $tk_library/wish.tcl";
+  
+  Tk_Window w;                 /* NULL means window has been deleted. */
+
+--- 35,43 -----
+   * Command used to initialize wish:
+   */
+  
++ #ifdef TK_EXTENDED
++ char initCmd[] = "load wishx.tcl";
++ #else
+  char initCmd[] = "source $tk_library/wish.tcl";
+  #endif
+  
+***************
+*** 31,36
+   */
+  
+  char initCmd[] = "source $tk_library/wish.tcl";
+  
+  Tk_Window w;                 /* NULL means window has been deleted. */
+  Tk_TimerToken timeToken = 0;
+
+--- 39,45 -----
+  char initCmd[] = "load wishx.tcl";
+  #else
+  char initCmd[] = "source $tk_library/wish.tcl";
++ #endif
+  
+  Tk_Window w;                 /* NULL means window has been deleted. */
+  Tk_TimerToken timeToken = 0;
+***************
+*** 219,224
+      int result;
+      Tk_3DBorder border;
+  
+      interp = Tcl_CreateInterp();
+  #ifdef TCL_MEM_DEBUG
+      Tcl_InitMemory(interp);
+
+--- 228,236 -----
+      int result;
+      Tk_3DBorder border;
+  
++ #ifdef TK_EXTENDED
++     tk_mainInterp = interp = Tcl_CreateExtendedInterp();
++ #else
+      interp = Tcl_CreateInterp();
+  #endif
+  #ifdef TCL_MEM_DEBUG
+***************
+*** 220,225
+      Tk_3DBorder border;
+  
+      interp = Tcl_CreateInterp();
+  #ifdef TCL_MEM_DEBUG
+      Tcl_InitMemory(interp);
+  #endif
+
+--- 232,238 -----
+      tk_mainInterp = interp = Tcl_CreateExtendedInterp();
+  #else
+      interp = Tcl_CreateInterp();
++ #endif
+  #ifdef TCL_MEM_DEBUG
+      Tcl_InitMemory(interp);
+  #endif
+***************
+*** 284,289
+      if (geometry != NULL) {
+       Tcl_SetVar(interp, "geometry", geometry, TCL_GLOBAL_ONLY);
+      }
+      result = Tcl_Eval(interp, initCmd, 0, (char **) NULL);
+      if (result != TCL_OK) {
+       goto error;
+
+--- 297,312 -----
+      if (geometry != NULL) {
+       Tcl_SetVar(interp, "geometry", geometry, TCL_GLOBAL_ONLY);
+      }
++ #ifdef TK_EXTENDED
++     tclAppName     = "Wish";
++     tclAppLongname = "Wish - Tk Shell";
++     tclAppVersion  = TK_VERSION;
++     Tcl_ShellEnvInit (interp, TCLSH_ABORT_STARTUP_ERR,
++                       name,
++                       0, NULL,           /* argv var already set  */
++                       fileName == NULL,  /* interactive?          */
++                       NULL);             /* Standard default file */
++ #endif
+      result = Tcl_Eval(interp, initCmd, 0, (char **) NULL);
+      if (result != TCL_OK) {
+       goto error;
diff --git a/src/tclx/tkucbsrc/main.sed b/src/tclx/tkucbsrc/main.sed
new file mode 100644 (file)
index 0000000..275e965
--- /dev/null
@@ -0,0 +1,32 @@
+/#include "tkint.h"/a\
+#define TK_EXTENDED\
+#ifdef TK_EXTENDED\
+#    include "tclxtend.h"\
+     Tcl_Interp *tk_mainInterp;  /* Need to process signals */\
+#endif
+
+/^char initCmd/c\
+#ifdef TK_EXTENDED\
+char initCmd[] = "load wishx.tcl";\
+#else\
+char initCmd[] = "source $tk_library/wish.tcl";\
+#endif
+
+/    interp = Tcl_CreateInterp();/c\
+#ifdef TK_EXTENDED\
+    tk_mainInterp = interp = Tcl_CreateExtendedInterp();\
+#else\
+    interp = Tcl_CreateInterp();\
+#endif
+
+/result = Tcl_Eval(interp, initCmd/i\
+#ifdef TK_EXTENDED\
+    tclAppName     = "Wish";\
+    tclAppLongname = "Wish - Tk Shell";\
+    tclAppVersion  = TK_VERSION;\
+    Tcl_ShellEnvInit (interp, TCLSH_ABORT_STARTUP_ERR,\
+                      name,\
+                      0, NULL,           /* argv var already set  */\
+                      fileName == NULL,  /* interactive?          */\
+                      NULL);             /* Standard default file */\
+#endif
diff --git a/src/tclx/tkucbsrc/makefile b/src/tclx/tkucbsrc/makefile
new file mode 100644 (file)
index 0000000..47f45f9
--- /dev/null
@@ -0,0 +1,86 @@
+#
+# Makefile --
+#
+# Makefile for building special version of tk source to support Extended Tcl.
+#
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: Makefile,v 2.0 1992/10/16 04:54:52 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+include ../config.mk
+include ../config/$(TCL_CONFIG_FILE)
+SHELL=/bin/sh
+
+#------------------------------------------------------------------------------
+
+CFLAGS= $(OPTIMIZE_FLAG) $(XCFLAGS) -I../src -I../$(TCL_TK_DIR) \
+        -I../$(TCL_UCB_DIR) -I$(XHOME)/include \
+       $(MEM_DEBUG_FLAGS) $(SYS_DEP_FLAGS) \
+        -DTK_VERSION=\"2.2/\"
+
+#------------------------------------------------------------------------------
+#
+# Targets to build:
+
+LIBOBJS   = tkevent.o
+OBJS      = main.o $(LIBOBJS)
+WISHX_TCL = ../tcllib/wishx.tcl
+TK_TCL    = ../tcllib/tk.tcl
+TK_TLIB   = ../tcllib/tk.tlib
+
+#------------------------------------------------------------------------------
+#
+# Original UCB Sources to build them from:
+
+MAIN_SRC  = ../$(TCL_TK_DIR)/main.c
+EVENT_SRC = ../$(TCL_TK_DIR)/tkevent.c
+WISHX_SRC = ../$(TCL_TK_DIR)/library/wish.tcl
+TK_TCL_SRC= ../$(TCL_TK_DIR)/library/tk.tcl
+
+#------------------------------------------------------------------------------
+
+#all: made.tmp $(WISHX_TCL) $(TK_TLIB) $(TK_TCL)
+all: made.tmp $(WISHX_TCL) $(TK_TCL)
+
+made.tmp: $(OBJS)
+       -$(AR) d ../libtk.a $(LIBOBJS)
+       $(AR) cr ../libtk.a $(LIBOBJS)
+       touch made.tmp
+
+main.c: $(MAIN_SRC) main.sed
+       rm -f main.c
+       sed -f main.sed <$(MAIN_SRC) >main.c
+
+tkevent.c: $(EVENT_SRC) tkevent.sed
+       rm -f tkevent.c
+       sed -f tkevent.sed <$(EVENT_SRC) >tkevent.c
+
+$(WISHX_TCL): $(WISHX_SRC) wishx.sed
+       rm -f $(WISHX_TCL)
+       sed -f wishx.sed <$(WISHX_SRC) >$(WISHX_TCL)
+
+$(TK_TCL): $(TK_TCL_SRC)
+       rm -f $(TK_TCL)
+       cp $(TK_TCL_SRC) $(TK_TCL)
+
+$(TK_TLIB): ../$(TCL_TK_DIR)/library/tclindex
+       TCLDEFAULT=../tcldef;export TCLDEFAULT ;\
+       ../tcl "-c convert_lib ../$(TCL_TK_DIR)/library/tclindex $(TK_TLIB)"
+
+#------------------------------------------------------------------------------
+
+clean:
+       touch junk~
+       rm -f *~ $(OBJS) made.tmp
+       rm -f tkevent.c main.c
+       rm -f $(WISHX_TCL) $(TK_TCL) $(TK_TLIB) ../tcllib/tk.tdx
diff --git a/src/tclx/tkucbsrc/tkevent.dif b/src/tclx/tkucbsrc/tkevent.dif
new file mode 100644 (file)
index 0000000..f2efa9d
--- /dev/null
@@ -0,0 +1,57 @@
+*** ../../tk2.3/tkEvent.c      Fri Aug 21 16:16:16 1992
+--- tkEvent.c  Tue Oct  6 17:28:21 1992
+***************
+*** 23,28
+  #include "tkInt.h"
+  #include <errno.h>
+  #include <signal.h>
+  
+  /*
+   * For each timer callback that's pending, there is one record
+
+--- 23,29 -----
+  #include "tkInt.h"
+  #include <errno.h>
+  #include <signal.h>
++ extern Tcl_Interp *tk_mainInterp;
+  
+  /*
+   * For each timer callback that's pending, there is one record
+***************
+*** 1321,1326
+           memcpy((VOID *) ready, (VOID *) masks, 3*MASK_SIZE*sizeof(int));
+           timeout.tv_sec = timeout.tv_usec = 0;
+           do {
+               numFound = select(numFds, (SELECT_MASK *) readPtr,
+                       (SELECT_MASK *) writePtr, (SELECT_MASK *) exceptPtr,
+                   &timeout);
+
+--- 1322,1330 -----
+           memcpy((VOID *) ready, (VOID *) masks, 3*MASK_SIZE*sizeof(int));
+           timeout.tv_sec = timeout.tv_usec = 0;
+           do {
++      if (Tcl_CheckForSignal (tk_mainInterp, TCL_OK) == TCL_ERROR)
++          TkBindError(tk_mainInterp);
++ 
+               numFound = select(numFds, (SELECT_MASK *) readPtr,
+                       (SELECT_MASK *) writePtr, (SELECT_MASK *) exceptPtr,
+                   &timeout);
+***************
+*** 1384,1389
+      }
+      memcpy((VOID *) ready, (VOID *) masks, 3*MASK_SIZE*sizeof(int));
+      do {
+       numFound = select(numFds, (SELECT_MASK *) readPtr,
+               (SELECT_MASK *) writePtr, (SELECT_MASK *) exceptPtr,
+               timeoutPtr);
+
+--- 1388,1396 -----
+      }
+      memcpy((VOID *) ready, (VOID *) masks, 3*MASK_SIZE*sizeof(int));
+      do {
++      if (Tcl_CheckForSignal (tk_mainInterp, TCL_OK) == TCL_ERROR)
++          TkBindError(tk_mainInterp);
++ 
+       numFound = select(numFds, (SELECT_MASK *) readPtr,
+               (SELECT_MASK *) writePtr, (SELECT_MASK *) exceptPtr,
+               timeoutPtr);
diff --git a/src/tclx/tkucbsrc/tkevent.sed b/src/tclx/tkucbsrc/tkevent.sed
new file mode 100644 (file)
index 0000000..529eccf
--- /dev/null
@@ -0,0 +1,9 @@
+/#include <signal.h>/a\
+extern Tcl_Interp *tk_mainInterp;
+
+/numFound = select(numFds/i\
+       if (Tcl_CheckForSignal (tk_mainInterp, TCL_OK) == TCL_ERROR)\
+           TkBindError(tk_mainInterp);\
+
+
+
diff --git a/src/tclx/tkucbsrc/wishx.sed b/src/tclx/tkucbsrc/wishx.sed
new file mode 100644 (file)
index 0000000..e135780
--- /dev/null
@@ -0,0 +1,3 @@
+/source.*init\.tcl/d
+/source.*tk_library/c\
+load tk.tcl
diff --git a/src/tclx/ucbsrc/makefile b/src/tclx/ucbsrc/makefile
new file mode 100644 (file)
index 0000000..5e79621
--- /dev/null
@@ -0,0 +1,56 @@
+#
+# Makefile --
+#
+# Makefile for Extended Tcl updates to the standard UCB Tcl.
+# 
+#------------------------------------------------------------------------------
+# Copyright 1992 Karl Lehenbauer and Mark Diekhans.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted, provided
+# that the above copyright notice appear in all copies.  Karl Lehenbauer and
+# Mark Diekhans make no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without express or
+# implied warranty.
+#------------------------------------------------------------------------------
+# $Id: Makefile,v 2.0 1992/10/16 04:51:44 markd Rel $
+#------------------------------------------------------------------------------
+#
+
+
+include ../config.mk
+include ../config/$(TCL_CONFIG_FILE)
+SHELL=/bin/sh
+
+#------------------------------------------------------------------------------
+
+CFLAGS=$(OPTIMIZE_FLAG) $(XCFLAGS) -I../$(TCL_UCB_DIR) $(MEM_DEBUG_FLAGS) \
+  $(SYS_DEP_FLAGS)
+
+#------------------------------------------------------------------------------
+
+OBJS=tclbasic.o tclexpr.o
+
+#------------------------------------------------------------------------------
+
+all: made.tmp
+
+made.tmp: $(OBJS)
+       -$(AR) d  ../libtcl.a $(OBJS)
+       $(AR)  cr ../libtcl.a $(OBJS)
+       touch made.tmp
+
+tclbasic.c: ../$(TCL_UCB_DIR)/tclbasic.c
+       rm -f tclbasic.c
+       sed -f tclbasic.sed <../$(TCL_UCB_DIR)/tclbasic.c >tclbasic.c
+
+tclexpr.c: ../$(TCL_UCB_DIR)/tclexpr.c
+       rm -f tclexpr.c
+       sed -f tclexpr.sed <../$(TCL_UCB_DIR)/tclexpr.c >tclexpr.c
+
+#------------------------------------------------------------------------------
+
+clean:
+       touch junk~
+       -rm -f *~ made.tmp tclbasic.c tclexpr.c
+       -rm -f $(OBJS)
diff --git a/src/tclx/ucbsrc/tclbasic.dif b/src/tclx/ucbsrc/tclbasic.dif
new file mode 100644 (file)
index 0000000..480ba28
--- /dev/null
@@ -0,0 +1,22 @@
+*** ../../tcl6.4/tclBasic.c    Sun Jun 21 14:09:46 1992
+--- tclBasic.c Tue Oct  6 17:19:52 1992
+***************
+*** 705,710
+       iPtr->result = iPtr->resultSpace;
+       iPtr->resultSpace[0] = 0;
+       result = (*cmdPtr->proc)(cmdPtr->clientData, interp, argc, argv);
+       if (result != TCL_OK) {
+           break;
+       }
+
+--- 705,714 -----
+       iPtr->result = iPtr->resultSpace;
+       iPtr->resultSpace[0] = 0;
+       result = (*cmdPtr->proc)(cmdPtr->clientData, interp, argc, argv);
++         /*
++          * Signal handling added for Extended Tcl.
++          */
++         result = Tcl_CheckForSignal (interp, result);
+       if (result != TCL_OK) {
+           break;
+       }
diff --git a/src/tclx/ucbsrc/tclbasic.sed b/src/tclx/ucbsrc/tclbasic.sed
new file mode 100644 (file)
index 0000000..c22bb1c
--- /dev/null
@@ -0,0 +1,5 @@
+/(\*cmdPtr->proc)/a\
+\        /*\
+\         * Signal handling added for Extended Tcl.\
+\         */\
+\        result = Tcl_CheckForSignal (interp, result);
diff --git a/src/tclx/ucbsrc/tclexpr.dif b/src/tclx/ucbsrc/tclexpr.dif
new file mode 100644 (file)
index 0000000..fa8f070
--- /dev/null
@@ -0,0 +1,20 @@
+*** ../../tcl6.4/tclExpr.c     Mon Mar 23 09:54:06 1992
+--- tclExpr.c  Tue Oct  6 17:20:10 1992
+***************
+*** 1318,1324
+       if (value.type == TYPE_INT) {
+           sprintf(interp->result, "%ld", value.intValue);
+       } else if (value.type == TYPE_DOUBLE) {
+!          sprintf(interp->result, "%g", value.doubleValue);
+       } else {
+           if (value.pv.buffer != value.staticSpace) {
+               interp->result = value.pv.buffer;
+
+--- 1318,1324 -----
+       if (value.type == TYPE_INT) {
+           sprintf(interp->result, "%ld", value.intValue);
+       } else if (value.type == TYPE_DOUBLE) {
+!          Tcl_ReturnDouble (interp, value.doubleValue);
+       } else {
+           if (value.pv.buffer != value.staticSpace) {
+               interp->result = value.pv.buffer;
diff --git a/src/tclx/ucbsrc/tclexpr.sed b/src/tclx/ucbsrc/tclexpr.sed
new file mode 100644 (file)
index 0000000..ce0fd86
--- /dev/null
@@ -0,0 +1,2 @@
+/          sprintf(interp->result, "%g", value.doubleValue);/c\
+           Tcl_ReturnDouble (interp, value.doubleValue);
diff --git a/src/tk/bitmaps/gray25 b/src/tk/bitmaps/gray25
new file mode 100644 (file)
index 0000000..ae2000d
--- /dev/null
@@ -0,0 +1,6 @@
+#define gray25_width 16
+#define gray25_height 16
+static unsigned char gray25_bits[] = {
+   0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22,
+   0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88,
+   0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x88, 0x88};
diff --git a/src/tk/bitmaps/gray50 b/src/tk/bitmaps/gray50
new file mode 100644 (file)
index 0000000..1f9fbc0
--- /dev/null
@@ -0,0 +1,6 @@
+#define gray50_width 16
+#define gray50_height 16
+static unsigned char gray50_bits[] = {
+   0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa,
+   0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa,
+   0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa};
diff --git a/src/tk/default.h b/src/tk/default.h
new file mode 100644 (file)
index 0000000..218d2fe
--- /dev/null
@@ -0,0 +1,341 @@
+/*
+ * default.h --
+ *
+ *     This file defines the defaults for all options for all of
+ *     the Tk widgets.
+ *
+ * Copyright 1991-1992 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /user6/ouster/wish/RCS/default.h,v 1.31 92/08/21 11:45:19 ouster Exp $ SPRITE (Berkeley)
+ */
+
+#ifndef _DEFAULT
+#define _DEFAULT
+
+/*
+ * The definitions below provide the absolute values for certain colors.
+ * The values should be the same as in the color database, but hard-coding
+ * them here allows Tk to run smoothly at sites that have an incomplete
+ * or non-standard color database.
+ */
+
+#define BLACK          "Black"
+#define WHITE          "White"
+#define GRAY           "#b0b0b0"
+
+#define BISQUE1                "#ffe4c4"
+#define BISQUE2                "#eed5b7"
+#define BISQUE3                "#cdb79e"
+
+#define LIGHTBLUE2     "#b2dfee"
+
+#define LIGHTPINK1     "#ffaeb9"
+
+#define MAROON         "#b03060"
+
+/*
+ * Defaults for labels, buttons, checkbuttons, and radiobuttons:
+ */
+
+#define DEF_BUTTON_ANCHOR              "center"
+#define DEF_BUTTON_ACTIVE_BG_COLOR     BISQUE2
+#define DEF_BUTTON_ACTIVE_BG_MONO      BLACK
+#define DEF_BUTTON_ACTIVE_FG_COLOR     BLACK
+#define DEF_BUTTON_ACTIVE_FG_MONO      WHITE
+#define DEF_BUTTON_BG_COLOR            BISQUE1
+#define DEF_BUTTON_BG_MONO             WHITE
+#define DEF_BUTTON_BITMAP              ((char *) NULL)
+#define DEF_BUTTON_BORDER_WIDTH                "2"
+#define DEF_BUTTON_CURSOR              ((char *) NULL)
+#define DEF_BUTTON_COMMAND             ((char *) NULL)
+#define DEF_BUTTON_DISABLED_FG_COLOR   GRAY
+#define DEF_BUTTON_DISABLED_FG_MONO    ((char *) NULL)
+#define DEF_BUTTON_FONT                        "-Adobe-Helvetica-Bold-R-Normal-*-120-*"
+#define DEF_BUTTON_FG                  BLACK
+#define DEF_BUTTON_HEIGHT              "0"
+#define DEF_BUTTON_OFF_VALUE           "0"
+#define DEF_BUTTON_ON_VALUE            "1"
+#define DEF_BUTTON_PADX                        "1"
+#define DEF_BUTTON_PADY                        "1"
+#define DEF_BUTTON_RELIEF              "raised"
+#define DEF_LABEL_RELIEF               "flat"
+#define DEF_BUTTON_SELECTOR_COLOR      MAROON
+#define DEF_BUTTON_SELECTOR_MONO       BLACK
+#define DEF_BUTTON_STATE               "normal"
+#define DEF_BUTTON_TEXT                        " "
+#define DEF_BUTTON_TEXT_VARIABLE       ((char *) NULL)
+#define DEF_BUTTON_VALUE               ((char *) NULL)
+#define DEF_BUTTON_WIDTH               "0"
+#define DEF_RADIOBUTTON_VARIABLE       "selectedButton"
+#define DEF_CHECKBUTTON_VARIABLE       ((char *) NULL)
+
+/*
+ * Defaults for canvases:
+ */
+
+#define DEF_CANVAS_BG_COLOR            BISQUE1
+#define DEF_CANVAS_BG_MONO             WHITE
+#define DEF_CANVAS_BORDER_WIDTH                "2"
+#define DEF_CANVAS_CLOSE_ENOUGH                "1"
+#define DEF_CANVAS_CONFINE             "1"
+#define DEF_CANVAS_CURSOR              ((char *) NULL)
+#define DEF_CANVAS_CURSOR_BG           BLACK
+#define DEF_CANVAS_CURSOR_BD_COLOR     "0"
+#define DEF_CANVAS_CURSOR_BD_MONO      "0"
+#define DEF_CANVAS_CURSOR_OFF_TIME     "300"
+#define DEF_CANVAS_CURSOR_ON_TIME      "600"
+#define DEF_CANVAS_CURSOR_WIDTH                "2"
+#define DEF_CANVAS_HEIGHT              "7c"
+#define DEF_CANVAS_RELIEF              "flat"
+#define DEF_CANVAS_SCROLL_INCREMENT    "10"
+#define DEF_CANVAS_SCROLL_REGION       ((char *) NULL)
+#define DEF_CANVAS_SELECT_COLOR                LIGHTBLUE2
+#define DEF_CANVAS_SELECT_MONO         BLACK
+#define DEF_CANVAS_SELECT_BD_COLOR     "1"
+#define DEF_CANVAS_SELECT_BD_MONO      "0"
+#define DEF_CANVAS_SELECT_FG_COLOR     BLACK
+#define DEF_CANVAS_SELECT_FG_MONO      WHITE
+#define DEF_CANVAS_WIDTH               "10c"
+#define DEF_CANVAS_X_SCROLL_CMD                ((char *) NULL)
+#define DEF_CANVAS_Y_SCROLL_CMD                ((char *) NULL)
+
+/*
+ * Defaults for entries:
+ */
+
+#define DEF_ENTRY_BG_COLOR             BISQUE1
+#define DEF_ENTRY_BG_MONO              WHITE
+#define DEF_ENTRY_BORDER_WIDTH         "2"
+#define DEF_ENTRY_CURSOR               "xterm"
+#define DEF_ENTRY_CURSOR_BG            BLACK
+#define DEF_ENTRY_CURSOR_BD_COLOR      "0"
+#define DEF_ENTRY_CURSOR_BD_MONO       "0"
+#define DEF_ENTRY_CURSOR_OFF_TIME      "300"
+#define DEF_ENTRY_CURSOR_ON_TIME       "600"
+#define DEF_ENTRY_CURSOR_WIDTH         "2"
+#define DEF_ENTRY_EXPORT_SELECTION     "yes"
+#define DEF_ENTRY_FONT                 "-Adobe-Helvetica-Medium-R-Normal-*-120-*"
+#define DEF_ENTRY_FG                   BLACK
+#define DEF_ENTRY_RELIEF               "flat"
+#define DEF_ENTRY_SCROLL_COMMAND       ((char *) NULL)
+#define DEF_ENTRY_SELECT_COLOR         LIGHTBLUE2
+#define DEF_ENTRY_SELECT_MONO          BLACK
+#define DEF_ENTRY_SELECT_BD_COLOR      "1"
+#define DEF_ENTRY_SELECT_BD_MONO       "0"
+#define DEF_ENTRY_SELECT_FG_COLOR      BLACK
+#define DEF_ENTRY_SELECT_FG_MONO       WHITE
+#define DEF_ENTRY_STATE                        "normal"
+#define DEF_ENTRY_TEXT_VARIABLE                ((char *) NULL)
+#define DEF_ENTRY_WIDTH                        "20"
+
+/*
+ * Defaults for frames:
+ */
+
+#define DEF_FRAME_BG_COLOR             BISQUE1
+#define DEF_FRAME_BG_MONO              WHITE
+#define DEF_FRAME_BORDER_WIDTH         "0"
+#define DEF_FRAME_CURSOR               ((char *) NULL)
+#define DEF_FRAME_GEOMETRY             ((char *) NULL)
+#define DEF_FRAME_HEIGHT               "0"
+#define DEF_FRAME_RELIEF               "flat"
+#define DEF_FRAME_WIDTH                        "0"
+
+/*
+ * Defaults for listboxes:
+ */
+
+#define DEF_LISTBOX_BG_COLOR           BISQUE1
+#define DEF_LISTBOX_BG_MONO            WHITE
+#define DEF_LISTBOX_BORDER_WIDTH       "2"
+#define DEF_LISTBOX_CURSOR             ((char *) NULL)
+#define DEF_LISTBOX_EXPORT_SELECTION   "yes"
+#define DEF_LISTBOX_FONT               "-Adobe-Helvetica-Bold-R-Normal-*-120-*"
+#define DEF_LISTBOX_FG                 BLACK
+#define DEF_LISTBOX_GEOMETRY           "20x10"
+#define DEF_LISTBOX_RELIEF             "flat"
+#define DEF_LISTBOX_SCROLL_COMMAND     ((char *) NULL)
+#define DEF_LISTBOX_SELECT_COLOR       LIGHTBLUE2
+#define DEF_LISTBOX_SELECT_MONO                BLACK
+#define DEF_LISTBOX_SELECT_BD          "1"
+#define DEF_LISTBOX_SELECT_FG_COLOR    BLACK
+#define DEF_LISTBOX_SELECT_FG_MONO     WHITE
+
+/*
+ * Defaults for individual entries of menus:
+ */
+
+#define DEF_MENU_ENTRY_ACTIVE_BG       ((char *) NULL)
+#define DEF_MENU_ENTRY_ACCELERATOR     ((char *) NULL)
+#define DEF_MENU_ENTRY_BG              ((char *) NULL)
+#define DEF_MENU_ENTRY_BITMAP          ((char *) NULL)
+#define DEF_MENU_ENTRY_COMMAND         ((char *) NULL)
+#define DEF_MENU_ENTRY_FONT            ((char *) NULL)
+#define DEF_MENU_ENTRY_LABEL           ""
+#define DEF_MENU_ENTRY_MENU            ((char *) NULL)
+#define DEF_MENU_ENTRY_OFF_VALUE       "0"
+#define DEF_MENU_ENTRY_ON_VALUE                "1"
+#define DEF_MENU_ENTRY_VALUE           ((char *) NULL)
+#define DEF_MENU_ENTRY_CHECK_VARIABLE  ((char *) NULL)
+#define DEF_MENU_ENTRY_RADIO_VARIABLE  "selectedButton"
+#define DEF_MENU_ENTRY_STATE           "normal"
+#define DEF_MENU_ENTRY_UNDERLINE       "-1"
+
+/*
+ * Defaults for menus overall:
+ */
+
+#define DEF_MENU_ACTIVE_BG_COLOR       BISQUE2
+#define DEF_MENU_ACTIVE_BG_MONO                BLACK
+#define DEF_MENU_ACTIVE_BORDER_WIDTH   "1"
+#define DEF_MENU_ACTIVE_FG_COLOR       BLACK
+#define DEF_MENU_ACTIVE_FG_MONO                WHITE
+#define DEF_MENU_BG_COLOR              BISQUE1
+#define DEF_MENU_BG_MONO               WHITE
+#define DEF_MENU_BORDER_WIDTH          "2"
+#define DEF_MENU_CURSOR                        "arrow"
+#define DEF_MENU_DISABLED_FG_COLOR     GRAY
+#define DEF_MENU_DISABLED_FG_MONO      ((char *) NULL)
+#define DEF_MENU_FONT                  "-Adobe-Helvetica-Bold-R-Normal-*-120-*"
+#define DEF_MENU_FG                    BLACK
+#define DEF_MENU_SELECTOR_COLOR                MAROON
+#define DEF_MENU_SELECTOR_MONO         BLACK
+
+/*
+ * Defaults for menubuttons:
+ */
+
+#define DEF_MENUBUTTON_ANCHOR          "center"
+#define DEF_MENUBUTTON_ACTIVE_BG_COLOR BISQUE2
+#define DEF_MENUBUTTON_ACTIVE_BG_MONO  BLACK
+#define DEF_MENUBUTTON_ACTIVE_FG_COLOR BLACK
+#define DEF_MENUBUTTON_ACTIVE_FG_MONO  WHITE
+#define DEF_MENUBUTTON_BG_COLOR                BISQUE1
+#define DEF_MENUBUTTON_BG_MONO         WHITE
+#define DEF_MENUBUTTON_BITMAP          ((char *) NULL)
+#define DEF_MENUBUTTON_BORDER_WIDTH    "2"
+#define DEF_MENUBUTTON_CURSOR          ((char *) NULL)
+#define DEF_MENUBUTTON_DISABLED_FG_COLOR GRAY
+#define DEF_MENUBUTTON_DISABLED_FG_MONO        ((char *) NULL)
+#define DEF_MENUBUTTON_FONT            "-Adobe-Helvetica-Bold-R-Normal-*-120-*"
+#define DEF_MENUBUTTON_FG              BLACK
+#define DEF_MENUBUTTON_HEIGHT          "0"
+#define DEF_MENUBUTTON_MENU            ((char *) NULL)
+#define DEF_MENUBUTTON_PADX            "2"
+#define DEF_MENUBUTTON_PADY            "2"
+#define DEF_MENUBUTTON_RELIEF          "flat"
+#define DEF_MENUBUTTON_STATE           "normal"
+#define DEF_MENUBUTTON_TEXT            " "
+#define DEF_MENUBUTTON_TEXT_VARIABLE   ((char *) NULL)
+#define DEF_MENUBUTTON_VARIABLE                "postedMenu"
+#define DEF_MENUBUTTON_UNDERLINE       "-1"
+#define DEF_MENUBUTTON_WIDTH           "0"
+
+/*
+ * Defaults for messages:
+ */
+
+#define DEF_MESSAGE_ANCHOR             "center"
+#define DEF_MESSAGE_ASPECT             "150"
+#define DEF_MESSAGE_BG_COLOR           BISQUE1
+#define DEF_MESSAGE_BG_MONO            WHITE
+#define DEF_MESSAGE_BORDER_WIDTH       "2"
+#define DEF_MESSAGE_CURSOR             ((char *) NULL)
+#define DEF_MESSAGE_FONT               "-Adobe-Helvetica-Bold-R-Normal-*-120-*"
+#define DEF_MESSAGE_FG                 BLACK
+#define DEF_MESSAGE_JUSTIFY            ((char *) NULL)
+#define DEF_MESSAGE_PADX               "-1"
+#define DEF_MESSAGE_PADY               "-1"
+#define DEF_MESSAGE_RELIEF             "flat"
+#define DEF_MESSAGE_TEXT               " "
+#define DEF_MESSAGE_TEXT_VARIABLE      ((char *) NULL)
+#define DEF_MESSAGE_WIDTH              "0"
+
+/*
+ * Defaults for scales:
+ */
+
+#define DEF_SCALE_ACTIVE_FG_COLOR      LIGHTPINK1
+#define DEF_SCALE_ACTIVE_FG_MONO       WHITE
+#define DEF_SCALE_BG_COLOR             BISQUE2
+#define DEF_SCALE_BG_MONO              WHITE
+#define DEF_SCALE_BORDER_WIDTH         "2"
+#define DEF_SCALE_CURSOR               ((char *) NULL)
+#define DEF_SCALE_FONT                 "-Adobe-Helvetica-Bold-R-Normal-*-120-*"
+#define DEF_SCALE_FG_COLOR             BLACK
+#define DEF_SCALE_FG_MONO              BLACK
+#define DEF_SCALE_FROM                 "0"
+#define DEF_SCALE_LABEL                        ((char *) NULL)
+#define DEF_SCALE_LENGTH               "100"
+#define DEF_SCALE_ORIENT               "vertical"
+#define DEF_SCALE_RELIEF               "flat"
+#define DEF_SCALE_SHOW_VALUE           "1"
+#define DEF_SCALE_SLIDER_FG_COLOR      BISQUE3
+#define DEF_SCALE_SLIDER_FG_MONO       WHITE
+#define DEF_SCALE_SLIDER_LENGTH                "30"
+#define DEF_SCALE_STATE                        "normal"
+#define DEF_SCALE_TICK_INTERVAL                "0"
+#define DEF_SCALE_TO                   "100"
+#define DEF_SCALE_WIDTH                        "15"
+
+/*
+ * Defaults for scrollbars:
+ */
+
+#define DEF_SCROLLBAR_ACTIVE_FG_COLOR  LIGHTPINK1
+#define DEF_SCROLLBAR_ACTIVE_FG_MONO   BLACK
+#define DEF_SCROLLBAR_BG_COLOR         BISQUE3
+#define DEF_SCROLLBAR_BG_MONO          WHITE
+#define DEF_SCROLLBAR_BORDER_WIDTH     "2"
+#define DEF_SCROLLBAR_COMMAND          ((char *) NULL)
+#define DEF_SCROLLBAR_CURSOR           ((char *) NULL)
+#define DEF_SCROLLBAR_FG_COLOR         BISQUE1
+#define DEF_SCROLLBAR_FG_MONO          WHITE
+#define DEF_SCROLLBAR_ORIENT           "vertical"
+#define DEF_SCROLLBAR_RELIEF           "flat"
+#define DEF_SCROLLBAR_REPEAT_DELAY     "300"
+#define DEF_SCROLLBAR_REPEAT_INTERVAL  "100"
+#define DEF_SCROLLBAR_WIDTH            "15"
+
+/*
+ * Defaults for texts:
+ */
+
+#define DEF_TEXT_BG_COLOR              BISQUE1
+#define DEF_TEXT_BG_MONO               WHITE
+#define DEF_TEXT_BORDER_WIDTH          "0"
+#define DEF_TEXT_CURSOR                        "xterm"
+#define DEF_TEXT_FG                    BLACK
+#define DEF_TEXT_EXPORT_SELECTION      "yes"
+#define DEF_TEXT_FONT                  "*-Courier-Medium-R-Normal-*-120-*"
+#define DEF_TEXT_FOREGROUND            BLACK
+#define DEF_TEXT_HEIGHT                        "24"
+#define DEF_TEXT_INSERT_BG             BLACK
+#define DEF_TEXT_INSERT_BD_COLOR       "0"
+#define DEF_TEXT_INSERT_BD_MONO                "0"
+#define DEF_TEXT_INSERT_OFF_TIME       "300"
+#define DEF_TEXT_INSERT_ON_TIME                "600"
+#define DEF_TEXT_INSERT_WIDTH          "2"
+#define DEF_TEXT_PADX                  "1"
+#define DEF_TEXT_PADY                  "1"
+#define DEF_TEXT_RELIEF                        "flat"
+#define DEF_TEXT_SELECT_COLOR          LIGHTBLUE2
+#define DEF_TEXT_SELECT_MONO           BLACK
+#define DEF_TEXT_SELECT_BD_COLOR       "1"
+#define DEF_TEXT_SELECT_BD_MONO                "0"
+#define DEF_TEXT_SELECT_FG_COLOR       BLACK
+#define DEF_TEXT_SELECT_FG_MONO                WHITE
+#define DEF_TEXT_SET_GRID              "false"
+#define DEF_TEXT_STATE                 "normal"
+#define DEF_TEXT_WIDTH                 "80"
+#define DEF_TEXT_WRAP                  "char"
+#define DEF_TEXT_YSCROLL_COMMAND       ((char *) NULL)
+
+#endif /* _DEFAULT */
diff --git a/src/tk/ks_names.h b/src/tk/ks_names.h
new file mode 100644 (file)
index 0000000..3eee008
--- /dev/null
@@ -0,0 +1,917 @@
+/*
+ * This file is generated from $(INCLUDESRC)/keysymdef.h.  Do not edit.
+ */
+{ "BackSpace", 0xFF08 },
+{ "Tab", 0xFF09 },
+{ "Linefeed", 0xFF0A },
+{ "Clear", 0xFF0B },
+{ "Return", 0xFF0D },
+{ "Pause", 0xFF13 },
+{ "Escape", 0xFF1B },
+{ "Delete", 0xFFFF },
+{ "Multi_key", 0xFF20 },
+{ "Kanji", 0xFF21 },
+{ "Home", 0xFF50 },
+{ "Left", 0xFF51 },
+{ "Up", 0xFF52 },
+{ "Right", 0xFF53 },
+{ "Down", 0xFF54 },
+{ "Prior", 0xFF55 },
+{ "Next", 0xFF56 },
+{ "End", 0xFF57 },
+{ "Begin", 0xFF58 },
+{ "Select", 0xFF60 },
+{ "Print", 0xFF61 },
+{ "Execute", 0xFF62 },
+{ "Insert", 0xFF63 },
+{ "Undo", 0xFF65 },
+{ "Redo", 0xFF66 },
+{ "Menu", 0xFF67 },
+{ "Find", 0xFF68 },
+{ "Cancel", 0xFF69 },
+{ "Help", 0xFF6A },
+{ "Break", 0xFF6B },
+{ "Mode_switch", 0xFF7E },
+{ "script_switch", 0xFF7E },
+{ "Num_Lock", 0xFF7F },
+{ "KP_Space", 0xFF80 },
+{ "KP_Tab", 0xFF89 },
+{ "KP_Enter", 0xFF8D },
+{ "KP_F1", 0xFF91 },
+{ "KP_F2", 0xFF92 },
+{ "KP_F3", 0xFF93 },
+{ "KP_F4", 0xFF94 },
+{ "KP_Equal", 0xFFBD },
+{ "KP_Multiply", 0xFFAA },
+{ "KP_Add", 0xFFAB },
+{ "KP_Separator", 0xFFAC },
+{ "KP_Subtract", 0xFFAD },
+{ "KP_Decimal", 0xFFAE },
+{ "KP_Divide", 0xFFAF },
+{ "KP_0", 0xFFB0 },
+{ "KP_1", 0xFFB1 },
+{ "KP_2", 0xFFB2 },
+{ "KP_3", 0xFFB3 },
+{ "KP_4", 0xFFB4 },
+{ "KP_5", 0xFFB5 },
+{ "KP_6", 0xFFB6 },
+{ "KP_7", 0xFFB7 },
+{ "KP_8", 0xFFB8 },
+{ "KP_9", 0xFFB9 },
+{ "F1", 0xFFBE },
+{ "F2", 0xFFBF },
+{ "F3", 0xFFC0 },
+{ "F4", 0xFFC1 },
+{ "F5", 0xFFC2 },
+{ "F6", 0xFFC3 },
+{ "F7", 0xFFC4 },
+{ "F8", 0xFFC5 },
+{ "F9", 0xFFC6 },
+{ "F10", 0xFFC7 },
+{ "F11", 0xFFC8 },
+{ "L1", 0xFFC8 },
+{ "F12", 0xFFC9 },
+{ "L2", 0xFFC9 },
+{ "F13", 0xFFCA },
+{ "L3", 0xFFCA },
+{ "F14", 0xFFCB },
+{ "L4", 0xFFCB },
+{ "F15", 0xFFCC },
+{ "L5", 0xFFCC },
+{ "F16", 0xFFCD },
+{ "L6", 0xFFCD },
+{ "F17", 0xFFCE },
+{ "L7", 0xFFCE },
+{ "F18", 0xFFCF },
+{ "L8", 0xFFCF },
+{ "F19", 0xFFD0 },
+{ "L9", 0xFFD0 },
+{ "F20", 0xFFD1 },
+{ "L10", 0xFFD1 },
+{ "F21", 0xFFD2 },
+{ "R1", 0xFFD2 },
+{ "F22", 0xFFD3 },
+{ "R2", 0xFFD3 },
+{ "F23", 0xFFD4 },
+{ "R3", 0xFFD4 },
+{ "F24", 0xFFD5 },
+{ "R4", 0xFFD5 },
+{ "F25", 0xFFD6 },
+{ "R5", 0xFFD6 },
+{ "F26", 0xFFD7 },
+{ "R6", 0xFFD7 },
+{ "F27", 0xFFD8 },
+{ "R7", 0xFFD8 },
+{ "F28", 0xFFD9 },
+{ "R8", 0xFFD9 },
+{ "F29", 0xFFDA },
+{ "R9", 0xFFDA },
+{ "F30", 0xFFDB },
+{ "R10", 0xFFDB },
+{ "F31", 0xFFDC },
+{ "R11", 0xFFDC },
+{ "F32", 0xFFDD },
+{ "R12", 0xFFDD },
+{ "R13", 0xFFDE },
+{ "F33", 0xFFDE },
+{ "F34", 0xFFDF },
+{ "R14", 0xFFDF },
+{ "F35", 0xFFE0 },
+{ "R15", 0xFFE0 },
+{ "Shift_L", 0xFFE1 },
+{ "Shift_R", 0xFFE2 },
+{ "Control_L", 0xFFE3 },
+{ "Control_R", 0xFFE4 },
+{ "Caps_Lock", 0xFFE5 },
+{ "Shift_Lock", 0xFFE6 },
+{ "Meta_L", 0xFFE7 },
+{ "Meta_R", 0xFFE8 },
+{ "Alt_L", 0xFFE9 },
+{ "Alt_R", 0xFFEA },
+{ "Super_L", 0xFFEB },
+{ "Super_R", 0xFFEC },
+{ "Hyper_L", 0xFFED },
+{ "Hyper_R", 0xFFEE },
+{ "space", 0x020 },
+{ "exclam", 0x021 },
+{ "quotedbl", 0x022 },
+{ "numbersign", 0x023 },
+{ "dollar", 0x024 },
+{ "percent", 0x025 },
+{ "ampersand", 0x026 },
+{ "quoteright", 0x027 },
+{ "parenleft", 0x028 },
+{ "parenright", 0x029 },
+{ "asterisk", 0x02a },
+{ "plus", 0x02b },
+{ "comma", 0x02c },
+{ "minus", 0x02d },
+{ "period", 0x02e },
+{ "slash", 0x02f },
+{ "0", 0x030 },
+{ "1", 0x031 },
+{ "2", 0x032 },
+{ "3", 0x033 },
+{ "4", 0x034 },
+{ "5", 0x035 },
+{ "6", 0x036 },
+{ "7", 0x037 },
+{ "8", 0x038 },
+{ "9", 0x039 },
+{ "colon", 0x03a },
+{ "semicolon", 0x03b },
+{ "less", 0x03c },
+{ "equal", 0x03d },
+{ "greater", 0x03e },
+{ "question", 0x03f },
+{ "at", 0x040 },
+{ "A", 0x041 },
+{ "B", 0x042 },
+{ "C", 0x043 },
+{ "D", 0x044 },
+{ "E", 0x045 },
+{ "F", 0x046 },
+{ "G", 0x047 },
+{ "H", 0x048 },
+{ "I", 0x049 },
+{ "J", 0x04a },
+{ "K", 0x04b },
+{ "L", 0x04c },
+{ "M", 0x04d },
+{ "N", 0x04e },
+{ "O", 0x04f },
+{ "P", 0x050 },
+{ "Q", 0x051 },
+{ "R", 0x052 },
+{ "S", 0x053 },
+{ "T", 0x054 },
+{ "U", 0x055 },
+{ "V", 0x056 },
+{ "W", 0x057 },
+{ "X", 0x058 },
+{ "Y", 0x059 },
+{ "Z", 0x05a },
+{ "bracketleft", 0x05b },
+{ "backslash", 0x05c },
+{ "bracketright", 0x05d },
+{ "asciicircum", 0x05e },
+{ "underscore", 0x05f },
+{ "quoteleft", 0x060 },
+{ "a", 0x061 },
+{ "b", 0x062 },
+{ "c", 0x063 },
+{ "d", 0x064 },
+{ "e", 0x065 },
+{ "f", 0x066 },
+{ "g", 0x067 },
+{ "h", 0x068 },
+{ "i", 0x069 },
+{ "j", 0x06a },
+{ "k", 0x06b },
+{ "l", 0x06c },
+{ "m", 0x06d },
+{ "n", 0x06e },
+{ "o", 0x06f },
+{ "p", 0x070 },
+{ "q", 0x071 },
+{ "r", 0x072 },
+{ "s", 0x073 },
+{ "t", 0x074 },
+{ "u", 0x075 },
+{ "v", 0x076 },
+{ "w", 0x077 },
+{ "x", 0x078 },
+{ "y", 0x079 },
+{ "z", 0x07a },
+{ "braceleft", 0x07b },
+{ "bar", 0x07c },
+{ "braceright", 0x07d },
+{ "asciitilde", 0x07e },
+{ "nobreakspace", 0x0a0 },
+{ "exclamdown", 0x0a1 },
+{ "cent", 0x0a2 },
+{ "sterling", 0x0a3 },
+{ "currency", 0x0a4 },
+{ "yen", 0x0a5 },
+{ "brokenbar", 0x0a6 },
+{ "section", 0x0a7 },
+{ "diaeresis", 0x0a8 },
+{ "copyright", 0x0a9 },
+{ "ordfeminine", 0x0aa },
+{ "guillemotleft", 0x0ab },
+{ "notsign", 0x0ac },
+{ "hyphen", 0x0ad },
+{ "registered", 0x0ae },
+{ "macron", 0x0af },
+{ "degree", 0x0b0 },
+{ "plusminus", 0x0b1 },
+{ "twosuperior", 0x0b2 },
+{ "threesuperior", 0x0b3 },
+{ "acute", 0x0b4 },
+{ "mu", 0x0b5 },
+{ "paragraph", 0x0b6 },
+{ "periodcentered", 0x0b7 },
+{ "cedilla", 0x0b8 },
+{ "onesuperior", 0x0b9 },
+{ "masculine", 0x0ba },
+{ "guillemotright", 0x0bb },
+{ "onequarter", 0x0bc },
+{ "onehalf", 0x0bd },
+{ "threequarters", 0x0be },
+{ "questiondown", 0x0bf },
+{ "Agrave", 0x0c0 },
+{ "Aacute", 0x0c1 },
+{ "Acircumflex", 0x0c2 },
+{ "Atilde", 0x0c3 },
+{ "Adiaeresis", 0x0c4 },
+{ "Aring", 0x0c5 },
+{ "AE", 0x0c6 },
+{ "Ccedilla", 0x0c7 },
+{ "Egrave", 0x0c8 },
+{ "Eacute", 0x0c9 },
+{ "Ecircumflex", 0x0ca },
+{ "Ediaeresis", 0x0cb },
+{ "Igrave", 0x0cc },
+{ "Iacute", 0x0cd },
+{ "Icircumflex", 0x0ce },
+{ "Idiaeresis", 0x0cf },
+{ "Eth", 0x0d0 },
+{ "Ntilde", 0x0d1 },
+{ "Ograve", 0x0d2 },
+{ "Oacute", 0x0d3 },
+{ "Ocircumflex", 0x0d4 },
+{ "Otilde", 0x0d5 },
+{ "Odiaeresis", 0x0d6 },
+{ "multiply", 0x0d7 },
+{ "Ooblique", 0x0d8 },
+{ "Ugrave", 0x0d9 },
+{ "Uacute", 0x0da },
+{ "Ucircumflex", 0x0db },
+{ "Udiaeresis", 0x0dc },
+{ "Yacute", 0x0dd },
+{ "Thorn", 0x0de },
+{ "ssharp", 0x0df },
+{ "agrave", 0x0e0 },
+{ "aacute", 0x0e1 },
+{ "acircumflex", 0x0e2 },
+{ "atilde", 0x0e3 },
+{ "adiaeresis", 0x0e4 },
+{ "aring", 0x0e5 },
+{ "ae", 0x0e6 },
+{ "ccedilla", 0x0e7 },
+{ "egrave", 0x0e8 },
+{ "eacute", 0x0e9 },
+{ "ecircumflex", 0x0ea },
+{ "ediaeresis", 0x0eb },
+{ "igrave", 0x0ec },
+{ "iacute", 0x0ed },
+{ "icircumflex", 0x0ee },
+{ "idiaeresis", 0x0ef },
+{ "eth", 0x0f0 },
+{ "ntilde", 0x0f1 },
+{ "ograve", 0x0f2 },
+{ "oacute", 0x0f3 },
+{ "ocircumflex", 0x0f4 },
+{ "otilde", 0x0f5 },
+{ "odiaeresis", 0x0f6 },
+{ "division", 0x0f7 },
+{ "oslash", 0x0f8 },
+{ "ugrave", 0x0f9 },
+{ "uacute", 0x0fa },
+{ "ucircumflex", 0x0fb },
+{ "udiaeresis", 0x0fc },
+{ "yacute", 0x0fd },
+{ "thorn", 0x0fe },
+{ "ydiaeresis", 0x0ff },
+{ "Aogonek", 0x1a1 },
+{ "breve", 0x1a2 },
+{ "Lstroke", 0x1a3 },
+{ "Lcaron", 0x1a5 },
+{ "Sacute", 0x1a6 },
+{ "Scaron", 0x1a9 },
+{ "Scedilla", 0x1aa },
+{ "Tcaron", 0x1ab },
+{ "Zacute", 0x1ac },
+{ "Zcaron", 0x1ae },
+{ "Zabovedot", 0x1af },
+{ "aogonek", 0x1b1 },
+{ "ogonek", 0x1b2 },
+{ "lstroke", 0x1b3 },
+{ "lcaron", 0x1b5 },
+{ "sacute", 0x1b6 },
+{ "caron", 0x1b7 },
+{ "scaron", 0x1b9 },
+{ "scedilla", 0x1ba },
+{ "tcaron", 0x1bb },
+{ "zacute", 0x1bc },
+{ "doubleacute", 0x1bd },
+{ "zcaron", 0x1be },
+{ "zabovedot", 0x1bf },
+{ "Racute", 0x1c0 },
+{ "Abreve", 0x1c3 },
+{ "Cacute", 0x1c6 },
+{ "Ccaron", 0x1c8 },
+{ "Eogonek", 0x1ca },
+{ "Ecaron", 0x1cc },
+{ "Dcaron", 0x1cf },
+{ "Nacute", 0x1d1 },
+{ "Ncaron", 0x1d2 },
+{ "Odoubleacute", 0x1d5 },
+{ "Rcaron", 0x1d8 },
+{ "Uring", 0x1d9 },
+{ "Udoubleacute", 0x1db },
+{ "Tcedilla", 0x1de },
+{ "racute", 0x1e0 },
+{ "abreve", 0x1e3 },
+{ "cacute", 0x1e6 },
+{ "ccaron", 0x1e8 },
+{ "eogonek", 0x1ea },
+{ "ecaron", 0x1ec },
+{ "dcaron", 0x1ef },
+{ "nacute", 0x1f1 },
+{ "ncaron", 0x1f2 },
+{ "odoubleacute", 0x1f5 },
+{ "udoubleacute", 0x1fb },
+{ "rcaron", 0x1f8 },
+{ "uring", 0x1f9 },
+{ "tcedilla", 0x1fe },
+{ "abovedot", 0x1ff },
+{ "Hstroke", 0x2a1 },
+{ "Hcircumflex", 0x2a6 },
+{ "Iabovedot", 0x2a9 },
+{ "Gbreve", 0x2ab },
+{ "Jcircumflex", 0x2ac },
+{ "hstroke", 0x2b1 },
+{ "hcircumflex", 0x2b6 },
+{ "idotless", 0x2b9 },
+{ "gbreve", 0x2bb },
+{ "jcircumflex", 0x2bc },
+{ "Cabovedot", 0x2c5 },
+{ "Ccircumflex", 0x2c6 },
+{ "Gabovedot", 0x2d5 },
+{ "Gcircumflex", 0x2d8 },
+{ "Ubreve", 0x2dd },
+{ "Scircumflex", 0x2de },
+{ "cabovedot", 0x2e5 },
+{ "ccircumflex", 0x2e6 },
+{ "gabovedot", 0x2f5 },
+{ "gcircumflex", 0x2f8 },
+{ "ubreve", 0x2fd },
+{ "scircumflex", 0x2fe },
+{ "kappa", 0x3a2 },
+{ "Rcedilla", 0x3a3 },
+{ "Itilde", 0x3a5 },
+{ "Lcedilla", 0x3a6 },
+{ "Emacron", 0x3aa },
+{ "Gcedilla", 0x3ab },
+{ "Tslash", 0x3ac },
+{ "rcedilla", 0x3b3 },
+{ "itilde", 0x3b5 },
+{ "lcedilla", 0x3b6 },
+{ "emacron", 0x3ba },
+{ "gacute", 0x3bb },
+{ "tslash", 0x3bc },
+{ "ENG", 0x3bd },
+{ "eng", 0x3bf },
+{ "Amacron", 0x3c0 },
+{ "Iogonek", 0x3c7 },
+{ "Eabovedot", 0x3cc },
+{ "Imacron", 0x3cf },
+{ "Ncedilla", 0x3d1 },
+{ "Omacron", 0x3d2 },
+{ "Kcedilla", 0x3d3 },
+{ "Uogonek", 0x3d9 },
+{ "Utilde", 0x3dd },
+{ "Umacron", 0x3de },
+{ "amacron", 0x3e0 },
+{ "iogonek", 0x3e7 },
+{ "eabovedot", 0x3ec },
+{ "imacron", 0x3ef },
+{ "ncedilla", 0x3f1 },
+{ "omacron", 0x3f2 },
+{ "kcedilla", 0x3f3 },
+{ "uogonek", 0x3f9 },
+{ "utilde", 0x3fd },
+{ "umacron", 0x3fe },
+{ "overline", 0x47e },
+{ "kana_fullstop", 0x4a1 },
+{ "kana_openingbracket", 0x4a2 },
+{ "kana_closingbracket", 0x4a3 },
+{ "kana_comma", 0x4a4 },
+{ "kana_middledot", 0x4a5 },
+{ "kana_WO", 0x4a6 },
+{ "kana_a", 0x4a7 },
+{ "kana_i", 0x4a8 },
+{ "kana_u", 0x4a9 },
+{ "kana_e", 0x4aa },
+{ "kana_o", 0x4ab },
+{ "kana_ya", 0x4ac },
+{ "kana_yu", 0x4ad },
+{ "kana_yo", 0x4ae },
+{ "kana_tu", 0x4af },
+{ "prolongedsound", 0x4b0 },
+{ "kana_A", 0x4b1 },
+{ "kana_I", 0x4b2 },
+{ "kana_U", 0x4b3 },
+{ "kana_E", 0x4b4 },
+{ "kana_O", 0x4b5 },
+{ "kana_KA", 0x4b6 },
+{ "kana_KI", 0x4b7 },
+{ "kana_KU", 0x4b8 },
+{ "kana_KE", 0x4b9 },
+{ "kana_KO", 0x4ba },
+{ "kana_SA", 0x4bb },
+{ "kana_SHI", 0x4bc },
+{ "kana_SU", 0x4bd },
+{ "kana_SE", 0x4be },
+{ "kana_SO", 0x4bf },
+{ "kana_TA", 0x4c0 },
+{ "kana_TI", 0x4c1 },
+{ "kana_TU", 0x4c2 },
+{ "kana_TE", 0x4c3 },
+{ "kana_TO", 0x4c4 },
+{ "kana_NA", 0x4c5 },
+{ "kana_NI", 0x4c6 },
+{ "kana_NU", 0x4c7 },
+{ "kana_NE", 0x4c8 },
+{ "kana_NO", 0x4c9 },
+{ "kana_HA", 0x4ca },
+{ "kana_HI", 0x4cb },
+{ "kana_HU", 0x4cc },
+{ "kana_HE", 0x4cd },
+{ "kana_HO", 0x4ce },
+{ "kana_MA", 0x4cf },
+{ "kana_MI", 0x4d0 },
+{ "kana_MU", 0x4d1 },
+{ "kana_ME", 0x4d2 },
+{ "kana_MO", 0x4d3 },
+{ "kana_YA", 0x4d4 },
+{ "kana_YU", 0x4d5 },
+{ "kana_YO", 0x4d6 },
+{ "kana_RA", 0x4d7 },
+{ "kana_RI", 0x4d8 },
+{ "kana_RU", 0x4d9 },
+{ "kana_RE", 0x4da },
+{ "kana_RO", 0x4db },
+{ "kana_WA", 0x4dc },
+{ "kana_N", 0x4dd },
+{ "voicedsound", 0x4de },
+{ "semivoicedsound", 0x4df },
+{ "kana_switch", 0xFF7E },
+{ "Arabic_comma", 0x5ac },
+{ "Arabic_semicolon", 0x5bb },
+{ "Arabic_question_mark", 0x5bf },
+{ "Arabic_hamza", 0x5c1 },
+{ "Arabic_maddaonalef", 0x5c2 },
+{ "Arabic_hamzaonalef", 0x5c3 },
+{ "Arabic_hamzaonwaw", 0x5c4 },
+{ "Arabic_hamzaunderalef", 0x5c5 },
+{ "Arabic_hamzaonyeh", 0x5c6 },
+{ "Arabic_alef", 0x5c7 },
+{ "Arabic_beh", 0x5c8 },
+{ "Arabic_tehmarbuta", 0x5c9 },
+{ "Arabic_teh", 0x5ca },
+{ "Arabic_theh", 0x5cb },
+{ "Arabic_jeem", 0x5cc },
+{ "Arabic_hah", 0x5cd },
+{ "Arabic_khah", 0x5ce },
+{ "Arabic_dal", 0x5cf },
+{ "Arabic_thal", 0x5d0 },
+{ "Arabic_ra", 0x5d1 },
+{ "Arabic_zain", 0x5d2 },
+{ "Arabic_seen", 0x5d3 },
+{ "Arabic_sheen", 0x5d4 },
+{ "Arabic_sad", 0x5d5 },
+{ "Arabic_dad", 0x5d6 },
+{ "Arabic_tah", 0x5d7 },
+{ "Arabic_zah", 0x5d8 },
+{ "Arabic_ain", 0x5d9 },
+{ "Arabic_ghain", 0x5da },
+{ "Arabic_tatweel", 0x5e0 },
+{ "Arabic_feh", 0x5e1 },
+{ "Arabic_qaf", 0x5e2 },
+{ "Arabic_kaf", 0x5e3 },
+{ "Arabic_lam", 0x5e4 },
+{ "Arabic_meem", 0x5e5 },
+{ "Arabic_noon", 0x5e6 },
+{ "Arabic_heh", 0x5e7 },
+{ "Arabic_waw", 0x5e8 },
+{ "Arabic_alefmaksura", 0x5e9 },
+{ "Arabic_yeh", 0x5ea },
+{ "Arabic_fathatan", 0x5eb },
+{ "Arabic_dammatan", 0x5ec },
+{ "Arabic_kasratan", 0x5ed },
+{ "Arabic_fatha", 0x5ee },
+{ "Arabic_damma", 0x5ef },
+{ "Arabic_kasra", 0x5f0 },
+{ "Arabic_shadda", 0x5f1 },
+{ "Arabic_sukun", 0x5f2 },
+{ "Arabic_switch", 0xFF7E },
+{ "Serbian_dje", 0x6a1 },
+{ "Macedonia_gje", 0x6a2 },
+{ "Cyrillic_io", 0x6a3 },
+{ "Ukranian_je", 0x6a4 },
+{ "Macedonia_dse", 0x6a5 },
+{ "Ukranian_i", 0x6a6 },
+{ "Ukranian_yi", 0x6a7 },
+{ "Serbian_je", 0x6a8 },
+{ "Serbian_lje", 0x6a9 },
+{ "Serbian_nje", 0x6aa },
+{ "Serbian_tshe", 0x6ab },
+{ "Macedonia_kje", 0x6ac },
+{ "Byelorussian_shortu", 0x6ae },
+{ "Serbian_dze", 0x6af },
+{ "numerosign", 0x6b0 },
+{ "Serbian_DJE", 0x6b1 },
+{ "Macedonia_GJE", 0x6b2 },
+{ "Cyrillic_IO", 0x6b3 },
+{ "Ukranian_JE", 0x6b4 },
+{ "Macedonia_DSE", 0x6b5 },
+{ "Ukranian_I", 0x6b6 },
+{ "Ukranian_YI", 0x6b7 },
+{ "Serbian_JE", 0x6b8 },
+{ "Serbian_LJE", 0x6b9 },
+{ "Serbian_NJE", 0x6ba },
+{ "Serbian_TSHE", 0x6bb },
+{ "Macedonia_KJE", 0x6bc },
+{ "Byelorussian_SHORTU", 0x6be },
+{ "Serbian_DZE", 0x6bf },
+{ "Cyrillic_yu", 0x6c0 },
+{ "Cyrillic_a", 0x6c1 },
+{ "Cyrillic_be", 0x6c2 },
+{ "Cyrillic_tse", 0x6c3 },
+{ "Cyrillic_de", 0x6c4 },
+{ "Cyrillic_ie", 0x6c5 },
+{ "Cyrillic_ef", 0x6c6 },
+{ "Cyrillic_ghe", 0x6c7 },
+{ "Cyrillic_ha", 0x6c8 },
+{ "Cyrillic_i", 0x6c9 },
+{ "Cyrillic_shorti", 0x6ca },
+{ "Cyrillic_ka", 0x6cb },
+{ "Cyrillic_el", 0x6cc },
+{ "Cyrillic_em", 0x6cd },
+{ "Cyrillic_en", 0x6ce },
+{ "Cyrillic_o", 0x6cf },
+{ "Cyrillic_pe", 0x6d0 },
+{ "Cyrillic_ya", 0x6d1 },
+{ "Cyrillic_er", 0x6d2 },
+{ "Cyrillic_es", 0x6d3 },
+{ "Cyrillic_te", 0x6d4 },
+{ "Cyrillic_u", 0x6d5 },
+{ "Cyrillic_zhe", 0x6d6 },
+{ "Cyrillic_ve", 0x6d7 },
+{ "Cyrillic_softsign", 0x6d8 },
+{ "Cyrillic_yeru", 0x6d9 },
+{ "Cyrillic_ze", 0x6da },
+{ "Cyrillic_sha", 0x6db },
+{ "Cyrillic_e", 0x6dc },
+{ "Cyrillic_shcha", 0x6dd },
+{ "Cyrillic_che", 0x6de },
+{ "Cyrillic_hardsign", 0x6df },
+{ "Cyrillic_YU", 0x6e0 },
+{ "Cyrillic_A", 0x6e1 },
+{ "Cyrillic_BE", 0x6e2 },
+{ "Cyrillic_TSE", 0x6e3 },
+{ "Cyrillic_DE", 0x6e4 },
+{ "Cyrillic_IE", 0x6e5 },
+{ "Cyrillic_EF", 0x6e6 },
+{ "Cyrillic_GHE", 0x6e7 },
+{ "Cyrillic_HA", 0x6e8 },
+{ "Cyrillic_I", 0x6e9 },
+{ "Cyrillic_SHORTI", 0x6ea },
+{ "Cyrillic_KA", 0x6eb },
+{ "Cyrillic_EL", 0x6ec },
+{ "Cyrillic_EM", 0x6ed },
+{ "Cyrillic_EN", 0x6ee },
+{ "Cyrillic_O", 0x6ef },
+{ "Cyrillic_PE", 0x6f0 },
+{ "Cyrillic_YA", 0x6f1 },
+{ "Cyrillic_ER", 0x6f2 },
+{ "Cyrillic_ES", 0x6f3 },
+{ "Cyrillic_TE", 0x6f4 },
+{ "Cyrillic_U", 0x6f5 },
+{ "Cyrillic_ZHE", 0x6f6 },
+{ "Cyrillic_VE", 0x6f7 },
+{ "Cyrillic_SOFTSIGN", 0x6f8 },
+{ "Cyrillic_YERU", 0x6f9 },
+{ "Cyrillic_ZE", 0x6fa },
+{ "Cyrillic_SHA", 0x6fb },
+{ "Cyrillic_E", 0x6fc },
+{ "Cyrillic_SHCHA", 0x6fd },
+{ "Cyrillic_CHE", 0x6fe },
+{ "Cyrillic_HARDSIGN", 0x6ff },
+{ "Greek_ALPHAaccent", 0x7a1 },
+{ "Greek_EPSILONaccent", 0x7a2 },
+{ "Greek_ETAaccent", 0x7a3 },
+{ "Greek_IOTAaccent", 0x7a4 },
+{ "Greek_IOTAdiaeresis", 0x7a5 },
+{ "Greek_IOTAaccentdiaeresis", 0x7a6 },
+{ "Greek_OMICRONaccent", 0x7a7 },
+{ "Greek_UPSILONaccent", 0x7a8 },
+{ "Greek_UPSILONdieresis", 0x7a9 },
+{ "Greek_UPSILONaccentdieresis", 0x7aa },
+{ "Greek_OMEGAaccent", 0x7ab },
+{ "Greek_alphaaccent", 0x7b1 },
+{ "Greek_epsilonaccent", 0x7b2 },
+{ "Greek_etaaccent", 0x7b3 },
+{ "Greek_iotaaccent", 0x7b4 },
+{ "Greek_iotadieresis", 0x7b5 },
+{ "Greek_iotaaccentdieresis", 0x7b6 },
+{ "Greek_omicronaccent", 0x7b7 },
+{ "Greek_upsilonaccent", 0x7b8 },
+{ "Greek_upsilondieresis", 0x7b9 },
+{ "Greek_upsilonaccentdieresis", 0x7ba },
+{ "Greek_omegaaccent", 0x7bb },
+{ "Greek_ALPHA", 0x7c1 },
+{ "Greek_BETA", 0x7c2 },
+{ "Greek_GAMMA", 0x7c3 },
+{ "Greek_DELTA", 0x7c4 },
+{ "Greek_EPSILON", 0x7c5 },
+{ "Greek_ZETA", 0x7c6 },
+{ "Greek_ETA", 0x7c7 },
+{ "Greek_THETA", 0x7c8 },
+{ "Greek_IOTA", 0x7c9 },
+{ "Greek_KAPPA", 0x7ca },
+{ "Greek_LAMBDA", 0x7cb },
+{ "Greek_MU", 0x7cc },
+{ "Greek_NU", 0x7cd },
+{ "Greek_XI", 0x7ce },
+{ "Greek_OMICRON", 0x7cf },
+{ "Greek_PI", 0x7d0 },
+{ "Greek_RHO", 0x7d1 },
+{ "Greek_SIGMA", 0x7d2 },
+{ "Greek_TAU", 0x7d4 },
+{ "Greek_UPSILON", 0x7d5 },
+{ "Greek_PHI", 0x7d6 },
+{ "Greek_CHI", 0x7d7 },
+{ "Greek_PSI", 0x7d8 },
+{ "Greek_OMEGA", 0x7d9 },
+{ "Greek_alpha", 0x7e1 },
+{ "Greek_beta", 0x7e2 },
+{ "Greek_gamma", 0x7e3 },
+{ "Greek_delta", 0x7e4 },
+{ "Greek_epsilon", 0x7e5 },
+{ "Greek_zeta", 0x7e6 },
+{ "Greek_eta", 0x7e7 },
+{ "Greek_theta", 0x7e8 },
+{ "Greek_iota", 0x7e9 },
+{ "Greek_kappa", 0x7ea },
+{ "Greek_lambda", 0x7eb },
+{ "Greek_mu", 0x7ec },
+{ "Greek_nu", 0x7ed },
+{ "Greek_xi", 0x7ee },
+{ "Greek_omicron", 0x7ef },
+{ "Greek_pi", 0x7f0 },
+{ "Greek_rho", 0x7f1 },
+{ "Greek_sigma", 0x7f2 },
+{ "Greek_finalsmallsigma", 0x7f3 },
+{ "Greek_tau", 0x7f4 },
+{ "Greek_upsilon", 0x7f5 },
+{ "Greek_phi", 0x7f6 },
+{ "Greek_chi", 0x7f7 },
+{ "Greek_psi", 0x7f8 },
+{ "Greek_omega", 0x7f9 },
+{ "Greek_switch", 0xFF7E },
+{ "leftradical", 0x8a1 },
+{ "topleftradical", 0x8a2 },
+{ "horizconnector", 0x8a3 },
+{ "topintegral", 0x8a4 },
+{ "botintegral", 0x8a5 },
+{ "vertconnector", 0x8a6 },
+{ "topleftsqbracket", 0x8a7 },
+{ "botleftsqbracket", 0x8a8 },
+{ "toprightsqbracket", 0x8a9 },
+{ "botrightsqbracket", 0x8aa },
+{ "topleftparens", 0x8ab },
+{ "botleftparens", 0x8ac },
+{ "toprightparens", 0x8ad },
+{ "botrightparens", 0x8ae },
+{ "leftmiddlecurlybrace", 0x8af },
+{ "rightmiddlecurlybrace", 0x8b0 },
+{ "topleftsummation", 0x8b1 },
+{ "botleftsummation", 0x8b2 },
+{ "topvertsummationconnector", 0x8b3 },
+{ "botvertsummationconnector", 0x8b4 },
+{ "toprightsummation", 0x8b5 },
+{ "botrightsummation", 0x8b6 },
+{ "rightmiddlesummation", 0x8b7 },
+{ "lessthanequal", 0x8bc },
+{ "notequal", 0x8bd },
+{ "greaterthanequal", 0x8be },
+{ "integral", 0x8bf },
+{ "therefore", 0x8c0 },
+{ "variation", 0x8c1 },
+{ "infinity", 0x8c2 },
+{ "nabla", 0x8c5 },
+{ "approximate", 0x8c8 },
+{ "similarequal", 0x8c9 },
+{ "ifonlyif", 0x8cd },
+{ "implies", 0x8ce },
+{ "identical", 0x8cf },
+{ "radical", 0x8d6 },
+{ "includedin", 0x8da },
+{ "includes", 0x8db },
+{ "intersection", 0x8dc },
+{ "union", 0x8dd },
+{ "logicaland", 0x8de },
+{ "logicalor", 0x8df },
+{ "partialderivative", 0x8ef },
+{ "function", 0x8f6 },
+{ "leftarrow", 0x8fb },
+{ "uparrow", 0x8fc },
+{ "rightarrow", 0x8fd },
+{ "downarrow", 0x8fe },
+{ "blank", 0x9df },
+{ "soliddiamond", 0x9e0 },
+{ "checkerboard", 0x9e1 },
+{ "ht", 0x9e2 },
+{ "ff", 0x9e3 },
+{ "cr", 0x9e4 },
+{ "lf", 0x9e5 },
+{ "nl", 0x9e8 },
+{ "vt", 0x9e9 },
+{ "lowrightcorner", 0x9ea },
+{ "uprightcorner", 0x9eb },
+{ "upleftcorner", 0x9ec },
+{ "lowleftcorner", 0x9ed },
+{ "crossinglines", 0x9ee },
+{ "horizlinescan1", 0x9ef },
+{ "horizlinescan3", 0x9f0 },
+{ "horizlinescan5", 0x9f1 },
+{ "horizlinescan7", 0x9f2 },
+{ "horizlinescan9", 0x9f3 },
+{ "leftt", 0x9f4 },
+{ "rightt", 0x9f5 },
+{ "bott", 0x9f6 },
+{ "topt", 0x9f7 },
+{ "vertbar", 0x9f8 },
+{ "emspace", 0xaa1 },
+{ "enspace", 0xaa2 },
+{ "em3space", 0xaa3 },
+{ "em4space", 0xaa4 },
+{ "digitspace", 0xaa5 },
+{ "punctspace", 0xaa6 },
+{ "thinspace", 0xaa7 },
+{ "hairspace", 0xaa8 },
+{ "emdash", 0xaa9 },
+{ "endash", 0xaaa },
+{ "signifblank", 0xaac },
+{ "ellipsis", 0xaae },
+{ "doubbaselinedot", 0xaaf },
+{ "onethird", 0xab0 },
+{ "twothirds", 0xab1 },
+{ "onefifth", 0xab2 },
+{ "twofifths", 0xab3 },
+{ "threefifths", 0xab4 },
+{ "fourfifths", 0xab5 },
+{ "onesixth", 0xab6 },
+{ "fivesixths", 0xab7 },
+{ "careof", 0xab8 },
+{ "figdash", 0xabb },
+{ "leftanglebracket", 0xabc },
+{ "decimalpoint", 0xabd },
+{ "rightanglebracket", 0xabe },
+{ "marker", 0xabf },
+{ "oneeighth", 0xac3 },
+{ "threeeighths", 0xac4 },
+{ "fiveeighths", 0xac5 },
+{ "seveneighths", 0xac6 },
+{ "trademark", 0xac9 },
+{ "signaturemark", 0xaca },
+{ "trademarkincircle", 0xacb },
+{ "leftopentriangle", 0xacc },
+{ "rightopentriangle", 0xacd },
+{ "emopencircle", 0xace },
+{ "emopenrectangle", 0xacf },
+{ "leftsinglequotemark", 0xad0 },
+{ "rightsinglequotemark", 0xad1 },
+{ "leftdoublequotemark", 0xad2 },
+{ "rightdoublequotemark", 0xad3 },
+{ "prescription", 0xad4 },
+{ "minutes", 0xad6 },
+{ "seconds", 0xad7 },
+{ "latincross", 0xad9 },
+{ "hexagram", 0xada },
+{ "filledrectbullet", 0xadb },
+{ "filledlefttribullet", 0xadc },
+{ "filledrighttribullet", 0xadd },
+{ "emfilledcircle", 0xade },
+{ "emfilledrect", 0xadf },
+{ "enopencircbullet", 0xae0 },
+{ "enopensquarebullet", 0xae1 },
+{ "openrectbullet", 0xae2 },
+{ "opentribulletup", 0xae3 },
+{ "opentribulletdown", 0xae4 },
+{ "openstar", 0xae5 },
+{ "enfilledcircbullet", 0xae6 },
+{ "enfilledsqbullet", 0xae7 },
+{ "filledtribulletup", 0xae8 },
+{ "filledtribulletdown", 0xae9 },
+{ "leftpointer", 0xaea },
+{ "rightpointer", 0xaeb },
+{ "club", 0xaec },
+{ "diamond", 0xaed },
+{ "heart", 0xaee },
+{ "maltesecross", 0xaf0 },
+{ "dagger", 0xaf1 },
+{ "doubledagger", 0xaf2 },
+{ "checkmark", 0xaf3 },
+{ "ballotcross", 0xaf4 },
+{ "musicalsharp", 0xaf5 },
+{ "musicalflat", 0xaf6 },
+{ "malesymbol", 0xaf7 },
+{ "femalesymbol", 0xaf8 },
+{ "telephone", 0xaf9 },
+{ "telephonerecorder", 0xafa },
+{ "phonographcopyright", 0xafb },
+{ "caret", 0xafc },
+{ "singlelowquotemark", 0xafd },
+{ "doublelowquotemark", 0xafe },
+{ "cursor", 0xaff },
+{ "leftcaret", 0xba3 },
+{ "rightcaret", 0xba6 },
+{ "downcaret", 0xba8 },
+{ "upcaret", 0xba9 },
+{ "overbar", 0xbc0 },
+{ "downtack", 0xbc2 },
+{ "upshoe", 0xbc3 },
+{ "downstile", 0xbc4 },
+{ "underbar", 0xbc6 },
+{ "jot", 0xbca },
+{ "quad", 0xbcc },
+{ "uptack", 0xbce },
+{ "circle", 0xbcf },
+{ "upstile", 0xbd3 },
+{ "downshoe", 0xbd6 },
+{ "rightshoe", 0xbd8 },
+{ "leftshoe", 0xbda },
+{ "lefttack", 0xbdc },
+{ "righttack", 0xbfc },
+{ "hebrew_aleph", 0xce0 },
+{ "hebrew_beth", 0xce1 },
+{ "hebrew_gimmel", 0xce2 },
+{ "hebrew_daleth", 0xce3 },
+{ "hebrew_he", 0xce4 },
+{ "hebrew_waw", 0xce5 },
+{ "hebrew_zayin", 0xce6 },
+{ "hebrew_het", 0xce7 },
+{ "hebrew_teth", 0xce8 },
+{ "hebrew_yod", 0xce9 },
+{ "hebrew_finalkaph", 0xcea },
+{ "hebrew_kaph", 0xceb },
+{ "hebrew_lamed", 0xcec },
+{ "hebrew_finalmem", 0xced },
+{ "hebrew_mem", 0xcee },
+{ "hebrew_finalnun", 0xcef },
+{ "hebrew_nun", 0xcf0 },
+{ "hebrew_samekh", 0xcf1 },
+{ "hebrew_ayin", 0xcf2 },
+{ "hebrew_finalpe", 0xcf3 },
+{ "hebrew_pe", 0xcf4 },
+{ "hebrew_finalzadi", 0xcf5 },
+{ "hebrew_zadi", 0xcf6 },
+{ "hebrew_kuf", 0xcf7 },
+{ "hebrew_resh", 0xcf8 },
+{ "hebrew_shin", 0xcf9 },
+{ "hebrew_taf", 0xcfa },
+{ "Hebrew_switch", 0xFF7E },
diff --git a/src/tk/library/button.tcl b/src/tk/library/button.tcl
new file mode 100644 (file)
index 0000000..a1ce07a
--- /dev/null
@@ -0,0 +1,70 @@
+# button.tcl --
+#
+# This file contains Tcl procedures used to manage Tk buttons.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/button.tcl,v 1.7 92/07/28 15:41:13 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# The procedure below is invoked when the mouse pointer enters a
+# button widget.  It records the button we're in and changes the
+# state of the button to active unless the button is disabled.
+
+proc tk_butEnter w {
+    global tk_priv tk_strictMotif
+    if {[lindex [$w config -state] 4] != "disabled"} {
+       if {!$tk_strictMotif} {
+           $w config -state active
+       }
+       set tk_priv(window) $w
+    }
+}
+
+# The procedure below is invoked when the mouse pointer leaves a
+# button widget.  It changes the state of the button back to
+# inactive.
+
+proc tk_butLeave w {
+    global tk_priv tk_strictMotif
+    if {[lindex [$w config -state] 4] != "disabled"} {
+       if {!$tk_strictMotif} {
+           $w config -state normal
+       }
+    }
+    set tk_priv(window) ""
+}
+
+# The procedure below is invoked when the mouse button is pressed in
+# a button/radiobutton/checkbutton widget.  It records information
+# (a) to indicate that the mouse is in the button, and
+# (b) to save the button's relief so it can be restored later.
+
+proc tk_butDown w {
+    global tk_priv
+    set tk_priv(relief) [lindex [$w config -relief] 4]
+    if {[lindex [$w config -state] 4] != "disabled"} {
+       $w config -relief sunken
+    }
+}
+
+# The procedure below is invoked when the mouse button is released
+# for a button/radiobutton/checkbutton widget.  It restores the
+# button's relief and invokes the command as long as the mouse
+# hasn't left the button.
+
+proc tk_butUp w {
+    global tk_priv
+    $w config -relief $tk_priv(relief)
+    if {($w == $tk_priv(window))
+           && ([lindex [$w config -state] 4] != "disabled")} {
+       uplevel #0 [list $w invoke]
+    }
+}
diff --git a/src/tk/library/demos/README b/src/tk/library/demos/README
new file mode 100644 (file)
index 0000000..b558a78
--- /dev/null
@@ -0,0 +1,53 @@
+This directory contains a collection of programs to demonstrate
+the features of the Tk toolkit.  The programs are all scripts for
+"wish", a windowing shell.  If wish has been installed in /usr/local
+then you can invoke any of the programs in this directory just
+by typing its file name to your command shell.  Otherwise invoke
+wish on the file using the "-f" switch to wish, e.g. "wish -f hello".
+The rest of this file contains a brief description of each program.
+Files with names ending in ".tcl" are procedure packages used by one
+or more of the demo programs;  they can't be used as programs by
+themselves so they aren't described below.
+
+hello -                Creates a single button;  if you click on it, a message
+               is typed and the application terminates.
+
+widget -       Contains a collection of demonstrations of the widgets
+               currently available in the Tk library.  Most of the .tcl
+               files are scripts for individual demos available through
+               the "widget" program.
+
+ixset -                A simple Tk-based wrapper for the "xset" program, which
+               allows you to interactively query and set various X options
+               such as mouse acceleration and bell volume.  Thanks to
+               Pierre David for contributing this example.
+
+rolodex -      A mock-up of a simple rolodex application.  It has much of
+               the user interface for such an application but no back-end
+               database.  This program was written in response to Tom
+               LaStrange's toolkit benchmark challenge.
+
+timer -                Displays a seconds timer with start and stop buttons.
+               Control-c and control-q cause it to exit.
+
+browse -       A simple directory browser.  Invoke it with and argument
+               giving the name of the directory you'd like to browse.
+               Double-click on files or subdirectories to browse them.
+               Control-c and control-q cause the program to exit.
+
+dialog -       Displays a simple dialog.  Click on any button and the
+               application exits.
+
+size -         Takes three arguments:  the name of an application, the
+               name of a widget in that application, and the name of an
+               integer-valued option for that widget.  Allows you to
+               interactively resize the given option.  For example,
+               start up the dialog demo, then type
+               "size dialog .bot.middle -pady" for an example.
+
+color -                Similar to "size", but modifies a color option.  Try
+               "color dialog .bot.middle -bg" for an example.
+
+tkSquare.c -   A very simple widget to provide an example of how to
+               implement a new widget.  When building a new widget you
+               may find it useful to start from this code.
diff --git a/src/tk/library/demos/bitmaps/face b/src/tk/library/demos/bitmaps/face
new file mode 100644 (file)
index 0000000..8e09419
--- /dev/null
@@ -0,0 +1,171 @@
+#define face_width 108
+#define face_height 144
+static char face_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09,
+   0x20, 0x80, 0x24, 0x05, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x88,
+   0x24, 0x20, 0x80, 0x24, 0x00, 0x00, 0x00, 0x10, 0x80, 0x04, 0x00, 0x01,
+   0x00, 0x01, 0x40, 0x0a, 0x09, 0x00, 0x92, 0x04, 0x80, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x10, 0x40, 0x12, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x84,
+   0x24, 0x40, 0x22, 0xa8, 0x02, 0x14, 0x84, 0x92, 0x40, 0x42, 0x12, 0x04,
+   0x10, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x11, 0x00, 0x12, 0x00,
+   0x40, 0x02, 0x00, 0x20, 0x00, 0x08, 0x00, 0xaa, 0x02, 0x54, 0x85, 0x24,
+   0x00, 0x10, 0x12, 0x00, 0x00, 0x81, 0x44, 0x00, 0x90, 0x5a, 0x00, 0xea,
+   0x1b, 0x00, 0x80, 0x40, 0x40, 0x02, 0x00, 0x08, 0x00, 0x20, 0xa2, 0x05,
+   0x8a, 0xb4, 0x6e, 0x45, 0x12, 0x04, 0x08, 0x00, 0x00, 0x00, 0x10, 0x02,
+   0xa8, 0x92, 0x00, 0xda, 0x5f, 0x10, 0x00, 0x10, 0xa1, 0x04, 0x20, 0x41,
+   0x02, 0x00, 0x5a, 0x25, 0xa0, 0xff, 0xfb, 0x05, 0x41, 0x02, 0x04, 0x00,
+   0x00, 0x08, 0x40, 0x80, 0xec, 0x9b, 0xec, 0xfe, 0x7f, 0x01, 0x04, 0x20,
+   0x90, 0x02, 0x04, 0x00, 0x08, 0x20, 0xfb, 0x2e, 0xf5, 0xff, 0xff, 0x57,
+   0x00, 0x04, 0x02, 0x00, 0x00, 0x20, 0x01, 0xc1, 0x6e, 0xab, 0xfa, 0xff,
+   0xff, 0x05, 0x90, 0x20, 0x48, 0x02, 0x00, 0x04, 0x20, 0xa8, 0xdf, 0xb5,
+   0xfe, 0xff, 0xff, 0x0b, 0x01, 0x00, 0x01, 0x00, 0x80, 0x80, 0x04, 0xe0,
+   0xbb, 0xef, 0xff, 0xff, 0x7f, 0x01, 0x00, 0x04, 0x48, 0x02, 0x00, 0x20,
+   0x80, 0xf4, 0x6f, 0xfb, 0xff, 0xff, 0xff, 0x20, 0x90, 0x40, 0x02, 0x00,
+   0x00, 0x04, 0x08, 0xb8, 0xf6, 0xff, 0xff, 0xdf, 0xbe, 0x12, 0x45, 0x10,
+   0x90, 0x04, 0x90, 0x00, 0x22, 0xfa, 0xff, 0xff, 0xff, 0xbb, 0xd7, 0xe9,
+   0x3a, 0x02, 0x02, 0x00, 0x04, 0x90, 0x80, 0xfe, 0xdf, 0xf6, 0xb7, 0xef,
+   0xbe, 0x56, 0x57, 0x40, 0x48, 0x09, 0x00, 0x04, 0x00, 0xfa, 0xf5, 0xdf,
+   0xed, 0x5a, 0xd5, 0xea, 0xbd, 0x09, 0x00, 0x00, 0x40, 0x00, 0x92, 0xfe,
+   0xbf, 0x7d, 0xb7, 0x6a, 0x55, 0xbf, 0xf7, 0x02, 0x11, 0x01, 0x00, 0x91,
+   0x00, 0xff, 0xff, 0xaf, 0x55, 0x55, 0x5b, 0xeb, 0xef, 0x22, 0x04, 0x04,
+   0x04, 0x00, 0xa4, 0xff, 0xf7, 0xad, 0xaa, 0xaa, 0xaa, 0xbe, 0xfe, 0x03,
+   0x20, 0x00, 0x10, 0x44, 0x80, 0xff, 0x7f, 0x55, 0x12, 0x91, 0x2a, 0xeb,
+   0xbf, 0x0b, 0x82, 0x02, 0x00, 0x00, 0xd1, 0x7f, 0xdf, 0xa2, 0xa4, 0x54,
+   0x55, 0xfd, 0xfd, 0x47, 0x08, 0x08, 0x00, 0x21, 0xe4, 0xff, 0x37, 0x11,
+   0x09, 0xa5, 0xaa, 0xb6, 0xff, 0x0d, 0x80, 0x00, 0x00, 0x04, 0xd0, 0xff,
+   0x4f, 0x44, 0x20, 0x48, 0x55, 0xfb, 0xff, 0x27, 0x11, 0x02, 0x40, 0x40,
+   0xe2, 0xfb, 0x15, 0x11, 0x4a, 0x55, 0x4a, 0x7d, 0xf7, 0x0f, 0x00, 0x00,
+   0x04, 0x08, 0xf8, 0xdf, 0x52, 0x44, 0x01, 0x52, 0xb5, 0xfa, 0xff, 0x0f,
+   0x49, 0x02, 0x00, 0x02, 0xe9, 0xf6, 0x0a, 0x11, 0xa4, 0x88, 0x4a, 0x6d,
+   0xff, 0x5f, 0x00, 0x00, 0x10, 0x20, 0xf0, 0x2f, 0x21, 0x44, 0x10, 0x52,
+   0xb5, 0xfa, 0xff, 0x0f, 0x44, 0x04, 0x80, 0x08, 0xf8, 0xab, 0x8a, 0x00,
+   0x81, 0xa4, 0xd4, 0xd6, 0xfe, 0x2f, 0x00, 0x00, 0x04, 0x40, 0xb5, 0x2d,
+   0x21, 0x08, 0x04, 0x90, 0xaa, 0xfa, 0xff, 0x1f, 0x11, 0x01, 0x00, 0x04,
+   0xf0, 0x57, 0x0a, 0x22, 0x40, 0x4a, 0xda, 0x5e, 0xfb, 0x1f, 0x40, 0x00,
+   0x40, 0x20, 0xba, 0x95, 0x90, 0x00, 0x01, 0xa0, 0xaa, 0xea, 0xff, 0x5f,
+   0x02, 0x02, 0x00, 0x01, 0xe8, 0x57, 0x05, 0x00, 0x00, 0x12, 0xd5, 0xfe,
+   0xfd, 0x1f, 0x48, 0x00, 0x04, 0x48, 0x7a, 0x95, 0x08, 0x02, 0x10, 0x40,
+   0xaa, 0x55, 0xf7, 0x1f, 0x00, 0x09, 0x20, 0x00, 0xf8, 0x57, 0x22, 0x10,
+   0x00, 0x28, 0xa9, 0xfa, 0xff, 0x5f, 0x02, 0x00, 0x00, 0x49, 0xdd, 0x29,
+   0x01, 0x00, 0x80, 0x80, 0xaa, 0xd7, 0xff, 0x0f, 0x10, 0x00, 0x08, 0x00,
+   0xf8, 0x96, 0x08, 0x00, 0x00, 0x20, 0x54, 0xfa, 0xee, 0x3f, 0x81, 0x04,
+   0x40, 0x24, 0xfe, 0x55, 0x82, 0x00, 0x00, 0x82, 0xd2, 0xad, 0xff, 0x0f,
+   0x08, 0x00, 0x04, 0x80, 0x6c, 0x97, 0x00, 0x00, 0x02, 0x20, 0xa9, 0xf6,
+   0xdf, 0x5f, 0x00, 0x02, 0x20, 0x09, 0xfa, 0x49, 0x12, 0x00, 0x20, 0x84,
+   0x54, 0xdb, 0xfe, 0x1f, 0x91, 0x00, 0x00, 0x00, 0xf8, 0x2b, 0x00, 0x20,
+   0x00, 0x40, 0xa4, 0xf6, 0xbb, 0x1f, 0x04, 0x00, 0x44, 0x92, 0x7e, 0x95,
+   0x02, 0x00, 0x00, 0x89, 0xaa, 0xdd, 0xff, 0x1f, 0x20, 0x09, 0x10, 0x00,
+   0xf4, 0x57, 0x20, 0x01, 0x08, 0x20, 0xa9, 0x76, 0xff, 0x5f, 0x02, 0x00,
+   0x00, 0x21, 0xfc, 0x4a, 0x05, 0x00, 0x01, 0x80, 0x54, 0xdb, 0xff, 0x1e,
+   0x08, 0x02, 0x04, 0x08, 0xf9, 0x2b, 0x00, 0x00, 0x40, 0x28, 0xd2, 0xf6,
+   0xff, 0xbf, 0x80, 0x00, 0x90, 0x00, 0xbc, 0x92, 0x08, 0x10, 0x00, 0x82,
+   0x54, 0xdb, 0xff, 0x1f, 0x20, 0x00, 0x00, 0x44, 0xf9, 0x55, 0x02, 0x01,
+   0x00, 0x20, 0xaa, 0xbd, 0xfd, 0x3f, 0x08, 0x04, 0x04, 0x10, 0xf4, 0x2a,
+   0x01, 0x00, 0x22, 0x80, 0xd4, 0xf6, 0xff, 0x5f, 0x82, 0x00, 0x40, 0x02,
+   0xf8, 0x55, 0x20, 0x00, 0x00, 0x50, 0x6a, 0xdf, 0xfe, 0x3f, 0x00, 0x00,
+   0x00, 0x48, 0xe9, 0x4a, 0x05, 0x08, 0x00, 0xa5, 0xd5, 0xf5, 0xff, 0x3f,
+   0x10, 0x01, 0x10, 0x01, 0xb0, 0xab, 0x92, 0x02, 0x40, 0xf8, 0xbf, 0xde,
+   0xfe, 0x5f, 0x02, 0x04, 0x04, 0x48, 0xfa, 0xd4, 0x6f, 0x20, 0x84, 0xef,
+   0xff, 0xfb, 0xff, 0x1f, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xed, 0xbf, 0x0b,
+   0xa1, 0x7e, 0xff, 0xbf, 0xfd, 0x5f, 0x04, 0x01, 0x20, 0x49, 0xd2, 0xfb,
+   0xfe, 0x55, 0xd4, 0xff, 0xff, 0xf6, 0xff, 0x07, 0x00, 0x04, 0x00, 0x00,
+   0xc0, 0xaa, 0xfb, 0x2b, 0xa2, 0xfe, 0xff, 0xdf, 0xee, 0x1f, 0x91, 0x00,
+   0x82, 0xa4, 0xa4, 0xf5, 0xff, 0x57, 0xd5, 0xff, 0xbf, 0xfd, 0xff, 0x4d,
+   0x00, 0x00, 0x20, 0x00, 0x88, 0x5b, 0xff, 0x2f, 0x69, 0xff, 0xff, 0xdb,
+   0xfe, 0x1f, 0x24, 0x02, 0x00, 0x49, 0xa2, 0xd6, 0xff, 0x5f, 0xea, 0xff,
+   0x7f, 0x7f, 0x7f, 0x0d, 0x00, 0x00, 0x10, 0x00, 0x40, 0xab, 0xf7, 0xbb,
+   0xf0, 0xdf, 0xff, 0xd5, 0xff, 0xbf, 0x82, 0x04, 0x42, 0x24, 0x91, 0xd5,
+   0xaa, 0xae, 0xd4, 0xaa, 0x52, 0x7b, 0xff, 0x15, 0x08, 0x00, 0x00, 0x01,
+   0x04, 0x55, 0xd5, 0x55, 0x70, 0x5b, 0x75, 0xdd, 0xdf, 0x1f, 0x40, 0x00,
+   0x08, 0x48, 0xa0, 0x4a, 0xa9, 0x56, 0xea, 0x56, 0xad, 0x6a, 0x7d, 0x9b,
+   0x04, 0x01, 0x00, 0x02, 0x42, 0x2a, 0xd5, 0xaa, 0xa8, 0xaa, 0xaa, 0xfa,
+   0xdf, 0x2f, 0x10, 0x04, 0x22, 0x48, 0x08, 0x45, 0x2a, 0x15, 0x68, 0x55,
+   0x55, 0xd7, 0x76, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x40, 0x2a, 0x80, 0xa0,
+   0xb2, 0x09, 0x48, 0xb9, 0xdf, 0x17, 0x22, 0x01, 0x00, 0x24, 0x45, 0x8a,
+   0x24, 0x4a, 0x54, 0x51, 0x91, 0xf6, 0x6e, 0x4b, 0x00, 0x04, 0x90, 0x00,
+   0x80, 0x52, 0x00, 0x20, 0x69, 0x05, 0xa4, 0xaa, 0xff, 0x1e, 0x48, 0x00,
+   0x02, 0x92, 0x08, 0x05, 0x81, 0x94, 0xd4, 0x92, 0x40, 0xfd, 0xb6, 0x8b,
+   0x00, 0x01, 0x40, 0x00, 0x82, 0x54, 0x00, 0x48, 0x68, 0x05, 0x90, 0xa4,
+   0xef, 0x06, 0x24, 0x00, 0x08, 0x12, 0x10, 0x05, 0x00, 0x10, 0xb5, 0x01,
+   0x42, 0xfb, 0xbf, 0x43, 0x00, 0x09, 0x00, 0x40, 0x81, 0xa8, 0x08, 0x4a,
+   0xaa, 0x96, 0x90, 0xac, 0x6d, 0x15, 0x22, 0x00, 0x20, 0x09, 0x04, 0x15,
+   0x80, 0x28, 0xdc, 0x01, 0x24, 0xfb, 0xbf, 0x01, 0x80, 0x04, 0x09, 0x00,
+   0x40, 0x48, 0x02, 0x45, 0xb2, 0x2e, 0x41, 0x6d, 0xef, 0x05, 0x11, 0x00,
+   0x40, 0x52, 0x02, 0x15, 0x29, 0x2a, 0xac, 0x42, 0x54, 0xfb, 0x3b, 0x51,
+   0x84, 0x00, 0x08, 0x00, 0x20, 0x54, 0x80, 0x05, 0xb5, 0x3d, 0xa2, 0xb6,
+   0xdf, 0x00, 0x20, 0x04, 0x20, 0x49, 0x89, 0xa8, 0x6a, 0x29, 0xac, 0xd6,
+   0x54, 0xff, 0x3f, 0x84, 0x00, 0x01, 0x04, 0x10, 0x00, 0x94, 0xa8, 0x56,
+   0xda, 0x5f, 0xab, 0xd5, 0x1e, 0x10, 0x48, 0x00, 0x90, 0x82, 0x48, 0xa8,
+   0xb2, 0xac, 0xfd, 0x55, 0xd5, 0xfe, 0x9f, 0x80, 0x00, 0x0a, 0x02, 0x08,
+   0x02, 0x55, 0x5a, 0x75, 0xff, 0xaf, 0xb6, 0xf7, 0x2d, 0x12, 0x92, 0x00,
+   0x10, 0x20, 0x10, 0xa8, 0x54, 0xd5, 0xbf, 0x5d, 0xad, 0xdd, 0x0f, 0x00,
+   0x00, 0x04, 0x40, 0x09, 0x84, 0xa8, 0xaa, 0x5a, 0xed, 0xeb, 0x6a, 0xff,
+   0x9f, 0xa4, 0x24, 0x01, 0x02, 0xa0, 0x20, 0x50, 0x55, 0xd5, 0xbe, 0xae,
+   0xad, 0xfd, 0x16, 0x00, 0x10, 0x04, 0x20, 0x0a, 0x08, 0xb4, 0xaa, 0x95,
+   0xaa, 0x7b, 0xb7, 0xdb, 0x5f, 0x92, 0x04, 0x01, 0x84, 0x20, 0x21, 0x51,
+   0xd5, 0x2a, 0xa9, 0xee, 0xd5, 0xfe, 0x0d, 0x00, 0x20, 0x04, 0x10, 0x00,
+   0x08, 0x50, 0xe9, 0xd7, 0xd4, 0xfb, 0xb5, 0xff, 0x9f, 0x24, 0x09, 0x01,
+   0x42, 0x4a, 0xa2, 0x64, 0xd5, 0x55, 0x7b, 0x7f, 0xda, 0x7d, 0x4f, 0x00,
+   0x20, 0x04, 0x00, 0x80, 0x00, 0xa0, 0x2a, 0x13, 0x84, 0x6a, 0x55, 0xff,
+   0x1d, 0x48, 0x8a, 0x00, 0x94, 0x24, 0x8a, 0xc8, 0xaa, 0x42, 0x20, 0x5d,
+   0xf5, 0xff, 0x5f, 0x01, 0x00, 0x02, 0x01, 0x00, 0x20, 0xa2, 0x4a, 0x1a,
+   0x82, 0x56, 0xda, 0xbd, 0x3f, 0x92, 0x92, 0x00, 0x90, 0x92, 0x00, 0x40,
+   0x95, 0x6a, 0xf4, 0x55, 0x6d, 0xff, 0xd6, 0x00, 0x00, 0x0a, 0x04, 0x20,
+   0x14, 0x49, 0x4b, 0xaa, 0xaa, 0x56, 0xf5, 0xff, 0xbf, 0xab, 0xa4, 0x00,
+   0x20, 0x89, 0x40, 0x80, 0xaa, 0xaa, 0xaa, 0xaa, 0xde, 0xbf, 0xeb, 0x03,
+   0x00, 0x02, 0x04, 0x02, 0x0a, 0x10, 0x2b, 0x2a, 0x55, 0x5b, 0xf5, 0xff,
+   0xd7, 0x2f, 0x92, 0x00, 0x10, 0x28, 0x21, 0x01, 0x56, 0x95, 0xa0, 0x56,
+   0xdf, 0xef, 0xea, 0x87, 0x40, 0x0a, 0x42, 0x41, 0x00, 0x90, 0xaa, 0x52,
+   0xb6, 0xad, 0xfa, 0xff, 0xd5, 0x2f, 0x14, 0x00, 0x00, 0x04, 0x95, 0x04,
+   0xaa, 0xac, 0x55, 0x6b, 0xff, 0xb7, 0xea, 0x9f, 0x40, 0x02, 0x28, 0x51,
+   0x00, 0x40, 0x58, 0xd5, 0xda, 0xd6, 0x6e, 0x7f, 0xf9, 0x3f, 0x12, 0x04,
+   0x02, 0x04, 0x49, 0x25, 0x55, 0xaa, 0x77, 0xab, 0xff, 0x2b, 0xfd, 0x3f,
+   0x48, 0x01, 0x20, 0x41, 0x00, 0x00, 0x58, 0xa9, 0xda, 0xea, 0xfd, 0xaf,
+   0xfa, 0xff, 0x02, 0x04, 0x08, 0x14, 0x29, 0x49, 0x52, 0x55, 0x55, 0x55,
+   0xff, 0x8d, 0xfe, 0x3f, 0xa8, 0x00, 0x02, 0x41, 0x00, 0x02, 0xa0, 0xa2,
+   0xaa, 0xea, 0xff, 0x53, 0xfd, 0xff, 0x02, 0x04, 0x50, 0x04, 0x25, 0xa8,
+   0x54, 0x49, 0x52, 0xb5, 0xbf, 0x8a, 0xfe, 0xff, 0xa9, 0x08, 0x04, 0x50,
+   0x80, 0x02, 0xa1, 0x2a, 0x95, 0xea, 0xff, 0xa1, 0xff, 0xff, 0x03, 0x02,
+   0x90, 0x02, 0x09, 0x08, 0x44, 0x49, 0x52, 0xbd, 0x7f, 0xca, 0xff, 0xff,
+   0x2b, 0x09, 0x04, 0x48, 0x40, 0x82, 0x90, 0x56, 0xa9, 0xf6, 0xbf, 0xd0,
+   0xff, 0xff, 0x47, 0x00, 0x50, 0x02, 0x15, 0x11, 0x40, 0x95, 0xaa, 0xfd,
+   0x2f, 0xe9, 0xff, 0xff, 0x8f, 0x0a, 0x84, 0x50, 0x40, 0x84, 0x14, 0xaa,
+   0x6a, 0xff, 0x5f, 0xf2, 0xff, 0xff, 0x7f, 0x00, 0x10, 0x02, 0x09, 0x10,
+   0x40, 0x7d, 0xf7, 0xff, 0x0b, 0xfc, 0xff, 0xff, 0xaf, 0x02, 0x84, 0x50,
+   0x42, 0x85, 0x12, 0xd0, 0xdd, 0xff, 0xa7, 0xf2, 0xff, 0xff, 0xff, 0x04,
+   0x00, 0x0a, 0x08, 0x10, 0x48, 0xf8, 0xff, 0xff, 0x0a, 0xfe, 0xff, 0xff,
+   0x7f, 0x03, 0xa4, 0x80, 0xa2, 0x8a, 0x02, 0x68, 0xff, 0xff, 0x52, 0xfd,
+   0xff, 0xff, 0xff, 0x07, 0x00, 0x2a, 0x08, 0x20, 0x28, 0xdc, 0xff, 0x5f,
+   0x05, 0xff, 0xff, 0xff, 0xff, 0x0d, 0x92, 0x40, 0x22, 0x09, 0x02, 0xea,
+   0xfb, 0xaf, 0x48, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x12, 0x81, 0xa0,
+   0x48, 0x9c, 0x6e, 0x93, 0xa2, 0xff, 0xff, 0xff, 0xff, 0x07, 0xa8, 0x40,
+   0x28, 0x0a, 0x02, 0x74, 0xb5, 0x45, 0x81, 0xff, 0xff, 0xff, 0xff, 0x0f,
+   0x02, 0x0a, 0x81, 0x20, 0x08, 0xae, 0xaa, 0x90, 0xe8, 0xff, 0xff, 0xff,
+   0xff, 0x0f, 0x90, 0x40, 0x28, 0x88, 0x12, 0x58, 0x15, 0x50, 0xd0, 0xff,
+   0xff, 0xff, 0xff, 0x0f, 0x44, 0x0a, 0x41, 0x21, 0x08, 0xae, 0x04, 0x14,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x10, 0x40, 0x14, 0x88, 0x04, 0xba,
+   0x02, 0x28, 0xe8, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x42, 0x15, 0x41, 0x21,
+   0x05, 0xad, 0x00, 0x05, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x10, 0x40,
+   0x24, 0x8a, 0x0e, 0x36, 0x00, 0x0a, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x0f,
+   0x42, 0x25, 0x90, 0xd0, 0x8b, 0xc2, 0x41, 0x05, 0xfc, 0xff, 0xff, 0xff,
+   0xff, 0x0f, 0x10, 0x08, 0x05, 0xe8, 0x8e, 0x58, 0x80, 0x02, 0xfa, 0xff,
+   0xff, 0xff, 0xff, 0x0f, 0x4a, 0x20, 0xa8, 0xba, 0x0b, 0x2b, 0x51, 0x01,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x8a, 0x02, 0xe8, 0xaf, 0x84,
+   0x90, 0x04, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x52, 0x21, 0x54, 0xbf,
+   0x1f, 0x15, 0xa5, 0x02, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x08,
+   0x01, 0xfa, 0xb6, 0xa4, 0x52, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+   0x4a, 0xa2, 0x54, 0xef, 0x5f, 0x4b, 0xa4, 0x80, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x0f, 0x80, 0x10, 0x82, 0xfe, 0xbf, 0x92, 0x52, 0x42, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x0f, 0x12, 0x42, 0xa8, 0xbf, 0x1f, 0x24, 0x80, 0xa0,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x84, 0x28, 0x8a, 0xf7, 0x37, 0x80,
+   0x52, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x10, 0x82, 0xe0, 0xff,
+   0x1f, 0x00, 0x20, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x84, 0x28,
+   0xca, 0xff, 0x1f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+   0x10, 0x42, 0xf0, 0xfd, 0x1b, 0x00, 0x50, 0xf0, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x0f, 0xa4, 0x10, 0xc5, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x0f, 0x00, 0x22, 0xf8, 0xff, 0x0e, 0x00, 0x00, 0xf0,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xaa, 0x88, 0xe2, 0xff, 0x0f, 0x10,
+   0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x25, 0xfa, 0xff,
+   0x0f, 0x01, 0x11, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xfb,
+   0xfb, 0xff, 0x7f, 0x5d, 0xd5, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f};
diff --git a/src/tk/library/demos/bitmaps/flagdown b/src/tk/library/demos/bitmaps/flagdown
new file mode 100644 (file)
index 0000000..55abc51
--- /dev/null
@@ -0,0 +1,27 @@
+#define flagdown_width 48
+#define flagdown_height 48
+static char flagdown_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xe1, 0x00, 0x00,
+   0x00, 0x00, 0x70, 0x80, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x03, 0x00,
+   0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x04,
+   0x00, 0x00, 0x03, 0x00, 0x06, 0x06, 0x00, 0x80, 0x01, 0x00, 0x06, 0x07,
+   0x00, 0xc0, 0x1f, 0x00, 0x87, 0x07, 0x00, 0xe0, 0x7f, 0x80, 0xc7, 0x07,
+   0x00, 0x70, 0xe0, 0xc0, 0xe5, 0x07, 0x00, 0x38, 0x80, 0xe1, 0x74, 0x07,
+   0x00, 0x18, 0x80, 0x71, 0x3c, 0x07, 0x00, 0x0c, 0x00, 0x3b, 0x1e, 0x03,
+   0x00, 0x0c, 0x00, 0x1f, 0x0f, 0x00, 0x00, 0x86, 0x1f, 0x8e, 0x07, 0x00,
+   0x00, 0x06, 0x06, 0xc6, 0x05, 0x00, 0x00, 0x06, 0x00, 0xc6, 0x05, 0x00,
+   0x00, 0x06, 0x00, 0xc6, 0x04, 0x00, 0x00, 0x06, 0x00, 0x06, 0x04, 0x00,
+   0x7f, 0x06, 0x00, 0x06, 0xe4, 0xff, 0x00, 0x06, 0x00, 0x06, 0x04, 0x00,
+   0x00, 0x06, 0x00, 0x06, 0x04, 0x00, 0x00, 0x06, 0x00, 0x06, 0x06, 0x00,
+   0x00, 0x06, 0x00, 0x06, 0x03, 0x00, 0x00, 0x06, 0x00, 0x86, 0x01, 0x00,
+   0x00, 0x06, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x06, 0x00, 0x66, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3e, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0x2f, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x27, 0x00, 0x00,
+   0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00,
+   0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00,
+   0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00,
+   0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00,
+   0xf7, 0xbf, 0x8e, 0xfc, 0xdf, 0xf8, 0x9d, 0xeb, 0x9b, 0x76, 0xd2, 0x7a,
+   0x46, 0x30, 0xe2, 0x0f, 0xe1, 0x47, 0x55, 0x84, 0x48, 0x11, 0x84, 0x19};
diff --git a/src/tk/library/demos/bitmaps/flagup b/src/tk/library/demos/bitmaps/flagup
new file mode 100644 (file)
index 0000000..6eb0d84
--- /dev/null
@@ -0,0 +1,27 @@
+#define flagup_width 48
+#define flagup_height 48
+static char flagup_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x00,
+   0x00, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xef, 0x6a, 0x00,
+   0x00, 0x00, 0xc0, 0x7b, 0x75, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x6a, 0x00,
+   0x00, 0x00, 0x30, 0x60, 0x75, 0x00, 0x00, 0x00, 0x18, 0xe0, 0x7f, 0x00,
+   0x00, 0x00, 0x0c, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x06, 0xe0, 0x04, 0x00,
+   0x00, 0x00, 0x03, 0xe0, 0x04, 0x00, 0x00, 0x80, 0x01, 0xe0, 0x06, 0x00,
+   0x00, 0xc0, 0x1f, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x7f, 0xe0, 0x07, 0x00,
+   0x00, 0x70, 0xe0, 0xe0, 0x05, 0x00, 0x00, 0x38, 0x80, 0xe1, 0x04, 0x00,
+   0x00, 0x18, 0x80, 0xf1, 0x04, 0x00, 0x00, 0x0c, 0x00, 0xfb, 0x04, 0x00,
+   0x00, 0x0c, 0x00, 0xff, 0x04, 0x00, 0x00, 0x86, 0x1f, 0xee, 0x04, 0x00,
+   0x00, 0x06, 0x06, 0xe6, 0x04, 0x00, 0x00, 0x06, 0x00, 0xe6, 0x04, 0x00,
+   0x00, 0x06, 0x00, 0xe6, 0x04, 0x00, 0x00, 0x06, 0x00, 0x66, 0x04, 0x00,
+   0x7f, 0x56, 0x52, 0x06, 0xe4, 0xff, 0x00, 0x76, 0x55, 0x06, 0x04, 0x00,
+   0x00, 0x56, 0x57, 0x06, 0x04, 0x00, 0x00, 0x56, 0x55, 0x06, 0x06, 0x00,
+   0x00, 0x56, 0xd5, 0x06, 0x03, 0x00, 0x00, 0x06, 0x00, 0x86, 0x01, 0x00,
+   0x54, 0x06, 0x00, 0xc6, 0x54, 0x55, 0xaa, 0x06, 0x00, 0x66, 0xaa, 0x2a,
+   0x54, 0x06, 0x00, 0x36, 0x55, 0x55, 0xaa, 0x06, 0x00, 0xbe, 0xaa, 0x2a,
+   0x54, 0xfe, 0xff, 0x6f, 0x55, 0x55, 0xaa, 0xfc, 0xff, 0xa7, 0xaa, 0x2a,
+   0x54, 0x01, 0x88, 0x60, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa0, 0xaa, 0x2a,
+   0x54, 0x55, 0x8d, 0x60, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa0, 0xaa, 0x2a,
+   0x54, 0x55, 0x8d, 0x60, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa0, 0xaa, 0x2a,
+   0x54, 0x55, 0x8d, 0x50, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa8, 0xaa, 0x2a,
+   0x54, 0x55, 0x95, 0x54, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a,
+   0x54, 0x55, 0x55, 0x55, 0x55, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/src/tk/library/demos/bitmaps/grey.25 b/src/tk/library/demos/bitmaps/grey.25
new file mode 100644 (file)
index 0000000..b234b3c
--- /dev/null
@@ -0,0 +1,6 @@
+#define grey_width 16
+#define grey_height 16
+static char grey_bits[] = {
+   0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44,
+   0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44,
+   0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44};
diff --git a/src/tk/library/demos/bitmaps/grey.5 b/src/tk/library/demos/bitmaps/grey.5
new file mode 100644 (file)
index 0000000..3768889
--- /dev/null
@@ -0,0 +1,6 @@
+#define grey_width 16
+#define grey_height 16
+static char grey_bits[] = {
+   0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa,
+   0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa,
+   0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa};
diff --git a/src/tk/library/demos/bitmaps/letters b/src/tk/library/demos/bitmaps/letters
new file mode 100644 (file)
index 0000000..0f12568
--- /dev/null
@@ -0,0 +1,27 @@
+#define letters_width 48
+#define letters_height 48
+static char letters_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20,
+   0x00, 0xfa, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2a,
+   0x00, 0x3a, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2e,
+   0xe0, 0xff, 0xff, 0xff, 0xff, 0x21, 0x20, 0x00, 0x00, 0x00, 0x00, 0x21,
+   0xa0, 0x03, 0x00, 0x00, 0x70, 0x21, 0x20, 0x00, 0x00, 0x00, 0x50, 0x21,
+   0xa0, 0x1f, 0x00, 0x00, 0x50, 0x21, 0x20, 0x00, 0x00, 0x00, 0x70, 0x21,
+   0xfe, 0xff, 0xff, 0xff, 0x0f, 0x21, 0x02, 0x00, 0x00, 0x00, 0x08, 0x21,
+   0xfa, 0x01, 0x00, 0x80, 0x0b, 0x21, 0x02, 0x00, 0x00, 0x80, 0x0a, 0x21,
+   0xba, 0x01, 0x00, 0x80, 0x0a, 0x21, 0x02, 0x00, 0x00, 0x80, 0x0b, 0x21,
+   0x3a, 0x00, 0x00, 0x00, 0x08, 0x21, 0x02, 0x00, 0x00, 0x00, 0x08, 0x21,
+   0x02, 0xc0, 0xfb, 0x03, 0x08, 0x21, 0x02, 0x00, 0x00, 0x00, 0x08, 0x3f,
+   0x02, 0xc0, 0xbd, 0x0f, 0x08, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01,
+   0x02, 0xc0, 0x7f, 0x7b, 0x08, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01,
+   0x02, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00,
+   0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00,
+   0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/src/tk/library/demos/bitmaps/noletters b/src/tk/library/demos/bitmaps/noletters
new file mode 100644 (file)
index 0000000..5774124
--- /dev/null
@@ -0,0 +1,27 @@
+#define noletters_width 48
+#define noletters_height 48
+static char noletters_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00,
+   0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00,
+   0x00, 0xf0, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x7f, 0x00,
+   0x00, 0x3e, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x01,
+   0x80, 0x07, 0x00, 0x00, 0xc0, 0x03, 0xc0, 0x03, 0x00, 0x00, 0xe0, 0x07,
+   0xe0, 0x01, 0x00, 0x00, 0xf0, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x78, 0x0e,
+   0xf0, 0x00, 0x00, 0x00, 0x3c, 0x1e, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x1c,
+   0x38, 0x00, 0x00, 0x00, 0x0f, 0x38, 0x38, 0x00, 0x00, 0x80, 0x07, 0x38,
+   0x3c, 0xfc, 0xff, 0xff, 0x7f, 0x78, 0x1c, 0x04, 0x00, 0xe0, 0x41, 0x70,
+   0x1c, 0x04, 0x00, 0xf0, 0x40, 0x70, 0x1c, 0x74, 0x00, 0x78, 0x4e, 0x70,
+   0x0e, 0x04, 0x00, 0x3c, 0x4a, 0xe0, 0x0e, 0x74, 0x03, 0x1e, 0x4a, 0xe0,
+   0x0e, 0x04, 0x00, 0x0f, 0x4e, 0xe0, 0x0e, 0x04, 0x80, 0x07, 0x40, 0xe0,
+   0x0e, 0x04, 0xf8, 0x0f, 0x40, 0xe0, 0x0e, 0x04, 0xe0, 0x01, 0x40, 0xe0,
+   0x0e, 0x04, 0xf8, 0x00, 0x40, 0xe0, 0x0e, 0x04, 0x78, 0x00, 0x40, 0xe0,
+   0x0e, 0x04, 0xfc, 0xf3, 0x40, 0xe0, 0x1c, 0x04, 0x1e, 0x00, 0x40, 0x70,
+   0x1c, 0x04, 0x0f, 0x00, 0x40, 0x70, 0x1c, 0x84, 0x07, 0x00, 0x40, 0x70,
+   0x3c, 0xfc, 0xff, 0xff, 0x7f, 0x78, 0x38, 0xe0, 0x01, 0x00, 0x00, 0x38,
+   0x38, 0xf0, 0x00, 0x00, 0x00, 0x38, 0x70, 0x78, 0x00, 0x00, 0x00, 0x1c,
+   0xf0, 0x3c, 0x00, 0x00, 0x00, 0x1e, 0xe0, 0x1e, 0x00, 0x00, 0x00, 0x0e,
+   0xe0, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x07, 0x00, 0x00, 0x80, 0x07,
+   0x80, 0x07, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x01,
+   0x00, 0x3e, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x7f, 0x00,
+   0x00, 0xf0, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00,
+   0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00};
diff --git a/src/tk/library/demos/bitmaps/pattern b/src/tk/library/demos/bitmaps/pattern
new file mode 100644 (file)
index 0000000..df31baf
--- /dev/null
@@ -0,0 +1,6 @@
+#define foo_width 16
+#define foo_height 16
+static char foo_bits[] = {
+   0x60, 0x06, 0x90, 0x09, 0x90, 0x09, 0xb0, 0x0d, 0x4e, 0x72, 0x49, 0x92,
+   0x71, 0x8e, 0x8e, 0x71, 0x8e, 0x71, 0x71, 0x8e, 0x49, 0x92, 0x4e, 0x72,
+   0xb0, 0x0d, 0x90, 0x09, 0x90, 0x09, 0x60, 0x06};
diff --git a/src/tk/library/demos/browse b/src/tk/library/demos/browse
new file mode 100755 (executable)
index 0000000..7a94b98
--- /dev/null
@@ -0,0 +1,45 @@
+#!/usr/local/bin/wish -f
+#
+# This script generates a directory browser, which lists the working
+# directory and allows you to open files or subdirectories by
+# double-clicking.
+
+# Create a scrollbar on the right side of the main window and a listbox
+# on the left side.
+
+scrollbar .scroll -command ".list yview"
+listbox .list -yscroll ".scroll set" -relief raised -geometry 20x20
+pack append . .scroll {right filly} .list {left expand fill}
+
+# The procedure below is invoked to open a browser on a given file;  if the
+# file is a directory then another instance of this program is invoked; if
+# the file is a regular file then the Mx editor is invoked to display
+# the file.
+
+proc browse {dir file} {
+    if {[string compare $dir "."] != 0} {set file $dir/$file}
+    if [file isdirectory $file] {
+       exec browse $file &
+    } else {
+       if [file isfile $file] {
+           exec xedit $file &
+       } else {
+           puts stdout "\"$file\" isn't a directory or regular file"
+       }
+    }
+}
+
+# Fill the listbox with a list of all the files in the directory (run
+# the "ls" command to get that information).
+
+if $argc>0 {set dir [lindex $argv 0]} else {set dir "."}
+foreach i [exec ls -a $dir] {
+    .list insert end $i
+}
+
+# Set up bindings for the browser.
+
+bind .list <Control-q> {destroy .}
+bind .list <Control-c> {destroy .}
+focus .list
+bind .list <Double-Button-1> {foreach i [selection get] {browse $dir $i}}
diff --git a/src/tk/library/demos/color b/src/tk/library/demos/color
new file mode 100755 (executable)
index 0000000..cfef8ac
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/local/bin/wish -f
+#
+# Simple script to change colors of a window.
+
+if "$argc < 3" {error "Usage: color appName window option"}
+set appName [lindex $argv 0]
+set widget [lindex $argv 1]
+set option [lindex $argv 2]
+set red 0
+set green 0
+set blue 0
+
+option add *Scale.sliderForeground "#cdb79e"
+option add *Scale.activeForeground "#ffe4c4"
+pack append . [scale .red -command "color red" -label "Red Intensity" \
+       -from 0 -to 255 -orient horizontal -bg "#ffaeb9" -length 250] \
+       {top expand fill}
+pack append . [scale .green -command "color green" -label "Green Intensity" \
+       -from 0 -to 255 -orient horizontal -bg "#43cd80"] {top expand fill}
+pack append . [scale .blue -command "color blue" -label "Blue Intensity" \
+       -from 0 -to 255 -orient horizontal -bg "#7ec0ee"] {top expand fill}
+
+proc color {which intensity} {
+    global red green blue appName widget option
+    set $which $intensity
+    send $appName $widget config $option \
+           [format #%02x%02x%02x $red $green $blue]
+}
+
+bind . <Control-q> {destroy .}
+bind . <Control-c> {destroy .}
+focus .
diff --git a/src/tk/library/demos/dialog b/src/tk/library/demos/dialog
new file mode 100755 (executable)
index 0000000..ee48b13
--- /dev/null
@@ -0,0 +1,54 @@
+#!/usr/local/bin/wish -f
+#
+# This script generates a sample dialog box that waits for one of three
+# buttons to be pressed, then prints a message and exits.
+
+# Create two frames in the main window. The top frame will hold the
+# message and the bottom one will hold the buttons.  Arrange them
+# on above the other, with any extra vertical space split between
+# them.
+
+frame .top -relief raised -border 1
+frame .bot -relief raised -border 1
+pack append . .top {top fill expand} .bot {top fill expand}
+
+# Create the message widget and arrange for it to be centered in the
+# top frame.
+
+message .top.msg -text "File main.c hasn't been saved to disk since \
+it was last modified.  What should I do?" -justify center \
+-font -Adobe-helvetica-medium-r-normal--*-240* -aspect 200
+pack append .top .top.msg {top padx 5 pady 5 expand}
+
+# Create the buttons and arrange them from left to right in the bottom
+# frame.  Embed the left button in an additional sunken frame to indicate
+# that it is the default button.
+
+frame .bot.left -relief sunken -border 1
+pack append .bot .bot.left {left expand padx 20 pady 20}
+button .bot.left.button -text "Save File" -command "quit save"
+pack append .bot.left .bot.left.button {expand padx 12 pady 12}
+button .bot.middle -text "Quit Anyway" -command "quit quit"
+pack append .bot .bot.middle {left expand padx 20}
+button .bot.right -text "Return To Editor" -command "quit return"
+pack append .bot .bot.right {left expand padx 20}
+
+# The procedure below is invoked as the action for each of the buttons.
+# It prints a message and exits by destroying the application's main
+# window.
+
+proc quit button {
+    puts stdout "You pressed the \"$button\" button;  bye-bye!"
+    destroy .
+}
+
+bind .top <Enter> {.bot.left.button activate}
+bind .top.msg <Enter> {.bot.left.button activate}
+bind .bot <Enter> {.bot.left.button activate}
+bind .top <Leave> {.bot.left.button deactivate}
+bind .top.msg <Leave> {.bot.left.button deactivate}
+bind .bot <Leave> {.bot.left.button deactivate}
+bind . <1> {.bot.left.button config -relief sunken}
+bind . <ButtonRelease-1> {quit save}
+focus .
+bind . <Return> {quit save}
diff --git a/src/tk/library/demos/hello b/src/tk/library/demos/hello
new file mode 100755 (executable)
index 0000000..5fe0a5e
--- /dev/null
@@ -0,0 +1,12 @@
+#!/usr/local/bin/wish -f
+# Simple Tk script to create a button that prints "Hello, world".
+# Click on the button to terminate the program.
+# 
+# The first line below creates the button, and the second line
+# arranges for packer to manage the button's geometry, centering
+# it in the application's main window.
+
+button .hello -text "Hello, world" -command {
+    puts stdout "Hello, world"; destroy .
+}
+pack append . .hello {top}
diff --git a/src/tk/library/demos/ixset b/src/tk/library/demos/ixset
new file mode 100755 (executable)
index 0000000..2b5187a
--- /dev/null
@@ -0,0 +1,336 @@
+#!/usr/local/bin/wish -f
+
+#
+# A nice interface to "xset" to change X server settings
+#
+# History :
+#   91/11/23 : pda@masi.ibp.fr, jt@ratp.fr : design
+#   92/08/01 : pda@masi.ibp.fr : cleaning
+#
+
+#
+# Button actions
+#
+
+proc quit {} {
+    destroy .
+}
+
+proc ok {} {
+    writesettings
+    quit
+}
+
+proc cancel {} {
+    readsettings
+    dispsettings
+}
+
+# apply is just "writesettings"
+
+
+#
+# Read current settings
+#
+
+proc readsettings {} {
+    global kbdrep ;    set kbdrep      "on"
+    global kbdcli ;    set kbdcli      0
+    global bellvol ;   set bellvol     100
+    global bellpit ;   set bellpit     440
+    global belldur ;   set belldur     100
+    global mouseacc ;  set mouseacc    "3/1"
+    global mousethr ;  set mousethr    4
+    global screenbla ; set screenbla   "blank"
+    global screentim ; set screentim   600
+    global screencyc ; set screencyc   600
+
+    set xfd [open "|xset q" r]
+    while {[gets $xfd line] > -1} {
+       set kw [lindex $line 0]
+
+       case $kw in {
+           {auto}
+               {
+                   set rpt [lindex $line 1]
+                   if {[expr "{$rpt} == {repeat:}"]} then {
+                       set kbdrep [lindex $line 2]
+                       set kbdcli [lindex $line 6]
+                   }
+               }
+           {bell}
+               {
+                   set bellvol [lindex $line 2]
+                   set bellpit [lindex $line 5]
+                   set belldur [lindex $line 8]
+               }
+           {acceleration:}
+               {
+                   set mouseacc [lindex $line 1]
+                   set mousethr [lindex $line 3]
+               }
+           {prefer}
+               {
+                   set bla [lindex $line 2]
+                   set screenbla [expr "{$bla} == {yes} ? {blank} : {noblank}"]
+               }
+           {timeout:}
+               {
+                   set screentim [lindex $line 1]
+                   set screencyc [lindex $line 3]
+               }
+       }
+    }
+    close $xfd
+
+    # puts stdout [format "Key REPEAT = %s\n" $kbdrep]
+    # puts stdout [format "Key CLICK  = %s\n" $kbdcli]
+    # puts stdout [format "Bell VOLUME = %s\n" $bellvol]
+    # puts stdout [format "Bell PITCH = %s\n" $bellpit]
+    # puts stdout [format "Bell DURATION = %s\n" $belldur]
+    # puts stdout [format "Mouse ACCELERATION = %s\n" $mouseacc]
+    # puts stdout [format "Mouse THRESHOLD = %s\n" $mousethr]
+    # puts stdout [format "Screen BLANCK = %s\n" $screenbla]
+    # puts stdout [format "Screen TIMEOUT = %s\n" $screentim]
+    # puts stdout [format "Screen CYCLE = %s\n" $screencyc]
+}
+
+
+#
+# Write settings into the X server
+#
+
+proc writesettings {} {
+    global kbdrep kbdcli  bellvol bellpit belldur
+    global mouseacc mousethr  screenbla screentim screencyc
+
+    set bellvol                [.bell.vol get]
+    set bellpit                [.bell.val.pit.entry get]
+    set belldur                [.bell.val.dur.entry get]
+
+    if {[expr "{$kbdrep} == {on}"]} then {
+       set kbdcli      [.kbd.val.cli get]
+    } else {
+       set kbdcli      "off"
+    }
+
+    set mouseacc       [.mouse.hor.acc.entry get]
+    set mousethr       [.mouse.hor.thr.entry get]
+
+    set screentim      [.screen.val.le.tim.entry get]
+    set screencyc      [.screen.val.le.cyc.entry get]
+
+    exec xset \
+       b $bellvol $bellpit $belldur \
+       c $kbdcli \
+       r $kbdrep \
+       m $mouseacc $mousethr \
+       s $screentim $screencyc \
+       s $screenbla
+}
+
+
+#
+# Sends all settings to the window
+#
+
+proc dispsettings {} {
+    global kbdrep kbdcli  bellvol bellpit belldur
+    global mouseacc mousethr  screenbla screentim screencyc
+
+    .bell.vol set $bellvol
+    .bell.val.pit.entry delete 0 end
+    .bell.val.pit.entry insert 0 $bellpit
+    .bell.val.dur.entry delete 0 end
+    .bell.val.dur.entry insert 0 $belldur
+
+    .kbd.val.onoff [expr "{$kbdrep} == {on} ? {select} : {deselect}"]
+    .kbd.val.cli set $kbdcli
+
+    .mouse.hor.acc.entry delete 0 end
+    .mouse.hor.acc.entry insert 0 $mouseacc
+    .mouse.hor.thr.entry delete 0 end
+    .mouse.hor.thr.entry insert 0 $mousethr
+
+    .screen.val.rb.blank [expr "{$screenbla}=={blank} ? {select} : {deselect}"]
+    .screen.val.rb.pat   [expr "{$screenbla}!={blank} ? {select} : {deselect}"]
+    .screen.val.le.tim.entry delete 0 end
+    .screen.val.le.tim.entry insert 0 $screentim
+    .screen.val.le.cyc.entry delete 0 end
+    .screen.val.le.cyc.entry insert 0 $screencyc
+}
+
+
+#
+# Create all windows, and pack them
+#
+
+proc labelentry {path text length} {
+    frame $path
+    label $path.label -text $text
+    entry $path.entry -width $length -relief sunken
+    pack append $path $path.label {left expand} $path.entry {right expand}
+}
+
+proc createwindows {} {
+    #
+    # Buttons
+    #
+
+    frame .buttons
+    button .buttons.ok         -command "ok"                   -text "Ok"
+    button .buttons.apply      -command "writesettings"        -text "Apply"
+    button .buttons.cancel     -command "cancel"               -text "Cancel"
+    button .buttons.quit       -command "quit"                 -text "Quit"
+
+    pack append .buttons \
+           .buttons.ok         {left expand pady 10} \
+           .buttons.apply      {left expand pady 10} \
+           .buttons.cancel     {left expand pady 10} \
+           .buttons.quit       {left expand pady 10}
+
+    #
+    # Bell settings
+    #
+
+    frame .bell -relief raised -borderwidth 2
+    label .bell.label  -text "Bell Settings"
+    scale .bell.vol \
+           -from 0 -to 100 -length 200 -tickinterval 20 \
+           -label "Volume (%)" -orient horizontal \
+           -bg Bisque1 -activeforeground Gray
+
+    frame .bell.val
+    labelentry .bell.val.pit "Pitch (Hz)"    6
+    labelentry .bell.val.dur "Duration (ms)" 6
+    pack append .bell.val \
+           .bell.val.pit       {left padx 10} \
+           .bell.val.dur       {right padx 10}
+
+    pack append .bell \
+           .bell.label         {top expand} \
+           .bell.vol           {top expand} \
+           .bell.val           {top expand}
+
+    #
+    # Keyboard settings
+    #
+
+    frame .kbd -relief raised -borderwidth 2
+
+    label .kbd.label -text "Keyboard Repeat Settings"
+
+    frame .kbd.val
+    checkbutton .kbd.val.onoff \
+           -text "On" \
+           -onvalue "on" -offvalue "off" -variable kbdrep \
+           -relief flat \
+           -activebackground Bisque1
+    scale .kbd.val.cli \
+           -from 0 -to 100 -length 200 -tickinterval 20 \
+           -label "Click Volume (%)" -orient horizontal \
+           -bg Bisque1 -activeforeground Gray
+    pack append .kbd.val \
+           .kbd.val.onoff      {left expand fill} \
+           .kbd.val.cli        {left expand}
+
+    pack append .kbd \
+           .kbd.label          {top expand} \
+           .kbd.val            {top expand pady 4 fillx}
+
+    #
+    # Mouse settings
+    #
+
+    frame .mouse -relief raised -borderwidth 2
+
+    label .mouse.label -text "Mouse Settings"
+    frame .mouse.hor
+    labelentry .mouse.hor.acc "Acceleration" 3
+    labelentry .mouse.hor.thr "Threshold (pixels)" 3
+
+    pack append .mouse.hor \
+           .mouse.hor.acc      {left} \
+           .mouse.hor.thr      {right}
+
+    pack append .mouse \
+           .mouse.label        {top} \
+           .mouse.hor          {top expand}
+
+    #
+    # Screen Saver settings
+    #
+
+    frame .screen -relief raised -borderwidth 2
+
+    label .screen.label -text "Screen-saver Settings"
+    frame .screen.val
+
+    frame .screen.val.rb
+    radiobutton .screen.val.rb.blank \
+           -variable screenblank -text "Blank" -relief flat \
+           -value "blank" -variable screenbla \
+           -activebackground Bisque1
+    radiobutton .screen.val.rb.pat \
+           -variable screenblank -text "Pattern" -relief flat \
+           -value "noblank" -variable screenbla \
+           -activebackground Bisque1
+    pack append .screen.val.rb \
+           .screen.val.rb.blank        {top pady 4 frame w} \
+           .screen.val.rb.pat  {top pady 4 frame w}
+    frame .screen.val.le
+    labelentry .screen.val.le.tim "Timeout (s)" 5
+    labelentry .screen.val.le.cyc "Cycle (s)" 5
+    pack append .screen.val.le \
+           .screen.val.le.tim  {top pady 4 frame e} \
+           .screen.val.le.cyc  {top pady 4 frame e}
+
+    pack append .screen.val \
+           .screen.val.rb      {left} \
+           .screen.val.le      {left}
+
+    pack append .screen \
+           .screen.label       {top} \
+           .screen.val         {top expand}
+
+    #
+    # Main window
+    #
+
+    pack append . \
+           .buttons    {top fill} \
+           .bell       {top fill pady 10 expand} \
+           .kbd        {top fill pady 10 expand} \
+           .mouse      {top fill pady 10 expand} \
+           .screen     {top fill pady 10 expand}
+
+    #
+    # Let the user resize our window
+    #
+    wm minsize . 10 10
+}
+
+##############################################################################
+# Main program
+
+#
+# Listen what "xset" tells us...
+#
+
+readsettings
+
+#
+# Create all windows
+#
+
+createwindows
+
+#
+# Write xset parameters
+#
+
+dispsettings
+
+#
+# Now, wait for user actions...
+#
diff --git a/src/tk/library/demos/mkArrow.tcl b/src/tk/library/demos/mkArrow.tcl
new file mode 100644 (file)
index 0000000..2d1f483
--- /dev/null
@@ -0,0 +1,203 @@
+# mkArrow w
+#
+# Create a top-level window containing a canvas demonstration that
+# allows the user to experiment with arrow shapes.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+# This file implements a canvas widget that displays a large line with
+# an arrowhead and allows the shape of the arrowhead to be edited
+# interactively.  The only procedure that should be invoked from outside
+# the file is the first one, which creates the canvas.
+
+proc mkArrow {{w .arrow}} {
+    global tk_library
+    upvar #0 demo_arrowInfo v
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Arrowhead Editor Demonstration"
+    wm iconname $w "Arrow"
+    set c $w.c
+
+    frame $w.frame1 -relief raised -bd 2
+    canvas $c -width 500 -height 350 -relief raised
+    button $w.ok -text "OK" -command "destroy $w"
+    pack append $w $w.frame1 {top fill} $w.ok {bottom pady 10 frame center} \
+           $c {expand fill}
+    message $w.frame1.m -font -Adobe-Times-Medium-R-Normal-*-180-* -aspect 300 \
+           -text "This widget allows you to experiment with different widths and arrowhead shapes for lines in canvases.  To change the line width or the shape of the arrowhead, drag any of the three boxes attached to the oversized arrow.  The arrows on the right give examples at normal scale.  The text at the bottom shows the configuration options as you'd enter them for a line."
+    pack append $w.frame1 $w.frame1.m {frame center}
+
+
+    set v(a) 8
+    set v(b) 10
+    set v(c) 3
+    set v(width) 2
+    set v(motionProc) arrowMoveNull
+    set v(x1) 40
+    set v(x2) 350
+    set v(y) 150
+    set v(smallTips) {5 5 2}
+    set v(count) 0
+    if {[winfo screendepth $c] > 4} {
+       set v(bigLineStyle) "-fill SkyBlue1"
+       set v(boxStyle) "-fill {} -outline black -width 1"
+       set v(activeStyle) "-fill red -outline black -width 1"
+    } else {
+       set v(bigLineStyle) "-fill black -stipple @$tk_library/demos/bitmaps/grey.25"
+       set v(boxStyle) "-fill {} -outline black -width 1"
+       set v(activeStyle) "-fill black -outline black -width 1"
+    }
+    arrowSetup $c
+    $c bind box <Enter> "$c itemconfigure current $v(activeStyle)"
+    $c bind box <Leave> "$c itemconfigure current $v(boxStyle)"
+    $c bind box1 <1> {set demo_arrowInfo(motionProc) arrowMove1}
+    $c bind box2 <1> {set demo_arrowInfo(motionProc) arrowMove2}
+    $c bind box3 <1> {set demo_arrowInfo(motionProc) arrowMove3}
+    $c bind box <B1-Motion> "\$demo_arrowInfo(motionProc) $c %x %y"
+    bind $c <Any-ButtonRelease-1> "arrowSetup $c"
+}
+
+# The procedure below completely regenerates all the text and graphics
+# in the canvas window.  It's called when the canvas is initially created,
+# and also whenever any of the parameters of the arrow head are changed
+# interactively.  The argument is the name of the canvas widget to be
+# regenerated, and also the name of a global variable containing the
+# parameters for the display.
+
+proc arrowSetup c {
+    upvar #0 demo_arrowInfo v
+    $c delete all
+
+    # Create the arrow and outline.
+
+    eval "$c create line $v(x1) $v(y) $v(x2) $v(y) -width [expr 10*$v(width)] \
+           -arrowshape {[expr 10*$v(a)] [expr 10*$v(b)] [expr 10*$v(c)]} \
+           -arrow last $v(bigLineStyle)"
+    set xtip [expr $v(x2)-10*$v(b)]
+    set deltaY [expr 10*$v(c)+5*$v(width)]
+    $c create line $v(x2) $v(y) $xtip [expr $v(y)+$deltaY] \
+           [expr $v(x2)-10*$v(a)] $v(y) $xtip [expr $v(y)-$deltaY] \
+           $v(x2) $v(y) -width 2 -capstyle round -joinstyle round
+
+    # Create the boxes for reshaping the line and arrowhead.
+
+    eval "$c create rect [expr $v(x2)-10*$v(a)-5] [expr $v(y)-5] \
+           [expr $v(x2)-10*$v(a)+5] [expr $v(y)+5] $v(boxStyle) \
+           -tags {box1 box}"
+    eval "$c create rect [expr $xtip-5] [expr $v(y)-$deltaY-5] \
+           [expr $xtip+5] [expr $v(y)-$deltaY+5] $v(boxStyle) \
+           -tags {box2 box}"
+    eval "$c create rect [expr $v(x1)-5] [expr $v(y)-5*$v(width)-5] \
+           [expr $v(x1)+5] [expr $v(y)-5*$v(width)+5] $v(boxStyle) \
+           -tags {box3 box}"
+
+    # Create three arrows in actual size with the same parameters
+
+    $c create line [expr $v(x2)+50] 0 [expr $v(x2)+50] 1000 \
+           -width 2
+    set tmp [expr $v(x2)+100]
+    $c create line $tmp [expr $v(y)-125] $tmp [expr $v(y)-75] \
+           -width $v(width) \
+           -arrow both -arrowshape "$v(a) $v(b) $v(c)"
+    $c create line [expr $tmp-25] $v(y) [expr $tmp+25] $v(y) \
+           -width $v(width) \
+           -arrow both -arrowshape "$v(a) $v(b) $v(c)"
+    $c create line [expr $tmp-25] [expr $v(y)+75] [expr $tmp+25] \
+           [expr $v(y)+125] -width $v(width) \
+           -arrow both -arrowshape "$v(a) $v(b) $v(c)"
+
+    # Create a bunch of other arrows and text items showing the
+    # current dimensions.
+
+    set tmp [expr $v(x2)+10]
+    $c create line $tmp [expr $v(y)-5*$v(width)] \
+           $tmp [expr $v(y)-$deltaY] \
+           -arrow both -arrowshape $v(smallTips)
+    $c create text [expr $v(x2)+15] [expr $v(y)-$deltaY+5*$v(c)] \
+           -text $v(c) -anchor w
+    set tmp [expr $v(x1)-10]
+    $c create line $tmp [expr $v(y)-5*$v(width)] \
+           $tmp [expr $v(y)+5*$v(width)] \
+           -arrow both -arrowshape $v(smallTips)
+    $c create text [expr $v(x1)-15] $v(y) -text $v(width) -anchor e
+    set tmp [expr $v(y)+5*$v(width)+10*$v(c)+10]
+    $c create line [expr $v(x2)-10*$v(a)] $tmp $v(x2) $tmp \
+           -arrow both -arrowshape $v(smallTips)
+    $c create text [expr $v(x2)-5*$v(a)] [expr $tmp+5] \
+           -text $v(a) -anchor n
+    set tmp [expr $tmp+25]
+    $c create line [expr $v(x2)-10*$v(b)] $tmp $v(x2) $tmp \
+           -arrow both -arrowshape $v(smallTips)
+    $c create text [expr $v(x2)-5*$v(b)] [expr $tmp+5] \
+           -text $v(b) -anchor n
+
+    $c create text $v(x1) 310 -text "-width  $v(width)" \
+           -anchor w -font -Adobe-Helvetica-Medium-R-Normal-*-180-*
+    $c create text $v(x1) 330 -text "-arrowshape  {$v(a)  $v(b)  $v(c)}" \
+           -anchor w -font -Adobe-Helvetica-Medium-R-Normal-*-180-*
+
+    incr v(count)
+}
+
+# The procedures below are called in response to mouse motion for one
+# of the three items used to change the line width and arrowhead shape.
+# Each procedure updates one or more of the controlling parameters
+# for the line and arrowhead, and recreates the display if that is
+# needed.  The arguments are the name of the canvas widget, and the
+# x and y positions of the mouse within the widget.
+
+proc arrowMove1 {c x y} {
+    upvar #0 demo_arrowInfo v
+    set newA [expr ($v(x2)+5-[$c canvasx $x])/10]
+    if {$newA < 1} {
+       set newA 1
+    }
+    if {$newA > 25} {
+       set newA 25
+    }
+    if {$newA != $v(a)} {
+       $c move box1 [expr 10*($v(a)-$newA)] 0
+       set v(a) $newA
+    }
+}
+
+proc arrowMove2 {c x y} {
+    upvar #0 demo_arrowInfo v
+    set newB [expr ($v(x2)+5-[$c canvasx $x])/10]
+    if {$newB < 1} {
+       set newB 1
+    }
+    if {$newB > 25} {
+       set newB 25
+    }
+    set newC [expr ($v(y)+5-[$c canvasy $y]-5*$v(width))/10]
+    if {$newC < 1} {
+       set newC 1
+    }
+    if {$newC > 20} {
+       set newC 20
+    }
+    if {($newB != $v(b)) || ($newC != $v(c))} {
+       $c move box2 [expr 10*($v(b)-$newB)] [expr 10*($v(c)-$newC)]
+       set v(b) $newB
+       set v(c) $newC
+    }
+}
+
+proc arrowMove3 {c x y} {
+    upvar #0 demo_arrowInfo v
+    set newWidth [expr ($v(y)+5-[$c canvasy $y])/5]
+    if {$newWidth < 1} {
+       set newWidth 1
+    }
+    if {$newWidth > 20} {
+       set newWidth 20
+    }
+    if {$newWidth != $v(width)} {
+       $c move box3 0 [expr 5*($v(width)-$newWidth)]
+       set v(width) $newWidth
+    }
+}
diff --git a/src/tk/library/demos/mkBasic.tcl b/src/tk/library/demos/mkBasic.tcl
new file mode 100644 (file)
index 0000000..640bb24
--- /dev/null
@@ -0,0 +1,59 @@
+# mkBasic w
+#
+# Create a top-level window that displays a basic text widget.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkBasic {{w .basic}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Text Demonstration - Basic Facilities"
+    wm iconname $w "Text Basics"
+    button $w.ok -text OK -command "destroy $w"
+    text $w.t -relief raised -bd 2 -yscrollcommand "$w.s set" -setgrid true
+    scrollbar $w.s -relief flat -command "$w.t yview"
+    pack append $w $w.ok {bottom fillx} $w.s {right filly} $w.t {expand fill}
+    $w.t insert 0.0 {\
+This window is a text widget.  It displays one or more lines of text
+and allows you to edit the text.  Here is a summary of the things you
+can do to a text widget:
+
+1. Scrolling. Use the scrollbar to adjust the view in the text window.
+
+2. Scanning. Press mouse button 2 in the text window and drag up or down.
+This will drag the text at high speed to allow you to scan its contents.
+
+3. Insert text. Press mouse button 1 to set the insertion cursor, then
+type text.  What you type will be added to the widget.  You can backspace
+over what you've typed using either the backspace key, the delete key,
+or Control+h.
+
+4. Select. Press mouse button 1 and drag to select a range of characters.
+Once you've released the button, you can adjust the selection by pressing
+button 1 with the shift key down.  This will reset the end of the
+selection nearest the mouse cursor and you can drag that end of the
+selection by dragging the mouse before releasing the mouse button.
+You can double-click to select whole words, or triple-click to select
+whole lines.
+
+5. Delete. To delete text, select the characters you'd like to delete
+and type Control+d.
+
+6. Copy the selection. To copy the selection either from this window
+or from any other window or application, select what you want, click
+button 1 to set the insertion cursor, then type Control+v to copy the
+selection to the point of the insertion cursor.
+
+7. Resize the window.  This widget has been configured with the "setGrid"
+option on, so that if you resize the window it will always resize to an
+even number of characters high and wide.  Also, if you make the window
+narrow you can see that long lines automatically wrap around onto
+additional lines so that all the information is always visible.
+
+When you're finished with this demonstration, press the "OK" button
+below.}
+    $w.t mark set insert 0.0
+    bind $w <Any-Enter> "focus $w.t"
+}
diff --git a/src/tk/library/demos/mkButton.tcl b/src/tk/library/demos/mkButton.tcl
new file mode 100644 (file)
index 0000000..6fd07fb
--- /dev/null
@@ -0,0 +1,30 @@
+# mkButton w
+#
+# Create a top-level window that displays a bunch of buttons.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkButton {{w .b1}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Button Demonstration"
+    wm iconname $w "Buttons"
+    message $w.msg -font -Adobe-times-medium-r-normal--*-180* -aspect 300 \
+           -text "Four buttons are displayed below.  If you click on a button, it will change the background of the button area to the color indicated in the button.  Click the \"OK\" button when you've seen enough."
+    frame $w.frame -borderwidth 10
+    pack append $w.frame \
+       [button $w.frame.b1 -text "Peach Puff" \
+           -command "$w.frame config -bg PeachPuff1"] {top pady 4 expand} \
+       [button $w.frame.b2 -text "Light Blue" \
+           -command "$w.frame config -bg LightBlue1"] {top pady 4 expand} \
+       [button $w.frame.b3 -text "Sea Green" \
+           -command "$w.frame config -bg SeaGreen2"] {top pady 4 expand} \
+       [button $w.frame.b4 -text "Yellow" \
+           -command "$w.frame config -bg Yellow1"] {top pady 4 expand}
+    button $w.ok -text OK -command "destroy $w"
+
+    pack append $w $w.msg {top fill} $w.frame {top expand fill} \
+       $w.ok {bottom fill}
+}
diff --git a/src/tk/library/demos/mkCanvText.tcl b/src/tk/library/demos/mkCanvText.tcl
new file mode 100644 (file)
index 0000000..df5f09b
--- /dev/null
@@ -0,0 +1,110 @@
+# mkCanvText w
+#
+# Create a top-level window containing a canvas displaying a text
+# string and allowing the string to be edited and re-anchored.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkCanvText {{w .ctext}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Canvas Text Demonstration"
+    wm iconname $w "Text"
+    set c $w.c
+
+    frame $w.frame1 -relief raised -bd 2
+    canvas $c -relief raised -width 500 -height 400
+    button $w.ok -text "OK" -command "destroy $w"
+    pack append $w $w.frame1 {top fill} $w.c {expand fill} \
+           $w.ok {bottom pady 10 frame center}
+    message $w.frame1.m -font -Adobe-Times-Medium-R-Normal-*-180-* -aspect 300 \
+           -text "This window displays a string of text to demonstrate the text facilities of canvas widgets.  You can point, click, and type.  You can also select and then delete with Control-d.  You can copy the selection with Control-v.  You can click in the boxes to adjust the position of the text relative to its positioning point or change its justification."
+    pack append $w.frame1 $w.frame1.m {frame center}
+
+    set font -Adobe-helvetica-medium-r-*-240-*
+
+    $c create rectangle 245 195 255 205 -outline black -fill red
+
+    # First, create the text item and give it bindings so it can be edited.
+    
+    $c addtag text withtag [$c create text 250 200 -text "This is just a string of text to demonstrate the text facilities of canvas widgets. You can point, click, and type.  You can also select and then delete with Control-d." -width 440 -anchor n -font $font -justify left]
+    $c bind text <1> "textB1Press $c %x %y"
+    $c bind text <B1-Motion> "textB1Move $c %x %y"
+    $c bind text <Shift-1> "$c select adjust current @%x,%y"
+    $c bind text <Shift-B1-Motion> "textB1Move $c %x %y"
+    $c bind text <KeyPress> "$c insert text cursor %A"
+    $c bind text <Shift-KeyPress> "$c insert text cursor %A"
+    $c bind text <Control-h> "textBs $c"
+    $c bind text <Delete> "textBs $c"
+    $c bind text <Control-d> "$c dchars text sel.first sel.last"
+    $c bind text <Control-v> "$c insert text cursor \[selection get\]"
+
+    # Next, create some items that allow the text's anchor position
+    # to be edited.
+
+    set x 50
+    set y 50
+    set color LightSkyBlue1
+    mkTextConfig $c $x $y -anchor se $color
+    mkTextConfig $c [expr $x+30] [expr $y] -anchor s $color
+    mkTextConfig $c [expr $x+60] [expr $y] -anchor sw $color
+    mkTextConfig $c [expr $x] [expr $y+30] -anchor e $color
+    mkTextConfig $c [expr $x+30] [expr $y+30] -anchor center $color
+    mkTextConfig $c [expr $x+60] [expr $y+30] -anchor w $color
+    mkTextConfig $c [expr $x] [expr $y+60] -anchor ne $color
+    mkTextConfig $c [expr $x+30] [expr $y+60] -anchor n $color
+    mkTextConfig $c [expr $x+60] [expr $y+60] -anchor nw $color
+    set item [$c create rect [expr $x+40] [expr $y+40] [expr $x+50] [expr $y+50] \
+           -outline black -fill red]
+    $c bind $item <1> "$c itemconf text -anchor center"
+    $c create text [expr $x+45] [expr $y-5] -text {Text Position} -anchor s \
+           -font -Adobe-times-medium-r-normal--*-240-* -fill brown
+
+    # Lastly, create some items that allow the text's justification to be
+    # changed.
+    
+    set x 350
+    set y 50
+    set color SeaGreen2
+    mkTextConfig $c $x $y -justify left $color
+    mkTextConfig $c [expr $x+30] [expr $y] -justify center $color
+    mkTextConfig $c [expr $x+60] [expr $y] -justify right $color
+    $c create text [expr $x+45] [expr $y-5] -text {Justification} -anchor s \
+           -font -Adobe-times-medium-r-normal--*-240-* -fill brown
+
+    $c bind config <Enter> "textEnter $c"
+    $c bind config <Leave> "$c itemconf current -fill \$textConfigFill"
+}
+
+proc mkTextConfig {w x y option value color} {
+    set item [$w create rect [expr $x] [expr $y] [expr $x+30] [expr $y+30] \
+           -outline black -fill $color -width 1]
+    $w bind $item <1> "$w itemconf text $option $value"
+    $w addtag config withtag $item
+}
+
+set textConfigFill {}
+
+proc textEnter {w} {
+    global textConfigFill
+    set textConfigFill [lindex [$w itemconfig current -fill] 4]
+    $w itemconfig current -fill black
+}
+
+proc textB1Press {w x y} {
+    $w cursor current @$x,$y
+    $w focus current
+    focus $w
+    $w select from current @$x,$y
+}
+
+proc textB1Move {w x y} {
+    $w select to current @$x,$y
+}
+
+proc textBs {w} {
+    set char [expr {[$w index text cursor] - 1}]
+    if {$char >= 0} {$w dchar text $char}
+}
diff --git a/src/tk/library/demos/mkCheck.tcl b/src/tk/library/demos/mkCheck.tcl
new file mode 100644 (file)
index 0000000..461d28c
--- /dev/null
@@ -0,0 +1,35 @@
+# mkCheck w
+#
+# Create a top-level window that displays a bunch of check buttons.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkCheck {{w .c1}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Checkbutton demonstration"
+    wm iconname $w "Checkbuttons"
+    message $w.msg -font -Adobe-times-medium-r-normal--*-180* -aspect 300 \
+           -text "Three checkbuttons are displayed below.  If you click on a button, it will toggle the button's selection state and set a Tcl variable to a value indicating the state of the checkbutton.  Click the \"See Variables\" button to see the current values of the variables.  Click the \"OK\" button when you've seen enough."
+    frame $w.frame -borderwidth 10
+    pack append $w.frame \
+       [checkbutton $w.frame.b1 -text "Wipers OK" -variable wipers \
+           -relief flat] {top pady 4 expand frame w} \
+       [checkbutton $w.frame.b2 -text "Brakes OK" -variable brakes \
+           -relief flat] {top pady 4 expand frame w} \
+       [checkbutton $w.frame.b3 -text "Driver Sober" -variable sober \
+           -relief flat] {top pady 4 expand frame w}
+    frame $w.frame2
+    pack append $w.frame2 \
+       [button $w.frame2.ok -text OK -command "destroy $w"] \
+           {left expand fill} \
+       [button $w.frame2.vars -text "See Variables" \
+           -command "showVars $w.dialog wipers brakes sober"] \
+           {left expand fill}
+    button $w.ok -text OK -command "destroy $w"
+
+    pack append $w $w.msg {top fill} $w.frame {top expand fill} \
+           $w.frame2 {bottom fill}
+}
diff --git a/src/tk/library/demos/mkDialog.tcl b/src/tk/library/demos/mkDialog.tcl
new file mode 100644 (file)
index 0000000..6dccd65
--- /dev/null
@@ -0,0 +1,63 @@
+# mkDialog w msgArgs list list ...
+#
+# Create a dialog box with a message and any number of buttons at
+# the bottom.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+#    msgArgs - List of arguments to use when creating the message of the
+#              dialog box (e.g. text, justifcation, etc.)
+#    list -    A two-element list that describes one of the buttons that
+#              will appear at the bottom of the dialog.  The first element
+#              gives the text to be displayed in the button and the second
+#              gives the command to be invoked when the button is invoked.
+
+proc mkDialog {w msgArgs args} {
+    catch {destroy $w}
+    toplevel $w -class Dialog
+    wm title $w "Dialog box"
+    wm iconname $w "Dialog"
+
+    # Create two frames in the main window. The top frame will hold the
+    # message and the bottom one will hold the buttons.  Arrange them
+    # one above the other, with any extra vertical space split between
+    # them.
+
+    frame $w.top -relief raised -border 1
+    frame $w.bot -relief raised -border 1
+    pack append $w $w.top {top fill expand} $w.bot {top fill expand}
+    
+    # Create the message widget and arrange for it to be centered in the
+    # top frame.
+    
+    eval message $w.top.msg -justify center \
+           -font -Adobe-times-medium-r-normal--*-180* $msgArgs
+    pack append $w.top $w.top.msg {top expand padx 5 pady 5}
+    
+    # Create as many buttons as needed and arrange them from left to right
+    # in the bottom frame.  Embed the left button in an additional sunken
+    # frame to indicate that it is the default button, and arrange for that
+    # button to be invoked as the default action for clicks and returns in
+    # the dialog.
+
+    if {[llength $args] > 0} {
+       set arg [lindex $args 0]
+       frame $w.bot.0 -relief sunken -border 1
+       pack append $w.bot $w.bot.0 {left expand padx 20 pady 20}
+       button $w.bot.0.button -text [lindex $arg 0] \
+               -command "[lindex $arg 1]; destroy $w"
+       pack append $w.bot.0 $w.bot.0.button {expand padx 12 pady 12}
+       bind $w <Return> "[lindex $arg 1]; destroy $w"
+       focus $w
+
+       set i 1
+       foreach arg [lrange $args 1 end] {
+           button $w.bot.$i -text [lindex $arg 0] \
+                   -command "[lindex $arg 1]; destroy $w"
+           pack append $w.bot $w.bot.$i {left expand padx 20}
+           set i [expr $i+1]
+       }
+    }
+    bind $w <Any-Enter> [list focus $w]
+    focus $w
+}
diff --git a/src/tk/library/demos/mkEntry.tcl b/src/tk/library/demos/mkEntry.tcl
new file mode 100644 (file)
index 0000000..1122609
--- /dev/null
@@ -0,0 +1,29 @@
+# mkEntry w
+#
+# Create a top-level window that displays a bunch of entries.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkEntry {{w .e1}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Entry Demonstration"
+    wm iconname $w "Entries"
+    message $w.msg -font -Adobe-times-medium-r-normal--*-180* -aspect 200 \
+           -text "Three different entries are displayed below.  You can add characters by pointing, clicking and typing.  You can delete by selecting and typing Control-d.  Backspace, Control-h, and Delete may be typed to erase the character just before the insertion point, Control-W erases the word just before the insertion point, and Control-u clears the entry.  For entries that are too large to fit in the window all at once, you can scan through the entries by dragging with mouse button 2 pressed.  Click the \"OK\" button when you've seen enough."
+    frame $w.frame -borderwidth 10
+    pack append $w.frame \
+       [entry $w.frame.e1 -relief sunken] {top pady 10 fillx} \
+       [entry $w.frame.e2 -relief sunken] {top pady 10 fillx} \
+       [entry $w.frame.e3 -relief sunken] {top pady 10 fillx}
+    $w.frame.e1 insert 0 "Initial value"
+    $w.frame.e2 insert end "This entry contains a long value, much too long "
+    $w.frame.e2 insert end "to fit in the window at one time, so long in fact "
+    $w.frame.e2 insert end "that you'll have to scan or scroll to see the end."
+    button $w.ok -text OK -command "destroy $w"
+
+    pack append $w $w.msg {top fill} $w.frame {top expand fill} \
+       $w.ok {bottom fill}
+}
diff --git a/src/tk/library/demos/mkEntry2.tcl b/src/tk/library/demos/mkEntry2.tcl
new file mode 100644 (file)
index 0000000..ba79e28
--- /dev/null
@@ -0,0 +1,41 @@
+# mkEntry2 -
+#
+# Create a top-level window that displays a bunch of entries with
+# scrollbars.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkEntry2 {{w .e2}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Entry Demonstration"
+    wm iconname $w "Entries"
+    message $w.msg -font -Adobe-times-medium-r-normal--*-180* -aspect 200 \
+           -text "Three different entries are displayed below, with a scrollbar for each entry.  You can add characters by pointing, clicking and typing.  You can delete by selecting and typing Control-d.  Backspace, Control-h, and Delete may be typed to erase the character just before the insertion point, Control-W erases the word just before the insertion point, and Control-u clears the entry.  For entries that are too large to fit in the window all at once, you can scan through the entries using the scrollbars, or by dragging with mouse button 2 pressed.  Click the \"OK\" button when you've seen enough."
+    frame $w.frame -borderwidth 10
+    pack append $w.frame \
+       [entry $w.frame.e1 -relief sunken] {top fillx} \
+       [scrollbar $w.frame.s1 -relief sunken -orient horiz -command \
+           "$w.frame.e1 view"] {top fillx} \
+       [frame $w.frame.f1 -geometry 20x10] {top} \
+       [entry $w.frame.e2 -relief sunken] {top fillx} \
+       [scrollbar $w.frame.s2 -relief sunken -orient horiz -command \
+           "$w.frame.e2 view"] {top fillx} \
+       [frame $w.frame.f2 -geometry 20x10] {top} \
+       [entry $w.frame.e3 -relief sunken] {top fillx} \
+       [scrollbar $w.frame.s3 -relief sunken -orient horiz -command \
+           "$w.frame.e3 view"] {top fillx}
+    $w.frame.e1 config -scroll "$w.frame.s1 set"
+    $w.frame.e1 insert 0 "Initial value"
+    $w.frame.e2 config -scroll "$w.frame.s2 set"
+    $w.frame.e2 insert end "This entry contains a long value, much too long "
+    $w.frame.e2 insert end "to fit in the window at one time, so long in fact "
+    $w.frame.e2 insert end "that you'll have to scan or scroll to see the end."
+    $w.frame.e3 config -scroll "$w.frame.s3 set"
+
+    button $w.ok -text OK -command "destroy $w"
+    pack append $w $w.msg {top fill} $w.frame {top expand fill} \
+       $w.ok {bottom fill}
+}
diff --git a/src/tk/library/demos/mkHScale.tcl b/src/tk/library/demos/mkHScale.tcl
new file mode 100644 (file)
index 0000000..926ed95
--- /dev/null
@@ -0,0 +1,34 @@
+# mkHScale w
+#
+# Create a top-level window that displays a horizontal scale.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkHScale {{w .scale2}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Horizontal Scale Demonstration"
+    wm iconname $w "Scale"
+    message $w.msg -font -Adobe-times-medium-r-normal--*-180* -aspect 300 \
+           -text "A bar and a horizontal scale are displayed below.  If you click or drag mouse button 1 in the scale, you can change the width of the bar.  Click the \"OK\" button when you're finished."
+    frame $w.frame -borderwidth 10
+    pack append $w.frame \
+       [frame $w.frame.top -borderwidth 15] {top expand frame sw} \
+       [scale $w.frame.scale -orient horizontal -length 280 -from 0 -to 250 \
+           -command "setWidth $w.frame.top.inner" -tickinterval 50 \
+           -bg Bisque1] {bottom expand frame nw}
+    pack append $w.frame.top \
+       [frame $w.frame.top.inner -geometry 20x40 -relief raised \
+           -borderwidth 2 -bg SteelBlue1] {expand frame sw}
+    $w.frame.scale set 20
+    button $w.ok -text OK -command "destroy $w"
+
+    pack append $w $w.msg {top fill} $w.frame {top expand fill} \
+       $w.ok {bottom fill}
+}
+
+proc setWidth {w width} {
+    $w config -geometry ${width}x40
+}
diff --git a/src/tk/library/demos/mkIcon.tcl b/src/tk/library/demos/mkIcon.tcl
new file mode 100644 (file)
index 0000000..1931376
--- /dev/null
@@ -0,0 +1,43 @@
+# mkIcon w
+#
+# Create a top-level window that displays a bunch of iconic
+# buttons.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkIcon {{w .icon}} {
+    global tk_library
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Iconic Button Demonstration"
+    wm iconname $w "Icons"
+    message $w.msg -font -Adobe-times-medium-r-normal--*-180* -aspect 300 \
+           -text "This window shows three buttons that display bitmaps instead of text.  On the left is a regular button, which changes its bitmap when you click on it.  On the right are two radio buttons.  Click the \"OK\" button when you're done."
+    frame $w.frame -borderwidth 10
+    pack append $w.frame \
+       [button $w.frame.b1 -bitmap @$tk_library/demos/bitmaps/flagdown  \
+               -command "iconCmd $w.frame.b1"] {left expand} \
+       [frame $w.frame.right] {left expand}
+    radiobutton $w.frame.right.b2 -bitmap @$tk_library/demos/bitmaps/letters \
+           -variable letters
+    radiobutton $w.frame.right.b3 -bitmap @$tk_library/demos/bitmaps/noletters \
+           -variable letters
+    pack append $w.frame.right $w.frame.right.b2 {top expand} \
+           $w.frame.right.b3 {top expand}
+    button $w.ok -text OK -command "destroy $w"
+
+    pack append $w $w.msg {top frame c} $w.frame {top expand fill} \
+           $w.ok {bottom fill}
+}
+
+proc iconCmd {w} {
+    global tk_library
+    set bitmap [lindex [$w config -bitmap] 4]
+    if {$bitmap == "@$tk_library/demos/bitmaps/flagdown"} {
+       $w config -bitmap @$tk_library/demos/bitmaps/flagup
+    } else {
+       $w config -bitmap @$tk_library/demos/bitmaps/flagdown
+    }
+}
diff --git a/src/tk/library/demos/mkItems.tcl b/src/tk/library/demos/mkItems.tcl
new file mode 100644 (file)
index 0000000..230cfb1
--- /dev/null
@@ -0,0 +1,271 @@
+# mkItems w
+#
+# Create a top-level window containing a canvas that displays the
+# various item types and allows them to be selected and moved.  This
+# demo can be used to test out the point-hit and rectangle-hit code
+# for items.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkItems {{w .citems}} {
+    global c tk_library
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Canvas Item Demonstration"
+    wm iconname $w "Items"
+    wm minsize $w 100 100
+    set c $w.frame2.c
+
+    frame $w.frame1 -relief raised -bd 2
+    frame $w.frame2 -relief raised -bd 2
+    button $w.ok -text "OK" -command "destroy $w"
+    pack append $w $w.frame1 {top fill} $w.frame2 {top fill expand} \
+           $w.ok {bottom pady 10 frame center}
+    message $w.frame1.m -font -Adobe-Times-Medium-R-Normal-*-180-* -aspect 300 \
+           -text "This window contains a canvas widget with examples of the various kinds of items supported by canvases.  The following operations are supported:\n  Button-1 drag:\tmoves item under pointer.\n  Button-2 drag:\trepositions view.\n  Button-3 drag:\tstrokes out area.\n  Ctrl+f:\t\tprints items under area."
+    pack append $w.frame1 $w.frame1.m {frame center}
+
+    canvas $c -scrollregion {0c 0c 30c 24c} -width 15c -height 10c
+    scrollbar $w.frame2.vscroll  -relief sunken -command "$c yview"
+    scrollbar $w.frame2.hscroll -orient horiz -relief sunken -command "$c xview"
+    pack append $w.frame2 $w.frame2.hscroll {bottom fillx} \
+           $w.frame2.vscroll {right filly} $c {expand fill}
+    $c config -xscroll "$w.frame2.hscroll set" -yscroll "$w.frame2.vscroll set"
+
+    # Display a 3x3 rectangular grid.
+
+    $c create rect 0c 0c 30c 24c -width 2
+    $c create line 0c 8c 30c 8c -width 2
+    $c create line 0c 16c 30c 16c -width 2
+    $c create line 10c 0c 10c 24c -width 2
+    $c create line 20c 0c 20c 24c -width 2
+
+    set font1 -Adobe-Helvetica-Medium-R-Normal-*-120-*
+    set font2 -Adobe-Helvetica-Bold-R-Normal-*-240-*
+    if {[winfo screendepth $c] > 4} {
+       set blue DeepSkyBlue3
+       set red red
+       set bisque bisque3
+       set green SeaGreen3
+    } else {
+       set blue black
+       set red black
+       set bisque black
+       set green black
+    }
+
+    # Set up demos within each of the areas of the grid.
+
+    $c create text 5c .2c -text Lines -anchor n
+    $c create line 1c 1c 3c 1c 1c 4c 3c 4c -width 2m -fill $blue \
+           -cap butt -join miter -tags item
+    $c create line 4.67c 1c 4.67c 4c -arrow last -tags item
+    $c create line 6.33c 1c 6.33c 4c -arrow both -tags item
+    $c create line 5c 6c 9c 6c 9c 1c 8c 1c 8c 4.8c 8.8c 4.8c 8.8c 1.2c \
+           8.2c 1.2c 8.2c 4.6c 8.6c 4.6c 8.6c 1.4c 8.4c 1.4c 8.4c 4.4c \
+           -width 3 -fill $red -tags item
+    $c create line 1c 5c 7c 5c 7c 7c 9c 7c -width .5c \
+           -stipple @$tk_library/demos/bitmaps/grey.25 \
+           -arrow both -arrowshape {15 15 7} -tags item
+    $c create line 1c 7c 1.75c 5.8c 2.5c 7c 3.25c 5.8c 4c 7c -width .5c \
+           -cap round -join round -tags item
+
+    $c create text 15c .2c -text "Curves (smoothed lines)" -anchor n
+    $c create line 11c 4c 11.5c 1c 13.5c 1c 14c 4c -smooth on \
+           -fill $blue -tags item
+    $c create line 15.5c 1c 19.5c 1.5c 15.5c 4.5c 19.5c 4c -smooth on \
+           -arrow both -width 3 -tags item
+    $c create line 12c 6c 13.5c 4.5c 16.5c 7.5c 18c 6c \
+           16.5c 4.5c 13.5c 7.5c 12c 6c -smooth on -width 3m -cap round \
+           -stipple @$tk_library/demos/bitmaps/grey.25 -fill $red -tags item
+
+    $c create text 25c .2c -text Polygons -anchor n
+    $c create polygon 21c 1.0c 22.5c 1.75c 24c 1.0c 23.25c 2.5c \
+           24c 4.0c 22.5c 3.25c 21c 4.0c 21.75c 2.5c -fill $green -tags item
+    $c create polygon 25c 4c 25c 4c 25c 1c 26c 1c 27c 4c 28c 1c \
+           29c 1c 29c 4c 29c 4c -fill $red -smooth on -tags item
+    $c create polygon 22c 4.5c 25c 4.5c 25c 6.75c 28c 6.75c \
+           28c 5.25c 24c 5.25c 24c 6.0c 26c 6c 26c 7.5c 22c 7.5c \
+           -stipple @$tk_library/demos/bitmaps/grey.25 -tags item
+
+    $c create text 5c 8.2c -text Rectangles -anchor n
+    $c create rectangle 1c 9.5c 4c 12.5c -outline $red -width 3m -tags item
+    $c create rectangle 0.5c 13.5c 4.5c 15.5c -fill $green -tags item
+    $c create rectangle 6c 10c 9c 15c -outline {} \
+           -stipple @$tk_library/demos/bitmaps/grey.25 -fill $blue -tags item
+
+    $c create text 15c 8.2c -text Ovals -anchor n
+    $c create oval 11c 9.5c 14c 12.5c -outline $red -width 3m -tags item
+    $c create oval 10.5c 13.5c 14.5c 15.5c -fill $green -tags item
+    $c create oval 16c 10c 19c 15c -outline {} \
+           -stipple @$tk_library/demos/bitmaps/grey.25 -fill $blue -tags item
+
+    $c create text 25c 8.2c -text Text -anchor n
+    $c create rectangle 22.4c 8.9c 22.6c 9.1c
+    $c create text 22.5c 9c -anchor n -font $font1 -width 4c \
+           -text "A short string of text, word-wrapped, justified left, and anchored north (at the top).  The rectangles show the anchor points for each piece of text." -tags item
+    $c create rectangle 25.4c 10.9c 25.6c 11.1c
+    $c create text 25.5c 11c -anchor w -font $font1 -fill $blue \
+           -text "Several lines,\n each centered\nindividually,\nand all anchored\nat the left edge." \
+           -justify center -tags item
+    $c create rectangle 24.9c 13.9c 25.1c 14.1c
+    $c create text 25c 14c -font $font2 -anchor c -fill $red \
+           -stipple @$tk_library/demos/bitmaps/grey.5 \
+           -text "Stippled characters" -tags item
+
+    $c create text 5c 16.2c -text Arcs -anchor n
+    $c create arc 0.5c 17c 7c 20c -fill $green -outline black \
+           -start 45 -extent 270 -style pieslice -tags item
+    $c create arc 6.5c 17c 9.5c 20c -width 4m -style arc \
+           -fill $blue -start -135 -extent 270 \
+           -stipple @$tk_library/demos/bitmaps/grey.25 -tags item
+    $c create arc 0.5c 20c 9.5c 24c -width 4m -style pieslice \
+           -fill {} -outline $red -start 225 -extent -90 -tags item
+    $c create arc 5.5c 20.5c 9.5c 23.5c -width 4m -style chord \
+           -fill $blue -outline {} -start 45 -extent 270  -tags item
+
+    $c create text 15c 16.2c -text Bitmaps -anchor n
+    $c create bitmap 13c 20c -bitmap @$tk_library/demos/bitmaps/face -tags item
+    $c create bitmap 17c 18.5c \
+           -bitmap @$tk_library/demos/bitmaps/noletters -tags item
+    $c create bitmap 17c 21.5c \
+           -bitmap @$tk_library/demos/bitmaps/letters -tags item
+
+    $c create text 25c 16.2c -text Windows -anchor n
+    button $c.button -text "Press Me" -command "butPress $c $red"
+    $c create window 21c 18c -window $c.button -anchor nw -tags item
+    entry $c.entry -width 20 -relief sunken
+    $c.entry insert end "Edit this text"
+    $c create window 21c 21c -window $c.entry -anchor nw -tags item
+    scale $c.scale -from 0 -to 100 -length 6c -sliderlength .4c \
+           -width .5c -tickinterval 0
+    $c create window 28.5c 17.5c -window $c.scale -anchor n -tags item
+    $c create text 21c 17.9c -text Button: -anchor sw
+    $c create text 21c 20.9c -text Entry: -anchor sw
+    $c create text 28.5c 17.4c -text Scale: -anchor s
+
+    # Set up event bindings for canvas:
+
+    $c bind item <Any-Enter> "itemEnter $c"
+    $c bind item <Any-Leave> "itemLeave $c"
+    bind $c <2> "$c scan mark %x %y"
+    bind $c <B2-Motion> "$c scan dragto %x %y"
+    bind $c <3> "itemMark $c %x %y"
+    bind $c <B3-Motion> "itemStroke $c %x %y"
+    bind $c <Control-f> "itemsUnderArea $c"
+    bind $c <1> "itemStartDrag $c %x %y"
+    bind $c <B1-Motion> "itemDrag $c %x %y"
+    bind $w <Any-Enter> "focus $c"
+}
+
+# Utility procedures for highlighting the item under the pointer:
+
+proc itemEnter {c} {
+    global restoreCmd
+
+    if {[winfo screendepth $c] <= 4} {
+       set restoreCmd {}
+       return
+    }
+    set type [$c type current]
+    if {$type == "window"} {
+       set restoreCmd {}
+       return
+    }
+    if {$type == "bitmap"} {
+       set bg [lindex [$c itemconf current -background] 4]
+       set restoreCmd [list $c itemconfig current -background $bg]
+       $c itemconfig current -background SteelBlue2
+       return
+    }
+    set fill [lindex [$c itemconfig current -fill] 4]
+    if {(($type == "rectangle") || ($type == "oval") || ($type == "arc"))
+           && ($fill == "")} {
+       set outline [lindex [$c itemconfig current -outline] 4]
+       set restoreCmd "$c itemconfig current -outline $outline"
+       $c itemconfig current -outline SteelBlue2
+    } else {
+       set restoreCmd "$c itemconfig current -fill $fill"
+       $c itemconfig current -fill SteelBlue2
+    }
+}
+
+proc itemLeave {c} {
+    global restoreCmd
+
+    eval $restoreCmd
+}
+
+# Utility procedures for stroking out a rectangle and printing what's
+# underneath the rectangle's area.
+
+proc itemMark {c x y} {
+    global areaX1 areaY1
+    set areaX1 [$c canvasx $x]
+    set areaY1 [$c canvasy $y]
+    $c delete area
+}
+
+proc itemStroke {c x y} {
+    global areaX1 areaY1 areaX2 areaY2
+    set x [$c canvasx $x]
+    set y [$c canvasy $y]
+    if {($areaX1 != $x) && ($areaY1 != $y)} {
+       $c delete area
+       $c addtag area withtag [$c create rect $areaX1 $areaY1 $x $y \
+               -outline black]
+       set areaX2 $x
+       set areaY2 $y
+    }
+}
+
+proc itemsUnderArea {c} {
+    global areaX1 areaY1 areaX2 areaY2
+    set area [$c find withtag area]
+    set items ""
+    foreach i [$c find enclosed $areaX1 $areaY1 $areaX2 $areaY2] {
+       if {[lsearch [$c gettags $i] item] != -1} {
+           lappend items $i
+       }
+    }
+    puts stdout "Items enclosed by area: $items"
+    set items ""
+    foreach i [$c find overlapping $areaX1 $areaY1 $areaX2 $areaY2] {
+       if {[lsearch [$c gettags $i] item] != -1} {
+           lappend items $i
+       }
+    }
+    puts stdout "Items overlapping area: $items"
+}
+
+set areaX1 0
+set areaY1 0
+set areaX2 0
+set areaY2 0
+
+# Utility procedures to support dragging of items.
+
+proc itemStartDrag {c x y} {
+    global lastX lastY
+    set lastX [$c canvasx $x]
+    set lastY [$c canvasy $y]
+}
+
+proc itemDrag {c x y} {
+    global lastX lastY
+    set x [$c canvasx $x]
+    set y [$c canvasy $y]
+    $c move current [expr $x-$lastX] [expr $y-$lastY]
+    set lastX $x
+    set lastY $y
+}
+
+# Procedure that's invoked when the button embedded in the canvas
+# is invoked.
+
+proc butPress {w color} {
+    set i [$w create text 25c 18.1c -text "Ouch!!" -fill $color -anchor n]
+    after 500 "$w delete $i"
+}
diff --git a/src/tk/library/demos/mkLabel.tcl b/src/tk/library/demos/mkLabel.tcl
new file mode 100644 (file)
index 0000000..d94ea42
--- /dev/null
@@ -0,0 +1,33 @@
+# mkLabel w
+#
+# Create a top-level window that displays a bunch of labels.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkLabel {{w .l1}} {
+    global tk_library
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Label Demonstration"
+    wm iconname $w "Labels"
+    message $w.msg -font -Adobe-times-medium-r-normal--*-180* -aspect 300 \
+           -text "Five labels are displayed below: three textual ones on the left, and a bitmap label and a text label on the right.  Labels are pretty boring because you can't do anything with them.  Click the \"OK\" button when you've seen enough."
+    frame $w.frame -borderwidth 10
+    pack append $w.frame \
+       [frame $w.frame.right -borderwidth 10] {right} \
+       [label $w.frame.l1 -text "First label"] {top frame w pady 4 expand} \
+       [label $w.frame.l2 -text "Second label, raised just for fun" \
+           -relief raised] {top frame w pady 4 expand} \
+       [label $w.frame.l3 -text "Third label, sunken" -relief sunken ] \
+           {top frame w pady 4 expand}
+    pack append $w.frame.right \
+       [label $w.frame.right.bitmap -bitmap @$tk_library/demos/bitmaps/face \
+           -borderwidth 2 -relief sunken] top \
+       [label $w.frame.right.caption -text "Tcl/Tk Proprietor"] bottom
+    button $w.ok -text OK -command "destroy $w"
+
+    pack append $w $w.msg {top frame c} $w.frame {top expand fill} \
+           $w.ok {bottom fill}
+}
diff --git a/src/tk/library/demos/mkListbox.tcl b/src/tk/library/demos/mkListbox.tcl
new file mode 100644 (file)
index 0000000..3f1a3d0
--- /dev/null
@@ -0,0 +1,37 @@
+# mkListbox w
+#
+# Create a top-level window that displays a listbox with the names of the
+# 50 states.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkListbox {{w .l1}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Listbox Demonstration (50 states)"
+    wm iconname $w "Listbox"
+    message $w.msg -font -Adobe-times-medium-r-normal--*-180* -aspect 300 \
+           -text "A listbox containing the 50 states is displayed below, along with a scrollbar.  You can scan the list either using the scrollbar or by dragging in the listbox window with button 2 pressed.  Click the \"OK\" button when you've seen enough."
+    frame $w.frame -borderwidth 10
+    pack append $w.frame \
+       [scrollbar $w.frame.scroll -relief sunken \
+           -command "$w.frame.list yview"] {right expand filly frame w} \
+       [listbox $w.frame.list -yscroll "$w.frame.scroll set" -relief sunken] \
+           {left expand filly frame e}
+    $w.frame.list insert 0 Alabama Alaska Arizona Arkansas California \
+       Colorado Connecticut Delaware Florida Georgia Hawaii Idaho Illinois \
+       Indiana Iowa Kansas Kentucky Louisiana Maine Maryland \
+        Massachusetts Michigan Minnesota Mississippi Missouri \
+        Montana Nebraska Nevada "New Hampshire" "New Jersey" "New Mexico" \
+       "New York" "North Carolina" "North Dakota" \
+        Ohio Oklahoma Oregon Pennsylvania "Rhode Island" \
+        "South Carolina" "South Dakota" \
+        Tennessee Texas Utah Vermont Virginia Washington \
+        "West Virginia" Wisconsin Wyoming
+    button $w.ok -text OK -command "destroy $w"
+
+    pack append $w $w.msg {top fill} $w.frame {top expand fill} \
+       $w.ok {bottom fill}
+}
diff --git a/src/tk/library/demos/mkListbox2.tcl b/src/tk/library/demos/mkListbox2.tcl
new file mode 100644 (file)
index 0000000..0f3e2e6
--- /dev/null
@@ -0,0 +1,91 @@
+# mkListbox2 w
+#
+# Create a top-level window containing a listbox showing a bunch of
+# colors from the X color database.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkListbox2 {{w .l2}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Listbox Demonstration (colors)"
+    wm iconname $w "Listbox"
+    message $w.msg -font -Adobe-times-medium-r-normal--*-180* -aspect 300 \
+           -text "A listbox containing several color values is displayed below, along with a scrollbar.  You can scan the list either using the scrollbar or by dragging in the listbox window with button 2 pressed.  If you double-click button 1 on a color, then the background for the window will be changed to that color.  Click the \"OK\" button when you've seen enough."
+    frame $w.frame -borderwidth 10
+    pack append $w.frame \
+       [scrollbar $w.frame.scroll -relief sunken \
+           -command "$w.frame.list yview"] {right expand filly frame w} \
+       [listbox $w.frame.list -yscroll "$w.frame.scroll set" -relief sunken \
+           -geometry 20x20] {left expand filly frame e}
+    $w.frame.list insert 0 snow1 snow2 snow3 snow4 seashell1 seashell2 \
+       seashell3 seashell4 AntiqueWhite1 AntiqueWhite2 AntiqueWhite3 \
+       AntiqueWhite4 bisque1 bisque2 bisque3 bisque4 PeachPuff1 \
+       PeachPuff2 PeachPuff3 PeachPuff4 NavajoWhite1 NavajoWhite2 \
+       NavajoWhite3 NavajoWhite4 LemonChiffon1 LemonChiffon2 \
+       LemonChiffon3 LemonChiffon4 cornsilk1 cornsilk2 cornsilk3 \
+       cornsilk4 ivory1 ivory2 ivory3 ivory4 honeydew1 honeydew2 \
+       honeydew3 honeydew4 LavenderBlush1 LavenderBlush2 \
+       LavenderBlush3 LavenderBlush4 MistyRose1 MistyRose2 \
+       MistyRose3 MistyRose4 azure1 azure2 azure3 azure4 \
+       SlateBlue1 SlateBlue2 SlateBlue3 SlateBlue4 RoyalBlue1 \
+       RoyalBlue2 RoyalBlue3 RoyalBlue4 blue1 blue2 blue3 blue4 \
+       DodgerBlue1 DodgerBlue2 DodgerBlue3 DodgerBlue4 SteelBlue1 \
+       SteelBlue2 SteelBlue3 SteelBlue4 DeepSkyBlue1 DeepSkyBlue2 \
+       DeepSkyBlue3 DeepSkyBlue4 SkyBlue1 SkyBlue2 SkyBlue3 \
+       SkyBlue4 LightSkyBlue1 LightSkyBlue2 LightSkyBlue3 \
+       LightSkyBlue4 SlateGray1 SlateGray2 SlateGray3 SlateGray4 \
+       LightSteelBlue1 LightSteelBlue2 LightSteelBlue3 \
+       LightSteelBlue4 LightBlue1 LightBlue2 LightBlue3 \
+       LightBlue4 LightCyan1 LightCyan2 LightCyan3 LightCyan4 \
+       PaleTurquoise1 PaleTurquoise2 PaleTurquoise3 PaleTurquoise4 \
+       CadetBlue1 CadetBlue2 CadetBlue3 CadetBlue4 turquoise1 \
+       turquoise2 turquoise3 turquoise4 cyan1 cyan2 cyan3 cyan4 \
+       DarkSlateGray1 DarkSlateGray2 DarkSlateGray3 \
+       DarkSlateGray4 aquamarine1 aquamarine2 aquamarine3 \
+       aquamarine4 DarkSeaGreen1 DarkSeaGreen2 DarkSeaGreen3 \
+       DarkSeaGreen4 SeaGreen1 SeaGreen2 SeaGreen3 SeaGreen4 \
+       PaleGreen1 PaleGreen2 PaleGreen3 PaleGreen4 SpringGreen1 \
+       SpringGreen2 SpringGreen3 SpringGreen4 green1 green2 \
+       green3 green4 chartreuse1 chartreuse2 chartreuse3 \
+       chartreuse4 OliveDrab1 OliveDrab2 OliveDrab3 OliveDrab4 \
+       DarkOliveGreen1 DarkOliveGreen2 DarkOliveGreen3 \
+       DarkOliveGreen4 khaki1 khaki2 khaki3 khaki4 \
+       LightGoldenrod1 LightGoldenrod2 LightGoldenrod3 \
+       LightGoldenrod4 LightYellow1 LightYellow2 LightYellow3 \
+       LightYellow4 yellow1 yellow2 yellow3 yellow4 gold1 gold2 \
+       gold3 gold4 goldenrod1 goldenrod2 goldenrod3 goldenrod4 \
+       DarkGoldenrod1 DarkGoldenrod2 DarkGoldenrod3 DarkGoldenrod4 \
+       RosyBrown1 RosyBrown2 RosyBrown3 RosyBrown4 IndianRed1 \
+       IndianRed2 IndianRed3 IndianRed4 sienna1 sienna2 sienna3 \
+       sienna4 burlywood1 burlywood2 burlywood3 burlywood4 wheat1 \
+       wheat2 wheat3 wheat4 tan1 tan2 tan3 tan4 chocolate1 \
+       chocolate2 chocolate3 chocolate4 firebrick1 firebrick2 \
+       firebrick3 firebrick4 brown1 brown2 brown3 brown4 salmon1 \
+       salmon2 salmon3 salmon4 LightSalmon1 LightSalmon2 \
+       LightSalmon3 LightSalmon4 orange1 orange2 orange3 orange4 \
+       DarkOrange1 DarkOrange2 DarkOrange3 DarkOrange4 coral1 \
+       coral2 coral3 coral4 tomato1 tomato2 tomato3 tomato4 \
+       OrangeRed1 OrangeRed2 OrangeRed3 OrangeRed4 red1 red2 red3 \
+       red4 DeepPink1 DeepPink2 DeepPink3 DeepPink4 HotPink1 \
+       HotPink2 HotPink3 HotPink4 pink1 pink2 pink3 pink4 \
+       LightPink1 LightPink2 LightPink3 LightPink4 PaleVioletRed1 \
+       PaleVioletRed2 PaleVioletRed3 PaleVioletRed4 maroon1 \
+       maroon2 maroon3 maroon4 VioletRed1 VioletRed2 VioletRed3 \
+       VioletRed4 magenta1 magenta2 magenta3 magenta4 orchid1 \
+       orchid2 orchid3 orchid4 plum1 plum2 plum3 plum4 \
+       MediumOrchid1 MediumOrchid2 MediumOrchid3 MediumOrchid4 \
+       DarkOrchid1 DarkOrchid2 DarkOrchid3 DarkOrchid4 purple1 \
+       purple2 purple3 purple4 MediumPurple1 MediumPurple2 \
+       MediumPurple3 MediumPurple4 thistle1 thistle2 thistle3 \
+       thistle4
+    bind $w.frame.list <Double-1> \
+       "$w.frame config -bg \[lindex \[selection get\] 0\]
+       $w.msg config -bg \[lindex \[selection get\] 0\]"
+    button $w.ok -text OK -command "destroy $w"
+
+    pack append $w $w.msg {top fill} $w.frame {top expand fill} \
+       $w.ok {bottom fill}
+}
diff --git a/src/tk/library/demos/mkListbox3.tcl b/src/tk/library/demos/mkListbox3.tcl
new file mode 100644 (file)
index 0000000..be6eecb
--- /dev/null
@@ -0,0 +1,31 @@
+# mkListbox3 w
+#
+# Create a top-level window containing a listbox with a bunch of well-known
+# sayings.  The listbox can be scrolled or scanned in two dimensions.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkListbox3 {{w .l3}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Listbox Demonstration (well-known sayings)"
+    wm iconname $w "Listbox"
+    message $w.msg -font -Adobe-times-medium-r-normal--*-180* -aspect 300 \
+           -text "The listbox below contains a collection of well-known sayings.  You can scan the list using either of the scrollbars or by dragging in the listbox window with button 2 pressed.  Click the \"OK\" button when you're done."
+    frame $w.frame -borderwidth 10
+    pack append $w.frame \
+       [scrollbar $w.frame.yscroll -relief sunken \
+           -command "$w.frame.list yview"] {right filly} \
+       [scrollbar $w.frame.xscroll -relief sunken -orient horizontal \
+           -command "$w.frame.list xview"] {bottom fillx} \
+       [listbox $w.frame.list -yscroll "$w.frame.yscroll set" \
+               -xscroll "$w.frame.xscroll set" \
+               -geometry 20x10 -relief sunken] {top}
+    $w.frame.list insert 0 "Waste not, want not" "Early to bed and early to rise makes a man healthy, wealthy, and wise" "Ask not what your country can do for you, ask what you can do for your country" "I shall return" "NOT" "A picture is worth a thousand words" "User interfaces are hard to build" "Thou shalt not steal" "A penny for your thoughts" "Fool me once, shame on you;  fool me twice, shame on me" "Every cloud has a silver lining" "Where there's smoke there's fire" "It takes one to know one" "Curiosity killed the cat" "Take this job and shove it" "Up a creek without a paddle" "I'm mad as hell and I'm not going to take it any more" "An apple a day keeps the doctor away" "Don't look a gift horse in the mouth"
+    button $w.ok -text OK -command "destroy $w"
+
+    pack append $w $w.msg {top fill} $w.frame {top} \
+       $w.ok {bottom fill}
+}
diff --git a/src/tk/library/demos/mkPlot.tcl b/src/tk/library/demos/mkPlot.tcl
new file mode 100644 (file)
index 0000000..150b7f3
--- /dev/null
@@ -0,0 +1,77 @@
+# mkPlot w
+#
+# Create a top-level window containing a canvas displaying a simple
+# graph with data points that can be moved interactively.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkPlot {{w .plot}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Plot Demonstration"
+    wm iconname $w "Plot"
+    set c $w.c
+
+    frame $w.frame1 -relief raised -bd 2
+    canvas $c -relief raised -width 450 -height 300
+    button $w.ok -text "OK" -command "destroy $w"
+    pack append $w $w.frame1 {top fill} $w.c {expand fill} \
+           $w.ok {bottom pady 10 frame center}
+    message $w.frame1.m -font -Adobe-Times-Medium-R-Normal-*-180-* -aspect 300 \
+           -text "This window displays a canvas widget containing a simple 2-dimensional plot.  You can doctor the data by dragging any of the points with mouse button 1."
+    pack append $w.frame1 $w.frame1.m {frame center}
+
+    set font -Adobe-helvetica-medium-r-*-180-*
+
+    $c create line 100 250 400 250 -width 2
+    $c create line 100 250 100 50 -width 2
+    $c create text 225 20 -text "A Simple Plot" -font $font -fill brown
+    
+    for {set i 0} {$i <= 10} {incr i} {
+       set x [expr {100 + ($i*30)}]
+       $c create line $x 250 $x 245 -width 2
+       $c create text $x 254 -text [expr 10*$i] -anchor n -font $font
+    }
+    for {set i 0} {$i <= 5} {incr i} {
+       set y [expr {250 - ($i*40)}]
+       $c create line 100 $y 105 $y -width 2
+       $c create text 96 $y -text [expr $i*50].0 -anchor e -font $font
+    }
+    
+    foreach point {{12 56} {20 94} {33 98} {32 120} {61 180}
+           {75 160} {98 223}} {
+       set x [expr {100 + (3*[lindex $point 0])}]
+       set y [expr {250 - (4*[lindex $point 1])/5}]
+       set item [$c create oval [expr $x-6] [expr $y-6] \
+               [expr $x+6] [expr $y+6] -width 1 -outline black \
+               -fill SkyBlue2]
+       $c addtag point withtag $item
+    }
+
+    $c bind point <Any-Enter> "$c itemconfig current -fill red"
+    $c bind point <Any-Leave> "$c itemconfig current -fill SkyBlue2"
+    $c bind point <1> "plotDown $c %x %y"
+    $c bind point <ButtonRelease-1> "$c dtag selected"
+    bind $c <B1-Motion> "plotMove $c %x %y"
+}
+
+set plot(lastX) 0
+set plot(lastY) 0
+
+proc plotDown {w x y} {
+    global plot
+    $w dtag selected
+    $w addtag selected withtag current
+    $w raise current
+    set plot(lastX) $x
+    set plot(lastY) $y
+}
+
+proc plotMove {w x y} {
+    global plot
+    $w move selected [expr $x-$plot(lastX)] [expr $y-$plot(lastY)]
+    set plot(lastX) $x
+    set plot(lastY) $y
+}
diff --git a/src/tk/library/demos/mkPuzzle.tcl b/src/tk/library/demos/mkPuzzle.tcl
new file mode 100644 (file)
index 0000000..f24135a
--- /dev/null
@@ -0,0 +1,60 @@
+# mkPuzzle w
+#
+# Create a top-level window containing a 15-puzzle game.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkPuzzle {{w .p1}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "15-Puzzle Demonstration"
+    wm iconname $w "15-Puzzle"
+    message $w.msg -font -Adobe-times-medium-r-normal--*-180* -aspect 300 \
+           -text "A 15-puzzle appears below as a collection of buttons.  Click on any of the pieces next to the space, and that piece will slide over the space.  Continue this until the pieces are arranged in numerical order from upper-left to lower-right.  Click the \"OK\" button when you've finished playing."
+    set order {3 1 6 2 5 7 15 13 4 11 8 9 14 10 12}
+    global xpos ypos
+    frame $w.frame -geometry 120x120 -borderwidth 2 -relief sunken \
+       -bg Bisque3
+
+    for {set i 0} {$i < 15} {set i [expr $i+1]} {
+       set num [lindex $order $i]
+       set xpos($num) [expr ($i%4)*.25]
+       set ypos($num) [expr ($i/4)*.25]
+       button $w.frame.$num -relief raised -text $num \
+               -command "puzzle.switch $w $num"
+       place $w.frame.$num -relx $xpos($num) -rely $ypos($num) \
+           -relwidth .25 -relheight .25
+    }
+    set xpos(space) .75
+    set ypos(space) .75
+
+    button $w.ok -text OK -command "destroy $w"
+
+    pack append $w $w.msg {top fill} $w.frame {top expand padx 10 pady 10} \
+           $w.ok {bottom fill}
+}
+
+
+# Procedure invoked by buttons in the puzzle to resize the puzzle entries:
+
+proc puzzle.switch {w num} {
+    global xpos ypos
+    if {(($ypos($num) >= ($ypos(space) - .01))
+           && ($ypos($num) <= ($ypos(space) + .01))
+           && ($xpos($num) >= ($xpos(space) - .26))
+           && ($xpos($num) <= ($xpos(space) + .26)))
+           || (($xpos($num) >= ($xpos(space) - .01))
+           && ($xpos($num) <= ($xpos(space) + .01))
+           && ($ypos($num) >= ($ypos(space) - .26))
+           && ($ypos($num) <= ($ypos(space) + .26)))} {
+       set tmp $xpos(space)
+       set xpos(space) $xpos($num)
+       set xpos($num) $tmp
+       set tmp $ypos(space)
+       set ypos(space) $ypos($num)
+       set ypos($num) $tmp
+       place $w.frame.$num -relx $xpos($num) -rely $ypos($num)
+    }
+}
diff --git a/src/tk/library/demos/mkRadio.tcl b/src/tk/library/demos/mkRadio.tcl
new file mode 100644 (file)
index 0000000..6f57c3d
--- /dev/null
@@ -0,0 +1,53 @@
+# mkRadio w
+#
+# Create a top-level window that displays a bunch of radio buttons.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkRadio {{w .r1}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Radiobutton Demonstration"
+    wm iconname $w "Radiobuttons"
+    message $w.msg -font -Adobe-times-medium-r-normal--*-180* -aspect 300 \
+           -text "Two groups of radiobuttons are displayed below.  If you click on a button then the button will become selected exclusively among all the buttons in its group.  A Tcl variable is associated with each group to indicate which of the group's buttons is selected.  Click the \"See Variables\" button to see the current values of the variables.  Click the \"OK\" button when you've seen enough."
+    frame $w.frame -borderwidth 10
+    pack append $w.frame \
+       [frame $w.frame.left] {left expand} \
+       [frame $w.frame.right] {right expand}
+    pack append $w.frame.left \
+       [radiobutton $w.frame.left.b1 -text "Point Size 10" -variable size \
+           -relief flat -value 10] {top pady 4 frame w} \
+       [radiobutton $w.frame.left.b2 -text "Point Size 12" -variable size \
+           -relief flat -value 12] {top pady 4 frame w} \
+       [radiobutton $w.frame.left.b3 -text "Point Size 18" -variable size \
+           -relief flat -value 18] {top pady 4 frame w} \
+       [radiobutton $w.frame.left.b4 -text "Point Size 24" -variable size \
+           -relief flat -value 24] {top pady 4 frame w}
+    pack append $w.frame.right \
+       [radiobutton $w.frame.right.b1 -text "Red" -variable color \
+           -relief flat -value red] {top pady 4 frame w} \
+       [radiobutton $w.frame.right.b2 -text "Green" -variable color \
+           -relief flat -value green] {top pady 4 frame w} \
+       [radiobutton $w.frame.right.b3 -text "Blue" -variable color \
+           -relief flat -value blue] {top pady 4 frame w} \
+       [radiobutton $w.frame.right.b4 -text "Yellow" -variable color \
+           -relief flat -value yellow] {top pady 4 frame w} \
+       [radiobutton $w.frame.right.b5 -text "Orange" -variable color \
+           -relief flat -value orange] {top pady 4 frame w} \
+       [radiobutton $w.frame.right.b6 -text "Purple" -variable color \
+           -relief flat -value purple] {top pady 4 frame w}
+    frame $w.frame2
+    pack append $w.frame2 \
+       [button $w.frame2.ok -text OK -command "destroy $w"] \
+           {left expand fill} \
+       [button $w.frame2.vars -text "See Variables" \
+           -command "showVars $w.dialog size color"] \
+           {left expand fill}
+    button $w.ok -text OK -command "destroy $w"
+
+    pack append $w $w.msg {top fill} $w.frame {top expand fill} \
+           $w.frame2 {bottom fill}
+}
diff --git a/src/tk/library/demos/mkRuler.tcl b/src/tk/library/demos/mkRuler.tcl
new file mode 100644 (file)
index 0000000..2aeb575
--- /dev/null
@@ -0,0 +1,124 @@
+# mkRuler w
+#
+# Create a canvas demonstration consisting of a ruler.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+# This file implements a canvas widget that displays a ruler with tab stops
+# that can be set individually.  The only procedure that should be invoked
+# from outside the file is the first one, which creates the canvas.
+
+proc mkRuler {{w .ruler}} {
+    global tk_library
+    upvar #0 demo_rulerInfo v
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Ruler Demonstration"
+    wm iconname $w "Ruler"
+    set c $w.c
+
+    frame $w.frame1 -relief raised -bd 2
+    canvas $c -width 14.8c -height 2.5c -relief raised
+    button $w.ok -text "OK" -command "destroy $w"
+    pack append $w $w.frame1 {top fill} $w.ok {bottom pady 10 frame center} \
+           $c {expand fill}
+    message $w.frame1.m -font -Adobe-Times-Medium-R-Normal-*-180-* -aspect 300 \
+           -text "This canvas widget shows a mock-up of a ruler.  You can create tab stops by dragging them out of the well to the right of the ruler.  You can also drag existing tab stops.  If you drag a tab stop far enough up or down so that it turns dim, it will be deleted when you release the mouse button."
+    pack append $w.frame1 $w.frame1.m {frame center}
+
+    set v(grid) .25c
+    set v(left) [winfo fpixels $c 1c]
+    set v(right) [winfo fpixels $c 13c]
+    set v(top) [winfo fpixels $c 1c]
+    set v(bottom) [winfo fpixels $c 1.5c]
+    set v(size) [winfo fpixels $c .2c]
+    set v(normalStyle) "-fill black"
+    if {[winfo screendepth $c] > 4} {
+       set v(activeStyle) "-fill red -stipple {}"
+       set v(deleteStyle) "-stipple @$tk_library/demos/bitmaps/grey.25 \
+               -fill red"
+    } else {
+       set v(activeStyle) "-fill black -stipple {}"
+       set v(deleteStyle) "-stipple @$tk_library/demos/bitmaps/grey.25 \
+               -fill black"
+    }
+
+    $c create line 1c 0.5c 1c 1c 13c 1c 13c 0.5c -width 1
+    for {set i 0} {$i < 12} {incr i} {
+       set x [expr $i+1]
+       $c create line ${x}c 1c ${x}c 0.6c -width 1
+       $c create line $x.25c 1c $x.25c 0.8c -width 1
+       $c create line $x.5c 1c $x.5c 0.7c -width 1
+       $c create line $x.75c 1c $x.75c 0.8c -width 1
+       $c create text $x.15c .75c -text $i -anchor sw
+    }
+    $c addtag well withtag [$c create rect 13.2c 1c 13.8c 0.5c \
+           -outline black -fill [lindex [$c config -bg] 4]]
+    $c addtag well withtag [rulerMkTab $c [winfo pixels $c 13.5c] \
+           [winfo pixels $c .65c]]
+
+    $c bind well <1> "rulerNewTab $c %x %y"
+    $c bind tab <1> "demo_selectTab $c %x %y"
+    bind $c <B1-Motion> "rulerMoveTab $c %x %y"
+    bind $c <Any-ButtonRelease-1> "rulerReleaseTab $c"
+}
+
+proc rulerMkTab {c x y} {
+    upvar #0 demo_rulerInfo v
+    $c create polygon $x $y [expr $x+$v(size)] [expr $y+$v(size)] \
+           [expr $x-$v(size)] [expr $y+$v(size)]
+}
+
+proc rulerNewTab {c x y} {
+    upvar #0 demo_rulerInfo v
+    $c addtag active withtag [rulerMkTab $c $x $y]
+    $c addtag tab withtag active
+    set v(x) $x
+    set v(y) $y
+    rulerMoveTab $c $x $y
+}
+
+proc rulerMoveTab {c x y} {
+    upvar #0 demo_rulerInfo v
+    if {[$c find withtag active] == ""} {
+       return
+    }
+    set cx [$c canvasx $x $v(grid)]
+    set cy [$c canvasy $y]
+    if {$cx < $v(left)} {
+       set cx $v(left)
+    }
+    if {$cx > $v(right)} {
+       set cx $v(right)
+    }
+    if {($cy >= $v(top)) && ($cy <= $v(bottom))} {
+       set cy [expr $v(top)+2]
+       eval "$c itemconf active $v(activeStyle)"
+    } else {
+       set cy [expr $cy-$v(size)-2]
+       eval "$c itemconf active $v(deleteStyle)"
+    }
+    $c move active [expr $cx-$v(x)] [expr $cy-$v(y)]
+    set v(x) $cx
+    set v(y) $cy
+}
+
+proc demo_selectTab {c x y} {
+    upvar #0 demo_rulerInfo v
+    set v(x) [$c canvasx $x $v(grid)]
+    set v(y) [expr $v(top)+2]
+    $c addtag active withtag current
+    eval "$c itemconf active $v(activeStyle)"
+    $c raise active
+}
+
+proc rulerReleaseTab c {
+    upvar #0 demo_rulerInfo v
+    if {$v(y) != [expr $v(top)+2]} {
+       $c delete active
+    } else {
+       eval "$c itemconf active $v(normalStyle)"
+       $c dtag active
+    }
+}
diff --git a/src/tk/library/demos/mkScroll.tcl b/src/tk/library/demos/mkScroll.tcl
new file mode 100644 (file)
index 0000000..fdb295e
--- /dev/null
@@ -0,0 +1,84 @@
+# mkScroll w
+#
+# Create a top-level window containing a simple canvas that can
+# be scrolled in two dimensions.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkScroll {{w .cscroll}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Scrollable Canvas Demonstration"
+    wm iconname $w "Canvas"
+    wm minsize $w 100 100
+    set c $w.frame2.c
+
+    frame $w.frame1 -relief raised -bd 2
+    frame $w.frame2 -relief raised -bd 2
+    button $w.ok -text "OK" -command "destroy $w"
+    pack append $w $w.frame1 {top fill} $w.ok {bottom pady 10 frame center} \
+           $w.frame2 {top expand fill}
+    message $w.frame1.m -font -Adobe-Times-Medium-R-Normal-*-180-* -aspect 300 \
+           -text "This window displays a canvas widget that can be scrolled either using the scrollbars or by dragging with button 2 in the canvas.  If you click button 1 on one of the rectangles, its indices will be printed on stdout."
+    pack append $w.frame1 $w.frame1.m {frame center}
+
+    canvas $c -scrollregion {-10c -10c 50c 20c}
+    scrollbar $w.frame2.vscroll  -relief sunken -command "$c yview"
+    scrollbar $w.frame2.hscroll -orient horiz -relief sunken -command "$c xview"
+    pack append $w.frame2 $w.frame2.hscroll {bottom fillx} \
+           $w.frame2.vscroll {right filly} $c {expand fill}
+    $c config -xscroll "$w.frame2.hscroll set" -yscroll "$w.frame2.vscroll set"
+
+    set bg [lindex [$c config -bg] 4]
+    for {set i 0} {$i < 20} {incr i} {
+       set x [expr {-10 + 3*$i}]
+       for {set j 0; set y -10} {$j < 10} {incr j; incr y 3} {
+           $c create rect ${x}c ${y}c [expr $x+2]c [expr $y+2]c \
+                   -outline black -fill $bg -tags rect
+           $c create text [expr $x+1]c [expr $y+1]c -text "$i,$j" \
+               -anchor center -tags text
+       }
+    }
+
+    $c bind all <Any-Enter> "scrollEnter $c"
+    $c bind all <Any-Leave> "scrollLeave $c"
+    $c bind all <1> "scrollButton $c"
+    bind $c <2> "$c scan mark %x %y"
+    bind $c <B2-Motion> "$c scan dragto %x %y"
+}
+
+proc scrollEnter canvas {
+    global oldFill
+    set id [$canvas find withtag current]
+    if {[lsearch [$canvas gettags current] text] >= 0} {
+       set id [expr $id-1]
+    }
+    set oldFill [lindex [$canvas itemconfig $id -fill] 4]
+    if {[winfo screendepth $canvas] > 4} {
+       $canvas itemconfigure $id -fill SeaGreen1
+    } else {
+       $canvas itemconfigure $id -fill black
+       $canvas itemconfigure [expr $id+1] -fill white
+    }
+}
+
+proc scrollLeave canvas {
+    global oldFill
+    set id [$canvas find withtag current]
+    if {[lsearch [$canvas gettags current] text] >= 0} {
+       set id [expr $id-1]
+    }
+    $canvas itemconfigure $id -fill $oldFill
+    $canvas itemconfigure [expr $id+1] -fill black
+}
+
+proc scrollButton canvas {
+    global oldFill
+    set id [$canvas find withtag current]
+    if {[lsearch [$canvas gettags current] text] < 0} {
+       set id [expr $id+1]
+    }
+    puts stdout "You buttoned at [lindex [$canvas itemconf $id -text] 4]"
+}
diff --git a/src/tk/library/demos/mkStyles.tcl b/src/tk/library/demos/mkStyles.tcl
new file mode 100644 (file)
index 0000000..5c8d841
--- /dev/null
@@ -0,0 +1,125 @@
+# mkStyles w
+#
+# Create a top-level window with a text widget that demonstrates the
+# various display styles that are available in texts.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkStyles {{w .styles}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Text Demonstration - Display Styles"
+    wm iconname $w "Text Styles"
+    button $w.ok -text OK -command "destroy $w"
+    text $w.t -relief raised -bd 2 -yscrollcommand "$w.s set" -setgrid true \
+           -width 70 -height 28
+    scrollbar $w.s -relief flat -command "$w.t yview"
+    pack append $w $w.ok {bottom fillx} $w.s {right filly} $w.t {expand fill}
+
+    # Set up display styles
+
+    $w.t tag configure bold -font -Adobe-Courier-Bold-O-Normal-*-120-*
+    $w.t tag configure big -font -Adobe-Courier-Bold-R-Normal-*-140-*
+    $w.t tag configure verybig -font -Adobe-Helvetica-Bold-R-Normal-*-240-*
+    if {[winfo screendepth $w] > 4} {
+       $w.t tag configure color1 -background #eed5b7
+       $w.t tag configure color2 -foreground red
+       $w.t tag configure raised -background #eed5b7 -relief raised \
+               -borderwidth 1
+       $w.t tag configure sunken -background #eed5b7 -relief sunken \
+               -borderwidth 1
+    } else {
+       $w.t tag configure color1 -background black -foreground white
+       $w.t tag configure color2 -background black -foreground white
+       $w.t tag configure raised -background white -relief raised \
+               -borderwidth 1
+       $w.t tag configure sunken -background white -relief sunken \
+               -borderwidth 1
+    }
+    $w.t tag configure bgstipple -background black -borderwidth 0 \
+           -bgstipple gray25
+    $w.t tag configure fgstipple -fgstipple gray50
+    $w.t tag configure underline -underline on
+
+    $w.t insert 0.0 {\
+Text widgets like this one allow you to display information in a
+variety of styles.  Display styles are controlled using a mechanism
+called }
+    insertWithTags $w.t tags bold
+    insertWithTags $w.t {. Tags are just textual names that you can apply to one
+or more ranges of characters within a text widget.  You can configure
+tags with various display styles.  If you do this, then the tagged
+characters will be displayed with the styles you chose.  The
+available display styles are:
+}
+    insertWithTags $w.t {
+1. Font.} big
+    insertWithTags $w.t {  You can choose any X font, }
+    insertWithTags $w.t large verybig
+    insertWithTags $w.t { or }
+    insertWithTags $w.t {small.
+}
+    insertWithTags $w.t {
+2. Color.} big
+    insertWithTags $w.t {  You can change either the }
+    insertWithTags $w.t background color1
+    insertWithTags $w.t { or }
+    insertWithTags $w.t foreground color2
+    insertWithTags $w.t {
+color, or }
+    insertWithTags $w.t both color1 color2
+    insertWithTags $w.t {.
+}
+    insertWithTags $w.t {
+3. Stippling.} big
+    insertWithTags $w.t {  You can cause either the }
+    insertWithTags $w.t background bgstipple
+    insertWithTags $w.t { or }
+    insertWithTags $w.t foreground fgstipple
+    insertWithTags $w.t {
+information to be drawn with a stipple fill instead of a solid fill.
+}
+    insertWithTags $w.t {
+4. Underlining.} big
+    insertWithTags $w.t {  You can }
+    insertWithTags $w.t underline underline
+    insertWithTags $w.t { ranges of text.
+}
+    insertWithTags $w.t {
+5. 3-D effects.} big
+    insertWithTags $w.t {  You can arrange for the background to be drawn
+with a border that makes characters appear either }
+    insertWithTags $w.t raised raised
+    insertWithTags $w.t { or }
+    insertWithTags $w.t sunken sunken
+    insertWithTags $w.t {.
+}
+    insertWithTags $w.t {
+6. Yet to come.} big
+    insertWithTags $w.t {  More display effects will be coming soon, such
+as the ability to change line justification and perhaps line spacing.}
+
+    $w.t mark set insert 0.0
+    bind $w <Any-Enter> "focus $w.t"
+}
+
+# The procedure below inserts text into a given text widget and
+# applies one or more tags to that text.  The arguments are:
+#
+# w            Window in which to insert
+# text         Text to insert (it's inserted at the "insert" mark)
+# args         One or more tags to apply to text.  If this is empty
+#              then all tags are removed from the text.
+
+proc insertWithTags {w text args} {
+    set start [$w index insert]
+    $w insert insert $text
+    foreach tag [$w tag names $start] {
+       $w tag remove $tag $start insert
+    }
+    foreach i $args {
+       $w tag add $i $start insert
+    }
+}
diff --git a/src/tk/library/demos/mkTear.tcl b/src/tk/library/demos/mkTear.tcl
new file mode 100644 (file)
index 0000000..7597228
--- /dev/null
@@ -0,0 +1,20 @@
+# mkTear w
+#
+# Create a top-level window that displays a help message on tear-off
+# menus.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkTear {{w .t1}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Information On Tear-Off Menus"
+    wm iconname $w "Info"
+    message $w.msg -font -Adobe-times-medium-r-normal--*-180* -aspect 250 \
+           -text "To tear off a menu, press mouse button 2 over the menubutton for the menu, then drag the menu with button 2 held down.  You can reposition a torn-off menu by pressing button 2 on it and dragging again.  To unpost the menu, click mouse button 1 over the menu's menubutton.  Click the \"OK\" button when you're finished with this window."
+    button $w.ok -text OK -command "destroy $w"
+
+    pack append $w $w.msg {top fill} $w.ok {bottom fill}
+}
diff --git a/src/tk/library/demos/mkTextBind.tcl b/src/tk/library/demos/mkTextBind.tcl
new file mode 100644 (file)
index 0000000..a7ec183
--- /dev/null
@@ -0,0 +1,98 @@
+# mkTextBind w
+#
+# Create a top-level window that illustrates how you can bind
+# Tcl commands to regions of text in a text widget.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkTextBind {{w .bindings}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Text Demonstration - Tag Bindings"
+    wm iconname $w "Text Bindings"
+    button $w.ok -text OK -command "destroy $w"
+    text $w.t -relief raised -bd 2 -yscrollcommand "$w.s set" -setgrid true \
+           -width 60 -height 28 \
+           -font "-Adobe-Helvetica-Bold-R-Normal-*-120-*"
+    scrollbar $w.s -relief flat -command "$w.t yview"
+    pack append $w $w.ok {bottom fillx} $w.s {right filly} $w.t {expand fill}
+
+    # Set up display styles
+
+    if {[winfo screendepth $w] > 4} {
+       set bold "-foreground red"
+       set normal "-foreground {}"
+    } else {
+       set bold "-foreground white -background black"
+       set normal "-foreground {} -background {}"
+    }
+    $w.t insert 0.0 {\
+The same tag mechanism that controls display styles in text
+widgets can also be used to associate Tcl commands with regions
+of text, so that mouse or keyboard actions on the text cause
+particular Tcl commands to be invoked.  For example, in the
+text below the descriptions of the canvas demonstrations have
+been tagged.  When you move the mouse over a demo description
+the description lights up, and when you press button 3 over a
+description then that particular demonstration is invoked.
+
+This demo package contains a number of demonstrations of Tk's
+canvas widgets.  Here are brief descriptions of some of the
+demonstrations that are available:
+
+}
+    insertWithTags $w.t \
+{1. Samples of all the different types of items that can be
+created in canvas widgets.} d1
+    insertWithTags $w.t \n\n
+    insertWithTags $w.t \
+{2. A simple two-dimensional plot that allows you to adjust
+the positions of the data points.} d2
+    insertWithTags $w.t \n\n
+    insertWithTags $w.t \
+{3. Anchoring and justification modes for text items.} d3
+    insertWithTags $w.t \n\n
+    insertWithTags $w.t \
+{4. An editor for arrow-head shapes for line items.} d4
+    insertWithTags $w.t \n\n
+    insertWithTags $w.t \
+{5. A ruler with facilities for editing tab stops.} d5
+    insertWithTags $w.t \n\n
+    insertWithTags $w.t \
+{6. A grid that demonstrates how canvases can be scrolled.} d6
+
+    foreach tag {d1 d2 d3 d4 d5 d6} {
+       $w.t tag bind $tag <Any-Enter> "$w.t tag configure $tag $bold"
+       $w.t tag bind $tag <Any-Leave> "$w.t tag configure $tag $normal"
+    }
+    $w.t tag bind d1 <3> mkItems
+    $w.t tag bind d2 <3> mkPlot
+    $w.t tag bind d3 <3> mkCanvText
+    $w.t tag bind d4 <3> mkArrow
+    $w.t tag bind d5 <3> mkRuler
+    $w.t tag bind d6 <3> mkScroll
+
+    $w.t mark set insert 0.0
+    bind $w <Any-Enter> "focus $w.t"
+}
+
+# The procedure below inserts text into a given text widget and
+# applies one or more tags to that text.  The arguments are:
+#
+# w            Window in which to insert
+# text         Text to insert (it's inserted at the "insert" mark)
+# args         One or more tags to apply to text.  If this is empty
+#              then all tags are removed from the text.
+
+proc insertWithTags {w text args} {
+    set start [$w index insert]
+    $w insert insert $text
+    foreach tag [$w tag names $start] {
+       $w tag remove $tag $start insert
+    }
+    foreach i $args {
+       $w tag add $i $start insert
+    }
+}
diff --git a/src/tk/library/demos/mkVScale.tcl b/src/tk/library/demos/mkVScale.tcl
new file mode 100644 (file)
index 0000000..eeebfab
--- /dev/null
@@ -0,0 +1,34 @@
+# mkVScale w
+#
+# Create a top-level window that displays a vertical scale.
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+
+proc mkVScale {{w .scale1}} {
+    catch {destroy $w}
+    toplevel $w
+    dpos $w
+    wm title $w "Vertical Scale Demonstration"
+    wm iconname $w "Scale"
+    message $w.msg -font -Adobe-times-medium-r-normal--*-180* -aspect 300 \
+           -text "A bar and a vertical scale are displayed below.  If you click or drag mouse button 1 in the scale, you can change the height of the bar.  Click the \"OK\" button when you're finished."
+    frame $w.frame -borderwidth 10
+    pack append $w.frame \
+       [scale $w.frame.scale -orient vertical -length 280 -from 0 -to 250 \
+           -command "setHeight $w.frame.right.inner" -tickinterval 50 \
+           -bg Bisque1] {left expand frame ne} \
+       [frame $w.frame.right -borderwidth 15] {right expand frame nw}
+    pack append $w.frame.right \
+       [frame $w.frame.right.inner -geometry 40x20 -relief raised \
+           -borderwidth 2 -bg SteelBlue1] {expand frame nw}
+    $w.frame.scale set 20
+    button $w.ok -text OK -command "destroy $w"
+
+    pack append $w $w.msg {top fill} $w.frame {top expand fill} \
+       $w.ok {bottom fill}
+}
+
+proc setHeight {w height} {
+    $w config -geometry 40x${height}
+}
diff --git a/src/tk/library/demos/rolodex b/src/tk/library/demos/rolodex
new file mode 100755 (executable)
index 0000000..6867535
--- /dev/null
@@ -0,0 +1,256 @@
+#!/usr/local/bin/wish -f
+#
+# This script was written as an entry in Tom LaStrange's rolodex
+# benchmark.  It creates something that has some of the look and
+# feel of a rolodex program, although it's lifeless and doesn't
+# actually do the rolodex application.
+
+foreach i [winfo child .] {
+    catch {destroy $i}
+}
+
+proc tkerror err {
+    global errorInfo
+    puts stdout "$errorInfo"
+}
+
+#------------------------------------------
+# Phase 0: create the front end.
+#------------------------------------------
+
+frame .frame -relief flat
+pack append . .frame {top filly frame center}
+
+set names {{} Name: Address: {} {} {Home Phone:} {Work Phone:} Fax:}
+foreach i {1 2 3 4 5 6 7} {
+    frame .frame.$i
+    pack append .frame .frame.$i {top pady 4 frame e}
+
+    label .frame.$i.label -text [lindex $names $i] -anchor e
+    entry .frame.$i.entry -width 30 -relief sunken
+    pack append .frame.$i .frame.$i.entry right .frame.$i.label right
+}
+
+frame .buttons
+pack append . .buttons {bottom pady 4 frame center}
+button .buttons.clear -text Clear
+button .buttons.add -text Add
+button .buttons.search -text Search
+button .buttons.delete -text "Delete ..."
+pack append .buttons .buttons.clear {left padx 4} \
+    .buttons.add {left padx 4} .buttons.search {left padx 4} \
+    .buttons.delete {left padx 4}
+
+#------------------------------------------
+# Phase 1: Add menus, dialog boxes
+#------------------------------------------
+
+frame .menu -relief raised -borderwidth 1
+pack before .frame .menu {top fillx}
+
+menubutton .menu.file -text "File" -menu .menu.file.m
+menu .menu.file.m
+.menu.file.m add command -label "Load ..." -command fileAction
+.menu.file.m add command -label "Exit" -command {destroy .}
+
+menubutton .menu.help -text "Help" -menu .menu.help.m
+menu .menu.help.m
+
+pack append .menu .menu.file left .menu.help right
+
+# The mkDialog procedure below was pirated from the widget demo.  It
+# was not written fresh for this benchmark.
+
+# Create a dialog box.  Takes three or more arguments.  The first is
+# the name of the window to use for the dialog box.  The second is a set
+# of arguments for use in creating the message of the dialog box.  The
+# third and following arguments consist of two-element lists, each
+# describing one button.  The first element gives the text to be displayed
+# in the button, the second gives the command to be invoked when the
+# button is invoked.
+
+proc mkDialog {w msgArgs args} {
+    catch {destroy $w}
+    toplevel $w -class Dialog
+    set oldFocus [focus]
+
+    # Create two frames in the main window. The top frame will hold the
+    # message and the bottom one will hold the buttons.  Arrange them
+    # one above the other, with any extra vertical space split between
+    # them.
+
+    frame $w.top -relief raised -border 1
+    frame $w.bot -relief raised -border 1
+    pack append $w $w.top {top fill expand} $w.bot {top fill expand}
+    
+    # Create the message widget and arrange for it to be centered in the
+    # top frame.
+    
+    eval message $w.top.msg -justify center \
+           -font -Adobe-times-medium-r-normal--*-180* $msgArgs
+    pack append $w.top $w.top.msg {top expand padx 5 pady 5}
+    
+    # Create as many buttons as needed and arrange them from left to right
+    # in the bottom frame.  Embed the left button in an additional sunken
+    # frame to indicate that it is the default button, and arrange for that
+    # button to be invoked as the default action for clicks and returns in
+    # the dialog.
+
+    if {[llength $args] > 0} {
+       set arg [lindex $args 0]
+       frame $w.bot.0 -relief sunken -border 1
+       pack append $w.bot $w.bot.0 {left expand padx 20 pady 20}
+       button $w.bot.0.button -text [lindex $arg 0] \
+               -command "[lindex $arg 1]; destroy $w; focus $oldFocus"
+       pack append $w.bot.0 $w.bot.0.button {expand padx 12 pady 12}
+       bind $w.top <Enter> "$w.bot.0.button activate"
+       bind $w.top.msg <Enter> "$w.bot.0.button activate"
+       bind $w.bot <Enter> "$w.bot.0.button activate"
+       bind $w.top <Leave> "$w.bot.0.button deactivate"
+       bind $w.top.msg <Leave> "$w.bot.0.button deactivate"
+       bind $w.bot <Leave> "$w.bot.0.button deactivate"
+       bind $w <1> "$w.bot.0.button config -relief sunken"
+       bind $w <ButtonRelease-1> \
+               "[lindex $arg 1]; $w.bot.0.button deactivate; destroy $w; focus $oldFocus"
+       bind $w <Return> "[lindex $arg 1]; destroy $w; focus $oldFocus"
+       focus $w
+
+       set i 1
+       foreach arg [lrange $args 1 end] {
+           button $w.bot.$i -text [lindex $arg 0] \
+                   -command "[lindex $arg 1]; destroy $w; focus $oldFocus"
+           pack append $w.bot $w.bot.$i {left expand padx 20}
+           set i [expr $i+1]
+       }
+    }
+    wm geometry $w +300+350
+}
+
+proc deleteAction {} {
+    mkDialog .delete {-text "Are you sure?" -aspect 10000} \
+           "OK clearAction" "Cancel {}"
+}
+.buttons.delete config -command deleteAction
+
+proc fileAction {} {
+    mkDialog .fileSelection {-text "This is a dummy file selection dialog box, which is used because there isn't a good file selection dialog built into Tk yet." -aspect 400} "OK {puts stderr {dummy file name}}"
+}
+
+#------------------------------------------
+# Phase 3: Print contents of card
+#------------------------------------------
+
+proc addAction {} {
+    global names
+    foreach i {1 2 3 4 5 6 7} {
+       puts stderr [format "%-12s %s" [lindex $names $i] [.frame.$i.entry get]]
+    }
+}
+.buttons.add config -command addAction
+
+#------------------------------------------
+# Phase 4: Miscellaneous other actions
+#------------------------------------------
+
+proc clearAction {} {
+    foreach i {1 2 3 4 5 6 7} {
+       .frame.$i.entry delete 0 end
+    }
+}
+.buttons.clear config -command clearAction
+
+proc fillCard {} {
+    clearAction
+    .frame.1.entry insert 0 "John Ousterhout"
+    .frame.2.entry insert 0 "CS Division, Department of EECS"
+    .frame.3.entry insert 0 "University of California"
+    .frame.4.entry insert 0 "Berkeley, CA 94720"
+    .frame.5.entry insert 0 "private"
+    .frame.6.entry insert 0 "510-642-0865"
+    .frame.7.entry insert 0 "510-642-5775"
+}
+.buttons.search config -command "addAction; fillCard"
+
+#----------------------------------------------------
+# Phase 5: Accelerators, mnemonics, command-line info
+#----------------------------------------------------
+
+.buttons.clear config -text "Clear    Ctrl+C"
+bind Entry <Control-c> clearAction
+.buttons.add config -text "Add    Ctrl+A"
+bind Entry <Control-a> addAction
+.buttons.search config -text "Search    Ctrl+S"
+bind Entry <Control-s> "addAction; fillCard"
+.buttons.delete config -text "Delete...    Ctrl+D"
+bind Entry <Control-d> deleteAction
+
+.menu.file.m entryconfig 0 -accel Ctrl+F
+bind Entry <Control-f> fileAction
+.menu.file.m entryconfig 1 -accel Ctrl+Q
+bind Entry <Control-q> {destroy .}
+
+focus .frame.1.entry
+
+#----------------------------------------------------
+# Phase 6: help
+#----------------------------------------------------
+
+proc Help {topic {x 0} {y 0}} {
+    global helpTopics helpCmds
+    if {$topic == ""} return
+    while {[info exists helpCmds($topic)]} {
+       set topic [eval $helpCmds($topic)]
+    }
+    if [info exists helpTopics($topic)] {
+       set msg $helpTopics($topic)
+    } else {
+       set msg "Sorry, but no help is available for this topic"
+    }
+    mkDialog .help "-text {Information on $topic:\n\n$msg} -justify left -aspect 300" "OK {}"
+}
+
+proc getMenuTopic {w x y} {
+    return $w.[$w index @[expr $y-[winfo rooty $w]]]
+}
+
+bind Entry <Any-F1> {Help [winfo containing %X %Y] %X %Y}
+bind Entry <Any-Help> {Help [winfo containing %X %Y] %X %Y}
+
+# Help text and commands follow:
+
+set helpTopics(.menu.file) {This is the "file" menu.  It can be used to invoke some overall operations on the rolodex applications, such as loading a file or exiting.}
+
+set helpCmds(.menu.file.m) {getMenuTopic $topic $x $y}
+set helpTopics(.menu.file.m.0) {The "Load" entry in the "File" menu posts a dialog box that you can use to select a rolodex file}
+set helpTopics(.menu.file.m.1) {The "Exit" entry in the "File" menu causes the rolodex application to terminate}
+set helpCmds(.menu.file.m.none) {set topic ".menu.file"}
+
+set helpTopics(.frame.1.entry) {In this field of the rolodex entry you should type the person's name}
+set helpTopics(.frame.2.entry) {In this field of the rolodex entry you should type the first line of the person's address}
+set helpTopics(.frame.3.entry) {In this field of the rolodex entry you should type the second line of the person's address}
+set helpTopics(.frame.4.entry) {In this field of the rolodex entry you should type the third line of the person's address}
+set helpTopics(.frame.5.entry) {In this field of the rolodex entry you should type the person's home phone number, or "private" if the person doesn't want his or her number publicized}
+set helpTopics(.frame.6.entry) {In this field of the rolodex entry you should type the person's work phone number}
+set helpTopics(.frame.7.entry) {In this field of the rolodex entry you should type the phone number for the person's FAX machine}
+
+set helpCmds(.frame.1.label) {set topic .frame.1.entry}
+set helpCmds(.frame.2.label) {set topic .frame.2.entry}
+set helpCmds(.frame.3.label) {set topic .frame.3.entry}
+set helpCmds(.frame.4.label) {set topic .frame.4.entry}
+set helpCmds(.frame.5.label) {set topic .frame.5.entry}
+set helpCmds(.frame.6.label) {set topic .frame.6.entry}
+set helpCmds(.frame.7.label) {set topic .frame.7.entry}
+
+set helpTopics(context) {Unfortunately, this application doesn't support context-sensitive help in the usual way, because Tk doesn't yet have a grab mechanism and this is needed for context-sensitive help.  Instead, you can achieve much the same effect by simply moving the mouse over the window you're curious about and pressing the Help or F1 keys.  You can do this anytime.}
+set helpTopics(help) {This application provides only very crude help.  Besides the entries in this menu, you can get help on individual windows by moving the mouse cursor over the window and pressing the Help or F1 keys.}
+set helpTopics(window) {This window is a dummy rolodex application created as part of Tom LaStrange's toolkit benchmark.  It doesn't really do anything useful except to demonstrate a few features of the Tk toolkit.}
+set helpTopics(keys) "The following accelerator keys are defined for this application (in addition to those already available for the entry windows):\n\nCtrl+A:\t\tAdd\nCtrl+C:\t\tClear\nCtrl+D:\t\tDelete\nCtrl+F:\t\tEnter file name\nCtrl+Q:\t\tExit application (quit)\nCtrl+S:\t\tSearch (dummy operation)"
+set helpTopics(version) {This is version 1.0.}
+
+# Entries in "Help" menu
+
+.menu.help.m add command -label "On Context..." -command {Help context}
+.menu.help.m add command -label "On Help..." -command {Help help}
+.menu.help.m add command -label "On Window..." -command {Help window}
+.menu.help.m add command -label "On Keys..." -command {Help keys}
+.menu.help.m add command -label "On Version..." -command {Help version} 
diff --git a/src/tk/library/demos/showVars.tcl b/src/tk/library/demos/showVars.tcl
new file mode 100644 (file)
index 0000000..a223ccc
--- /dev/null
@@ -0,0 +1,26 @@
+# showVars w var var var ...
+#
+# Create a top-level window that displays a bunch of global variable values
+# and keeps the display up-to-date even when the variables change value
+#
+# Arguments:
+#    w -       Name to use for new top-level window.
+#    var -     Name of variable to monitor.
+
+proc showVars {w args} {
+    catch {destroy $w}
+    toplevel $w
+    wm title $w "Variable values"
+    label $w.title -text "Variable values:" -width 20 -anchor center \
+           -font -Adobe-helvetica-medium-r-normal--*-180*
+    pack append $w $w.title {top fillx}
+    foreach i $args {
+       frame $w.$i
+       label $w.$i.name -text "$i: "
+       label $w.$i.value -textvar $i
+       pack append $w.$i $w.$i.name left $w.$i.value left
+       pack append $w $w.$i {top frame w}
+    }
+    button $w.ok -text OK -command "destroy $w"
+    pack append $w $w.ok {bottom pady 2}
+}
diff --git a/src/tk/library/demos/size b/src/tk/library/demos/size
new file mode 100755 (executable)
index 0000000..1e1f90e
--- /dev/null
@@ -0,0 +1,16 @@
+#!/usr/local/bin/wish -f
+#
+# Simple script to change size of something in a window.
+
+if "$argc < 3" {error "Usage: size appName window option"}
+set appName [lindex $argv 0]
+set widget [lindex $argv 1]
+set option [lindex $argv 2]
+
+pack append . [scale .scale -command {send $appName $widget config $option} \
+       -label "Pixels" -length 250 \
+       -from 0 -to 100 -orient vertical] {top expand filly}
+
+bind . <Control-q> {destroy .}
+bind . <Control-c> {destroy .}
+focus .
diff --git a/src/tk/library/demos/tclIndex b/src/tk/library/demos/tclIndex
new file mode 100644 (file)
index 0000000..a8c04e0
--- /dev/null
@@ -0,0 +1,62 @@
+# Tcl autoload index file: each line identifies a Tcl
+# procedure and the file where that procedure is
+# defined.  Generated by the "auto_mkindex" command.
+
+mkIcon mkIcon.tcl
+iconCmd mkIcon.tcl
+mkArrow mkArrow.tcl
+arrowSetup mkArrow.tcl
+arrowMove1 mkArrow.tcl
+arrowMove2 mkArrow.tcl
+arrowMove3 mkArrow.tcl
+mkBasic mkBasic.tcl
+mkRadio mkRadio.tcl
+mkCheck mkCheck.tcl
+mkDialog mkDialog.tcl
+mkEntry mkEntry.tcl
+mkLabel mkLabel.tcl
+mkItems mkItems.tcl
+itemEnter mkItems.tcl
+itemLeave mkItems.tcl
+itemMark mkItems.tcl
+itemStroke mkItems.tcl
+itemsUnderArea mkItems.tcl
+itemStartDrag mkItems.tcl
+itemDrag mkItems.tcl
+butPress mkItems.tcl
+mkButton mkButton.tcl
+mkStyles mkStyles.tcl
+insertWithTags mkStyles.tcl
+mkPlot mkPlot.tcl
+plotDown mkPlot.tcl
+plotMove mkPlot.tcl
+mkPuzzle mkPuzzle.tcl
+puzzle.switch mkPuzzle.tcl
+mkListbox mkListbox.tcl
+mkListbox2 mkListbox2.tcl
+mkListbox3 mkListbox3.tcl
+mkTear mkTear.tcl
+mkScroll mkScroll.tcl
+scrollEnter mkScroll.tcl
+scrollLeave mkScroll.tcl
+scrollButton mkScroll.tcl
+mkHScale mkHScale.tcl
+setWidth mkHScale.tcl
+mkVScale mkVScale.tcl
+setHeight mkVScale.tcl
+showVars showVars.tcl
+mkCanvText mkCanvText.tcl
+mkTextConfig mkCanvText.tcl
+textEnter mkCanvText.tcl
+textB1Press mkCanvText.tcl
+textB1Move mkCanvText.tcl
+textBs mkCanvText.tcl
+mkRuler mkRuler.tcl
+rulerMkTab mkRuler.tcl
+rulerNewTab mkRuler.tcl
+rulerMoveTab mkRuler.tcl
+demo_selectTab mkRuler.tcl
+rulerReleaseTab mkRuler.tcl
+mkTextBind mkTextBind.tcl
+insertWithTags mkTextBind.tcl
+mkEntry2 mkEntry2.tcl
diff --git a/src/tk/library/demos/timer b/src/tk/library/demos/timer
new file mode 100755 (executable)
index 0000000..03383fe
--- /dev/null
@@ -0,0 +1,29 @@
+#!/usr/local/bin/wish -f
+#
+# This script generates a counter with start and stop buttons.
+
+label .counter -text 0.00 -relief raised -width 10
+button .start -text Start -command "set stop 0; tick"
+button .stop -text Stop -command {set stop 1}
+pack append . .counter {bot fill} .start {left expand fill} \
+       .stop {right expand fill}
+
+set seconds 0
+set hundredths 0
+set stop 0
+
+proc tick {} {
+    global seconds hundredths stop
+    if $stop return
+    after 20 tick
+    set hundredths [expr $hundredths+2]
+    if {$hundredths >= 100} {
+       set hundredths 0
+       set seconds [expr $seconds+1]
+    }
+    .counter config -text [format "%d.%2d" $seconds $hundredths]
+}
+
+bind . <Control-c> {destroy .}
+bind . <Control-q> {destroy .}
+focus .
diff --git a/src/tk/library/demos/tkSquare.c b/src/tk/library/demos/tkSquare.c
new file mode 100644 (file)
index 0000000..311b2c3
--- /dev/null
@@ -0,0 +1,531 @@
+/* 
+ * tkSquare.c --
+ *
+ *     This module implements "square" widgets.  A "square" is
+ *     a widget that displays a single square that can be moved
+ *     around and resized.  This file is intended as an example
+ *     of how to build a widget.
+ *
+ * Copyright 1991-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/scripts/demos/RCS/tkSquare.c,v 1.2 92/04/29 11:45:17 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkConfig.h"
+#include "tk.h"
+
+/*
+ * A data structure of the following type is kept for each square
+ * widget managed by this file:
+ */
+
+typedef struct {
+    Tk_Window tkwin;           /* Window that embodies the square.  NULL
+                                * means that the window has been destroyed
+                                * but the data structures haven't yet been
+                                * cleaned up.*/
+    Tcl_Interp *interp;                /* Interpreter associated with widget. */
+    int x, y;                  /* Position of square's upper-left corner
+                                * within widget. */
+    int size;                  /* Width and height of square. */
+    int flags;                 /* Various flags;  see below for
+                                * definitions. */
+
+    /*
+     * Information used when displaying widget:
+     */
+
+    int borderWidth;           /* Width of 3-D border around whole widget. */
+    Tk_3DBorder bgBorder;      /* Used for drawing background. */
+    Tk_3DBorder fgBorder;      /* For drawing square. */
+    int relief;                        /* Indicates whether window as a whole is
+                                * raised, sunken, or flat. */
+    int doubleBuffer;          /* Non-zero means double-buffer redisplay
+                                * with pixmap;  zero means draw straight
+                                * onto the display. */
+} Square;
+
+/*
+ * Flag bits for squares:
+ *
+ * REDRAW_PENDING -            1 means redraw has already been scheduled.
+ */
+
+#define REDRAW_PENDING         1
+
+/*
+ * Information used for argv parsing.
+ */
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       "#cdb79e", Tk_Offset(Square, bgBorder), TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       "white", Tk_Offset(Square, bgBorder), TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_INT, "-borderwidth", "borderWidth", "BorderWidth",
+       "2", Tk_Offset(Square, borderWidth), 0},
+    {TK_CONFIG_INT, "-dbl", "doubleBuffer", "DoubleBuffer",
+       "1", Tk_Offset(Square, doubleBuffer), 0},
+    {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_BORDER, "-foreground", "foreground", "Foreground",
+       "#b03060", Tk_Offset(Square, fgBorder), TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-foreground", "foreground", "Foreground",
+       "black", Tk_Offset(Square, fgBorder), TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
+       "raised", Tk_Offset(Square, relief), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static int             ConfigureSquare _ANSI_ARGS_((Tcl_Interp *interp,
+                           Square *squarePtr, int argc, char **argv,
+                           int flags));
+static void            DestroySquare _ANSI_ARGS_((ClientData clientData));
+static void            DisplaySquare _ANSI_ARGS_((ClientData clientData));
+static void            KeepInWindow _ANSI_ARGS_((Square *squarePtr));
+static void            SquareEventProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static int             SquareWidgetCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *, int argc, char **argv));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_SquareCmd --
+ *
+ *     This procedure is invoked to process the "square" Tcl
+ *     command.  It creates a new "square" widget.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     A new widget is created and configured.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_SquareCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window main = (Tk_Window) clientData;
+    register Square *squarePtr;
+    Tk_Window tkwin;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args:  should be \"",
+               argv[0], " pathName ?options?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    tkwin = Tk_CreateWindowFromPath(interp, main, argv[1], (char *) NULL);
+    if (tkwin == NULL) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * Initialize fields that won't be initialized by ConfigureSquare,
+     * or which ConfigureSquare expects to have reasonable values
+     * (e.g. resource pointers).
+     */
+
+    squarePtr = (Square *) ckalloc(sizeof(Square));
+    squarePtr->tkwin = tkwin;
+    squarePtr->interp = interp;
+    squarePtr->x = 0;
+    squarePtr->y = 0;
+    squarePtr->size = 20;
+    squarePtr->bgBorder = NULL;
+    squarePtr->fgBorder = NULL;
+    squarePtr->flags = 0;
+
+    Tk_SetClass(squarePtr->tkwin, "Square");
+    Tk_CreateEventHandler(squarePtr->tkwin, ExposureMask|StructureNotifyMask,
+           SquareEventProc, (ClientData) squarePtr);
+    Tcl_CreateCommand(interp, Tk_PathName(squarePtr->tkwin), SquareWidgetCmd,
+           (ClientData) squarePtr, (void (*)()) NULL);
+    if (ConfigureSquare(interp, squarePtr, argc-2, argv+2, 0) != TCL_OK) {
+       Tk_DestroyWindow(squarePtr->tkwin);
+       return TCL_ERROR;
+    }
+
+    interp->result = Tk_PathName(squarePtr->tkwin);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureSquare --
+ *
+ *     This procedure is called to process an argv/argc list in
+ *     conjunction with the Tk option database to configure (or
+ *     reconfigure) a square widget.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information, such as colors, border width,
+ *     etc. get set for squarePtr;  old resources get freed,
+ *     if there were any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureSquare(interp, squarePtr, argc, argv, flags)
+    Tcl_Interp *interp;                        /* Used for error reporting. */
+    register Square *squarePtr;                /* Information about widget. */
+    int argc;                          /* Number of valid entries in argv. */
+    char **argv;                       /* Arguments. */
+    int flags;                         /* Flags to pass to
+                                        * Tk_ConfigureWidget. */
+{
+    if (Tk_ConfigureWidget(interp, squarePtr->tkwin, configSpecs,
+           argc, argv, (char *) squarePtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few options need special processing, such as setting the
+     * background from a 3-D border.
+     */
+
+    Tk_SetBackgroundFromBorder(squarePtr->tkwin, squarePtr->bgBorder);
+
+    /*
+     * Register the desired geometry for the window.  Then arrange for
+     * the window to be redisplayed.
+     */
+
+    Tk_GeometryRequest(squarePtr->tkwin, 200, 150);
+    Tk_SetInternalBorder(squarePtr->tkwin, squarePtr->borderWidth);
+    if (!(squarePtr->flags & REDRAW_PENDING)) {
+       Tk_DoWhenIdle(DisplaySquare, (ClientData) squarePtr);
+       squarePtr->flags |= REDRAW_PENDING;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplaySquare --
+ *
+ *     This procedure redraws the contents of a square window.
+ *     It is invoked as a do-when-idle handler, so it only runs
+ *     when there's nothing else for the application to do.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information appears on the screen.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplaySquare(clientData)
+    ClientData clientData;     /* Information about window. */
+{
+    register Square *squarePtr = (Square *) clientData;
+    register Tk_Window tkwin = squarePtr->tkwin;
+    Pixmap pm = None;
+    Drawable d;
+
+    squarePtr->flags &= ~REDRAW_PENDING;
+    if ((tkwin == NULL) || !Tk_IsMapped(tkwin)) {
+       return;
+    }
+
+    /*
+     * Create a pixmap for double-buffering, if necessary.
+     */
+
+    if (squarePtr->doubleBuffer) {
+       pm = XCreatePixmap(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               Tk_Width(tkwin), Tk_Height(tkwin),
+               DefaultDepthOfScreen(Tk_Screen(tkwin)));
+       d = pm;
+    } else {
+       d = Tk_WindowId(tkwin);
+    }
+
+    /*
+     * Redraw the widget's background and border.
+     */
+
+    Tk_Fill3DRectangle(Tk_Display(tkwin), d, squarePtr->bgBorder,
+           0, 0, Tk_Width(tkwin), Tk_Height(tkwin),
+           squarePtr->borderWidth, squarePtr->relief);
+
+    /*
+     * Display the square.
+     */
+
+    Tk_Fill3DRectangle(Tk_Display(tkwin), d, squarePtr->fgBorder,
+           squarePtr->x, squarePtr->y, squarePtr->size, squarePtr->size,
+           squarePtr->borderWidth, TK_RELIEF_RAISED);
+
+    /*
+     * If double-buffered, copy to the screen and release the pixmap.
+     */
+
+    if (squarePtr->doubleBuffer) {
+       XCopyArea(Tk_Display(tkwin), pm, Tk_WindowId(tkwin),
+               DefaultGCOfScreen(Tk_Screen(tkwin)), 0, 0,
+               Tk_Width(tkwin), Tk_Height(tkwin), 0, 0);
+       XFreePixmap(Tk_Display(tkwin), pm);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * SquareWidgetCmd --
+ *
+ *     This procedure is invoked to process the Tcl command
+ *     that corresponds to a widget managed by this module.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+SquareWidgetCmd(clientData, interp, argc, argv)
+    ClientData clientData;             /* Information about square widget. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    register Square *squarePtr = (Square *) clientData;
+    int result = TCL_OK;
+    int length;
+    char c;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    Tk_Preserve((ClientData) squarePtr);
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)) {
+       if (argc == 2) {
+           result = Tk_ConfigureInfo(interp, squarePtr->tkwin, configSpecs,
+                   (char *) squarePtr, (char *) NULL, 0);
+       } else if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, squarePtr->tkwin, configSpecs,
+                   (char *) squarePtr, argv[2], 0);
+       } else {
+           result = ConfigureSquare(interp, squarePtr, argc-2, argv+2,
+                   TK_CONFIG_ARGV_ONLY);
+       }
+    } else if ((c == 'p') && (strncmp(argv[1], "position", length) == 0)) {
+       if ((argc != 2) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " position ?x y?\"", (char *) NULL);
+           goto error;
+       }
+       if (argc == 4) {
+           if ((Tcl_GetInt(interp, argv[2], &squarePtr->x) != TCL_OK)
+                   || (Tcl_GetInt(interp, argv[3], &squarePtr->y) != TCL_OK)) {
+               goto error;
+           }
+           KeepInWindow(squarePtr);
+       }
+       sprintf(interp->result, "%d %d", squarePtr->x, squarePtr->y);
+    } else if ((c == 's') && (strncmp(argv[1], "size", length) == 0)) {
+       if ((argc != 2) && (argc != 3)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " size ?amount?\"", (char *) NULL);
+           goto error;
+       }
+       if (argc == 3) {
+           int i;
+
+           if (Tcl_GetInt(interp, argv[2], &i) != TCL_OK) {
+               goto error;
+           }
+           if ((i <= 0) || (i > 100)) {
+               Tcl_AppendResult(interp, "bad size \"", argv[2],
+                       "\"", (char *) NULL);
+               goto error;
+           }
+           squarePtr->size = i;
+           KeepInWindow(squarePtr);
+       }
+       sprintf(interp->result, "%d", squarePtr->size);
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\":  must be configure, position, or size", (char *) NULL);
+       goto error;
+    }
+    if (!(squarePtr->flags & REDRAW_PENDING)) {
+       Tk_DoWhenIdle(DisplaySquare, (ClientData) squarePtr);
+       squarePtr->flags |= REDRAW_PENDING;
+    }
+    Tk_Release((ClientData) squarePtr);
+    return result;
+
+    error:
+    Tk_Release((ClientData) squarePtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * SquareEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher for various
+ *     events on squares.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the window gets deleted, internal structures get
+ *     cleaned up.  When it gets exposed, it is redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+SquareEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    XEvent *eventPtr;          /* Information about event. */
+{
+    Square *squarePtr = (Square *) clientData;
+
+    if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {
+       if (!(squarePtr->flags & REDRAW_PENDING)) {
+           Tk_DoWhenIdle(DisplaySquare, (ClientData) squarePtr);
+           squarePtr->flags |= REDRAW_PENDING;
+       }
+    } else if (eventPtr->type == ConfigureNotify) {
+       KeepInWindow(squarePtr);
+       if (!(squarePtr->flags & REDRAW_PENDING)) {
+           Tk_DoWhenIdle(DisplaySquare, (ClientData) squarePtr);
+           squarePtr->flags |= REDRAW_PENDING;
+       }
+    } else if (eventPtr->type == DestroyNotify) {
+       Tcl_DeleteCommand(squarePtr->interp, Tk_PathName(squarePtr->tkwin));
+       squarePtr->tkwin = NULL;
+       if (squarePtr->flags & REDRAW_PENDING) {
+           Tk_CancelIdleCall(DisplaySquare, (ClientData) squarePtr);
+       }
+       Tk_EventuallyFree((ClientData) squarePtr, DestroySquare);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroySquare --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a square at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the square is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroySquare(clientData)
+    ClientData clientData;     /* Info about square widget. */
+{
+    register Square *squarePtr = (Square *) clientData;
+
+    if (squarePtr->bgBorder != NULL) {
+       Tk_Free3DBorder(squarePtr->bgBorder);
+    }
+    if (squarePtr->fgBorder != NULL) {
+       Tk_Free3DBorder(squarePtr->fgBorder);
+    }
+    ckfree((char *) squarePtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * KeepInWindow --
+ *
+ *     Adjust the position of the square if necessary to keep it in
+ *     the widget's window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The x and y position of the square are adjusted if necessary
+ *     to keep the square in the window.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+KeepInWindow(squarePtr)
+    register Square *squarePtr;                /* Pointer to widget record. */
+{
+    int i, bd;
+
+    if (squarePtr->relief == TK_RELIEF_FLAT) {
+       bd = 0;
+    } else {
+       bd = squarePtr->borderWidth;
+    }
+    i = (Tk_Width(squarePtr->tkwin) - bd) - (squarePtr->x + squarePtr->size);
+    if (i < 0) {
+       squarePtr->x += i;
+    }
+    i = (Tk_Height(squarePtr->tkwin) - bd) - (squarePtr->y + squarePtr->size);
+    if (i < 0) {
+       squarePtr->y += i;
+    }
+    if (squarePtr->x < bd) {
+       squarePtr->x = bd;
+    }
+    if (squarePtr->y < bd) {
+       squarePtr->y = bd;
+    }
+}
diff --git a/src/tk/library/demos/widget b/src/tk/library/demos/widget
new file mode 100755 (executable)
index 0000000..d3802a4
--- /dev/null
@@ -0,0 +1,161 @@
+#!/usr/local/bin/wish -f
+#
+# This script demonstrates the various widgets provided by Tk,
+# along with many of the features of the Tk toolkit.
+
+set auto_path "$tk_library/demos $auto_path"
+wm title . "Widget Demonstration"
+
+#-------------------------------------------------------
+# The code below create the main window, consisting of a
+# menu bar and a message explaining the basic operation
+# of the program.
+#-------------------------------------------------------
+
+frame .menu -relief raised -borderwidth 1
+message .msg -font -Adobe-times-medium-r-normal--*-180* -relief raised -width 500 \
+-borderwidth 1 -text "This application demonstrates the widgets provided by the Tk toolkit.  The menus above are organized by widget type:  each menu contains one or more demonstrations of a particular type of widget.  To invoke a demonstration, press mouse button 1 over one of the menu buttons above, drag the mouse to the desired entry in the menu, then release the mouse button.
+
+To exit this demonstration, invoke the \"Quit\" entry in the \"Misc\" menu."
+
+pack append . .menu {top fillx} .msg {bottom expand fill}
+
+#-------------------------------------------------------
+# The code below creates all the menus, which invoke procedures
+# to create particular demonstrations of various widgets.
+#-------------------------------------------------------
+
+menubutton .menu.button -text "Labels/Buttons" -menu .menu.button.m \
+    -underline 7
+menu .menu.button.m
+.menu.button.m add command -label "Labels" -command "mkLabel" -underline 0
+.menu.button.m add command -label "Buttons" -command "mkButton" -underline 0
+.menu.button.m add command -label "Checkbuttons" -command "mkCheck" \
+    -underline 0
+.menu.button.m add command -label "Radiobuttons" -command "mkRadio" \
+    -underline 0
+.menu.button.m add command -label "15-puzzle" -command "mkPuzzle" -underline 0
+.menu.button.m add command -label "Iconic buttons" -command "mkIcon" \
+    -underline 0
+
+menubutton .menu.listbox -text "Listboxes" -menu .menu.listbox.m -underline 0
+menu .menu.listbox.m
+.menu.listbox.m add command -label "States" -command "mkListbox" -underline 0
+.menu.listbox.m add command -label "Colors" -command "mkListbox2" -underline 0
+.menu.listbox.m add command -label "Well-known sayings" -command mkListbox3 \
+    -underline 0
+
+menubutton .menu.entry -text "Entries" -menu .menu.entry.m -underline 0
+menu .menu.entry.m
+.menu.entry.m add command -label "Without scrollbars" -command "mkEntry" \
+    -underline 4
+.menu.entry.m add command -label "With scrollbars" -command "mkEntry2" \
+    -underline 0
+
+menubutton .menu.text -text "Text" -menu .menu.text.m -underline 0
+menu .menu.text.m
+.menu.text.m add command -label "Basic text" -command "mkBasic" \
+    -underline 0
+.menu.text.m add command -label "Display styles" -command "mkStyles" \
+    -underline 0
+.menu.text.m add command -label "Command bindings" -command "mkTextBind" \
+    -underline 0
+
+menubutton .menu.scroll -text "Scrollbars" -menu .menu.scroll.m -underline 0
+menu .menu.scroll.m
+.menu.scroll.m add command -label "Vertical" -command "mkListbox2" -underline 0
+.menu.scroll.m add command -label "Horizontal" -command "mkEntry2" -underline 0
+
+menubutton .menu.scale -text "Scales" -menu .menu.scale.m -underline 2
+menu .menu.scale.m
+.menu.scale.m add command -label "Vertical" -command "mkVScale" -underline 0
+.menu.scale.m add command -label "Horizontal" -command "mkHScale" -underline 0
+
+menubutton .menu.canvas -text "Canvases" -menu .menu.canvas.m -underline 0
+menu .menu.canvas.m
+.menu.canvas.m add command -label "Item types" -command mkItems -underline 0
+.menu.canvas.m add command -label "2-D plot" -command mkPlot -underline 0
+.menu.canvas.m add command -label "Text" -command mkCanvText -underline 0
+.menu.canvas.m add command -label "Arrow shapes" -command mkArrow -underline 0
+.menu.canvas.m add command -label "Ruler" -command mkRuler -underline 0
+.menu.canvas.m add command -label "Scrollable canvas" -command mkScroll \
+    -underline 0
+
+menubutton .menu.menu -text "Menus" -menu .menu.menu.m -underline 0
+menu .menu.menu.m
+.menu.menu.m add command -label "Print hello" -command {puts stdout "Hello"} \
+    -accelerator Control+a -underline 6
+bind .msg <Control-a> {puts stdout "Hello"}
+.menu.menu.m add command -label "Print goodbye" -command {\
+    puts stdout "Goodbye"} -accelerator Control+b -underline 6
+bind .msg <Control-b> {puts stdout "Goodbye"}
+.menu.menu.m add command -label "Light blue background" \
+    -command {.msg config -bg "LightBlue1"} -underline 0
+.menu.menu.m add command -label "Info on tear-off menus" -command mkTear \
+    -underline 0
+.menu.menu.m add cascade -label "Check buttons =>" -menu .menu.menu.m.check \
+    -underline 0
+.menu.menu.m add cascade -label "Radio buttons =>" -menu .menu.menu.m.radio \
+    -underline 0
+.menu.menu.m add command -bitmap @$tk_library/demos/bitmaps/pattern \
+    -command {
+       mkDialog .pattern {-text {The menu entry you invoked displays a bitmap rather than a text string.  Other than this, it is just like any other menu entry.} -aspect 250} {OK {}}
+    }
+
+menu .menu.menu.m.check
+.menu.menu.m.check add check -label "Oil checked" -variable oil
+.menu.menu.m.check add check -label "Transmission checked" -variable trans
+.menu.menu.m.check add check -label "Brakes checked" -variable brakes
+.menu.menu.m.check add check -label "Lights checked" -variable lights
+.menu.menu.m.check add separator
+.menu.menu.m.check add command -label "Show current values" \
+    -command "showVars .menu.menu.dialog oil trans brakes lights"
+.menu.menu.m.check invoke 1
+.menu.menu.m.check invoke 3
+
+menu .menu.menu.m.radio
+.menu.menu.m.radio add radio -label "10 point" -variable pointSize -value 10
+.menu.menu.m.radio add radio -label "14 point" -variable pointSize -value 14
+.menu.menu.m.radio add radio -label "18 point" -variable pointSize -value 18
+.menu.menu.m.radio add radio -label "24 point" -variable pointSize -value 24
+.menu.menu.m.radio add radio -label "32 point" -variable pointSize -value 32
+.menu.menu.m.radio add sep
+.menu.menu.m.radio add radio -label "Roman" -variable style -value roman
+.menu.menu.m.radio add radio -label "Bold" -variable style -value bold
+.menu.menu.m.radio add radio -label "Italic" -variable style -value italic
+.menu.menu.m.radio add sep
+.menu.menu.m.radio add command -label "Show current values" -command \
+    "showVars .menu.menu.dialog pointSize style"
+.menu.menu.m.radio invoke 1
+.menu.menu.m.radio invoke 7
+
+menubutton .menu.misc -text Misc -menu .menu.misc.m -underline 1
+menu .menu.misc.m
+.menu.misc.m add command -label "Modal dialog (local grab)" -command {
+    mkDialog .modal {-text {This dialog box is a modal one.  It uses Tk's "grab" command to create a "local grab" on the dialog box.  The grab prevents any pointer-related events from getting to any other windows in the application.  If you press the "OK" button below (or hit the Return key) then the dialog box will go away and things will return to normal.} -aspect 250 -justify left} {OK {}}
+    dpos .modal
+    bind .modal <Visibility> {grab .modal; focus .modal}
+} -underline 0
+.menu.misc.m add command -label "Modal dialog (global grab)" -command {
+    mkDialog .modal {-text {This is another modal dialog box.  However, in this case a "global grab" is used, which locks up the display so you can't talk to any windows in any applications anywhere, except for the dialog.  If you press the "OK" button below (or hit the Return key) then the dialog box will go away and things will return to normal.} -aspect 250 -justify left} {OK {}}
+    dpos .modal
+    bind .modal <Visibility> {grab -global .modal; focus .modal}
+} -underline 0
+.menu.misc.m add command -label "Quit" -command "destroy ." -underline 0
+
+pack append .menu .menu.button left .menu.listbox left \
+    .menu.entry left .menu.text left .menu.scroll left .menu.scale left \
+    .menu.canvas left .menu.menu left .menu.misc left
+
+# Set up for keyboard-based menu traversal
+
+tk_bindForTraversal .msg
+bind . <Any-Enter> {focus .msg}
+tk_menus . .menu.button .menu.listbox .menu.entry .menu.text \
+       .menu.scroll .menu.scale .menu.canvas .menu.menu .menu.misc
+
+# Position a dialog box at a reasonable place on the screen.
+
+proc dpos w {
+    wm geometry $w +300+300
+}
diff --git a/src/tk/library/entry.tcl b/src/tk/library/entry.tcl
new file mode 100644 (file)
index 0000000..237b826
--- /dev/null
@@ -0,0 +1,57 @@
+# entry.tcl --
+#
+# This file contains Tcl procedures used to manage Tk entries.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/entry.tcl,v 1.2 92/05/23 16:40:57 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# The procedure below is invoked to backspace over one character
+# in an entry widget.  The name of the widget is passed as argument.
+
+proc tk_entryBackspace w {
+    set x [expr {[$w index cursor] - 1}]
+    if {$x != -1} {$w delete $x}
+}
+
+# The procedure below is invoked to backspace over one word in an
+# entry widget.  The name of the widget is passed as argument.
+
+proc tk_entryBackword w {
+    set string [$w get]
+    set curs [expr [$w index cursor]-1]
+    if {$curs < 0} return
+    for {set x $curs} {$x > 0} {incr x -1} {
+       if {([string first [string index $string $x] " \t"] < 0)
+               && ([string first [string index $string [expr $x-1]] " \t"]
+               >= 0)} {
+           break
+       }
+    }
+    $w delete $x $curs
+}
+
+# The procedure below is invoked after insertions.  If the caret is not
+# visible in the window then the procedure adjusts the entry's view to
+# bring the caret back into the window again.
+
+proc tk_entrySeeCaret w {
+    set c [$w index cursor]
+    set left [$w index @0]
+    if {$left > $c} {
+       $w view $c
+       return
+    }
+    while {[$w index @[expr [winfo width $w]-5]] < $c} {
+       set left [expr $left+1]
+       $w view $left
+    }
+}
diff --git a/src/tk/library/listbox.tcl b/src/tk/library/listbox.tcl
new file mode 100644 (file)
index 0000000..a1f6992
--- /dev/null
@@ -0,0 +1,29 @@
+# listbox.tcl --
+#
+# This file contains Tcl procedures used to manage Tk listboxes.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/listbox.tcl,v 1.2 92/06/03 15:21:28 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# The procedure below may be invoked to change the behavior of
+# listboxes so that only a single item may be selected at once.
+# The arguments give one or more windows whose behavior should
+# be changed;  if one of the arguments is "Listbox" then the default
+# behavior is changed for all listboxes.
+
+proc tk_listboxSingleSelect args {
+    foreach w $args {
+       bind $w <B1-Motion> {%W select from [%W nearest %y]} 
+       bind $w <Shift-1> {%W select from [%W nearest %y]}
+       bind $w <Shift-B1-Motion> {%W select from [%W nearest %y]}
+    }
+}
diff --git a/src/tk/library/menu.tcl b/src/tk/library/menu.tcl
new file mode 100644 (file)
index 0000000..1ddf0ed
--- /dev/null
@@ -0,0 +1,303 @@
+# menu.tcl --
+#
+# This file contains Tcl procedures used to manage Tk menus and
+# menubuttons.  Most of the code here is dedicated to support for
+# menu traversal via the keyboard.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/menu.tcl,v 1.11 92/08/08 14:49:55 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# The procedure below is publically available.  It is used to indicate
+# the menus associated with a particular top-level window, for purposes
+# of keyboard menu traversal.  Its first argument is the path name of
+# a top-level window, and any additional arguments are the path names of
+# the menu buttons associated with that top-level window, in the order
+# they should be traversed.  If no menu buttons are named, the procedure
+# returns the current list of menus for w.  If a single empty string is
+# supplied, then the menu list for w is cancelled.  Otherwise, tk_menus
+# sets the menu list for w to the menu buttons.
+
+proc tk_menus {w args} {
+    global tk_priv
+
+    if {$args == ""} {
+       if [catch {set result [set tk_priv(menusFor$w)]}] {
+           return ""
+       }
+       return $result
+    }
+
+    if {$args == "{}"} {
+       catch {unset tk_priv(menusFor$w)}
+       return ""
+    }
+
+    set tk_priv(menusFor$w) $args
+}
+
+# The procedure below is publically available.  It takes any number of
+# arguments taht are names of widgets or classes.  It sets up bindings
+# for the widgets or classes so that keyboard menu traversal is possible
+# when the input focus is in those widgets or classes.
+
+proc tk_bindForTraversal args {
+    foreach w $args {
+       bind $w <Alt-KeyPress> {tk_traverseToMenu %W %A}
+       bind $w <F10> {tk_firstMenu %W}
+    }
+}
+
+# The procedure below does all of the work of posting a menu (including
+# unposting any other menu that might currently be posted).  The "w"
+# argument is the name of the menubutton for the menu to be posted.
+# Note:  if $w is disabled then the procedure does nothing.
+
+proc tk_mbPost {w} {
+    global tk_priv tk_strictMotif
+    if {[lindex [$w config -state] 4] == "disabled"} {
+       return
+    }
+    set cur $tk_priv(posted)
+    if {$cur == $w} {
+       return
+    }
+    if {$cur != ""} tk_mbUnpost
+    set tk_priv(relief) [lindex [$w config -relief] 4]
+    $w config -relief raised
+    set tk_priv(cursor) [lindex [$w config -cursor] 4]
+    $w config -cursor arrow
+    $w post
+    grab -global $w
+    set tk_priv(posted) $w
+    if {$tk_priv(focus) == ""} {
+       set tk_priv(focus) [focus]
+    }
+    set menu [lindex [$w config -menu] 4]
+    set tk_priv(activeBg) [lindex [$menu config -activebackground] 4]
+    set tk_priv(activeFg) [lindex [$menu config -activeforeground] 4]
+    if $tk_strictMotif {
+       $menu config -activebackground [lindex [$menu config -background] 4]
+       $menu config -activeforeground [lindex [$menu config -foreground] 4]
+    }
+    focus $menu
+}
+
+# The procedure below does all the work of unposting the menubutton that's
+# currently posted.  It takes no arguments.
+
+proc tk_mbUnpost {} {
+    global tk_priv
+    if {$tk_priv(posted) != ""} {
+       $tk_priv(posted) config -relief $tk_priv(relief)
+       $tk_priv(posted) config -cursor $tk_priv(cursor)
+       $tk_priv(posted) config -activebackground $tk_priv(activeBg)
+       $tk_priv(posted) config -activeforeground $tk_priv(activeFg)
+       $tk_priv(posted) unpost
+# deh multi display bug fix
+#      grab none
+       set menu [lindex [$tk_priv(posted) config -menu] 4]
+       grab -off $menu
+       focus $tk_priv(focus)
+       set tk_priv(focus) ""
+       $menu config -activebackground $tk_priv(activeBg)
+       $menu config -activeforeground $tk_priv(activeFg)
+       set tk_priv(posted) {}
+    }
+}
+
+# The procedure below is invoked to implement keyboard traversal to
+# a menu button.  It takes two arguments:  the name of a window where
+# a keystroke originated, and the ascii character that was typed.
+# This procedure finds a menu bar by looking upward for a top-level
+# window, then looking for a window underneath that named "menu".
+# Then it searches through all the subwindows of "menu" for a menubutton
+# with an underlined character matching char.  If one is found, it
+# posts that menu.
+
+proc tk_traverseToMenu {w char} {
+    global tk_priv
+    if {$char == ""} {
+       return
+    }
+    set char [string tolower $char]
+
+    foreach mb [tk_getMenuButtons $w] {
+       if {[winfo class $mb] == "Menubutton"} {
+           set char2 [string index [lindex [$mb config -text] 4] \
+                   [lindex [$mb config -underline] 4]]
+           if {[string compare $char [string tolower $char2]] == 0} {
+               tk_mbPost $mb
+               [lindex [$mb config -menu] 4] activate 0
+               return
+           }
+       }
+    }
+}
+
+# The procedure below is used to implement keyboard traversal within
+# the posted menu.  It takes two arguments:  the name of the menu to
+# be traversed within, and an ASCII character.  It searches for an
+# entry in the menu that has that character underlined.  If such an
+# entry is found, it is invoked and the menu is unposted.
+
+proc tk_traverseWithinMenu {w char} {
+    if {$char == ""} {
+       return
+    }
+    set char [string tolower $char]
+    set last [$w index last]
+    for {set i 0} {$i <= $last} {incr i} {
+       if [catch {set char2 [string index \
+               [lindex [$w entryconfig $i -label] 4] \
+               [lindex [$w entryconfig $i -underline] 4]]}] {
+           continue
+       }
+       if {[string compare $char [string tolower $char2]] == 0} {
+           tk_mbUnpost
+           $w invoke $i
+           return
+       }
+    }
+}
+
+# The procedure below takes a single argument, which is the name of
+# a window.  It returns a list containing path names for all of the
+# menu buttons associated with that window's top-level window, or an
+# empty list if there are none.
+
+proc tk_getMenuButtons w {
+    global tk_priv
+    set top [winfo toplevel $w]
+    if [catch {set buttons [set tk_priv(menusFor$top)]}] {
+       return ""
+    }
+    return $buttons
+}
+
+# The procedure below is used to traverse to the next or previous
+# menu in a menu bar.  It takes one argument, which is a count of
+# how many menu buttons forward or backward (if negative) to move.
+# If there is no posted menu then this procedure has no effect.
+
+proc tk_nextMenu count {
+    global tk_priv
+    if {$tk_priv(posted) == ""} {
+       return
+    }
+    set buttons [tk_getMenuButtons $tk_priv(posted)]
+    set length [llength $buttons]
+    for {set i 0} 1 {incr i} {
+       if {$i >= $length} {
+           return
+       }
+       if {[lindex $buttons $i] == $tk_priv(posted)} {
+           break
+       }
+    }
+    incr i $count
+    while 1 {
+       while {$i < 0} {
+           incr i $length
+       }
+       while {$i >= $length} {
+           incr i -$length
+       }
+       set mb [lindex $buttons $i]
+       if {[lindex [$mb configure -state] 4] != "disabled"} {
+           break
+       }
+       incr i $count
+    }
+    tk_mbUnpost
+    tk_mbPost $mb
+    [lindex [$mb config -menu] 4] activate 0
+}
+
+# The procedure below is used to traverse to the next or previous entry
+# in the posted menu.  It takes one argument, which is 1 to go to the
+# next entry or -1 to go to the previous entry.  Disabled entries are
+# skipped in this process.
+
+proc tk_nextMenuEntry count {
+    global tk_priv
+    if {$tk_priv(posted) == ""} {
+       return
+    }
+    set menu [lindex [$tk_priv(posted) config -menu] 4]
+    set length [expr [$menu index last]+1]
+    set i [$menu index active]
+    if {$i == "none"} {
+       set i 0
+    } else {
+       incr i $count
+    }
+    while 1 {
+       while {$i < 0} {
+           incr i $length
+       }
+       while {$i >= $length} {
+           incr i -$length
+       }
+       if {[catch {$menu entryconfigure $i -state} state] == 0} {
+           if {[lindex $state 4] != "disabled"} {
+               break
+           }
+       }
+       incr i $count
+    }
+    $menu activate $i
+}
+
+# The procedure below invokes the active entry in the posted menu,
+# if there is one.  Otherwise it does nothing.
+
+proc tk_invokeMenu {menu} {
+    set i [$menu index active]
+    if {$i != "none"} {
+       tk_mbUnpost
+       update idletasks
+       $menu invoke $i
+    }
+}
+
+# The procedure below is invoked to keyboard-traverse to the first
+# menu for a given source window.  The source window is passed as
+# parameter.
+
+proc tk_firstMenu w {
+    set mb [lindex [tk_getMenuButtons $w] 0]
+    if {$mb != ""} {
+       tk_mbPost $mb
+       [lindex [$mb config -menu] 4] activate 0
+    }
+}
+
+# The procedure below is invoked when a button-1-down event is
+# received by a menu button.  If the mouse is in the menu button
+# then it posts the button's menu.  If the mouse isn't in the
+# button's menu, then it deactivates any active entry in the menu.
+# Remember, event-sharing can cause this procedure to be invoked
+# for two different menu buttons on the same event.
+
+proc tk_mbButtonDown w {
+    global tk_priv
+    if {[lindex [$w config -state] 4] == "disabled"} {
+       return
+    } 
+    if {$tk_priv(inMenuButton) == $w} {
+       tk_mbPost $w
+    }
+    set menu [lindex [$tk_priv(posted) config -menu] 4]
+    if {$tk_priv(window) != $menu} {
+       $menu activate none
+    }
+}
diff --git a/src/tk/library/tclindex b/src/tk/library/tclindex
new file mode 100644 (file)
index 0000000..f1ccaec
--- /dev/null
@@ -0,0 +1,28 @@
+# Tcl autoload index file: each line identifies a Tcl
+# procedure and the file where that procedure is
+# defined.  Generated by the "auto_mkindex" command.
+
+tk_entryBackspace entry.tcl
+tk_entryBackword entry.tcl
+tk_entrySeeCaret entry.tcl
+tk_butEnter button.tcl
+tk_butLeave button.tcl
+tk_butDown button.tcl
+tk_butUp button.tcl
+tk_menus menu.tcl
+tk_bindForTraversal menu.tcl
+tk_mbPost menu.tcl
+tk_mbUnpost menu.tcl
+tk_traverseToMenu menu.tcl
+tk_traverseWithinMenu menu.tcl
+tk_getMenuButtons menu.tcl
+tk_nextMenu menu.tcl
+tk_nextMenuEntry menu.tcl
+tk_invokeMenu menu.tcl
+tk_firstMenu menu.tcl
+tk_textSelectTo text.tcl
+tk_textBackspace text.tcl
+tk_textIndexCloser text.tcl
+tk_textResetAnchor text.tcl
+tkerror tkerror.tcl
+tk_listboxSingleSelect listbox.tcl
diff --git a/src/tk/library/text.tcl b/src/tk/library/text.tcl
new file mode 100644 (file)
index 0000000..ce72ad2
--- /dev/null
@@ -0,0 +1,112 @@
+# text.tcl --
+#
+# This file contains Tcl procedures used to manage Tk entries.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/text.tcl,v 1.2 92/07/16 16:26:33 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+# The procedure below is invoked when dragging one end of the selection.
+# The arguments are the text window name and the index of the character
+# that is to be the new end of the selection.
+
+proc tk_textSelectTo {w index} {
+    global tk_priv
+
+    case $tk_priv(selectMode) {
+       char {
+           if [$w compare $index < anchor] {
+               set first $index
+               set last anchor
+           } else {
+               set first anchor
+               set last [$w index $index+1c]
+           }
+       }
+       word {
+           if [$w compare $index < anchor] {
+               set first [$w index "$index wordstart"]
+               set last [$w index "anchor wordend"]
+           } else {
+               set first [$w index "anchor wordstart"]
+               set last [$w index "$index wordend"]
+           }
+       }
+       line {
+           if [$w compare $index < anchor] {
+               set first [$w index "$index linestart"]
+               set last [$w index "anchor lineend + 1c"]
+           } else {
+               set first [$w index "anchor linestart"]
+               set last [$w index "$index lineend + 1c"]
+           }
+       }
+    }
+    $w tag remove sel 0.0 $first
+    $w tag add sel $first $last
+    $w tag remove sel $last end
+}
+
+# The procedure below is invoked to backspace over one character in
+# a text widget.  The name of the widget is passed as argument.
+
+proc tk_textBackspace w {
+    $w delete insert-1c insert
+}
+
+# The procedure below compares three indices, a, b, and c.  Index b must
+# be less than c.  The procedure returns 1 if a is closer to b than to c,
+# and 0 otherwise.  The "w" argument is the name of the text widget in
+# which to do the comparison.
+
+proc tk_textIndexCloser {w a b c} {
+    set a [$w index $a]
+    set b [$w index $b]
+    set c [$w index $c]
+    if [$w compare $a <= $b] {
+       return 1
+    }
+    if [$w compare $a >= $c] {
+       return 0
+    }
+    scan $a "%d.%d" lineA chA
+    scan $b "%d.%d" lineB chB
+    scan $c "%d.%d" lineC chC
+    if {$chC == 0} {
+       incr lineC -1
+       set chC [string length [$w get $lineC.0 $lineC.end]]
+    }
+    if {$lineB != $lineC} {
+       return [expr {($lineA-$lineB) < ($lineC-$lineA)}]
+    }
+    return [expr {($chA-$chB) < ($chC-$chA)}]
+}
+
+# The procedure below is called to reset the selection anchor to
+# whichever end is FARTHEST from the index argument.
+
+proc tk_textResetAnchor {w index} {
+    global tk_priv
+    if {[$w tag ranges sel] == ""} {
+       set tk_priv(selectMode) char
+       $w mark set anchor $index
+       return
+    }
+    if [tk_textIndexCloser $w $index sel.first sel.last] {
+       if {$tk_priv(selectMode) == "char"} {
+           $w mark set anchor sel.last
+       } else {
+           $w mark set anchor sel.last-1c
+       }
+    } else {
+       $w mark set anchor sel.first
+    }
+}
diff --git a/src/tk/library/tk.tcl b/src/tk/library/tk.tcl
new file mode 100644 (file)
index 0000000..871e39a
--- /dev/null
@@ -0,0 +1,290 @@
+# tk.tcl --
+#
+# Initialization script normally executed in the interpreter for each
+# Tk-based application.  Arranges class bindings for widgets.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/tk.tcl,v 1.19 92/08/08 14:50:08 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+
+# Insist on running with a compatible version of Tcl.
+
+if "[info tclversion] != {6.4}" {
+    error "wrong version of Tcl loaded ([info tclversion]): need 6.4"
+}
+
+# Initialize the auto-load path to include Tk's directory as well as
+# Tcl's directory:
+
+set auto_path "$tk_library [info library]"
+
+# Turn off strict Motif look and feel as a default.
+
+set tk_strictMotif 0
+
+# ----------------------------------------------------------------------
+# Class bindings for various flavors of button widgets.  $tk_priv(window)
+# keeps track of the button containing the mouse, and $tk_priv(relief)
+# saves the original relief of the button so it can be restored when
+# the mouse button is released.
+# ----------------------------------------------------------------------
+
+bind Button <Any-Enter> {tk_butEnter %W}
+bind Button <Any-Leave> {tk_butLeave %W}
+bind Button <1> {tk_butDown %W}
+bind Button <ButtonRelease-1> {tk_butUp %W}
+
+bind CheckButton <Any-Enter> {tk_butEnter %W}
+bind CheckButton <Any-Leave> {tk_butLeave %W}
+bind CheckButton <1> {tk_butDown %W}
+bind CheckButton <ButtonRelease-1> {tk_butUp %W}
+
+bind RadioButton <Any-Enter> {tk_butEnter %W}
+bind RadioButton <Any-Leave> {tk_butLeave %W}
+bind RadioButton <1> {tk_butDown %W}
+bind RadioButton <ButtonRelease-1> {tk_butUp %W}
+
+# ----------------------------------------------------------------------
+# Class bindings for entry widgets.
+# ----------------------------------------------------------------------
+
+bind Entry <1> {
+    %W cursor @%x
+    %W select from @%x
+    if {[lindex [%W config -state] 4] == "normal"} {focus %W}
+}
+bind Entry <B1-Motion> {%W select to @%x}
+bind Entry <Shift-1> {%W select adjust @%x}
+bind Entry <Shift-B1-Motion> {%W select to @%x}
+bind Entry <2> {%W scan mark %x}
+bind Entry <B2-Motion> {%W scan dragto %x}
+bind Entry <Any-KeyPress> {
+    if {"%A" != ""} {
+       %W insert cursor %A
+       tk_entrySeeCaret %W
+    }
+}
+bind Entry <Delete> {tk_entryBackspace %W; tk_entrySeeCaret %W}
+bind Entry <BackSpace> {tk_entryBackspace %W; tk_entrySeeCaret %W}
+bind Entry <Control-h> {tk_entryBackspace %W; tk_entrySeeCaret %W}
+bind Entry <Control-d> {%W delete sel.first sel.last; tk_entrySeeCaret %W}
+bind Entry <Control-u> {%W delete 0 end}
+bind Entry <Control-v> {%W insert cursor [selection get]; tk_entrySeeCaret %W}
+bind Entry <Control-w> {tk_entryBackword %W; tk_entrySeeCaret %W}
+tk_bindForTraversal Entry
+
+# ----------------------------------------------------------------------
+# Class bindings for listbox widgets.
+# ----------------------------------------------------------------------
+
+bind Listbox <1> {%W select from [%W nearest %y]}
+bind Listbox <B1-Motion> {%W select to [%W nearest %y]}
+bind Listbox <Shift-1> {%W select adjust [%W nearest %y]}
+bind Listbox <Shift-B1-Motion> {%W select to [%W nearest %y]}
+bind Listbox <2> {%W scan mark %x %y}
+bind Listbox <B2-Motion> {%W scan dragto %x %y}
+
+# ----------------------------------------------------------------------
+# Class bindings for scrollbar widgets.  When strict Motif is requested,
+# the bindings use $tk_priv(buttons) and $tk_priv(activeFg) to set the
+# -activeforeground color to -foreground when the mouse is in the window
+# and restore it when the mouse leaves.
+# ----------------------------------------------------------------------
+
+bind Scrollbar <Any-Enter> {
+    if $tk_strictMotif {
+       set tk_priv(activeFg) [lindex [%W config -activeforeground] 4]
+       %W config -activeforeground [lindex [%W config -foreground] 4]
+    }
+}
+bind Scrollbar <Any-Leave> {
+    if {$tk_strictMotif && ($tk_priv(buttons) == 0)} {
+       %W config -activeforeground $tk_priv(activeFg)
+    }
+}
+bind Scrollbar <Any-ButtonPress> {incr tk_priv(buttons)}
+bind Scrollbar <Any-ButtonRelease> {incr tk_priv(buttons) -1}
+
+# ----------------------------------------------------------------------
+# Class bindings for scale widgets.  When strict Motif is requested,
+# the bindings use $tk_priv(buttons) and $tk_priv(activeFg) to set the
+# -activeforeground color to -foreground when the mouse is in the window
+# and restore it when the mouse leaves.
+# ----------------------------------------------------------------------
+
+bind Scale <Any-Enter> {
+    if $tk_strictMotif {
+       set tk_priv(activeFg) [lindex [%W config -activeforeground] 4]
+       %W config -activeforeground [lindex [%W config -sliderforeground] 4]
+    }
+}
+bind Scale <Any-Leave> {
+    if {$tk_strictMotif && ($tk_priv(buttons) == 0)} {
+       %W config -activeforeground $tk_priv(activeFg)
+    }
+}
+bind Scale <Any-ButtonPress> {incr tk_priv(buttons)}
+bind Scale <Any-ButtonRelease> {incr tk_priv(buttons) -1}
+
+# ----------------------------------------------------------------------
+# Class bindings for menubutton widgets.  Variables used:
+# $tk_priv(posted) -           keeps track of the menubutton whose menu is
+#                              currently posted (or empty string, if none).
+# $tk_priv(inMenuButton)-      if non-null, identifies menu button
+#                              containing mouse pointer.
+# $tk_priv(relief) -           keeps track of original relief of posted
+#                              menu button, so it can be restored later.
+# $tk_priv(dragging) -         if non-null, identifies menu button whose
+#                              menu is currently being dragged in a tear-off
+#                              operation.
+# $tk_priv(focus) -            records old focus window so focus can be
+#                              returned there after keyboard traversal
+#                              to menu.
+# ----------------------------------------------------------------------
+
+bind Menubutton <Enter> {
+    set tk_priv(inMenuButton) %W
+    if {[lindex [%W config -state] 4] != "disabled"} {
+       if {!$tk_strictMotif} {
+           %W config -state active
+       }
+    }
+}
+bind Menubutton <Any-Leave> {
+    set tk_priv(inMenuButton) {}
+    if {[lindex [%W config -state] 4] != "disabled"} {
+       if {!$tk_strictMotif} {
+           %W config -state normal
+       }
+    }
+}
+bind Menubutton <1> {tk_mbButtonDown %W}
+bind Menubutton <Any-ButtonRelease-1> {
+    if {($tk_priv(inMenuButton) != "") && ($tk_priv(posted) != "")} {
+       [lindex [$tk_priv(posted) config -menu] 4] activate 0
+    } else {
+       tk_mbUnpost
+    }
+}
+
+# In the binding below, it's important to ignore grab-related entries
+# and exits because they lag reality and can cause menus to chase
+# their own tail, repeatedly posting and unposting.
+
+bind Menubutton <B1-Enter> {
+    set tk_priv(inMenuButton) %W
+    if {([lindex [%W config -state] 4] != "disabled")
+           && ("%m" != "NotifyGrab") && ("%m" != "NotifyUngrab")} {
+       if {!$tk_strictMotif} {
+           %W config -state active
+       }
+       tk_mbPost %W
+    }
+}
+bind Menubutton <2> {
+    if {($tk_priv(posted) == "")
+           && ([lindex [%W config -state] 4] != "disabled")} {
+       set tk_priv(dragging) %W
+       [lindex [$tk_priv(dragging) config -menu] 4] post %X %Y
+    }
+}
+bind Menubutton <B2-Motion> {
+    if {$tk_priv(dragging) != ""} {
+       [lindex [$tk_priv(dragging) config -menu] 4] post %X %Y
+    }
+}
+bind Menubutton <ButtonRelease-2> {set tk_priv(dragging) ""}
+
+# ----------------------------------------------------------------------
+# Class bindings for menu widgets.  $tk_priv(x) and $tk_priv(y) are used
+# to keep track of the position of the mouse cursor in the menu window
+# during dragging of tear-off menus.  $tk_priv(window) keeps track of
+# the menu containing the mouse, if any.
+# ----------------------------------------------------------------------
+
+bind Menu <Any-Enter> {set tk_priv(window) %W; %W activate @%y}
+bind Menu <Any-Leave> {set tk_priv(window) {}; %W activate none}
+bind Menu <Any-Motion> {
+    if {$tk_priv(window) != ""} {
+       %W activate @%y
+    }
+}
+bind Menu <ButtonRelease-1> {tk_invokeMenu %W}
+bind Menu <2> {set tk_priv(x) %x; set tk_priv(y) %y}
+bind Menu <B2-Motion> {
+    if {$tk_priv(posted) == ""} {
+       %W post [expr %X-$tk_priv(x)] [expr %Y-$tk_priv(y)]
+    }
+}
+bind Menu <B2-Leave> { }
+bind Menu <B2-Enter> { }
+bind Menu <Escape> {tk_mbUnpost}
+bind Menu <Any-KeyPress> {tk_traverseWithinMenu %W %A}
+bind Menu <Left> {tk_nextMenu -1}
+bind Menu <Right> {tk_nextMenu 1}
+bind Menu <Up> {tk_nextMenuEntry -1}
+bind Menu <Down> {tk_nextMenuEntry 1}
+bind Menu <Return> {tk_invokeMenu %W}
+
+# ----------------------------------------------------------------------
+# Class bindings for text widgets. $tk_priv(selectMode) holds one of
+# "char", "word", or "line" to indicate which selection mode is active.
+# ----------------------------------------------------------------------
+
+bind Text <1> {
+    set tk_priv(selectMode) char
+    %W mark set insert @%x,%y
+    %W mark set anchor insert
+    if {[lindex [%W config -state] 4] == "normal"} {focus %W}
+}
+bind Text <Double-1> {
+    set tk_priv(selectMode) word
+    %W mark set insert "@%x,%y wordstart"
+    tk_textSelectTo %W insert
+}
+bind Text <Triple-1> {
+    set tk_priv(selectMode) line
+    %W mark set insert "@%x,%y linestart"
+    tk_textSelectTo %W insert
+}
+bind Text <B1-Motion> {tk_textSelectTo %W @%x,%y}
+bind Text <Shift-1> {
+    tk_textResetAnchor %W @%x,%y
+    tk_textSelectTo %W @%x,%y
+}
+bind Text <Shift-B1-Motion> {tk_textSelectTo %W @%x,%y}
+bind Text <2> {%W scan mark %y}
+bind Text <B2-Motion> {%W scan dragto %y}
+bind Text <Any-KeyPress> {
+    if {"%A" != ""} {
+       %W insert insert %A
+       %W yview -pickplace insert
+    }
+}
+bind Text <Return> {%W insert insert \n; %W yview -pickplace insert}
+bind Text <BackSpace> {tk_textBackspace %W; %W yview -pickplace insert}
+bind Text <Delete> {tk_textBackspace %W; %W yview -pickplace insert}
+bind Text <Control-h> {tk_textBackspace %W; %W yview -pickplace insert}
+bind Text <Control-d> {%W delete sel.first sel.last}
+bind Text <Control-v> {
+    %W insert insert [selection get]
+    %W yview -pickplace insert
+}
+tk_bindForTraversal Text
+
+# Initialize the elements of tk_priv that require initialization.
+
+set tk_priv(buttons) 0
+set tk_priv(dragging) {}
+set tk_priv(focus) {}
+set tk_priv(inMenuButton) {}
+set tk_priv(posted) {}
+set tk_priv(selectMode) char
+set tk_priv(window) {}
diff --git a/src/tk/library/tkerror.tcl b/src/tk/library/tkerror.tcl
new file mode 100644 (file)
index 0000000..34166db
--- /dev/null
@@ -0,0 +1,7 @@
+# This file contains a default version of the tkError procedure.  It
+# just prints out a stack trace.
+
+proc tkerror err {
+    global errorInfo
+    puts stdout "$errorInfo"
+}
diff --git a/src/tk/library/wish.tcl b/src/tk/library/wish.tcl
new file mode 100644 (file)
index 0000000..add4f41
--- /dev/null
@@ -0,0 +1,25 @@
+# wish.tcl --
+#
+# This script is invoked by the "wish" program whenever it starts up.
+# It invokes initialization scripts for Tcl and Tk, then does a few
+# wish-specific things like setting the window geometry, if one was
+# specified.
+#
+# $Header: /user6/ouster/wish/scripts/RCS/wish.tcl,v 1.1 92/03/06 09:40:56 ouster Exp $ SPRITE (Berkeley)
+#
+# Copyright 1992 Regents of the University of California
+# Permission to use, copy, modify, and distribute this
+# software and its documentation for any purpose and without
+# fee is hereby granted, provided that this copyright
+# notice appears in all copies.  The University of California
+# makes no representations about the suitability of this
+# software for any purpose.  It is provided "as is" without
+# express or implied warranty.
+#
+
+source [info library]/init.tcl
+source $tk_library/tk.tcl
+
+if [info exists geometry] {
+    wm geometry . $geometry
+}
diff --git a/src/tk/main.c b/src/tk/main.c
new file mode 100644 (file)
index 0000000..86dccfe
--- /dev/null
@@ -0,0 +1,334 @@
+/* 
+ * main.c --
+ *
+ *     A simple program to test the toolkit facilities.
+ *
+ * Copyright 1990-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/main.c,v 1.68 92/05/07 08:52:02 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tkint.h"
+
+/*
+ * Declarations for library procedures:
+ */
+
+extern int isatty();
+
+/*
+ * Command used to initialize wish:
+ */
+
+char initCmd[] = "source $tk_library/wish.tcl";
+
+Tk_Window w;                   /* NULL means window has been deleted. */
+Tk_TimerToken timeToken = 0;
+int idleHandler = 0;
+Tcl_Interp *interp;
+int x, y;
+Tcl_CmdBuf buffer;
+int tty;
+extern int Tk_SquareCmd _ANSI_ARGS_((ClientData clientData,
+       Tcl_Interp *interp, int argc, char **argv));
+
+/*
+ * Information for testing out command-line options:
+ */
+
+int synchronize = 0;
+char *fileName = NULL;
+char *name = NULL;
+char *display = NULL;
+char *geometry = NULL;
+
+Tk_ArgvInfo argTable[] = {
+    {"-file", TK_ARGV_STRING, (char *) NULL, (char *) &fileName,
+       "File from which to read commands"},
+    {"-geometry", TK_ARGV_STRING, (char *) NULL, (char *) &geometry,
+       "Initial geometry for window"},
+    {"-display", TK_ARGV_STRING, (char *) NULL, (char *) &display,
+       "Display to use"},
+    {"-name", TK_ARGV_STRING, (char *) NULL, (char *) &name,
+       "Name to use for application"},
+    {"-sync", TK_ARGV_CONSTANT, (char *) 1, (char *) &synchronize,
+       "Use synchronous mode for display server"},
+    {(char *) NULL, TK_ARGV_END, (char *) NULL, (char *) NULL,
+       (char *) NULL}
+};
+
+    /* ARGSUSED */
+void
+StdinProc(clientData, mask)
+    ClientData clientData;             /* Not used. */
+    int mask;
+{
+    char line[200];
+    static int gotPartial = 0;
+    char *cmd;
+    int result;
+
+    if (mask & TK_READABLE) {
+       if (fgets(line, 200, stdin) == NULL) {
+           if (!gotPartial) {
+               if (tty) {
+                   Tcl_Eval(interp, "destroy .", 0, (char **) NULL);
+                   exit(0);
+               } else {
+                   Tk_DeleteFileHandler(0);
+               }
+               return;
+           } else {
+               line[0] = 0;
+           }
+       }
+       cmd = Tcl_AssembleCmd(buffer, line);
+       if (cmd == NULL) {
+           gotPartial = 1;
+           return;
+       }
+       gotPartial = 0;
+       result = Tcl_RecordAndEval(interp, cmd, 0);
+       if (*interp->result != 0) {
+           if ((result != TCL_OK) || (tty)) {
+               printf("%s\n", interp->result);
+           }
+       }
+       if (tty) {
+           printf("wish: ");
+           fflush(stdout);
+       }
+    }
+}
+
+       /* ARGSUSED */
+static void
+StructureProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    XEvent *eventPtr;          /* Information about event. */
+{
+    if (eventPtr->type == DestroyNotify) {
+       w = NULL;
+    }
+}
+
+/*
+ * Procedure to map initial window.  This is invoked as a do-when-idle
+ * handler.  Wait for all other when-idle handlers to be processed
+ * before mapping the window, so that the window's correct geometry
+ * has been determined.
+ */
+
+       /* ARGSUSED */
+static void
+DelayedMap(clientData)
+    ClientData clientData;     /* Not used. */
+{
+
+    while (Tk_DoOneEvent(TK_IDLE_EVENTS) != 0) {
+       /* Empty loop body. */
+    }
+    if (w == NULL) {
+       return;
+    }
+    Tk_MapWindow(w);
+}
+
+       /* ARGSUSED */
+int
+DotCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int x, y;
+
+    if (argc != 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " x y\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    x = strtol(argv[1], (char **) NULL, 0);
+    y = strtol(argv[2], (char **) NULL, 0);
+    Tk_MakeWindowExist(w);
+    XDrawPoint(Tk_Display(w), Tk_WindowId(w),
+           DefaultGCOfScreen(Tk_Screen(w)), x, y);
+    return TCL_OK;
+}
+
+       /* ARGSUSED */
+int
+MovetoCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    if (argc != 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " x y\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    x = strtol(argv[1], (char **) NULL, 0);
+    y = strtol(argv[2], (char **) NULL, 0);
+    return TCL_OK;
+}
+       /* ARGSUSED */
+int
+LinetoCmd(dummy, interp, argc, argv)
+    ClientData dummy;                  /* Not used. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    int newX, newY;
+
+    if (argc != 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " x y\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    newX = strtol(argv[1], (char **) NULL, 0);
+    newY = strtol(argv[2], (char **) NULL, 0);
+    Tk_MakeWindowExist(w);
+    XDrawLine(Tk_Display(w), Tk_WindowId(w),
+           DefaultGCOfScreen(Tk_Screen(w)), x, y, newX, newY);
+    x = newX;
+    y = newY;
+    return TCL_OK;
+}
+
+int
+main(argc, argv)
+    int argc;
+    char **argv;
+{
+    char *args, *p, *msg;
+    char buf[20];
+    int result;
+    Tk_3DBorder border;
+
+    { extern char *TCL_Library, *TK_Library;
+      extern int TK_CreateColormap;
+      char *tcllib = getenv("TCL_LIBRARY");
+      char *tklib = getenv("TK_LIBRARY");
+      char *create = getenv("CREATE_COLORMAP");
+      if (tklib != NULL)
+       TK_Library = tklib;
+      if (tcllib != NULL)
+       TCL_Library = tcllib;
+      if (create != NULL)
+       TK_CreateColormap = 1;
+    }
+
+    interp = Tcl_CreateInterp();
+#ifdef TCL_MEM_DEBUG
+    Tcl_InitMemory(interp);
+#endif
+    if (Tk_ParseArgv(interp, (Tk_Window) NULL, &argc, argv, argTable, 0)
+           != TCL_OK) {
+       fprintf(stderr, "%s\n", interp->result);
+       exit(1);
+    }
+    if (name == NULL) {
+       if (fileName != NULL) {
+           p = fileName;
+       } else {
+           p = argv[0];
+       }
+       name = strrchr(p, '/');
+       if (name != NULL) {
+           name++;
+       } else {
+           name = p;
+       }
+    }
+    w = Tk_CreateMainWindow(interp, display, name);
+    if (w == NULL) {
+       fprintf(stderr, "%s\n", interp->result);
+       exit(1);
+    }
+    Tk_SetClass(w, "Tk");
+    Tk_CreateEventHandler(w, StructureNotifyMask, StructureProc,
+           (ClientData) NULL);
+    Tk_DoWhenIdle(DelayedMap, (ClientData) NULL);
+    tty = isatty(0);
+
+    args = Tcl_Merge(argc-1, argv+1);
+    Tcl_SetVar(interp, "argv", args, TCL_GLOBAL_ONLY);
+    ckfree(args);
+    sprintf(buf, "%d", argc-1);
+    Tcl_SetVar(interp, "argc", buf, TCL_GLOBAL_ONLY);
+
+    if (synchronize) {
+       XSynchronize(Tk_Display(w), True);
+    }
+    Tk_GeometryRequest(w, 200, 200);
+    border = Tk_Get3DBorder(interp, w, None, "#4eee94");
+    if (border == NULL) {
+       Tcl_SetResult(interp, (char *) NULL, TCL_STATIC);
+       Tk_SetWindowBackground(w, WhitePixelOfScreen(Tk_Screen(w)));
+    } else {
+       Tk_SetBackgroundFromBorder(w, border);
+    }
+    XSetForeground(Tk_Display(w), DefaultGCOfScreen(Tk_Screen(w)),
+           BlackPixelOfScreen(Tk_Screen(w)));
+    Tcl_CreateCommand(interp, "dot", DotCmd, (ClientData) w,
+           (void (*)()) NULL);
+    Tcl_CreateCommand(interp, "lineto", LinetoCmd, (ClientData) w,
+           (void (*)()) NULL);
+    Tcl_CreateCommand(interp, "moveto", MovetoCmd, (ClientData) w,
+           (void (*)()) NULL);
+#ifdef SQUARE_DEMO
+    Tcl_CreateCommand(interp, "square", Tk_SquareCmd, (ClientData) w,
+           (void (*)()) NULL);
+#endif
+    if (geometry != NULL) {
+       Tcl_SetVar(interp, "geometry", geometry, TCL_GLOBAL_ONLY);
+    }
+    result = Tcl_Eval(interp, initCmd, 0, (char **) NULL);
+    if (result != TCL_OK) {
+       goto error;
+    }
+    if (fileName != NULL) {
+       result = Tcl_VarEval(interp, "source ", fileName, (char *) NULL);
+       if (result != TCL_OK) {
+           goto error;
+       }
+       tty = 0;
+    } else {
+       tty = isatty(0);
+       Tk_CreateFileHandler(0, TK_READABLE, StdinProc, (ClientData) 0);
+       if (tty) {
+           printf("wish: ");
+       }
+    }
+    fflush(stdout);
+    buffer = Tcl_CreateCmdBuf();
+    (void) Tcl_Eval(interp, "update", 0, (char **) NULL);
+
+    Tk_MainLoop();
+    Tcl_DeleteInterp(interp);
+    Tcl_DeleteCmdBuf(buffer);
+    exit(0);
+
+error:
+    msg = Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY);
+    if (msg == NULL) {
+       msg = interp->result;
+    }
+    fprintf(stderr, "%s\n", msg);
+    Tcl_Eval(interp, "destroy .", 0, (char **) NULL);
+    exit(1);
+}
diff --git a/src/tk/makefile b/src/tk/makefile
new file mode 100644 (file)
index 0000000..344c37c
--- /dev/null
@@ -0,0 +1,187 @@
+#
+# This is a simplified Makefile for use in Tk distributions.  Before using
+# it to compile Tk, you may wish to reset some of the following variables:
+#
+# TCL_DIR -            Name of directory holding tcl.h and tcl.a.
+# XLIB -               Name of archive containing Xlib binaries.
+#
+
+# You may also wish to add some of the following switches to the CFLAGS
+# variable:
+#
+# -DX11R3              Causes code that depends on R4 facilities not to
+#                      be compiled.  I haven't tested Tk with R3 in quite
+#                      a while, so this switch may not be enough to
+#                      generate a working R3 version of Tk.  Furthermore,
+#                      use of this switch will disable some of the facilities
+#                      of Tk related to window managers.
+# -DNO_PROTOTYPE       Turns off ANSI-style procedure prototypes and the
+#                      corresponding compile-time checks.  Without this
+#                      defininition, prototypes will be turned on if the
+#                      compiler supports ANSI C by defining __STDC__.
+# -DTK_LIBRARY=\"dir\" Arranges for dir, which must be the name of a
+#                      directory, to be the library directory for Tk scripts.
+#                      This value gets put into the variable $tk_library
+#                      when a new application is created.  The library
+#                      defaults to /usr/local/lib/tk, so you don't need the
+#                      switch unless your library is in a non-standard place.
+#
+
+CC             = gcc
+
+CFLAGS         = -I. -I$(XINCLUDE) -I$(TCL_DIR) -O3 -DTK_VERSION=\"2.3\" -DUSE_XPM3 -DIS_LINUX
+#CFLAGS                = -I. -I$(XINCLUDE) -I$(TCL_DIR) -g -DTK_VERSION=\"2.3\" -DUSE_XPM3 -DIS_LINUX
+
+TCL_DIR                = ../tcl
+XINCLUDE       = /usr/include/X11
+XLIB           = -L/usr/X11R6/lib -lX11 -lXpm
+
+LIBS = libtk.a $(TCL_DIR)/libtcl.a
+LINKS = $(LIBS) 
+
+WIDGOBJS = \
+       tkbutton.o \
+       tkentry.o \
+       tkframe.o \
+       tklist.o \
+       tkmenu.o \
+       tkmnbut.o \
+       tkmsg.o \
+       tkscale.o \
+       tkscrbar.o
+
+CANVOBJS = \
+       tkcanvas.o \
+       tkcvarc.o \
+       tkcvbmap.o \
+       tkcvline.o \
+       tkcvpoly.o \
+       tkcvtext.o \
+       tkcvwind.o \
+       tkrectov.o \
+       tktrig.o
+
+TEXTOBJS = \
+       tktext.o \
+       tktxbtre.o \
+       tktxdisp.o \
+       tktxidx.o \
+       tktxtag.o
+
+OBJS = \
+       tk3d.o \
+       tkargv.o \
+       tkatom.o \
+       tkbind.o \
+       tkbitmap.o \
+        tkcmds.o \
+       tkcolor.o \
+       tkconfig.o \
+       tkcursor.o \
+       tkerror.o \
+        tkevent.o \
+       tkfont.o \
+       tkget.o \
+       tkgc.o \
+       tkgeo.o \
+       tkgrab.o \
+        tkoption.o \
+       tkpack.o \
+       tkpixmap.o \
+       tkplace.o \
+       tkpresrv.o \
+       tkselect.o \
+       tksend.o \
+       tkshare.o \
+       tkwindow.o \
+       tkwm.o \
+       tkrawtcp.o \
+       $(WIDGOBJS) \
+       $(CANVOBJS) \
+       $(TEXTOBJS)
+
+WIDGSRCS = \
+       tkbutton.c \
+       tkentry.c \
+       tkframe.c \
+       tklist.c \
+       tkmenu.c \
+       tkmnbut.c \
+       tkmessage.c \
+       tkscale.c \
+       tkscrbar.c \
+       tktext.c \
+       tktxbtre.c \
+       tktxdisp.c \
+       tktextindex.c
+
+CANVSRCS = \
+       tkcanvas.c \
+       tkcvarc.c \
+       tkcvbmap.c \
+       tkcvline.c \
+       tkcvpoly.c \
+       tkcvtext.c \
+       tkcvwind.c \
+       tkrectov.c \
+       tktrig.c
+
+TEXTSRCS = \
+       tktext.c \
+       tktxbtre.c \
+       tktxdisp.c \
+       tktxidx.c \
+       tktxtag.c
+
+SRCS = \
+       tk3d.c \
+       tkargv.c \
+       tkatom.c \
+       tkbind.c \
+       tkbitmap.c \
+        tkcmds.c \
+       tkcolor.c \
+       tkconfig.c \
+       tkcursor.c \
+       tkerror.c \
+        tkevent.c \
+       tkfont.c \
+       tkget.c \
+       tkgc.c \
+       tkgeo.c \
+       tkgrab.c \
+        tkoption.c \
+       tkpack.c \
+       tkplace.c \
+       tkpresrv.c \
+       tkselect.c \
+        tksend.c \
+       tkshare.c \
+       tkwindow.c \
+       tkwm.c \
+       tkrawtcp.c \
+       $(widgsrcs) \
+       $(CANVSRCS) \
+       $(TEXTSRCS)
+
+all: wish
+
+wish: main.o $(LIBS)
+       $(CC) $(CFLAGS) main.o $(LINKS) $(XLIB) -lm -o wish
+
+libtk.a: $(OBJS)
+       rm -f libtk.a
+       ar cr libtk.a $(OBJS)
+       ranlib libtk.a
+
+$(TCL_DIR)/libtcl.a:
+       cd $(TCL_DIR); make libtcl.a
+
+clean:
+       touch junk~
+       rm -f $(OBJS) main.o libtk.a wish *~
+
+$(OBJS): tk.h tkint.h tkconfig.h
+$(WIDGOBJS): default.h
+$(CANVOBJS): default.h tkcanvas.h
+main.o: tk.h tkint.h
diff --git a/src/tk/makefile.dvx b/src/tk/makefile.dvx
new file mode 100644 (file)
index 0000000..d43eae1
--- /dev/null
@@ -0,0 +1,104 @@
+#
+# This is a simplified Makefile for use in Tk distributions.  Before using
+# it to compile Tk, you may wish to reset some of the following variables:
+#
+# TCL_DIR -            Name of directory holding tcl.h and tcl.a.
+# XLIB -               Name of archive containing Xlib binaries.
+#
+
+# You may also wish to add some of the following switches to the CFLAGS
+# variable:
+#
+# -DX11R3              Causes code that depends on R4 facilities not to
+#                      be compiled.  I haven't tested Tk with R3 in quite
+#                      a while, so this switch may not be enough to
+#                      generate a working R3 version of Tk.  Furthermore,
+#                      use of this switch will disable some of the facilities
+#                      of Tk related to window managers.
+# -DNO_PROTOTYPE       Turns off ANSI-style procedure prototypes and the
+#                      corresponding compile-time checks.  Without this
+#                      defininition, prototypes will be turned on if the
+#                      compiler supports ANSI C by defining __STDC__.
+# -DTK_LIBRARY=\"dir\" Arranges for dir, which must be the name of a
+#                      directory, to be the library directory for Tk scripts.
+#                      This value gets put into the variable $tk_library
+#                      when a new application is created.  The library
+#                      defaults to /usr/local/lib/tk, so you don't need the
+#                      switch unless your library is in a non-standard place.
+#
+
+TCL_DIR                = ..\tcl
+XPM_DIR                = ..\xpm
+XLIB           = -lX
+
+CC             = gcc
+#CFLAGS                = -g -I. -I$(TCL_DIR) -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+CFLAGS         = -O2 -I. -I$(TCL_DIR) -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+
+LIBS = libtk.a $(TCL_DIR)/libtcl.a $(XPM_DIR)/libXpm.a
+
+WIDGOBJS = tkbutton.o tkentry.o tkframe.o tklist.o \
+       tkmenu.o tkmnbut.o tkmsg.o tkscale.o \
+       tkscrbar.o
+
+CANVOBJS = tkcanvas.o tkcvarc.o tkcvbmap.o tkcvline.o \
+       tkcvpoly.o tkcvtext.o tkcvwind.o tkrectov.o \
+       tktrig.o
+
+TEXTOBJS = tktext.o tktxbtre.o tktxdisp.o tktxidx.o tktxtag.o
+
+OBJS = tk3d.o tkargv.o tkatom.o tkbind.o tkbitmap.o \
+        tkcmds.o tkcolor.o tkconfig.o tkcursor.o tkerror.o \
+        tkevent.o tkfont.o tkget.o tkgc.o tkgeo.o tkgrab.o \
+        tkoption.o tkpack.o tkpixmap.o tkplace.o tkpresrv.o \
+       tkselect.o tksend.o tkshare.o tkwindow.o tkwm.o tkrawtcp.o \
+       $(WIDGOBJS) $(CANVOBJS) $(TEXTOBJS)
+
+WIDGSRCS = tkbutton.c tkentry.c tkframe.c tklist.c \
+       tkmenu.c tkmnbut.c tkmessage.c tkscale.c \
+       tkscrbar.c tktext.c tktxbtre.c tktxdisp.c \
+       tktextindex.c
+
+CANVSRCS = tkcanvas.c tkcvarc.c tkcvbmap.c tkcvline.c \
+       tkcvpoly.c tkcvtext.c tkcvwind.c tkrectov.c \
+       tktrig.c
+
+TEXTSRCS = tktext.c tktxbtre.c tktxdisp.c tktxidx.c tktxtag.c
+
+SRCS = tk3d.c tkargv.c tkatom.c tkbind.c tkbitmap.c \
+        tkcmds.c tkcolor.c tkconfig.c tkcursor.c tkerror.c \
+        tkevent.c tkfont.c tkget.c tkgc.c tkgeo.c tkgrab.c \
+        tkoption.c tkpack.c tkplace.c tkpresrv.c tkselect.c \
+        tksend.c tkshare.c tkwindow.c tkwm.c tkrawtcp.c $(WIDGSRCS) \
+       $(CANVSRCS) $(TEXTSRCS)
+
+.c.o:
+       $(CC) $< -c $(CFLAGS)
+
+all: wish
+
+wish: main.o $(LIBS)
+       $(CC) $(CFLAGS) main.o <@<
+$(LIBS) $(XLIB) -lsys -lm -o wish
+<
+       aout2exe wish
+
+libtk.a: $(OBJS)
+       rm -f libtk.a
+       ar cr libtk.a <@<
+$(OBJS)
+<
+       ranlib libtk.a
+
+$(TCL_DIR)/libtcl.a:
+       cd $(TCL_DIR)
+       pmake libtcl.a
+
+clean:
+       rm -f $(OBJS) main.o libtk.a wish *.bak
+
+$(OBJS): tk.h tkint.h tkconfig.h
+$(WIDGOBJS): default.h
+$(CANVOBJS): default.h tkcanvas.h
+main.o: tk.h tkint.h
+\1a
\ No newline at end of file
diff --git a/src/tk/makefile.hpux b/src/tk/makefile.hpux
new file mode 100644 (file)
index 0000000..f483045
--- /dev/null
@@ -0,0 +1,104 @@
+#
+# This is a simplified Makefile for use in Tk distributions.  Before using
+# it to compile Tk, you may wish to reset some of the following variables:
+#
+# TCL_DIR -            Name of directory holding tcl.h and tcl.a.
+# XLIB -               Name of archive containing Xlib binaries.
+#
+
+# You may also wish to add some of the following switches to the CFLAGS
+# variable:
+#
+# -DX11R3              Causes code that depends on R4 facilities not to
+#                      be compiled.  I haven't tested Tk with R3 in quite
+#                      a while, so this switch may not be enough to
+#                      generate a working R3 version of Tk.  Furthermore,
+#                      use of this switch will disable some of the facilities
+#                      of Tk related to window managers.
+# -DNO_PROTOTYPE       Turns off ANSI-style procedure prototypes and the
+#                      corresponding compile-time checks.  Without this
+#                      defininition, prototypes will be turned on if the
+#                      compiler supports ANSI C by defining __STDC__.
+# -DTK_LIBRARY=\"dir\" Arranges for dir, which must be the name of a
+#                      directory, to be the library directory for Tk scripts.
+#                      This value gets put into the variable $tk_library
+#                      when a new application is created.  The library
+#                      defaults to /usr/local/lib/tk, so you don't need the
+#                      switch unless your library is in a non-standard place.
+#
+
+CC             = cc -Aa \
+                    -D_INCLUDE_AES_SOURCE \
+                    -D_INCLUDE_POSIX_SOURCE \
+                    -D_INCLUDE_XOPEN_SOURCE \
+                    -D_INCLUDE_HPUX_SOURCE
+CFLAGS         = -I. -I$(TCL_DIR) -O -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+
+#CC            = gcc
+#CFLAGS                = -I. -I$(TCL_DIR) -g -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+
+TCL_DIR                = ../tcl
+XPM_DIR                = ../xpm
+XLIB           = -L/usr/lib/X11R5 -lX11
+
+#LIBS = libtk.a $(TCL_DIR)/libtcl.a $(XPM_DIR)/libxpm.a
+LIBS = libtk.a $(TCL_DIR)/libtcl.a $(XPM_DIR)/libxpm.a
+#LINKS = $(LIBS) -lsocket -lnsl
+LINKS = $(LIBS)
+
+WIDGOBJS = tkbutton.o tkentry.o tkframe.o tklist.o \
+       tkmenu.o tkmnbut.o tkmsg.o tkscale.o \
+       tkscrbar.o
+
+CANVOBJS = tkcanvas.o tkcvarc.o tkcvbmap.o tkcvline.o \
+       tkcvpoly.o tkcvtext.o tkcvwind.o tkrectov.o \
+       tktrig.o
+
+TEXTOBJS = tktext.o tktxbtre.o tktxdisp.o tktxidx.o tktxtag.o
+
+OBJS = tk3d.o tkargv.o tkatom.o tkbind.o tkbitmap.o \
+        tkcmds.o tkcolor.o tkconfig.o tkcursor.o tkerror.o \
+        tkevent.o tkfont.o tkget.o tkgc.o tkgeo.o tkgrab.o \
+        tkoption.o tkpack.o tkpixmap.o tkplace.o tkpresrv.o \
+       tkselect.o tksend.o tkshare.o tkwindow.o tkwm.o tkrawtcp.o \
+       $(WIDGOBJS) $(CANVOBJS) $(TEXTOBJS)
+
+WIDGSRCS = tkbutton.c tkentry.c tkframe.c tklist.c \
+       tkmenu.c tkmnbut.c tkmessage.c tkscale.c \
+       tkscrbar.c tktext.c tktxbtre.c tktxdisp.c \
+       tktextindex.c
+
+CANVSRCS = tkcanvas.c tkcvarc.c tkcvbmap.c tkcvline.c \
+       tkcvpoly.c tkcvtext.c tkcvwind.c tkrectov.c \
+       tktrig.c
+
+TEXTSRCS = tktext.c tktxbtre.c tktxdisp.c tktxidx.c tktxtag.c
+
+SRCS = tk3d.c tkargv.c tkatom.c tkbind.c tkbitmap.c \
+        tkcmds.c tkcolor.c tkconfig.c tkcursor.c tkerror.c \
+        tkevent.c tkfont.c tkget.c tkgc.c tkgeo.c tkgrab.c \
+        tkoption.c tkpack.c tkplace.c tkpresrv.c tkselect.c \
+        tksend.c tkshare.c tkwindow.c tkwm.c tkrawtcp.c $(widgsrcs) \
+       $(CANVSRCS) $(TEXTSRCS)
+
+all: wish
+
+wish: main.o $(LIBS)
+       $(CC) $(CFLAGS) main.o $(LINKS) $(XLIB) -lm -o wish
+
+libtk.a: $(OBJS)
+       rm -f libtk.a
+       ar cr libtk.a $(OBJS)
+#      ranlib libtk.a
+
+$(TCL_DIR)/libtcl.a:
+       cd $(TCL_DIR); make libtcl.a
+
+clean:
+       touch junk~
+       rm -f $(OBJS) main.o libtk.a wish *~
+
+$(OBJS): tk.h tkint.h tkconfig.h
+$(WIDGOBJS): default.h
+$(CANVOBJS): default.h tkcanvas.h
+main.o: tk.h tkint.h
diff --git a/src/tk/makefile.linux b/src/tk/makefile.linux
new file mode 100644 (file)
index 0000000..cc91a83
--- /dev/null
@@ -0,0 +1,101 @@
+#
+# This is a simplified Makefile for use in Tk distributions.  Before using
+# it to compile Tk, you may wish to reset some of the following variables:
+#
+# TCL_DIR -            Name of directory holding tcl.h and tcl.a.
+# XLIB -               Name of archive containing Xlib binaries.
+#
+
+# You may also wish to add some of the following switches to the CFLAGS
+# variable:
+#
+# -DX11R3              Causes code that depends on R4 facilities not to
+#                      be compiled.  I haven't tested Tk with R3 in quite
+#                      a while, so this switch may not be enough to
+#                      generate a working R3 version of Tk.  Furthermore,
+#                      use of this switch will disable some of the facilities
+#                      of Tk related to window managers.
+# -DNO_PROTOTYPE       Turns off ANSI-style procedure prototypes and the
+#                      corresponding compile-time checks.  Without this
+#                      defininition, prototypes will be turned on if the
+#                      compiler supports ANSI C by defining __STDC__.
+# -DTK_LIBRARY=\"dir\" Arranges for dir, which must be the name of a
+#                      directory, to be the library directory for Tk scripts.
+#                      This value gets put into the variable $tk_library
+#                      when a new application is created.  The library
+#                      defaults to /usr/local/lib/tk, so you don't need the
+#                      switch unless your library is in a non-standard place.
+#
+
+CC             = gcc
+#CFLAGS                = -I/usr/openwin/include -I. -I$(TCL_DIR) -O2 -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+CFLAGS         = -I/usr/openwin/include -I. -I$(TCL_DIR) -O -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+
+#CC            = gcc
+#CFLAGS                = -I. -I$(TCL_DIR) -g -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+
+TCL_DIR                = ../tcl
+XPM_DIR                = ../xpm
+XLIB           = -lX11
+
+#LIBS = libtk.a $(TCL_DIR)/libtcl.a $(XPM_DIR)/libxpm.a
+LIBS = libtk.a $(TCL_DIR)/libtcl.a $(XPM_DIR)/libxpm.a
+#LINKS = $(LIBS) -lsocket -lnsl
+LINKS = $(LIBS) 
+
+WIDGOBJS = tkbutton.o tkentry.o tkframe.o tklist.o \
+       tkmenu.o tkmnbut.o tkmsg.o tkscale.o \
+       tkscrbar.o
+
+CANVOBJS = tkcanvas.o tkcvarc.o tkcvbmap.o tkcvline.o \
+       tkcvpoly.o tkcvtext.o tkcvwind.o tkrectov.o \
+       tktrig.o
+
+TEXTOBJS = tktext.o tktxbtre.o tktxdisp.o tktxidx.o tktxtag.o
+
+OBJS = tk3d.o tkargv.o tkatom.o tkbind.o tkbitmap.o \
+        tkcmds.o tkcolor.o tkconfig.o tkcursor.o tkerror.o \
+        tkevent.o tkfont.o tkget.o tkgc.o tkgeo.o tkgrab.o \
+        tkoption.o tkpack.o tkpixmap.o tkplace.o tkpresrv.o \
+       tkselect.o tksend.o tkshare.o tkwindow.o tkwm.o tkrawtcp.o \
+       $(WIDGOBJS) $(CANVOBJS) $(TEXTOBJS)
+
+WIDGSRCS = tkbutton.c tkentry.c tkframe.c tklist.c \
+       tkmenu.c tkmnbut.c tkmessage.c tkscale.c \
+       tkscrbar.c tktext.c tktxbtre.c tktxdisp.c \
+       tktextindex.c
+
+CANVSRCS = tkcanvas.c tkcvarc.c tkcvbmap.c tkcvline.c \
+       tkcvpoly.c tkcvtext.c tkcvwind.c tkrectov.c \
+       tktrig.c
+
+TEXTSRCS = tktext.c tktxbtre.c tktxdisp.c tktxidx.c tktxtag.c
+
+SRCS = tk3d.c tkargv.c tkatom.c tkbind.c tkbitmap.c \
+        tkcmds.c tkcolor.c tkconfig.c tkcursor.c tkerror.c \
+        tkevent.c tkfont.c tkget.c tkgc.c tkgeo.c tkgrab.c \
+        tkoption.c tkpack.c tkplace.c tkpresrv.c tkselect.c \
+        tksend.c tkshare.c tkwindow.c tkwm.c tkrawtcp.c $(widgsrcs) \
+       $(CANVSRCS) $(TEXTSRCS)
+
+all: wish
+
+wish: main.o $(LIBS)
+       $(CC) $(CFLAGS) main.o $(LINKS) $(XLIB) -lm -o wish
+
+libtk.a: $(OBJS)
+       rm -f libtk.a
+       ar cr libtk.a $(OBJS)
+       ranlib libtk.a
+
+$(TCL_DIR)/libtcl.a:
+       cd $(TCL_DIR); make libtcl.a
+
+clean:
+       touch junk~
+       rm -f $(OBJS) main.o libtk.a wish *~
+
+$(OBJS): tk.h tkint.h tkconfig.h
+$(WIDGOBJS): default.h
+$(CANVOBJS): default.h tkcanvas.h
+main.o: tk.h tkint.h
diff --git a/src/tk/makefile.osf b/src/tk/makefile.osf
new file mode 100644 (file)
index 0000000..d42ccea
--- /dev/null
@@ -0,0 +1,100 @@
+#
+# This is a simplified Makefile for use in Tk distributions.  Before using
+# it to compile Tk, you may wish to reset some of the following variables:
+#
+# TCL_DIR -            Name of directory holding tcl.h and tcl.a.
+# XLIB -               Name of archive containing Xlib binaries.
+#
+
+# You may also wish to add some of the following switches to the CFLAGS
+# variable:
+#
+# -DX11R3              Causes code that depends on R4 facilities not to
+#                      be compiled.  I haven't tested Tk with R3 in quite
+#                      a while, so this switch may not be enough to
+#                      generate a working R3 version of Tk.  Furthermore,
+#                      use of this switch will disable some of the facilities
+#                      of Tk related to window managers.
+# -DNO_PROTOTYPE       Turns off ANSI-style procedure prototypes and the
+#                      corresponding compile-time checks.  Without this
+#                      defininition, prototypes will be turned on if the
+#                      compiler supports ANSI C by defining __STDC__.
+# -DTK_LIBRARY=\"dir\" Arranges for dir, which must be the name of a
+#                      directory, to be the library directory for Tk scripts.
+#                      This value gets put into the variable $tk_library
+#                      when a new application is created.  The library
+#                      defaults to /usr/local/lib/tk, so you don't need the
+#                      switch unless your library is in a non-standard place.
+#
+
+CC             = cc
+CFLAGS         = -I. -I$(TCL_DIR) -O2 -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+
+#CC            = gcc
+#CFLAGS                = -I. -I$(TCL_DIR) -g -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+
+TCL_DIR                = ../tcl
+XPM_DIR                = ../xpm
+XLIB           = -lX11
+
+#LIBS = libtk.a $(TCL_DIR)/libtcl.a $(XPM_DIR)/libxpm.a
+LIBS = libtk.a $(TCL_DIR)/libtcl.a $(XPM_DIR)/libxpm.a
+#LINKS = $(LIBS) -lsocket -lnsl
+LINKS = $(LIBS)
+
+WIDGOBJS = tkbutton.o tkentry.o tkframe.o tklist.o \
+       tkmenu.o tkmnbut.o tkmsg.o tkscale.o \
+       tkscrbar.o
+
+CANVOBJS = tkcanvas.o tkcvarc.o tkcvbmap.o tkcvline.o \
+       tkcvpoly.o tkcvtext.o tkcvwind.o tkrectov.o \
+       tktrig.o
+
+TEXTOBJS = tktext.o tktxbtre.o tktxdisp.o tktxidx.o tktxtag.o
+
+OBJS = tk3d.o tkargv.o tkatom.o tkbind.o tkbitmap.o \
+        tkcmds.o tkcolor.o tkconfig.o tkcursor.o tkerror.o \
+        tkevent.o tkfont.o tkget.o tkgc.o tkgeo.o tkgrab.o \
+        tkoption.o tkpack.o tkpixmap.o tkplace.o tkpresrv.o \
+       tkselect.o tksend.o tkshare.o tkwindow.o tkwm.o tkrawtcp.o \
+       $(WIDGOBJS) $(CANVOBJS) $(TEXTOBJS)
+
+WIDGSRCS = tkbutton.c tkentry.c tkframe.c tklist.c \
+       tkmenu.c tkmnbut.c tkmessage.c tkscale.c \
+       tkscrbar.c tktext.c tktxbtre.c tktxdisp.c \
+       tktextindex.c
+
+CANVSRCS = tkcanvas.c tkcvarc.c tkcvbmap.c tkcvline.c \
+       tkcvpoly.c tkcvtext.c tkcvwind.c tkrectov.c \
+       tktrig.c
+
+TEXTSRCS = tktext.c tktxbtre.c tktxdisp.c tktxidx.c tktxtag.c
+
+SRCS = tk3d.c tkargv.c tkatom.c tkbind.c tkbitmap.c \
+        tkcmds.c tkcolor.c tkconfig.c tkcursor.c tkerror.c \
+        tkevent.c tkfont.c tkget.c tkgc.c tkgeo.c tkgrab.c \
+        tkoption.c tkpack.c tkplace.c tkpresrv.c tkselect.c \
+        tksend.c tkshare.c tkwindow.c tkwm.c tkrawtcp.c $(widgsrcs) \
+       $(CANVSRCS) $(TEXTSRCS)
+
+all: wish
+
+wish: main.o $(LIBS)
+       $(CC) $(CFLAGS) main.o $(LINKS) $(XLIB) -lm -o wish
+
+libtk.a: $(OBJS)
+       rm -f libtk.a
+       ar cr libtk.a $(OBJS)
+#      ranlib libtk.a
+
+$(TCL_DIR)/libtcl.a:
+       cd $(TCL_DIR); make libtcl.a
+
+clean:
+       touch junk~
+       rm -f $(OBJS) main.o libtk.a wish *~
+
+$(OBJS): tk.h tkint.h tkconfig.h
+$(WIDGOBJS): default.h
+$(CANVOBJS): default.h tkcanvas.h
+main.o: tk.h tkint.h
diff --git a/src/tk/makefile.sgi b/src/tk/makefile.sgi
new file mode 100644 (file)
index 0000000..8f5f618
--- /dev/null
@@ -0,0 +1,94 @@
+#
+# This is a simplified Makefile for use in Tk distributions.  Before using
+# it to compile Tk, you may wish to reset some of the following variables:
+#
+# TCL_DIR -            Name of directory holding tcl.h and tcl.a.
+# XLIB -               Name of archive containing Xlib binaries.
+#
+
+# You may also wish to add some of the following switches to the CFLAGS
+# variable:
+#
+# -DX11R3              Causes code that depends on R4 facilities not to
+#                      be compiled.  I haven't tested Tk with R3 in quite
+#                      a while, so this switch may not be enough to
+#                      generate a working R3 version of Tk.  Furthermore,
+#                      use of this switch will disable some of the facilities
+#                      of Tk related to window managers.
+# -DNO_PROTOTYPE       Turns off ANSI-style procedure prototypes and the
+#                      corresponding compile-time checks.  Without this
+#                      defininition, prototypes will be turned on if the
+#                      compiler supports ANSI C by defining __STDC__.
+# -DTK_LIBRARY=\"dir\" Arranges for dir, which must be the name of a
+#                      directory, to be the library directory for Tk scripts.
+#                      This value gets put into the variable $tk_library
+#                      when a new application is created.  The library
+#                      defaults to /usr/local/lib/tk, so you don't need the
+#                      switch unless your library is in a non-standard place.
+#
+
+TCL_DIR                = ../tcl
+XPM_DIR                = ../xpm
+XLIB           = -lX11
+CC             = cc
+CFLAGS         = -I. -I$(TCL_DIR) -O2 -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+#CFLAGS                = -I. -I$(TCL_DIR) -g -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+
+LIBS = libtk.a $(TCL_DIR)/libtcl.a $(XPM_DIR)/libxpm.a
+
+WIDGOBJS = tkbutton.o tkentry.o tkframe.o tklist.o \
+       tkmenu.o tkmnbut.o tkmsg.o tkscale.o \
+       tkscrbar.o
+
+CANVOBJS = tkcanvas.o tkcvarc.o tkcvbmap.o tkcvline.o \
+       tkcvpoly.o tkcvtext.o tkcvwind.o tkrectov.o \
+       tktrig.o
+
+TEXTOBJS = tktext.o tktxbtre.o tktxdisp.o tktxidx.o tktxtag.o
+
+OBJS = tk3d.o tkargv.o tkatom.o tkbind.o tkbitmap.o \
+        tkcmds.o tkcolor.o tkconfig.o tkcursor.o tkerror.o \
+        tkevent.o tkfont.o tkget.o tkgc.o tkgeo.o tkgrab.o \
+        tkoption.o tkpack.o tkpixmap.o tkplace.o tkpresrv.o \
+       tkselect.o tksend.o tkshare.o tkwindow.o tkwm.o tkrawtcp.o \
+       $(WIDGOBJS) $(CANVOBJS) $(TEXTOBJS)
+
+WIDGSRCS = tkbutton.c tkentry.c tkframe.c tklist.c \
+       tkmenu.c tkmnbut.c tkmessage.c tkscale.c \
+       tkscrbar.c tktext.c tktxbtre.c tktxdisp.c \
+       tktextindex.c
+
+CANVSRCS = tkcanvas.c tkcvarc.c tkcvbmap.c tkcvline.c \
+       tkcvpoly.c tkcvtext.c tkcvwind.c tkrectov.c \
+       tktrig.c
+
+TEXTSRCS = tktext.c tktxbtre.c tktxdisp.c tktxidx.c tktxtag.c
+
+SRCS = tk3d.c tkargv.c tkatom.c tkbind.c tkbitmap.c \
+        tkcmds.c tkcolor.c tkconfig.c tkcursor.c tkerror.c \
+        tkevent.c tkfont.c tkget.c tkgc.c tkgeo.c tkgrab.c \
+        tkoption.c tkpack.c tkplace.c tkpresrv.c tkselect.c \
+        tksend.c tkshare.c tkwindow.c tkwm.c tkrawtcp.c $(widgsrcs) \
+       $(CANVSRCS) $(TEXTSRCS)
+
+all: wish
+
+wish: main.o $(LIBS)
+       $(CC) $(CFLAGS) main.o $(LIBS) $(XLIB) -lm -o wish
+
+libtk.a: $(OBJS)
+       rm -f libtk.a
+       ar cr libtk.a $(OBJS)
+#      ranlib libtk.a
+
+$(TCL_DIR)/libtcl.a:
+       cd $(TCL_DIR); make libtcl.a
+
+clean:
+       touch junk~
+       rm -f $(OBJS) main.o libtk.a wish *~
+
+$(OBJS): tk.h tkint.h tkconfig.h
+$(WIDGOBJS): default.h
+$(CANVOBJS): default.h tkcanvas.h
+main.o: tk.h tkint.h
diff --git a/src/tk/makefile.sol b/src/tk/makefile.sol
new file mode 100644 (file)
index 0000000..7bb9dba
--- /dev/null
@@ -0,0 +1,99 @@
+#
+# This is a simplified Makefile for use in Tk distributions.  Before using
+# it to compile Tk, you may wish to reset some of the following variables:
+#
+# TCL_DIR -            Name of directory holding tcl.h and tcl.a.
+# XLIB -               Name of archive containing Xlib binaries.
+#
+
+# You may also wish to add some of the following switches to the CFLAGS
+# variable:
+#
+# -DX11R3              Causes code that depends on R4 facilities not to
+#                      be compiled.  I haven't tested Tk with R3 in quite
+#                      a while, so this switch may not be enough to
+#                      generate a working R3 version of Tk.  Furthermore,
+#                      use of this switch will disable some of the facilities
+#                      of Tk related to window managers.
+# -DNO_PROTOTYPE       Turns off ANSI-style procedure prototypes and the
+#                      corresponding compile-time checks.  Without this
+#                      defininition, prototypes will be turned on if the
+#                      compiler supports ANSI C by defining __STDC__.
+# -DTK_LIBRARY=\"dir\" Arranges for dir, which must be the name of a
+#                      directory, to be the library directory for Tk scripts.
+#                      This value gets put into the variable $tk_library
+#                      when a new application is created.  The library
+#                      defaults to /usr/local/lib/tk, so you don't need the
+#                      switch unless your library is in a non-standard place.
+#
+
+CC             = gcc
+CFLAGS         = -I/usr/openwin/include -I. -I$(TCL_DIR) -O2 -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+
+#CC            = gcc
+#CFLAGS                = -I. -I$(TCL_DIR) -g -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+
+TCL_DIR                = ../tcl
+XPM_DIR                = ../xpm
+XLIB           = -lX11
+
+#LIBS = libtk.a $(TCL_DIR)/libtcl.a $(XPM_DIR)/libxpm.a
+LIBS = libtk.a $(TCL_DIR)/libtcl.a $(XPM_DIR)/libxpm.a
+LINKS = $(LIBS) -lsocket -lnsl
+
+WIDGOBJS = tkbutton.o tkentry.o tkframe.o tklist.o \
+       tkmenu.o tkmnbut.o tkmsg.o tkscale.o \
+       tkscrbar.o
+
+CANVOBJS = tkcanvas.o tkcvarc.o tkcvbmap.o tkcvline.o \
+       tkcvpoly.o tkcvtext.o tkcvwind.o tkrectov.o \
+       tktrig.o
+
+TEXTOBJS = tktext.o tktxbtre.o tktxdisp.o tktxidx.o tktxtag.o
+
+OBJS = tk3d.o tkargv.o tkatom.o tkbind.o tkbitmap.o \
+        tkcmds.o tkcolor.o tkconfig.o tkcursor.o tkerror.o \
+        tkevent.o tkfont.o tkget.o tkgc.o tkgeo.o tkgrab.o \
+        tkoption.o tkpack.o tkpixmap.o tkplace.o tkpresrv.o \
+       tkselect.o tksend.o tkshare.o tkwindow.o tkwm.o tkrawtcp.o \
+       $(WIDGOBJS) $(CANVOBJS) $(TEXTOBJS)
+
+WIDGSRCS = tkbutton.c tkentry.c tkframe.c tklist.c \
+       tkmenu.c tkmnbut.c tkmessage.c tkscale.c \
+       tkscrbar.c tktext.c tktxbtre.c tktxdisp.c \
+       tktextindex.c
+
+CANVSRCS = tkcanvas.c tkcvarc.c tkcvbmap.c tkcvline.c \
+       tkcvpoly.c tkcvtext.c tkcvwind.c tkrectov.c \
+       tktrig.c
+
+TEXTSRCS = tktext.c tktxbtre.c tktxdisp.c tktxidx.c tktxtag.c
+
+SRCS = tk3d.c tkargv.c tkatom.c tkbind.c tkbitmap.c \
+        tkcmds.c tkcolor.c tkconfig.c tkcursor.c tkerror.c \
+        tkevent.c tkfont.c tkget.c tkgc.c tkgeo.c tkgrab.c \
+        tkoption.c tkpack.c tkplace.c tkpresrv.c tkselect.c \
+        tksend.c tkshare.c tkwindow.c tkwm.c tkrawtcp.c $(widgsrcs) \
+       $(CANVSRCS) $(TEXTSRCS)
+
+all: wish
+
+wish: main.o $(LIBS)
+       $(CC) $(CFLAGS) main.o $(LINKS) $(XLIB) -lm -o wish
+
+libtk.a: $(OBJS)
+       rm -f libtk.a
+       ar cr libtk.a $(OBJS)
+#      ranlib libtk.a
+
+$(TCL_DIR)/libtcl.a:
+       cd $(TCL_DIR); make libtcl.a
+
+clean:
+       touch junk~
+       rm -f $(OBJS) main.o libtk.a wish *~
+
+$(OBJS): tk.h tkint.h tkconfig.h
+$(WIDGOBJS): default.h
+$(CANVOBJS): default.h tkcanvas.h
+main.o: tk.h tkint.h
diff --git a/src/tk/makefile.sun b/src/tk/makefile.sun
new file mode 100644 (file)
index 0000000..cc91a83
--- /dev/null
@@ -0,0 +1,101 @@
+#
+# This is a simplified Makefile for use in Tk distributions.  Before using
+# it to compile Tk, you may wish to reset some of the following variables:
+#
+# TCL_DIR -            Name of directory holding tcl.h and tcl.a.
+# XLIB -               Name of archive containing Xlib binaries.
+#
+
+# You may also wish to add some of the following switches to the CFLAGS
+# variable:
+#
+# -DX11R3              Causes code that depends on R4 facilities not to
+#                      be compiled.  I haven't tested Tk with R3 in quite
+#                      a while, so this switch may not be enough to
+#                      generate a working R3 version of Tk.  Furthermore,
+#                      use of this switch will disable some of the facilities
+#                      of Tk related to window managers.
+# -DNO_PROTOTYPE       Turns off ANSI-style procedure prototypes and the
+#                      corresponding compile-time checks.  Without this
+#                      defininition, prototypes will be turned on if the
+#                      compiler supports ANSI C by defining __STDC__.
+# -DTK_LIBRARY=\"dir\" Arranges for dir, which must be the name of a
+#                      directory, to be the library directory for Tk scripts.
+#                      This value gets put into the variable $tk_library
+#                      when a new application is created.  The library
+#                      defaults to /usr/local/lib/tk, so you don't need the
+#                      switch unless your library is in a non-standard place.
+#
+
+CC             = gcc
+#CFLAGS                = -I/usr/openwin/include -I. -I$(TCL_DIR) -O2 -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+CFLAGS         = -I/usr/openwin/include -I. -I$(TCL_DIR) -O -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+
+#CC            = gcc
+#CFLAGS                = -I. -I$(TCL_DIR) -g -DTK_VERSION=\"2.3\" -DUSE_XPM3 -I$(XPM_DIR)
+
+TCL_DIR                = ../tcl
+XPM_DIR                = ../xpm
+XLIB           = -lX11
+
+#LIBS = libtk.a $(TCL_DIR)/libtcl.a $(XPM_DIR)/libxpm.a
+LIBS = libtk.a $(TCL_DIR)/libtcl.a $(XPM_DIR)/libxpm.a
+#LINKS = $(LIBS) -lsocket -lnsl
+LINKS = $(LIBS) 
+
+WIDGOBJS = tkbutton.o tkentry.o tkframe.o tklist.o \
+       tkmenu.o tkmnbut.o tkmsg.o tkscale.o \
+       tkscrbar.o
+
+CANVOBJS = tkcanvas.o tkcvarc.o tkcvbmap.o tkcvline.o \
+       tkcvpoly.o tkcvtext.o tkcvwind.o tkrectov.o \
+       tktrig.o
+
+TEXTOBJS = tktext.o tktxbtre.o tktxdisp.o tktxidx.o tktxtag.o
+
+OBJS = tk3d.o tkargv.o tkatom.o tkbind.o tkbitmap.o \
+        tkcmds.o tkcolor.o tkconfig.o tkcursor.o tkerror.o \
+        tkevent.o tkfont.o tkget.o tkgc.o tkgeo.o tkgrab.o \
+        tkoption.o tkpack.o tkpixmap.o tkplace.o tkpresrv.o \
+       tkselect.o tksend.o tkshare.o tkwindow.o tkwm.o tkrawtcp.o \
+       $(WIDGOBJS) $(CANVOBJS) $(TEXTOBJS)
+
+WIDGSRCS = tkbutton.c tkentry.c tkframe.c tklist.c \
+       tkmenu.c tkmnbut.c tkmessage.c tkscale.c \
+       tkscrbar.c tktext.c tktxbtre.c tktxdisp.c \
+       tktextindex.c
+
+CANVSRCS = tkcanvas.c tkcvarc.c tkcvbmap.c tkcvline.c \
+       tkcvpoly.c tkcvtext.c tkcvwind.c tkrectov.c \
+       tktrig.c
+
+TEXTSRCS = tktext.c tktxbtre.c tktxdisp.c tktxidx.c tktxtag.c
+
+SRCS = tk3d.c tkargv.c tkatom.c tkbind.c tkbitmap.c \
+        tkcmds.c tkcolor.c tkconfig.c tkcursor.c tkerror.c \
+        tkevent.c tkfont.c tkget.c tkgc.c tkgeo.c tkgrab.c \
+        tkoption.c tkpack.c tkplace.c tkpresrv.c tkselect.c \
+        tksend.c tkshare.c tkwindow.c tkwm.c tkrawtcp.c $(widgsrcs) \
+       $(CANVSRCS) $(TEXTSRCS)
+
+all: wish
+
+wish: main.o $(LIBS)
+       $(CC) $(CFLAGS) main.o $(LINKS) $(XLIB) -lm -o wish
+
+libtk.a: $(OBJS)
+       rm -f libtk.a
+       ar cr libtk.a $(OBJS)
+       ranlib libtk.a
+
+$(TCL_DIR)/libtcl.a:
+       cd $(TCL_DIR); make libtcl.a
+
+clean:
+       touch junk~
+       rm -f $(OBJS) main.o libtk.a wish *~
+
+$(OBJS): tk.h tkint.h tkconfig.h
+$(WIDGOBJS): default.h
+$(CANVOBJS): default.h tkcanvas.h
+main.o: tk.h tkint.h
diff --git a/src/tk/readme b/src/tk/readme
new file mode 100644 (file)
index 0000000..e7bd4a5
--- /dev/null
@@ -0,0 +1,213 @@
+The Tk Toolkit, Version 2.3
+
+by John Ousterhout
+University of California at Berkeley
+
+1. Introduction
+---------------
+
+This directory contains the sources and documentation for Tk, which
+is an X11 toolkit that provides the Motif look and feel and is
+implemented using the Tcl command language.
+
+For an introduction to Tcl and Tk you may wish to read two papers:
+``Tcl:  An Embeddable Command Language'', in the Proceedings of the
+1990 Winter USENIX Conference, and ``An X11 Toolkit Based on the Tcl
+Language'', in the Proceedings of the 1991 Winter USENIX Conference.
+A copy of the first paper is present in Postscript form in the file
+"tcl/usenix.ps";  Postscript for the second paper is in "doc/usenix.ps".
+Both Tcl and Tk have evolved quite a bit since these papers were
+written so the papers are no longer complete or correct, but they will
+give you an introduction to the systems.
+
+The following things are present in this directory and its subdirectories:
+
+    1. Tk, a toolkit for X11 windowing applications.
+    2. Tcl, an embeddable command language on which Tk is based.
+    3. Wish, a simple windowing shell that uses Tk and Tcl.
+    4. A collection of demonstration scripts to illustrate the use
+       of various features of Tk.
+
+The enclosed code is known to run on most versions of SunOS and Ultrix
+in combination with the X11R4 and X11R5 window servers from MIT.  It
+should also run with few or no changes on H-P and IBM workstations.
+
+2. What's New In This Release
+-----------------------------
+
+Tk 2.2 is a major new release with a number of new features relative
+to the 2.1 release.  Here is a summary of some of the most significant
+improvements:
+
+- There is now a text widget.  It will display multiple lines of text
+  and allows the text to be edited (but the set of bindings for
+  editing isn't very rich yet).  It also includes a tagging mechanism
+  that allows you to change the fonts, colors, etc. on a character-
+  by-character basis, and you can associate bindings with tags to
+  implement hypertext-like features.  It handles large texts
+  efficiently.
+
+- Canvases have been improved in many ways, including new item types
+  (arcs, bitmaps, and subwindows), Bezier spline support for lines
+  and polygons, "coords" and "bbox" widget commands, and many other
+  improvements and bug fixes.
+
+- There is a new "grab" command that can be used to create modal dialog
+  boxes.
+
+- There is a new "tkwait" command for waiting for particular events to
+  occur (such as modal dialog box to complete its task).
+
+- The menu bindings have been completely reworked to have better Motif
+  compliance, such as keyboard traversal.
+
+- Individual menu entries can now have their own colors and fonts.
+
+- Most widgets (e.g. buttons, entries, text) now have a "-state" option
+  that can be set to "disabled" to make the widget insensitive.
+
+- A new "-disabledForeground" option allows you to request that disabled
+  buttons and menu entries be displayed in a dimmer color rather than with
+  a stippled version of the original color.
+
+- Entries and messages can now be tied to a variable so that either is
+  updated if the other changes.
+
+A good way to try out the new features is to run the "widget" demo;
+there are a number of new demonstrations to illustrate the new features.
+This release also contains many bug fixes.  For a complete description
+of the changes in this release, see the file "changes".  As far as I
+know there should not be any compatibility problems with respect to the
+2.1 release.
+
+3. Documentation
+----------------
+
+Manual entries for Tk are in the "doc" subdirectory as a set of files
+with ".man" extensions.  Man pages whose names start with capital letters
+are for the procedures in Tk's C library.  All other man pages document Tcl
+commands provided by Tk.  To print any of the man pages, cd to the "doc"
+directory and invoke your favorite variant of troff using the normal
+-man macros, for example
+
+               ditroff -man <file>
+
+where <file> is the name of the man page you'd like to print.  If you'd
+like a complete set of hardcopy manual entries, send me a message with
+your street address.
+
+Manual entries for Tcl are available in the subdirectory "tcl/doc";
+see the README file in the "tcl" directory for more information.
+
+Unfortunately, there doesn't yet exist a tutorial-style introduction
+to the facilities of Tcl and Tk.  The papers give a general introduction,
+but it may be difficult to make the transition from the papers to the
+manual entries.  If you are familiar with the Xt toolkit then the Tk
+facilities will probably be easy to pick up from the manual entries.
+If you have no experience with X or Xt, you may wish to wait another
+6-12 months to use Tk, until a more gentle introduction is available.
+
+4. Compiling Tk
+---------------
+
+Before attempting to compile Tk, personalize Makefile by following the
+directions at the beginning of the file.  You should also configure
+Tcl by following the directions in the file "tcl/README".  Then type
+"make" in the top-level directory (the one that contains this file).
+This will compile the Tk library and generate a simple windowing shell
+called "wish".  It will also compile the Tcl library, which is in the
+"tcl" subdirectory.
+
+5. Installing Scripts
+---------------------
+
+Tk depends on a library of scripts that establish default behaviors
+for Tk widgets and do many other things.  Tk normally expects the
+scripts to be in /usr/local/lib/tk.  Create this directory and copy
+everything in the "library" subdirectory to it, including both files
+and subdirectories.  Or, if you don't want to create a subdirectory of
+/usr/local/lib (or if you can't), you can either make a symbolic link
+from there to the library subdirectory or you can add a "-DTK_LIBRARY"
+switch to CFLAGS in Makefile;  this will allow you to put the script
+library anywhere you like.
+
+I also recommend installing the wish binary in /usr/local.  The demo
+scripts all work best when it is installed there.
+
+6. Getting Started
+------------------
+
+Once wish is compiled you can use it to play around with the Tk
+facilities.  If you run wish with no arguments, it will open a small
+window on the screen and read Tcl commands from standard input.
+Or, you can play with some of the pre-canned scripts in the subdirectory
+scripts/demos.  See the README file in the directory for a description
+of what's available.  The file scripts/demos/widget is a script that
+you can use to invoke many individual demostrations of Tk's facilities. 
+
+If you want to start typing Tcl/Tk commands to wish, I'd suggest
+starting with the "bind" command.  Then learn about a widget-creation
+command like "button", and also learn about the "pack" and "place"
+commands for geometry management.  Note:  when you create a widget,
+it won't appear on the screen until you tell a geometry manager about
+it.  The only geometry managers at present are the packer and the placer.
+If you don't already know Tcl, read the Tcl paper and the Tcl.man manual
+entry in the tcl subdirectory.
+
+The easiest way to learn about writing new widgets is probably to look
+at existing widget implementations.  The demos directory contains an
+example of a trivial widget, which you might find useful as a starting
+point for writing new widgets.  You might also take a look at main.c,
+the main program for wish, to see how to write a main program that uses
+the facilities of Tk and Tcl.
+
+7. Newsgroup
+------------
+
+There is a network news group "comp.lang.tcl" intended for the exchange
+of information about Tcl, Tk, and related applications.  Feel free to use
+this newsgroup both for general information questions and for bug reports.
+I read the newsgroup and will attempt to fix bugs and problems reported
+to it.
+
+8. Known Problems
+-----------------
+
+There are still many imperfections with the system.  Below is a list
+of some of the more serious omissions and bugs:
+
+    1. The widgets don't look very good on monochrome displays right now,
+    because I haven't had a chance to figure out how to do the 3-D
+    effects right without color.  The widgets should look pretty good in
+    color.  The widgets aren't fully Motif-compliant yet. In particular,
+    there is no keyboard navigation yet.  The widgets will eventually
+    become fully Motif-compatible (assuming I can figure out how Motif
+    widgets are supposed to look and feel).
+
+    2. Tk doesn't work very well with virtual-root window managers such
+    as tvtwm.
+
+The file ToDo contains a list of various smaller bugs and mis-features
+that haven't been fixed yet.
+    
+9. Feedback Wanted
+------------------
+
+I'm very interested in getting feedback from you both about bugs and about
+overall design issues.  Send your comments to "ouster@sprite.berkeley.edu".
+I'll do my best to fix show-stopping bugs quickly, but most other things
+may not get fast turnaround, since I already have a zillion high-priority
+things to fix or implement.  Before submitting requests for new features
+you may wish to check the file ToDo, which has a list of things I already
+know about and plan to implement soon.
+
+7. The Future
+-------------
+
+Tk is still young.  I expect it to undergo substantial changes as I learn
+more about its strengths and weaknesses.  Some of the changes will not be
+backward compatible:  at this point I think it's more important to fix
+problems and improve Tk's structure than to maintain compatibility.  At
+some point in the next year or so there will be a new release with major
+incompatibilities.  My plan is to save up as many as possible of the
+incompatible changes that are needed and do them all at once.
diff --git a/src/tk/tk.h b/src/tk/tk.h
new file mode 100644 (file)
index 0000000..b70afb8
--- /dev/null
@@ -0,0 +1,743 @@
+/*
+ * tk.h --
+ *
+ *     Declarations for Tk-related things that are visible
+ *     outside of the Tk module itself.
+ *
+ * Copyright 1989-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /user6/ouster/wish/RCS/tk.h,v 1.90 92/08/20 16:36:30 ouster Exp $ SPRITE (Berkeley)
+ */
+
+#ifndef _TK
+#define _TK
+
+#ifndef _TCL
+#include <tcl.h>
+#endif
+#ifndef _XLIB_H
+#include <X11/Xlib.h>
+#endif
+#ifdef __STDC__
+
+/* This is so gcc's stddef.h doesn't clash with sunos4.1.1's stdtypes.h */
+#ifdef __sys_stdtypes_h
+#define _PTRDIFF_T
+#define _SIZE_T
+#define _WCHAR_T
+#endif
+
+#include <stddef.h>
+#endif
+
+/*
+ * Dummy types that are used by clients:
+ */
+
+typedef struct Tk_ErrorHandler_ *Tk_ErrorHandler;
+typedef struct Tk_TimerToken_ *Tk_TimerToken;
+typedef struct Tk_Window_ *Tk_Window;
+typedef struct Tk_3DBorder_ *Tk_3DBorder;
+typedef struct Tk_BindingTable_ *Tk_BindingTable;
+
+/*
+ * Additional types exported to clients.
+ */
+
+typedef char *Tk_Uid;
+
+/*
+ * Structure used to specify how to handle argv options.
+ */
+
+typedef struct {
+    char *key;         /* The key string that flags the option in the
+                        * argv array. */
+    int type;          /* Indicates option type;  see below. */
+    char *src;         /* Value to be used in setting dst;  usage
+                        * depends on type. */
+    char *dst;         /* Address of value to be modified;  usage
+                        * depends on type. */
+    char *help;                /* Documentation message describing this option. */
+} Tk_ArgvInfo;
+
+/*
+ * Legal values for the type field of a Tk_ArgvInfo: see the user
+ * documentation for details.
+ */
+
+#define TK_ARGV_CONSTANT               15
+#define TK_ARGV_INT                    16
+#define TK_ARGV_STRING                 17
+#define TK_ARGV_UID                    18
+#define TK_ARGV_REST                   19
+#define TK_ARGV_FLOAT                  20
+#define TK_ARGV_FUNC                   21
+#define TK_ARGV_GENFUNC                        22
+#define TK_ARGV_HELP                   23
+#define TK_ARGV_CONST_OPTION           24
+#define TK_ARGV_OPTION_VALUE           25
+#define TK_ARGV_OPTION_NAME_VALUE      26
+#define TK_ARGV_END                    27
+
+/*
+ * Flag bits for passing to Tk_ParseArgv:
+ */
+
+#define TK_ARGV_NO_DEFAULTS            0x1
+#define TK_ARGV_NO_LEFTOVERS           0x2
+#define TK_ARGV_NO_ABBREV              0x4
+#define TK_ARGV_DONT_SKIP_FIRST_ARG    0x8
+
+/*
+ * Structure used to describe application-specific configuration
+ * options:  indicates procedures to call to parse an option and
+ * to return a text string describing an option.
+ */
+
+typedef int (Tk_OptionParseProc) _ANSI_ARGS_((ClientData clientData,
+       Tcl_Interp *interp, Tk_Window tkwin, char *value, char *widgRec,
+       int offset));
+typedef char *(Tk_OptionPrintProc) _ANSI_ARGS_((ClientData clientData,
+       Tk_Window tkwin, char *widgRec, int offset,
+       Tcl_FreeProc **freeProcPtr));
+
+typedef struct Tk_CustomOption {
+    Tk_OptionParseProc *parseProc;     /* Procedure to call to parse an
+                                        * option and store it in converted
+                                        * form. */
+    Tk_OptionPrintProc *printProc;     /* Procedure to return a printable
+                                        * string describing an existing
+                                        * option. */
+    ClientData clientData;             /* Arbitrary one-word value used by
+                                        * option parser:  passed to
+                                        * parseProc and printProc. */
+} Tk_CustomOption;
+
+/*
+ * Structure used to specify information for Tk_ConfigureWidget.  Each
+ * structure gives complete information for one option, including
+ * how the option is specified on the command line, where it appears
+ * in the option database, etc.
+ */
+
+typedef struct Tk_ConfigSpec {
+    int type;                  /* Type of option, such as TK_CONFIG_COLOR;
+                                * see definitions below.  Last option in
+                                * table must have type TK_CONFIG_END. */
+    char *argvName;            /* Switch used to specify option in argv.
+                                * NULL means this spec is part of a group. */
+    char *dbName;              /* Name for option in option database. */
+    char *dbClass;             /* Class for option in database. */
+    char *defValue;            /* Default value for option if not
+                                * specified in command line or database. */
+    int offset;                        /* Where in widget record to store value;
+                                * use Tk_Offset macro to generate values
+                                * for this. */
+    int specFlags;             /* Any combination of the values defined
+                                * below;  other bits are used internally
+                                * by tkConfig.c. */
+    Tk_CustomOption *customPtr;        /* If type is TK_CONFIG_CUSTOM then this is
+                                * a pointer to info about how to parse and
+                                * print the option.  Otherwise it is
+                                * irrelevant. */
+} Tk_ConfigSpec;
+
+/*
+ * Type values for Tk_ConfigSpec structures.  See the user
+ * documentation for details.
+ */
+
+#define TK_CONFIG_BOOLEAN      1
+#define TK_CONFIG_INT          2
+#define TK_CONFIG_DOUBLE       3
+#define TK_CONFIG_STRING       4
+#define TK_CONFIG_UID          5
+#define TK_CONFIG_COLOR                6
+#define TK_CONFIG_FONT         7
+#define TK_CONFIG_BITMAP       8
+#define TK_CONFIG_BORDER       9
+#define TK_CONFIG_RELIEF       10
+#define TK_CONFIG_CURSOR       11
+#define TK_CONFIG_ACTIVE_CURSOR        12
+#define TK_CONFIG_JUSTIFY      13
+#define TK_CONFIG_ANCHOR       14
+#define TK_CONFIG_SYNONYM      15
+#define TK_CONFIG_CAP_STYLE    16
+#define TK_CONFIG_JOIN_STYLE   17
+#define TK_CONFIG_PIXELS       18
+#define TK_CONFIG_MM           19
+#define TK_CONFIG_WINDOW       20
+#define TK_CONFIG_CUSTOM       21
+#define TK_CONFIG_END          22
+#define TK_CONFIG_PIXMAP       30
+
+/*
+ * Macro to use to fill in "offset" fields of Tk_ConfigInfos.
+ * Computes number of bytes from beginning of structure to a
+ * given field.
+ */
+
+#ifdef offsetof
+#define Tk_Offset(type, field) ((int) offsetof(type, field))
+#else
+#define Tk_Offset(type, field) ((int) ((char *) &((type *) 0)->field))
+#endif
+
+/*
+ * Possible values for flags argument to Tk_ConfigureWidget:
+ */
+
+#define TK_CONFIG_ARGV_ONLY    1
+
+/*
+ * Possible flag values for Tk_ConfigInfo structures.  Any bits at
+ * or above TK_CONFIG_USER_BIT may be used by clients for selecting
+ * certain entries.  Before changing any values here, coordinate with
+ * tkConfig.c (internal-use-only flags are defined there).
+ */
+
+#define TK_CONFIG_COLOR_ONLY           1
+#define TK_CONFIG_MONO_ONLY            2
+#define TK_CONFIG_NULL_OK              4
+#define TK_CONFIG_DONT_SET_DEFAULT     8
+#define TK_CONFIG_OPTION_SPECIFIED     0x10
+#define TK_CONFIG_USER_BIT             0x100
+
+/*
+ * Bits to pass to Tk_CreateFileHandler to indicate what sorts
+ * of events are of interest:
+ */
+
+#define TK_READABLE    1
+#define TK_WRITABLE    2
+#define TK_EXCEPTION   4
+
+/*
+ * Flag values to pass to Tk_DoOneEvent to disable searches
+ * for some kinds of events:
+ */
+
+#define TK_DONT_WAIT           1
+#define TK_X_EVENTS            2
+#define TK_FILE_EVENTS         4
+#define TK_TIMER_EVENTS                8
+#define TK_IDLE_EVENTS         0x10
+#define TK_ALL_EVENTS          0x1e
+
+/*
+ * Priority levels to pass to Tk_AddOption:
+ */
+
+#define TK_WIDGET_DEFAULT_PRIO 20
+#define TK_STARTUP_FILE_PRIO   40
+#define TK_USER_DEFAULT_PRIO   60
+#define TK_INTERACTIVE_PRIO    80
+#define TK_MAX_PRIO            100
+
+/*
+ * Relief values returned by Tk_GetRelief:
+ */
+
+#define TK_RELIEF_RAISED       1
+#define TK_RELIEF_FLAT         2
+#define TK_RELIEF_SUNKEN       4
+
+/*
+ * Special EnterNotify/LeaveNotify "mode" for use in events
+ * generated by tkShare.c.  Pick a high enough value that it's
+ * unlikely to conflict with existing values (like NotifyNormal)
+ * or any new values defined in the future.
+ */
+
+#define TK_NOTIFY_SHARE                20
+
+/*
+ * Enumerated type for describing a point by which to anchor something:
+ */
+
+typedef enum {
+    TK_ANCHOR_N, TK_ANCHOR_NE, TK_ANCHOR_E, TK_ANCHOR_SE,
+    TK_ANCHOR_S, TK_ANCHOR_SW, TK_ANCHOR_W, TK_ANCHOR_NW,
+    TK_ANCHOR_CENTER
+} Tk_Anchor;
+
+/*
+ * Enumerated type for describing a style of justification:
+ */
+
+typedef enum {
+    TK_JUSTIFY_LEFT, TK_JUSTIFY_RIGHT,
+    TK_JUSTIFY_CENTER, TK_JUSTIFY_FILL
+} Tk_Justify;
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Macros for querying Tk_Window structures.  See the
+ * manual entries for documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+#define Tk_Display(tkwin)              (((Tk_FakeWin *) (tkwin))->display)
+#define Tk_ScreenNumber(tkwin)         (((Tk_FakeWin *) (tkwin))->screenNum)
+#define Tk_Screen(tkwin)               (ScreenOfDisplay(Tk_Display(tkwin), \
+       Tk_ScreenNumber(tkwin)))
+#define Tk_WindowId(tkwin)             (((Tk_FakeWin *) (tkwin))->window)
+#define Tk_PathName(tkwin)             (((Tk_FakeWin *) (tkwin))->pathName)
+#define Tk_Name(tkwin)                 (((Tk_FakeWin *) (tkwin))->nameUid)
+#define Tk_Class(tkwin)                (((Tk_FakeWin *) (tkwin))->classUid)
+#define Tk_X(tkwin)                    (((Tk_FakeWin *) (tkwin))->changes.x)
+#define Tk_Y(tkwin)                    (((Tk_FakeWin *) (tkwin))->changes.y)
+#define Tk_Width(tkwin)                        (((Tk_FakeWin *) (tkwin))->changes.width)
+#define Tk_Height(tkwin) \
+    (((Tk_FakeWin *) (tkwin))->changes.height)
+#define Tk_Changes(tkwin)              (&((Tk_FakeWin *) (tkwin))->changes)
+#define Tk_Attributes(tkwin)           (&((Tk_FakeWin *) (tkwin))->atts)
+#define Tk_IsMapped(tkwin) \
+    (((Tk_FakeWin *) (tkwin))->flags & TK_MAPPED)
+#define Tk_ReqWidth(tkwin)             (((Tk_FakeWin *) (tkwin))->reqWidth)
+#define Tk_ReqHeight(tkwin)            (((Tk_FakeWin *) (tkwin))->reqHeight)
+#define Tk_InternalBorderWidth(tkwin) \
+    (((Tk_FakeWin *) (tkwin))->internalBorderWidth)
+#define Tk_Parent(tkwin)               (((Tk_FakeWin *) (tkwin))->parentPtr)
+
+/*
+ * The structure below is needed by the macros above so that they can
+ * access the fields of a Tk_Window.  The fields not needed by the macros
+ * are declared as "dummyX".  The structure has its own type in order to
+ * prevent applications from accessing Tk_Window fields except using
+ * official macros.  WARNING!! The structure definition must be kept
+ * consistent with the TkWindow structure in tkInt.h.  If you change one,
+ * then change the other.  See the declaration in tkInt.h for
+ * documentation on what the fields are used for internally.
+ */
+
+typedef struct Tk_FakeWin {
+    Display *display;
+    char *dummy1;
+    int screenNum;
+    Window window;
+    char *dummy2;
+    Tk_Window parentPtr;
+    char *dummy4;
+    char *dummy5;
+    char *pathName;
+    Tk_Uid nameUid;
+    Tk_Uid classUid;
+    XWindowChanges changes;
+    unsigned int dummy6;
+    XSetWindowAttributes atts;
+    unsigned long dummy7;
+    unsigned int flags;
+    char *dummy8;
+    char *dummy9;
+    ClientData dummy10;
+    int dummy12;
+    char *dummy13;
+    char *dummy14;
+    ClientData dummy15;
+    char *dummy16;
+    ClientData dummy17;
+    int reqWidth, reqHeight;
+    int internalBorderWidth;
+    char *dummyX;
+} Tk_FakeWin;
+
+/*
+ * Flag values for TkWindow (and Tk_FakeWin) structures are:
+ *
+ * TK_MAPPED:                  1 means window is currently mapped,
+ *                             0 means unmapped.
+ * TK_RECURSIVE_DESTROY:       1 means a recursive destroy is in
+ *                             progress, so some cleanup operations
+ *                             can be omitted.
+ * TK_TOP_LEVEL:               1 means this is a top-level window (it
+ *                             was or will be created as a child of
+ *                             a root window).
+ * TK_ALREADY_DEAD:            1 means the window is in the process of
+ *                             being destroyed already.
+ * TK_NEED_CONFIG_NOTIFY:      1 means that the window has been reconfigured
+ *                             before it was made to exist.  At the time of
+ *                             making it exist a ConfigureNotify event needs
+ *                             to be generated.
+ * TK_GRAB_FLAG:               Used to manage grabs.  See tkGrab.c for
+ *                             details.
+ */
+
+#define TK_MAPPED              1
+#define TK_RECURSIVE_DESTROY   2
+#define TK_TOP_LEVEL           4
+#define TK_ALREADY_DEAD                8
+#define TK_NEED_CONFIG_NOTIFY  0x10
+#define TK_GRAB_FLAG           0x20
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Additional procedure types defined by Tk.
+ *
+ *--------------------------------------------------------------
+ */
+
+typedef int (Tk_ErrorProc) _ANSI_ARGS_((ClientData clientData,
+       XErrorEvent *errEventPtr));
+typedef void (Tk_EventProc) _ANSI_ARGS_((ClientData clientData,
+       XEvent *eventPtr));
+typedef void (Tk_FileProc) _ANSI_ARGS_((ClientData clientData, int mask));
+typedef void (Tk_FocusProc) _ANSI_ARGS_((ClientData clientData, int gotFocus));
+typedef void (Tk_FreeProc) _ANSI_ARGS_((ClientData clientData));
+typedef int (Tk_GenericProc) _ANSI_ARGS_((ClientData clientData,
+       XEvent *eventPtr));
+typedef void (Tk_GeometryProc) _ANSI_ARGS_((ClientData clientData,
+       Tk_Window tkwin));
+typedef int (Tk_GetSelProc) _ANSI_ARGS_((ClientData clientData,
+       Tcl_Interp *interp, char *portion));
+typedef void (Tk_IdleProc) _ANSI_ARGS_((ClientData clientData));
+typedef void (Tk_LostSelProc) _ANSI_ARGS_((ClientData clientData));
+typedef Bool (Tk_RestrictProc) _ANSI_ARGS_((Display *display, XEvent *eventPtr,
+       char *arg));
+typedef int (Tk_SelectionProc) _ANSI_ARGS_((ClientData clientData,
+       int offset, char *buffer, int maxBytes));
+typedef void (Tk_TimerProc) _ANSI_ARGS_((ClientData clientData));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Exported procedures and variables.
+ *
+ *--------------------------------------------------------------
+ */
+
+extern XColor *                Tk_3DBorderColor _ANSI_ARGS_((Tk_3DBorder border));
+extern void            Tk_AddOption _ANSI_ARGS_((Tk_Window tkwin, char *name,
+                           char *value, int priority));
+extern void            Tk_BindEvent _ANSI_ARGS_((Tk_BindingTable bindingTable,
+                           XEvent *eventPtr, Tk_Window tkwin, int numObjects,
+                           ClientData *objectPtr));
+extern void            Tk_CancelIdleCall _ANSI_ARGS_((Tk_IdleProc *idleProc,
+                               ClientData clientData));
+extern void            Tk_ChangeWindowAttributes _ANSI_ARGS_((Tk_Window tkwin,
+                           unsigned long valueMask,
+                           XSetWindowAttributes *attsPtr));
+extern int             Tk_ConfigureInfo _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, Tk_ConfigSpec *specs,
+                           char *widgRec, char *argvName, int flags));
+extern int             Tk_ConfigureWidget _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, Tk_ConfigSpec *specs,
+                           int argc, char **argv, char *widgRec,
+                           int flags));
+extern Tk_Window       Tk_CoordsToWindow _ANSI_ARGS_((int rootX, int rootY,
+                           Tk_Window tkwin));
+extern unsigned long   Tk_CreateBinding _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_BindingTable bindingTable, ClientData object,
+                           char *eventString, char *command, int append));
+extern Tk_BindingTable Tk_CreateBindingTable _ANSI_ARGS_((Tcl_Interp *interp));
+extern Tk_ErrorHandler Tk_CreateErrorHandler _ANSI_ARGS_((Display *display,
+                           int error, int request, int minorCode,
+                           Tk_ErrorProc *errorProc, ClientData clientData));
+extern void            Tk_CreateEventHandler _ANSI_ARGS_((Tk_Window token,
+                           unsigned long mask, Tk_EventProc *proc,
+                           ClientData clientData));
+extern void            Tk_CreateFileHandler _ANSI_ARGS_((int fd, int mask,
+                           Tk_FileProc *proc, ClientData clientData));
+extern void            Tk_CreateFocusHandler _ANSI_ARGS_((Tk_Window tkwin,
+                           Tk_FocusProc *proc, ClientData clientData));
+extern void            Tk_CreateGenericHandler _ANSI_ARGS_((
+                           Tk_GenericProc *proc, ClientData clientData));
+extern Tk_Window       Tk_CreateMainWindow _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *screenName, char *baseName));
+extern void            Tk_CreateSelHandler _ANSI_ARGS_((Tk_Window tkwin,
+                           Atom target, Tk_SelectionProc *proc,
+                           ClientData clientData, Atom format));
+extern Tk_TimerToken   Tk_CreateTimerHandler _ANSI_ARGS_((int milliseconds,
+                           Tk_TimerProc *proc, ClientData clientData));
+// Added by Don to support finer timer resolution.
+extern Tk_TimerToken   Tk_CreateMicroTimerHandler _ANSI_ARGS_((int seconds,
+                           int microseconds, Tk_TimerProc *proc, ClientData clientData));
+extern Tk_Window       Tk_CreateWindow _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window parent, char *name, char *screenName));
+extern Tk_Window       Tk_CreateWindowFromPath _ANSI_ARGS_((
+                           Tcl_Interp *interp, Tk_Window tkwin,
+                           char *pathName, char *screenName));
+extern int             Tk_DefineBitmap _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Uid name, char *source, unsigned int width,
+                           unsigned int height));
+extern int             Tk_DefinePixmap _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Uid name, Tk_Window, Pixmap pixmap,
+                           char *source, unsigned int width,
+                           unsigned int height));
+extern void            Tk_DefineCursor _ANSI_ARGS_((Tk_Window window,
+                           Cursor cursor));
+extern void            Tk_DeleteAllBindings _ANSI_ARGS_((
+                           Tk_BindingTable bindingTable, ClientData object));
+extern int             Tk_DeleteBinding _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_BindingTable bindingTable, ClientData object,
+                           char *eventString));
+extern void            Tk_DeleteBindingTable _ANSI_ARGS_((
+                           Tk_BindingTable bindingTable));
+extern void            Tk_DeleteErrorHandler _ANSI_ARGS_((
+                           Tk_ErrorHandler handler));
+extern void            Tk_DeleteEventHandler _ANSI_ARGS_((Tk_Window token,
+                           unsigned long mask, Tk_EventProc *proc,
+                           ClientData clientData));
+extern void            Tk_DeleteFileHandler _ANSI_ARGS_((int fd));
+extern void            Tk_DeleteGenericHandler _ANSI_ARGS_((
+                           Tk_GenericProc *proc, ClientData clientData));
+extern void            Tk_DeleteTimerHandler _ANSI_ARGS_((
+                           Tk_TimerToken token));
+extern void            Tk_DestroyWindow _ANSI_ARGS_((Tk_Window tkwin));
+extern char *          Tk_DisplayName _ANSI_ARGS_((Tk_Window tkwin));
+extern int             Tk_DoOneEvent _ANSI_ARGS_((int flags));
+extern void            Tk_DoWhenIdle _ANSI_ARGS_((Tk_IdleProc *proc,
+                           ClientData clientData));
+extern void            Tk_Draw3DPolygon _ANSI_ARGS_((Display *display,
+                           Drawable drawable, Tk_3DBorder border,
+                           XPoint *pointPtr, int numPoints, int borderWidth,
+                           int leftRelief));
+extern void            Tk_Draw3DRectangle _ANSI_ARGS_((Display *display,
+                           Drawable drawable, Tk_3DBorder border, int x,
+                           int y, int width, int height, int borderWidth,
+                           int relief));
+extern void            Tk_EventuallyFree _ANSI_ARGS_((ClientData clientData,
+                           Tk_FreeProc *freeProc));
+extern void            Tk_Fill3DPolygon _ANSI_ARGS_((Display *display,
+                           Drawable drawable, Tk_3DBorder border,
+                           XPoint *pointPtr, int numPoints, int borderWidth,
+                           int leftRelief));
+extern void            Tk_Fill3DRectangle _ANSI_ARGS_((Display *display,
+                           Drawable drawable, Tk_3DBorder border, int x,
+                           int y, int width, int height, int borderWidth,
+                           int relief));
+extern void            Tk_Free3DBorder _ANSI_ARGS_((Tk_3DBorder border));
+extern void            Tk_FreeBitmap _ANSI_ARGS_((Pixmap bitmap));
+extern void            Tk_FreePixmap _ANSI_ARGS_((Pixmap bitmap));
+extern void            Tk_FreeColor _ANSI_ARGS_((XColor *colorPtr));
+extern int             Tk_IndexOfScreen _ANSI_ARGS_((Screen *screen));
+extern int             Tk_DefaultDepth _ANSI_ARGS_((Screen *screen));
+extern Visual          *Tk_DefaultVisual _ANSI_ARGS_((Screen *screen));
+extern Colormap                Tk_DefaultColormap _ANSI_ARGS_((Screen *screen));
+extern Window          Tk_DefaultRootWindow _ANSI_ARGS_((Display *dpy));
+extern GC              Tk_DefaultGC _ANSI_ARGS_((Screen *screen));
+extern Pixmap          Tk_DefaultPixmap _ANSI_ARGS_((Screen *screen));
+extern void            Tk_FreeCursor _ANSI_ARGS_((Cursor cursor));
+extern void            Tk_FreeFontStruct _ANSI_ARGS_((
+                           XFontStruct *fontStructPtr));
+extern void            Tk_FreeGC _ANSI_ARGS_((GC gc));
+extern void            Tk_GeometryRequest _ANSI_ARGS_((Tk_Window tkwin,
+                           int reqWidth,  int reqHeight));
+extern Tk_3DBorder     Tk_Get3DBorder _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, Colormap colormap,
+                           Tk_Uid colorName));
+extern void            Tk_GetAllBindings _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_BindingTable bindingTable, ClientData object));
+extern int             Tk_GetAnchor _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, Tk_Anchor *anchorPtr));
+extern char *          Tk_GetAtomName _ANSI_ARGS_((Tk_Window tkwin,
+                           Atom atom));
+extern char *          Tk_GetBinding _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_BindingTable bindingTable, ClientData object,
+                           char *eventString));
+extern Pixmap          Tk_GetBitmap _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, Tk_Uid string));
+extern Pixmap          Tk_GetPixmap _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, Tk_Uid string));
+extern Pixmap          Tk_GetBitmapFromData _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, char *source,
+                           unsigned int width, unsigned int height));
+extern Pixmap          Tk_GetPixmapFromData _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, char *source,
+                           unsigned int width, unsigned int height));
+extern int             Tk_GetCapStyle _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, int *capPtr));
+extern XColor *                Tk_GetColor _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, Colormap colormap, Tk_Uid name));
+extern XColor *                Tk_GetColorByValue _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, Colormap colormap,
+                           XColor *colorPtr));
+extern Cursor          Tk_GetCursor _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, Tk_Uid string));
+extern Cursor          Tk_GetCursorFromData _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, char *source, char *mask,
+                           unsigned int width, unsigned int height,
+                           int xHot, int yHot, Tk_Uid fg, Tk_Uid bg));
+extern XFontStruct *   Tk_GetFontStruct _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, Tk_Uid name));
+extern GC              Tk_GetGC _ANSI_ARGS_((Tk_Window tkwin,
+                           unsigned long valueMask, XGCValues *valuePtr));
+extern int             Tk_GetJoinStyle _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, int *joinPtr));
+extern int             Tk_GetJustify _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string, Tk_Justify *justifyPtr));
+extern Tk_Uid          Tk_GetOption _ANSI_ARGS_((Tk_Window tkwin, char *name,
+                           char *className));
+extern int             Tk_GetPixels _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, char *string, int *intPtr));
+extern int             Tk_GetRelief _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *name, int *reliefPtr));
+extern void            Tk_GetRootCoords _ANSI_ARGS_ ((Tk_Window tkwin,
+                           int *xPtr, int *yPtr));
+extern int             Tk_GetScreenMM _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, char *string, double *doublePtr));
+extern int             Tk_GetSelection _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, Atom target, Tk_GetSelProc *proc,
+                           ClientData clientData));
+extern Tk_Uid          Tk_GetUid _ANSI_ARGS_((char *string));
+extern int             Tk_Grab _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, int grabGlobal));
+extern void            Tk_HandleEvent _ANSI_ARGS_((XEvent *eventPtr));
+extern Atom            Tk_InternAtom _ANSI_ARGS_((Tk_Window tkwin,
+                           char *name));
+extern void            Tk_MainLoop _ANSI_ARGS_((void));
+extern void            Tk_MakeWindowExist _ANSI_ARGS_((Tk_Window tkwin));
+extern void            Tk_ManageGeometry _ANSI_ARGS_((Tk_Window tkwin,
+                           Tk_GeometryProc *proc, ClientData clientData));
+extern void            Tk_MapWindow _ANSI_ARGS_((Tk_Window tkwin));
+extern void            Tk_MoveResizeWindow _ANSI_ARGS_((Tk_Window tkwin,
+                           int x, int y, unsigned int width,
+                           unsigned int height));
+extern void            Tk_MoveWindow _ANSI_ARGS_((Tk_Window tkwin, int x,
+                           int y));
+extern char *          Tk_NameOf3DBorder _ANSI_ARGS_((Tk_3DBorder border));
+extern char *          Tk_NameOfAnchor _ANSI_ARGS_((Tk_Anchor anchor));
+extern char *          Tk_NameOfBitmap _ANSI_ARGS_((Pixmap bitmap));
+extern char *          Tk_NameOfPixmap _ANSI_ARGS_((Pixmap bitmap));
+extern char *          Tk_NameOfCapStyle _ANSI_ARGS_((int cap));
+extern char *          Tk_NameOfColor _ANSI_ARGS_((XColor *colorPtr));
+extern char *          Tk_NameOfCursor _ANSI_ARGS_((Cursor cursor));
+extern char *          Tk_NameOfFontStruct _ANSI_ARGS_((
+                           XFontStruct *fontStructPtr));
+extern char *          Tk_NameOfJoinStyle _ANSI_ARGS_((int join));
+extern char *          Tk_NameOfJustify _ANSI_ARGS_((Tk_Justify justify));
+extern char *          Tk_NameOfRelief _ANSI_ARGS_((int relief));
+extern Tk_Window       Tk_NameToWindow _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *pathName, Tk_Window tkwin));
+extern void            Tk_OwnSelection _ANSI_ARGS_((Tk_Window tkwin,
+                           Tk_LostSelProc *proc, ClientData clientData));
+extern int             Tk_ParseArgv _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, int *argcPtr, char **argv,
+                           Tk_ArgvInfo *argTable, int flags));
+extern void            Tk_Preserve _ANSI_ARGS_((ClientData clientData));
+extern int             Tk_RegisterInterp _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *name, Tk_Window tkwin));
+extern void            Tk_Release _ANSI_ARGS_((ClientData clientData));
+extern void            Tk_ResizeWindow _ANSI_ARGS_((Tk_Window tkwin,
+                           unsigned int width, unsigned int height));
+extern Tk_RestrictProc *Tk_RestrictEvents _ANSI_ARGS_((Tk_RestrictProc *proc,
+                           char *arg, char **prevArgPtr));
+extern void            Tk_SetBackgroundFromBorder _ANSI_ARGS_((
+                           Tk_Window tkwin, Tk_3DBorder border));
+extern void            Tk_SetClass _ANSI_ARGS_((Tk_Window tkwin,
+                           char *className));
+extern void            Tk_SetGrid _ANSI_ARGS_((Tk_Window tkwin,
+                           int reqWidth, int reqHeight, int gridWidth,
+                           int gridHeight));
+extern void            Tk_SetInternalBorder _ANSI_ARGS_((Tk_Window tkwin,
+                           int width));
+extern void            Tk_SetWindowBackground _ANSI_ARGS_((Tk_Window tkwin,
+                           unsigned long pixel));
+extern void            Tk_SetWindowBackgroundPixmap _ANSI_ARGS_((
+                           Tk_Window tkwin, Pixmap pixmap));
+extern void            Tk_SetWindowBorder _ANSI_ARGS_((Tk_Window tkwin,
+                           unsigned long pixel));
+extern void            Tk_SetWindowBorderWidth _ANSI_ARGS_((Tk_Window tkwin,
+                           int width));
+extern void            Tk_SetWindowBorderPixmap _ANSI_ARGS_((Tk_Window tkwin,
+                           Pixmap pixmap));
+extern void            Tk_ShareEvents _ANSI_ARGS_((Tk_Window tkwin,
+                           Tk_Uid groupId));
+extern void            Tk_SizeOfBitmap _ANSI_ARGS_((Pixmap bitmap,
+                           unsigned int *widthPtr, unsigned int *heightPtr));
+extern void            Tk_SizeOfPixmap _ANSI_ARGS_((Pixmap bitmap,
+                           unsigned int *widthPtr, unsigned int *heightPtr));
+extern void            Tk_Sleep _ANSI_ARGS_((int ms));
+extern void            Tk_UndefineCursor _ANSI_ARGS_((Tk_Window window));
+extern int             Tk_UndefinePixmap _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Uid name, Tk_Window tkwin));
+extern void            Tk_Ungrab _ANSI_ARGS_((Tk_Window tkwin));
+extern void            Tk_UnmapWindow _ANSI_ARGS_((Tk_Window tkwin));
+extern void            Tk_UnshareEvents _ANSI_ARGS_((Tk_Window tkwin,
+                           Tk_Uid groupId));
+
+
+extern int             tk_NumMainWindows;
+
+/* 
+ * Added by dhopkins for OLPC Micropolis gtk.Socket integration. 
+ */
+extern Window           tk_RootWindow;
+
+/*
+ * Tcl commands exported by Tk:
+ */
+
+extern int             Tk_AfterCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_ApplicationCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_BindCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_ButtonCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_CanvasCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_DestroyCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_EntryCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_FrameCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_FocusCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_GrabCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_ListboxCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_MenuCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_MenubuttonCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_MessageCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_OptionCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_PackCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_PlaceCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_ScaleCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_ScrollbarCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_SelectionCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_SendCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_TextCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_TkwaitCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_UpdateCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_WinfoCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tk_WmCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tcp_AcceptCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tcp_ConnectCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tcp_ShutdownCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern int             Tcp_FileHandlerCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+
+#endif /* _TK */
diff --git a/src/tk/tk3d.c b/src/tk/tk3d.c
new file mode 100644 (file)
index 0000000..9f6950e
--- /dev/null
@@ -0,0 +1,993 @@
+/* 
+ * tk3D.c --
+ *
+ *     This module provides procedures to draw borders in
+ *     the three-dimensional Motif style.
+ *
+ * Copyright 1990 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tk3d.c,v 1.30 92/06/15 14:28:18 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tk.h"
+
+/*
+ * One of the following data structures is allocated for
+ * each 3-D border currently in use.  Structures of this
+ * type are indexed by borderTable, so that a single
+ * structure can be shared for several uses.
+ */
+
+typedef struct {
+    Display *display;          /* Display for which the resources
+                                * below are allocated. */
+    int refCount;              /* Number of different users of
+                                * this border.  */
+    XColor *bgColorPtr;                /* Background color (intensity
+                                * between lightColorPtr and
+                                * darkColorPtr). */
+    XColor *lightColorPtr;     /* Color used for lighter areas of
+                                * border (must free this when
+                                * deleting structure). */
+    XColor *darkColorPtr;      /* Color for darker areas (must
+                                * free when deleting structure). */
+    Pixmap shadow;             /* Stipple pattern to use for drawing
+                                * lighter-shadow-ed areas.  Only used on
+                                * monochrome displays;  on color displays
+                                * this is None. */
+    GC lightGC;                        /* Used to draw lighter parts of
+                                * the border. */
+    GC darkGC;                 /* Used to draw darker parts of the
+                                * border. */
+    GC bgGC;                   /* Used (if necessary) to draw areas in
+                                * the background color. */
+    Tcl_HashEntry *hashPtr;    /* Entry in borderTable (needed in
+                                * order to delete structure). */
+} Border;
+
+/*
+ * Hash table to map from a border's values (color, etc.) to a
+ * Border structure for those values.
+ */
+
+static Tcl_HashTable borderTable;
+typedef struct {
+    Tk_Uid colorName;          /* Color for border. */
+    Colormap colormap;         /* Colormap used for allocating border
+                                * colors. */
+    Screen *screen;            /* Screen on which border will be drawn. */
+} BorderKey;
+
+/*
+ * Maximum intensity for a color:
+ */
+
+#define MAX_INTENSITY 65535
+
+
+static int initialized = 0;    /* 0 means static structures haven't
+                                * been initialized yet. */
+
+/*
+ * Forward declarations for procedures defined in this file:
+ */
+
+static void            BorderInit _ANSI_ARGS_((void));
+static int             Intersect _ANSI_ARGS_((XPoint *a1Ptr, XPoint *a2Ptr,
+                           XPoint *b1Ptr, XPoint *b2Ptr, XPoint *iPtr));
+static void            ShiftLine _ANSI_ARGS_((XPoint *p1Ptr, XPoint *p2Ptr,
+                           int distance, XPoint *p3Ptr));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_Get3DBorder --
+ *
+ *     Create a data structure for displaying a 3-D border.
+ *
+ * Results:
+ *     The return value is a token for a data structure
+ *     describing a 3-D border.  This token may be passed
+ *     to Tk_Draw3DRectangle and Tk_Free3DBorder.  If an
+ *     error prevented the border from being created then
+ *     NULL is returned and an error message will be left
+ *     in interp->result.
+ *
+ * Side effects:
+ *     Data structures, graphics contexts, etc. are allocated.
+ *     It is the caller's responsibility to eventually call
+ *     Tk_Free3DBorder to release the resources.
+ *
+ *--------------------------------------------------------------
+ */
+
+Tk_3DBorder
+Tk_Get3DBorder(interp, tkwin, colormap, colorName)
+    Tcl_Interp *interp;                /* Place to store an error message. */
+    Tk_Window tkwin;           /* Token for window in which
+                                * border will be drawn. */
+    Colormap colormap;         /* Colormap to use for allocating border
+                                * colors.  None means use default colormap
+                                * for screen. */
+    Tk_Uid colorName;          /* String giving name of color
+                                * for window background. */
+{
+    BorderKey key;
+    Tcl_HashEntry *hashPtr;
+    register Border *borderPtr;
+    int new;
+    unsigned long light, dark;
+    XGCValues gcValues;
+    unsigned long mask;
+
+    if (!initialized) {
+       BorderInit();
+    }
+
+    /*
+     * First, check to see if there's already a border that will work
+     * for this request.
+     */
+
+    key.colorName = colorName;
+    if (colormap == None) {
+       colormap = Tk_DefaultColormap(Tk_Screen(tkwin));
+    }
+    key.colormap = colormap;
+    key.screen = Tk_Screen(tkwin);
+
+    hashPtr = Tcl_CreateHashEntry(&borderTable, (char *) &key, &new);
+    if (!new) {
+       borderPtr = (Border *) Tcl_GetHashValue(hashPtr);
+       borderPtr->refCount++;
+    } else {
+
+       /*
+        * No satisfactory border exists yet.  Initialize a new one.
+        */
+    
+       borderPtr = (Border *) ckalloc(sizeof(Border));
+       borderPtr->display = Tk_Display(tkwin);
+       borderPtr->refCount = 1;
+       borderPtr->bgColorPtr = NULL;
+       borderPtr->lightColorPtr = NULL;
+       borderPtr->darkColorPtr = NULL;
+       borderPtr->shadow = None;
+       borderPtr->lightGC = None;
+       borderPtr->darkGC = None;
+       borderPtr->bgGC = None;
+       borderPtr->hashPtr = hashPtr;
+       Tcl_SetHashValue(hashPtr, borderPtr);
+    
+       /*
+        * Figure out what colors and GC's to use for the light
+        * and dark areas and set up the graphics contexts.
+        * Monochrome displays get handled differently than
+        * color displays.
+        */
+    
+       borderPtr->bgColorPtr = Tk_GetColor(interp, tkwin,
+               key.colormap, colorName);
+       if (borderPtr->bgColorPtr == NULL) {
+           goto error;
+       }
+       if (Tk_DefaultDepth(Tk_Screen(tkwin)) == 1) {
+           /*
+            * Monochrome display.
+            */
+    
+           light = borderPtr->bgColorPtr->pixel;
+           if (light == WhitePixelOfScreen(Tk_Screen(tkwin))) {
+               dark = BlackPixelOfScreen(Tk_Screen(tkwin));
+           } else {
+               dark = WhitePixelOfScreen(Tk_Screen(tkwin));
+           }
+           borderPtr->shadow = Tk_GetBitmap(interp, tkwin,
+                   Tk_GetUid("gray50"));
+           if (borderPtr->shadow == None) {
+               goto error;
+           }
+       } else {
+           XColor lightColor, darkColor;
+           int tmp;
+
+           /*
+            * Color display.  Compute the colors for the illuminated
+            * and shaded portions of the border.
+            */
+    
+           tmp = (14*(int)borderPtr->bgColorPtr->red)/10;
+           if (tmp > MAX_INTENSITY) {
+               tmp = MAX_INTENSITY;
+           }
+           lightColor.red = tmp;
+           tmp = (14*(int)borderPtr->bgColorPtr->green)/10;
+           if (tmp > MAX_INTENSITY) {
+               tmp = MAX_INTENSITY;
+           }
+           lightColor.green = tmp;
+           tmp = (14*(int)borderPtr->bgColorPtr->blue)/10;
+           if (tmp > MAX_INTENSITY) {
+               tmp = MAX_INTENSITY;
+           }
+           lightColor.blue = tmp;
+           darkColor.red = (60*(int)borderPtr->bgColorPtr->red)/100;
+           darkColor.green = (60*(int)borderPtr->bgColorPtr->green)/100;
+           darkColor.blue = (60*(int)borderPtr->bgColorPtr->blue)/100;
+           borderPtr->lightColorPtr = Tk_GetColorByValue(interp, tkwin,
+                   key.colormap, &lightColor);
+           if (borderPtr->lightColorPtr == NULL) {
+               goto error;
+           }
+           borderPtr->darkColorPtr = Tk_GetColorByValue(interp, tkwin,
+                   key.colormap, &darkColor);
+           if (borderPtr->darkColorPtr == NULL) {
+               goto error;
+           }
+           light = borderPtr->lightColorPtr->pixel;
+           dark = borderPtr->darkColorPtr->pixel;
+       }
+       gcValues.foreground = light;
+       gcValues.background = dark;
+       mask = GCForeground|GCBackground;
+       if (borderPtr->shadow != None) {
+           gcValues.stipple = borderPtr->shadow;
+           gcValues.fill_style = FillOpaqueStippled;
+           mask |= GCStipple|GCFillStyle;
+       }
+       borderPtr->lightGC = Tk_GetGC(tkwin, mask, &gcValues);
+       gcValues.foreground = dark;
+       gcValues.background = light;
+       borderPtr->darkGC = Tk_GetGC(tkwin, GCForeground|GCBackground,
+               &gcValues);
+       gcValues.foreground = borderPtr->bgColorPtr->pixel;
+       borderPtr->bgGC = Tk_GetGC(tkwin, GCForeground, &gcValues);
+    }
+    return (Tk_3DBorder) borderPtr;
+
+    error:
+    Tk_Free3DBorder((Tk_3DBorder) borderPtr);
+    return NULL;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_Draw3DRectangle --
+ *
+ *     Draw a 3-D border at a given place in a given window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A 3-D border will be drawn in the indicated drawable.
+ *     The outside edges of the border will be determined by x,
+ *     y, width, and height.  The inside edges of the border
+ *     will be determined by the borderWidth argument.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_Draw3DRectangle(display, drawable, border, x, y, width, height,
+       borderWidth, relief)
+    Display *display;          /* X display in which to draw. */
+    Drawable drawable;         /* X window or pixmap in which to draw. */
+    Tk_3DBorder border;                /* Token for border to draw. */
+    int x, y, width, height;   /* Outside area of region in
+                                * which border will be drawn. */
+    int borderWidth;           /* Desired width for border, in
+                                * pixels. */
+    int relief;                        /* Should be either TK_RELIEF_RAISED
+                                * or TK_RELIEF_SUNKEN;  indicates
+                                * position of interior of window relative
+                                * to exterior. */
+{
+    register Border *borderPtr = (Border *) border;
+    GC top, bottom;
+    XPoint points[7];
+
+    if ((width < 2*borderWidth) || (height < 2*borderWidth)) {
+       return;
+    }
+
+    if (relief == TK_RELIEF_RAISED) {
+       top = borderPtr->lightGC;
+       bottom = borderPtr->darkGC;
+    } else if (relief == TK_RELIEF_SUNKEN) {
+       top = borderPtr->darkGC;
+       bottom = borderPtr->lightGC;
+    } else {
+       top = bottom = borderPtr->bgGC;
+    }
+    XFillRectangle(display, drawable, bottom, x, y+height-borderWidth,
+
+           (unsigned int) width, (unsigned int) borderWidth);
+    XFillRectangle(display, drawable, bottom, x+width-borderWidth, y,
+           (unsigned int) borderWidth, (unsigned int) height);
+    points[0].x = points[1].x = points[6].x = x;
+    points[0].y = points[6].y = y + height;
+    points[1].y = points[2].y = y;
+    points[2].x = x + width;
+    points[3].x = x + width - borderWidth;
+    points[3].y = points[4].y = y + borderWidth;
+    points[4].x = points[5].x = x + borderWidth;
+    points[5].y = y + height - borderWidth;
+    XFillPolygon(display, drawable, top, points, 7, Nonconvex,
+           CoordModeOrigin);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_NameOf3DBorder --
+ *
+ *     Given a border, return a textual string identifying the
+ *     border's color.
+ *
+ * Results:
+ *     The return value is the string that was used to create
+ *     the border.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+char *
+Tk_NameOf3DBorder(border)
+    Tk_3DBorder border;                /* Token for border. */
+{
+    Border *borderPtr = (Border *) border;
+
+    return ((BorderKey *) borderPtr->hashPtr->key.words)->colorName;
+}
+\f
+/*
+ *--------------------------------------------------------------------
+ *
+ * Tk_3DBorderColor --
+ *
+ *     Given a 3D border, return the X color used for the "flat"
+ *     surfaces.
+ *
+ * Results:
+ *     Returns the color used drawing flat surfaces with the border.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------------
+ */
+XColor *
+Tk_3DBorderColor(border)
+    Tk_3DBorder border;
+{
+    return(((Border *) border)->bgColorPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_Free3DBorder --
+ *
+ *     This procedure is called when a 3D border is no longer
+ *     needed.  It frees the resources associated with the
+ *     border.  After this call, the caller should never again
+ *     use the "border" token.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Resources are freed.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_Free3DBorder(border)
+    Tk_3DBorder border;                /* Token for border to be released. */
+{
+    register Border *borderPtr = (Border *) border;
+
+    borderPtr->refCount--;
+    if (borderPtr->refCount == 0) {
+       if (borderPtr->bgColorPtr != NULL) {
+           Tk_FreeColor(borderPtr->bgColorPtr);
+       }
+       if (borderPtr->lightColorPtr != NULL) {
+           Tk_FreeColor(borderPtr->lightColorPtr);
+       }
+       if (borderPtr->darkColorPtr != NULL) {
+           Tk_FreeColor(borderPtr->darkColorPtr);
+       }
+       if (borderPtr->shadow != None) {
+           Tk_FreeBitmap(borderPtr->shadow);
+       }
+       if (borderPtr->lightGC != None) {
+           Tk_FreeGC(borderPtr->lightGC);
+       }
+       if (borderPtr->darkGC != None) {
+           Tk_FreeGC(borderPtr->darkGC);
+       }
+       if (borderPtr->bgGC != None) {
+           Tk_FreeGC(borderPtr->bgGC);
+       }
+       Tcl_DeleteHashEntry(borderPtr->hashPtr);
+       ckfree((char *) borderPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_SetBackgroundFromBorder --
+ *
+ *     Change the background of a window to one appropriate for a given
+ *     3-D border.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Tkwin's background gets modified.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_SetBackgroundFromBorder(tkwin, border)
+    Tk_Window tkwin;           /* Window whose background is to be set. */
+    Tk_3DBorder border;                /* Token for border. */
+{
+    register Border *borderPtr = (Border *) border;
+
+    Tk_SetWindowBackground(tkwin, borderPtr->bgColorPtr->pixel);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_GetRelief --
+ *
+ *     Parse a relief description and return the corresponding
+ *     relief value, or an error.
+ *
+ * Results:
+ *     A standard Tcl return value.  If all goes well then
+ *     *reliefPtr is filled in with one of the values
+ *     TK_RELIEF_RAISED, TK_RELIEF_FLAT, or TK_RELIEF_SUNKEN.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tk_GetRelief(interp, name, reliefPtr)
+    Tcl_Interp *interp;                /* For error messages. */
+    char *name;                        /* Name of a relief type. */
+    int *reliefPtr;            /* Where to store converted relief. */
+{
+    char c;
+    int length;
+
+    c = name[0];
+    length = strlen(name);
+    if ((c == 'f') && (strncmp(name, "flat", length) == 0)) {
+       *reliefPtr = TK_RELIEF_FLAT;
+    } else if ((c == 'r') && (strncmp(name, "raised", length) == 0)) {
+       *reliefPtr = TK_RELIEF_RAISED;
+    } else if ((c == 's') && (strncmp(name, "sunken", length) == 0)) {
+       *reliefPtr = TK_RELIEF_SUNKEN;
+    } else {
+       sprintf(interp->result, "bad relief type \"%.50s\":  must be %s",
+               name, "flat, raised, or sunken");
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_NameOfRelief --
+ *
+ *     Given a relief value, produce a string describing that
+ *     relief value.
+ *
+ * Results:
+ *     The return value is a static string that is equivalent
+ *     to relief.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+char *
+Tk_NameOfRelief(relief)
+    int relief;                /* One of TK_RELIEF_FLAT, TK_RELIEF_RAISED,
+                        * or TK_RELIEF_SUNKEN. */
+{
+    if (relief == TK_RELIEF_FLAT) {
+       return "flat";
+    } else if (relief == TK_RELIEF_SUNKEN) {
+       return "sunken";
+    } else if (relief == TK_RELIEF_RAISED) {
+       return "raised";
+    } else {
+       return "unknown relief";
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_Draw3DPolygon --
+ *
+ *     Draw a border with 3-D appearance around the edge of a
+ *     given polygon.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information is drawn in "drawable" in the form of a
+ *     3-D border borderWidth units width wide on the left
+ *     of the trajectory given by pointPtr and numPoints (or
+ *     -borderWidth units wide on the right side, if borderWidth
+ *     is negative.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_Draw3DPolygon(display, drawable, border, pointPtr, numPoints,
+       borderWidth, leftRelief)
+    Display *display;          /* X display in which to draw polygon. */
+    Drawable drawable;         /* X window or pixmap in which to draw. */
+    Tk_3DBorder border;                /* Token for border to draw. */
+    XPoint *pointPtr;          /* Array of points describing
+                                * polygon.  All points must be
+                                * absolute (CoordModeOrigin). */
+    int numPoints;             /* Number of points at *pointPtr. */
+    int borderWidth;           /* Width of border, measured in
+                                * pixels to the left of the polygon's
+                                * trajectory.   May be negative. */
+    int leftRelief;            /* TK_RELIEF_RAISED or
+                                * TK_RELIEF_SUNKEN: indicates how
+                                * stuff to left of trajectory looks
+                                * relative to stuff on right. */
+{
+    XPoint poly[4], b1, b2, newB1, newB2;
+    XPoint perp, c, shift1, shift2;    /* Used for handling parallel lines. */
+    register XPoint *p1Ptr, *p2Ptr;
+    Border *borderPtr = (Border *) border;
+    GC gc;
+    int i, lightOnLeft, dx, dy, parallel, pointsSeen;
+
+    /*
+     * If the polygon is already closed, drop the last point from it
+     * (we'll close it automatically).
+     */
+
+    p1Ptr = &pointPtr[numPoints-1];
+    p2Ptr = &pointPtr[0];
+    if ((p1Ptr->x == p2Ptr->x) && (p1Ptr->y == p2Ptr->y)) {
+       numPoints--;
+    }
+
+    /*
+     * The loop below is executed once for each vertex in the polgon.
+     * At the beginning of each iteration things look like this:
+     *
+     *          poly[1]       /
+     *             *        /
+     *             |      /
+     *             b1   * poly[0] (pointPtr[i-1])
+     *             |    |
+     *             |    |
+     *             |    |
+     *             |    |
+     *             |    |
+     *             |    | *p1Ptr            *p2Ptr
+     *             b2   *--------------------*
+     *             |
+     *             |
+     *             x-------------------------
+     *
+     * The job of this iteration is to do the following:
+     * (a) Compute x (the border corner corresponding to
+     *     pointPtr[i]) and put it in poly[2].  As part of
+     *    this, compute a new b1 and b2 value for the next
+     *    side of the polygon.
+     * (b) Put pointPtr[i] into poly[3].
+     * (c) Draw the polygon given by poly[0..3].
+     * (d) Advance poly[0], poly[1], b1, and b2 for the
+     *     next side of the polygon.
+     */
+
+    /*
+     * The above situation doesn't first come into existence until
+     * two points have been processed;  the first two points are
+     * used to "prime the pump", so some parts of the processing
+     * are ommitted for these points.  The variable "pointsSeen"
+     * keeps track of the priming process;  it has to be separate
+     * from i in order to be able to ignore duplicate points in the
+     * polygon.
+     */
+
+    pointsSeen = 0;
+    for (i = -2, p1Ptr = &pointPtr[numPoints-2], p2Ptr = p1Ptr+1;
+           i < numPoints; i++, p1Ptr = p2Ptr, p2Ptr++) {
+       if ((i == -1) || (i == numPoints-1)) {
+           p2Ptr = pointPtr;
+       }
+       if ((p2Ptr->x == p1Ptr->x) && (p2Ptr->y == p1Ptr->y)) {
+           /*
+            * Ignore duplicate points (they'd cause core dumps in
+            * ShiftLine calls below).
+            */
+           continue;
+       }
+       ShiftLine(p1Ptr, p2Ptr, borderWidth, &newB1);
+       newB2.x = newB1.x + (p2Ptr->x - p1Ptr->x);
+       newB2.y = newB1.y + (p2Ptr->y - p1Ptr->y);
+       poly[3] = *p1Ptr;
+       parallel = 0;
+       if (pointsSeen >= 1) {
+           parallel = Intersect(&newB1, &newB2, &b1, &b2, &poly[2]);
+
+           /*
+            * If two consecutive segments of the polygon are parallel,
+            * then things get more complex.  Consider the following
+            * diagram:
+            *
+            * poly[1]
+            *    *----b1-----------b2------a
+            *                                \
+            *                                  \
+            *         *---------*----------*    b
+            *        poly[0]  *p2Ptr   *p1Ptr  /
+            *                                /
+            *              --*--------*----c
+            *              newB1    newB2
+            *
+            * Instead of using x and *p1Ptr for poly[2] and poly[3], as
+            * in the original diagram, use a and b as above.  Then instead
+            * of using x and *p1Ptr for the new poly[0] and poly[1], use
+            * b and c as above.
+            *
+            * Do the computation in three stages:
+            * 1. Compute a point "perp" such that the line p1Ptr-perp
+            *    is perpendicular to p1Ptr-p2Ptr.
+            * 2. Compute the points a and c by intersecting the lines
+            *    b1-b2 and newB1-newB2 with p1Ptr-perp.
+            * 3. Compute b by shifting p1Ptr-perp to the right and
+            *    intersecting it with p1Ptr-p2Ptr.
+            */
+
+           if (parallel) {
+               perp.x = p1Ptr->x + (p2Ptr->y - p1Ptr->y);
+               perp.y = p1Ptr->y - (p2Ptr->x - p1Ptr->x);
+               (void) Intersect(p1Ptr, &perp, &b1, &b2, &poly[2]);
+               (void) Intersect(p1Ptr, &perp, &newB1, &newB2, &c);
+               ShiftLine(p1Ptr, &perp, borderWidth, &shift1);
+               shift2.x = shift1.x + (perp.x - p1Ptr->x);
+               shift2.y = shift1.y + (perp.y - p1Ptr->y);
+               (void) Intersect(p1Ptr, p2Ptr, &shift1, &shift2, &poly[3]);
+           }
+       }
+       if (pointsSeen >= 2) {
+           dx = poly[3].x - poly[0].x;
+           dy = poly[3].y - poly[0].y;
+           if (dx > 0) {
+               lightOnLeft = (dy <= dx);
+           } else {
+               lightOnLeft = (dy < dx);
+           }
+           if (lightOnLeft ^ (leftRelief == TK_RELIEF_RAISED)) {
+               gc = borderPtr->lightGC;
+           } else {
+               gc = borderPtr->darkGC;
+           }
+           XFillPolygon(display, drawable, gc, poly, 4, Convex,
+                   CoordModeOrigin);
+       }
+       b1.x = newB1.x;
+       b1.y = newB1.y;
+       b2.x = newB2.x;
+       b2.y = newB2.y;
+       poly[0].x = poly[3].x;
+       poly[0].y = poly[3].y;
+       if (parallel) {
+           poly[1].x = c.x;
+           poly[1].y = c.y;
+       } else if (pointsSeen >= 1) {
+           poly[1].x = poly[2].x;
+           poly[1].y = poly[2].y;
+       }
+       pointsSeen++;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_Fill3DRectangle --
+ *
+ *     Fill a rectangular area, supplying a 3D border if desired.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information gets drawn on the screen.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_Fill3DRectangle(display, drawable, border, x, y, width,
+       height, borderWidth, relief)
+    Display *display;          /* X display in which to draw rectangle. */
+    Drawable drawable;         /* X window or pixmap in which to draw. */
+    Tk_3DBorder border;                /* Token for border to draw. */
+    int x, y, width, height;   /* Outside area of rectangular region. */
+    int borderWidth;           /* Desired width for border, in
+                                * pixels. Border will be *inside* region. */
+    int relief;                        /* Indicates 3D effect: TK_RELIEF_FLAT,
+                                * TK_RELIEF_RAISED, or TK_RELIEF_SUNKEN. */
+{
+    register Border *borderPtr = (Border *) border;
+
+    XFillRectangle(display, drawable, borderPtr->bgGC,
+           x, y, (unsigned int) width, (unsigned int) height);
+    if (relief != TK_RELIEF_FLAT) {
+       Tk_Draw3DRectangle(display, drawable, border, x, y, width,
+               height, borderWidth, relief);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_Fill3DPolygon --
+ *
+ *     Fill a polygonal area, supplying a 3D border if desired.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information gets drawn on the screen.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_Fill3DPolygon(display, drawable, border, pointPtr, numPoints,
+       borderWidth, leftRelief)
+    Display *display;          /* X display in which to draw polygon. */
+    Drawable drawable;         /* X window or pixmap in which to draw. */
+    Tk_3DBorder border;                /* Token for border to draw. */
+    XPoint *pointPtr;          /* Array of points describing
+                                * polygon.  All points must be
+                                * absolute (CoordModeOrigin). */
+    int numPoints;             /* Number of points at *pointPtr. */
+    int borderWidth;           /* Width of border, measured in
+                                * pixels to the left of the polygon's
+                                * trajectory.   May be negative. */
+    int leftRelief;                    /* Indicates 3D effect of left side of
+                                * trajectory relative to right:
+                                * TK_RELIEF_FLAT, TK_RELIEF_RAISED,
+                                * or TK_RELIEF_SUNKEN. */
+{
+    register Border *borderPtr = (Border *) border;
+
+    XFillPolygon(display, drawable, borderPtr->bgGC,
+           pointPtr, numPoints, Complex, CoordModeOrigin);
+    if (leftRelief != TK_RELIEF_FLAT) {
+       Tk_Draw3DPolygon(display, drawable, border, pointPtr, numPoints,
+               borderWidth, leftRelief);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * BorderInit --
+ *
+ *     Initialize the structures used for border management.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Read the code.
+ *
+ *-------------------------------------------------------------
+ */
+
+static void
+BorderInit()
+{
+    initialized = 1;
+    Tcl_InitHashTable(&borderTable, sizeof(BorderKey)/sizeof(int));
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ShiftLine --
+ *
+ *     Given two points on a line, compute a point on a
+ *     new line that is parallel to the given line and
+ *     a given distance away from it.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ShiftLine(p1Ptr, p2Ptr, distance, p3Ptr)
+    XPoint *p1Ptr;             /* First point on line. */
+    XPoint *p2Ptr;             /* Second point on line. */
+    int distance;              /* New line is to be this many
+                                * units to the left of original
+                                * line, when looking from p1 to
+                                * p2.  May be negative. */
+    XPoint *p3Ptr;             /* Store coords of point on new
+                                * line here. */
+{
+    int dx, dy, dxNeg, dyNeg;
+
+    /*
+     * The table below is used for a quick approximation in
+     * computing the new point.  An index into the table
+     * is 128 times the slope of the original line (the slope
+     * must always be between 0 and 1).  The value of the table
+     * entry is 128 times the amount to displace the new line
+     * in y for each unit of perpendicular distance.  In other
+     * words, the table maps from the tangent of an angle to
+     * the inverse of its cosine.  If the slope of the original
+     * line is greater than 1, then the displacement is done in
+     * x rather than in y.
+     */
+
+    static int shiftTable[129];
+
+    /*
+     * Initialize the table if this is the first time it is
+     * used.
+     */
+
+    if (shiftTable[0] == 0) {
+       int i;
+       double tangent, cosine;
+
+       for (i = 0; i <= 128; i++) {
+           tangent = i/128.0;
+           cosine = 128/cos(atan(tangent)) + .5;
+           shiftTable[i] = cosine;
+       }
+    }
+
+    *p3Ptr = *p1Ptr;
+    dx = p2Ptr->x - p1Ptr->x;
+    dy = p2Ptr->y - p1Ptr->y;
+    if (dy < 0) {
+       dyNeg = 1;
+       dy = -dy;
+    } else {
+       dyNeg = 0;
+    }
+    if (dx < 0) {
+       dxNeg = 1;
+       dx = -dx;
+    } else {
+       dxNeg = 0;
+    }
+    if (dy <= dx) {
+       dy = ((distance * shiftTable[(dy<<7)/dx]) + 64) >> 7;
+       if (!dxNeg) {
+           dy = -dy;
+       }
+       p3Ptr->y += dy;
+    } else {
+       dx = ((distance * shiftTable[(dx<<7)/dy]) + 64) >> 7;
+       if (dyNeg) {
+           dx = -dx;
+       }
+       p3Ptr->x += dx;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Intersect --
+ *
+ *     Find the intersection point between two lines.
+ *
+ * Results:
+ *     Under normal conditions 0 is returned and the point
+ *     at *iPtr is filled in with the intersection between
+ *     the two lines.  If the two lines are parallel, then
+ *     -1 is returned and *iPtr isn't modified.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+Intersect(a1Ptr, a2Ptr, b1Ptr, b2Ptr, iPtr)
+    XPoint *a1Ptr;             /* First point of first line. */
+    XPoint *a2Ptr;             /* Second point of first line. */
+    XPoint *b1Ptr;             /* First point of second line. */
+    XPoint *b2Ptr;             /* Second point of second line. */
+    XPoint *iPtr;              /* Filled in with intersection point. */
+{
+    int dxadyb, dxbdya, dxadxb, dyadyb, p, q;
+
+    /*
+     * The code below is just a straightforward manipulation of two
+     * equations of the form y = (x-x1)*(y2-y1)/(x2-x1) + y1 to solve
+     * for the x-coordinate of intersection, then the y-coordinate.
+     */
+
+    dxadyb = (a2Ptr->x - a1Ptr->x)*(b2Ptr->y - b1Ptr->y);
+    dxbdya = (b2Ptr->x - b1Ptr->x)*(a2Ptr->y - a1Ptr->y);
+    dxadxb = (a2Ptr->x - a1Ptr->x)*(b2Ptr->x - b1Ptr->x);
+    dyadyb = (a2Ptr->y - a1Ptr->y)*(b2Ptr->y - b1Ptr->y);
+
+    if (dxadyb == dxbdya) {
+       return -1;
+    }
+    p = (a1Ptr->x*dxbdya - b1Ptr->x*dxadyb + (b1Ptr->y - a1Ptr->y)*dxadxb);
+    q = dxbdya - dxadyb;
+    if (q < 0) {
+       p = -p;
+       q = -q;
+    }
+    if (p < 0) {
+       iPtr->x = - ((-p + q/2)/q);
+    } else {
+       iPtr->x = (p + q/2)/q;
+    }
+    p = (a1Ptr->y*dxadyb - b1Ptr->y*dxbdya + (b1Ptr->x - a1Ptr->x)*dyadyb);
+    q = dxadyb - dxbdya;
+    if (q < 0) {
+       p = -p;
+       q = -q;
+    }
+    if (p < 0) {
+       iPtr->y = - ((-p + q/2)/q);
+    } else {
+       iPtr->y = (p + q/2)/q;
+    }
+    return 0;
+}
diff --git a/src/tk/tkargv.c b/src/tk/tkargv.c
new file mode 100644 (file)
index 0000000..27725e7
--- /dev/null
@@ -0,0 +1,432 @@
+/*
+ * tkArgv.c --
+ *
+ *     This file contains a procedure that handles table-based
+ *     argv-argc parsing.
+ *
+ * Copyright 1990 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkArgv.c,v 1.12 92/08/07 08:39:48 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tk.h"
+
+/*
+ * Default table of argument descriptors.  These are normally available
+ * in every application.
+ */
+
+static Tk_ArgvInfo defaultTable[] = {
+    {"-help",  TK_ARGV_HELP,   (char *) NULL,  (char *) NULL,
+       "Print summary of command-line options and abort"},
+    {NULL,     TK_ARGV_END,    (char *) NULL,  (char *) NULL,
+       (char *) NULL}
+};
+
+/*
+ * Forward declarations for procedures defined in this file:
+ */
+
+static void    PrintUsage _ANSI_ARGS_((Tcl_Interp *interp,
+                   Tk_ArgvInfo *argTable, int flags));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_ParseArgv --
+ *
+ *     Process an argv array according to a table of expected
+ *     command-line options.  See the manual page for more details.
+ *
+ * Results:
+ *     The return value is a standard Tcl return value.  If an
+ *     error occurs then an error message is left in interp->result.
+ *     Under normal conditions, both *argcPtr and *argv are modified
+ *     to return the arguments that couldn't be processed here (they
+ *     didn't match the option table, or followed an TK_ARGV_REST
+ *     argument).
+ *
+ * Side effects:
+ *     Variables may be modified, resources may be entered for tkwin,
+ *     or procedures may be called.  It all depends on the arguments
+ *     and their entries in argTable.  See the user documentation
+ *     for details.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tk_ParseArgv(interp, tkwin, argcPtr, argv, argTable, flags)
+    Tcl_Interp *interp;                /* Place to store error message. */
+    Tk_Window tkwin;           /* Window to use for setting Tk options.
+                                * NULL means ignore Tk option specs. */
+    int *argcPtr;              /* Number of arguments in argv.  Modified
+                                * to hold # args left in argv at end. */
+    char **argv;               /* Array of arguments.  Modified to hold
+                                * those that couldn't be processed here. */
+    Tk_ArgvInfo *argTable;     /* Array of option descriptions */
+    int flags;                 /* Or'ed combination of various flag bits,
+                                * such as TK_ARGV_NO_DEFAULTS. */
+{
+    register Tk_ArgvInfo *infoPtr;
+                               /* Pointer to the current entry in the
+                                * table of argument descriptions. */
+    Tk_ArgvInfo *matchPtr;     /* Descriptor that matches current argument. */
+    char *curArg;              /* Current argument */
+    register char c;           /* Second character of current arg (used for
+                                * quick check for matching;  use 2nd char.
+                                * because first char. will almost always
+                                * be '-'). */
+    int srcIndex;              /* Location from which to read next argument
+                                * from argv. */
+    int dstIndex;              /* Index into argv to which next unused
+                                * argument should be copied (never greater
+                                * than srcIndex). */
+    int argc;                  /* # arguments in argv still to process. */
+    int length;                        /* Number of characters in current argument. */
+    int i;
+
+    if (flags & TK_ARGV_DONT_SKIP_FIRST_ARG) {
+       srcIndex = dstIndex = 0;
+       argc = *argcPtr;
+    } else {
+       srcIndex = dstIndex = 1;
+       argc = *argcPtr-1;
+    }
+
+    while (argc > 0) {
+       curArg = argv[srcIndex];
+       srcIndex++;
+       argc--;
+       c = curArg[1];
+       length = strlen(curArg);
+
+       /*
+        * Loop throught the argument descriptors searching for one with
+        * the matching key string.  If found, leave a pointer to it in
+        * matchPtr.
+        */
+
+       matchPtr = NULL;
+       for (i = 0; i < 2; i++) {
+           if (i == 0) {
+               infoPtr = argTable;
+           } else {
+               infoPtr = defaultTable;
+           }
+           for (; infoPtr->type != TK_ARGV_END; infoPtr++) {
+                if (infoPtr->key == NULL) {
+                    continue;
+                }
+                if ((infoPtr->key[1] != c)
+                        || (strncmp(infoPtr->key, curArg, length) != 0)) {
+                    continue;
+                }
+                if ((tkwin == NULL)
+                        && ((infoPtr->type == TK_ARGV_CONST_OPTION)
+                        || (infoPtr->type == TK_ARGV_OPTION_VALUE)
+                        || (infoPtr->type == TK_ARGV_OPTION_NAME_VALUE))) {
+                    continue;
+                }
+                if (infoPtr->key[length] == 0) {
+                    matchPtr = infoPtr;
+                    goto gotMatch;
+                }
+                if (flags & TK_ARGV_NO_ABBREV) {
+                    continue;
+                }
+                if (matchPtr != NULL) {
+                    Tcl_AppendResult(interp, "ambiguous option \"", curArg,
+                            "\"", (char *) NULL);
+                    return TCL_ERROR;
+                }
+                matchPtr = infoPtr;
+           }
+       }
+       if (matchPtr == NULL) {
+
+           /*
+            * Unrecognized argument.  Just copy it down, unless the caller
+            * prefers an error to be registered.
+            */
+
+           if (flags & TK_ARGV_NO_LEFTOVERS) {
+               Tcl_AppendResult(interp, "unrecognized argument \"",
+                       curArg, "\"", (char *) NULL);
+               return TCL_ERROR;
+           }
+           argv[dstIndex] = curArg;
+           dstIndex++;
+           continue;
+       }
+
+       /*
+        * Take the appropriate action based on the option type
+        */
+
+       gotMatch:
+       infoPtr = matchPtr;
+       switch (infoPtr->type) {
+           case TK_ARGV_CONSTANT:
+               *((int *) infoPtr->dst) = (int) infoPtr->src;
+               break;
+           case TK_ARGV_INT:
+               if (argc == 0) {
+                   goto missingArg;
+               } else {
+                   char *endPtr;
+
+                   *((int *) infoPtr->dst) =
+                           strtol(argv[srcIndex], &endPtr, 0);
+                   if ((endPtr == argv[srcIndex]) || (*endPtr != 0)) {
+                       Tcl_AppendResult(interp, "expected integer argument ",
+                               "for \"", infoPtr->key, "\" but got \"",
+                               argv[srcIndex], "\"", (char *) NULL);
+                       return TCL_ERROR;
+                   }
+                   srcIndex++;
+                   argc--;
+               }
+               break;
+           case TK_ARGV_STRING:
+               if (argc == 0) {
+                   goto missingArg;
+               } else {
+                   *((char **)infoPtr->dst) = argv[srcIndex];
+                   srcIndex++;
+                   argc--;
+               }
+               break;
+           case TK_ARGV_UID:
+               if (argc == 0) {
+                   goto missingArg;
+               } else {
+                   *((Tk_Uid *)infoPtr->dst) = Tk_GetUid(argv[srcIndex]);
+                   srcIndex++;
+                   argc--;
+               }
+               break;
+           case TK_ARGV_REST:
+               *((int *) infoPtr->dst) = dstIndex;
+               goto argsDone;
+           case TK_ARGV_FLOAT:
+               if (argc == 0) {
+                   goto missingArg;
+               } else {
+                   char *endPtr;
+
+                   *((double *) infoPtr->dst) =
+                           strtod(argv[srcIndex], &endPtr);
+                   if ((endPtr == argv[srcIndex]) || (*endPtr != 0)) {
+                       Tcl_AppendResult(interp, "expected floating-point ",
+                               "argument for \"", infoPtr->key,
+                               "\" but got \"", argv[srcIndex], "\"",
+                               (char *) NULL);
+                       return TCL_ERROR;
+                   }
+                   srcIndex++;
+                   argc--;
+               }
+               break;
+           case TK_ARGV_FUNC: {
+               int (*handlerProc)();
+
+               handlerProc = (int (*)())infoPtr->src;
+               
+               if ((*handlerProc)(infoPtr->dst, infoPtr->key,
+                       argv[srcIndex])) {
+                   srcIndex += 1;
+                   argc -= 1;
+               }
+               break;
+           }
+           case TK_ARGV_GENFUNC: {
+               int         (*handlerProc)();
+
+               handlerProc = (int (*)())infoPtr->src;
+
+               argc = (*handlerProc)(infoPtr->dst, interp, infoPtr->key,
+                       argc, argv+srcIndex);
+               if (argc < 0) {
+                   return TCL_ERROR;
+               }
+               break;
+           }
+           case TK_ARGV_HELP:
+               PrintUsage (interp, argTable, flags);
+               return TCL_ERROR;
+           case TK_ARGV_CONST_OPTION:
+               Tk_AddOption(tkwin, infoPtr->dst, infoPtr->src,
+                       TK_INTERACTIVE_PRIO);
+               break;
+           case TK_ARGV_OPTION_VALUE:
+               if (argc < 1) {
+                   goto missingArg;
+               }
+               Tk_AddOption(tkwin, infoPtr->dst, argv[srcIndex],
+                       TK_INTERACTIVE_PRIO);
+               srcIndex++;
+               argc--;
+               break;
+           case TK_ARGV_OPTION_NAME_VALUE:
+               if (argc < 2) {
+                   Tcl_AppendResult(interp, "\"", curArg,
+                           "\" option requires two following arguments",
+                           (char *) NULL);
+                   return TCL_ERROR;
+               }
+               Tk_AddOption(tkwin, argv[srcIndex], argv[srcIndex+1],
+                       TK_INTERACTIVE_PRIO);
+               srcIndex += 2;
+               argc -= 2;
+               break;
+           default:
+               sprintf(interp->result, "bad argument type %d in Tk_ArgvInfo",
+                       infoPtr->type);
+               return TCL_ERROR;
+       }
+    }
+
+    /*
+     * If we broke out of the loop because of an OPT_REST argument,
+     * copy the remaining arguments down.
+     */
+
+    argsDone:
+    while (argc) {
+       argv[dstIndex] = argv[srcIndex];
+       srcIndex++;
+       dstIndex++;
+       argc--;
+    }
+    argv[dstIndex] = (char *) NULL;
+    *argcPtr = dstIndex;
+    return TCL_OK;
+
+    missingArg:
+    Tcl_AppendResult(interp, "\"", curArg,
+           "\" option requires an additional argument", (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * PrintUsage --
+ *
+ *     Generate a help string describing command-line options.
+ *
+ * Results:
+ *     Interp->result will be modified to hold a help string
+ *     describing all the options in argTable, plus all those
+ *     in the default table unless TK_ARGV_NO_DEFAULTS is
+ *     specified in flags.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+PrintUsage(interp, argTable, flags)
+    Tcl_Interp *interp;                /* Place information in this interp's
+                                * result area. */
+    Tk_ArgvInfo *argTable;     /* Array of command-specific argument
+                                * descriptions. */
+    int flags;                 /* If the TK_ARGV_NO_DEFAULTS bit is set
+                                * in this word, then don't generate
+                                * information for default options. */
+{
+    register Tk_ArgvInfo *infoPtr;
+    int width, i, numSpaces;
+#define NUM_SPACES 20
+    static char spaces[] = "                    ";
+    char tmp[30];
+
+    /*
+     * First, compute the width of the widest option key, so that we
+     * can make everything line up.
+     */
+
+    width = 4;
+    for (i = 0; i < 2; i++) {
+       for (infoPtr = i ? defaultTable : argTable;
+               infoPtr->type != TK_ARGV_END; infoPtr++) {
+           int length;
+           if (infoPtr->key == NULL) {
+               continue;
+           }
+           length = strlen(infoPtr->key);
+           if (length > width) {
+               width = length;
+           }
+       }
+    }
+
+    Tcl_AppendResult(interp, "Command-specific options:", (char *) NULL);
+    for (i = 0; ; i++) {
+       for (infoPtr = i ? defaultTable : argTable;
+               infoPtr->type != TK_ARGV_END; infoPtr++) {
+           if ((infoPtr->type == TK_ARGV_HELP) && (infoPtr->key == NULL)) {
+               Tcl_AppendResult(interp, "\n", infoPtr->help, (char *) NULL);
+               continue;
+           }
+           Tcl_AppendResult(interp, "\n ", infoPtr->key, ":", (char *) NULL);
+           numSpaces = width + 1 - strlen(infoPtr->key);
+           while (numSpaces > 0) {
+               if (numSpaces >= NUM_SPACES) {
+                   Tcl_AppendResult(interp, spaces, (char *) NULL);
+               } else {
+                   Tcl_AppendResult(interp, spaces+NUM_SPACES-numSpaces,
+                           (char *) NULL);
+               }
+               numSpaces -= NUM_SPACES;
+           }
+           Tcl_AppendResult(interp, infoPtr->help, (char *) NULL);
+           switch (infoPtr->type) {
+               case TK_ARGV_INT: {
+                   sprintf(tmp, "%d", *((int *) infoPtr->dst));
+                   Tcl_AppendResult(interp, "\n\t\tDefault value: ",
+                           tmp, (char *) NULL);
+                   break;
+               }
+               case TK_ARGV_FLOAT: {
+                   sprintf(tmp, "%lg", *((double *) infoPtr->dst));
+                   Tcl_AppendResult(interp, "\n\t\tDefault value: ",
+                           tmp, (char *) NULL);
+                   break;
+               }
+               case TK_ARGV_STRING: {
+                   char *string;
+
+                   string = *((char **) infoPtr->dst);
+                   if (string != NULL) {
+                       Tcl_AppendResult(interp, "\n\t\tDefault value: \"",
+                               string, "\"", (char *) NULL);
+                   }
+                   break;
+               }
+               default: {
+                   break;
+               }
+           }
+       }
+
+       if ((flags & TK_ARGV_NO_DEFAULTS) || (i > 0)) {
+           break;
+       }
+       Tcl_AppendResult(interp, "\nGeneric options for all commands:",
+               (char *) NULL);
+    }
+}
diff --git a/src/tk/tkatom.c b/src/tk/tkatom.c
new file mode 100644 (file)
index 0000000..d62fedd
--- /dev/null
@@ -0,0 +1,165 @@
+/* 
+ * tkAtom.c --
+ *
+ *     This file manages a cache of X Atoms in order to avoid
+ *     interactions with the X server.  It's much like the Xmu
+ *     routines, except it has a cleaner interface (caller
+ *     doesn't have to provide permanent storage for atom names,
+ *     for example).
+ *
+ * Copyright 1990 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkAtom.c,v 1.6 92/05/07 09:51:06 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tkint.h"
+
+/*
+ * Forward references to procedures defined in this file:
+ */
+
+static void    AtomInit _ANSI_ARGS_((TkDisplay *dispPtr));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_InternAtom --
+ *
+ *     Given a string, produce the equivalent X atom.  This
+ *     procedure is equivalent to XInternAtom, except that it
+ *     keeps a local cache of atoms.  Once a name is known,
+ *     the server need not be contacted again for that name.
+ *
+ * Results:
+ *     The return value is the Atom corresponding to name.
+ *
+ * Side effects:
+ *     A new entry may be added to the local atom cache.
+ *
+ *--------------------------------------------------------------
+ */
+
+Atom
+Tk_InternAtom(tkwin, name)
+    Tk_Window tkwin;           /* Window token;  map name to atom
+                                * for this window's display. */
+    char *name;                        /* Name to turn into atom. */
+{
+    register TkDisplay *dispPtr;
+    register Tcl_HashEntry *hPtr;
+    int new;
+
+    dispPtr = ((TkWindow *) tkwin)->dispPtr;
+    if (!dispPtr->atomInit) {
+       AtomInit(dispPtr);
+    }
+
+    hPtr = Tcl_CreateHashEntry(&dispPtr->nameTable, name, &new);
+    if (new) {
+       Tcl_HashEntry *hPtr2;
+       Atom atom;
+
+       atom = XInternAtom(dispPtr->display, name, False);
+       Tcl_SetHashValue(hPtr, atom);
+       hPtr2 = Tcl_CreateHashEntry(&dispPtr->atomTable, (char *) atom,
+               &new);
+       Tcl_SetHashValue(hPtr2, Tcl_GetHashKey(&dispPtr->nameTable, hPtr));
+    }
+    return (Atom) Tcl_GetHashValue(hPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_GetAtomName --
+ *
+ *     This procedure is equivalent to XGetAtomName except that
+ *     it uses the local atom cache to avoid contacting the
+ *     server.
+ *
+ * Results:
+ *     The return value is a character string corresponding to
+ *     the atom given by "atom".  This string's storage space
+ *     is static:  it need not be freed by the caller, and should
+ *     not be modified by the caller.  If "atom" doesn't exist
+ *     on tkwin's display, then the string "?bad atom?" is returned.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+char *
+Tk_GetAtomName(tkwin, atom)
+    Tk_Window tkwin;           /* Window token;  map atom to name
+                                * relative to this window's
+                                * display. */
+    Atom atom;                 /* Atom whose name is wanted. */
+{
+    register TkDisplay *dispPtr;
+    register Tcl_HashEntry *hPtr;
+
+    dispPtr = ((TkWindow *) tkwin)->dispPtr;
+    if (!dispPtr->atomInit) {
+       AtomInit(dispPtr);
+    }
+
+    hPtr = Tcl_FindHashEntry(&dispPtr->atomTable, (char *) atom);
+    if (hPtr == NULL) {
+       char *name;
+       Tk_ErrorHandler handler;
+       int new;
+
+       handler= Tk_CreateErrorHandler(dispPtr->display, BadAtom,
+               -1, -1, (int (*)()) NULL, (ClientData) NULL);
+       name = XGetAtomName(dispPtr->display, atom);
+       if (name == NULL) {
+           name = "?bad atom?";
+       }
+       Tk_DeleteErrorHandler(handler);
+       hPtr = Tcl_CreateHashEntry(&dispPtr->nameTable, (char *) name,
+               &new);
+       Tcl_SetHashValue(hPtr, atom);
+       name = Tcl_GetHashKey(&dispPtr->nameTable, hPtr);
+       hPtr = Tcl_CreateHashEntry(&dispPtr->atomTable, (char *) atom,
+               &new);
+       Tcl_SetHashValue(hPtr, name);
+    }
+    return (char *) Tcl_GetHashValue(hPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * AtomInit --
+ *
+ *     Initialize atom-related information for a display.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Tables get initialized, etc. etc..
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+AtomInit(dispPtr)
+    register TkDisplay *dispPtr;       /* Display to initialize. */
+{
+    dispPtr->atomInit = 1;
+    Tcl_InitHashTable(&dispPtr->nameTable, TCL_STRING_KEYS);
+    Tcl_InitHashTable(&dispPtr->atomTable, TCL_ONE_WORD_KEYS);
+}
diff --git a/src/tk/tkbind.c b/src/tk/tkbind.c
new file mode 100644 (file)
index 0000000..1aa2614
--- /dev/null
@@ -0,0 +1,2172 @@
+/* 
+ * tkBind.c --
+ *
+ *     This file provides procedures that associate Tcl commands
+ *     with X events or sequences of X events.
+ *
+ * Copyright 1989-1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkBind.c,v 1.48 92/08/10 16:55:24 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tkconfig.h"
+#include "tkint.h"
+
+/*
+ * The structure below represents a binding table.  A binding table
+ * represents a domain in which event bindings may occur.  It includes
+ * a space of objects relative to which events occur (usually windows,
+ * but not always), a history of recent events in the domain, and
+ * a set of mappings that associate particular Tcl commands with sequences
+ * of events in the domain.  Multiple binding tables may exist at once,
+ * either because there are multiple applications open, or because there
+ * are multiple domains within an application with separate event
+ * bindings for each (for example, each canvas widget has a separate
+ * binding table for associating events with the items in the canvas).
+ */
+
+#define EVENT_BUFFER_SIZE 10
+typedef struct BindingTable {
+    XEvent eventRing[EVENT_BUFFER_SIZE];/* Circular queue of recent events
+                                        * (higher indices are for more recent
+                                        * events). */
+    int detailRing[EVENT_BUFFER_SIZE]; /* "Detail" information (keySym or
+                                        * button or 0) for each entry in
+                                        * eventRing. */
+    int curEvent;                      /* Index in eventRing of most recent
+                                        * event.  Newer events have higher
+                                        * indices. */
+    Tcl_HashTable patternTable;                /* Used to map from an event to a list
+                                        * of patterns that may match that
+                                        * event.  Keys are PatternTableKey
+                                        * structs, values are (PatSeq *). */
+    Tcl_HashTable objectTable;         /* Used to map from an object to a list
+                                        * of patterns associated with that
+                                        * object.  Keys are ClientData,
+                                        * values are (PatSeq *). */
+    Tcl_Interp *interp;                        /* Interpreter in which commands are
+                                        * executed. */
+} BindingTable;
+
+/*
+ * Structures of the following form are used as keys in the patternTable
+ * for a binding table:
+ */
+
+typedef struct PatternTableKey {
+    ClientData object;         /* Identifies object (or class of objects)
+                                * relative to which event occurred.  For
+                                * example, in the widget binding table for
+                                * an application this is the path name of
+                                * a widget, or a widget class, or "all". */
+    int type;                  /* Type of event (from X). */
+    int detail;                        /* Additional information, such as
+                                * keysym or button, or 0 if nothing
+                                * additional.*/
+} PatternTableKey;
+
+/*
+ * The following structure defines a pattern, which is matched
+ * against X events as part of the process of converting X events
+ * into Tcl commands.
+ */
+
+typedef struct Pattern {
+    int eventType;             /* Type of X event, e.g. ButtonPress. */
+    int needMods;              /* Mask of modifiers that must be
+                                * present (0 means no modifiers are
+                                * required). */
+    int hateMods;              /* Mask of modifiers that must not be
+                                * present (0 means any modifiers are
+                                * OK). */
+    int detail;                        /* Additional information that must
+                                * match event.  Normally this is 0,
+                                * meaning no additional information
+                                * must match.  For KeyPress and
+                                * KeyRelease events, a keySym may
+                                * be specified to select a
+                                * particular keystroke (0 means any
+                                * keystrokes).  For button events,
+                                * specifies a particular button (0
+                                * means any buttons are OK). */
+} Pattern;
+
+/*
+ * The structure below defines a pattern sequence, which consists
+ * of one or more patterns.  In order to trigger, a pattern
+ * sequence must match the most recent X events (first pattern
+ * to most recent event, next pattern to next event, and so on).
+ */
+
+typedef struct PatSeq {
+    int numPats;               /* Number of patterns in sequence
+                                * (usually 1). */
+    char *command;             /* Command to invoke when this
+                                * pattern sequence matches (malloc-ed). */
+    int flags;                 /* Miscellaneous flag values;  see
+                                * below for definitions. */
+    struct PatSeq *nextSeqPtr;
+                               /* Next in list of all pattern
+                                * sequences that have the same
+                                * initial pattern.  NULL means
+                                * end of list. */
+    Tcl_HashEntry *hPtr;       /* Pointer to hash table entry for
+                                * the initial pattern.  This is the
+                                * head of the list of which nextSeqPtr
+                                * forms a part. */
+    ClientData object;         /* Identifies object with which event is
+                                * associated (e.g. window). */
+    struct PatSeq *nextObjPtr;
+                               /* Next in list of all pattern
+                                * sequences for the same object
+                                * (NULL for end of list).  Needed to
+                                * implement Tk_DeleteAllBindings. */
+    Pattern pats[1];           /* Array of "numPats" patterns.  Only
+                                * one element is declared here but
+                                * in actuality enough space will be
+                                * allocated for "numPats" patterns.
+                                * To match, pats[0] must match event
+                                * n, pats[1] must match event n-1,
+                                * etc. */
+} PatSeq;
+
+/*
+ * Flag values for PatSeq structures:
+ *
+ * PAT_NEARBY          1 means that all of the events matching
+ *                     this sequence must occur with nearby X
+ *                     and Y mouse coordinates and close in time.
+ *                     This is typically used to restrict multiple
+ *                     button presses.
+ * PAT_PERCENTS                1 means that the command for this pattern
+ *                     requires percent substitution.  0 means there
+ *                     are no percents in the command.
+ */
+
+#define PAT_NEARBY             1
+#define PAT_PERCENTS           2
+
+/*
+ * Constants that define how close together two events must be
+ * in milliseconds or pixels to meet the PAT_NEARBY constraint:
+ */
+
+#define NEARBY_PIXELS          5
+#define NEARBY_MS              500
+
+/*
+ * The data structure and hash table below are used to map from
+ * textual keysym names to keysym numbers.  This structure is
+ * present here because the corresponding X procedures are
+ * ridiculously slow.
+ */
+
+typedef struct {
+    char *name;                                /* Name of keysym. */
+    KeySym value;                      /* Numeric identifier for keysym. */
+} KeySymInfo;
+KeySymInfo keyArray[] = {
+#ifndef lint
+#include "ks_names.h"
+#endif
+    (char *) NULL, 0
+};
+static Tcl_HashTable keySymTable;      /* Hashed form of above structure. */
+
+static int initialized = 0;
+
+/*
+ * A hash table is kept to map from the string names of event
+ * modifiers to information about those modifiers.  The structure
+ * for storing this information, and the hash table built at
+ * initialization time, are defined below.
+ */
+
+typedef struct {
+    char *name;                        /* Name of modifier. */
+    int mask;                  /* Button/modifier mask value,                                                   * such as Button1Mask. */
+    int flags;                 /* Various flags;  see below for
+                                * definitions. */
+} ModInfo;
+
+/*
+ * Flags for ModInfo structures:
+ *
+ * DOUBLE -            Non-zero means duplicate this event,
+ *                     e.g. for double-clicks.
+ * TRIPLE -            Non-zero means triplicate this event,
+ *                     e.g. for triple-clicks.
+ * ANY -               Non-zero means that this event allows
+ *                     any unspecified modifiers.
+ */
+
+#define DOUBLE         1
+#define TRIPLE         2
+#define ANY            4
+
+static ModInfo modArray[] = {
+    "Control",         ControlMask,    0,
+    "Shift",           ShiftMask,      0,
+    "Lock",            LockMask,       0,
+    "B1",              Button1Mask,    0,
+    "Button1",         Button1Mask,    0,
+    "B2",              Button2Mask,    0,
+    "Button2",         Button2Mask,    0,
+    "B3",              Button3Mask,    0,
+    "Button3",         Button3Mask,    0,
+    "B4",              Button4Mask,    0,
+    "Button4",         Button4Mask,    0,
+    "B5",              Button5Mask,    0,
+    "Button5",         Button5Mask,    0,
+    "Mod1",            Mod1Mask,       0,
+    "M1",              Mod1Mask,       0,
+    "Meta",            Mod1Mask,       0,
+    "M",               Mod1Mask,       0,
+    "Mod2",            Mod2Mask,       0,
+    "M2",              Mod2Mask,       0,
+    "Alt",             Mod2Mask,       0,
+    "Mod3",            Mod3Mask,       0,
+    "M3",              Mod3Mask,       0,
+    "Mod4",            Mod4Mask,       0,
+    "M4",              Mod4Mask,       0,
+    "Mod5",            Mod5Mask,       0,
+    "M5",              Mod5Mask,       0,
+    "Double",          0,              DOUBLE,
+    "Triple",          0,              TRIPLE,
+    "Any",             0,              ANY,
+    NULL,              0,              0};
+static Tcl_HashTable modTable;
+
+/*
+ * This module also keeps a hash table mapping from event names
+ * to information about those events.  The structure, an array
+ * to use to initialize the hash table, and the hash table are
+ * all defined below.
+ */
+
+typedef struct {
+    char *name;                        /* Name of event. */
+    int type;                  /* Event type for X, such as
+                                * ButtonPress. */
+    int eventMask;             /* Mask bits (for XSelectInput)
+                                * for this event type. */
+} EventInfo;
+
+/*
+ * Note:  some of the masks below are an OR-ed combination of
+ * several masks.  This is necessary because X doesn't report
+ * up events unless you also ask for down events.  Also, X
+ * doesn't report button state in motion events unless you've
+ * asked about button events.
+ */
+
+static EventInfo eventArray[] = {
+    "Motion",          MotionNotify,
+           ButtonPressMask|PointerMotionMask,
+    "Button",          ButtonPress,            ButtonPressMask,
+    "ButtonPress",     ButtonPress,            ButtonPressMask,
+    "ButtonRelease",   ButtonRelease,
+           ButtonPressMask|ButtonReleaseMask,
+    "Colormap",                ColormapNotify,         ColormapChangeMask,
+    "Enter",           EnterNotify,            EnterWindowMask,
+    "Leave",           LeaveNotify,            LeaveWindowMask,
+    "Expose",          Expose,                 ExposureMask,
+    "FocusIn",         FocusIn,                FocusChangeMask,
+    "FocusOut",                FocusOut,               FocusChangeMask,
+    "Keymap",          KeymapNotify,           KeymapStateMask,
+    "Key",             KeyPress,               KeyPressMask,
+    "KeyPress",                KeyPress,               KeyPressMask,
+    "KeyRelease",      KeyRelease,
+           KeyPressMask|KeyReleaseMask,
+    "Property",                PropertyNotify,         PropertyChangeMask,
+    "ResizeRequest",   ResizeRequest,          ResizeRedirectMask,
+    "Circulate",       CirculateNotify,        StructureNotifyMask,
+    "Configure",       ConfigureNotify,        StructureNotifyMask,
+    "Destroy",         DestroyNotify,          StructureNotifyMask,
+    "Gravity",         GravityNotify,          StructureNotifyMask,
+    "Map",             MapNotify,              StructureNotifyMask,
+    "Reparent",                ReparentNotify,         StructureNotifyMask,
+    "Unmap",           UnmapNotify,            StructureNotifyMask,
+    "Visibility",      VisibilityNotify,       VisibilityChangeMask,
+    "CirculateRequest",        CirculateRequest,       SubstructureRedirectMask,
+    "ConfigureRequest",        ConfigureRequest,       SubstructureRedirectMask,
+    "MapRequest",      MapRequest,             SubstructureRedirectMask,
+    (char *) NULL,     0,                      0};
+static Tcl_HashTable eventTable;
+
+/*
+ * The defines and table below are used to classify events into
+ * various groups.  The reason for this is that logically identical
+ * fields (e.g. "state") appear at different places in different
+ * types of events.  The classification masks can be used to figure
+ * out quickly where to extract information from events.
+ */
+
+#define KEY_BUTTON_MOTION      0x1
+#define CROSSING               0x2
+#define FOCUS                  0x4
+#define EXPOSE                 0x8
+#define VISIBILITY             0x10
+#define CREATE                 0x20
+#define MAP                    0x40
+#define REPARENT               0x80
+#define CONFIG                 0x100
+#define CONFIG_REQ             0x200
+#define RESIZE_REQ             0x400
+#define GRAVITY                        0x800
+#define PROP                   0x0100
+#define SEL_CLEAR              0x2000
+#define SEL_REQ                        0x4000
+#define SEL_NOTIFY             0x8000
+#define COLORMAP               0x10000
+#define MAPPING                        0x20000
+
+static int flagArray[LASTEvent] = {
+   /* Not used */              0,
+   /* Not used */              0,
+   /* KeyPress */              KEY_BUTTON_MOTION,
+   /* KeyRelease */            KEY_BUTTON_MOTION,
+   /* ButtonPress */           KEY_BUTTON_MOTION,
+   /* ButtonRelease */         KEY_BUTTON_MOTION,
+   /* MotionNotify */          KEY_BUTTON_MOTION,
+   /* EnterNotify */           CROSSING,
+   /* LeaveNotify */           CROSSING,
+   /* FocusIn */               FOCUS,
+   /* FocusOut */              FOCUS,
+   /* KeymapNotify */          0,
+   /* Expose */                        EXPOSE,
+   /* GraphicsExpose */                EXPOSE,
+   /* NoExpose */              0,
+   /* VisibilityNotify */      VISIBILITY,
+   /* CreateNotify */          CREATE,
+   /* DestroyNotify */         0,
+   /* UnmapNotify */           0,
+   /* MapNotify */             MAP,
+   /* MapRequest */            0,
+   /* ReparentNotify */                REPARENT,
+   /* ConfigureNotify */       CONFIG,
+   /* ConfigureRequest */      CONFIG_REQ,
+   /* GravityNotify */         0,
+   /* ResizeRequest */         RESIZE_REQ,
+   /* CirculateNotify */       0,
+   /* CirculateRequest */      0,
+   /* PropertyNotify */                PROP,
+   /* SelectionClear */                SEL_CLEAR,
+   /* SelectionRequest */      SEL_REQ,
+   /* SelectionNotify */       SEL_NOTIFY,
+   /* ColormapNotify */                COLORMAP,
+   /* ClientMessage */         0,
+   /* MappingNotify */         MAPPING
+};
+
+/*
+ * Forward declarations for procedures defined later in this
+ * file:
+ */
+
+static char *          ExpandPercents _ANSI_ARGS_((char *before,
+                           XEvent *eventPtr, KeySym keySym, char *after,
+                           int afterSize));
+static PatSeq *                FindSequence _ANSI_ARGS_((Tcl_Interp *interp,
+                           BindingTable *bindPtr, ClientData object,
+                           char *eventString, int create,
+                           unsigned long *maskPtr));
+static char *          GetField _ANSI_ARGS_((char *p, char *copy, int size));
+static KeySym          GetKeySym _ANSI_ARGS_((TkDisplay *dispPtr,
+                           XEvent *eventPtr));
+static PatSeq *                MatchPatterns _ANSI_ARGS_((BindingTable *bindPtr,
+                           PatSeq *psPtr));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_CreateBindingTable --
+ *
+ *     Set up a new domain in which event bindings may be created.
+ *
+ * Results:
+ *     The return value is a token for the new table, which must
+ *     be passed to procedures like Tk_CreatBinding.
+ *
+ * Side effects:
+ *     Memory is allocated for the new table.
+ *
+ *--------------------------------------------------------------
+ */
+
+Tk_BindingTable
+Tk_CreateBindingTable(interp)
+    Tcl_Interp *interp;                /* Interpreter to associate with the binding
+                                * table:  commands are executed in this
+                                * interpreter. */
+{
+    register BindingTable *bindPtr;
+    int i;
+
+    /*
+     * If this is the first time a binding table has been created,
+     * initialize the global data structures.
+     */
+
+    if (!initialized) {
+       register KeySymInfo *kPtr;
+       register Tcl_HashEntry *hPtr;
+       register ModInfo *modPtr;
+       register EventInfo *eiPtr;
+       int dummy;
+
+       initialized = 1;
+    
+       Tcl_InitHashTable(&keySymTable, TCL_STRING_KEYS);
+       for (kPtr = keyArray; kPtr->name != NULL; kPtr++) {
+           hPtr = Tcl_CreateHashEntry(&keySymTable, kPtr->name, &dummy);
+           Tcl_SetHashValue(hPtr, kPtr->value);
+       }
+    
+       Tcl_InitHashTable(&modTable, TCL_STRING_KEYS);
+       for (modPtr = modArray; modPtr->name != NULL; modPtr++) {
+           hPtr = Tcl_CreateHashEntry(&modTable, modPtr->name, &dummy);
+           Tcl_SetHashValue(hPtr, modPtr);
+       }
+    
+       Tcl_InitHashTable(&eventTable, TCL_STRING_KEYS);
+       for (eiPtr = eventArray; eiPtr->name != NULL; eiPtr++) {
+           hPtr = Tcl_CreateHashEntry(&eventTable, eiPtr->name, &dummy);
+           Tcl_SetHashValue(hPtr, eiPtr);
+       }
+    }
+
+    /*
+     * Create and initialize a new binding table.
+     */
+
+    bindPtr = (BindingTable *) ckalloc(sizeof(BindingTable));
+    for (i = 0; i < EVENT_BUFFER_SIZE; i++) {
+       bindPtr->eventRing[i].type = -1;
+    }
+    bindPtr->curEvent = 0;
+    Tcl_InitHashTable(&bindPtr->patternTable,
+           sizeof(PatternTableKey)/sizeof(int));
+    Tcl_InitHashTable(&bindPtr->objectTable, TCL_ONE_WORD_KEYS);
+    bindPtr->interp = interp;
+    return (Tk_BindingTable) bindPtr;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_DeleteBindingTable --
+ *
+ *     Destroy a binding table and free up all its memory.
+ *     The caller should not use bindingTable again after
+ *     this procedure returns.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Memory is freed.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_DeleteBindingTable(bindingTable)
+    Tk_BindingTable bindingTable;      /* Token for the binding table to
+                                        * destroy. */
+{
+    BindingTable *bindPtr = (BindingTable *) bindingTable;
+    PatSeq *psPtr, *nextPtr;
+    Tcl_HashEntry *hPtr;
+    Tcl_HashSearch search;
+
+    /*
+     * Find and delete all of the patterns associated with the binding
+     * table.
+     */
+
+    for (hPtr = Tcl_FirstHashEntry(&bindPtr->patternTable, &search);
+           hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
+       for (psPtr = (PatSeq *) Tcl_GetHashValue(hPtr);
+               psPtr != NULL; psPtr = nextPtr) {
+           nextPtr = psPtr->nextSeqPtr;
+           Tk_EventuallyFree((ClientData) psPtr->command,
+                   (Tk_FreeProc *) free);
+           ckfree((char *) psPtr);
+       }
+    }
+
+    /*
+     * Clean up the rest of the information associated with the
+     * binding table.
+     */
+
+    Tcl_DeleteHashTable(&bindPtr->patternTable);
+    Tcl_DeleteHashTable(&bindPtr->objectTable);
+    ckfree((char *) bindPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_CreateBinding --
+ *
+ *     Add a binding to a binding table, so that future calls to
+ *     Tk_BindEvent may execute the command in the binding.
+ *
+ * Results:
+ *     The return value is 0 if an error occurred while setting
+ *     up the binding.  In this case, an error message will be
+ *     left in interp->result.  If all went well then the return
+ *     value is a mask of the event types that must be made
+ *     available to Tk_BindEvent in order to properly detect when
+ *     this binding triggers.  This value can be used to determine
+ *     what events to select for in a window, for example.
+ *
+ * Side effects:
+ *     The new binding may cause future calls to Tk_BindEvent to
+ *     behave differently than they did previously.
+ *
+ *--------------------------------------------------------------
+ */
+
+unsigned long
+Tk_CreateBinding(interp, bindingTable, object, eventString, command, append)
+    Tcl_Interp *interp;                        /* Used for error reporting. */
+    Tk_BindingTable bindingTable;      /* Table in which to create binding. */
+    ClientData object;                 /* Token for object with which binding
+                                        * is associated. */
+    char *eventString;                 /* String describing event sequence
+                                        * that triggers binding. */
+    char *command;                     /* Contains Tcl command to execute
+                                        * when binding triggers. */
+    int append;                                /* 0 means replace any existing
+                                        * binding for eventString;  1 means
+                                        * append to that binding. */
+{
+    BindingTable *bindPtr = (BindingTable *) bindingTable;
+    register PatSeq *psPtr;
+    unsigned long eventMask;
+
+    psPtr = FindSequence(interp, bindPtr, object, eventString, 1, &eventMask);
+    if (psPtr == NULL) {
+       return 0;
+    }
+    if (append && (psPtr->command != NULL)) {
+       int length;
+       char *new;
+
+       length = strlen(psPtr->command) + strlen(command) + 3;
+       new = (char *) ckalloc((unsigned) length);
+       sprintf(new, "%s; %s", psPtr->command, command);
+       Tk_EventuallyFree((ClientData) psPtr->command, (Tk_FreeProc *) free);
+       psPtr->command = new;
+    } else {
+       if (psPtr->command != NULL) {
+           Tk_EventuallyFree((ClientData) psPtr->command,
+                   (Tk_FreeProc *) free);
+       }
+       psPtr->command = (char *) ckalloc((unsigned) (strlen(command) + 1));
+       strcpy(psPtr->command, command);
+    }
+
+    /*
+     * See if the command contains percents and thereby requires
+     * percent substitution.
+     */
+
+    if (strchr(psPtr->command, '%') != NULL) {
+       psPtr->flags |= PAT_PERCENTS;
+    }
+    return eventMask;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_DeleteBinding --
+ *
+ *     Remove an event binding from a binding table.
+ *
+ * Results:
+ *     The result is a standard Tcl return value.  If an error
+ *     occurs then interp->result will contain an error message.
+ *
+ * Side effects:
+ *     The binding given by object and eventString is removed
+ *     from bindingTable.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_DeleteBinding(interp, bindingTable, object, eventString)
+    Tcl_Interp *interp;                        /* Used for error reporting. */
+    Tk_BindingTable bindingTable;      /* Table in which to delete binding. */
+    ClientData object;                 /* Token for object with which binding
+                                        * is associated. */
+    char *eventString;                 /* String describing event sequence
+                                        * that triggers binding. */
+{
+    BindingTable *bindPtr = (BindingTable *) bindingTable;
+    register PatSeq *psPtr, *prevPtr;
+    unsigned long eventMask;
+    Tcl_HashEntry *hPtr;
+
+    psPtr = FindSequence(interp, bindPtr, object, eventString, 0, &eventMask);
+    if (psPtr == NULL) {
+       Tcl_ResetResult(interp);
+       return TCL_OK;
+    }
+
+    /*
+     * Unlink the binding from the list for its object, then from the
+     * list for its pattern.
+     */
+
+    hPtr = Tcl_FindHashEntry(&bindPtr->objectTable, (char *) object);
+    if (hPtr == NULL) {
+       panic("Tk_DeleteBinding couldn't find object table entry");
+    }
+    prevPtr = (PatSeq *) Tcl_GetHashValue(hPtr);
+    if (prevPtr == psPtr) {
+       Tcl_SetHashValue(hPtr, psPtr->nextObjPtr);
+    } else {
+       for ( ; ; prevPtr = prevPtr->nextObjPtr) {
+           if (prevPtr == NULL) {
+               panic("Tk_DeleteBinding couldn't find on object list");
+           }
+           if (prevPtr->nextObjPtr == psPtr) {
+               prevPtr->nextObjPtr = psPtr->nextObjPtr;
+               break;
+           }
+       }
+    }
+    prevPtr = (PatSeq *) Tcl_GetHashValue(psPtr->hPtr);
+    if (prevPtr == psPtr) {
+       if (psPtr->nextSeqPtr == NULL) {
+           Tcl_DeleteHashEntry(psPtr->hPtr);
+       } else {
+           Tcl_SetHashValue(psPtr->hPtr, psPtr->nextSeqPtr);
+       }
+    } else {
+       for ( ; ; prevPtr = prevPtr->nextSeqPtr) {
+           if (prevPtr == NULL) {
+               panic("Tk_DeleteBinding couldn't find on hash chain");
+           }
+           if (prevPtr->nextSeqPtr == psPtr) {
+               prevPtr->nextSeqPtr = psPtr->nextSeqPtr;
+               break;
+           }
+       }
+    }
+    Tk_EventuallyFree((ClientData) psPtr->command, (Tk_FreeProc *) free);
+    ckfree((char *) psPtr);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_GetBinding --
+ *
+ *     Return the command associated with a given event string.
+ *
+ * Results:
+ *     The return value is a pointer to the command string
+ *     associated with eventString for object in the domain
+ *     given by bindingTable.  If there is no binding for
+ *     eventString, or if eventString is improperly formed,
+ *     then NULL is returned and an error message is left in
+ *     interp->result.  The return value is semi-static:  it
+ *     will persist until the binding is changed or deleted.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+char *
+Tk_GetBinding(interp, bindingTable, object, eventString)
+    Tcl_Interp *interp;                        /* Interpreter for error reporting. */
+    Tk_BindingTable bindingTable;      /* Table in which to look for
+                                        * binding. */
+    ClientData object;                 /* Token for object with which binding
+                                        * is associated. */
+    char *eventString;                 /* String describing event sequence
+                                        * that triggers binding. */
+{
+    BindingTable *bindPtr = (BindingTable *) bindingTable;
+    register PatSeq *psPtr;
+    unsigned long eventMask;
+
+    psPtr = FindSequence(interp, bindPtr, object, eventString, 0, &eventMask);
+    if (psPtr == NULL) {
+       return NULL;
+    }
+    return psPtr->command;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_GetAllBindings --
+ *
+ *     Return a list of event strings for all the bindings
+ *     associated with a given object.
+ *
+ * Results:
+ *     There is no return value.  Interp->result is modified to
+ *     hold a Tcl list with one entry for each binding associated
+ *     with object in bindingTable.  Each entry in the list
+ *     contains the event string associated with one binding.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_GetAllBindings(interp, bindingTable, object)
+    Tcl_Interp *interp;                        /* Interpreter for error reporting. */
+    Tk_BindingTable bindingTable;      /* Table in which to look for
+                                        * bindings. */
+    ClientData object;                 /* Token for object. */
+
+{
+    BindingTable *bindPtr = (BindingTable *) bindingTable;
+    register PatSeq *psPtr;
+    register Pattern *patPtr;
+    Tcl_HashEntry *hPtr;
+    char string[200*EVENT_BUFFER_SIZE];
+    register char *p;
+    int patsLeft, needMods;
+    register ModInfo *modPtr;
+
+    hPtr = Tcl_FindHashEntry(&bindPtr->objectTable, (char *) object);
+    if (hPtr == NULL) {
+       return;
+    }
+    for (psPtr = (PatSeq *) Tcl_GetHashValue(hPtr); psPtr != NULL;
+           psPtr = psPtr->nextObjPtr) {
+
+       p = string;
+
+       /*
+        * For each binding, output information about each of the
+        * patterns in its sequence.  The order of the patterns in
+        * the sequence is backwards from the order in which they
+        * must be output.
+        */
+
+       for (patsLeft = psPtr->numPats,
+               patPtr = &psPtr->pats[psPtr->numPats - 1];
+               patsLeft > 0; patsLeft--, patPtr--) {
+
+           /*
+            * Check for simple case of an ASCII character.
+            */
+
+           if ((patPtr->eventType == KeyPress)
+                   && (patPtr->needMods == 0)
+                   && (patPtr->hateMods == ~ShiftMask)
+                   && isascii(patPtr->detail) && isprint(patPtr->detail)
+                   && (patPtr->detail != '<')
+                   && (patPtr->detail != ' ')) {
+
+               *p = patPtr->detail;
+               p++;
+               continue;
+           }
+
+           /*
+            * It's a more general event specification.  First check
+            * for "Double" or "Triple", then "Any", then modifiers,
+            * the event type, then keysym or button detail.
+            */
+
+           *p = '<';
+           p++;
+           if ((patsLeft > 1) && (memcmp((char *) patPtr,
+                   (char *) (patPtr-1), sizeof(Pattern)) == 0)) {
+               patsLeft--;
+               patPtr--;
+               if ((patsLeft > 1) && (memcmp((char *) patPtr,
+                       (char *) (patPtr-1), sizeof(Pattern)) == 0)) {
+                   patsLeft--;
+                   patPtr--;
+                   strcpy(p, "Triple-");
+               } else {
+                   strcpy(p, "Double-");
+               }
+               p += strlen(p);
+           }
+
+           if (patPtr->hateMods == 0) {
+               strcpy(p, "Any-");
+               p += strlen(p);
+           }
+
+           for (needMods = patPtr->needMods, modPtr = modArray;
+                   needMods != 0; modPtr++) {
+               if (modPtr->mask & needMods) {
+                   needMods &= ~modPtr->mask;
+                   strcpy(p, modPtr->name);
+                   p += strlen(p);
+                   *p = '-';
+                   p++;
+               }
+           }
+
+           if ((patPtr->eventType != KeyPress)
+                   || (patPtr->detail == 0)) {
+               register EventInfo *eiPtr;
+
+               for (eiPtr = eventArray; eiPtr->name != NULL; eiPtr++) {
+                   if (eiPtr->type == patPtr->eventType) {
+                       strcpy(p, eiPtr->name);
+                       p += strlen(p);
+                       if (patPtr->detail != 0) {
+                           *p = '-';
+                           p++;
+                       }
+                       break;
+                   }
+               }
+           }
+
+           if (patPtr->detail != 0) {
+               if ((patPtr->eventType == KeyPress)
+                       || (patPtr->eventType == KeyRelease)) {
+                   register KeySymInfo *kPtr;
+
+                   for (kPtr = keyArray; kPtr->name != NULL; kPtr++) {
+                       if (patPtr->detail == (int) kPtr->value) {
+                           sprintf(p, "%.100s",  kPtr->name);
+                           p += strlen(p);
+                           break;
+                       }
+                   }
+               } else {
+                   sprintf(p, "%d", patPtr->detail);
+                   p += strlen(p);
+               }
+           }
+           *p = '>';
+           p++;
+       }
+       *p = 0;
+       if ((p - string) >= sizeof(string)) {
+           panic("Tk_GetAllBindings overflowed buffer");
+       }
+       Tcl_AppendElement(interp, string, 0);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_DeleteAllBindings --
+ *
+ *     Remove all bindings associated with a given object in a
+ *     given binding table.
+ *
+ * Results:
+ *     All bindings associated with object are removed from
+ *     bindingTable.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_DeleteAllBindings(bindingTable, object)
+    Tk_BindingTable bindingTable;      /* Table in which to delete
+                                        * bindings. */
+    ClientData object;                 /* Token for object. */
+{
+    BindingTable *bindPtr = (BindingTable *) bindingTable;
+    register PatSeq *psPtr, *prevPtr;
+    PatSeq *nextPtr;
+    Tcl_HashEntry *hPtr;
+
+    hPtr = Tcl_FindHashEntry(&bindPtr->objectTable, (char *) object);
+    if (hPtr == NULL) {
+       return;
+    }
+    for (psPtr = (PatSeq *) Tcl_GetHashValue(hPtr); psPtr != NULL;
+           psPtr = nextPtr) {
+       nextPtr  = psPtr->nextObjPtr;
+
+       /*
+        * Be sure to remove each binding from its hash chain in the
+        * pattern table.  If this is the last pattern in the chain,
+        * then delete the hash entry too.
+        */
+
+       prevPtr = (PatSeq *) Tcl_GetHashValue(psPtr->hPtr);
+       if (prevPtr == psPtr) {
+           if (psPtr->nextSeqPtr == NULL) {
+               Tcl_DeleteHashEntry(psPtr->hPtr);
+           } else {
+               Tcl_SetHashValue(psPtr->hPtr, psPtr->nextSeqPtr);
+           }
+       } else {
+           for ( ; ; prevPtr = prevPtr->nextSeqPtr) {
+               if (prevPtr == NULL) {
+                   panic("Tk_DeleteAllBindings couldn't find on hash chain");
+               }
+               if (prevPtr->nextSeqPtr == psPtr) {
+                   prevPtr->nextSeqPtr = psPtr->nextSeqPtr;
+                   break;
+               }
+           }
+       }
+       Tk_EventuallyFree((ClientData) psPtr->command, (Tk_FreeProc *) free);
+       ckfree((char *) psPtr);
+    }
+    Tcl_DeleteHashEntry(hPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_BindEvent --
+ *
+ *     This procedure is invoked to process an X event.  The
+ *     event is added to those recorded for the binding table.
+ *     Then each of the objects at *objectPtr is checked in
+ *     order to see if it has a binding that matches the recent
+ *     events.  If so, that binding is invoked and the rest of
+ *     objects are skipped.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Depends on the command associated with the matching
+ *     binding.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_BindEvent(bindingTable, eventPtr, tkwin, numObjects, objectPtr)
+    Tk_BindingTable bindingTable;      /* Table in which to look for
+                                        * bindings. */
+    XEvent *eventPtr;                  /* What actually happened. */
+    Tk_Window tkwin;                   /* Window on display where event
+                                        * occurred (needed in order to
+                                        * locate display information). */
+    int numObjects;                    /* Number of objects at *objectPtr. */
+    ClientData *objectPtr;             /* Array of one or more objects
+                                        * to check for a matching binding. */
+{
+    BindingTable *bindPtr = (BindingTable *) bindingTable;
+    TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr;
+    XEvent *ringPtr;
+    PatSeq *matchPtr;
+    PatternTableKey key;
+    Tcl_HashEntry *hPtr;
+    int detail;
+
+    /*
+     * Add the new event to the ring of saved events for the
+     * binding table.  Consecutive MotionNotify events get combined:
+     * if both the new event and the previous event are MotionNotify,
+     * then put the new event *on top* of the previous event.
+     */
+
+    if ((eventPtr->type != MotionNotify)
+           || (bindPtr->eventRing[bindPtr->curEvent].type != MotionNotify)) {
+       bindPtr->curEvent++;
+       if (bindPtr->curEvent >= EVENT_BUFFER_SIZE) {
+           bindPtr->curEvent = 0;
+       }
+    }
+    ringPtr = &bindPtr->eventRing[bindPtr->curEvent];
+    memcpy((VOID *) ringPtr, (VOID *) eventPtr, sizeof(XEvent));
+    detail = 0;
+    bindPtr->detailRing[bindPtr->curEvent] = 0;
+    if ((ringPtr->type == KeyPress) || (ringPtr->type == KeyRelease)) {
+       detail = (int) GetKeySym(dispPtr, ringPtr);
+       if (detail == NoSymbol) {
+           detail = 0;
+       }
+    } else if ((ringPtr->type == ButtonPress)
+           || (ringPtr->type == ButtonRelease)) {
+       detail = ringPtr->xbutton.button;
+    }
+    bindPtr->detailRing[bindPtr->curEvent] = detail;
+
+    /*
+     * Loop over all the objects, matching the new event against
+     * each in turn.
+     */
+
+    for ( ; numObjects > 0; numObjects--, objectPtr++) {
+
+       /*
+        * Match the new event against those recorded in the
+        * pattern table, saving the longest matching pattern.
+        * For events with details (button and key events) first
+        * look for a binding for the specific key or button.
+        * If none is found, then look for a binding for all
+        * keys or buttons (detail of 0).
+        */
+    
+       matchPtr = NULL;
+       key.object = *objectPtr;
+       key.type = ringPtr->type;
+       key.detail = detail;
+       hPtr = Tcl_FindHashEntry(&bindPtr->patternTable, (char *) &key);
+       if (hPtr != NULL) {
+           matchPtr = MatchPatterns(bindPtr,
+                   (PatSeq *) Tcl_GetHashValue(hPtr));
+       }
+       if ((detail != 0) && (matchPtr == NULL)) {
+           key.detail = 0;
+           hPtr = Tcl_FindHashEntry(&bindPtr->patternTable, (char *) &key);
+           if (hPtr != NULL) {
+               matchPtr = MatchPatterns(bindPtr,
+                       (PatSeq *) Tcl_GetHashValue(hPtr));
+           }
+       }
+    
+       if (matchPtr != NULL) {
+    
+           /*
+            * %-substitution can increase the length of the command.
+            * This code handles three cases:  (a) no substitution;
+            * (b) substitution results in short command (use space
+            * on stack); and (c) substitution results in long
+            * command (malloc it).
+            */
+    
+#define STATIC_SPACE 200
+           char shortSpace[STATIC_SPACE];
+           int result;
+
+           if (matchPtr->flags & PAT_PERCENTS) {
+               char *p;
+               p = ExpandPercents(matchPtr->command, eventPtr,
+                       (KeySym) detail, shortSpace, STATIC_SPACE);
+               result = Tcl_GlobalEval(bindPtr->interp, p);
+               if (p != shortSpace) {
+                   ckfree(p);
+               }
+           } else {
+               /*
+                * The code below is tricky in order allow the binding to
+                * be modified or deleted as part of the command that the
+                * binding invokes.  Must make sure that the actual command
+                * string isn't freed until the command completes, and must
+                * copy the address of this string into a local variable
+                * in case it's modified by the command.
+                */
+
+               char *cmd = matchPtr->command;
+
+               Tk_Preserve((ClientData) cmd);
+               result = Tcl_GlobalEval(bindPtr->interp, cmd);
+               Tk_Release((ClientData) cmd);
+           }
+           if (result != TCL_OK) {
+               Tcl_AddErrorInfo(bindPtr->interp,
+                       "\n    (command bound to event)");
+               TkBindError(bindPtr->interp);
+           }
+           return;
+       }
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * FindSequence --
+ *
+ *     Find the entry in a binding table that corresponds to a
+ *     particular pattern string, and return a pointer to that
+ *     entry.
+ *
+ * Results:
+ *     The return value is normally a pointer to the PatSeq
+ *     in patternTable that corresponds to eventString.  If an error
+ *     was found while parsing eventString, or if "create" is 0 and
+ *     no pattern sequence previously existed, then NULL is returned
+ *     and interp->result contains a message describing the problem.
+ *     If no pattern sequence previously existed for eventString, then
+ *     a new one is created with a NULL command field.  In a successful
+ *     return, *maskPtr is filled in with a mask of the event types
+ *     on which the pattern sequence depends.
+ *
+ * Side effects:
+ *     A new pattern sequence may be created.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static PatSeq *
+FindSequence(interp, bindPtr, object, eventString, create, maskPtr)
+    Tcl_Interp *interp;                /* Interpreter to use for error
+                                * reporting. */
+    BindingTable *bindPtr;     /* Table to use for lookup. */
+    ClientData object;         /* Token for object(s) with which binding
+                                * is associated. */
+    char *eventString;         /* String description of pattern to
+                                * match on.  See user documentation
+                                * for details. */
+    int create;                        /* 0 means don't create the entry if
+                                * it doesn't already exist.   Non-zero
+                                * means create. */
+    unsigned long *maskPtr;    /* *maskPtr is filled in with the event
+                                * types on which this pattern sequence
+                                * depends. */
+
+{
+    Pattern pats[EVENT_BUFFER_SIZE];
+    int numPats;
+    register char *p;
+    register Pattern *patPtr;
+    register PatSeq *psPtr;
+    register Tcl_HashEntry *hPtr;
+#define FIELD_SIZE 20
+    char field[FIELD_SIZE];
+    int flags, any, count, new, sequenceSize;
+    unsigned long eventMask;
+    PatternTableKey key;
+
+    /*
+     *-------------------------------------------------------------
+     * Step 1: parse the pattern string to produce an array
+     * of Patterns.  The array is generated backwards, so
+     * that the lowest-indexed pattern corresponds to the last
+     * event that must occur.
+     *-------------------------------------------------------------
+     */
+
+    p = eventString;
+    flags = 0;
+    eventMask = 0;
+    for (numPats = 0, patPtr = &pats[EVENT_BUFFER_SIZE-1];
+           numPats < EVENT_BUFFER_SIZE;
+           numPats++, patPtr--) {
+       patPtr->eventType = -1;
+       patPtr->needMods = 0;
+       patPtr->hateMods = ~0;
+       patPtr->detail = 0;
+       while (isspace(*p)) {
+           p++;
+       }
+       if (*p == '\0') {
+           break;
+       }
+
+       /*
+        * Handle simple ASCII characters.  Note:  the shift
+        * modifier is ignored in this case (it's really part
+        * of the character, rather than a "modifier").
+        */
+
+       if (*p != '<') {
+           char string[2];
+
+           patPtr->eventType = KeyPress;
+           eventMask |= KeyPressMask;
+           string[0] = *p;
+           string[1] = 0;
+           hPtr = Tcl_FindHashEntry(&keySymTable, string);
+           if (hPtr != NULL) {
+               patPtr->detail = (int) Tcl_GetHashValue(hPtr);
+           } else {
+               if (isprint(*p)) {
+                   patPtr->detail = *p;
+               } else {
+                   sprintf(interp->result,
+                           "bad ASCII character 0x%x", *p);
+                   return NULL;
+               }
+           }
+           patPtr->hateMods = ~ShiftMask;
+           p++;
+           continue;
+       }
+
+       /*
+        * A fancier event description.  Must consist of
+        * 1. open angle bracket.
+        * 2. any number of modifiers, each followed by spaces
+        *    or dashes.
+        * 3. an optional event name.
+        * 4. an option button or keysym name.  Either this or
+        *    item 3 *must* be present;  if both are present
+        *    then they are separated by spaces or dashes.
+        * 5. a close angle bracket.
+        */
+
+       any = 0;
+       count = 1;
+       p++;
+       while (1) {
+           register ModInfo *modPtr;
+           p = GetField(p, field, FIELD_SIZE);
+           hPtr = Tcl_FindHashEntry(&modTable, field);
+           if (hPtr == NULL) {
+               break;
+           }
+           modPtr = (ModInfo *) Tcl_GetHashValue(hPtr);
+           patPtr->needMods |= modPtr->mask;
+           if (modPtr->flags & (DOUBLE|TRIPLE)) {
+               flags |= PAT_NEARBY;
+               if (modPtr->flags & DOUBLE) {
+                   count = 2;
+               } else {
+                   count = 3;
+               }
+           }
+           if (modPtr->flags & ANY) {
+               any = 1;
+           }
+           while ((*p == '-') || isspace(*p)) {
+               p++;
+           }
+       }
+       if (any) {
+           patPtr->hateMods = 0;
+       } else {
+           patPtr->hateMods = ~patPtr->needMods;
+       }
+       hPtr = Tcl_FindHashEntry(&eventTable, field);
+       if (hPtr != NULL) {
+           register EventInfo *eiPtr;
+           eiPtr = (EventInfo *) Tcl_GetHashValue(hPtr);
+           patPtr->eventType = eiPtr->type;
+           eventMask |= eiPtr->eventMask;
+           while ((*p == '-') || isspace(*p)) {
+               p++;
+           }
+           p = GetField(p, field, FIELD_SIZE);
+       }
+       if (*field != '\0') {
+           if ((*field >= '1') && (*field <= '5') && (field[1] == '\0')) {
+               static int masks[] = {~0, ~Button1Mask, ~Button2Mask,
+                       ~Button3Mask, ~Button4Mask, ~Button5Mask};
+
+               if (patPtr->eventType == -1) {
+                   patPtr->eventType = ButtonPress;
+                   eventMask |= ButtonPressMask;
+               } else if ((patPtr->eventType == KeyPress)
+                       || (patPtr->eventType == KeyRelease)) {
+                   goto getKeysym;
+               } else if ((patPtr->eventType != ButtonPress)
+                       && (patPtr->eventType != ButtonRelease)) {
+                   Tcl_AppendResult(interp, "specified button \"", field,
+                           "\" for non-button event", (char *) NULL);
+                   return NULL;
+               }
+               patPtr->detail = (*field - '0');
+
+               /*
+                * Ignore this button as a modifier:  its state is already
+                * fixed.
+                */
+
+               patPtr->needMods &= masks[patPtr->detail];
+               patPtr->hateMods &= masks[patPtr->detail];
+           } else {
+               getKeysym:
+               hPtr = Tcl_FindHashEntry(&keySymTable, (char *) field);
+               if (hPtr == NULL) {
+                   Tcl_AppendResult(interp, "bad event type or keysym \"",
+                           field, "\"", (char *) NULL);
+                   return NULL;
+               }
+               if (patPtr->eventType == -1) {
+                   patPtr->eventType = KeyPress;
+                   eventMask |= KeyPressMask;
+               } else if ((patPtr->eventType != KeyPress)
+                       && (patPtr->eventType != KeyRelease)) {
+                   Tcl_AppendResult(interp, "specified keysym \"", field,
+                           "\" for non-key event", (char *) NULL);
+                   return NULL;
+               }
+               patPtr->detail = (int) Tcl_GetHashValue(hPtr);
+
+               /*
+                * Don't get upset about the shift modifier with keys:
+                * if the key doesn't permit the shift modifier then
+                * that will already be factored in when translating
+                * from keycode to keysym in Tk_BindEvent.  If the keysym
+                * has both a shifted and unshifted form, we want to allow
+                * the shifted form to be specified explicitly, though.
+                */
+
+               patPtr->hateMods &= ~ShiftMask;
+           }
+       } else if (patPtr->eventType == -1) {
+           interp->result = "no event type or button # or keysym";
+           return NULL;
+       }
+       while ((*p == '-') || isspace(*p)) {
+           p++;
+       }
+       if (*p != '>') {
+           interp->result = "missing \">\" in binding";
+           return NULL;
+       }
+       p++;
+
+       /*
+        * Replicate events for DOUBLE and TRIPLE.
+        */
+
+       if ((count > 1) && (numPats < EVENT_BUFFER_SIZE-1)) {
+           patPtr[-1] = patPtr[0];
+           patPtr--;
+           numPats++;
+           if ((count == 3) && (numPats < EVENT_BUFFER_SIZE-1)) {
+               patPtr[-1] = patPtr[0];
+               patPtr--;
+               numPats++;
+           }
+       }
+    }
+
+    /*
+     *-------------------------------------------------------------
+     * Step 2: find the sequence in the binding table if it exists,
+     * and add a new sequence to the table if it doesn't.
+     *-------------------------------------------------------------
+     */
+
+    if (numPats == 0) {
+       interp->result = "no events specified in binding";
+       return NULL;
+    }
+    patPtr = &pats[EVENT_BUFFER_SIZE-numPats];
+    key.object = object;
+    key.type = patPtr->eventType;
+    key.detail = patPtr->detail;
+    hPtr = Tcl_CreateHashEntry(&bindPtr->patternTable, (char *) &key, &new);
+    sequenceSize = numPats*sizeof(Pattern);
+    if (!new) {
+       for (psPtr = (PatSeq *) Tcl_GetHashValue(hPtr); psPtr != NULL;
+               psPtr = psPtr->nextSeqPtr) {
+           if ((numPats == psPtr->numPats)
+                   && ((flags & PAT_NEARBY) == (psPtr->flags & PAT_NEARBY))
+                   && (memcmp((char *) patPtr, (char *) psPtr->pats,
+                   sequenceSize) == 0)) {
+               *maskPtr = eventMask; /*don't forget to pass back the mask*/
+               goto done;
+           }
+       }
+    }
+    if (!create) {
+       if (new) {
+           Tcl_DeleteHashEntry(hPtr);
+       }
+       Tcl_AppendResult(interp, "no binding exists for \"",
+               eventString, "\"", (char *) NULL);
+       return NULL;
+    }
+    psPtr = (PatSeq *) ckalloc((unsigned) (sizeof(PatSeq)
+           + (numPats-1)*sizeof(Pattern)));
+    psPtr->numPats = numPats;
+    psPtr->command = NULL;
+    psPtr->flags = flags;
+    psPtr->nextSeqPtr = (PatSeq *) Tcl_GetHashValue(hPtr);
+    psPtr->hPtr = hPtr;
+    Tcl_SetHashValue(hPtr, psPtr);
+
+    /*
+     * Link the pattern into the list associated with the object.
+     */
+
+    psPtr->object = object;
+    hPtr = Tcl_CreateHashEntry(&bindPtr->objectTable, (char *) object, &new);
+    if (new) {
+       psPtr->nextObjPtr = NULL;
+    } else {
+       psPtr->nextObjPtr = (PatSeq *) Tcl_GetHashValue(hPtr);
+    }
+    Tcl_SetHashValue(hPtr, psPtr);
+
+    memcpy((VOID *) psPtr->pats, (VOID *) patPtr, sequenceSize);
+
+    done:
+    *maskPtr = eventMask;
+    return psPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * GetField --
+ *
+ *     Used to parse pattern descriptions.  Copies up to
+ *     size characters from p to copy, stopping at end of
+ *     string, space, "-", ">", or whenever size is
+ *     exceeded.
+ *
+ * Results:
+ *     The return value is a pointer to the character just
+ *     after the last one copied (usually "-" or space or
+ *     ">", but could be anything if size was exceeded).
+ *     Also places NULL-terminated string (up to size
+ *     character, including NULL), at copy.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static char *
+GetField(p, copy, size)
+    register char *p;          /* Pointer to part of pattern. */
+    register char *copy;       /* Place to copy field. */
+    int size;                  /* Maximum number of characters to
+                                * copy. */
+{
+    while ((*p != '\0') && !isspace(*p) && (*p != '>')
+           && (*p != '-') && (size > 1)) {
+       *copy = *p;
+       p++;
+       copy++;
+       size--;
+    }
+    *copy = '\0';
+    return p;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * GetKeySym --
+ *
+ *     Given an X KeyPress or KeyRelease event, map the
+ *     keycode in the event into a KeySym.
+ *
+ * Results:
+ *     The return value is the KeySym corresponding to
+ *     eventPtr, or NoSymbol if no matching Keysym could be
+ *     found.
+ *
+ * Side effects:
+ *     In the first call for a given display, keycode-to-
+ *     KeySym maps get loaded.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static KeySym
+GetKeySym(dispPtr, eventPtr)
+    register TkDisplay *dispPtr;       /* Display in which to
+                                        * map keycode. */
+    register XEvent *eventPtr;         /* Description of X event. */
+{
+    KeySym *symPtr;
+    KeySym sym;
+
+    /*
+     * Read the key mapping information from the server if
+     * we don't have it already.
+     */
+
+    if (dispPtr->symsPerCode == 0) {
+       Display *dpy = dispPtr->display;
+
+#ifdef IS_LINUX
+       XDisplayKeycodes(dpy, &dispPtr->firstKeycode, &dispPtr->lastKeycode);
+#else
+       dispPtr->firstKeycode = 
+         dpy->min_keycode;
+       dispPtr->lastKeycode = 
+         dpy->max_keycode;
+#endif
+       dispPtr->keySyms = XGetKeyboardMapping(dpy,
+               dispPtr->firstKeycode, dispPtr->lastKeycode + 1
+               - dispPtr->firstKeycode, &dispPtr->symsPerCode);
+    }
+
+    /*
+     * Compute the lower-case KeySym for this keycode.  May
+     * have to convert an upper-case KeySym to a lower-case
+     * one if the list only has a single element.
+     */
+
+    if ((eventPtr->xkey.keycode < dispPtr->firstKeycode)
+           || (eventPtr->xkey.keycode > dispPtr->lastKeycode)) {
+       return NoSymbol;
+    }
+    symPtr = &dispPtr->keySyms[(eventPtr->xkey.keycode
+           - dispPtr->firstKeycode) * dispPtr->symsPerCode];
+    sym = *symPtr;
+    if ((dispPtr->symsPerCode == 1) || (symPtr[1] == NoSymbol)) {
+       if ((sym >= XK_A) && (sym <= XK_Z)) {
+           sym += (XK_a - XK_A);
+       } else if ((sym >= XK_Agrave) && (sym <= XK_Odiaeresis)) {
+           sym += (XK_agrave - XK_Agrave);
+       } else if ((sym >= XK_Ooblique) && (sym <= XK_Thorn)) {
+           sym += (XK_oslash - XK_Ooblique);
+       }
+    }
+
+    /*
+     * See whether the key is shifted or caps-locked.  If so,
+     * use an upper-case equivalent if provided, or compute
+     * one (for caps-lock, just compute upper-case: don't
+     * use shifted KeySym since that would shift non-alphabetic
+     * keys).
+     */
+
+    if (eventPtr->xkey.state & ShiftMask) {
+       if ((dispPtr->symsPerCode > 1) && (symPtr[1] != NoSymbol)) {
+           return symPtr[1];
+       }
+       shiftToUpper:
+       if ((sym >= XK_a) && (sym <= XK_z)) {
+           sym += (XK_A - XK_a);
+       } else if ((sym >= XK_agrave) && (sym <= XK_adiaeresis)) {
+           sym += (XK_Agrave - XK_agrave);
+       } else if ((sym >= XK_oslash) && (sym <= XK_thorn)) {
+           sym += (XK_Ooblique - XK_oslash);
+       }
+       return sym;
+    }
+    if (eventPtr->xkey.state & LockMask) {
+       goto shiftToUpper;
+    }
+    return sym;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * MatchPatterns --
+ *
+ *     Given a list of pattern sequences and a list of
+ *     recent events, return a pattern sequence that matches
+ *     the event list.
+ *
+ * Results:
+ *     The return value is NULL if no pattern matches the
+ *     recent events from bindPtr.  If one or more patterns
+ *     matches, then the longest (or most specific) matching
+ *     pattern is returned.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static PatSeq *
+MatchPatterns(bindPtr, psPtr)
+    BindingTable *bindPtr;     /* Information about binding table, such
+                                * as ring of recent events. */
+    register PatSeq *psPtr;    /* List of pattern sequences. */
+{
+    register PatSeq *bestPtr = NULL;
+
+    /*
+     * Iterate over all the pattern sequences.
+     */
+
+    for ( ; psPtr != NULL; psPtr = psPtr->nextSeqPtr) {
+       register XEvent *eventPtr;
+       register Pattern *patPtr;
+       Window window;
+       int *detailPtr;
+       int patCount, ringCount, flags, state;
+
+       /*
+        * Iterate over all the patterns in a sequence to be
+        * sure that they all match.
+        */
+
+       eventPtr = &bindPtr->eventRing[bindPtr->curEvent];
+       detailPtr = &bindPtr->detailRing[bindPtr->curEvent];
+       window = eventPtr->xany.window;
+       patPtr = psPtr->pats;
+       patCount = psPtr->numPats;
+       ringCount = EVENT_BUFFER_SIZE;
+       while (patCount > 0) {
+           if (ringCount <= 0) {
+               goto nextSequence;
+           }
+           if (eventPtr->xany.window != window) {
+               goto nextSequence;
+           }
+           if (eventPtr->xany.type != patPtr->eventType) {
+               /*
+                * If the event is a mouse motion, button release,
+                * or key release event, and it didn't match
+                * the pattern, then just skip the event and try
+                * the next event against the same pattern.
+                */
+
+               if ((eventPtr->xany.type == MotionNotify)
+                       || (eventPtr->xany.type == ButtonRelease)
+                       || (eventPtr->xany.type == KeyRelease)
+                       || (eventPtr->xany.type == NoExpose)
+                       || (eventPtr->xany.type == GraphicsExpose)) {
+                   goto nextEvent;
+               }
+               goto nextSequence;
+           }
+
+           flags = flagArray[eventPtr->type];
+           if (flags & KEY_BUTTON_MOTION) {
+               state = eventPtr->xkey.state;
+           } else if (flags & CROSSING) {
+               state = eventPtr->xcrossing.state;
+           } else {
+               state = 0;
+           }
+           if ((state & patPtr->needMods)
+                   != patPtr->needMods) {
+               goto nextSequence;
+           }
+           if ((state & patPtr->hateMods) != 0) {
+               goto nextSequence;
+           }
+           if ((patPtr->detail != 0)
+                   && (patPtr->detail != *detailPtr)) {
+               goto nextSequence;
+           }
+           if (psPtr->flags & PAT_NEARBY) {
+               register XEvent *firstPtr;
+
+               firstPtr = &bindPtr->eventRing[bindPtr->curEvent];
+               if ((firstPtr->xkey.x_root
+                           < (eventPtr->xkey.x_root - NEARBY_PIXELS))
+                       || (firstPtr->xkey.x_root
+                           > (eventPtr->xkey.x_root + NEARBY_PIXELS))
+                       || (firstPtr->xkey.y_root
+                           < (eventPtr->xkey.y_root - NEARBY_PIXELS))
+                       || (firstPtr->xkey.y_root
+                           > (eventPtr->xkey.y_root + NEARBY_PIXELS))
+                       || (firstPtr->xkey.time
+                           > (eventPtr->xkey.time + NEARBY_MS))) {
+                   goto nextSequence;
+               }
+           }
+           patPtr++;
+           patCount--;
+           nextEvent:
+           if (eventPtr == bindPtr->eventRing) {
+               eventPtr = &bindPtr->eventRing[EVENT_BUFFER_SIZE-1];
+               detailPtr = &bindPtr->detailRing[EVENT_BUFFER_SIZE-1];
+           } else {
+               eventPtr--;
+               detailPtr--;
+           }
+           ringCount--;
+       }
+
+       /*
+        * This sequence matches.  If we've already got another match,
+        * pick whichever is most specific.  Detail is most important,
+        * then needMods, then hateMods.
+        */
+
+       if (bestPtr != NULL) {
+           register Pattern *patPtr2;
+           int i;
+
+           if (psPtr->numPats != bestPtr->numPats) {
+               if (bestPtr->numPats > psPtr->numPats) {
+                   goto nextSequence;
+               } else {
+                   goto newBest;
+               }
+           }
+           for (i = 0, patPtr = psPtr->pats, patPtr2 = bestPtr->pats;
+                   i < psPtr->numPats; i++,patPtr++, patPtr2++) {
+               if (patPtr->detail != patPtr2->detail) {
+                   if (patPtr->detail == 0) {
+                       goto nextSequence;
+                   } else {
+                       goto newBest;
+                   }
+               }
+               if (patPtr->needMods != patPtr2->needMods) {
+                   if ((patPtr->needMods & patPtr2->needMods)
+                       == patPtr->needMods) {
+                   goto nextSequence;
+                   } else {
+                       goto newBest;
+                   }
+               }
+               if (patPtr->hateMods != patPtr2->hateMods) {
+                   if ((patPtr->hateMods & patPtr2->hateMods)
+                       == patPtr2->hateMods) {
+                       goto newBest;
+                   } else {
+                       goto nextSequence;
+                   }
+               }
+           }
+           goto nextSequence;  /* Tie goes to newest pattern. */
+       }
+       newBest:
+       bestPtr = psPtr;
+
+       nextSequence: continue;
+    }
+    return bestPtr;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ExpandPercents --
+ *
+ *     Given a command and an event, produce a new command
+ *     by replacing % constructs in the original command
+ *     with information from the X event.
+ *
+ * Results:
+ *     The return result is a pointer to the new %-substituted
+ *     command.  If the command fits in the space at after, then
+ *     the return value is after.  If the command is too large
+ *     to fit at after, then the return value is a pointer to
+ *     a malloc-ed buffer holding the command;  in this case it
+ *     is the caller's responsibility to free up the buffer when
+ *     finished with it.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static char *
+ExpandPercents(before, eventPtr, keySym, after, afterSize)
+    register char *before;     /* Command containing percent
+                                * expressions to be replaced. */
+    register XEvent *eventPtr; /* X event containing information
+                                * to be used in % replacements. */
+    KeySym keySym;             /* KeySym: only relevant for
+                                * KeyPress and KeyRelease events). */
+    char *after;               /* Place to generate new expanded
+                                * command.  Must contain at least
+                                * "afterSize" bytes of space. */
+    int afterSize;             /* Number of bytes of space available at
+                                * after. */
+{
+    register char *buffer;     /* Pointer to buffer currently being used
+                                * as destination. */
+    register char *dst;                /* Pointer to next place to store character
+                                * in substituted string. */
+    int spaceLeft;             /* Indicates how many more non-null bytes
+                                * may be stored at *dst before space
+                                * runs out. */
+    int spaceNeeded, cvtFlags; /* Used to substitute string as proper Tcl
+                                * list element. */
+    int number, flags;
+#define NUM_SIZE 40
+    register char *string;
+    char numStorage[NUM_SIZE+1];
+
+    if (eventPtr->type < LASTEvent) {
+       flags = flagArray[eventPtr->type];
+    } else {
+       flags = 0;
+    }
+    dst = buffer = after;
+    spaceLeft = afterSize - 1;
+    while (*before != 0) {
+       if (*before != '%') {
+
+           /*
+            * Expand the destination string if necessary.
+            */
+
+           if (spaceLeft <= 0) {
+               char *newSpace;
+
+               newSpace = (char *) ckalloc((unsigned) (2*afterSize));
+               memcpy((VOID *) newSpace, (VOID *) buffer, afterSize);
+               afterSize *= 2;
+               dst = newSpace + (dst - buffer);
+               if (buffer != after) {
+                   ckfree(buffer);
+               }
+               buffer = newSpace;
+               spaceLeft = afterSize - (dst-buffer) - 1;
+           }
+           *dst = *before;
+           dst++;
+           before++;
+           spaceLeft--;
+           continue;
+       }
+
+       number = 0;
+       string = "??";
+       switch (before[1]) {
+           case '#':
+               number = eventPtr->xany.serial;
+               goto doNumber;
+           case 'a':
+               number = (int) eventPtr->xconfigure.above;
+               goto doNumber;
+           case 'b':
+               number = eventPtr->xbutton.button;
+               goto doNumber;
+           case 'c':
+               if (flags & EXPOSE) {
+                   number = eventPtr->xexpose.count;
+               } else if (flags & MAPPING) {
+                   number = eventPtr->xmapping.count;
+               }
+               goto doNumber;
+           case 'd':
+               if (flags & (CROSSING|FOCUS)) {
+                   switch (eventPtr->xcrossing.detail) {
+                       case NotifyAncestor:
+                           string = "NotifyAncestor";
+                           break;
+                       case NotifyVirtual:
+                           string = "NotifyVirtual";
+                           break;
+                       case NotifyInferior:
+                           string = "NotifyInferior";
+                           break;
+                       case NotifyNonlinear:
+                           string = "NotifyNonlinear";
+                           break;
+                       case NotifyNonlinearVirtual:
+                           string = "NotifyNonlinearVirtual";
+                           break;
+                       case NotifyPointer:
+                           string = "NotifyPointer";
+                           break;
+                       case NotifyPointerRoot:
+                           string = "NotifyPointerRoot";
+                           break;
+                       case NotifyDetailNone:
+                           string = "NotifyDetailNone";
+                           break;
+                   }
+               } else if (flags & CONFIG_REQ) {
+                   switch (eventPtr->xconfigurerequest.detail) {
+                       case Above:
+                           string = "Above";
+                           break;
+                       case Below:
+                           string = "Below";
+                           break;
+                       case TopIf:
+                           string = "TopIf";
+                           break;
+                       case BottomIf:
+                           string = "BottomIf";
+                           break;
+                       case Opposite:
+                           string = "Opposite";
+                           break;
+                   }
+               }
+               goto doString;
+           case 'f':
+               number = eventPtr->xcrossing.focus;
+               goto doNumber;
+           case 'h':
+               if (flags & EXPOSE) {
+                   number = eventPtr->xexpose.height;
+               } else if (flags & (CONFIG|CONFIG_REQ)) {
+                   number = eventPtr->xconfigure.height;
+               } else if (flags & RESIZE_REQ) {
+                   number = eventPtr->xresizerequest.height;
+               }
+               goto doNumber;
+           case 'k':
+               number = eventPtr->xkey.keycode;
+               goto doNumber;
+           case 'm':
+               if (flags & CROSSING) {
+                   number = eventPtr->xcrossing.mode;
+               } else if (flags & FOCUS) {
+                   number = eventPtr->xfocus.mode;
+               }
+               switch (number) {
+                   case NotifyNormal:
+                       string = "NotifyNormal";
+                       break;
+                   case NotifyGrab:
+                       string = "NotifyGrab";
+                       break;
+                   case NotifyUngrab:
+                       string = "NotifyUngrab";
+                       break;
+                   case NotifyWhileGrabbed:
+                       string = "NotifyWhileGrabbed";
+                       break;
+               }
+               goto doString;
+           case 'o':
+               if (flags & CREATE) {
+                   number = eventPtr->xcreatewindow.override_redirect;
+               } else if (flags & MAP) {
+                   number = eventPtr->xmap.override_redirect;
+               } else if (flags & REPARENT) {
+                   number = eventPtr->xreparent.override_redirect;
+               } else if (flags & CONFIG) {
+                   number = eventPtr->xconfigure.override_redirect;
+               }
+               goto doNumber;
+           case 'p':
+               switch (eventPtr->xcirculate.place) {
+                   case PlaceOnTop:
+                       string = "PlaceOnTop";
+                       break;
+                   case PlaceOnBottom:
+                       string = "PlaceOnBottom";
+                       break;
+               }
+               goto doString;
+           case 's':
+               if (flags & KEY_BUTTON_MOTION) {
+                   number = eventPtr->xkey.state;
+               } else if (flags & CROSSING) {
+                   number = eventPtr->xcrossing.state;
+               } else if (flags & VISIBILITY) {
+                   switch (eventPtr->xvisibility.state) {
+                       case VisibilityUnobscured:
+                           string = "VisibilityUnobscured";
+                           break;
+                       case VisibilityPartiallyObscured:
+                           string = "VisibilityPartiallyObscured";
+                           break;
+                       case VisibilityFullyObscured:
+                           string = "VisibilityFullyObscured";
+                           break;
+                   }
+                   goto doString;
+               }
+               goto doNumber;
+           case 't':
+               if (flags & (KEY_BUTTON_MOTION|PROP|SEL_CLEAR)) {
+                   number = (int) eventPtr->xkey.time;
+               } else if (flags & SEL_REQ) {
+                   number = (int) eventPtr->xselectionrequest.time;
+               } else if (flags & SEL_NOTIFY) {
+                   number = (int) eventPtr->xselection.time;
+               }
+               goto doNumber;
+           case 'v':
+               number = eventPtr->xconfigurerequest.value_mask;
+               goto doNumber;
+           case 'w':
+               if (flags & EXPOSE) {
+                   number = eventPtr->xexpose.width;
+               } else if (flags & (CONFIG|CONFIG_REQ)) {
+                   number = eventPtr->xconfigure.width;
+               } else if (flags & RESIZE_REQ) {
+                   number = eventPtr->xresizerequest.width;
+               }
+               goto doNumber;
+           case 'x':
+               if (flags & KEY_BUTTON_MOTION) {
+                   number = eventPtr->xkey.x;
+               } else if (flags & EXPOSE) {
+                   number = eventPtr->xexpose.x;
+               } else if (flags & (CREATE|CONFIG|GRAVITY|CONFIG_REQ)) {
+                   number = eventPtr->xcreatewindow.x;
+               } else if (flags & REPARENT) {
+                   number = eventPtr->xreparent.x;
+               } else if (flags & CROSSING) {
+                   number = eventPtr->xcrossing.x;
+               }
+               goto doNumber;
+           case 'y':
+               if (flags & KEY_BUTTON_MOTION) {
+                   number = eventPtr->xkey.y;
+               } else if (flags & EXPOSE) {
+                   number = eventPtr->xexpose.y;
+               } else if (flags & (CREATE|CONFIG|GRAVITY|CONFIG_REQ)) {
+                   number = eventPtr->xcreatewindow.y;
+               } else if (flags & REPARENT) {
+                   number = eventPtr->xreparent.y;
+               } else if (flags & CROSSING) {
+                   number = eventPtr->xcrossing.y;
+
+               }
+               goto doNumber;
+           case 'A':
+               if ((eventPtr->type == KeyPress)
+                       || (eventPtr->type == KeyRelease)) {
+                   int numChars;
+
+                   numChars = XLookupString(&eventPtr->xkey, numStorage,
+                           NUM_SIZE, (KeySym *) NULL,
+                           (XComposeStatus *) NULL);
+                   numStorage[numChars] = '\0';
+                   string = numStorage;
+               }
+               goto doString;
+           case 'B':
+               number = eventPtr->xcreatewindow.border_width;
+               goto doNumber;
+           case 'D':
+               number = (int) eventPtr->xany.display;
+               goto doNumber;
+           case 'E':
+               number = (int) eventPtr->xany.send_event;
+               goto doNumber;
+           case 'K':
+               if ((eventPtr->type == KeyPress)
+                       || (eventPtr->type == KeyRelease)) {
+                   register KeySymInfo *kPtr;
+
+                   for (kPtr = keyArray; kPtr->name != NULL; kPtr++) {
+                       if (kPtr->value == keySym) {
+                           string = kPtr->name;
+                           break;
+                       }
+                   }
+               }
+               goto doString;
+           case 'N':
+               number = (int) keySym;
+               goto doNumber;
+           case 'R':
+               number = (int) eventPtr->xkey.root;
+               goto doNumber;
+           case 'S':
+               number = (int) eventPtr->xkey.subwindow;
+               goto doNumber;
+           case 'T':
+               number = eventPtr->type;
+               goto doNumber;
+           case 'W': {
+               TkWindow *winPtr;
+
+               if (XFindContext(eventPtr->xany.display, eventPtr->xany.window,
+                       tkWindowContext, (void *) &winPtr) == 0) {
+                   string = winPtr->pathName;
+               } else {
+                   string = "??";
+               }
+               goto doString;
+           }
+           case 'X':
+               number = eventPtr->xkey.x_root;
+               goto doNumber;
+           case 'Y':
+               number = eventPtr->xkey.y_root;
+               goto doNumber;
+           default:
+               numStorage[0] = before[1];
+               numStorage[1] = '\0';
+               string = numStorage;
+               goto doString;
+       }
+
+       doNumber:
+       sprintf(numStorage, "%d", number);
+       string = numStorage;
+
+       doString:
+       spaceNeeded = Tcl_ScanElement(string, &cvtFlags);
+       if (spaceNeeded >= spaceLeft) {
+           char *newSpace;
+
+           newSpace = (char *) ckalloc((unsigned)
+                   (afterSize + spaceNeeded + 50));
+           memcpy((VOID *) newSpace, (VOID *) buffer, afterSize);
+           afterSize += spaceNeeded + 50;
+           dst = newSpace + (dst - buffer);
+           if (buffer != after) {
+               ckfree(buffer);
+           }
+           buffer = newSpace;
+           spaceLeft = afterSize - (dst-buffer) - 1;
+       }
+       spaceNeeded = Tcl_ConvertElement(string, dst,
+               cvtFlags | TCL_DONT_USE_BRACES);
+       dst += spaceNeeded;
+       spaceLeft -= spaceNeeded;
+       before += 2;
+    }
+    *dst = '\0';
+    return buffer;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBindError --
+ *
+ *     This procedure is invoked to handle errors that occur in Tcl
+ *     commands that are invoked in "background" (e.g. from event or
+ *     timer bindings).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The command "tkerror" is invoked to process the error, passing
+ *     it the error message.  If that fails, then an error message
+ *     is output on stderr.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkBindError(interp)
+    Tcl_Interp *interp;                /* Interpreter in which an error has
+                                * occurred. */
+{
+    char *argv[2];
+    char *command;
+    char *error;
+    char *errorInfo, *tmp;
+    int result;
+
+    error = (char *) ckalloc((unsigned) (strlen(interp->result) + 1));
+    strcpy(error, interp->result);
+    tmp = Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY);
+    if (tmp == NULL) {
+       errorInfo = error;
+    } else {
+       errorInfo = (char *) ckalloc((unsigned) (strlen(tmp) + 1));
+       strcpy(errorInfo, tmp);
+    }
+    argv[0] = "tkerror";
+    argv[1] = error;
+    command = Tcl_Merge(2, argv);
+    result = Tcl_GlobalEval(interp, command);
+    if (result != TCL_OK) {
+       if (strcmp(interp->result, "\"tkerror\" is an invalid command name or ambiguous abbreviation") == 0) {
+           fprintf(stderr, "%s\n", errorInfo);
+       } else {
+           fprintf(stderr, "tkerror failed to handle background error.\n");
+           fprintf(stderr, "    Original error: %s\n", error);
+           fprintf(stderr, "    Error in tkerror: %s\n", interp->result);
+       }
+    }
+    Tcl_ResetResult(interp);
+    ckfree(command);
+    ckfree(error);
+    if (errorInfo != error) {
+       ckfree(errorInfo);
+    }
+}
diff --git a/src/tk/tkbitmap.c b/src/tk/tkbitmap.c
new file mode 100644 (file)
index 0000000..cc81cd0
--- /dev/null
@@ -0,0 +1,496 @@
+/* 
+ * tkBitmap.c --
+ *
+ *     This file maintains a database of read-only bitmaps for the Tk
+ *     toolkit.  This allows bitmaps to be shared between widgets and
+ *     also avoids interactions with the X server.
+ *
+ * Copyright 1990-1992 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkBitmap.c,v 1.16 92/08/24 09:45:43 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tkconfig.h"
+#include "tk.h"
+
+/*
+ * The includes below are for pre-defined bitmaps.
+ */
+
+#include "bitmaps/gray50"
+#include "bitmaps/gray25"
+
+/*
+ * One of the following data structures exists for each bitmap that is
+ * currently in use.  Each structure is indexed with both "idTable" and
+ * "nameTable".
+ */
+
+typedef struct {
+    Pixmap bitmap;             /* X identifier for bitmap.  None means this
+                                * bitmap was created by Tk_DefineBitmap
+                                * and it isn't currently in use. */
+    unsigned int width, height;        /* Dimensions of bitmap. */
+    Display *display;          /* Display for which bitmap is valid. */
+    int refCount;              /* Number of active uses of bitmap. */
+    Tcl_HashEntry *hashPtr;    /* Entry in nameTable for this structure
+                                * (needed when deleting). */
+} TkBitmap;
+
+/*
+ * Hash table to map from a textual description of a bitmap to the
+ * TkBitmap record for the bitmap, and key structure used in that
+ * hash table:
+ */
+
+static Tcl_HashTable nameTable;
+typedef struct {
+    Tk_Uid name;               /* Textual name for desired bitmap. */
+    Screen *screen;            /* Screen for which bitmap will be used. */
+} NameKey;
+
+/*
+ * Hash table that maps from bitmap identifiers to the TkBitmap structure
+ * for the bitmap.  This table is indexed by Bitmap ids, and is used by
+ * Tk_FreeBitmap.
+ */
+
+static Tcl_HashTable idTable;
+
+/*
+ * For each call to Tk_DefineBitmap one of the following structures is
+ * created to hold information about the bitmap.
+ */
+
+typedef struct {
+    char *source;              /* Bits for bitmap. */
+    unsigned int width, height;        /* Dimensions of bitmap. */
+} PredefBitmap;
+
+/*
+ * Hash table create by Tk_DefineBitmap to map from a name to a
+ * collection of in-core data about a bitmap.  The table is
+ * indexed by the address of the data for the bitmap, and the entries
+ * contain pointers to PredefBitmap structures.
+ */
+
+static Tcl_HashTable predefTable;
+
+/*
+ * Hash table used by Tk_GetBitmapFromData to map from a collection
+ * of in-core data about a bitmap to a Tk_Uid giving an automatically-
+ * generated name for the bitmap:
+ */
+
+static Tcl_HashTable dataTable;
+typedef struct {
+    char *source;              /* Bitmap bits. */
+    unsigned int width, height;        /* Dimensions of bitmap. */
+} DataKey;
+
+static int initialized = 0;    /* 0 means static structures haven't been
+                                * initialized yet. */
+
+/*
+ * Forward declarations for procedures defined in this file:
+ */
+
+static void            BitmapInit _ANSI_ARGS_((void));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_GetBitmap --
+ *
+ *     Given a string describing a bitmap, locate (or create if necessary)
+ *     a bitmap that fits the description.
+ *
+ * Results:
+ *     The return value is the X identifer for the desired bitmap
+ *     (i.e. a Pixmap with a single plane), unless string couldn't be
+ *     parsed correctly.  In this case, None is returned and an error
+ *     message is left in interp->result.  The caller should never
+ *     modify the bitmap that is returned, and should eventually call
+ *     Tk_FreeBitmap when the bitmap is no longer needed.
+ *
+ * Side effects:
+ *     The bitmap is added to an internal database with a reference count.
+ *     For each call to this procedure, there should eventually be a call
+ *     to Tk_FreeBitmap, so that the database can be cleaned up when bitmaps
+ *     aren't needed anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Pixmap
+Tk_GetBitmap(interp, tkwin, string)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    Tk_Window tkwin;           /* Window in which bitmap will be used. */
+    Tk_Uid string;             /* Description of bitmap.  See manual entry
+                                * for details on legal syntax. */
+{
+    NameKey key;
+    Tcl_HashEntry *nameHashPtr, *idHashPtr, *predefHashPtr;
+    register TkBitmap *bitmapPtr;
+    PredefBitmap *predefPtr;
+    int new;
+    Pixmap bitmap;
+    unsigned int width, height;
+    int dummy2;
+
+    if (!initialized) {
+       BitmapInit();
+    }
+
+    key.name = string;
+    key.screen = Tk_Screen(tkwin);
+    nameHashPtr = Tcl_CreateHashEntry(&nameTable, (char *) &key, &new);
+    if (!new) {
+       bitmapPtr = (TkBitmap *) Tcl_GetHashValue(nameHashPtr);
+       bitmapPtr->refCount++;
+       return bitmapPtr->bitmap;
+    }
+
+    /*
+     * No suitable bitmap exists.  Create a new bitmap from the
+     * information contained in the string.  If the string starts
+     * with "@" then the rest of the string is a file name containing
+     * the bitmap.  Otherwise the string must refer to a bitmap
+     * defined by a call to Tk_DefineBitmap.
+     */
+
+    if (*string == '@') {
+       string = Tcl_TildeSubst(interp, string + 1);
+       if (string == NULL) {
+           goto error;
+       }
+       if (XReadBitmapFile(Tk_Display(tkwin),
+                           RootWindowOfScreen(Tk_Screen(tkwin)),
+               string, &width, &height, &bitmap, &dummy2, &dummy2)
+               != BitmapSuccess) {
+           Tcl_AppendResult(interp, "error reading bitmap file \"", string,
+                   "\"", (char *) NULL);
+           goto error;
+       }
+    } else {
+       predefHashPtr = Tcl_FindHashEntry(&predefTable, string);
+       if (predefHashPtr == NULL) {
+           Tcl_AppendResult(interp, "bitmap \"", string,
+                   "\" not defined", (char *) NULL);
+           goto error;
+       }
+       predefPtr = (PredefBitmap *) Tcl_GetHashValue(predefHashPtr);
+       width = predefPtr->width;
+       height = predefPtr->height;
+       bitmap = XCreateBitmapFromData(Tk_Display(tkwin),
+               RootWindowOfScreen(Tk_Screen(tkwin)), predefPtr->source,
+               width, height);
+    }
+
+    /*
+     * Add information about this bitmap to our database.
+     */
+
+    bitmapPtr = (TkBitmap *) ckalloc(sizeof(TkBitmap));
+    bitmapPtr->bitmap = bitmap;
+    bitmapPtr->width = width;
+    bitmapPtr->height = height;
+    bitmapPtr->display = Tk_Display(tkwin);
+    bitmapPtr->refCount = 1;
+    bitmapPtr->hashPtr = nameHashPtr;
+    idHashPtr = Tcl_CreateHashEntry(&idTable, (char *) bitmapPtr->bitmap,
+           &new);
+    if (!new) {
+/* deh patched to support multiple displays */
+/*     panic("bitmap already registered in Tk_GetBitmap"); */
+        bitmapPtr->refCount = 1000;
+    }
+    Tcl_SetHashValue(nameHashPtr, bitmapPtr);
+    Tcl_SetHashValue(idHashPtr, bitmapPtr);
+    return bitmapPtr->bitmap;
+
+    error:
+    Tcl_DeleteHashEntry(nameHashPtr);
+    return None;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_DefineBitmap --
+ *
+ *     This procedure associates a textual name with a binary bitmap
+ *     description, so that the name may be used to refer to the
+ *     bitmap in future calls to Tk_GetBitmap.
+ *
+ * Results:
+ *     A standard Tcl result.  If an error occurs then TCL_ERROR is
+ *     returned and a message is left in interp->result.
+ *
+ * Side effects:
+ *     "Name" is entered into the bitmap table and may be used from
+ *     here on to refer to the given bitmap.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tk_DefineBitmap(interp, name, source, width, height)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    Tk_Uid name;               /* Name to use for bitmap.  Must not already
+                                * be defined as a bitmap. */
+    char *source;              /* Address of bits for bitmap. */
+    unsigned int width;                /* Width of bitmap. */
+    unsigned int height;       /* Height of bitmap. */
+{
+    int new;
+    Tcl_HashEntry *predefHashPtr;
+    PredefBitmap *predefPtr;
+
+    if (!initialized) {
+       BitmapInit();
+    }
+
+    predefHashPtr = Tcl_CreateHashEntry(&predefTable, name, &new);
+    if (!new) {
+        Tcl_AppendResult(interp, "bitmap \"", name,
+               "\" is already defined", (char *) NULL);
+       return TCL_ERROR;
+    }
+    predefPtr = (PredefBitmap *) malloc(sizeof(PredefBitmap));
+    predefPtr->source = source;
+    predefPtr->width = width;
+    predefPtr->height = height;
+    Tcl_SetHashValue(predefHashPtr, predefPtr);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_NameOfBitmap --
+ *
+ *     Given a bitmap, return a textual string identifying the
+ *     bitmap.
+ *
+ * Results:
+ *     The return value is the string name associated with bitmap.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+Tk_Uid
+Tk_NameOfBitmap(bitmap)
+    Pixmap bitmap;                     /* Bitmap whose name is wanted. */
+{
+    Tcl_HashEntry *idHashPtr;
+    TkBitmap *bitmapPtr;
+
+    if (!initialized) {
+       unknown:
+       panic("Tk_NameOfBitmap received unknown bitmap argument");
+    }
+
+    idHashPtr = Tcl_FindHashEntry(&idTable, (char *) bitmap);
+    if (idHashPtr == NULL) {
+       goto unknown;
+    }
+    bitmapPtr = (TkBitmap *) Tcl_GetHashValue(idHashPtr);
+    return ((NameKey *) bitmapPtr->hashPtr->key.words)->name;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_SizeOfBitmap --
+ *
+ *     Given a bitmap managed by this module, returns the width
+ *     and height of the bitmap..
+ *
+ * Results:
+ *     The words at *widthPtr and *heightPtr are filled in with
+ *     the dimenstions of bitmap.
+ *
+ * Side effects:
+ *     If bitmap isn't managed by this module then the procedure
+ *     panics..
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_SizeOfBitmap(bitmap, widthPtr, heightPtr)
+    Pixmap bitmap;                     /* Bitmap whose size is wanted. */
+    unsigned int *widthPtr;            /* Store bitmap width here. */
+    unsigned int *heightPtr;           /* Store bitmap height here. */
+{
+    Tcl_HashEntry *idHashPtr;
+    TkBitmap *bitmapPtr;
+
+    if (!initialized) {
+       unknownBitmap:
+       panic("Tk_SizeOfBitmap received unknown bitmap argument");
+    }
+
+    idHashPtr = Tcl_FindHashEntry(&idTable, (char *) bitmap);
+    if (idHashPtr == NULL) {
+       goto unknownBitmap;
+    }
+    bitmapPtr = (TkBitmap *) Tcl_GetHashValue(idHashPtr);
+    *widthPtr = bitmapPtr->width;
+    *heightPtr = bitmapPtr->height;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_FreeBitmap --
+ *
+ *     This procedure is called to release a bitmap allocated by
+ *     Tk_GetBitmap or TkGetBitmapFromData.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The reference count associated with bitmap is decremented, and
+ *     it is officially deallocated if no-one is using it anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_FreeBitmap(bitmap)
+    Pixmap bitmap;                     /* Bitmap to be released. */
+{
+    Tcl_HashEntry *idHashPtr;
+    register TkBitmap *bitmapPtr;
+
+    if (!initialized) {
+       panic("Tk_FreeBitmap called before Tk_GetBitmap");
+    }
+
+    idHashPtr = Tcl_FindHashEntry(&idTable, (char *) bitmap);
+    if (idHashPtr == NULL) {
+       panic("Tk_FreeBitmap received unknown bitmap argument");
+    }
+    bitmapPtr = (TkBitmap *) Tcl_GetHashValue(idHashPtr);
+    bitmapPtr->refCount--;
+    if (bitmapPtr->refCount == 0) {
+       XFreePixmap(bitmapPtr->display, bitmapPtr->bitmap);
+       Tcl_DeleteHashEntry(idHashPtr);
+       Tcl_DeleteHashEntry(bitmapPtr->hashPtr);
+       ckfree((char *) bitmapPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_GetBitmapFromData --
+ *
+ *     Given a description of the bits for a bitmap, make a bitmap that
+ *     has the given properties.
+ *
+ * Results:
+ *     The return value is the X identifer for the desired bitmap
+ *     (a one-plane Pixmap), unless it couldn't be created properly.
+ *     In this case, None is returned and an error message is left in
+ *     interp->result.  The caller should never modify the bitmap that
+ *     is returned, and should eventually call Tk_FreeBitmap when the
+ *     bitmap is no longer needed.
+ *
+ * Side effects:
+ *     The bitmap is added to an internal database with a reference count.
+ *     For each call to this procedure, there should eventually be a call
+ *     to Tk_FreeBitmap, so that the database can be cleaned up when bitmaps
+ *     aren't needed anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+Pixmap
+Tk_GetBitmapFromData(interp, tkwin, source, width, height)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    Tk_Window tkwin;           /* Window in which bitmap will be used. */
+    char *source;              /* Bitmap data for bitmap shape. */
+    unsigned int width, height;        /* Dimensions of bitmap. */
+{
+    DataKey key;
+    Tcl_HashEntry *dataHashPtr;
+    Tk_Uid name = NULL;                /* Initialization need only to prevent
+                                * compiler warning. */
+    int new;
+    static autoNumber = 0;
+    char string[20];
+
+    if (!initialized) {
+       BitmapInit();
+    }
+
+    key.source = source;
+    key.width = width;
+    key.height = height;
+    dataHashPtr = Tcl_CreateHashEntry(&dataTable, (char *) &key, &new);
+    if (!new) {
+       name = (Tk_Uid) Tcl_GetHashValue(dataHashPtr);
+    } else {
+       autoNumber++;
+       sprintf(string, "_tk%d", autoNumber);
+       name = Tk_GetUid(string);
+       Tcl_SetHashValue(dataHashPtr, name);
+       if (Tk_DefineBitmap(interp, name, source, width, height) != TCL_OK) {
+           Tcl_DeleteHashEntry(dataHashPtr);
+           return TCL_ERROR;
+       }
+    }
+    return Tk_GetBitmap(interp, tkwin, name);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * BitmapInit --
+ *
+ *     Initialize the structures used for bitmap management.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Read the code.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+BitmapInit()
+{
+    Tcl_Interp *dummy;
+
+    dummy = Tcl_CreateInterp();
+    initialized = 1;
+    Tcl_InitHashTable(&nameTable, sizeof(NameKey)/sizeof(int));
+    Tcl_InitHashTable(&dataTable, sizeof(DataKey)/sizeof(int));
+    Tcl_InitHashTable(&predefTable, TCL_ONE_WORD_KEYS);
+    Tcl_InitHashTable(&idTable, TCL_ONE_WORD_KEYS);
+
+    Tk_DefineBitmap(dummy, Tk_GetUid("gray50"), (char *)gray50_bits,
+                   gray50_width, gray50_height);
+    Tk_DefineBitmap(dummy, Tk_GetUid("gray25"),
+                   (char *)gray25_bits, gray25_width, gray25_height);
+    Tcl_DeleteInterp(dummy);
+}
diff --git a/src/tk/tkbutton.c b/src/tk/tkbutton.c
new file mode 100644 (file)
index 0000000..1d5ab0f
--- /dev/null
@@ -0,0 +1,1545 @@
+/* 
+ * tkButton.c --
+ *
+ *     This module implements a collection of button-like
+ *     widgets for the Tk toolkit.  The widgets implemented
+ *     include labels, buttons, check buttons, and radio
+ *     buttons.
+ *
+ * Copyright 1990-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkButton.c,v 1.69 92/08/21 11:42:47 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "default.h"
+#include "tkconfig.h"
+#include "tkint.h"
+
+#include <assert.h>
+
+/*
+ * A data structure of the following type is kept for each
+ * widget managed by this file:
+ */
+
+typedef struct {
+    Tk_Window tkwin;           /* Window that embodies the button.  NULL
+                                * means that the window has been destroyed. */
+    Tcl_Interp *interp;                /* Interpreter associated with button. */
+    int type;                  /* Type of widget:  restricts operations
+                                * that may be performed on widget.  See
+                                * below for possible values. */
+
+    /*
+     * Information about what's in the button.
+     */
+
+    char *text;                        /* Text to display in button (malloc'ed)
+                                * or NULL. */
+    int textLength;            /* # of characters in text. */
+    char *textVarName;         /* Name of variable (malloc'ed) or NULL.
+                                * If non-NULL, button displays the contents
+                                * of this variable. */
+    Pixmap bitmap;             /* Bitmap to display or None.  If not None
+                                * then text and textVar are ignored. */
+
+    /*
+     * Information used when displaying widget:
+     */
+
+    Tk_Uid state;              /* State of button for display purposes:
+                                * normal, active, or disabled. */
+    Tk_3DBorder normalBorder;  /* Structure used to draw 3-D
+                                * border and background when window
+                                * isn't active.  NULL means no such
+                                * border exists. */
+    Tk_3DBorder activeBorder;  /* Structure used to draw 3-D
+                                * border and background when window
+                                * is active.  NULL means no such
+                                * border exists. */
+    int borderWidth;           /* Width of border. */
+    int relief;                        /* 3-d effect: TK_RELIEF_RAISED, etc. */
+    XFontStruct *fontPtr;      /* Information about text font, or NULL. */
+    XColor *normalFg;          /* Foreground color in normal mode. */
+    XColor *activeFg;          /* Foreground color in active mode.  NULL
+                                * means use normalFg instead. */
+    XColor *disabledFg;                /* Foreground color when disabled.  NULL
+                                * means use normalFg with a 50% stipple
+                                * instead. */
+    GC normalTextGC;           /* GC for drawing text in normal mode.  Also
+                                * used to copy from off-screen pixmap onto
+                                * screen. */
+    GC activeTextGC;           /* GC for drawing text in active mode (NULL
+                                * means use normalTextGC). */
+    Pixmap gray;               /* Pixmap for displaying disabled text if
+                                * disabledFg is NULL. */
+    GC disabledGC;             /* Used to produce disabled effect.  If
+                                * disabledFg isn't NULL, this GC is used to
+                                * draw button text or icon.  Otherwise
+                                * text or icon is drawn with normalGC and
+                                * this GC is used to stipple background
+                                * across it. */
+    int leftBearing;           /* Amount text sticks left from its origin,
+                                * in pixels. */
+    int rightBearing;          /* Amount text sticks right from its origin. */
+    int width, height;         /* If > 0, these specify dimensions to request
+                                * for window, in characters for text and in
+                                * pixels for bitmaps.  In this case the actual
+                                * size of the text string or bitmap is
+                                * ignored in computing desired window size. */
+    int padX, padY;            /* Extra space around text or bitmap (pixels
+                                * on each side). */
+    Tk_Anchor anchor;          /* Where text/bitmap should be displayed
+                                * inside button region. */
+    XColor *selectorFg;                /* Color for selector. */
+    GC selectorGC;             /* For drawing highlight when this button
+                                * is in selected state. */
+    int selectorSpace;         /* Horizontal space (in pixels) allocated for
+                                * display of selector. */
+    int selectorDiameter;      /* Diameter of selector, in pixels. */
+
+    /*
+     * For check and radio buttons, the fields below are used
+     * to manage the variable indicating the button's state.
+     */
+
+    char *selVarName;          /* Name of variable used to control selected
+                                * state of button.  Malloc'ed (if
+                                * not NULL). */
+    char *onValue;             /* Value to store in variable when
+                                * this button is selected.  Malloc'ed (if
+                                * not NULL). */
+    char *offValue;            /* Value to store in variable when this
+                                * button isn't selected.  Malloc'ed
+                                * (if not NULL).  Valid only for check
+                                * buttons. */
+
+    /*
+     * Miscellaneous information:
+     */
+
+    Cursor cursor;             /* Current cursor for window, or None. */
+    char *command;             /* Command to execute when button is
+                                * invoked; valid for buttons only.
+                                * If not NULL, it's malloc-ed. */
+    int flags;                 /* Various flags;  see below for
+                                * definitions. */
+    Tk_TimerToken updateTimerToken; /* Added by Don to optimize rapid 
+                                    * updates. */
+} Button;
+
+/*
+ * Possible "type" values for buttons.  These are the kinds of
+ * widgets supported by this file.  The ordering of the type
+ * numbers is significant:  greater means more features and is
+ * used in the code.
+ */
+
+#define TYPE_LABEL             0
+#define TYPE_BUTTON            1
+#define TYPE_CHECK_BUTTON      2
+#define TYPE_RADIO_BUTTON      3
+
+/*
+ * Class names for buttons, indexed by one of the type values above.
+ */
+
+static char *classNames[] = {"Label", "Button", "CheckButton", "RadioButton"};
+
+/*
+ * Flag bits for buttons:
+ *
+ * REDRAW_PENDING:             Non-zero means a DoWhenIdle handler
+ *                             has already been queued to redraw
+ *                             this window.
+ * SELECTED:                   Non-zero means this button is selected,
+ *                             so special highlight should be drawn.
+ */
+
+#define REDRAW_PENDING         1
+#define SELECTED               2
+
+/*
+ * Mask values used to selectively enable entries in the
+ * configuration specs:
+ */
+
+#define LABEL_MASK             TK_CONFIG_USER_BIT
+#define BUTTON_MASK            TK_CONFIG_USER_BIT << 1
+#define CHECK_BUTTON_MASK      TK_CONFIG_USER_BIT << 2
+#define RADIO_BUTTON_MASK      TK_CONFIG_USER_BIT << 3
+#define ALL_MASK               (LABEL_MASK | BUTTON_MASK \
+       | CHECK_BUTTON_MASK | RADIO_BUTTON_MASK)
+
+static int configFlags[] = {LABEL_MASK, BUTTON_MASK,
+       CHECK_BUTTON_MASK, RADIO_BUTTON_MASK};
+/*
+ * Information used for parsing configuration specs:
+ */
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground",
+       DEF_BUTTON_ACTIVE_BG_COLOR, Tk_Offset(Button, activeBorder),
+       BUTTON_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK
+       |TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground",
+       DEF_BUTTON_ACTIVE_BG_MONO, Tk_Offset(Button, activeBorder),
+       BUTTON_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK
+       |TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_COLOR, "-activeforeground", "activeForeground", "Background",
+       DEF_BUTTON_ACTIVE_FG_COLOR, Tk_Offset(Button, activeFg), 
+       BUTTON_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK
+       |TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_COLOR, "-activeforeground", "activeForeground", "Background",
+       DEF_BUTTON_ACTIVE_FG_MONO, Tk_Offset(Button, activeFg), 
+       BUTTON_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK
+       |TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_ANCHOR, "-anchor", "anchor", "Anchor",
+       DEF_BUTTON_ANCHOR, Tk_Offset(Button, anchor), ALL_MASK},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_BUTTON_BG_COLOR, Tk_Offset(Button, normalBorder),
+       ALL_MASK | TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_BUTTON_BG_MONO, Tk_Offset(Button, normalBorder),
+       ALL_MASK | TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,
+       (char *) NULL, 0, ALL_MASK},
+    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
+       (char *) NULL, 0, ALL_MASK},
+#if defined(USE_XPM3)
+    {TK_CONFIG_PIXMAP, "-bitmap", "bitmap", "Bitmap",
+       DEF_BUTTON_BITMAP, Tk_Offset(Button, bitmap),
+       ALL_MASK|TK_CONFIG_NULL_OK},
+#else
+    {TK_CONFIG_BITMAP, "-bitmap", "bitmap", "Bitmap",
+       DEF_BUTTON_BITMAP, Tk_Offset(Button, bitmap),
+       ALL_MASK|TK_CONFIG_NULL_OK},
+#endif
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       DEF_BUTTON_BORDER_WIDTH, Tk_Offset(Button, borderWidth), ALL_MASK},
+    {TK_CONFIG_STRING, "-command", "command", "Command",
+       DEF_BUTTON_COMMAND, Tk_Offset(Button, command),
+       BUTTON_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK},
+    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",
+       DEF_BUTTON_CURSOR, Tk_Offset(Button, cursor),
+       ALL_MASK|TK_CONFIG_NULL_OK},
+    {TK_CONFIG_COLOR, "-disabledforeground", "disabledForeground",
+       "DisabledForeground", DEF_BUTTON_DISABLED_FG_COLOR,
+       Tk_Offset(Button, disabledFg), BUTTON_MASK|CHECK_BUTTON_MASK
+       |RADIO_BUTTON_MASK|TK_CONFIG_COLOR_ONLY|TK_CONFIG_NULL_OK},
+    {TK_CONFIG_COLOR, "-disabledforeground", "disabledForeground",
+       "DisabledForeground", DEF_BUTTON_DISABLED_FG_MONO,
+       Tk_Offset(Button, disabledFg), BUTTON_MASK|CHECK_BUTTON_MASK
+       |RADIO_BUTTON_MASK|TK_CONFIG_MONO_ONLY|TK_CONFIG_NULL_OK},
+    {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,
+       (char *) NULL, 0, ALL_MASK},
+    {TK_CONFIG_FONT, "-font", "font", "Font",
+       DEF_BUTTON_FONT, Tk_Offset(Button, fontPtr),
+       ALL_MASK},
+    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",
+       DEF_BUTTON_FG, Tk_Offset(Button, normalFg), ALL_MASK},
+    {TK_CONFIG_INT, "-height", "height", "Height",
+       DEF_BUTTON_HEIGHT, Tk_Offset(Button, height), ALL_MASK},
+    {TK_CONFIG_STRING, "-offvalue", "offValue", "Value",
+       DEF_BUTTON_OFF_VALUE, Tk_Offset(Button, offValue),
+       CHECK_BUTTON_MASK},
+    {TK_CONFIG_STRING, "-onvalue", "onValue", "Value",
+       DEF_BUTTON_ON_VALUE, Tk_Offset(Button, onValue),
+       CHECK_BUTTON_MASK},
+    {TK_CONFIG_PIXELS, "-padx", "padX", "Pad",
+       DEF_BUTTON_PADX, Tk_Offset(Button, padX), ALL_MASK},
+    {TK_CONFIG_PIXELS, "-pady", "padY", "Pad",
+       DEF_BUTTON_PADY, Tk_Offset(Button, padY), ALL_MASK},
+    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
+       DEF_BUTTON_RELIEF, Tk_Offset(Button, relief), 
+       BUTTON_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK},
+    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
+       DEF_LABEL_RELIEF, Tk_Offset(Button, relief), LABEL_MASK},
+    {TK_CONFIG_COLOR, "-selector", "selector", "Foreground",
+       DEF_BUTTON_SELECTOR_COLOR, Tk_Offset(Button, selectorFg),
+       CHECK_BUTTON_MASK|RADIO_BUTTON_MASK|TK_CONFIG_COLOR_ONLY
+       |TK_CONFIG_NULL_OK},
+    {TK_CONFIG_COLOR, "-selector", "selector", "Foreground",
+       DEF_BUTTON_SELECTOR_MONO, Tk_Offset(Button, selectorFg),
+       CHECK_BUTTON_MASK|RADIO_BUTTON_MASK|TK_CONFIG_MONO_ONLY
+       |TK_CONFIG_NULL_OK},
+    {TK_CONFIG_UID, "-state", "state", "State",
+       DEF_BUTTON_STATE, Tk_Offset(Button, state),
+       BUTTON_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK},
+    {TK_CONFIG_STRING, "-text", "text", "Text",
+       DEF_BUTTON_TEXT, Tk_Offset(Button, text), ALL_MASK},
+    {TK_CONFIG_STRING, "-textvariable", "textVariable", "Variable",
+       DEF_BUTTON_TEXT_VARIABLE, Tk_Offset(Button, textVarName),
+       ALL_MASK|TK_CONFIG_NULL_OK},
+    {TK_CONFIG_STRING, "-value", "value", "Value",
+       DEF_BUTTON_VALUE, Tk_Offset(Button, onValue),
+       RADIO_BUTTON_MASK},
+    {TK_CONFIG_STRING, "-variable", "variable", "Variable",
+       DEF_RADIOBUTTON_VARIABLE, Tk_Offset(Button, selVarName),
+       RADIO_BUTTON_MASK},
+    {TK_CONFIG_STRING, "-variable", "variable", "Variable",
+       DEF_CHECKBUTTON_VARIABLE, Tk_Offset(Button, selVarName),
+       CHECK_BUTTON_MASK},
+    {TK_CONFIG_INT, "-width", "width", "Width",
+       DEF_BUTTON_WIDTH, Tk_Offset(Button, width), ALL_MASK},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * String to print out in error messages, identifying options for
+ * widget commands for different types of labels or buttons:
+ */
+
+static char *optionStrings[] = {
+    "configure",
+    "activate, configure, deactivate, flash, or invoke",
+    "activate, configure, deactivate, deselect, flash, invoke, select, or toggle",
+    "activate, configure, deactivate, deselect, flash, invoke, or select"
+};
+
+static int ButtonUpdateTime = 200; // Added by Don.
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            ButtonEventProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static char *          ButtonTextVarProc _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, char *name1, char *name2,
+                           int flags));
+static char *          ButtonVarProc _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, char *name1, char *name2,
+                           int flags));
+static int             ButtonWidgetCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+static void            ComputeButtonGeometry _ANSI_ARGS_((Button *butPtr));
+static int             ConfigureButton _ANSI_ARGS_((Tcl_Interp *interp,
+                           Button *butPtr, int argc, char **argv,
+                           int flags));
+static void            DestroyButton _ANSI_ARGS_((ClientData clientData));
+static void            DisplayButton _ANSI_ARGS_((ClientData clientData));
+static int             InvokeButton  _ANSI_ARGS_((Button *butPtr));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_ButtonCmd --
+ *
+ *     This procedure is invoked to process the "button", "label",
+ *     "radiobutton", and "checkbutton" Tcl commands.  See the
+ *     user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_ButtonCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    register Button *butPtr;
+    int type;
+    Tk_Window tkwin = (Tk_Window) clientData;
+    Tk_Window new;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args:  should be \"",
+               argv[0], " pathName ?options?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    switch (argv[0][0]) {
+       case 'l':
+           type = TYPE_LABEL;
+           break;
+       case 'b':
+           type = TYPE_BUTTON;
+           break;
+       case 'c':
+           type = TYPE_CHECK_BUTTON;
+           break;
+       case 'r':
+           type = TYPE_RADIO_BUTTON;
+           break;
+       default:
+           sprintf(interp->result,
+                   "unknown button-creation command \"%.50s\"");
+           return TCL_ERROR;
+    }
+
+    /*
+     * Create the new window.
+     */
+
+    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], (char *) NULL);
+    if (new == NULL) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * Initialize the data structure for the button.
+     */
+
+    butPtr = (Button *) ckalloc(sizeof(Button));
+    butPtr->tkwin = new;
+    butPtr->interp = interp;
+    butPtr->type = type;
+    butPtr->text = NULL;
+    butPtr->textVarName = NULL;
+    butPtr->bitmap = None;
+    butPtr->state = tkNormalUid;
+    butPtr->normalBorder = NULL;
+    butPtr->activeBorder = NULL;
+    butPtr->borderWidth = 0;
+    butPtr->relief = TK_RELIEF_FLAT;
+    butPtr->fontPtr = NULL;
+    butPtr->normalFg = NULL;
+    butPtr->activeFg = NULL;
+    butPtr->disabledFg = NULL;
+    butPtr->normalTextGC = None;
+    butPtr->activeTextGC = None;
+    butPtr->gray = None;
+    butPtr->disabledGC = None;
+    butPtr->selectorFg = NULL;
+    butPtr->selectorGC = None;
+    butPtr->selVarName = NULL;
+    butPtr->onValue = NULL;
+    butPtr->offValue = NULL;
+    butPtr->cursor = None;
+    butPtr->command = NULL;
+    butPtr->flags = 0;
+    butPtr->updateTimerToken = 0;
+
+    Tk_SetClass(new, classNames[type]);
+//fprintf(stderr, "ButtonWidgetCmd Made %s %s\n", Tk_Class(butPtr->tkwin), Tk_PathName(butPtr->tkwin));
+    Tk_CreateEventHandler(butPtr->tkwin, ExposureMask|StructureNotifyMask,
+           ButtonEventProc, (ClientData) butPtr);
+    Tcl_CreateCommand(interp, Tk_PathName(butPtr->tkwin), ButtonWidgetCmd,
+           (ClientData) butPtr, (void (*)()) NULL);
+    if (ConfigureButton(interp, butPtr, argc-2, argv+2,
+           configFlags[type]) != TCL_OK) {
+       Tk_DestroyWindow(butPtr->tkwin);
+       return TCL_ERROR;
+    }
+
+    interp->result = Tk_PathName(butPtr->tkwin);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ButtonWidgetCmd --
+ *
+ *     This procedure is invoked to process the Tcl command
+ *     that corresponds to a widget managed by this module.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ButtonWidgetCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Information about button widget. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    register Button *butPtr = (Button *) clientData;
+    int result = TCL_OK;
+    int length;
+    char c;
+
+    if (argc < 2) {
+       sprintf(interp->result,
+               "wrong # args: should be \"%.50s option [arg arg ...]\"",
+               argv[0]);
+       return TCL_ERROR;
+    }
+    Tk_Preserve((ClientData) butPtr);
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'a') && (strncmp(argv[1], "activate", length) == 0)
+           && (butPtr->type != TYPE_LABEL)) {
+       if (argc > 2) {
+           sprintf(interp->result,
+                   "wrong # args: should be \"%.50s activate\"",
+                   argv[0]);
+           goto error;
+       }
+       if (butPtr->state != tkDisabledUid) {
+           butPtr->state = tkActiveUid;
+           Tk_SetBackgroundFromBorder(butPtr->tkwin, butPtr->activeBorder);
+           goto redisplay;
+       }
+    } else if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)) {
+       if (argc == 2) {
+           result = Tk_ConfigureInfo(interp, butPtr->tkwin, configSpecs,
+                   (char *) butPtr, (char *) NULL, configFlags[butPtr->type]);
+       } else if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, butPtr->tkwin, configSpecs,
+                   (char *) butPtr, argv[2],
+                   configFlags[butPtr->type]);
+       } else {
+           result = ConfigureButton(interp, butPtr, argc-2, argv+2,
+                   configFlags[butPtr->type] | TK_CONFIG_ARGV_ONLY);
+       }
+    } else if ((c == 'd') && (strncmp(argv[1], "deactivate", length) == 0)
+           && (length > 2) && (butPtr->type != TYPE_LABEL)) {
+       if (argc > 2) {
+           sprintf(interp->result,
+                   "wrong # args: should be \"%.50s deactivate\"",
+                   argv[0]);
+           goto error;
+       }
+       if (butPtr->state != tkDisabledUid) {
+           butPtr->state = tkNormalUid;
+           Tk_SetBackgroundFromBorder(butPtr->tkwin, butPtr->normalBorder);
+           goto redisplay;
+       }
+    } else if ((c == 'd') && (strncmp(argv[1], "deselect", length) == 0)
+           && (length > 2) && (butPtr->type >= TYPE_CHECK_BUTTON)) {
+       if (argc > 2) {
+           sprintf(interp->result,
+                   "wrong # args: should be \"%.50s deselect\"",
+                   argv[0]);
+           goto error;
+       }
+       if (butPtr->type == TYPE_CHECK_BUTTON) {
+           Tcl_SetVar(interp, butPtr->selVarName, butPtr->offValue,
+                   TCL_GLOBAL_ONLY);
+       } else if (butPtr->flags & SELECTED) {
+           Tcl_SetVar(interp, butPtr->selVarName, "", TCL_GLOBAL_ONLY);
+       }
+    } else if ((c == 'f') && (strncmp(argv[1], "flash", length) == 0)
+       && (butPtr->type != TYPE_LABEL)) {
+       int i;
+
+       if (argc > 2) {
+           sprintf(interp->result,
+                   "wrong # args: should be \"%.50s flash\"",
+                   argv[0]);
+           goto error;
+       }
+       if (butPtr->state != tkDisabledUid) {
+           for (i = 0; i < 4; i++) {
+               butPtr->state = (butPtr->state == tkNormalUid)
+                       ? tkActiveUid : tkNormalUid;
+               Tk_SetBackgroundFromBorder(butPtr->tkwin,
+                       (butPtr->state == tkActiveUid) ? butPtr->activeBorder
+                       : butPtr->normalBorder);
+               DisplayButton((ClientData) butPtr);
+               XFlush(Tk_Display(butPtr->tkwin));
+               Tk_Sleep(50);
+           }
+       }
+    } else if ((c == 'i') && (strncmp(argv[1], "invoke", length) == 0)
+           && (butPtr->type > TYPE_LABEL)) {
+       if (argc > 2) {
+           sprintf(interp->result,
+                   "wrong # args: should be \"%.50s invoke\"",
+                   argv[0]);
+           goto error;
+       }
+       if (butPtr->state != tkDisabledUid) {
+           result = InvokeButton(butPtr);
+       }
+    } else if ((c == 's') && (strncmp(argv[1], "select", length) == 0)
+           && (butPtr->type >= TYPE_CHECK_BUTTON)) {
+       if (argc > 2) {
+           sprintf(interp->result,
+                   "wrong # args: should be \"%.50s select\"",
+                   argv[0]);
+           goto error;
+       }
+       Tcl_SetVar(interp, butPtr->selVarName, butPtr->onValue, TCL_GLOBAL_ONLY);
+    } else if ((c == 't') && (strncmp(argv[1], "toggle", length) == 0)
+           && (length >= 2) && (butPtr->type == TYPE_CHECK_BUTTON)) {
+       if (argc > 2) {
+           sprintf(interp->result,
+                   "wrong # args: should be \"%.50s select\"",
+                   argv[0]);
+           goto error;
+       }
+       if (butPtr->flags & SELECTED) {
+           Tcl_SetVar(interp, butPtr->selVarName, butPtr->offValue, TCL_GLOBAL_ONLY);
+       } else {
+           Tcl_SetVar(interp, butPtr->selVarName, butPtr->onValue, TCL_GLOBAL_ONLY);
+       }
+    } else {
+       sprintf(interp->result,
+               "bad option \"%.50s\":  must be %s", argv[1],
+               optionStrings[butPtr->type]);
+       goto error;
+    }
+    Tk_Release((ClientData) butPtr);
+    return result;
+
+    redisplay:
+    if (Tk_IsMapped(butPtr->tkwin) && !(butPtr->flags & REDRAW_PENDING)) {
+//Tk_TimerToken last = butPtr->updateTimerToken;
+       butPtr->flags |= REDRAW_PENDING;
+//     Tk_DoWhenIdle(DisplayButton, (ClientData) butPtr);
+       assert(butPtr->updateTimerToken == 0);
+       if (butPtr->updateTimerToken == 0) {
+         butPtr->updateTimerToken =
+           Tk_CreateTimerHandler(
+             ButtonUpdateTime,
+             DisplayButton,
+             (ClientData) butPtr);
+       }
+//fprintf(stderr, "ButtonWidgetCmd Set Timer %s %s was %d now %d\n", Tk_Class(butPtr->tkwin), Tk_PathName(butPtr->tkwin), last, butPtr->updateTimerToken);
+    }
+    Tk_Release((ClientData) butPtr);
+    return TCL_OK;
+
+    error:
+    Tk_Release((ClientData) butPtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyButton --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a button at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the widget is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyButton(clientData)
+    ClientData clientData;             /* Info about entry widget. */
+{
+    register Button *butPtr = (Button *) clientData;
+
+    if (butPtr->text != NULL) {
+       ckfree(butPtr->text);
+    }
+    if (butPtr->textVarName != NULL) {
+       Tcl_UntraceVar(butPtr->interp, butPtr->textVarName,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               ButtonTextVarProc, (ClientData) butPtr);
+       ckfree(butPtr->textVarName);
+    }
+    if (butPtr->bitmap != None) {
+#if defined(USE_XPM3)
+      Tk_FreePixmap(butPtr->bitmap);
+#else
+      Tk_FreeBitmap(butPtr->bitmap);
+#endif
+    }
+    if (butPtr->normalBorder != NULL) {
+       Tk_Free3DBorder(butPtr->normalBorder);
+    }
+    if (butPtr->activeBorder != NULL) {
+       Tk_Free3DBorder(butPtr->activeBorder);
+    }
+    if (butPtr->fontPtr != NULL) {
+       Tk_FreeFontStruct(butPtr->fontPtr);
+    }
+    if (butPtr->normalFg != NULL) {
+       Tk_FreeColor(butPtr->normalFg);
+    }
+    if (butPtr->disabledFg != NULL) {
+       Tk_FreeColor(butPtr->disabledFg);
+    }
+    if (butPtr->activeFg != NULL) {
+       Tk_FreeColor(butPtr->activeFg);
+    }
+    if (butPtr->normalTextGC != None) {
+       Tk_FreeGC(butPtr->normalTextGC);
+    }
+    if (butPtr->activeTextGC != None) {
+       Tk_FreeGC(butPtr->activeTextGC);
+    }
+    if (butPtr->gray != None) {
+       Tk_FreeBitmap(butPtr->gray);
+    }
+    if (butPtr->disabledGC != None) {
+       Tk_FreeGC(butPtr->disabledGC);
+    }
+    if (butPtr->selectorFg != NULL) {
+       Tk_FreeColor(butPtr->selectorFg);
+    }
+    if (butPtr->selectorGC != None) {
+       Tk_FreeGC(butPtr->selectorGC);
+    }
+    if (butPtr->selVarName != NULL) {
+       Tcl_UntraceVar(butPtr->interp, butPtr->selVarName,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               ButtonVarProc, (ClientData) butPtr);
+       ckfree(butPtr->selVarName);
+    }
+    if (butPtr->onValue != NULL) {
+       ckfree(butPtr->onValue);
+    }
+    if (butPtr->offValue != NULL) {
+       ckfree(butPtr->offValue);
+    }
+    if (butPtr->cursor != None) {
+       Tk_FreeCursor(butPtr->cursor);
+    }
+    if (butPtr->command != NULL) {
+       ckfree(butPtr->command);
+    }
+    if (butPtr->updateTimerToken != NULL) {
+       Tk_DeleteTimerHandler(butPtr->updateTimerToken);
+//fprintf(stderr, "DestroyButton Delete Timer was %d now 0\n", butPtr->updateTimerToken);
+       butPtr->updateTimerToken = 0;
+
+    }
+    ckfree((char *) butPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureButton --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or
+ *     reconfigure) a button widget.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information, such as text string, colors, font,
+ *     etc. get set for butPtr;  old resources get freed, if there
+ *     were any.  The button is redisplayed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureButton(interp, butPtr, argc, argv, flags)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    register Button *butPtr;   /* Information about widget;  may or may
+                                * not already have values for some fields. */
+    int argc;                  /* Number of valid entries in argv. */
+    char **argv;               /* Arguments. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    XGCValues gcValues;
+    GC newGC;
+    unsigned long mask;
+
+    /*
+     * Eliminate any existing trace on variables monitored by the button.
+     */
+
+    if (butPtr->textVarName != NULL) {
+       Tcl_UntraceVar(interp, butPtr->textVarName, 
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               ButtonTextVarProc, (ClientData) butPtr);
+    }
+    if (butPtr->selVarName != NULL) {
+       Tcl_UntraceVar(interp, butPtr->selVarName, 
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               ButtonVarProc, (ClientData) butPtr);
+    }
+
+    if (Tk_ConfigureWidget(interp, butPtr->tkwin, configSpecs,
+           argc, argv, (char *) butPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few options need special processing, such as setting the
+     * background from a 3-D border, or filling in complicated
+     * defaults that couldn't be specified to Tk_ConfigureWidget.
+     */
+
+    if (butPtr->state == tkActiveUid) {
+       Tk_SetBackgroundFromBorder(butPtr->tkwin, butPtr->activeBorder);
+    } else {
+       Tk_SetBackgroundFromBorder(butPtr->tkwin, butPtr->normalBorder);
+       if ((butPtr->state != tkNormalUid)
+               && (butPtr->state != tkDisabledUid)) {
+           Tcl_AppendResult(interp, "bad state value \"", butPtr->state,
+                   "\":  must be normal, active, or disabled", (char *) NULL);
+           butPtr->state = tkNormalUid;
+           return TCL_ERROR;
+       }
+    }
+
+    gcValues.font = butPtr->fontPtr->fid;
+    gcValues.foreground = butPtr->normalFg->pixel;
+    gcValues.background = Tk_3DBorderColor(butPtr->normalBorder)->pixel;
+
+    /*
+     * Note: GraphicsExpose events are disabled in normalTextGC because it's
+     * used to copy stuff from an off-screen pixmap onto the screen (we know
+     * that there's no problem with obscured areas).
+     */
+
+    gcValues.graphics_exposures = False;
+    newGC = Tk_GetGC(butPtr->tkwin,
+           GCForeground|GCBackground|GCFont|GCGraphicsExposures, &gcValues);
+    if (butPtr->normalTextGC != None) {
+       Tk_FreeGC(butPtr->normalTextGC);
+    }
+    butPtr->normalTextGC = newGC;
+
+    if (butPtr->activeFg != NULL) {
+       gcValues.font = butPtr->fontPtr->fid;
+       gcValues.foreground = butPtr->activeFg->pixel;
+       gcValues.background = Tk_3DBorderColor(butPtr->activeBorder)->pixel;
+       newGC = Tk_GetGC(butPtr->tkwin, GCForeground|GCBackground|GCFont,
+               &gcValues);
+       if (butPtr->activeTextGC != None) {
+           Tk_FreeGC(butPtr->activeTextGC);
+       }
+       butPtr->activeTextGC = newGC;
+    }
+
+    gcValues.font = butPtr->fontPtr->fid;
+    gcValues.background = Tk_3DBorderColor(butPtr->normalBorder)->pixel;
+    if (butPtr->disabledFg != NULL) {
+       gcValues.foreground = butPtr->disabledFg->pixel;
+       mask = GCForeground|GCBackground|GCFont;
+    } else {
+       gcValues.foreground = gcValues.background;
+       if (butPtr->gray == None) {
+           butPtr->gray = Tk_GetBitmap(interp, butPtr->tkwin,
+                   Tk_GetUid("gray50"));
+           if (butPtr->gray == None) {
+               return TCL_ERROR;
+           }
+       }
+       gcValues.fill_style = FillStippled;
+       gcValues.stipple = butPtr->gray;
+       mask = GCForeground|GCFillStyle|GCStipple;
+    }
+    newGC = Tk_GetGC(butPtr->tkwin, mask, &gcValues);
+    if (butPtr->disabledGC != None) {
+       Tk_FreeGC(butPtr->disabledGC);
+    }
+    butPtr->disabledGC = newGC;
+
+    if (butPtr->padX < 0) {
+       butPtr->padX = 0;
+    }
+    if (butPtr->padY < 0) {
+       butPtr->padY = 0;
+    }
+
+    if (butPtr->type >= TYPE_CHECK_BUTTON) {
+       char *value;
+
+       if (butPtr->selectorFg != NULL) {
+           gcValues.foreground = butPtr->selectorFg->pixel;
+           newGC = Tk_GetGC(butPtr->tkwin, GCForeground, &gcValues);
+       } else {
+           newGC = None;
+       }
+       if (butPtr->selectorGC != None) {
+           Tk_FreeGC(butPtr->selectorGC);
+       }
+       butPtr->selectorGC = newGC;
+
+       if (butPtr->selVarName == NULL) {
+           butPtr->selVarName = (char *) ckalloc((unsigned)
+                   (strlen(Tk_Name(butPtr->tkwin)) + 1));
+           strcpy(butPtr->selVarName, Tk_Name(butPtr->tkwin));
+       }
+       if (butPtr->onValue == NULL) {
+           butPtr->onValue = (char *) ckalloc((unsigned)
+                   (strlen(Tk_Name(butPtr->tkwin)) + 1));
+           strcpy(butPtr->onValue, Tk_Name(butPtr->tkwin));
+       }
+
+       /*
+        * Select the button if the associated variable has the
+        * appropriate value, initialize the variable if it doesn't
+        * exist, then set a trace on the variable to monitor future
+        * changes to its value.
+        */
+
+       value = Tcl_GetVar(interp, butPtr->selVarName, TCL_GLOBAL_ONLY);
+       butPtr->flags &= ~SELECTED;
+       if (value != NULL) {
+           if (strcmp(value, butPtr->onValue) == 0) {
+               butPtr->flags |= SELECTED;
+           }
+       } else {
+           Tcl_SetVar(interp, butPtr->selVarName,
+                   (butPtr->type == TYPE_CHECK_BUTTON) ? butPtr->offValue : "",
+                   TCL_GLOBAL_ONLY);
+       }
+       Tcl_TraceVar(interp, butPtr->selVarName,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               ButtonVarProc, (ClientData) butPtr);
+    }
+
+    /*
+     * If the button is to display the value of a variable, then set up
+     * a trace on the variable's value, create the variable if it doesn't
+     * exist, and fetch its current value.
+     */
+
+    if ((butPtr->bitmap == None) && (butPtr->textVarName != NULL)) {
+       char *value;
+
+       value = Tcl_GetVar(interp, butPtr->textVarName, TCL_GLOBAL_ONLY);
+       if (value == NULL) {
+           Tcl_SetVar(interp, butPtr->textVarName, butPtr->text,
+                   TCL_GLOBAL_ONLY);
+       } else {
+           if (butPtr->text != NULL) {
+               ckfree(butPtr->text);
+           }
+           butPtr->text = ckalloc((unsigned) (strlen(value) + 1));
+           strcpy(butPtr->text, value);
+       }
+       Tcl_TraceVar(interp, butPtr->textVarName,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               ButtonTextVarProc, (ClientData) butPtr);
+    }
+
+    ComputeButtonGeometry(butPtr);
+
+    /*
+     * Lastly, arrange for the button to be redisplayed.
+     */
+
+    if (Tk_IsMapped(butPtr->tkwin) && !(butPtr->flags & REDRAW_PENDING)) {
+//Tk_TimerToken last = butPtr->updateTimerToken;
+       butPtr->flags |= REDRAW_PENDING;
+//     Tk_DoWhenIdle(DisplayButton, (ClientData) butPtr);
+       assert(butPtr->updateTimerToken == 0);
+       if (butPtr->updateTimerToken == 0) {
+         butPtr->updateTimerToken =
+           Tk_CreateTimerHandler(
+             ButtonUpdateTime,
+             DisplayButton,
+             (ClientData) butPtr);
+       }
+//fprintf(stderr, "ConfigureButton Set Timer %s %s was %d now %d\n", Tk_Class(butPtr->tkwin), Tk_PathName(butPtr->tkwin), last, butPtr->updateTimerToken);
+    }
+
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DisplayButton --
+ *
+ *     This procedure is invoked to display a button widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Commands are output to X to display the button in its
+ *     current mode.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DisplayButton(clientData)
+    ClientData clientData;     /* Information about widget. */
+{
+    register Button *butPtr = (Button *) clientData;
+    GC gc;
+    Tk_3DBorder border;
+    Pixmap pixmap;
+    int x = 0;                 /* Initialization only needed to stop
+                                * compiler warning. */
+    int y;
+    register Tk_Window tkwin = butPtr->tkwin;
+
+//fprintf(stderr, "DisplayButton Handled Timer %s %s was %d now 0\n", Tk_Class(butPtr->tkwin), Tk_PathName(butPtr->tkwin), butPtr->updateTimerToken);
+
+    assert(butPtr->updateTimerToken != 0);
+    butPtr->updateTimerToken = 0;
+
+    butPtr->flags &= ~REDRAW_PENDING;
+    if ((butPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
+       return;
+    }
+
+    if ((butPtr->state == tkDisabledUid) && (butPtr->disabledFg != NULL)) {
+       gc = butPtr->disabledGC;
+       border = butPtr->normalBorder;
+    } else if (butPtr->state == tkActiveUid) {
+       gc = butPtr->activeTextGC;
+       border = butPtr->activeBorder;
+    } else {
+       gc = butPtr->normalTextGC;
+       border = butPtr->normalBorder;
+    }
+
+    /*
+     * In order to avoid screen flashes, this procedure redraws
+     * the button in a pixmap, then copies the pixmap to the
+     * screen in a single operation.  This means that there's no
+     * point in time where the on-sreen image has been cleared.
+     */
+
+    pixmap = XCreatePixmap(Tk_Display(tkwin), Tk_WindowId(tkwin),
+           Tk_Width(tkwin), Tk_Height(tkwin),
+           Tk_DefaultDepth(Tk_Screen(tkwin)));
+    Tk_Fill3DRectangle(Tk_Display(tkwin), pixmap, border,
+           0, 0, Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT);
+
+    /*
+     * Display bitmap or text for button.
+     */
+
+    if (butPtr->bitmap != None) {
+       unsigned int width, height;
+
+#if defined(USE_XPM3)
+       Tk_SizeOfPixmap(butPtr->bitmap, &width, &height);
+#else
+       Tk_SizeOfBitmap(butPtr->bitmap, &width, &height);
+#endif
+       switch (butPtr->anchor) {
+           case TK_ANCHOR_NW: case TK_ANCHOR_W: case TK_ANCHOR_SW:
+               x = butPtr->borderWidth + butPtr->selectorSpace
+                       + butPtr->padX + 1;
+               break;
+           case TK_ANCHOR_N: case TK_ANCHOR_CENTER: case TK_ANCHOR_S:
+               x = (Tk_Width(tkwin) + butPtr->selectorSpace - width)/2;
+               break;
+           default:
+               x = Tk_Width(tkwin) - butPtr->borderWidth - butPtr->padX
+                       - width - 1;
+               break;
+       }
+       switch (butPtr->anchor) {
+           case TK_ANCHOR_NW: case TK_ANCHOR_N: case TK_ANCHOR_NE:
+               y = butPtr->borderWidth + butPtr->padY + 1;
+               break;
+           case TK_ANCHOR_W: case TK_ANCHOR_CENTER: case TK_ANCHOR_E:
+               y = (Tk_Height(tkwin) - height)/2;
+               break;
+           default:
+               y = Tk_Height(tkwin) - butPtr->borderWidth - butPtr->padY
+                       - height - 1;
+               break;
+       }
+       if (butPtr->relief == TK_RELIEF_RAISED) {
+           x -= 1;
+           y -= 1;
+       } else if (butPtr->relief == TK_RELIEF_SUNKEN) {
+           x += 1;
+           y += 1;
+       }
+#if defined(USE_XPM3)        
+        XCopyArea(Tk_Display(tkwin), butPtr->bitmap, pixmap,
+                gc, 0, 0, width, height, x, y);
+#else
+       XCopyPlane(Tk_Display(tkwin), butPtr->bitmap, pixmap,
+               gc, 0, 0, width, height, x, y, 1);
+#endif
+       y += height/2;
+    } else {
+       switch (butPtr->anchor) {
+           case TK_ANCHOR_NW: case TK_ANCHOR_W: case TK_ANCHOR_SW:
+               x = butPtr->borderWidth + butPtr->padX + butPtr->selectorSpace
+                       + butPtr->leftBearing + 1;
+               break;
+           case TK_ANCHOR_N: case TK_ANCHOR_CENTER: case TK_ANCHOR_S:
+               x = (Tk_Width(tkwin) + butPtr->selectorSpace
+                       + butPtr->leftBearing - butPtr->rightBearing)/2;
+               break;
+           default:
+               x = Tk_Width(tkwin) - butPtr->borderWidth - butPtr->padX
+                       - butPtr->rightBearing - 1;
+               break;
+       }
+       switch (butPtr->anchor) {
+           case TK_ANCHOR_NW: case TK_ANCHOR_N: case TK_ANCHOR_NE:
+               y = butPtr->borderWidth + butPtr->fontPtr->ascent
+                       + butPtr->padY + 1;
+               break;
+           case TK_ANCHOR_W: case TK_ANCHOR_CENTER: case TK_ANCHOR_E:
+               y = (Tk_Height(tkwin) + butPtr->fontPtr->ascent
+                       - butPtr->fontPtr->descent)/2;
+               break;
+           default:
+               y = Tk_Height(tkwin) - butPtr->borderWidth - butPtr->padY
+                       - butPtr->fontPtr->descent - 1;
+               break;
+       }
+       if (butPtr->relief == TK_RELIEF_RAISED) {
+           x -= 1;
+           y -= 1;
+       } else if (butPtr->relief == TK_RELIEF_SUNKEN) {
+           x += 1;
+           y += 1;
+       }
+       XDrawString(Tk_Display(tkwin), pixmap, gc, x, y,
+               butPtr->text, butPtr->textLength);
+       y -= (butPtr->fontPtr->ascent - butPtr->fontPtr->descent)/2;
+       x -= butPtr->leftBearing;
+    }
+
+    /*
+     * Draw the selector for check buttons and radio buttons.  At this
+     * point x and y refer to the top-left corner of the text or bitmap.
+     */
+
+    if ((butPtr->type == TYPE_CHECK_BUTTON) && (butPtr->selectorGC != None)) {
+       int dim;
+
+       dim = butPtr->selectorDiameter;
+       x -= (butPtr->selectorSpace + butPtr->padX + dim)/2;
+       y -= dim/2;
+       Tk_Draw3DRectangle(Tk_Display(tkwin), pixmap, border, x, y,
+               dim, dim, butPtr->borderWidth, TK_RELIEF_SUNKEN);
+       x += butPtr->borderWidth;
+       y += butPtr->borderWidth;
+       dim -= 2*butPtr->borderWidth;
+       if (dim > 0) {
+           if (butPtr->flags & SELECTED) {
+               XFillRectangle(Tk_Display(tkwin), pixmap, butPtr->selectorGC,
+                       x, y, (unsigned int) dim, (unsigned int) dim);
+           } else {
+               Tk_Fill3DRectangle(Tk_Display(tkwin), pixmap,
+                       butPtr->normalBorder, x, y, dim, dim,
+                       butPtr->borderWidth, TK_RELIEF_FLAT);
+           }
+       }
+    } else if ((butPtr->type == TYPE_RADIO_BUTTON)
+           && (butPtr->selectorGC != None)) {
+       XPoint points[4];
+       int radius;
+
+       radius = butPtr->selectorDiameter/2;
+       points[0].x = x - (butPtr->selectorSpace + butPtr->padX
+               + butPtr->selectorDiameter)/2;
+       points[0].y = y;
+       points[1].x = points[0].x + radius;
+       points[1].y = points[0].y + radius;
+       points[2].x = points[1].x + radius;
+       points[2].y = points[0].y;
+       points[3].x = points[1].x;
+       points[3].y = points[0].y - radius;
+       if (butPtr->flags & SELECTED) {
+           XFillPolygon(Tk_Display(tkwin), pixmap, butPtr->selectorGC,
+                   points, 4, Convex, CoordModeOrigin);
+       } else {
+           Tk_Fill3DPolygon(Tk_Display(tkwin), pixmap, butPtr->normalBorder,
+                   points, 4, butPtr->borderWidth, TK_RELIEF_FLAT);
+       }
+       Tk_Draw3DPolygon(Tk_Display(tkwin), pixmap, border,
+               points, 4, butPtr->borderWidth, TK_RELIEF_RAISED);
+    }
+
+    /*
+     * If the button is disabled with a stipple rather than a special
+     * foreground color, generate the stippled effect.
+     */
+
+    if ((butPtr->state == tkDisabledUid) && (butPtr->disabledFg == NULL)) {
+       XFillRectangle(Tk_Display(tkwin), pixmap, butPtr->disabledGC,
+               butPtr->borderWidth, butPtr->borderWidth,
+               (unsigned) (Tk_Width(tkwin) - 2*butPtr->borderWidth),
+               (unsigned) (Tk_Height(tkwin) - 2*butPtr->borderWidth));
+    }
+
+    /*
+     * Draw the border last.  This way, if the button's contents
+     * overflow onto the border they'll be covered up by the border.
+     */
+
+    if (butPtr->relief != TK_RELIEF_FLAT) {
+       Tk_Draw3DRectangle(Tk_Display(tkwin), pixmap, border,0, 0,
+               Tk_Width(tkwin), Tk_Height(tkwin), butPtr->borderWidth,
+               butPtr->relief);
+    }
+
+    /*
+     * Copy the information from the off-screen pixmap onto the screen,
+     * then delete the pixmap.
+     */
+
+    XCopyArea(Tk_Display(tkwin), pixmap, Tk_WindowId(tkwin),
+       butPtr->normalTextGC, 0, 0, Tk_Width(tkwin), Tk_Height(tkwin), 0, 0);
+    XFreePixmap(Tk_Display(tkwin), pixmap);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ButtonEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher for various
+ *     events on buttons.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the window gets deleted, internal structures get
+ *     cleaned up.  When it gets exposed, it is redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ButtonEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    XEvent *eventPtr;          /* Information about event. */
+{
+    Button *butPtr = (Button *) clientData;
+    if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {
+       if ((butPtr->tkwin != NULL) && !(butPtr->flags & REDRAW_PENDING)) {
+//Tk_TimerToken last = butPtr->updateTimerToken;
+           butPtr->flags |= REDRAW_PENDING;
+//         Tk_DoWhenIdle(DisplayButton, (ClientData) butPtr);
+           assert(butPtr->updateTimerToken == NULL);
+           if (butPtr->updateTimerToken == NULL) {
+             butPtr->updateTimerToken =
+               Tk_CreateTimerHandler(
+                 ButtonUpdateTime,
+                 DisplayButton,
+                 (ClientData) butPtr);
+           } // if
+//fprintf(stderr, "ButtonEventProc Expose Set Timer %s %s was %d now %d\n", Tk_Class(butPtr->tkwin), Tk_PathName(butPtr->tkwin), last, butPtr->updateTimerToken);
+       }
+    } else if (eventPtr->type == DestroyNotify) {
+       Tcl_DeleteCommand(butPtr->interp, Tk_PathName(butPtr->tkwin));
+       butPtr->tkwin = NULL;
+       if (butPtr->flags & REDRAW_PENDING) {
+//fprintf(stderr, "ButtonEventProc Destroy Timer was %d now 0\n", butPtr->updateTimerToken);
+//         Tk_CancelIdleCall(DisplayButton, (ClientData) butPtr);
+           butPtr->flags &= ~REDRAW_PENDING;
+           assert(butPtr->updateTimerToken != NULL);
+           if (butPtr->updateTimerToken != NULL) {
+               Tk_DeleteTimerHandler(butPtr->updateTimerToken);
+               butPtr->updateTimerToken = 0;
+           }
+       }
+       Tk_EventuallyFree((ClientData) butPtr, DestroyButton);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ComputeButtonGeometry --
+ *
+ *     After changes in a button's text or bitmap, this procedure
+ *     recomputes the button's geometry and passes this information
+ *     along to the geometry manager for the window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The button's window may change size.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ComputeButtonGeometry(butPtr)
+    register Button *butPtr;   /* Button whose geometry may have changed. */
+{
+    XCharStruct bbox;
+    int dummy;
+    unsigned int width, height;
+
+    butPtr->selectorSpace = 0;
+    if (butPtr->bitmap != None) {
+#if defined(USE_XPM3)
+        Tk_SizeOfPixmap(butPtr->bitmap, &width, &height);
+#else
+        Tk_SizeOfBitmap(butPtr->bitmap, &width, &height);
+#endif
+       if (butPtr->width > 0) {
+           width = butPtr->width;
+       }
+       if (butPtr->height > 0) {
+           height = butPtr->height;
+       }
+       if ((butPtr->type >= TYPE_CHECK_BUTTON)
+               && (butPtr->selectorGC != None)) {
+           butPtr->selectorSpace = (14*height)/10;
+           if (butPtr->type == TYPE_CHECK_BUTTON) {
+               butPtr->selectorDiameter = (65*height)/100;
+           } else {
+               butPtr->selectorDiameter = (75*height)/100;
+           }
+       }
+    } else {
+       butPtr->textLength = strlen(butPtr->text);
+       XTextExtents(butPtr->fontPtr, butPtr->text, butPtr->textLength,
+               &dummy, &dummy, &dummy, &bbox);
+       butPtr->leftBearing = bbox.lbearing;
+       butPtr->rightBearing = bbox.rbearing;
+       width = bbox.lbearing + bbox.rbearing;
+       height = butPtr->fontPtr->ascent + butPtr->fontPtr->descent;
+       if (butPtr->width > 0) {
+           width = butPtr->width * XTextWidth(butPtr->fontPtr, "0", 1);
+       }
+       if (butPtr->height > 0) {
+           height *= butPtr->height;
+       }
+       if ((butPtr->type >= TYPE_CHECK_BUTTON)
+               && (butPtr->selectorGC != None)) {
+           butPtr->selectorDiameter = butPtr->fontPtr->ascent
+                   + butPtr->fontPtr->descent;
+           if (butPtr->type == TYPE_CHECK_BUTTON) {
+               butPtr->selectorDiameter = (80*butPtr->selectorDiameter)/100;
+           }
+           butPtr->selectorSpace = butPtr->selectorDiameter + butPtr->padX;
+       }
+    }
+
+    /*
+     * When issuing the geometry request, add extra space for the selector,
+     * if any, and for the border and padding, plus two extra pixels so the
+     * display can be offset by 1 pixel in either direction for the raised
+     * or lowered effect.
+     */
+
+    width += 2*butPtr->padX;
+    height += 2*butPtr->padY;
+    Tk_GeometryRequest(butPtr->tkwin, (int) (width + butPtr->selectorSpace
+           + 2*butPtr->borderWidth + 2),
+           (int) (height + 2*butPtr->borderWidth + 2));
+    Tk_SetInternalBorder(butPtr->tkwin, butPtr->borderWidth);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * InvokeButton --
+ *
+ *     This procedure is called to carry out the actions associated
+ *     with a button, such as invoking a Tcl command or setting a
+ *     variable.  This procedure is invoked, for example, when the
+ *     button is invoked via the mouse.
+ *
+ * Results:
+ *     A standard Tcl return value.  Information is also left in
+ *     interp->result.
+ *
+ * Side effects:
+ *     Depends on the button and its associated command.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+InvokeButton(butPtr)
+    register Button *butPtr;           /* Information about button. */
+{
+    if (butPtr->type == TYPE_CHECK_BUTTON) {
+       if (butPtr->flags & SELECTED) {
+           Tcl_SetVar(butPtr->interp, butPtr->selVarName, butPtr->offValue,
+                   TCL_GLOBAL_ONLY);
+       } else {
+           Tcl_SetVar(butPtr->interp, butPtr->selVarName, butPtr->onValue,
+                   TCL_GLOBAL_ONLY);
+       }
+    } else if (butPtr->type == TYPE_RADIO_BUTTON) {
+       Tcl_SetVar(butPtr->interp, butPtr->selVarName, butPtr->onValue,
+               TCL_GLOBAL_ONLY);
+    }
+    if ((butPtr->type != TYPE_LABEL) && (butPtr->command != NULL)) {
+       return Tcl_GlobalEval(butPtr->interp, butPtr->command);
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ButtonVarProc --
+ *
+ *     This procedure is invoked when someone changes the
+ *     state variable associated with a radio button.  Depending
+ *     on the new value of the button's variable, the button
+ *     may be selected or deselected.
+ *
+ * Results:
+ *     NULL is always returned.
+ *
+ * Side effects:
+ *     The button may become selected or deselected.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static char *
+ButtonVarProc(clientData, interp, name1, name2, flags)
+    ClientData clientData;     /* Information about button. */
+    Tcl_Interp *interp;                /* Interpreter containing variable. */
+    char *name1;               /* Name of variable. */
+    char *name2;               /* Second part of variable name. */
+    int flags;                 /* Information about what happened. */
+{
+    register Button *butPtr = (Button *) clientData;
+    char *value;
+
+    /*
+     * If the variable is being unset, then just re-establish the
+     * trace unless the whole interpreter is going away.
+     */
+
+    if (flags & TCL_TRACE_UNSETS) {
+       butPtr->flags &= ~SELECTED;
+       if ((flags & TCL_TRACE_DESTROYED) && !(flags & TCL_INTERP_DESTROYED)) {
+           Tcl_TraceVar2(interp, name1, name2,
+                   TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+                   ButtonVarProc, clientData);
+       }
+       goto redisplay;
+    }
+
+    /*
+     * Use the value of the variable to update the selected status of
+     * the button.
+     */
+
+    value = Tcl_GetVar2(interp, name1, name2, flags & TCL_GLOBAL_ONLY);
+    if (strcmp(value, butPtr->onValue) == 0) {
+       if (butPtr->flags & SELECTED) {
+           return (char *) NULL;
+       }
+       butPtr->flags |= SELECTED;
+    } else if (butPtr->flags & SELECTED) {
+       butPtr->flags &= ~SELECTED;
+    } else {
+       return (char *) NULL;
+    }
+
+    redisplay:
+    if ((butPtr->tkwin != NULL) && Tk_IsMapped(butPtr->tkwin)
+           && !(butPtr->flags & REDRAW_PENDING)) {
+//Tk_TimerToken last = butPtr->updateTimerToken;
+       butPtr->flags |= REDRAW_PENDING;
+//     Tk_DoWhenIdle(DisplayButton, (ClientData) butPtr);
+       assert(butPtr->updateTimerToken == NULL);
+       if (butPtr->updateTimerToken == NULL) {
+           butPtr->updateTimerToken =
+             Tk_CreateTimerHandler(
+               ButtonUpdateTime,
+               DisplayButton,
+               (ClientData) butPtr);
+       }
+//fprintf(stderr, "ButtonVarProc Set Timer %s %s was %d now %d\n", Tk_Class(butPtr->tkwin), Tk_PathName(butPtr->tkwin), last, butPtr->updateTimerToken);
+    }
+    return (char *) NULL;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ButtonTextVarProc --
+ *
+ *     This procedure is invoked when someone changes the variable
+ *     whose contents are to be displayed in a button.
+ *
+ * Results:
+ *     NULL is always returned.
+ *
+ * Side effects:
+ *     The text displayed in the button will change to match the
+ *     variable.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static char *
+ButtonTextVarProc(clientData, interp, name1, name2, flags)
+    ClientData clientData;     /* Information about button. */
+    Tcl_Interp *interp;                /* Interpreter containing variable. */
+    char *name1;               /* Name of variable. */
+    char *name2;               /* Second part of variable name. */
+    int flags;                 /* Information about what happened. */
+{
+    register Button *butPtr = (Button *) clientData;
+    char *value;
+
+    /*
+     * If the variable is unset, then immediately recreate it unless
+     * the whole interpreter is going away.
+     */
+
+    if (flags & TCL_TRACE_UNSETS) {
+       if ((flags & TCL_TRACE_DESTROYED) && !(flags & TCL_INTERP_DESTROYED)) {
+           Tcl_SetVar2(interp, name1, name2, butPtr->text,
+                   flags & TCL_GLOBAL_ONLY);
+           Tcl_TraceVar2(interp, name1, name2,
+                   TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+                   ButtonTextVarProc, clientData);
+       }
+       return (char *) NULL;
+    }
+
+    value = Tcl_GetVar2(interp, name1, name2, flags & TCL_GLOBAL_ONLY);
+    if (value == NULL) {
+       value = "";
+    }
+    if (butPtr->text != NULL) {
+       ckfree(butPtr->text);
+    }
+    butPtr->text = ckalloc((unsigned) (strlen(value) + 1));
+    strcpy(butPtr->text, value);
+    ComputeButtonGeometry(butPtr);
+
+    if ((butPtr->tkwin != NULL) && Tk_IsMapped(butPtr->tkwin)
+           && !(butPtr->flags & REDRAW_PENDING)) {
+//Tk_TimerToken last = butPtr->updateTimerToken;
+       butPtr->flags |= REDRAW_PENDING;
+//     Tk_DoWhenIdle(DisplayButton, (ClientData) butPtr);
+       assert(butPtr->updateTimerToken == NULL);
+       if (butPtr->updateTimerToken == NULL) {
+           butPtr->updateTimerToken =
+             Tk_CreateTimerHandler(
+               ButtonUpdateTime,
+               DisplayButton,
+               (ClientData) butPtr);
+       }
+//fprintf(stderr, "ButtonTextVarProc Set Timer %s %s was %d now %d\n", Tk_Class(butPtr->tkwin), Tk_PathName(butPtr->tkwin), last, butPtr->updateTimerToken);
+    }
+    return (char *) NULL;
+}
diff --git a/src/tk/tkcanvas.c b/src/tk/tkcanvas.c
new file mode 100644 (file)
index 0000000..653988c
--- /dev/null
@@ -0,0 +1,3633 @@
+/* 
+ * tkCanvas.c --
+ *
+ *     This module implements canvas widgets for the Tk toolkit.
+ *     A canvas displays a background and a collection of graphical
+ *     objects such as rectangles, lines, and texts.
+ *
+ * Copyright 1991-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkCanvas.c,v 1.28 92/08/19 08:47:57 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "default.h"
+#include "tkint.h"
+#include "tkconfig.h"
+#include "tkcanvas.h"
+
+/*
+ * See tkCanvas.h for key data structures used to implement canvases.
+ */
+
+/*
+ * The structure defined below is used to keep track of a tag search
+ * in progress.  Only the "prevPtr" field should be accessed by anyone
+ * other than StartTagSearch and NextItem.
+ */
+
+typedef struct TagSearch {
+    Tk_Canvas *canvasPtr;      /* Canvas widget being searched. */
+    Tk_Uid tag;                        /* Tag to search for.   0 means return
+                                * all items. */
+    Tk_Item *prevPtr;          /* Item just before last one found (or NULL
+                                * if last one found was first in the item
+                                * list of canvasPtr). */
+    Tk_Item *currentPtr;       /* Pointer to last item returned. */
+    int searchOver;            /* Non-zero means NextItem should always
+                                * return NULL. */
+} TagSearch;
+
+/*
+ * Information used for argv parsing.
+ */
+
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_CANVAS_BG_COLOR, Tk_Offset(Tk_Canvas, bgBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_COLOR, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(Tk_Canvas, bgColor),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_CANVAS_BG_MONO, Tk_Offset(Tk_Canvas, bgBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_COLOR, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(Tk_Canvas, bgColor),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       DEF_CANVAS_BORDER_WIDTH, Tk_Offset(Tk_Canvas, borderWidth), 0},
+    {TK_CONFIG_DOUBLE, "-closeenough", "closeEnough", "CloseEnough",
+       DEF_CANVAS_CLOSE_ENOUGH, Tk_Offset(Tk_Canvas, closeEnough), 0},
+    {TK_CONFIG_BOOLEAN, "-confine", "confine", "Confine",
+       DEF_CANVAS_CONFINE, Tk_Offset(Tk_Canvas, confine), 0},
+    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",
+       DEF_CANVAS_CURSOR, Tk_Offset(Tk_Canvas, cursor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_BORDER, "-cursorbackground", "cursorBackground", "Foreground",
+       DEF_CANVAS_CURSOR_BG, Tk_Offset(Tk_Canvas, cursorBorder), 0},
+    {TK_CONFIG_PIXELS, "-cursorborderwidth", "cursorBorderWidth", "BorderWidth",
+       DEF_CANVAS_CURSOR_BD_COLOR, Tk_Offset(Tk_Canvas, cursorBorderWidth),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_PIXELS, "-cursorborderwidth", "cursorBorderWidth", "BorderWidth",
+       DEF_CANVAS_CURSOR_BD_MONO, Tk_Offset(Tk_Canvas, cursorBorderWidth),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_INT, "-cursorofftime", "cursorOffTime", "OffTime",
+       DEF_CANVAS_CURSOR_OFF_TIME, Tk_Offset(Tk_Canvas, cursorOffTime), 0},
+    {TK_CONFIG_INT, "-cursorontime", "cursorOnTime", "OnTime",
+       DEF_CANVAS_CURSOR_ON_TIME, Tk_Offset(Tk_Canvas, cursorOnTime), 0},
+    {TK_CONFIG_PIXELS, "-cursorwidth", "cursorWidth", "CursorWidth",
+       DEF_CANVAS_CURSOR_WIDTH, Tk_Offset(Tk_Canvas, cursorWidth), 0},
+    {TK_CONFIG_PIXELS, "-height", "height", "Height",
+       DEF_CANVAS_HEIGHT, Tk_Offset(Tk_Canvas, height), 0},
+    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
+       DEF_CANVAS_RELIEF, Tk_Offset(Tk_Canvas, relief), 0},
+    {TK_CONFIG_PIXELS, "-scrollincrement", "scrollIncrement", "ScrollIncrement",
+       DEF_CANVAS_SCROLL_INCREMENT, Tk_Offset(Tk_Canvas, scrollIncrement), 0},
+    {TK_CONFIG_STRING, "-scrollregion", "scrollRegion", "ScrollRegion",
+       DEF_CANVAS_SCROLL_REGION, Tk_Offset(Tk_Canvas, regionString), 0},
+    {TK_CONFIG_BORDER, "-selectbackground", "selectBackground", "Foreground",
+       DEF_CANVAS_SELECT_COLOR, Tk_Offset(Tk_Canvas, selBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-selectbackground", "selectBackground", "Foreground",
+       DEF_CANVAS_SELECT_MONO, Tk_Offset(Tk_Canvas, selBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_PIXELS, "-selectborderwidth", "selectBorderWidth", "BorderWidth",
+       DEF_CANVAS_SELECT_BD_COLOR, Tk_Offset(Tk_Canvas, selBorderWidth),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_PIXELS, "-selectborderwidth", "selectBorderWidth", "BorderWidth",
+       DEF_CANVAS_SELECT_BD_MONO, Tk_Offset(Tk_Canvas, selBorderWidth),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_COLOR, "-selectforeground", "selectForeground", "Background",
+       DEF_CANVAS_SELECT_FG_COLOR, Tk_Offset(Tk_Canvas, selFgColorPtr),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_COLOR, "-selectforeground", "selectForeground", "Background",
+       DEF_CANVAS_SELECT_FG_MONO, Tk_Offset(Tk_Canvas, selFgColorPtr),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_PIXELS, "-width", "width", "Width",
+       DEF_CANVAS_WIDTH, Tk_Offset(Tk_Canvas, width), 0},
+    {TK_CONFIG_STRING, "-xscrollcommand", "xScrollCommand", "ScrollCommand",
+       DEF_CANVAS_X_SCROLL_CMD, Tk_Offset(Tk_Canvas, xScrollCmd), 0},
+    {TK_CONFIG_STRING, "-yscrollcommand", "yScrollCommand", "ScrollCommand",
+       DEF_CANVAS_Y_SCROLL_CMD, Tk_Offset(Tk_Canvas, yScrollCmd), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * List of all the item types known at present:
+ */
+
+static Tk_ItemType *typeList = NULL;   /* NULL means initialization hasn't
+                                        * been done yet. */
+
+/*
+ * Standard item types provided by Tk:
+ */
+
+extern Tk_ItemType TkArcType, TkBitmapType, TkLineType;
+extern Tk_ItemType TkOvalType, TkPolygonType;
+extern Tk_ItemType TkRectangleType, TkTextType, TkWindowType;
+
+/*
+ * Various Tk_Uid's used by this module (set up during initialization):
+ */
+
+static Tk_Uid allUid = NULL;
+static Tk_Uid currentUid = NULL;
+
+/*
+ * Statistics counters:
+ */
+
+static int numIdSearches;
+static int numSlowSearches;
+
+static int CanvasUpdateTime = 200; // Added by Don.
+
+/*
+ * Prototypes for procedures defined later in this file:
+ */
+
+static void            CanvasBindProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static void            CanvasBlinkProc _ANSI_ARGS_((ClientData clientData));
+static void            CanvasDoEvent _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           XEvent *eventPtr));
+static void            CanvasEventProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static int             CanvasFetchSelection _ANSI_ARGS_((
+                           ClientData clientData, int offset,
+                           char *buffer, int maxBytes));
+static void            CanvasFocusProc _ANSI_ARGS_((ClientData clientData,
+                           int gotFocus));
+static void            CanvasLostSelection _ANSI_ARGS_((
+                           ClientData clientData));
+static void            CanvasSelectTo _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, int index));
+static void            CanvasSetOrigin _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           int xOrigin, int yOrigin));
+static int             CanvasTagsParseProc _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, Tk_Window tkwin, char *value,
+                           char *widgRec, int offset));
+static char *          CanvasTagsPrintProc _ANSI_ARGS_((ClientData clientData,
+                           Tk_Window tkwin, char *widgRec, int offset,
+                           Tcl_FreeProc **freeProcPtr));
+static void            CanvasUpdateScrollbars _ANSI_ARGS_((
+                           Tk_Canvas *canvasPtr));
+static int             CanvasWidgetCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+static int             ConfigureCanvas _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Canvas *canvasPtr, int argc, char **argv,
+                           int flags));
+static void            DestroyCanvas _ANSI_ARGS_((ClientData clientData));
+static void            DisplayCanvas _ANSI_ARGS_((ClientData clientData));
+static void            DoItem _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Item *itemPtr, Tk_Uid tag));
+static void            EventuallyRedrawArea _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           int x1, int y1, int x2, int y2));
+static int             FindItems _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Canvas *canvasPtr, int argc, char **argv,
+                           char *newTag, char *cmdName, char *option));
+static int             FindArea _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Canvas *canvasPtr, char **argv, Tk_Uid uid,
+                           int enclosed));
+static double          GridAlign _ANSI_ARGS_((double coord, double spacing));
+static void            InitCanvas _ANSI_ARGS_((void));
+static Tk_Item *       NextItem _ANSI_ARGS_((TagSearch *searchPtr));
+static void            PickCurrentItem _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           XEvent *eventPtr));
+static void            RelinkItems _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           char *tag, Tk_Item *prevPtr));
+#if defined(USE_XPM3)
+static int             SaveCanvas _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Canvas *canvasPtr, char *fileName, int x,
+                           int y, unsigned int width, unsigned int height));
+#endif
+static Tk_Item *       StartTagSearch _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           char *tag, TagSearch *searchPtr));
+
+/*
+ * Custom option for handling "-tags" options for canvas items:
+ */
+
+Tk_CustomOption tkCanvasTagsOption = {
+    CanvasTagsParseProc,
+    CanvasTagsPrintProc,
+    (ClientData) NULL
+};
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_CanvasCmd --
+ *
+ *     This procedure is invoked to process the "canvas" Tcl
+ *     command.  See the user documentation for details on what
+ *     it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_CanvasCmd(clientData, interp, argc, argv)
+    ClientData clientData;             /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    register Tk_Canvas *canvasPtr;
+    Tk_Window new;
+
+    if (typeList == NULL) {
+       InitCanvas();
+    }
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args:  should be \"",
+               argv[0], " pathName ?options?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], (char *) NULL);
+    if (new == NULL) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * Initialize fields that won't be initialized by ConfigureCanvas,
+     * or which ConfigureCanvas expects to have reasonable values
+     * (e.g. resource pointers).
+     */
+
+    canvasPtr = (Tk_Canvas *) ckalloc(sizeof(Tk_Canvas));
+    canvasPtr->tkwin = new;
+    canvasPtr->interp = interp;
+    canvasPtr->firstItemPtr = NULL;
+    canvasPtr->lastItemPtr = NULL;
+    canvasPtr->bgBorder = NULL;
+    canvasPtr->bgColor = NULL;
+    canvasPtr->pixmapGC = None;
+    canvasPtr->selBorder = NULL;
+    canvasPtr->selFgColorPtr = NULL;
+    canvasPtr->selItemPtr = NULL;
+    canvasPtr->selectFirst = -1;
+    canvasPtr->selectLast = -1;
+    canvasPtr->cursorBorder = NULL;
+    canvasPtr->cursorBlinkHandler = (Tk_TimerToken) NULL;
+    canvasPtr->focusItemPtr = NULL;
+    canvasPtr->xOrigin = canvasPtr->yOrigin = 0;
+    canvasPtr->drawableXOrigin = canvasPtr->drawableYOrigin = 0;
+    canvasPtr->bindingTable = NULL;
+    canvasPtr->currentItemPtr = NULL;
+    canvasPtr->pickEvent.type = LeaveNotify;
+    canvasPtr->xScrollCmd = NULL;
+    canvasPtr->yScrollCmd = NULL;
+    canvasPtr->regionString = NULL;
+    canvasPtr->hotPtr = NULL;
+    canvasPtr->cursor = None;
+    canvasPtr->pixelsPerMM = WidthOfScreen(Tk_Screen(new));
+    canvasPtr->pixelsPerMM /= WidthMMOfScreen(Tk_Screen(new));
+    canvasPtr->flags = 0;
+    canvasPtr->nextId = 1;
+    canvasPtr->updateTimerToken = NULL;
+
+    Tk_SetClass(canvasPtr->tkwin, "Canvas");
+    Tk_CreateEventHandler(canvasPtr->tkwin, ExposureMask|StructureNotifyMask,
+           CanvasEventProc, (ClientData) canvasPtr);
+    Tk_CreateEventHandler(canvasPtr->tkwin, KeyPressMask|KeyReleaseMask
+           |ButtonPressMask|ButtonReleaseMask|EnterWindowMask
+           |LeaveWindowMask|PointerMotionMask, CanvasBindProc,
+           (ClientData) canvasPtr);
+    Tk_CreateSelHandler(canvasPtr->tkwin, XA_STRING, CanvasFetchSelection,
+           (ClientData) canvasPtr, XA_STRING);
+    Tcl_CreateCommand(interp, Tk_PathName(canvasPtr->tkwin), CanvasWidgetCmd,
+           (ClientData) canvasPtr, (void (*)()) NULL);
+    if (ConfigureCanvas(interp, canvasPtr, argc-2, argv+2, 0) != TCL_OK) {
+       goto error;
+    }
+    Tk_CreateFocusHandler(canvasPtr->tkwin, CanvasFocusProc,
+           (ClientData) canvasPtr);
+
+    interp->result = Tk_PathName(canvasPtr->tkwin);
+    return TCL_OK;
+
+    error:
+    Tk_DestroyWindow(canvasPtr->tkwin);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CanvasWidgetCmd --
+ *
+ *     This procedure is invoked to process the Tcl command
+ *     that corresponds to a widget managed by this module.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+CanvasWidgetCmd(clientData, interp, argc, argv)
+    ClientData clientData;             /* Information about canvas
+                                        * widget. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    register Tk_Canvas *canvasPtr = (Tk_Canvas *) clientData;
+    int length, result;
+    char c;
+    Tk_Item *itemPtr = NULL;           /* Initialization needed only to
+                                        * prevent compiler warning. */
+    TagSearch search;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    Tk_Preserve((ClientData) canvasPtr);
+    result = TCL_OK;
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'a') && (strncmp(argv[1], "addtag", length) == 0)) {
+       if (argc < 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " addtags tag searchCommand ?arg arg ...?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       result = FindItems(interp, canvasPtr, argc-3, argv+3, argv[2], argv[0],
+               " addtag tag");
+    } else if ((c == 'b') && (strncmp(argv[1], "bbox", length) == 0)
+           && (length >= 2)) {
+       int i, gotAny;
+       int x1 = 0, y1 = 0, x2 = 0, y2 = 0;     /* Initializations needed
+                                                * only to prevent compiler
+                                                * warnings. */
+
+       if (argc < 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " bbox tagOrId ?tagOrId ...?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       gotAny = 0;
+       for (i = 2; i < argc; i++) {
+           for (itemPtr = StartTagSearch(canvasPtr, argv[i], &search);
+                   itemPtr != NULL; itemPtr = NextItem(&search)) {
+               if (!gotAny) {
+                   x1 = itemPtr->x1;
+                   y1 = itemPtr->y1;
+                   x2 = itemPtr->x2;
+                   y2 = itemPtr->y2;
+                   gotAny = 1;
+               } else {
+                   if (itemPtr->x1 < x1) {
+                       x1 = itemPtr->x1;
+                   }
+                   if (itemPtr->y1 < y1) {
+                       y1 = itemPtr->y1;
+                   }
+                   if (itemPtr->x2 > x2) {
+                       x2 = itemPtr->x2;
+                   }
+                   if (itemPtr->y2 > y2) {
+                       y2 = itemPtr->y2;
+                   }
+               }
+           }
+       }
+       if (gotAny) {
+           sprintf(interp->result, "%d %d %d %d", x1, y1, x2, y2);
+       }
+    } else if ((c == 'b') && (strncmp(argv[1], "bind", length) == 0)
+           && (length >= 2)) {
+       ClientData object;
+
+       if ((argc < 3) || (argc > 5)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " bind tagOrId ?sequence? ?command?\"",
+                   (char *) NULL);
+           goto error;
+       }
+
+       /*
+        * Figure out what object to use for the binding (individual
+        * item vs. tag).
+        */
+
+       object = 0;
+       if (isdigit(argv[2][0])) {
+           int id;
+           char *end;
+
+           id = strtoul(argv[2], &end, 0);
+           if (*end != 0) {
+               goto bindByTag;
+           }
+           for (itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
+                   itemPtr = itemPtr->nextPtr) {
+               if (itemPtr->id == id) {
+                   object = (ClientData) itemPtr;
+                   break;
+               }
+           }
+           if (object == 0) {
+               Tcl_AppendResult(interp, "item \"", argv[2],
+                       "\" doesn't exist", (char *) NULL);
+               goto error;
+           }
+       } else {
+           bindByTag:
+           object = (ClientData) Tk_GetUid(argv[2]);
+       }
+
+       /*
+        * Make a binding table if the canvas doesn't already have
+        * one.
+        */
+
+       if (canvasPtr->bindingTable == NULL) {
+           canvasPtr->bindingTable = Tk_CreateBindingTable(interp);
+       }
+
+       if (argc == 5) {
+           int append = 0;
+           unsigned long mask;
+
+           if (argv[4][0] == 0) {
+               result = Tk_DeleteBinding(interp, canvasPtr->bindingTable,
+                       object, argv[3]);
+               goto done;
+           }
+           if (argv[4][0] == '+') {
+               argv[4]++;
+               append = 1;
+           }
+           mask = Tk_CreateBinding(interp, canvasPtr->bindingTable,
+                   object, argv[3], argv[4], append);
+           if (mask == 0) {
+               goto error;
+           }
+           if (mask & ~(ButtonMotionMask|Button1MotionMask|Button2MotionMask
+                   |Button3MotionMask|Button4MotionMask|Button5MotionMask
+                   |ButtonPressMask|ButtonReleaseMask|EnterWindowMask
+                   |LeaveWindowMask|KeyPressMask|KeyReleaseMask
+                   |PointerMotionMask)) {
+               Tk_DeleteBinding(interp, canvasPtr->bindingTable,
+                       object, argv[3]);
+               Tcl_ResetResult(interp);
+               Tcl_AppendResult(interp, "requested illegal events; ",
+                       "only key, button, motion, and enter/leave ",
+                       "events may be used", (char *) NULL);
+               goto error;
+           }
+       } else if (argc == 4) {
+           char *command;
+    
+           command = Tk_GetBinding(interp, canvasPtr->bindingTable,
+                   object, argv[3]);
+           if (command == NULL) {
+               goto error;
+           }
+           interp->result = command;
+       } else {
+           Tk_GetAllBindings(interp, canvasPtr->bindingTable, object);
+       }
+    } else if ((c == 'c') && (strcmp(argv[1], "canvasx") == 0)) {
+       int x;
+       double grid;
+
+       if ((argc < 3) || (argc > 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " canvasx screenx ?gridspacing?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       if (Tk_GetPixels(interp, canvasPtr->tkwin, argv[2], &x) != TCL_OK) {
+           goto error;
+       }
+       if (argc == 4) {
+           if (TkGetCanvasCoord(canvasPtr, argv[3], &grid) != TCL_OK) {
+               goto error;
+           }
+       } else {
+           grid = 0.0;
+       }
+       x += canvasPtr->xOrigin;
+       sprintf(interp->result, "%g", GridAlign((double) x, grid));
+    } else if ((c == 'c') && (strcmp(argv[1], "canvasy") == 0)) {
+       int y;
+       double grid;
+
+       if ((argc < 3) || (argc > 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " canvasy screeny ?gridspacing?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       if (Tk_GetPixels(interp, canvasPtr->tkwin, argv[2], &y) != TCL_OK) {
+           goto error;
+       }
+       if (argc == 4) {
+           if (TkGetCanvasCoord(canvasPtr, argv[3], &grid) != TCL_OK) {
+               goto error;
+           }
+       } else {
+           grid = 0.0;
+       }
+       y += canvasPtr->yOrigin;
+       sprintf(interp->result, "%g", GridAlign((double) y, grid));
+    } else if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)
+           && (length >= 3)) {
+       if (argc == 2) {
+           result = Tk_ConfigureInfo(interp, canvasPtr->tkwin, configSpecs,
+                   (char *) canvasPtr, (char *) NULL, 0);
+       } else if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, canvasPtr->tkwin, configSpecs,
+                   (char *) canvasPtr, argv[2], 0);
+       } else {
+           result = ConfigureCanvas(interp, canvasPtr, argc-2, argv+2,
+                   TK_CONFIG_ARGV_ONLY);
+       }
+    } else if ((c == 'c') && (strncmp(argv[1], "coords", length) == 0)
+           && (length >= 3)) {
+       if (argc < 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " coords tagOrId ?x y x y ...?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       itemPtr = StartTagSearch(canvasPtr, argv[2], &search);
+       if (itemPtr != NULL) {
+           if (argc != 3) {
+               EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+                   itemPtr->x2, itemPtr->y2);
+           }
+           if (itemPtr->typePtr->coordProc != NULL) {
+               result = (*itemPtr->typePtr->coordProc)(canvasPtr, itemPtr,
+                       argc-3, argv+3);
+           }
+           if (argc != 3) {
+               EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+                   itemPtr->x2, itemPtr->y2);
+           }
+       }
+    } else if ((c == 'c') && (strncmp(argv[1], "create", length) == 0)
+           && (length >= 2)) {
+       register Tk_ItemType *typePtr;
+       Tk_ItemType *matchPtr = NULL;
+       register Tk_Item *itemPtr;
+
+       if (argc < 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " create type ?arg arg ...?\"", (char *) NULL);
+           goto error;
+       }
+       c = argv[2][0];
+       length = strlen(argv[2]);
+       for (typePtr = typeList; typePtr != NULL; typePtr = typePtr->nextPtr) {
+           if ((c == typePtr->name[0])
+                   && (strncmp(argv[2], typePtr->name, length) == 0)) {
+               if (matchPtr != NULL) {
+                   badType:
+                   Tcl_AppendResult(interp,
+                           "unknown or ambiguous item type \"",
+                           argv[2], "\"", (char *) NULL);
+                   goto error;
+               }
+               matchPtr = typePtr;
+           }
+       }
+       if (matchPtr == NULL) {
+           goto badType;
+       }
+       typePtr = matchPtr;
+       itemPtr = (Tk_Item *) ckalloc((unsigned) typePtr->itemSize);
+       itemPtr->id = canvasPtr->nextId;
+       canvasPtr->nextId++;
+       itemPtr->tagPtr = itemPtr->staticTagSpace;
+       itemPtr->tagSpace = TK_TAG_SPACE;
+       itemPtr->numTags = 0;
+       itemPtr->typePtr = typePtr;
+       if ((*typePtr->createProc)(canvasPtr, itemPtr, argc-3, argv+3)
+               != TCL_OK) {
+           ckfree((char *) itemPtr);
+           goto error;
+       }
+       itemPtr->nextPtr = NULL;
+       canvasPtr->hotPtr = itemPtr;
+       canvasPtr->hotPrevPtr = canvasPtr->lastItemPtr;
+       if (canvasPtr->lastItemPtr == NULL) {
+           canvasPtr->firstItemPtr = itemPtr;
+       } else {
+           canvasPtr->lastItemPtr->nextPtr = itemPtr;
+       }
+       canvasPtr->lastItemPtr = itemPtr;
+       EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+               itemPtr->x2, itemPtr->y2);
+       canvasPtr->flags |= REPICK_NEEDED;
+       sprintf(interp->result, "%d", itemPtr->id);
+    } else if ((c == 'c') && (strncmp(argv[1], "cursor", length) == 0)
+           && (length >= 2)) {
+       int index;
+
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " cursor tagOrId index\"",
+                   (char *) NULL);
+           goto error;
+       }
+       for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search);
+               itemPtr != NULL; itemPtr = NextItem(&search)) {
+           if ((itemPtr->typePtr->indexProc == NULL)
+                   || (itemPtr->typePtr->cursorProc == NULL)) {
+               goto done;
+           }
+           if ((*itemPtr->typePtr->indexProc)(canvasPtr, itemPtr,
+                   argv[3], &index) != TCL_OK) {
+               goto error;
+           }
+           (*itemPtr->typePtr->cursorProc)(canvasPtr, itemPtr, index);
+           if ((itemPtr == canvasPtr->focusItemPtr)
+                   && (canvasPtr->flags & CURSOR_ON)) {
+               EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+                       itemPtr->x2, itemPtr->y2);
+           }
+       }
+    } else if ((c == 'd') && (strncmp(argv[1], "dchars", length) == 0)
+           && (length >= 2)) {
+       int first, last;
+
+       if ((argc != 4) && (argc != 5)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " dchars tagOrId first ?last?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search);
+               itemPtr != NULL; itemPtr = NextItem(&search)) {
+           if ((itemPtr->typePtr->indexProc == NULL)
+                   || (itemPtr->typePtr->dCharsProc == NULL)) {
+               continue;
+           }
+           if ((*itemPtr->typePtr->indexProc)(canvasPtr, itemPtr,
+                   argv[3], &first) != TCL_OK) {
+               goto error;
+           }
+           if (argc == 5) {
+               if ((*itemPtr->typePtr->indexProc)(canvasPtr, itemPtr,
+                       argv[4], &last) != TCL_OK) {
+                   goto error;
+               }
+           } else {
+               last = first;
+           }
+
+           /*
+            * Redraw both item's old and new areas:  it's possible
+            * that a delete could result in a new area larger than
+            * the old area.
+            */
+
+           EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+                   itemPtr->x2, itemPtr->y2);
+           result = (*itemPtr->typePtr->dCharsProc)(canvasPtr, itemPtr,
+                   first, last);
+           EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+                   itemPtr->x2, itemPtr->y2);
+           if (result != TCL_OK) {
+               goto error;
+           }
+       }
+    } else if ((c == 'd') && (strncmp(argv[1], "delete", length) == 0)
+           && (length >= 2)) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " delete tagOrId\"",
+                   (char *) NULL);
+           goto error;
+       }
+       for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search);
+               itemPtr != NULL; itemPtr = NextItem(&search)) {
+           EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+               itemPtr->x2, itemPtr->y2);
+           (*itemPtr->typePtr->deleteProc)(itemPtr);
+           if (itemPtr->tagPtr != itemPtr->staticTagSpace) {
+               ckfree((char *) itemPtr->tagPtr);
+           }
+           if (search.prevPtr == NULL) {
+               canvasPtr->firstItemPtr = itemPtr->nextPtr;
+               if (canvasPtr->firstItemPtr == NULL) {
+                   canvasPtr->lastItemPtr = NULL;
+               }
+           } else {
+               search.prevPtr->nextPtr = itemPtr->nextPtr;
+           }
+           if (canvasPtr->lastItemPtr == itemPtr) {
+               canvasPtr->lastItemPtr = search.prevPtr;
+           }
+           ckfree((char *) itemPtr);
+           if (itemPtr == canvasPtr->currentItemPtr) {
+               canvasPtr->currentItemPtr = NULL;
+               canvasPtr->flags |= REPICK_NEEDED;
+           }
+           if (itemPtr == canvasPtr->focusItemPtr) {
+               canvasPtr->focusItemPtr = NULL;
+           }
+           if (itemPtr == canvasPtr->selItemPtr) {
+               canvasPtr->selItemPtr = NULL;
+           }
+           if ((itemPtr == canvasPtr->hotPtr)
+                   || (itemPtr = canvasPtr->hotPrevPtr)) {
+               canvasPtr->hotPtr = NULL;
+           }
+       }
+    } else if ((c == 'd') && (strncmp(argv[1], "dtag", length) == 0)
+           && (length >= 2)) {
+       Tk_Uid tag;
+       int i;
+
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " dtag tagOrId ?tagToDelete?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       if (argc == 4) {
+           tag = Tk_GetUid(argv[3]);
+       } else {
+           tag = Tk_GetUid(argv[2]);
+       }
+       for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search);
+               itemPtr != NULL; itemPtr = NextItem(&search)) {
+           for (i = itemPtr->numTags-1; i >= 0; i--) {
+               if (itemPtr->tagPtr[i] == tag) {
+                   itemPtr->tagPtr[i] = itemPtr->tagPtr[itemPtr->numTags-1];
+                   itemPtr->numTags--;
+               }
+           }
+       }
+    } else if ((c == 'f') && (strncmp(argv[1], "find", length) == 0)
+           && (length >= 2)) {
+       if (argc < 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " find searchCommand ?arg arg ...?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       result = FindItems(interp, canvasPtr, argc-2, argv+2, (char *) NULL,
+               argv[0]," find");
+    } else if ((c == 'f') && (strncmp(argv[1], "focus", length) == 0)
+           && (length >= 2)) {
+       if (argc > 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " focus ?tagOrId?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       itemPtr = canvasPtr->focusItemPtr;
+       if (argc == 2) {
+           if (itemPtr != NULL) {
+               sprintf(interp->result, "%d", itemPtr->id);
+           }
+           goto done;
+       }
+       if ((itemPtr != NULL) && (canvasPtr->flags & GOT_FOCUS)) {
+           EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+                   itemPtr->x2, itemPtr->y2);
+       }
+       if (argv[2][0] == 0) {
+           canvasPtr->focusItemPtr = NULL;
+           goto done;
+       }
+       for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search);
+               itemPtr != NULL; itemPtr = NextItem(&search)) {
+           if (itemPtr->typePtr->cursorProc != NULL) {
+               break;
+           }
+       }
+       if (itemPtr == NULL) {
+           goto done;
+       }
+       canvasPtr->focusItemPtr = itemPtr;
+       if (canvasPtr->flags & GOT_FOCUS) {
+           EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+                   itemPtr->x2, itemPtr->y2);
+       }
+    } else if ((c == 'g') && (strncmp(argv[1], "gettags", length) == 0)) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " gettags tagOrId\"", (char *) NULL);
+           goto error;
+       }
+       itemPtr = StartTagSearch(canvasPtr, argv[2], &search);
+       if (itemPtr != NULL) {
+           int i;
+           for (i = 0; i < itemPtr->numTags; i++) {
+               Tcl_AppendElement(interp, (char *) itemPtr->tagPtr[i], 0);
+           }
+       }
+    } else if ((c == 'i') && (strncmp(argv[1], "index", length) == 0)
+           && (length >= 3)) {
+       int index;
+
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " index tagOrId string\"",
+                   (char *) NULL);
+           goto error;
+       }
+       for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search);
+               itemPtr != NULL; itemPtr = NextItem(&search)) {
+           if (itemPtr->typePtr->indexProc != NULL) {
+               break;
+           }
+       }
+       if (itemPtr == NULL) {
+           Tcl_AppendResult(interp, "can't find an indexable item \"",
+                   argv[2], "\"", (char *) NULL);
+           goto error;
+       }
+       if ((*itemPtr->typePtr->indexProc)(canvasPtr, itemPtr,
+               argv[3], &index) != TCL_OK) {
+           goto error;
+       }
+       sprintf(interp->result, "%d", index);
+    } else if ((c == 'i') && (strncmp(argv[1], "insert", length) == 0)
+           && (length >= 3)) {
+       int beforeThis;
+
+       if (argc != 5) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " insert tagOrId beforeThis string\"",
+                   (char *) NULL);
+           goto error;
+       }
+       for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search);
+               itemPtr != NULL; itemPtr = NextItem(&search)) {
+           if ((itemPtr->typePtr->indexProc == NULL)
+                   || (itemPtr->typePtr->insertProc == NULL)) {
+               continue;
+           }
+           if ((*itemPtr->typePtr->indexProc)(canvasPtr, itemPtr,
+                   argv[3], &beforeThis) != TCL_OK) {
+               goto error;
+           }
+
+           /*
+            * Redraw both item's old and new areas:  it's possible
+            * that an insertion could result in a new area either
+            * larger or smaller than the old area.
+            */
+
+           EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+                   itemPtr->x2, itemPtr->y2);
+           result = (*itemPtr->typePtr->insertProc)(canvasPtr, itemPtr,
+                   beforeThis, argv[4]);
+           EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+                   itemPtr->x2, itemPtr->y2);
+           if (result != TCL_OK) {
+               goto error;
+           }
+       }
+    } else if ((c == 'i') && (strncmp(argv[1], "itemconfigure", length) == 0)
+           && (length >= 2)) {
+       if (argc < 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " itemconfigure tagOrId ?option value ...?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search);
+               itemPtr != NULL; itemPtr = NextItem(&search)) {
+           if (argc == 3) {
+               result = Tk_ConfigureInfo(canvasPtr->interp, canvasPtr->tkwin,
+                       itemPtr->typePtr->configSpecs, (char *) itemPtr,
+                       (char *) NULL, 0);
+           } else if (argc == 4) {
+               result = Tk_ConfigureInfo(canvasPtr->interp, canvasPtr->tkwin,
+                       itemPtr->typePtr->configSpecs, (char *) itemPtr,
+                       argv[3], 0);
+           } else {
+               EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+                       itemPtr->x2, itemPtr->y2);
+               result = (*itemPtr->typePtr->configProc)(canvasPtr, itemPtr,
+                       argc-3, argv+3, TK_CONFIG_ARGV_ONLY);
+               EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+                       itemPtr->x2, itemPtr->y2);
+               canvasPtr->flags |= REPICK_NEEDED;
+           }
+           if ((result != TCL_OK) || (argc < 5)) {
+               break;
+           }
+       }
+    } else if ((c == 'l') && (strncmp(argv[1], "lower", length) == 0)) {
+       Tk_Item *prevPtr;
+
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " lower tagOrId ?belowThis?\"",
+                   (char *) NULL);
+           goto error;
+       }
+
+       /*
+        * First find the item just after which we'll insert the
+        * named items.
+        */
+
+       if (argc == 3) {
+           prevPtr = NULL;
+       } else {
+           prevPtr = StartTagSearch(canvasPtr, argv[3], &search);
+           if (prevPtr != NULL) {
+               prevPtr = search.prevPtr;
+           } else {
+               Tcl_AppendResult(interp, "tag \"", argv[3],
+                       "\" doesn't match any items", (char *) NULL);
+               goto error;
+           }
+       }
+       RelinkItems(canvasPtr, argv[2], prevPtr);
+    } else if ((c == 'm') && (strncmp(argv[1], "move", length) == 0)) {
+       double xAmount, yAmount;
+
+       if (argc != 5) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " move tagOrId xAmount yAmount\"",
+                   (char *) NULL);
+           goto error;
+       }
+       if ((TkGetCanvasCoord(canvasPtr, argv[3], &xAmount) != TCL_OK)
+               || (TkGetCanvasCoord(canvasPtr, argv[4], &yAmount) != TCL_OK)) {
+           goto error;
+       }
+       for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search);
+               itemPtr != NULL; itemPtr = NextItem(&search)) {
+           EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+               itemPtr->x2, itemPtr->y2);
+           (void) (*itemPtr->typePtr->translateProc)(canvasPtr, itemPtr,
+                   xAmount, yAmount);
+           EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+               itemPtr->x2, itemPtr->y2);
+           canvasPtr->flags |= REPICK_NEEDED;
+       }
+    } else if ((c == 'r') && (strncmp(argv[1], "raise", length) == 0)) {
+       Tk_Item *prevPtr;
+
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " raise tagOrId ?aboveThis?\"",
+                   (char *) NULL);
+           goto error;
+       }
+
+       /*
+        * First find the item just after which we'll insert the
+        * named items.
+        */
+
+       if (argc == 3) {
+           prevPtr = canvasPtr->lastItemPtr;
+       } else {
+           prevPtr = NULL;
+           for (itemPtr = StartTagSearch(canvasPtr, argv[3], &search);
+                   itemPtr != NULL; itemPtr = NextItem(&search)) {
+               prevPtr = itemPtr;
+           }
+           if (prevPtr == NULL) {
+               Tcl_AppendResult(interp, "tagOrId \"", argv[3],
+                       "\" doesn't match any items", (char *) NULL);
+               goto error;
+           }
+       }
+       RelinkItems(canvasPtr, argv[2], prevPtr);
+#if defined(USE_XPM3)
+    } else if ((c == 's') && (strncmp(argv[1], "save", length) == 0)
+           && (length >= 3)) {
+       if (argc != 3 && argc != 7) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " save fileName ?x y width height?\"",
+                   (char *) NULL);
+           goto error;
+       }
+        if (argc == 3) {
+           if (SaveCanvas(interp, canvasPtr, argv[2], 0, 0, 0, 0) != TCL_OK) {
+               goto error;
+           }
+        } else {
+           if (SaveCanvas(interp, canvasPtr, argv[2], atol(argv[3]),
+                   atol(argv[4]), atol(argv[5]), atol(argv[6]))) {
+               goto error;
+           }
+        }
+#endif
+    } else if ((c == 's') && (strncmp(argv[1], "scale", length) == 0)
+           && (length >= 3)) {
+       double xOrigin, yOrigin, xScale, yScale;
+
+       if (argc != 7) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " scale tagOrId xOrigin yOrigin xScale yScale\"",
+                   (char *) NULL);
+           goto error;
+       }
+       if ((TkGetCanvasCoord(canvasPtr, argv[3], &xOrigin) != TCL_OK)
+               || (TkGetCanvasCoord(canvasPtr, argv[4], &yOrigin) != TCL_OK)
+               || (Tcl_GetDouble(interp, argv[5], &xScale) != TCL_OK)
+               || (Tcl_GetDouble(interp, argv[6], &yScale) != TCL_OK)) {
+           goto error;
+       }
+       if ((xScale <= 0.0) || (yScale <= 0.0)) {
+           interp->result = "scale factors must be greater than zero";
+           goto error;
+       }
+       for (itemPtr = StartTagSearch(canvasPtr, argv[2], &search);
+               itemPtr != NULL; itemPtr = NextItem(&search)) {
+           EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+               itemPtr->x2, itemPtr->y2);
+           (void) (*itemPtr->typePtr->scaleProc)(canvasPtr, itemPtr,
+                   xOrigin, yOrigin, xScale, yScale);
+           EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+               itemPtr->x2, itemPtr->y2);
+           canvasPtr->flags |= REPICK_NEEDED;
+       }
+    } else if ((c == 's') && (strncmp(argv[1], "scan", length) == 0)
+           && (length >= 3)) {
+       int x, y;
+
+       if (argc != 5) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " scan mark|dragto x y\"", (char *) NULL);
+           goto error;
+       }
+       if ((Tcl_GetInt(interp, argv[3], &x) != TCL_OK)
+               || (Tcl_GetInt(interp, argv[4], &y) != TCL_OK)){
+           goto error;
+       }
+       if ((argv[2][0] == 'm')
+               && (strncmp(argv[2], "mark", strlen(argv[2])) == 0)) {
+           canvasPtr->scanX = x;
+           canvasPtr->scanXOrigin = canvasPtr->xOrigin;
+           canvasPtr->scanY = y;
+           canvasPtr->scanYOrigin = canvasPtr->yOrigin;
+       } else if ((argv[2][0] == 'd')
+               && (strncmp(argv[2], "dragto", strlen(argv[2])) == 0)) {
+           int newXOrigin, newYOrigin, tmp;
+
+           /*
+            * Compute a new view origin for the canvas, amplifying the
+            * mouse motion and rounding to the nearest multiple of the
+            * scroll increment.
+            */
+
+           tmp = canvasPtr->scanXOrigin - 10*(x - canvasPtr->scanX)
+                   - canvasPtr->scrollX1;
+           if (tmp >= 0) {
+               tmp = (tmp + canvasPtr->scrollIncrement/2)
+                       /canvasPtr->scrollIncrement;
+           } else {
+               tmp = -(((-tmp) + canvasPtr->scrollIncrement/2)
+                       /canvasPtr->scrollIncrement);
+           }
+           newXOrigin = canvasPtr->scrollX1 + tmp*canvasPtr->scrollIncrement;
+           tmp = canvasPtr->scanYOrigin - 10*(y - canvasPtr->scanY)
+                   - canvasPtr->scrollY1;
+           if (tmp >= 0) {
+               tmp = (tmp + canvasPtr->scrollIncrement/2)
+                       /canvasPtr->scrollIncrement;
+           } else {
+               tmp = -(((-tmp) + canvasPtr->scrollIncrement/2)
+                       /canvasPtr->scrollIncrement);
+           }
+           newYOrigin = canvasPtr->scrollY1 + tmp*canvasPtr->scrollIncrement;
+           CanvasSetOrigin(canvasPtr, newXOrigin, newYOrigin);
+       } else {
+           Tcl_AppendResult(interp, "bad scan option \"", argv[2],
+                   "\":  must be mark or dragto", (char *) NULL);
+           goto error;
+       }
+    } else if ((c == 's') && (strncmp(argv[1], "select", length) == 0)
+           && (length >= 2)) {
+       int index;
+
+       if (argc < 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " select option ?tagOrId? ?arg?\"", (char *) NULL);
+           goto error;
+       }
+       if (argc >= 4) {
+           for (itemPtr = StartTagSearch(canvasPtr, argv[3], &search);
+                   itemPtr != NULL; itemPtr = NextItem(&search)) {
+               if ((itemPtr->typePtr->indexProc != NULL)
+                       && (itemPtr->typePtr->selectionProc != NULL)){
+                   break;
+               }
+           }
+           if (itemPtr == NULL) {
+               Tcl_AppendResult(interp,
+                       "can't find an indexable and selectable item \"",
+                       argv[3], "\"", (char *) NULL);
+               goto error;
+           }
+       }
+       if (argc == 5) {
+           if ((*itemPtr->typePtr->indexProc)(canvasPtr, itemPtr,
+                   argv[4], &index) != TCL_OK) {
+               goto error;
+           }
+       }
+       length = strlen(argv[2]);
+       c = argv[2][0];
+       if ((c == 'a') && (strncmp(argv[2], "adjust", length) == 0)) {
+           if (argc != 5) {
+               Tcl_AppendResult(interp, "wrong # args: should be \"",
+                       argv[0], " select adjust tagOrId index\"",
+                       (char *) NULL);
+               goto error;
+           }
+           if (canvasPtr->selItemPtr == itemPtr) {
+               if (index < (canvasPtr->selectFirst
+                       + canvasPtr->selectLast)/2) {
+                   canvasPtr->selectAnchor = canvasPtr->selectLast + 1;
+               } else {
+                   canvasPtr->selectAnchor = canvasPtr->selectFirst;
+               }
+           }
+           CanvasSelectTo(canvasPtr, itemPtr, index);
+       } else if ((c == 'c') && (argv[2] != NULL)
+               && (strncmp(argv[2], "clear", length) == 0)) {
+           if (argc != 3) {
+               Tcl_AppendResult(interp, "wrong # args: should be \"",
+                       argv[0], " select clear\"", (char *) NULL);
+               goto error;
+           }
+           if (canvasPtr->selItemPtr != NULL) {
+               EventuallyRedrawArea(canvasPtr, canvasPtr->selItemPtr->x1,
+                   canvasPtr->selItemPtr->y1, canvasPtr->selItemPtr->x2,
+                   canvasPtr->selItemPtr->y2);
+               canvasPtr->selItemPtr = NULL;
+           }
+           goto done;
+       } else if ((c == 'f') && (strncmp(argv[2], "from", length) == 0)) {
+           if (argc != 5) {
+               Tcl_AppendResult(interp, "wrong # args: should be \"",
+                       argv[0], " select from tagOrId index\"",
+                       (char *) NULL);
+               goto error;
+           }
+           canvasPtr->anchorItemPtr = itemPtr;
+           canvasPtr->selectAnchor = index;
+       } else if ((c == 'i') && (strncmp(argv[2], "item", length) == 0)) {
+           if (argc != 3) {
+               Tcl_AppendResult(interp, "wrong # args: should be \"",
+                       argv[0], " select item\"", (char *) NULL);
+               goto error;
+           }
+           if (canvasPtr->selItemPtr != NULL) {
+               sprintf(interp->result, "%d", canvasPtr->selItemPtr->id);
+           }
+       } else if ((c == 't') && (strncmp(argv[2], "to", length) == 0)) {
+           if (argc != 5) {
+               Tcl_AppendResult(interp, "wrong # args: should be \"",
+                       argv[0], " select to tagOrId index\"",
+                       (char *) NULL);
+               goto error;
+           }
+           CanvasSelectTo(canvasPtr, itemPtr, index);
+       } else {
+           Tcl_AppendResult(interp, "bad select option \"", argv[2],
+                   "\": must be adjust, clear, from, item, or to",
+                   (char *) NULL);
+           goto error;
+       }
+    } else if ((c == 't') && (strncmp(argv[1], "type", length) == 0)) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " type tag\"", (char *) NULL);
+           goto error;
+       }
+       itemPtr = StartTagSearch(canvasPtr, argv[2], &search);
+       if (itemPtr != NULL) {
+           interp->result = itemPtr->typePtr->name;
+       }
+    } else if ((c == 'x') && (strncmp(argv[1], "xview", length) == 0)) {
+       int index;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " xview index\"", (char *) NULL);
+           goto error;
+       }
+       if (Tcl_GetInt(canvasPtr->interp, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       CanvasSetOrigin(canvasPtr,
+               (canvasPtr->scrollX1 + index*canvasPtr->scrollIncrement),
+               canvasPtr->yOrigin);
+    } else if ((c == 'y') && (strncmp(argv[1], "yview", length) == 0)) {
+       int index;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " yview index\"", (char *) NULL);
+           goto error;
+       }
+       if (Tcl_GetInt(canvasPtr->interp, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       CanvasSetOrigin(canvasPtr, canvasPtr->xOrigin,
+               (canvasPtr->scrollY1 + index*canvasPtr->scrollIncrement));
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\":  must be addtag, bbox, bind, ",
+               "canvasx, canvasy, configure, coords, create, ",
+               "cursor, dchars, delete, dtag, find, focus, ",
+               "gettags, index, insert, itemconfigure, lower, ",
+               "move, raise, scale, scan, select, type, xview, or yview",
+               (char *) NULL);  
+       goto error;
+    }
+    done:
+    Tk_Release((ClientData) canvasPtr);
+    return result;
+
+    error:
+    Tk_Release((ClientData) canvasPtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyCanvas --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a canvas at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the canvas is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyCanvas(clientData)
+    ClientData clientData;     /* Info about canvas widget. */
+{
+    register Tk_Canvas *canvasPtr = (Tk_Canvas *) clientData;
+    register Tk_Item *itemPtr;
+
+    for (itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
+           itemPtr = canvasPtr->firstItemPtr) {
+       canvasPtr->firstItemPtr = itemPtr->nextPtr;
+       (*itemPtr->typePtr->deleteProc)(itemPtr);
+       if (itemPtr->tagPtr != itemPtr->staticTagSpace) {
+           ckfree((char *) itemPtr->tagPtr);
+       }
+       ckfree((char *) itemPtr);
+    }
+
+    if (canvasPtr->bgBorder != NULL) {
+       Tk_Free3DBorder(canvasPtr->bgBorder);
+    }
+    if (canvasPtr->bgColor != NULL) {
+       Tk_FreeColor(canvasPtr->bgColor);
+    }
+    if (canvasPtr->pixmapGC != None) {
+       Tk_FreeGC(canvasPtr->pixmapGC);
+    }
+    if (canvasPtr->selBorder != NULL) {
+       Tk_Free3DBorder(canvasPtr->selBorder);
+    }
+    if (canvasPtr->selFgColorPtr != NULL) {
+       Tk_FreeColor(canvasPtr->selFgColorPtr);
+    }
+    if (canvasPtr->cursorBorder != NULL) {
+       Tk_Free3DBorder(canvasPtr->cursorBorder);
+    }
+    Tk_DeleteTimerHandler(canvasPtr->cursorBlinkHandler);
+    if (canvasPtr->bindingTable != NULL) {
+       Tk_DeleteBindingTable(canvasPtr->bindingTable);
+    }
+    if (canvasPtr->xScrollCmd != NULL) {
+       ckfree(canvasPtr->xScrollCmd);
+    }
+    if (canvasPtr->yScrollCmd != NULL) {
+       ckfree(canvasPtr->yScrollCmd);
+    }
+    if (canvasPtr->regionString != NULL) {
+       ckfree(canvasPtr->regionString);
+    }
+    if (canvasPtr->cursor != None) {
+       Tk_FreeCursor(canvasPtr->cursor);
+    }
+    ckfree((char *) canvasPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureCanvas --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or
+ *     reconfigure) a canvas widget.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information, such as colors, border width,
+ *     etc. get set for canvasPtr;  old resources get freed,
+ *     if there were any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureCanvas(interp, canvasPtr, argc, argv, flags)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    register Tk_Canvas *canvasPtr;     /* Information about widget;  may or may
+                                * not already have values for some fields. */
+    int argc;                  /* Number of valid entries in argv. */
+    char **argv;               /* Arguments. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    XGCValues gcValues;
+    GC new;
+
+    if (Tk_ConfigureWidget(interp, canvasPtr->tkwin, configSpecs,
+           argc, argv, (char *) canvasPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few options need special processing, such as setting the
+     * background from a 3-D border and creating a GC for copying
+     * bits to the screen.
+     */
+
+    Tk_SetBackgroundFromBorder(canvasPtr->tkwin, canvasPtr->bgBorder);
+
+    gcValues.function = GXcopy;
+    gcValues.foreground = canvasPtr->bgColor->pixel;
+    gcValues.graphics_exposures = False;
+    new = Tk_GetGC(canvasPtr->tkwin,
+           GCFunction|GCForeground|GCGraphicsExposures, &gcValues);
+    if (canvasPtr->pixmapGC != None) {
+       Tk_FreeGC(canvasPtr->pixmapGC);
+    }
+    canvasPtr->pixmapGC = new;
+
+    /*
+     * Reset the desired dimensions for the window.
+     */
+
+    Tk_GeometryRequest(canvasPtr->tkwin, canvasPtr->width, canvasPtr->height);
+
+    /*
+     * Restart the cursor timing sequence in case the on-time or off-time
+     * just changed.
+     */
+
+    if (canvasPtr->flags & GOT_FOCUS) {
+       CanvasFocusProc((ClientData) canvasPtr, 1);
+    }
+
+    /*
+     * Recompute the scroll region.
+     */
+
+    canvasPtr->scrollX1 = 0;
+    canvasPtr->scrollY1 = 0;
+    canvasPtr->scrollX2 = 0;
+    canvasPtr->scrollY2 = 0;
+    if (canvasPtr->regionString != NULL) {
+       int argc2;
+       char **argv2;
+
+       if (Tcl_SplitList(canvasPtr->interp, canvasPtr->regionString,
+               &argc2, &argv2) != TCL_OK) {
+           return TCL_ERROR;
+       }
+       if (argc2 != 4) {
+           badRegion:
+           Tcl_AppendResult(interp, "bad scrollRegion \"",
+                   canvasPtr->regionString, "\"", (char *) NULL);
+           ckfree(canvasPtr->regionString);
+           ckfree((char *) argv2);
+           canvasPtr->regionString = NULL;
+           return TCL_ERROR;
+       }
+       if ((Tk_GetPixels(canvasPtr->interp, canvasPtr->tkwin,
+                   argv2[0], &canvasPtr->scrollX1) != TCL_OK)
+               || (Tk_GetPixels(canvasPtr->interp, canvasPtr->tkwin,
+                   argv2[1], &canvasPtr->scrollY1) != TCL_OK)
+               || (Tk_GetPixels(canvasPtr->interp, canvasPtr->tkwin,
+                   argv2[2], &canvasPtr->scrollX2) != TCL_OK)
+               || (Tk_GetPixels(canvasPtr->interp, canvasPtr->tkwin,
+                   argv2[3], &canvasPtr->scrollY2) != TCL_OK)) {
+           goto badRegion;
+       }
+       ckfree((char *) argv2);
+    }
+
+    /*
+     * Reset the canvases origin (this is a no-op unless confine
+     * mode has just been turned on or the scroll region has changed).
+     */
+
+    CanvasSetOrigin(canvasPtr, canvasPtr->xOrigin, canvasPtr->yOrigin);
+    canvasPtr->flags |= UPDATE_SCROLLBARS;
+    EventuallyRedrawArea(canvasPtr, canvasPtr->xOrigin, canvasPtr->yOrigin,
+           canvasPtr->xOrigin + Tk_Width(canvasPtr->tkwin),
+           canvasPtr->yOrigin + Tk_Height(canvasPtr->tkwin));
+    return TCL_OK;
+}
+\f
+#if defined(USE_XPM3)
+//#include "xpmtk.h"
+#include <xpm.h>
+/*
+ *--------------------------------------------------------------
+ *
+ * SaveCanvas --
+ *
+ *     This procedure saves the contents of a canvas window.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     A pixmap is written to a file.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+SaveCanvas(interp, canvasPtr, fileName, x, y, width, height)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    register Tk_Canvas *canvasPtr;     /* Information about widget */
+    char *fileName;             /* the output file name. */
+    int x;                      /* upper left x coordinate. */
+    int y;                      /* upper left y coordinate. */
+    unsigned int width;         /* width of pixmap area to save. */
+    unsigned int height;        /* height of pixmap area to save. */
+{
+    register Tk_Window tkwin = canvasPtr->tkwin;
+    register Tk_Item *itemPtr;
+    Pixmap pixmap;
+    Pixmap savePixmap;
+    int screenX1, screenX2, screenY1, screenY2;
+    XpmAttributes xpm_attributes;
+
+    if (canvasPtr->tkwin == NULL) {
+       return TCL_OK;
+    }
+    if (!Tk_IsMapped(tkwin)) {
+       return TCL_OK;
+    }
+    if (!(fileName && *fileName)) {
+       Tcl_ResetResult(interp);
+       Tcl_AppendResult(interp, "no filename specified for canvas saving",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Choose a new current item if that is needed (this could cause
+     * event handlers to be invoked).
+     */
+
+    while (canvasPtr->flags & REPICK_NEEDED) {
+       Tk_Preserve((ClientData) canvasPtr);
+       canvasPtr->flags &= ~REPICK_NEEDED;
+       PickCurrentItem(canvasPtr, &canvasPtr->pickEvent);
+       tkwin = canvasPtr->tkwin;
+       Tk_Release((ClientData) canvasPtr);
+       if (tkwin == NULL) {
+           return TCL_OK;
+       }
+    }
+
+    if(x == 0 && y == 0 && width == 0 && height == 0) {
+      screenX1 = 0;
+      screenY1 = 0;
+      screenX2 = Tk_Width(tkwin);
+      screenY2 = Tk_Height(tkwin);
+      width = Tk_Width(tkwin);
+      height = Tk_Height(tkwin);
+    } else {
+      if(width != 0 && height != 0) {
+        screenX1 = x;
+        screenY1 = y;
+        screenX2 = x + width;
+        screenY2 = y + height;
+      } else {
+       Tcl_ResetResult(interp);
+       Tcl_AppendResult(interp, "no correct size specified for canvas saving",
+               (char *) NULL);
+        return TCL_ERROR;
+      }
+    }
+
+    /*
+     * Saving is done in a temporary pixmap that is allocated
+     * here and freed at the end of the procedure.  All drawing
+     * is done to the pixmap, and the pixmap is saved to the
+     * file at the end of the procedure.
+     *
+     * Some tricky points about the pixmap:
+     *
+     * 1. We only allocate a large enough pixmap to hold the
+     *    area that has to be saved.  This saves time in
+     *    in the X server for large objects that cover much
+     *    more than the area being saved:  only the area
+     *    of the pixmap will actually have to be saved.
+     * 2. The origin of the pixmap is adjusted to an even multiple
+     *    of 32 bits.  This is so that stipple patterns with a size
+     *    of 8 or 16 or 32 bits will always line up when information
+     *    is copied back to the screen.
+     * 3. Some X servers (e.g. the one for DECstations) have troubles
+     *    with characters that overlap an edge of the pixmap (on the
+     *    DEC servers, as of 8/18/92, such characters are drawn one
+     *    pixel too far to the right).  To handle this problem,
+     *    make the pixmap a bit larger than is absolutely needed
+     *    so that for normal-sized fonts the characters that ovelap
+     *    the edge of the pixmap will be outside the area we care
+     *    about.
+     */
+
+    canvasPtr->drawableXOrigin = (screenX1 - 30) & ~0x1f;
+    canvasPtr->drawableYOrigin = (screenY1 - 30) & ~0x1f;
+    pixmap = XCreatePixmap(Tk_Display(tkwin), Tk_WindowId(tkwin),
+       screenX2 + 30 - canvasPtr->drawableXOrigin,
+       screenY2 + 30 - canvasPtr->drawableYOrigin,
+       Tk_DefaultDepth(Tk_Screen(tkwin)));
+    savePixmap = XCreatePixmap(Tk_Display(tkwin), Tk_WindowId(tkwin),
+       width, height, Tk_DefaultDepth(Tk_Screen(tkwin)));
+
+    /*
+     * Clear the area to be redrawn.
+     */
+
+    XFillRectangle(Tk_Display(tkwin), pixmap, canvasPtr->pixmapGC,
+           screenX1 - canvasPtr->drawableXOrigin,
+           screenY1 - canvasPtr->drawableYOrigin,
+           (unsigned int) (screenX2 - screenX1),
+           (unsigned int) (screenY2 - screenY1));
+    XFillRectangle(Tk_Display(tkwin), savePixmap, canvasPtr->pixmapGC,
+           0, 0, width, height);
+
+    /*
+     * Scan through the item list, redrawing those items that need it.
+     * An item must be redraw if either (a) it intersects the smaller
+     * on-screen area or (b) it intersects the full canvas area and its
+     * type requests that it be redrawn always (e.g. so subwindows can
+     * be unmapped when they move off-screen).
+     */
+
+    for (itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
+           itemPtr = itemPtr->nextPtr) {
+       if ((itemPtr->x1 >= screenX2)
+               || (itemPtr->y1 >= screenY2)
+               || (itemPtr->x2 < screenX1)
+               || (itemPtr->y2 < screenY1)) {
+           if (!itemPtr->typePtr->alwaysRedraw
+                   || (itemPtr->x1 >= canvasPtr->redrawX2)
+                   || (itemPtr->y1 >= canvasPtr->redrawY2)
+                   || (itemPtr->x2 < canvasPtr->redrawX1)
+                   || (itemPtr->y2 < canvasPtr->redrawY1)) {
+               continue;
+           }
+       }
+       (*itemPtr->typePtr->displayProc)(canvasPtr, itemPtr, pixmap);
+    }
+
+    /*
+     * Copy from the temporary pixmap to the save pixmap.
+     */
+
+    XCopyArea(Tk_Display(tkwin), pixmap, savePixmap,
+           canvasPtr->pixmapGC,
+           screenX1 - canvasPtr->drawableXOrigin,
+           screenY1 - canvasPtr->drawableYOrigin,
+           screenX2 - screenX1, screenY2 - screenY1, 0, 0);
+
+    /*
+     * Save temporary pixmap.
+     */
+
+    xpm_attributes.width = width;
+    xpm_attributes.height = height;
+    xpm_attributes.visual = Tk_DefaultVisual(Tk_Screen(tkwin));
+    xpm_attributes.colormap = Tk_DefaultColormap(Tk_Screen(tkwin));
+    xpm_attributes.valuemask = XpmSize | XpmVisual | XpmColormap;
+    if(XpmWriteFileFromPixmap(Tk_Display(tkwin), fileName,
+                             savePixmap, (Pixmap) NULL,
+                             &xpm_attributes) != XpmSuccess) {
+      XFreePixmap(Tk_Display(tkwin), pixmap);
+      XFreePixmap(Tk_Display(tkwin), savePixmap);
+      Tcl_ResetResult(interp);
+      Tcl_AppendResult(interp, "could not save pixmap for canvas",
+           (char *) NULL);
+      return TCL_ERROR;
+    }
+    XFreePixmap(Tk_Display(tkwin), pixmap);
+    XFreePixmap(Tk_Display(tkwin), savePixmap);
+
+    return TCL_OK;
+}
+#endif
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayCanvas --
+ *
+ *     This procedure redraws the contents of a canvas window.
+ *     It is invoked as a do-when-idle handler, so it only runs
+ *     when there's nothing else for the application to do.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information appears on the screen.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayCanvas(clientData)
+    ClientData clientData;     /* Information about widget. */
+{
+    register Tk_Canvas *canvasPtr = (Tk_Canvas *) clientData;
+    register Tk_Window tkwin = canvasPtr->tkwin;
+    register Tk_Item *itemPtr;
+    Pixmap pixmap;
+    int screenX1, screenX2, screenY1, screenY2;
+
+    if (canvasPtr->tkwin == NULL) {
+       return;
+    }
+    if (!Tk_IsMapped(tkwin)) {
+       goto done;
+    }
+
+    /*
+     * Choose a new current item if that is needed (this could cause
+     * event handlers to be invoked).
+     */
+
+    while (canvasPtr->flags & REPICK_NEEDED) {
+       Tk_Preserve((ClientData) canvasPtr);
+       canvasPtr->flags &= ~REPICK_NEEDED;
+       PickCurrentItem(canvasPtr, &canvasPtr->pickEvent);
+       tkwin = canvasPtr->tkwin;
+       Tk_Release((ClientData) canvasPtr);
+       if (tkwin == NULL) {
+           return;
+       }
+    }
+
+    /*
+     * Compute the intersection between the area that needs redrawing
+     * and the area that's visible on the screen.
+     */
+
+    screenX1 = canvasPtr->xOrigin;
+    screenY1 = canvasPtr->yOrigin;
+    screenX2 = screenX1 + Tk_Width(tkwin);
+    screenY2 = screenY1 + Tk_Height(tkwin);
+    if (canvasPtr->redrawX1 > screenX1) {
+       screenX1 = canvasPtr->redrawX1;
+    }
+    if (canvasPtr->redrawY1 > screenY1) {
+       screenY1 = canvasPtr->redrawY1;
+    }
+    if (canvasPtr->redrawX2 < screenX2) {
+       screenX2 = canvasPtr->redrawX2;
+    }
+    if (canvasPtr->redrawY2 < screenY2) {
+       screenY2 = canvasPtr->redrawY2;
+    }
+    if ((screenX1 >= screenX2) || (screenY1 >= screenY2)) {
+       goto done;
+    }
+
+    /*
+     * Redrawing is done in a temporary pixmap that is allocated
+     * here and freed at the end of the procedure.  All drawing
+     * is done to the pixmap, and the pixmap is copied to the
+     * screen at the end of the procedure. The temporary pixmap
+     * serves two purposes:
+     *
+     * 1. It provides a smoother visual effect (no clearing and
+     *    gradual redraw will be visible to users).
+     * 2. It allows us to redraw only the objects that overlap
+     *    the redraw area.  Otherwise incorrect results could
+     *   occur from redrawing things that stick outside of
+     *   the redraw area (we'd have to redraw everything in
+     *    order to make the overlaps look right).
+     *
+     * Some tricky points about the pixmap:
+     *
+     * 1. We only allocate a large enough pixmap to hold the
+     *    area that has to be redisplayed.  This saves time in
+     *    in the X server for large objects that cover much
+     *    more than the area being redisplayed:  only the area
+     *    of the pixmap will actually have to be redrawn.
+     * 2. The origin of the pixmap is adjusted to an even multiple
+     *    of 32 bits.  This is so that stipple patterns with a size
+     *    of 8 or 16 or 32 bits will always line up when information
+     *    is copied back to the screen.
+     * 3. Some X servers (e.g. the one for DECstations) have troubles
+     *    with characters that overlap an edge of the pixmap (on the
+     *    DEC servers, as of 8/18/92, such characters are drawn one
+     *    pixel too far to the right).  To handle this problem,
+     *    make the pixmap a bit larger than is absolutely needed
+     *    so that for normal-sized fonts the characters that ovelap
+     *    the edge of the pixmap will be outside the area we care
+     *    about.
+     */
+
+    canvasPtr->drawableXOrigin = (screenX1 - 30) & ~0x1f;
+    canvasPtr->drawableYOrigin = (screenY1 - 30) & ~0x1f;
+    pixmap = XCreatePixmap(Tk_Display(tkwin), Tk_WindowId(tkwin),
+       screenX2 + 30 - canvasPtr->drawableXOrigin,
+       screenY2 + 30 - canvasPtr->drawableYOrigin,
+       Tk_DefaultDepth(Tk_Screen(tkwin)));
+
+    /*
+     * Clear the area to be redrawn.
+     */
+
+    XFillRectangle(Tk_Display(tkwin), pixmap, canvasPtr->pixmapGC,
+           screenX1 - canvasPtr->drawableXOrigin,
+           screenY1 - canvasPtr->drawableYOrigin,
+           (unsigned int) (screenX2 - screenX1),
+           (unsigned int) (screenY2 - screenY1));
+
+    /*
+     * Scan through the item list, redrawing those items that need it.
+     * An item must be redraw if either (a) it intersects the smaller
+     * on-screen area or (b) it intersects the full canvas area and its
+     * type requests that it be redrawn always (e.g. so subwindows can
+     * be unmapped when they move off-screen).
+     */
+
+    for (itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
+           itemPtr = itemPtr->nextPtr) {
+       if ((itemPtr->x1 >= screenX2)
+               || (itemPtr->y1 >= screenY2)
+               || (itemPtr->x2 < screenX1)
+               || (itemPtr->y2 < screenY1)) {
+           if (!itemPtr->typePtr->alwaysRedraw
+                   || (itemPtr->x1 >= canvasPtr->redrawX2)
+                   || (itemPtr->y1 >= canvasPtr->redrawY2)
+                   || (itemPtr->x2 < canvasPtr->redrawX1)
+                   || (itemPtr->y2 < canvasPtr->redrawY1)) {
+               continue;
+           }
+       }
+       (*itemPtr->typePtr->displayProc)(canvasPtr, itemPtr, pixmap);
+    }
+
+    /*
+     * Draw the window border.
+     */
+
+    if (canvasPtr->relief != TK_RELIEF_FLAT) {
+       Tk_Draw3DRectangle(Tk_Display(tkwin), pixmap,
+               canvasPtr->bgBorder,
+               canvasPtr->xOrigin - canvasPtr->drawableXOrigin,
+               canvasPtr->yOrigin - canvasPtr->drawableYOrigin,
+               Tk_Width(tkwin), Tk_Height(tkwin),
+               canvasPtr->borderWidth, canvasPtr->relief);
+    }
+
+    /*
+     * Copy from the temporary pixmap to the screen, then free up
+     * the temporary pixmap.
+     */
+
+    XCopyArea(Tk_Display(tkwin), pixmap, Tk_WindowId(tkwin),
+           canvasPtr->pixmapGC,
+           screenX1 - canvasPtr->drawableXOrigin,
+           screenY1 - canvasPtr->drawableYOrigin,
+           screenX2 - screenX1, screenY2 - screenY1,
+           screenX1 - canvasPtr->xOrigin, screenY1 - canvasPtr->yOrigin);
+    XFreePixmap(Tk_Display(tkwin), pixmap);
+
+    done:
+    canvasPtr->flags &= ~REDRAW_PENDING;
+    assert(canvasPtr->updateTimerToken != NULL);
+    canvasPtr->updateTimerToken = NULL;
+    if (canvasPtr->flags & UPDATE_SCROLLBARS) {
+       CanvasUpdateScrollbars(canvasPtr);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CanvasEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher for various
+ *     events on canvases.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the window gets deleted, internal structures get
+ *     cleaned up.  When it gets exposed, it is redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+CanvasEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    XEvent *eventPtr;          /* Information about event. */
+{
+    Tk_Canvas *canvasPtr = (Tk_Canvas *) clientData;
+
+    if (eventPtr->type == Expose) {
+       int x, y;
+
+       x = eventPtr->xexpose.x + canvasPtr->xOrigin;
+       y = eventPtr->xexpose.y + canvasPtr->yOrigin;
+       EventuallyRedrawArea(canvasPtr, x, y, x + eventPtr->xexpose.width,
+               y + eventPtr->xexpose.height);
+    } else if (eventPtr->type == DestroyNotify) {
+       Tcl_DeleteCommand(canvasPtr->interp, Tk_PathName(canvasPtr->tkwin));
+       canvasPtr->tkwin = NULL;
+       if (canvasPtr->flags & REDRAW_PENDING) {
+           canvasPtr->flags &= ~REDRAW_PENDING;
+//         Tk_CancelIdleCall(DisplayCanvas, (ClientData) canvasPtr);
+           assert(canvasPtr->updateTimerToken != NULL);
+           if (canvasPtr->updateTimerToken != NULL) {
+               Tk_DeleteTimerHandler(canvasPtr->updateTimerToken);
+               canvasPtr->updateTimerToken = 0;
+           }
+       }
+       Tk_EventuallyFree((ClientData) canvasPtr, DestroyCanvas);
+    } else if (eventPtr->type == ConfigureNotify) {
+       canvasPtr->flags |= UPDATE_SCROLLBARS;
+
+       /*
+        * The call below is needed in order to recenter the canvas if
+        * it's confined and its scroll region is smaller than the window.
+        */
+
+       CanvasSetOrigin(canvasPtr, canvasPtr->xOrigin, canvasPtr->yOrigin);
+       EventuallyRedrawArea(canvasPtr, 0, 0, Tk_Width(canvasPtr->tkwin),
+               Tk_Height(canvasPtr->tkwin));
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * EventuallyRedrawArea --
+ *
+ *     Arrange for part or all of a canvas widget to redrawn at
+ *     the next convenient time in the future.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The screen will eventually be refreshed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+EventuallyRedrawArea(canvasPtr, x1, y1, x2, y2)
+    register Tk_Canvas *canvasPtr;     /* Information about widget. */
+    int x1, y1;                                /* Upper left corner of area to
+                                        * redraw.  Pixels on edge are
+                                        * redrawn. */
+    int x2, y2;                                /* Lower right corner of area to
+                                        * redraw.  Pixels on edge are
+                                        * not redrawn. */
+{
+    if ((canvasPtr->tkwin == NULL) || !Tk_IsMapped(canvasPtr->tkwin)) {
+       return;
+    }
+    if (canvasPtr->flags & REDRAW_PENDING) {
+       if (x1 <= canvasPtr->redrawX1) {
+           canvasPtr->redrawX1 = x1;
+       }
+       if (y1 <= canvasPtr->redrawY1) {
+           canvasPtr->redrawY1 = y1;
+       }
+       if (x2 >= canvasPtr->redrawX2) {
+           canvasPtr->redrawX2 = x2;
+       }
+       if (y2 >= canvasPtr->redrawY2) {
+           canvasPtr->redrawY2 = y2;
+       }
+    } else {
+       canvasPtr->redrawX1 = x1;
+       canvasPtr->redrawY1 = y1;
+       canvasPtr->redrawX2 = x2;
+       canvasPtr->redrawY2 = y2;
+//     Tk_DoWhenIdle(DisplayCanvas, (ClientData) canvasPtr);
+       canvasPtr->flags |= REDRAW_PENDING;
+       assert(canvasPtr->updateTimerToken == NULL);
+       if (canvasPtr->updateTimerToken == 0) {
+         canvasPtr->updateTimerToken = 
+           Tk_CreateTimerHandler(
+             CanvasUpdateTime,
+             DisplayCanvas,
+             (ClientData) canvasPtr);
+       }
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_CreateItemType --
+ *
+ *     This procedure may be invoked to add a new kind of canvas
+ *     element to the core item types supported by Tk.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     From now on, the new item type will be useable in canvas
+ *     widgets (e.g. typePtr->name can be used as the item type
+ *     in "create" widget commands).  If there was already a
+ *     type with the same name as in typePtr, it is replaced with
+ *     the new type.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_CreateItemType(typePtr)
+    Tk_ItemType *typePtr;              /* Information about item type;
+                                        * storage must be statically
+                                        * allocated (must live forever). */
+{
+    if (typeList == NULL) {
+       InitCanvas();
+    }
+    typePtr->nextPtr = typeList;
+    typeList = typePtr;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * InitCanvas --
+ *
+ *     This procedure is invoked to perform once-only-ever
+ *     initialization for the module, such as setting up
+ *     the type table.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+InitCanvas()
+{
+    if (typeList != NULL) {
+       return;
+    }
+    typeList = &TkRectangleType;
+    TkRectangleType.nextPtr = &TkTextType;
+    TkTextType.nextPtr = &TkPolygonType;
+    TkPolygonType.nextPtr = &TkOvalType;
+    TkOvalType.nextPtr = &TkLineType;
+    TkLineType.nextPtr = &TkWindowType;
+    TkWindowType.nextPtr = &TkBitmapType;
+    TkBitmapType.nextPtr = &TkArcType;
+    TkArcType.nextPtr = NULL;
+    allUid = Tk_GetUid("all");
+    currentUid = Tk_GetUid("current");
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * StartTagSearch --
+ *
+ *     This procedure is called to initiate an enumeration of
+ *     all items in a given canvas that contain a given tag.
+ *
+ * Results:
+ *     The return value is a pointer to the first item in
+ *     canvasPtr that matches tag, or NULL if there is no
+ *     such item.  The information at *searchPtr is initialized
+ *     such that successive calls to NextItem will return
+ *     successive items that match tag.
+ *
+ * Side effects:
+ *     SearchPtr is linked into a list of searches in progress
+ *     on canvasPtr, so that elements can safely be deleted
+ *     while the search is in progress.  EndTagSearch must be
+ *     called at the end of the search to unlink searchPtr from
+ *     this list.
+ *
+ *--------------------------------------------------------------
+ */
+
+static Tk_Item *
+StartTagSearch(canvasPtr, tag, searchPtr)
+    Tk_Canvas *canvasPtr;              /* Canvas whose items are to be
+                                        * searched. */
+    char *tag;                         /* String giving tag value. */
+    TagSearch *searchPtr;              /* Record describing tag search;
+                                        * will be initialized here. */
+{
+    int id;
+    register Tk_Item *itemPtr, *prevPtr;
+    register Tk_Uid *tagPtr;
+    register Tk_Uid uid;
+    register int count;
+
+    /*
+     * Initialize the search.
+     */
+
+    searchPtr->canvasPtr = canvasPtr;
+    searchPtr->searchOver = 0;
+
+    /*
+     * Find the first matching item in one of several ways. If the tag
+     * is a number then it selects the single item with the matching
+     * identifier.  In this case see if the item being requested is the
+     * hot item, in which case the search can be skipped.
+     */
+
+    if (isdigit(*tag)) {
+       char *end;
+
+       numIdSearches++;
+       id = strtoul(tag, &end, 0);
+       if (*end == 0) {
+           itemPtr = canvasPtr->hotPtr;
+           prevPtr = canvasPtr->hotPrevPtr;
+           if ((itemPtr == NULL) || (itemPtr->id != id) || (prevPtr == NULL)
+                   || (prevPtr->nextPtr != itemPtr)) {
+               numSlowSearches++;
+               for (prevPtr = NULL, itemPtr = canvasPtr->firstItemPtr;
+                       itemPtr != NULL;
+                       prevPtr = itemPtr, itemPtr = itemPtr->nextPtr) {
+                   if (itemPtr->id == id) {
+                       break;
+                   }
+               }
+           }
+           searchPtr->prevPtr = prevPtr;
+           searchPtr->searchOver = 1;
+           canvasPtr->hotPtr = itemPtr;
+           canvasPtr->hotPrevPtr = prevPtr;
+           return itemPtr;
+       }
+    }
+
+    searchPtr->tag = uid = Tk_GetUid(tag);
+    if (uid == allUid) {
+
+       /*
+        * All items match.
+        */
+
+       searchPtr->tag = NULL;
+       searchPtr->prevPtr = NULL;
+       searchPtr->currentPtr = canvasPtr->firstItemPtr;
+       return canvasPtr->firstItemPtr;
+    }
+
+    /*
+     * None of the above.  Search for an item with a matching tag.
+     */
+
+    for (prevPtr = NULL, itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
+           prevPtr = itemPtr, itemPtr = itemPtr->nextPtr) {
+       for (tagPtr = itemPtr->tagPtr, count = itemPtr->numTags;
+               count > 0; tagPtr++, count--) {
+           if (*tagPtr == uid) {
+               searchPtr->prevPtr = prevPtr;
+               searchPtr->currentPtr = itemPtr;
+               return itemPtr;
+           }
+       }
+    }
+    searchPtr->prevPtr = prevPtr;
+    searchPtr->searchOver = 1;
+    return NULL;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * NextItem --
+ *
+ *     This procedure returns successive items that match a given
+ *     tag;  it should be called only after StartTagSearch has been
+ *     used to begin a search.
+ *
+ * Results:
+ *     The return value is a pointer to the next item that matches
+ *     the tag specified to StartTagSearch, or NULL if no such
+ *     item exists.  *SearchPtr is updated so that the next call
+ *     to this procedure will return the next item.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static Tk_Item *
+NextItem(searchPtr)
+    TagSearch *searchPtr;              /* Record describing search in
+                                        * progress. */
+{
+    register Tk_Item *itemPtr, *prevPtr;
+    register int count;
+    register Tk_Uid uid;
+    register Tk_Uid *tagPtr;
+
+    /*
+     * Find next item in list (this may not actually be a suitable
+     * one to return), and return if there are no items left.
+     */
+
+    prevPtr = searchPtr->prevPtr;
+    if (prevPtr == NULL) {
+       itemPtr = searchPtr->canvasPtr->firstItemPtr;
+    } else {
+       itemPtr = prevPtr->nextPtr;
+    }
+    if ((itemPtr == NULL) || (searchPtr->searchOver)) {
+       searchPtr->searchOver = 1;
+       return NULL;
+    }
+    if (itemPtr != searchPtr->currentPtr) {
+       /*
+        * The structure of the list has changed.  Probably the
+        * previously-returned item was removed from the list.
+        * In this case, don't advance prevPtr;  just return
+        * its new successor (i.e. do nothing here).
+        */
+    } else {
+       prevPtr = itemPtr;
+       itemPtr = prevPtr->nextPtr;
+    }
+
+    /*
+     * Handle special case of "all" search by returning next item.
+     */
+
+    uid = searchPtr->tag;
+    if (uid == NULL) {
+       searchPtr->prevPtr = prevPtr;
+       searchPtr->currentPtr = itemPtr;
+       return itemPtr;
+    }
+
+    /*
+     * Look for an item with a particular tag.
+     */
+
+    for ( ; itemPtr != NULL; prevPtr = itemPtr, itemPtr = itemPtr->nextPtr) {
+       for (tagPtr = itemPtr->tagPtr, count = itemPtr->numTags;
+               count > 0; tagPtr++, count--) {
+           if (*tagPtr == uid) {
+               searchPtr->prevPtr = prevPtr;
+               searchPtr->currentPtr = itemPtr;
+               return itemPtr;
+           }
+       }
+    }
+    searchPtr->prevPtr = prevPtr;
+    searchPtr->searchOver = 1;
+    return NULL;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DoItem --
+ *
+ *     This is a utility procedure called by FindItems.  It
+ *     either adds itemPtr's id to the result forming in interp,
+ *     or it adds a new tag to itemPtr, depending on the value
+ *     of tag.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If tag is NULL then itemPtr's id is added as a list element
+ *     to interp->result;  otherwise tag is added to itemPtr's
+ *     list of tags.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DoItem(interp, itemPtr, tag)
+    Tcl_Interp *interp;                        /* Interpreter in which to (possibly)
+                                        * record item id. */
+    register Tk_Item *itemPtr;         /* Item to (possibly) modify. */
+    Tk_Uid tag;                                /* Tag to add to those already
+                                        * present for item, or NULL. */
+{
+    register Tk_Uid *tagPtr;
+    register int count;
+
+    /*
+     * Handle the "add-to-result" case and return, if appropriate.
+     */
+
+    if (tag == NULL) {
+       char msg[30];
+       sprintf(msg, "%d", itemPtr->id);
+       Tcl_AppendElement(interp, msg, 0);
+       return;
+    }
+
+    for (tagPtr = itemPtr->tagPtr, count = itemPtr->numTags;
+           count > 0; tagPtr++, count--) {
+       if (tag == *tagPtr) {
+           return;
+       }
+    }
+
+    /*
+     * Grow the tag space if there's no more room left in the current
+     * block.
+     */
+
+    if (itemPtr->tagSpace == itemPtr->numTags) {
+       Tk_Uid *newTagPtr;
+
+       itemPtr->tagSpace += 5;
+       newTagPtr = (Tk_Uid *) ckalloc((unsigned)
+               (itemPtr->tagSpace * sizeof(Tk_Uid)));
+       memcpy((VOID *) newTagPtr, (VOID *) itemPtr->tagPtr,
+               (itemPtr->numTags * sizeof(Tk_Uid)));
+       if (itemPtr->tagPtr != itemPtr->staticTagSpace) {
+           ckfree((char *) itemPtr->tagPtr);
+       }
+       itemPtr->tagPtr = newTagPtr;
+       tagPtr = &itemPtr->tagPtr[itemPtr->numTags];
+    }
+
+    /*
+     * Add in the new tag.
+     */
+
+    *tagPtr = tag;
+    itemPtr->numTags++;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * FindItems --
+ *
+ *     This procedure does all the work of implementing the
+ *     "find" and "addtag" options of the canvas widget command,
+ *     which locate items that have certain features (location,
+ *     tags, position in display list, etc.).
+ *
+ * Results:
+ *     A standard Tcl return value.  If newTag is NULL, then a
+ *     list of ids from all the items that match argc/argv is
+ *     returned in interp->result.  If newTag is NULL, then
+ *     the normal interp->result is an empty string.  If an error
+ *     occurs, then interp->result will hold an error message.
+ *
+ * Side effects:
+ *     If newTag is non-NULL, then all the items that match the
+ *     information in argc/argv have that tag added to their
+ *     lists of tags.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+FindItems(interp, canvasPtr, argc, argv, newTag, cmdName, option)
+    Tcl_Interp *interp;                        /* Interpreter for error reporting. */
+    Tk_Canvas *canvasPtr;              /* Canvas whose items are to be
+                                        * searched. */
+    int argc;                          /* Number of entries in argv.  Must be
+                                        * greater than zero. */
+    char **argv;                       /* Arguments that describe what items
+                                        * to search for (see user doc on
+                                        * "find" and "addtag" options). */
+    char *newTag;                      /* If non-NULL, gives new tag to set
+                                        * on all found items;  if NULL, then
+                                        * ids of found items are returned
+                                        * in interp->result. */
+    char *cmdName;                     /* Name of original Tcl command, for
+                                        * use in error messages. */
+    char *option;                      /* For error messages:  gives option
+                                        * from Tcl command and other stuff
+                                        * up to what's in argc/argv. */
+{
+    char c;
+    int length;
+    TagSearch search;
+    register Tk_Item *itemPtr;
+    Tk_Uid uid;
+
+    if (newTag != NULL) {
+       uid = Tk_GetUid(newTag);
+    } else {
+       uid = NULL;
+    }
+    c = argv[0][0];
+    length = strlen(argv[0]);
+    if ((c == 'a') && (strncmp(argv[0], "above", length) == 0)
+           && (length >= 2)) {
+       Tk_Item *lastPtr = NULL;
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args:  must be \"",
+                   cmdName, option, " above tagOrId", (char *) NULL);
+           return TCL_ERROR;
+       }
+       for (itemPtr = StartTagSearch(canvasPtr, argv[1], &search);
+               itemPtr != NULL; itemPtr = NextItem(&search)) {
+           lastPtr = itemPtr;
+       }
+       if ((lastPtr != NULL) && (lastPtr->nextPtr != NULL)) {
+           DoItem(interp, lastPtr->nextPtr, uid);
+       }
+    } else if ((c == 'a') && (strncmp(argv[0], "all", length) == 0)
+           && (length >= 2)) {
+       if (argc != 1) {
+           Tcl_AppendResult(interp, "wrong # args:  must be \"",
+                   cmdName, option, " all", (char *) NULL);
+           return TCL_ERROR;
+       }
+
+       for (itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
+               itemPtr = itemPtr->nextPtr) {
+           DoItem(interp, itemPtr, uid);
+       }
+    } else if ((c == 'b') && (strncmp(argv[0], "below", length) == 0)) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args:  must be \"",
+                   cmdName, option, " below tagOrId", (char *) NULL);
+           return TCL_ERROR;
+       }
+       itemPtr = StartTagSearch(canvasPtr, argv[1], &search);
+       if (search.prevPtr != NULL) {
+           DoItem(interp, search.prevPtr, uid);
+       }
+    } else if ((c == 'c') && (strncmp(argv[0], "closest", length) == 0)) {
+       double closestDist;
+       Tk_Item *startPtr, *closestPtr;
+       double coords[2], halo;
+       int x1, y1, x2, y2;
+
+       if ((argc < 3) || (argc > 5)) {
+           Tcl_AppendResult(interp, "wrong # args:  must be \"",
+                   cmdName, option, " closest x y ?halo? ?start?",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       if ((TkGetCanvasCoord(canvasPtr, argv[1], &coords[0]) != TCL_OK)
+               || (TkGetCanvasCoord(canvasPtr, argv[2], &coords[1])
+               != TCL_OK)) {
+           return TCL_ERROR;
+       }
+       if (argc > 3) {
+           if (TkGetCanvasCoord(canvasPtr, argv[3], &halo) != TCL_OK) {
+               return TCL_ERROR;
+           }
+           if (halo < 0.0) {
+               Tcl_AppendResult(interp, "can't have negative halo value \"",
+                       argv[3], "\"", (char *) NULL);
+               return TCL_ERROR;
+           }
+       } else {
+           halo = 0.0;
+       }
+
+       /*
+        * Find the item at which to start the search.
+        */
+
+       startPtr = canvasPtr->firstItemPtr;
+       if (argc == 5) {
+           itemPtr = StartTagSearch(canvasPtr, argv[4], &search);
+           if (itemPtr != NULL) {
+               startPtr = itemPtr;
+           }
+       }
+
+       /*
+        * The code below is optimized so that it can eliminate most
+        * items without having to call their item-specific procedures.
+        * This is done by keeping a bounding box (x1, y1, x2, y2) that
+        * an item's bbox must overlap if the item is to have any
+        * chance of being closer than the closest so far.
+        */
+
+       itemPtr = startPtr;
+       if (itemPtr == NULL) {
+           return TCL_OK;
+       }
+       closestDist = (*itemPtr->typePtr->pointProc)(canvasPtr,
+               itemPtr, coords) - halo;
+       if (closestDist < 0.0) {
+           closestDist = 0.0;
+       }
+       while (1) {
+           double newDist;
+
+           /*
+            * Update the bounding box using itemPtr, which is the
+            * new closest item.
+            */
+
+           x1 = (coords[0] - closestDist - halo - 1);
+           y1 = (coords[1] - closestDist - halo - 1);
+           x2 = (coords[0] + closestDist + halo + 1);
+           y2 = (coords[1] + closestDist + halo + 1);
+           closestPtr = itemPtr;
+
+           /*
+            * Search for an item that beats the current closest one.
+            * Work circularly through the canvas's item list until
+            * getting back to the starting item.
+            */
+
+           while (1) {
+               itemPtr = itemPtr->nextPtr;
+               if (itemPtr == NULL) {
+                   itemPtr = canvasPtr->firstItemPtr;
+               }
+               if (itemPtr == startPtr) {
+                   DoItem(interp, closestPtr, uid);
+                   return TCL_OK;
+               }
+               if ((itemPtr->x1 >= x2) || (itemPtr->x2 <= x1)
+                       || (itemPtr->y1 >= y2) || (itemPtr->y2 <= y1)) {
+                   continue;
+               }
+               newDist = (*itemPtr->typePtr->pointProc)(canvasPtr,
+                       itemPtr, coords) - halo;
+               if (newDist < 0.0) {
+                   newDist = 0.0;
+               }
+               if (newDist <= closestDist) {
+                   closestDist = newDist;
+                   break;
+               }
+           }
+       }
+    } else if ((c == 'e') && (strncmp(argv[0], "enclosed", length) == 0)) {
+       if (argc != 5) {
+           Tcl_AppendResult(interp, "wrong # args:  must be \"",
+                   cmdName, option, " enclosed x1 y1 x2 y2", (char *) NULL);
+           return TCL_ERROR;
+       }
+       return FindArea(interp, canvasPtr, argv+1, uid, 1);
+    } else if ((c == 'o') && (strncmp(argv[0], "overlapping", length) == 0)) {
+       if (argc != 5) {
+           Tcl_AppendResult(interp, "wrong # args:  must be \"",
+                   cmdName, option, " overlapping x1 y1 x2 y2",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       return FindArea(interp, canvasPtr, argv+1, uid, 0);
+    } else if ((c == 'w') && (strncmp(argv[0], "withtag", length) == 0)) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args:  must be \"",
+                   cmdName, option, " withtag tagOrId", (char *) NULL);
+           return TCL_ERROR;
+       }
+       for (itemPtr = StartTagSearch(canvasPtr, argv[1], &search);
+               itemPtr != NULL; itemPtr = NextItem(&search)) {
+           DoItem(interp, itemPtr, uid);
+       }
+    } else  {
+       Tcl_AppendResult(interp, "bad search command \"", argv[0],
+               "\": must be above, all, below, closest, enclosed, ",
+               "overlapping, or withtag", (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * FindArea --
+ *
+ *     This procedure implements area searches for the "find"
+ *     and "addtag" options.
+ *
+ * Results:
+ *     A standard Tcl return value.  If newTag is NULL, then a
+ *     list of ids from all the items overlapping or enclosed
+ *     by the rectangle given by argc is returned in interp->result.
+ *     If newTag is NULL, then the normal interp->result is an
+ *     empty string.  If an error occurs, then interp->result will
+ *     hold an error message.
+ *
+ * Side effects:
+ *     If uid is non-NULL, then all the items overlapping
+ *     or enclosed by the area in argv have that tag added to
+ *     their lists of tags.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+FindArea(interp, canvasPtr, argv, uid, enclosed)
+    Tcl_Interp *interp;                        /* Interpreter for error reporting
+                                        * and result storing. */
+    Tk_Canvas *canvasPtr;              /* Canvas whose items are to be
+                                        * searched. */
+    char **argv;                       /* Array of four arguments that
+                                        * give the coordinates of the
+                                        * rectangular area to search. */
+    Tk_Uid uid;                                /* If non-NULL, gives new tag to set
+                                        * on all found items;  if NULL, then
+                                        * ids of found items are returned
+                                        * in interp->result. */
+    int enclosed;                      /* 0 means overlapping or enclosed
+                                        * items are OK, 1 means only enclosed
+                                        * items are OK. */
+{
+    double rect[4], tmp;
+    int x1, y1, x2, y2;
+    register Tk_Item *itemPtr;
+
+    if ((TkGetCanvasCoord(canvasPtr, argv[0], &rect[0]) != TCL_OK)
+           || (TkGetCanvasCoord(canvasPtr, argv[1], &rect[1]) != TCL_OK)
+           || (TkGetCanvasCoord(canvasPtr, argv[2], &rect[2]) != TCL_OK)
+           || (TkGetCanvasCoord(canvasPtr, argv[3], &rect[3]) != TCL_OK)) {
+       return TCL_ERROR;
+    }
+    if (rect[0] > rect[2]) {
+       tmp = rect[0]; rect[0] = rect[2]; rect[2] = tmp;
+    }
+    if (rect[1] > rect[3]) {
+       tmp = rect[1]; rect[1] = rect[3]; rect[3] = tmp;
+    }
+
+    /*
+     * Use an integer bounding box for a quick test, to avoid
+     * calling item-specific code except for items that are close.
+     */
+
+    x1 = (rect[0]-1.0);
+    y1 = (rect[1]-1.0);
+    x2 = (rect[2]+1.0);
+    y2 = (rect[3]+1.0);
+    for (itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
+           itemPtr = itemPtr->nextPtr) {
+       if ((itemPtr->x1 >= x2) || (itemPtr->x2 <= x1)
+               || (itemPtr->y1 >= y2) || (itemPtr->y2 <= y1)) {
+           continue;
+       }
+       if ((*itemPtr->typePtr->areaProc)(canvasPtr, itemPtr, rect)
+               >= enclosed) {
+           DoItem(interp, itemPtr, uid);
+       }
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * RelinkItems --
+ *
+ *     Move one or more items to a different place in the
+ *     display order for a canvas.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The items identified by "tag" are moved so that they
+ *     are all together in the display list and immediately
+ *     after prevPtr.  The order of the moved items relative
+ *     to each other is not changed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+RelinkItems(canvasPtr, tag, prevPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas to be modified. */
+    char *tag;                 /* Tag identifying items to be moved
+                                * in the redisplay list. */
+    Tk_Item *prevPtr;          /* Reposition the items so that they
+                                * go just after this item (NULL means
+                                * put at beginning of list). */
+{
+    register Tk_Item *itemPtr;
+    TagSearch search;
+    Tk_Item *firstMovePtr, *lastMovePtr;
+
+    /*
+     * Find all of the items to be moved and remove them from
+     * the list, making an auxiliary list running from firstMovePtr
+     * to lastMovePtr.  Record their areas for redisplay.
+     */
+
+    firstMovePtr = lastMovePtr = NULL;
+    for (itemPtr = StartTagSearch(canvasPtr, tag, &search);
+           itemPtr != NULL; itemPtr = NextItem(&search)) {
+       if (itemPtr == prevPtr) {
+           /*
+            * Item after which insertion is to occur is being
+            * moved!  Switch to insert after its predecessor.
+            */
+
+           prevPtr = search.prevPtr;
+       }
+       if (search.prevPtr == NULL) {
+           canvasPtr->firstItemPtr = itemPtr->nextPtr;
+       } else {
+           search.prevPtr->nextPtr = itemPtr->nextPtr;
+       }
+       if (canvasPtr->lastItemPtr == itemPtr) {
+           canvasPtr->lastItemPtr = search.prevPtr;
+       }
+       if (firstMovePtr == NULL) {
+           firstMovePtr = itemPtr;
+       } else {
+           lastMovePtr->nextPtr = itemPtr;
+       }
+       lastMovePtr = itemPtr;
+       EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+               itemPtr->x2, itemPtr->y2);
+       canvasPtr->flags |= REPICK_NEEDED;
+    }
+
+    /*
+     * Insert the list of to-be-moved items back into the canvas's
+     * at the desired position.
+     */
+
+    if (firstMovePtr == NULL) {
+       return;
+    }
+    if (prevPtr == NULL) {
+       lastMovePtr->nextPtr = canvasPtr->firstItemPtr;
+       canvasPtr->firstItemPtr = firstMovePtr;
+    } else {
+       lastMovePtr->nextPtr = prevPtr->nextPtr;
+       prevPtr->nextPtr = firstMovePtr;
+    }
+    if (canvasPtr->lastItemPtr == prevPtr) {
+       canvasPtr->lastItemPtr = lastMovePtr;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CanvasBindProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher to handle
+ *     events associated with bindings on items.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Depends on the command invoked as part of the binding
+ *     (if there was any).
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+CanvasBindProc(clientData, eventPtr)
+    ClientData clientData;             /* Pointer to canvas structure. */
+    XEvent *eventPtr;                  /* Pointer to X event that just
+                                        * happened. */
+{
+    Tk_Canvas *canvasPtr = (Tk_Canvas *) clientData;
+    int repick  = 0;
+
+    Tk_Preserve((ClientData) canvasPtr);
+
+    /*
+     * This code simulates grabs for mouse buttons by refusing to
+     * pick a new current item between the time a mouse button goes
+     * down and the time when the last mouse button is released is
+     * released again.
+     */
+
+    if (eventPtr->type == ButtonPress) {
+       canvasPtr->flags |= BUTTON_DOWN;
+    } else if (eventPtr->type == ButtonRelease) {
+       int mask;
+
+       switch (eventPtr->xbutton.button) {
+           case Button1:
+               mask = Button1Mask;
+               break;
+           case Button2:
+               mask = Button2Mask;
+               break;
+           case Button3:
+               mask = Button3Mask;
+               break;
+           case Button4:
+               mask = Button4Mask;
+               break;
+           case Button5:
+               mask = Button5Mask;
+               break;
+           default:
+               mask = 0;
+               break;
+       }
+       if ((eventPtr->xbutton.state & (Button1Mask|Button2Mask
+               |Button3Mask|Button4Mask|Button5Mask)) == mask) {
+           canvasPtr->flags &= ~BUTTON_DOWN;
+           repick = 1;
+       }
+    } else if ((eventPtr->type == EnterNotify)
+           || (eventPtr->type == LeaveNotify)) {
+       PickCurrentItem(canvasPtr, eventPtr);
+       goto done;
+    } else if (eventPtr->type == MotionNotify) {
+       PickCurrentItem(canvasPtr, eventPtr);
+    }
+    CanvasDoEvent(canvasPtr, eventPtr);
+    if (repick) {
+       unsigned int oldState;
+
+       oldState = eventPtr->xbutton.state;
+       eventPtr->xbutton.state &= ~(Button1Mask|Button2Mask
+               |Button3Mask|Button4Mask|Button5Mask);
+       PickCurrentItem(canvasPtr, eventPtr);
+       eventPtr->xbutton.state = oldState;
+    }
+
+    done:
+    Tk_Release((ClientData) canvasPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * PickCurrentItem --
+ *
+ *     Find the topmost item in a canvas that contains a given
+ *     location and mark the the current item.  If the current
+ *     item has changed, generate a fake exit event on the old
+ *     current item and a fake enter event on the new current
+ *     item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The current item for canvasPtr may change.  If it does,
+ *     then the commands associated with item entry and exit
+ *     could do just about anything.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+PickCurrentItem(canvasPtr, eventPtr)
+    register Tk_Canvas *canvasPtr;     /* Canvas pointer in which to select
+                                        * current item. */
+    XEvent *eventPtr;                  /* Event describing location of
+                                        * mouse cursor.  Must be EnterWindow,
+                                        * LeaveWindow, ButtonRelease, or
+                                        * MotionNotify. */
+{
+    Tk_Item *closestPtr = NULL;
+
+    /*
+     * If a button is down, then don't do anything at all;  we'll be
+     * called again when all buttons are up, and we can repick then.
+     * This implements a form of mouse grabbing for canvases.
+     */
+
+    if (canvasPtr->flags & BUTTON_DOWN) {
+       return;
+    }
+
+    /*
+     * Save information about this event in the canvas.  The event in
+     * the canvas is used for two purposes:
+     *
+     * 1. Event bindings: if the current item changes, fake events are
+     *    generated to allow item-enter and item-leave bindings to trigger.
+     * 2. Reselection: if the current item gets deleted, can use the
+     *    saved event to find a new current item.
+     * Translate MotionNotify events into EnterNotify events, since that's
+     * what gets reported to item handlers.
+     */
+
+    if (eventPtr != &canvasPtr->pickEvent) {
+       if ((eventPtr->type == MotionNotify)
+               || (eventPtr->type == ButtonRelease)) {
+           canvasPtr->pickEvent.xcrossing.type = EnterNotify;
+           canvasPtr->pickEvent.xcrossing.serial = eventPtr->xmotion.serial;
+           canvasPtr->pickEvent.xcrossing.send_event
+                   = eventPtr->xmotion.send_event;
+           canvasPtr->pickEvent.xcrossing.display = eventPtr->xmotion.display;
+           canvasPtr->pickEvent.xcrossing.window = eventPtr->xmotion.window;
+           canvasPtr->pickEvent.xcrossing.root = eventPtr->xmotion.root;
+           canvasPtr->pickEvent.xcrossing.subwindow = None;
+           canvasPtr->pickEvent.xcrossing.time = eventPtr->xmotion.time;
+           canvasPtr->pickEvent.xcrossing.x = eventPtr->xmotion.x;
+           canvasPtr->pickEvent.xcrossing.y = eventPtr->xmotion.y;
+           canvasPtr->pickEvent.xcrossing.x_root = eventPtr->xmotion.x_root;
+           canvasPtr->pickEvent.xcrossing.y_root = eventPtr->xmotion.y_root;
+           canvasPtr->pickEvent.xcrossing.mode = NotifyNormal;
+           canvasPtr->pickEvent.xcrossing.detail = NotifyNonlinear;
+           canvasPtr->pickEvent.xcrossing.same_screen
+                   = eventPtr->xmotion.same_screen;
+           canvasPtr->pickEvent.xcrossing.focus = False;
+           canvasPtr->pickEvent.xcrossing.state = eventPtr->xmotion.state;
+       } else  {
+           canvasPtr->pickEvent = *eventPtr;
+       }
+    }
+
+    /*
+     * A LeaveNotify event automatically means that there's no current
+     * object, so the rest of the code below can be skipped.
+     */
+
+    if (canvasPtr->pickEvent.type != LeaveNotify) {
+       int x1, y1, x2, y2;
+       double coords[2];
+       register Tk_Item *itemPtr;
+
+       coords[0] = canvasPtr->pickEvent.xcrossing.x + canvasPtr->xOrigin;
+       coords[1] = canvasPtr->pickEvent.xcrossing.y + canvasPtr->yOrigin;
+       x1 = coords[0] - canvasPtr->closeEnough;
+       y1 = coords[1] - canvasPtr->closeEnough;
+       x2 = coords[0] + canvasPtr->closeEnough;
+       y2 = coords[1] + canvasPtr->closeEnough;
+    
+       for (itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
+               itemPtr = itemPtr->nextPtr) {
+           if ((itemPtr->x1 >= x2) || (itemPtr->x2 < x1)
+                   || (itemPtr->y1 >= y2) || (itemPtr->y2 < y1)) {
+               continue;
+           }
+           if ((*itemPtr->typePtr->pointProc)(canvasPtr,
+                   itemPtr, coords) <= canvasPtr->closeEnough) {
+               closestPtr = itemPtr;
+           }
+       }
+    }
+
+    /*
+     * Simulate a LeaveNotify event on the previous current item and
+     * an EnterNotify event on the new current item.  Remove the "current"
+     * tag from the previous current item and place it on the new current
+     * item.
+     */
+
+    if (closestPtr == canvasPtr->currentItemPtr) {
+       return;
+    }
+    if (canvasPtr->currentItemPtr != NULL) {
+       XEvent event;
+       Tk_Item *itemPtr = canvasPtr->currentItemPtr;
+       int i;
+
+       event = canvasPtr->pickEvent;
+       event.type = LeaveNotify;
+       CanvasDoEvent(canvasPtr, &event);
+       for (i = itemPtr->numTags-1; i >= 0; i--) {
+           if (itemPtr->tagPtr[i] == currentUid) {
+               itemPtr->tagPtr[i] = itemPtr->tagPtr[itemPtr->numTags-1];
+               itemPtr->numTags--;
+               break;
+           }
+       }
+    }
+    canvasPtr->currentItemPtr = closestPtr;
+    if (canvasPtr->currentItemPtr != NULL) {
+       XEvent event;
+
+       DoItem((Tcl_Interp *) NULL, closestPtr, currentUid);
+       event = canvasPtr->pickEvent;
+       event.type = EnterNotify;
+       CanvasDoEvent(canvasPtr, &event);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CanvasDoEvent --
+ *
+ *     This procedure is called to invoke binding processing
+ *     for a new event that is associated with the current item
+ *     for a canvas.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Depends on the bindings for the canvas.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+CanvasDoEvent(canvasPtr, eventPtr)
+    Tk_Canvas *canvasPtr;              /* Canvas widget in which event
+                                        * occurred. */
+    XEvent *eventPtr;                  /* Real or simulated X event that
+                                        * is to be processed. */
+{
+#define NUM_STATIC 3
+    ClientData staticObjects[NUM_STATIC];
+    ClientData *objectPtr;
+    int numObjects, i;
+    register Tk_Item *itemPtr;
+
+    if (canvasPtr->bindingTable == NULL) {
+       return;
+    }
+
+    itemPtr = canvasPtr->currentItemPtr;
+    if ((eventPtr->type == KeyPress) || (eventPtr->type == KeyRelease)) {
+       itemPtr = canvasPtr->focusItemPtr;
+    }
+    if (itemPtr == NULL) {
+       return;
+    }
+
+    /*
+     * Set up an array with all the relevant objects for processing
+     * this event.  The relevant objects are (a) the event's item,
+     * (b) the tags associated with the event's item, and (c) the
+     * tag "all".  If there are a lot of tags then malloc an array
+     * to hold all of the objects.
+     */
+
+    numObjects = itemPtr->numTags + 2;
+    if (numObjects <= NUM_STATIC) {
+       objectPtr = staticObjects;
+    } else {
+       objectPtr = (ClientData *) ckalloc((unsigned)
+               (numObjects * sizeof(ClientData)));
+    }
+    objectPtr[0] = (ClientData) itemPtr;
+    for (i = itemPtr->numTags-1; i >= 0; i--) {
+       objectPtr[i+1] = (ClientData) itemPtr->tagPtr[i];
+    }
+    objectPtr[itemPtr->numTags+1] = (ClientData) allUid;
+
+    /*
+     * Invoke the binding system, then free up the object array if
+     * it was malloc-ed.
+     */
+
+    Tk_BindEvent(canvasPtr->bindingTable, eventPtr, canvasPtr->tkwin,
+           numObjects, objectPtr);
+    if (objectPtr != staticObjects) {
+       ckfree((char *) objectPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * CanvasBlinkProc --
+ *
+ *     This procedure is called as a timer handler to blink the
+ *     insertion cursor off and on.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The cursor gets turned on or off, redisplay gets invoked,
+ *     and this procedure reschedules itself.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+CanvasBlinkProc(clientData)
+    ClientData clientData;     /* Pointer to record describing entry. */
+{
+    register Tk_Canvas *canvasPtr = (Tk_Canvas *) clientData;
+
+    if (!(canvasPtr->flags & GOT_FOCUS) || (canvasPtr->cursorOffTime == 0)) {
+       return;
+    }
+    if (canvasPtr->flags & CURSOR_ON) {
+       canvasPtr->flags &= ~CURSOR_ON;
+       canvasPtr->cursorBlinkHandler = Tk_CreateTimerHandler(
+               canvasPtr->cursorOffTime, CanvasBlinkProc,
+               (ClientData) canvasPtr);
+    } else {
+       canvasPtr->flags |= CURSOR_ON;
+       canvasPtr->cursorBlinkHandler = Tk_CreateTimerHandler(
+               canvasPtr->cursorOnTime, CanvasBlinkProc,
+               (ClientData) canvasPtr);
+    }
+    if (canvasPtr->focusItemPtr != NULL) {
+       EventuallyRedrawArea(canvasPtr, canvasPtr->focusItemPtr->x1,
+               canvasPtr->focusItemPtr->y1, canvasPtr->focusItemPtr->x2,
+               canvasPtr->focusItemPtr->y2);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * CanvasFocusProc --
+ *
+ *     This procedure is called whenever a canvas gets or loses the
+ *     input focus.  It's also called whenever the window is
+ *     reconfigured while it has the focus.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The cursor gets turned on or off.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+CanvasFocusProc(clientData, gotFocus)
+    ClientData clientData;     /* Pointer to structure describing entry. */
+    int gotFocus;              /* 1 means window is getting focus, 0 means
+                                * it's losing it. */
+{
+    register Tk_Canvas *canvasPtr = (Tk_Canvas *) clientData;
+
+    Tk_DeleteTimerHandler(canvasPtr->cursorBlinkHandler);
+    if (gotFocus) {
+       canvasPtr->flags |= GOT_FOCUS | CURSOR_ON;
+       if (canvasPtr->cursorOffTime != 0) {
+           canvasPtr->cursorBlinkHandler = Tk_CreateTimerHandler(
+                   canvasPtr->cursorOnTime, CanvasBlinkProc,
+                   (ClientData) canvasPtr);
+       }
+    } else {
+       canvasPtr->flags &= ~(GOT_FOCUS | CURSOR_ON);
+       canvasPtr->cursorBlinkHandler = (Tk_TimerToken) NULL;
+    }
+    if (canvasPtr->focusItemPtr != NULL) {
+       EventuallyRedrawArea(canvasPtr, canvasPtr->focusItemPtr->x1,
+               canvasPtr->focusItemPtr->y1, canvasPtr->focusItemPtr->x2,
+               canvasPtr->focusItemPtr->y2);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * CanvasSelectTo --
+ *
+ *     Modify the selection by moving its un-anchored end.  This could
+ *     make the selection either larger or smaller.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The selection changes.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+CanvasSelectTo(canvasPtr, itemPtr, index)
+    register Tk_Canvas *canvasPtr;             /* Information about widget. */
+    register Tk_Item *itemPtr;         /* Item that is to hold selection. */
+    int index;                         /* Index of element that is to
+                                        * become the "other" end of the
+                                        * selection. */
+{
+    int oldFirst, oldLast;
+    Tk_Item *oldSelPtr;
+
+    oldFirst = canvasPtr->selectFirst;
+    oldLast = canvasPtr->selectLast;
+    oldSelPtr = canvasPtr->selItemPtr;
+
+    /*
+     * Grab the selection if we don't own it already.
+     */
+
+    if (canvasPtr->selItemPtr == NULL) {
+       Tk_OwnSelection(canvasPtr->tkwin, CanvasLostSelection,
+               (ClientData) canvasPtr);
+    } else if (canvasPtr->selItemPtr != itemPtr) {
+       EventuallyRedrawArea(canvasPtr, canvasPtr->selItemPtr->x1,
+               canvasPtr->selItemPtr->y1, canvasPtr->selItemPtr->x2,
+               canvasPtr->selItemPtr->y2);
+    }
+    canvasPtr->selItemPtr = itemPtr;
+
+    if (canvasPtr->anchorItemPtr != itemPtr) {
+       canvasPtr->anchorItemPtr = itemPtr;
+       canvasPtr->selectAnchor = index;
+    }
+    if (canvasPtr->selectAnchor <= index) {
+       canvasPtr->selectFirst = canvasPtr->selectAnchor;
+       canvasPtr->selectLast = index;
+    } else {
+       canvasPtr->selectFirst = index;
+       canvasPtr->selectLast = canvasPtr->selectAnchor - 1;
+    }
+    if ((canvasPtr->selectFirst != oldFirst)
+           || (canvasPtr->selectLast != oldLast)
+           || (itemPtr != oldSelPtr)) {
+       EventuallyRedrawArea(canvasPtr, itemPtr->x1, itemPtr->y1,
+               itemPtr->x2, itemPtr->y2);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CanvasFetchSelection --
+ *
+ *     This procedure is invoked by Tk to return part or all of
+ *     the selection, when the selection is in a canvas widget.
+ *     This procedure always returns the selection as a STRING.
+ *
+ * Results:
+ *     The return value is the number of non-NULL bytes stored
+ *     at buffer.  Buffer is filled (or partially filled) with a
+ *     NULL-terminated string containing part or all of the selection,
+ *     as given by offset and maxBytes.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+CanvasFetchSelection(clientData, offset, buffer, maxBytes)
+    ClientData clientData;             /* Information about canvas widget. */
+    int offset;                                /* Offset within selection of first
+                                        * character to be returned. */
+    char *buffer;                      /* Location in which to place
+                                        * selection. */
+    int maxBytes;                      /* Maximum number of bytes to place
+                                        * at buffer, not including terminating
+                                        * NULL character. */
+{
+    register Tk_Canvas *canvasPtr = (Tk_Canvas *) clientData;
+
+    if (canvasPtr->selItemPtr == NULL) {
+       return -1;
+    }
+    if (canvasPtr->selItemPtr->typePtr->selectionProc == NULL) {
+       return -1;
+    }
+    return (*canvasPtr->selItemPtr->typePtr->selectionProc)(
+           canvasPtr, canvasPtr->selItemPtr, offset, buffer, maxBytes);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * CanvasLostSelection --
+ *
+ *     This procedure is called back by Tk when the selection is
+ *     grabbed away from a canvas widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The existing selection is unhighlighted, and the window is
+ *     marked as not containing a selection.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+CanvasLostSelection(clientData)
+    ClientData clientData;             /* Information about entry widget. */
+{
+    Tk_Canvas *canvasPtr = (Tk_Canvas *) clientData;
+
+    if (canvasPtr->selItemPtr != NULL) {
+       EventuallyRedrawArea(canvasPtr, canvasPtr->selItemPtr->x1,
+               canvasPtr->selItemPtr->y1, canvasPtr->selItemPtr->x2,
+               canvasPtr->selItemPtr->y2);
+    }
+    canvasPtr->selItemPtr = NULL;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkGetCanvasCoord --
+ *
+ *     Given a string, returns a floating-point canvas coordinate
+ *     corresponding to that string.
+ *
+ * Results:
+ *     The return value is a standard Tcl return result.  If
+ *     TCL_OK is returned, then everything went well and the
+ *     canvas coordinate is stored at *doublePtr;  otherwise
+ *     TCL_ERROR is returned and an error message is left in
+ *     canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+TkGetCanvasCoord(canvasPtr, string, doublePtr)
+    Tk_Canvas *canvasPtr;      /* Canvas to which coordinate applies. */
+    char *string;              /* Describes coordinate (any screen
+                                * coordinate form may be used here). */
+    double *doublePtr;         /* Place to store converted coordinate. */
+{
+    if (Tk_GetScreenMM(canvasPtr->interp, canvasPtr->tkwin, string,
+           doublePtr) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    *doublePtr *= canvasPtr->pixelsPerMM;
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * GridAlign --
+ *
+ *     Given a coordinate and a grid spacing, this procedure
+ *     computes the location of the nearest grid line to the
+ *     coordinate.
+ *
+ * Results:
+ *     The return value is the location of the grid line nearest
+ *     to coord.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static double
+GridAlign(coord, spacing)
+    double coord;              /* Coordinate to grid-align. */
+    double spacing;            /* Spacing between grid lines.   If <= 0
+                                * then no alignment is done. */
+{
+    if (spacing <= 0.0) {
+       return coord;
+    }
+    if (coord < 0) {
+       return -((int) ((-coord)/spacing + 0.5)) * spacing;
+    }
+    return ((int) (coord/spacing + 0.5)) * spacing;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CanvasUpdateScrollbars --
+ *
+ *     This procedure is invoked whenever a canvas has changed in
+ *     a way that requires scrollbars to be redisplayed (e.g. the
+ *     view in the canvas has changed).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If there are scrollbars associated with the canvas, then
+ *     their scrolling commands are invoked to cause them to
+ *     redisplay.  If errors occur, additional Tcl commands may
+ *     be invoked to process the errors.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+CanvasUpdateScrollbars(canvasPtr)
+    register Tk_Canvas *canvasPtr;             /* Information about canvas. */
+{
+    int result, size, first, last, page;
+    char args[200];
+
+#define ROUND(number)                                          \
+    if (number >= 0) {                                         \
+       number = (number + canvasPtr->scrollIncrement/2)        \
+               /canvasPtr->scrollIncrement;                    \
+    } else {                                                   \
+       number = -(((-number) + canvasPtr->scrollIncrement/2)   \
+               /canvasPtr->scrollIncrement);                   \
+    }
+
+    canvasPtr->flags &= ~UPDATE_SCROLLBARS;
+    if (canvasPtr->xScrollCmd != NULL) {
+       size = ((canvasPtr->scrollX2 - canvasPtr->scrollX1)
+               /canvasPtr->scrollIncrement) + 1;
+       first = canvasPtr->xOrigin - canvasPtr->scrollX1;
+       ROUND(first);
+       last = canvasPtr->xOrigin + Tk_Width(canvasPtr->tkwin)
+               - 1 - canvasPtr->scrollX1;
+       ROUND(last);
+       page = last - first - 1;
+       if (page <= 0) {
+           page = 1;
+       }
+       sprintf(args, " %d %d %d %d", size, page, first, last);
+       result = Tcl_VarEval(canvasPtr->interp, canvasPtr->xScrollCmd, args,
+           (char *) NULL);
+       if (result != TCL_OK) {
+           TkBindError(canvasPtr->interp);
+       }
+       Tcl_ResetResult(canvasPtr->interp);
+    }
+
+    if (canvasPtr->yScrollCmd != NULL) {
+       size = ((canvasPtr->scrollY2 - canvasPtr->scrollY1)
+               /canvasPtr->scrollIncrement) + 1;
+       first = canvasPtr->yOrigin - canvasPtr->scrollY1;
+       ROUND(first);
+       last = canvasPtr->yOrigin + Tk_Height(canvasPtr->tkwin)
+               - 1 - canvasPtr->scrollY1;
+       ROUND(last);
+       page = last - first - 1;
+       if (page <= 0) {
+           page = 1;
+       }
+       sprintf(args, " %d %d %d %d", size, page, first, last);
+       result = Tcl_VarEval(canvasPtr->interp, canvasPtr->yScrollCmd, args,
+           (char *) NULL);
+       if (result != TCL_OK) {
+           TkBindError(canvasPtr->interp);
+       }
+       Tcl_ResetResult(canvasPtr->interp);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CanvasSetOrigin --
+ *
+ *     This procedure is invoked to change the mapping between
+ *     canvas coordinates and screen coordinates in the canvas
+ *     window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The canvas will be redisplayed to reflect the change in
+ *     view.  In addition, scrollbars will be updated if there
+ *     are any.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+CanvasSetOrigin(canvasPtr, xOrigin, yOrigin)
+    register Tk_Canvas *canvasPtr;     /* Information about canvas. */
+    int xOrigin;                       /* New X origin for canvas (canvas
+                                        * x-coord corresponding to left edge
+                                        * of canvas window). */
+    int yOrigin;                       /* New Y origin for canvas (canvas
+                                        * y-coord corresponding to top edge
+                                        * of canvas window). */
+{
+    /*
+     * Adjust the origin if necessary to keep as much as possible of the
+     * canvas in the view.
+     */
+
+    if ((canvasPtr->confine) && (canvasPtr->regionString != NULL)) {
+       int windowWidth, windowHeight, canvasWidth, canvasHeight;
+
+       windowWidth = Tk_Width(canvasPtr->tkwin);
+       windowHeight = Tk_Height(canvasPtr->tkwin);
+       canvasWidth = canvasPtr->scrollX2 - canvasPtr->scrollX1;
+       canvasHeight = canvasPtr->scrollY2 - canvasPtr->scrollY1;
+       if (canvasWidth < windowWidth) {
+           xOrigin = (canvasPtr->scrollX1) - (windowWidth-canvasWidth)/2;
+       } else if (xOrigin < canvasPtr->scrollX1) {
+           xOrigin = canvasPtr->scrollX1;
+       } else if (xOrigin > (canvasPtr->scrollX2 - windowWidth)) {
+           xOrigin = canvasPtr->scrollX2 - windowWidth;
+       }
+       if (canvasHeight < windowHeight) {
+           yOrigin = (canvasPtr->scrollY1) - (windowHeight-canvasHeight)/2;
+       } else if (yOrigin < canvasPtr->scrollY1) {
+           yOrigin = canvasPtr->scrollY1;
+       } else if (yOrigin > (canvasPtr->scrollY2 - windowHeight)) {
+           yOrigin = canvasPtr->scrollY2 - windowHeight;
+       }
+    }
+
+    if ((xOrigin == canvasPtr->xOrigin) && (yOrigin == canvasPtr->yOrigin)) {
+       return;
+    }
+
+    /*
+     * Tricky point:  must redisplay not only everything that's visible
+     * in the window's final configuration, but also everything that was
+     * visible in the initial configuration.  This is needed because some
+     * item types, like windows, need to know when they move off-screen
+     * so they can explicitly undisplay themselves.
+     */
+
+    EventuallyRedrawArea(canvasPtr, canvasPtr->xOrigin, canvasPtr->yOrigin,
+           canvasPtr->xOrigin + Tk_Width(canvasPtr->tkwin),
+           canvasPtr->yOrigin + Tk_Height(canvasPtr->tkwin));
+    canvasPtr->xOrigin = xOrigin;
+    canvasPtr->yOrigin = yOrigin;
+    canvasPtr->flags |= UPDATE_SCROLLBARS;
+    EventuallyRedrawArea(canvasPtr, canvasPtr->xOrigin, canvasPtr->yOrigin,
+           canvasPtr->xOrigin + Tk_Width(canvasPtr->tkwin),
+           canvasPtr->yOrigin + Tk_Height(canvasPtr->tkwin));
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CanvasTagsParseProc --
+ *
+ *     This procedure is invoked during option processing to handle
+ *     "-tags" options for canvas items.
+ *
+ * Results:
+ *     A standard Tcl return value.
+ *
+ * Side effects:
+ *     The tags for a given item get replaced by those indicated
+ *     in the value argument.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static int
+CanvasTagsParseProc(clientData, interp, tkwin, value, widgRec, offset)
+    ClientData clientData;             /* Not used.*/
+    Tcl_Interp *interp;                        /* Used for reporting errors. */
+    Tk_Window tkwin;                   /* Window containing canvas widget. */
+    char *value;                       /* Value of option (list of tag
+                                        * names). */
+    char *widgRec;                     /* Pointer to record for item. */
+    int offset;                                /* Offset into item (ignored). */
+{
+    register Tk_Item *itemPtr = (Tk_Item *) widgRec;
+    int argc, i;
+    char **argv;
+    Tk_Uid *newPtr;
+
+    /*
+     * Break the value up into the individual tag names.
+     */
+
+    if (Tcl_SplitList(interp, value, &argc, &argv) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * Make sure that there's enough space in the item to hold the
+     * tag names.
+     */
+
+    if (itemPtr->tagSpace < argc) {
+       newPtr = (Tk_Uid *) ckalloc((unsigned) (argc * sizeof(Tk_Uid)));
+       for (i = itemPtr->numTags-1; i >= 0; i--) {
+           newPtr[i] = itemPtr->tagPtr[i];
+       }
+       if (itemPtr->tagPtr != itemPtr->staticTagSpace) {
+           ckfree((char *) itemPtr->tagPtr);
+       }
+       itemPtr->tagPtr = newPtr;
+       itemPtr->tagSpace = argc;
+    }
+    itemPtr->numTags = argc;
+    for (i = 0; i < argc; i++) {
+       itemPtr->tagPtr[i] = Tk_GetUid(argv[i]);
+    }
+    ckfree((char *) argv);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CanvasTagsPrintProc --
+ *
+ *     This procedure is invoked by the Tk configuration code
+ *     to produce a printable string for the "-tags" configuration
+ *     option for canvas items.
+ *
+ * Results:
+ *     The return value is a string describing all the tags for
+ *     the item referred to by "widgRec".  In addition, *freeProcPtr
+ *     is filled in with the address of a procedure to call to free
+ *     the result string when it's no longer needed (or NULL to
+ *     indicate that the string doesn't need to be freed).
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static char *
+CanvasTagsPrintProc(clientData, tkwin, widgRec, offset, freeProcPtr)
+    ClientData clientData;             /* Ignored. */
+    Tk_Window tkwin;                   /* Window containing canvas widget. */
+    char *widgRec;                     /* Pointer to record for item. */
+    int offset;                                /* Ignored. */
+    Tcl_FreeProc **freeProcPtr;                /* Pointer to variable to fill in with
+                                        * information about how to reclaim
+                                        * storage for return string. */
+{
+    register Tk_Item *itemPtr = (Tk_Item *) widgRec;
+
+    if (itemPtr->numTags == 0) {
+       *freeProcPtr = (Tcl_FreeProc *) NULL;
+       return "";
+    }
+    if (itemPtr->numTags == 1) {
+       *freeProcPtr = (Tcl_FreeProc *) NULL;
+       return (char *) itemPtr->tagPtr[0];
+    }
+    *freeProcPtr = (Tcl_FreeProc *) free;
+    return Tcl_Merge(itemPtr->numTags, (char **) itemPtr->tagPtr);
+}
diff --git a/src/tk/tkcanvas.h b/src/tk/tkcanvas.h
new file mode 100644 (file)
index 0000000..b098c61
--- /dev/null
@@ -0,0 +1,401 @@
+/*
+ * tkCanvas.h --
+ *
+ *     Declarations shared among all the files that implement
+ *     canvas widgets.
+ *
+ * Copyright 1991-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /user6/ouster/wish/RCS/tkCanvas.h,v 1.14 92/08/19 08:34:16 ouster Exp $ SPRITE (Berkeley)
+ */
+
+#ifndef _TKCANVAS
+#define _TKCANVAS
+
+#ifndef _TK
+#include "tk.h"
+#endif
+
+/*
+ * For each item in a canvas widget there exists one record with
+ * the following structure.  Each actual item is represented by
+ * a record with the following stuff at its beginning, plus additional
+ * type-specific stuff after that.
+ */
+
+#define TK_TAG_SPACE 3
+
+typedef struct Tk_Item  {
+    int id;                            /* Unique identifier for this item
+                                        * (also serves as first tag for
+                                        * item). */
+    struct Tk_Item *nextPtr;           /* Next in display list of all
+                                        * items in this canvas.  Later items
+                                        * in list are drawn on top of earlier
+                                        * ones. */
+    Tk_Uid staticTagSpace[TK_TAG_SPACE];/* Built-in space for limited # of
+                                        * tags. */
+    Tk_Uid *tagPtr;                    /* Pointer to array of tags.  Usually
+                                        * points to staticTagSpace, but
+                                        * may point to malloc-ed space if
+                                        * there are lots of tags. */
+    int tagSpace;                      /* Total amount of tag space available
+                                        * at tagPtr. */
+    int numTags;                       /* Number of tag slots actually used
+                                        * at *tagPtr. */
+    struct Tk_ItemType *typePtr;       /* Table of procedures that implement
+                                        * this type of item. */
+    int x1, y1, x2, y2;                        /* Bounding box for item, in integer
+                                        * canvas units. Set by item-specific
+                                        * code and guaranteed to contain every
+                                        * pixel drawn in item.  Item area
+                                        * includes x1 and y1 but not x2
+                                        * and y2. */
+
+    /*
+     *------------------------------------------------------------------
+     * Starting here is additional type-specific stuff;  see the
+     * declarations for individual types to see what is part of
+     * each type.  The actual space below is determined by the
+     * "itemInfoSize" of the type's Tk_ItemType record.
+     *------------------------------------------------------------------
+     */
+} Tk_Item;
+
+/*
+ * The record below describes a canvas widget.  It is made available
+ * to the item procedures so they can access certain shared fields such
+ * as the overall displacement and scale factor for the canvas.
+ */
+
+typedef struct {
+    Tk_Window tkwin;           /* Window that embodies the canvas.  NULL
+                                * means that the window has been destroyed
+                                * but the data structures haven't yet been
+                                * cleaned up.*/
+    Tcl_Interp *interp;                /* Interpreter associated with canvas. */
+    Tk_Item *firstItemPtr;     /* First in list of all items in canvas,
+                                * or NULL if canvas empty. */
+    Tk_Item *lastItemPtr;      /* Last in list of all items in canvas,
+                                * or NULL if canvas empty. */
+
+    /*
+     * Information used when displaying widget:
+     */
+
+    int borderWidth;           /* Width of 3-D border around window. */
+    Tk_3DBorder bgBorder;      /* Used for canvas background. */
+    XColor *bgColor;           /* Color used for clearing to background. */
+    int relief;                        /* Indicates whether window as a whole is
+                                * raised, sunken, or flat. */
+    GC pixmapGC;               /* Used to copy bits from a pixmap to the
+                                * screen and also to clear the pixmap. */
+    int width, height;         /* Dimensions to request for canvas window,
+                                * specified in pixels. */
+    int redrawX1, redrawY1;    /* Upper left corner of area to redraw,
+                                * in pixel coordinates.  Border pixels
+                                * are included.  Only valid if
+                                * REDRAW_PENDING flag is set. */
+    int redrawX2, redrawY2;    /* Lower right corner of area to redraw,
+                                * in pixel coordinates.  Border pixels
+                                * will *not* be redrawn. */
+    int confine;               /* Non-zero means constrain view to keep
+                                * as much of canvas visible as possible. */
+
+    /*
+     * Information used to manage and display selection:
+     */
+
+    Tk_3DBorder selBorder;     /* Border and background for selected
+                                * characters. */
+    int selBorderWidth;                /* Width of border around selection. */
+    XColor *selFgColorPtr;     /* Foreground color for selected text. */
+    Tk_Item *selItemPtr;       /* Pointer to selected item.  NULL means
+                                * selection isn't in this canvas. */
+    int selectFirst;           /* Index of first selected character. */
+    int selectLast;            /* Index of last selected character. */
+    Tk_Item *anchorItemPtr;    /* Item corresponding to "selectAnchor":
+                                * not necessarily selItemPtr. */
+    int selectAnchor;          /* Fixed end of selection (i.e. "select to"
+                                * operation will use this as one end of the
+                                * selection). */
+
+    /*
+     * Information for display insertion cursor in text:
+     */
+
+    Tk_3DBorder cursorBorder;  /* Used to draw vertical bar for insertion
+                                * cursor. */
+    int cursorWidth;           /* Total width of insertion cursor. */
+    int cursorBorderWidth;     /* Width of 3-D border around insert cursor. */
+    int cursorOnTime;          /* Number of milliseconds cursor should spend
+                                * in "on" state for each blink. */
+    int cursorOffTime;         /* Number of milliseconds cursor should spend
+                                * in "off" state for each blink. */
+    Tk_TimerToken cursorBlinkHandler;
+                               /* Timer handler used to blink cursor on and
+                                * off. */
+    Tk_Item *focusItemPtr;     /* Item that currently has the input focus,
+                                * or NULL if no such item. */
+
+    /*
+     * Transformation applied to canvas as a whole:  to compute screen
+     * coordinates (X,Y) from canvas coordinates (x,y), do the following:
+     *
+     * X = x - xOrigin;
+     * Y = y - yOrigin;
+     */
+
+    int xOrigin, yOrigin;      /* Canvas coordinates corresponding to
+                                * upper-left corner of window, given in
+                                * canvas pixel units. */
+    int drawableXOrigin, drawableYOrigin;
+                               /* During redisplay, these fields give the
+                                * canvas coordinates corresponding to
+                                * the upper-left corner of the drawable
+                                * where items are actually being drawn
+                                * (typically a pixmap smaller than the
+                                * whole window). */
+
+    /*
+     * Information used for event bindings associated with items.
+     */
+
+    Tk_BindingTable bindingTable;
+                               /* Table of all bindings currently defined
+                                * for this canvas.  NULL means that no
+                                * bindings exist, so the table hasn't been
+                                * created.  Each "object" used for this
+                                * table is either a Tk_Uid for a tag or
+                                * the address of an item named by id. */
+    Tk_Item *currentItemPtr;   /* The item currently containing the mouse
+                                * pointer, or NULL if none. */
+    double closeEnough;                /* The mouse is assumed to be inside an
+                                * item if it is this close to it. */
+    XEvent pickEvent;          /* The event upon which the current choice
+                                * of currentItem is based.  Must be saved
+                                * so that if the currentItem is deleted,
+                                * can pick another. */
+
+    /*
+     * Information used for managing scrollbars:
+     */
+
+    char *xScrollCmd;          /* Command prefix for communicating with
+                                * horizontal scrollbar.  NULL means no
+                                * horizontal scrollbar.  Malloc'ed*/
+    char *yScrollCmd;          /* Command prefix for communicating with
+                                * vertical scrollbar.  NULL means no
+                                * vertical scrollbar.  Malloc'ed*/
+    int scrollX1, scrollY1, scrollX2, scrollY2;
+                               /* These four coordinates define the region
+                                * that is the 100% area for scrolling (i.e.
+                                * these numbers determine the size and
+                                * location of the sliders on scrollbars).
+                                * Units are pixels in canvas coords. */
+    char *regionString;                /* The option string from which scrollX1
+                                * etc. are derived.  Malloc'ed. */
+    int scrollIncrement;       /* The number of canvas units that the
+                                * picture shifts when a scrollbar up or
+                                * down arrow is pressed. */
+
+    /*
+     * Information used for scanning:
+     */
+
+    int scanX;                 /* X-position at which scan started (e.g.
+                                * button was pressed here). */
+    int scanXOrigin;           /* Value of xOrigin field when scan started. */
+    int scanY;                 /* Y-position at which scan started (e.g.
+                                * button was pressed here). */
+    int scanYOrigin;           /* Value of yOrigin field when scan started. */
+
+    /*
+     * Information used to speed up searches by remembering the last item
+     * created or found with an item id search.
+     */
+
+    Tk_Item *hotPtr;           /* Pointer to "hot" item (one that's been
+                                * recently used.  NULL means there's no
+                                * hot item. */
+    Tk_Item *hotPrevPtr;       /* Pointer to predecessor to hotPtr (NULL
+                                * means item is first in list).  This is
+                                * only a hint and may not really be hotPtr's
+                                * predecessor. */
+
+    /*
+     * Miscellaneous information:
+     */
+
+    Cursor cursor;             /* Current cursor for window, or None. */
+    double pixelsPerMM;                /* Scale factor between MM and pixels;
+                                * used when converting coordinates. */
+    int flags;                 /* Various flags;  see below for
+                                * definitions. */
+    int nextId;                        /* Number to use as id for next item
+                                * created in widget. */
+    Tk_TimerToken updateTimerToken; /* Added by Don to optimize rapid 
+                                    * updates. */
+} Tk_Canvas;
+
+/*
+ * Flag bits for canvases:
+ *
+ * REDRAW_PENDING -            1 means a DoWhenIdle handler has already
+ *                             been created to redraw some or all of the
+ *                             canvas.
+ * REPICK_NEEDED -             1 means DisplayCanvas should pick a new
+ *                             current item before redrawing the canvas.
+ * GOT_FOCUS -                 1 means the focus is currently in this
+ *                             widget, so should draw the insertion cursor.
+ * CURSOR_ON -                 1 means the insertion cursor is in the "on"
+ *                             phase of its blink cycle.  0 means either
+ *                             we don't have the focus or the cursor is in
+ *                             the "off" phase of its cycle.
+ * BUTTON_DOWN -               1 means that a button is currently down;
+ *                             this is used to implement grabs for the
+ *                             duration of button presses.
+ * UPDATE_SCROLLBARS -         1 means the scrollbars should get updated
+ *                             as part of the next display operation.
+ */
+
+#define REDRAW_PENDING         1
+#define REPICK_NEEDED          2
+#define GOT_FOCUS              4
+#define CURSOR_ON              8
+#define BUTTON_DOWN            0x10
+#define UPDATE_SCROLLBARS      0x20
+
+/*
+ * Records of the following type are used to describe a type of
+ * item (e.g.  lines, circles, etc.) that can form part of a
+ * canvas widget.
+ */
+
+typedef int    Tk_ItemCreateProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                   Tk_Item *itemPtr, int argc, char **argv));
+typedef int    Tk_ItemConfigureProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                   Tk_Item *itemPtr, int argc, char **argv, int flags));
+typedef int    Tk_ItemCoordProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                   Tk_Item *itemPtr, int argc, char **argv));
+typedef void   Tk_ItemDeleteProc _ANSI_ARGS_((Tk_Item *itemPtr));
+typedef void   Tk_ItemDisplayProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                   Tk_Item *itemPtr, Drawable dst));
+typedef double Tk_ItemPointProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                   Tk_Item *itemPtr, double *pointPtr));
+typedef int    Tk_ItemAreaProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                   Tk_Item *itemPtr, double *rectPtr));
+typedef void   Tk_ItemPostscriptProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                   Tk_Item *itemPtr));
+typedef void   Tk_ItemScaleProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                   Tk_Item *itemPtr, double originX, double originY,
+                   double scaleX, double scaleY));
+typedef void   Tk_ItemTranslateProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                   Tk_Item *itemPtr, double deltaX, double deltaY));
+typedef int    Tk_ItemIndexProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                   Tk_Item *itemPtr, char *indexString,
+                   int *indexPtr));
+typedef void   Tk_ItemCursorProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                   Tk_Item *itemPtr, int index));
+typedef int    Tk_ItemSelectionProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                   Tk_Item *itemPtr, int offset, char *buffer,
+                   int maxBytes));
+typedef int    Tk_ItemInsertProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                   Tk_Item *itemPtr, int beforeThis, char *string));
+typedef int    Tk_ItemDCharsProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                   Tk_Item *itemPtr, int first, int last));
+
+typedef struct Tk_ItemType {
+    char *name;                                /* The name of this type of item, such
+                                        * as "line". */
+    int itemSize;                      /* Total amount of space needed for
+                                        * item's record. */
+    Tk_ItemCreateProc *createProc;     /* Procedure to create a new item of
+                                        * this type. */
+    Tk_ConfigSpec *configSpecs;                /* Pointer to array of configuration
+                                        * specs for this type.  Used for
+                                        * returning configuration info. */
+    Tk_ItemConfigureProc *configProc;  /* Procedure to call to change
+                                        * configuration options. */
+    Tk_ItemCoordProc *coordProc;       /* Procedure to call to get and set
+                                        * the item's coordinates. */
+    Tk_ItemDeleteProc *deleteProc;     /* Procedure to delete existing item of
+                                        * this type. */
+    Tk_ItemDisplayProc *displayProc;   /* Procedure to display items of
+                                        * this type. */
+    int alwaysRedraw;                  /* Non-zero means displayProc should
+                                        * be called even when the item has
+                                        * been moved off-screen. */
+    Tk_ItemPointProc *pointProc;       /* Computes distance from item to
+                                        * a given point. */
+    Tk_ItemAreaProc *areaProc;         /* Computes whether item is inside,
+                                        * outside, or overlapping an area. */
+    Tk_ItemPostscriptProc *postscriptProc;
+                                       /* Procedure to write a Postscript
+                                        * description for items of this
+                                        * type. */
+    Tk_ItemScaleProc *scaleProc;       /* Procedure to rescale items of
+                                        * this type. */
+    Tk_ItemTranslateProc *translateProc;/* Procedure to translate items of
+                                        * this type. */
+    Tk_ItemIndexProc *indexProc;       /* Procedure to determine index of
+                                        * indicated character.  NULL if
+                                        * item doesn't support indexing. */
+    Tk_ItemCursorProc *cursorProc;     /* Procedure to set cursor position
+                                        * to just before a given position. */
+    Tk_ItemSelectionProc *selectionProc;/* Procedure to return selection (in
+                                        * STRING format) when it is in this
+                                        * item. */
+    Tk_ItemInsertProc *insertProc;     /* Procedure to insert something into
+                                        * an item. */
+    Tk_ItemDCharsProc *dCharsProc;     /* Procedure to delete characters
+                                        * from an item. */
+    struct Tk_ItemType *nextPtr;       /* Used to link types together into
+                                        * a list. */
+} Tk_ItemType;
+
+/*
+ * Macros to transform a point from double-precision canvas coordinates
+ * to integer pixel coordinates in the pixmap where redisplay is being
+ * done.
+ */
+
+#define SCREEN_X(canvasPtr, x) \
+       (((int) ((x) + 0.5)) - (canvasPtr)->drawableXOrigin)
+#define SCREEN_Y(canvasPtr, y) \
+       (((int) ((y) + 0.5)) - (canvasPtr)->drawableYOrigin)
+
+/*
+ * Canvas-related variables that are shared among Tk modules but not
+ * exported to the outside world:
+ */
+
+extern Tk_CustomOption tkCanvasTagsOption;
+
+/*
+ * Canvas-related procedures that are shared among Tk modules but not
+ * exported to the outside world:
+ */
+
+extern void            TkBezierScreenPoints _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           double control[], int numSteps,
+                           XPoint *xPointPtr));
+extern void            TkFillPolygon _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           double *coordPtr, int numPoints, Drawable drawable,
+                           GC gc));
+extern int             TkGetCanvasCoord _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           char *string, double *doublePtr));
+extern void            TkIncludePoint _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *pointPtr));
+extern int             TkMakeBezierCurve _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           double *pointPtr, int numPoints, int numSteps,
+                           XPoint xPoints[], double dblPoints[]));
+
+#endif /* _TKCANVAS */
diff --git a/src/tk/tkcmds.c b/src/tk/tkcmds.c
new file mode 100644 (file)
index 0000000..465740e
--- /dev/null
@@ -0,0 +1,818 @@
+/* 
+ * tkCmds.c --
+ *
+ *     This file contains a collection of Tk-related Tcl commands
+ *     that didn't fit in any particular file of the toolkit.
+ *
+ * Copyright 1990-1992 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkCmds.c,v 1.32 92/06/03 14:21:14 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tkconfig.h"
+#include "tkint.h"
+
+/*
+ * The data structure below is used by the "after" command to remember
+ * the command to be executed later.
+ */
+
+typedef struct {
+    Tcl_Interp *interp;                /* Interpreter in which to execute command. */
+    char *command;             /* Command to execute.  Malloc'ed, so must
+                                * be freed when structure is deallocated. 
+                                * NULL means nothing to execute. */
+    int *donePtr;              /* If non-NULL indicates address of word to
+                                * set to 1 when command has finally been
+                                * executed. */
+} AfterInfo;
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            AfterProc _ANSI_ARGS_((ClientData clientData));
+static char *          WaitVariableProc _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, char *name1, char *name2,
+                           int flags));
+static void            WaitWindowProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_AfterCmd --
+ *
+ *     This procedure is invoked to process the "after" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tk_AfterCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter.  Not used.*/
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    int ms;
+    AfterInfo *afterPtr;
+    int done;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " milliseconds ?command? ?arg arg ...?\"",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if ((Tcl_GetInt(interp, argv[1], &ms) != TCL_OK) || (ms <= 0)) {
+       Tcl_AppendResult(interp, "bad milliseconds value \"",
+               argv[1], "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    afterPtr = (AfterInfo *) ckalloc((unsigned) (sizeof(AfterInfo)));
+    afterPtr->interp = interp;
+    if (argc == 2) {
+       afterPtr->command = (char *) NULL;
+       done = 0;
+       afterPtr->donePtr = &done;
+    } else if (argc == 3) {
+       afterPtr->command = (char *) ckalloc((unsigned) (strlen(argv[2]) + 1));
+       strcpy(afterPtr->command, argv[2]);
+       afterPtr->donePtr = (int *) NULL;
+    } else {
+       afterPtr->command = Tcl_Concat(argc-2, argv+2);
+       afterPtr->donePtr = (int *) NULL;
+    }
+    Tk_CreateTimerHandler(ms, AfterProc, (ClientData) afterPtr);
+    if (argc == 2) {
+       while (!done) {
+           Tk_DoOneEvent(0);
+       }
+    }
+
+    /*
+     * Must reset interpreter result because it could have changed as
+     * part of events processed by Tk_DoOneEvent.
+     */
+
+    Tcl_ResetResult(interp);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * AfterProc --
+ *
+ *     Timer callback to execute commands registered with the
+ *     "after" command.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Executes whatever command was specified.  If the command
+ *     returns an error, then the command "tkerror" is invoked
+ *     to process the error;  if tkerror fails then information
+ *     about the error is output on stderr.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+AfterProc(clientData)
+    ClientData clientData;     /* Describes command to execute. */
+{
+    AfterInfo *afterPtr = (AfterInfo *) clientData;
+    int result;
+
+    if (afterPtr->command != NULL) {
+       result = Tcl_GlobalEval(afterPtr->interp, afterPtr->command);
+       if (result != TCL_OK) {
+           TkBindError(afterPtr->interp);
+       }
+       ckfree(afterPtr->command);
+    }
+    if (afterPtr->donePtr != NULL) {
+       *afterPtr->donePtr = 1;
+    }
+    ckfree((char *) afterPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_BindCmd --
+ *
+ *     This procedure is invoked to process the "bind" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tk_BindCmd(clientData, interp, argc, argv)
+    ClientData clientData;             /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    TkWindow *winPtr;
+    ClientData object;
+
+    if ((argc < 2) || (argc > 4)) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " window ?pattern? ?command?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (argv[1][0] == '.') {
+       winPtr = (TkWindow *) Tk_NameToWindow(interp, argv[1], tkwin);
+       if (winPtr == NULL) {
+           return TCL_ERROR;
+       }
+       object = (ClientData) winPtr->pathName;
+    } else {
+       winPtr = (TkWindow *) clientData;
+       object = (ClientData) Tk_GetUid(argv[1]);
+    }
+
+    if (argc == 4) {
+       int append = 0;
+       unsigned long mask;
+
+       if (argv[3][0] == 0) {
+           return Tk_DeleteBinding(interp, winPtr->mainPtr->bindingTable,
+                   object, argv[2]);
+       }
+       if (argv[3][0] == '+') {
+           argv[3]++;
+           append = 1;
+       }
+       mask = Tk_CreateBinding(interp, winPtr->mainPtr->bindingTable,
+               object, argv[2], argv[3], append);
+       if (mask == 0) {
+           return TCL_ERROR;
+       }
+    } else if (argc == 3) {
+       char *command;
+
+       command = Tk_GetBinding(interp, winPtr->mainPtr->bindingTable,
+               object, argv[2]);
+       if (command == NULL) {
+           Tcl_ResetResult(interp);
+           return TCL_OK;
+       }
+       interp->result = command;
+    } else {
+       Tk_GetAllBindings(interp, winPtr->mainPtr->bindingTable, object);
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBindEventProc --
+ *
+ *     This procedure is invoked by Tk_HandleEvent for each event;  it
+ *     causes any appropriate bindings for that event to be invoked.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Depends on what bindings have been established with the "bind"
+ *     command.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkBindEventProc(winPtr, eventPtr)
+    TkWindow *winPtr;                  /* Pointer to info about window. */
+    XEvent *eventPtr;                  /* Information about event. */
+{
+    ClientData objects[3];
+    static Tk_Uid allUid = NULL;
+
+    if ((winPtr->mainPtr == NULL) || (winPtr->mainPtr->bindingTable == NULL)) {
+       return;
+    }
+    objects[0] = (ClientData) winPtr->pathName;
+    objects[1] = (ClientData) winPtr->classUid;
+    if (allUid == NULL) {
+       allUid = Tk_GetUid("all");
+    }
+    objects[2] = (ClientData) allUid;
+    Tk_BindEvent(winPtr->mainPtr->bindingTable, eventPtr,
+           (Tk_Window) winPtr, 3, objects);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_DestroyCmd --
+ *
+ *     This procedure is invoked to process the "destroy" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tk_DestroyCmd(clientData, interp, argc, argv)
+    ClientData clientData;             /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window window;
+    Tk_Window tkwin = (Tk_Window) clientData;
+
+    if (argc != 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " pathName\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    window = Tk_NameToWindow(interp, argv[1], tkwin);
+    if (window == NULL) {
+       return TCL_ERROR;
+    }
+    Tk_DestroyWindow(window);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_UpdateCmd --
+ *
+ *     This procedure is invoked to process the "update" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tk_UpdateCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    int flags;
+
+    if (argc == 1) {
+       flags = TK_DONT_WAIT;
+    } else if (argc == 2) {
+       if (strncmp(argv[1], "idletasks", strlen(argv[1])) != 0) {
+           Tcl_AppendResult(interp, "bad argument \"", argv[1],
+                   "\": must be idletasks", (char *) NULL);
+           return TCL_ERROR;
+       }
+       flags = TK_IDLE_EVENTS;
+    } else {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " ?idletasks?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Handle all pending events, sync the display, and repeat over
+     * and over again until all pending events have been handled.
+     */
+
+    while (1) {
+       while (Tk_DoOneEvent(flags) != 0) {
+           /* Empty loop body */
+       }
+       XSync(Tk_Display(tkwin), False);
+       if (Tk_DoOneEvent(flags) == 0) {
+           break;
+       }
+    }
+
+    /*
+     * Must clear the interpreter's result because event handlers could
+     * have executed commands.
+     */
+
+    Tcl_ResetResult(interp);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_TkwaitCmd --
+ *
+ *     This procedure is invoked to process the "wait" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tk_TkwaitCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    int c, length;
+    int done;
+
+    if (argc != 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " variable|window name\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'v') && (strncmp(argv[1], "variable", length) == 0)) {
+       Tcl_TraceVar(interp, argv[2],
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               WaitVariableProc, (ClientData) &done);
+       done = 0;
+       while (!done) {
+           Tk_DoOneEvent(0);
+       }
+       Tcl_UntraceVar(interp, argv[2],
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               WaitVariableProc, (ClientData) &done);
+    } else if ((c == 'w') && (strncmp(argv[1], "window", length) == 0)) {
+       Tk_Window window;
+
+       window = Tk_NameToWindow(interp, argv[2], tkwin);
+       if (window == NULL) {
+           return TCL_ERROR;
+       }
+       Tk_CreateEventHandler(window, StructureNotifyMask,
+           WaitWindowProc, (ClientData) &done);
+       done = 0;
+       while (!done) {
+           Tk_DoOneEvent(0);
+       }
+       Tk_DeleteEventHandler(window, StructureNotifyMask,
+           WaitWindowProc, (ClientData) &done);
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\": must be variable or window", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Clear out the interpreter's result, since it may have been set
+     * by event handlers.
+     */
+
+    Tcl_ResetResult(interp);
+    return TCL_OK;
+}
+
+       /* ARGSUSED */
+static char *
+WaitVariableProc(clientData, interp, name1, name2, flags)
+    ClientData clientData;     /* Pointer to integer to set to 1. */
+    Tcl_Interp *interp;                /* Interpreter containing variable. */
+    char *name1;               /* Name of variable. */
+    char *name2;               /* Second part of variable name. */
+    int flags;                 /* Information about what happened. */
+{
+    int *donePtr = (int *) clientData;
+
+    *donePtr = 1;
+    return (char *) NULL;
+}
+
+static void
+WaitWindowProc(clientData, eventPtr)
+    ClientData clientData;     /* Pointer to integer to set to 1. */
+    XEvent *eventPtr;          /* Information about event. */
+{
+    int *donePtr = (int *) clientData;
+
+    if (eventPtr->type == DestroyNotify) {
+       *donePtr = 1;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_WinfoCmd --
+ *
+ *     This procedure is invoked to process the "winfo" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tk_WinfoCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    int length;
+    char c, *argName;
+    Tk_Window window;
+    register TkWindow *winPtr;
+
+#define SETUP(name) \
+    if (argc != 3) {\
+       argName = name; \
+       goto wrongArgs; \
+    } \
+    window = Tk_NameToWindow(interp, argv[2], tkwin); \
+    if (window == NULL) { \
+       return TCL_ERROR; \
+    }
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option ?arg?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'a') && (strcmp(argv[1], "atom") == 0)) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " atom name\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       sprintf(interp->result, "%d", Tk_InternAtom(tkwin, argv[2]));
+    } else if ((c == 'a') && (strncmp(argv[1], "atomname", length) == 0)
+           && (length >= 5)) {
+       Atom atom;
+       char *name;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " atomname id\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (Tcl_GetInt(interp, argv[2], (int *) &atom) != TCL_OK) {
+           return TCL_ERROR;
+       }
+       name = Tk_GetAtomName(tkwin, atom);
+       if (strcmp(name, "?bad atom?") == 0) {
+           Tcl_AppendResult(interp, "no atom exists with id \"",
+                   argv[2], "\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       interp->result = name;
+    } else if ((c == 'c') && (strncmp(argv[1], "children", length) == 0)
+           && (length >= 2)) {
+       char *separator, *childName;
+
+       SETUP("children");
+       separator = "";
+       for (winPtr = ((TkWindow *) window)->childList; winPtr != NULL;
+               winPtr = winPtr->nextPtr) {
+           childName = Tcl_Merge(1, &winPtr->pathName);
+           Tcl_AppendResult(interp, separator, childName, (char *) NULL);
+           ckfree(childName);
+           separator = " ";
+       }
+    } else if ((c == 'c') && (strncmp(argv[1], "class", length) == 0)
+           && (length >= 2)) {
+       SETUP("class");
+       interp->result = Tk_Class(window);
+    } else if ((c == 'c') && (strncmp(argv[1], "containing", length) == 0)
+           && (length >= 2)) {
+       int rootX, rootY;
+
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " containing rootX rootY\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if ((Tk_GetPixels(interp, tkwin, argv[2], &rootX) != TCL_OK)
+               || (Tk_GetPixels(interp, tkwin, argv[3], &rootY) != TCL_OK)) {
+           return TCL_ERROR;
+       }
+       window = Tk_CoordsToWindow(rootX, rootY, tkwin);
+       if (window != NULL) {
+           interp->result = Tk_PathName(window);
+       }
+    } else if ((c == 'f') && (strncmp(argv[1], "fpixels", length) == 0)
+           && (length >= 2)) {
+       double mm, pixels;
+
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " fpixels window number\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       window = Tk_NameToWindow(interp, argv[2], tkwin);
+       if (window == NULL) {
+           return TCL_ERROR;
+       }
+       if (Tk_GetScreenMM(interp, window, argv[3], &mm) != TCL_OK) {
+           return TCL_ERROR;
+       }
+       pixels = mm * WidthOfScreen(Tk_Screen(window))
+               / WidthMMOfScreen(Tk_Screen(window));
+       sprintf(interp->result, "%g", pixels);
+    } else if ((c == 'g') && (strncmp(argv[1], "geometry", length) == 0)) {
+       SETUP("geometry");
+       sprintf(interp->result, "%dx%d+%d+%d", Tk_Width(window),
+               Tk_Height(window), Tk_X(window), Tk_Y(window));
+    } else if ((c == 'h') && (strncmp(argv[1], "height", length) == 0)) {
+       SETUP("height");
+       sprintf(interp->result, "%d", Tk_Height(window));
+    } else if ((c == 'i') && (strcmp(argv[1], "id") == 0)) {
+       SETUP("id");
+       sprintf(interp->result, "0x%x", Tk_WindowId(window));
+    } else if ((c == 'i') && (strncmp(argv[1], "interps", length) == 0)
+           && (length >= 2)) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args:  should be \"",
+                   argv[1], " interps\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       return TkGetInterpNames(interp, tkwin);
+    } else if ((c == 'i') && (strncmp(argv[1], "ismapped", length) == 0)
+           && (length >= 2)) {
+       SETUP("ismapped");
+       interp->result = Tk_IsMapped(window) ? "1" : "0";
+    } else if ((c == 'n') && (strncmp(argv[1], "name", length) == 0)) {
+       SETUP("geometry");
+       interp->result = Tk_Name(window);
+    } else if ((c == 'p') && (strncmp(argv[1], "parent", length) == 0)) {
+       SETUP("geometry");
+       winPtr = (TkWindow *) window;
+       if (winPtr->parentPtr != NULL) {
+           interp->result = winPtr->parentPtr->pathName;
+       }
+    } else if ((c == 'p') && (strncmp(argv[1], "pathname", length) == 0)
+           && (length >= 2)) {
+       Window id;
+
+       if (argc != 3) {
+           argName = "pathname";
+           goto wrongArgs;
+       }
+       if (Tcl_GetInt(interp, argv[2], (int *) &id) != TCL_OK) {
+           return TCL_ERROR;
+       }
+       if ((XFindContext(Tk_Display(tkwin), id, tkWindowContext,
+               (void *) &window) != 0) || (((TkWindow *) window)->mainPtr
+               != ((TkWindow *) tkwin)->mainPtr)) {
+           Tcl_AppendResult(interp, "window id \"", argv[2],
+                   "\" doesn't exist in this application", (char *) NULL);
+           return TCL_ERROR;
+       }
+       interp->result = Tk_PathName(window);
+    } else if ((c == 'p') && (strncmp(argv[1], "pixels", length) == 0)
+           && (length >= 2)) {
+       int pixels;
+
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " pixels window number\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       window = Tk_NameToWindow(interp, argv[2], tkwin);
+       if (window == NULL) {
+           return TCL_ERROR;
+       }
+       if (Tk_GetPixels(interp, window, argv[3], &pixels) != TCL_OK) {
+           return TCL_ERROR;
+       }
+       sprintf(interp->result, "%d", pixels);
+    } else if ((c == 'r') && (strncmp(argv[1], "reqheight", length) == 0)
+           && (length >= 4)) {
+       SETUP("reqheight");
+       sprintf(interp->result, "%d", Tk_ReqHeight(window));
+    } else if ((c == 'r') && (strncmp(argv[1], "reqwidth", length) == 0)
+           && (length >= 4)) {
+       SETUP("reqwidth");
+       sprintf(interp->result, "%d", Tk_ReqWidth(window));
+    } else if ((c == 'r') && (strcmp(argv[1], "rootx") == 0)) {
+       int x, y;
+
+       SETUP("rootx");
+       Tk_GetRootCoords(window, &x, &y);
+       sprintf(interp->result, "%d", x);
+    } else if ((c == 'r') && (strcmp(argv[1], "rooty") == 0)) {
+       int x, y;
+
+       SETUP("rooty");
+       Tk_GetRootCoords(window, &x, &y);
+       sprintf(interp->result, "%d", y);
+    } else if ((c == 's') && (strcmp(argv[1], "screen") == 0)) {
+       char string[20];
+
+       SETUP("screen");
+       sprintf(string, "%d", Tk_ScreenNumber(window));
+       Tcl_AppendResult(interp, Tk_DisplayName(window), ".", string,
+               (char *) NULL);
+    } else if ((c == 's') && (strncmp(argv[1], "screencells", length) == 0)
+           && (length >= 7)) {
+       SETUP("screencells");
+       sprintf(interp->result, "%d", Tk_DefaultVisual(Tk_Screen(window))->map_entries);
+    } else if ((c == 's') && (strncmp(argv[1], "screendepth", length) == 0)
+           && (length >= 7)) {
+       SETUP("screendepth");
+       sprintf(interp->result, "%d", Tk_DefaultDepth(Tk_Screen(window)));
+    } else if ((c == 's') && (strncmp(argv[1], "screenheight", length) == 0)
+           && (length >= 7)) {
+       SETUP("screenheight");
+       sprintf(interp->result, "%d",  HeightOfScreen(Tk_Screen(window)));
+    } else if ((c == 's') && (strncmp(argv[1], "screenmmheight", length) == 0)
+           && (length >= 9)) {
+       SETUP("screenmmheight");
+       sprintf(interp->result, "%d",  HeightMMOfScreen(Tk_Screen(window)));
+    } else if ((c == 's') && (strncmp(argv[1], "screenmmwidth", length) == 0)
+           && (length >= 9)) {
+       SETUP("screenmmwidth");
+       sprintf(interp->result, "%d",  WidthMMOfScreen(Tk_Screen(window)));
+    } else if ((c == 's') && (strncmp(argv[1], "screenvisual", length) == 0)
+           && (length >= 7)) {
+       SETUP("screenvisual");
+       switch (Tk_DefaultVisual(Tk_Screen(window))->class) {
+           case PseudoColor:   interp->result = "pseudocolor"; break;
+           case GrayScale:     interp->result = "grayscale"; break;
+           case DirectColor:   interp->result = "directcolor"; break;
+           case TrueColor:     interp->result = "truecolor"; break;
+           case StaticColor:   interp->result = "staticcolor"; break;
+           case StaticGray:    interp->result = "staticgray"; break;
+           default:            interp->result = "unknown"; break;
+       }
+    } else if ((c == 's') && (strncmp(argv[1], "screenwidth", length) == 0)
+           && (length >= 7)) {
+       SETUP("screenwidth");
+       sprintf(interp->result, "%d",  WidthOfScreen(Tk_Screen(window)));
+    } else if ((c == 's') && (strcmp(argv[1], "server") == 0)) {
+       SETUP("server");
+       Tcl_AppendResult(interp, Tk_DisplayName(window), (char *) NULL);
+    } else if ((c == 't') && (strncmp(argv[1], "toplevel", length) == 0)) {
+       SETUP("toplevel");
+       for (winPtr = (TkWindow *) window; !(winPtr->flags & TK_TOP_LEVEL);
+               winPtr = winPtr->parentPtr) {
+           /* Empty loop body. */
+       }
+       interp->result = winPtr->pathName;
+    } else if ((c == 'w') && (strncmp(argv[1], "width", length) == 0)) {
+       SETUP("width");
+       sprintf(interp->result, "%d", Tk_Width(window));
+    } else if ((c == 'x') && (argv[1][1] == '\0')) {
+       SETUP("x");
+       sprintf(interp->result, "%d", Tk_X(window));
+    } else if ((c == 'y') && (argv[1][1] == '\0')) {
+       SETUP("y");
+       sprintf(interp->result, "%d", Tk_Y(window));
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\": must be atom, atomname, children, class, fpixels, geometry, height, ",
+               "id, interps, ismapped, name, parent, pathname, ",
+               "pixels, reqheight, reqwidth, rootx, rooty, ",
+               "screen, screencells, screendepth, screenheight, ",
+               "screenmmheight, screenmmwidth, screenvisual, ",
+               "screenwidth, toplevel, width, x, or y", (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+
+    wrongArgs:
+    Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+           argv[0], " ", argName, " window\"", (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkDeadAppCmd --
+ *
+ *     If an application has been deleted then all Tk commands will be
+ *     re-bound to this procedure.
+ *
+ * Results:
+ *     A standard Tcl error is reported to let the user know that
+ *     the application is dead.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+TkDeadAppCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Dummy. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tcl_AppendResult(interp, "can't invoke \"", argv[0],
+           "\" command:  application has been destroyed", (char *) NULL);
+    return TCL_ERROR;
+}
diff --git a/src/tk/tkcolor.c b/src/tk/tkcolor.c
new file mode 100644 (file)
index 0000000..7a7e835
--- /dev/null
@@ -0,0 +1,576 @@
+/* 
+ * tkColor.c --
+ *
+ *     This file maintains a database of color values for the Tk
+ *     toolkit, in order to avoid round-trips to the server to
+ *     map color names to pixel values.
+ *
+ * Copyright 1990 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkColor.c,v 1.15 92/07/14 08:44:49 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tkconfig.h"
+#include "tk.h"
+
+/*
+ * A two-level data structure is used to manage the color database.
+ * The top level consists of one entry for each color name that is
+ * currently active, and the bottom level contains one entry for each
+ * pixel value that is still in use.  The distinction between
+ * levels is necessary because the same pixel may have several
+ * different names.  There are two hash tables, one used to index into
+ * each of the data structures.  The name hash table is used when
+ * allocating colors, and the pixel hash table is used when freeing
+ * colors.
+ */
+
+/*
+ * One of the following data structures is used to keep track of
+ * each color that this module has allocated from the X display
+ * server.  These entries are indexed by two hash tables defined
+ * below:  nameTable and valueTable.
+ */
+
+#define COLOR_MAGIC 0xc6140277
+
+typedef struct TkColor {
+    XColor color;              /* Information about this color. */
+    int magic;                 /* Used for quick integrity check on this
+                                * structure.   Must always have the
+                                * value COLOR_MAGIC. */
+    Screen *screen;            /* Screen where this color is valid.  Used
+                                * to delete it. */
+    Colormap colormap;         /* Colormap from which this entry was
+                                * allocated. */
+    int refCount;              /* Number of uses of this structure. */
+    Tcl_HashTable *tablePtr;   /* Hash table that indexes this structure
+                                * (needed when deleting structure). */
+    Tcl_HashEntry *hashPtr;    /* Pointer to hash table entry for this
+                                * structure. (for use in deleting entry). */
+} TkColor;
+
+typedef struct VisInfo {
+    Visual *visual;
+    Screen *screen;
+    Colormap colormap;
+    int depth;
+    Pixmap pixmap;
+    GC gc;
+} VisInfo;
+
+/*
+ * Hash table for name -> TkColor mapping, and key structure used to
+ * index into that table:
+ */
+
+static Tcl_HashTable nameTable;
+typedef struct {
+    Tk_Uid name;               /* Name of desired color. */
+    Colormap colormap;         /* Colormap from which color will be
+                                * allocated. */
+    Display *display;          /* Display for colormap. */
+} NameKey;
+
+/*
+ * Hash table for value -> TkColor mapping, and key structure used to
+ * index into that table:
+ */
+
+static Tcl_HashTable valueTable;
+typedef struct {
+    int red, green, blue;      /* Values for desired color. */
+    Colormap colormap;         /* Colormap from which color will be
+                                * allocated. */
+    Display *display;          /* Display for colormap. */
+} ValueKey;
+
+/*
+ * Global colormap creation flag
+ */
+char *TK_CreateColormap = 0;
+
+/*
+ * Hash table for screen -> VisInfo mapping, and key structure used to
+ * index into that table:
+ */
+
+static Tcl_HashTable screenTable;
+
+static int initialized = 0;    /* 0 means static structures haven't been
+                                * initialized yet. */
+
+/*
+ * Forward declarations for procedures defined in this file:
+ */
+
+static void            ColorInit _ANSI_ARGS_((void));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_GetColor --
+ *
+ *     Given a string name for a color, map the name to a corresponding
+ *     XColor structure.
+ *
+ * Results:
+ *     The return value is a pointer to an XColor structure that
+ *     indicates the red, blue, and green intensities for the color
+ *     given by "name", and also specifies a pixel value to use to
+ *     draw in that color in window "tkwin".  If an error occurs,
+ *     then NULL is returned and an error message will be left in
+ *     interp->result.
+ *
+ * Side effects:
+ *     The color is added to an internal database with a reference count.
+ *     For each call to this procedure, there should eventually be a call
+ *     to Tk_FreeColor, so that the database is cleaned up when colors
+ *     aren't in use anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+
+XColor *
+Tk_GetColor(interp, tkwin, colormap, name)
+    Tcl_Interp *interp;                /* Place to leave error message if
+                                * color can't be found. */
+    Tk_Window tkwin;           /* Window in which color will be used. */
+    Colormap colormap;         /* Map from which to allocate color.  None
+                                * means use default. */
+    Tk_Uid name;               /* Name of color to allocated (in form
+                                * suitable for passing to XParseColor). */
+{
+    NameKey nameKey;
+    Tcl_HashEntry *nameHashPtr;
+    int new;
+    TkColor *tkColPtr;
+    XColor color;
+
+    if (!initialized) {
+       ColorInit();
+    }
+
+    /*
+     * First, check to see if there's already a mapping for this color
+     * name.
+     */
+
+    nameKey.name = name;
+    if (colormap == None) {
+       colormap = Tk_DefaultColormap(Tk_Screen(tkwin));
+    }
+    nameKey.colormap = colormap;
+    nameKey.display = Tk_Display(tkwin);
+    nameHashPtr = Tcl_CreateHashEntry(&nameTable, (char *) &nameKey, &new);
+    if (!new) {
+       tkColPtr = (TkColor *) Tcl_GetHashValue(nameHashPtr);
+       tkColPtr->refCount++;
+       return &tkColPtr->color;
+    }
+
+    /*
+     * The name isn't currently known.  Map from the name to a pixel
+     * value.  Be tricky here, and call XAllocNamedColor instead of
+     * XParseColor for non-# names:  this saves a server round-trip
+     * for those names.
+     */
+
+    if (*name != '#') {
+       XColor screen;
+
+       if (XAllocNamedColor(Tk_Display(tkwin), colormap, name,
+               &screen, &color) == 0) {
+           allocFailed:
+           Tcl_AppendResult(interp, "couldn't allocate a color for \"",
+                   name, "\"", (char *) NULL);
+           Tcl_DeleteHashEntry(nameHashPtr);
+           return (XColor *) NULL;
+       }
+    } else {
+       if (XParseColor(Tk_Display(tkwin), colormap, name, &color) == 0) {
+           Tcl_AppendResult(interp, "invalid color name \"", name,
+                   "\"", (char *) NULL);
+           Tcl_DeleteHashEntry(nameHashPtr);
+           return (XColor *) NULL;
+       }
+       if (XAllocColor(Tk_Display(tkwin), colormap, &color) == 0) {
+           goto allocFailed;
+       }
+    }
+
+    /*
+     * Now create a new TkColor structure and add it to nameTable.
+     */
+
+    tkColPtr = (TkColor *) ckalloc(sizeof(TkColor));
+    tkColPtr->color = color;
+    tkColPtr->magic = COLOR_MAGIC;
+    tkColPtr->screen = Tk_Screen(tkwin);
+    tkColPtr->colormap = colormap;
+    tkColPtr->refCount = 1;
+    tkColPtr->tablePtr = &nameTable;
+    tkColPtr->hashPtr = nameHashPtr;
+    Tcl_SetHashValue(nameHashPtr, tkColPtr);
+
+    return &tkColPtr->color;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_GetColorByValue --
+ *
+ *     Given a desired set of red-green-blue intensities for a color,
+ *     locate a pixel value to use to draw that color in a given
+ *     window.
+ *
+ * Results:
+ *     The return value is a pointer to an XColor structure that
+ *     indicates the closest red, blue, and green intensities available
+ *     to those specified in colorPtr, and also specifies a pixel
+ *     value to use to draw in that color in window "tkwin".  If an
+ *     error occurs, then NULL is returned and an error message will
+ *     be left in interp->result.
+ *
+ * Side effects:
+ *     The color is added to an internal database with a reference count.
+ *     For each call to this procedure, there should eventually be a call
+ *     to Tk_FreeColor, so that the database is cleaned up when colors
+ *     aren't in use anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+
+XColor *
+Tk_GetColorByValue(interp, tkwin, colormap, colorPtr)
+    Tcl_Interp *interp;                /* Place to leave error message if
+                                * color can't be found. */
+    Tk_Window tkwin;           /* Window in which color will be used. */
+    Colormap colormap;         /* Map from which to allocate color.  None
+                                * means use default. */
+    XColor *colorPtr;          /* Red, green, and blue fields indicate
+                                * desired color. */
+{
+    ValueKey valueKey;
+    Tcl_HashEntry *valueHashPtr;
+    int new;
+    TkColor *tkColPtr;
+
+    if (!initialized) {
+       ColorInit();
+    }
+
+    /*
+     * First, check to see if there's already a mapping for this color
+     * name.
+     */
+
+    valueKey.red = colorPtr->red;
+    valueKey.green = colorPtr->green;
+    valueKey.blue = colorPtr->blue;
+    if (colormap == None) {
+       colormap = Tk_DefaultColormap(Tk_Screen(tkwin));
+    }
+    valueKey.colormap = colormap;
+    valueKey.display = Tk_Display(tkwin);
+    valueHashPtr = Tcl_CreateHashEntry(&valueTable, (char *) &valueKey, &new);
+    if (!new) {
+       tkColPtr = (TkColor *) Tcl_GetHashValue(valueHashPtr);
+       tkColPtr->refCount++;
+       return &tkColPtr->color;
+    }
+
+    /*
+     * The name isn't currently known.  Find a pixel value for this
+     * color and add a new structure to valueTable.
+     */
+
+    tkColPtr = (TkColor *) ckalloc(sizeof(TkColor));
+    tkColPtr->color.red = valueKey.red;
+    tkColPtr->color.green = valueKey.green;
+    tkColPtr->color.blue = valueKey.blue;
+    if (XAllocColor(Tk_Display(tkwin), colormap, &tkColPtr->color) == 0) {
+       sprintf(interp->result, "couldn't allocate color");
+       Tcl_DeleteHashEntry(valueHashPtr);
+       ckfree((char *) tkColPtr);
+       return (XColor *) NULL;
+    }
+    tkColPtr->magic = COLOR_MAGIC;
+    tkColPtr->screen = Tk_Screen(tkwin);
+    tkColPtr->colormap = colormap;
+    tkColPtr->refCount = 1;
+    tkColPtr->tablePtr = &valueTable;
+    tkColPtr->hashPtr = valueHashPtr;
+    Tcl_SetHashValue(valueHashPtr, tkColPtr);
+
+    return &tkColPtr->color;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_NameOfColor --
+ *
+ *     Given a color, return a textual string identifying
+ *     the color.
+ *
+ * Results:
+ *     If colorPtr was created by Tk_GetColor, then the return
+ *     value is the "string" that was used to create it.
+ *     Otherwise the return value is a string that could have
+ *     been passed to Tk_GetColor to allocate that color.  The
+ *     storage for the returned string is only guaranteed to
+ *     persist up until the next call to this procedure.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+char *
+Tk_NameOfColor(colorPtr)
+    XColor *colorPtr;          /* Color whose name is desired. */
+{
+    register TkColor *tkColPtr = (TkColor *) colorPtr;
+    static char string[20];
+
+    if ((tkColPtr->magic == COLOR_MAGIC)
+           && (tkColPtr->tablePtr == &nameTable)) {
+       return ((NameKey *) tkColPtr->hashPtr->key.words)->name;
+    }
+    sprintf(string, "#%4x%4x%4x", colorPtr->red, colorPtr->green,
+           colorPtr->blue);
+    return string;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_FreeColor --
+ *
+ *     This procedure is called to release a color allocated by
+ *     Tk_GetColor.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The reference count associated with colorPtr is deleted, and
+ *     the color is released to X if there are no remaining uses
+ *     for it.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_FreeColor(colorPtr)
+    XColor *colorPtr;          /* Color to be released.  Must have been
+                                * allocated by Tk_GetColor or
+                                * Tk_GetColorByValue. */
+{
+    register TkColor *tkColPtr = (TkColor *) colorPtr;
+    Visual *visual;
+    Screen *screen = tkColPtr->screen;
+
+    /*
+     * Do a quick sanity check to make sure this color was really
+     * allocated by Tk_GetColor.
+     */
+
+    if (tkColPtr->magic != COLOR_MAGIC) {
+       panic("Tk_FreeColor called with bogus color");
+    }
+
+    tkColPtr->refCount--;
+    if (tkColPtr->refCount == 0) {
+
+       /*
+        * Careful!  Don't free black or white, since this will
+        * make some servers very unhappy.
+        */
+
+       visual = Tk_DefaultVisual(screen);
+       if ((visual->class != StaticGray) && (visual->class != StaticColor)
+               && (tkColPtr->color.pixel != BlackPixelOfScreen(screen))
+               && (tkColPtr->color.pixel != WhitePixelOfScreen(screen))) {
+           XFreeColors(DisplayOfScreen(screen), tkColPtr->colormap,
+                   &tkColPtr->color.pixel, 1, 0L);
+       }
+       Tcl_DeleteHashEntry(tkColPtr->hashPtr);
+       tkColPtr->magic = 0;
+       ckfree((char *) tkColPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ColorInit --
+ *
+ *     Initialize the structure used for color management.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Read the code.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ColorInit()
+{
+    initialized = 1;
+    Tcl_InitHashTable(&nameTable, sizeof(NameKey)/sizeof(int));
+    Tcl_InitHashTable(&valueTable, sizeof(ValueKey)/sizeof(int));
+    Tcl_InitHashTable(&screenTable, TCL_ONE_WORD_KEYS);
+}
+
+
+int
+Tk_IndexOfScreen(Screen *screen)
+{
+  Display *dpy = DisplayOfScreen(screen);
+  int i, nscreens = ScreenCount(dpy);
+
+  for (i = 0; i < nscreens; i++) {
+    if (screen == ScreenOfDisplay(dpy, i))
+      return (i);
+  }
+  return (DefaultScreen(dpy));
+}
+
+
+VisInfo *
+Tk_VisInfo(Screen *screen)
+{
+    Tcl_HashEntry *hashPtr;
+    VisInfo *info;
+    XVisualInfo vTemplate;
+    XVisualInfo *visualList;
+    Visual *visual;
+    XGCValues values;
+    int visualsMatched, scrnum, new;
+
+    if (!initialized) {
+       ColorInit();
+    }
+
+    hashPtr = Tcl_CreateHashEntry(&screenTable, (char *) screen, &new);
+    if (!new) {
+       info = (VisInfo *) Tcl_GetHashValue(hashPtr);
+    } else {
+       info = (VisInfo *) ckalloc(sizeof(VisInfo));
+       info->screen = screen;
+
+/* Workaround to support non-default visuals */
+#if 0
+       info->visual = XDefaultVisualOfScreen(screen);
+       info->depth = XDefaultDepthOfScreen(screen);
+       info->colormap = XDefaultColormapOfScreen(screen);
+       info->gc = DefaultGCOfScreen(screen);
+#else
+       scrnum = Tk_IndexOfScreen(screen);
+       vTemplate.screen = scrnum;
+       vTemplate.depth = 8;
+       vTemplate.class = PseudoColor;
+       visualList =
+         XGetVisualInfo(DisplayOfScreen(screen),
+                        VisualScreenMask |
+                        VisualDepthMask |
+                        VisualClassMask,
+                        &vTemplate, &visualsMatched);
+       if (visualsMatched > 0) {
+           info->visual = visualList[0].visual;
+           info->depth = 8;
+           info->pixmap = XCreatePixmap(screen->display,
+                                        RootWindowOfScreen(screen),
+                                        1, 1, 8);
+//fprintf(stderr, "TK_CreateColormap %d\n", TK_CreateColormap);
+           if ((TK_CreateColormap == 0) &&
+               (info->visual == DefaultVisualOfScreen(screen))) {
+             info->colormap = DefaultColormapOfScreen(screen);
+             info->gc = DefaultGCOfScreen(screen);
+           } else {
+             info->colormap =
+               XCreateColormap(screen->display,
+                               RootWindowOfScreen(screen),
+                               info->visual, AllocNone);
+             info->gc =
+               XCreateGC(screen->display,
+                         info->pixmap, 0, &values);
+           }
+       } else {
+           info->visual = XDefaultVisualOfScreen(screen);
+           info->depth = XDefaultDepthOfScreen(screen);
+           info->pixmap = XCreatePixmap(screen->display,
+                                        RootWindowOfScreen(screen),
+                                        1, 1, info->depth);
+           info->colormap = XDefaultColormapOfScreen(screen);
+           info->gc = DefaultGCOfScreen(screen);
+       }
+
+       XFree((char *)visualList);
+#endif
+
+       Tcl_SetHashValue(hashPtr, info);
+    }
+
+    return (info);
+}
+
+
+int
+Tk_DefaultDepth(Screen *screen)
+{
+    return (Tk_VisInfo(screen)->depth);
+}
+
+
+Visual *
+Tk_DefaultVisual(Screen *screen)
+{
+    return (Tk_VisInfo(screen)->visual);
+}
+
+
+Colormap
+Tk_DefaultColormap(Screen *screen)
+{
+    return (Tk_VisInfo(screen)->colormap);
+}
+
+
+Window
+Tk_DefaultRootWindow(Display *dpy)
+{
+    return (DefaultRootWindow(dpy));
+}
+
+
+GC
+Tk_DefaultGC(Screen *screen)
+{
+  return (Tk_VisInfo(screen)->gc);
+}
+
+
+Pixmap
+Tk_DefaultPixmap(Screen *screen)
+{
+  return (Tk_VisInfo(screen)->pixmap);
+}
+
+
diff --git a/src/tk/tkconfig.c b/src/tk/tkconfig.c
new file mode 100644 (file)
index 0000000..6087513
--- /dev/null
@@ -0,0 +1,847 @@
+/* 
+ * tkConfig.c --
+ *
+ *     This file contains the Tk_ConfigureWidget procedure.
+ *
+ * Copyright 1990-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkConfig.c,v 1.28 92/07/25 15:52:26 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tk.h"
+
+/*
+ * Values for "flags" field of Tk_ConfigSpec structures.  Be sure
+ * to coordinate these values with those defined in tk.h
+ * (TK_CONFIG_COLOR_ONLY, etc.).  There must not be overlap!
+ *
+ * INIT -              Non-zero means (char *) things have been
+ *                     converted to Tk_Uid's.
+ */
+
+#define INIT           0x20
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static int             DoConfig _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, Tk_ConfigSpec *specPtr,
+                           Tk_Uid value, int valueIsUid, char *widgRec));
+static Tk_ConfigSpec * FindConfigSpec _ANSI_ARGS_ ((Tcl_Interp *interp,
+                           Tk_ConfigSpec *specs, char *argvName,
+                           int needFlags, int hateFlags));
+static char *          FormatConfigInfo _ANSI_ARGS_ ((Tk_Window tkwin,
+                           Tk_ConfigSpec *specPtr, char *widgRec));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_ConfigureWidget --
+ *
+ *     Process command-line options and database options to
+ *     fill in fields of a widget record with resources and
+ *     other parameters.
+ *
+ * Results:
+ *     A standard Tcl return value.  In case of an error,
+ *     interp->result will hold an error message.
+ *
+ * Side effects:
+ *     The fields of widgRec get filled in with information
+ *     from argc/argv and the option database.  Old information
+ *     in widgRec's fields gets recycled.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_ConfigureWidget(interp, tkwin, specs, argc, argv, widgRec, flags)
+    Tcl_Interp *interp;                /* Interpreter for error reporting. */
+    Tk_Window tkwin;           /* Window containing widget (needed to
+                                * set up X resources). */
+    Tk_ConfigSpec *specs;      /* Describes legal options. */
+    int argc;                  /* Number of elements in argv. */
+    char **argv;               /* Command-line options. */
+    char *widgRec;             /* Record whose fields are to be
+                                * modified.  Values must be properly
+                                * initialized. */
+    int flags;                 /* Used to specify additional flags
+                                * that must be present in config specs
+                                * for them to be considered.  Also,
+                                * may have TK_CONFIG_ARGV_ONLY set. */
+{
+    register Tk_ConfigSpec *specPtr;
+    Tk_Uid value;              /* Value of option from database. */
+    int needFlags;             /* Specs must contain this set of flags
+                                * or else they are not considered. */
+    int hateFlags;             /* If a spec contains any bits here, it's
+                                * not considered. */
+
+    needFlags = flags & ~(TK_CONFIG_USER_BIT - 1);
+    if (Tk_DefaultDepth(Tk_Screen(tkwin)) == 1) {
+       hateFlags = TK_CONFIG_COLOR_ONLY;
+    } else {
+       hateFlags = TK_CONFIG_MONO_ONLY;
+    }
+
+    /*
+     * Pass one:  scan through all the option specs, replacing strings
+     * with Tk_Uids (if this hasn't been done already) and clearing
+     * the TK_CONFIG_OPTION_SPECIFIED flags.
+     */
+
+    for (specPtr = specs; specPtr->type != TK_CONFIG_END; specPtr++) {
+       if (!(specPtr->specFlags & INIT) && (specPtr->argvName != NULL)) {
+           if (specPtr->dbName != NULL) {
+               specPtr->dbName = Tk_GetUid(specPtr->dbName);
+           }
+           if (specPtr->dbClass != NULL) {
+               specPtr->dbClass = Tk_GetUid(specPtr->dbClass);
+           }
+           if (specPtr->defValue != NULL) {
+               specPtr->defValue = Tk_GetUid(specPtr->defValue);
+           }
+       }
+       specPtr->specFlags = (specPtr->specFlags & ~TK_CONFIG_OPTION_SPECIFIED)
+               | INIT;
+    }
+
+    /*
+     * Pass two:  scan through all of the arguments, processing those
+     * that match entries in the specs.
+     */
+
+    for ( ; argc > 0; argc -= 2, argv += 2) {
+       specPtr = FindConfigSpec(interp, specs, *argv, needFlags, hateFlags);
+       if (specPtr == NULL) {
+           return TCL_ERROR;
+       }
+
+       /*
+        * Process the entry.
+        */
+
+       if (argc < 2) {
+           Tcl_AppendResult(interp, "value for \"", *argv,
+                   "\" missing", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (DoConfig(interp, tkwin, specPtr, argv[1], 0, widgRec) != TCL_OK) {
+           char msg[100];
+
+           sprintf(msg, "\n    (processing \"%.40s\" option)",
+                   specPtr->argvName);
+           Tcl_AddErrorInfo(interp, msg);
+           return TCL_ERROR;
+       }
+       specPtr->specFlags |= TK_CONFIG_OPTION_SPECIFIED;
+    }
+
+    /*
+     * Pass three:  scan through all of the specs again;  if no
+     * command-line argument matched a spec, then check for info
+     * in the option database.  If there was nothing in the
+     * database, then use the default.
+     */
+
+    if (!(flags & TK_CONFIG_ARGV_ONLY)) {
+       for (specPtr = specs; specPtr->type != TK_CONFIG_END; specPtr++) {
+           if ((specPtr->specFlags & TK_CONFIG_OPTION_SPECIFIED)
+                   || (specPtr->argvName == NULL)
+                   || (specPtr->type == TK_CONFIG_SYNONYM)) {
+               continue;
+           }
+           if (((specPtr->specFlags & needFlags) != needFlags)
+                   || (specPtr->specFlags & hateFlags)) {
+               continue;
+           }
+           value = NULL;
+           if (specPtr->dbName != NULL) {
+               value = Tk_GetOption(tkwin, specPtr->dbName, specPtr->dbClass);
+           }
+           if (value != NULL) {
+               if (DoConfig(interp, tkwin, specPtr, value, 1, widgRec) !=
+                       TCL_OK) {
+                   char msg[200];
+    
+                   sprintf(msg, "\n    (%s \"%.50s\" in widget \"%.50s\")",
+                           "database entry for",
+                           specPtr->dbName, Tk_PathName(tkwin));
+                   Tcl_AddErrorInfo(interp, msg);
+                   return TCL_ERROR;
+               }
+           } else {
+               value = specPtr->defValue;
+               if ((value != NULL) && !(specPtr->specFlags
+                       & TK_CONFIG_DONT_SET_DEFAULT)) {
+                   if (DoConfig(interp, tkwin, specPtr, value, 1, widgRec) !=
+                           TCL_OK) {
+                       char msg[200];
+       
+                       sprintf(msg,
+                               "\n    (%s \"%.50s\" in widget \"%.50s\")",
+                               "default value for",
+                               specPtr->dbName, Tk_PathName(tkwin));
+                       Tcl_AddErrorInfo(interp, msg);
+                       return TCL_ERROR;
+                   }
+               }
+           }
+       }
+    }
+
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * FindConfigSpec --
+ *
+ *     Search through a table of configuration specs, looking for
+ *     one that matches a given argvName.
+ *
+ * Results:
+ *     The return value is a pointer to the matching entry, or NULL
+ *     if nothing matched.  In that case an error message is left
+ *     in interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static Tk_ConfigSpec *
+FindConfigSpec(interp, specs, argvName, needFlags, hateFlags)
+    Tcl_Interp *interp;                /* Used for reporting errors. */
+    Tk_ConfigSpec *specs;      /* Pointer to table of configuration
+                                * specifications for a widget. */
+    char *argvName;            /* Name (suitable for use in a "config"
+                                * command) identifying particular option. */
+    int needFlags;             /* Flags that must be present in matching
+                                * entry. */
+    int hateFlags;             /* Flags that must NOT be present in
+                                * matching entry. */
+{
+    register Tk_ConfigSpec *specPtr;
+    register char c;           /* First character of current argument. */
+    Tk_ConfigSpec *matchPtr;   /* Matching spec, or NULL. */
+    int length;
+
+    c = argvName[1];
+    length = strlen(argvName);
+    matchPtr = NULL;
+    for (specPtr = specs; specPtr->type != TK_CONFIG_END; specPtr++) {
+       if (specPtr->argvName == NULL) {
+           continue;
+       }
+       if ((specPtr->argvName[1] != c)
+               || (strncmp(specPtr->argvName, argvName, length) != 0)) {
+           continue;
+       }
+       if (((specPtr->specFlags & needFlags) != needFlags)
+               || (specPtr->specFlags & hateFlags)) {
+           continue;
+       }
+       if (specPtr->argvName[length] == 0) {
+           matchPtr = specPtr;
+           goto gotMatch;
+       }
+       if (matchPtr != NULL) {
+           Tcl_AppendResult(interp, "ambiguous option \"", argvName,
+                   "\"", (char *) NULL);
+           return (Tk_ConfigSpec *) NULL;
+       }
+       matchPtr = specPtr;
+    }
+
+    if (matchPtr == NULL) {
+       Tcl_AppendResult(interp, "unknown option \"", argvName,
+               "\"", (char *) NULL);
+       return (Tk_ConfigSpec *) NULL;
+    }
+
+    /*
+     * Found a matching entry.  If it's a synonym, then find the
+     * entry that it's a synonym for.
+     */
+
+    gotMatch:
+    specPtr = matchPtr;
+    if (specPtr->type == TK_CONFIG_SYNONYM) {
+       for (specPtr = specs; ; specPtr++) {
+           if (specPtr->type == TK_CONFIG_END) {
+               Tcl_AppendResult(interp,
+                       "couldn't find synonym for option \"",
+                       argvName, "\"", (char *) NULL);
+               return (Tk_ConfigSpec *) NULL;
+           }
+           if ((specPtr->dbName == matchPtr->dbName) 
+                   && (specPtr->type != TK_CONFIG_SYNONYM)
+                   && ((specPtr->specFlags & needFlags) == needFlags)
+                   && !(specPtr->specFlags & hateFlags)) {
+               break;
+           }
+       }
+    }
+    return specPtr;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DoConfig --
+ *
+ *     This procedure applies a single configuration option
+ *     to a widget record.
+ *
+ * Results:
+ *     A standard Tcl return value.
+ *
+ * Side effects:
+ *     WidgRec is modified as indicated by specPtr and value.
+ *     The old value is recycled, if that is appropriate for
+ *     the value type.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+DoConfig(interp, tkwin, specPtr, value, valueIsUid, widgRec)
+    Tcl_Interp *interp;                /* Interpreter for error reporting. */
+    Tk_Window tkwin;           /* Window containing widget (needed to
+                                * set up X resources). */
+    Tk_ConfigSpec *specPtr;    /* Specifier to apply. */
+    char *value;               /* Value to use to fill in widgRec. */
+    int valueIsUid;            /* Non-zero means value is a Tk_Uid;
+                                * zero means it's an ordinary string. */
+    char *widgRec;             /* Record whose fields are to be
+                                * modified.  Values must be properly
+                                * initialized. */
+{
+    char *ptr;
+    Tk_Uid uid;
+    int nullValue;
+
+    nullValue = 0;
+    if ((*value == 0) && (specPtr->specFlags & TK_CONFIG_NULL_OK)) {
+       nullValue = 1;
+    }
+
+    do {
+       ptr = widgRec + specPtr->offset;
+       switch (specPtr->type) {
+           case TK_CONFIG_BOOLEAN:
+               if (Tcl_GetBoolean(interp, value, (int *) ptr) != TCL_OK) {
+                   return TCL_ERROR;
+               }
+               break;
+           case TK_CONFIG_INT:
+               if (Tcl_GetInt(interp, value, (int *) ptr) != TCL_OK) {
+                   return TCL_ERROR;
+               }
+               break;
+           case TK_CONFIG_DOUBLE:
+               if (Tcl_GetDouble(interp, value, (double *) ptr) != TCL_OK) {
+                   return TCL_ERROR;
+               }
+               break;
+           case TK_CONFIG_STRING: {
+               char *old, *new;
+
+               if (nullValue) {
+                   new = NULL;
+               } else {
+                   new = (char *) ckalloc((unsigned) (strlen(value) + 1));
+                   strcpy(new, value);
+               }
+               old = *((char **) ptr);
+               if (old != NULL) {
+                   ckfree(old);
+               }
+               *((char **) ptr) = new;
+               break;
+           }
+           case TK_CONFIG_UID:
+               if (nullValue) {
+                   *((Tk_Uid *) ptr) = NULL;
+               } else {
+                   uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);
+                   *((Tk_Uid *) ptr) = uid;
+               }
+               break;
+           case TK_CONFIG_COLOR: {
+               XColor *newPtr, *oldPtr;
+
+               if (nullValue) {
+                   newPtr = NULL;
+               } else {
+                   uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);
+                   newPtr = Tk_GetColor(interp, tkwin, (Colormap) None, uid);
+                   if (newPtr == NULL) {
+                       return TCL_ERROR;
+                   }
+               }
+               oldPtr = *((XColor **) ptr);
+               if (oldPtr != NULL) {
+                   Tk_FreeColor(oldPtr);
+               }
+               *((XColor **) ptr) = newPtr;
+               break;
+           }
+           case TK_CONFIG_FONT: {
+               XFontStruct *newPtr, *oldPtr;
+
+               if (nullValue) {
+                   newPtr = NULL;
+               } else {
+                   uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);
+                   newPtr = Tk_GetFontStruct(interp, tkwin, uid);
+                   if (newPtr == NULL) {
+                       return TCL_ERROR;
+                   }
+               }
+               oldPtr = *((XFontStruct **) ptr);
+               if (oldPtr != NULL) {
+                   Tk_FreeFontStruct(oldPtr);
+               }
+               *((XFontStruct **) ptr) = newPtr;
+               break;
+           }
+           case TK_CONFIG_BITMAP: {
+               Pixmap new, old;
+
+               if (nullValue) {
+                   new = None;
+               } else {
+                   uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);
+                   new = Tk_GetBitmap(interp, tkwin, uid);
+                   if (new == None) {
+                       return TCL_ERROR;
+                   }
+               }
+               old = *((Pixmap *) ptr);
+               if (old != None) {
+                   Tk_FreeBitmap(old);
+               }
+               *((Pixmap *) ptr) = new;
+               break;
+           }
+#if defined(USE_XPM3)
+           case TK_CONFIG_PIXMAP: {
+               Pixmap new, old;
+
+               if (nullValue) {
+                   new = None;
+               } else {
+                   uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);
+                   new = Tk_GetPixmap(interp, tkwin, uid);
+                   if (new == None) {
+                       return TCL_ERROR;
+                   }
+               }
+               old = *((Pixmap *) ptr);
+               if (old != None) {
+                   Tk_FreePixmap(old);
+               }
+               *((Pixmap *) ptr) = new;
+               break;
+           }
+#endif
+           case TK_CONFIG_BORDER: {
+               Tk_3DBorder new, old;
+
+               if (nullValue) {
+                   new = NULL;
+               } else {
+                   uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);
+                   new = Tk_Get3DBorder(interp, tkwin, (Colormap) None, uid);
+                   if (new == NULL) {
+                       return TCL_ERROR;
+                   }
+               }
+               old = *((Tk_3DBorder *) ptr);
+               if (old != NULL) {
+                   Tk_Free3DBorder(old);
+               }
+               *((Tk_3DBorder *) ptr) = new;
+               break;
+           }
+           case TK_CONFIG_RELIEF:
+               uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);
+               if (Tk_GetRelief(interp, uid, (int *) ptr) != TCL_OK) {
+                   return TCL_ERROR;
+               }
+               break;
+           case TK_CONFIG_CURSOR:
+           case TK_CONFIG_ACTIVE_CURSOR: {
+               Cursor new, old;
+
+               if (nullValue) {
+                   new = None;
+               } else {
+                   uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);
+                   new = Tk_GetCursor(interp, tkwin, uid);
+                   if (new == None) {
+                       return TCL_ERROR;
+                   }
+               }
+               old = *((Cursor *) ptr);
+               if (old != None) {
+                   Tk_FreeCursor(old);
+               }
+               *((Cursor *) ptr) = new;
+               if (specPtr->type == TK_CONFIG_ACTIVE_CURSOR) {
+                   Tk_DefineCursor(tkwin, new);
+               }
+               break;
+           }
+           case TK_CONFIG_JUSTIFY:
+               uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);
+               if (Tk_GetJustify(interp, uid, (Tk_Justify *) ptr) != TCL_OK) {
+                   return TCL_ERROR;
+               }
+               break;
+           case TK_CONFIG_ANCHOR:
+               uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);
+               if (Tk_GetAnchor(interp, uid, (Tk_Anchor *) ptr) != TCL_OK) {
+                   return TCL_ERROR;
+               }
+               break;
+           case TK_CONFIG_CAP_STYLE:
+               uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);
+               if (Tk_GetCapStyle(interp, uid, (int *) ptr) != TCL_OK) {
+                   return TCL_ERROR;
+               }
+               break;
+           case TK_CONFIG_JOIN_STYLE:
+               uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);
+               if (Tk_GetJoinStyle(interp, uid, (int *) ptr) != TCL_OK) {
+                   return TCL_ERROR;
+               }
+               break;
+           case TK_CONFIG_PIXELS:
+               if (Tk_GetPixels(interp, tkwin, value, (int *) ptr)
+                       != TCL_OK) {
+                   return TCL_ERROR;
+               }
+               break;
+           case TK_CONFIG_MM:
+               if (Tk_GetScreenMM(interp, tkwin, value, (double *) ptr)
+                       != TCL_OK) {
+                   return TCL_ERROR;
+               }
+               break;
+           case TK_CONFIG_WINDOW: {
+               Tk_Window tkwin2;
+
+               if (nullValue) {
+                   tkwin2 = NULL;
+               } else {
+                   tkwin2 = Tk_NameToWindow(interp, value, tkwin);
+                   if (tkwin2 == NULL) {
+                       return TCL_ERROR;
+                   }
+               }
+               *((Tk_Window *) ptr) = tkwin2;
+               break;
+           }
+           case TK_CONFIG_CUSTOM:
+               if ((*specPtr->customPtr->parseProc)(
+                       specPtr->customPtr->clientData, interp, tkwin,
+                       value, widgRec, specPtr->offset) != TCL_OK) {
+                   return TCL_ERROR;
+               }
+               break;
+           default: {
+               sprintf(interp->result, "bad config table: unknown type %d",
+                       specPtr->type);
+               return TCL_ERROR;
+           }
+       }
+       specPtr++;
+    } while ((specPtr->argvName == NULL) && (specPtr->type != TK_CONFIG_END));
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_ConfigureInfo --
+ *
+ *     Return information about the configuration options
+ *     for a window, and their current values.
+ *
+ * Results:
+ *     Always returns TCL_OK.  Interp->result will be modified
+ *     hold a description of either a single configuration option
+ *     available for "widgRec" via "specs", or all the configuration
+ *     options available.  In the "all" case, the result will
+ *     available for "widgRec" via "specs".  The result will
+ *     be a list, each of whose entries describes one option.
+ *     Each entry will itself be a list containing the option's
+ *     name for use on command lines, database name, database
+ *     class, default value, and current value (empty string
+ *     if none).  For options that are synonyms, the list will
+ *     contain only two values:  name and synonym name.  If the
+ *     "name" argument is non-NULL, then the only information
+ *     returned is that for the named argument (i.e. the corresponding
+ *     entry in the overall list is returned).
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_ConfigureInfo(interp, tkwin, specs, widgRec, argvName, flags)
+    Tcl_Interp *interp;                /* Interpreter for error reporting. */
+    Tk_Window tkwin;           /* Window corresponding to widgRec. */
+    Tk_ConfigSpec *specs;      /* Describes legal options. */
+    char *widgRec;             /* Record whose fields contain current
+                                * values for options. */
+    char *argvName;            /* If non-NULL, indicates a single option
+                                * whose info is to be returned.  Otherwise
+                                * info is returned for all options. */
+    int flags;                 /* Used to specify additional flags
+                                * that must be present in config specs
+                                * for them to be considered. */
+{
+    register Tk_ConfigSpec *specPtr;
+    int needFlags, hateFlags;
+    char *list;
+    char *leader = "{";
+
+    needFlags = flags & ~(TK_CONFIG_USER_BIT - 1);
+    if (Tk_DefaultDepth(Tk_Screen(tkwin)) == 1) {
+       hateFlags = TK_CONFIG_COLOR_ONLY;
+    } else {
+       hateFlags = TK_CONFIG_MONO_ONLY;
+    }
+
+    /*
+     * If information is only wanted for a single configuration
+     * spec, then handle that one spec specially.
+     */
+
+    Tcl_SetResult(interp, (char *) NULL, TCL_STATIC);
+    if (argvName != NULL) {
+       specPtr = FindConfigSpec(interp, specs, argvName, needFlags,
+               hateFlags);
+       if (specPtr == NULL) {
+           return TCL_ERROR;
+       }
+       interp->result = FormatConfigInfo(tkwin, specPtr, widgRec);
+       interp->freeProc = TCL_DYNAMIC;
+       return TCL_OK;
+    }
+
+    /*
+     * Loop through all the specs, creating a big list with all
+     * their information.
+     */
+
+    for (specPtr = specs; specPtr->type != TK_CONFIG_END; specPtr++) {
+       if ((argvName != NULL) && (specPtr->argvName != argvName)) {
+           continue;
+       }
+       if (((specPtr->specFlags & needFlags) != needFlags)
+               || (specPtr->specFlags & hateFlags)) {
+           continue;
+       }
+       if (specPtr->argvName == NULL) {
+           continue;
+       }
+       list = FormatConfigInfo(tkwin, specPtr, widgRec);
+       Tcl_AppendResult(interp, leader, list, "}", (char *) NULL);
+       ckfree(list);
+       leader = " {";
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * FormatConfigInfo --
+ *
+ *     Create a valid Tcl list holding the configuration information
+ *     for a single configuration option.
+ *
+ * Results:
+ *     A Tcl list, dynamically allocated.  The caller is expected to
+ *     arrange for this list to be freed eventually.
+ *
+ * Side effects:
+ *     Memory is allocated.
+ *
+ *--------------------------------------------------------------
+ */
+
+static char *
+FormatConfigInfo(tkwin, specPtr, widgRec)
+    Tk_Window tkwin;                   /* Window corresponding to widget. */
+    register Tk_ConfigSpec *specPtr;   /* Pointer to information describing
+                                        * option. */
+    char *widgRec;                     /* Pointer to record holding current
+                                        * values of info for widget. */
+{
+    char *argv[6], *ptr, *result;
+    char buffer[200];
+    Tcl_FreeProc *freeProc = (Tcl_FreeProc *) NULL;
+
+    argv[0] = specPtr->argvName;
+    argv[1] = specPtr->dbName;
+    argv[2] = specPtr->dbClass;
+    argv[3] = specPtr->defValue;
+    if (specPtr->type == TK_CONFIG_SYNONYM) {
+       return Tcl_Merge(2, argv);
+    }
+    ptr = widgRec + specPtr->offset;
+    argv[4] = "";
+    switch (specPtr->type) {
+       case TK_CONFIG_BOOLEAN:
+           if (*((int *) ptr) == 0) {
+               argv[4] = "false";
+           } else {
+               argv[4] = "true";
+           }
+           break;
+       case TK_CONFIG_INT:
+           sprintf(buffer, "%d", *((int *) ptr));
+           argv[4] = buffer;
+           break;
+       case TK_CONFIG_DOUBLE:
+           sprintf(buffer, "%g", *((double *) ptr));
+           argv[4] = buffer;
+           break;
+       case TK_CONFIG_STRING:
+           argv[4] = (*(char **) ptr);
+           break;
+       case TK_CONFIG_UID: {
+           Tk_Uid uid = *((Tk_Uid *) ptr);
+           if (uid != NULL) {
+               argv[4] = uid;
+           }
+           break;
+       }
+       case TK_CONFIG_COLOR: {
+           XColor *colorPtr = *((XColor **) ptr);
+           if (colorPtr != NULL) {
+               argv[4] = Tk_NameOfColor(colorPtr);
+           }
+           break;
+       }
+       case TK_CONFIG_FONT: {
+           XFontStruct *fontStructPtr = *((XFontStruct **) ptr);
+           if (fontStructPtr != NULL) {
+               argv[4] = Tk_NameOfFontStruct(fontStructPtr);
+           }
+           break;
+       }
+       case TK_CONFIG_BITMAP: {
+           Pixmap pixmap = *((Pixmap *) ptr);
+           if (pixmap != None) {
+               argv[4] = Tk_NameOfBitmap(pixmap);
+           }
+           break;
+       }
+#if defined(USE_XPM3)
+       case TK_CONFIG_PIXMAP: {
+           Pixmap pixmap = *((Pixmap *) ptr);
+           if (pixmap != None) {
+               argv[4] = Tk_NameOfPixmap(pixmap);
+           }
+           break;
+       }
+#endif
+       case TK_CONFIG_BORDER: {
+           Tk_3DBorder border = *((Tk_3DBorder *) ptr);
+           if (border != NULL) {
+               argv[4] = Tk_NameOf3DBorder(border);
+           }
+           break;
+       }
+       case TK_CONFIG_RELIEF:
+           argv[4] = Tk_NameOfRelief(*((int *) ptr));
+           break;
+       case TK_CONFIG_CURSOR:
+       case TK_CONFIG_ACTIVE_CURSOR: {
+           Cursor cursor = *((Cursor *) ptr);
+           if (cursor != None) {
+               argv[4] = Tk_NameOfCursor(cursor);
+           }
+           break;
+       }
+       case TK_CONFIG_JUSTIFY:
+           argv[4] = Tk_NameOfJustify(*((Tk_Justify *) ptr));
+           break;
+       case TK_CONFIG_ANCHOR:
+           argv[4] = Tk_NameOfAnchor(*((Tk_Anchor *) ptr));
+           break;
+       case TK_CONFIG_CAP_STYLE:
+           argv[4] = Tk_NameOfCapStyle(*((int *) ptr));
+           break;
+       case TK_CONFIG_JOIN_STYLE:
+           argv[4] = Tk_NameOfJoinStyle(*((int *) ptr));
+           break;
+       case TK_CONFIG_PIXELS:
+           sprintf(buffer, "%d", *((int *) ptr));
+           argv[4] = buffer;
+           break;
+       case TK_CONFIG_MM:
+           sprintf(buffer, "%gm", *((int *) ptr));
+           argv[4] = buffer;
+           break;
+       case TK_CONFIG_WINDOW: {
+           Tk_Window tkwin;
+
+           tkwin = *((Tk_Window *) ptr);
+           if (tkwin != NULL) {
+               argv[4] = Tk_PathName(tkwin);
+           }
+           break;
+       }
+       case TK_CONFIG_CUSTOM:
+           argv[4] = (*specPtr->customPtr->printProc)(
+                   specPtr->customPtr->clientData, tkwin, widgRec,
+                   specPtr->offset, &freeProc);
+           break;
+       default: 
+           argv[4] = "?? unknown type ??";
+    }
+    if (argv[1] == NULL) {
+       argv[1] = "";
+    }
+    if (argv[2] == NULL) {
+       argv[2] = "";
+    }
+    if (argv[3] == NULL) {
+       argv[3] = "";
+    }
+    if (argv[4] == NULL) {
+       argv[4] = "";
+    }
+    result = Tcl_Merge(5, argv);
+    if (freeProc != NULL) {
+       if (freeProc == (Tcl_FreeProc *) free) {
+           ckfree(argv[4]);
+       } else {
+           (*freeProc)(argv[4]);
+       }
+    }
+    return result;
+}
diff --git a/src/tk/tkconfig.h b/src/tk/tkconfig.h
new file mode 100644 (file)
index 0000000..d8e27a2
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ * tkConfig.h --
+ *
+ *     This file is included by all of the Tk C files.  It contains
+ *     information that may be configuration-dependent, such as
+ *     #includes for system include files and a few other things.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /user6/ouster/wish/RCS/tkConfig.h,v 1.13 92/08/24 09:23:53 ouster Exp $ SPRITE (Berkeley)
+ */
+
+#ifndef _TKCONFIG
+#define _TKCONFIG
+
+/*
+ * Macro to use instead of "void" for arguments that must have
+ * type "void *" in ANSI C;  maps them to type "char *" in
+ * non-ANSI systems.  This macro may be used in some of the include
+ * files below, which is why it is defined here.
+ */
+
+#ifndef VOID
+#   ifdef __STDC__
+#       define VOID void
+#   else
+#       define VOID char
+#   endif
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#ifndef _TCL
+#   include <tcl.h>
+#endif
+#ifndef _TCLHASH
+#   include <tclhash.h>
+#endif
+#include <X11/Xlib.h>
+#include <X11/cursorfont.h>
+#include <X11/keysym.h>
+#include <X11/Xatom.h>
+#include <X11/Xproto.h>
+#include <X11/Xresource.h>
+#include <X11/Xutil.h>
+
+/*
+ * Macro to use instead of "void" for arguments that must have
+ * type "void *" in ANSI C;  maps them to type "char *" in
+ * non-ANSI systems.
+ */
+
+#ifndef VOID
+#   ifdef __STDC__
+#       define VOID void
+#   else
+#       define VOID char
+#   endif
+#endif
+
+/*
+ * Not all systems declare the errno variable in errno.h. so this
+ * file does it explicitly.
+ */
+
+extern int errno;
+
+/*
+ * Define OPEN_MAX if it isn't already defined for this system.
+ */
+
+#ifndef OPEN_MAX
+#   define OPEN_MAX 256
+#endif
+
+/*
+ * The following macro defines the type of the mask arguments to
+ * select:
+ */
+
+#if defined(IS_LINUX) || (defined(sun) && !defined(sprite))
+#   define SELECT_MASK fd_set
+#else
+#   if defined(_IBMR2)
+#      define SELECT_MASK void
+#   else
+#      define SELECT_MASK int
+#   endif
+#endif
+
+/*
+ * Declarations for various library procedures that aren't declared
+ * in a header file.
+ */
+
+extern int             close _ANSI_ARGS_((int fd));
+#if 0
+extern int             gettimeofday _ANSI_ARGS_((struct timeval *tp,
+                           struct timezone *tzp));
+#endif
+#if !(defined(_CRAY) || defined(sparc) || defined(_IBMR2) || defined(sgi))
+extern int             open _ANSI_ARGS_((CONST char *path, int flags, ...));
+#endif
+extern void            panic _ANSI_ARGS_(VARARGS);
+#if 0
+extern int             read _ANSI_ARGS_((int fd, void *buf, unsigned int numBytes));
+extern int             select _ANSI_ARGS_((int nfds, SELECT_MASK *readfds,
+                           SELECT_MASK *writefds, SELECT_MASK *exceptfds,
+                           struct timeval *timeout));
+#endif
+
+#endif /* _TKCONFIG */
diff --git a/src/tk/tkcursor.c b/src/tk/tkcursor.c
new file mode 100644 (file)
index 0000000..2c150bb
--- /dev/null
@@ -0,0 +1,643 @@
+/* 
+ * tkCursor.c --
+ *
+ *     This file maintains a database of read-only cursors for the Tk
+ *     toolkit.  This allows cursors to be shared between widgets and
+ *     also avoids round-trips to the X server.
+ *
+ * Copyright 1990 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkCursor.c,v 1.12 91/10/31 11:40:41 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tkconfig.h"
+#include "tkint.h"
+
+/*
+ * One of the following data structures exists for each cursor that is
+ * currently active.  Each structure is indexed with two hash tables
+ * defined below.  One of the tables is idTable, and the other is either
+ * nameTable or dataTable, also defined below.
+ * .
+ */
+
+typedef struct {
+    Cursor cursor;             /* X identifier for cursor. */
+    Display *display;          /* Display for which cursor is valid. */
+    int refCount;              /* Number of active uses of cursor. */
+    Tcl_HashTable *otherTable; /* Second table (other than idTable) used
+                                * to index this entry. */
+    Tcl_HashEntry *hashPtr;    /* Entry in otherTable for this structure
+                                * (needed when deleting). */
+} TkCursor;
+
+/*
+ * Hash table to map from a textual description of a cursor to the
+ * TkCursor record for the cursor, and key structure used in that
+ * hash table:
+ */
+
+static Tcl_HashTable nameTable;
+typedef struct {
+    Tk_Uid name;               /* Textual name for desired cursor. */
+    Display *display;          /* Display for which cursor will be used. */
+} NameKey;
+
+/*
+ * Hash table to map from a collection of in-core data about a
+ * cursor (bitmap contents, etc.) to a TkCursor structure:
+ */
+
+static Tcl_HashTable dataTable;
+typedef struct {
+    char *source;              /* Cursor bits. */
+    char *mask;                        /* Mask bits. */
+    unsigned int width, height;        /* Dimensions of cursor (and data
+                                * and mask). */
+    int xHot, yHot;            /* Location of cursor hot-spot. */
+    Tk_Uid fg, bg;             /* Colors for cursor. */
+    Display *display;          /* Display on which cursor will be used. */
+} DataKey;
+
+/*
+ * Hash table that maps from Cursor identifiers to the TkCursor structure
+ * for the cursor.  This table is indexed by Cursor ids, and is used by
+ * Tk_FreeCursor.
+ */
+
+static Tcl_HashTable idTable;
+
+static int initialized = 0;    /* 0 means static structures haven't been
+                                * initialized yet. */
+
+/*
+ * The table below is used to map from the name of a cursor to its
+ * index in the official cursor font:
+ */
+
+static struct CursorName {
+    char               *name;
+    unsigned int       shape;
+} cursorNames[] = {
+    {"X_cursor",               XC_X_cursor},
+    {"arrow",                  XC_arrow},
+    {"based_arrow_down",       XC_based_arrow_down},
+    {"based_arrow_up",         XC_based_arrow_up},
+    {"boat",                   XC_boat},
+    {"bogosity",               XC_bogosity},
+    {"bottom_left_corner",     XC_bottom_left_corner},
+    {"bottom_right_corner",    XC_bottom_right_corner},
+    {"bottom_side",            XC_bottom_side},
+    {"bottom_tee",             XC_bottom_tee},
+    {"box_spiral",             XC_box_spiral},
+    {"center_ptr",             XC_center_ptr},
+    {"circle",                 XC_circle},
+    {"clock",                  XC_clock},
+    {"coffee_mug",             XC_coffee_mug},
+    {"cross",                  XC_cross},
+    {"cross_reverse",          XC_cross_reverse},
+    {"crosshair",              XC_crosshair},
+    {"diamond_cross",          XC_diamond_cross},
+    {"dot",                    XC_dot},
+    {"dotbox",                 XC_dotbox},
+    {"double_arrow",           XC_double_arrow},
+    {"draft_large",            XC_draft_large},
+    {"draft_small",            XC_draft_small},
+    {"draped_box",             XC_draped_box},
+    {"exchange",               XC_exchange},
+    {"fleur",                  XC_fleur},
+    {"gobbler",                        XC_gobbler},
+    {"gumby",                  XC_gumby},
+    {"hand1",                  XC_hand1},
+    {"hand2",                  XC_hand2},
+    {"heart",                  XC_heart},
+    {"icon",                   XC_icon},
+    {"iron_cross",             XC_iron_cross},
+    {"left_ptr",               XC_left_ptr},
+    {"left_side",              XC_left_side},
+    {"left_tee",               XC_left_tee},
+    {"leftbutton",             XC_leftbutton},
+    {"ll_angle",               XC_ll_angle},
+    {"lr_angle",               XC_lr_angle},
+    {"man",                    XC_man},
+    {"middlebutton",           XC_middlebutton},
+    {"mouse",                  XC_mouse},
+    {"pencil",                 XC_pencil},
+    {"pirate",                 XC_pirate},
+    {"plus",                   XC_plus},
+    {"question_arrow",         XC_question_arrow},
+    {"right_ptr",              XC_right_ptr},
+    {"right_side",             XC_right_side},
+    {"right_tee",              XC_right_tee},
+    {"rightbutton",            XC_rightbutton},
+    {"rtl_logo",               XC_rtl_logo},
+    {"sailboat",               XC_sailboat},
+    {"sb_down_arrow",          XC_sb_down_arrow},
+    {"sb_h_double_arrow",      XC_sb_h_double_arrow},
+    {"sb_left_arrow",          XC_sb_left_arrow},
+    {"sb_right_arrow",         XC_sb_right_arrow},
+    {"sb_up_arrow",            XC_sb_up_arrow},
+    {"sb_v_double_arrow",      XC_sb_v_double_arrow},
+    {"shuttle",                        XC_shuttle},
+    {"sizing",                 XC_sizing},
+    {"spider",                 XC_spider},
+    {"spraycan",               XC_spraycan},
+    {"star",                   XC_star},
+    {"target",                 XC_target},
+    {"tcross",                 XC_tcross},
+    {"top_left_arrow",         XC_top_left_arrow},
+    {"top_left_corner",                XC_top_left_corner},
+    {"top_right_corner",       XC_top_right_corner},
+    {"top_side",               XC_top_side},
+    {"top_tee",                        XC_top_tee},
+    {"trek",                   XC_trek},
+    {"ul_angle",               XC_ul_angle},
+    {"umbrella",               XC_umbrella},
+    {"ur_angle",               XC_ur_angle},
+    {"watch",                  XC_watch},
+    {"xterm",                  XC_xterm},
+    {NULL,                     0}
+};
+
+/*
+ * Font to use for cursors:
+ */
+
+#ifndef CURSORFONT
+#define CURSORFONT "cursor"
+#endif
+
+/*
+ * Forward declarations for procedures defined in this file:
+ */
+
+static void            CursorInit _ANSI_ARGS_((void));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_GetCursor --
+ *
+ *     Given a string describing a cursor, locate (or create if necessary)
+ *     a cursor that fits the description.
+ *
+ * Results:
+ *     The return value is the X identifer for the desired cursor,
+ *     unless string couldn't be parsed correctly.  In this case,
+ *     None is returned and an error message is left in interp->result.
+ *     The caller should never modify the cursor that is returned, and
+ *     should eventually call Tk_FreeCursor when the cursor is no longer
+ *     needed.
+ *
+ * Side effects:
+ *     The cursor is added to an internal database with a reference count.
+ *     For each call to this procedure, there should eventually be a call
+ *     to Tk_FreeCursor, so that the database can be cleaned up when cursors
+ *     aren't needed anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Cursor
+Tk_GetCursor(interp, tkwin, string)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    Tk_Window tkwin;           /* Window in which cursor will be used. */
+    Tk_Uid string;             /* Description of cursor.  See manual entry
+                                * for details on legal syntax. */
+{
+    NameKey key;
+    Tcl_HashEntry *nameHashPtr, *idHashPtr;
+    register TkCursor *cursorPtr;
+    int new;
+    Cursor cursor;
+    int argc;
+    char **argv = NULL;
+    Pixmap source = None;
+    Pixmap mask = None;
+
+    if (!initialized) {
+       CursorInit();
+    }
+
+    key.name = string;
+    key.display = Tk_Display(tkwin);
+    nameHashPtr = Tcl_CreateHashEntry(&nameTable, (char *) &key, &new);
+    if (!new) {
+       cursorPtr = (TkCursor *) Tcl_GetHashValue(nameHashPtr);
+       cursorPtr->refCount++;
+       return cursorPtr->cursor;
+    }
+
+    /*
+     * No suitable cursor exists.  Parse the cursor name into fields
+     * and create a cursor, either from the standard cursor font or
+     * from bitmap files.
+     */
+
+    if (Tcl_SplitList(interp, string, &argc, &argv) != TCL_OK) {
+       goto error;
+    }
+    if (argc == 0) {
+       badString:
+       Tcl_AppendResult(interp, "bad cursor spec \"", string, "\"",
+               (char *) NULL);
+       goto error;
+    }
+    if (argv[0][0] != '@') {
+       XColor fg, bg;
+       int maskIndex;
+       register struct CursorName *namePtr;
+       TkDisplay *dispPtr;
+
+       /*
+        * The cursor is to come from the standard cursor font.  If one
+        * arg, it is cursor name (use black and white for fg and bg).
+        * If two args, they are name and fg color (ignore mask).  If
+        * three args, they are name, fg, bg.  Some of the code below
+        * is stolen from the XCreateFontCursor Xlib procedure.
+        */
+
+       if (argc > 3) {
+           goto badString;
+       }
+       for (namePtr = cursorNames; ; namePtr++) {
+           if (namePtr->name == NULL) {
+               goto badString;
+           }
+           if ((namePtr->name[0] == argv[0][0])
+                   && (strcmp(namePtr->name, argv[0]) == 0)) {
+               break;
+           }
+       }
+       maskIndex = namePtr->shape + 1;
+       if (argc == 1) {
+           fg.red = fg.green = fg.blue = 0;
+           bg.red = bg.green = bg.blue = 65535;
+       } else {
+           if (XParseColor(key.display,
+                   Tk_DefaultColormap(Tk_Screen(tkwin)),
+                   argv[1], &fg) == 0) {
+               Tcl_AppendResult(interp, "invalid color name \"", argv[1],
+                       "\"", (char *) NULL);
+               goto error;
+           }
+           if (argc == 2) {
+               bg.red = bg.green = bg.blue = 0;
+               maskIndex = namePtr->shape;
+           } else {
+               if (XParseColor(key.display,
+                       Tk_DefaultColormap(Tk_Screen(tkwin)),
+                       argv[2], &bg) == 0) {
+                   Tcl_AppendResult(interp, "invalid color name \"", argv[2],
+                           "\"", (char *) NULL);
+                   goto error;
+               }
+           }
+       }
+       dispPtr = ((TkWindow *) tkwin)->dispPtr;
+       if (dispPtr->cursorFont == None) {
+           dispPtr->cursorFont = XLoadFont(key.display, CURSORFONT);
+           if (dispPtr->cursorFont == None) {
+               interp->result = "couldn't load cursor font";
+               goto error;
+           }
+       }
+       cursor = XCreateGlyphCursor(key.display, dispPtr->cursorFont,
+               dispPtr->cursorFont, namePtr->shape, maskIndex,
+               &fg, &bg);
+    } else {
+       unsigned int width, height, maskWidth, maskHeight;
+       int xHot, yHot, dummy1, dummy2;
+       XColor fg, bg;
+
+       /*
+        * The cursor is to be created by reading bitmap files.  There
+        * should be either two elements in the list (source, color) or
+        * four (source mask fg bg).
+        */
+
+       if ((argc != 2) && (argc != 4)) {
+           goto badString;
+       }
+       if (XReadBitmapFile(key.display, RootWindowOfScreen(Tk_Screen(tkwin)),
+               &argv[0][1], &width, &height, &source, &xHot, &yHot)
+               != BitmapSuccess) {
+           Tcl_AppendResult(interp, "error reading bitmap file \"",
+                   &argv[0][1], "\"", (char *) NULL);
+           goto error;
+       }
+       if ((xHot < 0) || (yHot < 0) || (xHot >= width) || (yHot >= height)) {
+           Tcl_AppendResult(interp, "bad hot spot in bitmap file \"",
+                   &argv[0][1], "\"", (char *) NULL);
+           goto error;
+       }
+       if (argc == 2) {
+           if (XParseColor(key.display,
+                   Tk_DefaultColormap(Tk_Screen(tkwin)),
+                   argv[1], &fg) == 0) {
+               Tcl_AppendResult(interp, "invalid color name \"",
+                       argv[1], "\"", (char *) NULL);
+               goto error;
+           }
+           cursor = XCreatePixmapCursor(key.display, source, source,
+                   &fg, &fg, xHot, yHot);
+       } else {
+           if (XReadBitmapFile(key.display,
+                   RootWindowOfScreen(Tk_Screen(tkwin)), argv[1],
+                   &maskWidth, &maskHeight, &mask, &dummy1,
+                   &dummy2) != BitmapSuccess) {
+               Tcl_AppendResult(interp, "error reading bitmap file \"",
+                       argv[1], "\"", (char *) NULL);
+               goto error;
+           }
+           if ((maskWidth != width) && (maskHeight != height)) {
+               interp->result =
+                       "source and mask bitmaps have different sizes";
+               goto error;
+           }
+           if (XParseColor(key.display,
+                   Tk_DefaultColormap(Tk_Screen(tkwin)),
+                   argv[2], &fg) == 0) {
+               Tcl_AppendResult(interp, "invalid color name \"", argv[2],
+                       "\"", (char *) NULL);
+               goto error;
+           }
+           if (XParseColor(key.display,
+                   Tk_DefaultColormap(Tk_Screen(tkwin)),
+                   argv[3], &bg) == 0) {
+               Tcl_AppendResult(interp, "invalid color name \"", argv[3],
+                       "\"", (char *) NULL);
+               goto error;
+           }
+           cursor = XCreatePixmapCursor(key.display, source, mask,
+                   &fg, &bg, xHot, yHot);
+       }
+    }
+    ckfree((char *) argv);
+
+    /*
+     * Add information about this cursor to our database.
+     */
+
+    cursorPtr = (TkCursor *) ckalloc(sizeof(TkCursor));
+    cursorPtr->cursor = cursor;
+    cursorPtr->display = key.display;
+    cursorPtr->refCount = 1;
+    cursorPtr->otherTable = &nameTable;
+    cursorPtr->hashPtr = nameHashPtr;
+    idHashPtr = Tcl_CreateHashEntry(&idTable, (char *) cursorPtr->cursor,
+           &new);
+    if (!new) {
+/* deh patched to support multiple displays */
+/*     panic("cursor already registered in Tk_GetCursor"); */
+        cursorPtr->refCount = 1000;
+    }
+    Tcl_SetHashValue(nameHashPtr, cursorPtr);
+    Tcl_SetHashValue(idHashPtr, cursorPtr);
+    return cursorPtr->cursor;
+
+    error:
+    Tcl_DeleteHashEntry(nameHashPtr);
+    if (argv != NULL) {
+       ckfree((char *) argv);
+    }
+    if (source != None) {
+       XFreePixmap(key.display, source);
+    }
+    if (mask != None) {
+       XFreePixmap(key.display, mask);
+    }
+    return None;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_GetCursorFromData --
+ *
+ *     Given a description of the bits and colors for a cursor,
+ *     make a cursor that has the given properties.
+ *
+ * Results:
+ *     The return value is the X identifer for the desired cursor,
+ *     unless it couldn't be created properly.  In this case, None is
+ *     returned and an error message is left in interp->result.  The
+ *     caller should never modify the cursor that is returned, and
+ *     should eventually call Tk_FreeCursor when the cursor is no
+ *     longer needed.
+ *
+ * Side effects:
+ *     The cursor is added to an internal database with a reference count.
+ *     For each call to this procedure, there should eventually be a call
+ *     to Tk_FreeCursor, so that the database can be cleaned up when cursors
+ *     aren't needed anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Cursor
+Tk_GetCursorFromData(interp, tkwin, source, mask, width, height,
+       xHot, yHot, fg, bg)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    Tk_Window tkwin;           /* Window in which cursor will be used. */
+    char *source;              /* Bitmap data for cursor shape. */
+    char *mask;                        /* Bitmap data for cursor mask. */
+    unsigned int width, height;        /* Dimensions of cursor. */
+    int xHot, yHot;            /* Location of hot-spot in cursor. */
+    Tk_Uid fg;                 /* Foreground color for cursor. */
+    Tk_Uid bg;                 /* Background color for cursor. */
+{
+    DataKey key;
+    Tcl_HashEntry *dataHashPtr, *idHashPtr;
+    register TkCursor *cursorPtr;
+    int new;
+    XColor fgColor, bgColor;
+    Pixmap sourcePixmap, maskPixmap;
+
+    if (!initialized) {
+       CursorInit();
+    }
+
+    key.source = source;
+    key.mask = mask;
+    key.width = width;
+    key.height = height;
+    key.xHot = xHot;
+    key.yHot = yHot;
+    key.fg = fg;
+    key.bg = bg;
+    key.display = Tk_Display(tkwin);
+    dataHashPtr = Tcl_CreateHashEntry(&dataTable, (char *) &key, &new);
+    if (!new) {
+       cursorPtr = (TkCursor *) Tcl_GetHashValue(dataHashPtr);
+       cursorPtr->refCount++;
+       return cursorPtr->cursor;
+    }
+
+    /*
+     * No suitable cursor exists yet.  Make one using the data
+     * available and add it to the database.
+     */
+
+    if (XParseColor(key.display, Tk_DefaultColormap(Tk_Screen(tkwin)),
+           fg, &fgColor) == 0) {
+       Tcl_AppendResult(interp, "invalid color name \"", fg, "\"",
+               (char *) NULL);
+       goto error;
+    }
+    if (XParseColor(key.display, Tk_DefaultColormap(Tk_Screen(tkwin)),
+           bg, &bgColor) == 0) {
+       Tcl_AppendResult(interp, "invalid color name \"", bg, "\"",
+               (char *) NULL);
+       goto error;
+    }
+
+    cursorPtr = (TkCursor *) ckalloc(sizeof(TkCursor));
+    sourcePixmap = XCreateBitmapFromData(key.display,
+           RootWindowOfScreen(Tk_Screen(tkwin)), source, width, height);
+    maskPixmap = XCreateBitmapFromData(key.display, 
+           RootWindowOfScreen(Tk_Screen(tkwin)), mask, width, height);
+    cursorPtr->cursor = XCreatePixmapCursor(key.display, sourcePixmap,
+           maskPixmap, &fgColor, &bgColor, xHot, yHot);
+    XFreePixmap(key.display, sourcePixmap);
+    XFreePixmap(key.display, maskPixmap);
+    cursorPtr->display = key.display;
+    cursorPtr->refCount = 1;
+    cursorPtr->otherTable = &dataTable;
+    cursorPtr->hashPtr = dataHashPtr;
+    idHashPtr = Tcl_CreateHashEntry(&idTable, (char *) cursorPtr->cursor, &new);
+    if (!new) {
+/* deh patched to support multiple displays */
+/*     panic("cursor already registered in Tk_GetCursorFromData"); */
+        cursorPtr->refCount = 1000;
+    }
+    Tcl_SetHashValue(dataHashPtr, cursorPtr);
+    Tcl_SetHashValue(idHashPtr, cursorPtr);
+    return cursorPtr->cursor;
+
+    error:
+    Tcl_DeleteHashEntry(dataHashPtr);
+    return None;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_NameOfCursor --
+ *
+ *     Given a cursor, return a textual string identifying it.
+ *
+ * Results:
+ *     If cursor was created by Tk_GetCursor, then the return
+ *     value is the "string" that was used to create it.
+ *     Otherwise the return value is a string giving the X
+ *     identifier for the cursor.  The storage for the returned
+ *     string is only guaranteed to persist up until the next
+ *     call to this procedure.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+char *
+Tk_NameOfCursor(cursor)
+    Cursor cursor;                     /* Cursor to be released. */
+{
+    Tcl_HashEntry *idHashPtr;
+    TkCursor *cursorPtr;
+    static char string[20];
+
+    if (!initialized) {
+       printid:
+       sprintf(string, "cursor id 0x%x", cursor);
+       return string;
+    }
+    idHashPtr = Tcl_FindHashEntry(&idTable, (char *) cursor);
+    if (idHashPtr == NULL) {
+       goto printid;
+    }
+    cursorPtr = (TkCursor *) Tcl_GetHashValue(idHashPtr);
+    if (cursorPtr->otherTable != &nameTable) {
+       goto printid;
+    }
+    return ((NameKey *) cursorPtr->hashPtr->key.words)->name;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_FreeCursor --
+ *
+ *     This procedure is called to release a cursor allocated by
+ *     Tk_GetCursor or TkGetCursorFromData.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The reference count associated with cursor is decremented, and
+ *     it is officially deallocated if no-one is using it anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_FreeCursor(cursor)
+    Cursor cursor;                     /* Cursor to be released. */
+{
+    Tcl_HashEntry *idHashPtr;
+    register TkCursor *cursorPtr;
+
+    if (!initialized) {
+       panic("Tk_FreeCursor called before Tk_GetCursor");
+    }
+
+    idHashPtr = Tcl_FindHashEntry(&idTable, (char *) cursor);
+    if (idHashPtr == NULL) {
+       panic("Tk_FreeCursor received unknown cursor argument");
+    }
+    cursorPtr = (TkCursor *) Tcl_GetHashValue(idHashPtr);
+    cursorPtr->refCount--;
+    if (cursorPtr->refCount == 0) {
+       XFreeCursor(cursorPtr->display, cursorPtr->cursor);
+       Tcl_DeleteHashEntry(cursorPtr->hashPtr);
+       Tcl_DeleteHashEntry(idHashPtr);
+       ckfree((char *) cursorPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * CursorInit --
+ *
+ *     Initialize the structures used for cursor management.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Read the code.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+CursorInit()
+{
+    initialized = 1;
+    Tcl_InitHashTable(&nameTable, sizeof(NameKey)/sizeof(long));
+    Tcl_InitHashTable(&dataTable, sizeof(DataKey)/sizeof(long));
+    Tcl_InitHashTable(&idTable, TCL_ONE_WORD_KEYS);
+}
diff --git a/src/tk/tkcvarc.c b/src/tk/tkcvarc.c
new file mode 100644 (file)
index 0000000..1251b43
--- /dev/null
@@ -0,0 +1,1524 @@
+/* 
+ * tkCanvArc.c --
+ *
+ *     This file implements arc items for canvas widgets.
+ *
+ * Copyright 1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkCanvArc.c,v 1.5 92/08/16 15:42:20 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include <stdio.h>
+#include <math.h>
+#include "tkint.h"
+#include "tkcanvas.h"
+
+/*
+ * The structure below defines the record for each arc item.
+ */
+
+typedef struct ArcItem  {
+    Tk_Item header;            /* Generic stuff that's the same for all
+                                * types.  MUST BE FIRST IN STRUCTURE. */
+    double bbox[4];            /* Coordinates (x1, y1, x2, y2) of bounding
+                                * box for oval of which arc is a piece. */
+    double start;              /* Angle at which arc begins, in degrees
+                                * between 0 and 360. */
+    double extent;             /* Extent of arc (angular distance from
+                                * start to end of arc) in degrees between
+                                * -360 and 360. */
+    double *outlinePtr;                /* Points to (x,y) coordinates for points
+                                * that define one or two closed polygons
+                                * representing the portion of the outline
+                                * that isn't part of the arc (the V-shape
+                                * for a pie slice or a line-like segment
+                                * for a chord).  Malloc'ed. */
+    int numOutlinePoints;      /* Number of points at outlinePtr.  Zero
+                                * means no space allocated. */
+    int width;                 /* Width of outline (in pixels). */
+    XColor *outlineColor;      /* Color for outline.  NULL means don't
+                                * draw outline. */
+    XColor *fillColor;         /* Color for filling arc (used for drawing
+                                * outline too when style is "arc").  NULL
+                                * means don't fill arc. */
+    Pixmap fillStipple;                /* Stipple bitmap for filling item. */
+    Tk_Uid style;              /* How to draw arc: arc, chord, or pieslice. */
+    GC outlineGC;              /* Graphics context for outline. */
+    GC fillGC;                 /* Graphics context for filling item. */
+    double center1[2];         /* Coordinates of center of arc outline at
+                                * start (see ComputeArcOutline). */
+    double center2[2];         /* Coordinates of center of arc outline at
+                                * start+extent (see ComputeArcOutline). */
+} ArcItem;
+
+/*
+ * The definitions below define the sizes of the polygons used to
+ * display outline information for various styles of arcs:
+ */
+
+#define CHORD_OUTLINE_PTS      7
+#define PIE_OUTLINE1_PTS       6
+#define PIE_OUTLINE2_PTS       7
+
+/*
+ * Information used for parsing configuration specs:
+ */
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_DOUBLE, "-extent", (char *) NULL, (char *) NULL,
+       "90", Tk_Offset(ArcItem, extent), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_COLOR, "-fill", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(ArcItem, fillColor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_COLOR, "-outline", (char *) NULL, (char *) NULL,
+       "black", Tk_Offset(ArcItem, outlineColor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_DOUBLE, "-start", (char *) NULL, (char *) NULL,
+       "0", Tk_Offset(ArcItem, start), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_BITMAP, "-stipple", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(ArcItem, fillStipple), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_UID, "-style", (char *) NULL, (char *) NULL,
+       "pieslice", Tk_Offset(ArcItem, style), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_CUSTOM, "-tags", (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, TK_CONFIG_NULL_OK, &tkCanvasTagsOption},
+    {TK_CONFIG_PIXELS, "-width", (char *) NULL, (char *) NULL,
+       "1", Tk_Offset(ArcItem, width), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Prototypes for procedures defined in this file:
+ */
+
+static int             ArcCoords _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, int argc, char **argv));
+static int             AngleInRange _ANSI_ARGS_((double x, double y,
+                           double start, double extent));
+static int             ArcToArea _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *rectPtr));
+static double          ArcToPoint _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *coordPtr));
+static void            ComputeArcBbox _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           ArcItem *arcPtr));
+static void            ComputeArcOutline _ANSI_ARGS_((ArcItem *arcPtr));
+static int             ConfigureArc _ANSI_ARGS_((
+                           Tk_Canvas *canvasPtr, Tk_Item *itemPtr, int argc,
+                           char **argv, int flags));
+static int             CreateArc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           struct Tk_Item *itemPtr, int argc, char **argv));
+static void            DeleteArc _ANSI_ARGS_((Tk_Item *itemPtr));
+static void            DisplayArc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, Drawable dst));
+static int             HorizLineToArc _ANSI_ARGS_((double x1, double x2,
+                           double y, double rx, double ry,
+                           double start, double extent));
+static void            ScaleArc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double originX, double originY,
+                           double scaleX, double scaleY));
+static void            TranslateArc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double deltaX, double deltaY));
+static int             VertLineToArc _ANSI_ARGS_((double x, double y1,
+                           double y2, double rx, double ry,
+                           double start, double extent));
+
+/*
+ * The structures below defines the arc item types by means of procedures
+ * that can be invoked by generic item code.
+ */
+
+Tk_ItemType TkArcType = {
+    "arc",                             /* name */
+    sizeof(ArcItem),                   /* itemSize */
+    CreateArc,                         /* createProc */
+    configSpecs,                       /* configSpecs */
+    ConfigureArc,                      /* configureProc */
+    ArcCoords,                         /* coordProc */
+    DeleteArc,                         /* deleteProc */
+    DisplayArc,                                /* displayProc */
+    0,                                 /* alwaysRedraw */
+    ArcToPoint,                                /* pointProc */
+    ArcToArea,                         /* areaProc */
+    (Tk_ItemPostscriptProc *) NULL,    /* postscriptProc */
+    ScaleArc,                          /* scaleProc */
+    TranslateArc,                      /* translateProc */
+    (Tk_ItemIndexProc *) NULL,         /* indexProc */
+    (Tk_ItemCursorProc *) NULL,                /* cursorProc */
+    (Tk_ItemSelectionProc *) NULL,     /* selectionProc */
+    (Tk_ItemInsertProc *) NULL,                /* insertProc */
+    (Tk_ItemDCharsProc *) NULL,                /* dTextProc */
+    (Tk_ItemType *) NULL               /* nextPtr */
+};
+
+#define PI 3.14159265358979323846
+
+/*
+ * The uid's below comprise the legal values for the "-style"
+ * option for arcs.
+ */
+
+static Tk_Uid arcUid =  NULL;
+static Tk_Uid chordUid =  NULL;
+static Tk_Uid pieSliceUid = NULL;
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CreateArc --
+ *
+ *     This procedure is invoked to create a new arc item in
+ *     a canvas.
+ *
+ * Results:
+ *     A standard Tcl return value.  If an error occurred in
+ *     creating the item, then an error message is left in
+ *     canvasPtr->interp->result;  in this case itemPtr is
+ *     left uninitialized, so it can be safely freed by the
+ *     caller.
+ *
+ * Side effects:
+ *     A new arc item is created.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+CreateArc(canvasPtr, itemPtr, argc, argv)
+    register Tk_Canvas *canvasPtr;     /* Canvas to hold new item. */
+    Tk_Item *itemPtr;                  /* Record to hold new item;  header
+                                        * has been initialized by caller. */
+    int argc;                          /* Number of arguments in argv. */
+    char **argv;                       /* Arguments describing arc. */
+{
+    register ArcItem *arcPtr = (ArcItem *) itemPtr;
+
+    if (argc < 4) {
+       Tcl_AppendResult(canvasPtr->interp, "wrong # args:  should be \"",
+               Tk_PathName(canvasPtr->tkwin), "\" create ",
+               itemPtr->typePtr->name, " x1 y1 x2 y2 ?options?",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Carry out once-only initialization.
+     */
+
+    if (arcUid == NULL) {
+       arcUid = Tk_GetUid("arc");
+       chordUid = Tk_GetUid("chord");
+       pieSliceUid = Tk_GetUid("pieslice");
+    }
+
+    /*
+     * Carry out initialization that is needed in order to clean
+     * up after errors during the the remainder of this procedure.
+     */
+
+    arcPtr->start = 0;
+    arcPtr->extent = 90;
+    arcPtr->outlinePtr = NULL;
+    arcPtr->numOutlinePoints = 0;
+    arcPtr->width = 1;
+    arcPtr->outlineColor = NULL;
+    arcPtr->fillColor = NULL;
+    arcPtr->fillStipple = None;
+    arcPtr->style = pieSliceUid;
+    arcPtr->outlineGC = None;
+    arcPtr->fillGC = None;
+
+    /*
+     * Process the arguments to fill in the item record.
+     */
+
+    if ((TkGetCanvasCoord(canvasPtr, argv[0], &arcPtr->bbox[0]) != TCL_OK)
+           || (TkGetCanvasCoord(canvasPtr, argv[1],
+               &arcPtr->bbox[1]) != TCL_OK)
+           || (TkGetCanvasCoord(canvasPtr, argv[2],
+                   &arcPtr->bbox[2]) != TCL_OK)
+           || (TkGetCanvasCoord(canvasPtr, argv[3],
+                   &arcPtr->bbox[3]) != TCL_OK)) {
+       return TCL_ERROR;
+    }
+
+    if (ConfigureArc(canvasPtr, itemPtr, argc-4, argv+4, 0) != TCL_OK) {
+       DeleteArc(itemPtr);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ArcCoords --
+ *
+ *     This procedure is invoked to process the "coords" widget
+ *     command on arcs.  See the user documentation for details
+ *     on what it does.
+ *
+ * Results:
+ *     Returns TCL_OK or TCL_ERROR, and sets canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     The coordinates for the given item may be changed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ArcCoords(canvasPtr, itemPtr, argc, argv)
+    register Tk_Canvas *canvasPtr;     /* Canvas containing item. */
+    Tk_Item *itemPtr;                  /* Item whose coordinates are to be
+                                        * read or modified. */
+    int argc;                          /* Number of coordinates supplied in
+                                        * argv. */
+    char **argv;                       /* Array of coordinates: x1, y1,
+                                        * x2, y2, ... */
+{
+    register ArcItem *arcPtr = (ArcItem *) itemPtr;
+    char buffer[500];
+
+    if (argc == 0) {
+       sprintf(buffer, "%g %g %g %g", arcPtr->bbox[0],
+               arcPtr->bbox[1], arcPtr->bbox[2],
+               arcPtr->bbox[3]);
+       Tcl_SetResult(canvasPtr->interp, buffer, TCL_VOLATILE);
+    } else if (argc == 4) {
+       if ((TkGetCanvasCoord(canvasPtr, argv[0],
+                   &arcPtr->bbox[0]) != TCL_OK)
+               || (TkGetCanvasCoord(canvasPtr, argv[1],
+                   &arcPtr->bbox[1]) != TCL_OK)
+               || (TkGetCanvasCoord(canvasPtr, argv[2],
+                       &arcPtr->bbox[2]) != TCL_OK)
+               || (TkGetCanvasCoord(canvasPtr, argv[3],
+                       &arcPtr->bbox[3]) != TCL_OK)) {
+           return TCL_ERROR;
+       }
+       ComputeArcBbox(canvasPtr, arcPtr);
+    } else {
+       sprintf(canvasPtr->interp->result,
+               "wrong # coordinates:  expected 0 or 4, got %d",
+               argc);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ConfigureArc --
+ *
+ *     This procedure is invoked to configure various aspects
+ *     of a arc item, such as its outline and fill colors.
+ *
+ * Results:
+ *     A standard Tcl result code.  If an error occurs, then
+ *     an error message is left in canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     Configuration information, such as colors and stipple
+ *     patterns, may be set for itemPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ConfigureArc(canvasPtr, itemPtr, argc, argv, flags)
+    Tk_Canvas *canvasPtr;      /* Canvas containing itemPtr. */
+    Tk_Item *itemPtr;          /* Arc item to reconfigure. */
+    int argc;                  /* Number of elements in argv.  */
+    char **argv;               /* Arguments describing things to configure. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    register ArcItem *arcPtr = (ArcItem *) itemPtr;
+    XGCValues gcValues;
+    GC newGC;
+    unsigned long mask;
+    int i;
+
+    if (Tk_ConfigureWidget(canvasPtr->interp, canvasPtr->tkwin,
+           configSpecs, argc, argv, (char *) arcPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few of the options require additional processing, such as
+     * style and graphics contexts.
+     */
+
+    i = arcPtr->start/360.0;
+    arcPtr->start -= i*360.0;
+    if (arcPtr->start < 0) {
+       arcPtr->start += 360.0;
+    }
+    i = arcPtr->extent/360.0;
+    arcPtr->extent -= i*360.0;
+
+    if ((arcPtr->style != arcUid) && (arcPtr->style != chordUid)
+           && (arcPtr->style != pieSliceUid)) {
+       Tcl_AppendResult(canvasPtr->interp, "bad -style option \"",
+               arcPtr->style, "\": must be arc, chord, or pieslice",
+               (char *) NULL);
+       arcPtr->style = pieSliceUid;
+       return TCL_ERROR;
+    }
+
+    if (arcPtr->width < 0) {
+       arcPtr->width = 1;
+    }
+    if (arcPtr->style == arcUid) {
+       if (arcPtr->fillColor == NULL) {
+           newGC = None;
+       } else {
+           gcValues.foreground = arcPtr->fillColor->pixel;
+           gcValues.cap_style = CapButt;
+           gcValues.line_width = arcPtr->width;
+           mask = GCForeground|GCCapStyle|GCLineWidth;
+           if (arcPtr->fillStipple != None) {
+               gcValues.stipple = arcPtr->fillStipple;
+               gcValues.fill_style = FillStippled;
+               mask |= GCStipple|GCFillStyle;
+           }
+           newGC = Tk_GetGC(canvasPtr->tkwin, mask, &gcValues);
+       }
+    } else if (arcPtr->outlineColor == NULL) {
+       newGC = None;
+    } else {
+       gcValues.foreground = arcPtr->outlineColor->pixel;
+       gcValues.cap_style = CapButt;
+       gcValues.line_width = arcPtr->width;
+       mask = GCForeground|GCCapStyle|GCLineWidth;
+       newGC = Tk_GetGC(canvasPtr->tkwin, mask, &gcValues);
+    }
+    if (arcPtr->outlineGC != None) {
+       Tk_FreeGC(arcPtr->outlineGC);
+    }
+    arcPtr->outlineGC = newGC;
+
+    if ((arcPtr->fillColor == NULL) || (arcPtr->style == arcUid)) {
+       newGC = None;
+    } else {
+       gcValues.foreground = arcPtr->fillColor->pixel;
+       if (arcPtr->style == chordUid) {
+           gcValues.arc_mode = ArcChord;
+       } else {
+           gcValues.arc_mode = ArcPieSlice;
+       }
+       mask = GCForeground|GCArcMode;
+       if (arcPtr->fillStipple != None) {
+           gcValues.stipple = arcPtr->fillStipple;
+           gcValues.fill_style = FillStippled;
+           mask |= GCStipple|GCFillStyle;
+       }
+       newGC = Tk_GetGC(canvasPtr->tkwin, mask, &gcValues);
+    }
+    if (arcPtr->fillGC != None) {
+       Tk_FreeGC(arcPtr->fillGC);
+    }
+    arcPtr->fillGC = newGC;
+
+    ComputeArcBbox(canvasPtr, arcPtr);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DeleteArc --
+ *
+ *     This procedure is called to clean up the data structure
+ *     associated with a arc item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Resources associated with itemPtr are released.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DeleteArc(itemPtr)
+    Tk_Item *itemPtr;                  /* Item that is being deleted. */
+{
+    register ArcItem *arcPtr = (ArcItem *) itemPtr;
+
+    if (arcPtr->numOutlinePoints != 0) {
+       ckfree((char *) arcPtr->outlinePtr);
+    }
+    if (arcPtr->outlineColor != NULL) {
+       Tk_FreeColor(arcPtr->outlineColor);
+    }
+    if (arcPtr->fillColor != NULL) {
+       Tk_FreeColor(arcPtr->fillColor);
+    }
+    if (arcPtr->fillStipple != None) {
+       Tk_FreeBitmap(arcPtr->fillStipple);
+    }
+    if (arcPtr->outlineGC != None) {
+       Tk_FreeGC(arcPtr->outlineGC);
+    }
+    if (arcPtr->fillGC != None) {
+       Tk_FreeGC(arcPtr->fillGC);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ComputeArcBbox --
+ *
+ *     This procedure is invoked to compute the bounding box of
+ *     all the pixels that may be drawn as part of an arc.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The fields x1, y1, x2, and y2 are updated in the header
+ *     for itemPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static void
+ComputeArcBbox(canvasPtr, arcPtr)
+    register Tk_Canvas *canvasPtr;     /* Canvas that contains item. */
+    register ArcItem *arcPtr;          /* Item whose bbox is to be
+                                        * recomputed. */
+{
+    double tmp, center[2], point[2];
+
+    /*
+     * Make sure that the first coordinates are the lowest ones.
+     */
+
+    if (arcPtr->bbox[1] > arcPtr->bbox[3]) {
+       double tmp;
+       tmp = arcPtr->bbox[3];
+       arcPtr->bbox[3] = arcPtr->bbox[1];
+       arcPtr->bbox[1] = tmp;
+    }
+    if (arcPtr->bbox[0] > arcPtr->bbox[2]) {
+       double tmp;
+       tmp = arcPtr->bbox[2];
+       arcPtr->bbox[2] = arcPtr->bbox[0];
+       arcPtr->bbox[0] = tmp;
+    }
+
+    ComputeArcOutline(arcPtr);
+
+    /*
+     * To compute the bounding box, start with the the bbox formed
+     * by the two endpoints of the arc.  Then add in the center of
+     * the arc's oval (if relevant) and the 3-o'clock, 6-o'clock,
+     * 9-o'clock, and 12-o'clock positions, if they are relevant.
+     */
+
+    arcPtr->header.x1 = arcPtr->header.x2 = arcPtr->center1[0];
+    arcPtr->header.y1 = arcPtr->header.y2 = arcPtr->center1[1];
+    TkIncludePoint(canvasPtr, (Tk_Item *) arcPtr, arcPtr->center2);
+    center[0] = (arcPtr->bbox[0] + arcPtr->bbox[2])/2;
+    center[1] = (arcPtr->bbox[1] + arcPtr->bbox[3])/2;
+    if (arcPtr->style != arcUid) {
+       TkIncludePoint(canvasPtr, (Tk_Item *) arcPtr, center);
+    }
+
+    tmp = -arcPtr->start;
+    if (tmp < 0) {
+       tmp += 360.0;
+    }
+    if ((tmp < arcPtr->extent) || ((tmp-360) > arcPtr->extent)) {
+       point[0] = arcPtr->bbox[2];
+       point[1] = center[1];
+       TkIncludePoint(canvasPtr, (Tk_Item *) arcPtr, point);
+    }
+    tmp = 90.0 - arcPtr->start;
+    if (tmp < 0) {
+       tmp += 360.0;
+    }
+    if ((tmp < arcPtr->extent) || ((tmp-360) > arcPtr->extent)) {
+       point[0] = center[0];
+       point[1] = arcPtr->bbox[1];
+       TkIncludePoint(canvasPtr, (Tk_Item *) arcPtr, point);
+    }
+    tmp = 180.0 - arcPtr->start;
+    if (tmp < 0) {
+       tmp += 360.0;
+    }
+    if ((tmp < arcPtr->extent) || ((tmp-360) > arcPtr->extent)) {
+       point[0] = arcPtr->bbox[0];
+       point[1] = center[1];
+       TkIncludePoint(canvasPtr, (Tk_Item *) arcPtr, point);
+    }
+    tmp = 270.0 - arcPtr->start;
+    if (tmp < 0) {
+       tmp += 360.0;
+    }
+    if ((tmp < arcPtr->extent) || ((tmp-360) > arcPtr->extent)) {
+       point[0] = center[0];
+       point[1] = arcPtr->bbox[3];
+       TkIncludePoint(canvasPtr, (Tk_Item *) arcPtr, point);
+    }
+
+    /*
+     * Lastly, expand by the width of the arc (if the arc's outline is
+     * being drawn) and add one extra pixel just for safety.
+     */
+
+    if (arcPtr->outlineColor == NULL) {
+       tmp = 1;
+    } else {
+       tmp = (arcPtr->width + 1)/2 + 1;
+    }
+    arcPtr->header.x1 -= tmp;
+    arcPtr->header.y1 -= tmp;
+    arcPtr->header.x2 += tmp;
+    arcPtr->header.y2 += tmp;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayArc --
+ *
+ *     This procedure is invoked to draw an arc item in a given
+ *     drawable.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     ItemPtr is drawn in drawable using the transformation
+ *     information in canvasPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayArc(canvasPtr, itemPtr, drawable)
+    register Tk_Canvas *canvasPtr;     /* Canvas that contains item. */
+    Tk_Item *itemPtr;                  /* Item to be displayed. */
+    Drawable drawable;                 /* Pixmap or window in which to draw
+                                        * item. */
+{
+    register ArcItem *arcPtr = (ArcItem *) itemPtr;
+    Display *display = Tk_Display(canvasPtr->tkwin);
+    int x1, y1, x2, y2, start, extent;
+
+    /*
+     * Compute the screen coordinates of the bounding box for the item,
+     * plus integer values for the angles.
+     */
+
+    x1 = SCREEN_X(canvasPtr, arcPtr->bbox[0]);
+    y1 = SCREEN_Y(canvasPtr, arcPtr->bbox[1]);
+    x2 = SCREEN_X(canvasPtr, arcPtr->bbox[2]);
+    y2 = SCREEN_Y(canvasPtr, arcPtr->bbox[3]);
+    if (x2 <= x1) {
+       x2 = x1+1;
+    }
+    if (y2 <= y1) {
+       y2 = y1+1;
+    }
+    start = (64*arcPtr->start) + 0.5;
+    extent = (64*arcPtr->extent) + 0.5;
+
+    /*
+     * Display filled arc first (if wanted), then outline.
+     */
+
+    if (arcPtr->fillGC != None) {
+       XFillArc(display, drawable, arcPtr->fillGC, x1, y1, (x2-x1),
+               (y2-y1), start, extent);
+    }
+    if (arcPtr->outlineGC != None) {
+       XDrawArc(display, drawable, arcPtr->outlineGC, x1, y1, (x2-x1),
+               (y2-y1), start, extent);
+
+       /*
+        * If the outline width is very thin, don't use polygons to draw
+        * the linear parts of the outline (this often results in nothing
+        * being displayed); just draw lines instead.
+        */
+
+       if (arcPtr->width <= 2) {
+           x1 = SCREEN_X(canvasPtr, arcPtr->center1[0]);
+           y1 = SCREEN_Y(canvasPtr, arcPtr->center1[1]);
+           x2 = SCREEN_X(canvasPtr, arcPtr->center2[0]);
+           y2 = SCREEN_Y(canvasPtr, arcPtr->center2[1]);
+
+           if (arcPtr->style == chordUid) {
+               XDrawLine(display, drawable, arcPtr->outlineGC,
+                       x1, y1, x2, y2);
+           } else if (arcPtr->style == pieSliceUid) {
+               int cx, cy;
+    
+               cx = SCREEN_X(canvasPtr, (arcPtr->bbox[0] + arcPtr->bbox[2])/2.0);
+               cy = SCREEN_Y(canvasPtr, (arcPtr->bbox[1] + arcPtr->bbox[3])/2.0);
+               XDrawLine(display, drawable, arcPtr->outlineGC,
+                       cx, cy, x1, y1);
+               XDrawLine(display, drawable, arcPtr->outlineGC,
+                       cx, cy, x2, y2);
+           }
+       } else {
+           if (arcPtr->style == chordUid) {
+               TkFillPolygon(canvasPtr, arcPtr->outlinePtr,
+                       CHORD_OUTLINE_PTS, drawable, arcPtr->outlineGC);
+           } else if (arcPtr->style == pieSliceUid) {
+               TkFillPolygon(canvasPtr, arcPtr->outlinePtr,
+                       PIE_OUTLINE1_PTS, drawable, arcPtr->outlineGC);
+               TkFillPolygon(canvasPtr,
+                       arcPtr->outlinePtr + 2*PIE_OUTLINE1_PTS,
+                       PIE_OUTLINE2_PTS, drawable, arcPtr->outlineGC);
+           }
+       }
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ArcToPoint --
+ *
+ *     Computes the distance from a given point to a given
+ *     arc, in canvas units.
+ *
+ * Results:
+ *     The return value is 0 if the point whose x and y coordinates
+ *     are coordPtr[0] and coordPtr[1] is inside the arc.  If the
+ *     point isn't inside the arc then the return value is the
+ *     distance from the point to the arc.  If itemPtr is filled,
+ *     then anywhere in the interior is considered "inside"; if
+ *     itemPtr isn't filled, then "inside" means only the area
+ *     occupied by the outline.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static double
+ArcToPoint(canvasPtr, itemPtr, pointPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item to check against point. */
+    double *pointPtr;          /* Pointer to x and y coordinates. */
+{
+    register ArcItem *arcPtr = (ArcItem *) itemPtr;
+    double vertex[2], pointAngle, diff, dist, newDist;
+    double poly[8], polyDist, width;
+    int filled, angleInRange;
+
+    if ((arcPtr->fillGC != None) || (arcPtr->outlineGC == None)) {
+       filled = 1;
+    } else {
+       filled = 0;
+    }
+
+    /*
+     * See if the point is within the angular range of the arc.
+     * Remember, X angles are backwards from the way we'd normally
+     * think of them.  Also, compensate for any eccentricity of
+     * the oval.
+     */
+
+    vertex[0] = (arcPtr->bbox[0] + arcPtr->bbox[2])/2.0;
+    vertex[1] = (arcPtr->bbox[1] + arcPtr->bbox[3])/2.0;
+    pointAngle = -atan2((pointPtr[1] - vertex[1])
+           /(arcPtr->bbox[3] - arcPtr->bbox[1]),
+           (pointPtr[0] - vertex[0])/(arcPtr->bbox[2] - arcPtr->bbox[0]));
+    pointAngle *= 180/PI;
+    diff = pointAngle - arcPtr->start;
+    diff -= ((int) (diff/360.0) * 360.0);
+    if (diff < 0) {
+       diff += 360.0;
+    }
+    angleInRange = (diff <= arcPtr->extent) ||
+           ((arcPtr->extent < 0) && ((diff - 360.0) >= arcPtr->extent));
+
+    /*
+     * Now perform different tests depending on what kind of arc
+     * we're dealing with.
+     */
+
+    if (arcPtr->style == arcUid) {
+       if (angleInRange) {
+           return TkOvalToPoint(arcPtr->bbox, (double) arcPtr->width,
+                   0, pointPtr);
+       }
+       dist = hypot(pointPtr[0] - arcPtr->center1[0],
+               pointPtr[1] - arcPtr->center1[1]);
+       newDist = hypot(pointPtr[0] - arcPtr->center2[0],
+               pointPtr[1] - arcPtr->center2[1]);
+       if (newDist < dist) {
+           return newDist;
+       }
+       return dist;
+    }
+
+    if ((arcPtr->fillGC != None) || (arcPtr->outlineGC == None)) {
+       filled = 1;
+    } else {
+       filled = 0;
+    }
+    if (arcPtr->outlineGC == None) {
+       width = 0.0;
+    } else {
+       width = arcPtr->width;
+    }
+
+    if (arcPtr->style == pieSliceUid) {
+       if (width > 1.0) {
+           dist = TkPolygonToPoint(arcPtr->outlinePtr, PIE_OUTLINE1_PTS,
+                   pointPtr);
+           newDist = TkPolygonToPoint(arcPtr->outlinePtr + 2*PIE_OUTLINE1_PTS,
+                       PIE_OUTLINE2_PTS, pointPtr);
+       } else {
+           dist = TkLineToPoint(vertex, arcPtr->center1, pointPtr);
+           newDist = TkLineToPoint(vertex, arcPtr->center2, pointPtr);
+       }
+       if (newDist < dist) {
+           dist = newDist;
+       }
+       if (angleInRange) {
+           newDist = TkOvalToPoint(arcPtr->bbox, width, filled, pointPtr);
+           if (newDist < dist) {
+               dist = newDist;
+           }
+       }
+       return dist;
+    }
+
+    /*
+     * This is a chord-style arc.  We have to deal specially with the
+     * triangular piece that represents the difference between a
+     * chord-style arc and a pie-slice arc (for small angles this piece
+     * is excluded here where it would be included for pie slices;
+     * for large angles the piece is included here but would be
+     * excluded for pie slices).
+     */
+
+    if (width > 1.0) {
+       dist = TkPolygonToPoint(arcPtr->outlinePtr, CHORD_OUTLINE_PTS,
+                   pointPtr);
+    } else {
+       dist = TkLineToPoint(arcPtr->center1, arcPtr->center2, pointPtr);
+    }
+    poly[0] = poly[6] = vertex[0];
+    poly[1] = poly[7] = vertex[1];
+    poly[2] = arcPtr->center1[0];
+    poly[3] = arcPtr->center1[1];
+    poly[4] = arcPtr->center2[0];
+    poly[5] = arcPtr->center2[1];
+    polyDist = TkPolygonToPoint(poly, 4, pointPtr);
+    if (angleInRange) {
+       if ((arcPtr->extent < -180.0) || (arcPtr->extent > 180.0)
+               || (polyDist > 0.0)) {
+           newDist = TkOvalToPoint(arcPtr->bbox, width, filled, pointPtr);
+           if (newDist < dist) {
+               dist = newDist;
+           }
+       }
+    } else {
+       if ((arcPtr->extent < -180.0) || (arcPtr->extent > 180.0)) {
+           if (filled && (polyDist < dist)) {
+               dist = polyDist;
+           }
+       }
+    }
+    return dist;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ArcToArea --
+ *
+ *     This procedure is called to determine whether an item
+ *     lies entirely inside, entirely outside, or overlapping
+ *     a given area.
+ *
+ * Results:
+ *     -1 is returned if the item is entirely outside the area
+ *     given by rectPtr, 0 if it overlaps, and 1 if it is entirely
+ *     inside the given area.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static int
+ArcToArea(canvasPtr, itemPtr, rectPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item to check against arc. */
+    double *rectPtr;           /* Pointer to array of four coordinates
+                                * (x1, y1, x2, y2) describing rectangular
+                                * area.  */
+{
+    register ArcItem *arcPtr = (ArcItem *) itemPtr;
+    double rx, ry;             /* Radii for transformed oval:  these define
+                                * an oval centered at the origin. */
+    double tRect[4];           /* Transformed version of x1, y1, x2, y2,
+                                * for coord. system where arc is centered
+                                * on the origin. */
+    double center[2], width, angle, tmp;
+    double points[20], *pointPtr;
+    int numPoints, filled;
+    int inside;                        /* Non-zero means every test so far suggests
+                                * that arc is inside rectangle.  0 means
+                                * every test so far shows arc to be outside
+                                * of rectangle. */
+    int newInside;
+
+    if ((arcPtr->fillGC != None) || (arcPtr->outlineGC == None)) {
+       filled = 1;
+    } else {
+       filled = 0;
+    }
+    if (arcPtr->outlineGC == None) {
+       width = 0.0;
+    } else {
+       width = arcPtr->width;
+    }
+
+    /*
+     * Transform both the arc and the rectangle so that the arc's oval
+     * is centered on the origin.
+     */
+
+    center[0] = (arcPtr->bbox[0] + arcPtr->bbox[2])/2.0;
+    center[1] = (arcPtr->bbox[1] + arcPtr->bbox[3])/2.0;
+    tRect[0] = rectPtr[0] - center[0];
+    tRect[1] = rectPtr[1] - center[1];
+    tRect[2] = rectPtr[2] - center[0];
+    tRect[3] = rectPtr[3] - center[1];
+    rx = arcPtr->bbox[2] - center[0] + width/2.0;
+    ry = arcPtr->bbox[3] - center[1] + width/2.0;
+
+    /*
+     * Find the extreme points of the arc and see whether these are all
+     * inside the rectangle (in which case we're done), partly in and
+     * partly out (in which case we're done), or all outside (in which
+     * case we have more work to do).  The extreme points include the
+     * following, which are checked in order:
+     *
+     * 1. The outside points of the arc, corresponding to start and
+     *   extent.
+     * 2. The center of the arc (but only in pie-slice mode).
+     * 3. The 12, 3, 6, and 9-o'clock positions (but only if the arc
+     *    includes those angles).
+     */
+
+    pointPtr = points;
+    numPoints = 0;
+    angle = -arcPtr->start*(PI/180.0);
+    pointPtr[0] = rx*cos(angle);
+    pointPtr[1] = ry*sin(angle);
+    angle += -arcPtr->extent*(PI/180.0);
+    pointPtr[2] = rx*cos(angle);
+    pointPtr[3] = ry*sin(angle);
+    numPoints = 2;
+    pointPtr += 4;
+
+    if ((arcPtr->style == pieSliceUid) && (arcPtr->extent < 180.0)) {
+       pointPtr[0] = 0.0;
+       pointPtr[1] = 0.0;
+       numPoints++;
+       pointPtr += 2;
+    }
+
+    tmp = -arcPtr->start;
+    if (tmp < 0) {
+       tmp += 360.0;
+    }
+    if ((tmp < arcPtr->extent) || ((tmp-360) > arcPtr->extent)) {
+       pointPtr[0] = rx;
+       pointPtr[1] = 0.0;
+       numPoints++;
+       pointPtr += 2;
+    }
+    tmp = 90.0 - arcPtr->start;
+    if (tmp < 0) {
+       tmp += 360.0;
+    }
+    if ((tmp < arcPtr->extent) || ((tmp-360) > arcPtr->extent)) {
+       pointPtr[0] = 0.0;
+       pointPtr[1] = -ry;
+       numPoints++;
+       pointPtr += 2;
+    }
+    tmp = 180.0 - arcPtr->start;
+    if (tmp < 0) {
+       tmp += 360.0;
+    }
+    if ((tmp < arcPtr->extent) || ((tmp-360) > arcPtr->extent)) {
+       pointPtr[0] = -rx;
+       pointPtr[1] = 0.0;
+       numPoints++;
+       pointPtr += 2;
+    }
+    tmp = 270.0 - arcPtr->start;
+    if (tmp < 0) {
+       tmp += 360.0;
+    }
+    if ((tmp < arcPtr->extent) || ((tmp-360) > arcPtr->extent)) {
+       pointPtr[0] = 0.0;
+       pointPtr[1] = ry;
+       numPoints++;
+       pointPtr += 2;
+    }
+
+    /*
+     * Now that we've located the extreme points, loop through them all
+     * to see which are inside the rectangle.
+     */
+
+    inside = (points[0] > tRect[0]) && (points[0] < tRect[2])
+           && (points[1] > tRect[1]) && (points[1] < tRect[3]);
+    for (pointPtr = points+2; numPoints > 1; pointPtr += 2, numPoints--) {
+       newInside = (pointPtr[0] > tRect[0]) && (pointPtr[0] < tRect[2])
+               && (pointPtr[1] > tRect[1]) && (pointPtr[1] < tRect[3]);
+       if (newInside != inside) {
+           return 0;
+       }
+    }
+
+    if (inside) {
+       return 1;
+    }
+
+    /*
+     * So far, oval appears to be outside rectangle, but can't yet tell
+     * for sure.  Next, test each of the four sides of the rectangle
+     * against the bounding region for the arc.  If any intersections
+     * are found, then return "overlapping".  First, test against the
+     * polygon(s) forming the sides of a chord or pie-slice.
+     */
+
+    if (arcPtr->style == pieSliceUid) {
+       if (width >= 1.0) {
+           if (TkPolygonToArea(arcPtr->outlinePtr, PIE_OUTLINE1_PTS,
+                   rectPtr) != -1)  {
+               return 0;
+           }
+           if (TkPolygonToArea(arcPtr->outlinePtr + 2*PIE_OUTLINE1_PTS,
+                   PIE_OUTLINE2_PTS, rectPtr) != -1) {
+               return 0;
+           }
+       } else {
+           if ((TkLineToArea(center, arcPtr->center1, rectPtr) != -1) ||
+                   (TkLineToArea(center, arcPtr->center2, rectPtr) != -1)) {
+               return 0;
+           }
+       }
+    } else if (arcPtr->style == chordUid) {
+       if (width >= 1.0) {
+           if (TkPolygonToArea(arcPtr->outlinePtr, CHORD_OUTLINE_PTS,
+                   rectPtr) != -1) {
+               return 0;
+           }
+       } else {
+           if (TkLineToArea(arcPtr->center1, arcPtr->center2,
+                   rectPtr) != -1) {
+               return 0;
+           }
+       }
+    }
+
+    /*
+     * Next check for overlap between each of the four sides and the
+     * outer perimiter of the arc.  If the arc isn't filled, then also
+     * check the inner perimeter of the arc.
+     */
+
+    if (HorizLineToArc(tRect[0], tRect[2], tRect[1], rx, ry, arcPtr->start,
+               arcPtr->extent)
+           || HorizLineToArc(tRect[0], tRect[2], tRect[3], rx, ry,
+               arcPtr->start, arcPtr->extent)
+           || VertLineToArc(tRect[0], tRect[1], tRect[3], rx, ry,
+               arcPtr->start, arcPtr->extent)
+           || VertLineToArc(tRect[2], tRect[1], tRect[3], rx, ry,
+               arcPtr->start, arcPtr->extent)) {
+       return 0;
+    }
+    if ((width > 1.0) && !filled) {
+       rx -= width;
+       ry -= width;
+       if (HorizLineToArc(tRect[0], tRect[2], tRect[1], rx, ry, arcPtr->start,
+                   arcPtr->extent)
+               || HorizLineToArc(tRect[0], tRect[2], tRect[3], rx, ry,
+                   arcPtr->start, arcPtr->extent)
+               || VertLineToArc(tRect[0], tRect[1], tRect[3], rx, ry,
+                   arcPtr->start, arcPtr->extent)
+               || VertLineToArc(tRect[2], tRect[1], tRect[3], rx, ry,
+                   arcPtr->start, arcPtr->extent)) {
+           return 0;
+       }
+    }
+
+    /*
+     * The arc still appears to be totally disjoint from the rectangle,
+     * but it's also possible that the rectangle is totally inside the arc.
+     * Do one last check, which is to check one point of the rectangle
+     * to see if it's inside the arc.  If it is, we've got overlap.  If
+     * it isn't, the arc's really outside the rectangle.
+     */
+
+    if (ArcToPoint(canvasPtr, itemPtr, rectPtr) == 0.0) {
+       return 0;
+    }
+    return -1;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScaleArc --
+ *
+ *     This procedure is invoked to rescale an arc item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The arc referred to by itemPtr is rescaled so that the
+ *     following transformation is applied to all point
+ *     coordinates:
+ *             x' = originX + scaleX*(x-originX)
+ *             y' = originY + scaleY*(y-originY)
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ScaleArc(canvasPtr, itemPtr, originX, originY, scaleX, scaleY)
+    Tk_Canvas *canvasPtr;              /* Canvas containing arc. */
+    Tk_Item *itemPtr;                  /* Arc to be scaled. */
+    double originX, originY;           /* Origin about which to scale rect. */
+    double scaleX;                     /* Amount to scale in X direction. */
+    double scaleY;                     /* Amount to scale in Y direction. */
+{
+    register ArcItem *arcPtr = (ArcItem *) itemPtr;
+
+    arcPtr->bbox[0] = originX + scaleX*(arcPtr->bbox[0] - originX);
+    arcPtr->bbox[1] = originY + scaleY*(arcPtr->bbox[1] - originY);
+    arcPtr->bbox[2] = originX + scaleX*(arcPtr->bbox[2] - originX);
+    arcPtr->bbox[3] = originY + scaleY*(arcPtr->bbox[3] - originY);
+    ComputeArcBbox(canvasPtr, arcPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TranslateArc --
+ *
+ *     This procedure is called to move an arc by a given amount.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The position of the arc is offset by (xDelta, yDelta), and
+ *     the bounding box is updated in the generic part of the item
+ *     structure.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+TranslateArc(canvasPtr, itemPtr, deltaX, deltaY)
+    Tk_Canvas *canvasPtr;              /* Canvas containing item. */
+    Tk_Item *itemPtr;                  /* Item that is being moved. */
+    double deltaX, deltaY;             /* Amount by which item is to be
+                                        * moved. */
+{
+    register ArcItem *arcPtr = (ArcItem *) itemPtr;
+
+    arcPtr->bbox[0] += deltaX;
+    arcPtr->bbox[1] += deltaY;
+    arcPtr->bbox[2] += deltaX;
+    arcPtr->bbox[3] += deltaY;
+    ComputeArcBbox(canvasPtr, arcPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ComputeArcOutline --
+ *
+ *     This procedure creates a polygon describing everything in
+ *     the outline for an arc except what's in the curved part.
+ *     For a "pie slice" arc this is a V-shaped chunk, and for
+ *     a "chord" arc this is a linear chunk (with cutaway corners).
+ *     For "arc" arcs, this stuff isn't relevant.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The information at arcPtr->outlinePtr gets modified, and
+ *     storage for arcPtr->outlinePtr may be allocated or freed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ComputeArcOutline(arcPtr)
+    register ArcItem *arcPtr;
+{
+    double sin1, cos1, sin2, cos2, angle, halfWidth;
+    double boxWidth, boxHeight;
+    double vertex[2], corner1[2], corner2[2];
+    double *outlinePtr;
+
+    /*
+     * Make sure that the outlinePtr array is large enough to hold
+     * either a chord or pie-slice outline.
+     */
+
+    if (arcPtr->numOutlinePoints == 0) {
+       arcPtr->outlinePtr = (double *) ckalloc((unsigned)
+               (26 * sizeof(double)));
+       arcPtr->numOutlinePoints = 22;
+    }
+    outlinePtr = arcPtr->outlinePtr;
+
+    /*
+     * First compute the two points that lie at the centers of
+     * the ends of the curved arc segment, which are marked with
+     * X's in the figure below:
+     *
+     *
+     *                           * * *
+     *                       *          *
+     *                    *      * *      *
+     *                  *    *         *    *
+     *                 *   *             *   *
+     *                  X *               * X
+     *
+     * The code is tricky because the arc can be ovular in shape.
+     * It computes the position for a unit circle, and then
+     * scales to fit the shape of the arc's bounding box.
+     *
+     * Also, watch out because angles go counter-clockwise like you
+     * might expect, but the y-coordinate system is inverted.  To
+     * handle this, just negate the angles in all the computations.
+     */
+
+    boxWidth = arcPtr->bbox[2] - arcPtr->bbox[0];
+    boxHeight = arcPtr->bbox[3] - arcPtr->bbox[1];
+    angle = -arcPtr->start*PI/180.0;
+    sin1 = sin(angle);
+    cos1 = cos(angle);
+    angle -= arcPtr->extent*PI/180.0;
+    sin2 = sin(angle);
+    cos2 = cos(angle);
+    vertex[0] = (arcPtr->bbox[0] + arcPtr->bbox[2])/2.0;
+    vertex[1] = (arcPtr->bbox[1] + arcPtr->bbox[3])/2.0;
+    arcPtr->center1[0] = vertex[0] + cos1*boxWidth/2.0;
+    arcPtr->center1[1] = vertex[1] + sin1*boxHeight/2.0;
+    arcPtr->center2[0] = vertex[0] + cos2*boxWidth/2.0;
+    arcPtr->center2[1] = vertex[1] + sin2*boxHeight/2.0;
+
+    /*
+     * Next compute the "outermost corners" of the arc, which are
+     * marked with X's in the figure below:
+     *
+     *                           * * *
+     *                       *          *
+     *                    *      * *      *
+     *                  *    *         *    *
+     *                 X   *             *   X
+     *                    *               *
+     *
+     * The code below is tricky because it has to handle eccentricity
+     * in the shape of the oval.  The key in the code below is to
+     * realize that the slope of the line from arcPtr->center1 to corner1
+     * is (boxWidth*sin1)/(boxHeight*cos1), and similarly for arcPtr->center2
+     * and corner2.  These formulas can be computed from the formula for
+     * the oval.
+     */
+
+    halfWidth = arcPtr->width/2.0;
+    angle = atan2(boxWidth*sin1, boxHeight*cos1);
+    corner1[0] = arcPtr->center1[0] + cos(angle)*halfWidth;
+    corner1[1] = arcPtr->center1[1] + sin(angle)*halfWidth;
+    angle = atan2(boxWidth*sin2, boxHeight*cos2);
+    corner2[0] = arcPtr->center2[0] + cos(angle)*halfWidth;
+    corner2[1] = arcPtr->center2[1] + sin(angle)*halfWidth;
+
+    /*
+     * For a chord outline, generate a six-sided polygon with three
+     * points for each end of the chord.  The first and third points
+     * for each end are butt points generated on either side of the
+     * center point.  The second point is the corner point.
+     */
+
+    if (arcPtr->style == chordUid) {
+       outlinePtr[0] = outlinePtr[12] = corner1[0];
+       outlinePtr[1] = outlinePtr[13] = corner1[1];
+       TkGetButtPoints(arcPtr->center2, arcPtr->center1,
+               (double) arcPtr->width, 0, outlinePtr+10, outlinePtr+2);
+       outlinePtr[4] = arcPtr->center2[0] + outlinePtr[2]
+               - arcPtr->center1[0];
+       outlinePtr[5] = arcPtr->center2[1] + outlinePtr[3]
+               - arcPtr->center1[1];
+       outlinePtr[6] = corner2[0];
+       outlinePtr[7] = corner2[1];
+       outlinePtr[8] = arcPtr->center2[0] + outlinePtr[10]
+               - arcPtr->center1[0];
+       outlinePtr[9] = arcPtr->center2[1] + outlinePtr[11]
+               - arcPtr->center1[1];
+    } else if (arcPtr->style == pieSliceUid) {
+       /*
+        * For pie slices, generate two polygons, one for each side
+        * of the pie slice.  The first arm has a shape like this,
+        * where the center of the oval is X, arcPtr->center1 is at Y, and
+        * corner1 is at Z:
+        *
+        *       _____________________
+        *      |                     \
+        *      |                      \
+        *      X                    Y  Z
+        *      |                      /
+        *      |_____________________/
+        *
+        */
+
+       TkGetButtPoints(arcPtr->center1, vertex, (double) arcPtr->width, 0,
+               outlinePtr, outlinePtr+2);
+       outlinePtr[4] = arcPtr->center1[0] + outlinePtr[2] - vertex[0];
+       outlinePtr[5] = arcPtr->center1[1] + outlinePtr[3] - vertex[1];
+       outlinePtr[6] = corner1[0];
+       outlinePtr[7] = corner1[1];
+       outlinePtr[8] = arcPtr->center1[0] + outlinePtr[0] - vertex[0];
+       outlinePtr[9] = arcPtr->center1[1] + outlinePtr[1] - vertex[1];
+       outlinePtr[10] = outlinePtr[0];
+       outlinePtr[11] = outlinePtr[1];
+
+       /*
+        * The second arm has a shape like this:
+        *
+        *
+        *         ______________________
+        *        /                       \
+        *       /                         \
+        *      Z  Y                    X  /
+        *       \                        /
+        *        \______________________/
+        *
+        * Similar to above X is the center of the oval/circle, Y is
+        * arcPtr->center2, and Z is corner2.  The extra jog out to the left
+        * of X is needed in or to produce a butted joint with the
+        * first arm;  the corner to the right of X is one of the
+        * first two points of the first arm, depending on extent.
+        */
+
+       TkGetButtPoints(arcPtr->center2, vertex, (double) arcPtr->width, 0,
+               outlinePtr+12, outlinePtr+16);
+       if ((arcPtr->extent > 180) ||
+               ((arcPtr->extent < 0) && (arcPtr->extent > -180))) {
+           outlinePtr[14] = outlinePtr[0];
+           outlinePtr[15] = outlinePtr[1];
+       } else {
+           outlinePtr[14] = outlinePtr[2];
+           outlinePtr[15] = outlinePtr[3];
+       }
+       outlinePtr[18] = arcPtr->center2[0] + outlinePtr[16] - vertex[0];
+       outlinePtr[19] = arcPtr->center2[1] + outlinePtr[17] - vertex[1];
+       outlinePtr[20] = corner2[0];
+       outlinePtr[21] = corner2[1];
+       outlinePtr[22] = arcPtr->center2[0] + outlinePtr[12] - vertex[0];
+       outlinePtr[23] = arcPtr->center2[1] + outlinePtr[13] - vertex[1];
+       outlinePtr[24] = outlinePtr[12];
+       outlinePtr[25] = outlinePtr[13];
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * HorizLineToArc --
+ *
+ *     Determines whether a horizontal line segment intersects
+ *     a given arc.
+ *
+ * Results:
+ *     The return value is 1 if the given line intersects the
+ *     infinitely-thin arc section defined by rx, ry, start,
+ *     and extent, and 0 otherwise.  Only the perimeter of the
+ *     arc is checked: interior areas (e.g. pie-slice or chord)
+ *     are not checked.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+HorizLineToArc(x1, x2, y, rx, ry, start, extent)
+    double x1, x2;             /* X-coords of endpoints of line segment. 
+                                * X1 must be <= x2. */
+    double y;                  /* Y-coordinate of line segment. */
+    double rx, ry;             /* These x- and y-radii define an oval
+                                * centered at the origin. */
+    double start, extent;      /* Angles that define extent of arc, in
+                                * the standard fashion for this module. */
+{
+    double tmp;
+    double tx, ty;             /* Coordinates of intersection point in
+                                * transformed coordinate system. */
+    double x;
+
+    /*
+     * Compute the x-coordinate of one possible intersection point
+     * between the arc and the line.  Use a transformed coordinate
+     * system where the oval is a unit circle centered at the origin.
+     * Then scale back to get actual x-coordinate.
+     */
+
+    ty = y/ry;
+    tmp = 1 - ty*ty;
+    if (tmp < 0) {
+       return 0;
+    }
+    tx = sqrt(tmp);
+    x = tx*rx;
+
+    /*
+     * Test both intersection points.
+     */
+
+    if ((x >= x1) && (x <= x2) && AngleInRange(tx, ty, start, extent)) {
+       return 1;
+    }
+    if ((-x >= x1) && (-x <= x2) && AngleInRange(-tx, ty, start, extent)) {
+       return 1;
+    }
+    return 0;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * VertLineToArc --
+ *
+ *     Determines whether a vertical line segment intersects
+ *     a given arc.
+ *
+ * Results:
+ *     The return value is 1 if the given line intersects the
+ *     infinitely-thin arc section defined by rx, ry, start,
+ *     and extent, and 0 otherwise.  Only the perimeter of the
+ *     arc is checked: interior areas (e.g. pie-slice or chord)
+ *     are not checked.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+VertLineToArc(x, y1, y2, rx, ry, start, extent)
+    double x;                  /* X-coordinate of line segment. */
+    double y1, y2;             /* Y-coords of endpoints of line segment. 
+                                * Y1 must be <= y2. */
+    double rx, ry;             /* These x- and y-radii define an oval
+                                * centered at the origin. */
+    double start, extent;      /* Angles that define extent of arc, in
+                                * the standard fashion for this module. */
+{
+    double tmp;
+    double tx, ty;             /* Coordinates of intersection point in
+                                * transformed coordinate system. */
+    double y;
+
+    /*
+     * Compute the y-coordinate of one possible intersection point
+     * between the arc and the line.  Use a transformed coordinate
+     * system where the oval is a unit circle centered at the origin.
+     * Then scale back to get actual y-coordinate.
+     */
+
+    tx = x/rx;
+    tmp = 1 - tx*tx;
+    if (tmp < 0) {
+       return 0;
+    }
+    ty = sqrt(tmp);
+    y = ty*ry;
+
+    /*
+     * Test both intersection points.
+     */
+
+    if ((y > y1) && (y < y2) && AngleInRange(tx, ty, start, extent)) {
+       return 1;
+    }
+    if ((-y > y1) && (-y < y2) && AngleInRange(tx, -ty, start, extent)) {
+       return 1;
+    }
+    return 0;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * AngleInRange --
+ *
+ *     Determine whether the angle from the origin to a given
+ *     point is within a given range.
+ *
+ * Results:
+ *     The return value is 1 if the angle from (0,0) to (x,y)
+ *     is in the range given by start and extent, where angles
+ *     are interpreted in the standard way for ovals (meaning
+ *     backwards from normal interpretation).  Otherwise the
+ *     return value is 0.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+AngleInRange(x, y, start, extent)
+    double x, y;               /* Coordinate of point;  angle measured
+                                * from origin to here, relative to x-axis. */
+    double start;              /* First angle, degrees, >=0, <=360. */
+    double extent;             /* Size of arc in degrees >=-360, <=360. */
+{
+    double diff;
+
+    diff = -atan2(y, x);
+    diff = diff*(180.0/PI) - start;
+    while (diff > 360.0) {
+       diff -= 360.0;
+    }
+    while (diff < 0.0) {
+       diff += 360.0;
+    }
+    if (extent >= 0) {
+       return diff <= extent;
+    }
+    return (diff-360.0) >= extent;
+}
diff --git a/src/tk/tkcvbmap.c b/src/tk/tkcvbmap.c
new file mode 100644 (file)
index 0000000..5fe1726
--- /dev/null
@@ -0,0 +1,641 @@
+/* 
+ * tkCanvBmap.c --
+ *
+ *     This file implements bitmap items for canvas widgets.
+ *
+ * Copyright 1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkCanvBmap.c,v 1.4 92/08/24 09:24:11 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include <stdio.h>
+#include <math.h>
+#include "tkint.h"
+#include "tkcanvas.h"
+
+/*
+ * The structure below defines the record for each rectangle/oval item.
+ */
+
+typedef struct BitmapItem  {
+    Tk_Item header;            /* Generic stuff that's the same for all
+                                * types.  MUST BE FIRST IN STRUCTURE. */
+    double x, y;               /* Coordinates of positioning point for
+                                * bitmap. */
+    Tk_Anchor anchor;          /* Where to anchor bitmap relative to
+                                * (x,y). */
+    Pixmap bitmap;             /* Bitmap to display in window. */
+    XColor *fgColor;           /* Foreground color to use for bitmap. */
+    XColor *bgColor;           /* Background color to use for bitmap. */
+    GC gc;                     /* Graphics context to use for drawing
+                                * bitmap on screen. */
+} BitmapItem;
+
+/*
+ * Information used for parsing configuration specs:
+ */
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_ANCHOR, "-anchor", (char *) NULL, (char *) NULL,
+       "center", Tk_Offset(BitmapItem, anchor), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_COLOR, "-background", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(BitmapItem, bgColor), TK_CONFIG_NULL_OK},
+#if defined(USE_XPM3)
+    {TK_CONFIG_PIXMAP, "-bitmap", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(BitmapItem, bitmap), TK_CONFIG_NULL_OK},
+#else
+    {TK_CONFIG_BITMAP, "-bitmap", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(BitmapItem, bitmap), TK_CONFIG_NULL_OK},
+#endif
+    {TK_CONFIG_COLOR, "-foreground", (char *) NULL, (char *) NULL,
+       "black", Tk_Offset(BitmapItem, fgColor), 0},
+    {TK_CONFIG_CUSTOM, "-tags", (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, TK_CONFIG_NULL_OK, &tkCanvasTagsOption},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Prototypes for procedures defined in this file:
+ */
+
+static int             BitmapCoords _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, int argc, char **argv));
+static int             BitmapToArea _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *rectPtr));
+static double          BitmapToPoint _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *coordPtr));
+static void            ComputeBitmapBbox _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           BitmapItem *bmapPtr));
+static int             ConfigureBitmap _ANSI_ARGS_((
+                           Tk_Canvas *canvasPtr, Tk_Item *itemPtr, int argc,
+                           char **argv, int flags));
+static int             CreateBitmap _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           struct Tk_Item *itemPtr, int argc, char **argv));
+static void            DeleteBitmap _ANSI_ARGS_((Tk_Item *itemPtr));
+static void            DisplayBitmap _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, Drawable dst));
+static void            ScaleBitmap _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double originX, double originY,
+                           double scaleX, double scaleY));
+static void            TranslateBitmap _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double deltaX, double deltaY));
+
+/*
+ * The structures below defines the rectangle and oval item types
+ * by means of procedures that can be invoked by generic item code.
+ */
+
+Tk_ItemType TkBitmapType = {
+    "bitmap",                          /* name */
+    sizeof(BitmapItem),                        /* itemSize */
+    CreateBitmap,                      /* createProc */
+    configSpecs,                       /* configSpecs */
+    ConfigureBitmap,                   /* configureProc */
+    BitmapCoords,                      /* coordProc */
+    DeleteBitmap,                      /* deleteProc */
+    DisplayBitmap,                     /* displayProc */
+    0,                                 /* alwaysRedraw */
+    BitmapToPoint,                     /* pointProc */
+    BitmapToArea,                      /* areaProc */
+    (Tk_ItemPostscriptProc *) NULL,    /* postscriptProc */
+    ScaleBitmap,                       /* scaleProc */
+    TranslateBitmap,                   /* translateProc */
+    (Tk_ItemIndexProc *) NULL,         /* indexProc */
+    (Tk_ItemCursorProc *) NULL,                /* cursorProc */
+    (Tk_ItemSelectionProc *) NULL,     /* selectionProc */
+    (Tk_ItemInsertProc *) NULL,                /* insertProc */
+    (Tk_ItemDCharsProc *) NULL,                /* dTextProc */
+    (Tk_ItemType *) NULL               /* nextPtr */
+};
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CreateBitmap --
+ *
+ *     This procedure is invoked to create a new bitmap
+ *     item in a canvas.
+ *
+ * Results:
+ *     A standard Tcl return value.  If an error occurred in
+ *     creating the item, then an error message is left in
+ *     canvasPtr->interp->result;  in this case itemPtr is
+ *     left uninitialized, so it can be safely freed by the
+ *     caller.
+ *
+ * Side effects:
+ *     A new bitmap item is created.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+CreateBitmap(canvasPtr, itemPtr, argc, argv)
+    register Tk_Canvas *canvasPtr;     /* Canvas to hold new item. */
+    Tk_Item *itemPtr;                  /* Record to hold new item;  header
+                                        * has been initialized by caller. */
+    int argc;                          /* Number of arguments in argv. */
+    char **argv;                       /* Arguments describing rectangle. */
+{
+    register BitmapItem *bmapPtr = (BitmapItem *) itemPtr;
+
+    if (argc < 2) {
+       Tcl_AppendResult(canvasPtr->interp, "wrong # args:  should be \"",
+               Tk_PathName(canvasPtr->tkwin), "\" create ",
+               itemPtr->typePtr->name, " x y ?options?",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Initialize item's record.
+     */
+
+    bmapPtr->anchor = TK_ANCHOR_CENTER;
+    bmapPtr->bitmap = None;
+    bmapPtr->fgColor = NULL;
+    bmapPtr->bgColor = NULL;
+    bmapPtr->gc = None;
+
+    /*
+     * Process the arguments to fill in the item record.
+     */
+
+    if ((TkGetCanvasCoord(canvasPtr, argv[0], &bmapPtr->x) != TCL_OK)
+           || (TkGetCanvasCoord(canvasPtr, argv[1],
+               &bmapPtr->y) != TCL_OK)) {
+       return TCL_ERROR;
+    }
+
+    if (ConfigureBitmap(canvasPtr, itemPtr, argc-2, argv+2, 0) != TCL_OK) {
+       DeleteBitmap(itemPtr);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * BitmapCoords --
+ *
+ *     This procedure is invoked to process the "coords" widget
+ *     command on bitmap items.  See the user documentation for
+ *     details on what it does.
+ *
+ * Results:
+ *     Returns TCL_OK or TCL_ERROR, and sets canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     The coordinates for the given item may be changed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+BitmapCoords(canvasPtr, itemPtr, argc, argv)
+    register Tk_Canvas *canvasPtr;     /* Canvas containing item. */
+    Tk_Item *itemPtr;                  /* Item whose coordinates are to be
+                                        * read or modified. */
+    int argc;                          /* Number of coordinates supplied in
+                                        * argv. */
+    char **argv;                       /* Array of coordinates: x1, y1,
+                                        * x2, y2, ... */
+{
+    register BitmapItem *bmapPtr = (BitmapItem *) itemPtr;
+
+    if (argc == 0) {
+       sprintf(canvasPtr->interp->result, "%g %g", bmapPtr->x, bmapPtr->y);
+    } else if (argc == 2) {
+       if ((TkGetCanvasCoord(canvasPtr, argv[0], &bmapPtr->x) != TCL_OK)
+               || (TkGetCanvasCoord(canvasPtr, argv[1],
+                   &bmapPtr->y) != TCL_OK)) {
+           return TCL_ERROR;
+       }
+       ComputeBitmapBbox(canvasPtr, bmapPtr);
+    } else {
+       sprintf(canvasPtr->interp->result,
+               "wrong # coordinates:  expected 0 or 2, got %d",
+               argc);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ConfigureBitmap --
+ *
+ *     This procedure is invoked to configure various aspects
+ *     of a bitmap item, such as its anchor position.
+ *
+ * Results:
+ *     A standard Tcl result code.  If an error occurs, then
+ *     an error message is left in canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     Configuration information may be set for itemPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ConfigureBitmap(canvasPtr, itemPtr, argc, argv, flags)
+    Tk_Canvas *canvasPtr;      /* Canvas containing itemPtr. */
+    Tk_Item *itemPtr;          /* Bitmap item to reconfigure. */
+    int argc;                  /* Number of elements in argv.  */
+    char **argv;               /* Arguments describing things to configure. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    register BitmapItem *bmapPtr = (BitmapItem *) itemPtr;
+    XGCValues gcValues;
+    GC newGC;
+
+    if (Tk_ConfigureWidget(canvasPtr->interp, canvasPtr->tkwin,
+           configSpecs, argc, argv, (char *) bmapPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few of the options require additional processing, such as those
+     * that determine the graphics context.
+     */
+
+    gcValues.foreground = bmapPtr->fgColor->pixel;
+    if (bmapPtr->bgColor != NULL) {
+       gcValues.background = bmapPtr->bgColor->pixel;
+    } else {
+       gcValues.background = canvasPtr->bgColor->pixel;
+    }
+    newGC = Tk_GetGC(canvasPtr->tkwin, GCForeground|GCBackground, &gcValues);
+    if (bmapPtr->gc != None) {
+       Tk_FreeGC(bmapPtr->gc);
+    }
+    bmapPtr->gc = newGC;
+
+    ComputeBitmapBbox(canvasPtr, bmapPtr);
+
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DeleteBitmap --
+ *
+ *     This procedure is called to clean up the data structure
+ *     associated with a bitmap item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Resources associated with itemPtr are released.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DeleteBitmap(itemPtr)
+    Tk_Item *itemPtr;                  /* Item that is being deleted. */
+{
+    register BitmapItem *bmapPtr = (BitmapItem *) itemPtr;
+
+    if (bmapPtr->bitmap != None) {
+#if defined(USE_XPM3)
+        Tk_FreePixmap(bmapPtr->bitmap);
+#else
+        Tk_FreeBitmap(bmapPtr->bitmap);
+#endif
+    }
+    if (bmapPtr->fgColor != NULL) {
+       Tk_FreeColor(bmapPtr->fgColor);
+    }
+    if (bmapPtr->bgColor != NULL) {
+       Tk_FreeColor(bmapPtr->bgColor);
+    }
+    if (bmapPtr->gc != NULL) {
+       Tk_FreeGC(bmapPtr->gc);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ComputeBitmapBbox --
+ *
+ *     This procedure is invoked to compute the bounding box of
+ *     all the pixels that may be drawn as part of a bitmap item.
+ *     This procedure is where the child bitmap's placement is
+ *     computed.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The fields x1, y1, x2, and y2 are updated in the header
+ *     for itemPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static void
+ComputeBitmapBbox(canvasPtr, bmapPtr)
+    Tk_Canvas *canvasPtr;              /* Canvas that contains item. */
+    register BitmapItem *bmapPtr;      /* Item whose bbox is to be
+                                        * recomputed. */
+{
+    unsigned int width, height;
+    int x, y;
+
+    x = bmapPtr->x + 0.5;
+    y = bmapPtr->y + 0.5;
+
+    if (bmapPtr->bitmap == None) {
+       bmapPtr->header.x1 = bmapPtr->header.x2 = x;
+       bmapPtr->header.y1 = bmapPtr->header.y2 = y;
+       return;
+    }
+
+    /*
+     * Compute location and size of bitmap, using anchor information.
+     */
+
+#if defined(USE_XPM3)
+    Tk_SizeOfPixmap(bmapPtr->bitmap, &width, &height);
+#else
+    Tk_SizeOfBitmap(bmapPtr->bitmap, &width, &height);
+#endif
+    switch (bmapPtr->anchor) {
+       case TK_ANCHOR_N:
+           x -= width/2;
+           break;
+       case TK_ANCHOR_NE:
+           x -= width;
+           break;
+       case TK_ANCHOR_E:
+           x -= width;
+           y -= height/2;
+           break;
+       case TK_ANCHOR_SE:
+           x -= width;
+           y -= height;
+           break;
+       case TK_ANCHOR_S:
+           x -= width/2;
+           y -= height;
+           break;
+       case TK_ANCHOR_SW:
+           y -= height;
+           break;
+       case TK_ANCHOR_W:
+           y -= height/2;
+           break;
+       case TK_ANCHOR_NW:
+           break;
+       case TK_ANCHOR_CENTER:
+           x -= width/2;
+           y -= height/2;
+           break;
+    }
+
+    /*
+     * Store the information in the item header.
+     */
+
+    bmapPtr->header.x1 = x;
+    bmapPtr->header.y1 = y;
+    bmapPtr->header.x2 = x + width;
+    bmapPtr->header.y2 = y + height;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayBitmap --
+ *
+ *     This procedure is invoked to draw a bitmap item in a given
+ *     drawable.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     ItemPtr is drawn in drawable using the transformation
+ *     information in canvasPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayBitmap(canvasPtr, itemPtr, drawable)
+    register Tk_Canvas *canvasPtr;     /* Canvas that contains item. */
+    Tk_Item *itemPtr;                  /* Item to be displayed. */
+    Drawable drawable;                 /* Pixmap or window in which to draw
+                                        * item. */
+{
+    register BitmapItem *bmapPtr = (BitmapItem *) itemPtr;
+
+    if (bmapPtr->bitmap != None) {
+#if defined(USE_XPM3)        
+       XCopyArea(Tk_Display(canvasPtr->tkwin), bmapPtr->bitmap, drawable,
+               bmapPtr->gc, 0, 0,
+               (unsigned int) bmapPtr->header.x2 - bmapPtr->header.x1,
+               (unsigned int) bmapPtr->header.y2 - bmapPtr->header.y1,
+               bmapPtr->header.x1 - canvasPtr->drawableXOrigin,
+               bmapPtr->header.y1 - canvasPtr->drawableYOrigin);
+#else
+       XCopyPlane(Tk_Display(canvasPtr->tkwin), bmapPtr->bitmap, drawable,
+               bmapPtr->gc, 0, 0,
+               (unsigned int) bmapPtr->header.x2 - bmapPtr->header.x1,
+               (unsigned int) bmapPtr->header.y2 - bmapPtr->header.y1,
+               bmapPtr->header.x1 - canvasPtr->drawableXOrigin,
+               bmapPtr->header.y1 - canvasPtr->drawableYOrigin, 1);
+#endif
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * BitmapToPoint --
+ *
+ *     Computes the distance from a given point to a given
+ *     rectangle, in canvas units.
+ *
+ * Results:
+ *     The return value is 0 if the point whose x and y coordinates
+ *     are coordPtr[0] and coordPtr[1] is inside the bitmap.  If the
+ *     point isn't inside the bitmap then the return value is the
+ *     distance from the point to the bitmap.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static double
+BitmapToPoint(canvasPtr, itemPtr, coordPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item to check against point. */
+    double *coordPtr;          /* Pointer to x and y coordinates. */
+{
+    register BitmapItem *bmapPtr = (BitmapItem *) itemPtr;
+    double x1, x2, y1, y2, xDiff, yDiff;
+
+    x1 = bmapPtr->header.x1;
+    y1 = bmapPtr->header.y1;
+    x2 = bmapPtr->header.x2;
+    y2 = bmapPtr->header.y2;
+
+    /*
+     * Point is outside rectangle.
+     */
+
+    if (coordPtr[0] < x1) {
+       xDiff = x1 - coordPtr[0];
+    } else if (coordPtr[0] > x2)  {
+       xDiff = coordPtr[0] - x2;
+    } else {
+       xDiff = 0;
+    }
+
+    if (coordPtr[1] < y1) {
+       yDiff = y1 - coordPtr[1];
+    } else if (coordPtr[1] > y2)  {
+       yDiff = coordPtr[1] - y2;
+    } else {
+       yDiff = 0;
+    }
+
+    return hypot(xDiff, yDiff);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * BitmapToArea --
+ *
+ *     This procedure is called to determine whether an item
+ *     lies entirely inside, entirely outside, or overlapping
+ *     a given rectangle.
+ *
+ * Results:
+ *     -1 is returned if the item is entirely outside the area
+ *     given by rectPtr, 0 if it overlaps, and 1 if it is entirely
+ *     inside the given area.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static int
+BitmapToArea(canvasPtr, itemPtr, rectPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item to check against rectangle. */
+    double *rectPtr;           /* Pointer to array of four coordinates
+                                * (x1, y1, x2, y2) describing rectangular
+                                * area.  */
+{
+    register BitmapItem *bmapPtr = (BitmapItem *) itemPtr;
+
+    if ((rectPtr[2] <= bmapPtr->header.x1)
+           || (rectPtr[0] >= bmapPtr->header.x2)
+           || (rectPtr[3] <= bmapPtr->header.y1)
+           || (rectPtr[1] >= bmapPtr->header.y2)) {
+       return -1;
+    }
+    if ((rectPtr[0] <= bmapPtr->header.x1)
+           && (rectPtr[1] <= bmapPtr->header.y1)
+           && (rectPtr[2] >= bmapPtr->header.x2)
+           && (rectPtr[3] >= bmapPtr->header.y2)) {
+       return 1;
+    }
+    return 0;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScaleBitmap --
+ *
+ *     This procedure is invoked to rescale a rectangle or oval
+ *     item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The rectangle or oval referred to by itemPtr is rescaled
+ *     so that the following transformation is applied to all
+ *     point coordinates:
+ *             x' = originX + scaleX*(x-originX)
+ *             y' = originY + scaleY*(y-originY)
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ScaleBitmap(canvasPtr, itemPtr, originX, originY, scaleX, scaleY)
+    Tk_Canvas *canvasPtr;              /* Canvas containing rectangle. */
+    Tk_Item *itemPtr;                  /* Rectangle to be scaled. */
+    double originX, originY;           /* Origin about which to scale rect. */
+    double scaleX;                     /* Amount to scale in X direction. */
+    double scaleY;                     /* Amount to scale in Y direction. */
+{
+    register BitmapItem *bmapPtr = (BitmapItem *) itemPtr;
+
+    bmapPtr->x = originX + scaleX*(bmapPtr->x - originX);
+    bmapPtr->y = originY + scaleY*(bmapPtr->y - originY);
+    ComputeBitmapBbox(canvasPtr, bmapPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TranslateBitmap --
+ *
+ *     This procedure is called to move a rectangle or oval by a
+ *     given amount.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The position of the rectangle or oval is offset by
+ *     (xDelta, yDelta), and the bounding box is updated in the
+ *     generic part of the item structure.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+TranslateBitmap(canvasPtr, itemPtr, deltaX, deltaY)
+    Tk_Canvas *canvasPtr;              /* Canvas containing item. */
+    Tk_Item *itemPtr;                  /* Item that is being moved. */
+    double deltaX, deltaY;             /* Amount by which item is to be
+                                        * moved. */
+{
+    register BitmapItem *bmapPtr = (BitmapItem *) itemPtr;
+
+    bmapPtr->x += deltaX;
+    bmapPtr->y += deltaY;
+    ComputeBitmapBbox(canvasPtr, bmapPtr);
+}
diff --git a/src/tk/tkcvline.c b/src/tk/tkcvline.c
new file mode 100644 (file)
index 0000000..851a176
--- /dev/null
@@ -0,0 +1,1452 @@
+/* 
+ * tkCanvLine.c --
+ *
+ *     This file implements line items for canvas widgets.
+ *
+ * Copyright 1991-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkCanvLine.c,v 1.7 92/07/28 15:40:08 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include <stdio.h>
+#include <math.h>
+#include "tkint.h"
+#include "tkcanvas.h"
+#include "tkconfig.h"
+
+/*
+ * The structure below defines the record for each line item.
+ */
+
+typedef struct LineItem  {
+    Tk_Item header;            /* Generic stuff that's the same for all
+                                * types.  MUST BE FIRST IN STRUCTURE. */
+    Tk_Canvas *canvasPtr;      /* Canvas containing item.  Needed for
+                                * parsing arrow shapes. */
+    int numPoints;             /* Number of points in line (always >= 2). */
+    double *coordPtr;          /* Pointer to malloc-ed array containing
+                                * x- and y-coords of all points in line.
+                                * X-coords are even-valued indices, y-coords
+                                * are corresponding odd-valued indices. */
+    int width;                 /* Width of line. */
+    XColor *fg;                        /* Foreground color for line. */
+    Pixmap fillStipple;                /* Stipple bitmap for filling line. */
+    int capStyle;              /* Cap style for line. */
+    int joinStyle;             /* Join style for line. */
+    GC gc;                     /* Graphics context for filling line. */
+    Tk_Uid arrow;              /* Indicates whether or not to draw arrowheads:
+                                * "none", "first", "last", or "both". */
+    float arrowShapeA;         /* Distance from tip of arrowhead to center. */
+    float arrowShapeB;         /* Distance from tip of arrowhead to trailing
+                                * point, measured along shaft. */
+    float arrowShapeC;         /* Distance of trailing points from outside
+                                * edge of shaft. */
+    double *firstArrowPtr;     /* Points to array of 5 points describing
+                                * polygon for arrowhead at first point in
+                                * line.  First point of arrowhead is tip.
+                                * Malloc'ed.  NULL means no arrowhead at
+                                * first point. */
+    double *lastArrowPtr;      /* Points to polygon for arrowhead at last
+                                * point in line (5 points, first of which
+                                * is tip).  Malloc'ed.  NULL means no
+                                * arrowhead at last point. */
+    int smooth;                        /* Non-zero means draw line smoothed (i.e.
+                                * with Bezier splines). */
+    int splineSteps;           /* Number of steps in each spline segment. */
+} LineItem;
+
+/*
+ * Number of points in an arrowHead:
+ */
+
+#define PTS_IN_ARROW 6
+
+/*
+ * Prototypes for procedures defined in this file:
+ */
+
+static void            ComputeLineBbox _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           LineItem *linePtr));
+static int             ConfigureLine _ANSI_ARGS_((
+                           Tk_Canvas *canvasPtr, Tk_Item *itemPtr, int argc,
+                           char **argv, int flags));
+static int             ConfigureArrows _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           LineItem *linePtr));
+static int             CreateLine _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           struct Tk_Item *itemPtr, int argc, char **argv));
+static void            DeleteLine _ANSI_ARGS_((Tk_Item *itemPtr));
+static void            DisplayLine _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, Drawable dst));
+static int             LineCoords _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, int argc, char **argv));
+static int             LineToArea _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *rectPtr));
+static double          LineToPoint _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *coordPtr));
+static int             ParseArrowShape _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, Tk_Window tkwin, char *value,
+                           char *recordPtr, int offset));
+static char *          PrintArrowShape _ANSI_ARGS_((ClientData clientData,
+                           Tk_Window tkwin, char *recordPtr, int offset,
+                           Tcl_FreeProc **freeProcPtr));
+static void            ScaleLine _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double originX, double originY,
+                           double scaleX, double scaleY));
+static void            TranslateLine _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double deltaX, double deltaY));
+
+/*
+ * Information used for parsing configuration specs.  If you change any
+ * of the default strings, be sure to change the corresponding default
+ * values in CreateLine.
+ */
+
+static Tk_CustomOption arrowShapeOption = {ParseArrowShape,
+       PrintArrowShape, (ClientData) NULL};
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_UID, "-arrow", (char *) NULL, (char *) NULL,
+       "none", Tk_Offset(LineItem, arrow), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_CUSTOM, "-arrowshape", (char *) NULL, (char *) NULL,
+       "8 10 3", Tk_Offset(LineItem, arrowShapeA),
+       TK_CONFIG_DONT_SET_DEFAULT, &arrowShapeOption},
+    {TK_CONFIG_CAP_STYLE, "-capstyle", (char *) NULL, (char *) NULL,
+       "butt", Tk_Offset(LineItem, capStyle), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_COLOR, "-fill", (char *) NULL, (char *) NULL,
+       "black", Tk_Offset(LineItem, fg), 0},
+    {TK_CONFIG_JOIN_STYLE, "-joinstyle", (char *) NULL, (char *) NULL,
+       "round", Tk_Offset(LineItem, joinStyle), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_BOOLEAN, "-smooth", (char *) NULL, (char *) NULL,
+       "no", Tk_Offset(LineItem, smooth), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_INT, "-splinesteps", (char *) NULL, (char *) NULL,
+       "12", Tk_Offset(LineItem, splineSteps), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_BITMAP, "-stipple", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(LineItem, fillStipple), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_CUSTOM, "-tags", (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, TK_CONFIG_NULL_OK, &tkCanvasTagsOption},
+    {TK_CONFIG_PIXELS, "-width", (char *) NULL, (char *) NULL,
+       "1", Tk_Offset(LineItem, width), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * The structures below defines the line item type by means
+ * of procedures that can be invoked by generic item code.
+ */
+
+Tk_ItemType TkLineType = {
+    "line",                            /* name */
+    sizeof(LineItem),                  /* itemSize */
+    CreateLine,                                /* createProc */
+    configSpecs,                       /* configSpecs */
+    ConfigureLine,                     /* configureProc */
+    LineCoords,                                /* coordProc */
+    DeleteLine,                                /* deleteProc */
+    DisplayLine,                       /* displayProc */
+    0,                                 /* alwaysRedraw */
+    LineToPoint,                       /* pointProc */
+    LineToArea,                                /* areaProc */
+    (Tk_ItemPostscriptProc *) NULL,    /* postscriptProc */
+    ScaleLine,                         /* scaleProc */
+    TranslateLine,                     /* translateProc */
+    (Tk_ItemIndexProc *) NULL,         /* indexProc */
+    (Tk_ItemCursorProc *) NULL,                /* cursorProc */
+    (Tk_ItemSelectionProc *) NULL,     /* selectionProc */
+    (Tk_ItemInsertProc *) NULL,                /* insertProc */
+    (Tk_ItemDCharsProc *) NULL,                /* dTextProc */
+    (Tk_ItemType *) NULL               /* nextPtr */
+};
+
+/*
+ * The Tk_Uid's below refer to uids for the various arrow types:
+ */
+
+static Tk_Uid noneUid = NULL;
+static Tk_Uid firstUid = NULL;
+static Tk_Uid lastUid = NULL;
+static Tk_Uid bothUid = NULL;
+
+/*
+ * The definition below determines how large are static arrays
+ * used to hold spline points (splines larger than this have to
+ * have their arrays malloc-ed).
+ */
+
+#define MAX_STATIC_POINTS 200
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CreateLine --
+ *
+ *     This procedure is invoked to create a new line item in
+ *     a canvas.
+ *
+ * Results:
+ *     A standard Tcl return value.  If an error occurred in
+ *     creating the item, then an error message is left in
+ *     canvasPtr->interp->result;  in this case itemPtr is
+ *     left uninitialized, so it can be safely freed by the
+ *     caller.
+ *
+ * Side effects:
+ *     A new line item is created.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+CreateLine(canvasPtr, itemPtr, argc, argv)
+    register Tk_Canvas *canvasPtr;     /* Canvas to hold new item. */
+    Tk_Item *itemPtr;                  /* Record to hold new item;  header
+                                        * has been initialized by caller. */
+    int argc;                          /* Number of arguments in argv. */
+    char **argv;                       /* Arguments describing line. */
+{
+    register LineItem *linePtr = (LineItem *) itemPtr;
+    int i;
+
+    if (argc < 4) {
+       Tcl_AppendResult(canvasPtr->interp, "wrong # args:  should be \"",
+               Tk_PathName(canvasPtr->tkwin),
+               "\" create x1 y1 x2 y2 ?x3 y3 ...? ?options?",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Carry out initialization that is needed to set defaults and to
+     * allow proper cleanup after errors during the the remainder of
+     * this procedure.
+     */
+
+    linePtr->canvasPtr = canvasPtr;
+    linePtr->numPoints = 0;
+    linePtr->coordPtr = NULL;
+    linePtr->width = 1;
+    linePtr->fg = None;
+    linePtr->fillStipple = None;
+    linePtr->capStyle = CapButt;
+    linePtr->joinStyle = JoinRound;
+    linePtr->gc = None;
+    if (noneUid == NULL) {
+       noneUid = Tk_GetUid("none");
+       firstUid = Tk_GetUid("first");
+       lastUid = Tk_GetUid("last");
+       bothUid = Tk_GetUid("both");
+    }
+    linePtr->arrow = noneUid;
+    linePtr->arrowShapeA = 8.0;
+    linePtr->arrowShapeB = 10.0;
+    linePtr->arrowShapeC = 3.0;
+    linePtr->firstArrowPtr = NULL;
+    linePtr->lastArrowPtr = NULL;
+    linePtr->smooth = 0;
+    linePtr->splineSteps = 12;
+
+    /*
+     * Count the number of points and then parse them into a point
+     * array.  Leading arguments are assumed to be points if they
+     * start with a digit or a minus sign followed by a digit.
+     */
+
+    for (i = 4; i < (argc-1); i+=2) {
+       if ((!isdigit(argv[i][0])) &&
+               ((argv[i][0] != '-') || (!isdigit(argv[i][1])))) {
+           break;
+       }
+    }
+    if (LineCoords(canvasPtr, itemPtr, i, argv) != TCL_OK) {
+       goto error;
+    }
+    if (ConfigureLine(canvasPtr, itemPtr, argc-i, argv+i, 0) == TCL_OK) {
+       return TCL_OK;
+    }
+
+    error:
+    DeleteLine(itemPtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * LineCoords --
+ *
+ *     This procedure is invoked to process the "coords" widget
+ *     command on lines.  See the user documentation for details
+ *     on what it does.
+ *
+ * Results:
+ *     Returns TCL_OK or TCL_ERROR, and sets canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     The coordinates for the given item may be changed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+LineCoords(canvasPtr, itemPtr, argc, argv)
+    register Tk_Canvas *canvasPtr;     /* Canvas containing item. */
+    Tk_Item *itemPtr;                  /* Item whose coordinates are to be
+                                        * read or modified. */
+    int argc;                          /* Number of coordinates supplied in
+                                        * argv. */
+    char **argv;                       /* Array of coordinates: x1, y1,
+                                        * x2, y2, ... */
+{
+    register LineItem *linePtr = (LineItem *) itemPtr;
+    char buffer[300];
+    int i, numPoints;
+
+    if (argc == 0) {
+       for (i = 0; i < 2*linePtr->numPoints; i++) {
+           sprintf(buffer, "%g", linePtr->coordPtr[i]);
+           Tcl_AppendElement(canvasPtr->interp, buffer, 0);
+       }
+    } else if (argc < 4) {
+       Tcl_AppendResult(canvasPtr->interp,
+               "too few coordinates for line:  must have at least 4",
+               (char *) NULL);
+       return TCL_ERROR;
+    } else if (argc & 1) {
+       Tcl_AppendResult(canvasPtr->interp,
+               "odd number of coordinates specified for line",
+               (char *) NULL);
+       return TCL_ERROR;
+    } else {
+       numPoints = argc/2;
+       if (linePtr->numPoints != numPoints) {
+           if (linePtr->coordPtr != NULL) {
+               ckfree((char *) linePtr->coordPtr);
+           }
+           linePtr->coordPtr = (double *) ckalloc((unsigned)
+                   (sizeof(double) * argc));
+           linePtr->numPoints = numPoints;
+       }
+       for (i = argc-1; i >= 0; i--) {
+           if (TkGetCanvasCoord(canvasPtr, argv[i], &linePtr->coordPtr[i])
+                   != TCL_OK) {
+               return TCL_ERROR;
+           }
+       }
+       ComputeLineBbox(canvasPtr, linePtr);
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ConfigureLine --
+ *
+ *     This procedure is invoked to configure various aspects
+ *     of a line item such as its background color.
+ *
+ * Results:
+ *     A standard Tcl result code.  If an error occurs, then
+ *     an error message is left in canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     Configuration information, such as colors and stipple
+ *     patterns, may be set for itemPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ConfigureLine(canvasPtr, itemPtr, argc, argv, flags)
+    Tk_Canvas *canvasPtr;      /* Canvas containing itemPtr. */
+    Tk_Item *itemPtr;          /* Line item to reconfigure. */
+    int argc;                  /* Number of elements in argv.  */
+    char **argv;               /* Arguments describing things to configure. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    register LineItem *linePtr = (LineItem *) itemPtr;
+    XGCValues gcValues;
+    GC newGC;
+    unsigned long mask;
+
+    if (Tk_ConfigureWidget(canvasPtr->interp, canvasPtr->tkwin,
+           configSpecs, argc, argv, (char *) linePtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few of the options require additional processing, such as
+     * graphics contexts.
+     */
+
+    if (linePtr->fg == NULL) {
+       newGC = None;
+    } else {
+       gcValues.foreground = linePtr->fg->pixel;
+       gcValues.join_style = linePtr->joinStyle;
+       if (linePtr->width < 0) {
+           linePtr->width = 1;
+       }
+       gcValues.line_width = linePtr->width;
+       mask = GCForeground|GCJoinStyle|GCLineWidth;
+       if (linePtr->fillStipple != None) {
+           gcValues.stipple = linePtr->fillStipple;
+           gcValues.fill_style = FillStippled;
+           mask |= GCStipple|GCFillStyle;
+       }
+       if (linePtr->arrow == noneUid) {
+           gcValues.cap_style = linePtr->capStyle;
+           mask |= GCCapStyle;
+       }
+       newGC = Tk_GetGC(canvasPtr->tkwin, mask, &gcValues);
+    }
+    if (linePtr->gc != None) {
+       Tk_FreeGC(linePtr->gc);
+    }
+    linePtr->gc = newGC;
+
+    /*
+     * Keep spline parameters within reasonable limits.
+     */
+
+    if (linePtr->splineSteps < 1) {
+       linePtr->splineSteps = 1;
+    } else if (linePtr->splineSteps > 100) {
+       linePtr->splineSteps = 100;
+    }
+
+    /*
+     * Setup arrowheads, if needed.  If arrowheads are turned off,
+     * restore the line's endpoints (they were shortened when the
+     * arrowheads were added).
+     */
+
+    if ((linePtr->firstArrowPtr != NULL) && (linePtr->arrow != firstUid)
+           && (linePtr->arrow != bothUid)) {
+       linePtr->coordPtr[0] = linePtr->firstArrowPtr[0];
+       linePtr->coordPtr[1] = linePtr->firstArrowPtr[1];
+       ckfree((char *) linePtr->firstArrowPtr);
+       linePtr->firstArrowPtr = NULL;
+    }
+    if ((linePtr->lastArrowPtr != NULL) && (linePtr->arrow != lastUid)
+           && (linePtr->arrow != bothUid)) {
+       int index;
+
+       index = 2*(linePtr->numPoints-1);
+       linePtr->coordPtr[index] = linePtr->lastArrowPtr[0];
+       linePtr->coordPtr[index+1] = linePtr->lastArrowPtr[1];
+       ckfree((char *) linePtr->lastArrowPtr);
+       linePtr->lastArrowPtr = NULL;
+    }
+    if (linePtr->arrow != noneUid) {
+       if ((linePtr->arrow != firstUid) && (linePtr->arrow != lastUid)
+               && (linePtr->arrow != bothUid)) {
+           Tcl_AppendResult(canvasPtr->interp, "bad arrow spec \"",
+                   linePtr->arrow, "\": must be none, first, last, or both",
+                   (char *) NULL);
+           linePtr->arrow = noneUid;
+           return TCL_ERROR;
+       }
+       ConfigureArrows(canvasPtr, linePtr);
+    }
+
+    /*
+     * Recompute bounding box for line.
+     */
+
+    ComputeLineBbox(canvasPtr, linePtr);
+
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DeleteLine --
+ *
+ *     This procedure is called to clean up the data structure
+ *     associated with a line item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Resources associated with itemPtr are released.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DeleteLine(itemPtr)
+    Tk_Item *itemPtr;                  /* Item that is being deleted. */
+{
+    register LineItem *linePtr = (LineItem *) itemPtr;
+
+    if (linePtr->coordPtr != NULL) {
+       ckfree((char *) linePtr->coordPtr);
+    }
+    if (linePtr->fg != NULL) {
+       Tk_FreeColor(linePtr->fg);
+    }
+    if (linePtr->fillStipple != None) {
+       Tk_FreeBitmap(linePtr->fillStipple);
+    }
+    if (linePtr->gc != None) {
+       Tk_FreeGC(linePtr->gc);
+    }
+    if (linePtr->firstArrowPtr != NULL) {
+       ckfree((char *) linePtr->firstArrowPtr);
+    }
+    if (linePtr->lastArrowPtr != NULL) {
+       ckfree((char *) linePtr->lastArrowPtr);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ComputeLineBbox --
+ *
+ *     This procedure is invoked to compute the bounding box of
+ *     all the pixels that may be drawn as part of a line.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The fields x1, y1, x2, and y2 are updated in the header
+ *     for itemPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ComputeLineBbox(canvasPtr, linePtr)
+    register Tk_Canvas *canvasPtr;     /* Canvas that contains item. */
+    LineItem *linePtr;                 /* Item whose bbos is to be
+                                        * recomputed. */
+{
+    register double *coordPtr;
+    int i;
+
+    coordPtr = linePtr->coordPtr;
+    linePtr->header.x1 = linePtr->header.x2 = *coordPtr;
+    linePtr->header.y1 = linePtr->header.y2 = coordPtr[1];
+
+    /*
+     * Compute the bounding box of all the points in the line,
+     * then expand in all directions by the line's width to take
+     * care of butting or rounded corners and projecting or
+     * rounded caps.  This expansion is an overestimate (worst-case
+     * is square root of two over two) but it's simple.  Don't do
+     * anything special for curves.  This causes an additional
+     * overestimate in the bounding box, but is faster.
+     */
+
+    for (i = 1, coordPtr = linePtr->coordPtr+2; i < linePtr->numPoints;
+           i++, coordPtr += 2) {
+       TkIncludePoint(canvasPtr, (Tk_Item *) linePtr, coordPtr);
+    }
+    linePtr->header.x1 -= linePtr->width;
+    linePtr->header.x2 += linePtr->width;
+    linePtr->header.y1 -= linePtr->width;
+    linePtr->header.y2 += linePtr->width;
+
+    /*
+     * For mitered lines, make a second pass through all the points.
+     * Compute the locations of the two miter vertex points and add
+     * those into the bounding box.
+     */
+
+    if (linePtr->joinStyle == JoinMiter) {
+       for (i = linePtr->numPoints, coordPtr = linePtr->coordPtr; i >= 3;
+               i--, coordPtr += 2) {
+           double miter[4];
+           int j;
+    
+           if (TkGetMiterPoints(coordPtr, coordPtr+2, coordPtr+4,
+                   (double) linePtr->width, miter, miter+2)) {
+               for (j = 0; j < 4; j += 2) {
+                   TkIncludePoint(canvasPtr, (Tk_Item *) linePtr, miter+j);
+               }
+           }
+       }
+    }
+
+    /*
+     * Add in the sizes of arrowheads, if any.
+     */
+
+    if (linePtr->arrow != noneUid) {
+       if (linePtr->arrow != lastUid) {
+           for (i = 0, coordPtr = linePtr->firstArrowPtr; i < PTS_IN_ARROW;
+                   i++, coordPtr += 2) {
+               TkIncludePoint(canvasPtr, (Tk_Item *) linePtr, coordPtr);
+           }
+       }
+       if (linePtr->arrow != firstUid) {
+           for (i = 0, coordPtr = linePtr->lastArrowPtr; i < PTS_IN_ARROW;
+                   i++, coordPtr += 2) {
+               TkIncludePoint(canvasPtr, (Tk_Item *) linePtr, coordPtr);
+           }
+       }
+    }
+
+    /*
+     * Add one more pixel of fudge factor just to be safe (e.g.
+     * X may round differently than we do).
+     */
+
+    linePtr->header.x1 -= 1;
+    linePtr->header.x2 += 1;
+    linePtr->header.y1 -= 1;
+    linePtr->header.y2 += 1;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayLine --
+ *
+ *     This procedure is invoked to draw a line item in a given
+ *     drawable.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     ItemPtr is drawn in drawable using the transformation
+ *     information in canvasPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayLine(canvasPtr, itemPtr, drawable)
+    register Tk_Canvas *canvasPtr;     /* Canvas that contains item. */
+    Tk_Item *itemPtr;                  /* Item to be displayed. */
+    Drawable drawable;                 /* Pixmap or window in which to draw
+                                        * item. */
+{
+    register LineItem *linePtr = (LineItem *) itemPtr;
+    XPoint staticPoints[MAX_STATIC_POINTS];
+    XPoint *pointPtr;
+    register XPoint *pPtr;
+    register double *coordPtr;
+    int i, numPoints;
+
+    if (linePtr->gc == None) {
+       return;
+    }
+
+    /*
+     * Build up an array of points in screen coordinates.  Use a
+     * static array unless the line has an enormous number of points;
+     * in this case, dynamically allocate an array.  For smoothed lines,
+     * generate the curve points on each redisplay.
+     */
+
+    if ((linePtr->smooth) && (linePtr->numPoints > 2)) {
+       numPoints = 1 + linePtr->numPoints*linePtr->splineSteps;
+    } else {
+       numPoints = linePtr->numPoints;
+    }
+
+    if (numPoints <= MAX_STATIC_POINTS) {
+       pointPtr = staticPoints;
+    } else {
+       pointPtr = (XPoint *) ckalloc((unsigned) (numPoints * sizeof(XPoint)));
+    }
+
+    if (linePtr->smooth) {
+       numPoints = TkMakeBezierCurve(canvasPtr, linePtr->coordPtr,
+               linePtr->numPoints, linePtr->splineSteps, pointPtr,
+               (double *) NULL);
+    } else {
+       for (i = 0, coordPtr = linePtr->coordPtr, pPtr = pointPtr;
+               i < linePtr->numPoints;  i += 1, coordPtr += 2, pPtr++) {
+           pPtr->x = SCREEN_X(canvasPtr, *coordPtr);
+           pPtr->y = SCREEN_Y(canvasPtr, coordPtr[1]);
+       }
+    }
+
+    /*
+     * Display line, the free up line storage if it was dynamically
+     * allocated.
+     */
+
+    XDrawLines(Tk_Display(canvasPtr->tkwin), drawable, linePtr->gc,
+           pointPtr, numPoints, CoordModeOrigin);
+    if (pointPtr != staticPoints) {
+       ckfree((char *) pointPtr);
+    }
+
+    /*
+     * Display arrowheads, if they are wanted.
+     */
+
+    if (linePtr->arrow != noneUid) {
+       if (linePtr->arrow != lastUid) {
+           TkFillPolygon(canvasPtr, linePtr->firstArrowPtr, PTS_IN_ARROW,
+                   drawable, linePtr->gc);
+       }
+       if (linePtr->arrow != firstUid) {
+           TkFillPolygon(canvasPtr, linePtr->lastArrowPtr, PTS_IN_ARROW,
+                   drawable, linePtr->gc);
+       }
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * LineToPoint --
+ *
+ *     Computes the distance from a given point to a given
+ *     line, in canvas units.
+ *
+ * Results:
+ *     The return value is 0 if the point whose x and y coordinates
+ *     are pointPtr[0] and pointPtr[1] is inside the line.  If the
+ *     point isn't inside the line then the return value is the
+ *     distance from the point to the line.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static double
+LineToPoint(canvasPtr, itemPtr, pointPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item to check against point. */
+    double *pointPtr;          /* Pointer to x and y coordinates. */
+{
+    register LineItem *linePtr = (LineItem *) itemPtr;
+    register double *coordPtr, *linePoints;
+    double staticSpace[2*MAX_STATIC_POINTS];
+    double poly[10];
+    double bestDist, dist;
+    int numPoints, count;
+    int changedMiterToBevel;   /* Non-zero means that a mitered corner
+                                * had to be treated as beveled after all
+                                * because the angle was < 11 degrees. */
+
+    bestDist = 1.0e40;
+
+    /*
+     * Handle smoothed lines by generating an expanded set of points
+     * against which to do the check.
+     */
+
+    if ((linePtr->smooth) && (linePtr->numPoints > 2)) {
+       numPoints = 1 + linePtr->numPoints*linePtr->splineSteps;
+       if (numPoints <= MAX_STATIC_POINTS) {
+           linePoints = staticSpace;
+       } else {
+           linePoints = (double *) ckalloc((unsigned)
+                   (2*numPoints*sizeof(double)));
+       }
+       numPoints = TkMakeBezierCurve(canvasPtr, linePtr->coordPtr,
+               linePtr->numPoints, linePtr->splineSteps, (XPoint *) NULL,
+               linePoints);
+    } else {
+       numPoints = linePtr->numPoints;
+       linePoints = linePtr->coordPtr;
+    }
+
+    /*
+     * The overall idea is to iterate through all of the edges of
+     * the line, computing a polygon for each edge and testing the
+     * point against that polygon.  In addition, there are additional
+     * tests to deal with rounded joints and caps.
+     */
+
+    changedMiterToBevel = 0;
+    for (count = numPoints, coordPtr = linePoints; count >= 2;
+           count--, coordPtr += 2) {
+
+       /*
+        * If rounding is done around the first point then compute
+        * the distance between the point and the point.
+        */
+
+       if (((linePtr->capStyle == CapRound) && (count == numPoints))
+               || ((linePtr->joinStyle == JoinRound)
+                       && (count != numPoints))) {
+           dist = hypot(coordPtr[0] - pointPtr[0], coordPtr[1] - pointPtr[1])
+                   - linePtr->width/2.0;
+           if (dist <= 0.0) {
+               bestDist = 0.0;
+               goto done;
+           } else if (dist < bestDist) {
+               bestDist = dist;
+           }
+       }
+
+       /*
+        * Compute the polygonal shape corresponding to this edge,
+        * consisting of two points for the first point of the edge
+        * and two points for the last point of the edge.
+        */
+
+       if (count == numPoints) {
+           TkGetButtPoints(coordPtr+2, coordPtr, (double) linePtr->width,
+                   linePtr->capStyle == CapProjecting, poly, poly+2);
+       } else if ((linePtr->joinStyle == JoinMiter) && !changedMiterToBevel) {
+           poly[0] = poly[6];
+           poly[1] = poly[7];
+           poly[2] = poly[4];
+           poly[3] = poly[5];
+       } else {
+           TkGetButtPoints(coordPtr+2, coordPtr, (double) linePtr->width, 0,
+                   poly, poly+2);
+
+           /*
+            * If this line uses beveled joints, then check the distance
+            * to a polygon comprising the last two points of the previous
+            * polygon and the first two from this polygon;  this checks
+            * the wedges that fill the mitered joint.
+            */
+
+           if ((linePtr->joinStyle == JoinBevel) || changedMiterToBevel) {
+               poly[8] = poly[0];
+               poly[9] = poly[1];
+               dist = TkPolygonToPoint(poly, 5, pointPtr);
+               if (dist <= 0.0) {
+                   bestDist = 0.0;
+                   goto done;
+               } else if (dist < bestDist) {
+                   bestDist = dist;
+               }
+               changedMiterToBevel = 0;
+           }
+       }
+       if (count == 2) {
+           TkGetButtPoints(coordPtr, coordPtr+2, (double) linePtr->width,
+                   linePtr->capStyle == CapProjecting, poly+4, poly+6);
+       } else if (linePtr->joinStyle == JoinMiter) {
+           if (TkGetMiterPoints(coordPtr, coordPtr+2, coordPtr+4,
+                   (double) linePtr->width, poly+4, poly+6) == 0) {
+               changedMiterToBevel = 1;
+               TkGetButtPoints(coordPtr, coordPtr+2, (double) linePtr->width,
+                       0, poly+4, poly+6);
+           }
+       } else {
+           TkGetButtPoints(coordPtr, coordPtr+2, (double) linePtr->width, 0,
+                   poly+4, poly+6);
+       }
+       poly[8] = poly[0];
+       poly[9] = poly[1];
+       dist = TkPolygonToPoint(poly, 5, pointPtr);
+       if (dist <= 0.0) {
+           bestDist = 0.0;
+           goto done;
+       } else if (dist < bestDist) {
+           bestDist = dist;
+       }
+    }
+
+    /*
+     * If caps are rounded, check the distance to the cap around the
+     * final end point of the line.
+     */
+
+    if (linePtr->capStyle == CapRound) {
+       dist = hypot(coordPtr[0] - pointPtr[0], coordPtr[1] - pointPtr[1])
+               - linePtr->width/2.0;
+       if (dist <= 0.0) {
+           bestDist = 0.0;
+           goto done;
+       } else if (dist < bestDist) {
+           bestDist = dist;
+       }
+    }
+
+    /*
+     * If there are arrowheads, check the distance to the arrowheads.
+     */
+
+    if (linePtr->arrow != noneUid) {
+       if (linePtr->arrow != lastUid) {
+           dist = TkPolygonToPoint(linePtr->firstArrowPtr, PTS_IN_ARROW,
+                   pointPtr);
+           if (dist <= 0.0) {
+               bestDist = 0.0;
+               goto done;
+           } else if (dist < bestDist) {
+               bestDist = dist;
+           }
+       }
+       if (linePtr->arrow != firstUid) {
+           dist = TkPolygonToPoint(linePtr->lastArrowPtr, PTS_IN_ARROW,
+                   pointPtr);
+           if (dist <= 0.0) {
+               bestDist = 0.0;
+               goto done;
+           } else if (dist < bestDist) {
+               bestDist = dist;
+           }
+       }
+    }
+
+    done:
+    if ((linePoints != staticSpace) && (linePoints != linePtr->coordPtr)) {
+       ckfree((char *) linePoints);
+    }
+    return bestDist;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * LineToArea --
+ *
+ *     This procedure is called to determine whether an item
+ *     lies entirely inside, entirely outside, or overlapping
+ *     a given rectangular area.
+ *
+ * Results:
+ *     -1 is returned if the item is entirely outside the
+ *     area, 0 if it overlaps, and 1 if it is entirely
+ *     inside the given area.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static int
+LineToArea(canvasPtr, itemPtr, rectPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item to check against line. */
+    double *rectPtr;
+{
+    register LineItem *linePtr = (LineItem *) itemPtr;
+    register double *coordPtr;
+    double staticSpace[2*MAX_STATIC_POINTS];
+    double *linePoints, poly[10];
+    double radius;
+    int numPoints, count;
+    int changedMiterToBevel;   /* Non-zero means that a mitered corner
+                                * had to be treated as beveled after all
+                                * because the angle was < 11 degrees. */
+    int inside;                        /* Tentative guess about what to return,
+                                * based on all points seen so far:  one
+                                * means everything seen so far was
+                                * inside the area;  -1 means everything
+                                * was outside the area.  0 means overlap
+                                * has been found. */ 
+
+    radius = linePtr->width/2.0;
+    inside = -1;
+
+    /*
+     * Handle smoothed lines by generating an expanded set of points
+     * against which to do the check.
+     */
+
+    if ((linePtr->smooth) && (linePtr->numPoints > 2)) {
+       numPoints = 1 + linePtr->numPoints*linePtr->splineSteps;
+       if (numPoints <= MAX_STATIC_POINTS) {
+           linePoints = staticSpace;
+       } else {
+           linePoints = (double *) ckalloc((unsigned)
+                   (2*numPoints*sizeof(double)));
+       }
+       numPoints = TkMakeBezierCurve(canvasPtr, linePtr->coordPtr,
+               linePtr->numPoints, linePtr->splineSteps, (XPoint *) NULL,
+               linePoints);
+    } else {
+       numPoints = linePtr->numPoints;
+       linePoints = linePtr->coordPtr;
+    }
+
+    coordPtr = linePoints;
+    if ((coordPtr[0] >= rectPtr[0]) && (coordPtr[0] <= rectPtr[2])
+           && (coordPtr[1] >= rectPtr[1]) && (coordPtr[1] <= rectPtr[3])) {
+       inside = 1;
+    }
+
+    /*
+     * Iterate through all of the edges of the line, computing a polygon
+     * for each edge and testing the area against that polygon.  In
+     * addition, there are additional tests to deal with rounded joints
+     * and caps.
+     */
+
+    changedMiterToBevel = 0;
+    for (count = numPoints; count >= 2; count--, coordPtr += 2) {
+
+       /*
+        * If rounding is done around the first point of the edge
+        * then test a circular region around the point with the
+        * area.
+        */
+
+       if (((linePtr->capStyle == CapRound) && (count == numPoints))
+               || ((linePtr->joinStyle == JoinRound)
+               && (count != numPoints))) {
+           poly[0] = coordPtr[0] - radius;
+           poly[1] = coordPtr[1] - radius;
+           poly[2] = coordPtr[0] + radius;
+           poly[3] = coordPtr[1] + radius;
+           if (TkOvalToArea(poly, rectPtr) != inside) {
+               inside = 0;
+               goto done;
+           }
+       }
+
+       /*
+        * Compute the polygonal shape corresponding to this edge,
+        * consisting of two points for the first point of the edge
+        * and two points for the last point of the edge.
+        */
+
+       if (count == numPoints) {
+           TkGetButtPoints(coordPtr+2, coordPtr, (double) linePtr->width,
+                   linePtr->capStyle == CapProjecting, poly, poly+2);
+       } else if ((linePtr->joinStyle == JoinMiter) && !changedMiterToBevel) {
+           poly[0] = poly[6];
+           poly[1] = poly[7];
+           poly[2] = poly[4];
+           poly[3] = poly[5];
+       } else {
+           TkGetButtPoints(coordPtr+2, coordPtr, (double) linePtr->width, 0,
+                   poly, poly+2);
+
+           /*
+            * If the last joint was beveled, then also check a
+            * polygon comprising the last two points of the previous
+            * polygon and the first two from this polygon;  this checks
+            * the wedges that fill the beveled joint.
+            */
+
+           if ((linePtr->joinStyle == JoinBevel) || changedMiterToBevel) {
+               poly[8] = poly[0];
+               poly[9] = poly[1];
+               if (TkPolygonToArea(poly, 5, rectPtr) != inside) {
+                   inside = 0;
+                   goto done;
+               }
+               changedMiterToBevel = 0;
+           }
+       }
+       if (count == 2) {
+           TkGetButtPoints(coordPtr, coordPtr+2, (double) linePtr->width,
+                   linePtr->capStyle == CapProjecting, poly+4, poly+6);
+       } else if (linePtr->joinStyle == JoinMiter) {
+           if (TkGetMiterPoints(coordPtr, coordPtr+2, coordPtr+4,
+                   (double) linePtr->width, poly+4, poly+6) == 0) {
+               changedMiterToBevel = 1;
+               TkGetButtPoints(coordPtr, coordPtr+2, (double) linePtr->width,
+                       0, poly+4, poly+6);
+           }
+       } else {
+           TkGetButtPoints(coordPtr, coordPtr+2, (double) linePtr->width, 0,
+                   poly+4, poly+6);
+       }
+       poly[8] = poly[0];
+       poly[9] = poly[1];
+       if (TkPolygonToArea(poly, 5, rectPtr) != inside) {
+           inside = 0;
+           goto done;
+       }
+    }
+
+    /*
+     * If caps are rounded, check the cap around the final point
+     * of the line.
+     */
+
+    if (linePtr->capStyle == CapRound) {
+       poly[0] = coordPtr[0] - radius;
+       poly[1] = coordPtr[1] - radius;
+       poly[2] = coordPtr[0] + radius;
+       poly[3] = coordPtr[1] + radius;
+       if (TkOvalToArea(poly, rectPtr) != inside) {
+           inside = 0;
+           goto done;
+       }
+    }
+
+    /*
+     * Check arrowheads, if any.
+     */
+
+    if (linePtr->arrow != noneUid) {
+       if (linePtr->arrow != lastUid) {
+           if (TkPolygonToArea(linePtr->firstArrowPtr, PTS_IN_ARROW,
+                   rectPtr) != inside) {
+               inside = 0;
+               goto done;
+           }
+       }
+       if (linePtr->arrow != firstUid) {
+           if (TkPolygonToArea(linePtr->lastArrowPtr, PTS_IN_ARROW,
+                   rectPtr) != inside) {
+               inside = 0;
+               goto done;
+           }
+       }
+    }
+
+    done:
+    if ((linePoints != staticSpace) && (linePoints != linePtr->coordPtr)) {
+       ckfree((char *) linePoints);
+    }
+    return inside;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScaleLine --
+ *
+ *     This procedure is invoked to rescale a line item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The line referred to by itemPtr is rescaled so that the
+ *     following transformation is applied to all point
+ *     coordinates:
+ *             x' = originX + scaleX*(x-originX)
+ *             y' = originY + scaleY*(y-originY)
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ScaleLine(canvasPtr, itemPtr, originX, originY, scaleX, scaleY)
+    Tk_Canvas *canvasPtr;              /* Canvas containing line. */
+    Tk_Item *itemPtr;                  /* Line to be scaled. */
+    double originX, originY;           /* Origin about which to scale rect. */
+    double scaleX;                     /* Amount to scale in X direction. */
+    double scaleY;                     /* Amount to scale in Y direction. */
+{
+    LineItem *linePtr = (LineItem *) itemPtr;
+    register double *coordPtr;
+    int i;
+
+    for (i = 0, coordPtr = linePtr->coordPtr; i < linePtr->numPoints;
+           i++, coordPtr += 2) {
+       coordPtr[0] = originX + scaleX*(*coordPtr - originX);
+       coordPtr[1] = originY + scaleY*(coordPtr[1] - originY);
+    }
+    if (linePtr->firstArrowPtr != NULL) {
+       for (i = 0, coordPtr = linePtr->firstArrowPtr; i < PTS_IN_ARROW;
+               i++, coordPtr += 2) {
+           coordPtr[0] = originX + scaleX*(coordPtr[0] - originX);
+           coordPtr[1] = originY + scaleY*(coordPtr[1] - originY);
+       }
+    }
+    if (linePtr->lastArrowPtr != NULL) {
+       for (i = 0, coordPtr = linePtr->lastArrowPtr; i < PTS_IN_ARROW;
+               i++, coordPtr += 2) {
+           coordPtr[0] = originX + scaleX*(coordPtr[0] - originX);
+           coordPtr[1] = originY + scaleY*(coordPtr[1] - originY);
+       }
+    }
+    ComputeLineBbox(canvasPtr, linePtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TranslateLine --
+ *
+ *     This procedure is called to move a line by a given amount.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The position of the line is offset by (xDelta, yDelta), and
+ *     the bounding box is updated in the generic part of the item
+ *     structure.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+TranslateLine(canvasPtr, itemPtr, deltaX, deltaY)
+    Tk_Canvas *canvasPtr;              /* Canvas containing item. */
+    Tk_Item *itemPtr;                  /* Item that is being moved. */
+    double deltaX, deltaY;             /* Amount by which item is to be
+                                        * moved. */
+{
+    LineItem *linePtr = (LineItem *) itemPtr;
+    register double *coordPtr;
+    int i;
+
+    for (i = 0, coordPtr = linePtr->coordPtr; i < linePtr->numPoints;
+           i++, coordPtr += 2) {
+       coordPtr[0] += deltaX;
+       coordPtr[1] += deltaY;
+    }
+    if (linePtr->firstArrowPtr != NULL) {
+       for (i = 0, coordPtr = linePtr->firstArrowPtr; i < PTS_IN_ARROW;
+               i++, coordPtr += 2) {
+           coordPtr[0] += deltaX;
+           coordPtr[1] += deltaY;
+       }
+    }
+    if (linePtr->lastArrowPtr != NULL) {
+       for (i = 0, coordPtr = linePtr->lastArrowPtr; i < PTS_IN_ARROW;
+               i++, coordPtr += 2) {
+           coordPtr[0] += deltaX;
+           coordPtr[1] += deltaY;
+       }
+    }
+    ComputeLineBbox(canvasPtr, linePtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ParseArrowShape --
+ *
+ *     This procedure is called back during option parsing to
+ *     parse arrow shape information.
+ *
+ * Results:
+ *     The return value is a standard Tcl result:  TCL_OK means
+ *     that the arrow shape information was parsed ok, and
+ *     TCL_ERROR means it couldn't be parsed.
+ *
+ * Side effects:
+ *     Arrow information in recordPtr is updated.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static int
+ParseArrowShape(clientData, interp, tkwin, value, recordPtr, offset)
+    ClientData clientData;     /* Not used. */
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    Tk_Window tkwin;           /* Not used. */
+    char *value;               /* Textual specification of arrow shape. */
+    char *recordPtr;           /* Pointer to item record in which to
+                                * store arrow information. */
+    int offset;                        /* Offset of shape information in widget
+                                * record. */
+{
+    LineItem *linePtr = (LineItem *) recordPtr;
+    double a, b, c;
+    int argc;
+    char **argv = NULL;
+
+    if (offset != Tk_Offset(LineItem, arrowShapeA)) {
+       panic("ParseArrowShape received bogus offset");
+    }
+
+    if (Tcl_SplitList(interp, value, &argc, &argv) != TCL_OK) {
+       syntaxError:
+       Tcl_ResetResult(interp);
+       Tcl_AppendResult(interp, "bad arrow shape \"", value,
+               "\": must be list with three numbers", (char *) NULL);
+       if (argv != NULL) {
+           ckfree((char *) argv);
+       }
+       return TCL_ERROR;
+    }
+    if (argc != 3) {
+       goto syntaxError;
+    }
+    if ((TkGetCanvasCoord(linePtr->canvasPtr, argv[0], &a) != TCL_OK)
+           || (TkGetCanvasCoord(linePtr->canvasPtr, argv[1], &b) != TCL_OK)
+           || (TkGetCanvasCoord(linePtr->canvasPtr, argv[2], &c) != TCL_OK)) {
+       goto syntaxError;
+    }
+    linePtr->arrowShapeA = a;
+    linePtr->arrowShapeB = b;
+    linePtr->arrowShapeC = c;
+    ckfree((char *) argv);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * PrintArrowShape --
+ *
+ *     This procedure is a callback invoked by the configuration
+ *     code to return a printable value describing an arrow shape.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+    /* ARGSUSED */
+static char *
+PrintArrowShape(clientData, tkwin, recordPtr, offset, freeProcPtr)
+    ClientData clientData;     /* Not used. */
+    Tk_Window tkwin;           /* Window associated with linePtr's widget. */
+    char *recordPtr;           /* Pointer to item record containing current
+                                * shape information. */
+    int offset;                        /* Offset of arrow information in record. */
+    Tcl_FreeProc **freeProcPtr;        /* Store address of procedure to call to
+                                * free string here. */
+{
+    LineItem *linePtr = (LineItem *) recordPtr;
+    char *buffer;
+
+    buffer = ckalloc(120);
+    sprintf(buffer, "%.5g %.5g %.5g", linePtr->arrowShapeA,
+           linePtr->arrowShapeB, linePtr->arrowShapeC);
+    *freeProcPtr = (Tcl_FreeProc *) free;
+    return buffer;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ConfigureArrows --
+ *
+ *     If arrowheads have been requested for a line, this
+ *     procedure makes arrangements for the arrowheads.
+ *
+ * Results:
+ *     A standard Tcl return value.  If an error occurs, then
+ *     an error message is left in canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     Information in linePtr is set up for one or two arrowheads.
+ *     the firstArrowPtr and lastArrowPtr polygons are allocated
+ *     and initialized, if need be, and the end points of the line
+ *     are adjusted so that a thick line doesn't stick out past
+ *     the arrowheads.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static int
+ConfigureArrows(canvasPtr, linePtr)
+    Tk_Canvas *canvasPtr;              /* Canvas in which arrows will be
+                                        * displayed (interp and tkwin
+                                        * fields are needed). */
+    register LineItem *linePtr;                /* Item to configure for arrows. */
+{
+    double *poly, *coordPtr;
+    double dx, dy, length, sinTheta, cosTheta, temp, shapeC;
+    double fracHeight;                 /* Line width as fraction of
+                                        * arrowhead width. */
+    double backup;                     /* Distance to backup end points
+                                        * so the line ends in the middle
+                                        * of the arrowhead. */
+    double vertX, vertY;               /* Position of arrowhead vertex. */
+
+    /*
+     * If there's an arrowhead on the first point of the line, compute
+     * its polygon and adjust the first point of the line so that the
+     * line doesn't stick out past the leading edge of the arrowhead.
+     */
+
+    shapeC = linePtr->arrowShapeC + linePtr->width/2.0;
+    fracHeight = (linePtr->width/2.0)/shapeC;
+    backup = fracHeight*linePtr->arrowShapeB
+           + linePtr->arrowShapeA*(1.0 - fracHeight)/2.0;
+    if (linePtr->arrow != lastUid) {
+       poly = linePtr->firstArrowPtr;
+       if (poly == NULL) {
+           poly = (double *) ckalloc((unsigned)
+                   (2*PTS_IN_ARROW*sizeof(double)));
+           poly[0] = poly[10] = linePtr->coordPtr[0];
+           poly[1] = poly[11] = linePtr->coordPtr[1];
+           linePtr->firstArrowPtr = poly;
+       }
+       dx = poly[0] - linePtr->coordPtr[2];
+       dy = poly[1] - linePtr->coordPtr[3];
+       length = hypot(dx, dy);
+       if (length == 0) {
+           sinTheta = cosTheta = 0.0;
+       } else {
+           sinTheta = dy/length;
+           cosTheta = dx/length;
+       }
+       vertX = poly[0] - linePtr->arrowShapeA*cosTheta;
+       vertY = poly[1] - linePtr->arrowShapeA*sinTheta;
+       temp = shapeC*sinTheta;
+       poly[2] = poly[0] - linePtr->arrowShapeB*cosTheta + temp;
+       poly[8] = poly[2] - 2*temp;
+       temp = shapeC*cosTheta;
+       poly[3] = poly[1] - linePtr->arrowShapeB*sinTheta - temp;
+       poly[9] = poly[3] + 2*temp;
+       poly[4] = poly[2]*fracHeight + vertX*(1.0-fracHeight);
+       poly[5] = poly[3]*fracHeight + vertY*(1.0-fracHeight);
+       poly[6] = poly[8]*fracHeight + vertX*(1.0-fracHeight);
+       poly[7] = poly[9]*fracHeight + vertY*(1.0-fracHeight);
+
+       /*
+        * Polygon done.  Now move the first point towards the second so
+        * that the corners at the end of the line are inside the
+        * arrowhead.
+        */
+
+       linePtr->coordPtr[0] = poly[0] - backup*cosTheta;
+       linePtr->coordPtr[1] = poly[1] - backup*sinTheta;
+    }
+
+    /*
+     * Similar arrowhead calculation for the last point of the line.
+     */
+
+    if (linePtr->arrow != firstUid) {
+       coordPtr = linePtr->coordPtr + 2*(linePtr->numPoints-2);
+       poly = linePtr->lastArrowPtr;
+       if (poly == NULL) {
+           poly = (double *) ckalloc((unsigned)
+                   (2*PTS_IN_ARROW*sizeof(double)));
+           poly[0] = poly[10] = coordPtr[2];
+           poly[1] = poly[11] = coordPtr[3];
+           linePtr->lastArrowPtr = poly;
+       }
+       dx = poly[0] - coordPtr[0];
+       dy = poly[1] - coordPtr[1];
+       length = hypot(dx, dy);
+       if (length == 0) {
+           sinTheta = cosTheta = 0.0;
+       } else {
+           sinTheta = dy/length;
+           cosTheta = dx/length;
+       }
+       vertX = poly[0] - linePtr->arrowShapeA*cosTheta;
+       vertY = poly[1] - linePtr->arrowShapeA*sinTheta;
+       temp = shapeC*sinTheta;
+       poly[2] = poly[0] - linePtr->arrowShapeB*cosTheta + temp;
+       poly[8] = poly[2] - 2*temp;
+       temp = shapeC*cosTheta;
+       poly[3] = poly[1] - linePtr->arrowShapeB*sinTheta - temp;
+       poly[9] = poly[3] + 2*temp;
+       poly[4] = poly[2]*fracHeight + vertX*(1.0-fracHeight);
+       poly[5] = poly[3]*fracHeight + vertY*(1.0-fracHeight);
+       poly[6] = poly[8]*fracHeight + vertX*(1.0-fracHeight);
+       poly[7] = poly[9]*fracHeight + vertY*(1.0-fracHeight);
+       coordPtr[2] = poly[0] - backup*cosTheta;
+       coordPtr[3] = poly[1] - backup*sinTheta;
+    }
+
+    return TCL_OK;
+}
diff --git a/src/tk/tkcvpoly.c b/src/tk/tkcvpoly.c
new file mode 100644 (file)
index 0000000..21b05a1
--- /dev/null
@@ -0,0 +1,770 @@
+/* 
+ * tkCanvPoly.c --
+ *
+ *     This file implements polygon items for canvas widgets.
+ *
+ * Copyright 1991-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkCanvPoly.c,v 1.6 92/07/28 15:40:10 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include <stdio.h>
+#include <math.h>
+#include "tkint.h"
+#include "tkcanvas.h"
+#include "tkconfig.h"
+
+/*
+ * The structure below defines the record for each polygon item.
+ */
+
+typedef struct PolygonItem  {
+    Tk_Item header;            /* Generic stuff that's the same for all
+                                * types.  MUST BE FIRST IN STRUCTURE. */
+    int numPoints;             /* Number of points in polygon (always >= 3).
+                                * Polygon is always closed. */
+    double *coordPtr;          /* Pointer to malloc-ed array containing
+                                * x- and y-coords of all points in polygon.
+                                * X-coords are even-valued indices, y-coords
+                                * are corresponding odd-valued indices. */
+    XColor *fg;                        /* Foreground color for polygon. */
+    Pixmap fillStipple;                /* Stipple bitmap for filling polygon. */
+    GC gc;                     /* Graphics context for filling polygon. */
+    int smooth;                        /* Non-zero means draw shape smoothed (i.e.
+                                * with Bezier splines). */
+    int splineSteps;           /* Number of steps in each spline segment. */
+} PolygonItem;
+
+/*
+ * Information used for parsing configuration specs:
+ */
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_COLOR, "-fill", (char *) NULL, (char *) NULL,
+       "black", Tk_Offset(PolygonItem, fg), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_BOOLEAN, "-smooth", (char *) NULL, (char *) NULL,
+       "no", Tk_Offset(PolygonItem, smooth), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_INT, "-splinesteps", (char *) NULL, (char *) NULL,
+       "12", Tk_Offset(PolygonItem, splineSteps), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_BITMAP, "-stipple", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(PolygonItem, fillStipple), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_CUSTOM, "-tags", (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, TK_CONFIG_NULL_OK, &tkCanvasTagsOption},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Prototypes for procedures defined in this file:
+ */
+
+static void            ComputePolygonBbox _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           PolygonItem *polyPtr));
+static int             ConfigurePolygon _ANSI_ARGS_((
+                           Tk_Canvas *canvasPtr, Tk_Item *itemPtr, int argc,
+                           char **argv, int flags));
+static int             CreatePolygon _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           struct Tk_Item *itemPtr, int argc, char **argv));
+static void            DeletePolygon _ANSI_ARGS_((Tk_Item *itemPtr));
+static void            DisplayPolygon _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, Drawable dst));
+static int             PolygonCoords _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, int argc, char **argv));
+static int             PolygonToArea _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *rectPtr));
+static double          PolygonToPoint _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *pointPtr));
+static void            ScalePolygon _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double originX, double originY,
+                           double scaleX, double scaleY));
+static void            TranslatePolygon _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double deltaX, double deltaY));
+
+/*
+ * The structures below defines the polygon item type by means
+ * of procedures that can be invoked by generic item code.
+ */
+
+Tk_ItemType TkPolygonType = {
+    "polygon",                         /* name */
+    sizeof(PolygonItem),               /* itemSize */
+    CreatePolygon,                     /* createProc */
+    configSpecs,                       /* configSpecs */
+    ConfigurePolygon,                  /* configureProc */
+    PolygonCoords,                     /* coordProc */
+    DeletePolygon,                     /* deleteProc */
+    DisplayPolygon,                    /* displayProc */
+    0,                                 /* alwaysRedraw */
+    PolygonToPoint,                    /* pointProc */
+    PolygonToArea,                     /* areaProc */
+    (Tk_ItemPostscriptProc *) NULL,    /* postscriptProc */
+    ScalePolygon,                      /* scaleProc */
+    TranslatePolygon,                  /* translateProc */
+    (Tk_ItemIndexProc *) NULL,         /* indexProc */
+    (Tk_ItemCursorProc *) NULL,                /* cursorProc */
+    (Tk_ItemSelectionProc *) NULL,     /* selectionProc */
+    (Tk_ItemInsertProc *) NULL,                /* insertProc */
+    (Tk_ItemDCharsProc *) NULL,                /* dTextProc */
+    (Tk_ItemType *) NULL               /* nextPtr */
+};
+
+/*
+ * The definition below determines how large are static arrays
+ * used to hold spline points (splines larger than this have to
+ * have their arrays malloc-ed).
+ */
+
+#define MAX_STATIC_POINTS 200
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CreatePolygon --
+ *
+ *     This procedure is invoked to create a new polygon item in
+ *     a canvas.
+ *
+ * Results:
+ *     A standard Tcl return value.  If an error occurred in
+ *     creating the item, then an error message is left in
+ *     canvasPtr->interp->result;  in this case itemPtr is
+ *     left uninitialized, so it can be safely freed by the
+ *     caller.
+ *
+ * Side effects:
+ *     A new polygon item is created.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+CreatePolygon(canvasPtr, itemPtr, argc, argv)
+    register Tk_Canvas *canvasPtr;     /* Canvas to hold new item. */
+    Tk_Item *itemPtr;                  /* Record to hold new item;  header
+                                        * has been initialized by caller. */
+    int argc;                          /* Number of arguments in argv. */
+    char **argv;                       /* Arguments describing polygon. */
+{
+    register PolygonItem *polyPtr = (PolygonItem *) itemPtr;
+    int i;
+
+    if (argc < 6) {
+       Tcl_AppendResult(canvasPtr->interp, "wrong # args:  should be \"",
+               Tk_PathName(canvasPtr->tkwin),
+               "\" create x1 y1 x2 y2 x3 y3 ?x4 y4 ...? ?options?",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Carry out initialization that is needed in order to clean
+     * up after errors during the the remainder of this procedure.
+     */
+
+    polyPtr->numPoints = 0;
+    polyPtr->coordPtr = NULL;
+    polyPtr->fg = None;
+    polyPtr->fillStipple = None;
+    polyPtr->gc = None;
+    polyPtr->smooth = 0;
+    polyPtr->splineSteps = 12;
+
+    /*
+     * Count the number of points and then parse them into a point
+     * array.  Leading arguments are assumed to be points if they
+     * start with a digit or a minus sign followed by a digit.
+     */
+
+    for (i = 4; i < (argc-1); i+=2) {
+       if ((!isdigit(argv[i][0])) &&
+               ((argv[i][0] != '-') || (!isdigit(argv[i][1])))) {
+           break;
+       }
+    }
+    if (PolygonCoords(canvasPtr, itemPtr, i, argv) != TCL_OK) {
+       goto error;
+    }
+
+    if (ConfigurePolygon(canvasPtr, itemPtr, argc-i, argv+i, 0) == TCL_OK) {
+       return TCL_OK;
+    }
+
+    error:
+    DeletePolygon(itemPtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * PolygonCoords --
+ *
+ *     This procedure is invoked to process the "coords" widget
+ *     command on polygons.  See the user documentation for details
+ *     on what it does.
+ *
+ * Results:
+ *     Returns TCL_OK or TCL_ERROR, and sets canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     The coordinates for the given item may be changed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+PolygonCoords(canvasPtr, itemPtr, argc, argv)
+    register Tk_Canvas *canvasPtr;     /* Canvas containing item. */
+    Tk_Item *itemPtr;                  /* Item whose coordinates are to be
+                                        * read or modified. */
+    int argc;                          /* Number of coordinates supplied in
+                                        * argv. */
+    char **argv;                       /* Array of coordinates: x1, y1,
+                                        * x2, y2, ... */
+{
+    register PolygonItem *polyPtr = (PolygonItem *) itemPtr;
+    char buffer[300];
+    int i, numPoints;
+
+    if (argc == 0) {
+       for (i = 0; i < 2*polyPtr->numPoints; i++) {
+           sprintf(buffer, "%g", polyPtr->coordPtr[i]);
+           Tcl_AppendElement(canvasPtr->interp, buffer, 0);
+       }
+    } else if (argc < 6) {
+       Tcl_AppendResult(canvasPtr->interp,
+               "too few coordinates for polygon:  must have at least 6",
+               (char *) NULL);
+       return TCL_ERROR;
+    } else if (argc & 1) {
+       Tcl_AppendResult(canvasPtr->interp,
+               "odd number of coordinates specified for polygon",
+               (char *) NULL);
+       return TCL_ERROR;
+    } else {
+       numPoints = argc/2;
+       if (polyPtr->numPoints != numPoints) {
+           if (polyPtr->coordPtr != NULL) {
+               ckfree((char *) polyPtr->coordPtr);
+           }
+
+           /*
+            * One extra point gets allocated here, just in case we have
+            * to add another point to close the polygon.
+            */
+
+           polyPtr->coordPtr = (double *) ckalloc((unsigned)
+                   (sizeof(double) * (argc+2)));
+           polyPtr->numPoints = numPoints;
+       }
+       for (i = argc-1; i >= 0; i--) {
+           if (TkGetCanvasCoord(canvasPtr, argv[i], &polyPtr->coordPtr[i])
+                   != TCL_OK) {
+               return TCL_ERROR;
+           }
+       }
+    
+       /*
+        * Close the polygon if it isn't already closed.
+        */
+    
+       if ((polyPtr->coordPtr[argc-2] != polyPtr->coordPtr[0])
+               || (polyPtr->coordPtr[argc-1] != polyPtr->coordPtr[1])) {
+           polyPtr->numPoints++;
+           polyPtr->coordPtr[argc] = polyPtr->coordPtr[0];
+           polyPtr->coordPtr[argc+1] = polyPtr->coordPtr[1];
+       }
+       ComputePolygonBbox(canvasPtr, polyPtr);
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ConfigurePolygon --
+ *
+ *     This procedure is invoked to configure various aspects
+ *     of a polygon item such as its background color.
+ *
+ * Results:
+ *     A standard Tcl result code.  If an error occurs, then
+ *     an error message is left in canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     Configuration information, such as colors and stipple
+ *     patterns, may be set for itemPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ConfigurePolygon(canvasPtr, itemPtr, argc, argv, flags)
+    Tk_Canvas *canvasPtr;      /* Canvas containing itemPtr. */
+    Tk_Item *itemPtr;          /* Polygon item to reconfigure. */
+    int argc;                  /* Number of elements in argv.  */
+    char **argv;               /* Arguments describing things to configure. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    register PolygonItem *polyPtr = (PolygonItem *) itemPtr;
+    XGCValues gcValues;
+    GC newGC;
+    unsigned long mask;
+
+    if (Tk_ConfigureWidget(canvasPtr->interp, canvasPtr->tkwin,
+           configSpecs, argc, argv, (char *) polyPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few of the options require additional processing, such as
+     * graphics contexts.
+     */
+
+    if (polyPtr->fg == NULL) {
+       newGC = None;
+    } else {
+       gcValues.foreground = polyPtr->fg->pixel;
+       mask = GCForeground;
+       if (polyPtr->fillStipple != None) {
+           gcValues.stipple = polyPtr->fillStipple;
+           gcValues.fill_style = FillStippled;
+           mask |= GCStipple|GCFillStyle;
+       }
+       newGC = Tk_GetGC(canvasPtr->tkwin, mask, &gcValues);
+    }
+    if (polyPtr->gc != None) {
+       Tk_FreeGC(polyPtr->gc);
+    }
+    polyPtr->gc = newGC;
+
+    /*
+     * Keep spline parameters within reasonable limits.
+     */
+
+    if (polyPtr->splineSteps < 1) {
+       polyPtr->splineSteps = 1;
+    } else if (polyPtr->splineSteps > 100) {
+       polyPtr->splineSteps = 100;
+    }
+
+    ComputePolygonBbox(canvasPtr, polyPtr);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DeletePolygon --
+ *
+ *     This procedure is called to clean up the data structure
+ *     associated with a polygon item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Resources associated with itemPtr are released.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DeletePolygon(itemPtr)
+    Tk_Item *itemPtr;                  /* Item that is being deleted. */
+{
+    register PolygonItem *polyPtr = (PolygonItem *) itemPtr;
+
+    if (polyPtr->coordPtr != NULL) {
+       ckfree((char *) polyPtr->coordPtr);
+    }
+    if (polyPtr->fg != NULL) {
+       Tk_FreeColor(polyPtr->fg);
+    }
+    if (polyPtr->fillStipple != None) {
+       Tk_FreeBitmap(polyPtr->fillStipple);
+    }
+    if (polyPtr->gc != None) {
+       Tk_FreeGC(polyPtr->gc);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ComputePolygonBbox --
+ *
+ *     This procedure is invoked to compute the bounding box of
+ *     all the pixels that may be drawn as part of a polygon.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The fields x1, y1, x2, and y2 are updated in the header
+ *     for itemPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ComputePolygonBbox(canvasPtr, polyPtr)
+    register Tk_Canvas *canvasPtr;     /* Canvas that contains item. */
+    PolygonItem *polyPtr;              /* Item whose bbox is to be
+                                        * recomputed. */
+{
+    register double *coordPtr;
+    int i;
+
+    coordPtr = polyPtr->coordPtr;
+    polyPtr->header.x1 = polyPtr->header.x2 = *coordPtr;
+    polyPtr->header.y1 = polyPtr->header.y2 = coordPtr[1];
+
+    for (i = 1, coordPtr = polyPtr->coordPtr+2; i < polyPtr->numPoints;
+           i++, coordPtr += 2) {
+       TkIncludePoint(canvasPtr, (Tk_Item *) polyPtr, coordPtr);
+    }
+
+    /*
+     * Add one more pixel of fudge factor just to be safe (e.g.
+     * X may round differently than we do).
+     */
+
+    polyPtr->header.x1 -= 1;
+    polyPtr->header.x2 += 1;
+    polyPtr->header.y1 -= 1;
+    polyPtr->header.y2 += 1;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkFillPolygon --
+ *
+ *     This procedure is invoked to convert a polygon to screen
+ *     coordinates and display it using a particular GC.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     ItemPtr is drawn in drawable using the transformation
+ *     information in canvasPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkFillPolygon(canvasPtr, coordPtr, numPoints, drawable, gc)
+    register Tk_Canvas *canvasPtr;     /* Canvas whose coordinate system
+                                        * is to be used for drawing. */
+    double *coordPtr;                  /* Array of coordinates for polygon:
+                                        * x1, y1, x2, y2, .... */
+    int numPoints;                     /* Twice this many coordinates are
+                                        * present at *coordPtr. */
+    Drawable drawable;                 /* Pixmap or window in which to draw
+                                        * polygon. */
+    GC gc;                             /* Graphics context for drawing. */
+{
+    XPoint staticPoints[MAX_STATIC_POINTS];
+    XPoint *pointPtr;
+    register XPoint *pPtr;
+    int i;
+
+    /*
+     * Build up an array of points in screen coordinates.  Use a
+     * static array unless the polygon has an enormous number of points;
+     * in this case, dynamically allocate an array.
+     */
+
+    if (numPoints <= MAX_STATIC_POINTS) {
+       pointPtr = staticPoints;
+    } else {
+       pointPtr = (XPoint *) ckalloc((unsigned) (numPoints * sizeof(XPoint)));
+    }
+
+    for (i = 0, pPtr = pointPtr; i < numPoints; i += 1, coordPtr += 2, pPtr++) {
+       pPtr->x = SCREEN_X(canvasPtr, coordPtr[0]);
+       pPtr->y = SCREEN_Y(canvasPtr, coordPtr[1]);
+    }
+
+    /*
+     * Display polygon, then free up polygon storage if it was dynamically
+     * allocated.
+     */
+
+    XFillPolygon(Tk_Display(canvasPtr->tkwin), drawable, gc, pointPtr,
+           numPoints, Complex, CoordModeOrigin);
+    if (pointPtr != staticPoints) {
+       ckfree((char *) pointPtr);
+    }
+
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayPolygon --
+ *
+ *     This procedure is invoked to draw a polygon item in a given
+ *     drawable.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     ItemPtr is drawn in drawable using the transformation
+ *     information in canvasPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayPolygon(canvasPtr, itemPtr, drawable)
+    register Tk_Canvas *canvasPtr;     /* Canvas that contains item. */
+    Tk_Item *itemPtr;                  /* Item to be displayed. */
+    Drawable drawable;                 /* Pixmap or window in which to draw
+                                        * item. */
+{
+    register PolygonItem *polyPtr = (PolygonItem *) itemPtr;
+
+    if (polyPtr->gc == None) {
+       return;
+    }
+
+    if (!polyPtr->smooth) {
+       TkFillPolygon(canvasPtr, polyPtr->coordPtr, polyPtr->numPoints,
+               drawable, polyPtr->gc);
+    } else {
+       int numPoints;
+       XPoint staticPoints[MAX_STATIC_POINTS];
+       XPoint *pointPtr;
+
+       /*
+        * This is a smoothed polygon.  Display using a set of generated
+        * spline points rather than the original points.
+        */
+
+       numPoints = 1 + polyPtr->numPoints*polyPtr->splineSteps;
+       if (numPoints <= MAX_STATIC_POINTS) {
+           pointPtr = staticPoints;
+       } else {
+           pointPtr = (XPoint *) ckalloc((unsigned)
+                   (numPoints * sizeof(XPoint)));
+       }
+       numPoints = TkMakeBezierCurve(canvasPtr, polyPtr->coordPtr,
+               polyPtr->numPoints, polyPtr->splineSteps, pointPtr,
+               (double *) NULL);
+       XFillPolygon(Tk_Display(canvasPtr->tkwin), drawable, polyPtr->gc,
+               pointPtr, numPoints, Complex, CoordModeOrigin);
+       if (pointPtr != staticPoints) {
+           ckfree((char *) pointPtr);
+       }
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * PolygonToPoint --
+ *
+ *     Computes the distance from a given point to a given
+ *     polygon, in canvas units.
+ *
+ * Results:
+ *     The return value is 0 if the point whose x and y coordinates
+ *     are pointPtr[0] and pointPtr[1] is inside the polygon.  If the
+ *     point isn't inside the polygon then the return value is the
+ *     distance from the point to the polygon.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static double
+PolygonToPoint(canvasPtr, itemPtr, pointPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item to check against point. */
+    double *pointPtr;          /* Pointer to x and y coordinates. */
+{
+    PolygonItem *polyPtr = (PolygonItem *) itemPtr;
+    double *coordPtr, distance;
+    double staticSpace[2*MAX_STATIC_POINTS];
+    int numPoints;
+
+    if (!polyPtr->smooth) {
+       return TkPolygonToPoint(polyPtr->coordPtr, polyPtr->numPoints,
+               pointPtr);
+    }
+
+    /*
+     * Smoothed polygon.  Generate a new set of points and use them
+     * for comparison.
+     */
+
+    numPoints = 1 + polyPtr->numPoints*polyPtr->splineSteps;
+    if (numPoints <= MAX_STATIC_POINTS) {
+       coordPtr = staticSpace;
+    } else {
+       coordPtr = (double *) ckalloc((unsigned)
+               (2*numPoints*sizeof(double)));
+    }
+    numPoints = TkMakeBezierCurve(canvasPtr, polyPtr->coordPtr,
+           polyPtr->numPoints, polyPtr->splineSteps, (XPoint *) NULL,
+           coordPtr);
+    distance = TkPolygonToPoint(coordPtr, numPoints, pointPtr);
+    if (coordPtr != staticSpace) {
+       ckfree((char *) coordPtr);
+    }
+    return distance;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * PolygonToArea --
+ *
+ *     This procedure is called to determine whether an item
+ *     lies entirely inside, entirely outside, or overlapping
+ *     a given rectangular area.
+ *
+ * Results:
+ *     -1 is returned if the item is entirely outside the area
+ *     given by rectPtr, 0 if it overlaps, and 1 if it is entirely
+ *     inside the given area.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static int
+PolygonToArea(canvasPtr, itemPtr, rectPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item to check against polygon. */
+    double *rectPtr;           /* Pointer to array of four coordinates
+                                * (x1, y1, x2, y2) describing rectangular
+                                * area.  */
+{
+    PolygonItem *polyPtr = (PolygonItem *) itemPtr;
+    double *coordPtr;
+    double staticSpace[2*MAX_STATIC_POINTS];
+    int numPoints, result;
+
+    if (!polyPtr->smooth) {
+       return TkPolygonToArea(polyPtr->coordPtr, polyPtr->numPoints, rectPtr);
+    }
+
+    /*
+     * Smoothed polygon.  Generate a new set of points and use them
+     * for comparison.
+     */
+
+    numPoints = 1 + polyPtr->numPoints*polyPtr->splineSteps;
+    if (numPoints <= MAX_STATIC_POINTS) {
+       coordPtr = staticSpace;
+    } else {
+       coordPtr = (double *) ckalloc((unsigned)
+               (2*numPoints*sizeof(double)));
+    }
+    numPoints = TkMakeBezierCurve(canvasPtr, polyPtr->coordPtr,
+           polyPtr->numPoints, polyPtr->splineSteps, (XPoint *) NULL,
+           coordPtr);
+    result = TkPolygonToArea(coordPtr, numPoints, rectPtr);
+    if (coordPtr != staticSpace) {
+       ckfree((char *) coordPtr);
+    }
+    return result;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScalePolygon --
+ *
+ *     This procedure is invoked to rescale a polygon item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The polygon referred to by itemPtr is rescaled so that the
+ *     following transformation is applied to all point
+ *     coordinates:
+ *             x' = originX + scaleX*(x-originX)
+ *             y' = originY + scaleY*(y-originY)
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ScalePolygon(canvasPtr, itemPtr, originX, originY, scaleX, scaleY)
+    Tk_Canvas *canvasPtr;              /* Canvas containing polygon. */
+    Tk_Item *itemPtr;                  /* Polygon to be scaled. */
+    double originX, originY;           /* Origin about which to scale rect. */
+    double scaleX;                     /* Amount to scale in X direction. */
+    double scaleY;                     /* Amount to scale in Y direction. */
+{
+    PolygonItem *polyPtr = (PolygonItem *) itemPtr;
+    register double *coordPtr;
+    int i;
+
+    for (i = 0, coordPtr = polyPtr->coordPtr; i < polyPtr->numPoints;
+           i++, coordPtr += 2) {
+       *coordPtr = originX + scaleX*(*coordPtr - originX);
+       coordPtr[1] = originY + scaleY*(coordPtr[1] - originY);
+    }
+    ComputePolygonBbox(canvasPtr, polyPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TranslatePolygon --
+ *
+ *     This procedure is called to move a polygon by a given
+ *     amount.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The position of the polygon is offset by (xDelta, yDelta),
+ *     and the bounding box is updated in the generic part of the
+ *     item structure.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+TranslatePolygon(canvasPtr, itemPtr, deltaX, deltaY)
+    Tk_Canvas *canvasPtr;              /* Canvas containing item. */
+    Tk_Item *itemPtr;                  /* Item that is being moved. */
+    double deltaX, deltaY;             /* Amount by which item is to be
+                                        * moved. */
+{
+    PolygonItem *polyPtr = (PolygonItem *) itemPtr;
+    register double *coordPtr;
+    int i;
+
+    for (i = 0, coordPtr = polyPtr->coordPtr; i < polyPtr->numPoints;
+           i++, coordPtr += 2) {
+       *coordPtr += deltaX;
+       coordPtr[1] += deltaY;
+    }
+    ComputePolygonBbox(canvasPtr, polyPtr);
+}
diff --git a/src/tk/tkcvtext.c b/src/tk/tkcvtext.c
new file mode 100644 (file)
index 0000000..20314d4
--- /dev/null
@@ -0,0 +1,1369 @@
+/* 
+ * tkCanvText.c --
+ *
+ *     This file implements text items for canvas widgets.
+ *
+ * Copyright 1991-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkCanvText.c,v 1.12 92/08/19 08:34:12 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include <stdio.h>
+#include "tkint.h"
+#include "tkcanvas.h"
+#include "tkconfig.h"
+
+/*
+ * One of the following structures is kept for each line of text
+ * in a text item.  It contains geometry and display information
+ * for that line.
+ */
+
+typedef struct TextLine {
+    char *firstChar;           /* Pointer to the first character in this
+                                * line (in the "text" field of enclosing
+                                * text item). */
+    int numChars;              /* Number of characters displayed in this
+                                * line. */
+    int totalChars;            /* Total number of characters included as
+                                * part of this line (may include an extra
+                                * space character at the end that isn't
+                                * displayed). */
+    int x, y;                  /* Origin at which to draw line on screen
+                                * (in integer pixel units, but in canvas
+                                * coordinates, not screen coordinates). */
+    int x1, y1;                        /* Upper-left pixel that is part of text
+                                * line on screen (again, in integer canvas
+                                * pixel units). */
+    int x2, y2;                        /* Lower-left pixel that is part of text
+                                * line on screen (again, in integer canvas
+                                * pixel units). */
+} TextLine;
+
+/*
+ * The structure below defines the record for each text item.
+ */
+
+typedef struct TextItem  {
+    Tk_Item header;            /* Generic stuff that's the same for all
+                                * types.  MUST BE FIRST IN STRUCTURE. */
+    char *text;                        /* Text for item (malloc-ed). */
+    int numChars;              /* Number of non-NULL characters in text. */
+    double x, y;               /* Positioning point for text. */
+    Tk_Anchor anchor;          /* Where to anchor text relative to (x,y). */
+    int width;                 /* Width of lines for word-wrap, pixels.
+                                * Zero means no word-wrap. */
+    Tk_Justify justify;                /* Justification mode for text. */
+    int rightEdge;             /* Pixel just to right of right edge of
+                                * area of text item.  Used for selecting
+                                * up to end of line. */
+    XFontStruct *fontPtr;      /* Font for drawing text. */
+    XColor *color;             /* Color for text. */
+    Pixmap stipple;            /* Stipple bitmap for text, or None. */
+    GC gc;                     /* Graphics context for drawing text. */
+    TextLine *linePtr;         /* Pointer to array of structures describing
+                                * individual lines of text item (malloc-ed). */
+    int numLines;              /* Number of structs at *linePtr. */
+    int cursorPos;             /* Insertion cursor is displayed just to left
+                                * of character with this index. */
+    GC selTextGC;              /* Graphics context for selected text. */
+} TextItem;
+
+/*
+ * Information used for parsing configuration specs:
+ */
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_ANCHOR, "-anchor", (char *) NULL, (char *) NULL,
+       "center", Tk_Offset(TextItem, anchor),
+       TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_COLOR, "-fill", (char *) NULL, (char *) NULL,
+       "black", Tk_Offset(TextItem, color), 0},
+    {TK_CONFIG_FONT, "-font", (char *) NULL, (char *) NULL,
+       "-Adobe-Helvetica-Bold-R-Normal-*-120-*",
+       Tk_Offset(TextItem, fontPtr), 0},
+    {TK_CONFIG_JUSTIFY, "-justify", (char *) NULL, (char *) NULL,
+       "left", Tk_Offset(TextItem, justify),
+       TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_BITMAP, "-stipple", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(TextItem, stipple), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_CUSTOM, "-tags", (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, TK_CONFIG_NULL_OK, &tkCanvasTagsOption},
+    {TK_CONFIG_STRING, "-text", (char *) NULL, (char *) NULL,
+       "", Tk_Offset(TextItem, text), 0},
+    {TK_CONFIG_PIXELS, "-width", (char *) NULL, (char *) NULL,
+       "0", Tk_Offset(TextItem, width), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Prototypes for procedures defined in this file:
+ */
+
+static void            ComputeTextBbox _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           TextItem *textPtr));
+static int             ConfigureText _ANSI_ARGS_((
+                           Tk_Canvas *canvasPtr, Tk_Item *itemPtr, int argc,
+                           char **argv, int flags));
+static int             CreateText _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           struct Tk_Item *itemPtr, int argc, char **argv));
+static void            DeleteText _ANSI_ARGS_((Tk_Item *itemPtr));
+static void            DisplayText _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, Drawable dst));
+static int             GetSelText _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, int offset, char *buffer,
+                           int maxBytes));
+static int             GetTextIndex _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, char *indexString,
+                           int *indexPtr));
+static void            ScaleText _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double originX, double originY,
+                           double scaleX, double scaleY));
+static void            SetTextCursor _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, int index));
+static int             TextCoords _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, int argc, char **argv));
+static int             TextDeleteChars _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, int first, int last));
+static int             TextInsert _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, int beforeThis, char *string));
+static int             TextToArea _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *rectPtr));
+static double          TextToPoint _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *pointPtr));
+static void            TranslateText _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double deltaX, double deltaY));
+
+/*
+ * The structures below defines the rectangle and oval item types
+ * by means of procedures that can be invoked by generic item code.
+ */
+
+Tk_ItemType TkTextType = {
+    "text",                            /* name */
+    sizeof(TextItem),                  /* itemSize */
+    CreateText,                                /* createProc */
+    configSpecs,                       /* configSpecs */
+    ConfigureText,                     /* configureProc */
+    TextCoords,                                /* coordProc */
+    DeleteText,                                /* deleteProc */
+    DisplayText,                       /* displayProc */
+    0,                                 /* alwaysRedraw */
+    TextToPoint,                       /* pointProc */
+    TextToArea,                                /* areaProc */
+    (Tk_ItemPostscriptProc *) NULL,    /* postscriptProc */
+    ScaleText,                         /* scaleProc */
+    TranslateText,                     /* translateProc */
+    GetTextIndex,                      /* indexProc */
+    SetTextCursor,                     /* cursorProc */
+    GetSelText,                                /* selectionProc */
+    TextInsert,                                /* insertProc */
+    TextDeleteChars,                   /* dTextProc */
+    (Tk_ItemType *) NULL               /* nextPtr */
+};
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CreateText --
+ *
+ *     This procedure is invoked to create a new text item
+ *     in a canvas.
+ *
+ * Results:
+ *     A standard Tcl return value.  If an error occurred in
+ *     creating the item then an error message is left in
+ *     canvasPtr->interp->result;  in this case itemPtr is
+ *     left uninitialized so it can be safely freed by the
+ *     caller.
+ *
+ * Side effects:
+ *     A new text item is created.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+CreateText(canvasPtr, itemPtr, argc, argv)
+    register Tk_Canvas *canvasPtr;     /* Canvas to hold new item. */
+    Tk_Item *itemPtr;                  /* Record to hold new item;  header
+                                        * has been initialized by caller. */
+    int argc;                          /* Number of arguments in argv. */
+    char **argv;                       /* Arguments describing rectangle. */
+{
+    register TextItem *textPtr = (TextItem *) itemPtr;
+
+    if (argc < 2) {
+       Tcl_AppendResult(canvasPtr->interp, "wrong # args:  should be \"",
+               Tk_PathName(canvasPtr->tkwin),
+               "\" create text x y [options]", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Carry out initialization that is needed in order to clean
+     * up after errors during the the remainder of this procedure.
+     */
+
+    textPtr->text = NULL;
+    textPtr->anchor = TK_ANCHOR_CENTER;
+    textPtr->width = 0;
+    textPtr->justify = TK_JUSTIFY_LEFT;
+    textPtr->fontPtr = NULL;
+    textPtr->color = NULL;
+    textPtr->stipple = None;
+    textPtr->gc = None;
+    textPtr->linePtr = NULL;
+    textPtr->numLines = 0;
+    textPtr->cursorPos = 0;
+    textPtr->selTextGC = None;
+
+    /*
+     * Process the arguments to fill in the item record.
+     */
+
+    if ((TkGetCanvasCoord(canvasPtr, argv[0], &textPtr->x) != TCL_OK)
+           || (TkGetCanvasCoord(canvasPtr, argv[1], &textPtr->y) != TCL_OK)) {
+       return TCL_ERROR;
+    }
+
+    if (ConfigureText(canvasPtr, itemPtr, argc-2, argv+2, 0) != TCL_OK) {
+       DeleteText(itemPtr);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TextCoords --
+ *
+ *     This procedure is invoked to process the "coords" widget
+ *     command on text items.  See the user documentation for
+ *     details on what it does.
+ *
+ * Results:
+ *     Returns TCL_OK or TCL_ERROR, and sets canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     The coordinates for the given item may be changed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+TextCoords(canvasPtr, itemPtr, argc, argv)
+    register Tk_Canvas *canvasPtr;     /* Canvas containing item. */
+    Tk_Item *itemPtr;                  /* Item whose coordinates are to be
+                                        * read or modified. */
+    int argc;                          /* Number of coordinates supplied in
+                                        * argv. */
+    char **argv;                       /* Array of coordinates: x1, y1,
+                                        * x2, y2, ... */
+{
+    register TextItem *textPtr = (TextItem *) itemPtr;
+
+    if (argc == 0) {
+       sprintf(canvasPtr->interp->result, "%g %g", textPtr->x, textPtr->y);
+    } else if (argc == 2) {
+       if ((TkGetCanvasCoord(canvasPtr, argv[0], &textPtr->x) != TCL_OK)
+               || (TkGetCanvasCoord(canvasPtr, argv[1],
+                   &textPtr->y) != TCL_OK)) {
+           return TCL_ERROR;
+       }
+       ComputeTextBbox(canvasPtr, textPtr);
+    } else {
+       sprintf(canvasPtr->interp->result,
+               "wrong # coordinates:  expected 0 or 2, got %d",
+               argc);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ConfigureText --
+ *
+ *     This procedure is invoked to configure various aspects
+ *     of a text item, such as its border and background colors.
+ *
+ * Results:
+ *     A standard Tcl result code.  If an error occurs, then
+ *     an error message is left in canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     Configuration information, such as colors and stipple
+ *     patterns, may be set for itemPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ConfigureText(canvasPtr, itemPtr, argc, argv, flags)
+    Tk_Canvas *canvasPtr;      /* Canvas containing itemPtr. */
+    Tk_Item *itemPtr;          /* Rectangle item to reconfigure. */
+    int argc;                  /* Number of elements in argv.  */
+    char **argv;               /* Arguments describing things to configure. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    register TextItem *textPtr = (TextItem *) itemPtr;
+    XGCValues gcValues;
+    GC newGC, newSelGC;
+    unsigned long mask;
+
+    if (Tk_ConfigureWidget(canvasPtr->interp, canvasPtr->tkwin,
+           configSpecs, argc, argv, (char *) textPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few of the options require additional processing, such as
+     * graphics contexts.
+     */
+
+    textPtr->numChars = strlen(textPtr->text);
+    newGC = newSelGC = None;
+    if ((textPtr->color != NULL) && (textPtr->fontPtr != NULL)) {
+       gcValues.foreground = textPtr->color->pixel;
+       gcValues.font = textPtr->fontPtr->fid;
+       mask = GCForeground|GCFont;
+       if (textPtr->stipple != None) {
+           gcValues.stipple = textPtr->stipple;
+           gcValues.fill_style = FillStippled;
+           mask |= GCForeground|GCStipple|GCFillStyle;
+       }
+       newGC = Tk_GetGC(canvasPtr->tkwin, mask, &gcValues);
+       gcValues.foreground = canvasPtr->selFgColorPtr->pixel;
+       newSelGC = Tk_GetGC(canvasPtr->tkwin, mask, &gcValues);
+    }
+    if (textPtr->gc != None) {
+       Tk_FreeGC(textPtr->gc);
+    }
+    textPtr->gc = newGC;
+    if (textPtr->selTextGC != None) {
+       Tk_FreeGC(textPtr->selTextGC);
+    }
+    textPtr->selTextGC = newSelGC;
+
+    /*
+     * If the text was changed, move the selection and insertion indices
+     * to keep them inside the item.
+     */
+
+    if (canvasPtr->selItemPtr == itemPtr) {
+       if (canvasPtr->selectFirst >= textPtr->numChars) {
+           canvasPtr->selItemPtr = NULL;
+       } else {
+           if (canvasPtr->selectLast >= textPtr->numChars) {
+               canvasPtr->selectLast = textPtr->numChars-1;
+           }
+           if ((canvasPtr->anchorItemPtr == itemPtr)
+                   && (canvasPtr->selectAnchor >= textPtr->numChars)) {
+               canvasPtr->selectAnchor = textPtr->numChars-1;
+           }
+       }
+    }
+    if (textPtr->cursorPos >= textPtr->numChars) {
+       textPtr->cursorPos = textPtr->numChars;
+    }
+
+    ComputeTextBbox(canvasPtr, textPtr);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DeleteText --
+ *
+ *     This procedure is called to clean up the data structure
+ *     associated with a text item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Resources associated with itemPtr are released.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DeleteText(itemPtr)
+    Tk_Item *itemPtr;                  /* Item that is being deleted. */
+{
+    register TextItem *textPtr = (TextItem *) itemPtr;
+
+    if (textPtr->text != NULL) {
+       ckfree(textPtr->text);
+    }
+    if (textPtr->fontPtr != NULL) {
+       Tk_FreeFontStruct(textPtr->fontPtr);
+    }
+    if (textPtr->color != NULL) {
+       Tk_FreeColor(textPtr->color);
+    }
+    if (textPtr->stipple != None) {
+       Tk_FreeBitmap(textPtr->stipple);
+    }
+    if (textPtr->gc != None) {
+       Tk_FreeGC(textPtr->gc);
+    }
+    if (textPtr->linePtr != NULL) {
+       ckfree((char *) textPtr->linePtr);
+    }
+    if (textPtr->selTextGC != None) {
+       Tk_FreeGC(textPtr->selTextGC);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ComputeTextBbox --
+ *
+ *     This procedure is invoked to compute the bounding box of
+ *     all the pixels that may be drawn as part of a text item.
+ *     In addition, it recomputes all of the geometry information
+ *     used to display a text item or check for mouse hits.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The fields x1, y1, x2, and y2 are updated in the header
+ *     for itemPtr, and the linePtr structure is regenerated
+ *     for itemPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ComputeTextBbox(canvasPtr, textPtr)
+    register Tk_Canvas *canvasPtr;     /* Canvas that contains item. */
+    register TextItem *textPtr;                /* Item whose bbos is to be
+                                        * recomputed. */
+{
+    register TextLine *linePtr;
+#define MAX_LINES 100
+    char *lineStart[MAX_LINES];
+    int lineChars[MAX_LINES];
+    int linePixels[MAX_LINES];
+    int numLines, wrapPixels, maxLinePixels, leftX, topY, y;
+    int lineHeight, i, fudge;
+    char *p;
+    XCharStruct *maxBoundsPtr = &textPtr->fontPtr->max_bounds;
+
+    if (textPtr->linePtr != NULL) {
+       ckfree((char *) textPtr->linePtr);
+       textPtr->linePtr = NULL;
+    }
+
+    /*
+     * Work through the text computing the starting point, number of
+     * characters, and number of pixels in each line.
+     */
+
+    p = textPtr->text;
+    if (textPtr->width > 0) {
+       wrapPixels = maxLinePixels = textPtr->width;
+    } else {
+       wrapPixels = 10000000;
+       maxLinePixels = 0;
+    }
+    for (numLines = 0; (numLines < MAX_LINES) && (*p != 0);
+           numLines++) {
+       int numChars, numPixels;
+       numChars = TkMeasureChars(textPtr->fontPtr, p,
+               (textPtr->text + textPtr->numChars) - p, 0,
+               wrapPixels, TK_WHOLE_WORDS|TK_AT_LEAST_ONE, &numPixels);
+       if (numPixels > maxLinePixels) {
+           maxLinePixels = numPixels;
+       }
+       lineStart[numLines] = p;
+       lineChars[numLines] = numChars;
+       linePixels[numLines] = numPixels;
+       p += numChars;
+
+       /*
+        * Skip space character that terminates a line, if there is one.
+        * In the case of multiple spaces, all but one will be displayed.
+        * This is important to make sure the insertion cursor gets
+        * displayed when it is in the middle of a multi-space.
+        */
+
+       if (isspace(*p)) {
+           p++;
+       }
+    }
+
+    /*
+     * Use overall geometry information to compute the top-left corner
+     * of the bounding box for the text item.
+     */
+
+    leftX = textPtr->x + 0.5;
+    topY = textPtr->y + 0.5;
+    lineHeight = textPtr->fontPtr->ascent + textPtr->fontPtr->descent;
+    switch (textPtr->anchor) {
+       case TK_ANCHOR_NW:
+       case TK_ANCHOR_N:
+       case TK_ANCHOR_NE:
+           break;
+
+       case TK_ANCHOR_W:
+       case TK_ANCHOR_CENTER:
+       case TK_ANCHOR_E:
+           topY -= (lineHeight * numLines)/2;
+           break;
+
+       case TK_ANCHOR_SW:
+       case TK_ANCHOR_S:
+       case TK_ANCHOR_SE:
+           topY -= lineHeight * numLines;
+           break;
+    }
+    switch (textPtr->anchor) {
+       case TK_ANCHOR_NW:
+       case TK_ANCHOR_W:
+       case TK_ANCHOR_SW:
+           break;
+
+       case TK_ANCHOR_N:
+       case TK_ANCHOR_CENTER:
+       case TK_ANCHOR_S:
+           leftX -= maxLinePixels/2;
+           break;
+
+       case TK_ANCHOR_NE:
+       case TK_ANCHOR_E:
+       case TK_ANCHOR_SE:
+           leftX -= maxLinePixels;
+           break;
+    }
+    textPtr->rightEdge = leftX + maxLinePixels;
+
+    /*
+     * Create the new TextLine array and fill it in using the geometry
+     * information gathered already.
+     */
+
+    if (numLines > 0) {
+       textPtr->linePtr = (TextLine *) ckalloc((unsigned)
+               (numLines * sizeof(TextLine)));
+    } else {
+       textPtr->linePtr = NULL;
+    }
+    textPtr->numLines = numLines;
+    for (i = 0, linePtr = textPtr->linePtr, y = topY;
+           i < numLines; i++, linePtr++, y += lineHeight) {
+       linePtr->firstChar = lineStart[i];
+       linePtr->numChars = lineChars[i];
+       if (i == (numLines-1)) {
+           linePtr->totalChars = linePtr->numChars;
+       } else {
+           linePtr->totalChars = lineStart[i+1] - lineStart[i];
+       }
+       switch (textPtr->justify) {
+           case TK_JUSTIFY_LEFT:
+           case TK_JUSTIFY_FILL:
+               linePtr->x = leftX;
+               break;
+           case TK_JUSTIFY_CENTER:
+               linePtr->x = leftX + maxLinePixels/2 - linePixels[i]/2;
+               break;
+           case TK_JUSTIFY_RIGHT:
+               linePtr->x = leftX + maxLinePixels - linePixels[i];
+               break;
+       }
+       linePtr->y = y + textPtr->fontPtr->ascent;
+       linePtr->x1 = linePtr->x - maxBoundsPtr->lbearing;
+       linePtr->y1 = y;
+       linePtr->x2 = linePtr->x + linePixels[i] + maxBoundsPtr->rbearing
+               - textPtr->fontPtr->min_bounds.rbearing;
+       linePtr->y2 = linePtr->y + textPtr->fontPtr->descent - 1;
+    }
+
+    /*
+     * Last of all, update the bounding box for the item.  The item's
+     * bounding box includes the bounding box of all its lines, plus
+     * an extra fudge factor for the cursor border (which could
+     * potentially be quite large).
+     */
+
+    linePtr = textPtr->linePtr;
+    textPtr->header.x1 = textPtr->header.x2 = leftX;
+    textPtr->header.y1 = topY;
+    textPtr->header.y2 = topY + numLines*lineHeight;
+    for (linePtr = textPtr->linePtr, i = textPtr->numLines; i > 0;
+           i--, linePtr++) {
+       if (linePtr->x1 < textPtr->header.x1) {
+           textPtr->header.x1 = linePtr->x1;
+       }
+       if (linePtr->x2 >= textPtr->header.x2) {
+           textPtr->header.x2 = linePtr->x2 + 1;
+       }
+    }
+
+    fudge = canvasPtr->cursorWidth/2;
+    if (canvasPtr->selBorderWidth > fudge) {
+       fudge = canvasPtr->selBorderWidth;
+    }
+    textPtr->header.x1 -= fudge;
+    textPtr->header.x2 += fudge;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayText --
+ *
+ *     This procedure is invoked to draw a text item in a given
+ *     drawable.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     ItemPtr is drawn in drawable using the transformation
+ *     information in canvasPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayText(canvasPtr, itemPtr, drawable)
+    register Tk_Canvas *canvasPtr;     /* Canvas that contains item. */
+    Tk_Item *itemPtr;                  /* Item to be displayed. */
+    Drawable drawable;                 /* Pixmap or window in which to draw
+                                        * item. */
+{
+    register TextItem *textPtr = (TextItem *) itemPtr;
+    Display *display = Tk_Display(canvasPtr->tkwin);
+    register TextLine *linePtr;
+    int i, focusHere, cursorX, cursorIndex, lineIndex;
+    int beforeSelect, inSelect, afterSelect, selStartX, selEndX;
+
+    if (textPtr->gc == None) {
+       return;
+    }
+    focusHere = (canvasPtr->focusItemPtr == itemPtr) &&
+           (canvasPtr->flags & GOT_FOCUS);
+    for (linePtr = textPtr->linePtr, i = textPtr->numLines;
+           i > 0; linePtr++, i--) {
+
+       /*
+        * If part or all of this line is selected, then draw a special
+        * background under the selected part of the line.
+        */
+
+       lineIndex = linePtr->firstChar - textPtr->text;
+       if ((canvasPtr->selItemPtr != itemPtr)
+               || (canvasPtr->selectLast < lineIndex)
+               || (canvasPtr->selectFirst >= (lineIndex
+                       + linePtr->totalChars))) {
+           beforeSelect = linePtr->numChars;
+           inSelect = 0;
+       } else {
+           beforeSelect = canvasPtr->selectFirst - lineIndex;
+           if (beforeSelect <= 0) {
+               beforeSelect = 0;
+               selStartX = linePtr->x;
+           } else {
+               (void) TkMeasureChars(textPtr->fontPtr,
+                       linePtr->firstChar, beforeSelect, 0,
+                       (int) 1000000, TK_PARTIAL_OK, &selStartX);
+               selStartX += linePtr->x;
+           }
+           inSelect = canvasPtr->selectLast + 1 - (lineIndex + beforeSelect);
+
+           /*
+            * If the selection spans the end of this line, then display
+            * selection background all the way to the end of the line.
+            * However, for the last line we only want to display up to
+            * the last character, not the end of the line, hence the
+            * "i != 1" check.
+            */
+
+           if (inSelect >= (linePtr->totalChars - beforeSelect)) {
+               inSelect = linePtr->numChars - beforeSelect;
+               if (i != 1) {
+                   selEndX = textPtr->rightEdge;
+                   goto fillSelectBackground;
+               }
+           }
+           (void) TkMeasureChars(textPtr->fontPtr,
+                   linePtr->firstChar + beforeSelect, inSelect,
+                   selStartX-linePtr->x, (int) 1000000, TK_PARTIAL_OK,
+                   &selEndX);
+           selEndX += linePtr->x;
+           fillSelectBackground:
+           Tk_Fill3DRectangle(display, drawable, canvasPtr->selBorder,
+                   selStartX - canvasPtr->drawableXOrigin
+                       - canvasPtr->selBorderWidth,
+                   linePtr->y - canvasPtr->drawableYOrigin
+                       - textPtr->fontPtr->ascent,
+                   selEndX - selStartX + 2*canvasPtr->selBorderWidth,
+                   textPtr->fontPtr->ascent + textPtr->fontPtr->descent,
+                   canvasPtr->selBorderWidth, TK_RELIEF_RAISED);
+       }
+
+       /*
+        * If the insertion cursor is in this line, then draw a special
+        * background for the cursor before drawing the text.  Note:
+        * if we're the cursor item but the cursor is turned off, then
+        * redraw background over the area of the cursor.  This guarantees
+        * that the selection won't make the cursor invisible on mono
+        * displays, where both are drawn in the same color.
+        */
+
+       if (focusHere) {
+           cursorIndex = textPtr->cursorPos
+                   - (linePtr->firstChar - textPtr->text);
+           if ((cursorIndex >= 0) && (cursorIndex <= linePtr->numChars)) {
+               (void) TkMeasureChars(textPtr->fontPtr, linePtr->firstChar,
+                   cursorIndex, 0, (int) 1000000, TK_PARTIAL_OK, &cursorX);
+               if (canvasPtr->flags & CURSOR_ON) {
+                   Tk_Fill3DRectangle(display, drawable,
+                           canvasPtr->cursorBorder,
+                           linePtr->x - canvasPtr->drawableXOrigin
+                               + cursorX  - (canvasPtr->cursorWidth)/2,
+                           linePtr->y - canvasPtr->drawableYOrigin
+                               - textPtr->fontPtr->ascent,
+                           canvasPtr->cursorWidth,
+                           textPtr->fontPtr->ascent
+                               + textPtr->fontPtr->descent,
+                           canvasPtr->cursorBorderWidth, TK_RELIEF_RAISED);
+               } else if (Tk_DefaultDepth(
+                       Tk_Screen(canvasPtr->tkwin)) == 1){
+                   Tk_Fill3DRectangle(display, drawable,
+                           canvasPtr->bgBorder,
+                           linePtr->x - canvasPtr->drawableXOrigin
+                               + cursorX  - (canvasPtr->cursorWidth)/2,
+                           linePtr->y - canvasPtr->drawableYOrigin
+                               - textPtr->fontPtr->ascent,
+                           canvasPtr->cursorWidth,
+                           textPtr->fontPtr->ascent
+                               + textPtr->fontPtr->descent,
+                           0, TK_RELIEF_FLAT);
+               }
+           }
+       }
+
+       /*
+        * Display the text in three pieces:  the part before the
+        * selection, the selected part (which needs a different graphics
+        * context), and the part after the selection.
+        */
+
+       if (beforeSelect != 0) {
+           TkDisplayChars(display, drawable, textPtr->gc, textPtr->fontPtr,
+                   linePtr->firstChar, beforeSelect,
+                   linePtr->x - canvasPtr->drawableXOrigin,
+                   linePtr->y - canvasPtr->drawableYOrigin, 0);
+       }
+       if (inSelect != 0) {
+           TkDisplayChars(display, drawable, textPtr->selTextGC,
+                   textPtr->fontPtr, linePtr->firstChar + beforeSelect,
+                   inSelect, selStartX - canvasPtr->drawableXOrigin,
+                   linePtr->y - canvasPtr->drawableYOrigin, 0);
+       }
+       afterSelect = linePtr->numChars - beforeSelect - inSelect;
+       if (afterSelect > 0) {
+           TkDisplayChars(display, drawable, textPtr->gc, textPtr->fontPtr,
+                   linePtr->firstChar + beforeSelect + inSelect,
+                   afterSelect, selEndX - canvasPtr->drawableXOrigin,
+                   linePtr->y - canvasPtr->drawableYOrigin, 0);
+       }
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TextInsert --
+ *
+ *     Insert characters into a text item at a given position.
+ *
+ * Results:
+ *     Always returns TCL_OK.
+ *
+ * Side effects:
+ *     The text in the given item is modified.  The cursor and
+ *     selection positions are also modified to reflect the
+ *     insertion.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+TextInsert(canvasPtr, itemPtr, beforeThis, string)
+    Tk_Canvas *canvasPtr;      /* Canvas containing text item. */
+    Tk_Item *itemPtr;          /* Text item to be modified. */
+    int beforeThis;            /* Index of character before which text is
+                                * to be inserted. */
+    char *string;              /* New characters to be inserted. */
+{
+    register TextItem *textPtr = (TextItem *) itemPtr;
+    int length;
+    char *new;
+
+    length = strlen(string);
+    if (length == 0) {
+       return TCL_OK;
+    }
+    if (beforeThis < 0) {
+       beforeThis = 0;
+    }
+    if (beforeThis > textPtr->numChars) {
+       beforeThis = textPtr->numChars;
+    }
+
+    new = (char *) ckalloc((unsigned) (textPtr->numChars + length + 1));
+    strncpy(new, textPtr->text, beforeThis);
+    strcpy(new+beforeThis, string);
+    strcpy(new+beforeThis+length, textPtr->text+beforeThis);
+    ckfree(textPtr->text);
+    textPtr->text = new;
+    textPtr->numChars += length;
+
+    /*
+     * Inserting characters invalidates indices such as those for the
+     * selection and cursor.  Update the indices appropriately.
+     */
+
+    if (canvasPtr->selItemPtr == itemPtr) {
+       if (canvasPtr->selectFirst >= beforeThis) {
+           canvasPtr->selectFirst += length;
+       }
+       if (canvasPtr->selectLast >= beforeThis) {
+           canvasPtr->selectLast += length;
+       }
+       if ((canvasPtr->anchorItemPtr == itemPtr)
+               && (canvasPtr->selectAnchor >= beforeThis)) {
+           canvasPtr->selectAnchor += length;
+       }
+    }
+    if (textPtr->cursorPos >= beforeThis) {
+       textPtr->cursorPos += length;
+    }
+    ComputeTextBbox(canvasPtr, textPtr);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TextDeleteChars --
+ *
+ *     Delete one or more characters from a text item.
+ *
+ * Results:
+ *     Always returns TCL_OK.
+ *
+ * Side effects:
+ *     Characters between "first" and "last", inclusive, get
+ *     deleted from itemPtr, and things like the selection
+ *     position get updated.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+TextDeleteChars(canvasPtr, itemPtr, first, last)
+    Tk_Canvas *canvasPtr;      /* Canvas containing itemPtr. */
+    Tk_Item *itemPtr;          /* Item in which to delete characters. */
+    int first;                 /* Index of first character to delete. */
+    int last;                  /* Index of last character to delete. */
+{
+    register TextItem *textPtr = (TextItem *) itemPtr;
+    int count;
+    char *new;
+
+    if (first < 0) {
+       first = 0;
+    }
+    if (last >= textPtr->numChars) {
+       last = textPtr->numChars-1;
+    }
+    if (first > last) {
+       return TCL_OK;
+    }
+    count = last + 1 - first;
+
+    new = ckalloc((unsigned) (textPtr->numChars + 1 - count));
+    strncpy(new, textPtr->text, first);
+    strcpy(new+first, textPtr->text+last+1);
+    ckfree(textPtr->text);
+    textPtr->text = new;
+    textPtr->numChars -= count;
+
+    /*
+     * Update indexes for the selection and cursor to reflect the
+     * renumbering of the remaining characters.
+     */
+
+    if (canvasPtr->selItemPtr == itemPtr) {
+       if (canvasPtr->selectFirst > first) {
+           canvasPtr->selectFirst -= count;
+           if (canvasPtr->selectFirst < first) {
+               canvasPtr->selectFirst = first;
+           }
+       }
+       if (canvasPtr->selectLast >= first) {
+           canvasPtr->selectLast -= count;
+           if (canvasPtr->selectLast < (first-1)) {
+               canvasPtr->selectLast = (first-1);
+           }
+       }
+       if (canvasPtr->selectFirst > canvasPtr->selectLast) {
+           canvasPtr->selItemPtr = NULL;
+       }
+       if ((canvasPtr->anchorItemPtr == itemPtr)
+               && (canvasPtr->selectAnchor > first)) {
+           canvasPtr->selectAnchor -= count;
+           if (canvasPtr->selectAnchor < first) {
+               canvasPtr->selectAnchor = first;
+           }
+       }
+    }
+    if (textPtr->cursorPos > first) {
+       textPtr->cursorPos -= count;
+       if (textPtr->cursorPos < first) {
+           textPtr->cursorPos = first;
+       }
+    }
+    ComputeTextBbox(canvasPtr, textPtr);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TextToPoint --
+ *
+ *     Computes the distance from a given point to a given
+ *     text item, in canvas units.
+ *
+ * Results:
+ *     The return value is 0 if the point whose x and y coordinates
+ *     are pointPtr[0] and pointPtr[1] is inside the arc.  If the
+ *     point isn't inside the arc then the return value is the
+ *     distance from the point to the arc.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static double
+TextToPoint(canvasPtr, itemPtr, pointPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing itemPtr. */
+    Tk_Item *itemPtr;          /* Item to check against point. */
+    double *pointPtr;          /* Pointer to x and y coordinates. */
+{
+    TextItem *textPtr = (TextItem *) itemPtr;
+    register TextLine *linePtr;
+    int i;
+    double xDiff, yDiff, dist, minDist;
+
+    /*
+     * Treat each line in the text item as a rectangle, compute the
+     * distance to that rectangle, and take the minimum of these
+     * distances.  Perform most of the calculations in integer pixel
+     * units, since that's how the dimensions of the text are defined.
+     */
+
+    minDist = -1.0;
+    for (linePtr = textPtr->linePtr, i = textPtr->numLines;
+           i > 0; linePtr++, i--) {
+
+       /*
+        * If the point is inside the line's rectangle, then can
+        * return immediately.
+        */
+    
+       if ((pointPtr[0] >= linePtr->x1)
+               && (pointPtr[0] <= linePtr->x2)
+               && (pointPtr[1] >= linePtr->y1)
+               && (pointPtr[1] <= linePtr->y2)) {
+           return 0.0;
+       }
+    
+       /*
+        * Point is outside line's rectangle; compute distance to nearest
+        * side.
+        */
+    
+       if (pointPtr[0] < linePtr->x1) {
+           xDiff = linePtr->x1 - pointPtr[0];
+       } else if (pointPtr[0] > linePtr->x2)  {
+           xDiff = pointPtr[0] - linePtr->x2;
+       } else {
+           xDiff = 0;
+       }
+    
+       if (pointPtr[1] < linePtr->y1) {
+           yDiff = linePtr->y1 - pointPtr[1];
+       } else if (pointPtr[1] > linePtr->y2)  {
+           yDiff = pointPtr[1] - linePtr->y2;
+       } else {
+           yDiff = 0;
+       }
+
+       dist = hypot((float) xDiff, (float) yDiff);
+       if ((dist < minDist) || (minDist < 0.0)) {
+           minDist = dist;
+       }
+    }
+    return minDist;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TextToArea --
+ *
+ *     This procedure is called to determine whether an item
+ *     lies entirely inside, entirely outside, or overlapping
+ *     a given rectangle.
+ *
+ * Results:
+ *     -1 is returned if the item is entirely outside the area
+ *     given by rectPtr, 0 if it overlaps, and 1 if it is entirely
+ *     inside the given area.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static int
+TextToArea(canvasPtr, itemPtr, rectPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing itemPtr. */
+    Tk_Item *itemPtr;          /* Item to check against rectangle. */
+    double *rectPtr;           /* Pointer to array of four coordinates
+                                * (x1, y1, x2, y2) describing rectangular
+                                * area.  */
+{
+    TextItem *textPtr = (TextItem *) itemPtr;
+    register TextLine *linePtr;
+    int i, result;
+
+    /*
+     * Scan the lines one at a time, seeing whether each line is
+     * entirely in, entirely out, or overlapping the rectangle.  If
+     * an overlap is detected, return immediately;  otherwise wait
+     * until all lines have been processed and see if they were all
+     * inside or all outside.
+     */
+
+    result = 0;
+    for (linePtr = textPtr->linePtr, i = textPtr->numLines;
+           i > 0; linePtr++, i--) {
+       if ((rectPtr[2] < linePtr->x1) || (rectPtr[0] > linePtr->x2)
+               || (rectPtr[3] < linePtr->y1) || (rectPtr[1] > linePtr->y2)) {
+           if (result == 1) {
+               return 0;
+           }
+           result = -1;
+           continue;
+       }
+       if ((linePtr->x1 < rectPtr[0]) || (linePtr->x2 > rectPtr[2])
+               || (linePtr->y1 < rectPtr[1]) || (linePtr->y2 > rectPtr[3])) {
+           return 0;
+       }
+       if (result == -1) {
+           return 0;
+       }
+       result = 1;
+    }
+    return result;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScaleText --
+ *
+ *     This procedure is invoked to rescale a text item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Scales the position of the text, but not the size
+ *     of the font for the text.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static void
+ScaleText(canvasPtr, itemPtr, originX, originY, scaleX, scaleY)
+    Tk_Canvas *canvasPtr;              /* Canvas containing rectangle. */
+    Tk_Item *itemPtr;                  /* Rectangle to be scaled. */
+    double originX, originY;           /* Origin about which to scale rect. */
+    double scaleX;                     /* Amount to scale in X direction. */
+    double scaleY;                     /* Amount to scale in Y direction. */
+{
+    register TextItem *textPtr = (TextItem *) itemPtr;
+
+    textPtr->x = originX + scaleX*(textPtr->x - originX);
+    textPtr->y = originY + scaleY*(textPtr->y - originY);
+    ComputeTextBbox(canvasPtr, textPtr);
+    return;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TranslateText --
+ *
+ *     This procedure is called to move a text item by a
+ *     given amount.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The position of the text item is offset by (xDelta, yDelta),
+ *     and the bounding box is updated in the generic part of the
+ *     item structure.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+TranslateText(canvasPtr, itemPtr, deltaX, deltaY)
+    Tk_Canvas *canvasPtr;              /* Canvas containing item. */
+    Tk_Item *itemPtr;                  /* Item that is being moved. */
+    double deltaX, deltaY;             /* Amount by which item is to be
+                                        * moved. */
+{
+    register TextItem *textPtr = (TextItem *) itemPtr;
+
+    textPtr->x += deltaX;
+    textPtr->y += deltaY;
+    ComputeTextBbox(canvasPtr, textPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * GetTextIndex --
+ *
+ *     Parse an index into a text item and return either its value
+ *     or an error.
+ *
+ * Results:
+ *     A standard Tcl result.  If all went well, then *indexPtr is
+ *     filled in with the index (into itemPtr) corresponding to
+ *     string.  Otherwise an error message is left in
+ *     canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+GetTextIndex(canvasPtr, itemPtr, string, indexPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item for which the index is being
+                                * specified. */
+    char *string;              /* Specification of a particular character
+                                * in itemPtr's text. */
+    int *indexPtr;             /* Where to store converted index. */
+{
+    register TextItem *textPtr = (TextItem *) itemPtr;
+    int length;
+
+    length = strlen(string);
+
+    if (string[0] == 'e') {
+       if (strncmp(string, "end", length) == 0) {
+           *indexPtr = textPtr->numChars;
+       } else {
+           badIndex:
+
+           /*
+            * Some of the paths here leave messages in
+            * canvasPtr->interp->result, so we have to clear it out
+            * before storing our own message.
+            */
+
+           Tcl_SetResult(canvasPtr->interp, (char *) NULL, TCL_STATIC);
+           Tcl_AppendResult(canvasPtr->interp, "bad index \"", string,
+                   "\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+    } else if (string[0] == 'c') {
+       if (strncmp(string, "cursor", length) == 0) {
+           *indexPtr = textPtr->cursorPos;
+       } else {
+           goto badIndex;
+       }
+    } else if (string[0] == 's') {
+       if (canvasPtr->selItemPtr != itemPtr) {
+           canvasPtr->interp->result = "selection isn't in item";
+           return TCL_ERROR;
+       }
+       if (length < 5) {
+           goto badIndex;
+       }
+       if (strncmp(string, "sel.first", length) == 0) {
+           *indexPtr = canvasPtr->selectFirst;
+       } else if (strncmp(string, "sel.last", length) == 0) {
+           *indexPtr = canvasPtr->selectLast;
+       } else {
+           goto badIndex;
+       }
+    } else if (string[0] == '@') {
+       int x, y, dummy, i;
+       char *end, *p;
+       register TextLine *linePtr;
+
+       p = string+1;
+       x = strtol(p, &end, 0);
+       if ((end == p) || (*end != ',')) {
+           goto badIndex;
+       }
+       p = end+1;
+       y = strtol(p, &end, 0);
+       if ((end == p) || (*end != 0)) {
+           goto badIndex;
+       }
+       if ((textPtr->numChars == 0) || (y < textPtr->linePtr[0].y1)) {
+           *indexPtr = 0;
+           return TCL_OK;
+       }
+       for (i = 0, linePtr = textPtr->linePtr; ; i++, linePtr++) {
+           if (i >= textPtr->numLines) {
+               *indexPtr = textPtr->numChars;
+               return TCL_OK;
+           }
+           if (y <= linePtr->y2) {
+               break;
+           }
+       }
+       *indexPtr = TkMeasureChars(textPtr->fontPtr, linePtr->firstChar,
+               linePtr->numChars, linePtr->x, x, 0, &dummy);
+       *indexPtr += linePtr->firstChar - textPtr->text;
+    } else {
+       if (Tcl_GetInt(canvasPtr->interp, string, indexPtr) != TCL_OK) {
+           goto badIndex;
+       }
+       if (*indexPtr < 0){
+           *indexPtr = 0;
+       } else if (*indexPtr > textPtr->numChars) {
+           *indexPtr = textPtr->numChars;
+       }
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * SetTextCursor --
+ *
+ *     Set the position of the insertion cursor in this item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The cursor position will change.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static void
+SetTextCursor(canvasPtr, itemPtr, index)
+    Tk_Canvas *canvasPtr;              /* Record describing canvas widget. */
+    Tk_Item *itemPtr;                  /* Text item in which cursor position
+                                        * is to be set. */
+    int index;                         /* Index of character just before which
+                                        * cursor is to be positioned. */
+{
+    register TextItem *textPtr = (TextItem *) itemPtr;
+
+    if (index < 0) {
+       textPtr->cursorPos = 0;
+    } else  if (index > textPtr->numChars) {
+       textPtr->cursorPos = textPtr->numChars;
+    } else {
+       textPtr->cursorPos = index;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * GetSelText --
+ *
+ *     This procedure is invoked to return the selected portion
+ *     of a text item.  It is only called when this item has
+ *     the selection.
+ *
+ * Results:
+ *     The return value is the number of non-NULL bytes stored
+ *     at buffer.  Buffer is filled (or partially filled) with a
+ *     NULL-terminated string containing part or all of the selection,
+ *     as given by offset and maxBytes.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+GetSelText(canvasPtr, itemPtr, offset, buffer, maxBytes)
+    Tk_Canvas *canvasPtr;              /* Canvas containing selection. */
+    Tk_Item *itemPtr;                  /* Text item containing selection. */
+    int offset;                                /* Offset within selection of first
+                                        * character to be returned. */
+    char *buffer;                      /* Location in which to place
+                                        * selection. */
+    int maxBytes;                      /* Maximum number of bytes to place
+                                        * at buffer, not including terminating
+                                        * NULL character. */
+{
+    TextItem *textPtr = (TextItem *) itemPtr;
+    int count;
+
+    count = canvasPtr->selectLast + 1 - canvasPtr->selectFirst - offset;
+    if (canvasPtr->selectLast == textPtr->numChars) {
+       count -= 1;
+    }
+    if (count > maxBytes) {
+       count = maxBytes;
+    }
+    if (count <= 0) {
+       return 0;
+    }
+    strncpy(buffer, textPtr->text + canvasPtr->selectFirst + offset, count);
+    buffer[count] = '\0';
+    return count;
+}
diff --git a/src/tk/tkcvwind.c b/src/tk/tkcvwind.c
new file mode 100644 (file)
index 0000000..5140321
--- /dev/null
@@ -0,0 +1,772 @@
+/* 
+ * tkCanvWind.c --
+ *
+ *     This file implements window items for canvas widgets.
+ *
+ * Copyright 1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkCanvWind.c,v 1.4 92/08/24 09:24:22 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include <stdio.h>
+#include <math.h>
+#include "tkint.h"
+#include "tkcanvas.h"
+
+/*
+ * The structure below defines the record for each window item.
+ */
+
+typedef struct WindowItem  {
+    Tk_Item header;            /* Generic stuff that's the same for all
+                                * types.  MUST BE FIRST IN STRUCTURE. */
+    double x, y;               /* Coordinates of positioning point for
+                                * window. */
+    Tk_Window tkwin;           /* Window associated with item.  NULL means
+                                * window has been destroyed. */
+    int width;                 /* Width to use for window (<= 0 means use
+                                * window's requested width). */
+    int height;                        /* Width to use for window (<= 0 means use
+                                * window's requested width). */
+    Tk_Anchor anchor;          /* Where to anchor window relative to
+                                * (x,y). */
+    Tk_Canvas *canvasPtr;      /* Canvas containing this item. */
+} WindowItem;
+
+/*
+ * Information used for parsing configuration specs:
+ */
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_ANCHOR, "-anchor", (char *) NULL, (char *) NULL,
+       "center", Tk_Offset(WindowItem, anchor), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_PIXELS, "-height", (char *) NULL, (char *) NULL,
+       "0", Tk_Offset(WindowItem, height), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_CUSTOM, "-tags", (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, TK_CONFIG_NULL_OK, &tkCanvasTagsOption},
+    {TK_CONFIG_PIXELS, "-width", (char *) NULL, (char *) NULL,
+       "0", Tk_Offset(WindowItem, width), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_WINDOW, "-window", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(WindowItem, tkwin), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Prototypes for procedures defined in this file:
+ */
+
+static void            ComputeWindowBbox _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           WindowItem *winItemPtr));
+static int             ConfigureWinItem _ANSI_ARGS_((
+                           Tk_Canvas *canvasPtr, Tk_Item *itemPtr, int argc,
+                           char **argv, int flags));
+static int             CreateWinItem _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           struct Tk_Item *itemPtr, int argc, char **argv));
+static void            DeleteWinItem _ANSI_ARGS_((Tk_Item *itemPtr));
+static void            DisplayWinItem _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, Drawable dst));
+static void            ScaleWinItem _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double originX, double originY,
+                           double scaleX, double scaleY));
+static void            TranslateWinItem _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double deltaX, double deltaY));
+static int             WinItemCoords _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, int argc, char **argv));
+static void            WinItemRequestProc _ANSI_ARGS_((ClientData clientData,
+                           Tk_Window tkwin));
+static void            WinItemStructureProc _ANSI_ARGS_((
+                           ClientData clientData, XEvent *eventPtr));
+static int             WinItemToArea _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *rectPtr));
+static double          WinItemToPoint _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *pointPtr));
+
+/*
+ * The structures below defines the rectangle and oval item types
+ * by means of procedures that can be invoked by generic item code.
+ */
+
+Tk_ItemType TkWindowType = {
+    "window",                          /* name */
+    sizeof(WindowItem),                        /* itemSize */
+    CreateWinItem,                     /* createProc */
+    configSpecs,                       /* configSpecs */
+    ConfigureWinItem,                  /* configureProc */
+    WinItemCoords,                     /* coordProc */
+    DeleteWinItem,                     /* deleteProc */
+    DisplayWinItem,                    /* displayProc */
+    1,                                 /* alwaysRedraw */
+    WinItemToPoint,                    /* pointProc */
+    WinItemToArea,                     /* areaProc */
+    (Tk_ItemPostscriptProc *) NULL,    /* postscriptProc */
+    ScaleWinItem,                      /* scaleProc */
+    TranslateWinItem,                  /* translateProc */
+    (Tk_ItemIndexProc *) NULL,         /* indexProc */
+    (Tk_ItemCursorProc *) NULL,                /* cursorProc */
+    (Tk_ItemSelectionProc *) NULL,     /* selectionProc */
+    (Tk_ItemInsertProc *) NULL,                /* insertProc */
+    (Tk_ItemDCharsProc *) NULL,                /* dTextProc */
+    (Tk_ItemType *) NULL               /* nextPtr */
+};
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CreateWinItem --
+ *
+ *     This procedure is invoked to create a new window
+ *     item in a canvas.
+ *
+ * Results:
+ *     A standard Tcl return value.  If an error occurred in
+ *     creating the item, then an error message is left in
+ *     canvasPtr->interp->result;  in this case itemPtr is
+ *     left uninitialized, so it can be safely freed by the
+ *     caller.
+ *
+ * Side effects:
+ *     A new window item is created.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+CreateWinItem(canvasPtr, itemPtr, argc, argv)
+    register Tk_Canvas *canvasPtr;     /* Canvas to hold new item. */
+    Tk_Item *itemPtr;                  /* Record to hold new item;  header
+                                        * has been initialized by caller. */
+    int argc;                          /* Number of arguments in argv. */
+    char **argv;                       /* Arguments describing rectangle. */
+{
+    register WindowItem *winItemPtr = (WindowItem *) itemPtr;
+
+    if (argc < 2) {
+       Tcl_AppendResult(canvasPtr->interp, "wrong # args:  should be \"",
+               Tk_PathName(canvasPtr->tkwin), "\" create ",
+               itemPtr->typePtr->name, " x y ?options?",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Initialize item's record.
+     */
+
+    winItemPtr->tkwin = NULL;
+    winItemPtr->width = 0;
+    winItemPtr->height = 0;
+    winItemPtr->anchor = TK_ANCHOR_CENTER;
+    winItemPtr->canvasPtr = canvasPtr;
+
+    /*
+     * Process the arguments to fill in the item record.
+     */
+
+    if ((TkGetCanvasCoord(canvasPtr, argv[0], &winItemPtr->x) != TCL_OK)
+           || (TkGetCanvasCoord(canvasPtr, argv[1],
+               &winItemPtr->y) != TCL_OK)) {
+       return TCL_ERROR;
+    }
+
+    if (ConfigureWinItem(canvasPtr, itemPtr, argc-2, argv+2, 0) != TCL_OK) {
+       DeleteWinItem(itemPtr);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * WinItemCoords --
+ *
+ *     This procedure is invoked to process the "coords" widget
+ *     command on window items.  See the user documentation for
+ *     details on what it does.
+ *
+ * Results:
+ *     Returns TCL_OK or TCL_ERROR, and sets canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     The coordinates for the given item may be changed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+WinItemCoords(canvasPtr, itemPtr, argc, argv)
+    register Tk_Canvas *canvasPtr;     /* Canvas containing item. */
+    Tk_Item *itemPtr;                  /* Item whose coordinates are to be
+                                        * read or modified. */
+    int argc;                          /* Number of coordinates supplied in
+                                        * argv. */
+    char **argv;                       /* Array of coordinates: x1, y1,
+                                        * x2, y2, ... */
+{
+    register WindowItem *winItemPtr = (WindowItem *) itemPtr;
+
+    if (argc == 0) {
+       sprintf(canvasPtr->interp->result, "%g %g", winItemPtr->x,
+               winItemPtr->y);
+    } else if (argc == 2) {
+       if ((TkGetCanvasCoord(canvasPtr, argv[0], &winItemPtr->x) != TCL_OK)
+               || (TkGetCanvasCoord(canvasPtr, argv[1],
+                   &winItemPtr->y) != TCL_OK)) {
+           return TCL_ERROR;
+       }
+       ComputeWindowBbox(canvasPtr, winItemPtr);
+    } else {
+       sprintf(canvasPtr->interp->result,
+               "wrong # coordinates:  expected 0 or 2, got %d",
+               argc);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ConfigureWinItem --
+ *
+ *     This procedure is invoked to configure various aspects
+ *     of a window item, such as its anchor position.
+ *
+ * Results:
+ *     A standard Tcl result code.  If an error occurs, then
+ *     an error message is left in canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     Configuration information may be set for itemPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ConfigureWinItem(canvasPtr, itemPtr, argc, argv, flags)
+    Tk_Canvas *canvasPtr;      /* Canvas containing itemPtr. */
+    Tk_Item *itemPtr;          /* Window item to reconfigure. */
+    int argc;                  /* Number of elements in argv.  */
+    char **argv;               /* Arguments describing things to configure. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    register WindowItem *winItemPtr = (WindowItem *) itemPtr;
+    Tk_Window oldWindow;
+
+    oldWindow = winItemPtr->tkwin;
+    if (Tk_ConfigureWidget(canvasPtr->interp, canvasPtr->tkwin,
+           configSpecs, argc, argv, (char *) winItemPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few of the options require additional processing.
+     */
+
+    if (oldWindow != winItemPtr->tkwin) {
+       if (oldWindow != NULL) {
+           Tk_DeleteEventHandler(oldWindow, StructureNotifyMask,
+                   WinItemStructureProc, (ClientData) winItemPtr);
+           Tk_ManageGeometry(oldWindow, (Tk_GeometryProc *) NULL,
+                   (ClientData) NULL);
+           Tk_UnmapWindow(oldWindow);
+       }
+       if (winItemPtr->tkwin != NULL) {
+           Tk_Window ancestor, parent;
+
+           /*
+            * Make sure that the canvas is either the parent of the
+            * window associated with the item or a descendant of that
+            * parent.  Also, don't allow a top-level window to be
+            * managed inside a canvas.
+            */
+
+           parent = Tk_Parent(winItemPtr->tkwin);
+           for (ancestor = canvasPtr->tkwin; ;
+                   ancestor = Tk_Parent(ancestor)) {
+               if (ancestor == parent) {
+                   break;
+               }
+               if (((Tk_FakeWin *) (ancestor))->flags & TK_TOP_LEVEL) {
+                   badWindow:
+                   Tcl_AppendResult(canvasPtr->interp, "can't use ",
+                           Tk_PathName(winItemPtr->tkwin),
+                           " in a window item of this canvas", (char *) NULL);
+                   winItemPtr->tkwin = NULL;
+                   return TCL_ERROR;
+               }
+           }
+           if (((Tk_FakeWin *) (winItemPtr->tkwin))->flags & TK_TOP_LEVEL) {
+               goto badWindow;
+           }
+           if (winItemPtr->tkwin == canvasPtr->tkwin) {
+               goto badWindow;
+           }
+           Tk_CreateEventHandler(winItemPtr->tkwin, StructureNotifyMask,
+                   WinItemStructureProc, (ClientData) winItemPtr);
+           Tk_ManageGeometry(winItemPtr->tkwin, WinItemRequestProc,
+                   (ClientData) winItemPtr);
+       }
+    }
+
+    ComputeWindowBbox(canvasPtr, winItemPtr);
+
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DeleteWinItem --
+ *
+ *     This procedure is called to clean up the data structure
+ *     associated with a window item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Resources associated with itemPtr are released.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DeleteWinItem(itemPtr)
+    Tk_Item *itemPtr;                  /* Item that is being deleted. */
+{
+    register WindowItem *winItemPtr = (WindowItem *) itemPtr;
+
+    if (winItemPtr->tkwin != NULL) {
+       Tk_DeleteEventHandler(winItemPtr->tkwin, StructureNotifyMask,
+               WinItemStructureProc, (ClientData) winItemPtr);
+       Tk_ManageGeometry(winItemPtr->tkwin, (Tk_GeometryProc *) NULL,
+               (ClientData) NULL);
+       Tk_UnmapWindow(winItemPtr->tkwin);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ComputeWindowBbox --
+ *
+ *     This procedure is invoked to compute the bounding box of
+ *     all the pixels that may be drawn as part of a window item.
+ *     This procedure is where the child window's placement is
+ *     computed.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The fields x1, y1, x2, and y2 are updated in the header
+ *     for itemPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static void
+ComputeWindowBbox(canvasPtr, winItemPtr)
+    Tk_Canvas *canvasPtr;              /* Canvas that contains item. */
+    register WindowItem *winItemPtr;   /* Item whose bbox is to be
+                                        * recomputed. */
+{
+    int width, height, x, y;
+
+    x = winItemPtr->x + 0.5;
+    y = winItemPtr->y + 0.5;
+
+    if (winItemPtr->tkwin == NULL) {
+       winItemPtr->header.x1 = winItemPtr->header.x2 = x;
+       winItemPtr->header.y1 = winItemPtr->header.y2 = y;
+       return;
+    }
+
+    /*
+     * Compute dimensions of window.
+     */
+
+    width = winItemPtr->width;
+    if (width <= 0) {
+       width = Tk_ReqWidth(winItemPtr->tkwin);
+       if (width <= 0) {
+           width = 1;
+       }
+    }
+    height = winItemPtr->height;
+    if (height <= 0) {
+       height = Tk_ReqHeight(winItemPtr->tkwin);
+       if (height <= 0) {
+           height = 1;
+       }
+    }
+
+    /*
+     * Compute location of window, using anchor information.
+     */
+
+    switch (winItemPtr->anchor) {
+       case TK_ANCHOR_N:
+           x -= width/2;
+           break;
+       case TK_ANCHOR_NE:
+           x -= width;
+           break;
+       case TK_ANCHOR_E:
+           x -= width;
+           y -= height/2;
+           break;
+       case TK_ANCHOR_SE:
+           x -= width;
+           y -= height;
+           break;
+       case TK_ANCHOR_S:
+           x -= width/2;
+           y -= height;
+           break;
+       case TK_ANCHOR_SW:
+           y -= height;
+           break;
+       case TK_ANCHOR_W:
+           y -= height/2;
+           break;
+       case TK_ANCHOR_NW:
+           break;
+       case TK_ANCHOR_CENTER:
+           x -= width/2;
+           y -= height/2;
+           break;
+    }
+
+    /*
+     * Store the information in the item header.
+     */
+
+    winItemPtr->header.x1 = x;
+    winItemPtr->header.y1 = y;
+    winItemPtr->header.x2 = x + width;
+    winItemPtr->header.y2 = y + height;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayWinItem --
+ *
+ *     This procedure is invoked to "draw" a window item in a given
+ *     drawable.  Since the window draws itself, we needn't do any
+ *     actual redisplay here.  However, this procedure takes care
+ *     of actually repositioning the child window so that it occupies
+ *     the correct screen position.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The child window's position may get changed.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static void
+DisplayWinItem(canvasPtr, itemPtr, drawable)
+    register Tk_Canvas *canvasPtr;     /* Canvas that contains item. */
+    Tk_Item *itemPtr;                  /* Item to be displayed. */
+    Drawable drawable;                 /* Pixmap or window in which to draw
+                                        * item. */
+{
+    register WindowItem *winItemPtr = (WindowItem *) itemPtr;
+    int x,y, width, height;
+    Tk_Window ancestor, parent;
+
+    if (winItemPtr->tkwin == NULL) {
+       return;
+    }
+    x = winItemPtr->header.x1 - canvasPtr->xOrigin;
+    y = winItemPtr->header.y1 - canvasPtr->yOrigin;
+    width = winItemPtr->header.x2 - winItemPtr->header.x1;
+    height = winItemPtr->header.y2 - winItemPtr->header.y1;
+
+    /*
+     * If the canvas isn't the parent of the window, then translate the
+     * coordinates from those of the canvas to those of the window's
+     * parent.
+     */
+
+    parent = Tk_Parent(winItemPtr->tkwin);
+    for (ancestor = canvasPtr->tkwin; ancestor != parent;
+           ancestor = Tk_Parent(ancestor)) {
+       x += Tk_X(ancestor) + Tk_Changes(ancestor)->border_width;
+       y += Tk_Y(ancestor) + Tk_Changes(ancestor)->border_width;
+    }
+
+    /*
+     * Reconfigure the window if it isn't already in the correct place.
+     */
+
+    if ((x != Tk_X(winItemPtr->tkwin)) || (y != Tk_Y(winItemPtr->tkwin))
+           || (width != Tk_Width(winItemPtr->tkwin))
+           || (height != Tk_Height(winItemPtr->tkwin))) {
+       Tk_MoveResizeWindow(winItemPtr->tkwin, x, y, (unsigned int) width,
+               (unsigned int) height);
+    }
+    if (!Tk_IsMapped(winItemPtr->tkwin)) {
+       Tk_MapWindow(winItemPtr->tkwin);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * WinItemToPoint --
+ *
+ *     Computes the distance from a given point to a given
+ *     rectangle, in canvas units.
+ *
+ * Results:
+ *     The return value is 0 if the point whose x and y coordinates
+ *     are coordPtr[0] and coordPtr[1] is inside the window.  If the
+ *     point isn't inside the window then the return value is the
+ *     distance from the point to the window.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static double
+WinItemToPoint(canvasPtr, itemPtr, pointPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item to check against point. */
+    double *pointPtr;          /* Pointer to x and y coordinates. */
+{
+    register WindowItem *winItemPtr = (WindowItem *) itemPtr;
+    double x1, x2, y1, y2, xDiff, yDiff;
+
+    x1 = winItemPtr->header.x1;
+    y1 = winItemPtr->header.y1;
+    x2 = winItemPtr->header.x2;
+    y2 = winItemPtr->header.y2;
+
+    /*
+     * Point is outside rectangle.
+     */
+
+    if (pointPtr[0] < x1) {
+       xDiff = x1 - pointPtr[0];
+    } else if (pointPtr[0] > x2)  {
+       xDiff = pointPtr[0] - x2;
+    } else {
+       xDiff = 0;
+    }
+
+    if (pointPtr[1] < y1) {
+       yDiff = y1 - pointPtr[1];
+    } else if (pointPtr[1] > y2)  {
+       yDiff = pointPtr[1] - y2;
+    } else {
+       yDiff = 0;
+    }
+
+    return hypot(xDiff, yDiff);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * WinItemToArea --
+ *
+ *     This procedure is called to determine whether an item
+ *     lies entirely inside, entirely outside, or overlapping
+ *     a given rectangle.
+ *
+ * Results:
+ *     -1 is returned if the item is entirely outside the area
+ *     given by rectPtr, 0 if it overlaps, and 1 if it is entirely
+ *     inside the given area.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static int
+WinItemToArea(canvasPtr, itemPtr, rectPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item to check against rectangle. */
+    double *rectPtr;           /* Pointer to array of four coordinates
+                                * (x1, y1, x2, y2) describing rectangular
+                                * area.  */
+{
+    register WindowItem *winItemPtr = (WindowItem *) itemPtr;
+
+    if ((rectPtr[2] <= winItemPtr->header.x1)
+           || (rectPtr[0] >= winItemPtr->header.x2)
+           || (rectPtr[3] <= winItemPtr->header.y1)
+           || (rectPtr[1] >= winItemPtr->header.y2)) {
+       return -1;
+    }
+    if ((rectPtr[0] <= winItemPtr->header.x1)
+           && (rectPtr[1] <= winItemPtr->header.y1)
+           && (rectPtr[2] >= winItemPtr->header.x2)
+           && (rectPtr[3] >= winItemPtr->header.y2)) {
+       return 1;
+    }
+    return 0;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScaleWinItem --
+ *
+ *     This procedure is invoked to rescale a rectangle or oval
+ *     item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The rectangle or oval referred to by itemPtr is rescaled
+ *     so that the following transformation is applied to all
+ *     point coordinates:
+ *             x' = originX + scaleX*(x-originX)
+ *             y' = originY + scaleY*(y-originY)
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ScaleWinItem(canvasPtr, itemPtr, originX, originY, scaleX, scaleY)
+    Tk_Canvas *canvasPtr;              /* Canvas containing rectangle. */
+    Tk_Item *itemPtr;                  /* Rectangle to be scaled. */
+    double originX, originY;           /* Origin about which to scale rect. */
+    double scaleX;                     /* Amount to scale in X direction. */
+    double scaleY;                     /* Amount to scale in Y direction. */
+{
+    register WindowItem *winItemPtr = (WindowItem *) itemPtr;
+
+    winItemPtr->x = originX + scaleX*(winItemPtr->x - originX);
+    winItemPtr->y = originY + scaleY*(winItemPtr->y - originY);
+    if (winItemPtr->width > 0) {
+       winItemPtr->width = scaleY*winItemPtr->width;
+    }
+    if (winItemPtr->height > 0) {
+       winItemPtr->height = scaleY*winItemPtr->height;
+    }
+    ComputeWindowBbox(canvasPtr, winItemPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TranslateWinItem --
+ *
+ *     This procedure is called to move a rectangle or oval by a
+ *     given amount.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The position of the rectangle or oval is offset by
+ *     (xDelta, yDelta), and the bounding box is updated in the
+ *     generic part of the item structure.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+TranslateWinItem(canvasPtr, itemPtr, deltaX, deltaY)
+    Tk_Canvas *canvasPtr;              /* Canvas containing item. */
+    Tk_Item *itemPtr;                  /* Item that is being moved. */
+    double deltaX, deltaY;             /* Amount by which item is to be
+                                        * moved. */
+{
+    register WindowItem *winItemPtr = (WindowItem *) itemPtr;
+
+    winItemPtr->x += deltaX;
+    winItemPtr->y += deltaY;
+    ComputeWindowBbox(canvasPtr, winItemPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * WinItemStructureProc --
+ *
+ *     This procedure is invoked whenever StructureNotify events
+ *     occur for a window that's managed as part of a canvas window
+ *     item.  This procudure's only purpose is to clean up when
+ *     windows are deleted.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The window is disassociated from the window item when it is
+ *     deleted.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+WinItemStructureProc(clientData, eventPtr)
+    ClientData clientData;     /* Pointer to record describing window item. */
+    XEvent *eventPtr;          /* Describes what just happened. */
+{
+    register WindowItem *winItemPtr = (WindowItem *) clientData;
+
+    if (eventPtr->type == DestroyNotify) {
+       winItemPtr->tkwin = NULL;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * WinItemRequestProc --
+ *
+ *     This procedure is invoked whenever a window that's associated
+ *     with a window canvas item changes its requested dimensions.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The size and location on the screen of the window may change,
+ *     depending on the options specified for the window item.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static void
+WinItemRequestProc(clientData, tkwin)
+    ClientData clientData;             /* Pointer to record for window item. */
+    Tk_Window tkwin;                   /* Window that changed its desired
+                                        * size. */
+{
+    WindowItem *winItemPtr = (WindowItem *) clientData;
+
+    ComputeWindowBbox(winItemPtr->canvasPtr, winItemPtr);
+    DisplayWinItem(winItemPtr->canvasPtr, (Tk_Item *) winItemPtr,
+           (Drawable) None);
+}
diff --git a/src/tk/tkentry.c b/src/tk/tkentry.c
new file mode 100644 (file)
index 0000000..10e0c35
--- /dev/null
@@ -0,0 +1,1785 @@
+/* 
+ * tkEntry.c --
+ *
+ *     This module implements entry widgets for the Tk
+ *     toolkit.  An entry displays a string and allows
+ *     the string to be edited.
+ *
+ * Copyright 1990 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkEntry.c,v 1.37 92/08/21 16:09:15 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "default.h"
+#include "tkconfig.h"
+#include "tkint.h"
+
+/*
+ * A data structure of the following type is kept for each entry
+ * widget managed by this file:
+ */
+
+typedef struct {
+    Tk_Window tkwin;           /* Window that embodies the entry. NULL
+                                * means that the window has been destroyed
+                                * but the data structures haven't yet been
+                                * cleaned up.*/
+    Tcl_Interp *interp;                /* Interpreter associated with entry. */
+    int numChars;              /* Number of non-NULL characters in
+                                * string (may be 0). */
+    char *string;              /* Pointer to storage for string;
+                                * NULL-terminated;  malloc-ed. */
+    char *textVarName;         /* Name of variable (malloc'ed) or NULL.
+                                * If non-NULL, entry's string tracks the
+                                * contents of this variable and vice versa. */
+    Tk_Uid state;              /* Normal or disabled.  Entry is read-only
+                                * when disabled. */
+
+    /*
+     * Information used when displaying widget:
+     */
+
+    Tk_3DBorder normalBorder;  /* Used for drawing border around whole
+                                * window, plus used for background. */
+    int borderWidth;           /* Width of 3-D border around window. */
+    int relief;                        /* 3-D effect: TK_RELIEF_RAISED, etc. */
+    XFontStruct *fontPtr;      /* Information about text font, or NULL. */
+    XColor *fgColorPtr;                /* Text color in normal mode. */
+    GC textGC;                 /* For drawing normal text. */
+    Tk_3DBorder selBorder;     /* Border and background for selected
+                                * characters. */
+    int selBorderWidth;                /* Width of border around selection. */
+    XColor *selFgColorPtr;     /* Foreground color for selected text. */
+    GC selTextGC;              /* For drawing selected text. */
+    Tk_3DBorder cursorBorder;  /* Used to draw vertical bar for insertion
+                                * cursor. */
+    int cursorWidth;           /* Total width of insert cursor. */
+    int cursorBorderWidth;     /* Width of 3-D border around insert cursor. */
+    int cursorOnTime;          /* Number of milliseconds cursor should spend
+                                * in "on" state for each blink. */
+    int cursorOffTime;         /* Number of milliseconds cursor should spend
+                                * in "off" state for each blink. */
+    Tk_TimerToken cursorBlinkHandler;
+                               /* Timer handler used to blink cursor on and
+                                * off. */
+    int avgWidth;              /* Width of average character. */
+    int prefWidth;             /* Desired width of window, measured in
+                                * average characters. */
+    int offset;                        /* 0 if window is flat, or borderWidth if
+                                * raised or sunken. */
+    int leftIndex;             /* Index of left-most character visible in
+                                * window. */
+    int cursorPos;             /* Index of character before which next
+                                * typed character will be inserted. */
+
+    /*
+     * Information about what's selected, if any.
+     */
+
+    int selectFirst;           /* Index of first selected character (-1 means
+                                * nothing selected. */
+    int selectLast;            /* Index of last selected character (-1 means
+                                * nothing selected. */
+    int selectAnchor;          /* Fixed end of selection (i.e. "select to"
+                                * operation will use this as one end of the
+                                * selection). */
+    int exportSelection;       /* Non-zero means tie internal entry selection
+                                * to X selection. */
+
+    /*
+     * Information for scanning:
+     */
+
+    int scanMarkX;             /* X-position at which scan started (e.g.
+                                * button was pressed here). */
+    int scanMarkIndex;         /* Index of character that was at left of
+                                * window when scan started. */
+
+    /*
+     * Miscellaneous information:
+     */
+
+    Cursor cursor;             /* Current cursor for window, or None. */
+    char *scrollCmd;           /* Command prefix for communicating with
+                                * scrollbar(s).  Malloc'ed.  NULL means
+                                * no command to issue. */
+    int flags;                 /* Miscellaneous flags;  see below for
+                                * definitions. */
+} Entry;
+
+/*
+ * Assigned bits of "flags" fields of Entry structures, and what those
+ * bits mean:
+ *
+ * REDRAW_PENDING:             Non-zero means a DoWhenIdle handler has
+ *                             already been queued to redisplay the entry.
+ * BORDER_NEEDED:              Non-zero means 3-D border must be redrawn
+ *                             around window during redisplay.  Normally
+ *                             only text portion needs to be redrawn.
+ * CURSOR_ON:                  Non-zero means cursor is displayed at
+ *                             present.  0 means it isn't displayed.
+ * GOT_FOCUS:                  Non-zero means this window has the input
+ *                             focus.
+ */
+
+#define REDRAW_PENDING         1
+#define BORDER_NEEDED          2
+#define CURSOR_ON              4
+#define GOT_FOCUS              8
+
+/*
+ * Information used for argv parsing.
+ */
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_ENTRY_BG_COLOR, Tk_Offset(Entry, normalBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_ENTRY_BG_MONO, Tk_Offset(Entry, normalBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       DEF_ENTRY_BORDER_WIDTH, Tk_Offset(Entry, borderWidth), 0},
+    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",
+       DEF_ENTRY_CURSOR, Tk_Offset(Entry, cursor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_BORDER, "-cursorbackground", "cursorBackground", "Foreground",
+       DEF_ENTRY_CURSOR_BG, Tk_Offset(Entry, cursorBorder), 0},
+    {TK_CONFIG_PIXELS, "-cursorborderwidth", "cursorBorderWidth", "BorderWidth",
+       DEF_ENTRY_CURSOR_BD_COLOR, Tk_Offset(Entry, cursorBorderWidth),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_PIXELS, "-cursorborderwidth", "cursorBorderWidth", "BorderWidth",
+       DEF_ENTRY_CURSOR_BD_MONO, Tk_Offset(Entry, cursorBorderWidth),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_INT, "-cursorofftime", "cursorOffTime", "OffTime",
+       DEF_ENTRY_CURSOR_OFF_TIME, Tk_Offset(Entry, cursorOffTime), 0},
+    {TK_CONFIG_INT, "-cursorontime", "cursorOnTime", "OnTime",
+       DEF_ENTRY_CURSOR_ON_TIME, Tk_Offset(Entry, cursorOnTime), 0},
+    {TK_CONFIG_PIXELS, "-cursorwidth", "cursorWidth", "CursorWidth",
+       DEF_ENTRY_CURSOR_WIDTH, Tk_Offset(Entry, cursorWidth), 0},
+    {TK_CONFIG_BOOLEAN, "-exportselection", "exportSelection",
+       "ExportSelection", DEF_ENTRY_EXPORT_SELECTION,
+       Tk_Offset(Entry, exportSelection), 0},
+    {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_FONT, "-font", "font", "Font",
+       DEF_ENTRY_FONT, Tk_Offset(Entry, fontPtr), 0},
+    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",
+       DEF_ENTRY_FG, Tk_Offset(Entry, fgColorPtr), 0},
+    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
+       DEF_ENTRY_RELIEF, Tk_Offset(Entry, relief), 0},
+    {TK_CONFIG_STRING, "-scrollcommand", "scrollCommand", "ScrollCommand",
+       DEF_ENTRY_SCROLL_COMMAND, Tk_Offset(Entry, scrollCmd), 0},
+    {TK_CONFIG_BORDER, "-selectbackground", "selectBackground", "Foreground",
+       DEF_ENTRY_SELECT_COLOR, Tk_Offset(Entry, selBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-selectbackground", "selectBackground", "Foreground",
+       DEF_ENTRY_SELECT_MONO, Tk_Offset(Entry, selBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_PIXELS, "-selectborderwidth", "selectBorderWidth", "BorderWidth",
+       DEF_ENTRY_SELECT_BD_COLOR, Tk_Offset(Entry, selBorderWidth),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_PIXELS, "-selectborderwidth", "selectBorderWidth", "BorderWidth",
+       DEF_ENTRY_SELECT_BD_MONO, Tk_Offset(Entry, selBorderWidth),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_COLOR, "-selectforeground", "selectForeground", "Background",
+       DEF_ENTRY_SELECT_FG_COLOR, Tk_Offset(Entry, selFgColorPtr),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_COLOR, "-selectforeground", "selectForeground", "Background",
+       DEF_ENTRY_SELECT_FG_MONO, Tk_Offset(Entry, selFgColorPtr),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_UID, "-state", "state", "State",
+       DEF_ENTRY_STATE, Tk_Offset(Entry, state), 0},
+    {TK_CONFIG_STRING, "-textvariable", "textVariable", "Variable",
+       DEF_ENTRY_TEXT_VARIABLE, Tk_Offset(Entry, textVarName),
+       TK_CONFIG_NULL_OK},
+    {TK_CONFIG_INT, "-width", "width", "Width",
+       DEF_ENTRY_WIDTH, Tk_Offset(Entry, prefWidth), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Flags for GetEntryIndex procedure:
+ */
+
+#define ZERO_OK                        1
+#define LAST_PLUS_ONE_OK       2
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static int             ConfigureEntry _ANSI_ARGS_((Tcl_Interp *interp,
+                           Entry *entryPtr, int argc, char **argv,
+                           int flags));
+static void            DeleteChars _ANSI_ARGS_((Entry *entryPtr, int index,
+                           int count));
+static void            DestroyEntry _ANSI_ARGS_((ClientData clientData));
+static void            DisplayEntry _ANSI_ARGS_((ClientData clientData));
+static int             GetEntryIndex _ANSI_ARGS_((Tcl_Interp *interp,
+                           Entry *entryPtr, char *string, int *indexPtr));
+static void            InsertChars _ANSI_ARGS_((Entry *entryPtr, int index,
+                           char *string));
+static void            EntryBlinkProc _ANSI_ARGS_((ClientData clientData));
+static void            EntryEventProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static void            EntryFocusProc _ANSI_ARGS_ ((ClientData clientData,
+                           int gotFocus));
+static int             EntryFetchSelection _ANSI_ARGS_((ClientData clientData,
+                           int offset, char *buffer, int maxBytes));
+static void            EntryLostSelection _ANSI_ARGS_((
+                           ClientData clientData));
+static void            EventuallyRedraw _ANSI_ARGS_((Entry *entryPtr));
+static void            EntryScanTo _ANSI_ARGS_((Entry *entryPtr, int y));
+static void            EntrySetValue _ANSI_ARGS_((Entry *entryPtr,
+                           char *value));
+static void            EntrySelectTo _ANSI_ARGS_((
+                           Entry *entryPtr, int index));
+static char *          EntryTextVarProc _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, char *name1, char *name2,
+                           int flags));
+static void            EntryUpdateScrollbar _ANSI_ARGS_((Entry *entryPtr));
+static int             EntryWidgetCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_EntryCmd --
+ *
+ *     This procedure is invoked to process the "entry" Tcl
+ *     command.  See the user documentation for details on what
+ *     it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_EntryCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    register Entry *entryPtr;
+    Tk_Window new;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args:  should be \"",
+               argv[0], " pathName ?options?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], (char *) NULL);
+    if (new == NULL) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * Initialize the fields of the structure that won't be initialized
+     * by ConfigureEntry, or that ConfigureEntry requires to be
+     * initialized already (e.g. resource pointers).
+     */
+
+    entryPtr = (Entry *) ckalloc(sizeof(Entry));
+    entryPtr->tkwin = new;
+    entryPtr->interp = interp;
+    entryPtr->numChars = 0;
+    entryPtr->string = (char *) ckalloc(1);
+    entryPtr->string[0] = '\0';
+    entryPtr->textVarName = NULL;
+    entryPtr->state = tkNormalUid;
+    entryPtr->normalBorder = NULL;
+    entryPtr->fontPtr = NULL;
+    entryPtr->fgColorPtr = NULL;
+    entryPtr->textGC = None;
+    entryPtr->selBorder = NULL;
+    entryPtr->selFgColorPtr = NULL;
+    entryPtr->selTextGC = NULL;
+    entryPtr->cursorBorder = NULL;
+    entryPtr->cursorBlinkHandler = (Tk_TimerToken) NULL;
+    entryPtr->leftIndex = 0;
+    entryPtr->cursorPos = 0;
+    entryPtr->selectFirst = -1;
+    entryPtr->selectLast = -1;
+    entryPtr->selectAnchor = 0;
+    entryPtr->exportSelection = 1;
+    entryPtr->scanMarkX = 0;
+    entryPtr->cursor = None;
+    entryPtr->scrollCmd = NULL;
+    entryPtr->flags = 0;
+
+    Tk_SetClass(entryPtr->tkwin, "Entry");
+    Tk_CreateEventHandler(entryPtr->tkwin, ExposureMask|StructureNotifyMask,
+           EntryEventProc, (ClientData) entryPtr);
+    Tk_CreateSelHandler(entryPtr->tkwin, XA_STRING, EntryFetchSelection,
+           (ClientData) entryPtr, XA_STRING);
+    Tcl_CreateCommand(interp, Tk_PathName(entryPtr->tkwin), EntryWidgetCmd,
+           (ClientData) entryPtr, (void (*)()) NULL);
+    if (ConfigureEntry(interp, entryPtr, argc-2, argv+2, 0) != TCL_OK) {
+       goto error;
+    }
+    Tk_CreateFocusHandler(entryPtr->tkwin, EntryFocusProc,
+           (ClientData) entryPtr);
+
+    interp->result = Tk_PathName(entryPtr->tkwin);
+    return TCL_OK;
+
+    error:
+    Tk_DestroyWindow(entryPtr->tkwin);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * EntryWidgetCmd --
+ *
+ *     This procedure is invoked to process the Tcl command
+ *     that corresponds to a widget managed by this module.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+EntryWidgetCmd(clientData, interp, argc, argv)
+    ClientData clientData;             /* Information about entry widget. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    register Entry *entryPtr = (Entry *) clientData;
+    int result = TCL_OK;
+    int length;
+    char c;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    Tk_Preserve((ClientData) entryPtr);
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)
+           && (length >= 2)) {
+       if (argc == 2) {
+           result = Tk_ConfigureInfo(interp, entryPtr->tkwin, configSpecs,
+                   (char *) entryPtr, (char *) NULL, 0);
+       } else if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, entryPtr->tkwin, configSpecs,
+                   (char *) entryPtr, argv[2], 0);
+       } else {
+           result = ConfigureEntry(interp, entryPtr, argc-2, argv+2,
+                   TK_CONFIG_ARGV_ONLY);
+       }
+    } else if ((c == 'c') && (strncmp(argv[1], "cursor", length) == 0)
+           && (length >= 2)) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " cursor pos\"",
+                   (char *) NULL);
+           goto error;
+       }
+       if (GetEntryIndex(interp, entryPtr, argv[2], &entryPtr->cursorPos)
+               != TCL_OK) {
+           goto error;
+       }
+       EventuallyRedraw(entryPtr);
+    } else if ((c == 'd') && (strncmp(argv[1], "delete", length) == 0)) {
+       int first, last;
+
+       if ((argc < 3) || (argc > 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " delete firstIndex ?lastIndex?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       if (GetEntryIndex(interp, entryPtr, argv[2], &first) != TCL_OK) {
+           goto error;
+       }
+       if (argc == 3) {
+           last = first;
+       } else {
+           if (GetEntryIndex(interp, entryPtr, argv[3], &last) != TCL_OK) {
+               goto error;
+           }
+       }
+       if ((last >= first) && (entryPtr->state == tkNormalUid)) {
+           DeleteChars(entryPtr, first, last+1-first);
+       }
+    } else if ((c == 'g') && (strncmp(argv[1], "get", length) == 0)) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " get\"", (char *) NULL);
+           goto error;
+       }
+       interp->result = entryPtr->string;
+    } else if ((c == 'i') && (strncmp(argv[1], "index", length) == 0)
+           && (length >= 2)) {
+       int index;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " index string\"", (char *) NULL);
+           goto error;
+       }
+       if (GetEntryIndex(interp, entryPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       sprintf(interp->result, "%d", index);
+    } else if ((c == 'i') && (strncmp(argv[1], "insert", length) == 0)
+           && (length >= 2)) {
+       int index;
+
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " insert index text\"",
+                   (char *) NULL);
+           goto error;
+       }
+       if (GetEntryIndex(interp, entryPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if (entryPtr->state == tkNormalUid) {
+           InsertChars(entryPtr, index, argv[3]);
+       }
+    } else if ((c == 's') && (length >= 2)
+           && (strncmp(argv[1], "scan", length) == 0)) {
+       int x;
+
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " scan mark|dragto x\"", (char *) NULL);
+           goto error;
+       }
+       if (Tcl_GetInt(interp, argv[3], &x) != TCL_OK) {
+           goto error;
+       }
+       if ((argv[2][0] == 'm')
+               && (strncmp(argv[2], "mark", strlen(argv[2])) == 0)) {
+           entryPtr->scanMarkX = x;
+           entryPtr->scanMarkIndex = entryPtr->leftIndex;
+       } else if ((argv[2][0] == 'd')
+               && (strncmp(argv[2], "dragto", strlen(argv[2])) == 0)) {
+           EntryScanTo(entryPtr, x);
+       } else {
+           Tcl_AppendResult(interp, "bad scan option \"", argv[2],
+                   "\":  must be mark or dragto", (char *) NULL);
+           goto error;
+       }
+    } else if ((c == 's') && (length >= 2)
+           && (strncmp(argv[1], "select", length) == 0)) {
+       int index;
+
+       if (argc < 3) {
+           Tcl_AppendResult(interp, "too few args: should be \"",
+                   argv[0], " select option ?index?\"", (char *) NULL);
+           goto error;
+       }
+       length = strlen(argv[2]);
+       c = argv[2][0];
+       if ((c == 'c') && (argv[2] != NULL)
+               && (strncmp(argv[2], "clear", length) == 0)) {
+           if (argc != 3) {
+               Tcl_AppendResult(interp, "wrong # args: should be \"",
+                       argv[0], " select clear\"", (char *) NULL);
+               goto error;
+           }
+           if (entryPtr->selectFirst != -1) {
+               entryPtr->selectFirst = entryPtr->selectLast = -1;
+               EventuallyRedraw(entryPtr);
+           }
+           goto done;
+       }
+       if (argc >= 4) {
+           if (GetEntryIndex(interp, entryPtr, argv[3], &index) != TCL_OK) {
+               goto error;
+           }
+       }
+       if ((c == 'a') && (strncmp(argv[2], "adjust", length) == 0)) {
+           if (argc != 4) {
+               Tcl_AppendResult(interp, "wrong # args: should be \"",
+                       argv[0], " select adjust index\"",
+                       (char *) NULL);
+               goto error;
+           }
+           if (entryPtr->selectFirst >= 0) {
+               if (index < (entryPtr->selectFirst + entryPtr->selectLast)/2) {
+                   entryPtr->selectAnchor = entryPtr->selectLast + 1;
+               } else {
+                   entryPtr->selectAnchor = entryPtr->selectFirst;
+               }
+           }
+           EntrySelectTo(entryPtr, index);
+       } else if ((c == 'f') && (strncmp(argv[2], "from", length) == 0)) {
+           if (argc != 4) {
+               Tcl_AppendResult(interp, "wrong # args: should be \"",
+                       argv[0], " select from index\"",
+                       (char *) NULL);
+               goto error;
+           }
+           entryPtr->selectAnchor = index;
+       } else if ((c == 't') && (strncmp(argv[2], "to", length) == 0)) {
+           if (argc != 4) {
+               Tcl_AppendResult(interp, "wrong # args: should be \"",
+                       argv[0], " select to index\"",
+                       (char *) NULL);
+               goto error;
+           }
+           EntrySelectTo(entryPtr, index);
+       } else {
+           Tcl_AppendResult(interp, "bad select option \"", argv[2],
+                   "\": must be adjust, clear, from, or to", (char *) NULL);
+           goto error;
+       }
+    } else if ((c == 'v') && (strncmp(argv[1], "view", length) == 0)) {
+       int index;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " view index\"", (char *) NULL);
+           goto error;
+       }
+       if (GetEntryIndex(interp, entryPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if ((index >= entryPtr->numChars) && (index > 0)) {
+           index = entryPtr->numChars-1;
+       }
+       entryPtr->leftIndex = index;
+       EventuallyRedraw(entryPtr);
+       EntryUpdateScrollbar(entryPtr);
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\": must be configure, cursor, delete, get, index, ",
+               "insert, scan, select, or view", (char *) NULL);
+       goto error;
+    }
+    done:
+    Tk_Release((ClientData) entryPtr);
+    return result;
+
+    error:
+    Tk_Release((ClientData) entryPtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyEntry --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of an entry at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the entry is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyEntry(clientData)
+    ClientData clientData;                     /* Info about entry widget. */
+{
+    register Entry *entryPtr = (Entry *) clientData;
+
+    ckfree(entryPtr->string);
+    if (entryPtr->normalBorder != NULL) {
+       Tk_Free3DBorder(entryPtr->normalBorder);
+    }
+    if (entryPtr->textVarName != NULL) {
+       Tcl_UntraceVar(entryPtr->interp, entryPtr->textVarName,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               EntryTextVarProc, (ClientData) entryPtr);
+       ckfree(entryPtr->textVarName);
+    }
+    if (entryPtr->fontPtr != NULL) {
+       Tk_FreeFontStruct(entryPtr->fontPtr);
+    }
+    if (entryPtr->fgColorPtr != NULL) {
+       Tk_FreeColor(entryPtr->fgColorPtr);
+    }
+    if (entryPtr->textGC != None) {
+       Tk_FreeGC(entryPtr->textGC);
+    }
+    if (entryPtr->selBorder != NULL) {
+       Tk_Free3DBorder(entryPtr->selBorder);
+    }
+    if (entryPtr->selFgColorPtr != NULL) {
+       Tk_FreeColor(entryPtr->selFgColorPtr);
+    }
+    if (entryPtr->selTextGC != None) {
+       Tk_FreeGC(entryPtr->selTextGC);
+    }
+    if (entryPtr->cursorBorder != NULL) {
+       Tk_Free3DBorder(entryPtr->cursorBorder);
+    }
+    if (entryPtr->cursorBlinkHandler != NULL) {
+        Tk_DeleteTimerHandler(entryPtr->cursorBlinkHandler);
+       entryPtr->cursorBlinkHandler = NULL;
+    }
+    if (entryPtr->cursor != None) {
+       Tk_FreeCursor(entryPtr->cursor);
+    }
+    if (entryPtr->scrollCmd != NULL) {
+        ckfree(entryPtr->scrollCmd);
+    }
+    ckfree((char *) entryPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureEntry --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or reconfigure)
+ *     an entry widget.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information, such as colors, border width,
+ *     etc. get set for entryPtr;  old resources get freed,
+ *     if there were any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureEntry(interp, entryPtr, argc, argv, flags)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    register Entry *entryPtr;  /* Information about widget;  may or may
+                                * not already have values for some fields. */
+    int argc;                  /* Number of valid entries in argv. */
+    char **argv;               /* Arguments. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    XGCValues gcValues;
+    GC new;
+    int width, height, fontHeight, oldExport;
+
+    /*
+     * Eliminate any existing trace on a variable monitored by the entry.
+     */
+
+    if (entryPtr->textVarName != NULL) {
+       Tcl_UntraceVar(interp, entryPtr->textVarName, 
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               EntryTextVarProc, (ClientData) entryPtr);
+    }
+
+    oldExport = entryPtr->exportSelection;
+    if (Tk_ConfigureWidget(interp, entryPtr->tkwin, configSpecs,
+           argc, argv, (char *) entryPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * If the entry is tied to the value of a variable, then set up
+     * a trace on the variable's value, create the variable if it doesn't
+     * exist, and set the entry's value from the variable's value.
+     */
+
+    if (entryPtr->textVarName != NULL) {
+       char *value;
+
+       value = Tcl_GetVar(interp, entryPtr->textVarName, TCL_GLOBAL_ONLY);
+       if (value == NULL) {
+           Tcl_SetVar(interp, entryPtr->textVarName, entryPtr->string,
+                   TCL_GLOBAL_ONLY);
+       } else {
+           EntrySetValue(entryPtr, value);
+       }
+       Tcl_TraceVar(interp, entryPtr->textVarName,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               EntryTextVarProc, (ClientData) entryPtr);
+    }
+
+    /*
+     * A few other options also need special processing, such as parsing
+     * the geometry and setting the background from a 3-D border.
+     */
+
+    if ((entryPtr->state != tkNormalUid)
+           && (entryPtr->state != tkDisabledUid)) {
+       Tcl_AppendResult(interp, "bad state value \"", entryPtr->state,
+               "\":  must be normal or disabled", (char *) NULL);
+       entryPtr->state = tkNormalUid;
+       return TCL_ERROR;
+    }
+
+    Tk_SetBackgroundFromBorder(entryPtr->tkwin, entryPtr->normalBorder);
+
+    gcValues.foreground = entryPtr->fgColorPtr->pixel;
+    gcValues.font = entryPtr->fontPtr->fid;
+    gcValues.graphics_exposures = False;
+    new = Tk_GetGC(entryPtr->tkwin, GCForeground|GCFont|GCGraphicsExposures,
+           &gcValues);
+    if (entryPtr->textGC != None) {
+       Tk_FreeGC(entryPtr->textGC);
+    }
+    entryPtr->textGC = new;
+
+    gcValues.foreground = entryPtr->selFgColorPtr->pixel;
+    gcValues.font = entryPtr->fontPtr->fid;
+    new = Tk_GetGC(entryPtr->tkwin, GCForeground|GCFont, &gcValues);
+    if (entryPtr->selTextGC != None) {
+       Tk_FreeGC(entryPtr->selTextGC);
+    }
+    entryPtr->selTextGC = new;
+
+    if (entryPtr->cursorWidth > 2*entryPtr->fontPtr->min_bounds.width) {
+       entryPtr->cursorWidth = 2*entryPtr->fontPtr->min_bounds.width;
+       if (entryPtr->cursorWidth == 0) {
+           entryPtr->cursorWidth = 2;
+       }
+    }
+    if (entryPtr->cursorBorderWidth > entryPtr->cursorWidth/2) {
+       entryPtr->cursorBorderWidth = entryPtr->cursorWidth/2;
+    }
+
+    /*
+     * Restart the cursor timing sequence in case the on-time or off-time
+     * just changed.
+     */
+
+    if (entryPtr->flags & GOT_FOCUS) {
+       EntryFocusProc((ClientData) entryPtr, 1);
+    }
+
+    /*
+     * Claim the selection if we've suddenly started exporting it.
+     */
+
+    if (entryPtr->exportSelection && (!oldExport)
+           && (entryPtr->selectFirst != -1)) {
+       Tk_OwnSelection(entryPtr->tkwin, EntryLostSelection,
+               (ClientData) entryPtr);
+    }
+
+    /*
+     * Register the desired geometry for the window, and arrange for
+     * the window to be redisplayed.
+     */
+
+    fontHeight = entryPtr->fontPtr->ascent + entryPtr->fontPtr->descent;
+    entryPtr->avgWidth = XTextWidth(entryPtr->fontPtr, "0", 1);
+    width = entryPtr->prefWidth*entryPtr->avgWidth + (15*fontHeight)/10;
+    height = fontHeight + 2*entryPtr->borderWidth + 2;
+    Tk_GeometryRequest(entryPtr->tkwin, width, height);
+    Tk_SetInternalBorder(entryPtr->tkwin, entryPtr->borderWidth);
+    if (entryPtr->relief != TK_RELIEF_FLAT) {
+       entryPtr->offset = entryPtr->borderWidth;
+    } else {
+       entryPtr->offset = 0;
+    }
+    EventuallyRedraw(entryPtr);
+    EntryUpdateScrollbar(entryPtr);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayEntry --
+ *
+ *     This procedure redraws the contents of an entry window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information appears on the screen.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayEntry(clientData)
+    ClientData clientData;     /* Information about window. */
+{
+    register Entry *entryPtr = (Entry *) clientData;
+    register Tk_Window tkwin = entryPtr->tkwin;
+    int startX, baseY, selStartX, selEndX, index, cursorX;
+    int xBound, count;
+    Pixmap pixmap;
+
+    entryPtr->flags &= ~REDRAW_PENDING;
+    if ((entryPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
+       return;
+    }
+
+    /*
+     * In order to avoid screen flashes, this procedure redraws the
+     * textual area of the entry into off-screen memory, then copies
+     * it back on-screen in a single operation.  This means there's
+     * no point in time where the on-screen image has been cleared.
+     */
+
+    pixmap = XCreatePixmap(Tk_Display(tkwin), Tk_WindowId(tkwin),
+           Tk_Width(tkwin), Tk_Height(tkwin),
+           Tk_DefaultDepth(Tk_Screen(tkwin)));
+
+    /*
+     * Compute x-coordinate of the "leftIndex" character, plus limit
+     * of visible x-coordinates (actually, pixel just after last visible
+     * one), plus vertical position of baseline of text.
+     */
+
+    startX = entryPtr->offset;
+    xBound = Tk_Width(tkwin) - entryPtr->offset;
+    baseY = (Tk_Height(tkwin) + entryPtr->fontPtr->ascent
+           - entryPtr->fontPtr->descent)/2;
+
+    /*
+     * Draw the background in three layers.  From bottom to top the
+     * layers are:  normal background, selection background, and
+     * insertion cursor background.
+     */
+
+    Tk_Fill3DRectangle(Tk_Display(tkwin), pixmap, entryPtr->normalBorder,
+           0, 0, Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT);
+
+    if (entryPtr->selectLast >= entryPtr->leftIndex) {
+       if (entryPtr->selectFirst <= entryPtr->leftIndex) {
+           selStartX = startX;
+           index = entryPtr->leftIndex;
+       } else {
+           (void) TkMeasureChars(entryPtr->fontPtr,
+                   entryPtr->string+entryPtr->leftIndex,
+                   entryPtr->selectFirst - entryPtr->leftIndex, startX,
+                   xBound, TK_PARTIAL_OK|TK_NEWLINES_NOT_SPECIAL, &selStartX);
+           index = entryPtr->selectFirst;
+       }
+       if (selStartX < xBound) {
+           (void) TkMeasureChars(entryPtr->fontPtr,
+                   entryPtr->string + index, entryPtr->selectLast +1 - index,
+                   selStartX, xBound, TK_PARTIAL_OK|TK_NEWLINES_NOT_SPECIAL,
+                   &selEndX);
+           Tk_Fill3DRectangle(Tk_Display(tkwin), pixmap, entryPtr->selBorder,
+                   selStartX - entryPtr->selBorderWidth,
+                   baseY - entryPtr->fontPtr->ascent
+                           - entryPtr->selBorderWidth,
+                   (selEndX - selStartX) + 2*entryPtr->selBorderWidth,
+                   entryPtr->fontPtr->ascent + entryPtr->fontPtr->descent
+                           + 2*entryPtr->selBorderWidth,
+                   entryPtr->selBorderWidth, TK_RELIEF_RAISED);
+       } else {
+           selEndX = xBound;
+       }
+    }
+
+    /*
+     * Draw a special background for the insertion cursor, overriding
+     * even the selection background.  As a special workaround to keep the
+     * cursor visible on mono displays, write background in the cursor
+     * area (instead of nothing) when the cursor isn't on.  Otherwise
+     * the selection would hide the cursor.
+     */
+
+    if ((entryPtr->cursorPos >= entryPtr->leftIndex)
+           && (entryPtr->state == tkNormalUid)
+           && (entryPtr->flags & GOT_FOCUS)) {
+       (void) TkMeasureChars(entryPtr->fontPtr,
+               entryPtr->string + entryPtr->leftIndex,
+               entryPtr->cursorPos - entryPtr->leftIndex, startX,
+               xBound, TK_PARTIAL_OK|TK_NEWLINES_NOT_SPECIAL, &cursorX);
+       if (cursorX < xBound) {
+           if (entryPtr->flags & CURSOR_ON) {
+               Tk_Fill3DRectangle(Tk_Display(tkwin), pixmap,
+                       entryPtr->cursorBorder,
+                       cursorX - (entryPtr->cursorWidth)/2,
+                       baseY - entryPtr->fontPtr->ascent,
+                       entryPtr->cursorWidth,
+                       entryPtr->fontPtr->ascent + entryPtr->fontPtr->descent,
+                       entryPtr->cursorBorderWidth, TK_RELIEF_RAISED);
+           } else if (Tk_DefaultDepth(Tk_Screen(tkwin)) == 1) {
+               Tk_Fill3DRectangle(Tk_Display(tkwin), pixmap,
+                       entryPtr->normalBorder,
+                       cursorX - (entryPtr->cursorWidth)/2,
+                       baseY - entryPtr->fontPtr->ascent,
+                       entryPtr->cursorWidth,
+                       entryPtr->fontPtr->ascent + entryPtr->fontPtr->descent,
+                       0, TK_RELIEF_FLAT);
+           }
+       }
+    }
+
+    /*
+     * Draw the text in three pieces:  first the piece to the left of
+     * the selection, then the selection, then the piece to the right
+     * of the selection.
+     */
+
+    if (entryPtr->selectLast < entryPtr->leftIndex) {
+       TkDisplayChars(Tk_Display(tkwin), pixmap, entryPtr->textGC,
+               entryPtr->fontPtr, entryPtr->string + entryPtr->leftIndex,
+               entryPtr->numChars - entryPtr->leftIndex, startX, baseY,
+               TK_NEWLINES_NOT_SPECIAL);
+    } else {
+       count = entryPtr->selectFirst - entryPtr->leftIndex;
+       if (count > 0) {
+           TkDisplayChars(Tk_Display(tkwin), pixmap, entryPtr->textGC,
+                   entryPtr->fontPtr, entryPtr->string + entryPtr->leftIndex,
+                   count, startX, baseY, TK_NEWLINES_NOT_SPECIAL);
+           index = entryPtr->selectFirst;
+       } else {
+           index = entryPtr->leftIndex;
+       }
+       count = entryPtr->selectLast + 1 - index;
+       if ((selStartX < xBound) && (count > 0)) {
+           TkDisplayChars(Tk_Display(tkwin), pixmap, entryPtr->selTextGC,
+                   entryPtr->fontPtr, entryPtr->string + index, count,
+                   selStartX, baseY, TK_NEWLINES_NOT_SPECIAL);
+       }
+       count = entryPtr->numChars - entryPtr->selectLast - 1;
+       if ((selEndX < xBound) && (count > 0)) {
+           TkDisplayChars(Tk_Display(tkwin), pixmap, entryPtr->textGC,
+                   entryPtr->fontPtr,
+                   entryPtr->string + entryPtr->selectLast + 1,
+                   count, selEndX, baseY, TK_NEWLINES_NOT_SPECIAL);
+       }
+    }
+
+    /*
+     * Draw the border last, so it will overwrite any text that extends
+     * past the viewable part of the window.
+     */
+
+    if (entryPtr->relief != TK_RELIEF_FLAT) {
+       Tk_Draw3DRectangle(Tk_Display(tkwin), pixmap,
+               entryPtr->normalBorder, 0, 0, Tk_Width(tkwin),
+               Tk_Height(tkwin), entryPtr->borderWidth,
+               entryPtr->relief);
+    }
+
+    /*
+     * Everything's been redisplayed;  now copy the pixmap onto the screen
+     * and free up the pixmap.
+     */
+
+    XCopyArea(Tk_Display(tkwin), pixmap, Tk_WindowId(tkwin), entryPtr->textGC,
+           0, 0, Tk_Width(tkwin), Tk_Height(tkwin), 0, 0);
+    XFreePixmap(Tk_Display(tkwin), pixmap);
+    entryPtr->flags &= ~BORDER_NEEDED;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * InsertChars --
+ *
+ *     Add new characters to an entry widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     New information gets added to entryPtr;  it will be redisplayed
+ *     soon, but not necessarily immediately.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+InsertChars(entryPtr, index, string)
+    register Entry *entryPtr;  /* Entry that is to get the new
+                                * elements. */
+    int index;                 /* Add the new elements before this
+                                * element. */
+    char *string;              /* New characters to add (NULL-terminated
+                                * string). */
+{
+    int length;
+    char *new;
+
+    length = strlen(string);
+    if (length == 0) {
+       return;
+    }
+    new = (char *) ckalloc((unsigned) (entryPtr->numChars + length + 1));
+    strncpy(new, entryPtr->string, index);
+    strcpy(new+index, string);
+    strcpy(new+index+length, entryPtr->string+index);
+    ckfree(entryPtr->string);
+    entryPtr->string = new;
+    entryPtr->numChars += length;
+
+    /*
+     * Inserting characters invalidates all indexes into the string.
+     * Touch up the indexes so that they still refer to the same
+     * characters (at new positions).
+     */
+
+    if (entryPtr->selectFirst >= index) {
+       entryPtr->selectFirst += length;
+    }
+    if (entryPtr->selectLast >= index) {
+       entryPtr->selectLast += length;
+    }
+    if (entryPtr->selectAnchor >= index) {
+       entryPtr->selectAnchor += length;
+    }
+    if (entryPtr->leftIndex > index) {
+       entryPtr->leftIndex += length;
+    }
+    if (entryPtr->cursorPos >= index) {
+       entryPtr->cursorPos += length;
+    }
+
+    if (entryPtr->textVarName != NULL) {
+       Tcl_SetVar(entryPtr->interp, entryPtr->textVarName, entryPtr->string,
+               TCL_GLOBAL_ONLY);
+    }
+    EventuallyRedraw(entryPtr);
+    EntryUpdateScrollbar(entryPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DeleteChars --
+ *
+ *     Remove one or more characters from an entry widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Memory gets freed, the entry gets modified and (eventually)
+ *     redisplayed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DeleteChars(entryPtr, index, count)
+    register Entry *entryPtr;  /* Entry widget to modify. */
+    int index;                 /* Index of first character to delete. */
+    int count;                 /* How many characters to delete. */
+{
+    char *new;
+
+    if ((index + count) > entryPtr->numChars) {
+       count = entryPtr->numChars - index;
+    }
+    if (count <= 0) {
+       return;
+    }
+
+    new = (char *) ckalloc((unsigned) (entryPtr->numChars + 1 - count));
+    strncpy(new, entryPtr->string, index);
+    strcpy(new+index, entryPtr->string+index+count);
+    ckfree(entryPtr->string);
+    entryPtr->string = new;
+    entryPtr->numChars -= count;
+
+    /*
+     * Deleting characters results in the remaining characters being
+     * renumbered.  Update the various indexes into the string to reflect
+     * this change.
+     */
+    if (entryPtr->selectFirst >= index) {
+       if (entryPtr->selectFirst >= (index+count)) {
+           entryPtr->selectFirst -= count;
+       } else {
+           entryPtr->selectFirst = index;
+       }
+    }
+    if (entryPtr->selectLast >= index) {
+       if (entryPtr->selectLast >= (index+count)) {
+           entryPtr->selectLast -= count;
+       } else {
+           entryPtr->selectLast = index-1;
+       }
+    }
+    if (entryPtr->selectLast < entryPtr->selectFirst) {
+       entryPtr->selectFirst = entryPtr->selectLast = -1;
+    }
+    if (entryPtr->selectAnchor >= index) {
+       if (entryPtr->selectAnchor >= (index+count)) {
+           entryPtr->selectAnchor -= count;
+       } else {
+           entryPtr->selectAnchor = index;
+       }
+    }
+    if (entryPtr->leftIndex > index) {
+       if (entryPtr->leftIndex >= (index+count)) {
+           entryPtr->leftIndex -= count;
+       } else {
+           entryPtr->leftIndex = index;
+       }
+    }
+    if (entryPtr->cursorPos >= index) {
+       if (entryPtr->cursorPos >= (index+count)) {
+           entryPtr->cursorPos -= count;
+       } else {
+           entryPtr->cursorPos = index;
+       }
+    }
+
+    if (entryPtr->textVarName != NULL) {
+       Tcl_SetVar(entryPtr->interp, entryPtr->textVarName, entryPtr->string,
+               TCL_GLOBAL_ONLY);
+    }
+    EventuallyRedraw(entryPtr);
+    EntryUpdateScrollbar(entryPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * EntrySetValue --
+ *
+ *     Replace the contents of a text entry with a given value.  This
+ *     procedure is invoked when updating the entry from the entry's
+ *     associated variable.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The string displayed in the entry will change.  Any selection
+ *     in the entry is lost and the insertion point gets set to the
+ *     end of the entry.  Note: this procedure does *not* update the
+ *     entry's associated variable, since that could result in an
+ *     infinite loop.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+EntrySetValue(entryPtr, value)
+    register Entry *entryPtr;          /* Entry whose value is to be
+                                        * changed. */
+    char *value;                       /* New text to display in entry. */
+{
+    ckfree(entryPtr->string);
+    entryPtr->numChars = strlen(value);
+    entryPtr->string = (char *) ckalloc((unsigned) (entryPtr->numChars + 1));
+    strcpy(entryPtr->string, value);
+    entryPtr->selectFirst = entryPtr->selectLast = -1;
+    entryPtr->leftIndex = 0;
+    entryPtr->cursorPos = entryPtr->numChars;
+
+    EventuallyRedraw(entryPtr);
+    EntryUpdateScrollbar(entryPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * EntryEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher for various
+ *     events on entryes.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the window gets deleted, internal structures get
+ *     cleaned up.  When it gets exposed, it is redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+EntryEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    XEvent *eventPtr;          /* Information about event. */
+{
+    Entry *entryPtr = (Entry *) clientData;
+    if (eventPtr->type == Expose) {
+       EventuallyRedraw(entryPtr);
+       entryPtr->flags |= BORDER_NEEDED;
+    } else if (eventPtr->type == DestroyNotify) {
+       Tcl_DeleteCommand(entryPtr->interp, Tk_PathName(entryPtr->tkwin));
+       entryPtr->tkwin = NULL;
+       if (entryPtr->flags & REDRAW_PENDING) {
+           Tk_CancelIdleCall(DisplayEntry, (ClientData) entryPtr);
+       }
+       Tk_EventuallyFree((ClientData) entryPtr, DestroyEntry);
+    } else if (eventPtr->type == ConfigureNotify) {
+       Tk_Preserve((ClientData) entryPtr);
+       EventuallyRedraw(entryPtr);
+       EntryUpdateScrollbar(entryPtr);
+       Tk_Release((ClientData) entryPtr);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * GetEntryIndex --
+ *
+ *     Parse an index into an entry and return either its value
+ *     or an error.
+ *
+ * Results:
+ *     A standard Tcl result.  If all went well, then *indexPtr is
+ *     filled in with the index (into entryPtr) corresponding to
+ *     string.  The index value is guaranteed to lie between 0 and
+ *     the number of characters in the string, inclusive.  If an
+ *     error occurs then an error message is left in interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+GetEntryIndex(interp, entryPtr, string, indexPtr)
+    Tcl_Interp *interp;                /* For error messages. */
+    Entry *entryPtr;           /* Entry for which the index is being
+                                * specified. */
+    char *string;              /* Specifies character in entryPtr. */
+    int *indexPtr;             /* Where to store converted index. */
+{
+    int length;
+
+    length = strlen(string);
+
+    if (string[0] == 'e') {
+       if (strncmp(string, "end", length) == 0) {
+           *indexPtr = entryPtr->numChars;
+       } else {
+           badIndex:
+
+           /*
+            * Some of the paths here leave messages in interp->result,
+            * so we have to clear it out before storing our own message.
+            */
+
+           Tcl_SetResult(interp, (char *) NULL, TCL_STATIC);
+           Tcl_AppendResult(interp, "bad entry index \"", string,
+                   "\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+    } else if (string[0] == 'c') {
+       if (strncmp(string, "cursor", length) == 0) {
+           *indexPtr = entryPtr->cursorPos;
+       } else {
+           goto badIndex;
+       }
+    } else if (string[0] == 's') {
+       if (entryPtr->selectFirst == -1) {
+           interp->result = "selection isn't in entry";
+           return TCL_ERROR;
+       }
+       if (length < 5) {
+           goto badIndex;
+       }
+       if (strncmp(string, "sel.first", length) == 0) {
+           *indexPtr = entryPtr->selectFirst;
+       } else if (strncmp(string, "sel.last", length) == 0) {
+           *indexPtr = entryPtr->selectLast;
+       } else {
+           goto badIndex;
+       }
+    } else if (string[0] == '@') {
+       int x, dummy;
+
+       if (Tcl_GetInt(interp, string+1, &x) != TCL_OK) {
+           goto badIndex;
+       }
+       if (entryPtr->numChars == 0) {
+           *indexPtr = 0;
+       } else {
+           *indexPtr = entryPtr->leftIndex + TkMeasureChars(entryPtr->fontPtr,
+                   entryPtr->string + entryPtr->leftIndex,
+                   entryPtr->numChars - entryPtr->leftIndex,
+                   entryPtr->offset, x, TK_NEWLINES_NOT_SPECIAL, &dummy);
+       }
+    } else {
+       if (Tcl_GetInt(interp, string, indexPtr) != TCL_OK) {
+           goto badIndex;
+       }
+       if (*indexPtr < 0){
+           *indexPtr = 0;
+       } else if (*indexPtr > entryPtr->numChars) {
+           *indexPtr = entryPtr->numChars;
+       }
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * EntryScanTo --
+ *
+ *     Given a y-coordinate (presumably of the curent mouse location)
+ *     drag the view in the window to implement the scan operation.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The view in the window may change.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+EntryScanTo(entryPtr, x)
+    register Entry *entryPtr;          /* Information about widget. */
+    int x;                             /* X-coordinate to use for scan
+                                        * operation. */
+{
+    int newLeftIndex;
+
+    /*
+     * Compute new leftIndex for entry by amplifying the difference
+     * between the current position and the place where the scan
+     * started (the "mark" position).  If we run off the left or right
+     * side of the entry, then reset the mark point so that the current
+     * position continues to correspond to the edge of the window.
+     * This means that the picture will start dragging as soon as the
+     * mouse reverses direction (without this reset, might have to slide
+     * mouse a long ways back before the picture starts moving again).
+     */
+
+    newLeftIndex = entryPtr->scanMarkIndex
+           - (10*(x - entryPtr->scanMarkX))/entryPtr->avgWidth;
+    if (newLeftIndex >= entryPtr->numChars) {
+       newLeftIndex = entryPtr->scanMarkIndex = entryPtr->numChars-1;
+       entryPtr->scanMarkX = x;
+    }
+    if (newLeftIndex < 0) {
+       newLeftIndex = entryPtr->scanMarkIndex = 0;
+       entryPtr->scanMarkX = x;
+    } 
+    if (newLeftIndex != entryPtr->leftIndex) {
+       entryPtr->leftIndex = newLeftIndex;
+       EventuallyRedraw(entryPtr);
+       EntryUpdateScrollbar(entryPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * EntrySelectTo --
+ *
+ *     Modify the selection by moving its un-anchored end.  This could
+ *     make the selection either larger or smaller.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The selection changes.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+EntrySelectTo(entryPtr, index)
+    register Entry *entryPtr;          /* Information about widget. */
+    int index;                         /* Index of element that is to
+                                        * become the "other" end of the
+                                        * selection. */
+{
+    int newFirst, newLast;
+
+    /*
+     * Grab the selection if we don't own it already.
+     */
+
+    if ((entryPtr->selectFirst == -1) && (entryPtr->exportSelection)) {
+       Tk_OwnSelection(entryPtr->tkwin, EntryLostSelection,
+               (ClientData) entryPtr);
+    }
+
+    if (index < 0) {
+       index = 0;
+    }
+    if (index >= entryPtr->numChars) {
+       index = entryPtr->numChars-1;
+    }
+    if (entryPtr->selectAnchor > entryPtr->numChars) {
+       entryPtr->selectAnchor = entryPtr->numChars;
+    }
+    if (entryPtr->selectAnchor <= index) {
+       newFirst = entryPtr->selectAnchor;
+       newLast = index;
+    } else {
+       newFirst = index;
+       newLast = entryPtr->selectAnchor - 1;
+       if (newLast < 0) {
+           newFirst = newLast = -1;
+       }
+    }
+    if ((entryPtr->selectFirst == newFirst)
+           && (entryPtr->selectLast == newLast)) {
+       return;
+    }
+    entryPtr->selectFirst = newFirst;
+    entryPtr->selectLast = newLast;
+    EventuallyRedraw(entryPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * EntryFetchSelection --
+ *
+ *     This procedure is called back by Tk when the selection is
+ *     requested by someone.  It returns part or all of the selection
+ *     in a buffer provided by the caller.
+ *
+ * Results:
+ *     The return value is the number of non-NULL bytes stored
+ *     at buffer.  Buffer is filled (or partially filled) with a
+ *     NULL-terminated string containing part or all of the selection,
+ *     as given by offset and maxBytes.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+EntryFetchSelection(clientData, offset, buffer, maxBytes)
+    ClientData clientData;             /* Information about entry widget. */
+    int offset;                                /* Offset within selection of first
+                                        * character to be returned. */
+    char *buffer;                      /* Location in which to place
+                                        * selection. */
+    int maxBytes;                      /* Maximum number of bytes to place
+                                        * at buffer, not including terminating
+                                        * NULL character. */
+{
+    Entry *entryPtr = (Entry *) clientData;
+    int count;
+
+    if ((entryPtr->selectFirst < 0) || !(entryPtr->exportSelection)) {
+       return -1;
+    }
+    count = entryPtr->selectLast + 1 - entryPtr->selectFirst - offset;
+    if (count > maxBytes) {
+       count = maxBytes;
+    }
+    if (count <= 0) {
+       return 0;
+    }
+    strncpy(buffer, entryPtr->string + entryPtr->selectFirst + offset, count);
+    buffer[count] = '\0';
+    return count;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * EntryLostSelection --
+ *
+ *     This procedure is called back by Tk when the selection is
+ *     grabbed away from an entry widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The existing selection is unhighlighted, and the window is
+ *     marked as not containing a selection.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+EntryLostSelection(clientData)
+    ClientData clientData;             /* Information about entry widget. */
+{
+    Entry *entryPtr = (Entry *) clientData;
+
+    if ((entryPtr->selectFirst != -1) && entryPtr->exportSelection) {
+       entryPtr->selectFirst = -1;
+       entryPtr->selectLast = -1;
+       EventuallyRedraw(entryPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * EventuallyRedraw --
+ *
+ *     Ensure that an entry is eventually redrawn on the display.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information gets redisplayed.  Right now we don't do selective
+ *     redisplays:  the whole window will be redrawn.  This doesn't
+ *     seem to hurt performance noticeably, but if it does then this
+ *     could be changed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+EventuallyRedraw(entryPtr)
+    register Entry *entryPtr;          /* Information about widget. */
+{
+    if ((entryPtr->tkwin == NULL) || !Tk_IsMapped(entryPtr->tkwin)) {
+       return;
+    }
+
+    /*
+     * Right now we don't do selective redisplays:  the whole window
+     * will be redrawn.  This doesn't seem to hurt performance noticeably,
+     * but if it does then this could be changed.
+     */
+
+    if (!(entryPtr->flags & REDRAW_PENDING)) {
+       entryPtr->flags |= REDRAW_PENDING;
+       Tk_DoWhenIdle(DisplayEntry, (ClientData) entryPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * EntryUpdateScrollbar --
+ *
+ *     This procedure is invoked whenever information has changed in
+ *     an entry in a way that would invalidate a scrollbar display.
+ *     If there is an associated scrollbar, then this command updates
+ *     it by invoking a Tcl command.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A Tcl command is invoked, and an additional command may be
+ *     invoked to process errors in the command.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+EntryUpdateScrollbar(entryPtr)
+    register Entry *entryPtr;          /* Information about widget. */
+{
+    char args[100];
+    int result, last, charsInWindow, endX;
+
+    if (entryPtr->scrollCmd == NULL) {
+       return;
+    }
+
+    /*
+     * The most painful part here is guessing how many characters
+     * actually fit in the window.  This is only an estimate in the
+     * case where the window isn't completely filled with characters.
+     */
+
+    charsInWindow = TkMeasureChars(entryPtr->fontPtr,
+           entryPtr->string + entryPtr->leftIndex,
+           entryPtr->numChars - entryPtr->leftIndex, entryPtr->offset,
+           Tk_Width(entryPtr->tkwin),
+           TK_AT_LEAST_ONE|TK_NEWLINES_NOT_SPECIAL, &endX);
+    if (charsInWindow == 0) {
+       last = entryPtr->leftIndex;
+    } else {
+       last = entryPtr->leftIndex + charsInWindow - 1;
+    }
+    if (endX < Tk_Width(entryPtr->tkwin)) {
+       charsInWindow += (Tk_Width(entryPtr->tkwin) - endX)/entryPtr->avgWidth;
+    }
+    sprintf(args, " %d %d %d %d", entryPtr->numChars, charsInWindow,
+           entryPtr->leftIndex, last);
+    result = Tcl_VarEval(entryPtr->interp, entryPtr->scrollCmd, args,
+           (char *) NULL);
+    if (result != TCL_OK) {
+       TkBindError(entryPtr->interp);
+    }
+    Tcl_SetResult(entryPtr->interp, (char *) NULL, TCL_STATIC);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * EntryBlinkProc --
+ *
+ *     This procedure is called as a timer handler to blink the
+ *     insertion cursor off and on.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The cursor gets turned on or off, redisplay gets invoked,
+ *     and this procedure reschedules itself.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+EntryBlinkProc(clientData)
+    ClientData clientData;     /* Pointer to record describing entry. */
+{
+    register Entry *entryPtr = (Entry *) clientData;
+
+    if (!(entryPtr->flags & GOT_FOCUS) || (entryPtr->cursorOffTime == 0)) {
+       return;
+    }
+    if (entryPtr->flags & CURSOR_ON) {
+       entryPtr->flags &= ~CURSOR_ON;
+       entryPtr->cursorBlinkHandler = Tk_CreateTimerHandler(
+               entryPtr->cursorOffTime, EntryBlinkProc, (ClientData) entryPtr);
+    } else {
+       entryPtr->flags |= CURSOR_ON;
+       entryPtr->cursorBlinkHandler = Tk_CreateTimerHandler(
+               entryPtr->cursorOnTime, EntryBlinkProc, (ClientData) entryPtr);
+    }
+    EventuallyRedraw(entryPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * EntryFocusProc --
+ *
+ *     This procedure is called whenever the entry gets or loses the
+ *     input focus.  It's also called whenever the window is reconfigured
+ *     while it has the focus.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The cursor gets turned on or off.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+EntryFocusProc(clientData, gotFocus)
+    ClientData clientData;     /* Pointer to structure describing entry. */
+    int gotFocus;              /* 1 means window is getting focus, 0 means
+                                * it's losing it. */
+{
+    register Entry *entryPtr = (Entry *) clientData;
+
+    if (entryPtr->cursorBlinkHandler != NULL) {
+      Tk_DeleteTimerHandler(entryPtr->cursorBlinkHandler);
+      entryPtr->cursorBlinkHandler = NULL;
+    }
+    if (gotFocus) {
+       entryPtr->flags |= GOT_FOCUS | CURSOR_ON;
+       if (entryPtr->cursorOffTime != 0) {
+           entryPtr->cursorBlinkHandler = Tk_CreateTimerHandler(
+                   entryPtr->cursorOnTime, EntryBlinkProc,
+                   (ClientData) entryPtr);
+       }
+    } else {
+       entryPtr->flags &= ~(GOT_FOCUS | CURSOR_ON);
+       entryPtr->cursorBlinkHandler = (Tk_TimerToken) NULL;
+    }
+    EventuallyRedraw(entryPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * EntryTextVarProc --
+ *
+ *     This procedure is invoked when someone changes the variable
+ *     whose contents are to be displayed in an entry.
+ *
+ * Results:
+ *     NULL is always returned.
+ *
+ * Side effects:
+ *     The text displayed in the entry will change to match the
+ *     variable.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static char *
+EntryTextVarProc(clientData, interp, name1, name2, flags)
+    ClientData clientData;     /* Information about button. */
+    Tcl_Interp *interp;                /* Interpreter containing variable. */
+    char *name1;               /* Name of variable. */
+    char *name2;               /* Second part of variable name. */
+    int flags;                 /* Information about what happened. */
+{
+    register Entry *entryPtr = (Entry *) clientData;
+    char *value;
+
+    /*
+     * If the variable is unset, then immediately recreate it unless
+     * the whole interpreter is going away.
+     */
+
+    if (flags & TCL_TRACE_UNSETS) {
+       if ((flags & TCL_TRACE_DESTROYED) && !(flags & TCL_INTERP_DESTROYED)) {
+           Tcl_SetVar2(interp, name1, name2, entryPtr->string,
+                   flags & TCL_GLOBAL_ONLY);
+           Tcl_TraceVar2(interp, name1, name2,
+                   TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+                   EntryTextVarProc, clientData);
+       }
+       return (char *) NULL;
+    }
+
+    /*
+     * Update the entry's text with the value of the variable, unless
+     * the entry already has that value (this happens when the variable
+     * changes value because we changed it because someone typed in
+     * the entry).
+     */
+
+    value = Tcl_GetVar2(interp, name1, name2, flags & TCL_GLOBAL_ONLY);
+    if (value == NULL) {
+       value = "";
+    }
+    if (strcmp(value, entryPtr->string) != 0) {
+       EntrySetValue(entryPtr, value);
+    }
+    return (char *) NULL;
+}
diff --git a/src/tk/tkerror.c b/src/tk/tkerror.c
new file mode 100644 (file)
index 0000000..a58814c
--- /dev/null
@@ -0,0 +1,294 @@
+/* 
+ * tkError.c --
+ *
+ *     This file provides a high-performance mechanism for
+ *     selectively dealing with errors that occur in talking
+ *     to the X server.  This is useful, for example, when
+ *     communicating with a window that may not exist.
+ *
+ * Copyright 1990 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkError.c,v 1.10 92/04/12 17:02:08 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tkint.h"
+
+static initialized = 0;
+
+/*
+ * Forward references to procedures declared later in this file:
+ */
+
+static int     ErrorProc _ANSI_ARGS_((Display *display,
+                   XErrorEvent *errEventPtr));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_CreateErrorHandler --
+ *
+ *     Arrange for all a given procedure to be invoked whenever
+ *     certain errors occur.
+ *
+ * Results:
+ *     The return value is a token identifying the handler;
+ *     it must be passed to Tk_DeleteErrorHandler to delete the
+ *     handler.
+ *
+ * Side effects:
+ *     If an X error occurs that matches the error, request,
+ *     and minor arguments, then errorProc will be invoked.
+ *     ErrorProc should have the following structure:
+ *
+ *     int
+ *     errorProc(clientData, errorEventPtr)
+ *         caddr_t clientData;
+ *         XErrorEvent *errorEventPtr;
+ *     {
+ *     }
+ *
+ *     The clientData argument will be the same as the clientData
+ *     argument to this procedure, and errorEvent will describe
+ *     the error.  If errorProc returns 0, it means that it
+ *     completely "handled" the error:  no further processing
+ *     should be done.  If errorProc returns 1, it means that it
+ *     didn't know how to deal with the error, so we should look
+ *     for other error handlers, or invoke the default error
+ *     handler if no other handler returns zero.  Handlers are
+ *     invoked in order of age:  youngest handler first.
+ *
+ *     Note:  errorProc will only be called for errors associated
+ *     with X requests made AFTER this call, but BEFORE the handler
+ *     is deleted by calling Tk_DeleteErrorHandler.
+ *
+ *--------------------------------------------------------------
+ */
+
+Tk_ErrorHandler
+Tk_CreateErrorHandler(display, error, request, minorCode, errorProc, clientData)
+    Display *display;          /* Display for which to handle
+                                * errors. */
+    int error;                 /* Consider only errors with this
+                                * error_code (-1 means consider
+                                * all errors). */
+    int request;               /* Consider only errors with this
+                                * major request code (-1 means
+                                * consider all major codes). */
+    int minorCode;             /* Consider only errors with this
+                                * minor request code (-1 means
+                                * consider all minor codes). */
+    Tk_ErrorProc *errorProc;   /* Procedure to invoke when a
+                                * matching error occurs.  NULL means
+                                * just ignore matching errors. */
+    ClientData clientData;     /* Arbitrary value to pass to
+                                * errorProc. */
+{
+    register TkErrorHandler *errorPtr;
+    register TkDisplay *dispPtr;
+
+    /*
+     * Make sure that X calls us whenever errors occur.
+     */
+
+    if (!initialized) {
+       XSetErrorHandler(ErrorProc);
+       initialized = 1;
+    }
+
+    /*
+     * Find the display.  If Tk doesn't know about this display,
+     * it's an error:  panic.
+     */
+
+    for (dispPtr = tkDisplayList; ; dispPtr = dispPtr->nextPtr) {
+       if (dispPtr->display == display) {
+           break;
+       }
+       if (dispPtr == NULL) {
+           panic("Unknown display passed to Tk_CreateErrorHandler");
+       }
+    }
+
+    /*
+     * Create the handler record.
+     */
+
+    errorPtr = (TkErrorHandler *) ckalloc(sizeof(TkErrorHandler));
+    errorPtr->dispPtr = dispPtr;
+    errorPtr->firstRequest = NextRequest(display);
+    errorPtr->lastRequest = -1;
+    errorPtr->error = error;
+    errorPtr->request = request;
+    errorPtr->minorCode = minorCode;
+    errorPtr->errorProc = errorProc;
+    errorPtr->clientData = clientData;
+    errorPtr->nextPtr = dispPtr->errorPtr;
+    dispPtr->errorPtr = errorPtr;
+
+    return (Tk_ErrorHandler) errorPtr;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_DeleteErrorHandler --
+ *
+ *     Do not use an error handler anymore.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The handler denoted by the "handler" argument will not
+ *     be invoked for any X errors associated with requests
+ *     made after this call.  However, if errors arrive later
+ *     for requests made BEFORE this call, then the handler
+ *     will still be invoked.  Call XSync if you want to be
+ *     sure that all outstanding errors have been received
+ *     and processed.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_DeleteErrorHandler(handler)
+    Tk_ErrorHandler handler;   /* Token for handler to delete;
+                                * was previous return value from
+                                * Tk_CreateErrorHandler. */
+{
+    register TkErrorHandler *errorPtr = (TkErrorHandler *) handler;
+    register TkDisplay *dispPtr = errorPtr->dispPtr;
+
+    errorPtr->lastRequest = NextRequest(dispPtr->display) - 1;
+
+    /*
+     * Every once-in-a-while, cleanup handlers that are no longer
+     * active.  We probably won't be able to free the handler that
+     * was just deleted (need to wait for any outstanding requests to
+     * be processed by server), but there may be previously-deleted
+     * handlers that are now ready for garbage collection.  To reduce
+     * the cost of the cleanup, let a few dead handlers pile up, then
+     * clean them all at once.  This adds a bit of overhead to errors
+     * that might occur while the dead handlers are hanging around,
+     * but reduces the overhead of scanning the list to clean up
+     * (particularly if there are many handlers that stay around
+     * forever).
+     */
+
+    dispPtr->deleteCount += 1;
+    if (dispPtr->deleteCount >= 10) {
+       register TkErrorHandler *prevPtr;
+       TkErrorHandler *nextPtr;
+       int lastSerial;
+
+       dispPtr->deleteCount = 0;
+       lastSerial = LastKnownRequestProcessed(dispPtr->display);
+       errorPtr = dispPtr->errorPtr;
+       for (errorPtr = dispPtr->errorPtr, prevPtr = NULL;
+               errorPtr != NULL;  errorPtr = nextPtr) {
+           nextPtr = errorPtr->nextPtr;
+           if ((errorPtr->lastRequest != -1)
+                   && (errorPtr->lastRequest <= lastSerial)) {
+               if (prevPtr == NULL) {
+                   dispPtr->errorPtr = nextPtr;
+               } else {
+                   prevPtr->nextPtr = nextPtr;
+               }
+               ckfree((char *) errorPtr);
+               continue;
+           }
+           prevPtr = errorPtr;
+       }
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ErrorProc --
+ *
+ *     This procedure is invoked by the X system when error
+ *     events arrive.
+ *
+ * Results:
+ *     If it returns, the return value is zero.  However,
+ *     it is possible that one of the error handlers may
+ *     just exit.
+ *
+ * Side effects:
+ *     This procedure does two things.  First, it uses the
+ *     serial #  in the error event to eliminate handlers whose
+ *     expiration serials are now in the past.  Second, it
+ *     invokes any handlers that want to deal with the error.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ErrorProc(display, errEventPtr)
+    Display *display;                  /* Display for which error
+                                        * occurred. */
+    register XErrorEvent *errEventPtr; /* Information about error. */
+{
+    register TkDisplay *dispPtr;
+    register TkErrorHandler *errorPtr;
+    extern int _XDefaultError();
+
+    /*
+     * See if we know anything about the display.  If not, then
+     * invoke the default error handler.
+     */
+
+    for (dispPtr = tkDisplayList; ; dispPtr = dispPtr->nextPtr) {
+       if (dispPtr == NULL) {
+           goto couldntHandle;
+       }
+       if (dispPtr->display == display) {
+           break;
+       }
+    }
+
+    /*
+     * Otherwise invoke any relevant handlers for the error, in order.
+     */
+
+    for (errorPtr = dispPtr->errorPtr; errorPtr != NULL;
+           errorPtr = errorPtr->nextPtr) {
+       if ((errorPtr->firstRequest > errEventPtr->serial)
+               || ((errorPtr->error != -1)
+                   && (errorPtr->error != errEventPtr->error_code))
+               || ((errorPtr->request != -1)
+                   && (errorPtr->request != errEventPtr->request_code))
+               || ((errorPtr->minorCode != -1)
+                   && (errorPtr->minorCode != errEventPtr->minor_code))
+               || ((errorPtr->lastRequest != -1)
+                   && (errorPtr->lastRequest < errEventPtr->serial))) {
+           continue;
+       }
+       if (errorPtr->errorProc == NULL) {
+           return 0;
+       } else {
+           if ((*errorPtr->errorProc)(errorPtr->clientData,
+                   errEventPtr) == 0) {
+               return 0;
+           }
+       }
+    }
+
+    /*
+     * We couldn't handle the error.  Use the default handler.
+     */
+
+    couldntHandle:
+    return _XDefaultError(display, errEventPtr);
+}
diff --git a/src/tk/tkevent.c b/src/tk/tkevent.c
new file mode 100644 (file)
index 0000000..5e2c654
--- /dev/null
@@ -0,0 +1,1904 @@
+/* 
+ * tkEvent.c --
+ *
+ *     This file provides basic event-managing facilities,
+ *     whereby procedure callbacks may be attached to
+ *     certain events.
+ *
+ * Copyright 1990-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkEvent.c,v 1.60 92/08/21 16:15:57 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tkint.h"
+#include <errno.h>
+#include <signal.h>
+#include <sys/time.h>
+#include <assert.h>
+
+
+/*
+ * For each timer callback that's pending, there is one record
+ * of the following type, chained together in a list sorted by
+ * time (earliest event first).
+ */
+
+typedef struct TimerEvent {
+    struct timeval time;       /* When timer is to fire. */
+    void (*proc)  _ANSI_ARGS_((ClientData clientData));
+                               /* Procedure to call. */
+    ClientData clientData;     /* Argument to pass to proc. */
+    Tk_TimerToken token;       /* Identifies event so it can be
+                                * deleted. */
+    struct TimerEvent *nextPtr;        /* Next event in queue, or NULL for
+                                * end of queue. */
+} TimerEvent;
+
+static TimerEvent *timerQueue; /* First event in queue. */
+
+/*
+ * The information below is used to provide read, write, and
+ * exception masks to select during calls to Tk_DoOneEvent.
+ */
+
+static int readCount;          /* Number of files for which we */
+static int writeCount;         /* care about each event type. */
+static int exceptCount;
+#define MASK_SIZE ((OPEN_MAX+(8*sizeof(int))-1)/(8*sizeof(int)))
+static int masks[3*MASK_SIZE]; /* Integer array containing official
+                                * copies of the three sets of
+                                * masks. */
+static int ready[3*MASK_SIZE]; /* Temporary copy of masks, passed
+                                * to select and modified by kernel
+                                * to indicate which files are
+                                * actually ready. */
+static int *readPtr;           /* Pointers to the portions of */
+static int *writePtr;          /* *readyPtr for reading, writing, */
+static int *exceptPtr;         /* and excepting.  Will be NULL if
+                                * corresponding count (e.g. readCount
+                                * is zero. */
+static int numFds = 0;         /* Number of valid bits in mask
+                                * arrays (this value is passed
+                                * to select). */
+
+/*
+ * For each file registered in a call to Tk_CreateFileHandler,
+ * and for each display that's currently active, there is one
+ * record of the following type.  All of these records are
+ * chained together into a single list.
+ */
+
+typedef struct FileEvent {
+    int fd;                    /* Descriptor number for this file. */
+    int *readPtr;              /* Pointer to word in ready array
+                                * for this file's read mask bit. */
+    int *writePtr;             /* Same for write mask bit. */
+    int *exceptPtr;            /* Same for except mask bit. */
+    int mask;                  /* Value to AND with mask word to
+                                * select just this file's bit. */
+    void (*proc)  _ANSI_ARGS_((ClientData clientData, int mask));
+                               /* Procedure to call.  NULL means
+                                * this is a display. */
+    ClientData clientData;     /* Argument to pass to proc.  For
+                                * displays, this is a (Display *). */
+    struct FileEvent *nextPtr; /* Next in list of all files we
+                                * care about (NULL for end of
+                                * list). */
+} FileEvent;
+
+static FileEvent *fileList;    /* List of all file events. */
+
+/*
+ * There is one of the following structures for each of the
+ * handlers declared in a call to Tk_DoWhenIdle.  All of the
+ * currently-active handlers are linked together into a list.
+ */
+
+typedef struct IdleHandler {
+    void (*proc)  _ANSI_ARGS_((ClientData clientData));
+                               /* Procedure to call. */
+    ClientData clientData;     /* Value to pass to proc. */
+    struct IdleHandler *nextPtr;/* Next in list of active handlers. */
+} IdleHandler;
+
+static IdleHandler *idleList = NULL;
+                               /* First in list of all idle handlers. */
+static IdleHandler *lastIdlePtr = NULL;
+                               /* Last in list (or NULL for empty list). */
+
+/*
+ * There's a potential problem if a handler is deleted while it's
+ * current (i.e. its procedure is executing), since Tk_HandleEvent
+ * will need to read the handler's "nextPtr" field when the procedure
+ * returns.  To handle this problem, structures of the type below
+ * indicate the next handler to be processed for any (recursively
+ * nested) dispatches in progress.  The nextHandler fields get
+ * updated if the handlers pointed to are deleted.  Tk_HandleEvent
+ * also needs to know if the entire window gets deleted;  the winPtr
+ * field is set to zero if that particular window gets deleted.
+ */
+
+typedef struct InProgress {
+    XEvent *eventPtr;           /* Event currently being handled. */
+    TkWindow *winPtr;           /* Window for event.  Gets set to None if
+                                 * window is deleted while event is being
+                                 * handled. */
+    TkEventHandler *nextHandler; /* Next handler in search. */
+    struct InProgress *nextPtr;         /* Next higher nested search. */
+} InProgress;
+
+static InProgress *pendingPtr = NULL;
+                               /* Topmost search in progress, or
+                                * NULL if none. */
+
+/*
+ * For each call to Tk_CreateGenericHandler, an instance of the following
+ * structure will be created.  All of the active handlers are linked into a
+ * list.
+ */
+
+typedef struct GenericHandler {
+    Tk_GenericProc *proc;      /* Procedure to dispatch on all X events. */
+    ClientData clientData;     /* Client data to pass to procedure. */
+    int deleteFlag;            /* Flag to set when this handler is deleted. */
+    struct GenericHandler *nextPtr;
+                               /* Next handler in list of all generic
+                                * handlers, or NULL for end of list. */
+} GenericHandler;
+
+static GenericHandler *genericList = NULL;
+                               /* First handler in the list, or NULL. */
+static GenericHandler *lastGenericPtr = NULL;
+                               /* Last handler in list. */
+
+/*
+ * There's a potential problem if Tk_HandleEvent is entered recursively.
+ * A handler cannot be deleted physically until we have returned from
+ * calling it.  Otherwise, we're looking at unallocated memory in advancing to
+ * its `next' entry.  We deal with the problem by using the `delete flag' and
+ * deleting handlers only when it's known that there's no handler active.
+ *
+ * The following variable has a non-zero value when a handler is active.
+ */
+
+static int genericHandlersActive = 0;
+
+/*
+ * Array of event masks corresponding to each X event:
+ */
+
+static unsigned long eventMasks[] = {
+    0,
+    0,
+    KeyPressMask,                      /* KeyPress */
+    KeyReleaseMask,                    /* KeyRelease */
+    ButtonPressMask,                   /* ButtonPress */
+    ButtonReleaseMask,                 /* ButtonRelease */
+    PointerMotionMask|PointerMotionHintMask|ButtonMotionMask
+           |Button1MotionMask|Button2MotionMask|Button3MotionMask
+           |Button4MotionMask|Button5MotionMask,
+                                       /* MotionNotify */
+    EnterWindowMask,                   /* EnterNotify */
+    LeaveWindowMask,                   /* LeaveNotify */
+    FocusChangeMask,                   /* FocusIn */
+    FocusChangeMask,                   /* FocusOut */
+    KeymapStateMask,                   /* KeymapNotify */
+    ExposureMask,                      /* Expose */
+    ExposureMask,                      /* GraphicsExpose */
+    ExposureMask,                      /* NoExpose */
+    VisibilityChangeMask,              /* VisibilityNotify */
+    SubstructureNotifyMask,            /* CreateNotify */
+    StructureNotifyMask,               /* DestroyNotify */
+    StructureNotifyMask,               /* UnmapNotify */
+    StructureNotifyMask,               /* MapNotify */
+    SubstructureRedirectMask,          /* MapRequest */
+    StructureNotifyMask,               /* ReparentNotify */
+    StructureNotifyMask,               /* ConfigureNotify */
+    SubstructureRedirectMask,          /* ConfigureRequest */
+    StructureNotifyMask,               /* GravityNotify */
+    ResizeRedirectMask,                        /* ResizeRequest */
+    StructureNotifyMask,               /* CirculateNotify */
+    SubstructureRedirectMask,          /* CirculateRequest */
+    PropertyChangeMask,                        /* PropertyNotify */
+    0,                                 /* SelectionClear */
+    0,                                 /* SelectionRequest */
+    0,                                 /* SelectionNotify */
+    ColormapChangeMask,                        /* ColormapNotify */
+    0,                                 /* ClientMessage */
+    0,                                 /* Mapping Notify */
+};
+
+/*
+ * If someone has called Tk_RestrictEvents, the information below
+ * keeps track of it.
+ */
+
+static Bool (*restrictProc)  _ANSI_ARGS_((Display *display, XEvent *eventPtr,
+    char *arg));               /* Procedure to call.  NULL means no
+                                * restrictProc is currently in effect. */
+static char *restrictArg;      /* Argument to pass to restrictProc. */
+
+/*
+ * The following array keeps track of the last TK_NEVENTS X events, for
+ * memory dump analysis.  The tracing is only done if tkEventDebug is set
+ * to 1.
+ */
+
+#define TK_NEVENTS 32
+static XEvent eventTrace[TK_NEVENTS];
+static int traceIndex = 0;
+int tkEventDebug = 0;
+
+int tkCollapseMotion = 1;
+int tkMustExit = 0;
+\f
+
+#define DefPool(type) \
+type *Unused##type = NULL; \
+\
+type *New##type() { \
+  if (Unused##type == NULL) { \
+    return (type *)ckalloc(sizeof (type)); \
+  } else { \
+    type *ptr = Unused##type; \
+    Unused##type = ptr->nextPtr; \
+    return (ptr); \
+  } \
+} \
+\
+void Free##type(type *ptr) { \
+  ptr->nextPtr = Unused##type; \
+  Unused##type = ptr; \
+}
+
+DefPool(TkEventHandler)
+DefPool(GenericHandler)
+DefPool(FileEvent)
+DefPool(TimerEvent)
+DefPool(IdleHandler)
+
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_CreateEventHandler --
+ *
+ *     Arrange for a given procedure to be invoked whenever
+ *     events from a given class occur in a given window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     From now on, whenever an event of the type given by
+ *     mask occurs for token and is processed by Tk_HandleEvent,
+ *     proc will be called.  See the manual entry for details
+ *     of the calling sequence and return value for proc.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_CreateEventHandler(token, mask, proc, clientData)
+    Tk_Window token;           /* Token for window in which to
+                                * create handler. */
+    unsigned long mask;                /* Events for which proc should
+                                * be called. */
+    Tk_EventProc *proc;                /* Procedure to call for each
+                                * selected event */
+    ClientData clientData;     /* Arbitrary data to pass to proc. */
+{
+    register TkEventHandler *handlerPtr;
+    register TkWindow *winPtr = (TkWindow *) token;
+    int found;
+
+    /*
+     * Skim through the list of existing handlers to (a) compute the
+     * overall event mask for the window (so we can pass this new
+     * value to the X system) and (b) see if there's already a handler
+     * declared with the same callback and clientData (if so, just
+     * change the mask).  If no existing handler matches, then create
+     * a new handler.
+     */
+
+    found = 0;
+    if (winPtr->handlerList == NULL) {
+       handlerPtr = (TkEventHandler *) NewTkEventHandler();
+       winPtr->handlerList = handlerPtr;
+       goto initHandler;
+    } else {
+       for (handlerPtr = winPtr->handlerList; ;
+               handlerPtr = handlerPtr->nextPtr) {
+           if ((handlerPtr->proc == proc)
+                   && (handlerPtr->clientData == clientData)) {
+               handlerPtr->mask = mask;
+               found = 1;
+           }
+           if (handlerPtr->nextPtr == NULL) {
+               break;
+           }
+       }
+    }
+
+    /*
+     * Create a new handler if no matching old handler was found.
+     */
+
+    if (!found) {
+       handlerPtr->nextPtr = NewTkEventHandler();
+       handlerPtr = handlerPtr->nextPtr;
+       initHandler:
+       handlerPtr->mask = mask;
+       handlerPtr->proc = proc;
+       handlerPtr->clientData = clientData;
+       handlerPtr->nextPtr = NULL;
+    }
+
+    /*
+     * No need to call XSelectInput:  Tk always selects on all events
+     * for all windows (needed to support bindings on classes and "all").
+     */
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_DeleteEventHandler --
+ *
+ *     Delete a previously-created handler.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If there existed a handler as described by the
+ *     parameters, the handler is deleted so that proc
+ *     will not be invoked again.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_DeleteEventHandler(token, mask, proc, clientData)
+    Tk_Window token;           /* Same as corresponding arguments passed */
+    unsigned long mask;                /* previously to Tk_CreateEventHandler. */
+    Tk_EventProc *proc;
+    ClientData clientData;
+{
+    register TkEventHandler *handlerPtr;
+    register InProgress *ipPtr;
+    TkEventHandler *prevPtr;
+    register TkWindow *winPtr = (TkWindow *) token;
+
+    /*
+     * Find the event handler to be deleted, or return
+     * immediately if it doesn't exist.
+     */
+
+    for (handlerPtr = winPtr->handlerList, prevPtr = NULL; ;
+           prevPtr = handlerPtr, handlerPtr = handlerPtr->nextPtr) {
+       if (handlerPtr == NULL) {
+           return;
+       }
+       if ((handlerPtr->mask == mask) && (handlerPtr->proc == proc)
+               && (handlerPtr->clientData == clientData)) {
+           break;
+       }
+    }
+
+    /*
+     * If Tk_HandleEvent is about to process this handler, tell it to
+     * process the next one instead.
+     */
+
+    for (ipPtr = pendingPtr; ipPtr != NULL; ipPtr = ipPtr->nextPtr) {
+       if (ipPtr->nextHandler == handlerPtr) {
+           ipPtr->nextHandler = handlerPtr->nextPtr;
+       }
+    }
+
+    /*
+     * Free resources associated with the handler.
+     */
+
+    if (prevPtr == NULL) {
+       winPtr->handlerList = handlerPtr->nextPtr;
+    } else {
+       prevPtr->nextPtr = handlerPtr->nextPtr;
+    }
+    (void) FreeTkEventHandler(handlerPtr);
+
+
+    /*
+     * No need to call XSelectInput:  Tk always selects on all events
+     * for all windows (needed to support bindings on classes and "all").
+     */
+}
+\f
+/*--------------------------------------------------------------
+ *
+ * Tk_CreateGenericHandler --
+ *
+ *     Register a procedure to be called on each X event, regardless
+ *     of display or window.  Generic handlers are useful for capturing
+ *     events that aren't associated with windows, or events for windows
+ *     not managed by Tk.
+ *
+ * Results:
+ *     None.
+ *
+ * Side Effects:
+ *     From now on, whenever an X event is given to Tk_HandleEvent,
+ *     invoke proc, giving it clientData and the event as arguments.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_CreateGenericHandler(proc, clientData)
+     Tk_GenericProc *proc;     /* Procedure to call on every event. */
+     ClientData clientData;    /* One-word value to pass to proc. */
+{
+    GenericHandler *handlerPtr;
+    
+    handlerPtr = NewGenericHandler();
+    
+    handlerPtr->proc = proc;
+    handlerPtr->clientData = clientData;
+    handlerPtr->deleteFlag = 0;
+    handlerPtr->nextPtr = NULL;
+    if (genericList == NULL) {
+       genericList = handlerPtr;
+    } else {
+       lastGenericPtr->nextPtr = handlerPtr;
+    }
+    lastGenericPtr = handlerPtr;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_DeleteGenericHandler --
+ *
+ *     Delete a previously-created generic handler.
+ *
+ * Results:
+ *     None.
+ *
+ * Side Effects:
+ *     If there existed a handler as described by the parameters,
+ *     that handler is logically deleted so that proc will not be
+ *     invoked again.  The physical deletion happens in the event
+ *     loop in Tk_HandleEvent.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_DeleteGenericHandler(proc, clientData)
+     Tk_GenericProc *proc;
+     ClientData clientData;
+{
+    GenericHandler * handler;
+    
+    for (handler = genericList; handler; handler = handler->nextPtr) {
+       if ((handler->proc == proc) && (handler->clientData == clientData)) {
+           handler->deleteFlag = 1;
+       }
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_HandleEvent --
+ *
+ *     Given an event, invoke all the handlers that have
+ *     been registered for the event.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Depends on the handlers.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_HandleEvent(eventPtr)
+    XEvent *eventPtr;          /* Event to dispatch. */
+{
+    register TkEventHandler *handlerPtr;
+    register GenericHandler *genericPtr;
+    register GenericHandler *genPrevPtr;
+    TkWindow *winPtr;
+    register unsigned long mask;
+    InProgress ip;
+    Window handlerWindow;
+
+    /* 
+     * First off, invoke all the generic event handlers (those that are
+     * invoked for all events).  If a generic event handler reports that
+     * an event is fully processed, go no further.
+     */
+
+    for (genPrevPtr = NULL, genericPtr = genericList;  genericPtr != NULL; ) {
+       if (genericPtr->deleteFlag) {
+           if (!genericHandlersActive) {
+               GenericHandler *tmpPtr;
+
+               /*
+                * This handler needs to be deleted and there are no
+                * calls pending through the handler, so now is a safe
+                * time to delete it.
+                */
+
+               tmpPtr = genericPtr->nextPtr;
+               if (genPrevPtr == NULL) {
+                   genericList = tmpPtr;
+               } else {
+                   genPrevPtr->nextPtr = tmpPtr;
+               }
+               (void) FreeGenericHandler(genericPtr);
+               genericPtr = tmpPtr;
+               continue;
+           }
+       } else {
+           int done;
+
+           genericHandlersActive++;
+           done = (*genericPtr->proc)(genericPtr->clientData, eventPtr);
+           genericHandlersActive--;
+           if (done) {
+               return;
+           }
+       }
+       genPrevPtr = genericPtr;
+       genericPtr = genPrevPtr->nextPtr;
+    }
+
+    /*
+     * Events selected by StructureNotify look the same as those
+     * selected by SubstructureNotify;  the only difference is
+     * whether the "event" and "window" fields are the same.
+     * Check it out and convert StructureNotify to
+     * SubstructureNotify if necessary.
+     */
+
+    handlerWindow = eventPtr->xany.window;
+    mask = eventMasks[eventPtr->xany.type];
+    if (mask == StructureNotifyMask) {
+       if (eventPtr->xmap.event != eventPtr->xmap.window) {
+           mask = SubstructureNotifyMask;
+           handlerWindow = eventPtr->xmap.event;
+       }
+    }
+    if (XFindContext(eventPtr->xany.display, handlerWindow,
+           tkWindowContext, (void *) &winPtr) != 0) {
+
+       /*
+        * There isn't a TkWindow structure for this window.
+        * However, if the event is a PropertyNotify event then call
+        * the selection manager (it deals beneath-the-table with
+        * certain properties).
+        */
+
+       if (eventPtr->type == PropertyNotify) {
+           TkSelPropProc(eventPtr);
+       }
+       return;
+    }
+
+    /*
+     * Redirect KeyPress and KeyRelease events if input focussing
+     * is happening.  Map the x and y coordinates between the two
+     * windows, if possible (make both -1 if the map-from and map-to
+     * windows don't share the same top-level window).
+     */
+
+    if (mask & (KeyPressMask|KeyReleaseMask)) {
+       winPtr->dispPtr->lastEventTime = eventPtr->xkey.time;
+/* XXX: FOCUS */
+           if (winPtr->dispPtr->focusPtr != NULL) {
+           TkWindow *focusPtr;
+           int winX, winY, focusX, focusY;
+    
+           focusPtr = winPtr->dispPtr->focusPtr;
+           if ((focusPtr->display != winPtr->display)
+                   || (focusPtr->screenNum != winPtr->screenNum)) {
+               eventPtr->xkey.x = -1;
+               eventPtr->xkey.y = -1;
+           } else {
+               Tk_GetRootCoords((Tk_Window) winPtr, &winX, &winY);
+               Tk_GetRootCoords((Tk_Window) focusPtr, &focusX, &focusY);
+               eventPtr->xkey.x -= focusX - winX;
+               eventPtr->xkey.y -= focusY - winY;
+           }
+           eventPtr->xkey.window = focusPtr->window;
+           winPtr = focusPtr;
+       }
+    }
+
+    /*
+     * Call a grab-related procedure to do special processing on
+     * pointer events.
+     */
+
+    if (mask & (ButtonPressMask|ButtonReleaseMask|PointerMotionMask
+           |EnterWindowMask|LeaveWindowMask)) {
+       if (mask & (ButtonPressMask|ButtonReleaseMask)) {
+           winPtr->dispPtr->lastEventTime = eventPtr->xbutton.time;
+       } else if (mask & PointerMotionMask) {
+           winPtr->dispPtr->lastEventTime = eventPtr->xmotion.time;
+       } else {
+           winPtr->dispPtr->lastEventTime = eventPtr->xcrossing.time;
+       }
+       if (TkPointerEvent(eventPtr, winPtr) == 0) {
+           return;
+       }
+    }
+
+    /*
+     * For events where it hasn't already been done, update the current
+     * time in the display.
+     */
+
+    if (eventPtr->type == PropertyNotify) {
+       winPtr->dispPtr->lastEventTime = eventPtr->xproperty.time;
+    }
+
+    /*
+     * There's a potential interaction here with Tk_DeleteEventHandler.
+     * Read the documentation for pendingPtr.
+     */
+
+    ip.eventPtr = eventPtr;
+    ip.winPtr = winPtr;
+    ip.nextHandler = NULL;
+    ip.nextPtr = pendingPtr;
+    pendingPtr = &ip;
+    if (mask == 0) {
+       if ((eventPtr->type == SelectionClear)
+               || (eventPtr->type == SelectionRequest)
+               || (eventPtr->type == SelectionNotify)) {
+           TkSelEventProc((Tk_Window) winPtr, eventPtr);
+       } else if ((eventPtr->type == ClientMessage)
+               && (eventPtr->xclient.message_type == 
+                   Tk_InternAtom((Tk_Window) winPtr, "WM_PROTOCOLS"))) {
+               /*
+                * this is a ICCCM WM_PROTOCOL ClientMessage 
+                */
+               TkWmProtocolEventProc(winPtr, eventPtr);
+       }
+    } else {
+       for (handlerPtr = winPtr->handlerList; handlerPtr != NULL; ) {
+           if ((handlerPtr->mask & mask) != 0) {
+               ip.nextHandler = handlerPtr->nextPtr;
+               (*(handlerPtr->proc))(handlerPtr->clientData, eventPtr);
+               handlerPtr = ip.nextHandler;
+           } else {
+               handlerPtr = handlerPtr->nextPtr;
+           }
+       }
+
+       /*
+        * Pass the event to the "bind" command mechanism.  But, don't
+        * do this for SubstructureNotify events.  The "bind" command
+        * doesn't support them anyway, and it's easier to filter out
+        * these events here than in the lower-level procedures.
+        */
+
+       if ((ip.winPtr != None) && (mask != SubstructureNotifyMask)) {
+           TkBindEventProc(winPtr, eventPtr);
+       }
+    }
+    pendingPtr = ip.nextPtr;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_CreateFileHandler --
+ *
+ *     Arrange for a given procedure to be invoked whenever
+ *     a given file becomes readable or writable.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     From now on, whenever the I/O channel given by fd becomes
+ *     ready in the way indicated by mask, proc will be invoked.
+ *     See the manual entry for details on the calling sequence
+ *     to proc.  If fd is already registered then the old mask
+ *     and proc and clientData values will be replaced with
+ *     new ones.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_CreateFileHandler(fd, mask, proc, clientData)
+    int fd;                    /* Integer identifier for stream. */
+    int mask;                  /* OR'ed combination of TK_READABLE,
+                                * TK_WRITABLE, and TK_EXCEPTION:
+                                * indicates conditions under which
+                                * proc should be called. */
+    Tk_FileProc *proc;         /* Procedure to call for each
+                                * selected event.  NULL means that
+                                * this is a display, and that
+                                * clientData is the (Display *)
+                                * for it, and that events should
+                                * be handled automatically. */
+    ClientData clientData;     /* Arbitrary data to pass to proc. */
+{
+    register FileEvent *filePtr;
+    int index;
+
+    if (fd >= OPEN_MAX) {
+       panic("Tk_CreatefileHandler can't handle file id %d", fd);
+    }
+
+    /*
+     * Make sure the file isn't already registered.  Create a
+     * new record in the normal case where there's no existing
+     * record.
+     */
+
+    for (filePtr = fileList; filePtr != NULL;
+           filePtr = filePtr->nextPtr) {
+       if (filePtr->fd == fd) {
+           break;
+       }
+    }
+    index = fd/(8*sizeof(int));
+    if (filePtr == NULL) {
+       filePtr = NewFileEvent();
+       filePtr->fd = fd;
+       filePtr->readPtr = &ready[index];
+       filePtr->writePtr = &ready[index+MASK_SIZE];
+       filePtr->exceptPtr = &ready[index+2*MASK_SIZE];
+       filePtr->mask = 1 << (fd%(8*sizeof(int)));
+       filePtr->nextPtr = fileList;
+       fileList = filePtr;
+    } else {
+       if (masks[index] & filePtr->mask) {
+           readCount--;
+           *filePtr->readPtr &= ~filePtr->mask;
+           masks[index] &= ~filePtr->mask;
+       }
+       if (masks[index+MASK_SIZE] & filePtr->mask) {
+           writeCount--;
+           *filePtr->writePtr &= ~filePtr->mask;
+           masks[index+MASK_SIZE] &= ~filePtr->mask;
+       }
+       if (masks[index+2*MASK_SIZE] & filePtr->mask) {
+           exceptCount--;
+           *filePtr->exceptPtr &= ~filePtr->mask;
+           masks[index+2*MASK_SIZE] &= ~filePtr->mask;
+       }
+    }
+
+    /*
+     * The remainder of the initialization below is done
+     * regardless of whether or not this is a new record
+     * or a modification of an old one.
+     */
+
+    if (mask & TK_READABLE) {
+       masks[index] |= filePtr->mask;
+       readCount++;
+    }
+    readPtr = (readCount == 0 ? NULL : &ready[0]);
+
+    if (mask & TK_WRITABLE) {
+       masks[index+MASK_SIZE] |= filePtr->mask;
+       writeCount++;
+    }
+    writePtr = (writeCount == 0 ? NULL : &ready[MASK_SIZE]);
+
+    if (mask & TK_EXCEPTION) {
+       masks[index+2*MASK_SIZE] |= filePtr->mask;
+       exceptCount++;
+    }
+    exceptPtr = (exceptCount == 0 ? NULL : &ready[2*MASK_SIZE]);
+
+    filePtr->proc = proc;
+    filePtr->clientData = clientData;
+
+    if (numFds <= fd) {
+       numFds = fd+1;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_DeleteFileHandler --
+ *
+ *     Cancel a previously-arranged callback arrangement for
+ *     a file.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If a callback was previously registered on fd, remove it.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_DeleteFileHandler(fd)
+    int fd;                    /* Stream id for which to remove
+                                * callback procedure. */
+{
+    register FileEvent *filePtr;
+    FileEvent *prevPtr;
+    int index;
+
+    /*
+     * Find the entry for the given file (and return if there
+     * isn't one).
+     */
+
+    for (prevPtr = NULL, filePtr = fileList; ;
+           prevPtr = filePtr, filePtr = filePtr->nextPtr) {
+       if (filePtr == NULL) {
+           return;
+       }
+       if (filePtr->fd == fd) {
+           break;
+       }
+    }
+
+    /*
+     * Clean up information in the callback record.
+     */
+
+    index = filePtr->fd/(8*sizeof(int));
+    if (masks[index] & filePtr->mask) {
+       readCount--;
+       *filePtr->readPtr &= ~filePtr->mask;
+       masks[index] &= ~filePtr->mask;
+    }
+    if (masks[index+MASK_SIZE] & filePtr->mask) {
+       writeCount--;
+       *filePtr->writePtr &= ~filePtr->mask;
+       masks[index+MASK_SIZE] &= ~filePtr->mask;
+    }
+    if (masks[index+2*MASK_SIZE] & filePtr->mask) {
+       exceptCount--;
+       *filePtr->exceptPtr &= ~filePtr->mask;
+       masks[index+2*MASK_SIZE] &= ~filePtr->mask;
+    }
+    if (prevPtr == NULL) {
+       fileList = filePtr->nextPtr;
+    } else {
+       prevPtr->nextPtr = filePtr->nextPtr;
+    }
+    FreeFileEvent(filePtr);
+
+    /*
+     * Recompute numFds.
+     */
+
+    numFds = 0;
+    for (filePtr = fileList; filePtr != NULL;
+           filePtr = filePtr->nextPtr) {
+       if (numFds <= filePtr->fd) {
+           numFds = filePtr->fd+1;
+       }
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_CreateTimerHandler --
+ *
+ *     Arrange for a given procedure to be invoked at a particular
+ *     time in the future.
+ *
+ * Results:
+ *     The return value is a token for the timer event, which
+ *     may be used to delete the event before it fires.
+ *
+ * Side effects:
+ *     When milliseconds have elapsed, proc will be invoked
+ *     exactly once.
+ *
+ *--------------------------------------------------------------
+ */
+
+Tk_TimerToken
+Tk_CreateTimerHandler(milliseconds, proc, clientData)
+    int milliseconds;          /* How many milliseconds to wait
+                                * before invoking proc. */
+    Tk_TimerProc *proc;                /* Procedure to invoke. */
+    ClientData clientData;     /* Arbitrary data to pass to proc. */
+{
+    register TimerEvent *timerPtr, *tPtr2, *prevPtr;
+    static int id = 0;
+
+    timerPtr = NewTimerEvent();
+
+    /*
+     * Compute when the event should fire.
+     */
+
+    (void) gettimeofday(&timerPtr->time, (struct timezone *) NULL);
+    timerPtr->time.tv_sec += milliseconds/1000;
+    timerPtr->time.tv_usec += (milliseconds%1000)*1000;
+    if (timerPtr->time.tv_usec > 1000000) {
+       timerPtr->time.tv_usec -= 1000000;
+       timerPtr->time.tv_sec += 1;
+    }
+
+    /*
+     * Fill in other fields for the event.
+     */
+
+    timerPtr->proc = proc;
+    timerPtr->clientData = clientData;
+    id++;
+    timerPtr->token = (Tk_TimerToken) id;
+
+    /*
+     * Add the event to the queue in the correct position
+     * (ordered by event firing time).
+     */
+
+    for (tPtr2 = timerQueue, prevPtr = NULL; tPtr2 != NULL;
+           prevPtr = tPtr2, tPtr2 = tPtr2->nextPtr) {
+       if ((tPtr2->time.tv_sec > timerPtr->time.tv_sec)
+               || ((tPtr2->time.tv_sec == timerPtr->time.tv_sec)
+               && (tPtr2->time.tv_usec > timerPtr->time.tv_usec))) {
+           break;
+       }
+    }
+    if (prevPtr == NULL) {
+       timerPtr->nextPtr = timerQueue;
+       timerQueue = timerPtr;
+    } else {
+       timerPtr->nextPtr = prevPtr->nextPtr;
+       prevPtr->nextPtr = timerPtr;
+    }
+    return timerPtr->token;
+}
+\f
+// Added by Don to support finer timer resolution.
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_CreateMicroTimerHandler --
+ *
+ *     Arrange for a given procedure to be invoked at a particular
+ *     time in the future.
+ *
+ * Results:
+ *     The return value is a token for the timer event, which
+ *     may be used to delete the event before it fires.
+ *
+ * Side effects:
+ *     When seconds and seconds have elapsed, proc will be invoked
+ *     exactly once.
+ *
+ *--------------------------------------------------------------
+ */
+
+Tk_TimerToken
+Tk_CreateMicroTimerHandler(seconds, microseconds, proc, clientData)
+    int seconds;               /* How many seconds to wait
+                                * before invoking proc. */
+    int microseconds;          /* How many microseconds to wait
+                                * before invoking proc. */
+    Tk_TimerProc *proc;                /* Procedure to invoke. */
+    ClientData clientData;     /* Arbitrary data to pass to proc. */
+{
+    register TimerEvent *timerPtr, *tPtr2, *prevPtr;
+    static int id = 0;
+
+    timerPtr = NewTimerEvent();
+
+    /*
+     * Compute when the event should fire.
+     */
+
+    (void) gettimeofday(&timerPtr->time, (struct timezone *) NULL);
+    timerPtr->time.tv_sec += seconds;
+    timerPtr->time.tv_usec += microseconds;
+    while (timerPtr->time.tv_usec > 1000000) {
+       timerPtr->time.tv_usec -= 1000000;
+       timerPtr->time.tv_sec += 1;
+    }
+
+    /*
+     * Fill in other fields for the event.
+     */
+
+    timerPtr->proc = proc;
+    timerPtr->clientData = clientData;
+    id++;
+    timerPtr->token = (Tk_TimerToken) id;
+
+    /*
+     * Add the event to the queue in the correct position
+     * (ordered by event firing time).
+     */
+
+    for (tPtr2 = timerQueue, prevPtr = NULL; tPtr2 != NULL;
+           prevPtr = tPtr2, tPtr2 = tPtr2->nextPtr) {
+       if ((tPtr2->time.tv_sec > timerPtr->time.tv_sec)
+               || ((tPtr2->time.tv_sec == timerPtr->time.tv_sec)
+               && (tPtr2->time.tv_usec > timerPtr->time.tv_usec))) {
+           break;
+       }
+    }
+    if (prevPtr == NULL) {
+       timerPtr->nextPtr = timerQueue;
+       timerQueue = timerPtr;
+    } else {
+       timerPtr->nextPtr = prevPtr->nextPtr;
+       prevPtr->nextPtr = timerPtr;
+    }
+    return timerPtr->token;
+}
+
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_DeleteTimerHandler --
+ *
+ *     Delete a previously-registered timer handler.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Destroy the timer callback identified by TimerToken,
+ *     so that its associated procedure will not be called.
+ *     If the callback has already fired, or if the given
+ *     token doesn't exist, then nothing happens.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_DeleteTimerHandler(token)
+    Tk_TimerToken token;       /* Result previously returned by
+                                * Tk_DeleteTimerHandler. */
+{
+    register TimerEvent *timerPtr, *prevPtr;
+
+    if (token == 0) return;
+
+    for (timerPtr = timerQueue, prevPtr = NULL; timerPtr != NULL;
+           prevPtr = timerPtr, timerPtr = timerPtr->nextPtr) {
+       if (timerPtr->token != token) {
+           continue;
+       }
+       if (prevPtr == NULL) {
+           timerQueue = timerPtr->nextPtr;
+       } else {
+           prevPtr->nextPtr = timerPtr->nextPtr;
+       }
+       FreeTimerEvent(timerPtr);
+       return;
+    }
+
+//    fprintf(stderr, "Tk_DeleteTimerHandler called on bogus timer %d\n", token);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_DoWhenIdle --
+ *
+ *     Arrange for proc to be invoked the next time the
+ *     system is idle (i.e., just before the next time
+ *     that Tk_DoOneEvent would have to wait for something
+ *     to happen).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Proc will eventually be called, with clientData
+ *     as argument.  See the manual entry for details.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_DoWhenIdle(proc, clientData)
+    Tk_IdleProc *proc;         /* Procedure to invoke. */
+    ClientData clientData;     /* Arbitrary value to pass to proc. */
+{
+    register IdleHandler *idlePtr;
+
+    idlePtr = NewIdleHandler();
+    idlePtr->proc = proc;
+    idlePtr->clientData = clientData;
+    idlePtr->nextPtr = NULL;
+    if (lastIdlePtr == NULL) {
+       idleList = idlePtr;
+    } else {
+       lastIdlePtr->nextPtr = idlePtr;
+    }
+    lastIdlePtr = idlePtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_CancelIdleCall --
+ *
+ *     If there are any when-idle calls requested to a given procedure
+ *     with given clientData, cancel all of them.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If the proc/clientData combination were on the when-idle list,
+ *     they are removed so that they will never be called.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_CancelIdleCall(proc, clientData)
+    Tk_IdleProc *proc;         /* Procedure that was previously registered. */
+    ClientData clientData;     /* Arbitrary value to pass to proc. */
+{
+    register IdleHandler *idlePtr, *prevPtr;
+    IdleHandler *nextPtr;
+
+    for (prevPtr = NULL, idlePtr = idleList; idlePtr != NULL;
+           prevPtr = idlePtr, idlePtr = idlePtr->nextPtr) {
+       while ((idlePtr->proc == proc)
+               && (idlePtr->clientData == clientData)) {
+           nextPtr = idlePtr->nextPtr;
+           FreeIdleHandler(idlePtr);
+           idlePtr = nextPtr;
+           if (prevPtr == NULL) {
+               idleList = idlePtr;
+           } else {
+               prevPtr->nextPtr = idlePtr;
+           }
+           if (idlePtr == NULL) {
+               lastIdlePtr = prevPtr;
+               return;
+           }
+       }
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_DoOneEvent --
+ *
+ *     Process a single event of some sort.  If there's no
+ *     work to do, wait for an event to occur, then process
+ *     it.
+ *
+ * Results:
+ *     The return value is 1 if the procedure actually found
+ *     an event to process.  If no event was found then 0 is
+ *     returned.
+ *
+ * Side effects:
+ *     May delay execution of process while waiting for an
+ *     X event, X error, file-ready event, or timer event.
+ *     The handling of the event could cause additional
+ *     side effects.  Collapses sequences of mouse-motion
+ *     events for the same window into a single event by
+ *     delaying motion event processing.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_DoOneEvent(flags)
+    int flags;                 /* Miscellaneous flag values:  may be any
+                                * combination of TK_DONT_WAIT, TK_X_EVENTS,
+                                * TK_FILE_EVENTS, TK_TIMER_EVENTS, and
+                                * TK_IDLE_EVENTS. */
+{
+    register FileEvent *filePtr;
+    struct timeval curTime, timeout, *timeoutPtr;
+    int numFound;
+    static XEvent delayedMotionEvent;  /* Used to hold motion events that
+                                        * are being saved until later. */
+    static int eventDelayed = 0;       /* Non-zero means there is an event
+                                        * in delayedMotionEvent. */
+
+    if ((flags & TK_ALL_EVENTS) == 0) {
+       flags |= TK_ALL_EVENTS;
+    }
+
+    /*
+     * Phase One: see if there's already something ready
+     * (either a file or a display) that was left over
+     * from before (i.e don't do a select, just check the
+     * bits from the last select).
+     */
+
+    checkFiles:
+    for (filePtr = fileList; filePtr != NULL;
+           filePtr = filePtr->nextPtr) {
+       int mask;
+
+       /*
+        * Displays:  flush output, check for queued events,
+        * and read events from the server if display is ready.
+        * If there are any events, process one and then
+        * return.
+        */
+
+       if ((filePtr->proc == NULL) && (flags & TK_X_EVENTS)) {
+           Display *display = (Display *) filePtr->clientData;
+           XEvent event;
+
+           XFlush(display);
+           if ((*filePtr->readPtr) & filePtr->mask) {
+               *filePtr->readPtr &= ~filePtr->mask;
+               if (XEventsQueued(display, QueuedAfterReading) == 0) {
+
+                   /*
+                    * Things are very tricky if there aren't any events
+                    * readable at this point (after all, there was
+                    * supposedly data available on the connection).
+                    * A couple of things could have occurred:
+                    * 
+                    * One possibility is that there were only error events
+                    * in the input from the server.  If this happens,
+                    * we should return (we don't want to go to sleep
+                    * in XNextEvent below, since this would block out
+                    * other sources of input to the process).
+                    *
+                    * Another possibility is that our connection to the
+                    * server has been closed.  This will not necessarily
+                    * be detected in XEventsQueued (!!), so if we just
+                    * return then there will be an infinite loop.  To
+                    * detect such an error, generate a NoOp protocol
+                    * request to exercise the connection to the server,
+                    * then return.  However, must disable SIGPIPE while
+                    * sending the event, or else the process will die
+                    * from the signal and won't invoke the X error
+                    * function to print a nice message.
+                    */
+
+                   void (*oldHandler)();
+
+                   oldHandler = (void (*)()) signal(SIGPIPE, SIG_IGN);
+                   XNoOp(display);
+                   XFlush(display);
+                   (void) signal(SIGPIPE, oldHandler);
+                   return 1;
+               }
+               if (restrictProc != NULL) {
+                   if (!XCheckIfEvent(display, &event, restrictProc,
+                           restrictArg)) {
+                       return 1;
+                   }
+               } else {
+                   XNextEvent(display, &event);
+               }
+           } else {
+               if (QLength(display) == 0) {
+                   continue;
+               }
+               if (restrictProc != NULL) {
+                   if (!XCheckIfEvent(display, &event, restrictProc,
+                           restrictArg)) {
+                       continue;
+                   }
+               } else {
+                   XNextEvent(display, &event);
+               }
+           }
+
+           /*
+            * Got an event.  Deal with mouse-motion-collapsing and
+            * event-delaying here.  If there's already an event delayed,
+            * then process that event if it's incompatible with the new
+            * event (new event not mouse motion, or window changed, or
+            * state changed).  If the new event is mouse motion, then
+            * don't process it now;  delay it until later in the hopes
+            * that it can be merged with other mouse motion events
+            * immediately following.
+            */
+
+           if (tkEventDebug) {
+               eventTrace[traceIndex] = event;
+               traceIndex = (traceIndex+1) % TK_NEVENTS;
+           }
+
+           if (eventDelayed) {
+               if (((event.type != MotionNotify)
+                           && (event.type != GraphicsExpose)
+                           && (event.type != NoExpose)
+                           && (event.type != Expose))
+                       || (event.xmotion.display
+                           != delayedMotionEvent.xmotion.display)
+                       || (event.xmotion.window
+                           != delayedMotionEvent.xmotion.window)) {
+                   XEvent copy;
+
+                   /*
+                    * Must copy the event out of delayedMotionEvent before
+                    * processing it, in order to allow recursive calls to
+                    * Tk_DoOneEvent as part of the handler.
+                    */
+
+                   copy = delayedMotionEvent;
+                   eventDelayed = 0;
+                   Tk_HandleEvent(&copy);
+               }
+           }
+           if (tkCollapseMotion && event.type == MotionNotify) {
+               delayedMotionEvent = event;
+               eventDelayed = 1;
+           } else {
+               Tk_HandleEvent(&event);
+           }
+           return 1;
+       }
+
+       /*
+        * Not a display:  if the file is ready, call the
+        * appropriate handler.
+        */
+
+       if (((*filePtr->readPtr | *filePtr->writePtr
+               | *filePtr->exceptPtr) & filePtr->mask) == 0) {
+           continue;
+       }
+       if (!(flags & TK_FILE_EVENTS)) {
+           continue;
+       }
+       mask = 0;
+       if (*filePtr->readPtr & filePtr->mask) {
+           mask |= TK_READABLE;
+           *filePtr->readPtr &= ~filePtr->mask;
+       }
+       if (*filePtr->writePtr & filePtr->mask) {
+           mask |= TK_WRITABLE;
+           *filePtr->writePtr &= ~filePtr->mask;
+       }
+       if (*filePtr->exceptPtr & filePtr->mask) {
+           mask |= TK_EXCEPTION;
+           *filePtr->exceptPtr &= ~filePtr->mask;
+       }
+       (*filePtr->proc)(filePtr->clientData, mask);
+       return 1;
+    }
+
+    /*
+     * Phase Two: get the current time and see if any timer
+     * events are ready to fire.  If so, fire one and return.
+     */
+
+    checkTime:
+    if ((timerQueue != NULL) && (flags & TK_TIMER_EVENTS)) {
+       register TimerEvent *timerPtr = timerQueue;
+
+       (void) gettimeofday(&curTime, (struct timezone *) NULL);
+       if ((timerPtr->time.tv_sec < curTime.tv_sec)
+               || ((timerPtr->time.tv_sec == curTime.tv_sec)
+               &&  (timerPtr->time.tv_usec < curTime.tv_usec))) {
+           timerQueue = timerPtr->nextPtr;
+           (*timerPtr->proc)(timerPtr->clientData);
+           FreeTimerEvent(timerPtr);
+           return 1;
+       }
+    }
+
+
+    /*
+     * Phase Three: if there is a delayed motion event, process it
+     * now, before any DoWhenIdle handlers.  Better to process before
+     * idle handlers than after, because the goal of idle handlers is
+     * to delay until after all pending events have been processed.
+     * Must free up delayedMotionEvent *before* calling Tk_HandleEvent,
+     * so that the event handler can call Tk_DoOneEvent recursively
+     * without infinite looping.
+     */
+
+    if ((eventDelayed) && (flags & TK_X_EVENTS)) {
+       XEvent copy;
+
+       copy = delayedMotionEvent;
+       eventDelayed = 0;
+       Tk_HandleEvent(&copy);
+       return 1;
+    }
+
+    /*
+     * Phase Four: if there are DoWhenIdle requests pending (or
+     * if we're not allowed to block), then do a select with an
+     * instantaneous timeout.  If a ready file is found, then go
+     * back to process it.
+     */
+
+    if (((idleList != NULL) && (flags & TK_IDLE_EVENTS))
+           || (flags & TK_DONT_WAIT)) {
+       if (flags & (TK_X_EVENTS|TK_FILE_EVENTS)) {
+           memcpy((VOID *) ready, (VOID *) masks, 3*MASK_SIZE*sizeof(int));
+           timeout.tv_sec = timeout.tv_usec = 0;
+           do {
+               numFound = select(numFds, (SELECT_MASK *) readPtr,
+                       (SELECT_MASK *) writePtr, (SELECT_MASK *) exceptPtr,
+                   &timeout);
+           } while ((numFound == -1) && (errno == EINTR));
+           if (numFound > 0) {
+               goto checkFiles;
+           }
+       }
+    }
+
+    /*
+     * Phase Five:  process all pending DoWhenIdle requests.
+     */
+
+    if ((idleList != NULL) && (flags & TK_IDLE_EVENTS)) {
+       register IdleHandler *idlePtr;
+
+       /*
+        * If you change the code below, be aware that new handlers
+        * can get added to the list while the current one is being
+        * processed.
+        *
+        * NOTE!  Must remove the entry from the list before calling
+        * it, in case the idle handler calls Tk_DoOneEvent:  don't
+        * want to loop infinitely.  Must also be careful because
+        * Tk_CancelIdleCall could change the list during the call.
+        */
+
+       while (idleList != NULL) {
+           idlePtr = idleList;
+           idleList = idlePtr->nextPtr;
+           if (idleList == NULL) {
+               lastIdlePtr = NULL;
+           }
+           (*idlePtr->proc)(idlePtr->clientData);
+           FreeIdleHandler(idlePtr);
+       }
+       return 1;
+    }
+
+    /*
+     * Phase Six: do a select to wait for either one of the
+     * files to become ready or for the first timer event to
+     * fire.  Then go back to process the event.
+     */
+
+    if ((flags & TK_DONT_WAIT)
+           || !(flags & (TK_TIMER_EVENTS|TK_FILE_EVENTS|TK_X_EVENTS))) {
+       return 0;
+    }
+    if ((timerQueue == NULL) || !(flags & TK_TIMER_EVENTS)) {
+       timeoutPtr = NULL;
+    } else {
+       timeoutPtr = &timeout;
+       timeout.tv_sec = timerQueue->time.tv_sec - curTime.tv_sec;
+       timeout.tv_usec = timerQueue->time.tv_usec - curTime.tv_usec;
+       if (timeout.tv_usec < 0) {
+           timeout.tv_sec -= 1;
+           timeout.tv_usec += 1000000;
+       }
+    }
+    memcpy((VOID *) ready, (VOID *) masks, 3*MASK_SIZE*sizeof(int));
+    do {
+       numFound = select(numFds, (SELECT_MASK *) readPtr,
+               (SELECT_MASK *) writePtr, (SELECT_MASK *) exceptPtr,
+               timeoutPtr);
+    } while ((numFound == -1) && (errno == EINTR));
+    if (numFound == 0) {
+       goto checkTime;
+    }
+    goto checkFiles;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_MainLoop --
+ *
+ *     Call Tk_DoOneEvent over and over again in an infinite
+ *     loop as long as there exist any main windows.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Arbitrary;  depends on handlers for events.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_MainLoop()
+{
+    while (!tkMustExit &&
+          tk_NumMainWindows > 0) {
+       Tk_DoOneEvent(0);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_Sleep --
+ *
+ *     Delay execution for the specified number of milliseconds.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Time passes.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_Sleep(ms)
+    int ms;                    /* Number of milliseconds to sleep. */
+{
+    static struct timeval delay;
+
+    delay.tv_sec = ms/1000;
+    delay.tv_usec = (ms%1000)*1000;
+    (void) select(0, (SELECT_MASK *) 0, (SELECT_MASK *) 0,
+           (SELECT_MASK *) 0, &delay);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_RestrictEvents --
+ *
+ *     This procedure is used to globally restrict the set of events
+ *     that will be dispatched.  The restriction is done by filtering
+ *     all incoming X events through a procedure that determines
+ *     whether they are to be processed immediately or deferred.
+ *
+ * Results:
+ *     The return value is the previous restriction procedure in effect,
+ *     if there was one, or NULL if there wasn't.
+ *
+ * Side effects:
+ *     From now on, proc will be called to determine whether to process
+ *     or defer each incoming X event.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Tk_RestrictProc *
+Tk_RestrictEvents(proc, arg, prevArgPtr)
+    Tk_RestrictProc *proc;     /* X "if" procedure to call for each
+                                * incoming event.  See "XIfEvent" doc.
+                                * for details. */
+    char *arg;                 /* Arbitrary argument to pass to proc. */
+    char **prevArgPtr;         /* Place to store information about previous
+                                * argument. */
+{
+    Bool (*prev)  _ANSI_ARGS_((Display *display, XEvent *eventPtr, char *arg));
+
+    prev = restrictProc;
+    *prevArgPtr = restrictArg;
+    restrictProc = proc;
+    restrictArg = arg;
+    return prev;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_CreateFocusHandler --
+ *
+ *     Arrange for a procedure to be called whenever the focus
+ *     enters or leaves a given window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     After this procedure has been invoked, whenever tkwin gets
+ *     or loses the input focus, proc will be called.  It should have
+ *     the following structure:
+ *
+ *     void
+ *     proc(clientData, gotFocus)
+ *         ClientData clientData;
+ *         int gotFocus;
+ *     {
+ *     }
+ *
+ *     The clientData argument to "proc" will be the same as the
+ *     clientData argument to this procedure.  GotFocus will be
+ *     1 if tkwin is getting the focus, and 0 if it's losing the
+ *     focus.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_CreateFocusHandler(tkwin, proc, clientData)
+    Tk_Window tkwin;           /* Token for window. */
+    Tk_FocusProc *proc;                /* Procedure to call when tkwin gets
+                                * or loses the input focus. */
+    ClientData clientData;     /* Arbitrary value to pass to proc. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    winPtr->focusProc = proc;
+    winPtr->focusData = clientData;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_FocusCmd --
+ *
+ *     This procedure is invoked to process the "focus" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_FocusCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    register TkWindow *winPtr = (TkWindow *) clientData;
+    register TkWindow *newPtr;
+
+    if (argc > 3) {
+       focusSyntax:
+       Tcl_AppendResult(interp, "too many args: should be \"",
+               argv[0], " ?-query? ?window?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if (argc == 1) {
+       if (winPtr->dispPtr->focusPtr == NULL) {
+           interp->result = "none";
+       } else {
+           interp->result = winPtr->dispPtr->focusPtr->pathName;
+       }
+       return TCL_OK;
+    }
+
+    if (argv[1][0] == '-') {
+       int switchLength;
+
+       switchLength = strlen(argv[1]);
+       if ((switchLength >= 2)
+               && (strncmp(argv[1], "-query", switchLength) == 0)) {
+
+           if (argc != 3) {
+               goto focusSyntax;
+           }
+
+           newPtr = (TkWindow *) Tk_NameToWindow(interp, argv[2], tkwin);
+           if (newPtr == NULL) {
+               return TCL_ERROR;
+           }
+           if (newPtr->dispPtr->focusPtr == NULL) {
+               interp->result = "none";
+           } else {
+               interp->result = newPtr->dispPtr->focusPtr->pathName;
+           }
+           return TCL_OK;
+       }
+    }
+
+    if (argc != 2) {
+       goto focusSyntax;
+    }
+
+    if (strcmp(argv[1], "none") == 0) {
+       newPtr = NULL;
+    } else {
+       newPtr = (TkWindow *) Tk_NameToWindow(interp, argv[1], tkwin);
+       if (newPtr == NULL) {
+           return TCL_ERROR;
+       }
+    }
+    /* XXX: mumble frotz */
+/*    if (newPtr->dispPtr->focusPtr == newPtr) { */
+    if ((!newPtr) || (newPtr->dispPtr->focusPtr == newPtr)) {
+       return TCL_OK;
+    }
+    if (winPtr == newPtr->dispPtr->mouseMainPtr) { /* XXX: ??? presumably */
+       if ((newPtr->dispPtr->focusPtr != NULL)
+               && (newPtr->dispPtr->focusPtr->focusProc != NULL)) {
+           (*newPtr->dispPtr->focusPtr->focusProc)(
+                   newPtr->dispPtr->focusPtr->focusData, 0);
+       }
+       newPtr->dispPtr->focusPtr = newPtr;
+       if ((newPtr != NULL) && (newPtr->focusProc != NULL)) {
+           (*newPtr->focusProc)(newPtr->focusData, 1);
+       }
+    } else {
+       newPtr->dispPtr->focusPtr = newPtr;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkFocusEventProc --
+ *
+ *     This procedure is invoked whenever the pointer enters
+ *     or leaves a top-level window.  It notifies the current
+ *     owner of the focus, if any.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkFocusEventProc(winPtr, eventPtr)
+    register TkWindow *winPtr; /* Top-level window just entered or left. */
+    XEvent *eventPtr;          /* EnterWindow or LeaveWindow event. */
+{
+    register TkWindow *focusPtr;
+    TkWindow *newMouseMainPtr = NULL;
+
+    if (eventPtr->type == EnterNotify) {
+       newMouseMainPtr = winPtr->mainPtr->winPtr;
+    }
+    if (winPtr->dispPtr->mouseMainPtr == newMouseMainPtr) {
+       return;
+    }
+    if (winPtr->dispPtr->mouseMainPtr != NULL) {
+       focusPtr = winPtr->dispPtr->focusPtr;
+       if ((focusPtr != NULL)
+               && (focusPtr->focusProc != NULL)) {
+           (*focusPtr->focusProc)(focusPtr->focusData, 0);
+       }
+    }
+    winPtr->dispPtr->mouseMainPtr = newMouseMainPtr;
+    if (newMouseMainPtr != NULL) {
+       focusPtr = newMouseMainPtr->dispPtr->focusPtr;
+       if ((focusPtr != NULL)
+               && (focusPtr->focusProc != NULL)) {
+           (*focusPtr->focusProc)(focusPtr->focusData, 1);
+       }
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkEventDeadWindow --
+ *
+ *     This procedure is invoked when it is determined that
+ *     a window is dead.  It cleans up event-related information
+ *     about the window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Various things get cleaned up and recycled.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkEventDeadWindow(winPtr)
+    TkWindow *winPtr;          /* Information about the window
+                                * that is being deleted. */
+{
+    register TkEventHandler *handlerPtr;
+    register InProgress *ipPtr;
+
+    /*
+     * While deleting all the handlers, be careful to check for
+     * Tk_HandleEvent being about to process one of the deleted
+     * handlers.  If it is, tell it to quit (all of the handlers
+     * are being deleted).
+     */
+
+    while (winPtr->handlerList != NULL) {
+       handlerPtr = winPtr->handlerList;
+       winPtr->handlerList = handlerPtr->nextPtr;
+       for (ipPtr = pendingPtr; ipPtr != NULL; ipPtr = ipPtr->nextPtr) {
+           if (ipPtr->nextHandler == handlerPtr) {
+               ipPtr->nextHandler = NULL;
+           }
+           if (ipPtr->winPtr == winPtr) {
+               ipPtr->winPtr = None;
+           }
+       }
+       ckfree((char *) handlerPtr);
+    }
+    if ((winPtr->dispPtr != NULL) && (winPtr->dispPtr->focusPtr == winPtr)) {
+       winPtr->dispPtr->focusPtr = NULL;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkCurrentTime --
+ *
+ *     Try to deduce the current time.  "Current time" means the time
+ *     of the event that led to the current code being executed, which
+ *     means the time in the most recently-nested invocation of
+ *     Tk_HandleEvent.
+ *
+ * Results:
+ *     The return value is the time from the current event, or
+ *     CurrentTime if there is no current event or if the current
+ *     event contains no time.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Time
+TkCurrentTime(dispPtr)
+    TkDisplay *dispPtr;                /* Display for which the time is desired. */
+{
+    register XEvent *eventPtr;
+
+    if (pendingPtr == NULL) {
+       return dispPtr->lastEventTime;
+    }
+    eventPtr = pendingPtr->eventPtr;
+    switch (eventPtr->type) {
+       case ButtonPress:
+       case ButtonRelease:
+           return eventPtr->xbutton.time;
+       case KeyPress:
+       case KeyRelease:
+           return eventPtr->xkey.time;
+       case MotionNotify:
+           return eventPtr->xmotion.time;
+       case EnterNotify:
+       case LeaveNotify:
+           return eventPtr->xcrossing.time;
+       case PropertyNotify:
+           return eventPtr->xproperty.time;
+    }
+    return dispPtr->lastEventTime;
+}
diff --git a/src/tk/tkfont.c b/src/tk/tkfont.c
new file mode 100644 (file)
index 0000000..9d6acbe
--- /dev/null
@@ -0,0 +1,773 @@
+/* 
+ * tkFont.c --
+ *
+ *     This file maintains a database of looked-up fonts for the Tk
+ *     toolkit, in order to avoid round-trips to the server to map
+ *     font names to XFontStructs.
+ *
+ * Copyright 1990 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkFont.c,v 1.21 92/06/15 14:00:19 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tkint.h"
+
+/*
+ * This module caches extra information about fonts in addition to
+ * what X already provides.  The extra information is used by the
+ * TkMeasureChars procedure, and consists of two parts:  a type and
+ * a width.  The type is one of the following:
+ *
+ * NORMAL:             Standard character.
+ * TAB:                        Tab character:  output enough space to
+ *                     get to next tab stop.
+ * NEWLINE:            Newline character:  don't output anything more
+ *                     on this line (character has infinite width).
+ * REPLACE:            This character doesn't print:  instead of
+ *                     displaying character, display a replacement
+ *                     sequence of the form "\xdd" where dd is the
+ *                     hex equivalent of the character.
+ * SKIP:               Don't display anything for this character.  This
+ *                     is only used where the font doesn't contain
+ *                     all the characters needed to generate
+ *                     replacement sequences.
+ * The width gives the total width of the displayed character or
+ * sequence:  for replacement sequences, it gives the width of the
+ * sequence.
+ */
+
+#define NORMAL         1
+#define TAB            2
+#define NEWLINE                3
+#define REPLACE                4
+#define SKIP           5
+
+/*
+ * One of the following data structures exists for each font that is
+ * currently active.  The structure is indexed with two hash tables,
+ * one based on font name and one based on XFontStruct address.
+ */
+
+typedef struct {
+    XFontStruct *fontStructPtr;        /* X information about font. */
+    Display *display;          /* Display to which font belongs. */
+    int refCount;              /* Number of active uses of this font. */
+    char *types;               /* Malloc'ed array giving types of all
+                                * chars in the font (may be NULL). */
+    unsigned char *widths;     /* Malloc'ed array giving widths of all
+                                * chars in the font (may be NULL). */
+    int tabWidth;              /* Width of tabs in this font. */
+    Tcl_HashEntry *nameHashPtr;        /* Entry in name-based hash table (needed
+                                * when deleting this structure). */
+} TkFont;
+
+/*
+ * Hash table for name -> TkFont mapping, and key structure used to
+ * index into that table:
+ */
+
+static Tcl_HashTable nameTable;
+typedef struct {
+    Tk_Uid name;               /* Name of font. */
+    Display *display;          /* Display for which font is valid. */
+} NameKey;
+
+/*
+ * Hash table for font struct -> TkFont mapping. This table is
+ * indexed by the XFontStruct address.
+ */
+
+static Tcl_HashTable fontTable;
+
+static int initialized = 0;    /* 0 means static structures haven't been
+                                * initialized yet. */
+
+/*
+ * To speed up TkMeasureChars, the variables below keep the last
+ * mapping from (XFontStruct *) to (TkFont *).
+ */
+
+static TkFont *lastFontPtr = NULL;
+static XFontStruct *lastFontStructPtr = NULL;
+
+/*
+ * Characters used when displaying control sequences as their
+ * hex equivalents.
+ */
+
+static char hexChars[] = "0123456789abcdefx\\";
+
+/*
+ * Forward declarations for procedures defined in this file:
+ */
+
+static void            FontInit _ANSI_ARGS_((void));
+static void            SetFontMetrics _ANSI_ARGS_((TkFont *fontPtr));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_GetFontStruct --
+ *
+ *     Given a string name for a font, map the name to an XFontStruct
+ *     describing the font.
+ *
+ * Results:
+ *     The return value is normally a pointer to the font description
+ *     for the desired font.  If an error occurs in mapping the string
+ *     to a font, then an error message will be left in interp->result
+ *     and NULL will be returned.
+ *
+ * Side effects:
+ *     The font is added to an internal database with a reference count.
+ *     For each call to this procedure, there should eventually be a call
+ *     to Tk_FreeFontStruct, so that the database is cleaned up when fonts
+ *     aren't in use anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+
+XFontStruct *
+Tk_GetFontStruct(interp, tkwin, name)
+    Tcl_Interp *interp;                /* Place to leave error message if
+                                * font can't be found. */
+    Tk_Window tkwin;           /* Window in which font will be used. */
+    Tk_Uid name;               /* Name of font (in form suitable for
+                                * passing to XLoadQueryFont). */
+{
+    NameKey nameKey;
+    Tcl_HashEntry *nameHashPtr, *fontHashPtr;
+    int new;
+    register TkFont *fontPtr;
+    XFontStruct *fontStructPtr;
+
+    if (!initialized) {
+       FontInit();
+    }
+
+    /*
+     * First, check to see if there's already a mapping for this font
+     * name.
+     */
+
+    nameKey.name = name;
+    nameKey.display = Tk_Display(tkwin);
+    nameHashPtr = Tcl_CreateHashEntry(&nameTable, (char *) &nameKey, &new);
+    if (!new) {
+       fontPtr = (TkFont *) Tcl_GetHashValue(nameHashPtr);
+       fontPtr->refCount++;
+       return fontPtr->fontStructPtr;
+    }
+
+    /*
+     * The name isn't currently known.  Map from the name to a font, and
+     * add a new structure to the database.
+     */
+
+    fontStructPtr = XLoadQueryFont(nameKey.display, name);
+    if (fontStructPtr == NULL) {
+       Tcl_DeleteHashEntry(nameHashPtr);
+       Tcl_AppendResult(interp, "font \"", name, "\" doesn't exist",
+               (char *) NULL);
+       return NULL;
+    }
+    fontPtr = (TkFont *) ckalloc(sizeof(TkFont));
+    fontPtr->display = nameKey.display;
+    fontPtr->fontStructPtr = fontStructPtr;
+    fontPtr->refCount = 1;
+    fontPtr->types = NULL;
+    fontPtr->widths = NULL;
+    fontPtr->nameHashPtr = nameHashPtr;
+    fontHashPtr = Tcl_CreateHashEntry(&fontTable, (char *) fontStructPtr, &new);
+    if (!new) {
+       panic("XFontStruct already registered in Tk_GetFontStruct");
+    }
+    Tcl_SetHashValue(nameHashPtr, fontPtr);
+    Tcl_SetHashValue(fontHashPtr, fontPtr);
+    return fontPtr->fontStructPtr;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_NameOfFontStruct --
+ *
+ *     Given a font, return a textual string identifying it.
+ *
+ * Results:
+ *     If font was created by Tk_GetFontStruct, then the return
+ *     value is the "string" that was used to create it.
+ *     Otherwise the return value is a string giving the X
+ *     identifier for the font.  The storage for the returned
+ *     string is only guaranteed to persist up until the next
+ *     call to this procedure.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+char *
+Tk_NameOfFontStruct(fontStructPtr)
+    XFontStruct *fontStructPtr;                /* Font whose name is desired. */
+{
+    Tcl_HashEntry *fontHashPtr;
+    TkFont *fontPtr;
+    static char string[20];
+
+    if (!initialized) {
+       printid:
+       sprintf(string, "font id 0x%x", fontStructPtr->fid);
+       return string;
+    }
+    fontHashPtr = Tcl_FindHashEntry(&fontTable, (char *) fontStructPtr);
+    if (fontHashPtr == NULL) {
+       goto printid;
+    }
+    fontPtr = (TkFont *) Tcl_GetHashValue(fontHashPtr);
+    return ((NameKey *) fontPtr->nameHashPtr->key.words)->name;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_FreeFontStruct --
+ *
+ *     This procedure is called to release a font allocated by
+ *     Tk_GetFontStruct.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The reference count associated with font is decremented, and
+ *     the font is officially deallocated if no-one is using it
+ *     anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_FreeFontStruct(fontStructPtr)
+    XFontStruct *fontStructPtr;        /* Font to be released. */
+{
+    Tcl_HashEntry *fontHashPtr;
+    register TkFont *fontPtr;
+
+    if (!initialized) {
+       panic("Tk_FreeFontStruct called before Tk_GetFontStruct");
+    }
+
+    fontHashPtr = Tcl_FindHashEntry(&fontTable, (char *) fontStructPtr);
+    if (fontHashPtr == NULL) {
+       panic("Tk_FreeFontStruct received unknown font argument");
+    }
+    fontPtr = (TkFont *) Tcl_GetHashValue(fontHashPtr);
+    fontPtr->refCount--;
+    if (fontPtr->refCount == 0) {
+       XFreeFont(fontPtr->display, fontPtr->fontStructPtr);
+       Tcl_DeleteHashEntry(fontPtr->nameHashPtr);
+       Tcl_DeleteHashEntry(fontHashPtr);
+       if (fontPtr->types != NULL) {
+           ckfree(fontPtr->types);
+       }
+       if (fontPtr->widths != NULL) {
+           ckfree((char *) fontPtr->widths);
+       }
+       ckfree((char *) fontPtr);
+       lastFontStructPtr = NULL;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * FontInit --
+ *
+ *     Initialize the structure used for font management.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Read the code.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+FontInit()
+{
+    initialized = 1;
+    Tcl_InitHashTable(&nameTable, sizeof(NameKey)/sizeof(int));
+    Tcl_InitHashTable(&fontTable, TCL_ONE_WORD_KEYS);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * SetFontMetrics --
+ *
+ *     This procedure is called to fill in the "widths" and "types"
+ *     arrays for a font.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     FontPtr gets modified to hold font metric information.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+SetFontMetrics(fontPtr)
+    register TkFont *fontPtr;          /* Font structure in which to
+                                        * set metrics. */
+{
+    int i, replaceOK, baseWidth;
+    register XFontStruct *fontStructPtr = fontPtr->fontStructPtr;
+    char *p;
+
+    /*
+     * Pass 1: initialize the arrays.
+     */
+
+    fontPtr->types = (char *) ckalloc(256);
+    fontPtr->widths = (unsigned char *) ckalloc(256);
+    for (i = 0; i < 256; i++) {
+       fontPtr->types[i] = REPLACE;
+    }
+
+    /*
+     * Pass 2:  for all characters that exist in the font and are
+     * not control characters, fill in the type and width
+     * information.
+     */
+
+    for (i = ' '; i < 256;  i++) {
+       if ((i == 0177) || (i < fontStructPtr->min_char_or_byte2)
+               || (i > fontStructPtr->max_char_or_byte2)) {
+           continue;
+       }
+       fontPtr->types[i] = NORMAL;
+       if (fontStructPtr->per_char == NULL) {
+           fontPtr->widths[i] = fontStructPtr->min_bounds.width;
+       } else {
+           fontPtr->widths[i] = fontStructPtr->per_char[i
+                   - fontStructPtr->min_char_or_byte2].width;
+       }
+    }
+
+    /*
+     * Pass 3: fill in information for characters that have to
+     * be replaced with  "\xhh" strings.  If the font doesn't
+     * have the characters needed for this, then just use the
+     * font's default character.
+     */
+
+    replaceOK = 1;
+    baseWidth = fontPtr->widths['\\'] + fontPtr->widths['x'];
+    for (p = hexChars; *p != 0; p++) {
+       if (fontPtr->types[*p] != NORMAL) {
+           replaceOK = 0;
+           break;
+       }
+    }
+    for (i = 0; i < 256; i++) {
+       if (fontPtr->types[i] != REPLACE) {
+           continue;
+       }
+       if (replaceOK) {
+           fontPtr->widths[i] = baseWidth
+                   + fontPtr->widths[hexChars[i & 0xf]]
+                   + fontPtr->widths[hexChars[(i>>4) & 0xf]];
+       } else {
+           fontPtr->types[i] = SKIP;
+           fontPtr->widths[i] = 0;
+       }
+    }
+
+    /*
+     * Lastly, fill in special information for newline and tab.
+     */
+
+    fontPtr->types['\n'] = NEWLINE;
+    fontPtr->widths['\n'] = 0;
+    fontPtr->types['\t'] = TAB;
+    fontPtr->widths['\t'] = 0;
+    if (fontPtr->types['0'] == NORMAL) {
+       fontPtr->tabWidth = 8*fontPtr->widths['0'];
+    } else {
+       fontPtr->tabWidth = 8*fontStructPtr->max_bounds.width;
+    }
+
+    /*
+     * Make sure the tab width isn't zero (some fonts may not have enough
+     * information to set a reasonable tab width).
+     */
+
+    if (fontPtr->tabWidth == 0) {
+       fontPtr->tabWidth = 1;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkMeasureChars --
+ *
+ *     Measure the number of characters from a string that
+ *     will fit in a given horizontal span.  The measurement
+ *     is done under the assumption that TkDisplayChars will
+ *     be used to actually display the characters.
+ *
+ * Results:
+ *     The return value is the number of characters from source
+ *     that fit in the span given by startX and maxX.  *nextXPtr
+ *     is filled in with the x-coordinate at which the first
+ *     character that didn't fit would be drawn, if it were to
+ *     be drawn.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+TkMeasureChars(fontStructPtr, source, maxChars, startX, maxX, flags, nextXPtr)
+    XFontStruct *fontStructPtr;        /* Font in which to draw characters. */
+    char *source;              /* Characters to be displayed.  Need not
+                                * be NULL-terminated. */
+    int maxChars;              /* Maximum # of characters to consider from
+                                * source. */
+    int startX;                        /* X-position at which first character will
+                                * be drawn. */
+    int maxX;                  /* Don't consider any character that would
+                                * cross this x-position. */
+    int flags;                 /* Various flag bits OR-ed together.
+                                * TK_WHOLE_WORDS means stop on a word boundary
+                                * (just before a space character) if
+                                * possible.  TK_AT_LEAST_ONE means always
+                                * return a value of at least one, even
+                                * if the character doesn't fit. 
+                                * TK_PARTIAL_OK means it's OK to display only
+                                * a part of the last character in the line.
+                                * TK_NEWLINES_NOT_SPECIAL means that newlines
+                                * are treated just like other control chars:
+                                * they don't terminate the line,*/
+    int *nextXPtr;             /* Return x-position of terminating
+                                * character here. */
+{
+    register TkFont *fontPtr;
+    register char *p;          /* Current character. */
+    register int c;
+    char *term;                        /* Pointer to most recent character that
+                                * may legally be a terminating character. */
+    int termX;                 /* X-position just after term. */
+    int curX;                  /* X-position corresponding to p. */
+    int newX;                  /* X-position corresponding to p+1. */
+    int type;
+
+    /*
+     * Find the TkFont structure for this font, and make sure its
+     * font metrics exist.
+     */
+
+    if (lastFontStructPtr == fontStructPtr) {
+       fontPtr = lastFontPtr;
+    } else {
+       Tcl_HashEntry *fontHashPtr;
+
+       if (!initialized) {
+           badArg:
+           panic("TkMeasureChars received unknown font argument");
+       }
+    
+       fontHashPtr = Tcl_FindHashEntry(&fontTable, (char *) fontStructPtr);
+       if (fontHashPtr == NULL) {
+           goto badArg;
+       }
+       fontPtr = (TkFont *) Tcl_GetHashValue(fontHashPtr);
+       lastFontStructPtr = fontPtr->fontStructPtr;
+       lastFontPtr = fontPtr;
+    }
+    if (fontPtr->types == NULL) {
+       SetFontMetrics(fontPtr);
+    }
+
+    /*
+     * Scan the input string one character at a time, until a character
+     * is found that crosses maxX.
+     */
+
+    newX = curX = startX;
+    termX = 0;         /* Not needed, but eliminates compiler warning. */
+    term = source;
+    for (p = source, c = *p & 0xff; maxChars > 0; p++, maxChars--) {
+       type = fontPtr->types[c];
+       if (type == NORMAL) {
+           newX += fontPtr->widths[c];
+       } else if (type == TAB) {
+           newX += fontPtr->tabWidth;
+           newX -= newX % fontPtr->tabWidth;
+       } else if (type == REPLACE) {
+           replaceType:
+           newX += fontPtr->widths['\\'] + fontPtr->widths['x']
+                   + fontPtr->widths[hexChars[(c >> 4) & 0xf]]
+                   + fontPtr->widths[hexChars[c & 0xf]];
+       } else if (type == NEWLINE) {
+           if (flags & TK_NEWLINES_NOT_SPECIAL) {
+               goto replaceType;
+           }
+           break;
+       } else if (type != SKIP) {
+           panic("Unknown type %d in TkMeasureChars", type);
+       }
+       if (newX > maxX) {
+           break;
+       }
+       c = p[1] & 0xff;
+       if (isspace(c) || (c == 0)) {
+           term = p+1;
+           termX = newX;
+       }
+       curX = newX;
+    }
+
+    /*
+     * P points to the first character that doesn't fit in the desired
+     * span.  Use the flags to figure out what to return.
+     */
+
+    if ((flags & TK_PARTIAL_OK) && (curX < maxX)) {
+       curX = newX;
+       p++;
+    }
+    if ((flags & TK_AT_LEAST_ONE) && (term == source) && (maxChars > 0)
+            & !isspace(*term)) {
+       term = p;
+       termX = curX;
+       if (term == source) {
+           term++;
+           termX = newX;
+       }
+    } else if ((maxChars == 0) || !(flags & TK_WHOLE_WORDS)) {
+       term = p;
+       termX = curX;
+    }
+    *nextXPtr = termX;
+    return term-source;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkDisplayChars --
+ *
+ *     Draw a string of characters on the screen, converting
+ *     tabs to the right number of spaces and control characters
+ *     to sequences of the form "\xhh" where hh are two hex
+ *     digits.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information gets drawn on the screen.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkDisplayChars(display, drawable, gc, fontStructPtr, string, numChars,
+       x, y, flags)
+    Display *display;          /* Display on which to draw. */
+    Drawable drawable;         /* Window or pixmap in which to draw. */
+    GC gc;                     /* Graphics context for actually drawing
+                                * characters. */
+    XFontStruct *fontStructPtr;        /* Font used in GC;  must have been allocated
+                                * by Tk_GetFontStruct.  Used to compute sizes
+                                * of tabs, etc. */
+    char *string;              /* Characters to be displayed. */
+    int numChars;              /* Number of characters to display from
+                                * string. */
+    int x, y;                  /* Coordinates at which to draw string. */
+    int flags;                 /* Flags to control display.  Only
+                                * TK_NEWLINES_NOT_SPECIAL is supported right
+                                * now.  See TkMeasureChars for information
+                                * about it. */
+{
+    register TkFont *fontPtr;
+    register char *p;          /* Current character being scanned. */
+    register int c;
+    int type;
+    char *start;               /* First character waiting to be displayed. */
+    int startX;                        /* X-coordinate corresponding to start. */
+    int curX;                  /* X-coordinate corresponding to p. */
+    char replace[10];
+
+    /*
+     * Find the TkFont structure for this font, and make sure its
+     * font metrics exist.
+     */
+
+    if (lastFontStructPtr == fontStructPtr) {
+       fontPtr = lastFontPtr;
+    } else {
+       Tcl_HashEntry *fontHashPtr;
+
+       if (!initialized) {
+           badArg:
+           panic("TkDisplayChars received unknown font argument");
+       }
+    
+       fontHashPtr = Tcl_FindHashEntry(&fontTable, (char *) fontStructPtr);
+       if (fontHashPtr == NULL) {
+           goto badArg;
+       }
+       fontPtr = (TkFont *) Tcl_GetHashValue(fontHashPtr);
+       lastFontStructPtr = fontPtr->fontStructPtr;
+       lastFontPtr = fontPtr;
+    }
+    if (fontPtr->types == NULL) {
+       SetFontMetrics(fontPtr);
+    }
+
+    /*
+     * Scan the string one character at a time.  Display control
+     * characters immediately, but delay displaying normal characters
+     * in order to pass many characters to the server all together.
+     */
+
+    startX = curX = x;
+    start = string;
+    for (p = string; numChars > 0; numChars--, p++) {
+       c = *p & 0xff;
+       type = fontPtr->types[c];
+       if (type == NORMAL) {
+           curX += fontPtr->widths[c];
+           continue;
+       }
+       if (p != start) {
+           XDrawString(display, drawable, gc, startX, y, start, p - start);
+           startX = curX;
+       }
+       if (type == TAB) {
+           curX += fontPtr->tabWidth;
+           curX -= curX % fontPtr->tabWidth;
+       } else if (type == REPLACE) {
+           doReplace:
+           replace[0] = '\\';
+           replace[1] = 'x';
+           replace[2] = hexChars[(c >> 4) & 0xf];
+           replace[3] = hexChars[c & 0xf];
+           XDrawString(display, drawable, gc, startX, y, replace, 4);
+           curX += fontPtr->widths[replace[0]]
+                   + fontPtr->widths[replace[1]]
+                   + fontPtr->widths[replace[2]]
+                   + fontPtr->widths[replace[3]];
+       } else if (type == NEWLINE) {
+           if (flags & TK_NEWLINES_NOT_SPECIAL) {
+               goto doReplace;
+           }
+           y += fontStructPtr->ascent + fontStructPtr->descent;
+           curX = x;
+       } else if (type != SKIP) {
+           panic("Unknown type %d in TkDisplayChars", type);
+       }
+       startX = curX;
+       start = p+1;
+    }
+
+    /*
+     * At the very end, there may be one last batch of normal characters
+     * to display.
+     */
+
+    if (p != start) {
+       XDrawString(display, drawable, gc, startX, y, start, p - start);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkUnderlineChars --
+ *
+ *     This procedure draws an underline for a given range of characters
+ *     in a given string, using appropriate information for the string's
+ *     font.  It doesn't draw the characters (which are assumed to have
+ *     been displayed previously);  it just draws the underline.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information gets displayed in "drawable".
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkUnderlineChars(display, drawable, gc, fontStructPtr, string, x, y,
+       flags, firstChar, lastChar)
+    Display *display;          /* Display on which to draw. */
+    Drawable drawable;         /* Window or pixmap in which to draw. */
+    GC gc;                     /* Graphics context for actually drawing
+                                * underline. */
+    XFontStruct *fontStructPtr;        /* Font used in GC;  must have been allocated
+                                * by Tk_GetFontStruct.  Used to character
+                                * dimensions, etc. */
+    char *string;              /* String containing characters to be
+                                * underlined. */
+    int x, y;                  /* Coordinates at which first character of
+                                * string is drawn. */
+    int flags;                 /* Flags that were passed to TkDisplayChars. */
+    int firstChar;             /* Index of first character to underline. */
+    int lastChar;              /* Index of last character to underline. */
+{
+    int xUnder, yUnder, width, height;
+    unsigned long value;
+
+    /*
+     * First compute the vertical span of the underline, using font
+     * properties if they exist.
+     */
+
+    if (XGetFontProperty(fontStructPtr, XA_UNDERLINE_POSITION, &value)) {
+       yUnder = y + value;
+    } else {
+       yUnder = y + fontStructPtr->max_bounds.descent/2;
+    }
+    if (XGetFontProperty(fontStructPtr, XA_UNDERLINE_THICKNESS, &value)) {
+       height = value;
+    } else {
+       height = 2;
+    }
+
+    /*
+     * Now compute the horizontal span of the underline.
+     */
+
+    TkMeasureChars(fontStructPtr, string, firstChar, x, (int) 1000000, flags,
+           &xUnder);
+    TkMeasureChars(fontStructPtr, string+firstChar, lastChar+1-firstChar,
+           xUnder, (int) 1000000, flags, &width);
+    width -= xUnder;
+
+    XFillRectangle(display, drawable, gc, xUnder, yUnder,
+           (unsigned int) width, (unsigned int) height);
+}
diff --git a/src/tk/tkframe.c b/src/tk/tkframe.c
new file mode 100644 (file)
index 0000000..11bd369
--- /dev/null
@@ -0,0 +1,507 @@
+/* 
+ * tkFrame.c --
+ *
+ *     This module implements "frame" widgets for the Tk
+ *     toolkit.  Frames are windows with a background color
+ *     and possibly a 3-D effect, but no other attributes.
+ *
+ * Copyright 1990 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkFrame.c,v 1.27 92/08/21 16:17:24 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "default.h"
+#include "tkconfig.h"
+#include "tk.h"
+
+/*
+ * A data structure of the following type is kept for each
+ * frame that currently exists for this process:
+ */
+
+typedef struct {
+    Tk_Window tkwin;           /* Window that embodies the frame.  NULL
+                                * means that the window has been destroyed
+                                * but the data structures haven't yet been
+                                * cleaned up.*/
+    Tcl_Interp *interp;                /* Interpreter associated with
+                                * widget.  Used to delete widget
+                                * command.  */
+    Tk_Uid screenName;         /* If this window isn't a toplevel window
+                                * then this is NULL;  otherwise it gives
+                                * the name of the screen on which window
+                                * is displayed. */
+    Tk_3DBorder border;                /* Structure used to draw 3-D border and
+                                * background. */
+    int borderWidth;           /* Width of 3-D border (if any). */
+    int relief;                        /* 3-d effect: TK_RELIEF_RAISED etc. */
+    int width;                 /* Width to request for window.  <= 0 means
+                                * don't request any size. */
+    int height;                        /* Height to request for window.  <= 0 means
+                                * don't request any size. */
+    char *geometry;            /* Geometry that user requested.  NULL
+                                * means use width and height instead. 
+                                * Malloc'ed. */
+    Cursor cursor;             /* Current cursor for window, or None. */
+    int flags;                 /* Various flags;  see below for
+                                * definitions. */
+} Frame;
+
+/*
+ * Flag bits for frames:
+ *
+ * REDRAW_PENDING:             Non-zero means a DoWhenIdle handler
+ *                             has already been queued to redraw
+ *                             this window.
+ * CLEAR_NEEDED;               Need to clear the window when redrawing.
+ */
+
+#define REDRAW_PENDING         1
+#define CLEAR_NEEDED           2
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_FRAME_BG_COLOR, Tk_Offset(Frame, border), TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_FRAME_BG_MONO, Tk_Offset(Frame, border), TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       DEF_FRAME_BORDER_WIDTH, Tk_Offset(Frame, borderWidth), 0},
+    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",
+       DEF_FRAME_CURSOR, Tk_Offset(Frame, cursor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_STRING, "-geometry", "geometry", "Geometry",
+       DEF_FRAME_GEOMETRY, Tk_Offset(Frame, geometry), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_PIXELS, "-height", "height", "Height",
+       DEF_FRAME_HEIGHT, Tk_Offset(Frame, height), 0},
+    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
+       DEF_FRAME_RELIEF, Tk_Offset(Frame, relief), 0},
+    {TK_CONFIG_PIXELS, "-width", "width", "Width",
+       DEF_FRAME_WIDTH, Tk_Offset(Frame, width), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static int     ConfigureFrame _ANSI_ARGS_((Tcl_Interp *interp,
+                   Frame *framePtr, int argc, char **argv, int flags));
+static void    DestroyFrame _ANSI_ARGS_((ClientData clientData));
+static void    DisplayFrame _ANSI_ARGS_((ClientData clientData));
+static void    FrameEventProc _ANSI_ARGS_((ClientData clientData,
+                   XEvent *eventPtr));
+static int     FrameWidgetCmd _ANSI_ARGS_((ClientData clientData,
+                   Tcl_Interp *interp, int argc, char **argv));
+static void    MapFrame _ANSI_ARGS_((ClientData clientData));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_FrameCmd --
+ *
+ *     This procedure is invoked to process the "frame" and
+ *     "toplevel" Tcl commands.  See the user documentation for
+ *     details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_FrameCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    Tk_Window new;
+    register Frame *framePtr;
+    Tk_Uid screenUid;
+    char *className, *screen;
+    int src, dst;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " pathName ?options?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * The code below is a special workaround that extracts a few key
+     * options from the argument list now, rather than letting
+     * ConfigureFrame do it.  This is necessary because we have
+     * to know the window's screen (if it's top-level) and its
+     * class before creating the window.
+     */
+
+    screen = NULL;
+    className = (argv[0][0] == 't') ? "Toplevel" : "Frame";
+    for (src = 2, dst = 2; src < argc;  src += 2) {
+       char c;
+
+       c = argv[src][1];
+       if ((c == 'c')
+               && (strncmp(argv[src], "-class", strlen(argv[src])) == 0)) {
+           className = argv[src+1];
+       } else if ((argv[0][0] == 't') && (c == 's')
+               && (strncmp(argv[src], "-screen", strlen(argv[src])) == 0)) {
+           screen = argv[src+1];
+       } else {
+           argv[dst] = argv[src];
+           argv[dst+1] = argv[src+1];
+           dst += 2;
+       }
+    }
+    argc -= src-dst;
+
+    /*
+     * Provide a default screen for top-level windows (same as screen
+     * of parent window).
+     */
+
+    if ((argv[0][0] == 't') && (screen == NULL)) {
+       screen = "";
+    }
+    if (screen != NULL) {
+       screenUid = Tk_GetUid(screen);
+    } else {
+       screenUid = NULL;
+    }
+
+    /*
+     * Create the window.
+     */
+
+    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], screenUid);
+
+    if (new == NULL) {
+       return TCL_ERROR;
+    }
+
+    Tk_SetClass(new, className);
+    framePtr = (Frame *) ckalloc(sizeof(Frame));
+    framePtr->tkwin = new;
+    framePtr->interp = interp;
+    framePtr->screenName = screenUid;
+    framePtr->border = NULL;
+    framePtr->geometry = NULL;
+    framePtr->cursor = None;
+    framePtr->flags = 0;
+    Tk_CreateEventHandler(framePtr->tkwin, ExposureMask|StructureNotifyMask,
+           FrameEventProc, (ClientData) framePtr);
+    Tcl_CreateCommand(interp, Tk_PathName(framePtr->tkwin),
+           FrameWidgetCmd, (ClientData) framePtr, (void (*)()) NULL);
+
+    if (ConfigureFrame(interp, framePtr, argc-2, argv+2, 0) != TCL_OK) {
+       Tk_DestroyWindow(framePtr->tkwin);
+       return TCL_ERROR;
+    }
+    if (screenUid != NULL) {
+       Tk_DoWhenIdle(MapFrame, (ClientData) framePtr);
+    }
+    interp->result = Tk_PathName(framePtr->tkwin);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * FrameWidgetCmd --
+ *
+ *     This procedure is invoked to process the Tcl command
+ *     that corresponds to a frame widget.  See the user
+ *     documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+FrameWidgetCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Information about frame widget. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    register Frame *framePtr = (Frame *) clientData;
+    int result = TCL_OK;
+    int length;
+    char c;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    Tk_Preserve((ClientData) framePtr);
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)) {
+       if (argc == 2) {
+           result = Tk_ConfigureInfo(interp, framePtr->tkwin, configSpecs,
+                   (char *) framePtr, (char *) NULL, 0);
+       } else if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, framePtr->tkwin, configSpecs,
+                   (char *) framePtr, argv[2], 0);
+       } else {
+           result = ConfigureFrame(interp, framePtr, argc-2, argv+2,
+                   TK_CONFIG_ARGV_ONLY);
+       }
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\":  must be configure", (char *) NULL);
+       result = TCL_ERROR;
+    }
+    Tk_Release((ClientData) framePtr);
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyFrame --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a frame at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the frame is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyFrame(clientData)
+    ClientData clientData;     /* Info about frame widget. */
+{
+    register Frame *framePtr = (Frame *) clientData;
+
+    if (framePtr->border != NULL) {
+       Tk_Free3DBorder(framePtr->border);
+    }
+    if (framePtr->geometry != NULL) {
+       ckfree(framePtr->geometry);
+    }
+    if (framePtr->cursor != None) {
+       Tk_FreeCursor(framePtr->cursor);
+    }
+    ckfree((char *) framePtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureFrame --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or
+ *     reconfigure) a frame widget.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information, such as text string, colors, font,
+ *     etc. get set for framePtr;  old resources get freed, if there
+ *     were any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureFrame(interp, framePtr, argc, argv, flags)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    register Frame *framePtr;  /* Information about widget;  may or may
+                                * not already have values for some fields. */
+    int argc;                  /* Number of valid entries in argv. */
+    char **argv;               /* Arguments. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    if (Tk_ConfigureWidget(interp, framePtr->tkwin, configSpecs,
+           argc, argv, (char *) framePtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    Tk_SetBackgroundFromBorder(framePtr->tkwin, framePtr->border);
+    Tk_SetInternalBorder(framePtr->tkwin, framePtr->borderWidth);
+    if (framePtr->geometry != NULL) {
+       int height, width;
+       if (sscanf(framePtr->geometry, "%dx%d", &width, &height) != 2) {
+           Tcl_AppendResult(interp, "bad geometry \"", framePtr->geometry,
+                   "\": expected widthxheight", (char *) NULL);
+           return TCL_ERROR;
+       }
+       Tk_GeometryRequest(framePtr->tkwin, width, height);
+    } else if ((framePtr->width > 0) && (framePtr->height > 0)) {
+       Tk_GeometryRequest(framePtr->tkwin, framePtr->width,
+               framePtr->height);
+    }
+
+    if (Tk_IsMapped(framePtr->tkwin)
+           && !(framePtr->flags & REDRAW_PENDING)) {
+       Tk_DoWhenIdle(DisplayFrame, (ClientData) framePtr);
+       framePtr->flags |= REDRAW_PENDING|CLEAR_NEEDED;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DisplayFrame --
+ *
+ *     This procedure is invoked to display a frame widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Commands are output to X to display the frame in its
+ *     current mode.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DisplayFrame(clientData)
+    ClientData clientData;     /* Information about widget. */
+{
+    register Frame *framePtr = (Frame *) clientData;
+    register Tk_Window tkwin = framePtr->tkwin;
+
+    framePtr->flags &= ~REDRAW_PENDING;
+    if ((framePtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
+       return;
+    }
+
+    if (framePtr->flags & CLEAR_NEEDED) {
+       XClearWindow(Tk_Display(tkwin), Tk_WindowId(tkwin));
+       framePtr->flags &= ~CLEAR_NEEDED;
+    }
+    if ((framePtr->border != NULL)
+           && (framePtr->relief != TK_RELIEF_FLAT)) {
+       Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               framePtr->border, 0, 0, Tk_Width(tkwin), Tk_Height(tkwin),
+               framePtr->borderWidth, framePtr->relief);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * FrameEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher on
+ *     structure changes to a frame.  For frames with 3D
+ *     borders, this procedure is also invoked for exposures.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the window gets deleted, internal structures get
+ *     cleaned up.  When it gets exposed, it is redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+FrameEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    register XEvent *eventPtr; /* Information about event. */
+{
+    register Frame *framePtr = (Frame *) clientData;
+
+    if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {
+       if ((framePtr->relief != TK_RELIEF_FLAT) && (framePtr->tkwin != NULL)
+               && !(framePtr->flags & REDRAW_PENDING)) {
+           Tk_DoWhenIdle(DisplayFrame, (ClientData) framePtr);
+           framePtr->flags |= REDRAW_PENDING;
+       }
+    } else if (eventPtr->type == DestroyNotify) {
+       Tcl_DeleteCommand(framePtr->interp, Tk_PathName(framePtr->tkwin));
+       framePtr->tkwin = NULL;
+       if (framePtr->flags & REDRAW_PENDING) {
+           Tk_CancelIdleCall(DisplayFrame, (ClientData) framePtr);
+       }
+       Tk_CancelIdleCall(MapFrame, (ClientData) framePtr);
+       Tk_EventuallyFree((ClientData) framePtr, DestroyFrame);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * MapFrame --
+ *
+ *     This procedure is invoked as a when-idle handler to map a
+ *     newly-created top-level frame.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The frame given by the clientData argument is mapped.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+MapFrame(clientData)
+    ClientData clientData;             /* Pointer to frame structure. */
+{
+    Frame *framePtr = (Frame *) clientData;
+
+    /*
+     * Wait for all other background events to be processed before
+     * mapping window.  This ensures that the window's correct geometry
+     * will have been determined before it is first mapped, so that the
+     * window manager doesn't get a false idea of its desired geometry.
+     */
+
+    do {
+       if (Tk_DoOneEvent(TK_IDLE_EVENTS) == 0) {
+           break;
+       }
+
+       /*
+        * After each event, make sure that the window still exists,
+        * and quit if the window has been destroyed.
+        */
+
+       if (framePtr->tkwin == NULL) {
+           return;
+       }
+    } while (1);
+    Tk_MapWindow(framePtr->tkwin);
+}
diff --git a/src/tk/tkgc.c b/src/tk/tkgc.c
new file mode 100644 (file)
index 0000000..b05de57
--- /dev/null
@@ -0,0 +1,334 @@
+/* 
+ * tkGC.c --
+ *
+ *     This file maintains a database of read-only graphics contexts 
+ *     for the Tk toolkit, in order to allow GC's to be shared.
+ *
+ * Copyright 1990 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkGC.c,v 1.9 92/05/13 08:48:45 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tkconfig.h"
+#include "tk.h"
+
+/*
+ * One of the following data structures exists for each GC that is
+ * currently active.  The structure is indexed with two hash tables,
+ * one based on font name and one based on XFontStruct address.
+ */
+
+typedef struct {
+    GC gc;                     /* Graphics context. */
+    Display *display;          /* Display to which gc belongs. */
+    int refCount;              /* Number of active uses of gc. */
+    Tcl_HashEntry *valueHashPtr;/* Entry in valueTable (needed when deleting
+                                * this structure). */
+} TkGC;
+
+/*
+ * Hash table to map from a GC's values to a TkGC structure describing
+ * a GC with those values (used by Tk_GetGC).
+ */
+
+static Tcl_HashTable valueTable;
+typedef struct {
+    XGCValues values;          /* Desired values for GC. */
+    Screen *screen;            /* Screen for which GC is valid. */
+} ValueKey;
+
+/*
+ * Hash table for GC -> TkGC mapping. This table is indexed by the 
+ * GC identifier, and is used by Tk_FreeGC.
+ */
+
+static Tcl_HashTable idTable;
+
+static int initialized = 0;    /* 0 means static structures haven't been
+                                * initialized yet. */
+
+/*
+ * Forward declarations for procedures defined in this file:
+ */
+
+static void            GCInit _ANSI_ARGS_((void));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_GetGC --
+ *
+ *     Given a desired set of values for a graphics context, find
+ *     a read-only graphics context with the desired values.
+ *
+ * Results:
+ *     The return value is the X identifer for the desired graphics
+ *     context.  The caller should never modify this GC, and should
+ *     call Tk_FreeGC when the GC is no longer needed.
+ *
+ * Side effects:
+ *     The GC is added to an internal database with a reference count.
+ *     For each call to this procedure, there should eventually be a call
+ *     to Tk_FreeGC, so that the database can be cleaned up when GC's
+ *     aren't needed anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+
+GC
+Tk_GetGC(tkwin, valueMask, valuePtr)
+    Tk_Window tkwin;           /* Window in which GC will be used. */
+    register unsigned long valueMask;
+                               /* 1 bits correspond to values specified
+                                * in *valuesPtr;  other values are set
+                                * from defaults. */
+    register XGCValues *valuePtr;
+                               /* Values are specified here for bits set
+                                * in valueMask. */
+{
+    ValueKey key;
+    Tcl_HashEntry *valueHashPtr, *idHashPtr;
+    register TkGC *gcPtr;
+    int new;
+
+    if (!initialized) {
+       GCInit();
+    }
+
+    /*
+     * Must zero key at start to clear out pad bytes that may be
+     * part of structure on some systems.
+     */
+
+    memset((VOID *) &key, 0, sizeof(key));
+
+    /*
+     * First, check to see if there's already a GC that will work
+     * for this request (exact matches only, sorry).
+     */
+
+    if (valueMask & GCFunction) {
+       key.values.function = valuePtr->function;
+    } else {
+       key.values.function = GXcopy;
+    }
+    if (valueMask & GCPlaneMask) {
+       key.values.plane_mask = valuePtr->plane_mask;
+    } else {
+       key.values.plane_mask = ~0;
+    }
+    if (valueMask & GCForeground) {
+       key.values.foreground = valuePtr->foreground;
+    } else {
+       key.values.foreground = 0;
+    }
+    if (valueMask & GCBackground) {
+       key.values.background = valuePtr->background;
+    } else {
+       key.values.background = 1;
+    }
+    if (valueMask & GCLineWidth) {
+       key.values.line_width = valuePtr->line_width;
+    } else {
+       key.values.line_width = 0;
+    }
+    if (valueMask & GCLineStyle) {
+       key.values.line_style = valuePtr->line_style;
+    } else {
+       key.values.line_style = LineSolid;
+    }
+    if (valueMask & GCCapStyle) {
+       key.values.cap_style = valuePtr->cap_style;
+    } else {
+       key.values.cap_style = CapButt;
+    }
+    if (valueMask & GCJoinStyle) {
+       key.values.join_style = valuePtr->join_style;
+    } else {
+       key.values.join_style = JoinMiter;
+    }
+    if (valueMask & GCFillStyle) {
+       key.values.fill_style = valuePtr->fill_style;
+    } else {
+       key.values.fill_style = FillSolid;
+    }
+    if (valueMask & GCFillRule) {
+       key.values.fill_rule = valuePtr->fill_rule;
+    } else {
+       key.values.fill_rule = EvenOddRule;
+    }
+    if (valueMask & GCArcMode) {
+       key.values.arc_mode = valuePtr->arc_mode;
+    } else {
+       key.values.arc_mode = ArcPieSlice;
+    }
+    if (valueMask & GCTile) {
+       key.values.tile = valuePtr->tile;
+    } else {
+       key.values.tile = None;
+    }
+    if (valueMask & GCStipple) {
+       key.values.stipple = valuePtr->stipple;
+    } else {
+       key.values.stipple = None;
+    }
+    if (valueMask & GCTileStipXOrigin) {
+       key.values.ts_x_origin = valuePtr->ts_x_origin;
+    } else {
+       key.values.ts_x_origin = 0;
+    }
+    if (valueMask & GCTileStipYOrigin) {
+       key.values.ts_y_origin = valuePtr->ts_y_origin;
+    } else {
+       key.values.ts_y_origin = 0;
+    }
+    if (valueMask & GCFont) {
+       key.values.font = valuePtr->font;
+    } else {
+       key.values.font = None;
+    }
+    if (valueMask & GCSubwindowMode) {
+       key.values.subwindow_mode = valuePtr->subwindow_mode;
+    } else {
+       key.values.subwindow_mode = ClipByChildren;
+    }
+    if (valueMask & GCGraphicsExposures) {
+       key.values.graphics_exposures = valuePtr->graphics_exposures;
+    } else {
+       key.values.graphics_exposures = True;
+    }
+    if (valueMask & GCClipXOrigin) {
+       key.values.clip_x_origin = valuePtr->clip_x_origin;
+    } else {
+       key.values.clip_x_origin = 0;
+    }
+    if (valueMask & GCClipYOrigin) {
+       key.values.clip_y_origin = valuePtr->clip_y_origin;
+    } else {
+       key.values.clip_y_origin = 0;
+    }
+    if (valueMask & GCClipMask) {
+       key.values.clip_mask = valuePtr->clip_mask;
+    } else {
+       key.values.clip_mask = None;
+    }
+    if (valueMask & GCDashOffset) {
+       key.values.dash_offset = valuePtr->dash_offset;
+    } else {
+       key.values.dash_offset = 0;
+    }
+    if (valueMask & GCDashList) {
+       key.values.dashes = valuePtr->dashes;
+    } else {
+       key.values.dashes = 4;
+    }
+    key.screen = Tk_Screen(tkwin);
+    valueHashPtr = Tcl_CreateHashEntry(&valueTable, (char *) &key, &new);
+    if (!new) {
+       gcPtr = (TkGC *) Tcl_GetHashValue(valueHashPtr);
+       gcPtr->refCount++;
+       return gcPtr->gc;
+    }
+
+    /*
+     * No GC is currently available for this set of values.  Allocate a
+     * new GC and add a new structure to the database.
+     */
+
+    gcPtr = (TkGC *) ckalloc(sizeof(TkGC));
+#if 0
+    gcPtr->gc = XCreateGC(Tk_Display(tkwin),
+                         RootWindowOfScreen(Tk_Screen(tkwin)),
+                         valueMask, &key.values);
+#else
+    gcPtr->gc = XCreateGC(Tk_Display(tkwin),
+                         Tk_DefaultPixmap(Tk_Screen(tkwin)),
+                         valueMask, &key.values);
+#endif
+    gcPtr->display = Tk_Display(tkwin);
+    gcPtr->refCount = 1;
+    gcPtr->valueHashPtr = valueHashPtr;
+    idHashPtr = Tcl_CreateHashEntry(&idTable, (char *) gcPtr->gc, &new);
+    if (!new) {
+       panic("GC already registered in Tk_GetGC");
+    }
+    Tcl_SetHashValue(valueHashPtr, gcPtr);
+    Tcl_SetHashValue(idHashPtr, gcPtr);
+    return gcPtr->gc;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_FreeGC --
+ *
+ *     This procedure is called to release a font allocated by
+ *     Tk_GetGC.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The reference count associated with gc is decremented, and
+ *     gc is officially deallocated if no-one is using it anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_FreeGC(gc)
+    GC gc;                     /* Graphics context to be released. */
+{
+    Tcl_HashEntry *idHashPtr;
+    register TkGC *gcPtr;
+
+    if (!initialized) {
+       panic("Tk_FreeGC called before Tk_GetGC");
+    }
+
+    idHashPtr = Tcl_FindHashEntry(&idTable, (char *) gc);
+    if (idHashPtr == NULL) {
+       panic("Tk_FreeGC received unknown gc argument");
+    }
+    gcPtr = (TkGC *) Tcl_GetHashValue(idHashPtr);
+    gcPtr->refCount--;
+    if (gcPtr->refCount == 0) {
+       XFreeGC(gcPtr->display, gcPtr->gc);
+       Tcl_DeleteHashEntry(gcPtr->valueHashPtr);
+       Tcl_DeleteHashEntry(idHashPtr);
+       ckfree((char *) gcPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * GCInit --
+ *
+ *     Initialize the structures used for GC management.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Read the code.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+GCInit()
+{
+    initialized = 1;
+    Tcl_InitHashTable(&valueTable, sizeof(ValueKey)/sizeof(int));
+    Tcl_InitHashTable(&idTable, TCL_ONE_WORD_KEYS);
+}
diff --git a/src/tk/tkgeo.c b/src/tk/tkgeo.c
new file mode 100644 (file)
index 0000000..974faeb
--- /dev/null
@@ -0,0 +1,159 @@
+/* 
+ * tkGeometry.c --
+ *
+ *     This file contains code generic Tk code for geometry
+ *     management, plus code to manage the geometry of top-level
+ *     windows (by reflecting information up to the window
+ *     manager).
+ *
+ * Copyright 1990 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkGeometry.c,v 1.18 92/05/13 16:51:17 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tkint.h"
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_ManageGeometry --
+ *
+ *     Arrange for a particular procedure to handle geometry
+ *     requests for a given window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Proc becomes the new geometry manager for tkwin, replacing
+ *     any previous geometry manager.  In the future, whenever
+ *     Tk_GeometryRequest is called for tkwin, proc will be
+ *     invoked to handle the request.  Proc should have the
+ *     following structure:
+ *
+ *     void
+ *     proc(clientData, tkwin)
+ *     {
+ *     }
+ *
+ *     The clientData argument will be the same as the clientData
+ *     argument to this procedure, and the tkwin arguments will
+ *     be the same as the corresponding argument to
+ *     Tk_GeometryRequest.  Information about the desired
+ *     geometry for tkwin is avilable to proc using macros such
+ *     as Tk_ReqWidth.  Proc should do the best it can to meet
+ *     the request within the constraints of its geometry-management
+ *     algorithm, but it is not obligated to meet the request.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_ManageGeometry(tkwin, proc, clientData)
+    Tk_Window tkwin;           /* Window whose geometry is to
+                                * be managed by proc.  */
+    Tk_GeometryProc *proc;     /* Procedure to manage geometry.
+                                * NULL means make tkwin unmanaged. */
+    ClientData clientData;     /* Arbitrary one-word argument to
+                                * pass to proc. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    winPtr->geomProc = proc;
+    winPtr->geomData = clientData;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_GeometryRequest --
+ *
+ *     This procedure is invoked by widget code to indicate
+ *     its preferences about the size of a window it manages.
+ *     In general, widget code should call this procedure
+ *     rather than Tk_ResizeWindow.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The geometry manager for tkwin (if any) is invoked to
+ *     handle the request.  If possible, it will reconfigure
+ *     tkwin and/or other windows to satisfy the request.  The
+ *     caller gets no indication of success or failure, but it
+ *     will get X events if the window size was actually
+ *     changed.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_GeometryRequest(tkwin, reqWidth, reqHeight)
+    Tk_Window tkwin;           /* Window that geometry information
+                                * pertains to. */
+    int reqWidth, reqHeight;   /* Minimum desired dimensions for
+                                * window, in pixels. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    if ((reqWidth == winPtr->reqWidth) && (reqHeight == winPtr->reqHeight)) {
+       return;
+    }
+    winPtr->reqWidth = reqWidth;
+    winPtr->reqHeight = reqHeight;
+    if (winPtr->geomProc != NULL) {
+       (*winPtr->geomProc)(winPtr->geomData, tkwin);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_SetInternalBorder --
+ *
+ *     Notify relevant geometry managers that a window has an internal
+ *     border of a given width and that child windows should not be
+ *     placed on that border.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The border width is recorded for the window, and all geometry
+ *     managers of all children are notified so that can re-layout, if
+ *     necessary.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_SetInternalBorder(tkwin, width)
+    Tk_Window tkwin;           /* Window that will have internal border. */
+    int width;                 /* Width of internal border, in pixels. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    if (width == winPtr->internalBorderWidth) {
+       return;
+    }
+    if (width < 0) {
+       width = 0;
+    }
+    winPtr->internalBorderWidth = width;
+    for (winPtr = winPtr->childList; winPtr != NULL;
+           winPtr = winPtr->nextPtr) {
+       if (winPtr->geomProc != NULL) {
+           (*winPtr->geomProc)(winPtr->geomData, (Tk_Window) winPtr);
+       }
+    }
+}
diff --git a/src/tk/tkget.c b/src/tk/tkget.c
new file mode 100644 (file)
index 0000000..0eba761
--- /dev/null
@@ -0,0 +1,593 @@
+/* 
+ * tkGet.c --
+ *
+ *     This file contains a number of "Tk_GetXXX" procedures, which
+ *     parse text strings into useful forms for Tk.  This file has
+ *     the simpler procedures, like Tk_GetDirection and Tk_GetUid.
+ *     The more complex procedures like Tk_GetColor are in separate
+ *     files.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkGet.c,v 1.5 92/08/10 09:02:46 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include <tk.h>
+#include "tkconfig.h"
+
+/*
+ * The hash table below is used to keep track of all the Tk_Uids created
+ * so far.
+ */
+
+static Tcl_HashTable uidTable;
+static int initialized = 0;
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_GetAnchor --
+ *
+ *     Given a string, return the corresponding Tk_Anchor.
+ *
+ * Results:
+ *     The return value is a standard Tcl return result.  If
+ *     TCL_OK is returned, then everything went well and the
+ *     position is stored at *anchorPtr;  otherwise TCL_ERROR
+ *     is returned and an error message is left in
+ *     interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_GetAnchor(interp, string, anchorPtr)
+    Tcl_Interp *interp;                /* Use this for error reporting. */
+    char *string;              /* String describing a direction. */
+    Tk_Anchor *anchorPtr;      /* Where to store Tk_Anchor corresponding
+                                * to string. */
+{
+    switch (string[0]) {
+       case 'n':
+           if (string[1] == 0) {
+               *anchorPtr = TK_ANCHOR_N;
+               return TCL_OK;
+           } else if ((string[1] == 'e') && (string[2] == 0)) {
+               *anchorPtr = TK_ANCHOR_NE;
+               return TCL_OK;
+           } else if ((string[1] == 'w') && (string[2] == 0)) {
+               *anchorPtr = TK_ANCHOR_NW;
+               return TCL_OK;
+           }
+           goto error;
+       case 's':
+           if (string[1] == 0) {
+               *anchorPtr = TK_ANCHOR_S;
+               return TCL_OK;
+           } else if ((string[1] == 'e') && (string[2] == 0)) {
+               *anchorPtr = TK_ANCHOR_SE;
+               return TCL_OK;
+           } else if ((string[1] == 'w') && (string[2] == 0)) {
+               *anchorPtr = TK_ANCHOR_SW;
+               return TCL_OK;
+           } else {
+               goto error;
+           }
+       case 'e':
+           if (string[1] == 0) {
+               *anchorPtr = TK_ANCHOR_E;
+               return TCL_OK;
+           }
+           goto error;
+       case 'w':
+           if (string[1] == 0) {
+               *anchorPtr = TK_ANCHOR_W;
+               return TCL_OK;
+           }
+           goto error;
+       case 'c':
+           if (strncmp(string, "center", strlen(string)) == 0) {
+               *anchorPtr = TK_ANCHOR_CENTER;
+               return TCL_OK;
+           }
+           goto error;
+    }
+
+    error:
+    Tcl_AppendResult(interp, "bad anchor position \"", string,
+           "\": must be n, ne, e, se, s, sw, w, nw, or center",
+           (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_NameOfAnchor --
+ *
+ *     Given a Tk_Anchor, return the string that corresponds
+ *     to it.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+char *
+Tk_NameOfAnchor(anchor)
+    Tk_Anchor anchor;          /* Anchor for which identifying string
+                                * is desired. */
+{
+    switch (anchor) {
+       case TK_ANCHOR_N: return "n";
+       case TK_ANCHOR_NE: return "ne";
+       case TK_ANCHOR_E: return "e";
+       case TK_ANCHOR_SE: return "se";
+       case TK_ANCHOR_S: return "s";
+       case TK_ANCHOR_SW: return "sw";
+       case TK_ANCHOR_W: return "w";
+       case TK_ANCHOR_NW: return "nw";
+       case TK_ANCHOR_CENTER: return "center";
+    }
+    return "unknown anchor position";
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_GetJoinStyle --
+ *
+ *     Given a string, return the corresponding Tk_JoinStyle.
+ *
+ * Results:
+ *     The return value is a standard Tcl return result.  If
+ *     TCL_OK is returned, then everything went well and the
+ *     justification is stored at *joinPtr;  otherwise
+ *     TCL_ERROR is returned and an error message is left in
+ *     interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_GetJoinStyle(interp, string, joinPtr)
+    Tcl_Interp *interp;                /* Use this for error reporting. */
+    char *string;              /* String describing a justification style. */
+    int *joinPtr;              /* Where to store join style corresponding
+                                * to string. */
+{
+    int c, length;
+
+    c = string[0];
+    length = strlen(string);
+
+    if ((c == 'b') && (strncmp(string, "bevel", length) == 0)) {
+       *joinPtr = JoinBevel;
+       return TCL_OK;
+    }
+    if ((c == 'm') && (strncmp(string, "miter", length) == 0)) {
+       *joinPtr = JoinMiter;
+       return TCL_OK;
+    }
+    if ((c == 'r') && (strncmp(string, "round", length) == 0)) {
+       *joinPtr = JoinRound;
+       return TCL_OK;
+    }
+
+    Tcl_AppendResult(interp, "bad join style \"", string,
+           "\": must be bevel, miter, or round",
+           (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_NameOfJoinStyle --
+ *
+ *     Given a Tk_JoinStyle, return the string that corresponds
+ *     to it.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+char *
+Tk_NameOfJoinStyle(join)
+    int join;                  /* Join style for which identifying string
+                                * is desired. */
+{
+    switch (join) {
+       case JoinBevel: return "bevel";
+       case JoinMiter: return "miter";
+       case JoinRound: return "round";
+    }
+    return "unknown join style";
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_GetCapStyle --
+ *
+ *     Given a string, return the corresponding Tk_CapStyle.
+ *
+ * Results:
+ *     The return value is a standard Tcl return result.  If
+ *     TCL_OK is returned, then everything went well and the
+ *     justification is stored at *capPtr;  otherwise
+ *     TCL_ERROR is returned and an error message is left in
+ *     interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_GetCapStyle(interp, string, capPtr)
+    Tcl_Interp *interp;                /* Use this for error reporting. */
+    char *string;              /* String describing a justification style. */
+    int *capPtr;               /* Where to store cap style corresponding
+                                * to string. */
+{
+    int c, length;
+
+    c = string[0];
+    length = strlen(string);
+
+    if ((c == 'b') && (strncmp(string, "butt", length) == 0)) {
+       *capPtr = CapButt;
+       return TCL_OK;
+    }
+    if ((c == 'p') && (strncmp(string, "projecting", length) == 0)) {
+       *capPtr = CapProjecting;
+       return TCL_OK;
+    }
+    if ((c == 'r') && (strncmp(string, "round", length) == 0)) {
+       *capPtr = CapRound;
+       return TCL_OK;
+    }
+
+    Tcl_AppendResult(interp, "bad cap style \"", string,
+           "\": must be butt, projecting, or round",
+           (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_NameOfCapStyle --
+ *
+ *     Given a Tk_CapStyle, return the string that corresponds
+ *     to it.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+char *
+Tk_NameOfCapStyle(cap)
+    int cap;                   /* Cap style for which identifying string
+                                * is desired. */
+{
+    switch (cap) {
+       case CapButt: return "butt";
+       case CapProjecting: return "projecting";
+       case CapRound: return "round";
+    }
+    return "unknown cap style";
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_GetJustify --
+ *
+ *     Given a string, return the corresponding Tk_Justify.
+ *
+ * Results:
+ *     The return value is a standard Tcl return result.  If
+ *     TCL_OK is returned, then everything went well and the
+ *     justification is stored at *justifyPtr;  otherwise
+ *     TCL_ERROR is returned and an error message is left in
+ *     interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_GetJustify(interp, string, justifyPtr)
+    Tcl_Interp *interp;                /* Use this for error reporting. */
+    char *string;              /* String describing a justification style. */
+    Tk_Justify *justifyPtr;    /* Where to store Tk_Justify corresponding
+                                * to string. */
+{
+    int c, length;
+
+    c = string[0];
+    length = strlen(string);
+
+    if ((c == 'l') && (strncmp(string, "left", length) == 0)) {
+       *justifyPtr = TK_JUSTIFY_LEFT;
+       return TCL_OK;
+    }
+    if ((c == 'r') && (strncmp(string, "right", length) == 0)) {
+       *justifyPtr = TK_JUSTIFY_RIGHT;
+       return TCL_OK;
+    }
+    if ((c == 'c') && (strncmp(string, "center", length) == 0)) {
+       *justifyPtr = TK_JUSTIFY_CENTER;
+       return TCL_OK;
+    }
+    if ((c == 'f') && (strncmp(string, "fill", length) == 0)) {
+       *justifyPtr = TK_JUSTIFY_FILL;
+       return TCL_OK;
+    }
+
+    Tcl_AppendResult(interp, "bad justification \"", string,
+           "\": must be left, right, center, or fill",
+           (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_NameOfJustify --
+ *
+ *     Given a Tk_Justify, return the string that corresponds
+ *     to it.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+char *
+Tk_NameOfJustify(justify)
+    Tk_Justify justify;                /* Justification style for which
+                                * identifying string is desired. */
+{
+    switch (justify) {
+       case TK_JUSTIFY_LEFT: return "left";
+       case TK_JUSTIFY_RIGHT: return "right";
+       case TK_JUSTIFY_CENTER: return "center";
+       case TK_JUSTIFY_FILL: return "fill";
+    }
+    return "unknown justification style";
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_GetUid --
+ *
+ *     Given a string, this procedure returns a unique identifier
+ *     for the string.
+ *
+ * Results:
+ *     This procedure returns a Tk_Uid corresponding to the "string"
+ *     argument.  The Tk_Uid has a string value identical to string
+ *     (strcmp will return 0), but it's guaranteed that any other
+ *     calls to this procedure with a string equal to "string" will
+ *     return exactly the same result (i.e. can compare Tk_Uid
+ *     *values* directly, without having to call strcmp on what they
+ *     point to).
+ *
+ * Side effects:
+ *     New information may be entered into the identifier table.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Tk_Uid
+Tk_GetUid(string)
+    char *string;              /* String to convert. */
+{
+    int dummy;
+
+    if (!initialized) {
+       Tcl_InitHashTable(&uidTable, TCL_STRING_KEYS);
+       initialized = 1;
+    }
+    return (Tk_Uid) Tcl_GetHashKey(&uidTable,
+           Tcl_CreateHashEntry(&uidTable, string, &dummy));
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_GetScreenMM --
+ *
+ *     Given a string, returns the number of screen millimeters
+ *     corresponding to that string.
+ *
+ * Results:
+ *     The return value is a standard Tcl return result.  If
+ *     TCL_OK is returned, then everything went well and the
+ *     screen distance is stored at *doublePtr;  otherwise
+ *     TCL_ERROR is returned and an error message is left in
+ *     interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_GetScreenMM(interp, tkwin, string, doublePtr)
+    Tcl_Interp *interp;                /* Use this for error reporting. */
+    Tk_Window tkwin;           /* Window whose screen determines conversion
+                                * from centimeters and other absolute
+                                * units. */
+    char *string;              /* String describing a screen distance. */
+    double *doublePtr;         /* Place to store converted result. */
+{
+    char *end;
+    double d;
+
+    d = strtod(string, &end);
+    if (end == string) {
+       error:
+       Tcl_AppendResult(interp, "bad screen distance \"", string,
+               "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    while ((*end != '\0') && isspace(*end)) {
+       end++;
+    }
+    switch (*end) {
+       case 0:
+           d /= WidthOfScreen(Tk_Screen(tkwin));
+           d *= WidthMMOfScreen(Tk_Screen(tkwin));
+           break;
+       case 'c':
+           d *= 10;
+           end++;
+           break;
+       case 'i':
+           d *= 25.4;
+           end++;
+           break;
+       case 'm':
+           end++;
+           break;
+       case 'p':
+           d *= 25.4/72.0;
+           end++;
+           break;
+       default:
+           goto error;
+    }
+    while ((*end != '\0') && isspace(*end)) {
+       end++;
+    }
+    if (*end != 0) {
+       goto error;
+    }
+    *doublePtr = d;
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_GetPixels --
+ *
+ *     Given a string, returns the number of pixels corresponding
+ *     to that string.
+ *
+ * Results:
+ *     The return value is a standard Tcl return result.  If
+ *     TCL_OK is returned, then everything went well and the
+ *     rounded pixel distance is stored at *intPtr;  otherwise
+ *     TCL_ERROR is returned and an error message is left in
+ *     interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_GetPixels(interp, tkwin, string, intPtr)
+    Tcl_Interp *interp;                /* Use this for error reporting. */
+    Tk_Window tkwin;           /* Window whose screen determines conversion
+                                * from centimeters and other absolute
+                                * units. */
+    char *string;              /* String describing a justification style. */
+    int *intPtr;               /* Place to store converted result. */
+{
+    char *end;
+    double d;
+
+    d = strtod(string, &end);
+    if (end == string) {
+       error:
+       Tcl_AppendResult(interp, "bad screen distance \"", string,
+               "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    while ((*end != '\0') && isspace(*end)) {
+       end++;
+    }
+    switch (*end) {
+       case 0:
+           break;
+       case 'c':
+           d *= 10*WidthOfScreen(Tk_Screen(tkwin));
+           d /= WidthMMOfScreen(Tk_Screen(tkwin));
+           end++;
+           break;
+       case 'i':
+           d *= 25.4*WidthOfScreen(Tk_Screen(tkwin));
+           d /= WidthMMOfScreen(Tk_Screen(tkwin));
+           end++;
+           break;
+       case 'm':
+           d *= WidthOfScreen(Tk_Screen(tkwin));
+           d /= WidthMMOfScreen(Tk_Screen(tkwin));
+           end++;
+           break;
+       case 'p':
+           d *= (25.4/72.0)*WidthOfScreen(Tk_Screen(tkwin));
+           d /= WidthMMOfScreen(Tk_Screen(tkwin));
+           end++;
+           break;
+       default:
+           goto error;
+    }
+    while ((*end != '\0') && isspace(*end)) {
+       end++;
+    }
+    if (*end != 0) {
+       goto error;
+    }
+    if (d < 0) {
+       *intPtr = (int) (d - 0.5);
+    } else {
+       *intPtr = (int) (d + 0.5);
+    }
+    return TCL_OK;
+}
diff --git a/src/tk/tkgrab.c b/src/tk/tkgrab.c
new file mode 100644 (file)
index 0000000..fe5cc4e
--- /dev/null
@@ -0,0 +1,1114 @@
+/* 
+ * tkGrab.c --
+ *
+ *     This file provides procedures that implement grabs for Tk.
+ *
+ * Copyright 1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkGrab.c,v 1.18 92/08/07 09:55:31 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tkint.h"
+
+/*
+ *-------------------------------------------------------------------
+ * Problems with current grab implementation (8/7/92):
+ *
+ * 1. In a local grab the synthesized events are always placed at the
+ *    front of the event queue.  If there are several grabs and ungrabs
+ *    in a row, the groups of events for the different grabs/ungrabs
+ *    end up in backwards order.
+ * 2. The variables serverWinPtr and pointerWinPtr are hardly used at
+ *    all and should probably be eliminated.
+ * 3. The fact that grabWinPtr is set at the time a grab is set or
+ *    released, rather than when its events are processed, means that
+ *    it can get out of sync with the event queue if there's a rapid
+ *    sequence of grabs or ungrabs.  The only solution I can think of
+ *    is to keep a parallel queue to the event queue to update grabWinPtr
+ *    (or, synthesize an event to change the pointer?).
+ *-------------------------------------------------------------------
+ */
+
+/*
+ * Bit definitions for grabFlags field of TkDisplay structures:
+ *
+ * GRAB_GLOBAL                 1 means this is a global grab (we grabbed via
+ *                             the server so all applications are locked out.
+ *                             0 means this is a local grab that affects
+ *                             only this application.
+ * GRAB_BUTTON_RELEASE         1 means that a button-release event just
+ *                             occurred and we're in the middle of a sequence
+ *                             of Enter and Leave events with NotifyUngrab
+ *                             mode.
+ */
+
+#define GRAB_GLOBAL            1
+#define GRAB_BUTTON_RELEASE    2
+
+/*
+ * Forward declarations for procedures declared later in this file:
+ */
+
+static void            ChangeEventWindow _ANSI_ARGS_((XEvent *eventPtr,
+                           TkWindow *winPtr));
+static void            MovePointer _ANSI_ARGS_((XEvent *eventPtr,
+                           TkWindow *sourcePtr, TkWindow *destPtr));
+static void            MovePointer2 _ANSI_ARGS_((TkWindow *sourcePtr,
+                           TkWindow *destPtr, int mode));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_GrabCmd --
+ *
+ *     This procedure is invoked to process the "grab" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tk_GrabCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    TkWindow *winPtr = (TkWindow *) clientData;
+    int length, lockScreen;
+    char *window;
+
+    if (argc > 3) {
+       badArgs:
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " ?-global? ?window?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (argc == 1) {
+       if ((winPtr->dispPtr->grabWinPtr != NULL)
+               && (winPtr->dispPtr->grabWinPtr->mainPtr
+               == winPtr->mainPtr)) {
+           interp->result = Tk_PathName(winPtr->dispPtr->grabWinPtr);
+       } else {
+           interp->result = "none";
+       }
+       return TCL_OK;
+    }
+    if (argc == 3) {
+       length = strlen(argv[1]);
+       if (strncmp(argv[1], "-off", length) == 0) {
+           lockScreen = -1;
+       } else {
+           if ((strncmp(argv[1], "-global", length) != 0) || (length < 2)) {
+               goto badArgs;
+           }
+           lockScreen = 1;
+       }
+       window = argv[2];
+    } else {
+       lockScreen = 0;
+       window = argv[1];
+    }
+    if ((window[0] == '\0')
+           || (strncmp(window, "none", strlen(window)) == 0)) {
+       Tk_Ungrab((Tk_Window) winPtr);  
+    } else {
+       Tk_Window tkwin;
+
+       tkwin = Tk_NameToWindow(interp, window, (Tk_Window) winPtr);
+       if (tkwin == NULL) {
+           return TCL_ERROR;
+       }
+       if (lockScreen < 0) {
+           Tk_Ungrab(tkwin);
+       } else {
+           return Tk_Grab(interp, tkwin, lockScreen);
+       }
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_Grab --
+ *
+ *     Grabs the pointer and keyboard, so that mouse-related events are
+ *     only reported relative to a given window and its descendants.
+ *
+ * Results:
+ *     A standard Tcl result is returned.  TCL_OK is the normal return
+ *     value;  if the grab could not be set then TCL_ERROR is returned
+ *     and interp->result will hold an error message.
+ *
+ * Side effects:
+ *     Once this call completes successfully, no window outside the
+ *     tree rooted at tkwin will receive pointer- or keyboard-related
+ *     events until the next call to Tk_Ungrab.  If a previous grab was
+ *     in effect within this application, then it is replaced with a new
+ *     one.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tk_Grab(interp, tkwin, grabGlobal)
+    Tcl_Interp *interp;                        /* Used for error reporting. */
+    Tk_Window tkwin;                   /* Window on whose behalf the pointer
+                                        * is to be grabbed. */
+    int grabGlobal;                    /* Non-zero means issue a grab to the
+                                        * server so that no other application
+                                        * gets mouse or keyboard events.
+                                        * Zero means the grab only applies
+                                        * within this application. */
+{
+    int grabResult;
+    TkWindow *winPtr = (TkWindow *) tkwin;
+    TkDisplay *dispPtr = winPtr->dispPtr;
+    int grabRequest, inSequence, ignoring, numEvents, i, diff;
+    XEvent *events, *eventPtr;
+    TkWindow *winPtr2;
+
+    if (dispPtr->grabWinPtr != NULL) {
+       if ((dispPtr->grabWinPtr == winPtr)
+               && (grabGlobal == ((dispPtr->grabFlags & GRAB_GLOBAL) != 0))) {
+           return TCL_OK;
+       }
+       if (dispPtr->grabWinPtr->mainPtr != winPtr->mainPtr) {
+           alreadyGrabbed:
+           interp->result = "grab failed: another application has grab";
+           return TCL_ERROR;
+       }
+       Tk_Ungrab(tkwin);
+    }
+
+    if (grabGlobal) {
+       grabRequest = NextRequest(dispPtr->display);
+       grabResult = XGrabPointer(dispPtr->display, Tk_WindowId(tkwin),
+               True, ButtonPressMask|ButtonReleaseMask|ButtonMotionMask|PointerMotionMask,
+               GrabModeAsync, GrabModeAsync, None, None,
+               TkCurrentTime(dispPtr));
+       if (grabResult != 0) {
+           grabError:
+           if (grabResult == GrabNotViewable) {
+               interp->result = "grab failed: window not viewable";
+           } else if (grabResult == AlreadyGrabbed) {
+               goto alreadyGrabbed;
+           } else if (grabResult == GrabFrozen) {
+               interp->result = "grab failed: keyboard or pointer frozen";
+           } else if (grabResult == GrabInvalidTime) {
+               interp->result = "grab failed: invalid time";
+           } else {
+               char msg[100];
+       
+               sprintf(msg, "grab failed for unknown reason (code %d)",
+                       grabResult);
+               Tcl_AppendResult(interp, msg, (char *) NULL);
+           }
+           return TCL_ERROR;
+       }
+       grabResult = XGrabKeyboard(dispPtr->display, Tk_WindowId(tkwin),
+               False, GrabModeAsync, GrabModeAsync, TkCurrentTime(dispPtr));
+       if (grabResult != 0) {
+           XUngrabPointer(dispPtr->display, TkCurrentTime(dispPtr));
+           goto grabError;
+       }
+       dispPtr->grabFlags |= GRAB_GLOBAL;
+    } else {
+       /*
+        * The call to XUngrabPointer below is needed to release any
+        * existing auto-grab due to a button press.  This is needed
+        * so that local grabs behave the same as global grabs (the
+        * button grab is released by the X server in a global grab).
+        */
+
+       XUngrabPointer(dispPtr->display, TkCurrentTime(dispPtr));
+       grabRequest = LastKnownRequestProcessed(dispPtr->display);
+       dispPtr->grabFlags &= ~GRAB_GLOBAL;
+
+       /*
+        * Since we're not telling the server about the grab, we have
+        * to generate Leave and Enter events to move the pointer from
+        * its current window to the grab window.
+        */
+
+       MovePointer2(dispPtr->pointerWinPtr, winPtr, NotifyGrab);
+    }
+    dispPtr->grabWinPtr = winPtr;
+
+    /*
+     * When a grab occurs, X generates Enter and Leave events to move
+     * the pointer from its current window to the grab window, even if
+     * the current window is in the grab tree.  We don't want these
+     * events getting through to the application if the current window
+     * is in the grab tree.  In order to eliminate the bogus events,
+     * process all pending events and filter out the bogus ones.
+     *
+     * Also, filter out the final enter event into the grab window in
+     * any case:  this event shouldn't be delivered until the mouse really
+     * moves into that window.
+     *
+     * The code below reads in all the pending events, filters out the bad
+     * ones, and then pushes back all the events that weren't filtered.
+     * Another alternative would be to simply process the events
+     * immediately rather than pushing them back again.  However, this
+     * tends to interfere with scripts since it causes pending events
+     * to be processed during the "grab" command.  The "grab" command
+     * might have been invoked in the middle of some computation where
+     * it's a bad idea to process new events.
+     */
+
+    XSync(dispPtr->display, False);
+    numEvents = QLength(dispPtr->display);
+    if (numEvents == 0) {
+       return TCL_OK;
+    }
+    events = (XEvent *) ckalloc((unsigned) (numEvents * sizeof(XEvent)));
+    for (i = 0; i < numEvents; i++) {
+       XNextEvent(dispPtr->display, &events[i]);
+    }
+    inSequence = ignoring = 0;
+    for (i = numEvents-1, eventPtr = events; i >= 0; i--, eventPtr++) {
+       if (((eventPtr->type != EnterNotify)
+               && (eventPtr->type != LeaveNotify))
+               || (eventPtr->xcrossing.mode != NotifyGrab)) {
+           continue;
+       }
+
+       /*
+        * The diff caculcation below is trickier than you might think,
+        * due to the fact that the event serial number is unsigned and
+        * serial numbers can wrap around.
+        */
+
+       diff = eventPtr->xcrossing.serial;
+       diff -= grabRequest;
+       if (!inSequence && (diff >= 0)) {
+           /*
+            * This is the first event of the grab sequence.  See if its
+            * window is in the grab tree and ignore the sequence if it is.
+            */
+
+           inSequence = 1;
+           if (XFindContext(dispPtr->display, eventPtr->xcrossing.window,
+                   tkWindowContext, (void *) &winPtr2) == 0) {
+               for ( ; winPtr2 != NULL; winPtr2 = winPtr2->parentPtr) {
+                   if (winPtr2 == dispPtr->grabWinPtr) {
+                       ignoring = 1;
+                       break;
+                   }
+               }
+           }
+       }
+       if (ignoring) {
+           eventPtr->type = 0;
+       }
+       if (inSequence && (eventPtr->type == EnterNotify)
+               && (dispPtr->grabWinPtr->window
+               == eventPtr->xcrossing.window)) {
+           eventPtr->type = 0;
+           break;
+       }
+    }
+    for (i = numEvents-1, eventPtr = &events[i]; i >= 0; i--, eventPtr--) {
+       if (eventPtr->type != 0) {
+           XPutBackEvent(dispPtr->display, eventPtr);
+       }
+    }
+    ckfree((char *) events);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_Ungrab --
+ *
+ *     Releases a grab on the mouse pointer and keyboard.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Pointer and keyboard events will start being delivered to other
+ *     windows again.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_Ungrab(tkwin)
+    Tk_Window tkwin;                   /* Window that identifies display
+                                        * for grab to be released. */
+{
+    TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr;
+    int inSequence, ignoring, ungrabRequest, numEvents, i, j, diff;
+    TkWindow *grabWinPtr, *winPtr;
+    XEvent *events, *eventPtr, *eventPtr2;
+
+    grabWinPtr = dispPtr->grabWinPtr;
+    if (grabWinPtr == NULL) {
+       return;
+    }
+    dispPtr->grabWinPtr = NULL;
+    dispPtr->buttonWinPtr = NULL;
+    if (dispPtr->grabFlags & GRAB_GLOBAL) {
+       ungrabRequest = NextRequest(dispPtr->display);
+       XUngrabPointer(dispPtr->display, TkCurrentTime(dispPtr));
+       XUngrabKeyboard(dispPtr->display, TkCurrentTime(dispPtr));
+       XSync(dispPtr->display, False);
+    } else {
+       ungrabRequest = LastKnownRequestProcessed(dispPtr->display);
+       if ((dispPtr->ungrabWinPtr != NULL)
+               && (dispPtr->ungrabWinPtr->mainPtr != grabWinPtr->mainPtr)) {
+
+           /*
+            * Don't report entries down into a window of a different
+            * application, since it's already seen those entries earlier.
+            */
+
+           dispPtr->ungrabWinPtr = NULL;
+       }
+       MovePointer2(grabWinPtr, dispPtr->ungrabWinPtr, NotifyUngrab);
+    }
+
+    /*
+     * We have to filter all the pending events in a fashion similar to
+     * Tk_Grab. As with grabs, the X server generates an Enter-Leave event
+     * sequence to move the pointer from the grab window back to its
+     * current window.  We need to ignore this sequence if the pointer
+     * is being moved to a window that's already in the grab tree.
+     */
+
+    numEvents = QLength(dispPtr->display);
+    if (numEvents == 0) {
+       return;
+    }
+    events = (XEvent *) ckalloc((unsigned) (numEvents * sizeof(XEvent)));
+    for (i = 0; i < numEvents; i++) {
+       XNextEvent(dispPtr->display, &events[i]);
+    }
+    inSequence = ignoring = 0;
+    for (i = numEvents-1, eventPtr = events; i >= 0; i--, eventPtr++) {
+       if (((eventPtr->type != EnterNotify)
+               && (eventPtr->type != LeaveNotify))
+               || (eventPtr->xcrossing.mode != NotifyUngrab)) {
+           continue;
+       }
+       diff = eventPtr->xcrossing.serial;
+       diff -= ungrabRequest;
+       if (!inSequence && (diff >= 0)) {
+
+           /*
+            * This is the first event of the ungrab sequence.  Scan forward
+            * looking for the final Enter event in the sequence.  Then see
+            * if that event's window is in the grab tree.
+            */
+
+           inSequence = 1;
+           for (j = i, eventPtr2 = eventPtr; j >= 0; j--, eventPtr2++) {
+               if (eventPtr2->type == EnterNotify) {
+                   if (eventPtr2->xcrossing.mode != NotifyUngrab) {
+                       break;
+                   }
+                   if ((eventPtr2->xcrossing.detail != NotifyAncestor)
+                           && (eventPtr2->xcrossing.detail != NotifyInferior)
+                           && (eventPtr2->xcrossing.detail
+                                   != NotifyNonlinear)) {
+                       continue;
+                   }
+                   if (XFindContext(dispPtr->display,
+                           eventPtr2->xcrossing.window,
+                           tkWindowContext, (void *) &winPtr) == 0) {
+                       for ( ; winPtr != NULL; winPtr = winPtr->parentPtr) {
+                           if (winPtr == grabWinPtr) {
+                               ignoring = 1;
+                               break;
+                           }
+                       }
+                   }
+                   break;
+               } else if ((eventPtr2->type != LeaveNotify)
+                       || (eventPtr2->xcrossing.mode != NotifyUngrab)) {
+                   break;
+               }
+           }
+       }
+       if (ignoring) {
+           eventPtr->type = 0;
+       }
+    }
+    for (i = numEvents-1, eventPtr = &events[i]; i >= 0; i--, eventPtr--) {
+       if (eventPtr->type != 0) {
+           XPutBackEvent(dispPtr->display, eventPtr);
+       }
+    }
+    ckfree((char *) events);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkPointerEvent --
+ *
+ *     This procedure is called for each pointer-related event, before
+ *     the event has been processed.  It does various things to make
+ *     grabs work correctly.
+ *
+ * Results:
+ *     If the return value is 1 it means the event should be processed
+ *     (event handlers should be invoked).  If the return value is 0
+ *     it means the event should be ignored in order to make grabs
+ *     work correctly.  Note:  the event may be modified by this procedure.
+ *
+ * Side effects:
+ *     Grab state information may be updated.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TkPointerEvent(eventPtr, winPtr)
+    register XEvent *eventPtr;         /* Pointer to the event. */
+    TkWindow *winPtr;                  /* Tk's information for window
+                                        * where event was reported. */
+{
+    register TkWindow *winPtr2;
+    TkDisplay *dispPtr = winPtr->dispPtr;
+    int outsideGrabTree = 0;
+    int originalFlags;
+    int appGrabbed = 0;                        /* Non-zero means event is being
+                                        * reported to an application that is
+                                        * affected by the grab. */
+#define ALL_BUTTONS \
+       (Button1Mask|Button2Mask|Button3Mask|Button4Mask|Button5Mask)
+    static unsigned int state[] = {
+       Button1Mask, Button2Mask, Button3Mask, Button4Mask, Button5Mask
+    };
+
+    /*
+     * Don't do any filtering on events generated by the event-sharing code.
+     */
+
+    if (eventPtr == tkShareEventPtr) {
+       return 1;
+    }
+
+    /*
+     * If a grab is in effect, see if the event is being reported to
+     * a window in the grab tree.  Also see if the event is being reported
+     * to an application that is affected by the grab.
+     */
+
+    if (dispPtr->grabWinPtr != NULL) {
+       if ((winPtr->mainPtr == dispPtr->grabWinPtr->mainPtr)
+               || (dispPtr->grabFlags & GRAB_GLOBAL)) {
+           appGrabbed = 1;
+       }
+       for (winPtr2 = winPtr; winPtr2 != dispPtr->grabWinPtr;
+               winPtr2 = winPtr2->parentPtr) {
+           if (winPtr2 == NULL) {
+               outsideGrabTree = 1;
+               break;
+           }
+       }
+    }
+
+    originalFlags = dispPtr->grabFlags;
+    dispPtr->grabFlags &= ~GRAB_BUTTON_RELEASE;
+    if ((eventPtr->type == EnterNotify) || (eventPtr->type == LeaveNotify)) {
+       if ((eventPtr->type == EnterNotify)
+               && (eventPtr->xcrossing.detail != NotifyVirtual)
+               && (eventPtr->xcrossing.detail != NotifyNonlinearVirtual)) {
+           if ((dispPtr->grabWinPtr == NULL)
+                   || (dispPtr->grabWinPtr->mainPtr == winPtr->mainPtr)) {
+               dispPtr->ungrabWinPtr = winPtr;
+           }
+           dispPtr->serverWinPtr = winPtr;
+       } else {
+           dispPtr->serverWinPtr = NULL;
+       }
+       if (dispPtr->grabWinPtr != NULL) {
+           if (eventPtr->xcrossing.mode == NotifyNormal) {
+               /*
+                * When a grab is active, X continues to report enter and
+                * leave events for windows outside the tree of the grab
+                * window.  Detect these events and ignore them.
+                */
+
+               if (outsideGrabTree && appGrabbed) {
+                   return 0;
+               }
+    
+               /*
+                * Make buttons have the same grab-like behavior inside a grab
+                * as they do outside a grab:  do this by ignoring enter and
+                * leave events except for the window in which the button was
+                * pressed.
+                */
+
+               if ((dispPtr->buttonWinPtr != NULL)
+                       && (winPtr != dispPtr->buttonWinPtr)) {
+                   return 0;
+               }
+           } else if (eventPtr->xcrossing.mode == NotifyUngrab) {
+               /*
+                * Keep the GRAB_BUTTON_RELEASE flag on if it used to be on.
+                */
+
+               dispPtr->grabFlags = originalFlags;
+               if (outsideGrabTree && appGrabbed
+                       && (dispPtr->grabFlags & GRAB_BUTTON_RELEASE)) {
+                   /*
+                    * The only way we get here is if a button was pressed,
+                    * then moved to a different window and released.  Enter
+                    * and leave events were deferred while the button was
+                    * down, but now we're getting them to move the pointer
+                    * back to the right window, and this particular event
+                    * is for a window outside the grab tree.  Ignore it.
+                    */
+    
+                   return 0;
+               }
+           }
+       }
+
+       /*
+        * Keep track of the window containing the mouse, in order to
+        * detect various bogus event sequences.
+        */
+
+       dispPtr->pointerWinPtr = dispPtr->serverWinPtr;
+       return 1;
+    }
+    if ((dispPtr->grabWinPtr == NULL) || !appGrabbed) {
+       return 1;
+    }
+
+    if (eventPtr->type == MotionNotify) {
+       /*
+        * When grabs are active, X reports motion events relative to the
+        * window under the pointer.  Instead, it should report the events
+        * relative to the window the button went down in, if there is a
+        * button down.  Otherwise, if the pointer window is outside the
+        * subtree of the grab window, the events should be reported
+        * relative to the grab window.  Otherwise, the event should be
+        * reported to the pointer window.
+        */
+
+       winPtr2 = winPtr;
+       if (dispPtr->buttonWinPtr != NULL) {
+           winPtr2 = dispPtr->buttonWinPtr;
+       } else if (outsideGrabTree || (dispPtr->serverWinPtr == NULL)) {
+           winPtr2 = dispPtr->grabWinPtr;
+       }
+       if (winPtr2 != winPtr) {
+           XEvent newEvent;
+
+           newEvent = *eventPtr;
+           ChangeEventWindow(&newEvent, winPtr2);
+           XPutBackEvent(winPtr2->display, &newEvent);
+           return 0;
+       }
+       return 1;
+    }
+
+    /*
+     * Process ButtonPress and ButtonRelease events:
+     * 1. Keep track of whether a button is down and what window it
+     *    went down in.
+     * 2. If the first button goes down outside the grab tree, pretend
+     *    it went down in the grab window.  Note: it's important to
+     *    redirect events to the grab window like this in order to make
+     *    things like menus work, where button presses outside the
+     *    grabbed menu need to be seen.  An application can always
+     *    ignore the events if they occur outside its window.
+     * 3. If a button press or release occurs outside the window where
+     *    the first button was pressed, retarget the event so it's reported
+     *    to the window where the first button was pressed.
+     * 4. If the last button is released in a window different than where
+     *    the first button was pressed, generate Enter/Leave events to
+     *    move the mouse from the button window to its current window.
+     * 5. If the grab is set at a time when a button is already down, or
+     *    if the window where the button was pressed was deleted, then
+     *    dispPtr->buttonWinPtr will stay NULL.  Just forget about the
+     *    auto-grab for the button press;  events will go to whatever
+     *    window contains the pointer.  If this window isn't in the grab
+     *    tree then redirect events to the grab window.
+     */
+
+    if ((eventPtr->type == ButtonPress) || (eventPtr->type == ButtonRelease)) {
+       winPtr2 = dispPtr->buttonWinPtr;
+       if (winPtr2 == NULL) {
+           if (outsideGrabTree) {
+               winPtr2 = dispPtr->grabWinPtr;                  /* Note 5. */
+           } else {
+               winPtr2 = winPtr;                               /* Note 5. */
+           }
+       }
+       if (eventPtr->type == ButtonPress) {
+           if ((eventPtr->xbutton.state & ALL_BUTTONS) == 0) {
+               if (outsideGrabTree) {
+                   XEvent newEvent;
+
+                   newEvent = *eventPtr;
+                   ChangeEventWindow(&newEvent, dispPtr->grabWinPtr);
+                   XPutBackEvent(dispPtr->display, &newEvent);
+                   return 0;                                   /* Note 2. */
+               }
+               dispPtr->buttonWinPtr = winPtr;
+               return 1;
+           }
+       } else {
+           if ((eventPtr->xbutton.state & ALL_BUTTONS)
+                   == state[eventPtr->xbutton.button - Button1]) {
+               if ((dispPtr->buttonWinPtr != winPtr)
+                       && (dispPtr->buttonWinPtr != NULL)) {
+                   XEvent newEvent;                            /* Note 4. */
+
+                   /*
+                    * If the button release is made with pointer outside
+                    * all applications, X reports it relative to the grab
+                    * window.   Change the current window to NULL to
+                    * reflect that the pointer's outside everything.  Do
+                    * the same if the pointer's in a window that's not
+                    * part of the grab tree.
+                    */
+
+                   if (outsideGrabTree || (dispPtr->serverWinPtr == NULL)) {
+                       winPtr = NULL;
+                   }
+                   newEvent = *eventPtr;
+                   newEvent.xcrossing.mode = NotifyUngrab;
+                   newEvent.xcrossing.focus = False;
+                   newEvent.xcrossing.state =
+                           eventPtr->xbutton.state & ~ALL_BUTTONS;
+                   MovePointer(&newEvent, dispPtr->buttonWinPtr, winPtr);
+               }
+               dispPtr->buttonWinPtr = NULL;
+               dispPtr->grabFlags |= GRAB_BUTTON_RELEASE;
+           }
+       }
+       if (winPtr2 != winPtr) {
+           XEvent newEvent;
+
+           newEvent = *eventPtr;
+           ChangeEventWindow(&newEvent, winPtr2);
+           XPutBackEvent(dispPtr->display, &newEvent);
+           return 0;                                           /* Note 3. */
+       }
+    }
+
+    return 1;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ChangeEventWindow --
+ *
+ *     Given an event and a new window to which the event should be
+ *     retargeted, modify fields of the event so that the event is
+ *     properly retargeted to the new window.
+ *
+ * Results:
+ *     The following fields of eventPtr are modified:  window,
+ *     subwindow, x, y, same_screen.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ChangeEventWindow(eventPtr, winPtr)
+    register XEvent *eventPtr; /* Event to retarget.  Must have
+                                * type ButtonPress, ButtonRelease, KeyPress,
+                                * KeyRelease, MotionNotify, EnterNotify,
+                                * or LeaveNotify. */
+    TkWindow *winPtr;          /* New target window for event. */
+{
+    int x, y, sameScreen, bd;
+    register TkWindow *childPtr;
+
+    eventPtr->xmotion.window = Tk_WindowId(winPtr);
+    if (eventPtr->xmotion.root ==
+           RootWindow(winPtr->display, winPtr->screenNum)) {
+       Tk_GetRootCoords((Tk_Window) winPtr, &x, &y);
+       eventPtr->xmotion.x = eventPtr->xmotion.x_root - x;
+       eventPtr->xmotion.y = eventPtr->xmotion.y_root - y;
+       eventPtr->xmotion.subwindow = None;
+       for (childPtr = winPtr->childList; childPtr != NULL;
+               childPtr = childPtr->nextPtr) {
+           if (childPtr->flags & TK_TOP_LEVEL) {
+               continue;
+           }
+           x = eventPtr->xmotion.x - childPtr->changes.x;
+           y = eventPtr->xmotion.y - childPtr->changes.y;
+           bd = childPtr->changes.border_width;
+           if ((x >= -bd) && (y >= -bd)
+                   && (x < (childPtr->changes.width + bd))
+                   && (y < (childPtr->changes.width + bd))) {
+               eventPtr->xmotion.subwindow = childPtr->window;
+           }
+       }
+       sameScreen = 1;
+    } else {
+       eventPtr->xmotion.x = 0;
+       eventPtr->xmotion.y = 0;
+       eventPtr->xmotion.subwindow = None;
+       sameScreen = 0;
+    }
+    if (eventPtr->type == MotionNotify) {
+       eventPtr->xmotion.same_screen = sameScreen;
+    } else {
+       eventPtr->xbutton.same_screen = sameScreen;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * MovePointer --
+ *
+ *     This procedure synthesizes EnterNotify and LeaveNotify events
+ *     to correctly transfer the pointer from one window to another.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Synthesized events may be pushed back onto the event queue.
+ *     The event pointed to by eventPtr is modified.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+MovePointer(eventPtr, sourcePtr, destPtr)
+    XEvent *eventPtr;          /* A template X event.  Must have all fields
+                                * properly set for EnterNotify and LeaveNotify
+                                * events except window, subwindow, x, y,
+                                * detail, and same_screen.  (x_root and y_root
+                                * must be valid, even though x and y needn't
+                                * be valid). */
+    TkWindow *sourcePtr;       /* Window currently containing pointer (NULL
+                                * means it's not one managed by this
+                                * process). */
+    TkWindow *destPtr;         /* Window that is to end up containing the
+                                * pointer (NULL means it's not one managed
+                                * by this process). */
+{
+    TkDisplay *dispPtr;
+    register TkWindow *ancestorPtr;    /* Lowest ancestor shared between
+                                        * sourcePtr and destPtr, or
+                                        * sourcePtr's top-level window if no
+                                        * shared ancestor. */
+    register TkWindow *winPtr;
+    int upLevels, downLevels, i, j;
+
+    /*
+     * There are four possible cases to deal with:
+     *
+     * 1. SourcePtr and destPtr are the same.  There's nothing to do in
+     *    this case.
+     * 2. SourcePtr is an ancestor of destPtr in the same top-level
+     *    window.  Must generate events down the window tree from source
+     *    to dest.
+     * 3. DestPtr is an ancestor of sourcePtr in the same top-level
+     *    window.  Must generate events up the window tree from sourcePtr
+     *    to destPtr.
+     * 4. All other cases.  Must first generate events up the window tree
+     *    from sourcePtr to its top-level, then down from destPtr's
+     *    top-level to destPtr. This form is called "non-linear."
+     *
+     * The code below separates these four cases and decides how many levels
+     * up and down events have to be generated for.
+     */
+
+    if (sourcePtr == destPtr) {
+       return;
+    }
+
+    /*
+     * Mark destPtr and all of its ancestors with a special flag bit.
+     */
+
+    if (destPtr != NULL) {
+       dispPtr = destPtr->dispPtr;
+       for (winPtr = destPtr; ; winPtr = winPtr->parentPtr) {
+           winPtr->flags |= TK_GRAB_FLAG;
+           if (winPtr->flags & TK_TOP_LEVEL) {
+               break;
+           }
+       }
+    } else {
+       dispPtr = sourcePtr->dispPtr;
+    }
+
+    /*
+     * Search upwards from sourcePtr until an ancestor of destPtr is
+     * found or a top-level window is reached.  Remember if we pass out
+     * of the grab tree along the way, since this means we'll have to
+     * skip some of the events that would otherwise be generated.
+     */
+
+    ancestorPtr = sourcePtr;
+    upLevels = 0;
+    if (sourcePtr != NULL) {
+       for (; ; upLevels++, ancestorPtr = ancestorPtr->parentPtr) {
+           if (ancestorPtr->flags & TK_GRAB_FLAG) {
+               break;
+           }
+           if (ancestorPtr->flags & TK_TOP_LEVEL)  {
+               upLevels++;
+               break;
+           }
+       }
+    }
+
+    /*
+     * Search upwards from destPtr again, clearing the flag bits and
+     * remembering how many levels up we had to go.
+     */
+
+    if (destPtr == NULL) {
+       downLevels = 0;
+    } else {
+       downLevels = -1;
+       for (i = 0, winPtr = destPtr; ; i++, winPtr = winPtr->parentPtr) {
+           winPtr->flags &= ~TK_GRAB_FLAG;
+           if (winPtr == ancestorPtr) {
+               downLevels = i;
+           }
+           if (winPtr->flags & TK_TOP_LEVEL) {
+               if (downLevels == -1) {
+                   downLevels = i+1;
+               }
+               break;
+           }
+       }
+    }
+
+    /*
+     * Generate enter/leave events and push them back onto the event
+     * queue.  This has to be done backwards, since the last event
+     * pushed will be the first one processed.
+     */
+
+#define PUSH_EVENT(w, t, d)                    \
+    if (w->window != None) {                   \
+       eventPtr->type = t;                     \
+       eventPtr->xcrossing.detail = d;         \
+       ChangeEventWindow(eventPtr, w);         \
+       XPutBackEvent(w->display, eventPtr);    \
+    }
+
+    if (downLevels == 0) {
+    
+       /*
+        * SourcePtr is an inferior of destPtr.
+        */
+
+       if (destPtr != NULL) {
+           PUSH_EVENT(destPtr, EnterNotify, NotifyInferior);
+       }
+       for (i = upLevels-1; i > 0; i--) {
+           for (winPtr = sourcePtr, j = 0; j < i;
+                   winPtr = winPtr->parentPtr, j++) {
+               if (winPtr == dispPtr->grabWinPtr) {
+                   goto nextIteration;
+               }
+           }
+           PUSH_EVENT(winPtr, LeaveNotify, NotifyVirtual);
+           nextIteration: continue;
+       }
+       PUSH_EVENT(sourcePtr, LeaveNotify, NotifyAncestor);
+    } else if (upLevels == 0) {
+
+       /*
+        * DestPtr is an inferior of sourcePtr.
+        */
+
+       if (destPtr != NULL) {
+           PUSH_EVENT(destPtr, EnterNotify, NotifyAncestor);
+       }
+       for (winPtr = destPtr->parentPtr, i = downLevels-1; i > 0;
+               winPtr = winPtr->parentPtr, i--) {
+           PUSH_EVENT(winPtr, EnterNotify, NotifyVirtual);
+       }
+       if (sourcePtr != NULL) {
+           PUSH_EVENT(sourcePtr, LeaveNotify, NotifyInferior);
+       }
+    } else {
+
+       /*
+        * Non-linear:  neither window is an inferior of the other.
+        */
+
+       if (destPtr != NULL) {
+           PUSH_EVENT(destPtr, EnterNotify, NotifyNonlinear);
+       }
+       if (destPtr != dispPtr->grabWinPtr) {
+           for (winPtr = destPtr->parentPtr, i = downLevels-1; i > 0;
+                   winPtr = winPtr->parentPtr, i--) {
+               PUSH_EVENT(winPtr, EnterNotify, NotifyNonlinearVirtual);
+               if (winPtr == dispPtr->grabWinPtr) {
+                   break;
+               }
+           }
+       }
+       for (i = upLevels-1; i > 0; i--) {
+           for (winPtr = sourcePtr, j = 0; j < i;
+                   winPtr = winPtr->parentPtr, j++) {
+               if (winPtr == dispPtr->grabWinPtr) {
+                   goto nextWindow;
+               }
+           }
+           PUSH_EVENT(winPtr, LeaveNotify, NotifyNonlinearVirtual);
+           nextWindow: continue;
+       }
+       PUSH_EVENT(sourcePtr, LeaveNotify, NotifyNonlinear);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * MovePointer2 --
+ *
+ *     This procedure synthesizes  EnterNotify and LeaveNotify events
+ *     to correctly transfer the pointer from one window to another.
+ *     It is different from MovePointer in that no template X event
+ *     needs to be supplied;  this procedure generates the template
+ *     event and calls MovePointer.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Synthesized events may be pushed back onto the event queue.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+MovePointer2(sourcePtr, destPtr, mode)
+    TkWindow *sourcePtr;       /* Window currently containing pointer (NULL
+                                * means it's not one managed by this
+                                * process). */
+    TkWindow *destPtr;         /* Window that is to end up containing the
+                                * pointer (NULL means it's not one managed
+                                * by this process). */
+    int mode;                  /* Mode for enter/leave events, such as
+                                * NotifyNormal or NotifyUngrab. */
+{
+    XEvent event;
+    Window dummy1, dummy2;
+    int dummy3, dummy4;
+    TkWindow *winPtr;
+
+    winPtr = sourcePtr;
+    if ((winPtr == NULL) || (winPtr->window == None)) {
+       winPtr = destPtr;
+       if ((winPtr == NULL) || (winPtr->window == None)) {
+           return;
+       }
+    }
+
+    event.xcrossing.serial = LastKnownRequestProcessed(winPtr->display);
+    event.xcrossing.send_event = False;
+    event.xcrossing.display = winPtr->display;
+    event.xcrossing.root = RootWindow(winPtr->display, winPtr->screenNum);
+    event.xcrossing.time = TkCurrentTime(winPtr->dispPtr);
+    XQueryPointer(winPtr->display, winPtr->window, &dummy1, &dummy2,
+           &event.xcrossing.x_root, &event.xcrossing.y_root,
+           &dummy3, &dummy4, &event.xcrossing.state);
+    event.xcrossing.mode = mode;
+    event.xcrossing.focus = False;
+    MovePointer(&event, sourcePtr, destPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkGrabDeadWindow --
+ *
+ *     This procedure is invoked whenever a window is deleted, so that
+ *     grab-related cleanup can be performed.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Various cleanups happen, such as generating events to move the
+ *     pointer back to its "natural" window as if an ungrab had been
+ *     done.  See the code.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkGrabDeadWindow(winPtr)
+    register TkWindow *winPtr;         /* Window that is in the process
+                                        * of being deleted. */
+{
+    TkDisplay *dispPtr = winPtr->dispPtr;
+
+    if (dispPtr->grabWinPtr == winPtr) {
+       dispPtr->grabWinPtr = NULL;
+       if (!(dispPtr->grabFlags & GRAB_GLOBAL)) {
+           /*
+            * Must generate enter/leave events to move back to the window
+            * that contains the mouse pointer.  We needn't filter events
+            * here like we do in Tk_Ungrab because there are no children
+            * of the grab window left in existence.
+            */
+
+           movePointerBack:
+           if ((dispPtr->ungrabWinPtr != NULL)
+                   && (dispPtr->ungrabWinPtr->mainPtr != winPtr->mainPtr)) {
+               dispPtr->ungrabWinPtr = NULL;
+           }
+           MovePointer2(winPtr, dispPtr->ungrabWinPtr, NotifyUngrab);
+       }
+    } else if (dispPtr->buttonWinPtr == winPtr) {
+       /*
+        * The window in which a button was pressed was deleted.  Simulate
+        * dropping the button auto-grab by generating Enter and Leave
+        * events to move the pointer back to the window it's really on
+        * top of.
+        */
+
+       dispPtr->buttonWinPtr = NULL;
+       goto movePointerBack;
+    }
+    if (dispPtr->ungrabWinPtr == winPtr) {
+       dispPtr->ungrabWinPtr = NULL;
+    }
+    if (dispPtr->pointerWinPtr == winPtr) {
+       dispPtr->pointerWinPtr = NULL;
+    }
+    if (dispPtr->serverWinPtr == winPtr) {
+       dispPtr->serverWinPtr = NULL;
+    }
+}
diff --git a/src/tk/tkint.h b/src/tk/tkint.h
new file mode 100644 (file)
index 0000000..e2c7b7e
--- /dev/null
@@ -0,0 +1,556 @@
+/*
+ * tkInt.h --
+ *
+ *     Declarations for things used internally by the Tk
+ *     procedures but not exported outside the module.
+ *
+ * Copyright 1990-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /user6/ouster/wish/RCS/tkInt.h,v 1.65 92/08/21 11:42:27 ouster Exp $ SPRITE (Berkeley)
+ */
+
+#ifndef _TKINT
+#define _TKINT
+
+#ifndef _XLIB_H_
+#include <X11/Xlib.h>
+#ifdef IS_LINUX
+#include <X11/Xlibint.h>
+#endif
+#endif
+#ifndef _XUTIL_H
+#include <X11/Xutil.h>
+#endif
+#ifndef _TK
+#include "tk.h"
+#endif
+#ifndef _TCL
+#include "tcl.h"
+#endif
+#ifndef _TCLHASH
+#include "tclhash.h"
+#endif
+
+/*
+ * One of the following structures is maintained for each display
+ * containing a window managed by Tk:
+ */
+
+typedef struct TkDisplay {
+    Display *display;          /* Xlib's info about display. */
+    struct TkDisplay *nextPtr; /* Next in list of all displays. */
+    char *name;                        /* Name of display (with any screen
+                                * identifier removed).  Malloc-ed. */
+    Time lastEventTime;                /* Time of last event received for this
+                                * display. */
+
+    /*
+     * Information used by tkEvent.c only:
+     */
+
+    struct TkWindow *mouseMainPtr;
+                               /* Pointer to the main window of this
+                                * display that currently contains the
+                                * mouse pointer.  NULL means the pointer
+                                * isn't in a main window managed by
+                                * this process. */
+
+    /*
+     * Information used by tkBind.c only:
+     */
+
+    int firstKeycode;          /* First keycode supported by
+                                * display. */
+    int lastKeycode;           /* Last keycode supported by
+                                * display. */
+    int symsPerCode;           /* Number of KeySyms in "keySyms"
+                                * for each keycode.  0 means the
+                                * keysym information hasn't been
+                                * retrieved from the server yet. */
+    KeySym *keySyms;           /* Array of KeySyms, returned by
+                                * XGetKeyboardMapping. */
+
+    /*
+     * Information used by tkError.c only:
+     */
+
+    struct TkErrorHandler *errorPtr;
+                               /* First in list of error handlers
+                                * for this display.  NULL means
+                                * no handlers exist at present. */
+    int deleteCount;           /* Counts # of handlers deleted since
+                                * last time inactive handlers were
+                                * garbage-collected.  When this number
+                                * gets big, handlers get cleaned up. */
+
+    /*
+     * Information used by tkSend.c only:
+     */
+
+    Tk_Window commWindow;      /* Window used for communication
+                                * between interpreters during "send"
+                                * commands.  NULL means send info hasn't
+                                * been initialized yet. */
+    Atom commProperty;         /* X's name for comm property. */
+    Atom registryProperty;     /* X's name for property containing
+                                * registry of interpreter names. */
+
+    /*
+     * Information used by tkSelect.c only:
+     */
+
+    Tk_Window selectionOwner;  /* Current owner of selection, or
+                                * NULL if selection isn't owned by
+                                * a window in this process.  */
+    int selectionSerial;       /* Serial number of last XSelectionSetOwner
+                                * request we made to server (used to
+                                * filter out redundant SelectionClear
+                                * events. */
+    Time selectionTime;                /* Timestamp used to acquire selection. */
+    Atom multipleAtom;         /* Atom for MULTIPLE.  None means
+                                * selection stuff isn't initialized. */
+    Atom incrAtom;             /* Atom for INCR. */
+    Atom targetsAtom;          /* Atom for TARGETS. */
+    Atom timestampAtom;                /* Atom for TIMESTAMP. */
+    Atom textAtom;             /* Atom for TEXT. */
+    Atom compoundTextAtom;     /* Atom for COMPOUND_TEXT. */
+
+    /*
+     * Information used by tkAtom.c only:
+     */
+
+    int atomInit;              /* 0 means stuff below hasn't been
+                                * initialized yet. */
+    Tcl_HashTable nameTable;   /* Maps from names to Atom's. */
+    Tcl_HashTable atomTable;   /* Maps from Atom's back to names. */
+
+    /*
+     * Information used by tkCursor.c only:
+     */
+
+    Font cursorFont;           /* Font to use for standard cursors.
+                                * None means font not loaded yet. */
+
+    /*
+     * Information used by tkGrab.c only:
+     */
+
+    struct TkWindow *grabWinPtr;
+                               /* Window in which the pointer is currently
+                                * grabbed, or NULL if none. */
+    struct TkWindow *ungrabWinPtr;
+                               /* Window to which pointer should be returned
+                                * when the current grab ends (i.e. the
+                                * window that the mouse is really on top
+                                * of). */
+    struct TkWindow *buttonWinPtr;
+                               /* Window in which first mouse button was
+                                * pressed while grab was in effect, or NULL
+                                * if no such press in effect. */
+    struct TkWindow *pointerWinPtr;
+                               /* The window that officially contains the
+                                * pointer, as far as this application is
+                                * concerned.  If a grab is in effect then
+                                * this may not be the window that's underneath
+                                * the pointer.  NULL means the application
+                                * doesn't consider the pointer to be in any
+                                * window. */
+    struct TkWindow *serverWinPtr;
+                               /* The window that contains the pointer, as
+                                * far as the X server is concerned.  This
+                                * field gets set on every Enter or Leave
+                                * event even if the grab code eventually
+                                * discards the event.  NULL means the server
+                                * thinks the pointer is outside any window
+                                * of any application on this screen. */
+    int grabFlags;             /* Miscellaneous flag values.  See definitions
+                                * in tkGrab.c. */
+/* XXX: FOCUS */
+    struct TkWindow *focusPtr; /* Identifies window that currently has the
+                                * focus (or that will get the focus the next
+                                * time the pointer enters any of the top-level
+                                * windows associated with this display).
+                                * NULL means nobody has the focus.
+                                * Managed by tkEvent.c. */
+} TkDisplay;
+
+/*
+ * One of the following structures exists for each error handler
+ * created by a call to Tk_CreateErrorHandler.  The structure
+ * is managed by tkError.c.
+ */
+
+typedef struct TkErrorHandler {
+    TkDisplay *dispPtr;                /* Display to which handler applies. */
+    unsigned long firstRequest;        /* Only errors with serial numbers
+                                * >= to this are considered. */
+    unsigned long lastRequest; /* Only errors with serial numbers
+                                * <= to this are considered.  This
+                                * field is filled in when XUnhandle
+                                * is called.  -1 means XUnhandle
+                                * hasn't been called yet. */
+    int error;                 /* Consider only errors with this
+                                * error_code (-1 means consider
+                                * all errors). */
+    int request;               /* Consider only errors with this
+                                * major request code (-1 means
+                                * consider all major codes). */
+    int minorCode;             /* Consider only errors with this
+                                * minor request code (-1 means
+                                * consider all minor codes). */
+    Tk_ErrorProc *errorProc;   /* Procedure to invoke when a matching
+                                * error occurs.  NULL means just ignore
+                                * errors. */
+    ClientData clientData;     /* Arbitrary value to pass to
+                                * errorProc. */
+    struct TkErrorHandler *nextPtr;
+                               /* Pointer to next older handler for
+                                * this display, or NULL for end of
+                                * list. */
+} TkErrorHandler;
+
+/*
+ * One of the following structures exists for each event handler
+ * created by calling Tk_CreateEventHandler.  This information
+ * is used by tkEvent.c only.
+ */
+
+typedef struct TkEventHandler {
+    unsigned long mask;                /* Events for which to invoke
+                                * proc. */
+    Tk_EventProc *proc;                /* Procedure to invoke when an event
+                                * in mask occurs. */
+    ClientData clientData;     /* Argument to pass to proc. */
+    struct TkEventHandler *nextPtr;
+                               /* Next in list of handlers
+                                * associated with window (NULL means
+                                * end of list). */
+} TkEventHandler;
+
+/*
+ * One of the following structures exists for each selection
+ * handler created by calling Tk_CreateSelHandler.  This
+ * information is used by tkSelect.c only.
+ */
+
+typedef struct TkSelHandler {
+    Atom target;               /* Target type for selection
+                                * conversion, such as TARGETS or
+                                * STRING. */
+    Atom format;               /* Format in which selection
+                                * info will be returned, such
+                                * as STRING or ATOM. */
+    Tk_SelectionProc *proc;    /* Procedure to generate selection
+                                * in this format. */
+    ClientData clientData;     /* Argument to pass to proc. */
+    int size;                  /* Size of units returned by proc
+                                * (8 for STRING, 32 for almost
+                                * anything else). */
+    struct TkSelHandler *nextPtr;
+                               /* Next selection handler associated
+                                * with same window (NULL for end of
+                                * list). */
+} TkSelHandler;
+
+/*
+ * Tk keeps one of the following data structures for each main
+ * window (created by a call to Tk_CreateMainWindow).  It stores
+ * information that is shared by all of the windows associated
+ * with a particular main window.
+ */
+
+typedef struct TkMainInfo {
+    struct TkWindow *winPtr;   /* Pointer to main window. */
+    Tcl_Interp *interp;                /* Interpreter associated with application. */
+    Tcl_HashTable nameTable;   /* Hash table mapping path names to TkWindow
+                                * structs for all windows related to this
+                                * main window.  Managed by tkWindow.c. */
+    Tk_BindingTable bindingTable;
+                               /* Used in conjunction with "bind" command
+                                * to bind events to Tcl commands. */
+/* XXX: FOCUS */
+/*    struct TkWindow *focusPtr; */    /* Identifies window that currently has the
+                                * focus (or that will get the focus the next
+                                * time the pointer enters any of the top-level
+                                * windows associated with this display).
+                                * NULL means nobody has the focus.
+                                * Managed by tkEvent.c. */
+    struct ElArray *optionRootPtr;
+                               /* Top level of option hierarchy for this
+                                * main window.  NULL means uninitialized.
+                                * Managed by tkOption.c. */
+} TkMainInfo;
+
+/*
+ * Tk keeps one of the following structures for each window.
+ * Some of the information (like size and location) is a shadow
+ * of information managed by the X server, and some is special
+ * information used here, such as event and geometry management
+ * information.  This information is (mostly) managed by tkWindow.c.
+ * WARNING: the declaration below must be kept consistent with the
+ * Tk_ClientWindow structure in tk.h.  If you change one, be sure to
+ * change the other!!
+ */
+
+typedef struct TkWindow {
+
+    /*
+     * Structural information:
+     */
+
+    Display *display;          /* Display containing window. */
+    TkDisplay *dispPtr;                /* Tk's information about display
+                                * for window. */
+    int screenNum;             /* Index of screen for window, among all
+                                * those for dispPtr. */
+    Window window;             /* X's id for window.   NULL means window
+                                * hasn't actually been created yet, or it's
+                                * been deleted. */
+    struct TkWindow *childList;        /* First in list of child windows,
+                                * or NULL if no children. */
+    struct TkWindow *parentPtr;        /* Pointer to parent window (logical
+                                * parent, not necessarily X parent), or
+                                * NULL if this is a main window. */
+    struct TkWindow *nextPtr;  /* Next in list of children with
+                                * same parent (NULL if end of
+                                * list). */
+    TkMainInfo *mainPtr;       /* Information shared by all windows
+                                * associated with a particular main
+                                * window.  NULL means this window is
+                                * a rogue that isn't associated with
+                                * any application (at present, there
+                                * should never be any rogues).  */
+
+    /*
+     * Name and type information for the window:
+     */
+
+    char *pathName;            /* Path name of window (concatenation
+                                * of all names between this window and
+                                * its top-level ancestor).  This is a
+                                * pointer into an entry in
+                                * mainPtr->nameTable or NULL if mainPtr
+                                * is NULL. */
+    Tk_Uid nameUid;            /* Name of the window within its parent
+                                * (unique within the parent). */
+    Tk_Uid classUid;           /* Class of the window.  NULL means window
+                                * hasn't been given a class yet. */
+
+    /*
+     * Geometry and other attributes of window.  This information
+     * may not be updated on the server immediately;  stuff that
+     * hasn't been reflected in the server yet is called "dirty".
+     * At present, information can be dirty only if the window
+     * hasn't yet been created.
+     */
+
+    XWindowChanges changes;    /* Geometry and other info about
+                                * window. */
+    unsigned int dirtyChanges; /* Bits indicate fields of "changes"
+                                * that are dirty. */
+    XSetWindowAttributes atts; /* Current attributes of window. */
+    unsigned long dirtyAtts;   /* Bits indicate fields of "atts"
+                                * that are dirty. */
+
+    unsigned int flags;                /* Various flag values:  these are all
+                                * defined in tk.h (confusing, but they're
+                                * needed there for some query macros). */
+
+    /*
+     * Information kept by the event manager (tkEvent.c):
+     */
+
+    TkEventHandler *handlerList;/* First in list of event handlers
+                                * declared for this window, or
+                                * NULL if none. */
+    /*
+     * Information related to input focussing (tkEvent.c):
+     */
+
+    Tk_FocusProc *focusProc;   /* Procedure to invoke when this window
+                                * gets or loses the input focus.  NULL
+                                * means this window is not prepared to
+                                * receive the focus. */
+    ClientData focusData;      /* Arbitrary value to pass to focusProc. */
+
+    /*
+     * Information used by tkOption.c to manage options for the
+     * window.
+     */
+
+    int optionLevel;           /* -1 means no option information is
+                                * currently cached for this window.
+                                * Otherwise this gives the level in
+                                * the option stack at which info is
+                                * cached. */
+    /*
+     * Information used by tkSelect.c to manage the selection.
+     */
+
+    TkSelHandler *selHandlerList;
+                               /* First in list of handlers for
+                                * returning the selection in various
+                                * forms. */
+    Tk_LostSelProc *selClearProc;
+    ClientData selClearData;   /* Info to pass to selClearProc. */
+
+    /*
+     * Information used by tkGeometry.c for geometry management.
+     */
+
+    Tk_GeometryProc *geomProc; /* Procedure to handle geometry
+                                * requests (NULL means no window is
+                                * unmanaged). */
+    ClientData geomData;       /* Argument for geomProc. */
+    int reqWidth, reqHeight;   /* Arguments from last call to
+                                * Tk_GeometryRequest, or 0's if
+                                * Tk_GeometryRequest hasn't been
+                                * called. */
+    int internalBorderWidth;   /* Width of internal border of window
+                                * (0 means no internal border).  Geom.
+                                * mgr. should not place children on top
+                                * of the border. */
+
+    /*
+     * Information maintained by tkWm.c for window manager communication.
+     */
+
+    struct TkWmInfo *wmInfoPtr;        /* For top-level windows, points to
+                                * structure with wm-related info (see
+                                * tkWm.c).  For other windows, this
+                                * is NULL. */
+} TkWindow;
+
+/*
+ * The context below is used to map from an X window id to
+ * the TkWindow structure associated with the window.
+ */
+
+extern XContext tkWindowContext;
+
+/*
+ * Pointer to first entry in list of all displays currently known.
+ */
+
+extern TkDisplay *tkDisplayList;
+
+/*
+ * Flags passed to TkMeasureChars:
+ */
+
+#define TK_WHOLE_WORDS         1
+#define TK_AT_LEAST_ONE                2
+#define TK_PARTIAL_OK          4
+#define TK_NEWLINES_NOT_SPECIAL        8
+
+/*
+ * Location of library directory containing Tk scripts.  This value
+ * is put in the $tkLibrary variable for each application.
+ */
+
+#ifndef TK_LIBRARY
+#ifdef MSDOS
+#define TK_LIBRARY "res/tk"
+#else
+#define TK_LIBRARY "/usr/local/lib/tk"
+#endif
+#endif
+
+/*
+ * See tkShare.c for explanation of following disgusting variable:
+ */
+
+extern XEvent *tkShareEventPtr;
+
+/*
+ * Secret way to inhibit event collapsing.  -deh
+ */
+
+extern int             tkCollapseMotion;
+
+/*
+ * Secret way to break out to Tk_MainLoop.  -deh
+ */
+
+extern int             tkMustExit;
+
+/*
+ * Miscellaneous variables shared among Tk modules but not exported
+ * to the outside world:
+ */
+
+extern Tk_Uid          tkActiveUid;
+extern Tk_Uid          tkDisabledUid;
+extern Tk_Uid          tkNormalUid;
+
+/*
+ * Internal procedures shared among Tk modules but not exported
+ * to the outside world:
+ */
+
+extern int             TkAreaToPolygon _ANSI_ARGS_((double *polyPtr,
+                           int numPoints, double *rectPtr));
+extern void            TkBezierPoints _ANSI_ARGS_((double control[],
+                           int numSteps, double *coordPtr));
+extern void            TkBindError _ANSI_ARGS_((Tcl_Interp *interp));
+extern void            TkBindEventProc _ANSI_ARGS_((TkWindow *winPtr,
+                           XEvent *eventPtr));
+extern Time            TkCurrentTime _ANSI_ARGS_((TkDisplay *dispPtr));
+extern int             TkDeadAppCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern void            TkDisplayChars _ANSI_ARGS_((Display *display,
+                           Drawable drawable, GC gc,
+                           XFontStruct *fontStructPtr, char *string,
+                           int numChars, int x, int y, int flags));
+extern void            TkEventDeadWindow _ANSI_ARGS_((TkWindow *winPtr));
+extern void            TkFocusEventProc _ANSI_ARGS_((TkWindow *winPtr,
+                           XEvent *eventPtr));
+extern void            TkGetButtPoints _ANSI_ARGS_((double p1[], double p2[],
+                           double width, int project, double m1[],
+                           double m2[]));
+extern int             TkGetInterpNames _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin));
+extern int             TkGetMiterPoints _ANSI_ARGS_((double p1[], double p2[],
+                           double p3[], double width, double m1[],
+                           double m2[]));
+extern void            TkGrabDeadWindow _ANSI_ARGS_((TkWindow *winPtr));
+extern int             TkLineToArea _ANSI_ARGS_((double end1Ptr[2],
+                           double end2Ptr[2], double rectPtr[4]));
+extern double          TkLineToPoint _ANSI_ARGS_((double end1Ptr[2],
+                           double end2Ptr[2], double pointPtr[2]));
+extern int             TkMeasureChars _ANSI_ARGS_((XFontStruct *fontStructPtr,
+                           char *source, int maxChars, int startX, int maxX,
+                           int flags, int *nextXPtr));
+extern void            TkOptionDeadWindow _ANSI_ARGS_((TkWindow *winPtr));
+extern int             TkOvalToArea _ANSI_ARGS_((double *ovalPtr,
+                           double *rectPtr));
+extern double          TkOvalToPoint _ANSI_ARGS_((double ovalPtr[4],
+                           double width, int filled, double pointPtr[2]));
+extern int             TkPointerEvent _ANSI_ARGS_((XEvent *eventPtr,
+                           TkWindow *winPtr));
+extern int             TkPolygonToArea _ANSI_ARGS_((double *polyPtr,
+                           int numPoints, double *rectPtr));
+extern double          TkPolygonToPoint _ANSI_ARGS_((double *polyPtr,
+                           int numPoints, double *pointPtr));
+extern void            TkSelDeadWindow _ANSI_ARGS_((TkWindow *winPtr));
+extern void            TkSelEventProc _ANSI_ARGS_((Tk_Window tkwin,
+                           XEvent *eventPtr));
+extern void            TkSelPropProc _ANSI_ARGS_((XEvent *eventPtr));
+extern void            TkUnderlineChars _ANSI_ARGS_((Display *display,
+                           Drawable drawable, GC gc,
+                           XFontStruct *fontStructPtr, char *string,
+                           int x, int y, int flags, int firstChar,
+                           int lastChar));
+extern void            TkWmDeadWindow _ANSI_ARGS_((TkWindow *winPtr));
+extern int             TkWmMapWindow _ANSI_ARGS_((TkWindow *winPtr));
+extern void            TkWmSetClass _ANSI_ARGS_((TkWindow *winPtr));
+extern void            TkWmNewWindow _ANSI_ARGS_((TkWindow *winPtr));
+
+#endif  /* _TKINT */
diff --git a/src/tk/tklist.c b/src/tk/tklist.c
new file mode 100644 (file)
index 0000000..8b291c6
--- /dev/null
@@ -0,0 +1,1785 @@
+/* 
+ * tkListbox.c --
+ *
+ *     This module implements listbox widgets for the Tk
+ *     toolkit.  A listbox displays a collection of strings,
+ *     one per line, and provides scrolling and selection.
+ *
+ * Copyright 1990-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkListbox.c,v 1.56 92/05/13 09:05:20 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "default.h"
+#include "tkint.h"
+
+/*
+ * One record of the following type is kept for each element
+ * associated with a listbox widget:
+ */
+
+typedef struct Element {
+    int textLength;            /* # non-NULL characters in text. */
+    int lBearing;              /* Distance from first character's
+                                * origin to left edge of character. */
+    int pixelWidth;            /* Total width of element in pixels (including
+                                * left bearing and right bearing). */
+    struct Element *nextPtr;   /* Next in list of all elements of this
+                                * listbox, or NULL for last element. */
+    char text[4];              /* Characters of this element, NULL-
+                                * terminated.  The actual space allocated
+                                * here will be as large as needed (> 4,
+                                * most likely).  Must be the last field
+                                * of the record. */
+} Element;
+
+#define ElementSize(stringLength) \
+       ((unsigned) (sizeof(Element) - 3 + stringLength))
+
+/*
+ * A data structure of the following type is kept for each listbox
+ * widget managed by this file:
+ */
+
+typedef struct {
+    Tk_Window tkwin;           /* Window that embodies the listbox.  NULL
+                                * means that the window has been destroyed
+                                * but the data structures haven't yet been
+                                * cleaned up.*/
+    Tcl_Interp *interp;                /* Interpreter associated with listbox. */
+    int numElements;           /* Total number of elements in this listbox. */
+    Element *elementPtr;       /* First in list of elements (NULL if no
+                                * elements. */
+
+    /*
+     * Information used when displaying widget:
+     */
+
+    Tk_3DBorder normalBorder;  /* Used for drawing border around whole
+                                * window, plus used for background. */
+    int borderWidth;           /* Width of 3-D border around window. */
+    int relief;                        /* 3-D effect: TK_RELIEF_RAISED, etc. */
+    XFontStruct *fontPtr;      /* Information about text font, or NULL. */
+    XColor *fgColorPtr;                /* Text color in normal mode. */
+    GC textGC;                 /* For drawing normal text. */
+    Tk_3DBorder selBorder;     /* Borders and backgrounds for selected
+                                * elements. */
+    int selBorderWidth;                /* Width of border around selection. */
+    XColor *selFgColorPtr;     /* Foreground color for selected elements. */
+    GC selTextGC;              /* For drawing selected text. */
+    char *geometry;            /* Desired geometry for window.  Malloc'ed. */
+    int lineHeight;            /* Number of pixels allocated for each line
+                                * in display. */
+    int topIndex;              /* Index of top-most element visible in
+                                * window. */
+    int numLines;              /* Number of lines (elements) that fit
+                                * in window at one time. */
+
+    /*
+     * Information to support horizontal scrolling:
+     */
+
+    int maxWidth;              /* Width (in pixels) of widest string in
+                                * listbox. */
+    int xScrollUnit;           /* Number of pixels in one "unit" for
+                                * horizontal scrolling (window scrolls
+                                * horizontally in increments of this size).
+                                * This is an average character size. */
+    int xOffset;               /* The left edge of each string in the
+                                * listbox is offset to the left by this
+                                * many pixels (0 means no offset, positive
+                                * means there is an offset). */
+
+    /*
+     * Information about what's selected, if any.
+     */
+
+    int selectFirst;           /* Index of first selected element (-1 means
+                                * nothing selected. */
+    int selectLast;            /* Index of last selected element. */
+    int selectAnchor;          /* Fixed end of selection (i.e. element
+                                * at which selection was started.) */
+    int exportSelection;       /* Non-zero means tie internal listbox
+                                * to X selection. */
+
+    /*
+     * Information for scanning:
+     */
+
+    int scanMarkX;             /* X-position at which scan started (e.g.
+                                * button was pressed here). */
+    int scanMarkY;             /* Y-position at which scan started (e.g.
+                                * button was pressed here). */
+    int scanMarkXOffset;       /* Value of "xOffset" field when scan
+                                * started. */
+    int scanMarkYIndex;                /* Index of line that was at top of window
+                                * when scan started. */
+
+    /*
+     * Miscellaneous information:
+     */
+
+    Cursor cursor;             /* Current cursor for window, or None. */
+    char *yScrollCmd;          /* Command prefix for communicating with
+                                * vertical scrollbar.  NULL means no command
+                                * to issue.  Malloc'ed. */
+    char *xScrollCmd;          /* Command prefix for communicating with
+                                * horizontal scrollbar.  NULL means no command
+                                * to issue.  Malloc'ed. */
+    int flags;                 /* Various flag bits:  see below for
+                                * definitions. */
+} Listbox;
+
+/*
+ * Flag bits for buttons:
+ *
+ * REDRAW_PENDING:             Non-zero means a DoWhenIdle handler
+ *                             has already been queued to redraw
+ *                             this window.
+ * UPDATE_V_SCROLLBAR:         Non-zero means vertical scrollbar needs
+ *                             to be updated.
+ * UPDATE_H_SCROLLBAR:         Non-zero means horizontal scrollbar needs
+ *                             to be updated.
+ */
+
+#define REDRAW_PENDING         1
+#define UPDATE_V_SCROLLBAR     2
+#define UPDATE_H_SCROLLBAR     4
+
+/*
+ * Information used for argv parsing:
+ */
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_LISTBOX_BG_COLOR, Tk_Offset(Listbox, normalBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_LISTBOX_BG_MONO, Tk_Offset(Listbox, normalBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       DEF_LISTBOX_BORDER_WIDTH, Tk_Offset(Listbox, borderWidth), 0},
+    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",
+       DEF_LISTBOX_CURSOR, Tk_Offset(Listbox, cursor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_BOOLEAN, "-exportselection", "exportSelection",
+       "ExportSelection", DEF_LISTBOX_EXPORT_SELECTION,
+       Tk_Offset(Listbox, exportSelection), 0},
+    {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_FONT, "-font", "font", "Font",
+       DEF_LISTBOX_FONT, Tk_Offset(Listbox, fontPtr), 0},
+    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",
+       DEF_LISTBOX_FG, Tk_Offset(Listbox, fgColorPtr), 0},
+    {TK_CONFIG_STRING, "-geometry", "geometry", "Geometry",
+       DEF_LISTBOX_GEOMETRY, Tk_Offset(Listbox, geometry), 0},
+    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
+       DEF_LISTBOX_RELIEF, Tk_Offset(Listbox, relief), 0},
+    {TK_CONFIG_BORDER, "-selectbackground", "selectBackground", "Foreground",
+       DEF_LISTBOX_SELECT_COLOR, Tk_Offset(Listbox, selBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-selectbackground", "selectBackground", "Foreground",
+       DEF_LISTBOX_SELECT_MONO, Tk_Offset(Listbox, selBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_PIXELS, "-selectborderwidth", "selectBorderWidth", "BorderWidth",
+       DEF_LISTBOX_SELECT_BD, Tk_Offset(Listbox, selBorderWidth), 0},
+    {TK_CONFIG_COLOR, "-selectforeground", "selectForeground", "Background",
+       DEF_LISTBOX_SELECT_FG_COLOR, Tk_Offset(Listbox, selFgColorPtr),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_COLOR, "-selectforeground", "selectForeground", "Background",
+       DEF_LISTBOX_SELECT_FG_MONO, Tk_Offset(Listbox, selFgColorPtr),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_STRING, "-xscrollcommand", "xScrollCommand", "ScrollCommand",
+       DEF_LISTBOX_SCROLL_COMMAND, Tk_Offset(Listbox, xScrollCmd), 0},
+    {TK_CONFIG_STRING, "-yscrollcommand", "yScrollCommand", "ScrollCommand",
+       DEF_LISTBOX_SCROLL_COMMAND, Tk_Offset(Listbox, yScrollCmd), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            ChangeListboxOffset _ANSI_ARGS_((Listbox *listPtr,
+                           int offset));
+static void            ChangeListboxView _ANSI_ARGS_((Listbox *listPtr,
+                           int index));
+static int             ConfigureListbox _ANSI_ARGS_((Tcl_Interp *interp,
+                           Listbox *listPtr, int argc, char **argv,
+                           int flags));
+static void            DeleteEls _ANSI_ARGS_((Listbox *listPtr, int first,
+                           int last));
+static void            DestroyListbox _ANSI_ARGS_((ClientData clientData));
+static void            DisplayListbox _ANSI_ARGS_((ClientData clientData));
+static int             GetListboxIndex _ANSI_ARGS_((Tcl_Interp *interp,
+                           Listbox *listPtr, char *string, int *indexPtr));
+static void            InsertEls _ANSI_ARGS_((Listbox *listPtr, int index,
+                           int argc, char **argv));
+static void            ListboxComputeWidths _ANSI_ARGS_((Listbox *listPtr,
+                           int fontChanged));
+static void            ListboxEventProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static int             ListboxFetchSelection _ANSI_ARGS_((
+                           ClientData clientData, int offset, char *buffer,
+                           int maxBytes));
+static void            ListboxLostSelection _ANSI_ARGS_((
+                           ClientData clientData));
+static void            ListboxRedrawRange _ANSI_ARGS_((Listbox *listPtr,
+                           int first, int last));
+static void            ListboxScanTo _ANSI_ARGS_((Listbox *listPtr,
+                           int x, int y));
+static void            ListboxSelectFrom _ANSI_ARGS_((Listbox *listPtr,
+                           int index));
+static void            ListboxSelectTo _ANSI_ARGS_((Listbox *listPtr,
+                           int index));
+static void            ListboxUpdateHScrollbar _ANSI_ARGS_((Listbox *listPtr));
+static void            ListboxUpdateVScrollbar _ANSI_ARGS_((Listbox *listPtr));
+static int             ListboxWidgetCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+static int             NearestListboxElement _ANSI_ARGS_((Listbox *listPtr,
+                           int y));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_ListboxCmd --
+ *
+ *     This procedure is invoked to process the "listbox" Tcl
+ *     command.  See the user documentation for details on what
+ *     it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_ListboxCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    register Listbox *listPtr;
+    Tk_Window new;
+    Tk_Window tkwin = (Tk_Window) clientData;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " pathName ?options?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], (char *) NULL);
+    if (new == NULL) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * Initialize the fields of the structure that won't be initialized
+     * by ConfigureListbox, or that ConfigureListbox requires to be
+     * initialized already (e.g. resource pointers).
+     */
+
+    listPtr = (Listbox *) ckalloc(sizeof(Listbox));
+    listPtr->tkwin = new;
+    listPtr->interp = interp;
+    listPtr->numElements = 0;
+    listPtr->elementPtr = NULL;
+    listPtr->normalBorder = NULL;
+    listPtr->fontPtr = NULL;
+    listPtr->fgColorPtr = NULL;
+    listPtr->textGC = None;
+    listPtr->selBorder = NULL;
+    listPtr->selFgColorPtr = NULL;
+    listPtr->selTextGC = NULL;
+    listPtr->geometry = NULL;
+    listPtr->topIndex = 0;
+    listPtr->xOffset = 0;
+    listPtr->selectFirst = -1;
+    listPtr->selectLast = -1;
+    listPtr->exportSelection = 1;
+    listPtr->cursor = None;
+    listPtr->yScrollCmd = NULL;
+    listPtr->xScrollCmd = NULL;
+    listPtr->flags = 0;
+
+    Tk_SetClass(listPtr->tkwin, "Listbox");
+    Tk_CreateEventHandler(listPtr->tkwin, ExposureMask|StructureNotifyMask,
+           ListboxEventProc, (ClientData) listPtr);
+    Tk_CreateSelHandler(listPtr->tkwin, XA_STRING, ListboxFetchSelection,
+           (ClientData) listPtr, XA_STRING);
+    Tcl_CreateCommand(interp, Tk_PathName(listPtr->tkwin), ListboxWidgetCmd,
+           (ClientData) listPtr, (void (*)()) NULL);
+    if (ConfigureListbox(interp, listPtr, argc-2, argv+2, 0) != TCL_OK) {
+       goto error;
+    }
+
+    interp->result = Tk_PathName(listPtr->tkwin);
+    return TCL_OK;
+
+    error:
+    Tk_DestroyWindow(listPtr->tkwin);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ListboxWidgetCmd --
+ *
+ *     This procedure is invoked to process the Tcl command
+ *     that corresponds to a widget managed by this module.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ListboxWidgetCmd(clientData, interp, argc, argv)
+    ClientData clientData;             /* Information about listbox widget. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    register Listbox *listPtr = (Listbox *) clientData;
+    int result = TCL_OK;
+    int length;
+    char c;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    Tk_Preserve((ClientData) listPtr);
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)
+           && (length >= 2)) {
+       if (argc == 2) {
+           result = Tk_ConfigureInfo(interp, listPtr->tkwin, configSpecs,
+                   (char *) listPtr, (char *) NULL, 0);
+       } else if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, listPtr->tkwin, configSpecs,
+                   (char *) listPtr, argv[2], 0);
+       } else {
+           result = ConfigureListbox(interp, listPtr, argc-2, argv+2,
+                   TK_CONFIG_ARGV_ONLY);
+       }
+    } else if ((c == 'c') && (strncmp(argv[1], "curselection", length) == 0)
+           && (length >= 2)) {
+       int i;
+       char index[20];
+
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " curselection\"",
+                   (char *) NULL);
+           goto error;
+       }
+       if (listPtr->selectFirst != -1) {
+           for (i = listPtr->selectFirst; i <= listPtr->selectLast; i++) {
+               sprintf(index, "%d", i);
+               Tcl_AppendElement(interp, index, 0);
+           }
+       }
+    } else if ((c == 'd') && (strncmp(argv[1], "delete", length) == 0)) {
+       int first, last;
+
+       if ((argc < 3) || (argc > 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " delete firstIndex ?lastIndex?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       if (GetListboxIndex(interp, listPtr, argv[2], &first) != TCL_OK) {
+           goto error;
+       }
+       if (argc == 3) {
+           last = first;
+       } else {
+           if (GetListboxIndex(interp, listPtr, argv[3], &last) != TCL_OK) {
+               goto error;
+           }
+       }
+       DeleteEls(listPtr, first, last);
+    } else if ((c == 'g') && (strncmp(argv[1], "get", length) == 0)) {
+       int index;
+       register Element *elPtr;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " get index\"", (char *) NULL);
+           goto error;
+       }
+       if (GetListboxIndex(interp, listPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if (index < 0) {
+           index = 0;
+       }
+       if (index >= listPtr->numElements) {
+           index = listPtr->numElements-1;
+       }
+       for (elPtr = listPtr->elementPtr; index > 0;
+               index--, elPtr = elPtr->nextPtr) {
+           /* Empty loop body. */
+       }
+       if (elPtr != NULL) {
+           interp->result = elPtr->text;
+       }
+    } else if ((c == 'i') && (strncmp(argv[1], "insert", length) == 0)) {
+       int index;
+
+       if (argc < 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " insert index ?element? ?element ...?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       if (argc > 3) {
+           if (GetListboxIndex(interp, listPtr, argv[2], &index) != TCL_OK) {
+               goto error;
+           }
+           InsertEls(listPtr, index, argc-3, argv+3);
+       }
+    } else if ((c == 'n') && (strncmp(argv[1], "nearest", length) == 0)) {
+       int index, y;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " nearest y\"", (char *) NULL);
+           goto error;
+       }
+       if (Tcl_GetInt(interp, argv[2], &y) != TCL_OK) {
+           goto error;
+       }
+       index = NearestListboxElement(listPtr, y);
+       sprintf(interp->result, "%d", index);
+    } else if ((c == 's') && (length >= 2)
+           && (strncmp(argv[1], "scan", length) == 0)) {
+       int x, y;
+
+       if (argc != 5) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " scan mark|dragto x y\"", (char *) NULL);
+           goto error;
+       }
+       if ((Tcl_GetInt(interp, argv[3], &x) != TCL_OK)
+               || (Tcl_GetInt(interp, argv[4], &y) != TCL_OK)) {
+           goto error;
+       }
+       if ((argv[2][0] == 'm')
+               && (strncmp(argv[2], "mark", strlen(argv[2])) == 0)) {
+           listPtr->scanMarkX = x;
+           listPtr->scanMarkY = y;
+           listPtr->scanMarkXOffset = listPtr->xOffset;
+           listPtr->scanMarkYIndex = listPtr->topIndex;
+       } else if ((argv[2][0] == 'd')
+               && (strncmp(argv[2], "dragto", strlen(argv[2])) == 0)) {
+           ListboxScanTo(listPtr, x, y);
+       } else {
+           Tcl_AppendResult(interp, "bad scan option \"", argv[2],
+                   "\":  must be mark or dragto", (char *) NULL);
+           goto error;
+       }
+    } else if ((c == 's') && (length >= 2)
+           && (strncmp(argv[1], "select", length) == 0)) {
+       int index;
+
+       if (argc < 3) {
+           Tcl_AppendResult(interp, "too few args: should be \"",
+                   argv[0], " select option ?index?\"", (char *) NULL);
+           goto error;
+       }
+       length = strlen(argv[2]);
+       c = argv[2][0];
+       if ((c == 'c') && (argv[2] != NULL)
+               && (strncmp(argv[2], "clear", length) == 0)) {
+           if (argc != 3) {
+               Tcl_AppendResult(interp, "wrong # args: should be \"",
+                       argv[0], " select clear\"", (char *) NULL);
+               goto error;
+           }
+           if (listPtr->selectFirst != -1) {
+               ListboxRedrawRange(listPtr, listPtr->selectFirst,
+                       listPtr->selectLast);
+               listPtr->selectFirst = -1;
+           }
+           goto done;
+       }
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " select option index\"", (char *) NULL);
+           goto error;
+       }
+       if (GetListboxIndex(interp, listPtr, argv[3], &index) != TCL_OK) {
+           goto error;
+       }
+       if ((c == 'a') && (strncmp(argv[2], "adjust", length) == 0)) {
+           if (index < (listPtr->selectFirst + listPtr->selectLast)/2) {
+               listPtr->selectAnchor = listPtr->selectLast;
+           } else {
+               listPtr->selectAnchor = listPtr->selectFirst;
+           }
+           ListboxSelectTo(listPtr, index);
+       } else if ((c == 'f') && (strncmp(argv[2], "from", length) == 0)) {
+           ListboxSelectFrom(listPtr, index);
+       } else if ((c == 't') && (strncmp(argv[2], "to", length) == 0)) {
+           ListboxSelectTo(listPtr, index);
+       } else {
+           Tcl_AppendResult(interp, "bad select option \"", argv[2],
+                   "\": must be adjust, clear, from, or to", (char *) NULL);
+           goto error;
+       }
+    } else if ((c == 's') && (length >= 2)
+           && (strncmp(argv[1], "size", length) == 0)) {
+       sprintf(interp->result, "%d", listPtr->numElements);
+    } else if ((c == 'x') && (strncmp(argv[1], "xview", length) == 0)) {
+       int index;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " xview index\"", (char *) NULL);
+           goto error;
+       }
+       if (Tcl_GetInt(interp, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       ChangeListboxOffset(listPtr, index*listPtr->xScrollUnit);
+    } else if ((c == 'y') && (strncmp(argv[1], "yview", length) == 0)) {
+       int index;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " yview index\"", (char *) NULL);
+           goto error;
+       }
+       if (GetListboxIndex(interp, listPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       ChangeListboxView(listPtr, index);
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\": must be configure, curselection, delete, get, ",
+               "insert, nearest, scan, select, size, ",
+               "xview, or yview", (char *) NULL);
+       goto error;
+    }
+    done:
+    Tk_Release((ClientData) listPtr);
+    return result;
+
+    error:
+    Tk_Release((ClientData) listPtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyListbox --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a listbox at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the listbox is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyListbox(clientData)
+    ClientData clientData;     /* Info about listbox widget. */
+{
+    register Listbox *listPtr = (Listbox *) clientData;
+    register Element *elPtr, *nextPtr;
+
+    for (elPtr = listPtr->elementPtr; elPtr != NULL; ) {
+       nextPtr = elPtr->nextPtr;
+       ckfree((char *) elPtr);
+       elPtr = nextPtr;
+    }
+    if (listPtr->normalBorder != NULL) {
+       Tk_Free3DBorder(listPtr->normalBorder);
+    }
+    if (listPtr->fontPtr != NULL) {
+       Tk_FreeFontStruct(listPtr->fontPtr);
+    }
+    if (listPtr->fgColorPtr != NULL) {
+       Tk_FreeColor(listPtr->fgColorPtr);
+    }
+    if (listPtr->textGC != None) {
+       Tk_FreeGC(listPtr->textGC);
+    }
+    if (listPtr->selBorder != NULL) {
+       Tk_Free3DBorder(listPtr->selBorder);
+    }
+    if (listPtr->selFgColorPtr != NULL) {
+       Tk_FreeColor(listPtr->selFgColorPtr);
+    }
+    if (listPtr->selTextGC != None) {
+       Tk_FreeGC(listPtr->selTextGC);
+    }
+    if (listPtr->geometry != NULL) {
+       ckfree(listPtr->geometry);
+    }
+    if (listPtr->cursor != None) {
+       Tk_FreeCursor(listPtr->cursor);
+    }
+    if (listPtr->yScrollCmd != NULL) {
+       ckfree(listPtr->yScrollCmd);
+    }
+    if (listPtr->xScrollCmd != NULL) {
+       ckfree(listPtr->xScrollCmd);
+    }
+    ckfree((char *) listPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureListbox --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or reconfigure)
+ *     a listbox widget.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information, such as colors, border width,
+ *     etc. get set for listPtr;  old resources get freed,
+ *     if there were any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureListbox(interp, listPtr, argc, argv, flags)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    register Listbox *listPtr; /* Information about widget;  may or may
+                                * not already have values for some fields. */
+    int argc;                  /* Number of valid entries in argv. */
+    char **argv;               /* Arguments. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    XGCValues gcValues;
+    GC new;
+    int width, height, fontHeight, oldExport;
+
+    oldExport = listPtr->exportSelection;
+    if (Tk_ConfigureWidget(interp, listPtr->tkwin, configSpecs,
+           argc, argv, (char *) listPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few options need special processing, such as parsing the
+     * geometry and setting the background from a 3-D border.
+     */
+
+    Tk_SetBackgroundFromBorder(listPtr->tkwin, listPtr->normalBorder);
+
+    gcValues.foreground = listPtr->fgColorPtr->pixel;
+    gcValues.font = listPtr->fontPtr->fid;
+    gcValues.graphics_exposures = False;
+    new = Tk_GetGC(listPtr->tkwin, GCForeground|GCFont|GCGraphicsExposures,
+           &gcValues);
+    if (listPtr->textGC != None) {
+       Tk_FreeGC(listPtr->textGC);
+    }
+    listPtr->textGC = new;
+
+    gcValues.foreground = listPtr->selFgColorPtr->pixel;
+    gcValues.font = listPtr->fontPtr->fid;
+    new = Tk_GetGC(listPtr->tkwin, GCForeground|GCFont, &gcValues);
+    if (listPtr->selTextGC != None) {
+       Tk_FreeGC(listPtr->selTextGC);
+    }
+    listPtr->selTextGC = new;
+
+    /*
+     * Claim the selection if we've suddenly started exporting it.
+     */
+
+    if (listPtr->exportSelection && (!oldExport)
+           && (listPtr->selectFirst !=-1)) {
+       Tk_OwnSelection(listPtr->tkwin, ListboxLostSelection,
+               (ClientData) listPtr);
+    }
+
+    /*
+     * Register the desired geometry for the window, and arrange for
+     * the window to be redisplayed.
+     */
+
+    if ((sscanf(listPtr->geometry, "%dx%d", &width, &height) != 2)
+           || (width <= 0) || (height <= 0)) {
+       Tcl_AppendResult(interp, "bad geometry \"",
+               listPtr->geometry, "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    fontHeight = listPtr->fontPtr->ascent + listPtr->fontPtr->descent;
+    listPtr->lineHeight = fontHeight + 1 + 2*listPtr->selBorderWidth;
+    listPtr->numLines = (Tk_Height(listPtr->tkwin) - 2*listPtr->borderWidth)
+           / listPtr->lineHeight;
+    if (listPtr->numLines < 0) {
+       listPtr->numLines = 0;
+    }
+    ListboxComputeWidths(listPtr, 1);
+    width = (width+1)*listPtr->xScrollUnit + 2*listPtr->borderWidth
+           + 2*listPtr->selBorderWidth;
+    height = height*listPtr->lineHeight + 2*listPtr->borderWidth;
+    Tk_GeometryRequest(listPtr->tkwin, width, height);
+    Tk_SetInternalBorder(listPtr->tkwin, listPtr->borderWidth);
+    listPtr->flags |= UPDATE_V_SCROLLBAR|UPDATE_H_SCROLLBAR;
+    ListboxRedrawRange(listPtr, 0, listPtr->numElements-1);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayListbox --
+ *
+ *     This procedure redraws the contents of a listbox window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information appears on the screen.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayListbox(clientData)
+    ClientData clientData;     /* Information about window. */
+{
+    register Listbox *listPtr = (Listbox *) clientData;
+    register Tk_Window tkwin = listPtr->tkwin;
+    register Element *elPtr;
+    GC gc;
+    int i, limit, x, y, margin;
+    Pixmap pixmap;
+
+    listPtr->flags &= ~REDRAW_PENDING;
+    if (listPtr->flags & UPDATE_V_SCROLLBAR) {
+       ListboxUpdateVScrollbar(listPtr);
+    }
+    if (listPtr->flags & UPDATE_H_SCROLLBAR) {
+       ListboxUpdateHScrollbar(listPtr);
+    }
+    listPtr->flags &= ~(REDRAW_PENDING|UPDATE_V_SCROLLBAR|UPDATE_H_SCROLLBAR);
+    if ((listPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
+       return;
+    }
+
+    /*
+     * Redrawing is done in a temporary pixmap that is allocated
+     * here and freed at the end of the procedure.  All drawing is
+     * done to the pixmap, and the pixmap is copied to the screen
+     * at the end of the procedure.  This provides the smoothest
+     * possible visual effects (no flashing on the screen).
+     */
+
+    pixmap = XCreatePixmap(Tk_Display(tkwin), Tk_WindowId(tkwin),
+           Tk_Width(tkwin), Tk_Height(tkwin),
+           Tk_DefaultDepth(Tk_Screen(tkwin)));
+    Tk_Fill3DRectangle(Tk_Display(tkwin), pixmap, listPtr->normalBorder,
+           0, 0, Tk_Width(tkwin), Tk_Height(tkwin), listPtr->borderWidth,
+           listPtr->relief);
+
+    /*
+     * Iterate through all of the elements of the listbox, displaying each
+     * in turn.  Selected elements use a different GC and have a raised
+     * background.
+     */
+
+    limit = listPtr->topIndex + listPtr->numLines - 1;
+    if (limit >= listPtr->numElements) {
+       limit = listPtr->numElements-1;
+    }
+    margin = listPtr->selBorderWidth + listPtr->xScrollUnit/2;
+    for (elPtr = listPtr->elementPtr, i = 0; (elPtr != NULL) && (i <= limit);
+           elPtr = elPtr->nextPtr, i++) {
+       if (i < listPtr->topIndex) {
+           continue;
+       }
+       x = listPtr->borderWidth;
+       y = ((i - listPtr->topIndex) * listPtr->lineHeight) 
+               + listPtr->borderWidth;
+       gc = listPtr->textGC;
+       if ((listPtr->selectFirst >= 0) && (i >= listPtr->selectFirst)
+               && (i <= listPtr->selectLast)) {
+           gc = listPtr->selTextGC;
+           Tk_Fill3DRectangle(Tk_Display(tkwin), pixmap,
+                   listPtr->selBorder, x, y,
+                   Tk_Width(tkwin) - 2*listPtr->borderWidth,
+                   listPtr->lineHeight, listPtr->selBorderWidth,
+                   TK_RELIEF_RAISED);
+       }
+       y += listPtr->fontPtr->ascent + listPtr->selBorderWidth;
+       x += margin - elPtr->lBearing - listPtr->xOffset;
+       XDrawString(Tk_Display(tkwin), pixmap, gc, x, y,
+               elPtr->text, elPtr->textLength);
+    }
+
+    /*
+     * Redraw the border for the listbox to make sure that it's on top
+     * of any of the text of the listbox entries.
+     */
+
+    Tk_Draw3DRectangle(Tk_Display(tkwin), pixmap,
+           listPtr->normalBorder, 0, 0, Tk_Width(tkwin),
+           Tk_Height(tkwin), listPtr->borderWidth,
+           listPtr->relief);
+    XCopyArea(Tk_Display(tkwin), pixmap, Tk_WindowId(tkwin),
+           listPtr->textGC, 0, 0, Tk_Width(tkwin), Tk_Height(tkwin),
+           0, 0);
+    XFreePixmap(Tk_Display(tkwin), pixmap);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * InsertEls --
+ *
+ *     Add new elements to a listbox widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     New information gets added to listPtr;  it will be redisplayed
+ *     soon, but not immediately.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+InsertEls(listPtr, index, argc, argv)
+    register Listbox *listPtr; /* Listbox that is to get the new
+                                * elements. */
+    int index;                 /* Add the new elements before this
+                                * element. */
+    int argc;                  /* Number of new elements to add. */
+    char **argv;               /* New elements (one per entry). */
+{
+    register Element *prevPtr, *newPtr;
+    int length, dummy, i, oldMaxWidth;
+    XCharStruct bbox;
+
+    /*
+     * Find the element before which the new ones will be inserted.
+     */
+
+    if (index <= 0) {
+       index = 0;
+    }
+    if (index > listPtr->numElements) {
+       index = listPtr->numElements;
+    }
+    if (index == 0) {
+       prevPtr = NULL;
+    } else {
+       for (prevPtr = listPtr->elementPtr, i = index - 1; i > 0; i--) {
+           prevPtr = prevPtr->nextPtr;
+       }
+    }
+
+    /*
+     * For each new element, create a record, initialize it, and link
+     * it into the list of elements.
+     */
+
+    oldMaxWidth = listPtr->maxWidth;
+    for (i = argc ; i > 0; i--, argv++, prevPtr = newPtr) {
+       length = strlen(*argv);
+       newPtr = (Element *) ckalloc(ElementSize(length));
+       newPtr->textLength = length;
+       strcpy(newPtr->text, *argv);
+       XTextExtents(listPtr->fontPtr, newPtr->text, newPtr->textLength,
+               &dummy, &dummy, &dummy, &bbox);
+       newPtr->lBearing = bbox.lbearing;
+       newPtr->pixelWidth = bbox.lbearing + bbox.rbearing;
+       if (newPtr->pixelWidth > listPtr->maxWidth) {
+           listPtr->maxWidth = newPtr->pixelWidth;
+       }
+       if (prevPtr == NULL) {
+           newPtr->nextPtr = listPtr->elementPtr;
+           listPtr->elementPtr = newPtr;
+       } else {
+           newPtr->nextPtr = prevPtr->nextPtr;
+           prevPtr->nextPtr = newPtr;
+       }
+    }
+    listPtr->numElements += argc;
+
+    /*
+     * Update the selection to account for the  renumbering that has just
+     * occurred.  Then arrange for the new information to be displayed.
+     */
+
+    if (index <= listPtr->selectFirst) {
+       listPtr->selectFirst += argc;
+    }
+    if (index <= listPtr->selectLast) {
+       listPtr->selectLast += argc;
+    }
+    listPtr->flags |= UPDATE_V_SCROLLBAR;
+    if (listPtr->maxWidth != oldMaxWidth) {
+       listPtr->flags |= UPDATE_H_SCROLLBAR;
+    }
+    ListboxRedrawRange(listPtr, index, listPtr->numElements-1);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DeleteEls --
+ *
+ *     Remove one or more elements from a listbox widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Memory gets freed, the listbox gets modified and (eventually)
+ *     redisplayed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DeleteEls(listPtr, first, last)
+    register Listbox *listPtr; /* Listbox widget to modify. */
+    int first;                 /* Index of first element to delete. */
+    int last;                  /* Index of last element to delete. */
+{
+    register Element *prevPtr, *elPtr;
+    int count, i, widthChanged;
+
+    /*
+     * Adjust the range to fit within the existing elements of the
+     * listbox, and make sure there's something to delete.
+     */
+
+    if (first < 0) {
+       first = 0;
+    }
+    if (last >= listPtr->numElements) {
+       last = listPtr->numElements-1;
+    }
+    count = last + 1 - first;
+    if (count <= 0) {
+       return;
+    }
+
+    /*
+     * Find the element just before the ones to delete.
+     */
+
+    if (first == 0) {
+       prevPtr = NULL;
+    } else {
+       for (i = first-1, prevPtr = listPtr->elementPtr; i > 0; i--) {
+           prevPtr = prevPtr->nextPtr;
+       }
+    }
+
+    /*
+     * Delete the requested number of elements.
+     */
+
+    widthChanged = 0;
+    for (i = count; i > 0; i--) {
+       if (prevPtr == NULL) {
+           elPtr = listPtr->elementPtr;
+           listPtr->elementPtr = elPtr->nextPtr;
+       } else {
+           elPtr = prevPtr->nextPtr;
+           prevPtr->nextPtr = elPtr->nextPtr;
+       }
+       if (elPtr->pixelWidth == listPtr->maxWidth) {
+           widthChanged = 1;
+       }
+       ckfree((char *) elPtr);
+    }
+    listPtr->numElements -= count;
+
+    /*
+     * Update the selection and viewing information to reflect the change
+     * in the element numbering, and redisplay to slide information up over
+     * the elements that were deleted.
+     */
+
+    if (first <= listPtr->selectFirst) {
+       listPtr->selectFirst -= count;
+       if (listPtr->selectFirst < first) {
+           listPtr->selectFirst = first;
+       }
+    }
+    if (first <= listPtr->selectLast) {
+       listPtr->selectLast -= count;
+       if (listPtr->selectLast < first) {
+           listPtr->selectLast = first-1;
+       }
+    }
+    if (listPtr->selectLast < listPtr->selectFirst) {
+       listPtr->selectFirst = -1;
+    }
+    if (first <= listPtr->topIndex) {
+       listPtr->topIndex -= count;
+       if (listPtr->topIndex < first) {
+           listPtr->topIndex = first;
+       }
+    }
+    listPtr->flags |= UPDATE_V_SCROLLBAR;
+    if (widthChanged) {
+       ListboxComputeWidths(listPtr, 0);
+       listPtr->flags |= UPDATE_H_SCROLLBAR;
+    }
+    ListboxRedrawRange(listPtr, first, listPtr->numElements-1);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ListboxEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher for various
+ *     events on listboxes.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the window gets deleted, internal structures get
+ *     cleaned up.  When it gets exposed, it is redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ListboxEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    XEvent *eventPtr;          /* Information about event. */
+{
+    Listbox *listPtr = (Listbox *) clientData;
+
+    if (eventPtr->type == Expose) {
+       ListboxRedrawRange(listPtr,
+               NearestListboxElement(listPtr, eventPtr->xexpose.y),
+               NearestListboxElement(listPtr, eventPtr->xexpose.y
+               + eventPtr->xexpose.height));
+    } else if (eventPtr->type == DestroyNotify) {
+       Tcl_DeleteCommand(listPtr->interp, Tk_PathName(listPtr->tkwin));
+       listPtr->tkwin = NULL;
+       if (listPtr->flags & REDRAW_PENDING) {
+           Tk_CancelIdleCall(DisplayListbox, (ClientData) listPtr);
+       }
+       Tk_EventuallyFree((ClientData) listPtr, DestroyListbox);
+    } else if (eventPtr->type == ConfigureNotify) {
+       Tk_Preserve((ClientData) listPtr);
+       listPtr->numLines = (Tk_Height(listPtr->tkwin)
+               - 2*listPtr->borderWidth) / listPtr->lineHeight;
+       listPtr->flags |= UPDATE_V_SCROLLBAR|UPDATE_H_SCROLLBAR;
+       ListboxRedrawRange(listPtr, 0, listPtr->numElements-1);
+       Tk_Release((ClientData) listPtr);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * GetListboxIndex --
+ *
+ *     Parse an index into a listbox and return either its value
+ *     or an error.
+ *
+ * Results:
+ *     A standard Tcl result.  If all went well, then *indexPtr is
+ *     filled in with the index (into listPtr) corresponding to
+ *     string.  Otherwise an error message is left in interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+GetListboxIndex(interp, listPtr, string, indexPtr)
+    Tcl_Interp *interp;                /* For error messages. */
+    Listbox *listPtr;          /* Listbox for which the index is being
+                                * specified. */
+    char *string;              /* Numerical index into listPtr's element
+                                * list, or "end" to refer to last element. */
+    int *indexPtr;             /* Where to store converted index. */
+{
+    if (string[0] == 'e') {
+       if (strncmp(string, "end", strlen(string)) != 0) {
+           badIndex:
+           Tcl_AppendResult(interp, "bad listbox index \"", string,
+                   "\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       *indexPtr = listPtr->numElements;
+       if (listPtr->numElements <= 0) {
+           *indexPtr = 0;
+       }
+    } else {
+       if (Tcl_GetInt(interp, string, indexPtr) != TCL_OK) {
+           Tcl_ResetResult(interp);
+           goto badIndex;
+       }
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ChangeListboxView --
+ *
+ *     Change the view on a listbox widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     What's displayed on the screen is changed.  If there is a
+ *     scrollbar associated with this widget, then the scrollbar
+ *     is instructed to change its display too.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ChangeListboxView(listPtr, index)
+    register Listbox *listPtr;         /* Information about widget. */
+    int index;                         /* Index of element in listPtr. */
+{
+    if (listPtr->tkwin == NULL) {
+       return;
+    }
+
+    if (index >= listPtr->numElements) {
+       index = listPtr->numElements-1;
+    }
+    if (index < 0) {
+       index = 0;
+    }
+    if (listPtr->topIndex != index) {
+       if (!(listPtr->flags & REDRAW_PENDING)) {
+           Tk_DoWhenIdle(DisplayListbox, (ClientData) listPtr);
+           listPtr->flags |= REDRAW_PENDING;
+       }
+       listPtr->topIndex = index;
+       ListboxUpdateVScrollbar(listPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ChangListboxOffset --
+ *
+ *     Change the horizontal offset for a listbox.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The listbox may be redrawn to reflect its new horizontal
+ *     offset.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ChangeListboxOffset(listPtr, offset)
+    register Listbox *listPtr;         /* Information about widget. */
+    int offset;                                /* Desired new "xOffset" for
+                                        * listbox. */
+{
+    int maxOffset;
+
+    if (listPtr->tkwin == NULL) {
+       return;
+    }
+
+    /*
+     * Make sure that the new offset is within the allowable range, and
+     * round it off to an even multiple of xScrollUnit.
+     */
+
+    maxOffset = listPtr->maxWidth + (listPtr->xScrollUnit-1)
+           - (Tk_Width(listPtr->tkwin) - 2*listPtr->borderWidth
+           - 2*listPtr->selBorderWidth - listPtr->xScrollUnit);
+    if (offset > maxOffset) {
+       offset = maxOffset;
+    }
+    if (offset < 0) {
+       offset = 0;
+    }
+    offset -= offset%listPtr->xScrollUnit;
+    if (offset != listPtr->xOffset) {
+       listPtr->xOffset = offset;
+       listPtr->flags |= UPDATE_H_SCROLLBAR;
+       ListboxRedrawRange(listPtr, 0, listPtr->numElements);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ListboxScanTo --
+ *
+ *     Given a point (presumably of the curent mouse location)
+ *     drag the view in the window to implement the scan operation.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The view in the window may change.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ListboxScanTo(listPtr, x, y)
+    register Listbox *listPtr;         /* Information about widget. */
+    int x;                             /* X-coordinate to use for scan
+                                        * operation. */
+    int y;                             /* Y-coordinate to use for scan
+                                        * operation. */
+{
+    int newTopIndex, newOffset;
+
+    /*
+     * Compute new top line for screen by amplifying the difference
+     * between the current position and the place where the scan
+     * started (the "mark" position).  If we run off the top or bottom
+     * of the list, then reset the mark point so that the current
+     * position continues to correspond to the edge of the window.
+     * This means that the picture will start dragging as soon as the
+     * mouse reverses direction (without this reset, might have to slide
+     * mouse a long ways back before the picture starts moving again).
+     */
+
+    newTopIndex = listPtr->scanMarkYIndex
+           - (10*(y - listPtr->scanMarkY))/listPtr->lineHeight;
+    if (newTopIndex >= listPtr->numElements) {
+       newTopIndex = listPtr->scanMarkYIndex = listPtr->numElements-1;
+       listPtr->scanMarkY = y;
+    } else if (newTopIndex < 0) {
+       newTopIndex = listPtr->scanMarkYIndex = 0;
+       listPtr->scanMarkY = y;
+    }
+    ChangeListboxView(listPtr, newTopIndex);
+
+    /*
+     * Compute new left edge for display in a similar fashion by amplifying
+     * the difference between the current position and the place where the
+     * scan started.
+     */
+
+    newOffset = listPtr->scanMarkXOffset - (10*(x - listPtr->scanMarkX));
+    if (newOffset >= listPtr->maxWidth) {
+       newOffset = listPtr->scanMarkXOffset = listPtr->maxWidth;
+       listPtr->scanMarkX = x;
+    } else if (newOffset < 0) {
+       newOffset = listPtr->scanMarkXOffset = 0;
+       listPtr->scanMarkX = x;
+    }
+    ChangeListboxOffset(listPtr, newOffset);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * NearestListboxElement --
+ *
+ *     Given a y-coordinate inside a listbox, compute the index of
+ *     the element under that y-coordinate (or closest to that
+ *     y-coordinate).
+ *
+ * Results:
+ *     The return value is an index of an element of listPtr.  If
+ *     listPtr has no elements, then 0 is always returned.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+NearestListboxElement(listPtr, y)
+    register Listbox *listPtr;         /* Information about widget. */
+    int y;                             /* Y-coordinate in listPtr's window. */
+{
+    int index;
+
+    index = (y - listPtr->borderWidth)/listPtr->lineHeight;
+    if (index >= listPtr->numLines) {
+       index = listPtr->numLines-1;
+    }
+    if (index < 0) {
+       index = 0;
+    }
+    index += listPtr->topIndex;
+    if (index >= listPtr->numElements) {
+       index = listPtr->numElements-1;
+    }
+    return index;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ListboxSelectFrom --
+ *
+ *     Start a new selection in a listbox.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     ListPtr claims the selection, and the selection becomes the
+ *     single element given by index.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ListboxSelectFrom(listPtr, index)
+    register Listbox *listPtr;         /* Information about widget. */
+    int index;                         /* Index of element that is to
+                                        * become the new selection. */
+{
+    /*
+     * Make sure the index is within the proper range for the listbox.
+     */
+
+    if (index <= 0) {
+       index = 0;
+    }
+    if (index >= listPtr->numElements) {
+       index = listPtr->numElements-1;
+    }
+
+    if (listPtr->selectFirst != -1) {
+       ListboxRedrawRange(listPtr, listPtr->selectFirst, listPtr->selectLast);
+    } else if (listPtr->exportSelection) {
+       Tk_OwnSelection(listPtr->tkwin, ListboxLostSelection,
+               (ClientData) listPtr);
+    }
+
+    listPtr->selectFirst = listPtr->selectLast = index;
+    listPtr->selectAnchor = index;
+    ListboxRedrawRange(listPtr, index, index);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ListboxSelectTo --
+ *
+ *     Modify the selection by moving its un-anchored end.  This could
+ *     make the selection either larger or smaller.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The selection changes.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ListboxSelectTo(listPtr, index)
+    register Listbox *listPtr;         /* Information about widget. */
+    int index;                         /* Index of element that is to
+                                        * become the "other" end of the
+                                        * selection. */
+{
+    int newFirst, newLast;
+
+    /*
+     * Make sure the index is within the proper range for the listbox.
+     */
+
+    if (index <= 0) {
+       index = 0;
+    }
+    if (index >= listPtr->numElements) {
+       index = listPtr->numElements-1;
+    }
+
+    /*
+     * We should already own the selection, but grab it if we don't.
+     */
+
+    if (listPtr->selectFirst == -1) {
+       ListboxSelectFrom(listPtr, index);
+    }
+
+    if (listPtr->selectAnchor < index) {
+       newFirst = listPtr->selectAnchor;
+       newLast = index;
+    } else {
+       newFirst = index;
+       newLast = listPtr->selectAnchor;
+    }
+    if ((listPtr->selectFirst == newFirst)
+           && (listPtr->selectLast == newLast)) {
+       return;
+    }
+    if (listPtr->selectFirst != newFirst) {
+       if (listPtr->selectFirst < newFirst) {
+           ListboxRedrawRange(listPtr, listPtr->selectFirst, newFirst-1);
+       } else {
+           ListboxRedrawRange(listPtr, newFirst, listPtr->selectFirst-1);
+       }
+       listPtr->selectFirst = newFirst;
+    }
+    if (listPtr->selectLast != newLast) {
+       if (listPtr->selectLast < newLast) {
+           ListboxRedrawRange(listPtr, listPtr->selectLast+1, newLast);
+       } else {
+           ListboxRedrawRange(listPtr, newLast+1, listPtr->selectLast);
+       }
+       listPtr->selectLast = newLast;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ListboxFetchSelection --
+ *
+ *     This procedure is called back by Tk when the selection is
+ *     requested by someone.  It returns part or all of the selection
+ *     in a buffer provided by the caller.
+ *
+ * Results:
+ *     The return value is the number of non-NULL bytes stored
+ *     at buffer.  Buffer is filled (or partially filled) with a
+ *     NULL-terminated string containing part or all of the selection,
+ *     as given by offset and maxBytes.  The selection is returned
+ *     as a Tcl list with one list element for each element in the
+ *     listbox.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ListboxFetchSelection(clientData, offset, buffer, maxBytes)
+    ClientData clientData;             /* Information about listbox widget. */
+    int offset;                                /* Offset within selection of first
+                                        * byte to be returned. */
+    char *buffer;                      /* Location in which to place
+                                        * selection. */
+    int maxBytes;                      /* Maximum number of bytes to place
+                                        * at buffer, not including terminating
+                                        * NULL character. */
+{
+    register Listbox *listPtr = (Listbox *) clientData;
+    register Element *elPtr;
+    char **argv, *selection;
+    int src, dst, length, count, argc;
+
+    if ((listPtr->selectFirst == -1) || !listPtr->exportSelection) {
+       return -1;
+    }
+
+    /*
+     * Use Tcl_Merge to format the listbox elements into a suitable
+     * Tcl list.
+     */
+
+    argc = listPtr->selectLast - listPtr->selectFirst + 1;
+    argv = (char **) ckalloc((unsigned) (argc*sizeof(char *)));
+    for (src = 0, dst = 0, elPtr = listPtr->elementPtr; ;
+           src++, elPtr = elPtr->nextPtr) {
+       if (src < listPtr->selectFirst) {
+           continue;
+       }
+       if (src > listPtr->selectLast) {
+           break;
+       }
+       argv[dst] = elPtr->text;
+       dst++;
+    }
+    selection = Tcl_Merge(argc, argv);
+
+    /*
+     * Copy the requested portion of the selection to the buffer.
+     */
+
+    length = strlen(selection);
+    count = length - offset;
+    if (count <= 0) {
+       count = 0;
+       goto done;
+    }
+    if (count > maxBytes) {
+       count = maxBytes;
+    }
+    memcpy((VOID *) buffer, (VOID *) (selection + offset), count);
+
+    done:
+    buffer[count] = '\0';
+    ckfree(selection);
+    ckfree((char *) argv);
+    return count;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ListboxLostSelection --
+ *
+ *     This procedure is called back by Tk when the selection is
+ *     grabbed away from a listbox widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The existing selection is unhighlighted, and the window is
+ *     marked as not containing a selection.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ListboxLostSelection(clientData)
+    ClientData clientData;             /* Information about listbox widget. */
+{
+    register Listbox *listPtr = (Listbox *) clientData;
+
+    if ((listPtr->selectFirst >= 0) && listPtr->exportSelection) {
+       ListboxRedrawRange(listPtr, listPtr->selectFirst, listPtr->selectLast);
+       listPtr->selectFirst = -1;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ListboxRedrawRange --
+ *
+ *     Ensure that a given range of elements is eventually redrawn on
+ *     the display (if those elements in fact appear on the display).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information gets redisplayed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static void
+ListboxRedrawRange(listPtr, first, last)
+    register Listbox *listPtr;         /* Information about widget. */
+    int first;                         /* Index of first element in list
+                                        * that needs to be redrawn. */
+    int last;                          /* Index of last element in list
+                                        * that needs to be redrawn.  May
+                                        * be less than first;
+                                        * these just bracket a range. */
+{
+    if ((listPtr->tkwin == NULL) || !Tk_IsMapped(listPtr->tkwin)
+           || (listPtr->flags & REDRAW_PENDING)) {
+       return;
+    }
+    Tk_DoWhenIdle(DisplayListbox, (ClientData) listPtr);
+    listPtr->flags |= REDRAW_PENDING;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ListboxUpdateVScrollbar --
+ *
+ *     This procedure is invoked whenever information has changed in
+ *     a listbox in a way that would invalidate a vertical scrollbar
+ *     display.  If there is an associated scrollbar, then this command
+ *     updates it by invoking a Tcl command.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A Tcl command is invoked, and an additional command may be
+ *     invoked to process errors in the command.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ListboxUpdateVScrollbar(listPtr)
+    register Listbox *listPtr;         /* Information about widget. */
+{
+    char string[60];
+    int result, last;
+
+    if (listPtr->yScrollCmd == NULL) {
+       return;
+    }
+    last = listPtr->topIndex + listPtr->numLines - 1;
+    if (last >= listPtr->numElements) {
+       last = listPtr->numElements-1;
+    }
+    if (last < listPtr->topIndex) {
+       last = listPtr->topIndex;
+    }
+    sprintf(string, " %d %d %d %d", listPtr->numElements, listPtr->numLines,
+           listPtr->topIndex, last);
+    result = Tcl_VarEval(listPtr->interp, listPtr->yScrollCmd, string,
+           (char *) NULL);
+    if (result != TCL_OK) {
+       TkBindError(listPtr->interp);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ListboxUpdateHScrollbar --
+ *
+ *     This procedure is invoked whenever information has changed in
+ *     a listbox in a way that would invalidate a horizontal scrollbar
+ *     display.  If there is an associated horizontal scrollbar, then
+ *     this command updates it by invoking a Tcl command.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A Tcl command is invoked, and an additional command may be
+ *     invoked to process errors in the command.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ListboxUpdateHScrollbar(listPtr)
+    register Listbox *listPtr;         /* Information about widget. */
+{
+    char string[60];
+    int result, totalUnits, windowUnits, first, last;
+
+    if (listPtr->xScrollCmd == NULL) {
+       return;
+    }
+    totalUnits = 1 + (listPtr->maxWidth-1)/listPtr->xScrollUnit;
+    windowUnits = 1 + (Tk_Width(listPtr->tkwin)
+           - 2*(listPtr->borderWidth + listPtr->selBorderWidth)-1)
+           /listPtr->xScrollUnit;
+    first = listPtr->xOffset/listPtr->xScrollUnit;
+    last = first + windowUnits - 1;
+    if (last < first) {
+       last = first;
+    }
+    sprintf(string, " %d %d %d %d", totalUnits, windowUnits, first, last);
+    result = Tcl_VarEval(listPtr->interp, listPtr->xScrollCmd, string,
+           (char *) NULL);
+    if (result != TCL_OK) {
+       TkBindError(listPtr->interp);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ListboxComputeWidths --
+ *
+ *     This procedure is invoked to completely recompute width
+ *     information used for displaying listboxes and for horizontal
+ *     scrolling.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If "fontChanged" is non-zero then the widths of the individual
+ *     elements are all recomputed.  In addition, listPtr->maxWidth is
+ *     recomputed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ListboxComputeWidths(listPtr, fontChanged)
+    Listbox *listPtr;          /* Listbox whose geometry is to be
+                                * recomputed. */
+    int fontChanged;           /* Non-zero means the font may have changed
+                                * so per-element width information also
+                                * has to be computed. */
+{
+    register Element *elPtr;
+    int dummy;
+    XCharStruct bbox;
+
+    listPtr->xScrollUnit = XTextWidth(listPtr->fontPtr, "0", 1);
+    listPtr->maxWidth = 0;
+    for (elPtr = listPtr->elementPtr; elPtr != NULL; elPtr = elPtr->nextPtr) {
+       if (fontChanged) {
+           XTextExtents(listPtr->fontPtr, elPtr->text, elPtr->textLength,
+                   &dummy, &dummy, &dummy, &bbox);
+           elPtr->lBearing = bbox.lbearing;
+           elPtr->pixelWidth = bbox.lbearing + bbox.rbearing;
+       }
+       if (elPtr->pixelWidth > listPtr->maxWidth) {
+           listPtr->maxWidth = elPtr->pixelWidth;
+       }
+    }
+}
diff --git a/src/tk/tkmenu.c b/src/tk/tkmenu.c
new file mode 100644 (file)
index 0000000..cf8eb87
--- /dev/null
@@ -0,0 +1,2074 @@
+/* 
+ * tkMenu.c --
+ *
+ *     This module implements menus for the Tk toolkit.  The menus
+ *     support normal button entries, plus check buttons, radio
+ *     buttons, iconic forms of all of the above, and separator
+ *     entries.
+ *
+ * Copyright 1990-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkMenu.c,v 1.37 92/08/24 09:24:04 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "default.h"
+#include "tkint.h"
+
+/*
+ * One of the following data structures is kept for each entry of each
+ * menu managed by this file:
+ */
+
+typedef struct MenuEntry {
+    int type;                  /* Type of menu entry;  see below for
+                                * valid types. */
+    struct Menu *menuPtr;      /* Menu with which this entry is associated. */
+    char *label;               /* Main text label displayed in entry (NULL
+                                * if no label).  Malloc'ed. */
+    int labelLength;           /* Number of non-NULL characters in label. */
+    int underline;             /* Index of character to underline. */
+    Pixmap bitmap;             /* Bitmap to display in menu entry, or None.
+                                * If not None then label is ignored. */
+    char *accel;               /* Accelerator string displayed at right
+                                * of menu entry.  NULL means no such
+                                * accelerator.  Malloc'ed. */
+    int accelLength;           /* Number of non-NULL characters in
+                                * accelerator. */
+
+    /*
+     * Information related to displaying entry:
+     */
+
+    Tk_Uid state;              /* State of button for display purposes:
+                                * normal, active, or disabled. */
+    int height;                        /* Number of pixels occupied by entry in
+                                * vertical dimension. */
+    int y;                     /* Y-coordinate of topmost pixel in entry. */
+    int selectorDiameter;      /* Size of selector display, in pixels. */
+    Tk_3DBorder border;                /* Structure used to draw background for
+                                * entry.  NULL means use overall border
+                                * for menu. */
+    Tk_3DBorder activeBorder;  /* Used to draw background and border when
+                                * element is active.  NULL means use
+                                * activeBorder from menu. */
+    XFontStruct *fontPtr;      /* Text font for menu entries.  NULL means
+                                * use overall font for menu. */
+    GC textGC;                 /* GC for drawing text in entry.  NULL means
+                                * use overall textGC for menu. */
+    GC activeGC;               /* GC for drawing text in entry when active.
+                                * NULL means use overall activeGC for
+                                * menu. */
+    GC disabledGC;             /* Used to produce disabled effect for entry.
+                                * NULL means use overall disabledGC from
+                                * menu structure.  See comments for
+                                * disabledFg in menu structure for more
+                                * information. */
+
+    /*
+     * Information used to implement this entry's action:
+     */
+
+    char *command;             /* Command to invoke when entry is invoked.
+                                * Malloc'ed. */
+    char *name;                        /* Name of variable (for check buttons and
+                                * radio buttons) or menu (for cascade
+                                * entries).  Malloc'ed.*/
+    char *onValue;             /* Value to store in variable when selected
+                                * (only for radio and check buttons).
+                                * Malloc'ed. */
+    char *offValue;            /* Value to store in variable when not
+                                * selected (only for check buttons).
+                                * Malloc'ed. */
+
+    /*
+     * Miscellaneous information:
+     */
+
+    int flags;                 /* Various flags.  See below for definitions. */
+} MenuEntry;
+
+/*
+ * Flag values defined for menu entries:
+ *
+ * ENTRY_SELECTED:             Non-zero means this is a radio or check
+ *                             button and that it should be drawn in
+ *                             the "selected" state.
+ * ENTRY_NEEDS_REDISPLAY:      Non-zero means the entry should be redisplayed.
+ */
+
+#define ENTRY_SELECTED         1
+#define ENTRY_NEEDS_REDISPLAY  4
+
+/*
+ * Types defined for MenuEntries:
+ */
+
+#define COMMAND_ENTRY          0
+#define SEPARATOR_ENTRY                1
+#define CHECK_BUTTON_ENTRY     2
+#define RADIO_BUTTON_ENTRY     3
+#define CASCADE_ENTRY          4
+
+/*
+ * Mask bits for above types:
+ */
+
+#define COMMAND_MASK           TK_CONFIG_USER_BIT
+#define SEPARATOR_MASK         (TK_CONFIG_USER_BIT << 1)
+#define CHECK_BUTTON_MASK      (TK_CONFIG_USER_BIT << 2)
+#define RADIO_BUTTON_MASK      (TK_CONFIG_USER_BIT << 3)
+#define CASCADE_MASK           (TK_CONFIG_USER_BIT << 4)
+#define ALL_MASK               (COMMAND_MASK | SEPARATOR_MASK \
+       | CHECK_BUTTON_MASK | RADIO_BUTTON_MASK | CASCADE_MASK)
+
+/*
+ * Configuration specs for individual menu entries:
+ */
+
+static Tk_ConfigSpec entryConfigSpecs[] = {
+    {TK_CONFIG_BORDER, "-activebackground", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_ACTIVE_BG, Tk_Offset(MenuEntry, activeBorder),
+       COMMAND_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK|CASCADE_MASK
+       |TK_CONFIG_NULL_OK},
+    {TK_CONFIG_STRING, "-accelerator", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_ACCELERATOR, Tk_Offset(MenuEntry, accel),
+       COMMAND_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK|CASCADE_MASK},
+    {TK_CONFIG_BORDER, "-background", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_BG, Tk_Offset(MenuEntry, border),
+       COMMAND_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK|CASCADE_MASK
+       |TK_CONFIG_NULL_OK},
+#if defined(USE_XPM3)
+    {TK_CONFIG_PIXMAP, "-bitmap", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_BITMAP, Tk_Offset(MenuEntry, bitmap),
+       COMMAND_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK|CASCADE_MASK
+       |TK_CONFIG_NULL_OK},
+#else
+    {TK_CONFIG_BITMAP, "-bitmap", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_BITMAP, Tk_Offset(MenuEntry, bitmap),
+       COMMAND_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK|CASCADE_MASK
+       |TK_CONFIG_NULL_OK},
+#endif
+    {TK_CONFIG_STRING, "-command", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_COMMAND, Tk_Offset(MenuEntry, command),
+       COMMAND_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK|CASCADE_MASK},
+    {TK_CONFIG_FONT, "-font", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_FONT, Tk_Offset(MenuEntry, fontPtr),
+       COMMAND_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK|CASCADE_MASK
+       |TK_CONFIG_NULL_OK},
+    {TK_CONFIG_STRING, "-label", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_LABEL, Tk_Offset(MenuEntry, label),
+       COMMAND_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK|CASCADE_MASK},
+    {TK_CONFIG_STRING, "-menu", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_MENU, Tk_Offset(MenuEntry, name), CASCADE_MASK},
+    {TK_CONFIG_STRING, "-offvalue", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_OFF_VALUE, Tk_Offset(MenuEntry, offValue),
+       CHECK_BUTTON_MASK},
+    {TK_CONFIG_UID, "-state", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_STATE, Tk_Offset(MenuEntry, state),
+       COMMAND_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK|CASCADE_MASK
+       |TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_STRING, "-onvalue", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_ON_VALUE, Tk_Offset(MenuEntry, onValue),
+       CHECK_BUTTON_MASK},
+    {TK_CONFIG_STRING, "-value", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_VALUE, Tk_Offset(MenuEntry, onValue),
+       RADIO_BUTTON_MASK},
+    {TK_CONFIG_STRING, "-variable", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_CHECK_VARIABLE, Tk_Offset(MenuEntry, name),
+       CHECK_BUTTON_MASK},
+    {TK_CONFIG_STRING, "-variable", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_RADIO_VARIABLE, Tk_Offset(MenuEntry, name),
+       RADIO_BUTTON_MASK},
+    {TK_CONFIG_INT, "-underline", (char *) NULL, (char *) NULL,
+       DEF_MENU_ENTRY_UNDERLINE, Tk_Offset(MenuEntry, underline),
+       COMMAND_MASK|CHECK_BUTTON_MASK|RADIO_BUTTON_MASK|CASCADE_MASK
+       |TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * A data structure of the following type is kept for each
+ * menu managed by this file:
+ */
+
+typedef struct Menu {
+    Tk_Window tkwin;           /* Window that embodies the pane.  NULL
+                                * means that the window has been destroyed
+                                * but the data structures haven't yet been
+                                * cleaned up.*/
+    Tcl_Interp *interp;                /* Interpreter associated with menu. */
+    MenuEntry **entries;       /* Array of pointers to all the entries
+                                * in the menu.  NULL means no entries. */
+    int numEntries;            /* Number of elements in entries. */
+    int active;                        /* Index of active entry.  -1 means
+                                * nothing active. */
+    Tk_Uid group;              /* Used to allow event sharing between
+                                * related menus and menu buttons. */
+
+    /*
+     * Information used when displaying widget:
+     */
+
+    Tk_3DBorder border;                /* Structure used to draw 3-D
+                                * border and background for menu. */
+    int borderWidth;           /* Width of border around whole menu. */
+    Tk_3DBorder activeBorder;  /* Used to draw background and border for
+                                * active element (if any). */
+    int activeBorderWidth;     /* Width of border around active element. */
+    XFontStruct *fontPtr;      /* Text font for menu entries. */
+    XColor *fg;                        /* Foreground color for entries. */
+    GC textGC;                 /* GC for drawing text and other features
+                                * of menu entries. */
+    XColor *disabledFg;                /* Foreground color when disabled.  NULL
+                                * means use normalFg with a 50% stipple
+                                * instead. */
+    Pixmap gray;               /* Bitmap for drawing disabled entries in
+                                * a stippled fashion.  None means not
+                                * allocated yet. */
+    GC disabledGC;             /* Used to produce disabled effect.  If
+                                * disabledFg isn't NULL, this GC is used to
+                                * draw text and icons for disabled entries.
+                                * Otherwise text and icons are drawn with
+                                * normalGC and this GC is used to stipple
+                                * background across them. */
+    XColor *activeFg;          /* Foreground color for active entry. */
+    GC activeGC;               /* GC for drawing active entry. */
+    XColor *selectorFg;                /* Color for selectors in radio and check
+                                * button entries. */
+    GC selectorGC;             /* For drawing selectors. */
+    int selectorSpace;         /* Number of pixels to allow for displaying
+                                * selectors in menu entries (includes extra
+                                * space around selector). */
+    int labelWidth;            /* Number of pixels to allow for displaying
+                                * labels in menu entries. */
+
+    /*
+     * Miscellaneous information:
+     */
+
+    Cursor cursor;             /* Current cursor for window, or None. */
+    MenuEntry *postedCascade;  /* Points to menu entry for cascaded
+                                * submenu that is currently posted, or
+                                * NULL if no submenu posted. */
+    int flags;                 /* Various flags;  see below for
+                                * definitions. */
+} Menu;
+
+/*
+ * Flag bits for menus:
+ *
+ * REDRAW_PENDING:             Non-zero means a DoWhenIdle handler
+ *                             has already been queued to redraw
+ *                             this window.
+ * RESIZE_PENDING:             Non-zero means a call to ComputeMenuGeometry
+ *                             has already been scheduled.
+ */
+
+#define REDRAW_PENDING         1
+#define RESIZE_PENDING         2
+
+/*
+ * Configuration specs valid for the menu as a whole:
+ */
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground",
+       DEF_MENU_ACTIVE_BG_COLOR, Tk_Offset(Menu, activeBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground",
+       DEF_MENU_ACTIVE_BG_MONO, Tk_Offset(Menu, activeBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_PIXELS, "-activeborderwidth", "activeBorderWidth", "BorderWidth",
+       DEF_MENU_ACTIVE_BORDER_WIDTH, Tk_Offset(Menu, activeBorderWidth), 0},
+    {TK_CONFIG_COLOR, "-activeforeground", "activeForeground", "Background",
+       DEF_MENU_ACTIVE_FG_COLOR, Tk_Offset(Menu, activeFg),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_COLOR, "-activeforeground", "activeForeground", "Background",
+       DEF_MENU_ACTIVE_FG_MONO, Tk_Offset(Menu, activeFg),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_MENU_BG_COLOR, Tk_Offset(Menu, border), TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_MENU_BG_MONO, Tk_Offset(Menu, border), TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       DEF_MENU_BORDER_WIDTH, Tk_Offset(Menu, borderWidth), 0},
+    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",
+       DEF_MENU_CURSOR, Tk_Offset(Menu, cursor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_COLOR, "-disabledforeground", "disabledForeground",
+       "DisabledForeground", DEF_MENU_DISABLED_FG_COLOR,
+       Tk_Offset(Menu, disabledFg), TK_CONFIG_COLOR_ONLY|TK_CONFIG_NULL_OK},
+    {TK_CONFIG_COLOR, "-disabledforeground", "disabledForeground",
+       "DisabledForeground", DEF_MENU_DISABLED_FG_MONO,
+       Tk_Offset(Menu, disabledFg), TK_CONFIG_MONO_ONLY|TK_CONFIG_NULL_OK},
+    {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_FONT, "-font", "font", "Font",
+       DEF_MENU_FONT, Tk_Offset(Menu, fontPtr), 0},
+    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",
+       DEF_MENU_FG, Tk_Offset(Menu, fg), 0},
+    {TK_CONFIG_COLOR, "-selector", "selector", "Foreground",
+       DEF_MENU_SELECTOR_COLOR, Tk_Offset(Menu, selectorFg),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_COLOR, "-selector", "selector", "Foreground",
+       DEF_MENU_SELECTOR_MONO, Tk_Offset(Menu, selectorFg),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static int             ActivateMenuEntry _ANSI_ARGS_((Menu *menuPtr,
+                           int index));
+static void            ComputeMenuGeometry _ANSI_ARGS_((
+                           ClientData clientData));
+static int             ConfigureMenu _ANSI_ARGS_((Tcl_Interp *interp,
+                           Menu *menuPtr, int argc, char **argv,
+                           int flags));
+static int             ConfigureMenuEntry _ANSI_ARGS_((Tcl_Interp *interp,
+                           Menu *menuPtr, MenuEntry *mePtr, int index,
+                           int argc, char **argv, int flags));
+static void            DestroyMenu _ANSI_ARGS_((ClientData clientData));
+static void            DestroyMenuEntry _ANSI_ARGS_((ClientData clientData));
+static void            DisplayMenu _ANSI_ARGS_((ClientData clientData));
+static void            EventuallyRedrawMenu _ANSI_ARGS_((Menu *menuPtr,
+                           int index));
+static int             GetMenuIndex _ANSI_ARGS_((Tcl_Interp *interp,
+                           Menu *menuPtr, char *string, int *indexPtr));
+static void            MenuEventProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static char *          MenuVarProc _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, char *name1, char *name2,
+                           int flags));
+static int             MenuWidgetCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+static int             PostSubmenu _ANSI_ARGS_((Tcl_Interp *interp,
+                           Menu *menuPtr, MenuEntry *mePtr));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_MenuCmd --
+ *
+ *     This procedure is invoked to process the "menu" Tcl
+ *     command.  See the user documentation for details on
+ *     what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_MenuCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    Tk_Window new;
+    register Menu *menuPtr;
+    XSetWindowAttributes atts;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " pathName ?options?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Create the new window.  Set override-redirect so the window
+     * manager won't add a border or argue about placement, and set
+     * save-under so that the window can pop up and down without a
+     * lot of re-drawing.
+     */
+
+    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], "");
+    if (new == NULL) {
+       return TCL_ERROR;
+    }
+    atts.override_redirect = True;
+    atts.save_under = True;
+    Tk_ChangeWindowAttributes(new, CWOverrideRedirect|CWSaveUnder, &atts);
+
+    /*
+     * Initialize the data structure for the menu.
+     */
+
+    menuPtr = (Menu *) ckalloc(sizeof(Menu));
+    menuPtr->tkwin = new;
+    menuPtr->interp = interp;
+    menuPtr->entries = NULL;
+    menuPtr->numEntries = 0;
+    menuPtr->active = -1;
+    menuPtr->group = NULL; 
+    menuPtr->border = NULL;
+    menuPtr->activeBorder = NULL;
+    menuPtr->fontPtr = NULL;
+    menuPtr->fg = NULL;
+    menuPtr->textGC = None;
+    menuPtr->disabledFg = NULL;
+    menuPtr->gray = None;
+    menuPtr->disabledGC = None;
+    menuPtr->activeFg = NULL;
+    menuPtr->activeGC = None;
+    menuPtr->selectorFg = NULL;
+    menuPtr->selectorGC = None;
+    menuPtr->cursor = None;
+    menuPtr->postedCascade = NULL;
+    menuPtr->flags = 0;
+
+    Tk_SetClass(new, "Menu");
+    Tk_CreateEventHandler(menuPtr->tkwin, ExposureMask|StructureNotifyMask,
+           MenuEventProc, (ClientData) menuPtr);
+    Tcl_CreateCommand(interp, Tk_PathName(menuPtr->tkwin), MenuWidgetCmd,
+           (ClientData) menuPtr, (void (*)()) NULL);
+    if (ConfigureMenu(interp, menuPtr, argc-2, argv+2, 0) != TCL_OK) {
+       goto error;
+    }
+
+    interp->result = Tk_PathName(menuPtr->tkwin);
+    return TCL_OK;
+
+    error:
+    Tk_DestroyWindow(menuPtr->tkwin);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * MenuWidgetCmd --
+ *
+ *     This procedure is invoked to process the Tcl command
+ *     that corresponds to a widget managed by this module.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+MenuWidgetCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Information about menu widget. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    register Menu *menuPtr = (Menu *) clientData;
+    register MenuEntry *mePtr;
+    int result = TCL_OK;
+    int length, type;
+    char c;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    Tk_Preserve((ClientData) menuPtr);
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'a') && (strncmp(argv[1], "activate", length) == 0)
+           && (length >= 2)) {
+       int index;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " activate index\"", (char *) NULL);
+           goto error;
+       }
+       if (GetMenuIndex(interp, menuPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if (menuPtr->active == index) {
+           goto done;
+       }
+       if (index >= 0) {
+           if ((menuPtr->entries[index]->type == SEPARATOR_ENTRY)
+                   || (menuPtr->entries[index]->state == tkDisabledUid)) {
+               index = -1;
+           }
+       }
+       result = ActivateMenuEntry(menuPtr, index);
+    } else if ((c == 'a') && (strncmp(argv[1], "add", length) == 0)
+           && (length >= 2)) {
+       MenuEntry **newEntries;
+
+       if (argc < 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " add type ?options?\"", (char *) NULL);
+           goto error;
+       }
+
+       /*
+        * Figure out the type of the new entry.
+        */
+
+       c = argv[2][0];
+       length = strlen(argv[2]);
+       if ((c == 'c') && (strncmp(argv[2], "cascade", length) == 0)
+               && (length >= 2)) {
+           type = CASCADE_ENTRY;
+       } else if ((c == 'c') && (strncmp(argv[2], "checkbutton", length) == 0)
+               && (length >= 2)) {
+           type = CHECK_BUTTON_ENTRY;
+       } else if ((c == 'c') && (strncmp(argv[2], "command", length) == 0)
+               && (length >= 2)) {
+           type = COMMAND_ENTRY;
+       } else if ((c == 'r')
+               && (strncmp(argv[2], "radiobutton", length) == 0)) {
+           type = RADIO_BUTTON_ENTRY;
+       } else if ((c == 's')
+               && (strncmp(argv[2], "separator", length) == 0)) {
+           type = SEPARATOR_ENTRY;
+       } else {
+           Tcl_AppendResult(interp, "bad menu entry type \"",
+                   argv[2], "\":  must be cascade, checkbutton, ",
+                   "command, radiobutton, or separator", (char *) NULL);
+           goto error;
+       }
+
+       /*
+        * Add a new entry to the end of the menu's array of entries,
+        * and process options for it.
+        */
+
+       mePtr = (MenuEntry *) ckalloc(sizeof(MenuEntry));
+       newEntries = (MenuEntry **) ckalloc((unsigned)
+               ((menuPtr->numEntries+1)*sizeof(MenuEntry *)));
+       if (menuPtr->numEntries != 0) {
+           memcpy((VOID *) newEntries, (VOID *) menuPtr->entries,
+                   menuPtr->numEntries*sizeof(MenuEntry *));
+           ckfree((char *) menuPtr->entries);
+       }
+       menuPtr->entries = newEntries;
+       menuPtr->entries[menuPtr->numEntries] = mePtr;
+       menuPtr->numEntries++;
+       mePtr->type = type;
+       mePtr->menuPtr = menuPtr;
+       mePtr->label = NULL;
+       mePtr->underline = -1;
+       mePtr->bitmap = None;
+       mePtr->accel = NULL;
+       mePtr->state = tkNormalUid;
+       mePtr->border = NULL;
+       mePtr->activeBorder = NULL;
+       mePtr->fontPtr = NULL;
+       mePtr->textGC = None;
+       mePtr->activeGC = None;
+       mePtr->disabledGC = None;
+       mePtr->command = NULL;
+       mePtr->name = NULL;
+       mePtr->onValue = NULL;
+       mePtr->offValue = NULL;
+       mePtr->flags = 0;
+       if (ConfigureMenuEntry(interp, menuPtr, mePtr, menuPtr->numEntries-1,
+               argc-3, argv+3, 0) != TCL_OK) {
+           DestroyMenuEntry((ClientData) mePtr);
+           menuPtr->numEntries--;
+           goto error;
+       }
+    } else if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)) {
+       if (argc == 2) {
+           result = Tk_ConfigureInfo(interp, menuPtr->tkwin, configSpecs,
+                   (char *) menuPtr, (char *) NULL, 0);
+       } else if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, menuPtr->tkwin, configSpecs,
+                   (char *) menuPtr, argv[2], 0);
+       } else {
+           result = ConfigureMenu(interp, menuPtr, argc-2, argv+2,
+                   TK_CONFIG_ARGV_ONLY);
+       }
+    } else if ((c == 'd') && (strncmp(argv[1], "delete", length) == 0)
+           && (length >= 2)) {
+       int index, i;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " delete index\"", (char *) NULL);
+           goto error;
+       }
+       if (GetMenuIndex(interp, menuPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if (index < 0) {
+           goto done;
+       }
+       Tk_EventuallyFree((ClientData) menuPtr->entries[index],
+               DestroyMenuEntry);
+       for (i = index; i < menuPtr->numEntries-1; i++) {
+           menuPtr->entries[i] = menuPtr->entries[i+1];
+       }
+       menuPtr->numEntries -= 1;
+       if (menuPtr->active == index) {
+           menuPtr->active = -1;
+       } else if (menuPtr->active > index) {
+           menuPtr->active -= 1;
+       }
+       if (!(menuPtr->flags & RESIZE_PENDING)) {
+           menuPtr->flags |= RESIZE_PENDING;
+           Tk_DoWhenIdle(ComputeMenuGeometry, (ClientData) menuPtr);
+       }
+    } else if ((c == 'd') && (strncmp(argv[1], "disable", length) == 0)
+           && (length >= 2)) {
+       int index;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " disable index\"", (char *) NULL);
+           goto error;
+       }
+       if (GetMenuIndex(interp, menuPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if (index < 0) {
+           goto done;
+       }
+       menuPtr->entries[index]->state = tkDisabledUid;
+       if (menuPtr->active == index) {
+           menuPtr->active = -1;
+       }
+       EventuallyRedrawMenu(menuPtr, index);
+    } else if ((c == 'e') && (length >= 3)
+           && (strncmp(argv[1], "enable", length) == 0)) {
+       int index;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " enable index\"", (char *) NULL);
+           goto error;
+       }
+       if (GetMenuIndex(interp, menuPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if (index < 0) {
+           goto done;
+       }
+       menuPtr->entries[index]->state = tkNormalUid;
+       EventuallyRedrawMenu(menuPtr, index);
+    } else if ((c == 'e') && (length >= 3)
+           && (strncmp(argv[1], "entryconfigure", length) == 0)) {
+       int index;
+
+       if (argc < 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " entryconfigure index ?option value ...?\"",
+                   (char *) NULL);
+           goto error;
+       }
+       if (GetMenuIndex(interp, menuPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if (index < 0) {
+           goto done;
+       }
+       mePtr = menuPtr->entries[index];
+       Tk_Preserve((ClientData) mePtr);
+       if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, menuPtr->tkwin, entryConfigSpecs,
+                   (char *) mePtr, (char *) NULL,
+                   COMMAND_MASK << mePtr->type);
+       } else if (argc == 4) {
+           result = Tk_ConfigureInfo(interp, menuPtr->tkwin, entryConfigSpecs,
+                   (char *) mePtr, argv[3], COMMAND_MASK << mePtr->type);
+       } else {
+           result = ConfigureMenuEntry(interp, menuPtr, mePtr, index, argc-3,
+                   argv+3, TK_CONFIG_ARGV_ONLY | COMMAND_MASK << mePtr->type);
+       }
+       Tk_Release((ClientData) mePtr);
+    } else if ((c == 'i') && (strncmp(argv[1], "index", length) == 0)
+           && (length >= 3)) {
+       int index;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " index string\"", (char *) NULL);
+           goto error;
+       }
+       if (GetMenuIndex(interp, menuPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if (index < 0) {
+           interp->result = "none";
+       } else {
+           sprintf(interp->result, "%d", index);
+       }
+    } else if ((c == 'i') && (strncmp(argv[1], "invoke", length) == 0)
+           && (length >= 3)) {
+       int index;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " invoke index\"", (char *) NULL);
+           goto error;
+       }
+       if (GetMenuIndex(interp, menuPtr, argv[2], &index) != TCL_OK) {
+           goto error;
+       }
+       if (index < 0) {
+           goto done;
+       }
+       mePtr = menuPtr->entries[index];
+       if (mePtr->state == tkDisabledUid) {
+           goto done;
+       }
+       Tk_Preserve((ClientData) mePtr);
+       if (mePtr->type == CHECK_BUTTON_ENTRY) {
+           if (mePtr->flags & ENTRY_SELECTED) {
+               Tcl_SetVar(interp, mePtr->name, mePtr->offValue,
+                       TCL_GLOBAL_ONLY);
+           } else {
+               Tcl_SetVar(interp, mePtr->name, mePtr->onValue,
+                       TCL_GLOBAL_ONLY);
+           }
+       } else if (mePtr->type == RADIO_BUTTON_ENTRY) {
+           Tcl_SetVar(interp, mePtr->name, mePtr->onValue, TCL_GLOBAL_ONLY);
+       }
+       if (mePtr->command != NULL) {
+           result = Tcl_GlobalEval(interp, mePtr->command);
+       }
+       Tk_Release((ClientData) mePtr);
+    } else if ((c == 'p') && (strncmp(argv[1], "post", length) == 0)) {
+       int x, y, tmp;
+       Tk_Uid group;
+
+       if ((argc != 4) && (argc != 5)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " post x y ?group?\"", (char *) NULL);
+           goto error;
+       }
+       if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK)
+               || (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {
+           goto error;
+       }
+       if (argc == 5) {
+           group = Tk_GetUid(argv[4]);
+       } else {
+           group = Tk_GetUid("default");
+       }
+
+       /*
+        * Adjust the position of the menu if necessary to keep it
+        * on-screen.
+        */
+
+       tmp = WidthOfScreen(Tk_Screen(menuPtr->tkwin))
+               - Tk_Width(menuPtr->tkwin);
+       if (x > tmp) {
+           x = tmp;
+       }
+       if (x < 0) {
+           x = 0;
+       }
+       tmp = HeightOfScreen(Tk_Screen(menuPtr->tkwin))
+               - Tk_Height(menuPtr->tkwin);
+       if (y > tmp) {
+           y = tmp;
+       }
+       if (y < 0) {
+           y = 0;
+       }
+       if ((x != Tk_X(menuPtr->tkwin)) || (y != Tk_Y(menuPtr->tkwin))) {
+           Tk_MoveWindow(menuPtr->tkwin, x, y);
+       }
+       if (Tk_IsMapped(menuPtr->tkwin)) {
+           if (group != menuPtr->group) {
+               Tk_UnshareEvents(menuPtr->tkwin, menuPtr->group);
+               Tk_ShareEvents(menuPtr->tkwin, group);
+           }
+       } else {
+           Tk_ShareEvents(menuPtr->tkwin, group);
+           Tk_MapWindow(menuPtr->tkwin);
+           result = ActivateMenuEntry(menuPtr, -1);
+       }
+       XRaiseWindow(Tk_Display(menuPtr->tkwin), Tk_WindowId(menuPtr->tkwin));
+       menuPtr->group = group;
+    } else if ((c == 'u') && (strncmp(argv[1], "unpost", length) == 0)) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " unpost\"", (char *) NULL);
+           goto error;
+       }
+       Tk_UnshareEvents(menuPtr->tkwin, menuPtr->group);
+       Tk_UnmapWindow(menuPtr->tkwin);
+       result = ActivateMenuEntry(menuPtr, -1);
+       if (result == TCL_OK) {
+           result = PostSubmenu(interp, menuPtr, (MenuEntry *) NULL);
+       }
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\": must be activate, add, configure, delete, disable, ",
+               "enable, entryconfigure, index, invoke, post, ",
+               "or unpost", (char *) NULL);
+       goto error;
+    }
+    done:
+    Tk_Release((ClientData) menuPtr);
+    return result;
+
+    error:
+    Tk_Release((ClientData) menuPtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyMenu --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a menu at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the menu is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyMenu(clientData)
+    ClientData clientData;     /* Info about menu widget. */
+{
+    register Menu *menuPtr = (Menu *) clientData;
+    int i;
+
+    for (i = 0; i < menuPtr->numEntries; i++) {
+       DestroyMenuEntry((ClientData) menuPtr->entries[i]);
+    }
+    if (menuPtr->entries != NULL) {
+       ckfree((char *) menuPtr->entries);
+    }
+    if (menuPtr->border != NULL) {
+       Tk_Free3DBorder(menuPtr->border);
+    }
+    if (menuPtr->activeBorder != NULL) {
+       Tk_Free3DBorder(menuPtr->activeBorder);
+    }
+    if (menuPtr->fontPtr != NULL) {
+       Tk_FreeFontStruct(menuPtr->fontPtr);
+    }
+    if (menuPtr->fg != NULL) {
+       Tk_FreeColor(menuPtr->fg);
+    }
+    if (menuPtr->textGC != None) {
+       Tk_FreeGC(menuPtr->textGC);
+    }
+    if (menuPtr->disabledFg != NULL) {
+       Tk_FreeColor(menuPtr->disabledFg);
+    }
+    if (menuPtr->gray != None) {
+       Tk_FreeBitmap(menuPtr->gray);
+    }
+    if (menuPtr->disabledGC != None) {
+       Tk_FreeGC(menuPtr->disabledGC);
+    }
+    if (menuPtr->activeFg != NULL) {
+       Tk_FreeColor(menuPtr->activeFg);
+    }
+    if (menuPtr->activeGC != None) {
+       Tk_FreeGC(menuPtr->activeGC);
+    }
+    if (menuPtr->selectorFg != NULL) {
+       Tk_FreeColor(menuPtr->selectorFg);
+    }
+    if (menuPtr->selectorGC != None) {
+       Tk_FreeGC(menuPtr->selectorGC);
+    }
+    if (menuPtr->cursor != None) {
+       Tk_FreeCursor(menuPtr->cursor);
+    }
+    ckfree((char *) menuPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyMenuEntry --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a menu entry at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the menu entry is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyMenuEntry(clientData)
+    ClientData clientData;             /* Pointer to entry to be freed. */
+{
+    register MenuEntry *mePtr = (MenuEntry *) clientData;
+    Menu *menuPtr = mePtr->menuPtr;
+
+    if (mePtr->name != NULL) {
+       Tcl_UntraceVar(menuPtr->interp, mePtr->name,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               MenuVarProc, (ClientData) mePtr);
+    }
+    if (menuPtr->postedCascade == mePtr) {
+       if (PostSubmenu(menuPtr->interp, menuPtr, (MenuEntry *) NULL)
+               != TCL_OK) {
+           TkBindError(menuPtr->interp);
+       }
+    }
+    if (mePtr->label != NULL) {
+       ckfree(mePtr->label);
+    }
+    if (mePtr->bitmap != None) {
+#if defined(USE_XPM3)
+       Tk_FreePixmap(mePtr->bitmap);
+#else
+       Tk_FreeBitmap(mePtr->bitmap);
+#endif
+    }
+    if (mePtr->accel != NULL) {
+       ckfree(mePtr->accel);
+    }
+    if (mePtr->border != NULL) {
+       Tk_Free3DBorder(mePtr->border);
+    }
+    if (mePtr->activeBorder != NULL) {
+       Tk_Free3DBorder(mePtr->activeBorder);
+    }
+    if (mePtr->fontPtr != NULL) {
+       Tk_FreeFontStruct(mePtr->fontPtr);
+    }
+    if (mePtr->textGC != NULL) {
+       Tk_FreeGC(mePtr->textGC);
+    }
+    if (mePtr->activeGC != NULL) {
+       Tk_FreeGC(mePtr->activeGC);
+    }
+    if (mePtr->disabledGC != NULL) {
+       Tk_FreeGC(mePtr->disabledGC);
+    }
+    if (mePtr->command != NULL) {
+       ckfree(mePtr->command);
+    }
+    if (mePtr->name != NULL) {
+       ckfree(mePtr->name);
+    }
+    if (mePtr->onValue != NULL) {
+       ckfree(mePtr->onValue);
+    }
+    if (mePtr->offValue != NULL) {
+       ckfree(mePtr->offValue);
+    }
+    ckfree((char *) mePtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureMenu --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or
+ *     reconfigure) a menu widget.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information, such as colors, font, etc. get set
+ *     for menuPtr;  old resources get freed, if there were any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureMenu(interp, menuPtr, argc, argv, flags)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    register Menu *menuPtr;    /* Information about widget;  may or may
+                                * not already have values for some fields. */
+    int argc;                  /* Number of valid entries in argv. */
+    char **argv;               /* Arguments. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    XGCValues gcValues;
+    GC newGC;
+    unsigned long mask;
+    int i;
+
+    if (Tk_ConfigureWidget(interp, menuPtr->tkwin, configSpecs,
+           argc, argv, (char *) menuPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few options need special processing, such as setting the
+     * background from a 3-D border, or filling in complicated
+     * defaults that couldn't be specified to Tk_ConfigureWidget.
+     */
+
+    Tk_SetBackgroundFromBorder(menuPtr->tkwin, menuPtr->border);
+
+    gcValues.font = menuPtr->fontPtr->fid;
+    gcValues.foreground = menuPtr->fg->pixel;
+    gcValues.background = Tk_3DBorderColor(menuPtr->border)->pixel;
+    newGC = Tk_GetGC(menuPtr->tkwin, GCForeground|GCBackground|GCFont,
+           &gcValues);
+    if (menuPtr->textGC != None) {
+       Tk_FreeGC(menuPtr->textGC);
+    }
+    menuPtr->textGC = newGC;
+
+    if (menuPtr->disabledFg != NULL) {
+       gcValues.foreground = menuPtr->disabledFg->pixel;
+       mask = GCForeground|GCBackground|GCFont;
+    } else {
+       gcValues.foreground = gcValues.background;
+       if (menuPtr->gray == None) {
+           menuPtr->gray = Tk_GetBitmap(interp, menuPtr->tkwin,
+                   Tk_GetUid("gray50"));
+           if (menuPtr->gray == None) {
+               return TCL_ERROR;
+           }
+       }
+       gcValues.fill_style = FillStippled;
+       gcValues.stipple = menuPtr->gray;
+       mask = GCForeground|GCFillStyle|GCStipple;
+    }
+    newGC = Tk_GetGC(menuPtr->tkwin, mask, &gcValues);
+    if (menuPtr->disabledGC != None) {
+       Tk_FreeGC(menuPtr->disabledGC);
+    }
+    menuPtr->disabledGC = newGC;
+
+    gcValues.font = menuPtr->fontPtr->fid;
+    gcValues.foreground = menuPtr->activeFg->pixel;
+    gcValues.background = Tk_3DBorderColor(menuPtr->activeBorder)->pixel;
+    newGC = Tk_GetGC(menuPtr->tkwin, GCForeground|GCBackground|GCFont,
+           &gcValues);
+    if (menuPtr->activeGC != None) {
+       Tk_FreeGC(menuPtr->activeGC);
+    }
+    menuPtr->activeGC = newGC;
+
+    gcValues.foreground = menuPtr->selectorFg->pixel;
+    newGC = Tk_GetGC(menuPtr->tkwin, GCForeground|GCFont, &gcValues);
+    if (menuPtr->selectorGC != None) {
+       Tk_FreeGC(menuPtr->selectorGC);
+    }
+    menuPtr->selectorGC = newGC;
+
+    /*
+     * After reconfiguring a menu, we need to reconfigure all of the
+     * entries in the menu, since some of the things in the children
+     * (such as graphics contexts) may have to change to reflect changes
+     * in the parent.
+     */
+
+    for (i = 0; i < menuPtr->numEntries; i++) {
+       MenuEntry *mePtr;
+
+       mePtr = menuPtr->entries[i];
+       ConfigureMenuEntry(interp, menuPtr, mePtr, i, 0, (char **) NULL,
+               TK_CONFIG_ARGV_ONLY | COMMAND_MASK << mePtr->type);
+    }
+
+    if (!(menuPtr->flags & RESIZE_PENDING)) {
+       menuPtr->flags |= RESIZE_PENDING;
+       Tk_DoWhenIdle(ComputeMenuGeometry, (ClientData) menuPtr);
+    }
+
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureMenuEntry --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or
+ *     reconfigure) one entry in a menu.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information such as label and accelerator get
+ *     set for mePtr;  old resources get freed, if there were any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureMenuEntry(interp, menuPtr, mePtr, index, argc, argv, flags)
+    Tcl_Interp *interp;                        /* Used for error reporting. */
+    Menu *menuPtr;                     /* Information about whole menu. */
+    register MenuEntry *mePtr;         /* Information about menu entry;  may
+                                        * or may not already have values for
+                                        * some fields. */
+    int index;                         /* Index of mePtr within menuPtr's
+                                        * entries. */
+    int argc;                          /* Number of valid entries in argv. */
+    char **argv;                       /* Arguments. */
+    int flags;                         /* Additional flags to pass to
+                                        * Tk_ConfigureWidget. */
+{
+    XGCValues gcValues;
+    GC newGC, newActiveGC, newDisabledGC;
+    unsigned long mask;
+
+    /*
+     * If this entry is a cascade and the cascade is posted, then unpost
+     * it before reconfiguring the entry (otherwise the reconfigure might
+     * change the name of the cascaded entry, leaving a posted menu
+     * high and dry).
+     */
+
+    if (menuPtr->postedCascade == mePtr) {
+       if (PostSubmenu(menuPtr->interp, menuPtr, (MenuEntry *) NULL)
+               != TCL_OK) {
+           TkBindError(menuPtr->interp);
+       }
+    }
+
+    /*
+     * If this entry is a check button or radio button, then remove
+     * its old trace procedure.
+     */
+
+    if ((mePtr->name != NULL) &&
+           ((mePtr->type == CHECK_BUTTON_ENTRY)
+           || (mePtr->type == RADIO_BUTTON_ENTRY))) {
+       Tcl_UntraceVar(menuPtr->interp, mePtr->name,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               MenuVarProc, (ClientData) mePtr);
+    }
+
+    if (Tk_ConfigureWidget(interp, menuPtr->tkwin, entryConfigSpecs,
+           argc, argv, (char *) mePtr,
+           flags | (COMMAND_MASK << mePtr->type)) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * The code below handles special configuration stuff not taken
+     * care of by Tk_ConfigureWidget, such as special processing for
+     * defaults, sizing strings, graphics contexts, etc.
+     */
+
+    if (mePtr->label == NULL) {
+       mePtr->labelLength = 0;
+    } else {
+       mePtr->labelLength = strlen(mePtr->label);
+    }
+    if (mePtr->accel == NULL) {
+       mePtr->accelLength = 0;
+    } else {
+       mePtr->accelLength = strlen(mePtr->accel);
+    }
+
+    if (mePtr->state == tkActiveUid) {
+       if (index != menuPtr->active) {
+           ActivateMenuEntry(menuPtr, index);
+       }
+    } else {
+       if (index == menuPtr->active) {
+           ActivateMenuEntry(menuPtr, -1);
+       }
+       if ((mePtr->state != tkNormalUid) && (mePtr->state != tkDisabledUid)) {
+           Tcl_AppendResult(interp, "bad state value \"", mePtr->state,
+                   "\":  must be normal, active, or disabled", (char *) NULL);
+           mePtr->state = tkNormalUid;
+           return TCL_ERROR;
+       }
+    }
+
+    if (mePtr->fontPtr != NULL) {
+       gcValues.foreground = menuPtr->fg->pixel;
+       gcValues.background = Tk_3DBorderColor(
+               (mePtr->border != NULL) ? mePtr->border : menuPtr->border)
+               ->pixel;
+       gcValues.font = mePtr->fontPtr->fid;
+
+       /*
+        * Note: disable GraphicsExpose events;  we know there won't be
+        * obscured areas when copying from an off-screen pixmap to the
+        * screen and this gets rid of unnecessary events.
+        */
+
+       gcValues.graphics_exposures = False;
+       newGC = Tk_GetGC(menuPtr->tkwin,
+               GCForeground|GCBackground|GCFont|GCGraphicsExposures,
+               &gcValues);
+
+       if (menuPtr->disabledFg != NULL) {
+           gcValues.foreground = menuPtr->disabledFg->pixel;
+           mask = GCForeground|GCBackground|GCFont|GCGraphicsExposures;
+       } else {
+           gcValues.foreground = gcValues.background;
+           gcValues.fill_style = FillStippled;
+           gcValues.stipple = menuPtr->gray;
+           mask = GCForeground|GCFillStyle|GCStipple;
+       }
+       newDisabledGC = Tk_GetGC(menuPtr->tkwin, mask, &gcValues);
+
+       gcValues.foreground = menuPtr->activeFg->pixel;
+       gcValues.background = Tk_3DBorderColor(
+               (mePtr->activeBorder != NULL) ? mePtr->activeBorder
+               : menuPtr->activeBorder)->pixel;
+       newActiveGC = Tk_GetGC(menuPtr->tkwin,
+               GCForeground|GCBackground|GCFont|GCGraphicsExposures,
+               &gcValues);
+    } else {
+       newGC = NULL;
+       newActiveGC = NULL;
+       newDisabledGC = NULL;
+    }
+    if (mePtr->textGC != NULL) {
+           Tk_FreeGC(mePtr->textGC);
+    }
+    mePtr->textGC = newGC;
+    if (mePtr->activeGC != NULL) {
+           Tk_FreeGC(mePtr->activeGC);
+    }
+    mePtr->activeGC = newActiveGC;
+    if (mePtr->disabledGC != NULL) {
+           Tk_FreeGC(mePtr->disabledGC);
+    }
+    mePtr->disabledGC = newDisabledGC;
+
+    if ((mePtr->type == CHECK_BUTTON_ENTRY)
+           || (mePtr->type == RADIO_BUTTON_ENTRY)) {
+       char *value;
+
+       if (mePtr->name == NULL) {
+           mePtr->name = ckalloc((unsigned) (strlen(mePtr->label) + 1));
+           strcpy(mePtr->name, mePtr->label);
+       }
+       if (mePtr->onValue == NULL) {
+           mePtr->onValue = ckalloc((unsigned) (strlen(mePtr->label) + 1));
+           strcpy(mePtr->onValue, mePtr->label);
+       }
+
+       /*
+        * Select the entry if the associated variable has the
+        * appropriate value, initialize the variable if it doesn't
+        * exist, then set a trace on the variable to monitor future
+        * changes to its value.
+        */
+
+       value = Tcl_GetVar(interp, mePtr->name, TCL_GLOBAL_ONLY);
+       mePtr->flags &= ENTRY_SELECTED;
+       if (value != NULL) {
+           if (strcmp(value, mePtr->onValue) == 0) {
+               mePtr->flags |= ENTRY_SELECTED;
+           }
+       } else {
+           Tcl_SetVar(interp, mePtr->name,
+                   (mePtr->type == CHECK_BUTTON_ENTRY) ? mePtr->offValue : "",
+                   TCL_GLOBAL_ONLY);
+       }
+       Tcl_TraceVar(interp, mePtr->name,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               MenuVarProc, (ClientData) mePtr);
+    }
+
+    if (!(menuPtr->flags & RESIZE_PENDING)) {
+       menuPtr->flags |= RESIZE_PENDING;
+       Tk_DoWhenIdle(ComputeMenuGeometry, (ClientData) menuPtr);
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ComputeMenuGeometry --
+ *
+ *     This procedure is invoked to recompute the size and
+ *     layout of a menu.  It is called as a when-idle handler so
+ *     that it only gets done once, even if a group of changes is
+ *     made to the menu.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Fields of menu entries are changed to reflect their
+ *     current positions, and the size of the menu window
+ *     itself may be changed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ComputeMenuGeometry(clientData)
+    ClientData clientData;             /* Structure describing menu. */
+{
+    Menu *menuPtr = (Menu *) clientData;
+    register MenuEntry *mePtr;
+    XFontStruct *fontPtr;
+    int maxLabelWidth, maxSelectorWidth, maxAccelWidth;
+    int width, height, selectorSpace, horizMargin;
+    int i, y;
+
+    if (menuPtr->tkwin == NULL) {
+       return;
+    }
+
+    maxLabelWidth = maxSelectorWidth = maxAccelWidth = 0;
+    y = menuPtr->borderWidth;
+
+    for (i = 0; i < menuPtr->numEntries; i++) {
+       mePtr = menuPtr->entries[i];
+       selectorSpace = 0;
+       fontPtr = mePtr->fontPtr;
+       if (fontPtr == NULL) {
+           fontPtr = menuPtr->fontPtr;
+       }
+
+       /*
+        * For each entry, compute the height required by that
+        * particular entry, plus three widths:  the width of the
+        * label, the width to allow for a selector to be displayed
+        * to the left of the label (if any), and the width of the
+        * accelerator to be displayed to the right of the label
+        * (if any).  These sizes depend, of course, on the type
+        * of the entry.
+        */
+
+       if (mePtr->bitmap != None) {
+           unsigned int bitmapWidth, bitmapHeight;
+
+#if defined(USE_XPM3)
+           Tk_SizeOfPixmap(mePtr->bitmap, &bitmapWidth, &bitmapHeight);
+#else
+           Tk_SizeOfBitmap(mePtr->bitmap, &bitmapWidth, &bitmapHeight);
+#endif
+           mePtr->height = bitmapHeight;
+           width = bitmapWidth;
+           if (mePtr->type == CHECK_BUTTON_ENTRY) {
+               selectorSpace = (14*mePtr->height)/10;
+               mePtr->selectorDiameter = (65*mePtr->height)/100;
+           } else if (mePtr->type == RADIO_BUTTON_ENTRY) {
+               selectorSpace = (14*mePtr->height)/10;
+               mePtr->selectorDiameter = (75*mePtr->height)/100;
+           }
+       } else {
+           mePtr->height = fontPtr->ascent + fontPtr->descent;
+           if (mePtr->label != NULL) {
+               (void) TkMeasureChars(fontPtr, mePtr->label,
+                       mePtr->labelLength, 0, (int) 100000,
+                       TK_NEWLINES_NOT_SPECIAL, &width);
+           } else {
+               width = 0;
+           }
+           if (mePtr->type == CHECK_BUTTON_ENTRY) {
+               selectorSpace = mePtr->height;
+               mePtr->selectorDiameter = (80*mePtr->height)/100;
+           } else if (mePtr->type == RADIO_BUTTON_ENTRY) {
+               selectorSpace = mePtr->height;
+               mePtr->selectorDiameter = mePtr->height;
+           }
+       }
+       mePtr->height += 2*menuPtr->activeBorderWidth + 2;
+       if (width > maxLabelWidth) {
+           maxLabelWidth = width;
+       }
+       if (mePtr->accel != NULL) {
+           (void) TkMeasureChars(fontPtr, mePtr->accel, mePtr->accelLength,
+                   0, (int) 100000, TK_NEWLINES_NOT_SPECIAL, &width);
+           if (width > maxAccelWidth) {
+               maxAccelWidth = width;
+           }
+       }
+       if (mePtr->type == SEPARATOR_ENTRY) {
+           mePtr->height = 4*menuPtr->borderWidth;
+       }
+       if (selectorSpace > maxSelectorWidth) {
+           maxSelectorWidth = selectorSpace;
+       }
+       mePtr->y = y;
+       y += mePtr->height;
+    }
+
+    /*
+     * Got all the sizes.  Update fields in the menu structure, then
+     * resize the window if necessary.  Leave margins on either side
+     * of the selector (or just one margin if there is no selector).
+     * Leave another margin on the right side of the label, plus yet
+     * another margin to the right of the accelerator (if there is one).
+     */
+
+    horizMargin = 2;
+    menuPtr->selectorSpace = maxSelectorWidth + horizMargin;
+    if (maxSelectorWidth != 0) {
+       menuPtr->selectorSpace += horizMargin;
+    }
+    menuPtr->labelWidth = maxLabelWidth + horizMargin;
+    width = menuPtr->selectorSpace + menuPtr->labelWidth + maxAccelWidth
+           + 2*menuPtr->borderWidth + 2*menuPtr->activeBorderWidth + 2;
+    if (maxAccelWidth != 0) {
+       width += horizMargin;
+    }
+    height = y + menuPtr->borderWidth;
+
+    /*
+     * The X server doesn't like zero dimensions, so round up to at least
+     * 1 (a zero-sized menu should never really occur, anyway).
+     */
+
+    if (width <= 0) {
+       width = 1;
+    }
+    if (height <= 0) {
+       height = 1;
+    }
+    if ((width != Tk_ReqWidth(menuPtr->tkwin)) ||
+           (height != Tk_ReqHeight(menuPtr->tkwin))) {
+       Tk_GeometryRequest(menuPtr->tkwin, width, height);
+    } else {
+       /*
+        * Must always force a redisplay here if the window is mapped
+        * (even if the size didn't change, something else might have
+        * changed in the menu, such as a label or accelerator).  The
+        * resize will force a redisplay above.
+        */
+
+       EventuallyRedrawMenu(menuPtr, -1);
+    }
+
+    menuPtr->flags &= ~RESIZE_PENDING;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DisplayMenu --
+ *
+ *     This procedure is invoked to display a menu widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Commands are output to X to display the menu in its
+ *     current mode.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DisplayMenu(clientData)
+    ClientData clientData;     /* Information about widget. */
+{
+    register Menu *menuPtr = (Menu *) clientData;
+    register MenuEntry *mePtr;
+    register Tk_Window tkwin = menuPtr->tkwin;
+    XFontStruct *fontPtr;
+    int index, baseline;
+    GC gc;
+
+    menuPtr->flags &= ~REDRAW_PENDING;
+    if ((menuPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
+       return;
+    }
+
+    /*
+     * Loop through all of the entries, drawing them one at a time.
+     */
+
+    for (index = 0; index < menuPtr->numEntries; index++) {
+       mePtr = menuPtr->entries[index];
+       if (!(mePtr->flags & ENTRY_NEEDS_REDISPLAY)) {
+           continue;
+       }
+       mePtr->flags &= ~ENTRY_NEEDS_REDISPLAY;
+
+       /*
+        * Background.
+        */
+
+       if (mePtr->state == tkActiveUid) {
+           Tk_Fill3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                   (mePtr->activeBorder != NULL) ? mePtr->activeBorder
+                   : menuPtr->activeBorder, menuPtr->borderWidth, mePtr->y,
+                   Tk_Width(tkwin) - 2*menuPtr->borderWidth, mePtr->height,
+                   menuPtr->activeBorderWidth, TK_RELIEF_RAISED);
+           gc = mePtr->activeGC;
+           if (gc == NULL) {
+               gc = menuPtr->activeGC;
+           }
+       } else {
+           Tk_Fill3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                   (mePtr->border != NULL) ? mePtr->border
+                   : menuPtr->border, menuPtr->borderWidth, mePtr->y,
+                   Tk_Width(tkwin) - 2*menuPtr->borderWidth, mePtr->height,
+                   0, TK_RELIEF_FLAT);
+           if ((mePtr->state == tkDisabledUid)
+                   && (menuPtr->disabledFg != NULL)) {
+               gc = mePtr->disabledGC;
+               if (gc == NULL) {
+                   gc = menuPtr->disabledGC;
+               }
+           } else {
+               gc = mePtr->textGC;
+               if (gc == NULL) {
+                   gc = menuPtr->textGC;
+               }
+           }
+       }
+
+       /*
+        * Draw label or bitmap for entry.
+        */
+
+       fontPtr = mePtr->fontPtr;
+       if (fontPtr == NULL) {
+           fontPtr = menuPtr->fontPtr;
+       }
+       baseline = mePtr->y + (mePtr->height + fontPtr->ascent
+               - fontPtr->descent)/2;
+       if (mePtr->bitmap != None) {
+           unsigned int width, height;
+
+#if defined(USE_XPM3)        
+           Tk_SizeOfPixmap(mePtr->bitmap, &width, &height);
+            XCopyArea(Tk_Display(tkwin), mePtr->bitmap, Tk_WindowId(tkwin),
+                   gc, 0, 0, width, height,
+                   menuPtr->borderWidth + menuPtr->selectorSpace,
+                   (int) (mePtr->y + (mePtr->height - height)/2));
+#else
+           Tk_SizeOfBitmap(mePtr->bitmap, &width, &height);
+           XCopyPlane(Tk_Display(tkwin), mePtr->bitmap, Tk_WindowId(tkwin),
+                   gc, 0, 0, width, height,
+                   menuPtr->borderWidth + menuPtr->selectorSpace,
+                   (int) (mePtr->y + (mePtr->height - height)/2), 1);
+#endif
+       } else {
+           baseline = mePtr->y + (mePtr->height + fontPtr->ascent
+                   - fontPtr->descent)/2;
+           if (mePtr->label != NULL) {
+               TkDisplayChars(Tk_Display(tkwin), Tk_WindowId(tkwin), gc,
+                       fontPtr, mePtr->label, mePtr->labelLength,
+                       menuPtr->borderWidth + menuPtr->selectorSpace,
+                       baseline, TK_NEWLINES_NOT_SPECIAL);
+               if (mePtr->underline >= 0) {
+                   TkUnderlineChars(Tk_Display(tkwin), Tk_WindowId(tkwin), gc,
+                           fontPtr, mePtr->label,
+                           menuPtr->borderWidth + menuPtr->selectorSpace,
+                           baseline, TK_NEWLINES_NOT_SPECIAL,
+                           mePtr->underline, mePtr->underline);
+               }
+           }
+       }
+
+       /*
+        * Draw accelerator.
+        */
+
+       if (mePtr->accel != NULL) {
+           TkDisplayChars(Tk_Display(tkwin), Tk_WindowId(tkwin), gc,
+                   fontPtr, mePtr->accel, mePtr->accelLength,
+                   menuPtr->borderWidth + menuPtr->selectorSpace
+                   + menuPtr->labelWidth, baseline, TK_NEWLINES_NOT_SPECIAL);
+       }
+
+       /*
+        * Draw check-button selector.
+        */
+
+       if (mePtr->type == CHECK_BUTTON_ENTRY) {
+           int dim, x, y;
+
+           dim = mePtr->selectorDiameter;
+           x = menuPtr->borderWidth + (menuPtr->selectorSpace - dim)/2;
+           y = mePtr->y + (mePtr->height - dim)/2;
+           Tk_Fill3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                   menuPtr->border, x, y, dim, dim,
+                   menuPtr->activeBorderWidth, TK_RELIEF_SUNKEN);
+           x += menuPtr->activeBorderWidth;
+           y += menuPtr->activeBorderWidth;
+           dim -= 2*menuPtr->activeBorderWidth;
+           if ((dim > 0) && (mePtr->flags & ENTRY_SELECTED)) {
+               XFillRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                       menuPtr->selectorGC, x, y, (unsigned int) dim,
+                       (unsigned int) dim);
+           }
+       }
+
+       /*
+        * Draw radio-button selector.
+        */
+
+       if (mePtr->type == RADIO_BUTTON_ENTRY) {
+           XPoint points[4];
+           int radius;
+
+           radius = mePtr->selectorDiameter/2;
+           points[0].x = menuPtr->borderWidth
+                   + (menuPtr->selectorSpace - mePtr->selectorDiameter)/2;
+           points[0].y = mePtr->y + (mePtr->height)/2;
+           points[1].x = points[0].x + radius;
+           points[1].y = points[0].y + radius;
+           points[2].x = points[1].x + radius;
+           points[2].y = points[0].y;
+           points[3].x = points[1].x;
+           points[3].y = points[0].y - radius;
+           if (mePtr->flags & ENTRY_SELECTED) {
+               XFillPolygon(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                       menuPtr->selectorGC, points, 4, Convex,
+                       CoordModeOrigin);
+           } else {
+               Tk_Fill3DPolygon(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                       menuPtr->border, points, 4, menuPtr->activeBorderWidth,
+                       TK_RELIEF_FLAT);
+           }
+           Tk_Draw3DPolygon(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                   menuPtr->border, points, 4, menuPtr->activeBorderWidth,
+                   TK_RELIEF_SUNKEN);
+       }
+
+       /*
+        * Draw separator.
+        */
+
+       if (mePtr->type == SEPARATOR_ENTRY) {
+           XPoint points[2];
+           int margin;
+
+           margin = (fontPtr->ascent + fontPtr->descent)/2;
+           points[0].x = 2*menuPtr->borderWidth + margin;
+           points[0].y = mePtr->y + mePtr->height/2;
+           points[1].x = Tk_Width(tkwin) - 2*menuPtr->borderWidth - margin;
+           points[1].y = points[0].y;
+           Tk_Draw3DPolygon(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                   menuPtr->border, points, 2, 1, TK_RELIEF_RAISED);
+       }
+
+       /*
+        * If the entry is disabled with a stipple rather than a special
+        * foreground color, generate the stippled effect.
+        */
+
+       if ((mePtr->state == tkDisabledUid) && (menuPtr->disabledFg == NULL)) {
+           XFillRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                   menuPtr->disabledGC, menuPtr->borderWidth,
+                   mePtr->y,
+                   (unsigned) (Tk_Width(tkwin) - 2*menuPtr->borderWidth),
+                   (unsigned) mePtr->height);
+       }
+    }
+
+    Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+           menuPtr->border, 0, 0, Tk_Width(tkwin), Tk_Height(tkwin),
+           menuPtr->borderWidth, TK_RELIEF_RAISED);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * GetMenuIndex --
+ *
+ *     Parse a textual index into a menu and return the numerical
+ *     index of the indicated entry.
+ *
+ * Results:
+ *     A standard Tcl result.  If all went well, then *indexPtr is
+ *     filled in with the entry index corresponding to string
+ *     (ranges from -1 to the number of entries in the menu minus
+ *     one).  Otherwise an error message is left in interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+GetMenuIndex(interp, menuPtr, string, indexPtr)
+    Tcl_Interp *interp;                /* For error messages. */
+    Menu *menuPtr;             /* Menu for which the index is being
+                                * specified. */
+    char *string;              /* Specification of an entry in menu.  See
+                                * manual entry for valid .*/
+    int *indexPtr;             /* Where to store converted relief. */
+{
+    int i, y;
+
+    if ((string[0] == 'a') && (strcmp(string, "active") == 0)) {
+       *indexPtr = menuPtr->active;
+       return TCL_OK;
+    }
+
+    if ((string[0] == 'l') && (strcmp(string, "last") == 0)) {
+       *indexPtr = menuPtr->numEntries-1;
+       return TCL_OK;
+    }
+
+    if ((string[0] == 'n') && (strcmp(string, "none") == 0)) {
+       *indexPtr = -1;
+       return TCL_OK;
+    }
+
+    if (string[0] == '@') {
+       if (Tcl_GetInt(interp, string+1,  &y) == TCL_OK) {
+           if (y < 0) {
+               *indexPtr = -1;
+               return TCL_OK;
+           }
+           for (i = 0; i < menuPtr->numEntries; i++) {
+               y -= menuPtr->entries[i]->height;
+               if (y < 0) {
+                   break;
+               }
+           }
+           if (i >= menuPtr->numEntries) {
+               i = -1;
+           }
+           *indexPtr = i;
+           return TCL_OK;
+       } else {
+           Tcl_SetResult(interp, (char *) NULL, TCL_STATIC);
+       }
+    }
+
+    if (isdigit(string[0])) {
+       if (Tcl_GetInt(interp, string,  &i) == TCL_OK) {
+           if ((i < menuPtr->numEntries) && (i >= 0)) {
+               *indexPtr = i;
+               return TCL_OK;
+           }
+       } else {
+           Tcl_SetResult(interp, (char *) NULL, TCL_STATIC);
+       }
+    }
+
+    for (i = 0; i < menuPtr->numEntries; i++) {
+       char *label;
+
+       label = menuPtr->entries[i]->label;
+       if ((label != NULL)
+               && (Tcl_StringMatch(menuPtr->entries[i]->label, string))) {
+           *indexPtr = i;
+           return TCL_OK;
+       }
+    }
+
+    Tcl_AppendResult(interp, "bad menu entry index \"",
+           string, "\"", (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * MenuEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher for various
+ *     events on menus.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the window gets deleted, internal structures get
+ *     cleaned up.  When it gets exposed, it is redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+MenuEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    XEvent *eventPtr;          /* Information about event. */
+{
+    Menu *menuPtr = (Menu *) clientData;
+    if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {
+       EventuallyRedrawMenu(menuPtr, -1);
+    } else if (eventPtr->type == DestroyNotify) {
+       Tcl_DeleteCommand(menuPtr->interp, Tk_PathName(menuPtr->tkwin));
+
+       /*
+        * Careful!  Must delete the event-sharing information here
+        * rather than in DestroyMenu.  By the time that procedure
+        * is called the tkwin may have been reused, resulting in some
+        * other window accidentally being cut off from shared events.
+        */
+
+       Tk_UnshareEvents(menuPtr->tkwin, menuPtr->group);
+       menuPtr->tkwin = NULL;
+       if (menuPtr->flags & REDRAW_PENDING) {
+           Tk_CancelIdleCall(DisplayMenu, (ClientData) menuPtr);
+       }
+       if (menuPtr->flags & RESIZE_PENDING) {
+           Tk_CancelIdleCall(ComputeMenuGeometry, (ClientData) menuPtr);
+       }
+       Tk_EventuallyFree((ClientData) menuPtr, DestroyMenu);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * MenuVarProc --
+ *
+ *     This procedure is invoked when someone changes the
+ *     state variable associated with a radiobutton or checkbutton
+ *     menu entry.  The entry's selected state is set to match
+ *     the value of the variable.
+ *
+ * Results:
+ *     NULL is always returned.
+ *
+ * Side effects:
+ *     The menu entry may become selected or deselected.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static char *
+MenuVarProc(clientData, interp, name1, name2, flags)
+    ClientData clientData;     /* Information about menu entry. */
+    Tcl_Interp *interp;                /* Interpreter containing variable. */
+    char *name1;               /* First part of variable's name. */
+    char *name2;               /* Second part of variable's name. */
+    int flags;                 /* Describes what just happened. */
+{
+    MenuEntry *mePtr = (MenuEntry *) clientData;
+    Menu *menuPtr;
+    char *value;
+
+    menuPtr = mePtr->menuPtr;
+
+    /*
+     * If the variable is being unset, then re-establish the
+     * trace unless the whole interpreter is going away.
+     */
+
+    if (flags & TCL_TRACE_UNSETS) {
+       mePtr->flags &= ~ENTRY_SELECTED;
+       if ((flags & TCL_TRACE_DESTROYED) && !(flags & TCL_INTERP_DESTROYED)) {
+           Tcl_TraceVar2(interp, name1, name2,
+                   TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+                   MenuVarProc, clientData);
+       }
+       EventuallyRedrawMenu(menuPtr, -1);
+       return (char *) NULL;
+    }
+
+    /*
+     * Use the value of the variable to update the selected status of
+     * the menu entry.
+     */
+
+    value = Tcl_GetVar2(interp, name1, name2, flags & TCL_GLOBAL_ONLY);
+    if (strcmp(value, mePtr->onValue) == 0) {
+       if (mePtr->flags & ENTRY_SELECTED) {
+           return (char *) NULL;
+       }
+       mePtr->flags |= ENTRY_SELECTED;
+    } else if (mePtr->flags & ENTRY_SELECTED) {
+       mePtr->flags &= ~ENTRY_SELECTED;
+    } else {
+       return (char *) NULL;
+    }
+    EventuallyRedrawMenu(menuPtr, -1);
+    return (char *) NULL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * EventuallyRedrawMenu --
+ *
+ *     Arrange for an entry of a menu, or the whole menu, to be
+ *     redisplayed at some point in the future.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A when-idle hander is scheduled to do the redisplay, if there
+ *     isn't one already scheduled.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+EventuallyRedrawMenu(menuPtr, index)
+    register Menu *menuPtr;    /* Information about menu to redraw. */
+    int index;                 /* Which entry to redraw.  If -1, then
+                                * all the entries in the menu are redrawn. */
+{
+    if (menuPtr->tkwin == NULL) {
+       return;
+    }
+    if (index != -1) {
+       menuPtr->entries[index]->flags |= ENTRY_NEEDS_REDISPLAY;
+    } else {
+       for (index = 0; index < menuPtr->numEntries; index++) {
+           menuPtr->entries[index]->flags |= ENTRY_NEEDS_REDISPLAY;
+       }
+    }
+    if ((menuPtr->tkwin == NULL) || !Tk_IsMapped(menuPtr->tkwin)
+           || (menuPtr->flags & REDRAW_PENDING)) {
+       return;
+    }
+    Tk_DoWhenIdle(DisplayMenu, (ClientData) menuPtr);
+    menuPtr->flags |= REDRAW_PENDING;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * PostSubmenu --
+ *
+ *     This procedure arranges for a particular submenu (i.e. the
+ *     menu corresponding to a given cascade entry) to be
+ *     posted.
+ *
+ * Results:
+ *     A standard Tcl return result.  Errors may occur in the
+ *     Tcl commands generated to post and unpost submenus.
+ *
+ * Side effects:
+ *     If there is already a submenu posted, it is unposted.
+ *     The new submenu is then posted.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+PostSubmenu(interp, menuPtr, mePtr)
+    Tcl_Interp *interp;                /* Used for invoking sub-commands and
+                                * reporting errors. */
+    register Menu *menuPtr;    /* Information about menu as a whole. */
+    register MenuEntry *mePtr; /* Info about submenu that is to be
+                                * posted.  NULL means make sure that
+                                * no submenu is posted. */
+{
+    char string[30];
+    int result, x, y;
+
+    if (mePtr == menuPtr->postedCascade) {
+       return TCL_OK;
+    }
+
+    if (menuPtr->postedCascade != NULL) {
+       result = Tcl_VarEval(interp, menuPtr->postedCascade->name,
+               " unpost", (char *) NULL);
+       menuPtr->postedCascade = NULL;
+       if (result != TCL_OK) {
+           return result;
+       }
+    }
+
+    if ((mePtr != NULL) && (mePtr->name != NULL)) {
+       Tk_GetRootCoords(menuPtr->tkwin, &x, &y);
+       x += Tk_Width(menuPtr->tkwin);
+       y += mePtr->y;
+       sprintf(string, "%d %d ", x, y);
+       result = Tcl_VarEval(interp, mePtr->name, " post ", string,
+               menuPtr->group, (char *) NULL);
+       if (result != TCL_OK) {
+           return result;
+       }
+       menuPtr->postedCascade = mePtr;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ActivateMenuEntry --
+ *
+ *     This procedure is invoked to make a particular menu entry
+ *     the active one, deactivating any other entry that might
+ *     currently be active.
+ *
+ * Results:
+ *     The return value is a standard Tcl result (errors can occur
+ *     while posting and unposting submenus).
+ *
+ * Side effects:
+ *     Menu entries get redisplayed, and the active entry changes.
+ *     Submenus may get posted and unposted.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ActivateMenuEntry(menuPtr, index)
+    register Menu *menuPtr;            /* Menu in which to activate. */
+    int index;                         /* Index of entry to activate, or
+                                        * -1 to deactivate all entries. */
+{
+    register MenuEntry *mePtr;
+    int result = TCL_OK;
+
+    if (menuPtr->active >= 0) {
+       mePtr = menuPtr->entries[menuPtr->active];
+
+       /*
+        * Don't change the state unless it's currently active (state
+        * might already have been changed to disabled).
+        */
+
+       if (mePtr->state == tkActiveUid) {
+           mePtr->state = tkNormalUid;
+       }
+       EventuallyRedrawMenu(menuPtr, menuPtr->active);
+    }
+    menuPtr->active = index;
+    if (index >= 0) {
+       mePtr = menuPtr->entries[index];
+       mePtr->state = tkActiveUid;
+       EventuallyRedrawMenu(menuPtr, index);
+       Tk_Preserve((ClientData) mePtr);
+       if (mePtr->type == CASCADE_ENTRY) {
+           result = PostSubmenu(menuPtr->interp, menuPtr, mePtr);
+       } else {
+           result = PostSubmenu(menuPtr->interp, menuPtr, (MenuEntry *) NULL);
+       }
+       Tk_Release((ClientData) mePtr);
+    }
+    return result;
+}
diff --git a/src/tk/tkmnbut.c b/src/tk/tkmnbut.c
new file mode 100644 (file)
index 0000000..82ef9b1
--- /dev/null
@@ -0,0 +1,1166 @@
+/* 
+ * tkMenubutton.c --
+ *
+ *     This module implements button-like widgets that are used
+ *     to invoke pull-down menus.
+ *
+ * Copyright 1990 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkMenubutton.c,v 1.33 92/08/21 16:21:47 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "default.h"
+#include "tkint.h"
+
+/*
+ * A data structure of the following type is kept for each
+ * widget managed by this file:
+ */
+
+typedef struct {
+    Tk_Window tkwin;           /* Window that embodies the widget.  NULL
+                                * means that the window has been destroyed
+                                * but the data structures haven't yet been
+                                * cleaned up.*/
+    Tcl_Interp *interp;                /* Interpreter associated with menu button. */
+    char *menuName;            /* Name of menu associated with widget (used
+                                * to generate post and unpost commands).
+                                * Malloc-ed. */
+    Tk_Uid varName;            /* Name of variable associated with collection
+                                * of menu bars:  used to allow scanning of
+                                * menus.   Also used as identifier for
+                                * menu group. */
+
+    /*
+     * Information about what's displayed in the menu button:
+     */
+
+    char *text;                        /* Text to display in button (malloc'ed)
+                                * or NULL. */
+    int textLength;            /* # of characters in text. */
+    int underline;             /* Index of character to underline. */
+    char *textVarName;         /* Name of variable (malloc'ed) or NULL.
+                                * If non-NULL, button displays the contents
+                                * of this variable. */
+    Pixmap bitmap;             /* Bitmap to display or None.  If not None
+                                * then text and textVar and underline
+                                * are ignored. */
+
+    /*
+     * Information used when displaying widget:
+     */
+
+    Tk_Uid state;              /* State of button for display purposes:
+                                * normal, active, or disabled. */
+    Tk_3DBorder normalBorder;  /* Structure used to draw 3-D
+                                * border and background when window
+                                * isn't active.  NULL means no such
+                                * border exists. */
+    Tk_3DBorder activeBorder;  /* Structure used to draw 3-D
+                                * border and background when window
+                                * is active.  NULL means no such
+                                * border exists. */
+    int borderWidth;           /* Width of border. */
+    int relief;                        /* 3-d effect: TK_RELIEF_RAISED, etc. */
+    XFontStruct *fontPtr;      /* Information about text font, or NULL. */
+    XColor *normalFg;          /* Foreground color in normal mode. */
+    XColor *activeFg;          /* Foreground color in active mode.  NULL
+                                * means use normalFg instead. */
+    XColor *disabledFg;                /* Foreground color when disabled.  NULL
+                                * means use normalFg with a 50% stipple
+                                * instead. */
+    GC normalTextGC;           /* GC for drawing text in normal mode. */
+    GC activeTextGC;           /* GC for drawing text in active mode (NULL
+                                * means use normalTextGC). */
+    Pixmap gray;               /* Pixmap for displaying disabled text/icon if
+                                * disabledFg is NULL. */
+    GC disabledGC;             /* Used to produce disabled effect.  If
+                                * disabledFg isn't NULL, this GC is used to
+                                * draw button text or icon.  Otherwise
+                                * text or icon is drawn with normalGC and
+                                * this GC is used to stipple background
+                                * across it. */
+    int leftBearing;           /* Amount text sticks left from its origin,
+                                * in pixels. */
+    int rightBearing;          /* Amount text sticks right from its origin. */
+    int width, height;         /* If > 0, these specify dimensions to request
+                                * for window, in characters for text and in
+                                * pixels for bitmaps.  In this case the actual
+                                * size of the text string or bitmap is
+                                * ignored in computing desired window size. */
+    int padX, padY;            /* Extra space around text or bitmap (pixels
+                                * on each side). */
+    Tk_Anchor anchor;          /* Where text/bitmap should be displayed
+                                * inside window region. */
+
+    /*
+     * Miscellaneous information:
+     */
+
+    Cursor cursor;             /* Current cursor for window, or None. */
+    int flags;                 /* Various flags;  see below for
+                                * definitions. */
+} MenuButton;
+
+/*
+ * Flag bits for buttons:
+ *
+ * REDRAW_PENDING:             Non-zero means a DoWhenIdle handler
+ *                             has already been queued to redraw
+ *                             this window.
+ * POSTED:                     Non-zero means that the menu associated
+ *                             with this button has been posted (typically
+ *                             because of an active button press).
+ */
+
+#define REDRAW_PENDING         1
+#define POSTED                 2
+
+/*
+ * Information used for parsing configuration specs:
+ */
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground",
+       DEF_MENUBUTTON_ACTIVE_BG_COLOR, Tk_Offset(MenuButton, activeBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground",
+       DEF_MENUBUTTON_ACTIVE_BG_MONO, Tk_Offset(MenuButton, activeBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_COLOR, "-activeforeground", "activeForeground", "Background",
+       DEF_MENUBUTTON_ACTIVE_FG_COLOR, Tk_Offset(MenuButton, activeFg),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_COLOR, "-activeforeground", "activeForeground", "Background",
+       DEF_MENUBUTTON_ACTIVE_FG_MONO, Tk_Offset(MenuButton, activeFg),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_ANCHOR, "-anchor", "anchor", "Anchor",
+       DEF_MENUBUTTON_ANCHOR, Tk_Offset(MenuButton, anchor), 0},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_MENUBUTTON_BG_COLOR, Tk_Offset(MenuButton, normalBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_MENUBUTTON_BG_MONO, Tk_Offset(MenuButton, normalBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
+       (char *) NULL, 0, 0},
+#if defined(USE_XPM3)
+    {TK_CONFIG_PIXMAP, "-bitmap", "bitmap", "Bitmap",
+       DEF_MENUBUTTON_BITMAP, Tk_Offset(MenuButton, bitmap),
+       TK_CONFIG_NULL_OK},
+#else
+    {TK_CONFIG_BITMAP, "-bitmap", "bitmap", "Bitmap",
+       DEF_MENUBUTTON_BITMAP, Tk_Offset(MenuButton, bitmap),
+       TK_CONFIG_NULL_OK},
+#endif
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       DEF_MENUBUTTON_BORDER_WIDTH, Tk_Offset(MenuButton, borderWidth), 0},
+    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",
+       DEF_MENUBUTTON_CURSOR, Tk_Offset(MenuButton, cursor),
+       TK_CONFIG_NULL_OK},
+    {TK_CONFIG_COLOR, "-disabledforeground", "disabledForeground",
+       "DisabledForeground", DEF_MENUBUTTON_DISABLED_FG_COLOR,
+       Tk_Offset(MenuButton, disabledFg),
+       TK_CONFIG_COLOR_ONLY|TK_CONFIG_NULL_OK},
+    {TK_CONFIG_COLOR, "-disabledforeground", "disabledForeground",
+       "DisabledForeground", DEF_MENUBUTTON_DISABLED_FG_MONO,
+       Tk_Offset(MenuButton, disabledFg),
+       TK_CONFIG_MONO_ONLY|TK_CONFIG_NULL_OK},
+    {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_FONT, "-font", "font", "Font",
+       DEF_MENUBUTTON_FONT, Tk_Offset(MenuButton, fontPtr), 0},
+    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",
+       DEF_MENUBUTTON_FG, Tk_Offset(MenuButton, normalFg), 0},
+    {TK_CONFIG_INT, "-height", "height", "Height",
+       DEF_MENUBUTTON_HEIGHT, Tk_Offset(MenuButton, height), 0},
+    {TK_CONFIG_STRING, "-menu", "menu", "Menu",
+       DEF_MENUBUTTON_MENU, Tk_Offset(MenuButton, menuName), 0},
+    {TK_CONFIG_PIXELS, "-padx", "padX", "Pad",
+       DEF_MENUBUTTON_PADX, Tk_Offset(MenuButton, padX), 0},
+    {TK_CONFIG_PIXELS, "-pady", "padY", "Pad",
+       DEF_MENUBUTTON_PADY, Tk_Offset(MenuButton, padY), 0},
+    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
+       DEF_MENUBUTTON_RELIEF, Tk_Offset(MenuButton, relief), 0},
+    {TK_CONFIG_UID, "-state", "state", "State",
+       DEF_MENUBUTTON_STATE, Tk_Offset(MenuButton, state), 0},
+    {TK_CONFIG_STRING, "-text", "text", "Text",
+       DEF_MENUBUTTON_TEXT, Tk_Offset(MenuButton, text), 0},
+    {TK_CONFIG_STRING, "-textvariable", "textVariable", "Variable",
+       DEF_MENUBUTTON_TEXT_VARIABLE, Tk_Offset(MenuButton, textVarName),
+       TK_CONFIG_NULL_OK},
+    {TK_CONFIG_INT, "-underline", "underline", "Underline",
+       DEF_MENUBUTTON_UNDERLINE, Tk_Offset(MenuButton, underline), 0},
+    {TK_CONFIG_UID, "-variable", "variable", "Variable",
+       DEF_MENUBUTTON_VARIABLE, Tk_Offset(MenuButton, varName), 0},
+    {TK_CONFIG_INT, "-width", "width", "Width",
+       DEF_MENUBUTTON_WIDTH, Tk_Offset(MenuButton, width), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            ComputeMenuButtonGeometry _ANSI_ARGS_((
+                           MenuButton *mbPtr));
+static void            MenuButtonEventProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static char *          MenuButtonTextVarProc _ANSI_ARGS_((
+                           ClientData clientData, Tcl_Interp *interp,
+                           char *name1, char *name2, int flags));
+static char *          MenuButtonVarProc _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, char *name1, char *name2,
+                           int flags));
+static int             MenuButtonWidgetCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+static int             ConfigureMenuButton _ANSI_ARGS_((Tcl_Interp *interp,
+                           MenuButton *mbPtr, int argc, char **argv,
+                           int flags));
+static void            DestroyMenuButton _ANSI_ARGS_((ClientData clientData));
+static void            DisplayMenuButton _ANSI_ARGS_((ClientData clientData));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_MenubuttonCmd --
+ *
+ *     This procedure is invoked to process the "button", "label",
+ *     "radiobutton", and "checkbutton" Tcl commands.  See the
+ *     user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_MenubuttonCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    register MenuButton *mbPtr;
+    Tk_Window tkwin = (Tk_Window) clientData;
+    Tk_Window new;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args:  should be \"",
+               argv[0], " pathName ?options?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Create the new window.
+     */
+
+    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], (char *) NULL);
+    if (new == NULL) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * Initialize the data structure for the button.
+     */
+
+    mbPtr = (MenuButton *) ckalloc(sizeof(MenuButton));
+    mbPtr->tkwin = new;
+    mbPtr->interp = interp;
+    mbPtr->menuName = NULL;
+    mbPtr->varName = NULL;
+    mbPtr->text = NULL;
+    mbPtr->underline = -1;
+    mbPtr->textVarName = NULL;
+    mbPtr->bitmap = None;
+    mbPtr->state = tkNormalUid;
+    mbPtr->normalBorder = NULL;
+    mbPtr->activeBorder = NULL;
+    mbPtr->borderWidth = 0;
+    mbPtr->relief = TK_RELIEF_FLAT;
+    mbPtr->fontPtr = NULL;
+    mbPtr->normalFg = NULL;
+    mbPtr->activeFg = NULL;
+    mbPtr->disabledFg = NULL;
+    mbPtr->normalTextGC = NULL;
+    mbPtr->activeTextGC = NULL;
+    mbPtr->gray = None;
+    mbPtr->disabledGC = NULL;
+    mbPtr->cursor = None;
+    mbPtr->flags = 0;
+
+    Tk_SetClass(mbPtr->tkwin, "Menubutton");
+    Tk_CreateEventHandler(mbPtr->tkwin, ExposureMask|StructureNotifyMask,
+           MenuButtonEventProc, (ClientData) mbPtr);
+    Tcl_CreateCommand(interp, Tk_PathName(mbPtr->tkwin), MenuButtonWidgetCmd,
+           (ClientData) mbPtr, (void (*)()) NULL);
+    if (ConfigureMenuButton(interp, mbPtr, argc-2, argv+2, 0) != TCL_OK) {
+       Tk_DestroyWindow(mbPtr->tkwin);
+       return TCL_ERROR;
+    }
+
+    interp->result = Tk_PathName(mbPtr->tkwin);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * MenuButtonWidgetCmd --
+ *
+ *     This procedure is invoked to process the Tcl command
+ *     that corresponds to a widget managed by this module.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+MenuButtonWidgetCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Information about button widget. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    register MenuButton *mbPtr = (MenuButton *) clientData;
+    int result = TCL_OK;
+    int length;
+    char c;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    Tk_Preserve((ClientData) mbPtr);
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'a') && (strncmp(argv[1], "activate", length) == 0)) {
+       if (argc > 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " activate\"", (char *) NULL);
+           goto error;
+       }
+       if (mbPtr->state != tkDisabledUid) {
+           mbPtr->state = tkActiveUid;
+           Tk_SetBackgroundFromBorder(mbPtr->tkwin, mbPtr->activeBorder);
+           goto redisplay;
+       }
+    } else if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)) {
+       if (argc == 2) {
+           result = Tk_ConfigureInfo(interp, mbPtr->tkwin, configSpecs,
+                   (char *) mbPtr, (char *) NULL, 0);
+       } else if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, mbPtr->tkwin, configSpecs,
+                   (char *) mbPtr, argv[2], 0);
+       } else {
+           result = ConfigureMenuButton(interp, mbPtr, argc-2, argv+2,
+                   TK_CONFIG_ARGV_ONLY);
+       }
+    } else if ((c == 'd') && (strncmp(argv[1], "deactivate", length) == 0)) {
+       if (argc > 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " deactivate\"", (char *) NULL);
+           goto error;
+       }
+       if (mbPtr->state != tkDisabledUid) {
+           mbPtr->state = tkNormalUid;
+           Tk_SetBackgroundFromBorder(mbPtr->tkwin, mbPtr->normalBorder);
+           goto redisplay;
+       }
+    } else if ((c == 'p') && (strncmp(argv[1], "post", length) == 0)) {
+       if (argc > 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " post\"", (char *) NULL);
+           goto error;
+       }
+       if ((mbPtr->flags & POSTED) || (mbPtr->menuName == NULL)
+               || (mbPtr->state == tkDisabledUid)) {
+           goto done;
+       }
+
+       /*
+        * Store the name of the posted menu into the associated variable.
+        * This will cause any other menu posted via that variable to
+        * unpost itself and will cause this menu to post itself.
+        */
+
+       Tcl_SetVar(interp, mbPtr->varName, Tk_PathName(mbPtr->tkwin),
+               TCL_GLOBAL_ONLY);
+    } else if ((c == 'u') && (strncmp(argv[1], "unpost", length) == 0)) {
+       if (argc > 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " unpost\"", (char *) NULL);
+           goto error;
+       }
+
+       /*
+        * The one-liner below looks simple, but it isn't.  This code
+        * does the right thing even if this menu isn't posted anymore,
+        * but some other variable associated with the same variable
+        * is posted instead:  it unposts whatever is posted.  This
+        * approach is necessary because at present ButtonRelease
+        * events go to the menu button where the mouse button was
+        * first pressed;  this may not be the same menu button that's
+        * currently active.
+        */
+       Tcl_SetVar(interp, mbPtr->varName, "", TCL_GLOBAL_ONLY);
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\":  must be activate, configure, deactivate, ",
+               "post, or unpost", (char *) NULL);
+       goto error;
+    }
+    done:
+    Tk_Release((ClientData) mbPtr);
+    return result;
+
+    redisplay:
+    if (Tk_IsMapped(mbPtr->tkwin) && !(mbPtr->flags & REDRAW_PENDING)) {
+       Tk_DoWhenIdle(DisplayMenuButton, (ClientData) mbPtr);
+       mbPtr->flags |= REDRAW_PENDING;
+    }
+    goto done;
+
+    error:
+    Tk_Release((ClientData) mbPtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyMenuButton --
+ *
+ *     This procedure is invoked to recycle all of the resources
+ *     associated with a button widget.  It is invoked as a
+ *     when-idle handler in order to make sure that there is no
+ *     other use of the button pending at the time of the deletion.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the widget is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyMenuButton(clientData)
+    ClientData clientData;     /* Info about button widget. */
+{
+    register MenuButton *mbPtr = (MenuButton *) clientData;
+    if (mbPtr->menuName != NULL) {
+        ckfree(mbPtr->menuName);
+    }
+    if (mbPtr->varName != NULL) {
+       Tcl_UntraceVar(mbPtr->interp, mbPtr->varName,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               MenuButtonVarProc, (ClientData) mbPtr);
+    }
+    if (mbPtr->text != NULL) {
+       ckfree(mbPtr->text);
+    }
+    if (mbPtr->textVarName != NULL) {
+       Tcl_UntraceVar(mbPtr->interp, mbPtr->textVarName,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               MenuButtonTextVarProc, (ClientData) mbPtr);
+       ckfree(mbPtr->textVarName);
+    }
+    if (mbPtr->bitmap != None) {
+#if defined(USE_XPM3)
+        Tk_FreePixmap(mbPtr->bitmap);
+#else
+        Tk_FreeBitmap(mbPtr->bitmap);
+#endif
+    }
+    if (mbPtr->normalBorder != NULL) {
+       Tk_Free3DBorder(mbPtr->normalBorder);
+    }
+    if (mbPtr->activeBorder != NULL) {
+       Tk_Free3DBorder(mbPtr->activeBorder);
+    }
+    if (mbPtr->fontPtr != NULL) {
+       Tk_FreeFontStruct(mbPtr->fontPtr);
+    }
+    if (mbPtr->normalFg != NULL) {
+       Tk_FreeColor(mbPtr->normalFg);
+    }
+    if (mbPtr->activeFg != NULL) {
+       Tk_FreeColor(mbPtr->activeFg);
+    }
+    if (mbPtr->disabledFg != NULL) {
+       Tk_FreeColor(mbPtr->disabledFg);
+    }
+    if (mbPtr->normalTextGC != None) {
+       Tk_FreeGC(mbPtr->normalTextGC);
+    }
+    if (mbPtr->activeTextGC != None) {
+       Tk_FreeGC(mbPtr->activeTextGC);
+    }
+    if (mbPtr->gray != None) {
+       Tk_FreeBitmap(mbPtr->gray);
+    }
+    if (mbPtr->disabledGC != None) {
+       Tk_FreeGC(mbPtr->disabledGC);
+    }
+    if (mbPtr->cursor != None) {
+       Tk_FreeCursor(mbPtr->cursor);
+    }
+    ckfree((char *) mbPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureMenuButton --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or
+ *     reconfigure) a menubutton widget.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information, such as text string, colors, font,
+ *     etc. get set for mbPtr;  old resources get freed, if there
+ *     were any.  The menubutton is redisplayed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureMenuButton(interp, mbPtr, argc, argv, flags)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    register MenuButton *mbPtr;        /* Information about widget;  may or may
+                                * not already have values for some fields. */
+    int argc;                  /* Number of valid entries in argv. */
+    char **argv;               /* Arguments. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    XGCValues gcValues;
+    GC newGC;
+    unsigned long mask;
+    int result;
+    Tk_Uid oldGroup;
+    char *value;
+
+    /*
+     * Eliminate any existing traces on variables monitored by the button.
+     */
+
+    if (mbPtr->varName != NULL) {
+       Tcl_UntraceVar(interp, mbPtr->varName,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               MenuButtonVarProc, (ClientData) mbPtr);
+    }
+    if (mbPtr->textVarName != NULL) {
+       Tcl_UntraceVar(interp, mbPtr->textVarName,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               MenuButtonTextVarProc, (ClientData) mbPtr);
+    }
+
+    oldGroup = mbPtr->varName;
+    result = Tk_ConfigureWidget(interp, mbPtr->tkwin, configSpecs,
+           argc, argv, (char *) mbPtr, flags);
+    if (oldGroup != mbPtr->varName) {
+       Tk_UnshareEvents(mbPtr->tkwin, oldGroup);
+       Tk_ShareEvents(mbPtr->tkwin, mbPtr->varName);
+    }
+    if (result != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few options need special processing, such as setting the
+     * background from a 3-D border, or filling in complicated
+     * defaults that couldn't be specified to Tk_ConfigureWidget.
+     */
+
+    if (mbPtr->state == tkActiveUid) {
+       Tk_SetBackgroundFromBorder(mbPtr->tkwin, mbPtr->activeBorder);
+    } else {
+       Tk_SetBackgroundFromBorder(mbPtr->tkwin, mbPtr->normalBorder);
+       if ((mbPtr->state != tkNormalUid) && (mbPtr->state != tkDisabledUid)) {
+           Tcl_AppendResult(interp, "bad state value \"", mbPtr->state,
+                   "\":  must be normal, active, or disabled", (char *) NULL);
+           mbPtr->state = tkNormalUid;
+           return TCL_ERROR;
+       }
+    }
+
+    gcValues.font = mbPtr->fontPtr->fid;
+    gcValues.foreground = mbPtr->normalFg->pixel;
+    gcValues.background = Tk_3DBorderColor(mbPtr->normalBorder)->pixel;
+
+    /*
+     * Note: GraphicsExpose events are disabled in GC's because they're
+     * used to copy stuff from an off-screen pixmap onto the screen (we know
+     * that there's no problem with obscured areas).
+     */
+
+    gcValues.graphics_exposures = False;
+    newGC = Tk_GetGC(mbPtr->tkwin,
+           GCForeground|GCBackground|GCFont|GCGraphicsExposures, &gcValues);
+    if (mbPtr->normalTextGC != None) {
+       Tk_FreeGC(mbPtr->normalTextGC);
+    }
+    mbPtr->normalTextGC = newGC;
+
+    gcValues.font = mbPtr->fontPtr->fid;
+    gcValues.foreground = mbPtr->activeFg->pixel;
+    gcValues.background = Tk_3DBorderColor(mbPtr->activeBorder)->pixel;
+    newGC = Tk_GetGC(mbPtr->tkwin, GCForeground|GCBackground|GCFont,
+           &gcValues);
+    if (mbPtr->activeTextGC != None) {
+       Tk_FreeGC(mbPtr->activeTextGC);
+    }
+    mbPtr->activeTextGC = newGC;
+
+    gcValues.font = mbPtr->fontPtr->fid;
+    gcValues.background = Tk_3DBorderColor(mbPtr->normalBorder)->pixel;
+    if (mbPtr->disabledFg != NULL) {
+       gcValues.foreground = mbPtr->disabledFg->pixel;
+       mask = GCForeground|GCBackground|GCFont;
+    } else {
+       gcValues.foreground = gcValues.background;
+       if (mbPtr->gray == None) {
+           mbPtr->gray = Tk_GetBitmap(interp, mbPtr->tkwin,
+                   Tk_GetUid("gray50"));
+           if (mbPtr->gray == None) {
+               return TCL_ERROR;
+           }
+       }
+       gcValues.fill_style = FillStippled;
+       gcValues.stipple = mbPtr->gray;
+       mask = GCForeground|GCFillStyle|GCStipple;
+    }
+    newGC = Tk_GetGC(mbPtr->tkwin, mask, &gcValues);
+    if (mbPtr->disabledGC != None) {
+       Tk_FreeGC(mbPtr->disabledGC);
+    }
+    mbPtr->disabledGC = newGC;
+
+    if (mbPtr->padX < 0) {
+       mbPtr->padX = 0;
+    }
+    if (mbPtr->padY < 0) {
+       mbPtr->padY = 0;
+    }
+
+    /*
+     * Set up a trace on the menu button's variable, then initialize
+     * the variable if it doesn't already exist, so that it can be
+     * accessed immediately from Tcl code without fear of
+     * "nonexistent variable" errors.
+     */
+
+    value = Tcl_GetVar(interp, mbPtr->varName, TCL_GLOBAL_ONLY);
+    if (value == NULL) {
+       Tcl_SetVar(interp, mbPtr->varName, "", TCL_GLOBAL_ONLY);
+    }
+    Tcl_TraceVar(interp, mbPtr->varName,
+           TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+           MenuButtonVarProc, (ClientData) mbPtr);
+
+    /*
+     * Set up a trace on the variable that determines what's displayed
+     * in the menu button, if such a trace has been requested.
+     */
+
+    if ((mbPtr->bitmap == None) && (mbPtr->textVarName != NULL)) {
+       char *value;
+
+       value = Tcl_GetVar(interp, mbPtr->textVarName, TCL_GLOBAL_ONLY);
+       if (value == NULL) {
+           Tcl_SetVar(interp, mbPtr->textVarName, mbPtr->text,
+                   TCL_GLOBAL_ONLY);
+       } else {
+           if (mbPtr->text != NULL) {
+               ckfree(mbPtr->text);
+           }
+           mbPtr->text = ckalloc((unsigned) (strlen(value) + 1));
+           strcpy(mbPtr->text, value);
+       }
+       Tcl_TraceVar(interp, mbPtr->textVarName,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               MenuButtonTextVarProc, (ClientData) mbPtr);
+    }
+
+    /*
+     * Recompute the geometry for the button.
+     */
+
+    ComputeMenuButtonGeometry(mbPtr);
+
+    /*
+     * Lastly, arrange for the button to be redisplayed.
+     */
+
+    if (Tk_IsMapped(mbPtr->tkwin) && !(mbPtr->flags & REDRAW_PENDING)) {
+       Tk_DoWhenIdle(DisplayMenuButton, (ClientData) mbPtr);
+       mbPtr->flags |= REDRAW_PENDING;
+    }
+
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DisplayMenuButton --
+ *
+ *     This procedure is invoked to display a menubutton widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Commands are output to X to display the menubutton in its
+ *     current mode.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DisplayMenuButton(clientData)
+    ClientData clientData;     /* Information about widget. */
+{
+    register MenuButton *mbPtr = (MenuButton *) clientData;
+    GC gc;
+    Tk_3DBorder border;
+    Pixmap pixmap;
+    int x = 0;                 /* Initialization needed only to stop
+                                * compiler warning. */
+    int y;
+    register Tk_Window tkwin = mbPtr->tkwin;
+
+    mbPtr->flags &= ~REDRAW_PENDING;
+    if ((mbPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
+       return;
+    }
+
+    if ((mbPtr->state == tkDisabledUid) && (mbPtr->disabledFg != NULL)) {
+       gc = mbPtr->disabledGC;
+       border = mbPtr->normalBorder;
+    } else if (mbPtr->state == tkActiveUid) {
+       gc = mbPtr->activeTextGC;
+       border = mbPtr->activeBorder;
+    } else {
+       gc = mbPtr->normalTextGC;
+       border = mbPtr->normalBorder;
+    }
+
+    /*
+     * In order to avoid screen flashes, this procedure redraws
+     * the menu button in a pixmap, then copies the pixmap to the
+     * screen in a single operation.  This means that there's no
+     * point in time where the on-sreen image has been cleared.
+     */
+
+    pixmap = XCreatePixmap(Tk_Display(tkwin), Tk_WindowId(tkwin),
+           Tk_Width(tkwin), Tk_Height(tkwin),
+           Tk_DefaultDepth(Tk_Screen(tkwin)));
+    Tk_Fill3DRectangle(Tk_Display(tkwin), pixmap, border,
+           0, 0, Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT);
+
+    /*
+     * Display bitmap or text for button.
+     */
+
+    if (mbPtr->bitmap != None) {
+       unsigned int width, height;
+
+#if defined(USE_XPM3)
+       Tk_SizeOfPixmap(mbPtr->bitmap, &width, &height);
+#else
+       Tk_SizeOfBitmap(mbPtr->bitmap, &width, &height);
+#endif
+       switch (mbPtr->anchor) {
+           case TK_ANCHOR_NW: case TK_ANCHOR_W: case TK_ANCHOR_SW:
+               x += mbPtr->borderWidth + mbPtr->padX;
+               break;
+           case TK_ANCHOR_N: case TK_ANCHOR_CENTER: case TK_ANCHOR_S:
+               x += (Tk_Width(tkwin) - width)/2;
+               break;
+           default:
+               x += Tk_Width(tkwin) - mbPtr->borderWidth - mbPtr->padX
+                       - width;
+               break;
+       }
+       switch (mbPtr->anchor) {
+           case TK_ANCHOR_NW: case TK_ANCHOR_N: case TK_ANCHOR_NE:
+               y = mbPtr->borderWidth + mbPtr->padY;
+               break;
+           case TK_ANCHOR_W: case TK_ANCHOR_CENTER: case TK_ANCHOR_E:
+               y = (Tk_Height(tkwin) - height)/2;
+               break;
+           default:
+               y = Tk_Height(tkwin) - mbPtr->borderWidth - mbPtr->padY
+                       - height;
+               break;
+       }
+#if defined(USE_XPM3)        
+       XCopyArea(Tk_Display(tkwin), mbPtr->bitmap, pixmap,
+               gc, 0, 0, width, height, x, y);
+#else
+       XCopyPlane(Tk_Display(tkwin), mbPtr->bitmap, pixmap,
+               gc, 0, 0, width, height, x, y, 1);
+#endif
+    } else {
+       switch (mbPtr->anchor) {
+           case TK_ANCHOR_NW: case TK_ANCHOR_W: case TK_ANCHOR_SW:
+               x = mbPtr->borderWidth + mbPtr->padX + mbPtr->leftBearing;
+               break;
+           case TK_ANCHOR_N: case TK_ANCHOR_CENTER: case TK_ANCHOR_S:
+               x = (Tk_Width(tkwin) + mbPtr->leftBearing
+                       - mbPtr->rightBearing)/2;
+               break;
+           default:
+               x = Tk_Width(tkwin) - mbPtr->borderWidth - mbPtr->padX
+                       - mbPtr->rightBearing;
+               break;
+       }
+       switch (mbPtr->anchor) {
+           case TK_ANCHOR_NW: case TK_ANCHOR_N: case TK_ANCHOR_NE:
+               y = mbPtr->borderWidth + mbPtr->fontPtr->ascent
+                       + mbPtr->padY;
+               break;
+           case TK_ANCHOR_W: case TK_ANCHOR_CENTER: case TK_ANCHOR_E:
+               y = (Tk_Height(tkwin) + mbPtr->fontPtr->ascent
+                       - mbPtr->fontPtr->descent)/2;
+               break;
+           default:
+               y = Tk_Height(tkwin) - mbPtr->borderWidth - mbPtr->padY
+                       - mbPtr->fontPtr->descent;
+               break;
+       }
+       XDrawString(Tk_Display(tkwin), pixmap, gc, x, y, mbPtr->text,
+               mbPtr->textLength);
+       if (mbPtr->underline >= 0) {
+           TkUnderlineChars(Tk_Display(tkwin), pixmap, gc, mbPtr->fontPtr,
+                   mbPtr->text, x, y, TK_NEWLINES_NOT_SPECIAL,
+                   mbPtr->underline, mbPtr->underline);
+       }
+    }
+
+    /*
+     * If the menu button is disabled with a stipple rather than a special
+     * foreground color, generate the stippled effect.
+     */
+
+    if ((mbPtr->state == tkDisabledUid) && (mbPtr->disabledFg == NULL)) {
+       XFillRectangle(Tk_Display(tkwin), pixmap, mbPtr->disabledGC,
+               mbPtr->borderWidth, mbPtr->borderWidth,
+               (unsigned) (Tk_Width(tkwin) - 2*mbPtr->borderWidth),
+               (unsigned) (Tk_Height(tkwin) - 2*mbPtr->borderWidth));
+    }
+
+    /*
+     * Draw the border last.  This way, if the menu button's contents
+     * overflow onto the border they'll be covered up by the border.
+     */
+
+    if (mbPtr->relief != TK_RELIEF_FLAT) {
+       Tk_Draw3DRectangle(Tk_Display(tkwin), pixmap, border,
+               0, 0, Tk_Width(tkwin), Tk_Height(tkwin),
+               mbPtr->borderWidth, mbPtr->relief);
+    }
+
+    /*
+     * Copy the information from the off-screen pixmap onto the screen,
+     * then delete the pixmap.
+     */
+
+    XCopyArea(Tk_Display(tkwin), pixmap, Tk_WindowId(tkwin),
+       mbPtr->normalTextGC, 0, 0, Tk_Width(tkwin), Tk_Height(tkwin), 0, 0);
+    XFreePixmap(Tk_Display(tkwin), pixmap);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * MenuButtonEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher for various
+ *     events on buttons.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the window gets deleted, internal structures get
+ *     cleaned up.  When it gets exposed, it is redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+MenuButtonEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    XEvent *eventPtr;          /* Information about event. */
+{
+    MenuButton *mbPtr = (MenuButton *) clientData;
+    if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {
+       if ((mbPtr->tkwin != NULL) && !(mbPtr->flags & REDRAW_PENDING)) {
+           Tk_DoWhenIdle(DisplayMenuButton, (ClientData) mbPtr);
+           mbPtr->flags |= REDRAW_PENDING;
+       }
+    } else if (eventPtr->type == DestroyNotify) {
+       Tcl_DeleteCommand(mbPtr->interp, Tk_PathName(mbPtr->tkwin));
+
+       /*
+        * Careful!  Must delete the event-sharing information here
+        * rather than in DestroyMenuButton.  By the time that procedure
+        * is called the tkwin may have been reused, resulting in some
+        * other window accidentally being cut off from shared events.
+        */
+
+       Tk_UnshareEvents(mbPtr->tkwin, mbPtr->varName);
+       mbPtr->tkwin = NULL;
+       if (mbPtr->flags & REDRAW_PENDING) {
+           Tk_CancelIdleCall(DisplayMenuButton, (ClientData) mbPtr);
+       }
+       Tk_EventuallyFree((ClientData) mbPtr, DestroyMenuButton);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ComputeMenuButtonGeometry --
+ *
+ *     After changes in a menu button's text or bitmap, this procedure
+ *     recomputes the menu button's geometry and passes this information
+ *     along to the geometry manager for the window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The menu button's window may change size.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ComputeMenuButtonGeometry(mbPtr)
+    register MenuButton *mbPtr;                /* Widget record for menu button. */
+{
+    XCharStruct bbox;
+    int dummy;
+    unsigned int width, height;
+
+    if (mbPtr->bitmap != None) {
+#if defined(USE_XPM3)
+        Tk_SizeOfPixmap(mbPtr->bitmap, &width, &height);
+#else
+        Tk_SizeOfBitmap(mbPtr->bitmap, &width, &height);
+#endif
+       if (mbPtr->width > 0) {
+           width = mbPtr->width;
+       }
+       if (mbPtr->height > 0) {
+           height = mbPtr->height;
+       }
+    } else {
+       mbPtr->textLength = strlen(mbPtr->text);
+       XTextExtents(mbPtr->fontPtr, mbPtr->text, mbPtr->textLength,
+               &dummy, &dummy, &dummy, &bbox);
+       mbPtr->leftBearing = bbox.lbearing;
+       mbPtr->rightBearing = bbox.rbearing;
+       width = bbox.lbearing + bbox.rbearing;
+       height = mbPtr->fontPtr->ascent + mbPtr->fontPtr->descent;
+       if (mbPtr->width > 0) {
+           width = mbPtr->width * XTextWidth(mbPtr->fontPtr, "0", 1);
+       }
+       if (mbPtr->height > 0) {
+           height *= mbPtr->height;
+       }
+    }
+
+    width += 2*mbPtr->padX;
+    height += 2*mbPtr->padY;
+    Tk_GeometryRequest(mbPtr->tkwin, (int) (width + 2*mbPtr->borderWidth),
+           (int) (height + 2*mbPtr->borderWidth));
+    Tk_SetInternalBorder(mbPtr->tkwin, mbPtr->borderWidth);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * MenuButtonVarProc --
+ *
+ *     This procedure is invoked when someone changes the
+ *     state variable associated with a menubutton.  This causes
+ *     the posted/unposted state of the menu to change if needed
+ *     to match the variable's new value.
+ *
+ * Results:
+ *     NULL is always returned.
+ *
+ * Side effects:
+ *     The menu may be posted or unposted.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static char *
+MenuButtonVarProc(clientData, interp, name1, name2, flags)
+    ClientData clientData;     /* Information about button. */
+    Tcl_Interp *interp;                /* Interpreter containing variable. */
+    char *name1;               /* First part of variable's name. */
+    char *name2;               /* Second part of variable's name. */
+    int flags;                 /* Describes what's happening to variable. */
+{
+    register MenuButton *mbPtr = (MenuButton *) clientData;
+    char *value;
+    int newFlags;
+
+    /*
+     * If the variable is being unset, then just re-establish the
+     * trace unless the whole interpreter is going away.  Also unpost
+     * the menu.
+     */
+
+    newFlags = mbPtr->flags;
+    if (flags & TCL_TRACE_UNSETS) {
+       newFlags &= ~POSTED;
+       if ((flags & TCL_TRACE_DESTROYED) && !(flags & TCL_INTERP_DESTROYED)) {
+           Tcl_TraceVar2(interp, name1, name2,
+                   TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+                   MenuButtonVarProc, clientData);
+       }
+    } else {
+
+       /*
+        * Use the value of the variable to update the posted status of
+        * the menu.
+        */
+    
+       value = Tcl_GetVar2(interp, name1, name2, flags & TCL_GLOBAL_ONLY);
+       if (strcmp(value, Tk_PathName(mbPtr->tkwin)) == 0) {
+           newFlags |= POSTED;
+       } else {
+           newFlags &= ~POSTED;
+       }
+    }
+
+    if ((mbPtr->menuName != NULL) && (newFlags != mbPtr->flags)) {
+       mbPtr->flags = newFlags;
+       if (newFlags & POSTED) {
+           int x, y;
+           char string[50];
+
+           /*
+            * Post the menu just below the menu button.
+            */
+
+           Tk_GetRootCoords(mbPtr->tkwin, &x, &y);
+           y += Tk_Height(mbPtr->tkwin);
+           sprintf(string, "%d %d ", x, y);
+           if (Tcl_VarEval(interp, mbPtr->menuName, " post ", string,
+                   mbPtr->varName, (char *) NULL) != TCL_OK) {
+               TkBindError(interp);
+           }
+       } else {
+           if (Tcl_VarEval(interp, mbPtr->menuName, " unpost",
+                   (char *) NULL) != TCL_OK) {
+               TkBindError(interp);
+           }
+       }
+    }
+    return (char *) NULL;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * MenuButtonTextVarProc --
+ *
+ *     This procedure is invoked when someone changes the variable
+ *     whose contents are to be displayed in a menu button.
+ *
+ * Results:
+ *     NULL is always returned.
+ *
+ * Side effects:
+ *     The text displayed in the menu button will change to match the
+ *     variable.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static char *
+MenuButtonTextVarProc(clientData, interp, name1, name2, flags)
+    ClientData clientData;     /* Information about button. */
+    Tcl_Interp *interp;                /* Interpreter containing variable. */
+    char *name1;               /* Name of variable. */
+    char *name2;               /* Second part of variable name. */
+    int flags;                 /* Information about what happened. */
+{
+    register MenuButton *mbPtr = (MenuButton *) clientData;
+    char *value;
+
+    /*
+     * If the variable is unset, then immediately recreate it unless
+     * the whole interpreter is going away.
+     */
+
+    if (flags & TCL_TRACE_UNSETS) {
+       if ((flags & TCL_TRACE_DESTROYED) && !(flags & TCL_INTERP_DESTROYED)) {
+           Tcl_SetVar2(interp, name1, name2, mbPtr->text,
+                   flags & TCL_GLOBAL_ONLY);
+           Tcl_TraceVar2(interp, name1, name2,
+                   TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+                   MenuButtonTextVarProc, clientData);
+       }
+       return (char *) NULL;
+    }
+
+    value = Tcl_GetVar2(interp, name1, name2, flags & TCL_GLOBAL_ONLY);
+    if (value == NULL) {
+       value = "";
+    }
+    if (mbPtr->text != NULL) {
+       ckfree(mbPtr->text);
+    }
+    mbPtr->text = ckalloc((unsigned) (strlen(value) + 1));
+    strcpy(mbPtr->text, value);
+    ComputeMenuButtonGeometry(mbPtr);
+
+    if ((mbPtr->tkwin != NULL) && Tk_IsMapped(mbPtr->tkwin)
+           && !(mbPtr->flags & REDRAW_PENDING)) {
+       Tk_DoWhenIdle(DisplayMenuButton, (ClientData) mbPtr);
+       mbPtr->flags |= REDRAW_PENDING;
+    }
+    return (char *) NULL;
+}
diff --git a/src/tk/tkmsg.c b/src/tk/tkmsg.c
new file mode 100644 (file)
index 0000000..8e5adcc
--- /dev/null
@@ -0,0 +1,788 @@
+/* 
+ * tkMessage.c --
+ *
+ *     This module implements a message widgets for the Tk
+ *     toolkit.  A message widget displays a multi-line string
+ *     in a window according to a particular aspect ratio.
+ *
+ * Copyright 1990 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkMessage.c,v 1.36 92/06/08 11:06:05 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "default.h"
+#include "tkint.h"
+
+/*
+ * A data structure of the following type is kept for each message
+ * widget managed by this file:
+ */
+
+typedef struct {
+    Tk_Window tkwin;           /* Window that embodies the message.  NULL
+                                * means that the window has been destroyed
+                                * but the data structures haven't yet been
+                                * cleaned up.*/
+    Tcl_Interp *interp;                /* Interpreter associated with message. */
+    Tk_Uid string;             /* String displayed in message. */
+    int numChars;              /* Number of characters in string, not
+                                * including terminating NULL character. */
+    char *textVarName;         /* Name of variable (malloc'ed) or NULL.
+                                * If non-NULL, message displays the contents
+                                * of this variable. */
+
+    /*
+     * Information used when displaying widget:
+     */
+
+    Tk_3DBorder border;                /* Structure used to draw 3-D border and
+                                * background.  NULL means a border hasn't
+                                * been created yet. */
+    int borderWidth;           /* Width of border. */
+    int relief;                        /* 3-D effect: TK_RELIEF_RAISED, etc. */
+    XFontStruct *fontPtr;      /* Information about text font, or NULL. */
+    XColor *fgColorPtr;                /* Foreground color in normal mode. */
+    GC textGC;                 /* GC for drawing text in normal mode. */
+    int padX, padY;            /* User-requested extra space around text. */
+    Tk_Anchor anchor;          /* Where to position text within window region
+                                * if window is larger or smaller than
+                                * needed. */
+    int width;                 /* User-requested width, in pixels.  0 means
+                                * compute width using aspect ratio below. */
+    int aspect;                        /* Desired aspect ratio for window
+                                * (100*width/height). */
+    int lineLength;            /* Length of each line, in pixels.  Computed
+                                * from width and/or aspect. */
+    int msgHeight;             /* Total number of pixels in vertical direction
+                                * needed to display message. */
+    Tk_Justify justify;                /* Justification for text. */
+
+    /*
+     * Miscellaneous information:
+     */
+
+    Cursor cursor;             /* Current cursor for window, or None. */
+    int flags;                 /* Various flags;  see below for
+                                * definitions. */
+} Message;
+
+/*
+ * Flag bits for messages:
+ *
+ * REDRAW_PENDING:             Non-zero means a DoWhenIdle handler
+ *                             has already been queued to redraw
+ *                             this window.
+ * CLEAR_NEEDED;               Need to clear the window when redrawing.
+ */
+
+#define REDRAW_PENDING         1
+#define CLEAR_NEEDED           2
+
+/*
+ * Information used for argv parsing.
+ */
+
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_ANCHOR, "-anchor", "anchor", "Anchor",
+       DEF_MESSAGE_ANCHOR, Tk_Offset(Message, anchor), 0},
+    {TK_CONFIG_INT, "-aspect", "aspect", "Aspect",
+       DEF_MESSAGE_ASPECT, Tk_Offset(Message, aspect), 0},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_MESSAGE_BG_COLOR, Tk_Offset(Message, border),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_MESSAGE_BG_MONO, Tk_Offset(Message, border),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       DEF_MESSAGE_BORDER_WIDTH, Tk_Offset(Message, borderWidth), 0},
+    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",
+       DEF_MESSAGE_CURSOR, Tk_Offset(Message, cursor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_FONT, "-font", "font", "Font",
+       DEF_MESSAGE_FONT, Tk_Offset(Message, fontPtr), 0},
+    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",
+       DEF_MESSAGE_FG, Tk_Offset(Message, fgColorPtr), 0},
+    {TK_CONFIG_JUSTIFY, "-justify", "justify", "Justify",
+       DEF_MESSAGE_JUSTIFY, Tk_Offset(Message, justify), 0},
+    {TK_CONFIG_PIXELS, "-padx", "padX", "Pad",
+       DEF_MESSAGE_PADX, Tk_Offset(Message, padX), 0},
+    {TK_CONFIG_PIXELS, "-pady", "padY", "Pad",
+       DEF_MESSAGE_PADY, Tk_Offset(Message, padY), 0},
+    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
+       DEF_MESSAGE_RELIEF, Tk_Offset(Message, relief), 0},
+    {TK_CONFIG_STRING, "-text", "text", "Text",
+       DEF_MESSAGE_TEXT, Tk_Offset(Message, string), 0},
+    {TK_CONFIG_STRING, "-textvariable", "textVariable", "Variable",
+       DEF_MESSAGE_TEXT_VARIABLE, Tk_Offset(Message, textVarName),
+       TK_CONFIG_NULL_OK},
+    {TK_CONFIG_PIXELS, "-width", "width", "Width",
+       DEF_MESSAGE_WIDTH, Tk_Offset(Message, width), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            MessageEventProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static char *          MessageTextVarProc _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, char *name1, char *name2,
+                           int flags));
+static int             MessageWidgetCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+static void            ComputeMessageGeometry _ANSI_ARGS_((Message *msgPtr));
+static int             ConfigureMessage _ANSI_ARGS_((Tcl_Interp *interp,
+                           Message *msgPtr, int argc, char **argv,
+                           int flags));
+static void            DestroyMessage _ANSI_ARGS_((ClientData clientData));
+static void            DisplayMessage _ANSI_ARGS_((ClientData clientData));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_MessageCmd --
+ *
+ *     This procedure is invoked to process the "message" Tcl
+ *     command.  See the user documentation for details on what
+ *     it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_MessageCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    register Message *msgPtr;
+    Tk_Window new;
+    Tk_Window tkwin = (Tk_Window) clientData;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args:  should be \"",
+               argv[0], " pathName ?options?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], (char *) NULL);
+    if (new == NULL) {
+       return TCL_ERROR;
+    }
+
+    msgPtr = (Message *) ckalloc(sizeof(Message));
+    msgPtr->tkwin = new;
+    msgPtr->interp = interp;
+    msgPtr->string = NULL;
+    msgPtr->textVarName = NULL;
+    msgPtr->border = NULL;
+    msgPtr->borderWidth = 0;
+    msgPtr->relief = TK_RELIEF_FLAT;
+    msgPtr->fontPtr = NULL;
+    msgPtr->fgColorPtr = NULL;
+    msgPtr->textGC = NULL;
+    msgPtr->padX = 0;
+    msgPtr->padY = 0;
+    msgPtr->width = 0;
+    msgPtr->aspect = 150;
+    msgPtr->justify = TK_JUSTIFY_LEFT;
+    msgPtr->cursor = None;
+    msgPtr->flags = 0;
+
+    Tk_SetClass(msgPtr->tkwin, "Message");
+    Tk_CreateEventHandler(msgPtr->tkwin, ExposureMask|StructureNotifyMask,
+           MessageEventProc, (ClientData) msgPtr);
+    Tcl_CreateCommand(interp, Tk_PathName(msgPtr->tkwin), MessageWidgetCmd,
+           (ClientData) msgPtr, (void (*)()) NULL);
+    if (ConfigureMessage(interp, msgPtr, argc-2, argv+2, 0) != TCL_OK) {
+       goto error;
+    }
+
+    interp->result = Tk_PathName(msgPtr->tkwin);
+    return TCL_OK;
+
+    error:
+    Tk_DestroyWindow(msgPtr->tkwin);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * MessageWidgetCmd --
+ *
+ *     This procedure is invoked to process the Tcl command
+ *     that corresponds to a widget managed by this module.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+MessageWidgetCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Information about message widget. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    register Message *msgPtr = (Message *) clientData;
+    int length;
+    char c;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)) {
+       if (argc == 2) {
+           return Tk_ConfigureInfo(interp, msgPtr->tkwin, configSpecs,
+                   (char *) msgPtr, (char *) NULL, 0);
+       } else if (argc == 3) {
+           return Tk_ConfigureInfo(interp, msgPtr->tkwin, configSpecs,
+                   (char *) msgPtr, argv[2], 0);
+       } else {
+           return ConfigureMessage(interp, msgPtr, argc-2, argv+2,
+                   TK_CONFIG_ARGV_ONLY);
+       }
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\":  must be configure", (char *) NULL);
+       return TCL_ERROR;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyMessage --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a message at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the message is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyMessage(clientData)
+    ClientData clientData;     /* Info about message widget. */
+{
+    register Message *msgPtr = (Message *) clientData;
+
+    if (msgPtr->string != NULL) {
+       ckfree(msgPtr->string);
+    }
+    if (msgPtr->textVarName != NULL) {
+       Tcl_UntraceVar(msgPtr->interp, msgPtr->textVarName,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               MessageTextVarProc, (ClientData) msgPtr);
+       ckfree(msgPtr->textVarName);
+    }
+    if (msgPtr->border != NULL) {
+       Tk_Free3DBorder(msgPtr->border);
+    }
+    if (msgPtr->fontPtr != NULL) {
+       Tk_FreeFontStruct(msgPtr->fontPtr);
+    }
+    if (msgPtr->fgColorPtr != NULL) {
+       Tk_FreeColor(msgPtr->fgColorPtr);
+    }
+    if (msgPtr->textGC != None) {
+       Tk_FreeGC(msgPtr->textGC);
+    }
+    if (msgPtr->cursor != None) {
+       Tk_FreeCursor(msgPtr->cursor);
+    }
+    ckfree((char *) msgPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureMessage --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or
+ *     reconfigure) a message widget.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information, such as text string, colors, font,
+ *     etc. get set for msgPtr;  old resources get freed, if there
+ *     were any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureMessage(interp, msgPtr, argc, argv, flags)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    register Message *msgPtr;  /* Information about widget;  may or may
+                                * not already have values for some fields. */
+    int argc;                  /* Number of valid entries in argv. */
+    char **argv;               /* Arguments. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    XGCValues gcValues;
+    GC newGC;
+
+    /*
+     * Eliminate any existing trace on a variable monitored by the message.
+     */
+
+    if (msgPtr->textVarName != NULL) {
+       Tcl_UntraceVar(interp, msgPtr->textVarName, 
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               MessageTextVarProc, (ClientData) msgPtr);
+    }
+
+    if (Tk_ConfigureWidget(interp, msgPtr->tkwin, configSpecs,
+           argc, argv, (char *) msgPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * If the message is to display the value of a variable, then set up
+     * a trace on the variable's value, create the variable if it doesn't
+     * exist, and fetch its current value.
+     */
+
+    if (msgPtr->textVarName != NULL) {
+       char *value;
+
+       value = Tcl_GetVar(interp, msgPtr->textVarName, TCL_GLOBAL_ONLY);
+       if (value == NULL) {
+           Tcl_SetVar(interp, msgPtr->textVarName, msgPtr->string,
+                   TCL_GLOBAL_ONLY);
+       } else {
+           if (msgPtr->string != NULL) {
+               ckfree(msgPtr->string);
+           }
+           msgPtr->string = ckalloc((unsigned) (strlen(value) + 1));
+           strcpy(msgPtr->string, value);
+       }
+       Tcl_TraceVar(interp, msgPtr->textVarName,
+               TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+               MessageTextVarProc, (ClientData) msgPtr);
+    }
+
+    /*
+     * A few other options need special processing, such as setting
+     * the background from a 3-D border or handling special defaults
+     * that couldn't be specified to Tk_ConfigureWidget.
+     */
+
+    msgPtr->numChars = strlen(msgPtr->string);
+
+    Tk_SetBackgroundFromBorder(msgPtr->tkwin, msgPtr->border);
+
+    gcValues.font = msgPtr->fontPtr->fid;
+    gcValues.foreground = msgPtr->fgColorPtr->pixel;
+    newGC = Tk_GetGC(msgPtr->tkwin, GCForeground|GCFont,
+           &gcValues);
+    if (msgPtr->textGC != None) {
+       Tk_FreeGC(msgPtr->textGC);
+    }
+    msgPtr->textGC = newGC;
+
+    if (msgPtr->padX == -1) {
+       msgPtr->padX = msgPtr->fontPtr->ascent/2;
+    }
+
+    if (msgPtr->padY == -1) {
+       msgPtr->padY = msgPtr->fontPtr->ascent/4;
+    }
+
+    if (msgPtr->justify == TK_JUSTIFY_FILL) {
+       interp->result = "can't use \"fill\" justify style in messages";
+       return TCL_ERROR;
+    }
+
+    /*
+     * Recompute the desired geometry for the window, and arrange for
+     * the window to be redisplayed.
+     */
+
+    ComputeMessageGeometry(msgPtr);
+    if ((msgPtr->tkwin != NULL) && Tk_IsMapped(msgPtr->tkwin)
+           && !(msgPtr->flags & REDRAW_PENDING)) {
+       Tk_DoWhenIdle(DisplayMessage, (ClientData) msgPtr);
+       msgPtr->flags |= REDRAW_PENDING|CLEAR_NEEDED;
+    }
+
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ComputeMessageGeometry --
+ *
+ *     Compute the desired geometry for a message window,
+ *     taking into account the desired aspect ratio for the
+ *     window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Tk_GeometryRequest is called to inform the geometry
+ *     manager of the desired geometry for this window.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ComputeMessageGeometry(msgPtr)
+    register Message *msgPtr;  /* Information about window. */
+{
+    char *p;
+    int width, inc, height, numLines;
+    int thisWidth, maxWidth;
+    int aspect, lowerBound, upperBound;
+
+    /*
+     * Compute acceptable bounds for the final aspect ratio.
+     */
+    aspect = msgPtr->aspect/10;
+    if (aspect < 5) {
+       aspect = 5;
+    }
+    lowerBound = msgPtr->aspect - aspect;
+    upperBound = msgPtr->aspect + aspect;
+
+    /*
+     * Do the computation in multiple passes:  start off with
+     * a very wide window, and compute its height.  Then change
+     * the width and try again.  Reduce the size of the change
+     * and iterate until dimensions are found that approximate
+     * the desired aspect ratio.  Or, if the user gave an explicit
+     * width then just use that.
+     */
+
+    if (msgPtr->width > 0) {
+       width = msgPtr->width;
+       inc = 0;
+    } else {
+       width = WidthOfScreen(Tk_Screen(msgPtr->tkwin))/2;
+       inc = width/2;
+    }
+    for ( ; ; inc /= 2) {
+       maxWidth = 0;
+       for (numLines = 1, p = msgPtr->string; ; numLines++)  {
+           if (*p == '\n') {
+               p++;
+               continue;
+           }
+           p += TkMeasureChars(msgPtr->fontPtr, p,
+                   msgPtr->numChars - (p - msgPtr->string), 0, width,
+                   TK_WHOLE_WORDS|TK_AT_LEAST_ONE, &thisWidth);
+           if (thisWidth > maxWidth) {
+               maxWidth = thisWidth;
+           }
+           if (*p == 0) {
+               break;
+           }
+
+           /*
+            * Skip spaces and tabs at the beginning of a line, unless
+            * they follow a user-requested newline.
+            */
+
+           while (isspace(*p)) {
+               if (*p == '\n') {
+                   p++;
+                   break;
+               }
+               p++;
+           }
+       }
+
+       height = numLines * (msgPtr->fontPtr->ascent
+               + msgPtr->fontPtr->descent) + 2*msgPtr->borderWidth
+               + 2*msgPtr->padY;
+       if (inc <= 2) {
+           break;
+       }
+       aspect = (100*(maxWidth + 2*msgPtr->borderWidth
+               + 2*msgPtr->padX))/height;
+       if (aspect < lowerBound) {
+           width += inc;
+       } else if (aspect > upperBound) {
+           width -= inc;
+       } else {
+           break;
+       }
+    }
+    msgPtr->lineLength = maxWidth;
+    msgPtr->msgHeight = numLines * (msgPtr->fontPtr->ascent
+               + msgPtr->fontPtr->descent);
+    Tk_GeometryRequest(msgPtr->tkwin,
+           maxWidth + 2*msgPtr->borderWidth + 2*msgPtr->padX, height);
+    Tk_SetInternalBorder(msgPtr->tkwin, msgPtr->borderWidth);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayMessage --
+ *
+ *     This procedure redraws the contents of a message window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information appears on the screen.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayMessage(clientData)
+    ClientData clientData;     /* Information about window. */
+{
+    register Message *msgPtr = (Message *) clientData;
+    register Tk_Window tkwin = msgPtr->tkwin;
+    char *p;
+    int x, y, lineLength, numChars, charsLeft;
+
+    msgPtr->flags &= ~REDRAW_PENDING;
+    if ((msgPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
+       return;
+    }
+    if (msgPtr->flags & CLEAR_NEEDED) {
+       XClearWindow(Tk_Display(tkwin), Tk_WindowId(tkwin));
+       msgPtr->flags &= ~CLEAR_NEEDED;
+    }
+
+    /*
+     * Compute starting y-location for message based on message size
+     * and anchor option.
+     */
+
+    switch (msgPtr->anchor) {
+       case TK_ANCHOR_NW: case TK_ANCHOR_N: case TK_ANCHOR_NE:
+           y = msgPtr->borderWidth + msgPtr->padY;
+           break;
+       case TK_ANCHOR_W: case TK_ANCHOR_CENTER: case TK_ANCHOR_E:
+           y = (Tk_Height(tkwin) - msgPtr->msgHeight)/2;
+           break;
+       default:
+           y = Tk_Height(tkwin) - msgPtr->borderWidth - msgPtr->padY
+                   - msgPtr->msgHeight;
+           break;
+    }
+    y += msgPtr->fontPtr->ascent;
+
+    /*
+     * Work through the string to display one line at a time.
+     * Display each line in three steps.  First compute the
+     * line's width, then figure out where to display the
+     * line to justify it properly, then display the line.
+     */
+
+    for (p = msgPtr->string, charsLeft = msgPtr->numChars; *p != 0;
+           y += msgPtr->fontPtr->ascent + msgPtr->fontPtr->descent) {
+       if (*p == '\n') {
+           p++;
+           charsLeft--;
+           continue;
+       }
+       numChars = TkMeasureChars(msgPtr->fontPtr, p, charsLeft, 0,
+               msgPtr->lineLength, TK_WHOLE_WORDS|TK_AT_LEAST_ONE,
+               &lineLength);
+       switch (msgPtr->anchor) {
+           case TK_ANCHOR_NW: case TK_ANCHOR_W: case TK_ANCHOR_SW:
+               x = msgPtr->borderWidth + msgPtr->padX;
+               break;
+           case TK_ANCHOR_N: case TK_ANCHOR_CENTER: case TK_ANCHOR_S:
+               x = (Tk_Width(tkwin) - msgPtr->lineLength)/2;
+               break;
+           default:
+               x = Tk_Width(tkwin) - msgPtr->borderWidth - msgPtr->padX
+                       - msgPtr->lineLength;
+               break;
+       }
+       if (msgPtr->justify == TK_JUSTIFY_CENTER) {
+           x += (msgPtr->lineLength - lineLength)/2;
+       } else if (msgPtr->justify == TK_JUSTIFY_RIGHT) {
+           x += msgPtr->lineLength - lineLength;
+       }
+       TkDisplayChars(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               msgPtr->textGC, msgPtr->fontPtr, p, numChars, x, y, 0);
+       p += numChars;
+       charsLeft -= numChars;
+
+       /*
+        * Skip blanks at the beginning of a line, unless they follow
+        * a user-requested newline.
+        */
+
+       while (isspace(*p)) {
+           charsLeft--;
+           if (*p == '\n') {
+               p++;
+               break;
+           }
+           p++;
+       }
+    }
+
+    if (msgPtr->relief != TK_RELIEF_FLAT) {
+       Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               msgPtr->border, 0, 0, Tk_Width(tkwin), Tk_Height(tkwin),
+               msgPtr->borderWidth, msgPtr->relief);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * MessageEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher for various
+ *     events on messages.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the window gets deleted, internal structures get
+ *     cleaned up.  When it gets exposed, it is redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+MessageEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    XEvent *eventPtr;          /* Information about event. */
+{
+    Message *msgPtr = (Message *) clientData;
+
+    if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {
+       if ((msgPtr->tkwin != NULL) && !(msgPtr->flags & REDRAW_PENDING)) {
+           Tk_DoWhenIdle(DisplayMessage, (ClientData) msgPtr);
+           msgPtr->flags |= REDRAW_PENDING;
+       }
+    } else if (eventPtr->type == DestroyNotify) {
+       Tcl_DeleteCommand(msgPtr->interp, Tk_PathName(msgPtr->tkwin));
+       msgPtr->tkwin = NULL;
+       if (msgPtr->flags & REDRAW_PENDING) {
+           Tk_CancelIdleCall(DisplayMessage, (ClientData) msgPtr);
+       }
+       Tk_EventuallyFree((ClientData) msgPtr, DestroyMessage);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * MessageTextVarProc --
+ *
+ *     This procedure is invoked when someone changes the variable
+ *     whose contents are to be displayed in a message.
+ *
+ * Results:
+ *     NULL is always returned.
+ *
+ * Side effects:
+ *     The text displayed in the message will change to match the
+ *     variable.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static char *
+MessageTextVarProc(clientData, interp, name1, name2, flags)
+    ClientData clientData;     /* Information about message. */
+    Tcl_Interp *interp;                /* Interpreter containing variable. */
+    char *name1;               /* Name of variable. */
+    char *name2;               /* Second part of variable name. */
+    int flags;                 /* Information about what happened. */
+{
+    register Message *msgPtr = (Message *) clientData;
+    char *value;
+
+    /*
+     * If the variable is unset, then immediately recreate it unless
+     * the whole interpreter is going away.
+     */
+
+    if (flags & TCL_TRACE_UNSETS) {
+       if ((flags & TCL_TRACE_DESTROYED) && !(flags & TCL_INTERP_DESTROYED)) {
+           Tcl_SetVar2(interp, name1, name2, msgPtr->string,
+                   flags & TCL_GLOBAL_ONLY);
+           Tcl_TraceVar2(interp, name1, name2,
+                   TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
+                   MessageTextVarProc, clientData);
+       }
+       return (char *) NULL;
+    }
+
+    value = Tcl_GetVar2(interp, name1, name2, flags & TCL_GLOBAL_ONLY);
+    if (value == NULL) {
+       value = "";
+    }
+    if (msgPtr->string != NULL) {
+       ckfree(msgPtr->string);
+    }
+    msgPtr->numChars = strlen(value);
+    msgPtr->string = ckalloc((unsigned) (msgPtr->numChars + 1));
+    strcpy(msgPtr->string, value);
+    ComputeMessageGeometry(msgPtr);
+
+    msgPtr->flags |= CLEAR_NEEDED;
+    if ((msgPtr->tkwin != NULL) && Tk_IsMapped(msgPtr->tkwin)
+           && !(msgPtr->flags & REDRAW_PENDING)) {
+       Tk_DoWhenIdle(DisplayMessage, (ClientData) msgPtr);
+       msgPtr->flags |= REDRAW_PENDING;
+    }
+    return (char *) NULL;
+}
diff --git a/src/tk/tkoption.c b/src/tk/tkoption.c
new file mode 100644 (file)
index 0000000..acdc655
--- /dev/null
@@ -0,0 +1,1336 @@
+/* 
+ * tkOption.c --
+ *
+ *     This module contains procedures to manage the option
+ *     database, which allows various strings to be associated
+ *     with windows either by name or by class or both.
+ *
+ * Copyright 1990 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkOption.c,v 1.25 92/03/16 08:46:14 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tkint.h"
+
+/*
+ * The option database is stored as one tree for each main window.
+ * Each name or class field in an option is associated with a node or
+ * leaf of the tree.  For example, the options "x.y.z" and "x.y*a"
+ * each correspond to three nodes in the tree;  they share the nodes
+ * "x" and "x.y", but have different leaf nodes.  One of the following
+ * structures exists for each node or leaf in the option tree.  It is
+ * actually stored as part of the parent node, and describes a particular
+ * child of the parent.
+ */
+
+typedef struct Element {
+    Tk_Uid nameUid;                    /* Name or class from one element of
+                                        * an option spec. */
+    union {
+       struct ElArray *arrayPtr;       /* If this is an intermediate node,
+                                        * a pointer to a structure describing
+                                        * the remaining elements of all
+                                        * options whose prefixes are the
+                                        * same up through this element. */
+       Tk_Uid valueUid;                /* For leaf nodes, this is the string
+                                        * value of the option. */
+    } child;
+    int priority;                      /* Used to select among matching
+                                        * options.  Includes both the
+                                        * priority level and a serial #.
+                                        * Greater value means higher
+                                        * priority.  Irrelevant except in
+                                        * leaf nodes. */
+    int flags;                         /* OR-ed combination of bits.  See
+                                        * below for values. */
+} Element;
+
+/*
+ * Flags in NodeElement structures:
+ *
+ * CLASS -             Non-zero means this element refers to a class,
+ *                     Zero means this element refers to a name.
+ * NODE -              Zero means this is a leaf element (the child
+ *                     field is a value, not a pointer to another node).
+ *                     One means this is a node element.
+ * WILDCARD -          Non-zero means this there was a star in the
+ *                     original specification just before this element.
+ *                     Zero means there was a dot.
+ */
+
+#define TYPE_MASK              0x7
+
+#define CLASS                  0x1
+#define NODE                   0x2
+#define WILDCARD               0x4
+
+#define EXACT_LEAF_NAME                0x0
+#define EXACT_LEAF_CLASS       0x1
+#define EXACT_NODE_NAME                0x2
+#define EXACT_NODE_CLASS       0x3
+#define WILDCARD_LEAF_NAME     0x4
+#define WILDCARD_LEAF_CLASS    0x5
+#define WILDCARD_NODE_NAME     0x6
+#define WILDCARD_NODE_CLASS    0x7
+
+/*
+ * The following structure is used to manage a dynamic array of
+ * Elements.  These structures are used for two purposes:  to store
+ * the contents of a node in the option tree, and for the option
+ * stacks described below.
+ */
+
+typedef struct ElArray {
+    int arraySize;             /* Number of elements actually
+                                * allocated in the "els" array. */
+    int numUsed;               /* Number of elements currently in
+                                * use out of els. */
+    Element *nextToUse;                /* Pointer to &els[numUsed]. */
+    Element els[1];            /* Array of structures describing
+                                * children of this node.  The
+                                * array will actually contain enough
+                                * elements for all of the children
+                                * (and even a few extras, perhaps).
+                                * This must be the last field in
+                                * the structure. */
+} ElArray;
+
+#define EL_ARRAY_SIZE(numEls) ((unsigned) (sizeof(ElArray) \
+       + ((numEls)-1)*sizeof(Element)))
+#define INITIAL_SIZE 5
+
+/*
+ * In addition to the option tree, which is a relatively static structure,
+ * there are eight additional structures called "stacks", which are used
+ * to speed up queries into the option database.  The stack structures
+ * are designed for the situation where an individual widget makes repeated
+ * requests for its particular options.  The requests differ only in
+ * their last name/class, so during the first request we extract all
+ * the options pertaining to the particular widget and save them in a
+ * stack-like cache;  subsequent requests for the same widget can search
+ * the cache relatively quickly.  In fact, the cache is a hierarchical
+ * one, storing a list of relevant options for this widget and all of
+ * its ancestors up to the application root;  hence the name "stack".
+ *
+ * Each of the eight stacks consists of an array of Elements, ordered in
+ * terms of levels in the window hierarchy.  All the elements relevant
+ * for the top-level widget appear first in the array, followed by all
+ * those from the next-level widget on the path to the current widget,
+ * etc. down to those for the current widget.
+ *
+ * Cached information is divided into eight stacks according to the
+ * CLASS, NODE, and WILDCARD flags.  Leaf and non-leaf information is
+ * kept separate to speed up individual probes (non-leaf information is
+ * only relevant when building the stacks, but isn't relevant when
+ * making probes;  similarly, only non-leaf information is relevant
+ * when the stacks are being extended to the next widget down in the
+ * widget hierarchy).  Wildcard elements are handled separately from
+ * "exact" elements because once they appear at a particular level in
+ * the stack they remain active for all deeper levels;  exact elements
+ * are only relevant at a particular level.  For example, when searching
+ * for options relevant in a particular window, the entire wildcard
+ * stacks get checked, but only the portions of the exact stacks that
+ * pertain to the window's parent.  Lastly, name and class stacks are
+ * kept separate because different search keys are used when searching
+ * them;  keeping them separate speeds up the searches.
+ */
+
+#define NUM_STACKS 8
+static ElArray *stacks[NUM_STACKS];
+static TkWindow *cachedWindow = NULL;  /* Lowest-level window currently
+                                        * loaded in stacks at present. 
+                                        * NULL means stacks have never
+                                        * been used, or have been
+                                        * invalidated because of a change
+                                        * to the database. */
+
+/*
+ * One of the following structures is used to keep track of each
+ * level in the stacks.
+ */
+
+typedef struct StackLevel {
+    TkWindow *winPtr;          /* Window corresponding to this stack
+                                * level. */
+    int bases[NUM_STACKS];     /* For each stack, index of first
+                                * element on stack corresponding to
+                                * this level (used to restore "numUsed"
+                                * fields when popping out of a level. */
+} StackLevel;
+
+/*
+ * Information about all of the stack levels that are currently
+ * active.  This array grows dynamically to become as large as needed.
+ */
+
+static StackLevel *levels = NULL;
+                               /* Array describing current stack. */
+static int numLevels = 0;      /* Total space allocated. */
+static int curLevel = 0;       /* Highest level currently in use. */
+
+/*
+ * The variable below is a serial number for all options entered into
+ * the database so far.  It increments on each addition to the option
+ * database.  It is used in computing option priorities, so that the
+ * most recent entry wins when choosing between options at the same
+ * priority level.
+ */
+
+static int serial = 0;
+
+/*
+ * Special "no match" Element to use as default for searches.
+ */
+
+static Element defaultMatch;
+
+/*
+ * Forward declarations for procedures defined in this file:
+ */
+
+static int             AddFromString _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, char *string, int priority));
+static void            ClearOptionTree _ANSI_ARGS_((ElArray *arrayPtr));
+static ElArray *       ExtendArray _ANSI_ARGS_((ElArray *arrayPtr,
+                           Element *elPtr));
+static void            ExtendStacks _ANSI_ARGS_((ElArray *arrayPtr,
+                           int leaf));
+static int             GetDefaultOptions _ANSI_ARGS_((Tcl_Interp *interp,
+                           TkWindow *winPtr)); 
+static ElArray *       NewArray _ANSI_ARGS_((int numEls));     
+static void            OptionInit _ANSI_ARGS_((TkMainInfo *mainPtr));
+static int             ParsePriority _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *string));
+static int             ReadOptionFile _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window tkwin, char *fileName, int priority));
+static void            SetupStacks _ANSI_ARGS_((TkWindow *winPtr, int leaf));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_AddOption --
+ *
+ *     Add a new option to the option database.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information is added to the option database.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_AddOption(tkwin, name, value, priority)
+    Tk_Window tkwin;           /* Window token;  option will be associated
+                                * with main window for this window. */
+    char *name;                        /* Multi-element name of option. */
+    char *value;               /* String value for option. */
+    int priority;              /* Overall priority level to use for
+                                * this option, such as TK_USER_DEFAULT_PRIO
+                                * or TK_INTERACTIVE_PRIO.  Must be between
+                                * 0 and TK_MAX_PRIO. */
+{
+    TkWindow *winPtr = ((TkWindow *) tkwin)->mainPtr->winPtr;
+    register ElArray **arrayPtrPtr;
+    register Element *elPtr;
+    Element newEl;
+    register char *p;
+    char *field;
+    int count, firstField, length;
+#define TMP_SIZE 100
+    char tmp[TMP_SIZE+1];
+
+    if (winPtr->mainPtr->optionRootPtr == NULL) {
+       OptionInit(winPtr->mainPtr);
+    }
+    cachedWindow = NULL;       /* Invalidate the cache. */
+
+    /*
+     * Compute the priority for the new element, including both the
+     * overall level and the serial number (to disambiguate with the
+     * level).
+     */
+
+    if (priority < 0) {
+       priority = 0;
+    } else if (priority > TK_MAX_PRIO) {
+       priority = TK_MAX_PRIO;
+    }
+    newEl.priority = (priority << 24) + serial;
+    serial++;
+
+    /*
+     * Parse the option one field at a time.
+     */
+
+    arrayPtrPtr = &(((TkWindow *) tkwin)->mainPtr->optionRootPtr);
+    p = name;
+    for (firstField = 1; ; firstField = 0) {
+
+       /*
+        * Scan the next field from the name and convert it to a Tk_Uid.
+        * Must copy the field before calling Tk_Uid, so that a terminating
+        * NULL may be added without modifying the source string.
+        */
+
+       if (*p == '*') {
+           newEl.flags = WILDCARD;
+           p++;
+       } else {
+           newEl.flags = 0;
+       }
+       field = p;
+       while ((*p != 0) && (*p != '.') && (*p != '*')) {
+           p++;
+       }
+       length = p - field;
+       if (length > TMP_SIZE) {
+           length = TMP_SIZE;
+       }
+       strncpy(tmp, field, length);
+       tmp[length] = 0;
+       newEl.nameUid = Tk_GetUid(tmp);
+       if (isupper(*field)) {
+           newEl.flags |= CLASS;
+       }
+
+       if (*p != 0) {
+
+           /*
+            * New element will be a node.  If this option can't possibly
+            * apply to this main window, then just skip it.  Otherwise,
+            * add it to the parent, if it isn't already there, and descend
+            * into it.
+            */
+
+           newEl.flags |= NODE;
+           if (firstField && !(newEl.flags & WILDCARD)
+                   && (newEl.nameUid != winPtr->nameUid)
+                   && (newEl.nameUid != winPtr->classUid)) {
+               return;
+           }
+           for (elPtr = (*arrayPtrPtr)->els, count = (*arrayPtrPtr)->numUsed;
+                   ; elPtr++, count--) {
+               if (count == 0) {
+                   newEl.child.arrayPtr = NewArray(5);
+                   *arrayPtrPtr = ExtendArray(*arrayPtrPtr, &newEl);
+                   arrayPtrPtr = &((*arrayPtrPtr)->nextToUse[-1].child.arrayPtr);
+                   break;
+               }
+               if ((elPtr->nameUid == newEl.nameUid)
+                       && (elPtr->flags == newEl.flags)) {
+                   arrayPtrPtr = &(elPtr->child.arrayPtr);
+                   break;
+               }
+           }
+           if (*p == '.') {
+               p++;
+           }
+       } else {
+
+           /*
+            * New element is a leaf.  Add it to the parent, if it isn't
+            * already there.  If it exists already, keep whichever value
+            * has highest priority.
+            */
+
+           newEl.child.valueUid = Tk_GetUid(value);
+           for (elPtr = (*arrayPtrPtr)->els, count = (*arrayPtrPtr)->numUsed;
+                   ; elPtr++, count--) {
+               if (count == 0) {
+                   *arrayPtrPtr = ExtendArray(*arrayPtrPtr, &newEl);
+                   return;
+               }
+               if ((elPtr->nameUid == newEl.nameUid)
+                       && (elPtr->flags == newEl.flags)) {
+                   if (elPtr->priority < newEl.priority) {
+                       elPtr->priority = newEl.priority;
+                       elPtr->child.valueUid = newEl.child.valueUid;
+                   }
+                   return;
+               }
+           }
+       }
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_GetOption --
+ *
+ *     Retrieve an option from the option database.
+ *
+ * Results:
+ *     The return value is the value specified in the option
+ *     database for the given name and class on the given
+ *     window.  If there is nothing specified in the database
+ *     for that option, then NULL is returned.
+ *
+ * Side effects:
+ *     The internal caches used to speed up option mapping
+ *     may be modified, if this tkwin is different from the
+ *     last tkwin used for option retrieval.
+ *
+ *--------------------------------------------------------------
+ */
+
+Tk_Uid
+Tk_GetOption(tkwin, name, className)
+    Tk_Window tkwin;           /* Token for window that option is
+                                * associated with. */
+    char *name;                        /* Name of option. */
+    char *className;           /* Class of option.  NULL means there
+                                * is no class for this option:  just
+                                * check for name. */
+{
+    Tk_Uid nameId, classId;
+    register Element *elPtr, *bestPtr;
+    register int count;
+
+    /*
+     * Note:  no need to call OptionInit here:  it will be done by
+     * the SetupStacks call below (squeeze out those nanoseconds).
+     */
+
+    if (tkwin != (Tk_Window) cachedWindow) {
+       SetupStacks((TkWindow *) tkwin, 1);
+    }
+
+    nameId = Tk_GetUid(name);
+    bestPtr = &defaultMatch;
+    for (elPtr = stacks[EXACT_LEAF_NAME]->els,
+           count = stacks[EXACT_LEAF_NAME]->numUsed; count > 0;
+           elPtr++, count--) {
+       if ((elPtr->nameUid == nameId)
+               && (elPtr->priority > bestPtr->priority)) {
+           bestPtr = elPtr;
+       }
+    }
+    for (elPtr = stacks[WILDCARD_LEAF_NAME]->els,
+           count = stacks[WILDCARD_LEAF_NAME]->numUsed; count > 0;
+           elPtr++, count--) {
+       if ((elPtr->nameUid == nameId)
+               && (elPtr->priority > bestPtr->priority)) {
+           bestPtr = elPtr;
+       }
+    }
+    if (className != NULL) {
+       classId = Tk_GetUid(className);
+       for (elPtr = stacks[EXACT_LEAF_CLASS]->els,
+               count = stacks[EXACT_LEAF_CLASS]->numUsed; count > 0;
+               elPtr++, count--) {
+           if ((elPtr->nameUid == classId)
+                   && (elPtr->priority > bestPtr->priority)) {
+               bestPtr = elPtr;
+           }
+       }
+       for (elPtr = stacks[WILDCARD_LEAF_CLASS]->els,
+               count = stacks[WILDCARD_LEAF_CLASS]->numUsed; count > 0;
+               elPtr++, count--) {
+           if ((elPtr->nameUid == classId)
+                   && (elPtr->priority > bestPtr->priority)) {
+               bestPtr = elPtr;
+           }
+       }
+    }
+    return bestPtr->child.valueUid;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_OptionCmd --
+ *
+ *     This procedure is invoked to process the "option" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_OptionCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    int length;
+    char c;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " cmd arg ?arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'a') && (strncmp(argv[1], "add", length) == 0)) {
+       int priority;
+
+       if ((argc != 4) && (argc != 5)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " add pattern value ?priority?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 4) {
+           priority = TK_INTERACTIVE_PRIO;
+       } else {
+           priority = ParsePriority(interp, argv[4]);
+           if (priority < 0) {
+               return TCL_ERROR;
+           }
+       }
+       Tk_AddOption(tkwin, argv[2], argv[3], priority);
+       return TCL_OK;
+    } else if ((c == 'c') && (strncmp(argv[1], "clear", length) == 0)) {
+       TkMainInfo *mainPtr;
+
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " clear\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       mainPtr = ((TkWindow *) tkwin)->mainPtr;
+       if (mainPtr->optionRootPtr != NULL) {
+           ClearOptionTree(mainPtr->optionRootPtr);
+           mainPtr->optionRootPtr = NULL;
+       }
+       cachedWindow = NULL;
+       return TCL_OK;
+    } else if ((c == 'g') && (strncmp(argv[1], "get", length) == 0)) {
+       Tk_Window window;
+       Tk_Uid value;
+
+       if (argc != 5) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " get window name class\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       window = Tk_NameToWindow(interp, argv[2], tkwin);
+       if (window == NULL) {
+           return TCL_ERROR;
+       }
+       value = Tk_GetOption(window, argv[3], argv[4]);
+       if (value != NULL) {
+           interp->result = value;
+       }
+       return TCL_OK;
+    } else if ((c == 'r') && (strncmp(argv[1], "readfile", length) == 0)) {
+       int priority;
+
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # args:  should be \"",
+                   argv[0], " readfile fileName ?priority?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 4) {
+           priority = ParsePriority(interp, argv[3]);
+           if (priority < 0) {
+               return TCL_ERROR;
+           }
+       } else {
+           priority = TK_INTERACTIVE_PRIO;
+       }
+       return ReadOptionFile(interp, tkwin, argv[2], priority);
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\": must be add, clear, get, or readfile", (char *) NULL);
+       return TCL_ERROR;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkOptionDeadWindow --
+ *
+ *     This procedure is called whenever a window is deleted.
+ *     It cleans up any option-related stuff associated with
+ *     the window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Option-related resources are freed.  See code below
+ *     for details.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkOptionDeadWindow(winPtr)
+    register TkWindow *winPtr;         /* Window to be cleaned up. */
+{
+    /*
+     * If this window is in the option stacks, then clear the stacks.
+     */
+
+    if (winPtr->optionLevel != -1) {
+       int i;
+
+       for (i = 1; i <= curLevel; i++) {
+           levels[curLevel].winPtr->optionLevel = -1;
+       }
+       curLevel = 0;
+       cachedWindow = NULL;
+    }
+
+    /*
+     * If this window was a main window, then delete its option
+     * database.
+     */
+
+    if ((winPtr->mainPtr->winPtr == winPtr)
+           && (winPtr->mainPtr->optionRootPtr != NULL)) {
+       ClearOptionTree(winPtr->mainPtr->optionRootPtr);
+       winPtr->mainPtr->optionRootPtr = NULL;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ParsePriority --
+ *
+ *     Parse a string priority value.
+ *
+ * Results:
+ *     The return value is the integer priority level corresponding
+ *     to string, or -1 if string doesn't point to a valid priority level.
+ *     In this case, an error message is left in interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ParsePriority(interp, string)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    char *string;              /* Describes a priority level, either
+                                * symbolically or numerically. */
+{
+    char c;
+    int length, priority;
+
+    c = string[0];
+    length = strlen(string);
+    if ((c == 'w')
+           && (strncmp(string, "widgetDefault", length) == 0)) {
+       return TK_WIDGET_DEFAULT_PRIO;
+    } else if ((c == 's')
+           && (strncmp(string, "startupFile", length) == 0)) {
+       return TK_STARTUP_FILE_PRIO;
+    } else if ((c == 'u')
+           && (strncmp(string, "userDefault", length) == 0)) {
+       return TK_USER_DEFAULT_PRIO;
+    } else if ((c == 'i')
+           && (strncmp(string, "interactive", length) == 0)) {
+       return TK_INTERACTIVE_PRIO;
+    } else {
+       char *end;
+
+       priority = strtoul(string, &end, 0);
+       if ((end == string) || (*end != 0) || (priority < 0)
+               || (priority > 100)) {
+           Tcl_AppendResult(interp,  "bad priority level \"", string,
+                   "\": must be widgetDefault, startupFile, userDefault, ",
+                   "interactive, or a number between 0 and 100",
+                   (char *) NULL);
+           return -1;
+       }
+    }
+    return priority;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * AddFromString --
+ *
+ *     Given a string containing lines in the standard format for
+ *     X resources (see other documentation for details on what this
+ *     is), parse the resource specifications and enter them as options
+ *     for tkwin's main window.
+ *
+ * Results:
+ *     The return value is a standard Tcl return code.  In the case of
+ *     an error in parsing string, TCL_ERROR will be returned and an
+ *     error message will be left in interp->result.  The memory at
+ *     string is totally trashed by this procedure.  If you care about
+ *     its contents, make a copy before calling here.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+AddFromString(interp, tkwin, string, priority)
+    Tcl_Interp *interp;                /* Interpreter to use for reporting results. */
+    Tk_Window tkwin;           /* Token for window:  options are entered
+                                * for this window's main window. */
+    char *string;              /* String containing option specifiers. */
+    int priority;              /* Priority level to use for options in
+                                * this string, such as TK_USER_DEFAULT_PRIO
+                                * or TK_INTERACTIVE_PRIO.  Must be between
+                                * 0 and TK_MAX_PRIO. */
+{
+    register char *src, *dst;
+    char *name, *value;
+    int lineNum;
+
+    src = string;
+    lineNum = 1;
+    while (1) {
+
+       /*
+        * Skip leading white space and empty lines and comment lines, and
+        * check for the end of the spec.
+        */
+
+       while ((*src == ' ') || (*src == '\t')) {
+           src++;
+       }
+       if ((*src == '#') || (*src == '!')) {
+           do {
+               src++;
+               if ((src[0] == '\\') && (src[1] == '\n')) {
+                   src += 2;
+                   lineNum++;
+               }
+           } while ((*src != '\n') && (*src != 0));
+       }
+       if (*src == '\n') {
+           src++;
+           lineNum++;
+           continue;
+       } 
+       if (*src == '\0') {
+           break;
+       }
+
+       /*
+        * Parse off the option name, collapsing out backslash-newline
+        * sequences of course.
+        */
+
+       dst = name = src;
+       while (*src != ':') {
+           if ((*src == '\0') || (*src == '\n')) {
+               sprintf(interp->result, "missing colon on line %d",
+                       lineNum);
+               return TCL_ERROR;
+           }
+           if ((src[0] == '\\') && (src[1] == '\n')) {
+               src += 2;
+               lineNum++;
+           } else {
+               *dst = *src;
+               dst++;
+               src++;
+           }
+       }
+
+       /*
+        * Eliminate trailing white space on the name, and null-terminate
+        * it.
+        */
+
+       while ((dst != name) && ((dst[-1] == ' ') || (dst[-1] == '\t'))) {
+           dst--;
+       }
+       *dst = '\0';
+
+       /*
+        * Skip white space between the name and the value.
+        */
+
+       src++;
+       while ((*src == ' ') || (*src == '\t')) {
+           src++;
+       }
+       if (*src == '\0') {
+           sprintf(interp->result, "missing value on line %d", lineNum);
+           return TCL_ERROR;
+       }
+
+       /*
+        * Parse off the value, squeezing out backslash-newline sequences
+        * along the way.
+        */
+
+       dst = value = src;
+       while (*src != '\n') {
+           if (*src == '\0') {
+               sprintf(interp->result, "missing newline on line %d",
+                       lineNum);
+               return TCL_ERROR;
+           }
+           if ((src[0] == '\\') && (src[1] == '\n')) {
+               src += 2;
+               lineNum++;
+           } else {
+               *dst = *src;
+               dst++;
+               src++;
+           }
+       }
+       *dst = 0;
+
+       /*
+        * Enter the option into the database.
+        */
+
+       Tk_AddOption(tkwin, name, value, priority);
+       src++;
+       lineNum++;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ReadOptionFile --
+ *
+ *     Read a file of options ("resources" in the old X terminology)
+ *     and load them into the option database.
+ *
+ * Results:
+ *     The return value is a standard Tcl return code.  In the case of
+ *     an error in parsing string, TCL_ERROR will be returned and an
+ *     error message will be left in interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ReadOptionFile(interp, tkwin, fileName, priority)
+    Tcl_Interp *interp;                /* Interpreter to use for reporting results. */
+    Tk_Window tkwin;           /* Token for window:  options are entered
+                                * for this window's main window. */
+    char *fileName;            /* Name of file containing options. */
+    int priority;              /* Priority level to use for options in
+                                * this file, such as TK_USER_DEFAULT_PRIO
+                                * or TK_INTERACTIVE_PRIO.  Must be between
+                                * 0 and TK_MAX_PRIO. */
+{
+    char *realName, *buffer;
+    int fileId, result;
+    struct stat statBuf;
+
+    realName = Tcl_TildeSubst(interp, fileName);
+    if (fileName == NULL) {
+       return TCL_ERROR;
+    }
+#ifdef MSDOS
+    fileId = open(realName, O_RDONLY | O_BINARY, 0);
+#else
+    fileId = open(realName, O_RDONLY, 0);
+#endif
+    if (fileId < 0) {
+       Tcl_AppendResult(interp, "couldn't read file \"", fileName, "\"",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (fstat(fileId, &statBuf) == -1) {
+       Tcl_AppendResult(interp, "couldn't stat file \"", fileName, "\"",
+               (char *) NULL);
+       close(fileId);
+       return TCL_ERROR;
+    }
+    buffer = (char *) ckalloc((unsigned) statBuf.st_size+1);
+#ifdef MSDOS
+    if (read(fileId, buffer, (int) statBuf.st_size) < 0) {
+#else
+    if (read(fileId, buffer, (int) statBuf.st_size) != statBuf.st_size) {
+#endif
+       Tcl_AppendResult(interp, "error reading file \"", fileName, "\"",
+               (char *) NULL);
+       close(fileId);
+       return TCL_ERROR;
+    }
+    close(fileId);
+    buffer[statBuf.st_size] = 0;
+    result = AddFromString(interp, tkwin, buffer, priority);
+    ckfree(buffer);
+    return result;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * NewArray --
+ *
+ *     Create a new ElArray structure of a given size.
+ *
+ * Results:
+ *     The return value is a pointer to a properly initialized
+ *     element array with "numEls" space.  The array is marked
+ *     as having no active elements.
+ *
+ * Side effects:
+ *     Memory is allocated.
+ *
+ *--------------------------------------------------------------
+ */
+
+static ElArray *
+NewArray(numEls)
+    int numEls;                        /* How many elements of space to allocate. */
+{
+    register ElArray *arrayPtr;
+
+    arrayPtr = (ElArray *) ckalloc(EL_ARRAY_SIZE(numEls));
+    arrayPtr->arraySize = numEls;
+    arrayPtr->numUsed = 0;
+    arrayPtr->nextToUse = arrayPtr->els;
+    return arrayPtr;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ExtendArray --
+ *
+ *     Add a new element to an array, extending the array if
+ *     necessary.
+ *
+ * Results:
+ *     The return value is a pointer to the new array, which
+ *     will be different from arrayPtr if the array got expanded.
+ *
+ * Side effects:
+ *     Memory may be allocated or freed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static ElArray *
+ExtendArray(arrayPtr, elPtr)
+    register ElArray *arrayPtr;                /* Array to be extended. */
+    register Element *elPtr;           /* Element to be copied into array. */
+{
+    /*
+     * If the current array has filled up, make it bigger.
+     */
+
+    if (arrayPtr->numUsed >= arrayPtr->arraySize) {
+       register ElArray *newPtr;
+
+       newPtr = (ElArray *) ckalloc(EL_ARRAY_SIZE(2*arrayPtr->arraySize));
+       newPtr->arraySize = 2*arrayPtr->arraySize;
+       newPtr->numUsed = arrayPtr->numUsed;
+       newPtr->nextToUse = &newPtr->els[newPtr->numUsed];
+       memcpy((VOID *) newPtr->els, (VOID *) arrayPtr->els,
+               (arrayPtr->arraySize*sizeof(Element)));
+       ckfree((char *) arrayPtr);
+       arrayPtr = newPtr;
+    }
+
+    *arrayPtr->nextToUse = *elPtr;
+    arrayPtr->nextToUse++;
+    arrayPtr->numUsed++;
+    return arrayPtr;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * SetupStacks --
+ *
+ *     Arrange the stacks so that they cache all the option
+ *     information for a particular window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The stacks are modified to hold information for tkwin
+ *     and all its ancestors in the window hierarchy.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+SetupStacks(winPtr, leaf)
+    TkWindow *winPtr;          /* Window for which information is to
+                                * be cached. */
+    int leaf;                  /* Non-zero means this is the leaf
+                                * window being probed.  Zero means this
+                                * is an ancestor of the desired leaf. */
+{
+    int level, i, *iPtr;
+    register StackLevel *levelPtr;
+    register ElArray *arrayPtr;
+
+    /*
+     * The following array defines the order in which the current
+     * stacks are searched to find matching entries to add to the
+     * stacks.  Given the current priority-based scheme, the order
+     * below is no longer relevant;  all that matters is that an
+     * element is on the list *somewhere*.  The ordering is a relic
+     * of the old days when priorities were determined differently.
+     */
+
+    static int searchOrder[] = {WILDCARD_NODE_CLASS, WILDCARD_NODE_NAME,
+           EXACT_NODE_CLASS, EXACT_NODE_NAME, -1};
+
+    if (winPtr->mainPtr->optionRootPtr == NULL) {
+       OptionInit(winPtr->mainPtr);
+    }
+
+    /*
+     * Step 1:  make sure that options are cached for this window's
+     * parent.
+     */
+
+    if (winPtr->parentPtr != NULL) {
+       level = winPtr->parentPtr->optionLevel;
+       if ((level == -1) || (cachedWindow == NULL)) {
+           SetupStacks(winPtr->parentPtr, 0);
+           level = winPtr->parentPtr->optionLevel;
+       }
+       level++;
+    } else {
+       level = 1;
+    }
+
+    /*
+     * Step 2:  pop extra unneeded information off the stacks and
+     * mark those windows as no longer having cached information.
+     */
+
+    if (curLevel >= level) {
+       while (curLevel >= level) {
+           levels[curLevel].winPtr->optionLevel = -1;
+           curLevel--;
+       }
+       levelPtr = &levels[level];
+       for (i = 0; i < NUM_STACKS; i++) {
+           arrayPtr = stacks[i];
+           arrayPtr->numUsed = levelPtr->bases[i];
+           arrayPtr->nextToUse = &arrayPtr->els[arrayPtr->numUsed];
+       }
+    }
+    curLevel = winPtr->optionLevel = level;
+
+    /*
+     * Step 3:  if the root database information isn't loaded or
+     * isn't valid, initialize level 0 of the stack from the
+     * database root (this only happens if winPtr is a main window).
+     */
+
+    if ((curLevel == 1)
+           && ((cachedWindow == NULL)
+           || (cachedWindow->mainPtr != winPtr->mainPtr))) {
+       for (i = 0; i < NUM_STACKS; i++) {
+           arrayPtr = stacks[i];
+           arrayPtr->numUsed = 0;
+           arrayPtr->nextToUse = arrayPtr->els;
+       }
+       ExtendStacks(winPtr->mainPtr->optionRootPtr, 0);
+    }
+
+    /*
+     * Step 4: create a new stack level;  grow the level array if
+     * we've run out of levels.  Clear the stacks for EXACT_LEAF_NAME
+     * and EXACT_LEAF_CLASS (anything that was there is of no use
+     * any more).
+     */
+
+    if (curLevel >= numLevels) {
+       StackLevel *newLevels;
+
+       newLevels = (StackLevel *) ckalloc((unsigned)
+               (numLevels*2*sizeof(StackLevel)));
+       memcpy((VOID *) newLevels, (VOID *) levels,
+               (numLevels*sizeof(StackLevel)));
+       ckfree((char *) levels);
+       numLevels *= 2;
+       levels = newLevels;
+    }
+    levelPtr = &levels[curLevel];
+    levelPtr->winPtr = winPtr;
+    arrayPtr = stacks[EXACT_LEAF_NAME];
+    arrayPtr->numUsed = 0;
+    arrayPtr->nextToUse = arrayPtr->els;
+    arrayPtr = stacks[EXACT_LEAF_CLASS];
+    arrayPtr->numUsed = 0;
+    arrayPtr->nextToUse = arrayPtr->els;
+    levelPtr->bases[EXACT_LEAF_NAME] = stacks[EXACT_LEAF_NAME]->numUsed;
+    levelPtr->bases[EXACT_LEAF_CLASS] = stacks[EXACT_LEAF_CLASS]->numUsed;
+    levelPtr->bases[EXACT_NODE_NAME] = stacks[EXACT_NODE_NAME]->numUsed;
+    levelPtr->bases[EXACT_NODE_CLASS] = stacks[EXACT_NODE_CLASS]->numUsed;
+    levelPtr->bases[WILDCARD_LEAF_NAME] = stacks[WILDCARD_LEAF_NAME]->numUsed;
+    levelPtr->bases[WILDCARD_LEAF_CLASS] = stacks[WILDCARD_LEAF_CLASS]->numUsed;
+    levelPtr->bases[WILDCARD_NODE_NAME] = stacks[WILDCARD_NODE_NAME]->numUsed;
+    levelPtr->bases[WILDCARD_NODE_CLASS] = stacks[WILDCARD_NODE_CLASS]->numUsed;
+
+
+    /*
+     * Step 5: scan the current stack level looking for matches to this
+     * window's name or class;  where found, add new information to the
+     * stacks.
+     */
+
+    for (iPtr = searchOrder; *iPtr != -1; iPtr++) {
+       register Element *elPtr;
+       int count;
+       Tk_Uid id;
+
+       i = *iPtr;
+       if (i & CLASS) {
+           id = winPtr->classUid;
+       } else {
+           id = winPtr->nameUid;
+       }
+       elPtr = stacks[i]->els;
+       count = levelPtr->bases[i];
+
+       /*
+        * For wildcard stacks, check all entries;  for non-wildcard
+        * stacks, only check things that matched in the parent.
+        */
+
+       if (!(i & WILDCARD)) {
+           elPtr += levelPtr[-1].bases[i];
+           count -= levelPtr[-1].bases[i];
+       }
+       for ( ; count > 0; elPtr++, count--) {
+           if (elPtr->nameUid != id) {
+               continue;
+           }
+           ExtendStacks(elPtr->child.arrayPtr, leaf);
+       }
+    }
+    cachedWindow = winPtr;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ExtendStacks --
+ *
+ *     Given an element array, copy all the elements from the
+ *     array onto the system stacks (except for irrelevant leaf
+ *     elements).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The option stacks are extended.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ExtendStacks(arrayPtr, leaf)
+    ElArray *arrayPtr;         /* Array of elements to copy onto stacks. */
+    int leaf;                  /* If zero, then don't copy exact leaf
+                                * elements. */
+{
+    register int count;
+    register Element *elPtr;
+
+    for (elPtr = arrayPtr->els, count = arrayPtr->numUsed;
+           count > 0; elPtr++, count--) {
+       if (!(elPtr->flags & (NODE|WILDCARD)) && !leaf) {
+           continue;
+       }
+       stacks[elPtr->flags] = ExtendArray(stacks[elPtr->flags], elPtr);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * OptionInit --
+ *
+ *     Initialize data structures for option handling.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Option-related data structures get initialized.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+OptionInit(mainPtr)
+    register TkMainInfo *mainPtr;      /* Top-level information about
+                                        * window that isn't initialized
+                                        * yet. */
+{
+    int i;
+    Tcl_Interp *interp;
+
+    /*
+     * First, once-only initialization.
+     */
+
+    if (numLevels == 0) {
+
+       numLevels = 5;
+       levels = (StackLevel *) ckalloc((unsigned) (5*sizeof(StackLevel)));
+       for (i = 0; i < NUM_STACKS; i++) {
+           stacks[i] = NewArray(10);
+           levels[0].bases[i] = 0;
+       }
+    
+       defaultMatch.nameUid = NULL;
+       defaultMatch.child.valueUid = NULL;
+       defaultMatch.priority = -1;
+       defaultMatch.flags = 0;
+    }
+
+    /*
+     * Then, per-main-window initialization.  Create and delete dummy
+     * interpreter for message logging.
+     */
+
+    mainPtr->optionRootPtr = NewArray(20);
+    interp = Tcl_CreateInterp();
+    (void) GetDefaultOptions(interp, mainPtr->winPtr);
+    Tcl_DeleteInterp(interp);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ClearOptionTree --
+ *
+ *     This procedure is called to erase everything in a
+ *     hierarchical option database.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     All the options associated with arrayPtr are deleted,
+ *     along with all option subtrees.  The space pointed to
+ *     by arrayPtr is freed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ClearOptionTree(arrayPtr)
+    ElArray *arrayPtr;         /* Array of options;  delete everything
+                                * referred to recursively by this. */
+{
+    register Element *elPtr;
+    int count;
+
+    for (count = arrayPtr->numUsed, elPtr = arrayPtr->els;  count > 0;
+           count--, elPtr++) {
+       if (elPtr->flags & NODE) {
+           ClearOptionTree(elPtr->child.arrayPtr);
+       }
+    }
+    ckfree((char *) arrayPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * GetDefaultOptions --
+ *
+ *     This procedure is invoked to load the default set of options
+ *     for a window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Options are added to those for winPtr's main window.  If
+ *     there exists a RESOURCE_MANAGER proprety for winPtr's
+ *     display, that is used.  Otherwise, the .Xdefaults file in
+ *     the user's home directory is used.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+GetDefaultOptions(interp, winPtr)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    TkWindow *winPtr;          /* Fetch option defaults for main window
+                                * associated with this. */
+{
+    char *regProp, *home, *fileName;
+    int result, actualFormat;
+    unsigned long numItems, bytesAfter;
+    Atom actualType;
+
+    /*
+     * Try the RESOURCE_MANAGER property on the root window first.
+     */
+
+    regProp = NULL;
+    result = XGetWindowProperty(winPtr->display,
+           Tk_DefaultRootWindow(winPtr->display),
+           XA_RESOURCE_MANAGER, 0, 100000,
+           False, XA_STRING, &actualType, &actualFormat,
+           &numItems, &bytesAfter, (unsigned char **) &regProp);
+
+    if ((result == Success) && (actualType == XA_STRING)
+           && (actualFormat == 8)) {
+       result = AddFromString(interp, (Tk_Window) winPtr, regProp,
+               TK_USER_DEFAULT_PRIO);
+       XFree(regProp);
+       return result;
+    }
+
+    /*
+     * No luck there.  Try a .Xdefaults file in the user's home
+     * directory.
+     */
+
+    if (regProp != NULL) {
+       XFree(regProp);
+    }
+    home = getenv("HOME");
+    if (home == NULL) {
+       sprintf(interp->result,
+               "no RESOURCE_MANAGER property and no HOME envariable");
+       return TCL_ERROR;
+    }
+    fileName = (char *) ckalloc((unsigned) (strlen(home) + 20));
+    sprintf(fileName, "%s/.Xdefaults", home);
+    result = ReadOptionFile(interp, (Tk_Window) winPtr, fileName,
+           TK_USER_DEFAULT_PRIO);
+    ckfree(fileName);
+    return result;
+}
diff --git a/src/tk/tkpack.c b/src/tk/tkpack.c
new file mode 100644 (file)
index 0000000..f065bd5
--- /dev/null
@@ -0,0 +1,1053 @@
+/* 
+ * tkPack.c --
+ *
+ *     This file contains code to implement the "packer"
+ *     geometry manager for Tk.
+ *
+ * Copyright 1990 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkPack.c,v 1.27 92/01/04 15:16:41 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tkint.h"
+
+typedef enum {TOP, BOTTOM, LEFT, RIGHT} Side;
+
+/* For each window that the packer cares about (either because
+ * the window is managed by the packer or because the window
+ * has children that are managed by the packer), there is a
+ * structure of the following type:
+ */
+
+typedef struct Packer {
+    Tk_Window tkwin;           /* Tk token for window.  NULL means that
+                                * the window has been deleted, but the
+                                * packet hasn't had a chance to clean up
+                                * yet because the structure is still in
+                                * use. */
+    struct Packer *parentPtr;  /* Parent within which this window
+                                * is packed (NULL means this window
+                                * isn't managed by the packer). */
+    struct Packer *nextPtr;    /* Next window packed within same
+                                * parent.  List is priority-ordered:
+                                * first on list gets packed first. */
+    struct Packer *childPtr;   /* First in list of children packed
+                                * inside this window (NULL means
+                                * no packed children). */
+    Side side;                 /* Side of parent against which
+                                * this window is packed. */
+    Tk_Anchor anchorPoint;     /* If frame allocated for window is larger
+                                * than window needs, this indicates how
+                                * where to position window in frame. */
+    int padX, padY;            /* Additional amounts of space to give window
+                                * besides what it asked for. */
+    int doubleBw;              /* Twice the window's last known border
+                                * width.  If this changes, the window
+                                * must be repacked within its parent. */
+    int *abortPtr;             /* If non-NULL, it means that there is a nested
+                                * call to ArrangePacking already working on
+                                * this window.  *abortPtr may be set to 1 to
+                                * abort that nested call.  This happens, for
+                                * example, if tkwin or any of its children
+                                * is deleted. */
+    int flags;                 /* Miscellaneous flags;  see below
+                                * for definitions. */
+} Packer;
+
+/*
+ * Flag values for Packer structures:
+ *
+ * REQUESTED_REPACK:           1 means a Tk_DoWhenIdle request
+ *                             has already been made to repack
+ *                             all the children of this window.
+ * FILLX:                      1 means if frame allocated for window
+ *                             is wider than window needs, expand window
+ *                             to fill frame.  0 means don't make window
+ *                             any larger than needed.
+ * FILLY:                      Same as FILLX, except for height.
+ * EXPAND:                     1 means this window's frame will absorb any
+ *                             extra space in the parent window.
+ */
+
+#define REQUESTED_REPACK       1
+#define FILLX                  2
+#define FILLY                  4
+#define EXPAND                 8
+
+/*
+ * Hash table used to map from Tk_Window tokens to corresponding
+ * Packer structures:
+ */
+
+static Tcl_HashTable packerHashTable;
+
+/*
+ * Have statics in this module been initialized?
+ */
+
+static initialized = 0;
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            ArrangePacking _ANSI_ARGS_((ClientData clientData));
+static Packer *                GetPacker _ANSI_ARGS_((Tk_Window tkwin));
+static int             PackAfter _ANSI_ARGS_((Tcl_Interp *interp,
+                           Packer *prevPtr, Packer *parentPtr, int argc,
+                           char **argv));
+static void            PackReqProc _ANSI_ARGS_((ClientData clientData,
+                           Tk_Window tkwin));
+static void            PackStructureProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static void            Unlink _ANSI_ARGS_((Packer *packPtr));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_PackCmd --
+ *
+ *     This procedure is invoked to process the "pack" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_PackCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    int length;
+    char c;
+
+    if (argc < 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option arg ?arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'a') && (length >= 2)
+           && (strncmp(argv[1], "after", length) == 0)) {
+       Packer *prevPtr;
+       Tk_Window tkwin2;
+
+       tkwin2 = Tk_NameToWindow(interp, argv[2], tkwin);
+       if (tkwin2 == NULL) {
+           return TCL_ERROR;
+       }
+       prevPtr = GetPacker(tkwin2);
+       if (prevPtr->parentPtr == NULL) {
+           Tcl_AppendResult(interp, "window \"", argv[2],
+                   "\" isn't packed", (char *) NULL);
+           return TCL_ERROR;
+       }
+       return PackAfter(interp, prevPtr, prevPtr->parentPtr, argc-3, argv+3);
+    } else if ((c == 'a') && (length >= 2)
+           && (strncmp(argv[1], "append", length) == 0)) {
+       Packer *parentPtr;
+       register Packer *prevPtr;
+       Tk_Window tkwin2;
+
+       tkwin2 = Tk_NameToWindow(interp, argv[2], tkwin);
+       if (tkwin2 == NULL) {
+           return TCL_ERROR;
+       }
+       parentPtr = GetPacker(tkwin2);
+       prevPtr = parentPtr->childPtr;
+       if (prevPtr != NULL) {
+           while (prevPtr->nextPtr != NULL) {
+               prevPtr = prevPtr->nextPtr;
+           }
+       }
+       return PackAfter(interp, prevPtr, parentPtr, argc-3, argv+3);
+    } else if ((c == 'b') && (strncmp(argv[1], "before", length) == 0)) {
+       Packer *packPtr, *parentPtr;
+       register Packer *prevPtr;
+       Tk_Window tkwin2;
+
+       tkwin2 = Tk_NameToWindow(interp, argv[2], tkwin);
+       if (tkwin2 == NULL) {
+           return TCL_ERROR;
+       }
+       packPtr = GetPacker(tkwin2);
+       if (packPtr->parentPtr == NULL) {
+           Tcl_AppendResult(interp, "window \"", argv[2],
+                   "\" isn't packed", (char *) NULL);
+           return TCL_ERROR;
+       }
+       parentPtr = packPtr->parentPtr;
+       prevPtr = parentPtr->childPtr;
+       if (prevPtr == packPtr) {
+           prevPtr = NULL;
+       } else {
+           for ( ; ; prevPtr = prevPtr->nextPtr) {
+               if (prevPtr == NULL) {
+                   panic("\"pack before\" couldn't find predecessor");
+               }
+               if (prevPtr->nextPtr == packPtr) {
+                   break;
+               }
+           }
+       }
+       return PackAfter(interp, prevPtr, parentPtr, argc-3, argv+3);
+    } else if ((c == 'i') && (strncmp(argv[1], "info", length) == 0)) {
+       char *prefix;
+       register Packer *packPtr;
+       Tk_Window tkwin2;
+       char tmp[20];
+       static char *sideNames[] = {"top", "bottom", "left", "right"};
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " info window\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       tkwin2 = Tk_NameToWindow(interp, argv[2], tkwin);
+       if (tkwin2 == NULL) {
+           return TCL_ERROR;
+       }
+       packPtr = GetPacker(tkwin2);
+       prefix = "";
+       for (packPtr = packPtr->childPtr; packPtr != NULL;
+               packPtr = packPtr->nextPtr) {
+           Tcl_AppendResult(interp, prefix, Tk_PathName(packPtr->tkwin),
+                   " {", sideNames[(int) packPtr->side],
+                   " frame ", Tk_NameOfAnchor(packPtr->anchorPoint),
+                   (char *) NULL);
+           if (packPtr->padX != 0) {
+               sprintf(tmp, "%d", packPtr->padX);
+               Tcl_AppendResult(interp, " padx ", tmp, (char *) NULL);
+           }
+           if (packPtr->padY != 0) {
+               sprintf(tmp, "%d", packPtr->padY);
+               Tcl_AppendResult(interp, " pady ", tmp, (char *) NULL);
+           }
+           if (packPtr->flags & EXPAND) {
+               Tcl_AppendResult(interp, " expand", (char *) NULL);
+           }
+           if ((packPtr->flags & (FILLX|FILLY)) == (FILLX|FILLY)) {
+               Tcl_AppendResult(interp, " fill", (char *) NULL);
+           } else if (packPtr->flags & FILLX) {
+               Tcl_AppendResult(interp, " fillx", (char *) NULL);
+           } else if (packPtr->flags & FILLY) {
+               Tcl_AppendResult(interp, " filly", (char *) NULL);
+           }
+           Tcl_AppendResult(interp, "}", (char *) NULL);
+           prefix = " ";
+       }
+       return TCL_OK;
+    } else if ((c == 'u') && (strncmp(argv[1], "unpack", length) == 0)) {
+       Tk_Window tkwin2;
+       Packer *packPtr;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " unpack window\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       tkwin2 = Tk_NameToWindow(interp, argv[2], tkwin);
+       if (tkwin2 == NULL) {
+           return TCL_ERROR;
+       }
+       packPtr = GetPacker(tkwin2);
+       if ((packPtr != NULL) && (packPtr->parentPtr != NULL)) {
+           Tk_ManageGeometry(tkwin2, (Tk_GeometryProc *) NULL,
+                   (ClientData) NULL);
+           Unlink(packPtr);
+           Tk_UnmapWindow(packPtr->tkwin);
+       }
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\":  must be after, append, before, or info", (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * PackReqProc --
+ *
+ *     This procedure is invoked by Tk_GeometryRequest for
+ *     windows managed by the packer.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Arranges for tkwin, and all its managed siblings, to
+ *     be re-packed at the next idle point.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static void
+PackReqProc(clientData, tkwin)
+    ClientData clientData;     /* Packer's information about
+                                * window that got new preferred
+                                * geometry.  */
+    Tk_Window tkwin;           /* Other Tk-related information
+                                * about the window. */
+{
+    register Packer *packPtr = (Packer *) clientData;
+
+    packPtr = packPtr->parentPtr;
+    if (!(packPtr->flags & REQUESTED_REPACK)) {
+       packPtr->flags |= REQUESTED_REPACK;
+       Tk_DoWhenIdle(ArrangePacking, (ClientData) packPtr);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ArrangePacking --
+ *
+ *     This procedure is invoked (using the Tk_DoWhenIdle
+ *     mechanism) to re-layout a set of windows managed by
+ *     the packer.  It is invoked at idle time so that a
+ *     series of packer requests can be merged into a single
+ *     layout operation.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The packed children of parentPtr may get resized or
+ *     moved.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ArrangePacking(clientData)
+    ClientData clientData;     /* Structure describing parent
+                                * whose children are to be
+                                * re-layed out. */
+{
+    register Packer *parentPtr = (Packer *) clientData;
+    register Packer *childPtr; 
+    int numExpX, numExpY;      /* # of windows that are expandable in
+                                * each direction. */
+    int spareX, spareY;                /* Amount of extra space to give to each
+                                * expandable window. */
+    int leftOverX, leftOverY;  /* Extra chunk of space to give to last
+                                * expandable window. */
+    int cavityX, cavityY, cavityWidth, cavityHeight;
+                               /* These variables keep track of the
+                                * as-yet-unallocated space remaining in
+                                * the middle of the parent window. */
+    int frameX, frameY, frameWidth, frameHeight;
+                               /* These variables keep track of the frame
+                                * allocated to the current window. */
+    int x, y, width, height;   /* These variables are used to hold the
+                                * actual geometry of the current window. */
+    int intBWidth;             /* Width of internal border in parent window,
+                                * if any. */
+    int abort;                 /* May get set to non-zero to abort this
+                                * repacking operation. */
+    int maxWidth, maxHeight, tmp;
+
+    parentPtr->flags &= ~REQUESTED_REPACK;
+
+    /*
+     * If the parent has no children anymore, then don't do anything
+     * at all:  just leave the parent's size as-is.
+     */
+
+    if (parentPtr->childPtr == NULL) {
+       return;
+    }
+
+    /*
+     * Abort any nested call to ArrangePacking for this window, since
+     * we'll do everything necessary here, and set up so this call
+     * can be aborted if necessary.  
+     */
+
+    if (parentPtr->abortPtr != NULL) {
+       *parentPtr->abortPtr = 1;
+    }
+    parentPtr->abortPtr = &abort;
+    abort = 0;
+    Tk_Preserve((ClientData) parentPtr);
+
+    /*
+     * Pass #1: scan all the children to figure out the total amount
+     * of space needed.  Two separate widths and heights are computed.
+     *
+     * "Width" and "height" compute the minimum parent size to meet
+     * the needs of each window in the direction "where there is
+     * flexibility".  For example, if a child is packed TOP, then
+     * y is the flexible direction:  the child's requested height
+     * will determine its size.  For this window x is the inflexible
+     * direction:  the window's width will be determined by the amount
+     * of space left in the parent's cavity, not by the window's
+     * requested width.  "Width" and "height" are needed in order to
+     * compute how much extra space there is, so that it can be divided
+     * among the windows that have the EXPAND flag.
+     *
+     * "MaxWidth" and "maxHeight" compute the minimum parent size to
+     * meet all the needs of every window in both directions, flexible
+     * or inflexible.  These values are needed to make geometry requests
+     * of the parent's parent.
+     */
+
+    intBWidth = Tk_InternalBorderWidth(parentPtr->tkwin);
+    width = height = maxWidth = maxHeight = 2*intBWidth;
+    numExpX = numExpY = 0;
+    for (childPtr = parentPtr->childPtr; childPtr != NULL;
+           childPtr = childPtr->nextPtr) {
+       if ((childPtr->side == TOP) || (childPtr->side == BOTTOM)) {
+           tmp = Tk_ReqWidth(childPtr->tkwin) + childPtr->doubleBw
+                   + childPtr->padX + width;
+           if (tmp > maxWidth) {
+               maxWidth = tmp;
+           }
+           height += Tk_ReqHeight(childPtr->tkwin) + childPtr->doubleBw
+                   + childPtr->padY;
+           if (childPtr->flags & EXPAND) {
+               numExpY++;
+           }
+       } else {
+           tmp = Tk_ReqHeight(childPtr->tkwin) + childPtr->doubleBw
+                   + childPtr->padY + height;
+           if (tmp > maxHeight) {
+               maxHeight = tmp;
+           }
+           width += Tk_ReqWidth(childPtr->tkwin) + childPtr->doubleBw
+                   + childPtr->padX;
+           if (childPtr->flags & EXPAND) {
+               numExpX++;
+           }
+       }
+    }
+    if (width > maxWidth) {
+       maxWidth = width;
+    }
+    if (height > maxHeight) {
+       maxHeight = height;
+    }
+
+    /*
+     * If the total amount of space needed in the parent window has
+     * changed, then notify the next geometry manager up and requeue
+     * ourselves to start again after the parent has had a chance to
+     * resize us.
+     */
+
+    if ((maxWidth != Tk_ReqWidth(parentPtr->tkwin))
+           || (maxHeight != Tk_ReqHeight(parentPtr->tkwin))) {
+       Tk_GeometryRequest(parentPtr->tkwin, maxWidth, maxHeight);
+       parentPtr->flags |= REQUESTED_REPACK;
+       Tk_DoWhenIdle(ArrangePacking, (ClientData) parentPtr);
+       goto done;
+    }
+
+    /*
+     * If there is spare space, figure out how much of it goes to
+     * each of the windows that is expandable.
+     */
+
+    spareX = Tk_Width(parentPtr->tkwin) - width;
+    spareY = Tk_Height(parentPtr->tkwin) - height;
+    if ((spareX <= 0) || (numExpX == 0)) {
+       leftOverX = 0;
+       spareX = 0;
+    } else {
+       leftOverX = spareX % numExpX;
+       spareX /= numExpX;
+    }
+    if ((spareY <= 0) || (numExpY == 0)) {
+       leftOverY = spareY;
+       spareY = 0;
+    } else {
+       leftOverY = spareY % numExpY;
+       spareY /= numExpY;
+    }
+
+    /*
+     * Pass #2: scan the children a second time assigning
+     * new sizes.  The "cavity" variables keep track of the
+     * unclaimed space in the cavity of the window;  this
+     * shrinks inward as we allocate windows around the
+     * edges.  The "frame" variables keep track of the space
+     * allocated to the current window and its frame.  The
+     * current window is then placed somewhere inside the
+     * frame, depending on anchorPoint.
+     */
+
+    cavityX = cavityY = x = y = intBWidth;
+    cavityWidth = Tk_Width(parentPtr->tkwin) - 2*intBWidth;
+    cavityHeight = Tk_Height(parentPtr->tkwin) - 2*intBWidth;
+    for (childPtr = parentPtr->childPtr; childPtr != NULL;
+           childPtr = childPtr->nextPtr) {
+       if ((childPtr->side == TOP) || (childPtr->side == BOTTOM)) {
+           frameWidth = cavityWidth;
+           frameHeight = Tk_ReqHeight(childPtr->tkwin) + childPtr->padY
+                   + childPtr->doubleBw;
+           if (childPtr->flags & EXPAND) {
+               frameHeight += spareY;
+               numExpY--;
+               if (numExpY == 0) {
+                   frameHeight += leftOverY;
+               }
+           }
+           cavityHeight -= frameHeight;
+           if (cavityHeight < 0) {
+               frameHeight += cavityHeight;
+               cavityHeight = 0;
+           }
+           frameX = cavityX;
+           if (childPtr->side == TOP) {
+               frameY = cavityY;
+               cavityY += frameHeight;
+           } else {
+               frameY = cavityY + cavityHeight;
+           }
+       } else {
+           frameHeight = cavityHeight;
+           frameWidth = Tk_ReqWidth(childPtr->tkwin) + childPtr->padX
+                   + childPtr->doubleBw;
+           if (childPtr->flags & EXPAND) {
+               frameWidth += spareX;
+               numExpX--;
+               if (numExpX == 0) {
+                   frameWidth += leftOverX;
+               }
+           }
+           cavityWidth -= frameWidth;
+           if (cavityWidth < 0) {
+               frameWidth += cavityWidth;
+               cavityWidth = 0;
+           }
+           frameY = cavityY;
+           if (childPtr->side == LEFT) {
+               frameX = cavityX;
+               cavityX += frameWidth;
+           } else {
+               frameX = cavityX + cavityWidth;
+           }
+       }
+
+       /*
+        * Now that we've got the size of the frame for the window,
+        * compute the window's actual size and location using the
+        * fill and frame factors.
+        */
+
+       width = Tk_ReqWidth(childPtr->tkwin) + childPtr->doubleBw;
+       if ((childPtr->flags & FILLX) || (width > frameWidth)) {
+           width = frameWidth;
+       }
+       height = Tk_ReqHeight(childPtr->tkwin) + childPtr->doubleBw;
+       if ((childPtr->flags & FILLY) || (height > frameHeight)) {
+           height = frameHeight;
+       }
+       switch (childPtr->anchorPoint) {
+           case TK_ANCHOR_N:
+               x = frameX + (frameWidth - width)/2;
+               y = frameY;
+               break;
+           case TK_ANCHOR_NE:
+               x = frameX + frameWidth - width;
+               y = frameY;
+               break;
+           case TK_ANCHOR_E:
+               x = frameX + frameWidth - width;
+               y = frameY + (frameHeight - height)/2;
+               break;
+           case TK_ANCHOR_SE:
+               x = frameX + frameWidth - width;
+               y = frameY + frameHeight - height;
+               break;
+           case TK_ANCHOR_S:
+               x = frameX + (frameWidth - width)/2;
+               y = frameY + frameHeight - height;
+               break;
+           case TK_ANCHOR_SW:
+               x = frameX;
+               y = frameY + frameHeight - height;
+               break;
+           case TK_ANCHOR_W:
+               x = frameX;
+               y = frameY + (frameHeight - height)/2;
+               break;
+           case TK_ANCHOR_NW:
+               x = frameX;
+               y = frameY;
+               break;
+           case TK_ANCHOR_CENTER:
+               x = frameX + (frameWidth - width)/2;
+               y = frameY + (frameHeight - height)/2;
+               break;
+           default:
+               panic("bad frame factor in ArrangePacking");
+       }
+       width -= childPtr->doubleBw;
+       height -= childPtr->doubleBw;
+
+       /*
+        * If the window is too small to be interesting then
+        * unmap it.  Otherwise configure it and then make sure
+        * it's mapped.
+        */
+
+       if ((width <= 0) || (height <= 0)) {
+           Tk_UnmapWindow(childPtr->tkwin);
+       } else {
+           if ((x != Tk_X(childPtr->tkwin))
+                   || (y != Tk_Y(childPtr->tkwin))
+                   || (width != Tk_Width(childPtr->tkwin))
+                   || (height != Tk_Height(childPtr->tkwin))) {
+               Tk_MoveResizeWindow(childPtr->tkwin, x, y,
+                       (unsigned int) width, (unsigned int) height);
+           }
+           if (abort) {
+               goto done;
+           }
+           Tk_MapWindow(childPtr->tkwin);
+       }
+
+       /*
+        * Changes to the window's structure could cause almost anything
+        * to happen, including deleting the parent or child.  If this
+        * happens, we'll be told to abort.
+        */
+
+       if (abort) {
+           goto done;
+       }
+    }
+
+    done:
+    parentPtr->abortPtr = NULL;
+    Tk_Release((ClientData) parentPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * GetPacker --
+ *
+ *     This internal procedure is used to locate a Packer
+ *     structure for a given window, creating one if one
+ *     doesn't exist already.
+ *
+ * Results:
+ *     The return value is a pointer to the Packer structure
+ *     corresponding to tkwin.
+ *
+ * Side effects:
+ *     A new packer structure may be created.  If so, then
+ *     a callback is set up to clean things up when the
+ *     window is deleted.
+ *
+ *--------------------------------------------------------------
+ */
+
+static Packer *
+GetPacker(tkwin)
+    Tk_Window tkwin;           /* Token for window for which
+                                * packer structure is desired. */
+{
+    register Packer *packPtr;
+    Tcl_HashEntry *hPtr;
+    int new;
+
+    if (!initialized) {
+       initialized = 1;
+       Tcl_InitHashTable(&packerHashTable, TCL_ONE_WORD_KEYS);
+    }
+
+    /*
+     * See if there's already packer for this window.  If not,
+     * then create a new one.
+     */
+
+    hPtr = Tcl_CreateHashEntry(&packerHashTable, (char *) tkwin, &new);
+    if (!new) {
+       return (Packer *) Tcl_GetHashValue(hPtr);
+    }
+    packPtr = (Packer *) ckalloc(sizeof(Packer));
+    packPtr->tkwin = tkwin;
+    packPtr->parentPtr = NULL;
+    packPtr->nextPtr = NULL;
+    packPtr->childPtr = NULL;
+    packPtr->side = TOP;
+    packPtr->anchorPoint = TK_ANCHOR_CENTER;
+    packPtr->padX = packPtr->padY = 0;
+    packPtr->doubleBw = 2*Tk_Changes(tkwin)->border_width;
+    packPtr->abortPtr = NULL;
+    packPtr->flags = 0;
+    Tcl_SetHashValue(hPtr, packPtr);
+    Tk_CreateEventHandler(tkwin, StructureNotifyMask,
+           PackStructureProc, (ClientData) packPtr);
+    return packPtr;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * PackAfter --
+ *
+ *     This procedure does most of the real work of adding
+ *     one or more windows into the packing order for its parent.
+ *
+ * Results:
+ *     A standard Tcl return value.
+ *
+ * Side effects:
+ *     The geometry of the specified windows may change, both now and
+ *     again in the future.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+PackAfter(interp, prevPtr, parentPtr, argc, argv)
+    Tcl_Interp *interp;                /* Interpreter for error reporting. */
+    Packer *prevPtr;           /* Pack windows in argv just after this
+                                * window;  NULL means pack as first
+                                * child of parentPtr. */
+    Packer *parentPtr;         /* Parent in which to pack windows. */
+    int argc;                  /* Number of elements in argv. */
+    char **argv;               /* Array of lists, each containing 2
+                                * elements:  window name and side
+                                * against which to pack. */
+{
+    register Packer *packPtr;
+    Tk_Window tkwin;
+    int length, optionCount;
+    char **options;
+    int index;
+    char c;
+
+    /*
+     * Iterate over all of the window specifiers, each consisting of
+     * two arguments.  The first argument contains the window name and
+     * the additional arguments contain options such as "top" or
+     * "padx 20".
+     */
+
+    for ( ; argc > 0; argc -= 2, argv += 2, prevPtr = packPtr) {
+       if (argc < 2) {
+           Tcl_AppendResult(interp, "wrong # args: window \"",
+                   argv[0], "\" should be followed by options",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+
+       /*
+        * Find the packer for the window to be packed, and make sure
+        * that the window in which it will be packed is its parent.
+        */
+
+       tkwin = Tk_NameToWindow(interp, argv[0], parentPtr->tkwin);
+       if (tkwin == NULL) {
+           return TCL_ERROR;
+       }
+       if (Tk_Parent(tkwin) != parentPtr->tkwin) {
+           Tcl_AppendResult(interp, "tried to pack \"",
+                   argv[0], "\" in window that isn't its parent",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       packPtr = GetPacker(tkwin);
+
+       /*
+        * Process options for this window.
+        */
+
+       if (Tcl_SplitList(interp, argv[1], &optionCount, &options) != TCL_OK) {
+           return TCL_ERROR;
+       }
+       packPtr->side = TOP;
+       packPtr->anchorPoint = TK_ANCHOR_CENTER;
+       packPtr->padX = packPtr->padY = 0;
+       packPtr->flags &= ~(FILLX|FILLY|EXPAND);
+       for (index = 0 ; index < optionCount; index++) {
+           char *curOpt = options[index];
+
+           c = curOpt[0];
+           length = strlen(curOpt);
+
+           if ((c == 't')
+                   && (strncmp(curOpt, "top", length)) == 0) {
+               packPtr->side = TOP;
+           } else if ((c == 'b')
+                   && (strncmp(curOpt, "bottom", length)) == 0) {
+               packPtr->side = BOTTOM;
+           } else if ((c == 'l')
+                   && (strncmp(curOpt, "left", length)) == 0) {
+               packPtr->side = LEFT;
+           } else if ((c == 'r')
+                   && (strncmp(curOpt, "right", length)) == 0) {
+               packPtr->side = RIGHT;
+           } else if ((c == 'e')
+                   && (strncmp(curOpt, "expand", length)) == 0) {
+               packPtr->flags |= EXPAND;
+           } else if ((c == 'f')
+                   && (strcmp(curOpt, "fill")) == 0) {
+               packPtr->flags |= FILLX|FILLY;
+           } else if ((length == 5) && (strcmp(curOpt, "fillx")) == 0) {
+               packPtr->flags |= FILLX;
+           } else if ((length == 5) && (strcmp(curOpt, "filly")) == 0) {
+               packPtr->flags |= FILLY;
+           } else if ((c == 'p') && (strcmp(curOpt, "padx")) == 0) {
+               if (optionCount < (index+2)) {
+                   missingPad:
+                   Tcl_AppendResult(interp, "wrong # args: \"", curOpt,
+                           "\" option must be followed by count",
+                           (char *) NULL);
+                   goto error;
+               }
+               if ((Tcl_GetInt(interp, options[index+1], &packPtr->padX)
+                       != TCL_OK) || (packPtr->padX < 0)) {
+                   badPad:
+                   Tcl_AppendResult(interp, "bad pad value \"",
+                           options[index+1], "\":  must be positive integer",
+                           (char *) NULL);
+                   goto error;
+               }
+               index++;
+           } else if ((c == 'p') && (strcmp(curOpt, "pady")) == 0) {
+               if (optionCount < (index+2)) {
+                   goto missingPad;
+               }
+               if ((Tcl_GetInt(interp, options[index+1], &packPtr->padY)
+                       != TCL_OK) || (packPtr->padY < 0)) {
+                   goto badPad;
+               }
+               index++;
+           } else if ((c == 'f') && (length > 1)
+                   && (strncmp(curOpt, "frame", length) == 0)) {
+               if (optionCount < (index+2)) {
+                   Tcl_AppendResult(interp, "wrong # args: \"frame\" ",
+                           "option must be followed by anchor point",
+                           (char *) NULL);
+                   goto error;
+               }
+               if (Tk_GetAnchor(interp, options[index+1],
+                       &packPtr->anchorPoint) != TCL_OK) {
+                   goto error;
+               }
+               index++;
+           } else {
+               Tcl_AppendResult(interp, "bad option \"", curOpt,
+                       "\":  should be top, bottom, left, right, ",
+                       "expand, fill, fillx, filly, padx, pady, or frame",
+                       (char *) NULL);
+               goto error;
+           }
+       }
+
+       if (packPtr != prevPtr) {
+
+           /*
+            * Unpack this window if it's currently packed.
+            */
+       
+           if (packPtr->parentPtr != NULL) {
+               Unlink(packPtr);
+           }
+       
+           /*
+            * Add the window in the correct place in its parent's
+            * packing order, then make sure that the window is
+            * managed by us.
+            */
+
+           packPtr->parentPtr = parentPtr;
+           if (prevPtr == NULL) {
+               packPtr->nextPtr = parentPtr->childPtr;
+               parentPtr->childPtr = packPtr;
+           } else {
+               packPtr->nextPtr = prevPtr->nextPtr;
+               prevPtr->nextPtr = packPtr;
+           }
+           Tk_ManageGeometry(tkwin, PackReqProc, (ClientData) packPtr);
+       }
+       ckfree((char *) options);
+    }
+
+    /*
+     * Arrange for the parent to be re-packed at the first
+     * idle moment.
+     */
+
+    if (parentPtr->abortPtr != NULL) {
+       *parentPtr->abortPtr = 1;
+    }
+    if (!(parentPtr->flags & REQUESTED_REPACK)) {
+       parentPtr->flags |= REQUESTED_REPACK;
+       Tk_DoWhenIdle(ArrangePacking, (ClientData) parentPtr);
+    }
+    return TCL_OK;
+
+    error:
+    ckfree((char *) options);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Unlink --
+ *
+ *     Remove a packer from its parent's list of children.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The parent will be scheduled for repacking.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+Unlink(packPtr)
+    register Packer *packPtr;          /* Window to unlink. */
+{
+    register Packer *parentPtr, *packPtr2;
+
+    parentPtr = packPtr->parentPtr;
+    if (parentPtr == NULL) {
+       return;
+    }
+    if (parentPtr->childPtr == packPtr) {
+       parentPtr->childPtr = packPtr->nextPtr;
+    } else {
+       for (packPtr2 = parentPtr->childPtr; ; packPtr2 = packPtr2->nextPtr) {
+           if (packPtr2 == NULL) {
+               panic("Unlink couldn't find previous window");
+           }
+           if (packPtr2->nextPtr == packPtr) {
+               packPtr2->nextPtr = packPtr->nextPtr;
+               break;
+           }
+       }
+    }
+    if (!(parentPtr->flags & REQUESTED_REPACK)) {
+       parentPtr->flags |= REQUESTED_REPACK;
+       Tk_DoWhenIdle(ArrangePacking, (ClientData) parentPtr);
+    }
+    if (parentPtr->abortPtr != NULL) {
+       *parentPtr->abortPtr = 1;
+    }
+
+    packPtr->parentPtr = NULL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyPacker --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a packer at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the packer is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyPacker(clientData)
+    ClientData clientData;             /* Info about packed window that
+                                        * is now dead. */
+{
+    register Packer *packPtr = (Packer *) clientData;
+    ckfree((char *) packPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * PackStructureProc --
+ *
+ *     This procedure is invoked by the Tk event dispatcher in response
+ *     to StructureNotify events.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If a window was just deleted, clean up all its packer-related
+ *     information.  If it was just resized, repack its children, if
+ *     any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+PackStructureProc(clientData, eventPtr)
+    ClientData clientData;             /* Our information about window
+                                        * referred to by eventPtr. */
+    XEvent *eventPtr;                  /* Describes what just happened. */
+{
+    register Packer *packPtr = (Packer *) clientData;
+    if (eventPtr->type == ConfigureNotify) {
+       if ((packPtr->childPtr != NULL)
+               && !(packPtr->flags & REQUESTED_REPACK)) {
+           packPtr->flags |= REQUESTED_REPACK;
+           Tk_DoWhenIdle(ArrangePacking, (ClientData) packPtr);
+       }
+       if (packPtr->doubleBw != 2*Tk_Changes(packPtr->tkwin)->border_width) {
+           if ((packPtr->parentPtr != NULL)
+                   && !(packPtr->parentPtr->flags & REQUESTED_REPACK)) {
+               packPtr->doubleBw = 2*Tk_Changes(packPtr->tkwin)->border_width;
+               packPtr->parentPtr->flags |= REQUESTED_REPACK;
+               Tk_DoWhenIdle(ArrangePacking, (ClientData) packPtr->parentPtr);
+           }
+       }
+    } else if (eventPtr->type == DestroyNotify) {
+       register Packer *packPtr2;
+
+       if (packPtr->parentPtr != NULL) {
+           Unlink(packPtr);
+       }
+       for (packPtr2 = packPtr->childPtr; packPtr2 != NULL;
+               packPtr2 = packPtr2->nextPtr) {
+           packPtr2->parentPtr = NULL;
+           packPtr2->nextPtr = NULL;
+       }
+       Tcl_DeleteHashEntry(Tcl_FindHashEntry(&packerHashTable,
+               (char *) packPtr->tkwin));
+       if (packPtr->flags & REQUESTED_REPACK) {
+           Tk_CancelIdleCall(ArrangePacking, (ClientData) packPtr);
+       }
+       packPtr->tkwin = NULL;
+       Tk_EventuallyFree((ClientData) packPtr, DestroyPacker);
+    }
+}
diff --git a/src/tk/tkpixmap.c b/src/tk/tkpixmap.c
new file mode 100644 (file)
index 0000000..3a0d9ca
--- /dev/null
@@ -0,0 +1,657 @@
+/* 
+ * tkPixmap.c --
+ *
+ *     This file maintains a database of read-only pixmaps for the Tk
+ *     toolkit.  This allows pixmaps to be shared between widgets and
+ *     also avoids interactions with the X server.
+ *
+ * Copyright 1992 by Sven Delmas
+ *
+ * This source is based upon the file tkBitmap.c from:
+ *
+ * Copyright 1990-1992 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *   file: /user6/ouster/wish/RCS/tkBitmap.c,v 1.16
+ *           92/08/24 09:45:43 ouster Exp $ SPRITE (Berkeley);
+ */
+
+#if defined(USE_XPM3)
+
+#ifndef lint
+static char *AtFSid = "$Header: tkPixmap.c[1.1] Mon Sep 28 14:12:35 1992 garfield@cs.tu-berlin.de frozen $";
+#endif /* not lint */
+
+#include "tkconfig.h"
+#include "tk.h"
+
+/*
+ * The includes below are for pre-defined bitmaps.
+ */
+
+#include "bitmaps/gray50"
+#include "bitmaps/gray25"
+
+/*
+ * Include the xpm 3 defines for color pixmaps
+ */
+//#include "xpmtk.h"
+#include <xpm.h>
+
+/*
+ * One of the following data structures exists for each bitmap that is
+ * currently in use.  Each structure is indexed with both "idTable" and
+ * "nameTable".
+ */
+
+typedef struct {
+    Pixmap bitmap;             /* X identifier for bitmap.  None means this
+                                * bitmap was created by Tk_DefinePixmap
+                                * and it isn't currently in use. */
+    unsigned int width, height;        /* Dimensions of bitmap. */
+    Display *display;          /* Display for which bitmap is valid. */
+    int refCount;              /* Number of active uses of bitmap. */
+    Tcl_HashEntry *hashPtr;    /* Entry in nameTable for this structure
+                                * (needed when deleting). */
+} TkBitmap;
+
+/*
+ * Hash table to map from a textual description of a bitmap to the
+ * TkBitmap record for the bitmap, and key structure used in that
+ * hash table:
+ */
+
+static Tcl_HashTable nameTable;
+typedef struct {
+    Tk_Uid name;               /* Textual name for desired bitmap. */
+    Screen *screen;            /* Screen for which bitmap will be used. */
+} NameKey;
+
+/*
+ * Hash table that maps from bitmap identifiers to the TkBitmap structure
+ * for the pixmap.  This table is indexed by Bitmap ids, and is used by
+ * Tk_FreePixmap.
+ */
+
+static Tcl_HashTable idTable;
+
+/*
+ * For each call to Tk_DefinePixmap one of the following structures is
+ * created to hold information about the pixmap.
+ */
+
+typedef struct {
+    char *source;              /* Bits for bitmap. */
+    Pixmap pixmap;              /* Pre-defined pixmap */
+    unsigned int width, height;        /* Dimensions of bitmap. */
+} PredefBitmap;
+
+/*
+ * Hash table create by Tk_DefinePixmap to map from a name to a
+ * collection of in-core data about a bitmap.  The table is
+ * indexed by the address of the data for the bitmap, and the entries
+ * contain pointers to PredefBitmap structures.
+ */
+
+static Tcl_HashTable predefTable;
+
+/*
+ * Hash table used by Tk_GetPixmapFromData to map from a collection
+ * of in-core data about a bitmap to a Tk_Uid giving an automatically-
+ * generated name for the bitmap:
+ */
+
+static Tcl_HashTable dataTable;
+typedef struct {
+    char *source;              /* Bitmap bits. */
+    unsigned int width, height;        /* Dimensions of bitmap. */
+} DataKey;
+
+static int initialized = 0;    /* 0 means static structures haven't been
+                                * initialized yet. */
+
+/*
+ * Forward declarations for procedures defined in this file:
+ */
+
+static void            PixmapInit _ANSI_ARGS_((Tk_Window tkwin));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_GetPixmap --
+ *
+ *     Given a string describing a bitmap or pixmap, locate (or create
+ *      if necessary) a pixmap that fits the description.
+ *
+ * Results:
+ *     The return value is the X identifer for the desired pixmap,
+ *      unless string couldn't be parsed correctly.  In this case,
+ *      None is returned and an error message is left in
+ *      interp->result.  The caller should never modify the pixmap
+ *      that is returned, and should eventually call Tk_FreePixmap
+ *      when the pixmap is no longer needed.
+ *
+ * Side effects:
+ *     The pixmap is added to an internal database with a reference count.
+ *     For each call to this procedure, there should eventually be a call
+ *     to Tk_FreePixmap, so that the database can be cleaned up when pixmaps
+ *     aren't needed anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+Pixmap
+Tk_GetPixmap(interp, tkwin, string)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    Tk_Window tkwin;           /* Window in which pixmap will be used. */
+    Tk_Uid string;             /* Description of pixmap.  See manual entry
+                                * for details on legal syntax. */
+{
+    NameKey key;
+    Tcl_HashEntry *nameHashPtr, *idHashPtr, *predefHashPtr;
+    register TkBitmap *bitmapPtr;
+    PredefBitmap *predefPtr;
+    int new;
+    Pixmap bitmap;
+    Pixmap bitmap_shape;
+    unsigned int width, height;
+    int dummy2;
+    XpmAttributes xpm_attributes;
+    Display *dpy = Tk_Display(tkwin);
+
+    if (!initialized) {
+       PixmapInit(tkwin);
+    }
+
+    key.name = string;
+    key.screen = Tk_Screen(tkwin);
+    nameHashPtr = Tcl_CreateHashEntry(&nameTable, (char *) &key, &new);
+    if (!new) {
+       bitmapPtr = (TkBitmap *) Tcl_GetHashValue(nameHashPtr);
+       bitmapPtr->refCount++;
+       return bitmapPtr->bitmap;
+    }
+
+    /*
+     * No suitable bitmap exists.  Create a new bitmap from the
+     * information contained in the string.  If the string starts
+     * with "@" then the rest of the string is a file name containing
+     * the bitmap.  Otherwise the string must refer to a bitmap
+     * defined by a call to Tk_DefinePixmap.
+     */
+
+    if (*string == '@') {
+       string = Tcl_TildeSubst(interp, string + 1);
+       if (string == NULL) {
+           goto error;
+       }
+
+       if (XReadBitmapFile(dpy, RootWindowOfScreen(Tk_Screen(tkwin)),
+               string, &width, &height, &bitmap_shape, &dummy2, &dummy2)
+               != BitmapSuccess)
+         {
+           xpm_attributes.visual = Tk_DefaultVisual(Tk_Screen(tkwin));
+           xpm_attributes.colormap = Tk_DefaultColormap(Tk_Screen(tkwin));
+           xpm_attributes.depth = Tk_DefaultDepth(Tk_Screen(tkwin));
+           xpm_attributes.valuemask = XpmVisual | XpmColormap | XpmDepth;
+
+           if (XpmReadFileToPixmap(dpy, RootWindowOfScreen(Tk_Screen(tkwin)),
+                                   string, &bitmap, &bitmap_shape,
+                                   &xpm_attributes) != BitmapSuccess) {
+               Tcl_AppendResult(interp, "error reading bitmap file \"",
+                              string, "\"", (char *) NULL);
+               goto error;
+           } {
+                width = xpm_attributes.width;
+                height = xpm_attributes.height;
+               XpmFreeAttributes(&xpm_attributes);
+           }
+       } else {
+            bitmap = XCreatePixmap(dpy, RootWindowOfScreen(Tk_Screen(tkwin)),
+                                  width, height,
+                                  Tk_DefaultDepth(Tk_Screen(tkwin)));
+           XCopyPlane(dpy, bitmap_shape, bitmap,
+                      Tk_DefaultGC(Tk_Screen(tkwin)),
+                      0, 0, width, height, 0, 0, 1);
+       }
+    } else {
+        /* first try for a display-specific version */
+       predefHashPtr = Tcl_FindHashEntry(&predefTable, (char *) &key);
+       if (predefHashPtr == NULL) {
+            /* try for a non-display specific version */
+           key.screen = (Screen*) NULL;
+           predefHashPtr = Tcl_FindHashEntry(&predefTable, (char *) &key);
+           if (predefHashPtr == NULL) {
+               /* give up */
+               Tcl_AppendResult(interp, "pixmap \"", string,
+                                "\" not defined", (char *) NULL);
+               goto error;
+           }
+       }
+       predefPtr = (PredefBitmap *) Tcl_GetHashValue(predefHashPtr);
+       width = predefPtr->width;
+       height = predefPtr->height;
+       if (predefPtr->source != NULL) {
+           bitmap_shape =
+               XCreateBitmapFromData(dpy, Tk_DefaultRootWindow(dpy),
+                                     predefPtr->source, width, height);
+           bitmap = XCreatePixmap(dpy, RootWindowOfScreen(Tk_Screen(tkwin)),
+                                  width, height,
+                                  Tk_DefaultDepth(Tk_Screen(tkwin)));
+           XCopyPlane(dpy, bitmap_shape, bitmap,
+                      Tk_DefaultGC(Tk_Screen(tkwin)),
+                      0, 0, width, height, 0, 0, 1);
+       } else {
+           if (predefPtr->pixmap != None) {
+               bitmap = predefPtr->pixmap;
+           } else {
+             bitmap =
+                 XCreatePixmap(dpy, RootWindowOfScreen(Tk_Screen(tkwin)),
+                               width, height,
+                               Tk_DefaultDepth(Tk_Screen(tkwin)));
+           }
+        }
+    }
+
+    /*
+     * Add information about this bitmap to our database.
+     */
+
+    bitmapPtr = (TkBitmap *) ckalloc(sizeof(TkBitmap));
+    bitmapPtr->bitmap = bitmap;
+    bitmapPtr->width = width;
+    bitmapPtr->height = height;
+    bitmapPtr->display = dpy;
+    bitmapPtr->refCount = 1;
+    bitmapPtr->hashPtr = nameHashPtr;
+    idHashPtr = Tcl_CreateHashEntry(&idTable, (char *) bitmapPtr->bitmap,
+           &new);
+    if (!new) {
+/* deh patched to support multiple displays */
+/*     panic("pixmap already registered in Tk_GetPixmap"); */
+        bitmapPtr->refCount = 1000;
+    }
+    Tcl_SetHashValue(nameHashPtr, bitmapPtr);
+    Tcl_SetHashValue(idHashPtr, bitmapPtr);
+    return bitmapPtr->bitmap;
+
+    error:
+    Tcl_DeleteHashEntry(nameHashPtr);
+    return None;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_DefinePixmap --
+ *
+ *     This procedure associates a textual name with a binary pixmap
+ *     description, so that the name may be used to refer to the
+ *     pixmap in future calls to Tk_GetPixmap. The pixmap can
+ *      be pre-created by the user, or can be created later
+ *      by Tk_GetPixmap().  Since pixmaps are display-specific,
+ *      a user supplied pixmap will be associated with tkwin's display.
+ *      If pixmap is given as None, then a new pixmap will be created
+ *      by Tk_GetPixmap for each unique display.
+ *
+ * Results:
+ *     A standard Tcl result.  If an error occurs then TCL_ERROR is
+ *     returned and a message is left in interp->result.
+ *
+ * Side effects:
+ *     "Name" is entered into the pixmap table and may be used from
+ *     here on to refer to the given pixmap.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tk_DefinePixmap(interp, name, tkwin, pixmap, source, width, height)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    Tk_Uid name;               /* Name to use for bitmap.  Must not already
+                                * be defined as a bitmap. */
+    Tk_Window tkwin;            /* any window on screen where pixmap lives */
+    Pixmap pixmap;              /* pixmap to associate with name,
+                                * or None to create a new pixmap */
+    char *source;              /* Address of bits for bitmap. */
+    unsigned int width;                /* Width of bitmap. */
+    unsigned int height;       /* Height of bitmap. */
+{
+    int new;
+    Tcl_HashEntry *predefHashPtr;
+    PredefBitmap *predefPtr;
+    NameKey key;
+
+    if (!initialized) {
+       PixmapInit(tkwin);
+    }
+
+    key.name = name;
+    key.screen = (pixmap != None) ? Tk_Screen(tkwin) : (Screen *)NULL;
+    predefHashPtr = Tcl_CreateHashEntry(&predefTable, (char *) &key, &new);
+    if (!new) {
+        Tcl_AppendResult(interp, "bitmap \"", name,
+               "\" is already defined", (char *) NULL);
+       return TCL_ERROR;
+    }
+    predefPtr = (PredefBitmap *) malloc(sizeof(PredefBitmap));
+    predefPtr->source = source;
+    predefPtr->pixmap = pixmap;
+    predefPtr->width = width;
+    predefPtr->height = height;
+    Tcl_SetHashValue(predefHashPtr, predefPtr);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_NameOfPixmap --
+ *
+ *     Given a pixmap, return a textual string identifying the
+ *     pixmap.
+ *
+ * Results:
+ *     The return value is the string name associated with pixmap.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+Tk_Uid
+Tk_NameOfPixmap(bitmap)
+    Pixmap bitmap;                     /* Bitmap whose name is wanted. */
+{
+    Tcl_HashEntry *idHashPtr;
+    TkBitmap *bitmapPtr;
+
+    if (!initialized) {
+       unknown:
+       panic("Tk_NameOfPixmap received unknown pixmap argument");
+    }
+
+    idHashPtr = Tcl_FindHashEntry(&idTable, (char *) bitmap);
+    if (idHashPtr == NULL) {
+       goto unknown;
+    }
+    bitmapPtr = (TkBitmap *) Tcl_GetHashValue(idHashPtr);
+    if (bitmapPtr->hashPtr == NULL) {
+        /* the bitmap has been un-defined */
+        return Tk_GetUid("UndefinedBitmap");
+    }
+    return ((NameKey *) bitmapPtr->hashPtr->key.words)->name;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_SizeOfPixmap --
+ *
+ *     Given a pixmap managed by this module, returns the width
+ *     and height of the pixmap..
+ *
+ * Results:
+ *     The words at *widthPtr and *heightPtr are filled in with
+ *     the dimenstions of pixmap.
+ *
+ * Side effects:
+ *     If pixmap isn't managed by this module then the procedure
+ *     panics..
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_SizeOfPixmap(bitmap, widthPtr, heightPtr)
+    Pixmap bitmap;                     /* Bitmap whose size is wanted. */
+    unsigned int *widthPtr;            /* Store bitmap width here. */
+    unsigned int *heightPtr;           /* Store bitmap height here. */
+{
+    Tcl_HashEntry *idHashPtr;
+    TkBitmap *bitmapPtr;
+
+    if (!initialized) {
+       unknownBitmap:
+       panic("Tk_SizeOfPixmap received unknown pixmap argument");
+    }
+
+    idHashPtr = Tcl_FindHashEntry(&idTable, (char *) bitmap);
+    if (idHashPtr == NULL) {
+       goto unknownBitmap;
+    }
+    bitmapPtr = (TkBitmap *) Tcl_GetHashValue(idHashPtr);
+    *widthPtr = bitmapPtr->width;
+    *heightPtr = bitmapPtr->height;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_FreePixmap --
+ *
+ *     This procedure is called to release a pixmap allocated by
+ *     Tk_GetPixmap.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The reference count associated with bitmap is decremented, and
+ *     it is officially deallocated if no-one is using it anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_FreePixmap(bitmap)
+    Pixmap bitmap;                     /* Bitmap to be released. */
+{
+    Tcl_HashEntry *idHashPtr;
+    register TkBitmap *bitmapPtr;
+
+    if (!initialized) {
+       panic("Tk_FreePixmap called before Tk_GetPixmap");
+    }
+
+    idHashPtr = Tcl_FindHashEntry(&idTable, (char *) bitmap);
+    if (idHashPtr == NULL) {
+       panic("Tk_FreePixmap received unknown pixmap argument");
+    }
+    bitmapPtr = (TkBitmap *) Tcl_GetHashValue(idHashPtr);
+    bitmapPtr->refCount--;
+    if (bitmapPtr->refCount == 0) {
+       XFreePixmap(bitmapPtr->display, bitmapPtr->bitmap);
+       Tcl_DeleteHashEntry(idHashPtr);
+        if (bitmapPtr->hashPtr != NULL) {
+            /* If hashPtr is NULL, the bitmap has been undefined,
+             * and already removed from the name table */
+            Tcl_DeleteHashEntry(bitmapPtr->hashPtr);
+        }
+       ckfree((char *) bitmapPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_GetPixmapFromData --
+ *
+ *     Given a description of the bits for a pixmap, make a pixmap that
+ *     has the given properties.
+ *
+ * Results:
+ *     The return value is the X identifer for the desired pixmap,
+ *     unless it couldn't be created properly. In this case, None is
+ *      returned and an error message is left in interp->result.  The
+ *      caller should never modify the bitmap that is returned, and
+ *      should eventually call Tk_FreePixmap when the pixmap is no
+ *      longer needed.
+ *
+ * Side effects:
+ *     The pixmap is added to an internal database with a reference count.
+ *     For each call to this procedure, there should eventually be a call
+ *     to Tk_FreePixmap, so that the database can be cleaned up when pixmaps
+ *     aren't needed anymore.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+Pixmap
+Tk_GetPixmapFromData(interp, tkwin, source, width, height)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    Tk_Window tkwin;           /* Window in which bitmap will be used. */
+    char *source;              /* Bitmap data for bitmap shape. */
+    unsigned int width, height;        /* Dimensions of bitmap. */
+{
+    DataKey key;
+    Tcl_HashEntry *dataHashPtr;
+    Tk_Uid name = NULL;                /* Initialization need only to prevent
+                                * compiler warning. */
+    int new;
+    static autoNumber = 0;
+    char string[20];
+
+    if (!initialized) {
+       PixmapInit(tkwin);
+    }
+
+    key.source = source;
+    key.width = width;
+    key.height = height;
+    dataHashPtr = Tcl_CreateHashEntry(&dataTable, (char *) &key, &new);
+    if (!new) {
+       name = (Tk_Uid) Tcl_GetHashValue(dataHashPtr);
+    } else {
+       autoNumber++;
+       sprintf(string, "_tk%d", autoNumber);
+       name = Tk_GetUid(string);
+       Tcl_SetHashValue(dataHashPtr, name);
+       if (Tk_DefinePixmap(interp, name, tkwin, None, source, width,
+                           height) != TCL_OK) {
+           Tcl_DeleteHashEntry(dataHashPtr);
+           return TCL_ERROR;
+       }
+    }
+    return Tk_GetPixmap(interp, tkwin, name);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * PixmapInit --
+ *
+ *     Initialize the structures used for pixmap management.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Read the code.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+PixmapInit(tkwin)
+    Tk_Window tkwin;          /* any window on screen where pixmap lives */
+{
+    Tcl_Interp *dummy;
+
+    dummy = Tcl_CreateInterp();
+    initialized = 1;
+    Tcl_InitHashTable(&nameTable, sizeof(NameKey)/sizeof(int));
+    Tcl_InitHashTable(&dataTable, sizeof(DataKey)/sizeof(int));
+    Tcl_InitHashTable(&predefTable, sizeof(NameKey)/sizeof(int));
+    Tcl_InitHashTable(&idTable, TCL_ONE_WORD_KEYS);
+
+    Tk_DefinePixmap(dummy, Tk_GetUid("gray50"), tkwin, None,
+                   (char *)gray50_bits, gray50_width, gray50_height);
+    Tk_DefinePixmap(dummy, Tk_GetUid("gray25"), tkwin, None,
+                   (char *)gray25_bits, gray25_width, gray25_height);
+    Tcl_DeleteInterp(dummy);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_UndefinePixmap --
+ *
+ *     This procedure removes any association "name" with
+ *     a bitmap or pixmap.  This can be used to undefine
+ *     names defined by either Tk_DefinePixmap or Tk_DefinePixmap.
+ *     If tkwin is NULL, only display-independent pixmaps will
+ *     be removed, otherwise both display-independent and 
+ *     the pixmap associated with tkwin will be undefined.
+ *
+ * Results:
+ *     A standard Tcl result.  If an error occurs then TCL_ERROR is
+ *     returned and a message is left in interp->result.
+ *
+ * Side effects:
+ *     "Name" is removed from the predef table.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+Tk_UndefinePixmap(interp, name, tkwin)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    Tk_Uid name;               /* Name of bitmap/pixmap to undefine */
+    Tk_Window tkwin;            /* any window on screen where pixmap lives */
+{
+    NameKey key;
+    Tcl_HashEntry *predefHashPtr, *nameHashPtr;
+    TkBitmap *bitmapPtr;
+    int cnt = 0;
+
+    if (!initialized) {
+       PixmapInit(tkwin);
+    }
+
+    key.name = name;
+    key.screen = (Screen *) NULL;
+    predefHashPtr = Tcl_FindHashEntry(&predefTable, (char*)&key);
+    if (predefHashPtr != NULL) {
+       ++cnt;
+        Tcl_DeleteHashEntry(predefHashPtr);
+    }
+
+    key.screen = Tk_Screen(tkwin);
+    predefHashPtr = Tcl_FindHashEntry(&predefTable, (char*)&key);
+    if (predefHashPtr != NULL) {
+       ++cnt;
+        Tcl_DeleteHashEntry(predefHashPtr);
+    }
+    if (cnt == 0) {
+        Tcl_AppendResult(interp, "pixmap \"", name,
+               "\" doesn't exist", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Remove it from the name table if it is there (it might not
+     * have been created yet, it which case we wont find it).  We
+     * delete it from the name table and mark the hashPtr as NULL
+     * so that we know it has been deleted.  The pixmap still exists,
+     * and well later be freed and removed from idTable by Tk_FreeBitmap().
+     */
+    nameHashPtr = Tcl_FindHashEntry(&nameTable, (char *) &key);
+    if (nameHashPtr != NULL) {
+       bitmapPtr = (TkBitmap *) Tcl_GetHashValue(nameHashPtr);
+       /* assert(nameHashPtr == bitmapPtr->hashPtr); */
+       /* assert(bitmapPtr->refCount > 0); */
+       bitmapPtr->hashPtr = (Tcl_HashEntry*) NULL;
+       Tcl_DeleteHashEntry(nameHashPtr);
+    }
+    return TCL_OK;
+}
+
+#endif
diff --git a/src/tk/tkplace.c b/src/tk/tkplace.c
new file mode 100644 (file)
index 0000000..64f4424
--- /dev/null
@@ -0,0 +1,939 @@
+/* 
+ * tkPlace.c --
+ *
+ *     This file contains code to implement a simple geometry manager
+ *     for Tk based on absolute placement or "rubber-sheet" placement.
+ *
+ * Copyright 1992 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkPlace.c,v 1.6 92/06/10 08:59:28 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tkconfig.h"
+#include "tkint.h"
+
+/*
+ * Border modes for relative placement:
+ *
+ * BM_INSIDE:          relative distances computed using area inside
+ *                     all borders of master window.
+ * BM_OUTSIDE:         relative distances computed using outside area
+ *                     that includes all borders of master.
+ * BM_IGNORE:          border issues are ignored:  place relative to
+ *                     master's actual window size.
+ */
+
+typedef enum {BM_INSIDE, BM_OUTSIDE, BM_IGNORE} BorderMode;
+
+/*
+ * For each window whose geometry is managed by the placer there is
+ * a structure of the following type:
+ */
+
+typedef struct Slave {
+    Tk_Window tkwin;           /* Tk's token for window. */
+    struct Master *masterPtr;  /* Pointer to information for window
+                                * relative to which tkwin is placed.
+                                * This isn't necessarily the logical
+                                * parent of tkwin.  NULL means the
+                                * master was deleted or never assigned. */
+    struct Slave *nextPtr;     /* Next in list of windows placed relative
+                                * to same master (NULL for end of list). */
+
+    /*
+     * Geometry information for window;  where there are both relative
+     * and absolute values for the same attribute (e.g. x and relX) only
+     * one of them is actually used, depending on flags.
+     */
+
+    int x, y;                  /* X and Y pixel coordinates for tkwin. */
+    float relX, relY;          /* X and Y coordinates relative to size of
+                                * master. */
+    int width, height;         /* Absolute dimensions for tkwin. */
+    float relWidth, relHeight; /* Dimensions for tkwin relative to size of
+                                * master. */
+    Tk_Anchor anchor;          /* Which point on tkwin is placed at the
+                                * given position. */
+    BorderMode borderMode;     /* How to treat borders of master window. */
+    int flags;                 /* Various flags;  see below for bit
+                                * definitions. */
+} Slave;
+
+/*
+ * Flag definitions for Slave structures:
+ *
+ * CHILD_REL_X -               1 means use relX field;  0 means use x.
+ * CHILD_REL_Y -               1 means use relY field;  0 means use y;
+ * CHILD_WIDTH -               1 means use width field;
+ * CHILD_REL_WIDTH -           1 means use relWidth;  if neither this nor
+ *                             CHILD_WIDTH is 1, use window's requested
+ *                             width.
+ * CHILD_HEIGHT -              1 means use height field;
+ * CHILD_REL_HEIGHT -          1 means use relHeight;  if neither this nor
+ *                             CHILD_HEIGHT is 1, use window's requested
+ *                             height.
+ */
+
+#define CHILD_REL_X            1
+#define CHILD_REL_Y            2
+#define CHILD_WIDTH            4
+#define CHILD_REL_WIDTH                8
+#define CHILD_HEIGHT           0x10
+#define CHILD_REL_HEIGHT       0x20
+
+/*
+ * For each master window that has a slave managed by the placer there
+ * is a structure of the following form:
+ */
+
+typedef struct Master {
+    Tk_Window tkwin;           /* Tk's token for master window. */
+    struct Slave *slavePtr;    /* First in linked list of slaves
+                                * placed relative to this master. */
+    int flags;                 /* See below for bit definitions. */
+} Master;
+
+/*
+ * Flag definitions for masters:
+ *
+ * PARENT_RECONFIG_PENDING -   1 means that a call to RecomputePlacement
+ *                             is already pending via a Do_When_Idle handler.
+ */
+
+#define PARENT_RECONFIG_PENDING        1
+
+/*
+ * The hash tables below both use Tk_Window tokens as keys.  They map
+ * from Tk_Windows to Slave and Master structures for windows, if they
+ * exist.
+ */
+
+static int initialized = 0;
+static Tcl_HashTable masterTable;
+static Tcl_HashTable slaveTable;
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            SlaveStructureProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static int             ConfigureSlave _ANSI_ARGS_((Tcl_Interp *interp,
+                           Slave *slavePtr, int argc, char **argv));
+static Slave *         FindSlave _ANSI_ARGS_((Tk_Window tkwin));
+static Master *                FindMaster _ANSI_ARGS_((Tk_Window tkwin));
+static void            MasterStructureProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static void            PlaceRequestProc _ANSI_ARGS_((ClientData clientData,
+                           Tk_Window tkwin));
+static void            RecomputePlacement _ANSI_ARGS_((ClientData clientData));
+static void            UnlinkSlave _ANSI_ARGS_((Slave *slavePtr));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_PlaceCmd --
+ *
+ *     This procedure is invoked to process the "place" Tcl
+ *     commands.  See the user documentation for details on
+ *     what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_PlaceCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin;
+    Slave *slavePtr;
+    Tcl_HashEntry *hPtr;
+    int length;
+    char c;
+
+    /*
+     * Initialize, if that hasn't been done yet.
+     */
+
+    if (!initialized) {
+       Tcl_InitHashTable(&masterTable, TCL_ONE_WORD_KEYS);
+       Tcl_InitHashTable(&slaveTable, TCL_ONE_WORD_KEYS);
+       initialized = 1;
+    }
+
+    if (argc < 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option|pathName args", (char *) NULL);
+       return TCL_ERROR;
+    }
+    c = argv[1][0];
+    length = strlen(argv[1]);
+
+    /*
+     * Handle special shortcut where window name is first argument.
+     */
+
+    if (c == '.') {
+       tkwin = Tk_NameToWindow(interp, argv[1], (Tk_Window) clientData);
+       if (tkwin == NULL) {
+           return TCL_ERROR;
+       }
+       slavePtr = FindSlave(tkwin);
+       return ConfigureSlave(interp, slavePtr, argc-2, argv+2);
+    }
+
+    /*
+     * Handle more general case of option followed by window name followed
+     * by possible additional arguments.
+     */
+
+    tkwin = Tk_NameToWindow(interp, argv[2], (Tk_Window) clientData);
+    if (tkwin == NULL) {
+       return TCL_ERROR;
+    }
+    if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)) {
+       if (argc < 5) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0],
+                   " configure pathName option value ?option value ...?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       slavePtr = FindSlave(tkwin);
+       return ConfigureSlave(interp, slavePtr, argc-3, argv+3);
+    } else if ((c == 'd') && (strncmp(argv[1], "dependents", length) == 0)) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " dependents pathName\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       hPtr = Tcl_FindHashEntry(&masterTable, (char *) tkwin);
+       if (hPtr != NULL) {
+           Master *masterPtr;
+           masterPtr = (Master *) Tcl_GetHashValue(hPtr);
+           for (slavePtr = masterPtr->slavePtr; slavePtr != NULL;
+                   slavePtr = slavePtr->nextPtr) {
+               Tcl_AppendElement(interp, Tk_PathName(slavePtr->tkwin), 0);
+           }
+       }
+    } else if ((c == 'f') && (strncmp(argv[1], "forget", length) == 0)) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " forget pathName\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       hPtr = Tcl_FindHashEntry(&slaveTable, (char *) tkwin);
+       if (hPtr == NULL) {
+           return TCL_OK;
+       }
+       slavePtr = (Slave *) Tcl_GetHashValue(hPtr);
+       UnlinkSlave(slavePtr);
+       Tcl_DeleteHashEntry(hPtr);
+       Tk_DeleteEventHandler(tkwin, StructureNotifyMask, SlaveStructureProc,
+               (ClientData) slavePtr);
+       Tk_ManageGeometry(tkwin, (Tk_GeometryProc *) NULL, (ClientData) NULL);
+       Tk_UnmapWindow(tkwin);
+       ckfree((char *) slavePtr);
+    } else if ((c == 'i') && (strncmp(argv[1], "info", length) == 0)) {
+       char buffer[50];
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " info pathName\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       hPtr = Tcl_FindHashEntry(&slaveTable, (char *) tkwin);
+       if (hPtr == NULL) {
+           return TCL_OK;
+       }
+       slavePtr = (Slave *) Tcl_GetHashValue(hPtr);
+       if (slavePtr->flags & CHILD_REL_X) {
+           sprintf(buffer, "-relx %.4g", slavePtr->relX);
+       } else {
+           sprintf(buffer, "-x %d", slavePtr->x);
+       }
+       Tcl_AppendResult(interp, buffer, (char *) NULL);
+       if (slavePtr->flags & CHILD_REL_Y) {
+           sprintf(buffer, " -rely %.4g", slavePtr->relY);
+       } else {
+           sprintf(buffer, " -y %d", slavePtr->y);
+       }
+       Tcl_AppendResult(interp, buffer, (char *) NULL);
+       if (slavePtr->flags & CHILD_REL_WIDTH) {
+           sprintf(buffer, " -relwidth %.4g", slavePtr->relWidth);
+           Tcl_AppendResult(interp, buffer, (char *) NULL);
+       } else if (slavePtr->flags & CHILD_WIDTH) {
+           sprintf(buffer, " -width %d", slavePtr->width);
+           Tcl_AppendResult(interp, buffer, (char *) NULL);
+       }
+       if (slavePtr->flags & CHILD_REL_HEIGHT) {
+           sprintf(buffer, " -relheight %.4g", slavePtr->relHeight);
+           Tcl_AppendResult(interp, buffer, (char *) NULL);
+       } else if (slavePtr->flags & CHILD_HEIGHT) {
+           sprintf(buffer, " -height %d", slavePtr->height);
+           Tcl_AppendResult(interp, buffer, (char *) NULL);
+       }
+       Tcl_AppendResult(interp, " -anchor ", Tk_NameOfAnchor(slavePtr->anchor),
+               (char *) NULL);
+       if (slavePtr->borderMode == BM_OUTSIDE) {
+           Tcl_AppendResult(interp, " -bordermode outside", (char *) NULL);
+       } else if (slavePtr->borderMode == BM_IGNORE) {
+           Tcl_AppendResult(interp, " -bordermode ignore", (char *) NULL);
+       }
+       if ((slavePtr->masterPtr != NULL)
+               && (slavePtr->masterPtr->tkwin != Tk_Parent(slavePtr->tkwin))) {
+           Tcl_AppendResult(interp, " -in ",
+                   Tk_PathName(slavePtr->masterPtr->tkwin), (char *) NULL);
+       }
+    } else {
+       Tcl_AppendResult(interp, "unknown or ambiguous option \"", argv[1],
+               "\": must be configure, dependents, forget, or info",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * FindSlave --
+ *
+ *     Given a Tk_Window token, find the Slave structure corresponding
+ *     to that token (making a new one if necessary).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A new Slave structure may be created.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static Slave *
+FindSlave(tkwin)
+    Tk_Window tkwin;           /* Token for desired slave. */
+{
+    Tcl_HashEntry *hPtr;
+    register Slave *slavePtr;
+    int new;
+
+    hPtr = Tcl_CreateHashEntry(&slaveTable, (char *) tkwin, &new);
+    if (new) {
+       slavePtr = (Slave *) ckalloc(sizeof(Slave));
+       slavePtr->tkwin = tkwin;
+       slavePtr->masterPtr = NULL;
+       slavePtr->nextPtr = NULL;
+       slavePtr->x = slavePtr->y = 0;
+       slavePtr->relX = slavePtr->relY = 0.0;
+       slavePtr->width = slavePtr->height = 0;
+       slavePtr->relWidth = slavePtr->relHeight = 0.0;
+       slavePtr->anchor = TK_ANCHOR_NW;
+       slavePtr->borderMode = BM_INSIDE;
+       slavePtr->flags = 0;
+       Tcl_SetHashValue(hPtr, slavePtr);
+       Tk_CreateEventHandler(tkwin, StructureNotifyMask, SlaveStructureProc,
+               (ClientData) slavePtr);
+       Tk_ManageGeometry(tkwin, PlaceRequestProc, (ClientData) slavePtr);
+    } else {
+       slavePtr = (Slave *) Tcl_GetHashValue(hPtr);
+    }
+    return slavePtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * UnlinkSlave --
+ *
+ *     This procedure removes a slave window from the chain of slaves
+ *     in its master.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The slave list of slavePtr's master changes.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+UnlinkSlave(slavePtr)
+    Slave *slavePtr;           /* Slave structure to be unlinked. */
+{
+    register Master *masterPtr;
+    register Slave *prevPtr;
+
+    masterPtr = slavePtr->masterPtr;
+    if (masterPtr == NULL) {
+       return;
+    }
+    if (masterPtr->slavePtr == slavePtr) {
+       masterPtr->slavePtr = slavePtr->nextPtr;
+    } else {
+       for (prevPtr = masterPtr->slavePtr; ;
+               prevPtr = prevPtr->nextPtr) {
+           if (prevPtr == NULL) {
+               panic("UnlinkSlave couldn't find slave to unlink");
+           }
+           if (prevPtr->nextPtr == slavePtr) {
+               prevPtr->nextPtr = slavePtr->nextPtr;
+               break;
+           }
+       }
+    }
+    slavePtr->masterPtr = NULL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * FindMaster --
+ *
+ *     Given a Tk_Window token, find the Master structure corresponding
+ *     to that token (making a new one if necessary).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A new Master structure may be created.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static Master *
+FindMaster(tkwin)
+    Tk_Window tkwin;           /* Token for desired master. */
+{
+    Tcl_HashEntry *hPtr;
+    register Master *masterPtr;
+    int new;
+
+    hPtr = Tcl_CreateHashEntry(&masterTable, (char *) tkwin, &new);
+    if (new) {
+       masterPtr = (Master *) ckalloc(sizeof(Master));
+       masterPtr->tkwin = tkwin;
+       masterPtr->slavePtr = NULL;
+       masterPtr->flags = 0;
+       Tcl_SetHashValue(hPtr, masterPtr);
+       Tk_CreateEventHandler(masterPtr->tkwin, StructureNotifyMask,
+               MasterStructureProc, (ClientData) masterPtr);
+    } else {
+       masterPtr = (Master *) Tcl_GetHashValue(hPtr);
+    }
+    return masterPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureSlave --
+ *
+ *     This procedure is called to process an argv/argc list to
+ *     reconfigure the placement of a window.
+ *
+ * Results:
+ *     A standard Tcl result.  If an error occurs then a message is
+ *     left in interp->result.
+ *
+ * Side effects:
+ *     Information in slavePtr may change, and slavePtr's master is
+ *     scheduled for reconfiguration.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureSlave(interp, slavePtr, argc, argv)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    Slave *slavePtr;           /* Pointer to current information
+                                * about slave. */
+    int argc;                  /* Number of config arguments. */
+    char **argv;               /* String values for arguments. */
+{
+    register Master *masterPtr;
+    int c, length, result;
+    double d;
+
+    result = TCL_OK;
+    for ( ; argc > 0; argc -= 2, argv += 2) {
+       if (argc < 2) {
+           Tcl_AppendResult(interp, "extra option \"", argv[0],
+                   "\" (option with no value?)", (char *) NULL);
+           result = TCL_ERROR;
+           goto done;
+       }
+       length = strlen(argv[0]);
+       c = argv[0][1];
+       if ((c == 'a') && (strncmp(argv[0], "-anchor", length) == 0)) {
+           if (Tk_GetAnchor(interp, argv[1], &slavePtr->anchor) != TCL_OK) {
+               result = TCL_ERROR;
+               goto done;
+           }
+       } else if ((c == 'b')
+               && (strncmp(argv[0], "-bordermode", length) == 0)) {
+           c = argv[1][0];
+           length = strlen(argv[1]);
+           if ((c == 'i') && (strncmp(argv[1], "ignore", length) == 0)
+                   && (length >= 2)) {
+               slavePtr->borderMode = BM_IGNORE;
+           } else if ((c == 'i') && (strncmp(argv[1], "inside", length) == 0)
+                   && (length >= 2)) {
+               slavePtr->borderMode = BM_INSIDE;
+           } else if ((c == 'o')
+                   && (strncmp(argv[1], "outside", length) == 0)) {
+               slavePtr->borderMode = BM_OUTSIDE;
+           } else {
+               Tcl_AppendResult(interp, "bad border mode \"", argv[1],
+                       "\": must be ignore, inside, or outside",
+                       (char *) NULL);
+               result = TCL_ERROR;
+               goto done;
+           }
+       } else if ((c == 'h') && (strncmp(argv[0], "-height", length) == 0)) {
+           if (argv[1][0] == 0) {
+               slavePtr->flags &= ~(CHILD_REL_HEIGHT|CHILD_HEIGHT);
+           } else {
+               if (Tk_GetPixels(interp, slavePtr->tkwin, argv[1],
+                       &slavePtr->height) != TCL_OK) {
+                   result = TCL_ERROR;
+                   goto done;
+               }
+               slavePtr->flags &= ~CHILD_REL_HEIGHT;
+               slavePtr->flags |= CHILD_HEIGHT;
+           }
+       } else if ((c == 'i') && (strncmp(argv[0], "-in", length) == 0)) {
+           Tk_Window tkwin;
+           Tk_Window ancestor;
+
+           tkwin = Tk_NameToWindow(interp, argv[1], slavePtr->tkwin);
+           if (tkwin == NULL) {
+               result = TCL_ERROR;
+               goto done;
+           }
+
+           /*
+            * Make sure that the new master is either the logical parent
+            * of the slave or a descendant of that window.
+            */
+
+           for (ancestor = tkwin; ; ancestor = Tk_Parent(ancestor)) {
+               if (ancestor == Tk_Parent(slavePtr->tkwin)) {
+                   break;
+               }
+               if (((Tk_FakeWin *) (ancestor))->flags & TK_TOP_LEVEL) {
+                   Tcl_AppendResult(interp, "can't place ",
+                           Tk_PathName(slavePtr->tkwin), " relative to ",
+                           Tk_PathName(tkwin), (char *) NULL);
+                   result = TCL_ERROR;
+                   goto done;
+               }
+           }
+           UnlinkSlave(slavePtr);
+           slavePtr->masterPtr = FindMaster(tkwin);
+           slavePtr->nextPtr = slavePtr->masterPtr->slavePtr;
+           slavePtr->masterPtr->slavePtr = slavePtr;
+       } else if ((c == 'r') && (strncmp(argv[0], "-relheight", length) == 0)
+               && (length >= 5)) {
+           if (Tcl_GetDouble(interp, argv[1], &d) != TCL_OK) {
+               result = TCL_ERROR;
+               goto done;
+           }
+           slavePtr->relHeight = d;
+           slavePtr->flags |= CHILD_REL_HEIGHT;
+           slavePtr->flags &= ~CHILD_HEIGHT;
+       } else if ((c == 'r') && (strncmp(argv[0], "-relwidth", length) == 0)
+               && (length >= 5)) {
+           if (Tcl_GetDouble(interp, argv[1], &d) != TCL_OK) {
+               result = TCL_ERROR;
+               goto done;
+           }
+           slavePtr->relWidth = d;
+           slavePtr->flags |= CHILD_REL_WIDTH;
+           slavePtr->flags &= ~CHILD_WIDTH;
+       } else if ((c == 'r') && (strncmp(argv[0], "-relx", length) == 0)
+               && (length >= 5)) {
+           if (Tcl_GetDouble(interp, argv[1], &d) != TCL_OK) {
+               result = TCL_ERROR;
+               goto done;
+           }
+           slavePtr->relX = d;
+           slavePtr->flags |= CHILD_REL_X;
+       } else if ((c == 'r') && (strncmp(argv[0], "-rely", length) == 0)
+               && (length >= 5)) {
+           if (Tcl_GetDouble(interp, argv[1], &d) != TCL_OK) {
+               result = TCL_ERROR;
+               goto done;
+           }
+           slavePtr->relY = d;
+           slavePtr->flags |= CHILD_REL_Y;
+       } else if ((c == 'w') && (strncmp(argv[0], "-width", length) == 0)) {
+           if (argv[1][0] == 0) {
+               slavePtr->flags &= ~(CHILD_REL_WIDTH|CHILD_WIDTH);
+           } else {
+               if (Tk_GetPixels(interp, slavePtr->tkwin, argv[1],
+                       &slavePtr->width) != TCL_OK) {
+                   result = TCL_ERROR;
+                   goto done;
+               }
+               slavePtr->flags &= ~CHILD_REL_WIDTH;
+               slavePtr->flags |= CHILD_WIDTH;
+           }
+       } else if ((c == 'x') && (strncmp(argv[0], "-x", length) == 0)) {
+           if (Tk_GetPixels(interp, slavePtr->tkwin, argv[1],
+                   &slavePtr->x) != TCL_OK) {
+               result = TCL_ERROR;
+               goto done;
+           }
+           slavePtr->flags &= ~CHILD_REL_X;
+       } else if ((c == 'y') && (strncmp(argv[0], "-y", length) == 0)) {
+           if (Tk_GetPixels(interp, slavePtr->tkwin, argv[1],
+                   &slavePtr->y) != TCL_OK) {
+               result = TCL_ERROR;
+               goto done;
+           }
+           slavePtr->flags &= ~CHILD_REL_Y;
+       } else {
+           Tcl_AppendResult(interp, "unknown or ambiguous option \"",
+                   argv[0], "\": must be -anchor, -bordermode, -height, ",
+                   "-in, -relheight, -relwidth, -relx, -rely, -width, ",
+                   "-x, or -y", (char *) NULL);
+           result = TCL_ERROR;
+           goto done;
+       }
+    }
+
+    /*
+     * If there's no master specified for this slave, use its Tk_Parent.
+     * Then arrange for a placement recalculation in the master.
+     */
+
+    done:
+    masterPtr = slavePtr->masterPtr;
+    if (masterPtr == NULL) {
+       masterPtr = FindMaster(Tk_Parent(slavePtr->tkwin));
+       slavePtr->masterPtr = masterPtr;
+       slavePtr->nextPtr = masterPtr->slavePtr;
+       masterPtr->slavePtr = slavePtr;
+    }
+    if (!(masterPtr->flags & PARENT_RECONFIG_PENDING)) {
+       masterPtr->flags |= PARENT_RECONFIG_PENDING;
+       Tk_DoWhenIdle(RecomputePlacement, (ClientData) masterPtr);
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * RecomputePlacement --
+ *
+ *     This procedure is called as a when-idle handler.  It recomputes
+ *     the geometries of all the slaves of a given master.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Windows may change size or shape.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+RecomputePlacement(clientData)
+    ClientData clientData;     /* Pointer to Master record. */
+{
+    register Master *masterPtr = (Master *) clientData;
+    register Slave *slavePtr;
+    Tk_Window ancestor, realMaster;
+    int x, y, width, height;
+    int masterWidth, masterHeight, masterBW;
+
+    masterPtr->flags &= ~PARENT_RECONFIG_PENDING;
+
+    /*
+     * Iterate over all the slaves for the master.  Each slave's
+     * geometry can be computed independently of the other slaves.
+     */
+
+    for (slavePtr = masterPtr->slavePtr; slavePtr != NULL;
+           slavePtr = slavePtr->nextPtr) {
+       /*
+        * Step 1: compute size and borderwidth of master, taking into
+        * account desired border mode.
+        */
+
+       masterBW = 0;
+       masterWidth = Tk_Width(masterPtr->tkwin);
+       masterHeight = Tk_Height(masterPtr->tkwin);
+       if (slavePtr->borderMode == BM_INSIDE) {
+           masterBW = Tk_InternalBorderWidth(masterPtr->tkwin);
+       } else if (slavePtr->borderMode == BM_OUTSIDE) {
+           masterBW = -Tk_Changes(masterPtr->tkwin)->border_width;
+       }
+       masterWidth -= 2*masterBW;
+       masterHeight -= 2*masterBW;
+
+       /*
+        * Step 2:  compute size of slave (outside dimensions including
+        * border) and location of anchor point within master.
+        */
+
+       x = slavePtr->x;
+       if (slavePtr->flags & CHILD_REL_X) {
+           x = (slavePtr->relX*masterWidth) +
+               ((slavePtr->relX > 0) ? 0.5 : -0.5);
+       }
+       x += masterBW;
+       y = slavePtr->y;
+       if (slavePtr->flags & CHILD_REL_Y) {
+           y = (slavePtr->relY*masterHeight) +
+               ((slavePtr->relY > 0) ? 0.5 : -0.5);
+       }
+       y += masterBW;
+       if (slavePtr->flags & CHILD_REL_WIDTH) {
+           width = (slavePtr->relWidth*masterWidth) + 0.5;
+       } else if (slavePtr->flags & CHILD_WIDTH) {
+           width = slavePtr->width;
+       } else {
+           width = Tk_ReqWidth(slavePtr->tkwin)
+                   + 2*Tk_Changes(slavePtr->tkwin)->border_width;
+       }
+       if (slavePtr->flags & CHILD_REL_HEIGHT) {
+           height = (slavePtr->relHeight*masterHeight) + 0.5;
+       } else if (slavePtr->flags & CHILD_HEIGHT) {
+           height = slavePtr->height;
+       } else {
+           height = Tk_ReqHeight(slavePtr->tkwin)
+                   + 2*Tk_Changes(slavePtr->tkwin)->border_width;
+       }
+
+       /*
+        * Step 3: adjust the x and y positions so that the desired
+        * anchor point on the slave appears at that position.  Also
+        * adjust for the border mode and master's border.
+        */
+
+       switch (slavePtr->anchor) {
+           case TK_ANCHOR_N:
+               x -= width/2;
+               break;
+           case TK_ANCHOR_NE:
+               x -= width;
+               break;
+           case TK_ANCHOR_E:
+               x -= width;
+               y -= height/2;
+               break;
+           case TK_ANCHOR_SE:
+               x -= width;
+               y -= height;
+               break;
+           case TK_ANCHOR_S:
+               x -= width/2;
+               y -= height;
+               break;
+           case TK_ANCHOR_SW:
+               y -= height;
+               break;
+           case TK_ANCHOR_W:
+               y -= height/2;
+               break;
+           case TK_ANCHOR_NW:
+               break;
+           case TK_ANCHOR_CENTER:
+               x -= width/2;
+               y -= height/2;
+               break;
+       }
+
+       /*
+        * Step 4: if masterPtr isn't actually the X master of slavePtr,
+        * then translate the x and y coordinates back into the coordinate
+        * system of masterPtr.
+        */
+
+       for (ancestor = masterPtr->tkwin,
+               realMaster = Tk_Parent(slavePtr->tkwin);
+               ancestor != realMaster; ancestor = Tk_Parent(ancestor)) {
+           x += Tk_X(ancestor) + Tk_Changes(ancestor)->border_width;
+           y += Tk_Y(ancestor) + Tk_Changes(ancestor)->border_width;
+       }
+
+       /*
+        * Step 5: adjust width and height again to reflect inside dimensions
+        * of window rather than outside.  Also make sure that the width and
+        * height aren't zero.
+        */
+
+       width -= 2*Tk_Changes(slavePtr->tkwin)->border_width;
+       height -= 2*Tk_Changes(slavePtr->tkwin)->border_width;
+       if (width <= 0) {
+           width = 1;
+       }
+       if (height <= 0) {
+           height = 1;
+       }
+
+       /*
+        * Step 6: see if the window's size or location has changed;  if
+        * so then tell X to reconfigure it.
+        */
+
+       if ((x != Tk_X(slavePtr->tkwin))
+               || (y != Tk_Y(slavePtr->tkwin))
+               || (width != Tk_Width(slavePtr->tkwin))
+               || (height != Tk_Height(slavePtr->tkwin))) {
+           Tk_MoveResizeWindow(slavePtr->tkwin, x, y,
+                   (unsigned int) width, (unsigned int) height);
+       }
+       Tk_MapWindow(slavePtr->tkwin);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * MasterStructureProc --
+ *
+ *     This procedure is invoked by the Tk event handler when
+ *     StructureNotify events occur for a master window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Structures get cleaned up if the window was deleted.  If the
+ *     window was resized then slave geometries get recomputed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+MasterStructureProc(clientData, eventPtr)
+    ClientData clientData;     /* Pointer to Master structure for window
+                                * referred to by eventPtr. */
+    XEvent *eventPtr;          /* Describes what just happened. */
+{
+    register Master *masterPtr = (Master *) clientData;
+    register Slave *slavePtr, *nextPtr;
+
+    if (eventPtr->type == ConfigureNotify) {
+       if ((masterPtr->slavePtr != NULL)
+               && !(masterPtr->flags & PARENT_RECONFIG_PENDING)) {
+           masterPtr->flags |= PARENT_RECONFIG_PENDING;
+           Tk_DoWhenIdle(RecomputePlacement, (ClientData) masterPtr);
+       }
+    } else if (eventPtr->type == DestroyNotify) {
+       for (slavePtr = masterPtr->slavePtr; slavePtr != NULL;
+               slavePtr = nextPtr) {
+           slavePtr->masterPtr = NULL;
+           nextPtr = slavePtr->nextPtr;
+           slavePtr->nextPtr = NULL;
+       }
+       Tcl_DeleteHashEntry(Tcl_FindHashEntry(&masterTable,
+               (char *) masterPtr->tkwin));
+       if (masterPtr->flags & PARENT_RECONFIG_PENDING) {
+           Tk_CancelIdleCall(RecomputePlacement, (ClientData) masterPtr);
+       }
+       masterPtr->tkwin = NULL;
+       ckfree((char *) masterPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * SlaveStructureProc --
+ *
+ *     This procedure is invoked by the Tk event handler when
+ *     StructureNotify events occur for a slave window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Structures get cleaned up if the window was deleted.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+SlaveStructureProc(clientData, eventPtr)
+    ClientData clientData;     /* Pointer to Slave structure for window
+                                * referred to by eventPtr. */
+    XEvent *eventPtr;          /* Describes what just happened. */
+{
+    register Slave *slavePtr = (Slave *) clientData;
+
+    if (eventPtr->type == DestroyNotify) {
+       UnlinkSlave(slavePtr);
+       Tcl_DeleteHashEntry(Tcl_FindHashEntry(&slaveTable,
+               (char *) slavePtr->tkwin));
+       ckfree((char *) slavePtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * PlaceRequestProc --
+ *
+ *     This procedure is invoked by Tk whenever a slave managed by us
+ *     changes its requested geometry.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The window will get relayed out, if its requested size has
+ *     anything to do with its actual size.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static void
+PlaceRequestProc(clientData, tkwin)
+    ClientData clientData;             /* Pointer to our record for slave. */
+    Tk_Window tkwin;                   /* Window that changed its desired
+                                        * size. */
+{
+    Slave *slavePtr = (Slave *) clientData;
+    Master *masterPtr;
+
+    if (((slavePtr->flags & (CHILD_WIDTH|CHILD_REL_WIDTH)) != 0)
+           && ((slavePtr->flags & (CHILD_HEIGHT|CHILD_REL_HEIGHT)) != 0)) {
+       return;
+    }
+    masterPtr = slavePtr->masterPtr;
+    if (masterPtr == NULL) {
+       return;
+    }
+    if (!(masterPtr->flags & PARENT_RECONFIG_PENDING)) {
+       masterPtr->flags |= PARENT_RECONFIG_PENDING;
+       Tk_DoWhenIdle(RecomputePlacement, (ClientData) masterPtr);
+    }
+}
diff --git a/src/tk/tkpresrv.c b/src/tk/tkpresrv.c
new file mode 100644 (file)
index 0000000..a7e0c05
--- /dev/null
@@ -0,0 +1,236 @@
+/* 
+ * tkPreserve.c --
+ *
+ *     This file contains a collection of procedures that are used
+ *     to make sure that widget records and other data structures
+ *     aren't reallocated when there are nested procedures that
+ *     depend on their existence.
+ *
+ * Copyright 1991 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkPreserve.c,v 1.6 92/06/15 13:44:51 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tkconfig.h"
+#include "tk.h"
+
+/*
+ * The following data structure is used to keep track of all the
+ * Tk_Preserve calls that are still in effect.  It grows as needed
+ * to accommodate any number of calls in effect.
+ */
+
+typedef struct {
+    ClientData clientData;     /* Address of preserved block. */
+    int refCount;              /* Number of Tk_Preserve calls in effect
+                                * for block. */
+    int mustFree;              /* Non-zero means Tk_EventuallyFree was
+                                * called while a Tk_Preserve call was in
+                                * effect, so the structure must be freed
+                                * when refCount becomes zero. */
+    Tk_FreeProc *freeProc;     /* Procedure to call to free. */
+} Reference;
+
+static Reference *refArray;    /* First in array of references. */
+static int spaceAvl = 0;       /* Total number of structures available
+                                * at *firstRefPtr. */
+static int inUse = 0;          /* Count of structures currently in use
+                                * in refArray. */
+#define INITIAL_SIZE 2
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_Preserve --
+ *
+ *     This procedure is used by a procedure to declare its interest
+ *     in a particular block of memory, so that the block will not be
+ *     reallocated until a matching call to Tk_Release has been made.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information is retained so that the block of memory will
+ *     not be freed until at least the matching call to Tk_Release.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_Preserve(clientData)
+    ClientData clientData;     /* Pointer to malloc'ed block of memory. */
+{
+    register Reference *refPtr;
+    int i;
+
+    /*
+     * See if there is already a reference for this pointer.  If so,
+     * just increment its reference count.
+     */
+
+    for (i = 0, refPtr = refArray; i < inUse; i++, refPtr++) {
+       if (refPtr->clientData == clientData) {
+           refPtr->refCount++;
+           return;
+       }
+    }
+
+    /*
+     * Make a reference array if it doesn't already exist, or make it
+     * bigger if it is full.
+     */
+
+    if (inUse == spaceAvl) {
+       if (spaceAvl == 0) {
+           refArray = (Reference *) ckalloc((unsigned)
+                   (INITIAL_SIZE*sizeof(Reference)));
+           spaceAvl = INITIAL_SIZE;
+       } else {
+           Reference *new;
+
+           new = (Reference *) ckalloc((unsigned)
+                   (2*spaceAvl*sizeof(Reference)));
+           memcpy((VOID *) new, (VOID *) refArray, spaceAvl*sizeof(Reference));
+           ckfree((char *) refArray);
+           refArray = new;
+           spaceAvl *= 2;
+       }
+    }
+
+    /*
+     * Make a new entry for the new reference.
+     */
+
+    refPtr = &refArray[inUse];
+    refPtr->clientData = clientData;
+    refPtr->refCount = 1;
+    refPtr->mustFree = 0;
+    inUse += 1;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_Release --
+ *
+ *     This procedure is called to cancel a previous call to
+ *     Tk_Preserve, thereby allowing a block of memory to be
+ *     freed (if no one else cares about it).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If Tk_EventuallyFree has been called for clientData, and if
+ *     no other call to Tk_Preserve is still in effect, the block of
+ *     memory is freed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_Release(clientData)
+    ClientData clientData;     /* Pointer to malloc'ed block of memory. */
+{
+    register Reference *refPtr;
+    int i;
+
+    for (i = 0, refPtr = refArray; i < inUse; i++, refPtr++) {
+       if (refPtr->clientData != clientData) {
+           continue;
+       }
+       refPtr->refCount--;
+       if (refPtr->refCount == 0) {
+           if (refPtr->mustFree) {
+               if (refPtr->freeProc == (Tk_FreeProc *) free) {
+                   ckfree((char *) refPtr->clientData);
+               } else {
+                   (*refPtr->freeProc)(refPtr->clientData);
+               }
+           }
+
+           /*
+            * Copy down all of the trailing reference in the array
+            * to cover up the hole left by the unused reference.
+            */
+
+           inUse--;
+           if (i != inUse) {
+               memcpy((VOID *) &refArray[i], (VOID *) &refArray[i+1],
+                       (inUse-i)*sizeof(Reference));
+           }
+       }
+       return;
+    }
+
+    /*
+     * Reference not found.  This is a bug in the caller.
+     */
+
+    panic("Tk_Release couldn't find reference for 0x%x", clientData);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_EventuallyFree --
+ *
+ *     Free up a block of memory, unless a call to Tk_Preserve is in
+ *     effect for that block.  In this case, defer the free until all
+ *     calls to Tk_Preserve have been undone by matching calls to
+ *     Tk_Release.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Ptr may be released by calling free().
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_EventuallyFree(clientData, freeProc)
+    ClientData clientData;     /* Pointer to malloc'ed block of memory. */
+    Tk_FreeProc *freeProc;     /* Procedure to actually do free. */
+{
+    register Reference *refPtr;
+    int i;
+
+    /*
+     * See if there is a reference for this pointer.  If so, set its
+     * "mustFree" flag (the flag had better not be set already!).
+     */
+
+    for (i = 0, refPtr = refArray; i < inUse; i++, refPtr++) {
+       if (refPtr->clientData != clientData) {
+           continue;
+       }
+       if (refPtr->mustFree) {
+           panic("Tk_EventuallyFree called twice for 0x%x\n", clientData);
+        }
+        refPtr->mustFree = 1;
+       refPtr->freeProc = freeProc;
+        return;
+    }
+
+    /*
+     * No reference for this block.  Free it now.
+     */
+
+    if (freeProc == (Tk_FreeProc *) free) {
+       ckfree((char *) clientData);
+    } else {
+       (*freeProc)(clientData);
+    }
+}
diff --git a/src/tk/tkrawtcp.c b/src/tk/tkrawtcp.c
new file mode 100644 (file)
index 0000000..f556e5f
--- /dev/null
@@ -0,0 +1,692 @@
+/*
+ * tkRawTCP.c --
+ *
+ *     This file contains a simple Tcl "connect" command
+ *     that returns an standard Tcl File descriptor (as would
+ *     be returned by Tcl_OpenCmd).
+ * Extended to create servers, accept connections, shutdown parts of full
+ *   duplex connections and handle UNIX domain sockets.
+ *
+ * Author: Pekka Nikander <pnr@innopoli.ajk.tele.fi>
+ * Modified: Tim MacKenzie <tym@dibbler.cs.monash.edu.au) 
+ *
+ * Copyright 1992 Telecom Finland
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  Telecom Finland
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * Created: Sun Mar 22 18:20:29 1992
+ * based on: Last modified: Sun Mar 22 21:34:31 1992 pnr
+ * Last modified: Mon Jun 29 15:25:14 EST 1992 tym
+ * 
+ */
+
+#ifndef lint
+static char rcsid[] = "...";
+#endif /* not lint */
+
+#include "tclint.h"
+#include "tclunix.h"
+
+#include <assert.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+#include <sys/un.h>
+
+#include <tk.h>
+
+static int inet_connect _ANSI_ARGS_((char *host, char *port,int server));
+static int unix_connect _ANSI_ARGS_((char *path, int server));
+static void HandleSocket _ANSI_ARGS_ ((ClientData clientData, int mask));
+
+typedef struct {
+    Tcl_Interp *interp;
+    OpenFile *filePtr;
+    char *tclCmd;
+    char *fileId;
+} FileCmd;
+
+/*
+ *------------------------------------------------------------------
+ *
+ * Tcp_MakeOpenFile --
+ *
+ *    Set up on OpenFile structure in the interpreter for a newly 
+ *      opened file
+ *     
+ * Results:
+ *     none
+ *
+ * Side effects:
+ *     Adds an OpenFile to the list.
+ *------------------------------------------------------------------
+ */
+
+/* ARGSUSED */
+void
+Tcp_MakeOpenFile(interp,fd,r,w)
+    Tcl_Interp *interp;
+    int fd;
+    int r,w;
+{/* Create an OpenFile structure using f and install it in the interpreter with
+  * Readable and Writable set to r and w
+  */
+    Interp *iPtr = (Interp *) interp;
+    register OpenFile *filePtr;
+
+    filePtr = (OpenFile *) ckalloc(sizeof(OpenFile));
+
+    filePtr->f = NULL;
+    filePtr->f2 = NULL;
+
+        /* Open the file with the correct type (doesn't handle !r && !w) */
+#ifdef MSDOS
+    filePtr->f = fdopen(fd,(r&&w)?"rb+":(r?"rb":"wb"));
+#else
+    filePtr->f = fdopen(fd,(r&&w)?"r+":(r?"r":"w"));
+#endif
+        /* Don't do buffered communication if full-duplex... it breaks! */
+        if (r&w) setbuf(filePtr->f,0);
+
+    filePtr->readable = r;
+    filePtr->writable = w;
+    filePtr->numPids = 0;
+    filePtr->pidPtr = NULL;
+    filePtr->errorId = -1;
+
+    /*
+     * Enter this new OpenFile structure in the table for the
+     * interpreter.  May have to expand the table to do this.
+     */
+
+    TclMakeFileTable(iPtr, fd);
+    if (iPtr->filePtrArray[fd] != NULL) {
+       panic("Tcl_OpenCmd found file already open");
+    }
+    iPtr->filePtrArray[fd] = filePtr;
+}
+
+/*
+ *------------------------------------------------------------------
+ *
+ * Tcp_ConnectCmd --
+ *
+ *     Open a socket connection to a given host and service.
+ *     
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     An open socket connection.
+ *      Sets the global variable connect_info(file%d) to the obtained
+ *        port when setting up server.
+ *------------------------------------------------------------------
+ */
+
+/* ARGSUSED */
+int
+Tcp_ConnectCmd(notUsed, interp, argc, argv)
+    ClientData notUsed;
+    Tcl_Interp *interp;
+    int argc;
+    char **argv;
+{
+    Interp *iPtr = (Interp *) interp;
+    char *host,*port;
+    int fd;
+    int server=0;
+    int unicks = 0;
+    
+    if (argc != 2 && argc != 3 &&
+       (argc != 4 || (argc == 4 && strcmp(argv[1],"-server")))) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                    "[{-server}] address_spec\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if (!strcmp(argv[1],"-server"))
+       server = 1;
+
+    /*
+     * Create the connection
+     */
+    if (argc - server == 2) {/* Unix domain socket */
+       unicks = 1;
+       fd = unix_connect(argv[1+server],server);
+    } else
+       fd = inet_connect(argv[1+server], argv[2+server],server);
+
+    if (fd < 0) {
+       /* Tell them why it fell apart */
+       if (unicks)
+           if (server)
+               Tcl_AppendResult(interp,
+                   "Couldn't setup listening socket with path \"",
+                   argv[1+server],"\" : ",Tcl_UnixError(interp),
+                   (char *) NULL);
+           else
+               Tcl_AppendResult(interp,
+                   "Couldn't connect to \"",argv[1],"\" : ",
+                   Tcl_UnixError(interp),(char *) NULL);
+       else
+           if (server)
+               Tcl_AppendResult(interp,
+                   "couldn't setup listening socket on port:",
+                   atoi(argv[3])==0?"any":argv[3]," using address \"",
+                   strlen(argv[2])?argv[2]:"anywhere.","\": ",
+                   Tcl_UnixError(interp), (char *)NULL);
+           else
+               Tcl_AppendResult(interp, "couldn't open connection to \"",
+                                argv[1], "\" port \"", argv[2], "\": ",
+                                Tcl_UnixError(interp), (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    sprintf(interp->result, "file%d", fd);
+    if (server && !unicks) {
+       /* Find out what port we got */
+       char buf[50];
+       struct sockaddr_in sockaddr;
+       int res,len=sizeof(sockaddr);
+       res =getsockname(fd,(struct sockaddr *) &sockaddr, &len);
+       if (res < 0) {
+           sprintf(buf,"%d",errno);
+       } else 
+           sprintf(buf,"%d",(int)ntohs(sockaddr.sin_port));
+       Tcl_SetVar2(interp,"connect_info",interp->result,buf,TCL_GLOBAL_ONLY);
+    }
+
+    Tcp_MakeOpenFile(iPtr,fd,1,1-server);
+
+    return TCL_OK;
+}
+
+/*
+ *------------------------------------------------------------------
+ *
+ * Tcp_ShutdownCmd --
+ *
+ *    Shutdown a socket for reading writing or both using shutdown(2)
+ *     
+ * Results:
+ *     standard tcl result.
+ *
+ * Side effects:
+ *     Modifies the OpenFile structure appropriately
+ *------------------------------------------------------------------
+ */
+
+/* ARGSUSED */
+int
+Tcp_ShutdownCmd(notUsed, interp, argc, argv)
+    ClientData notUsed;
+    Tcl_Interp *interp;
+    int argc;
+    char **argv;
+{
+    Interp *iPtr = (Interp *) interp;
+    OpenFile *filePtr;
+    register FILE *f;
+    int fd;
+
+    if (argc != 3) {
+    wrong_args:
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                    " fileid <option>\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if (TclGetOpenFile(interp, argv[1], &filePtr) != TCL_OK) {
+        return TCL_ERROR;
+    }
+
+    f = filePtr->f;
+    fd = fileno(filePtr->f);
+    if (!strcmp(argv[2],"0") || !strcmp(argv[2],"receives") || 
+           !strcmp(argv[2],"read")) {
+       if (!filePtr->readable) {
+           Tcl_AppendResult(interp, "File is not readable",(char *) NULL);
+           return TCL_ERROR;
+       }
+       if (shutdown(fd,0)) {
+           Tcl_AppendResult(interp, "shutdown: ", Tcl_UnixError(interp),
+               (char *) NULL);
+           return TCL_ERROR;
+       }
+       filePtr->readable=0;
+    } else if (!strcmp(argv[2],"1") || !strcmp(argv[2],"sends") ||
+           !strcmp(argv[2],"write")) {
+       if (!filePtr->writable) {
+           Tcl_AppendResult(interp, "File is not writable",(char *) NULL);
+           return TCL_ERROR;
+       }
+       if (shutdown(fd,1)) {
+           Tcl_AppendResult(interp, "shutdown: ", Tcl_UnixError(interp),
+               (char *) NULL);
+           return TCL_ERROR;
+       }
+       filePtr->writable=0;
+    } else if (!strcmp(argv[2],"2") || !strcmp(argv[2],"all") ||
+           !strcmp(argv[2],"both")) {
+       if (shutdown(fd,2)) {
+           Tcl_AppendResult(interp, "shutdown: ", Tcl_UnixError(interp),
+               (char *) NULL);
+           return TCL_ERROR;
+       }
+       filePtr->writable=0;
+       filePtr->readable=0;
+    } else
+       goto wrong_args;
+    return TCL_OK;
+}
+       
+
+               
+/*
+ *------------------------------------------------------------------
+ *
+ * Tcp_AcceptCmd --
+ *
+ *    Accept a connection on a listening socket
+ *     
+ * Results:
+ *     a standard tcl result
+ *
+ * Side effects:
+ *     Opens a new file.
+ *      Sets the global variable connect_info(file%d) to a list
+ *         containing the remote address (host ip, port) of the
+ *         connector.
+ *------------------------------------------------------------------
+ */
+
+/* ARGSUSED */
+int
+Tcp_AcceptCmd(notUsed, interp, argc, argv)
+    ClientData notUsed;
+    Tcl_Interp *interp;
+    int argc;
+    char **argv;
+{
+    Interp *iPtr = (Interp *) interp;
+    struct sockaddr_in sockaddr;
+    int len = sizeof sockaddr;
+    OpenFile *filePtr;
+    register FILE *f;
+    int fd;
+
+    if (argc != 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                    " listening_socket\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if (TclGetOpenFile(interp, argv[1], &filePtr) != TCL_OK) {
+        return TCL_ERROR;
+    }
+    if (!filePtr->readable) {
+        Tcl_AppendResult(interp, "\"", argv[1],
+                "\" wasn't opened for reading", (char *) NULL);
+        return TCL_ERROR;
+    }
+
+    f = filePtr->f;
+    fd = fileno(filePtr->f);
+
+    fd = accept(fd,(struct sockaddr *)&sockaddr,&len);
+    if (fd < 0) {
+       Tcl_AppendResult(interp, "system error in accept()", (char *)NULL);
+       return TCL_ERROR;
+    }
+
+    {/* Set the global connect_info */
+       char buf[100];
+       char nm[10];
+       if (sockaddr.sin_family == AF_INET)
+           sprintf(buf,"%s %d",inet_ntoa(sockaddr.sin_addr),
+                  ntohs(sockaddr.sin_port));
+       else
+           buf[0]=0;  /* Empty string for UNIX domain sockets */
+       sprintf(nm,"file%d",fd);
+       Tcl_SetVar2(interp,"connect_info",nm,buf,TCL_GLOBAL_ONLY);
+    }
+
+    /*
+     * Create the FILE*
+     */
+    Tcp_MakeOpenFile(iPtr,fd,1,1);
+
+    sprintf(interp->result, "file%d", fd);
+    return TCL_OK;
+}
+
+/*
+ *----------------------------------------------------------------
+ *
+ * unix_connect --
+ *
+ *     Create a (unix_domain) fd connection using given rendeavous
+ *
+ * Results:
+ *     An open fd or -1.
+ *
+ * Side effects:
+ *     None.
+ *----------------------------------------------------------------
+ */
+
+static int
+unix_connect(path,server)
+    char *path;                /* Path name to create or use */
+    int  server;        /* 1->make server, 0->connect to server */
+{
+    struct sockaddr_un sockaddr;
+    int sock, status;
+    extern int errno;
+    
+    sock = socket(PF_UNIX, SOCK_STREAM, 0);
+    if (sock < 0) {
+       return -1;
+    }
+    
+    sockaddr.sun_family = AF_UNIX;
+    strncpy(sockaddr.sun_path,path,sizeof(sockaddr.sun_path)-1);
+    sockaddr.sun_path[sizeof(sockaddr.sun_path)-1] = 0; /* Just in case */
+    
+    if (server)
+       status = bind(sock,(struct sockaddr *) &sockaddr, sizeof(sockaddr));
+    else
+       status = connect(sock, (struct sockaddr *) &sockaddr, sizeof(sockaddr));
+    
+    if (status < 0) {
+       close (sock);
+       return -1;
+    }
+
+    if (server) {
+       listen(sock,5);
+       return sock;
+    }
+    
+    return sock;
+}
+
+/*
+ *----------------------------------------------------------------
+ *
+ * inet_connect --
+ *
+ *     Create a (inet domain) fd connection to given host and port.
+ *
+ * Results:
+ *     An open fd or -1.
+ *
+ * Side effects:
+ *     None.
+ *----------------------------------------------------------------
+ */
+
+static int
+inet_connect(host, service,server)
+    char *host;                        /* Host to connect, name or IP address */
+    char *service;             /* Port to use, service name or port number */
+    int  server;
+{
+    struct hostent *hostent, _hostent;
+    struct servent *servent, _servent;
+    struct protoent *protoent;
+    struct sockaddr_in sockaddr;
+    int sock, status;
+    int hostaddr, hostaddrPtr[2];
+    int servport;
+    extern int errno;
+    
+    hostent = gethostbyname(host);
+    if (hostent == NULL) {
+       hostaddr = inet_addr(host);
+       if (hostaddr == -1) {
+           if (server && !strlen(host)) 
+               hostaddr = INADDR_ANY;
+           else {
+               errno = EINVAL;
+               return -1;
+           }
+       }       
+       _hostent.h_addr_list = (char **)hostaddrPtr;
+       _hostent.h_addr_list[0] = (char *)&hostaddr;
+       _hostent.h_addr_list[1] = NULL;
+       _hostent.h_length = sizeof(hostaddr);
+       _hostent.h_addrtype = AF_INET;
+       hostent = &_hostent;
+    }
+    servent = getservbyname(service, "tcp");
+    if (servent == NULL) {
+       servport = htons(atoi(service));
+       if (servport == -1) { 
+           errno = EINVAL;
+           return -1;
+       }
+       _servent.s_port = servport;
+       _servent.s_proto = "tcp";
+       servent = &_servent;
+    }
+    protoent = getprotobyname(servent->s_proto);
+    if (protoent == NULL) {
+       errno = EINVAL;
+       return -1;
+    }
+    
+    sock = socket(PF_INET, SOCK_STREAM, protoent->p_proto);
+    if (sock < 0) {
+       return -1;
+    }
+    
+    sockaddr.sin_family = AF_INET;
+    memcpy((char *)&(sockaddr.sin_addr.s_addr),
+          (char *) hostent->h_addr_list[0],
+          (size_t) hostent->h_length);
+    sockaddr.sin_port = servent->s_port;
+    
+    if (server)
+       status = bind(sock,(struct sockaddr *) &sockaddr, sizeof(sockaddr));
+    else
+       status = connect(sock, (struct sockaddr *) &sockaddr, sizeof(sockaddr));
+    
+    if (status < 0) {
+       close (sock);
+       return -1;
+    }
+
+    if (server) {
+       listen(sock,5);
+       return sock;
+    }
+    
+    return sock;
+}
+
+/*
+ *----------------------------------------------------------------
+ *
+ * Tcp_FileHandlerCmd --
+ *
+ *     Register a file handler with an open file.  If there is
+ *     already and existing handler, it will be no longer called.
+ *     If no mask and command are given, any existing handler
+ *     will be deleted.
+ *
+ * Results:
+ *     A standard Tcl result. (Always OK).
+ *
+ * Side effects:
+ *     A new file handler is associated with a give TCL open file.
+ *     Whenever the file is readable, writeable and/or there is
+ *     an expection condition on the file, a user supplied TCL
+ *     command is called.
+ *
+ *----------------------------------------------------------------
+ */
+
+/* ARGSUSED */
+int
+Tcp_FileHandlerCmd(notUsed, interp, argc, argv)
+    ClientData notUsed;
+    Tcl_Interp *interp;
+    int argc;
+    char **argv;
+{
+    FileCmd *cmdPtr;
+    OpenFile *filePtr;
+    int mask;
+
+    if (argc != 2 && argc != 4) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+                 " fileId ?mode command?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if (TclGetOpenFile(interp, argv[1], &filePtr) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    if (argc == 2) {
+       /*
+        * NOTE!  Currently the cmdPtr structure will be left
+        *        *unfreed* if the file handler is deleted
+        *        via this code.  Tough.  Would need a hash table
+        *        or something...
+        */
+       Tk_DeleteFileHandler(fileno(filePtr->f));
+       return TCL_OK;
+    }
+    
+    /*
+     * Find out on what situations the user is interested in.
+     * This is not the most elegant or efficient way to do this,
+     * but who cares?  (I do, but not much enough :-)
+     */
+    mask = 0;
+    if (strchr(argv[2], 'r')) {
+       mask |= TK_READABLE;
+    }
+    if (strchr(argv[2], 'w')) {
+       mask |= TK_WRITABLE;
+    }
+    if (strchr(argv[2], 'e')) {
+       mask |= TK_EXCEPTION;
+    }
+    if (mask == 0 || (strlen(argv[2]) != strspn(argv[2], "rwe"))) {
+       Tcl_AppendResult(interp, "bad mask argument \"", argv[2],
+                "\": should be any combination of \"r\", \"w\" and \"e\"",
+                        (char *) NULL);
+       fclose(filePtr->f);
+       return TCL_ERROR;
+    }
+
+    cmdPtr = (FileCmd *)ckalloc(sizeof(FileCmd));
+    cmdPtr->interp = interp;
+    cmdPtr->filePtr = filePtr;
+    cmdPtr->tclCmd = ckalloc(strlen(argv[3]) + 1);
+    strcpy(cmdPtr->tclCmd, argv[3]);
+    cmdPtr->fileId = ckalloc(strlen(argv[1]) + 1);
+    strcpy(cmdPtr->fileId, argv[1]);
+    
+    /*
+     * NOTE! There may be an earlier file handler.   Should do something.
+     */
+    Tk_CreateFileHandler(fileno(filePtr->f), mask, HandleSocket,
+                        (ClientData) cmdPtr);
+
+    return TCL_OK;
+}
+/*
+ *----------------------------------------------------------------
+ *
+ * HandleSocket --
+ *
+ *     This procedure is called from Tk_DoOneEvent whenever there is
+ *     a desired condition on a given open socket.  An Tcl command
+ *     given by the user is executed to handle the connection.  If
+ *     and EOF or ERROR condition is noticed, all memory resources
+ *     associated with the socket are released and the socket is closed.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The user supplied command can do anything.
+ *
+ *----------------------------------------------------------------
+ */
+
+static void
+HandleSocket(clientData, mask)
+    ClientData clientData;
+    int mask;
+{
+    int result;
+    FileCmd *cmdPtr = (FileCmd *) clientData;
+    OpenFile *filePtr = cmdPtr->filePtr;
+    Tcl_Interp *interp = cmdPtr->interp;
+    OpenFile *dummy;
+    int delete;
+    int fd = fileno(filePtr->f);
+
+    Tk_Preserve((ClientData)cmdPtr);
+
+    delete = 0;
+    if (TclGetOpenFile(interp, cmdPtr->fileId, &dummy) != TCL_OK) {
+       /* File is closed! */
+       Tcl_ResetResult(interp);
+       delete = 1;
+    } else {
+       assert(dummy == cmdPtr->filePtr);
+
+       if (mask & TK_READABLE) {
+           result = Tcl_VarEval(interp, cmdPtr->tclCmd, " r ", cmdPtr->fileId,
+                                (char *) NULL);
+           if (result != TCL_OK) {
+               TkBindError(interp);
+           }
+       }
+       if (mask & TK_WRITABLE) {
+           result = Tcl_VarEval(interp, cmdPtr->tclCmd, " w ", cmdPtr->fileId,
+                                (char *) NULL);
+           if (result != TCL_OK) {
+               TkBindError(interp);
+           }
+       }
+       if (mask & TK_EXCEPTION) {
+           result = Tcl_VarEval(interp, cmdPtr->tclCmd, " e ", cmdPtr->fileId,
+                                (char *) NULL);
+           if (result != TCL_OK) {
+               TkBindError(interp);
+           }
+       }
+
+       if (feof(filePtr->f) || ferror(filePtr->f)) {
+           result = Tcl_VarEval(interp, "close ", cmdPtr->fileId,
+                                (char *) NULL);
+           if (result != TCL_OK) {
+               TkBindError(interp);
+           }
+           delete = 1;
+       }
+    }
+
+    Tk_Release((ClientData)cmdPtr);
+
+    if (delete) {
+       Tk_DeleteFileHandler(fd);
+       Tk_EventuallyFree((ClientData)cmdPtr, (Tk_FreeProc *)free);
+    }
+}
diff --git a/src/tk/tkrectov.c b/src/tk/tkrectov.c
new file mode 100644 (file)
index 0000000..2e0c738
--- /dev/null
@@ -0,0 +1,878 @@
+/* 
+ * tkRectOval.c --
+ *
+ *     This file implements rectangle and oval items for canvas
+ *     widgets.
+ *
+ * Copyright 1991-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkRectOval.c,v 1.15 92/08/24 09:23:58 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include <stdio.h>
+#include <math.h>
+#include "tkconfig.h"
+#include "tkint.h"
+#include "tkcanvas.h"
+
+/*
+ * The structure below defines the record for each rectangle/oval item.
+ */
+
+typedef struct RectOvalItem  {
+    Tk_Item header;            /* Generic stuff that's the same for all
+                                * types.  MUST BE FIRST IN STRUCTURE. */
+    double bbox[4];            /* Coordinates of bounding box for rectangle
+                                * or oval (x1, y1, x2, y2).  Item includes
+                                * x1 and x2 but not y1 and y2. */
+    int width;                 /* Width of outline. */
+    XColor *outlineColor;      /* Color for outline. */
+    XColor *fillColor;         /* Color for filling rectangle/oval. */
+    Pixmap fillStipple;                /* Stipple bitmap for filling item. */
+    GC outlineGC;              /* Graphics context for outline. */
+    GC fillGC;                 /* Graphics context for filling item. */
+} RectOvalItem;
+
+/*
+ * Information used for parsing configuration specs:
+ */
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_COLOR, "-fill", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(RectOvalItem, fillColor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_COLOR, "-outline", (char *) NULL, (char *) NULL,
+       "black", Tk_Offset(RectOvalItem, outlineColor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_BITMAP, "-stipple", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(RectOvalItem, fillStipple), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_CUSTOM, "-tags", (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, TK_CONFIG_NULL_OK, &tkCanvasTagsOption},
+    {TK_CONFIG_PIXELS, "-width", (char *) NULL, (char *) NULL,
+       "1", Tk_Offset(RectOvalItem, width), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Prototypes for procedures defined in this file:
+ */
+
+static void            ComputeRectOvalBbox _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           RectOvalItem *rectOvalPtr));
+static int             ConfigureRectOval _ANSI_ARGS_((
+                           Tk_Canvas *canvasPtr, Tk_Item *itemPtr, int argc,
+                           char **argv, int flags));
+static int             CreateRectOval _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           struct Tk_Item *itemPtr, int argc, char **argv));
+static void            DeleteRectOval _ANSI_ARGS_((Tk_Item *itemPtr));
+static void            DisplayRectOval _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, Drawable dst));
+static int             OvalToArea _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *areaPtr));
+static double          OvalToPoint _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *pointPtr));
+static int             RectOvalCoords _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, int argc, char **argv));
+static int             RectToArea _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *areaPtr));
+static double          RectToPoint _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double *pointPtr));
+static void            ScaleRectOval _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double originX, double originY,
+                           double scaleX, double scaleY));
+static void            TranslateRectOval _ANSI_ARGS_((Tk_Canvas *canvasPtr,
+                           Tk_Item *itemPtr, double deltaX, double deltaY));
+
+/*
+ * The structures below defines the rectangle and oval item types
+ * by means of procedures that can be invoked by generic item code.
+ */
+
+Tk_ItemType TkRectangleType = {
+    "rectangle",                       /* name */
+    sizeof(RectOvalItem),              /* itemSize */
+    CreateRectOval,                    /* createProc */
+    configSpecs,                       /* configSpecs */
+    ConfigureRectOval,                 /* configureProc */
+    RectOvalCoords,                    /* coordProc */
+    DeleteRectOval,                    /* deleteProc */
+    DisplayRectOval,                   /* displayProc */
+    0,                                 /* alwaysRedraw */
+    RectToPoint,                       /* pointProc */
+    RectToArea,                                /* areaProc */
+    (Tk_ItemPostscriptProc *) NULL,    /* postscriptProc */
+    ScaleRectOval,                     /* scaleProc */
+    TranslateRectOval,                 /* translateProc */
+    (Tk_ItemIndexProc *) NULL,         /* indexProc */
+    (Tk_ItemCursorProc *) NULL,                /* cursorProc */
+    (Tk_ItemSelectionProc *) NULL,     /* selectionProc */
+    (Tk_ItemInsertProc *) NULL,                /* insertProc */
+    (Tk_ItemDCharsProc *) NULL,                /* dTextProc */
+    (Tk_ItemType *) NULL               /* nextPtr */
+};
+
+Tk_ItemType TkOvalType = {
+    "oval",                            /* name */
+    sizeof(RectOvalItem),              /* itemSize */
+    CreateRectOval,                    /* createProc */
+    configSpecs,                       /* configSpecs */
+    ConfigureRectOval,                 /* configureProc */
+    RectOvalCoords,                    /* coordProc */
+    DeleteRectOval,                    /* deleteProc */
+    DisplayRectOval,                   /* displayProc */
+    0,                                 /* alwaysRedraw */
+    OvalToPoint,                       /* pointProc */
+    OvalToArea,                                /* areaProc */
+    (Tk_ItemPostscriptProc *) NULL,    /* postscriptProc */
+    ScaleRectOval,                     /* scaleProc */
+    TranslateRectOval,                 /* translateProc */
+    (Tk_ItemIndexProc *) NULL,         /* indexProc */
+    (Tk_ItemCursorProc *) NULL,                /* cursorProc */
+    (Tk_ItemSelectionProc *) NULL,     /* selectionProc */
+    (Tk_ItemInsertProc *) NULL,                /* insertProc */
+    (Tk_ItemDCharsProc *) NULL,                /* dTextProc */
+    (Tk_ItemType *) NULL               /* nextPtr */
+};
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * CreateRectOval --
+ *
+ *     This procedure is invoked to create a new rectangle
+ *     or oval item in a canvas.
+ *
+ * Results:
+ *     A standard Tcl return value.  If an error occurred in
+ *     creating the item, then an error message is left in
+ *     canvasPtr->interp->result;  in this case itemPtr is
+ *     left uninitialized, so it can be safely freed by the
+ *     caller.
+ *
+ * Side effects:
+ *     A new rectangle or oval item is created.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+CreateRectOval(canvasPtr, itemPtr, argc, argv)
+    register Tk_Canvas *canvasPtr;     /* Canvas to hold new item. */
+    Tk_Item *itemPtr;                  /* Record to hold new item;  header
+                                        * has been initialized by caller. */
+    int argc;                          /* Number of arguments in argv. */
+    char **argv;                       /* Arguments describing rectangle. */
+{
+    register RectOvalItem *rectOvalPtr = (RectOvalItem *) itemPtr;
+
+    if (argc < 4) {
+       Tcl_AppendResult(canvasPtr->interp, "wrong # args:  should be \"",
+               Tk_PathName(canvasPtr->tkwin), "\" create ",
+               itemPtr->typePtr->name, " x1 y1 x2 y2 ?options?",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Carry out initialization that is needed in order to clean
+     * up after errors during the the remainder of this procedure.
+     */
+
+    rectOvalPtr->width = 1;
+    rectOvalPtr->outlineColor = NULL;
+    rectOvalPtr->fillColor = NULL;
+    rectOvalPtr->fillStipple = None;
+    rectOvalPtr->outlineGC = None;
+    rectOvalPtr->fillGC = None;
+
+    /*
+     * Process the arguments to fill in the item record.
+     */
+
+    if ((TkGetCanvasCoord(canvasPtr, argv[0], &rectOvalPtr->bbox[0]) != TCL_OK)
+           || (TkGetCanvasCoord(canvasPtr, argv[1],
+               &rectOvalPtr->bbox[1]) != TCL_OK)
+           || (TkGetCanvasCoord(canvasPtr, argv[2],
+                   &rectOvalPtr->bbox[2]) != TCL_OK)
+           || (TkGetCanvasCoord(canvasPtr, argv[3],
+                   &rectOvalPtr->bbox[3]) != TCL_OK)) {
+       return TCL_ERROR;
+    }
+
+    if (ConfigureRectOval(canvasPtr, itemPtr, argc-4, argv+4, 0) != TCL_OK) {
+       DeleteRectOval(itemPtr);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * RectOvalCoords --
+ *
+ *     This procedure is invoked to process the "coords" widget
+ *     command on rectangles and ovals.  See the user documentation
+ *     for details on what it does.
+ *
+ * Results:
+ *     Returns TCL_OK or TCL_ERROR, and sets canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     The coordinates for the given item may be changed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+RectOvalCoords(canvasPtr, itemPtr, argc, argv)
+    register Tk_Canvas *canvasPtr;     /* Canvas containing item. */
+    Tk_Item *itemPtr;                  /* Item whose coordinates are to be
+                                        * read or modified. */
+    int argc;                          /* Number of coordinates supplied in
+                                        * argv. */
+    char **argv;                       /* Array of coordinates: x1, y1,
+                                        * x2, y2, ... */
+{
+    register RectOvalItem *rectOvalPtr = (RectOvalItem *) itemPtr;
+    char buffer[500];
+
+    if (argc == 0) {
+       sprintf(buffer, "%g %g %g %g", rectOvalPtr->bbox[0],
+               rectOvalPtr->bbox[1], rectOvalPtr->bbox[2],
+               rectOvalPtr->bbox[3]);
+       Tcl_SetResult(canvasPtr->interp, buffer, TCL_VOLATILE);
+    } else if (argc == 4) {
+       if ((TkGetCanvasCoord(canvasPtr, argv[0],
+                   &rectOvalPtr->bbox[0]) != TCL_OK)
+               || (TkGetCanvasCoord(canvasPtr, argv[1],
+                   &rectOvalPtr->bbox[1]) != TCL_OK)
+               || (TkGetCanvasCoord(canvasPtr, argv[2],
+                       &rectOvalPtr->bbox[2]) != TCL_OK)
+               || (TkGetCanvasCoord(canvasPtr, argv[3],
+                       &rectOvalPtr->bbox[3]) != TCL_OK)) {
+           return TCL_ERROR;
+       }
+       ComputeRectOvalBbox(canvasPtr, rectOvalPtr);
+    } else {
+       sprintf(canvasPtr->interp->result,
+               "wrong # coordinates:  expected 0 or 4, got %d",
+               argc);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ConfigureRectOval --
+ *
+ *     This procedure is invoked to configure various aspects
+ *     of a rectangle or oval item, such as its border and
+ *     background colors.
+ *
+ * Results:
+ *     A standard Tcl result code.  If an error occurs, then
+ *     an error message is left in canvasPtr->interp->result.
+ *
+ * Side effects:
+ *     Configuration information, such as colors and stipple
+ *     patterns, may be set for itemPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ConfigureRectOval(canvasPtr, itemPtr, argc, argv, flags)
+    Tk_Canvas *canvasPtr;      /* Canvas containing itemPtr. */
+    Tk_Item *itemPtr;          /* Rectangle item to reconfigure. */
+    int argc;                  /* Number of elements in argv.  */
+    char **argv;               /* Arguments describing things to configure. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    register RectOvalItem *rectOvalPtr = (RectOvalItem *) itemPtr;
+    XGCValues gcValues;
+    GC newGC;
+    unsigned long mask;
+
+    if (Tk_ConfigureWidget(canvasPtr->interp, canvasPtr->tkwin,
+           configSpecs, argc, argv, (char *) rectOvalPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few of the options require additional processing, such as
+     * graphics contexts.
+     */
+
+    if (rectOvalPtr->outlineColor == NULL) {
+       newGC = None;
+    } else {
+       gcValues.foreground = rectOvalPtr->outlineColor->pixel;
+       gcValues.cap_style = CapProjecting;
+       if (rectOvalPtr->width < 0) {
+           rectOvalPtr->width = 1;
+       }
+       gcValues.line_width = rectOvalPtr->width;
+       mask = GCForeground|GCCapStyle|GCLineWidth;
+       newGC = Tk_GetGC(canvasPtr->tkwin, mask, &gcValues);
+    }
+    if (rectOvalPtr->outlineGC != None) {
+       Tk_FreeGC(rectOvalPtr->outlineGC);
+    }
+    rectOvalPtr->outlineGC = newGC;
+
+    if (rectOvalPtr->fillColor == NULL) {
+       newGC = None;
+    } else {
+       gcValues.foreground = rectOvalPtr->fillColor->pixel;
+       if (rectOvalPtr->fillStipple != None) {
+           gcValues.stipple = rectOvalPtr->fillStipple;
+           gcValues.fill_style = FillStippled;
+           mask = GCForeground|GCStipple|GCFillStyle;
+       } else {
+           mask = GCForeground;
+       }
+       newGC = Tk_GetGC(canvasPtr->tkwin, mask, &gcValues);
+    }
+    if (rectOvalPtr->fillGC != None) {
+       Tk_FreeGC(rectOvalPtr->fillGC);
+    }
+    rectOvalPtr->fillGC = newGC;
+    ComputeRectOvalBbox(canvasPtr, rectOvalPtr);
+
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DeleteRectOval --
+ *
+ *     This procedure is called to clean up the data structure
+ *     associated with a rectangle or oval item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Resources associated with itemPtr are released.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DeleteRectOval(itemPtr)
+    Tk_Item *itemPtr;                  /* Item that is being deleted. */
+{
+    register RectOvalItem *rectOvalPtr = (RectOvalItem *) itemPtr;
+
+    if (rectOvalPtr->outlineColor != NULL) {
+       Tk_FreeColor(rectOvalPtr->outlineColor);
+    }
+    if (rectOvalPtr->fillColor != NULL) {
+       Tk_FreeColor(rectOvalPtr->fillColor);
+    }
+    if (rectOvalPtr->fillStipple != None) {
+       Tk_FreeBitmap(rectOvalPtr->fillStipple);
+    }
+    if (rectOvalPtr->outlineGC != None) {
+       Tk_FreeGC(rectOvalPtr->outlineGC);
+    }
+    if (rectOvalPtr->fillGC != None) {
+       Tk_FreeGC(rectOvalPtr->fillGC);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ComputeRectOvalBbox --
+ *
+ *     This procedure is invoked to compute the bounding box of
+ *     all the pixels that may be drawn as part of a rectangle
+ *     or oval.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The fields x1, y1, x2, and y2 are updated in the header
+ *     for itemPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static void
+ComputeRectOvalBbox(canvasPtr, rectOvalPtr)
+    Tk_Canvas *canvasPtr;              /* Canvas that contains item. */
+    register RectOvalItem *rectOvalPtr;        /* Item whose bbox is to be
+                                        * recomputed. */
+{
+    int bloat;
+
+    /*
+     * Make sure that the first coordinates are the lowest ones.
+     */
+
+    if (rectOvalPtr->bbox[1] > rectOvalPtr->bbox[3]) {
+       double tmp;
+       tmp = rectOvalPtr->bbox[3];
+       rectOvalPtr->bbox[3] = rectOvalPtr->bbox[1];
+       rectOvalPtr->bbox[1] = tmp;
+    }
+    if (rectOvalPtr->bbox[0] > rectOvalPtr->bbox[2]) {
+       double tmp;
+       tmp = rectOvalPtr->bbox[2];
+       rectOvalPtr->bbox[2] = rectOvalPtr->bbox[0];
+       rectOvalPtr->bbox[0] = tmp;
+    }
+
+    bloat = (rectOvalPtr->width+1)/2 + 1;
+    rectOvalPtr->header.x1 = rectOvalPtr->bbox[0] - bloat;
+    rectOvalPtr->header.y1 = rectOvalPtr->bbox[1] - bloat;
+    rectOvalPtr->header.x2 = rectOvalPtr->bbox[2] + bloat;
+    rectOvalPtr->header.y2 = rectOvalPtr->bbox[3] + bloat;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayRectOval --
+ *
+ *     This procedure is invoked to draw a rectangle or oval
+ *     item in a given drawable.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     ItemPtr is drawn in drawable using the transformation
+ *     information in canvasPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayRectOval(canvasPtr, itemPtr, drawable)
+    register Tk_Canvas *canvasPtr;     /* Canvas that contains item. */
+    Tk_Item *itemPtr;                  /* Item to be displayed. */
+    Drawable drawable;                 /* Pixmap or window in which to draw
+                                        * item. */
+{
+    register RectOvalItem *rectOvalPtr = (RectOvalItem *) itemPtr;
+    Display *display = Tk_Display(canvasPtr->tkwin);
+    int x1, y1, x2, y2;
+
+    /*
+     * Compute the screen coordinates of the bounding box for the item.
+     * Make sure that the bbox is at least one pixel large, since some
+     * X servers will die if it isn't.
+     */
+
+    x1 = SCREEN_X(canvasPtr, rectOvalPtr->bbox[0]);
+    y1 = SCREEN_Y(canvasPtr, rectOvalPtr->bbox[1]);
+    x2 = SCREEN_X(canvasPtr, rectOvalPtr->bbox[2]);
+    y2 = SCREEN_Y(canvasPtr, rectOvalPtr->bbox[3]);
+    if (x2 <= x1) {
+       x2 = x1+1;
+    }
+    if (y2 <= y1) {
+       y2 = y1+1;
+    }
+
+    /*
+     * Display filled box first (if wanted), then outline.
+     */
+
+    if (rectOvalPtr->fillGC != None) {
+       if (rectOvalPtr->header.typePtr == &TkRectangleType) {
+           XFillRectangle(display, drawable, rectOvalPtr->fillGC,
+                   x1, y1, (unsigned int) (x2-x1), (unsigned int) (y2-y1));
+       } else {
+           XFillArc(display, drawable, rectOvalPtr->fillGC,
+                   x1, y1, (x2-x1), (y2-y1), 0, 360*64);
+       }
+    }
+    if (rectOvalPtr->outlineGC != None) {
+       if (rectOvalPtr->header.typePtr == &TkRectangleType) {
+           XDrawRectangle(display, drawable, rectOvalPtr->outlineGC,
+                   x1, y1, (x2-x1-1), (y2-y1-1));
+       } else {
+           XDrawArc(display, drawable, rectOvalPtr->outlineGC,
+                   x1, y1, (x2-x1-1), (y2-y1-1), 0, 360*64);
+       }
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * RectToPoint --
+ *
+ *     Computes the distance from a given point to a given
+ *     rectangle, in canvas units.
+ *
+ * Results:
+ *     The return value is 0 if the point whose x and y coordinates
+ *     are coordPtr[0] and coordPtr[1] is inside the rectangle.  If the
+ *     point isn't inside the rectangle then the return value is the
+ *     distance from the point to the rectangle.  If itemPtr is filled,
+ *     then anywhere in the interior is considered "inside"; if
+ *     itemPtr isn't filled, then "inside" means only the area
+ *     occupied by the outline.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static double
+RectToPoint(canvasPtr, itemPtr, pointPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item to check against point. */
+    double *pointPtr;          /* Pointer to x and y coordinates. */
+{
+    register RectOvalItem *rectPtr = (RectOvalItem *) itemPtr;
+    double xDiff, yDiff, x1, y1, x2, y2, inc, tmp;
+
+    /*
+     * Generate a new larger rectangle that includes the border
+     * width, if there is one.
+     */
+
+    x1 = rectPtr->bbox[0];
+    y1 = rectPtr->bbox[1];
+    x2 = rectPtr->bbox[2];
+    y2 = rectPtr->bbox[3];
+    if (rectPtr->outlineGC != None) {
+       inc = rectPtr->width/2.0;
+       x1 -= inc;
+       y1 -= inc;
+       x2 += inc;
+       y2 += inc;
+    }
+
+    /*
+     * If the point is inside the rectangle, handle specially:
+     * distance is 0 if rectangle is filled, otherwise compute
+     * distance to nearest edge of rectangle and subtract width
+     * of edge.
+     */
+
+    if ((pointPtr[0] >= x1) && (pointPtr[0] < x2)
+               && (pointPtr[1] >= y1) && (pointPtr[1] < y2)) {
+       if ((rectPtr->fillGC != None) || (rectPtr->outlineGC == None)) {
+           return 0.0;
+       }
+       xDiff = pointPtr[0] - x1;
+       tmp = x2 - pointPtr[0];
+       if (tmp < xDiff) {
+           xDiff = tmp;
+       }
+       yDiff = pointPtr[1] - y1;
+       tmp = y2 - pointPtr[1];
+       if (tmp < yDiff) {
+           yDiff = tmp;
+       }
+       if (yDiff < xDiff) {
+           xDiff = yDiff;
+       }
+       xDiff -= rectPtr->width;
+       if (xDiff < 0.0) {
+           return 0.0;
+       }
+       return xDiff;
+    }
+
+    /*
+     * Point is outside rectangle.
+     */
+
+    if (pointPtr[0] < x1) {
+       xDiff = x1 - pointPtr[0];
+    } else if (pointPtr[0] > x2)  {
+       xDiff = pointPtr[0] - x2;
+    } else {
+       xDiff = 0;
+    }
+
+    if (pointPtr[1] < y1) {
+       yDiff = y1 - pointPtr[1];
+    } else if (pointPtr[1] > y2)  {
+       yDiff = pointPtr[1] - y2;
+    } else {
+       yDiff = 0;
+    }
+
+    return hypot(xDiff, yDiff);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * OvalToPoint --
+ *
+ *     Computes the distance from a given point to a given
+ *     oval, in canvas units.
+ *
+ * Results:
+ *     The return value is 0 if the point whose x and y coordinates
+ *     are coordPtr[0] and coordPtr[1] is inside the oval.  If the
+ *     point isn't inside the oval then the return value is the
+ *     distance from the point to the oval.  If itemPtr is filled,
+ *     then anywhere in the interior is considered "inside"; if
+ *     itemPtr isn't filled, then "inside" means only the area
+ *     occupied by the outline.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static double
+OvalToPoint(canvasPtr, itemPtr, pointPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item to check against point. */
+    double *pointPtr;          /* Pointer to x and y coordinates. */
+{
+    register RectOvalItem *ovalPtr = (RectOvalItem *) itemPtr;
+    double width;
+    int filled;
+
+    width = ovalPtr->width;
+    filled = ovalPtr->fillGC != None;
+    if (ovalPtr->outlineGC == None) {
+       width = 0.0;
+       filled = 1;
+    }
+    return TkOvalToPoint(ovalPtr->bbox, width, filled, pointPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * RectToArea --
+ *
+ *     This procedure is called to determine whether an item
+ *     lies entirely inside, entirely outside, or overlapping
+ *     a given rectangle.
+ *
+ * Results:
+ *     -1 is returned if the item is entirely outside the area
+ *     given by rectPtr, 0 if it overlaps, and 1 if it is entirely
+ *     inside the given area.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static int
+RectToArea(canvasPtr, itemPtr, areaPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item to check against rectangle. */
+    double *areaPtr;           /* Pointer to array of four coordinates
+                                * (x1, y1, x2, y2) describing rectangular
+                                * area.  */
+{
+    register RectOvalItem *rectPtr = (RectOvalItem *) itemPtr;
+    double halfWidth;
+
+    halfWidth = rectPtr->width/2.0;
+    if (rectPtr->outlineGC == None) {
+       halfWidth = 0.0;
+    }
+
+    if ((areaPtr[2] <= (rectPtr->bbox[0] - halfWidth))
+           || (areaPtr[0] >= (rectPtr->bbox[2] + halfWidth))
+           || (areaPtr[3] <= (rectPtr->bbox[1] - halfWidth))
+           || (areaPtr[1] >= (rectPtr->bbox[3] + halfWidth))) {
+       return -1;
+    }
+    if ((rectPtr->fillGC == None) && (rectPtr->outlineGC != None)
+           && (areaPtr[0] >= (rectPtr->bbox[0] + halfWidth))
+           && (areaPtr[1] >= (rectPtr->bbox[1] + halfWidth))
+           && (areaPtr[2] <= (rectPtr->bbox[2] - halfWidth))
+           && (areaPtr[3] <= (rectPtr->bbox[3] - halfWidth))) {
+       return -1;
+    }
+    if ((areaPtr[0] <= (rectPtr->bbox[0] - halfWidth))
+           && (areaPtr[1] <= (rectPtr->bbox[1] - halfWidth))
+           && (areaPtr[2] >= (rectPtr->bbox[2] + halfWidth))
+           && (areaPtr[3] >= (rectPtr->bbox[3] + halfWidth))) {
+       return 1;
+    }
+    return 0;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * OvalToArea --
+ *
+ *     This procedure is called to determine whether an item
+ *     lies entirely inside, entirely outside, or overlapping
+ *     a given rectangular area.
+ *
+ * Results:
+ *     -1 is returned if the item is entirely outside the area
+ *     given by rectPtr, 0 if it overlaps, and 1 if it is entirely
+ *     inside the given area.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static int
+OvalToArea(canvasPtr, itemPtr, areaPtr)
+    Tk_Canvas *canvasPtr;      /* Canvas containing item. */
+    Tk_Item *itemPtr;          /* Item to check against oval. */
+    double *areaPtr;           /* Pointer to array of four coordinates
+                                * (x1, y1, x2, y2) describing rectangular
+                                * area.  */
+{
+    register RectOvalItem *ovalPtr = (RectOvalItem *) itemPtr;
+    double oval[4], halfWidth;
+    int result;
+
+    /*
+     * Expand the oval to include the width of the outline, if any.
+     */
+
+    halfWidth = ovalPtr->width/2.0;
+    if (ovalPtr->outlineGC == None) {
+       halfWidth = 0.0;
+    }
+    oval[0] = ovalPtr->bbox[0] - halfWidth;
+    oval[1] = ovalPtr->bbox[1] - halfWidth;
+    oval[2] = ovalPtr->bbox[2] + halfWidth;
+    oval[3] = ovalPtr->bbox[3] + halfWidth;
+
+    result = TkOvalToArea(oval, areaPtr);
+
+    /*
+     * If the rectangle appears to overlap the oval and the oval
+     * isn't filled, do one more check to see if perhaps all four
+     * of the rectangle's corners are totally inside the oval's
+     * unfilled center, in which case we should return "outside".
+     */
+
+    if ((result == 0) && (ovalPtr->outlineGC != NULL)
+           && (ovalPtr->fillGC == NULL)) {
+       double centerX, centerY, width, height;
+       double xDelta1, yDelta1, xDelta2, yDelta2;
+
+       centerX = (ovalPtr->bbox[0] + ovalPtr->bbox[2])/2.0;
+       centerY = (ovalPtr->bbox[1] + ovalPtr->bbox[3])/2.0;
+       width = (ovalPtr->bbox[2] - ovalPtr->bbox[0])/2.0 - halfWidth;
+       height = (ovalPtr->bbox[3] - ovalPtr->bbox[1])/2.0 - halfWidth;
+       xDelta1 = (areaPtr[0] - centerX)/width;
+       xDelta1 *= xDelta1;
+       yDelta1 = (areaPtr[1] - centerY)/height;
+       yDelta1 *= yDelta1;
+       xDelta2 = (areaPtr[2] - centerX)/width;
+       xDelta2 *= xDelta2;
+       yDelta2 = (areaPtr[3] - centerY)/height;
+       yDelta2 *= yDelta2;
+       if (((xDelta1 + yDelta1) < 1.0)
+               && ((xDelta1 + yDelta2) < 1.0)
+               && ((xDelta2 + yDelta1) < 1.0)
+               && ((xDelta2 + yDelta2) < 1.0)) {
+           return -1;
+       }
+    }
+    return result;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScaleRectOval --
+ *
+ *     This procedure is invoked to rescale a rectangle or oval
+ *     item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The rectangle or oval referred to by itemPtr is rescaled
+ *     so that the following transformation is applied to all
+ *     point coordinates:
+ *             x' = originX + scaleX*(x-originX)
+ *             y' = originY + scaleY*(y-originY)
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ScaleRectOval(canvasPtr, itemPtr, originX, originY, scaleX, scaleY)
+    Tk_Canvas *canvasPtr;              /* Canvas containing rectangle. */
+    Tk_Item *itemPtr;                  /* Rectangle to be scaled. */
+    double originX, originY;           /* Origin about which to scale rect. */
+    double scaleX;                     /* Amount to scale in X direction. */
+    double scaleY;                     /* Amount to scale in Y direction. */
+{
+    register RectOvalItem *rectOvalPtr = (RectOvalItem *) itemPtr;
+
+    rectOvalPtr->bbox[0] = originX + scaleX*(rectOvalPtr->bbox[0] - originX);
+    rectOvalPtr->bbox[1] = originY + scaleY*(rectOvalPtr->bbox[1] - originY);
+    rectOvalPtr->bbox[2] = originX + scaleX*(rectOvalPtr->bbox[2] - originX);
+    rectOvalPtr->bbox[3] = originY + scaleY*(rectOvalPtr->bbox[3] - originY);
+    ComputeRectOvalBbox(canvasPtr, rectOvalPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TranslateRectOval --
+ *
+ *     This procedure is called to move a rectangle or oval by a
+ *     given amount.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The position of the rectangle or oval is offset by
+ *     (xDelta, yDelta), and the bounding box is updated in the
+ *     generic part of the item structure.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+TranslateRectOval(canvasPtr, itemPtr, deltaX, deltaY)
+    Tk_Canvas *canvasPtr;              /* Canvas containing item. */
+    Tk_Item *itemPtr;                  /* Item that is being moved. */
+    double deltaX, deltaY;             /* Amount by which item is to be
+                                        * moved. */
+{
+    register RectOvalItem *rectOvalPtr = (RectOvalItem *) itemPtr;
+
+    rectOvalPtr->bbox[0] += deltaX;
+    rectOvalPtr->bbox[1] += deltaY;
+    rectOvalPtr->bbox[2] += deltaX;
+    rectOvalPtr->bbox[3] += deltaY;
+    ComputeRectOvalBbox(canvasPtr, rectOvalPtr);
+}
diff --git a/src/tk/tkscale.c b/src/tk/tkscale.c
new file mode 100644 (file)
index 0000000..9b6e4b2
--- /dev/null
@@ -0,0 +1,1420 @@
+/* 
+ * tkScale.c --
+ *
+ *     This module implements a scale widgets for the Tk toolkit.
+ *     A scale displays a slider that can be adjusted to change a
+ *     value;  it also displays numeric labels and a textual label,
+ *     if desired.
+ *
+ * Copyright 1990 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkScale.c,v 1.28 92/08/21 11:45:25 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "default.h"
+#include "tkint.h"
+
+/*
+ * A data structure of the following type is kept for each scale
+ * widget managed by this file:
+ */
+
+typedef struct {
+    Tk_Window tkwin;           /* Window that embodies the scale.  NULL
+                                * means that the window has been destroyed
+                                * but the data structures haven't yet been
+                                * cleaned up.*/
+    Tcl_Interp *interp;                /* Interpreter associated with scale. */
+    Tk_Uid orientUid;          /* Orientation for window ("vertical" or
+                                * "horizontal"). */
+    int vertical;              /* Non-zero means vertical orientation,
+                                * zero means horizontal. */
+    int value;                 /* Current value of scale. */
+    int fromValue;             /* Value corresponding to left or top of
+                                * scale. */
+    int toValue;               /* Value corresponding to right or bottom
+                                * of scale. */
+    int tickInterval;          /* Distance between tick marks;  0 means
+                                * don't display any tick marks. */
+    char *command;             /* Command prefix to use when invoking Tcl
+                                * commands because the scale value changed.
+                                * NULL means don't invoke commands.
+                                * Malloc'ed. */
+    int commandLength;         /* Number of non-NULL bytes in command. */
+    char *label;               /* Label to display above or to right of
+                                * scale;  NULL means don't display a
+                                * label.  Malloc'ed. */
+    int labelLength;           /* Number of non-NULL chars. in label. */
+    Tk_Uid state;              /* Normal or disabled.  Value cannot be
+                                * changed when scale is disabled. */
+
+    /*
+     * Information used when displaying widget:
+     */
+
+    int borderWidth;           /* Width of 3-D border around window. */
+    Tk_3DBorder bgBorder;      /* Used for drawing background. */
+    Tk_3DBorder sliderBorder;  /* Used for drawing slider in normal mode. */
+    Tk_3DBorder activeBorder;  /* Used for drawing slider when active (i.e.
+                                * when mouse is in window). */
+    XFontStruct *fontPtr;      /* Information about text font, or NULL. */
+    XColor *textColorPtr;      /* Color for drawing text. */
+    GC textGC;                 /* GC for drawing text in normal mode. */
+    int width;                 /* Desired narrow dimension of scale,
+                                * in pixels. */
+    int length;                        /* Desired long dimension of scale,
+                                * in pixels. */
+    int relief;                        /* Indicates whether window as a whole is
+                                * raised, sunken, or flat. */
+    int offset;                        /* Zero if relief is TK_RELIEF_FLAT,
+                                * borderWidth otherwise.   Indicates how
+                                * much interior stuff must be offset from
+                                * outside edges to leave room for border. */
+    int sliderLength;          /* Length of slider, measured in pixels along
+                                * long dimension of scale. */
+    int showValue;             /* Non-zero means to display the scale value
+                                * below or to the left of the slider;  zero
+                                * means don't display the value. */
+    int tickPixels;            /* Number of pixels required for widest tick
+                                * mark.  0 means don't display ticks.*/
+    int valuePixels;           /* Number of pixels required for value text. */
+    int labelPixels;           /* Number of pixels required for label.   0
+                                * means don't display label. */
+
+    /*
+     * Miscellaneous information:
+     */
+
+    Cursor cursor;             /* Current cursor for window, or None. */
+    int flags;                 /* Various flags;  see below for
+                                * definitions. */
+} Scale;
+
+/*
+ * Flag bits for scales:
+ *
+ * REDRAW_SLIDER -             1 means slider (and numerical readout) need
+ *                             to be redrawn.
+ * REDRAW_OTHER -              1 means other stuff besides slider and value
+ *                             need to be redrawn.
+ * REDRAW_ALL -                        1 means the entire widget needs to be redrawn.
+ * ACTIVE -                    1 means the widget is active (the mouse is
+ *                             in its window).
+ * BUTTON_PRESSED -            1 means a button press is in progress, so
+ *                             slider should appear depressed and should be
+ *                             draggable.
+ */
+
+#define REDRAW_SLIDER          1
+#define REDRAW_OTHER           2
+#define REDRAW_ALL             3
+#define ACTIVE                 4
+#define BUTTON_PRESSED         8
+
+/*
+ * Space to leave between scale area and text.
+ */
+
+#define SPACING 2
+
+/*
+ * Information used for argv parsing.
+ */
+
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_BORDER, "-activeforeground", "activeForeground", "Background",
+       DEF_SCALE_ACTIVE_FG_COLOR, Tk_Offset(Scale, activeBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-activeforeground", "activeForeground", "Background",
+       DEF_SCALE_ACTIVE_FG_MONO, Tk_Offset(Scale, activeBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_SCALE_BG_COLOR, Tk_Offset(Scale, bgBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_SCALE_BG_MONO, Tk_Offset(Scale, bgBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       DEF_SCALE_BORDER_WIDTH, Tk_Offset(Scale, borderWidth), 0},
+    {TK_CONFIG_STRING, "-command", "command", "Command",
+       (char *) NULL, Tk_Offset(Scale, command), 0},
+    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",
+       DEF_SCALE_CURSOR, Tk_Offset(Scale, cursor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_FONT, "-font", "font", "Font",
+       DEF_SCALE_FONT, Tk_Offset(Scale, fontPtr),
+       0},
+    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",
+       DEF_SCALE_FG_COLOR, Tk_Offset(Scale, textColorPtr),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",
+       DEF_SCALE_FG_MONO, Tk_Offset(Scale, textColorPtr),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_INT, "-from", "from", "From",
+       DEF_SCALE_FROM, Tk_Offset(Scale, fromValue), 0},
+    {TK_CONFIG_STRING, "-label", "label", "Label",
+       DEF_SCALE_LABEL, Tk_Offset(Scale, label), 0},
+    {TK_CONFIG_PIXELS, "-length", "length", "Length",
+       DEF_SCALE_LENGTH, Tk_Offset(Scale, length), 0},
+    {TK_CONFIG_UID, "-orient", "orient", "Orient",
+       DEF_SCALE_ORIENT, Tk_Offset(Scale, orientUid), 0},
+    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
+       DEF_SCALE_RELIEF, Tk_Offset(Scale, relief), 0},
+    {TK_CONFIG_BOOLEAN, "-showvalue", "showValue", "ShowValue",
+       DEF_SCALE_SHOW_VALUE, Tk_Offset(Scale, showValue), 0},
+    {TK_CONFIG_BORDER, "-sliderforeground", "sliderForeground", "Background",
+       DEF_SCALE_SLIDER_FG_COLOR, Tk_Offset(Scale, sliderBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-sliderforeground", "sliderForeground", "Background",
+       DEF_SCALE_SLIDER_FG_MONO, Tk_Offset(Scale, sliderBorder), 
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_PIXELS, "-sliderlength", "sliderLength", "SliderLength",
+       DEF_SCALE_SLIDER_LENGTH, Tk_Offset(Scale, sliderLength), 0},
+    {TK_CONFIG_UID, "-state", "state", "State",
+       DEF_SCALE_STATE, Tk_Offset(Scale, state), 0},
+    {TK_CONFIG_INT, "-tickinterval", "tickInterval", "TickInterval",
+       DEF_SCALE_TICK_INTERVAL, Tk_Offset(Scale, tickInterval), 0},
+    {TK_CONFIG_INT, "-to", "to", "To",
+       DEF_SCALE_TO, Tk_Offset(Scale, toValue), 0},
+    {TK_CONFIG_PIXELS, "-width", "width", "Width",
+       DEF_SCALE_WIDTH, Tk_Offset(Scale, width), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            ComputeScaleGeometry _ANSI_ARGS_((Scale *scalePtr));
+static int             ConfigureScale _ANSI_ARGS_((Tcl_Interp *interp,
+                           Scale *scalePtr, int argc, char **argv,
+                           int flags));
+static void            DestroyScale _ANSI_ARGS_((ClientData clientData));
+static void            DisplayHorizontalScale _ANSI_ARGS_((
+                           ClientData clientData));
+static void            DisplayHorizontalValue _ANSI_ARGS_((Scale *scalePtr,
+                           int value, int bottom));
+static void            DisplayVerticalScale _ANSI_ARGS_((
+                           ClientData clientData));
+static void            DisplayVerticalValue _ANSI_ARGS_((Scale *scalePtr,
+                           int value, int rightEdge));
+static void            EventuallyRedrawScale _ANSI_ARGS_((Scale *scalePtr,
+                           int what));
+static int             PixelToValue _ANSI_ARGS_((Scale *scalePtr, int x,
+                           int y));
+static void            ScaleEventProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static void            ScaleMouseProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static int             ScaleWidgetCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+static void            SetScaleValue _ANSI_ARGS_((Scale *scalePtr,
+                           int value));
+static int             ValueToPixel _ANSI_ARGS_((Scale *scalePtr, int value));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_ScaleCmd --
+ *
+ *     This procedure is invoked to process the "scale" Tcl
+ *     command.  See the user documentation for details on what
+ *     it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_ScaleCmd(clientData, interp, argc, argv)
+    ClientData clientData;             /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    register Scale *scalePtr;
+    Tk_Window new;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " pathName ?options?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], (char *) NULL);
+    if (new == NULL) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * Initialize fields that won't be initialized by ConfigureScale,
+     * or which ConfigureScale expects to have reasonable values
+     * (e.g. resource pointers).
+     */
+
+    scalePtr = (Scale *) ckalloc(sizeof(Scale));
+    scalePtr->tkwin = new;
+    scalePtr->interp = interp;
+    scalePtr->value = 0;
+    scalePtr->command = NULL;
+    scalePtr->label = NULL;
+    scalePtr->state = tkNormalUid;
+    scalePtr->bgBorder = NULL;
+    scalePtr->sliderBorder = NULL;
+    scalePtr->activeBorder = NULL;
+    scalePtr->fontPtr = NULL;
+    scalePtr->textColorPtr = NULL;
+    scalePtr->textGC = None;
+    scalePtr->cursor = None;
+    scalePtr->flags = 0;
+
+    Tk_SetClass(scalePtr->tkwin, "Scale");
+    Tk_CreateEventHandler(scalePtr->tkwin, ExposureMask|StructureNotifyMask,
+           ScaleEventProc, (ClientData) scalePtr);
+    Tk_CreateEventHandler(scalePtr->tkwin, EnterWindowMask|LeaveWindowMask
+           |PointerMotionMask|ButtonPressMask|ButtonReleaseMask,
+           ScaleMouseProc, (ClientData) scalePtr);
+    Tcl_CreateCommand(interp, Tk_PathName(scalePtr->tkwin), ScaleWidgetCmd,
+           (ClientData) scalePtr, (void (*)()) NULL);
+    if (ConfigureScale(interp, scalePtr, argc-2, argv+2, 0) != TCL_OK) {
+       goto error;
+    }
+
+    interp->result = Tk_PathName(scalePtr->tkwin);
+    return TCL_OK;
+
+    error:
+    Tk_DestroyWindow(scalePtr->tkwin);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScaleWidgetCmd --
+ *
+ *     This procedure is invoked to process the Tcl command
+ *     that corresponds to a widget managed by this module.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ScaleWidgetCmd(clientData, interp, argc, argv)
+    ClientData clientData;             /* Information about scale
+                                        * widget. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    register Scale *scalePtr = (Scale *) clientData;
+    int result = TCL_OK;
+    int length;
+    char c;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    Tk_Preserve((ClientData) scalePtr);
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)) {
+       if (argc == 2) {
+           result = Tk_ConfigureInfo(interp, scalePtr->tkwin, configSpecs,
+                   (char *) scalePtr, (char *) NULL, 0);
+       } else if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, scalePtr->tkwin, configSpecs,
+                   (char *) scalePtr, argv[2], 0);
+       } else {
+           result = ConfigureScale(interp, scalePtr, argc-2, argv+2,
+                   TK_CONFIG_ARGV_ONLY);
+       }
+    } else if ((c == 'g') && (strncmp(argv[1], "get", length) == 0)) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " get\"", (char *) NULL);
+           goto error;
+       }
+       sprintf(interp->result, "%d", scalePtr->value);
+    } else if ((c == 's') && (strncmp(argv[1], "set", length) == 0)) {
+       int value;
+
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " set value\"", (char *) NULL);
+           goto error;
+       }
+       if (Tcl_GetInt(interp, argv[2], &value) != TCL_OK) {
+           goto error;
+       }
+       if (scalePtr->state == tkNormalUid) {
+           if ((value < scalePtr->fromValue)
+                   ^ (scalePtr->toValue < scalePtr->fromValue)) {
+               value = scalePtr->fromValue;
+           }
+           if ((value > scalePtr->toValue)
+                   ^ (scalePtr->toValue < scalePtr->fromValue)) {
+               value = scalePtr->toValue;
+           }
+           SetScaleValue(scalePtr, value);
+       }
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\":  must be configure, get, or set", (char *) NULL);
+       goto error;
+    }
+    Tk_Release((ClientData) scalePtr);
+    return result;
+
+    error:
+    Tk_Release((ClientData) scalePtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyScale --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a button at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the scale is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyScale(clientData)
+    ClientData clientData;     /* Info about scale widget. */
+{
+    register Scale *scalePtr = (Scale *) clientData;
+
+    if (scalePtr->command != NULL) {
+       ckfree(scalePtr->command);
+    }
+    if (scalePtr->label != NULL) {
+       ckfree(scalePtr->label);
+    }
+    if (scalePtr->bgBorder != NULL) {
+       Tk_Free3DBorder(scalePtr->bgBorder);
+    }
+    if (scalePtr->sliderBorder != NULL) {
+       Tk_Free3DBorder(scalePtr->sliderBorder);
+    }
+    if (scalePtr->activeBorder != NULL) {
+       Tk_Free3DBorder(scalePtr->activeBorder);
+    }
+    if (scalePtr->fontPtr != NULL) {
+       Tk_FreeFontStruct(scalePtr->fontPtr);
+    }
+    if (scalePtr->textColorPtr != NULL) {
+       Tk_FreeColor(scalePtr->textColorPtr);
+    }
+    if (scalePtr->textGC != None) {
+       Tk_FreeGC(scalePtr->textGC);
+    }
+    if (scalePtr->cursor != None) {
+       Tk_FreeCursor(scalePtr->cursor);
+    }
+    ckfree((char *) scalePtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureScale --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or
+ *     reconfigure) a scale widget.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information, such as colors, border width,
+ *     etc. get set for scalePtr;  old resources get freed,
+ *     if there were any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureScale(interp, scalePtr, argc, argv, flags)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    register Scale *scalePtr;  /* Information about widget;  may or may
+                                * not already have values for some fields. */
+    int argc;                  /* Number of valid entries in argv. */
+    char **argv;               /* Arguments. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    XGCValues gcValues;
+    GC newGC;
+    int length;
+
+    if (Tk_ConfigureWidget(interp, scalePtr->tkwin, configSpecs,
+           argc, argv, (char *) scalePtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few options need special processing, such as parsing the
+     * orientation or setting the background from a 3-D border.
+     */
+
+    length = strlen(scalePtr->orientUid);
+    if (strncmp(scalePtr->orientUid, "vertical", length) == 0) {
+       scalePtr->vertical = 1;
+    } else if (strncmp(scalePtr->orientUid, "horizontal", length) == 0) {
+       scalePtr->vertical = 0;
+    } else {
+       Tcl_AppendResult(interp, "bad orientation \"", scalePtr->orientUid,
+               "\": must be vertical or horizontal", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if ((scalePtr->state != tkNormalUid)
+           && (scalePtr->state != tkDisabledUid)) {
+       Tcl_AppendResult(interp, "bad state value \"", scalePtr->state,
+               "\":  must be normal or disabled", (char *) NULL);
+       scalePtr->state = tkNormalUid;
+       return TCL_ERROR;
+    }
+
+    /*
+     * Make sure that the tick interval has the right sign so that
+     * addition moves from fromValue to toValue.
+     */
+
+    if ((scalePtr->tickInterval < 0)
+           ^ ((scalePtr->toValue - scalePtr->fromValue) <  0)) {
+       scalePtr->tickInterval = -scalePtr->tickInterval;
+    }
+
+    /*
+     * Set the scale value to itself;  all this does is to make sure
+     * that the scale's value is within the new acceptable range for
+     * the scale.
+     */
+
+    SetScaleValue(scalePtr, scalePtr->value);
+
+    if (scalePtr->command != NULL) {
+       scalePtr->commandLength = strlen(scalePtr->command);
+    } else {
+       scalePtr->commandLength = 0;
+    }
+
+    if (scalePtr->label != NULL) {
+       scalePtr->labelLength = strlen(scalePtr->label);
+    } else {
+       scalePtr->labelLength = 0;
+    }
+
+    Tk_SetBackgroundFromBorder(scalePtr->tkwin, scalePtr->bgBorder);
+
+    gcValues.font = scalePtr->fontPtr->fid;
+    gcValues.foreground = scalePtr->textColorPtr->pixel;
+    newGC = Tk_GetGC(scalePtr->tkwin, GCForeground|GCFont, &gcValues);
+    if (scalePtr->textGC != None) {
+       Tk_FreeGC(scalePtr->textGC);
+    }
+    scalePtr->textGC = newGC;
+
+    if (scalePtr->relief != TK_RELIEF_FLAT) {
+       scalePtr->offset = scalePtr->borderWidth;
+    } else {
+       scalePtr->offset = 0;
+    }
+
+    /*
+     * Recompute display-related information, and let the geometry
+     * manager know how much space is needed now.
+     */
+
+    ComputeScaleGeometry(scalePtr);
+
+    EventuallyRedrawScale(scalePtr, REDRAW_ALL);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ComputeScaleGeometry --
+ *
+ *     This procedure is called to compute various geometrical
+ *     information for a scale, such as where various things get
+ *     displayed.  It's called when the window is reconfigured.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Display-related numbers get changed in *scrollPtr.  The
+ *     geometry manager gets told about the window's preferred size.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ComputeScaleGeometry(scalePtr)
+    register Scale *scalePtr;          /* Information about widget. */
+{
+    XCharStruct bbox;
+    char valueString[30];
+    int dummy, lineHeight;
+
+    /*
+     * Horizontal scales are simpler than vertical ones because
+     * all sizes are the same (the height of a line of text);
+     * handle them first and then quit.
+     */
+
+    if (!scalePtr->vertical) {
+       lineHeight = scalePtr->fontPtr->ascent + scalePtr->fontPtr->descent;
+       if (scalePtr->tickInterval != 0) {
+           scalePtr->tickPixels = lineHeight;
+       } else {
+           scalePtr->tickPixels = 0;
+       }
+       if (scalePtr->showValue) {
+           scalePtr->valuePixels = lineHeight + SPACING;
+       } else {
+           scalePtr->valuePixels = 0;
+       }
+       if (scalePtr->labelLength != 0) {
+           scalePtr->labelPixels = lineHeight;
+       } else {
+           scalePtr->labelPixels = 0;
+       }
+
+       Tk_GeometryRequest(scalePtr->tkwin,
+               scalePtr->length + 2*scalePtr->offset,
+               scalePtr->tickPixels + scalePtr->valuePixels
+               + scalePtr->width + 2*scalePtr->borderWidth
+               + scalePtr->labelPixels + 2*scalePtr->offset);
+       Tk_SetInternalBorder(scalePtr->tkwin, scalePtr->borderWidth);
+       return;
+    }
+
+    /*
+     * Vertical scale:  compute the amount of space needed for tick marks
+     * and current value by formatting strings for the two end points;
+     * use whichever length is longer.
+     */
+
+    sprintf(valueString, "%d", scalePtr->fromValue);
+    XTextExtents(scalePtr->fontPtr, valueString, strlen(valueString),
+           &dummy, &dummy, &dummy, &bbox);
+    scalePtr->tickPixels = bbox.rbearing + bbox.lbearing;
+    sprintf(valueString, "%d", scalePtr->toValue);
+    XTextExtents(scalePtr->fontPtr, valueString, strlen(valueString),
+           &dummy, &dummy, &dummy, &bbox);
+    if (scalePtr->tickPixels < bbox.rbearing + bbox.lbearing) {
+       scalePtr->tickPixels = bbox.rbearing + bbox.lbearing;
+    }
+
+    /*
+     * Pad the value with a bit of extra space for prettier printing.
+     */
+
+    scalePtr->tickPixels += scalePtr->fontPtr->ascent/2;
+    scalePtr->valuePixels = scalePtr->tickPixels;
+    if (scalePtr->tickInterval == 0) {
+       scalePtr->tickPixels = 0;
+    }
+    if (!scalePtr->showValue) {
+       scalePtr->valuePixels = 0;
+    }
+
+    if (scalePtr->labelLength == 0) {
+       scalePtr->labelPixels = 0;
+    } else {
+       XTextExtents(scalePtr->fontPtr, scalePtr->label,
+               scalePtr->labelLength, &dummy, &dummy, &dummy, &bbox);
+       scalePtr->labelPixels = bbox.rbearing + bbox.lbearing
+               + scalePtr->fontPtr->ascent;
+    }
+    Tk_GeometryRequest(scalePtr->tkwin, 4*scalePtr->borderWidth
+           + scalePtr->tickPixels + scalePtr->valuePixels + SPACING
+           + scalePtr->width + scalePtr->labelPixels,
+           scalePtr->length);
+    Tk_SetInternalBorder(scalePtr->tkwin, scalePtr->borderWidth);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayVerticalScale --
+ *
+ *     This procedure redraws the contents of a vertical scale
+ *     window.  It is invoked as a do-when-idle handler, so it only
+ *     runs when there's nothing else for the application to do.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information appears on the screen.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayVerticalScale(clientData)
+    ClientData clientData;     /* Information about widget. */
+{
+    register Scale *scalePtr = (Scale *) clientData;
+    register Tk_Window tkwin = scalePtr->tkwin;
+    int tickRightEdge, valueRightEdge, labelLeftEdge, scaleLeftEdge;
+    int totalPixels, x, y, width, height, shadowWidth, tickValue;
+    int relief;
+    Tk_3DBorder sliderBorder;
+
+    if ((scalePtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
+       goto done;
+    }
+
+    /*
+     * Scanning from left to right across the window, the window
+     * will contain four columns:  ticks, value, scale, and label.
+     * Compute the x-coordinate for each of the columns.
+     */
+
+    totalPixels = scalePtr->tickPixels + scalePtr->valuePixels
+           + 2*scalePtr->borderWidth + scalePtr->width
+           + 2*SPACING + scalePtr->labelPixels;
+    tickRightEdge = (Tk_Width(tkwin) - totalPixels)/2 + scalePtr->tickPixels;
+    valueRightEdge = tickRightEdge + scalePtr->valuePixels;
+    scaleLeftEdge = valueRightEdge + SPACING;
+    labelLeftEdge = scaleLeftEdge + 2*scalePtr->borderWidth
+           + scalePtr->width + scalePtr->fontPtr->ascent/2;
+
+    /*
+     * Display the information from left to right across the window.
+     */
+
+    if (scalePtr->flags & REDRAW_OTHER) {
+       XClearWindow(Tk_Display(tkwin), Tk_WindowId(tkwin));
+
+       /*
+        * Display the tick marks.
+        */
+
+       if (scalePtr->tickPixels != 0) {
+           for (tickValue = scalePtr->fromValue; ;
+                   tickValue += scalePtr->tickInterval) {
+               if (scalePtr->toValue > scalePtr->fromValue) {
+                   if (tickValue > scalePtr->toValue) {
+                       break;
+                   }
+               } else {
+                   if (tickValue < scalePtr->toValue) {
+                       break;
+                   }
+               }
+               DisplayVerticalValue(scalePtr, tickValue, tickRightEdge);
+           }
+       }
+    }
+
+    /*
+     * Display the value, if it is desired.  If not redisplaying the
+     * entire window, clear the area of the value to get rid of the
+     * old value displayed there.
+     */
+
+    if (scalePtr->showValue) {
+       if (!(scalePtr->flags & REDRAW_OTHER)) {
+           XClearArea(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                   valueRightEdge-scalePtr->valuePixels, scalePtr->offset,
+                   scalePtr->valuePixels,
+                   Tk_Height(tkwin) - 2*scalePtr->offset, False);
+       }
+       DisplayVerticalValue(scalePtr, scalePtr->value, valueRightEdge);
+    }
+
+    /*
+     * Display the scale and the slider.  If not redisplaying the
+     * entire window, must clear the trench area to erase the old
+     * slider, but don't need to redraw the border.
+     */
+
+    if (scalePtr->flags & REDRAW_OTHER) {
+       Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               scalePtr->bgBorder, scaleLeftEdge, scalePtr->offset,
+               scalePtr->width + 2*scalePtr->borderWidth,
+               Tk_Height(tkwin) - 2*scalePtr->offset, scalePtr->borderWidth,
+               TK_RELIEF_SUNKEN);
+    } else {
+       XClearArea(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               scaleLeftEdge + scalePtr->borderWidth,
+               scalePtr->offset + scalePtr->borderWidth,
+               scalePtr->width,
+               Tk_Height(tkwin) - 2*scalePtr->offset
+               - 2*scalePtr->borderWidth, False);
+    }
+    if (scalePtr->flags & ACTIVE) {
+       sliderBorder = scalePtr->activeBorder;
+    } else {
+       sliderBorder = scalePtr->sliderBorder;
+    }
+    width = scalePtr->width;
+    height = scalePtr->sliderLength/2;
+    x = scaleLeftEdge + scalePtr->borderWidth;
+    y = ValueToPixel(scalePtr, scalePtr->value) - height;
+    shadowWidth = scalePtr->borderWidth/2;
+    if (shadowWidth == 0) {
+       shadowWidth = 1;
+    }
+    relief = (scalePtr->flags & BUTTON_PRESSED) ? TK_RELIEF_SUNKEN
+           : TK_RELIEF_RAISED;
+    Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin), sliderBorder,
+           x, y, width, 2*height, shadowWidth, relief);
+    x += shadowWidth;
+    y += shadowWidth;
+    width -= 2*shadowWidth;
+    height -= shadowWidth;
+    Tk_Fill3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin), sliderBorder,
+           x, y, width, height, shadowWidth, relief);
+    Tk_Fill3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin), sliderBorder,
+           x, y+height, width, height, shadowWidth, relief);
+
+    /*
+     * Draw the label to the right of the scale.
+     */
+
+    if ((scalePtr->flags & REDRAW_OTHER) && (scalePtr->labelPixels != 0)) {
+       XDrawString(Tk_Display(scalePtr->tkwin), Tk_WindowId(scalePtr->tkwin),
+           scalePtr->textGC, labelLeftEdge,
+           scalePtr->offset + (3*scalePtr->fontPtr->ascent)/2,
+           scalePtr->label, scalePtr->labelLength);
+    }
+
+    /*
+     * Draw the window border.
+     */
+
+    if ((scalePtr->flags & REDRAW_OTHER)
+           && (scalePtr->relief != TK_RELIEF_FLAT)) {
+       Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               scalePtr->bgBorder, 0, 0, Tk_Width(tkwin), Tk_Height(tkwin),
+               scalePtr->borderWidth, scalePtr->relief);
+    }
+
+    done:
+    scalePtr->flags &= ~REDRAW_ALL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DisplayVerticalValue --
+ *
+ *     This procedure is called to display values (scale readings)
+ *     for vertically-oriented scales.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The numerical value corresponding to value is displayed with
+ *     its right edge at "rightEdge", and at a vertical position in
+ *     the scale that corresponds to "value".
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DisplayVerticalValue(scalePtr, value, rightEdge)
+    register Scale *scalePtr;  /* Information about widget in which to
+                                * display value. */
+    int value;                 /* Y-coordinate of number to display,
+                                * specified in application coords, not
+                                * in pixels (we'll compute pixels). */
+    int rightEdge;             /* X-coordinate of right edge of text,
+                                * specified in pixels. */
+{
+    register Tk_Window tkwin = scalePtr->tkwin;
+    int y, dummy, length;
+    char valueString[30];
+    XCharStruct bbox;
+
+    y = ValueToPixel(scalePtr, value) + scalePtr->fontPtr->ascent/2;
+    sprintf(valueString, "%d", value);
+    length = strlen(valueString);
+    XTextExtents(scalePtr->fontPtr, valueString, length,
+           &dummy, &dummy, &dummy, &bbox);
+
+    /*
+     * Adjust the y-coordinate if necessary to keep the text entirely
+     * inside the window.
+     */
+
+    if ((y - bbox.ascent) < scalePtr->offset) {
+       y = scalePtr->offset + bbox.ascent;
+    }
+    if ((y + bbox.descent) > (Tk_Height(tkwin) - scalePtr->offset)) {
+       y = Tk_Height(tkwin) - scalePtr->offset - bbox.descent;
+    }
+    XDrawString(Tk_Display(tkwin), Tk_WindowId(tkwin),
+           scalePtr->textGC, rightEdge - bbox.rbearing,
+           y, valueString, length);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayHorizontalScale --
+ *
+ *     This procedure redraws the contents of a horizontal scale
+ *     window.  It is invoked as a do-when-idle handler, so it only
+ *     runs when there's nothing else for the application to do.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information appears on the screen.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayHorizontalScale(clientData)
+    ClientData clientData;     /* Information about widget. */
+{
+    register Scale *scalePtr = (Scale *) clientData;
+    register Tk_Window tkwin = scalePtr->tkwin;
+    int tickBottom, valueBottom, labelBottom, scaleBottom;
+    int totalPixels, x, y, width, height, shadowWidth, tickValue;
+    int relief;
+    Tk_3DBorder sliderBorder;
+
+    if ((scalePtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
+       goto done;
+    }
+
+    /*
+     * Scanning from bottom to top across the window, the window
+     * will contain four rows:  ticks, value, scale, and label.
+     * Compute the y-coordinate for each of the rows.
+     */
+
+    totalPixels = scalePtr->tickPixels + scalePtr->valuePixels
+           + 2*scalePtr->borderWidth + scalePtr->width
+           + scalePtr->labelPixels;
+    tickBottom = (Tk_Height(tkwin) + totalPixels)/2 - 1;
+    valueBottom = tickBottom - scalePtr->tickPixels;
+    scaleBottom = valueBottom - scalePtr->valuePixels;
+    labelBottom = scaleBottom - 2*scalePtr->borderWidth - scalePtr->width;
+
+    /*
+     * Display the information from bottom to top across the window.
+     */
+
+    if (scalePtr->flags & REDRAW_OTHER) {
+       XClearWindow(Tk_Display(tkwin), Tk_WindowId(tkwin));
+
+       /*
+        * Display the tick marks.
+        */
+
+       if (scalePtr->tickPixels != 0) {
+           for (tickValue = scalePtr->fromValue; ;
+                   tickValue += scalePtr->tickInterval) {
+               if (scalePtr->toValue > scalePtr->fromValue) {
+                   if (tickValue > scalePtr->toValue) {
+                       break;
+                   }
+               } else {
+                   if (tickValue < scalePtr->toValue) {
+                       break;
+                   }
+               }
+               DisplayHorizontalValue(scalePtr, tickValue, tickBottom);
+           }
+       }
+    }
+
+    /*
+     * Display the value, if it is desired.  If not redisplaying the
+     * entire window, clear the area of the value to get rid of the
+     * old value displayed there.
+     */
+
+    if (scalePtr->showValue) {
+       if (!(scalePtr->flags & REDRAW_OTHER)) {
+           XClearArea(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                   scalePtr->offset, scaleBottom + 1,
+                   Tk_Width(tkwin) - 2*scalePtr->offset,
+                   valueBottom - scaleBottom, False);
+       }
+       DisplayHorizontalValue(scalePtr, scalePtr->value, valueBottom);
+    }
+
+    /*
+     * Display the scale and the slider.  If not redisplaying the
+     * entire window, must clear the trench area to erase the old
+     * slider, but don't need to redraw the border.
+     */
+
+    y = scaleBottom - 2*scalePtr->borderWidth - scalePtr->width + 1;
+    if (scalePtr->flags & REDRAW_OTHER) {
+       Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               scalePtr->bgBorder, scalePtr->offset, y,
+               Tk_Width(tkwin) - 2*scalePtr->offset,
+               scalePtr->width + 2*scalePtr->borderWidth,
+               scalePtr->borderWidth, TK_RELIEF_SUNKEN);
+    } else {
+       XClearArea(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               scalePtr->offset + scalePtr->borderWidth,
+               y + scalePtr->borderWidth,
+               Tk_Width(tkwin) - 2*scalePtr->offset - 2*scalePtr->borderWidth,
+               scalePtr->width, False);
+    }
+    if (scalePtr->flags & ACTIVE) {
+       sliderBorder = scalePtr->activeBorder;
+    } else {
+       sliderBorder = scalePtr->sliderBorder;
+    }
+    width = scalePtr->sliderLength/2;
+    height = scalePtr->width;
+    x = ValueToPixel(scalePtr, scalePtr->value) - width;
+    y += scalePtr->borderWidth;
+    shadowWidth = scalePtr->borderWidth/2;
+    if (shadowWidth == 0) {
+       shadowWidth = 1;
+    }
+    relief = (scalePtr->flags & BUTTON_PRESSED) ? TK_RELIEF_SUNKEN
+           : TK_RELIEF_RAISED;
+    Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin), sliderBorder,
+           x, y, 2*width, height, shadowWidth, relief);
+    x += shadowWidth;
+    y += shadowWidth;
+    width -= shadowWidth;
+    height -= 2*shadowWidth;
+    Tk_Fill3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin), sliderBorder,
+           x, y, width, height, shadowWidth, relief);
+    Tk_Fill3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin), sliderBorder,
+           x+width, y, width, height, shadowWidth, relief);
+
+    /*
+     * Draw the label to the top of the scale.
+     */
+
+    if ((scalePtr->flags & REDRAW_OTHER) && (scalePtr->labelPixels != 0)) {
+       XDrawString(Tk_Display(scalePtr->tkwin), Tk_WindowId(scalePtr->tkwin),
+           scalePtr->textGC, scalePtr->offset + scalePtr->fontPtr->ascent/2,
+           labelBottom - scalePtr->fontPtr->descent,
+           scalePtr->label, scalePtr->labelLength);
+    }
+
+    /*
+     * Draw the window border.
+     */
+
+    if ((scalePtr->flags & REDRAW_OTHER)
+           && (scalePtr->relief != TK_RELIEF_FLAT)) {
+       Tk_Draw3DRectangle(Tk_Display(tkwin), Tk_WindowId(tkwin),
+               scalePtr->bgBorder, 0, 0, Tk_Width(tkwin), Tk_Height(tkwin),
+               scalePtr->borderWidth, scalePtr->relief);
+    }
+
+    done:
+    scalePtr->flags &= ~REDRAW_ALL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DisplayHorizontalValue --
+ *
+ *     This procedure is called to display values (scale readings)
+ *     for horizontally-oriented scales.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The numerical value corresponding to value is displayed with
+ *     its bottom edge at "bottom", and at a horizontal position in
+ *     the scale that corresponds to "value".
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DisplayHorizontalValue(scalePtr, value, bottom)
+    register Scale *scalePtr;  /* Information about widget in which to
+                                * display value. */
+    int value;                 /* Y-coordinate of number to display,
+                                * specified in application coords, not
+                                * in pixels (we'll compute pixels). */
+    int bottom;                        /* Y-coordinate of bottom edge of text,
+                                * specified in pixels. */
+{
+    register Tk_Window tkwin = scalePtr->tkwin;
+    int x, y, dummy, length;
+    char valueString[30];
+    XCharStruct bbox;
+
+    x = ValueToPixel(scalePtr, value);
+    y = bottom - scalePtr->fontPtr->descent;
+    sprintf(valueString, "%d", value);
+    length = strlen(valueString);
+    XTextExtents(scalePtr->fontPtr, valueString, length,
+           &dummy, &dummy, &dummy, &bbox);
+
+    /*
+     * Adjust the x-coordinate if necessary to keep the text entirely
+     * inside the window.
+     */
+
+    x -= (bbox.lbearing + bbox.rbearing)/2;
+    if ((x - bbox.lbearing) < scalePtr->offset) {
+       x = scalePtr->offset + bbox.lbearing;
+    }
+    if ((y + bbox.rbearing) > (Tk_Width(tkwin) - scalePtr->offset)) {
+       x = Tk_Width(tkwin) - scalePtr->offset - bbox.rbearing;
+    }
+    XDrawString(Tk_Display(tkwin), Tk_WindowId(tkwin),
+           scalePtr->textGC, x, y, valueString, length);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * PixelToValue --
+ *
+ *     Given a pixel within a scale window, return the scale
+ *     reading corresponding to that pixel.
+ *
+ * Results:
+ *     An integer scale reading.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+PixelToValue(scalePtr, x, y)
+    register Scale *scalePtr;          /* Information about widget. */
+    int x, y;                          /* Coordinates of point within
+                                        * window. */
+{
+    int value, pixelRange;
+
+    if (scalePtr->vertical) {
+       pixelRange = Tk_Height(scalePtr->tkwin) - scalePtr->sliderLength
+               - 2*scalePtr->offset - 2*scalePtr->borderWidth;
+       value = y;
+    } else {
+       pixelRange = Tk_Width(scalePtr->tkwin) - scalePtr->sliderLength
+               - 2*scalePtr->offset - 2*scalePtr->borderWidth;
+       value = x;
+    }
+
+    if (pixelRange <= 0) {
+       /*
+        * Not enough room for the slider to actually slide:  just return
+        * the scale's current value.
+        */
+
+       return scalePtr->value;
+    }
+    value -= scalePtr->sliderLength/2 + scalePtr->offset
+               + scalePtr->borderWidth;
+    if (value < 0) {
+       value = 0;
+    }
+    if (value > pixelRange) {
+       value = pixelRange;
+    }
+    if (scalePtr->toValue > scalePtr->fromValue) {
+       value = scalePtr->fromValue +
+               ((value * (scalePtr->toValue - scalePtr->fromValue))
+               + pixelRange/2)/pixelRange;
+    } else {
+       value = scalePtr->toValue +
+               (((pixelRange - value)
+               * (scalePtr->fromValue - scalePtr->toValue))
+               + pixelRange/2)/pixelRange;
+    }
+    return value;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ValueToPixel --
+ *
+ *     Given a reading of the scale, return the x-coordinate or
+ *     y-coordinate corresponding to that reading, depending on
+ *     whether the scale is vertical or horizontal, respectively.
+ *
+ * Results:
+ *     An integer value giving the pixel location corresponding
+ *     to reading.  The value is restricted to lie within the
+ *     defined range for the scale.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ValueToPixel(scalePtr, value)
+    register Scale *scalePtr;          /* Information about widget. */
+    int value;                         /* Reading of the widget. */
+{
+    int y, pixelRange, valueRange;
+
+    valueRange = scalePtr->toValue - scalePtr->fromValue;
+    pixelRange = (scalePtr->vertical ? Tk_Height(scalePtr->tkwin)
+           : Tk_Width(scalePtr->tkwin)) - scalePtr->sliderLength
+           - 2*scalePtr->offset - 2*scalePtr->borderWidth;
+    y = ((value - scalePtr->fromValue) * pixelRange
+           + valueRange/2) / valueRange;
+    if (y < 0) {
+       y = 0;
+    } else if (y > pixelRange) {
+       y = pixelRange;
+    }
+    y += scalePtr->sliderLength/2 + scalePtr->offset + scalePtr->borderWidth;
+    return y;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScaleEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher for various
+ *     events on scales.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the window gets deleted, internal structures get
+ *     cleaned up.  When it gets exposed, it is redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ScaleEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    XEvent *eventPtr;          /* Information about event. */
+{
+    Scale *scalePtr = (Scale *) clientData;
+
+    if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {
+       EventuallyRedrawScale(scalePtr, REDRAW_ALL);
+    } else if (eventPtr->type == DestroyNotify) {
+       Tcl_DeleteCommand(scalePtr->interp, Tk_PathName(scalePtr->tkwin));
+       scalePtr->tkwin = NULL;
+       if (scalePtr->flags & REDRAW_ALL) {
+           if (scalePtr->vertical) {
+               Tk_CancelIdleCall(DisplayVerticalScale, (ClientData) scalePtr);
+           } else {
+               Tk_CancelIdleCall(DisplayHorizontalScale,
+                       (ClientData) scalePtr);
+           }
+       }
+       Tk_EventuallyFree((ClientData) scalePtr, DestroyScale);
+    } else if (eventPtr->type == ConfigureNotify) {
+       ComputeScaleGeometry(scalePtr);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScaleMouseProc --
+ *
+ *     This procedure is called back by Tk in response to
+ *     mouse events such as window entry, window exit, mouse
+ *     motion, and button presses.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     This procedure implements the "feel" of the scale by
+ *     issuing commands in response to button presses and mouse
+ *     motion.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ScaleMouseProc(clientData, eventPtr)
+    ClientData clientData;             /* Information about window. */
+    register XEvent *eventPtr;         /* Information about event. */
+{
+    register Scale *scalePtr = (Scale *) clientData;
+
+    if (scalePtr->state != tkNormalUid) {
+       return;
+    }
+
+    Tk_Preserve((ClientData) scalePtr);
+    if (eventPtr->type == EnterNotify) {
+       scalePtr->flags |= ACTIVE;
+       EventuallyRedrawScale(scalePtr, REDRAW_SLIDER);
+    } else if (eventPtr->type == LeaveNotify) {
+       scalePtr->flags &= ~ACTIVE;
+       EventuallyRedrawScale(scalePtr, REDRAW_SLIDER);
+    } else if ((eventPtr->type == MotionNotify)
+           && (scalePtr->flags & BUTTON_PRESSED)) {
+       SetScaleValue(scalePtr,  PixelToValue(scalePtr,
+               eventPtr->xmotion.x, eventPtr->xmotion.y));
+    } else if ((eventPtr->type == ButtonPress)
+/*         && (eventPtr->xbutton.button == Button1) */
+           && (eventPtr->xbutton.state == 0)) {
+       scalePtr->flags |= BUTTON_PRESSED;
+       SetScaleValue(scalePtr, PixelToValue(scalePtr,
+               eventPtr->xbutton.x, eventPtr->xbutton.y));
+       EventuallyRedrawScale(scalePtr, REDRAW_SLIDER);
+    } else if ((eventPtr->type == ButtonRelease)
+/*         && (eventPtr->xbutton.button == Button1) */
+           && (scalePtr->flags & BUTTON_PRESSED)) {
+       scalePtr->flags &= ~BUTTON_PRESSED;
+       EventuallyRedrawScale(scalePtr, REDRAW_SLIDER);
+    }
+    Tk_Release((ClientData) scalePtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * SetScaleValue --
+ *
+ *     This procedure changes the value of a scale and invokes
+ *     a Tcl command to reflect the current position of a scale
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A Tcl command is invoked, and an additional error-processing
+ *     command may also be invoked.  The scale's slider is redrawn.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+SetScaleValue(scalePtr, value)
+    register Scale *scalePtr;  /* Info about widget. */
+    int value;                 /* New value for scale.  Gets
+                                * adjusted if it's off the scale. */
+{
+    int result;
+    char string[20];
+
+    if ((value < scalePtr->fromValue)
+           ^ (scalePtr->toValue < scalePtr->fromValue)) {
+       value = scalePtr->fromValue;
+    }
+    if ((value > scalePtr->toValue)
+           ^ (scalePtr->toValue < scalePtr->fromValue)) {
+       value = scalePtr->toValue;
+    }
+    if (value == scalePtr->value) {
+       return;
+    }
+    scalePtr->value = value;
+    EventuallyRedrawScale(scalePtr, REDRAW_SLIDER);
+
+    sprintf(string, " %d", scalePtr->value);
+    result = Tcl_VarEval(scalePtr->interp, scalePtr->command, string,
+           (char *) NULL);
+    if (result != TCL_OK) {
+       TkBindError(scalePtr->interp);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * EventuallyRedrawScale --
+ *
+ *     Arrange for part or all of a scale widget to redrawn at
+ *     the next convenient time in the future.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If "what" is REDRAW_SLIDER then just the slider and the
+ *     value readout will be redrawn;  if "what" is REDRAW_ALL
+ *     then the entire widget will be redrawn.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+EventuallyRedrawScale(scalePtr, what)
+    register Scale *scalePtr;  /* Information about widget. */
+    int what;                  /* What to redraw:  REDRAW_SLIDER
+                                * or REDRAW_ALL. */
+{
+    if ((what == 0) || (scalePtr->tkwin == NULL)
+           || !Tk_IsMapped(scalePtr->tkwin)) {
+       return;
+    }
+    if ((scalePtr->flags & REDRAW_ALL) == 0) {
+       if (scalePtr->vertical) {
+           Tk_DoWhenIdle(DisplayVerticalScale, (ClientData) scalePtr);
+       } else {
+           Tk_DoWhenIdle(DisplayHorizontalScale, (ClientData) scalePtr);
+       }
+    }
+    scalePtr->flags |= what;
+}
diff --git a/src/tk/tkscrbar.c b/src/tk/tkscrbar.c
new file mode 100644 (file)
index 0000000..6cec27a
--- /dev/null
@@ -0,0 +1,1190 @@
+/* 
+ * tkScrollbar.c --
+ *
+ *     This module implements a scrollbar widgets for the Tk
+ *     toolkit.  A scrollbar displays a slider and two arrows;
+ *     mouse clicks on features within the scrollbar cause
+ *     scrolling commands to be invoked.
+ *
+ * Copyright 1990-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkScrollbar.c,v 1.35 92/05/22 16:57:27 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "default.h"
+#include "tkint.h"
+
+/*
+ * A data structure of the following type is kept for each scrollbar
+ * widget managed by this file:
+ */
+
+typedef struct {
+    Tk_Window tkwin;           /* Window that embodies the scrollbar.  NULL
+                                * means that the window has been destroyed
+                                * but the data structures haven't yet been
+                                * cleaned up.*/
+    Tcl_Interp *interp;                /* Interpreter associated with scrollbar. */
+    Tk_Uid orientUid;          /* Orientation for window ("vertical" or
+                                * "horizontal"). */
+    int vertical;              /* Non-zero means vertical orientation
+                                * requested, zero means horizontal. */
+    int width;                 /* Desired narrow dimension of scrollbar,
+                                * in pixels. */
+    char *command;             /* Command prefix to use when invoking
+                                * scrolling commands.  NULL means don't
+                                * invoke commands.  Malloc'ed. */
+    int commandSize;           /* Number of non-NULL bytes in command. */
+    int repeatDelay;           /* How long to wait before auto-repeating
+                                * on scrolling actions (in ms). */
+    int repeatInterval;                /* Interval between autorepeats (in ms). */
+
+    /*
+     * Information used when displaying widget:
+     */
+
+    int borderWidth;           /* Width of 3-D borders. */
+    Tk_3DBorder bgBorder;      /* Used for drawing background. */
+    Tk_3DBorder fgBorder;      /* For drawing foreground shapes. */
+    Tk_3DBorder activeBorder;  /* For drawing foreground shapes when
+                                * active (i.e. when mouse is positioned
+                                * over element).  NULL means use fgBorder. */
+    GC copyGC;                 /* Used for copying from pixmap onto screen. */
+    int relief;                        /* Indicates whether window as a whole is
+                                * raised, sunken, or flat. */
+    int offset;                        /* Zero if relief is TK_RELIEF_FLAT,
+                                * borderWidth otherwise.   Indicates how
+                                * much interior stuff must be offset from
+                                * outside edges to leave room for border. */
+    int arrowLength;           /* Length of arrows along long dimension of
+                                * scrollbar.  Recomputed on window size
+                                * changes. */
+    int sliderFirst;           /* Pixel coordinate of top or left edge
+                                * of slider area, including border. */
+    int sliderLast;            /* Coordinate of pixel just after bottom
+                                * or right edge of slider area, including
+                                * border. */
+    int mouseField;            /* Indicates which scrollbar element is
+                                * under mouse (e.g. TOP_ARROW;  see below
+                                * for possible values). */
+    int pressField;            /* Field in which button was pressed, or -1
+                                * if no button is down. */
+    int pressPos;              /* Position of mouse when button was
+                                * pressed (y for vertical scrollbar, x
+                                * for horizontal). */
+    int pressFirstUnit;                /* Value of "firstUnit" when mouse button
+                                * was pressed. */
+
+    /*
+     * Information describing the application related to the scrollbar.
+     * This information is provided by the application by invoking the
+     * "set" widget command.
+     */
+
+    int totalUnits;            /* Total dimension of application, in
+                                * units. */
+    int windowUnits;           /* Maximum number of units that can
+                                * be displayed in the window at
+                                * once. */
+    int firstUnit;             /* Number of last unit visible in
+                                * application's window. */
+    int lastUnit;              /* Index of last unit visible in window. */
+
+    /*
+     * Miscellaneous information:
+     */
+
+    Cursor cursor;             /* Current cursor for window, or None. */
+    Tk_TimerToken autoRepeat;  /* Token for auto-repeat that's
+                                * currently in progress.  NULL means no
+                                * auto-repeat in progress. */
+    int flags;                 /* Various flags;  see below for
+                                * definitions. */
+} Scrollbar;
+
+/*
+ * Legal values for "mouseField" field of Scrollbar structures.  These
+ * are also the return values from the ScrollbarPosition procedure.
+ */
+
+#define TOP_ARROW      1
+#define TOP_GAP                2
+#define SLIDER         3
+#define BOTTOM_GAP     4
+#define BOTTOM_ARROW   5
+#define OUTSIDE                6
+
+/*
+ * Flag bits for scrollbars:
+ * 
+ * REDRAW_PENDING:             Non-zero means a DoWhenIdle handler
+ *                             has already been queued to redraw
+ *                             this window.
+ */
+
+#define REDRAW_PENDING         1
+
+/*
+ * Information used for argv parsing.
+ */
+
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_BORDER, "-activeforeground", "activeForeground", "Background",
+       DEF_SCROLLBAR_ACTIVE_FG_COLOR, Tk_Offset(Scrollbar, activeBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-activeforeground", "activeForeground", "Background",
+       DEF_SCROLLBAR_ACTIVE_FG_MONO, Tk_Offset(Scrollbar, activeBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_SCROLLBAR_BG_COLOR, Tk_Offset(Scrollbar, bgBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_SCROLLBAR_BG_MONO, Tk_Offset(Scrollbar, bgBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       DEF_SCROLLBAR_BORDER_WIDTH, Tk_Offset(Scrollbar, borderWidth), 0},
+    {TK_CONFIG_STRING, "-command", "command", "Command",
+       DEF_SCROLLBAR_COMMAND, Tk_Offset(Scrollbar, command), 0},
+    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",
+       DEF_SCROLLBAR_CURSOR, Tk_Offset(Scrollbar, cursor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_BORDER, "-foreground", "foreground", "Foreground",
+       DEF_SCROLLBAR_FG_COLOR, Tk_Offset(Scrollbar, fgBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-foreground", "foreground", "Foreground",
+       DEF_SCROLLBAR_FG_MONO, Tk_Offset(Scrollbar, fgBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_UID, "-orient", "orient", "Orient",
+       DEF_SCROLLBAR_ORIENT, Tk_Offset(Scrollbar, orientUid), 0},
+    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
+       DEF_SCROLLBAR_RELIEF, Tk_Offset(Scrollbar, relief), 0},
+    {TK_CONFIG_INT, "-repeatdelay", "repeatDelay", "RepeatDelay",
+       DEF_SCROLLBAR_REPEAT_DELAY, Tk_Offset(Scrollbar, repeatDelay), 0},
+    {TK_CONFIG_INT, "-repeatinterval", "repeatInterval", "RepeatInterval",
+       DEF_SCROLLBAR_REPEAT_INTERVAL, Tk_Offset(Scrollbar, repeatInterval), 0},
+    {TK_CONFIG_PIXELS, "-width", "width", "Width",
+       DEF_SCROLLBAR_WIDTH, Tk_Offset(Scrollbar, width), 0},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            ComputeScrollbarGeometry _ANSI_ARGS_((
+                           Scrollbar *scrollPtr));
+static int             ConfigureScrollbar _ANSI_ARGS_((Tcl_Interp *interp,
+                           Scrollbar *scrollPtr, int argc, char **argv,
+                           int flags));
+static void            DestroyScrollbar _ANSI_ARGS_((ClientData clientData));
+static void            DisplayScrollbar _ANSI_ARGS_((ClientData clientData));
+static void            EventuallyRedraw _ANSI_ARGS_((Scrollbar *scrollPtr));
+static void            ScrollbarEventProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static void            ScrollbarMouseProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static void            ScrollbarNewField _ANSI_ARGS_((Scrollbar *scrollPtr,
+                           int field));
+static int             ScrollbarPosition _ANSI_ARGS_((Scrollbar *scrollPtr,
+                           int x, int y));
+static void            ScrollbarTimerProc _ANSI_ARGS_((
+                           ClientData clientData));
+static int             ScrollbarWidgetCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *, int argc, char **argv));
+static void            ScrollCmd _ANSI_ARGS_((Scrollbar *scrollPtr,
+                           int unit));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_ScrollbarCmd --
+ *
+ *     This procedure is invoked to process the "scrollbar" Tcl
+ *     command.  See the user documentation for details on what
+ *     it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_ScrollbarCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    register Scrollbar *scrollPtr;
+    Tk_Window new;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args:  should be \"",
+               argv[0], " pathName ?options?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], (char *) NULL);
+    if (new == NULL) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * Initialize fields that won't be initialized by ConfigureScrollbar,
+     * or which ConfigureScrollbar expects to have reasonable values
+     * (e.g. resource pointers).
+     */
+
+    scrollPtr = (Scrollbar *) ckalloc(sizeof(Scrollbar));
+    scrollPtr->tkwin = new;
+    scrollPtr->interp = interp;
+    scrollPtr->command = NULL;
+    scrollPtr->bgBorder = NULL;
+    scrollPtr->fgBorder = NULL;
+    scrollPtr->activeBorder = NULL;
+    scrollPtr->copyGC = None;
+    scrollPtr->mouseField = OUTSIDE;
+    scrollPtr->pressField = -1;
+    scrollPtr->totalUnits = 0;
+    scrollPtr->windowUnits = 0;
+    scrollPtr->firstUnit = 0;
+    scrollPtr->lastUnit = 0;
+    scrollPtr->cursor = None;
+    scrollPtr->autoRepeat = NULL;
+    scrollPtr->flags = 0;
+
+    Tk_SetClass(scrollPtr->tkwin, "Scrollbar");
+    Tk_CreateEventHandler(scrollPtr->tkwin, ExposureMask|StructureNotifyMask,
+           ScrollbarEventProc, (ClientData) scrollPtr);
+    Tk_CreateEventHandler(scrollPtr->tkwin, EnterWindowMask|LeaveWindowMask
+           |PointerMotionMask|ButtonPressMask|ButtonReleaseMask,
+           ScrollbarMouseProc, (ClientData) scrollPtr);
+    Tcl_CreateCommand(interp, Tk_PathName(scrollPtr->tkwin), ScrollbarWidgetCmd,
+           (ClientData) scrollPtr, (void (*)()) NULL);
+    if (ConfigureScrollbar(interp, scrollPtr, argc-2, argv+2, 0) != TCL_OK) {
+       goto error;
+    }
+
+    interp->result = Tk_PathName(scrollPtr->tkwin);
+    return TCL_OK;
+
+    error:
+    Tk_DestroyWindow(scrollPtr->tkwin);
+    return TCL_ERROR;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScrollbarWidgetCmd --
+ *
+ *     This procedure is invoked to process the Tcl command
+ *     that corresponds to a widget managed by this module.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ScrollbarWidgetCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Information about scrollbar
+                                        * widget. */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    register Scrollbar *scrollPtr = (Scrollbar *) clientData;
+    int result = TCL_OK;
+    int length;
+    char c;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    Tk_Preserve((ClientData) scrollPtr);
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)) {
+       if (argc == 2) {
+           result = Tk_ConfigureInfo(interp, scrollPtr->tkwin, configSpecs,
+                   (char *) scrollPtr, (char *) NULL, 0);
+       } else if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, scrollPtr->tkwin, configSpecs,
+                   (char *) scrollPtr, argv[2], 0);
+       } else {
+           result = ConfigureScrollbar(interp, scrollPtr, argc-2, argv+2,
+                   TK_CONFIG_ARGV_ONLY);
+       }
+    } else if ((c == 'g') && (strncmp(argv[1], "get", length) == 0)) {
+       if (argc != 2) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " get\"", (char *) NULL);
+           goto error;
+       }
+       sprintf(interp->result, "%d %d %d %d", scrollPtr->totalUnits,
+               scrollPtr->windowUnits, scrollPtr->firstUnit,
+               scrollPtr->lastUnit);
+    } else if ((c == 's') && (strncmp(argv[1], "set", length) == 0)) {
+       int totalUnits, windowUnits, firstUnit, lastUnit;
+
+       if (argc != 6) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0],
+                   " set totalUnits windowUnits firstUnit lastUnit\"",
+                   (char *) NULL);
+           goto error;
+       }
+       if (Tcl_GetInt(interp, argv[2], &totalUnits) != TCL_OK) {
+           goto error;
+       }
+       if (totalUnits < 0) {
+           sprintf(interp->result, "illegal totalUnits %d", totalUnits);
+           goto error;
+       }
+       if (Tcl_GetInt(interp, argv[3], &windowUnits) != TCL_OK) {
+           goto error;
+       }
+       if (windowUnits < 0) {
+           sprintf(interp->result, "illegal windowUnits %d", windowUnits);
+           goto error;
+       }
+       if (Tcl_GetInt(interp, argv[4], &firstUnit) != TCL_OK) {
+           goto error;
+       }
+       if (Tcl_GetInt(interp, argv[5], &lastUnit) != TCL_OK) {
+           goto error;
+       }
+       if (totalUnits > 0) {
+           if (lastUnit < firstUnit) {
+               sprintf(interp->result, "illegal lastUnit %d", lastUnit);
+               goto error;
+           }
+       } else {
+           firstUnit = lastUnit = 0;
+       }
+       scrollPtr->totalUnits = totalUnits;
+       scrollPtr->windowUnits = windowUnits;
+       scrollPtr->firstUnit = firstUnit;
+       scrollPtr->lastUnit = lastUnit;
+       ComputeScrollbarGeometry(scrollPtr);
+       EventuallyRedraw(scrollPtr);
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\":  must be configure, get, or set", (char *) NULL);
+       goto error;
+    }
+    Tk_Release((ClientData) scrollPtr);
+    return result;
+
+    error:
+    Tk_Release((ClientData) scrollPtr);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyScrollbar --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a scrollbar at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the scrollbar is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyScrollbar(clientData)
+    ClientData clientData;     /* Info about scrollbar widget. */
+{
+    register Scrollbar *scrollPtr = (Scrollbar *) clientData;
+
+    if (scrollPtr->command != NULL) {
+       ckfree(scrollPtr->command);
+    }
+    if (scrollPtr->bgBorder != NULL) {
+       Tk_Free3DBorder(scrollPtr->bgBorder);
+    }
+    if (scrollPtr->fgBorder != NULL) {
+       Tk_Free3DBorder(scrollPtr->fgBorder);
+    }
+    if (scrollPtr->activeBorder != NULL) {
+       Tk_Free3DBorder(scrollPtr->activeBorder);
+    }
+    if (scrollPtr->copyGC != None) {
+       Tk_FreeGC(scrollPtr->copyGC);
+    }
+    if (scrollPtr->cursor != None) {
+       Tk_FreeCursor(scrollPtr->cursor);
+    }
+    ckfree((char *) scrollPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureScrollbar --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or
+ *     reconfigure) a scrollbar widget.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information, such as colors, border width,
+ *     etc. get set for scrollPtr;  old resources get freed,
+ *     if there were any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureScrollbar(interp, scrollPtr, argc, argv, flags)
+    Tcl_Interp *interp;                        /* Used for error reporting. */
+    register Scrollbar *scrollPtr;     /* Information about widget;  may or
+                                        * may not already have values for
+                                        * some fields. */
+    int argc;                          /* Number of valid entries in argv. */
+    char **argv;                       /* Arguments. */
+    int flags;                         /* Flags to pass to
+                                        * Tk_ConfigureWidget. */
+{
+    int length;
+    XGCValues gcValues;
+
+    if (Tk_ConfigureWidget(interp, scrollPtr->tkwin, configSpecs,
+           argc, argv, (char *) scrollPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few options need special processing, such as parsing the
+     * orientation or setting the background from a 3-D border.
+     */
+
+    length = strlen(scrollPtr->orientUid);
+    if (strncmp(scrollPtr->orientUid, "vertical", length) == 0) {
+       scrollPtr->vertical = 1;
+    } else if (strncmp(scrollPtr->orientUid, "horizontal", length) == 0) {
+       scrollPtr->vertical = 0;
+    } else {
+       Tcl_AppendResult(interp, "bad orientation \"", scrollPtr->orientUid,
+               "\": must be vertical or horizontal", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if (scrollPtr->command != NULL) {
+       scrollPtr->commandSize = strlen(scrollPtr->command);
+    } else {
+       scrollPtr->commandSize = 0;
+    }
+
+    Tk_SetBackgroundFromBorder(scrollPtr->tkwin, scrollPtr->bgBorder);
+
+    if (scrollPtr->copyGC == None) {
+       gcValues.graphics_exposures = False;
+       scrollPtr->copyGC = Tk_GetGC(scrollPtr->tkwin, GCGraphicsExposures,
+           &gcValues);
+    }
+
+    /*
+     * Register the desired geometry for the window (leave enough space
+     * for the two arrows plus a minimum-size slider, plus border around
+     * the whole window, if any).  Then arrange for the window to be
+     * redisplayed.
+     */
+
+    ComputeScrollbarGeometry(scrollPtr);
+    EventuallyRedraw(scrollPtr);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DisplayScrollbar --
+ *
+ *     This procedure redraws the contents of a scrollbar window.
+ *     It is invoked as a do-when-idle handler, so it only runs
+ *     when there's nothing else for the application to do.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information appears on the screen.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DisplayScrollbar(clientData)
+    ClientData clientData;     /* Information about window. */
+{
+    register Scrollbar *scrollPtr = (Scrollbar *) clientData;
+    register Tk_Window tkwin = scrollPtr->tkwin;
+    XPoint points[7];
+    Tk_3DBorder border;
+    int relief, width, fieldLength;
+    Pixmap pixmap;
+
+    if ((scrollPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
+       goto done;
+    }
+
+    if (scrollPtr->vertical) {
+       width = Tk_Width(tkwin) - 2*scrollPtr->offset;
+    } else {
+       width = Tk_Height(tkwin) - 2*scrollPtr->offset;
+    }
+
+    /*
+     * In order to avoid screen flashes, this procedure redraws
+     * the scrollbar in a pixmap, then copies the pixmap to the
+     * screen in a single operation.  This means that there's no
+     * point in time where the on-sreen image has been cleared.
+     */
+
+    pixmap = XCreatePixmap(Tk_Display(tkwin), Tk_WindowId(tkwin),
+           Tk_Width(tkwin), Tk_Height(tkwin),
+           Tk_DefaultDepth(Tk_Screen(tkwin)));
+    Tk_Fill3DRectangle(Tk_Display(tkwin), pixmap, scrollPtr->bgBorder,
+           0, 0, Tk_Width(tkwin), Tk_Height(tkwin),
+           scrollPtr->borderWidth, scrollPtr->relief);
+
+    /*
+     * Draw the top or left arrow.  The coordinates of the polygon
+     * points probably seem odd, but they were carefully chosen with
+     * respect to X's rules for filling polygons.  These point choices
+     * cause the arrows to just fill the narrow dimension of the
+     * scrollbar and be properly centered.
+     */
+
+    if (scrollPtr->mouseField == TOP_ARROW) {
+       border = scrollPtr->activeBorder;
+       relief = scrollPtr->pressField == TOP_ARROW ? TK_RELIEF_SUNKEN
+               : TK_RELIEF_RAISED;
+    } else {
+       border = scrollPtr->fgBorder;
+       relief = TK_RELIEF_RAISED;
+    }
+    if (scrollPtr->vertical) {
+       points[0].x = scrollPtr->offset - 1;
+       points[0].y = scrollPtr->arrowLength + scrollPtr->offset;
+       points[1].x = width + scrollPtr->offset;
+       points[1].y = points[0].y;
+       points[2].x = width/2 + scrollPtr->offset;
+       points[2].y = scrollPtr->offset - 1;
+       Tk_Fill3DPolygon(Tk_Display(tkwin), pixmap, border,
+               points, 3, scrollPtr->borderWidth, relief);
+    } else {
+       points[0].x = scrollPtr->arrowLength + scrollPtr->offset;
+       points[0].y = scrollPtr->offset - 1;
+       points[1].x = scrollPtr->offset;
+       points[1].y = width/2 + scrollPtr->offset;
+       points[2].x = points[0].x;
+       points[2].y = width + scrollPtr->offset;
+       Tk_Fill3DPolygon(Tk_Display(tkwin), pixmap, border,
+               points, 3, scrollPtr->borderWidth, relief);
+    }
+
+    /*
+     * Display the bottom or right arrow.
+     */
+
+    if (scrollPtr->mouseField == BOTTOM_ARROW) {
+       border = scrollPtr->activeBorder;
+       relief = scrollPtr->pressField == BOTTOM_ARROW ? TK_RELIEF_SUNKEN
+               : TK_RELIEF_RAISED;
+    } else {
+       border = scrollPtr->fgBorder;
+       relief = TK_RELIEF_RAISED;
+    }
+    if (scrollPtr->vertical) {
+       points[0].x = scrollPtr->offset;
+       points[0].y = Tk_Height(tkwin) - scrollPtr->arrowLength
+               - scrollPtr->offset;
+       points[1].x = width/2 + scrollPtr->offset;
+       points[1].y = Tk_Height(tkwin) - scrollPtr->offset;
+       points[2].x = width + scrollPtr->offset;
+       points[2].y = points[0].y;
+       Tk_Fill3DPolygon(Tk_Display(tkwin), pixmap, border,
+               points, 3, scrollPtr->borderWidth, relief);
+    } else {
+       points[0].x = Tk_Width(tkwin) - scrollPtr->arrowLength
+               - scrollPtr->offset;
+       points[0].y = scrollPtr->offset - 1;
+       points[1].x = points[0].x;
+       points[1].y = width + scrollPtr->offset;
+       points[2].x = Tk_Width(tkwin) - scrollPtr->offset;
+       points[2].y = width/2 + scrollPtr->offset;
+       Tk_Fill3DPolygon(Tk_Display(tkwin), pixmap, border,
+               points, 3, scrollPtr->borderWidth, relief);
+    }
+
+    /*
+     * Display the slider.
+     */
+
+    if (scrollPtr->mouseField == SLIDER) {
+       border = scrollPtr->activeBorder;
+       relief = scrollPtr->pressField == SLIDER ? TK_RELIEF_SUNKEN
+               : TK_RELIEF_RAISED;
+    } else {
+       border = scrollPtr->fgBorder;
+       relief = TK_RELIEF_RAISED;
+    }
+    fieldLength = (scrollPtr->vertical ? Tk_Height(tkwin) : Tk_Width(tkwin))
+           - 2*(scrollPtr->arrowLength + scrollPtr->offset);
+    if (fieldLength < 0) {
+       fieldLength = 0;
+    }
+    if (scrollPtr->vertical) {
+       Tk_Fill3DRectangle(Tk_Display(tkwin), pixmap, border,
+               1 + scrollPtr->offset, scrollPtr->sliderFirst,
+               width-2, scrollPtr->sliderLast - scrollPtr->sliderFirst,
+               scrollPtr->borderWidth, relief);
+    } else {
+       Tk_Fill3DRectangle(Tk_Display(tkwin), pixmap, border,
+               scrollPtr->sliderFirst, 1 + scrollPtr->offset,
+               scrollPtr->sliderLast - scrollPtr->sliderFirst, width-2,
+               scrollPtr->borderWidth, relief);
+    }
+
+    /*
+     * Copy the information from the off-screen pixmap onto the screen,
+     * then delete the pixmap.
+     */
+
+    XCopyArea(Tk_Display(tkwin), pixmap, Tk_WindowId(tkwin),
+       scrollPtr->copyGC, 0, 0, Tk_Width(tkwin), Tk_Height(tkwin), 0, 0);
+    XFreePixmap(Tk_Display(tkwin), pixmap);
+
+    done:
+    scrollPtr->flags &= ~REDRAW_PENDING;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScrollbarEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher for various
+ *     events on scrollbars.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the window gets deleted, internal structures get
+ *     cleaned up.  When it gets exposed, it is redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ScrollbarEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    XEvent *eventPtr;          /* Information about event. */
+{
+    Scrollbar *scrollPtr = (Scrollbar *) clientData;
+
+    if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {
+       EventuallyRedraw(scrollPtr);
+    } else if (eventPtr->type == DestroyNotify) {
+       Tcl_DeleteCommand(scrollPtr->interp, Tk_PathName(scrollPtr->tkwin));
+       scrollPtr->tkwin = NULL;
+       if (scrollPtr->flags & REDRAW_PENDING) {
+           Tk_CancelIdleCall(DisplayScrollbar, (ClientData) scrollPtr);
+       }
+       Tk_EventuallyFree((ClientData) scrollPtr, DestroyScrollbar);
+    } else if (eventPtr->type == ConfigureNotify) {
+       ComputeScrollbarGeometry(scrollPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ComputeScrollbarGeometry --
+ *
+ *     After changes in a scrollbar's size or configuration, this
+ *     procedure recomputes various geometry information used in
+ *     displaying the scrollbar.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The scrollbar will be displayed differently.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ComputeScrollbarGeometry(scrollPtr)
+    register Scrollbar *scrollPtr;     /* Scrollbar whose geometry may
+                                        * have changed. */
+{
+    int width, fieldLength;
+
+    if (scrollPtr->relief == TK_RELIEF_FLAT) {
+       scrollPtr->offset = 0;
+    } else {
+       scrollPtr->offset = scrollPtr->borderWidth;
+    }
+    width = (scrollPtr->vertical) ? Tk_Width(scrollPtr->tkwin)
+           : Tk_Height(scrollPtr->tkwin);
+    scrollPtr->arrowLength =
+               (((width - 2*scrollPtr->offset)*173) + 100) / 200;
+    fieldLength = (scrollPtr->vertical ? Tk_Height(scrollPtr->tkwin)
+           : Tk_Width(scrollPtr->tkwin))
+           - 2*(scrollPtr->arrowLength + scrollPtr->offset);
+    if (fieldLength < 0) {
+       fieldLength = 0;
+    }
+    if (scrollPtr->totalUnits <= 0) {
+       scrollPtr->sliderFirst = 0;
+       scrollPtr->sliderLast = fieldLength;
+    } else {
+       scrollPtr->sliderFirst = (fieldLength*scrollPtr->firstUnit
+               + scrollPtr->totalUnits/2)/scrollPtr->totalUnits;
+       scrollPtr->sliderLast = (fieldLength*(scrollPtr->lastUnit+1)
+               + scrollPtr->totalUnits/2)/scrollPtr->totalUnits;
+
+       /*
+        * Adjust the slider so that some piece of it is always
+        * displayed in the scrollbar and so that it has at least
+        * a minimal width (so it can be grabbed with the mouse).
+        */
+
+       if (scrollPtr->sliderFirst > (fieldLength - 2*scrollPtr->borderWidth)) {
+           scrollPtr->sliderFirst = fieldLength - 2*scrollPtr->borderWidth;
+       }
+       if (scrollPtr->sliderFirst < 0) {
+           scrollPtr->sliderFirst = 0;
+       }
+       if (scrollPtr->sliderLast < (scrollPtr->sliderFirst
+               + 2*scrollPtr->borderWidth)) {
+           scrollPtr->sliderLast = scrollPtr->sliderFirst
+                   + 2*scrollPtr->borderWidth;
+       }
+       if (scrollPtr->sliderLast > fieldLength) {
+           scrollPtr->sliderLast = fieldLength;
+       }
+    }
+    scrollPtr->sliderFirst += scrollPtr->arrowLength + scrollPtr->offset;
+    scrollPtr->sliderLast += scrollPtr->arrowLength + scrollPtr->offset;
+
+    /*
+     * Register the desired geometry for the window (leave enough space
+     * for the two arrows plus a minimum-size slider, plus border around
+     * the whole window, if any).  Then arrange for the window to be
+     * redisplayed.
+     */
+
+    if (scrollPtr->vertical) {
+       Tk_GeometryRequest(scrollPtr->tkwin,
+               scrollPtr->width + 2*scrollPtr->offset,
+               2*(scrollPtr->arrowLength + scrollPtr->borderWidth
+               + scrollPtr->offset));
+    } else {
+       Tk_GeometryRequest(scrollPtr->tkwin,
+               2*(scrollPtr->arrowLength + scrollPtr->borderWidth
+               + scrollPtr->offset), scrollPtr->width + 2*scrollPtr->offset);
+    }
+    Tk_SetInternalBorder(scrollPtr->tkwin, scrollPtr->borderWidth);
+
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScrollbarPosition --
+ *
+ *     Determine the scrollbar element corresponding to a
+ *     given position.
+ *
+ * Results:
+ *     One of TOP_ARROW, TOP_GAP, etc., indicating which element
+ *     of the scrollbar covers the position given by (x, y).  If
+ *     (x,y) is outside the scrollbar entirely, then OUTSIDE is
+ *     returned.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ScrollbarPosition(scrollPtr, x, y)
+    register Scrollbar *scrollPtr;     /* Scrollbar widget record. */
+    int x, y;                          /* Coordinates within scrollPtr's
+                                        * window. */
+{
+    int length, width, tmp;
+
+    if (scrollPtr->vertical) {
+       length = Tk_Height(scrollPtr->tkwin);
+       width = Tk_Width(scrollPtr->tkwin);
+    } else {
+       tmp = x;
+       x = y;
+       y = tmp;
+       length = Tk_Width(scrollPtr->tkwin);
+       width = Tk_Height(scrollPtr->tkwin);
+    }
+
+    if ((x < 0) || (x > width) || (y < 0)) {
+       return OUTSIDE;
+    }
+
+    /*
+     * All of the calculations in this procedure mirror those in
+     * DisplayScrollbar.  Be sure to keep the two consistent.
+     */
+
+    if (y < (scrollPtr->offset + scrollPtr->arrowLength)) {
+       return TOP_ARROW;
+    }
+    if (y < scrollPtr->sliderFirst) {
+       return TOP_GAP;
+    }
+    if (y < scrollPtr->sliderLast) {
+       return SLIDER;
+    }
+    if (y >= (length - (scrollPtr->arrowLength + scrollPtr->offset))) {
+       return BOTTOM_ARROW;
+    }
+    return BOTTOM_GAP;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScrollbarMouseProc --
+ *
+ *     This procedure is called back by Tk in response to
+ *     mouse events such as window entry, window exit, mouse
+ *     motion, and button presses.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     This procedure implements the "feel" of the scrollbar
+ *     by issuing scrolling commands in response to button presses
+ *     and mouse motion.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ScrollbarMouseProc(clientData, eventPtr)
+    ClientData clientData;             /* Information about window. */
+    register XEvent *eventPtr;         /* Information about event. */
+{
+    register Scrollbar *scrollPtr = (Scrollbar *) clientData;
+
+    Tk_Preserve((ClientData) scrollPtr);
+    if (eventPtr->type == EnterNotify) {
+       if (scrollPtr->pressField == -1) {
+           ScrollbarNewField(scrollPtr,
+                   ScrollbarPosition(scrollPtr, eventPtr->xcrossing.x,
+                   eventPtr->xcrossing.y));
+       }
+    } else if (eventPtr->type == LeaveNotify) {
+       if (scrollPtr->pressField == -1) {
+           ScrollbarNewField(scrollPtr, OUTSIDE);
+       }
+    } else if (eventPtr->type == MotionNotify) {
+       if (scrollPtr->pressField == SLIDER) {
+           int delta, length, newFirst;
+
+           if (scrollPtr->vertical) {
+               delta = eventPtr->xmotion.y - scrollPtr->pressPos;
+               length = Tk_Height(scrollPtr->tkwin)
+                       - 2*(scrollPtr->arrowLength + scrollPtr->offset);
+           } else {
+               delta = eventPtr->xmotion.x - scrollPtr->pressPos;
+               length = Tk_Width(scrollPtr->tkwin)
+                       - 2*(scrollPtr->arrowLength + scrollPtr->offset);
+           }
+
+           /*
+            * Do the division with positive numbers to avoid
+            * differences in negative-number truncation on different
+            * machines.
+            */
+
+           if (delta >= 0) {
+               newFirst = scrollPtr->pressFirstUnit
+                       + ((delta * scrollPtr->totalUnits) + (length/2))
+                       / length;
+           } else {
+               newFirst = scrollPtr->pressFirstUnit
+                       - (((-delta) * scrollPtr->totalUnits) + (length/2))
+                       / length;
+           }
+           ScrollCmd(scrollPtr, newFirst);
+       } else if (scrollPtr->pressField == -1) {
+           ScrollbarNewField(scrollPtr,
+                   ScrollbarPosition(scrollPtr, eventPtr->xmotion.x,
+                   eventPtr->xmotion.y));
+       }
+    } else if ((eventPtr->type == ButtonPress)
+           && (eventPtr->xbutton.state == 0)) {
+       scrollPtr->pressField = scrollPtr->mouseField;
+       if (scrollPtr->pressField != SLIDER) {
+           scrollPtr->autoRepeat = Tk_CreateTimerHandler(
+                   scrollPtr->repeatDelay,
+                   ScrollbarTimerProc, (ClientData) scrollPtr);
+       }
+       if (scrollPtr->vertical) {
+           scrollPtr->pressPos = eventPtr->xbutton.y;
+       } else {
+           scrollPtr->pressPos = eventPtr->xbutton.x;
+       }
+       scrollPtr->pressFirstUnit = scrollPtr->firstUnit;
+       if (scrollPtr->pressFirstUnit <= -scrollPtr->windowUnits) {
+           scrollPtr->pressFirstUnit = 1-scrollPtr->windowUnits;
+       }
+       if (scrollPtr->pressFirstUnit >= scrollPtr->totalUnits) {
+           scrollPtr->pressFirstUnit = scrollPtr->totalUnits-1;
+       }
+       EventuallyRedraw(scrollPtr);
+    } else if (eventPtr->type == ButtonRelease) {
+       if (scrollPtr->pressField == scrollPtr->mouseField) {
+           switch (scrollPtr->pressField) {
+               case TOP_ARROW:
+                   ScrollCmd(scrollPtr, scrollPtr->firstUnit-1);
+                   break;
+               case TOP_GAP:
+                   if (scrollPtr->windowUnits <= 1) {
+                       ScrollCmd(scrollPtr, scrollPtr->firstUnit - 1);
+                   } else {
+                       ScrollCmd(scrollPtr, scrollPtr->firstUnit
+                               - (scrollPtr->windowUnits-1));
+                   }
+                   break;
+               case BOTTOM_GAP: {
+                   if (scrollPtr->windowUnits <= 1) {
+                       ScrollCmd(scrollPtr, scrollPtr->firstUnit + 1);
+                   } else {
+                       ScrollCmd(scrollPtr, scrollPtr->firstUnit
+                               + (scrollPtr->windowUnits-1));
+                   }
+                   break;
+               }
+               case BOTTOM_ARROW:
+                   ScrollCmd(scrollPtr, scrollPtr->firstUnit+1);
+                   break;
+           }
+       }
+       if (scrollPtr->autoRepeat != NULL) {
+           Tk_DeleteTimerHandler(scrollPtr->autoRepeat);
+           scrollPtr->autoRepeat = NULL;
+       }
+       EventuallyRedraw(scrollPtr);
+       scrollPtr->pressField = -1;
+       ScrollbarNewField(scrollPtr,
+               ScrollbarPosition(scrollPtr, eventPtr->xbutton.x,
+               eventPtr->xbutton.y));
+    }
+    Tk_Release((ClientData) scrollPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScrollCmd --
+ *
+ *     This procedure takes care of invoking a scrolling Tcl
+ *     command and reporting any error that occurs in it.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A Tcl command is invoked, and an additional error-processing
+ *     command may also be invoked.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ScrollCmd(scrollPtr, unit)
+    register Scrollbar *scrollPtr;     /* Scrollbar from which to issue
+                                        * command. */
+    int unit;                          /* Unit position within thing being
+                                        * being displayed that should appear
+                                        * at top or right of screen. */
+{
+    char string[20];
+    int result;
+
+    if ((unit == scrollPtr->firstUnit) || (scrollPtr->command == NULL)) {
+       return;
+    }
+    sprintf(string, " %d", unit);
+    result = Tcl_VarEval(scrollPtr->interp, scrollPtr->command, string,
+           (char *) NULL);
+    if (result != TCL_OK) {
+       TkBindError(scrollPtr->interp);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * EventuallyRedraw --
+ *
+ *     Arrange for one or more of the fields of a scrollbar
+ *     to be redrawn.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+EventuallyRedraw(scrollPtr)
+    register Scrollbar *scrollPtr;     /* Information about widget. */
+{
+    if ((scrollPtr->tkwin == NULL) || (!Tk_IsMapped(scrollPtr->tkwin))) {
+       return;
+    }
+    if ((scrollPtr->flags & REDRAW_PENDING) == 0) {
+       Tk_DoWhenIdle(DisplayScrollbar, (ClientData) scrollPtr);
+       scrollPtr->flags |= REDRAW_PENDING;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScrollbarNewField --
+ *
+ *     This procedure is called to declare that the mouse is in
+ *     a particular field of the scrollbar (e.g. top arrow), so
+ *     that the field can be highlighed and the previous field
+ *     can be returned to normal display.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Fields may be redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ScrollbarNewField(scrollPtr, field)
+    register Scrollbar *scrollPtr;     /* Information about widget. */
+    int field;                         /* Identifies field under mouse,
+                                        * e.g. TOP_ARROW. */
+{
+    if (field == scrollPtr->mouseField) {
+       return;
+    }
+    EventuallyRedraw(scrollPtr);
+    scrollPtr->mouseField = field;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ScrollbarTimerProc --
+ *
+ *     This procedure is invoked as a Tk timer handler for actions
+ *     that auto-repeat (mouse presses in an arrow or gap).  It
+ *     performs the auto-repeat action.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Whatever action corresponds to the current mouse button
+ *     is repeated, and this procedure is rescheduled to execute
+ *     again later.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+ScrollbarTimerProc(clientData)
+    ClientData clientData;     /* Information about widget. */
+{
+    register Scrollbar *scrollPtr = (Scrollbar *) clientData;
+
+    Tk_Preserve((ClientData) scrollPtr);
+    switch(scrollPtr->pressField) {
+       case TOP_ARROW:
+           ScrollCmd(scrollPtr, scrollPtr->firstUnit-1);
+           break;
+       case TOP_GAP:
+           ScrollCmd(scrollPtr, scrollPtr->firstUnit
+                   - (scrollPtr->windowUnits-1));
+           break;
+       case BOTTOM_GAP: {
+           ScrollCmd(scrollPtr, scrollPtr->firstUnit
+                   + (scrollPtr->windowUnits-1));
+           break;
+       }
+       case BOTTOM_ARROW:
+           ScrollCmd(scrollPtr, scrollPtr->firstUnit+1);
+           break;
+    }
+    if (scrollPtr->tkwin != NULL) {
+       scrollPtr->autoRepeat = Tk_CreateTimerHandler(
+               scrollPtr->repeatInterval, ScrollbarTimerProc,
+               (ClientData) scrollPtr);
+    }
+    Tk_Release((ClientData) scrollPtr);
+}
diff --git a/src/tk/tkselect.c b/src/tk/tkselect.c
new file mode 100644 (file)
index 0000000..f832140
--- /dev/null
@@ -0,0 +1,1889 @@
+/* 
+ * tkSelect.c --
+ *
+ *     This file manages the selection for the Tk toolkit,
+ *     translating between the standard X ICCCM conventions
+ *     and Tcl commands.
+ *
+ * Copyright 1990 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkSelect.c,v 1.27 92/08/10 15:03:03 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tkint.h"
+
+/*
+ * When the selection is being retrieved, one of the following
+ * structures is present on a list of pending selection retrievals.
+ * The structure is used to communicate between the background
+ * procedure that requests the selection and the foreground
+ * event handler that processes the events in which the selection
+ * is returned.  There is a list of such structures so that there
+ * can be multiple simultaneous selection retrievals (e.g. on
+ * different displays).
+ */
+
+typedef struct RetrievalInfo {
+    Tcl_Interp *interp;                /* Interpreter for error reporting. */
+    TkWindow *winPtr;          /* Window used as requestor for
+                                * selection. */
+    Atom property;             /* Property where selection will appear. */
+    Atom target;               /* Desired form for selection. */
+    int (*proc) _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp,
+       char *portion));        /* Procedure to call to handle pieces
+                                * of selection. */
+    ClientData clientData;     /* Argument for proc. */
+    int result;                        /* Initially -1.  Set to a Tcl
+                                * return value once the selection
+                                * has been retrieved. */
+    Tk_TimerToken timeout;     /* Token for current timeout procedure. */
+    int idleTime;              /* Number of seconds that have gone by
+                                * without hearing anything from the
+                                * selection owner. */
+    struct RetrievalInfo *nextPtr;
+                               /* Next in list of all pending
+                                * selection retrievals.  NULL means
+                                * end of list. */
+} RetrievalInfo;
+
+static RetrievalInfo *pendingRetrievals = NULL;
+                               /* List of all retrievals currently
+                                * being waited for. */
+
+/*
+ * When "selection get" is being used to retrieve the selection,
+ * the following data structure is used for communication between
+ * Tk_SelectionCmd and SelGetProc.  Its purpose is to keep track
+ * of the selection contents, which are gradually assembled in a
+ * string.
+ */
+
+typedef struct {
+    char *string;              /* Contents of selection are
+                                * here.  This space is malloc-ed. */
+    int bytesAvl;              /* Total number of bytes available
+                                * at string. */
+    int bytesUsed;             /* Bytes currently in use in string,
+                                * not including the terminating
+                                * NULL. */
+} GetInfo;
+
+/*
+ * When handling INCR-style selection retrievals, the selection owner
+ * uses the following data structure to communicate between the
+ * ConvertSelection procedure and TkSelPropProc.
+ */
+
+typedef struct IncrInfo {
+    TkWindow *winPtr;          /* Window that owns selection. */
+    Atom *multAtoms;           /* Information about conversions to
+                                * perform:  one or more pairs of
+                                * (target, property).  This either
+                                * points to a retrieved  property (for
+                                * MULTIPLE retrievals) or to a static
+                                * array. */
+    unsigned long numConversions;
+                               /* Number of entries in offsets (same as
+                                * # of pairs in multAtoms). */
+    int *offsets;              /* One entry for each pair in
+                                * multAtoms;  -1 means all data has
+                                * been transferred for this
+                                * conversion.  -2 means only the
+                                * final zero-length transfer still
+                                * has to be done.  Otherwise it is the
+                                * offset of the next chunk of data
+                                * to transfer.  This array is malloc-ed. */
+    int numIncrs;              /* Number of entries in offsets that
+                                * aren't -1 (i.e. # of INCR-mode transfers
+                                * not yet completed). */
+    Tk_TimerToken timeout;     /* Token for timer procedure. */
+    int idleTime;              /* Number of seconds since we heard
+                                * anything from the selection
+                                * requestor. */
+    Window reqWindow;          /* Requestor's window id. */
+    Time time;                 /* Timestamp corresponding to
+                                * selection at beginning of request;
+                                * used to abort transfer if selection
+                                * changes. */
+    struct IncrInfo *nextPtr;  /* Next in list of all INCR-style
+                                * retrievals currently pending. */
+} IncrInfo;
+
+static IncrInfo *pendingIncrs = NULL;
+                               /* List of all IncrInfo structures
+                                * currently active. */
+
+/*
+ * When a selection handler is set up by invoking "selection handle",
+ * one of the following data structures is set up to hold information
+ * about the command to invoke and its interpreter.
+ */
+
+typedef struct {
+    Tcl_Interp *interp;                /* Interpreter in which to invoke command. */
+    int cmdLength;             /* # of non-NULL bytes in command. */
+    char command[4];           /* Command to invoke.  Actual space is
+                                * allocated as large as necessary.  This
+                                * must be the last entry in the structure. */
+} CommandInfo;
+
+/*
+ * Chunk size for retrieving selection.  It's defined both in
+ * words and in bytes;  the word size is used to allocate
+ * buffer space that's guaranteed to be word-aligned and that
+ * has an extra character for the terminating NULL.
+ */
+
+#define TK_SEL_BYTES_AT_ONCE 4000
+#define TK_SEL_WORDS_AT_ONCE 1001
+
+/*
+ * Largest property that we'll accept when sending or receiving the
+ * selection:
+ */
+
+#define MAX_PROP_WORDS 100000
+
+/*
+ * Forward declarations for procedures defined in this file:
+ */
+
+static void            ConvertSelection _ANSI_ARGS_((TkWindow *winPtr,
+                           XSelectionRequestEvent *eventPtr));
+static int             DefaultSelection _ANSI_ARGS_((TkWindow *winPtr,
+                           Atom target, char *buffer, int maxBytes,
+                           Atom *typePtr));
+static int             HandleTclCommand _ANSI_ARGS_((ClientData clientData,
+                           int offset, char *buffer, int maxBytes));
+static void            IncrTimeoutProc _ANSI_ARGS_((ClientData clientData));
+static char *          SelCvtFromX _ANSI_ARGS_((long *propPtr, int numValues,
+                           Atom type, Tk_Window tkwin));
+static long *          SelCvtToX _ANSI_ARGS_((char *string, Atom type,
+                           Tk_Window tkwin, int *numLongsPtr));
+static int             SelGetProc _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, char *portion));
+static void            SelInit _ANSI_ARGS_((Tk_Window tkwin));
+static void            SelRcvIncrProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static void            SelTimeoutProc _ANSI_ARGS_((ClientData clientData));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_CreateSelHandler --
+ *
+ *     This procedure is called to register a procedure
+ *     as the handler for selection requests of a particular
+ *     target type on a particular window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     In the future, whenever the selection is in tkwin's
+ *     window and someone requests the selection in the
+ *     form given by target, proc will be invoked to provide
+ *     part or all of the selection in the given form.  If
+ *     there was already a handler declared for the given
+ *     window and target type, then it is replaced.  Proc
+ *     should have the following form:
+ *
+ *     int
+ *     proc(clientData, offset, buffer, maxBytes)
+ *         ClientData clientData;
+ *         int offset;
+ *         char *buffer;
+ *         int maxBytes;
+ *     {
+ *     }
+ *
+ *     The clientData argument to proc will be the same as
+ *     the clientData argument to this procedure.  The offset
+ *     argument indicates which portion of the selection to
+ *     return:  skip the first offset bytes.  Buffer is a
+ *     pointer to an area in which to place the converted
+ *     selection, and maxBytes gives the number of bytes
+ *     available at buffer.  Proc should place the selection
+ *     in buffer as a string, and return a count of the number
+ *     of bytes of selection actually placed in buffer (not
+ *     including the terminating NULL character).  If the
+ *     return value equals maxBytes, this is a sign that there
+ *     is probably still more selection information available.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_CreateSelHandler(tkwin, target, proc, clientData, format)
+    Tk_Window tkwin;           /* Token for window. */
+    Atom target;               /* The kind of selection conversions
+                                * that can be handled by proc,
+                                * e.g. TARGETS or XA_STRING. */
+    Tk_SelectionProc *proc;    /* Procedure to invoke to convert
+                                * selection to type "target". */
+    ClientData clientData;     /* Value to pass to proc. */
+    Atom format;               /* Format in which the selection
+                                * information should be returned to
+                                * the requestor. XA_STRING is best by
+                                * far, but anything listed in the ICCCM
+                                * will be tolerated (blech). */
+{
+    register TkSelHandler *selPtr;
+    TkWindow *winPtr = (TkWindow *) tkwin;
+
+    if (winPtr->dispPtr->multipleAtom == None) {
+       SelInit(tkwin);
+    }
+
+    /*
+     * See if there's already a handler for this target on
+     * this window.  If so, re-use it.  If not, create a new one.
+     */
+
+    for (selPtr = winPtr->selHandlerList; ; selPtr = selPtr->nextPtr) {
+       if (selPtr == NULL) {
+           selPtr = (TkSelHandler *) ckalloc(sizeof(TkSelHandler));
+           selPtr->nextPtr = winPtr->selHandlerList;
+           winPtr->selHandlerList = selPtr;
+           break;
+       }
+       if (selPtr->target == target) {
+
+           /*
+            * Special case:  when replacing handler created by
+            * "selection handle" free up memory.  Should there be a
+            * callback to allow other clients to do this too?
+            */
+
+           if (selPtr->proc == HandleTclCommand) {
+               ckfree((char *) selPtr->clientData);
+           }
+           break;
+       }
+    }
+    selPtr->target = target;
+    selPtr->format = format;
+    selPtr->proc = proc;
+    selPtr->clientData = clientData;
+    if (format == XA_STRING) {
+       selPtr->size = 8;
+    } else {
+       selPtr->size = 32;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_OwnSelection --
+ *
+ *     Arrange for tkwin to become the selection owner.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     From now on, requests for the selection will be
+ *     directed to procedures associated with tkwin (they
+ *     must have been declared with calls to Tk_CreateSelHandler).
+ *     When the selection is lost by this window, proc will
+ *     be invoked (see the manual entry for details).
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_OwnSelection(tkwin, proc, clientData)
+    Tk_Window tkwin;           /* Window to become new selection
+                                * owner. */
+    Tk_LostSelProc *proc;      /* Procedure to call when selection
+                                * is taken away from tkwin. */
+    ClientData clientData;     /* Arbitrary one-word argument to
+                                * pass to proc. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+    TkDisplay *dispPtr = winPtr->dispPtr;
+
+    if (dispPtr->multipleAtom == None) {
+       SelInit(tkwin);
+    }
+
+    winPtr->selClearProc = proc;
+    winPtr->selClearData = clientData;
+    if (dispPtr->selectionOwner != tkwin) {
+       TkWindow *ownerPtr = (TkWindow *) dispPtr->selectionOwner;
+
+       if ((ownerPtr != NULL)
+               && (ownerPtr->selClearProc != NULL)) {
+           (*ownerPtr->selClearProc)(ownerPtr->selClearData);
+           ownerPtr->selClearProc = NULL;
+       }
+    }
+    dispPtr->selectionOwner = tkwin;
+    dispPtr->selectionSerial = NextRequest(winPtr->display);
+    dispPtr->selectionTime = TkCurrentTime(dispPtr);
+    XSetSelectionOwner(winPtr->display, XA_PRIMARY, winPtr->window,
+           dispPtr->selectionTime);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_GetSelection --
+ *
+ *     Retrieve the selection and pass it off (in pieces,
+ *     possibly) to a given procedure.
+ *
+ * Results:
+ *     The return value is a standard Tcl return value.
+ *     If an error occurs (such as no selection exists)
+ *     then an error message is left in interp->result.
+ *
+ * Side effects:
+ *     The standard X11 protocols are used to retrieve the
+ *     selection.  When it arrives, it is passed to proc.  If
+ *     the selection is very large, it will be passed to proc
+ *     in several pieces.  Proc should have the following
+ *     structure:
+ *
+ *     int
+ *     proc(clientData, interp, portion)
+ *         ClientData clientData;
+ *         Tcl_Interp *interp;
+ *         char *portion;
+ *     {
+ *     }
+ *
+ *     The interp and clientData arguments to proc will be the
+ *     same as the corresponding arguments to Tk_GetSelection.
+ *     The portion argument points to a character string
+ *     containing part of the selection, and numBytes indicates
+ *     the length of the portion, not including the terminating
+ *     NULL character.  If the selection arrives in several pieces,
+ *     the "portion" arguments in separate calls will contain
+ *     successive parts of the selection.  Proc should normally
+ *     return TCL_OK.  If it detects an error then it should return
+ *     TCL_ERROR and leave an error message in interp->result; the
+ *     remainder of the selection retrieval will be aborted.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_GetSelection(interp, tkwin, target, proc, clientData)
+    Tcl_Interp *interp;                /* Interpreter to use for reporting
+                                * errors. */
+    Tk_Window tkwin;           /* Window on whose behalf to retrieve
+                                * the selection (determines display
+                                * from which to retrieve). */
+    Atom target;               /* Desired form in which selection
+                                * is to be returned. */
+    Tk_GetSelProc *proc;       /* Procedure to call to process the
+                                * selection, once it has been retrieved. */
+    ClientData clientData;     /* Arbitrary value to pass to proc. */
+{
+    RetrievalInfo retr;
+    TkWindow *winPtr = (TkWindow *) tkwin;
+    TkDisplay *dispPtr = winPtr->dispPtr;
+
+    if (dispPtr->multipleAtom == None) {
+       SelInit(tkwin);
+    }
+
+    /*
+     * If the selection is owned by a window managed by this
+     * process, then call the retrieval procedure directly,
+     * rather than going through the X server (it's dangerous
+     * to go through the X server in this case because it could
+     * result in deadlock if an INCR-style selection results).
+     */
+
+    if (dispPtr->selectionOwner != NULL) {
+       register TkSelHandler *selPtr;
+       int offset, result, count;
+       char buffer[TK_SEL_BYTES_AT_ONCE+1];
+       Time time;
+
+       /*
+        * Make sure that the selection predates the request
+        * time.
+        */
+
+       time = TkCurrentTime(dispPtr);
+       if ((time < dispPtr->selectionTime)
+               && (time != CurrentTime)
+               && (dispPtr->selectionTime != CurrentTime)) {
+           interp->result = "selection changed before it could be retrieved";
+           return TCL_ERROR;
+       }
+
+       for (selPtr = ((TkWindow *) dispPtr->selectionOwner)->selHandlerList;
+               ; selPtr = selPtr->nextPtr) {
+           if (selPtr == NULL) {
+               Atom type;
+
+               count = DefaultSelection((TkWindow *) dispPtr->selectionOwner,
+                       target, buffer, TK_SEL_BYTES_AT_ONCE, &type);
+               if (count > TK_SEL_BYTES_AT_ONCE) {
+                   panic("selection handler returned too many bytes");
+               }
+               if (count < 0) {
+                   cantget:
+                   Tcl_AppendResult(interp, "selection doesn't exist",
+                           " or form \"", Tk_GetAtomName(tkwin, target),
+                           "\" not defined", (char *) NULL);
+                   return TCL_ERROR;
+               }
+               buffer[count] = 0;
+               return (*proc)(clientData, interp, buffer);
+           }
+           if (selPtr->target == target) {
+               break;
+           }
+       }
+       offset = 0;
+       while (1) {
+           count = (*selPtr->proc)(selPtr->clientData, offset,
+               buffer, TK_SEL_BYTES_AT_ONCE);
+           if (count < 0) {
+               goto cantget;
+           }
+           if (count > TK_SEL_BYTES_AT_ONCE) {
+               panic("selection handler returned too many bytes");
+           }
+           buffer[count] = '\0';
+           result = (*proc)(clientData, interp, buffer);
+           if (result != TCL_OK) {
+               return result;
+           }
+           if (count < TK_SEL_BYTES_AT_ONCE) {
+               return TCL_OK;
+           }
+           offset += count;
+       }
+    }
+
+    /*
+     * The selection is owned by some other process.  To
+     * retrieve it, first record information about the retrieval
+     * in progress.  Also, try to use a non-top-level window
+     * as the requestor (property changes on this window may
+     * be monitored by a window manager, which will waste time).
+     */
+
+    retr.interp = interp;
+    if ((winPtr->flags & TK_TOP_LEVEL)
+           && (winPtr->childList != NULL)) {
+       winPtr = winPtr->childList;
+    }
+    retr.winPtr = winPtr;
+    retr.property = XA_PRIMARY;
+    retr.target = target;
+    retr.proc = proc;
+    retr.clientData = clientData;
+    retr.result = -1;
+    retr.idleTime = 0;
+    retr.nextPtr = pendingRetrievals;
+    pendingRetrievals = &retr;
+
+    /*
+     * Initiate the request for the selection.
+     */
+
+    XConvertSelection(winPtr->display, XA_PRIMARY, target,
+           retr.property, winPtr->window, TkCurrentTime(dispPtr));
+
+    /*
+     * Enter a loop processing X events until the selection
+     * has been retrieved and processed.  If no response is
+     * received within a few seconds, then timeout.
+     */
+
+    retr.timeout = Tk_CreateTimerHandler(1000, SelTimeoutProc,
+           (ClientData) &retr);
+    while (retr.result == -1) {
+       Tk_DoOneEvent(0);
+    }
+    Tk_DeleteTimerHandler(retr.timeout);
+
+    /*
+     * Unregister the information about the selection retrieval
+     * in progress.
+     */
+
+    if (pendingRetrievals == &retr) {
+       pendingRetrievals = retr.nextPtr;
+    } else {
+       RetrievalInfo *retrPtr;
+
+       for (retrPtr = pendingRetrievals; retrPtr != NULL;
+               retrPtr = retrPtr->nextPtr) {
+           if (retrPtr->nextPtr == &retr) {
+               retrPtr->nextPtr = retr.nextPtr;
+               break;
+           }
+       }
+    }
+    return retr.result;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_SelectionCmd --
+ *
+ *     This procedure is invoked to process the "selection" Tcl
+ *     command.  See the user documentation for details on what
+ *     it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_SelectionCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    int length;
+    char *cmd = argv[0];
+    char c;
+
+    if (argc < 2) {
+       sprintf(interp->result,
+               "wrong # args: should be \"%.50s [-window win] option ?arg arg ...?\"",
+               cmd);
+       return TCL_ERROR;
+    }
+
+    argc--; argv++;
+    c = argv[0][0];
+    length = strlen(argv[0]);
+
+    if ((c == '-') && (strncmp(argv[0], "-window", length) == 0)) {
+      if ((argc < 2) ||
+         ((tkwin = Tk_NameToWindow(interp, argv[1], tkwin)) == NULL)) {
+           sprintf(interp->result, "bad arg to %s -window", cmd);
+           return TCL_ERROR;
+      }
+      argc -= 2; argv += 2;
+
+      if (argc == 0) {
+       sprintf(interp->result, "not enough args to %s", cmd);
+       return TCL_ERROR;
+      }
+
+      c = argv[0][0];
+      length = strlen(argv[0]);
+    }
+
+    if ((c == 'g') && (strncmp(argv[0], "get", length) == 0)) {
+       Atom target;
+       GetInfo getInfo;
+       int result;
+
+       argc--; argv++;
+
+       if (argc > 1) {
+           sprintf(interp->result,
+                   "too may args: should be \"%.50s get ?type?\"",
+                   cmd);
+           return TCL_ERROR;
+       }
+       if (argc == 1) {
+           target = Tk_InternAtom(tkwin, argv[0]);
+       } else {
+           target = XA_STRING;
+       }
+       getInfo.string = (char *) ckalloc(100);
+       getInfo.bytesAvl = 100;
+       getInfo.bytesUsed = 0;
+       result = Tk_GetSelection(interp, tkwin, target, SelGetProc,
+               (ClientData) &getInfo);
+       if (result == TCL_OK) {
+           Tcl_SetResult(interp, getInfo.string, TCL_DYNAMIC);
+       } else {
+           ckfree(getInfo.string);
+       }
+       return result;
+    } else if ((c == 'h') && (strncmp(argv[0], "handle", length) == 0)) {
+       Tk_Window window;
+       Atom target, format;
+       register CommandInfo *cmdInfoPtr;
+       int cmdLength;
+
+       argc--; argv++;
+
+       if ((argc < 2) || (argc > 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"", cmd,
+                   " handle window command ?type? ?format?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       window = Tk_NameToWindow(interp, argv[0], tkwin);
+       if (window == NULL) {
+           return TCL_ERROR;
+       }
+       if (argc > 2) {
+           target = Tk_InternAtom(window, argv[2]);
+       } else {
+           target = XA_STRING;
+       }
+       if (argc > 3) {
+           format = Tk_InternAtom(window, argv[3]);
+       } else {
+           format = XA_STRING;
+       }
+       cmdLength = strlen(argv[1]);
+       cmdInfoPtr = (CommandInfo *) ckalloc((unsigned) (sizeof(CommandInfo)
+               + cmdLength));
+       cmdInfoPtr->interp = interp;
+       cmdInfoPtr->cmdLength = cmdLength;
+       strcpy(cmdInfoPtr->command, argv[1]);
+       Tk_CreateSelHandler(window, target, HandleTclCommand,
+               (ClientData) cmdInfoPtr, format);
+       return TCL_OK;
+    } else {
+       sprintf(interp->result,
+               "bad option to \"%.50s\":  must be get or handle",
+               cmd);
+       return TCL_ERROR;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkSelDeadWindow --
+ *
+ *     This procedure is invoked just before a TkWindow is deleted.
+ *     It performs selection-related cleanup.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Frees up memory associated with the selection.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkSelDeadWindow(winPtr)
+    register TkWindow *winPtr; /* Window that's being deleted. */
+{
+    register TkSelHandler *selPtr;
+
+    while (1) {
+       selPtr = winPtr->selHandlerList;
+       if (selPtr == NULL) {
+           break;
+       }
+       winPtr->selHandlerList = selPtr->nextPtr;
+       ckfree((char *) selPtr);
+    }
+    winPtr->selClearProc = NULL;
+
+    if (winPtr->dispPtr->selectionOwner == (Tk_Window) winPtr) {
+       winPtr->dispPtr->selectionOwner = NULL;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * SelInit --
+ *
+ *     Initialize selection-related information for a display.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     .
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+SelInit(tkwin)
+    Tk_Window tkwin;           /* Window token (used to find
+                                * display to initialize). */
+{
+    register TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr;
+
+    /*
+     * Fetch commonly-used atoms.
+     */
+
+    dispPtr->multipleAtom = Tk_InternAtom(tkwin, "MULTIPLE");
+    dispPtr->incrAtom = Tk_InternAtom(tkwin, "INCR");
+    dispPtr->targetsAtom = Tk_InternAtom(tkwin, "TARGETS");
+    dispPtr->timestampAtom = Tk_InternAtom(tkwin, "TIMESTAMP");
+    dispPtr->textAtom = Tk_InternAtom(tkwin, "TEXT");
+    dispPtr->compoundTextAtom = Tk_InternAtom(tkwin, "COMPOUND_TEXT");
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkSelEventProc --
+ *
+ *     This procedure is invoked whenever a selection-related
+ *     event occurs.  It does the lion's share of the work
+ *     in implementing the selection protocol.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Lots:  depends on the type of event.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkSelEventProc(tkwin, eventPtr)
+    Tk_Window tkwin;           /* Window for which event was
+                                * targeted. */
+    register XEvent *eventPtr; /* X event:  either SelectionClear,
+                                * SelectionRequest, or
+                                * SelectionNotify. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    /*
+     * Case #1: SelectionClear events.  Invoke clear procedure
+     * for window that just lost the selection.  This code is a
+     * bit tricky, because any callbacks to due selection changes
+     * between windows managed by the process have already been
+     * made.  Thus, ignore the event unless it refers to the
+     * window that's currently the selection owner and the event
+     * was generated after the server saw the SetSelectionOwner
+     * request.
+     */
+
+    if (eventPtr->type == SelectionClear) {
+       if ((eventPtr->xselectionclear.selection == XA_PRIMARY)
+               && (winPtr->dispPtr->selectionOwner == tkwin)
+               && (eventPtr->xselectionclear.serial
+                       >= winPtr->dispPtr->selectionSerial)
+               && (winPtr->selClearProc != NULL)) {
+           (*winPtr->selClearProc)(winPtr->selClearData);
+           winPtr->selClearProc = NULL;
+           winPtr->dispPtr->selectionOwner = NULL;
+       }
+       return;
+    }
+
+    /*
+     * Case #2: SelectionNotify events.  Call the relevant procedure
+     * to handle the incoming selection.
+     */
+
+    if (eventPtr->type == SelectionNotify) {
+       register RetrievalInfo *retrPtr;
+       char *propInfo;
+       Atom type;
+       int format, result;
+       unsigned long numItems, bytesAfter;
+
+       for (retrPtr = pendingRetrievals; ; retrPtr = retrPtr->nextPtr) {
+           if (retrPtr == NULL) {
+               return;
+           }
+           if ((retrPtr->winPtr == winPtr)
+                   && (eventPtr->xselection.selection == XA_PRIMARY)
+                   && (retrPtr->target == eventPtr->xselection.target)
+                   && (retrPtr->result == -1)) {
+               if (retrPtr->property == eventPtr->xselection.property) {
+                   break;
+               }
+               if (eventPtr->xselection.property == None) {
+                   Tcl_SetResult(retrPtr->interp, (char *) NULL, TCL_STATIC);
+                   Tcl_AppendResult(retrPtr->interp,
+                           "selection doesn't exist or form \"",
+                           Tk_GetAtomName(tkwin, retrPtr->target),
+                           "\" not defined", (char *) NULL);
+                   retrPtr->result = TCL_ERROR;
+                   return;
+               }
+           }
+       }
+
+       propInfo = NULL;
+       result = XGetWindowProperty(eventPtr->xselection.display,
+               eventPtr->xselection.requestor, retrPtr->property,
+               0, MAX_PROP_WORDS, False, (Atom) AnyPropertyType,
+               &type, &format, &numItems, &bytesAfter,
+               (unsigned char **) &propInfo);
+       if ((result != Success) || (type == None)) {
+           return;
+       }
+       if (bytesAfter != 0) {
+           Tcl_SetResult(retrPtr->interp, "selection property too large",
+               TCL_STATIC);
+           retrPtr->result = TCL_ERROR;
+           XFree(propInfo);
+           return;
+       }
+       if ((type == XA_STRING) || (type == winPtr->dispPtr->textAtom)
+               || (type == winPtr->dispPtr->compoundTextAtom)) {
+           if (format != 8) {
+               sprintf(retrPtr->interp->result,
+                   "bad format for string selection: wanted \"8\", got \"%d\"",
+                   format);
+               retrPtr->result = TCL_ERROR;
+               return;
+           }
+           retrPtr->result = (*retrPtr->proc)(retrPtr->clientData,
+                   retrPtr->interp, propInfo);
+       } else if (type == winPtr->dispPtr->incrAtom) {
+
+           /*
+            * It's a !?#@!?!! INCR-style reception.  Arrange to receive
+            * the selection in pieces, using the ICCCM protocol, then
+            * hang around until either the selection is all here or a
+            * timeout occurs.
+            */
+
+           retrPtr->idleTime = 0;
+           Tk_CreateEventHandler(tkwin, PropertyChangeMask, SelRcvIncrProc,
+                   (ClientData) retrPtr);
+           XDeleteProperty(Tk_Display(tkwin), Tk_WindowId(tkwin),
+                   retrPtr->property);
+           while (retrPtr->result == -1) {
+               Tk_DoOneEvent(0);
+           }
+           Tk_DeleteEventHandler(tkwin, PropertyChangeMask, SelRcvIncrProc,
+                   (ClientData) retrPtr);
+       } else {
+           char *string;
+
+           if (format != 32) {
+               sprintf(retrPtr->interp->result,
+                   "bad format for selection: wanted \"32\", got \"%d\"",
+                   format);
+               retrPtr->result = TCL_ERROR;
+               return;
+           }
+           string = SelCvtFromX((long *) propInfo, (int) numItems, type,
+                   (Tk_Window) winPtr);
+           retrPtr->result = (*retrPtr->proc)(retrPtr->clientData,
+                   retrPtr->interp, string);
+           ckfree(string);
+       }
+       XFree(propInfo);
+       return;
+    }
+
+    /*
+     * Case #3: SelectionRequest events.  Call ConvertSelection to
+     * do the dirty work.
+     */
+
+    if ((eventPtr->type == SelectionRequest)
+           && (eventPtr->xselectionrequest.selection == XA_PRIMARY)) {
+       ConvertSelection(winPtr, &eventPtr->xselectionrequest);
+       return;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * SelGetProc --
+ *
+ *     This procedure is invoked to process pieces of the
+ *     selection as they arrive during "selection get"
+ *     commands.
+ *
+ * Results:
+ *     Always returns TCL_OK.
+ *
+ * Side effects:
+ *     Bytes get appended to the result currently stored
+ *     in interp->result, and its memory area gets
+ *     expanded if necessary.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static int
+SelGetProc(clientData, interp, portion)
+    ClientData clientData;     /* Information about partially-
+                                * assembled result. */
+    Tcl_Interp *interp;                /* Interpreter used for error
+                                * reporting (not used). */
+    char *portion;             /* New information to be appended. */
+{
+    register GetInfo *getInfoPtr = (GetInfo *) clientData;
+    int newLength;
+
+    newLength = strlen(portion) + getInfoPtr->bytesUsed;
+
+    /*
+     * Grow the result area if we've run out of space.
+     */
+
+    if (newLength >= getInfoPtr->bytesAvl) {
+       char *newString;
+
+       getInfoPtr->bytesAvl *= 2;
+       if (getInfoPtr->bytesAvl <= newLength) {
+           getInfoPtr->bytesAvl = newLength + 1;
+       }
+       newString = (char *) ckalloc((unsigned) getInfoPtr->bytesAvl);
+       memcpy((VOID *) newString, (VOID *) getInfoPtr->string,
+               getInfoPtr->bytesUsed);
+       ckfree(getInfoPtr->string);
+       getInfoPtr->string = newString;
+    }
+
+    /*
+     * Append the new data to what was already there.
+     */
+
+    strcpy(getInfoPtr->string + getInfoPtr->bytesUsed, portion);
+    getInfoPtr->bytesUsed = newLength;
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * SelCvtToX --
+ *
+ *     Given a selection represented as a string (the normal Tcl form),
+ *     convert it to the ICCCM-mandated format for X, depending on
+ *     the type argument.  This procedure and SelCvtFromX are inverses.
+ *
+ * Results:
+ *     The return value is a malloc'ed buffer holding a value
+ *     equivalent to "string", but formatted as for "type".  It is
+ *     the caller's responsibility to free the string when done with
+ *     it.  The word at *numLongsPtr is filled in with the number of
+ *     32-bit words returned in the result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static long *
+SelCvtToX(string, type, tkwin, numLongsPtr)
+    char *string;              /* String representation of selection. */
+    Atom type;                 /* Atom specifying the X format that is
+                                * desired for the selection.  Should not
+                                * be XA_STRING (if so, don't bother calling
+                                * this procedure at all). */
+    Tk_Window tkwin;           /* Window that governs atom conversion. */
+    int *numLongsPtr;          /* Number of 32-bit words contained in the
+                                * result. */
+{
+    register char *p;
+    char *field;
+    int numFields;
+    long *propPtr, *longPtr;
+#define MAX_ATOM_NAME_LENGTH 100
+    char atomName[MAX_ATOM_NAME_LENGTH+1];
+
+    /*
+     * The string is assumed to consist of fields separated by spaces.
+     * The property gets generated by converting each field to an
+     * integer number, in one of two ways:
+     * 1. If type is XA_ATOM, convert each field to its corresponding
+     *   atom.
+     * 2. If type is anything else, convert each field from an ASCII number
+     *    to a 32-bit binary number.
+     */
+
+    numFields = 1;
+    for (p = string; *p != 0; p++) {
+       if (isspace(*p)) {
+           numFields++;
+       }
+    }
+    propPtr = (long *) ckalloc((unsigned) numFields*sizeof(long));
+
+    /*
+     * Convert the fields one-by-one.
+     */
+
+    for (longPtr = propPtr, *numLongsPtr = 0, p = string;
+           ; longPtr++, (*numLongsPtr)++) {
+       while (isspace(*p)) {
+           p++;
+       }
+       if (*p == 0) {
+           break;
+       }
+       field = p;
+       while ((*p != 0) && !isspace(*p)) {
+           p++;
+       }
+       if (type == XA_ATOM) {
+           int length;
+
+           length = p - field;
+           if (length > MAX_ATOM_NAME_LENGTH) {
+               length = MAX_ATOM_NAME_LENGTH;
+           }
+           strncpy(atomName, field, length);
+           atomName[length] = 0;
+           *longPtr = (long) Tk_InternAtom(tkwin, atomName);
+       } else {
+           char *dummy;
+
+           *longPtr = strtol(field, &dummy, 0);
+       }
+    }
+    return propPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * SelCvtFromX --
+ *
+ *     Given an X property value, formatted as a collection of 32-bit
+ *     values according to "type" and the ICCCM conventions, convert
+ *     the value to a string suitable for manipulation by Tcl.  This
+ *     procedure is the inverse of SelCvtToX.
+ *
+ * Results:
+ *     The return value is the string equivalent of "property".  It is
+ *     malloc-ed and should be freed by the caller when no longer
+ *     needed.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static char *
+SelCvtFromX(propPtr, numValues, type, tkwin)
+    register long *propPtr;    /* Property value from X. */
+    int numValues;             /* Number of 32-bit values in property. */
+    Atom type;                 /* Type of property  Should not be
+                                * XA_STRING (if so, don't bother calling
+                                * this procedure at all). */
+    Tk_Window tkwin;           /* Window to use for atom conversion. */
+{
+    char *result;
+    int resultSpace, curSize, fieldSize;
+    char *atomName;
+
+    /*
+     * Convert each long in the property to a string value, which is
+     * either the name of an atom (if type is XA_ATOM) or a hexadecimal
+     * string.  Make an initial guess about the size of the result, but
+     * be prepared to enlarge the result if necessary.
+     */
+
+    resultSpace = 12*numValues;
+    curSize = 0;
+    atomName = "";     /* Not needed, but eliminates compiler warning. */
+    result = (char *) ckalloc((unsigned) resultSpace);
+    for ( ; numValues > 0; propPtr++, numValues--) {
+       if (type == XA_ATOM) {
+           atomName = Tk_GetAtomName(tkwin, (Atom) *propPtr);
+           fieldSize = strlen(atomName) + 1;
+       } else {
+           fieldSize = 12;
+       }
+       if (curSize+fieldSize >= resultSpace) {
+           char *newResult;
+
+           resultSpace *= 2;
+           if (curSize+fieldSize >= resultSpace) {
+               resultSpace = curSize + fieldSize + 1;
+           }
+           newResult = (char *) ckalloc((unsigned) resultSpace);
+           strcpy(newResult, result);
+           ckfree(result);
+           result = newResult;
+       }
+       if (curSize != 0) {
+           result[curSize] = ' ';
+           curSize++;
+       }
+       if (type == XA_ATOM) {
+           strcpy(result+curSize, atomName);
+       } else {
+           sprintf(result+curSize, "%#x", *propPtr);
+       }
+       curSize += strlen(result+curSize);
+    }
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConvertSelection --
+ *
+ *     This procedure is invoked to handle SelectionRequest events.
+ *     It responds to the requests, obeying the ICCCM protocols.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Properties are created for the selection requestor, and a
+ *     SelectionNotify event is generated for the selection
+ *     requestor.  In the event of long selections, this procedure
+ *     implements INCR-mode transfers, using the ICCCM protocol.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ConvertSelection(winPtr, eventPtr)
+    TkWindow *winPtr;                  /* Window that owns selection. */
+    register XSelectionRequestEvent *eventPtr;
+                                       /* Event describing request. */
+{
+    XSelectionEvent reply;             /* Used to notify requestor that
+                                        * selection info is ready. */
+    int multiple;                      /* Non-zero means a MULTIPLE request
+                                        * is being handled. */
+    IncrInfo info;                     /* State of selection conversion. */
+    Atom singleInfo[2];                        /* info.multAtoms points here except
+                                        * for multiple conversions. */
+    int i;
+    Tk_ErrorHandler errorHandler;
+
+    errorHandler = Tk_CreateErrorHandler(eventPtr->display, -1, -1,-1,
+           (int (*)()) NULL, (ClientData) NULL);
+
+    /*
+     * Initialize the reply event.
+     */
+
+    reply.type = SelectionNotify;
+    reply.serial = 0;
+    reply.send_event = True;
+    reply.display = eventPtr->display;
+    reply.requestor = eventPtr->requestor;
+    reply.selection = XA_PRIMARY;
+    reply.target = eventPtr->target;
+    reply.property = eventPtr->property;
+    if (reply.property == None) {
+       reply.property = reply.target;
+    }
+    reply.time = eventPtr->time;
+
+    /*
+     * Watch out for races between conversion requests and
+     * selection ownership changes:  reject the conversion
+     * request if it's for the wrong window or the wrong
+     * time.
+     */
+
+    if ((winPtr->dispPtr->selectionOwner != (Tk_Window) winPtr)
+           || ((eventPtr->time < winPtr->dispPtr->selectionTime)
+           && (eventPtr->time != CurrentTime)
+           && (winPtr->dispPtr->selectionTime != CurrentTime))) {
+       goto refuse;
+    }
+
+    /*
+     * Figure out which kind(s) of conversion to perform.  If handling
+     * a MULTIPLE conversion, then read the property describing which
+     * conversions to perform.
+     */
+
+    info.winPtr = winPtr;
+    if (eventPtr->target != winPtr->dispPtr->multipleAtom) {
+       multiple = 0;
+       singleInfo[0] = reply.target;
+       singleInfo[1] = reply.property;
+       info.multAtoms = singleInfo;
+       info.numConversions = 1;
+    } else {
+       Atom type;
+       int format, result;
+       unsigned long bytesAfter;
+
+       multiple = 1;
+       info.multAtoms = NULL;
+       if (eventPtr->property == None) {
+           goto refuse;
+       }
+       result = XGetWindowProperty(eventPtr->display,
+               eventPtr->requestor, eventPtr->property,
+               0, MAX_PROP_WORDS, False, XA_ATOM,
+               &type, &format, &info.numConversions, &bytesAfter,
+               (unsigned char **) &info.multAtoms);
+       if ((result != Success) || (bytesAfter != 0) || (format != 32)
+               || (type == None)) {
+           if (info.multAtoms != NULL) {
+               XFree((char *) info.multAtoms);
+           }
+           goto refuse;
+       }
+       info.numConversions /= 2;               /* Two atoms per conversion. */
+    }
+
+    /*
+     * Loop through all of the requested conversions, and either return
+     * the entire converted selection, if it can be returned in a single
+     * bunch, or return INCR information only (the actual selection will
+     * be returned below).
+     */
+
+    info.offsets = (int *) ckalloc((unsigned) (info.numConversions*sizeof(int)));
+    info.numIncrs = 0;
+    for (i = 0; i < info.numConversions; i++) {
+       Atom target, property;
+       long buffer[TK_SEL_WORDS_AT_ONCE];
+       register TkSelHandler *selPtr;
+
+       target = info.multAtoms[2*i];
+       property = info.multAtoms[2*i + 1];
+       info.offsets[i] = -1;
+
+       for (selPtr = winPtr->selHandlerList; ; selPtr = selPtr->nextPtr) {
+           int numItems, format;
+           char *propPtr;
+           Atom type;
+
+           if (selPtr == NULL) {
+
+               /*
+                * Nobody seems to know about this kind of request.  If
+                * it's of a sort that we can handle without any help, do
+                * it.  Otherwise mark the request as an errror.
+                */
+
+               numItems = DefaultSelection(winPtr, target, (char *) buffer,
+                       TK_SEL_BYTES_AT_ONCE, &type);
+               if (numItems != 0) {
+                   goto gotStuff;
+               }
+               info.multAtoms[2*i + 1] = None;
+               break;
+           } else if (selPtr->target == target) {
+               numItems = (*selPtr->proc)(selPtr->clientData, 0,
+                       (char *) buffer, TK_SEL_BYTES_AT_ONCE);
+               if (numItems < 0) {
+                   info.multAtoms[2*i + 1] = None;
+                   break;
+               }
+               if (numItems > TK_SEL_BYTES_AT_ONCE) {
+                   panic("selection handler returned too many bytes");
+               }
+               ((char *) buffer)[numItems] = '\0';
+               type = selPtr->format;
+           } else {
+               continue;
+           }
+
+           gotStuff:
+           if (numItems == TK_SEL_BYTES_AT_ONCE) {
+               info.numIncrs++;
+               type = winPtr->dispPtr->incrAtom;
+               buffer[0] = 10; /* Guess at # items avl. */
+               numItems = 1;
+               propPtr = (char *) buffer;
+               format = 32;
+               info.offsets[i] = 0;
+           } else if (type == XA_STRING) {
+               propPtr = (char *) buffer;
+               format = 8;
+           } else {
+               propPtr = (char *) SelCvtToX((char *) buffer,
+                       type, (Tk_Window) winPtr, &numItems);
+               format = 32;
+           }
+           XChangeProperty(reply.display, reply.requestor,
+                   property, type, format, PropModeReplace,
+                   (unsigned char *) propPtr, numItems);
+           if (propPtr != (char *) buffer) {
+               ckfree(propPtr);
+           }
+           break;
+       }
+    }
+
+    /*
+     * Send an event back to the requestor to indicate that the
+     * first stage of conversion is complete (everything is done
+     * except for long conversions that have to be done in INCR
+     * mode).
+     */
+
+    if (info.numIncrs > 0) {
+       XSelectInput(reply.display, reply.requestor, PropertyChangeMask);
+       info.timeout = Tk_CreateTimerHandler(1000, IncrTimeoutProc,
+           (ClientData) &info);
+       info.idleTime = 0;
+       info.reqWindow = reply.requestor;
+       info.time = winPtr->dispPtr->selectionTime;
+       info.nextPtr = pendingIncrs;
+       pendingIncrs = &info;
+    }
+    if (multiple) {
+       XChangeProperty(reply.display, reply.requestor, reply.property,
+               XA_ATOM, 32, PropModeReplace,
+               (unsigned char *) info.multAtoms,
+               (int) info.numConversions*2);
+    } else {
+
+       /*
+        * Not a MULTIPLE request.  The first property in "multAtoms"
+        * got set to None if there was an error in conversion.
+        */
+
+       reply.property = info.multAtoms[1];
+    }
+    XSendEvent(reply.display, reply.requestor, False, 0, (XEvent *) &reply);
+    Tk_DeleteErrorHandler(errorHandler);
+
+    /*
+     * Handle any remaining INCR-mode transfers.  This all happens
+     * in callbacks to TkSelPropProc, so just wait until the number
+     * of uncompleted INCR transfers drops to zero.
+     */
+
+    if (info.numIncrs > 0) {
+       IncrInfo *infoPtr2;
+
+       while (info.numIncrs > 0) {
+           Tk_DoOneEvent(0);
+       }
+       Tk_DeleteTimerHandler(info.timeout);
+       errorHandler = Tk_CreateErrorHandler(winPtr->display,
+               -1, -1,-1, (int (*)()) NULL, (ClientData) NULL);
+       XSelectInput(reply.display, reply.requestor, 0L);
+       Tk_DeleteErrorHandler(errorHandler);
+       if (pendingIncrs == &info) {
+           pendingIncrs = info.nextPtr;
+       } else {
+           for (infoPtr2 = pendingIncrs; infoPtr2 != NULL;
+                   infoPtr2 = infoPtr2->nextPtr) {
+               if (infoPtr2->nextPtr == &info) {
+                   infoPtr2->nextPtr = info.nextPtr;
+                   break;
+               }
+           }
+       }
+    }
+
+    /*
+     * All done.  Cleanup and return.
+     */
+
+    ckfree((char *) info.offsets);
+    if (multiple) {
+       XFree((char *) info.multAtoms);
+    }
+    return;
+
+    /*
+     * An error occurred.  Send back a refusal message.
+     */
+
+    refuse:
+    reply.property = None;
+    XSendEvent(reply.display, reply.requestor, False, 0, (XEvent *) &reply);
+    Tk_DeleteErrorHandler(errorHandler);
+    return;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * SelRcvIncrProc --
+ *
+ *     This procedure handles the INCR protocol on the receiving
+ *     side.  It is invoked in response to property changes on
+ *     the requestor's window (which hopefully are because a new
+ *     chunk of the selection arrived).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If a new piece of selection has arrived, a procedure is
+ *     invoked to deal with that piece.  When the whole selection
+ *     is here, a flag is left for the higher-level procedure that
+ *     initiated the selection retrieval.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+SelRcvIncrProc(clientData, eventPtr)
+    ClientData clientData;             /* Information about retrieval. */
+    register XEvent *eventPtr;         /* X PropertyChange event. */
+{
+    register RetrievalInfo *retrPtr = (RetrievalInfo *) clientData;
+    char *propInfo;
+    Atom type;
+    int format, result;
+    unsigned long numItems, bytesAfter;
+
+    if ((eventPtr->xproperty.atom != retrPtr->property)
+           || (eventPtr->xproperty.state != PropertyNewValue)
+           || (retrPtr->result != -1)) {
+       return;
+    }
+    propInfo = NULL;
+    result = XGetWindowProperty(eventPtr->xproperty.display,
+           eventPtr->xproperty.window, retrPtr->property, 0, MAX_PROP_WORDS,
+           True, (Atom) AnyPropertyType, &type, &format, &numItems,
+           &bytesAfter, (unsigned char **) &propInfo);
+    if ((result != Success) || (type == None)) {
+       return;
+    }
+    if (bytesAfter != 0) {
+       Tcl_SetResult(retrPtr->interp, "selection property too large",
+               TCL_STATIC);
+       retrPtr->result = TCL_ERROR;
+       goto done;
+    }
+    if (numItems == 0) {
+       retrPtr->result = TCL_OK;
+    } else if ((type == XA_STRING)
+           || (type == retrPtr->winPtr->dispPtr->textAtom)
+           || (type == retrPtr->winPtr->dispPtr->compoundTextAtom)) {
+       if (format != 8) {
+           Tcl_SetResult(retrPtr->interp, (char *) NULL, TCL_STATIC);
+           sprintf(retrPtr->interp->result,
+               "bad format for string selection: wanted \"8\", got \"%d\"",
+               format);
+           retrPtr->result = TCL_ERROR;
+           goto done;
+       }
+       result = (*retrPtr->proc)(retrPtr->clientData, retrPtr->interp,
+               propInfo);
+       if (result != TCL_OK) {
+           retrPtr->result = result;
+       }
+    } else {
+       char *string;
+
+       if (format != 32) {
+           Tcl_SetResult(retrPtr->interp, (char *) NULL, TCL_STATIC);
+           sprintf(retrPtr->interp->result,
+               "bad format for selection: wanted \"32\", got \"%d\"",
+               format);
+           retrPtr->result = TCL_ERROR;
+           goto done;
+       }
+       string = SelCvtFromX((long *) propInfo, (int) numItems, type,
+               (Tk_Window) retrPtr->winPtr);
+       result = (*retrPtr->proc)(retrPtr->clientData, retrPtr->interp,
+               string);
+       if (result != TCL_OK) {
+           retrPtr->result = result;
+       }
+       ckfree(string);
+    }
+
+    done:
+    XFree(propInfo);
+    retrPtr->idleTime = 0;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkSelPropProc --
+ *
+ *     This procedure is invoked when property-change events
+ *     occur on windows not known to the toolkit.  Its function
+ *     is to implement the sending side of the INCR selection
+ *     retrieval protocol when the selection requestor deletes
+ *     the property containing a part of the selection.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If the property that is receiving the selection was just
+ *     deleted, then a new piece of the selection is fetched and
+ *     placed in the property, until eventually there's no more
+ *     selection to fetch.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkSelPropProc(eventPtr)
+    register XEvent *eventPtr;         /* X PropertyChange event. */
+{
+    register IncrInfo *infoPtr;
+    int i, format;
+    Atom target;
+    register TkSelHandler *selPtr;
+    long buffer[TK_SEL_WORDS_AT_ONCE];
+    int numItems;
+    char *propPtr;
+    Tk_ErrorHandler errorHandler;
+
+    /*
+     * See if this event announces the deletion of a property being
+     * used for an INCR transfer.  If so, then add the next chunk of
+     * data to the property.
+     */
+
+    if (eventPtr->xproperty.state != PropertyDelete) {
+       return;
+    }
+    for (infoPtr = pendingIncrs; infoPtr != NULL;
+           infoPtr = infoPtr->nextPtr) {
+
+       /*
+        * To avoid races between selection conversions and
+        * changes in selection ownership, make sure the window
+        * and timestamp for the current selection match those
+        * in the INCR request.
+        */
+
+       if ((infoPtr->reqWindow != eventPtr->xproperty.window)
+               || (infoPtr->winPtr->dispPtr->selectionOwner
+                       != (Tk_Window) infoPtr->winPtr)
+               || (infoPtr->winPtr->dispPtr->selectionTime
+               != infoPtr->time)) {
+           continue;
+       }
+       for (i = 0; i < infoPtr->numConversions; i++) {
+           if ((eventPtr->xproperty.atom != infoPtr->multAtoms[2*i + 1])
+                   || (infoPtr->offsets[i] == -1)){
+               continue;
+           }
+           target = infoPtr->multAtoms[2*i];
+           infoPtr->idleTime = 0;
+           for (selPtr = infoPtr->winPtr->selHandlerList; ;
+                   selPtr = selPtr->nextPtr) {
+               if (selPtr == NULL) {
+                   infoPtr->multAtoms[2*i + 1] = None;
+                   infoPtr->offsets[i] = -1;
+                   infoPtr->numIncrs --;
+                   return;
+               }
+               if (selPtr->target == target) {
+                   if (infoPtr->offsets[i] == -2) {
+                       numItems = 0;
+                       ((char *) buffer)[0] = 0;
+                   } else {
+                       numItems = (*selPtr->proc)(selPtr->clientData,
+                               infoPtr->offsets[i], (char *) buffer,
+                               TK_SEL_BYTES_AT_ONCE);
+                       if (numItems > TK_SEL_BYTES_AT_ONCE) {
+                           panic("selection handler returned too many bytes");
+                       } else {
+                           if (numItems < 0) {
+                               numItems = 0;
+                           }
+                       }
+                       ((char *) buffer)[numItems] = '\0';
+                   }
+                   if (numItems < TK_SEL_BYTES_AT_ONCE) {
+                       if (numItems <= 0) {
+                           infoPtr->offsets[i] = -1;
+                           infoPtr->numIncrs--;
+                       } else {
+                           infoPtr->offsets[i] = -2;
+                       }
+                   } else {
+                       infoPtr->offsets[i] += numItems;
+                   }
+                   if (selPtr->format == XA_STRING) {
+                       propPtr = (char *) buffer;
+                       format = 8;
+                   } else {
+                       propPtr = (char *) SelCvtToX((char *) buffer,
+                               selPtr->format,
+                               (Tk_Window) infoPtr->winPtr,
+                               &numItems);
+                       format = 32;
+                   }
+                   errorHandler = Tk_CreateErrorHandler(
+                           eventPtr->xproperty.display, -1, -1, -1,
+                           (int (*)()) NULL, (ClientData) NULL);
+                   XChangeProperty(eventPtr->xproperty.display,
+                           eventPtr->xproperty.window,
+                           eventPtr->xproperty.atom, selPtr->format,
+                           format, PropModeReplace,
+                           (unsigned char *) propPtr, numItems);
+                   Tk_DeleteErrorHandler(errorHandler);
+                   if (propPtr != (char *) buffer) {
+                       ckfree(propPtr);
+                   }
+                   return;
+               }
+           }
+       }
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * HandleTclCommand --
+ *
+ *     This procedure acts as selection handler for handlers created
+ *     by the "selection handle" command.  It invokes a Tcl command to
+ *     retrieve the selection.
+ *
+ * Results:
+ *     The return value is a count of the number of bytes actually
+ *     stored at buffer.
+ *
+ * Side effects:
+ *     None except for things done by the Tcl command.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+HandleTclCommand(clientData, offset, buffer, maxBytes)
+    ClientData clientData;     /* Information about command to execute. */
+    int offset;                        /* Return selection bytes starting at this
+                                * offset. */
+    char *buffer;              /* Place to store converted selection. */
+    int maxBytes;              /* Maximum # of bytes to store at buffer. */
+{
+    register CommandInfo *cmdInfoPtr = (CommandInfo *) clientData;
+    char *oldResultString;
+    Tcl_FreeProc *oldFreeProc;
+    int spaceNeeded, length;
+#define MAX_STATIC_SIZE 100
+    char staticSpace[MAX_STATIC_SIZE];
+    char *command;
+
+    /*
+     * First, generate a command by taking the command string
+     * and appending the offset and maximum # of bytes.
+     */
+
+    spaceNeeded = cmdInfoPtr->cmdLength + 30;
+    if (spaceNeeded < MAX_STATIC_SIZE) {
+       command = staticSpace;
+    } else {
+       command = (char *) ckalloc((unsigned) spaceNeeded);
+    }
+    sprintf(command, "%s %d %d", cmdInfoPtr->command, offset, maxBytes);
+
+    /*
+     * Execute the command.  Be sure to restore the state of the
+     * interpreter after executing the command.
+     */
+
+    oldFreeProc = cmdInfoPtr->interp->freeProc;
+    if (oldFreeProc != 0) {
+       oldResultString = cmdInfoPtr->interp->result;
+    } else {
+       oldResultString = (char *) ckalloc((unsigned)
+               (strlen(cmdInfoPtr->interp->result) + 1));
+       strcpy(oldResultString, cmdInfoPtr->interp->result);
+       oldFreeProc = TCL_DYNAMIC;
+    }
+    cmdInfoPtr->interp->freeProc = 0;
+    if (Tcl_GlobalEval(cmdInfoPtr->interp, command) == TCL_OK) {
+       length = strlen(cmdInfoPtr->interp->result);
+    } else {
+       length = 0;
+    }
+    if (length > maxBytes) {
+       length = maxBytes;
+    }
+    memcpy((VOID *) buffer, (VOID *) cmdInfoPtr->interp->result, length);
+    buffer[length] = '\0';
+    Tcl_FreeResult(cmdInfoPtr->interp);
+    cmdInfoPtr->interp->result = oldResultString;
+    cmdInfoPtr->interp->freeProc = oldFreeProc;
+
+    if (command != staticSpace) {
+       ckfree(command);
+    }
+
+    return length;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * SelTimeoutProc --
+ *
+ *     This procedure is invoked once every second while waiting for
+ *     the selection to be returned.  After a while it gives up and
+ *     aborts the selection retrieval.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A new timer callback is created to call us again in another
+ *     second, unless time has expired, in which case an error is
+ *     recorded for the retrieval.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+SelTimeoutProc(clientData)
+    ClientData clientData;             /* Information about retrieval
+                                        * in progress. */
+{
+    register RetrievalInfo *retrPtr = (RetrievalInfo *) clientData;
+
+    /*
+     * Make sure that the retrieval is still in progress.  Then
+     * see how long it's been since any sort of response was received
+     * from the other side.
+     */
+
+    if (retrPtr->result != -1) {
+       return;
+    }
+    retrPtr->idleTime++;
+    if (retrPtr->idleTime >= 5) {
+
+       /*
+        * Use a careful procedure to store the error message, because
+        * the result could already be partially filled in with a partial
+        * selection return.
+        */
+
+       Tcl_SetResult(retrPtr->interp, "selection owner didn't respond",
+               TCL_STATIC);
+       retrPtr->result = TCL_ERROR;
+    } else {
+       retrPtr->timeout = Tk_CreateTimerHandler(1000, SelTimeoutProc,
+           (ClientData) retrPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * IncrTimeoutProc --
+ *
+ *     This procedure is invoked once a second while sending the
+ *     selection to a requestor in INCR mode.  After a while it
+ *     gives up and aborts the selection operation.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A new timeout gets registered so that this procedure gets
+ *     called again in another second, unless too many seconds
+ *     have elapsed, in which case infoPtr is marked as "all done".
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+IncrTimeoutProc(clientData)
+    ClientData clientData;             /* Information about INCR-mode
+                                        * selection retrieval for which
+                                        * we are selection owner. */
+{
+    register IncrInfo *infoPtr = (IncrInfo *) clientData;
+
+    infoPtr->idleTime++;
+    if (infoPtr->idleTime >= 5) {
+       infoPtr->numIncrs = 0;
+    } else {
+       infoPtr->timeout = Tk_CreateTimerHandler(1000, IncrTimeoutProc,
+               (ClientData) infoPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DefaultSelection --
+ *
+ *     This procedure is called to generate selection information
+ *     for a few standard targets such as TIMESTAMP and TARGETS.
+ *     It is invoked only if no handler has been declared by the
+ *     application.
+ *
+ * Results:
+ *     If "target" is a standard target understood by this procedure,
+ *     the selection is converted to that form and stored as a
+ *     character string in buffer.  The type of the selection (e.g.
+ *     STRING or ATOM) is stored in *typePtr, and the return value is
+ *     a count of the # of non-NULL bytes at buffer.  If the target
+ *     wasn't understood, or if there isn't enough space at buffer
+ *     to hold the entire selection (no INCR-mode transfers for this
+ *     stuff!), then -1 is returned.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+DefaultSelection(winPtr, target, buffer, maxBytes, typePtr)
+    TkWindow *winPtr;          /* Window that owns selection. */
+    Atom target;               /* Desired form of selection. */
+    char *buffer;              /* Place to put selection characters. */
+    int maxBytes;              /* Maximum # of bytes to store at buffer. */
+    Atom *typePtr;             /* Store here the type of the selection,
+                                * for use in converting to proper X format. */
+{
+    if (target == winPtr->dispPtr->timestampAtom) {
+       if (maxBytes < 20) {
+           return -1;
+       }
+       sprintf(buffer, "%#x", winPtr->dispPtr->selectionTime);
+       *typePtr = XA_INTEGER;
+       return strlen(buffer);
+    }
+
+    if (target == winPtr->dispPtr->targetsAtom) {
+       register TkSelHandler *selPtr;
+       char *atomString;
+       int length, atomLength;
+
+       if (maxBytes < 50) {
+           return -1;
+       }
+       strcpy(buffer, "TARGETS MULTIPLE TIMESTAMP");
+       length = strlen(buffer);
+       for (selPtr = winPtr->selHandlerList; selPtr != NULL;
+               selPtr = selPtr->nextPtr) {
+           atomString = Tk_GetAtomName((Tk_Window) winPtr, selPtr->target);
+           atomLength = strlen(atomString) + 1;
+           if ((length + atomLength) >= maxBytes) {
+               return -1;
+           }
+           sprintf(buffer+length, " %s", atomString);
+           length += atomLength;
+       }
+       *typePtr = XA_ATOM;
+       return length;
+    }
+
+    return -1;
+}
diff --git a/src/tk/tksend.c b/src/tk/tksend.c
new file mode 100644 (file)
index 0000000..c5c1fc1
--- /dev/null
@@ -0,0 +1,1177 @@
+/* 
+ * tkSend.c --
+ *
+ *     This file provides procedures that implement the "send"
+ *     command, allowing commands to be passed from interpreter
+ *     to interpreter.
+ *
+ * Copyright 1989-1992 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkSend.c,v 1.26 92/08/13 10:29:26 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tkint.h"
+
+/* 
+ * The following structure is used to keep track of the
+ * interpreters registered by this process.
+ */
+
+typedef struct RegisteredInterp {
+    char *name;                        /* Interpreter's name (malloc-ed). */
+    Tcl_Interp *interp;                /* Interpreter associated with
+                                * name. */
+    TkDisplay *dispPtr;                /* Display associated with name. */
+    TkWindow *winPtr;          /* Window associated with name. */
+    struct RegisteredInterp *nextPtr;
+                               /* Next in list of names associated
+                                * with interps in this process.
+                                * NULL means end of list. */
+} RegisteredInterp;
+
+static RegisteredInterp *registry = NULL;
+                               /* List of all interpreters
+                                * registered by this process. */
+
+/*
+ * When a result is being awaited from a sent command, one of
+ * the following structures is present on a list of all outstanding
+ * sent commands.  The information in the structure is used to
+ * process the result when it arrives.  You're probably wondering
+ * how there could ever be multiple outstanding sent commands.
+ * This could happen if interpreters invoke each other recursively.
+ * It's unlikely, but possible.
+ */
+
+typedef struct PendingCommand {
+    int serial;                        /* Serial number expected in
+                                * result. */
+    char *target;              /* Name of interpreter command is
+                                * being sent to. */
+    Tcl_Interp *interp;                /* Interpreter from which the send
+                                * was invoked. */
+    int code;                  /* Tcl return code for command
+                                * will be stored here. */
+    char *result;              /* String result for command (malloc'ed).
+                                * NULL means command still pending. */
+    struct PendingCommand *nextPtr;
+                               /* Next in list of all outstanding
+                                * commands.  NULL means end of
+                                * list. */
+} PendingCommand;
+
+static PendingCommand *pendingCommands = NULL;
+                               /* List of all commands currently
+                                * being waited for. */
+
+/*
+ * The information below is used for communication between
+ * processes during "send" commands.  Each process keeps a
+ * private window, never even mapped, with one property,
+ * "Comm".  When a command is sent to an interpreter, the
+ * command is appended to the comm property of the communication
+ * window associated with the interp's process.  Similarly, when a
+ * result is returned from a sent command, it is also appended
+ * to the comm property.  In each case, the property information
+ * is in the form of an ASCII string.  The exact syntaxes are:
+ *
+ * Command:
+ *     'C' space window space serial space interpName '|' command '\0'
+ * The 'C' character indicates that this is a command and not
+ * a response.  Window is the hex identifier for the comm
+ * window on which to append the response.  Serial is a hex
+ * integer containing an identifying number assigned by the
+ * sender;  it may be used by the sender to sort out concurrent
+ * responses.  InterpName is the ASCII name of the desired
+ * interpreter, which must not contain any vertical bar characters
+ * The interpreter name is delimited by a vertical bar (this
+ * allows the name to include blanks), and is followed by
+ * the command to execute.  The command is terminated by a
+ * NULL character.
+ *
+ * Response:
+ *     'R' space serial space code space result '\0'
+ * The 'R' character indicates that this is a response.  Serial
+ * gives the identifier for the command (same value as in the
+ * command message).  The code field is a decimal integer giving
+ * the Tcl return code from the command, and result is the string
+ * result.  The result is terminated by a NULL character.
+ *
+ * The register of interpreters is kept in a property
+ * "InterpRegistry" on the root window of the display.  It is
+ * organized as a series of zero or more concatenated strings
+ * (in no particular order), each of the form
+ *     window space name '\0'
+ * where "window" is the hex id of the comm. window to use to talk
+ * to an interpreter named "name".
+ */
+
+/*
+ * Maximum size property that can be read at one time by
+ * this module:
+ */
+
+#define MAX_PROP_WORDS 100000
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static int     AppendErrorProc _ANSI_ARGS_((ClientData clientData,
+                       XErrorEvent *errorPtr));
+static void    AppendPropCarefully _ANSI_ARGS_((Display *display,
+                   Window window, Atom property, char *value,
+                   PendingCommand *pendingPtr));
+static void    DeleteProc _ANSI_ARGS_((ClientData clientData));
+static Window  LookupName _ANSI_ARGS_((TkDisplay *dispPtr, char *name,
+                   int delete));
+static void    SendEventProc _ANSI_ARGS_((ClientData clientData,
+                   XEvent *eventPtr));
+static int     SendInit _ANSI_ARGS_((Tcl_Interp *interp, TkDisplay *dispPtr));
+static Bool    SendRestrictProc _ANSI_ARGS_((Display *display,
+                   XEvent *eventPtr, char *arg));
+static void    TimeoutProc _ANSI_ARGS_((ClientData clientData));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_RegisterInterp --
+ *
+ *     This procedure is called to associate an ASCII name
+ *     with an interpreter.  Tk_InitSend must previously
+ *     have been called to set up communication channels
+ *     and specify a display.
+ *
+ * Results:
+ *     Zero is returned if the name was registered successfully.
+ *     Non-zero means the name was already in use.
+ *
+ * Side effects:
+ *     Registration info is saved, thereby allowing the
+ *     "send" command to be used later to invoke commands
+ *     in the interpreter.  The registration will be removed
+ *     automatically when the interpreter is deleted.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_RegisterInterp(interp, name, tkwin)
+    Tcl_Interp *interp;                /* Interpreter associated with name. */
+    char *name;                        /* The name that will be used to
+                                * refer to the interpreter in later
+                                * "send" commands.  Must be globally
+                                * unique. */
+    Tk_Window tkwin;           /* Token for window associated with
+                                * interp;  used to identify display
+                                * for communication.  */
+{
+#define TCL_MAX_NAME_LENGTH 1000
+    char propInfo[TCL_MAX_NAME_LENGTH + 20];
+    register RegisteredInterp *riPtr;
+    Window w;
+    TkWindow *winPtr = (TkWindow *) tkwin;
+    TkDisplay *dispPtr;
+
+    if (strchr(name, '|') != NULL) {
+       interp->result =
+               "interpreter name cannot contain '|' character";
+       return TCL_ERROR;
+    }
+
+    dispPtr = winPtr->dispPtr;
+    if (dispPtr->commWindow == NULL) {
+       int result;
+
+       result = SendInit(interp, dispPtr);
+       if (result != TCL_OK) {
+           return result;
+       }
+    }
+
+    /*
+     * Make sure the name is unique, and append info about it to
+     * the registry property.  Eventually, it would probably be
+     * a good idea to lock the server here to prevent conflicting
+     * changes to the registry property.  But that would make
+     * testing more difficult, and probably isn't necessary
+     * anyway because new windows don't get created all that often.
+     */
+
+    w = LookupName(dispPtr, name, 0);
+    if (w != (Window) 0) {
+       Tcl_Interp *tmpInterp;
+       RegisteredInterp tmpRi;
+       int result;
+       char *argv[3];
+
+       /*
+        * Name already exists.  Ping the interpreter with a
+        * NULL command to see if it already exists.  If not,
+        * unregister the old name (this could happen if an
+        * application dies without cleaning up the registry).
+        */
+
+       tmpInterp = Tcl_CreateInterp();
+       argv[0] = "send";
+       argv[1] = name;
+       argv[2] = "";
+       tmpRi.dispPtr = dispPtr;
+       tmpRi.winPtr = winPtr;
+       result = Tk_SendCmd((ClientData) &tmpRi, tmpInterp, 3, argv);
+       Tcl_DeleteInterp(tmpInterp);
+       if (result == TCL_OK) {
+           Tcl_AppendResult(interp, "interpreter name \"", name,
+                   "\" is already in use", (char *) NULL);
+           return TCL_ERROR;
+       }
+       (void) LookupName(winPtr->dispPtr, name, 1);
+    }
+    sprintf(propInfo, "%x %.*s", Tk_WindowId(dispPtr->commWindow),
+           TCL_MAX_NAME_LENGTH, name);
+    XChangeProperty(dispPtr->display,
+           Tk_DefaultRootWindow(dispPtr->display),
+           dispPtr->registryProperty, XA_STRING, 8, PropModeAppend,
+           (unsigned char *) propInfo, strlen(propInfo)+1);
+
+    /*
+     * Add an entry in the local registry of names owned by this
+     * process.
+     */
+
+    riPtr = (RegisteredInterp *) ckalloc(sizeof(RegisteredInterp));
+    riPtr->name = (char *) ckalloc((unsigned) (strlen(name) + 1));
+    strcpy(riPtr->name, name);
+    riPtr->interp = interp;
+    riPtr->dispPtr = dispPtr;
+    riPtr->winPtr = winPtr;
+    riPtr->nextPtr = registry;
+    registry = riPtr;
+
+    /*
+     * Add the "send" command to this interpreter, and arrange for
+     * us to be notified when the interpreter is deleted (actually,
+     * when the "send" command is deleted).
+     */
+
+    Tcl_CreateCommand(interp, "send", Tk_SendCmd, (ClientData) riPtr,
+           DeleteProc);
+
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_SendCmd --
+ *
+ *     This procedure is invoked to process the "send" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_SendCmd(clientData, interp, argc, argv)
+    ClientData clientData;             /* Information about sender (only
+                                        * dispPtr field is used). */
+    Tcl_Interp *interp;                        /* Current interpreter. */
+    int argc;                          /* Number of arguments. */
+    char **argv;                       /* Argument strings. */
+{
+    RegisteredInterp *senderRiPtr = (RegisteredInterp *) clientData;
+    Window w;
+#define STATIC_PROP_SPACE 100
+    char *property, staticSpace[STATIC_PROP_SPACE];
+    int length;
+    int quick = 0;
+    static int serial = 0;     /* Running count of sent commands.
+                                * Used to give each command a
+                                * different serial number. */
+    PendingCommand pending;
+    Tk_TimerToken timeout;
+    register RegisteredInterp *riPtr;
+    char *cmd;
+    int result;
+    Bool (*prevRestrictProc)();
+    char *prevArg;
+    TkWindow *winPtr = senderRiPtr->winPtr;
+    TkDisplay *dispPtr = senderRiPtr->dispPtr;
+    int to_server = 0;
+
+    if (argc >= 2) {
+      Tk_Window tkwin = NULL;
+
+      if ((argv[1][0] == '-') &&
+         (strncmp(argv[1], "-quick", strlen(argv[1])) == 0)) {
+       quick = 1;
+       argv += 1; argc -= 1;
+      }
+    }
+
+    if (argc >= 3) {
+      Tk_Window tkwin = NULL;
+
+      if ((argv[1][0] == '-') &&
+         (strncmp(argv[1], "-server", strlen(argv[1])) == 0)) {
+       to_server = 1;
+       tkwin = Tk_NameToWindow(interp, argv[2], (Tk_Window) winPtr);
+       if (tkwin == NULL) {
+         Tcl_AppendResult(interp, "bad server arg, should be window name: ",
+                          argv[2], (char *) NULL);
+         return TCL_ERROR;
+       }
+       winPtr = (TkWindow *) tkwin;
+       dispPtr = winPtr->dispPtr;
+       argv += 2; argc -= 2;
+      }
+    }
+
+    if (dispPtr->commWindow == NULL) {
+       result = SendInit(interp, dispPtr);
+       if (result != TCL_OK) {
+           return result;
+       }
+    }
+
+    if (argc < 3) {
+    badargs:
+       Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
+               " interpName arg ?arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    if (argc == 3) {
+       cmd = argv[2];
+    } else {
+       cmd = Tcl_Concat(argc-2, argv+2);
+    }
+
+    /*
+     * See if the target interpreter is local.  If so, execute
+     * the command directly without going through the X server.
+     * The only tricky thing is passing the result from the target
+     * interpreter to the invoking interpreter.  Watch out:  they
+     * could be the same!
+     */
+
+    for (riPtr = registry; riPtr != NULL; riPtr = riPtr->nextPtr) {
+       if (strcmp(riPtr->name, argv[1]) != 0) {
+           continue;
+       }
+       if (interp == riPtr->interp) {
+           result = Tcl_GlobalEval(interp, cmd);
+       } else {
+           result = Tcl_GlobalEval(riPtr->interp, cmd);
+           interp->result = riPtr->interp->result;
+           interp->freeProc = riPtr->interp->freeProc;
+           riPtr->interp->freeProc = 0;
+           Tcl_ResetResult(riPtr->interp);
+       }
+       if (cmd != argv[2]) {
+           ckfree(cmd);
+       }
+       return result;
+    }
+
+    /*
+     * Bind the interpreter name to a communication window.
+     */
+
+    w = LookupName(dispPtr, argv[1], 0);
+    if (w == 0) {
+       Tcl_AppendResult(interp, "no registered interpeter named \"",
+               argv[1], "\"", (char *) NULL);
+       if (cmd != argv[2]) {
+           ckfree(cmd);
+       }
+       return TCL_ERROR;
+    }
+
+    if (!quick) {
+       /*
+        * Register the fact that we're waiting for a command to
+        * complete (this is needed by SendEventProc and by
+        * AppendErrorProc to pass back the command's results).
+        */
+
+       serial++;
+       pending.serial = serial;
+       pending.target = argv[1];
+       pending.interp = interp;
+       pending.result = NULL;
+       pending.nextPtr = pendingCommands;
+       pendingCommands = &pending;
+    }
+
+    /*
+     * Send the command to target interpreter by appending it to the
+     * comm window in the communication window.
+     */
+
+    length = strlen(argv[1]) + strlen(cmd) + 30;
+    if (length <= STATIC_PROP_SPACE) {
+       property = staticSpace;
+    } else {
+       property = (char *) ckalloc((unsigned) length);
+    }
+    sprintf(property, "C %x %x %s|%s",
+           Tk_WindowId(dispPtr->commWindow), serial, argv[1], cmd);
+    (void) AppendPropCarefully(dispPtr->display, w, dispPtr->commProperty,
+           property, &pending);
+    if (length > STATIC_PROP_SPACE) {
+       ckfree(property);
+    }
+    if (cmd != argv[2]) {
+       ckfree(cmd);
+    }
+
+    if (quick) {
+      sprintf(interp->result, "NoReturnValue");
+      return TCL_OK;
+    }
+
+    /*
+     * Enter a loop processing X events until the result comes
+     * in.  If no response is received within a few seconds,
+     * then timeout.  While waiting for a result, look only at
+     * send-related events (otherwise it would be possible for
+     * additional input events, such as mouse motion, to cause
+     * other sends, leading eventually to such a large number
+     * of nested Tcl_Eval calls that the Tcl interpreter panics).
+     */
+
+    prevRestrictProc = Tk_RestrictEvents(SendRestrictProc,
+           (char *) dispPtr->commWindow, &prevArg);
+    timeout = Tk_CreateTimerHandler(5000, TimeoutProc,
+           (ClientData) &pending);
+    while (pending.result == NULL) {
+       Tk_DoOneEvent(0);
+    }
+    Tk_DeleteTimerHandler(timeout);
+    (void) Tk_RestrictEvents(prevRestrictProc, prevArg, &prevArg);
+
+    /*
+     * Unregister the information about the pending command
+     * and return the result.
+     */
+
+    if (pendingCommands == &pending) {
+       pendingCommands = pending.nextPtr;
+    } else {
+       PendingCommand *pcPtr;
+
+       for (pcPtr = pendingCommands; pcPtr != NULL;
+               pcPtr = pcPtr->nextPtr) {
+           if (pcPtr->nextPtr == &pending) {
+               pcPtr->nextPtr = pending.nextPtr;
+               break;
+           }
+       }
+    }
+    Tcl_SetResult(interp, pending.result, TCL_DYNAMIC);
+    return pending.code;
+    
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkGetInterpNames --
+ *
+ *     This procedure is invoked to fetch a list of all the
+ *     interpreter names currently registered for the display
+ *     of a particular window.
+ *
+ * Results:
+ *     A standard Tcl return value.  Interp->result will be set
+ *     to hold a list of all the interpreter names defined for
+ *     tkwin's display.  If an error occurs, then TCL_ERROR
+ *     is returned and interp->result will hold an error message.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TkGetInterpNames(interp, tkwin)
+    Tcl_Interp *interp;                /* Interpreter for returning a result. */
+    Tk_Window tkwin;           /* Window whose display is to be used
+                                * for the lookup. */
+{
+    TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr;
+    char *regProp, *separator, *name;
+    register char *p;
+    int result, actualFormat;
+    unsigned long numItems, bytesAfter;
+    Atom actualType;
+
+    /*
+     * Read the registry property.
+     */
+
+    regProp = NULL;
+    result = XGetWindowProperty(dispPtr->display,
+           Tk_DefaultRootWindow(dispPtr->display),
+           dispPtr->registryProperty, 0, MAX_PROP_WORDS,
+           False, XA_STRING, &actualType, &actualFormat,
+           &numItems, &bytesAfter, (unsigned char **) &regProp);
+
+    if (actualType == None) {
+       sprintf(interp->result, "couldn't read intepreter registry property");
+       return TCL_ERROR;
+    }
+
+    /*
+     * If the property is improperly formed, then delete it.
+     */
+
+    if ((result != Success) || (actualFormat != 8)
+           || (actualType != XA_STRING)) {
+       if (regProp != NULL) {
+           XFree(regProp);
+       }
+       sprintf(interp->result, "intepreter registry property is badly formed");
+       return TCL_ERROR;
+    }
+
+    /*
+     * Scan all of the names out of the property.
+     */
+
+    separator = "";
+    for (p = regProp; (p-regProp) < numItems; p++) {
+       name = p;
+       while ((*p != 0) && (!isspace(*p))) {
+           p++;
+       }
+       if (*p != 0) {
+           name = p+1;
+           name = Tcl_Merge(1, &name);
+           Tcl_AppendResult(interp, separator, name, (char *) NULL);
+           while (*p != 0) {
+               p++;
+           }
+           separator = " ";
+       }
+    }
+    XFree(regProp);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * SendInit --
+ *
+ *     This procedure is called to initialize the
+ *     communication channels for sending commands and
+ *     receiving results.
+ *
+ * Results:
+ *     The result is a standard Tcl return value, which is
+ *     normally TCL_OK.  If an error occurs then an error
+ *     message is left in interp->result and TCL_ERROR is
+ *     returned.
+ *
+ * Side effects:
+ *     Sets up various data structures and windows.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+SendInit(interp, dispPtr)
+    Tcl_Interp *interp;                /* Interpreter to use for error
+                                * reporting. */
+    register TkDisplay *dispPtr;/* Display to initialize. */
+
+{
+    XSetWindowAttributes atts;
+
+    /*
+     * Create the window used for communication, and set up an
+     * event handler for it.
+     */
+
+    dispPtr->commWindow = Tk_CreateWindow(interp, (Tk_Window) NULL,
+           "_comm", DisplayString(dispPtr->display));
+    if (dispPtr->commWindow == NULL) {
+       return TCL_ERROR;
+    }
+    atts.override_redirect = True;
+    Tk_ChangeWindowAttributes(dispPtr->commWindow,
+           CWOverrideRedirect, &atts);
+    Tk_CreateEventHandler(dispPtr->commWindow, PropertyChangeMask,
+           SendEventProc, (ClientData) dispPtr);
+    Tk_MakeWindowExist(dispPtr->commWindow);
+
+    /*
+     * Get atoms used as property names.
+     */
+
+    dispPtr->commProperty = XInternAtom(dispPtr->display,
+           "Comm", False);
+    dispPtr->registryProperty = XInternAtom(dispPtr->display,
+           "InterpRegistry", False);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * LookupName --
+ *
+ *     Given an interpreter name, see if the name exists in
+ *     the interpreter registry for a particular display.
+ *
+ * Results:
+ *     If the given name is registered, return the ID of
+ *     the window associated with the name.  If the name
+ *     isn't registered, then return 0.
+ *
+ * Side effects:
+ *     If the registry property is improperly formed, then
+ *     it is deleted.  If "delete" is non-zero, then if the
+ *     named interpreter is found it is removed from the
+ *     registry property.
+ *
+ *--------------------------------------------------------------
+ */
+
+static Window
+LookupName(dispPtr, name, delete)
+    register TkDisplay *dispPtr;
+                       /* Display whose registry to check. */
+    char *name;                /* Name of an interpreter. */
+    int delete;                /* If non-zero, delete info about name. */
+{
+    char *regProp, *entry;
+    register char *p;
+    int result, actualFormat;
+    unsigned long numItems, bytesAfter;
+    Atom actualType;
+    Window returnValue;
+
+    /*
+     * Read the registry property.
+     */
+
+    regProp = NULL;
+    result = XGetWindowProperty(dispPtr->display,
+           Tk_DefaultRootWindow(dispPtr->display),
+           dispPtr->registryProperty, 0, MAX_PROP_WORDS,
+           False, XA_STRING, &actualType, &actualFormat,
+           &numItems, &bytesAfter, (unsigned char **) &regProp);
+
+    if (actualType == None) {
+       return 0;
+    }
+
+    /*
+     * If the property is improperly formed, then delete it.
+     */
+
+    if ((result != Success) || (actualFormat != 8)
+           || (actualType != XA_STRING)) {
+       if (regProp != NULL) {
+           XFree(regProp);
+       }
+       XDeleteProperty(dispPtr->display,
+               Tk_DefaultRootWindow(dispPtr->display),
+               dispPtr->registryProperty);
+       return 0;
+    }
+
+    /*
+     * Scan the property for the desired name.
+     */
+
+    returnValue = (Window) 0;
+    entry = NULL;      /* Not needed, but eliminates compiler warning. */
+    for (p = regProp; (p-regProp) < numItems; ) {
+       entry = p;
+       while ((*p != 0) && (!isspace(*p))) {
+           p++;
+       }
+       if ((*p != 0) && (strcmp(name, p+1) == 0)) {
+           sscanf(entry, "%x", &returnValue);
+           break;
+       }
+       while (*p != 0) {
+           p++;
+       }
+       p++;
+    }
+
+    /*
+     * Delete the property, if that is desired (copy down the
+     * remainder of the registry property to overlay the deleted
+     * info, then rewrite the property).
+     */
+
+    if ((delete) && (returnValue != 0)) {
+       int count;
+
+       while (*p != 0) {
+           p++;
+       }
+       p++;
+       count = numItems - (p-regProp);
+       if (count > 0) {
+           memcpy((VOID *) entry, (VOID *) p, count);
+       }
+       XChangeProperty(dispPtr->display,
+               Tk_DefaultRootWindow(dispPtr->display),
+               dispPtr->registryProperty, XA_STRING, 8,
+               PropModeReplace, (unsigned char *) regProp,
+               (int) (numItems - (p-entry)));
+       XSync(dispPtr->display, False);
+    }
+
+    XFree(regProp);
+    return returnValue;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * SendEventProc --
+ *
+ *     This procedure is invoked automatically by the toolkit
+ *     event manager when a property changes on the communication
+ *     window.  This procedure reads the property and handles
+ *     command requests and responses.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If there are command requests in the property, they
+ *     are executed.  If there are responses in the property,
+ *     their information is saved for the (ostensibly waiting)
+ *     "send" commands. The property is deleted.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+SendEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Display information. */      
+    XEvent *eventPtr;          /* Information about event. */
+{
+    TkDisplay *dispPtr = (TkDisplay *) clientData;
+    char *propInfo;
+    register char *p;
+    int result, actualFormat;
+    unsigned long numItems, bytesAfter;
+    Atom actualType;
+
+    if ((eventPtr->xproperty.atom != dispPtr->commProperty)
+           || (eventPtr->xproperty.state != PropertyNewValue)) {
+       return;
+    }
+
+    /*
+     * Read the comm property and delete it.
+     */
+
+    propInfo = NULL;
+    result = XGetWindowProperty(dispPtr->display,
+           Tk_WindowId(dispPtr->commWindow),
+           dispPtr->commProperty, 0, MAX_PROP_WORDS, True,
+           XA_STRING, &actualType, &actualFormat,
+           &numItems, &bytesAfter, (unsigned char **) &propInfo);
+
+    /*
+     * If the property doesn't exist or is improperly formed
+     * then ignore it.
+     */
+
+    if ((result != Success) || (actualType != XA_STRING)
+           || (actualFormat != 8)) {
+       if (propInfo != NULL) {
+           XFree(propInfo);
+       }
+       return;
+    }
+
+    /*
+     * The property is divided into records separated by null
+     * characters.  Each record represents one command request
+     * or response.  Scan through the property one record at a
+     * time.
+     */
+
+    for (p = propInfo; (p-propInfo) < numItems; ) {
+       if (*p == 'C') {
+           Window window;
+           int serial, resultSize;
+           char *resultString, *interpName, *returnProp, *end;
+           register RegisteredInterp *riPtr;
+           char errorMsg[100];
+#define STATIC_RESULT_SPACE 100
+           char staticSpace[STATIC_RESULT_SPACE];
+
+           /*
+            *-----------------------------------------------------
+            * This is an incoming command sent by another window.
+            * Parse the fields of the command string.  If the command
+            * string isn't properly formed, send back an error message
+            * if there's enough well-formed information to generate
+            * a proper reply;  otherwise just ignore the message.
+            *-----------------------------------------------------
+            */
+
+           p++;
+           window = (Window) strtol(p, &end, 16);
+           if (end == p) {
+               goto nextRecord;
+           }
+           p = end;
+           if (*p != ' ') {
+               goto nextRecord;
+           }
+           p++;
+           serial = strtol(p, &end, 16);
+           if (end == p) {
+               goto nextRecord;
+           }
+           p = end;
+           if (*p != ' ') {
+               goto nextRecord;
+           }
+           p++;
+           interpName = p;
+           while ((*p != 0) && (*p != '|')) {
+               p++;
+           }
+           if (*p != '|') {
+               result = TCL_ERROR;
+               resultString = "bad property format for sent command";
+               goto returnResult;
+           }
+           *p = 0;
+           p++;
+
+           /*
+            * Locate the interpreter for the command, then
+            * execute the command.
+            */
+
+           for (riPtr = registry; ; riPtr = riPtr->nextPtr) {
+               if (riPtr == NULL) {
+                   result = TCL_ERROR;
+                   sprintf(errorMsg,
+                           "receiver never heard of interpreter \"%.40s\"",
+                           interpName);
+                   resultString = errorMsg;
+                   goto returnResult;
+               }
+               if (strcmp(riPtr->name, interpName) == 0) {
+                   break;
+               }
+           }
+           result = Tcl_GlobalEval(riPtr->interp, p);
+           resultString = riPtr->interp->result;
+
+           /*
+            * Return the result to the sender.
+            */
+
+           returnResult:
+           resultSize = strlen(resultString) + 30;
+           if (resultSize <= STATIC_RESULT_SPACE) {
+               returnProp = staticSpace;
+           } else {
+               returnProp = (char *) ckalloc((unsigned) resultSize);
+           }
+           sprintf(returnProp, "R %x %d %s", serial, result,
+                   resultString);
+           (void) AppendPropCarefully(dispPtr->display, window,
+                   dispPtr->commProperty, returnProp,
+                   (PendingCommand *) NULL);
+           if (returnProp != staticSpace) {
+               ckfree(returnProp);
+           }
+       } else if (*p == 'R') {
+           int serial, code;
+           char *end;
+           register PendingCommand *pcPtr;
+
+           /*
+            *-----------------------------------------------------
+            * This record in the property is a result being
+            * returned for a command sent from here.  First
+            * parse the fields.
+            *-----------------------------------------------------
+            */
+
+           p++;
+           serial = strtol(p, &end, 16);
+           if (end == p) {
+               goto nextRecord;
+           }
+           p = end;
+           if (*p != ' ') {
+               goto nextRecord;
+           }
+           p++;
+           code = strtol(p, &end, 10);
+           if (end == p) {
+               goto nextRecord;
+           }
+           p = end;
+           if (*p != ' ') {
+               goto nextRecord;
+           }
+           p++;
+
+           /*
+            * Give the result information to anyone who's
+            * waiting for it.
+            */
+
+           for (pcPtr = pendingCommands; pcPtr != NULL;
+                   pcPtr = pcPtr->nextPtr) {
+               if ((serial != pcPtr->serial) || (pcPtr->result != NULL)) {
+                   continue;
+               }
+               pcPtr->code = code;
+               pcPtr->result = ckalloc((unsigned) (strlen(p) + 1));
+               strcpy(pcPtr->result, p);
+               break;
+           }
+       }
+
+       nextRecord:
+       while (*p != 0) {
+           p++;
+       }
+       p++;
+    }
+    XFree(propInfo);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * AppendPropCarefully --
+ *
+ *     Append a given property to a given window, but set up
+ *     an X error handler so that if the append fails this
+ *     procedure can return an error code rather than having
+ *     Xlib panic.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The given property on the given window is appended to.
+ *     If this operation fails and if pendingPtr is non-NULL,
+ *     then the pending operation is marked as complete with
+ *     an error.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+AppendPropCarefully(display, window, property, value, pendingPtr)
+    Display *display;          /* Display on which to operate. */
+    Window window;             /* Window whose property is to
+                                * be modified. */
+    Atom property;             /* Name of property. */
+    char *value;               /* Characters (null-terminated) to
+                                * append to property. */
+    PendingCommand *pendingPtr;        /* Pending command to mark complete
+                                * if an error occurs during the
+                                * property op.  NULL means just
+                                * ignore the error. */
+{
+    Tk_ErrorHandler handler;
+
+    handler = Tk_CreateErrorHandler(display, -1, -1, -1, AppendErrorProc,
+       (ClientData) pendingPtr);
+    XChangeProperty(display, window, property, XA_STRING, 8,
+           PropModeAppend, (unsigned char *) value, strlen(value)+1);
+    Tk_DeleteErrorHandler(handler);
+}
+
+/*
+ * The procedure below is invoked if an error occurs during
+ * the XChangeProperty operation above.
+ */
+
+       /* ARGSUSED */
+static int
+AppendErrorProc(clientData, errorPtr)
+    ClientData clientData;     /* Command to mark complete, or NULL. */
+    XErrorEvent *errorPtr;     /* Information about error. */
+{
+    PendingCommand *pendingPtr = (PendingCommand *) clientData;
+    register PendingCommand *pcPtr;
+
+    if (pendingPtr == NULL) {
+       return 0;
+    }
+
+    /*
+     * Make sure this command is still pending.
+     */
+
+    for (pcPtr = pendingCommands; pcPtr != NULL;
+           pcPtr = pcPtr->nextPtr) {
+       if ((pcPtr == pendingPtr) && (pcPtr->result == NULL)) {
+           pcPtr->result = ckalloc((unsigned) (strlen(pcPtr->target) + 50));
+           sprintf(pcPtr->result,
+                   "send to \"%s\" failed (no communication window)",
+                   pcPtr->target);
+           pcPtr->code = TCL_ERROR;
+           break;
+       }
+    }
+    return 0;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TimeoutProc --
+ *
+ *     This procedure is invoked when too much time has elapsed
+ *     during the processing of a sent command.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Mark the pending command as complete, with an error
+ *     message signalling the timeout.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+TimeoutProc(clientData)
+    ClientData clientData;     /* Information about command that
+                                * has been sent but not yet
+                                * responded to. */
+{
+    PendingCommand *pcPtr = (PendingCommand *) clientData;
+    register PendingCommand *pcPtr2;
+
+    /*
+     * Make sure that the command is still in the pending list
+     * and that it hasn't already completed.  Then register the
+     * error.
+     */
+
+    for (pcPtr2 = pendingCommands; pcPtr2 != NULL;
+           pcPtr2 = pcPtr2->nextPtr) {
+       static char msg[] = "remote interpreter did not respond";
+       if ((pcPtr2 != pcPtr) || (pcPtr2->result != NULL)) {
+           continue;
+       }
+       pcPtr2->code = TCL_ERROR;
+       pcPtr2->result = ckalloc((unsigned) (sizeof(msg) + 1));
+       strcpy(pcPtr2->result, msg);
+       return;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * DeleteProc --
+ *
+ *     This procedure is invoked by Tcl when a registered
+ *     interpreter is about to be deleted.  It unregisters
+ *     the interpreter.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The interpreter given by riPtr is unregistered.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+DeleteProc(clientData)
+    ClientData clientData;     /* Info about registration, passed
+                                * as ClientData. */
+{
+    RegisteredInterp *riPtr = (RegisteredInterp *) clientData;
+    register RegisteredInterp *riPtr2;
+
+    (void) LookupName(riPtr->dispPtr, riPtr->name, 1);
+    if (registry == riPtr) {
+       registry = riPtr->nextPtr;
+    } else {
+       for (riPtr2 = registry; riPtr2 != NULL;
+               riPtr2 = riPtr2->nextPtr) {
+           if (riPtr2->nextPtr == riPtr) {
+               riPtr2->nextPtr = riPtr->nextPtr;
+               break;
+           }
+       }
+    }
+    ckfree((char *) riPtr->name);
+    ckfree((char *) riPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * SendRestrictProc --
+ *
+ *     This procedure filters incoming events when a "send" command
+ *     is outstanding.  It defers all events except those containing
+ *     send commands and results.
+ *
+ * Results:
+ *     False is returned except for property-change events on the
+ *     given commWindow.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+    /* ARGSUSED */
+static Bool
+SendRestrictProc(display, eventPtr, arg)
+    Display *display;          /* Display from which event arrived. */
+    register XEvent *eventPtr; /* Event that just arrived. */
+    char *arg;                 /* Comunication window in which
+                                * we're interested. */
+{
+    register Tk_Window comm = (Tk_Window) arg;
+
+    if ((display != Tk_Display(comm))
+           || (eventPtr->type != PropertyNotify)
+           || (eventPtr->xproperty.window != Tk_WindowId(comm))) {
+       return False;
+    }
+    return True;
+}
diff --git a/src/tk/tkshare.c b/src/tk/tkshare.c
new file mode 100644 (file)
index 0000000..dd43ab1
--- /dev/null
@@ -0,0 +1,409 @@
+/* 
+ * tkShare.c --
+ *
+ *     This module implements a simple mechanism for sharing
+ *     mouse- and button-related events among collections of
+ *     windows.  It is used primarily for menus.  For example,
+ *     if one menu is posted and mouse moves over the menu button
+ *     for a different menu, then the menubutton needs to see the
+ *     event so that it can post itself and unpost the first menu.
+ *
+ * Copyright 1990-1992 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkShare.c,v 1.10 92/05/31 16:20:12 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tkconfig.h"
+#include "tk.h"
+
+/*
+ * the global variable below is used to tell TkPointerEvent
+ * not to do any processing on an event that we're forwarding from one
+ * window to another.  This is really ugly.  Eventually this file and
+ * tkGrab.c need to get merged together to produce something cleaner.
+ */
+
+XEvent *tkShareEventPtr = NULL;
+
+/*
+ * Sharing is implemented in terms of groups of windows, where events
+ * are shared among all the windows in a group.  One of the following
+ * structures exists for each group.
+ */
+
+typedef struct Group {
+    Tk_Uid groupId;                    /* Identifies group uniquely among all
+                                        * share groups. */
+    Tk_Window *windows;                        /* Pointer to array of windows in
+                                        * this group.  Malloc'ed. */
+    int numWindows;                    /* Number of windows currently in
+                                        * this group. */
+    Tk_Window lastWindow;              /* Last window found that contained
+                                        * an event.  Needed in order to
+                                        * notify window when mouse moves out
+                                        * of it.  NULL means nobody to
+                                        * notify. */
+    XEvent *activeEvent;               /* If non-NULL, means that a recursive
+                                        * call to Tk_HandleEvent is in
+                                        * progress for this share group, and
+                                        * identifies event.  NULL means no
+                                        * recursive call in progress.  Used
+                                        * to avoid infinite recursion. */
+    struct Group *nextPtr;             /* Next in list of all share groups. */
+} Group;
+
+static Group *groupList = NULL;                /* First in list of all share groups
+                                        * currently defined. */
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            DeleteGroup _ANSI_ARGS_((Group *groupPtr));
+static void            ShareEventProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_ShareEvents --
+ *
+ *     Add tkwin to a group of windows sharing events.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     In the future, if a button- or mouse-related event occurs for
+ *     any window in the same group as tkwin, but the mouse is actually
+ *     in tkwin (the event went to a different window because of a
+ *     grab) then a synthetic event will be generated with tkwin as
+ *     window and adjusted coordinates.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_ShareEvents(tkwin, groupId)
+    Tk_Window tkwin;                   /* Token for window. */
+    Tk_Uid groupId;                    /* Identifier for group among which
+                                        * events are to be shared. */
+{
+    register Group *groupPtr;
+
+    /*
+     * See if this group exists.  If so, add the window to the group.
+     */
+
+    for (groupPtr = groupList; groupPtr != NULL;
+           groupPtr = groupPtr->nextPtr) {
+       Tk_Window *new;
+
+       if (groupPtr->groupId != groupId) {
+           continue;
+       }
+       new = (Tk_Window *) ckalloc((unsigned)
+               (groupPtr->numWindows+1) * sizeof(Tk_Window *));
+       memcpy((VOID *) (new+1), (VOID *) groupPtr->windows, 
+               (groupPtr->numWindows * sizeof(Tk_Window *)));
+       ckfree((char *) groupPtr->windows);
+       groupPtr->windows = new;
+       groupPtr->windows[0] = tkwin;
+       groupPtr->numWindows++;
+       break;
+    }
+
+    if (groupPtr == NULL) {
+       /*
+        * Group doesn't exist.  Make a new one.
+        */
+    
+       groupPtr = (Group *) ckalloc(sizeof(Group));
+       groupPtr->groupId = groupId;
+       groupPtr->windows = (Tk_Window *) ckalloc(sizeof (Tk_Window *));
+       groupPtr->windows[0] = tkwin;
+       groupPtr->numWindows = 1;
+       groupPtr->lastWindow = NULL;
+       groupPtr->activeEvent = NULL;
+       groupPtr->nextPtr = groupList;
+       groupList = groupPtr;
+    }
+
+    /*
+     * Create an event handler so we find out about relevant events
+     * that are directed to tkwin.
+     */
+
+    Tk_CreateEventHandler(tkwin,
+           ButtonPressMask|ButtonReleaseMask|PointerMotionMask,
+           ShareEventProc, (ClientData) groupPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_UnshareEvents --
+ *
+ *     Remove tkwin from a group of windows sharing events.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Tkwin will no longer participate in event-sharing for the
+ *     given group, either as source of events or as destination.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_UnshareEvents(tkwin, groupId)
+    Tk_Window tkwin;                   /* Token for window. */
+    Tk_Uid groupId;                    /* Identifier for group. */
+{
+    register Group *groupPtr;
+    int i;
+
+    for (groupPtr = groupList; groupPtr != NULL;
+           groupPtr = groupPtr->nextPtr) {
+       if (groupPtr->groupId != groupId) {
+           continue;
+       }
+       if (groupPtr->lastWindow == tkwin) {
+           groupPtr->lastWindow = NULL;
+       }
+       for (i = 0; i < groupPtr->numWindows; i++) {
+           if (groupPtr->windows[i] != tkwin) {
+               continue;
+           }
+           if ((i+1) < groupPtr->numWindows) {
+               memcpy((VOID *) (groupPtr->windows + i),
+                       (VOID *) (groupPtr->windows + i + 1),
+                       (groupPtr->numWindows - (i+1))*sizeof(Tk_Window *));
+           }
+           groupPtr->numWindows--;
+           Tk_DeleteEventHandler(tkwin,
+                   ButtonPressMask|ButtonReleaseMask|PointerMotionMask,
+                   ShareEventProc, (ClientData) groupPtr);
+           if (groupPtr->numWindows == 0) {
+               DeleteGroup(groupPtr);
+           }
+           return;
+       }
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DeleteGroup --
+ *
+ *     This procedure is called when a group has no more members.
+ *     It deletes the group from the list of existing groups.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Memory gets freed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DeleteGroup(groupPtr)
+    Group *groupPtr;                   /* Group to delete. */
+{
+    if (groupList == groupPtr) {
+       groupList = groupPtr->nextPtr;
+    } else {
+       register Group *prevPtr;
+
+       for (prevPtr = groupList; ; prevPtr = prevPtr->nextPtr) {
+           if (prevPtr == NULL) {
+               panic("DeleteGroup couldn't find group on shareList");
+           }
+           if (prevPtr->nextPtr == groupPtr) {
+               prevPtr->nextPtr = groupPtr->nextPtr;
+               break;
+           }
+       }
+    }
+    ckfree((char *) groupPtr->windows);
+    ckfree((char *) groupPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ShareEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher when an event
+ *     occurs for which we need to implement sharing.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If the mouse is actually in a window other than the one for
+ *     which the event occurred, generate a new event translated to
+ *     that window.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ShareEventProc(clientData, eventPtr)
+    ClientData clientData;             /* Information about share group. */
+    register XEvent *eventPtr;         /* Event that just occurred. */
+{
+    register Group *groupPtr = (Group *) clientData;
+    register Tk_Window tkwin;
+    Window window;
+    XEvent newEvent, *savedActive, *savedShareEventPtr;
+    int i, x, y;
+    Tk_Uid savedId;
+    register Group *grpPtr;
+
+    /*
+     * If this event was a synthetic one that we generated, then
+     * don't bother to process it again.
+     */
+
+    if (groupPtr->activeEvent == eventPtr) {
+       return;
+    }
+    savedActive = groupPtr->activeEvent;
+    groupPtr->activeEvent = &newEvent;
+    savedId = groupPtr->groupId;
+
+    savedShareEventPtr = tkShareEventPtr;
+    tkShareEventPtr = &newEvent;
+
+    /*
+     * Scan through all of the windows for this group to find the
+     * first one (if any) that contains the event.
+     */
+
+    tkwin = NULL;              /* Not needed, but stops compiler warning. */
+    for (i = 0; i < groupPtr->numWindows; i++) {
+       Tk_Window tkwin2;
+
+       tkwin = groupPtr->windows[i];
+       Tk_GetRootCoords(tkwin, &x, &y);
+       x = eventPtr->xmotion.x_root - x - Tk_Changes(tkwin)->border_width;
+       y = eventPtr->xmotion.y_root - y - Tk_Changes(tkwin)->border_width;
+       if ((x < 0) || (y < 0) || (x >= Tk_Width(tkwin))
+               || (y >= Tk_Height(tkwin))) {
+           continue;
+       }
+       for (tkwin2 = tkwin; ; tkwin2 = Tk_Parent(tkwin2)) {
+           if (tkwin2 == NULL) {
+               goto foundWindow;
+           }
+           if (!Tk_IsMapped(tkwin2)) {
+               break;
+           }
+           if (((Tk_FakeWin *) (tkwin2))->flags & TK_TOP_LEVEL) {
+               goto foundWindow;
+           }
+       }
+    }
+
+    foundWindow:
+    window = None;     /* Not really needed but stops compiler warning. */
+    if (i >= groupPtr->numWindows) {
+       tkwin = NULL;
+    } else {
+       window = Tk_WindowId(tkwin);
+    }
+
+    /*
+     * SPECIAL NOTE:  it is possible that any or all of the information
+     * in groupPtr could be modified as part of the processing of the
+     * events that we generate and hand to Tk_HandleEvent below.  For this
+     * to work smoothly, it is imperative that we extract any information
+     * we need from groupPtr (and from tkwin's, since they could be
+     * deleted) before the first call to Tk_HandleEvent below.  The code
+     * below may potentially pass an X window identifier to Tk_HandleEvent
+     * after the window has been deleted, but as long as identifiers
+     * aren't recycled Tk_HandleEvent will simply discard the event if
+     * this occurs.
+     */
+
+    /*
+     * If the pointer is in a different window now than the last time
+     * we were invoked, send a LeaveNotify event to the old window and
+     * an EnterNotify event to the new window.
+     */
+
+    newEvent = *eventPtr;
+    newEvent.xany.send_event = True;
+    if (tkwin != groupPtr->lastWindow) {
+       newEvent = *eventPtr;
+       newEvent.xany.send_event = True;
+       newEvent.xcrossing.mode = TK_NOTIFY_SHARE;
+       newEvent.xcrossing.detail = NotifyAncestor;
+       newEvent.xcrossing.same_screen = True;
+       newEvent.xcrossing.state = eventPtr->xmotion.state;
+       if (groupPtr->lastWindow != NULL) {
+           newEvent.xcrossing.type = LeaveNotify;
+           newEvent.xcrossing.window = Tk_WindowId(groupPtr->lastWindow);
+           Tk_GetRootCoords(groupPtr->lastWindow, &newEvent.xcrossing.x,
+                   &newEvent.xcrossing.y);
+           newEvent.xcrossing.x = eventPtr->xmotion.x_root
+                   - newEvent.xcrossing.x
+                   - Tk_Changes(groupPtr->lastWindow)->border_width;
+           newEvent.xcrossing.y = eventPtr->xmotion.y_root
+                   - newEvent.xcrossing.y
+                   - Tk_Changes(groupPtr->lastWindow)->border_width;
+           Tk_HandleEvent(&newEvent);
+       }
+       if (tkwin != NULL) {
+           newEvent.xcrossing.type = EnterNotify;
+           newEvent.xcrossing.window = window;
+           newEvent.xcrossing.x = x;
+           newEvent.xcrossing.y = y;
+           Tk_HandleEvent(&newEvent);
+       }
+       groupPtr->lastWindow = tkwin;
+    }
+
+    /*
+     * If the pointer is in the window to which the event was sent,
+     * then we needn't do any forwarding at all.  Ditto if the pointer
+     * isn't in any window at all.
+     */
+
+    if ((tkwin != NULL) && (Tk_WindowId(tkwin) != eventPtr->xmotion.window)) {
+       newEvent = *eventPtr;
+       newEvent.xmotion.send_event = True;
+       newEvent.xmotion.window = window;
+       newEvent.xmotion.x = x;
+       newEvent.xmotion.y = y;
+       Tk_HandleEvent(&newEvent);
+    }
+
+    /*
+     * Only restore the activeEvent if the group still exists.
+     * (It could be deleted as a side effect of processing the event.)
+     */
+
+    for (grpPtr = groupList; grpPtr != NULL; grpPtr = grpPtr->nextPtr) {
+       if (grpPtr->groupId == savedId) {
+           groupPtr->activeEvent = savedActive;
+           break;
+       }
+    }
+
+    tkShareEventPtr = savedShareEventPtr;
+}
diff --git a/src/tk/tktcp.c b/src/tk/tktcp.c
new file mode 100644 (file)
index 0000000..fa5339c
--- /dev/null
@@ -0,0 +1,2956 @@
+/* tkTCP.c --
+ *
+ *     This file provides basic capabilities to establish a server,
+ * attached to a TCP/IP port, that attaches to a Tcl interpreter.
+ * Such servers provide a remote-procedure-call mechanism for Tcl
+ * without needing to resort to Tk's X-window-based complexities, and
+ * also allow access to services that are not bound to any particular
+ * display.
+ */
+
+static char RCSid [] =
+  "$Header: /cluster21/kennykb/src/tclTCP.1.0beta/RCS/tclTCP.c,v 1.7 1992/05/05 18:31:13 kennykb Exp kennykb $";
+/* $Source: /cluster21/kennykb/src/tclTCP.1.0beta/RCS/tclTCP.c,v $
+ * $Log: tclTCP.c,v $
+ * Revision 1.7  1992/05/05  18:31:13  kennykb
+ * Changed the flow through the `delete server' code to make it work even
+ * if a server is deleted while a client is active.
+ * The change avoids aborts at termination time if the server delete code
+ * is reached before the application exits.
+ *
+ * Revision 1.6  1992/03/04  20:04:00  kennykb
+ * Modified source code to use the Tcl configurator and corresponding include
+ * files.
+ *
+ * Revision 1.5  1992/02/25  15:21:30  kennykb
+ * Modifications to quiet warnings from gcc
+ * ,
+ *
+ * Revision 1.4  1992/02/24  19:30:30  kennykb
+ * Merged branches (a) updated tcpTrustedHost and (b) broken-out event mgr.
+ *
+ * Revision 1.3  1992/02/20  16:22:53  kennykb
+ * Event management code removed and broken out into a separate file,
+ * simpleEvent.c
+ *
+ * Revision 1.2.1.1  1992/02/24  19:12:30  kennykb
+ * Rewrote tcpTrustedHost to be more forgiving of unusual configurations.
+ * It now looks through all aliases for the local host and the loopback
+ * pseudo-host.
+ *
+ * Revision 1.2  1992/02/18  14:43:21  kennykb
+ * Fix for bug 920218.1 in `History' file.
+ *
+ * Revision 1.1  1992/02/14  19:57:51  kennykb
+ * Initial revision
+ *
+ */
+
+static char copyright [] = 
+  "Copyright (C) 1992 General Electric. All rights reserved."          ;
+
+/*
+ *   Permission to use, copy, modify, and distribute this
+ *   software and its documentation for any purpose and without
+ *   fee is hereby granted, provided that the above copyright
+ *   notice appear in all copies and that both that copyright
+ *   notice and this permission notice appear in supporting
+ *   documentation, and that the name of General Electric not be used in
+ *   advertising or publicity pertaining to distribution of the
+ *   software without specific, written prior permission.
+ *   General Electric makes no representations about the suitability of
+ *   this software for any purpose.  It is provided "as is"
+ *   without express or implied warranty.
+ *
+ *   This work was supported by the DARPA Initiative in Concurrent
+ *   Engineering (DICE) through DARPA Contract MDA972-88-C-0047.
+ */
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+
+/* Only some copies of netinet/in.h have the following defined. */
+
+#ifndef INADDR_LOOPBACK
+#ifdef __STDC__
+#define INADDR_LOOPBACK 0x7f000001UL
+#else
+#define INADDR_LOOPBACK (unsigned long) 0x7f000001L
+#endif /* __STDC__ */
+#endif /* INADDR_LOOPBACK */
+
+#include <signal.h>
+
+#include <tclInt.h>
+#include <tclUnix.h>
+#include <tk.h>
+#include "tkTCP.h"
+
+/* Kernel calls */
+
+/* There doesn't seem to be any place to get these....
+ * certainly not a portable one.
+ */
+
+extern int accept _ANSI_ARGS_((int, struct sockaddr *, int *));
+extern int bind _ANSI_ARGS_((int, const struct sockaddr *, int));
+extern int close _ANSI_ARGS_((int));
+extern int connect _ANSI_ARGS_((int, const struct sockaddr *, int));
+extern int gethostname _ANSI_ARGS_((char *, int));
+extern int getsockname _ANSI_ARGS_((int, struct sockaddr *, int *));
+extern int ioctl _ANSI_ARGS_((int, int, char *));
+extern int listen _ANSI_ARGS_((int, int));
+extern int read _ANSI_ARGS_((int, char *, int));
+extern int select _ANSI_ARGS_((int, fd_set *, fd_set *, fd_set *,
+                              struct timeval *));
+extern int socket _ANSI_ARGS_((int, int, int));
+extern int getdtablesize _ANSI_ARGS_((void));
+
+\f
+/* Configuration parameters */
+
+/*
+ * TCP_LISTEN_BACKLOG gives the maximum backlog of connection requests
+ * that may be queued for any server
+ */
+
+#define TCP_LISTEN_BACKLOG 3
+
+/* Internal data structures */
+
+/*
+ * For each server that is established in any interpreter, there's a
+ * record of the following type.  Note that only one server may be
+ * running at a time in any interpreter, unless the Tk services are
+ * available for event management.
+ */
+
+typedef struct tcp_ServerData {
+  Tcl_Interp *         interp; /* Interpreter in which connections */
+                               /* are processed. */
+  char                 name[ 16 ];
+                               /* Name of the server object. */
+  int                  socketfd;
+                               /* Filedescriptor of the socket at */
+                               /* which the server listens for connections */
+  char *               command;
+                               /* Command to be executed (using */
+                               /* Tcl_Eval) when a connection request */
+                               /* arrives. */
+  Tcl_FreeProc *       freeCommand;
+                               /* Procedure to free the command when */
+                               /* it's no longer needed. */
+  int                  stopFlag;
+                               /* Flag == TRUE if the server is trying */
+                               /* to shut down. */
+  int                  raw;    /* Flag == TRUE if for raw socket mode. */
+  struct tcp_ClientData * firstClient;
+                               /* First in the list of clients at this */
+                               /* server */
+  struct tcp_ServerData * next, * prev;
+                               /* Linkage in the list of all active servers */
+} Tcp_ServerData;
+
+/*
+ * Each client of a server will have a record of the following type.
+ */
+
+typedef struct tcp_ClientData {
+  struct tcp_ServerData * server;
+                               /* Server to which the client belongs */
+  char                 name [16];
+                               /* Name of the client */
+  int                  socketfd;
+                               /* Filedescriptor of the socket of the */
+                               /* the client's connection. */
+  struct sockaddr_in   peeraddr;
+                               /* IP address from which the client */
+                               /* established the connection. */
+  char *               command;
+                               /* Command to execute when the client */
+                               /* sends a message */
+  Tcl_FreeProc *       freeCommand;
+                               /* Procedure to free the command when it's */
+                               /* no longer needed */
+  Tcl_CmdBuf           inputBuffer;
+                               /* Buffer where client commands are stored */
+  char *               resultString;
+                               /* Result of executing a command on the */
+                               /* client */
+  char *               resultPointer;
+                               /* Pointer to the portion of resultString */
+                               /* that remains to be transmitted back */
+                               /* to the client */
+  Tcl_FreeProc *       freeResultString;
+                               /* Procedure to free the result string when */
+                               /* it's no longer needed. */
+  int                  activeFlag;
+                               /* Flag == 1 iff a command is pending on */
+                               /* this client. */
+  int                  closeFlag;
+                               /* Flag == 1 if the client should be closed */
+                               /* once its result has been returned. */
+  struct tcp_ClientData *next, *prev;
+                               /* Next and previous entries in the list of */
+                               /* clients at this server */
+} Tcp_ClientData;
+
+/* Static variables in this file */
+
+static char * tcpCurrentClient = NULL;
+                               /* The name of the client for which a */
+                               /* command is being processed. */
+static Tcp_ServerData * tcpFirstServer = NULL;
+                               /* Pointer to the first in a list of */
+                               /* servers active in the current process. */
+\f
+/* Declarations for static functions within this file. */
+
+/* Static procedures in this file */
+
+static void simpleDeleteFileHandler1 _ANSI_ARGS_((ClientData, int));
+
+static void simpleDeleteFileHandler2 _ANSI_ARGS_((ClientData));
+
+static int
+tcpClientCommand _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp,
+                             int argc, char * * argv));
+
+static int
+tcpConnectCommand _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp,
+                             int argc, char * * argv));
+
+static int
+tcpEvalCommand _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp,
+                           int argc, char * * argv));
+
+static int
+tcpLoginCommand _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp,
+                            int argc, char * * argv));
+
+static int
+tcpMainLoopCommand _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp,
+                               int argc, char * * argv));
+
+static int
+tcpPollCommand _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp,
+                           int argc, char * * argv));
+
+static int
+tcpServerCommand _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp,
+                             int argc, char * * argv));
+
+static int
+tcpServersCommand _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp,
+                             int argc, char * * argv));
+static int
+tcpWaitCommand _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp,
+                            int argc, char * * argv));
+
+static int
+tcpServerObjectCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp,
+                               int argc, char * * argv));
+static void
+deleteTcpServerObjectCmd _ANSI_ARGS_((ClientData clientData));
+
+static int
+tcpServerObjectAcceptCmd _ANSI_ARGS_((ClientData clientData,
+                                     Tcl_Interp * interp, int argc,
+                                     char * * argv));
+
+static int
+tcpServerObjectClientsCmd _ANSI_ARGS_((ClientData clientData,
+                                      Tcl_Interp * interp, int argc,
+                                      char * * argv));
+
+static int
+tcpServerObjectConfigCmd _ANSI_ARGS_((ClientData clientData,
+                                     Tcl_Interp * interp, int argc,
+                                     char * * argv));
+
+static int
+tcpServerObjectStartCmd _ANSI_ARGS_((ClientData clientData,
+                                    Tcl_Interp * interp, int argc,
+                                    char * * argv));
+
+static int
+tcpServerObjectStopCmd _ANSI_ARGS_((ClientData clientData,
+                                   Tcl_Interp * interp, int argc,
+                                   char * * argv));
+
+static void
+tcpDeleteServer _ANSI_ARGS_((Tcp_ServerData * server));
+
+static int
+tcpServerObjectConfig _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp,
+                                  int argc, char * * argv));
+
+static int
+tcpClientObjectCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp,
+                               int argc, char * * argv));
+
+static int
+tcpClientObjectCloseCmd _ANSI_ARGS_((ClientData clientData,
+                                    Tcl_Interp * interp,
+                                    int argc, char * * argv));
+
+static int
+tcpClientObjectCommandCmd _ANSI_ARGS_((ClientData clientData,
+                                      Tcl_Interp * interp,
+                                      int argc, char * * argv));
+
+static int
+tcpClientObjectDoCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp * interp,
+                                 int argc, char * * argv));
+
+static int
+tcpClientObjectHostnameCmd _ANSI_ARGS_((ClientData clientData,
+                                       Tcl_Interp * interp,
+                                       int argc, char * * argv));
+
+static int
+tcpClientObjectServerCmd _ANSI_ARGS_((ClientData clientData,
+                                     Tcl_Interp * interp,
+                                     int argc, char * * argv));
+
+static void
+deleteTcpClientObjectCmd _ANSI_ARGS_((ClientData clientData));
+
+static int
+tcpConnectionObjectCmd _ANSI_ARGS_((ClientData clientData,
+                                   Tcl_Interp * interp,
+                                   int argc, char * * argv));
+
+static int
+tcpConnectionObjectCloseCmd _ANSI_ARGS_((ClientData clientData,
+                                        Tcl_Interp * interp,
+                                        int argc, char * * argv));
+
+static int
+tcpConnectionObjectSendCmd _ANSI_ARGS_((ClientData clientData,
+                                       Tcl_Interp * interp,
+                                       int argc, char * * argv));
+
+static void
+deleteTcpConnectionObjectCmd _ANSI_ARGS_((ClientData clientData));
+
+static void
+tcpServerAcceptConnection _ANSI_ARGS_((ClientData clientData, int mask));
+
+static void
+tcpReturnResultToClient _ANSI_ARGS_((Tcp_ClientData * client,
+                                    Tcl_Interp * interp,
+                                    int status, int closeflag));
+
+static void
+tcpWriteResultToClient _ANSI_ARGS_((ClientData clientData, int mask));
+
+static void
+tcpClientReadError _ANSI_ARGS_((Tcp_ClientData * client));
+
+static void
+tcpClientWriteError _ANSI_ARGS_((Tcp_ClientData * client));
+
+static void
+tcpPrepareClientForInput _ANSI_ARGS_((Tcp_ClientData * client));
+
+static void
+tcpReceiveClientInput _ANSI_ARGS_((ClientData clientData, int mask));
+
+static void
+tcpCloseClient _ANSI_ARGS_((Tcp_ClientData * client));
+
+static int
+tcpTrustedHost _ANSI_ARGS_((char * hostname));
+
+static int
+tcpSendCmdToServer _ANSI_ARGS_((Tcl_Interp * interp, int s, char * message));
+
+static int
+tcpReceiveResultFromServer _ANSI_ARGS_((Tcl_Interp * interp, int s));
+\f
+/*
+ * simpleReportBackgroundError --
+ *
+ *     This procedure is invoked to report a Tcl error in the background,
+ * when TCL_ERROR has been passed out to the outermost level.
+ *
+ *     It tries to run `bgerror' giving it  the error message.  If this
+ * fails, it reports the problem on stderr.
+ */
+
+void
+simpleReportBackgroundError (interp)
+     Tcl_Interp * interp;
+{
+
+  char *argv[2];
+  char *command;
+  char *error;
+  char *errorInfo, *tmp;
+  int status;
+  int unixStatus;
+
+  /* Get the error message out of the interpreter. */
+
+  error = (char *) ckalloc (strlen (interp -> result) + 1);
+  strcpy (error, interp -> result);
+
+  /* Get errorInfo, too */
+
+  tmp = Tcl_GetVar (interp, "errorInfo", TCL_GLOBAL_ONLY);
+  if (tmp == NULL) {
+    errorInfo = error;
+  } else {
+    errorInfo = (char *) ckalloc (strlen (tmp) + 1);
+    strcpy (errorInfo, tmp);
+  }
+
+  /* Build a `bgerror' command to report the error */
+
+  argv[0] = "bgerror";
+  argv[1] = error;
+  command = Tcl_Merge (2, argv);
+
+  /* Try to run the command */
+
+  status = Tcl_Eval (interp, command, 0, (char **) NULL);
+
+  if (status != TCL_OK) {
+
+    /* Command failed.  Report the problem to stderr. */
+
+    tmp = Tcl_GetVar (interp, "errorInfo", TCL_GLOBAL_ONLY);
+    if (tmp == NULL) {
+      tmp = interp -> result;
+    }
+    unixStatus = fprintf (stderr, "\n\
+------------------------------------------------------------------------\n\
+Tcl interpreter detected a background error.\n\
+Original error:\n\
+%s\n\
+\n\
+User \"bgerror\" procedure failed to handle the background error.\n\
+Error in bgerror:\n\
+%s\n",
+            errorInfo, tmp);
+    if (unixStatus < 0) {
+      abort ();
+    }
+  }
+
+  Tcl_ResetResult (interp);
+
+  free (command);
+
+  ckfree (error);
+
+  if (errorInfo != error) {
+    ckfree (errorInfo);
+  }
+}
+\f
+/*
+ * simpleCreateFileHandler --
+ *
+ *     This procedure is invoked to create a handle to cause a callback
+ *     whenever a condition (readable, writable, exception) is
+ *     present on a given file.
+ *
+ *     In the Tk environment, the file handler is created using Tk's
+ *     Tk_CreateFileHandler procedure, and the callback takes place
+ *     from the Tk main loop.  In a non-Tk environment, a
+ *     Tcp_FileHandler structure is created to describe the file, and
+ *     this structure is linked to a chain of such structures
+ *     processed by the server main loop.
+ */
+
+void
+simpleCreateFileHandler (fd, mask, proc, clientData)
+     int fd;
+     int mask;
+     Tk_FileProc * proc;
+     ClientData clientData;
+{
+  Tk_CreateFileHandler (fd, mask, (Tk_FileProc *) proc, clientData);
+
+  /* It is possible that we have a file handler scheduled for deletion.
+   * This deletion has to be cancelled if we've requested creation of
+   * another one.
+   */
+
+  Tk_CancelIdleCall ((Tk_IdleProc *) simpleDeleteFileHandler2,
+                    (ClientData) fd);
+}
+\f
+/*
+ * simpleDeleteFileHandler --
+ *
+ *     This function is invoked when the program is no longer interested in
+ * handling events on a file.  It removes any outstanding handler on the file.
+ *
+ *     The function is a little tricky because a file handler on the file may
+ * be active.  In a non-Tk environment, this is simple; the SIMPLE_DELETE flag
+ * is set in the handler's mask, and the main loop deletes the handler once
+ * it is quiescent.  In Tk, the event loop won't do that, so what we do
+ * is set a DoWhenIdle to delete the handler and return.  The DoWhenIdle
+ * gets called back from the Tk event loop at a time that the handler is
+ * quiescent, and deletes the handler.
+ */
+
+void
+simpleDeleteFileHandler (fd)
+     int fd;
+{
+  /* First of all, we have to zero the file's mask to avoid calling the same
+     handler over again if the file is still ready. */
+  Tk_CreateFileHandler (fd, 0, (Tk_FileProc *) simpleDeleteFileHandler1,
+                       (ClientData) NULL);
+  Tk_DoWhenIdle ((Tk_IdleProc *) simpleDeleteFileHandler2,
+                (ClientData) fd);
+}
+
+
+/* ARGSUSED */
+static void
+simpleDeleteFileHandler1 (clientData, mask)
+     ClientData clientData;
+     int mask;
+{
+  (void) fprintf (stderr, "in simpleDeleteFileHandler1: bug in tkEvent.c");
+  abort ();
+}
+
+static void
+simpleDeleteFileHandler2 (clientData)
+     ClientData clientData;
+{
+  int fd = (int) clientData;
+
+  Tk_DeleteFileHandler (fd);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ * Tk_TcpCmd:
+ *
+ * This procedure implements a `tcp' command for Tcl.  It provides the
+ * top-level actions for TCP/IP connections.
+ *
+ * This command is divided into variants, each with its own procedure:
+ *
+ *     tcp client
+ *             Returns the current active client, or an error if there is
+ *             none.
+ *     tcp connect host port
+ *             Establish a connection to a server running at `port' on
+ *             `host.'
+ *     tcp eval client command
+ *             Do default command processing for command "$command",
+ *             originating at client "$client".
+ *     tcp login client
+ *             Do default login processing for $client.
+ *     tcp mainloop
+ *             Start the main loop for a server or group of servers.
+ *     tcp poll
+ *             Poll for whether servers have work to do.
+ *     tcp servers
+ *             Returns a list of the currently active servers.
+ *     tcp server ?args?
+ *             Set up a server to run in the current interpreter.
+ *     tcp wait
+ *             Wait for a server to have work to do.
+ *----------------------------------------------------------------------
+ */
+
+int
+Tk_TcpCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  char c;
+  unsigned length;
+
+  if (argc < 2) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [0],
+                     " command ?args?\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  c = argv [1] [0];
+  length = strlen (argv [1]);
+
+  if ((c == 'c') && (length >= 2) &&
+      (strncmp (argv [1], "client", length) == 0)) {
+    return tcpClientCommand (clientData, interp, argc-1, argv+1);
+  }
+  if ((c == 'c') && (length >= 2) &&
+      (strncmp (argv [1], "connect", length) == 0)) {
+    return tcpConnectCommand (clientData, interp, argc-1, argv+1);
+  }
+  if ((c == 'e') && (strncmp (argv [1], "eval", length) == 0)) {
+    return tcpEvalCommand (clientData, interp, argc-1, argv+1);
+  }
+  if ((c == 'l') && (strncmp (argv [1], "login", length) == 0)) {
+    return tcpLoginCommand (clientData, interp, argc-1, argv+1);
+  }
+  if ((c == 'm') && (strncmp (argv [1], "mainloop", length) == 0)) {
+    return tcpMainLoopCommand (clientData, interp, argc-1, argv+1);
+  }
+  if ((c == 'p') && (strncmp (argv [1], "poll", length) == 0)) {
+    return tcpPollCommand (clientData, interp, argc-1, argv+1);
+  }
+  if ((c == 's') && (length >= 7)
+      && (strncmp (argv [1], "servers", length) == 0)) {
+    return tcpServersCommand (clientData, interp, argc-1, argv+1);
+  }
+  if ((c == 's') && (strncmp (argv [1], "server", length) == 0)) {
+    return tcpServerCommand (clientData, interp, argc-1, argv+1);
+  }
+  if ((c == 'w') && (strncmp (argv [1], "wait", length) == 0)) {
+    return tcpWaitCommand (clientData, interp, argc-1, argv+1);
+  }
+  Tcl_AppendResult (interp, "bad option \"", argv [1],
+                   "\": should be client, eval, login,",
+                   " mainloop, poll, servers, server or wait",
+                   (char *) NULL);
+  return TCL_ERROR;
+
+}
+\f
+/*
+ * tcpClientCommand --
+ *
+ *     This procedure is invoked to process the "tcp client" Tcl command.
+ * It returns the name of the currently-active client, or an error if there
+ * is none.
+ */
+
+/* ARGSUSED */
+static int
+tcpClientCommand (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  /* Check syntax */
+
+  if (argc != 1) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [-1], " ",
+                     argv [0], "\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Make sure there is a current client */
+
+  if (tcpCurrentClient == NULL) {
+    Tcl_SetResult (interp, "no current client", TCL_STATIC);
+    return TCL_ERROR;
+  }
+
+  Tcl_SetResult (interp, tcpCurrentClient, TCL_VOLATILE);
+  return TCL_OK;
+}
+\f
+/* tcpConnectCommand --
+ *
+ *     This procedure is invoked to process the "tcp connect" Tcl command.
+ * It takes two arguments: a host name and a port.  It tries to establish a
+ * connection to the specified port and host.
+ */
+
+/* ARGSUSED */
+static int
+tcpConnectCommand (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  struct hostent * host;
+  struct sockaddr_in sockaddr;
+  int haddr;
+  int port;
+  int status;
+  int f;
+  char name [20];
+
+  /* Check syntax */
+
+  if (argc != 3) {
+    Tcl_AppendResult (interp, "wrong # args, should be \"", argv [-1], " ",
+                     argv [0], " hostname port#\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Decode the host name */
+
+  sockaddr.sin_family = AF_INET;
+  host = gethostbyname (argv [1]);
+  if (host != NULL) {
+    memcpy ((char *) &(sockaddr.sin_addr.s_addr),
+           (char *) (host -> h_addr_list [0]),
+           (size_t) (host -> h_length));
+  } else {
+    haddr = inet_addr (argv [1]);
+    if (haddr == -1) {
+      Tcl_AppendResult (interp, argv[1], ": host unknown", (char *) NULL);
+      return TCL_ERROR;
+    }
+    sockaddr.sin_addr.s_addr = haddr;
+  }
+
+  /* Decode the port number */
+
+  status = Tcl_GetInt (interp, argv [2], &port);
+  if (status) return status;
+  sockaddr.sin_port = htons (port);
+
+  /* Make a socket to talk to the server */
+
+  f = socket (AF_INET, SOCK_STREAM, 0);
+  if (f < 0) {
+    Tcl_AppendResult (interp, "can't create socket: ",
+                     Tcl_UnixError (interp), (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Connect to the server */
+
+  status = connect (f, (struct sockaddr *) &sockaddr, sizeof sockaddr);
+  if (status < 0) {
+    Tcl_AppendResult (interp, "can't connect to server: ",
+                     Tcl_UnixError (interp), (char *) NULL);
+    (void) close (f);
+    return TCL_ERROR;
+  }
+
+  /* Get the server's greeting message */
+
+  status = tcpReceiveResultFromServer (interp, f);
+
+  if (status == TCL_OK) {
+
+    /* Stash the greeting, make the connection object and return it. */
+
+    sprintf (name, "tcp_connection_%d", f);
+    (void) Tcl_SetVar2 (interp, "tcp_greeting", name, interp -> result,
+                       TCL_GLOBAL_ONLY);
+    Tcl_CreateCommand (interp, name, (Tcl_CmdProc *) tcpConnectionObjectCmd,
+                      (ClientData) f,
+                      (Tcl_CmdDeleteProc *) deleteTcpConnectionObjectCmd);
+    Tcl_SetResult (interp, name, TCL_VOLATILE);
+    return TCL_OK;
+  } else {
+
+    /* Error reading greeting, quit */
+
+    (void) close (f);
+    return TCL_ERROR;
+  }
+}    
+\f
+/*
+ * tcpEvalCommand --
+ *
+ *     This procedure is invoked to process the "tcp eval" Tcl command.
+ * "tcp eval" is the default command invoked to process connections once
+ * a connection has been accepted by "tcp login".
+ */
+
+/* ARGSUSED */
+static int
+tcpEvalCommand (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  int status;
+
+  /* Argc == 2 means that we're logging out a client.  Default is to ignore
+   * the logout.
+   */
+
+  if (argc == 2) {
+    return TCL_OK;
+  }
+
+  /* Three-argument form is a command from a client.  Default is to eval
+   * the command */
+
+  if (argc != 3) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [-1],
+                     " ", argv [0], " client command\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  status = Tcl_Eval (interp, argv [2], 0, (char * *) NULL);
+  return status;
+}  
+\f
+/*
+ * tcpLoginCommand --
+ *
+ *     This procedure is invoked to process the "tcp login" Tcl command.
+ * It is the default command procedure at initial connection to a server.
+ * It is invoked with the name of a client.  It returns TCL_OK, together
+ * with a greeting message, if the login succeeds, and TCL_ERROR, together
+ * with a denial message, if it fails.
+ *
+ *     The authentication procedure is as follows:
+ *
+ * - If the client is on the local host, the connection is accepted.
+ * - If the client's IP address is the same as the local host's IP address,
+ *   the connection is accepted.
+ * - Otherwise, the connection is refused.
+ *
+ *     Obviously, there are other authentication techniques.  The use can
+ * replace this command with an arbitrary Tcl script.
+ */
+
+/*ARGSUSED*/
+static int
+tcpLoginCommand (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  char * hostName;             /* Name of the client's host */
+  int status;
+
+  /* Check command syntax */
+
+  if (argc != 2) {
+    Tcl_AppendResult (interp, "wrong # args; should be \"", argv [-1], " ",
+                     argv [0], " clientName\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Get the hostname by doing $client hostname */
+
+  status = Tcl_VarEval (interp, argv [1], " hostname", (char *) NULL);
+  if (status == TCL_OK) {
+    hostName = (char *) ckalloc (strlen (interp -> result) + 1);
+    strcpy (hostName, interp -> result);
+
+    /* Check that the host is trusted */
+    
+    if (tcpTrustedHost (hostName)) {
+
+      /* Change the command to `tcp eval' for next time */
+
+      status = Tcl_VarEval (interp, argv [1], " command {tcp eval}",
+                           (char *) NULL);
+
+
+      if (status == TCL_OK) {
+
+       /* Return a greeting message */
+
+       Tcl_ResetResult (interp);
+       Tcl_AppendResult (interp, "GE DICE TCP-based Tcl server\n", RCSid,
+                         "\n", copyright, (char *) NULL);
+
+       return TCL_OK;
+
+      }
+
+    }
+
+    ckfree ((char *) hostName);
+  }
+
+  /* Host isn't trusted or one of the commands failed. */
+
+  Tcl_SetResult (interp, "Permission denied", TCL_STATIC);
+  return TCL_ERROR;
+}
+\f
+/*
+ * tcpMainLoopCommand:
+ *
+ *     This procedure is invoked in a non-Tk environment when the server
+ * implementor wishes to use a main loop built into the library.  It
+ * repeatedly polls ofr work to be done, returning only when the last server
+ * is closed.
+ *
+ *     In a Tk environment, the procedure returns immediately.
+ */
+
+/*ARGSUSED*/
+static int
+tcpMainLoopCommand (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+
+  int status;
+
+  if (argc != 1) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [-1],
+                     " ", argv [0], "\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  errno = 0; status = -1;
+
+  /* In a non-Tk environment, errno has a Unix error or 0 for no clients
+   * or servers.  In a Tk environment, errno is zero at this point.
+   */
+
+  if (errno != 0) {
+    Tcl_AppendResult (interp, "select: ", Tcl_UnixError (interp),
+                     (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  return TCL_OK;
+}
+
+\f
+/*
+ * tcpPollCommand:
+ *
+ *     This procedure is invoked to process the "tcp poll" Tcl
+ * command.  It requests that pending events for the servers be processed.
+ * It returns a count of events that were processed successfully.
+ *
+ *     In a Tk environment, the procedure reports that no servers are known
+ * to the event handler.  This is correct -- servers register with Tk, not
+ * with the simple event handler.
+ */
+
+/*ARGSUSED*/
+static int
+tcpPollCommand (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  int status;
+
+  if (argc != 1) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [-1],
+                     " ", argv [0], "\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Do the poll */
+
+  errno = 0; status = -1;
+
+  /* Check for trouble */
+
+  if (status < 0) {
+    if (errno == 0) {
+      Tcl_SetResult (interp, "no servers known to event handler", TCL_STATIC);
+    } else {
+      Tcl_AppendResult (interp, "select: ", Tcl_UnixError (interp),
+                       (char *) NULL);
+    }
+    return TCL_ERROR;
+  }
+
+  /* Return the number of events processed. */
+
+  sprintf (interp -> result, "%d", status);
+  return TCL_OK;
+}
+\f
+/* tcpServerCommand:
+ *
+ *     This procedure is invoked to process the "tcp server" Tcl
+ * command.  It requests that a server be created to listen at a
+ * TCP/IP port, whose number may be assigned by the system or
+ * specified by the user with the "-port" option.
+ *
+ *     A command string is supplied for use when the server begins to
+ * accept connections.  See the documentation of tcpServerObjectCmd
+ * for a description of the command string.
+ *
+ *     If the server is created successfully, the return value will
+ * be the name of a "server object" that can be used for future
+ * actions upon the server.  This object will be usable as a Tcl
+ * command; the command is processed by the tcpServerObjectCmd function.
+ *
+ * Syntax:
+ *     tcp server ?-port #? ?-command string?
+ * 
+ * Results:
+ *     A standard Tcl result.  Return value is the name of the server
+ *     object, which may be invoked as a Tcl command (see
+ *     tcpServerObjectCmd for details).
+ */
+
+/* ARGSUSED */
+static int
+tcpServerCommand (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  int unixStatus;
+  int one;
+  char * message;
+  char * nargv [3];
+  int nargc;
+
+  /* Create a structure to hold the tcp server's description. */
+
+  Tcp_ServerData * server =
+    (Tcp_ServerData *) ckalloc (sizeof (Tcp_ServerData));
+
+  /* Set up the interpreter and the default command. Clear the list of
+   * clients. */
+
+  server -> interp = interp;
+  server -> command = "tcp login";
+  server -> freeCommand = TCL_STATIC;
+  server -> stopFlag = 0;
+  server -> raw = 0;
+  server -> firstClient = (Tcp_ClientData *) NULL;
+
+  /* Create the socket at which the server will listen. */
+
+  server -> socketfd = socket (AF_INET, SOCK_STREAM, 0);
+  if (server -> socketfd < 0) {
+    Tcl_AppendResult (interp, "can't create socket: ",
+                     Tcl_UnixError (interp), (char *) NULL);
+  } else {
+
+    /* Set up the socket for non-blocking I/O. */
+
+    one = 1;
+    unixStatus = ioctl (server -> socketfd, FIONBIO, (char *) &one);
+    if (unixStatus < 0) {
+      Tcl_AppendResult (interp, "can't set non-blocking I/O on socket: ",
+                       Tcl_UnixError (interp), (char *) NULL);
+    } else {
+
+      /* Server structure has been created and socket has been opened.
+       * Now configure the server.
+       */
+
+      if (tcpServerObjectConfig ((ClientData) server, interp, argc, argv)
+         == TCL_OK)
+       {
+
+         /* Link the server on the list of active servers */
+
+         if (tcpFirstServer)
+           tcpFirstServer -> prev = server;
+         server -> next = tcpFirstServer;
+         tcpFirstServer = server;
+         server -> prev = NULL;
+
+         /* Add the server object command */
+         
+         sprintf (server -> name, "tcp_server_%d", server -> socketfd);
+
+         Tcl_CreateCommand (interp, server -> name,
+                            (Tcl_CmdProc *) tcpServerObjectCmd,
+                            (ClientData) server,
+                            (Tcl_CmdDeleteProc *) deleteTcpServerObjectCmd);
+
+         Tcl_SetResult (interp, server -> name, TCL_STATIC);
+         
+         return TCL_OK;
+
+       }
+    }
+
+    /* Error in configuring the server.  Trash the socket. */
+    
+    unixStatus = close (server -> socketfd);
+    if (unixStatus < 0) {
+      nargc = 3;
+      nargv [0] = "(also failed to close socket: ";
+      nargv [1] = Tcl_UnixError (interp);
+      nargv [2] = ")";
+      message = Tcl_Concat (nargc, nargv);
+      Tcl_AddErrorInfo (interp, message);
+      free (message);
+    }
+  }
+      
+  /* Error in creating the server -- get rid of the data structure */
+
+  if (server -> freeCommand != NULL) {
+    (*(server -> freeCommand)) (server -> command);
+  }
+  ckfree ((char *) server);
+  return TCL_ERROR;
+}
+\f
+/*
+ * tcpServersCommand:
+ *
+ *     The following procedure is invoked to process the `tcp servers' Tcl
+ * command.  It returns a list of the servers that are currently known.
+ */
+
+/* ARGSUSED */
+static int
+tcpServersCommand (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  Tcp_ServerData * server;
+
+  /* Check syntax */
+
+  if (argc != 1) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [-1], " ",
+                     argv [0], "\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  for (server = tcpFirstServer; server != NULL; server = server -> next) {
+    Tcl_AppendElement (interp, server -> name, 0);
+  }
+
+  return TCL_OK;
+}
+\f
+/*
+ * tcpWaitCommand:
+ *
+ *     This procedure is invoked to process the "tcp wait" Tcl
+ * command.  It requests that the process delay until an event is
+ * pending for a TCP server.
+ *
+ * It returns a count of pending events.
+ *
+ *     In a Tk environment, the procedure returns an error message stating
+ * that no servers are known to the event handler.  This is correct.  The
+ * servers register with Tk's event handler, and are not known to the simple
+ * event handler.
+ */
+
+/*ARGSUSED*/
+static int
+tcpWaitCommand (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  int status;
+
+  if (argc != 1) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [-1],
+                     " ", argv [0], "\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Do the poll */
+
+  errno = 0; status = -1;
+
+  /* Check for trouble */
+
+  if (status < 0) {
+    if (errno == 0) {
+      Tcl_SetResult (interp, "no servers known to event handler", TCL_STATIC);
+    } else {
+      Tcl_AppendResult (interp, "select: ", Tcl_UnixError (interp),
+                       (char *) NULL);
+    }
+    return TCL_ERROR;
+  }
+
+  /* Return the number of events pending. */
+
+  sprintf (interp -> result, "%d", status);
+  return TCL_OK;
+}
+\f
+/*
+ * tcpServerObjectCmd --
+ *
+ *     This procedure is invoked when a command is called on a server
+ *     object directly.  It dispatches to the appropriate command processing
+ *     procedure to handle the command.
+ *
+ * $server accept
+ *     [Internal call] - Accept a connection.
+ * $server clients
+ *     Return a list of all clients connected to a server.
+ * $server configure ?args?
+ *     Revise or query a server's configuration.
+ * $server start
+ *     Start a server running.
+ * $server stop
+ *     Terminate a server.
+ */
+
+static int
+tcpServerObjectCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  int c;
+  unsigned length;
+
+  if (argc < 2) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [0],
+                     " command ?args?\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  c = argv [1] [0];
+  length = strlen (argv [1]);
+  
+  if (c == 'a' && strncmp (argv [1], "accept", length) == 0) {
+    return tcpServerObjectAcceptCmd (clientData, interp, argc-1, argv+1);
+  }
+  if (c == 'c' && length >= 2 && strncmp (argv [1], "clients", length) == 0) {
+    return tcpServerObjectClientsCmd (clientData, interp, argc-1, argv+1);
+  }
+  if (c == 'c' && length >= 2
+      && strncmp (argv [1], "configure", length) == 0) {
+    return tcpServerObjectConfigCmd (clientData, interp, argc-1, argv+1);
+  }
+  if (c == 's' && length >= 3 && strncmp (argv [1], "start", length) == 0) {
+    return tcpServerObjectStartCmd (clientData, interp, argc-1, argv+1);
+  }
+  if (c == 's' && length >= 3 && strncmp (argv [1], "stop", length) == 0) {
+    return tcpServerObjectStopCmd (clientData, interp, argc-1, argv+1);
+  }
+  Tcl_AppendResult (interp, argv [0], ": ", "bad option \"", argv [1],
+                   "\": should be clients, configure, start, or stop",
+                   (char *) NULL);
+  return TCL_ERROR;
+}
+\f
+/*
+ * tcpServerObjectAcceptCmd --
+ *
+ *     The following procedure handles the `accept' command on a
+ *     server object.  It is called in the background by
+ *     tcpServerAcceptConnection when a connection request appears on
+ *     a server.  It is responsible for creating the client and
+ *     accepting the connection request.
+ *
+ * Results:
+ *     Returns a standard TCL result.  The return value is the name
+ *     of the client if the call is successful.
+ *
+ * Side effects:
+ *     A Tcl command named after the client object is created.
+ */
+
+static int
+tcpServerObjectAcceptCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  register Tcp_ServerData * server = (Tcp_ServerData *) clientData;
+  register Tcp_ClientData * client;
+  int rubbish;
+  int unixStatus;
+  int nargc;
+  char * nargv [3];
+  char * message;
+
+  /* Check command syntax */
+
+  if (argc != 1) {
+    Tcl_AppendResult (interp, "wrong # args, should be \"", argv [-1], " ",
+                     argv [0], "\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Create the client data structure */
+
+  client = (Tcp_ClientData *) ckalloc (sizeof (Tcp_ClientData));
+
+  /* Accept the client's connection request */
+
+  rubbish = sizeof (struct sockaddr_in);
+  client -> socketfd = accept (server -> socketfd,
+                              (struct sockaddr *) &(client -> peeraddr),
+                              &rubbish);
+  if (client -> socketfd < 0) {
+    Tcl_AppendResult (interp, "can't accept connection: ",
+                     Tcl_UnixError (interp), (char *) NULL);
+    ckfree ((char *) client);
+    return TCL_ERROR;
+  }
+
+  /* Set up the socket for non-blocking I/O */
+
+  rubbish = 1;
+  unixStatus = ioctl (client -> socketfd, FIONBIO, (char *) &rubbish);
+  if (unixStatus < 0) {
+    Tcl_AppendResult (interp,
+                     "can't set non-blocking I/O on client's socket: ",
+                     Tcl_UnixError (interp), (char *) NULL);
+    unixStatus = close (client -> socketfd);
+    if (unixStatus < 0) {
+      nargc = 3;
+      nargv [0] = "(also failed to close socket: ";
+      nargv [1] = Tcl_UnixError (interp);
+      nargv [2] = ")";
+      message = Tcl_Concat (nargc, nargv);
+      Tcl_AddErrorInfo (interp, message);
+      free (message);
+    }
+    ckfree ((char *) client);
+    return TCL_ERROR;
+  }
+
+  /* Set up the client's description */
+
+  client -> server = server;
+  sprintf (client -> name, "tcp_client_%d", client -> socketfd);
+  client -> command = malloc (strlen (server -> command) + 1);
+  client -> freeCommand = (Tcl_FreeProc *) free;
+  strcpy (client -> command, server -> command);
+  client -> inputBuffer = Tcl_CreateCmdBuf ();
+  client -> resultString = client -> resultPointer = (char *) NULL;
+  client -> freeResultString = (Tcl_FreeProc *) NULL;
+  client -> activeFlag = 0;
+  client -> closeFlag = 0;
+  client -> next = server -> firstClient;
+  if (client -> next != NULL) {
+    client -> next -> prev = client;
+  }
+  client -> prev = NULL;
+  server -> firstClient = client;
+
+  /* Create the Tcl command for the client */
+  
+  Tcl_CreateCommand (interp, client -> name,
+                    (Tcl_CmdProc *) tcpClientObjectCmd,
+                    (ClientData) client,
+                    (Tcl_CmdDeleteProc *) deleteTcpClientObjectCmd);
+
+  /* Return the client's name */
+
+  Tcl_SetResult (interp, client -> name, TCL_STATIC);
+  return TCL_OK;
+}
+\f
+/*
+ * tcpServerObjectClientsCmd --
+ *
+ *     This procedure in invoked in response to the `clients' command
+ * on a TCP server object.  It returns a list of clients for the server.
+ */
+
+static int
+tcpServerObjectClientsCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  Tcp_ServerData * server = (Tcp_ServerData *) clientData;
+  Tcp_ClientData * client;
+
+  /* Check syntax */
+
+  if (argc != 1) {
+    Tcl_AppendResult (interp, "wrong # args, should be\"", argv [-1], " ",
+                     argv [0], "\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  for (client = server -> firstClient; client != NULL;
+       client = client -> next) {
+    Tcl_AppendElement (interp, client -> name, 0);
+  }
+
+  return TCL_OK;
+}
+\f
+/*
+ * tcpServerObjectConfigCmd --
+ *
+ *     This procedure is invoked in response to the `config' command
+ *     on a TCP server object.  With no arguments, it returns a list
+ *     of valid arguments.  With one argument, it returns the current
+ *     value of that option.  With multiple arguments, it attempts to
+ *     configure the server according to that argument list.
+ * Results:
+ *     Returns a standard Tcl result.
+ */
+
+static int
+tcpServerObjectConfigCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  int unixStatus;
+  int c;
+  unsigned length;
+
+  /* No arguments -- return a list of valid options. */
+
+  if (argc <= 1) {
+    Tcl_SetResult (interp, "-command -port", TCL_STATIC);
+    return TCL_OK;
+  }
+
+  /* One argument -- query a particular option */
+
+  if (argc == 2) {
+    register Tcp_ServerData * server = (Tcp_ServerData *) clientData;
+    char * arg = argv [1];
+
+    if (arg [0] != '-') {
+      Tcl_AppendResult (interp, argv [-1], " ", argv [0],
+                       ": bad option \"", arg,
+                       "\" -- each option must begin with a hyphen.",
+                       (char *) NULL);
+      return TCL_ERROR;
+
+    }
+
+    length = strlen (++arg);
+    c = arg [0];
+
+    if (c == 'c' && strncmp (arg, "command", length) == 0) {
+
+      /* Command option -- Get the command name */
+
+      Tcl_SetResult (interp, server->name, TCL_STATIC);
+      return TCL_OK;
+
+    }
+
+    if (c == 'p' && strncmp (arg, "port", length) == 0) {
+
+      /* Port option -- Get the port number */
+
+      struct sockaddr_in portaddr;
+      int rubbish = sizeof (struct sockaddr_in);
+
+      unixStatus = getsockname (server -> socketfd,
+                               (struct sockaddr *) &portaddr, &rubbish);
+      if (unixStatus < 0) {
+       Tcl_AppendResult (interp, argv [-1], ": can't read port #: ",
+                         Tcl_UnixError (interp), (char *) NULL);
+       return TCL_ERROR;
+      }
+      Tcl_ResetResult (interp);
+      sprintf (interp -> result, "%d", (int) ntohs (portaddr.sin_port));
+      return TCL_OK;
+    }
+       
+    /* Unknown option */
+
+    Tcl_AppendResult (interp, argv [-1], ": unknown option \"", arg,
+                     "\" -- must be -command or -port", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  return tcpServerObjectConfig (clientData, interp, argc, argv);
+}  
+\f
+/*
+ * tcpServerObjectStartCmd --
+ *
+ *     This procedure is invoked to process the "start" command on a
+ *     TCP server object.  It sets the server up so that new
+ *     connection requests will create "server-client" objects and
+ *     invoke the server's command with them.
+ *
+ *     If Tk is available, the "start" command returns to the caller.
+ *     If Tk is not available, the "start" command immediately enters
+ *     a loop that attempts to process the connection events (and
+ *     other file events as well).  The loop may be exited by
+ *     executing a `stop' command on the server object.  (The `stop'
+ *     command also exists in the Tk environment, since there is more
+ *     to stopping a server than just breaking out of its event
+ *     loop.)
+*/
+
+static int
+tcpServerObjectStartCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  register Tcp_ServerData * server = (Tcp_ServerData *) clientData;
+  int unixStatus;
+
+  /* Check command syntax */
+
+  if (argc != 1) {
+    Tcl_AppendResult (interp, "wrong # args, should be \"", argv [-1], " ",
+                     argv [0], "\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Listen at the server's socket */
+
+  unixStatus = listen (server -> socketfd, TCP_LISTEN_BACKLOG);
+  if (unixStatus < 0) {
+    Tcl_AppendResult (interp, argv [-1], ": can't listen at socket: ",
+                     Tcl_UnixError (interp), (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Add a file handler to gain control at tcpServerAcceptConnection
+   * whenever a client attempts to connect.
+   */
+
+  simpleCreateFileHandler (server -> socketfd, TK_READABLE,
+                          (Tk_FileProc *) tcpServerAcceptConnection,
+                          clientData);
+  return TCL_OK;
+}
+\f
+/*
+ * tcpServerObjectStopCmd
+ *
+ *     This procedure is invoked in response to the `$server stop' Tcl
+ * command.  It destroys the server's object command.  Destroying the object
+ * command, in turn, attempts to shut down the server in question.  It closes
+ * the listen socket, closes all the clients, and sets the `stop' flag for
+ * the server itself.  It then calls `tcpServerClose' to try to get rid of
+ * the server.
+ *
+ *     If one or more clients are active, the server does not shut down
+ * until they can be closed properly.
+ */
+
+static int
+tcpServerObjectStopCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  register Tcp_ServerData * server = (Tcp_ServerData *) clientData;
+
+  if (argc != 1) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [-1],
+                     " ", argv [0], "\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Delete the server command */
+
+  Tcl_DeleteCommand (interp, server -> name);
+
+  return TCL_OK;
+}
+\f
+/*
+ * deleteTcpServerObjectCmd --
+ *
+ *     This procedure is called when a server's object command is deleted.
+ *
+ *     It is the first procedure called when a server is shut down.  It
+ * closes the listen socket and deletes its file handler.  It also attempts
+ * to close all the clients.
+ *
+ *     It may be that a client needs to be able to complete a data transfer
+ * before it can be closed.  In this case, the `close flag' for the client is
+ * set.  The client will be deleted when it reaches a quiescent point.
+ *
+ *     Once all the clients are gone, tcpDeleteServer removes the server's
+ * client data structure.
+ */
+
+static void
+deleteTcpServerObjectCmd (clientData)
+     ClientData clientData;
+{
+  register Tcp_ServerData * server = (Tcp_ServerData *) clientData;
+  register Tcp_ClientData * client, * nextClient;
+
+  /* Close the listen socket and delete its handler */
+
+  simpleDeleteFileHandler (server -> socketfd);
+  (void) close (server -> socketfd);
+  server -> socketfd = -1;
+
+  /* Close all clients */
+
+  for (client = server -> firstClient; client != NULL; client = nextClient) {
+    nextClient = client -> next;
+    if (client -> activeFlag)
+      client -> closeFlag = 1;
+    else
+      tcpCloseClient (client);
+  }
+
+  /* Remove the server from the list of servers. */
+
+  if (server -> next != NULL)
+    server -> next -> prev = server -> prev;
+  if (server -> prev != NULL)
+    server -> prev -> next = server -> next;
+  else
+    tcpFirstServer = server -> next;
+
+  /* If all clients are closed, get to tcpDeleteServer now.  Otherwise, set
+   * the server's stop flag and return.
+   */
+
+  if (server -> firstClient == NULL) {
+    tcpDeleteServer (server);
+  } else {
+    server -> stopFlag = 1;
+  }
+}
+\f
+/*
+ * tcpDeleteServer --
+ *
+ *     This procedure is invoked as the final phase of deleting a TCP server.
+ * When execution gets here, the server's listen socket has been closed and
+ * the handler has been removed.  The server's object command has been deleted.
+ * The server has been removed from the list of active servers.  All the
+ * server's clients have been closed.  The server's login command has been
+ * deleted.  All that remains is to deallocate the server's data structures.
+ */
+
+static void
+tcpDeleteServer (server)
+     Tcp_ServerData * server;
+{
+  /* Get rid of the server's initial command */
+
+  if (server -> command != NULL && server -> freeCommand != NULL) {
+    (*(server -> freeCommand)) (server -> command);
+  }
+
+  /* Get rid of the server's own data structure */
+
+  (void) ckfree ((char *) server);
+}
+\f
+/*
+ * tcpServerObjectConfig --
+ *
+ *     This procedure is invoked to configure a TCP server object.
+ *     It may be called from tcpServerCommand when the server is
+ *     first being created, or else from tcpServerObjectCmd if the
+ *     server object is called with the "config" option.
+ *
+ *     In any case, the arguments are expected to contain zero or
+ *     more of the following:
+ *
+ *     -port <number>
+ *             Requests that the server listen at a specific port.
+ *             Default is whatever the system assigns.
+ *
+ *     -command <string>
+ *             Specifies the initial command used when a client
+ *             first connects to the server.  The command is
+ *             concatenated with the name of a "server-client" object
+ *             that identifies the client, and then called:
+ *                     command client
+ *             Default is "tcp login"
+ *
+ *     -raw
+ *             Puts the server in raw socket mode.
+ *
+ * Result:
+ *     A standard TCL result.
+ */
+
+static int
+tcpServerObjectConfig (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+
+  register Tcp_ServerData * server = (Tcp_ServerData *) clientData;
+
+  int status;
+  int unixStatus;
+
+  /* On entry, argc shows one plus the number of parameters.  Argv[-1] */
+  /* and argv[0] give the command that got us here: either "tcp */
+  /* server" or else "serverName config" */
+
+  int a;
+  unsigned length;
+  int c;
+
+  /* Step through the parameters */
+
+  for (a = 1; a < argc; ++a) {
+    char * arg = argv [a];
+
+    if (arg [0] != '-') {
+      Tcl_AppendResult (interp, argv [-1], ": bad option \"", arg,
+                       "\" -- each option must begin with a hyphen.",
+                       (char *) NULL);
+      return TCL_ERROR;
+    } else {
+
+      length = strlen (++arg);
+      c = arg [0];
+
+      if (c == 'c' && strncmp (arg, "command", length) == 0) {
+
+       /* Command option -- Get the command name */
+
+       ++a;
+       if (a >= argc) {
+         Tcl_AppendResult (interp, argv [-1],
+                           ": \"-command\" must be followed by a string.",
+                           (char *) NULL);
+         return TCL_ERROR;
+       }
+
+       /* Free the old command name */
+
+       if (server -> freeCommand != NULL) {
+         (*(server -> freeCommand)) (server -> command);
+       }
+
+       /* Put in the new command name */
+
+       server -> command = (char *) malloc (strlen (argv [a]) + 1);
+       strcpy (server -> command, argv [a]);
+       server -> freeCommand = (Tcl_FreeProc *) free;
+
+      } else if (c == 'p' && strncmp (arg, "port", length) == 0) {
+
+       /* Port option -- get the port number */
+
+       char * portstr;
+       int portno;
+       struct sockaddr_in portaddr;
+
+       ++a;
+       if (a >= argc) {
+         Tcl_AppendResult (interp, argv [-1],
+                           ": \"-port\" must be followed by a number.",
+                           (char *) NULL);
+         return TCL_ERROR;
+       }
+       portstr = argv [a];
+       status = Tcl_GetInt (interp, portstr, &portno);
+       if (status) return status;
+
+       /* Set the port number */
+
+       memset ((void *) & portaddr, 0, sizeof (struct sockaddr_in));
+       portaddr.sin_port = htons (portno);
+       unixStatus = bind (server -> socketfd,
+                          (struct sockaddr *) &portaddr,
+                          sizeof (struct sockaddr_in));
+       if (unixStatus < 0) {
+         Tcl_AppendResult (interp, argv [-1],
+                           ": can't set port number: ",
+                           Tcl_UnixError (interp), (char *) NULL);
+         return TCL_ERROR;
+       }
+
+      } else if (c == 'r' && strncmp (arg, "raw", length) == 0) {
+
+       /* raw option -- set raw socket mode */
+
+       server -> raw = 1;
+
+      } else {
+
+       /* Unknown option */
+
+       Tcl_AppendResult (interp, argv [-1],
+                         ": unknown option \"", arg - 1,
+                         "\" -- must be -command or -port", (char *) NULL);
+       return TCL_ERROR;
+      }
+    }
+  }
+
+  Tcl_SetResult (interp, server -> name, TCL_STATIC);
+  return TCL_OK;
+}
+\f
+/*
+ * tcpClientObjectCmd --
+ *
+ *     This procedure handles the object command for a Tcp client (on
+ *     the server side).  It takes several forms:
+ *             $client command ?command?
+ *                     With no arguments, returns the client's
+ *                     current command.  With arguments, replaces the
+ *                     client's command with the arguments
+ *             $client close
+ *                     Deletes the client.  If a command is being
+ *                     processed on the client's behalf, the client
+ *                     will not be deleted until the command's result
+ *                     is returned.
+ *             $client do ?args?
+ *                     Concatenate the client's command with ?args?,
+ *                     and execute the result.  Called in background
+ *                     when a command arrives and on initial
+ *                     connection.
+ *             $client hostname
+ *                     Returns the name of the host where the client
+ *                     is running.
+ *             $client server
+ *                     Returns the name of the server to which the client
+ *                     is connected.
+ */
+
+static int
+tcpClientObjectCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  int c;
+  unsigned length;
+
+  if (argc < 2) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [0],
+                     " command ?args?\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  c = argv [1] [0];
+  length = strlen (argv [1]);
+  
+  if (c == 'c' && length >= 2 && strncmp (argv [1], "close", length) == 0) {
+    return tcpClientObjectCloseCmd (clientData, interp, argc-1, argv+1);
+  }
+  if (c == 'c' && length >= 2 && strncmp (argv [1], "command", length) == 0) {
+    return tcpClientObjectCommandCmd (clientData, interp, argc-1, argv+1);
+  }
+  if (c == 'd' && strncmp (argv [1], "do", length) == 0) {
+    return tcpClientObjectDoCmd (clientData, interp, argc-1, argv+1);
+  }
+  if (c == 'h' && strncmp (argv [1], "hostname", length) == 0) {
+    return tcpClientObjectHostnameCmd (clientData, interp, argc-1, argv+1);
+  }
+  if (c == 's' && strncmp (argv [1], "server", length) == 0) {
+    return tcpClientObjectServerCmd (clientData, interp, argc-1, argv+1);
+  }
+
+  Tcl_AppendResult (interp, "bad option \"", argv [1],
+                   "\": should be close, command, do, hostname or server",
+                   (char *) NULL);
+  return TCL_ERROR;
+}
+\f
+/* 
+ * tcpClientObjectCloseCmd --
+ *
+ *     This procedure is called when the Tcl program wants to close a client.
+ * If the client is active, it sets a flag to close the client when it
+ * becomes quiescent.  Otherwise, it closes the client immediately.
+ */
+
+static int
+tcpClientObjectCloseCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  register Tcp_ClientData * client = (Tcp_ClientData *) clientData;
+
+  if (argc != 1) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [-1], " ",
+                     argv [0], "\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  if (client -> activeFlag)
+    client -> closeFlag = 1;
+  else
+    tcpCloseClient (client);
+
+  return TCL_OK;
+}
+\f
+/* 
+ * tcpClientObjectCommandCmd --
+ *
+ *     Query/change the command associated with a client object
+ *
+ * Syntax:
+ *     $client command ?newcommand?
+ *
+ * Return:
+ *     A standard Tcl result containing the client's command.
+ */
+
+static int
+tcpClientObjectCommandCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  register Tcp_ClientData * client = (Tcp_ClientData *) clientData;
+
+  /* Check syntax */
+
+  if (argc > 2) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [-1], " ",
+                     argv [0], " ?command?\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Set command if necessary */
+
+  if (argc == 2) {
+    if (client -> freeCommand != (Tcl_FreeProc *) NULL) {
+      (*client -> freeCommand) (client -> command);
+    }
+    client -> command = malloc (strlen (argv [1]) + 1);
+    strcpy (client -> command, argv [1]);
+    client -> freeCommand = (Tcl_FreeProc *) free;
+  }
+
+  /* Return command in any case */
+
+  Tcl_SetResult (interp, client -> command, TCL_STATIC);
+
+  return TCL_OK;
+}
+\f
+/*
+ * tcpClientObjectDoCmd --
+ *
+ *     The following procedure handles the `do' command on a client
+ *     object.  It is called
+ *             (a) as "$client do", at login.
+ *             (b) as "$client do <command>", when the client sends a
+ *                     command. 
+ *             (c) as "$client do", with no further arguments, when
+ *                     the connection is closed.
+ *     It concatenates the client's saved command string with the
+ *     client's name, and then with the passed command, resulting in
+ *     a command:
+ *             saved_command client passed_command
+ *     which is then passed to Tcl_Eval for processing.
+ *      During the processing of the command, the `active' flag is set for
+ *     the client, to avoid having the client closed prematurely.
+ */
+static int
+tcpClientObjectDoCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+
+  register Tcp_ClientData * client = (Tcp_ClientData *) clientData;
+  int status;
+  int closeflag;
+  char * prevClient;
+  char * excmd;
+  unsigned excmdl;
+  int scanflags;
+
+  /* Check command syntax */
+
+  if (argc > 2) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [-1],
+                     " ", argv [0], " ?command?\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  prevClient = tcpCurrentClient;
+  tcpCurrentClient = client -> name;
+
+  /* Evaluate the client's command, passing the client name and message */
+
+  closeflag = 0;
+  client -> activeFlag = 1;
+
+  if (argc == 2) {
+    excmdl = Tcl_ScanElement (argv [1], &scanflags) + 1;
+    excmd = (char *) ckalloc (excmdl);
+    excmdl = Tcl_ConvertElement (argv [1], excmd, scanflags);
+    excmd [excmdl] = '\0';
+  } else {
+    excmd = (char *) NULL;
+  }
+
+  status = Tcl_VarEval (interp, client -> command, " ", client -> name, " ",
+                       excmd, (char *) NULL);
+
+  if (excmd)
+    ckfree (excmd);
+  
+  if (status != TCL_OK && argc < 2) {
+    closeflag = 1;
+  }
+
+  client -> activeFlag = 0;
+  tcpCurrentClient = prevClient;
+
+  /* If the client command throws an error on login or logout,
+   * the client should be disconnected.
+   * In any case, the result should be reported back to the client.
+   */
+
+  if (! (client -> server -> raw)) {
+    tcpReturnResultToClient (client, interp, status, closeflag);
+  } else {
+    tcpPrepareClientForInput (client);
+  }
+
+  /* The client may have been closed by the ReturnResult operation. DON'T
+   * USE IT AFTER THIS POINT.
+   */
+
+  return TCL_OK;
+}
+\f
+/*
+ * tcpClientObjectHostnameCmd --
+ *
+ *     This procedure is invoked in response to the `$client hostname'
+ * Tcl command.  It returns the name of the peer host on which the client
+ * runs.
+ */
+
+static int
+tcpClientObjectHostnameCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  register Tcp_ClientData * client = (Tcp_ClientData *) clientData;
+
+  struct hostent * hostdesc;
+
+  if (argc != 1) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [-1], " ",
+                     argv [0], "\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  hostdesc = gethostbyaddr ((char *) &(client -> peeraddr.sin_addr.s_addr),
+                           sizeof (client -> peeraddr.sin_addr.s_addr),
+                           AF_INET);
+  
+  if (hostdesc != (struct hostent *) NULL) {
+    Tcl_SetResult (interp, hostdesc -> h_name, TCL_VOLATILE);
+  } else {
+    Tcl_SetResult (interp, inet_ntoa (client -> peeraddr.sin_addr),
+                  TCL_VOLATILE);
+  }
+
+  return TCL_OK;
+}
+\f
+/*
+ * tcpClientObjectServerCmd --
+ *
+ *     This procedure is invoked in response to the `$client server'
+ * Tcl command.  It returns the name of the server to which the client
+ * is connected.
+ */
+
+static int
+tcpClientObjectServerCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  register Tcp_ClientData * client = (Tcp_ClientData *) clientData;
+
+  if (argc != 1) {
+    Tcl_AppendResult (interp, "wrong # args: should be \"", argv [-1], " ",
+                     argv [0], "\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  Tcl_SetResult (interp, client -> server -> name, TCL_STATIC);
+
+  return TCL_OK;
+}
+\f
+/*
+ * deleteTcpClientObjectCmd --
+ *
+ *     This procedure is invoked when a client object's command has
+ * been deleted.  WARNING -- deleting a client object command when the
+ * client is active is a FATAL error that cannot be reported through the
+ * Tcl interpreter.
+ *
+ *     This procedure does all the cleanup necessary to getting rid of the
+ * client.
+ */
+
+static void
+deleteTcpClientObjectCmd (clientData)
+     ClientData clientData;
+{
+  register Tcp_ClientData * client = (Tcp_ClientData *) clientData;
+  register Tcp_ServerData * server = client -> server;
+
+  /* Make sure the client is really dead. */
+
+  if (client -> activeFlag) {
+    fprintf (stderr, "attempt to delete an active TCP client!\n\n");
+    abort ();
+  }
+
+  /* Remove any handler for data on the client's socket. */
+
+  simpleDeleteFileHandler (client -> socketfd);
+
+  /* Now it's safe to close the socket */
+
+  (void) close (client -> socketfd);
+
+  /* Get rid of the command */
+
+  if (client -> command != NULL && client -> freeCommand != NULL) {
+    (*(client -> freeCommand)) (client -> command);
+  }
+
+  /* Get rid of the input buffer */
+
+  Tcl_DeleteCmdBuf (client -> inputBuffer);
+
+  /* Get rid of any pending result */
+
+  if (client -> resultString != NULL && client -> freeResultString != NULL) {
+    (*(client -> freeResultString)) (client -> resultString);
+  }
+
+  /* Unlink the client from the list of active clients */
+
+  if (client -> prev == NULL)
+    client -> server -> firstClient = client -> next;
+  else
+    client -> prev -> next = client -> next;
+
+  if (client -> next != NULL)
+    client -> next -> prev = client -> prev;
+
+  /* Now it's ok to destroy the client's data structure */
+
+  ckfree ((char *) client);
+
+  /* Handle a deferred close on the server if necessary */
+
+  if (server -> stopFlag && server -> firstClient == NULL)
+    tcpDeleteServer (server);
+}
+\f
+/*
+ * tcpConnectionObjectCmd --
+ *
+ *     This procedure is invoked to process the object command for a client-
+ * side connection object.  It takes a couple of diferent forms:
+ *
+ *     $connection close
+ *             Closes the connection.
+ *     $connection send arg ?arg....?
+ *             Catenates the arguments into a Tcl command, and sends them
+ *             to the server.
+ */
+
+static int
+tcpConnectionObjectCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  unsigned length;
+  int c;
+  char * arg;
+
+  if (argc < 2) {
+    Tcl_AppendResult (interp, "wrong # args, should be \"", argv [0], " ",
+                     "command ?args?\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  arg = argv [1];
+  c = arg [0];
+  length = strlen (arg);
+
+  if (c == 'c' && strncmp (arg, "close", length) == 0) {
+    return tcpConnectionObjectCloseCmd (clientData, interp, argc-1, argv+1);
+  }
+  if (c == 's' && strncmp (arg, "send", length) == 0) {
+    return tcpConnectionObjectSendCmd (clientData, interp, argc-1, argv+1);
+  }
+
+  Tcl_AppendResult (interp, "unknown command \"", arg,
+                   "\": must be close or send", (char *) NULL);
+  return TCL_ERROR;
+}
+\f
+/*
+ * tcpConnectionObjectCloseCmd --
+ *
+ *     This procedure is invoked in response to a `close' command on a
+ * client-side connection object.  It closes the socket and deletes the
+ * object command.
+ */
+
+/* ARGSUSED */
+static int
+tcpConnectionObjectCloseCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  if (argc != 1) {
+    Tcl_AppendResult (interp, "wrong # args, should be \"", argv [-1], " ",
+                     argv [0], "\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  Tcl_DeleteCommand (interp, argv [-1]);
+  return TCL_OK;
+}
+\f
+/*
+ * tcpConnectionObjectSendCmd --
+ *
+ *     This procedure is invoked in response to a `send' command on a client-
+ * side connection object.  It catenates the `send' arguments into a single
+ * string, presents that string to the server as a command, and returns the
+ * server's reply.
+ */
+
+static int
+tcpConnectionObjectSendCmd (clientData, interp, argc, argv)
+     ClientData clientData;
+     Tcl_Interp * interp;
+     int argc;
+     char * * argv;
+{
+  char * message;
+  int f = (int) clientData;
+  int status;
+
+  if (argc < 2) {
+    Tcl_AppendResult (interp, "wrong # args, should be \"", argv [-1], " ",
+                     argv [0], " command\"", (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Paste together the message */
+
+  message = Tcl_Merge (argc-1, argv+1);
+
+  /* Send the command to the server */
+
+  status = tcpSendCmdToServer (interp, f, message);
+  if (status != TCL_OK)
+    return status;
+
+  /* Get the server's reply */
+
+  return tcpReceiveResultFromServer (interp, f);
+}
+\f
+/*
+ * deleteTcpConnectionObjectCmd --
+ *
+ *     This procedure is called when a connection object is to be
+ * deleted.  It just has to close the socket that the object uses.
+ */
+
+static void
+deleteTcpConnectionObjectCmd (clientData)
+     ClientData clientData;
+{
+  int f = (int) clientData;
+  (void) close (f);
+}
+\f
+/*
+ * tcpCloseClient --
+ *
+ *     This procedure is called when the program is completely done with
+ * a client object.  If the `active' flag is set, there is still a reference
+ * to the dead client, but we shouldn't have come here in that case.
+ */
+
+static void
+tcpCloseClient (client)
+     Tcp_ClientData * client;
+{
+  if (client -> activeFlag) 
+    abort ();
+
+  /* Deleting the client command is all we need to do -- the delete
+   * procedure does everything else.
+   */
+
+  Tcl_DeleteCommand (client -> server -> interp, client -> name);
+}
+\f
+/*
+ * tcpServerAcceptConnection --
+ *
+ *     This procedure is invoked as a file handler whenever a server's
+ *     socket is ready for `reading' -- i.e., has a connection request
+ *     outstanding.
+ *
+ *     It calls the `accept' command on the server to create a client.
+ *     If the `accept' is successful, it then calls the `do'
+ *     command on the client.  If either call fails, a background error
+ *     is reported.
+ */
+
+/* ARGSUSED */
+static void
+tcpServerAcceptConnection (clientData, mask)
+     ClientData clientData;
+     int mask;
+{
+  register Tcp_ServerData * server = (Tcp_ServerData *) clientData;
+
+  int status;
+
+  char * clientName;
+
+  /* Accept the connection with `$server accept' */
+
+  status = Tcl_VarEval (server -> interp, server -> name, " accept",
+                    (char *) NULL);
+
+  /* On success, try to execute the client's command with `$client do' */
+
+  if (status == TCL_OK) {
+    clientName = (char *) ckalloc (strlen (server -> interp -> result) + 1);
+    strcpy (clientName, server -> interp -> result);
+    status = Tcl_VarEval (server -> interp, clientName, " do", (char *) NULL);
+
+    /* Client may have been closed at this point.  Don't refer to it again. */
+  }
+
+  if (status != TCL_OK) {
+    simpleReportBackgroundError (server -> interp);
+  }
+  Tcl_ResetResult (server -> interp);
+}
+\f
+/*
+ * tcpTrustedHost --
+ *
+ *     This procedure is invoked whenever the code must determine whether
+ * a host is trusted.  A host is considered trusted only if it is the local
+ * host.
+ *
+ * Results:
+ *     Returns a Boolean value that is TRUE iff the host is trusted.
+ */
+
+/* The HOSTCMP macro is just strcmp, but puts its args on stderr if
+ * the DEBUG_TRUSTED_HOST flag is #define'd.  It's used because this
+ * code can be a little flaky; if `hostname' returns a name that is
+ * completely unknown in the database, this macro will trace what happened.
+ */
+
+#ifdef DEBUG_TRUSTED_HOST
+#define HOSTCMP( name1, name2 )                                        \
+  (fprintf (stderr, "tcpTrustedHost: comparing %s with %s\n",  \
+           (name1), (name2)),                                  \
+   strcmp ((name1), (name2)))
+#else
+#define HOSTCMP( name1, name2 )                                        \
+  strcmp ((name1), (name2))
+#endif
+
+static int
+tcpTrustedHost (hostName)
+     char * hostName;
+{
+  char localName [128];
+  struct hostent * hostEnt;
+  struct in_addr hostAddr;
+  int unixStatus;
+  int i;
+
+  /* This procedure really has to do things the hard way.  The problem is
+   * that the hostname() kernel call returns the host name set by the system
+   * administrator, which may not be the host's primary name as known to
+   * the domain name system.  Furthermore, the host presented may be one
+   * of the names for the loopback port, 127.0.0.1, and this must be checked,
+   * too.
+   */
+
+  /* Start assembling a list of possibilities for the host name.  First
+   * possibility is the name that the kernel returns as hostname ().
+   */
+
+  unixStatus = gethostname (localName, 127);
+  if (unixStatus >= 0) {
+
+    if (!HOSTCMP( hostName, localName )) return 1;
+
+    /* Next possibility is a.b.c.d notation for all of the local addresses,
+     * plus all the nicknames for the host. 
+     */
+
+    hostEnt = gethostbyname (localName);
+    if (hostEnt != (struct hostent *) NULL) {
+      if (!HOSTCMP( hostName, hostEnt -> h_name )) return 1;
+      if (hostEnt -> h_aliases != (char * *) NULL) {
+       for (i = 0; hostEnt -> h_aliases [i] != (char *) NULL; ++i) {
+         if (!HOSTCMP( hostName, hostEnt -> h_aliases [i] )) return 1;
+       }
+      }
+      if (hostEnt -> h_addr_list != (char * *) NULL) {
+       for (i = 0; hostEnt -> h_addr_list [i] != (char *) NULL; ++i) {
+         /* note that the address doesn't have to be word-aligned (!) */
+         memcpy ((char *) &hostAddr,
+                 hostEnt -> h_addr_list [i],
+                 hostEnt -> h_length);
+         if (!HOSTCMP( hostName, inet_ntoa (hostAddr) )) return 1;
+       }
+      }
+    }
+  }
+
+  /* Finally, there's the possibility of the loopback address, and all of 
+   * its aliases.*/
+
+  if (!HOSTCMP( hostName, "0.0.0.0" )) return 1;
+  if (!HOSTCMP( hostName, "127.0.0.1" )) return 1;
+  hostAddr.s_addr = htonl (INADDR_LOOPBACK);
+  hostEnt = gethostbyaddr ((char *) &hostAddr, sizeof hostAddr, AF_INET);
+  if (hostEnt != (struct hostent *) NULL) {
+    if (!HOSTCMP( hostName, hostEnt -> h_name )) return 1;
+    if (hostEnt -> h_aliases != (char * *) NULL) {
+      for (i = 0; hostEnt -> h_aliases [i] != (char *) NULL; ++i) {
+       if (!HOSTCMP( hostName, hostEnt -> h_aliases [i] )) return 1;
+      }
+    }
+    if (hostEnt -> h_addr_list != (char * *) NULL) {
+      for (i = 0; hostEnt -> h_addr_list [i] != (char *) NULL; ++i) {
+       /* note that the address doesn't have to be word-aligned (!) */
+       memcpy ((char *) &hostAddr,
+               hostEnt -> h_addr_list [i],
+               hostEnt -> h_length);
+       if (!HOSTCMP( hostName, inet_ntoa (hostAddr) )) return 1;
+      }
+    }
+  }
+
+  return 0;
+}
+\f
+/*
+ * tcpReturnResultToClient --
+ *
+ *     This procedure is invoked to return a result to a client.  It
+ * extracts the interpreter's result string, bundles it with the return
+ * status, and stores it in the client's `resultString' area.
+ *
+ *     It then calls tcpWriteResultToClient to try to start sending the
+ * result.
+ */
+
+static void
+tcpReturnResultToClient (client, interp, status, closeflag)
+     Tcp_ClientData * client;
+     Tcl_Interp * interp;
+     int status;
+     int closeflag;
+{
+  char * argv [2];
+  char rint [16];
+  unsigned length;
+  char * result;
+  
+  /* Put together a message comprising the return status and the interpreter
+   * result */
+
+  sprintf (rint, "%d", status);
+  argv [0] = rint;
+  argv [1] = interp -> result;
+  result = Tcl_Merge (2, argv);
+  length = strlen (result);
+  client -> resultString = (char *) malloc (length + 2);
+  strcpy (client -> resultString, result);
+  strcpy (client -> resultString + length, "\n");
+  free (result);
+  client -> resultPointer = client -> resultString;
+  client -> freeResultString = (Tcl_FreeProc *) free;
+
+  Tcl_ResetResult (interp);
+  client -> closeFlag |= closeflag;
+  
+  /* Now try to send the reply. */
+
+  tcpWriteResultToClient ((ClientData) client, TK_WRITABLE);
+
+  /* tcpWriteResultToClient closes the client if it fails; don't depend on
+   * having the client still be usable. */
+}
+\f
+/*
+ * tcpWriteResultToClient --
+ *
+ *     This procedure is invoked to issue a write on a client socket.
+ * It can be called directly by tcpReturnResultToClient, to attempt the
+ * initial write of results.  It can also be called as a file handler,
+ * to retry a write that was previously blocked.
+ */
+
+/* ARGSUSED */
+static void
+tcpWriteResultToClient (clientData, mask)
+     ClientData clientData;
+     int mask;
+{
+  register Tcp_ClientData * client = (Tcp_ClientData *) clientData;
+
+  int unixStatus;
+  int length;
+
+  length = strlen (client -> resultPointer);
+
+  /* Issue the write */
+
+  unixStatus = write (client -> socketfd, client -> resultPointer,
+                     length);
+  
+  /* Test for a total failure */
+
+  if (unixStatus < 0) {
+    if (errno != EWOULDBLOCK) {
+      tcpClientWriteError (client);
+      /* tcpClientWriteError closes the client as a side effect.  Don't depend
+       * on the client still being there.
+       */
+      return;
+    } else {
+      unixStatus = 0;          /* Pretend that EWOULDBLOCK succeeded at
+                                * writing zero characters. */
+    }
+  }
+
+  /* Test for a partial success */
+
+  if (unixStatus < length) {
+    client -> resultPointer += unixStatus;
+    simpleCreateFileHandler (client -> socketfd, TK_WRITABLE,
+                            (Tk_FileProc *) tcpWriteResultToClient,
+                            clientData);
+  }
+
+  /* Total success -- prepare the client for the next input */
+
+  else {
+    if (client -> freeResultString != NULL) {
+      (*(client -> freeResultString)) (client -> resultString);
+    }
+    client -> resultString = client -> resultPointer = (char *) NULL;
+    client -> freeResultString = (Tcl_FreeProc *) NULL;
+    simpleDeleteFileHandler (client -> socketfd);
+    if (client -> closeFlag) {
+      tcpCloseClient (client);
+
+      /* After tcpCloseClient executes, the client goes away.  Don't depend
+        on it's still being there. */
+
+    } else {
+      tcpPrepareClientForInput (client);
+    }
+  }
+}   
+\f
+/*
+ * tcpPrepareClientForInput --
+ *
+ *     This procedure is invoked to prepare a client to accept command
+ * input.  It establishes a handler, tcpReceiveClientInput, that does the
+ * actual command buffering.
+ */
+
+static void
+tcpPrepareClientForInput (client)
+     Tcp_ClientData * client;
+{
+  simpleCreateFileHandler (client -> socketfd, TK_READABLE,
+                          (Tk_FileProc *) tcpReceiveClientInput,
+                          (ClientData) client);
+}
+\f
+/*
+ * tcpReceiveClientInput --
+ *
+ *     This procedure is called when a server is awaiting input from a client
+ * and the client socket tests to be `ready to read'.  It reads a bufferload
+ * of data from the client, and places it in the client's command buffer.  If
+ * the command is complete, it then tries to invoke the command.
+ */
+
+/* ARGSUSED */
+static void
+tcpReceiveClientInput (clientData, mask)
+     ClientData clientData;
+     int mask;
+{
+  register Tcp_ClientData * client = (Tcp_ClientData *) clientData;
+  register Tcp_ServerData * server = client -> server;
+  register Tcl_Interp * interp = server -> interp;
+
+  static char buffer [BUFSIZ+1];
+  int unixStatus;
+  char * command;
+  int status;
+  char * docmd;
+  char * argv [3];
+  int argc;
+  int i;
+
+  /* Try to read from the client */
+
+  errno = 0;
+  unixStatus = read (client -> socketfd, buffer, BUFSIZ);
+  if (unixStatus <= 0 && errno != EWOULDBLOCK)
+    tcpClientReadError (client);
+
+  /* tcpClientReadError closes the client and reports the error.
+     In any case, if the read failed, we want to return. */
+
+  if (unixStatus <= 0)
+    return;
+
+  if (server -> raw) {
+    char buf[512];
+
+    sprintf(buf, "RawInput %s %d %d", client -> name, buffer, unixStatus);
+printf("TCP executing: %s\n", buf);
+    status = Tcl_Eval (interp, buf, 0, (char * *) NULL);
+
+    tcpPrepareClientForInput (client);
+
+  } else {
+
+    /* Assemble the received data into the buffer */
+
+    buffer [unixStatus] = '\0';
+    command = Tcl_AssembleCmd (client -> inputBuffer, buffer);
+    if (command != (char *) NULL) {
+
+      /* Process the received command. */
+
+      simpleDeleteFileHandler (client -> socketfd);
+      argc = 3;
+      argv [0] = client -> name;
+      argv [1] = "do";
+      argv [2] = command;
+      docmd = Tcl_Merge (argc, argv);
+      status = Tcl_Eval (interp, docmd, 0, (char * *) NULL);
+      free (docmd);
+
+      /* At this point, the client may have been closed.  Don't try to
+        refer to it. */
+
+      if (status != TCL_OK) {
+       simpleReportBackgroundError (interp);
+      }
+    }
+  }
+}
+\f
+/* tcpClientReadError --
+ *
+ *     This procedure is called when an attempt to read the command from a
+ * client fails.  There are two possibilities:
+ *
+ *     The first is that there really was a read error, originating in the
+ * socket system.  In this case, the error should be reported at background
+ * level, and the client should be closed.
+ *
+ *     The second is that the read reached the end-of-information marker in
+ * the client's stream.  In this case, the `do' command should be called on
+ * the client one last time, and then the client should be closed.
+ *
+ *     If the application needs to clean the client up after a read error,
+ * it must define the `tcperror' procedure and process the error.
+ */
+
+static void
+tcpClientReadError (client)
+     Tcp_ClientData * client;
+{
+  Tcp_ServerData * server = client -> server;
+  Tcl_Interp * interp = server -> interp;
+  int status;
+
+  if (errno != 0) {
+
+    /* Read error */
+
+    status = Tcl_VarEval (interp, "error {", client -> name, ": read error: ",
+                         Tcl_UnixError (interp), "}", (char *) NULL);
+    simpleReportBackgroundError (interp);
+    
+  } else {
+
+    /* End of file */
+
+    status = Tcl_VarEval (interp, client -> name, " do", (char *) NULL);
+    if (status != TCL_OK)
+      simpleReportBackgroundError (interp);
+  }
+
+  tcpCloseClient (client);
+}
+\f
+/* tcpClientWriteError --
+ *
+ *     This procedure is invoked when an attempt to return results to a client
+ * has failed.  It reports the error at background level and closes the client.
+ *
+ *     If the application needs to clean up the client after a write error,
+ * it must define the `tcperror' procedure to catch the error.
+ */
+
+static void
+tcpClientWriteError (client)
+     Tcp_ClientData * client;
+{
+  Tcp_ServerData * server = client -> server;
+  Tcl_Interp * interp = server -> interp;
+
+  (void) Tcl_VarEval (interp, "error {", client -> name, ": read error: ",
+                       Tcl_UnixError (interp), "}", (char *) NULL);
+  simpleReportBackgroundError (interp);
+  tcpCloseClient (client);
+}
+\f
+/* tcpSendCmdToServer --
+ *
+ *     This procedure is invoked to send a command originated by a client
+ * using the `$connection send' Tcl command.
+ *
+ *     The message is passed without a newline appended.  The server requires
+ * a newline, which is sent in a separate call.
+ */
+
+static int
+tcpSendCmdToServer (interp, s, message)
+     Tcl_Interp * interp;
+     int s;
+     char * message;
+{
+  int length;
+  int unixStatus;
+  int rubbish;
+  static char newline = '\n';
+  void (*oldPipeHandler) ();
+
+  /* Set the socket for blocking I/O */
+
+  rubbish = 0;
+  unixStatus = ioctl (s, FIONBIO, (char *) &rubbish);
+  if (unixStatus < 0) {
+    Tcl_AppendResult (interp, "can't set blocking I/O on socket: ",
+                     Tcl_UnixError (interp), (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Keep a possible broken pipe from killing us silently */
+
+  oldPipeHandler = signal (SIGPIPE, SIG_IGN);
+
+  /* Write the message */
+  
+  length = strlen (message);
+  unixStatus = write (s, message, length);
+  if (unixStatus < length) {
+    (void) signal (SIGPIPE, oldPipeHandler);
+    Tcl_AppendResult (interp, "can't send message to server: ",
+                     Tcl_UnixError (interp), (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Write the terminating newline */
+
+  unixStatus = write (s, &newline, 1);
+  if (unixStatus < 1) {
+    (void) signal (SIGPIPE, oldPipeHandler);
+    Tcl_AppendResult (interp, "can't send newline to server: ",
+                     Tcl_UnixError (interp), (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  (void) signal (SIGPIPE, oldPipeHandler);
+  return TCL_OK;
+}
+\f
+/*
+ * tcpReceiveResultFromServer --
+ *
+ *     This procedure is invoked to get the result transmitted from
+ * a remote server, either on establishing the connection or on processing
+ * a command.  It returns a standard Tcl result that is usually the result
+ * returned by the server.
+ */
+
+static int
+tcpReceiveResultFromServer (interp, s)
+     Tcl_Interp * interp;
+     int s;
+{
+  int status;
+  int unixStatus;
+  int junk;
+  Tcl_CmdBuf cmdbuf;
+  struct timeval tick;
+  struct timeval * tickp;
+  fd_set readfds;
+  char buf [BUFSIZ+1];
+  char * reply;
+  int rargc;
+  char * * rargv;
+  int rstatus;
+
+  /* Read the result using non-blocking I/O */
+
+  junk = 1;
+  unixStatus = ioctl (s, FIONBIO, (char *) &junk);
+  if (unixStatus < 0) {
+    Tcl_AppendResult (interp, "can't set nonblocking I/O on socket: ",
+                     Tcl_UnixError (interp), (char *) NULL);
+    return TCL_ERROR;
+  }
+
+  /* Make a buffer to receive the result */
+
+  cmdbuf = Tcl_CreateCmdBuf ();
+
+  /* Wait for the result to appear */
+
+  tickp = (struct timeval *) 0;
+  FD_ZERO( &readfds );
+  FD_SET( s, &readfds );
+  for ( ; ; ) {
+
+    unixStatus = select (s + 1, &readfds, (fd_set *) NULL, (fd_set *) NULL,
+                        tickp);
+
+    if (unixStatus < 0) {
+      status = TCL_ERROR;
+      Tcl_AppendResult (interp, "error selecting socket for reply: ",
+                       Tcl_UnixError (interp), (char *) NULL);
+      break;
+    }
+
+    if (unixStatus == 0) {
+      status = TCL_ERROR;
+      Tcl_SetResult (interp, "timed out waiting for server reply", TCL_STATIC);
+      break;
+    }
+
+    /* Read the result */
+
+    unixStatus = read (s, buf, BUFSIZ);
+
+    if (unixStatus < 0) {
+      status = TCL_ERROR;
+      Tcl_AppendResult (interp, "error reading server reply: ",
+                       Tcl_UnixError (interp), (char *) NULL);
+      break;
+    }
+
+    if (unixStatus == 0) {
+      status = TCL_ERROR;
+      Tcl_SetResult (interp, "Connection closed.", TCL_STATIC);
+      break;
+    }
+
+    /* Parse the (partial) command */
+    
+    buf [unixStatus] = '\0';
+    reply = Tcl_AssembleCmd (cmdbuf, buf);
+    if (reply != NULL) {
+      status = TCL_OK;
+      break;
+    }
+
+    /* Partial command not yet complete.  Set timeout for reading the
+     * rest of the result. */
+
+    tick.tv_sec = 30;
+    tick.tv_usec = 0;
+    tickp = &tick;
+  }
+
+  /* When we come here, either the status is TCL_ERROR and the error
+   * message is already set, or else the status is TCL_OK and `reply'
+   * contains the result that we have to return.  The first element of
+   * `reply' has the status, and the second has the result string. */
+
+  /* Split the list elements */
+
+  if (status == TCL_OK) {
+    status = Tcl_SplitList (interp, reply, &rargc, &rargv);
+    if (status != TCL_OK) {
+      Tcl_SetResult (interp, "server returned malformed list", TCL_STATIC);
+      status = TCL_ERROR;
+    }
+  }
+
+  /* Verify the element count */
+
+  if (status == TCL_OK) {
+    if (rargc != 2) {
+      Tcl_SetResult (interp, "server returned malformed list", TCL_STATIC);
+      status = TCL_ERROR;
+      free ((char *) rargv);
+    } else {
+      status = Tcl_GetInt (interp, rargv [0], &rstatus);
+      if (status != TCL_OK) {
+       Tcl_SetResult (interp, "server returned unrecognizable status",
+                      TCL_STATIC);
+       status = TCL_ERROR;
+       free ((char *) rargv);
+      }
+    }
+  }
+
+  /* Return the result reported by the server */
+
+  if (status == TCL_OK) {
+    Tcl_SetResult (interp, rargv [1], TCL_VOLATILE);
+    status = rstatus;
+    free ((char *) rargv);
+  }
+
+  Tcl_DeleteCmdBuf (cmdbuf);
+  return status;
+}
diff --git a/src/tk/tktcp.h b/src/tk/tktcp.h
new file mode 100644 (file)
index 0000000..d80d850
--- /dev/null
@@ -0,0 +1,58 @@
+/* tkTCP.h --
+ *
+ *     This file provides declarations needed by the TCP server
+ *     implementation for Tcl interpreters.
+ *
+ * $Header: /cluster21/kennykb/src/tclTCP.1.0beta/RCS/tclTCP.h,v 1.1 1992/02/14 19:57:51 kennykb Exp $
+ * $Source: /cluster21/kennykb/src/tclTCP.1.0beta/RCS/tclTCP.h,v $
+ * $Log: tclTCP.h,v $
+ * Revision 1.1  1992/02/14  19:57:51  kennykb
+ * Initial revision
+ *
+ *
+ *
+ *     Copyright (C) 1992 General Electric.
+ *     All rights reserved.
+ *     
+ *
+ *   Permission to use, copy, modify, and distribute this
+ *   software and its documentation for any purpose and without
+ *   fee is hereby granted, provided that the above copyright
+ *   notice appear in all copies and that both that copyright
+ *   notice and this permission notice appear in supporting
+ *   documentation, and that the name of General Electric not be used in
+ *   advertising or publicity pertaining to distribution of the
+ *   software without specific, written prior permission.
+ *   General Electric makes no representations about the suitability of
+ *   this software for any purpose.  It is provided "as is"
+ *   without express or implied warranty.
+ *
+ *   This work was supported by the DARPA Initiative in Concurrent
+ *   Engineering (DICE) through DARPA Contract MDA972-88-C-0047.
+ *
+ */
+
+#ifndef _TCLTCP
+#define _TCLTCP 1
+
+#ifndef _TCL
+#include "tcl.h"
+#endif
+
+/* Definitions of the functions */
+
+EXTERN int tcpCommand _ANSI_ARGS_((ClientData clientData,
+                                  Tcl_Interp * interp,
+                                  int argc,
+                                  char * * argv));
+
+extern void simpleCreateFileHandler _ANSI_ARGS_((int fd,
+                                                int mask,
+                                                Tk_FileProc * proc,
+                                                ClientData clientData));
+
+extern void simpleDeleteFileHandler _ANSI_ARGS_((int fd));
+
+extern void simpleReportBackgroundError _ANSI_ARGS_((Tcl_Interp * interp));
+
+#endif /* _TCLTCP */
diff --git a/src/tk/tktext.c b/src/tk/tktext.c
new file mode 100644 (file)
index 0000000..3a0dc70
--- /dev/null
@@ -0,0 +1,1516 @@
+/* 
+ * tkText.c --
+ *
+ *     This module provides a big chunk of the implementation of
+ *     multi-line editable text widgets for Tk.  Among other things,
+ *     it provides the Tcl command interfaces to text widgets and
+ *     the display code.  The B-tree representation of text is
+ *     implemented elsewhere.
+ *
+ * Copyright 1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkText.c,v 1.23 92/08/14 14:45:44 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "default.h"
+#include "tkconfig.h"
+#include "tk.h"
+#include "tktext.h"
+
+/*
+ * Information used to parse text configuration options:
+ */
+
+static Tk_ConfigSpec configSpecs[] = {
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_TEXT_BG_COLOR, Tk_Offset(TkText, border), TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-background", "background", "Background",
+       DEF_TEXT_BG_MONO, Tk_Offset(TkText, border), TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",
+       DEF_TEXT_BORDER_WIDTH, Tk_Offset(TkText, borderWidth), 0},
+    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",
+       DEF_TEXT_CURSOR, Tk_Offset(TkText, cursor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_BOOLEAN, "-exportselection", "exportSelection",
+       "ExportSelection", DEF_TEXT_EXPORT_SELECTION,
+       Tk_Offset(TkText, exportSelection), 0},
+    {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,
+       (char *) NULL, 0, 0},
+    {TK_CONFIG_FONT, "-font", "font", "Font",
+       DEF_TEXT_FONT, Tk_Offset(TkText, fontPtr), 0},
+    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",
+       DEF_TEXT_FG, Tk_Offset(TkText, fgColor), 0},
+    {TK_CONFIG_INT, "-height", "height", "Height",
+       DEF_TEXT_HEIGHT, Tk_Offset(TkText, height), 0},
+    {TK_CONFIG_BORDER, "-insertbackground", "insertBackground", "Foreground",
+       DEF_TEXT_INSERT_BG, Tk_Offset(TkText, insertBorder), 0},
+    {TK_CONFIG_PIXELS, "-insertborderwidth", "insertBorderWidth", "BorderWidth",
+       DEF_TEXT_INSERT_BD_COLOR, Tk_Offset(TkText, insertBorderWidth),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_PIXELS, "-insertborderwidth", "insertBorderWidth", "BorderWidth",
+       DEF_TEXT_INSERT_BD_MONO, Tk_Offset(TkText, insertBorderWidth),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_INT, "-insertofftime", "insertOffTime", "OffTime",
+       DEF_TEXT_INSERT_OFF_TIME, Tk_Offset(TkText, insertOffTime), 0},
+    {TK_CONFIG_INT, "-insertontime", "insertOnTime", "OnTime",
+       DEF_TEXT_INSERT_ON_TIME, Tk_Offset(TkText, insertOnTime), 0},
+    {TK_CONFIG_PIXELS, "-insertwidth", "insertWidth", "InsertWidth",
+       DEF_TEXT_INSERT_WIDTH, Tk_Offset(TkText, insertWidth), 0},
+    {TK_CONFIG_PIXELS, "-padx", "padX", "Pad",
+       DEF_TEXT_PADX, Tk_Offset(TkText, padX), 0},
+    {TK_CONFIG_PIXELS, "-pady", "padY", "Pad",
+       DEF_TEXT_PADY, Tk_Offset(TkText, padY), 0},
+    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",
+       DEF_TEXT_RELIEF, Tk_Offset(TkText, relief), 0},
+    {TK_CONFIG_BORDER, "-selectbackground", "selectBackground", "Foreground",
+       DEF_ENTRY_SELECT_COLOR, Tk_Offset(TkText, selBorder),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_BORDER, "-selectbackground", "selectBackground", "Foreground",
+       DEF_TEXT_SELECT_MONO, Tk_Offset(TkText, selBorder),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_PIXELS, "-selectborderwidth", "selectBorderWidth", "BorderWidth",
+       DEF_TEXT_SELECT_BD_COLOR, Tk_Offset(TkText, selBorderWidth),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_PIXELS, "-selectborderwidth", "selectBorderWidth", "BorderWidth",
+       DEF_TEXT_SELECT_BD_MONO, Tk_Offset(TkText, selBorderWidth),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_COLOR, "-selectforeground", "selectForeground", "Background",
+       DEF_TEXT_SELECT_FG_COLOR, Tk_Offset(TkText, selFgColorPtr),
+       TK_CONFIG_COLOR_ONLY},
+    {TK_CONFIG_COLOR, "-selectforeground", "selectForeground", "Background",
+       DEF_TEXT_SELECT_FG_MONO, Tk_Offset(TkText, selFgColorPtr),
+       TK_CONFIG_MONO_ONLY},
+    {TK_CONFIG_BOOLEAN, "-setgrid", "setGrid", "SetGrid",
+       DEF_TEXT_SET_GRID, Tk_Offset(TkText, setGrid), 0},
+    {TK_CONFIG_UID, "-state", "state", "State",
+       DEF_TEXT_STATE, Tk_Offset(TkText, state), 0},
+    {TK_CONFIG_INT, "-width", "width", "Width",
+       DEF_TEXT_WIDTH, Tk_Offset(TkText, width), 0},
+    {TK_CONFIG_UID, "-wrap", "wrap", "Wrap",
+       DEF_TEXT_WRAP, Tk_Offset(TkText, wrapMode), 0},
+    {TK_CONFIG_STRING, "-yscrollcommand", "yScrollCommand", "ScrollCommand",
+       DEF_TEXT_YSCROLL_COMMAND, Tk_Offset(TkText, yScrollCmd),
+       TK_CONFIG_NULL_OK},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+/*
+ * The following definition specifies the maximum number of characters
+ * needed in a string to hold a position specifier.
+ */
+
+#define POS_CHARS 30
+
+/*
+ * Tk_Uid's used to represent text states:
+ */
+
+Tk_Uid tkTextCharUid = NULL;
+Tk_Uid tkTextDisabledUid = NULL;
+Tk_Uid tkTextNoneUid = NULL;
+Tk_Uid tkTextNormalUid = NULL;
+Tk_Uid tkTextWordUid = NULL;
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static int             ConfigureText _ANSI_ARGS_((Tcl_Interp *interp,
+                           TkText *textPtr, int argc, char **argv, int flags));
+static void            DeleteChars _ANSI_ARGS_((TkText *textPtr, int line1,
+                           int ch1, int line2, int ch2));
+static void            DestroyText _ANSI_ARGS_((ClientData clientData));
+static void            InsertChars _ANSI_ARGS_((TkText *textPtr, int line,
+                           int ch, char *string));
+static void            TextBlinkProc _ANSI_ARGS_((ClientData clientData));
+static void            TextEventProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static int             TextFetchSelection _ANSI_ARGS_((ClientData clientData,
+                           int offset, char *buffer, int maxBytes));
+static void            TextFocusProc _ANSI_ARGS_((ClientData clientData,
+                           int gotFocus));
+static int             TextMarkCmd _ANSI_ARGS_((TkText *textPtr,
+                           Tcl_Interp *interp, int argc, char **argv));
+static int             TextScanCmd _ANSI_ARGS_((TkText *textPtr,
+                           Tcl_Interp *interp, int argc, char **argv));
+static int             TextWidgetCmd _ANSI_ARGS_((ClientData clientData,
+                           Tcl_Interp *interp, int argc, char **argv));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_TextCmd --
+ *
+ *     This procedure is invoked to process the "text" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+Tk_TextCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    Tk_Window new;
+    register TkText *textPtr;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " pathName ?options?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+    /*
+     * Perform once-only initialization:
+     */
+
+    if (tkTextNormalUid == NULL) {
+       tkTextCharUid = Tk_GetUid("char");
+       tkTextDisabledUid = Tk_GetUid("disabled");
+       tkTextNoneUid = Tk_GetUid("none");
+       tkTextNormalUid = Tk_GetUid("normal");
+       tkTextWordUid = Tk_GetUid("word");
+    }
+
+    /*
+     * Create the window.
+     */
+
+    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], (char *) NULL);
+    if (new == NULL) {
+       return TCL_ERROR;
+    }
+
+    textPtr = (TkText *) ckalloc(sizeof(TkText));
+    textPtr->tkwin = new;
+    textPtr->interp = interp;
+    textPtr->tree = TkBTreeCreate();
+    Tcl_InitHashTable(&textPtr->tagTable, TCL_STRING_KEYS);
+    textPtr->numTags = 0;
+    Tcl_InitHashTable(&textPtr->markTable, TCL_STRING_KEYS);
+    textPtr->state = tkTextNormalUid;
+    textPtr->border = NULL;
+    textPtr->cursor = None;
+    textPtr->fgColor = NULL;
+    textPtr->fontPtr = NULL;
+    textPtr->prevWidth = Tk_Width(new);
+    textPtr->prevHeight = Tk_Height(new);
+    textPtr->topLinePtr = NULL;
+// Moved down so flags were set right.
+//    TkTextCreateDInfo(textPtr);
+//    TkTextSetView(textPtr, 0, 0);
+    textPtr->selBorder = NULL;
+    textPtr->selFgColorPtr = NULL;
+    textPtr->exportSelection = 1;
+    textPtr->selOffset = -1;
+    textPtr->insertAnnotPtr = NULL;
+    textPtr->insertBorder = NULL;
+    textPtr->insertBlinkHandler = (Tk_TimerToken) NULL;
+    textPtr->bindingTable = NULL;
+    textPtr->pickEvent.type = LeaveNotify;
+    textPtr->yScrollCmd = NULL;
+    textPtr->scanMarkLine = 0;
+    textPtr->scanMarkY = 0;
+    textPtr->flags = 0;
+    textPtr->updateTimerToken = 0; // Added by Don to optimize rapid updates.
+    TkTextCreateDInfo(textPtr);
+    TkTextSetView(textPtr, 0, 0);
+
+    /*
+     * Create the "sel" tag and the "current" and "insert" marks.
+     */
+
+    textPtr->selTagPtr = TkTextCreateTag(textPtr, "sel");
+    textPtr->selTagPtr->relief = TK_RELIEF_RAISED;
+    textPtr->currentAnnotPtr = TkTextSetMark(textPtr, "current", 0, 0);
+    textPtr->insertAnnotPtr = TkTextSetMark(textPtr, "insert", 0, 0);
+
+    Tk_SetClass(new, "Text");
+    Tk_CreateEventHandler(textPtr->tkwin, ExposureMask|StructureNotifyMask,
+           TextEventProc, (ClientData) textPtr);
+    Tk_CreateEventHandler(textPtr->tkwin, KeyPressMask|KeyReleaseMask
+           |ButtonPressMask|ButtonReleaseMask|EnterWindowMask
+           |LeaveWindowMask|PointerMotionMask, TkTextBindProc,
+           (ClientData) textPtr);
+    Tk_CreateSelHandler(textPtr->tkwin, XA_STRING, TextFetchSelection,
+           (ClientData) textPtr, XA_STRING);
+    Tcl_CreateCommand(interp, Tk_PathName(textPtr->tkwin),
+           TextWidgetCmd, (ClientData) textPtr, (void (*)()) NULL);
+    if (ConfigureText(interp, textPtr, argc-2, argv+2, 0) != TCL_OK) {
+       Tk_DestroyWindow(textPtr->tkwin);
+       return TCL_ERROR;
+    }
+    Tk_CreateFocusHandler(textPtr->tkwin, TextFocusProc, (ClientData) textPtr);
+    interp->result = Tk_PathName(textPtr->tkwin);
+
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TextWidgetCmd --
+ *
+ *     This procedure is invoked to process the Tcl command
+ *     that corresponds to a text widget.  See the user
+ *     documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+TextWidgetCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Information about text widget. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    register TkText *textPtr = (TkText *) clientData;
+    int result = TCL_OK;
+    int length;
+    char c;
+    int line1, line2, ch1, ch2;
+
+    if (argc < 2) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    Tk_Preserve((ClientData) textPtr);
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'c') && (strncmp(argv[1], "compare", length) == 0)
+           && (length >= 3)) {
+       int less, equal, greater, value;
+       char *p;
+
+       if (argc != 5) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " compare index1 op index2\"", (char *) NULL);
+           result = TCL_ERROR;
+           goto done;
+       }
+       if ((TkTextGetIndex(interp, textPtr, argv[2], &line1, &ch1) != TCL_OK)
+               || (TkTextGetIndex(interp, textPtr, argv[4], &line2, &ch2)
+               != TCL_OK)) {
+           result = TCL_ERROR;
+           goto done;
+       }
+       less = equal = greater = 0;
+       if (line1 < line2) {
+           less = 1;
+       } else if (line1 > line2) {
+           greater = 1;
+       } else {
+           if (ch1 < ch2) {
+               less = 1;
+           } else if (ch1 > ch2) {
+               greater = 1;
+           } else {
+               equal = 1;
+           }
+       }
+       p = argv[3];
+       if (p[0] == '<') {
+               value = less;
+           if ((p[1] == '=') && (p[2] == 0)) {
+               value = less || equal;
+           } else if (p[1] != 0) {
+               compareError:
+               Tcl_AppendResult(interp, "bad comparison operator \"",
+                       argv[3], "\": must be <, <=, ==, >=, >, or !=",
+                       (char *) NULL);
+               result = TCL_ERROR;
+               goto done;
+           }
+       } else if (p[0] == '>') {
+               value = greater;
+           if ((p[1] == '=') && (p[2] == 0)) {
+               value = greater || equal;
+           } else if (p[1] != 0) {
+               goto compareError;
+           }
+       } else if ((p[0] == '=') && (p[1] == '=') && (p[2] == 0)) {
+           value = equal;
+       } else if ((p[0] == '!') && (p[1] == '=') && (p[2] == 0)) {
+           value = !equal;
+       } else {
+           goto compareError;
+       }
+       interp->result = (value) ? "1" : "0";
+    } else if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)
+           && (length >= 3)) {
+       if (argc == 2) {
+           result = Tk_ConfigureInfo(interp, textPtr->tkwin, configSpecs,
+                   (char *) textPtr, (char *) NULL, 0);
+       } else if (argc == 3) {
+           result = Tk_ConfigureInfo(interp, textPtr->tkwin, configSpecs,
+                   (char *) textPtr, argv[2], 0);
+       } else {
+           result = ConfigureText(interp, textPtr, argc-2, argv+2,
+                   TK_CONFIG_ARGV_ONLY);
+       }
+    } else if ((c == 'd') && (strncmp(argv[1], "debug", length) == 0)
+           && (length >= 3)) {
+       if (argc > 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " debug ?on|off?\"", (char *) NULL);
+           result = TCL_ERROR;
+           goto done;
+       }
+       if (argc == 2) {
+           interp->result = (tkBTreeDebug) ? "on" : "off";
+       } else {
+           if (Tcl_GetBoolean(interp, argv[2], &tkBTreeDebug) != TCL_OK) {
+               result = TCL_ERROR;
+               goto done;
+           }
+       }
+    } else if ((c == 'd') && (strncmp(argv[1], "delete", length) == 0)
+           && (length >= 3)) {
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " delete index1 ?index2?\"", (char *) NULL);
+           result = TCL_ERROR;
+           goto done;
+       }
+       if (TkTextGetIndex(interp, textPtr, argv[2], &line1, &ch1) != TCL_OK) {
+           result = TCL_ERROR;
+           goto done;
+       }
+       if (argc == 3) {
+           line2 = line1;
+           ch2 = ch1+1;
+       } else if (TkTextGetIndex(interp, textPtr, argv[3], &line2, &ch2)
+               != TCL_OK) {
+           result = TCL_ERROR;
+           goto done;
+       }
+       if (textPtr->state == tkTextNormalUid) {
+           DeleteChars(textPtr, line1, ch1, line2, ch2);
+       }
+    } else if ((c == 'g') && (strncmp(argv[1], "get", length) == 0)) {
+       register TkTextLine *linePtr;
+
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " get index1 ?index2?\"", (char *) NULL);
+           result = TCL_ERROR;
+           goto done;
+       }
+       if (TkTextGetIndex(interp, textPtr, argv[2], &line1, &ch1) != TCL_OK) {
+           result = TCL_ERROR;
+           goto done;
+       }
+       if (argc == 3) {
+           line2 = line1;
+           ch2 = ch1+1;
+       } else if (TkTextGetIndex(interp, textPtr, argv[3], &line2, &ch2)
+               != TCL_OK) {
+           result = TCL_ERROR;
+           goto done;
+       }
+       if (line1 < 0) {
+           line1 = 0;
+           ch1 = 0;
+       }
+       for (linePtr = TkBTreeFindLine(textPtr->tree, line1);
+               (linePtr != NULL) && (line1 <= line2);
+               linePtr = TkBTreeNextLine(linePtr), line1++, ch1 = 0) {
+           int savedChar, last;
+
+           if (line1 == line2) {
+               last = ch2;
+               if (last > linePtr->numBytes) {
+                   last = linePtr->numBytes;
+               }
+           } else {
+               last = linePtr->numBytes;
+           }
+           if (ch1 >= last) {
+               continue;
+           }
+           savedChar = linePtr->bytes[last];
+           linePtr->bytes[last] = 0;
+           Tcl_AppendResult(interp, linePtr->bytes+ch1, (char *) NULL);
+           linePtr->bytes[last] = savedChar;
+       }
+    } else if ((c == 'i') && (strncmp(argv[1], "index", length) == 0)
+           && (length >= 3)) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " index index\"",
+                   (char *) NULL);
+           result = TCL_ERROR;
+           goto done;
+       }
+       if (TkTextGetIndex(interp, textPtr, argv[2], &line1, &ch1) != TCL_OK) {
+           result = TCL_ERROR;
+           goto done;
+       }
+       TkTextPrintIndex(line1, ch1, interp->result);
+    } else if ((c == 'i') && (strncmp(argv[1], "insert", length) == 0)
+           && (length >= 3)) {
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " insert index chars ?chars ...?\"",
+                   (char *) NULL);
+           result = TCL_ERROR;
+           goto done;
+       }
+       if (TkTextGetIndex(interp, textPtr, argv[2], &line1, &ch1) != TCL_OK) {
+           result = TCL_ERROR;
+           goto done;
+       }
+       if (textPtr->state == tkTextNormalUid) {
+           InsertChars(textPtr, line1, ch1, argv[3]);
+       }
+    } else if ((c == 'm') && (strncmp(argv[1], "mark", length) == 0)) {
+       result = TextMarkCmd(textPtr, interp, argc, argv);
+    } else if ((c == 's') && (strcmp(argv[1], "scan") == 0)) {
+       result = TextScanCmd(textPtr, interp, argc, argv);
+    } else if ((c == 't') && (strcmp(argv[1], "tag") == 0)) {
+       result = TkTextTagCmd(textPtr, interp, argc, argv);
+    } else if ((c == 'y') && (strncmp(argv[1], "yview", length) == 0)) {
+       int numLines, pickPlace;
+
+       if (argc < 3) {
+           yviewSyntax:
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " yview ?-pickplace? lineNum|index\"",
+                   (char *) NULL);
+           result = TCL_ERROR;
+           goto done;
+       }
+       pickPlace = 0;
+       if (argv[2][0] == '-') {
+           int switchLength;
+
+           switchLength = strlen(argv[2]);
+           if ((switchLength >= 2)
+                   && (strncmp(argv[2], "-pickplace", switchLength) == 0)) {
+               pickPlace = 1;
+           }
+       }
+       if ((pickPlace+3) != argc) {
+           goto yviewSyntax;
+       }
+       if (Tcl_GetInt(interp, argv[2+pickPlace], &line1) != TCL_OK) {
+           Tcl_ResetResult(interp);
+           if (TkTextGetIndex(interp, textPtr, argv[2+pickPlace],
+                   &line1, &ch1) != TCL_OK) {
+               result = TCL_ERROR;
+               goto done;
+           }
+       }
+       numLines = TkBTreeNumLines(textPtr->tree);
+       if (line1 >= numLines) {
+           line1 = numLines-1;
+       }
+       if (line1 < 0) {
+           line1 = 0;
+       }
+       TkTextSetView(textPtr, line1, pickPlace);
+    } else {
+       Tcl_AppendResult(interp, "bad option \"", argv[1],
+               "\":  must be compare, configure, debug, delete, get, ",
+               "index, insert, mark, scan, tag, or yview",
+               (char *) NULL);
+       result = TCL_ERROR;
+    }
+
+    done:
+    Tk_Release((ClientData) textPtr);
+    return result;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyText --
+ *
+ *     This procedure is invoked by Tk_EventuallyFree or Tk_Release
+ *     to clean up the internal structure of a text at a safe time
+ *     (when no-one is using it anymore).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Everything associated with the text is freed up.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyText(clientData)
+    ClientData clientData;     /* Info about text widget. */
+{
+    register TkText *textPtr = (TkText *) clientData;
+    Tcl_HashSearch search;
+    Tcl_HashEntry *hPtr;
+    TkTextTag *tagPtr;
+
+    TkBTreeDestroy(textPtr->tree);
+    for (hPtr = Tcl_FirstHashEntry(&textPtr->tagTable, &search);
+           hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
+       tagPtr = (TkTextTag *) Tcl_GetHashValue(hPtr);
+       TkTextFreeTag(tagPtr);
+    }
+    Tcl_DeleteHashTable(&textPtr->tagTable);
+    for (hPtr = Tcl_FirstHashEntry(&textPtr->markTable, &search);
+           hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
+       ckfree((char *) Tcl_GetHashValue(hPtr));
+    }
+    Tcl_DeleteHashTable(&textPtr->markTable);
+    if (textPtr->border != NULL) {
+       Tk_Free3DBorder(textPtr->border);
+    }
+    if (textPtr->cursor != None) {
+       Tk_FreeCursor(textPtr->cursor);
+    }
+    if (textPtr->fgColor != NULL) {
+       Tk_FreeColor(textPtr->fgColor);
+    }
+    if (textPtr->fontPtr != NULL) {
+       Tk_FreeFontStruct(textPtr->fontPtr);
+    }
+    TkTextFreeDInfo(textPtr);
+
+    /*
+     * NOTE: do NOT free up selBorder or selFgColorPtr:  they are
+     * duplicates of information in the "sel" tag, which was freed
+     * up as part of deleting the tags above.
+     */
+
+    if (textPtr->insertBorder != NULL) {
+       Tk_Free3DBorder(textPtr->insertBorder);
+    }
+    if (textPtr->insertBlinkHandler != NULL) {
+       Tk_DeleteTimerHandler(textPtr->insertBlinkHandler);
+    }
+    if (textPtr->updateTimerToken != NULL) {
+       Tk_DeleteTimerHandler(textPtr->updateTimerToken);
+       textPtr->updateTimerToken = 0;
+    }
+    if (textPtr->bindingTable != NULL) {
+       Tk_DeleteBindingTable(textPtr->bindingTable);
+    }
+    if (textPtr->yScrollCmd != NULL) {
+       ckfree(textPtr->yScrollCmd);
+    }
+    ckfree((char *) textPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ConfigureText --
+ *
+ *     This procedure is called to process an argv/argc list, plus
+ *     the Tk option database, in order to configure (or
+ *     reconfigure) a text widget.
+ *
+ * Results:
+ *     The return value is a standard Tcl result.  If TCL_ERROR is
+ *     returned, then interp->result contains an error message.
+ *
+ * Side effects:
+ *     Configuration information, such as text string, colors, font,
+ *     etc. get set for textPtr;  old resources get freed, if there
+ *     were any.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+ConfigureText(interp, textPtr, argc, argv, flags)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    register TkText *textPtr;  /* Information about widget;  may or may
+                                * not already have values for some fields. */
+    int argc;                  /* Number of valid entries in argv. */
+    char **argv;               /* Arguments. */
+    int flags;                 /* Flags to pass to Tk_ConfigureWidget. */
+{
+    int oldExport = textPtr->exportSelection;
+    int charWidth, charHeight;
+
+    if (Tk_ConfigureWidget(interp, textPtr->tkwin, configSpecs,
+           argc, argv, (char *) textPtr, flags) != TCL_OK) {
+       return TCL_ERROR;
+    }
+
+    /*
+     * A few other options also need special processing, such as parsing
+     * the geometry and setting the background from a 3-D border.
+     */
+
+    if ((textPtr->state != tkTextNormalUid)
+           && (textPtr->state != tkTextDisabledUid)) {
+       Tcl_AppendResult(interp, "bad state value \"", textPtr->state,
+               "\":  must be normal or disabled", (char *) NULL);
+       textPtr->state = tkTextNormalUid;
+       return TCL_ERROR;
+    }
+
+    if ((textPtr->wrapMode != tkTextCharUid)
+           && (textPtr->wrapMode != tkTextNoneUid)
+           && (textPtr->wrapMode != tkTextWordUid)) {
+       Tcl_AppendResult(interp, "bad wrap mode \"", textPtr->state,
+               "\":  must be char, none, or word", (char *) NULL);
+       textPtr->wrapMode = tkTextCharUid;
+       return TCL_ERROR;
+    }
+
+    Tk_SetBackgroundFromBorder(textPtr->tkwin, textPtr->border);
+    Tk_SetInternalBorder(textPtr->tkwin, textPtr->borderWidth);
+    Tk_GeometryRequest(textPtr->tkwin, 200, 100);
+
+    /*
+     * Make sure that configuration options are properly mirrored
+     * between the widget record and the "sel" tags.  NOTE: we don't
+     * have to free up information during the mirroring;  old
+     * information was freed when it was replaced in the widget
+     * record.
+     */
+
+    textPtr->selTagPtr->border = textPtr->selBorder;
+    textPtr->selTagPtr->borderWidth = textPtr->selBorderWidth;
+    textPtr->selTagPtr->fgColor = textPtr->selFgColorPtr;
+
+    /*
+     * Claim the selection if we've suddenly started exporting it and there
+     * are tagged characters.
+     */
+
+    if (textPtr->exportSelection && (!oldExport)) {
+       TkTextSearch search;
+
+       TkBTreeStartSearch(textPtr->tree, 0, 0, TkBTreeNumLines(textPtr->tree),
+               0, textPtr->selTagPtr, &search);
+       if (TkBTreeNextTag(&search)) {
+           Tk_OwnSelection(textPtr->tkwin, TkTextLostSelection,
+                   (ClientData) textPtr);
+           textPtr->flags |= GOT_SELECTION;
+       }
+    }
+
+    /*
+     * Register the desired geometry for the window, and arrange for
+     * the window to be redisplayed.
+     */
+
+    if (textPtr->width <= 0) {
+       textPtr->width = 1;
+    }
+    if (textPtr->height <= 0) {
+       textPtr->height = 1;
+    }
+    charWidth = XTextWidth(textPtr->fontPtr, "0", 1);
+    charHeight = (textPtr->fontPtr->ascent + textPtr->fontPtr->descent);
+    Tk_GeometryRequest(textPtr->tkwin,
+           textPtr->width * charWidth + 2*textPtr->borderWidth
+                   + 2*textPtr->padX,
+           textPtr->height * charHeight + 2*textPtr->borderWidth
+                   + 2*textPtr->padX);
+    Tk_SetInternalBorder(textPtr->tkwin, textPtr->borderWidth);
+    if (textPtr->setGrid) {
+       Tk_SetGrid(textPtr->tkwin, textPtr->width, textPtr->height,
+               charWidth, charHeight);
+    }
+
+    TkTextRelayoutWindow(textPtr);
+    return TCL_OK;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TextEventProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher on
+ *     structure changes to a text.  For texts with 3D
+ *     borders, this procedure is also invoked for exposures.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the window gets deleted, internal structures get
+ *     cleaned up.  When it gets exposed, it is redisplayed.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+TextEventProc(clientData, eventPtr)
+    ClientData clientData;     /* Information about window. */
+    register XEvent *eventPtr; /* Information about event. */
+{
+    register TkText *textPtr = (TkText *) clientData;
+
+    if (eventPtr->type == Expose) {
+       TkTextRedrawRegion(textPtr, eventPtr->xexpose.x,
+               eventPtr->xexpose.y, eventPtr->xexpose.width,
+               eventPtr->xexpose.height);
+    } else if (eventPtr->type == ConfigureNotify) {
+       if ((textPtr->prevWidth != Tk_Width(textPtr->tkwin))
+               || (textPtr->prevHeight != Tk_Height(textPtr->tkwin))) {
+           TkTextRelayoutWindow(textPtr);
+       }
+    } else if (eventPtr->type == DestroyNotify) {
+       Tcl_DeleteCommand(textPtr->interp, Tk_PathName(textPtr->tkwin));
+       textPtr->tkwin = NULL;
+       Tk_EventuallyFree((ClientData) textPtr, DestroyText);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * InsertChars --
+ *
+ *     This procedure implements most of the functionality of the
+ *     "insert" widget command.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The characters in "string" get added to the text just before
+ *     the character indicated by "line" and "ch".
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+InsertChars(textPtr, line, ch, string)
+    TkText *textPtr;           /* Overall information about text widget. */
+    int line, ch;              /* Identifies character just before which
+                                * new information is to be inserted. */
+    char *string;              /* Null-terminated string containing new
+                                * information to add to text. */
+{
+    register TkTextLine *linePtr;
+
+    /*
+     * Locate the line where the insertion will occur.
+     */
+
+    linePtr = TkTextRoundIndex(textPtr, &line, &ch);
+
+    /*
+     * Notify the display module that lines are about to change, then do
+     * the insertion.
+     */
+
+    TkTextLinesChanged(textPtr, line, line);
+    TkBTreeInsertChars(textPtr->tree, linePtr, ch, string);
+
+    /*
+     * If the line containing the insertion point was textPtr->topLinePtr,
+     * we must reset this pointer since the line structure was re-allocated.
+     */
+
+    if (linePtr == textPtr->topLinePtr) {
+       TkTextSetView(textPtr, line, 0);
+    }
+
+    /*
+     * Invalidate any selection retrievals in progress.
+     */
+
+    textPtr->selOffset = -1;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DeleteChars --
+ *
+ *     This procedure implements most of the functionality of the
+ *     "delete" widget command.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DeleteChars(textPtr, line1, ch1, line2, ch2)
+    TkText *textPtr;           /* Overall information about text widget. */
+    int line1, ch1;            /* Position of first character to delete. */
+    int line2, ch2;            /* Position of character just after last
+                                * one to delete. */
+{
+    register TkTextLine *line1Ptr, *line2Ptr;
+    int numLines, topLine;
+
+    /*
+     * The loop below is needed because a LeaveNotify event may be
+     * generated on the current charcter if it's about to be deleted.
+     * If this happens, then the bindings that trigger could modify
+     * the text, invalidating the range information computed here.
+     * So, go back and recompute all the range information after
+     * synthesizing a leave event.
+     */
+
+    while (1) {
+
+       /*
+        * Locate the starting and ending lines for the deletion and adjust
+        * the endpoints if necessary to ensure that they are within valid
+        * ranges.  Adjust the deletion range if necessary to ensure that the
+        * text (and each invidiual line) always ends in a newline.
+        */
+    
+       numLines = TkBTreeNumLines(textPtr->tree);
+       line1Ptr = TkTextRoundIndex(textPtr, &line1, &ch1);
+       if (line2 < 0) {
+           return;
+       } else if (line2 >= numLines) {
+           line2 = numLines-1;
+           line2Ptr = TkBTreeFindLine(textPtr->tree, line2);
+           ch2 = line2Ptr->numBytes;
+       } else {
+           line2Ptr = TkBTreeFindLine(textPtr->tree, line2);
+           if (ch2 < 0) {
+               ch2 = 0;
+           }
+       }
+    
+       /*
+        * If the deletion range ends after the last character of a line,
+        * do one of three things:
+        *
+        * (a) if line2Ptr isn't the last line of the text, just adjust the
+        *     ending point to be just before the 0th character of the next
+        *     line.
+        * (b) if ch1 is at the beginning of a line, then adjust line1Ptr and
+        *     ch1 to point just after the last character of the previous line.
+        * (c) otherwise, adjust ch2 so the final newline isn't deleted.
+        */
+    
+       if (ch2 >= line2Ptr->numBytes) {
+           if (line2 < (numLines-1)) {
+               line2++;
+               line2Ptr = TkBTreeNextLine(line2Ptr);
+               ch2 = 0;
+           } else {
+               ch2 = line2Ptr->numBytes-1;
+               if ((ch1 == 0) && (line1 > 0)) {
+                   line1--;
+                   line1Ptr = TkBTreeFindLine(textPtr->tree, line1);
+                   ch1 = line1Ptr->numBytes;
+                   ch2 = line2Ptr->numBytes;
+               } else {
+                   ch2 = line2Ptr->numBytes-1;
+               }
+           }
+       }
+
+       if ((line1 > line2) || ((line1 == line2) && (ch1 >= ch2))) {
+           return;
+       }
+
+       /*
+        * If the current character is within the range being deleted,
+        * unpick it and synthesize a leave event for its tags, then
+        * go back and recompute the range ends.
+        */
+
+       if (!(textPtr->flags & IN_CURRENT)) {
+           break;
+       }
+       if ((textPtr->currentAnnotPtr->linePtr == line1Ptr)
+               && (textPtr->currentAnnotPtr->ch < ch1)) {
+           break;
+       }
+       if ((textPtr->currentAnnotPtr->linePtr == line2Ptr)
+               && (textPtr->currentAnnotPtr->ch >= ch2)) {
+           break;
+       }
+       if (line2 > (line1+1)) {
+           int currentLine;
+
+           currentLine = TkBTreeLineIndex(textPtr->currentAnnotPtr->linePtr);
+           if ((currentLine <= line1) || (currentLine >= line2)) {
+               break;
+           }
+       }
+       TkTextUnpickCurrent(textPtr);
+    }
+
+    /*
+     * Tell the display what's about to happen so it can discard
+     * obsolete display information, then do the deletion.  Also,
+     * check to see if textPtr->topLinePtr is in the range of
+     * characters deleted.  If so, call the display module to reset
+     * it after doing the deletion.
+     */
+
+    topLine = TkBTreeLineIndex(textPtr->topLinePtr);
+    TkTextLinesChanged(textPtr, line1, line2);
+    TkBTreeDeleteChars(textPtr->tree, line1Ptr, ch1, line2Ptr, ch2);
+    if ((topLine >= line1) && (topLine <= line2)) {
+       numLines = TkBTreeNumLines(textPtr->tree);
+       TkTextSetView(textPtr, (line1 > (numLines-1)) ? (numLines-1) : line1,
+               0);
+    }
+
+    /*
+     * Invalidate any selection retrievals in progress.
+     */
+
+    textPtr->selOffset = -1;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TextFetchSelection --
+ *
+ *     This procedure is called back by Tk when the selection is
+ *     requested by someone.  It returns part or all of the selection
+ *     in a buffer provided by the caller.
+ *
+ * Results:
+ *     The return value is the number of non-NULL bytes stored
+ *     at buffer.  Buffer is filled (or partially filled) with a
+ *     NULL-terminated string containing part or all of the selection,
+ *     as given by offset and maxBytes.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+TextFetchSelection(clientData, offset, buffer, maxBytes)
+    ClientData clientData;             /* Information about text widget. */
+    int offset;                                /* Offset within selection of first
+                                        * character to be returned. */
+    char *buffer;                      /* Location in which to place
+                                        * selection. */
+    int maxBytes;                      /* Maximum number of bytes to place
+                                        * at buffer, not including terminating
+                                        * NULL character. */
+{
+    register TkText *textPtr = (TkText *) clientData;
+    register TkTextLine *linePtr;
+    int count, chunkSize;
+    TkTextSearch search;
+
+    if (!textPtr->exportSelection) {
+       return -1;
+    }
+
+    /*
+     * Find the beginning of the next range of selected text.  Note:  if
+     * the selection is being retrieved in multiple pieces (offset != 0)
+     * and some modification has been made to the text that affects the
+     * selection (textPtr->selOffset != offset) then reject the selection
+     * request (make 'em start over again).
+     */
+
+    if (offset == 0) {
+       textPtr->selLine = 0;
+       textPtr->selCh = 0;
+       textPtr->selOffset = 0;
+    } else if (textPtr->selOffset != offset) {
+       return 0;
+    }
+    TkBTreeStartSearch(textPtr->tree, textPtr->selLine, textPtr->selCh+1,
+           TkBTreeNumLines(textPtr->tree), 0, textPtr->selTagPtr, &search);
+    if (!TkBTreeCharTagged(search.linePtr, textPtr->selCh,
+           textPtr->selTagPtr)) {
+       if (!TkBTreeNextTag(&search)) {
+           if (offset == 0) {
+               return -1;
+           } else {
+               return 0;
+           }
+       }
+       textPtr->selLine = search.line1;
+       textPtr->selCh = search.ch1;
+    }
+
+    /*
+     * Each iteration through the outer loop below scans one selected range.
+     * Each iteration through the nested loop scans one line in the
+     * selected range.
+     */
+
+    count = 0;
+    while (1) {
+       linePtr = search.linePtr;
+
+       /*
+        * Find the end of the current range of selected text.
+        */
+
+       if (!TkBTreeNextTag(&search)) {
+           panic("TextFetchSelection couldn't find end of range");
+       }
+
+       /*
+        * Copy information from text lines into the buffer until
+        * either we run out of space in the buffer or we get to
+        * the end of this range of text.
+        */
+
+       while (1) {
+           chunkSize = ((linePtr == search.linePtr) ? search.ch1
+                   : linePtr->numBytes) - textPtr->selCh;
+           if (chunkSize > maxBytes) {
+               chunkSize = maxBytes;
+           }
+           memcpy((VOID *) buffer, (VOID *) (linePtr->bytes + textPtr->selCh),
+                   chunkSize);
+           buffer += chunkSize;
+           maxBytes -= chunkSize;
+           count += chunkSize;
+           textPtr->selOffset += chunkSize;
+           if (maxBytes == 0) {
+               textPtr->selCh += chunkSize;
+               goto done;
+           }
+           if (linePtr == search.linePtr) {
+               break;
+           }
+           textPtr->selCh = 0;
+           textPtr->selLine++;
+           linePtr = TkBTreeNextLine(linePtr);
+       }
+
+       /*
+        * Find the beginning of the next range of selected text.
+        */
+
+       if (!TkBTreeNextTag(&search)) {
+           break;
+       }
+       textPtr->selLine = search.line1;
+       textPtr->selCh = search.ch1;
+    }
+
+    done:
+    *buffer = 0;
+    return count;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextLostSelection --
+ *
+ *     This procedure is called back by Tk when the selection is
+ *     grabbed away from a text widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The "sel" tag is cleared from the window.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkTextLostSelection(clientData)
+    ClientData clientData;             /* Information about text widget. */
+{
+    register TkText *textPtr = (TkText *) clientData;
+
+    if (!textPtr->exportSelection) {
+       return;
+    }
+
+    /*
+     * Just remove the "sel" tag from everything in the widget.
+     */
+
+    TkTextRedrawTag(textPtr, 0, 0, TkBTreeNumLines(textPtr->tree),
+           0, textPtr->selTagPtr, 1);
+    TkBTreeTag(textPtr->tree, 0, 0, TkBTreeNumLines(textPtr->tree),
+           0, textPtr->selTagPtr, 0);
+    textPtr->flags &= ~GOT_SELECTION;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TextMarkCmd --
+ *
+ *     This procedure is invoked to process the "mark" options of
+ *     the widget command for text widgets. See the user documentation
+ *     for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+TextMarkCmd(textPtr, interp, argc, argv)
+    register TkText *textPtr;  /* Information about text widget. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings.  Someone else has already
+                                * parsed this command enough to know that
+                                * argv[1] is "mark". */
+{
+    int length, line, ch, i;
+    char c;
+    Tcl_HashEntry *hPtr;
+    TkAnnotation *markPtr;
+    Tcl_HashSearch search;
+
+    if (argc < 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " mark option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    c = argv[2][0];
+    length = strlen(argv[2]);
+    if ((c == 'n') && (strncmp(argv[2], "names", length) == 0)) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " mark names\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       for (hPtr = Tcl_FirstHashEntry(&textPtr->markTable, &search);
+               hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
+           Tcl_AppendElement(interp,
+                   Tcl_GetHashKey(&textPtr->markTable, hPtr), 0);
+       }
+    } else if ((c == 's') && (strncmp(argv[2], "set", length) == 0)) {
+       if (argc != 5) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " mark set markName index\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (TkTextGetIndex(interp, textPtr, argv[4], &line, &ch) != TCL_OK) {
+           return TCL_ERROR;
+       }
+       TkTextSetMark(textPtr, argv[3], line, ch);
+    } else if ((c == 'u') && (strncmp(argv[2], "unset", length) == 0)) {
+       if (argc < 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " mark unset markName ?markName ...?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       for (i = 3; i < argc; i++) {
+           hPtr = Tcl_FindHashEntry(&textPtr->markTable, argv[i]);
+           if (hPtr != NULL) {
+               markPtr = (TkAnnotation *) Tcl_GetHashValue(hPtr);
+               if (markPtr == textPtr->insertAnnotPtr) {
+                   interp->result = "can't delete \"insert\" mark";
+                   return TCL_ERROR;
+               }
+               if (markPtr == textPtr->currentAnnotPtr) {
+                   interp->result = "can't delete \"current\" mark";
+                   return TCL_ERROR;
+               }
+               TkBTreeRemoveAnnotation(markPtr);
+               Tcl_DeleteHashEntry(hPtr);
+               ckfree((char *) markPtr);
+           }
+       }
+    } else {
+       Tcl_AppendResult(interp, "bad mark option \"", argv[2],
+               "\":  must be names, set, or unset",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextSetMark --
+ *
+ *     Set a mark to a particular position, creating a new mark if
+ *     one doesn't already exist.
+ *
+ * Results:
+ *     The return value is a pointer to the mark that was just set.
+ *
+ * Side effects:
+ *     A new mark is created, or an existing mark is moved.
+ *
+ *----------------------------------------------------------------------
+ */
+
+TkAnnotation *
+TkTextSetMark(textPtr, name, line, ch)
+    TkText *textPtr;           /* Text widget in which to create mark. */
+    char *name;                        /* Name of mark to set. */
+    int line;                  /* Index of line at which to place mark. */
+    int ch;                    /* Index of character within line at which
+                                * to place mark. */
+{
+    Tcl_HashEntry *hPtr;
+    TkAnnotation *markPtr;
+    int new;
+
+    hPtr = Tcl_CreateHashEntry(&textPtr->markTable, name, &new);
+    markPtr = (TkAnnotation *) Tcl_GetHashValue(hPtr);
+    if (!new) {
+       /*
+        * If this is the insertion point that's being moved, be sure
+        * to force a display update at the old position.
+        */
+
+       if (markPtr == textPtr->insertAnnotPtr) {
+           int oldLine;
+
+           oldLine = TkBTreeLineIndex(markPtr->linePtr);
+           TkTextLinesChanged(textPtr, oldLine, oldLine);
+       }
+       TkBTreeRemoveAnnotation(markPtr);
+    } else {
+       markPtr = (TkAnnotation *) ckalloc(sizeof(TkAnnotation));
+       markPtr->type = TK_ANNOT_MARK;
+       markPtr->info.hPtr = hPtr;
+       Tcl_SetHashValue(hPtr, markPtr);
+    }
+    if (line < 0) {
+       line = 0;
+       markPtr->ch = 0;
+    } else if (ch < 0) {
+       markPtr->ch = 0;
+    } else {
+       markPtr->ch = ch;
+    }
+    markPtr->linePtr = TkBTreeFindLine(textPtr->tree, line);
+    if (markPtr->linePtr == NULL) {
+       line = TkBTreeNumLines(textPtr->tree)-1;
+       markPtr->linePtr = TkBTreeFindLine(textPtr->tree, line);
+       markPtr->ch = markPtr->linePtr->numBytes-1;
+    } else {
+       if (markPtr->ch >= markPtr->linePtr->numBytes) {
+           TkTextLine *nextLinePtr;
+
+           nextLinePtr = TkBTreeNextLine(markPtr->linePtr);
+           if (nextLinePtr == NULL) {
+               markPtr->ch = markPtr->linePtr->numBytes-1;
+           } else {
+               markPtr->linePtr = nextLinePtr;
+               line++;
+               markPtr->ch = 0;
+           }
+       }
+    }
+    TkBTreeAddAnnotation(markPtr);
+
+    /*
+     * If the mark is the insertion cursor, then update the screen at the
+     * mark's new location.
+     */
+
+    if (markPtr == textPtr->insertAnnotPtr) {
+       TkTextLinesChanged(textPtr, line, line);
+    }
+    return markPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TextBlinkProc --
+ *
+ *     This procedure is called as a timer handler to blink the
+ *     insertion cursor off and on.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The cursor gets turned on or off, redisplay gets invoked,
+ *     and this procedure reschedules itself.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+TextBlinkProc(clientData)
+    ClientData clientData;     /* Pointer to record describing text. */
+{
+    register TkText *textPtr = (TkText *) clientData;
+    int lineNum;
+
+    if (!(textPtr->flags & GOT_FOCUS) || (textPtr->insertOffTime == 0)) {
+       return;
+    }
+    if (textPtr->flags & INSERT_ON) {
+       textPtr->flags &= ~INSERT_ON;
+       textPtr->insertBlinkHandler = Tk_CreateTimerHandler(
+               textPtr->insertOffTime, TextBlinkProc, (ClientData) textPtr);
+    } else {
+       textPtr->flags |= INSERT_ON;
+       textPtr->insertBlinkHandler = Tk_CreateTimerHandler(
+               textPtr->insertOnTime, TextBlinkProc, (ClientData) textPtr);
+    }
+    lineNum = TkBTreeLineIndex(textPtr->insertAnnotPtr->linePtr);
+    TkTextLinesChanged(textPtr, lineNum, lineNum);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TextFocusProc --
+ *
+ *     This procedure is called whenever the entry gets or loses the
+ *     input focus.  It's also called whenever the window is reconfigured
+ *     while it has the focus.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The cursor gets turned on or off.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+TextFocusProc(clientData, gotFocus)
+    ClientData clientData;     /* Pointer to structure describing text. */
+    int gotFocus;              /* 1 means window is getting focus, 0 means
+                                * it's losing it. */
+{
+    register TkText *textPtr = (TkText *) clientData;
+    int lineNum;
+
+    Tk_DeleteTimerHandler(textPtr->insertBlinkHandler);
+    if (gotFocus) {
+       textPtr->flags |= GOT_FOCUS | INSERT_ON;
+       if (textPtr->insertOffTime != 0) {
+           textPtr->insertBlinkHandler = Tk_CreateTimerHandler(
+                   textPtr->insertOnTime, TextBlinkProc,
+                   (ClientData) textPtr);
+       }
+    } else {
+       textPtr->flags &= ~(GOT_FOCUS | INSERT_ON);
+       textPtr->insertBlinkHandler = (Tk_TimerToken) NULL;
+    }
+    lineNum = TkBTreeLineIndex(textPtr->insertAnnotPtr->linePtr);
+    TkTextLinesChanged(textPtr, lineNum, lineNum);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TextScanCmd --
+ *
+ *     This procedure is invoked to process the "scan" options of
+ *     the widget command for text widgets. See the user documentation
+ *     for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+TextScanCmd(textPtr, interp, argc, argv)
+    register TkText *textPtr;  /* Information about text widget. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings.  Someone else has already
+                                * parsed this command enough to know that
+                                * argv[1] is "tag". */
+{
+    int length, y, line, lastLine;
+    char c;
+
+    if (argc != 4) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " scan mark|dragto y\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (Tcl_GetInt(interp, argv[3], &y) != TCL_OK) {
+       return TCL_ERROR;
+    }
+    c = argv[2][0];
+    length = strlen(argv[2]);
+    if ((c == 'd') && (strncmp(argv[2], "dragto", length) == 0)) {
+       /*
+        * Amplify the difference between the current y position and the
+        * mark position to compute how many lines up or down the view
+        * should shift, then update the mark position to correspond to
+        * the new view.  If we run off the top or bottom of the text,
+        * reset the mark point so that the current position continues
+        * to correspond to the edge of the window.  This means that the
+        * picture will start dragging as soon as the mouse reverses
+        * direction (without this reset, might have to slide mouse a
+        * long ways back before the picture starts moving again).
+        */
+
+       line = textPtr->scanMarkLine + (10*(textPtr->scanMarkY - y))
+               / (textPtr->fontPtr->ascent + textPtr->fontPtr->descent);
+       lastLine = TkBTreeNumLines(textPtr->tree) - 1;
+       if (line < 0) {
+           textPtr->scanMarkLine = line = 0;
+           textPtr->scanMarkY = y;
+       } else if (line > lastLine) {
+           textPtr->scanMarkLine = line = lastLine;
+           textPtr->scanMarkY = y;
+       }
+       TkTextSetView(textPtr, line, 0);
+    } else if ((c == 'm') && (strncmp(argv[2], "mark", length) == 0)) {
+       textPtr->scanMarkLine = TkBTreeLineIndex(textPtr->topLinePtr);
+       textPtr->scanMarkY = y;
+    } else {
+       Tcl_AppendResult(interp, "bad scan option \"", argv[2],
+               "\":  must be mark or dragto", (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
diff --git a/src/tk/tktext.h b/src/tk/tktext.h
new file mode 100644 (file)
index 0000000..2cfeb61
--- /dev/null
@@ -0,0 +1,416 @@
+/*
+ * tkText.h --
+ *
+ *     Declarations shared among the files that implement text
+ *     widgets.
+ *
+ * Copyright 1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ *
+ * $Header: /user6/ouster/wish/RCS/tkText.h,v 1.13 92/07/31 13:43:26 ouster Exp $ SPRITE (Berkeley)
+ */
+
+#ifndef _TKTEXT
+#define _TKTEXT
+
+#ifndef _TK
+#include "tk.h"
+#endif
+
+/*
+ * Opaque types for structures whose guts are only needed by a single
+ * file:
+ */
+
+typedef struct TkTextBTree *TkTextBTree;
+
+/*
+ * The data structure below defines a single line of text (from newline
+ * to newline, not necessarily what appears on one line of the screen).
+ */
+
+typedef struct TkTextLine {
+    struct Node *parentPtr;            /* Pointer to parent node containing
+                                        * line. */
+    struct TkTextLine *nextPtr;                /* Next in linked list of lines with
+                                        * same parent node in B-tree.  NULL
+                                        * means end of list. */
+    struct TkAnnotation *annotPtr;     /* First in list of annotations for
+                                        * this line. */
+    int numBytes;                      /* Number of  bytes in line, including
+                                        * newline but not terminating NULL. */
+    char bytes[4];                     /* Contents of line, null-terminated.
+                                        * The actual length of the array will
+                                        * be as large as needed to hold the
+                                        * line.  THIS MUST BE THE LAST FIELD
+                                        * OF THE STRUCT. */
+} TkTextLine;
+
+/*
+ * The structures below are used to describe annotations to the text
+ * (such as marks and embedded windows).  Annotations are placed at
+ * a given place in the text and then float to keep their position
+ * as text is inserted and deleted.  Each actual annotation
+ * contains a standard set of fields, plus a type-specific set of
+ * fields.  The types are as follows:
+ *
+ * TK_ANNOT_TOGGLE -   Marks the beginning or end of a range of
+ *                     characters that have a given tag.
+ * TK_ANNOT_MARK -     Holds information about a given "mark" (see
+ *                     user doc. for information on marks).
+ * TK_ANNOT_WINDOW -   Holds information on a window embedded in the
+ *                     text.  Not implemented yet.
+ */
+
+typedef enum {TK_ANNOT_TOGGLE, TK_ANNOT_MARK, TK_ANNOT_WINDOW} TkAnnotType;
+
+typedef struct TkAnnotation {
+    TkAnnotType type;                  /* Type of annotation. */
+    TkTextLine *linePtr;               /* Pointer to line structure
+                                        * containing this annotation. */
+    int ch;                            /* Index of character that annotation
+                                        * is attached to (annotation is
+                                        * considered to be just before this
+                                        * character). */
+    struct TkAnnotation *nextPtr;      /* Next in list of annotations for
+                                        * same line of text, or NULL if
+                                        * end of list. */
+    union {                            /* Type-specific information. */
+       struct TkTextTag *tagPtr;       /* Type == TK_ANNOT_TOGGLE. */
+       Tcl_HashEntry *hPtr;            /* Type == TK_ANNOT_MARK. */
+    } info;
+} TkAnnotation;
+
+/*
+ * One data structure of the following type is used for each tag that
+ * is currently being used in a text widget.  These structures are kept
+ * in textPtr->tagTable and referred to in other structures, like
+ * TkTagToggles.
+ */
+
+typedef struct TkTextTag {
+    char *name;                        /* Name of this tag.  This field is actually
+                                * a pointer to the key from the entry in
+                                * textPtr->tagTable, so it needn't be freed
+                                * explicitly. */
+    int priority;              /* Priority of this tag within widget.  0
+                                * means lowest priority.  Exactly one tag
+                                * has each integer value between 0 and
+                                * numTags-1. */
+
+    /*
+     * Information for displaying text with this tag.  The information
+     * belows acts as an override on information specified by lower-priority
+     * tags.  If no value is specified, then the next-lower-priority tag
+     * on the text determins the value.  The text widget itself provides
+     * defaults if no tag specifies an override.
+     */
+
+    Tk_3DBorder border;                /* Used for drawing background.  NULL means
+                                * no value specified here. */
+    int borderWidth;           /* Width of 3-D border for background. */
+    int relief;                        /* 3-D relief for background. */
+    Pixmap bgStipple;          /* Stipple bitmap for background.  None
+                                * means no value specified here. */
+    XColor *fgColor;           /* Foreground color for text.  NULL means
+                                * no value specified here. */
+    XFontStruct *fontPtr;      /* Font for displaying text.  NULL means
+                                * no value specified here. */
+    Pixmap fgStipple;          /* Stipple bitmap for text and other
+                                * foreground stuff.   None means no value
+                                * specified here.*/
+    int underline;             /* Non-zero means draw underline underneath
+                                * text. */
+} TkTextTag;
+
+/*
+ * The macro below determines whether or not a particular tag affects
+ * the way information is displayed on the screen.  It's used, for
+ * example, to determine when to redisplay in response to tag changes.
+ */
+
+#define TK_TAG_AFFECTS_DISPLAY(tagPtr)                                         \
+       (((tagPtr)->border != NULL) || ((tagPtr)->bgStipple != None)    \
+       || ((tagPtr)->fgColor != NULL) || ((tagPtr)->fontPtr != NULL)   \
+       || ((tagPtr)->fgStipple != None) || ((tagPtr)->underline))
+
+/*
+ * The data structure below is used for searching a B-tree for transitions
+ * on a single tag (or for all tag transitions).  No code outside of
+ * tkTextBTree.c should ever modify any of the fields in these structures,
+ * but it's OK to use them for read-only information.
+ */
+
+typedef struct TkTextSearch {
+    TkTextBTree tree;                  /* Tree being searched. */
+    int line1, ch1;                    /* Position of last tag returned
+                                        * by TkBTreeNextTag. */
+    int line2, ch2;                    /* Stop search after all tags at this
+                                        * character position have been
+                                        * processed. */
+    TkTextTag *tagPtr;                 /* Tag to search for (or tag found, if
+                                        * allTags is non-zero). */
+    int allTags;                       /* Non-zero means ignore tag check:
+                                        * search for transitions on all
+                                        * tags. */
+    TkTextLine *linePtr;               /* Line currently being searched.  NULL
+                                        * means search is over. */
+    TkAnnotation *annotPtr;            /* Pointer to next annotation to
+                                        * consider.  NULL means no annotations
+                                        * left in current line;  must go on
+                                        * to next line. */
+} TkTextSearch;
+
+/*
+ * A data structure of the following type is kept for each text widget that
+ * currently exists for this process:
+ */
+
+typedef struct TkText {
+    Tk_Window tkwin;           /* Window that embodies the text.  NULL
+                                * means that the window has been destroyed
+                                * but the data structures haven't yet been
+                                * cleaned up.*/
+    Tcl_Interp *interp;                /* Interpreter associated with widget.  Used
+                                * to delete widget command.  */
+    TkTextBTree tree;          /* B-tree representation of text and tags for
+                                * widget. */
+    Tcl_HashTable tagTable;    /* Hash table that maps from tag names to
+                                * pointers to TkTextTag structures. */
+    int numTags;               /* Number of tags currently defined for
+                                * widget;  needed to keep track of
+                                * priorities. */
+    Tcl_HashTable markTable;   /* Hash table that maps from mark names to
+                                * pointer to TkAnnotation structures of
+                                * type TK_ANNOT_MARK. */
+    Tk_Uid state;              /* Normal or disabled.  Text is read-only
+                                * when disabled. */
+
+    /*
+     * Default information for displaying (may be overridden by tags
+     * applied to ranges of characters).
+     */
+
+    Tk_3DBorder border;                /* Structure used to draw 3-D border and
+                                * default background. */
+    int borderWidth;           /* Width of 3-D border to draw around entire
+                                * widget. */
+    int padX, padY;            /* Padding between text and window border. */
+    int relief;                        /* 3-d effect for border around entire
+                                * widget: TK_RELIEF_RAISED etc. */
+    Cursor cursor;             /* Current cursor for window, or None. */
+    XColor *fgColor;           /* Default foreground color for text. */
+    XFontStruct *fontPtr;      /* Default font for displaying text. */
+
+    /*
+     * Additional information used for displaying:
+     */
+
+    Tk_Uid wrapMode;           /* How to handle wrap-around.  Must be
+                                * tkTextCharUid, tkTextNoneUid, or
+                                * tkTextWordUid. */
+    int width, height;         /* Desired dimensions for window, measured
+                                * in characters. */
+    int setGrid;               /* Non-zero means pass gridding information
+                                * to window manager. */
+    int prevWidth, prevHeight; /* Last known dimensions of window;  used to
+                                * detect changes in size. */
+    TkTextLine *topLinePtr;    /* Text line that is supposed to be displayed
+                                * at top of the window:  set only by
+                                * tkTextDisp.c. */
+    struct DInfo *dInfoPtr;    /* Additional information maintained by
+                                * tkTextDisp.c. */
+    Tk_TimerToken updateTimerToken; /* Added by Don to optimize rapid 
+                                    * updates. */
+    
+    /*
+     * Information related to selection.
+     */
+
+    TkTextTag *selTagPtr;      /* Pointer to "sel" tag.  Used to tell when
+                                * a new selection has been made. */
+    Tk_3DBorder selBorder;     /* Border and background for selected
+                                * characters.  This is a copy of information
+                                * in *cursorTagPtr, so it shouldn't be
+                                * explicitly freed. */
+    int selBorderWidth;                /* Width of border around selection. */
+    XColor *selFgColorPtr;     /* Foreground color for selected text.
+                                * This is a copy of information in
+                                * *cursorTagPtr, so it shouldn't be
+                                * explicitly freed. */
+    int exportSelection;       /* Non-zero means tie "sel" tag to X
+                                * selection. */
+    int selLine, selCh;                /* Used during multi-pass selection retrievals.
+                                * These identify the next character to be
+                                * returned from the selection. */
+    int selOffset;             /* Offset in selection corresponding to
+                                * selLine and selCh.  -1 means neither
+                                * this information nor selLine or selCh
+                                * is of any use. */
+
+    /*
+     * Information related to insertion cursor:
+     */
+
+    TkAnnotation *insertAnnotPtr;
+                               /* Always points to annotation for "insert"
+                                * mark. */
+    Tk_3DBorder insertBorder;  /* Used to draw vertical bar for insertion
+                                * cursor. */
+    int insertWidth;           /* Total width of insert cursor. */
+    int insertBorderWidth;     /* Width of 3-D border around insert cursor. */
+    int insertOnTime;          /* Number of milliseconds cursor should spend
+                                * in "on" state for each blink. */
+    int insertOffTime;         /* Number of milliseconds cursor should spend
+                                * in "off" state for each blink. */
+    Tk_TimerToken insertBlinkHandler;
+                               /* Timer handler used to blink cursor on and
+                                * off. */
+
+    /*
+     * Information used for event bindings associated with tags:
+     */
+
+    Tk_BindingTable bindingTable;
+                               /* Table of all bindings currently defined
+                                * for this widget.  NULL means that no
+                                * bindings exist, so the table hasn't been
+                                * created.  Each "object" used for this
+                                * table is the address of a tag. */
+    TkAnnotation *currentAnnotPtr;
+                               /* Pointer to annotation for "current" mark,
+                                * or NULL if none. */
+    XEvent pickEvent;          /* The event from which the current character
+                                * was chosen.  Must be saved so that we
+                                * can repick after insertions and deletions. */
+
+    /*
+     * Miscellaneous additional information:
+     */
+
+    char *yScrollCmd;          /* Prefix of command to issue to update
+                                * vertical scrollbar when view changes. */
+    int scanMarkLine;          /* Line that was at the top of the window
+                                * when the scan started. */
+    int scanMarkY;             /* Y-position of mouse at time scan started. */
+    int flags;                 /* Miscellaneous flags;  see below for
+                                * definitions. */
+} TkText;
+
+/*
+ * Flag values for TkText records:
+ *
+ * GOT_SELECTION:              Non-zero means we've already claimed the
+ *                             selection.
+ * INSERT_ON:                  Non-zero means insertion cursor should be
+ *                             displayed on screen.
+ * GOT_FOCUS:                  Non-zero means this window has the input
+ *                             focus.
+ * BUTTON_DOWN:                        1 means that a mouse button is currently
+ *                             down;  this is used to implement grabs
+ *                             for the duration of button presses.
+ * IN_CURRENT:                 1 means that an EnterNotify event has been
+ *                             delivered to the current character with
+ *                             no matching LeaveNotify event yet.
+ */
+
+#define GOT_SELECTION  1
+#define INSERT_ON      2
+#define GOT_FOCUS      4
+#define BUTTON_DOWN    8
+#define IN_CURRENT     0x10
+
+/*
+ * The constant below is used to specify a line when what is really
+ * wanted is the entire text.  For now, just use a very big number.
+ */
+
+#define TK_END_OF_TEXT 1000000
+
+/*
+ * Declarations for variables shared among the text-related files:
+ */
+
+extern int tkBTreeDebug;
+extern Tk_Uid tkTextCharUid;
+extern Tk_Uid tkTextDisabledUid;
+extern Tk_Uid tkTextNoneUid;
+extern Tk_Uid tkTextNormalUid;
+extern Tk_Uid tkTextWordUid;
+
+/*
+ * Declarations for procedures that are used by the text-related files
+ * but shouldn't be used anywhere else in Tk (or by Tk clients):
+ */
+
+extern void            TkBTreeAddAnnotation _ANSI_ARGS_((
+                           TkAnnotation *annotPtr));
+extern int             TkBTreeCharTagged _ANSI_ARGS_((TkTextLine *linePtr,
+                           int index, TkTextTag *tagPtr));
+extern void            TkBTreeCheck _ANSI_ARGS_((TkTextBTree tree));
+extern TkTextBTree     TkBTreeCreate _ANSI_ARGS_((void));
+extern void            TkBTreeDestroy _ANSI_ARGS_((TkTextBTree tree));
+extern void            TkBTreeDeleteChars _ANSI_ARGS_((TkTextBTree tree,
+                           TkTextLine *line1Ptr, int ch1,
+                           TkTextLine *line2Ptr, int ch2));
+extern TkTextLine *    TkBTreeFindLine _ANSI_ARGS_((TkTextBTree tree,
+                           int line));
+extern TkTextTag **    TkBTreeGetTags _ANSI_ARGS_((TkTextBTree tree,
+                           TkTextLine *linePtr, int ch, int *numTagsPtr));
+extern void            TkBTreeInsertChars _ANSI_ARGS_((TkTextBTree tree,
+                           TkTextLine *linePtr, int ch, char *string));
+extern int             TkBTreeLineIndex _ANSI_ARGS_((TkTextLine *linePtr));
+extern TkTextLine *    TkBTreeNextLine _ANSI_ARGS_((TkTextLine *linePtr));
+extern int             TkBTreeNextTag _ANSI_ARGS_((TkTextSearch *searchPtr));
+extern int             TkBTreeNumLines _ANSI_ARGS_((TkTextBTree tree));
+extern void            TkBTreeRemoveAnnotation _ANSI_ARGS_((
+                           TkAnnotation *annotPtr));
+extern void            TkBTreeStartSearch _ANSI_ARGS_((TkTextBTree tree,
+                           int line1, int ch1, int line2, int ch2,
+                           TkTextTag *tagPtr, TkTextSearch *searchPtr));
+extern void            TkBTreeTag _ANSI_ARGS_((TkTextBTree tree, int line1,
+                           int ch1, int line2, int ch2, TkTextTag *tagPtr,
+                           int add));
+extern void            TkTextBindProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+extern TkTextLine *    TkTextCharAtLoc _ANSI_ARGS_((TkText *textPtr,
+                           int x, int y, int *chPtr));
+extern void            TkTextCreateDInfo _ANSI_ARGS_((TkText *textPtr));
+extern TkTextTag *     TkTextCreateTag _ANSI_ARGS_((TkText *textPtr,
+                           char *tagName));
+extern void            TkTextFreeDInfo _ANSI_ARGS_((TkText *textPtr));
+extern void            TkTextFreeTag _ANSI_ARGS_((TkTextTag *tagPtr));
+extern int             TkTextGetIndex _ANSI_ARGS_((Tcl_Interp *interp,
+                           TkText *textPtr, char *string, int *lineIndexPtr,
+                           int *chPtr));
+extern void            TkTextLinesChanged _ANSI_ARGS_((TkText *textPtr,
+                           int first, int last));
+extern void            TkTextLostSelection _ANSI_ARGS_((
+                           ClientData clientData));
+extern void            TkTextPickCurrent _ANSI_ARGS_((TkText *textPtr,
+                           XEvent *eventPtr));
+extern void            TkTextPrintIndex _ANSI_ARGS_((int line, int ch,
+                           char *string));
+extern TkTextLine *    TkTextRoundIndex _ANSI_ARGS_((TkText *textPtr,
+                           int *lineIndexPtr, int *chPtr));
+extern void            TkTextRedrawRegion _ANSI_ARGS_((TkText *textPtr,
+                           int x, int y, int width, int height));
+extern void            TkTextRedrawTag _ANSI_ARGS_((TkText *textPtr,
+                           int line1, int ch1, int line2, int ch2,
+                           TkTextTag *tagPtr, int withTag));
+extern void            TkTextRelayoutWindow _ANSI_ARGS_((TkText *textPtr));
+extern TkAnnotation *  TkTextSetMark _ANSI_ARGS_((TkText *textPtr, char *name,
+                           int line, int ch));
+extern void            TkTextSetView _ANSI_ARGS_((TkText *textPtr,
+                           int line, int pickPlace));
+extern int             TkTextTagCmd _ANSI_ARGS_((TkText *textPtr,
+                           Tcl_Interp *interp, int argc, char **argv));
+extern void            TkTextUnpickCurrent _ANSI_ARGS_((TkText *textPtr));
+
+#endif /* _TKTEXT */
diff --git a/src/tk/tktrig.c b/src/tk/tktrig.c
new file mode 100644 (file)
index 0000000..88a9cdc
--- /dev/null
@@ -0,0 +1,1185 @@
+/* 
+ * tkTrig.c --
+ *
+ *     This file contains a collection of trigonometry utility
+ *     routines that are used by Tk and in particular by the
+ *     canvas code.  It also has miscellaneous geometry functions
+ *     used by canvases.
+ *
+ * Copyright 1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkTrig.c,v 1.8 92/08/24 09:24:14 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include <stdio.h>
+#include <math.h>
+#include "tkconfig.h"
+#include "tkcanvas.h"
+
+#undef MIN
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#undef MAX
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#define PI 3.14159265358979323846
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkLineToPoint --
+ *
+ *     Compute the distance from a point to a finite line segment.
+ *
+ * Results:
+ *     The return value is the distance from the line segment
+ *     whose end-points are *end1Ptr and *end2Ptr to the point
+ *     given by *pointPtr.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+double
+TkLineToPoint(end1Ptr, end2Ptr, pointPtr)
+    double end1Ptr[2];         /* Coordinates of first end-point of line. */
+    double end2Ptr[2];         /* Coordinates of second end-point of line. */
+    double pointPtr[2];                /* Points to coords for point. */
+{
+    double x, y;
+
+    /*
+     * Compute the point on the line that is closest to the
+     * point.  This must be done separately for vertical edges,
+     * horizontal edges, and other edges.
+     */
+
+    if (end1Ptr[0] == end2Ptr[0]) {
+
+       /*
+        * Vertical edge.
+        */
+
+       x = end1Ptr[0];
+       if (end1Ptr[1] >= end2Ptr[1]) {
+           y = MIN(end1Ptr[1], pointPtr[1]);
+           y = MAX(y, end2Ptr[1]);
+       } else {
+           y = MIN(end2Ptr[1], pointPtr[1]);
+           y = MAX(y, end1Ptr[1]);
+       }
+    } else if (end1Ptr[1] == end2Ptr[1]) {
+
+       /*
+        * Horizontal edge.
+        */
+
+       y = end1Ptr[1];
+       if (end1Ptr[0] >= end2Ptr[0]) {
+           x = MIN(end1Ptr[0], pointPtr[0]);
+           x = MAX(x, end2Ptr[0]);
+       } else {
+           x = MIN(end2Ptr[0], pointPtr[0]);
+           x = MAX(x, end1Ptr[0]);
+       }
+    } else {
+       double m1, b1, m2, b2;
+
+       /*
+        * The edge is neither horizontal nor vertical.  Convert the
+        * edge to a line equation of the form y = m1*x + b1.  Then
+        * compute a line perpendicular to this edge but passing
+        * through the point, also in the form y = m2*x + b2.
+        */
+
+       m1 = (end2Ptr[1] - end1Ptr[1])/(end2Ptr[0] - end1Ptr[0]);
+       b1 = end1Ptr[1] - m1*end1Ptr[0];
+       m2 = -1.0/m1;
+       b2 = pointPtr[1] - m2*pointPtr[0];
+       x = (b2 - b1)/(m1 - m2);
+       y = m1*x + b1;
+       if (end1Ptr[0] > end2Ptr[0]) {
+           if (x > end1Ptr[0]) {
+               x = end1Ptr[0];
+               y = end1Ptr[1];
+           } else if (x < end2Ptr[0]) {
+               x = end2Ptr[0];
+               y = end2Ptr[1];
+           }
+       } else {
+           if (x > end2Ptr[0]) {
+               x = end2Ptr[0];
+               y = end2Ptr[1];
+           } else if (x < end1Ptr[0]) {
+               x = end1Ptr[0];
+               y = end1Ptr[1];
+           }
+       }
+    }
+
+    /*
+     * Compute the distance to the closest point.
+     */
+
+    return hypot(pointPtr[0] - x, pointPtr[1] - y);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkLineToArea --
+ *
+ *     Determine whether a line lies entirely inside, entirely
+ *     outside, or overlapping a given rectangular area.
+ *
+ * Results:
+ *     -1 is returned if the line given by end1Ptr and end2Ptr
+ *     is entirely outside the rectangle given by rectPtr.  0 is
+ *     returned if the polygon overlaps the rectangle, and 1 is
+ *     returned if the polygon is entirely inside the rectangle.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+TkLineToArea(end1Ptr, end2Ptr, rectPtr)
+    double end1Ptr[2];         /* X and y coordinates for one endpoint
+                                * of line. */
+    double end2Ptr[2];         /* X and y coordinates for other endpoint
+                                * of line. */
+    double rectPtr[4];         /* Points to coords for rectangle, in the
+                                * order x1, y1, x2, y2.  X1 must be no
+                                * larger than x2, and y1 no larger than y2. */
+{
+    int inside1, inside2;
+
+    /*
+     * First check the two points individually to see whether they
+     * are inside the rectangle or not.
+     */
+
+    inside1 = (end1Ptr[0] >= rectPtr[0]) && (end1Ptr[0] <= rectPtr[2])
+           && (end1Ptr[1] >= rectPtr[1]) && (end1Ptr[1] <= rectPtr[3]);
+    inside2 = (end2Ptr[0] >= rectPtr[0]) && (end2Ptr[0] <= rectPtr[2])
+           && (end2Ptr[1] >= rectPtr[1]) && (end2Ptr[1] <= rectPtr[3]);
+    if (inside1 != inside2) {
+       return 0;
+    }
+    if (inside1 & inside2) {
+       return 1;
+    }
+
+    /*
+     * Both points are outside the rectangle, but still need to check
+     * for intersections between the line and the rectangle.  Horizontal
+     * and vertical lines are particularly easy, so handle them
+     * separately.
+     */
+
+    if (end1Ptr[0] == end2Ptr[0]) {
+       /*
+        * Vertical line.
+        */
+    
+       if (((end1Ptr[1] >= rectPtr[1]) ^ (end2Ptr[1] >= rectPtr[1]))
+               && (end1Ptr[0] >= rectPtr[0])
+               && (end1Ptr[0] <= rectPtr[2])) {
+           return 0;
+       }
+    } else if (end1Ptr[1] == end2Ptr[1]) {
+       /*
+        * Horizontal line.
+        */
+    
+       if (((end1Ptr[0] >= rectPtr[0]) ^ (end2Ptr[0] >= rectPtr[0]))
+               && (end1Ptr[1] >= rectPtr[1])
+               && (end1Ptr[1] <= rectPtr[3])) {
+           return 0;
+       }
+    } else {
+       double m, x, y, low, high;
+    
+       /*
+        * Diagonal line.  Compute slope of line and use
+        * for intersection checks against each of the
+        * sides of the rectangle: left, right, bottom, top.
+        */
+    
+       m = (end2Ptr[1] - end1Ptr[1])/(end2Ptr[0] - end1Ptr[0]);
+       if (end1Ptr[0] < end2Ptr[0]) {
+           low = end1Ptr[0];  high = end2Ptr[0];
+       } else {
+           low = end2Ptr[0]; high = end1Ptr[0];
+       }
+    
+       /*
+        * Left edge.
+        */
+    
+       y = end1Ptr[1] + (rectPtr[0] - end1Ptr[0])*m;
+       if ((rectPtr[0] >= low) && (rectPtr[0] <= high)
+               && (y >= rectPtr[1]) && (y <= rectPtr[3])) {
+           return 0;
+       }
+    
+       /*
+        * Right edge.
+        */
+    
+       y += (rectPtr[2] - rectPtr[0])*m;
+       if ((y >= rectPtr[1]) && (y <= rectPtr[3])
+               && (rectPtr[2] >= low) && (rectPtr[2] <= high)) {
+           return 0;
+       }
+    
+       /*
+        * Bottom edge.
+        */
+    
+       if (end1Ptr[1] < end2Ptr[1]) {
+           low = end1Ptr[1];  high = end2Ptr[1];
+       } else {
+           low = end2Ptr[1]; high = end1Ptr[1];
+       }
+       x = end1Ptr[0] + (rectPtr[1] - end1Ptr[1])/m;
+       if ((x >= rectPtr[0]) && (x <= rectPtr[2])
+               && (rectPtr[1] >= low) && (rectPtr[1] <= high)) {
+           return 0;
+       }
+    
+       /*
+        * Top edge.
+        */
+    
+       x += (rectPtr[3] - rectPtr[1])/m;
+       if ((x >= rectPtr[0]) && (x <= rectPtr[2])
+               && (rectPtr[3] >= low) && (rectPtr[3] <= high)) {
+           return 0;
+       }
+    }
+    return -1;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkPolygonToPoint --
+ *
+ *     Compute the distance from a point to a polygon.
+ *
+ * Results:
+ *     The return value is 0.0 if the point referred to by
+ *     pointPtr is within the polygon referred to by polyPtr
+ *     and numPoints.  Otherwise the return value is the
+ *     distance of the point from the polygon.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+double
+TkPolygonToPoint(polyPtr, numPoints, pointPtr)
+    double *polyPtr;           /* Points to an array coordinates for
+                                * closed polygon:  x0, y0, x1, y1, ...
+                                * The polygon may be self-intersecting. */
+    int numPoints;             /* Total number of points at *polyPtr. */
+    double *pointPtr;          /* Points to coords for point. */
+{
+    double bestDist;           /* Closest distance between point and
+                                * any edge in polygon. */
+    int intersections;         /* Number of edges in the polygon that
+                                * intersect a ray extending vertically
+                                * upwards from the point to infinity. */
+    int count;
+    register double *pPtr;
+
+    /*
+     * Iterate through all of the edges in the polygon, updating
+     * bestDist and intersections.
+     *
+     * TRICKY POINT:  when computing intersections, include left
+     * x-coordinate of line within its range, but not y-coordinate.
+     * Otherwise if the point lies exactly below a vertex we'll
+     * count it as two intersections.
+     */
+
+    bestDist = 1.0e40;
+    intersections = 0;
+
+    for (count = numPoints, pPtr = polyPtr; count > 1; count--, pPtr += 2) {
+       double x, y, dist;
+
+       /*
+        * Compute the point on the current edge closest to the point
+        * and update the intersection count.  This must be done
+        * separately for vertical edges, horizontal edges, and
+        * other edges.
+        */
+
+       if (pPtr[2] == pPtr[0]) {
+
+           /*
+            * Vertical edge.
+            */
+
+           x = pPtr[0];
+           if (pPtr[1] >= pPtr[3]) {
+               y = MIN(pPtr[1], pointPtr[1]);
+               y = MAX(y, pPtr[3]);
+           } else {
+               y = MIN(pPtr[3], pointPtr[1]);
+               y = MAX(y, pPtr[1]);
+           }
+       } else if (pPtr[3] == pPtr[1]) {
+
+           /*
+            * Horizontal edge.
+            */
+
+           y = pPtr[1];
+           if (pPtr[0] >= pPtr[2]) {
+               x = MIN(pPtr[0], pointPtr[0]);
+               x = MAX(x, pPtr[2]);
+               if ((pointPtr[1] < y) && (pointPtr[0] < pPtr[0])
+                       && (pointPtr[0] >= pPtr[2])) {
+                   intersections++;
+               }
+           } else {
+               x = MIN(pPtr[2], pointPtr[0]);
+               x = MAX(x, pPtr[0]);
+               if ((pointPtr[1] < y) && (pointPtr[0] < pPtr[2])
+                       && (pointPtr[0] >= pPtr[0])) {
+                   intersections++;
+               }
+           }
+       } else {
+           double m1, b1, m2, b2;
+           int lower;                  /* Non-zero means point below line. */
+
+           /*
+            * The edge is neither horizontal nor vertical.  Convert the
+            * edge to a line equation of the form y = m1*x + b1.  Then
+            * compute a line perpendicular to this edge but passing
+            * through the point, also in the form y = m2*x + b2.
+            */
+
+           m1 = (pPtr[3] - pPtr[1])/(pPtr[2] - pPtr[0]);
+           b1 = pPtr[1] - m1*pPtr[0];
+           m2 = -1.0/m1;
+           b2 = pointPtr[1] - m2*pointPtr[0];
+           x = (b2 - b1)/(m1 - m2);
+           y = m1*x + b1;
+           if (pPtr[0] > pPtr[2]) {
+               if (x > pPtr[0]) {
+                   x = pPtr[0];
+                   y = pPtr[1];
+               } else if (x < pPtr[2]) {
+                   x = pPtr[2];
+                   y = pPtr[3];
+               }
+           } else {
+               if (x > pPtr[2]) {
+                   x = pPtr[2];
+                   y = pPtr[3];
+               } else if (x < pPtr[0]) {
+                   x = pPtr[0];
+                   y = pPtr[1];
+               }
+           }
+           lower = (m1*pointPtr[0] + b1) > pointPtr[1];
+           if (lower && (pointPtr[0] >= MIN(pPtr[0], pPtr[2]))
+                   && (pointPtr[0] < MAX(pPtr[0], pPtr[2]))) {
+               intersections++;
+           }
+       }
+
+       /*
+        * Compute the distance to the closest point, and see if that
+        * is the best distance seen so far.
+        */
+
+       dist = hypot(pointPtr[0] - x, pointPtr[1] - y);
+       if (dist < bestDist) {
+           bestDist = dist;
+       }
+    }
+
+    /*
+     * We've processed all of the points.  If the number of intersections
+     * is odd, the point is inside the polygon.
+     */
+
+    if (intersections & 0x1) {
+       return 0.0;
+    }
+    return bestDist;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkPolygonToArea --
+ *
+ *     Determine whether a polygon lies entirely inside, entirely
+ *     outside, or overlapping a given rectangular area.
+ *
+ * Results:
+ *     -1 is returned if the polygon given by polyPtr and numPoints
+ *     is entirely outside the rectangle given by rectPtr.  0 is
+ *     returned if the polygon overlaps the rectangle, and 1 is
+ *     returned if the polygon is entirely inside the rectangle.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+TkPolygonToArea(polyPtr, numPoints, rectPtr)
+    double *polyPtr;           /* Points to an array coordinates for
+                                * closed polygon:  x0, y0, x1, y1, ...
+                                * The polygon may be self-intersecting. */
+    int numPoints;             /* Total number of points at *polyPtr. */
+    register double *rectPtr;  /* Points to coords for rectangle, in the
+                                * order x1, y1, x2, y2.  X1 and y1 must
+                                * be lower-left corner. */
+{
+    int state;                 /* State of all edges seen so far (-1 means
+                                * outside, 1 means inside, won't ever be
+                                * 0). */
+    int count;
+    register double *pPtr;
+
+    /*
+     * Iterate over all of the edges of the polygon and test them
+     * against the rectangle.  Can quit as soon as the state becomes
+     * "intersecting".
+     */
+
+    state = TkLineToArea(polyPtr, polyPtr+2, rectPtr);
+    if (state == 0) {
+       return 0;
+    }
+    for (pPtr = polyPtr+2, count = numPoints-1; count >= 2;
+           pPtr += 2, count--) {
+       if (TkLineToArea(pPtr, pPtr+2, rectPtr) != state) {
+           return 0;
+       }
+    }
+
+    /*
+     * If all of the edges were inside the rectangle we're done.
+     * If all of the edges were outside, then the rectangle could
+     * still intersect the polygon (if it's entirely enclosed).
+     * Call TkPolygonToPoint to figure this out.
+     */
+
+    if (state == 1) {
+       return 1;
+    }
+    if (TkPolygonToPoint(polyPtr, numPoints, rectPtr) == 0.0) {
+       return 0;
+    }
+    return -1;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkOvalToPoint --
+ *
+ *     Computes the distance from a given point to a given
+ *     oval, in canvas units.
+ *
+ * Results:
+ *     The return value is 0 if the point given by *pointPtr is
+ *     inside the oval.  If the point isn't inside the
+ *     oval then the return value is approximately the distance
+ *     from the point to the oval.  If the oval is filled, then
+ *     anywhere in the interior is considered "inside";  if
+ *     the oval isn't filled, then "inside" means only the area
+ *     occupied by the outline.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+double
+TkOvalToPoint(ovalPtr, width, filled, pointPtr)
+    double ovalPtr[4];         /* Pointer to array of four coordinates
+                                * (x1, y1, x2, y2) defining oval's bounding
+                                * box. */
+    double width;              /* Width of outline for oval. */
+    int filled;                        /* Non-zero means oval should be treated as
+                                * filled;  zero means only consider outline. */
+    double pointPtr[2];                /* Coordinates of point. */
+{
+    double xDelta, yDelta, scaledDistance, distToOutline, distToCenter;
+
+    /*
+     * Compute the distance between the center of the oval and the
+     * point in question, using a coordinate system where the oval
+     * has been transformed to a circle with unit radius.
+     */
+
+    xDelta = (pointPtr[0] - (ovalPtr[0] + ovalPtr[2])/2.0);
+    yDelta = (pointPtr[1] - (ovalPtr[1] + ovalPtr[3])/2.0);
+    distToCenter = hypot(xDelta, yDelta);
+    scaledDistance = hypot(xDelta / ((ovalPtr[2] + width - ovalPtr[0])/2.0),
+           yDelta / ((ovalPtr[3] + width - ovalPtr[1])/2.0));
+
+
+    /*
+     * If the scaled distance is greater than 1 then it means no
+     * hit.  Compute the distance from the point to the edge of
+     * the circle, then scale this distance back to the original
+     * coordinate system.
+     *
+     * Note: this distance isn't completely accurate.  It's only
+     * an approximation, and it can overestimate the correct
+     * distance when the oval is eccentric.
+     */
+
+    if (scaledDistance > 1.0) {
+       return (distToCenter/scaledDistance) * (scaledDistance - 1.0);
+    }
+
+    /*
+     * Scaled distance less than 1 means the point is inside the
+     * outer edge of the oval.  If this is a filled oval, then we
+     * have a hit.  Otherwise, do the same computation as above
+     * (scale back to original coordinate system), but also check
+     * to see if the point is within the width of the outline.
+     */
+
+    if (filled) {
+       return 0.0;
+    }
+    distToOutline = (distToCenter/scaledDistance) * (1.0 - scaledDistance)
+           - width;
+    if (distToOutline < 0.0) {
+       return 0.0;
+    }
+    return distToOutline;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkOvalToArea --
+ *
+ *     Determine whether an oval lies entirely inside, entirely
+ *     outside, or overlapping a given rectangular area.
+ *
+ * Results:
+ *     -1 is returned if the oval described by ovalPtr is entirely
+ *     outside the rectangle given by rectPtr.  0 is returned if the
+ *     oval overlaps the rectangle, and 1 is returned if the oval
+ *     is entirely inside the rectangle.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+TkOvalToArea(ovalPtr, rectPtr)
+    register double *ovalPtr;  /* Points to coordinates definining the
+                                * bounding rectangle for the oval: x1, y1,
+                                * x2, y2.  X1 must be less than x2 and y1
+                                * less than y2. */
+    register double *rectPtr;  /* Points to coords for rectangle, in the
+                                * order x1, y1, x2, y2.  X1 and y1 must
+                                * be lower-left corner. */
+{
+    double centerX, centerY, radX, radY, deltaX, deltaY;
+
+    /*
+     * First, see if oval is entirely inside rectangle or entirely
+     * outside rectangle.
+     */
+
+    if ((rectPtr[0] <= ovalPtr[0]) && (rectPtr[2] >= ovalPtr[2])
+           && (rectPtr[1] <= ovalPtr[1]) && (rectPtr[3] >= ovalPtr[3])) {
+       return 1;
+    }
+    if ((rectPtr[2] < ovalPtr[0]) || (rectPtr[0] > ovalPtr[2])
+           || (rectPtr[3] < ovalPtr[1]) || (rectPtr[1] > ovalPtr[3])) {
+       return -1;
+    }
+
+    /*
+     * Next, go through the rectangle side by side.  For each side
+     * of the rectangle, find the point on the side that is closest
+     * to the oval's center, and see if that point is inside the
+     * oval.  If at least one such point is inside the oval, then
+     * the rectangle intersects the oval.
+     */
+
+    centerX = (ovalPtr[0] + ovalPtr[2])/2;
+    centerY = (ovalPtr[1] + ovalPtr[3])/2;
+    radX = (ovalPtr[2] - ovalPtr[0])/2;
+    radY = (ovalPtr[3] - ovalPtr[1])/2;
+
+    deltaY = rectPtr[1] - centerY;
+    if (deltaY < 0.0) {
+       deltaY = centerY - rectPtr[3];
+       if (deltaY < 0.0) {
+           deltaY = 0;
+       }
+    }
+    deltaY /= radY;
+    deltaY *= deltaY;
+
+    /*
+     * Left side:
+     */
+
+    deltaX = (rectPtr[0] - centerX)/radX;
+    deltaX *= deltaX;
+    if ((deltaX + deltaY) <= 1.0) {
+       return 0;
+    }
+
+    /*
+     * Right side:
+     */
+
+    deltaX = (rectPtr[2] - centerX)/radX;
+    deltaX *= deltaX;
+    if ((deltaX + deltaY) <= 1.0) {
+       return 0;
+    }
+
+    deltaX = rectPtr[0] - centerX;
+    if (deltaX < 0.0) {
+       deltaX = centerX - rectPtr[2];
+       if (deltaX < 0.0) {
+           deltaX = 0;
+       }
+    }
+    deltaX /= radX;
+    deltaX *= deltaX;
+
+    /*
+     * Bottom side:
+     */
+
+    deltaY = (rectPtr[1] - centerY)/radY;
+    deltaY *= deltaY;
+    if ((deltaX + deltaY) < 1.0) {
+       return 0;
+    }
+
+    /*
+     * Top side:
+     */
+
+    deltaY = (rectPtr[3] - centerY)/radY;
+    deltaY *= deltaY;
+    if ((deltaX + deltaY) < 1.0) {
+       return 0;
+    }
+
+    return -1;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkIncludePoint --
+ *
+ *     Given a point and a generic canvas item header, expand
+ *     the item's bounding box if needed to include the point.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The boudn.
+ *
+ *--------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+void
+TkIncludePoint(canvasPtr, itemPtr, pointPtr)
+    Tk_Canvas *canvasPtr;              /* Canvas containing item. */
+    register Tk_Item *itemPtr;         /* Item whose bounding box is
+                                        * being calculated. */
+    double *pointPtr;                  /* Address of two doubles giving
+                                        * x and y coordinates of point. */
+{
+    int tmp;
+
+    tmp = pointPtr[0] + 0.5;
+    if (tmp < itemPtr->x1) {
+       itemPtr->x1 = tmp;
+    }
+    if (tmp > itemPtr->x2) {
+       itemPtr->x2 = tmp;
+    }
+    tmp = pointPtr[1] + 0.5;
+    if (tmp < itemPtr->y1) {
+       itemPtr->y1 = tmp;
+    }
+    if (tmp > itemPtr->y2) {
+       itemPtr->y2 = tmp;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkBezierScreenPoints --
+ *
+ *     Given four control points, create a larger set of XPoints
+ *     for a Bezier spline based on the points.
+ *
+ * Results:
+ *     The array at *xPointPtr gets filled in with numSteps XPoints
+ *     corresponding to the Bezier spline defined by the four 
+ *     control points.  Note:  no output point is generated for the
+ *     first input point, but an output point *is* generated for
+ *     the last input point.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkBezierScreenPoints(canvasPtr, control, numSteps, xPointPtr)
+    Tk_Canvas *canvasPtr;              /* Canvas in which curve is to be
+                                        * drawn. */
+    double control[];                  /* Array of coordinates for four
+                                        * control points:  x0, y0, x1, y1,
+                                        * ... x3 y3. */
+    int numSteps;                      /* Number of curve points to
+                                        * generate.  */
+    register XPoint *xPointPtr;                /* Where to put new points. */
+{
+    int i;
+    double u, u2, u3, t, t2, t3;
+
+    for (i = 1; i <= numSteps; i++, xPointPtr++) {
+       t = ((double) i)/((double) numSteps);
+       t2 = t*t;
+       t3 = t2*t;
+       u = 1.0 - t;
+       u2 = u*u;
+       u3 = u2*u;
+       xPointPtr->x = SCREEN_X(canvasPtr, (control[0]*u3
+               + 3.0 * (control[2]*t*u2 + control[4]*t2*u) + control[6]*t3));
+       xPointPtr->y = SCREEN_Y(canvasPtr, (control[1]*u3
+               + 3.0 * (control[3]*t*u2 + control[5]*t2*u) + control[7]*t3));
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkBezierPoints --
+ *
+ *     Given four control points, create a larger set of points
+ *     for a Bezier spline based on the points.
+ *
+ * Results:
+ *     The array at *coordPtr gets filled in with 2*numSteps
+ *     coordinates, which correspond to the Bezier spline defined
+ *     by the four control points.  Note:  no output point is
+ *     generated for the first input point, but an output point
+ *     *is* generated for the last input point.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkBezierPoints(control, numSteps, coordPtr)
+    double control[];                  /* Array of coordinates for four
+                                        * control points:  x0, y0, x1, y1,
+                                        * ... x3 y3. */
+    int numSteps;                      /* Number of curve points to
+                                        * generate.  */
+    register double *coordPtr;         /* Where to put new points. */
+{
+    int i;
+    double u, u2, u3, t, t2, t3;
+
+    for (i = 1; i <= numSteps; i++, coordPtr += 2) {
+       t = ((double) i)/((double) numSteps);
+       t2 = t*t;
+       t3 = t2*t;
+       u = 1.0 - t;
+       u2 = u*u;
+       u3 = u2*u;
+       coordPtr[0] = control[0]*u3
+               + 3.0 * (control[2]*t*u2 + control[4]*t2*u) + control[6]*t3;
+       coordPtr[1] = control[1]*u3
+               + 3.0 * (control[3]*t*u2 + control[5]*t2*u) + control[7]*t3;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkMakeBezierCurve --
+ *
+ *     Given a set of points, create a new set of points that
+ *     fit Bezier splines to the line segments connecting the
+ *     original points.  Produces output points in either of two
+ *     forms.
+ *
+ * Results:
+ *     Either or both of the xPoints or dblPoints arrays are filled
+ *     in.  The return value is the number of points placed in the
+ *     arrays.  Note:  if the first and last points are the same, then
+ *     a closed curve is generated.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+TkMakeBezierCurve(canvasPtr, pointPtr, numPoints, numSteps, xPoints, dblPoints)
+    Tk_Canvas *canvasPtr;              /* Canvas in which curve is to be
+                                        * drawn. */
+    double *pointPtr;                  /* Array of input coordinates:  x0,
+                                        * y0, x1, y1, etc.. */
+    int numPoints;                     /* Number of points at pointPtr. */
+    int numSteps;                      /* Number of steps to use for each
+                                        * spline segments (determines
+                                        * smoothness of curve). */
+    XPoint xPoints[];                  /* Array of XPoints to fill in (e.g.
+                                        * for display.  NULL means don't
+                                        * fill in any XPoints. */
+    double dblPoints[];                        /* Array of points to fill in as
+                                        * doubles, in the form x0, y0,
+                                        * x1, y1, ....  NULL means don't
+                                        * fill in anything in this form. 
+                                        * Caller must make sure that this
+                                        * array has enough space. */
+{
+    int closed, outputPoints, i;
+    int numCoords = numPoints*2;
+    double control[8];
+
+    /*
+     * If the curve is a closed one then generate a special spline
+     * that spans the last points and the first ones.  Otherwise
+     * just put the first point into the output.
+     */
+
+    outputPoints = 0;
+    if ((pointPtr[0] == pointPtr[numCoords-2])
+           && (pointPtr[1] == pointPtr[numCoords-1])) {
+       closed = 1;
+       control[0] = 0.5*pointPtr[numCoords-4] + 0.5*pointPtr[0];
+       control[1] = 0.5*pointPtr[numCoords-3] + 0.5*pointPtr[1];
+       control[2] = 0.167*pointPtr[numCoords-4] + 0.833*pointPtr[0];
+       control[3] = 0.167*pointPtr[numCoords-3] + 0.833*pointPtr[1];
+       control[4] = 0.833*pointPtr[0] + 0.167*pointPtr[2];
+       control[5] = 0.833*pointPtr[1] + 0.167*pointPtr[3];
+       control[6] = 0.5*pointPtr[0] + 0.5*pointPtr[2];
+       control[7] = 0.5*pointPtr[1] + 0.5*pointPtr[3];
+       if (xPoints != NULL) {
+           xPoints->x = SCREEN_X(canvasPtr, control[0]);
+           xPoints->y = SCREEN_Y(canvasPtr, control[1]);
+           TkBezierScreenPoints(canvasPtr, control, numSteps, xPoints+1);
+           xPoints += numSteps+1;
+       }
+       if (dblPoints != NULL) {
+           dblPoints[0] = control[0];
+           dblPoints[1] = control[1];
+           TkBezierPoints(control, numSteps, dblPoints+2);
+           dblPoints += 2*(numSteps+1);
+       }
+       outputPoints += numSteps+1;
+    } else {
+       closed = 0;
+       if (xPoints != NULL) {
+           xPoints->x = SCREEN_X(canvasPtr, pointPtr[0]);
+           xPoints->y = SCREEN_Y(canvasPtr, pointPtr[1]);
+           xPoints += 1;
+       }
+       if (dblPoints != NULL) {
+           dblPoints[0] = pointPtr[0];
+           dblPoints[1] = pointPtr[1];
+           dblPoints += 2;
+       }
+       outputPoints += 1;
+    }
+
+    for (i = 2; i < numPoints; i++, pointPtr += 2) {
+       /*
+        * Set up the first two control points.  This is done
+        * differently for the first spline of an open curve
+        * than for other cases.
+        */
+
+       if ((i == 2) && !closed) {
+           control[0] = pointPtr[0];
+           control[1] = pointPtr[1];
+           control[2] = 0.333*pointPtr[0] + 0.667*pointPtr[2];
+           control[3] = 0.333*pointPtr[1] + 0.667*pointPtr[3];
+       } else {
+           control[0] = 0.5*pointPtr[0] + 0.5*pointPtr[2];
+           control[1] = 0.5*pointPtr[1] + 0.5*pointPtr[3];
+           control[2] = 0.167*pointPtr[0] + 0.833*pointPtr[2];
+           control[3] = 0.167*pointPtr[1] + 0.833*pointPtr[3];
+       }
+
+       /*
+        * Set up the last two control points.  This is done
+        * differently for the last spline of an open curve
+        * than for other cases.
+        */
+
+       if ((i == (numPoints-1)) && !closed) {
+           control[4] = .667*pointPtr[2] + .333*pointPtr[4];
+           control[5] = .667*pointPtr[3] + .333*pointPtr[5];
+           control[6] = pointPtr[4];
+           control[7] = pointPtr[5];
+       } else {
+           control[4] = .833*pointPtr[2] + .167*pointPtr[4];
+           control[5] = .833*pointPtr[3] + .167*pointPtr[5];
+           control[6] = 0.5*pointPtr[2] + 0.5*pointPtr[4];
+           control[7] = 0.5*pointPtr[3] + 0.5*pointPtr[5];
+       }
+
+       /*
+        * If the first two points coincide, or if the last
+        * two points coincide, then generate a single
+        * straight-line segment by outputting the last control
+        * point.
+        */
+
+       if (((pointPtr[0] == pointPtr[2]) && (pointPtr[1] == pointPtr[3]))
+               || ((pointPtr[2] == pointPtr[4])
+               && (pointPtr[3] == pointPtr[5]))) {
+           if (xPoints != NULL) {
+               xPoints[0].x = SCREEN_X(canvasPtr, control[6]);
+               xPoints[0].y = SCREEN_Y(canvasPtr, control[7]);
+               xPoints++;
+           }
+           if (dblPoints != NULL) {
+               dblPoints[0] = control[6];
+               dblPoints[1] = control[7];
+               dblPoints += 2;
+           }
+           outputPoints += 1;
+           continue;
+       }
+
+       /*
+        * Generate a Bezier spline using the control points.
+        */
+
+
+       if (xPoints != NULL) {
+           TkBezierScreenPoints(canvasPtr, control, numSteps, xPoints);
+           xPoints += numSteps;
+       }
+       if (dblPoints != NULL) {
+           TkBezierPoints(control, numSteps, dblPoints);
+           dblPoints += 2*numSteps;
+       }
+       outputPoints += numSteps;
+    }
+    return outputPoints;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkGetMiterPoints --
+ *
+ *     Given three points forming an angle, compute the
+ *     coordinates of the inside and outside points of
+ *     the mitered corner formed by a line of a given
+ *     width at that angle.
+ *
+ * Results:
+ *     If the angle formed by the three points is less than
+ *     11 degrees then 0 is returned and m1 and m2 aren't
+ *     modified.  Otherwise 1 is returned and the points at
+ *     m1 and m2 are filled in with the positions of the points
+ *     of the mitered corner.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+TkGetMiterPoints(p1, p2, p3, width, m1, m2)
+    double p1[];               /* Points to x- and y-coordinates of point
+                                * before vertex. */
+    double p2[];               /* Points to x- and y-coordinates of vertex
+                                * for mitered joint. */
+    double p3[];               /* Points to x- and y-coordinates of point
+                                * after vertex. */
+    double width;              /* Width of line.  */
+    double m1[];               /* Points to place to put "left" vertex
+                                * point (see as you face from p1 to p2). */
+    double m2[];               /* Points to place to put "right" vertex
+                                * point. */
+{
+    double theta1;             /* Angle of segment p2-p1. */
+    double theta2;             /* Angle of segment p2-p3. */
+    double theta;              /* Angle between line segments (angle
+                                * of joint). */
+    double theta3;             /* Angle that bisects theta1 and
+                                * theta2 and points to m1. */
+    double dist;               /* Distance of miter points from p2. */
+    double deltaX, deltaY;     /* X and y offsets cooresponding to
+                                * dist (fudge factors for bounding
+                                * box). */
+    static float elevenDegrees = (11.0*2.0*PI)/360.0;
+
+    if (p2[1] == p1[1]) {
+       theta1 = (p2[0] < p1[0]) ? 0 : PI;
+    } else if (p2[0] == p1[0]) {
+       theta1 = (p2[1] < p1[1]) ? PI/2.0 : -PI/2.0;
+    } else {
+       theta1 = atan2(p1[1] - p2[1], p1[0] - p2[0]);
+    }
+    if (p3[1] == p2[1]) {
+       theta2 = (p3[0] > p2[0]) ? 0 : PI;
+    } else if (p3[0] == p2[0]) {
+       theta2 = (p3[1] > p2[1]) ? PI/2.0 : -PI/2.0;
+    } else {
+       theta2 = atan2(p3[1] - p2[1], p3[0] - p2[0]);
+    }
+    theta = theta1 - theta2;
+    if (theta > PI) {
+       theta -= 2*PI;
+    } else if (theta < -PI) {
+       theta += 2*PI;
+    }
+    if ((theta < elevenDegrees) && (theta > -elevenDegrees)) {
+       return 0;
+    }
+    dist = 0.5*width/sin(0.5*theta);
+    if (dist < 0.0) {
+       dist = -dist;
+    }
+
+    /*
+     * Compute theta3 (make sure that it points to the left when
+     * looking from p1 to p2).
+     */
+
+    theta3 = (theta1 + theta2)/2.0;
+    if (sin(theta3 - (theta1 + PI)) < 0.0) {
+       theta3 += PI;
+    }
+    deltaX = dist*cos(theta3);
+    m1[0] = p2[0] + deltaX;
+    m2[0] = p2[0] - deltaX;
+    deltaY = dist*sin(theta3);
+    m1[1] = p2[1] + deltaY;
+    m2[1] = p2[1] - deltaY;
+    return 1;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkGetButtPoints --
+ *
+ *     Given two points forming a line segment, compute the
+ *     coordinates of two endpoints of a rectangle formed by
+ *     bloating the line segment until it is width units wide.
+ *
+ * Results:
+ *     There is no return value.  M1 and m2 are filled in to
+ *     correspond to m1 and m2 in the diagram below:
+ *
+ *                ----------------* m1
+ *                                |
+ *             p1 *---------------* p2
+ *                                |
+ *                ----------------* m2
+ *
+ *     M1 and m2 will be W units apart, with p2 centered between
+ *     them and m1-m2 perpendicular to p1-p2.  However, if
+ *     "project" is true then m1 and m2 will be as follows:
+ *
+ *                -------------------* m1
+ *                               p2  |
+ *             p1 *---------------*  |
+ *                                   |
+ *                -------------------* m2
+ *
+ *     In this case p2 will be width/2 units from the segment m1-m2.
+ *
+ * Side effects:
+ *     None.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkGetButtPoints(p1, p2, width, project, m1, m2)
+    double p1[];               /* Points to x- and y-coordinates of point
+                                * before vertex. */
+    double p2[];               /* Points to x- and y-coordinates of vertex
+                                * for mitered joint. */
+    double width;              /* Width of line.  */
+    int project;               /* Non-zero means project p2 by an additional
+                                * width/2 before computing m1 and m2. */
+    double m1[];               /* Points to place to put "left" result
+                                * point, as you face from p1 to p2. */
+    double m2[];               /* Points to place to put "right" result
+                                * point. */
+{
+    double length;             /* Length of p1-p2 segment. */
+    double deltaX, deltaY;     /* Increments in coords. */
+
+    width *= 0.5;
+    length = hypot(p2[0] - p1[0], p2[1] - p1[1]);
+    if (length == 0.0) {
+       m1[0] = m2[0] = p2[0];
+       m1[1] = m2[1] = p2[1];
+    } else {
+       deltaX = -width * (p2[1] - p1[1]) / length;
+       deltaY = width * (p2[0] - p1[0]) / length;
+       m1[0] = p2[0] + deltaX;
+       m2[0] = p2[0] - deltaX;
+       m1[1] = p2[1] + deltaY;
+       m2[1] = p2[1] - deltaY;
+       if (project) {
+           m1[0] += deltaY;
+           m2[0] += deltaY;
+           m1[1] -= deltaX;
+           m2[1] -= deltaX;
+       }
+    }
+}
diff --git a/src/tk/tktxbtre.c b/src/tk/tktxbtre.c
new file mode 100644 (file)
index 0000000..d9245cf
--- /dev/null
@@ -0,0 +1,2375 @@
+/* 
+ * tkTextBTree.c --
+ *
+ *     This file contains code that manages the B-tree representation
+ *     of text for Tk's text widget.  The B-tree holds both the text
+ *     and tag information related to the text.
+ *
+ * Copyright 1992 Regents of the University of California
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that this copyright
+ * notice appears in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkTextBTree.c,v 1.16 92/08/17 09:13:58 ouster Exp $ SPRITE (Berkeley)";
+#endif /* not lint */
+
+#include "tkint.h"
+#include "tkconfig.h"
+#include "tktext.h"
+
+
+/*
+ * The data structure below keeps summary information about one tag as part
+ * of the tag information in a node.
+ */
+
+typedef struct Summary {
+    TkTextTag *tagPtr;                 /* Handle for tag. */
+    int toggleCount;                   /* Number of transitions into or
+                                        * out of this tag that occur in
+                                        * the subtree rooted at this node. */
+    struct Summary *nextPtr;           /* Next in list of all tags for same
+                                        * node, or NULL if at end of list. */
+} Summary;
+
+/*
+ * The data structure below defines a node in the B-tree representing
+ * all of the lines in a text widget.
+ */
+
+typedef struct Node {
+    struct Node *parentPtr;            /* Pointer to parent node, or NULL if
+                                        * this is the root. */
+    struct Node *nextPtr;              /* Next in list of children of the
+                                        * same parent node, or NULL for end
+                                        * of list. */
+    Summary *summaryPtr;               /* First in malloc-ed list of info
+                                        * about tags in this subtree (NULL if
+                                        * no tag info in the subtree). */
+    int level;                         /* Level of this node in the B-tree.
+                                        * 0 refers to the bottom of the tree
+                                        * (children are lines, not nodes). */
+    union {                            /* First in linked list of children. */
+       struct Node *nodePtr;           /* Used if level > 0. */
+       TkTextLine *linePtr;            /* Used if level == 0. */
+    } children;
+    int numChildren;                   /* Number of children of this node. */
+    int numLines;                      /* Total number of lines (leaves) in
+                                        * the subtree rooted here. */
+} Node;
+
+/*
+ * Upper and lower bounds on how many children a node may have:
+ * rebalance when either of these limits is exceeded.  MAX_CHILDREN
+ * should be twice MIN_CHILDREN and MIN_CHILDREN must be >= 2.
+ */
+
+#define MAX_CHILDREN 12
+#define MIN_CHILDREN 6
+
+/*
+ * The data structure below defines an entire B-tree.
+ */
+
+typedef struct BTree {
+    Node *rootPtr;                     /* Pointer to root of B-tree. */
+} BTree;
+
+/*
+ * The structure below is used to pass information between
+ * TkBTreeGetTags and IncCount:
+ */
+
+typedef struct TagInfo {
+    int numTags;                       /* Number of tags for which there
+                                        * is currently information in
+                                        * tags and counts. */
+    int arraySize;                     /* Number of entries allocated for
+                                        * tags and counts. */
+    TkTextTag **tagPtrs;               /* Array of tags seen so far.
+                                        * Malloc-ed. */
+    int *counts;                       /* Toggle count (so far) for each
+                                        * entry in tags.  Malloc-ed. */
+} TagInfo;
+
+/*
+ * Macro to compute the space needed for a line that holds n non-null
+ * characters:
+ */
+
+#define LINE_SIZE(n) ((unsigned) (sizeof(TkTextLine) - 3 + (n)))
+
+/*
+ * Variable that indicates whether to enable consistency checks for
+ * debugging.
+ */
+
+int tkBTreeDebug = 0;
+
+/*
+ * Forward declarations for procedures defined in this file:
+ */
+
+static void            AddToggleToLine _ANSI_ARGS_((TkTextLine *linePtr,
+                           int index, TkTextTag *tagPtr));
+static void            ChangeNodeToggleCount _ANSI_ARGS_((Node *nodePtr,
+                           TkTextTag *tagPtr, int delta));
+static void            CheckNodeConsistency _ANSI_ARGS_((Node *nodePtr));
+static void            DeleteSummaries _ANSI_ARGS_((Summary *tagPtr));
+static void            DestroyNode _ANSI_ARGS_((Node *nodePtr));
+static void            IncCount _ANSI_ARGS_((TkTextTag *tagPtr, int inc,
+                           TagInfo *tagInfoPtr));
+static void            Rebalance _ANSI_ARGS_((BTree *treePtr, Node *nodePtr));
+static void            RecomputeNodeCounts _ANSI_ARGS_((Node *nodePtr));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeCreate --
+ *
+ *     This procedure is called to create a new text B-tree.
+ *
+ * Results:
+ *     The return value is a pointer to a new B-tree containing
+ *     one line with nothing but a newline character.
+ *
+ * Side effects:
+ *     Memory is allocated and initialized.
+ *
+ *----------------------------------------------------------------------
+ */
+
+TkTextBTree
+TkBTreeCreate()
+{
+    register BTree *treePtr;
+    register Node *rootPtr;
+    register TkTextLine *linePtr;
+
+    rootPtr = (Node *) ckalloc(sizeof(Node));
+    linePtr = (TkTextLine *) ckalloc(LINE_SIZE(1));
+    rootPtr->parentPtr = NULL;
+    rootPtr->nextPtr = NULL;
+    rootPtr->summaryPtr = NULL;
+    rootPtr->level = 0;
+    rootPtr->children.linePtr = linePtr;
+    rootPtr->numChildren = 1;
+    rootPtr->numLines = 1;
+
+    linePtr->parentPtr = rootPtr;
+    linePtr->nextPtr = NULL;
+    linePtr->annotPtr = NULL;
+    linePtr->numBytes = 1;
+    linePtr->bytes[0] = '\n';
+    linePtr->bytes[1] = 0;
+
+    treePtr = (BTree *) ckalloc(sizeof(BTree));
+    treePtr->rootPtr = rootPtr;
+
+    return (TkTextBTree) treePtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeDestroy --
+ *
+ *     Delete a B-tree, recycling all of the storage it contains.
+ *
+ * Results:
+ *     The tree given by treePtr is deleted.  TreePtr should never
+ *     again be used.
+ *
+ * Side effects:
+ *     Memory is freed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkBTreeDestroy(tree)
+    TkTextBTree tree;                  /* Pointer to tree to delete. */ 
+{
+    BTree *treePtr = (BTree *) tree;
+
+    DestroyNode(treePtr->rootPtr);
+    ckfree((char *) treePtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DestroyNode --
+ *
+ *     This is a recursive utility procedure used during the deletion
+ *     of a B-tree.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     All the storage for nodePtr and its descendants is freed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DestroyNode(nodePtr)
+    register Node *nodePtr;
+{
+    if (nodePtr->level == 0) {
+       register TkTextLine *curPtr, *nextLinePtr;
+       register TkAnnotation *annotPtr, *nextAnnotPtr;
+
+       for (curPtr = nodePtr->children.linePtr; curPtr != NULL; ) {
+           nextLinePtr = curPtr->nextPtr;
+           for (annotPtr = curPtr->annotPtr; annotPtr != NULL; ) {
+               nextAnnotPtr = annotPtr->nextPtr;
+               if (annotPtr->type == TK_ANNOT_TOGGLE) {
+                   ckfree((char *) annotPtr);
+               }
+               annotPtr = nextAnnotPtr;
+           }
+           ckfree((char *) curPtr);
+           curPtr = nextLinePtr;
+       }
+    } else {
+       register Node *curPtr, *nextPtr;
+
+       for (curPtr = nodePtr->children.nodePtr; curPtr != NULL; ) {
+           nextPtr = curPtr->nextPtr;
+           DestroyNode(curPtr);
+           curPtr = nextPtr;
+       }
+    }
+    DeleteSummaries(nodePtr->summaryPtr);
+    ckfree((char *) nodePtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DeleteSummaries --
+ *
+ *     Free up all of the memory in a list of tag summaries associated
+ *     with a node.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Storage is released.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DeleteSummaries(summaryPtr)
+    register Summary *summaryPtr;      /* First in list of node's tag
+                                        * summaries. */
+{
+    register Summary *nextPtr;
+    while (summaryPtr != NULL) {
+       nextPtr = summaryPtr->nextPtr;
+       ckfree((char *) summaryPtr);
+       summaryPtr = nextPtr;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeInsertChars --
+ *
+ *     Insert characters at a given position in a B-tree.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     NumBytes characters are added to the B-tree at the given
+ *     character position.  This can cause the structure of the
+ *     B-tree to change.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkBTreeInsertChars(tree, linePtr, ch, string)
+    TkTextBTree tree;                  /* B-tree in which to insert. */
+    register TkTextLine *linePtr;      /* Pointer to line in which to
+                                        * insert. */
+    int ch;                            /* Index of character before which
+                                        * to insert.  Must not be after
+                                        * last character in line.*/
+    char *string;                      /* Pointer to bytes to insert (may
+                                        * contain newlines, must be null-
+                                        * terminated). */
+{
+    BTree *treePtr = (BTree *) tree;
+    register Node *nodePtr;
+    register TkAnnotation *annotPtr;
+    TkTextLine *prevPtr;
+    int newChunkLength;                        /* # chars in current line being
+                                        * inserted. */
+    register char *eol;                        /* Pointer to last character in
+                                        * current line being inserted. */
+    int changeToLineCount;             /* Counts change to total number of
+                                        * lines in file. */
+    TkAnnotation *afterPtr;            /* List of annotations that occur
+                                        * at or after the insertion point
+                                        * in the line of the insertion. */
+    int prefixLength, suffixLength, totalLength;
+    register TkTextLine *newPtr;
+
+    /*
+     * Find the line just before the one where the insertion will occur
+     * but with the same parent node (if there is one).  This is needed
+     * so we can replace the insertion line with a new one.  Remove this
+     * line from the list for its parent, since it's going to be discarded
+     * when we're all done).
+     */
+
+    nodePtr = linePtr->parentPtr;
+    prevPtr = nodePtr->children.linePtr;
+    if (prevPtr == linePtr) {
+       prevPtr = NULL;
+       nodePtr->children.linePtr = linePtr->nextPtr;
+    } else {
+       for ( ; prevPtr->nextPtr != linePtr;  prevPtr = prevPtr->nextPtr) {
+           /* Empty loop body. */
+       }
+       prevPtr->nextPtr = linePtr->nextPtr;
+    }
+
+    /*
+     * Break up the annotations for the insertion line into two pieces:
+     * those before the insertion point, and those at or after the insertion
+     * point.
+     */
+
+    afterPtr = NULL;
+    if ((linePtr->annotPtr != NULL) && (linePtr->annotPtr->ch >= ch)) {
+       afterPtr = linePtr->annotPtr;
+       linePtr->annotPtr = NULL;
+    } else {
+       for (annotPtr = linePtr->annotPtr; annotPtr != NULL;
+               annotPtr = annotPtr->nextPtr) {
+           if ((annotPtr->nextPtr != NULL)
+                   && (annotPtr->nextPtr->ch >= ch)) {
+               afterPtr = annotPtr->nextPtr;
+               annotPtr->nextPtr = NULL;
+               break;
+           }
+       }
+    }
+
+    /*
+     * Chop the string up into lines and insert each line individually.
+     */
+
+    changeToLineCount = -1;
+    prefixLength = ch;
+    while (1) {
+       for (newChunkLength = 0, eol = string; *eol != 0; eol++) {
+           newChunkLength++;
+           if (*eol == '\n') {
+               break;
+           }
+       }
+
+       /*
+        * Create a new line consisting of up to three parts: a prefix
+        * from linePtr, some material from string, and a suffix from
+        * linePtr.
+        */
+
+       if ((newChunkLength == 0) || (*eol != '\n')) {
+           suffixLength = linePtr->numBytes - ch;
+       } else {
+           suffixLength = 0;
+       }
+       totalLength = prefixLength + newChunkLength + suffixLength;
+       newPtr = (TkTextLine *) ckalloc(LINE_SIZE(totalLength));
+       newPtr->parentPtr = nodePtr;
+       if (prevPtr == NULL) {
+           newPtr->nextPtr = nodePtr->children.linePtr;
+           nodePtr->children.linePtr = newPtr;
+       } else {
+           newPtr->nextPtr = prevPtr->nextPtr;
+           prevPtr->nextPtr = newPtr;
+       }
+       if (linePtr->annotPtr != NULL) {
+           newPtr->annotPtr = linePtr->annotPtr;
+           for (annotPtr = newPtr->annotPtr; annotPtr != NULL;
+                   annotPtr = annotPtr->nextPtr) {
+               annotPtr->linePtr = newPtr;
+           }
+           linePtr->annotPtr = NULL;
+       } else {
+           newPtr->annotPtr = NULL;
+       }
+       newPtr->numBytes = totalLength;
+       if (prefixLength != 0) {
+           memcpy((VOID *) newPtr->bytes, (VOID *) linePtr->bytes,
+                   prefixLength);
+       }
+       if (newChunkLength != 0) {
+           memcpy((VOID *) (newPtr->bytes + prefixLength), (VOID *) string,
+                   newChunkLength);
+       }
+       if (suffixLength != 0) {
+           memcpy((VOID *) (newPtr->bytes + prefixLength + newChunkLength),
+                   (VOID *) (linePtr->bytes + ch), suffixLength);
+       }
+       newPtr->bytes[totalLength] = 0;
+       changeToLineCount += 1;
+
+       /*
+        * Quit after the suffix has been output (there is always at least
+        * one character of suffix: the newline).  Before jumping out of the
+        * loop, put back the annotations that pertain to the suffix.
+        * Careful!  If no newlines were inserted, there could already be
+        * annotations at the beginning of the line;  add back to the end.
+        */
+
+       if (suffixLength != 0) {
+           if (newPtr->annotPtr == NULL) {
+               newPtr->annotPtr = afterPtr;
+           } else {
+               for (annotPtr = newPtr->annotPtr; annotPtr->nextPtr != NULL;
+                       annotPtr = annotPtr->nextPtr) {
+                   /* Empty loop body. */
+               }
+               annotPtr->nextPtr = afterPtr;
+           }
+           for (annotPtr = afterPtr; annotPtr != NULL;
+                   annotPtr = annotPtr->nextPtr) {
+               annotPtr->linePtr = newPtr;
+               annotPtr->ch += prefixLength+newChunkLength-ch;
+           }
+           break;
+       }
+
+       /*
+        * Advance to insert the next line chunk.
+        */
+
+       string += newChunkLength;
+       prefixLength = 0;
+       prevPtr = newPtr;
+    }
+
+    /*
+     * Increment the line counts in all the parent nodes of the insertion
+     * point, then rebalance the tree if necessary.
+     */
+
+    for ( ; nodePtr != NULL; nodePtr = nodePtr->parentPtr) {
+       nodePtr->numLines += changeToLineCount;
+    }
+    nodePtr = linePtr->parentPtr;
+    nodePtr->numChildren += changeToLineCount;
+    if (nodePtr->numChildren > MAX_CHILDREN) {
+       Rebalance(treePtr, nodePtr);
+    }
+
+    ckfree((char *) linePtr);
+    if (tkBTreeDebug) {
+       TkBTreeCheck(tree);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeDeleteChars --
+ *
+ *     Delete a range of characters from a B-tree.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information is deleted from the B-tree.  This can cause the
+ *     internal structure of the B-tree to change.  Note: the two
+ *     lines given by line1Ptr and line2Ptr will be replaced with
+ *     a single line containing the undeleted parts of the original
+ *     lines.  This could potentially result in an empty line;
+ *     normally the caller should adjust the deletion range to prevent
+ *     this sort of behavior.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkBTreeDeleteChars(tree, line1Ptr, ch1, line2Ptr, ch2)
+    TkTextBTree tree;                  /* B-tree in which to delete. */
+    register TkTextLine *line1Ptr;     /* Line containing first character
+                                        * to delete. */
+    int ch1;                           /* Index within linePtr1 of first
+                                        * character to delete. */
+    register TkTextLine *line2Ptr;     /* Line containing character just
+                                        * after last one to delete. */
+    int ch2;                           /* Index within linePtr2 of character
+                                        * just after last one to delete. */
+{
+    BTree *treePtr = (BTree *) tree;
+    TkTextLine *linePtr, *nextPtr, *prevLinePtr;
+    Node *nodePtr, *parentPtr, *nextNodePtr;
+    TkAnnotation *annotPtr, *annotPtr2;
+    int ch;
+    int linesDeleted;                  /* Counts lines deleted from current
+                                        * level-0 node. */
+
+    /*
+     * Work through the tree deleting all of the lines between line1Ptr
+     * and line2Ptr (but don't delete line1Ptr or line2Ptr yet).  Also
+     * delete any nodes in the B-tree that become empty because of
+     * this process.
+     */
+
+    linePtr = line1Ptr->nextPtr;
+    nodePtr = line1Ptr->parentPtr;
+    if (line1Ptr == line2Ptr) {
+       goto middleLinesDeleted;
+    }
+    while (1) {
+
+       /*
+        * Delete all relevant lines within the same level-0 node.
+        */
+
+       linesDeleted = 0;
+       while ((linePtr != line2Ptr) && (linePtr != NULL)) {
+           /*
+            * Move any annotations in this line to the end of the
+            * deletion range.  If both the starting and ending toggle
+            * for a tagged range get moved, they'll cancel each other
+            * automatically and be dropped, which is the right behavior.
+            */
+
+           for (annotPtr = linePtr->annotPtr; annotPtr != NULL;
+                   annotPtr = annotPtr2) {
+               if (annotPtr->type == TK_ANNOT_TOGGLE) {
+                   AddToggleToLine(line2Ptr, ch2, annotPtr->info.tagPtr);
+                   ChangeNodeToggleCount(nodePtr, annotPtr->info.tagPtr, -1);
+                   annotPtr2 = annotPtr->nextPtr;
+                   ckfree((char *) annotPtr);
+               } else {
+                   annotPtr2 = annotPtr->nextPtr;
+                   TkBTreeRemoveAnnotation(annotPtr);
+                   annotPtr->linePtr = line2Ptr;
+                   annotPtr->ch = ch2;
+                   TkBTreeAddAnnotation(annotPtr);
+               }
+           }
+           nextPtr = linePtr->nextPtr;
+           ckfree((char *) linePtr);
+           linesDeleted++;
+           linePtr = nextPtr;
+       }
+       if (nodePtr == line1Ptr->parentPtr) {
+           line1Ptr->nextPtr = linePtr;
+       } else {
+           nodePtr->children.linePtr = linePtr;
+       }
+       for (parentPtr = nodePtr; parentPtr != NULL;
+               parentPtr = parentPtr->parentPtr) {
+           parentPtr->numLines -= linesDeleted;
+       }
+       nodePtr->numChildren -= linesDeleted;
+       if (linePtr == line2Ptr) {
+           break;
+       }
+
+       /*
+        * Find the next level-0 node to visit, and its first line (but
+        * remember the current node so we can come back to delete it if
+        * it's empty).
+        */
+
+       nextNodePtr = nodePtr;
+       while (nextNodePtr->nextPtr == NULL) {
+           nextNodePtr = nextNodePtr->parentPtr;
+       }
+       nextNodePtr = nextNodePtr->nextPtr;
+       while (nextNodePtr->level > 0) {
+           nextNodePtr = nextNodePtr->children.nodePtr;
+       }
+       linePtr = nextNodePtr->children.linePtr;
+
+       /*
+        * Now go back to the node we just left and delete it if
+        * it's empty, along with any of its ancestors that are
+        * empty.  It may seem funny to go back like this, but it's
+        * simpler to find the next place to visit before modifying
+        * the tree structure.
+        */
+
+       while (nodePtr->numChildren == 0) {
+           parentPtr = nodePtr->parentPtr;
+           if (parentPtr->children.nodePtr == nodePtr) {
+               parentPtr->children.nodePtr = nodePtr->nextPtr;
+           } else {
+               Node *prevPtr;
+
+               for (prevPtr = parentPtr->children.nodePtr;
+                       prevPtr->nextPtr != nodePtr;
+                       prevPtr = prevPtr->nextPtr) {
+               }
+               prevPtr->nextPtr = nodePtr->nextPtr;
+           }
+           parentPtr->numChildren--;
+           DeleteSummaries(nodePtr->summaryPtr);
+           ckfree((char *) nodePtr);
+           nodePtr = parentPtr;
+       }
+       nodePtr = nextNodePtr;
+    }
+
+    /*
+     * Make a new line that consists of the first part of the first
+     * line of the deletion range and the last part of the last line
+     * of the deletion range.
+     */
+
+    middleLinesDeleted:
+    nodePtr = line1Ptr->parentPtr;
+    linePtr = (TkTextLine *) ckalloc(LINE_SIZE(ch1 + line2Ptr->numBytes - ch2));
+    linePtr->parentPtr = nodePtr;
+    linePtr->nextPtr = line1Ptr->nextPtr;
+    linePtr->annotPtr = NULL;
+    linePtr->numBytes = ch1 + line2Ptr->numBytes - ch2;
+    if (ch1 != 0) {
+       memcpy((VOID *) linePtr->bytes, (VOID *) line1Ptr->bytes, ch1);
+    }
+    strcpy(linePtr->bytes + ch1, line2Ptr->bytes + ch2);
+
+    /*
+     * Process the annotations for the starting and ending lines.  Enter
+     * a new annotation on linePtr (the joined line) for each of these
+     * annotations, then delete the originals.  The code below is a little
+     * tricky (e.g. the "break" in the first loop) to handle the case where
+     * the starting and ending lines are the same.
+     */
+
+    for (annotPtr = line1Ptr->annotPtr; annotPtr != NULL;
+           annotPtr = line1Ptr->annotPtr) {
+       if (annotPtr->ch <= ch1) {
+           ch = annotPtr->ch;
+       } else {
+           if (line1Ptr == line2Ptr) {
+               break;
+           }
+           ch = ch1;
+       }
+       line1Ptr->annotPtr = annotPtr->nextPtr;
+       if (annotPtr->type == TK_ANNOT_TOGGLE) {
+           AddToggleToLine(linePtr, ch, annotPtr->info.tagPtr);
+           ChangeNodeToggleCount(line1Ptr->parentPtr, annotPtr->info.tagPtr,
+                   -1);
+           ckfree((char *) annotPtr);
+       } else {
+           annotPtr->linePtr = linePtr;
+           annotPtr->ch = ch;
+           TkBTreeAddAnnotation(annotPtr);
+       }
+    }
+    for (annotPtr = line2Ptr->annotPtr; annotPtr != NULL;
+           annotPtr = line2Ptr->annotPtr) {
+       if (annotPtr->ch >= ch2) {
+           ch = annotPtr->ch - ch2 + ch1;
+       } else {
+           ch = ch1;
+       }
+       line2Ptr->annotPtr = annotPtr->nextPtr;
+       if (annotPtr->type == TK_ANNOT_TOGGLE) {
+           AddToggleToLine(linePtr, ch, annotPtr->info.tagPtr);
+           ChangeNodeToggleCount(line2Ptr->parentPtr, annotPtr->info.tagPtr,
+                   -1);
+           ckfree((char *) annotPtr);
+       } else {
+           annotPtr->linePtr = linePtr;
+           annotPtr->ch = ch;
+           TkBTreeAddAnnotation(annotPtr);
+       }
+    }
+
+    /*
+     * Delete the original starting and stopping lines (don't forget
+     * that the annotations have already been deleted) and insert the
+     * new line in place of line1Ptr.
+     */
+
+    nodePtr = line1Ptr->parentPtr;
+    if (nodePtr->children.linePtr == line1Ptr) {
+       nodePtr->children.linePtr = linePtr;
+    } else {
+       for (prevLinePtr = nodePtr->children.linePtr;
+               prevLinePtr->nextPtr != line1Ptr;
+               prevLinePtr = prevLinePtr->nextPtr) {
+           /* Empty loop body. */
+       }
+       prevLinePtr->nextPtr = linePtr;
+    }
+    ckfree((char *) line1Ptr);
+    nodePtr = line2Ptr->parentPtr;
+    if (line2Ptr != line1Ptr) {
+       if (nodePtr->children.linePtr == line2Ptr) {
+           nodePtr->children.linePtr = line2Ptr->nextPtr;
+       } else {
+           for (prevLinePtr = nodePtr->children.linePtr;
+                   prevLinePtr->nextPtr != line2Ptr;
+                   prevLinePtr = prevLinePtr->nextPtr) {
+               /* Empty loop body. */
+           }
+           prevLinePtr->nextPtr = line2Ptr->nextPtr;
+       }
+       ckfree((char *) line2Ptr);
+       for (parentPtr = nodePtr; parentPtr != NULL;
+               parentPtr = parentPtr->parentPtr) {
+           parentPtr->numLines--;
+       }
+       nodePtr->numChildren--;
+    }
+
+    /*
+     * Rebalance the tree, starting from each of the endpoints of the
+     * deletion range.  This code is a tricky, because the act of
+     * rebalancing the parent of one endpoint can cause the parent of
+     * the other endpoint to be reallocated.  The only thing it's safe
+     * to hold onto is a pointer to a line.  Thus, rebalance line2Ptr's
+     * parent first, then use linePtr find the second parent to rebalance
+     * second.  
+     */
+
+    if (nodePtr != linePtr->parentPtr) {
+       Rebalance(treePtr, nodePtr);
+    }
+    Rebalance(treePtr, linePtr->parentPtr);
+    if (tkBTreeDebug) {
+       TkBTreeCheck(tree);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeTag --
+ *
+ *     Turn a given tag on or off for a given range of characters in
+ *     a B-tree of text.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The given tag is added to the given range of characters
+ *     in the tree or removed from all those characters, depending
+ *     on the "add" argument.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkBTreeTag(tree, line1, ch1, line2, ch2, tagPtr, add)
+    TkTextBTree tree;                  /* B-tree in which to add tag
+                                        * information. */
+    int line1, ch1;                    /* Position of first character to
+                                        * tag. */
+    int line2, ch2;                    /* Position of character just after
+                                        * last one to tag. */
+    TkTextTag *tagPtr;                 /* Tag to associate with the range
+                                        * of characters. */
+    int add;                           /* One means add tag to the given
+                                        * range of characters;  zero means
+                                        * remove the tag from the range. */
+{
+    BTree *treePtr = (BTree *) tree;
+    register TkTextLine *line1Ptr, *line2Ptr;
+    TkTextSearch search;
+    int oldState;
+
+    /*
+     * Find the lines containing the first and last characters to be tagged,
+     * and adjust the starting and stopping locations if they don't already
+     * point within lines.  If the range would have started or stopped at the
+     * end of a line, round it up to the beginning of the next line (right
+     * now this restriction keeps the final newline from being tagged).
+     */
+
+    if (line1 < 0) {
+       line1 = 0;
+       ch1 = 0;
+    }
+    line1Ptr = TkBTreeFindLine(tree, line1);
+    if (line1Ptr == NULL) {
+       return;
+    }
+    if (ch1 >= line1Ptr->numBytes) {
+       TkTextLine *nextLinePtr;
+
+       nextLinePtr = TkBTreeNextLine(line1Ptr);
+       if (nextLinePtr == NULL) {
+           return;
+       } else {
+           line1Ptr = nextLinePtr;
+           line1++;
+           ch1 = 0;
+       }
+    }
+    if (line2 < 0) {
+       return;
+    }
+    line2Ptr = TkBTreeFindLine(tree, line2);
+    if (line2Ptr == NULL) {
+       line2Ptr = TkBTreeFindLine(tree, treePtr->rootPtr->numLines-1);
+       ch2 = line2Ptr->numBytes-1;
+    }
+    if (ch2 >= line2Ptr->numBytes) {
+       TkTextLine *nextLinePtr;
+
+       nextLinePtr = TkBTreeNextLine(line2Ptr);
+       if (nextLinePtr == NULL) {
+           ch2 = line2Ptr->numBytes-1;
+       } else {
+           line2Ptr = nextLinePtr;
+           line2++;
+           ch2 = 0;
+       }
+    }
+
+    /*
+     * See if the tag is already present or absent at the start of the
+     * range.  If the state doesn't already match what we want then add
+     * a toggle there.
+     */
+
+    oldState = TkBTreeCharTagged(line1Ptr, ch1, tagPtr);
+    if ((add != 0) ^ oldState) {
+       AddToggleToLine(line1Ptr, ch1, tagPtr);
+    }
+
+    /*
+     * Scan the range of characters covered by the change and delete
+     * any existing tag transitions except those on the first and
+     * last characters.  Keep track of whether the old state just before
+     * the last character (not including any tags on it) is what we
+     * want now;  if not, then add a tag toggle there.
+     */
+
+    TkBTreeStartSearch(tree, line1, ch1+1, line2, ch2, tagPtr, &search);
+    while (TkBTreeNextTag(&search)) {
+       if ((search.linePtr == line2Ptr) && (search.ch1 == ch2)) {
+           break;
+       }
+       oldState ^= 1;
+       AddToggleToLine(search.linePtr, search.ch1, tagPtr);
+    }
+    if ((add != 0) ^ oldState) {
+       AddToggleToLine(line2Ptr, ch2, tagPtr);
+    }
+
+    if (tkBTreeDebug) {
+       TkBTreeCheck(tree);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeAddAnnotation --
+ *
+ *     Given a filled in annotation, this procedure links it into
+ *     a B-tree structure so that it will track changes to the B-tree.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     AnnotPtr will be linked into its tree.  Note:  the storage for
+ *     annotPtr is assumed to have been malloc'ed by the caller.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+void
+TkBTreeAddAnnotation(annotPtr)
+    TkAnnotation *annotPtr;    /* Pointer to annotation.  The caller must
+                                * have filled in all the fields except the
+                                * "nextPtr" field.  The type should NOT be
+                                * TK_ANNOT_TOGGLE;  these annotations are
+                                * managed by the TkBTreeTag procedure. */
+{
+    register TkAnnotation *annotPtr2, *prevPtr;
+
+    for (prevPtr = NULL, annotPtr2 = annotPtr->linePtr->annotPtr;
+           annotPtr2 != NULL;
+           prevPtr = annotPtr2, annotPtr2 = annotPtr2->nextPtr) {
+       if (annotPtr2->ch > annotPtr->ch) {
+           break;
+       }
+    }
+    if (prevPtr == NULL) {
+       annotPtr->nextPtr = annotPtr->linePtr->annotPtr;
+       annotPtr->linePtr->annotPtr = annotPtr;
+    } else {
+       annotPtr->nextPtr = prevPtr->nextPtr;
+       prevPtr->nextPtr = annotPtr;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeRemoveAnnotation --
+ *
+ *     This procedure unlinks an annotation from a B-tree so that
+ *     the annotation will no longer be managed by the B-tree code.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     AnnotPtr will be unlinked from its tree.  Note:  it is up to the
+ *     caller to free the storage for annotPtr, if that is desired.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+void
+TkBTreeRemoveAnnotation(annotPtr)
+    TkAnnotation *annotPtr;    /* Pointer to annotation, which must
+                                * have been linked into tree by a previous
+                                * call to TkBTreeAddAnnotation. */
+{
+    register TkAnnotation *prevPtr;
+
+    if (annotPtr->linePtr->annotPtr == annotPtr) {
+       annotPtr->linePtr->annotPtr = annotPtr->nextPtr;
+    } else {
+       for (prevPtr = annotPtr->linePtr->annotPtr;
+/* BUG: fixed by dhopkins, prevPtr was null!
+               prevPtr->nextPtr != annotPtr;
+*/
+               (prevPtr != NULL) && (prevPtr->nextPtr != annotPtr);
+               prevPtr = prevPtr->nextPtr) {
+           /* Empty loop body. */
+       }
+       if (prevPtr != NULL) { /* Bullet proofing by dhopkins */
+           prevPtr->nextPtr = annotPtr->nextPtr;
+       }
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeFindLine --
+ *
+ *     Find a particular line in a B-tree based on its line number.
+ *
+ * Results:
+ *     The return value is a pointer to the line structure for the
+ *     line whose index is "line", or NULL if no such line exists.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+TkTextLine *
+TkBTreeFindLine(tree, line)
+    TkTextBTree tree;                  /* B-tree in which to find line. */
+    int line;                          /* Index of desired line. */
+{
+    BTree *treePtr = (BTree *) tree;
+    register Node *nodePtr;
+    register TkTextLine *linePtr;
+    int linesLeft;
+
+    nodePtr = treePtr->rootPtr;
+    linesLeft = line;
+    if ((line < 0) || (line >= nodePtr->numLines)) {
+       return NULL;
+    }
+
+    /*
+     * Work down through levels of the tree until a node is found at
+     * level 0.
+     */
+
+    while (nodePtr->level != 0) {
+       for (nodePtr = nodePtr->children.nodePtr;
+               nodePtr->numLines <= linesLeft;
+               nodePtr = nodePtr->nextPtr) {
+           if (nodePtr == NULL) {
+               panic("TkBTreeFindLine ran out of nodes");
+           }
+           linesLeft -= nodePtr->numLines;
+       }
+    }
+
+    /*
+     * Work through the lines attached to the level-0 node.
+     */
+
+    for (linePtr = nodePtr->children.linePtr; linesLeft > 0;
+           linePtr = linePtr->nextPtr) {
+       if (linePtr == NULL) {
+           panic("TkBTreeFindLine ran out of lines");
+       }
+       linesLeft -= 1;
+    }
+    return linePtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeNextLine --
+ *
+ *     Given an existing line in a B-tree, this procedure locates the
+ *     next line in the B-tree.  This procedure is used for scanning
+ *     through the B-tree.
+ *
+ * Results:
+ *     The return value is a pointer to the line that immediately
+ *     follows linePtr, or NULL if there is no such line.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+TkTextLine *
+TkBTreeNextLine(linePtr)
+    register TkTextLine *linePtr;      /* Pointer to existing line in
+                                        * B-tree. */
+{
+    register Node *nodePtr;
+
+    if (linePtr->nextPtr != NULL) {
+       return linePtr->nextPtr;
+    }
+
+    /*
+     * This was the last line associated with the particular parent node.
+     * Search up the tree for the next node, then search down from that
+     * node to find the first line,
+     */
+
+    for (nodePtr = linePtr->parentPtr; ; nodePtr = nodePtr->parentPtr) {
+       if (nodePtr->nextPtr != NULL) {
+           nodePtr = nodePtr->nextPtr;
+           break;
+       }
+       if (nodePtr->parentPtr == NULL) {
+           return (TkTextLine *) NULL;
+       }
+    }
+    while (nodePtr->level > 0) {
+       nodePtr = nodePtr->children.nodePtr;
+    }
+    return nodePtr->children.linePtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeLineIndex --
+ *
+ *     Given a pointer to a line in a B-tree, return the numerical
+ *     index of that line.
+ *
+ * Results:
+ *     The result is the index of linePtr within the tree, where 0
+ *     corresponds to the first line in the tree.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TkBTreeLineIndex(linePtr)
+    TkTextLine *linePtr;               /* Pointer to existing line in
+                                        * B-tree. */
+{
+    register TkTextLine *linePtr2;
+    register Node *nodePtr, *parentPtr, *nodePtr2;
+    int index;
+
+    /*
+     * First count how many lines precede this one in its level-0
+     * node.
+     */
+
+    nodePtr = linePtr->parentPtr;
+    index = 0;
+    for (linePtr2 = nodePtr->children.linePtr; linePtr2 != linePtr;
+           linePtr2 = linePtr2->nextPtr) {
+       if (linePtr2 == NULL) {
+           panic("TkBTreeLineIndex couldn't find line");
+       }
+       index += 1;
+    }
+
+    /*
+     * Now work up through the levels of the tree one at a time,
+     * counting how many lines are in nodes preceding the current
+     * node.
+     */
+
+    for (parentPtr = nodePtr->parentPtr ; parentPtr != NULL;
+           nodePtr = parentPtr, parentPtr = parentPtr->parentPtr) {
+       for (nodePtr2 = parentPtr->children.nodePtr; nodePtr2 != nodePtr;
+               nodePtr2 = nodePtr2->nextPtr) {
+           if (nodePtr2 == NULL) {
+               panic("TkBTreeLineIndex couldn't find node");
+           }
+           index += nodePtr2->numLines;
+       }
+    }
+    return index;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeStartSearch --
+ *
+ *     This procedure sets up a search for tag transitions involving
+ *     a given tag (or all tags) in a given range of the text.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The information at *searchPtr is set up so that subsequent calls
+ *     to TkBTreeNextTag will return information about the locations of
+ *     tag transitions.  Note that TkBTreeNextTag must be called to get
+ *     the first transition.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkBTreeStartSearch(tree, line1, ch1, line2, ch2, tagPtr, searchPtr)
+    TkTextBTree tree;                  /* Tree to search. */
+    int line1, ch1;                    /* Character position at which to                                                * start search (tags at this position
+                                        * will be returned). */
+    int line2, ch2;                    /* Character position at which to                                                * stop search (tags at this position
+                                        * will be returned). */
+    TkTextTag *tagPtr;                 /* Tag to search for.  NULL means
+                                        * search for any tag. */
+    register TkTextSearch *searchPtr;  /* Where to store information about
+                                        * search's progress. */
+{
+    register TkAnnotation *annotPtr;
+
+    searchPtr->tree = tree;
+    if (line1 < 0) {
+       searchPtr->line1 = 0;
+       searchPtr->ch1 = 0;
+    } else {
+       searchPtr->line1 = line1;
+       searchPtr->ch1 = ch1;
+    }
+    searchPtr->line2 = line2;
+    searchPtr->ch2 = ch2;
+    searchPtr->tagPtr = tagPtr;
+    searchPtr->allTags = (tagPtr == NULL);
+
+    searchPtr->linePtr = TkBTreeFindLine(searchPtr->tree, searchPtr->line1);
+    if (searchPtr->linePtr == NULL) {
+       searchPtr->line1 = searchPtr->line2;
+       searchPtr->ch1 = searchPtr->ch2;
+       searchPtr->annotPtr = NULL;
+    } else {
+       for (annotPtr = searchPtr->linePtr->annotPtr;
+               (annotPtr != NULL) && (annotPtr->ch < ch1);
+               annotPtr = annotPtr->nextPtr) {
+           /* Empty loop body. */
+       }
+       searchPtr->annotPtr = annotPtr;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeNextTag --
+ *
+ *     Once a tag search has begun, successive calls to this procedure
+ *     return successive tag toggles.  Note:  it is NOT SAFE to call this
+ *     procedure if characters have been inserted into or deleted from
+ *     the B-tree since the call to TkBTreeStartSearch.
+ *
+ * Results:
+ *     The return value is 1 if another toggle was found that met the
+ *     criteria specified in the call to TkBTreeStartSearch.  0 is
+ *     returned if no more matching tag transitions were found.
+ *
+ * Side effects:
+ *     Information in *searchPtr is modified to update the state of the
+ *     search and indicate where the next tag toggle is located.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TkBTreeNextTag(searchPtr)
+    register TkTextSearch *searchPtr;  /* Information about search in
+                                        * progress;  must have been set up by
+                                        * call to TkBTreeStartSearch. */
+{
+    register TkAnnotation *annotPtr;
+    register Node *nodePtr;
+    register Summary *summaryPtr;
+
+    if (searchPtr->linePtr == NULL) {
+       return 0;
+    }
+
+    /*
+     * The outermost loop iterates over lines that may potentially contain
+     * a relevant tag transition, starting from the current line and tag.
+     */
+
+    while (1) {
+       /*
+        * See if there are more tags on the current line that are relevant.
+        */
+    
+       for (annotPtr = searchPtr->annotPtr; annotPtr != NULL;
+               annotPtr = annotPtr->nextPtr) {
+           if ((annotPtr->type == TK_ANNOT_TOGGLE)
+                   && (searchPtr->allTags
+                   || (annotPtr->info.tagPtr == searchPtr->tagPtr))) {
+               if ((searchPtr->line1 == searchPtr->line2)
+                       && (annotPtr->ch > searchPtr->ch2)) {
+                   goto searchOver;
+               }
+               searchPtr->tagPtr = annotPtr->info.tagPtr;
+               searchPtr->ch1 = annotPtr->ch;
+               searchPtr->annotPtr = annotPtr->nextPtr;
+               return 1;
+           }
+       }
+    
+       /*
+        * See if there are more lines associated with the current parent
+        * node.  If so, go back to the top of the loop to search the next
+        * one of them.
+        */
+    
+       if (searchPtr->line1 >= searchPtr->line2) {
+           goto searchOver;
+       }
+       searchPtr->line1++;
+       if (searchPtr->linePtr->nextPtr != NULL) {
+           searchPtr->linePtr = searchPtr->linePtr->nextPtr;
+           searchPtr->annotPtr = searchPtr->linePtr->annotPtr;
+           continue;
+       }
+    
+       /*
+        * Search across and up through the B-tree's node hierarchy looking
+        * for the next node that has a relevant tag transition somewhere in
+        * its subtree.  Be sure to update the current line number as we
+        * skip over large chunks of lines.
+        */
+    
+       nodePtr = searchPtr->linePtr->parentPtr;
+       while (1) {
+           while (nodePtr->nextPtr == NULL) {
+               if (nodePtr->parentPtr == NULL) {
+                   goto searchOver;
+               }
+               nodePtr = nodePtr->parentPtr;
+           }
+           nodePtr = nodePtr->nextPtr;
+           for (summaryPtr = nodePtr->summaryPtr; summaryPtr != NULL;
+                   summaryPtr = summaryPtr->nextPtr) {
+               if ((searchPtr->allTags) ||
+                       (summaryPtr->tagPtr == searchPtr->tagPtr)) {
+                   goto gotNodeWithTag;
+               }
+           }
+           searchPtr->line1 += nodePtr->numLines;
+       }
+    
+       /*
+        * At this point we've found a subtree that has a relevant tag
+        * transition.  Now search down (and across) through that subtree
+        * to find the first level-0 node that has a relevant tag transition.
+        */
+    
+       gotNodeWithTag:
+       while (nodePtr->level > 0) {
+           for (nodePtr = nodePtr->children.nodePtr; ;
+                   nodePtr = nodePtr->nextPtr) {
+               for (summaryPtr = nodePtr->summaryPtr; summaryPtr != NULL;
+                       summaryPtr = summaryPtr->nextPtr) {
+                   if ((searchPtr->allTags)
+                           || (summaryPtr->tagPtr == searchPtr->tagPtr)) {
+                       goto nextChild;
+                   }
+               }
+               searchPtr->line1 += nodePtr->numLines;
+               if (nodePtr->nextPtr == NULL) {
+                   panic("TkBTreeNextTag found incorrect tag summary info.");
+               }
+           }
+           nextChild:
+           continue;
+       }
+    
+       /*
+        * Now we're down to a level-0 node that contains a line that contains
+        * a relevant tag transition.  Set up line information and go back to
+        * the beginning of the loop to search through lines.
+        */
+
+       searchPtr->linePtr = nodePtr->children.linePtr;
+       searchPtr->annotPtr = searchPtr->linePtr->annotPtr;
+       if (searchPtr->line1 > searchPtr->line2) {
+           goto searchOver;
+       }
+       continue;
+    }
+
+    searchOver:
+    searchPtr->line1 = searchPtr->line2;
+    searchPtr->ch1 = searchPtr->ch2;
+    searchPtr->annotPtr = NULL;
+    searchPtr->linePtr = NULL;
+    return 0;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeCheck --
+ *
+ *     This procedure runs a set of consistency checks over a B-tree
+ *     and panics if any inconsistencies are found.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If a structural defect is found, the procedure panics with an
+ *     error message.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkBTreeCheck(tree)
+    TkTextBTree tree;          /* Tree to check. */
+{
+    BTree *treePtr = (BTree *) tree;
+    register Summary *summaryPtr;
+
+    /*
+     * Make sure that overall there is an even count of tag transitions
+     * for the whole text.
+     */
+
+    for (summaryPtr = treePtr->rootPtr->summaryPtr; summaryPtr != NULL;
+           summaryPtr = summaryPtr->nextPtr) {
+       if (summaryPtr->toggleCount & 1) {
+           panic("TkBTreeCheck found odd toggle count for \"%s\" (%d)",
+                   summaryPtr->tagPtr->name, summaryPtr->toggleCount);
+       }
+    }
+
+    /*
+     * Call a recursive procedure to do all of the rest of the checks.
+     */
+
+    CheckNodeConsistency(treePtr->rootPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Rebalance --
+ *
+ *     This procedure is called when a node of a B-tree appears to be
+ *     out of balance (too many children, or too few).  It rebalances
+ *     that node and all of its ancestors in the tree.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The internal structure of treePtr may change.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+Rebalance(treePtr, nodePtr)
+    BTree *treePtr;                    /* Tree that is being rebalanced. */
+    register Node *nodePtr;            /* Node that may be out of balance. */
+{
+    /*
+     * Loop over the entire ancestral chain of the node, working up
+     * through the tree one node at a time until the root node has
+     * been processed.
+     */
+
+    for ( ; nodePtr != NULL; nodePtr = nodePtr->parentPtr) {
+       register Node *newPtr, *childPtr;
+       register TkTextLine *linePtr;
+       int i;
+
+       /*
+        * Check to see if the node has too many children.  If it does,
+        * then split off all but the first MIN_CHILDREN into a separate
+        * node following the original one.  Then repeat until the
+        * node has a decent size.
+        */
+
+       if (nodePtr->numChildren > MAX_CHILDREN) {
+           while (1) {
+               /*
+                * If the node being split is the root node, then make a
+                * new root node above it first.
+                */
+    
+               if (nodePtr->parentPtr == NULL) {
+                   newPtr = (Node *) ckalloc(sizeof(Node));
+                   newPtr->parentPtr = NULL;
+                   newPtr->nextPtr = NULL;
+                   newPtr->summaryPtr = NULL;
+                   newPtr->level = nodePtr->level + 1;
+                   newPtr->children.nodePtr = nodePtr;
+                   newPtr->numChildren = 1;
+                   newPtr->numLines = nodePtr->numLines;
+                   RecomputeNodeCounts(newPtr);
+                   treePtr->rootPtr = newPtr;
+               }
+               newPtr = (Node *) ckalloc(sizeof(Node));
+               newPtr->parentPtr = nodePtr->parentPtr;
+               newPtr->nextPtr = nodePtr->nextPtr;
+               nodePtr->nextPtr = newPtr;
+               newPtr->summaryPtr = NULL;
+               newPtr->level = nodePtr->level;
+               newPtr->numChildren = nodePtr->numChildren - MIN_CHILDREN;
+               if (nodePtr->level == 0) {
+                   for (i = MIN_CHILDREN-1,
+                           linePtr = nodePtr->children.linePtr;
+                           i > 0; i--, linePtr = linePtr->nextPtr) {
+                       /* Empty loop body. */
+                   }
+                   newPtr->children.linePtr = linePtr->nextPtr;
+                   linePtr->nextPtr = NULL;
+               } else {
+                   for (i = MIN_CHILDREN-1,
+                           childPtr = nodePtr->children.nodePtr;
+                           i > 0; i--, childPtr = childPtr->nextPtr) {
+                       /* Empty loop body. */
+                   }
+                   newPtr->children.nodePtr = childPtr->nextPtr;
+                   childPtr->nextPtr = NULL;
+               }
+               RecomputeNodeCounts(nodePtr);
+               nodePtr->parentPtr->numChildren++;
+               nodePtr = newPtr;
+               if (nodePtr->numChildren <= MAX_CHILDREN) {
+                   RecomputeNodeCounts(nodePtr);
+                   break;
+               }
+           }
+       }
+
+       while (nodePtr->numChildren < MIN_CHILDREN) {
+           register Node *otherPtr;
+           Node *halfwayNodePtr = NULL;        /* Initialization needed only */
+           TkTextLine *halfwayLinePtr = NULL;  /* to prevent cc warnings. */
+           int totalChildren, firstChildren, i;
+
+           /*
+            * Too few children for this node.  If this is the root,
+            * it's OK for it to have less than MIN_CHILDREN children
+            * as long as it's got at least two.  If it has only one
+            * (and isn't at level 0), then chop the root node out of
+            * the tree and use its child as the new root.
+            */
+
+           if (nodePtr->parentPtr == NULL) {
+               if ((nodePtr->numChildren == 1) && (nodePtr->level > 0)) {
+                   treePtr->rootPtr = nodePtr->children.nodePtr;
+                   treePtr->rootPtr->parentPtr = NULL;
+                   DeleteSummaries(nodePtr->summaryPtr);
+                   ckfree((char *) nodePtr);
+               }
+               return;
+           }
+
+           /*
+            * Not the root.  Make sure that there are siblings to
+            * balance with.
+            */
+
+           if (nodePtr->parentPtr->numChildren < 2) {
+               Rebalance(treePtr, nodePtr->parentPtr);
+               continue;
+           }
+
+           /*
+            * Find a sibling to borrow from, and arrange for nodePtr to
+            * be the earlier of the pair.
+            */
+
+           if (nodePtr->nextPtr == NULL) {
+               for (otherPtr = nodePtr->parentPtr->children.nodePtr;
+                       otherPtr->nextPtr != nodePtr;
+                       otherPtr = otherPtr->nextPtr) {
+                   /* Empty loop body. */
+               }
+               nodePtr = otherPtr;
+           }
+           otherPtr = nodePtr->nextPtr;
+
+           /*
+            * We're going to either merge the two siblings together
+            * into one node or redivide the children among them to
+            * balance their loads.  As preparation, join their two
+            * child lists into a single list and remember the half-way
+            * point in the list.
+            */
+
+           totalChildren = nodePtr->numChildren + otherPtr->numChildren;
+           firstChildren = totalChildren/2;
+           if (nodePtr->children.nodePtr == NULL) {
+               nodePtr->children = otherPtr->children;
+           } else if (nodePtr->level == 0) {
+               register TkTextLine *linePtr;
+
+               for (linePtr = nodePtr->children.linePtr, i = 1;
+                       linePtr->nextPtr != NULL;
+                       linePtr = linePtr->nextPtr, i++) {
+                   if (i == firstChildren) {
+                       halfwayLinePtr = linePtr;
+                   }
+               }
+               linePtr->nextPtr = otherPtr->children.linePtr;
+               while (i <= firstChildren) {
+                   halfwayLinePtr = linePtr;
+                   linePtr = linePtr->nextPtr;
+                   i++;
+               }
+           } else {
+               register Node *childPtr;
+
+               for (childPtr = nodePtr->children.nodePtr, i = 1;
+                       childPtr->nextPtr != NULL;
+                       childPtr = childPtr->nextPtr, i++) {
+                   if (i <= firstChildren) {
+                       if (i == firstChildren) {
+                           halfwayNodePtr = childPtr;
+                       }
+                   }
+               }
+               childPtr->nextPtr = otherPtr->children.nodePtr;
+               while (i <= firstChildren) {
+                   halfwayNodePtr = childPtr;
+                   childPtr = childPtr->nextPtr;
+                   i++;
+               }
+           }
+
+           /*
+            * If the two siblings can simply be merged together, do it.
+            */
+
+           if (totalChildren < MAX_CHILDREN) {
+               RecomputeNodeCounts(nodePtr);
+               nodePtr->nextPtr = otherPtr->nextPtr;
+               nodePtr->parentPtr->numChildren--;
+               DeleteSummaries(otherPtr->summaryPtr);
+               ckfree((char *) otherPtr);
+               continue;
+           }
+
+           /*
+            * The siblings can't be merged, so just divide their
+            * children evenly between them.
+            */
+
+           if (nodePtr->level == 0) {
+               otherPtr->children.linePtr = halfwayLinePtr->nextPtr;
+               halfwayLinePtr->nextPtr = NULL;
+           } else {
+               otherPtr->children.nodePtr = halfwayNodePtr->nextPtr;
+               halfwayNodePtr->nextPtr = NULL;
+           }
+           RecomputeNodeCounts(nodePtr);
+           RecomputeNodeCounts(otherPtr);
+       }
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * RecomputeNodeCounts --
+ *
+ *     This procedure is called to recompute all the counts in a node
+ *     (tags, child information, etc.) by scaning the information in
+ *     its descendants.  This procedure is called during rebalancing
+ *     when a node's child structure has changed.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The tag counts for nodePtr are modified to reflect its current
+ *     child structure, as are its numChildren and numLines fields.
+ *     Also, all of the children's parentPtr fields are made to point
+ *     to nodePtr.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+RecomputeNodeCounts(nodePtr)
+    register Node *nodePtr;            /* Node whose tag summary information
+                                        * must be recomputed. */
+{
+    register Summary *summaryPtr, *summaryPtr2;
+    register Node *childPtr;
+    register TkTextLine *linePtr;
+    register TkAnnotation *annotPtr;
+
+    /*
+     * Zero out all the existing counts for the node, but don't delete
+     * the existing Summary records (most of them will probably be reused).
+     */
+
+    for (summaryPtr = nodePtr->summaryPtr; summaryPtr != NULL;
+           summaryPtr = summaryPtr->nextPtr) {
+       summaryPtr->toggleCount = 0;
+    }
+    nodePtr->numChildren = 0;
+    nodePtr->numLines = 0;
+
+    /*
+     * Scan through the children, adding the childrens' tag counts into
+     * the node's tag counts and adding new Summarys to the node if
+     * necessary.
+     */
+
+    if (nodePtr->level == 0) {
+       for (linePtr = nodePtr->children.linePtr; linePtr != NULL;
+               linePtr = linePtr->nextPtr) {
+           nodePtr->numChildren++;
+           nodePtr->numLines++;
+           linePtr->parentPtr = nodePtr;
+           for (annotPtr = linePtr->annotPtr; annotPtr != NULL;
+                   annotPtr = annotPtr->nextPtr) {
+               if (annotPtr->type != TK_ANNOT_TOGGLE) {
+                   continue;
+               }
+               for (summaryPtr = nodePtr->summaryPtr; ;
+                       summaryPtr = summaryPtr->nextPtr) {
+                   if (summaryPtr == NULL) {
+                       summaryPtr = (Summary *) ckalloc(sizeof(Summary));
+                       summaryPtr->tagPtr = annotPtr->info.tagPtr;
+                       summaryPtr->toggleCount = 1;
+                       summaryPtr->nextPtr = nodePtr->summaryPtr;
+                       nodePtr->summaryPtr = summaryPtr;
+                       break;
+                   }
+                   if (summaryPtr->tagPtr == annotPtr->info.tagPtr) {
+                       summaryPtr->toggleCount++;
+                       break;
+                   }
+               }
+           }
+       }
+    } else {
+       for (childPtr = nodePtr->children.nodePtr; childPtr != NULL;
+               childPtr = childPtr->nextPtr) {
+           nodePtr->numChildren++;
+           nodePtr->numLines += childPtr->numLines;
+           childPtr->parentPtr = nodePtr;
+           for (summaryPtr2 = childPtr->summaryPtr; summaryPtr2 != NULL;
+                   summaryPtr2 = summaryPtr2->nextPtr) {
+               for (summaryPtr = nodePtr->summaryPtr; ;
+                       summaryPtr = summaryPtr->nextPtr) {
+                   if (summaryPtr == NULL) {
+                       summaryPtr = (Summary *) ckalloc(sizeof(Summary));
+                       summaryPtr->tagPtr = summaryPtr2->tagPtr;
+                       summaryPtr->toggleCount = summaryPtr2->toggleCount;
+                       summaryPtr->nextPtr = nodePtr->summaryPtr;
+                       nodePtr->summaryPtr = summaryPtr;
+                       break;
+                   }
+                   if (summaryPtr->tagPtr == summaryPtr2->tagPtr) {
+                       summaryPtr->toggleCount += summaryPtr2->toggleCount;
+                       break;
+                   }
+               }
+           }
+       }
+    }
+
+    /*
+     * Scan through the node's tag records again and delete any Summary
+     * records that still have a zero count.
+     */
+
+    summaryPtr2 = NULL;
+    for (summaryPtr = nodePtr->summaryPtr; summaryPtr != NULL; ) {
+       if (summaryPtr->toggleCount > 0) {
+           summaryPtr2 = summaryPtr;
+           summaryPtr = summaryPtr->nextPtr;
+           continue;
+       }
+       if (summaryPtr2 != NULL) {
+           summaryPtr2->nextPtr = summaryPtr->nextPtr;
+           ckfree((char *) summaryPtr);
+           summaryPtr = summaryPtr2->nextPtr;
+       } else {
+           nodePtr->summaryPtr = summaryPtr->nextPtr;
+           ckfree((char *) summaryPtr);
+           summaryPtr = nodePtr->summaryPtr;
+       }
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * AddToggleToLine --
+ *
+ *     Insert a tag transition at a particular point in a particular
+ *     line.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     LinePtr and all its ancestors in the B-tree stucture are modified
+ *     to indicate the presence of a transition (either on or off) on
+ *     tag at the given place in the given line.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+AddToggleToLine(linePtr, index, tagPtr)
+    TkTextLine *linePtr;               /* Line within which to add
+                                        * transition. */
+    int index;                         /* Character before which to
+                                        * add transition. */
+    TkTextTag *tagPtr;                 /* Information about tag. */
+{
+    register TkAnnotation *annotPtr, *prevPtr;
+    int delta = 1;
+
+    /*
+     * Find the position where the toggle should be inserted into
+     * the array (just after prevPtr), and see if there is already
+     * a toggle at exactly the point where we're going to insert a
+     * new toggle.  If so then the two toggles cancel;  just delete
+     * the existing toggle.
+     */
+
+    for (prevPtr = NULL, annotPtr = linePtr->annotPtr; annotPtr != NULL;
+           prevPtr = annotPtr, annotPtr = annotPtr->nextPtr) {
+       if (annotPtr->ch > index) {
+           break;
+       }
+       if ((annotPtr->type == TK_ANNOT_TOGGLE)
+               && (annotPtr->ch == index)
+               && (annotPtr->info.tagPtr == tagPtr)) {
+           if (prevPtr == NULL) {
+               linePtr->annotPtr = annotPtr->nextPtr;
+           } else {
+               prevPtr->nextPtr = annotPtr->nextPtr;
+           }
+           ckfree((char *) annotPtr);
+           delta = -1;
+           goto updateNodes;
+       }
+    }
+
+    /*
+     * Create a new toggle and insert it into the list.
+     */
+
+    annotPtr = (TkAnnotation *) ckalloc(sizeof(TkAnnotation));
+    annotPtr->type = TK_ANNOT_TOGGLE;
+    annotPtr->linePtr = linePtr;
+    annotPtr->ch = index;
+    annotPtr->info.tagPtr = tagPtr;
+    if (prevPtr == NULL) {
+       annotPtr->nextPtr = linePtr->annotPtr;
+       linePtr->annotPtr = annotPtr;
+    } else {
+       annotPtr->nextPtr = prevPtr->nextPtr;
+       prevPtr->nextPtr = annotPtr;
+    }
+
+    /*
+     * Update all the nodes above this line to reflect the change in
+     * toggle structure.
+     */
+
+    updateNodes:
+    ChangeNodeToggleCount(linePtr->parentPtr, tagPtr, delta);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ChangeNodeToggleCount --
+ *
+ *     This procedure increments or decrements the toggle count for
+ *     a particular tag in a particular node and all its ancestors.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The toggle count for tag is adjusted up or down by "delta" in
+ *     nodePtr.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ChangeNodeToggleCount(nodePtr, tagPtr, delta)
+    register Node *nodePtr;            /* Node whose toggle count for a tag
+                                        * must be changed. */
+    TkTextTag *tagPtr;                 /* Information about tag. */
+    int delta;                         /* Amount to add to current toggle
+                                        * count for tag (may be negative). */
+{
+    register Summary *summaryPtr, *prevPtr;
+
+    /*
+     * Iterate over the node and all of its ancestors.
+     */
+
+    for ( ; nodePtr != NULL; nodePtr = nodePtr->parentPtr) {
+       /*
+        * See if there's already an entry for this tag for this node.  If so,
+        * perhaps all we have to do is adjust its count.
+        */
+    
+       for (prevPtr = NULL, summaryPtr = nodePtr->summaryPtr;
+               summaryPtr != NULL;
+               prevPtr = summaryPtr, summaryPtr = summaryPtr->nextPtr) {
+           if (summaryPtr->tagPtr != tagPtr) {
+               continue;
+           }
+           summaryPtr->toggleCount += delta;
+           if (summaryPtr->toggleCount > 0) {
+               goto nextAncestor;
+           }
+           if (summaryPtr->toggleCount < 0) {
+               panic("ChangeNodeToggleCount: negative toggle count");
+           }
+    
+           /*
+            * Zero count;  must remove this tag from the list.
+            */
+    
+           if (prevPtr == NULL) {
+               nodePtr->summaryPtr = summaryPtr->nextPtr;
+           } else {
+               prevPtr->nextPtr = summaryPtr->nextPtr;
+           }
+           ckfree((char *) summaryPtr);
+           goto nextAncestor;
+       }
+    
+       /*
+        * This tag isn't in the list.  Add a new entry to the list.
+        */
+    
+       if (delta < 0) {
+           panic("ChangeNodeToggleCount: negative delta, no tag entry");
+       }
+       summaryPtr = (Summary *) ckalloc(sizeof(Summary));
+       summaryPtr->tagPtr = tagPtr;
+       summaryPtr->toggleCount = delta;
+       summaryPtr->nextPtr = nodePtr->summaryPtr;
+       nodePtr->summaryPtr = summaryPtr;
+
+       nextAncestor:
+       continue;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeCharTagged --
+ *
+ *     Determine whether a particular character has a particular tag.
+ *
+ * Results:
+ *     The return value is 1 if the given tag is in effect at the
+ *     character given by linePtr and ch, and 0 otherwise.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TkBTreeCharTagged(linePtr, ch, tagPtr)
+    TkTextLine *linePtr;               /* Line containing character of
+                                        * interest. */
+    int ch;                            /* Index of character in linePtr. */
+    TkTextTag *tagPtr;                 /* Tag of interest. */
+{
+    register Node *nodePtr;
+    register TkTextLine *siblingLinePtr;
+    int toggles;
+
+    /*
+     * Count the number of toggles for the tag at the line level (i.e.
+     * in all the sibling lines that precede this one, plus in this line
+     * up to the character of interest.
+     */
+
+    toggles = 0;
+    for (siblingLinePtr = linePtr->parentPtr->children.linePtr; ;
+           siblingLinePtr = siblingLinePtr->nextPtr) {
+       register TkAnnotation *annotPtr;
+
+       for (annotPtr = siblingLinePtr->annotPtr;
+               (annotPtr != NULL) && ((siblingLinePtr != linePtr)
+                   || (annotPtr->ch <= ch));
+               annotPtr = annotPtr->nextPtr) {
+           if ((annotPtr->type == TK_ANNOT_TOGGLE)
+                   && (annotPtr->info.tagPtr == tagPtr)) {
+               toggles++;
+           }
+       }
+       if (siblingLinePtr == linePtr) {
+           break;
+       }
+    }
+
+    /*
+     * For each node in the ancestry of this line, count the number of
+     * toggles of the given tag in siblings that precede that node.
+     */
+
+    for (nodePtr = linePtr->parentPtr; nodePtr->parentPtr != NULL;
+           nodePtr = nodePtr->parentPtr) {
+       register Node *siblingPtr;
+       register Summary *summaryPtr;
+
+       for (siblingPtr = nodePtr->parentPtr->children.nodePtr; 
+               siblingPtr != nodePtr; siblingPtr = siblingPtr->nextPtr) {
+           for (summaryPtr = siblingPtr->summaryPtr; summaryPtr != NULL;
+                   summaryPtr = summaryPtr->nextPtr) {
+               if (summaryPtr->tagPtr == tagPtr) {
+                   toggles += summaryPtr->toggleCount;
+               }
+           }
+       }
+    }
+
+    /*
+     * An odd number of toggles means that the tag is present at the
+     * given point.
+     */
+
+    return toggles & 1;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeGetTags --
+ *
+ *     Return information about all of the tags that are associated
+ *     with a particular character in a B-tree of text.
+ *
+ * Results:
+ *     The return value is a malloc-ed array containing pointers to
+ *     information for each of the tags that is associated with
+ *     the character at the position given by linePtr and ch.  The
+ *     word at *numTagsPtr is filled in with the number of pointers
+ *     in the array.  It is up to the caller to free the array by
+ *     passing it to free.  If there are no tags at the given character
+ *     then a NULL pointer is returned and *numTagsPtr will be set to 0.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+TkTextTag **
+TkBTreeGetTags(tree, linePtr, ch, numTagsPtr)
+    TkTextBTree tree;          /* Tree to check. */
+    TkTextLine *linePtr;       /* Line containing character of interest. */
+    int ch;                    /* Index within linePtr of character for
+                                * which tag information is wanted. */
+    int *numTagsPtr;           /* Store number of tags found at this
+                                * location. */
+{
+    register Node *nodePtr;
+    register TkTextLine *siblingLinePtr;
+    int src, dst;
+    TagInfo tagInfo;
+#define NUM_TAG_INFOS 10
+
+    tagInfo.numTags = 0;
+    tagInfo.arraySize = NUM_TAG_INFOS;
+    tagInfo.tagPtrs = (TkTextTag **) ckalloc((unsigned)
+           NUM_TAG_INFOS*sizeof(TkTextTag *));
+    tagInfo.counts = (int *) ckalloc((unsigned)
+           NUM_TAG_INFOS*sizeof(int));
+
+    /*
+     * Record tag toggles at the line level (i.e. in all the sibling
+     * lines that precede this one, plus in this line up to the character
+     * of interest.
+     */
+
+    for (siblingLinePtr = linePtr->parentPtr->children.linePtr; ;
+           siblingLinePtr = siblingLinePtr->nextPtr) {
+       register TkAnnotation *annotPtr;
+
+       for (annotPtr = siblingLinePtr->annotPtr;
+               (annotPtr != NULL) && ((siblingLinePtr != linePtr)
+                   || (annotPtr->ch <= ch));
+               annotPtr = annotPtr->nextPtr) {
+           if (annotPtr->type == TK_ANNOT_TOGGLE) {
+               IncCount(annotPtr->info.tagPtr, 1, &tagInfo);
+           }
+       }
+       if (siblingLinePtr == linePtr) {
+           break;
+       }
+    }
+
+    /*
+     * For each node in the ancestry of this line, record tag toggles
+     * for all siblings that precede that node.
+     */
+
+    for (nodePtr = linePtr->parentPtr; nodePtr->parentPtr != NULL;
+           nodePtr = nodePtr->parentPtr) {
+       register Node *siblingPtr;
+       register Summary *summaryPtr;
+
+       for (siblingPtr = nodePtr->parentPtr->children.nodePtr; 
+               siblingPtr != nodePtr; siblingPtr = siblingPtr->nextPtr) {
+           for (summaryPtr = siblingPtr->summaryPtr; summaryPtr != NULL;
+                   summaryPtr = summaryPtr->nextPtr) {
+               IncCount(summaryPtr->tagPtr, summaryPtr->toggleCount, &tagInfo);
+           }
+       }
+    }
+
+    /*
+     * Go through the tag information and squash out all of the tags
+     * that have even toggle counts (these tags exist before the point
+     * of interest, but not at the desired character itself).
+     */
+
+    for (src = 0, dst = 0; src < tagInfo.numTags; src++) {
+       if (tagInfo.counts[src] & 1) {
+           tagInfo.tagPtrs[dst] = tagInfo.tagPtrs[src];
+           dst++;
+       }
+    }
+    *numTagsPtr = dst;
+    ckfree((char *) tagInfo.counts);
+    if (dst == 0) {
+       ckfree((char *) tagInfo.tagPtrs);
+       return NULL;
+    }
+    return tagInfo.tagPtrs;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * IncCount --
+ *
+ *     This is a utility procedure used by TkBTreeGetTags.  It
+ *     increments the count for a particular tag, adding a new
+ *     entry for that tag if there wasn't one previously.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The information at *tagInfoPtr may be modified, and the arrays
+ *     may be reallocated to make them larger.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+IncCount(tagPtr, inc, tagInfoPtr)
+    TkTextTag *tagPtr;         /* Handle for tag. */
+    int inc;                   /* Amount by which to increment tag count. */
+    TagInfo *tagInfoPtr;       /* Holds cumulative information about tags;
+                                * increment count here. */
+{
+    register TkTextTag **tagPtrPtr;
+    int count;
+
+    for (tagPtrPtr = tagInfoPtr->tagPtrs, count = tagInfoPtr->numTags;
+           count > 0; tagPtrPtr++, count--) {
+       if (*tagPtrPtr == tagPtr) {
+           tagInfoPtr->counts[tagInfoPtr->numTags-count] += inc;
+           return;
+       }
+    }
+
+    /*
+     * There isn't currently an entry for this tag, so we have to
+     * make a new one.  If the arrays are full, then enlarge the
+     * arrays first.
+     */
+
+    if (tagInfoPtr->numTags == tagInfoPtr->arraySize) {
+       TkTextTag **newTags;
+       int *newCounts, newSize;
+
+       newSize = 2*tagInfoPtr->arraySize;
+       newTags = (TkTextTag **) ckalloc((unsigned)
+               (newSize*sizeof(TkTextTag *)));
+       memcpy((VOID *) newTags, (VOID *) tagInfoPtr->tagPtrs,
+               tagInfoPtr->arraySize * sizeof(TkTextTag *));
+       ckfree((char *) tagInfoPtr->tagPtrs);
+       tagInfoPtr->tagPtrs = newTags;
+       newCounts = (int *) ckalloc((unsigned) (newSize*sizeof(int)));
+       memcpy((VOID *) newCounts, (VOID *) tagInfoPtr->counts,
+               tagInfoPtr->arraySize * sizeof(int));
+       ckfree((char *) tagInfoPtr->counts);
+       tagInfoPtr->counts = newCounts;
+       tagInfoPtr->arraySize = newSize;
+    }
+
+    tagInfoPtr->tagPtrs[tagInfoPtr->numTags] = tagPtr;
+    tagInfoPtr->counts[tagInfoPtr->numTags] = inc;
+    tagInfoPtr->numTags++;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * CheckNodeConsistency --
+ *
+ *     This procedure is called as part of consistency checking for
+ *     B-trees:  it checks several aspects of a node and also runs
+ *     checks recursively on the node's children.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     If anything suspicious is found in the tree structure, the
+ *     procedure panics.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+CheckNodeConsistency(nodePtr)
+    register Node *nodePtr;            /* Node whose subtree should be
+                                        * checked. */
+{
+    register Node *childNodePtr;
+    register Summary *summaryPtr, *summaryPtr2;
+    register TkAnnotation *annotPtr;
+    register TkTextLine *linePtr;
+    register char *p;
+    int numChildren, numLines, toggleCount, minChildren, index, numBytes;
+
+    if (nodePtr->parentPtr != NULL) {
+       minChildren = MIN_CHILDREN;
+    } else if (nodePtr->level > 0) {
+       minChildren = 2;
+    } else  {
+       minChildren = 1;
+    }
+    if ((nodePtr->numChildren < minChildren)
+           || (nodePtr->numChildren > MAX_CHILDREN)) {
+       panic("CheckNodeConsistency found bad child count (%d)",
+               nodePtr->numChildren);
+    }
+
+    numChildren = 0;
+    numLines = 0;
+    if (nodePtr->level == 0) {
+       for (linePtr = nodePtr->children.linePtr; linePtr != NULL;
+               linePtr = linePtr->nextPtr) {
+           if (linePtr->parentPtr != nodePtr) {
+               panic("CheckNodeConsistency found line that %s",
+                       "didn't point to parent");
+           }
+           for (p = linePtr->bytes, numBytes = 0; *p != 0; p++, numBytes++) {
+               if ((*p == '\n') && (numBytes != linePtr->numBytes-1)) {
+                   panic("CheckNodeConsistency found line with extra newline");
+               }
+           }
+           if (numBytes != linePtr->numBytes) {
+               panic("CheckNodeConsistency found line with bad numBytes");
+           }
+           if (linePtr->bytes[numBytes-1] != '\n') {
+               panic("CheckNodeConsistency found line with no newline");
+           }
+           index = 0;
+           for (annotPtr = linePtr->annotPtr; annotPtr != NULL;
+                       annotPtr = annotPtr->nextPtr) {
+               if (annotPtr->ch < index) {
+                   panic("CheckNodeConsistency found %s (%d %d)",
+                           "out-of-order tag indices", index,
+                           annotPtr->ch);
+               }
+               index = annotPtr->ch;
+               if (annotPtr->type == TK_ANNOT_TOGGLE) {
+                   for (summaryPtr = nodePtr->summaryPtr; ;
+                           summaryPtr = summaryPtr->nextPtr) {
+                       if (summaryPtr == NULL) {
+                           panic("CheckNodeConsistency found line %s",
+                                   "tag with no node tag: %s",
+                                   summaryPtr->tagPtr->name);
+                       }
+                       if (summaryPtr->tagPtr == annotPtr->info.tagPtr) {
+                           break;
+                       }
+                   }
+               }
+           }
+           numChildren++;
+           numLines++;
+       }
+    } else {
+       for (childNodePtr = nodePtr->children.nodePtr; childNodePtr != NULL;
+               childNodePtr = childNodePtr->nextPtr) {
+           CheckNodeConsistency(childNodePtr);
+           for (summaryPtr = childNodePtr->summaryPtr; summaryPtr != NULL;
+                       summaryPtr = summaryPtr->nextPtr) {
+               for (summaryPtr2 = nodePtr->summaryPtr; ;
+                       summaryPtr2 = summaryPtr2->nextPtr) {
+                   if (summaryPtr2 == NULL) {
+                       panic("CheckNodeConsistency found %s (%s)",
+                               "node tag with no parent tag",
+                               summaryPtr->tagPtr->name);
+                   }
+                   if (summaryPtr->tagPtr == summaryPtr2->tagPtr) {
+                       break;
+                   }
+               }
+           }
+           numChildren++;
+           numLines += childNodePtr->numLines;
+           if (childNodePtr->parentPtr != nodePtr) {
+               panic("CheckNodeConsistency found node that %s",
+                       "didn't point to parent");
+           }
+           if (childNodePtr->level != (nodePtr->level-1)) {
+               panic("CheckNodeConsistency found level mismatch (%d %d)",
+                       nodePtr->level, childNodePtr->level);
+           }
+       }
+    }
+    if (numChildren != nodePtr->numChildren) {
+       panic("CheckNodeConsistency found mismatch in numChildren (%d %d)",
+               numChildren, nodePtr->numChildren);
+    }
+    if (numLines != nodePtr->numLines) {
+       panic("CheckNodeConsistency found mismatch in numLines (%d %d)",
+               numLines, nodePtr->numLines);
+    }
+
+    for (summaryPtr = nodePtr->summaryPtr; summaryPtr != NULL;
+           summaryPtr = summaryPtr->nextPtr) {
+       toggleCount = 0;
+       if (nodePtr->level == 0) {
+           for (linePtr = nodePtr->children.linePtr; linePtr != NULL;
+                   linePtr = linePtr->nextPtr) {
+               for (annotPtr = linePtr->annotPtr; annotPtr != NULL;
+                       annotPtr = annotPtr->nextPtr) {
+                   if (annotPtr->info.tagPtr == summaryPtr->tagPtr) {
+                       toggleCount++;
+                   }
+               }
+           }
+       } else {
+           for (childNodePtr = nodePtr->children.nodePtr;
+                   childNodePtr != NULL;
+                   childNodePtr = childNodePtr->nextPtr) {
+               for (summaryPtr2 = childNodePtr->summaryPtr;
+                       summaryPtr2 != NULL;
+                       summaryPtr2 = summaryPtr2->nextPtr) {
+                   if (summaryPtr2->tagPtr == summaryPtr->tagPtr) {
+                       toggleCount += summaryPtr2->toggleCount;
+                   }
+               }
+           }
+       }
+       if (toggleCount != summaryPtr->toggleCount) {
+           panic("CheckNodeConsistency found mismatch in toggleCount (%d %d)",
+                   toggleCount, summaryPtr->toggleCount);
+       }
+       for (summaryPtr2 = summaryPtr->nextPtr; summaryPtr2 != NULL;
+               summaryPtr2 = summaryPtr2->nextPtr) {
+           if (summaryPtr2->tagPtr == summaryPtr->tagPtr) {
+               panic("CheckNodeConsistency found duplicated node tag: %s",
+                       summaryPtr->tagPtr->name);
+           }
+       }
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkBTreeNumLines --
+ *
+ *     This procedure returns a count of the number of lines of
+ *     text present in a given B-tree.
+ *
+ * Results:
+ *     The return value is a count of the number of lines in tree.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TkBTreeNumLines(tree)
+    TkTextBTree tree;                  /* Information about tree. */
+{
+    BTree *treePtr = (BTree *) tree;
+    return treePtr->rootPtr->numLines;
+}
diff --git a/src/tk/tktxdisp.c b/src/tk/tktxdisp.c
new file mode 100644 (file)
index 0000000..c5f3c2a
--- /dev/null
@@ -0,0 +1,2094 @@
+/* 
+ * tkTextDisp.c --
+ *
+ *     This module provides facilities to display text widgets.  It is
+ *     the only place where information is kept about the screen layout
+ *     of text widgets.
+ *
+ * Copyright 1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkTextDisp.c,v 1.20 92/08/24 09:24:18 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tkint.h"
+#include "tktext.h"
+
+#include <assert.h>
+
+/*
+ * The following structure describes how to display a range of characters.
+ * The information is generated by scanning all of the tags associated
+ * with the characters and combining that with default information for
+ * the overall widget.  These structures form the hash keys for
+ * dInfoPtr->styleTable.
+ */
+
+typedef struct StyleValues {
+    Tk_3DBorder border;                /* Used for drawing background under text.
+                                * NULL means use widget background. */
+    int borderWidth;           /* Width of 3-D border for background. */
+    int relief;                        /* 3-D relief for background. */
+    Pixmap bgStipple;          /* Stipple bitmap for background.  None
+                                * means draw solid. */
+    XColor *fgColor;           /* Foreground color for text. */
+    XFontStruct *fontPtr;      /* Font for displaying text. */
+    Pixmap fgStipple;          /* Stipple bitmap for text and other
+                                * foreground stuff.   None means draw
+                                * solid.*/
+    int underline;             /* Non-zero means draw underline underneath
+                                * text. */
+} StyleValues;
+
+/*
+ * The following structure extends the StyleValues structure above with
+ * graphics contexts used to actually draw the characters.  The entries
+ * in dInfoPtr->styleTable point to structures of this type.
+ */
+
+typedef struct Style {
+    int refCount;              /* Number of times this structure is
+                                * referenced in Chunks. */
+    GC bgGC;                   /* Graphics context for background.  None
+                                * unless background is stippled. */
+    GC fgGC;                   /* Graphics context for foreground. */
+    StyleValues *sValuePtr;    /* Raw information from which GCs were
+                                * derived. */
+    Tcl_HashEntry *hPtr;       /* Pointer to entry in styleTable.  Used
+                                * to delete entry. */
+} Style;
+
+/*
+ * The following structure describes a range of characters, all on the
+ * same line of the display (which also means the same line of the text
+ * widget) and all having the same display attributes.
+ */
+
+typedef struct Chunk {
+    char *text;                        /* Characters to display. */
+    int numChars;              /* Number of characters to display. */
+    Style *stylePtr;           /* Style information used to display
+                                * characters. */
+    int x;                     /* X-coordinate of pixel at which to display
+                                * the characters. */
+    struct Chunk *nextPtr;     /* Next in list of all chunks displayed on the
+                                * same display line. */
+} Chunk;
+
+/*
+ * The following structure describes one line of the display, which may
+ * be either part or all of one line of the text.
+ */
+
+typedef struct DLine {
+    TkTextLine *linePtr;       /* Pointer to structure in B-tree that
+                                * contains characters displayed in this
+                                * line. */
+    int y;                     /* Y-position at which line is supposed to
+                                * be drawn (topmost pixel of rectangular
+                                * area occupied by line). */
+    int oldY;                  /* Y-position at which line currently
+                                * appears on display.  -1 means line isn't
+                                * currently visible on display.  This is
+                                * used to move lines by scrolling rather
+                                * than re-drawing. */
+    int height;                        /* Height of line, in pixels. */
+    int baseline;              /* Offset of text baseline from y. */
+    Chunk *chunkPtr;           /* Pointer to first chunk in list of all
+                                * of those that are displayed on this
+                                * line of the screen. */
+    struct DLine *nextPtr;     /* Next in list of all display lines for
+                                * this window.   The list is sorted in
+                                * order from top to bottom.  Note:  the
+                                * next DLine doesn't always correspond
+                                * to the next line of text:  (a) can have
+                                * multiple DLines for one text line, and
+                                * (b) can have gaps where DLine's have been
+                                * deleted because they're out of date. */
+} DLine;
+
+/*
+ * Overall display information for a text widget:
+ */
+
+typedef struct DInfo {
+    Tcl_HashTable styleTable;  /* Hash table that maps from StyleValues to
+                                * Styles for this widget. */
+    DLine *dLinePtr;           /* First in list of all display lines for
+                                * this widget, in order from top to bottom. */
+    GC copyGC;                 /* Graphics context for copying from off-
+                                * screen pixmaps onto screen. */
+    GC scrollGC;               /* Graphics context for copying from one place
+                                * in the window to another (scrolling):
+                                * differs from copyGC in that we need to get
+                                * GraphicsExpose events. */
+    int x;                     /* First x-coordinate that may be used for
+                                * actually displaying line information.
+                                * Leaves space for border, etc. */
+    int y;                     /* First y-coordinate that may be used for
+                                * actually displaying line information.
+                                * Leaves space for border, etc. */
+    int maxX;                  /* First x-coordinate to right of available
+                                * space for displaying lines. */
+    int maxY;                  /* First y-coordinate to bottom of available
+                                * space for displaying lines. */
+    int topOfEof;              /* Top-most pixel (lowest y-value) that has
+                                * been drawn in the appropriate fashion for
+                                * the portion of the window after the last
+                                * line of the text.  This field is used to
+                                * figure out when to redraw part or all of
+                                * the eof field. */
+    int flags;                 /* Various flag values:  see below for
+                                * definitions. */
+} DInfo;
+
+/*
+ * Flag values for DInfo structures:
+ *
+ * DINFO_OUT_OF_DATE:          Non-zero means that the DLine structures
+ *                             for this window are partially or completely
+ *                             out of date and need to be recomputed.
+ * REDRAW_PENDING:             Means that a when-idle handler has been
+ *                             scheduled to update the display.
+ * REDRAW_BORDERS:             Means window border or pad area has
+ *                             potentially been damaged and must be redrawn.
+ * REPICK_NEEDED:              1 means that the widget has been modified
+ *                             in a way that could change the current
+ *                             character (a different character might be
+ *                             under the mouse cursor now).  Need to
+ *                             recompute the current character before
+ *                             the next redisplay.
+ */
+
+#define DINFO_OUT_OF_DATE      1
+#define REDRAW_PENDING         2
+#define REDRAW_BORDERS         4
+#define REPICK_NEEDED          8
+
+/*
+ * Structures of the type defined below are used to keep track of
+ * tags while scanning through the text to create DLine structures.
+ */
+
+typedef struct TagInfo {
+    int numTags;               /* Number of tags currently active (the first
+                                * entries at *tagPtr). */
+    int arraySize;             /* Total number of entries at *tagPtr.  We
+                                * over-allocate the array to avoid continual
+                                * reallocations. */
+    TkTextTag **tagPtrs;       /* Pointer to array of pointers to active tags.
+                                * Array has space for arraySize tags, and
+                                * the first numTags are slots identify the
+                                * active tags. Malloc'ed (but may be NULL). */
+    TkTextSearch search;       /* Used to scan for tag transitions.  Current
+                                * state identifies next tag transition. */
+} TagInfo;
+
+/*
+ * The following counters keep statistics about redisplay that can be
+ * checked to see how clever this code is at reducing redisplays.
+ */
+
+static int numRedisplays;      /* Number of calls to DisplayText. */
+static int linesRedrawn;       /* Number of calls to DisplayDLine. */
+static int numCopies;          /* Number of calls to XCopyArea to copy part
+                                * of the screen. */
+static int damagedCopies;      /* Number of times that XCopyAreas didn't
+                                * completely work because some of the source
+                                * information was damaged. */
+static int TextUpdateTime = 100; // Added by Don.
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            ComputeStyleValues _ANSI_ARGS_((TkText *textPtr,
+                           int numTags, TkTextTag **tagPtr,
+                           StyleValues *sValuePtr));
+static void            DisplayDLine _ANSI_ARGS_((TkText *textPtr,
+                           DLine *dlPtr, Pixmap pixmap));
+static void            DisplayText _ANSI_ARGS_((ClientData clientData));
+static DLine *         FindDLine _ANSI_ARGS_((DLine *dlPtr, int line));
+static void            FreeDLines _ANSI_ARGS_((TkText *textPtr,
+                           DLine *firstPtr, DLine *lastPtr, int unlink));
+static void            FreeStyle _ANSI_ARGS_((Style *stylePtr));
+static Style *         GetStyle _ANSI_ARGS_((TkText *textPtr,
+                           StyleValues *sValuePtr));
+static DLine *         LayoutLine _ANSI_ARGS_((TkText *textPtr, int line,
+                           TkTextLine *linePtr, TagInfo *tInfoPtr));
+static void            ToggleTag _ANSI_ARGS_((TagInfo *tInfoPtr,
+                           TkTextTag *tagPtr));
+static void            UpdateDisplayInfo _ANSI_ARGS_((TkText *textPtr));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextCreateDInfo --
+ *
+ *     This procedure is called when a new text widget is created.
+ *     Its job is to set up display-related information for the widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A DInfo data structure is allocated and initialized and attached
+ *     to textPtr.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkTextCreateDInfo(textPtr)
+    TkText *textPtr;           /* Overall information for text widget. */
+{
+    register DInfo *dInfoPtr;
+    XGCValues gcValues;
+
+    dInfoPtr = (DInfo *) ckalloc(sizeof(DInfo));
+    Tcl_InitHashTable(&dInfoPtr->styleTable, sizeof(StyleValues)/sizeof(int));
+    dInfoPtr->dLinePtr = NULL;
+    gcValues.graphics_exposures = False;
+    dInfoPtr->copyGC = Tk_GetGC(textPtr->tkwin, GCGraphicsExposures, &gcValues);
+    gcValues.graphics_exposures = True;
+    dInfoPtr->scrollGC = Tk_GetGC(textPtr->tkwin, GCGraphicsExposures,
+           &gcValues);
+    dInfoPtr->topOfEof = 0;
+    dInfoPtr->flags = DINFO_OUT_OF_DATE;
+    textPtr->dInfoPtr = dInfoPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextFreeDInfo --
+ *
+ *     This procedure is called to free up all of the private display
+ *     information kept by this file for a text widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Lots of resources get freed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkTextFreeDInfo(textPtr)
+    TkText *textPtr;           /* Overall information for text widget. */
+{
+    register DInfo *dInfoPtr = textPtr->dInfoPtr;
+
+    /*
+     * Be careful to free up styleTable *after* freeing up all the
+     * DLines, so that the hash table is still intact to free up the
+     * style-related information from the lines.  Once the lines are
+     * all free then styleTable will be empty.
+     */
+
+    FreeDLines(textPtr, dInfoPtr->dLinePtr, (DLine *) NULL, 1);
+    Tcl_DeleteHashTable(&dInfoPtr->styleTable);
+    Tk_FreeGC(dInfoPtr->copyGC);
+    Tk_FreeGC(dInfoPtr->scrollGC);
+    if (dInfoPtr->flags & REDRAW_PENDING) {
+//     Tk_CancelIdleCall(DisplayText, (ClientData) textPtr);
+        assert(textPtr->updateTimerToken != NULL);
+       if (textPtr->updateTimerToken != NULL) {
+           Tk_DeleteTimerHandler(textPtr->updateTimerToken);
+           textPtr->updateTimerToken = NULL;
+       }
+    }
+    ckfree((char *) dInfoPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * GetStyle --
+ *
+ *     This procedure creates graphics contexts needed to display
+ *     text in a particular style, determined by "sValuePtr".  It
+ *     attempts to share style information as much as possible.
+ *
+ * Results:
+ *     The return value is a pointer to a Style structure that
+ *     corresponds to *sValuePtr.
+ *
+ * Side effects:
+ *     A new entry may be created in the style table for the widget.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static Style *
+GetStyle(textPtr, sValuePtr)
+    TkText *textPtr;           /* Overall information about text widget. */
+    StyleValues *sValuePtr;    /* Information about desired style. */
+{
+    Style *stylePtr;
+    Tcl_HashEntry *hPtr;
+    int new;
+    XGCValues gcValues;
+    unsigned long mask;
+
+    /*
+     * Use an existing style if there's one around that matches.
+     */
+
+    hPtr = Tcl_CreateHashEntry(&textPtr->dInfoPtr->styleTable,
+           (char *) sValuePtr, &new);
+    if (!new) {
+       stylePtr = (Style *) Tcl_GetHashValue(hPtr);
+       stylePtr->refCount++;
+       return stylePtr;
+    }
+
+    /*
+     * No existing style matched.  Make a new one.
+     */
+
+    stylePtr = (Style *) ckalloc(sizeof(Style));
+    stylePtr->refCount = 1;
+    if ((sValuePtr->border != NULL) && (sValuePtr->bgStipple != None)) {
+       gcValues.foreground = Tk_3DBorderColor(sValuePtr->border)->pixel;
+       gcValues.stipple = sValuePtr->bgStipple;
+       gcValues.fill_style = FillStippled;
+       stylePtr->bgGC = Tk_GetGC(textPtr->tkwin,
+               GCForeground|GCStipple|GCFillStyle, &gcValues);
+    } else {
+       stylePtr->bgGC = None;
+    }
+    mask = GCForeground|GCFont;
+    gcValues.foreground = sValuePtr->fgColor->pixel;
+    gcValues.font = sValuePtr->fontPtr->fid;
+    if (sValuePtr->fgStipple != None) {
+       gcValues.stipple = sValuePtr->fgStipple;
+       gcValues.fill_style = FillStippled;
+       mask |= GCStipple|GCFillStyle;
+    }
+    stylePtr->fgGC = Tk_GetGC(textPtr->tkwin, mask, &gcValues);
+    stylePtr->sValuePtr = (StyleValues *)
+           Tcl_GetHashKey(&textPtr->dInfoPtr->styleTable, hPtr);
+    stylePtr->hPtr = hPtr;
+    Tcl_SetHashValue(hPtr, stylePtr);
+    return stylePtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * FreeStyle --
+ *
+ *     This procedure is called when a Style structure is no longer
+ *     needed.  It decrements the reference count and frees up the
+ *     space for the style structure if the reference count is 0.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The storage and other resources associated with the style
+ *     are freed up if no-one's still using it.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+FreeStyle(stylePtr)
+    register Style *stylePtr;  /* Information about style to be freed. */
+
+{
+    stylePtr->refCount--;
+    if (stylePtr->refCount == 0) {
+       if (stylePtr->bgGC != None) {
+           Tk_FreeGC(stylePtr->bgGC);
+       }
+       Tk_FreeGC(stylePtr->fgGC);
+       Tcl_DeleteHashEntry(stylePtr->hPtr);
+       ckfree((char *) stylePtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ComputeStyleValues --
+ *
+ *     Given a list of tags that apply at a particular point, compute
+ *     the StyleValues that correspond to that set of tags.
+ *
+ * Results:
+ *     All of the fields of *sValuePtr get filled in to hold the
+ *     appropriate display information for the given set of tags
+ *     in the given widget.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ComputeStyleValues(textPtr, numTags, tagPtrPtr, sValuePtr)
+    TkText *textPtr;                   /* Overall information for widget. */
+    int numTags;                       /* Number of tags at *tagPtr. */
+    register TkTextTag **tagPtrPtr;    /* Pointer to array of tag pointers. */
+    register StyleValues *sValuePtr;   /* Pointer to structure to fill in. */
+{
+    register TkTextTag *tagPtr;
+
+    /*
+     * The variables below keep track of the highest-priority specification
+     * that has occurred for each of the various fields of the StyleValues.
+     */
+
+    int borderPrio, bgStipplePrio;
+    int fgPrio, fontPrio, fgStipplePrio;
+
+    borderPrio = bgStipplePrio = -1;
+    fgPrio = fontPrio = fgStipplePrio = -1;
+    memset((VOID *) sValuePtr, 0, sizeof(StyleValues));
+    sValuePtr->fgColor = textPtr->fgColor;
+    sValuePtr->fontPtr = textPtr->fontPtr;
+
+    /*
+     * Scan through all of the tags, updating the StyleValues to hold
+     * the highest-priority information.
+     */
+
+    for ( ; numTags > 0; tagPtrPtr++, numTags--) {
+       tagPtr = *tagPtrPtr;
+       if ((tagPtr->border != NULL) && (tagPtr->priority > borderPrio)) {
+           sValuePtr->border = tagPtr->border;
+           sValuePtr->borderWidth = tagPtr->borderWidth;
+           sValuePtr->relief = tagPtr->relief;
+           borderPrio = tagPtr->priority;
+       }
+       if ((tagPtr->bgStipple != None)
+               && (tagPtr->priority > bgStipplePrio)) {
+           sValuePtr->bgStipple = tagPtr->bgStipple;
+           bgStipplePrio = tagPtr->priority;
+       }
+       if ((tagPtr->fgColor != None) && (tagPtr->priority > fgPrio)) {
+           sValuePtr->fgColor = tagPtr->fgColor;
+           fgPrio = tagPtr->priority;
+       }
+       if ((tagPtr->fontPtr != None) && (tagPtr->priority > fontPrio)) {
+           sValuePtr->fontPtr = tagPtr->fontPtr;
+           fontPrio = tagPtr->priority;
+       }
+       if ((tagPtr->fgStipple != None)
+               && (tagPtr->priority > fgStipplePrio)) {
+           sValuePtr->fgStipple = tagPtr->fgStipple;
+           fgStipplePrio = tagPtr->priority;
+       }
+       if (tagPtr->underline) {
+           sValuePtr->underline = 1;
+       }
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * LayoutLine --
+ *
+ *     This procedure generates a linked list of one or more DLine
+ *     structures, which describe how to display everything in one
+ *     line of the text.
+ *
+ * Results:
+ *     The return value is a pointer to one or more DLine structures
+ *     linked into a linked list.  The structures are completely filled
+ *     in except for the y field, which the caller must supply.  Also,
+ *     the information at *tInfoPtr gets updated to refer to the state
+ *     just after the last character of the line.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static DLine *
+LayoutLine(textPtr, line, linePtr, tInfoPtr)
+    TkText *textPtr;           /* Overall information about text widget. */
+    int line;                  /* Index of line to layout. */
+    TkTextLine *linePtr;       /* Line to layout (corresponds to line). */
+    TagInfo *tInfoPtr;         /* Information to help keep track of tags.
+                                * Caller must have initialized to correspond
+                                * to state just before start of line. */
+{
+    DLine *firstLinePtr;
+    DLine *lastLinePtr = NULL; /* Initializations needed only to stop */
+    Chunk *lastChunkPtr = NULL;        /* compiler warnings. */
+    register DLine *dlPtr;
+    register Chunk *chunkPtr;
+    StyleValues styleValues;
+    int ch, charsThatFit, ascent, descent, x, maxX;
+
+    firstLinePtr = NULL;
+
+    /*
+     * Each iteration of the loop below creates one DLine structure.
+     */
+
+    ch = 0;
+    while (1) {
+
+       /*
+        * Create and initialize a new DLine structure.
+        */
+
+       dlPtr = (DLine *) ckalloc(sizeof(DLine));
+       dlPtr->linePtr = linePtr;
+       dlPtr->y = 0;
+       dlPtr->oldY = -1;
+       dlPtr->chunkPtr = NULL;
+       dlPtr->nextPtr = NULL;
+       if (firstLinePtr == NULL) {
+           firstLinePtr = dlPtr;
+       } else {
+           lastLinePtr->nextPtr = dlPtr;
+       }
+       lastLinePtr = dlPtr;
+
+       /*
+        * Each iteration of the loop below creates one Chunk for the
+        * new display line.
+        */
+
+       x = textPtr->dInfoPtr->x;
+       maxX = textPtr->dInfoPtr->maxX;
+       ascent = descent = 0;
+       while (x < maxX) {
+           chunkPtr = (Chunk *) ckalloc(sizeof(Chunk));
+           chunkPtr->numChars = linePtr->numBytes - ch;
+           chunkPtr->text = linePtr->bytes + ch;
+           chunkPtr->x = x;
+           chunkPtr->nextPtr = NULL;
+           if (dlPtr->chunkPtr == NULL) {
+               dlPtr->chunkPtr = chunkPtr;
+           } else {
+               lastChunkPtr->nextPtr = chunkPtr;
+           }
+           lastChunkPtr = chunkPtr;
+
+           /*
+            * Update the tag array to include any tag transitions up
+            * through the current position, then find the next position
+            * with a transition on a tag that impacts the way things are
+            * displayed.
+            */
+
+           while (1) {
+               int affectsDisplay;
+               TkTextTag *tagPtr;
+
+               if ((tInfoPtr->search.linePtr == NULL)
+                       || (tInfoPtr->search.line1 > line)) {
+                   break;
+               }
+               tagPtr = tInfoPtr->search.tagPtr;
+               affectsDisplay = TK_TAG_AFFECTS_DISPLAY(tagPtr);
+               if ((tInfoPtr->search.line1 < line)
+                       || (tInfoPtr->search.ch1 <= ch)) {
+                   if (affectsDisplay) {
+                       ToggleTag(tInfoPtr, tagPtr);
+                   }
+               } else {
+                   if (affectsDisplay) {
+                       chunkPtr->numChars = tInfoPtr->search.ch1 - ch;
+                       break;
+                   }
+               }
+               (void) TkBTreeNextTag(&tInfoPtr->search);
+           }
+
+           /*
+            * Create style information for this chunk.
+            */
+
+           ComputeStyleValues(textPtr, tInfoPtr->numTags, tInfoPtr->tagPtrs,
+                   &styleValues);
+           chunkPtr->stylePtr = GetStyle(textPtr, &styleValues);
+
+           /*
+            * See how many characters will fit on the line.  If they don't
+            * all fit, then a number of compensations may have to be made.
+            *
+            * 1. Make sure that at least one character is displayed on
+            *    each line.
+            * 2. In wrap mode "none", allow a partial character to be
+            *    displayed at the end of an incomplete line.
+            * 3. In wrap mode "word", search back to find the last space
+            *    character, and terminate the line just after that space
+            *    character.  This involves a couple of extra complexities:
+            *        - the last space may be several chunks back;  in this
+            *          case, delete all the chunks that are after the
+            *          space.
+            *        - if no words fit at all, then use character-wrap for
+            *          this DLine.
+            *        - have to reinitialize the tag search information, since
+            *          we may back up over tag toggles (they'll need to be
+            *          reconsidered on the next DLine).
+            */
+
+           charsThatFit = TkMeasureChars(styleValues.fontPtr,
+                   chunkPtr->text, chunkPtr->numChars, chunkPtr->x,
+                   maxX, 0, &x);
+           if ((charsThatFit < chunkPtr->numChars) || (x >= maxX)) {
+               x = maxX;
+               chunkPtr->numChars = charsThatFit;
+               ch += charsThatFit;
+               if (ch < (linePtr->numBytes - 1)) {
+                   if ((charsThatFit == 0) && (chunkPtr == dlPtr->chunkPtr)) {
+                       chunkPtr->numChars = 1;
+                       ch++;
+                   } else if (textPtr->wrapMode == tkTextWordUid) {
+                       if (isspace(chunkPtr->text[charsThatFit])) {
+                           ch += 1;    /* Include space on this line. */
+                       } else {
+                           register Chunk *chunkPtr2;
+                           register char *p;
+                           Chunk *spaceChunkPtr;
+                           int count, space;
+
+                           spaceChunkPtr = NULL;
+                           space = 0;
+                           for (chunkPtr2 = dlPtr->chunkPtr;
+                                   chunkPtr2 != NULL;
+                                   chunkPtr2 = chunkPtr2->nextPtr) {
+                               for (count = chunkPtr2->numChars - 1,
+                                       p = chunkPtr2->text + count;
+                                       count >= 0; count--, p--) {
+                                   if (isspace(*p)) {
+                                       spaceChunkPtr = chunkPtr2;
+                                       space = count;
+                                       break;
+                                   }
+                               }
+                           }
+                           if (spaceChunkPtr != NULL) {
+                               spaceChunkPtr->numChars = space;
+                               ch = (spaceChunkPtr->text + space + 1)
+                                       - linePtr->bytes;
+                               if (chunkPtr != spaceChunkPtr) {
+                                   chunkPtr = spaceChunkPtr;
+                                   if (tInfoPtr->tagPtrs != NULL) {
+                                       ckfree((char *) tInfoPtr->tagPtrs);
+                                   }
+                                   tInfoPtr->tagPtrs = TkBTreeGetTags(
+                                           textPtr->tree, dlPtr->linePtr, ch,
+                                           &tInfoPtr->numTags);
+                                   TkBTreeStartSearch(textPtr->tree, line,
+                                           ch+1,
+                                           TkBTreeNumLines(textPtr->tree), 0,
+                                           (TkTextTag *) NULL,
+                                           &tInfoPtr->search);
+                                   (void) TkBTreeNextTag(&tInfoPtr->search);
+                                   tInfoPtr->arraySize = tInfoPtr->numTags;
+                                   while (chunkPtr->nextPtr != NULL) {
+                                       chunkPtr2 = chunkPtr->nextPtr;
+                                       chunkPtr->nextPtr = chunkPtr2->nextPtr;
+                                       FreeStyle(chunkPtr2->stylePtr);
+                                       ckfree((char *) chunkPtr2);
+                                   }
+                               }
+                           }
+                       }
+                   } else if (textPtr->wrapMode == tkTextNoneUid) {
+                       chunkPtr->numChars++;
+                       ch++;
+                   }
+               }
+           } else {
+               ch += chunkPtr->numChars;
+           }
+
+           /*
+            * Update height information for use later in computing
+            * line's overall height and baseline.
+            */
+
+           if (styleValues.fontPtr->ascent > ascent) {
+               ascent = styleValues.fontPtr->ascent;
+           }
+           if (styleValues.fontPtr->descent > descent) {
+               descent = styleValues.fontPtr->descent;
+           }
+       }
+
+       dlPtr->height = ascent + descent;
+       dlPtr->baseline = ascent;
+
+       /*
+        * Quit when every character but the last character (the newline)
+        * has been accounted for.  Also quit if the wrap mode is "none":
+        * this ignores all the characters that don't fit on the first
+        * line.
+        */
+
+       if ((ch >= (linePtr->numBytes-1))
+               || (textPtr->wrapMode == tkTextNoneUid)) {
+           break;
+       }
+    }
+    return firstLinePtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ToggleTag --
+ *
+ *     Update information about tags to reflect a transition on a
+ *     particular tag.
+ *
+ * Results:
+ *     The array at *tInfoPtr is modified to include tagPtr if it
+ *     didn't already or to exclude it if it used to include it.
+ *     The array will be reallocated to a larger size if needed.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ToggleTag(tInfoPtr, tagPtr)
+    register TagInfo *tInfoPtr;                /* Tag information to be updated. */
+    TkTextTag *tagPtr;                 /* Tag to be toggled into or out of
+                                        * *tInfoPtr. */
+{
+    register TkTextTag **tagPtrPtr;
+    int i;
+
+    for (i = tInfoPtr->numTags, tagPtrPtr = tInfoPtr->tagPtrs;
+           i > 0; i--, tagPtrPtr++) {
+       if (*tagPtrPtr == tagPtr) {
+           tInfoPtr->numTags--;
+           *tagPtrPtr = tInfoPtr->tagPtrs[tInfoPtr->numTags];
+           return;
+       }
+    }
+
+    /*
+     * Tag not currently in array.  Grow the array if necessary, then
+     * add the tag to it.
+     */
+
+    if (tInfoPtr->numTags == tInfoPtr->arraySize) {
+       TkTextTag **newPtrs;
+
+       newPtrs = (TkTextTag **) ckalloc((unsigned)
+               ((tInfoPtr->arraySize+10) * sizeof(TkTextTag *)));
+       if (tInfoPtr->tagPtrs != NULL) {
+           memcpy((VOID *) newPtrs, (VOID *) tInfoPtr->tagPtrs,
+                   tInfoPtr->arraySize * sizeof(TkTextTag *));
+           ckfree((char *) tInfoPtr->tagPtrs);
+       }
+       tInfoPtr->tagPtrs = newPtrs;
+       tInfoPtr->arraySize += 10;
+    }
+    tInfoPtr->tagPtrs[tInfoPtr->numTags] = tagPtr;
+    tInfoPtr->numTags++;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * UpdateDisplayInfo --
+ *
+ *     This procedure is invoked to recompute some or all of the
+ *     DLine structures for a text widget.  At the time it is called
+ *     the DLine structures still left in the widget are guaranteed
+ *     to be correct (except for their y-coordinates), but there may
+ *     be missing structures (the DLine structures get removed as
+ *     soon as they are potentially out-of-date).
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Upon return, the DLine information for textPtr correctly reflects
+ *     the positions where characters will be displayed.  However, this
+ *     procedure doesn't actually bring the display up-to-date.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+UpdateDisplayInfo(textPtr)
+    TkText *textPtr;           /* Text widget to update. */
+{
+    register DInfo *dInfoPtr = textPtr->dInfoPtr;
+    register DLine *dlPtr, *prevPtr, *dlPtr2;
+    TkTextLine *linePtr;
+    TagInfo tagInfo;
+    int line, y, maxY;
+
+    if (!(dInfoPtr->flags & DINFO_OUT_OF_DATE)) {
+       return;
+    }
+    dInfoPtr->flags &= ~DINFO_OUT_OF_DATE;
+
+    linePtr = textPtr->topLinePtr;
+    dlPtr = dInfoPtr->dLinePtr;
+    tagInfo.tagPtrs = TkBTreeGetTags(textPtr->tree, linePtr, 0,
+           &tagInfo.numTags);
+    tagInfo.arraySize = tagInfo.numTags;
+
+    /*
+     * Tricky point:  initialize the tag search just *after* the first
+     * character in the line, since the tagInfo structure already has all
+     * the tags for the first character.
+     */
+
+    line = TkBTreeLineIndex(linePtr);
+    TkBTreeStartSearch(textPtr->tree, line, 1, TkBTreeNumLines(textPtr->tree),
+           0, (TkTextTag *) NULL, &tagInfo.search);
+    TkBTreeNextTag(&tagInfo.search);
+    prevPtr = NULL;
+    y = dInfoPtr->y;
+    maxY = dInfoPtr->maxY;
+    while ((linePtr != NULL) && (y < maxY)) {
+       register DLine *newPtr;
+       /*
+        * See if the next DLine matches the next line we want to
+        * appear on the screen.  If so then we can just use its
+        * information.  If not then create new DLine structures
+        * for the desired line and insert them into the list.
+        */
+
+       if ((dlPtr == NULL) || (dlPtr->linePtr != linePtr)) {
+           newPtr = LayoutLine(textPtr, line, linePtr, &tagInfo);
+           if (prevPtr == NULL) {
+               dInfoPtr->dLinePtr = newPtr;
+           } else {
+               prevPtr->nextPtr = newPtr;
+           }
+           for (dlPtr2 = newPtr; dlPtr2->nextPtr != NULL;
+                   dlPtr2 = dlPtr2->nextPtr) {
+               /* Empty loop body. */
+           }
+           dlPtr2->nextPtr = dlPtr;
+           dlPtr = newPtr;
+       }
+
+       /*
+        * Skip to the next line, and update the y-position while
+        * skipping.
+        */
+
+       do {
+           dlPtr->y = y;
+           y += dlPtr->height;
+           prevPtr = dlPtr;
+           dlPtr = dlPtr->nextPtr;
+       } while ((dlPtr != NULL) && (dlPtr->linePtr == linePtr));
+       linePtr = TkBTreeNextLine(linePtr);
+       line++;
+    }
+
+    /*
+     * Delete any DLine structures that don't fit on the screen and free
+     * up the tag array.
+     */
+
+    FreeDLines(textPtr, dlPtr, (DLine *) NULL, 1);
+    if (tagInfo.tagPtrs != NULL) {
+       ckfree((char *) tagInfo.tagPtrs);
+    }
+
+    /*
+     * Update the vertical scrollbar, if there is one.
+     */
+
+    if (textPtr->yScrollCmd != NULL) {
+       int numLines, first, result, maxY, height;
+       char string[60];
+
+       /*
+        * Count the number of text lines on the screen.
+        */
+
+       maxY = 0;
+       for (numLines = 0, linePtr = NULL, dlPtr = dInfoPtr->dLinePtr;
+               dlPtr != NULL; dlPtr = dlPtr->nextPtr) {
+           if (dlPtr->linePtr != linePtr) {
+               numLines++;
+               linePtr = dlPtr->linePtr;
+           }
+           maxY = dlPtr->y + dlPtr->height;
+       }
+
+       /*
+        * If the screen isn't completely full, then estimate the number of
+        * lines that would fit on it if it were full.
+        */
+
+       height = dInfoPtr->maxY - dInfoPtr->y;
+       if (numLines == 0) {
+           numLines = height /
+                   (textPtr->fontPtr->ascent + textPtr->fontPtr->descent);
+       } else if (maxY < height) {
+           numLines = (numLines * height)/maxY;
+       }
+        /* DEH: be reasonable if dLinePtr is null */
+       if (dInfoPtr->dLinePtr == NULL) {
+         sprintf(string, " 0 0 0 0");
+       } else {
+         first = TkBTreeLineIndex(dInfoPtr->dLinePtr->linePtr);
+         sprintf(string, " %d %d %d %d", TkBTreeNumLines(textPtr->tree),
+                 numLines, first, first+numLines-1);
+       }
+       result = Tcl_VarEval(textPtr->interp, textPtr->yScrollCmd, string,
+               (char *) NULL);
+       if (result != TCL_OK) {
+           TkBindError(textPtr->interp);
+       }
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * FreeDLines --
+ *
+ *     This procedure is called to free up all of the resources
+ *     associated with one or more DLine structures.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Memory gets freed and various other resources are released.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+FreeDLines(textPtr, firstPtr, lastPtr, unlink)
+    TkText *textPtr;                   /* Information about overall text
+                                        * widget. */
+    register DLine *firstPtr;          /* Pointer to first DLine to free up. */
+    DLine *lastPtr;                    /* Pointer to DLine just after last
+                                        * one to free (NULL means everything
+                                        * starting with firstPtr). */
+    int unlink;                                /* 1 means DLines are currently linked
+                                        * into the list rooted at
+                                        * textPtr->dInfoPtr->dLinePtr and
+                                        * they have to be unlinked.  0 means
+                                        * just free without unlinking. */
+{
+    register Chunk *chunkPtr, *nextChunkPtr;
+    register DLine *nextDLinePtr;
+
+    if (unlink) {
+       if (textPtr->dInfoPtr->dLinePtr == firstPtr) {
+           textPtr->dInfoPtr->dLinePtr = lastPtr;
+       } else {
+           register DLine *prevPtr;
+           for (prevPtr = textPtr->dInfoPtr->dLinePtr;
+                   prevPtr->nextPtr != firstPtr; prevPtr = prevPtr->nextPtr) {
+               /* Empty loop body. */
+           }
+           prevPtr->nextPtr = lastPtr;
+       }
+    }
+    while (firstPtr != lastPtr) {
+       nextDLinePtr = firstPtr->nextPtr;
+       for (chunkPtr = firstPtr->chunkPtr; chunkPtr != NULL;
+               chunkPtr = nextChunkPtr) {
+           FreeStyle(chunkPtr->stylePtr);
+           nextChunkPtr = chunkPtr->nextPtr;
+           ckfree((char *) chunkPtr);
+       }
+       ckfree((char *) firstPtr);
+       firstPtr = nextDLinePtr;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DisplayDLine --
+ *
+ *     This procedure is invoked to draw a single line on the
+ *     screen.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The line given by dlPtr is drawn at its correct position in
+ *     textPtr's window.  Note that this is one *display* line, not
+ *     one *text* line.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DisplayDLine(textPtr, dlPtr, pixmap)
+    TkText *textPtr;           /* Text widget in which to draw line. */
+    register DLine *dlPtr;     /* Information about line to draw. */
+    Pixmap pixmap;             /* Pixmap to use for double-buffering.
+                                * Caller must make sure it's large enough
+                                * to hold line. */
+{
+    register Style *stylePtr;
+    register StyleValues *sValuePtr;
+    register Chunk *chunkPtr;
+    DInfo *dInfoPtr = textPtr->dInfoPtr;
+    Display *display;
+    int width, height, count, x;
+    XFontStruct *fontPtr;
+
+    /*
+     * First, clear the area of the line to the background color for the
+     * text widget.
+     */
+
+    display = Tk_Display(textPtr->tkwin);
+    Tk_Fill3DRectangle(display, pixmap, textPtr->border, 0, 0,
+           Tk_Width(textPtr->tkwin), dlPtr->height, 0, TK_RELIEF_FLAT);
+
+    /*
+     * Next, cycle through all of the chunks in the line displaying
+     * backgrounds.  We need to do two passes, one for the backgrounds
+     * and one for the characters, because some characters (e.g. italics
+     * with heavy slants) may cross background boundaries.  If some
+     * backgrounds are drawn after some text, the later backgrounds may
+     * obliterate parts of earlier characters.
+     */
+
+    for (chunkPtr = dlPtr->chunkPtr; chunkPtr != NULL;
+           chunkPtr = chunkPtr->nextPtr) {
+
+       /*
+        * Draw a special background for this chunk if one is specified
+        * in its style.  Two tricks here:
+        * 1. if this is the last chunk in the line then extend the
+        *    background across to the end of the line.
+        * 2. if the background is stippled, then we have to draw the
+        *    stippled part specially, since Tk_Fill3DRectangle doesn't
+        *    do stipples.
+        */
+
+       stylePtr = chunkPtr->stylePtr;
+       sValuePtr = stylePtr->sValuePtr;
+       if (sValuePtr->border != NULL) {
+           if (chunkPtr->nextPtr != NULL) {
+               width = chunkPtr->nextPtr->x - chunkPtr->x;
+           } else {
+               width = Tk_Width(textPtr->tkwin) - chunkPtr->x;
+           }
+           if (stylePtr->bgGC != NULL) {
+               XFillRectangle(display, pixmap, stylePtr->bgGC, chunkPtr->x,
+                       0, (unsigned int) width, (unsigned int) dlPtr->height);
+               Tk_Draw3DRectangle(display, pixmap, sValuePtr->border,
+                       chunkPtr->x, 0, width, dlPtr->height,
+                       sValuePtr->borderWidth, sValuePtr->relief);
+           } else {
+               Tk_Fill3DRectangle(display, pixmap, sValuePtr->border,
+                       chunkPtr->x, 0, width, dlPtr->height,
+                       sValuePtr->borderWidth, sValuePtr->relief);
+           }
+       }
+    }
+
+    /*
+     * If the insertion cursor is displayed on this line, then draw it
+     * now, on top of the background but before the text.  As a special
+     * workaround to keep the cursor visible on mono displays, write the default
+     * background in the cursor area (instead of nothing) when the cursor
+     * isn't on.  Otherwise the selection would hide the cursor.
+     */
+
+    if ((textPtr->insertAnnotPtr->linePtr == dlPtr->linePtr)
+           && (textPtr->state == tkTextNormalUid)
+           && (textPtr->flags & GOT_FOCUS)) {
+       for (chunkPtr = dlPtr->chunkPtr; chunkPtr != NULL;
+               chunkPtr = chunkPtr->nextPtr) {
+           count = textPtr->insertAnnotPtr->ch
+                   - (chunkPtr->text - dlPtr->linePtr->bytes);
+           if (count < 0) {
+               break;
+           }
+           if (count > chunkPtr->numChars) {
+               continue;
+           }
+
+           /*
+            * Deciding whether to display the cursor just after the last
+            * character in a line is tricky because of various wrap
+            * modes.  Do it unless we're in character wrap mode and
+            * this line wraps, in which case it's better to display the
+            * cursor on the next line.  For word wrap, there's an
+            * undisplayed space character that the user must be able to
+            * position the cursor in front of.  For no wrap, there's no
+            * next line on which to display the cursor.
+            */
+           if ((count == chunkPtr->numChars)
+                   && (textPtr->wrapMode == tkTextCharUid)
+                   && (chunkPtr->text[count] != '\n')) {
+               continue;
+           }
+           fontPtr = chunkPtr->stylePtr->sValuePtr->fontPtr;
+           TkMeasureChars(fontPtr, chunkPtr->text, count, chunkPtr->x,
+                   (int) 1000000, 0, &x);
+           if (textPtr->flags & INSERT_ON) {
+               Tk_Fill3DRectangle(display, pixmap, textPtr->insertBorder,
+                       x - textPtr->insertWidth/2,
+                       dlPtr->baseline - fontPtr->ascent,
+                       textPtr->insertWidth,
+                       fontPtr->ascent + fontPtr->descent,
+                       textPtr->insertBorderWidth, TK_RELIEF_RAISED);
+           } else if (Tk_DefaultDepth(Tk_Screen(textPtr->tkwin)) == 1) {
+               Tk_Fill3DRectangle(display, pixmap, textPtr->border,
+                       x - textPtr->insertWidth/2,
+                       dlPtr->baseline - fontPtr->ascent,
+                       textPtr->insertWidth,
+                       fontPtr->ascent + fontPtr->descent,
+                       0, TK_RELIEF_FLAT);
+           }
+
+       }
+    }
+
+    /*
+     * Make another pass through all of the chunks to redraw all of
+     * the text (and underlines, etc., if they're wanted).
+     */
+
+    for (chunkPtr = dlPtr->chunkPtr; chunkPtr != NULL;
+           chunkPtr = chunkPtr->nextPtr) {
+       stylePtr = chunkPtr->stylePtr;
+       sValuePtr = stylePtr->sValuePtr;
+       if (chunkPtr->numChars > 0) {
+           TkDisplayChars(display, pixmap, stylePtr->fgGC, sValuePtr->fontPtr,
+                   chunkPtr->text, chunkPtr->numChars, chunkPtr->x,
+                   dlPtr->baseline, 0);
+           if (sValuePtr->underline) {
+               TkUnderlineChars(display, pixmap, stylePtr->fgGC,
+                       sValuePtr->fontPtr, chunkPtr->text, chunkPtr->x,
+                       dlPtr->baseline, 0, 0, chunkPtr->numChars-1);
+           }
+       }
+    }
+
+    /*
+     * Copy the pixmap onto the screen.  If this is the last line on
+     * the screen, only copy a piece of the line, so that it doesn't
+     * overflow into the border area.  Another special trick:  copy the
+     * padding area to the left of the line;  this is because the
+     * insertion cursor sometimes overflows onto that area and we want
+     * to get as much of the cursor as possible.
+     */
+
+    height = dlPtr->height;
+    if ((height + dlPtr->y) > dInfoPtr->maxY) {
+       height = dInfoPtr->maxY - dlPtr->y;
+    }
+    XCopyArea(display, pixmap, Tk_WindowId(textPtr->tkwin),
+           dInfoPtr->copyGC, dInfoPtr->x - textPtr->padX, 0,
+           dInfoPtr->maxX - (dInfoPtr->x - textPtr->padX),
+           height, dInfoPtr->x - textPtr->padX, dlPtr->y);
+    linesRedrawn++;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DisplayText --
+ *
+ *     This procedure is invoked as a when-idle handler to update the
+ *     display.  It only redisplays the parts of the text widget that
+ *     are out of date.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information is redrawn on the screen.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DisplayText(clientData)
+    ClientData clientData;     /* Information about widget. */
+{
+    register TkText *textPtr = (TkText *) clientData;
+    DInfo *dInfoPtr = textPtr->dInfoPtr;
+    Tk_Window tkwin;
+    register DLine *dlPtr;
+    Pixmap pixmap;
+    int maxHeight;
+    int bottomY = 0;           /* Initialization needed only to stop
+                                * compiler warnings. */
+
+    assert(textPtr->updateTimerToken != NULL);
+    
+    textPtr->updateTimerToken = 0;
+
+    if ((textPtr->tkwin == NULL) || !Tk_IsMapped(textPtr->tkwin)
+           || (dInfoPtr->maxX <= dInfoPtr->x)
+           || (dInfoPtr->maxY <= dInfoPtr->y)) {
+       goto done;
+    }
+    numRedisplays++;
+
+    /*
+     * Choose a new current item if that is needed (this could cause
+     * event handlers to be invoked, hence the preserve/release calls
+     * and the loop, since the handlers could conceivably necessitate
+     * yet another current item calculation).  The tkwin check is because
+     * the whole window could go away in the Tk_Release call.
+     */
+
+    while (dInfoPtr->flags & REPICK_NEEDED) {
+       Tk_Preserve((ClientData) textPtr);
+       dInfoPtr->flags &= ~REPICK_NEEDED;
+       TkTextPickCurrent(textPtr, &textPtr->pickEvent);
+       tkwin = textPtr->tkwin;
+       Tk_Release((ClientData) textPtr);
+       if (tkwin == NULL) {
+           return;
+       }
+    }
+
+    /*
+     * First recompute what's supposed to be displayed.
+     */
+
+    UpdateDisplayInfo(textPtr);
+
+    /*
+     * Redraw the borders if that's needed.
+     */
+
+    if (dInfoPtr->flags & REDRAW_BORDERS) {
+       Tk_Draw3DRectangle(Tk_Display(textPtr->tkwin),
+               Tk_WindowId(textPtr->tkwin), textPtr->border,
+               0, 0, Tk_Width(textPtr->tkwin), Tk_Height(textPtr->tkwin),
+               textPtr->borderWidth, textPtr->relief);
+    }
+
+    /*
+     * See if it's possible to bring some parts of the screen up-to-date
+     * by scrolling (copying from other parts of the screen).
+     */
+
+    for (dlPtr = dInfoPtr->dLinePtr; dlPtr != NULL; dlPtr = dlPtr->nextPtr) {
+       register DLine *dlPtr2;
+       int offset, height;
+
+       if ((dlPtr->oldY == -1) || (dlPtr->y == dlPtr->oldY)
+               || ((dlPtr->oldY + dlPtr->height) > dInfoPtr->maxY)) {
+           continue;
+       }
+
+       /*
+        * This line is already drawn somewhere in the window so it only
+        * needs to be copied to its new location.  See if there's a group
+        * of lines that can all be copied together.
+        */
+
+       offset = dlPtr->y - dlPtr->oldY;
+       height = dlPtr->height;
+       for (dlPtr2 = dlPtr->nextPtr; dlPtr2 != NULL;
+               dlPtr2 = dlPtr2->nextPtr) {
+           if ((dlPtr2->oldY == -1)
+                   || ((dlPtr2->oldY + offset) != dlPtr2->y)
+                   || ((dlPtr2->oldY + dlPtr2->height) > dInfoPtr->maxY)) {
+               break;
+           }
+           height += dlPtr2->height;
+       }
+
+       /*
+        * Copy the information and update the lines to show that they've
+        * been copied.  Reduce the height of the area being copied if
+        * necessary to avoid overwriting the border area.
+        */
+
+       if ((dlPtr->y + height) > dInfoPtr->maxY) {
+           height = dInfoPtr->maxY - dlPtr->y;
+       }
+       XCopyArea(Tk_Display(textPtr->tkwin), Tk_WindowId(textPtr->tkwin),
+               Tk_WindowId(textPtr->tkwin), dInfoPtr->scrollGC,
+               dInfoPtr->x - textPtr->padX, dlPtr->oldY,
+               dInfoPtr->maxX - (dInfoPtr->x - textPtr->padX),
+               height, dInfoPtr->x - textPtr->padX, dlPtr->y);
+       numCopies++;
+       while (1) {
+           dlPtr->oldY = dlPtr->y;
+           if (dlPtr->nextPtr == dlPtr2) {
+               break;
+           }
+           dlPtr = dlPtr->nextPtr;
+       }
+
+       /*
+        * It's possible that part of the area copied above was obscured.
+        * To handle this situation, read expose-related events generated
+        * during the XCopyArea operation.
+        */
+
+       while (1) {
+           XEvent event;
+
+           XWindowEvent(Tk_Display(textPtr->tkwin),
+                   Tk_WindowId(textPtr->tkwin), ExposureMask, &event);
+           if (event.type == NoExpose) {
+               break;
+           } else if (event.type == GraphicsExpose) {
+               TkTextRedrawRegion(textPtr, event.xgraphicsexpose.x,
+                       event.xgraphicsexpose.y, event.xgraphicsexpose.width,
+                       event.xgraphicsexpose.height);
+               if (event.xgraphicsexpose.count == 0) {
+                   damagedCopies++;
+                   break;
+               }
+           } else if (event.type == Expose) {
+               /*
+                * A tricky situation.  This event must already have been
+                * queued up before the XCopyArea was issued.  If the area
+                * in this event overlaps the area copied, then some of the
+                * bits that were copied were bogus.  The easiest way to
+                * handle this is to issue two redisplays:  one for the
+                * original area and one for the area shifted as if it was
+                * in the copied area.
+                */
+
+               TkTextRedrawRegion(textPtr, event.xexpose.x,
+                       event.xexpose.y, event.xexpose.width,
+                       event.xexpose.height);
+               TkTextRedrawRegion(textPtr, event.xexpose.x,
+                       event.xexpose.y + offset, event.xexpose.width,
+                       event.xexpose.height);
+           } else {
+               panic("DisplayText received unknown exposure event");
+           }
+       }
+    }
+
+    /*
+     * Now we have to redraw the lines that couldn't be updated by
+     * scrolling.  First, compute the height of the largest line and
+     * allocate an off-screen pixmap to use for double-buffered
+     * displays.
+     */
+
+    maxHeight = -1;
+    for (dlPtr = textPtr->dInfoPtr->dLinePtr; dlPtr != NULL;
+           dlPtr = dlPtr->nextPtr) {
+       if ((dlPtr->height > maxHeight) && (dlPtr->oldY != dlPtr->y)) {
+           maxHeight = dlPtr->height;
+       }
+       bottomY = dlPtr->y + dlPtr->height;
+    }
+    if (maxHeight >= 0) {
+       pixmap = XCreatePixmap(Tk_Display(textPtr->tkwin),
+               Tk_WindowId(textPtr->tkwin), Tk_Width(textPtr->tkwin),
+               maxHeight, Tk_DefaultDepth(Tk_Screen(textPtr->tkwin)));
+       for (dlPtr = textPtr->dInfoPtr->dLinePtr; dlPtr != NULL;
+               dlPtr = dlPtr->nextPtr) {
+           if (dlPtr->oldY != dlPtr->y) {
+               DisplayDLine(textPtr, dlPtr, pixmap);
+               dlPtr->oldY = dlPtr->y;
+           }
+       }
+       XFreePixmap(Tk_Display(textPtr->tkwin), pixmap);
+    }
+
+    /*
+     * Lastly, see if we need to refresh the part of the window below
+     * the last line of text (if there is any such area).
+     */
+
+    if (dInfoPtr->topOfEof > dInfoPtr->maxY) {
+       dInfoPtr->topOfEof = dInfoPtr->maxY;
+    }
+    if (bottomY < dInfoPtr->topOfEof) {
+       Tk_Fill3DRectangle(Tk_Display(textPtr->tkwin),
+               Tk_WindowId(textPtr->tkwin), textPtr->border,
+               dInfoPtr->x, bottomY, dInfoPtr->maxX - dInfoPtr->x,
+               dInfoPtr->topOfEof-bottomY, 0, TK_RELIEF_FLAT);
+    }
+    dInfoPtr->topOfEof = bottomY;
+    if (dInfoPtr->topOfEof > dInfoPtr->maxY) {
+       dInfoPtr->topOfEof = dInfoPtr->maxY;
+    }
+
+    done:
+    dInfoPtr->flags &= ~(REDRAW_PENDING|REDRAW_BORDERS);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextRedrawRegion --
+ *
+ *     This procedure is invoked to schedule a redisplay for a given
+ *     region of a text widget.  The redisplay itself may not occur
+ *     immediately:  it's scheduled as a when-idle handler.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information will eventually be redrawn on the screen.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+void
+TkTextRedrawRegion(textPtr, x, y, width, height)
+    TkText *textPtr;           /* Widget record for text widget. */
+    int x, y;                  /* Coordinates of upper-left corner of area
+                                * to be redrawn, in pixels relative to
+                                * textPtr's window. */
+    int width, height;         /* Width and height of area to be redrawn. */
+{
+    register DLine *dlPtr;
+    DInfo *dInfoPtr = textPtr->dInfoPtr;
+    int maxY;
+
+    /*
+     * Find all lines that overlap the given region and mark them for
+     * redisplay.
+     */
+
+    maxY = y + height;
+    for (dlPtr = dInfoPtr->dLinePtr; dlPtr != NULL;
+           dlPtr = dlPtr->nextPtr) {
+       if (((dlPtr->y + dlPtr->height) > y) && (dlPtr->y < maxY)) {
+           dlPtr->oldY = -1;
+       }
+    }
+    if (dInfoPtr->topOfEof < maxY) {
+       dInfoPtr->topOfEof = maxY;
+    }
+
+    /*
+     * Schedule the redisplay operation if there isn't one already
+     * scheduled.
+     */
+
+    if (!(dInfoPtr->flags & REDRAW_PENDING)) {
+       dInfoPtr->flags |= REDRAW_PENDING;
+//     Tk_DoWhenIdle(DisplayText, (ClientData) textPtr);
+       assert(textPtr->updateTimerToken == NULL);
+       if (textPtr->updateTimerToken == NULL) {
+           textPtr->updateTimerToken =
+             Tk_CreateTimerHandler(
+               TextUpdateTime,
+               DisplayText,
+               (ClientData) textPtr);
+       }
+    }
+    if ((x < dInfoPtr->x) || (y < dInfoPtr->y)
+           || ((x + width) > dInfoPtr->maxX) || (maxY > dInfoPtr->maxY)) {
+       dInfoPtr->flags |= REDRAW_BORDERS;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextLinesChanged --
+ *
+ *     This procedure is invoked when lines in a text widget are about
+ *     to be modified in a way that changes how they are displayed (e.g.
+ *     characters were inserted, the line was deleted, or tag information
+ *     was changed).  This procedure must be called *before* a change is
+ *     made, so that pointers to TkTextLines in the display information
+ *     are still valid.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The indicated lines will be redisplayed at some point in the
+ *     future (the actual redisplay is scheduled as a when-idle handler).
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkTextLinesChanged(textPtr, first, last)
+    TkText *textPtr;           /* Widget record for text widget. */
+    int first;                 /* Index of first line that must be
+                                * redisplayed. */
+    int last;                  /* Index of last line to redisplay. */
+{
+    DInfo *dInfoPtr = textPtr->dInfoPtr;
+    DLine *firstPtr, *lastPtr;
+
+    /*
+     * Find the DLines corresponding to first and last+1.
+     */
+
+    firstPtr = FindDLine(dInfoPtr->dLinePtr, first);
+    if (firstPtr == NULL) {
+       return;
+    }
+    lastPtr = FindDLine(dInfoPtr->dLinePtr, last+1);
+    if (firstPtr == lastPtr) {
+       return;
+    }
+
+    /*
+     * Delete all the DLines from first up through last (but not including
+     * lastPtr, which points to the first line *outside* the range).
+     */
+
+    FreeDLines(textPtr, firstPtr, lastPtr, 1);
+
+    /*
+     * Schedule both a redisplay and a recomputation of display information.
+     */
+
+    if (!(dInfoPtr->flags & REDRAW_PENDING)) {
+//     Tk_DoWhenIdle(DisplayText, (ClientData) textPtr);
+        assert(textPtr->updateTimerToken == NULL);
+       if (textPtr->updateTimerToken == NULL) {
+           textPtr->updateTimerToken =
+             Tk_CreateTimerHandler(
+               TextUpdateTime,
+               DisplayText,
+               (ClientData) textPtr);
+       }
+    }
+    dInfoPtr->flags |= REDRAW_PENDING | DINFO_OUT_OF_DATE | REPICK_NEEDED;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextRedrawTag --
+ *
+ *     This procedure is invoked to request a redraw of all characters
+ *     in a given range of characters that have a particular tag on or
+ *     off.  It's called, for example, when characters are tagged or
+ *     untagged, or when tag options change.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Information on the screen may be redrawn, and the layout of
+ *     the screen may change.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkTextRedrawTag(textPtr, line1, ch1, line2, ch2, tagPtr, withTag)
+    TkText *textPtr;           /* Widget record for text widget. */
+    int line1, ch1;            /* Index of first character in range of
+                                * interest. */
+    int line2, ch2;            /* Index of character just after last one
+                                * in range of interest. */
+    TkTextTag *tagPtr;         /* Information about tag. */
+    int withTag;               /* 1 means redraw characters that have the
+                                * tag, 0 means redraw those without. */
+{
+    register DLine *dlPtr;
+    DLine *endPtr;
+    int topLine, tagOn;
+    TkTextSearch search;
+    DInfo *dInfoPtr = textPtr->dInfoPtr;
+
+    /*
+     * Round up the starting position if it's before the first line
+     * visible on the screen (we only care about what's on the screen).
+     */
+
+    dlPtr = dInfoPtr->dLinePtr;
+    if (dlPtr == NULL) {
+       return;
+    }
+    topLine = TkBTreeLineIndex(dlPtr->linePtr);
+    if (topLine > line1) {
+       line1 = topLine;
+       ch1 = 0;
+    }
+
+    /* 
+     * Initialize a search through all transitions on the tag, starting
+     * with the first transition where the tag's current state is different
+     * from what it will eventually be.
+     */
+
+    TkBTreeStartSearch(textPtr->tree, line1, ch1+1, line2, ch2,
+           tagPtr, &search);
+    tagOn = TkBTreeCharTagged(search.linePtr, ch1, tagPtr);
+    if (tagOn != withTag) {
+       if (!TkBTreeNextTag(&search)) {
+           return;
+       }
+    }
+
+    /*
+     * Each loop through the loop below is for one range of characters
+     * where the tag's current state is different than its eventual
+     * state.  At the top of the loop, search contains information about
+     * the first character in the range.
+     */
+
+    while (1) {
+       /*
+        * Find the first DLine structure in the range.
+        */
+
+       dlPtr = FindDLine(dlPtr, search.line1);
+       if (dlPtr == NULL) {
+           break;
+       }
+
+       /*
+        * Find the first DLine structure that's past the end of the range.
+        */
+
+       if (TkBTreeNextTag(&search)) {
+           endPtr = FindDLine(dlPtr,
+                   (search.ch1 > 0) ? (search.line1 + 1) : search.line1);
+       } else {
+           endPtr = FindDLine(dlPtr,
+                   (ch2 > 0) ? (search.line2 + 1) : search.line2);
+       }
+
+       /*
+        * Delete all of the display lines in the range, so that they'll
+        * be re-layed out and redrawn.
+        */
+
+       FreeDLines(textPtr, dlPtr, endPtr, 1);
+       dlPtr = endPtr;
+
+       /*
+        * Find the first text line in the next range.
+        */
+
+       if (!TkBTreeNextTag(&search)) {
+           break;
+       }
+    }
+
+    /*
+     * Lastly, schedule a redisplay and layout recalculation if they
+     * aren't already pending.
+     */
+
+    if (!(dInfoPtr->flags & REDRAW_PENDING)) {
+//     Tk_DoWhenIdle(DisplayText, (ClientData) textPtr);
+        assert(textPtr->updateTimerToken == NULL);
+        if (textPtr->updateTimerToken == NULL) {
+           textPtr->updateTimerToken =
+             Tk_CreateTimerHandler(
+               TextUpdateTime,
+               DisplayText,
+               (ClientData) textPtr);
+       }
+    }
+    dInfoPtr->flags |= REDRAW_PENDING | DINFO_OUT_OF_DATE | REPICK_NEEDED;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextRelayoutWindow --
+ *
+ *     This procedure is called when something has happened that
+ *     invalidates the whole layout of characters on the screen, such
+ *     as a change in a configuration option for the overall text
+ *     widget or a change in the window size.  It causes all display
+ *     information to be recomputed and the window to be redrawn.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     All the display information will be recomputed for the window
+ *     and the window will be redrawn.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkTextRelayoutWindow(textPtr)
+    TkText *textPtr;           /* Widget record for text widget. */
+{
+    DInfo *dInfoPtr = textPtr->dInfoPtr;
+
+    /*
+     * Throw away all the current layout information.
+     */
+
+    FreeDLines(textPtr, dInfoPtr->dLinePtr, (DLine *) NULL, 1);
+    dInfoPtr->dLinePtr = NULL;
+
+    /*
+     * Recompute some overall things for the layout.
+     */
+
+    dInfoPtr->x = textPtr->borderWidth + textPtr->padX;
+    dInfoPtr->y = textPtr->borderWidth + textPtr->padY;
+    dInfoPtr->maxX = Tk_Width(textPtr->tkwin) - dInfoPtr->x;
+    dInfoPtr->maxY = Tk_Height(textPtr->tkwin) - dInfoPtr->y;
+    dInfoPtr->topOfEof = dInfoPtr->maxY;
+
+    if (!(dInfoPtr->flags & REDRAW_PENDING)) {
+//     Tk_DoWhenIdle(DisplayText, (ClientData) textPtr);
+        assert(textPtr->updateTimerToken == NULL);
+       if (textPtr->updateTimerToken == NULL) {
+           textPtr->updateTimerToken =
+             Tk_CreateTimerHandler(
+               TextUpdateTime,
+               DisplayText,
+               (ClientData) textPtr);
+       }
+    }
+    dInfoPtr->flags |= REDRAW_PENDING | REDRAW_BORDERS | DINFO_OUT_OF_DATE | REPICK_NEEDED;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextSetView --
+ *
+ *     This procedure is called to specify what lines are to be
+ *     displayed in a text widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The display will (eventually) be updated so that the line
+ *     given by "line" is visible on the screen at the position
+ *     determined by "pickPlace".
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkTextSetView(textPtr, line, pickPlace)
+    TkText *textPtr;           /* Widget record for text widget. */
+    int line;                  /* Number of line that is to appear somewhere
+                                * in the window.  This line number must
+                                * be a valid one in the file. */
+    int pickPlace;             /* 0 means topLine must appear at top of
+                                * screen.  1 means we get to pick where it
+                                * appears:  minimize screen motion or else
+                                * display line at center of screen. */
+{
+    DInfo *dInfoPtr = textPtr->dInfoPtr;
+    register DLine *dlPtr, *dlPtr2;
+    TkTextLine *linePtr;
+    int curTopLine, curBotLine;
+    int bottomY;
+    TagInfo tagInfo;
+#define CLOSE_LINES 5
+
+    if (!pickPlace) {
+       /*
+        * The line must go at the top of the screen.  See if the new
+        * topmost line is already somewhere on the screen.  If so then
+        * delete all the DLine structures ahead of it.  Otherwise just
+        * leave all the DLine's alone (if the new topmost line is above
+        * the top of the current window, i.e. we're scrolling back towards
+        * the beginning of the file we may be able to reuse some of the
+        * information that's currently on the screen without redisplaying
+        * it all.
+        */
+    
+       dlPtr = FindDLine(dInfoPtr->dLinePtr, line);
+       if ((dlPtr != NULL) && (dlPtr != dInfoPtr->dLinePtr)) {
+           FreeDLines(textPtr, dInfoPtr->dLinePtr, dlPtr, 1);
+       }
+    
+       textPtr->topLinePtr = TkBTreeFindLine(textPtr->tree, line);
+       goto scheduleUpdate;
+    }
+
+    /*
+     * We have to pick where to display the given line.  First, bring
+     * the display information up to date and see if the line will be
+     * completely visible in the current screen configuration.  If so
+     * then there's nothing to do.
+     */
+
+    if (dInfoPtr->flags & DINFO_OUT_OF_DATE) {
+       UpdateDisplayInfo(textPtr);
+    }
+    linePtr = TkBTreeFindLine(textPtr->tree, line);
+    /* DEH: return if dlPtr is null */
+    if ((dlPtr = dInfoPtr->dLinePtr) == NULL)
+        return;
+    for (; ; dlPtr = dlPtr->nextPtr) {
+       if (dlPtr->nextPtr == NULL) {
+           break;
+       }
+       if ((dlPtr->linePtr == linePtr)
+               && (dlPtr->nextPtr->linePtr != linePtr)) {
+           break;
+       }
+    }
+    if ((dlPtr->linePtr == linePtr)
+           && ((dlPtr->y + dlPtr->height) <= dInfoPtr->maxY)) {
+       return;
+    }
+
+    /*
+     * The desired line isn't already on-screen.  See if it is within
+     * a few lines of the top of the window.  If so then just make it
+     * the top line on the screen.
+     */
+
+    bottomY = (dInfoPtr->y + dInfoPtr->maxY)/2;
+    curTopLine = TkBTreeLineIndex(dInfoPtr->dLinePtr->linePtr);
+    if (line < curTopLine) {
+       if (line >= (curTopLine-CLOSE_LINES)) {
+           textPtr->topLinePtr = TkBTreeFindLine(textPtr->tree, line);
+           goto scheduleUpdate;
+       }
+    } else {
+       /*
+        * The desired line is below the bottom of the screen.  If it is
+        * within a few lines of the bottom of the screen then position
+        * it at the bottom of the screen. (At this point dlPtr points to
+        * the last line on the screen)
+        */
+    
+       curBotLine = TkBTreeLineIndex(dlPtr->linePtr);
+       if (line <= (curBotLine+5)) {
+           bottomY = dInfoPtr->maxY;
+       }
+    }
+
+    /*
+     * Our job now is arrange the display so that "line" appears as
+     * low on the screen as possible but with its bottom no lower
+     * than bottomY (bottomY is the bottom of the window if the
+     * desired line is just below the current screen, otherwise it
+     * is the center of the window.  Work upwards (through smaller
+     * line numbers) computing how much space lines take, until we
+     * fine the line that should be at the top of the screen.
+     */
+
+    for (textPtr->topLinePtr = linePtr = TkBTreeFindLine(textPtr->tree, line);
+           ; line--, textPtr->topLinePtr = linePtr,
+           linePtr = TkBTreeFindLine(textPtr->tree, line)) {
+       tagInfo.tagPtrs = TkBTreeGetTags(textPtr->tree, linePtr, 0,
+               &tagInfo.numTags);
+       tagInfo.arraySize = tagInfo.numTags;
+       TkBTreeStartSearch(textPtr->tree, line, 1, line+1, 0,
+               (TkTextTag *) NULL, &tagInfo.search);
+       TkBTreeNextTag(&tagInfo.search);
+       dlPtr = LayoutLine(textPtr, line, linePtr, &tagInfo);
+       for (dlPtr2 = dlPtr; dlPtr2 != NULL; dlPtr2 = dlPtr2->nextPtr) {
+           bottomY -= dlPtr2->height;
+       }
+       FreeDLines(textPtr, dlPtr, (DLine *) NULL, 0);
+       if (tagInfo.tagPtrs != NULL) {
+           ckfree((char *) tagInfo.tagPtrs);
+       }
+       if ((bottomY <= 0) || (line <= 0)) {
+           break;
+       }
+    }
+
+    scheduleUpdate:
+    if (!(dInfoPtr->flags & REDRAW_PENDING)) {
+//     Tk_DoWhenIdle(DisplayText, (ClientData) textPtr);
+        assert(textPtr->updateTimerToken == NULL);
+       if (textPtr->updateTimerToken == NULL) {
+           textPtr->updateTimerToken =
+             Tk_CreateTimerHandler(
+               TextUpdateTime,
+               DisplayText,
+               (ClientData) textPtr);
+       }
+    }
+    dInfoPtr->flags |= REDRAW_PENDING | DINFO_OUT_OF_DATE | REPICK_NEEDED;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * FindDLine --
+ *
+ *     This procedure is called to find the DLine corresponding to a
+ *     given text line.
+ *
+ * Results:
+ *     The return value is a pointer to the first DLine found in the
+ *     list headed by dlPtr whose line number is greater or equal to
+ *     line.  If there is no such line in the list then NULL is returned.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static DLine *
+FindDLine(dlPtr, line)
+    register DLine *dlPtr;     /* Pointer to first in list of DLines
+                                * to search. */
+    int line;                  /* Line number in text that is desired. */
+{
+    TkTextLine *linePtr;
+    int thisLine;
+
+    if (dlPtr == NULL) {
+       return NULL;
+    }
+    thisLine = TkBTreeLineIndex(dlPtr->linePtr);
+    while (thisLine < line) {
+       /*
+        * This DLine isn't the right one.  Go on to the next DLine
+        * (skipping multiple DLine's for the same text line).
+        */
+
+       linePtr = dlPtr->linePtr;
+       do {
+           dlPtr = dlPtr->nextPtr;
+           if (dlPtr == NULL) {
+               return NULL;
+           }
+       } while (dlPtr->linePtr == linePtr);
+
+       /*
+        * Step through text lines, keeping track of the line number
+        * we're on, until we catch up to dlPtr (remember, there could
+        * be gaps in the DLine list where DLine's have been deleted).
+        */
+
+       do {
+           linePtr = TkBTreeNextLine(linePtr);
+           thisLine++;
+           if (linePtr == NULL) {
+               panic("FindDLine reached end of text");
+           }
+       } while (linePtr != dlPtr->linePtr);
+    }
+    return dlPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextCharAtLoc --
+ *
+ *     Given an (x,y) coordinate on the screen, find the location of
+ *     the closest character to that location.
+ *
+ * Results:
+ *     The return value is a pointer to the text line containing the
+ *     character displayed closest to (x,y).  The value at *chPtr is
+ *     overwritten with the index with that line of the closest
+ *     character.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+TkTextLine *
+TkTextCharAtLoc(textPtr, x, y, chPtr)
+    TkText *textPtr;           /* Widget record for text widget. */
+    int x, y;                  /* Pixel coordinates of point in widget's
+                                * window. */
+    int *chPtr;                        /* Place to store index-within-line of
+                                * closest character. */
+{
+    DInfo *dInfoPtr = textPtr->dInfoPtr;
+    register DLine *dlPtr;
+    register Chunk *chunkPtr;
+    int count;
+    int endX;
+
+    /*
+     * Make sure that all of the layout information about what's
+     * displayed where on the screen is up-to-date.
+     */
+
+    if (dInfoPtr->flags & DINFO_OUT_OF_DATE) {
+       UpdateDisplayInfo(textPtr);
+    }
+
+    /*
+     * If the coordinates are above the top of the window, then adjust
+     * them to refer to the upper-right corner of the window.
+     */
+
+    if (y < dInfoPtr->y) {
+       y = dInfoPtr->y;
+       x = dInfoPtr->x;
+    } else if (y >= dInfoPtr->topOfEof) {
+       y = dInfoPtr->topOfEof;
+       x = dInfoPtr->maxX;
+    }
+    for (dlPtr = dInfoPtr->dLinePtr; dlPtr != NULL; dlPtr = dlPtr->nextPtr) {
+       if (y > (dlPtr->y + dlPtr->height)) {
+           if (dlPtr->nextPtr != NULL) {
+               continue;
+           }
+
+           /*
+            * The coordinates are off the bottom of the window.  Adjust
+            * them to refer to the lower-right character on the window.
+            */
+
+           y = dlPtr->y;
+           x = dInfoPtr->maxX;
+       }
+       for (chunkPtr = dlPtr->chunkPtr; ; chunkPtr = chunkPtr->nextPtr) {
+           if ((chunkPtr->nextPtr == NULL) || (chunkPtr->nextPtr->x > x)) {
+               break;
+           }
+       }
+       count = TkMeasureChars(chunkPtr->stylePtr->sValuePtr->fontPtr,
+           chunkPtr->text, chunkPtr->numChars, chunkPtr->x, x, 0, &endX);
+       if (count >= chunkPtr->numChars) {
+           /*
+            * The point is off the end of the line.  Return the character
+            * after the last one that fit, unless that character appears
+            * as the first character on the next DLine or unless the last
+            * one that fit extends beyond the edge of the window.
+            */
+
+           if ((dlPtr->nextPtr != NULL)
+                   && (dlPtr->nextPtr->chunkPtr->text
+                   == (chunkPtr->text + chunkPtr->numChars))) {
+               count = chunkPtr->numChars-1;
+           }
+           if (endX >= dInfoPtr->maxX) {
+               count = chunkPtr->numChars-1;
+           }
+       }
+       *chPtr = count + (chunkPtr->text - dlPtr->linePtr->bytes);
+       return dlPtr->linePtr;
+    }
+    panic("TkTextCharAtLoc ran out of lines");
+    return (TkTextLine *) NULL;
+}
diff --git a/src/tk/tktxidx.c b/src/tk/tktxidx.c
new file mode 100644 (file)
index 0000000..19ecf9d
--- /dev/null
@@ -0,0 +1,640 @@
+/* 
+ * tkTextIndex.c --
+ *
+ *     This module provides procedures that manipulate indices for
+ *     text widgets.
+ *
+ * Copyright 1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkTextIndex.c,v 1.2 92/07/16 16:32:26 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "default.h"
+#include "tkconfig.h"
+#include "tk.h"
+#include "tktext.h"
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            BackwardChars _ANSI_ARGS_((TkText *textPtr,
+                           TkTextLine *linePtr, int *lineIndexPtr,
+                           int *chPtr, int count));
+static char *          ForwBack _ANSI_ARGS_((TkText *textPtr,
+                           char *string, int *lineIndexPtr, int *chPtr));
+static void            ForwardChars _ANSI_ARGS_((TkText *textPtr,
+                           TkTextLine *linePtr, int *lineIndexPtr,
+                           int *chPtr, int count));
+static char *          StartEnd _ANSI_ARGS_((TkText *textPtr,
+                           char *string, int *lineIndexPtr, int *chPtr));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextGetIndex --
+ *
+ *     Given a string, return the line and character indices that
+ *     it describes.
+ *
+ * Results:
+ *     The return value is a standard Tcl return result.  If
+ *     TCL_OK is returned, then everything went well and information
+ *     is stored at *lineIndexPtr and *chPtr;  otherwise TCL_ERROR
+ *     is returned and an error message is left in interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TkTextGetIndex(interp, textPtr, string, lineIndexPtr, chPtr)
+    Tcl_Interp *interp;                /* Use this for error reporting. */
+    TkText *textPtr;           /* Information about text widget. */
+    char *string;              /* Textual description of position. */
+    int *lineIndexPtr;         /* Store line number here. */
+    int *chPtr;                        /* Store character position here. */
+{
+    register char *p;
+    char *end, *endOfBase;
+    TkTextLine *linePtr;
+    Tcl_HashEntry *hPtr;
+    TkAnnotation *markPtr;
+    TkTextTag *tagPtr;
+    TkTextSearch search;
+    int first;
+    char c;
+
+    /*
+     *------------------------------------------------
+     * Stage 1: parse the base index.
+     *------------------------------------------------
+     */
+
+    if (string[0] == '@') {
+       /*
+        * Find character at a given x,y location in the window.
+        */
+
+       int x, y;
+
+       p = string+1;
+       x = strtol(p, &end, 0);
+       if ((end == p) || (*end != ',')) {
+           goto error;
+       }
+       p = end+1;
+       y = strtol(p, &end, 0);
+       if (end == p) {
+           goto error;
+       }
+       *lineIndexPtr = TkBTreeLineIndex(TkTextCharAtLoc(textPtr, x,
+               y, chPtr));
+       endOfBase = end;
+       goto gotBase; 
+    } else if (isdigit(string[0]) || (string[0] == '-')) {
+       /*
+        * Base is identified with line and character indices.
+        */
+
+       *lineIndexPtr = strtol(string, &end, 0) - 1;
+       if ((end == string) || (*end != '.')) {
+           goto error;
+       }
+       p = end+1;
+       if ((*p == 'e') && (strncmp(p, "end", 3) == 0)) {
+           linePtr = TkBTreeFindLine(textPtr->tree, *lineIndexPtr);
+           if (linePtr == NULL) {
+               Tcl_AppendResult(interp, "bad text index \"", string,
+                       "\": no such line in text", (char *) NULL);
+               return TCL_ERROR;
+           }
+           *chPtr = linePtr->numBytes - 1;
+           endOfBase = p+3;
+           goto gotBase;
+       } else {
+           *chPtr = strtol(p, &end, 0);
+           if (end == p) {
+               goto error;
+           }
+           endOfBase = end;
+           goto gotBase;
+       }
+    }
+
+    for (p = string; *p != 0; p++) {
+       if (isspace(*p) || (*p == '+') || (*p == '-')) {
+           break;
+       }
+    }
+    endOfBase = p;
+    if ((string[0] == 'e')
+           && (strncmp(string, "end", endOfBase-string) == 0)) {
+       /*
+        * Base position is end of text.
+        */
+
+       *lineIndexPtr = TkBTreeNumLines(textPtr->tree) - 1;
+       linePtr = TkBTreeFindLine(textPtr->tree, *lineIndexPtr);
+       *chPtr = linePtr->numBytes - 1;
+       goto gotBase;
+    } else {
+       /*
+        * See if the base position is the name of a mark.
+        */
+
+       c = *endOfBase;
+       *endOfBase = 0;
+       hPtr = Tcl_FindHashEntry(&textPtr->markTable, string);
+       *endOfBase = c;
+       if (hPtr != NULL) {
+           markPtr = (TkAnnotation *) Tcl_GetHashValue(hPtr);
+           *lineIndexPtr = TkBTreeLineIndex(markPtr->linePtr);
+           *chPtr = markPtr->ch;
+           goto gotBase;
+       }
+    }
+
+    /*
+     * Nothing has worked so far.  See if the base has the form
+     * "tag.first" or "tag.last" where "tag" is the name of a valid
+     * tag.
+     */
+
+    p = strchr(string, '.');
+    if (p == NULL) {
+       goto error;
+    }
+    if ((p[1] == 'f') && (endOfBase == (p+6))
+           && (strncmp(p+1, "first", endOfBase - (p+1)) == 0)) {
+       first = 1;
+    } else if ((p[1] == 'l') && (endOfBase == (p+5))
+           && (strncmp(p+1, "last", endOfBase - (p+1)) == 0)) {
+       first = 0;
+    } else {
+       goto error;
+    }
+    *p = 0;
+    hPtr = Tcl_FindHashEntry(&textPtr->tagTable, string);
+    *p = '.';
+    if (hPtr == NULL) {
+       goto error;
+    }
+    tagPtr = (TkTextTag *) Tcl_GetHashValue(hPtr);
+    TkBTreeStartSearch(textPtr->tree, 0, 0, TkBTreeNumLines(textPtr->tree),
+           0, tagPtr, &search);
+    if (!TkBTreeNextTag(&search)) {
+       Tcl_AppendResult(interp,
+               "text doesn't contain any characters tagged with \"",
+               Tcl_GetHashKey(&textPtr->tagTable, hPtr), "\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    if (first) {
+       *lineIndexPtr = search.line1;
+       *chPtr = search.ch1;
+    } else {
+       while (TkBTreeNextTag(&search)) {
+           *lineIndexPtr = search.line1;
+           *chPtr = search.ch1;
+       }
+    }
+
+    /*
+     *-------------------------------------------------------------------
+     * Stage 2: process zero or more modifiers.  Each modifier is either
+     * a keyword like "wordend" or "linestart", or it has the form
+     * "op count units" where op is + or -, count is a number, and units
+     * is "chars" or "lines".
+     *-------------------------------------------------------------------
+     */
+
+    gotBase:
+    p = endOfBase;
+    while (1) {
+       while (isspace(*p)) {
+           p++;
+       }
+       if (*p == 0) {
+           return TCL_OK;
+       }
+    
+       if ((*p == '+') || (*p == '-')) {
+           p = ForwBack(textPtr, p, lineIndexPtr, chPtr);
+       } else {
+           p = StartEnd(textPtr, p, lineIndexPtr, chPtr);
+       }
+       if (p == NULL) {
+           goto error;
+       }
+    }
+
+    error:
+    Tcl_AppendResult(interp, "bad text index \"", string, "\"",
+           (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextPrintIndex --
+ *
+ *     Given a line number and a character index, this procedure
+ *     generates a string description of the position, which is
+ *     suitable for reading in again later.
+ *
+ * Results:
+ *     The characters pointed to by string are modified.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkTextPrintIndex(line, ch, string)
+    int line;                  /* Line number. */
+    int ch;                    /* Character position within line. */
+    char *string;              /* Place to store the position.  Must have
+                                * at least POS_CHARS characters. */
+{
+    sprintf(string, "%d.%d", line+1, ch);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextRoundIndex --
+ *
+ *     Given a line index and a character index, this procedure
+ *     adjusts those positions if necessary to correspond to the
+ *     nearest actual character within the text.
+ *
+ * Results:
+ *     The return value is a pointer to the line structure for
+ *     the line of the text's B-tree that contains the indicated
+ *     character.  In addition, *lineIndexPtr and *chPtr are
+ *     modified if necessary to refer to an existing character
+ *     in the file.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+
+TkTextLine *
+TkTextRoundIndex(textPtr, lineIndexPtr, chPtr)
+    TkText *textPtr;                   /* Information about text widget. */
+    int *lineIndexPtr;                 /* Points to initial line index,
+                                        * which is overwritten with actual
+                                        * line index. */
+    int *chPtr;                                /* Points to initial character index,
+                                        * which is overwritten with actual
+                                        * character index. */
+{
+    int line, ch, lastLine;
+    TkTextLine *linePtr;
+
+    line = *lineIndexPtr;
+    ch = *chPtr;
+    if (line < 0) {
+       line = 0;
+       ch = 0;
+    }
+    lastLine = TkBTreeNumLines(textPtr->tree) - 1;
+    if (line > lastLine) {
+       line = lastLine;
+       linePtr = TkBTreeFindLine(textPtr->tree, line);
+       ch = linePtr->numBytes - 1;
+    } else {
+       linePtr = TkBTreeFindLine(textPtr->tree, line);
+       if (ch < 0) {
+           ch = 0;
+       }
+       if (ch >= linePtr->numBytes) {
+           if (line == lastLine) {
+               ch = linePtr->numBytes - 1;
+           } else {
+               line++;
+               linePtr = TkBTreeNextLine(linePtr);
+               ch = 0;
+           }
+       }
+    }
+    *lineIndexPtr = line;
+    *chPtr = ch;
+    return linePtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ForwBack --
+ *
+ *     This procedure handles +/- modifiers for indices to adjust
+ *     the index forwards or backwards.
+ *
+ * Results:
+ *     If the modifier is successfully parsed then the return value
+ *     is the address of the first character after the modifier, and
+ *     *lineIndexPtr and *chPtr are updated to reflect the modifier.
+ *     If there is a syntax error in the modifier then NULL is returned.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static char *
+ForwBack(textPtr, string, lineIndexPtr, chPtr)
+    TkText *textPtr;           /* Information about widget that index
+                                * refers to. */
+    char *string;              /* String to parse for additional info
+                                * about modifier (count and units). 
+                                * Points to "+" or "-" that starts
+                                * modifier. */
+    int *lineIndexPtr;         /* Points to current line index, which will
+                                * be updated to reflect modifier. */
+    int *chPtr;                        /* Points to current character index, which
+                                * will be updated to reflect modifier. */
+{
+    register char *p;
+    char *end, *units;
+    int count, length, lastLine;
+    TkTextLine *linePtr;
+
+    /*
+     * Get the count (how many units forward or backward).
+     */
+
+    p = string+1;
+    while (isspace(*p)) {
+       p++;
+    }
+    count = strtoul(p, &end, 0);
+    if (end == p) {
+       return NULL;
+    }
+    p = end;
+    while (isspace(*p)) {
+       p++;
+    }
+
+    /*
+     * Find the end of this modifier (next space or + or - character),
+     * then parse the unit specifier and update the position
+     * accordingly.
+     */
+
+    units = p; 
+    while ((*p != 0) && !isspace(*p) && (*p != '+') && (*p != '-')) {
+       p++;
+    }
+    length = p - units;
+    if ((*units == 'c') && (strncmp(units, "chars", length) == 0)) {
+       linePtr = TkTextRoundIndex(textPtr, lineIndexPtr, chPtr);
+       if (*string == '+') {
+           ForwardChars(textPtr, linePtr, lineIndexPtr, chPtr, count);
+       } else {
+           BackwardChars(textPtr, linePtr, lineIndexPtr, chPtr, count);
+       }
+    } else if ((*units == 'l') && (strncmp(units, "lines", length) == 0)) {
+       if (*string == '+') {
+           *lineIndexPtr += count;
+           lastLine = TkBTreeNumLines(textPtr->tree) - 1;
+           if (*lineIndexPtr > lastLine) {
+               *lineIndexPtr = lastLine;
+           }
+       } else {
+           *lineIndexPtr -= count;
+           if (*lineIndexPtr < 0) {
+               *lineIndexPtr = 0;
+           }
+       }
+       linePtr = TkBTreeFindLine(textPtr->tree, *lineIndexPtr);
+       if (*chPtr >= linePtr->numBytes) {
+           *chPtr = linePtr->numBytes - 1;
+       }
+       if (*chPtr < 0) {
+           *chPtr = 0;
+       }
+    } else {
+       return NULL;
+    }
+    return p;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ForwardChars --
+ *
+ *     Given a position in a text widget, this procedure computes
+ *     a new position that is "count" characters ahead of the given
+ *     position.
+ *
+ * Results:
+ *     *LineIndexPtr and *chPtr are overwritten with new values
+ *     corresponding to the new position.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static void
+ForwardChars(textPtr, linePtr, lineIndexPtr, chPtr, count)
+    TkText *textPtr;                   /* Information about text widget. */
+    register TkTextLine *linePtr;      /* Text line corresponding to
+                                        * *lineIndexPtr. */
+    int *lineIndexPtr;                 /* Points to initial line index,
+                                        * which is overwritten with final
+                                        * line index. */
+    int *chPtr;                                /* Points to initial character index,
+                                        * which is overwritten with final
+                                        * character index. */
+    int count;                         /* How many characters forward to
+                                        * move.  Must not be negative. */
+{
+    TkTextLine *nextPtr;
+    int bytesInLine;
+
+    while (count > 0) {
+       bytesInLine = linePtr->numBytes - *chPtr;
+       if (bytesInLine > count) {
+           *chPtr += count;
+           return;
+       }
+       nextPtr = TkBTreeNextLine(linePtr);
+       if (nextPtr == NULL) {
+           *chPtr = linePtr->numBytes - 1;
+           return;
+       }
+       *chPtr = 0;
+       *lineIndexPtr += 1;
+       linePtr = nextPtr;
+       count -= bytesInLine;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * BackwardChars --
+ *
+ *     Given a position in a text widget, this procedure computes
+ *     a new position that is "count" characters earlier than the given
+ *     position.
+ *
+ * Results:
+ *     *LineIndexPtr and *chPtr are overwritten with new values
+ *     corresponding to the new position.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+BackwardChars(textPtr, linePtr, lineIndexPtr, chPtr, count)
+    TkText *textPtr;                   /* Information about text widget. */
+    register TkTextLine *linePtr;      /* Text line corresponding to
+                                        * *lineIndexPtr. */
+    int *lineIndexPtr;                 /* Points to initial line index,
+                                        * which is overwritten with final
+                                        * line index. */
+    int *chPtr;                                /* Points to initial character index,
+                                        * which is overwritten with final
+                                        * character index. */
+    int count;                         /* How many characters backward to
+                                        * move.  Must not be negative. */
+{
+    int bytesInLine;
+
+    while (count > 0) {
+       bytesInLine = *chPtr;
+       if (bytesInLine >= count) {
+           *chPtr -= count;
+           return;
+       }
+       if (*lineIndexPtr <= 0) {
+           *chPtr = 0;
+           return;
+       }
+       *lineIndexPtr -= 1;
+       linePtr = TkBTreeFindLine(textPtr->tree, *lineIndexPtr);
+       count -= bytesInLine;
+       *chPtr = linePtr->numBytes;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * StartEnd --
+ *
+ *     This procedure handles modifiers like "wordstart" and "lineend"
+ *     to adjust indices forwards or backwards.
+ *
+ * Results:
+ *     If the modifier is successfully parsed then the return value
+ *     is the address of the first character after the modifier, and
+ *     *lineIndexPtr and *chPtr are updated to reflect the modifier.
+ *     If there is a syntax error in the modifier then NULL is returned.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static char *
+StartEnd(textPtr, string, lineIndexPtr, chPtr)
+    TkText *textPtr;           /* Information about widget that index
+                                * refers to. */
+    char *string;              /* String to parse for additional info
+                                * about modifier (count and units). 
+                                * Points to first character of modifer
+                                * word. */
+    int *lineIndexPtr;         /* Points to current line index, which will
+                                * be updated to reflect modifier. */
+    int *chPtr;                        /* Points to current character index, which
+                                * will be updated to reflect modifier. */
+{
+    char *p, c;
+    int length;
+    register TkTextLine *linePtr;
+
+    /*
+     * Find the end of the modifier word.
+     */
+
+    for (p = string; isalnum(*p); p++) {
+       /* Empty loop body. */
+    }
+    length = p-string;
+    linePtr = TkTextRoundIndex(textPtr, lineIndexPtr, chPtr);
+    if ((*string == 'l') && (strncmp(string, "lineend", length) == 0)
+           && (length >= 5)) {
+       *chPtr = linePtr->numBytes - 1;
+    } else if ((*string == 'l') && (strncmp(string, "linestart", length) == 0)
+           && (length >= 5)) {
+       *chPtr = 0;
+    } else if ((*string == 'w') && (strncmp(string, "wordend", length) == 0)
+           && (length >= 5)) {
+       c = linePtr->bytes[*chPtr];
+       if (!isalnum(c) && (c != '_')) {
+           if (*chPtr >= (linePtr->numBytes - 1)) {
+               /*
+                * End of line:  go to start of next line unless this is the
+                * last line in the text.
+                */
+
+               if (TkBTreeNextLine(linePtr) != NULL) {
+                   *lineIndexPtr += 1;
+                   *chPtr = 0;
+               }
+           } else {
+               *chPtr += 1;
+           }
+       } else {
+           do {
+               *chPtr += 1;
+               c = linePtr->bytes[*chPtr];
+           } while (isalnum(c) || (c == '_'));
+       }
+    } else if ((*string == 'w') && (strncmp(string, "wordstart", length) == 0)
+           && (length >= 5)) {
+       c = linePtr->bytes[*chPtr];
+       if (isalnum(c) || (c == '_')) {
+           while (*chPtr > 0) {
+               c = linePtr->bytes[(*chPtr) - 1];
+               if (!isalnum(c) && (c != '_')) {
+                   break;
+               }
+               *chPtr -= 1;
+           }
+       }
+    } else {
+       return NULL;
+    }
+    return p;
+}
diff --git a/src/tk/tktxtag.c b/src/tk/tktxtag.c
new file mode 100644 (file)
index 0000000..79b4699
--- /dev/null
@@ -0,0 +1,1067 @@
+/* 
+ * tkTextTag.c --
+ *
+ *     This module implements the "tag" subcommand of the widget command
+ *     for text widgets, plus most of the other high-level functions
+ *     related to tags.
+ *
+ * Copyright 1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkTextTag.c,v 1.3 92/07/28 15:38:59 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "default.h"
+#include "tkconfig.h"
+#include "tk.h"
+#include "tktext.h"
+
+/*
+ * Information used for parsing tag configuration information:
+ */
+
+static Tk_ConfigSpec tagConfigSpecs[] = {
+    {TK_CONFIG_BORDER, "-background", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(TkTextTag, border), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_BITMAP, "-bgstipple", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(TkTextTag, bgStipple), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_PIXELS, "-borderwidth", (char *) NULL, (char *) NULL,
+       "0", Tk_Offset(TkTextTag, borderWidth), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_BITMAP, "-fgstipple", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(TkTextTag, fgStipple), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_FONT, "-font", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(TkTextTag, fontPtr), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_COLOR, "-foreground", (char *) NULL, (char *) NULL,
+       (char *) NULL, Tk_Offset(TkTextTag, fgColor), TK_CONFIG_NULL_OK},
+    {TK_CONFIG_RELIEF, "-relief", (char *) NULL, (char *) NULL,
+       "flat", Tk_Offset(TkTextTag, relief), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_BOOLEAN, "-underline", (char *) NULL, (char *) NULL,
+       "false", Tk_Offset(TkTextTag, underline), TK_CONFIG_DONT_SET_DEFAULT},
+    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,
+       (char *) NULL, 0, 0}
+};
+
+
+/*
+ * The following definition specifies the maximum number of characters
+ * needed in a string to hold a position specifier.
+ */
+
+#define POS_CHARS 30
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static void            ChangeTagPriority _ANSI_ARGS_((TkText *textPtr,
+                           TkTextTag *tagPtr, int prio));
+static TkTextTag *     FindTag _ANSI_ARGS_((Tcl_Interp *interp,
+                           TkText *textPtr, char *tagName));
+static void            SortTags _ANSI_ARGS_((int numTags,
+                           TkTextTag **tagArrayPtr));
+static int             TagSortProc _ANSI_ARGS_((CONST VOID *first,
+                           CONST VOID *second));
+static void            TextDoEvent _ANSI_ARGS_((TkText *textPtr,
+                           XEvent *eventPtr));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkTextTagCmd --
+ *
+ *     This procedure is invoked to process the "tag" options of
+ *     the widget command for text widgets. See the user documentation
+ *     for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+TkTextTagCmd(textPtr, interp, argc, argv)
+    register TkText *textPtr;  /* Information about text widget. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings.  Someone else has already
+                                * parsed this command enough to know that
+                                * argv[1] is "tag". */
+{
+    int length, line1, ch1, line2, ch2, i, addTag;
+    char c;
+    char *fullOption;
+    register TkTextTag *tagPtr;
+
+    if (argc < 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " tag option ?arg arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    c = argv[2][0];
+    length = strlen(argv[2]);
+    if ((c == 'a') && (strncmp(argv[2], "add", length) == 0)) {
+       fullOption = "add";
+       addTag = 1;
+
+       addAndRemove:
+       if ((argc != 5) && (argc != 6)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " tag ", fullOption, " tagName index1 ?index2?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       tagPtr = TkTextCreateTag(textPtr, argv[3]);
+       if (TkTextGetIndex(interp, textPtr, argv[4], &line1, &ch1) != TCL_OK) {
+           return TCL_ERROR;
+       }
+       if (argc == 6) {
+           if (TkTextGetIndex(interp, textPtr, argv[5], &line2, &ch2)
+                   != TCL_OK) {
+               return TCL_ERROR;
+           }
+       } else {
+           line2 = line1;
+           ch2 = ch1+1;
+       }
+       if (TK_TAG_AFFECTS_DISPLAY(tagPtr)) {
+           TkTextRedrawTag(textPtr, line1, ch1, line2, ch2, tagPtr, !addTag);
+       }
+       TkBTreeTag(textPtr->tree, line1, ch1, line2, ch2, tagPtr, addTag);
+
+       /*
+        * If the tag is "sel" then grab the selection if we're supposed
+        * to export it and don't already have it.  Also, invalidate
+        * partially-completed selection retrievals.
+        */
+
+       if (tagPtr == textPtr->selTagPtr) {
+           if (addTag && textPtr->exportSelection
+                   && !(textPtr->flags & GOT_SELECTION)) {
+               Tk_OwnSelection(textPtr->tkwin, TkTextLostSelection,
+                       (ClientData) textPtr);
+               textPtr->flags |= GOT_SELECTION;
+           }
+           textPtr->selOffset = -1;
+       }
+    } else if ((c == 'b') && (strncmp(argv[2], "bind", length) == 0)) {
+       if ((argc < 4) || (argc > 6)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " tag bind tagName ?sequence? ?command?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       tagPtr = TkTextCreateTag(textPtr, argv[3]);
+
+       /*
+        * Make a binding table if the widget doesn't already have
+        * one.
+        */
+
+       if (textPtr->bindingTable == NULL) {
+           textPtr->bindingTable = Tk_CreateBindingTable(interp);
+       }
+
+       if (argc == 6) {
+           int append = 0;
+           unsigned long mask;
+
+           if (argv[5][0] == 0) {
+               return Tk_DeleteBinding(interp, textPtr->bindingTable,
+                       (ClientData) tagPtr, argv[4]);
+           }
+           if (argv[5][0] == '+') {
+               argv[5]++;
+               append = 1;
+           }
+           mask = Tk_CreateBinding(interp, textPtr->bindingTable,
+                   (ClientData) tagPtr, argv[4], argv[5], append);
+           if (mask == 0) {
+               return TCL_ERROR;
+           }
+           if (mask & ~(ButtonMotionMask|Button1MotionMask|Button2MotionMask
+                   |Button3MotionMask|Button4MotionMask|Button5MotionMask
+                   |ButtonPressMask|ButtonReleaseMask|EnterWindowMask
+                   |LeaveWindowMask|KeyPressMask|KeyReleaseMask
+                   |PointerMotionMask)) {
+               Tk_DeleteBinding(interp, textPtr->bindingTable,
+                       (ClientData) tagPtr, argv[4]);
+               Tcl_ResetResult(interp);
+               Tcl_AppendResult(interp, "requested illegal events; ",
+                       "only key, button, motion, and enter/leave ",
+                       "events may be used", (char *) NULL);
+               return TCL_ERROR;
+           }
+       } else if (argc == 5) {
+           char *command;
+    
+           command = Tk_GetBinding(interp, textPtr->bindingTable,
+                   (ClientData) tagPtr, argv[4]);
+           if (command == NULL) {
+               return TCL_ERROR;
+           }
+           interp->result = command;
+       } else {
+           Tk_GetAllBindings(interp, textPtr->bindingTable,
+                   (ClientData) tagPtr);
+       }
+    } else if ((c == 'c') && (strncmp(argv[2], "configure", length) == 0)) {
+       if (argc < 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " tag configure tagName ?option? ?value? ",
+                   "?option value ...?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       tagPtr = TkTextCreateTag(textPtr, argv[3]);
+       if (argc == 4) {
+           return Tk_ConfigureInfo(interp, textPtr->tkwin, tagConfigSpecs,
+                   (char *) tagPtr, (char *) NULL, 0);
+       } else if (argc == 5) {
+           return Tk_ConfigureInfo(interp, textPtr->tkwin, tagConfigSpecs,
+                   (char *) tagPtr, argv[4], 0);
+       } else {
+           int result;
+
+           result = Tk_ConfigureWidget(interp, textPtr->tkwin, tagConfigSpecs,
+                   argc-4, argv+4, (char *) tagPtr, 0);
+           /*
+            * If the "sel" tag was changed, be sure to mirror information
+            * from the tag back into the text widget record.   NOTE: we
+            * don't have to free up information in the widget record
+            * before overwriting it, because it was mirrored in the tag
+            * and hence freed when the tag field was overwritten.
+            */
+
+           if (tagPtr == textPtr->selTagPtr) {
+               textPtr->selBorder = tagPtr->border;
+               textPtr->selBorderWidth = tagPtr->borderWidth;
+               textPtr->selFgColorPtr = tagPtr->fgColor;
+           }
+           TkTextRedrawTag(textPtr, 0, 0, TkBTreeNumLines(textPtr->tree),
+                   0, tagPtr, 1);
+           return result;
+       }
+    } else if ((c == 'd') && (strncmp(argv[2], "delete", length) == 0)) {
+       Tcl_HashEntry *hPtr;
+
+       if (argc < 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " tag delete tagName tagName ...\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       for (i = 3; i < argc; i++) {
+           hPtr = Tcl_FindHashEntry(&textPtr->tagTable, argv[i]);
+           if (hPtr == NULL) {
+               continue;
+           }
+           tagPtr = (TkTextTag *) Tcl_GetHashValue(hPtr);
+           if (tagPtr == textPtr->selTagPtr) {
+               interp->result = "can't delete selection tag";
+               return TCL_ERROR;
+           }
+           if (TK_TAG_AFFECTS_DISPLAY(tagPtr)) {
+               TkTextRedrawTag(textPtr, 0, 0, TkBTreeNumLines(textPtr->tree),
+                       0, tagPtr, 1);
+           }
+           TkBTreeTag(textPtr->tree, 0, 0, TkBTreeNumLines(textPtr->tree),
+                   0, tagPtr, 0);
+           Tcl_DeleteHashEntry(hPtr);
+           if (textPtr->bindingTable != NULL) {
+               Tk_DeleteAllBindings(textPtr->bindingTable,
+                       (ClientData) tagPtr);
+           }
+       
+           /*
+            * Update the tag priorities to reflect the deletion of this tag.
+            */
+
+           ChangeTagPriority(textPtr, tagPtr, textPtr->numTags-1);
+           textPtr->numTags -= 1;
+           TkTextFreeTag(tagPtr);
+       }
+    } else if ((c == 'l') && (strncmp(argv[2], "lower", length) == 0)) {
+       TkTextTag *tagPtr2;
+       int prio;
+
+       if ((argc != 4) && (argc != 5)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " tag lower tagName ?belowThis?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+           tagPtr = FindTag(interp, textPtr, argv[3]);
+       if (tagPtr == NULL) {
+           return TCL_ERROR;
+       }
+       if (argc == 5) {
+           tagPtr2 = FindTag(interp, textPtr, argv[4]);
+           if (tagPtr2 == NULL) {
+               return TCL_ERROR;
+           }
+           if (tagPtr->priority < tagPtr2->priority) {
+               prio = tagPtr2->priority - 1;
+           } else {
+               prio = tagPtr2->priority;
+           }
+       } else {
+           prio = 0;
+       }
+       ChangeTagPriority(textPtr, tagPtr, prio);
+       TkTextRedrawTag(textPtr, 0, 0, TkBTreeNumLines(textPtr->tree),
+               0, tagPtr, 1);
+    } else if ((c == 'n') && (strncmp(argv[2], "names", length) == 0)
+           && (length >= 2)) {
+       TkTextTag **arrayPtr;
+       int arraySize;
+       TkTextLine *linePtr;
+
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " tag names ?index?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           Tcl_HashSearch search;
+           Tcl_HashEntry *hPtr;
+
+           arrayPtr = (TkTextTag **) ckalloc((unsigned)
+                   (textPtr->numTags * sizeof(TkTextTag *)));
+           for (i = 0, hPtr = Tcl_FirstHashEntry(&textPtr->tagTable, &search);
+                   hPtr != NULL; i++, hPtr = Tcl_NextHashEntry(&search)) {
+               arrayPtr[i] = (TkTextTag *) Tcl_GetHashValue(hPtr);
+           }
+           arraySize = textPtr->numTags;
+       } else {
+           if (TkTextGetIndex(interp, textPtr, argv[3], &line1, &ch1)
+                   != TCL_OK) {
+               return TCL_ERROR;
+           }
+           linePtr = TkBTreeFindLine(textPtr->tree, line1);
+           if (linePtr == NULL) {
+               return TCL_OK;
+           }
+           arrayPtr = TkBTreeGetTags(textPtr->tree, linePtr, ch1, &arraySize);
+           if (arrayPtr == NULL) {
+               return TCL_OK;
+           }
+       }
+       SortTags(arraySize, arrayPtr);
+       for (i = 0; i < arraySize; i++) {
+           tagPtr = arrayPtr[i];
+           Tcl_AppendElement(interp, tagPtr->name, 0);
+       }
+       ckfree((char *) arrayPtr);
+    } else if ((c == 'n') && (strncmp(argv[2], "nextrange", length) == 0)
+           && (length >= 2)) {
+       TkTextSearch tSearch;
+       char position[POS_CHARS];
+
+       if ((argc != 5) && (argc != 6)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " tag nextrange tagName index1 ?index2?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       tagPtr = FindTag((Tcl_Interp *) NULL, textPtr, argv[3]);
+       if (tagPtr == NULL) {
+           return TCL_OK;
+       }
+       if (TkTextGetIndex(interp, textPtr, argv[4], &line1, &ch1) != TCL_OK) {
+           return TCL_ERROR;
+       }
+       if (argc == 5) {
+           line2 = TkBTreeNumLines(textPtr->tree);
+           ch2 = 0;
+       } else if (TkTextGetIndex(interp, textPtr, argv[5], &line2, &ch2)
+               != TCL_OK) {
+           return TCL_ERROR;
+       }
+
+       /*
+        * The search below is a bit tricky.  Rather than use the B-tree
+        * facilities to stop the search at line2.ch2, let it search up
+        * until the end of the file but check for a position past line2.ch2
+        * ourselves.  The reason for doing it this way is that we only
+        * care whether the *start* of the range is before line2.ch2;  once
+        * we find the start, we don't want TkBTreeNextTag to abort the
+        * search because the end of the range is after line2.ch2.
+        */
+
+       TkBTreeStartSearch(textPtr->tree, line1, ch1,
+               TkBTreeNumLines(textPtr->tree), 0, tagPtr, &tSearch);
+       if (!TkBTreeNextTag(&tSearch)) {
+            return TCL_OK;
+       }
+       if (!TkBTreeCharTagged(tSearch.linePtr, tSearch.ch1, tagPtr)) {
+           if (!TkBTreeNextTag(&tSearch)) {
+               return TCL_OK;
+           }
+       }
+       if ((tSearch.line1 > line2) || ((tSearch.line1 == line2)
+               && (tSearch.ch1 >= ch2))) {
+           return TCL_OK;
+       }
+       TkTextPrintIndex(tSearch.line1, tSearch.ch1, position);
+       Tcl_AppendElement(interp, position, 0);
+       TkBTreeNextTag(&tSearch);
+       TkTextPrintIndex(tSearch.line1, tSearch.ch1, position);
+       Tcl_AppendElement(interp, position, 0);
+    } else if ((c == 'r') && (strncmp(argv[2], "raise", length) == 0)
+           && (length >= 3)) {
+       TkTextTag *tagPtr2;
+       int prio;
+
+       if ((argc != 4) && (argc != 5)) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " tag raise tagName ?aboveThis?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       tagPtr = FindTag(interp, textPtr, argv[3]);
+       if (tagPtr == NULL) {
+           return TCL_ERROR;
+       }
+       if (argc == 5) {
+           tagPtr2 = FindTag(interp, textPtr, argv[4]);
+           if (tagPtr2 == NULL) {
+               return TCL_ERROR;
+           }
+           if (tagPtr->priority <= tagPtr2->priority) {
+               prio = tagPtr2->priority;
+           } else {
+               prio = tagPtr2->priority + 1;
+           }
+       } else {
+           prio = textPtr->numTags-1;
+       }
+       ChangeTagPriority(textPtr, tagPtr, prio);
+       TkTextRedrawTag(textPtr, 0, 0, TkBTreeNumLines(textPtr->tree),
+               0, tagPtr, 1);
+    } else if ((c == 'r') && (strncmp(argv[2], "ranges", length) == 0)
+           && (length >= 3)) {
+       TkTextSearch tSearch;
+       char position[POS_CHARS];
+
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # args: should be \"",
+                   argv[0], " tag ranges tagName\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       tagPtr = FindTag((Tcl_Interp *) NULL, textPtr, argv[3]);
+       if (tagPtr == NULL) {
+           return TCL_OK;
+       }
+       TkBTreeStartSearch(textPtr->tree, 0, 0, TkBTreeNumLines(textPtr->tree),
+               0, tagPtr, &tSearch);
+       while (TkBTreeNextTag(&tSearch)) {
+           TkTextPrintIndex(tSearch.line1, tSearch.ch1, position);
+           Tcl_AppendElement(interp, position, 0);
+       }
+    } else if ((c == 'r') && (strncmp(argv[2], "remove", length) == 0)
+           && (length >= 2)) {
+       fullOption = "remove";
+       addTag = 0;
+       goto addAndRemove;
+    } else {
+       Tcl_AppendResult(interp, "bad tag option \"", argv[2],
+               "\":  must be add, bind, configure, delete, lower, ",
+               "names, nextrange, raise, ranges, or remove",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextCreateTag --
+ *
+ *     Find the record describing a tag within a given text widget,
+ *     creating a new record if one doesn't already exist.
+ *
+ * Results:
+ *     The return value is a pointer to the TkTextTag record for tagName.
+ *
+ * Side effects:
+ *     A new tag record is created if there isn't one already defined
+ *     for tagName.
+ *
+ *----------------------------------------------------------------------
+ */
+
+TkTextTag *
+TkTextCreateTag(textPtr, tagName)
+    TkText *textPtr;           /* Widget in which tag is being used. */
+    char *tagName;             /* Name of desired tag. */
+{
+    register TkTextTag *tagPtr;
+    Tcl_HashEntry *hPtr;
+    int new;
+
+    hPtr = Tcl_CreateHashEntry(&textPtr->tagTable, tagName, &new);
+    if (!new) {
+       return (TkTextTag *) Tcl_GetHashValue(hPtr);
+    }
+
+    /*
+     * No existing entry.  Create a new one, initialize it, and add a
+     * pointer to it to the hash table entry.
+     */
+
+    tagPtr = (TkTextTag *) ckalloc(sizeof(TkTextTag));
+    tagPtr->name = Tcl_GetHashKey(&textPtr->tagTable, hPtr);
+    tagPtr->priority = textPtr->numTags;
+    tagPtr->border = NULL;
+    tagPtr->borderWidth = 1;
+    tagPtr->relief = TK_RELIEF_FLAT;
+    tagPtr->bgStipple = None;
+    tagPtr->fgColor = NULL;
+    tagPtr->fontPtr = NULL;
+    tagPtr->fgStipple = None;
+    tagPtr->underline = 0;
+    textPtr->numTags++;
+    Tcl_SetHashValue(hPtr, tagPtr);
+    return tagPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * FindTag --
+ *
+ *     See if tag is defined for a given widget.
+ *
+ * Results:
+ *     If tagName is defined in textPtr, a pointer to its TkTextTag
+ *     structure is returned.  Otherwise NULL is returned and an
+ *     error message is recorded in interp->result unless interp
+ *     is NULL.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static TkTextTag *
+FindTag(interp, textPtr, tagName)
+    Tcl_Interp *interp;                /* Interpreter to use for error message;
+                                * if NULL, then don't record an error
+                                * message. */
+    TkText *textPtr;           /* Widget in which tag is being used. */
+    char *tagName;             /* Name of desired tag. */
+{
+    Tcl_HashEntry *hPtr;
+
+    hPtr = Tcl_FindHashEntry(&textPtr->tagTable, tagName);
+    if (hPtr != NULL) {
+       return (TkTextTag *) Tcl_GetHashValue(hPtr);
+    }
+    if (interp != NULL) {
+       Tcl_AppendResult(interp, "tag \"", tagName,
+               "\" isn't defined in text widget", (char *) NULL);
+    }
+    return NULL;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextFreeTag --
+ *
+ *     This procedure is called when a tag is deleted to free up the
+ *     memory and other resources associated with the tag.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Memory and other resources are freed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkTextFreeTag(tagPtr)
+    register TkTextTag *tagPtr;                /* Tag being deleted. */
+{
+    if (tagPtr->border != None) {
+       Tk_Free3DBorder(tagPtr->border);
+    }
+    if (tagPtr->bgStipple != None) {
+       Tk_FreeBitmap(tagPtr->bgStipple);
+    }
+    if (tagPtr->fgColor != None) {
+       Tk_FreeColor(tagPtr->fgColor);
+    }
+    if (tagPtr->fgStipple != None) {
+       Tk_FreeBitmap(tagPtr->fgStipple);
+    }
+    ckfree((char *) tagPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * SortTags --
+ *
+ *     This procedure sorts an array of tag pointers in increasing
+ *     order of priority, optimizing for the common case where the
+ *     array is small.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+SortTags(numTags, tagArrayPtr)
+    int numTags;               /* Number of tag pointers at *tagArrayPtr. */
+    TkTextTag **tagArrayPtr;   /* Pointer to array of pointers. */
+{
+    int i, j, prio;
+    register TkTextTag **tagPtrPtr;
+    TkTextTag **maxPtrPtr, *tmp;
+
+    if (numTags < 2) {
+       return;
+    }
+    if (numTags < 20) {
+       for (i = numTags-1; i > 0; i--, tagArrayPtr++) {
+           maxPtrPtr = tagPtrPtr = tagArrayPtr;
+           prio = tagPtrPtr[0]->priority;
+           for (j = i, tagPtrPtr++; j > 0; j--, tagPtrPtr++) {
+               if (tagPtrPtr[0]->priority < prio) {
+                   prio = tagPtrPtr[0]->priority;
+                   maxPtrPtr = tagPtrPtr;
+               }
+           }
+           tmp = *maxPtrPtr;
+           *maxPtrPtr = *tagArrayPtr;
+           *tagArrayPtr = tmp;
+       }
+    } else {
+       qsort((VOID *) tagArrayPtr, numTags, sizeof (TkTextTag *),
+                   TagSortProc);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TagSortProc --
+ *
+ *     This procedure is called by qsort when sorting an array of
+ *     tags in priority order.
+ *
+ * Results:
+ *     The return value is -1 if the first argument should be before
+ *     the second element (i.e. it has lower priority), 0 if it's
+ *     equivalent (this should never happen!), and 1 if it should be
+ *     after the second element.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+TagSortProc(first, second)
+    CONST VOID *first, *second;                /* Elements to be compared. */
+{
+    TkTextTag *tagPtr1, *tagPtr2;
+
+    tagPtr1 = * (TkTextTag **) first;
+    tagPtr2 = * (TkTextTag **) second;
+    return tagPtr1->priority - tagPtr2->priority;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * ChangeTagPriority --
+ *
+ *     This procedure changes the priority of a tag by modifying
+ *     its priority and all other ones whose priority is affected
+ *     by the change.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Priorities may be changed for some or all of the tags in
+ *     textPtr.  The tags will be arranged so that there is exactly
+ *     one tag at each priority level between 0 and textPtr->numTags-1,
+ *     with tagPtr at priority "prio".
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+ChangeTagPriority(textPtr, tagPtr, prio)
+    TkText *textPtr;                   /* Information about text widget. */
+    TkTextTag *tagPtr;                 /* Tag whose priority is to be
+                                        * changed. */
+    int prio;                          /* New priority for tag. */
+{
+    int low, high, delta;
+    register TkTextTag *tagPtr2;
+    Tcl_HashEntry *hPtr;
+    Tcl_HashSearch search;
+
+    if (prio < 0) {
+       prio = 0;
+    }
+    if (prio >= textPtr->numTags) {
+       prio = textPtr->numTags-1;
+    }
+    if (prio == tagPtr->priority) {
+       return;
+    } else if (prio < tagPtr->priority) {
+       low = prio;
+       high = tagPtr->priority-1;
+       delta = 1;
+    } else {
+       low = tagPtr->priority+1;
+       high = prio;
+       delta = -1;
+    }
+    for (hPtr = Tcl_FirstHashEntry(&textPtr->tagTable, &search);
+           hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {
+       tagPtr2 = (TkTextTag *) Tcl_GetHashValue(hPtr);
+       if ((tagPtr2->priority >= low) && (tagPtr2->priority <= high)) {
+           tagPtr2->priority += delta;
+       }
+    }
+    tagPtr->priority = prio;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkTextBindProc --
+ *
+ *     This procedure is invoked by the Tk dispatcher to handle
+ *     events associated with bindings on items.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Depends on the command invoked as part of the binding
+ *     (if there was any).
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkTextBindProc(clientData, eventPtr)
+    ClientData clientData;             /* Pointer to canvas structure. */
+    XEvent *eventPtr;                  /* Pointer to X event that just
+                                        * happened. */
+{
+    TkText *textPtr = (TkText *) clientData;
+    int repick  = 0;
+
+    Tk_Preserve((ClientData) textPtr);
+
+    /*
+     * This code simulates grabs for mouse buttons by refusing to
+     * pick a new current character between the time a mouse button goes
+     * down and the time when the last mouse button is released.
+     */
+
+    if (eventPtr->type == ButtonPress) {
+       textPtr->flags |= BUTTON_DOWN;
+    } else if (eventPtr->type == ButtonRelease) {
+       int mask;
+
+       switch (eventPtr->xbutton.button) {
+           case Button1:
+               mask = Button1Mask;
+               break;
+           case Button2:
+               mask = Button2Mask;
+               break;
+           case Button3:
+               mask = Button3Mask;
+               break;
+           case Button4:
+               mask = Button4Mask;
+               break;
+           case Button5:
+               mask = Button5Mask;
+               break;
+           default:
+               mask = 0;
+               break;
+       }
+       if ((eventPtr->xbutton.state & (Button1Mask|Button2Mask
+               |Button3Mask|Button4Mask|Button5Mask)) == mask) {
+           textPtr->flags &= ~BUTTON_DOWN;
+           repick = 1;
+       }
+    } else if ((eventPtr->type == EnterNotify)
+           || (eventPtr->type == LeaveNotify)) {
+       TkTextPickCurrent(textPtr, eventPtr);
+       goto done;
+    } else if (eventPtr->type == MotionNotify) {
+       TkTextPickCurrent(textPtr, eventPtr);
+    }
+    TextDoEvent(textPtr, eventPtr);
+    if (repick) {
+       unsigned int oldState;
+
+       oldState = eventPtr->xbutton.state;
+       eventPtr->xbutton.state &= ~(Button1Mask|Button2Mask
+               |Button3Mask|Button4Mask|Button5Mask);
+       TkTextPickCurrent(textPtr, eventPtr);
+       eventPtr->xbutton.state = oldState;
+    }
+
+    done:
+    Tk_Release((ClientData) textPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkTextPickCurrent --
+ *
+ *     Find the topmost item in a canvas that contains a given
+ *     location and mark the the current item.  If the current
+ *     item has changed, generate a fake exit event on the old
+ *     current item and a fake enter event on the new current
+ *     item.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The current item for textPtr may change.  If it does,
+ *     then the commands associated with item entry and exit
+ *     could do just about anything.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkTextPickCurrent(textPtr, eventPtr)
+    register TkText *textPtr;          /* Text widget in which to select
+                                        * current character. */
+    XEvent *eventPtr;                  /* Event describing location of
+                                        * mouse cursor.  Must be EnterWindow,
+                                        * LeaveWindow, ButtonRelease, or
+                                        * MotionNotify. */
+{
+    TkTextLine *linePtr;
+    int ch;
+
+    /*
+     * If a button is down, then don't do anything at all;  we'll be
+     * called again when all buttons are up, and we can repick then.
+     * This implements a form of mouse grabbing.
+     */
+
+    if (textPtr->flags & BUTTON_DOWN) {
+       return;
+    }
+
+    /*
+     * Save information about this event in the widget for use if we have
+     * to synthesize more enter and leave events later (e.g. because a
+     * character was deleting, causing a new character to be underneath
+     * the mouse cursor).  Also translate MotionNotify events into
+     * EnterNotify events, since that's what gets reported to event
+     * handlers when the current character changes.
+     */
+
+    if (eventPtr != &textPtr->pickEvent) {
+       if ((eventPtr->type == MotionNotify)
+               || (eventPtr->type == ButtonRelease)) {
+           textPtr->pickEvent.xcrossing.type = EnterNotify;
+           textPtr->pickEvent.xcrossing.serial = eventPtr->xmotion.serial;
+           textPtr->pickEvent.xcrossing.send_event
+                   = eventPtr->xmotion.send_event;
+           textPtr->pickEvent.xcrossing.display = eventPtr->xmotion.display;
+           textPtr->pickEvent.xcrossing.window = eventPtr->xmotion.window;
+           textPtr->pickEvent.xcrossing.root = eventPtr->xmotion.root;
+           textPtr->pickEvent.xcrossing.subwindow = None;
+           textPtr->pickEvent.xcrossing.time = eventPtr->xmotion.time;
+           textPtr->pickEvent.xcrossing.x = eventPtr->xmotion.x;
+           textPtr->pickEvent.xcrossing.y = eventPtr->xmotion.y;
+           textPtr->pickEvent.xcrossing.x_root = eventPtr->xmotion.x_root;
+           textPtr->pickEvent.xcrossing.y_root = eventPtr->xmotion.y_root;
+           textPtr->pickEvent.xcrossing.mode = NotifyNormal;
+           textPtr->pickEvent.xcrossing.detail = NotifyNonlinear;
+           textPtr->pickEvent.xcrossing.same_screen
+                   = eventPtr->xmotion.same_screen;
+           textPtr->pickEvent.xcrossing.focus = False;
+           textPtr->pickEvent.xcrossing.state = eventPtr->xmotion.state;
+       } else  {
+           textPtr->pickEvent = *eventPtr;
+       }
+    }
+
+    linePtr = NULL;
+    if (textPtr->pickEvent.type != LeaveNotify) {
+       linePtr = TkTextCharAtLoc(textPtr, textPtr->pickEvent.xcrossing.x,
+               textPtr->pickEvent.xcrossing.y, &ch);
+    }
+
+    /*
+     * Simulate a LeaveNotify event on the previous current character and
+     * an EnterNotify event on the new current character.  Also, move the
+     * "current" mark to its new place.
+     */
+
+    if (textPtr->flags & IN_CURRENT) {
+       if ((linePtr == textPtr->currentAnnotPtr->linePtr)
+               && (ch == textPtr->currentAnnotPtr->ch)) {
+           return;
+       }
+    } else {
+       if (linePtr == NULL) {
+           return;
+       }
+    }
+    if (textPtr->flags & IN_CURRENT) {
+       XEvent event;
+
+       event = textPtr->pickEvent;
+       event.type = LeaveNotify;
+       TextDoEvent(textPtr, &event);
+       textPtr->flags &= ~IN_CURRENT;
+    }
+    if (linePtr != NULL) {
+       XEvent event;
+
+       TkBTreeRemoveAnnotation(textPtr->currentAnnotPtr);
+       textPtr->currentAnnotPtr->linePtr = linePtr;
+       textPtr->currentAnnotPtr->ch = ch;
+       TkBTreeAddAnnotation(textPtr->currentAnnotPtr);
+       event = textPtr->pickEvent;
+       event.type = EnterNotify;
+       TextDoEvent(textPtr, &event);
+       textPtr->flags |= IN_CURRENT;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkTextUnpickCurrent --
+ *
+ *     This procedure is called when the "current" character is
+ *     deleted:  it synthesizes a "leave" event for the character.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A binding associated with one of the tags on the current
+ *     character may be triggered.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkTextUnpickCurrent(textPtr)
+    TkText *textPtr;           /* Text widget information. */
+{
+    if (textPtr->flags & IN_CURRENT) {
+       XEvent event;
+
+       event = textPtr->pickEvent;
+       event.type = LeaveNotify;
+       TextDoEvent(textPtr, &event);
+       textPtr->flags &= ~IN_CURRENT;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TextDoEvent --
+ *
+ *     This procedure is called to invoke binding processing
+ *     for a new event that is associated with the current character
+ *     for a text widget.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Depends on the bindings for the text.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+TextDoEvent(textPtr, eventPtr)
+    TkText *textPtr;                   /* Text widget in which event
+                                        * occurred. */
+    XEvent *eventPtr;                  /* Real or simulated X event that
+                                        * is to be processed. */
+{
+    TkTextTag **tagArrayPtr, **p1, **p2, *tmp;
+    int numTags;
+
+    if (textPtr->bindingTable == NULL) {
+       return;
+    }
+
+    /*
+     * Set up an array containing all of the tags that are associated
+     * with the current character.  This array will be used to look
+     * for bindings.  If there are no tags then there can't be any
+     * bindings.
+     */
+
+    tagArrayPtr = TkBTreeGetTags(textPtr->tree,
+           textPtr->currentAnnotPtr->linePtr, textPtr->currentAnnotPtr->ch,
+           &numTags);
+    if (numTags == 0) {
+       return;
+    }
+
+    /*
+     * Sort the array of tags.  SortTags sorts it backwards, so after it
+     * returns we have to reverse the order in the array.
+     */
+
+    SortTags(numTags, tagArrayPtr);
+    for (p1 = tagArrayPtr, p2 = tagArrayPtr + numTags - 1;
+           p1 < p2;  p1++, p2--) {
+       tmp = *p1;
+       *p1 = *p2;
+       *p2 = tmp;
+    }
+
+    /*
+     * Invoke the binding system, then free up the tag array.
+     */
+
+    Tk_BindEvent(textPtr->bindingTable, eventPtr, textPtr->tkwin,
+           numTags, (ClientData *) tagArrayPtr);
+    ckfree((char *) tagArrayPtr);
+}
diff --git a/src/tk/tkwindow.c b/src/tk/tkwindow.c
new file mode 100644 (file)
index 0000000..77e0b77
--- /dev/null
@@ -0,0 +1,1598 @@
+/* 
+ * tkWindow.c --
+ *
+ *     This file provides basic window-manipulation procedures,
+ *     which are equivalent to procedures in Xlib (and even
+ *     invoke them) but also maintain the local Tk_Window
+ *     structure.
+ *
+ * Copyright 1989-1992 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkWindow.c,v 1.92 92/08/21 11:42:44 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tkint.h"
+
+/*
+ * Global absolute file name:
+ */
+char *TK_Library = TK_LIBRARY;
+
+/*
+ * Count of open displays.
+ */
+int tk_Displays;
+
+/*
+ * Count of number of main windows currently open in this process.
+ */
+
+int tk_NumMainWindows;
+
+/*
+ * Added by dhopkins for OLPC Micropolis gtk.Socket integration. 
+ */
+
+Window tk_RootWindow = 0;
+
+/*
+ * List of all displays currently in use.
+ */
+
+TkDisplay *tkDisplayList = NULL;
+
+/*
+ * Have statics in this module been initialized?
+ */
+
+static initialized = 0;
+
+/*
+ * Context information used to map from X window id's to
+ * TkWindow structures (during event handling, for example):
+ */
+
+XContext tkWindowContext;
+
+/*
+ * The variables below hold several uid's that are used in many places
+ * in the toolkit.
+ */
+
+Tk_Uid tkDisabledUid = NULL;
+Tk_Uid tkActiveUid = NULL;
+Tk_Uid tkNormalUid = NULL;
+
+/*
+ * Default values for "changes" and "atts" fields of TkWindows.  Note
+ * that Tk always requests all events for all windows, except StructureNotify
+ * events on internal windows:  these events are generated internally.
+ */
+
+static XWindowChanges defChanges = {
+    0, 0, 1, 1, 0, 0, Above
+};
+#define ALL_EVENTS_MASK \
+    KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask| \
+    EnterWindowMask|LeaveWindowMask|PointerMotionMask|ExposureMask| \
+    VisibilityChangeMask|SubstructureNotifyMask| \
+    FocusChangeMask|PropertyChangeMask|ColormapChangeMask
+static XSetWindowAttributes defAtts= {
+    None,                      /* background_pixmap */
+    0,                         /* background_pixel */
+    CopyFromParent,            /* border_pixmap */
+    0,                         /* border_pixel */
+    ForgetGravity,             /* bit_gravity */
+    NorthWestGravity,          /* win_gravity */
+    NotUseful,                 /* backing_store */
+    ~0,                                /* backing_planes */
+    0,                         /* backing_pixel */
+    False,                     /* save_under */
+    ALL_EVENTS_MASK,           /* event_mask */
+    0,                         /* do_not_propagate_mask */
+    False,                     /* override_redirect */
+    CopyFromParent,            /* colormap */
+    None                       /* cursor */
+};
+
+/*
+ * The following structure defines all of the commands supported by
+ * Tk, and the C procedures that execute them.
+ */
+
+typedef struct {
+    char *name;                        /* Name of command. */
+    int (*cmdProc) _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp,
+           int argc, char **argv));
+                               /* Command procedure. */
+} TkCmd;
+
+TkCmd commands[] = {
+    /*
+     * Commands that are part of the intrinsics:
+     */
+
+    {"after",          Tk_AfterCmd},
+    {"bind",           Tk_BindCmd},
+    {"destroy",                Tk_DestroyCmd},
+    {"focus",          Tk_FocusCmd},
+    {"grab",           Tk_GrabCmd},
+    {"option",         Tk_OptionCmd},
+    {"pack",           Tk_PackCmd},
+    {"place",          Tk_PlaceCmd},
+    {"selection",      Tk_SelectionCmd},
+    {"tkwait",         Tk_TkwaitCmd},
+    {"update",         Tk_UpdateCmd},
+    {"winfo",          Tk_WinfoCmd},
+    {"wm",             Tk_WmCmd},
+    {"accept",         Tcp_AcceptCmd},
+    {"shutdown",       Tcp_ShutdownCmd},
+    {"connect",                Tcp_ConnectCmd},
+    {"filehandler",    Tcp_FileHandlerCmd},
+
+    /*
+     * Widget-creation commands.
+     */
+    {"button",         Tk_ButtonCmd},
+    {"canvas",         Tk_CanvasCmd},
+    {"checkbutton",    Tk_ButtonCmd},
+    {"entry",          Tk_EntryCmd},
+    {"frame",          Tk_FrameCmd},
+    {"label",          Tk_ButtonCmd},
+    {"listbox",                Tk_ListboxCmd},
+    {"menu",           Tk_MenuCmd},
+    {"menubutton",     Tk_MenubuttonCmd},
+    {"message",                Tk_MessageCmd},
+    {"radiobutton",    Tk_ButtonCmd},
+    {"scale",          Tk_ScaleCmd},
+    {"scrollbar",      Tk_ScrollbarCmd},
+    {"text",           Tk_TextCmd},
+    {"toplevel",       Tk_FrameCmd},
+    {(char *) NULL,    (int (*)()) NULL}
+};
+
+/*
+ * Forward declarations to procedures defined later in this file:
+ */
+
+static Tk_Window       CreateTopLevelWindow _ANSI_ARGS_((Tcl_Interp *interp,
+                           Tk_Window parent, char *name, char *screenName));
+static void            DoConfigureNotify _ANSI_ARGS_((TkWindow *winPtr));
+static TkDisplay *     GetScreen _ANSI_ARGS_((Tcl_Interp *interp,
+                           char *screenName, int *screenPtr));
+static int             NameWindow _ANSI_ARGS_((Tcl_Interp *interp,
+                           TkWindow *winPtr, TkWindow *parentPtr,
+                           char *name));
+static TkWindow        *       NewWindow _ANSI_ARGS_((TkDisplay *dispPtr,
+                           int screenNum));
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * CreateTopLevelWindow --
+ *
+ *     Make a new window that will be at top-level (its parent will
+ *     be the root window of a screen).
+ *
+ * Results:
+ *     The return value is a token for the new window, or NULL if
+ *     an error prevented the new window from being created.  If
+ *     NULL is returned, an error message will be left in
+ *     interp->result.
+ *
+ * Side effects:
+ *     A new window structure is allocated locally.  An X
+ *     window is NOT initially created, but will be created
+ *     the first time the window is mapped.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static Tk_Window
+CreateTopLevelWindow(interp, parent, name, screenName)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    Tk_Window parent;          /* Token for logical parent of new window
+                                * (used for naming, options, etc.).  May
+                                * be NULL. */
+    char *name;                        /* Name for new window;  if parent is
+                                * non-NULL, must be unique among parent's
+                                * children. */
+    char *screenName;          /* Name of screen on which to create
+                                * window.  NULL means use DISPLAY environment
+                                * variable to determine.  Empty string means
+                                * use parent's screen, or DISPLAY if no
+                                * parent. */
+{
+    register TkWindow *winPtr;
+    register TkDisplay *dispPtr;
+    int screenId;
+
+    if (!initialized) {
+       initialized = 1;
+       tkWindowContext = XUniqueContext();
+       tkActiveUid = Tk_GetUid("active");
+       tkDisabledUid = Tk_GetUid("disabled");
+       tkNormalUid = Tk_GetUid("normal");
+    }
+
+    if ((parent != NULL) && (screenName != NULL) && (screenName[0] == '\0')) {
+       dispPtr = ((TkWindow *) parent)->dispPtr;
+       screenId = Tk_ScreenNumber(parent);
+    } else {
+       dispPtr = GetScreen(interp, screenName, &screenId);
+       if (dispPtr == NULL) {
+           return (Tk_Window) NULL;
+       }
+    }
+
+    winPtr = NewWindow(dispPtr, screenId);
+
+    /*
+     * Internal windows don't normally ask for StructureNotify events,
+     * since we can generate them internally.  However, for top-level
+     * windows we need to as for the events because the window could
+     * be manipulated externally.
+     */
+
+    winPtr->atts.event_mask |= StructureNotifyMask;
+
+    /*
+     * (Need to set the TK_TOP_LEVEL flag immediately here;  otherwise
+     * Tk_DestroyWindow will core dump if it is called before the flag
+     * has been set.)
+     */
+
+    winPtr->flags |= TK_TOP_LEVEL;
+    if (parent != NULL) {
+       if (NameWindow(interp, winPtr, (TkWindow *) parent, name) != TCL_OK) {
+           Tk_DestroyWindow((Tk_Window) winPtr);
+           return (Tk_Window) NULL;
+       }
+    }
+    TkWmNewWindow(winPtr);
+    return (Tk_Window) winPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * GetScreen --
+ *
+ *     Given a string name for a display-plus-screen, find the
+ *     TkDisplay structure for the display and return the screen
+ *     number too.
+ *
+ * Results:
+ *     The return value is a pointer to information about the display,
+ *     or NULL if the display couldn't be opened.  In this case, an
+ *     error message is left in interp->result.  The location at
+ *     *screenPtr is overwritten with the screen number parsed from
+ *     screenName.
+ *
+ * Side effects:
+ *     A new connection is opened to the display if there is no
+ *     connection already.  A new TkDisplay data structure is also
+ *     setup, if necessary.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static TkDisplay *
+GetScreen(interp, screenName, screenPtr)
+    Tcl_Interp *interp;                /* Place to leave error message. */
+    char *screenName;          /* Name for screen.  NULL or empty means
+                                * use DISPLAY envariable. */
+    int *screenPtr;            /* Where to store screen number. */
+{
+    register TkDisplay *dispPtr;
+    char *p;
+    int length, screenId;
+
+    /*
+     * Separate the screen number from the rest of the display
+     * name.  ScreenName is assumed to have the syntax
+     * <display>.<screen> with the dot and the screen being
+     * optional.
+     */
+
+    if ((screenName == NULL) || (screenName[0] == '\0')) {
+       screenName = getenv("DISPLAY");
+       if (screenName == NULL) {
+           interp->result =
+                   "no display name and no $DISPLAY environment variable";
+           return (TkDisplay *) NULL;
+       }
+    }
+    length = strlen(screenName);
+    screenId = 0;
+    p = screenName+length-1;
+    while (isdigit(*p) && (p != screenName)) {
+       p--;
+    }
+    if ((*p == '.') && (p[1] != '\0')) {
+       length = p - screenName;
+       screenId = strtoul(p+1, (char **) NULL, 10);
+    }
+
+    /*
+     * See if we already have a connection to this display.  If not,
+     * then open a new connection.
+     */
+
+    for (dispPtr = tkDisplayList; ; dispPtr = dispPtr->nextPtr) {
+       if (dispPtr == NULL) {
+           Display *display = NULL;
+
+           display = XOpenDisplay(screenName);
+
+           if (display == NULL) {
+               Tcl_AppendResult(interp, "couldn't connect to display \"",
+                       screenName, "\"", (char *) NULL);
+               return (TkDisplay *) NULL;
+           }
+           if (getenv("XSYNCHRONIZE") != NULL) {
+             XSynchronize(display, 1);
+           }
+           tk_Displays++;
+           dispPtr = (TkDisplay *) ckalloc(sizeof(TkDisplay));
+           dispPtr->display = display;
+           dispPtr->nextPtr = tkDisplayList;
+           dispPtr->name = (char *) ckalloc((unsigned) (length+1));
+           dispPtr->lastEventTime = CurrentTime;
+           strncpy(dispPtr->name, screenName, length);
+           dispPtr->mouseMainPtr = NULL;
+           dispPtr->name[length] = '\0';
+           dispPtr->symsPerCode = 0;
+           dispPtr->errorPtr = NULL;
+           dispPtr->deleteCount = 0;
+           dispPtr->commWindow = NULL;
+           dispPtr->selectionOwner = NULL;
+           dispPtr->selectionSerial = 0;
+           dispPtr->multipleAtom = None;
+           dispPtr->atomInit = 0;
+           dispPtr->cursorFont = None;
+           dispPtr->grabWinPtr = NULL;
+           dispPtr->ungrabWinPtr = NULL;
+           dispPtr->buttonWinPtr = NULL;
+           dispPtr->pointerWinPtr = NULL;
+           dispPtr->serverWinPtr = NULL;
+           dispPtr->grabFlags = 0;
+           dispPtr->focusPtr = NULL;
+           tkDisplayList = dispPtr;
+           Tk_CreateFileHandler(ConnectionNumber(display),
+                   TK_READABLE, (void (*)()) NULL,
+                   (ClientData) display);
+           break;
+       }
+       if ((strncmp(dispPtr->name, screenName, length) == 0)
+               && (dispPtr->name[length] == '\0')) {
+           break;
+       }
+    }
+    if (screenId >= ScreenCount(dispPtr->display)) {
+       sprintf(interp->result, "bad screen number \"%d\"", screenId);
+       return (TkDisplay *) NULL;
+    }
+    *screenPtr = screenId;
+    return dispPtr;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * NewWindow --
+ *
+ *     This procedure creates and initializes a TkWindow structure.
+ *
+ * Results:
+ *     The return value is a pointer to the new window.
+ *
+ * Side effects:
+ *     A new window structure is allocated and all its fields are
+ *     initialized.
+ *
+ *--------------------------------------------------------------
+ */
+
+static TkWindow *
+NewWindow(dispPtr, screenNum)
+    TkDisplay *dispPtr;                /* Display associated with new window. */
+    int screenNum;             /* Index of screen for new window. */
+{
+    register TkWindow *winPtr;
+
+    winPtr = (TkWindow *) ckalloc(sizeof(TkWindow));
+    winPtr->display = dispPtr->display;
+    winPtr->dispPtr = dispPtr;
+    winPtr->screenNum = screenNum;
+    winPtr->window = None;
+    winPtr->childList = NULL;
+    winPtr->parentPtr = NULL;
+    winPtr->nextPtr = NULL;
+    winPtr->mainPtr = NULL;
+    winPtr->pathName = NULL;
+    winPtr->nameUid = NULL;
+    winPtr->classUid = NULL;
+    winPtr->changes = defChanges;
+    winPtr->dirtyChanges = CWX|CWY|CWWidth|CWHeight|CWBorderWidth;
+    winPtr->atts = defAtts;
+    winPtr->dirtyAtts = CWEventMask;
+    winPtr->flags = 0;
+    winPtr->handlerList = NULL;
+    winPtr->focusProc = NULL;
+    winPtr->focusData = NULL;
+    winPtr->optionLevel = -1;
+    winPtr->selHandlerList = NULL;
+    winPtr->selClearProc = NULL;
+    winPtr->selClearData = NULL;
+    winPtr->geomProc = NULL;
+    winPtr->geomData = NULL;
+    winPtr->reqWidth = winPtr->reqHeight = 0;
+    winPtr->internalBorderWidth = 0;
+    winPtr->wmInfoPtr = NULL;
+    return winPtr;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * NameWindow --
+ *
+ *     This procedure is invoked to give a window a name and insert
+ *     the window into the hierarchy associated with a particular
+ *     application.
+ *
+ * Results:
+ *     A standard Tcl return value.
+ *
+ * Side effects:
+ *      See above.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+NameWindow(interp, winPtr, parentPtr, name)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    register TkWindow *winPtr; /* Window that is to be named and inserted. */
+    TkWindow *parentPtr;       /* Pointer to logical parent for winPtr
+                                * (used for naming, options, etc.). */
+    char *name;                        /* Name for winPtr;   must be unique among
+                                * parentPtr's children. */
+{
+#define FIXED_SIZE 200
+    char staticSpace[FIXED_SIZE];
+    char *pathName;
+    int new;
+    Tcl_HashEntry *hPtr;
+    int length1, length2;
+
+    /*
+     * Setup all the stuff except name right away, then do the name stuff
+     * last.  This is so that if the name stuff fails, everything else
+     * will be properly initialized (needed to destroy the window cleanly
+     * after the naming failure).
+     */
+    winPtr->parentPtr = parentPtr;
+    winPtr->nextPtr = parentPtr->childList;
+    parentPtr->childList = winPtr;
+    winPtr->mainPtr = parentPtr->mainPtr;
+    winPtr->nameUid = Tk_GetUid(name);
+
+    /*
+     * To permit names of arbitrary length, must be prepared to malloc
+     * a buffer to hold the new path name.  To run fast in the common
+     * case where names are short, use a fixed-size buffer on the
+     * stack.
+     */
+
+    length1 = strlen(parentPtr->pathName);
+    length2 = strlen(name);
+    if ((length1+length2+2) <= FIXED_SIZE) {
+       pathName = staticSpace;
+    } else {
+       pathName = (char *) ckalloc((unsigned) (length1+length2+2));
+    }
+    if (length1 == 1) {
+       pathName[0] = '.';
+       strcpy(pathName+1, name);
+    } else {
+       strcpy(pathName, parentPtr->pathName);
+       pathName[length1] = '.';
+       strcpy(pathName+length1+1, name);
+    }
+    hPtr = Tcl_CreateHashEntry(&parentPtr->mainPtr->nameTable, pathName, &new);
+    if (pathName != staticSpace) {
+       ckfree(pathName);
+    }
+    if (!new) {
+       Tcl_AppendResult(interp, "window name \"", name,
+               "\" already exists in parent", (char *) NULL);
+       return TCL_ERROR;
+    }
+    Tcl_SetHashValue(hPtr, winPtr);
+    winPtr->pathName = Tcl_GetHashKey(&parentPtr->mainPtr->nameTable, hPtr);
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_CreateMainWindow --
+ *
+ *     Make a new main window.  A main window is a special kind of
+ *     top-level window used as the outermost window in an
+ *     application.
+ *
+ * Results:
+ *     The return value is a token for the new window, or NULL if
+ *     an error prevented the new window from being created.  If
+ *     NULL is returned, an error message will be left in
+ *     interp->result.
+ *
+ * Side effects:
+ *     A new window structure is allocated locally;  "interp" is
+ *     associated with the window and registered for "send" commands
+ *     under "baseName".  BaseName may be extended with an instance
+ *     number in the form "#2" if necessary to make it globally
+ *     unique.  Tk-related commands are bound into interp.  An X
+ *     window is NOT initially created, but will be created the
+ *     first time the window is mapped.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Tk_Window
+Tk_CreateMainWindow(interp, screenName, baseName)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
+    char *screenName;          /* Name of screen on which to create
+                                * window.  Empty or NULL string means
+                                * use DISPLAY environment variable. */
+    char *baseName;            /* Base name for application;  usually of the
+                                * form "prog instance". */
+{
+    Tk_Window tkwin;
+    int result, dummy;
+    Tcl_HashEntry *hPtr;
+    register TkMainInfo *mainPtr;
+    register TkWindow *winPtr;
+    register TkCmd *cmdPtr;
+
+    /*
+     * Create the basic TkWindow structure.
+     */
+
+    tkwin = CreateTopLevelWindow(interp, (Tk_Window) NULL, baseName,
+           screenName);
+    if (tkwin == NULL) {
+       return NULL;
+    }
+
+    /*
+     * Create the TkMainInfo structure for this application, and set
+     * up name-related information for the new window.
+     */
+
+    winPtr = (TkWindow *) tkwin;
+    mainPtr = (TkMainInfo *) ckalloc(sizeof(TkMainInfo));
+    mainPtr->winPtr = winPtr;
+    mainPtr->interp = interp;
+    Tcl_InitHashTable(&mainPtr->nameTable, TCL_STRING_KEYS);
+    mainPtr->bindingTable = Tk_CreateBindingTable(interp);
+/* XXX: FOCUS */
+/*    mainPtr->focusPtr = NULL; */
+    mainPtr->optionRootPtr = NULL;
+    winPtr->mainPtr = mainPtr;
+    hPtr = Tcl_CreateHashEntry(&mainPtr->nameTable, ".", &dummy);
+    Tcl_SetHashValue(hPtr, winPtr);
+    winPtr->pathName = Tcl_GetHashKey(&mainPtr->nameTable, hPtr);
+
+    /*
+     * Register the interpreter for "send" purposes.  If baseName isn't
+     * already unique, find a unique suffix to add to it to make it
+     * unique.  Change the window's name to contain the suffix.
+     */
+
+    result = Tk_RegisterInterp(interp, baseName, tkwin);
+    if (result == TCL_OK) {
+       winPtr->nameUid = Tk_GetUid(baseName);
+    } else {
+       char newName[110];
+       int i;
+
+       for (i = 2; ; i++) {
+           sprintf(newName, "%.100s #%d", baseName, i);
+           Tcl_SetResult(interp, (char *) NULL, TCL_STATIC);
+           result = Tk_RegisterInterp(interp, newName, tkwin);
+           if (result == TCL_OK) {
+               break;
+           }
+           if (i >= 100) {
+               Tcl_SetResult(interp,
+                       "couldn't generate unique name to register application",
+                       TCL_STATIC);
+               Tk_DestroyWindow(tkwin);
+           }
+       }
+       winPtr->nameUid = Tk_GetUid(newName);
+    }
+
+    /*
+     * Bind in Tk's commands.
+     */
+
+    for (cmdPtr = commands; cmdPtr->name != NULL; cmdPtr++) {
+       Tcl_CreateCommand(interp, cmdPtr->name, cmdPtr->cmdProc,
+               (ClientData) tkwin, (void (*)()) NULL);
+    }
+
+    /*
+     * Set variables for the intepreter.
+     */
+
+    Tcl_SetVar(interp, "tk_library", TK_Library, TCL_GLOBAL_ONLY);
+    Tcl_SetVar(interp, "tk_version", TK_VERSION, TCL_GLOBAL_ONLY);
+    Tcl_SetVar(interp, "tkVersion", TK_VERSION, TCL_GLOBAL_ONLY);
+
+    tk_NumMainWindows++;
+    return tkwin;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_CreateWindow --
+ *
+ *     Create a new internal or top-level window as a child of an
+ *     existing window.
+ *
+ * Results:
+ *     The return value is a token for the new window.  This
+ *     is not the same as X's token for the window.  If an error
+ *     occurred in creating the window (e.g. no such display or
+ *     screen), then an error message is left in interp->result and
+ *     NULL is returned.
+ *
+ * Side effects:
+ *     A new window structure is allocated locally.  An X
+ *     window is not initially created, but will be created
+ *     the first time the window is mapped.
+ *
+ *--------------------------------------------------------------
+ */
+
+Tk_Window
+Tk_CreateWindow(interp, parent, name, screenName)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting.
+                                * Interp->result is assumed to be
+                                * initialized by the caller. */
+    Tk_Window parent;          /* Token for parent of new window. */
+    char *name;                        /* Name for new window.  Must be unique
+                                * among parent's children. */
+    char *screenName;          /* If NULL, new window will be internal on
+                                * same screen as its parent.  If non-NULL,
+                                * gives name of screen on which to create
+                                * new window;  window will be a top-level
+                                * window. */
+{
+    TkWindow *parentPtr = (TkWindow *) parent;
+    TkWindow *winPtr;
+
+    if (screenName == NULL) {
+       winPtr = NewWindow(parentPtr->dispPtr, parentPtr->screenNum);
+       if (NameWindow(interp, winPtr, parentPtr, name) != TCL_OK) {
+           Tk_DestroyWindow((Tk_Window) winPtr);
+           return NULL;
+       } else {
+           return (Tk_Window) winPtr;
+       }
+    } else {
+/*
+ * This is a fix for dvx XOpenDisplay... display name conformalization
+ * bugs...
+ */
+        char dsp[256];
+        int len;
+
+        strcpy(dsp, screenName);
+        len = strlen(dsp);
+        if (len && (dsp[len -1] == '.'))
+            dsp[len -1] = '\0';
+
+       return CreateTopLevelWindow(interp, parent, name, dsp);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_CreateWindowFromPath --
+ *
+ *     This procedure is similar to Tk_CreateInternalWindow except
+ *     that it uses a path name to create the window, rather than
+ *     a parent and a child name.
+ *
+ * Results:
+ *     The return value is a token for the new window.  This
+ *     is not the same as X's token for the window.  If an error
+ *     occurred in creating the window (e.g. no such display or
+ *     screen), then an error message is left in interp->result and
+ *     NULL is returned.
+ *
+ * Side effects:
+ *     A new window structure is allocated locally.  An X
+ *     window is not initially created, but will be created
+ *     the first time the window is mapped.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Tk_Window
+Tk_CreateWindowFromPath(interp, tkwin, pathName, screenName)
+    Tcl_Interp *interp;                /* Interpreter to use for error reporting.
+                                * Interp->result is assumed to be
+                                * initialized by the caller. */
+    Tk_Window tkwin;           /* Token for any window in application
+                                * that is to contain new window. */
+    char *pathName;            /* Path name for new window within the
+                                * application of tkwin.  The parent of
+                                * this window must already exist, but
+                                * the window itself must not exist. */
+    char *screenName;          /* If NULL, new window will be on same
+                                * screen as its parent.  If non-NULL,
+                                * gives name of screen on which to create
+                                * new window;  window will be a top-level
+                                * window. */
+{
+#define FIXED_SPACE 5
+    char fixedSpace[FIXED_SPACE+1];
+    char *p;
+    Tk_Window parent;
+    int numChars;
+
+    /*
+     * Strip the parent's name out of pathName (it's everything up
+     * to the last dot).  There are two tricky parts: (a) must
+     * copy the parent's name somewhere else to avoid modifying
+     * the pathName string (for large names, space for the copy
+     * will have to be malloc'ed);  (b) must special-case the
+     * situation where the parent is ".".
+     */
+
+    p = strrchr(pathName, '.');
+    if (p == NULL) {
+       Tcl_AppendResult(interp, "bad window path name \"", pathName,
+               "\"", (char *) NULL);
+       return NULL;
+    }
+    numChars = p-pathName;
+    if (numChars > FIXED_SPACE) {
+       p = (char *) ckalloc((unsigned) (numChars+1));
+    } else {
+       p = fixedSpace;
+    }
+    if (numChars == 0) {
+       *p = '.';
+       p[1] = '\0';
+    } else {
+       strncpy(p, pathName, numChars);
+       p[numChars] = '\0';
+    }
+
+    /*
+     * Find the parent window.
+     */
+
+    parent = Tk_NameToWindow(interp, p, tkwin);
+    if (p != fixedSpace) {
+       ckfree(p);
+    }
+    if (parent == NULL) {
+       return NULL;
+    }
+
+    /*
+     * Create the window.
+     */
+
+    if (screenName == NULL) {
+       TkWindow *parentPtr = (TkWindow *) parent;
+       TkWindow *winPtr;
+
+       winPtr = NewWindow(parentPtr->dispPtr, parentPtr->screenNum);
+       if (NameWindow(interp, winPtr, parentPtr, pathName+numChars+1)
+               != TCL_OK) {
+           Tk_DestroyWindow((Tk_Window) winPtr);
+           return NULL;
+       } else {
+           return (Tk_Window) winPtr;
+       }
+    } else {
+       return CreateTopLevelWindow(interp, parent, pathName+numChars+1,
+               screenName);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_DestroyWindow --
+ *
+ *     Destroy an existing window.  After this call, the caller
+ *     should never again use the token.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The window is deleted, along with all of its children.
+ *     Relevant callback procedures are invoked.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_DestroyWindow(tkwin)
+    Tk_Window tkwin;           /* Window to destroy. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+    XEvent event;
+
+    /*
+     * Recursively destroy children.  The TK_RECURSIVE_DESTROY
+     * flags means that the child's window needn't be explicitly
+     * destroyed (the destroy of the parent already did it), nor
+     * does it need to be removed from its parent's child list,
+     * since the parent is being destroyed too.
+     */
+
+    while (winPtr->childList != NULL) {
+       winPtr->childList->flags |= TK_RECURSIVE_DESTROY;
+       Tk_DestroyWindow((Tk_Window) winPtr->childList);
+    }
+
+    /*
+     * Generate a DestroyNotify event.  In order for the DestroyNotify
+     * event to be processed correctly, need to make sure the window
+     * exists.  This is a bit of a kludge, and may be unnecessarily
+     * expensive, but without it no event handlers will get called for
+     * windows that don't exist yet.
+     */
+
+    if (winPtr->window == None) {
+       Tk_MakeWindowExist(tkwin);
+    }
+    winPtr->flags |= TK_ALREADY_DEAD;
+    event.type = DestroyNotify;
+    event.xdestroywindow.serial =
+           LastKnownRequestProcessed(winPtr->display);
+    event.xdestroywindow.send_event = False;
+    event.xdestroywindow.display = winPtr->display;
+    event.xdestroywindow.event = winPtr->window;
+    event.xdestroywindow.window = winPtr->window;
+    Tk_HandleEvent(&event);
+
+    /*
+     * Cleanup the data structures associated with this window.
+     * No need to destroy windows during recursive destroys, since
+     * that will happen automatically when the parent window is
+     * destroyed (not true for top-level windows:  must destroy
+     * them explicitly).
+     */
+
+    if (winPtr->window != None) {
+       if (!(winPtr->flags & TK_RECURSIVE_DESTROY)
+               || (winPtr->flags & TK_TOP_LEVEL)) {
+           XDestroyWindow(winPtr->display, winPtr->window);
+       }
+       XDeleteContext(winPtr->display, winPtr->window, tkWindowContext);
+       winPtr->window = None;
+    }
+    if (winPtr->parentPtr != NULL) {
+       if (winPtr->parentPtr->childList == winPtr) {
+           winPtr->parentPtr->childList = winPtr->nextPtr;
+       } else {
+           register TkWindow *winPtr2;
+    
+           for (winPtr2 = winPtr->parentPtr->childList; ;
+                   winPtr2 = winPtr2->nextPtr) {
+               if (winPtr2 == NULL) {
+                   panic("Tk_DestroyWindow couldn't find child in parent (deleted twice?)");
+                   break;
+               }
+               if (winPtr2->nextPtr == winPtr) {
+                   winPtr2->nextPtr = winPtr->nextPtr;
+                   break;
+               }
+           }
+       }
+    }
+    TkEventDeadWindow(winPtr);
+    TkOptionDeadWindow(winPtr);
+    TkSelDeadWindow(winPtr);
+    if (winPtr->flags & TK_TOP_LEVEL) {
+       TkWmDeadWindow(winPtr);
+    }
+    TkGrabDeadWindow(winPtr);
+    if (winPtr->mainPtr != NULL) {
+       Tk_DeleteAllBindings(winPtr->mainPtr->bindingTable,
+               (ClientData) winPtr->pathName);
+       if (winPtr->pathName != NULL) {
+           Tcl_DeleteHashEntry(Tcl_FindHashEntry(&winPtr->mainPtr->nameTable,
+                   winPtr->pathName));
+       }
+       if (winPtr->mainPtr->winPtr == winPtr) {
+           register TkCmd *cmdPtr;
+
+           /*
+            * Deleting a main window.  Delete the TkMainInfo structure too
+            * and replace all of Tk's commands with dummy commands that
+            * return errors.  Also delete the "send" command to unregister
+            * the interpreter.
+            */
+
+           for (cmdPtr = commands; cmdPtr->name != NULL; cmdPtr++) {
+               Tcl_CreateCommand(winPtr->mainPtr->interp, cmdPtr->name,
+                       TkDeadAppCmd, (ClientData) NULL, (void (*)()) NULL);
+           }
+           Tcl_CreateCommand(winPtr->mainPtr->interp, "send",
+                   TkDeadAppCmd, (ClientData) NULL, (void (*)()) NULL);
+           Tcl_DeleteHashTable(&winPtr->mainPtr->nameTable);
+           Tk_DeleteBindingTable(winPtr->mainPtr->bindingTable);
+           ckfree((char *) winPtr->mainPtr);
+           tk_NumMainWindows--;
+       }
+    }
+    ckfree((char *) winPtr);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_MapWindow --
+ *
+ *     Map a window within its parent.  This may require the
+ *     window and/or its parents to actually be created.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The given window will be mapped.  Windows may also
+ *     be created.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_MapWindow(tkwin)
+    Tk_Window tkwin;           /* Token for window to map. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    if (winPtr->flags & TK_MAPPED) {
+       return;
+    }
+    if (winPtr->window == None) {
+       Tk_MakeWindowExist(tkwin);
+    }
+    if (winPtr->flags & TK_TOP_LEVEL) {
+       if (!TkWmMapWindow(winPtr)) {
+           return;
+       }
+    } else {
+       /*
+        * Don't set the mapped flag for top-level windows:  TkWmMapWindow
+        * does it if appropriate (e.g. if the window is going to be non-
+        * iconic).
+        */
+
+       winPtr->flags |= TK_MAPPED;
+    }
+    XMapWindow(winPtr->display, winPtr->window);
+    if (!(winPtr->flags & TK_TOP_LEVEL)) {
+       XEvent event;
+
+       event.type = MapNotify;
+       event.xmap.serial = LastKnownRequestProcessed(winPtr->display);
+       event.xmap.send_event = False;
+       event.xmap.display = winPtr->display;
+       event.xmap.event = winPtr->window;
+       event.xmap.window = winPtr->window;
+       event.xmap.override_redirect = winPtr->atts.override_redirect;
+       Tk_HandleEvent(&event);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_MakeWindowExist --
+ *
+ *     Ensure that a particular window actually exists.  This
+ *     procedure shouldn't normally need to be invoked from
+ *     outside the Tk package, but may be needed if someone
+ *     wants to manipulate a window before mapping it.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     When the procedure returns, the X window associated with
+ *     tkwin is guaranteed to exist.  This may require the
+ *     window's ancestors to be created also.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_MakeWindowExist(tkwin)
+    Tk_Window tkwin;           /* Token for window. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+    Window parent;
+
+    if (winPtr->window != None) {
+       return;
+    }
+
+    if (winPtr->flags & TK_TOP_LEVEL) {
+        /*
+         * workaround by dhopkins for OLPC Micropolis gtk.Socket integration. 
+        */
+
+       if (tk_RootWindow) {
+           parent = 
+               tk_RootWindow;
+       } else {
+           parent = 
+               XRootWindow(winPtr->display, winPtr->screenNum);
+       }
+
+    } else {
+       if (winPtr->parentPtr->window == None) {
+           Tk_MakeWindowExist((Tk_Window) winPtr->parentPtr);
+       }
+       parent = winPtr->parentPtr->window;
+    }
+
+/* workaround to support non-default colormaps */
+#if 0
+    winPtr->window = XCreateWindow(winPtr->display, parent,
+           winPtr->changes.x, winPtr->changes.y,
+           winPtr->changes.width, winPtr->changes.height,
+           winPtr->changes.border_width, CopyFromParent,
+           InputOutput, CopyFromParent, winPtr->dirtyAtts,
+           &winPtr->atts);
+#else
+    { Screen *scr = ScreenOfDisplay(winPtr->display, winPtr->screenNum);
+
+      winPtr->dirtyAtts |= CWColormap | CWBorderPixmap;
+      winPtr->atts.colormap = Tk_DefaultColormap(scr);
+      winPtr->atts.border_pixmap = Tk_DefaultPixmap(scr);
+
+      winPtr->window = XCreateWindow(winPtr->display, parent,
+         winPtr->changes.x, winPtr->changes.y,
+         winPtr->changes.width, winPtr->changes.height,
+         winPtr->changes.border_width,
+         Tk_DefaultDepth(scr),
+         InputOutput,
+         Tk_DefaultVisual(scr),
+         winPtr->dirtyAtts, &winPtr->atts);
+    }
+#endif
+
+    XSaveContext(winPtr->display, winPtr->window, tkWindowContext,
+           (void *) winPtr);
+    winPtr->dirtyAtts = 0;
+    winPtr->dirtyChanges &= ~(CWX|CWY|CWWidth|CWHeight|CWBorderWidth);
+    if (winPtr->dirtyChanges != 0) {
+       XConfigureWindow(winPtr->display, winPtr->window,
+               winPtr->dirtyChanges, &winPtr->changes);
+       winPtr->dirtyChanges = 0;
+    }
+
+    /*
+     * Issue a ConfigureNotify event if there were deferred configuration
+     * changes.
+     */
+
+    if (winPtr->flags & TK_NEED_CONFIG_NOTIFY) {
+       winPtr->flags &= ~TK_NEED_CONFIG_NOTIFY;
+       DoConfigureNotify(winPtr);
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * Tk_UnmapWindow, etc. --
+ *
+ *     There are several procedures under here, each of which
+ *     mirrors an existing X procedure.  In addition to performing
+ *     the functions of the corresponding procedure, each
+ *     procedure also updates the local window structure and
+ *     synthesizes an X event (if the window's structure is being
+ *     managed internally).
+ *
+ * Results:
+ *     See the manual entries.
+ *
+ * Side effects:
+ *     See the manual entries.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+Tk_UnmapWindow(tkwin)
+    Tk_Window tkwin;           /* Token for window to unmap. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    if (!(winPtr->flags & TK_MAPPED)) {
+       return;
+    }
+    winPtr->flags &= ~TK_MAPPED;
+    XUnmapWindow(winPtr->display, winPtr->window);
+    if (!(winPtr->flags & TK_TOP_LEVEL)) {
+       XEvent event;
+
+       event.type = UnmapNotify;
+       event.xunmap.serial = LastKnownRequestProcessed(winPtr->display);
+       event.xunmap.send_event = False;
+       event.xunmap.display = winPtr->display;
+       event.xunmap.event = winPtr->window;
+       event.xunmap.window = winPtr->window;
+       event.xunmap.from_configure = False;
+       Tk_HandleEvent(&event);
+    }
+}
+
+void
+Tk_ConfigureWindow(tkwin, valueMask, valuePtr)
+    Tk_Window tkwin;           /* Window to re-configure. */
+    unsigned int valueMask;    /* Mask indicating which parts of
+                                * *valuePtr are to be used. */
+    XWindowChanges *valuePtr;  /* New values. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    if ((winPtr->window == None) || !(winPtr->flags & TK_TOP_LEVEL)) {
+       if (valueMask & CWX) {
+           winPtr->changes.x = valuePtr->x;
+       }
+       if (valueMask & CWY) {
+           winPtr->changes.y = valuePtr->y;
+       }
+       if (valueMask & CWWidth) {
+           winPtr->changes.width = valuePtr->width;
+       }
+       if (valueMask & CWHeight) {
+           winPtr->changes.height = valuePtr->height;
+       }
+       if (valueMask & CWBorderWidth) {
+           winPtr->changes.border_width = valuePtr->border_width;
+       }
+       if (valueMask & CWSibling) {
+           winPtr->changes.sibling = valuePtr->sibling;
+       }
+       if (valueMask & CWStackMode) {
+           winPtr->changes.stack_mode = valuePtr->stack_mode;
+       }
+    }
+
+    if (winPtr->window != None) {
+       XConfigureWindow(winPtr->display, winPtr->window,
+               valueMask, valuePtr);
+       if (!(winPtr->flags & TK_TOP_LEVEL)) {
+           DoConfigureNotify(winPtr);
+       }
+    } else {
+       winPtr->dirtyChanges |= valueMask;
+       winPtr->flags |= TK_NEED_CONFIG_NOTIFY;
+    }
+}
+
+void
+Tk_MoveWindow(tkwin, x, y)
+    Tk_Window tkwin;           /* Window to move. */
+    int x, y;                  /* New location for window (within
+                                * parent). */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    if (winPtr->window != None) {
+       XMoveWindow(winPtr->display, winPtr->window, x, y);
+       if (!(winPtr->flags & TK_TOP_LEVEL)) {
+           winPtr->changes.x = x;
+           winPtr->changes.y = y;
+           DoConfigureNotify(winPtr);
+       }
+    } else {
+       winPtr->changes.x = x;
+       winPtr->changes.y = y;
+       winPtr->dirtyChanges |= CWX|CWY;
+       winPtr->flags |= TK_NEED_CONFIG_NOTIFY;
+    }
+}
+
+void
+Tk_ResizeWindow(tkwin, width, height)
+    Tk_Window tkwin;           /* Window to resize. */
+    unsigned int width, height;        /* New dimensions for window. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    if (winPtr->window != None) {
+       XResizeWindow(winPtr->display, winPtr->window, width, height);
+       if (!(winPtr->flags & TK_TOP_LEVEL)) {
+           winPtr->changes.width = width;
+           winPtr->changes.height = height;
+           DoConfigureNotify(winPtr);
+       }
+    } else {
+       winPtr->changes.width = width;
+       winPtr->changes.height = height;
+       winPtr->dirtyChanges |= CWWidth|CWHeight;
+       winPtr->flags |= TK_NEED_CONFIG_NOTIFY;
+    }
+}
+
+void
+Tk_MoveResizeWindow(tkwin, x, y, width, height)
+    Tk_Window tkwin;           /* Window to move and resize. */
+    int x, y;                  /* New location for window (within
+                                * parent). */
+    unsigned int width, height;        /* New dimensions for window. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    if (winPtr->window != None) {
+       XMoveResizeWindow(winPtr->display, winPtr->window,
+               x, y, width, height);
+       if (!(winPtr->flags & TK_TOP_LEVEL)) {
+           winPtr->changes.x = x;
+           winPtr->changes.y = y;
+           winPtr->changes.width = width;
+           winPtr->changes.height = height;
+           DoConfigureNotify(winPtr);
+       }
+    } else {
+       winPtr->changes.x = x;
+       winPtr->changes.y = y;
+       winPtr->changes.width = width;
+       winPtr->changes.height = height;
+       winPtr->dirtyChanges |= CWX|CWY|CWWidth|CWHeight;
+       winPtr->flags |= TK_NEED_CONFIG_NOTIFY;
+    }
+}
+
+void
+Tk_SetWindowBorderWidth(tkwin, width)
+    Tk_Window tkwin;           /* Window to modify. */
+    int width;                 /* New border width for window. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    winPtr->changes.border_width = width;
+    if (winPtr->window != None) {
+       XSetWindowBorderWidth(winPtr->display, winPtr->window, width);
+       if (!(winPtr->flags & TK_TOP_LEVEL)) {
+           DoConfigureNotify(winPtr);
+       }
+    } else {
+       winPtr->dirtyChanges |= CWBorderWidth;
+       winPtr->flags |= TK_NEED_CONFIG_NOTIFY;
+    }
+}
+
+void
+Tk_ChangeWindowAttributes(tkwin, valueMask, attsPtr)
+    Tk_Window tkwin;           /* Window to manipulate. */
+    unsigned long valueMask;   /* OR'ed combination of bits,
+                                * indicating which fields of
+                                * *attsPtr are to be used. */
+    register XSetWindowAttributes *attsPtr;
+                               /* New values for some attributes. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    if (valueMask & CWBackPixmap) {
+       winPtr->atts.background_pixmap = attsPtr->background_pixmap;
+    }
+    if (valueMask & CWBackPixel) {
+       winPtr->atts.background_pixel = attsPtr->background_pixel;
+    }
+    if (valueMask & CWBorderPixmap) {
+       winPtr->atts.border_pixmap = attsPtr->border_pixmap;
+    }
+    if (valueMask & CWBorderPixel) {
+       winPtr->atts.border_pixel = attsPtr->border_pixel;
+    }
+    if (valueMask & CWBitGravity) {
+       winPtr->atts.bit_gravity = attsPtr->bit_gravity;
+    }
+    if (valueMask & CWWinGravity) {
+       winPtr->atts.win_gravity = attsPtr->win_gravity;
+    }
+    if (valueMask & CWBackingStore) {
+       winPtr->atts.backing_store = attsPtr->backing_store;
+    }
+    if (valueMask & CWBackingPlanes) {
+       winPtr->atts.backing_planes = attsPtr->backing_planes;
+    }
+    if (valueMask & CWBackingPixel) {
+       winPtr->atts.backing_pixel = attsPtr->backing_pixel;
+    }
+    if (valueMask & CWOverrideRedirect) {
+       winPtr->atts.override_redirect = attsPtr->override_redirect;
+    }
+    if (valueMask & CWSaveUnder) {
+       winPtr->atts.save_under = attsPtr->save_under;
+    }
+    if (valueMask & CWEventMask) {
+       winPtr->atts.event_mask = attsPtr->event_mask;
+    }
+    if (valueMask & CWDontPropagate) {
+       winPtr->atts.do_not_propagate_mask
+               = attsPtr->do_not_propagate_mask;
+    }
+    if (valueMask & CWColormap) {
+       winPtr->atts.colormap = attsPtr->colormap;
+    }
+    if (valueMask & CWCursor) {
+       winPtr->atts.cursor = attsPtr->cursor;
+    }
+
+    if (winPtr->window != None) {
+       XChangeWindowAttributes(winPtr->display, winPtr->window,
+               valueMask, attsPtr);
+    } else {
+       winPtr->dirtyAtts |= valueMask;
+    }
+}
+
+void
+Tk_SetWindowBackground(tkwin, pixel)
+    Tk_Window tkwin;           /* Window to manipulate. */
+    unsigned long pixel;       /* Pixel value to use for
+                                * window's background. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    winPtr->atts.background_pixel = pixel;
+
+    if (winPtr->window != None) {
+       XSetWindowBackground(winPtr->display, winPtr->window, pixel);
+    } else {
+       winPtr->dirtyAtts = (winPtr->dirtyAtts & ~CWBackPixmap)
+               | CWBackPixel;
+    }
+}
+
+void
+Tk_SetWindowBackgroundPixmap(tkwin, pixmap)
+    Tk_Window tkwin;           /* Window to manipulate. */
+    Pixmap pixmap;             /* Pixmap to use for window's
+                                * background. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    winPtr->atts.background_pixmap = pixmap;
+
+    if (winPtr->window != None) {
+       XSetWindowBackgroundPixmap(winPtr->display,
+               winPtr->window, pixmap);
+    } else {
+       winPtr->dirtyAtts = (winPtr->dirtyAtts & ~CWBackPixel)
+               | CWBackPixmap;
+    }
+}
+
+void
+Tk_SetWindowBorder(tkwin, pixel)
+    Tk_Window tkwin;           /* Window to manipulate. */
+    unsigned long pixel;       /* Pixel value to use for
+                                * window's border. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    winPtr->atts.border_pixel = pixel;
+
+    if (winPtr->window != None) {
+       XSetWindowBorder(winPtr->display, winPtr->window, pixel);
+    } else {
+       winPtr->dirtyAtts = (winPtr->dirtyAtts & ~CWBorderPixmap)
+               | CWBorderPixel;
+    }
+}
+
+void
+Tk_SetWindowBorderPixmap(tkwin, pixmap)
+    Tk_Window tkwin;           /* Window to manipulate. */
+    Pixmap pixmap;             /* Pixmap to use for window's
+                                * border. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    winPtr->atts.border_pixmap = pixmap;
+
+    if (winPtr->window != None) {
+       XSetWindowBorderPixmap(winPtr->display,
+               winPtr->window, pixmap);
+    } else {
+       winPtr->dirtyAtts = (winPtr->dirtyAtts & ~CWBorderPixel)
+               | CWBorderPixmap;
+    }
+}
+
+void
+Tk_DefineCursor(tkwin, cursor)
+    Tk_Window tkwin;           /* Window to manipulate. */
+    Cursor cursor;             /* Cursor to use for window (may be None). */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    winPtr->atts.cursor = cursor;
+
+    if (winPtr->window != None) {
+       XDefineCursor(winPtr->display, winPtr->window, cursor);
+    } else {
+       winPtr->dirtyAtts = winPtr->dirtyAtts | CWCursor;
+    }
+}
+
+void
+Tk_UndefineCursor(tkwin)
+    Tk_Window tkwin;           /* Window to manipulate. */
+{
+    Tk_DefineCursor(tkwin, None);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * DoConfigureNotify --
+ *
+ *     Generate a ConfigureNotify event describing the current
+ *     configuration of a window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     An event is generated and processed by Tk_HandleEvent.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DoConfigureNotify(winPtr)
+    register TkWindow *winPtr;         /* Window whose configuration
+                                        * was just changed. */
+{
+    XEvent event;
+
+    event.type = ConfigureNotify;
+    event.xconfigure.serial = LastKnownRequestProcessed(winPtr->display);
+    event.xconfigure.send_event = False;
+    event.xconfigure.display = winPtr->display;
+    event.xconfigure.event = winPtr->window;
+    event.xconfigure.window = winPtr->window;
+    event.xconfigure.x = winPtr->changes.x;
+    event.xconfigure.y = winPtr->changes.y;
+    event.xconfigure.width = winPtr->changes.width;
+    event.xconfigure.height = winPtr->changes.height;
+    event.xconfigure.border_width = winPtr->changes.border_width;
+    if (winPtr->changes.stack_mode == Above) {
+       event.xconfigure.above = winPtr->changes.sibling;
+    } else {
+       event.xconfigure.above = None;
+    }
+    event.xconfigure.override_redirect = winPtr->atts.override_redirect;
+    Tk_HandleEvent(&event);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_SetClass --
+ *
+ *     This procedure is used to give a window a class.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A new class is stored for tkwin, replacing any existing
+ *     class for it.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_SetClass(tkwin, className)
+    Tk_Window tkwin;           /* Token for window to assign class. */
+    char *className;           /* New class for tkwin. */
+{
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    winPtr->classUid = Tk_GetUid(className);
+    if (winPtr->flags & TK_TOP_LEVEL) {
+       TkWmSetClass(winPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_NameToWindow --
+ *
+ *     Given a string name for a window, this procedure
+ *     returns the token for the window, if there exists a
+ *     window corresponding to the given name.
+ *
+ * Results:
+ *     The return result is either a token for the window corresponding
+ *     to "name", or else NULL to indicate that there is no such
+ *     window.  In this case, an error message is left in interp->result.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Tk_Window
+Tk_NameToWindow(interp, pathName, tkwin)
+    Tcl_Interp *interp;                /* Where to report errors. */
+    char *pathName;            /* Path name of window. */
+    Tk_Window tkwin;           /* Token for window:  name is assumed to
+                                * belong to the same main window as tkwin. */
+{
+    Tcl_HashEntry *hPtr;
+
+    hPtr = Tcl_FindHashEntry(&((TkWindow *) tkwin)->mainPtr->nameTable,
+           pathName);
+    if (hPtr == NULL) {
+       Tcl_AppendResult(interp, "bad window path name \"",
+               pathName, "\"", (char *) NULL);
+       return NULL;
+    }
+    return (Tk_Window) Tcl_GetHashValue(hPtr);
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_DisplayName --
+ *
+ *     Return the textual name of a window's display.
+ *
+ * Results:
+ *     The return value is the string name of the display associated
+ *     with tkwin.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+char *
+Tk_DisplayName(tkwin)
+    Tk_Window tkwin;           /* Window whose display name is desired. */
+{
+    return ((TkWindow *) tkwin)->dispPtr->name;
+}
diff --git a/src/tk/tkwm.c b/src/tk/tkwm.c
new file mode 100644 (file)
index 0000000..af974be
--- /dev/null
@@ -0,0 +1,2415 @@
+/* 
+ * tkWm.c --
+ *
+ *     This module takes care of the interactions between a Tk-based
+ *     application and the window manager.  Among other things, it
+ *     implements the "wm" command and passes geometry information
+ *     to the window manager.
+ *
+ * Copyright 1991 Regents of the University of California.
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies.  The University of California
+ * makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without
+ * express or implied warranty.
+ */
+
+#ifndef lint
+static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkWm.c,v 1.32 92/08/21 16:26:31 ouster Exp $ SPRITE (Berkeley)";
+#endif
+
+#include "tkconfig.h"
+#include "tkint.h"
+#include "tkwm.h"
+
+/*
+ * The definitions below compensate for the lack of some definitions
+ * under X11R3.
+ */
+
+#ifdef X11R3
+#define PBaseSize      (1L<<8)
+#endif
+
+/*
+ * A data structure of the following type holds window-manager-related
+ * information for each top-level window in an application.
+ */
+
+typedef struct TkWmInfo {
+    TkWindow *winPtr;          /* Pointer to main Tk information for
+                                * this window. */
+    Window reparent;           /* If the window has been reparented, this
+                                * gives the ID of the ancestor of the window
+                                * that is a child of the root window (may
+                                * not be window's immediate parent).  If
+                                * the window isn't reparented, this has the
+                                * value None. */
+    Tk_Uid titleUid;           /* Title to display in window caption.  If
+                                * NULL, use name of widget. */
+    Tk_Uid iconName;           /* Name to display in icon. */
+    Window master;             /* Master window for TRANSIENT_FOR property,
+                                * or None. */
+    XWMHints hints;            /* Various pieces of information for
+                                * window manager. */
+    Tk_Uid leaderName;         /* Path name of leader of window group
+                                * (corresponds to hints.window_group).
+                                * Note:  this field doesn't get updated
+                                * if leader is destroyed. */
+    Tk_Uid iconWindowName;     /* Path name of window specified as icon
+                                * window for this window, or NULL.  Note:
+                                * this field doesn't get updated if
+                                * iconWindowName is destroyed. */
+    Tk_Uid masterWindowName;   /* Path name of window specified as master
+                                * in "wm transient" command, or NULL.
+                                * Note:  this field doesn't get updated if
+                                * masterWindowName is destroyed. */
+
+    /*
+     * Information used to construct an XSizeHints structure for
+     * the window manager:
+     */
+
+    int sizeHintsFlags;                /* Flags word for XSizeHints structure.
+                                * If the PBaseSize flag is set then the
+                                * window is gridded;  otherwise it isn't
+                                * gridded. */
+    int minWidth, minHeight;   /* Minimum dimensions of window, in
+                                * grid units, not pixels. */
+    int maxWidth, maxHeight;   /* Maximum dimensions of window, in
+                                * grid units, not pixels. */
+    int widthInc, heightInc;   /* Increments for size changes (# pixels
+                                * per step). */
+    struct {
+       int x;  /* numerator */
+       int y;  /* denominator */
+    } minAspect, maxAspect;    /* Min/max aspect ratios for window. */
+    int reqGridWidth, reqGridHeight;
+                               /* The dimensions of the window (in
+                                * grid units) requested through
+                                * the geometry manager. */
+    int gravity;               /* Desired window gravity. */
+
+    /*
+     * Information used to manage the size and location of a window.
+     */
+
+    int prevReqWidth, prevReqHeight;
+                               /* Last known size preferences, as specified
+                                * to Tk_GeometryRequest.  Used to tell when
+                                * the preferred dimensions have changed. */
+    int width, height;         /* Desired dimensions of window, specified
+                                * in grid units.  These values are
+                                * set by the "wm geometry" command and by
+                                * ConfigureNotify events (for when wm
+                                * resizes window).  -1 means user hasn't
+                                * requested dimensions. */
+    int x, y;                  /* Desired X and Y coordinates for window.
+                                * These values are set by "wm geometry",
+                                * plus by ConfigureNotify events (when wm
+                                * moves window).  These numbers are
+                                * different than the numbers stored in
+                                * winPtr->changes because (a) they could be
+                                * measured from the right or bottom edge
+                                * of the screen (see WM_NEGATIVE_X and
+                                * WM_NEGATIVE_Y flags) and (b) if the window
+                                * has been reparented then they refer to the
+                                * parent rather than the window itself. */
+    int parentWidth, parentHeight;
+                               /* Width and height of reparent, in pixels
+                                * *including border*.  If window hasn't been
+                                * reparented then these will be the outer
+                                * dimensions of the window, including
+                                * border. */
+    int xInParent, yInParent;  /* Offset of window within reparent,  measured
+                                * from upper-left outer corner of parent's
+                                * border.  If not reparented then these are
+                                * zero. */
+    unsigned long configRequest;/* Serial number of last request that we
+                                * issued to change geometry of window.
+                                * Used to discard configure events that
+                                * we know will be superceded. */
+    int configWidth, configHeight;
+                               /* Dimensions passed to last request that we
+                                * issued to change geometry of window.  Used
+                                * to eliminate redundant resize operations. */
+
+    int flags;                 /* Miscellaneous flags, defined below. */
+
+    char *deleteCmd;            /* Command to execute when a WM_DELETE_WINDOW
+                                * ICCCM ClientMessage arrives for this window.
+                                *
+                                * If it is the empty string "" or has never
+                                * been set (is char *)NULL) via the "wm" tcl
+                                * command the window is destroyed.
+                                *
+                                * If it is a non-empty string, the name of 
+                                * the window is appended on to the end
+                                * of the string and it is executed
+                                * within the interpreter associated with
+                                * the top level window. 
+                                */
+    struct TkWmInfo *nextPtr;  /* Next in list of all top-level windows. */
+} WmInfo;
+
+/*
+ * Flag values for WmInfo structures:
+ *
+ * WM_NEVER_MAPPED -           non-zero means window has never been
+ *                             mapped;  need to update all info when
+ *                             window is first mapped.
+ * WM_UPDATE_PENDING -         non-zero means a call to UpdateGeometryInfo
+ *                             has already been scheduled for this
+ *                             window;  no need to schedule another one.
+ * WM_NEGATIVE_X -             non-zero means x-coordinate is measured in
+ *                             pixels from right edge of screen, rather
+ *                             than from left edge.
+ * WM_NEGATIVE_Y -             non-zero means y-coordinate is measured in
+ *                             pixels up from bottom of screen, rather than
+ *                             down from top.
+ * WM_UPDATE_SIZE_HINTS -      non-zero means that new size hints need to be
+ *                             propagated to window manager.
+ * WM_NESTED_REPARENT -                non-zero means that the window has been
+ *                             reparented several levels deep in a hierarchy
+ *                             (i.e. reparent isn't the window's immediate
+ *                             parent).
+ * WM_CONFIG_PENDING -         non-zero means we've asked for the top-level
+ *                             window to be resized but haven't seen a
+ *                             ConfigureNotify event to indicate that the
+ *                             resize occurred.
+ * WM_CONFIG_AGAIN -           non-zero means we need to reconfigure the
+ *                             window again as soon as the current configure
+ *                             request has been processed by the window
+ *                             manager.
+ * WM_FULL_SCREEN -            non-zero means that the window is in full screen mode.
+ */
+
+#define WM_NEVER_MAPPED                1
+#define WM_UPDATE_PENDING      2
+#define WM_NEGATIVE_X          4
+#define WM_NEGATIVE_Y          8
+#define WM_UPDATE_SIZE_HINTS   0x10
+#define WM_NESTED_REPARENT     0x20
+#define WM_CONFIG_PENDING      0x40
+#define WM_CONFIG_AGAIN                0x100
+#define WM_FULL_SCREEN         0x200
+
+/*
+ * This module keeps a list of all top-level windows, primarily to
+ * simplify the job of Tk_CoordsToWindow.
+ */
+
+static WmInfo *firstWmPtr = NULL;      /* Points to first top-level window. */
+
+#define IS_GRIDDED(wmPtr) ((wmPtr)->sizeHintsFlags & PBaseSize)
+
+/*
+ * Forward declarations for procedures defined in this file:
+ */
+
+static int             ParseGeometry _ANSI_ARGS_ ((Tcl_Interp *interp,
+                           char *string, TkWindow *winPtr));
+static void            TopLevelEventProc _ANSI_ARGS_((ClientData clientData,
+                           XEvent *eventPtr));
+static void            TopLevelReqProc _ANSI_ARGS_((ClientData dummy,
+                           Tk_Window tkwin));
+static void            UpdateGeometryInfo _ANSI_ARGS_((
+                           ClientData clientData));
+static void            UpdateHints _ANSI_ARGS_((TkWindow *winPtr));
+static void            UpdateSizeHints _ANSI_ARGS_((TkWindow *winPtr));
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkWmNewWindow --
+ *
+ *     This procedure is invoked whenever a new top-level
+ *     window is created.  Its job is to initialize the WmInfo
+ *     structure for the window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A WmInfo structure gets allocated and initialized.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkWmNewWindow(winPtr)
+    TkWindow *winPtr;          /* Newly-created top-level window. */
+{
+    register WmInfo *wmPtr;
+
+    wmPtr = (WmInfo *) ckalloc(sizeof(WmInfo));
+    wmPtr->winPtr = winPtr;
+    wmPtr->reparent = None;
+    wmPtr->titleUid = NULL;
+    wmPtr->iconName = NULL;
+    wmPtr->master = None;
+    wmPtr->hints.flags = InputHint | StateHint;
+    wmPtr->hints.input = True;
+    wmPtr->hints.initial_state = NormalState;
+    wmPtr->hints.icon_pixmap = None;
+    wmPtr->hints.icon_window = None;
+    wmPtr->hints.icon_x = wmPtr->hints.icon_y = 0;
+    wmPtr->hints.icon_mask = None;
+    wmPtr->hints.window_group = None;
+    wmPtr->leaderName = NULL;
+    wmPtr->iconWindowName = NULL;
+    wmPtr->masterWindowName = NULL;
+    wmPtr->sizeHintsFlags = 0;
+    wmPtr->minWidth = wmPtr->minHeight = 0;
+    wmPtr->maxWidth = wmPtr->maxHeight = 10000;
+    wmPtr->widthInc = wmPtr->heightInc = 1;
+    wmPtr->minAspect.x = wmPtr->minAspect.y = 1;
+    wmPtr->maxAspect.x = wmPtr->maxAspect.y = 1;
+    wmPtr->reqGridWidth = wmPtr->reqGridHeight = -1;
+    wmPtr->prevReqWidth = wmPtr->prevReqHeight = -1;
+    wmPtr->gravity = NorthWestGravity;
+    wmPtr->width = -1;
+    wmPtr->height = -1;
+    wmPtr->x = winPtr->changes.x;
+    wmPtr->y = winPtr->changes.y;
+    wmPtr->parentWidth = winPtr->changes.width
+           + 2*winPtr->changes.border_width;
+    wmPtr->parentHeight = winPtr->changes.height
+           + 2*winPtr->changes.border_width;
+    wmPtr->xInParent = wmPtr->yInParent = 0;
+    wmPtr->configRequest = 0;
+    wmPtr->configWidth = -1;
+    wmPtr->configHeight = -1;
+    wmPtr->flags = WM_NEVER_MAPPED;
+    wmPtr->deleteCmd = (char *)0;
+    wmPtr->nextPtr = firstWmPtr;
+    firstWmPtr = wmPtr;
+    winPtr->wmInfoPtr = wmPtr;
+
+    /*
+     * Tk must monitor certain events for top-level windows:
+     * (a) structure events, in order to detect size and position changes
+     *     caused by window managers.
+     * (b) enter/level events, in order to perform focussing correctly.
+     */
+
+    Tk_CreateEventHandler((Tk_Window) winPtr,
+           StructureNotifyMask|EnterWindowMask|LeaveWindowMask,
+           TopLevelEventProc, (ClientData) winPtr);
+
+    /*
+     * Arrange for geometry requests to be reflected from the window
+     * to the window manager.
+     */
+
+    Tk_ManageGeometry((Tk_Window) winPtr, TopLevelReqProc, (ClientData) 0);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkWmMapWindow --
+ *
+ *     This procedure is invoked just before a top-level window
+ *     is mapped.  It gives this module a chance to update all
+ *     window-manager-related information in properties before
+ *     the window manager sees the map event and checks the
+ *     properties.
+ *
+ * Results:
+ *     Returns non-zero if it's OK for the window to be mapped, 0
+ *     if the caller shouldn't map the window after all (e.g. because
+ *     it has been withdrawn).
+ *
+ * Side effects:
+ *     Properties of winPtr may get updated to provide up-to-date
+ *     information to the window manager.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+TkWmMapWindow(winPtr)
+    TkWindow *winPtr;          /* Top-level window that's about to
+                                * be mapped. */
+{
+    register WmInfo *wmPtr = winPtr->wmInfoPtr;
+#ifndef X11R3
+    XTextProperty textProp;
+#endif
+
+    /*
+     * Set the MAPPED flag if the window is going to appear in its normal
+     * state:  if it's going to be iconified or withdrawn then it won't
+     * ever be mapped.
+     */
+
+    if (wmPtr->hints.initial_state == NormalState) {
+       winPtr->flags |= TK_MAPPED;
+    }
+    if (!(wmPtr->flags & WM_NEVER_MAPPED)) {
+       return 1;
+    }
+    wmPtr->flags &= ~WM_NEVER_MAPPED;
+
+    /*
+     * This is the first time this window has ever been mapped.
+     * Store all the window-manager-related information for the
+     * window.
+     */
+
+#ifndef X11R3
+    if (wmPtr->titleUid == NULL) {
+       wmPtr->titleUid = winPtr->nameUid;
+    }
+    if (XStringListToTextProperty(&wmPtr->titleUid, 1, &textProp)  != 0) {
+       XSetWMName(winPtr->display, winPtr->window, &textProp);
+       XFree((char *) textProp.value);
+    }
+#endif
+
+    TkWmSetClass(winPtr);
+    TkWmSetWmProtocols(winPtr);
+
+    if (wmPtr->iconName != NULL) {
+       XSetIconName(winPtr->display, winPtr->window, wmPtr->iconName);
+    }
+
+    if (wmPtr->master != None) {
+       XSetTransientForHint(winPtr->display, winPtr->window, wmPtr->master);
+    }
+
+    wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
+    UpdateGeometryInfo((ClientData) winPtr);
+    UpdateHints(winPtr);
+    if (wmPtr->hints.initial_state == WithdrawnState) {
+       return 0;
+    }
+    return 1;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkWmDeadWindow --
+ *
+ *     This procedure is invoked when a top-level window is
+ *     about to be deleted.  It cleans up the wm-related data
+ *     structures for the window.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The WmInfo structure for winPtr gets freed up.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkWmDeadWindow(winPtr)
+    TkWindow *winPtr;          /* Newly-created top-level window. */
+{
+    register WmInfo *wmPtr = winPtr->wmInfoPtr;
+
+    if (wmPtr == NULL) {
+       return;
+    }
+    if (firstWmPtr == wmPtr) {
+       firstWmPtr = wmPtr->nextPtr;
+    } else {
+       register WmInfo *prevPtr;
+
+       for (prevPtr = firstWmPtr; ; prevPtr = prevPtr->nextPtr) {
+           if (prevPtr == NULL) {
+               panic("couldn't unlink window in TkWmDeadWindow");
+           }
+           if (prevPtr->nextPtr == wmPtr) {
+               prevPtr->nextPtr = wmPtr->nextPtr;
+               break;
+           }
+       }
+    }
+    if (wmPtr->hints.flags & IconPixmapHint) {
+       Tk_FreeBitmap(wmPtr->hints.icon_pixmap);
+    }
+    if (wmPtr->hints.flags & IconMaskHint) {
+       Tk_FreeBitmap(wmPtr->hints.icon_mask);
+    }
+    if (wmPtr->flags & WM_UPDATE_PENDING) {
+       Tk_CancelIdleCall(UpdateGeometryInfo, (ClientData) winPtr);
+    }
+    if (wmPtr->deleteCmd) {
+        ckfree(wmPtr->deleteCmd);
+    }
+    ckfree((char *) wmPtr);
+    winPtr->wmInfoPtr = NULL;
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkWmSetClass --
+ *
+ *     This procedure is invoked whenever a top-level window's
+ *     class is changed.  If the window has been mapped then this
+ *     procedure updates the window manager property for the
+ *     class.  If the window hasn't been mapped, the update is
+ *     deferred until just before the first mapping.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A window property may get updated.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkWmSetClass(winPtr)
+    TkWindow *winPtr;          /* Newly-created top-level window. */
+{
+    if (winPtr->wmInfoPtr->flags & WM_NEVER_MAPPED) {
+       return;
+    }
+
+#ifndef X11R3
+    if (winPtr->classUid != NULL) {
+       XClassHint *classPtr;
+
+       classPtr = XAllocClassHint();
+       classPtr->res_name = winPtr->nameUid;
+       classPtr->res_class = winPtr->classUid;
+       XSetClassHint(winPtr->display, winPtr->window, classPtr);
+       XFree((char *) classPtr);
+    }
+#endif
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_WmCmd --
+ *
+ *     This procedure is invoked to process the "wm" Tcl command.
+ *     See the user documentation for details on what it does.
+ *
+ * Results:
+ *     A standard Tcl result.
+ *
+ * Side effects:
+ *     See the user documentation.
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+int
+Tk_WmCmd(clientData, interp, argc, argv)
+    ClientData clientData;     /* Main window associated with
+                                * interpreter. */
+    Tcl_Interp *interp;                /* Current interpreter. */
+    int argc;                  /* Number of arguments. */
+    char **argv;               /* Argument strings. */
+{
+    Tk_Window tkwin = (Tk_Window) clientData;
+    TkWindow *winPtr;
+    register WmInfo *wmPtr;
+    char c;
+    int length;
+
+    if (argc < 3) {
+       Tcl_AppendResult(interp, "wrong # args: should be \"",
+               argv[0], " option window ?arg ...?\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+    winPtr = (TkWindow *) Tk_NameToWindow(interp, argv[2], tkwin);
+    if (winPtr == NULL) {
+       return TCL_ERROR;
+    }
+    if (!(winPtr->flags & TK_TOP_LEVEL)) {
+       Tcl_AppendResult(interp, "window \"", winPtr->pathName,
+               "\" isn't a top-level window", (char *) NULL);
+       return TCL_ERROR;
+    }
+    wmPtr = winPtr->wmInfoPtr;
+    c = argv[1][0];
+    length = strlen(argv[1]);
+    if ((c == 'a') && (strncmp(argv[1], "aspect", length) == 0)) {
+       int numer1, denom1, numer2, denom2;
+
+       if ((argc != 3) && (argc != 7)) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " aspect window ?minNumer minDenom ",
+                   "maxNumer maxDenom?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           if (wmPtr->sizeHintsFlags & PAspect) {
+               sprintf(interp->result, "%d %d %d %d", wmPtr->minAspect.x,
+                       wmPtr->minAspect.y, wmPtr->maxAspect.x,
+                       wmPtr->maxAspect.y);
+           }
+           return TCL_OK;
+       }
+       if (*argv[3] == '\0') {
+           wmPtr->sizeHintsFlags &= ~PAspect;
+       } else {
+           if ((Tcl_GetInt(interp, argv[3], &numer1) != TCL_OK)
+                   || (Tcl_GetInt(interp, argv[4], &denom1) != TCL_OK)
+                   || (Tcl_GetInt(interp, argv[5], &numer2) != TCL_OK)
+                   || (Tcl_GetInt(interp, argv[6], &denom2) != TCL_OK)) {
+               return TCL_ERROR;
+           }
+           if ((numer1 <= 0) || (denom1 <= 0) || (numer2 <= 0) ||
+                   (denom2 <= 0)) {
+               interp->result = "aspect number can't be <= 0";
+               return TCL_ERROR;
+           }
+           wmPtr->minAspect.x = numer1;
+           wmPtr->minAspect.y = denom1;
+           wmPtr->maxAspect.x = numer2;
+           wmPtr->maxAspect.y = denom2;
+           wmPtr->sizeHintsFlags |= PAspect;
+       }
+       wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
+       goto updateGeom;
+    } else if ((c == 'd') && (strncmp(argv[1], "deiconify", length) == 0)) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " deiconify window\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       wmPtr->hints.initial_state = NormalState;
+       if (wmPtr->flags & WM_NEVER_MAPPED) {
+           return TCL_OK;
+       }
+       Tk_MapWindow((Tk_Window) winPtr);
+    } else if ((c == 'f') && (strncmp(argv[1], "focusmodel", length) == 0)) {
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " focusmodel window ?active|passive?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           interp->result = wmPtr->hints.input ? "passive" : "active";
+           return TCL_OK;
+       }
+       c = argv[3][0];
+       length = strlen(argv[3]);
+       if ((c == 'a') && (strncmp(argv[3], "active", length) == 0)) {
+           wmPtr->hints.input = False;
+       } else if ((c == 'p') && (strncmp(argv[3], "passive", length) == 0)) {
+           wmPtr->hints.input = True;
+       } else {
+           Tcl_AppendResult(interp, "bad argument \"", argv[3],
+                   "\": must be active or passive", (char *) NULL);
+           return TCL_ERROR;
+       }
+       UpdateHints(winPtr);
+    } else if ((c == 'f') && (strncmp(argv[1], "fullscreen", length) == 0)) {
+       if (argc != 4) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " fullscreen window on|off\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       c = argv[3][0];
+       length = strlen(argv[3]);
+       if (strncmp(argv[3], "on", length) == 0) {
+           wmPtr->flags &= ~WM_FULL_SCREEN;
+       } else if (strncmp(argv[3], "off", length) == 0) {
+           wmPtr->flags |= WM_FULL_SCREEN;
+       } else {
+           Tcl_AppendResult(interp, "bad argument \"", argv[3],
+                   "\": must be on or off", (char *) NULL);
+           return TCL_ERROR;
+       }
+
+       static Atom _NET_WM_STATE;
+       static Atom _NET_WM_STATE_REMOVE;
+       static Atom _NET_WM_STATE_ADD;
+       static Atom _NET_WM_STATE_FULLSCREEN;
+
+       if (!_NET_WM_STATE) {
+#define MAX_ATOMS 30
+         Atom *atom_ptr[MAX_ATOMS];
+         char *names[MAX_ATOMS];
+         int i = 0;
+#define atom(a,b) atom_ptr[i] = &a; names[i] = b; i++
+         atom(_NET_WM_STATE, "_NET_WM_STATE");
+         atom(_NET_WM_STATE_REMOVE, "_NET_WM_STATE_REMOVE");
+         atom(_NET_WM_STATE_ADD, "_NET_WM_STATE_ADD");
+         atom(_NET_WM_STATE_FULLSCREEN, "_NET_WM_STATE_FULLSCREEN");
+#undef atom
+         Atom atoms[MAX_ATOMS];
+         XInternAtoms(winPtr->display, names, i, 0, atoms);
+         for (; i--;) {
+           *atom_ptr[i] = atoms[i];
+         }
+       }
+
+       XEvent e;
+       e.xany.type = ClientMessage;
+       e.xany.window = winPtr->window;
+       e.xclient.message_type = _NET_WM_STATE;
+       e.xclient.format = 32;
+       e.xclient.data.l[0] = 
+         (wmPtr->flags & WM_FULL_SCREEN)
+           ? _NET_WM_STATE_ADD
+           : _NET_WM_STATE_REMOVE;
+       e.xclient.data.l[1] = (long)_NET_WM_STATE_FULLSCREEN;
+       e.xclient.data.l[2] = (long)0;
+       e.xclient.data.l[3] = (long)0;
+       e.xclient.data.l[4] = (long)0;
+       XSendEvent(winPtr->display, RootWindow(winPtr->display, winPtr->screenNum), 0,
+                  SubstructureNotifyMask|SubstructureRedirectMask, &e);
+
+    } else if ((c == 'g') && (strncmp(argv[1], "geometry", length) == 0)
+           && (length >= 2)) {
+       char xSign, ySign;
+       int width, height;
+
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " geometry window ?newGeometry?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           xSign = (wmPtr->flags & WM_NEGATIVE_X) ? '-' : '+';
+           ySign = (wmPtr->flags & WM_NEGATIVE_Y) ? '-' : '+';
+           if (wmPtr->width != -1) {
+               width = wmPtr->width;
+               height = wmPtr->height;
+           } else if (IS_GRIDDED(wmPtr)) {
+               width = wmPtr->reqGridWidth;
+               height = wmPtr->reqGridHeight;
+           } else {
+               width = winPtr->reqWidth;
+               height = winPtr->reqHeight;
+           }
+           sprintf(interp->result, "%dx%d%c%d%c%d", width, height,
+                   xSign, wmPtr->x, ySign, wmPtr->y);
+           return TCL_OK;
+       }
+       if (*argv[3] == '\0') {
+           wmPtr->width = -1;
+           wmPtr->height = -1;
+           goto updateGeom;
+       }
+       return ParseGeometry(interp, argv[3], winPtr);
+    } else if ((c == 'g') && (strncmp(argv[1], "grid", length) == 0)
+           && (length >= 3)) {
+       int reqWidth, reqHeight, widthInc, heightInc;
+
+       if ((argc != 3) && (argc != 7)) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " reqsize window ?baseWidth baseHeight ",
+                   "widthInc heightInc?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           if (wmPtr->sizeHintsFlags & PBaseSize) {
+               sprintf(interp->result, "%d %d %d %d", wmPtr->reqGridWidth,
+                       wmPtr->reqGridHeight, wmPtr->widthInc,
+                       wmPtr->heightInc);
+           }
+           return TCL_OK;
+       }
+       if (*argv[3] == '\0') {
+           /*
+            * Turn off gridding and reset the width and height
+            * to make sense as ungridded numbers.
+            */
+
+           wmPtr->sizeHintsFlags &= ~(PBaseSize|PResizeInc);
+           wmPtr->widthInc = 1;
+           wmPtr->heightInc = 1;
+           if (wmPtr->width != -1) {
+               wmPtr->width = winPtr->reqWidth + (wmPtr->width
+                       - wmPtr->reqGridWidth)*wmPtr->widthInc;
+               wmPtr->height = winPtr->reqHeight + (wmPtr->height
+                       - wmPtr->reqGridHeight)*wmPtr->heightInc;
+           }
+       } else {
+           if ((Tcl_GetInt(interp, argv[3], &reqWidth) != TCL_OK)
+                   || (Tcl_GetInt(interp, argv[4], &reqHeight) != TCL_OK)
+                   || (Tcl_GetInt(interp, argv[5], &widthInc) != TCL_OK)
+                   || (Tcl_GetInt(interp, argv[6], &heightInc) != TCL_OK)) {
+               return TCL_ERROR;
+           }
+           if (reqWidth < 0) {
+               interp->result = "baseWidth can't be < 0";
+               return TCL_ERROR;
+           }
+           if (reqHeight < 0) {
+               interp->result = "baseHeight can't be < 0";
+               return TCL_ERROR;
+           }
+           if (widthInc < 0) {
+               interp->result = "widthInc can't be < 0";
+               return TCL_ERROR;
+           }
+           if (heightInc < 0) {
+               interp->result = "heightInc can't be < 0";
+               return TCL_ERROR;
+           }
+           Tk_SetGrid((Tk_Window) tkwin, reqWidth, reqHeight, widthInc,
+                   heightInc);
+       }
+       wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
+       goto updateGeom;
+    } else if ((c == 'g') && (strncmp(argv[1], "group", length) == 0)
+           && (length >= 3)) {
+       Tk_Window tkwin2;
+
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " group window ?pathName?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           if (wmPtr->hints.flags & WindowGroupHint) {
+               interp->result = wmPtr->leaderName;
+           }
+           return TCL_OK;
+       }
+       if (*argv[3] == '\0') {
+           wmPtr->hints.flags &= ~WindowGroupHint;
+           wmPtr->leaderName = NULL;
+       } else {
+           tkwin2 = Tk_NameToWindow(interp, argv[3], tkwin);
+           if (tkwin2 == NULL) {
+               return TCL_ERROR;
+           }
+           Tk_MakeWindowExist(tkwin2);
+           wmPtr->hints.window_group = Tk_WindowId(tkwin2);
+           wmPtr->hints.flags |= WindowGroupHint;
+           wmPtr->leaderName = Tk_PathName(tkwin2);
+       }
+       UpdateHints(winPtr);
+    } else if ((c == 'i') && (strncmp(argv[1], "iconbitmap", length) == 0)
+           && (length >= 5)) {
+       Pixmap pixmap;
+
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " iconbitmap window ?bitmap?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           if (wmPtr->hints.flags & IconPixmapHint) {
+               interp->result = Tk_NameOfBitmap(wmPtr->hints.icon_pixmap);
+           }
+           return TCL_OK;
+       }
+       if (*argv[3] == '\0') {
+           if (wmPtr->hints.icon_pixmap != None) {
+               Tk_FreeBitmap(wmPtr->hints.icon_pixmap);
+           }
+           wmPtr->hints.flags &= ~IconPixmapHint;
+       } else {
+           pixmap = Tk_GetBitmap(interp, tkwin, Tk_GetUid(argv[3]));
+           if (pixmap == None) {
+               return TCL_ERROR;
+           }
+           wmPtr->hints.icon_pixmap = pixmap;
+           wmPtr->hints.flags |= IconPixmapHint;
+       }
+       UpdateHints(winPtr);
+    } else if ((c == 'i') && (strncmp(argv[1], "iconify", length) == 0)
+           && (length >= 5)) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " iconify window\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       wmPtr->hints.initial_state = IconicState;
+       if (wmPtr->flags & WM_NEVER_MAPPED) {
+           return TCL_OK;
+       }
+#ifndef X11R3
+       if (XIconifyWindow(winPtr->display, winPtr->window,
+               winPtr->screenNum) == 0) {
+           interp->result =
+                   "couldn't send iconify message to window manager";
+           return TCL_ERROR;
+       }
+#else
+       interp->result = "can't iconify under X11R3";
+       return TCL_ERROR;
+#endif
+    } else if ((c == 'i') && (strncmp(argv[1], "iconmask", length) == 0)
+           && (length >= 5)) {
+       Pixmap pixmap;
+
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " iconmask window ?bitmap?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           if (wmPtr->hints.flags & IconMaskHint) {
+               interp->result = Tk_NameOfBitmap(wmPtr->hints.icon_mask);
+           }
+           return TCL_OK;
+       }
+       if (*argv[3] == '\0') {
+           if (wmPtr->hints.icon_mask != None) {
+               Tk_FreeBitmap(wmPtr->hints.icon_mask);
+           }
+           wmPtr->hints.flags &= ~IconMaskHint;
+       } else {
+           pixmap = Tk_GetBitmap(interp, tkwin, Tk_GetUid(argv[3]));
+           if (pixmap == None) {
+               return TCL_ERROR;
+           }
+           wmPtr->hints.icon_mask = pixmap;
+           wmPtr->hints.flags |= IconMaskHint;
+       }
+       UpdateHints(winPtr);
+    } else if ((c == 'i') && (strncmp(argv[1], "iconname", length) == 0)
+           && (length >= 5)) {
+       if (argc > 4) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " iconname window ?newName?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           interp->result = (wmPtr->iconName != NULL) ? wmPtr->iconName : "";
+           return TCL_OK;
+       } else {
+           wmPtr->iconName = Tk_GetUid(argv[3]);
+           if (!(wmPtr->flags & WM_NEVER_MAPPED)) {
+               XSetIconName(winPtr->display, winPtr->window, wmPtr->iconName);
+           }
+       }
+    } else if ((c == 'i') && (strncmp(argv[1], "iconposition", length) == 0)
+           && (length >= 5)) {
+       int x, y;
+
+       if ((argc != 3) && (argc != 5)) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " iconposition window ?x y?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           if (wmPtr->hints.flags & IconPositionHint) {
+               sprintf(interp->result, "%d %d", wmPtr->hints.icon_x,
+                       wmPtr->hints.icon_y);
+           }
+           return TCL_OK;
+       }
+       if (*argv[3] == '\0') {
+           wmPtr->hints.flags &= ~IconPositionHint;
+       } else {
+           if ((Tcl_GetInt(interp, argv[3], &x) != TCL_OK)
+                   || (Tcl_GetInt(interp, argv[4], &y) != TCL_OK)){
+               return TCL_ERROR;
+           }
+           wmPtr->hints.icon_x = x;
+           wmPtr->hints.icon_y = y;
+           wmPtr->hints.flags |= IconPositionHint;
+       }
+       UpdateHints(winPtr);
+    } else if ((c == 'i') && (strncmp(argv[1], "iconwindow", length) == 0)
+           && (length >= 5)) {
+       Tk_Window tkwin2;
+
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " iconwindow window ?pathName?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           if (wmPtr->hints.flags & IconWindowHint) {
+               interp->result = wmPtr->iconWindowName;
+           }
+           return TCL_OK;
+       }
+       if (*argv[3] == '\0') {
+           wmPtr->hints.flags &= ~IconWindowHint;
+           wmPtr->iconWindowName = NULL;
+       } else {
+           tkwin2 = Tk_NameToWindow(interp, argv[3], tkwin);
+           if (tkwin2 == NULL) {
+               return TCL_ERROR;
+           }
+           Tk_MakeWindowExist(tkwin2);
+           wmPtr->hints.icon_window = Tk_WindowId(tkwin2);
+           wmPtr->hints.flags |= IconWindowHint;
+           wmPtr->iconWindowName = Tk_PathName(tkwin2);
+       }
+       UpdateHints(winPtr);
+    } else if ((c == 'm') && (strncmp(argv[1], "maxsize", length) == 0)
+           && (length >= 2)) {
+       int width, height;
+       if ((argc != 3) && (argc != 5)) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " maxsize window ?width height?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           if (wmPtr->sizeHintsFlags & PMaxSize) {
+               sprintf(interp->result, "%d %d", wmPtr->maxWidth,
+                       wmPtr->maxHeight);
+           }
+           return TCL_OK;
+       }
+       if (*argv[3] == '\0') {
+           wmPtr->sizeHintsFlags &= ~PMaxSize;
+       } else {
+           if ((Tcl_GetInt(interp, argv[3], &width) != TCL_OK)
+                   || (Tcl_GetInt(interp, argv[4], &height) != TCL_OK)) {
+               return TCL_ERROR;
+           }
+           wmPtr->maxWidth = width;
+           wmPtr->maxHeight = height;
+           wmPtr->sizeHintsFlags |= PMaxSize;
+       }
+       wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
+       goto updateGeom;
+    } else if ((c == 'm') && (strncmp(argv[1], "minsize", length) == 0)
+           && (length >= 2)) {
+       int width, height;
+       if ((argc != 3) && (argc != 5)) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " minsize window ?width height?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           if (wmPtr->sizeHintsFlags & PMinSize) {
+               sprintf(interp->result, "%d %d", wmPtr->minWidth,
+                       wmPtr->minHeight);
+           }
+           return TCL_OK;
+       }
+       if (*argv[3] == '\0') {
+           wmPtr->sizeHintsFlags &= ~PMinSize;
+       } else {
+           if ((Tcl_GetInt(interp, argv[3], &width) != TCL_OK)
+                   || (Tcl_GetInt(interp, argv[4], &height) != TCL_OK)) {
+               return TCL_ERROR;
+           }
+           wmPtr->minWidth = width;
+           wmPtr->minHeight = height;
+           wmPtr->sizeHintsFlags |= PMinSize;
+       }
+       wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
+       goto updateGeom;
+    } else if ((c == 'p') && (strncmp(argv[1], "positionfrom", length) == 0)) {
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " positionfrom window ?user/program?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           if (wmPtr->sizeHintsFlags & USPosition) {
+               interp->result = "user";
+           } else if (wmPtr->sizeHintsFlags & PPosition) {
+               interp->result = "program";
+           }
+           return TCL_OK;
+       }
+       if (*argv[3] == '\0') {
+           wmPtr->sizeHintsFlags &= ~(USPosition|PPosition);
+       } else {
+           c = argv[3][0];
+           length = strlen(argv[3]);
+           if ((c == 'u') && (strncmp(argv[3], "user", length) == 0)) {
+               wmPtr->sizeHintsFlags &= ~PPosition;
+               wmPtr->sizeHintsFlags |= USPosition;
+           } else if ((c == 'p') && (strncmp(argv[3], "program", length) == 0)) {
+               wmPtr->sizeHintsFlags &= ~USPosition;
+               wmPtr->sizeHintsFlags |= PPosition;
+           } else {
+               Tcl_AppendResult(interp, "bad argument \"", argv[3],
+                       "\": must be program or user", (char *) NULL);
+               return TCL_ERROR;
+           }
+       }
+       wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
+       goto updateGeom;
+    } else if ((c == 'r') && (strncmp(argv[1], "raise", length) == 0)) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " raise window\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       Tk_MakeWindowExist((Tk_Window) winPtr);
+       XRaiseWindow(Tk_Display(winPtr), Tk_WindowId(winPtr));
+    } else if ((c == 's') && (strncmp(argv[1], "sizefrom", length) == 0)) {
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " sizefrom window ?user|program?\"",
+                   (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           if (wmPtr->sizeHintsFlags & USSize) {
+               interp->result = "user";
+           } else if (wmPtr->sizeHintsFlags & PSize) {
+               interp->result = "program";
+           }
+           return TCL_OK;
+       }
+       if (*argv[3] == '\0') {
+           wmPtr->sizeHintsFlags &= ~(USSize|PSize);
+       } else {
+           c = argv[3][0];
+           length = strlen(argv[3]);
+           if ((c == 'u') && (strncmp(argv[3], "user", length) == 0)) {
+               wmPtr->sizeHintsFlags &= ~PSize;
+               wmPtr->sizeHintsFlags |= USSize;
+           } else if ((c == 'p')
+                   && (strncmp(argv[3], "program", length) == 0)) {
+               wmPtr->sizeHintsFlags &= ~USSize;
+               wmPtr->sizeHintsFlags |= PSize;
+           } else {
+               Tcl_AppendResult(interp, "bad argument \"", argv[3],
+                       "\": must be program or user", (char *) NULL);
+               return TCL_ERROR;
+           }
+       }
+       wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
+       goto updateGeom;
+    } else if ((c == 't') && (strncmp(argv[1], "title", length) == 0)
+           && (length >= 2)) {
+       if (argc > 4) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " title window ?newTitle?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           interp->result = (wmPtr->titleUid != NULL) ? wmPtr->titleUid
+                   : winPtr->nameUid;
+           return TCL_OK;
+       } else {
+           wmPtr->titleUid = Tk_GetUid(argv[3]);
+#ifndef X11R3
+           if (!(wmPtr->flags & WM_NEVER_MAPPED)) {
+               XTextProperty textProp;
+
+               if (XStringListToTextProperty(&wmPtr->titleUid, 1,
+                       &textProp)  != 0) {
+                   XSetWMName(winPtr->display, winPtr->window, &textProp);
+                   XFree((char *) textProp.value);
+               }
+           }
+#endif
+       }
+#ifndef X11R3
+    } else if ((c == 't') && (strncmp(argv[1], "transient", length) == 0)
+           && (length >= 2)) {
+       Tk_Window master;
+
+       if ((argc != 3) && (argc != 4)) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " transient window ?master?\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       if (argc == 3) {
+           if (wmPtr->master != None) {
+               interp->result = wmPtr->masterWindowName;
+           }
+           return TCL_OK;
+       }
+       if (argv[3][0] == '\0') {
+           wmPtr->master = None;
+           wmPtr->masterWindowName = NULL;
+       } else {
+           master = Tk_NameToWindow(interp, argv[3], tkwin);
+           if (master == NULL) {
+               return TCL_ERROR;
+           }
+           Tk_MakeWindowExist(master);
+           wmPtr->master = Tk_WindowId(master);
+           wmPtr->masterWindowName = Tk_PathName(master);
+       }
+       if (!(wmPtr->flags & WM_NEVER_MAPPED)) {
+           XSetTransientForHint(winPtr->display, winPtr->window,
+                   wmPtr->master);
+       }
+    } else if ((c == 'w') && (strncmp(argv[1], "withdraw", length) == 0)) {
+       if (argc != 3) {
+           Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                   argv[0], " withdraw window\"", (char *) NULL);
+           return TCL_ERROR;
+       }
+       wmPtr->hints.initial_state = WithdrawnState;
+       if (wmPtr->flags & WM_NEVER_MAPPED) {
+           return TCL_OK;
+       }
+       if (XWithdrawWindow(winPtr->display, winPtr->window,
+               winPtr->screenNum) == 0) {
+           interp->result =
+                   "couldn't send withdraw message to window manager";
+           return TCL_ERROR;
+       }
+       winPtr->flags &= ~TK_MAPPED;
+    } else if ((c == 'p') && (strncmp(argv[1], "protocol", length) == 0)) {
+       /*
+         * handle various ICCCM WM_PROTOCOL attributes
+         */
+        if (argc < 4) {
+            Tcl_AppendResult(interp, "wrong # arguments: must be \"",
+                    argv[0], " protocol window type..\"", (char *) NULL);
+            return TCL_ERROR;
+        }
+        if (!strcmp(argv[3], "delete")) {
+           return WmProtocolCmd(interp, &(wmPtr->deleteCmd), argc, argv);
+       } else {
+           Tcl_AppendResult(interp,  argv[0], 
+               ": bad argument ", argv[3], " must be: ", 
+               "delete", (char *) NULL);
+            return TCL_ERROR;
+       }
+#endif
+    } else {
+       Tcl_AppendResult(interp, "unknown or ambiguous option \"", argv[1],
+               "\": must be aspect, deiconify, focusmodel, ",
+               "fullscreen, geometry, grid, group, iconbitmap, ",
+               "iconify, iconmask, iconname, iconposition, ",
+               "iconwindow, maxsize, minsize, positionfrom, raise, ",
+               "sizefrom,  title, transient, withdraw, or protocol",
+               (char *) NULL);
+       return TCL_ERROR;
+    }
+    return TCL_OK;
+
+    updateGeom:
+    if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) {
+       Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr);
+       wmPtr->flags |= WM_UPDATE_PENDING;
+    }
+    return TCL_OK;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_SetGrid --
+ *
+ *     This procedure is invoked by a widget when it wishes to set a grid
+ *     coordinate system that controls the size of a top-level window.
+ *     It provides a C interface equivalent to the "wm grid" command and
+ *     is usually asscoiated with the -setgrid option.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Grid-related information will be passed to the window manager, so
+ *     that the top-level window associated with tkwin will resize on
+ *     even grid units.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_SetGrid(tkwin, reqWidth, reqHeight, widthInc, heightInc)
+    Tk_Window tkwin;           /* Token for window.  New window mgr info
+                                * will be posted for the top-level window
+                                * associated with this window. */
+    int reqWidth;              /* Width (in grid units) corresponding to
+                                * the requested geometry for tkwin. */
+    int reqHeight;             /* Height (in grid units) corresponding to
+                                * the requested geometry for tkwin. */
+    int widthInc, heightInc;   /* Pixel increments corresponding to a
+                                * change of one grid unit. */
+{
+    TkWindow *winPtr = (TkWindow *) tkwin;
+    register WmInfo *wmPtr;
+
+    /*
+     * Find the top-level window for tkwin, plus the window manager
+     * information.
+     */
+
+    while (!(winPtr->flags & TK_TOP_LEVEL)) {
+       winPtr = winPtr->parentPtr;
+    }
+    wmPtr = winPtr->wmInfoPtr;
+
+    if ((wmPtr->reqGridWidth == reqWidth)
+           && (wmPtr->reqGridHeight != reqHeight)
+           && (wmPtr->widthInc != widthInc)
+           && (wmPtr->heightInc != heightInc)
+           && ((wmPtr->sizeHintsFlags & (PBaseSize|PResizeInc))
+                   == PBaseSize|PResizeInc)) {
+       return;
+    }
+
+    /*
+     * If gridding was previously off, then forget about any window
+     * size requests made by the user or via "wm geometry":  these are
+     * in pixel units and there's no easy way to translate them to
+     * grid units since the new requested size of the top-level window in
+     * pixels may not yet have been registered yet (it may filter up
+     * the hierarchy in DoWhenIdle handlers).
+     */
+
+    if (!(wmPtr->sizeHintsFlags & PBaseSize)) {
+       wmPtr->width = -1;
+       wmPtr->height = -1;
+    }
+
+    /* 
+     * Set the new gridding information, and start the process of passing
+     * all of this information to the window manager.
+     */
+
+    wmPtr->reqGridWidth = reqWidth;
+    wmPtr->reqGridHeight = reqHeight;
+    wmPtr->widthInc = widthInc;
+    wmPtr->heightInc = heightInc;
+    wmPtr->sizeHintsFlags |= PBaseSize|PResizeInc;
+    wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
+    if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) {
+       Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr);
+       wmPtr->flags |= WM_UPDATE_PENDING;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TopLevelEventProc --
+ *
+ *     This procedure is invoked when a top-level (or other externally-
+ *     managed window) is restructured in any way.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Tk's internal data structures for the window get modified to
+ *     reflect the structural change.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+TopLevelEventProc(clientData, eventPtr)
+    ClientData clientData;             /* Window for which event occurred. */
+    XEvent *eventPtr;                  /* Event that just happened. */
+{
+    register TkWindow *winPtr = (TkWindow *) clientData;
+
+    if (eventPtr->type == DestroyNotify) {
+       if (!(winPtr->flags & TK_ALREADY_DEAD)) {
+           Tk_DestroyWindow((Tk_Window) winPtr);
+       }
+    } else if (eventPtr->type == ConfigureNotify) {
+       register WmInfo *wmPtr = winPtr->wmInfoPtr;
+       int diff, x, y;
+
+       /*
+        * A top-level window has been reconfigured.  Problem #1:
+        * discard stale information.  If the application has recently
+        * tried to reconfigure itself, ignore all events until the
+        * response to that reconfiguration arrives (the response is
+        * assumed to be the first ConfigureNotify that arrives after
+        * the server has seen the request;  this suffers from potential
+        * races with user actions, but it's the best I can think of
+        * right now).
+        */
+
+       diff = eventPtr->xconfigure.serial - wmPtr->configRequest;
+       if (diff < 0) {
+           return;
+       }
+
+       /*
+        * Problem #2: reparenting window managers.  If the window
+        * manager reparents a top-level window then the x and y
+        * information that comes in events for the window is wrong:
+        * it gives the location of the window inside its decorative
+        * parent, rather than the location of the window in root
+        * coordinates, which is what we want.  Window managers
+        * are supposed to send synthetic events with the correct
+        * information, but ICCCM doesn't require them to do this
+        * under all conditions, and the information provided doesn't
+        * include everything we need here.  So, the code below
+        * maintains a bunch of information about the parent window.
+        * If the window hasn't been reparented, we pretend that
+        * there is a parent shrink-wrapped around the window.
+        */
+
+       if (wmPtr->reparent == None) {
+           noReparent:
+           winPtr->changes.x = eventPtr->xconfigure.x;
+           winPtr->changes.y = eventPtr->xconfigure.y;
+           wmPtr->parentWidth = eventPtr->xconfigure.width
+                   + 2*eventPtr->xconfigure.border_width;
+           wmPtr->parentHeight = eventPtr->xconfigure.height
+                   + 2*eventPtr->xconfigure.border_width;
+       } else {
+           unsigned int width, height, bd, dummy;
+           Window dummy2;
+           Status status;
+           Tk_ErrorHandler handler;
+
+           handler = Tk_CreateErrorHandler(winPtr->display, BadDrawable, -1,
+                   -1, (Tk_ErrorProc *) NULL, (ClientData) NULL);
+           status = XGetGeometry(winPtr->display, wmPtr->reparent,
+                   &dummy2, &x, &y, &width, &height, &bd, &dummy);
+           Tk_DeleteErrorHandler(handler);
+           if (status == 0) {
+               /*
+                * It appears that the reparented parent went away and
+                * no-one told us.  Reset the window to indicate that
+                * it's not reparented, then handle it as a non-reparented
+                * window.
+                */
+               wmPtr->reparent = None;
+               wmPtr->flags &= ~WM_NESTED_REPARENT;
+               wmPtr->xInParent = wmPtr->yInParent = 0;
+               goto noReparent;
+           }
+           wmPtr->parentWidth = width + 2*bd;
+           wmPtr->parentHeight = height + 2*bd;
+           winPtr->changes.x = x;
+           winPtr->changes.y = y;
+           if (wmPtr->flags & WM_NESTED_REPARENT) {
+               int xOffset, yOffset;
+
+               (void) XTranslateCoordinates(winPtr->display, winPtr->window,
+                   wmPtr->reparent, 0, 0, &xOffset, &yOffset, &dummy2);
+               wmPtr->xInParent = xOffset + bd - winPtr->changes.border_width;
+               wmPtr->yInParent = yOffset + bd - winPtr->changes.border_width;
+           } else {
+               if (!eventPtr->xconfigure.send_event) {
+                   wmPtr->xInParent = eventPtr->xconfigure.x + bd;
+                   wmPtr->yInParent = eventPtr->xconfigure.y + bd;
+               }
+           }
+           winPtr->changes.x = x + wmPtr->xInParent;
+           winPtr->changes.y = y + wmPtr->yInParent;
+       }
+
+       /*
+        * Problem #3: if the window size or location was changed
+        * externally, update the geometry information in wmPtr to make
+        * it look just as if the user had typed a "wm geometry" command
+        * to make the change.  There are many tricky situations to deal
+        * with:
+        * (a) the event is simply a reflection of an internal geometry
+        *     request from the window's widgets (must leave width and
+        *     height alone in this case).
+        * (b) the window manager might respond to a size request from
+        *     us with a different size than requested (e.g. it might
+        *     have a minimum allowable window size).  Because of this,
+        *     can't just compare new size with requested size to determine
+        *     whether this event is a reflection of an internal request
+        *     from within the application.  Use WM_CONFIG_PENDING flag
+        *     instead.
+        * (c) ConfigureNotify events also arise if the window has been
+        *     moved, even if its size hasn't changed.  Must distinguish
+        *     between the user moving the window and the user resizing
+        *     the window.
+        */
+
+       if (wmPtr->flags & WM_CONFIG_PENDING) {
+           int diff;
+           /*
+            * Size change is just a reflection of something coming from
+            * application.
+            */
+
+           diff = eventPtr->xconfigure.serial - wmPtr->configRequest;
+           if (diff >= 0) {
+               if (wmPtr->flags & WM_CONFIG_AGAIN) {
+                   if (!(wmPtr->flags & WM_UPDATE_PENDING)) {
+                       Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr);
+                       wmPtr->flags |= WM_UPDATE_PENDING;
+                   }
+               }
+               wmPtr->flags &= ~(WM_CONFIG_PENDING|WM_CONFIG_AGAIN);
+           }
+       } else if ((winPtr->changes.width != eventPtr->xconfigure.width)
+               || (winPtr->changes.height != eventPtr->xconfigure.height)) {
+           wmPtr->configWidth = -1;
+           wmPtr->configHeight = -1;
+           if (IS_GRIDDED(wmPtr)) {
+               wmPtr->width = wmPtr->reqGridWidth
+                       + (eventPtr->xconfigure.width
+                       - winPtr->reqWidth)/wmPtr->widthInc;
+               if (wmPtr->width < 0) {
+                   wmPtr->width = 0;
+               }
+               wmPtr->height = wmPtr->reqGridHeight
+                       + (eventPtr->xconfigure.height
+                       - winPtr->reqHeight)/wmPtr->heightInc;
+               if (wmPtr->height < 0) {
+                   wmPtr->height = 0;
+               }
+           } else if ((eventPtr->xconfigure.width != winPtr->changes.width)
+                   || (eventPtr->xconfigure.height
+                           != winPtr->changes.height)) {
+               /*
+                * The check above is needed so we don't think the user
+                * requested a new size when all he/she did was to move
+                * the window.
+                */
+
+               wmPtr->width = eventPtr->xconfigure.width;
+               wmPtr->height = eventPtr->xconfigure.height;
+           }
+       }
+
+       winPtr->changes.width = eventPtr->xconfigure.width;
+       winPtr->changes.height = eventPtr->xconfigure.height;
+       winPtr->changes.border_width = eventPtr->xconfigure.border_width;
+       winPtr->changes.sibling = eventPtr->xconfigure.above;
+       winPtr->changes.stack_mode = Above;
+
+       x = winPtr->changes.x - wmPtr->xInParent;
+       if (wmPtr->flags & WM_NEGATIVE_X) {
+           x = DisplayWidth(winPtr->display, winPtr->screenNum)
+                   - (x + wmPtr->parentWidth);
+       }
+       y = winPtr->changes.y - wmPtr->yInParent;
+       if (wmPtr->flags & WM_NEGATIVE_Y) {
+           y = DisplayHeight(winPtr->display, winPtr->screenNum)
+                   - (y + wmPtr->parentHeight);
+       }
+       if ((x != wmPtr->x) || (y != wmPtr->y)) {
+           wmPtr->x = x;
+           wmPtr->y = y;
+       }
+    } else if (eventPtr->type == MapNotify) {
+       winPtr->flags |= TK_MAPPED;
+    } else if (eventPtr->type == UnmapNotify) {
+       winPtr->flags &= ~TK_MAPPED;
+    } else if (eventPtr->type == ReparentNotify) {
+       WmInfo *wmPtr = winPtr->wmInfoPtr;
+       Window root, *children, dummy2, *virtualRootPtr;
+       Atom virtualRootAtom, actualType;
+       int actualFormat;
+       unsigned long numItems, bytesAfter;
+       unsigned int dummy;
+
+       /*
+        * Locate the ancestor of this window that is just below the
+        * root window for the screen (could be the window itself).
+        * This code is a bit tricky because it allows for the
+        * possibility of a virtual root window, which is identified
+        * with a property named __SWM_VROOT.
+        */
+
+       virtualRootAtom = Tk_InternAtom((Tk_Window) winPtr, "__SWM_VROOT");
+       wmPtr->flags &= ~WM_NESTED_REPARENT;
+       wmPtr->reparent = None;
+       root = eventPtr->xreparent.parent;
+       while (root != RootWindow(winPtr->display, winPtr->screenNum)) {
+           Tk_ErrorHandler handler1, handler2;
+           int status;
+
+           virtualRootPtr = NULL;
+
+           handler1 =
+             Tk_CreateErrorHandler(winPtr->display, BadDrawable,
+                                   -1, -1, (Tk_ErrorProc *) NULL,
+                                   (ClientData) NULL);
+           handler2 =
+             Tk_CreateErrorHandler(winPtr->display, BadWindow,
+                                   -1, -1, (Tk_ErrorProc *) NULL,
+                                   (ClientData) NULL);
+
+           status = XGetWindowProperty(winPtr->display, root,
+                                       virtualRootAtom,
+                                       0, (long) 1, False, XA_WINDOW,
+                                       &actualType, &actualFormat,
+                                       &numItems, &bytesAfter,
+                                       (unsigned char **) &virtualRootPtr);
+
+           Tk_DeleteErrorHandler(handler1);
+           Tk_DeleteErrorHandler(handler2);
+
+           if (status == Success) {
+               if (virtualRootPtr != NULL) {
+                   if (*virtualRootPtr != root) {
+                       panic("TopLevelEventProc confused over virtual root");
+                   }
+                   XFree((char *) virtualRootPtr);
+                   break;
+               }
+           }
+           wmPtr->reparent = root;
+           (void) XQueryTree(winPtr->display, root, &dummy2, &root,
+                   &children, &dummy);
+           XFree((char *) children);
+       }
+
+       /*
+        * The ancestor just below the (virtual) root is in wmPtr->reparent
+        * now, and the (virtual) root is in root.
+        */
+
+
+       if (eventPtr->xreparent.parent == root) {
+           wmPtr->reparent = None;
+           wmPtr->flags &= ~WM_NESTED_REPARENT;
+           wmPtr->parentWidth = winPtr->changes.width
+                   + 2*winPtr->changes.border_width;
+           wmPtr->parentHeight = winPtr->changes.height
+                   + 2*winPtr->changes.border_width;
+           wmPtr->xInParent = wmPtr->yInParent = 0;
+           winPtr->changes.x = eventPtr->xreparent.x;
+           winPtr->changes.y = eventPtr->xreparent.y;
+       } else {
+           int x, y, xOffset, yOffset;
+           unsigned int width, height, bd;
+
+           if (wmPtr->reparent != eventPtr->xreparent.parent) {
+               wmPtr->flags |= WM_NESTED_REPARENT;
+           } else {
+               wmPtr->flags &= ~WM_NESTED_REPARENT;
+           }
+
+           /*
+            * Compute and save information about reparent and about
+            * the window's position in reparent.
+            */
+
+           (void) XGetGeometry(winPtr->display, wmPtr->reparent,
+                   &dummy2, &x, &y, &width, &height, &bd, &dummy);
+           wmPtr->parentWidth = width + 2*bd;
+           wmPtr->parentHeight = height + 2*bd;
+           (void) XTranslateCoordinates(winPtr->display, winPtr->window,
+                   wmPtr->reparent, 0, 0, &xOffset, &yOffset, &dummy2);
+           wmPtr->xInParent = xOffset + bd - winPtr->changes.border_width;
+           wmPtr->yInParent = yOffset + bd - winPtr->changes.border_width;
+           winPtr->changes.x = x + xOffset;
+           winPtr->changes.y = y + yOffset;
+       }
+    } else if ((eventPtr->type == EnterNotify)
+           || (eventPtr->type == LeaveNotify)) {
+       TkFocusEventProc(winPtr, eventPtr);
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TopLevelReqProc --
+ *
+ *     This procedure is invoked by the geometry manager whenever
+ *     the requested size for a top-level window is changed.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Arrange for the window to be resized to satisfy the request
+ *     (this happens as a when-idle action).
+ *
+ *----------------------------------------------------------------------
+ */
+
+       /* ARGSUSED */
+static void
+TopLevelReqProc(dummy, tkwin)
+    ClientData dummy;                  /* Not used. */
+    Tk_Window tkwin;                   /* Information about window. */
+{
+    TkWindow *winPtr = (TkWindow *) tkwin;
+    WmInfo *wmPtr;
+
+    wmPtr = winPtr->wmInfoPtr;
+    if ((wmPtr->prevReqWidth == winPtr->reqWidth)
+           && (wmPtr->prevReqHeight == winPtr->reqHeight)) {
+       return;
+    }
+    wmPtr->prevReqWidth = winPtr->reqWidth;
+    wmPtr->prevReqHeight = winPtr->reqHeight;
+    wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
+    if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) {
+       Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr);
+       wmPtr->flags |= WM_UPDATE_PENDING;
+    }
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * UpdateGeometryInfo --
+ *
+ *     This procedure is invoked when a top-level window is first
+ *     mapped, and also as a when-idle procedure, to bring the
+ *     geometry and/or position of a top-level window back into
+ *     line with what has been requested by the user and/or widgets.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     The window's size and location may change, unless the WM prevents
+ *     that from happening.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+UpdateGeometryInfo(clientData)
+    ClientData clientData;             /* Pointer to the window's record. */
+{
+    register TkWindow *winPtr = (TkWindow *) clientData;
+    register WmInfo *wmPtr = winPtr->wmInfoPtr;
+    int x, y, width, height;
+
+    /*
+     * It isn't safe to issue a new reconfigure request while there is
+     * another reconfigure request outstanding.  If this happens, skip
+     * the second reconfigure operation but set a flag so it will get
+     * done with the first one finishes.
+     */
+
+    wmPtr->flags &= ~WM_UPDATE_PENDING;
+    if (wmPtr->flags & WM_CONFIG_PENDING) {
+       wmPtr->flags |= WM_CONFIG_AGAIN;
+       return;
+    }
+
+    /*
+     * Compute the new size for the top-level window.  See the
+     * user documentation for details on this, but the size
+     * requested depends on (a) the size requested internally
+     * by the window's widgets, (b) the size requested by the
+     * user in a "wm geometry" command or via wm-based interactive
+     * resizing (if any), and (c) whether or not the window
+     * gridded.  Don't permit sizes <= 0 because this upsets
+     * the X server.
+     */
+
+    if (wmPtr->width == -1) {
+       width = winPtr->reqWidth;
+       height = winPtr->reqHeight;
+    } else if (IS_GRIDDED(wmPtr)) {
+       width = winPtr->reqWidth
+               + (wmPtr->width - wmPtr->reqGridWidth)*wmPtr->widthInc;
+       height = winPtr->reqHeight
+               + (wmPtr->height - wmPtr->reqGridHeight)*wmPtr->heightInc;
+    } else {
+       width = wmPtr->width;
+       height = wmPtr->height;
+    }
+    if (width <= 0) {
+       width = 1;
+    }
+    if (height <= 0) {
+       height = 1;
+    }
+
+    /*
+     * Compute the new position for the window.  This is tricky, because
+     * we need to include the border widths supplied by a reparented
+     * parent in this calculation, but can't use the parent's current
+     * overall size since that may change as a result of this code.
+     */
+
+    if (wmPtr->flags & WM_NEGATIVE_X) {
+       x = DisplayWidth(winPtr->display, winPtr->screenNum) - wmPtr->x
+               - (width + (wmPtr->parentWidth - winPtr->changes.width))
+               + wmPtr->xInParent;
+    } else {
+       x =  wmPtr->x + wmPtr->xInParent;
+    }
+    if (wmPtr->flags & WM_NEGATIVE_Y) {
+       y = DisplayHeight(winPtr->display, winPtr->screenNum) - wmPtr->y
+               - (height + (wmPtr->parentHeight - winPtr->changes.height))
+               + wmPtr->yInParent;
+    } else {
+       y =  wmPtr->y + wmPtr->yInParent;
+    }
+
+    /*
+     * If the window's size is going to change and the window is
+     * supposed to not be resizable by the user, then we have to
+     * update the size hints.  There may also be a size-hint-update
+     * request pending from somewhere else, too.
+     */
+
+    if (((width != winPtr->changes.width) || (width != winPtr->changes.width))
+           && !IS_GRIDDED(wmPtr)
+           && ((wmPtr->sizeHintsFlags & (PMinSize|PMaxSize)) == 0)) {
+       wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
+    }
+    if (wmPtr->flags & WM_UPDATE_SIZE_HINTS) {
+       UpdateSizeHints(winPtr);
+    }
+
+    /*
+     * If the geometry hasn't changed, be careful to  use only a
+     * resize operation.  This is because of bugs in some window
+     * managers (e.g. twm, as of 4/24/91) where they don't interpret
+     * coordinates according to ICCCM.
+     */
+
+    if ((x != winPtr->changes.x) || (y != winPtr->changes.y)) {
+       wmPtr->configRequest = XNextRequest(winPtr->display);
+       wmPtr->configWidth = width;
+       wmPtr->configHeight = height;
+       Tk_MoveResizeWindow((Tk_Window) winPtr, x, y, (unsigned) width,
+               (unsigned) height);
+       wmPtr->flags |= WM_CONFIG_PENDING;
+    } else if ((width != wmPtr->configWidth)
+           || (height != wmPtr->configHeight)) {
+       wmPtr->configRequest = XNextRequest(winPtr->display);
+       wmPtr->configWidth = width;
+       wmPtr->configHeight = height;
+       Tk_ResizeWindow((Tk_Window) winPtr, (unsigned) width,
+               (unsigned) height);
+       wmPtr->flags |= WM_CONFIG_PENDING;
+    }
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * UpdateSizeHints --
+ *
+ *     This procedure is called to update the window manager's
+ *     size hints information from the information in a WmInfo
+ *     structure.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Properties get changed for winPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+UpdateSizeHints(winPtr)
+    TkWindow *winPtr;
+{
+    register WmInfo *wmPtr = winPtr->wmInfoPtr;
+    XSizeHints *hintsPtr;
+
+    wmPtr->flags &= ~WM_UPDATE_SIZE_HINTS;
+
+#ifndef X11R3
+    hintsPtr = XAllocSizeHints();
+    if (hintsPtr == NULL) {
+       return;
+    }
+
+    /*
+     * Compute the pixel-based sizes for the various fields in the
+     * size hints structure, based on the grid-based sizes in
+     * our structure.
+     */
+
+    if (IS_GRIDDED(wmPtr)) {
+       hintsPtr->base_width = winPtr->reqWidth
+               - (wmPtr->reqGridWidth * wmPtr->widthInc);
+       if (hintsPtr->base_width < 0) {
+           hintsPtr->base_width = 0;
+       }
+       hintsPtr->base_height = winPtr->reqHeight
+               - (wmPtr->reqGridHeight * wmPtr->heightInc);
+       if (hintsPtr->base_height < 0) {
+           hintsPtr->base_height = 0;
+       }
+       hintsPtr->min_width = hintsPtr->base_width
+               + (wmPtr->minWidth * wmPtr->widthInc);
+       hintsPtr->min_height = hintsPtr->base_height
+               + (wmPtr->minHeight * wmPtr->heightInc);
+       hintsPtr->max_width = hintsPtr->base_width
+               + (wmPtr->maxWidth * wmPtr->widthInc);
+       hintsPtr->max_height = hintsPtr->base_height
+               + (wmPtr->maxHeight * wmPtr->heightInc);
+    } else {
+       hintsPtr->min_width = wmPtr->minWidth;
+       hintsPtr->min_height = wmPtr->minHeight;
+       hintsPtr->max_width = wmPtr->maxWidth;
+       hintsPtr->max_height = wmPtr->maxHeight;
+       hintsPtr->base_width = 0;
+       hintsPtr->base_height = 0;
+    }
+    hintsPtr->width_inc = wmPtr->widthInc;
+    hintsPtr->height_inc = wmPtr->heightInc;
+    hintsPtr->min_aspect.x = wmPtr->minAspect.x;
+    hintsPtr->min_aspect.y = wmPtr->minAspect.y;
+    hintsPtr->max_aspect.x = wmPtr->maxAspect.x;
+    hintsPtr->max_aspect.y = wmPtr->maxAspect.y;
+    hintsPtr->win_gravity = wmPtr->gravity;
+    hintsPtr->flags = wmPtr->sizeHintsFlags;
+
+    /*
+     * If a window is non-gridded and no minimum or maximum size has
+     * been specified, don't let the window be resized at all.
+     */
+
+    if (!IS_GRIDDED(wmPtr)
+           && ((wmPtr->sizeHintsFlags & (PMinSize|PMaxSize)) == 0)) {
+       int width, height;
+
+       width = wmPtr->width;
+       height = wmPtr->height;
+       if (width < 0) {
+           width = winPtr->reqWidth;
+           height = winPtr->reqHeight;
+       }
+       hintsPtr->min_width = hintsPtr->max_width = width;
+       hintsPtr->min_height = hintsPtr->max_height = height;
+       hintsPtr->flags |= PMinSize|PMaxSize;
+    }
+
+    /*
+     * If min or max size isn't specified, fill in with extreme values
+     * rather than leaving unspecified.  Otherwise window manager may
+     * do someting counter-intuitive like the last value ever specified.
+     */
+
+    if (!(hintsPtr->flags & PMinSize)) {
+       hintsPtr->min_width = hintsPtr->min_height = 0;
+       hintsPtr->flags |= PMinSize;
+    }
+    if (!(hintsPtr->flags & PMaxSize)) {
+       hintsPtr->max_width = hintsPtr->max_height = 1000000;
+       hintsPtr->flags |= PMaxSize;
+    }
+
+    XSetWMNormalHints(winPtr->display, winPtr->window, hintsPtr);
+
+    XFree((char *) hintsPtr);
+#endif /* X11R3 */
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * UpdateHints --
+ *
+ *     This procedure is called to update the window manager's
+ *     hints information from the information in a WmInfo
+ *     structure.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     Properties get changed for winPtr.
+ *
+ *--------------------------------------------------------------
+ */
+
+static void
+UpdateHints(winPtr)
+    TkWindow *winPtr;
+{
+    WmInfo *wmPtr = winPtr->wmInfoPtr;
+
+    if (wmPtr->flags & WM_NEVER_MAPPED) {
+       return;
+    }
+    XSetWMHints(winPtr->display, winPtr->window, &wmPtr->hints);
+}
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * ParseGeometry --
+ *
+ *     This procedure parses a geometry string and updates
+ *     information used to control the geometry of a top-level
+ *     window.
+ *
+ * Results:
+ *     A standard Tcl return value, plus an error message in
+ *     interp->result if an error occurs.
+ *
+ * Side effects:
+ *     The size and/or location of winPtr may change.
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+ParseGeometry(interp, string, winPtr)
+    Tcl_Interp *interp;                /* Used for error reporting. */
+    char *string;      /* String containing new geometry.  Has the
+                                * standard form "=wxh+x+y". */
+    TkWindow *winPtr;          /* Pointer to top-level window whose
+                                * geometry is to be changed. */
+{
+    register WmInfo *wmPtr = winPtr->wmInfoPtr;
+    int x, y, width, height, flags;
+    char *end;
+    register char *p = string;
+
+    /*
+     * The leading "=" is optional.
+     */
+
+    if (*p == '=') {
+       p++;
+    }
+
+    /*
+     * Parse the width and height, if they are present.  Don't
+     * actually update any of the fields of wmPtr until we've
+     * successfully parsed the entire geometry string.
+     */
+
+    width = wmPtr->width;
+    height = wmPtr->height;
+    x = wmPtr->x;
+    y = wmPtr->y;
+    flags = wmPtr->flags;
+    if (isdigit(*p)) {
+       width = strtoul(p, &end, 10);
+       p = end;
+       if (*p != 'x') {
+           goto error;
+       }
+       p++;
+       if (!isdigit(*p)) {
+           goto error;
+       }
+       height = strtoul(p, &end, 10);
+       p = end;
+    }
+
+    /*
+     * Parse the X and Y coordinates, if they are present.
+     */
+
+    if (*p != '\0') {
+       flags &= ~(WM_NEGATIVE_X | WM_NEGATIVE_Y);
+       if (*p == '-') {
+           flags |= WM_NEGATIVE_X;
+       } else if (*p != '+') {
+           goto error;
+       }
+       x = strtol(p+1, &end, 10);
+       p = end;
+       if (*p == '-') {
+           flags |= WM_NEGATIVE_Y;
+       } else if (*p != '+') {
+           goto error;
+       }
+       y = strtol(p+1, &end, 10);
+       if (*end != '\0') {
+           goto error;
+       }
+
+       /*
+        * Assume that the geometry information came from the user,
+        * unless an explicit source has been specified.  Otherwise
+        * most window managers assume that the size hints were
+        * program-specified and they ignore them.
+        */
+
+       if ((wmPtr->sizeHintsFlags & (USPosition|PPosition)) == 0) {
+           wmPtr->sizeHintsFlags |= USPosition;
+           wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
+       }
+    }
+
+    /*
+     * Everything was parsed OK.  Update the fields of *wmPtr and
+     * arrange for the appropriate information to be percolated out
+     * to the window manager at the next idle moment.
+     */
+
+    wmPtr->width = width;
+    wmPtr->height = height;
+    wmPtr->x = x;
+    wmPtr->y = y;
+    wmPtr->flags = flags;
+
+    if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) {
+       Tk_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr);
+       wmPtr->flags |= WM_UPDATE_PENDING;
+    }
+    return TCL_OK;
+
+    error:
+    Tcl_AppendResult(interp, "bad geometry specifier \"",
+           string, "\"", (char *) NULL);
+    return TCL_ERROR;
+}
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_GetRootCoords --
+ *
+ *     Given a token for a window, this procedure traces through the
+ *     window's lineage to find the root-window coordinates corresponding
+ *     to point (0,0) in the window.
+ *
+ * Results:
+ *     The locations pointed to by xPtr and yPtr are filled in with
+ *     the root coordinates of the (0,0) point in tkwin.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+Tk_GetRootCoords(tkwin, xPtr, yPtr)
+    Tk_Window tkwin;           /* Token for window. */
+    int *xPtr;                 /* Where to store x-displacement of (0,0). */
+    int *yPtr;                 /* Where to store y-displacement of (0,0). */
+{
+    int x, y;
+    register TkWindow *winPtr = (TkWindow *) tkwin;
+
+    /*
+     * Search back through this window's parents all the way to a
+     * top-level window, combining the offsets of each window within
+     * its parent.
+     */
+
+    x = y = 0;
+    while (1) {
+       x += winPtr->changes.x + winPtr->changes.border_width;
+       y += winPtr->changes.y + winPtr->changes.border_width;
+       if (winPtr->flags & TK_TOP_LEVEL) {
+           break;
+       }
+       winPtr = winPtr->parentPtr;
+    }
+    *xPtr = x;
+    *yPtr = y;
+}
+
+
+\f
+/*
+ *--------------------------------------------------------------
+ *
+ * TkWmSetWmProtocols --
+ *     Set the ICCCM WM_PROTOCOLS to be honored by this window.
+ *     Currently, it is just WM_DELETE_WINDOW.
+ *
+ * Results:
+ *     None.
+ *
+ * Side effects:
+ *     A window property may get updated.
+ *
+ *--------------------------------------------------------------
+ */
+
+void
+TkWmSetWmProtocols(winPtr)
+    TkWindow *winPtr;          /* Newly-created top-level window. */
+{
+    if (winPtr->wmInfoPtr->flags & WM_NEVER_MAPPED) {
+       return;
+    }
+#ifndef X11R3
+    else {
+       /* assemble the WM_PROTOCOLS that we honor */
+       int count = 0;
+       Atom atomlist[8];
+       atomlist[count++] = Tk_InternAtom((Tk_Window) winPtr,
+                                         "WM_DELETE_WINDOW");
+/* 
+ *     other WM_PROTOCOLS go here -- e.g...
+ *     atomlist[count++] = Tk_InternAtom((Tk_Window) winPtr,
+ *                                       "WM_SAVE_YOURSELF");
+ */
+
+       /* 
+        * assign the honor list to the window not all X11R4's have 
+        * XSetWmProtocols() so use XChangeProperty() 
+        */
+
+       /* XSetWmProtocols(winPtr->display, winPtr->window, atomlist, count); */
+
+       XChangeProperty(winPtr->display, 
+                       winPtr->window, 
+                       Tk_InternAtom((Tk_Window) winPtr, "WM_PROTOCOLS"),
+                       XA_ATOM, 32,
+                       PropModeReplace,
+                       (unsigned char *)atomlist, 
+                       count);
+
+    }
+#endif
+
+    return;
+}
+
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkWmProtocolEventProc --
+ *
+ *     Handle a WM_PROTOCOL ICCCM event sent by the window manager to
+ *     top level window.
+ *
+ *     The WM_PROTOCOL's currently handled are:
+ *
+ *             WM_DELETE_PROTOCOL:
+ *
+ * Results: None
+ *
+ * Side effects:
+ *     for WM_DELETE_WINDOW:
+ *             - window may be deleted if specified earlier by a 
+ *             wm tcl command
+ *             - a tcl command may be executed if sepcified earlier by a
+ *             wm tcl command
+ *     
+ *
+ */
+void
+TkWmProtocolEventProc(winPtr, eventPtr)
+TkWindow *winPtr; 
+XEvent *eventPtr;
+{
+    if ((Atom)(eventPtr->xclient.data.l)[0] ==
+       Tk_InternAtom((Tk_Window) winPtr, "WM_DELETE_WINDOW")) {
+
+       WmInfo *wmPtr = winPtr->wmInfoPtr;
+
+       if (wmPtr->deleteCmd) {
+           if (*(wmPtr->deleteCmd) == '\0') {
+               /* callback is empty, just delete the window */
+               Tk_DestroyWindow((Tk_Window) winPtr);
+           } else {
+               /* there is a callback so run it */
+               (void) Tcl_Eval(winPtr->mainPtr->interp, 
+                               wmPtr->deleteCmd, 0, (char **)0);
+           }
+       } else {
+           Tk_DestroyWindow((Tk_Window) winPtr);
+       }
+    }
+    /*
+     * else { .. other WM_<ETC> cases go here ... }
+     */
+    return;
+}
+\f
+
+/* 
+ *----------------------------------------------------------------------
+ *
+ * WmProtocolCmd
+ *
+ * implements 
+ *
+ *     wm protocol <window> delete [command_str] 
+ *
+ * right now just delete is supported for OPTION
+ *
+ * Kind of artificial, But makes it easier to merge into new
+ * versions of Stock Tk.
+ */
+int
+WmProtocolCmd(interp, CmdPtr, argc, argv)
+Tcl_Interp *interp;
+char **CmdPtr;
+int argc;
+char **argv;
+{
+#define Cmd (*CmdPtr)
+
+    switch(argc) {
+    case 4:
+       /* 
+        * return current command 
+        */
+       if (!Cmd || *Cmd == '\0') {
+           return TCL_OK;
+       } else {
+           /* 
+            * chop off the <blank><window_name>
+            * and return just the cmd 
+            */
+           int x = strlen(Cmd) - strlen(argv[2]) - 1;
+           char tmpc = Cmd[x];
+           Cmd[x] = '\0';
+           {
+               /* maybe should just have them put the window in the cmd */
+               Tcl_AppendResult(interp, Cmd, (char *)NULL);
+           }
+           /* 
+            * tack the blank and window name back on 
+            */
+           Cmd[x] = tmpc;
+           return TCL_OK;
+       }
+    case 5:
+       /* 
+        * (re)set command 
+        */
+       if (Cmd) {
+           ckfree(Cmd);
+           Cmd = (char *)NULL;
+       }
+       if (*argv[4] != '\0') {
+           int x = strlen(argv[4]) + strlen(argv[2]) + 2;
+           if (!(Cmd = ckalloc(x))) {
+               perror("wm protocol:");
+           } else {
+               sprintf(Cmd, "%s %s", argv[4], argv[2]);
+           }
+       }
+       return TCL_OK;
+    default:
+       Tcl_AppendResult(interp, "wrong # of arguments: must be \"",
+           argv[0], " protocol window <attribute> [cmd]\"", (char *) NULL);
+       return TCL_ERROR;
+    }
+
+#undef Cmd
+}
+
+\f
+/*
+ *----------------------------------------------------------------------
+ *
+ * Tk_CoordsToWindow --
+ *
+ *     Given the root coordinates of a point, this procedure
+ *     returns the token for the top-most window covering that point,
+ *     if there exists such a window in this application.
+ *
+ * Results:
+ *     The return result is either a token for the window corresponding
+ *     to rootX and rootY, or else NULL to indicate that there is no such
+ *     window.
+ *
+ * Side effects:
+ *     None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Tk_Window
+Tk_CoordsToWindow(rootX, rootY, tkwin)
+    int rootX, rootY;          /* Coordinates of point in root window. */
+    Tk_Window tkwin;           /* Token for any window in application;
+                                * used to identify the application. */
+{
+    Window rootChild, dummy3, dummy4;
+    int i, dummy1, dummy2;
+    register WmInfo *wmPtr;
+    register TkWindow *winPtr, *childPtr;
+    TkWindow *nextPtr;         /* Coordinates of highest child found so
+                                * far that contains point. */
+    int x, y;                  /* Coordinates in winPtr. */
+    int tmpx, tmpy, bd;
+    Window *children;          /* Children of winPtr, or NULL. */
+    unsigned int numChildren;  /* Size of children array. */
+
+    /*
+     * Step 1:  find the top-level window that contains the desired
+     * coordinates.
+     */
+
+    if (XTranslateCoordinates(Tk_Display(tkwin),
+           RootWindowOfScreen(Tk_Screen(tkwin)),
+           RootWindowOfScreen(Tk_Screen(tkwin)), rootX, rootY, &dummy1,
+           &dummy2, &rootChild) == False) {
+       panic("Tk_CoordsToWindow get False return from XTranslateCoordinates");
+    }
+    for (wmPtr = firstWmPtr; ; wmPtr = wmPtr->nextPtr) {
+       if (wmPtr == NULL) {
+           return NULL;
+       }
+       if ((wmPtr->reparent == rootChild) || ((wmPtr->reparent == None)
+               && (wmPtr->winPtr->window == rootChild))) {
+           break;
+       }
+    }
+    winPtr = wmPtr->winPtr;
+    if (winPtr->mainPtr != ((TkWindow *) tkwin)->mainPtr) {
+       return NULL;
+    }
+
+    /*
+     * Step 2: work down through the hierarchy underneath this window.
+     * At each level, scan through all the children to see if any contain
+     * the point.  If none do, then we're done.  If one does, then do the
+     * same thing on that child.  If two or more do, then fetch enough
+     * information from the window server to figure out which is on top,
+     * and repeat on that child.
+     */
+
+    x = rootX;
+    y = rootY;
+    while (1) {
+       x -= winPtr->changes.x;
+       y -= winPtr->changes.y;
+       nextPtr = NULL;
+       children = NULL;
+       for (childPtr = winPtr->childList; childPtr != NULL;
+               childPtr = childPtr->nextPtr) {
+           if (!Tk_IsMapped(childPtr) || (childPtr->flags & TK_TOP_LEVEL)) {
+               continue;
+           }
+           tmpx = x - childPtr->changes.x;
+           tmpy = y - childPtr->changes.y;
+           bd = childPtr->changes.border_width;
+           if ((tmpx < -bd) || (tmpy < -bd)
+                   || (tmpx >= (childPtr->changes.width + bd))
+                   || (tmpy >= (childPtr->changes.height + bd))) {
+               continue;
+           }
+           if (nextPtr == NULL) {
+               nextPtr = childPtr;
+               continue;
+           }
+
+           /*
+            * More than one child of same parent overlaps point.  Must
+            * figure out which is on top.  Keep a cache of the stacking
+            * order for winPtr to help with this, in case there are >2
+            * children overlapping.
+            */
+
+           if (children == NULL) {
+               if (XQueryTree(winPtr->display, winPtr->window, &dummy3,
+                       &dummy4, &children, &numChildren) == 0) {
+                   panic("Tk_CoordsToWindow get error return from XQueryTree");
+               }
+           }
+           for (i = 0; i < numChildren; i++) {
+               if (children[i] == childPtr->window) {
+                   break;
+               }
+               if (children[i] == nextPtr->window) {
+                   nextPtr = childPtr;
+                   break;
+               }
+           }
+       }
+       if (children != NULL) {
+           XFree((char *) children);
+       }
+       if (nextPtr == NULL) {
+           break;
+       }
+       winPtr = nextPtr;
+    }
+    return (Tk_Window) winPtr;
+}
+
+
diff --git a/src/tk/tkwm.h b/src/tk/tkwm.h
new file mode 100644 (file)
index 0000000..924f61d
--- /dev/null
@@ -0,0 +1,16 @@
+/* these are just in a sereate file to make it easier to merge into 
+ * the stock tkWm.c */
+
+void TkWmSetWmProtocols _ANSI_ARGS_((
+    TkWindow *winPtr
+));
+void TkWmProtocolEventProc _ANSI_ARGS_((
+    TkWindow *winPtr,
+    XEvent *eventPtr
+));
+int WmProtocolCmd _ANSI_ARGS_((
+    Tcl_Interp *interp,
+    char **CmdPtr,
+    int argc,
+    char **argv
+));
Impressum, Datenschutz